summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorvboxsync <vboxsync@cfe28804-0f27-0410-a406-dd0f0b0b656f>2014-07-01 18:14:02 +0000
committervboxsync <vboxsync@cfe28804-0f27-0410-a406-dd0f0b0b656f>2014-07-01 18:14:02 +0000
commitee5613d11197bbf4354c98cbf15f8eeb9f38ff88 (patch)
tree47ab82c145351b84edc00a642e6ed1fdc21ad291
parent4fe2f225465f17c37cdbeddc623ad66a816ee7a5 (diff)
downloadVirtualBox-svn-ee5613d11197bbf4354c98cbf15f8eeb9f38ff88.tar.gz
Merged in iprt++ dev branch.
git-svn-id: https://www.virtualbox.org/svn/vbox/trunk@51770 cfe28804-0f27-0410-a406-dd0f0b0b656f
-rw-r--r--Config.kmk126
-rw-r--r--Makefile.kmk55
-rw-r--r--include/Makefile.kmk1
-rw-r--r--include/VBox/err.h181
-rw-r--r--include/VBox/sup.h59
-rw-r--r--include/iprt/asm-math.h81
-rw-r--r--include/iprt/asn1-generator-asn1-decoder.h28
-rw-r--r--include/iprt/asn1-generator-core.h38
-rw-r--r--include/iprt/asn1-generator-init.h35
-rw-r--r--include/iprt/asn1-generator-internal-header.h29
-rw-r--r--include/iprt/asn1-generator-pass.h1379
-rw-r--r--include/iprt/asn1-generator-sanity.h29
-rw-r--r--include/iprt/asn1.h2049
-rw-r--r--include/iprt/base64.h50
-rw-r--r--include/iprt/bignum.h155
-rw-r--r--include/iprt/cdefs.h19
-rw-r--r--include/iprt/crypto/Makefile.kup0
-rw-r--r--include/iprt/crypto/digest.h188
-rw-r--r--include/iprt/crypto/pem.h133
-rw-r--r--include/iprt/crypto/pkcs7.h349
-rw-r--r--include/iprt/crypto/pkix.h391
-rw-r--r--include/iprt/crypto/rsa.h148
-rw-r--r--include/iprt/crypto/spc.h483
-rw-r--r--include/iprt/crypto/store.h132
-rw-r--r--include/iprt/crypto/taf.h189
-rw-r--r--include/iprt/crypto/x509.h1054
-rw-r--r--include/iprt/err.h521
-rw-r--r--include/iprt/formats/asn1.h94
-rw-r--r--include/iprt/ldr.h212
-rw-r--r--include/iprt/log.h10
-rw-r--r--include/iprt/mangling.h892
-rw-r--r--include/iprt/manifest.h22
-rw-r--r--include/iprt/md2.h123
-rw-r--r--include/iprt/memsafer.h226
-rw-r--r--include/iprt/nt/Makefile.kup0
-rw-r--r--include/iprt/nt/nt.h785
-rw-r--r--include/iprt/process.h9
-rw-r--r--include/iprt/stream.h9
-rw-r--r--include/iprt/string.h217
-rw-r--r--include/iprt/time.h17
-rw-r--r--include/iprt/types.h376
-rw-r--r--include/iprt/uni.h53
-rw-r--r--src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPVdma.cpp20
-rw-r--r--src/VBox/Frontends/VirtualBox/Makefile.kmk1
-rw-r--r--src/VBox/Frontends/VirtualBox/src/main.cpp10
-rw-r--r--src/VBox/HostDrivers/Support/Makefile.kmk276
-rw-r--r--src/VBox/HostDrivers/Support/SUPDrv.c477
-rw-r--r--src/VBox/HostDrivers/Support/SUPDrvInternal.h92
-rw-r--r--src/VBox/HostDrivers/Support/SUPLib.cpp4
-rw-r--r--src/VBox/HostDrivers/Support/SUPLibInternal.h52
-rw-r--r--src/VBox/HostDrivers/Support/SUPLibLdr.cpp2
-rw-r--r--src/VBox/HostDrivers/Support/SUPR3HardenedMain.cpp421
-rw-r--r--src/VBox/HostDrivers/Support/SUPR3HardenedNoCrt.cpp205
-rw-r--r--src/VBox/HostDrivers/Support/SUPR3HardenedVerify.cpp112
-rw-r--r--src/VBox/HostDrivers/Support/darwin/SUPDrv-darwin.cpp19
-rw-r--r--src/VBox/HostDrivers/Support/freebsd/SUPDrv-freebsd.c19
-rw-r--r--src/VBox/HostDrivers/Support/linux/SUPDrv-linux.c19
-rw-r--r--src/VBox/HostDrivers/Support/os2/SUPDrv-os2.cpp19
-rw-r--r--src/VBox/HostDrivers/Support/solaris/SUPDrv-solaris.c19
-rw-r--r--src/VBox/HostDrivers/Support/testcase/Makefile.kmk2
-rw-r--r--src/VBox/HostDrivers/Support/testcase/tstNtQueryStuff.cpp80
-rw-r--r--src/VBox/HostDrivers/Support/win/Certificates/Makefile.kup0
-rw-r--r--src/VBox/HostDrivers/Support/win/Certificates/NtRoot-MicrosoftCodeVerificationRoot-729404101f3e0ca347837fca175a8438.cerbin0 -> 1801 bytes
-rw-r--r--src/VBox/HostDrivers/Support/win/Certificates/NtRoot-MicrosoftCodeVerificationRoot-729404101f3e0ca347837fca175a8438.tafbin0 -> 708 bytes
-rw-r--r--src/VBox/HostDrivers/Support/win/Certificates/SpcRoot-MicrosoftAuthenticodeTmRootAuthority-01.tafbin0 -> 400 bytes
-rw-r--r--src/VBox/HostDrivers/Support/win/Certificates/SpcRoot-MicrosoftDigitalMediaAuthority2005-6eff330eb6e7569740680870104baaba.tafbin0 -> 629 bytes
-rw-r--r--src/VBox/HostDrivers/Support/win/Certificates/SpcRoot-MicrosoftRootAuthority-00c1008b3c3c8811d13ef663ecdf40.tafbin0 -> 432 bytes
-rw-r--r--src/VBox/HostDrivers/Support/win/Certificates/SpcRoot-MicrosoftRootCertificateAuthority-79ad16a14aa0a5ad4c7358f407132e65.tafbin0 -> 675 bytes
-rw-r--r--src/VBox/HostDrivers/Support/win/Certificates/SpcRoot-MicrosoftRootCertificateAuthority2010-28cc3a25bfba44ac449a9b586b4339aa.tafbin0 -> 718 bytes
-rw-r--r--src/VBox/HostDrivers/Support/win/Certificates/SpcRoot-MicrosoftRootCertificateAuthority2011-3f8bc8b5fc9fb29643b569d66c42e144.tafbin0 -> 718 bytes
-rw-r--r--src/VBox/HostDrivers/Support/win/Certificates/Timestamp-CopyrightC1997MicrosoftCorp-01.tafbin0 -> 332 bytes
-rw-r--r--src/VBox/HostDrivers/Support/win/Certificates/Trusted-OracleCorporationVirtualBox-51ca009816fdbd80f120e015ee75823e.cerbin0 -> 1419 bytes
-rw-r--r--src/VBox/HostDrivers/Support/win/Certificates/Trusted-OracleCorporationVirtualBox-51ca009816fdbd80f120e015ee75823e.tafbin0 -> 508 bytes
-rw-r--r--src/VBox/HostDrivers/Support/win/NtCreateSection-template-amd64-syscall-type-1.h78
-rw-r--r--src/VBox/HostDrivers/Support/win/NtCreateSection-template-x86-syscall-type-1.h286
-rw-r--r--src/VBox/HostDrivers/Support/win/SUPDrv-win.cpp2711
-rw-r--r--src/VBox/HostDrivers/Support/win/SUPDrvA-win.asm75
-rw-r--r--src/VBox/HostDrivers/Support/win/SUPHardenedVerify-win.h149
-rw-r--r--src/VBox/HostDrivers/Support/win/SUPHardenedVerifyImage-win.cpp1873
-rw-r--r--src/VBox/HostDrivers/Support/win/SUPHardenedVerifyProcess-win.cpp1196
-rw-r--r--src/VBox/HostDrivers/Support/win/SUPLib-win.cpp133
-rw-r--r--src/VBox/HostDrivers/Support/win/SUPR3HardenedMain-win.cpp1650
-rw-r--r--src/VBox/HostDrivers/Support/win/SUPR3HardenedMainA-win.asm76
-rw-r--r--src/VBox/HostDrivers/Support/win/SUPR3HardenedNoCrt-win.cpp191
-rw-r--r--src/VBox/HostDrivers/Support/win/VBoxSupLib-win.cpp92
-rw-r--r--src/VBox/Installer/win/VBoxMergeApp.wxi2
-rw-r--r--src/VBox/Main/src-server/MachineImpl.cpp13
-rw-r--r--src/VBox/NetworkServices/DHCP/Makefile.kmk1
-rw-r--r--src/VBox/NetworkServices/NAT/Makefile.kmk1
-rw-r--r--src/VBox/RDP/client/Makefile.in2
-rw-r--r--src/VBox/RDP/client/Makefile.kmk17
-rw-r--r--src/VBox/Runtime/Makefile.kmk287
-rw-r--r--src/VBox/Runtime/common/asn1/Makefile.kup0
-rw-r--r--src/VBox/Runtime/common/asn1/asn1-basics.cpp592
-rw-r--r--src/VBox/Runtime/common/asn1/asn1-cursor.cpp505
-rw-r--r--src/VBox/Runtime/common/asn1/asn1-default-allocator.cpp108
-rw-r--r--src/VBox/Runtime/common/asn1/asn1-dump.cpp796
-rw-r--r--src/VBox/Runtime/common/asn1/asn1-encode.cpp426
-rw-r--r--src/VBox/Runtime/common/asn1/asn1-ut-bitstring-decode.cpp130
-rw-r--r--src/VBox/Runtime/common/asn1/asn1-ut-bitstring-template.h45
-rw-r--r--src/VBox/Runtime/common/asn1/asn1-ut-bitstring.cpp516
-rw-r--r--src/VBox/Runtime/common/asn1/asn1-ut-boolean-decode.cpp81
-rw-r--r--src/VBox/Runtime/common/asn1/asn1-ut-boolean-template.h45
-rw-r--r--src/VBox/Runtime/common/asn1/asn1-ut-boolean.cpp203
-rw-r--r--src/VBox/Runtime/common/asn1/asn1-ut-core-decode.cpp56
-rw-r--r--src/VBox/Runtime/common/asn1/asn1-ut-core-template.h45
-rw-r--r--src/VBox/Runtime/common/asn1/asn1-ut-core.cpp278
-rw-r--r--src/VBox/Runtime/common/asn1/asn1-ut-dyntype-decode.cpp228
-rw-r--r--src/VBox/Runtime/common/asn1/asn1-ut-dyntype.cpp169
-rw-r--r--src/VBox/Runtime/common/asn1/asn1-ut-integer-decode.cpp79
-rw-r--r--src/VBox/Runtime/common/asn1/asn1-ut-integer-template.h45
-rw-r--r--src/VBox/Runtime/common/asn1/asn1-ut-integer.cpp451
-rw-r--r--src/VBox/Runtime/common/asn1/asn1-ut-null-decode.cpp61
-rw-r--r--src/VBox/Runtime/common/asn1/asn1-ut-null.cpp127
-rw-r--r--src/VBox/Runtime/common/asn1/asn1-ut-objid-decode.cpp362
-rw-r--r--src/VBox/Runtime/common/asn1/asn1-ut-objid-template.h45
-rw-r--r--src/VBox/Runtime/common/asn1/asn1-ut-objid.cpp537
-rw-r--r--src/VBox/Runtime/common/asn1/asn1-ut-octetstring-decode.cpp78
-rw-r--r--src/VBox/Runtime/common/asn1/asn1-ut-octetstring-template.h45
-rw-r--r--src/VBox/Runtime/common/asn1/asn1-ut-octetstring.cpp426
-rw-r--r--src/VBox/Runtime/common/asn1/asn1-ut-string-decode.cpp187
-rw-r--r--src/VBox/Runtime/common/asn1/asn1-ut-string-template.h45
-rw-r--r--src/VBox/Runtime/common/asn1/asn1-ut-string-template2.h39
-rw-r--r--src/VBox/Runtime/common/asn1/asn1-ut-string.cpp1811
-rw-r--r--src/VBox/Runtime/common/asn1/asn1-ut-time-decode.cpp389
-rw-r--r--src/VBox/Runtime/common/asn1/asn1-ut-time-template.h46
-rw-r--r--src/VBox/Runtime/common/asn1/asn1-ut-time-template2.h30
-rw-r--r--src/VBox/Runtime/common/asn1/asn1-ut-time.cpp270
-rw-r--r--src/VBox/Runtime/common/checksum/md2.cpp72
-rw-r--r--src/VBox/Runtime/common/checksum/md2str.cpp49
-rw-r--r--src/VBox/Runtime/common/crypto/Makefile.kup0
-rw-r--r--src/VBox/Runtime/common/crypto/RTCrStoreCertAddFromFile.cpp114
-rw-r--r--src/VBox/Runtime/common/crypto/digest-builtin.cpp493
-rw-r--r--src/VBox/Runtime/common/crypto/digest-core.cpp338
-rw-r--r--src/VBox/Runtime/common/crypto/iprt-openssl.cpp88
-rw-r--r--src/VBox/Runtime/common/crypto/pemfile.cpp411
-rw-r--r--src/VBox/Runtime/common/crypto/pkcs7-asn1-decoder.cpp89
-rw-r--r--src/VBox/Runtime/common/crypto/pkcs7-core.cpp54
-rw-r--r--src/VBox/Runtime/common/crypto/pkcs7-init.cpp53
-rw-r--r--src/VBox/Runtime/common/crypto/pkcs7-internal.h35
-rw-r--r--src/VBox/Runtime/common/crypto/pkcs7-sanity.cpp209
-rw-r--r--src/VBox/Runtime/common/crypto/pkcs7-template.h160
-rw-r--r--src/VBox/Runtime/common/crypto/pkcs7-verify.cpp553
-rw-r--r--src/VBox/Runtime/common/crypto/pkix-signature-builtin.cpp139
-rw-r--r--src/VBox/Runtime/common/crypto/pkix-signature-builtin.h36
-rw-r--r--src/VBox/Runtime/common/crypto/pkix-signature-core.cpp274
-rw-r--r--src/VBox/Runtime/common/crypto/pkix-signature-rsa.cpp407
-rw-r--r--src/VBox/Runtime/common/crypto/pkix-util.cpp92
-rw-r--r--src/VBox/Runtime/common/crypto/pkix-verify.cpp178
-rw-r--r--src/VBox/Runtime/common/crypto/rsa-asn1-decoder.cpp43
-rw-r--r--src/VBox/Runtime/common/crypto/rsa-core.cpp44
-rw-r--r--src/VBox/Runtime/common/crypto/rsa-init.cpp43
-rw-r--r--src/VBox/Runtime/common/crypto/rsa-internal.h39
-rw-r--r--src/VBox/Runtime/common/crypto/rsa-sanity.cpp43
-rw-r--r--src/VBox/Runtime/common/crypto/rsa-template.h109
-rw-r--r--src/VBox/Runtime/common/crypto/spc-asn1-decoder.cpp75
-rw-r--r--src/VBox/Runtime/common/crypto/spc-core.cpp89
-rw-r--r--src/VBox/Runtime/common/crypto/spc-init.cpp46
-rw-r--r--src/VBox/Runtime/common/crypto/spc-internal.h35
-rw-r--r--src/VBox/Runtime/common/crypto/spc-sanity.cpp179
-rw-r--r--src/VBox/Runtime/common/crypto/spc-template.h184
-rw-r--r--src/VBox/Runtime/common/crypto/store-inmem.cpp359
-rw-r--r--src/VBox/Runtime/common/crypto/store-internal.h161
-rw-r--r--src/VBox/Runtime/common/crypto/store.cpp436
-rw-r--r--src/VBox/Runtime/common/crypto/taf-asn1-decoder.cpp44
-rw-r--r--src/VBox/Runtime/common/crypto/taf-core.cpp41
-rw-r--r--src/VBox/Runtime/common/crypto/taf-init.cpp44
-rw-r--r--src/VBox/Runtime/common/crypto/taf-internal.h35
-rw-r--r--src/VBox/Runtime/common/crypto/taf-sanity.cpp42
-rw-r--r--src/VBox/Runtime/common/crypto/taf-template.h94
-rw-r--r--src/VBox/Runtime/common/crypto/x509-asn1-decoder.cpp217
-rw-r--r--src/VBox/Runtime/common/crypto/x509-certpaths.cpp2790
-rw-r--r--src/VBox/Runtime/common/crypto/x509-core.cpp1520
-rw-r--r--src/VBox/Runtime/common/crypto/x509-file.cpp105
-rw-r--r--src/VBox/Runtime/common/crypto/x509-init.cpp76
-rw-r--r--src/VBox/Runtime/common/crypto/x509-internal.h35
-rw-r--r--src/VBox/Runtime/common/crypto/x509-sanity.cpp149
-rw-r--r--src/VBox/Runtime/common/crypto/x509-template.h441
-rw-r--r--src/VBox/Runtime/common/crypto/x509-verify.cpp85
-rw-r--r--src/VBox/Runtime/common/err/errinfo-alloc.cpp70
-rw-r--r--src/VBox/Runtime/common/err/errinfo.cpp89
-rw-r--r--src/VBox/Runtime/common/err/errmsg.cpp10
-rw-r--r--src/VBox/Runtime/common/ldr/Makefile.kup1
-rw-r--r--src/VBox/Runtime/common/ldr/ldr.cpp17
-rw-r--r--src/VBox/Runtime/common/ldr/ldrELF.cpp3
-rw-r--r--src/VBox/Runtime/common/ldr/ldrELFRelocatable.cpp.h2
-rw-r--r--src/VBox/Runtime/common/ldr/ldrEx.cpp139
-rw-r--r--src/VBox/Runtime/common/ldr/ldrFile.cpp29
-rw-r--r--src/VBox/Runtime/common/ldr/ldrMemory.cpp4
-rw-r--r--src/VBox/Runtime/common/ldr/ldrNative.cpp19
-rw-r--r--src/VBox/Runtime/common/ldr/ldrPE.cpp1167
-rw-r--r--src/VBox/Runtime/common/ldr/ldrkStuff.cpp7
-rw-r--r--src/VBox/Runtime/common/log/log.cpp16
-rw-r--r--src/VBox/Runtime/common/math/bignum.cpp1898
-rw-r--r--src/VBox/Runtime/common/misc/sg.cpp2
-rw-r--r--src/VBox/Runtime/common/string/RTStrPrintHexBytes.cpp13
-rw-r--r--src/VBox/Runtime/common/string/RTUtf16Cat.cpp42
-rw-r--r--src/VBox/Runtime/common/string/RTUtf16CatAscii.cpp42
-rw-r--r--src/VBox/Runtime/common/string/RTUtf16CmpAscii.cpp50
-rw-r--r--src/VBox/Runtime/common/string/RTUtf16Copy.cpp52
-rw-r--r--src/VBox/Runtime/common/string/RTUtf16CopyAscii.cpp70
-rw-r--r--src/VBox/Runtime/common/string/RTUtf16End.cpp46
-rw-r--r--src/VBox/Runtime/common/string/RTUtf16ICmpAscii.cpp56
-rw-r--r--src/VBox/Runtime/common/string/RTUtf16NLen.cpp43
-rw-r--r--src/VBox/Runtime/common/string/RTUtf16NLenEx.cpp46
-rw-r--r--src/VBox/Runtime/common/string/RTUtf16PrintHexBytes.cpp61
-rw-r--r--src/VBox/Runtime/common/string/base64.cpp86
-rw-r--r--src/VBox/Runtime/common/string/strncmp.asm121
-rw-r--r--src/VBox/Runtime/common/string/unidata-flags.cpp47008
-rw-r--r--src/VBox/Runtime/common/string/unidata-lower.cpp3902
-rw-r--r--src/VBox/Runtime/common/string/unidata-upper.cpp4069
-rw-r--r--src/VBox/Runtime/common/string/unidata.cpp29592
-rw-r--r--src/VBox/Runtime/common/string/uniread.cpp128
-rw-r--r--src/VBox/Runtime/common/string/utf-16-case.cpp178
-rw-r--r--src/VBox/Runtime/common/string/utf-16-latin-1.cpp479
-rw-r--r--src/VBox/Runtime/common/string/utf-16.cpp578
-rw-r--r--src/VBox/Runtime/common/string/utf-8-case.cpp81
-rw-r--r--src/VBox/Runtime/common/string/utf-8-case2.cpp118
-rw-r--r--src/VBox/Runtime/generic/memsafer-generic.cpp218
-rw-r--r--src/VBox/Runtime/include/internal/iprt-openssl.h42
-rw-r--r--src/VBox/Runtime/include/internal/ldr.h115
-rw-r--r--src/VBox/Runtime/include/internal/ldrPE.h180
-rw-r--r--src/VBox/Runtime/nt/RTErrConvertFromNtStatus.cpp2
-rw-r--r--src/VBox/Runtime/r0drv/nt/toxic-chkstk-r0drv-nt.asm42
-rw-r--r--src/VBox/Runtime/r3/nt/RTProcQueryParent-r3-nt.cpp93
-rw-r--r--src/VBox/Runtime/r3/posix/process-posix.cpp11
-rw-r--r--src/VBox/Runtime/r3/stream.cpp13
-rw-r--r--src/VBox/Runtime/r3/win/ntdll-mini-implib.c180
-rw-r--r--src/VBox/Runtime/r3/win/ntdll-mini-implib.def58
-rw-r--r--src/VBox/Runtime/testcase/Makefile.kmk8
-rw-r--r--src/VBox/Runtime/testcase/tstRTBigNum.cpp852
-rw-r--r--src/VBox/Runtime/testcase/tstRTLdrVerifyPeImage.cpp101
-rw-r--r--src/VBox/Runtime/tools/Makefile.kmk15
-rw-r--r--src/VBox/Runtime/tools/RTSignTool.cpp895
-rw-r--r--src/VBox/Runtime/win/RTErrConvertFromWin32.cpp1
-rw-r--r--src/VBox/Runtime/win/errmsgwin.cpp14
-rw-r--r--src/bldprogs/bin2c.c15
-rw-r--r--src/recompiler/Makefile.kmk9
-rwxr-xr-xtools/bin/gen-slickedit-workspace.sh17
239 files changed, 103879 insertions, 31708 deletions
diff --git a/Config.kmk b/Config.kmk
index 5ab9868cc96..d275492f866 100644
--- a/Config.kmk
+++ b/Config.kmk
@@ -740,7 +740,7 @@ endif
# Enables hardening.
# Most developers will want to disable this in their LocalConfig.kmk.
ifn1of ($(KBUILD_TARGET), win)
- VBOX_WITH_HARDENING = 1
+VBOX_WITH_HARDENING = 1
endif
# Where the application files are (going to be) installed.
#VBOX_PATH_APP_PRIVATE = /usr/lib/virtualbox
@@ -802,13 +802,8 @@ ifndef VBOX_WITH_HARDENING
endif
endif
# Enable the system wide support service/daemon.
-# Work in progress, but required for hardening on Windows.
+# Very sketchy work in progress.
#VBOX_WITH_SUPSVC = 1
-ifdef VBOX_WITH_HARDENING
- if1of ($(KBUILD_TARGET), win)
- VBOX_WITH_SUPSVC = 1
- endif
-endif
## @}
@@ -1844,6 +1839,9 @@ VBOX_BIN2C ?= $(PATH_OBJ)/bin2c/bin2c$(HOSTSUFF_EXE)
# RTManifest (extension pack manifest utility)
VBOX_RTMANIFEST ?= $(PATH_OBJ)/bldRTManifest/bldRTManifest$(HOSTSUFF_EXE)
+# RTSignTool (certificate extraction tool)
+VBOX_RTSIGNTOOL ?= $(PATH_OBJ)/bldRTSignTool/bldRTSignTool$(HOSTSUFF_EXE)
+
# VBoxCmp (simple /bin/cmp with more sensible output)
VBOX_VBOXCMP ?= $(PATH_OBJ)/VBoxCmp/VBoxCmp$(HOSTSUFF_EXE)
@@ -1856,6 +1854,9 @@ VBOX_VBOXTPG ?= $(PATH_OBJ)/VBoxTpG/VBoxTpG$(HOSTSUFF_EXE)
# VBoxPeSetVersion (changes the minimum OS version of an image)
VBOX_PE_SET_VERSION ?= $(PATH_OBJ)/VBoxPeSetVersion/VBoxPeSetVersion$(HOSTSUFF_EXE)
+# Visual C++ EditBin.exe.
+VBOX_VCC_EDITBIN = $(if $(PATH_TOOL_$(VBOX_VCC_TOOL)_BIN),$(PATH_TOOL_$(VBOX_VCC_TOOL)_BIN)/,)editbin.exe /NoLogo
+
# filesplitter (splits java files)
VBOX_FILESPLIT ?= $(PATH_OBJ)/filesplitter/filesplitter$(HOSTSUFF_EXE)
@@ -2628,17 +2629,24 @@ ifdef VBOX_SIGNING_MODE
VBOX_CERTIFICATE_STORE_ARGS ?= /s "$(VBOX_CERTIFICATE_STORE)"
## Commands for signing a driver image after link.
- VBOX_SIGN_DRIVER_CMDS ?= $(if $(eq $(tool_do),LINK_LIBRARY),,$(call VBOX_SIGN_FILE_FN,$(out)))
- ## Sign a file.
+ VBOX_SIGN_DRIVER_CMDS ?= $(if $(eq $(tool_do),LINK_LIBRARY),,$(call VBOX_SIGN_IMAGE_FN,$(out)))
+ ## Sign a file (generic).
# @param 1 The file to sign.
# @param 2 File description. Optional.
+ # @param 3 Additional parameters. Optional.
VBOX_SIGN_FILE_FN ?= $(VBOX_SIGNTOOL) sign \
$(VBOX_CROSS_CERTIFICATE_FILE_ARGS) \
$(VBOX_CERTIFICATE_STORE_ARGS) \
$(VBOX_CERTIFICATE_SUBJECT_NAME_ARGS) \
$(VBOX_TSA_URL_ARGS) \
$(if $(strip $(2)),/d "$(strip $(2))",) \
+ $(3) \
$(1)
+ ## Sign an executable image.
+ # @param 1 The file to sign.
+ # @param 2 File description. Optional.
+ VBOX_SIGN_IMAGE_FN ?= $(call VBOX_SIGN_FILE_FN,$(1),$(2),/ph)
+
## Create a security catalog file.
# @param 1 The directory containing the stuff to sign.
# @param 2 The expected .cat name. (Inf2Cat lowercases it)
@@ -2657,9 +2665,9 @@ ifdef VBOX_SIGNING_MODE
endif
# Go nuts, sign everything.
- ifeq ($(strip $(VBOX_SIGNING_MODE)),release)
+ if "$(strip $(VBOX_SIGNING_MODE))" == "release" || defined(VBOX_WITH_HARDENING)
## Commands for signing an executable or a dll image after link.
- VBOX_SIGN_IMAGE_CMDS ?= $(if $(eq $(tool_do),LINK_LIBRARY),,$(call VBOX_SIGN_FILE_FN,$(out)))
+ VBOX_SIGN_IMAGE_CMDS ?= $(if $(eq $(tool_do),LINK_LIBRARY),,$(call VBOX_SIGN_IMAGE_FN,$(out)))
endif
## Enable signing of the additions.
VBOX_SIGN_ADDITIONS ?= 1
@@ -2747,6 +2755,48 @@ VBOX_EDIT_INF64_FN = $(SED) \
--output $(2) \
$(1)
+##
+# Helper macro for re-signing DLL images from tools that we ship so they won't
+# cause trouble for the hardened build requirements.
+#
+# Invoke via $(call VBOX_RE_SIGN_DLL_FN) inside the SOURCES list. Necessary
+# _CLEAN entry will be added to the target. If hardening is not enabled or
+# we're not on windows, the source will be returned.
+#
+# @returns Name of the output file name. May have leading space, but no trailing.
+# @param 1 Target name.
+# @param 2 The source name.
+#
+if defined(VBOX_SIGNING_MODE) && "$(KBUILD_TARGET)" == "win"
+ VBOX_RE_SIGN_DLL_FN = $(if-expr !defined($(1)_VBOX_RE_SIGNED_$(notdir $(2))),\
+ $(evalcall VBOX_RE_SIGN_DLL_INTERNAL_FN,$1,$2)\
+ ,)$($(1)_0_OUTDIR)/$(notdir $2)
+
+define VBOX_RE_SIGN_DLL_INTERNAL_FN
+local n = $(notdir $2)
+ifndef $(1)_VBOX_RE_SIGNED_$(n)
+ $(1)_VBOX_RE_SIGNED_$(n) := 1
+ $(eval $(1)_CLEAN += $$($(1)_0_OUTDIR)/$(n))
+
+ $$($(1)_0_OUTDIR)/$(n): $(2) $(VBOX_VERSION_STAMP) | $$(dir $$@)
+ $(call MSG_TOOL,SIGNTOOL,,$<,$@)
+ $(RM) -f -- "$@"
+ $(CP) -- "$<" "$@"
+ $(VBOX_VCC_EDITBIN) /LargeAddressAware /DynamicBase /NxCompat /Release /IntegrityCheck \
+ /Version:$(VBOX_VERSION_MAJOR)0$(VBOX_VERSION_MINOR).$(VBOX_VERSION_BUILD) \
+ "$@"
+ $(call VBOX_SIGN_IMAGE_FN,$@)
+endif
+endef # VBOX_RESIGN_DLL_FN
+else
+ VBOX_RE_SIGN_DLL_FN = $(2)
+endif
+
+
+##
+# @param
+VBOX_RESIGN_DLL_FN =
+
#
# Adjust kBuild defaults.
#
@@ -2869,6 +2919,14 @@ SDK_VBoxOpenSslExtPack_LIBS = \
$(PATH_STAGE_LIB)/VBoxExtPack-libssl$(VBOX_SUFF_LIB) \
$(PATH_STAGE_LIB)/VBoxExtPack-libcrypto$(VBOX_SUFF_LIB)
+if "$(KBUILD_TARGET)" == "win" && defined(VBOX_WITH_HARDENING)
+ SDK_VBoxOpenSslHardened = Only for VBoxDrv and Hardened Stub EXEs on windows.
+ SDK_VBoxOpenSslHardened_INCS = $(SDK_VBOX_OPENSSL_VBOX_DEFAULT_INCS)
+ SDK_VBoxOpenSslHardened_ORDERDEPS = $(crypto-headers_1_TARGET)
+ SDK_VBoxOpenSslHardened_LIBS = \
+ $(PATH_STAGE_LIB)/VBoxHardened-libcrypto$(VBOX_SUFF_LIB)
+endif
+
SDK_VBOX_BLD_OPENSSL = .
SDK_VBOX_BLD_OPENSSL_EXTENDS = VBOX_OPENSSL
SDK_VBOX_BLD_OPENSSL_LIBS ?= \
@@ -3082,7 +3140,10 @@ ifdef VBOX_WITH_RAW_MODE
TEMPLATE_VBoxRc_CXXFLAGS = -Zi -Zl -GR- -EHs- -GF -GS- -Zc:wchar_t- -Gs8192 $(VBOX_VCC_GC_OPT) $(VBOX_VCC_GC_FP) -W3 -wd4244 -wd4996 $(VBOX_VCC_WERR)
endif
TEMPLATE_VBoxRc_CFLAGS = $(TEMPLATE_VBoxRc_CXXFLAGS)
- TEMPLATE_VBoxRc_LDFLAGS = -Driver -Subsystem:NATIVE -Incremental:NO -Align:64 -MapInfo:Exports -NoD $(VBOX_VCC_LD_WERR) -Debug
+ TEMPLATE_VBoxRc_LDFLAGS = -Driver -Subsystem:NATIVE -Incremental:NO -Align:64 -MapInfo:Exports -NoD $(VBOX_VCC_LD_WERR) -Release -Debug
+ ifdef VBOX_SIGNING_MODE
+ TEMPLATE_VBoxRc_LDFLAGS += -IntegrityCheck
+ endif
TEMPLATE_VBoxRc_LIBS = \
$(PATH_SDK_$(VBOX_WINDDK)_LIB.x86)/int64.lib
TEMPLATE_VBoxRc_LIBS += \
@@ -3205,10 +3266,13 @@ TEMPLATE_VBoxR0_CXXFLAGS = -Zi -Zl -GR- -EHs- -GF -GS- -Zc:wchar_t- $
TEMPLATE_VBoxR0_CXXFLAGS = -Zi -Zl -GR- -EHs- -GF -GS- -Zc:wchar_t- $(VBOX_VCC_OPT) $(VBOX_VCC_FP) -W3 -wd4244 -wd4996 $(VBOX_VCC_WERR)
endif
TEMPLATE_VBoxR0_CFLAGS = $(TEMPLATE_VBoxR0_CXXFLAGS)
-TEMPLATE_VBoxR0_LDFLAGS = -Driver -Subsystem:NATIVE -Incremental:NO -Align:4096 -MapInfo:Exports -NoD $(VBOX_VCC_LD_WERR) -Debug
+TEMPLATE_VBoxR0_LDFLAGS = -Driver -Subsystem:NATIVE -Incremental:NO -Align:4096 -MapInfo:Exports -NoD $(VBOX_VCC_LD_WERR) -Release -Debug
ifdef VBOX_WITH_DTRACE_R0
TEMPLATE_VBoxR0_LDFLAGS += -Merge:VTGPrLc.Data=VTGPrLc.Begin -Merge:VTGPrLc.End=VTGPrLc.Begin -Merge:VTGPrLc.Begin=VTGObj
endif
+ ifdef VBOX_SIGNING_MODE
+ TEMPLATE_VBoxR0_LDFLAGS += -IntegrityCheck
+ endif
TEMPLATE_VBoxR0_LIBS = \
$(PATH_STAGE_LIB)/RuntimeR0Stub$(VBOX_SUFF_LIB)
include $(KBUILD_PATH)/sdks/$(VBOX_WINDDK).kmk ## TODO: Add a kBuild feature for loading SDKs.
@@ -3307,12 +3371,15 @@ ifeq ($(KBUILD_TARGET),win)
TEMPLATE_VBOXR0DRV_DEFS.x86 += NO_INTERLOCKED_INTRINSICS # Avoids intrisic VC/WDK trouble
TEMPLATE_VBOXR0DRV_DEFS.x86 += WIN9X_COMPAT_SPINLOCK # Avoid multiply defined _KeInitializeSpinLock@4
TEMPLATE_VBOXR0DRV_DEFS.amd64 = _AMD64_
- TEMPLATE_VBOXR0DRV_CXXFLAGS = -Zi -Zl -GR- -EHs- -GF -Gz -W3 -GS- -wd4996 -Zc:wchar_t- $(VBOX_VCC_OPT) $(VBOX_VCC_FP)
+ TEMPLATE_VBOXR0DRV_CXXFLAGS = -Zi -Zl -GR- -EHs- -GF -Gz -W3 -GS- -wd4996 -Zc:wchar_t- -Gs4096 $(VBOX_VCC_OPT) $(VBOX_VCC_FP)
TEMPLATE_VBOXR0DRV_CFLAGS = $(TEMPLATE_VBOXR0DRV_CXXFLAGS)
- TEMPLATE_VBOXR0DRV_LDFLAGS = -Driver -Subsystem:NATIVE -Incremental:NO -Align:4096 -MapInfo:Exports -NoD -Debug
+ TEMPLATE_VBOXR0DRV_LDFLAGS = -Driver -Subsystem:NATIVE -Incremental:NO -Align:4096 -MapInfo:Exports -NoD -Release -Debug
ifdef VBOX_WITH_DTRACE_R0DRV
TEMPLATE_VBOXR0DRV_LDFLAGS += -Merge:VTGPrLc.Data=VTGPrLc.Begin -Merge:VTGPrLc.End=VTGPrLc.Begin -Merge:VTGPrLc.Begin=VTGObj
endif
+ ifdef VBOX_SIGNING_MODE
+ TEMPLATE_VBOXR0DRV_LDFLAGS += -IntegrityCheck
+ endif
TEMPLATE_VBOXR0DRV_POST_CMDS = $(VBOX_SIGN_DRIVER_CMDS)
endif
@@ -3604,7 +3671,8 @@ ifeq ($(KBUILD_TARGET),win)
TEMPLATE_VBOXR3EXE_CFLAGS.dbgopt = $(TEMPLATE_VBOXR3EXE_CXXFLAGS.dbgopt)
TEMPLATE_VBOXR3EXE_CFLAGS.kprofile = $(TEMPLATE_VBOXR3EXE_CXXFLAGS.kprofile)
TEMPLATE_VBOXR3EXE_LDFLAGS = \
- /NOD /INCREMENTAL:NO /MAPINFO:EXPORTS /LARGEADDRESSAWARE /DEBUG \
+ /NOD /INCREMENTAL:NO /MAPINFO:EXPORTS /LargeAddressAware /DynamicBase /NxCompat /Release /Debug \
+ /Version:$(VBOX_VERSION_MAJOR)0$(VBOX_VERSION_MINOR).$(VBOX_VERSION_BUILD) \
/DISALLOWLIB:libc.lib \
/DISALLOWLIB:libcd.lib \
/DISALLOWLIB:libcmt.lib \
@@ -3614,6 +3682,9 @@ ifeq ($(KBUILD_TARGET),win)
ifdef VBOX_WITH_DTRACE_R3
TEMPLATE_VBOXR3EXE_LDFLAGS += -Merge:VTGPrLc.Data=VTGPrLc.Begin -Merge:VTGPrLc.End=VTGPrLc.Begin -Merge:VTGPrLc.Begin=VTGObj
endif
+ if defined(VBOX_SIGNING_MODE) && defined(VBOX_WITH_HARDENING)
+ TEMPLATE_VBOXR3EXE_LDFLAGS += -IntegrityCheck
+ endif
TEMPLATE_VBOXR3EXE_LIBS.x86 = \
$(PATH_TOOL_$(TEMPLATE_VBOXR3EXE_TOOL.win.x86)_LIB)/msvcrt$(VBOX_VCC_CRT_TYPE).lib \
@@ -3925,6 +3996,7 @@ endif
#
TEMPLATE_VBOXR3HARDENEDEXE = Hardened VBox Ring-3 EXE
TEMPLATE_VBOXR3HARDENEDEXE_EXTENDS = VBOXR3EXE
+TEMPLATE_VBOXR3HARDENEDEXE_DEBUG_INST.win = $(INST_DEBUG)hardened-exes/
TEMPLATE_VBOXR3HARDENEDEXE_LIBS = $(VBOX_LIB_SUPHARDENED) $(TEMPLATE_VBOXR3EXE_LIBS)
TEMPLATE_VBOXR3HARDENEDEXE_LDFLAGS.darwin = $(TEMPLATE_VBOXR3EXE_LDFLAGS.darwin) -framework IOKit
ifeq ($(KBUILD_TARGET),linux)
@@ -3932,10 +4004,10 @@ ifeq ($(KBUILD_TARGET),linux)
# TEMPLATE_VBOXR3HARDENEDEXE_LIBS += cap
endif
ifeq ($(KBUILD_TARGET),win) # No CRT!
+ TEMPLATE_VBOXR3HARDENEDEXE_SDKS = VBOX_NTDLL $(TEMPLATE_VBOXR3EXE_SDKS) VBoxOpenSslHardened
TEMPLATE_VBOXR3HARDENEDEXE_LIBS.x86 = \
+ $(PATH_SDK_$(VBOX_WINDDK)_LIB.x86)/int64.lib \
$(PATH_TOOL_$(TEMPLATE_VBOXR3HARDENEDEXE_TOOL.win.x86)_LIB)/chkstk.obj
- TEMPLATE_VBOXR3HARDENEDEXE_LIBS.amd64 = \
- $(PATH_TOOL_$(TEMPLATE_VBOXR3HARDENEDEXE_TOOL.win.amd64)_LIB)/chkstk.obj
TEMPLATE_VBOXR3HARDENEDEXE_CXXFLAGS = $(filter-out -RTC% -GZ -GS,$(TEMPLATE_VBOXR3EXE_CXXFLAGS)) -GS-
TEMPLATE_VBOXR3HARDENEDEXE_CXXFLAGS.debug= $(filter-out -RTC% -GZ -GS,$(TEMPLATE_VBOXR3EXE_CXXFLAGS.debug)) -GS-
TEMPLATE_VBOXR3HARDENEDEXE_CFLAGS = $(filter-out -RTC% -GZ -GS,$(TEMPLATE_VBOXR3EXE_CFLAGS)) -GS-
@@ -4030,6 +4102,7 @@ endif
TEMPLATE_VBOXR3AUTOTST_INST = $(INST_TESTCASE)
if "$(KBUILD_TARGET)" == "win" && defined(VBOX_SIGNING_MODE)
TEMPLATE_VBOXR3AUTOTST_POST_CMDS = $(NO_SUCH_VARIABLE)
+ TEMPLATE_VBOXR3AUTOTST_LDFLAGS = $(filter-out -IntegrityCheck, $(TEMPLATE_VBoxR3Static_LDFLAGS))
endif
#
@@ -4047,6 +4120,7 @@ else ifdef VBOX_WITH_RELATIVE_RUNPATH
endif
if "$(KBUILD_TARGET)" == "win" && defined(VBOX_SIGNING_MODE)
TEMPLATE_VBOXR3TSTEXE_POST_CMDS =
+ TEMPLATE_VBOXR3TSTEXE_LDFLAGS = $(filter-out -IntegrityCheck, $(TEMPLATE_VBOXR3EXE_LDFLAGS))
endif
#
@@ -4234,13 +4308,17 @@ ifeq ($(KBUILD_TARGET),win)
TEMPLATE_VBOXMAINEXE_CFLAGS.dbgopt = $(TEMPLATE_VBOXMAINEXE_CXXFLAGS.dbgopt)
TEMPLATE_VBOXMAINEXE_CFLAGS.kprofile = $(TEMPLATE_VBOXMAINEXE_CXXFLAGS.kprofile)
TEMPLATE_VBOXMAINEXE_LDFLAGS = \
- /NOD /INCREMENTAL:NO /MAPINFO:EXPORTS /LARGEADDRESSAWARE /DEBUG\
+ /NOD /INCREMENTAL:NO /MAPINFO:EXPORTS /LargeAddressAware /DynamicBase /NxCompat /Release /Debug \
+ /Version:$(VBOX_VERSION_MAJOR)0$(VBOX_VERSION_MINOR).$(VBOX_VERSION_BUILD) \
/DISALLOWLIB:libc.lib \
/DISALLOWLIB:libcd.lib \
/DISALLOWLIB:libcmt.lib \
/DISALLOWLIB:libcmtd.lib \
/DISALLOWLIB:msvcrt$(VBOX_VCC_CRT_TYPE_N).lib \
/DISALLOWLIB:msvcprt$(VBOX_VCC_CRT_TYPE_N).lib
+ if defined(VBOX_SIGNING_MODE) && defined(VBOX_WITH_HARDENING)
+ TEMPLATE_VBOXMAINEXE_LDFLAGS += -IntegrityCheck
+ endif
TEMPLATE_VBOXMAINEXE_LIBS = \
$(LIB_RUNTIME)
TEMPLATE_VBOXMAINEXE_LIBS.x86 = \
@@ -4687,7 +4765,11 @@ ifdef VBOX_WITH_QTGUI
TEMPLATE_VBOXQT4GUIEXE_INCS += \
$(PATH_TOOL_$(VBOX_VCC_TOOL)_ATLMFC_INC)
TEMPLATE_VBOXQT4GUIEXE_LDFLAGS = \
- /NOD /NOLOGO /INCREMENTAL:NO /MAPINFO:EXPORTS /DEBUG
+ /NOD /INCREMENTAL:NO /MAPINFO:EXPORTS /LargeAddressAware /DynamicBase /NxCompat /Release /Debug \
+ /Version:$(VBOX_VERSION_MAJOR)0$(VBOX_VERSION_MINOR).$(VBOX_VERSION_BUILD)
+ if defined(VBOX_SIGNING_MODE) && defined(VBOX_WITH_HARDENING)
+ TEMPLATE_VBOXQT4GUIEXE_LDFLAGS += -IntegrityCheck
+ endif
TEMPLATE_VBOXQT4GUIEXE_SDKS += $(VBOX_WINPSDK)
TEMPLATE_VBOXQT4GUIEXE_LIBS = \
$(VBOX_LIBS_QT4) \
@@ -4704,7 +4786,6 @@ ifdef VBOX_WITH_QTGUI
$(PATH_TOOL_$(VBOX_VCC_TOOL)_LIB)/msvcprt$(VBOX_VCC_CRT_TYPE).lib
endif
TEMPLATE_VBOXQT4GUIEXE_POST_CMDS = $(VBOX_SIGN_IMAGE_CMDS)
- TEMPLATE_VBOXQT4GUIEXE_LDFLAGS.win.x86 += /LARGEADDRESSAWARE
else # the gcc guys:
TEMPLATE_VBOXQT4GUIEXE_TOOL = $(VBOX_GCC_TOOL)
@@ -4871,7 +4952,8 @@ ifeq ($(KBUILD_HOST),win)
TEMPLATE_VBoxBldProg_CFLAGS.profile = $(TEMPLATE_VBoxBldProg_CXXFLAGS.profile)
TEMPLATE_VBoxBldProg_CFLAGS.kprofile = $(TEMPLATE_VBoxBldProg_CXXFLAGS.kprofile)
TEMPLATE_VBoxBldProg_LDFLAGS = \
- /NOD /INCREMENTAL:NO /MAPINFO:EXPORTS /LARGEADDRESSAWARE /DEBUG \
+ /NOD /INCREMENTAL:NO /MAPINFO:EXPORTS /LargeAddressAware /DynamicBase /NxCompat /Release /Debug \
+ /Version:$(VBOX_VERSION_MAJOR)0$(VBOX_VERSION_MINOR).$(VBOX_VERSION_BUILD) \
/DISALLOWLIB:libc$(VBOX_VCC_CRT_TYPE_N).lib \
/DISALLOWLIB:libcmt$(VBOX_VCC_CRT_TYPE_N).lib \
/DISALLOWLIB:msvcrt.lib \
diff --git a/Makefile.kmk b/Makefile.kmk
index b7f9550c514..fb2897cadac 100644
--- a/Makefile.kmk
+++ b/Makefile.kmk
@@ -21,10 +21,12 @@ include $(KBUILD_PATH)/subheader.kmk
#
# Sub-makefiles / Sub-directories.
#
-if defined(VBOX_WITH_DOCS) && (!defined(VBOX_ONLY_BUILD) || defined(VBOX_ONLY_DOCS) || defined(VBOX_ONLY_SDK))
- include $(PATH_SUB_CURRENT)/doc/manual/Makefile.kmk
+ifndef VBOX_ONLY_ROOT_MAKEFILE
+ if defined(VBOX_WITH_DOCS) && (!defined(VBOX_ONLY_BUILD) || defined(VBOX_ONLY_DOCS) || defined(VBOX_ONLY_SDK))
+ include $(PATH_SUB_CURRENT)/doc/manual/Makefile.kmk
+ endif
+ include $(PATH_SUB_CURRENT)/src/Makefile.kmk
endif
-include $(PATH_SUB_CURRENT)/src/Makefile.kmk
#
# Below we might need TOOL_ZIP_UNPACK (for the additions/docs/efifw packages
@@ -90,10 +92,10 @@ if1of ($(KBUILD_TARGET), win os2)
ifdef VBOX_WITH_VBOXSDL
include $(KBUILD_PATH)/sdks/LIBSDL.kmk
InstallExternalLibs_SOURCES += \
- $(DLL_SDK_LIBSDL_SDL)
+ $(call VBOX_RE_SIGN_DLL_FN,InstallExternalLibs,$(DLL_SDK_LIBSDL_SDL))
ifdef VBOX_WITH_SECURELABEL
InstallExternalLibs_SOURCES += \
- $(DLL_SDK_LIBSDL_SDLTTF)
+ $(call VBOX_RE_SIGN_DLL_FN,InstallExternalLibs,$(DLL_SDK_LIBSDL_SDLTTF))
endif
ifeq ($(KBUILD_TARGET),os2)
InstallExternalLibs_SOURCES += \
@@ -105,31 +107,34 @@ endif
# The compiler runtime DLLs.
ifeq ($(KBUILD_TARGET).$(VBOX_WITHOUT_COMPILER_REDIST),win.)
- VBOX_PATH_VCC_REDIST = $(PATH_TOOL_$(VBOX_VCC_TOOL))/redist/
- VBOX_PATH_VCC_REDIST_CRT = $(VBOX_PATH_VCC_REDIST)/$(subst amd64,x64,$(KBUILD_TARGET_ARCH))/Microsoft.VC100.CRT
- VBOX_PATH_VCC_REDIST_CRT_DBG = $(VBOX_PATH_VCC_REDIST)/Debug_NonRedist/$(subst amd64,x64,$(KBUILD_TARGET_ARCH))/Microsoft.VC100.DebugCRT
- InstallExternalLibs_SOURCES += \
- $(VBOX_PATH_VCC_REDIST_CRT)/msvcr$(substr $(VBOX_VCC_TOOL_STEM),4).dll \
- $(VBOX_PATH_VCC_REDIST_CRT)/msvcp$(substr $(VBOX_VCC_TOOL_STEM),4).dll \
- $(VBOX_PATH_VCC_REDIST_CRT)/msvcr$(substr $(VBOX_VCC_TOOL_STEM),4).dll=>testcase/msvcr$(substr $(VBOX_VCC_TOOL_STEM),4).dll \
- $(VBOX_PATH_VCC_REDIST_CRT)/msvcp$(substr $(VBOX_VCC_TOOL_STEM),4).dll=>testcase/msvcp$(substr $(VBOX_VCC_TOOL_STEM),4).dll
+ include $(KBUILD_PATH)/tools/$(VBOX_VCC_TOOL).kmk
+ include $(KBUILD_PATH)/tools/$(VBOX_VCC_TOOL_STEM)X86.kmk
+ VBOX_PATH_VCC_REDIST = $(PATH_TOOL_$(VBOX_VCC_TOOL))/redist/
+ VBOX_PATH_VCC_REDIST_CRT = $(VBOX_PATH_VCC_REDIST)/$(subst amd64,x64,$(KBUILD_TARGET_ARCH))/Microsoft.VC100.CRT
+ VBOX_PATH_VCC_REDIST_CRT_DBG = $(VBOX_PATH_VCC_REDIST)/Debug_NonRedist/$(subst amd64,x64,$(KBUILD_TARGET_ARCH))/Microsoft.VC100.DebugCRT
+ VBOX_PATH_VCC_REDIST_CRT_X86 = $(VBOX_PATH_VCC_REDIST)/x86/Microsoft.VC100.CRT
+ VBOX_PATH_VCC_REDIST_CRT_DBG_X86 = $(VBOX_PATH_VCC_REDIST)/Debug_NonRedist/x86/Microsoft.VC100.DebugCRT
+
+ InstallExternalLibs_SOURCES += \
+ $(call VBOX_RE_SIGN_DLL_FN,InstallExternalLibs,$(VBOX_PATH_VCC_REDIST_CRT)/msvcr$(substr $(VBOX_VCC_TOOL_STEM),4).dll) \
+ $(call VBOX_RE_SIGN_DLL_FN,InstallExternalLibs,$(VBOX_PATH_VCC_REDIST_CRT)/msvcp$(substr $(VBOX_VCC_TOOL_STEM),4).dll) \
+ $(call VBOX_RE_SIGN_DLL_FN,InstallExternalLibs,$(VBOX_PATH_VCC_REDIST_CRT)/msvcr$(substr $(VBOX_VCC_TOOL_STEM),4).dll)=>testcase/msvcr$(substr $(VBOX_VCC_TOOL_STEM),4).dll \
+ $(call VBOX_RE_SIGN_DLL_FN,InstallExternalLibs,$(VBOX_PATH_VCC_REDIST_CRT)/msvcp$(substr $(VBOX_VCC_TOOL_STEM),4).dll)=>testcase/msvcp$(substr $(VBOX_VCC_TOOL_STEM),4).dll
ifdef VBOX_WITH_32_ON_64_MAIN_API
- VBOX_PATH_VCC_REDIST_CRT_X86 = $(VBOX_PATH_VCC_REDIST)/x86/Microsoft.VC100.CRT
- VBOX_PATH_VCC_REDIST_CRT_DBG_X86 = $(VBOX_PATH_VCC_REDIST)/Debug_NonRedist/x86/Microsoft.VC100.DebugCRT
InstallExternalLibs_SOURCES += \
- $(VBOX_PATH_VCC_REDIST_CRT_X86)/msvcr$(substr $(VBOX_VCC_TOOL_STEM),4).dll=>x86/msvcr$(substr $(VBOX_VCC_TOOL_STEM),4).dll \
- $(VBOX_PATH_VCC_REDIST_CRT_X86)/msvcp$(substr $(VBOX_VCC_TOOL_STEM),4).dll=>x86/msvcp$(substr $(VBOX_VCC_TOOL_STEM),4).dll
+ $(call VBOX_RE_SIGN_DLL_FN,InstallExternalLibs,$(VBOX_PATH_VCC_REDIST_CRT_X86)/msvcr$(substr $(VBOX_VCC_TOOL_STEM),4).dll)=>x86/msvcr$(substr $(VBOX_VCC_TOOL_STEM),4).dll \
+ $(call VBOX_RE_SIGN_DLL_FN,InstallExternalLibs,$(VBOX_PATH_VCC_REDIST_CRT_X86)/msvcp$(substr $(VBOX_VCC_TOOL_STEM),4).dll)=>x86/msvcp$(substr $(VBOX_VCC_TOOL_STEM),4).dll
endif
ifeq ($(VBOX_VCC_CRT_TYPE),d)
InstallExternalLibs_SOURCES += \
- $(VBOX_PATH_VCC_REDIST_CRT_DBG)/msvcr$(substr $(VBOX_VCC_TOOL_STEM),4).dll \
- $(VBOX_PATH_VCC_REDIST_CRT_DBG)/msvcp$(substr $(VBOX_VCC_TOOL_STEM),4).dll \
- $(VBOX_PATH_VCC_REDIST_CRT_DBG)/msvcr$(substr $(VBOX_VCC_TOOL_STEM),4).dll=>testcase/msvcr$(substr $(VBOX_VCC_TOOL_STEM),4).dll \
- $(VBOX_PATH_VCC_REDIST_CRT_DBG)/msvcp$(substr $(VBOX_VCC_TOOL_STEM),4).dll=>testcase/msvcp$(substr $(VBOX_VCC_TOOL_STEM),4).dll
+ $(call VBOX_RE_SIGN_DLL_FN,InstallExternalLibs,$(VBOX_PATH_VCC_REDIST_CRT_DBG)/msvcr$(substr $(VBOX_VCC_TOOL_STEM),4).dll) \
+ $(call VBOX_RE_SIGN_DLL_FN,InstallExternalLibs,$(VBOX_PATH_VCC_REDIST_CRT_DBG)/msvcp$(substr $(VBOX_VCC_TOOL_STEM),4).dll) \
+ $(call VBOX_RE_SIGN_DLL_FN,InstallExternalLibs,$(VBOX_PATH_VCC_REDIST_CRT_DBG)/msvcr$(substr $(VBOX_VCC_TOOL_STEM),4).dll)=>testcase/msvcr$(substr $(VBOX_VCC_TOOL_STEM),4).dll \
+ $(call VBOX_RE_SIGN_DLL_FN,InstallExternalLibs,$(VBOX_PATH_VCC_REDIST_CRT_DBG)/msvcp$(substr $(VBOX_VCC_TOOL_STEM),4).dll)=>testcase/msvcp$(substr $(VBOX_VCC_TOOL_STEM),4).dll
ifdef VBOX_WITH_32_ON_64_MAIN_API
InstallExternalLibs_SOURCES += \
- $(VBOX_PATH_VCC_REDIST_CRT_DBG_X86)/msvcr$(substr $(VBOX_VCC_TOOL_STEM),4).dll=>x86/msvcr$(substr $(VBOX_VCC_TOOL_STEM),4).dll \
- $(VBOX_PATH_VCC_REDIST_CRT_DBG_X86)/msvcp$(substr $(VBOX_VCC_TOOL_STEM),4).dll=>x86/msvcp$(substr $(VBOX_VCC_TOOL_STEM),4).dll
+ $(call VBOX_RE_SIGN_DLL_FN,InstallExternalLibs,$(VBOX_PATH_VCC_REDIST_CRT_DBG_X86)/msvcr$(substr $(VBOX_VCC_TOOL_STEM),4).dll)=>x86/msvcr$(substr $(VBOX_VCC_TOOL_STEM),4).dll \
+ $(call VBOX_RE_SIGN_DLL_FN,InstallExternalLibs,$(VBOX_PATH_VCC_REDIST_CRT_DBG_X86)/msvcp$(substr $(VBOX_VCC_TOOL_STEM),4).dll)=>x86/msvcp$(substr $(VBOX_VCC_TOOL_STEM),4).dll
endif
endif
endif
@@ -167,8 +172,8 @@ else
qt4-bin_MODE = 755
qt4-bin_INST = $(INST_BIN)
qt4-bin_SOURCES = \
- $(foreach qtmod,$(VBOX_QT4_MOD_NAMES),$(VBOX_PATH_QT4_LIB)/$(qtmod)4$(SUFF_DLL)) \
- $(VBOX_PATH_QT4)/plugins/accessible/qtaccessiblewidgets4$(SUFF_DLL)=>accessible/qtaccessiblewidgets4$(SUFF_DLL)
+ $(foreach qtmod,$(VBOX_QT4_MOD_NAMES),$(call VBOX_RE_SIGN_DLL_FN,qt4-bin,$(VBOX_PATH_QT4_LIB)/$(qtmod)4$(SUFF_DLL))) \
+ $(call VBOX_RE_SIGN_DLL_FN,qt4-bin,$(VBOX_PATH_QT4)/plugins/accessible/qtaccessiblewidgets4$(SUFF_DLL))=>accessible/qtaccessiblewidgets4$(SUFF_DLL)
else
INSTALLS += qt4-bin
qt4-bin_MODE = 755
diff --git a/include/Makefile.kmk b/include/Makefile.kmk
index f590fcbb46c..67c19d5182b 100644
--- a/include/Makefile.kmk
+++ b/include/Makefile.kmk
@@ -94,6 +94,7 @@ hdrs.rc := $(filter-out \
VBox/vmm/gvm.h \
iprt/thread.h \
iprt/mem.h \
+ iprt/memsafer.h \
iprt/alloc.h \
$(r3_cpp_hdrs) \
$(r3_only_hdrs) \
diff --git a/include/VBox/err.h b/include/VBox/err.h
index 666af903bdf..5dffeecc344 100644
--- a/include/VBox/err.h
+++ b/include/VBox/err.h
@@ -1754,6 +1754,16 @@
#define VERR_SUPDRV_TRACER_UMOD_STRTAB_TOO_BIG (-3736)
/** The user mode tracepoint provider string table offset is bad. */
#define VERR_SUPDRV_TRACER_UMOD_STRTAB_OFF_BAD (-3737)
+/** The VM process was denied access to vboxdrv because someone have managed to
+ * open the process or its main thread with too broad access rights. */
+#define VERR_SUPDRV_HARDENING_EVIL_HANDLE (-3738)
+/** Error opening the ApiPort LPC object. */
+#define VERR_SUPDRV_APIPORT_OPEN_ERROR (-3739)
+/** Error enumerating all processes in the session. */
+#define VERR_SUPDRV_SESSION_PROCESS_ENUM_ERROR (-3740)
+/** The CSRSS instance associated with the client process could not be
+ * located. */
+#define VERR_SUPDRV_CSRSS_NOT_FOUND (-3741)
/** @} */
@@ -1801,6 +1811,18 @@
#define VERR_SUPLIB_INVALID_ARGV0_INTERNAL (-3768)
/** The internal application does not reside in the correct place (hardening). */
#define VERR_SUPLIB_INVALID_INTERNAL_APP_DIR (-3769)
+/** Unable to establish trusted of VM process (0). */
+#define VERR_SUPLIB_NT_PROCESS_UNTRUSTED_0 (-3770)
+/** Unable to establish trusted of VM process (1). */
+#define VERR_SUPLIB_NT_PROCESS_UNTRUSTED_1 (-3771)
+/** Unable to establish trusted of VM process (2). */
+#define VERR_SUPLIB_NT_PROCESS_UNTRUSTED_2 (-3772)
+/** Unable to establish trusted of VM process (3). */
+#define VERR_SUPLIB_NT_PROCESS_UNTRUSTED_3 (-3773)
+/** Unable to establish trusted of VM process (4). */
+#define VERR_SUPLIB_NT_PROCESS_UNTRUSTED_4 (-3774)
+/** Unable to establish trusted of VM process (5). */
+#define VERR_SUPLIB_NT_PROCESS_UNTRUSTED_5 (-3775)
/** @} */
@@ -2310,6 +2332,165 @@
/** @} */
+/** @name Support driver/library shared verfication status codes.
+ * @{ */
+/** Process Verficiation Failure: The memory content does not match the image
+ * file. */
+#define VERR_SUP_VP_MEMORY_VS_FILE_MISMATCH (-5600)
+/** Process Verficiation Failure: The memory protection of a image file section
+ * does not match what the section header prescribes. */
+#define VERR_SUP_VP_SECTION_PROTECTION_MISMATCH (-5601)
+/** Process Verficiation Failure: One of the section in the image file is not
+ * mapped into memory. */
+#define VERR_SUP_VP_SECTION_NOT_MAPPED (-5602)
+/** Process Verficiation Failure: One of the section in the image file is not
+ * fully mapped into memory. */
+#define VERR_SUP_VP_SECTION_NOT_FULLY_MAPPED (-5603)
+/** Process Verficiation Failure: Bad file alignment value in image header. */
+#define VERR_SUP_VP_BAD_FILE_ALIGNMENT_VALUE (-5604)
+/** Process Verficiation Failure: Bad image base in header. */
+#define VERR_SUP_VP_BAD_IMAGE_BASE (-5605)
+/** Process Verficiation Failure: Bad image signature. */
+#define VERR_SUP_VP_BAD_IMAGE_SIGNATURE (-5606)
+/** Process Verficiation Failure: Bad image size. */
+#define VERR_SUP_VP_BAD_IMAGE_SIZE (-5607)
+/** Process Verficiation Failure: Bad new-header offset in the MZ header. */
+#define VERR_SUP_VP_BAD_MZ_OFFSET (-5608)
+/** Process Verficiation Failure: Bad optional header field. */
+#define VERR_SUP_VP_BAD_OPTIONAL_HEADER (-5609)
+/** Process Verficiation Failure: Bad section alignment value in image
+ * header. */
+#define VERR_SUP_VP_BAD_SECTION_ALIGNMENT_VALUE (-5610)
+/** Process Verficiation Failure: Bad section raw data size. */
+#define VERR_SUP_VP_BAD_SECTION_FILE_SIZE (-5611)
+/** Process Verficiation Failure: Bad virtual section address. */
+#define VERR_SUP_VP_BAD_SECTION_RVA (-5612)
+/** Process Verficiation Failure: Bad virtual section size. */
+#define VERR_SUP_VP_BAD_SECTION_VIRTUAL_SIZE (-5613)
+/** Process Verficiation Failure: Bad size of image header. */
+#define VERR_SUP_VP_BAD_SIZE_OF_HEADERS (-5614)
+/** Process Verficiation Failure: The process is being debugged. */
+#define VERR_SUP_VP_DEBUGGED (-5615)
+/** Process Verficiation Failure: A DLL was found more than once. */
+#define VERR_SUP_VP_DUPLICATE_DLL_MAPPING (-5616)
+/** Process Verficiation Failure: Image section region is too large. */
+#define VERR_SUP_VP_EMPTY_REGION_TOO_LARGE (-5617)
+/** Process Verficiation Failure: Exectuable file name and process image name
+ * does not match up. */
+#define VERR_SUP_VP_EXE_VS_PROC_NAME_MISMATCH (-5618)
+/** Process Verficiation Failure: Found executable memory allocated in the
+ * process. There is only supposed be executable memory associated with
+ * image file mappings (DLLs & EXE). */
+#define VERR_SUP_VP_FOUND_EXEC_MEMORY (-5619)
+/** Process Verficiation Failure: There is more than one known executable mapped
+ * into the process. */
+#define VERR_SUP_VP_FOUND_MORE_THAN_ONE_EXE_MAPPING (-5620)
+/** Process Verficiation Failure: Error closing image file handle. */
+#define VERR_SUP_VP_IMAGE_FILE_CLOSE_ERROR (-5621)
+/** Process Verficiation Failure: Error opening image file. */
+#define VERR_SUP_VP_IMAGE_FILE_OPEN_ERROR (-5622)
+/** Process Verficiation Failure: Error reading image file header. */
+#define VERR_SUP_VP_IMAGE_HDR_READ_ERROR (-5623)
+/** Process Verficiation Failure: Image mapping is bogus as the first region
+ * has different AllocationBase and BaseAddress values, indicating that a
+ * section was unmapped or otherwise tampered with. */
+#define VERR_SUP_VP_IMAGE_MAPPING_BASE_ERROR (-5624)
+/** Process Verficiation Failure: Error reading process memory for comparing
+ * with disk data. */
+#define VERR_SUP_VP_MEMORY_READ_ERROR (-5625)
+/** Process Verficiation Failure: Found no executable mapped into the process
+ * address space. */
+#define VERR_SUP_VP_NO_FOUND_NO_EXE_MAPPING (-5626)
+/** Process Verficiation Failure: An image mapping failed to report a name. */
+#define VERR_SUP_VP_NO_IMAGE_MAPPING_NAME (-5627)
+/** Process Verficiation Failure: No KERNE32.DLL mapping found. This is
+ * impossible. */
+#define VERR_SUP_VP_NO_KERNEL32_MAPPING (-5628)
+/** Process Verficiation Failure: Error allocating memory. */
+#define VERR_SUP_VP_NO_MEMORY (-5629)
+/** Process Verficiation Failure: Erorr allocating state memory or querying
+ * the system32 path. */
+#define VERR_SUP_VP_NO_MEMORY_STATE (-5630)
+/** Process Verficiation Failure: No NTDLL.DLL mapping found. This is
+ * impossible. */
+#define VERR_SUP_VP_NO_NTDLL_MAPPING (-5631)
+/** Process Verficiation Failure: A DLL residing outside System32 was found
+ * in the process. */
+#define VERR_SUP_VP_NON_SYSTEM32_DLL (-5632)
+/** Process Verficiation Failure: An unknown and unwanted DLL was found loaded
+ * into the process. */
+#define VERR_SUP_VP_NOT_KNOWN_DLL_OR_EXE (-5633)
+/** Process Verficiation Failure: The name of an image file changes between
+ * mapping regions. */
+#define VERR_SUP_VP_NT_MAPPING_NAME_CHANGED (-5634)
+/** Process Verficiation Failure: Error querying process name. */
+#define VERR_SUP_VP_NT_QI_PROCESS_NM_ERROR (-5635)
+/** Process Verficiation Failure: Error querying thread information. */
+#define VERR_SUP_VP_NT_QI_THREAD_ERROR (-5636)
+/** Process Verficiation Failure: Error query virtual memory information. */
+#define VERR_SUP_VP_NT_QI_VIRTUAL_MEMORY_ERROR (-5637)
+/** Process Verficiation Failure: Error query virtual memory mapping name. */
+#define VERR_SUP_VP_NT_QI_VIRTUAL_MEMORY_NM_ERROR (-5638)
+/** Process Verficiation Failure: Error determining the full path of
+ * System32. */
+#define VERR_SUP_VP_SYSTEM32_PATH (-5639)
+/** Process Verficiation Failure: The process has more than one thread. */
+#define VERR_SUP_VP_THREAD_NOT_ALONE (-5640)
+/** Process Verficiation Failure: The image mapping is too large (>= 2GB). */
+#define VERR_SUP_VP_TOO_HIGH_REGION_RVA (-5641)
+/** Process Verficiation Failure: The memory region is too large (>= 2GB). */
+#define VERR_SUP_VP_TOO_LARGE_REGION (-5642)
+/** Process Verficiation Failure: There are too many DLLs loaded. */
+#define VERR_SUP_VP_TOO_MANY_DLLS_LOADED (-5643)
+/** Process Verficiation Failure: An image has too many regions. */
+#define VERR_SUP_VP_TOO_MANY_IMAGE_REGIONS (-5644)
+/** Process Verficiation Failure: The process has too many virtual memory
+ * regions. */
+#define VERR_SUP_VP_TOO_MANY_MEMORY_REGIONS (-5645)
+/** Process Verficiation Failure: An image has too many sections. */
+#define VERR_SUP_VP_TOO_MANY_SECTIONS (-5646)
+/** Process Verficiation Failure: An image is targetting an unexpected
+ * machine/CPU. */
+#define VERR_SUP_VP_UNEXPECTED_IMAGE_MACHINE (-5647)
+/** Process Verficiation Failure: Unexpected section protection flag
+ * combination. */
+#define VERR_SUP_VP_UNEXPECTED_SECTION_FLAGS (-5648)
+/** Process Verficiation Failure: Expected the process and exe to have forced
+ * integrity checking enabled (verifying signatures). */
+#define VERR_SUP_VP_EXE_MISSING_FORCE_INTEGRITY (-5649)
+/** Process Verficiation Failure: Expected the process and exe to have dynamic
+ * base enabled. */
+#define VERR_SUP_VP_EXE_MISSING_DYNAMIC_BASE (-5650)
+/** Process Verficiation Failure: Expected the process and exe to advertise
+ * NX compatibility. */
+#define VERR_SUP_VP_EXE_MISSING_NX_COMPAT (-5651)
+/** Process Verficiation Failure: The DllCharacteristics of the process
+ * does not match the value in the optional header in the exe file. */
+#define VERR_SUP_VP_DLL_CHARECTERISTICS_MISMATCH (-5652)
+/** Process Verficiation Failure: The ImageCharacteristics of the process
+ * does not match the value in the file header in the exe file. */
+#define VERR_SUP_VP_IMAGE_CHARECTERISTICS_MISMATCH (-5653)
+/** Process Verficiation Failure: Error querying image information. */
+#define VERR_SUP_VP_NT_QI_PROCESS_IMG_INFO_ERROR (-5654)
+/** Process Verficiation Failure: Error querying debug port. */
+#define VERR_SUP_VP_NT_QI_PROCESS_DBG_PORT_ERROR (-5655)
+/** WinVerifyTrust failed with an unexpected status code when using the
+ * catalog-file approach. */
+#define VERR_SUP_VP_WINTRUST_CAT_FAILURE (-5656)
+/** The image is required to be signed with the same certificate as the rest
+ * of VirtualBox. */
+#define VERR_SUP_VP_NOT_SIGNED_WITH_BUILD_CERT (-5657)
+/** Internal processing error: Not build certificate. */
+#define VERR_SUP_VP_NOT_BUILD_CERT_IPE (-5658)
+/** The image requires to be signed using the kernel-code signing process. */
+#define VERR_SUP_VP_NOT_VALID_KERNEL_CODE_SIGNATURE (-5659)
+/** Unexpected number of valid paths. */
+#define VERR_SUP_VP_UNEXPECTED_VALID_PATH_COUNT (-5660)
+/** The image is required to force integrity checks. */
+#define VERR_SUP_VP_SIGNATURE_CHECKS_NOT_ENFORCED (-5661)
+
+/** @} */
+
/** @name VBox Extension Pack Status Codes
* @{
*/
diff --git a/include/VBox/sup.h b/include/VBox/sup.h
index b45d74824cf..fbe1828ec7b 100644
--- a/include/VBox/sup.h
+++ b/include/VBox/sup.h
@@ -723,6 +723,8 @@ typedef enum SUPINITOP
kSupInitOp_Driver,
/** IPRT init related. */
kSupInitOp_IPRT,
+ /** Miscellaneous. */
+ kSupInitOp_Misc,
/** Place holder. */
kSupInitOp_End
} SUPINITOP;
@@ -1847,6 +1849,63 @@ DECLEXPORT(void) ModuleTerm(void *hMod);
#endif
+/** @name Trust Anchors and Certificates
+ * @{ */
+
+/**
+ * Trust anchor table entry (in generated Certificates.cpp).
+ */
+typedef struct SUPTAENTRY
+{
+ /** Pointer to the raw bytes. */
+ const unsigned char *pch;
+ /** Number of bytes. */
+ unsigned cb;
+} SUPTAENTRY;
+/** Pointer to a trust anchor table entry. */
+typedef SUPTAENTRY const *PCSUPTAENTRY;
+
+/** Macro for simplifying generating the trust anchor tables. */
+#define SUPTAENTRY_GEN(a_abTA) { &a_abTA[0], sizeof(a_abTA) }
+
+/** All certificates we know. */
+extern SUPTAENTRY const g_aSUPAllTAs[];
+/** Number of entries in g_aSUPAllTAs. */
+extern unsigned const g_cSUPAllTAs;
+
+/** Software publisher certificate roots (Authenticode). */
+extern SUPTAENTRY const g_aSUPSpcRootTAs[];
+/** Number of entries in g_aSUPSpcRootTAs. */
+extern unsigned const g_cSUPSpcRootTAs;
+
+/** Kernel root certificates used by Windows. */
+extern SUPTAENTRY const g_aSUPNtKernelRootTAs[];
+/** Number of entries in g_aSUPNtKernelRootTAs. */
+extern unsigned const g_cSUPNtKernelRootTAs;
+
+/** Timestamp root certificates trusted by Windows. */
+extern SUPTAENTRY const g_aSUPTimestampTAs[];
+/** Number of entries in g_aSUPTimestampTAs. */
+extern unsigned const g_cSUPTimestampTAs;
+
+/** TAs we trust (the build certificate, Oracle VirtualBox). */
+extern SUPTAENTRY const g_aSUPTrustedTAs[];
+/** Number of entries in g_aSUPTrustedTAs. */
+extern unsigned const g_cSUPTrustedTAs;
+
+/** Supplemental certificates, like cross signing certificates. */
+extern SUPTAENTRY const g_aSUPSupplementalTAs[];
+/** Number of entries in g_aSUPTrustedTAs. */
+extern unsigned const g_cSUPSupplementalTAs;
+
+/** The build certificate. */
+extern const unsigned char g_abSUPBuildCert[];
+/** The size of the build certificate. */
+extern const unsigned g_cbSUPBuildCert;
+
+/** @} */
+
+
/** @} */
RT_C_DECLS_END
diff --git a/include/iprt/asm-math.h b/include/iprt/asm-math.h
index a3acdf1e095..f7f816ca82e 100644
--- a/include/iprt/asm-math.h
+++ b/include/iprt/asm-math.h
@@ -28,6 +28,17 @@
#include <iprt/types.h>
+#if defined(_MSC_VER) && RT_INLINE_ASM_USES_INTRIN
+# include <intrin.h>
+ /* Emit the intrinsics at all optimization levels. */
+# pragma intrinsic(__emul)
+# pragma intrinsic(__emulu)
+# ifdef RT_ARCH_AMD64
+# pragma intrinsic(_mul128)
+# pragma intrinsic(_umul128)
+# endif
+#endif
+
/** @defgroup grp_rt_asm_math Interger Math Optimizations
* @ingroup grp_rt_asm
@@ -38,7 +49,8 @@
*
* @returns u32F1 * u32F2.
*/
-#if RT_INLINE_ASM_EXTERNAL && defined(RT_ARCH_X86)
+
+#if RT_INLINE_ASM_EXTERNAL && !RT_INLINE_ASM_USES_INTRIN && defined(RT_ARCH_X86)
DECLASM(uint64_t) ASMMult2xU32RetU64(uint32_t u32F1, uint32_t u32F2);
#else
DECLINLINE(uint64_t) ASMMult2xU32RetU64(uint32_t u32F1, uint32_t u32F2)
@@ -49,6 +61,8 @@ DECLINLINE(uint64_t) ASMMult2xU32RetU64(uint32_t u32F1, uint32_t u32F2)
__asm__ __volatile__("mull %%edx"
: "=A" (u64)
: "a" (u32F2), "d" (u32F1));
+# elif RT_INLINE_ASM_USES_INTRIN
+ u64 = __emulu(u32F1, u32F2);
# else
__asm
{
@@ -72,7 +86,7 @@ DECLINLINE(uint64_t) ASMMult2xU32RetU64(uint32_t u32F1, uint32_t u32F2)
*
* @returns u32F1 * u32F2.
*/
-#if RT_INLINE_ASM_EXTERNAL && defined(RT_ARCH_X86)
+#if RT_INLINE_ASM_EXTERNAL && !RT_INLINE_ASM_USES_INTRIN && defined(RT_ARCH_X86)
DECLASM(int64_t) ASMMult2xS32RetS64(int32_t i32F1, int32_t i32F2);
#else
DECLINLINE(int64_t) ASMMult2xS32RetS64(int32_t i32F1, int32_t i32F2)
@@ -83,6 +97,8 @@ DECLINLINE(int64_t) ASMMult2xS32RetS64(int32_t i32F1, int32_t i32F2)
__asm__ __volatile__("imull %%edx"
: "=A" (i64)
: "a" (i32F2), "d" (i32F1));
+# elif RT_INLINE_ASM_USES_INTRIN
+ i64 = __emul(i32F1, i32F2);
# else
__asm
{
@@ -101,6 +117,67 @@ DECLINLINE(int64_t) ASMMult2xS32RetS64(int32_t i32F1, int32_t i32F2)
#endif
+#if ARCH_BITS == 64
+DECLINLINE(uint64_t) ASMMult2xU64Ret2xU64(uint64_t u64F1, uint64_t u64F2, uint64_t *pu64ProdHi)
+{
+# if defined(RT_ARCH_AMD64) && (RT_INLINE_ASM_GNU_STYLE || RT_INLINE_ASM_USES_INTRIN)
+# if RT_INLINE_ASM_GNU_STYLE
+ uint64_t u64Low, u64High;
+ __asm__ __volatile__("mull %%rdx"
+ : "=a" (u64Low), "=d" (u64High)
+ : "0" (u64F1), "1" (u64F2));
+ *pu64ProdHi = u64High;
+ return u64Low;
+# elif RT_INLINE_ASM_USES_INTRIN
+ return _umul128(u64F1, u64F2, pu64ProdHi);
+# else
+# error "hmm"
+# endif
+# else /* generic: */
+ /*
+ * F1 * F2 = Prod
+ * -- --
+ * ab * cd = b*d + a*d*10 + b*c*10 + a*c*100
+ *
+ * Where a, b, c and d are 'digits', and 10 is max digit + 1.
+ *
+ * Our digits are 32-bit wide, so instead of 10 we multiply by 4G.
+ * Prod = F1.s.Lo*F2.s.Lo + F1.s.Hi*F2.s.Lo*4G
+ * + F1.s.Lo*F2.s.Hi*4G + F1.s.Hi*F2.s.Hi*4G*4G
+ */
+ RTUINT128U Prod;
+ RTUINT64U Tmp1;
+ uint64_t u64Tmp;
+ RTUINT64U F1, F2;
+ F1.u = u64F1;
+ F2.u = u64F2;
+
+ Prod.s.Lo = ASMMult2xU32RetU64(F1.s.Lo, F2.s.Lo);
+
+ Tmp1.u = ASMMult2xU32RetU64(F1.s.Hi, F2.s.Lo);
+ u64Tmp = (uint64_t)Prod.DWords.dw1 + Tmp1.s.Lo;
+ Prod.DWords.dw1 = (uint32_t)u64Tmp;
+ Prod.s.Hi = Tmp1.s.Hi;
+ Prod.s.Hi += u64Tmp >> 32; /* carry */
+
+ Tmp1.u = ASMMult2xU32RetU64(F1.s.Lo, F2.s.Hi);
+ u64Tmp = (uint64_t)Prod.DWords.dw1 + Tmp1.s.Lo;
+ Prod.DWords.dw1 = (uint32_t)u64Tmp;
+ u64Tmp >>= 32; /* carry */
+ u64Tmp += Prod.DWords.dw2;
+ u64Tmp += Tmp1.s.Hi;
+ Prod.DWords.dw2 = (uint32_t)u64Tmp;
+ Prod.DWords.dw3 += u64Tmp >> 32; /* carry */
+
+ Prod.s.Hi += ASMMult2xU32RetU64(F1.s.Hi, F2.s.Hi);
+ *pu64ProdHi = Prod.s.Hi;
+ return Prod.s.Lo;
+# endif
+}
+#endif
+
+
+
/**
* Divides a 64-bit unsigned by a 32-bit unsigned returning an unsigned 32-bit result.
*
diff --git a/include/iprt/asn1-generator-asn1-decoder.h b/include/iprt/asn1-generator-asn1-decoder.h
new file mode 100644
index 00000000000..ebc75214c71
--- /dev/null
+++ b/include/iprt/asn1-generator-asn1-decoder.h
@@ -0,0 +1,28 @@
+/** @file
+ * IPRT - ASN.1 Code Generator, the ASN1 Decoder Passes.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+#define RTASN1TMPL_PASS RTASN1TMPL_PASS_DECODE
+#include <iprt/asn1-generator-pass.h>
+
diff --git a/include/iprt/asn1-generator-core.h b/include/iprt/asn1-generator-core.h
new file mode 100644
index 00000000000..62fe20a9fc5
--- /dev/null
+++ b/include/iprt/asn1-generator-core.h
@@ -0,0 +1,38 @@
+/** @file
+ * IPRT - ASN.1 Code Generator, the ASN.1 Core Code (VTable, Compare, ..).
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+#include <iprt/assert.h>
+#include <iprt/err.h>
+#include <iprt/string.h>
+
+#define RTASN1TMPL_PASS RTASN1TMPL_PASS_VTABLE
+#include <iprt/asn1-generator-pass.h>
+#define RTASN1TMPL_PASS RTASN1TMPL_PASS_DELETE
+#include <iprt/asn1-generator-pass.h>
+#define RTASN1TMPL_PASS RTASN1TMPL_PASS_ENUM
+#include <iprt/asn1-generator-pass.h>
+#define RTASN1TMPL_PASS RTASN1TMPL_PASS_COMPARE
+#include <iprt/asn1-generator-pass.h>
+
diff --git a/include/iprt/asn1-generator-init.h b/include/iprt/asn1-generator-init.h
new file mode 100644
index 00000000000..d6d0e176079
--- /dev/null
+++ b/include/iprt/asn1-generator-init.h
@@ -0,0 +1,35 @@
+/** @file
+ * IPRT - ASN.1 Code Generator, the ASN1 Init, Clone and Modifier Passes.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+#define RTASN1TMPL_PASS RTASN1TMPL_PASS_INIT
+#include <iprt/asn1-generator-pass.h>
+#define RTASN1TMPL_PASS RTASN1TMPL_PASS_CLONE
+#include <iprt/asn1-generator-pass.h>
+#define RTASN1TMPL_PASS RTASN1TMPL_PASS_SETTERS_1
+#include <iprt/asn1-generator-pass.h>
+#define RTASN1TMPL_PASS RTASN1TMPL_PASS_SETTERS_2
+#include <iprt/asn1-generator-pass.h>
+
diff --git a/include/iprt/asn1-generator-internal-header.h b/include/iprt/asn1-generator-internal-header.h
new file mode 100644
index 00000000000..0d47dfe3bae
--- /dev/null
+++ b/include/iprt/asn1-generator-internal-header.h
@@ -0,0 +1,29 @@
+/** @file
+ * IPRT - ASN.1 Code Generator, the Internal Header File.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+#define RTASN1TMPL_PASS RTASN1TMPL_PASS_INTERNAL_HEADER
+#include <iprt/asn1-generator-pass.h>
+
diff --git a/include/iprt/asn1-generator-pass.h b/include/iprt/asn1-generator-pass.h
new file mode 100644
index 00000000000..c6dc6419711
--- /dev/null
+++ b/include/iprt/asn1-generator-pass.h
@@ -0,0 +1,1379 @@
+/** @file
+ * IPRT - ASN.1 Code Generator, One Pass.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+#ifndef ___iprt_asn1_generator_pass_h
+#define ___iprt_asn1_generator_pass_h
+
+#include <iprt/formats/asn1.h>
+
+
+/** @def RTASN1TMPL_MEMBER_OPT_ANY
+ * Used for optional entries without any specific type at the end of a
+ * structure.
+ *
+ * For example PolicyQualifierInfo's qualifier member which is defined as:
+ * ANY DEFINED BY policyQualifierId
+ *
+ * Defaults to RTASN1TMPL_MEMBER_EX.
+ */
+
+/** @def RTASN1TMPL_MEMBER_OPT_ITAG_EX
+ * Optional member with implict tag, extended version.
+ *
+ * This is what all the other RTASN1TMPL_MEMBER_OPT_ITAG* macros defere to.
+ */
+/** @def RTASN1TMPL_MEMBER_OPT_ITAG_CP
+ * Optional member of a typical primitive type with an implicit context tag.
+ *
+ * Examples of this can be found in AuthorityKeyIdentifier where the first and
+ * last member are primitive types (normally anyways).:
+ * keyIdentifier [1] OCTET STRING OPTIONAL,
+ * authorityCertSerialNumber [3] INTEGER OPTIONAL
+ */
+/** @def RTASN1TMPL_MEMBER_OPT_ITAG_UC
+ * Optional member of a constructed type from the universal tag class.
+ */
+/** @def RTASN1TMPL_MEMBER_OPT_ITAG_UP
+ * Optional member of a primitive type from the universal tag class.
+ */
+
+
+/** @name Expansion Passes (RTASN1TMPL_PASS values)
+ * @{ */
+#define RTASN1TMPL_PASS_INTERNAL_HEADER 1
+
+#define RTASN1TMPL_PASS_VTABLE 2
+#define RTASN1TMPL_PASS_ENUM 3
+#define RTASN1TMPL_PASS_DELETE 4
+#define RTASN1TMPL_PASS_COMPARE 5
+
+#define RTASN1TMPL_PASS_CHECK_SANITY 8
+
+#define RTASN1TMPL_PASS_INIT 16
+#define RTASN1TMPL_PASS_CLONE 17
+#define RTASN1TMPL_PASS_SETTERS_1 18
+#define RTASN1TMPL_PASS_SETTERS_2 19
+
+#define RTASN1TMPL_PASS_DECODE 24
+/** @} */
+
+/** @name ITAG clues
+ * @{ */
+#define RTASN1TMPL_ITAG_F_CC 1 /**< context, constructed. */
+#define RTASN1TMPL_ITAG_F_CP 2 /**< context, probably primary. (w/ numeric value) */
+#define RTASN1TMPL_ITAG_F_UP 3 /**< universal, probably primary. (w/ ASN1_TAG_XXX value) */
+#define RTASN1TMPL_ITAG_F_UC 4 /**< universal, constructed. (w/ ASN1_TAG_XXX value) */
+/** @} */
+/** Expands the ITAG clues into tag flag and tag class. */
+#define RTASN1TMPL_ITAG_F_EXPAND(a_fClue) \
+ ( a_fClue == RTASN1TMPL_ITAG_F_CC ? (ASN1_TAGCLASS_CONTEXT | ASN1_TAGFLAG_CONSTRUCTED ) \
+ : a_fClue == RTASN1TMPL_ITAG_F_CP ? (ASN1_TAGCLASS_CONTEXT | ASN1_TAGFLAG_PRIMITIVE) \
+ : a_fClue == RTASN1TMPL_ITAG_F_UP ? (ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_PRIMITIVE) \
+ : a_fClue == RTASN1TMPL_ITAG_F_UC ? (ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_CONSTRUCTED) \
+ : 0 )
+
+#define RTASN1TMPL_SEMICOLON_DUMMY() typedef unsigned RTASN1TMPLSEMICOLONDUMMY
+
+#endif /* !___iprt_asn1_generator_pass_h */
+
+
+#if RTASN1TMPL_PASS == RTASN1TMPL_PASS_INTERNAL_HEADER
+/*
+ *
+ * Internal header file.
+ *
+ */
+# define RTASN1TMPL_BEGIN_COMMON() extern DECLHIDDEN(RTASN1COREVTABLE const) RT_CONCAT3(g_,RTASN1TMPL_INT_NAME,_Vtable)
+
+# define RTASN1TMPL_BEGIN_SEQCORE() RTASN1TMPL_BEGIN_COMMON()
+# define RTASN1TMPL_BEGIN_SETCORE() RTASN1TMPL_BEGIN_COMMON()
+# define RTASN1TMPL_MEMBER_EX(a_Name, a_Type, a_Api, a_Constraints) RTASN1TMPL_SEMICOLON_DUMMY()
+# define RTASN1TMPL_MEMBER_DYN_BEGIN(a_enmType, a_enmMembNm, a_Allocation) RTASN1TMPL_SEMICOLON_DUMMY()
+# define RTASN1TMPL_MEMBER_DYN_END(a_enmType, a_enmMembNm, a_Allocation) RTASN1TMPL_SEMICOLON_DUMMY()
+# define RTASN1TMPL_END_SEQCORE() RTASN1TMPL_SEMICOLON_DUMMY()
+# define RTASN1TMPL_END_SETCORE() RTASN1TMPL_SEMICOLON_DUMMY()
+
+
+# define RTASN1TMPL_BEGIN_PCHOICE() RTASN1TMPL_BEGIN_COMMON()
+# define RTASN1TMPL_PCHOICE_ITAG_EX(a_uTag, a_enmChoice, a_PtrName, a_Name, a_Type, a_Api, a_fClue, a_Constraints) \
+ RTASN1TMPL_SEMICOLON_DUMMY()
+# define RTASN1TMPL_PCHOICE_XTAG_EX(a_uTag, a_enmChoice, a_PtrTnNm, a_CtxTagN, a_Name, a_Type, a_Api, a_Constraints) \
+ RTASN1TMPL_SEMICOLON_DUMMY()
+# define RTASN1TMPL_END_PCHOICE() RTASN1TMPL_SEMICOLON_DUMMY()
+
+
+# define RTASN1TMPL_SEQ_OF(a_ItemType, a_ItemApi) RTASN1TMPL_BEGIN_COMMON()
+# define RTASN1TMPL_SET_OF(a_ItemType, a_ItemApi) RTASN1TMPL_BEGIN_COMMON()
+
+
+
+#elif RTASN1TMPL_PASS == RTASN1TMPL_PASS_VTABLE
+/*
+ *
+ * Internal header file.
+ *
+ */
+# ifndef RTASN1TMPL_VTABLE_FN_ENCODE_PREP
+# define RTASN1TMPL_VTABLE_FN_ENCODE_PREP NULL
+# endif
+# ifndef RTASN1TMPL_VTABLE_FN_ENCODE_WRITE
+# define RTASN1TMPL_VTABLE_FN_ENCODE_WRITE NULL
+# endif
+# define RTASN1TMPL_BEGIN_COMMON(a_uDefaultTag, a_fDefaultClass) \
+ DECL_HIDDEN_CONST(RTASN1COREVTABLE const) RT_CONCAT3(g_,RTASN1TMPL_INT_NAME,_Vtable) = \
+ { \
+ /* When the Asn1Core is at the start of the structure, we can reuse the _Delete and _Enum APIs here. */ \
+ /* .pszName = */ RT_XSTR(RTASN1TMPL_EXT_NAME), \
+ /* .cb = */ sizeof(RTASN1TMPL_TYPE), \
+ /* .uDefaultTag = */ a_uDefaultTag, \
+ /* .fDefaultClass = */ a_fDefaultClass, \
+ /* .uReserved = */ 0, \
+ (PFNRTASN1COREVTDTOR)RT_CONCAT(RTASN1TMPL_EXT_NAME,_Delete), \
+ (PFNRTASN1COREVTENUM)RT_CONCAT(RTASN1TMPL_EXT_NAME,_Enum), \
+ (PFNRTASN1COREVTCLONE)RT_CONCAT(RTASN1TMPL_EXT_NAME,_Clone), \
+ (PFNRTASN1COREVTCOMPARE)RT_CONCAT(RTASN1TMPL_EXT_NAME,_Compare), \
+ (PFNRTASN1COREVTCHECKSANITY)RT_CONCAT(RTASN1TMPL_EXT_NAME,_CheckSanity), \
+ RTASN1TMPL_VTABLE_FN_ENCODE_PREP, \
+ RTASN1TMPL_VTABLE_FN_ENCODE_WRITE \
+ }
+
+# define RTASN1TMPL_BEGIN_SEQCORE() \
+ AssertCompileMemberOffset(RTASN1TMPL_TYPE, SeqCore, 0); \
+ RTASN1TMPL_BEGIN_COMMON(ASN1_TAG_SEQUENCE, ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_CONSTRUCTED)
+# define RTASN1TMPL_BEGIN_SETCORE() \
+ AssertCompileMemberOffset(RTASN1TMPL_TYPE, SetCore, 0); \
+ RTASN1TMPL_BEGIN_COMMON(ASN1_TAG_SET, ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_CONSTRUCTED)
+# define RTASN1TMPL_MEMBER_EX(a_Name, a_Type, a_Api, a_Constraints) RTASN1TMPL_SEMICOLON_DUMMY()
+# define RTASN1TMPL_MEMBER_DYN_BEGIN(a_enmType, a_enmMembNm, a_Allocation) RTASN1TMPL_SEMICOLON_DUMMY()
+# define RTASN1TMPL_MEMBER_DYN_END(a_enmType, a_enmMembNm, a_Allocation) RTASN1TMPL_SEMICOLON_DUMMY()
+# define RTASN1TMPL_END_SEQCORE() RTASN1TMPL_SEMICOLON_DUMMY()
+# define RTASN1TMPL_END_SETCORE() RTASN1TMPL_SEMICOLON_DUMMY()
+
+# define RTASN1TMPL_BEGIN_PCHOICE() \
+ AssertCompileMemberOffset(RTASN1TMPL_TYPE, Dummy, 0); \
+ RTASN1TMPL_BEGIN_COMMON(UINT8_MAX, UINT8_MAX)
+# define RTASN1TMPL_PCHOICE_ITAG_EX(a_uTag, a_enmChoice, a_PtrName, a_Name, a_Type, a_Api, a_fClue, a_Constraints) \
+ RTASN1TMPL_SEMICOLON_DUMMY()
+# define RTASN1TMPL_PCHOICE_XTAG_EX(a_uTag, a_enmChoice, a_PtrTnNm, a_CtxTagN, a_Name, a_Type, a_Api, a_Constraints) \
+ RTASN1TMPL_SEMICOLON_DUMMY()
+# define RTASN1TMPL_END_PCHOICE() RTASN1TMPL_SEMICOLON_DUMMY()
+
+# define RTASN1TMPL_SEQ_OF(a_ItemType, a_ItemApi) \
+ AssertCompileMemberOffset(RTASN1TMPL_TYPE, SeqCore, 0); \
+ RTASN1TMPL_BEGIN_COMMON(ASN1_TAG_SEQUENCE, ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_CONSTRUCTED)
+# define RTASN1TMPL_SET_OF(a_ItemType, a_ItemApi) \
+ AssertCompileMemberOffset(RTASN1TMPL_TYPE, SetCore, 0); \
+ RTASN1TMPL_BEGIN_COMMON(ASN1_TAG_SET, ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_CONSTRUCTED)
+
+
+
+#elif RTASN1TMPL_PASS == RTASN1TMPL_PASS_INIT
+/*
+ *
+ * Initialization to standard / default values.
+ *
+ */
+# define RTASN1TMPL_BEGIN_COMMON() \
+RTASN1TMPL_DECL(int) RT_CONCAT(RTASN1TMPL_EXT_NAME,_Init)(RT_CONCAT(P,RTASN1TMPL_TYPE) pThis, PCRTASN1ALLOCATORVTABLE pAllocator) \
+{ \
+ RT_ZERO(*pThis)
+# define RTASN1TMPL_END_COMMON() \
+ return rc; \
+} RTASN1TMPL_SEMICOLON_DUMMY()
+
+# define RTASN1TMPL_BEGIN_SEQCORE() \
+ RTASN1TMPL_BEGIN_COMMON(); \
+ int rc = RTAsn1SequenceCore_Init(&pThis->SeqCore, &RT_CONCAT3(g_,RTASN1TMPL_INT_NAME,_Vtable))
+# define RTASN1TMPL_BEGIN_SETCORE() \
+ RTASN1TMPL_BEGIN_COMMON(); \
+ int rc = RTAsn1SetCore_Init(&pThis->SetCore, &RT_CONCAT3(g_,RTASN1TMPL_INT_NAME,_Vtable))
+# define RTASN1TMPL_MEMBER_EX(a_Name, a_Type, a_Api, a_Constraints) \
+ if (RT_SUCCESS(rc)) \
+ rc = RT_CONCAT(a_Api,_Init)(&pThis->a_Name, pAllocator)
+
+# define RTASN1TMPL_MEMBER_DYN_BEGIN(a_enmType, a_enmMembNm, a_Allocation) \
+ RTAsn1MemInitAllocation(&pThis->Allocation, pAllocator); \
+ pThis->a_enmMembNm = RT_CONCAT(a_enmType,_NOT_PRESENT)
+# define RTASN1TMPL_MEMBER_DYN_COMMON(a_UnionNm, a_PtrName, a_Type, a_Api, a_Allocation, a_enmMembNm, a_enmValue, a_IfStmt) \
+ do { } while (0)
+# define RTASN1TMPL_MEMBER_DYN_END(a_enmType, a_enmMembNm, a_Allocation) do { } while (0)
+
+# define RTASN1TMPL_MEMBER_DEF_ITAG_EX(a_Name, a_Type, a_Api, a_uTag, a_fClue, a_DefVal, a_Constraints) \
+ if (RT_SUCCESS(rc)) \
+ { \
+ rc = RT_CONCAT(a_Api,_InitDefault)(&pThis->a_Name, a_DefVal, pAllocator); \
+ if (RT_SUCCESS(rc)) \
+ rc = RTAsn1Core_SetTagAndFlags(RT_CONCAT(a_Api,_GetAsn1Core)(&pThis->a_Name), \
+ a_uTag, RTASN1TMPL_ITAG_F_EXPAND(a_fClue)); \
+ }
+# define RTASN1TMPL_MEMBER_OPT_EX(a_Name, a_Type, a_Api, a_Constraints) do { } while (0) /* All optional members are left as not-present. */
+# define RTASN1TMPL_END_SEQCORE() \
+ if (RT_FAILURE(rc)) \
+ RT_CONCAT(RTASN1TMPL_EXT_NAME,_Delete)(pThis); \
+ RTASN1TMPL_END_COMMON()
+# define RTASN1TMPL_END_SETCORE() RTASN1TMPL_END_SEQCORE()
+
+/* No choice, just an empty, non-present structure. */
+# define RTASN1TMPL_BEGIN_PCHOICE() RTASN1TMPL_BEGIN_COMMON(); int rc = VINF_SUCCESS
+# define RTASN1TMPL_PCHOICE_ITAG_EX(a_uTag, a_enmChoice, a_PtrName, a_Name, a_Type, a_Api, a_fClue, a_Constraints) \
+ do { } while (0)
+# define RTASN1TMPL_PCHOICE_XTAG_EX(a_uTag, a_enmChoice, a_PtrTnNm, a_CtxTagN, a_Name, a_Type, a_Api, a_Constraints) \
+ do { } while (0)
+# define RTASN1TMPL_END_PCHOICE() RTASN1TMPL_END_COMMON()
+
+
+# define RTASN1TMPL_SET_SEQ_OF_COMMON(a_ItemType, a_ItemApi, a_OfApi, a_OfMember) \
+ RTASN1TMPL_BEGIN_COMMON(); \
+ RTAsn1MemInitAllocation(&pThis->Allocation, pAllocator); \
+ int rc = RT_CONCAT(a_OfApi,_Init)(&pThis->a_OfMember, &RT_CONCAT3(g_,RTASN1TMPL_INT_NAME,_Vtable)); \
+ if (RT_FAILURE(rc)) \
+ RT_ZERO(*pThis); \
+ RTASN1TMPL_END_COMMON()
+# define RTASN1TMPL_SEQ_OF(a_ItemType, a_ItemApi) RTASN1TMPL_SET_SEQ_OF_COMMON(a_ItemType, a_ItemApi, RTAsn1SeqOfCore, SeqCore)
+# define RTASN1TMPL_SET_OF(a_ItemType, a_ItemApi) RTASN1TMPL_SET_SEQ_OF_COMMON(a_ItemType, a_ItemApi, RTAsn1SetOfCore, SetCore)
+
+
+
+#elif RTASN1TMPL_PASS == RTASN1TMPL_PASS_DECODE
+/*
+ *
+ * Decode ASN.1.
+ *
+ */
+# define RTASN1TMPL_BEGIN_COMMON() \
+RTASN1TMPL_DECL(int) RT_CONCAT(RTASN1TMPL_EXT_NAME,_DecodeAsn1)(PRTASN1CURSOR pCursor, uint32_t fFlags, \
+ RT_CONCAT(P,RTASN1TMPL_TYPE) pThis, const char *pszErrorTag) \
+{ \
+ RT_ZERO(*pThis);
+
+# define RTASN1TMPL_END_COMMON() \
+ return rc; \
+} RTASN1TMPL_SEMICOLON_DUMMY()
+
+
+# define RTASN1TMPL_BEGIN_SEQCORE() \
+ RTASN1TMPL_BEGIN_COMMON(); \
+ RTASN1CURSOR ThisCursor; \
+ int rc = RTAsn1CursorGetSequenceCursor(pCursor, fFlags, &pThis->SeqCore, &ThisCursor, pszErrorTag); \
+ if (RT_FAILURE(rc)) \
+ return rc; \
+ pCursor = &ThisCursor; \
+ pThis->SeqCore.Asn1Core.pOps = &RT_CONCAT3(g_,RTASN1TMPL_INT_NAME,_Vtable)
+# define RTASN1TMPL_BEGIN_SETCORE() \
+ RTASN1TMPL_BEGIN_COMMON(); \
+ RTASN1CURSOR ThisCursor; \
+ int rc = RTAsn1CursorGetSetCursor(pCursor, fFlags, &pThis->SetCore, &ThisCursor, pszErrorTag); \
+ if (RT_FAILURE(rc)) \
+ return rc; \
+ pCursor = &ThisCursor; \
+ pThis->SetCore.Asn1Core.pOps = &RT_CONCAT3(g_,RTASN1TMPL_INT_NAME,_Vtable)
+
+# define RTASN1TMPL_MEMBER_EX(a_Name, a_Type, a_Api, a_Constraints) \
+ if (RT_SUCCESS(rc)) \
+ rc = RT_CONCAT(a_Api,_DecodeAsn1)(pCursor, 0, &pThis->a_Name, #a_Name)
+
+# define RTASN1TMPL_MEMBER_DYN_BEGIN(a_enmType, a_enmMembNm, a_Allocation) \
+ if (RT_SUCCESS(rc)) \
+ { \
+ int rc2; /* not initialized! */ \
+ RTAsn1CursorInitAllocation(pCursor, &pThis->a_Allocation); \
+ pThis->a_enmMembNm = RT_CONCAT(a_enmType, _INVALID); \
+ if (false) do { /*nothing*/ } while (0)
+# define RTASN1TMPL_MEMBER_DYN_COMMON(a_UnionNm, a_PtrName, a_Type, a_Api, a_Allocation, a_enmMembNm, a_enmValue, a_IfStmt) \
+ else a_IfStmt \
+ do { \
+ rc2 = RTAsn1MemAllocZ(&pThis->a_Allocation, (void **)&pThis->a_UnionNm.a_PtrName, \
+ sizeof(*pThis->a_UnionNm.a_PtrName)); \
+ if (RT_SUCCESS(rc2)) \
+ { \
+ pThis->a_enmMembNm = a_enmValue; \
+ rc2 = RT_CONCAT(a_Api,_DecodeAsn1)(pCursor, 0, pThis->a_UnionNm.a_PtrName, #a_UnionNm "." #a_PtrName); \
+ } \
+ } while (0)
+# define RTASN1TMPL_MEMBER_DYN_END(a_enmType, a_enmMembNm, a_Allocation) \
+ rc = rc2; /* Should trigger warning if a _DEFAULT is missing. */ \
+ }
+
+# define RTASN1TMPL_MEMBER_OPT_EX(a_Name, a_Type, a_Api, a_Constraints) \
+ Error_Missing_Specific_Macro_In_Decode_Pass()
+
+# define RTASN1TMPL_MEMBER_DEF_ITAG_EX(a_Name, a_Type, a_Api, a_uTag, a_fClue, a_DefVal, a_Constraints) \
+ if (RT_SUCCESS(rc)) \
+ { \
+ if (RTAsn1CursorIsNextEx(pCursor, a_uTag, RTASN1TMPL_ITAG_F_EXPAND(a_fClue))) \
+ rc = RT_CONCAT(a_Api,_DecodeAsn1)(pCursor, 0, &pThis->a_Name, #a_Name); \
+ else \
+ rc = RT_CONCAT(a_Api,_InitDefault)(&pThis->a_Name, a_DefVal, pCursor->pPrimary->pAllocator); \
+ if (RT_SUCCESS(rc)) \
+ rc = RTAsn1Core_SetTagAndFlags(RT_CONCAT(a_Api,_GetAsn1Core)(&pThis->a_Name), \
+ a_uTag, RTASN1TMPL_ITAG_F_EXPAND(a_fClue)); \
+ } do {} while (0)
+
+# define RTASN1TMPL_MEMBER_OPT_UTF8_STRING_EX(a_Name, a_Constraints) \
+ if (RT_SUCCESS(rc) && RTAsn1CursorIsNextEx(pCursor, ASN1_TAG_UTF8_STRING, ASN1_TAGCLASS_CONTEXT | ASN1_TAGFLAG_PRIMITIVE)) \
+ rc = RTAsn1CursorGetUtf8String(pCursor, 0, &pThis->a_Name, #a_Name)
+
+# define RTASN1TMPL_MEMBER_OPT_ITAG_EX(a_Name, a_Type, a_Api, a_uTag, a_fClue, a_Constraints) \
+ if (RT_SUCCESS(rc) && RTAsn1CursorIsNextEx(pCursor, a_uTag, RTASN1TMPL_ITAG_F_EXPAND(a_fClue)) /** @todo || CER */) \
+ rc = RT_CONCAT(a_Api,_DecodeAsn1)(pCursor, RTASN1CURSOR_GET_F_IMPLICIT, &pThis->a_Name, #a_Name)
+
+# define RTASN1TMPL_MEMBER_OPT_ITAG_BITSTRING(a_Name, a_cMaxBits, a_uTag) \
+ if (RT_SUCCESS(rc) && RTAsn1CursorIsNextEx(pCursor, a_uTag, ASN1_TAGCLASS_CONTEXT | ASN1_TAGFLAG_CONSTRUCTED)) \
+ rc = RTAsn1CursorGetBitStringEx(pCursor, RTASN1CURSOR_GET_F_IMPLICIT, a_cMaxBits, &pThis->a_Name, #a_Name)
+
+# define RTASN1TMPL_MEMBER_OPT_XTAG_EX(a_TnNm, a_CtxTagN, a_Name, a_Type, a_Api, a_uTag, a_Constraints) \
+ if (RT_SUCCESS(rc) && RTAsn1CursorIsNextEx(pCursor, a_uTag, ASN1_TAGCLASS_CONTEXT | ASN1_TAGFLAG_CONSTRUCTED)) \
+ { \
+ RTASN1CURSOR CtxCursor; \
+ rc = RT_CONCAT3(RTAsn1CursorGetContextTag,a_uTag,Cursor)(pCursor, 0, &pThis->a_TnNm.a_CtxTagN, &CtxCursor, #a_TnNm); \
+ if (RT_SUCCESS(rc)) \
+ { \
+ rc = RT_CONCAT(a_Api,_DecodeAsn1)(&CtxCursor, 0, &pThis->a_TnNm.a_Name, #a_Name); \
+ if (RT_SUCCESS(rc)) \
+ rc = RTAsn1CursorCheckEnd(&CtxCursor); \
+ } \
+ } do { } while (0)
+
+# define RTASN1TMPL_MEMBER_OPT_ANY(a_Name, a_Type, a_Api) \
+ if (RT_SUCCESS(rc) && pCursor->cbLeft > 0) \
+ RTASN1TMPL_MEMBER_EX(a_Name, a_Type, a_Api, RT_NOTHING)
+
+# define RTASN1TMPL_END_SEQCORE() \
+ if (RT_SUCCESS(rc)) \
+ rc = RTAsn1CursorCheckEnd(&ThisCursor); \
+ if (RT_SUCCESS(rc)) \
+ return VINF_SUCCESS; \
+ RT_CONCAT(RTASN1TMPL_EXT_NAME,_Delete)(pThis); \
+ RTASN1TMPL_END_COMMON()
+# define RTASN1TMPL_END_SETCORE() RTASN1TMPL_END_SEQCORE()
+
+
+# define RTASN1TMPL_BEGIN_PCHOICE() \
+ RTASN1TMPL_BEGIN_COMMON(); \
+ RTAsn1Dummy_InitEx(&pThis->Dummy); \
+ pThis->Dummy.Asn1Core.pOps = &RT_CONCAT3(g_,RTASN1TMPL_INT_NAME,_Vtable); \
+ RTAsn1CursorInitAllocation(pCursor, &pThis->Allocation); \
+ RTASN1CORE Asn1Peek; \
+ int rc = RTAsn1CursorPeek(pCursor, &Asn1Peek); \
+ if (RT_SUCCESS(rc)) \
+ { \
+ if (false) do {} while (0)
+# define RTASN1TMPL_PCHOICE_ITAG_EX(a_uTag, a_enmChoice, a_PtrName, a_Name, a_Type, a_Api, a_fClue, a_Constraints) \
+ else if ( Asn1Peek.uTag == (a_uTag) \
+ && (Asn1Peek.fClass == RTASN1TMPL_ITAG_F_EXPAND(a_fClue) /** @todo || CER */ ) ) \
+ do { \
+ pThis->enmChoice = a_enmChoice; \
+ rc = RTAsn1MemAllocZ(&pThis->Allocation, (void **)&pThis->a_PtrName, sizeof(*pThis->a_PtrName)); \
+ if (RT_SUCCESS(rc)) \
+ rc = RT_CONCAT(a_Api,_DecodeAsn1)(pCursor, RTASN1CURSOR_GET_F_IMPLICIT, pThis->a_PtrName, #a_PtrName); \
+ } while (0)
+# define RTASN1TMPL_PCHOICE_XTAG_EX(a_uTag, a_enmChoice, a_PtrTnNm, a_CtxTagN, a_Name, a_Type, a_Api, a_Constraints) \
+ else if (Asn1Peek.uTag == (a_uTag) && Asn1Peek.fClass == (ASN1_TAGCLASS_CONTEXT | ASN1_TAGFLAG_CONSTRUCTED)) \
+ do { \
+ pThis->enmChoice = a_enmChoice; \
+ rc = RTAsn1MemAllocZ(&pThis->Allocation, (void **)&pThis->a_PtrTnNm, sizeof(*pThis->a_PtrTnNm)); \
+ if (RT_SUCCESS(rc)) \
+ { \
+ RTASN1CURSOR CtxCursor; \
+ rc = RT_CONCAT3(RTAsn1CursorGetContextTag,a_uTag,Cursor)(pCursor, 0, &pThis->a_PtrTnNm->a_CtxTagN, \
+ &CtxCursor, "T" #a_uTag); \
+ if (RT_SUCCESS(rc)) \
+ rc = RT_CONCAT(a_Api,_DecodeAsn1)(&CtxCursor, RTASN1CURSOR_GET_F_IMPLICIT, \
+ &pThis->a_PtrTnNm->a_Name, #a_Name); \
+ if (RT_SUCCESS(rc)) \
+ rc = RTAsn1CursorCheckEnd(&CtxCursor); \
+ } \
+ } while (0)
+#define RTASN1TMPL_END_PCHOICE() \
+ else \
+ rc = RTAsn1CursorSetInfo(pCursor, VERR_GENERAL_FAILURE, "%s: Unknown choice: tag=%#x fClass=%#x", \
+ pszErrorTag, Asn1Peek.uTag, Asn1Peek.fClass); \
+ if (RT_SUCCESS(rc)) \
+ return VINF_SUCCESS; \
+ } \
+ RT_CONCAT(RTASN1TMPL_EXT_NAME,_Delete)(pThis); \
+ RTASN1TMPL_END_COMMON()
+
+
+# define RTASN1TMPL_SET_SEQ_OF_COMMON(a_ItemType, a_ItemApi, a_OfApi, a_OfMember, a_fnGetCursor) \
+ RTASN1TMPL_BEGIN_COMMON(); \
+ RTASN1CURSOR ThisCursor; \
+ int rc = a_fnGetCursor(pCursor, fFlags, &pThis->a_OfMember, &ThisCursor, pszErrorTag); \
+ if (RT_SUCCESS(rc)) \
+ { \
+ pCursor = &ThisCursor; \
+ pThis->a_OfMember.Asn1Core.pOps = &RT_CONCAT3(g_,RTASN1TMPL_INT_NAME,_Vtable); \
+ RTAsn1CursorInitAllocation(pCursor, &pThis->Allocation); \
+ \
+ uint32_t i = 0; \
+ while ( pCursor->cbLeft > 0 \
+ && RT_SUCCESS(rc)) \
+ { \
+ rc = RTAsn1MemGrowArray(&pThis->Allocation, \
+ (void **)&pThis->paItems, \
+ sizeof(pThis->paItems[0]), \
+ i, \
+ i + 1); \
+ if (RT_SUCCESS(rc)) \
+ { \
+ rc = RT_CONCAT(a_ItemApi,_DecodeAsn1)(pCursor, 0, &pThis->paItems[i], "paItems[#]"); \
+ if (RT_SUCCESS(rc)) \
+ { \
+ i++; \
+ pThis->cItems = i; \
+ continue; \
+ } \
+ } \
+ break; \
+ } \
+ if (RT_SUCCESS(rc)) \
+ { \
+ rc = RTAsn1CursorCheckEnd(pCursor); \
+ if (RT_SUCCESS(rc)) \
+ return VINF_SUCCESS; \
+ } \
+ RT_CONCAT(RTASN1TMPL_EXT_NAME,_Delete)(pThis); \
+ } \
+ RTASN1TMPL_END_COMMON()
+# define RTASN1TMPL_SEQ_OF(a_ItemType, a_ItemApi) \
+ RTASN1TMPL_SET_SEQ_OF_COMMON(a_ItemType, a_ItemApi, RTAsn1SeqOfCore, SeqCore, RTAsn1CursorGetSequenceCursor)
+# define RTASN1TMPL_SET_OF(a_ItemType, a_ItemApi) \
+ RTASN1TMPL_SET_SEQ_OF_COMMON(a_ItemType, a_ItemApi, RTAsn1SetOfCore, SetCore, RTAsn1CursorGetSetCursor)
+
+
+# define RTASN1TMPL_EXEC_DECODE(a_Expr) if (RT_SUCCESS(rc)) { a_Expr; }
+
+
+
+#elif RTASN1TMPL_PASS == RTASN1TMPL_PASS_ENUM
+/*
+ *
+ * Enumeration.
+ *
+ */
+# define RTASN1TMPL_BEGIN_COMMON() \
+RTASN1TMPL_DECL(int) RT_CONCAT(RTASN1TMPL_EXT_NAME,_Enum)(RT_CONCAT(P,RTASN1TMPL_TYPE) pThis, \
+ PFNRTASN1ENUMCALLBACK pfnCallback, \
+ uint32_t uDepth, void *pvUser) \
+{ \
+ if (!RT_CONCAT(RTASN1TMPL_EXT_NAME,_IsPresent)(pThis)) \
+ return VINF_SUCCESS; \
+ uDepth++; \
+ int rc = VINF_SUCCESS
+
+# define RTASN1TMPL_END_COMMON() \
+ return rc; \
+} RTASN1TMPL_SEMICOLON_DUMMY()
+
+# define RTASN1TMPL_BEGIN_SEQCORE() RTASN1TMPL_BEGIN_COMMON()
+# define RTASN1TMPL_BEGIN_SETCORE() RTASN1TMPL_BEGIN_COMMON()
+# define RTASN1TMPL_MEMBER_EX(a_Name, a_Type, a_Api, a_Constraints) \
+ if (rc == VINF_SUCCESS) \
+ rc = pfnCallback(RT_CONCAT(a_Api,_GetAsn1Core)(&pThis->a_Name), #a_Name, uDepth, pvUser)
+# define RTASN1TMPL_MEMBER_DYN_BEGIN(a_enmType, a_enmMembNm, a_Allocation) \
+ if (rc == VINF_SUCCESS) \
+ switch (pThis->a_enmMembNm) \
+ { \
+ default: rc = VERR_INTERNAL_ERROR_3; break
+# define RTASN1TMPL_MEMBER_DYN_COMMON(a_UnionNm, a_PtrName, a_Type, a_Api, a_Allocation, a_enmMembNm, a_enmValue, a_IfStmt) \
+ case a_enmValue: \
+ rc = pfnCallback(RT_CONCAT(a_Api,_GetAsn1Core)(pThis->a_UnionNm.a_PtrName), #a_UnionNm "." #a_PtrName, \
+ uDepth, pvUser); \
+ break
+# define RTASN1TMPL_MEMBER_DYN_END(a_enmType, a_enmMembNm, a_Allocation) \
+ case RT_CONCAT(a_enmType,_NOT_PRESENT): break; \
+ }
+# define RTASN1TMPL_MEMBER_OPT_EX(a_Name, a_Type, a_Api, a_Constraints) \
+ if (rc == VINF_SUCCESS && RT_CONCAT(a_Api,_IsPresent)(&pThis->a_Name)) \
+ rc = pfnCallback(RT_CONCAT(a_Api,_GetAsn1Core)(&pThis->a_Name), #a_Name, uDepth, pvUser)
+# define RTASN1TMPL_MEMBER_OPT_XTAG_EX(a_TnNm, a_CtxTagN, a_Name, a_Type, a_Api, a_uTag, a_Constraints) \
+ if (rc == VINF_SUCCESS && RTASN1CORE_IS_PRESENT(&pThis->a_TnNm.a_CtxTagN.Asn1Core)) \
+ { \
+ rc = pfnCallback(&pThis->a_TnNm.a_CtxTagN.Asn1Core, #a_Name, uDepth, pvUser); \
+ if (rc == VINF_SUCCESS) \
+ rc = pfnCallback(RT_CONCAT(a_Api,_GetAsn1Core)(&pThis->a_TnNm.a_Name), #a_TnNm "." #a_Name, uDepth, pvUser); \
+ } do {} while (0)
+# define RTASN1TMPL_END_SEQCORE() RTASN1TMPL_END_COMMON()
+# define RTASN1TMPL_END_SETCORE() RTASN1TMPL_END_COMMON()
+
+
+# define RTASN1TMPL_BEGIN_PCHOICE() \
+ RTASN1TMPL_BEGIN_COMMON(); \
+ switch (pThis->enmChoice) \
+ { \
+ default: rc = VERR_INTERNAL_ERROR_3; break
+# define RTASN1TMPL_PCHOICE_ITAG_EX(a_uTag, a_enmChoice, a_PtrName, a_Name, a_Type, a_Api, a_fClue, a_Constraints) \
+ case a_enmChoice: rc = pfnCallback(RT_CONCAT(a_Api,_GetAsn1Core)(pThis->a_PtrName), #a_PtrName, uDepth, pvUser)
+# define RTASN1TMPL_PCHOICE_XTAG_EX(a_uTag, a_enmChoice, a_PtrTnNm, a_CtxTagN, a_Name, a_Type, a_Api, a_Constraints) \
+ case a_enmChoice: \
+ rc = pfnCallback(&pThis->a_PtrTnNm->a_CtxTagN.Asn1Core, "T" #a_uTag "." #a_CtxTagN, uDepth, pvUser); \
+ if (rc != VINF_SUCCESS) \
+ rc = pfnCallback(RT_CONCAT(a_Api, _GetAsn1Core)(&pThis->a_PtrTnNm->a_Name), \
+ "T" #a_uTag "." #a_Name, uDepth + 1, pvUser); \
+ break
+#define RTASN1TMPL_END_PCHOICE() \
+ } \
+ RTASN1TMPL_END_COMMON()
+
+# define RTASN1TMPL_SET_SEQ_OF_COMMON(a_ItemType, a_ItemApi) \
+ RTASN1TMPL_BEGIN_COMMON(); \
+ for (uint32_t i = 0; i < pThis->cItems && rc == VINF_SUCCESS; i++) \
+ rc = pfnCallback(RT_CONCAT(a_ItemApi,_GetAsn1Core)(&pThis->paItems[i]), "paItems[#]", uDepth, pvUser); \
+ RTASN1TMPL_END_COMMON()
+# define RTASN1TMPL_SEQ_OF(a_ItemType, a_ItemApi) RTASN1TMPL_SET_SEQ_OF_COMMON(a_ItemType, a_ItemApi)
+# define RTASN1TMPL_SET_OF(a_ItemType, a_ItemApi) RTASN1TMPL_SET_SEQ_OF_COMMON(a_ItemType, a_ItemApi)
+
+
+
+#elif RTASN1TMPL_PASS == RTASN1TMPL_PASS_CLONE
+/*
+ *
+ * Clone another instance of the type.
+ *
+ */
+# define RTASN1TMPL_BEGIN_COMMON() \
+RTASN1TMPL_DECL(int) RT_CONCAT(RTASN1TMPL_EXT_NAME,_Clone)(RT_CONCAT(P,RTASN1TMPL_TYPE) pThis, \
+ RT_CONCAT(PC,RTASN1TMPL_TYPE) pSrc, \
+ PCRTASN1ALLOCATORVTABLE pAllocator) \
+{ \
+ RT_ZERO(*pThis); \
+ if (!RT_CONCAT(RTASN1TMPL_EXT_NAME,_IsPresent)(pSrc)) \
+ return VINF_SUCCESS; \
+
+# define RTASN1TMPL_END_COMMON() \
+ return rc; \
+} RTASN1TMPL_SEMICOLON_DUMMY()
+
+# define RTASN1TMPL_BEGIN_SEQCORE() \
+ RTASN1TMPL_BEGIN_COMMON(); \
+ int rc = RTAsn1SequenceCore_Clone(&pThis->SeqCore, &RT_CONCAT3(g_, RTASN1TMPL_INT_NAME, _Vtable), &pSrc->SeqCore)
+# define RTASN1TMPL_BEGIN_SETCORE() \
+ RTASN1TMPL_BEGIN_COMMON(); \
+ int rc = RTAsn1SetCore_Clone(&pThis->SetCore, &RT_CONCAT3(g_, RTASN1TMPL_INT_NAME, _Vtable), &pSrc->SetCore)
+
+# define RTASN1TMPL_MEMBER_EX(a_Name, a_Type, a_Api, a_Constraints) \
+ if (RT_SUCCESS(rc)) \
+ rc = RT_CONCAT(a_Api,_Clone)(&pThis->a_Name, &pSrc->a_Name, pAllocator); \
+
+# define RTASN1TMPL_MEMBER_DYN_BEGIN(a_enmType, a_enmMembNm, a_Allocation) \
+ if (RT_SUCCESS(rc)) \
+ { \
+ RTAsn1MemInitAllocation(&pThis->Allocation, pAllocator); \
+ pThis->a_enmMembNm = pSrc->a_enmMembNm; \
+ switch (pSrc->a_enmMembNm) \
+ { \
+ default: rc = VERR_INTERNAL_ERROR_3; break
+# define RTASN1TMPL_MEMBER_DYN_COMMON(a_UnionNm, a_PtrName, a_Type, a_Api, a_Allocation, a_enmMembNm, a_enmValue, a_IfStmt) \
+ case a_enmValue: \
+ rc = RTAsn1MemAllocZ(&pThis->a_Allocation, (void **)&pThis->a_UnionNm.a_PtrName, \
+ sizeof(*pThis->a_UnionNm.a_PtrName)); \
+ if (RT_SUCCESS(rc)) \
+ rc = RT_CONCAT(a_Api,_Clone)(pThis->a_UnionNm.a_PtrName, pSrc->a_UnionNm.a_PtrName, pAllocator); \
+ break
+# define RTASN1TMPL_MEMBER_DYN_END(a_enmType, a_enmMembNm, a_Allocation) \
+ case RT_CONCAT(a_enmType,_NOT_PRESENT): break; \
+ } \
+ }
+
+/* Optional members and members with defaults are the same as a normal member when cloning. */
+# define RTASN1TMPL_MEMBER_OPT_UTF8_STRING_EX(a_Name, a_Constraints) \
+ RTASN1TMPL_MEMBER_OPT_EX(a_Name, RTASN1STRING, RTAsn1Utf8String, a_Constraints RT_NOTHING)
+# define RTASN1TMPL_MEMBER_OPT_XTAG_EX(a_TnNm, a_CtxTagN, a_Name, a_Type, a_Api, a_uTag, a_Constraints) \
+ if (RTASN1CORE_IS_PRESENT(&pSrc->a_TnNm.a_CtxTagN.Asn1Core) && RT_SUCCESS(rc)) \
+ { \
+ rc = RT_CONCAT3(RTAsn1ContextTag,a_uTag,_Clone)(&pThis->a_TnNm.a_CtxTagN, &pSrc->a_TnNm.a_CtxTagN); \
+ if (RT_SUCCESS(rc)) \
+ rc = RT_CONCAT(a_Api,_Clone)(&pThis->a_TnNm.a_Name, &pSrc->a_TnNm.a_Name, pAllocator); \
+ } do { } while (0)
+
+# define RTASN1TMPL_END_SEQCORE() \
+ if (RT_FAILURE(rc)) \
+ RT_CONCAT(RTASN1TMPL_EXT_NAME,_Delete)(pThis); \
+ RTASN1TMPL_END_COMMON()
+# define RTASN1TMPL_END_SETCORE() RTASN1TMPL_END_SEQCORE()
+
+
+# define RTASN1TMPL_BEGIN_PCHOICE() \
+ RTASN1TMPL_BEGIN_COMMON(); \
+ RTAsn1Dummy_InitEx(&pThis->Dummy); \
+ RTAsn1MemInitAllocation(&pThis->Allocation, pAllocator); \
+ int rc; \
+ pThis->enmChoice = pSrc->enmChoice; \
+ switch (pSrc->enmChoice) \
+ { \
+ default: rc = VERR_INTERNAL_ERROR_3; break
+# define RTASN1TMPL_PCHOICE_ITAG_EX(a_uTag, a_enmChoice, a_PtrName, a_Name, a_Type, a_Api, a_fClue, a_Constraints) \
+ case a_enmChoice: \
+ rc = RTAsn1MemAllocZ(&pThis->Allocation, (void **)&pThis->a_PtrName, sizeof(*pThis->a_PtrName)); \
+ if (RT_SUCCESS(rc)) \
+ rc = RT_CONCAT(a_Api,_Clone)(pThis->a_PtrName, pSrc->a_PtrName, pAllocator); break
+# define RTASN1TMPL_PCHOICE_XTAG_EX(a_uTag, a_enmChoice, a_PtrTnNm, a_CtxTagN, a_Name, a_Type, a_Api, a_Constraints) \
+ case a_enmChoice: /* A bit of presence paranoia here, but better safe than sorry... */ \
+ rc = RTAsn1MemAllocZ(&pThis->Allocation, (void **)&pThis->a_PtrTnNm, sizeof(*pThis->a_PtrTnNm)); \
+ if (RT_SUCCESS(rc) && RTASN1CORE_IS_PRESENT(&pSrc->a_PtrTnNm->a_CtxTagN.Asn1Core)) \
+ { \
+ RT_CONCAT3(RTAsn1ContextTag,a_uTag,_Clone)(&pThis->a_PtrTnNm->a_CtxTagN, &pSrc->a_PtrTnNm->a_CtxTagN); \
+ rc = RT_CONCAT(a_Api,_Clone)(&pThis->a_PtrTnNm->a_Name, &pSrc->a_PtrTnNm->a_Name, pAllocator); \
+ } \
+ break
+#define RTASN1TMPL_END_PCHOICE() \
+ } \
+ if (RT_FAILURE(rc)) \
+ RT_CONCAT(RTASN1TMPL_EXT_NAME,_Delete)(pThis); \
+ RTASN1TMPL_END_COMMON()
+
+
+# define RTASN1TMPL_SET_SEQ_OF_COMMON(a_ItemType, a_ItemApi, a_OfApi, a_OfMember) \
+ RTASN1TMPL_BEGIN_COMMON(); \
+ int rc = RT_CONCAT(a_OfApi,_Clone)(&pThis->a_OfMember, &RT_CONCAT3(g_,RTASN1TMPL_INT_NAME,_Vtable), &pSrc->a_OfMember); \
+ if (RT_SUCCESS(rc)) \
+ { \
+ RTAsn1MemInitAllocation(&pThis->Allocation, pAllocator); \
+ uint32_t const cItems = pSrc->cItems; \
+ if (cItems > 0) \
+ { \
+ rc = RTAsn1MemGrowArray(&pThis->Allocation, (void **)&pThis->paItems, sizeof(pThis->paItems[0]), 0, cItems); \
+ if (RT_SUCCESS(rc)) \
+ { \
+ uint32_t i = 0; \
+ while (i < cItems) \
+ { \
+ rc = RT_CONCAT(a_ItemApi,_Clone)(&pThis->paItems[i], &pSrc->paItems[i], pAllocator); \
+ if (RT_SUCCESS(rc)) \
+ pThis->cItems = ++i; \
+ else \
+ { \
+ pThis->cItems = i; \
+ RT_CONCAT(RTASN1TMPL_EXT_NAME,_Delete)(pThis); \
+ return rc; \
+ } \
+ } \
+ } \
+ else \
+ RT_ZERO(*pThis); \
+ } \
+ } \
+ RTASN1TMPL_END_COMMON()
+# define RTASN1TMPL_SEQ_OF(a_ItemType, a_ItemApi) RTASN1TMPL_SET_SEQ_OF_COMMON(a_ItemType, a_ItemApi, RTAsn1SeqOfCore, SeqCore)
+# define RTASN1TMPL_SET_OF(a_ItemType, a_ItemApi) RTASN1TMPL_SET_SEQ_OF_COMMON(a_ItemType, a_ItemApi, RTAsn1SetOfCore, SetCore)
+
+# define RTASN1TMPL_EXEC_CLONE(a_Expr) if (RT_SUCCESS(rc)) { a_Expr; }
+
+
+
+#elif RTASN1TMPL_PASS == RTASN1TMPL_PASS_SETTERS_1
+/*
+ *
+ * Member setter helpers.
+ *
+ */
+# define RTASN1TMPL_BEGIN_SEQCORE() RTASN1TMPL_SEMICOLON_DUMMY()
+# define RTASN1TMPL_BEGIN_SETCORE() RTASN1TMPL_SEMICOLON_DUMMY()
+#if 1 /** @todo later */
+# define RTASN1TMPL_MEMBER_EX(a_Name, a_Type, a_Api, a_Constraints) RTASN1TMPL_SEMICOLON_DUMMY()
+#else
+# define RTASN1TMPL_MEMBER_EX(a_Name, a_Type, a_Api, a_Constraints) \
+ RTDECL(int) RT_CONCAT3(RTASN1TMPL_EXT_NAME,_Set,a_Name)(RTASN1TMPL_TYPE *pThis, a_Type const *pValue, \
+ PCRTASN1ALLOCATORVTABLE pAllocator) \
+ { \
+ if (RT_CONCAT(a_Api,_IsPresent)(&pThis->a_Name)) \
+ RT_CONCAT(a_Api,_Delete)(&pThis->a_Name); \
+ return RT_CONCAT(a_Api,_Clone)(&pThis->a_Name, pValue, pAllocator, true /* fResetImplicit */); \
+ } RTASN1TMPL_SEMICOLON_DUMMY()
+#endif
+
+# define RTASN1TMPL_MEMBER_DYN_BEGIN(a_enmType, a_enmMembNm, a_Allocation) RTASN1TMPL_SEMICOLON_DUMMY()
+# define RTASN1TMPL_MEMBER_DYN_END(a_enmType, a_enmMembNm, a_Allocation) RTASN1TMPL_SEMICOLON_DUMMY()
+# define RTASN1TMPL_END_SEQCORE() RTASN1TMPL_SEMICOLON_DUMMY()
+# define RTASN1TMPL_END_SETCORE() RTASN1TMPL_SEMICOLON_DUMMY()
+
+
+# define RTASN1TMPL_BEGIN_PCHOICE() RTASN1TMPL_SEMICOLON_DUMMY()
+# define RTASN1TMPL_PCHOICE_ITAG_EX(a_uTag, a_enmChoice, a_PtrName, a_Name, a_Type, a_Api, a_fClue, a_Constraints) RTASN1TMPL_SEMICOLON_DUMMY()
+# define RTASN1TMPL_PCHOICE_XTAG_EX(a_uTag, a_enmChoice, a_PtrTnNm, a_CtxTagN, a_Name, a_Type, a_Api, a_Constraints) RTASN1TMPL_SEMICOLON_DUMMY()
+# define RTASN1TMPL_END_PCHOICE() RTASN1TMPL_SEMICOLON_DUMMY()
+
+
+# define RTASN1TMPL_SEQ_OF(a_ItemType, a_ItemApi) RTASN1TMPL_SEMICOLON_DUMMY()
+# define RTASN1TMPL_SET_OF(a_ItemType, a_ItemApi) RTASN1TMPL_SEMICOLON_DUMMY()
+
+
+
+#elif RTASN1TMPL_PASS == RTASN1TMPL_PASS_SETTERS_2
+/*
+ *
+ * Member setters.
+ *
+ */
+# define RTASN1TMPL_BEGIN_SEQCORE() RTASN1TMPL_SEMICOLON_DUMMY()
+# define RTASN1TMPL_BEGIN_SETCORE() RTASN1TMPL_SEMICOLON_DUMMY()
+# define RTASN1TMPL_MEMBER_EX(a_Name, a_Type, a_Api, a_Constraints) RTASN1TMPL_SEMICOLON_DUMMY()
+# define RTASN1TMPL_MEMBER_DYN_BEGIN(a_enmType, a_enmMembNm, a_Allocation) RTASN1TMPL_SEMICOLON_DUMMY()
+# define RTASN1TMPL_MEMBER_DYN_END(a_enmType, a_enmMembNm, a_Allocation) RTASN1TMPL_SEMICOLON_DUMMY()
+# define RTASN1TMPL_END_SEQCORE() RTASN1TMPL_SEMICOLON_DUMMY()
+# define RTASN1TMPL_END_SETCORE() RTASN1TMPL_SEMICOLON_DUMMY()
+
+
+# define RTASN1TMPL_BEGIN_PCHOICE() RTASN1TMPL_SEMICOLON_DUMMY()
+
+# define RTASN1TMPL_PCHOICE_ITAG_EX(a_uTag, a_enmChoice, a_PtrName, a_Name, a_Type, a_Api, a_fClue, a_Constraints) \
+RTASN1TMPL_DECL(int) RT_CONCAT3(RTASN1TMPL_EXT_NAME,_Set,a_Name)(RT_CONCAT(P,RTASN1TMPL_TYPE) pThis, RT_CONCAT(PC,a_Type) pSrc,\
+ PCRTASN1ALLOCATORVTABLE pAllocator) \
+{ \
+ AssertPtr(pSrc); AssertPtr(pThis); \
+ RT_CONCAT(RTASN1TMPL_EXT_NAME,_Delete)(pThis); /* See _Init. */ \
+ RTAsn1Dummy_InitEx(&pThis->Dummy); \
+ RTAsn1MemInitAllocation(&pThis->Allocation, pAllocator); \
+ pThis->enmChoice = a_enmChoice; \
+ int rc = RTAsn1MemAllocZ(&pThis->Allocation, (void **)&pThis->a_PtrName, sizeof(*pThis->a_PtrName)); \
+ if (RT_SUCCESS(rc)) \
+ { \
+ rc = RT_CONCAT(a_Api,_Clone)(pThis->a_PtrName, pSrc, pAllocator); \
+ if (RT_SUCCESS(rc)) \
+ { \
+ RTAsn1Core_ResetImplict(RT_CONCAT(a_Api,_GetAsn1Core)(pThis->a_PtrName)); \
+ rc = RTAsn1Core_SetTagAndFlags(RT_CONCAT(a_Api,_GetAsn1Core)(pThis->a_PtrName), \
+ a_uTag, RTASN1TMPL_ITAG_F_EXPAND(a_fClue)); \
+ } \
+ } \
+ return rc; \
+} RTASN1TMPL_SEMICOLON_DUMMY()
+
+# define RTASN1TMPL_PCHOICE_XTAG_EX(a_uTag, a_enmChoice, a_PtrTnNm, a_CtxTagN, a_Name, a_Type, a_Api, a_Constraints) \
+RTASN1TMPL_DECL(int) RT_CONCAT3(RTASN1TMPL_EXT_NAME,_Set,a_Name)(RT_CONCAT(P,RTASN1TMPL_TYPE) pThis, RT_CONCAT(PC,a_Type) pSrc,\
+ PCRTASN1ALLOCATORVTABLE pAllocator) \
+{ \
+ AssertPtr(pThis); AssertPtr(pSrc); Assert(RT_CONCAT(a_Api,_IsPresent)(pSrc)); \
+ RT_CONCAT(RTASN1TMPL_EXT_NAME,_Delete)(pThis); /* See _Init. */ \
+ RTAsn1Dummy_InitEx(&pThis->Dummy); \
+ RTAsn1MemInitAllocation(&pThis->Allocation, pAllocator); \
+ pThis->enmChoice = a_enmChoice; \
+ int rc = RTAsn1MemAllocZ(&pThis->Allocation, (void **)&pThis->a_PtrTnNm, sizeof(*pThis->a_PtrTnNm)); \
+ if (RT_SUCCESS(rc)) \
+ { \
+ rc = RT_CONCAT3(RTAsn1ContextTag,a_uTag,_Init)(&pThis->a_PtrTnNm->a_CtxTagN, pAllocator); \
+ if (RT_SUCCESS(rc)) \
+ { \
+ rc = RT_CONCAT(a_Api,_Clone)(&pThis->a_PtrTnNm->a_Name, pSrc, pAllocator); \
+ if (RT_SUCCESS(rc)) \
+ RTAsn1Core_ResetImplict(RT_CONCAT(a_Api,_GetAsn1Core)(&pThis->a_PtrTnNm->a_Name)); \
+ } \
+ } \
+ return rc; \
+} RTASN1TMPL_SEMICOLON_DUMMY()
+
+#define RTASN1TMPL_END_PCHOICE() RTASN1TMPL_SEMICOLON_DUMMY()
+
+
+# define RTASN1TMPL_SEQ_OF(a_ItemType, a_ItemApi) RTASN1TMPL_SEMICOLON_DUMMY()
+# define RTASN1TMPL_SET_OF(a_ItemType, a_ItemApi) RTASN1TMPL_SEMICOLON_DUMMY()
+
+
+#elif RTASN1TMPL_PASS == RTASN1TMPL_PASS_COMPARE
+/*
+ *
+ * Compare two instances of the type.
+ *
+ */
+# define RTASN1TMPL_BEGIN_COMMON() \
+RTASN1TMPL_DECL(int) RT_CONCAT(RTASN1TMPL_EXT_NAME,_Compare)(RT_CONCAT(PC,RTASN1TMPL_TYPE) pLeft, \
+ RT_CONCAT(PC,RTASN1TMPL_TYPE) pRight) \
+{ \
+ if (!RT_CONCAT(RTASN1TMPL_EXT_NAME,_IsPresent)(pLeft)) \
+ return 0 - (int)RT_CONCAT(RTASN1TMPL_EXT_NAME,_IsPresent)(pRight); \
+ if (!RT_CONCAT(RTASN1TMPL_EXT_NAME,_IsPresent)(pRight)) \
+ return -1; \
+ int iDiff = 0
+
+# define RTASN1TMPL_END_COMMON() \
+ return iDiff; \
+} RTASN1TMPL_SEMICOLON_DUMMY()
+
+# define RTASN1TMPL_BEGIN_SEQCORE() RTASN1TMPL_BEGIN_COMMON()
+# define RTASN1TMPL_BEGIN_SETCORE() RTASN1TMPL_BEGIN_COMMON()
+# define RTASN1TMPL_MEMBER_EX(a_Name, a_Type, a_Api, a_Constraints) \
+ if (!iDiff) \
+ iDiff = RT_CONCAT(a_Api,_Compare)(&pLeft->a_Name, &pRight->a_Name)
+# define RTASN1TMPL_MEMBER_DYN_BEGIN(a_enmType, a_enmMembNm, a_Allocation) \
+ if (!iDiff && pLeft->a_enmMembNm != pRight->a_enmMembNm) \
+ iDiff = pLeft->a_enmMembNm < pRight->a_enmMembNm ? -1 : 1; \
+ else if (!iDiff) \
+ switch (pLeft->a_enmMembNm) \
+ { \
+ default: break
+# define RTASN1TMPL_MEMBER_DYN_COMMON(a_UnionNm, a_PtrName, a_Type, a_Api, a_Allocation, a_enmMembNm, a_enmValue, a_IfStmt) \
+ case a_enmValue: iDiff = RT_CONCAT(a_Api,_Compare)(pLeft->a_UnionNm.a_PtrName, pRight->a_UnionNm.a_PtrName); break
+# define RTASN1TMPL_MEMBER_DYN_END(a_enmType, a_enmMembNm, a_Allocation) \
+ case RT_CONCAT(a_enmType,_NOT_PRESENT): break; \
+ }
+# define RTASN1TMPL_MEMBER_OPT_XTAG_EX(a_TnNm, a_CtxTagN, a_Name, a_Type, a_Api, a_uTag, a_Constraints) \
+ if (!iDiff) \
+ { \
+ if (RTASN1CORE_IS_PRESENT(&pLeft->a_TnNm.a_CtxTagN.Asn1Core)) \
+ { \
+ if (RTASN1CORE_IS_PRESENT(&pRight->a_TnNm.a_CtxTagN.Asn1Core)) \
+ iDiff = RT_CONCAT(a_Api,_Compare)(&pLeft->a_TnNm.a_Name, &pRight->a_TnNm.a_Name); \
+ else \
+ iDiff = -1; \
+ } \
+ else \
+ iDiff = 0 - (int)RTASN1CORE_IS_PRESENT(&pRight->a_TnNm.a_CtxTagN.Asn1Core); \
+ } do { } while (0)
+# define RTASN1TMPL_END_SEQCORE() RTASN1TMPL_END_COMMON()
+# define RTASN1TMPL_END_SETCORE() RTASN1TMPL_END_COMMON()
+
+# define RTASN1TMPL_BEGIN_PCHOICE() \
+ RTASN1TMPL_BEGIN_COMMON(); \
+ if (pLeft->enmChoice != pRight->enmChoice) \
+ return pLeft->enmChoice < pRight->enmChoice ? -1 : 1; \
+ switch (pLeft->enmChoice) \
+ { \
+ default: break
+# define RTASN1TMPL_PCHOICE_ITAG_EX(a_uTag, a_enmChoice, a_PtrName, a_Name, a_Type, a_Api, a_fClue, a_Constraints) \
+ case a_enmChoice: iDiff = RT_CONCAT(a_Api,_Compare)(pLeft->a_PtrName, pRight->a_PtrName); break
+# define RTASN1TMPL_PCHOICE_XTAG_EX(a_uTag, a_enmChoice, a_PtrTnNm, a_CtxTagN, a_Name, a_Type, a_Api, a_Constraints) \
+ case a_enmChoice: iDiff = RT_CONCAT(a_Api,_Compare)(&pLeft->a_PtrTnNm->a_Name, &pRight->a_PtrTnNm->a_Name); break
+#define RTASN1TMPL_END_PCHOICE() \
+ } \
+ RTASN1TMPL_END_COMMON()
+
+
+# define RTASN1TMPL_SET_SEQ_OF_COMMON(a_ItemType, a_ItemApi) \
+ RTASN1TMPL_BEGIN_COMMON(); \
+ uint32_t cItems = pLeft->cItems; \
+ if (cItems == pRight->cItems) \
+ for (uint32_t i = 0; iDiff == 0 && i < cItems; i++) \
+ iDiff = RT_CONCAT(a_ItemApi,_Compare)(&pLeft->paItems[i], &pRight->paItems[i]); \
+ else \
+ iDiff = cItems < pRight->cItems ? -1 : 1; \
+ RTASN1TMPL_END_COMMON()
+# define RTASN1TMPL_SEQ_OF(a_ItemType, a_ItemApi) RTASN1TMPL_SET_SEQ_OF_COMMON(a_ItemType, a_ItemApi)
+# define RTASN1TMPL_SET_OF(a_ItemType, a_ItemApi) RTASN1TMPL_SET_SEQ_OF_COMMON(a_ItemType, a_ItemApi)
+
+
+
+#elif RTASN1TMPL_PASS == RTASN1TMPL_PASS_CHECK_SANITY
+/*
+ *
+ * Checks the sanity of the type.
+ *
+ */
+# ifndef RTASN1TMPL_SANITY_CHECK_EXPR
+# define RTASN1TMPL_SANITY_CHECK_EXPR() VINF_SUCCESS
+# endif
+# define RTASN1TMPL_BEGIN_COMMON() \
+RTASN1TMPL_DECL(int) RT_CONCAT(RTASN1TMPL_EXT_NAME,_CheckSanity)(RT_CONCAT(PC,RTASN1TMPL_TYPE) pThis, uint32_t fFlags, \
+ PRTERRINFO pErrInfo, const char *pszErrorTag) \
+{ \
+ if (RT_UNLIKELY(!RT_CONCAT(RTASN1TMPL_EXT_NAME,_IsPresent)(pThis))) \
+ return RTErrInfoSetF(pErrInfo, VERR_GENERAL_FAILURE, "%s: Missing (%s).", pszErrorTag, RT_XSTR(RTASN1TMPL_TYPE)); \
+ int rc = VINF_SUCCESS
+
+# define RTASN1TMPL_END_COMMON() \
+ if (RT_SUCCESS(rc)) \
+ rc = (RTASN1TMPL_SANITY_CHECK_EXPR()); \
+ return rc; \
+} RTASN1TMPL_SEMICOLON_DUMMY()
+
+# define RTASN1TMPL_BEGIN_SEQCORE() RTASN1TMPL_BEGIN_COMMON()
+# define RTASN1TMPL_BEGIN_SETCORE() RTASN1TMPL_BEGIN_COMMON()
+# define RTASN1TMPL_MEMBER_EX(a_Name, a_Type, a_Api, a_Constraints) \
+ if (RT_SUCCESS(rc)) \
+ { \
+ if (RT_LIKELY(RT_CONCAT(a_Api,_IsPresent)(&pThis->a_Name))) \
+ { \
+ rc = RT_CONCAT(a_Api,_CheckSanity)(&pThis->a_Name, fFlags & RTASN1_CHECK_SANITY_F_COMMON_MASK, \
+ pErrInfo, RT_XSTR(RTASN1TMPL_TYPE) "::" #a_Name); \
+ { a_Constraints } \
+ } \
+ else \
+ rc = RTErrInfoSetF(pErrInfo, VERR_GENERAL_FAILURE, "%s: Missing member %s (%s).", \
+ pszErrorTag, #a_Name, RT_XSTR(RTASN1TMPL_TYPE)); \
+ } do {} while (0)
+# define RTASN1TMPL_MEMBER_DYN_BEGIN(a_enmType, a_enmMembNm, a_Allocation) \
+ if (RT_SUCCESS(rc)) \
+ switch (pThis->a_enmMembNm) \
+ { \
+ default: \
+ rc = RTErrInfoSetF(pErrInfo, VERR_GENERAL_FAILURE, \
+ "%s: Invalid " #a_enmMembNm " value: %d", pszErrorTag, pThis->a_enmMembNm); \
+ break
+# define RTASN1TMPL_MEMBER_DYN_COMMON(a_UnionNm, a_PtrName, a_Type, a_Api, a_Allocation, a_enmMembNm, a_enmValue, a_IfStmt) \
+ case a_enmValue: \
+ rc = RT_CONCAT(a_Api,_CheckSanity)(pThis->a_UnionNm.a_PtrName, fFlags & RTASN1_CHECK_SANITY_F_COMMON_MASK, \
+ pErrInfo, RT_XSTR(RTASN1TMPL_TYPE) "::" #a_UnionNm "." #a_PtrName); \
+ break
+# define RTASN1TMPL_MEMBER_DYN_END(a_enmType, a_enmMembNm, a_Allocation) \
+ case RT_CONCAT(a_enmType,_NOT_PRESENT): \
+ rc = RTErrInfoSetF(pErrInfo, VERR_GENERAL_FAILURE, \
+ "%s: Invalid " #a_enmMembNm " value: " #a_enmType "_NOT_PRESENT", \
+ pszErrorTag, pThis->a_enmMembNm); \
+ break; \
+ }
+# define RTASN1TMPL_MEMBER_OPT_EX(a_Name, a_Type, a_Api, a_Constraints) \
+ if (RT_SUCCESS(rc) && RT_CONCAT(a_Api,_IsPresent)(&pThis->a_Name)) \
+ { \
+ rc = RT_CONCAT(a_Api,_CheckSanity)(&pThis->a_Name, fFlags & RTASN1_CHECK_SANITY_F_COMMON_MASK, \
+ pErrInfo, RT_XSTR(RTASN1TMPL_TYPE) "::" #a_Name); \
+ { a_Constraints } \
+ }
+# define RTASN1TMPL_MEMBER_OPT_XTAG_EX(a_TnNm, a_CtxTagN, a_Name, a_Type, a_Api, a_uTag, a_Constraints) \
+ if (RT_SUCCESS(rc)) \
+ { \
+ bool const fOuterPresent = RTASN1CORE_IS_PRESENT(&pThis->a_TnNm.a_CtxTagN.Asn1Core); \
+ bool const fInnerPresent = RT_CONCAT(a_Api,_IsPresent)(&pThis->a_TnNm.a_Name); \
+ if (fOuterPresent && fInnerPresent) \
+ { \
+ rc = RT_CONCAT(a_Api,_CheckSanity)(&pThis->a_TnNm.a_Name, fFlags & RTASN1_CHECK_SANITY_F_COMMON_MASK, \
+ pErrInfo, RT_XSTR(RTASN1TMPL_TYPE) "::" #a_Name); \
+ { a_Constraints } \
+ } \
+ else if (RT_UNLIKELY(RTASN1CORE_IS_PRESENT(&pThis->a_TnNm.a_CtxTagN.Asn1Core) != fInnerPresent)) \
+ rc = RTErrInfoSetF(pErrInfo, VERR_GENERAL_FAILURE, \
+ "%s::" #a_TnNm "." #a_Name ": Explict tag precense mixup; " #a_CtxTagN "=%d " #a_Name "=%d.", \
+ pszErrorTag, fOuterPresent, fInnerPresent); \
+ } do { } while (0)
+# define RTASN1TMPL_END_SEQCORE() RTASN1TMPL_END_COMMON()
+# define RTASN1TMPL_END_SETCORE() RTASN1TMPL_END_COMMON()
+
+
+# define RTASN1TMPL_BEGIN_PCHOICE() \
+ RTASN1TMPL_BEGIN_COMMON(); \
+ switch (pThis->enmChoice) \
+ { \
+ default: \
+ rc = RTErrInfoSetF(pErrInfo, VERR_GENERAL_FAILURE, \
+ "%s: Invalid enmChoice value: %d", pszErrorTag, pThis->enmChoice); \
+ break
+# define RTASN1TMPL_PCHOICE_ITAG_EX(a_uTag, a_enmChoice, a_PtrName, a_Name, a_Type, a_Api, a_fClue, a_Constraints) \
+ case a_enmChoice: \
+ if (pThis->a_PtrName && RT_CONCAT(a_Api,_IsPresent)(pThis->a_PtrName)) \
+ { \
+ PCRTASN1CORE pCore = RT_CONCAT(a_Api,_GetAsn1Core)(pThis->a_PtrName); \
+ if (pCore->uTag == a_uTag && pCore->fClass == RTASN1TMPL_ITAG_F_EXPAND(a_fClue)) \
+ { \
+ rc = RT_CONCAT(a_Api,_CheckSanity)(pThis->a_PtrName, fFlags & RTASN1_CHECK_SANITY_F_COMMON_MASK, \
+ pErrInfo, RT_XSTR(RTASN1TMPL_TYPE) "::" #a_Name); \
+ { a_Constraints } \
+ } \
+ else \
+ rc = RTErrInfoSetF(pErrInfo, VERR_GENERAL_FAILURE, \
+ "%s::" #a_Name ": Tag/class mismatch: expected %#x/%#x, actual %#x/%x.", \
+ pszErrorTag, a_uTag, RTASN1TMPL_ITAG_F_EXPAND(a_fClue), pCore->uTag, pCore->fClass); \
+ } \
+ else \
+ rc = RTErrInfoSetF(pErrInfo, VERR_GENERAL_FAILURE, "%s::" #a_Name ": Not present.", pszErrorTag); \
+ break
+# define RTASN1TMPL_PCHOICE_XTAG_EX(a_uTag, a_enmChoice, a_PtrTnNm, a_CtxTagN, a_Name, a_Type, a_Api, a_Constraints) \
+ case a_enmChoice: \
+ if ( pThis->a_PtrTnNm \
+ && RTASN1CORE_IS_PRESENT(&(pThis->a_PtrTnNm->a_CtxTagN.Asn1Core)) \
+ && RT_CONCAT(a_Api,_IsPresent)(&pThis->a_PtrTnNm->a_Name) ) \
+ { \
+ rc = RT_CONCAT(a_Api,_CheckSanity)(&pThis->a_PtrTnNm->a_Name, fFlags & RTASN1_CHECK_SANITY_F_COMMON_MASK, \
+ pErrInfo, RT_XSTR(RTASN1TMPL_TYPE) "::" #a_Name); \
+ { a_Constraints } \
+ } \
+ else \
+ rc = RTErrInfoSetF(pErrInfo, VERR_GENERAL_FAILURE, "%s::" #a_Name ": Not present.", pszErrorTag); \
+ break
+#define RTASN1TMPL_END_PCHOICE() \
+ } \
+ RTASN1TMPL_END_COMMON()
+
+
+# define RTASN1TMPL_SET_SEQ_OF_COMMON(a_ItemType, a_ItemApi) \
+ RTASN1TMPL_BEGIN_COMMON(); \
+ for (uint32_t i = 0; RT_SUCCESS(rc) && i < pThis->cItems; i++) \
+ rc = RT_CONCAT(a_ItemApi,_CheckSanity)(&pThis->paItems[i], fFlags & RTASN1_CHECK_SANITY_F_COMMON_MASK, \
+ pErrInfo, RT_XSTR(RTASN1TMPL_TYPE) "::paItems[#]"); \
+ if (RT_SUCCESS(rc)) { RTASN1TMPL_SET_SEQ_EXEC_CHECK_SANITY(); } \
+ RTASN1TMPL_END_COMMON()
+# define RTASN1TMPL_SEQ_OF(a_ItemType, a_ItemApi) RTASN1TMPL_SET_SEQ_OF_COMMON(a_ItemType, a_ItemApi)
+# define RTASN1TMPL_SET_OF(a_ItemType, a_ItemApi) RTASN1TMPL_SET_SEQ_OF_COMMON(a_ItemType, a_ItemApi)
+
+/* The constraints. */
+# define RTASN1TMPL_MEMBER_CONSTR_MIN_MAX(a_Name, a_Type, a_Api, cbMin, cbMax, a_MoreConstraints) \
+ if (RT_SUCCESS(rc) && ((cbMin) != 0 || (cbMax) != UINT32_MAX)) \
+ { \
+ PCRTASN1CORE pCore = RT_CONCAT(a_Api,_GetAsn1Core)(&pThis->a_Name); \
+ if (RT_UNLIKELY(pCore->cb < (cbMin) || pCore->cb > (cbMax))) \
+ rc = RTErrInfoSetF(pErrInfo, VERR_GENERAL_FAILURE, \
+ "%s::" #a_Name ": Content size is out of range: %#x not in {%#x..%#x}", \
+ pszErrorTag, pCore->cb, cbMin, cbMax); \
+ } \
+ { a_MoreConstraints }
+
+# define RTASN1TMPL_MEMBER_CONSTR_BITSTRING_MIN_MAX(a_Name, cMinBits, cMaxBits, a_MoreConstraints) \
+ if (RT_SUCCESS(rc) && ((cMinBits) != 0 || (cMaxBits) != UINT32_MAX)) \
+ { \
+ if (RT_UNLIKELY( ((cMinBits) == 0 ? false : pThis->a_Name.cBits + 1U < (cMinBits) + 1U /* warning avoiding */) \
+ || ((cMaxBits) == UINT32_MAX ? false : pThis->a_Name.cBits + 1U > (cMaxBits) + 1U /* ditto */) ) ) \
+ rc = RTErrInfoSetF(pErrInfo, VERR_GENERAL_FAILURE, \
+ "%s::" #a_Name ": Bit size is out of range: %#x not in {%#x..%#x}", \
+ pszErrorTag, pThis->a_Name.cBits, cMinBits, cMaxBits); \
+ } \
+ { a_MoreConstraints }
+
+# define RTASN1TMPL_MEMBER_CONSTR_PRESENT(a_Name, a_Api, a_MoreConstraints) \
+ if (RT_SUCCESS(rc) && RT_UNLIKELY(!RT_CONCAT(a_Api,_IsPresent)(&pThis->a_Name))) \
+ rc = RTErrInfoSetF(pErrInfo, VERR_GENERAL_FAILURE, "%s::" #a_Name ": Missing.", pszErrorTag); \
+ { a_MoreConstraints }
+
+
+
+# define RTASN1TMPL_EXEC_CHECK_SANITY(a_Expr) if (RT_SUCCESS(rc)) { a_Expr; }
+
+
+#elif RTASN1TMPL_PASS == RTASN1TMPL_PASS_DELETE
+/*
+ *
+ * Delete wrappers.
+ *
+ */
+# define RTASN1TMPL_BEGIN_COMMON() \
+RTASN1TMPL_DECL(void) RT_CONCAT(RTASN1TMPL_EXT_NAME,_Delete)(RT_CONCAT(P,RTASN1TMPL_TYPE) pThis) \
+{ \
+ if (RT_CONCAT(RTASN1TMPL_EXT_NAME,_IsPresent)(pThis)) \
+ { do { } while (0)
+
+# define RTASN1TMPL_END_COMMON() \
+ } \
+ RT_ZERO(*pThis); \
+} RTASN1TMPL_SEMICOLON_DUMMY()
+
+# define RTASN1TMPL_BEGIN_SEQCORE() RTASN1TMPL_BEGIN_COMMON()
+# define RTASN1TMPL_BEGIN_SETCORE() RTASN1TMPL_BEGIN_COMMON()
+# define RTASN1TMPL_MEMBER_EX(a_Name, a_Type, a_Api, a_Constraints) RT_CONCAT(a_Api,_Delete)(&pThis->a_Name)
+# define RTASN1TMPL_MEMBER_DYN_BEGIN(a_enmType, a_enmMembNm, a_Allocation) \
+ switch (pThis->a_enmMembNm) \
+ { \
+ default: break
+# define RTASN1TMPL_MEMBER_DYN_COMMON(a_UnionNm, a_PtrName, a_Type, a_Api, a_Allocation, a_enmMembNm, a_enmValue, a_IfStmt) \
+ case a_enmValue: RT_CONCAT(a_Api,_Delete)(pThis->a_UnionNm.a_PtrName); break
+# define RTASN1TMPL_MEMBER_DYN_END(a_enmType, a_enmMembNm, a_Allocation) \
+ }
+# define RTASN1TMPL_END_SEQCORE() RTASN1TMPL_END_COMMON()
+# define RTASN1TMPL_END_SETCORE() RTASN1TMPL_END_COMMON()
+
+
+# define RTASN1TMPL_BEGIN_PCHOICE() \
+ RTASN1TMPL_BEGIN_COMMON(); \
+ switch (pThis->enmChoice) \
+ { \
+ default: break
+# define RTASN1TMPL_PCHOICE_ITAG_EX(a_uTag, a_enmChoice, a_PtrName, a_Name, a_Type, a_Api, a_fClue, a_Constraints) \
+ case a_enmChoice: \
+ RT_CONCAT(a_Api,_Delete)(pThis->a_PtrName); \
+ RTAsn1MemFree(&pThis->Allocation, pThis->a_PtrName); \
+ pThis->a_PtrName = NULL; \
+ break
+# define RTASN1TMPL_PCHOICE_XTAG_EX(a_uTag, a_enmChoice, a_PtrTnNm, a_CtxTagN, a_Name, a_Type, a_Api, a_Constraints) \
+ case a_enmChoice: \
+ RT_CONCAT(a_Api,_Delete)(&pThis->a_PtrTnNm->a_Name); \
+ RTAsn1MemFree(&pThis->Allocation, pThis->a_PtrTnNm); \
+ pThis->a_PtrTnNm = NULL; \
+ break
+# define RTASN1TMPL_END_PCHOICE() \
+ } \
+ RTASN1TMPL_END_COMMON()
+
+
+# define RTASN1TMPL_SET_SEQ_OF_COMMON(a_ItemType, a_ItemApi) \
+ RTASN1TMPL_BEGIN_COMMON(); \
+ uint32_t i = pThis->cItems; \
+ while (i-- > 0) \
+ RT_CONCAT(a_ItemApi,_Delete)(&pThis->paItems[i]); \
+ RTAsn1MemFree(&pThis->Allocation, pThis->paItems); \
+ pThis->paItems = NULL; \
+ RTASN1TMPL_END_COMMON()
+# define RTASN1TMPL_SEQ_OF(a_ItemType, a_ItemApi) RTASN1TMPL_SET_SEQ_OF_COMMON(a_ItemType, a_ItemApi)
+# define RTASN1TMPL_SET_OF(a_ItemType, a_ItemApi) RTASN1TMPL_SET_SEQ_OF_COMMON(a_ItemType, a_ItemApi)
+
+
+#else
+# error "Invalid/missing RTASN1TMPL_PASS value."
+#endif
+
+
+
+/*
+ * Default aliases for simplified versions of macros if no specialization
+ * was required above.
+ */
+/* Non-optional members. */
+#ifndef RTASN1TMPL_MEMBER
+# define RTASN1TMPL_MEMBER(a_Name, a_Type, a_Api) \
+ RTASN1TMPL_MEMBER_EX(a_Name, a_Type, a_Api, RT_NOTHING)
+#endif
+
+#ifndef RTASN1TMPL_MEMBER_UTF8_STRING_MIN_MAX
+# define RTASN1TMPL_MEMBER_UTF8_STRING_MIN_MAX(a_Name) \
+ RTASN1TMPL_MEMBER(a_Name, RTASN1STRING, RTAsn1String)
+#endif
+#ifndef RTASN1TMPL_MEMBER_UTF8_STRING
+# define RTASN1TMPL_MEMBER_UTF8_STRING(a_Name) \
+ RTASN1TMPL_MEMBER_UTF8_STRING_MIN_MAX(a_Name, 0, UINT32_MAX)
+#endif
+
+#ifndef RTASN1TMPL_MEMBER_STRING_MIN_MAX
+# define RTASN1TMPL_MEMBER_STRING_MIN_MAX(a_Name, a_cbMin, a_cbMax) \
+ RTASN1TMPL_MEMBER(a_Name, RTASN1STRING, RTAsn1String)
+#endif
+#ifndef RTASN1TMPL_MEMBER_STRING
+# define RTASN1TMPL_MEMBER_STRING(a_Name) \
+ RTASN1TMPL_MEMBER_STRING_MIN_MAX(a_Name, 0, UINT32_MAX)
+#endif
+#ifndef RTASN1TMPL_MEMBER_XTAG_EX
+# define RTASN1TMPL_MEMBER_XTAG_EX(a_TnNm, a_CtxTagN, a_Name, a_Type, a_Api, a_uTag, a_Constraints) \
+ RTASN1TMPL_MEMBER_EX(a_TnNm.a_Name, a_Type, a_Api, a_Constraints RT_NOTHING)
+#endif
+
+/* Any/dynamic members. */
+#ifndef RTASN1TMPL_MEMBER_DYN_BEGIN
+# define RTASN1TMPL_MEMBER_DYN_BEGIN(a_enmType, a_enmMembNm, a_Allocation) do { } while (0)
+#endif
+#ifndef RTASN1TMPL_MEMBER_DYN_END
+# define RTASN1TMPL_MEMBER_DYN_END(a_enmType, a_enmMembNm, a_Allocation) do { } while (0)
+#endif
+#ifndef RTASN1TMPL_MEMBER_DYN_COMMON
+# define RTASN1TMPL_MEMBER_DYN_COMMON(a_UnionNm, a_PtrName, a_Type, a_Api, a_Allocation, a_enmMembNm, a_enmValue, a_IfStmt) \
+ RTASN1TMPL_MEMBER(a_UnionNm.a_PtrName, a_Type, a_Api)
+#endif
+#ifndef RTASN1TMPL_MEMBER_DYN
+# define RTASN1TMPL_MEMBER_DYN(a_UnionNm, a_PtrName, a_Type, a_Api, a_Allocation, a_enmMembNm, a_enmValue, a_WhenExpr) \
+ RTASN1TMPL_MEMBER_DYN_COMMON(a_UnionNm, a_PtrName, a_Type, a_Api, a_Allocation, a_enmMembNm, a_enmValue, if (a_WhenExpr))
+#endif
+#ifndef RTASN1TMPL_MEMBER_DYN_DEFAULT
+# define RTASN1TMPL_MEMBER_DYN_DEFAULT(a_UnionNm, a_PtrName, a_Type, a_Api, a_Allocation, a_enmMembNm, a_enmValue) \
+ RTASN1TMPL_MEMBER_DYN_COMMON(a_UnionNm, a_PtrName, a_Type, a_Api, a_Allocation, a_enmMembNm, a_enmValue, RT_NOTHING)
+#endif
+
+/* Optional members. */
+#ifndef RTASN1TMPL_MEMBER_OPT_EX
+# define RTASN1TMPL_MEMBER_OPT_EX(a_Name, a_Type, a_Api, a_Constraints) \
+ RTASN1TMPL_MEMBER_EX(a_Name, a_Type, a_Api, a_Constraints RT_NOTHING)
+#endif
+#ifndef RTASN1TMPL_MEMBER_OPT
+# define RTASN1TMPL_MEMBER_OPT(a_Name, a_Type, a_Api) \
+ RTASN1TMPL_MEMBER_OPT_EX(a_Name, a_Type, a_Api, RT_NOTHING)
+#endif
+
+#ifndef RTASN1TMPL_MEMBER_OPT_XTAG_EX
+# define RTASN1TMPL_MEMBER_OPT_XTAG_EX(a_TnNm, a_CtxTagN, a_Name, a_Type, a_Api, a_uTag, a_Constraints) \
+ RTASN1TMPL_MEMBER_OPT_EX(a_TnNm.a_Name, a_Type, a_Api, a_Constraints RT_NOTHING)
+#endif
+#ifndef RTASN1TMPL_MEMBER_OPT_XTAG
+# define RTASN1TMPL_MEMBER_OPT_XTAG(a_TnNm, a_CtxTagN, a_Name, a_Type, a_Api, a_uTag) \
+ RTASN1TMPL_MEMBER_OPT_XTAG_EX(a_TnNm, a_CtxTagN, a_Name, a_Type, a_Api, a_uTag, RT_NOTHING)
+#endif
+
+#ifndef RTASN1TMPL_MEMBER_OPT_ITAG_EX
+# define RTASN1TMPL_MEMBER_OPT_ITAG_EX(a_Name, a_Type, a_Api, a_uTag, a_fClue, a_Constraints) \
+ RTASN1TMPL_MEMBER_OPT_EX(a_Name, a_Type, a_Api, a_Constraints RT_NOTHING)
+#endif
+#ifndef RTASN1TMPL_MEMBER_OPT_ITAG_UP
+# define RTASN1TMPL_MEMBER_OPT_ITAG_UP(a_Name, a_Type, a_Api, a_uTag) \
+ RTASN1TMPL_MEMBER_OPT_ITAG_EX(a_Name, a_Type, a_Api, a_uTag, RTASN1TMPL_ITAG_F_UP, RT_NOTHING)
+#endif
+#ifndef RTASN1TMPL_MEMBER_OPT_ITAG_UC
+# define RTASN1TMPL_MEMBER_OPT_ITAG_UC(a_Name, a_Type, a_Api, a_uTag) \
+ RTASN1TMPL_MEMBER_OPT_ITAG_EX(a_Name, a_Type, a_Api, a_uTag, RTASN1TMPL_ITAG_F_UC, RT_NOTHING)
+#endif
+#ifndef RTASN1TMPL_MEMBER_OPT_ITAG_CP
+# define RTASN1TMPL_MEMBER_OPT_ITAG_CP(a_Name, a_Type, a_Api, a_uTag) \
+ RTASN1TMPL_MEMBER_OPT_ITAG_EX(a_Name, a_Type, a_Api, a_uTag, RTASN1TMPL_ITAG_F_CP, RT_NOTHING)
+#endif
+#ifndef RTASN1TMPL_MEMBER_OPT_ITAG
+# define RTASN1TMPL_MEMBER_OPT_ITAG(a_Name, a_Type, a_Api, a_uTag) \
+ RTASN1TMPL_MEMBER_OPT_ITAG_EX(a_Name, a_Type, a_Api, a_uTag, RTASN1TMPL_ITAG_F_CC, RT_NOTHING)
+#endif
+#ifndef RTASN1TMPL_MEMBER_OPT_ANY
+# define RTASN1TMPL_MEMBER_OPT_ANY(a_Name, a_Type, a_Api) \
+ RTASN1TMPL_MEMBER_OPT_EX(a_Name, a_Type, a_Api, RT_NOTHING)
+#endif
+
+#ifndef RTASN1TMPL_MEMBER_DEF_ITAG_EX
+# define RTASN1TMPL_MEMBER_DEF_ITAG_EX(a_Name, a_Type, a_Api, a_uTag, a_fClue, a_DefVal, a_Constraints) \
+ RTASN1TMPL_MEMBER_OPT_ITAG_EX(a_Name, a_Type, a_Api, a_uTag, a_fClue, a_Constraints RT_NOTHING)
+#endif
+#ifndef RTASN1TMPL_MEMBER_DEF_ITAG_UP
+# define RTASN1TMPL_MEMBER_DEF_ITAG_UP(a_Name, a_Type, a_Api, a_uTag, a_DefVal) \
+ RTASN1TMPL_MEMBER_DEF_ITAG_EX(a_Name, a_Type, a_Api, a_uTag, RTASN1TMPL_ITAG_F_UP, a_DefVal, RT_NOTHING)
+#endif
+
+#ifndef RTASN1TMPL_MEMBER_OPT_ITAG_BITSTRING
+# define RTASN1TMPL_MEMBER_OPT_ITAG_BITSTRING(a_Name, a_cMaxBits, a_uTag) \
+ RTASN1TMPL_MEMBER_OPT_ITAG_EX(a_Name, RTASN1BITSTRING, RTAsn1BitString, a_uTag, RTASN1TMPL_ITAG_F_CP, \
+ RTASN1TMPL_MEMBER_CONSTR_BITSTRING_MIN_MAX(a_Name, 0, a_cMaxBits, RT_NOTHING))
+#endif
+
+#ifndef RTASN1TMPL_MEMBER_OPT_UTF8_STRING_EX
+# define RTASN1TMPL_MEMBER_OPT_UTF8_STRING_EX(a_Name, a_Constraints) \
+ RTASN1TMPL_MEMBER_OPT_EX(a_Name, RTASN1STRING, RTAsn1String, a_Constraints RT_NOTHING)
+#endif
+#ifndef RTASN1TMPL_MEMBER_OPT_UTF8_STRING
+# define RTASN1TMPL_MEMBER_OPT_UTF8_STRING(a_Name) \
+ RTASN1TMPL_MEMBER_OPT_UTF8_STRING_EX(a_Name, RT_NOTHING)
+#endif
+
+#ifndef RTASN1TMPL_MEMBER_OPT_STRING_EX
+# define RTASN1TMPL_MEMBER_OPT_STRING_EX(a_Name, a_Constraints) \
+ RTASN1TMPL_MEMBER_OPT_EX(a_Name, RTASN1STRING, RTAsn1String, a_Constraints RT_NOTHING)
+#endif
+#ifndef RTASN1TMPL_MEMBER_OPT_STRING
+# define RTASN1TMPL_MEMBER_OPT_STRING(a_Name) \
+ RTASN1TMPL_MEMBER_OPT_STRING_EX(a_Name, RT_NOTHING)
+#endif
+
+/* Pointer choices. */
+#ifndef RTASN1TMPL_PCHOICE_ITAG_UP
+# define RTASN1TMPL_PCHOICE_ITAG_UP(a_uTag, a_enmChoice, a_PtrName, a_Name, a_Type, a_Api) \
+ RTASN1TMPL_PCHOICE_ITAG_EX(a_uTag, a_enmChoice, a_PtrName, a_Name, a_Type, a_Api, RTASN1TMPL_ITAG_F_UP, RT_NOTHING)
+#endif
+#ifndef RTASN1TMPL_PCHOICE_ITAG_CP
+# define RTASN1TMPL_PCHOICE_ITAG_CP(a_uTag, a_enmChoice, a_PtrName, a_Name, a_Type, a_Api) \
+ RTASN1TMPL_PCHOICE_ITAG_EX(a_uTag, a_enmChoice, a_PtrName, a_Name, a_Type, a_Api, RTASN1TMPL_ITAG_F_CP, RT_NOTHING)
+#endif
+#ifndef RTASN1TMPL_PCHOICE_ITAG
+# define RTASN1TMPL_PCHOICE_ITAG(a_uTag, a_enmChoice, a_PtrName, a_Name, a_Type, a_Api) \
+ RTASN1TMPL_PCHOICE_ITAG_EX(a_uTag, a_enmChoice, a_PtrName, a_Name, a_Type, a_Api, RTASN1TMPL_ITAG_F_CC, RT_NOTHING)
+#endif
+
+#ifndef RTASN1TMPL_PCHOICE_XTAG
+# define RTASN1TMPL_PCHOICE_XTAG(a_uTag, a_enmChoice, a_PtrTnNm, a_CtxTagN, a_Name, a_Type, a_Api) \
+ RTASN1TMPL_PCHOICE_XTAG_EX(a_uTag, a_enmChoice, a_PtrTnNm, a_CtxTagN, a_Name, a_Type, a_Api, RT_NOTHING)
+#endif
+
+
+/*
+ * Constraints are only used in the sanity check pass, so provide subs for the
+ * others passes.
+ */
+#ifndef RTASN1TMPL_MEMBER_CONSTR_MIN_MAX
+# define RTASN1TMPL_MEMBER_CONSTR_MIN_MAX(a_Name, a_Type, a_Api, cbMin, cbMax, a_MoreConstraints)
+#endif
+#ifndef RTASN1TMPL_MEMBER_CONSTR_BITSTRING_MIN_MAX
+# define RTASN1TMPL_MEMBER_CONSTR_BITSTRING_MIN_MAX(a_Name, cMinBits, cMaxBits, a_MoreConstraints)
+#endif
+#ifndef RTASN1TMPL_MEMBER_CONSTR_PRESENT
+# define RTASN1TMPL_MEMBER_CONSTR_PRESENT(a_Name, a_Api, a_MoreConstraints)
+#endif
+
+
+/*
+ * Stub exec hacks.
+ */
+#ifndef RTASN1TMPL_EXEC_DECODE
+# define RTASN1TMPL_EXEC_DECODE(a_Expr) /* no semi colon allowed after this */
+#endif
+#ifndef RTASN1TMPL_EXEC_CLONE
+# define RTASN1TMPL_EXEC_CLONE(a_Expr) /* no semi colon allowed after this */
+#endif
+#ifndef RTASN1TMPL_EXEC_CHECK_SANITY
+# define RTASN1TMPL_EXEC_CHECK_SANITY(a_Expr) /* no semi colon allowed after this */
+#endif
+
+#define RTASN1TMPL_SET_SEQ_EXEC_CHECK_SANITY() do { } while (0)
+
+
+/*
+ * Generate the requested code.
+ */
+#ifndef RTASN1TMPL_TEMPLATE_FILE
+# error "No template file (RTASN1TMPL_TEMPLATE_FILE) is specified."
+#endif
+#include RTASN1TMPL_TEMPLATE_FILE
+
+
+
+/*
+ * Undo all the macros.
+ */
+#undef RTASN1TMPL_DECL
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+#undef RTASN1TMPL_PASS
+
+#undef RTASN1TMPL_BEGIN_COMMON
+#undef RTASN1TMPL_END_COMMON
+#undef RTASN1TMPL_BEGIN_SEQCORE
+#undef RTASN1TMPL_BEGIN_SETCORE
+#undef RTASN1TMPL_MEMBER
+#undef RTASN1TMPL_MEMBER_EX
+#undef RTASN1TMPL_MEMBER_DYN_BEGIN
+#undef RTASN1TMPL_MEMBER_DYN
+#undef RTASN1TMPL_MEMBER_DYN_DEFAULT
+#undef RTASN1TMPL_MEMBER_DYN_COMMON
+#undef RTASN1TMPL_MEMBER_DYN_END
+#undef RTASN1TMPL_MEMBER_OPT
+#undef RTASN1TMPL_MEMBER_OPT_EX
+#undef RTASN1TMPL_MEMBER_OPT_ITAG
+#undef RTASN1TMPL_MEMBER_OPT_ITAG_EX
+#undef RTASN1TMPL_MEMBER_OPT_ITAG_CP
+#undef RTASN1TMPL_MEMBER_OPT_ITAG_UC
+#undef RTASN1TMPL_MEMBER_OPT_ITAG_UP
+#undef RTASN1TMPL_MEMBER_OPT_ITAG_BITSTRING
+#undef RTASN1TMPL_MEMBER_OPT_UTF8_STRING
+#undef RTASN1TMPL_MEMBER_OPT_UTF8_STRING_EX
+#undef RTASN1TMPL_MEMBER_OPT_XTAG
+#undef RTASN1TMPL_MEMBER_OPT_XTAG_EX
+#undef RTASN1TMPL_MEMBER_OPT_ANY
+#undef RTASN1TMPL_MEMBER_DEF_ITAG_UP
+#undef RTASN1TMPL_MEMBER_DEF_ITAG_EX
+#undef RTASN1TMPL_END_SEQCORE
+#undef RTASN1TMPL_END_SETCORE
+
+#undef RTASN1TMPL_BEGIN_PCHOICE
+#undef RTASN1TMPL_PCHOICE_ITAG
+#undef RTASN1TMPL_PCHOICE_ITAG_UP
+#undef RTASN1TMPL_PCHOICE_ITAG_CP
+#undef RTASN1TMPL_PCHOICE_ITAG_EX
+#undef RTASN1TMPL_PCHOICE_XTAG
+#undef RTASN1TMPL_PCHOICE_XTAG_EX
+#undef RTASN1TMPL_END_PCHOICE
+
+#undef RTASN1TMPL_SET_SEQ_OF_COMMON
+#undef RTASN1TMPL_SEQ_OF
+#undef RTASN1TMPL_SET_OF
+
+#undef RTASN1TMPL_VTABLE_FN_ENCODE_PREP
+#undef RTASN1TMPL_VTABLE_FN_ENCODE_WRITE
+
+#undef RTASN1TMPL_MEMBER_CONSTR_MIN_MAX
+#undef RTASN1TMPL_MEMBER_CONSTR_BITSTRING_MIN_MAX
+#undef RTASN1TMPL_MEMBER_CONSTR_PRESENT
+
+#undef RTASN1TMPL_SANITY_CHECK_EXPR
+
+#undef RTASN1TMPL_EXEC_DECODE
+#undef RTASN1TMPL_EXEC_CLONE
+#undef RTASN1TMPL_EXEC_CHECK_SANITY
+
+#undef RTASN1TMPL_SET_SEQ_EXEC_CHECK_SANITY
+
diff --git a/include/iprt/asn1-generator-sanity.h b/include/iprt/asn1-generator-sanity.h
new file mode 100644
index 00000000000..d44c21ba832
--- /dev/null
+++ b/include/iprt/asn1-generator-sanity.h
@@ -0,0 +1,29 @@
+/** @file
+ * IPRT - ASN.1 Code Generator, the Sanity Checking.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+#define RTASN1TMPL_PASS RTASN1TMPL_PASS_CHECK_SANITY
+#include <iprt/asn1-generator-pass.h>
+
+
diff --git a/include/iprt/asn1.h b/include/iprt/asn1.h
new file mode 100644
index 00000000000..6b3bdd2f039
--- /dev/null
+++ b/include/iprt/asn1.h
@@ -0,0 +1,2049 @@
+/** @file
+ * IPRT - Abstract Syntax Notation One (ASN.1).
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+#ifndef ___iprt_asn1_h
+#define ___iprt_asn1_h
+
+#if defined(DEBUG_bird) && !defined(IN_SUP_HARDENED_R3) && defined(IN_RING3) /* TEMPORARY! */
+# define RTMEM_WRAP_TO_EF_APIS /* TEMPORARY! */
+# include <iprt/mem.h> /* TEMPORARY! */
+#endif /* TEMPORARY! */
+
+#include <iprt/time.h>
+#include <iprt/stdarg.h>
+#include <iprt/err.h>
+#include <iprt/formats/asn1.h>
+
+
+RT_C_DECLS_BEGIN
+
+/** @defgroup grp_rt_asn1 RTAsn1 - Abstract Syntax Notation One
+ * @ingroup grp_rt
+ * @{
+ */
+
+
+/** Pointer to ASN.1 allocation information. */
+typedef struct RTASN1ALLOCATION *PRTASN1ALLOCATION;
+/** Pointer to a ASN.1 byte decoder cursor. */
+typedef struct RTASN1CURSOR *PRTASN1CURSOR;
+
+
+/**
+ * Sketch of a custom ASN.1 allocator virtual method table.
+ *
+ * Any information required by the allocator should be associated with this
+ * structure, i.e. use this as a kind of parent class. This saves storage in
+ * RTASN1ALLOCATORINFO and possibly reduces the number of parameters by one.
+ */
+typedef struct RTASN1ALLOCATORVTABLE
+{
+ /**
+ * Free a chunk of memory allocated by this allocator.
+ *
+ * @returns IPRT status code.
+ * @param pThis Pointer to the vtable structure.
+ * @param pAllocation Pointer to the allocation info structure.
+ * @param pv Pointer to the memory that shall be freed. Not NULL.
+ */
+ DECLCALLBACKMEMBER(void, pfnFree)(struct RTASN1ALLOCATORVTABLE const *pThis, PRTASN1ALLOCATION pAllocation,
+ void *pv);
+ /**
+ * Allocates a chunk of memory, all initialized to zero.
+ *
+ * @returns IPRT status code.
+ * @param pThis Pointer to the vtable structure.
+ * @param pAllocation Pointer to the allocation info structure.
+ * @param ppv Where to store the pointer on success.
+ * @param cb The minimum number of bytes to allocate. The actual
+ * number of bytes allocated shall be stored in
+ * pInfo->cbAllocated on success.
+ */
+ DECLCALLBACKMEMBER(int, pfnAlloc)(struct RTASN1ALLOCATORVTABLE const *pThis, PRTASN1ALLOCATION pAllocation,
+ void **ppv, size_t cb);
+ /**
+ * Reallocates a memory allocation.
+ *
+ * New memory does not need to be initialized, the caller takes care of that.
+ *
+ * This will not need to deal with free (@a cbNew == 0) or the initial
+ * allocation (@a pvOld == NULL), those calls will be directed to pfnFree and
+ * pfnAlloc respectively.
+ *
+ * @returns IPRT status code.
+ * @param pThis Pointer to the vtable structure.
+ * @param pAllocation Pointer to the allocation info structure.
+ * @param pvOld Pointer to the current allocation. Shall remain
+ * valid on failure, but may be invalid on success.
+ * @param ppvNew Where to store the pointer on success. Shall not be
+ * touched, except on successful returns.
+ * @param cbNew The new minimum allocation size. The actual number
+ * of bytes allocated shall be stored in
+ * pInfo->cbAllocated on success.
+ */
+ DECLCALLBACKMEMBER(int, pfnRealloc)(struct RTASN1ALLOCATORVTABLE const *pThis, PRTASN1ALLOCATION pAllocation,
+ void *pvOld, void **ppvNew, size_t cbNew);
+} RTASN1ALLOCATORVTABLE;
+/** Pointer to an ASN.1 allocator vtable. */
+typedef RTASN1ALLOCATORVTABLE *PRTASN1ALLOCATORVTABLE;
+/** Pointer to a const ASN.1 allocator vtable. */
+typedef RTASN1ALLOCATORVTABLE const *PCRTASN1ALLOCATORVTABLE;
+
+/** The default ASN.1 allocator. */
+extern RTDATADECL(RTASN1ALLOCATORVTABLE const) g_RTAsn1DefaultAllocator;
+
+
+/**
+ * Allocation information.
+ */
+typedef struct RTASN1ALLOCATION
+{
+ /** The number of bytes currently allocated. */
+ uint32_t cbAllocated;
+ /** Number of realloc calls. */
+ uint16_t cReallocs;
+ /** Reserved / padding. */
+ uint16_t uReserved0;
+ /** Allocator vtable, NULL for the default allocator. */
+ PCRTASN1ALLOCATORVTABLE pAllocator;
+} RTASN1ALLOCATION;
+
+
+/**
+ * Grow an array by zero initialized memory.
+ *
+ * @returns IPRT status code.
+ * @param pAllocation The allocation record (initialized by
+ * RTAsn1CursorInitAllocation or similar).
+ * @param ppvArray Pointer to the variable pointing to the array. This is
+ * both input and output. Remains valid on failure.
+ * @param cbEntry The size of an array entry.
+ * @param cCurrent The current entry count. (Relevant for zero
+ * initialization of the new entries.)
+ * @param cNew The new entry count.
+ */
+RTDECL(int) RTAsn1MemGrowArray(PRTASN1ALLOCATION pAllocation, void **ppvArray, size_t cbEntry,
+ uint32_t cCurrent, uint32_t cNew);
+
+/**
+ * Allocate a block of zero initialized memory.
+ *
+ * @returns IPRT status code.
+ * @param pAllocation The allocation record (initialized by
+ * RTAsn1CursorInitAllocation or similar).
+ * @param ppvMem Where to return the pointer to the block.
+ * @param cbMem The minimum number of bytes to allocate.
+ */
+RTDECL(int) RTAsn1MemAllocZ(PRTASN1ALLOCATION pAllocation, void **ppvMem, size_t cbMem);
+
+/**
+ * Allocates a block of memory initialized to the content of @a pvSrc.
+ *
+ * @returns IPRT status code.
+ * @param pAllocation The allocation record (initialized by
+ * RTAsn1CursorInitAllocation or similar).
+ * @param ppvMem Where to return the pointer to the block.
+ * @param pvSrc The source memory.
+ * @param cbMem The minimum number of bytes to allocate.
+ */
+RTDECL(int) RTAsn1MemDup(PRTASN1ALLOCATION pAllocation, void **ppvMem, void const *pvSrc, size_t cbMem);
+
+/**
+ * Free a memory block.
+ *
+ * @param pAllocation The allocation record (initialized by
+ * RTAsn1CursorInitAllocation or similar).
+ * @param pv The memory block to free. NULL will be ignored.
+ */
+RTDECL(void) RTAsn1MemFree(PRTASN1ALLOCATION pAllocation, void *pv);
+
+/**
+ * Initalize an allocation.
+ *
+ * @param pAllocation The allocation record (initialized by
+ * RTAsn1CursorInitAllocation or similar).
+ * @param pAllocator The allocator
+ */
+RTDECL(PRTASN1ALLOCATION) RTAsn1MemInitAllocation(PRTASN1ALLOCATION pAllocation, PCRTASN1ALLOCATORVTABLE pAllocator);
+
+RTDECL(int) RTAsn1ContentAllocZ(struct RTASN1CORE *pAsn1Core, size_t cb, PCRTASN1ALLOCATORVTABLE pAllocator);
+RTDECL(int) RTAsn1ContentDup(struct RTASN1CORE *pAsn1Core, void const *pvSrc, size_t cbSrc, PCRTASN1ALLOCATORVTABLE pAllocator);
+RTDECL(int) RTAsn1ContentReallocZ(struct RTASN1CORE *pAsn1Core, size_t cb, PCRTASN1ALLOCATORVTABLE pAllocator);
+RTDECL(void) RTAsn1ContentFree(struct RTASN1CORE *pAsn1Core);
+
+
+
+/** Pointer to a core ASN.1 encoding info structure. */
+typedef struct RTASN1CORE *PRTASN1CORE;
+/** Pointer to a const core ASN.1 encoding info structure. */
+typedef struct RTASN1CORE const *PCRTASN1CORE;
+
+
+/**
+ * ASN.1 object enumeration callback.
+ *
+ * @returns IPRT status code. VINF_SUCCESS continues the enumberation, all
+ * others quit it and is returned to the caller's caller.
+ * @param pAsn1Core The ASN.1 object we're called back about.
+ * @param pszName The member name. Array member names ends with
+ * '[#]'.
+ * @param uDepth The current depth.
+ * @param pvUser Callback user parameter.
+ */
+typedef DECLCALLBACK(int) FNRTASN1ENUMCALLBACK(struct RTASN1CORE *pAsn1Core, const char *pszName, uint32_t uDepth, void *pvUser);
+/** Pointer to an ASN.1 object enumeration callback. */
+typedef FNRTASN1ENUMCALLBACK *PFNRTASN1ENUMCALLBACK;
+
+/**
+ * ASN.1 object encoding writer callback.
+ *
+ * @returns IPRT status code.
+ * @param pbBuf Pointer to the bytes to output.
+ * @param cbToWrite The number of bytes to write.
+ * @param pvUser Callback user parameter.
+ * @param pErrInfo Where to store extended error info. Optional.
+ */
+typedef DECLCALLBACK(int) FNRTASN1ENCODEWRITER(const void *pvBuf, size_t cbToWrite, void *pvUser, PRTERRINFO pErrInfo);
+/** Pointer to an ASN.1 encoding writer callback. */
+typedef FNRTASN1ENCODEWRITER *PFNRTASN1ENCODEWRITER;
+
+/** @name ASN.1 Vtable Method Types
+ * @{ */
+
+/**
+ * Destructor.
+ *
+ * RTAsn1Destroy will first destroy all children by recursive calls to pfnEnum,
+ * afterwards it will call this method to release any memory or other resources
+ * associated with this object. The memory backing the object structure shall
+ * not be freed by this method.
+ *
+ * @param pThisCore Pointer to the ASN.1 core to destroy.
+ */
+typedef DECLCALLBACK(void) FNRTASN1COREVTDTOR(PRTASN1CORE pThisCore);
+/** Pointer to a FNRTASN1COREVTDTOR method. */
+typedef FNRTASN1COREVTDTOR *PFNRTASN1COREVTDTOR;
+
+/**
+ * Enumerate members (not necessary for primitive objects).
+ *
+ * @returns IPRT status code, any non VINF_SUCCESS value stems from pfnCallback.
+ * @param pThisCore Pointer to the ASN.1 core to enumerate members of.
+ * @param pfnCallback The callback.
+ * @param uDepth The depth of this object. Children are at +1.
+ * @param pvUser Callback user argument.
+ */
+typedef DECLCALLBACK(int) FNRTASN1COREVTENUM(PRTASN1CORE pThisCore, PFNRTASN1ENUMCALLBACK pfnCallback,
+ uint32_t uDepth, void *pvUser);
+/** Pointer to a FNRTASN1COREVTENUM method. */
+typedef FNRTASN1COREVTENUM *PFNRTASN1COREVTENUM;
+
+/**
+ * Clone method.
+ *
+ * @param pThisCore Pointer to the ASN.1 core to initialize as a clone
+ * of pSrcClone. (The caller is responsible for making
+ * sure there is sufficent space and such.)
+ * @param pSrcCore The object to clone.
+ * @param pAllocator The allocator to use.
+ */
+typedef DECLCALLBACK(int) FNRTASN1COREVTCLONE(PRTASN1CORE pThisCore, PCRTASN1CORE pSrcCore, PCRTASN1ALLOCATORVTABLE pAllocator);
+/** Pointer to a FNRTASN1COREVTCLONE method. */
+typedef FNRTASN1COREVTCLONE *PFNRTASN1COREVTCLONE;
+
+/**
+ * Compare method.
+ *
+ * The caller makes sure both cores are present and have the same Vtable.
+ *
+ * @returns 0 if equal, -1 if @a pLeft is smaller, 1 if @a pLeft is larger.
+ * @param pLeftCore Pointer to the ASN.1 core of the left side object.
+ * @param pRightCore Pointer to the ASN.1 core of the right side object.
+ */
+typedef DECLCALLBACK(int) FNRTASN1COREVTCOMPARE(PCRTASN1CORE pLeftCore, PCRTASN1CORE pRightCore);
+/** Pointer to a FNRTASN1COREVTCOMPARE method. */
+typedef FNRTASN1COREVTCOMPARE *PFNRTASN1COREVTCOMPARE;
+
+/**
+ * Check sanity method.
+ *
+ * @returns IPRT status code.
+ * @param pThisCore Pointer to the ASN.1 core of the object to check out.
+ * @param fFlags See RTASN1_CHECK_SANITY_F_XXX.
+ * @param pszErrInfo Where to return additional error details. Optional.
+ * @param pszErrorTag Tag for the additional error details.
+ */
+typedef DECLCALLBACK(int) FNRTASN1COREVTCHECKSANITY(PCRTASN1CORE pThisCore, uint32_t fFlags,
+ PRTERRINFO pErrInfo, const char *pszErrorTag);
+/** Pointer to a FNRTASN1COREVTCHECKSANITY method. */
+typedef FNRTASN1COREVTCHECKSANITY *PFNRTASN1COREVTCHECKSANITY;
+
+/**
+ * Optional encoding preparations.
+ *
+ * On successful return, the pThisCore->cb value shall be valid and up to date.
+ * Will be called for any present object, including ones with default values and
+ * similar.
+ *
+ * @returns IPRT status code
+ * @param pThisCore Pointer to the ASN.1 core to enumerate members of.
+ * @param fFlags Encoding flags, RTASN1ENCODE_F_XXX.
+ * @param pErrInfo Where to return extra error information. Optional.
+ */
+typedef DECLCALLBACK(int) FNRTASN1COREVTENCODEPREP(PRTASN1CORE pThisCore, uint32_t fFlags, PRTERRINFO pErrInfo);
+/** Pointer to a FNRTASN1COREVTENCODEWRITE method. */
+typedef FNRTASN1COREVTENCODEPREP *PFNRTASN1COREVTENCODEPREP;
+
+/**
+ * Optional encoder writer.
+ *
+ * This writes the header as well as all the content. Will be called for any
+ * present object, including ones with default values and similar.
+ *
+ * @returns IPRT status code.
+ * @param pThisCore Pointer to the ASN.1 core to enumerate members of.
+ * @param fFlags Encoding flags, RTASN1ENCODE_F_XXX.
+ * @param pfnWriter The output writer function.
+ * @param pvUser The user context for the writer function.
+ * @param pErrInfo Where to return extra error information. Optional.
+ */
+typedef DECLCALLBACK(int) FNRTASN1COREVTENCODEWRITE(PRTASN1CORE pThisCore, uint32_t fFlags, PFNRTASN1ENCODEWRITER pfnWriter,
+ void *pvUser, PRTERRINFO pErrInfo);
+/** Pointer to a FNRTASN1COREVTENCODEWRITE method. */
+typedef FNRTASN1COREVTENCODEWRITE *PFNRTASN1COREVTENCODEWRITE;
+/** @} */
+
+/** Mask of common flags. These will be propagated during sanity checking.
+ * Bits not in this mask are type specfic. */
+#define RTASN1_CHECK_SANITY_F_COMMON_MASK UINT32_C(0xffff0000)
+
+/**
+ * ASN.1 core vtable.
+ */
+typedef struct RTASN1COREVTABLE
+{
+ /** The name. */
+ const char *pszName;
+ /** Size of the structure. */
+ uint32_t cbStruct;
+ /** The default tag, UINT8_MAX if not applicable. */
+ uint8_t uDefaultTag;
+ /** The default class and flags. */
+ uint8_t fDefaultClass;
+ /** Reserved for later / alignment. */
+ uint16_t uReserved;
+ /** @copydoc FNRTASN1COREVTDTOR */
+ PFNRTASN1COREVTDTOR pfnDtor;
+ /** @copydoc FNRTASN1COREVTENUM */
+ PFNRTASN1COREVTENUM pfnEnum;
+ /** @copydoc FNRTASN1COREVTCLONE */
+ PFNRTASN1COREVTCLONE pfnClone;
+ /** @copydoc FNRTASN1COREVTCOMPARE */
+ PFNRTASN1COREVTCOMPARE pfnCompare;
+ /** @copydoc FNRTASN1COREVTCHECKSANITY */
+ PFNRTASN1COREVTCHECKSANITY pfnCheckSanity;
+ /** @copydoc FNRTASN1COREVTENCODEPREP */
+ PFNRTASN1COREVTENCODEPREP pfnEncodePrep;
+ /** @copydoc FNRTASN1COREVTENUM */
+ PFNRTASN1COREVTENCODEWRITE pfnEncodeWrite;
+} RTASN1COREVTABLE;
+/** Pointer to an ASN.1 allocator vtable. */
+typedef struct RTASN1COREVTABLE *PRTASN1COREVTABLE;
+/** Pointer to a const ASN.1 allocator vtable. */
+typedef RTASN1COREVTABLE const *PCRTASN1COREVTABLE;
+
+
+/** @name Helper macros for prototyping standard functions for an ASN.1 type.
+ * @{ */
+#define RTASN1TYPE_STANDARD_PROTOTYPES_NO_GET_CORE(a_TypeNm, a_DeclMacro, a_ImplExtNm) \
+ a_DeclMacro(int) RT_CONCAT(a_ImplExtNm,_Init)(RT_CONCAT(P,a_TypeNm) pThis, PCRTASN1ALLOCATORVTABLE pAllocator); \
+ a_DeclMacro(int) RT_CONCAT(a_ImplExtNm,_Clone)(RT_CONCAT(P,a_TypeNm) pThis, RT_CONCAT(PC,a_TypeNm) pSrc, \
+ PCRTASN1ALLOCATORVTABLE pAllocator); \
+ a_DeclMacro(void) RT_CONCAT(a_ImplExtNm,_Delete)(RT_CONCAT(P,a_TypeNm) pThis); \
+ a_DeclMacro(int) RT_CONCAT(a_ImplExtNm,_Enum)(RT_CONCAT(P,a_TypeNm) pThis, PFNRTASN1ENUMCALLBACK pfnCallback, \
+ uint32_t uDepth, void *pvUser); \
+ a_DeclMacro(int) RT_CONCAT(a_ImplExtNm,_Compare)(RT_CONCAT(PC,a_TypeNm) pLeft, RT_CONCAT(PC,a_TypeNm) pRight); \
+ a_DeclMacro(int) RT_CONCAT(a_ImplExtNm,_DecodeAsn1)(PRTASN1CURSOR pCursor, uint32_t fFlags, RT_CONCAT(P,a_TypeNm) pThis,\
+ const char *pszErrorTag); \
+ a_DeclMacro(int) RT_CONCAT(a_ImplExtNm,_CheckSanity)(RT_CONCAT(PC,a_TypeNm) pThis, uint32_t fFlags, \
+ PRTERRINFO pErrInfo, const char *pszErrorTag)
+
+
+/** @name Helper macros for prototyping standard functions for an ASN.1 type.
+ * @{ */
+#define RTASN1TYPE_STANDARD_PROTOTYPES(a_TypeNm, a_DeclMacro, a_ImplExtNm, a_Asn1CoreNm) \
+ DECL_FORCE_INLINE(PRTASN1CORE) RT_CONCAT(a_ImplExtNm,_GetAsn1Core)(RT_CONCAT(PC,a_TypeNm) pThis) \
+ { return (PRTASN1CORE)&pThis->a_Asn1CoreNm; } \
+ DECLINLINE(bool) RT_CONCAT(a_ImplExtNm,_IsPresent)(RT_CONCAT(PC,a_TypeNm) pThis) \
+ { return pThis && RTASN1CORE_IS_PRESENT(&pThis->a_Asn1CoreNm); } \
+ RTASN1TYPE_STANDARD_PROTOTYPES_NO_GET_CORE(a_TypeNm, a_DeclMacro, a_ImplExtNm)
+
+
+/** Aliases two ASN.1 types. */
+#define RTASN1TYPE_ALIAS(a_TypeNm, a_AliasType, a_ImplExtNm, a_AliasExtNm) \
+ typedef a_AliasType a_TypeNm; \
+ typedef a_TypeNm *RT_CONCAT(P,a_TypeNm); \
+ \
+ DECLINLINE(PRTASN1CORE) RT_CONCAT(a_ImplExtNm,_GetAsn1Core)(a_TypeNm const *pThis) \
+ { return RT_CONCAT(a_AliasExtNm,_GetAsn1Core)(pThis); } \
+ DECLINLINE(bool) RT_CONCAT(a_ImplExtNm,_IsPresent)(a_TypeNm const *pThis) \
+ { return RT_CONCAT(a_AliasExtNm,_IsPresent)(pThis); } \
+ \
+ DECLINLINE(int) RT_CONCAT(a_ImplExtNm,_Init)(RT_CONCAT(P,a_TypeNm) pThis, PCRTASN1ALLOCATORVTABLE pAllocator) \
+ { return RT_CONCAT(a_AliasExtNm,_Init)(pThis, pAllocator); } \
+ DECLINLINE(int) RT_CONCAT(a_ImplExtNm,_Clone)(RT_CONCAT(P,a_TypeNm) pThis, a_TypeNm const *pSrc, \
+ PCRTASN1ALLOCATORVTABLE pAllocator) \
+ { return RT_CONCAT(a_AliasExtNm,_Clone)(pThis, pSrc, pAllocator); } \
+ DECLINLINE(void) RT_CONCAT(a_ImplExtNm,_Delete)(RT_CONCAT(P,a_TypeNm) pThis) \
+ { RT_CONCAT(a_AliasExtNm,_Delete)(pThis); } \
+ DECLINLINE(int) RT_CONCAT(a_ImplExtNm,_Enum)(a_TypeNm *pThis, PFNRTASN1ENUMCALLBACK pfnCallback, \
+ uint32_t uDepth, void *pvUser) \
+ { return RT_CONCAT(a_AliasExtNm,_Enum)(pThis, pfnCallback, uDepth, pvUser); } \
+ DECLINLINE(int) RT_CONCAT(a_ImplExtNm,_Compare)(a_TypeNm const *pLeft, a_TypeNm const *pRight) \
+ { return RT_CONCAT(a_AliasExtNm,_Compare)(pLeft, pRight); } \
+ DECLINLINE(int) RT_CONCAT(a_ImplExtNm,_DecodeAsn1)(PRTASN1CURSOR pCursor, uint32_t fFlags, RT_CONCAT(P,a_TypeNm) pThis,\
+ const char *pszErrorTag) \
+ { return RT_CONCAT(a_AliasExtNm,_DecodeAsn1)(pCursor, fFlags, pThis, pszErrorTag); } \
+ DECLINLINE(int) RT_CONCAT(a_ImplExtNm,_CheckSanity)(a_TypeNm const *pThis, uint32_t fFlags, \
+ PRTERRINFO pErrInfo, const char *pszErrorTag) \
+ { return RT_CONCAT(a_AliasExtNm,_CheckSanity)(pThis, fFlags, pErrInfo, pszErrorTag); } \
+ \
+ typedef a_TypeNm const *RT_CONCAT(PC,a_TypeNm)
+
+/** @} */
+
+
+/**
+ * Core ASN.1 structure for storing encoding details and data location.
+ *
+ * This is used as a 'parent' for all other decoded ASN.1 based structures.
+ */
+typedef struct RTASN1CORE
+{
+ /** The tag.
+ * @remarks 32-bit should be enough for everyone... We don't currently
+ * implement decoding tags larger than 30 anyway. :-) */
+ uint32_t uTag;
+ /** Tag class and flags (ASN1_TAGCLASS_XXX and ASN1_TAGFLAG_XXX). */
+ uint8_t fClass;
+ /** The real tag value for IMPLICT tag overrides. */
+ uint8_t uRealTag;
+ /** The real class value for IMPLICT tag overrides. */
+ uint8_t fRealClass;
+ /** The size of the tag and length ASN.1 header. */
+ uint8_t cbHdr;
+ /** Length. */
+ uint32_t cb;
+ /** IPRT flags (RTASN1CORE_F_XXX). */
+ uint32_t fFlags;
+ /** Pointer to the data.
+ * After decoding this generally points to the encoded data content. When
+ * preparting something for encoding or otherwise constructing things in memory,
+ * this generally points heap memory or read-only constants.
+ * @sa RTAsn1ContentAllocZ, RTAsn1ContentReallocZ, RTAsn1ContentDup,
+ * RTAsn1ContentFree. */
+ RTCPTRUNION uData;
+ /** Pointer to the virtual method table for this object. Optional. */
+ PCRTASN1COREVTABLE pOps;
+} RTASN1CORE;
+/** The Vtable for a RTASN1CORE structure when not in some way use used as a
+ * parent type/class. */
+extern RTDATADECL(RTASN1COREVTABLE const) g_RTAsn1Core_Vtable;
+
+RTASN1TYPE_STANDARD_PROTOTYPES_NO_GET_CORE(RTASN1CORE, RTDECL, RTAsn1Core);
+
+/** @name RTASN1CORE_F_XXX - Flags for RTASN1CORE::fFlags
+ * @{ */
+/** Present/valid. */
+#define RTASN1CORE_F_PRESENT RT_BIT_32(0)
+/** Not present in stream, using default value. */
+#define RTASN1CORE_F_DEFAULT RT_BIT_32(1)
+/** The tag was overriden by an implict context tag or some such thing,
+ * RTASN1CORE::uImplicitTag hold the universal tag value if one exists. */
+#define RTASN1CORE_F_TAG_IMPLICIT RT_BIT_32(2)
+/** Primitive tag with the corresponding RTASN1XXX struct. */
+#define RTASN1CORE_F_PRIMITE_TAG_STRUCT RT_BIT_32(3)
+/** Dummy node typically used with choices, has children, not encoded, must be
+ * ignored. */
+#define RTASN1CORE_F_DUMMY RT_BIT_32(4)
+/** Allocated content (pointed to by uData).
+ * The content should is still be considered 104% read-only by anyone other
+ * than then type methods (pOps and associates). */
+#define RTASN1CORE_F_ALLOCATED_CONTENT RT_BIT_32(5)
+/** Decoded content (pointed to by uData).
+ * Mutually exclusive with RTASN1CORE_F_ALLOCATED_CONTENT. If neither is
+ * set, uData might be NULL or point to some shared static memory for
+ * frequently used values. */
+#define RTASN1CORE_F_DECODED_CONTENT RT_BIT_32(6)
+/** @} */
+
+
+/** Check s whether an ASN.1 core object present in some way (default data,
+ * decoded data, ...). */
+#define RTASN1CORE_IS_PRESENT(a_pAsn1Core) ( RT_BOOL((a_pAsn1Core)->fFlags) )
+
+/** Check s whether an ASN.1 core object is a dummy object (and is present). */
+#define RTASN1CORE_IS_DUMMY(a_pAsn1Core) ( RT_BOOL((a_pAsn1Core)->fFlags & RTASN1CORE_F_DUMMY) )
+
+/**
+ * Calculates pointer to the raw ASN.1 record.
+ *
+ * ASSUMES that it's decoded content and that cbHdr and uData are both valid.
+ *
+ * @returns Byte pointer to the first tag byte.
+ * @param a_pAsn1Core The ASN.1 core.
+ */
+#define RTASN1CORE_GET_RAW_ASN1_PTR(a_pAsn1Core) ( (a_pAsn1Core)->uData.pu8 - (a_pAsn1Core)->cbHdr )
+
+/**
+ * Calculates the length of the raw ASN.1 record to go with the
+ * RTASN1CORE_GET_RAW_ASN1_PTR() result.
+ *
+ * ASSUMES that it's decoded content and that cbHdr and uData are both valid.
+ *
+ * @returns Size in bytes (uint32_t).
+ * @param a_pAsn1Core The ASN.1 core.
+ */
+#define RTASN1CORE_GET_RAW_ASN1_SIZE(a_pAsn1Core) ( (a_pAsn1Core)->cbHdr + (a_pAsn1Core)->cb )
+
+/**
+ * Retrievs the tag or implicit tag depending on the RTASN1CORE_F_TAG_IMPLICIT
+ * flag.
+ *
+ * @returns The ASN.1 tag of the object.
+ * @param a_pAsn1Core The ASN.1 core.
+ */
+#define RTASN1CORE_GET_TAG(a_pAsn1Core) ( !((a_pAsn1Core)->fFlags & RTASN1CORE_F_TAG_IMPLICIT) ? (a_pAsn1Core)->uTag : (a_pAsn1Core)->uRealTag )
+
+
+DECL_FORCE_INLINE(PRTASN1CORE) RTAsn1Core_GetAsn1Core(PCRTASN1CORE pThis)
+{
+ return (PRTASN1CORE)pThis;
+}
+
+
+DECL_FORCE_INLINE(bool) RTAsn1Core_IsPresent(PCRTASN1CORE pThis)
+{
+ return pThis && RTASN1CORE_IS_PRESENT(pThis);
+}
+
+
+RTDECL(int) RTAsn1Core_InitEx(PRTASN1CORE pAsn1Core, uint32_t uTag, uint8_t fClass, PCRTASN1COREVTABLE pOps, uint32_t fFlags);
+/**
+ * Initialize the ASN.1 core object representation to a default value.
+ *
+ * @returns VINF_SUCCESS
+ * @param pAsn1Core The ASN.1 core.
+ * @param uTag The tag number.
+ * @param fClass The tag class and flags.
+ */
+RTDECL(int) RTAsn1Core_InitDefault(PRTASN1CORE pAsn1Core, uint32_t uTag, uint8_t fClass);
+RTDECL(int) RTAsn1Core_CloneContent(PRTASN1CORE pThis, PCRTASN1CORE pSrc, PCRTASN1ALLOCATORVTABLE pAllocator);
+RTDECL(int) RTAsn1Core_CloneNoContent(PRTASN1CORE pThis, PCRTASN1CORE pSrc);
+RTDECL(int) RTAsn1Core_SetTagAndFlags(PRTASN1CORE pAsn1Core, uint32_t uTag, uint8_t fClass);
+RTDECL(int) RTAsn1Core_ChangeTag(PRTASN1CORE pAsn1Core, uint32_t uTag);
+RTDECL(void) RTAsn1Core_ResetImplict(PRTASN1CORE pThis);
+RTDECL(int) RTAsn1Core_CompareEx(PCRTASN1CORE pLeft, PCRTASN1CORE pRight, bool fIgnoreTagAndClass);
+
+
+/**
+ * Dummy ASN.1 object for use in choices and similar non-sequence structures.
+ *
+ * This allows hooking up destructors, enumerators and such, as well as not
+ * needing custom code for sequence-of / set-of collections.
+ */
+typedef struct RTASN1DUMMY
+{
+ /** Core ASN.1. */
+ RTASN1CORE Asn1Core;
+} RTASN1DUMMY;
+/** Pointer to a dummy record. */
+typedef RTASN1DUMMY *PRTASN1DUMMY;
+
+
+/**
+ * Initalizes a dummy ASN.1 object.
+ *
+ * @returns VINF_SUCCESS.
+ * @param pThis The dummy object.
+ */
+RTDECL(int) RTAsn1Dummy_InitEx(PRTASN1DUMMY pThis);
+
+/**
+ * Standard compliant initalizer.
+ *
+ * @returns VINF_SUCCESS.
+ * @param pThis The dummy object.
+ * @param pAllocator Ignored.
+ */
+DECLINLINE(int) RTAsn1Dummy_Init(PRTASN1DUMMY pThis, PCRTASN1ALLOCATORVTABLE pAllocator)
+{
+ return RTAsn1Dummy_InitEx(pThis);
+}
+
+
+/**
+ * ASN.1 sequence core (IPRT representation).
+ */
+typedef struct RTASN1SEQUENCECORE
+{
+ /** Core ASN.1 encoding details. */
+ RTASN1CORE Asn1Core;
+} RTASN1SEQUENCECORE;
+/** Pointer to an ASN.1 sequence core (IPRT representation). */
+typedef RTASN1SEQUENCECORE *PRTASN1SEQUENCECORE;
+/** Pointer to a const ASN.1 sequence core (IPRT representation). */
+typedef RTASN1SEQUENCECORE const *PCRTASN1SEQUENCECORE;
+
+RTDECL(int) RTAsn1SequenceCore_Init(PRTASN1SEQUENCECORE pSeqCore, PCRTASN1COREVTABLE pVtable);
+RTDECL(int) RTAsn1SequenceCore_Clone(PRTASN1SEQUENCECORE pSeqCore, PCRTASN1COREVTABLE pVtable, PCRTASN1SEQUENCECORE pSrc);
+
+/**
+ * ASN.1 sequence-of core (IPRT representation).
+ */
+#if 0
+typedef struct RTASN1SEQOFCORE
+{
+ /** Core ASN.1 encoding details. */
+ RTASN1CORE Asn1Core;
+} RTASN1SEQUENCECORE;
+/** Pointer to an ASN.1 sequence-of core (IPRT representation). */
+typedef RTASN1SEQUENCECORE *PRTASN1SEQUENCECORE;
+/** Pointer to a const ASN.1 sequence-of core (IPRT representation). */
+typedef RTASN1SEQUENCECORE const *PCRTASN1SEQUENCECORE;
+#else
+# define RTASN1SEQOFCORE RTASN1SEQUENCECORE
+# define PRTASN1SEQOFCORE PRTASN1SEQUENCECORE
+# define PCRTASN1SEQOFCORE PCRTASN1SEQUENCECORE
+#endif
+RTDECL(int) RTAsn1SeqOfCore_Init(PRTASN1SEQOFCORE pThis, PCRTASN1COREVTABLE pVtable);
+RTDECL(int) RTAsn1SeqOfCore_Clone(PRTASN1SEQOFCORE pThis, PCRTASN1COREVTABLE pVtable, PCRTASN1SEQOFCORE pSrc);
+
+
+/** Defines the typedefs and prototypes for a generic sequence-of type. */
+#define RTASN1_IMPL_GEN_SEQ_OF_TYPEDEFS_AND_PROTOS(a_SeqOfType, a_ItemType, a_DeclMacro, a_ImplExtNm) \
+ typedef struct a_SeqOfType \
+ { \
+ /** Sequence core. */ \
+ RTASN1SEQUENCECORE SeqCore; \
+ /** The array allocation tracker. */ \
+ RTASN1ALLOCATION Allocation; \
+ /** Items in the array. */ \
+ uint32_t cItems; \
+ /** Array. */ \
+ RT_CONCAT(P,a_ItemType) paItems; \
+ } a_SeqOfType; \
+ typedef a_SeqOfType *RT_CONCAT(P,a_SeqOfType); \
+ typedef a_SeqOfType const *RT_CONCAT(PC,a_SeqOfType); \
+ RTASN1TYPE_STANDARD_PROTOTYPES(a_SeqOfType, a_DeclMacro, a_ImplExtNm, SeqCore.Asn1Core)
+
+
+/**
+ * ASN.1 set core (IPRT representation).
+ */
+typedef struct RTASN1SETCORE
+{
+ /** Core ASN.1 encoding details. */
+ RTASN1CORE Asn1Core;
+} RTASN1SETCORE;
+/** Pointer to an ASN.1 set core (IPRT representation). */
+typedef RTASN1SETCORE *PRTASN1SETCORE;
+/** Pointer to a const ASN.1 set core (IPRT representation). */
+typedef RTASN1SETCORE const *PCRTASN1SETCORE;
+
+RTDECL(int) RTAsn1SetCore_Init(PRTASN1SETCORE pThis, PCRTASN1COREVTABLE pVtable);
+RTDECL(int) RTAsn1SetCore_Clone(PRTASN1SETCORE pThis, PCRTASN1COREVTABLE pVtable, PCRTASN1SETCORE pSrc);
+
+/**
+ * ASN.1 set-of core (IPRT representation).
+ */
+#if 0
+typedef struct RTASN1SETOFCORE
+{
+ /** Core ASN.1 encoding details. */
+ RTASN1CORE Asn1Core;
+} RTASN1SETUENCECORE;
+/** Pointer to an ASN.1 set-of core (IPRT representation). */
+typedef RTASN1SETUENCECORE *PRTASN1SETUENCECORE;
+/** Pointer to a const ASN.1 set-of core (IPRT representation). */
+typedef RTASN1SETUENCECORE const *PCRTASN1SETUENCECORE;
+#else
+# define RTASN1SETOFCORE RTASN1SETCORE
+# define PRTASN1SETOFCORE PRTASN1SETCORE
+# define PCRTASN1SETOFCORE PCRTASN1SETCORE
+#endif
+RTDECL(int) RTAsn1SetOfCore_Init(PRTASN1SETOFCORE pThis, PCRTASN1COREVTABLE pVtable);
+RTDECL(int) RTAsn1SetOfCore_Clone(PRTASN1SETOFCORE pThis, PCRTASN1COREVTABLE pVtable, PCRTASN1SETOFCORE pSrc);
+
+
+/** Defines the typedefs and prototypes for a generic set-of type. */
+#define RTASN1_IMPL_GEN_SET_OF_TYPEDEFS_AND_PROTOS(a_SetOfType, a_ItemType, a_DeclMacro, a_ImplExtNm) \
+ typedef struct a_SetOfType \
+ { \
+ /** Set core. */ \
+ RTASN1SETCORE SetCore; \
+ /** The array allocation tracker. */ \
+ RTASN1ALLOCATION Allocation; \
+ /** Items in the array. */ \
+ uint32_t cItems; \
+ /** Array. */ \
+ RT_CONCAT(P,a_ItemType) paItems; \
+ } a_SetOfType; \
+ typedef a_SetOfType *RT_CONCAT(P,a_SetOfType); \
+ typedef a_SetOfType const *RT_CONCAT(PC,a_SetOfType); \
+ RTASN1TYPE_STANDARD_PROTOTYPES(a_SetOfType, a_DeclMacro, a_ImplExtNm, SetCore.Asn1Core)
+
+
+/*
+ * Declare sets and sequences of the core structure.
+ */
+RTASN1_IMPL_GEN_SEQ_OF_TYPEDEFS_AND_PROTOS(RTASN1SEQOFCORES, RTASN1CORE, RTDECL, RTAsn1SeqOfCores);
+RTASN1_IMPL_GEN_SET_OF_TYPEDEFS_AND_PROTOS(RTASN1SETOFCORES, RTASN1CORE, RTDECL, RTAsn1SetOfCores);
+
+
+/**
+ * ASN.1 null (IPRT representation).
+ */
+typedef struct RTASN1NULL
+{
+ /** Core ASN.1 encoding details. */
+ RTASN1CORE Asn1Core;
+} RTASN1NULL;
+/** Pointer to an ASN.1 null (IPRT representation). */
+typedef RTASN1NULL *PRTASN1NULL;
+/** Pointer to a const ASN.1 null (IPRT representation). */
+typedef RTASN1NULL const *PCRTASN1NULL;
+/** The Vtable for a RTASN1NULL structure. */
+extern RTDATADECL(RTASN1COREVTABLE const) g_RTAsn1Null_Vtable;
+
+RTASN1TYPE_STANDARD_PROTOTYPES(RTASN1NULL, RTDECL, RTAsn1Null, Asn1Core);
+
+
+/**
+ * ASN.1 integer (IPRT representation).
+ */
+typedef struct RTASN1INTEGER
+{
+ /** Core ASN.1 encoding details. */
+ RTASN1CORE Asn1Core;
+ /** The unsigned C representation of the 64 least significant bits.
+ * @note A ASN.1 integer doesn't define signed/unsigned and can have any
+ * length you like. Thus, the user needs to check the size and
+ * preferably use the access APIs for signed numbers. */
+ RTUINT64U uValue;
+} RTASN1INTEGER;
+/** Pointer to an ASN.1 integer (IPRT representation). */
+typedef RTASN1INTEGER *PRTASN1INTEGER;
+/** Pointer to a const ASN.1 integer (IPRT representation). */
+typedef RTASN1INTEGER const *PCRTASN1INTEGER;
+/** The Vtable for a RTASN1INTEGER structure. */
+extern RTDATADECL(RTASN1COREVTABLE const) g_RTAsn1Integer_Vtable;
+
+RTASN1TYPE_STANDARD_PROTOTYPES(RTASN1INTEGER, RTDECL, RTAsn1Integer, Asn1Core);
+
+/**
+ * Initializes an interger object to a default value.
+ * @returns VINF_SUCCESS.
+ * @param pBoolean The integer object representation.
+ * @param uValue The default value (unsigned 64-bit).
+ * @param pAllocator The allocator (pro forma).
+ */
+RTDECL(int) RTAsn1Integer_InitDefault(PRTASN1INTEGER pInteger, uint64_t uValue, PCRTASN1ALLOCATORVTABLE pAllocator);
+
+RTDECL(int) RTAsn1Integer_InitU64(PRTASN1INTEGER pThis, uint64_t uValue, PCRTASN1ALLOCATORVTABLE pAllocator);
+
+/**
+ * Get the most significat bit that's set (1).
+ *
+ * @returns 0-base bit number, -1 if all clear.
+ * @param pInteger The integer to check.
+ */
+RTDECL(int32_t) RTAsn1Integer_UnsignedLastBit(PCRTASN1INTEGER pInteger);
+
+/**
+ * Compares two ASN.1 unsigned integers.
+ *
+ * @returns 0 if equal, -1 if @a pLeft is smaller, 1 if @a pLeft is larger.
+ * @param pLeft The first ASN.1 integer.
+ * @param pRight The second ASN.1 integer.
+ */
+RTDECL(int) RTAsn1Integer_UnsignedCompare(PCRTASN1INTEGER pLeft, PCRTASN1INTEGER pRight);
+
+/**
+ * Compares an ASN.1 unsigned integer with a uint64_t.
+ *
+ * @returns 0 if equal, -1 if @a pInteger is smaller, 1 if @a pInteger is
+ * larger.
+ * @param pInteger The ASN.1 integer to treat as unsigned.
+ * @param u64Const The uint64_t constant to compare with.
+ */
+RTDECL(int) RTAsn1Integer_UnsignedCompareWithU64(PCRTASN1INTEGER pInteger, uint64_t u64Const);
+
+/**
+ * Compares an ASN.1 unsigned integer with a uint32_t.
+ *
+ * @returns 0 if equal, -1 if @a pInteger is smaller, 1 if @a pInteger is
+ * larger.
+ * @param pInteger The ASN.1 integer to treat as unsigned.
+ * @param u32Const The uint32_t constant to compare with.
+ * @remarks We don't bother with U16 and U8 variants, just use this instead.
+ */
+RTDECL(int) RTAsn1Integer_UnsignedCompareWithU32(PCRTASN1INTEGER pInteger, uint32_t u32Const);
+
+
+/**
+ * Initializes a big integer number from an ASN.1 integer.
+ *
+ * @returns IPRT status code.
+ * @param pInteger The ASN.1 integer.
+ * @param pBigNum The big integer number structure to initialize.
+ * @param fBigNumInit Subset of RTBIGNUMINIT_F_XXX that concerns
+ * senitivity, signedness and endianness.
+ */
+RTDECL(int) RTAsn1Integer_ToBigNum(PCRTASN1INTEGER pInteger, PRTBIGNUM pBigNum, uint32_t fBigNumInit);
+RTDECL(int) RTAsn1Integer_FromBigNum(PRTASN1INTEGER pThis, PCRTBIGNUM pBigNum, PCRTASN1ALLOCATORVTABLE pAllocator);
+
+RTASN1_IMPL_GEN_SEQ_OF_TYPEDEFS_AND_PROTOS(RTASN1SEQOFINTEGERS, RTASN1INTEGER, RTDECL, RTAsn1SeqOfIntegers);
+RTASN1_IMPL_GEN_SET_OF_TYPEDEFS_AND_PROTOS(RTASN1SETOFINTEGERS, RTASN1INTEGER, RTDECL, RTAsn1SetOfIntegers);
+
+
+
+/**
+ * ASN.1 boolean (IPRT representation).
+ */
+typedef struct RTASN1BOOLEAN
+{
+ /** Core ASN.1 encoding details. */
+ RTASN1CORE Asn1Core;
+ /** The boolean value. */
+ bool fValue;
+} RTASN1BOOLEAN;
+/** Pointer to the IPRT representation of an ASN.1 boolean. */
+typedef RTASN1BOOLEAN *PRTASN1BOOLEAN;
+/** Pointer to the const IPRT representation of an ASN.1 boolean. */
+typedef RTASN1BOOLEAN const *PCRTASN1BOOLEAN;
+/** The Vtable for a RTASN1BOOLEAN structure. */
+extern RTDATADECL(RTASN1COREVTABLE const) g_RTAsn1Boolean_Vtable;
+
+RTASN1TYPE_STANDARD_PROTOTYPES(RTASN1BOOLEAN, RTDECL, RTAsn1Boolean, Asn1Core);
+
+/**
+ * Initializes a boolean object to a default value.
+ * @returns VINF_SUCCESS
+ * @param pBoolean The boolean object representation.
+ * @param fValue The default value.
+ * @param pAllocator The allocator (pro forma).
+ */
+RTDECL(int) RTAsn1Boolean_InitDefault(PRTASN1BOOLEAN pBoolean, bool fValue, PCRTASN1ALLOCATORVTABLE pAllocator);
+RTDECL(int) RTAsn1Boolean_Set(PRTASN1BOOLEAN pThis, bool fValue);
+
+RTASN1_IMPL_GEN_SEQ_OF_TYPEDEFS_AND_PROTOS(RTASN1SEQOFBOOLEANS, RTASN1BOOLEAN, RTDECL, RTAsn1SeqOfBooleans);
+RTASN1_IMPL_GEN_SET_OF_TYPEDEFS_AND_PROTOS(RTASN1SETOFBOOLEANS, RTASN1BOOLEAN, RTDECL, RTAsn1SetOfBooleans);
+
+
+
+/**
+ * ASN.1 UTC and Generalized Time (IPRT representation).
+ *
+ * The two time types only differs in the precision the render (UTC time being
+ * the one for which you go "WTF were they thinking?!!" for in 2014).
+ */
+typedef struct RTASN1TIME
+{
+ /** The core structure, either ASN1_TAG_UTC_TIME or
+ * ASN1_TAG_GENERALIZED_TIME. */
+ RTASN1CORE Asn1Core;
+ /** The exploded time. */
+ RTTIME Time;
+} RTASN1TIME;
+/** Pointer to an IPRT representation of ASN.1 UTC/Generalized time. */
+typedef RTASN1TIME *PRTASN1TIME;
+/** Pointer to a const IPRT representation of ASN.1 UTC/Generalized time. */
+typedef RTASN1TIME const *PCRTASN1TIME;
+/** The Vtable for a RTASN1TIME structure. */
+extern RTDATADECL(RTASN1COREVTABLE const) g_RTAsn1Time_Vtable;
+
+RTASN1TYPE_STANDARD_PROTOTYPES(RTASN1TIME, RTDECL, RTAsn1Time, Asn1Core);
+
+RTASN1TYPE_STANDARD_PROTOTYPES(RTASN1TIME, RTDECL, RTAsn1UtcTime, Asn1Core);
+RTASN1TYPE_STANDARD_PROTOTYPES(RTASN1TIME, RTDECL, RTAsn1GeneralizedTime, Asn1Core);
+
+/**
+ * Compares two ASN.1 time values.
+ *
+ * @returns 0 if equal, -1 if @a pLeft is smaller, 1 if @a pLeft is larger.
+ * @param pLeft The first ASN.1 time object.
+ * @param pTsRight The second time to compare.
+ */
+RTDECL(int) RTAsn1Time_CompareWithTimeSpec(PCRTASN1TIME pLeft, PCRTTIMESPEC pTsRight);
+
+/** @name Predicate macros for determing the exact type of RTASN1TIME.
+ * @{ */
+/** True if UTC time. */
+#define RTASN1TIME_IS_UTC_TIME(a_pAsn1Time) ((a_pAsn1Time)->Asn1Core.uTag == ASN1_TAG_UTC_TIME)
+/** True if generalized time. */
+#define RTASN1TIME_IS_GENERALIZED_TIME(a_pAsn1Time) ((a_pAsn1Time)->Asn1Core.uTag == ASN1_TAG_GENERALIZED_TIME)
+/** @} */
+
+RTASN1_IMPL_GEN_SEQ_OF_TYPEDEFS_AND_PROTOS(RTASN1SEQOFTIMES, RTASN1TIME, RTDECL, RTAsn1SeqOfTimes);
+RTASN1_IMPL_GEN_SET_OF_TYPEDEFS_AND_PROTOS(RTASN1SETOFTIMES, RTASN1TIME, RTDECL, RTAsn1SetOfTimes);
+
+
+
+/**
+ * ASN.1 object identifier (IPRT representation).
+ */
+typedef struct RTASN1OBJID
+{
+ /** Core ASN.1 encoding details. */
+ RTASN1CORE Asn1Core;
+ /** Coverning the paComponents memory allocation if there isn't enough room in
+ * szObjId for both the dottet string and the component values. */
+ RTASN1ALLOCATION Allocation;
+ /** Pointer to an array with the component values.
+ * This may point within szObjId if there is enough space for both there. */
+ uint32_t const *pauComponents;
+ /** The number of components in the object identifier.
+ * This ASSUMES that nobody will be ever needing more than 255 components. */
+ uint8_t cComponents;
+ /** The dotted string representation of the object identifier.
+ * If there is sufficient space after the string, we will place the array that
+ * paComponents points to here and/or the raw content bytes (Asn1Core.uData).
+ *
+ * An analysis of dumpasn1.cfg, hl7.org and our own _OID defines indicates
+ * that we need space for at least 10 components and 30-something chars. We've
+ * allocated 87 bytes, which we ASSUME should be enough for everyone. */
+ char szObjId[87];
+} RTASN1OBJID;
+/** Pointer to an ASN.1 object identifier representation. */
+typedef RTASN1OBJID *PRTASN1OBJID;
+/** Pointer to a const ASN.1 object identifier representation. */
+typedef RTASN1OBJID const *PCRTASN1OBJID;
+/** The Vtable for a RTASN1OBJID structure. */
+extern RTDATADECL(RTASN1COREVTABLE const) g_RTAsn1ObjId_Vtable;
+
+RTASN1TYPE_STANDARD_PROTOTYPES(RTASN1OBJID, RTDECL, RTAsn1ObjId, Asn1Core);
+
+RTDECL(int) RTAsn1ObjId_InitFromString(PRTASN1OBJID pThis, const char *pszObjId, PCRTASN1ALLOCATORVTABLE pAllocator);
+
+/**
+ * Compares an ASN.1 object identifier with a dotted object identifier string.
+ *
+ * @returns 0 if equal, -1 if @a pLeft is smaller, 1 if @a pLeft is larger.
+ * @param pThis The ASN.1 object identifier.
+ * @param pszRight The dotted object identifier string.
+ */
+RTDECL(int) RTAsn1ObjId_CompareWithString(PCRTASN1OBJID pThis, const char *pszRight);
+
+/**
+ * Checks if an ASN.1 object identifier starts with the given dotted object
+ * identifier string.
+ *
+ * The matching is only successful if the given string matches matches the last
+ * component completely.
+ *
+ * @returns true / false.
+ * @param pThis The ASN.1 object identifier.
+ * @param pszStartsWith The dotted object identifier string.
+ */
+RTDECL(bool) RTAsn1ObjId_StartsWith(PCRTASN1OBJID pThis, const char *pszStartsWith);
+
+RTDECL(uint8_t) RTAsn1ObjIdCountComponents(PCRTASN1OBJID pThis);
+RTDECL(uint32_t) RTAsn1ObjIdGetComponentsAsUInt32(PCRTASN1OBJID pThis, uint8_t iComponent);
+RTDECL(uint32_t) RTAsn1ObjIdGetLastComponentsAsUInt32(PCRTASN1OBJID pThis);
+
+RTASN1_IMPL_GEN_SEQ_OF_TYPEDEFS_AND_PROTOS(RTASN1SEQOFOBJIDS, RTASN1OBJID, RTDECL, RTAsn1SeqOfObjIds);
+RTASN1_IMPL_GEN_SET_OF_TYPEDEFS_AND_PROTOS(RTASN1SETOFOBJIDS, RTASN1OBJID, RTDECL, RTAsn1SetOfObjIds);
+
+
+/**
+ * ASN.1 bit string (IPRT representation).
+ */
+typedef struct RTASN1BITSTRING
+{
+ /** Core ASN.1 encoding details. */
+ RTASN1CORE Asn1Core;
+ /** The number of bits. */
+ uint32_t cBits;
+ /** The max number of bits (given at decoding / construction). */
+ uint32_t cMaxBits;
+ /** Pointer to the bits. */
+ RTCPTRUNION uBits;
+ /** Pointer to user structure encapsulated in this string, if dynamically
+ * allocated the EncapsulatedAllocation member can be used to track it and
+ * trigger automatic cleanup on object destruction. If EncapsulatedAllocation
+ * is zero, any object pointed to will only be deleted. */
+ PRTASN1CORE pEncapsulated;
+ /** Allocation tracking structure for pEncapsulated. */
+ RTASN1ALLOCATION EncapsulatedAllocation;
+} RTASN1BITSTRING;
+/** Pointer to the IPRT representation of an ASN.1 bit string. */
+typedef RTASN1BITSTRING *PRTASN1BITSTRING;
+/** Pointer to the const IPRT representation of an ASN.1 bit string. */
+typedef RTASN1BITSTRING const *PCRTASN1BITSTRING;
+/** The Vtable for a RTASN1BITSTRING structure. */
+extern RTDATADECL(RTASN1COREVTABLE const) g_RTAsn1BitString_Vtable;
+
+RTASN1TYPE_STANDARD_PROTOTYPES(RTASN1BITSTRING, RTDECL, RTAsn1BitString, Asn1Core);
+
+/**
+ * Calculates pointer to the first bit.
+ *
+ * @returns Byte pointer to the first bit.
+ * @param a_pBitString The ASN.1 bit string.
+ */
+#define RTASN1BITSTRING_GET_BIT0_PTR(a_pBitString) ( &(a_pBitString)->Asn1Core.uData.pu8[1] )
+
+/**
+ * Calculates the size in bytes.
+ *
+ * @returns Rounded up size in bytes.
+ * @param a_pBitString The ASN.1 bit string.
+ */
+#define RTASN1BITSTRING_GET_BYTE_SIZE(a_pBitString) ( ((a_pBitString)->cBits + 7U) >> 3 )
+
+RTDECL(int) RTAsn1BitString_DecodeAsn1Ex(PRTASN1CURSOR pCursor, uint32_t fFlags, uint32_t cMaxBits, PRTASN1BITSTRING pThis,
+ const char *pszErrorTag);
+RTDECL(uint64_t) RTAsn1BitString_GetAsUInt64(PCRTASN1BITSTRING pThis);
+
+RTASN1_IMPL_GEN_SEQ_OF_TYPEDEFS_AND_PROTOS(RTASN1SEQOFBITSTRINGS, RTASN1BITSTRING, RTDECL, RTAsn1SeqOfBitStrings);
+RTASN1_IMPL_GEN_SET_OF_TYPEDEFS_AND_PROTOS(RTASN1SETOFBITSTRINGS, RTASN1BITSTRING, RTDECL, RTAsn1SetOfBitStrings);
+
+
+/**
+ * ASN.1 octet string (IPRT representation).
+ */
+typedef struct RTASN1OCTETSTRING
+{
+ /** Core ASN.1 encoding details. */
+ RTASN1CORE Asn1Core;
+ /** Pointer to user structure encapsulated in this string, if dynamically
+ * allocated the EncapsulatedAllocation member can be used to track it and
+ * trigger automatic cleanup on object destruction. If EncapsulatedAllocation
+ * is zero, any object pointed to will only be deleted. */
+ PRTASN1CORE pEncapsulated;
+ /** Allocation tracking structure for pEncapsulated. */
+ RTASN1ALLOCATION EncapsulatedAllocation;
+} RTASN1OCTETSTRING;
+/** Pointer to the IPRT representation of an ASN.1 octet string. */
+typedef RTASN1OCTETSTRING *PRTASN1OCTETSTRING;
+/** Pointer to the const IPRT representation of an ASN.1 octet string. */
+typedef RTASN1OCTETSTRING const *PCRTASN1OCTETSTRING;
+/** The Vtable for a RTASN1OCTETSTRING structure. */
+extern RTDATADECL(RTASN1COREVTABLE const) g_RTAsn1OctetString_Vtable;
+
+RTASN1TYPE_STANDARD_PROTOTYPES(RTASN1OCTETSTRING, RTDECL, RTAsn1OctetString, Asn1Core);
+
+RTDECL(int) RTAsn1OctetStringCompare(PCRTASN1OCTETSTRING pLeft, PCRTASN1OCTETSTRING pRight);
+
+RTASN1_IMPL_GEN_SEQ_OF_TYPEDEFS_AND_PROTOS(RTASN1SEQOFOCTETSTRINGS, RTASN1OCTETSTRING, RTDECL, RTAsn1SeqOfOctetStrings);
+RTASN1_IMPL_GEN_SET_OF_TYPEDEFS_AND_PROTOS(RTASN1SETOFOCTETSTRINGS, RTASN1OCTETSTRING, RTDECL, RTAsn1SetOfOctetStrings);
+
+
+/**
+ * ASN.1 string (IPRT representation).
+ * All char string types except 'character string (29)'.
+ */
+typedef struct RTASN1STRING
+{
+ /** Core ASN.1 encoding details. */
+ RTASN1CORE Asn1Core;
+ /** Allocation tracking for pszUtf8. */
+ RTASN1ALLOCATION Allocation;
+ /** If conversion to UTF-8 was requested, we cache that here. */
+ char const *pszUtf8;
+ /** The length (chars, not code points) of the above UTF-8 string if
+ * present. */
+ uint32_t cchUtf8;
+} RTASN1STRING;
+/** Pointer to the IPRT representation of an ASN.1 string. */
+typedef RTASN1STRING *PRTASN1STRING;
+/** Pointer to the const IPRT representation of an ASN.1 string. */
+typedef RTASN1STRING const *PCRTASN1STRING;
+/** The Vtable for a RTASN1STRING structure. */
+extern RTDATADECL(RTASN1COREVTABLE const) g_RTAsn1String_Vtable;
+
+RTASN1TYPE_STANDARD_PROTOTYPES(RTASN1STRING, RTDECL, RTAsn1String, Asn1Core);
+
+/** @name String type predicate macros.
+ * @{ */
+#define RTASN1STRING_IS_NUMERIC(a_pAsn1String) ( RTASN1CORE_GET_TAG(&(a_pAsn1String)->Asn1Core) == ASN1_TAG_NUMERIC_STRING )
+#define RTASN1STRING_IS_PRINTABLE(a_pAsn1String) ( RTASN1CORE_GET_TAG(&(a_pAsn1String)->Asn1Core) == ASN1_TAG_PRINTABLE_STRING )
+#define RTASN1STRING_IS_T61(a_pAsn1String) ( RTASN1CORE_GET_TAG(&(a_pAsn1String)->Asn1Core) == ASN1_TAG_T61_STRING )
+#define RTASN1STRING_IS_VIDEOTEX(a_pAsn1String) ( RTASN1CORE_GET_TAG(&(a_pAsn1String)->Asn1Core) == ASN1_TAG_VIDEOTEX_STRING )
+#define RTASN1STRING_IS_VISIBLE(a_pAsn1String) ( RTASN1CORE_GET_TAG(&(a_pAsn1String)->Asn1Core) == ASN1_TAG_VISIBLE_STRING )
+#define RTASN1STRING_IS_IA5(a_pAsn1String) ( RTASN1CORE_GET_TAG(&(a_pAsn1String)->Asn1Core) == ASN1_TAG_IA5_STRING )
+#define RTASN1STRING_IS_GRAPHIC(a_pAsn1String) ( RTASN1CORE_GET_TAG(&(a_pAsn1String)->Asn1Core) == ASN1_TAG_GRAPHIC_STRING )
+#define RTASN1STRING_IS_GENERAL(a_pAsn1String) ( RTASN1CORE_GET_TAG(&(a_pAsn1String)->Asn1Core) == ASN1_TAG_GENERAL_STRING )
+/** UTF-8. */
+#define RTASN1STRING_IS_UTF8(a_pAsn1String) ( RTASN1CORE_GET_TAG(&(a_pAsn1String)->Asn1Core) == ASN1_TAG_UTF8_STRING )
+/** UCS-2. */
+#define RTASN1STRING_IS_BMP(a_pAsn1String) ( RTASN1CORE_GET_TAG(&(a_pAsn1String)->Asn1Core) == ASN1_TAG_BMP_STRING )
+/** UCS-4. */
+#define RTASN1STRING_IS_UNIVERSAL(a_pAsn1String) ( RTASN1CORE_GET_TAG(&(a_pAsn1String)->Asn1Core) == ASN1_TAG_UNIVERSAL_STRING )
+/** @} */
+
+RTASN1TYPE_STANDARD_PROTOTYPES(RTASN1STRING, RTDECL, RTAsn1NumericString, Asn1Core);
+RTASN1TYPE_STANDARD_PROTOTYPES(RTASN1STRING, RTDECL, RTAsn1PrintableString, Asn1Core);
+RTASN1TYPE_STANDARD_PROTOTYPES(RTASN1STRING, RTDECL, RTAsn1T61String, Asn1Core);
+RTASN1TYPE_STANDARD_PROTOTYPES(RTASN1STRING, RTDECL, RTAsn1VideoTexString, Asn1Core);
+RTASN1TYPE_STANDARD_PROTOTYPES(RTASN1STRING, RTDECL, RTAsn1VisibleString, Asn1Core);
+RTASN1TYPE_STANDARD_PROTOTYPES(RTASN1STRING, RTDECL, RTAsn1Ia5String, Asn1Core);
+RTASN1TYPE_STANDARD_PROTOTYPES(RTASN1STRING, RTDECL, RTAsn1GraphicString, Asn1Core);
+RTASN1TYPE_STANDARD_PROTOTYPES(RTASN1STRING, RTDECL, RTAsn1GeneralString, Asn1Core);
+RTASN1TYPE_STANDARD_PROTOTYPES(RTASN1STRING, RTDECL, RTAsn1Utf8String, Asn1Core);
+RTASN1TYPE_STANDARD_PROTOTYPES(RTASN1STRING, RTDECL, RTAsn1BmpString, Asn1Core);
+RTASN1TYPE_STANDARD_PROTOTYPES(RTASN1STRING, RTDECL, RTAsn1UniversalString, Asn1Core);
+
+RTDECL(int) RTAsn1String_InitWithValue(PRTASN1STRING pThis, const char *pszUtf8Value, PCRTASN1ALLOCATORVTABLE pAllocator);
+RTDECL(int) RTAsn1String_InitEx(PRTASN1STRING pThis, uint32_t uTag, void const *pvValue, size_t cbValue,
+ PCRTASN1ALLOCATORVTABLE pAllocator);
+
+/**
+ * Compares two strings values, extended version.
+ *
+ * @returns 0 if equal, -1 if @a pLeft is smaller, 1 if @a pLeft is larger.
+ * @param pLeft The first string.
+ * @param pRight The second string.
+ * @param fTypeToo Set if the string types must match, false if
+ * not.
+ */
+RTDECL(int) RTAsn1String_CompareEx(PCRTASN1STRING pLeft, PCRTASN1STRING pRight, bool fTypeToo);
+
+/**
+ * Compares a ASN.1 string object with an UTF-8 string.
+ *
+ * @returns 0 if equal, -1 if @a pThis is smaller, 1 if @a pThis is larger.
+ * @param pThis The ASN.1 string object.
+ * @param pszString The UTF-8 string.
+ * @param cchString The length of @a pszString, or RTSTR_MAX.
+ */
+RTDECL(int) RTAsn1String_CompareWithString(PCRTASN1STRING pThis, const char *pszString, size_t cchString);
+
+/**
+ * Queries the UTF-8 length of an ASN.1 string object.
+ *
+ * This differs from RTAsn1String_QueryUtf8 in that it won't need to allocate
+ * memory for the converted string, but just calculates the length.
+ *
+ * @returns IPRT status code.
+ * @param pThis The ASN.1 string object.
+ * @param pcch Where to return the string length.
+ */
+RTDECL(int) RTAsn1String_QueryUtf8Len(PCRTASN1STRING pThis, size_t *pcch);
+
+/**
+ * Queries the UTF-8 string for an ASN.1 string object.
+ *
+ * This may fail as it may require memory to be allocated for storing the
+ * string.
+ *
+ * @returns IPRT status code.
+ * @param pString The ASN.1 string object. This is a const
+ * parameter for making life easier on the caller,
+ * however be aware that the object may be modified
+ * by this call!
+ * @param ppsz Where to return the pointer to the UTF-8 string.
+ * Optional.
+ * @param pcch Where to return the length (in 8-bit chars) to
+ * of the UTF-8 string. Optional.
+ */
+RTDECL(int) RTAsn1String_QueryUtf8(PCRTASN1STRING pString, const char **ppsz, size_t *pcch);
+RTDECL(int) RTAsn1String_RecodeAsUtf8(PRTASN1STRING pThis, PCRTASN1ALLOCATORVTABLE pAllocator);
+
+RTASN1_IMPL_GEN_SEQ_OF_TYPEDEFS_AND_PROTOS(RTASN1SEQOFSTRINGS, RTASN1STRING, RTDECL, RTAsn1SeqOfStrings);
+RTASN1_IMPL_GEN_SET_OF_TYPEDEFS_AND_PROTOS(RTASN1SETOFSTRINGS, RTASN1STRING, RTDECL, RTAsn1SetOfStrings);
+
+
+
+/**
+ * ASN.1 generic context specific tag (IPRT representation).
+ *
+ * Normally used to tag something that's optional, version specific or such.
+ *
+ * For the purpose of documenting the format with typedefs as well as possibly
+ * making it a little more type safe, there's a set of typedefs for the most
+ * commonly used tag values defined. These typedefs have are identical to
+ * RTASN1CONTEXTTAG, except from the C++ type system of view.
+ * tag values. These
+ */
+typedef struct RTASN1CONTEXTTAG
+{
+ /** Core ASN.1 encoding details. */
+ RTASN1CORE Asn1Core;
+} RTASN1CONTEXTTAG;
+/** Pointer to an ASN.1 context tag (IPRT thing). */
+typedef RTASN1CONTEXTTAG *PRTASN1CONTEXTTAG;
+/** Pointer to a const ASN.1 context tag (IPRT thing). */
+typedef RTASN1CONTEXTTAG const *PCRTASN1CONTEXTTAG;
+
+RTDECL(int) RTAsn1ContextTagN_Init(PRTASN1CONTEXTTAG pThis, uint32_t uTag);
+RTDECL(int) RTAsn1ContextTagN_Clone(PRTASN1CONTEXTTAG pThis, PCRTASN1CONTEXTTAG pSrc, uint32_t uTag);
+
+
+/** @internal */
+#define RTASN1CONTEXTTAG_DO_TYPEDEF_AND_INLINE(a_uTag) \
+ typedef struct RT_CONCAT(RTASN1CONTEXTTAG,a_uTag) { RTASN1CORE Asn1Core; } RT_CONCAT(RTASN1CONTEXTTAG,a_uTag); \
+ typedef RT_CONCAT(RTASN1CONTEXTTAG,a_uTag) *RT_CONCAT(PRTASN1CONTEXTTAG,a_uTag); \
+ DECLINLINE(int) RT_CONCAT3(RTAsn1ContextTag,a_uTag,_Init)(RT_CONCAT(PRTASN1CONTEXTTAG,a_uTag) pThis, \
+ PCRTASN1ALLOCATORVTABLE pAllocator) \
+ { return RTAsn1ContextTagN_Init((PRTASN1CONTEXTTAG)pThis, a_uTag); } \
+ DECLINLINE(int) RT_CONCAT3(RTAsn1ContextTag,a_uTag,_Clone)(RT_CONCAT(PRTASN1CONTEXTTAG,a_uTag) pThis, \
+ RT_CONCAT(RTASN1CONTEXTTAG,a_uTag) const *pSrc) \
+ { return RTAsn1ContextTagN_Clone((PRTASN1CONTEXTTAG)pThis, (PCRTASN1CONTEXTTAG)pSrc, a_uTag); } \
+ typedef RT_CONCAT(RTASN1CONTEXTTAG,a_uTag) const *RT_CONCAT(PCRTASN1CONTEXTTAG,a_uTag)
+RTASN1CONTEXTTAG_DO_TYPEDEF_AND_INLINE(0);
+RTASN1CONTEXTTAG_DO_TYPEDEF_AND_INLINE(1);
+RTASN1CONTEXTTAG_DO_TYPEDEF_AND_INLINE(2);
+RTASN1CONTEXTTAG_DO_TYPEDEF_AND_INLINE(3);
+RTASN1CONTEXTTAG_DO_TYPEDEF_AND_INLINE(4);
+RTASN1CONTEXTTAG_DO_TYPEDEF_AND_INLINE(5);
+RTASN1CONTEXTTAG_DO_TYPEDEF_AND_INLINE(6);
+RTASN1CONTEXTTAG_DO_TYPEDEF_AND_INLINE(7);
+#undef RTASN1CONTEXTTAG_DO_TYPEDEF_AND_INLINE
+
+/** Helper for comparing optional context tags.
+ * This will return if both are not present or if their precense differs.
+ * @internal */
+#define RTASN1CONTEXTTAG_COMPARE_PRESENT_RETURN_INTERNAL(a_iDiff, a_pLeft, a_pRight, a_uTag) \
+ do { \
+ /* type checks */ \
+ RT_CONCAT(PCRTASN1CONTEXTTAG,a_uTag) const pMyLeftInternal = (a_pLeft); \
+ RT_CONCAT(PCRTASN1CONTEXTTAG,a_uTag) const pMyRightInternal = (a_pRight); \
+ (a_iDiff) = (int)RTASN1CORE_IS_PRESENT(&pMyLeftInternal->Asn1Core) \
+ - (int)RTASN1CORE_IS_PRESENT(&pMyRightInternal->Asn1Core); \
+ if ((a_iDiff) || !RTASN1CORE_IS_PRESENT(&pMyLeftInternal->Asn1Core)) return iDiff; \
+ } while (0)
+
+/** Helpers for comparing optional context tags.
+ * This will return if both are not present or if their precense differs.
+ * @{ */
+#define RTASN1CONTEXTTAG0_COMPARE_PRESENT_RETURN(a_iDiff, a_pLeft, a_pRight) RTASN1CONTEXTTAG_COMPARE_PRESENT_RETURN_INTERNAL(a_iDiff, a_pLeft, a_pRight, 0)
+#define RTASN1CONTEXTTAG1_COMPARE_PRESENT_RETURN(a_iDiff, a_pLeft, a_pRight) RTASN1CONTEXTTAG_COMPARE_PRESENT_RETURN_INTERNAL(a_iDiff, a_pLeft, a_pRight, 1)
+#define RTASN1CONTEXTTAG2_COMPARE_PRESENT_RETURN(a_iDiff, a_pLeft, a_pRight) RTASN1CONTEXTTAG_COMPARE_PRESENT_RETURN_INTERNAL(a_iDiff, a_pLeft, a_pRight, 2)
+#define RTASN1CONTEXTTAG3_COMPARE_PRESENT_RETURN(a_iDiff, a_pLeft, a_pRight) RTASN1CONTEXTTAG_COMPARE_PRESENT_RETURN_INTERNAL(a_iDiff, a_pLeft, a_pRight, 3)
+#define RTASN1CONTEXTTAG4_COMPARE_PRESENT_RETURN(a_iDiff, a_pLeft, a_pRight) RTASN1CONTEXTTAG_COMPARE_PRESENT_RETURN_INTERNAL(a_iDiff, a_pLeft, a_pRight, 4)
+#define RTASN1CONTEXTTAG5_COMPARE_PRESENT_RETURN(a_iDiff, a_pLeft, a_pRight) RTASN1CONTEXTTAG_COMPARE_PRESENT_RETURN_INTERNAL(a_iDiff, a_pLeft, a_pRight, 5)
+#define RTASN1CONTEXTTAG6_COMPARE_PRESENT_RETURN(a_iDiff, a_pLeft, a_pRight) RTASN1CONTEXTTAG_COMPARE_PRESENT_RETURN_INTERNAL(a_iDiff, a_pLeft, a_pRight, 6)
+#define RTASN1CONTEXTTAG7_COMPARE_PRESENT_RETURN(a_iDiff, a_pLeft, a_pRight) RTASN1CONTEXTTAG_COMPARE_PRESENT_RETURN_INTERNAL(a_iDiff, a_pLeft, a_pRight, 7)
+/** @} */
+
+
+/**
+ * Type information for dynamically bits (see RTASN1DYNTYPE).
+ */
+typedef enum RTASN1TYPE
+{
+ /** Invalid zero value. */
+ RTASN1TYPE_INVALID = 0,
+ /** Not present. */
+ RTASN1TYPE_NOT_PRESENT,
+ /** Generic ASN.1 for unknown tag/class. */
+ RTASN1TYPE_CORE,
+ /** ASN.1 NULL. */
+ RTASN1TYPE_NULL,
+ /** ASN.1 integer. */
+ RTASN1TYPE_INTEGER,
+ /** ASN.1 boolean. */
+ RTASN1TYPE_BOOLEAN,
+ /** ASN.1 character string. */
+ RTASN1TYPE_STRING,
+ /** ASN.1 octet string. */
+ RTASN1TYPE_OCTET_STRING,
+ /** ASN.1 bite string. */
+ RTASN1TYPE_BIT_STRING,
+ /** ASN.1 UTC or Generalize time. */
+ RTASN1TYPE_TIME,
+#if 0
+ /** ASN.1 sequence core. */
+ RTASN1TYPE_SEQUENCE_CORE,
+ /** ASN.1 set core. */
+ RTASN1TYPE_SET_CORE,
+#endif
+ /** ASN.1 object identifier. */
+ RTASN1TYPE_OBJID,
+ /** End of valid types. */
+ RTASN1TYPE_END,
+ /** Type size hack. */
+ RTASN1TYPE_32BIT_HACK = 0x7fffffff
+} RTASN1TYPE;
+
+
+/**
+ * ASN.1 dynamic type record.
+ */
+typedef struct RTASN1DYNTYPE
+{
+ /** Alternative interpretation provided by a user.
+ * Before destroying this object, the user must explicitly free this and set
+ * it to NULL, otherwise there will be memory leaks. */
+ PRTASN1CORE pUser;
+ /** The type of data we've got here. */
+ RTASN1TYPE enmType;
+ /** Union with data of the type dictated by enmType. */
+ union
+ {
+ /** RTASN1TYPE_CORE. */
+ RTASN1CORE Core;
+ /** RTASN1TYPE_NULL. */
+ RTASN1NULL Asn1Null;
+ /** RTASN1TYPE_INTEGER. */
+ RTASN1INTEGER Integer;
+ /** RTASN1TYPE_BOOLEAN. */
+ RTASN1BOOLEAN Boolean;
+ /** RTASN1TYPE_STRING. */
+ RTASN1STRING String;
+ /** RTASN1TYPE_OCTET_STRING. */
+ RTASN1OCTETSTRING OctetString;
+ /** RTASN1TYPE_BIT_STRING. */
+ RTASN1BITSTRING BitString;
+ /** RTASN1TYPE_TIME. */
+ RTASN1TIME Time;
+#if 0
+ /** RTASN1TYPE_SEQUENCE_CORE. */
+ RTASN1SEQUENCECORE SeqCore;
+ /** RTASN1TYPE_SET_CORE. */
+ RTASN1SETCORE SetCore;
+#endif
+ /** RTASN1TYPE_OBJID. */
+ RTASN1OBJID ObjId;
+ } u;
+} RTASN1DYNTYPE;
+/** Pointer to an ASN.1 dynamic type record. */
+typedef RTASN1DYNTYPE *PRTASN1DYNTYPE;
+/** Pointer to a const ASN.1 dynamic type record. */
+typedef RTASN1DYNTYPE const *PCRTASN1DYNTYPE;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTASN1DYNTYPE, RTDECL, RTAsn1DynType, u.Core);
+
+
+/** @name Virtual Method Table Based API
+ * @{ */
+/**
+ * Calls the destructor of the ASN.1 object.
+ *
+ * @param pAsn1Core The IPRT representation of an ASN.1 object.
+ */
+RTDECL(void) RTAsn1VtDelete(PRTASN1CORE pThisCore);
+
+/**
+ * Deep enumeration of all descendants.
+ *
+ * @returns IPRT status code, any non VINF_SUCCESS value stems from pfnCallback.
+ * @param pThisCore Pointer to the ASN.1 core to enumerate members of.
+ * @param pfnCallback The callback.
+ * @param uDepth The depth of this object. Children are at +1.
+ * @param pvUser Callback user argument.
+ * @param fDepthFirst When set, recurse into child objects before calling
+ * pfnCallback on then. When clear, the child object
+ * is first
+ */
+RTDECL(int) RTAsn1VtDeepEnum(PRTASN1CORE pThisCore, bool fDepthFirst, uint32_t uDepth,
+ PFNRTASN1ENUMCALLBACK pfnCallback, void *pvUser);
+
+/**
+ * Clones @a pSrcCore onto @a pThisCore.
+ *
+ * The caller must be sure that @a pSrcCore and @a pThisCore are of the same
+ * types.
+ *
+ * @returns IPRT status code.
+ * @param pThisCore Pointer to the ASN.1 core to clone onto. This shall
+ * be uninitialized.
+ * @param pSrcCore Pointer to the ASN.1 core to clone.
+ * @param pAllocator The allocator to use.
+ */
+RTDECL(int) RTAsn1VtClone(PRTASN1CORE pThisCore, PRTASN1CORE pSrcCore, PCRTASN1ALLOCATORVTABLE pAllocator);
+
+/**
+ * Compares two objects.
+ *
+ * @returns 0 if equal, -1 if @a pLeft is smaller, 1 if @a pLeft is larger.
+ * @param pLeftCore Pointer to the ASN.1 core of the left side object.
+ * @param pRightCore Pointer to the ASN.1 core of the right side object.
+ */
+RTDECL(int) RTAsn1VtCompare(PCRTASN1CORE pLeftCore, PCRTASN1CORE pRightCore);
+
+/**
+ * Check sanity.
+ *
+ * A primary criteria is that the object is present and initialized.
+ *
+ * @returns IPRT status code.
+ * @param pThisCore Pointer to the ASN.1 core of the object to check out.
+ * @param fFlags See RTASN1_CHECK_SANITY_F_XXX.
+ * @param pszErrInfo Where to return additional error details. Optional.
+ * @param pszErrorTag Tag for the additional error details.
+ */
+RTDECL(int) RTAsn1VtCheckSanity(PCRTASN1CORE pThisCore, uint32_t fFlags,
+ PRTERRINFO pErrInfo, const char *pszErrorTag);
+/** @} */
+
+
+/** @defgroup rp_asn1_encode RTAsn1Encode - ASN.1 Encoding
+ * @{ */
+
+/** @name RTASN1ENCODE_F_XXX
+ * @{ */
+/** Use distinguished encoding rules (DER) to encode the object. */
+#define RTASN1ENCODE_F_DER UINT32_C(0x00000001)
+/** Use base encoding rules (BER) to encode the object.
+ * This is currently the same as DER for practical reasons. */
+#define RTASN1ENCODE_F_BER RTASN1ENCODE_F_DER
+/** Mask of valid encoding rules. */
+#define RTASN1ENCODE_F_RULE_MASK UINT32_C(0x00000007)
+/** @} */
+
+
+/**
+ * Recalculates cbHdr of and ASN.1 object.
+ *
+ * @returns IPRT status code.
+ * @retval VINF_ASN1_NOT_ENCODED if the header size is zero (default value,
+ * whatever).
+ * @param pAsn1Core The object in question.
+ * @param fFlags Valid combination of the RTASN1ENCODE_F_XXX
+ * flags. Must include the encoding type.
+ * @param pErrInfo Extended error info. Optional.
+ */
+RTDECL(int) RTAsn1EncodeRecalcHdrSize(PRTASN1CORE pAsn1Core, uint32_t fFlags, PRTERRINFO pErrInfo);
+
+/**
+ * Prepares the ASN.1 structure for encoding.
+ *
+ * The preparations is mainly calculating accurate object size, but may also
+ * involve operations like recoding internal UTF-8 strings to the actual ASN.1
+ * format and other things that may require memory to allocated/reallocated.
+ *
+ * @returns IPRT status code
+ * @param pRoot The root of the ASN.1 object tree to encode.
+ * @param fFlags Valid combination of the RTASN1ENCODE_F_XXX
+ * flags. Must include the encoding type.
+ * @param pcbEncoded Where to return the encoded size. Optional.
+ * @param pErrInfo Where to store extended error information.
+ * Optional.
+ */
+RTDECL(int) RTAsn1EncodePrepare(PRTASN1CORE pRoot, uint32_t fFlags, uint32_t *pcbEncoded, PRTERRINFO pErrInfo);
+
+/**
+ * Encodes and writes the header of an ASN.1 object.
+ *
+ * @returns IPRT status code.
+ * @retval VINF_ASN1_NOT_ENCODED if nothing was written (default value,
+ * whatever).
+ * @param pAsn1Core The object in question.
+ * @param fFlags Valid combination of the RTASN1ENCODE_F_XXX
+ * flags. Must include the encoding type.
+ * @param pfnWriter The output writer callback.
+ * @param pvUser The user argument to pass to @a pfnWriter.
+ * @param pErrInfo Where to store extended error information.
+ * Optional.
+ */
+RTDECL(int) RTAsnEncodeWriteHeader(PCRTASN1CORE pAsn1Core, uint32_t fFlags, FNRTASN1ENCODEWRITER pfnWriter, void *pvUser,
+ PRTERRINFO pErrInfo);
+
+/**
+ * Prepares the ASN.1 structure for encoding.
+ *
+ * The preparations is mainly calculating accurate object size, but may also
+ * involve operations like recoding internal UTF-8 strings to the actual ASN.1
+ * format and other things that may require memory to allocated/reallocated.
+ *
+ * @returns IPRT status code
+ * @param pRoot The root of the ASN.1 object tree to encode.
+ * @param fFlags Valid combination of the RTASN1ENCODE_F_XXX
+ * flags. Must include the encoding type.
+ * @param pfnWriter The output writer callback.
+ * @param pvUser The user argument to pass to @a pfnWriter.
+ * @param pErrInfo Where to store extended error information.
+ * Optional.
+ */
+RTDECL(int) RTAsn1EncodeWrite(PCRTASN1CORE pRoot, uint32_t fFlags, FNRTASN1ENCODEWRITER pfnWriter, void *pvUser,
+ PRTERRINFO pErrInfo);
+
+/** @} */
+
+
+
+/** @defgroup rp_asn1_cursor RTAsn1Cursor - BER, DER, and CER cursor
+ * @{ */
+
+/**
+ * ASN.1 decoder byte cursor.
+ */
+typedef struct RTASN1CURSOR
+{
+ /** Pointer to the current (next) byte. */
+ uint8_t const *pbCur;
+ /** Number of bytes left to decode. */
+ uint32_t cbLeft;
+ /** RTASN1CURSOR_FLAGS_XXX. */
+ uint32_t fFlags;
+ /** Pointer to the primary cursor. */
+ struct RTASN1CURSORPRIMARY *pPrimary;
+ /** Pointer to the parent cursor. */
+ struct RTASN1CURSOR *pUp;
+ /** The error tag for this cursor level. */
+ const char *pszErrorTag;
+} RTASN1CURSOR;
+
+/** @name RTASN1CURSOR_FLAGS_XXX - Cursor flags.
+ * @{ */
+/** Enforce DER rules. */
+#define RTASN1CURSOR_FLAGS_DER RT_BIT(1)
+/** Enforce CER rules. */
+#define RTASN1CURSOR_FLAGS_CER RT_BIT(2)
+/** @} */
+
+
+typedef struct RTASN1CURSORPRIMARY
+{
+ /** The normal cursor bits. */
+ RTASN1CURSOR Cursor;
+ /** For error reporting. */
+ PRTERRINFO pErrInfo;
+ /** The allocator virtual method table. */
+ PCRTASN1ALLOCATORVTABLE pAllocator;
+} RTASN1CURSORPRIMARY;
+typedef RTASN1CURSORPRIMARY *PRTASN1CURSORPRIMARY;
+
+
+/**
+ * Initializes a primary cursor.
+ *
+ * The primary cursor is special in that it stores information shared with the
+ * sub-cursors created by methods like RTAsn1CursorGetContextTagNCursor and
+ * RTAsn1CursorGetSequenceCursor. Even if just sharing a few items at present,
+ * it still important to save every possible byte since stack space is scarce in
+ * some of the execution environments.
+ *
+ * @returns Pointer to pCursor->Cursor.
+ * @param pPrimaryCursor The primary cursor structure to initialize.
+ * @param pvFirst The first byte to decode.
+ * @param cb The number of bytes to decode.
+ * @param pErrInfo Where to store error information.
+ * @param pAllocator The allocator to use.
+ * @param fFlags RTASN1CURSOR_FLAGS_XXX.
+ * @param pszErrorTag The primary error tag.
+ */
+RTDECL(PRTASN1CURSOR) RTAsn1CursorInitPrimary(PRTASN1CURSORPRIMARY pPrimaryCursor, void const *pvFirst, uint32_t cb,
+ PRTERRINFO pErrInfo, PCRTASN1ALLOCATORVTABLE pAllocator, uint32_t fFlags,
+ const char *pszErrorTag);
+
+
+/**
+ * Initialize a sub-cursor for traversing the content of an ASN.1 object.
+ *
+ * @returns @a pChild
+ * @param pParent The parent cursor.
+ * @param pAsn1Core The ASN.1 object which content we should
+ * traverse with the sub-cursor.
+ * @param pChild The sub-cursor to initialize.
+ * @param pszErrorTag The error tag of the sub-cursor.
+ */
+RTDECL(PRTASN1CURSOR) RTAsn1CursorInitSubFromCore(PRTASN1CURSOR pParent, PRTASN1CORE pAsn1Core,
+ PRTASN1CURSOR pChild, const char *pszErrorTag);
+
+/**
+ * Initalizes the an allocation structure prior to making an allocation.
+ *
+ * To try unify and optimize memory managment for decoding and in-memory
+ * construction of ASN.1 objects, each allocation has an allocation structure
+ * associated with it. This stores the allocator and keep statistics for
+ * optimizing array allocations.
+ *
+ * @returns Pointer to the allocator info (for call in alloc parameter).
+ * @param pCursor The cursor.
+ * @param pAllocator The allocation structure to initialize.
+ */
+RTDECL(PRTASN1ALLOCATION) RTAsn1CursorInitAllocation(PRTASN1CURSOR pCursor, PRTASN1ALLOCATION pAllocation);
+
+
+/**
+ * Wrapper around RTErrInfoSetV.
+ *
+ * @returns @a rc
+ * @param pCursor The cursor.
+ * @param rc The return code to return.
+ * @param pszMsg Message format string.
+ * @param ... Format arguments.
+ */
+RTDECL(int) RTAsn1CursorSetInfo(PRTASN1CURSOR pCursor, int rc, const char *pszMsg, ...);
+
+/**
+ * Wrapper around RTErrInfoSetV.
+ *
+ * @returns @a rc
+ * @param pCursor The cursor.
+ * @param rc The return code to return.
+ * @param pszMsg Message format string.
+ * @param va Format arguments.
+ */
+RTDECL(int) RTAsn1CursorSetInfoV(PRTASN1CURSOR pCursor, int rc, const char *pszMsg, va_list va);
+
+/**
+ * Checks that we've reached the end of the data for the cursor.
+ *
+ * @returns IPRT status code.
+ * @param pCursor The cursor we're decoding from.
+ */
+RTDECL(int) RTAsn1CursorCheckEnd(PRTASN1CURSOR pCursor);
+
+
+/**
+ * Skips a given number of bytes.
+ *
+ * @returns @a pCursor
+ * @param pCursor The cursor.
+ * @param cb The number of bytes to skip.
+ * @internal
+ */
+DECLINLINE(PRTASN1CURSOR) RTAsn1CursorSkip(PRTASN1CURSOR pCursor, uint32_t cb)
+{
+ if (cb <= pCursor->cbLeft)
+ {
+ pCursor->cbLeft -= cb;
+ pCursor->pbCur += cb;
+ }
+ else
+ {
+ pCursor->pbCur += pCursor->cbLeft;
+ pCursor->cbLeft = 0;
+ }
+
+ return pCursor;
+}
+
+/**
+ * Low-level function for reading an ASN.1 header.
+ *
+ * @returns IPRT status code.
+ * @param pCursor The cursor we're decoding from.
+ * @param pAsn1Core The output object core.
+ * @param pszErrorTag Error tag.
+ * @internal
+ */
+RTDECL(int) RTAsn1CursorReadHdr(PRTASN1CURSOR pCursor, PRTASN1CORE pAsn1Core, const char *pszErrorTag);
+
+/**
+ * Common helper for simple tag matching.
+ *
+ * @returns IPRT status code.
+ * @param pCursor The cursor (for error reporting).
+ * @param pAsn1Core The ASN.1 core structure.
+ * @param uTag The expected tag.
+ * @param fClass The expected class.
+ * @param fString Set if it's a string type that shall follow
+ * special CER and DER rules wrt to constructed and
+ * primitive encoding.
+ * @param fFlags The RTASN1CURSOR_GET_F_XXX flags.
+ * @param pszErrorTag The error tag.
+ * @param pszWhat The type/whatever name.
+ */
+RTDECL(int) RTAsn1CursorMatchTagClassFlagsEx(PRTASN1CURSOR pCursor, PRTASN1CORE pAsn1Core, uint32_t uTag, uint32_t fClass,
+ bool fString, uint32_t fFlags, const char *pszErrorTag, const char *pszWhat);
+
+/**
+ * Common helper for simple tag matching.
+ *
+ * @returns IPRT status code.
+ * @param pCursor The cursor (for error reporting).
+ * @param pAsn1Core The ASN.1 core structure.
+ * @param uTag The expected tag.
+ * @param fClass The expected class.
+ * @param fFlags The RTASN1CURSOR_GET_F_XXX flags.
+ * @param pszErrorTag The error tag.
+ * @param pszWhat The type/whatever name.
+ * @internal
+ */
+DECLINLINE(int) RTAsn1CursorMatchTagClassFlags(PRTASN1CURSOR pCursor, PRTASN1CORE pAsn1Core, uint32_t uTag, uint32_t fClass,
+ uint32_t fFlags, const char *pszErrorTag, const char *pszWhat)
+{
+ if (pAsn1Core->uTag == uTag && pAsn1Core->fClass == fClass)
+ return VINF_SUCCESS;
+ return RTAsn1CursorMatchTagClassFlagsEx(pCursor, pAsn1Core, uTag, fClass, false /*fString*/, fFlags, pszErrorTag, pszWhat);
+}
+
+
+/**
+ * Common helper for simple tag matching for strings.
+ *
+ * Check string encoding considerations.
+ *
+ * @returns IPRT status code.
+ * @param pCursor The cursor (for error reporting).
+ * @param pAsn1Core The ASN.1 core structure.
+ * @param uTag The expected tag.
+ * @param fClass The expected class.
+ * @param fFlags The RTASN1CURSOR_GET_F_XXX flags.
+ * @param pszErrorTag The error tag.
+ * @param pszWhat The type/whatever name.
+ * @internal
+ */
+DECLINLINE(int) RTAsn1CursorMatchTagClassFlagsString(PRTASN1CURSOR pCursor, PRTASN1CORE pAsn1Core, uint32_t uTag, uint32_t fClass,
+ uint32_t fFlags, const char *pszErrorTag, const char *pszWhat)
+{
+ if (pAsn1Core->uTag == uTag && pAsn1Core->fClass == fClass)
+ return VINF_SUCCESS;
+ return RTAsn1CursorMatchTagClassFlagsEx(pCursor, pAsn1Core, uTag, fClass, true /*fString*/, fFlags, pszErrorTag, pszWhat);
+}
+
+
+
+/** @name RTASN1CURSOR_GET_F_XXX - Common flags for all the getters.
+ * @{ */
+/** Used for decoding objects with implicit tags assigned to them. This only
+ * works when calling getters with a unambigious types. */
+#define RTASN1CURSOR_GET_F_IMPLICIT RT_BIT_32(0)
+/** @} */
+
+/**
+ * Read ANY object.
+ *
+ * @returns IPRT status code.
+ * @param pCursor The cursor we're decoding from.
+ * @param fFlags RTASN1CURSOR_GET_F_XXX.
+ * @param pAsn1Core The output object core.
+ * @param pszErrorTag Error tag.
+ */
+RTDECL(int) RTAsn1CursorGetCore(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1CORE pAsn1Core, const char *pszErrorTag);
+
+/**
+ * Read a NULL object.
+ *
+ * @returns IPRT status code.
+ * @param pCursor The cursor we're decoding from.
+ * @param fFlags RTASN1CURSOR_GET_F_XXX.
+ * @param pNull The output NULL object.
+ * @param pszErrorTag Error tag.
+ */
+RTDECL(int) RTAsn1CursorGetNull(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1NULL pNull, const char *pszErrorTag);
+
+/**
+ * Read an INTEGER object.
+ *
+ * @returns IPRT status code.
+ * @param pCursor The cursor we're decoding from.
+ * @param fFlags RTASN1CURSOR_GET_F_XXX.
+ * @param pInteger The output integer object.
+ * @param pszErrorTag Error tag.
+ */
+RTDECL(int) RTAsn1CursorGetInteger(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1INTEGER pInteger, const char *pszErrorTag);
+
+/**
+ * Read an BOOLEAN object.
+ *
+ * @returns IPRT status code.
+ * @param pCursor The cursor we're decoding from.
+ * @param fFlags RTASN1CURSOR_GET_F_XXX.
+ * @param pBoolean The output boolean object.
+ * @param pszErrorTag Error tag.
+ */
+RTDECL(int) RTAsn1CursorGetBoolean(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1BOOLEAN pBoolean, const char *pszErrorTag);
+
+/**
+ * Retrives an object identifier (aka ObjId or OID) item from the ASN.1 stream.
+ *
+ * @returns IPRT status code.
+ * @param pCursor The cursor.
+ * @param fFlags RTASN1CURSOR_GET_F_XXX.
+ * @param pObjId The output ODI object.
+ * @param pszErrorTag Error tag.
+ */
+RTDECL(int) RTAsn1CursorGetObjId(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1OBJID pObjId, const char *pszErrorTag);
+
+/**
+ * Retrives and verifies an object identifier.
+ *
+ * @returns IPRT status code.
+ * @param pCursor The cursor.
+ * @param fFlags RTASN1CURSOR_GET_F_XXX.
+ * @param pObjId Where to return the parsed object ID, optional.
+ * @param pszExpectedObjId The expected object identifier (dotted).
+ * @param pszErrorTag Error tag.
+ */
+RTDECL(int) RTAsn1CursorGetAndCheckObjId(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1OBJID pObjId,
+ const char *pszExpectedObjId, const char *pszErrorTag);
+
+/**
+ * Read an UTC TIME or GENERALIZED TIME object.
+ *
+ * @returns IPRT status code.
+ * @param pCursor The cursor we're decoding from.
+ * @param fFlags RTASN1CURSOR_GET_F_XXX.
+ * @param pTime The output time object.
+ * @param pszErrorTag Error tag.
+ */
+RTDECL(int) RTAsn1CursorGetTime(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1TIME pTime, const char *pszErrorTag);
+
+/**
+ * Read an BIT STRING object (skips past the content).
+ *
+ * @returns IPRT status ocde.
+ * @param pCursor The cursor.
+ * @param fFlags RTASN1CURSOR_GET_F_XXX.
+ * @param pBitString The output bit string object.
+ * @param pszErrorTag Error tag.
+ */
+RTDECL(int) RTAsn1CursorGetBitString(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1BITSTRING pBitString,
+ const char *pszErrorTag);
+
+/**
+ * Read an BIT STRING object (skips past the content), extended version with
+ * cMaxBits.
+ *
+ * @returns IPRT status ocde.
+ * @param pCursor The cursor.
+ * @param fFlags RTASN1CURSOR_GET_F_XXX.
+ * @param cMaxBits The max length of the bit string in bits. Pass
+ * UINT32_MAX if variable size.
+ * @param pBitString The output bit string object.
+ * @param pszErrorTag Error tag.
+ */
+RTDECL(int) RTAsn1CursorGetBitStringEx(PRTASN1CURSOR pCursor, uint32_t fFlags, uint32_t cMaxBits, PRTASN1BITSTRING pBitString,
+ const char *pszErrorTag);
+
+/**
+ * Read an OCTET STRING object (skips past the content).
+ *
+ * @returns IPRT status ocde.
+ * @param pCursor The cursor.
+ * @param fFlags RTASN1CURSOR_GET_F_XXX.
+ * @param pOctetString The output octet string object.
+ * @param pszErrorTag Error tag.
+ */
+RTDECL(int) RTAsn1CursorGetOctetString(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1OCTETSTRING pOctetString,
+ const char *pszErrorTag);
+
+/**
+ * Read any kind of string object, except 'character string (29)'.
+ *
+ * @returns IPRT status code.
+ * @param pCursor The cursor we're decoding from.
+ * @param fFlags RTASN1CURSOR_GET_F_XXX.
+ * @param pString The output boolean object.
+ * @param pszErrorTag Error tag.
+ */
+RTDECL(int) RTAsn1CursorGetString(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1STRING pString, const char *pszErrorTag);
+
+/**
+ * Read a IA5 STRING object.
+ *
+ * @returns IPRT status code.
+ * @param pCursor The cursor we're decoding from.
+ * @param fFlags RTASN1CURSOR_GET_F_XXX.
+ * @param pString The output boolean object.
+ * @param pszErrorTag Error tag.
+ */
+RTDECL(int) RTAsn1CursorGetIa5String(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1STRING pString, const char *pszErrorTag);
+
+/**
+ * Read a UTF8 STRING object.
+ *
+ * @returns IPRT status code.
+ * @param pCursor The cursor we're decoding from.
+ * @param fFlags RTASN1CURSOR_GET_F_XXX.
+ * @param pString The output boolean object.
+ * @param pszErrorTag Error tag.
+ */
+RTDECL(int) RTAsn1CursorGetUtf8String(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1STRING pString, const char *pszErrorTag);
+
+/**
+ * Read a BMP STRING (UCS-2) object.
+ *
+ * @returns IPRT status code.
+ * @param pCursor The cursor we're decoding from.
+ * @param fFlags RTASN1CURSOR_GET_F_XXX.
+ * @param pString The output boolean object.
+ * @param pszErrorTag Error tag.
+ */
+RTDECL(int) RTAsn1CursorGetBmpString(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1STRING pString, const char *pszErrorTag);
+
+/**
+ * Read a SEQUENCE object and create a cursor for its content.
+ *
+ * @returns IPRT status code.
+ * @param pCursor The cursor we're decoding from.
+ * @param fFlags RTASN1CURSOR_GET_F_XXX.
+ * @param pSeqCore The output sequence core object.
+ * @param pSeqCursor The output cursor for the sequence content.
+ * @param pszErrorTag Error tag, this will be associated with the
+ * returned cursor.
+ */
+RTDECL(int) RTAsn1CursorGetSequenceCursor(PRTASN1CURSOR pCursor, uint32_t fFlags,
+ PRTASN1SEQUENCECORE pSeqCore, PRTASN1CURSOR pSeqCursor, const char *pszErrorTag);
+
+/**
+ * Read a SET object and create a cursor for its content.
+ *
+ * @returns IPRT status code.
+ * @param pCursor The cursor we're decoding from.
+ * @param fFlags RTASN1CURSOR_GET_F_XXX.
+ * @param pSetCore The output set core object.
+ * @param pSetCursor The output cursor for the set content.
+ * @param pszErrorTag Error tag, this will be associated with the
+ * returned cursor.
+ */
+RTDECL(int) RTAsn1CursorGetSetCursor(PRTASN1CURSOR pCursor, uint32_t fFlags,
+ PRTASN1SETCORE pSetCore, PRTASN1CURSOR pSetCursor, const char *pszErrorTag);
+
+/**
+ * Read a given constructed context tag and create a cursor for its content.
+ *
+ * @returns IPRT status code.
+ * @param pCursor The cursor we're decoding from.
+ * @param fFlags RTASN1CURSOR_GET_F_XXX.
+ * @param pCtxTagCore The output context tag object.
+ * @param pCtxTagCursor The output cursor for the context tag content.
+ * @param pszErrorTag Error tag, this will be associated with the
+ * returned cursor.
+ *
+ * @remarks There are specialized version of this function for each of the
+ * numbered context tag structures, like for RTASN1CONTEXTTAG0 there is
+ * RTAsn1CursorGetContextTag0Cursor.
+ */
+RTDECL(int) RTAsn1CursorGetContextTagNCursor(PRTASN1CURSOR pCursor, uint32_t fFlags, uint32_t uExpectedTag,
+ PRTASN1CONTEXTTAG pCtxTag, PRTASN1CURSOR pCtxTagCursor, const char *pszErrorTag);
+
+/**
+ * Read a dynamic ASN.1 type.
+ *
+ * @returns IPRT status code.
+ * @param pCursor The cursor we're decoding from.
+ * @param fFlags RTASN1CURSOR_GET_F_XXX.
+ * @param pDynType The output context tag object.
+ * @param pszErrorTag Error tag.
+ */
+RTDECL(int) RTAsn1CursorGetDynType(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1DYNTYPE pDynType, const char *pszErrorTag);
+
+/**
+ * Peeks at the next ASN.1 object.
+ *
+ * @returns IPRT status code.
+ * @param pCursor The cursore we're decoding from.
+ * @param pAsn1Core Where to store the output of the peek.
+ */
+RTDECL(int) RTAsn1CursorPeek(PRTASN1CURSOR pCursor, PRTASN1CORE pAsn1Core);
+
+/**
+ * Checks if the next ASN.1 object matches the given tag and class/flags.
+ *
+ * @returns @c true on match, @c false on mismatch.
+ * @param pCursor The cursore we're decoding from.
+ * @param uTag The tag number to match against.
+ * @param fClass The tag class and flags to match against.
+ */
+RTDECL(bool) RTAsn1CursorIsNextEx(PRTASN1CURSOR pCursor, uint32_t uTag, uint8_t fClass);
+
+
+
+/** @internal */
+#define RTASN1CONTEXTTAG_IMPL_CURSOR_INLINES(a_uTag) \
+ DECLINLINE(int) RT_CONCAT3(RTAsn1CursorGetContextTag,a_uTag,Cursor)(PRTASN1CURSOR pCursor, uint32_t fFlags, \
+ RT_CONCAT(PRTASN1CONTEXTTAG,a_uTag) pCtxTag, \
+ PRTASN1CURSOR pCtxTagCursor, const char *pszErrorTag) \
+ { /* Constructed is automatically implied if you need a cursor to it. */ \
+ return RTAsn1CursorGetContextTagNCursor(pCursor, fFlags, a_uTag, (PRTASN1CONTEXTTAG)pCtxTag, pCtxTagCursor, pszErrorTag); \
+ } \
+ DECLINLINE(int) RT_CONCAT3(RTAsn1ContextTag,a_uTag,InitDefault)(RT_CONCAT(PRTASN1CONTEXTTAG,a_uTag) pCtxTag) \
+ { /* Constructed is automatically implied if you need to init it with a default value. */ \
+ return RTAsn1Core_InitDefault(&pCtxTag->Asn1Core, a_uTag, ASN1_TAGCLASS_CONTEXT | ASN1_TAGFLAG_CONSTRUCTED); \
+ } \
+ DECLINLINE(int) RT_CONCAT3(RTAsn1CursorIsConstructedContextTag,a_uTag,Next)(PRTASN1CURSOR pCursor) \
+ { \
+ return RTAsn1CursorIsNextEx(pCursor, a_uTag, ASN1_TAGCLASS_CONTEXT | ASN1_TAGFLAG_CONSTRUCTED); \
+ } \
+ DECLINLINE(int) RT_CONCAT3(RTAsn1CursorIsPrimitiveContextTag,a_uTag,Next)(PRTASN1CURSOR pCursor) \
+ { \
+ return RTAsn1CursorIsNextEx(pCursor, a_uTag, ASN1_TAGCLASS_CONTEXT | ASN1_TAGFLAG_PRIMITIVE); \
+ } \
+ DECLINLINE(int) RT_CONCAT3(RTAsn1CursorIsAnyContextTag,a_uTag,Next)(PRTASN1CURSOR pCursor) \
+ { \
+ return RTAsn1CursorIsNextEx(pCursor, a_uTag, ASN1_TAGCLASS_CONTEXT | ASN1_TAGFLAG_CONSTRUCTED) \
+ || RTAsn1CursorIsNextEx(pCursor, a_uTag, ASN1_TAGCLASS_CONTEXT | ASN1_TAGFLAG_PRIMITIVE);\
+ } \
+
+RTASN1CONTEXTTAG_IMPL_CURSOR_INLINES(0)
+RTASN1CONTEXTTAG_IMPL_CURSOR_INLINES(1)
+RTASN1CONTEXTTAG_IMPL_CURSOR_INLINES(2)
+RTASN1CONTEXTTAG_IMPL_CURSOR_INLINES(3)
+RTASN1CONTEXTTAG_IMPL_CURSOR_INLINES(4)
+RTASN1CONTEXTTAG_IMPL_CURSOR_INLINES(5)
+RTASN1CONTEXTTAG_IMPL_CURSOR_INLINES(6)
+RTASN1CONTEXTTAG_IMPL_CURSOR_INLINES(7)
+#undef RTASN1CONTEXTTAG_IMPL_CURSOR_INLINES
+
+
+/**
+ * Checks if the next object is a boolean.
+ *
+ * @returns true / false
+ * @param pCursor The cursore we're decoding from.
+ * @remarks May produce error info output on mismatch.
+ */
+DECLINLINE(bool) RTAsn1CursorIsBooleanNext(PRTASN1CURSOR pCursor)
+{
+ return RTAsn1CursorIsNextEx(pCursor, ASN1_TAG_BOOLEAN, ASN1_TAGFLAG_PRIMITIVE | ASN1_TAGCLASS_UNIVERSAL);
+}
+
+
+/**
+ * Checks if the next object is a set.
+ *
+ * @returns true / false
+ * @param pCursor The cursore we're decoding from.
+ * @remarks May produce error info output on mismatch.
+ */
+DECLINLINE(bool) RTAsn1CursorIsSetNext(PRTASN1CURSOR pCursor)
+{
+ return RTAsn1CursorIsNextEx(pCursor, ASN1_TAG_SET, ASN1_TAGFLAG_CONSTRUCTED | ASN1_TAGCLASS_UNIVERSAL);
+}
+
+
+/** @} */
+
+
+/** @name ASN.1 Utility APIs
+ * @{ */
+
+/**
+ * Dumps an IPRT representation of a ASN.1 object tree.
+ *
+ * @returns IPRT status code.
+ * @param pAsn1Core The ASN.1 object which members should be dumped.
+ * @param fFlags RTASN1DUMP_F_XXX.
+ * @param uLevel The indentation level to start at.
+ * @param pfnPrintfV The output function.
+ * @param pvUser Argument to the output function.
+ */
+RTDECL(int) RTAsn1Dump(PCRTASN1CORE pAsn1Core, uint32_t fFlags, uint32_t uLevel, PFNRTDUMPPRINTFV pfnPrintfV, void *pvUser);
+
+/** @} */
+
+/** @} */
+
+RT_C_DECLS_END
+
+#endif
+
diff --git a/include/iprt/base64.h b/include/iprt/base64.h
index dfbbc134311..00cd0356a03 100644
--- a/include/iprt/base64.h
+++ b/include/iprt/base64.h
@@ -48,14 +48,29 @@ RT_C_DECLS_BEGIN
*
* @returns The length in bytes. -1 if the encoding is bad.
*
- * @param pszString The Base64 encoded string.
- * @param ppszEnd If not NULL, this will point to the first char
- * following the Base64 encoded text block. If
- * NULL the entire string is assumed to be Base64.
+ * @param pszString The Base64 encoded string.
+ * @param ppszEnd If not NULL, this will point to the first char
+ * following the Base64 encoded text block. If
+ * NULL the entire string is assumed to be Base64.
*/
RTDECL(ssize_t) RTBase64DecodedSize(const char *pszString, char **ppszEnd);
/**
+ * Calculates the decoded data size for a Base64 encoded string.
+ *
+ * @returns The length in bytes. -1 if the encoding is bad.
+ *
+ * @param pszString The Base64 encoded string.
+ * @param cchStringMax The max length to decode, use RTSTR_MAX if the
+ * length of @a pszString is not known and it is
+ * really zero terminated.
+ * @param ppszEnd If not NULL, this will point to the first char
+ * following the Base64 encoded text block. If
+ * NULL the entire string is assumed to be Base64.
+ */
+RTDECL(ssize_t) RTBase64DecodedSizeEx(const char *pszString, size_t cchStringMax, char **ppszEnd);
+
+/**
* Decodes a Base64 encoded string into the buffer supplied by the caller.
*
* @returns IPRT status code.
@@ -79,6 +94,33 @@ RTDECL(ssize_t) RTBase64DecodedSize(const char *pszString, char **ppszEnd);
RTDECL(int) RTBase64Decode(const char *pszString, void *pvData, size_t cbData, size_t *pcbActual, char **ppszEnd);
/**
+ * Decodes a Base64 encoded string into the buffer supplied by the caller.
+ *
+ * @returns IPRT status code.
+ * @retval VERR_BUFFER_OVERFLOW if the buffer is too small. pcbActual will not
+ * be set, nor will ppszEnd.
+ * @retval VERR_INVALID_BASE64_ENCODING if the encoding is wrong.
+ *
+ * @param pszString The Base64 string. Whether the entire string or
+ * just the start of the string is in Base64 depends
+ * on whether ppszEnd is specified or not.
+ * @param cchStringMax The max length to decode, use RTSTR_MAX if the
+ * length of @a pszString is not known and it is
+ * really zero terminated.
+ * @param pvData Where to store the decoded data.
+ * @param cbData The size of the output buffer that pvData points to.
+ * @param pcbActual Where to store the actual number of bytes returned.
+ * Optional.
+ * @param ppszEnd Indicates that the string may contain other stuff
+ * after the Base64 encoded data when not NULL. Will
+ * be set to point to the first char that's not part of
+ * the encoding. If NULL the entire string must be part
+ * of the Base64 encoded data.
+ */
+RTDECL(int) RTBase64DecodeEx(const char *pszString, size_t cchStringMax, void *pvData, size_t cbData,
+ size_t *pcbActual, char **ppszEnd);
+
+/**
* Calculates the length of the Base64 encoding of a given number of bytes of
* data.
*
diff --git a/include/iprt/bignum.h b/include/iprt/bignum.h
new file mode 100644
index 00000000000..784b4354246
--- /dev/null
+++ b/include/iprt/bignum.h
@@ -0,0 +1,155 @@
+/** @file
+ * IPRT - Big Integer Numbers.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+#ifndef ___iprt_bignum_h
+#define ___iprt_bignum_h
+
+#include <iprt/types.h>
+
+RT_C_DECLS_BEGIN
+
+/** @defgroup grp_rtbignum RTBigNum - Big Integer Numbers
+ * @ingroup grp_rt
+ * @{
+ */
+
+/** The big integer number element type. */
+typedef uint32_t RTBIGNUMELEMENT;
+/** The size (in bytes) of one array element. */
+#define RTBIGNUM_ELEMENT_SIZE 4
+/** The number of bits in one array element. */
+#define RTBIGNUM_ELEMENT_BITS (RTBIGNUM_ELEMENT_SIZE * 8)
+/** Returns the bitmask corrsponding to given bit number. */
+#define RTBIGNUM_ELEMENT_BIT(iBit) RT_BIT_32(iBit)
+
+/**
+ * IPRT big integer number.
+ */
+typedef struct RTBIGNUM
+{
+ /** Elements array where the magnitue of the value is stored. */
+ RTBIGNUMELEMENT *pauElements;
+ /** The current number of elements we're using in the pauElements array. */
+ uint32_t cUsed;
+ /** The current allocation size of pauElements. */
+ uint32_t cAllocated;
+ /** Reserved for future use. */
+ uint32_t uReserved;
+
+ /** Set if it's a negative number, clear if positive or zero. */
+ uint32_t fNegative : 1;
+
+ /** Whether to use a the data is sensitive (RTBIGNUMINIT_F_SENSITIVE). */
+ uint32_t fSensitive : 1;
+ /** The number is currently scrambled */
+ uint32_t fCurScrambled : 1;
+
+ /** Bits reserved for future use. */
+ uint32_t fReserved : 30;
+} RTBIGNUM;
+
+
+RTDECL(int) RTBigNumInit(PRTBIGNUM pBigNum, uint32_t fFlags, void const *pvRaw, size_t cbRaw);
+RTDECL(int) RTBigNumInitZero(PRTBIGNUM pBigNum, uint32_t fFlags);
+
+/** @name RTBIGNUMINIT_F_XXX - RTBigNumInit flags.
+ * @{ */
+/** The number is sensitive so use a safer allocator, scramble it when not
+ * in use, and apply RTMemWipeThoroughly before freeing. The RTMemSafer API
+ * takes care of these things.
+ * @note When using this flag, concurrent access is not possible! */
+#define RTBIGNUMINIT_F_SENSITIVE RT_BIT(0)
+/** Big endian number. */
+#define RTBIGNUMINIT_F_ENDIAN_BIG RT_BIT(1)
+/** Little endian number. */
+#define RTBIGNUMINIT_F_ENDIAN_LITTLE RT_BIT(2)
+/** The raw number is unsigned. */
+#define RTBIGNUMINIT_F_UNSIGNED RT_BIT(3)
+/** The raw number is signed. */
+#define RTBIGNUMINIT_F_SIGNED RT_BIT(4)
+/** @} */
+
+RTDECL(int) RTBigNumClone(PRTBIGNUM pBigNum, PCRTBIGNUM pSrc);
+
+RTDECL(int) RTBigNumDestroy(PRTBIGNUM pBigNum);
+
+
+/**
+ * The minimum number of bits require store the two's complement representation
+ * of the number.
+ *
+ * @returns Width in number of bits.
+ * @param pBigNum The big number.
+ */
+RTDECL(uint32_t) RTBigNumBitWidth(PCRTBIGNUM pBigNum);
+RTDECL(uint32_t) RTBigNumByteWidth(PCRTBIGNUM pBigNum);
+
+
+/**
+ * Converts the big number to a sign-extended big endian byte sequence.
+ *
+ * @returns IPRT status code
+ * @retval VERR_BUFFER_OVERFLOW if the specified buffer is too small.
+ * @param pBigNum The big number.
+ * @param pvBuf The output buffer (size is at least cbWanted).
+ * @param cbWanted The number of bytes wanted.
+ */
+RTDECL(int) RTBigNumToBytesBigEndian(PCRTBIGNUM pBigNum, void *pvBuf, size_t cbWanted);
+
+/**
+ * Compares two numbers.
+ *
+ * @retval -1 if pLeft < pRight.
+ * @retval 0 if pLeft == pRight.
+ * @retval 1 if pLeft > pRight.
+ *
+ * @param pLeft The left side number.
+ * @param pRight The right side number.
+ */
+RTDECL(int) RTBigNumCompare(PRTBIGNUM pLeft, PRTBIGNUM pRight);
+RTDECL(int) RTBigNumCompareWithU64(PRTBIGNUM pLeft, uint64_t uRight);
+RTDECL(int) RTBigNumCompareWithS64(PRTBIGNUM pLeft, int64_t iRight);
+
+RTDECL(int) RTBigNumAssign(PRTBIGNUM pDst, PCRTBIGNUM pSrc);
+RTDECL(int) RTBigNumNegate(PRTBIGNUM pResult, PCRTBIGNUM pBigNum);
+RTDECL(int) RTBigNumNegateThis(PRTBIGNUM pThis);
+
+RTDECL(int) RTBigNumAdd(PRTBIGNUM pResult, PCRTBIGNUM pAugend, PCRTBIGNUM pAddend);
+RTDECL(int) RTBigNumSubtract(PRTBIGNUM pResult, PCRTBIGNUM pMinuend, PCRTBIGNUM pSubtrahend);
+RTDECL(int) RTBigNumMultiply(PRTBIGNUM pResult, PCRTBIGNUM pMultiplicand, PCRTBIGNUM pMultiplier);
+RTDECL(int) RTBigNumDivide(PRTBIGNUM pQuotient, PRTBIGNUM pRemainder, PCRTBIGNUM pDividend, PCRTBIGNUM pDivisor);
+RTDECL(int) RTBigNumModulo(PRTBIGNUM pRemainder, PCRTBIGNUM pDividend, PCRTBIGNUM pDivisor);
+RTDECL(int) RTBigNumExponentiate(PRTBIGNUM pResult, PCRTBIGNUM pBase, PCRTBIGNUM pExponent);
+
+RTDECL(int) RTBigNumModExp(PRTBIGNUM pResult, PRTBIGNUM pBase, PRTBIGNUM pExponent, PRTBIGNUM pModulus);
+
+
+/** @} */
+
+RT_C_DECLS_END
+
+#endif
+
diff --git a/include/iprt/cdefs.h b/include/iprt/cdefs.h
index 744fd48b354..7675afc34fd 100644
--- a/include/iprt/cdefs.h
+++ b/include/iprt/cdefs.h
@@ -1245,16 +1245,27 @@
/** @def RTDATADECL(type)
* Runtime Library export or import declaration.
* Data declared using this macro exists in all contexts.
- * @param type The return type of the function declaration.
+ * @param type The data type.
+ */
+/** @def RT_DECL_DATA_CONST(type)
+ * Definition of a const variable. See DECL_HIDDEN_CONST.
+ * @param type The const data type.
*/
#if defined(IN_RT_R3) || defined(IN_RT_RC) || defined(IN_RT_R0)
# ifdef IN_RT_STATIC
-# define RTDATADECL(type) DECLHIDDEN(type)
+# define RTDATADECL(type) DECLHIDDEN(type)
+# define RT_DECL_DATA_CONST(type) DECL_HIDDEN_CONST(type)
# else
-# define RTDATADECL(type) DECLEXPORT(type)
+# define RTDATADECL(type) DECLEXPORT(type)
+# if defined(__cplusplus) && defined(__GNUC__)
+# define RT_DECL_DATA_CONST(type) type
+# else
+# define RT_DECL_DATA_CONST(type) DECLEXPORT(type)
+# endif
# endif
#else
-# define RTDATADECL(type) DECLIMPORT(type)
+# define RTDATADECL(type) DECLIMPORT(type)
+# define RT_DECL_DATA_CONST(type) DECLIMPORT(type)
#endif
/** @def RT_DECL_CLASS
diff --git a/include/iprt/crypto/Makefile.kup b/include/iprt/crypto/Makefile.kup
new file mode 100644
index 00000000000..e69de29bb2d
--- /dev/null
+++ b/include/iprt/crypto/Makefile.kup
diff --git a/include/iprt/crypto/digest.h b/include/iprt/crypto/digest.h
new file mode 100644
index 00000000000..35c1cdaf587
--- /dev/null
+++ b/include/iprt/crypto/digest.h
@@ -0,0 +1,188 @@
+/** @file
+ * IPRT - Crypto - Cryptographic Hash / Message Digest.
+ */
+
+/*
+ * Copyright (C) 2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+#ifndef ___iprt_crypto_digest_h
+#define ___iprt_crypto_digest_h
+
+#include <iprt/asn1.h>
+
+
+RT_C_DECLS_BEGIN
+
+/** @defgroup grp_rt_crdigest RTCrDigest - Crypographic Hash / Message Digest API.
+ * @ingroup grp_rt
+ * @{
+ */
+
+/**
+ * Cryptographic hash / message digest provider descriptor.
+ *
+ * This gives the basic details and identifiers of the algorithm as well as
+ * function pointers to the implementation.
+ */
+typedef struct RTCRDIGESTDESC
+{
+ /** The message digest provider name. */
+ const char *pszName;
+ /** The object ID string. */
+ const char *pszObjId;
+ /** Pointer to a NULL terminated table of alias object IDs (optional). */
+ const char * const *papszObjIdAliases;
+ /** The IPRT digest type. */
+ RTDIGESTTYPE enmType;
+ /** The max size of the final hash (binary). */
+ uint32_t cbHash;
+ /** The size of the state. */
+ uint32_t cbState;
+ /** Reserved. */
+ uint32_t uReserved;
+
+ /**
+ * Updates the digest with more data.
+ *
+ * @param pvState The opaque message digest state.
+ * @param pvData The data to add to the digest.
+ * @param cbData The amount of data to add to the digest.
+ */
+ DECLCALLBACKMEMBER(void, pfnUpdate)(void *pvState, const void *pvData, size_t cbData);
+
+ /**
+ * Finalizes the digest calculation.
+ *
+ * @param pvState The opaque message digest state.
+ * @param pbHash Where to store the output digest. This buffer is at
+ * least RTCRDIGESTDESC::cbHash bytes large.
+ */
+ DECLCALLBACKMEMBER(void, pfnFinal)(void *pvState, uint8_t *pbHash);
+
+ /**
+ * (Re-)Initializes the digest. Optional.
+ *
+ * Optional, RT_BZERO will be used if NULL.
+ *
+ * @returns IPRT status code.
+ * @param pvState The opaque message digest state.
+ * @param pvOpaque Opaque algortihm specific parameter.
+ * @param fReInit Set if this is a re-init call.
+ */
+ DECLCALLBACKMEMBER(int, pfnInit)(void *pvState, void *pvOpaque, bool fReInit);
+
+ /**
+ * Deletes the message digest state.
+ *
+ * Optional, memset will be used if NULL.
+ *
+ * @param pvState The opaque message digest state.
+ */
+ DECLCALLBACKMEMBER(void, pfnDelete)(void *pvState);
+
+ /**
+ * Clones the message digest state.
+ *
+ * Optional, memcpy will be used if NULL.
+ *
+ * @returns IPRT status code.
+ * @param pvState The opaque message digest state (destination).
+ * @param pvSrcState The opaque message digest state to clone (source).
+ */
+ DECLCALLBACKMEMBER(int, pfnClone)(void *pvState, void const *pvSrcState);
+
+ /**
+ * Gets the hash size.
+ *
+ * Optional, if not provided RTCRDIGESTDESC::cbHash will be returned. If
+ * provided though, RTCRDIGESTDESC::cbHash must be set to the largest possible
+ * hash size.
+ *
+ * @returns The hash size.
+ * @param pvState The opaque message digest state.
+ */
+ DECLCALLBACKMEMBER(uint32_t, pfnGetHashSize)(void *pvState);
+
+ /**
+ * Gets the digest type (when enmType is RTDIGESTTYPE_UNKNOWN).
+ *
+ * @returns The hash size.
+ * @param pvState The opaque message digest state.
+ */
+ DECLCALLBACKMEMBER(RTDIGESTTYPE, pfnGetDigestType)(void *pvState);
+} RTCRDIGESTDESC;
+/** Pointer to const message digest details and vtable. */
+typedef RTCRDIGESTDESC const *PCRTCRDIGESTDESC;
+
+/**
+ * Finds a cryptographic hash / message digest descriptor by object identifier
+ * string.
+ *
+ * @returns Pointer to the message digest details & vtable if found. NULL if
+ * not found.
+ * @param pszObjId The dotted object identifier string of the message
+ * digest algorithm.
+ * @param ppvOpaque Where to return an opaque implementation specfici
+ * sub-type indicator that can be passed to
+ * RTCrDigestCreate. This is optional, fewer
+ * algortihms are available if not specified.
+ */
+PCRTCRDIGESTDESC RTCrDigestFindByObjIdString(const char *pszObjId, void *ppvOpaque);
+
+/**
+ * Finds a cryptographic hash / message digest descriptor by object identifier
+ * ASN.1 object.
+ *
+ * @returns Pointer to the message digest details & vtable if found. NULL if
+ * not found.
+ * @param pszObjId The ASN.1 object ID of the message digest algorithm.
+ * @param ppvOpaque Where to return an opaque implementation specfici
+ * sub-type indicator that can be passed to
+ * RTCrDigestCreate. This is optional, fewer
+ * algortihms are available if not specified.
+ */
+PCRTCRDIGESTDESC RTCrDigestFindByObjId(PCRTASN1OBJID pObjId, void *ppvOpaque);
+
+RTDECL(int) RTCrDigestCreateByObjIdString(PRTCRDIGEST phDigest, const char *pszObjId);
+RTDECL(int) RTCrDigestCreateByObjId(PRTCRDIGEST phDigest, PCRTASN1OBJID pObjId);
+
+
+
+RTDECL(int) RTCrDigestCreate(PRTCRDIGEST phDigest, PCRTCRDIGESTDESC pDesc, void *pvOpaque);
+RTDECL(int) RTCrDigestClone(PRTCRDIGEST phDigest, RTCRDIGEST hSrc);
+RTDECL(int) RTCrDigestReset(RTCRDIGEST hDigest);
+RTDECL(uint32_t) RTCrDigestRetain(RTCRDIGEST hDigest);
+RTDECL(uint32_t) RTCrDigestRelease(RTCRDIGEST hDigest);
+RTDECL(int) RTCrDigestUpdate(RTCRDIGEST hDigest, void const *pvData, size_t cbData);
+RTDECL(int) RTCrDigestFinal(RTCRDIGEST hDigest, void *pvHash, size_t cbHash);
+RTDECL(bool) RTCrDigestMatch(RTCRDIGEST hDigest, void const *pvHash, size_t cbHash);
+RTDECL(uint8_t const *) RTCrDigestGetHash(RTCRDIGEST hDigest);
+RTDECL(uint32_t) RTCrDigestGetHashSize(RTCRDIGEST hDigest);
+RTDECL(uint64_t) RTCrDigestGetConsumedSize(RTCRDIGEST hDigest);
+RTDECL(bool) RTCrDigestIsFinalized(RTCRDIGEST hDigest);
+RTDECL(RTDIGESTTYPE) RTCrDigestGetType(RTCRDIGEST hDigest);
+
+/** @} */
+
+RT_C_DECLS_END
+
+#endif
+
diff --git a/include/iprt/crypto/pem.h b/include/iprt/crypto/pem.h
new file mode 100644
index 00000000000..616ffad455d
--- /dev/null
+++ b/include/iprt/crypto/pem.h
@@ -0,0 +1,133 @@
+/** @file
+ * IPRT - Crypto - PEM-file Reader & Writer.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+#ifndef ___iprt_crypto_spc_h
+#define ___iprt_crypto_spc_h
+
+#include <iprt/asn1.h>
+#include <iprt/crypto/x509.h>
+#include <iprt/crypto/pkcs7.h>
+#include <iprt/md5.h>
+#include <iprt/sha.h>
+
+
+RT_C_DECLS_BEGIN
+
+/** @defgroup grp_rt_spc RTCrPem - PEM-file Reader & Writer
+ * @ingroup grp_rt_crypto
+ * @{
+ */
+
+
+/**
+ * One PEM marker word (use RT_STR_TUPLE to initialize).
+ */
+typedef struct RTCRPEMMARKERWORD
+{
+ /** The word string. */
+ const char *pszWord;
+ /** The length. */
+ uint32_t cchWord;
+} RTCRPEMMARKERWORD;
+/** Pointer to a const marker word. */
+typedef RTCRPEMMARKERWORD const *PCRTCRPEMMARKERWORD;
+
+
+/**
+ * A PEM marker.
+ *
+ * This is an array of words with lengths, optimized for avoid unnecessary
+ * strlen() while searching the file content. It is ASSUMED that all PEM
+ * section markers starts with either 'BEGIN' or 'END', followed by the words
+ * in the this structure.
+ */
+typedef struct RTCRPEMMARKER
+{
+ /** Pointer to an array of marker words. */
+ PCRTCRPEMMARKERWORD paWords;
+ /** Number of works in the array papszWords points to. */
+ uint32_t cWords;
+} RTCRPEMMARKER;
+/** Pointer to a const PEM marker. */
+typedef RTCRPEMMARKER const *PCRTCRPEMMARKER;
+
+
+/**
+ * A PEM section.
+ *
+ * The API works on linked lists of these.
+ */
+typedef struct RTCRPEMSECTION
+{
+ /** Pointer to the next file section. */
+ struct RTCRPEMSECTION const *pNext;
+ /** The marker for this section. NULL if binary file. */
+ PCRTCRPEMMARKER pMarker;
+ /** Pointer to the binary data. */
+ uint8_t *pbData;
+ /** The size of the binary data. */
+ size_t cbData;
+ /** Additional text preceeding the binary data. NULL if none. */
+ char *pszPreamble;
+ /** The length of the preamble. */
+ size_t cchPreamble;
+} RTCRPEMSECTION;
+/** Pointer to a PEM section. */
+typedef RTCRPEMSECTION *PRTCRPEMSECTION;
+/** Pointer to a const PEM section. */
+typedef RTCRPEMSECTION const *PCRTCRPEMSECTION;
+
+
+/**
+ * Frees sections returned by RTCrPemReadFile.
+ * @returns IPRT status code.
+ * @param pSectionHead The first section.
+ */
+RTDECL(int) RTCrPemFreeSections(PCRTCRPEMSECTION pSectionHead);
+
+/**
+ * Reads the content of the given file and returns a list of binary sections
+ * found in the file.
+ *
+ * If the file isn't an ASCII file or if no markers were found, the entire file
+ * content is returned as one single section (with pMarker = NULL).
+ *
+ * @returns IPRT status code.
+ * @param pszFilename The path to the file to read.
+ * @param fFlags Flags reserved for future hacks.
+ * @param paMarkers Array of one or more section markers to look for.
+ * @param cMarkers Number of markers in the array.
+ * @param ppSectionHead Where to return the head of the section list.
+ * @param pErrInfo Where to return extend error info. Optional.
+ */
+RTDECL(int) RTCrPemReadFile(const char *pszFilename, uint32_t fFlags, PCRTCRPEMMARKER paMarkers, size_t cMarkers,
+ PCRTCRPEMSECTION *ppSectionHead, PRTERRINFO pErrInfo);
+
+/** @} */
+
+RT_C_DECLS_END
+
+#endif
+
diff --git a/include/iprt/crypto/pkcs7.h b/include/iprt/crypto/pkcs7.h
new file mode 100644
index 00000000000..f7c0681028f
--- /dev/null
+++ b/include/iprt/crypto/pkcs7.h
@@ -0,0 +1,349 @@
+/** @file
+ * IPRT - PKCS \#7, Cryptographic Message Syntax Standard (aka CMS).
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+#ifndef ___iprt_crypto_pkcs7_h
+#define ___iprt_crypto_pkcs7_h
+
+#include <iprt/asn1.h>
+#include <iprt/crypto/x509.h>
+
+
+RT_C_DECLS_BEGIN
+
+/** @defgroup grp_rt_crpkcs7 RTCrPkcs7 - PKCS \#7, Cryptographic Message Syntax Standard (aka CMS).
+ * @ingroup grp_rt_crypto
+ * @{
+ */
+
+
+/**
+ * PKCS \#7 IssuerAndSerialNumber (IPRT representation).
+ */
+typedef struct RTCRPKCS7ISSUERANDSERIALNUMBER
+{
+ /** Sequence core. */
+ RTASN1SEQUENCECORE SeqCore;
+ /** The certificate name. */
+ RTCRX509NAME Name;
+ /** The certificate serial number. */
+ RTASN1INTEGER SerialNumber;
+} RTCRPKCS7ISSUERANDSERIALNUMBER;
+/** Pointer to the IPRT representation of a PKCS \#7 IssuerAndSerialNumber. */
+typedef RTCRPKCS7ISSUERANDSERIALNUMBER *PRTCRPKCS7ISSUERANDSERIALNUMBER;
+/** Pointer to the const IPRT representation of a PKCS \#7
+ * IssuerAndSerialNumber. */
+typedef RTCRPKCS7ISSUERANDSERIALNUMBER const *PCRTCRPKCS7ISSUERANDSERIALNUMBER;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRPKCS7ISSUERANDSERIALNUMBER, RTDECL, RTCrPkcs7IssuerAndSerialNumber, SeqCore.Asn1Core);
+
+
+/**
+ * Attribute value type (for the union).
+ */
+typedef enum RTCRPKCS7ATTRIBUTETYPE
+{
+ /** Zero is invalid. */
+ RTCRPKCS7ATTRIBUTETYPE_INVALID = 0,
+ /** Not present, union is NULL. */
+ RTCRPKCS7ATTRIBUTETYPE_NOT_PRESENT,
+ /** Unknown values, Asn1Core. */
+ RTCRPKCS7ATTRIBUTETYPE_UNKNOWN,
+ /** Object IDs, use ObjId. */
+ RTCRPKCS7ATTRIBUTETYPE_OBJ_IDS,
+ /** Octet strings. */
+ RTCRPKCS7ATTRIBUTETYPE_OCTET_STRINGS,
+ /** Blow the type up to 32-bits. */
+ RTCRPKCS7ATTRIBUTETYPE_32BIT_HACK = 0x7fffffff
+} RTCRPKCS7ATTRIBUTETYPE;
+
+/**
+ * PKCS \#7 Attribute (IPRT representation).
+ */
+typedef struct RTCRPKCS7ATTRIBUTE
+{
+ /** Sequence core. */
+ RTASN1SEQUENCECORE SeqCore;
+ /** The attribute type (object ID). */
+ RTASN1OBJID Type;
+ /** The type of data found in the values union. */
+ RTCRPKCS7ATTRIBUTETYPE enmType;
+ /** Value allocation. */
+ RTASN1ALLOCATION Allocation;
+ /** Values. */
+ union
+ {
+ /** ASN.1 cores (RTCRPKCS7ATTRIBUTETYPE_UNKNOWN). */
+ PRTASN1SETOFCORES pCores;
+ /** ASN.1 object identifiers (RTCRPKCS7ATTRIBUTETYPE_OBJ_IDS). */
+ PRTASN1SETOFOBJIDS pObjIds;
+ /** ASN.1 octet strings (RTCRPKCS7ATTRIBUTETYPE_OCTET_STRINGS). */
+ PRTASN1SETOFOCTETSTRINGS pOctetStrings;
+ } uValues;
+} RTCRPKCS7ATTRIBUTE;
+/** Pointer to the IPRT representation of a PKCS \#7 Attribute. */
+typedef RTCRPKCS7ATTRIBUTE *PRTCRPKCS7ATTRIBUTE;
+/** Pointer to the const IPRT representation of a PKCS \#7 Attribute. */
+typedef RTCRPKCS7ATTRIBUTE const *PCRTCRPKCS7ATTRIBUTE;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRPKCS7ATTRIBUTE, RTDECL, RTCrPkcs7Attribute, SeqCore.Asn1Core);
+
+RTASN1_IMPL_GEN_SET_OF_TYPEDEFS_AND_PROTOS(RTCRPKCS7ATTRIBUTES, RTCRPKCS7ATTRIBUTE, RTDECL, RTCrPkcs7Attributes);
+
+
+/**
+ * One PKCS \#7 SignerInfo (IPRT representation).
+ */
+typedef struct RTCRPKCS7SIGNERINFO
+{
+ /** Sequence core. */
+ RTASN1SEQUENCECORE SeqCore;
+ /** The structure version (RTCRPKCS7SIGNERINFO_V1). */
+ RTASN1INTEGER Version;
+ /** The issuer and serial number of the certificate used to produce the
+ * encrypted digest below. */
+ RTCRPKCS7ISSUERANDSERIALNUMBER IssuerAndSerialNumber;
+ /** The digest algorithm use to digest the signed content. */
+ RTCRX509ALGORITHMIDENTIFIER DigestAlgorithm;
+ /** Authenticated attributes, optional [0].
+ * @todo Check how other producers formats this. The microsoft one does not
+ * have explicit tags, but combines it with the SET OF. */
+ RTCRPKCS7ATTRIBUTES AuthenticatedAttributes;
+ /** The digest encryption algorithm use to encrypt the digest of the signed
+ * content. */
+ RTCRX509ALGORITHMIDENTIFIER DigestEncryptionAlgorithm;
+ /** The encrypted digest. */
+ RTASN1OCTETSTRING EncryptedDigest;
+ /** Unauthenticated attributes, optional [1].
+ * @todo Check how other producers formats this. The microsoft one does not
+ * have explicit tags, but combines it with the SET OF. */
+ RTCRPKCS7ATTRIBUTES UnauthenticatedAttributes;
+} RTCRPKCS7SIGNERINFO;
+/** Pointer to the IPRT representation of a PKCS \#7 SignerInfo. */
+typedef RTCRPKCS7SIGNERINFO *PRTCRPKCS7SIGNERINFO;
+/** Pointer to the const IPRT representation of a PKCS \#7 SignerInfo. */
+typedef RTCRPKCS7SIGNERINFO const *PCRTCRPKCS7SIGNERINFO;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRPKCS7SIGNERINFO, RTDECL, RTCrPkcs7SignerInfo, SeqCore.Asn1Core);
+RTASN1_IMPL_GEN_SET_OF_TYPEDEFS_AND_PROTOS(RTCRPKCS7SIGNERINFOS, RTCRPKCS7SIGNERINFO, RTDECL, RTCrPkcs7SignerInfos);
+
+/** RTCRPKCS7SIGNERINFO::Version value. */
+#define RTCRPKCS7SIGNERINFO_V1 1
+
+/** @name PKCS \#9 Attribute IDs
+ * @{ */
+/** Content type (RFC-2630 11.1).
+ * Value: Object Identifier */
+#define RTCR_PKCS9_ID_CONTENT_TYPE_OID "1.2.840.113549.1.9.3"
+/** Message digest (RFC-2630 11.2).
+ * Value: Octet string. */
+#define RTCR_PKCS9_ID_MESSAGE_DIGEST_OID "1.2.840.113549.1.9.4"
+/** Signing time (RFC-2630 11.3).
+ * Value: Octet string. */
+#define RTCR_PKCS9_ID_SIGNING_TIME_OID "1.2.840.113549.1.9.5"
+/** Counter signature (RFC-2630 11.4).
+ * Value: SignerInfo. */
+#define RTCR_PKCS9_ID_COUNTER_SIGNATURE_OID "1.2.840.113549.1.9.6"
+/** @} */
+
+
+/**
+ * PKCS \#7 ContentInfo (IPRT representation).
+ */
+typedef struct RTCRPKCS7CONTENTINFO
+{
+ /** Sequence core. */
+ RTASN1SEQUENCECORE SeqCore;
+ /** Object ID identifying the content below. */
+ RTASN1OBJID ContentType;
+ /** Content, optional, explicit tag 0.
+ *
+ * Hack alert! This should've been an explict context tag 0 structure with a
+ * type selected according to ContentType. However, it's simpler to replace the
+ * explicit context with an OCTET STRING with implict tag 0. Then we can tag
+ * along on the encapsulation logic RTASN1OCTETSTRING provides for the dynamic
+ * inner type. The default decoder code will detect known structures as
+ * outlined in the union below, and decode the octet string content as an
+ * anonymous RTASN1CORE if not known.
+ *
+ * If the user want to decode the octet string content differently, it can do so
+ * by destroying and freeing the current encapsulated pointer, replacing it with
+ * it's own. (Of course following the RTASN1OCTETSTRING rules.) Just remember
+ * to also update the value in the union.
+ *
+ * @remarks What's signed and verified is Content.pEncapsulated->uData.pv.
+ */
+ RTASN1OCTETSTRING Content;
+ /** Same as Content.pEncapsulated, except a choice of known types. */
+ union
+ {
+ /** ContentType is RTCRPKCS7SIGNEDDATA_OID. */
+ struct RTCRPKCS7SIGNEDDATA *pSignedData;
+ /** ContentType is RTCRSPCINDIRECTDATACONTENT_OID. */
+ struct RTCRSPCINDIRECTDATACONTENT *pIndirectDataContent;
+ /** Generic / Unknown / User. */
+ PRTASN1CORE pCore;
+ } u;
+} RTCRPKCS7CONTENTINFO;
+/** Pointer to the IPRT representation of a PKCS \#7 ContentInfo. */
+typedef RTCRPKCS7CONTENTINFO *PRTCRPKCS7CONTENTINFO;
+/** Pointer to the const IPRT representation of a PKCS \#7 ContentInfo. */
+typedef RTCRPKCS7CONTENTINFO const *PCRTCRPKCS7CONTENTINFO;
+
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRPKCS7CONTENTINFO, RTDECL, RTCrPkcs7ContentInfo, SeqCore.Asn1Core);
+
+RTDECL(bool) RTCrPkcs7ContentInfo_IsSignedData(PCRTCRPKCS7CONTENTINFO pThis);
+
+
+/**
+ * PKCS \#7 SignedData (IPRT representation).
+ */
+typedef struct RTCRPKCS7SIGNEDDATA
+{
+ /** Sequence core. */
+ RTASN1SEQUENCECORE SeqCore;
+ /** The structure version value (1). */
+ RTASN1INTEGER Version;
+ /** The digest algorithms that are used to signed the content (ContentInfo). */
+ RTCRX509ALGORITHMIDENTIFIERS DigestAlgorithms;
+ /** The content that's being signed. */
+ RTCRPKCS7CONTENTINFO ContentInfo;
+ /** Certificates, optional, implicit tag 0. (Required by Authenticode.) */
+ RTCRX509CERTIFICATES Certificates;
+ /** Certificate revocation lists, optional, implicit tag 1.
+ * Not used by Authenticode, so currently stubbed. */
+ RTASN1CORE Crls;
+ /** Signer infos. */
+ RTCRPKCS7SIGNERINFOS SignerInfos;
+} RTCRPKCS7SIGNEDDATA;
+/** Pointer to the IPRT representation of a PKCS \#7 SignedData. */
+typedef RTCRPKCS7SIGNEDDATA *PRTCRPKCS7SIGNEDDATA;
+/** Pointer to the const IPRT representation of a PKCS \#7 SignedData. */
+typedef RTCRPKCS7SIGNEDDATA const *PCRTCRPKCS7SIGNEDDATA;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRPKCS7SIGNEDDATA, RTDECL, RTCrPkcs7SignedData, SeqCore.Asn1Core);
+
+/** PKCS \#7 SignedData object ID. */
+#define RTCRPKCS7SIGNEDDATA_OID "1.2.840.113549.1.7.2"
+
+/** PKCS \#7 SignedData version number 1. */
+#define RTCRPKCS7SIGNEDDATA_V1 1
+
+
+/** @name RTCRPKCS7SIGNEDDATA_SANITY_F_XXX - Flags for RTPkcs7SignedDataCheckSantiy.
+ * @{ */
+/** Check for authenticode restrictions. */
+#define RTCRPKCS7SIGNEDDATA_SANITY_F_AUTHENTICODE RT_BIT_32(0)
+/** Check that all the hash algorithms are known to IPRT. */
+#define RTCRPKCS7SIGNEDDATA_SANITY_F_ONLY_KNOWN_HASH RT_BIT_32(1)
+/** Require signing certificate to be present. */
+#define RTCRPKCS7SIGNEDDATA_SANITY_F_SIGNING_CERT_PRESENT RT_BIT_32(2)
+/** @} */
+
+
+/**
+ * PKCS \#7 DigestInfo (IPRT representation).
+ */
+typedef struct RTCRPKCS7DIGESTINFO
+{
+ /** Sequence core. */
+ RTASN1SEQUENCECORE SeqCore;
+ /** The digest algorithm use to digest the signed content. */
+ RTCRX509ALGORITHMIDENTIFIER DigestAlgorithm;
+ /** The digest. */
+ RTASN1OCTETSTRING Digest;
+} RTCRPKCS7DIGESTINFO;
+/** Pointer to the IPRT representation of a PKCS \#7 DigestInfo object. */
+typedef RTCRPKCS7DIGESTINFO *PRTCRPKCS7DIGESTINFO;
+/** Pointer to the const IPRT representation of a PKCS \#7 DigestInfo object. */
+typedef RTCRPKCS7DIGESTINFO const *PCRTCRPKCS7DIGESTINFO;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRPKCS7DIGESTINFO, RTDECL, RTCrPkcs7DigestInfo, SeqCore.Asn1Core);
+
+
+/**
+ * Callback function for use with RTCrPkcs7VerifySignedData.
+ *
+ * @returns IPRT status code.
+ * @param pCert The certificate to verify.
+ * @param hCertPaths Unless the certificate is trusted directly, this
+ * is a reference to the certificate path builder
+ * and verifier instance that we used to establish
+ * at least valid trusted path to @a pCert. The
+ * callback can use this to enforce additional
+ * certificate lineage requirements, effective
+ * policy checks and whatnot.
+ * This is NIL_RTCRX509CERTPATHS if the certificate
+ * is directly trusted.
+ * @param pvUser The user argument.
+ * @param pErrInfo Optional error info buffer.
+ */
+typedef DECLCALLBACK(int) RTCRPKCS7VERIFYCERTCALLBACK(PCRTCRX509CERTIFICATE pCert, RTCRX509CERTPATHS hCertPaths,
+ void *pvUser, PRTERRINFO pErrInfo);
+/** Pointer to a RTCRPKCS7VERIFYCERTCALLBACK callback. */
+typedef RTCRPKCS7VERIFYCERTCALLBACK *PRTCRPKCS7VERIFYCERTCALLBACK;
+
+/**
+ * @callback_method_impl{RTCRPKCS7VERIFYCERTCALLBACK,
+ * Default implementation that checks for the DigitalSignature KeyUsage bit.}
+ */
+RTDECL(int) RTCrPkcs7VerifyCertCallbackDefault(PCRTCRX509CERTIFICATE pCert, RTCRX509CERTPATHS hCertPaths,
+ void *pvUser, PRTERRINFO pErrInfo);
+
+/**
+ * @callback_method_impl{RTCRPKCS7VERIFYCERTCALLBACK,
+ * Standard code signing. Use this for Microsoft SPC.}
+ */
+RTDECL(int) RTCrPkcs7VerifyCertCallbackCodeSigning(PCRTCRX509CERTIFICATE pCert, RTCRX509CERTPATHS hCertPaths,
+ void *pvUser, PRTERRINFO pErrInfo);
+
+/**
+ * Verifies PKCS \#7 SignedData.
+ *
+ * For compatability with alternative crypto providers, the user must work on
+ * the top level PKCS \#7 structure instead directly on the SignedData.
+ *
+ * @returns IPRT status code.
+ * @param pContentInfo PKCS \#7 content info structure.
+ * @param fFlags RTCRPKCS7VERIFY_SD_F_XXX.
+ * @param hAdditionalCerts Store containing additional certificates to
+ * supplement those mentioned in the signed data.
+ * @param hTrustedCerts Store containing trusted certificates.
+ * @param pValidationTime The time we're supposed to validate the
+ * certificates chains at.
+ * @param pfnVerifyCert Callback for checking that a certificate used
+ * for signing the data is suitable.
+ * @param pvUser User argument for the callback.
+ * @param pErrInfo Optional error info buffer.
+ */
+RTDECL(int) RTCrPkcs7VerifySignedData(PCRTCRPKCS7CONTENTINFO pContentInfo, uint32_t fFlags,
+ RTCRSTORE hAdditionalCerts, RTCRSTORE hTrustedCerts,
+ PCRTTIMESPEC pValidationTime, PRTCRPKCS7VERIFYCERTCALLBACK pfnVerifyCert, void *pvUser,
+ PRTERRINFO pErrInfo);
+
+/** @name RTCRPKCS7VERIFY_SD_F_XXX - Flags for RTCrPkcs7VerifySignedData
+ * @{ */
+/** @} */
+
+/** @} */
+
+RT_C_DECLS_END
+
+#endif
+
diff --git a/include/iprt/crypto/pkix.h b/include/iprt/crypto/pkix.h
new file mode 100644
index 00000000000..d2714e29864
--- /dev/null
+++ b/include/iprt/crypto/pkix.h
@@ -0,0 +1,391 @@
+/** @file
+ * IPRT - Public Key Infrastructure APIs.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+#ifndef ___iprt_crypto_pkix_h
+#define ___iprt_crypto_pkix_h
+
+#include <iprt/asn1.h>
+
+
+RT_C_DECLS_BEGIN
+
+/** @defgroup grp_rt_crpkix RTCrPkix - Public Key Infrastructure APIs
+ * @ingroup grp_rt_crypto
+ * @{
+ */
+
+/**
+ * Verifies the signature (@a pSignatureValue) of the give data (@a pvData)
+ * using the specfied public key (@a pPublicKey) and algorithm.
+ *
+ * @returns IPRT status code.
+ * @param pAlgorithm The signature algorithm (digest w/ cipher).
+ * @param pParameters Parameter to the public key algorithm. Optional.
+ * @param pPublicKey The public key.
+ * @param pSignatureValue The signature value.
+ * @param pvData The signed data.
+ * @param cbData The amount of signed data.
+ * @param pErrInfo Where to return extended error info. Optional.
+ */
+RTDECL(int) RTCrPkixPubKeyVerifySignature(PCRTASN1OBJID pAlgorithm, PCRTASN1DYNTYPE pParameters, PCRTASN1BITSTRING pPublicKey,
+ PCRTASN1BITSTRING pSignatureValue, const void *pvData, size_t cbData,
+ PRTERRINFO pErrInfo);
+
+
+/**
+ * Gets the cipher OID matching the given signature algorithm.
+ *
+ * @returns Cipher OID string on success, NULL on failure.
+ * @param pAlgorithm The signature algorithm (digest w/ cipher).
+ */
+RTDECL(const char *) RTCrPkixGetCiperOidFromSignatureAlgorithm(PCRTASN1OBJID pAlgorithm);
+
+
+/** @name PKCS-1 Object Identifiers (OIDs)
+ * @{ */
+#define RTCR_PKCS1_OID "1.2.840.113549.1.1"
+#define RTCR_PKCS1_RSA_OID "1.2.840.113549.1.1.1"
+#define RTCR_PKCS1_MD2_WITH_RSA_OID "1.2.840.113549.1.1.2"
+#define RTCR_PKCS1_MD4_WITH_RSA_OID "1.2.840.113549.1.1.3"
+#define RTCR_PKCS1_MD5_WITH_RSA_OID "1.2.840.113549.1.1.4"
+#define RTCR_PKCS1_SHA1_WITH_RSA_OID "1.2.840.113549.1.1.5"
+#define RTCR_PKCS1_RSA_OAEP_ENCRYPTION_SET_OID "1.2.840.113549.1.1.6"
+#define RTCR_PKCS1_RSA_AES_OAEP_OID "1.2.840.113549.1.1.7"
+#define RTCR_PKCS1_MSGF1_OID "1.2.840.113549.1.1.8"
+#define RTCR_PKCS1_P_SPECIFIED_OID "1.2.840.113549.1.1.9"
+#define RTCR_PKCS1_RSASSA_PSS_OID "1.2.840.113549.1.1.10"
+#define RTCR_PKCS1_SHA256_WITH_RSA_OID "1.2.840.113549.1.1.11"
+#define RTCR_PKCS1_SHA384_WITH_RSA_OID "1.2.840.113549.1.1.12"
+#define RTCR_PKCS1_SHA512_WITH_RSA_OID "1.2.840.113549.1.1.13"
+#define RTCR_PKCS1_SHA224_WITH_RSA_OID "1.2.840.113549.1.1.14"
+/** @} */
+
+
+/**
+ * Public key signature scheme provider descriptor.
+ */
+typedef struct RTCRPKIXSIGNATUREDESC
+{
+ /** The signature scheme provider name. */
+ const char *pszName;
+ /** The object ID string. */
+ const char *pszObjId;
+ /** Pointer to a NULL terminated table of alias object IDs (optional). */
+ const char * const *papszObjIdAliases;
+ /** The size of the state. */
+ uint32_t cbState;
+ /** Reserved for future / explicit padding. */
+ uint32_t uReserved;
+ /** Provider specific field. This generally indicates the kind of padding
+ * scheme to employ with the given OID. */
+ uintptr_t uProviderSpecific;
+
+ /**
+ * Initializes the state of the signature scheme provider.
+ *
+ * Optional, RT_BZERO will be used if NULL.
+ *
+ * @returns IPRT status code.
+ * @param pDesc Pointer to this structure (for uProviderSpecific).
+ * @param pvState The opaque provider state.
+ * @param pvOpaque Opaque provider specific parameter.
+ * @param fSigning Set if a signing operation is going to be performed,
+ * clear if it is a verification. This is a fixed
+ * setting for the lifetime of the instance due to the
+ * algorithm requiring different keys.
+ * @param pKey The key to use (whether private or public depends on
+ * the operation).
+ * @param pParams Algorithm/key parameters, optional. Will be NULL if
+ * none.
+ */
+ DECLCALLBACKMEMBER(int, pfnInit)(struct RTCRPKIXSIGNATUREDESC const *pDesc, void *pvState, void *pvOpaque, bool fSigning,
+ PCRTASN1BITSTRING pKey, PCRTASN1DYNTYPE pParams);
+
+ /**
+ * Resets the state before performing another signing or verification.
+ *
+ * Optional. It is assumed that the provider does not have any state needing to
+ * be re-initialized if this method is not implemented.
+ *
+ * @returns IPRT status code.
+ * @param pDesc Pointer to this structure (for uProviderSpecific).
+ * @param pvState The opaque provider state.
+ * @param fSigning Exactly the same value as the init call.
+ */
+ DECLCALLBACKMEMBER(int, pfnReset)(struct RTCRPKIXSIGNATUREDESC const *pDesc, void *pvState, bool fSigning);
+
+ /**
+ * Deletes the provider state. Optional.
+ *
+ * The state will be securely wiped clean after the call, regardless of whether
+ * the method is implemented or not.
+ *
+ * @param pDesc Pointer to this structure (for uProviderSpecific).
+ * @param pvState The opaque provider state.
+ * @param fSigning Exactly the same value as the init call.
+ */
+ DECLCALLBACKMEMBER(void, pfnDelete)(struct RTCRPKIXSIGNATUREDESC const *pDesc, void *pvState, bool fSigning);
+
+ /**
+ * Verifies a signed message digest (fSigning = false).
+ *
+ * @returns IPRT status code.
+ * @retval VINF_SUCCESS if the signature checked out correctly.
+ * @retval VERR_PKIX_KEY wrong key or some other key issue.
+ *
+ * @param pDesc Pointer to this structure (for uProviderSpecific).
+ * @param pvState The opaque provider state.
+ * @param hDigest The handle to the digest. Call RTCrDigestFinal to
+ * complete and retreive the final hash value.
+ * @param pvSignature The signature to validate.
+ * @param cbSignature The size of the signature (in bytes).
+ */
+ DECLCALLBACKMEMBER(int, pfnVerify)(struct RTCRPKIXSIGNATUREDESC const *pDesc, void *pvState,
+ RTCRDIGEST hDigest, void const *pvSignature, size_t cbSignature);
+
+ /**
+ * Sign a message digest (fSigning = true).
+ *
+ * @returns IPRT status code.
+ * @retval VINF_SUCCESS on success.
+ * @retval VERR_PKIX_KEY wrong key or some other key issue.
+ * @retval VERR_BUFFER_OVERFLOW if the signature buffer is too small, the
+ * require buffer size will be available in @a *pcbSignature.
+ *
+ * @param pDesc Pointer to this structure (for uProviderSpecific).
+ * @param pvState The opaque provider state.
+ * @param hDigest The handle to the digest. Call RTCrDigestFinal to
+ * complete and retreive the final hash value.
+ * @param pvSignature The output signature buffer.
+ * @param pcbSignature On input the variable pointed to holds the size of
+ * the buffer @a pvSignature points to.
+ * On return the variable pointed to is set to the size
+ * of the returned signature, or the required size in
+ * case of VERR_BUFFER_OVERFLOW.
+ */
+ DECLCALLBACKMEMBER(int, pfnSign)(struct RTCRPKIXSIGNATUREDESC const *pDesc, void *pvState,
+ RTCRDIGEST hDigest, void *pvSignature, size_t *pcbSignature);
+
+} RTCRPKIXSIGNATUREDESC;
+/** Pointer to a public key signature scheme provider descriptor. */
+typedef RTCRPKIXSIGNATUREDESC const *PCRTCRPKIXSIGNATUREDESC;
+
+
+PCRTCRPKIXSIGNATUREDESC RTCrPkixSignatureFindByObjIdString(const char *pszObjId, void *ppvOpaque);
+PCRTCRPKIXSIGNATUREDESC RTCrPkixSignatureFindByObjId(PCRTASN1OBJID pObjId, void *ppvOpaque);
+RTDECL(int) RTCrPkixSignatureCreateByObjIdString(PRTCRPKIXSIGNATURE phSignature, const char *pszObjId, bool fSigning,
+ PCRTASN1BITSTRING pKey,PCRTASN1DYNTYPE pParams);
+RTDECL(int) RTCrPkixSignatureCreateByObjId(PRTCRPKIXSIGNATURE phSignature, PCRTASN1OBJID pObjId, bool fSigning,
+ PCRTASN1BITSTRING pKey, PCRTASN1DYNTYPE pParams);
+
+
+RTDECL(int) RTCrPkixSignatureCreate(PRTCRPKIXSIGNATURE phSignature, PCRTCRPKIXSIGNATUREDESC pDesc, void *pvOpaque,
+ bool fSigning, PCRTASN1BITSTRING pKey, PCRTASN1DYNTYPE pParams);
+RTDECL(uint32_t) RTCrPkixSignatureRetain(RTCRPKIXSIGNATURE hSignature);
+RTDECL(uint32_t) RTCrPkixSignatureRelease(RTCRPKIXSIGNATURE hSignature);
+RTDECL(int) RTCrPkixSignatureVerify(RTCRPKIXSIGNATURE hSignature, RTCRDIGEST hDigest,
+ void const *pvSignature, size_t cbSignature);
+RTDECL(int) RTCrPkixSignatureVerifyBitString(RTCRPKIXSIGNATURE hSignature, RTCRDIGEST hDigest, PCRTASN1BITSTRING pSignature);
+RTDECL(int) RTCrPkixSignatureVerifyOctetString(RTCRPKIXSIGNATURE hSignature, RTCRDIGEST hDigest, PCRTASN1OCTETSTRING pSignature);
+RTDECL(int) RTCrPkixSignatureSign(RTCRPKIXSIGNATURE hSignature, RTCRDIGEST hDigest,
+ void *pvSignature, size_t *pcbSignature);
+
+
+/**
+ * Public key encryption scheme provider descriptor.
+ *
+ * @todo This is just a sketch left over from when the signature code was
+ * chiseled out.
+ */
+typedef struct RTCRPKIXENCRYPTIONDESC
+{
+ /** The encryption scheme provider name. */
+ const char *pszName;
+ /** The object ID string. */
+ const char *pszObjId;
+ /** Pointer to a NULL terminated table of alias object IDs (optional). */
+ const char * const *papszObjIdAliases;
+ /** The size of the state. */
+ uint32_t cbState;
+ /** Reserved for future use / padding. */
+ uint32_t uReserved;
+ /** Provider specific field. */
+ uintptr_t uProviderSpecific;
+
+ /**
+ * Initializes the state for this encryption scheme.
+ *
+ * Optional, RT_BZERO will be used if NULL.
+ *
+ * @returns IPRT status code.
+ * @param pDesc Pointer to this structure (so uProviderSpecific can
+ * be read).
+ * @param pvState The opaque provider state.
+ * @param pvOpaque Opaque provider specific parameter.
+ * @param fEncrypt Set if the instance will be encrypting, clear if it
+ * will be decrypting. This aspect of the instance is
+ * immutable due to the algorithm requiring different
+ * keys for each of the operations.
+ * @param pKey The key to use (whether private or public depends on
+ * the operation type).
+ * @param pParams Algorithm/key parameters, optional. Will be NULL if
+ * none.
+ */
+ DECLCALLBACKMEMBER(int, pfnInit)(struct RTCRPKIXENCRYPTIONDESC const *pDesc, void *pvState, void *pvOpaque, bool fEncrypt,
+ PCRTASN1BITSTRING pKey, PCRTASN1DYNTYPE pParams);
+
+ /**
+ * Re-initializes the provider state.
+ *
+ * Optional. It is assumed that the provider does not have any state needing
+ * to be re-initialized if this method is not implemented. (Do not assume that
+ * a final encrypt/decrypt call has been made prior to this call.)
+ *
+ * @returns IPRT status code.
+ * @param pDesc Pointer to this structure (so uProviderSpecific can
+ * be read).
+ * @param pvState The opaque provider state.
+ * @param enmOperation Same as for the earlier pfnInit call.
+ */
+ DECLCALLBACKMEMBER(int, pfnReset)(struct RTCRPKIXENCRYPTIONDESC const *pDesc, void *pvState, bool fEncrypt);
+
+ /**
+ * Deletes the provider state. Optional.
+ *
+ * The state will be securely wiped clean after the call, regardless of whether
+ * the method is implemented or not.
+ *
+ * @param pDesc Pointer to this structure (so uProviderSpecific can
+ * be read).
+ * @param pvState The opaque provider state.
+ * @param enmOperation Same as for the earlier pfnInit call.
+ */
+ DECLCALLBACKMEMBER(void, pfnDelete)(struct RTCRPKIXENCRYPTIONDESC const *pDesc, void *pvState, bool fEncrypt);
+
+ /**
+ * Encrypt using the public key (fEncrypt = true).
+ *
+ * @returns IPRT status code.
+ * @retval VINF_SUCCESS on success.
+ * @retval VERR_PKIX_KEY wrong key or some other key issue.
+ * @retval VERR_BUFFER_OVERFLOW if the output buffer is too small, the require
+ * buffer size will be available in @a *pcbCiphertext. The caller can
+ * should retry the call with a larger buffer.
+ *
+ * @param pDesc Pointer to this structure (so uProviderSpecific can
+ * be read).
+ * @param pvState The opaque provider state.
+ * @param pvPlaintext The plaintext to encrypt.
+ * @param cbPlaintext The number of bytes of plaintext.
+ * @param pvCiphertext Where to return the ciphertext (if any).
+ * @param cbMaxCiphertext The size of the buffer @a pvCiphertext points to.
+ * @param pcbCiphertext Where to return the actual number of bytes of
+ * ciphertext returned.
+ * @param fFinal Whether this is the final call.
+ */
+ DECLCALLBACKMEMBER(int, pfnEncrypt)(struct RTCRPKIXENCRYPTIONDESC const *pDesc, void *pvState,
+ void const *pvPlaintext, size_t cbPlaintext,
+ void *pvCiphertext, size_t cbMaxCiphertext, size_t *pcbCiphertext, bool fFinal);
+
+ /**
+ * Calculate the output buffer size for the next pfnEncrypt call.
+ *
+ * @returns IPRT status code.
+ * @param pDesc Pointer to this structure (so uProviderSpecific can
+ * be read).
+ * @param pvState The opaque provider state.
+ * @param cbPlaintext The number of bytes of plaintext.
+ * @param pcbCiphertext Where to return the minimum buffer size. This may
+ * be larger than the actual number of bytes return.
+ * @param fFinal Whether this is the final call.
+ */
+ DECLCALLBACKMEMBER(int, pfnEncryptLength)(struct RTCRPKIXENCRYPTIONDESC const *pDesc, void *pvState,
+ size_t cbPlaintext, size_t *pcbCiphertext, bool fFinal);
+
+ /**
+ * Decrypt using the private key (fEncrypt = false).
+ *
+ * @returns IPRT status code.
+ * @retval VINF_SUCCESS on success.
+ * @retval VERR_PKIX_KEY wrong key or some other key issue.
+ * @retval VERR_BUFFER_OVERFLOW if the output buffer is too small, the require
+ * buffer size will be available in @a *pcbCiphertext. The caller can
+ * should retry the call with a larger buffer.
+ *
+ * @param pDesc Pointer to this structure (so uProviderSpecific can
+ * be read).
+ * @param pvState The opaque provider state.
+ * @param pvCiphertext The ciphertext to decrypt.
+ * @param cbCiphertext The number of bytes of ciphertext.
+ * @param pvPlaintext Where to return the plaintext (if any).
+ * @param cbMaxPlaintext The size of the buffer @a pvPlaintext points to.
+ * @param pcbPlaintext Where to return the actual number of bytes of
+ * plaintext returned.
+ * @param fFinal Whether this is the final call.
+ */
+ DECLCALLBACKMEMBER(int, pfnDecrypt)(struct RTCRPKIXENCRYPTIONDESC const *pDesc, void *pvState,
+ void const *pvCiphertext, size_t cbCiphertext,
+ void *pvPlaintext, size_t cbMaxPlaintext, size_t *pcbPlaintext, bool fFinal);
+
+ /**
+ * Calculate the output buffer size for the next pfnDecrypt call.
+ *
+ * @returns IPRT status code.
+ * @param pDesc Pointer to this structure (so uProviderSpecific can
+ * be read).
+ * @param pvState The opaque provider state.
+ * @param cbCiphertext The number of bytes of ciphertext.
+ * @param pcbPlaintext Where to return the minimum buffer size. This may
+ * be larger than the actual number of bytes return.
+ * @param fFinal Whether this is the final call.
+ */
+ DECLCALLBACKMEMBER(int, pfnDecryptLength)(struct RTCRPKIXENCRYPTIONDESC const *pDesc, void *pvState,
+ size_t cbCiphertext, size_t *pcbPlaintext, bool fFinal);
+} RTCRPKIXENCRYPTIONDESC;
+/** Pointer to a public key encryption schema provider descriptor. */
+typedef RTCRPKIXENCRYPTIONDESC const *PCRTCRPKIXENCRYPTIONDESC;
+
+
+PCRTCRPKIXENCRYPTIONDESC RTCrPkixEncryptionFindByObjIdString(const char *pszObjId, void *ppvOpaque);
+PCRTCRPKIXENCRYPTIONDESC RTCrPkixEncryptionFindByObjId(PCRTASN1OBJID pObjId, void *ppvOpaque);
+RTDECL(int) RTCrPkixEncryptionCreateByObjIdString(PRTCRPKIXENCRYPTION phEncryption, const char *pszObjId,
+ bool fEncrypt, PCRTASN1BITSTRING pKey,PCRTASN1DYNTYPE pParams);
+RTDECL(int) RTCrPkixEncryptionCreateByObjId(PRTCRPKIXENCRYPTION phEncryption, PCRTASN1OBJID pObjId, bool fEncrypt,
+ PCRTASN1BITSTRING pKey, PCRTASN1DYNTYPE pParams);
+
+
+RTDECL(int) RTCrPkixEncryptionCreate(PRTCRPKIXENCRYPTION phEncryption, PCRTCRPKIXENCRYPTIONDESC pDesc, void *pvOpaque,
+ bool fEncrypt, PCRTASN1BITSTRING pKey, PCRTASN1DYNTYPE pParams);
+RTDECL(int) RTCrPkixEncryptionReset(RTCRPKIXENCRYPTION hEncryption);
+RTDECL(uint32_t) RTCrPkixEncryptionRetain(RTCRPKIXENCRYPTION hEncryption);
+RTDECL(uint32_t) RTCrPkixEncryptionRelease(RTCRPKIXENCRYPTION hEncryption);
+
+
+/** @} */
+
+RT_C_DECLS_END
+
+#endif
+
diff --git a/include/iprt/crypto/rsa.h b/include/iprt/crypto/rsa.h
new file mode 100644
index 00000000000..71cb042fcb6
--- /dev/null
+++ b/include/iprt/crypto/rsa.h
@@ -0,0 +1,148 @@
+/** @file
+ * IPRT - Crypto - RSA Public Key Cryptosystem .
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+#ifndef ___iprt_crypto_spc_h
+#define ___iprt_crypto_spc_h
+
+#include <iprt/asn1.h>
+#include <iprt/crypto/x509.h>
+#include <iprt/crypto/pkcs7.h>
+#include <iprt/md5.h>
+#include <iprt/sha.h>
+
+
+RT_C_DECLS_BEGIN
+
+/** @defgroup grp_rt_spc RTCrRsa - RSA Public Key Cryptosystem
+ * @ingroup grp_rt_crypto
+ * @{
+ */
+
+/**
+ * RSA public key - ASN.1 IPRT representation.
+ */
+typedef struct RTCRRSAPUBLICKEY
+{
+ /** Sequence core for the structure. */
+ RTASN1SEQUENCECORE SeqCore;
+ /** The modulus (n). */
+ RTASN1INTEGER Modulus;
+ /** The public exponent (e). */
+ RTASN1INTEGER PublicExponent;
+} RTCRRSAPUBLICKEY;
+/** Pointer to the ASN.1 IPRT representation of an RSA public key. */
+typedef RTCRRSAPUBLICKEY *PRTCRRSAPUBLICKEY;
+/** Pointer to the const ASN.1 IPRT representation of an RSA public key. */
+typedef RTCRRSAPUBLICKEY const *PCRTCRRSAPUBLICKEY;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRRSAPUBLICKEY, RTDECL, RTCrRsaPublicKey, SeqCore.Asn1Core);
+
+
+/**
+ * RSA other prime info (ASN.1 IPRT representation).
+ */
+typedef struct RTCRRSAOTHERPRIMEINFO
+{
+ /** Sequence core for the structure. */
+ RTASN1SEQUENCECORE SeqCore;
+ /** The prime (ri). */
+ RTASN1INTEGER Prime;
+ /** The exponent (di). */
+ RTASN1INTEGER Exponent;
+ /** The coefficient (ti). */
+ RTASN1INTEGER Coefficient;
+} RTCRRSAOTHERPRIMEINFO;
+/** Pointer to the ASN.1 IPRT representation of RSA other prime info. */
+typedef RTCRRSAOTHERPRIMEINFO *PRTCRRSAOTHERPRIMEINFO;
+/** Pointer to the const ASN.1 IPRT representation of RSA other prime info. */
+typedef RTCRRSAOTHERPRIMEINFO const *PCRTCRRSAOTHERPRIMEINFO;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRRSAOTHERPRIMEINFO, RTDECL, RTCrRsaOtherPrimeInfo, SeqCore.Asn1Core);
+RTASN1_IMPL_GEN_SEQ_OF_TYPEDEFS_AND_PROTOS(RTCRRSAOTHERPRIMEINFOS, RTCRRSAOTHERPRIMEINFO, RTDECL, RTCrRsaOtherPrimeInfos);
+
+/**
+ * RSA private key - ASN.1 IPRT representation.
+ */
+typedef struct RTCRRSAPRIVATEKEY
+{
+ /** Sequence core for the structure. */
+ RTASN1SEQUENCECORE SeqCore;
+ /** Key version number. */
+ RTASN1INTEGER Version;
+ /** The modulus (n). */
+ RTASN1INTEGER Modulus;
+ /** The public exponent (e). */
+ RTASN1INTEGER PublicExponent;
+ /** The private exponent (d). */
+ RTASN1INTEGER PrivateExponent;
+ /** The first prime factor (p) of the modulus (n). */
+ RTASN1INTEGER Prime1;
+ /** The second prime factor (q) of the modulus (n). */
+ RTASN1INTEGER Prime2;
+ /** The first exponent (d mod (p-1)). */
+ RTASN1INTEGER Exponent1;
+ /** The second exponent (d mod (q-1)). */
+ RTASN1INTEGER Exponent2;
+ /** The coefficient ((inverse of q) mod p). */
+ RTASN1INTEGER Coefficient;
+ /** Optional other prime information (version must be 'multi' if present). */
+ RTCRRSAOTHERPRIMEINFOS OtherPrimeInfos;
+} RTCRRSAPRIVATEKEY;
+/** Pointer to the ASN.1 IPRT representation of an RSA private key. */
+typedef RTCRRSAPRIVATEKEY *PRTCRRSAPRIVATEKEY;
+/** Pointer to the const ASN.1 IPRT representation of an RSA private key. */
+typedef RTCRRSAPRIVATEKEY const *PCRTCRRSAPRIVATEKEY;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRRSAPRIVATEKEY, RTDECL, RTCrRsaPrivateKey, SeqCore.Asn1Core);
+
+/** @name RSA Private Key Versions
+ * @{ */
+#define RTCRRSAPRIVATEKEY_VERSION_TWO_PRIME 0
+#define RTCRRSAPRIVATEKEY_VERSION_MULTI 1
+/** @} */
+
+
+/**
+ * RSA DigestInfo used by the EMSA-PKCS1-v1_5 encoding method.
+ */
+typedef struct RTCRRSADIGESTINFO
+{
+ /** Sequence core for the structure. */
+ RTASN1SEQUENCECORE SeqCore;
+ /** The digest algorithm. */
+ RTCRX509ALGORITHMIDENTIFIER DigestAlgorithm;
+ /** The digest. */
+ RTASN1OCTETSTRING Digest;
+} RTCRRSADIGESTINFO;
+/** Pointer to the ASN.1 IPRT representation of RSA digest info. */
+typedef RTCRRSADIGESTINFO *PRTCRRSADIGESTINFO;
+/** Pointer to the const ASN.1 IPRT representation of RSA digest info. */
+typedef RTCRRSADIGESTINFO const *PCRTCRRSADIGESTINFO;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRRSADIGESTINFO, RTDECL, RTCrRsaDigestInfo, SeqCore.Asn1Core);
+
+/** @} */
+
+RT_C_DECLS_END
+
+#endif
+
+
diff --git a/include/iprt/crypto/spc.h b/include/iprt/crypto/spc.h
new file mode 100644
index 00000000000..1710582f835
--- /dev/null
+++ b/include/iprt/crypto/spc.h
@@ -0,0 +1,483 @@
+/** @file
+ * IPRT - Crypto - Microsoft SPC / Authenticode.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+#ifndef ___iprt_crypto_spc_h
+#define ___iprt_crypto_spc_h
+
+#include <iprt/asn1.h>
+#include <iprt/crypto/x509.h>
+#include <iprt/crypto/pkcs7.h>
+#include <iprt/md5.h>
+#include <iprt/sha.h>
+
+
+RT_C_DECLS_BEGIN
+
+/** @defgroup grp_rt_spc RTCrSpc - Microsoft Authenticode
+ * @ingroup grp_rt_crypto
+ * @{
+ */
+
+/**
+ * PE Image page hash table, version 2.
+ */
+typedef union RTCRSPCPEIMAGEPAGEHASHESV2
+{
+ /** MD5 page hashes. */
+ struct
+ {
+ /** The file offset. */
+ uint32_t offFile;
+ /** The hash. */
+ uint8_t abHash[RTSHA1_HASH_SIZE];
+ } aMd5[1];
+
+ /** SHA-1 page hashes. */
+ struct
+ {
+ /** The file offset. */
+ uint32_t offFile;
+ /** The hash. */
+ uint8_t abHash[RTSHA1_HASH_SIZE];
+ } aSha1[1];
+
+ /** SHA-256 page hashes. */
+ struct
+ {
+ /** The file offset. */
+ uint32_t offFile;
+ /** The hash. */
+ uint8_t abHash[RTSHA256_HASH_SIZE];
+ } aSha256[1];
+
+ /** SHA-512 page hashes. */
+ struct
+ {
+ /** The file offset. */
+ uint32_t offFile;
+ /** The hash. */
+ uint8_t abHash[RTSHA512_HASH_SIZE];
+ } aSha512[1];
+} RTCRSPCPEIMAGEPAGEHASHESV2;
+/** Pointer to a version 2 PE image hash table. */
+typedef RTCRSPCPEIMAGEPAGEHASHESV2 *PRTCRSPCPEIMAGEPAGEHASHESV2;
+/** Pointer to a const version 2 PE image hash table. */
+typedef RTCRSPCPEIMAGEPAGEHASHESV2 const *PCRTCRSPCPEIMAGEPAGEHASHESV2;
+
+
+/**
+ * Serialization wrapper for raw RTCRSPCPEIMAGEPAGEHASHESV2 data.
+ */
+typedef struct RTCRSPCSERIALIZEDPAGEHASHESV2
+{
+ /** The page hashes are within a set. Dunno if there could be multiple
+ * entries in this set, never seen it yet, so I doubt it. */
+ RTASN1SETCORE SetCore;
+ /** Octet string containing the raw data. */
+ RTASN1OCTETSTRING RawData;
+
+ /** Pointer to the hash data within that string.
+ * The hash algorithm is the same as for the full image hash and given in
+ * RTCRPKCS7SIGNEDDATA::SignerInfos.paSignerInfos[0].DigestAlgorithm as well as
+ * in RTCRSPCINDIRECTDATACONTENT::DigestInfo.DigestAlgorithm. */
+ PCRTCRSPCPEIMAGEPAGEHASHESV2 pData;
+ /** Field the user can use to store the number of pages in pData. */
+ uint32_t cPages;
+} RTCRSPCSERIALIZEDPAGEHASHESV2;
+/** Pointer to a serialized object attribute. */
+typedef RTCRSPCSERIALIZEDPAGEHASHESV2 *PRTCRSPCSERIALIZEDPAGEHASHESV2;
+/** Pointer to a const serialized object attribute. */
+typedef RTCRSPCSERIALIZEDPAGEHASHESV2 const *PCRTCRSPCSERIALIZEDPAGEHASHESV2;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRSPCSERIALIZEDPAGEHASHESV2, RTDECL, RTCrSpcSerializedPageHashesV2, SetCore.Asn1Core);
+
+RTDECL(int) RTCrSpcSerializedPageHashesV2_UpdateDerivedData(PRTCRSPCSERIALIZEDPAGEHASHESV2 pThis);
+
+
+/**
+ * Data type selection for RTCRSPCSERIALIZEDOBJECTATTRIBUTE.
+ */
+typedef enum RTCRSPCSERIALIZEDOBJECTATTRIBUTETYPE
+{
+ /** Invalid zero entry. */
+ RTCRSPCSERIALIZEDOBJECTATTRIBUTETYPE_INVALID = 0,
+ /** Not present pro forma. */
+ RTCRSPCSERIALIZEDOBJECTATTRIBUTETYPE_NOT_PRESENT,
+ /** Unknown object. */
+ RTCRSPCSERIALIZEDOBJECTATTRIBUTETYPE_UNKNOWN,
+ /** Page hashes v2 (pPageHashesV2). */
+ RTCRSPCSERIALIZEDOBJECTATTRIBUTETYPE_PAGE_HASHES_V2,
+ /** End of valid values. */
+ RTCRSPCSERIALIZEDOBJECTATTRIBUTETYPE_END,
+ /** Blow up the type to at least 32-bits. */
+ RTCRSPCSERIALIZEDOBJECTATTRIBUTETYPE_32BIT_HACK
+} RTCRSPCSERIALIZEDOBJECTATTRIBUTETYPE;
+
+/**
+ * One serialized object attribute (PE image data).
+ */
+typedef struct RTCRSPCSERIALIZEDOBJECTATTRIBUTE
+{
+ /** Sequence core. */
+ RTASN1SEQUENCECORE SeqCore;
+ /** The attribute type. */
+ RTASN1OBJID Type;
+ /** The allocation of the data type. */
+ RTASN1ALLOCATION Allocation;
+ /** Indicates the valid value in the union. */
+ RTCRSPCSERIALIZEDOBJECTATTRIBUTETYPE enmType;
+ /** Union with data format depending on the Type. */
+ union
+ {
+ /** The unknown value (RTCRSPCSERIALIZEDOBJECTATTRIBUTETYPE_UNKNOWN). */
+ PRTASN1CORE pCore;
+ /** Page hashes v2 (RTCRSPCSERIALIZEDOBJECTATTRIBUTETYPE_PAGE_HASHES_V2). */
+ PRTCRSPCSERIALIZEDPAGEHASHESV2 pPageHashesV2;
+ } u;
+} RTCRSPCSERIALIZEDOBJECTATTRIBUTE;
+/** Pointer to a serialized object attribute. */
+typedef RTCRSPCSERIALIZEDOBJECTATTRIBUTE *PRTCRSPCSERIALIZEDOBJECTATTRIBUTE;
+/** Pointer to a const serialized object attribute. */
+typedef RTCRSPCSERIALIZEDOBJECTATTRIBUTE const *PCRTCRSPCSERIALIZEDOBJECTATTRIBUTE;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRSPCSERIALIZEDOBJECTATTRIBUTE, RTDECL, RTCrSpcSerializedObjectAttribute, SeqCore.Asn1Core);
+
+/** @name RTCRSPCSERIALIZEDOBJECTATTRIBUTE::Type values
+ * @{ */
+/** Serialized object attribute type for page hashes version 1. */
+#define RTCRSPC_PE_IMAGE_HASHES_V1_OID "1.3.6.1.4.1.311.2.3.1"
+/** Serialized object attribute type for page hashes version 2. */
+#define RTCRSPC_PE_IMAGE_HASHES_V2_OID "1.3.6.1.4.1.311.2.3.2"
+/** @} */
+
+
+/*
+ * Set of serialized object attributes (PE image data).
+ */
+RTASN1_IMPL_GEN_SET_OF_TYPEDEFS_AND_PROTOS(RTCRSPCSERIALIZEDOBJECTATTRIBUTES, RTCRSPCSERIALIZEDOBJECTATTRIBUTE, RTDECL,
+ RTCrSpcSerializedObjectAttributes);
+
+/** The UUID found in RTCRSPCSERIALIZEDOBJECT::Uuid for
+ * RTCRSPCSERIALIZEDOBJECTATTRIBUTES. */
+#define RTCRSPCSERIALIZEDOBJECT_UUID_STR "d586b5a6-a1b4-6624-ae05-a217da8e60d6"
+
+
+/**
+ * Decoded encapsulated data type selection in RTCRSPCSERIALIZEDOBJECT.
+ */
+typedef enum RTCRSPCSERIALIZEDOBJECTTYPE
+{
+ /** Invalid zero value. */
+ RTCRSPCSERIALIZEDOBJECTTYPE_INVALID = 0,
+ /** Serialized object attributes (RTCRSPCSERIALIZEDOBJECT_UUID_STR / pAttribs). */
+ RTCRSPCSERIALIZEDOBJECTTYPE_ATTRIBUTES,
+ /** End of valid values. */
+ RTCRSPCSERIALIZEDOBJECTTYPE_END,
+ /** MAke sure the type is at least 32-bit wide. */
+ RTCRSPCSERIALIZEDOBJECTTYPE_32BIT_HACK = 0x7fffffff
+} RTCRSPCSERIALIZEDOBJECTTYPE;
+
+/**
+ * A serialized object (PE image data).
+ */
+typedef struct RTCRSPCSERIALIZEDOBJECT
+{
+ /** Sequence core. */
+ RTASN1SEQUENCECORE SeqCore;
+ /** The UUID of the data object. */
+ RTASN1OCTETSTRING Uuid;
+ /** Serialized data object. */
+ RTASN1OCTETSTRING SerializedData;
+
+ /** Indicates the valid pointer in the union. */
+ RTCRSPCSERIALIZEDOBJECTTYPE enmType;
+ /** Union of pointers shadowing SerializedData.pEncapsulated. */
+ union
+ {
+ /** Generic core pointer. */
+ PRTASN1CORE pCore;
+ /** Pointer to decoded data if Uuid is RTCRSPCSERIALIZEDOBJECT_UUID_STR. */
+ PRTCRSPCSERIALIZEDOBJECTATTRIBUTES pData;
+ } u;
+} RTCRSPCSERIALIZEDOBJECT;
+/** Pointer to a serialized object (PE image data). */
+typedef RTCRSPCSERIALIZEDOBJECT *PRTCRSPCSERIALIZEDOBJECT;
+/** Pointer to a const serialized object (PE image data). */
+typedef RTCRSPCSERIALIZEDOBJECT const *PCRTCRSPCSERIALIZEDOBJECT;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRSPCSERIALIZEDOBJECT, RTDECL, RTCrSpcSerializedObject, SeqCore.Asn1Core);
+
+
+/**
+ * RTCRSPCSTRING choices.
+ */
+typedef enum RTCRSPCSTRINGCHOICE
+{
+ /** Invalid zero value. */
+ RTCRSPCSTRINGCHOICE_INVALID = 0,
+ /** Not present. */
+ RTCRSPCSTRINGCHOICE_NOT_PRESENT,
+ /** UCS-2 string (pUcs2). */
+ RTCRSPCSTRINGCHOICE_UCS2,
+ /** ASCII string (pAscii). */
+ RTCRSPCSTRINGCHOICE_ASCII,
+ /** End of valid values. */
+ RTCRSPCSTRINGCHOICE_END,
+ /** Blow the type up to 32-bit. */
+ RTCRSPCSTRINGCHOICE_32BIT_HACK = 0x7fffffff
+} RTCRSPCSTRINGCHOICE;
+
+/**
+ * Stupid microsoft choosy string type.
+ */
+typedef struct RTCRSPCSTRING
+{
+ /** Dummy core. */
+ RTASN1DUMMY Dummy;
+ /** Allocation of what the pointer below points to. */
+ RTASN1ALLOCATION Allocation;
+ /** Pointer choice.*/
+ RTCRSPCSTRINGCHOICE enmChoice;
+ /** Pointer union. */
+ union
+ {
+ /** Tag 0, implicit: UCS-2 (BMP) string. */
+ PRTASN1STRING pUcs2;
+ /** Tag 1, implicit: ASCII (IA5) string. */
+ PRTASN1STRING pAscii;
+ } u;
+} RTCRSPCSTRING;
+/** Pointer to a stupid microsoft string choice. */
+typedef RTCRSPCSTRING *PRTCRSPCSTRING;
+/** Pointer to a const stupid microsoft string choice. */
+typedef RTCRSPCSTRING const *PCRTCRSPCSTRING;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRSPCSTRING, RTDECL, RTCrSpcString, Dummy.Asn1Core);
+
+
+/**
+ * RTCRSPCSTRING choices.
+ */
+typedef enum RTCRSPCLINKCHOICE
+{
+ /** Invalid zero value. */
+ RTCRSPCLINKCHOICE_INVALID = 0,
+ /** Not present. */
+ RTCRSPCLINKCHOICE_NOT_PRESENT,
+ /** URL (ASCII) string (pUrl). */
+ RTCRSPCLINKCHOICE_URL,
+ /** Serialized object (pMoniker). */
+ RTCRSPCLINKCHOICE_MONIKER,
+ /** Filename (pT2). */
+ RTCRSPCLINKCHOICE_FILE,
+ /** End of valid values. */
+ RTCRSPCLINKCHOICE_END,
+ /** Blow the type up to 32-bit. */
+ RTCRSPCLINKCHOICE_32BIT_HACK = 0x7fffffff
+} RTCRSPCLINKCHOICE;
+
+/**
+ * PE image data link.
+ */
+typedef struct RTCRSPCLINK
+{
+ /** Dummy core. */
+ RTASN1DUMMY Dummy;
+ /** Allocation of what the pointer below points to. */
+ RTASN1ALLOCATION Allocation;
+ /** Pointer choice.*/
+ RTCRSPCLINKCHOICE enmChoice;
+ /** Pointer union. */
+ union
+ {
+ /** Tag 0, implicit: An URL encoded as an IA5 STRING. */
+ PRTASN1STRING pUrl;
+ /** Tag 1, implicit: A serialized object. */
+ PRTCRSPCSERIALIZEDOBJECT pMoniker;
+ /** Tag 2, explicit: The default, a file name.
+ * Documented to be set to "<<<Obsolete>>>" when used. */
+ struct
+ {
+ /** Context tag 2. */
+ RTASN1CONTEXTTAG2 CtxTag2;
+ /** The file name string. */
+ RTCRSPCSTRING File;
+ } *pT2;
+ } u;
+} RTCRSPCLINK;
+/** Poitner to a PE image data link. */
+typedef RTCRSPCLINK *PRTCRSPCLINK;
+/** Poitner to a const PE image data link. */
+typedef RTCRSPCLINK const *PCRTCRSPCLINK;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRSPCLINK, RTDECL, RTCrSpcLink, Dummy.Asn1Core);
+
+
+#if 0 /** @todo Might not be the correct bit order. */
+/**
+ * Flag values for RTCRSPCPEIMAGEDATA::Flags and RTCRSPCPEIMAGEDATA::fFlags.
+ */
+typedef enum RTCRSPCPEIMAGEFLAGS
+{
+ RTCRSPCPEIMAGEFLAGS_INCLUDE_RESOURCES = 0,
+ RTCRSPCPEIMAGEFLAGS_INCLUDE_DEBUG_INFO = 1,
+ RTCRSPCPEIMAGEFLAGS_IMPORT_ADDRESS_TABLE = 2
+} RTCRSPCPEIMAGEFLAGS;
+#endif
+
+
+/**
+ * Authenticode PE Image data.
+ */
+typedef struct RTCRSPCPEIMAGEDATA
+{
+ /** Sequence core. */
+ RTASN1SEQUENCECORE SeqCore;
+ /** One of the RTCRSPCPEIMAGEFLAGS value, default is
+ * RTCRSPCPEIMAGEFLAGS_INCLUDE_RESOURCES. Obsolete with v2 page hashes? */
+ RTASN1BITSTRING Flags;
+ /** Tag 0, explicit: Link to the data. */
+ struct
+ {
+ /** Context tag 0. */
+ RTASN1CONTEXTTAG0 CtxTag0;
+ /** Link to the data. */
+ RTCRSPCLINK File;
+ } T0;
+} RTCRSPCPEIMAGEDATA;
+/** Pointer to a authenticode PE image data representation. */
+typedef RTCRSPCPEIMAGEDATA *PRTCRSPCPEIMAGEDATA;
+/** Pointer to a const authenticode PE image data representation. */
+typedef RTCRSPCPEIMAGEDATA const *PCRTCRSPCPEIMAGEDATA;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRSPCPEIMAGEDATA, RTDECL, RTCrSpcPeImageData, SeqCore.Asn1Core);
+
+/** The object ID for SpcPeImageData. */
+#define RTCRSPCPEIMAGEDATA_OID "1.3.6.1.4.1.311.2.1.15"
+
+
+/**
+ * Data type selection for RTCRSPCATTRIBUTETYPEANDOPTIONALVALUE.
+ */
+typedef enum RTCRSPCAAOVTYPE
+{
+ /** Invalid zero entry. */
+ RTCRSPCAAOVTYPE_INVALID = 0,
+ /** Not present (pro forma). */
+ RTCRSPCAAOVTYPE_NOT_PRESENT,
+ /** Unknown object. */
+ RTCRSPCAAOVTYPE_UNKNOWN,
+ /** PE image data (pPeImage). */
+ RTCRSPCAAOVTYPE_PE_IMAGE_DATA,
+ /** End of valid values. */
+ RTCRSPCAAOVTYPE_END,
+ /** Blow up the type to at least 32-bits. */
+ RTCRSPCAAOVTYPE_32BIT_HACK
+} RTCRSPCAAOVTYPE;
+
+/**
+ * Authenticode attribute type and optional value.
+ *
+ * Note! Spec says the value should be explicitly tagged, but in real life
+ * it isn't. So, not very optional?
+ */
+typedef struct RTCRSPCATTRIBUTETYPEANDOPTIONALVALUE
+{
+ /** Sequence core. */
+ RTASN1SEQUENCECORE SeqCore;
+ /** An object ID indicating the type of the value. */
+ RTASN1OBJID Type;
+ /** Allocation of the optional data value. */
+ RTASN1ALLOCATION Allocation;
+ /** The valid pointer. */
+ RTCRSPCAAOVTYPE enmType;
+ /** The value part depends on the Type. */
+ union
+ {
+ /** RTCRSPCAAOVTYPE_UNKNOWN / Generic. */
+ PRTASN1CORE pCore;
+ /** RTCRSPCAAOVTYPE_PE_IMAGE_DATA / RTCRSPCPEIMAGEDATA_OID. */
+ PRTCRSPCPEIMAGEDATA pPeImage;
+ } uValue;
+} RTCRSPCATTRIBUTETYPEANDOPTIONALVALUE;
+/** Pointer to a authentication attribute type and optional value
+ * representation. */
+typedef RTCRSPCATTRIBUTETYPEANDOPTIONALVALUE *PRTCRSPCATTRIBUTETYPEANDOPTIONALVALUE;
+/** Pointer to a const authentication attribute type and optional value
+ * representation. */
+typedef RTCRSPCATTRIBUTETYPEANDOPTIONALVALUE const *PCRTCRSPCATTRIBUTETYPEANDOPTIONALVALUE;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRSPCATTRIBUTETYPEANDOPTIONALVALUE, RTDECL, RTCrSpcAttributeTypeAndOptionalValue, SeqCore.Asn1Core);
+
+
+/**
+ * Authenticode indirect data content.
+ */
+typedef struct RTCRSPCINDIRECTDATACONTENT
+{
+ /** Sequence core. */
+ RTASN1SEQUENCECORE SeqCore;
+ /** Additional data. */
+ RTCRSPCATTRIBUTETYPEANDOPTIONALVALUE Data;
+ /** The whole image digest. */
+ RTCRPKCS7DIGESTINFO DigestInfo;
+} RTCRSPCINDIRECTDATACONTENT;
+/** Pointer to a authenticode indirect data content representation. */
+typedef RTCRSPCINDIRECTDATACONTENT *PRTCRSPCINDIRECTDATACONTENT;
+/** Pointer to a const authenticode indirect data content representation. */
+typedef RTCRSPCINDIRECTDATACONTENT const *PCRTCRSPCINDIRECTDATACONTENT;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRSPCINDIRECTDATACONTENT, RTDECL, RTCrSpcIndirectDataContent, SeqCore.Asn1Core);
+
+/** The object ID for SpcIndirectDataContent. */
+#define RTCRSPCINDIRECTDATACONTENT_OID "1.3.6.1.4.1.311.2.1.4"
+
+/**
+ * Check the sanity of an Authenticode SPCIndirectDataContent object.
+ *
+ * @returns IPRT status code
+ * @param pIndData The Authenticode SPCIndirectDataContent to
+ * check.
+ * @param pSignedData The related signed data object.
+ * @param fFlags RTCRSPCINDIRECTDATACONTENT_SANITY_F_XXX.
+ * @param pErrInfo Optional error info.
+ */
+RTDECL(int) RTCrSpcIndirectDataContent_CheckSanityEx(PCRTCRSPCINDIRECTDATACONTENT pIndData, PCRTCRPKCS7SIGNEDDATA pSignedData,
+ uint32_t fFlags, PRTERRINFO pErrInfo);
+/** @name RTCRSPCINDIRECTDATACONTENT_SANITY_F_XXX for RTCrSpcIndirectDataContent_CheckSanityEx.
+ * @{ */
+/** The digest hash algorithm must be known to IPRT. */
+#define RTCRSPCINDIRECTDATACONTENT_SANITY_F_ONLY_KNOWN_HASH RT_BIT_32(0)
+/** PE image signing, check expectations of the spec. */
+#define RTCRSPCINDIRECTDATACONTENT_SANITY_F_PE_IMAGE RT_BIT_32(1)
+/** @} */
+
+/**
+ * Gets the PE image hash v2 SPC serialized object attribute if present.
+ *
+ * @returns Pointer to the attribute with Type RTCRSPC_PE_IMAGE_HASHES_V2_OID if
+ * found, NULL if not found.
+ * @param pIndData The Authenticode SpcIndirectDataContent.
+ */
+RTDECL(PCRTCRSPCSERIALIZEDOBJECTATTRIBUTE) RTCrSpcIndirectDataContent_GetPeImageHashesV2(PCRTCRSPCINDIRECTDATACONTENT pIndData);
+
+/** @} */
+
+RT_C_DECLS_END
+
+#endif
+
diff --git a/include/iprt/crypto/store.h b/include/iprt/crypto/store.h
new file mode 100644
index 00000000000..7c10a163c0b
--- /dev/null
+++ b/include/iprt/crypto/store.h
@@ -0,0 +1,132 @@
+/** @file
+ * IPRT - Cryptographic (Certificate) Store.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+#ifndef ___iprt_crypto_store_h
+#define ___iprt_crypto_store_h
+
+#include <iprt/crypto/x509.h>
+#include <iprt/crypto/taf.h>
+
+
+RT_C_DECLS_BEGIN
+
+/** @defgroup grp_rt_crstore RTCrStore - Crypotgraphic (Certificate) Store.
+ * @ingroup grp_rt_crypto
+ * @{
+ */
+
+
+/**
+ * A certificate store search.
+ *
+ * Used by the store provider to keep track of the current location of a
+ * certificate search.
+ */
+typedef struct RTCRSTORECERTSEARCH
+{
+ /** Opaque provider specific storage.
+ *
+ * Provider restriction: The provider is only allowed to use the two first
+ * entries for the find-all searches, because the front-end API may want the
+ * last two for implementing specific searches on top of it. */
+ uintptr_t auOpaque[4];
+} RTCRSTORECERTSEARCH;
+/** Pointer to a certificate store search. */
+typedef RTCRSTORECERTSEARCH *PRTCRSTORECERTSEARCH;
+
+
+RTDECL(int) RTCrStoreCreateInMem(PRTCRSTORE phStore, uint32_t cSizeHint);
+
+RTDECL(uint32_t) RTCrStoreRetain(RTCRSTORE hStore);
+RTDECL(uint32_t) RTCrStoreRelease(RTCRSTORE hStore);
+RTDECL(PCRTCRCERTCTX) RTCrStoreCertByIssuerAndSerialNo(RTCRSTORE hStore, PCRTCRX509NAME pIssuer, PCRTASN1INTEGER pSerialNo);
+RTDECL(int) RTCrStoreCertAddEncoded(RTCRSTORE hStore, uint32_t fFlags, void const *pvSrc, size_t cbSrc, PRTERRINFO pErrInfo);
+RTDECL(int) RTCrStoreCertAddFromFile(RTCRSTORE hStore, uint32_t fFlags, const char *pszFilename, PRTERRINFO pErrInfo);
+
+RTDECL(int) RTCrStoreCertFindAll(RTCRSTORE hStore, PRTCRSTORECERTSEARCH pSearch);
+RTDECL(int) RTCrStoreCertFindBySubjectOrAltSubjectByRfc5280(RTCRSTORE hStore, PCRTCRX509NAME pSubject,
+ PRTCRSTORECERTSEARCH pSearch);
+RTDECL(PCRTCRCERTCTX) RTCrStoreCertSearchNext(RTCRSTORE hStore, PRTCRSTORECERTSEARCH pSearch);
+RTDECL(int) RTCrStoreCertSearchDestroy(RTCRSTORE hStore, PRTCRSTORECERTSEARCH pSearch);
+
+RTDECL(int) RTCrStoreConvertToOpenSslCertStore(RTCRSTORE hStore, uint32_t fFlags, void **ppvOpenSslStore);
+RTDECL(int) RTCrStoreConvertToOpenSslCertStack(RTCRSTORE hStore, uint32_t fFlags, void **ppvOpenSslStack);
+
+
+/** @} */
+
+
+/** @defgroup grp_rt_crcertctx RTCrCertCtx - (Store) Certificate Context.
+ * @{ */
+
+
+/**
+ * Certificate context.
+ *
+ * This is returned by the certificate store APIs and is part of a larger
+ * reference counted structure. All the data is read only.
+ */
+typedef struct RTCRCERTCTX
+{
+ /** Flags, RTCRCERTCTX_F_XXX. */
+ uint32_t fFlags;
+ /** The size of the (DER) encoded certificate. */
+ uint32_t cbEncoded;
+ /** Pointer to the (DER) encoded certificate. */
+ uint8_t const *pabEncoded;
+ /** Pointer to the decoded X.509 representation of the certificate.
+ * This can be NULL when pTaInfo is present. */
+ PCRTCRX509CERTIFICATE pCert;
+ /** Pointer to the decoded TrustAnchorInfo for the certificate. This can be
+ * NULL, even for trust anchors, as long as pCert isn't. */
+ PCRTCRTAFTRUSTANCHORINFO pTaInfo;
+ /** Reserved for future use. */
+ void *paReserved[2];
+} RTCRCERTCTX;
+
+/** @name RTCRCERTCTX_F_XXX.
+ * @{ */
+/** Encoding mask. */
+#define RTCRCERTCTX_F_ENC_MASK UINT32_C(0x000000ff)
+/** X.509 certificate, DER encoded. */
+#define RTCRCERTCTX_F_ENC_X509_DER UINT32_C(0x00000000)
+/** RTF-5914 trust anchor info, DER encoded. */
+#define RTCRCERTCTX_F_ENC_TAF_DER UINT32_C(0x00000001)
+#if 0
+/** Extended certificate, DER encoded. */
+#define RTCRCERTCTX_F_ENC_PKCS6_DER UINT32_C(0x00000002)
+#endif
+/** @} */
+
+
+RTDECL(uint32_t) RTCrCertCtxRetain(PCRTCRCERTCTX pCertCtx);
+RTDECL(uint32_t) RTCrCertCtxRelease(PCRTCRCERTCTX pCertCtx);
+
+/** @} */
+
+RT_C_DECLS_END
+
+#endif
+
diff --git a/include/iprt/crypto/taf.h b/include/iprt/crypto/taf.h
new file mode 100644
index 00000000000..99c27e1c591
--- /dev/null
+++ b/include/iprt/crypto/taf.h
@@ -0,0 +1,189 @@
+/** @file
+ * IPRT - Crypto - Trust Anchor Format (RFC-5914).
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+#ifndef ___iprt_crypto_taf_h
+#define ___iprt_crypto_taf_h
+
+#include <iprt/asn1.h>
+#include <iprt/crypto/x509.h>
+
+
+RT_C_DECLS_BEGIN
+
+/** @defgroup grp_rt_crtaf RTCrTaf - Trust Anchor Format (RFC-5914)
+ * @ingroup grp_rt_crypto
+ * @{
+ */
+
+
+/**
+ * RFC-5914 CertPathControls (IPRT representation).
+ */
+typedef struct RTCRTAFCERTPATHCONTROLS
+{
+ /** Sequence core. */
+ RTASN1SEQUENCECORE SeqCore;
+ /** The trust anchor subject. For use in path construction. */
+ RTCRX509NAME TaName;
+ /** Certificate, optional, implicit tag 0. */
+ RTCRX509CERTIFICATE Certificate;
+ /** Certificate policies, optional, implicit tag 1.
+ * @remarks This is an ASN.1 SEQUENCE, not an ASN.1 SET as the name
+ * mistakenly might be taken to indicate. */
+ RTCRX509CERTIFICATEPOLICIES PolicySet;
+ /** Policy flags, optional, implicit tag 2. */
+ RTASN1BITSTRING PolicyFlags;
+ /** Name constraints, optional, implicit tag 3. */
+ RTCRX509NAMECONSTRAINTS NameConstr;
+ /** Path length constraints, optional, implicit tag 4. */
+ RTASN1INTEGER PathLenConstraint;
+} RTCRTAFCERTPATHCONTROLS;
+/** Pointer to the IPRT representation of a RFC-5914 CertPathControls. */
+typedef RTCRTAFCERTPATHCONTROLS *PRTCRTAFCERTPATHCONTROLS;
+/** Pointer to the const IPRT representation of a RFC-5914 CertPathControls. */
+typedef RTCRTAFCERTPATHCONTROLS const *PCRTCRTAFCERTPATHCONTROLS;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRTAFCERTPATHCONTROLS, RTDECL, RTCrTafCertPathControls, SeqCore.Asn1Core);
+
+/** @name Bit definitions for RTCRTAFCERTPATHCONTROL::PolicyFlags
+ * @{ */
+#define RTCRTAFCERTPOLICYFLAGS_INHIBIT_POLICY_MAPPING 0
+#define RTCRTAFCERTPOLICYFLAGS_REQUIRE_EXPLICIT_POLICY 1
+#define RTCRTAFCERTPOLICYFLAGS_INHIBIT_ANY_POLICY 2
+/** @} */
+
+
+/**
+ * RFC-5914 TrustAnchorInfo (IPRT representation).
+ */
+typedef struct RTCRTAFTRUSTANCHORINFO
+{
+ /** Sequence core. */
+ RTASN1SEQUENCECORE SeqCore;
+ /** The version number (defaults to v1). */
+ RTASN1INTEGER Version;
+ /** The public key of the trust anchor. */
+ RTCRX509SUBJECTPUBLICKEYINFO PubKey;
+ /** Key identifier. */
+ RTASN1OCTETSTRING KeyIdentifier;
+ /** Trust anchor title, optional, size 1 to 64. */
+ RTASN1STRING TaTitle;
+ /** Certificate path controls, optional. */
+ RTCRTAFCERTPATHCONTROLS CertPath;
+ /** Extensions, explicit optional, context tag 1. */
+ struct
+ {
+ /** Context tag 1. */
+ RTASN1CONTEXTTAG1 CtxTag1;
+ /** The extensions. */
+ RTCRX509EXTENSIONS Exts;
+ } T1;
+ /** Title language tag, implicit optional, context tag 2.
+ * Defaults to "en". */
+ RTASN1STRING TaTitleLangTag;
+} RTCRTAFTRUSTANCHORINFO;
+/** Pointer to the IPRT representation of a RFC-5914 TrustAnchorInfo. */
+typedef RTCRTAFTRUSTANCHORINFO *PRTCRTAFTRUSTANCHORINFO;
+/** Pointer to the const IPRT representation of a RFC-5914 TrustAnchorInfo. */
+typedef RTCRTAFTRUSTANCHORINFO const *PCRTCRTAFTRUSTANCHORINFO;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRTAFTRUSTANCHORINFO, RTDECL, RTCrTafTrustAnchorInfo, SeqCore.Asn1Core);
+
+/** TrustAnchorInfo version 1. */
+#define RTCRTAFTRUSTANCHORINFO_V1 1
+
+
+/** Indicates what kind of value a TrustAnchorChoice structure contains. */
+typedef enum RTCRTAFTRUSTANCHORCHOICEVAL
+{
+ /** Invalid zero value. */
+ RTCRTAFTRUSTANCHORCHOICEVAL_INVALID = 0,
+ /** RTCRTAFTRUSTANCHORCHOICE::u.pCertificate. */
+ RTCRTAFTRUSTANCHORCHOICEVAL_CERTIFICATE,
+ /** RTCRTAFTRUSTANCHORCHOICE::u.pT1. */
+ RTCRTAFTRUSTANCHORCHOICEVAL_TBS_CERTIFICATE,
+ /** RTCRTAFTRUSTANCHORCHOICE::u.pT2. */
+ RTCRTAFTRUSTANCHORCHOICEVAL_TRUST_ANCHOR_INFO,
+ /** End of valid choices. */
+ RTCRTAFTRUSTANCHORCHOICEVAL_END,
+ /** Make sure it's (at least) 32-bit wide. */
+ RTCRTAFTRUSTANCHORCHOICEVAL_32BIT_HACK = 0x7fffffff
+} RTCRTAFTRUSTANCHORCHOICEVAL;
+
+
+/**
+ * RFC-5914 TrustAnchorChoice (IPRT representation).
+ */
+typedef struct RTCRTAFTRUSTANCHORCHOICE
+{
+ /** Dummy object for simplifying everything. */
+ RTASN1DUMMY Dummy;
+ /** Allocation for the valid member (to optimize space usage). */
+ RTASN1ALLOCATION Allocation;
+ /** Indicates which of the pointers are valid. */
+ RTCRTAFTRUSTANCHORCHOICEVAL enmChoice;
+ /** Choice union. */
+ union
+ {
+ /** Generic ASN.1 core pointer for the choice. */
+ PRTASN1CORE pAsn1Core;
+ /** Choice 0: X509 certificate. */
+ PRTCRX509CERTIFICATE pCertificate;
+ /** Choice 1: To-be-signed certificate part. This may differ from the
+ * TBSCertificate member of the original certificate. */
+ struct
+ {
+ /** Explicit context tag. */
+ RTASN1CONTEXTTAG1 CtxTag1;
+ /** Pointer to the TBS certificate structure. */
+ RTCRX509TBSCERTIFICATE TbsCert;
+ } *pT1;
+
+ /** Choice 2: To-be-signed certificate part. This may differ from the
+ * TBSCertificate member of the original certificate. */
+ struct
+ {
+ /** Explicit context tag. */
+ RTASN1CONTEXTTAG2 CtxTag2;
+ /** Pointer to the trust anchor infomration structure. */
+ RTCRTAFTRUSTANCHORINFO TaInfo;
+ } *pT2;
+ } u;
+} RTCRTAFTRUSTANCHORCHOICE;
+/** Pointer to the IPRT representation of a RFC-5914 TrustAnchorChoice. */
+typedef RTCRTAFTRUSTANCHORCHOICE *PRTCRTAFTRUSTANCHORCHOICE;
+/** Pointer to the const IPRT representation of a RFC-5914 TrustAnchorChoice. */
+typedef RTCRTAFTRUSTANCHORCHOICE const *PCRTCRTAFTRUSTANCHORCHOICE;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRTAFTRUSTANCHORCHOICE, RTDECL, RTCrTafTrustAnchorChoice, Dummy.Asn1Core);
+
+/*
+ * RFC-5914 TrustAnchorList (IPRT representation).
+ */
+RTASN1_IMPL_GEN_SEQ_OF_TYPEDEFS_AND_PROTOS(RTCRTAFTRUSTANCHORLIST, RTCRTAFTRUSTANCHORCHOICE, RTDECL, RTCrTafTrustAnchorList);
+
+/** @} */
+
+RT_C_DECLS_END
+
+#endif
+
diff --git a/include/iprt/crypto/x509.h b/include/iprt/crypto/x509.h
new file mode 100644
index 00000000000..f59ad4f22f5
--- /dev/null
+++ b/include/iprt/crypto/x509.h
@@ -0,0 +1,1054 @@
+/** @file
+ * IPRT - Crypto - X.509, Public Key and Privilege Management Infrastructure.
+ */
+
+/*
+ * Copyright (C) 2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+#ifndef ___iprt_crypto_x509_h
+#define ___iprt_crypto_x509_h
+
+#include <iprt/asn1.h>
+
+
+RT_C_DECLS_BEGIN
+
+
+/** @defgroup grp_rt_crypto Crypto
+ * @ingroup grp_rt
+ * @{
+ */
+
+/** @defgroup grp_rt_crx509 RTCrX509 - Public Key and Privilege Management Infrastructure.
+ * @{
+ */
+
+/**
+ * X.509 algorithm identifier (IPRT representation).
+ */
+typedef struct RTCRX509ALGORITHMIDENTIFIER
+{
+ /** The sequence making up this algorithm identifier. */
+ RTASN1SEQUENCECORE SeqCore;
+ /** The algorithm object ID. */
+ RTASN1OBJID Algorithm;
+ /** Optional parameters specified by the algorithm. */
+ RTASN1DYNTYPE Parameters;
+} RTCRX509ALGORITHMIDENTIFIER;
+/** Poitner to the IPRT representation of a X.509 algorithm identifier. */
+typedef RTCRX509ALGORITHMIDENTIFIER *PRTCRX509ALGORITHMIDENTIFIER;
+/** Poitner to the const IPRT representation of a X.509 algorithm identifier. */
+typedef RTCRX509ALGORITHMIDENTIFIER const *PCRTCRX509ALGORITHMIDENTIFIER;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRX509ALGORITHMIDENTIFIER, RTDECL, RTCrX509AlgorithmIdentifier, SeqCore.Asn1Core);
+RTASN1_IMPL_GEN_SET_OF_TYPEDEFS_AND_PROTOS(RTCRX509ALGORITHMIDENTIFIERS, RTCRX509ALGORITHMIDENTIFIER, RTDECL, RTCrX509AlgorithmIdentifiers);
+
+/**
+ * Tries to convert an X.509 digest algorithm ID into a RTDIGESTTYPE value.
+ *
+ * @returns Valid RTDIGESTTYPE on success, RTDIGESTTYPE_INVALID on failure.
+ * @param pThis The IPRT representation of a X.509 algorithm
+ * identifier object.
+ */
+RTDECL(RTDIGESTTYPE) RTCrX509AlgorithmIdentifier_QueryDigestType(PCRTCRX509ALGORITHMIDENTIFIER pThis);
+
+/**
+ * Tries to figure the digest size of an X.509 digest algorithm ID.
+ *
+ * @returns The digest size in bytes, UINT32_MAX if unknown digest.
+ * @param pThis The IPRT representation of a X.509 algorithm
+ * identifier object.
+ */
+RTDECL(uint32_t) RTCrX509AlgorithmIdentifier_QueryDigestSize(PCRTCRX509ALGORITHMIDENTIFIER pThis);
+
+RTDECL(int) RTCrX509AlgorithmIdentifier_CompareWithString(PCRTCRX509ALGORITHMIDENTIFIER pThis, const char *pszObjId);
+
+/**
+ * Compares a digest with an encrypted digest algorithm, checking if they
+ * specify the same digest.
+ *
+ * @returns 0 if same digest, -1 if the digest is unknown, 1 if the encrypted
+ * digest does not match.
+ * @param pDigest The digest algorithm.
+ * @param pEncryptedDigest The encrypted digest algorithm.
+ */
+RTDECL(int) RTCrX509AlgorithmIdentifier_CompareDigestAndEncryptedDigest(PCRTCRX509ALGORITHMIDENTIFIER pDigest,
+ PCRTCRX509ALGORITHMIDENTIFIER pEncryptedDigest);
+
+/** @name Digest Algorithm OIDs.
+ * @{ */
+#define RTCRX509ALGORITHMIDENTIFIERID_MD2 "1.2.840.113549.2.2"
+#define RTCRX509ALGORITHMIDENTIFIERID_MD4 "1.2.840.113549.2.4"
+#define RTCRX509ALGORITHMIDENTIFIERID_MD5 "1.2.840.113549.2.5"
+#define RTCRX509ALGORITHMIDENTIFIERID_SHA1 "1.3.14.3.2.26"
+#define RTCRX509ALGORITHMIDENTIFIERID_SHA256 "2.16.840.1.101.3.4.2.1"
+#define RTCRX509ALGORITHMIDENTIFIERID_SHA384 "2.16.840.1.101.3.4.2.2"
+#define RTCRX509ALGORITHMIDENTIFIERID_SHA512 "2.16.840.1.101.3.4.2.3"
+#define RTCRX509ALGORITHMIDENTIFIERID_SHA224 "2.16.840.1.101.3.4.2.4"
+#define RTCRX509ALGORITHMIDENTIFIERID_WHIRLPOOL "1.0.10118.3.0.55"
+/** @} */
+
+/** @name Encrypted Digest Algorithm OIDs.
+ * @remarks The PKCS variants are the default ones, alternative OID are marked
+ * as such.
+ * @{ */
+#define RTCRX509ALGORITHMIDENTIFIERID_RSA "1.2.840.113549.1.1.1"
+#define RTCRX509ALGORITHMIDENTIFIERID_MD2_WITH_RSA "1.2.840.113549.1.1.2"
+#define RTCRX509ALGORITHMIDENTIFIERID_MD4_WITH_RSA "1.2.840.113549.1.1.3"
+#define RTCRX509ALGORITHMIDENTIFIERID_MD5_WITH_RSA "1.2.840.113549.1.1.4"
+#define RTCRX509ALGORITHMIDENTIFIERID_SHA1_WITH_RSA "1.2.840.113549.1.1.5"
+#define RTCRX509ALGORITHMIDENTIFIERID_SHA256_WITH_RSA "1.2.840.113549.1.1.11"
+#define RTCRX509ALGORITHMIDENTIFIERID_SHA384_WITH_RSA "1.2.840.113549.1.1.12"
+#define RTCRX509ALGORITHMIDENTIFIERID_SHA512_WITH_RSA "1.2.840.113549.1.1.13"
+#define RTCRX509ALGORITHMIDENTIFIERID_SHA224_WITH_RSA "1.2.840.113549.1.1.14"
+/** @} */
+
+
+
+
+/**
+ * One X.509 AttributeTypeAndValue (IPRT representation).
+ */
+typedef struct RTCRX509ATTRIBUTETYPEANDVALUE
+{
+ /** Sequence core. */
+ RTASN1SEQUENCECORE SeqCore;
+ /** The attribute type (object ID). */
+ RTASN1OBJID Type;
+ /** The attribute value (what it is is defined by Type). */
+ RTASN1DYNTYPE Value;
+} RTCRX509ATTRIBUTETYPEANDVALUE;
+/** Pointer to a X.509 AttributeTypeAndValue (IPRT representation). */
+typedef RTCRX509ATTRIBUTETYPEANDVALUE *PRTCRX509ATTRIBUTETYPEANDVALUE;
+/** Pointer to a const X.509 AttributeTypeAndValue (IPRT representation). */
+typedef RTCRX509ATTRIBUTETYPEANDVALUE const *PCRTCRX509ATTRIBUTETYPEANDVALUE;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRX509ATTRIBUTETYPEANDVALUE, RTDECL, RTCrX509AttributeTypeAndValue, SeqCore.Asn1Core);
+RTASN1_IMPL_GEN_SET_OF_TYPEDEFS_AND_PROTOS(RTCRX509ATTRIBUTETYPEANDVALUES, RTCRX509ATTRIBUTETYPEANDVALUE, RTDECL, RTCrX509AttributeTypeAndValues);
+
+RTASN1TYPE_ALIAS(RTCRX509RELATIVEDISTINGUISHEDNAME, RTCRX509ATTRIBUTETYPEANDVALUES, RTCrX509RelativeDistinguishedName, RTCrX509AttributeTypeAndValues);
+
+
+RTASN1_IMPL_GEN_SEQ_OF_TYPEDEFS_AND_PROTOS(RTCRX509NAME, RTCRX509RELATIVEDISTINGUISHEDNAME, RTDECL, RTCrX509Name);
+RTDECL(int) RTCrX509Name_CheckSanity(PCRTCRX509NAME pName, uint32_t fFlags, PRTERRINFO pErrInfo, const char *pszErrorTag);
+RTDECL(bool) RTCrX509Name_MatchByRfc5280(PCRTCRX509NAME pLeft, PCRTCRX509NAME pRight);
+
+/**
+ * Name constraint matching (RFC-5280).
+ *
+ * @returns true on match, false on mismatch.
+ * @param pConstraint The constraint name.
+ * @param pName The name to match against the constraint.
+ * @sa RTCrX509GeneralName_ConstraintMatch,
+ * RTCrX509RelativeDistinguishedName_ConstraintMatch
+ */
+RTDECL(bool) RTCrX509Name_ConstraintMatch(PCRTCRX509NAME pConstraint, PCRTCRX509NAME pName);
+RTDECL(int) RTCrX509Name_RecodeAsUtf8(PRTCRX509NAME pThis, PCRTASN1ALLOCATORVTABLE pAllocator);
+
+/**
+ * Matches the directory name against a comma separated list of the comonent
+ * strings (case sensitive).
+ *
+ * @returns true if match, false if mismatch.
+ * @param pThis The name object.
+ * @param pszString The string to match against. For example:
+ * "C=US, ST=California, L=Redwood Shores, O=Oracle Corporation"
+ *
+ * @remarks This is doing a straight compare, no extra effort is expended in
+ * dealing with different component order. If the component order
+ * differs, there won't be any match.
+ */
+RTDECL(bool) RTCrX509Name_MatchWithString(PCRTCRX509NAME pThis, const char *pszString);
+
+/**
+ * Formats the name as a command separated list of components with type
+ * prefixes.
+ *
+ * The output of this function is suitable for use with
+ * RTCrX509Name_MatchWithString.
+ *
+ * @returns IPRT status code.
+ * @param pThis The name object.
+ * @param pszBuf The output buffer.
+ * @param cbBuf The size of the output buffer.
+ * @param pcbActual Where to return the number of bytes required for the
+ * output, including the null terminator character.
+ * Optional.
+ */
+RTDECL(int) RTCrX509Name_FormatAsString(PCRTCRX509NAME pThis, char *pszBuf, size_t cbBuf, size_t *pcbActual);
+
+
+
+typedef enum RTCRX509GENERALNAMECHOICE
+{
+ RTCRX509GENERALNAMECHOICE_INVALID = 0,
+ RTCRX509GENERALNAMECHOICE_OTHER_NAME,
+ RTCRX509GENERALNAMECHOICE_RFC822_NAME,
+ RTCRX509GENERALNAMECHOICE_DNS_NAME,
+ RTCRX509GENERALNAMECHOICE_X400_ADDRESS,
+ RTCRX509GENERALNAMECHOICE_DIRECTORY_NAME,
+ RTCRX509GENERALNAMECHOICE_EDI_PARTY_NAME,
+ RTCRX509GENERALNAMECHOICE_URI,
+ RTCRX509GENERALNAMECHOICE_IP_ADDRESS,
+ RTCRX509GENERALNAMECHOICE_REGISTERED_ID,
+ RTCRX509GENERALNAMECHOICE_END,
+ RTCRX509GENERALNAMECHOICE_32BIT_HACK = 0x7fffffff
+} RTCRX509GENERALNAMECHOICE;
+
+/**
+ * One X.509 GeneralName (IPRT representation).
+ *
+ * This is represented as a union. Use the RTCRX509GENERALNAME_IS_XXX predicate
+ * macros to figure out which member is valid (Asn1Core is always valid).
+ */
+typedef struct RTCRX509GENERALNAME
+{
+ /** Dummy ASN.1 record, not encoded. */
+ RTASN1DUMMY Dummy;
+ /** The value allocation. */
+ RTASN1ALLOCATION Allocation;
+ /** The choice of value. */
+ RTCRX509GENERALNAMECHOICE enmChoice;
+ /** The value union. */
+ union
+ {
+ /** Tag 0: Other. */
+ struct
+ {
+ /** Context tag 0. */
+ RTASN1CONTEXTTAG0 CtxTag0;
+ /** User defined. */
+ RTASN1DYNTYPE Other;
+ } *pT0;
+ /** Tag 1: RFC-822 Name. */
+ PRTASN1STRING pT1_Rfc822;
+ /** Tag 2: DNS name. */
+ PRTASN1STRING pT2_DnsName;
+ /** Tag 3: X.400 Address. */
+ struct
+ {
+ /** Context tag 3. */
+ RTASN1CONTEXTTAG3 CtxTag3;
+ /** Later. */
+ RTASN1DYNTYPE X400Address;
+ } *pT3;
+ /** Tag 4: Directory Name. */
+ struct
+ {
+ /** Context tag 4. */
+ RTASN1CONTEXTTAG4 CtxTag4;
+ /** Directory name. */
+ RTCRX509NAME DirectoryName;
+ } *pT4;
+ /** Tag 5: EDI Party Name. */
+ struct
+ {
+ /** Context tag 5. */
+ RTASN1CONTEXTTAG5 CtxTag5;
+ /** Later. */
+ RTASN1DYNTYPE EdiPartyName;
+ } *pT5;
+ /** Tag 6: URI. */
+ PRTASN1STRING pT6_Uri;
+ /** Tag 7: IP address. Either 4/8 (IPv4) or 16/32 (IPv16) octets long. */
+ PRTASN1OCTETSTRING pT7_IpAddress;
+ /** Tag 8: Registered ID. */
+ PRTASN1OBJID pT8_RegisteredId;
+ } u;
+} RTCRX509GENERALNAME;
+/** Pointer to the IPRT representation of an X.509 general name. */
+typedef RTCRX509GENERALNAME *PRTCRX509GENERALNAME;
+/** Pointer to the const IPRT representation of an X.509 general name. */
+typedef RTCRX509GENERALNAME const *PCRTCRX509GENERALNAME;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRX509GENERALNAME, RTDECL, RTCrX509GeneralName, Dummy.Asn1Core);
+
+/** @name RTCRX509GENERALNAME tag predicates.
+ * @{ */
+#define RTCRX509GENERALNAME_IS_OTHER_NAME(a_GenName) ((a_GenName)->enmChoice == RTCRX509GENERALNAMECHOICE_OTHER_NAME)
+#define RTCRX509GENERALNAME_IS_RFC822_NAME(a_GenName) ((a_GenName)->enmChoice == RTCRX509GENERALNAMECHOICE_RFC822_NAME)
+#define RTCRX509GENERALNAME_IS_DNS_NAME(a_GenName) ((a_GenName)->enmChoice == RTCRX509GENERALNAMECHOICE_DNS_NAME)
+#define RTCRX509GENERALNAME_IS_X400_ADDRESS(a_GenName) ((a_GenName)->enmChoice == RTCRX509GENERALNAMECHOICE_X400_ADDRESS)
+#define RTCRX509GENERALNAME_IS_DIRECTORY_NAME(a_GenName) ((a_GenName)->enmChoice == RTCRX509GENERALNAMECHOICE_DIRECTORY_NAME)
+#define RTCRX509GENERALNAME_IS_EDI_PARTY_NAME(a_GenName) ((a_GenName)->enmChoice == RTCRX509GENERALNAMECHOICE_EDI_PARTY_NAME)
+#define RTCRX509GENERALNAME_IS_URI(a_GenName) ((a_GenName)->enmChoice == RTCRX509GENERALNAMECHOICE_URI)
+#define RTCRX509GENERALNAME_IS_IP_ADDRESS(a_GenName) ((a_GenName)->enmChoice == RTCRX509GENERALNAMECHOICE_IP_ADDRESS)
+#define RTCRX509GENERALNAME_IS_REGISTERED_ID(a_GenName) ((a_GenName)->enmChoice == RTCRX509GENERALNAMECHOICE_REGISTERED_ID)
+/** @} */
+
+
+RTASN1_IMPL_GEN_SEQ_OF_TYPEDEFS_AND_PROTOS(RTCRX509GENERALNAMES, RTCRX509GENERALNAME, RTDECL, RTCrX509GeneralNames);
+RTDECL(bool) RTCrX509GeneralName_ConstraintMatch(PCRTCRX509GENERALNAME pConstraint, PCRTCRX509GENERALNAME pName);
+
+
+/**
+ * X.509 Validity (IPRT representation).
+ */
+typedef struct RTCRX509VALIDITY
+{
+ /** Core sequence bits. */
+ RTASN1SEQUENCECORE SeqCore;
+ /** Effective starting. */
+ RTASN1TIME NotBefore;
+ /** Expires after. */
+ RTASN1TIME NotAfter;
+} RTCRX509VALIDITY;
+/** Pointer to the IPRT representation of an X.509 validity sequence. */
+typedef RTCRX509VALIDITY *PRTCRX509VALIDITY;
+/** Pointer ot the const IPRT representation of an X.509 validity sequence. */
+typedef RTCRX509VALIDITY const *PCRTCRX509VALIDITY;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRX509VALIDITY, RTDECL, RTCrX509Validity, SeqCore.Asn1Core);
+
+RTDECL(bool) RTCrX509Validity_IsValidAtTimeSpec(PCRTCRX509VALIDITY pThis, PCRTTIMESPEC pTimeSpec);
+
+
+#if 0
+/**
+ * X.509 UniqueIdentifier (IPRT representation).
+ */
+typedef struct RTCRX509UNIQUEIDENTIFIER
+{
+ /** Representation is a bit string. */
+ RTASN1BITSTRING BitString;
+} RTCRX509UNIQUEIDENTIFIER;
+/** Pointer to the IPRT representation of an X.509 unique identifier. */
+typedef RTCRX509UNIQUEIDENTIFIER *PRTCRX509UNIQUEIDENTIFIER;
+/** Pointer to the const IPRT representation of an X.509 unique identifier. */
+typedef RTCRX509UNIQUEIDENTIFIER const *PCRTCRX509UNIQUEIDENTIFIER;
+RTASN1TYPE_STANDARD_PROTOTYPES_NO_GET_CORE(RTCRX509UNIQUEIDENTIFIER, RTDECL, RTCrX509UniqueIdentifier);
+#endif
+RTASN1TYPE_ALIAS(RTCRX509UNIQUEIDENTIFIER, RTASN1BITSTRING, RTCrX509UniqueIdentifier, RTAsn1BitString);
+
+
+/**
+ * X.509 SubjectPublicKeyInfo (IPRT representation).
+ */
+typedef struct RTCRX509SUBJECTPUBLICKEYINFO
+{
+ /** Core sequence bits. */
+ RTASN1SEQUENCECORE SeqCore;
+ /** The algorithm used with the public key. */
+ RTCRX509ALGORITHMIDENTIFIER Algorithm;
+ /** A bit string containing the public key.
+ *
+ * For algorithms like rsaEncryption this is generally a sequence of two
+ * integers, where the first one has lots of bits, and the second one being a
+ * modulous value. These are details specific to the algorithm and not relevant
+ * when validating the certificate chain. */
+ RTASN1BITSTRING SubjectPublicKey;
+} RTCRX509SUBJECTPUBLICKEYINFO;
+/** Pointer to the IPRT representation of an X.509 subject public key info
+ * sequence. */
+typedef RTCRX509SUBJECTPUBLICKEYINFO *PRTCRX509SUBJECTPUBLICKEYINFO;
+/** Pointer to the const IPRT representation of an X.509 subject public key info
+ * sequence. */
+typedef RTCRX509SUBJECTPUBLICKEYINFO const *PCRTCRX509SUBJECTPUBLICKEYINFO;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRX509SUBJECTPUBLICKEYINFO, RTDECL, RTCrX509SubjectPublicKeyInfo, SeqCore.Asn1Core);
+
+
+/**
+ * One X.509 AuthorityKeyIdentifier (IPRT representation).
+ */
+typedef struct RTCRX509AUTHORITYKEYIDENTIFIER
+{
+ /** Sequence core. */
+ RTASN1SEQUENCECORE SeqCore;
+ /** Tag 0, optional, implicit: Key identifier. */
+ RTASN1OCTETSTRING KeyIdentifier;
+ /** Tag 1, optional, implicit: Issuer name. */
+ RTCRX509GENERALNAMES AuthorityCertIssuer;
+ /** Tag 2, optional, implicit: Serial number of issuer. */
+ RTASN1INTEGER AuthorityCertSerialNumber;
+} RTCRX509AUTHORITYKEYIDENTIFIER;
+/** Pointer to the IPRT representation of an X.509 AuthorityKeyIdentifier
+ * sequence. */
+typedef RTCRX509AUTHORITYKEYIDENTIFIER *PRTCRX509AUTHORITYKEYIDENTIFIER;
+/** Pointer to the const IPRT representation of an X.509 AuthorityKeyIdentifier
+ * sequence. */
+typedef RTCRX509AUTHORITYKEYIDENTIFIER const *PCRTCRX509AUTHORITYKEYIDENTIFIER;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRX509AUTHORITYKEYIDENTIFIER, RTDECL, RTCrX509AuthorityKeyIdentifier, SeqCore.Asn1Core);
+
+
+/**
+ * One X.509 OldAuthorityKeyIdentifier (IPRT representation).
+ */
+typedef struct RTCRX509OLDAUTHORITYKEYIDENTIFIER
+{
+ /** Sequence core. */
+ RTASN1SEQUENCECORE SeqCore;
+ /** Tag 0, optional, implicit: Key identifier. */
+ RTASN1OCTETSTRING KeyIdentifier;
+ struct
+ {
+ RTASN1CONTEXTTAG1 CtxTag1;
+ /** Tag 1, optional, implicit: Issuer name. */
+ RTCRX509NAME AuthorityCertIssuer;
+ } T1;
+ /** Tag 2, optional, implicit: Serial number of issuer. */
+ RTASN1INTEGER AuthorityCertSerialNumber;
+} RTCRX509OLDAUTHORITYKEYIDENTIFIER;
+/** Pointer to the IPRT representation of an X.509 AuthorityKeyIdentifier
+ * sequence. */
+typedef RTCRX509OLDAUTHORITYKEYIDENTIFIER *PRTCRX509OLDAUTHORITYKEYIDENTIFIER;
+/** Pointer to the const IPRT representation of an X.509 AuthorityKeyIdentifier
+ * sequence. */
+typedef RTCRX509OLDAUTHORITYKEYIDENTIFIER const *PCRTCRX509OLDAUTHORITYKEYIDENTIFIER;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRX509OLDAUTHORITYKEYIDENTIFIER, RTDECL, RTCrX509OldAuthorityKeyIdentifier, SeqCore.Asn1Core);
+
+
+/**
+ * One X.509 PolicyQualifierInfo (IPRT representation).
+ */
+typedef struct RTCRX509POLICYQUALIFIERINFO
+{
+ /** Core sequence bits. */
+ RTASN1SEQUENCECORE SeqCore;
+ /** The policy object ID. */
+ RTASN1OBJID PolicyQualifierId;
+ /** Anything defined by the policy qualifier id. */
+ RTASN1DYNTYPE Qualifier;
+} RTCRX509POLICYQUALIFIERINFO;
+/** Pointer to the IPRT representation of an X.509 PolicyQualifierInfo
+ * sequence. */
+typedef RTCRX509POLICYQUALIFIERINFO *PRTCRX509POLICYQUALIFIERINFO;
+/** Pointer to the const IPRT representation of an X.509 PolicyQualifierInfo
+ * sequence. */
+typedef RTCRX509POLICYQUALIFIERINFO const *PCRTCRX509POLICYQUALIFIERINFO;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRX509POLICYQUALIFIERINFO, RTDECL, RTCrX509PolicyQualifierInfo, SeqCore.Asn1Core);
+RTASN1_IMPL_GEN_SEQ_OF_TYPEDEFS_AND_PROTOS(RTCRX509POLICYQUALIFIERINFOS, RTCRX509POLICYQUALIFIERINFO, RTDECL, RTCrX509PolicyQualifierInfos);
+
+
+/**
+ * One X.509 PolicyInformation (IPRT representation).
+ */
+typedef struct RTCRX509POLICYINFORMATION
+{
+ /** Core sequence bits. */
+ RTASN1SEQUENCECORE SeqCore;
+ /** The policy object ID. */
+ RTASN1OBJID PolicyIdentifier;
+ /** Optional sequence of policy qualifiers. */
+ RTCRX509POLICYQUALIFIERINFOS PolicyQualifiers;
+} RTCRX509POLICYINFORMATION;
+/** Pointer to the IPRT representation of an X.509 PolicyInformation
+ * sequence. */
+typedef RTCRX509POLICYINFORMATION *PRTCRX509POLICYINFORMATION;
+/** Pointer to the const IPRT representation of an X.509 PolicyInformation
+ * sequence. */
+typedef RTCRX509POLICYINFORMATION const *PCRTCRX509POLICYINFORMATION;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRX509POLICYINFORMATION, RTDECL, RTCrX509PolicyInformation, SeqCore.Asn1Core);
+RTASN1_IMPL_GEN_SEQ_OF_TYPEDEFS_AND_PROTOS(RTCRX509CERTIFICATEPOLICIES, RTCRX509POLICYINFORMATION, RTDECL, RTCrX509CertificatePolicies);
+
+/** Sepcial policy object ID that matches any policy. */
+#define RTCRX509_ID_CE_CP_ANY_POLICY_OID "2.5.29.32.0"
+
+
+/**
+ * One X.509 PolicyMapping (IPRT representation).
+ */
+typedef struct RTCRX509POLICYMAPPING
+{
+ /** Core sequence bits. */
+ RTASN1SEQUENCECORE SeqCore;
+ /** Issuer policy ID. */
+ RTASN1OBJID IssuerDomainPolicy;
+ /** Subject policy ID. */
+ RTASN1OBJID SubjectDomainPolicy;
+} RTCRX509POLICYMAPPING;
+/** Pointer to the IPRT representation of a sequence of X.509 PolicyMapping. */
+typedef RTCRX509POLICYMAPPING *PRTCRX509POLICYMAPPING;
+/** Pointer to the const IPRT representation of a sequence of X.509
+ * PolicyMapping. */
+typedef RTCRX509POLICYMAPPING const *PCRTCRX509POLICYMAPPING;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRX509POLICYMAPPING, RTDECL, RTCrX509PolicyMapping, SeqCore.Asn1Core);
+RTASN1_IMPL_GEN_SEQ_OF_TYPEDEFS_AND_PROTOS(RTCRX509POLICYMAPPINGS, RTCRX509POLICYMAPPING, RTDECL, RTCrX509PolicyMappings);
+
+
+/**
+ * X.509 BasicConstraints (IPRT representation).
+ */
+typedef struct RTCRX509BASICCONSTRAINTS
+{
+ /** Core sequence bits. */
+ RTASN1SEQUENCECORE SeqCore;
+ /** Is this ia certficiate authority? Default to false. */
+ RTASN1BOOLEAN CA;
+ /** Path length constraint. */
+ RTASN1INTEGER PathLenConstraint;
+} RTCRX509BASICCONSTRAINTS;
+/** Pointer to the IPRT representation of a sequence of X.509
+ * BasicConstraints. */
+typedef RTCRX509BASICCONSTRAINTS *PRTCRX509BASICCONSTRAINTS;
+/** Pointer to the const IPRT representation of a sequence of X.509
+ * BasicConstraints. */
+typedef RTCRX509BASICCONSTRAINTS const *PCRTCRX509BASICCONSTRAINTS;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRX509BASICCONSTRAINTS, RTDECL, RTCrX509BasicConstraints, SeqCore.Asn1Core);
+
+
+/**
+ * X.509 GeneralSubtree (IPRT representation).
+ */
+typedef struct RTCRX509GENERALSUBTREE
+{
+ /** Core sequence bits. */
+ RTASN1SEQUENCECORE SeqCore;
+ /** Base name. */
+ RTCRX509GENERALNAME Base;
+ /** Tag 0, optional: Minimum, default 0. Fixed at 0 by RFC-5280. */
+ RTASN1INTEGER Minimum;
+ /** Tag 1, optional: Maximum. Fixed as not-present by RFC-5280. */
+ RTASN1INTEGER Maximum;
+} RTCRX509GENERALSUBTREE;
+/** Pointer to the IPRT representation of a sequence of X.509 GeneralSubtree. */
+typedef RTCRX509GENERALSUBTREE *PRTCRX509GENERALSUBTREE;
+/** Pointer to the const IPRT representation of a sequence of X.509
+ * GeneralSubtree. */
+typedef RTCRX509GENERALSUBTREE const *PCRTCRX509GENERALSUBTREE;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRX509GENERALSUBTREE, RTDECL, RTCrX509GeneralSubtree, SeqCore.Asn1Core);
+
+RTDECL(bool) RTCrX509GeneralSubtree_ConstraintMatch(PCRTCRX509GENERALSUBTREE pConstraint, PCRTCRX509GENERALSUBTREE pName);
+
+RTASN1_IMPL_GEN_SEQ_OF_TYPEDEFS_AND_PROTOS(RTCRX509GENERALSUBTREES, RTCRX509GENERALSUBTREE, RTDECL, RTCrX509GeneralSubtrees);
+
+
+/**
+ * X.509 NameConstraints (IPRT representation).
+ */
+typedef struct RTCRX509NAMECONSTRAINTS
+{
+ /** Core sequence bits. */
+ RTASN1SEQUENCECORE SeqCore;
+ /** Tag 0, optional: Permitted subtrees. */
+ struct
+ {
+ /** Context tag. */
+ RTASN1CONTEXTTAG0 CtxTag0;
+ /** The permitted subtrees. */
+ RTCRX509GENERALSUBTREES PermittedSubtrees;
+ } T0;
+ /** Tag 1, optional: Excluded subtrees. */
+ struct
+ {
+ /** Context tag. */
+ RTASN1CONTEXTTAG1 CtxTag1;
+ /** The excluded subtrees. */
+ RTCRX509GENERALSUBTREES ExcludedSubtrees;
+ } T1;
+} RTCRX509NAMECONSTRAINTS;
+/** Pointer to the IPRT representation of a sequence of X.509
+ * NameConstraints. */
+typedef RTCRX509NAMECONSTRAINTS *PRTCRX509NAMECONSTRAINTS;
+/** Pointer to the const IPRT representation of a sequence of X.509
+ * NameConstraints. */
+typedef RTCRX509NAMECONSTRAINTS const *PCRTCRX509NAMECONSTRAINTS;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRX509NAMECONSTRAINTS, RTDECL, RTCrX509NameConstraints, SeqCore.Asn1Core);
+
+
+/**
+ * X.509 PolicyConstraints (IPRT representation).
+ */
+typedef struct RTCRX509POLICYCONSTRAINTS
+{
+ /** Core sequence bits. */
+ RTASN1SEQUENCECORE SeqCore;
+ /** Tag 0, optional: Certificates before an explicit policy is required. */
+ RTASN1INTEGER RequireExplicitPolicy;
+ /** Tag 1, optional: Certificates before policy mapping is inhibited. */
+ RTASN1INTEGER InhibitPolicyMapping;
+} RTCRX509POLICYCONSTRAINTS;
+/** Pointer to the IPRT representation of a sequence of X.509
+ * PolicyConstraints. */
+typedef RTCRX509POLICYCONSTRAINTS *PRTCRX509POLICYCONSTRAINTS;
+/** Pointer to the const IPRT representation of a sequence of X.509
+ * PolicyConstraints. */
+typedef RTCRX509POLICYCONSTRAINTS const *PCRTCRX509POLICYCONSTRAINTS;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRX509POLICYCONSTRAINTS, RTDECL, RTCrX509PolicyConstraints, SeqCore.Asn1Core);
+
+
+/**
+ * Indicates what an X.509 extension value encapsulates.
+ */
+typedef enum RTCRX509EXTENSIONVALUE
+{
+ RTCRX509EXTENSIONVALUE_INVALID = 0,
+ /** Unknown, no decoding available just the octet string. */
+ RTCRX509EXTENSIONVALUE_UNKNOWN,
+ /** Unencapsulated (i.e. octet string). */
+ RTCRX509EXTENSIONVALUE_NOT_ENCAPSULATED,
+
+ /** Bit string (RTASN1BITSTRING). */
+ RTCRX509EXTENSIONVALUE_BIT_STRING,
+ /** Octet string (RTASN1OCTETSTRING). */
+ RTCRX509EXTENSIONVALUE_OCTET_STRING,
+ /** Integer string (RTASN1INTEGER). */
+ RTCRX509EXTENSIONVALUE_INTEGER,
+ /** Sequence of object identifiers (RTASN1SEQOFOBJIDS). */
+ RTCRX509EXTENSIONVALUE_SEQ_OF_OBJ_IDS,
+
+ /** Authority key identifier (RTCRX509AUTHORITYKEYIDENTIFIER). */
+ RTCRX509EXTENSIONVALUE_AUTHORITY_KEY_IDENTIFIER,
+ /** Old Authority key identifier (RTCRX509OLDAUTHORITYKEYIDENTIFIER). */
+ RTCRX509EXTENSIONVALUE_OLD_AUTHORITY_KEY_IDENTIFIER,
+ /** Certificate policies (RTCRX509CERTIFICATEPOLICIES). */
+ RTCRX509EXTENSIONVALUE_CERTIFICATE_POLICIES,
+ /** Sequence of policy mappings (RTCRX509POLICYMAPPINGS). */
+ RTCRX509EXTENSIONVALUE_POLICY_MAPPINGS,
+ /** Basic constraints (RTCRX509BASICCONSTRAINTS). */
+ RTCRX509EXTENSIONVALUE_BASIC_CONSTRAINTS,
+ /** Name constraints (RTCRX509NAMECONSTRAINTS). */
+ RTCRX509EXTENSIONVALUE_NAME_CONSTRAINTS,
+ /** Policy constraints (RTCRX509POLICYCONSTRAINTS). */
+ RTCRX509EXTENSIONVALUE_POLICY_CONSTRAINTS,
+ /** Sequence of general names (RTCRX509GENERALNAMES). */
+ RTCRX509EXTENSIONVALUE_GENERAL_NAMES,
+
+ /** Blow the type up to 32-bits. */
+ RTCRX509EXTENSIONVALUE_32BIT_HACK = 0x7fffffff
+} RTCRX509EXTENSIONVALUE;
+
+/**
+ * One X.509 Extension (IPRT representation).
+ */
+typedef struct RTCRX509EXTENSION
+{
+ /** Core sequence bits. */
+ RTASN1SEQUENCECORE SeqCore;
+ /** Extension ID. */
+ RTASN1OBJID ExtnId;
+ /** Whether this is critical (default @c false). */
+ RTASN1BOOLEAN Critical;
+ /** Indicates what ExtnValue.pEncapsulated points at. */
+ RTCRX509EXTENSIONVALUE enmValue;
+ /** The value.
+ * Contains extension specific data that we don't yet parse. */
+ RTASN1OCTETSTRING ExtnValue;
+} RTCRX509EXTENSION;
+/** Pointer to the IPRT representation of one X.509 extensions. */
+typedef RTCRX509EXTENSION *PRTCRX509EXTENSION;
+/** Pointer to the const IPRT representation of one X.509 extension. */
+typedef RTCRX509EXTENSION const *PCRTCRX509EXTENSION;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRX509EXTENSION, RTDECL, RTCrX509Extension, SeqCore.Asn1Core);
+RTASN1_IMPL_GEN_SEQ_OF_TYPEDEFS_AND_PROTOS(RTCRX509EXTENSIONS, RTCRX509EXTENSION, RTDECL, RTCrX509Extensions);
+
+RTDECL(int) RTCrX509Extension_ExtnValue_DecodeAsn1(PRTASN1CURSOR pCursor, uint32_t fFlags,
+ PRTCRX509EXTENSION pThis, const char *pszErrorTag);
+
+
+/**
+ * X.509 To-be-signed certificate information (IPRT representation).
+ */
+typedef struct RTCRX509TBSCERTIFICATE
+{
+ /** Sequence core. */
+ RTASN1SEQUENCECORE SeqCore;
+ /** Structure version. */
+ struct
+ {
+ /** Context tag with value 0. */
+ RTASN1CONTEXTTAG0 CtxTag0;
+ /** The actual value (RTCRX509TBSCERTIFICATE_V1, ...). */
+ RTASN1INTEGER Version;
+ } T0;
+ /** The serial number of the certificate. */
+ RTASN1INTEGER SerialNumber;
+ /** The signature algorithm. */
+ RTCRX509ALGORITHMIDENTIFIER Signature;
+ /** The issuer name. */
+ RTCRX509NAME Issuer;
+ /** The certificate validity period. */
+ RTCRX509VALIDITY Validity;
+ /** The subject name. */
+ RTCRX509NAME Subject;
+ /** The public key for this certificate. */
+ RTCRX509SUBJECTPUBLICKEYINFO SubjectPublicKeyInfo;
+ /** Issuer unique identifier (optional, version >= v2). */
+ struct
+ {
+ /** Context tag with value 1. */
+ RTASN1CONTEXTTAG1 CtxTag1;
+ /** The unique identifier value. */
+ RTCRX509UNIQUEIDENTIFIER IssuerUniqueId;
+ } T1;
+ /** Subject unique identifier (optional, version >= v2). */
+ struct
+ {
+ /** Context tag with value 2. */
+ RTASN1CONTEXTTAG2 CtxTag2;
+ /** The unique identifier value. */
+ RTCRX509UNIQUEIDENTIFIER SubjectUniqueId;
+ } T2;
+ /** Extensions (optional, version >= v3). */
+ struct
+ {
+ /** Context tag with value 3. */
+ RTASN1CONTEXTTAG3 CtxTag3;
+ /** The unique identifier value. */
+ RTCRX509EXTENSIONS Extensions;
+ /** Extensions summary flags. */
+ uint32_t fFlags;
+ /** Key usage flags. */
+ uint32_t fKeyUsage;
+ /** Extended key usage flags. */
+ uint32_t fExtKeyUsage;
+
+ /** Pointer to the authority key ID extension if present. */
+ PCRTCRX509AUTHORITYKEYIDENTIFIER pAuthorityKeyIdentifier;
+ /** Pointer to the OLD authority key ID extension if present. */
+ PCRTCRX509OLDAUTHORITYKEYIDENTIFIER pOldAuthorityKeyIdentifier;
+ /** Pointer to the subject key ID extension if present. */
+ PCRTASN1OCTETSTRING pSubjectKeyIdentifier;
+ /** Pointer to the alternative subject name extension if present. */
+ PCRTCRX509GENERALNAMES pAltSubjectName;
+ /** Pointer to the alternative issuer name extension if present. */
+ PCRTCRX509GENERALNAMES pAltIssuerName;
+ /** Pointer to the certificate policies extension if present. */
+ PCRTCRX509CERTIFICATEPOLICIES pCertificatePolicies;
+ /** Pointer to the policy mappings extension if present. */
+ PCRTCRX509POLICYMAPPINGS pPolicyMappings;
+ /** Pointer to the basic constraints extension if present. */
+ PCRTCRX509BASICCONSTRAINTS pBasicConstraints;
+ /** Pointer to the name constraints extension if present. */
+ PCRTCRX509NAMECONSTRAINTS pNameConstraints;
+ /** Pointer to the policy constraints extension if present. */
+ PCRTCRX509POLICYCONSTRAINTS pPolicyConstraints;
+ /** Pointer to the inhibit anyPolicy extension if present. */
+ PCRTASN1INTEGER pInhibitAnyPolicy;
+ } T3;
+} RTCRX509TBSCERTIFICATE;
+/** Pointer to the IPRT representation of a X.509 TBSCertificate. */
+typedef RTCRX509TBSCERTIFICATE *PRTCRX509TBSCERTIFICATE;
+/** Pointer to the const IPRT representation of a X.509 TBSCertificate. */
+typedef RTCRX509TBSCERTIFICATE const *PCRTCRX509TBSCERTIFICATE;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRX509TBSCERTIFICATE, RTDECL, RTCrX509TbsCertificate, SeqCore.Asn1Core);
+
+/** @name RTCRX509TBSCERTIFICATE::T0.Version values.
+ * @{ */
+#define RTCRX509TBSCERTIFICATE_V1 0
+#define RTCRX509TBSCERTIFICATE_V2 1
+#define RTCRX509TBSCERTIFICATE_V3 2
+/** @} */
+
+/** @name RTCRX509TBSCERTIFICATE::T3.fFlags values.
+ * @{ */
+#define RTCRX509TBSCERTIFICATE_F_PRESENT_KEY_USAGE RT_BIT_32(0)
+#define RTCRX509TBSCERTIFICATE_F_PRESENT_EXT_KEY_USAGE RT_BIT_32(1)
+#define RTCRX509TBSCERTIFICATE_F_PRESENT_SUBJECT_KEY_IDENTIFIER RT_BIT_32(2)
+#define RTCRX509TBSCERTIFICATE_F_PRESENT_SUBJECT_ALT_NAME RT_BIT_32(3)
+#define RTCRX509TBSCERTIFICATE_F_PRESENT_ISSUER_ALT_NAME RT_BIT_32(4)
+#define RTCRX509TBSCERTIFICATE_F_PRESENT_CERTIFICATE_POLICIES RT_BIT_32(5)
+#define RTCRX509TBSCERTIFICATE_F_PRESENT_POLICY_MAPPINGS RT_BIT_32(6)
+#define RTCRX509TBSCERTIFICATE_F_PRESENT_BASIC_CONSTRAINTS RT_BIT_32(7)
+#define RTCRX509TBSCERTIFICATE_F_PRESENT_NAME_CONSTRAINTS RT_BIT_32(8)
+#define RTCRX509TBSCERTIFICATE_F_PRESENT_POLICY_CONSTRAINTS RT_BIT_32(9)
+#define RTCRX509TBSCERTIFICATE_F_PRESENT_AUTHORITY_KEY_IDENTIFIER RT_BIT_32(10)
+#define RTCRX509TBSCERTIFICATE_F_PRESENT_OLD_AUTHORITY_KEY_IDENTIFIER RT_BIT_32(11)
+#define RTCRX509TBSCERTIFICATE_F_PRESENT_ACCEPTABLE_CERT_POLICIES RT_BIT_32(12)
+#define RTCRX509TBSCERTIFICATE_F_PRESENT_INHIBIT_ANY_POLICY RT_BIT_32(13)
+#define RTCRX509TBSCERTIFICATE_F_PRESENT_OTHER RT_BIT_32(22) /**< Other unknown extension present. */
+#define RTCRX509TBSCERTIFICATE_F_PRESENT_NONE RT_BIT_32(23) /**< No extensions present. */
+/** @} */
+
+/** @name X.509 Key Usage flags. (RFC-5280 section 4.2.1.3.)
+ * @{ */
+#define RTCRX509CERT_KEY_USAGE_F_DIGITAL_SIGNATURE_BIT 0
+#define RTCRX509CERT_KEY_USAGE_F_DIGITAL_SIGNATURE RT_BIT_32(0)
+#define RTCRX509CERT_KEY_USAGE_F_CONTENT_COMMITTMENT_BIT 1
+#define RTCRX509CERT_KEY_USAGE_F_CONTENT_COMMITTMENT RT_BIT_32(1)
+#define RTCRX509CERT_KEY_USAGE_F_KEY_ENCIPHERMENT_BIT 2
+#define RTCRX509CERT_KEY_USAGE_F_KEY_ENCIPHERMENT RT_BIT_32(2)
+#define RTCRX509CERT_KEY_USAGE_F_DATA_ENCIPHERMENT_BIT 3
+#define RTCRX509CERT_KEY_USAGE_F_DATA_ENCIPHERMENT RT_BIT_32(3)
+#define RTCRX509CERT_KEY_USAGE_F_KEY_AGREEMENT_BIT 4
+#define RTCRX509CERT_KEY_USAGE_F_KEY_AGREEMENT RT_BIT_32(4)
+#define RTCRX509CERT_KEY_USAGE_F_KEY_CERT_SIGN_BIT 5
+#define RTCRX509CERT_KEY_USAGE_F_KEY_CERT_SIGN RT_BIT_32(5)
+#define RTCRX509CERT_KEY_USAGE_F_CRL_SIGN_BIT 6
+#define RTCRX509CERT_KEY_USAGE_F_CRL_SIGN RT_BIT_32(6)
+#define RTCRX509CERT_KEY_USAGE_F_ENCIPHERMENT_ONLY_BIT 7
+#define RTCRX509CERT_KEY_USAGE_F_ENCIPHERMENT_ONLY RT_BIT_32(7)
+#define RTCRX509CERT_KEY_USAGE_F_DECIPHERMENT_ONLY_BIT 8
+#define RTCRX509CERT_KEY_USAGE_F_DECIPHERMENT_ONLY RT_BIT_32(8)
+/** @} */
+
+/** @name X.509 Extended Key Usage flags. (RFC-5280 section 4.2.1.12, ++.)
+ * @remarks Needless to say, these flags doesn't cover all possible extended key
+ * usages, because there is a potential unlimited number of them. Only
+ * ones relevant to IPRT and it's users are covered.
+ * @{ */
+#define RTCRX509CERT_EKU_F_ANY RT_BIT_64(0)
+#define RTCRX509CERT_EKU_F_SERVER_AUTH RT_BIT_64(1)
+#define RTCRX509CERT_EKU_F_CLIENT_AUTH RT_BIT_64(2)
+#define RTCRX509CERT_EKU_F_CODE_SIGNING RT_BIT_64(3)
+#define RTCRX509CERT_EKU_F_EMAIL_PROTECTION RT_BIT_64(4)
+#define RTCRX509CERT_EKU_F_IPSEC_END_SYSTEM RT_BIT_64(5)
+#define RTCRX509CERT_EKU_F_IPSEC_TUNNEL RT_BIT_64(6)
+#define RTCRX509CERT_EKU_F_IPSEC_USER RT_BIT_64(7)
+#define RTCRX509CERT_EKU_F_TIME_STAMPING RT_BIT_64(8)
+#define RTCRX509CERT_EKU_F_OCSP_SIGNING RT_BIT_64(9)
+#define RTCRX509CERT_EKU_F_DVCS RT_BIT_64(10)
+#define RTCRX509CERT_EKU_F_SBGP_CERT_AA_SERVICE_AUTH RT_BIT_64(11)
+#define RTCRX509CERT_EKU_F_EAP_OVER_PPP RT_BIT_64(12)
+#define RTCRX509CERT_EKU_F_EAP_OVER_LAN RT_BIT_64(13)
+#define RTCRX509CERT_EKU_F_OTHER RT_BIT_64(16) /**< Other unknown extended key usage present. */
+#define RTCRX509CERT_EKU_F_APPLE_CODE_SIGNING RT_BIT_64(24)
+#define RTCRX509CERT_EKU_F_APPLE_CODE_SIGNING_DEVELOPMENT RT_BIT_64(25)
+#define RTCRX509CERT_EKU_F_APPLE_SOFTWARE_UPDATE_SIGNING RT_BIT_64(26)
+#define RTCRX509CERT_EKU_F_APPLE_CODE_SIGNING_THIRD_PARTY RT_BIT_64(27)
+#define RTCRX509CERT_EKU_F_APPLE_RESOURCE_SIGNING RT_BIT_64(28)
+#define RTCRX509CERT_EKU_F_APPLE_SYSTEM_IDENTITY RT_BIT_64(29)
+#define RTCRX509CERT_EKU_F_MS_TIMESTAMP_SIGNING RT_BIT_64(32)
+#define RTCRX509CERT_EKU_F_MS_NT5_CRYPTO RT_BIT_64(33)
+#define RTCRX509CERT_EKU_F_MS_OEM_WHQL_CRYPTO RT_BIT_64(34)
+#define RTCRX509CERT_EKU_F_MS_EMBEDDED_NT_CRYPTO RT_BIT_64(35)
+#define RTCRX509CERT_EKU_F_MS_KERNEL_MODE_CODE_SIGNING RT_BIT_64(36)
+#define RTCRX509CERT_EKU_F_MS_LIFETIME_SIGNING RT_BIT_64(37)
+#define RTCRX509CERT_EKU_F_MS_DRM RT_BIT_64(38)
+#define RTCRX509CERT_EKU_F_MS_DRM_INDIVIDUALIZATION RT_BIT_64(39)
+/** @} */
+
+/** @name Key purpose OIDs (extKeyUsage)
+ * @{ */
+#define RTCRX509_ANY_EXTENDED_KEY_USAGE_OID "2.5.29.37.0"
+#define RTCRX509_ID_KP_OID "1.3.6.1.5.5.7.3"
+#define RTCRX509_ID_KP_SERVER_AUTH_OID "1.3.6.1.5.5.7.3.1"
+#define RTCRX509_ID_KP_CLIENT_AUTH_OID "1.3.6.1.5.5.7.3.2"
+#define RTCRX509_ID_KP_CODE_SIGNING_OID "1.3.6.1.5.5.7.3.3"
+#define RTCRX509_ID_KP_EMAIL_PROTECTION_OID "1.3.6.1.5.5.7.3.4"
+#define RTCRX509_ID_KP_IPSEC_END_SYSTEM_OID "1.3.6.1.5.5.7.3.5"
+#define RTCRX509_ID_KP_IPSEC_TUNNEL_OID "1.3.6.1.5.5.7.3.6"
+#define RTCRX509_ID_KP_IPSEC_USER_OID "1.3.6.1.5.5.7.3.7"
+#define RTCRX509_ID_KP_TIME_STAMPING_OID "1.3.6.1.5.5.7.3.8"
+#define RTCRX509_ID_KP_OCSP_SIGNING_OID "1.3.6.1.5.5.7.3.9"
+#define RTCRX509_ID_KP_DVCS_OID "1.3.6.1.5.5.7.3.10"
+#define RTCRX509_ID_KP_SBGP_CERT_AA_SERVICE_AUTH_OID "1.3.6.1.5.5.7.3.11"
+#define RTCRX509_ID_KP_EAP_OVER_PPP_OID "1.3.6.1.5.5.7.3.13"
+#define RTCRX509_ID_KP_EAP_OVER_LAN_OID "1.3.6.1.5.5.7.3.14"
+/** @} */
+
+/** @name Microsoft extended key usage OIDs
+ * @{ */
+#define RTCRX509_MS_EKU_CERT_TRUST_LIST_SIGNING_OID "1.3.6.1.4.1.311.10.3.1"
+#define RTCRX509_MS_EKU_TIMESTAMP_SIGNING_OID "1.3.6.1.4.1.311.10.3.2"
+#define RTCRX509_MS_EKU_SERVER_GATED_CRYPTO_OID "1.3.6.1.4.1.311.10.3.3"
+#define RTCRX509_MS_EKU_SGC_SERIALIZED_OID "1.3.6.1.4.1.311.10.3.3.1"
+#define RTCRX509_MS_EKU_ENCRYPTED_FILE_SYSTEM_OID "1.3.6.1.4.1.311.10.3.4"
+#define RTCRX509_MS_EKU_WHQL_CRYPTO_OID "1.3.6.1.4.1.311.10.3.5"
+#define RTCRX509_MS_EKU_NT5_CRYPTO_OID "1.3.6.1.4.1.311.10.3.6"
+#define RTCRX509_MS_EKU_OEM_WHQL_CRYPTO_OID "1.3.6.1.4.1.311.10.3.7"
+#define RTCRX509_MS_EKU_EMBEDDED_NT_CRYPTO_OID "1.3.6.1.4.1.311.10.3.8"
+#define RTCRX509_MS_EKU_ROOT_LIST_SIGNER_OID "1.3.6.1.4.1.311.10.3.9"
+#define RTCRX509_MS_EKU_QUALIFIED_SUBORDINATE_OID "1.3.6.1.4.1.311.10.3.10"
+#define RTCRX509_MS_EKU_KEY_RECOVERY_3_OID "1.3.6.1.4.1.311.10.3.11"
+#define RTCRX509_MS_EKU_DOCUMENT_SIGNING_OID "1.3.6.1.4.1.311.10.3.12"
+#define RTCRX509_MS_EKU_LIFETIME_SIGNING_OID "1.3.6.1.4.1.311.10.3.13"
+#define RTCRX509_MS_EKU_MOBILE_DEVICE_SOFTWARE_OID "1.3.6.1.4.1.311.10.3.14"
+#define RTCRX509_MS_EKU_SMART_DISPLAY_OID "1.3.6.1.4.1.311.10.3.15"
+#define RTCRX509_MS_EKU_CSP_SIGNATURE_OID "1.3.6.1.4.1.311.10.3.16"
+#define RTCRX509_MS_EKU_EFS_RECOVERY_OID "1.3.6.1.4.1.311.10.3.4.1"
+#define RTCRX509_MS_EKU_DRM_OID "1.3.6.1.4.1.311.10.5.1"
+#define RTCRX509_MS_EKU_DRM_INDIVIDUALIZATION_OID "1.3.6.1.4.1.311.10.5.2"
+#define RTCRX509_MS_EKU_LICENSES_OID "1.3.6.1.4.1.311.10.5.3"
+#define RTCRX509_MS_EKU_LICENSE_SERVER_OID "1.3.6.1.4.1.311.10.5.4"
+#define RTCRX509_MS_EKU_ENROLLMENT_AGENT_OID "1.3.6.1.4.1.311.20.2.1"
+#define RTCRX509_MS_EKU_SMARTCARD_LOGON_OID "1.3.6.1.4.1.311.20.2.2"
+#define RTCRX509_MS_EKU_CA_EXCHANGE_OID "1.3.6.1.4.1.311.21.5"
+#define RTCRX509_MS_EKU_KEY_RECOVERY_21_OID "1.3.6.1.4.1.311.21.6"
+#define RTCRX509_MS_EKU_SYSTEM_HEALTH_OID "1.3.6.1.4.1.311.47.1.1"
+#define RTCRX509_MS_EKU_SYSTEM_HEALTH_LOOPHOLE_OID "1.3.6.1.4.1.311.47.1.3"
+#define RTCRX509_MS_EKU_KERNEL_MODE_CODE_SIGNING_OID "1.3.6.1.4.1.311.61.1.1"
+/** @} */
+
+/** @name Microsoft extended key usage OIDs
+ * @{ */
+#define RTCRX509_APPLE_EKU_APPLE_EXTENDED_KEY_USAGE_OID "1.2.840.113635.100.4"
+#define RTCRX509_APPLE_EKU_CODE_SIGNING_OID "1.2.840.113635.100.4.1"
+#define RTCRX509_APPLE_EKU_CODE_SIGNING_DEVELOPMENT_OID "1.2.840.113635.100.4.1.1"
+#define RTCRX509_APPLE_EKU_SOFTWARE_UPDATE_SIGNING_OID "1.2.840.113635.100.4.1.2"
+#define RTCRX509_APPLE_EKU_CODE_SIGNING_THRID_PARTY_OID "1.2.840.113635.100.4.1.3"
+#define RTCRX509_APPLE_EKU_RESOURCE_SIGNING_OID "1.2.840.113635.100.4.1.4"
+#define RTCRX509_APPLE_EKU_ICHAT_SIGNING_OID "1.2.840.113635.100.4.2"
+#define RTCRX509_APPLE_EKU_ICHAT_ENCRYPTION_OID "1.2.840.113635.100.4.3"
+#define RTCRX509_APPLE_EKU_SYSTEM_IDENTITY_OID "1.2.840.113635.100.4.4"
+#define RTCRX509_APPLE_EKU_CRYPTO_ENV_OID "1.2.840.113635.100.4.5"
+#define RTCRX509_APPLE_EKU_CRYPTO_PRODUCTION_ENV_OID "1.2.840.113635.100.4.5.1"
+#define RTCRX509_APPLE_EKU_CRYPTO_MAINTENANCE_ENV_OID "1.2.840.113635.100.4.5.2"
+#define RTCRX509_APPLE_EKU_CRYPTO_TEST_ENV_OID "1.2.840.113635.100.4.5.3"
+#define RTCRX509_APPLE_EKU_CRYPTO_DEVELOPMENT_ENV_OID "1.2.840.113635.100.4.5.4"
+#define RTCRX509_APPLE_EKU_CRYPTO_QOS_OID "1.2.840.113635.100.4.6"
+#define RTCRX509_APPLE_EKU_CRYPTO_TIER0_QOS_OID "1.2.840.113635.100.4.6.1"
+#define RTCRX509_APPLE_EKU_CRYPTO_TIER1_QOS_OID "1.2.840.113635.100.4.6.2"
+#define RTCRX509_APPLE_EKU_CRYPTO_TIER2_QOS_OID "1.2.840.113635.100.4.6.3"
+#define RTCRX509_APPLE_EKU_CRYPTO_TIER3_QOS_OID "1.2.840.113635.100.4.6.4"
+/** @} */
+
+/**
+ * Use this to update derived values after changing the certificate
+ * extensions.
+ *
+ * @returns IPRT status code
+ * @param pThis The certificate.
+ * @param pErrInfo Where to return additional error information. Optional.
+ */
+RTDECL(int) RTCrX509TbsCertificate_ReprocessExtensions(PRTCRX509TBSCERTIFICATE pThis, PRTERRINFO pErrInfo);
+
+
+/**
+ * One X.509 Certificate (IPRT representation).
+ */
+typedef struct RTCRX509CERTIFICATE
+{
+ /** Sequence core. */
+ RTASN1SEQUENCECORE SeqCore;
+ /** The to-be-signed certificate information. */
+ RTCRX509TBSCERTIFICATE TbsCertificate;
+ /** The signature algorithm (must match TbsCertificate.Signature). */
+ RTCRX509ALGORITHMIDENTIFIER SignatureAlgorithm;
+ /** The signature value. */
+ RTASN1BITSTRING SignatureValue;
+} RTCRX509CERTIFICATE;
+/** Pointer to the IPRT representation of one X.509 certificate. */
+typedef RTCRX509CERTIFICATE *PRTCRX509CERTIFICATE;
+/** Pointer to the const IPRT representation of one X.509 certificate. */
+typedef RTCRX509CERTIFICATE const *PCRTCRX509CERTIFICATE;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRX509CERTIFICATE, RTDECL, RTCrX509Certificate, SeqCore.Asn1Core);
+
+/**
+ * Checks if a certificate matches a given issuer name and serial number.
+ *
+ * @returns True / false.
+ * @param pCertificates The X.509 certificat.
+ * @param pIssuer The issuer name to match against.
+ * @param pSerialNumber The serial number to match against.
+ */
+RTDECL(bool) RTCrX509Certificate_MatchIssuerAndSerialNumber(PCRTCRX509CERTIFICATE pCertificate,
+ PCRTCRX509NAME pIssuer, PCRTASN1INTEGER pSerialNumber);
+
+RTDECL(bool) RTCrX509Certificate_MatchSubjectOrAltSubjectByRfc5280(PCRTCRX509CERTIFICATE pThis, PCRTCRX509NAME pName);
+RTDECL(bool) RTCrX509Certificate_IsSelfSigned(PCRTCRX509CERTIFICATE pCertificate);
+
+RTDECL(int) RTCrX509Certificate_VerifySignature(PCRTCRX509CERTIFICATE pThis, PCRTASN1OBJID pAlgorithm,
+ PCRTASN1DYNTYPE pParameters, PCRTASN1BITSTRING pPublicKey,
+ PRTERRINFO pErrInfo);
+RTDECL(int) RTCrX509Certificate_ReadFromFile(PRTCRX509CERTIFICATE pCertificate, const char *pszFilename, uint32_t fFlags,
+ PCRTASN1ALLOCATORVTABLE pAllocator, PRTERRINFO pErrInfo);
+
+
+/** @name X.509 Certificate Extensions
+ * @{ */
+/** Old AuthorityKeyIdentifier OID. */
+#define RTCRX509_ID_CE_OLD_AUTHORITY_KEY_IDENTIFIER_OID "2.5.29.1"
+/** Old CertificatePolicies extension OID. */
+#define RTCRX509_ID_CE_OLD_CERTIFICATE_POLICIES_OID "2.5.29.3"
+/** Old SubjectAltName extension OID. */
+#define RTCRX509_ID_CE_OLD_SUBJECT_ALT_NAME_OID "2.5.29.7"
+/** Old IssuerAltName extension OID. */
+#define RTCRX509_ID_CE_OLD_ISSUER_ALT_NAME_OID "2.5.29.8"
+/** Old BasicContraints extension OID. */
+#define RTCRX509_ID_CE_OLD_BASIC_CONSTRAINTS_OID "2.5.29.10"
+/** SubjectKeyIdentifier OID. */
+#define RTCRX509_ID_CE_SUBJECT_KEY_IDENTIFIER_OID "2.5.29.14"
+/** KeyUsage OID. */
+#define RTCRX509_ID_CE_KEY_USAGE_OID "2.5.29.15"
+/** PrivateKeyUsagePeriod OID. */
+#define RTCRX509_ID_CE_PRIVATE_KEY_USAGE_PERIOD_OID "2.5.29.16"
+/** SubjectAltName extension OID. */
+#define RTCRX509_ID_CE_SUBJECT_ALT_NAME_OID "2.5.29.17"
+/** IssuerAltName extension OID. */
+#define RTCRX509_ID_CE_ISSUER_ALT_NAME_OID "2.5.29.18"
+/** BasicContraints extension OID. */
+#define RTCRX509_ID_CE_BASIC_CONSTRAINTS_OID "2.5.29.19"
+/** NameContraints extension OID. */
+#define RTCRX509_ID_CE_NAME_CONSTRAINTS_OID "2.5.29.30"
+/** CertificatePolicies extension OID. */
+#define RTCRX509_ID_CE_CERTIFICATE_POLICIES_OID "2.5.29.32"
+/** PolicyMappings extension OID. */
+#define RTCRX509_ID_CE_POLICY_MAPPINGS_OID "2.5.29.33"
+/** AuthorityKeyIdentifier OID. */
+#define RTCRX509_ID_CE_AUTHORITY_KEY_IDENTIFIER_OID "2.5.29.35"
+/** PolicyContraints extension OID. */
+#define RTCRX509_ID_CE_POLICY_CONSTRAINTS_OID "2.5.29.36"
+/** ExtKeyUsage (extended key usage) extension OID. */
+#define RTCRX509_ID_CE_EXT_KEY_USAGE_OID "2.5.29.37"
+/** ExtKeyUsage: OID for permitting any unspecified key usage. */
+#define RTCRX509_ID_CE_ANY_EXTENDED_KEY_USAGE_OID "2.5.29.37.0"
+/** AuthorityAttributeIdentifier OID. */
+#define RTCRX509_ID_CE_AUTHORITY_ATTRIBUTE_IDENTIFIER_OID "2.5.29.38"
+/** AcceptableCertPolicies OID. */
+#define RTCRX509_ID_CE_ACCEPTABLE_CERT_POLICIES_OID "2.5.29.52"
+/** InhibitAnyPolicy OID. */
+#define RTCRX509_ID_CE_INHIBIT_ANY_POLICY_OID "2.5.29.54"
+/** @} */
+
+
+/*
+ * Sequence of X.509 Certifcates (IPRT representation).
+ */
+RTASN1_IMPL_GEN_SET_OF_TYPEDEFS_AND_PROTOS(RTCRX509CERTIFICATES, RTCRX509CERTIFICATE, RTDECL, RTCrX509Certificates);
+
+/**
+ * Looks up a certificate by issuer name and serial number.
+ *
+ * @returns Pointer to the given certificate if found, NULL if not.
+ * @param pCertificates The X.509 certificate set to search.
+ * @param pIssuer The issuer name of the wanted certificate.
+ * @param pSerialNumber The serial number of the wanted certificate.
+ */
+RTDECL(PCRTCRX509CERTIFICATE) RTCrX509Certificates_FindByIssuerAndSerialNumber(PCRTCRX509CERTIFICATES pCertificates,
+ PCRTCRX509NAME pIssuer,
+ PCRTASN1INTEGER pSerialNumber);
+
+
+
+RTDECL(int) RTCrX509CertPathsCreate(PRTCRX509CERTPATHS phCertPaths, PCRTCRX509CERTIFICATE pTarget);
+RTDECL(uint32_t) RTCrX509CertPathsRetain(RTCRX509CERTPATHS hCertPaths);
+RTDECL(uint32_t) RTCrX509CertPathsRelease(RTCRX509CERTPATHS hCertPaths);
+RTDECL(int) RTCrX509CertPathsSetTrustedStore(RTCRX509CERTPATHS hCertPaths, RTCRSTORE hTrustedStore);
+RTDECL(int) RTCrX509CertPathsSetUntrustedStore(RTCRX509CERTPATHS hCertPaths, RTCRSTORE hUntrustedStore);
+RTDECL(int) RTCrX509CertPathsSetUntrustedArray(RTCRX509CERTPATHS hCertPaths, PCRTCRX509CERTIFICATE paCerts, uint32_t cCerts);
+RTDECL(int) RTCrX509CertPathsSetValidTime(RTCRX509CERTPATHS hCertPaths, PCRTTIME pTime);
+RTDECL(int) RTCrX509CertPathsSetValidTimeSpec(RTCRX509CERTPATHS hCertPaths, PCRTTIMESPEC pTimeSpec);
+RTDECL(int) RTCrX509CertPathsCreateEx(PRTCRX509CERTPATHS phCertPaths, PCRTCRX509CERTIFICATE pTarget, RTCRSTORE hTrustedStore,
+ RTCRSTORE hUntrustedStore, PCRTCRX509CERTIFICATE paUntrustedCerts, uint32_t cUntrustedCerts,
+ PCRTTIMESPEC pValidTime);
+RTDECL(int) RTCrX509CertPathsBuild(RTCRX509CERTPATHS hCertPaths, PRTERRINFO pErrInfo);
+RTDECL(int) RTCrX509CertPathsDumpOne(RTCRX509CERTPATHS hCertPaths, uint32_t iPath, uint32_t uVerbosity,
+ PFNRTDUMPPRINTFV pfnPrintfV, void *pvUser);
+RTDECL(int) RTCrX509CertPathsDumpAll(RTCRX509CERTPATHS hCertPaths, uint32_t uVerbosity,
+ PFNRTDUMPPRINTFV pfnPrintfV, void *pvUser);
+
+RTDECL(int) RTCrX509CertPathsValidateOne(RTCRX509CERTPATHS hCertPaths, uint32_t iPath, PRTERRINFO pErrInfo);
+RTDECL(int) RTCrX509CertPathsValidateAll(RTCRX509CERTPATHS hCertPaths, uint32_t *pcValidPaths, PRTERRINFO pErrInfo);
+
+RTDECL(uint32_t) RTCrX509CertPathsGetPathCount(RTCRX509CERTPATHS hCertPaths);
+RTDECL(int) RTCrX509CertPathsQueryPathInfo(RTCRX509CERTPATHS hCertPaths, uint32_t iPath,
+ bool *pfTrusted, uint32_t *pcNodes, PCRTCRX509NAME *ppSubject,
+ PCRTCRX509SUBJECTPUBLICKEYINFO *ppPublicKeyInfo,
+ PCRTCRX509CERTIFICATE *ppCert, PCRTCRCERTCTX *ppCertCtx, int *prcVerify);
+RTDECL(uint32_t) RTCrX509CertPathsGetPathLength(RTCRX509CERTPATHS hCertPaths, uint32_t iPath);
+RTDECL(int) RTCrX509CertPathsGetPathVerifyResult(RTCRX509CERTPATHS hCertPaths, uint32_t iPath);
+RTDECL(PCRTCRX509CERTIFICATE) RTCrX509CertPathsGetPathNodeCert(RTCRX509CERTPATHS hCertPaths, uint32_t iPath, uint32_t iNode);
+
+
+RT_C_DECLS_END
+
+/** @} */
+
+/** @} */
+
+#endif
+
diff --git a/include/iprt/err.h b/include/iprt/err.h
index 87d4fcd0cdb..c109ff9068d 100644
--- a/include/iprt/err.h
+++ b/include/iprt/err.h
@@ -437,12 +437,14 @@ DECLINLINE(PRTERRINFO) RTErrInfoInit(PRTERRINFO pErrInfo, char *pszMsg, size_t c
/**
* Initialize a static error info structure.
*
+ * @returns Pointer to the core error info structure.
* @param pStaticErrInfo The static error info structure to init.
*/
-DECLINLINE(void) RTErrInfoInitStatic(PRTERRINFOSTATIC pStaticErrInfo)
+DECLINLINE(PRTERRINFO) RTErrInfoInitStatic(PRTERRINFOSTATIC pStaticErrInfo)
{
RTErrInfoInit(&pStaticErrInfo->Core, pStaticErrInfo->szMsg, sizeof(pStaticErrInfo->szMsg));
pStaticErrInfo->Core.fFlags = RTERRINFO_FLAGS_T_STATIC | RTERRINFO_FLAGS_MAGIC;
+ return &pStaticErrInfo->Core;
}
/**
@@ -512,6 +514,41 @@ RTDECL(int) RTErrInfoSetF(PRTERRINFO pErrInfo, int rc, const char *pszFo
RTDECL(int) RTErrInfoSetV(PRTERRINFO pErrInfo, int rc, const char *pszFormat, va_list va);
/**
+ * Adds more error info details.
+ *
+ * @returns @a rc.
+ *
+ * @param pErrInfo The error info structure to fill in.
+ * @param rc The status code to return.
+ * @param pszMsg The error message string to add.
+ */
+RTDECL(int) RTErrInfoAdd(PRTERRINFO pErrInfo, int rc, const char *pszMsg);
+
+/**
+ * Adds more error info details, with a sprintf style message.
+ *
+ * @returns @a rc.
+ *
+ * @param pErrInfo The error info structure to fill in.
+ * @param rc The status code to return.
+ * @param pszFormat The format string to add.
+ * @param ... The format arguments.
+ */
+RTDECL(int) RTErrInfoAddF(PRTERRINFO pErrInfo, int rc, const char *pszFormat, ...);
+
+/**
+ * Adds more error info details, with a vsprintf style message.
+ *
+ * @returns @a rc.
+ *
+ * @param pErrInfo The error info structure to fill in.
+ * @param rc The status code to return.
+ * @param pszFormat The format string to add.
+ * @param va The format arguments.
+ */
+RTDECL(int) RTErrInfoAddV(PRTERRINFO pErrInfo, int rc, const char *pszFormat, va_list va);
+
+/**
* Checks if the error info is set.
*
* @returns true if set, false if not.
@@ -1922,6 +1959,488 @@ RT_C_DECLS_END
#define VINF_X509_NOT_SELFSIGNED_CERTIFICATE 23109
/** @} */
+/** @name RTAsn1 status codes
+ * @{ */
+/** Temporary place holder. */
+#define VERR_ASN1_ERROR (-22800)
+/** Encountered an ASN.1 string type that is not supported. */
+#define VERR_ASN1_STRING_TYPE_NOT_IMPLEMENTED (-22801)
+/** Invalid ASN.1 UTF-8 STRING encoding. */
+#define VERR_ASN1_INVALID_UTF8_STRING_ENCODING (-22802)
+/** Invalid ASN.1 NUMERIC STRING encoding. */
+#define VERR_ASN1_INVALID_NUMERIC_STRING_ENCODING (-22803)
+/** Invalid ASN.1 PRINTABLE STRING encoding. */
+#define VERR_ASN1_INVALID_PRINTABLE_STRING_ENCODING (-22804)
+/** Invalid ASN.1 T61/TELETEX STRING encoding. */
+#define VERR_ASN1_INVALID_T61_STRING_ENCODING (-22805)
+/** Invalid ASN.1 VIDEOTEX STRING encoding. */
+#define VERR_ASN1_INVALID_VIDEOTEX_STRING_ENCODING (-22806)
+/** Invalid ASN.1 IA5 STRING encoding. */
+#define VERR_ASN1_INVALID_IA5_STRING_ENCODING (-22807)
+/** Invalid ASN.1 GRAPHIC STRING encoding. */
+#define VERR_ASN1_INVALID_GRAPHIC_STRING_ENCODING (-22808)
+/** Invalid ASN.1 ISO-646/VISIBLE STRING encoding. */
+#define VERR_ASN1_INVALID_VISIBLE_STRING_ENCODING (-22809)
+/** Invalid ASN.1 GENERAL STRING encoding. */
+#define VERR_ASN1_INVALID_GENERAL_STRING_ENCODING (-22810)
+/** Invalid ASN.1 UNIVERSAL STRING encoding. */
+#define VERR_ASN1_INVALID_UNIVERSAL_STRING_ENCODING (-22811)
+/** Invalid ASN.1 BMP STRING encoding. */
+#define VERR_ASN1_INVALID_BMP_STRING_ENCODING (-22812)
+/** Invalid ASN.1 OBJECT IDENTIFIER encoding. */
+#define VERR_ASN1_INVALID_OBJID_ENCODING (-22813)
+/** A component value of an ASN.1 OBJECT IDENTIFIER is too big for our
+ * internal representation (32-bits). */
+#define VERR_ASN1_OBJID_COMPONENT_TOO_BIG (-22814)
+/** Too many components in an ASN.1 OBJECT IDENTIFIER for our internal
+ * representation. */
+#define VERR_ASN1_OBJID_TOO_MANY_COMPONENTS (-22815)
+/** The dotted-string representation of an ASN.1 OBJECT IDENTIFIER would be too
+ * long for our internal representation. */
+#define VERR_ASN1_OBJID_TOO_LONG_STRING_FORM (-22816)
+/** Invalid dotted string. */
+#define VERR_ASN1_OBJID_INVALID_DOTTED_STRING (-22817)
+/** Constructed string type not implemented. */
+#define VERR_ASN1_CONSTRUCTED_STRING_NOT_IMPL (-22818)
+/** Expected a different string tag. */
+#define VERR_ASN1_STRING_TAG_MISMATCH (-22819)
+/** Expected a different time tag. */
+#define VERR_ASN1_TIME_TAG_MISMATCH (-22820)
+/** More unconsumed data available. */
+#define VINF_ASN1_MORE_DATA (22821)
+/** RTAsnEncodeWriteHeader return code indicating that nothing was written
+ * and the content should be skipped as well. */
+#define VINF_ASN1_NOT_ENCODED (22822)
+/** Unknown escape sequence encountered in TeletexString. */
+#define VERR_ASN1_TELETEX_UNKNOWN_ESC_SEQ (-22823)
+/** Unsupported escape sequence encountered in TeletexString. */
+#define VERR_ASN1_TELETEX_UNSUPPORTED_ESC_SEQ (-22824)
+/** Unsupported character set. */
+#define VERR_ASN1_TELETEX_UNSUPPORTED_CHARSET (-22825)
+/** ASN.1 object has no virtual method table. */
+#define VERR_ASN1_NO_VTABLE (-22826)
+/** ASN.1 object has no pfnCheckSanity method. */
+#define VERR_ASN1_NO_CHECK_SANITY_METHOD (-22827)
+/** ASN.1 object is not present */
+#define VERR_ASN1_NOT_PRESENT (-22828)
+/** There are unconsumed bytes after decoding an ASN.1 object. */
+#define VERR_ASN1_CURSOR_NOT_AT_END (-22829)
+/** Long ASN.1 tag form is not implemented. */
+#define VERR_ASN1_CURSOR_LONG_TAG (-22830)
+/** Bad ASN.1 object length encoding. */
+#define VERR_ASN1_CURSOR_BAD_LENGTH_ENCODING (-22831)
+/** Indefinite length form is against the rules. */
+#define VERR_ASN1_CURSOR_ILLEGAL_IDEFINITE_LENGTH (-22832)
+/** Indefinite length form is not implemented. */
+#define VERR_ASN1_CURSOR_IDEFINITE_LENGTH_NOT_SUP (-22833)
+/** ASN.1 object length goes beyond the end of the byte stream being decoded. */
+#define VERR_ASN1_CURSOR_BAD_LENGTH (-22834)
+/** Not more data in ASN.1 byte stream. */
+#define VERR_ASN1_CURSOR_NO_MORE_DATA (-22835)
+/** Too little data in ASN.1 byte stream. */
+#define VERR_ASN1_CURSOR_TOO_LITTLE_DATA_LEFT (-22836)
+/** Constructed string is not according to the encoding rules. */
+#define VERR_ASN1_CURSOR_ILLEGAL_CONSTRUCTED_STRING (-22837)
+/** Unexpected ASN.1 tag encountered while decoding. */
+#define VERR_ASN1_CURSOR_TAG_MISMATCH (-22838)
+/** Unexpected ASN.1 tag class/flag encountered while decoding. */
+#define VERR_ASN1_CURSOR_TAG_FLAG_CLASS_MISMATCH (-22839)
+/** ASN.1 bit string object is out of bounds. */
+#define VERR_ASN1_BITSTRING_OUT_OF_BOUNDS (-22840)
+/** Bad ASN.1 time object. */
+#define VERR_ASN1_TIME_BAD_NORMALIZE_INPUT (-22841)
+/** Failed to normalize ASN.1 time object. */
+#define VERR_ASN1_TIME_NORMALIZE_ERROR (-22842)
+/** Normalization of ASN.1 time object didn't work out. */
+#define VERR_ASN1_TIME_NORMALIZE_MISMATCH (-22843)
+/** Invalid ASN.1 UTC TIME encoding. */
+#define VERR_ASN1_INVALID_UTC_TIME_ENCODING (-22844)
+/** Invalid ASN.1 GENERALIZED TIME encoding. */
+#define VERR_ASN1_INVALID_GENERALIZED_TIME_ENCODING (-22845)
+/** Invalid ASN.1 BOOLEAN encoding. */
+#define VERR_ASN1_INVALID_BOOLEAN_ENCODING (-22846)
+/** Invalid ASN.1 NULL encoding. */
+#define VERR_ASN1_INVALID_NULL_ENCODING (-22847)
+/** Invalid ASN.1 BIT STRING encoding. */
+#define VERR_ASN1_INVALID_BITSTRING_ENCODING (-22848)
+/** Unimplemented ASN.1 tag reached the RTAsn1DynType code. */
+#define VERR_ASN1_DYNTYPE_TAG_NOT_IMPL (-22849)
+/** ASN.1 tag and flags/class mismatch in RTAsn1DynType code. */
+#define VERR_ASN1_DYNTYPE_BAD_TAG (-22850)
+/** Unexpected ASN.1 fake/dummy object. */
+#define VERR_ASN1_DUMMY_OBJECT (-22851)
+/** ASN.1 object is too long. */
+#define VERR_ASN1_TOO_LONG (-22852)
+/** Expected primitive ASN.1 object. */
+#define VERR_ASN1_EXPECTED_PRIMITIVE (-22853)
+/** Expected valid data pointer for ASN.1 object. */
+#define VERR_ASN1_INVALID_DATA_POINTER (-22854)
+
+/** ANS.1 internal error 1. */
+#define VERR_ASN1_INTERNAL_ERROR_1 (-22895)
+/** ANS.1 internal error 2. */
+#define VERR_ASN1_INTERNAL_ERROR_2 (-22896)
+/** ANS.1 internal error 3. */
+#define VERR_ASN1_INTERNAL_ERROR_3 (-22897)
+/** ANS.1 internal error 4. */
+#define VERR_ASN1_INTERNAL_ERROR_4 (-22898)
+/** ANS.1 internal error 5. */
+#define VERR_ASN1_INTERNAL_ERROR_5 (-22899)
+/** @} */
+
+/** @name More RTLdr status codes.
+ * @{ */
+/** Image Verficiation Failure: No Authenticode Signature. */
+#define VERR_LDRVI_NOT_SIGNED (-22900)
+/** Image Verficiation Warning: No Authenticode Signature, but on whitelist. */
+#define VINF_LDRVI_NOT_SIGNED (22900)
+/** Image Verficiation Failure: Error reading image headers. */
+#define VERR_LDRVI_READ_ERROR_HDR (-22901)
+/** Image Verficiation Failure: Error reading section headers. */
+#define VERR_LDRVI_READ_ERROR_SHDRS (-22902)
+/** Image Verficiation Failure: Error reading authenticode signature data. */
+#define VERR_LDRVI_READ_ERROR_SIGNATURE (-22903)
+/** Image Verficiation Failure: Error reading file for hashing. */
+#define VERR_LDRVI_READ_ERROR_HASH (-22904)
+/** Image Verficiation Failure: Error determining the file length. */
+#define VERR_LDRVI_FILE_LENGTH_ERROR (-22905)
+/** Image Verficiation Failure: Error allocating memory for state data. */
+#define VERR_LDRVI_NO_MEMORY_STATE (-22906)
+/** Image Verficiation Failure: Error allocating memory for authenticode
+ * signature data. */
+#define VERR_LDRVI_NO_MEMORY_SIGNATURE (-22907)
+/** Image Verficiation Failure: Error allocating memory for section headers. */
+#define VERR_LDRVI_NO_MEMORY_SHDRS (-22908)
+/** Image Verficiation Failure: Authenticode parsing output. */
+#define VERR_LDRVI_NO_MEMORY_PARSE_OUTPUT (-22909)
+/** Image Verficiation Failure: Invalid security directory entry. */
+#define VERR_LDRVI_INVALID_SECURITY_DIR_ENTRY (-22910)
+/** Image Verficiation Failure: */
+#define VERR_LDRVI_BAD_CERT_HDR_LENGTH (-22911)
+/** Image Verficiation Failure: */
+#define VERR_LDRVI_BAD_CERT_HDR_REVISION (-22912)
+/** Image Verficiation Failure: */
+#define VERR_LDRVI_BAD_CERT_HDR_TYPE (-22913)
+/** Image Verficiation Failure: More than one certificate table entry. */
+#define VERR_LDRVI_BAD_CERT_MULTIPLE (-22914)
+
+/** Image Verficiation Failure: */
+#define VERR_LDRVI_BAD_MZ_OFFSET (-22915)
+/** Image Verficiation Failure: Invalid section count. */
+#define VERR_LDRVI_INVALID_SECTION_COUNT (-22916)
+/** Image Verficiation Failure: Raw data offsets and sizes are out of range. */
+#define VERR_LDRVI_SECTION_RAW_DATA_VALUES (-22917)
+/** Optional header magic and target machine does not match. */
+#define VERR_LDRVI_MACHINE_OPT_HDR_MAGIC_MISMATCH (-22918)
+/** Unsupported image target architecture. */
+#define VERR_LDRVI_UNSUPPORTED_ARCH (-22919)
+
+/** Image Verification Failure: Internal error in signature parser. */
+#define VERR_LDRVI_PARSE_IPE (-22921)
+/** Generic BER parse error. Will be refined later. */
+#define VERR_LDRVI_PARSE_BER_ERROR (-22922)
+
+/** Expected the signed data content to be the object ID of
+ * SpcIndirectDataContent, found something else instead. */
+#define VERR_LDRVI_EXPECTED_INDIRECT_DATA_CONTENT_OID (-22923)
+/** Page hash table size overflow. */
+#define VERR_LDRVI_PAGE_HASH_TAB_SIZE_OVERFLOW (-22924)
+/** Page hash table is too long (covers signature data, i.e. itself). */
+#define VERR_LDRVI_PAGE_HASH_TAB_TOO_LONG (-22925)
+/** The page hash table is not strictly ordered by offset. */
+#define VERR_LDRVI_PAGE_HASH_TAB_NOT_STRICTLY_SORTED (-22926)
+/** The page hash table hashes data outside the defined and implict sections. */
+#define VERR_PAGE_HASH_TAB_HASHES_NON_SECTION_DATA (-22927)
+/** Page hash mismatch. */
+#define VERR_LDRVI_PAGE_HASH_MISMATCH (-22928)
+/** Image hash mismatch. */
+#define VERR_LDRVI_IMAGE_HASH_MISMATCH (-22929)
+/** @} */
+
+/** @name RTCrX509 status codes.
+ * @{ */
+/** Generic X.509 error. */
+#define VERR_CR_X509_GENERIC_ERROR (-23000)
+/** Internal error in the X.509 code. */
+#define VERR_CR_X509_INTERNAL_ERROR (-23001)
+/** Internal error in the X.509 certificate path building and verification
+ * code. */
+#define VERR_CR_X509_CERTPATHS_INTERNAL_ERROR (-23002)
+/** Path not verified yet. */
+#define VERR_CR_X509_NOT_VERIFIED (-23003)
+/** The certificate path has no trust anchor. */
+#define VERR_CR_X509_NO_TRUST_ANCHOR (-23004)
+/** Unknown X.509 certificate signature algorithm. */
+#define VERR_CR_X509_UNKNOWN_CERT_SIGN_ALGO (-23005)
+/** Certificate signature algorithm mismatch. */
+#define VERR_CR_X509_CERT_SIGN_ALGO_MISMATCH (-23006)
+/** The signature algorithm in the to-be-signed certifcate part does not match
+ * the one assoicated with the signature. */
+#define VERR_CR_X509_CERT_TBS_SIGN_ALGO_MISMATCH (-23007)
+/** Certificate extensions requires certificate version 3 or later. */
+#define VERR_CR_X509_TBSCERT_EXTS_REQ_V3 (-23008)
+/** Unique issuer and subject IDs require version certificate 2. */
+#define VERR_CR_X509_TBSCERT_UNIQUE_IDS_REQ_V2 (-23009)
+/** Certificate serial number length is out of bounds. */
+#define VERR_CR_X509_TBSCERT_SERIAL_NUMBER_OUT_OF_BOUNDS (-23010)
+/** Unsupported X.509 certificate version. */
+#define VERR_CR_X509_TBSCERT_UNSUPPORTED_VERSION (-23011)
+/** Public key is too small. */
+#define VERR_CR_X509_PUBLIC_KEY_TOO_SMALL (-23012)
+/** Invalid strnig tag for a X.509 name object. */
+#define VERR_CR_X509_INVALID_NAME_STRING_TAG (-23013)
+/** Empty string in X.509 name object. */
+#define VERR_CR_X509_NAME_EMPTY_STRING (-23014)
+/** Non-string object inside X.509 name object. */
+#define VERR_CR_X509_NAME_NOT_STRING (-23015)
+/** Empty set inside X.509 name. */
+#define VERR_CR_X509_NAME_EMPTY_SET (-23016)
+/** Empty sub-string set inside X.509 name. */
+#define VERR_CR_X509_NAME_EMPTY_SUB_SET (-23017)
+/** The NotBefore and NotAfter values of an X.509 Validity object seems to
+ * have been swapped around. */
+#define VERR_CR_X509_VALIDITY_SWAPPED (-23018)
+/** Duplicate certificate extension. */
+#define VERR_CR_X509_TBSCERT_DUPLICATE_EXTENSION (-23019)
+/** Missing relative distinguished name map entry. */
+#define VERR_CR_X509_NAME_MISSING_RDN_MAP_ENTRY (-23020)
+/** Certificate path validator: No trusted certificate paths. */
+#define VERR_CR_X509_CPV_NO_TRUSTED_PATHS (-23021)
+/** Certificate path validator: No valid certificate policy. */
+#define VERR_CR_X509_CPV_NO_VALID_POLICY (-23022)
+/** Certificate path validator: Unknown critical certificate extension. */
+#define VERR_CR_X509_CPV_UNKNOWN_CRITICAL_EXTENSION (-23023)
+/** Certificate path validator: Intermediate certificate is missing the
+ * KeyCertSign usage flag. */
+#define VERR_CR_X509_CPV_MISSING_KEY_CERT_SIGN (-23024)
+/** Certificate path validator: Hit the max certificate path length before
+ * reaching trust anchor. */
+#define VERR_CR_X509_CPV_MAX_PATH_LENGTH (-23025)
+/** Certificate path validator: Intermediate certificate is not marked as a
+ * certificate authority (CA). */
+#define VERR_CR_X509_CPV_NOT_CA_CERT (-23026)
+/** Certificate path validator: Intermeidate certificate is not a version 3
+ * certificate. */
+#define VERR_CR_X509_CPV_NOT_V3_CERT (-23027)
+/** Certificate path validator: Invalid policy mapping (to/from anyPolicy). */
+#define VERR_CR_X509_CPV_INVALID_POLICY_MAPPING (-23028)
+/** Certificate path validator: Name constraints permits no names. */
+#define VERR_CR_X509_CPV_NO_PERMITTED_NAMES (-23029)
+/** Certificate path validator: Name constraints does not permits the
+ * certificate name. */
+#define VERR_CR_X509_CPV_NAME_NOT_PERMITTED (-23030)
+/** Certificate path validator: Name constraints does not permits the
+ * alternative certificate name. */
+#define VERR_CR_X509_CPV_ALT_NAME_NOT_PERMITTED (-23031)
+/** Certificate path validator: Intermediate certificate subject does not
+ * match child issuer property. */
+#define VERR_CR_X509_CPV_ISSUER_MISMATCH (-23032)
+/** Certificate path validator: The certificate is not valid at the
+ * specificed time. */
+#define VERR_CR_X509_CPV_NOT_VALID_AT_TIME (-23033)
+/** Certificate path validator: Unexpected choice found in general subtree
+ * object (name constraints). */
+#define VERR_CR_X509_CPV_UNEXP_GENERAL_SUBTREE_CHOICE (-23034)
+/** Certificate path validator: Unexpected minimum value found in general
+ * subtree object (name constraints). */
+#define VERR_CR_X509_CPV_UNEXP_GENERAL_SUBTREE_MIN (-23035)
+/** Certificate path validator: Unexpected maximum value found in
+ * general subtree object (name constraints). */
+#define VERR_CR_X509_CPV_UNEXP_GENERAL_SUBTREE_MAX (-23036)
+/** Certificate path builder: Encountered bad certificate context. */
+#define VERR_CR_X509_CPB_BAD_CERT_CTX (-23037)
+/** OpenSSL d2i_X509 failed. */
+#define VERR_CR_X509_OSSL_D2I_FAILED (-23090)
+/** @} */
+
+/** @name RTCrPkcs7 status codes.
+ * @{ */
+/** Generic PKCS \#7 error. */
+#define VERR_CR_PKCS7_GENERIC_ERROR (-23300)
+/** Signed data verfication failed because there are zero signer infos. */
+#define VERR_CR_PKCS7_NO_SIGNER_INFOS (-23301)
+/** Signed data certificate not found. */
+#define VERR_CR_PKCS7_SIGNED_DATA_CERT_NOT_FOUND (-23302)
+/** Signed data verification failed due to key usage issues. */
+#define VERR_CR_PKCS7_KEY_USAGE_MISMATCH (-23303)
+/** Signed data verification failed because of missing (or duplicate)
+ * authenticated content-type attribute. */
+#define VERR_CR_PKCS7_MISSING_CONTENT_TYPE_ATTRIB (-23304)
+/** Signed data verification failed because of the authenticated content-type
+ * attribute did not match. */
+#define VERR_CR_PKCS7_CONTENT_TYPE_ATTRIB_MISMATCH (-23305)
+/** Signed data verification failed because of a malformed authenticated
+ * content-type attribute. */
+#define VERR_CR_PKCS7_BAD_CONTENT_TYPE_ATTRIB (-23306)
+/** Signed data verification failed because of missing (or duplicate)
+ * authenticated message-digest attribute. */
+#define VERR_CR_PKCS7_MISSING_MESSAGE_DIGEST_ATTRIB (-23307)
+/** Signed data verification failed because the authenticated message-digest
+ * attribute did not match. */
+#define VERR_CR_PKCS7_MESSAGE_DIGEST_ATTRIB_MISMATCH (-23308)
+/** Signed data verification failed because of a malformed authenticated
+ * message-digest attribute. */
+#define VERR_CR_PKCS7_BAD_MESSAGE_DIGEST_ATTRIB (-23309)
+/** Signature verification failed. */
+#define VERR_CR_PKCS7_SIGNATURE_VERIFICATION_FAILED (-23310)
+/** Internal PKCS \#7 error. */
+#define VERR_CR_PKCS7_INTERNAL_ERROR (-22311)
+/** OpenSSL d2i_PKCS7 failed. */
+#define VERR_CR_PKCS7_OSSL_D2I_FAILED (-22312)
+/** OpenSSL PKCS \#7 verification failed. */
+#define VERR_CR_PKCS7_OSSL_VERIFY_FAILED (-22313)
+/** Digest algorithm parameters are not supported by the PKCS \#7 code. */
+#define VERR_CR_PKCS7_DIGEST_PARAMS_NOT_IMPL (-22314)
+/** The digest algorithm of a signer info entry was not found in the list of
+ * digest algorithms in the signed data. */
+#define VERR_CR_PKCS7_DIGEST_ALGO_NOT_FOUND_IN_LIST (-22315)
+/** The PKCS \#7 content is not signed data. */
+#define VERR_CR_PKCS7_NOT_SIGNED_DATA (-22316)
+/** No digest algorithms listed in PKCS \#7 signed data. */
+#define VERR_CR_PKCS7_NO_DIGEST_ALGORITHMS (-22317)
+/** Too many digest algorithms used by PKCS \#7 signed data. This is an
+ * internal limitation of the code that aims at saving kernel stack space. */
+#define VERR_CR_PKCS7_TOO_MANY_DIGEST_ALGORITHMS (-22318)
+/** Error creating digest algorithm calculator. */
+#define VERR_CR_PKCS7_DIGEST_CREATE_ERROR (-22319)
+/** Error while calculating a digest for a PKCS \#7 verficiation operation. */
+#define VERR_CR_PKCS7_DIGEST_CALC_ERROR (-22320)
+/** Unsupported PKCS \#7 signed data version. */
+#define VERR_CR_PKCS7_SIGNED_DATA_VERSION (-22350)
+/** PKCS \#7 signed data has no digest algorithms listed. */
+#define VERR_CR_PKCS7_SIGNED_DATA_NO_DIGEST_ALGOS (-22351)
+/** Unknown digest algorithm used by PKCS \#7 object. */
+#define VERR_CR_PKCS7_UNKNOWN_DIGEST_ALGORITHM (-22352)
+/** Expected PKCS \#7 object to ship at least one certificate. */
+#define VERR_CR_PKCS7_NO_CERTIFICATES (-22353)
+/** Expected PKCS \#7 object to not contain any CRLs. */
+#define VERR_CR_PKCS7_EXPECTED_NO_CRLS (-22354)
+/** Expected PKCS \#7 object to contain exactly on signer info entry. */
+#define VERR_CR_PKCS7_EXPECTED_ONE_SIGNER_INFO (-22355)
+/** Unsupported PKCS \#7 signer info version. */
+#define VERR_CR_PKCS7_SIGNER_INFO_VERSION (-22356)
+/** PKCS \#7 singer info contains no issuer serial number. */
+#define VERR_CR_PKCS7_SIGNER_INFO_NO_ISSUER_SERIAL_NO (-22357)
+/** Expected PKCS \#7 object to ship the signer certificate(s). */
+#define VERR_CR_PKCS7_SIGNER_CERT_NOT_SHIPPED (-22358)
+/** The encrypted digest algorithm does not match the one in the certificate. */
+#define VERR_CR_PKCS7_SIGNER_INFO_DIGEST_ENCRYPT_MISMATCH (-22359)
+/** @} */
+
+/** @name RTCrSpc status codes.
+ * @{ */
+/** Generic SPC error. */
+#define VERR_CR_SPC_GENERIC_ERROR (-23400)
+/** SPC requires there to be exactly one SignerInfo entry. */
+#define VERR_CR_SPC_NOT_EXACTLY_ONE_SIGNER_INFOS (-23401)
+/** There shall be exactly one digest algorithm to go with the single
+ * SingerInfo entry required by SPC. */
+#define VERR_CR_SPC_NOT_EXACTLY_ONE_DIGEST_ALGO (-23402)
+/** The digest algorithm in the SignerInfo does not match the one in the
+ * indirect data. */
+#define VERR_CR_SPC_SIGNED_IND_DATA_DIGEST_ALGO_MISMATCH (-23403)
+/** The digest algorithm in the indirect data was not found in the list of
+ * digest algorithms in the signed data structure. */
+#define VERR_CR_SPC_IND_DATA_DIGEST_ALGO_NOT_IN_DIGEST_ALGOS (-23404)
+/** The digest algorithm is not known to us. */
+#define VERR_CR_SPC_UNKNOWN_DIGEST_ALGO (-23405)
+/** The indirect data digest size does not match the digest algorithm. */
+#define VERR_CR_SPC_IND_DATA_DIGEST_SIZE_MISMATCH (-23406)
+/** Exptected PE image data inside indirect data object. */
+#define VERR_CR_SPC_EXPECTED_PE_IMAGE_DATA (-23407)
+/** Internal SPC error: The PE image data is missing. */
+#define VERR_CR_SPC_PEIMAGE_DATA_NOT_PRESENT (-23408)
+/** Bad SPC object moniker UUID field. */
+#define VERR_CR_SPC_BAD_MONIKER_UUID (-23409)
+/** Unknown SPC object moniker UUID. */
+#define VERR_CR_SPC_UNKNOWN_MONIKER_UUID (-23410)
+/** Internal SPC error: Bad object monker choice value. */
+#define VERR_CR_SPC_BAD_MONIKER_CHOICE (-23411)
+/** Internal SPC error: Bad object moniker data pointer. */
+#define VERR_CR_SPC_MONIKER_BAD_DATA (-23412)
+/** Multiple v2 PE image page hash tables. */
+#define VERR_CR_SPC_PEIMAGE_MULTIPLE_V2_HASH_TABS (-23413)
+/** Version 1 PE image page hash tables has not been implemented/tested. */
+#define VERR_CR_SPC_PEIMAGE_V1_HASH_TABS_NOT_IMPL (-23414)
+/** Unknown SPC PE image attribute. */
+#define VERR_CR_SPC_PEIMAGE_UNKNOWN_ATTRIBUTE (-23415)
+/** URL not expected in SPC PE image data. */
+#define VERR_CR_SPC_PEIMAGE_URL_UNEXPECTED (-23416)
+/** PE image data without any valid content was not expected. */
+#define VERR_CR_SPC_PEIMAGE_NO_CONTENT (-23417)
+/** @} */
+
+/** @name RTCrPkix status codes.
+ * @{ */
+/** Generic PKCS \#7 error. */
+#define VERR_CR_PKIX_GENERIC_ERROR (-23500)
+/** Parameters was presented to a signature schema that does not take any. */
+#define VERR_CR_PKIX_SIGNATURE_TAKES_NO_PARAMETERS (-23501)
+/** Unknown hash digest type. */
+#define VERR_CR_PKIX_UNKNOWN_DIGEST_TYPE (-23502)
+/** Internal error. */
+#define VERR_CR_PKIX_INTERNAL_ERROR (-23503)
+/** The hash is too long for the key used when signing/verifying. */
+#define VERR_CR_PKIX_HASH_TOO_LONG_FOR_KEY (-23504)
+/** The signature is too long for the scratch buffer. */
+#define VERR_CR_PKIX_SIGNATURE_TOO_LONG (-23505)
+/** The signature is greater than or equal to the key. */
+#define VERR_CR_PKIX_SIGNATURE_GE_KEY (-23506)
+/** The signature is negative. */
+#define VERR_CR_PKIX_SIGNATURE_NEGATIVE (-23507)
+/** Invalid signature length. */
+#define VERR_CR_PKIX_INVALID_SIGNATURE_LENGTH (-23508)
+/** PKIX signature no does not match up to the current data. */
+#define VERR_CR_PKIX_SIGNATURE_MISMATCH (-23509)
+/** PKIX cipher algorithm parameters are not implemented. */
+#define VERR_CR_PKIX_CIPHER_ALGO_PARAMS_NOT_IMPL (-23510)
+/** ipher algorithm is not known to us. */
+#define VERR_CR_PKIX_CIPHER_ALGO_NOT_KNOWN (-23511)
+/** PKIX cipher algorithm is not known to OpenSSL. */
+#define VERR_CR_PKIX_OSSL_CIPHER_ALGO_NOT_KNOWN (-23512)
+/** PKIX cipher algorithm is not known to OpenSSL EVP API. */
+#define VERR_CR_PKIX_OSSL_CIPHER_ALGO_NOT_KNOWN_EVP (-23513)
+/** OpenSSL failed to init PKIX cipher algorithm context. */
+#define VERR_CR_PKIX_OSSL_CIPHER_ALOG_INIT_FAILED (-23514)
+/** Final OpenSSL PKIX verification failed. */
+#define VERR_CR_PKIX_OSSL_VERIFY_FINAL_FAILED (-23515)
+/** OpenSSL failed to decode the public key. */
+#define VERR_CR_PKIX_OSSL_D2I_PUBLIC_KEY_FAILED (-23516)
+/** The EVP_PKEY_type API in OpenSSL failed. */
+#define VERR_CR_PKIX_OSSL_EVP_PKEY_TYPE_ERROR (-23517)
+/** @} */
+
+/** @name RTCrStore status codes.
+ * @{ */
+/** Generic store error. */
+#define VERR_CR_STORE_GENERIC_ERROR (-23700)
+/** @} */
+
+/** @name RTCrRsa status codes.
+ * @{ */
+/** Generic RSA error. */
+#define VERR_CR_RSA_GENERIC_ERROR (-23900)
+/** @} */
+
+/** @name RTBigNum status codes.
+ * @{ */
+/** Sensitive input requires the result(s) to be initialized as sensitive. */
+#define VERR_BIGNUM_SENSITIVE_INPUT (-24000)
+/** Attempt to divide by zero. */
+#define VERR_BIGNUM_DIV_BY_ZERO (-24001)
+/** Negative exponent makes no sense to integer math. */
+#define VERR_BIGNUM_NEGATIVE_EXPONENT (-24002)
+
+/** @} */
+
+/** @name RTCrDigest status codes.
+ * @{ */
+/** OpenSSL failed to initialize the digest algorithm contextn. */
+#define VERR_CR_DIGEST_OSSL_DIGEST_INIT_ERROR (-24201)
+/** OpenSSL failed to clone the digest algorithm contextn. */
+#define VERR_CR_DIGEST_OSSL_DIGEST_CTX_COPY_ERROR (-24201)
+/** @} */
+
/* SED-END */
/** @} */
diff --git a/include/iprt/formats/asn1.h b/include/iprt/formats/asn1.h
new file mode 100644
index 00000000000..2e0ef4b415b
--- /dev/null
+++ b/include/iprt/formats/asn1.h
@@ -0,0 +1,94 @@
+/** @file
+ * IPRT - Abstract Syntax Notation One (ASN.1) Definitions.
+ */
+
+/*
+ * Copyright (C) 2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+#ifndef ___iprt_formats_asn1_h
+#define ___iprt_formats_asn1_h
+
+#include <iprt/cdefs.h>
+
+
+/** @defgroup grp_rt_formats_asn1 ASN.1 definitions
+ * @ingroup grp_rt_formats
+ *
+ * @{ */
+
+/** @name Tag classes.
+ * @{ */
+#define ASN1_TAGCLASS_UNIVERSAL UINT8_C(0x00)
+#define ASN1_TAGCLASS_APPLICATION UINT8_C(0x40)
+#define ASN1_TAGCLASS_CONTEXT UINT8_C(0x80)
+#define ASN1_TAGCLASS_PRIVATE UINT8_C(0xc0)
+#define ASN1_TAGCLASS_MASK UINT8_C(0xc0)
+/** @} */
+
+/** Primitive encoding. */
+#define ASN1_TAGFLAG_PRIMITIVE UINT8_C(0x00)
+/** Constructed encoding, as opposed to primitive. */
+#define ASN1_TAGFLAG_CONSTRUCTED UINT8_C(0x20)
+
+/** The tag value mask. */
+#define ASN1_TAG_MASK UINT8_C(0x1f)
+
+/** @name ASN.1 universal tags.
+ * @{ */
+#define ASN1_TAG_EOC UINT8_C(0x00)
+#define ASN1_TAG_BOOLEAN UINT8_C(0x01)
+#define ASN1_TAG_INTEGER UINT8_C(0x02)
+#define ASN1_TAG_BIT_STRING UINT8_C(0x03)
+#define ASN1_TAG_OCTET_STRING UINT8_C(0x04)
+#define ASN1_TAG_NULL UINT8_C(0x05)
+#define ASN1_TAG_OID UINT8_C(0x06)
+#define ASN1_TAG_OBJECT_DESCRIPTOR UINT8_C(0x07)
+#define ASN1_TAG_EXTERNAL UINT8_C(0x08)
+#define ASN1_TAG_REAL UINT8_C(0x09)
+#define ASN1_TAG_ENUMERATED UINT8_C(0x0a)
+#define ASN1_TAG_EMBEDDED_PDV UINT8_C(0x0b)
+#define ASN1_TAG_UTF8_STRING UINT8_C(0x0c)
+#define ASN1_TAG_RELATIVE_OID UINT8_C(0x0d)
+#define ASN1_TAG_RESERVED_14 UINT8_C(0x0e)
+#define ASN1_TAG_RESERVED_15 UINT8_C(0x0f)
+#define ASN1_TAG_SEQUENCE UINT8_C(0x10)
+#define ASN1_TAG_SET UINT8_C(0x11)
+#define ASN1_TAG_NUMERIC_STRING UINT8_C(0x12)
+#define ASN1_TAG_PRINTABLE_STRING UINT8_C(0x13)
+#define ASN1_TAG_T61_STRING UINT8_C(0x14)
+#define ASN1_TAG_VIDEOTEX_STRING UINT8_C(0x15)
+#define ASN1_TAG_IA5_STRING UINT8_C(0x16)
+#define ASN1_TAG_UTC_TIME UINT8_C(0x17) /**< Century seems to be 1900 if YY < 50, otherwise 2000. Baka ASN.1! */
+#define ASN1_TAG_GENERALIZED_TIME UINT8_C(0x18)
+#define ASN1_TAG_GRAPHIC_STRING UINT8_C(0x19)
+#define ASN1_TAG_VISIBLE_STRING UINT8_C(0x1a)
+#define ASN1_TAG_GENERAL_STRING UINT8_C(0x1b)
+#define ASN1_TAG_UNIVERSAL_STRING UINT8_C(0x1c)
+#define ASN1_TAG_CHARACTER_STRING UINT8_C(0x1d)
+#define ASN1_TAG_BMP_STRING UINT8_C(0x1e)
+#define ASN1_TAG_USE_LONG_FORM UINT8_C(0x1f)
+/** @} */
+
+
+/** @} */
+
+#endif
+
diff --git a/include/iprt/ldr.h b/include/iprt/ldr.h
index 2f4ae59b73a..f4a47e457a5 100644
--- a/include/iprt/ldr.h
+++ b/include/iprt/ldr.h
@@ -3,7 +3,7 @@
*/
/*
- * Copyright (C) 2006-2011 Oracle Corporation
+ * Copyright (C) 2006-2014 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
@@ -131,6 +131,94 @@ typedef enum RTLDRENDIAN
} RTLDRENDIAN;
+/** Pointer to a loader reader instance. */
+typedef struct RTLDRREADER *PRTLDRREADER;
+/**
+ * Loader image reader instance.
+ *
+ * @remarks The reader will typically have a larger structure wrapping this one
+ * for storing necessary instance variables.
+ *
+ * The loader ASSUMES the caller serializes all access to the
+ * individual loader module handlers, thus no serialization is required
+ * when implementing this interface.
+ */
+typedef struct RTLDRREADER
+{
+ /** Magic value (RTLDRREADER_MAGIC). */
+ uintptr_t uMagic;
+
+ /**
+ * Reads bytes at a give place in the raw image.
+ *
+ * @returns iprt status code.
+ * @param pReader Pointer to the reader instance.
+ * @param pvBuf Where to store the bits.
+ * @param cb Number of bytes to read.
+ * @param off Where to start reading relative to the start of the raw image.
+ */
+ DECLCALLBACKMEMBER(int, pfnRead)(PRTLDRREADER pReader, void *pvBuf, size_t cb, RTFOFF off);
+
+ /**
+ * Tells end position of last read.
+ *
+ * @returns position relative to start of the raw image.
+ * @param pReader Pointer to the reader instance.
+ */
+ DECLCALLBACKMEMBER(RTFOFF, pfnTell)(PRTLDRREADER pReader);
+
+ /**
+ * Gets the size of the raw image bits.
+ *
+ * @returns size of raw image bits in bytes.
+ * @param pReader Pointer to the reader instance.
+ */
+ DECLCALLBACKMEMBER(RTFOFF, pfnSize)(PRTLDRREADER pReader);
+
+ /**
+ * Map the bits into memory.
+ *
+ * The mapping will be freed upon calling pfnDestroy() if not pfnUnmap()
+ * is called before that. The mapping is read only.
+ *
+ * @returns iprt status code.
+ * @param pReader Pointer to the reader instance.
+ * @param ppvBits Where to store the address of the memory mapping on success.
+ * The size of the mapping can be obtained by calling pfnSize().
+ */
+ DECLCALLBACKMEMBER(int, pfnMap)(PRTLDRREADER pReader, const void **ppvBits);
+
+ /**
+ * Unmap bits.
+ *
+ * @returns iprt status code.
+ * @param pReader Pointer to the reader instance.
+ * @param pvBits Memory pointer returned by pfnMap().
+ */
+ DECLCALLBACKMEMBER(int, pfnUnmap)(PRTLDRREADER pReader, const void *pvBits);
+
+ /**
+ * Gets the most appropriate log name.
+ *
+ * @returns Pointer to readonly log name.
+ * @param pReader Pointer to the reader instance.
+ */
+ DECLCALLBACKMEMBER(const char *, pfnLogName)(PRTLDRREADER pReader);
+
+ /**
+ * Releases all resources associated with the reader instance.
+ * The instance is invalid after this call returns.
+ *
+ * @returns iprt status code.
+ * @param pReader Pointer to the reader instance.
+ */
+ DECLCALLBACKMEMBER(int, pfnDestroy)(PRTLDRREADER pReader);
+} RTLDRREADER;
+
+/** Magic value for RTLDRREADER (Gordon Matthew Thomas Sumner / Sting). */
+#define RTLDRREADER_MAGIC UINT32_C(0x19511002)
+
+
/**
* Gets the default file suffix for DLL/SO/DYLIB/whatever.
*
@@ -272,8 +360,10 @@ typedef RTLDRARCH *PRTLDRARCH;
/** Open for debugging or introspection reasons.
* This will skip a few of the stricter validations when loading images. */
#define RTLDR_O_FOR_DEBUG RT_BIT_32(0)
+/** Open for signature validation. */
+#define RTLDR_O_FOR_VALIDATION RT_BIT_32(1)
/** Mask of valid flags. */
-#define RTLDR_O_VALID_MASK UINT32_C(0x00000001)
+#define RTLDR_O_VALID_MASK UINT32_C(0x00000003)
/** @} */
/**
@@ -299,6 +389,20 @@ RTDECL(int) RTLdrOpen(const char *pszFilename, uint32_t fFlags, RTLDRARCH enmArc
*/
RTDECL(int) RTLdrOpenkLdr(const char *pszFilename, uint32_t fFlags, RTLDRARCH enmArch, PRTLDRMOD phLdrMod);
+/**
+ * Open part with reader.
+ *
+ * @returns iprt status code.
+ * @param pReader The loader reader instance which will provide the raw
+ * image bits. The reader instance will be consumed on
+ * success. On failure, the caller has to do the cleaning
+ * up.
+ * @param fFlags Valid RTLDR_O_XXX combination.
+ * @param enmArch Architecture specifier.
+ * @param phMod Where to store the handle.
+ * @param pErrInfo Where to return extended error information. Optional.
+ */
+RTDECL(int) RTLdrOpenWithReader(PRTLDRREADER pReader, uint32_t fFlags, RTLDRARCH enmArch, PRTLDRMOD phMod, PRTERRINFO pErrInfo);
/**
* Called to read @a cb bytes at @a off into @a pvBuf.
@@ -839,6 +943,19 @@ typedef enum RTLDRPROP
/** The image timestamp in seconds, genrally since unix epoc.
* Returns a 32-bit or 64-bit signed integer value in the buffer. */
RTLDRPROP_TIMESTAMP_SECONDS,
+ /** Checks if the image is signed.
+ * Returns a bool. */
+ RTLDRPROP_IS_SIGNED,
+ /** Retrives the PKCS \#7 SignedData blob that signs the image.
+ * Returns variable sized buffer containing the ASN.1 BER encoding.
+ *
+ * @remarks This generally starts with a PKCS \#7 Content structure, the
+ * SignedData bit is found a few levels down into this as per RFC. */
+ RTLDRPROP_PKCS7_SIGNED_DATA,
+
+ /** Query whether code signature checks are enabled. */
+ RTLDRPROP_SIGNATURE_CHECKS_ENFORCED,
+
/** End of valid properties. */
RTLDRPROP_END,
/** Blow the type up to 32 bits. */
@@ -855,6 +972,8 @@ typedef enum RTLDRPROP
* must also normally deal with this.
* @retval VERR_INVALID_FUNCTION if the function value is wrong.
* @retval VERR_INVALID_PARAMETER if the buffer size is wrong.
+ * @retval VERR_BUFFER_OVERFLOW if the function doesn't have a fixed size
+ * buffer and the buffer isn't big enough. Use RTLdrQueryPropEx.
* @retval VERR_INVALID_HANDLE if the handle is invalid.
*
* @param hLdrMod The module handle.
@@ -864,6 +983,95 @@ typedef enum RTLDRPROP
*/
RTDECL(int) RTLdrQueryProp(RTLDRMOD hLdrMod, RTLDRPROP enmProp, void *pvBuf, size_t cbBuf);
+/**
+ * Generic method for querying image properties, extended version.
+ *
+ * @returns IPRT status code.
+ * @retval VERR_NOT_SUPPORTED if the property query isn't supported (either all
+ * or that specific property). The caller must handle this result.
+ * @retval VERR_NOT_FOUND the property was not found in the module. The caller
+ * must also normally deal with this.
+ * @retval VERR_INVALID_FUNCTION if the function value is wrong.
+ * @retval VERR_INVALID_PARAMETER if the fixed buffer size is wrong. Correct
+ * size in @a *pcbRet.
+ * @retval VERR_BUFFER_OVERFLOW if the function doesn't have a fixed size
+ * buffer and the buffer isn't big enough. Correct size in @a *pcbRet.
+ * @retval VERR_INVALID_HANDLE if the handle is invalid.
+ *
+ * @param hLdrMod The module handle.
+ * @param enmLdrProp The property to query.
+ * @param pvBuf Pointer to the return buffer.
+ * @param cbBuf The size of the return buffer.
+ * @param pcbRet Where to return the amount of data returned. On
+ * buffer size errors, this is set to the correct size.
+ * Optional.
+ */
+RTDECL(int) RTLdrQueryPropEx(RTLDRMOD hLdrMod, RTLDRPROP enmProp, void *pvBuf, size_t cbBuf, size_t *pcbBuf);
+
+
+/**
+ * Signature type, see FNRTLDRVALIDATESIGNEDDATA.
+ */
+typedef enum RTLDRSIGNATURETYPE
+{
+ /** Invalid value. */
+ RTLDRSIGNATURETYPE_INVALID = 0,
+ /** A RTPKCS7CONTENTINFO structure w/ RTPKCS7SIGNEDDATA inside.
+ * It's parsed, so the whole binary ASN.1 representation can be found by
+ * using RTASN1CORE_GET_RAW_ASN1_PTR() and RTASN1CORE_GET_RAW_ASN1_SIZE(). */
+ RTLDRSIGNATURETYPE_PKCS7_SIGNED_DATA,
+ /** End of valid values. */
+ RTLDRSIGNATURETYPE_END,
+ /** Make sure the size is 32-bit. */
+ RTLDRSIGNATURETYPE_32BIT_HACK = 0x7fffffff
+} RTLDRSIGNATURETYPE;
+
+/**
+ * Callback used by RTLdrVerifySignature to verify the signature and associated
+ * certificates.
+ *
+ * @returns IPRT status code.
+ * @param hLdrMod The module handle.
+ * @param enmSignature The signature format.
+ * @param pvSignature The signature data. Format given by @a enmSignature.
+ * @param cbSignature The size of the buffer @a pvSignature points to.
+ * @param pErrInfo Pointer to an error info buffer, optional.
+ * @param pvUser User argument.
+ *
+ */
+typedef DECLCALLBACK(int) FNRTLDRVALIDATESIGNEDDATA(RTLDRMOD hLdrMod, RTLDRSIGNATURETYPE enmSignature, void const *pvSignature, size_t cbSignature,
+ PRTERRINFO pErrInfo, void *pvUser);
+/** Pointer to a signature verification callback. */
+typedef FNRTLDRVALIDATESIGNEDDATA *PFNRTLDRVALIDATESIGNEDDATA;
+
+/**
+ * Verify the image signature.
+ *
+ * This may permform additional integrity checks on the image structures that
+ * was not done when opening the image.
+ *
+ * @returns IPRT status code.
+ * @retval VERR_LDRVI_NOT_SIGNED if not signed.
+ *
+ * @param hLdrMod The module handle.
+ * @param pfnCallback Callback that does the signature and certificate
+ * verficiation.
+ * @param pvUser User argument for the callback.
+ * @param pErrInfo Pointer to an error info buffer. Optional.
+ */
+RTDECL(int) RTLdrVerifySignature(RTLDRMOD hLdrMod, PFNRTLDRVALIDATESIGNEDDATA pfnCallback, void *pvUser, PRTERRINFO pErrInfo);
+
+/**
+ * Calculate the image hash according the image signing rules.
+ *
+ * @returns IPRT status code.
+ * @param hLdrMod The module handle.
+ * @param enmDigest Which kind of digest.
+ * @param pszDigest Where to store the image digest.
+ * @param cbDigest Size of the buffer @a pszDigest points at.
+ */
+RTDECL(int) RTLdrHashImage(RTLDRMOD hLdrMod, RTDIGESTTYPE enmDigest, char *pszDigest, size_t cbDigest);
+
RT_C_DECLS_END
/** @} */
diff --git a/include/iprt/log.h b/include/iprt/log.h
index 427eebc8ecf..f0ce1c18e7e 100644
--- a/include/iprt/log.h
+++ b/include/iprt/log.h
@@ -1816,6 +1816,16 @@ RTDECL(void) RTLogPrintf(const char *pszFormat, ...);
*/
RTDECL(void) RTLogPrintfV(const char *pszFormat, va_list args);
+/**
+ * Dumper vprintf-like function outputting to a logger.
+ *
+ * @param pvUser Pointer to the logger instance to use, NULL for
+ * default instance.
+ * @param pszFormat Format string.
+ * @param va Format arguments.
+ */
+RTDECL(void) RTLogDumpPrintfV(void *pvUser, const char *pszFormat, va_list va);
+
#ifndef DECLARED_FNRTSTROUTPUT /* duplicated in iprt/string.h */
#define DECLARED_FNRTSTROUTPUT
diff --git a/include/iprt/mangling.h b/include/iprt/mangling.h
index eb46072ae15..c252a99cf60 100644
--- a/include/iprt/mangling.h
+++ b/include/iprt/mangling.h
@@ -273,7 +273,9 @@
# define RTAvlULRemove RT_MANGLER(RTAvlULRemove)
# define RTAvlULRemoveBestFit RT_MANGLER(RTAvlULRemoveBestFit)
# define RTBase64Decode RT_MANGLER(RTBase64Decode)
+# define RTBase64DecodeEx RT_MANGLER(RTBase64DecodeEx)
# define RTBase64DecodedSize RT_MANGLER(RTBase64DecodedSize)
+# define RTBase64DecodedSizeEx RT_MANGLER(RTBase64DecodedSizeEx)
# define RTBase64Encode RT_MANGLER(RTBase64Encode)
# define RTBase64EncodedLength RT_MANGLER(RTBase64EncodedLength)
# define RTBldCfgCompiler RT_MANGLER(RTBldCfgCompiler)
@@ -800,6 +802,7 @@
# define RTLogLoggerV RT_MANGLER(RTLogLoggerV)
# define RTLogPrintf RT_MANGLER(RTLogPrintf)
# define RTLogPrintfV RT_MANGLER(RTLogPrintfV)
+# define RTLogDumpPrintfV RT_MANGLER(RTLogDumpPrintfV)
# define RTLogRelDefaultInstance RT_MANGLER(RTLogRelDefaultInstance)
# define RTLogRelLogger RT_MANGLER(RTLogRelLogger)
# define RTLogRelLoggerV RT_MANGLER(RTLogRelLoggerV)
@@ -1095,6 +1098,7 @@
# define RTProcGetExecutablePath RT_MANGLER(RTProcGetExecutablePath)
# define RTProcGetPriority RT_MANGLER(RTProcGetPriority)
# define RTProcIsRunningByName RT_MANGLER(RTProcIsRunningByName)
+# define RTProcQueryParent RT_MANGLER(RTProcQueryParent)
# define RTProcQueryUsername RT_MANGLER(RTProcQueryUsername)
# define RTProcQueryUsernameA RT_MANGLER(RTProcQueryUsernameA)
# define RTProcSelf RT_MANGLER(RTProcSelf)
@@ -1438,6 +1442,7 @@
# define RTStrmOpenFV RT_MANGLER(RTStrmOpenFV)
# define RTStrmPrintf RT_MANGLER(RTStrmPrintf)
# define RTStrmPrintfV RT_MANGLER(RTStrmPrintfV)
+# define RTStrmDumpPrintfV RT_MANGLER(RTStrmDumpPrintfV)
# define RTStrmPutCh RT_MANGLER(RTStrmPutCh)
# define RTStrmPutStr RT_MANGLER(RTStrmPutStr)
# define RTStrmReadEx RT_MANGLER(RTStrmReadEx)
@@ -1764,6 +1769,7 @@
# define RTUtf16CalcUtf8Len RT_MANGLER(RTUtf16CalcUtf8Len)
# define RTUtf16CalcUtf8LenEx RT_MANGLER(RTUtf16CalcUtf8LenEx)
# define RTUtf16Cmp RT_MANGLER(RTUtf16Cmp)
+# define RTUtf16CmpAscii RT_MANGLER(RTUtf16CmpAscii)
# define RTUtf16DupExTag RT_MANGLER(RTUtf16DupExTag)
# define RTUtf16DupTag RT_MANGLER(RTUtf16DupTag)
# define RTUtf16Free RT_MANGLER(RTUtf16Free)
@@ -1907,6 +1913,881 @@
# define RTZipUnzipCmd RT_MANGLER(RTZipUnzipCmd)
# define RTZipTarFsStreamFromIoStream RT_MANGLER(RTZipTarFsStreamFromIoStream)
# define RTZipXarFsStreamFromIoStream RT_MANGLER(RTZipXarFsStreamFromIoStream)
+
+/* sort/merge into the above later: */
+# define RTAsn1ContentAllocZ RT_MANGLER(RTAsn1ContentAllocZ)
+# define RTAsn1ContentDup RT_MANGLER(RTAsn1ContentDup)
+# define RTAsn1ContentFree RT_MANGLER(RTAsn1ContentFree)
+# define RTAsn1ContentReallocZ RT_MANGLER(RTAsn1ContentReallocZ)
+# define RTAsn1ContextTagN_Clone RT_MANGLER(RTAsn1ContextTagN_Clone)
+# define RTAsn1ContextTagN_Init RT_MANGLER(RTAsn1ContextTagN_Init)
+# define RTAsn1Dummy_InitEx RT_MANGLER(RTAsn1Dummy_InitEx)
+# define RTAsn1MemAllocZ RT_MANGLER(RTAsn1MemAllocZ)
+# define RTAsn1MemDup RT_MANGLER(RTAsn1MemDup)
+# define RTAsn1MemFree RT_MANGLER(RTAsn1MemFree)
+# define RTAsn1MemGrowArray RT_MANGLER(RTAsn1MemGrowArray)
+# define RTAsn1MemInitAllocation RT_MANGLER(RTAsn1MemInitAllocation)
+# define RTAsn1SeqOfCore_Clone RT_MANGLER(RTAsn1SeqOfCore_Clone)
+# define RTAsn1SeqOfCore_Init RT_MANGLER(RTAsn1SeqOfCore_Init)
+# define RTAsn1SequenceCore_Clone RT_MANGLER(RTAsn1SequenceCore_Clone)
+# define RTAsn1SequenceCore_Init RT_MANGLER(RTAsn1SequenceCore_Init)
+# define RTAsn1SetCore_Clone RT_MANGLER(RTAsn1SetCore_Clone)
+# define RTAsn1SetCore_Init RT_MANGLER(RTAsn1SetCore_Init)
+# define RTAsn1SetOfCore_Clone RT_MANGLER(RTAsn1SetOfCore_Clone)
+# define RTAsn1SetOfCore_Init RT_MANGLER(RTAsn1SetOfCore_Init)
+# define RTAsn1VtCheckSanity RT_MANGLER(RTAsn1VtCheckSanity)
+# define RTAsn1VtClone RT_MANGLER(RTAsn1VtClone)
+# define RTAsn1VtCompare RT_MANGLER(RTAsn1VtCompare)
+# define RTAsn1VtDeepEnum RT_MANGLER(RTAsn1VtDeepEnum)
+# define RTAsn1VtDelete RT_MANGLER(RTAsn1VtDelete)
+# define RTAsn1CursorCheckEnd RT_MANGLER(RTAsn1CursorCheckEnd)
+# define RTAsn1CursorGetBitString RT_MANGLER(RTAsn1CursorGetBitString)
+# define RTAsn1CursorGetBitStringEx RT_MANGLER(RTAsn1CursorGetBitStringEx)
+# define RTAsn1CursorGetBmpString RT_MANGLER(RTAsn1CursorGetBmpString)
+# define RTAsn1CursorGetBoolean RT_MANGLER(RTAsn1CursorGetBoolean)
+# define RTAsn1CursorGetContextTagNCursor RT_MANGLER(RTAsn1CursorGetContextTagNCursor)
+# define RTAsn1CursorGetCore RT_MANGLER(RTAsn1CursorGetCore)
+# define RTAsn1CursorGetDynType RT_MANGLER(RTAsn1CursorGetDynType)
+# define RTAsn1CursorGetIa5String RT_MANGLER(RTAsn1CursorGetIa5String)
+# define RTAsn1CursorGetInteger RT_MANGLER(RTAsn1CursorGetInteger)
+# define RTAsn1CursorGetNull RT_MANGLER(RTAsn1CursorGetNull)
+# define RTAsn1CursorGetObjId RT_MANGLER(RTAsn1CursorGetObjId)
+# define RTAsn1CursorGetOctetString RT_MANGLER(RTAsn1CursorGetOctetString)
+# define RTAsn1CursorGetSequenceCursor RT_MANGLER(RTAsn1CursorGetSequenceCursor)
+# define RTAsn1CursorGetSetCursor RT_MANGLER(RTAsn1CursorGetSetCursor)
+# define RTAsn1CursorGetString RT_MANGLER(RTAsn1CursorGetString)
+# define RTAsn1CursorGetTime RT_MANGLER(RTAsn1CursorGetTime)
+# define RTAsn1CursorGetUtf8String RT_MANGLER(RTAsn1CursorGetUtf8String)
+# define RTAsn1CursorInitAllocation RT_MANGLER(RTAsn1CursorInitAllocation)
+# define RTAsn1CursorInitPrimary RT_MANGLER(RTAsn1CursorInitPrimary)
+# define RTAsn1CursorInitSubFromCore RT_MANGLER(RTAsn1CursorInitSubFromCore)
+# define RTAsn1CursorIsNextEx RT_MANGLER(RTAsn1CursorIsNextEx)
+# define RTAsn1CursorMatchTagClassFlagsEx RT_MANGLER(RTAsn1CursorMatchTagClassFlagsEx)
+# define RTAsn1CursorPeek RT_MANGLER(RTAsn1CursorPeek)
+# define RTAsn1CursorReadHdr RT_MANGLER(RTAsn1CursorReadHdr)
+# define RTAsn1CursorSetInfo RT_MANGLER(RTAsn1CursorSetInfo)
+# define RTAsn1CursorSetInfoV RT_MANGLER(RTAsn1CursorSetInfoV)
+# define RTAsn1Dump RT_MANGLER(RTAsn1Dump)
+# define RTAsn1EncodePrepare RT_MANGLER(RTAsn1EncodePrepare)
+# define RTAsn1EncodeRecalcHdrSize RT_MANGLER(RTAsn1EncodeRecalcHdrSize)
+# define RTAsn1EncodeWrite RT_MANGLER(RTAsn1EncodeWrite)
+# define RTAsnEncodeWriteHeader RT_MANGLER(RTAsnEncodeWriteHeader)
+# define RTAsn1BitString_CheckSanity RT_MANGLER(RTAsn1BitString_CheckSanity)
+# define RTAsn1BitString_Clone RT_MANGLER(RTAsn1BitString_Clone)
+# define RTAsn1BitString_Compare RT_MANGLER(RTAsn1BitString_Compare)
+# define RTAsn1BitString_Delete RT_MANGLER(RTAsn1BitString_Delete)
+# define RTAsn1BitString_Enum RT_MANGLER(RTAsn1BitString_Enum)
+# define RTAsn1BitString_GetAsUInt64 RT_MANGLER(RTAsn1BitString_GetAsUInt64)
+# define RTAsn1BitString_Init RT_MANGLER(RTAsn1BitString_Init)
+# define RTAsn1SeqOfBitStrings_CheckSanity RT_MANGLER(RTAsn1SeqOfBitStrings_CheckSanity)
+# define RTAsn1SeqOfBitStrings_Clone RT_MANGLER(RTAsn1SeqOfBitStrings_Clone)
+# define RTAsn1SeqOfBitStrings_Compare RT_MANGLER(RTAsn1SeqOfBitStrings_Compare)
+# define RTAsn1SeqOfBitStrings_Delete RT_MANGLER(RTAsn1SeqOfBitStrings_Delete)
+# define RTAsn1SeqOfBitStrings_Enum RT_MANGLER(RTAsn1SeqOfBitStrings_Enum)
+# define RTAsn1SeqOfBitStrings_Init RT_MANGLER(RTAsn1SeqOfBitStrings_Init)
+# define RTAsn1SetOfBitStrings_CheckSanity RT_MANGLER(RTAsn1SetOfBitStrings_CheckSanity)
+# define RTAsn1SetOfBitStrings_Clone RT_MANGLER(RTAsn1SetOfBitStrings_Clone)
+# define RTAsn1SetOfBitStrings_Compare RT_MANGLER(RTAsn1SetOfBitStrings_Compare)
+# define RTAsn1SetOfBitStrings_Delete RT_MANGLER(RTAsn1SetOfBitStrings_Delete)
+# define RTAsn1SetOfBitStrings_Enum RT_MANGLER(RTAsn1SetOfBitStrings_Enum)
+# define RTAsn1SetOfBitStrings_Init RT_MANGLER(RTAsn1SetOfBitStrings_Init)
+# define RTAsn1BitString_DecodeAsn1 RT_MANGLER(RTAsn1BitString_DecodeAsn1)
+# define RTAsn1BitString_DecodeAsn1Ex RT_MANGLER(RTAsn1BitString_DecodeAsn1Ex)
+# define RTAsn1SeqOfBitStrings_DecodeAsn1 RT_MANGLER(RTAsn1SeqOfBitStrings_DecodeAsn1)
+# define RTAsn1SetOfBitStrings_DecodeAsn1 RT_MANGLER(RTAsn1SetOfBitStrings_DecodeAsn1)
+# define RTAsn1Boolean_CheckSanity RT_MANGLER(RTAsn1Boolean_CheckSanity)
+# define RTAsn1Boolean_Clone RT_MANGLER(RTAsn1Boolean_Clone)
+# define RTAsn1Boolean_Compare RT_MANGLER(RTAsn1Boolean_Compare)
+# define RTAsn1Boolean_Delete RT_MANGLER(RTAsn1Boolean_Delete)
+# define RTAsn1Boolean_Enum RT_MANGLER(RTAsn1Boolean_Enum)
+# define RTAsn1Boolean_Init RT_MANGLER(RTAsn1Boolean_Init)
+# define RTAsn1Boolean_InitDefault RT_MANGLER(RTAsn1Boolean_InitDefault)
+# define RTAsn1Boolean_Set RT_MANGLER(RTAsn1Boolean_Set)
+# define RTAsn1SeqOfBooleans_CheckSanity RT_MANGLER(RTAsn1SeqOfBooleans_CheckSanity)
+# define RTAsn1SeqOfBooleans_Clone RT_MANGLER(RTAsn1SeqOfBooleans_Clone)
+# define RTAsn1SeqOfBooleans_Compare RT_MANGLER(RTAsn1SeqOfBooleans_Compare)
+# define RTAsn1SeqOfBooleans_Delete RT_MANGLER(RTAsn1SeqOfBooleans_Delete)
+# define RTAsn1SeqOfBooleans_Enum RT_MANGLER(RTAsn1SeqOfBooleans_Enum)
+# define RTAsn1SeqOfBooleans_Init RT_MANGLER(RTAsn1SeqOfBooleans_Init)
+# define RTAsn1SetOfBooleans_CheckSanity RT_MANGLER(RTAsn1SetOfBooleans_CheckSanity)
+# define RTAsn1SetOfBooleans_Clone RT_MANGLER(RTAsn1SetOfBooleans_Clone)
+# define RTAsn1SetOfBooleans_Compare RT_MANGLER(RTAsn1SetOfBooleans_Compare)
+# define RTAsn1SetOfBooleans_Delete RT_MANGLER(RTAsn1SetOfBooleans_Delete)
+# define RTAsn1SetOfBooleans_Enum RT_MANGLER(RTAsn1SetOfBooleans_Enum)
+# define RTAsn1SetOfBooleans_Init RT_MANGLER(RTAsn1SetOfBooleans_Init)
+# define RTAsn1Boolean_DecodeAsn1 RT_MANGLER(RTAsn1Boolean_DecodeAsn1)
+# define RTAsn1SeqOfBooleans_DecodeAsn1 RT_MANGLER(RTAsn1SeqOfBooleans_DecodeAsn1)
+# define RTAsn1SetOfBooleans_DecodeAsn1 RT_MANGLER(RTAsn1SetOfBooleans_DecodeAsn1)
+# define RTAsn1Core_ChangeTag RT_MANGLER(RTAsn1Core_ChangeTag)
+# define RTAsn1Core_CheckSanity RT_MANGLER(RTAsn1Core_CheckSanity)
+# define RTAsn1Core_Clone RT_MANGLER(RTAsn1Core_Clone)
+# define RTAsn1Core_CloneContent RT_MANGLER(RTAsn1Core_CloneContent)
+# define RTAsn1Core_CloneNoContent RT_MANGLER(RTAsn1Core_CloneNoContent)
+# define RTAsn1Core_Compare RT_MANGLER(RTAsn1Core_Compare)
+# define RTAsn1Core_CompareEx RT_MANGLER(RTAsn1Core_CompareEx)
+# define RTAsn1Core_Delete RT_MANGLER(RTAsn1Core_Delete)
+# define RTAsn1Core_Enum RT_MANGLER(RTAsn1Core_Enum)
+# define RTAsn1Core_Init RT_MANGLER(RTAsn1Core_Init)
+# define RTAsn1Core_InitDefault RT_MANGLER(RTAsn1Core_InitDefault)
+# define RTAsn1Core_InitEx RT_MANGLER(RTAsn1Core_InitEx)
+# define RTAsn1Core_ResetImplict RT_MANGLER(RTAsn1Core_ResetImplict)
+# define RTAsn1Core_SetTagAndFlags RT_MANGLER(RTAsn1Core_SetTagAndFlags)
+# define RTAsn1SeqOfCores_CheckSanity RT_MANGLER(RTAsn1SeqOfCores_CheckSanity)
+# define RTAsn1SeqOfCores_Clone RT_MANGLER(RTAsn1SeqOfCores_Clone)
+# define RTAsn1SeqOfCores_Compare RT_MANGLER(RTAsn1SeqOfCores_Compare)
+# define RTAsn1SeqOfCores_Delete RT_MANGLER(RTAsn1SeqOfCores_Delete)
+# define RTAsn1SeqOfCores_Enum RT_MANGLER(RTAsn1SeqOfCores_Enum)
+# define RTAsn1SeqOfCores_Init RT_MANGLER(RTAsn1SeqOfCores_Init)
+# define RTAsn1SetOfCores_CheckSanity RT_MANGLER(RTAsn1SetOfCores_CheckSanity)
+# define RTAsn1SetOfCores_Clone RT_MANGLER(RTAsn1SetOfCores_Clone)
+# define RTAsn1SetOfCores_Compare RT_MANGLER(RTAsn1SetOfCores_Compare)
+# define RTAsn1SetOfCores_Delete RT_MANGLER(RTAsn1SetOfCores_Delete)
+# define RTAsn1SetOfCores_Enum RT_MANGLER(RTAsn1SetOfCores_Enum)
+# define RTAsn1SetOfCores_Init RT_MANGLER(RTAsn1SetOfCores_Init)
+# define RTAsn1Core_DecodeAsn1 RT_MANGLER(RTAsn1Core_DecodeAsn1)
+# define RTAsn1SeqOfCores_DecodeAsn1 RT_MANGLER(RTAsn1SeqOfCores_DecodeAsn1)
+# define RTAsn1SetOfCores_DecodeAsn1 RT_MANGLER(RTAsn1SetOfCores_DecodeAsn1)
+# define RTAsn1DynType_CheckSanity RT_MANGLER(RTAsn1DynType_CheckSanity)
+# define RTAsn1DynType_Clone RT_MANGLER(RTAsn1DynType_Clone)
+# define RTAsn1DynType_Compare RT_MANGLER(RTAsn1DynType_Compare)
+# define RTAsn1DynType_Delete RT_MANGLER(RTAsn1DynType_Delete)
+# define RTAsn1DynType_Enum RT_MANGLER(RTAsn1DynType_Enum)
+# define RTAsn1DynType_Init RT_MANGLER(RTAsn1DynType_Init)
+# define RTAsn1DynType_DecodeAsn1 RT_MANGLER(RTAsn1DynType_DecodeAsn1)
+# define RTAsn1Integer_CheckSanity RT_MANGLER(RTAsn1Integer_CheckSanity)
+# define RTAsn1Integer_Clone RT_MANGLER(RTAsn1Integer_Clone)
+# define RTAsn1Integer_Compare RT_MANGLER(RTAsn1Integer_Compare)
+# define RTAsn1Integer_Delete RT_MANGLER(RTAsn1Integer_Delete)
+# define RTAsn1Integer_Enum RT_MANGLER(RTAsn1Integer_Enum)
+# define RTAsn1Integer_FromBigNum RT_MANGLER(RTAsn1Integer_FromBigNum)
+# define RTAsn1Integer_Init RT_MANGLER(RTAsn1Integer_Init)
+# define RTAsn1Integer_InitDefault RT_MANGLER(RTAsn1Integer_InitDefault)
+# define RTAsn1Integer_InitU64 RT_MANGLER(RTAsn1Integer_InitU64)
+# define RTAsn1Integer_ToBigNum RT_MANGLER(RTAsn1Integer_ToBigNum)
+# define RTAsn1Integer_UnsignedCompare RT_MANGLER(RTAsn1Integer_UnsignedCompare)
+# define RTAsn1Integer_UnsignedCompareWithU32 RT_MANGLER(RTAsn1Integer_UnsignedCompareWithU32)
+# define RTAsn1Integer_UnsignedCompareWithU64 RT_MANGLER(RTAsn1Integer_UnsignedCompareWithU64)
+# define RTAsn1Integer_UnsignedLastBit RT_MANGLER(RTAsn1Integer_UnsignedLastBit)
+# define RTAsn1SeqOfIntegers_CheckSanity RT_MANGLER(RTAsn1SeqOfIntegers_CheckSanity)
+# define RTAsn1SeqOfIntegers_Clone RT_MANGLER(RTAsn1SeqOfIntegers_Clone)
+# define RTAsn1SeqOfIntegers_Compare RT_MANGLER(RTAsn1SeqOfIntegers_Compare)
+# define RTAsn1SeqOfIntegers_Delete RT_MANGLER(RTAsn1SeqOfIntegers_Delete)
+# define RTAsn1SeqOfIntegers_Enum RT_MANGLER(RTAsn1SeqOfIntegers_Enum)
+# define RTAsn1SeqOfIntegers_Init RT_MANGLER(RTAsn1SeqOfIntegers_Init)
+# define RTAsn1SetOfIntegers_CheckSanity RT_MANGLER(RTAsn1SetOfIntegers_CheckSanity)
+# define RTAsn1SetOfIntegers_Clone RT_MANGLER(RTAsn1SetOfIntegers_Clone)
+# define RTAsn1SetOfIntegers_Compare RT_MANGLER(RTAsn1SetOfIntegers_Compare)
+# define RTAsn1SetOfIntegers_Delete RT_MANGLER(RTAsn1SetOfIntegers_Delete)
+# define RTAsn1SetOfIntegers_Enum RT_MANGLER(RTAsn1SetOfIntegers_Enum)
+# define RTAsn1SetOfIntegers_Init RT_MANGLER(RTAsn1SetOfIntegers_Init)
+# define RTAsn1Integer_DecodeAsn1 RT_MANGLER(RTAsn1Integer_DecodeAsn1)
+# define RTAsn1SeqOfIntegers_DecodeAsn1 RT_MANGLER(RTAsn1SeqOfIntegers_DecodeAsn1)
+# define RTAsn1SetOfIntegers_DecodeAsn1 RT_MANGLER(RTAsn1SetOfIntegers_DecodeAsn1)
+# define RTAsn1Null_CheckSanity RT_MANGLER(RTAsn1Null_CheckSanity)
+# define RTAsn1Null_Clone RT_MANGLER(RTAsn1Null_Clone)
+# define RTAsn1Null_Compare RT_MANGLER(RTAsn1Null_Compare)
+# define RTAsn1Null_Delete RT_MANGLER(RTAsn1Null_Delete)
+# define RTAsn1Null_Enum RT_MANGLER(RTAsn1Null_Enum)
+# define RTAsn1Null_Init RT_MANGLER(RTAsn1Null_Init)
+# define RTAsn1Null_DecodeAsn1 RT_MANGLER(RTAsn1Null_DecodeAsn1)
+# define RTAsn1ObjIdCountComponents RT_MANGLER(RTAsn1ObjIdCountComponents)
+# define RTAsn1ObjIdGetComponentsAsUInt32 RT_MANGLER(RTAsn1ObjIdGetComponentsAsUInt32)
+# define RTAsn1ObjIdGetLastComponentsAsUInt32 RT_MANGLER(RTAsn1ObjIdGetLastComponentsAsUInt32)
+# define RTAsn1ObjId_CheckSanity RT_MANGLER(RTAsn1ObjId_CheckSanity)
+# define RTAsn1ObjId_Clone RT_MANGLER(RTAsn1ObjId_Clone)
+# define RTAsn1ObjId_Compare RT_MANGLER(RTAsn1ObjId_Compare)
+# define RTAsn1ObjId_CompareWithString RT_MANGLER(RTAsn1ObjId_CompareWithString)
+# define RTAsn1ObjId_Delete RT_MANGLER(RTAsn1ObjId_Delete)
+# define RTAsn1ObjId_Enum RT_MANGLER(RTAsn1ObjId_Enum)
+# define RTAsn1ObjId_Init RT_MANGLER(RTAsn1ObjId_Init)
+# define RTAsn1ObjId_InitFromString RT_MANGLER(RTAsn1ObjId_InitFromString)
+# define RTAsn1ObjId_StartsWith RT_MANGLER(RTAsn1ObjId_StartsWith)
+# define RTAsn1SeqOfObjIds_CheckSanity RT_MANGLER(RTAsn1SeqOfObjIds_CheckSanity)
+# define RTAsn1SeqOfObjIds_Clone RT_MANGLER(RTAsn1SeqOfObjIds_Clone)
+# define RTAsn1SeqOfObjIds_Compare RT_MANGLER(RTAsn1SeqOfObjIds_Compare)
+# define RTAsn1SeqOfObjIds_Delete RT_MANGLER(RTAsn1SeqOfObjIds_Delete)
+# define RTAsn1SeqOfObjIds_Enum RT_MANGLER(RTAsn1SeqOfObjIds_Enum)
+# define RTAsn1SeqOfObjIds_Init RT_MANGLER(RTAsn1SeqOfObjIds_Init)
+# define RTAsn1SetOfObjIds_CheckSanity RT_MANGLER(RTAsn1SetOfObjIds_CheckSanity)
+# define RTAsn1SetOfObjIds_Clone RT_MANGLER(RTAsn1SetOfObjIds_Clone)
+# define RTAsn1SetOfObjIds_Compare RT_MANGLER(RTAsn1SetOfObjIds_Compare)
+# define RTAsn1SetOfObjIds_Delete RT_MANGLER(RTAsn1SetOfObjIds_Delete)
+# define RTAsn1SetOfObjIds_Enum RT_MANGLER(RTAsn1SetOfObjIds_Enum)
+# define RTAsn1SetOfObjIds_Init RT_MANGLER(RTAsn1SetOfObjIds_Init)
+# define RTAsn1ObjId_DecodeAsn1 RT_MANGLER(RTAsn1ObjId_DecodeAsn1)
+# define RTAsn1SeqOfObjIds_DecodeAsn1 RT_MANGLER(RTAsn1SeqOfObjIds_DecodeAsn1)
+# define RTAsn1SetOfObjIds_DecodeAsn1 RT_MANGLER(RTAsn1SetOfObjIds_DecodeAsn1)
+# define RTAsn1OctetString_CheckSanity RT_MANGLER(RTAsn1OctetString_CheckSanity)
+# define RTAsn1OctetString_Clone RT_MANGLER(RTAsn1OctetString_Clone)
+# define RTAsn1OctetString_Compare RT_MANGLER(RTAsn1OctetString_Compare)
+# define RTAsn1OctetString_Delete RT_MANGLER(RTAsn1OctetString_Delete)
+# define RTAsn1OctetString_Enum RT_MANGLER(RTAsn1OctetString_Enum)
+# define RTAsn1OctetString_Init RT_MANGLER(RTAsn1OctetString_Init)
+# define RTAsn1SeqOfOctetStrings_CheckSanity RT_MANGLER(RTAsn1SeqOfOctetStrings_CheckSanity)
+# define RTAsn1SeqOfOctetStrings_Clone RT_MANGLER(RTAsn1SeqOfOctetStrings_Clone)
+# define RTAsn1SeqOfOctetStrings_Compare RT_MANGLER(RTAsn1SeqOfOctetStrings_Compare)
+# define RTAsn1SeqOfOctetStrings_Delete RT_MANGLER(RTAsn1SeqOfOctetStrings_Delete)
+# define RTAsn1SeqOfOctetStrings_Enum RT_MANGLER(RTAsn1SeqOfOctetStrings_Enum)
+# define RTAsn1SeqOfOctetStrings_Init RT_MANGLER(RTAsn1SeqOfOctetStrings_Init)
+# define RTAsn1SetOfOctetStrings_CheckSanity RT_MANGLER(RTAsn1SetOfOctetStrings_CheckSanity)
+# define RTAsn1SetOfOctetStrings_Clone RT_MANGLER(RTAsn1SetOfOctetStrings_Clone)
+# define RTAsn1SetOfOctetStrings_Compare RT_MANGLER(RTAsn1SetOfOctetStrings_Compare)
+# define RTAsn1SetOfOctetStrings_Delete RT_MANGLER(RTAsn1SetOfOctetStrings_Delete)
+# define RTAsn1SetOfOctetStrings_Enum RT_MANGLER(RTAsn1SetOfOctetStrings_Enum)
+# define RTAsn1SetOfOctetStrings_Init RT_MANGLER(RTAsn1SetOfOctetStrings_Init)
+# define RTAsn1OctetString_DecodeAsn1 RT_MANGLER(RTAsn1OctetString_DecodeAsn1)
+# define RTAsn1SeqOfOctetStrings_DecodeAsn1 RT_MANGLER(RTAsn1SeqOfOctetStrings_DecodeAsn1)
+# define RTAsn1SetOfOctetStrings_DecodeAsn1 RT_MANGLER(RTAsn1SetOfOctetStrings_DecodeAsn1)
+# define RTAsn1BmpString_CheckSanity RT_MANGLER(RTAsn1BmpString_CheckSanity)
+# define RTAsn1BmpString_Clone RT_MANGLER(RTAsn1BmpString_Clone)
+# define RTAsn1BmpString_Compare RT_MANGLER(RTAsn1BmpString_Compare)
+# define RTAsn1BmpString_Delete RT_MANGLER(RTAsn1BmpString_Delete)
+# define RTAsn1BmpString_Enum RT_MANGLER(RTAsn1BmpString_Enum)
+# define RTAsn1BmpString_Init RT_MANGLER(RTAsn1BmpString_Init)
+# define RTAsn1GeneralString_CheckSanity RT_MANGLER(RTAsn1GeneralString_CheckSanity)
+# define RTAsn1GeneralString_Clone RT_MANGLER(RTAsn1GeneralString_Clone)
+# define RTAsn1GeneralString_Compare RT_MANGLER(RTAsn1GeneralString_Compare)
+# define RTAsn1GeneralString_Delete RT_MANGLER(RTAsn1GeneralString_Delete)
+# define RTAsn1GeneralString_Enum RT_MANGLER(RTAsn1GeneralString_Enum)
+# define RTAsn1GeneralString_Init RT_MANGLER(RTAsn1GeneralString_Init)
+# define RTAsn1GraphicString_CheckSanity RT_MANGLER(RTAsn1GraphicString_CheckSanity)
+# define RTAsn1GraphicString_Clone RT_MANGLER(RTAsn1GraphicString_Clone)
+# define RTAsn1GraphicString_Compare RT_MANGLER(RTAsn1GraphicString_Compare)
+# define RTAsn1GraphicString_Delete RT_MANGLER(RTAsn1GraphicString_Delete)
+# define RTAsn1GraphicString_Enum RT_MANGLER(RTAsn1GraphicString_Enum)
+# define RTAsn1GraphicString_Init RT_MANGLER(RTAsn1GraphicString_Init)
+# define RTAsn1Ia5String_CheckSanity RT_MANGLER(RTAsn1Ia5String_CheckSanity)
+# define RTAsn1Ia5String_Clone RT_MANGLER(RTAsn1Ia5String_Clone)
+# define RTAsn1Ia5String_Compare RT_MANGLER(RTAsn1Ia5String_Compare)
+# define RTAsn1Ia5String_Delete RT_MANGLER(RTAsn1Ia5String_Delete)
+# define RTAsn1Ia5String_Enum RT_MANGLER(RTAsn1Ia5String_Enum)
+# define RTAsn1Ia5String_Init RT_MANGLER(RTAsn1Ia5String_Init)
+# define RTAsn1NumericString_CheckSanity RT_MANGLER(RTAsn1NumericString_CheckSanity)
+# define RTAsn1NumericString_Clone RT_MANGLER(RTAsn1NumericString_Clone)
+# define RTAsn1NumericString_Compare RT_MANGLER(RTAsn1NumericString_Compare)
+# define RTAsn1NumericString_Delete RT_MANGLER(RTAsn1NumericString_Delete)
+# define RTAsn1NumericString_Enum RT_MANGLER(RTAsn1NumericString_Enum)
+# define RTAsn1NumericString_Init RT_MANGLER(RTAsn1NumericString_Init)
+# define RTAsn1PrintableString_CheckSanity RT_MANGLER(RTAsn1PrintableString_CheckSanity)
+# define RTAsn1PrintableString_Clone RT_MANGLER(RTAsn1PrintableString_Clone)
+# define RTAsn1PrintableString_Compare RT_MANGLER(RTAsn1PrintableString_Compare)
+# define RTAsn1PrintableString_Delete RT_MANGLER(RTAsn1PrintableString_Delete)
+# define RTAsn1PrintableString_Enum RT_MANGLER(RTAsn1PrintableString_Enum)
+# define RTAsn1PrintableString_Init RT_MANGLER(RTAsn1PrintableString_Init)
+# define RTAsn1SeqOfStrings_CheckSanity RT_MANGLER(RTAsn1SeqOfStrings_CheckSanity)
+# define RTAsn1SeqOfStrings_Clone RT_MANGLER(RTAsn1SeqOfStrings_Clone)
+# define RTAsn1SeqOfStrings_Compare RT_MANGLER(RTAsn1SeqOfStrings_Compare)
+# define RTAsn1SeqOfStrings_Delete RT_MANGLER(RTAsn1SeqOfStrings_Delete)
+# define RTAsn1SeqOfStrings_Enum RT_MANGLER(RTAsn1SeqOfStrings_Enum)
+# define RTAsn1SeqOfStrings_Init RT_MANGLER(RTAsn1SeqOfStrings_Init)
+# define RTAsn1SetOfStrings_CheckSanity RT_MANGLER(RTAsn1SetOfStrings_CheckSanity)
+# define RTAsn1SetOfStrings_Clone RT_MANGLER(RTAsn1SetOfStrings_Clone)
+# define RTAsn1SetOfStrings_Compare RT_MANGLER(RTAsn1SetOfStrings_Compare)
+# define RTAsn1SetOfStrings_Delete RT_MANGLER(RTAsn1SetOfStrings_Delete)
+# define RTAsn1SetOfStrings_Enum RT_MANGLER(RTAsn1SetOfStrings_Enum)
+# define RTAsn1SetOfStrings_Init RT_MANGLER(RTAsn1SetOfStrings_Init)
+# define RTAsn1String_CheckSanity RT_MANGLER(RTAsn1String_CheckSanity)
+# define RTAsn1String_Clone RT_MANGLER(RTAsn1String_Clone)
+# define RTAsn1String_Compare RT_MANGLER(RTAsn1String_Compare)
+# define RTAsn1String_CompareEx RT_MANGLER(RTAsn1String_CompareEx)
+# define RTAsn1String_CompareWithString RT_MANGLER(RTAsn1String_CompareWithString)
+# define RTAsn1String_Delete RT_MANGLER(RTAsn1String_Delete)
+# define RTAsn1String_Enum RT_MANGLER(RTAsn1String_Enum)
+# define RTAsn1String_Init RT_MANGLER(RTAsn1String_Init)
+# define RTAsn1String_InitEx RT_MANGLER(RTAsn1String_InitEx)
+# define RTAsn1String_InitWithValue RT_MANGLER(RTAsn1String_InitWithValue)
+# define RTAsn1String_QueryUtf8 RT_MANGLER(RTAsn1String_QueryUtf8)
+# define RTAsn1String_QueryUtf8Len RT_MANGLER(RTAsn1String_QueryUtf8Len)
+# define RTAsn1String_RecodeAsUtf8 RT_MANGLER(RTAsn1String_RecodeAsUtf8)
+# define RTAsn1T61String_CheckSanity RT_MANGLER(RTAsn1T61String_CheckSanity)
+# define RTAsn1T61String_Clone RT_MANGLER(RTAsn1T61String_Clone)
+# define RTAsn1T61String_Compare RT_MANGLER(RTAsn1T61String_Compare)
+# define RTAsn1T61String_Delete RT_MANGLER(RTAsn1T61String_Delete)
+# define RTAsn1T61String_Enum RT_MANGLER(RTAsn1T61String_Enum)
+# define RTAsn1T61String_Init RT_MANGLER(RTAsn1T61String_Init)
+# define RTAsn1UniversalString_CheckSanity RT_MANGLER(RTAsn1UniversalString_CheckSanity)
+# define RTAsn1UniversalString_Clone RT_MANGLER(RTAsn1UniversalString_Clone)
+# define RTAsn1UniversalString_Compare RT_MANGLER(RTAsn1UniversalString_Compare)
+# define RTAsn1UniversalString_Delete RT_MANGLER(RTAsn1UniversalString_Delete)
+# define RTAsn1UniversalString_Enum RT_MANGLER(RTAsn1UniversalString_Enum)
+# define RTAsn1UniversalString_Init RT_MANGLER(RTAsn1UniversalString_Init)
+# define RTAsn1Utf8String_CheckSanity RT_MANGLER(RTAsn1Utf8String_CheckSanity)
+# define RTAsn1Utf8String_Clone RT_MANGLER(RTAsn1Utf8String_Clone)
+# define RTAsn1Utf8String_Compare RT_MANGLER(RTAsn1Utf8String_Compare)
+# define RTAsn1Utf8String_Delete RT_MANGLER(RTAsn1Utf8String_Delete)
+# define RTAsn1Utf8String_Enum RT_MANGLER(RTAsn1Utf8String_Enum)
+# define RTAsn1Utf8String_Init RT_MANGLER(RTAsn1Utf8String_Init)
+# define RTAsn1VisibleString_CheckSanity RT_MANGLER(RTAsn1VisibleString_CheckSanity)
+# define RTAsn1VisibleString_Clone RT_MANGLER(RTAsn1VisibleString_Clone)
+# define RTAsn1VisibleString_Compare RT_MANGLER(RTAsn1VisibleString_Compare)
+# define RTAsn1VisibleString_Delete RT_MANGLER(RTAsn1VisibleString_Delete)
+# define RTAsn1VisibleString_Enum RT_MANGLER(RTAsn1VisibleString_Enum)
+# define RTAsn1VisibleString_Init RT_MANGLER(RTAsn1VisibleString_Init)
+# define RTAsn1BmpString_DecodeAsn1 RT_MANGLER(RTAsn1BmpString_DecodeAsn1)
+# define RTAsn1GeneralString_DecodeAsn1 RT_MANGLER(RTAsn1GeneralString_DecodeAsn1)
+# define RTAsn1GraphicString_DecodeAsn1 RT_MANGLER(RTAsn1GraphicString_DecodeAsn1)
+# define RTAsn1Ia5String_DecodeAsn1 RT_MANGLER(RTAsn1Ia5String_DecodeAsn1)
+# define RTAsn1NumericString_DecodeAsn1 RT_MANGLER(RTAsn1NumericString_DecodeAsn1)
+# define RTAsn1PrintableString_DecodeAsn1 RT_MANGLER(RTAsn1PrintableString_DecodeAsn1)
+# define RTAsn1SeqOfStrings_DecodeAsn1 RT_MANGLER(RTAsn1SeqOfStrings_DecodeAsn1)
+# define RTAsn1SetOfStrings_DecodeAsn1 RT_MANGLER(RTAsn1SetOfStrings_DecodeAsn1)
+# define RTAsn1String_DecodeAsn1 RT_MANGLER(RTAsn1String_DecodeAsn1)
+# define RTAsn1T61String_DecodeAsn1 RT_MANGLER(RTAsn1T61String_DecodeAsn1)
+# define RTAsn1UniversalString_DecodeAsn1 RT_MANGLER(RTAsn1UniversalString_DecodeAsn1)
+# define RTAsn1Utf8String_DecodeAsn1 RT_MANGLER(RTAsn1Utf8String_DecodeAsn1)
+# define RTAsn1VisibleString_DecodeAsn1 RT_MANGLER(RTAsn1VisibleString_DecodeAsn1)
+# define RTAsn1GeneralizedTime_CheckSanity RT_MANGLER(RTAsn1GeneralizedTime_CheckSanity)
+# define RTAsn1GeneralizedTime_Clone RT_MANGLER(RTAsn1GeneralizedTime_Clone)
+# define RTAsn1GeneralizedTime_Compare RT_MANGLER(RTAsn1GeneralizedTime_Compare)
+# define RTAsn1GeneralizedTime_Delete RT_MANGLER(RTAsn1GeneralizedTime_Delete)
+# define RTAsn1GeneralizedTime_Enum RT_MANGLER(RTAsn1GeneralizedTime_Enum)
+# define RTAsn1GeneralizedTime_Init RT_MANGLER(RTAsn1GeneralizedTime_Init)
+# define RTAsn1SeqOfTimes_CheckSanity RT_MANGLER(RTAsn1SeqOfTimes_CheckSanity)
+# define RTAsn1SeqOfTimes_Clone RT_MANGLER(RTAsn1SeqOfTimes_Clone)
+# define RTAsn1SeqOfTimes_Compare RT_MANGLER(RTAsn1SeqOfTimes_Compare)
+# define RTAsn1SeqOfTimes_Delete RT_MANGLER(RTAsn1SeqOfTimes_Delete)
+# define RTAsn1SeqOfTimes_Enum RT_MANGLER(RTAsn1SeqOfTimes_Enum)
+# define RTAsn1SeqOfTimes_Init RT_MANGLER(RTAsn1SeqOfTimes_Init)
+# define RTAsn1SetOfTimes_CheckSanity RT_MANGLER(RTAsn1SetOfTimes_CheckSanity)
+# define RTAsn1SetOfTimes_Clone RT_MANGLER(RTAsn1SetOfTimes_Clone)
+# define RTAsn1SetOfTimes_Compare RT_MANGLER(RTAsn1SetOfTimes_Compare)
+# define RTAsn1SetOfTimes_Delete RT_MANGLER(RTAsn1SetOfTimes_Delete)
+# define RTAsn1SetOfTimes_Enum RT_MANGLER(RTAsn1SetOfTimes_Enum)
+# define RTAsn1SetOfTimes_Init RT_MANGLER(RTAsn1SetOfTimes_Init)
+# define RTAsn1Time_CheckSanity RT_MANGLER(RTAsn1Time_CheckSanity)
+# define RTAsn1Time_Clone RT_MANGLER(RTAsn1Time_Clone)
+# define RTAsn1Time_Compare RT_MANGLER(RTAsn1Time_Compare)
+# define RTAsn1Time_CompareWithTimeSpec RT_MANGLER(RTAsn1Time_CompareWithTimeSpec)
+# define RTAsn1Time_Delete RT_MANGLER(RTAsn1Time_Delete)
+# define RTAsn1Time_Enum RT_MANGLER(RTAsn1Time_Enum)
+# define RTAsn1Time_Init RT_MANGLER(RTAsn1Time_Init)
+# define RTAsn1UtcTime_CheckSanity RT_MANGLER(RTAsn1UtcTime_CheckSanity)
+# define RTAsn1UtcTime_Clone RT_MANGLER(RTAsn1UtcTime_Clone)
+# define RTAsn1UtcTime_Compare RT_MANGLER(RTAsn1UtcTime_Compare)
+# define RTAsn1UtcTime_Delete RT_MANGLER(RTAsn1UtcTime_Delete)
+# define RTAsn1UtcTime_Enum RT_MANGLER(RTAsn1UtcTime_Enum)
+# define RTAsn1UtcTime_Init RT_MANGLER(RTAsn1UtcTime_Init)
+# define RTAsn1GeneralizedTime_DecodeAsn1 RT_MANGLER(RTAsn1GeneralizedTime_DecodeAsn1)
+# define RTAsn1SeqOfTimes_DecodeAsn1 RT_MANGLER(RTAsn1SeqOfTimes_DecodeAsn1)
+# define RTAsn1SetOfTimes_DecodeAsn1 RT_MANGLER(RTAsn1SetOfTimes_DecodeAsn1)
+# define RTAsn1Time_DecodeAsn1 RT_MANGLER(RTAsn1Time_DecodeAsn1)
+# define RTAsn1UtcTime_DecodeAsn1 RT_MANGLER(RTAsn1UtcTime_DecodeAsn1)
+# define RTMd2 RT_MANGLER(RTMd2)
+# define RTMd2Final RT_MANGLER(RTMd2Final)
+# define RTMd2Init RT_MANGLER(RTMd2Init)
+# define RTMd2Update RT_MANGLER(RTMd2Update)
+# define RTMd2FromString RT_MANGLER(RTMd2FromString)
+# define RTMd2ToString RT_MANGLER(RTMd2ToString)
+# define RTCrDigestClone RT_MANGLER(RTCrDigestClone)
+# define RTCrDigestCreate RT_MANGLER(RTCrDigestCreate)
+# define RTCrDigestFinal RT_MANGLER(RTCrDigestFinal)
+# define RTCrDigestGetConsumedSize RT_MANGLER(RTCrDigestGetConsumedSize)
+# define RTCrDigestGetHash RT_MANGLER(RTCrDigestGetHash)
+# define RTCrDigestGetHashSize RT_MANGLER(RTCrDigestGetHashSize)
+# define RTCrDigestGetType RT_MANGLER(RTCrDigestGetType)
+# define RTCrDigestIsFinalized RT_MANGLER(RTCrDigestIsFinalized)
+# define RTCrDigestMatch RT_MANGLER(RTCrDigestMatch)
+# define RTCrDigestRelease RT_MANGLER(RTCrDigestRelease)
+# define RTCrDigestReset RT_MANGLER(RTCrDigestReset)
+# define RTCrDigestRetain RT_MANGLER(RTCrDigestRetain)
+# define RTCrDigestUpdate RT_MANGLER(RTCrDigestUpdate)
+# define RTCrDigestCreateByObjId RT_MANGLER(RTCrDigestCreateByObjId)
+# define RTCrDigestCreateByObjIdString RT_MANGLER(RTCrDigestCreateByObjIdString)
+# define RTCrRsaDigestInfo_DecodeAsn1 RT_MANGLER(RTCrRsaDigestInfo_DecodeAsn1)
+# define RTCrRsaOtherPrimeInfo_DecodeAsn1 RT_MANGLER(RTCrRsaOtherPrimeInfo_DecodeAsn1)
+# define RTCrRsaOtherPrimeInfos_DecodeAsn1 RT_MANGLER(RTCrRsaOtherPrimeInfos_DecodeAsn1)
+# define RTCrRsaPrivateKey_DecodeAsn1 RT_MANGLER(RTCrRsaPrivateKey_DecodeAsn1)
+# define RTCrRsaPublicKey_DecodeAsn1 RT_MANGLER(RTCrRsaPublicKey_DecodeAsn1)
+# define RTCrRsaDigestInfo_Compare RT_MANGLER(RTCrRsaDigestInfo_Compare)
+# define RTCrRsaDigestInfo_Delete RT_MANGLER(RTCrRsaDigestInfo_Delete)
+# define RTCrRsaDigestInfo_Enum RT_MANGLER(RTCrRsaDigestInfo_Enum)
+# define RTCrRsaOtherPrimeInfo_Compare RT_MANGLER(RTCrRsaOtherPrimeInfo_Compare)
+# define RTCrRsaOtherPrimeInfo_Delete RT_MANGLER(RTCrRsaOtherPrimeInfo_Delete)
+# define RTCrRsaOtherPrimeInfo_Enum RT_MANGLER(RTCrRsaOtherPrimeInfo_Enum)
+# define RTCrRsaOtherPrimeInfos_Compare RT_MANGLER(RTCrRsaOtherPrimeInfos_Compare)
+# define RTCrRsaOtherPrimeInfos_Delete RT_MANGLER(RTCrRsaOtherPrimeInfos_Delete)
+# define RTCrRsaOtherPrimeInfos_Enum RT_MANGLER(RTCrRsaOtherPrimeInfos_Enum)
+# define RTCrRsaPrivateKey_Compare RT_MANGLER(RTCrRsaPrivateKey_Compare)
+# define RTCrRsaPrivateKey_Delete RT_MANGLER(RTCrRsaPrivateKey_Delete)
+# define RTCrRsaPrivateKey_Enum RT_MANGLER(RTCrRsaPrivateKey_Enum)
+# define RTCrRsaPublicKey_Compare RT_MANGLER(RTCrRsaPublicKey_Compare)
+# define RTCrRsaPublicKey_Delete RT_MANGLER(RTCrRsaPublicKey_Delete)
+# define RTCrRsaPublicKey_Enum RT_MANGLER(RTCrRsaPublicKey_Enum)
+# define RTCrRsaDigestInfo_Clone RT_MANGLER(RTCrRsaDigestInfo_Clone)
+# define RTCrRsaDigestInfo_Init RT_MANGLER(RTCrRsaDigestInfo_Init)
+# define RTCrRsaOtherPrimeInfo_Clone RT_MANGLER(RTCrRsaOtherPrimeInfo_Clone)
+# define RTCrRsaOtherPrimeInfo_Init RT_MANGLER(RTCrRsaOtherPrimeInfo_Init)
+# define RTCrRsaOtherPrimeInfos_Clone RT_MANGLER(RTCrRsaOtherPrimeInfos_Clone)
+# define RTCrRsaOtherPrimeInfos_Init RT_MANGLER(RTCrRsaOtherPrimeInfos_Init)
+# define RTCrRsaPrivateKey_Clone RT_MANGLER(RTCrRsaPrivateKey_Clone)
+# define RTCrRsaPrivateKey_Init RT_MANGLER(RTCrRsaPrivateKey_Init)
+# define RTCrRsaPublicKey_Clone RT_MANGLER(RTCrRsaPublicKey_Clone)
+# define RTCrRsaPublicKey_Init RT_MANGLER(RTCrRsaPublicKey_Init)
+# define RTCrRsaDigestInfo_CheckSanity RT_MANGLER(RTCrRsaDigestInfo_CheckSanity)
+# define RTCrRsaOtherPrimeInfo_CheckSanity RT_MANGLER(RTCrRsaOtherPrimeInfo_CheckSanity)
+# define RTCrRsaOtherPrimeInfos_CheckSanity RT_MANGLER(RTCrRsaOtherPrimeInfos_CheckSanity)
+# define RTCrRsaPrivateKey_CheckSanity RT_MANGLER(RTCrRsaPrivateKey_CheckSanity)
+# define RTCrRsaPublicKey_CheckSanity RT_MANGLER(RTCrRsaPublicKey_CheckSanity)
+# define RTCrPemFreeSections RT_MANGLER(RTCrPemFreeSections)
+# define RTCrPemReadFile RT_MANGLER(RTCrPemReadFile)
+# define RTCrPkcs7Attribute_DecodeAsn1 RT_MANGLER(RTCrPkcs7Attribute_DecodeAsn1)
+# define RTCrPkcs7Attributes_DecodeAsn1 RT_MANGLER(RTCrPkcs7Attributes_DecodeAsn1)
+# define RTCrPkcs7ContentInfo_DecodeAsn1 RT_MANGLER(RTCrPkcs7ContentInfo_DecodeAsn1)
+# define RTCrPkcs7DigestInfo_DecodeAsn1 RT_MANGLER(RTCrPkcs7DigestInfo_DecodeAsn1)
+# define RTCrPkcs7IssuerAndSerialNumber_DecodeAsn1 RT_MANGLER(RTCrPkcs7IssuerAndSerialNumber_DecodeAsn1)
+# define RTCrPkcs7SignedData_DecodeAsn1 RT_MANGLER(RTCrPkcs7SignedData_DecodeAsn1)
+# define RTCrPkcs7SignerInfo_DecodeAsn1 RT_MANGLER(RTCrPkcs7SignerInfo_DecodeAsn1)
+# define RTCrPkcs7SignerInfos_DecodeAsn1 RT_MANGLER(RTCrPkcs7SignerInfos_DecodeAsn1)
+# define RTCrPkcs7Attribute_Compare RT_MANGLER(RTCrPkcs7Attribute_Compare)
+# define RTCrPkcs7Attribute_Delete RT_MANGLER(RTCrPkcs7Attribute_Delete)
+# define RTCrPkcs7Attribute_Enum RT_MANGLER(RTCrPkcs7Attribute_Enum)
+# define RTCrPkcs7Attributes_Compare RT_MANGLER(RTCrPkcs7Attributes_Compare)
+# define RTCrPkcs7Attributes_Delete RT_MANGLER(RTCrPkcs7Attributes_Delete)
+# define RTCrPkcs7Attributes_Enum RT_MANGLER(RTCrPkcs7Attributes_Enum)
+# define RTCrPkcs7ContentInfo_Compare RT_MANGLER(RTCrPkcs7ContentInfo_Compare)
+# define RTCrPkcs7ContentInfo_Delete RT_MANGLER(RTCrPkcs7ContentInfo_Delete)
+# define RTCrPkcs7ContentInfo_Enum RT_MANGLER(RTCrPkcs7ContentInfo_Enum)
+# define RTCrPkcs7ContentInfo_IsSignedData RT_MANGLER(RTCrPkcs7ContentInfo_IsSignedData)
+# define RTCrPkcs7DigestInfo_Compare RT_MANGLER(RTCrPkcs7DigestInfo_Compare)
+# define RTCrPkcs7DigestInfo_Delete RT_MANGLER(RTCrPkcs7DigestInfo_Delete)
+# define RTCrPkcs7DigestInfo_Enum RT_MANGLER(RTCrPkcs7DigestInfo_Enum)
+# define RTCrPkcs7IssuerAndSerialNumber_Compare RT_MANGLER(RTCrPkcs7IssuerAndSerialNumber_Compare)
+# define RTCrPkcs7IssuerAndSerialNumber_Delete RT_MANGLER(RTCrPkcs7IssuerAndSerialNumber_Delete)
+# define RTCrPkcs7IssuerAndSerialNumber_Enum RT_MANGLER(RTCrPkcs7IssuerAndSerialNumber_Enum)
+# define RTCrPkcs7SignedData_Compare RT_MANGLER(RTCrPkcs7SignedData_Compare)
+# define RTCrPkcs7SignedData_Delete RT_MANGLER(RTCrPkcs7SignedData_Delete)
+# define RTCrPkcs7SignedData_Enum RT_MANGLER(RTCrPkcs7SignedData_Enum)
+# define RTCrPkcs7SignerInfo_Compare RT_MANGLER(RTCrPkcs7SignerInfo_Compare)
+# define RTCrPkcs7SignerInfo_Delete RT_MANGLER(RTCrPkcs7SignerInfo_Delete)
+# define RTCrPkcs7SignerInfo_Enum RT_MANGLER(RTCrPkcs7SignerInfo_Enum)
+# define RTCrPkcs7SignerInfos_Compare RT_MANGLER(RTCrPkcs7SignerInfos_Compare)
+# define RTCrPkcs7SignerInfos_Delete RT_MANGLER(RTCrPkcs7SignerInfos_Delete)
+# define RTCrPkcs7SignerInfos_Enum RT_MANGLER(RTCrPkcs7SignerInfos_Enum)
+# define RTCrPkcs7Attribute_Clone RT_MANGLER(RTCrPkcs7Attribute_Clone)
+# define RTCrPkcs7Attribute_Init RT_MANGLER(RTCrPkcs7Attribute_Init)
+# define RTCrPkcs7Attributes_Clone RT_MANGLER(RTCrPkcs7Attributes_Clone)
+# define RTCrPkcs7Attributes_Init RT_MANGLER(RTCrPkcs7Attributes_Init)
+# define RTCrPkcs7ContentInfo_Clone RT_MANGLER(RTCrPkcs7ContentInfo_Clone)
+# define RTCrPkcs7ContentInfo_Init RT_MANGLER(RTCrPkcs7ContentInfo_Init)
+# define RTCrPkcs7DigestInfo_Clone RT_MANGLER(RTCrPkcs7DigestInfo_Clone)
+# define RTCrPkcs7DigestInfo_Init RT_MANGLER(RTCrPkcs7DigestInfo_Init)
+# define RTCrPkcs7IssuerAndSerialNumber_Clone RT_MANGLER(RTCrPkcs7IssuerAndSerialNumber_Clone)
+# define RTCrPkcs7IssuerAndSerialNumber_Init RT_MANGLER(RTCrPkcs7IssuerAndSerialNumber_Init)
+# define RTCrPkcs7SignedData_Clone RT_MANGLER(RTCrPkcs7SignedData_Clone)
+# define RTCrPkcs7SignedData_Init RT_MANGLER(RTCrPkcs7SignedData_Init)
+# define RTCrPkcs7SignerInfo_Clone RT_MANGLER(RTCrPkcs7SignerInfo_Clone)
+# define RTCrPkcs7SignerInfo_Init RT_MANGLER(RTCrPkcs7SignerInfo_Init)
+# define RTCrPkcs7SignerInfos_Clone RT_MANGLER(RTCrPkcs7SignerInfos_Clone)
+# define RTCrPkcs7SignerInfos_Init RT_MANGLER(RTCrPkcs7SignerInfos_Init)
+# define RTCrPkcs7Attribute_CheckSanity RT_MANGLER(RTCrPkcs7Attribute_CheckSanity)
+# define RTCrPkcs7Attributes_CheckSanity RT_MANGLER(RTCrPkcs7Attributes_CheckSanity)
+# define RTCrPkcs7ContentInfo_CheckSanity RT_MANGLER(RTCrPkcs7ContentInfo_CheckSanity)
+# define RTCrPkcs7DigestInfo_CheckSanity RT_MANGLER(RTCrPkcs7DigestInfo_CheckSanity)
+# define RTCrPkcs7IssuerAndSerialNumber_CheckSanity RT_MANGLER(RTCrPkcs7IssuerAndSerialNumber_CheckSanity)
+# define RTCrPkcs7SignedData_CheckSanity RT_MANGLER(RTCrPkcs7SignedData_CheckSanity)
+# define RTCrPkcs7SignerInfo_CheckSanity RT_MANGLER(RTCrPkcs7SignerInfo_CheckSanity)
+# define RTCrPkcs7SignerInfos_CheckSanity RT_MANGLER(RTCrPkcs7SignerInfos_CheckSanity)
+# define RTCrPkcs7VerifyCertCallbackCodeSigning RT_MANGLER(RTCrPkcs7VerifyCertCallbackCodeSigning)
+# define RTCrPkcs7VerifyCertCallbackDefault RT_MANGLER(RTCrPkcs7VerifyCertCallbackDefault)
+# define RTCrPkcs7VerifySignedData RT_MANGLER(RTCrPkcs7VerifySignedData)
+# define RTCrPkixSignatureCreateByObjId RT_MANGLER(RTCrPkixSignatureCreateByObjId)
+# define RTCrPkixSignatureCreateByObjIdString RT_MANGLER(RTCrPkixSignatureCreateByObjIdString)
+# define RTCrPkixSignatureCreate RT_MANGLER(RTCrPkixSignatureCreate)
+# define RTCrPkixSignatureRelease RT_MANGLER(RTCrPkixSignatureRelease)
+# define RTCrPkixSignatureRetain RT_MANGLER(RTCrPkixSignatureRetain)
+# define RTCrPkixSignatureSign RT_MANGLER(RTCrPkixSignatureSign)
+# define RTCrPkixSignatureVerify RT_MANGLER(RTCrPkixSignatureVerify)
+# define RTCrPkixSignatureVerifyBitString RT_MANGLER(RTCrPkixSignatureVerifyBitString)
+# define RTCrPkixSignatureVerifyOctetString RT_MANGLER(RTCrPkixSignatureVerifyOctetString)
+# define RTCrPkixGetCiperOidFromSignatureAlgorithm RT_MANGLER(RTCrPkixGetCiperOidFromSignatureAlgorithm)
+# define RTCrPkixPubKeyVerifySignature RT_MANGLER(RTCrPkixPubKeyVerifySignature)
+# define RTCrSpcAttributeTypeAndOptionalValue_DecodeAsn1 RT_MANGLER(RTCrSpcAttributeTypeAndOptionalValue_DecodeAsn1)
+# define RTCrSpcIndirectDataContent_DecodeAsn1 RT_MANGLER(RTCrSpcIndirectDataContent_DecodeAsn1)
+# define RTCrSpcLink_DecodeAsn1 RT_MANGLER(RTCrSpcLink_DecodeAsn1)
+# define RTCrSpcPeImageData_DecodeAsn1 RT_MANGLER(RTCrSpcPeImageData_DecodeAsn1)
+# define RTCrSpcSerializedObjectAttribute_DecodeAsn1 RT_MANGLER(RTCrSpcSerializedObjectAttribute_DecodeAsn1)
+# define RTCrSpcSerializedObjectAttributes_DecodeAsn1 RT_MANGLER(RTCrSpcSerializedObjectAttributes_DecodeAsn1)
+# define RTCrSpcSerializedObject_DecodeAsn1 RT_MANGLER(RTCrSpcSerializedObject_DecodeAsn1)
+# define RTCrSpcSerializedPageHashesV2_DecodeAsn1 RT_MANGLER(RTCrSpcSerializedPageHashesV2_DecodeAsn1)
+# define RTCrSpcString_DecodeAsn1 RT_MANGLER(RTCrSpcString_DecodeAsn1)
+# define RTCrSpcAttributeTypeAndOptionalValue_Compare RT_MANGLER(RTCrSpcAttributeTypeAndOptionalValue_Compare)
+# define RTCrSpcAttributeTypeAndOptionalValue_Delete RT_MANGLER(RTCrSpcAttributeTypeAndOptionalValue_Delete)
+# define RTCrSpcAttributeTypeAndOptionalValue_Enum RT_MANGLER(RTCrSpcAttributeTypeAndOptionalValue_Enum)
+# define RTCrSpcIndirectDataContent_Compare RT_MANGLER(RTCrSpcIndirectDataContent_Compare)
+# define RTCrSpcIndirectDataContent_Delete RT_MANGLER(RTCrSpcIndirectDataContent_Delete)
+# define RTCrSpcIndirectDataContent_Enum RT_MANGLER(RTCrSpcIndirectDataContent_Enum)
+# define RTCrSpcIndirectDataContent_GetPeImageHashesV2 RT_MANGLER(RTCrSpcIndirectDataContent_GetPeImageHashesV2)
+# define RTCrSpcLink_Compare RT_MANGLER(RTCrSpcLink_Compare)
+# define RTCrSpcLink_Delete RT_MANGLER(RTCrSpcLink_Delete)
+# define RTCrSpcLink_Enum RT_MANGLER(RTCrSpcLink_Enum)
+# define RTCrSpcPeImageData_Compare RT_MANGLER(RTCrSpcPeImageData_Compare)
+# define RTCrSpcPeImageData_Delete RT_MANGLER(RTCrSpcPeImageData_Delete)
+# define RTCrSpcPeImageData_Enum RT_MANGLER(RTCrSpcPeImageData_Enum)
+# define RTCrSpcSerializedObjectAttribute_Compare RT_MANGLER(RTCrSpcSerializedObjectAttribute_Compare)
+# define RTCrSpcSerializedObjectAttribute_Delete RT_MANGLER(RTCrSpcSerializedObjectAttribute_Delete)
+# define RTCrSpcSerializedObjectAttribute_Enum RT_MANGLER(RTCrSpcSerializedObjectAttribute_Enum)
+# define RTCrSpcSerializedObjectAttributes_Compare RT_MANGLER(RTCrSpcSerializedObjectAttributes_Compare)
+# define RTCrSpcSerializedObjectAttributes_Delete RT_MANGLER(RTCrSpcSerializedObjectAttributes_Delete)
+# define RTCrSpcSerializedObjectAttributes_Enum RT_MANGLER(RTCrSpcSerializedObjectAttributes_Enum)
+# define RTCrSpcSerializedObject_Compare RT_MANGLER(RTCrSpcSerializedObject_Compare)
+# define RTCrSpcSerializedObject_Delete RT_MANGLER(RTCrSpcSerializedObject_Delete)
+# define RTCrSpcSerializedObject_Enum RT_MANGLER(RTCrSpcSerializedObject_Enum)
+# define RTCrSpcSerializedPageHashesV2_Compare RT_MANGLER(RTCrSpcSerializedPageHashesV2_Compare)
+# define RTCrSpcSerializedPageHashesV2_Delete RT_MANGLER(RTCrSpcSerializedPageHashesV2_Delete)
+# define RTCrSpcSerializedPageHashesV2_Enum RT_MANGLER(RTCrSpcSerializedPageHashesV2_Enum)
+# define RTCrSpcSerializedPageHashesV2_UpdateDerivedData RT_MANGLER(RTCrSpcSerializedPageHashesV2_UpdateDerivedData)
+# define RTCrSpcString_Compare RT_MANGLER(RTCrSpcString_Compare)
+# define RTCrSpcString_Delete RT_MANGLER(RTCrSpcString_Delete)
+# define RTCrSpcString_Enum RT_MANGLER(RTCrSpcString_Enum)
+# define RTCrSpcAttributeTypeAndOptionalValue_Clone RT_MANGLER(RTCrSpcAttributeTypeAndOptionalValue_Clone)
+# define RTCrSpcAttributeTypeAndOptionalValue_Init RT_MANGLER(RTCrSpcAttributeTypeAndOptionalValue_Init)
+# define RTCrSpcIndirectDataContent_Clone RT_MANGLER(RTCrSpcIndirectDataContent_Clone)
+# define RTCrSpcIndirectDataContent_Init RT_MANGLER(RTCrSpcIndirectDataContent_Init)
+# define RTCrSpcLink_Clone RT_MANGLER(RTCrSpcLink_Clone)
+# define RTCrSpcLink_Init RT_MANGLER(RTCrSpcLink_Init)
+# define RTCrSpcPeImageData_Clone RT_MANGLER(RTCrSpcPeImageData_Clone)
+# define RTCrSpcPeImageData_Init RT_MANGLER(RTCrSpcPeImageData_Init)
+# define RTCrSpcSerializedObjectAttribute_Clone RT_MANGLER(RTCrSpcSerializedObjectAttribute_Clone)
+# define RTCrSpcSerializedObjectAttribute_Init RT_MANGLER(RTCrSpcSerializedObjectAttribute_Init)
+# define RTCrSpcSerializedObjectAttributes_Clone RT_MANGLER(RTCrSpcSerializedObjectAttributes_Clone)
+# define RTCrSpcSerializedObjectAttributes_Init RT_MANGLER(RTCrSpcSerializedObjectAttributes_Init)
+# define RTCrSpcSerializedObject_Clone RT_MANGLER(RTCrSpcSerializedObject_Clone)
+# define RTCrSpcSerializedObject_Init RT_MANGLER(RTCrSpcSerializedObject_Init)
+# define RTCrSpcSerializedPageHashesV2_Clone RT_MANGLER(RTCrSpcSerializedPageHashesV2_Clone)
+# define RTCrSpcSerializedPageHashesV2_Init RT_MANGLER(RTCrSpcSerializedPageHashesV2_Init)
+# define RTCrSpcString_Clone RT_MANGLER(RTCrSpcString_Clone)
+# define RTCrSpcString_Init RT_MANGLER(RTCrSpcString_Init)
+# define RTCrSpcAttributeTypeAndOptionalValue_CheckSanity RT_MANGLER(RTCrSpcAttributeTypeAndOptionalValue_CheckSanity)
+# define RTCrSpcIndirectDataContent_CheckSanity RT_MANGLER(RTCrSpcIndirectDataContent_CheckSanity)
+# define RTCrSpcIndirectDataContent_CheckSanityEx RT_MANGLER(RTCrSpcIndirectDataContent_CheckSanityEx)
+# define RTCrSpcLink_CheckSanity RT_MANGLER(RTCrSpcLink_CheckSanity)
+# define RTCrSpcPeImageData_CheckSanity RT_MANGLER(RTCrSpcPeImageData_CheckSanity)
+# define RTCrSpcSerializedObjectAttribute_CheckSanity RT_MANGLER(RTCrSpcSerializedObjectAttribute_CheckSanity)
+# define RTCrSpcSerializedObjectAttributes_CheckSanity RT_MANGLER(RTCrSpcSerializedObjectAttributes_CheckSanity)
+# define RTCrSpcSerializedObject_CheckSanity RT_MANGLER(RTCrSpcSerializedObject_CheckSanity)
+# define RTCrSpcSerializedPageHashesV2_CheckSanity RT_MANGLER(RTCrSpcSerializedPageHashesV2_CheckSanity)
+# define RTCrSpcString_CheckSanity RT_MANGLER(RTCrSpcString_CheckSanity)
+# define RTCrX509AlgorithmIdentifier_DecodeAsn1 RT_MANGLER(RTCrX509AlgorithmIdentifier_DecodeAsn1)
+# define RTCrX509AlgorithmIdentifiers_DecodeAsn1 RT_MANGLER(RTCrX509AlgorithmIdentifiers_DecodeAsn1)
+# define RTCrX509AttributeTypeAndValue_DecodeAsn1 RT_MANGLER(RTCrX509AttributeTypeAndValue_DecodeAsn1)
+# define RTCrX509AttributeTypeAndValues_DecodeAsn1 RT_MANGLER(RTCrX509AttributeTypeAndValues_DecodeAsn1)
+# define RTCrX509AuthorityKeyIdentifier_DecodeAsn1 RT_MANGLER(RTCrX509AuthorityKeyIdentifier_DecodeAsn1)
+# define RTCrX509BasicConstraints_DecodeAsn1 RT_MANGLER(RTCrX509BasicConstraints_DecodeAsn1)
+# define RTCrX509CertificatePolicies_DecodeAsn1 RT_MANGLER(RTCrX509CertificatePolicies_DecodeAsn1)
+# define RTCrX509Certificate_DecodeAsn1 RT_MANGLER(RTCrX509Certificate_DecodeAsn1)
+# define RTCrX509Certificates_DecodeAsn1 RT_MANGLER(RTCrX509Certificates_DecodeAsn1)
+# define RTCrX509Extension_DecodeAsn1 RT_MANGLER(RTCrX509Extension_DecodeAsn1)
+# define RTCrX509Extension_ExtnValue_DecodeAsn1 RT_MANGLER(RTCrX509Extension_ExtnValue_DecodeAsn1)
+# define RTCrX509Extensions_DecodeAsn1 RT_MANGLER(RTCrX509Extensions_DecodeAsn1)
+# define RTCrX509GeneralName_DecodeAsn1 RT_MANGLER(RTCrX509GeneralName_DecodeAsn1)
+# define RTCrX509GeneralNames_DecodeAsn1 RT_MANGLER(RTCrX509GeneralNames_DecodeAsn1)
+# define RTCrX509GeneralSubtree_DecodeAsn1 RT_MANGLER(RTCrX509GeneralSubtree_DecodeAsn1)
+# define RTCrX509GeneralSubtrees_DecodeAsn1 RT_MANGLER(RTCrX509GeneralSubtrees_DecodeAsn1)
+# define RTCrX509NameConstraints_DecodeAsn1 RT_MANGLER(RTCrX509NameConstraints_DecodeAsn1)
+# define RTCrX509Name_DecodeAsn1 RT_MANGLER(RTCrX509Name_DecodeAsn1)
+# define RTCrX509OldAuthorityKeyIdentifier_DecodeAsn1 RT_MANGLER(RTCrX509OldAuthorityKeyIdentifier_DecodeAsn1)
+# define RTCrX509PolicyConstraints_DecodeAsn1 RT_MANGLER(RTCrX509PolicyConstraints_DecodeAsn1)
+# define RTCrX509PolicyInformation_DecodeAsn1 RT_MANGLER(RTCrX509PolicyInformation_DecodeAsn1)
+# define RTCrX509PolicyMapping_DecodeAsn1 RT_MANGLER(RTCrX509PolicyMapping_DecodeAsn1)
+# define RTCrX509PolicyMappings_DecodeAsn1 RT_MANGLER(RTCrX509PolicyMappings_DecodeAsn1)
+# define RTCrX509PolicyQualifierInfo_DecodeAsn1 RT_MANGLER(RTCrX509PolicyQualifierInfo_DecodeAsn1)
+# define RTCrX509PolicyQualifierInfos_DecodeAsn1 RT_MANGLER(RTCrX509PolicyQualifierInfos_DecodeAsn1)
+# define RTCrX509SubjectPublicKeyInfo_DecodeAsn1 RT_MANGLER(RTCrX509SubjectPublicKeyInfo_DecodeAsn1)
+# define RTCrX509TbsCertificate_DecodeAsn1 RT_MANGLER(RTCrX509TbsCertificate_DecodeAsn1)
+# define RTCrX509Validity_DecodeAsn1 RT_MANGLER(RTCrX509Validity_DecodeAsn1)
+# define RTCrX509CertPathsBuild RT_MANGLER(RTCrX509CertPathsBuild)
+# define RTCrX509CertPathsCreate RT_MANGLER(RTCrX509CertPathsCreate)
+# define RTCrX509CertPathsCreateEx RT_MANGLER(RTCrX509CertPathsCreateEx)
+# define RTCrX509CertPathsDumpAll RT_MANGLER(RTCrX509CertPathsDumpAll)
+# define RTCrX509CertPathsDumpOne RT_MANGLER(RTCrX509CertPathsDumpOne)
+# define RTCrX509CertPathsGetPathCount RT_MANGLER(RTCrX509CertPathsGetPathCount)
+# define RTCrX509CertPathsGetPathLength RT_MANGLER(RTCrX509CertPathsGetPathLength)
+# define RTCrX509CertPathsGetPathNodeCert RT_MANGLER(RTCrX509CertPathsGetPathNodeCert)
+# define RTCrX509CertPathsGetPathVerifyResult RT_MANGLER(RTCrX509CertPathsGetPathVerifyResult)
+# define RTCrX509CertPathsQueryPathInfo RT_MANGLER(RTCrX509CertPathsQueryPathInfo)
+# define RTCrX509CertPathsRelease RT_MANGLER(RTCrX509CertPathsRelease)
+# define RTCrX509CertPathsRetain RT_MANGLER(RTCrX509CertPathsRetain)
+# define RTCrX509CertPathsSetTrustedStore RT_MANGLER(RTCrX509CertPathsSetTrustedStore)
+# define RTCrX509CertPathsSetUntrustedArray RT_MANGLER(RTCrX509CertPathsSetUntrustedArray)
+# define RTCrX509CertPathsSetUntrustedStore RT_MANGLER(RTCrX509CertPathsSetUntrustedStore)
+# define RTCrX509CertPathsSetValidTime RT_MANGLER(RTCrX509CertPathsSetValidTime)
+# define RTCrX509CertPathsSetValidTimeSpec RT_MANGLER(RTCrX509CertPathsSetValidTimeSpec)
+# define RTCrX509CertPathsValidateAll RT_MANGLER(RTCrX509CertPathsValidateAll)
+# define RTCrX509CertPathsValidateOne RT_MANGLER(RTCrX509CertPathsValidateOne)
+# define RTCrX509AlgorithmIdentifier_Compare RT_MANGLER(RTCrX509AlgorithmIdentifier_Compare)
+# define RTCrX509AlgorithmIdentifier_CompareDigestAndEncryptedDigest RT_MANGLER(RTCrX509AlgorithmIdentifier_CompareDigestAndEncryptedDigest)
+# define RTCrX509AlgorithmIdentifier_CompareWithString RT_MANGLER(RTCrX509AlgorithmIdentifier_CompareWithString)
+# define RTCrX509AlgorithmIdentifier_Delete RT_MANGLER(RTCrX509AlgorithmIdentifier_Delete)
+# define RTCrX509AlgorithmIdentifier_Enum RT_MANGLER(RTCrX509AlgorithmIdentifier_Enum)
+# define RTCrX509AlgorithmIdentifier_QueryDigestSize RT_MANGLER(RTCrX509AlgorithmIdentifier_QueryDigestSize)
+# define RTCrX509AlgorithmIdentifier_QueryDigestType RT_MANGLER(RTCrX509AlgorithmIdentifier_QueryDigestType)
+# define RTCrX509AlgorithmIdentifiers_Compare RT_MANGLER(RTCrX509AlgorithmIdentifiers_Compare)
+# define RTCrX509AlgorithmIdentifiers_Delete RT_MANGLER(RTCrX509AlgorithmIdentifiers_Delete)
+# define RTCrX509AlgorithmIdentifiers_Enum RT_MANGLER(RTCrX509AlgorithmIdentifiers_Enum)
+# define RTCrX509AttributeTypeAndValue_Compare RT_MANGLER(RTCrX509AttributeTypeAndValue_Compare)
+# define RTCrX509AttributeTypeAndValue_Delete RT_MANGLER(RTCrX509AttributeTypeAndValue_Delete)
+# define RTCrX509AttributeTypeAndValue_Enum RT_MANGLER(RTCrX509AttributeTypeAndValue_Enum)
+# define RTCrX509AttributeTypeAndValues_Compare RT_MANGLER(RTCrX509AttributeTypeAndValues_Compare)
+# define RTCrX509AttributeTypeAndValues_Delete RT_MANGLER(RTCrX509AttributeTypeAndValues_Delete)
+# define RTCrX509AttributeTypeAndValues_Enum RT_MANGLER(RTCrX509AttributeTypeAndValues_Enum)
+# define RTCrX509AuthorityKeyIdentifier_Compare RT_MANGLER(RTCrX509AuthorityKeyIdentifier_Compare)
+# define RTCrX509AuthorityKeyIdentifier_Delete RT_MANGLER(RTCrX509AuthorityKeyIdentifier_Delete)
+# define RTCrX509AuthorityKeyIdentifier_Enum RT_MANGLER(RTCrX509AuthorityKeyIdentifier_Enum)
+# define RTCrX509BasicConstraints_Compare RT_MANGLER(RTCrX509BasicConstraints_Compare)
+# define RTCrX509BasicConstraints_Delete RT_MANGLER(RTCrX509BasicConstraints_Delete)
+# define RTCrX509BasicConstraints_Enum RT_MANGLER(RTCrX509BasicConstraints_Enum)
+# define RTCrX509CertificatePolicies_Compare RT_MANGLER(RTCrX509CertificatePolicies_Compare)
+# define RTCrX509CertificatePolicies_Delete RT_MANGLER(RTCrX509CertificatePolicies_Delete)
+# define RTCrX509CertificatePolicies_Enum RT_MANGLER(RTCrX509CertificatePolicies_Enum)
+# define RTCrX509Certificate_Compare RT_MANGLER(RTCrX509Certificate_Compare)
+# define RTCrX509Certificate_Delete RT_MANGLER(RTCrX509Certificate_Delete)
+# define RTCrX509Certificate_Enum RT_MANGLER(RTCrX509Certificate_Enum)
+# define RTCrX509Certificate_IsSelfSigned RT_MANGLER(RTCrX509Certificate_IsSelfSigned)
+# define RTCrX509Certificate_MatchIssuerAndSerialNumber RT_MANGLER(RTCrX509Certificate_MatchIssuerAndSerialNumber)
+# define RTCrX509Certificate_MatchSubjectOrAltSubjectByRfc5280 RT_MANGLER(RTCrX509Certificate_MatchSubjectOrAltSubjectByRfc5280)
+# define RTCrX509Certificates_Compare RT_MANGLER(RTCrX509Certificates_Compare)
+# define RTCrX509Certificates_Delete RT_MANGLER(RTCrX509Certificates_Delete)
+# define RTCrX509Certificates_Enum RT_MANGLER(RTCrX509Certificates_Enum)
+# define RTCrX509Certificates_FindByIssuerAndSerialNumber RT_MANGLER(RTCrX509Certificates_FindByIssuerAndSerialNumber)
+# define RTCrX509Extension_Compare RT_MANGLER(RTCrX509Extension_Compare)
+# define RTCrX509Extension_Delete RT_MANGLER(RTCrX509Extension_Delete)
+# define RTCrX509Extension_Enum RT_MANGLER(RTCrX509Extension_Enum)
+# define RTCrX509Extensions_Compare RT_MANGLER(RTCrX509Extensions_Compare)
+# define RTCrX509Extensions_Delete RT_MANGLER(RTCrX509Extensions_Delete)
+# define RTCrX509Extensions_Enum RT_MANGLER(RTCrX509Extensions_Enum)
+# define RTCrX509GeneralName_Compare RT_MANGLER(RTCrX509GeneralName_Compare)
+# define RTCrX509GeneralName_ConstraintMatch RT_MANGLER(RTCrX509GeneralName_ConstraintMatch)
+# define RTCrX509GeneralName_Delete RT_MANGLER(RTCrX509GeneralName_Delete)
+# define RTCrX509GeneralName_Enum RT_MANGLER(RTCrX509GeneralName_Enum)
+# define RTCrX509GeneralNames_Compare RT_MANGLER(RTCrX509GeneralNames_Compare)
+# define RTCrX509GeneralNames_Delete RT_MANGLER(RTCrX509GeneralNames_Delete)
+# define RTCrX509GeneralNames_Enum RT_MANGLER(RTCrX509GeneralNames_Enum)
+# define RTCrX509GeneralSubtree_Compare RT_MANGLER(RTCrX509GeneralSubtree_Compare)
+# define RTCrX509GeneralSubtree_ConstraintMatch RT_MANGLER(RTCrX509GeneralSubtree_ConstraintMatch)
+# define RTCrX509GeneralSubtree_Delete RT_MANGLER(RTCrX509GeneralSubtree_Delete)
+# define RTCrX509GeneralSubtree_Enum RT_MANGLER(RTCrX509GeneralSubtree_Enum)
+# define RTCrX509GeneralSubtrees_Compare RT_MANGLER(RTCrX509GeneralSubtrees_Compare)
+# define RTCrX509GeneralSubtrees_Delete RT_MANGLER(RTCrX509GeneralSubtrees_Delete)
+# define RTCrX509GeneralSubtrees_Enum RT_MANGLER(RTCrX509GeneralSubtrees_Enum)
+# define RTCrX509NameConstraints_Compare RT_MANGLER(RTCrX509NameConstraints_Compare)
+# define RTCrX509NameConstraints_Delete RT_MANGLER(RTCrX509NameConstraints_Delete)
+# define RTCrX509NameConstraints_Enum RT_MANGLER(RTCrX509NameConstraints_Enum)
+# define RTCrX509Name_Compare RT_MANGLER(RTCrX509Name_Compare)
+# define RTCrX509Name_ConstraintMatch RT_MANGLER(RTCrX509Name_ConstraintMatch)
+# define RTCrX509Name_Delete RT_MANGLER(RTCrX509Name_Delete)
+# define RTCrX509Name_Enum RT_MANGLER(RTCrX509Name_Enum)
+# define RTCrX509Name_FormatAsString RT_MANGLER(RTCrX509Name_FormatAsString)
+# define RTCrX509Name_MatchByRfc5280 RT_MANGLER(RTCrX509Name_MatchByRfc5280)
+# define RTCrX509Name_MatchWithString RT_MANGLER(RTCrX509Name_MatchWithString)
+# define RTCrX509OldAuthorityKeyIdentifier_Compare RT_MANGLER(RTCrX509OldAuthorityKeyIdentifier_Compare)
+# define RTCrX509OldAuthorityKeyIdentifier_Delete RT_MANGLER(RTCrX509OldAuthorityKeyIdentifier_Delete)
+# define RTCrX509OldAuthorityKeyIdentifier_Enum RT_MANGLER(RTCrX509OldAuthorityKeyIdentifier_Enum)
+# define RTCrX509PolicyConstraints_Compare RT_MANGLER(RTCrX509PolicyConstraints_Compare)
+# define RTCrX509PolicyConstraints_Delete RT_MANGLER(RTCrX509PolicyConstraints_Delete)
+# define RTCrX509PolicyConstraints_Enum RT_MANGLER(RTCrX509PolicyConstraints_Enum)
+# define RTCrX509PolicyInformation_Compare RT_MANGLER(RTCrX509PolicyInformation_Compare)
+# define RTCrX509PolicyInformation_Delete RT_MANGLER(RTCrX509PolicyInformation_Delete)
+# define RTCrX509PolicyInformation_Enum RT_MANGLER(RTCrX509PolicyInformation_Enum)
+# define RTCrX509PolicyMapping_Compare RT_MANGLER(RTCrX509PolicyMapping_Compare)
+# define RTCrX509PolicyMapping_Delete RT_MANGLER(RTCrX509PolicyMapping_Delete)
+# define RTCrX509PolicyMapping_Enum RT_MANGLER(RTCrX509PolicyMapping_Enum)
+# define RTCrX509PolicyMappings_Compare RT_MANGLER(RTCrX509PolicyMappings_Compare)
+# define RTCrX509PolicyMappings_Delete RT_MANGLER(RTCrX509PolicyMappings_Delete)
+# define RTCrX509PolicyMappings_Enum RT_MANGLER(RTCrX509PolicyMappings_Enum)
+# define RTCrX509PolicyQualifierInfo_Compare RT_MANGLER(RTCrX509PolicyQualifierInfo_Compare)
+# define RTCrX509PolicyQualifierInfo_Delete RT_MANGLER(RTCrX509PolicyQualifierInfo_Delete)
+# define RTCrX509PolicyQualifierInfo_Enum RT_MANGLER(RTCrX509PolicyQualifierInfo_Enum)
+# define RTCrX509PolicyQualifierInfos_Compare RT_MANGLER(RTCrX509PolicyQualifierInfos_Compare)
+# define RTCrX509PolicyQualifierInfos_Delete RT_MANGLER(RTCrX509PolicyQualifierInfos_Delete)
+# define RTCrX509PolicyQualifierInfos_Enum RT_MANGLER(RTCrX509PolicyQualifierInfos_Enum)
+# define RTCrX509SubjectPublicKeyInfo_Compare RT_MANGLER(RTCrX509SubjectPublicKeyInfo_Compare)
+# define RTCrX509SubjectPublicKeyInfo_Delete RT_MANGLER(RTCrX509SubjectPublicKeyInfo_Delete)
+# define RTCrX509SubjectPublicKeyInfo_Enum RT_MANGLER(RTCrX509SubjectPublicKeyInfo_Enum)
+# define RTCrX509TbsCertificate_Compare RT_MANGLER(RTCrX509TbsCertificate_Compare)
+# define RTCrX509TbsCertificate_Delete RT_MANGLER(RTCrX509TbsCertificate_Delete)
+# define RTCrX509TbsCertificate_Enum RT_MANGLER(RTCrX509TbsCertificate_Enum)
+# define RTCrX509TbsCertificate_ReprocessExtensions RT_MANGLER(RTCrX509TbsCertificate_ReprocessExtensions)
+# define RTCrX509Validity_Compare RT_MANGLER(RTCrX509Validity_Compare)
+# define RTCrX509Validity_Delete RT_MANGLER(RTCrX509Validity_Delete)
+# define RTCrX509Validity_Enum RT_MANGLER(RTCrX509Validity_Enum)
+# define RTCrX509Validity_IsValidAtTimeSpec RT_MANGLER(RTCrX509Validity_IsValidAtTimeSpec)
+# define RTCrX509Certificate_ReadFromFile RT_MANGLER(RTCrX509Certificate_ReadFromFile)
+# define RTCrX509AlgorithmIdentifier_Clone RT_MANGLER(RTCrX509AlgorithmIdentifier_Clone)
+# define RTCrX509AlgorithmIdentifier_Init RT_MANGLER(RTCrX509AlgorithmIdentifier_Init)
+# define RTCrX509AlgorithmIdentifiers_Clone RT_MANGLER(RTCrX509AlgorithmIdentifiers_Clone)
+# define RTCrX509AlgorithmIdentifiers_Init RT_MANGLER(RTCrX509AlgorithmIdentifiers_Init)
+# define RTCrX509AttributeTypeAndValue_Clone RT_MANGLER(RTCrX509AttributeTypeAndValue_Clone)
+# define RTCrX509AttributeTypeAndValue_Init RT_MANGLER(RTCrX509AttributeTypeAndValue_Init)
+# define RTCrX509AttributeTypeAndValues_Clone RT_MANGLER(RTCrX509AttributeTypeAndValues_Clone)
+# define RTCrX509AttributeTypeAndValues_Init RT_MANGLER(RTCrX509AttributeTypeAndValues_Init)
+# define RTCrX509AuthorityKeyIdentifier_Clone RT_MANGLER(RTCrX509AuthorityKeyIdentifier_Clone)
+# define RTCrX509AuthorityKeyIdentifier_Init RT_MANGLER(RTCrX509AuthorityKeyIdentifier_Init)
+# define RTCrX509BasicConstraints_Clone RT_MANGLER(RTCrX509BasicConstraints_Clone)
+# define RTCrX509BasicConstraints_Init RT_MANGLER(RTCrX509BasicConstraints_Init)
+# define RTCrX509CertificatePolicies_Clone RT_MANGLER(RTCrX509CertificatePolicies_Clone)
+# define RTCrX509CertificatePolicies_Init RT_MANGLER(RTCrX509CertificatePolicies_Init)
+# define RTCrX509Certificate_Clone RT_MANGLER(RTCrX509Certificate_Clone)
+# define RTCrX509Certificate_Init RT_MANGLER(RTCrX509Certificate_Init)
+# define RTCrX509Certificates_Clone RT_MANGLER(RTCrX509Certificates_Clone)
+# define RTCrX509Certificates_Init RT_MANGLER(RTCrX509Certificates_Init)
+# define RTCrX509Extension_Clone RT_MANGLER(RTCrX509Extension_Clone)
+# define RTCrX509Extension_Init RT_MANGLER(RTCrX509Extension_Init)
+# define RTCrX509Extensions_Clone RT_MANGLER(RTCrX509Extensions_Clone)
+# define RTCrX509Extensions_Init RT_MANGLER(RTCrX509Extensions_Init)
+# define RTCrX509GeneralName_Clone RT_MANGLER(RTCrX509GeneralName_Clone)
+# define RTCrX509GeneralName_Init RT_MANGLER(RTCrX509GeneralName_Init)
+# define RTCrX509GeneralNames_Clone RT_MANGLER(RTCrX509GeneralNames_Clone)
+# define RTCrX509GeneralNames_Init RT_MANGLER(RTCrX509GeneralNames_Init)
+# define RTCrX509GeneralSubtree_Clone RT_MANGLER(RTCrX509GeneralSubtree_Clone)
+# define RTCrX509GeneralSubtree_Init RT_MANGLER(RTCrX509GeneralSubtree_Init)
+# define RTCrX509GeneralSubtrees_Clone RT_MANGLER(RTCrX509GeneralSubtrees_Clone)
+# define RTCrX509GeneralSubtrees_Init RT_MANGLER(RTCrX509GeneralSubtrees_Init)
+# define RTCrX509NameConstraints_Clone RT_MANGLER(RTCrX509NameConstraints_Clone)
+# define RTCrX509NameConstraints_Init RT_MANGLER(RTCrX509NameConstraints_Init)
+# define RTCrX509Name_Clone RT_MANGLER(RTCrX509Name_Clone)
+# define RTCrX509Name_Init RT_MANGLER(RTCrX509Name_Init)
+# define RTCrX509Name_RecodeAsUtf8 RT_MANGLER(RTCrX509Name_RecodeAsUtf8)
+# define RTCrX509OldAuthorityKeyIdentifier_Clone RT_MANGLER(RTCrX509OldAuthorityKeyIdentifier_Clone)
+# define RTCrX509OldAuthorityKeyIdentifier_Init RT_MANGLER(RTCrX509OldAuthorityKeyIdentifier_Init)
+# define RTCrX509PolicyConstraints_Clone RT_MANGLER(RTCrX509PolicyConstraints_Clone)
+# define RTCrX509PolicyConstraints_Init RT_MANGLER(RTCrX509PolicyConstraints_Init)
+# define RTCrX509PolicyInformation_Clone RT_MANGLER(RTCrX509PolicyInformation_Clone)
+# define RTCrX509PolicyInformation_Init RT_MANGLER(RTCrX509PolicyInformation_Init)
+# define RTCrX509PolicyMapping_Clone RT_MANGLER(RTCrX509PolicyMapping_Clone)
+# define RTCrX509PolicyMapping_Init RT_MANGLER(RTCrX509PolicyMapping_Init)
+# define RTCrX509PolicyMappings_Clone RT_MANGLER(RTCrX509PolicyMappings_Clone)
+# define RTCrX509PolicyMappings_Init RT_MANGLER(RTCrX509PolicyMappings_Init)
+# define RTCrX509PolicyQualifierInfo_Clone RT_MANGLER(RTCrX509PolicyQualifierInfo_Clone)
+# define RTCrX509PolicyQualifierInfo_Init RT_MANGLER(RTCrX509PolicyQualifierInfo_Init)
+# define RTCrX509PolicyQualifierInfos_Clone RT_MANGLER(RTCrX509PolicyQualifierInfos_Clone)
+# define RTCrX509PolicyQualifierInfos_Init RT_MANGLER(RTCrX509PolicyQualifierInfos_Init)
+# define RTCrX509SubjectPublicKeyInfo_Clone RT_MANGLER(RTCrX509SubjectPublicKeyInfo_Clone)
+# define RTCrX509SubjectPublicKeyInfo_Init RT_MANGLER(RTCrX509SubjectPublicKeyInfo_Init)
+# define RTCrX509TbsCertificate_Clone RT_MANGLER(RTCrX509TbsCertificate_Clone)
+# define RTCrX509TbsCertificate_Init RT_MANGLER(RTCrX509TbsCertificate_Init)
+# define RTCrX509Validity_Clone RT_MANGLER(RTCrX509Validity_Clone)
+# define RTCrX509Validity_Init RT_MANGLER(RTCrX509Validity_Init)
+# define RTCrX509AlgorithmIdentifier_CheckSanity RT_MANGLER(RTCrX509AlgorithmIdentifier_CheckSanity)
+# define RTCrX509AlgorithmIdentifiers_CheckSanity RT_MANGLER(RTCrX509AlgorithmIdentifiers_CheckSanity)
+# define RTCrX509AttributeTypeAndValue_CheckSanity RT_MANGLER(RTCrX509AttributeTypeAndValue_CheckSanity)
+# define RTCrX509AttributeTypeAndValues_CheckSanity RT_MANGLER(RTCrX509AttributeTypeAndValues_CheckSanity)
+# define RTCrX509AuthorityKeyIdentifier_CheckSanity RT_MANGLER(RTCrX509AuthorityKeyIdentifier_CheckSanity)
+# define RTCrX509BasicConstraints_CheckSanity RT_MANGLER(RTCrX509BasicConstraints_CheckSanity)
+# define RTCrX509CertificatePolicies_CheckSanity RT_MANGLER(RTCrX509CertificatePolicies_CheckSanity)
+# define RTCrX509Certificate_CheckSanity RT_MANGLER(RTCrX509Certificate_CheckSanity)
+# define RTCrX509Certificates_CheckSanity RT_MANGLER(RTCrX509Certificates_CheckSanity)
+# define RTCrX509Extension_CheckSanity RT_MANGLER(RTCrX509Extension_CheckSanity)
+# define RTCrX509Extensions_CheckSanity RT_MANGLER(RTCrX509Extensions_CheckSanity)
+# define RTCrX509GeneralName_CheckSanity RT_MANGLER(RTCrX509GeneralName_CheckSanity)
+# define RTCrX509GeneralNames_CheckSanity RT_MANGLER(RTCrX509GeneralNames_CheckSanity)
+# define RTCrX509GeneralSubtree_CheckSanity RT_MANGLER(RTCrX509GeneralSubtree_CheckSanity)
+# define RTCrX509GeneralSubtrees_CheckSanity RT_MANGLER(RTCrX509GeneralSubtrees_CheckSanity)
+# define RTCrX509NameConstraints_CheckSanity RT_MANGLER(RTCrX509NameConstraints_CheckSanity)
+# define RTCrX509Name_CheckSanity RT_MANGLER(RTCrX509Name_CheckSanity)
+# define RTCrX509OldAuthorityKeyIdentifier_CheckSanity RT_MANGLER(RTCrX509OldAuthorityKeyIdentifier_CheckSanity)
+# define RTCrX509PolicyConstraints_CheckSanity RT_MANGLER(RTCrX509PolicyConstraints_CheckSanity)
+# define RTCrX509PolicyInformation_CheckSanity RT_MANGLER(RTCrX509PolicyInformation_CheckSanity)
+# define RTCrX509PolicyMapping_CheckSanity RT_MANGLER(RTCrX509PolicyMapping_CheckSanity)
+# define RTCrX509PolicyMappings_CheckSanity RT_MANGLER(RTCrX509PolicyMappings_CheckSanity)
+# define RTCrX509PolicyQualifierInfo_CheckSanity RT_MANGLER(RTCrX509PolicyQualifierInfo_CheckSanity)
+# define RTCrX509PolicyQualifierInfos_CheckSanity RT_MANGLER(RTCrX509PolicyQualifierInfos_CheckSanity)
+# define RTCrX509SubjectPublicKeyInfo_CheckSanity RT_MANGLER(RTCrX509SubjectPublicKeyInfo_CheckSanity)
+# define RTCrX509TbsCertificate_CheckSanity RT_MANGLER(RTCrX509TbsCertificate_CheckSanity)
+# define RTCrX509Validity_CheckSanity RT_MANGLER(RTCrX509Validity_CheckSanity)
+# define RTCrX509Certificate_VerifySignature RT_MANGLER(RTCrX509Certificate_VerifySignature)
+# define RTCrTafCertPathControls_DecodeAsn1 RT_MANGLER(RTCrTafCertPathControls_DecodeAsn1)
+# define RTCrTafTrustAnchorChoice_DecodeAsn1 RT_MANGLER(RTCrTafTrustAnchorChoice_DecodeAsn1)
+# define RTCrTafTrustAnchorInfo_DecodeAsn1 RT_MANGLER(RTCrTafTrustAnchorInfo_DecodeAsn1)
+# define RTCrTafTrustAnchorList_DecodeAsn1 RT_MANGLER(RTCrTafTrustAnchorList_DecodeAsn1)
+# define RTCrTafCertPathControls_Compare RT_MANGLER(RTCrTafCertPathControls_Compare)
+# define RTCrTafCertPathControls_Delete RT_MANGLER(RTCrTafCertPathControls_Delete)
+# define RTCrTafCertPathControls_Enum RT_MANGLER(RTCrTafCertPathControls_Enum)
+# define RTCrTafTrustAnchorChoice_Compare RT_MANGLER(RTCrTafTrustAnchorChoice_Compare)
+# define RTCrTafTrustAnchorChoice_Delete RT_MANGLER(RTCrTafTrustAnchorChoice_Delete)
+# define RTCrTafTrustAnchorChoice_Enum RT_MANGLER(RTCrTafTrustAnchorChoice_Enum)
+# define RTCrTafTrustAnchorInfo_Compare RT_MANGLER(RTCrTafTrustAnchorInfo_Compare)
+# define RTCrTafTrustAnchorInfo_Delete RT_MANGLER(RTCrTafTrustAnchorInfo_Delete)
+# define RTCrTafTrustAnchorInfo_Enum RT_MANGLER(RTCrTafTrustAnchorInfo_Enum)
+# define RTCrTafTrustAnchorList_Compare RT_MANGLER(RTCrTafTrustAnchorList_Compare)
+# define RTCrTafTrustAnchorList_Delete RT_MANGLER(RTCrTafTrustAnchorList_Delete)
+# define RTCrTafTrustAnchorList_Enum RT_MANGLER(RTCrTafTrustAnchorList_Enum)
+# define RTCrTafCertPathControls_Clone RT_MANGLER(RTCrTafCertPathControls_Clone)
+# define RTCrTafCertPathControls_Init RT_MANGLER(RTCrTafCertPathControls_Init)
+# define RTCrTafTrustAnchorChoice_Clone RT_MANGLER(RTCrTafTrustAnchorChoice_Clone)
+# define RTCrTafTrustAnchorChoice_Init RT_MANGLER(RTCrTafTrustAnchorChoice_Init)
+# define RTCrTafTrustAnchorInfo_Clone RT_MANGLER(RTCrTafTrustAnchorInfo_Clone)
+# define RTCrTafTrustAnchorInfo_Init RT_MANGLER(RTCrTafTrustAnchorInfo_Init)
+# define RTCrTafTrustAnchorList_Clone RT_MANGLER(RTCrTafTrustAnchorList_Clone)
+# define RTCrTafTrustAnchorList_Init RT_MANGLER(RTCrTafTrustAnchorList_Init)
+# define RTCrTafCertPathControls_CheckSanity RT_MANGLER(RTCrTafCertPathControls_CheckSanity)
+# define RTCrTafTrustAnchorChoice_CheckSanity RT_MANGLER(RTCrTafTrustAnchorChoice_CheckSanity)
+# define RTCrTafTrustAnchorInfo_CheckSanity RT_MANGLER(RTCrTafTrustAnchorInfo_CheckSanity)
+# define RTCrTafTrustAnchorList_CheckSanity RT_MANGLER(RTCrTafTrustAnchorList_CheckSanity)
+# define RTCrCertCtxRelease RT_MANGLER(RTCrCertCtxRelease)
+# define RTCrCertCtxRetain RT_MANGLER(RTCrCertCtxRetain)
+# define RTCrStoreCertAddEncoded RT_MANGLER(RTCrStoreCertAddEncoded)
+# define RTCrStoreCertByIssuerAndSerialNo RT_MANGLER(RTCrStoreCertByIssuerAndSerialNo)
+# define RTCrStoreCertFindAll RT_MANGLER(RTCrStoreCertFindAll)
+# define RTCrStoreCertFindBySubjectOrAltSubjectByRfc5280 RT_MANGLER(RTCrStoreCertFindBySubjectOrAltSubjectByRfc5280)
+# define RTCrStoreCertSearchDestroy RT_MANGLER(RTCrStoreCertSearchDestroy)
+# define RTCrStoreCertSearchNext RT_MANGLER(RTCrStoreCertSearchNext)
+# define RTCrStoreConvertToOpenSslCertStack RT_MANGLER(RTCrStoreConvertToOpenSslCertStack)
+# define RTCrStoreConvertToOpenSslCertStore RT_MANGLER(RTCrStoreConvertToOpenSslCertStore)
+# define RTCrStoreRelease RT_MANGLER(RTCrStoreRelease)
+# define RTCrStoreRetain RT_MANGLER(RTCrStoreRetain)
+# define RTCrStoreCreateInMem RT_MANGLER(RTCrStoreCreateInMem)
+# define RTCrStoreCertAddFromFile RT_MANGLER(RTCrStoreCertAddFromFile)
+# define RTErrInfoAdd RT_MANGLER(RTErrInfoAdd)
+# define RTErrInfoAddF RT_MANGLER(RTErrInfoAddF)
+# define RTErrInfoAddV RT_MANGLER(RTErrInfoAddV)
+# define RTLdrHashImage RT_MANGLER(RTLdrHashImage)
+# define RTLdrOpenWithReader RT_MANGLER(RTLdrOpenWithReader)
+# define RTLdrQueryPropEx RT_MANGLER(RTLdrQueryPropEx)
+# define RTLdrVerifySignature RT_MANGLER(RTLdrVerifySignature)
+# define RTBigNumAdd RT_MANGLER(RTBigNumAdd)
+# define RTBigNumAssign RT_MANGLER(RTBigNumAssign)
+# define RTBigNumBitWidth RT_MANGLER(RTBigNumBitWidth)
+# define RTBigNumByteWidth RT_MANGLER(RTBigNumByteWidth)
+# define RTBigNumClone RT_MANGLER(RTBigNumClone)
+# define RTBigNumCompare RT_MANGLER(RTBigNumCompare)
+# define RTBigNumCompareWithS64 RT_MANGLER(RTBigNumCompareWithS64)
+# define RTBigNumCompareWithU64 RT_MANGLER(RTBigNumCompareWithU64)
+# define RTBigNumDestroy RT_MANGLER(RTBigNumDestroy)
+# define RTBigNumDivide RT_MANGLER(RTBigNumDivide)
+# define RTBigNumExponentiate RT_MANGLER(RTBigNumExponentiate)
+# define RTBigNumInit RT_MANGLER(RTBigNumInit)
+# define RTBigNumInitZero RT_MANGLER(RTBigNumInitZero)
+# define RTBigNumModExp RT_MANGLER(RTBigNumModExp)
+# define RTBigNumModulo RT_MANGLER(RTBigNumModulo)
+# define RTBigNumMultiply RT_MANGLER(RTBigNumMultiply)
+# define RTBigNumNegate RT_MANGLER(RTBigNumNegate)
+# define RTBigNumNegateThis RT_MANGLER(RTBigNumNegateThis)
+# define RTBigNumSubtract RT_MANGLER(RTBigNumSubtract)
+# define RTBigNumToBytesBigEndian RT_MANGLER(RTBigNumToBytesBigEndian)
+# define RTUtf16Copy RT_MANGLER(RTUtf16Copy)
+# define RTUtf16CopyAscii RT_MANGLER(RTUtf16CopyAscii)
+# define RTUtf16Cat RT_MANGLER(RTUtf16Cat)
+# define RTUtf16CatAscii RT_MANGLER(RTUtf16CatAscii)
+# define RTUtf16End RT_MANGLER(RTUtf16End)
+# define RTUtf16ICmpAscii RT_MANGLER(RTUtf16ICmpAscii)
+# define RTUtf16NLen RT_MANGLER(RTUtf16NLen)
+# define RTUtf16NLenEx RT_MANGLER(RTUtf16NLenEx)
+# define RTUtf16PrintHexBytes RT_MANGLER(RTUtf16PrintHexBytes)
+# define RTMemSaferAllocZExTag RT_MANGLER(RTMemSaferAllocZExTag)
+# define RTMemSaferAllocZTag RT_MANGLER(RTMemSaferAllocZTag)
+# define RTMemSaferFree RT_MANGLER(RTMemSaferFree)
+# define RTMemSaferReallocZExTag RT_MANGLER(RTMemSaferReallocZExTag)
+# define RTMemSaferReallocZTag RT_MANGLER(RTMemSaferReallocZTag)
+# define RTMemSaferScramble RT_MANGLER(RTMemSaferScramble)
+# define RTMemSaferUnscramble RT_MANGLER(RTMemSaferUnscramble)
+# define RTErrConvertFromDarwin RT_MANGLER(RTErrConvertFromDarwin)
+# define RTErrConvertFromDarwinCOM RT_MANGLER(RTErrConvertFromDarwinCOM)
+# define RTErrConvertFromDarwinIO RT_MANGLER(RTErrConvertFromDarwinIO)
+# define RTErrConvertFromDarwinKern RT_MANGLER(RTErrConvertFromDarwinKern)
+# define RTErrConvertFromDarwin RT_MANGLER(RTErrConvertFromDarwin)
+# define RTErrConvertFromDarwinIO RT_MANGLER(RTErrConvertFromDarwinIO)
+# define RTErrConvertFromDarwinKern RT_MANGLER(RTErrConvertFromDarwinKern)
+
/*
* Stable variables (alphabetical order):
*/
@@ -1926,6 +2807,17 @@
# define g_szRTAssertMsg2 RT_MANGLER(g_szRTAssertMsg2)
# define g_u32RTAssertLine RT_MANGLER(g_u32RTAssertLine)
+/* sort/merge into the above later: */
+# define g_RTAsn1Time_Vtable RT_MANGLER(g_RTAsn1Time_Vtable)
+# define g_RTAsn1String_Vtable RT_MANGLER(g_RTAsn1String_Vtable)
+# define g_RTAsn1OctetString_Vtable RT_MANGLER(g_RTAsn1OctetString_Vtable)
+# define g_RTAsn1ObjId_Vtable RT_MANGLER(g_RTAsn1ObjId_Vtable)
+# define g_RTAsn1Null_Vtable RT_MANGLER(g_RTAsn1Null_Vtable)
+# define g_RTAsn1Integer_Vtable RT_MANGLER(g_RTAsn1Integer_Vtable)
+# define g_RTAsn1Core_Vtable RT_MANGLER(g_RTAsn1Core_Vtable)
+# define g_RTAsn1Boolean_Vtable RT_MANGLER(g_RTAsn1Boolean_Vtable)
+# define g_RTAsn1BitString_Vtable RT_MANGLER(g_RTAsn1BitString_Vtable)
+# define g_RTAsn1DefaultAllocator RT_MANGLER(g_RTAsn1DefaultAllocator)
/*
diff --git a/include/iprt/manifest.h b/include/iprt/manifest.h
index d40f601e733..f7a151792ba 100644
--- a/include/iprt/manifest.h
+++ b/include/iprt/manifest.h
@@ -57,28 +57,6 @@ RT_C_DECLS_BEGIN
#define RTMANIFEST_ATTR_ANY UINT32_C(0xffffffff)
/** @} */
-/** @name Digest types. */
-typedef enum RTDIGESTTYPE
-{
- /** Invalid digest value. */
- RTDIGESTTYPE_INVALID = 0,
- /** CRC32 checksum. */
- RTDIGESTTYPE_CRC32,
- /** CRC64 checksum. */
- RTDIGESTTYPE_CRC64,
- /** MD5 checksum (unsafe!). */
- RTDIGESTTYPE_MD5,
- /** SHA1 checksum (unsafe!). */
- RTDIGESTTYPE_SHA1,
- /** SHA256 checksum. */
- RTDIGESTTYPE_SHA256,
- /** SHA512 checksum. */
- RTDIGESTTYPE_SHA512,
- /** Usual 32-bit type blowup. */
- RTDIGESTTYPE_32BIT_HACK = 0x7fffffff
-} RTDIGESTTYPE;
-/** @} */
-
/**
* Creates an empty manifest.
diff --git a/include/iprt/md2.h b/include/iprt/md2.h
new file mode 100644
index 00000000000..2020b967ca0
--- /dev/null
+++ b/include/iprt/md2.h
@@ -0,0 +1,123 @@
+/** @file
+ * IPRT - Message-Digest Algorithm 2.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+#ifndef ___iprt_md2_h
+#define ___iprt_md2_h
+
+#include <iprt/types.h>
+
+RT_C_DECLS_BEGIN
+
+/** @defgroup grp_rt_md2 RTMd2 - Message-Digest algorithm 2
+ * @ingroup grp_rt
+ * @{
+ */
+
+/** Size of a MD2 hash. */
+#define RTMD2_HASH_SIZE 16
+/** The length of a MD2 digest string. The terminator is not included. */
+#define RTMD2_DIGEST_LEN 32
+
+/**
+ * MD2 hash algorithm context.
+ */
+typedef union RTMD2CONTEXT
+{
+ uint64_t u64BetterAlignment;
+ uint8_t abPadding[4 + 16 + 16*4 + 16*4];
+#ifdef RT_MD2_PRIVATE_CONTEXT
+ MD2_CTX Private;
+#endif
+} RTMD2CONTEXT;
+
+/** Pointer to MD2 hash algorithm context. */
+typedef RTMD2CONTEXT *PRTMD2CONTEXT;
+
+
+/**
+ * Compute the MD2 hash of the data.
+ *
+ * @param pvBuf Pointer to data.
+ * @param cbBuf Length of data (in bytes).
+ * @param pabDigest Where to store the hash.
+ * (What's passed is a pointer to the caller's buffer.)
+ */
+RTDECL(void) RTMd2(const void *pvBuf, size_t cbBuf, uint8_t pabDigest[RTMD2_HASH_SIZE]);
+
+/**
+ * Initialize MD2 context.
+ *
+ * @param pCtx Pointer to the MD2 context to initialize.
+ */
+RTDECL(void) RTMd2Init(PRTMD2CONTEXT pCtx);
+
+/**
+ * Feed data into the MD2 computation.
+ *
+ * @param pCtx Pointer to the MD2 context.
+ * @param pvBuf Pointer to data.
+ * @param cbBuf Length of data (in bytes).
+ */
+RTDECL(void) RTMd2Update(PRTMD2CONTEXT pCtx, const void *pvBuf, size_t cbBuf);
+
+/**
+ * Compute the MD2 hash of the data.
+ *
+ * @param pCtx Pointer to the MD2 context.
+ * @param pabDigest Where to store the hash. (What's passed is a pointer to
+ * the caller's buffer.)
+ */
+RTDECL(void) RTMd2Final(PRTMD2CONTEXT pCtx, uint8_t pabDigest[RTMD2_HASH_SIZE]);
+
+/**
+ * Converts a MD2 hash to a digest string.
+ *
+ * @returns IPRT status code.
+ *
+ * @param pabDigest The binary digest returned by RTMd2Final or RTMd2.
+ * @param pszDigest Where to return the stringified digest.
+ * @param cchDigest The size of the output buffer. Should be at least
+ * RTMD2_STRING_LEN + 1 bytes.
+ */
+RTDECL(int) RTMd2ToString(uint8_t const pabDigest[RTMD2_HASH_SIZE], char *pszDigest, size_t cchDigest);
+
+/**
+ * Converts a MD2 hash to a digest string.
+ *
+ * @returns IPRT status code.
+ *
+ * @param pszDigest The stringified digest. Leading and trailing spaces are
+ * ignored.
+ * @param pabDigest Where to store the hash. (What is passed is a pointer to
+ * the caller's buffer.)
+ */
+RTDECL(int) RTMd2FromString(char const *pszDigest, uint8_t pabDigest[RTMD2_HASH_SIZE]);
+
+/** @} */
+
+RT_C_DECLS_END
+
+#endif
+
diff --git a/include/iprt/memsafer.h b/include/iprt/memsafer.h
new file mode 100644
index 00000000000..7156e7bc10b
--- /dev/null
+++ b/include/iprt/memsafer.h
@@ -0,0 +1,226 @@
+/** @file
+ * IPRT - Memory Allocate for Sensitive Data.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+#ifndef ___iprt_memsafer_h
+#define ___iprt_memsafer_h
+
+#include <iprt/mem.h> /* RTMEM_TAG */
+
+RT_C_DECLS_BEGIN
+
+
+/** @defgroup grp_rt_memsafer RTMemSafer - Memory Allocator for Sensitive Data
+ * @ingroup grp_rt
+ *
+ * This API doesn't provide 100% secure storage, it only provider more secure
+ * and safer storage. Thus the API isn't called RTMemSafe because you cannot
+ * assume the data is safe against all kinds of extraction methods.
+ *
+ * The API guarantee that the memory won't be returned to the system containing
+ * any of the information you put there. It will be repeatedly wiped after use.
+ *
+ * The API tries to isolate your data from other information stored in the
+ * process/system. How well this is done depends on the implementation. The
+ * more complicated implementations will provide protection against heartbleed
+ * like bugs where pieces of the heap is copied onto the wire.
+ *
+ * The more hardened implementations of the API will also do their best to
+ * prevent the memory from ending up in process dumps or being readable by
+ * debuggers.
+ *
+ * Finally, two functions are provided for scrambling the sensitive memory while
+ * it's not in use.
+ *
+ * @{
+ */
+
+
+/**
+ * Scrambles memory allocated by RTMemSaferAllocZEx and associates after use.
+ *
+ * Call this when the sensitive data isn't actively being used. It will at a
+ * minimum make sure the data is slightly scrambled, how hard it is to unbutton
+ * is dependent on which implementation is used and available host support.
+ *
+ * The user must synchronize calls to RTMemSaferScramble and
+ * RTMemSaferUnscramble, this memory allocator provides no help and keeps no
+ * state information around.
+ *
+ * @returns IPRT status code.
+ * @param pv The pointer returned by the allocation function.
+ * @param cb The exact size given to the allocation function.
+ */
+RTDECL(int) RTMemSaferScramble(void *pv, size_t cb);
+
+/**
+ * Unscrambles memory allocated by RTMemSaferAllocZEx and associates before use.
+ *
+ * This undoes the effect of RTMemSaferScramble.
+ *
+ * @returns IPRT status code.
+ * @param pv The pointer returned by the allocation function.
+ * @param cb The exact size given to the allocation function.
+ */
+RTDECL(int) RTMemSaferUnscramble(void *pv, size_t cb);
+
+
+/**
+ * Allocates memory for sensitive data.
+ *
+ * Some effort will be taken to isolate the data from other memory allocation.
+ * Memory is always zeroed.
+ *
+ * @returns IPRT status code.
+ * @param ppvNew Where to return the pointer to the memory.
+ * @param cb Number of bytes to allocate.
+ * @param pszTag Allocation tag used for statistics and such.
+ */
+RTDECL(int) RTMemSaferAllocZExTag(void **ppvNew, size_t cb, const char *pszTag) RT_NO_THROW;
+
+/**
+ * Allocates memory for sensitive data.
+ *
+ * Some effort will be taken to isolate the data from other memory allocation.
+ * Memory is always zeroed.
+ *
+ * @returns IPRT status code.
+ * @param a_ppvNew Where to return the pointer to the memory.
+ * @param a_cb Number of bytes to allocate.
+ */
+#define RTMemSaferAllocZEx(a_ppvNew, a_cb) RTMemSaferAllocZExTag(a_ppvNew, a_cb, RTMEM_TAG)
+
+/**
+ * Allocates memory for sensitive data.
+ *
+ * Some effort will be taken to isolate the data from other memory allocation.
+ * Memory is always zeroed.
+ *
+ * @returns Pointer to the allocated memory.
+ * @param cb Number of bytes to allocate.
+ * @param pszTag Allocation tag used for statistics and such.
+ */
+RTDECL(void *) RTMemSaferAllocZTag(size_t cb, const char *pszTag) RT_NO_THROW;
+
+/**
+ * Allocates memory for sensitive data.
+ *
+ * Some effort will be taken to isolate the data from other memory allocation.
+ * Memory is always zeroed.
+ *
+ * @returns Pointer to the allocated memory.
+ * @param a_cb Number of bytes to allocate.
+ */
+#define RTMemSaferAllocZ(a_cb) RTMemSaferAllocZTag(a_cb, RTMEM_TAG)
+
+
+/**
+ * Reallocates memory allocated by RTMemSaferAllocZEx, RTMemSaferAllocZ,
+ * RTMemSaferAllocZExTag, or RTMemSaferAllocZTag.
+ *
+ * When extending the allocation, the new memory will be zeroed. When shrinking
+ * the allocation the left over memory will be wiped clean using
+ * RTMemWipeThorougly.
+ *
+ * The function follows the standard realloc behavior.
+ *
+ * @returns IPRT status code.
+ * @param cbOld The current allocation size.
+ * @param pvOld The current allocation.
+ * @param cbNew The size of the new allocation.
+ * @param ppvNew Where to return the pointer to the new memory.
+ * @param pszTag Allocation tag used for statistics and such.
+ */
+RTDECL(int) RTMemSaferReallocZExTag(size_t cbOld, void *pvOld, size_t cbNew, void **ppvNew, const char *pszTag) RT_NO_THROW;
+
+/**
+ * Reallocates memory allocated by RTMemSaferAllocZEx, RTMemSaferAllocZ,
+ * RTMemSaferAllocZExTag, or RTMemSaferAllocZTag.
+ *
+ * When extending the allocation, the new memory will be zeroed. When shrinking
+ * the allocation the left over memory will be wiped clean using
+ * RTMemWipeThorougly.
+ *
+ * The function follows the standard realloc behavior.
+ *
+ * @returns IPRT status code.
+ * @param a_cbOld The current allocation size.
+ * @param a_pvOld The current allocation.
+ * @param a_cbNew The size of the new allocation.
+ * @param a_ppvNew Where to return the pointer to the new memory.
+ */
+#define RTMemSaferReallocZEx(a_cbOld, a_pvOld, a_cbNew, a_ppvNew) \
+ RTMemSaferReallocZExTag(a_cbOld, a_pvOld, a_cbNew, a_ppvNew, RTMEM_TAG)
+
+/**
+ * Reallocates memory allocated by RTMemSaferAllocZ or RTMemSaferAllocZTag.
+ *
+ * When extending the allocation, the new memory will be zeroed. When shrinking
+ * the allocation the left over memory will be wiped clean using
+ * RTMemWipeThorougly.
+ *
+ * The function follows the standard realloc behavior.
+ *
+ * @returns Pointer to the allocated memory.
+ * @param cbOld The current allocation size.
+ * @param pvOld The current allocation.
+ * @param cbNew The size of the new allocation.
+ * @param pszTag Allocation tag used for statistics and such.
+ */
+RTDECL(void *) RTMemSaferReallocZTag(size_t cbOld, void *pvOld, size_t cbNew, const char *pszTag) RT_NO_THROW;
+
+/**
+ * Reallocates memory allocated by RTMemSaferAllocZ or RTMemSaferAllocZTag.
+ *
+ * When extending the allocation, the new memory will be zeroed. When shrinking
+ * the allocation the left over memory will be wiped clean using
+ * RTMemWipeThorougly.
+ *
+ * The function follows the standard realloc behavior.
+ *
+ * @returns Pointer to the allocated memory.
+ * @param a_cbOld The current allocation size.
+ * @param a_pvOld The current allocation.
+ * @param a_cbNew The size of the new allocation.
+ */
+#define RTMemSaferReallocZ(a_cbOld, a_pvOld, a_cbNew) RTMemSaferReallocZTag(a_cbOld, a_pvOld, a_cbNew, RTMEM_TAG)
+
+
+/**
+ * Frees memory allocated by RTMemSaferAllocZ* or RTMemSaferReallocZ*.
+ *
+ * Before freeing the allocated memory, it will be wiped clean using
+ * RTMemWipeThorougly.
+ *
+ * @returns Pointer to the allocated memory.
+ * @param pv The allocation.
+ * @param cb The allocation size.
+ */
+RTDECL(void) RTMemSaferFree(void *pv, size_t cb) RT_NO_THROW;
+
+/** @} */
+RT_C_DECLS_END
+
+#endif
+
diff --git a/include/iprt/nt/Makefile.kup b/include/iprt/nt/Makefile.kup
new file mode 100644
index 00000000000..e69de29bb2d
--- /dev/null
+++ b/include/iprt/nt/Makefile.kup
diff --git a/include/iprt/nt/nt.h b/include/iprt/nt/nt.h
index dfd34f03181..6488446e0dd 100644
--- a/include/iprt/nt/nt.h
+++ b/include/iprt/nt/nt.h
@@ -4,7 +4,7 @@
*/
/*
- * Copyright (C) 2010-2013 Oracle Corporation
+ * Copyright (C) 2010-2014 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
@@ -27,23 +27,157 @@
#ifndef ___iprt_nt_nt_h___
#define ___iprt_nt_nt_h___
+/** @def IPRT_NT_MAP_TO_ZW
+ * Map Nt calls to Zw calls. In ring-0 the Zw calls let you pass kernel memory
+ * to the APIs (takes care of the previous context checks).
+ */
+#ifdef DOXYGEN_RUNNING
+# define IPRT_NT_MAP_TO_ZW
+#endif
+
+#ifdef IPRT_NT_MAP_TO_ZW
+# define NtQueryInformationFile ZwQueryInformationFile
+# define NtQueryInformationProcess ZwQueryInformationProcess
+# define NtQueryInformationThread ZwQueryInformationThread
+# define NtQuerySystemInformation ZwQuerySystemInformation
+# define NtClose ZwClose
+# define NtCreateFile ZwCreateFile
+# define NtReadFile ZwReadFile
+# define NtWriteFile ZwWriteFile
+/** @todo this is very incomplete! */
+#endif
+
#include <ntstatus.h>
+
+/*
+ * Hacks common to both base header sets.
+ */
+#define NtQueryObject Incomplete_NtQueryObject
+#define ZwQueryObject Incomplete_ZwQueryObject
+#define NtSetInformationObject Incomplete_NtSetInformationObject
+#define _OBJECT_INFORMATION_CLASS Incomplete_OBJECT_INFORMATION_CLASS
+#define OBJECT_INFORMATION_CLASS Incomplete_OBJECT_INFORMATION_CLASS
+#define ObjectBasicInformation Incomplete_ObjectBasicInformation
+#define ObjectTypeInformation Incomplete_ObjectTypeInformation
+
+
#ifdef IPRT_NT_USE_WINTERNL
+/*
+ * Use Winternl.h.
+ */
+# define _FILE_INFORMATION_CLASS IncompleteWinternl_FILE_INFORMATION_CLASS
+# define FILE_INFORMATION_CLASS IncompleteWinternl_FILE_INFORMATION_CLASS
+# define FileDirectoryInformation IncompleteWinternl_FileDirectoryInformation
+
+# define NtQueryInformationProcess IncompleteWinternl_NtQueryInformationProcess
+# define NtSetInformationProcess IncompleteWinternl_NtSetInformationProcess
+# define PROCESSINFOCLASS IncompleteWinternl_PROCESSINFOCLASS
+# define _PROCESSINFOCLASS IncompleteWinternl_PROCESSINFOCLASS
+# define PROCESS_BASIC_INFORMATION IncompleteWinternl_PROCESS_BASIC_INFORMATION
+# define PPROCESS_BASIC_INFORMATION IncompleteWinternl_PPROCESS_BASIC_INFORMATION
+# define _PROCESS_BASIC_INFORMATION IncompleteWinternl_PROCESS_BASIC_INFORMATION
+# define ProcessBasicInformation IncompleteWinternl_ProcessBasicInformation
+# define ProcessDebugPort IncompleteWinternl_ProcessDebugPort
+# define ProcessWow64Information IncompleteWinternl_ProcessWow64Information
+# define ProcessImageFileName IncompleteWinternl_ProcessImageFileName
+# define ProcessBreakOnTermination IncompleteWinternl_ProcessBreakOnTermination
+
+# define NtQueryInformationThread IncompleteWinternl_NtQueryInformationThread
+# define NtSetInformationThread IncompleteWinternl_NtSetInformationThread
+# define THREADINFOCLASS IncompleteWinternl_THREADINFOCLASS
+# define _THREADINFOCLASS IncompleteWinternl_THREADINFOCLASS
+# define ThreadIsIoPending IncompleteWinternl_ThreadIsIoPending
+
+# define NtQuerySystemInformation IncompleteWinternl_NtQuerySystemInformation
+# define NtSetSystemInformation IncompleteWinternl_NtSetSystemInformation
+# define SYSTEM_INFORMATION_CLASS IncompleteWinternl_SYSTEM_INFORMATION_CLASS
+# define _SYSTEM_INFORMATION_CLASS IncompleteWinternl_SYSTEM_INFORMATION_CLASS
+# define SystemBasicInformation IncompleteWinternl_SystemBasicInformation
+# define SystemPerformanceInformation IncompleteWinternl_SystemPerformanceInformation
+# define SystemTimeOfDayInformation IncompleteWinternl_SystemTimeOfDayInformation
+# define SystemProcessInformation IncompleteWinternl_SystemProcessInformation
+# define SystemProcessorPerformanceInformation IncompleteWinternl_SystemProcessorPerformanceInformation
+# define SystemInterruptInformation IncompleteWinternl_SystemInterruptInformation
+# define SystemExceptionInformation IncompleteWinternl_SystemExceptionInformation
+# define SystemRegistryQuotaInformation IncompleteWinternl_SystemRegistryQuotaInformation
+# define SystemLookasideInformation IncompleteWinternl_SystemLookasideInformation
+# define SystemPolicyInformation IncompleteWinternl_SystemPolicyInformation
+
+
# define WIN32_NO_STATUS
# include <windef.h>
# include <winnt.h>
# include <winternl.h>
# undef WIN32_NO_STATUS
# include <ntstatus.h>
-# define IPRT_NT_NEED_API_GROUP_1
-#elif defined(IPRT_NT_USE_WDM)
-# include <wdm.h>
-# define IPRT_NT_NEED_API_GROUP_1
+
+# undef _FILE_INFORMATION_CLASS
+# undef FILE_INFORMATION_CLASS
+# undef FileDirectoryInformation
+
+# undef NtQueryInformationProcess
+# undef NtSetInformationProcess
+# undef PROCESSINFOCLASS
+# undef _PROCESSINFOCLASS
+# undef PROCESS_BASIC_INFORMATION
+# undef PPROCESS_BASIC_INFORMATION
+# undef _PROCESS_BASIC_INFORMATION
+# undef ProcessBasicInformation
+# undef ProcessDebugPort
+# undef ProcessWow64Information
+# undef ProcessImageFileName
+# undef ProcessBreakOnTermination
+
+# undef NtQueryInformationThread
+# undef NtSetInformationThread
+# undef THREADINFOCLASS
+# undef _THREADINFOCLASS
+# undef ThreadIsIoPending
+
+# undef NtQuerySystemInformation
+# undef NtSetSystemInformation
+# undef SYSTEM_INFORMATION_CLASS
+# undef _SYSTEM_INFORMATION_CLASS
+# undef SystemBasicInformation
+# undef SystemPerformanceInformation
+# undef SystemTimeOfDayInformation
+# undef SystemProcessInformation
+# undef SystemProcessorPerformanceInformation
+# undef SystemInterruptInformation
+# undef SystemExceptionInformation
+# undef SystemRegistryQuotaInformation
+# undef SystemLookasideInformation
+# undef SystemPolicyInformation
#else
+/*
+ * Use ntifs.h and wdm.h.
+ */
+# ifdef RT_ARCH_X86
+# define _InterlockedAddLargeStatistic _InterlockedAddLargeStatistic_StupidDDKVsCompilerCrap
+# pragma warning(disable : 4163)
+# endif
+
# include <ntifs.h>
+# include <wdm.h>
+
+# ifdef RT_ARCH_X86
+# pragma warning(default : 4163)
+# undef _InterlockedAddLargeStatistic
+# endif
+
+# define IPRT_NT_NEED_API_GROUP_NTIFS
#endif
+
+#undef NtQueryObject
+#undef ZwQueryObject
+#undef NtSetInformationObject
+#undef _OBJECT_INFORMATION_CLASS
+#undef OBJECT_INFORMATION_CLASS
+#undef ObjectBasicInformation
+#undef ObjectTypeInformation
+
#include <iprt/types.h>
@@ -66,7 +200,7 @@ RTDECL(int) RTNtPathOpen(const char *pszPath, ACCESS_MASK fDesiredAccess, ULONG
ULONG fCreateDisposition, ULONG fCreateOptions, ULONG fObjAttribs,
PHANDLE phHandle, PULONG_PTR puDisposition);
RTDECL(int) RTNtPathOpenDir(const char *pszPath, ACCESS_MASK fDesiredAccess, ULONG fShareAccess, ULONG fCreateOptions,
- ULONG fObjAttribs, PHANDLE phHandle, bool *pfObjDir);
+ ULONG fObjAttribs, PHANDLE phHandle, bool *pfObjDir);
RTDECL(int) RTNtPathClose(HANDLE hHandle);
RT_C_DECLS_END
@@ -77,7 +211,105 @@ RT_C_DECLS_END
* @{ */
RT_C_DECLS_BEGIN
-#ifdef IPRT_NT_NEED_API_GROUP_1
+/** @name Process access rights missing in ntddk headers
+ * @{ */
+#ifndef PROCESS_TERMINATE
+# define PROCESS_TERMINATE UINT32_C(0x00000001)
+#endif
+#ifndef PROCESS_CREATE_THREAD
+# define PROCESS_CREATE_THREAD UINT32_C(0x00000002)
+#endif
+#ifndef PROCESS_SET_SESSIONID
+# define PROCESS_SET_SESSIONID UINT32_C(0x00000004)
+#endif
+#ifndef PROCESS_VM_OPERATION
+# define PROCESS_VM_OPERATION UINT32_C(0x00000008)
+#endif
+#ifndef PROCESS_VM_READ
+# define PROCESS_VM_READ UINT32_C(0x00000010)
+#endif
+#ifndef PROCESS_VM_WRITE
+# define PROCESS_VM_WRITE UINT32_C(0x00000020)
+#endif
+#ifndef PROCESS_DUP_HANDLE
+# define PROCESS_DUP_HANDLE UINT32_C(0x00000040)
+#endif
+#ifndef PROCESS_CREATE_PROCESS
+# define PROCESS_CREATE_PROCESS UINT32_C(0x00000080)
+#endif
+#ifndef PROCESS_SET_QUOTA
+# define PROCESS_SET_QUOTA UINT32_C(0x00000100)
+#endif
+#ifndef PROCESS_SET_INFORMATION
+# define PROCESS_SET_INFORMATION UINT32_C(0x00000200)
+#endif
+#ifndef PROCESS_QUERY_INFORMATION
+# define PROCESS_QUERY_INFORMATION UINT32_C(0x00000400)
+#endif
+#ifndef PROCESS_SUSPEND_RESUME
+# define PROCESS_SUSPEND_RESUME UINT32_C(0x00000800)
+#endif
+#ifndef PROCESS_QUERY_LIMITED_INFORMATION
+# define PROCESS_QUERY_LIMITED_INFORMATION UINT32_C(0x00001000)
+#endif
+#ifndef PROCESS_SET_LIMITED_INFORMATION
+# define PROCESS_SET_LIMITED_INFORMATION UINT32_C(0x00002000)
+#endif
+#define PROCESS_UNKNOWN_4000 UINT32_C(0x00004000)
+#define PROCESS_UNKNOWN_6000 UINT32_C(0x00008000)
+#ifndef PROCESS_ALL_ACCESS
+# define PROCESS_ALL_ACCESS ( STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | UINT32_C(0x0000ffff) )
+#endif
+/** @} */
+
+/** @name Thread access rights missing in ntddk headers
+ * @{ */
+#ifndef THREAD_QUERY_INFORMATION
+# define THREAD_QUERY_INFORMATION UINT32_C(0x00000040)
+#endif
+#ifndef THREAD_SET_THREAD_TOKEN
+# define THREAD_SET_THREAD_TOKEN UINT32_C(0x00000080)
+#endif
+#ifndef THREAD_IMPERSONATE
+# define THREAD_IMPERSONATE UINT32_C(0x00000100)
+#endif
+#ifndef THREAD_DIRECT_IMPERSONATION
+# define THREAD_DIRECT_IMPERSONATION UINT32_C(0x00000200)
+#endif
+#ifndef THREAD_RESUME
+# define THREAD_RESUME UINT32_C(0x00001000)
+#endif
+#define THREAD_UNKNOWN_2000 UINT32_C(0x00002000)
+#define THREAD_UNKNOWN_4000 UINT32_C(0x00004000)
+#define THREAD_UNKNOWN_8000 UINT32_C(0x00008000)
+/** @} */
+
+/** @name Special handle values.
+ * @{ */
+#ifndef NtCurrentProcess
+# define NtCurrentProcess() ( (HANDLE)-(intptr_t)1 )
+#endif
+#ifndef NtCurrentThread
+# define NtCurrentThread() ( (HANDLE)-(intptr_t)2 )
+#endif
+#ifndef ZwCurrentProcess
+# define ZwCurrentProcess() NtCurrentProcess()
+#endif
+#ifndef ZwCurrentThread
+# define ZwCurrentThread() NtCurrentThread()
+#endif
+/** @} */
+
+
+#ifdef IPRT_NT_USE_WINTERNL
+typedef struct _CLIENT_ID
+{
+ HANDLE UniqueProcess;
+ HANDLE UniqueThread;
+} CLIENT_ID;
+typedef CLIENT_ID *PCLIENT_ID;
+
+NTSYSAPI NTSTATUS NTAPI NtCreateSection(PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES, PLARGE_INTEGER, ULONG, ULONG, HANDLE);
typedef struct _FILE_FS_ATTRIBUTE_INFORMATION
{
@@ -88,7 +320,10 @@ typedef struct _FILE_FS_ATTRIBUTE_INFORMATION
} FILE_FS_ATTRIBUTE_INFORMATION;
typedef FILE_FS_ATTRIBUTE_INFORMATION *PFILE_FS_ATTRIBUTE_INFORMATION;
-typedef enum
+NTSYSAPI NTSTATUS NTAPI NtOpenProcessToken(HANDLE, ACCESS_MASK, PHANDLE);
+NTSYSAPI NTSTATUS NTAPI NtOpenThreadToken(HANDLE, ACCESS_MASK, BOOLEAN, PHANDLE);
+
+typedef enum _FSINFOCLASS
{
FileFsVolumeInformation = 1,
FileFsLabelInformation,
@@ -98,14 +333,246 @@ typedef enum
FileFsControlInformation,
FileFsFullSizeInformation,
FileFsObjectIdInformation,
+ FileFsDriverPathInformation,
+ FileFsVolumeFlagsInformation,
+ FileFsSectorSizeInformation,
+ FileFsDataCopyInformation,
FileFsMaximumInformation
} FS_INFORMATION_CLASS;
typedef FS_INFORMATION_CLASS *PFS_INFORMATION_CLASS;
-extern "C" NTSTATUS NTAPI NtQueryVolumeInformationFile(HANDLE, PIO_STATUS_BLOCK, PVOID, ULONG, FS_INFORMATION_CLASS);
+NTSYSAPI NTSTATUS NTAPI NtQueryVolumeInformationFile(HANDLE, PIO_STATUS_BLOCK, PVOID, ULONG, FS_INFORMATION_CLASS);
+typedef struct _FILE_STANDARD_INFORMATION
+{
+ LARGE_INTEGER AllocationSize;
+ LARGE_INTEGER EndOfFile;
+ ULONG NumberOfLinks;
+ BOOLEAN DeletePending;
+ BOOLEAN Directory;
+} FILE_STANDARD_INFORMATION;
+typedef FILE_STANDARD_INFORMATION *PFILE_STANDARD_INFORMATION;
+typedef enum _FILE_INFORMATION_CLASS
+{
+ FileDirectoryInformation = 1,
+ FileFullDirectoryInformation,
+ FileBothDirectoryInformation,
+ FileBasicInformation,
+ FileStandardInformation,
+ FileInternalInformation,
+ FileEaInformation,
+ FileAccessInformation,
+ FileNameInformation,
+ FileRenameInformation,
+ FileLinkInformation,
+ FileNamesInformation,
+ FileDispositionInformation,
+ FilePositionInformation,
+ FileFullEaInformation,
+ FileModeInformation,
+ FileAlignmentInformation,
+ FileAllInformation,
+ FileAllocationInformation,
+ FileEndOfFileInformation,
+ FileAlternateNameInformation,
+ FileStreamInformation,
+ FilePipeInformation,
+ FilePipeLocalInformation,
+ FilePipeRemoteInformation,
+ FileMailslotQueryInformation,
+ FileMailslotSetInformation,
+ FileCompressionInformation,
+ FileObjectIdInformation,
+ FileCompletionInformation,
+ FileMoveClusterInformation,
+ FileQuotaInformation,
+ FileReparsePointInformation,
+ FileNetworkOpenInformation,
+ FileAttributeTagInformation,
+ FileTrackingInformation,
+ FileIdBothDirectoryInformation,
+ FileIdFullDirectoryInformation,
+ FileValidDataLengthInformation,
+ FileShortNameInformation,
+ FileIoCompletionNotificationInformation,
+ FileIoStatusBlockRangeInformation,
+ FileIoPriorityHintInformation,
+ FileSfioReserveInformation,
+ FileSfioVolumeInformation,
+ FileHardLinkInformation,
+ FileProcessIdsUsingFileInformation,
+ FileNormalizedNameInformation,
+ FileNetworkPhysicalNameInformation,
+ FileIdGlobalTxDirectoryInformation,
+ FileIsRemoteDeviceInformation,
+ FileUnusedInformation,
+ FileNumaNodeInformation,
+ FileStandardLinkInformation,
+ FileRemoteProtocolInformation,
+ FileRenameInformationBypassAccessCheck,
+ FileLinkInformationBypassAccessCheck,
+ FileVolumeNameInformation,
+ FileIdInformation,
+ FileIdExtdDirectoryInformation,
+ FileReplaceCompletionInformation,
+ FileHardLinkFullIdInformation,
+ FileMaximumInformation
+} FILE_INFORMATION_CLASS;
+typedef FILE_INFORMATION_CLASS *PFILE_INFORMATION_CLASS;
+NTSYSAPI NTSTATUS NTAPI NtQueryInformationFile(HANDLE, PIO_STATUS_BLOCK, PVOID, ULONG, FILE_INFORMATION_CLASS);
+
+typedef struct _MEMORY_SECTION_NAME
+{
+ UNICODE_STRING SectionFileName;
+ WCHAR NameBuffer[1];
+} MEMORY_SECTION_NAME;
+
+#ifdef IPRT_NT_USE_WINTERNL
+typedef struct _PROCESS_BASIC_INFORMATION
+{
+ NTSTATUS ExitStatus;
+ PPEB PebBaseAddress;
+ ULONG_PTR AffinityMask;
+ int32_t BasePriority;
+ ULONG_PTR UniqueProcessId;
+ ULONG_PTR InheritedFromUniqueProcessId;
+} PROCESS_BASIC_INFORMATION;
+typedef PROCESS_BASIC_INFORMATION *PPROCESS_BASIC_INFORMATION;
#endif
-NTSTATUS NTAPI NtOpenDirectoryObject(PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES);
+typedef enum _PROCESSINFOCLASS
+{
+ ProcessBasicInformation = 0,
+ ProcessQuotaLimits,
+ ProcessIoCounters,
+ ProcessVmCounters,
+ ProcessTimes,
+ ProcessBasePriority,
+ ProcessRaisePriority,
+ ProcessDebugPort,
+ ProcessExceptionPort,
+ ProcessAccessToken,
+ ProcessLdtInformation,
+ ProcessLdtSize,
+ ProcessDefaultHardErrorMode,
+ ProcessIoPortHandlers,
+ ProcessPooledUsageAndLimits,
+ ProcessWorkingSetWatch,
+ ProcessUserModeIOPL,
+ ProcessEnableAlignmentFaultFixup,
+ ProcessPriorityClass,
+ ProcessWx86Information,
+ ProcessHandleCount,
+ ProcessAffinityMask,
+ ProcessPriorityBoost,
+ ProcessDeviceMap,
+ ProcessSessionInformation,
+ ProcessForegroundInformation,
+ ProcessWow64Information,
+ ProcessImageFileName,
+ ProcessLUIDDeviceMapsEnabled,
+ ProcessBreakOnTermination,
+ ProcessDebugObjectHandle,
+ ProcessDebugFlags,
+ ProcessHandleTracing,
+ ProcessIoPriority,
+ ProcessExecuteFlags,
+ ProcessTlsInformation,
+ ProcessCookie,
+ ProcessImageInformation,
+ ProcessCycleTime,
+ ProcessPagePriority,
+ ProcessInstrumentationCallbak,
+ ProcessThreadStackAllocation,
+ ProcessWorkingSetWatchEx,
+ ProcessImageFileNameWin32,
+ ProcessImageFileMapping,
+ ProcessAffinityUpdateMode,
+ ProcessMemoryAllocationMode,
+ ProcessGroupInformation,
+ ProcessTokenVirtualizationEnabled,
+ ProcessConsoleHostProcess,
+ ProcessWindowsInformation,
+ MaxProcessInfoClass
+} PROCESSINFOCLASS;
+NTSYSAPI NTSTATUS NTAPI NtQueryInformationProcess(HANDLE, PROCESSINFOCLASS, PVOID, ULONG, PULONG);
+
+typedef enum _THREADINFOCLASS
+{
+ ThreadBasicInformation = 0,
+ ThreadTimes,
+ ThreadPriority,
+ ThreadBasePriority,
+ ThreadAffinityMask,
+ ThreadImpersonationToken,
+ ThreadDescriptorTableEntry,
+ ThreadEnableAlignmentFaultFixup,
+ ThreadEventPair_Reusable,
+ ThreadQuerySetWin32StartAddress,
+ ThreadZeroTlsCell,
+ ThreadPerformanceCount,
+ ThreadAmILastThread,
+ ThreadIdealProcessor,
+ ThreadPriorityBoost,
+ ThreadSetTlsArrayAddress,
+ ThreadIsIoPending,
+ ThreadHideFromDebugger,
+ ThreadBreakOnTermination,
+ ThreadSwitchLegacyState,
+ ThreadIsTerminated,
+ ThreadLastSystemCall,
+ ThreadIoPriority,
+ ThreadCycleTime,
+ ThreadPagePriority,
+ ThreadActualBasePriority,
+ ThreadTebInformation,
+ ThreadCSwitchMon,
+ ThreadCSwitchPmu,
+ ThreadWow64Context,
+ ThreadGroupInformation,
+ ThreadUmsInformation,
+ ThreadCounterProfiling,
+ ThreadIdealProcessorEx,
+ ThreadCpuAccountingInformation,
+ MaxThreadInfoClass
+} THREADINFOCLASS;
+NTSYSAPI NTSTATUS NTAPI NtSetInformationThread(HANDLE, THREADINFOCLASS, LPCVOID, ULONG);
+
+NTSYSAPI NTSTATUS NTAPI NtQueryInformationToken(HANDLE, TOKEN_INFORMATION_CLASS, PVOID, ULONG, PULONG);
+
+NTSYSAPI NTSTATUS NTAPI NtReadFile(HANDLE, HANDLE, PIO_APC_ROUTINE, PVOID, PIO_STATUS_BLOCK, PVOID, ULONG, PLARGE_INTEGER, PULONG);
+NTSYSAPI NTSTATUS NTAPI NtWriteFile(HANDLE, HANDLE, PIO_APC_ROUTINE, void const *, PIO_STATUS_BLOCK, PVOID, ULONG, PLARGE_INTEGER, PULONG);
+
+NTSYSAPI NTSTATUS NTAPI NtReadVirtualMemory(HANDLE, PVOID, PVOID, SIZE_T, PSIZE_T);
+NTSYSAPI NTSTATUS NTAPI NtWriteVirtualMemory(HANDLE, PVOID, void const *, SIZE_T, PSIZE_T);
+
+NTSYSAPI NTSTATUS NTAPI RtlAddAccessAllowedAce(PACL, ULONG, ULONG, PSID);
+NTSYSAPI NTSTATUS NTAPI RtlCopySid(ULONG, PSID, PSID);
+NTSYSAPI NTSTATUS NTAPI RtlCreateAcl(PACL, ULONG, ULONG);
+NTSYSAPI NTSTATUS NTAPI RtlCreateSecurityDescriptor(PSECURITY_DESCRIPTOR, ULONG);
+NTSYSAPI NTSTATUS NTAPI RtlGetVersion(PRTL_OSVERSIONINFOW);
+NTSYSAPI NTSTATUS NTAPI RtlInitializeSid(PSID, PSID_IDENTIFIER_AUTHORITY, UCHAR);
+NTSYSAPI NTSTATUS NTAPI RtlSetDaclSecurityDescriptor(PSECURITY_DESCRIPTOR, BOOLEAN, PACL, BOOLEAN);
+NTSYSAPI PULONG NTAPI RtlSubAuthoritySid(PSID, ULONG);
+
+#endif /* IPRT_NT_USE_WINTERNL */
+
+typedef enum _OBJECT_INFORMATION_CLASS
+{
+ ObjectBasicInformation = 0,
+ ObjectNameInformation,
+ ObjectTypeInformation,
+ ObjectAllInformation,
+ ObjectDataInformation
+} OBJECT_INFORMATION_CLASS;
+typedef OBJECT_INFORMATION_CLASS *POBJECT_INFORMATION_CLASS;
+#ifdef IN_RING0
+# define NtQueryObject ZwQueryObject
+#endif
+NTSYSAPI NTSTATUS NTAPI NtQueryObject(HANDLE, OBJECT_INFORMATION_CLASS, PVOID, ULONG, PULONG);
+NTSYSAPI NTSTATUS NTAPI NtSetInformationObject(HANDLE, OBJECT_INFORMATION_CLASS, PVOID, ULONG);
+NTSYSAPI NTSTATUS NTAPI NtDuplicateObject(HANDLE, HANDLE, HANDLE, PHANDLE, ACCESS_MASK, ULONG, ULONG);
+
+NTSYSAPI NTSTATUS NTAPI NtOpenDirectoryObject(PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES);
typedef struct _OBJECT_DIRECTORY_INFORMATION
{
@@ -113,11 +580,307 @@ typedef struct _OBJECT_DIRECTORY_INFORMATION
UNICODE_STRING TypeName;
} OBJECT_DIRECTORY_INFORMATION;
typedef OBJECT_DIRECTORY_INFORMATION *POBJECT_DIRECTORY_INFORMATION;
+NTSYSAPI NTSTATUS NTAPI NtQueryDirectoryObject(HANDLE, PVOID, ULONG, BOOLEAN, BOOLEAN, PULONG, PULONG);
+
+/** Retured by ProcessImageInformation as well as NtQuerySection. */
+typedef struct _SECTION_IMAGE_INFORMATION
+{
+ PVOID TransferAddress;
+ ULONG ZeroBits;
+ SIZE_T MaximumStackSize;
+ SIZE_T CommittedStackSize;
+ ULONG SubSystemType;
+ union
+ {
+ struct
+ {
+ USHORT SubSystemMinorVersion;
+ USHORT SubSystemMajorVersion;
+ };
+ ULONG SubSystemVersion;
+ };
+ ULONG GpValue;
+ USHORT ImageCharacteristics;
+ USHORT DllCharacteristics;
+ USHORT Machine;
+ BOOLEAN ImageContainsCode;
+ union /**< Since Vista, used to be a spare BOOLEAN. */
+ {
+ struct
+ {
+ UCHAR ComPlusNativeRead : 1;
+ UCHAR ComPlusILOnly : 1;
+ UCHAR ImageDynamicallyRelocated : 1;
+ UCHAR ImageMAppedFlat : 1;
+ UCHAR Reserved : 4;
+ };
+ UCHAR ImageFlags;
+ };
+ ULONG LoaderFlags;
+ ULONG ImageFileSize; /**< Since XP? */
+ ULONG CheckSum; /**< Since Vista, Used to be a reserved/spare ULONG. */
+} SECTION_IMAGE_INFORMATION;
+typedef SECTION_IMAGE_INFORMATION *PSECTION_IMAGE_INFORMATION;
+
+typedef enum _SECTION_INFORMATION_CLASS
+{
+ SectionBasicInformation = 0,
+ SectionImageInformation,
+ MaxSectionInfoClass
+} SECTION_INFORMATION_CLASS;
+NTSYSAPI NTSTATUS NTAPI NtQuerySection(HANDLE, SECTION_INFORMATION_CLASS, PVOID, SIZE_T, PSIZE_T);
-NTSTATUS NTAPI NtQueryDirectoryObject(HANDLE, PVOID, ULONG, BOOLEAN, BOOLEAN, PULONG, PULONG);
+NTSYSAPI NTSTATUS NTAPI NtQueryInformationThread(HANDLE, THREADINFOCLASS, PVOID, ULONG, PULONG);
+
+#ifndef SEC_FILE
+# define SEC_FILE UINT32_C(0x00800000)
+#endif
+#ifndef SEC_IMAGE
+# define SEC_IMAGE UINT32_C(0x01000000)
+#endif
+#ifndef SEC_PROTECTED_IMAGE
+# define SEC_PROTECTED_IMAGE UINT32_C(0x02000000)
+#endif
+#ifndef SEC_NOCACHE
+# define SEC_NOCACHE UINT32_C(0x10000000)
+#endif
+#ifndef MEM_ROTATE
+# define MEM_ROTATE UINT32_C(0x00800000)
+#endif
+typedef enum _MEMORY_INFORMATION_CLASS
+{
+ MemoryBasicInformation = 0,
+ MemoryWorkingSetList,
+ MemorySectionName,
+ MemoryBasicVlmInformation
+} MEMORY_INFORMATION_CLASS;
+#ifdef IN_RING0
+typedef struct _MEMORY_BASIC_INFORMATION
+{
+ PVOID BaseAddress;
+ PVOID AllocationBase;
+ ULONG AllocationProtect;
+ SIZE_T RegionSize;
+ ULONG State;
+ ULONG Protect;
+ ULONG Type;
+} MEMORY_BASIC_INFORMATION;
+typedef MEMORY_BASIC_INFORMATION *PMEMORY_BASIC_INFORMATION;
+# define NtQueryVirtualMemory ZwQueryVirtualMemory
+#endif
+NTSYSAPI NTSTATUS NTAPI NtQueryVirtualMemory(HANDLE, void const *, MEMORY_INFORMATION_CLASS, PVOID, SIZE_T, PSIZE_T);
+
+typedef enum _SYSTEM_INFORMATION_CLASS
+{
+ SystemBasicInformation = 0,
+ SystemCpuInformation,
+ SystemPerformanceInformation,
+ SystemTimeOfDayInformation,
+ SystemInformation_Unknown_4,
+ SystemProcessInformation,
+ SystemInformation_Unknown_6,
+ SystemInformation_Unknown_7,
+ SystemProcessorPerformanceInformation,
+ SystemInformation_Unknown_9,
+ SystemInformation_Unknown_10,
+ SystemModuleInformation,
+ SystemInformation_Unknown_12,
+ SystemInformation_Unknown_13,
+ SystemInformation_Unknown_14,
+ SystemInformation_Unknown_15,
+ SystemHandleInformation,
+ SystemInformation_Unknown_17,
+ SystemPageFileInformation,
+ SystemInformation_Unknown_19,
+ SystemInformation_Unknown_20,
+ SystemCacheInformation,
+ SystemInformation_Unknown_22,
+ SystemInterruptInformation,
+ SystemDpcBehaviourInformation,
+ SystemFullMemoryInformation,
+ SystemLoadGdiDriverInformation, /* 26 */
+ SystemUnloadGdiDriverInformation, /* 27 */
+ SystemTimeAdjustmentInformation,
+ SystemSummaryMemoryInformation,
+ SystemInformation_Unknown_30,
+ SystemInformation_Unknown_31,
+ SystemInformation_Unknown_32,
+ SystemExceptionInformation,
+ SystemCrashDumpStateInformation,
+ SystemKernelDebuggerInformation,
+ SystemContextSwitchInformation,
+ SystemRegistryQuotaInformation,
+ SystemInformation_Unknown_38,
+ SystemInformation_Unknown_39,
+ SystemInformation_Unknown_40,
+ SystemInformation_Unknown_41,
+ SystemInformation_Unknown_42,
+ SystemInformation_Unknown_43,
+ SystemCurrentTimeZoneInformation,
+ SystemLookasideInformation,
+ SystemSetTimeSlipEvent,
+ SystemCreateSession,
+ SystemDeleteSession,
+ SystemInformation_Unknown_49,
+ SystemRangeStartInformation,
+ SystemVerifierInformation,
+ SystemInformation_Unknown_52,
+ SystemSessionProcessInformation,
+ SystemLoadGdiDriverInSystemSpaceInformation, /* 54 */
+ SystemInformation_Unknown_55,
+ SystemInformation_Unknown_56,
+ SystemExtendedProcessInformation,
+ SystemInformation_Unknown_58,
+ SystemInformation_Unknown_59,
+ SystemInformation_Unknown_60,
+ SystemInformation_Unknown_61,
+ SystemInformation_Unknown_62,
+ SystemInformation_Unknown_63,
+ SystemExtendedHandleInformation, /* 64 */
+
+ /** @todo fill gap. they've added a whole bunch of things */
+ SystemPolicyInformation = 134,
+ SystemInformationClassMax
+} SYSTEM_INFORMATION_CLASS;
+
+#ifdef IPRT_NT_USE_WINTERNL
+typedef struct _VM_COUNTERS
+{
+ SIZE_T PeakVirtualSize;
+ SIZE_T VirtualSize;
+ ULONG PageFaultCount;
+ SIZE_T PeakWorkingSetSize;
+ SIZE_T WorkingSetSize;
+ SIZE_T QuotaPeakPagedPoolUsage;
+ SIZE_T QuotaPagedPoolUsage;
+ SIZE_T QuotaPeakNonPagedPoolUsage;
+ SIZE_T QuotaNonPagedPoolUsage;
+ SIZE_T PagefileUsage;
+ SIZE_T PeakPagefileUsage;
+} VM_COUNTERS;
+typedef VM_COUNTERS *PVM_COUNTERS;
+#endif
+
+#if 0
+typedef struct _IO_COUNTERS
+{
+ ULONGLONG ReadOperationCount;
+ ULONGLONG WriteOperationCount;
+ ULONGLONG OtherOperationCount;
+ ULONGLONG ReadTransferCount;
+ ULONGLONG WriteTransferCount;
+ ULONGLONG OtherTransferCount;
+} IO_COUNTERS;
+typedef IO_COUNTERS *PIO_COUNTERS;
+#endif
+
+typedef struct _RTNT_SYSTEM_PROCESS_INFORMATION
+{
+ ULONG NextEntryOffset; /**< 0x00 / 0x00 */
+ ULONG NumberOfThreads; /**< 0x04 / 0x04 */
+ LARGE_INTEGER Reserved1[3]; /**< 0x08 / 0x08 */
+ LARGE_INTEGER CreationTime; /**< 0x20 / 0x20 */
+ LARGE_INTEGER UserTime; /**< 0x28 / 0x28 */
+ LARGE_INTEGER KernelTime; /**< 0x30 / 0x30 */
+ UNICODE_STRING ProcessName; /**< 0x38 / 0x38 Clean unicode encoding? */
+ int32_t BasePriority; /**< 0x40 / 0x48 */
+ HANDLE UniqueProcessId; /**< 0x44 / 0x50 */
+ HANDLE ParentProcessId; /**< 0x48 / 0x58 */
+ ULONG HandleCount; /**< 0x4c / 0x60 */
+ ULONG Reserved2; /**< 0x50 / 0x64 Session ID? */
+ ULONG_PTR Reserved3; /**< 0x54 / 0x68 */
+ VM_COUNTERS VmCounters; /**< 0x58 / 0x70 */
+ IO_COUNTERS IoCounters; /**< 0x88 / 0xd0 Might not be present in earlier windows versions. */
+ /* After this follows the threads, then the ProcessName.Buffer. */
+} RTNT_SYSTEM_PROCESS_INFORMATION;
+typedef RTNT_SYSTEM_PROCESS_INFORMATION *PRTNT_SYSTEM_PROCESS_INFORMATION;
+#ifndef IPRT_NT_USE_WINTERNL
+typedef RTNT_SYSTEM_PROCESS_INFORMATION SYSTEM_PROCESS_INFORMATION ;
+typedef SYSTEM_PROCESS_INFORMATION *PSYSTEM_PROCESS_INFORMATION;
+#endif
+
+typedef struct _SYSTEM_HANDLE_ENTRY_INFO
+{
+ USHORT UniqueProcessId;
+ USHORT CreatorBackTraceIndex;
+ UCHAR ObjectTypeIndex;
+ UCHAR HandleAttributes;
+ USHORT HandleValue;
+ PVOID Object;
+ ULONG GrantedAccess;
+} SYSTEM_HANDLE_ENTRY_INFO;
+typedef SYSTEM_HANDLE_ENTRY_INFO *PSYSTEM_HANDLE_ENTRY_INFO;
+
+/** Returned by SystemHandleInformation */
+typedef struct _SYSTEM_HANDLE_INFORMATION
+{
+ ULONG NumberOfHandles;
+ SYSTEM_HANDLE_ENTRY_INFO Handles[1];
+} SYSTEM_HANDLE_INFORMATION;
+typedef SYSTEM_HANDLE_INFORMATION *PSYSTEM_HANDLE_INFORMATION;
+
+/** Extended handle information entry.
+ * @remarks 3 x PVOID + 4 x ULONG = 28 bytes on 32-bit / 40 bytes on 64-bit */
+typedef struct _SYSTEM_HANDLE_ENTRY_INFO_EX
+{
+ PVOID Object;
+ HANDLE UniqueProcessId;
+ HANDLE HandleValue;
+ ACCESS_MASK GrantedAccess;
+ USHORT CreatorBackTraceIndex;
+ USHORT ObjectTypeIndex;
+ ULONG HandleAttributes;
+ ULONG Reserved;
+} SYSTEM_HANDLE_ENTRY_INFO_EX;
+typedef SYSTEM_HANDLE_ENTRY_INFO_EX *PSYSTEM_HANDLE_ENTRY_INFO_EX;
+
+/** Returned by SystemExtendedHandleInformation. */
+typedef struct _SYSTEM_HANDLE_INFORMATION_EX
+{
+ ULONG_PTR NumberOfHandles;
+ ULONG_PTR Reserved;
+ SYSTEM_HANDLE_ENTRY_INFO_EX Handles[1];
+} SYSTEM_HANDLE_INFORMATION_EX;
+typedef SYSTEM_HANDLE_INFORMATION_EX *PSYSTEM_HANDLE_INFORMATION_EX;
+
+/** Input to SystemSessionProcessInformation. */
+typedef struct _SYSTEM_SESSION_PROCESS_INFORMATION
+{
+ ULONG SessionId;
+ ULONG BufferLength;
+ /** Return buffer, SYSTEM_PROCESS_INFORMATION entries. */
+ PVOID Buffer;
+} SYSTEM_SESSION_PROCESS_INFORMATION;
+typedef SYSTEM_SESSION_PROCESS_INFORMATION *PSYSTEM_SESSION_PROCESS_INFORMATION;
+
+NTSYSAPI NTSTATUS NTAPI NtQuerySystemInformation(SYSTEM_INFORMATION_CLASS, PVOID, ULONG, PULONG);
+
+NTSYSAPI NTSTATUS NTAPI NtDelayExecution(BOOLEAN, PLARGE_INTEGER);
+NTSYSAPI NTSTATUS NTAPI NtYieldExecution(void);
+
+NTSYSAPI NTSTATUS NTAPI RtlAddAccessDeniedAce(PACL, ULONG, ULONG, PSID);
RT_C_DECLS_END
/** @} */
+
+#if defined(IN_RING0) || defined(DOXYGEN_RUNNING)
+/** @name NT Kernel APIs
+ * @{ */
+NTSYSAPI BOOLEAN NTAPI ObFindHandleForObject(PEPROCESS pProcess, PVOID pvObject, POBJECT_TYPE pObjectType,
+ PVOID pvOptionalConditions, PHANDLE phFound);
+NTSYSAPI NTSTATUS NTAPI ObReferenceObjectByName(PUNICODE_STRING pObjectPath, ULONG fAttributes, PACCESS_STATE pAccessState,
+ ACCESS_MASK fDesiredAccess, POBJECT_TYPE pObjectType,
+ KPROCESSOR_MODE enmAccessMode, PVOID pvParseContext, PVOID *ppvObject);
+NTSYSAPI HANDLE NTAPI PsGetProcessInheritedFromUniqueProcessId(PEPROCESS);
+NTSYSAPI UCHAR * NTAPI PsGetProcessImageFileName(PEPROCESS);
+NTSYSAPI BOOLEAN NTAPI PsIsProcessBeingDebugged(PEPROCESS);
+NTSYSAPI ULONG NTAPI PsGetProcessSessionId(PEPROCESS);
+extern DECLIMPORT(POBJECT_TYPE *) LpcPortObjectType; /**< In vista+ this is the ALPC port object type. */
+extern DECLIMPORT(POBJECT_TYPE *) LpcWaitablePortObjectType; /**< In vista+ this is the ALPC port object type. */
+
+/** @ */
+#endif /* IN_RING0 */
+
#endif
diff --git a/include/iprt/process.h b/include/iprt/process.h
index 790470f4f6b..2760306fcc0 100644
--- a/include/iprt/process.h
+++ b/include/iprt/process.h
@@ -364,6 +364,15 @@ RTR3DECL(int) RTProcDaemonizeUsingFork(bool fNoChDir, bool fNoClose, const cha
RTR3DECL(bool) RTProcIsRunningByName(const char *pszName);
/**
+ * Queries the parent process ID.
+ *
+ * @returns IPRT status code
+ * @param hProcess The process to query the parent of.
+ * @param phParent Where to return the parent process ID.
+ */
+RTR3DECL(int) RTProcQueryParent(RTPROCESS hProcess, PRTPROCESS phParent);
+
+/**
* Query the username of the given process.
*
* @returns IPRT status code.
diff --git a/include/iprt/stream.h b/include/iprt/stream.h
index 720d6d84b89..cba8a86a887 100644
--- a/include/iprt/stream.h
+++ b/include/iprt/stream.h
@@ -267,6 +267,15 @@ RTR3DECL(int) RTStrmPrintf(PRTSTREAM pStream, const char *pszFormat, ...);
RTR3DECL(int) RTStrmPrintfV(PRTSTREAM pStream, const char *pszFormat, va_list args);
/**
+ * Dumper vprintf-like function outputting to a stream.
+ *
+ * @param pvUser The stream to print to. NULL means standard output.
+ * @param pszFormat Runtime format string.
+ * @param va Arguments specified by pszFormat.
+ */
+RTR3DECL(void) RTStrmDumpPrintfV(void *pvUser, const char *pszFormat, va_list va);
+
+/**
* Prints a formatted string to the standard output stream (g_pStdOut).
*
* @returns Number of bytes printed.
diff --git a/include/iprt/string.h b/include/iprt/string.h
index 44d83f50985..22a4097687d 100644
--- a/include/iprt/string.h
+++ b/include/iprt/string.h
@@ -3009,9 +3009,15 @@ RTDECL(int8_t) RTStrToInt8(const char *pszValue);
* @param cchBuf The size of the output buffer.
* @param pv Pointer to the bytes to stringify.
* @param cb The number of bytes to stringify.
- * @param fFlags Must be zero, reserved for future use.
+ * @param fFlags Combination of RTSTRPRINTHEXBYTES_F_XXX values.
+ * @sa RTUtf16PrintHexBytes.
*/
RTDECL(int) RTStrPrintHexBytes(char *pszBuf, size_t cchBuf, void const *pv, size_t cb, uint32_t fFlags);
+/** @name RTSTRPRINTHEXBYTES_F_XXX - flags for RTStrPrintHexBytes and RTUtf16PritnHexBytes.
+ * @{ */
+/** Upper case hex digits, the default is lower case. */
+#define RTSTRPRINTHEXBYTES_F_UPPER RT_BIT(0)
+/** @} */
/**
* Converts a string of hex bytes back into binary data.
@@ -3282,6 +3288,161 @@ RTDECL(int) RTUtf16DupExTag(PRTUTF16 *ppwszString, PCRTUTF16 pwszString, size_t
RTDECL(size_t) RTUtf16Len(PCRTUTF16 pwszString);
/**
+ * Find the length of a zero-terminated byte string, given a max string length.
+ *
+ * @returns The string length or cbMax. The returned length does not include
+ * the zero terminator if it was found.
+ *
+ * @param pwszString The string.
+ * @param cwcMax The max string length in RTUTF16s.
+ * @sa RTUtf16NLenEx, RTStrNLen.
+ */
+RTDECL(size_t) RTUtf16NLen(PCRTUTF16 pwszString, size_t cwcMax);
+
+/**
+ * Find the length of a zero-terminated byte string, given
+ * a max string length.
+ *
+ * @returns IPRT status code.
+ * @retval VINF_SUCCESS if the string has a length less than cchMax.
+ * @retval VERR_BUFFER_OVERFLOW if the end of the string wasn't found
+ * before cwcMax was reached.
+ *
+ * @param pwszString The string.
+ * @param cwcMax The max string length in RTUTF16s.
+ * @param pcwc Where to store the string length excluding the
+ * terminator. This is set to cwcMax if the terminator
+ * isn't found.
+ * @sa RTUtf16NLen, RTStrNLenEx.
+ */
+RTDECL(int) RTUtf16NLenEx(PCRTUTF16 pwszString, size_t cwcMax, size_t *pcwc);
+
+/**
+ * Find the zero terminator in a string with a limited length.
+ *
+ * @returns Pointer to the zero terminator.
+ * @returns NULL if the zero terminator was not found.
+ *
+ * @param pwszString The string.
+ * @param cwcMax The max string length. RTSTR_MAX is fine.
+ */
+RTDECL(PCRTUTF16) RTUtf16End(PCRTUTF16 pwszString, size_t cwcMax);
+
+/**
+ * Strips blankspaces from both ends of the string.
+ *
+ * @returns Pointer to first non-blank char in the string.
+ * @param pwsz The string to strip.
+ */
+RTDECL(PRTUTF16) RTUtf16Strip(PRTUTF16 pwsz);
+
+/**
+ * Strips blankspaces from the start of the string.
+ *
+ * @returns Pointer to first non-blank char in the string.
+ * @param pwsz The string to strip.
+ */
+RTDECL(PRTUTF16) RTUtf16StripL(PCRTUTF16 pwsz);
+
+/**
+ * Strips blankspaces from the end of the string.
+ *
+ * @returns pwsz.
+ * @param pwsz The string to strip.
+ */
+RTDECL(PRTUTF16) RTUtf16StripR(PRTUTF16 pwsz);
+
+/**
+ * String copy with overflow handling.
+ *
+ * @retval VINF_SUCCESS on success.
+ * @retval VERR_BUFFER_OVERFLOW if the destination buffer is too small. The
+ * buffer will contain as much of the string as it can hold, fully
+ * terminated.
+ *
+ * @param pwszDst The destination buffer.
+ * @param cwcDst The size of the destination buffer in RTUTF16s.
+ * @param pwszSrc The source string. NULL is not OK.
+ */
+RTDECL(int) RTUtf16Copy(PRTUTF16 pwszDst, size_t cwcDst, PCRTUTF16 pwszSrc);
+
+/**
+ * String copy with overflow handling, ASCII source.
+ *
+ * @retval VINF_SUCCESS on success.
+ * @retval VERR_BUFFER_OVERFLOW if the destination buffer is too small. The
+ * buffer will contain as much of the string as it can hold, fully
+ * terminated.
+ *
+ * @param pwszDst The destination buffer.
+ * @param cwcDst The size of the destination buffer in RTUTF16s.
+ * @param pszSrc The source string, pure ASCII. NULL is not OK.
+ */
+RTDECL(int) RTUtf16CopyAscii(PRTUTF16 pwszDst, size_t cwcDst, const char *pszSrc);
+
+/**
+ * String copy with overflow handling.
+ *
+ * @retval VINF_SUCCESS on success.
+ * @retval VERR_BUFFER_OVERFLOW if the destination buffer is too small. The
+ * buffer will contain as much of the string as it can hold, fully
+ * terminated.
+ *
+ * @param pwszDst The destination buffer.
+ * @param cwcDst The size of the destination buffer in RTUTF16s.
+ * @param pwszSrc The source string. NULL is not OK.
+ * @param cwcSrcMax The maximum number of chars (not code points) to
+ * copy from the source string, not counting the
+ * terminator as usual.
+ */
+RTDECL(int) RTUtf16CopyEx(PRTUTF16 pwszDst, size_t cwcDst, PCRTUTF16 pwszSrc, size_t cwcSrcMax);
+
+/**
+ * String concatenation with overflow handling.
+ *
+ * @retval VINF_SUCCESS on success.
+ * @retval VERR_BUFFER_OVERFLOW if the destination buffer is too small. The
+ * buffer will contain as much of the string as it can hold, fully
+ * terminated.
+ *
+ * @param pszDst The destination buffer.
+ * @param cwcDst The size of the destination buffer in RTUTF16s.
+ * @param pwszSrc The source string. NULL is not OK.
+ */
+RTDECL(int) RTUtf16Cat(PRTUTF16 pwszDst, size_t cwcDst, PCRTUTF16 pwszSrc);
+
+/**
+ * String concatenation with overflow handling, ASCII source.
+ *
+ * @retval VINF_SUCCESS on success.
+ * @retval VERR_BUFFER_OVERFLOW if the destination buffer is too small. The
+ * buffer will contain as much of the string as it can hold, fully
+ * terminated.
+ *
+ * @param pszDst The destination buffer.
+ * @param cwcDst The size of the destination buffer in RTUTF16s.
+ * @param pszSrc The source string, pure ASCII. NULL is not OK.
+ */
+RTDECL(int) RTUtf16CatAscii(PRTUTF16 pwszDst, size_t cwcDst, const char *pwszSrc);
+
+/**
+ * String concatenation with overflow handling.
+ *
+ * @retval VINF_SUCCESS on success.
+ * @retval VERR_BUFFER_OVERFLOW if the destination buffer is too small. The
+ * buffer will contain as much of the string as it can hold, fully
+ * terminated.
+ *
+ * @param pwszDst The destination buffer.
+ * @param cwcDst The size of the destination buffer in RTUTF16s.
+ * @param pwszSrc The source string. NULL is not OK.
+ * @param cwcSrcMax The maximum number of UTF-16 chars (not code
+ * points) to copy from the source string, not
+ * counting the terminator as usual.
+ */
+RTDECL(int) RTUtf16CatEx(PRTUTF16 pwszDst, size_t cwcDst, PCRTUTF16 pwszSrc, size_t cwcSrcMax);
+
+/**
* Performs a case sensitive string compare between two UTF-16 strings.
*
* @returns < 0 if the first string less than the second string.s
@@ -3291,7 +3452,20 @@ RTDECL(size_t) RTUtf16Len(PCRTUTF16 pwszString);
* @param pwsz2 Second UTF-16 string. Null is allowed.
* @remark This function will not make any attempt to validate the encoding.
*/
-RTDECL(int) RTUtf16Cmp(register PCRTUTF16 pwsz1, register PCRTUTF16 pwsz2);
+RTDECL(int) RTUtf16Cmp(PCRTUTF16 pwsz1, PCRTUTF16 pwsz2);
+
+/**
+ * Performs a case sensitive string compare between an UTF-16 string and a pure
+ * ASCII string.
+ *
+ * @returns < 0 if the first string less than the second string.s
+ * @returns 0 if the first string identical to the second string.
+ * @returns > 0 if the first string greater than the second string.
+ * @param pwsz1 First UTF-16 string. Null is allowed.
+ * @param psz2 Second string, pure ASCII. Null is allowed.
+ * @remark This function will not make any attempt to validate the encoding.
+ */
+RTDECL(int) RTUtf16CmpAscii(PCRTUTF16 pwsz1, const char *psz2);
/**
* Performs a case insensitive string compare between two UTF-16 strings.
@@ -3309,6 +3483,21 @@ RTDECL(int) RTUtf16Cmp(register PCRTUTF16 pwsz1, register PCRTUTF16 pwsz2);
RTDECL(int) RTUtf16ICmp(PCRTUTF16 pwsz1, PCRTUTF16 pwsz2);
/**
+ * Performs a case insensitive string compare between an UTF-16 string and an
+ * pure ASCII string.
+ *
+ * Since this compare only takes cares about the first 128 codepoints in
+ * unicode, no tables are needed and there aren't any real complications.
+ *
+ * @returns < 0 if the first string less than the second string.
+ * @returns 0 if the first string identical to the second string.
+ * @returns > 0 if the first string greater than the second string.
+ * @param pwsz1 First UTF-16 string. Null is allowed.
+ * @param psz2 Second string, pure ASCII. Null is allowed.
+ */
+RTDECL(int) RTUtf16ICmpAscii(PCRTUTF16 pwsz1, const char *psz2);
+
+/**
* Performs a case insensitive string compare between two UTF-16 strings
* using the current locale of the process (if applicable).
*
@@ -3803,6 +3992,24 @@ DECLINLINE(bool) RTUtf16IsSurrogatePair(RTUTF16 wcHigh, RTUTF16 wcLow)
&& RTUtf16IsLowSurrogate(wcLow);
}
+/**
+ * Formats a buffer stream as hex bytes.
+ *
+ * The default is no separating spaces or line breaks or anything.
+ *
+ * @returns IPRT status code.
+ * @retval VERR_INVALID_POINTER if any of the pointers are wrong.
+ * @retval VERR_BUFFER_OVERFLOW if the buffer is insufficent to hold the bytes.
+ *
+ * @param pwszBuf Output string buffer.
+ * @param cwcBuf The size of the output buffer in RTUTF16 units.
+ * @param pv Pointer to the bytes to stringify.
+ * @param cb The number of bytes to stringify.
+ * @param fFlags Combination of RTSTRPRINTHEXBYTES_F_XXX values.
+ * @sa RTStrPrintHexBytes.
+ */
+RTDECL(int) RTUtf16PrintHexBytes(PRTUTF16 pwszBuf, size_t cwcBuf, void const *pv, size_t cb, uint32_t fFlags);
+
/** @} */
@@ -3917,6 +4124,12 @@ RTDECL(int) RTLatin1ToUtf16ExTag(const char *pszString, size_t cchString,
/** @} */
+#ifndef ___iprt_nocrt_string_h
+# if defined(RT_OS_WINDOWS)
+RTDECL(void *) mempcpy(void *pvDst, const void *pvSrc, size_t cb);
+# endif
+#endif
+
RT_C_DECLS_END
diff --git a/include/iprt/time.h b/include/iprt/time.h
index 2981d9de6bd..a0021baf82e 100644
--- a/include/iprt/time.h
+++ b/include/iprt/time.h
@@ -513,6 +513,23 @@ DECLINLINE(bool) RTTimeSpecIsEqual(PCRTTIMESPEC pTime1, PCRTTIMESPEC pTime2)
return pTime1->i64NanosecondsRelativeToUnixEpoch == pTime2->i64NanosecondsRelativeToUnixEpoch;
}
+
+/**
+ * Compare two time specs.
+ *
+ * @returns 0 if equal, -1 if @a pLeft is smaller, 1 if @a pLeft is larger.
+ * @returns false they are not equal.
+ * @param pLeft The 1st time spec.
+ * @param pRight The 2nd time spec.
+ */
+DECLINLINE(int) RTTimeSpecCompare(PCRTTIMESPEC pLeft, PCRTTIMESPEC pRight)
+{
+ if (pLeft->i64NanosecondsRelativeToUnixEpoch == pRight->i64NanosecondsRelativeToUnixEpoch)
+ return 0;
+ return pLeft->i64NanosecondsRelativeToUnixEpoch < pRight->i64NanosecondsRelativeToUnixEpoch ? -1 : 1;
+}
+
+
/**
* Converts a time spec to a ISO date string.
*
diff --git a/include/iprt/types.h b/include/iprt/types.h
index 3c88ec22f65..722cef229b4 100644
--- a/include/iprt/types.h
+++ b/include/iprt/types.h
@@ -28,6 +28,7 @@
#include <iprt/cdefs.h>
#include <iprt/stdint.h>
+#include <iprt/stdarg.h>
/*
* Include standard C types.
@@ -735,129 +736,6 @@ typedef struct RTTIMESPEC *PRTTIMESPEC;
/** Pointer to a const time spec structure. */
typedef const struct RTTIMESPEC *PCRTTIMESPEC;
-/**
- * Generic pointer union.
- */
-typedef union RTPTRUNION
-{
- /** Pointer into the void... */
- void *pv;
- /** Pointer to char value. */
- char *pch;
- /** Pointer to char value. */
- unsigned char *puch;
- /** Pointer to a int value. */
- int *pi;
- /** Pointer to a unsigned int value. */
- unsigned int *pu;
- /** Pointer to a long value. */
- long *pl;
- /** Pointer to a long value. */
- unsigned long *pul;
- /** Pointer to a 8-bit unsigned value. */
- uint8_t *pu8;
- /** Pointer to a 16-bit unsigned value. */
- uint16_t *pu16;
- /** Pointer to a 32-bit unsigned value. */
- uint32_t *pu32;
- /** Pointer to a 64-bit unsigned value. */
- uint64_t *pu64;
-} RTPTRUNION;
-/** Pointer to a pointer union. */
-typedef RTPTRUNION *PRTPTRUNION;
-
-/**
- * Generic const pointer union.
- */
-typedef union RTCPTRUNION
-{
- /** Pointer into the void... */
- void const *pv;
- /** Pointer to char value. */
- char const *pch;
- /** Pointer to char value. */
- unsigned char const *puch;
- /** Pointer to a int value. */
- int const *pi;
- /** Pointer to a unsigned int value. */
- unsigned int const *pu;
- /** Pointer to a long value. */
- long const *pl;
- /** Pointer to a long value. */
- unsigned long const *pul;
- /** Pointer to a 8-bit unsigned value. */
- uint8_t const *pu8;
- /** Pointer to a 16-bit unsigned value. */
- uint16_t const *pu16;
- /** Pointer to a 32-bit unsigned value. */
- uint32_t const *pu32;
- /** Pointer to a 64-bit unsigned value. */
- uint64_t const *pu64;
-} RTCPTRUNION;
-/** Pointer to a const pointer union. */
-typedef RTCPTRUNION *PRTCPTRUNION;
-
-/**
- * Generic volatile pointer union.
- */
-typedef union RTVPTRUNION
-{
- /** Pointer into the void... */
- void volatile *pv;
- /** Pointer to char value. */
- char volatile *pch;
- /** Pointer to char value. */
- unsigned char volatile *puch;
- /** Pointer to a int value. */
- int volatile *pi;
- /** Pointer to a unsigned int value. */
- unsigned int volatile *pu;
- /** Pointer to a long value. */
- long volatile *pl;
- /** Pointer to a long value. */
- unsigned long volatile *pul;
- /** Pointer to a 8-bit unsigned value. */
- uint8_t volatile *pu8;
- /** Pointer to a 16-bit unsigned value. */
- uint16_t volatile *pu16;
- /** Pointer to a 32-bit unsigned value. */
- uint32_t volatile *pu32;
- /** Pointer to a 64-bit unsigned value. */
- uint64_t volatile *pu64;
-} RTVPTRUNION;
-/** Pointer to a const pointer union. */
-typedef RTVPTRUNION *PRTVPTRUNION;
-
-/**
- * Generic const volatile pointer union.
- */
-typedef union RTCVPTRUNION
-{
- /** Pointer into the void... */
- void const volatile *pv;
- /** Pointer to char value. */
- char const volatile *pch;
- /** Pointer to char value. */
- unsigned char const volatile *puch;
- /** Pointer to a int value. */
- int const volatile *pi;
- /** Pointer to a unsigned int value. */
- unsigned int const volatile *pu;
- /** Pointer to a long value. */
- long const volatile *pl;
- /** Pointer to a long value. */
- unsigned long const volatile *pul;
- /** Pointer to a 8-bit unsigned value. */
- uint8_t const volatile *pu8;
- /** Pointer to a 16-bit unsigned value. */
- uint16_t const volatile *pu16;
- /** Pointer to a 32-bit unsigned value. */
- uint32_t const volatile *pu32;
- /** Pointer to a 64-bit unsigned value. */
- uint64_t const volatile *pu64;
-} RTCVPTRUNION;
-/** Pointer to a const pointer union. */
-typedef RTCVPTRUNION *PRTCVPTRUNION;
/** @defgroup grp_rt_types_both Common Guest and Host Context Basic Types
@@ -1636,6 +1514,13 @@ typedef RTCCINTREG const *PCRTCCINTREG;
/** @} */
+
+/** Pointer to a big integer number. */
+typedef struct RTBIGNUM *PRTBIGNUM;
+/** Pointer to a const big integer number. */
+typedef struct RTBIGNUM const *PCRTBIGNUM;
+
+
/** Pointer to a critical section. */
typedef struct RTCRITSECT *PRTCRITSECT;
/** Pointer to a const critical section. */
@@ -1654,6 +1539,44 @@ typedef RTCONDVAR *PRTCONDVAR;
/** Nil condition variable handle. */
#define NIL_RTCONDVAR 0
+/** Cryptographic (certificate) store handle. */
+typedef R3R0PTRTYPE(struct RTCRSTOREINT *) RTCRSTORE;
+/** Pointer to a Cryptographic (certificate) store handle. */
+typedef RTCRSTORE *PRTCRSTORE;
+/** Nil Cryptographic (certificate) store handle. */
+#define NIL_RTCRSTORE 0
+
+/** Pointer to a const (store) certificate context. */
+typedef struct RTCRCERTCTX const *PCRTCRCERTCTX;
+
+/** Cryptographic message digest handle. */
+typedef R3R0PTRTYPE(struct RTCRDIGESTINT *) RTCRDIGEST;
+/** Pointer to a cryptographic message digest handle. */
+typedef RTCRDIGEST *PRTCRDIGEST;
+/** NIL cryptographic message digest handle. */
+#define NIL_RTCRDIGEST (0)
+
+/** Public key encryption schema handle. */
+typedef R3R0PTRTYPE(struct RTCRPKIXENCRYPTIONINT *) RTCRPKIXENCRYPTION;
+/** Pointer to a public key encryption schema handle. */
+typedef RTCRPKIXENCRYPTION *PRTCRPKIXENCRYPTION;
+/** NIL publick key encryption schema handle */
+#define NIL_RTCRPKIXENCRYPTION (0)
+
+/** Public key signature schema handle. */
+typedef R3R0PTRTYPE(struct RTCRPKIXSIGNATUREINT *) RTCRPKIXSIGNATURE;
+/** Pointer to a public key signature schema handle. */
+typedef RTCRPKIXSIGNATURE *PRTCRPKIXSIGNATURE;
+/** NIL publick key signature schema handle */
+#define NIL_RTCRPKIXSIGNATURE (0)
+
+/** X.509 certificate paths builder & validator handle. */
+typedef R3R0PTRTYPE(struct RTCRX509CERTPATHSINT *) RTCRX509CERTPATHS;
+/** Pointer to a certificate paths builder & validator handle. */
+typedef RTCRX509CERTPATHS *PRTCRX509CERTPATHS;
+/** Nil certificate paths builder & validator handle. */
+#define NIL_RTCRX509CERTPATHS 0
+
/** File handle. */
typedef R3R0PTRTYPE(struct RTFILEINT *) RTFILE;
/** Pointer to file handle. */
@@ -1676,7 +1599,7 @@ typedef RTFILEAIOCTX *PRTFILEAIOCTX;
#define NIL_RTFILEAIOCTX 0
/** Loader module handle. */
-typedef R3PTRTYPE(struct RTLDRMODINTERNAL *) RTLDRMOD;
+typedef R3R0PTRTYPE(struct RTLDRMODINTERNAL *) RTLDRMOD;
/** Pointer to a loader module handle. */
typedef RTLDRMOD *PRTLDRMOD;
/** Nil loader module handle. */
@@ -2253,6 +2176,17 @@ typedef DECLCALLBACK(int) FNRTPROGRESS(unsigned uPrecentage, void *pvUser);
/** Pointer to a generic progress callback function, FNRTPROCESS(). */
typedef FNRTPROGRESS *PFNRTPROGRESS;
+/**
+ * Generic vprintf-like callback function for dumpers.
+ *
+ * @param pvUser User argument.
+ * @param pszFormat The format string.
+ * @param va Arguments for the format string.
+ */
+typedef DECLCALLBACK(void) FNRTDUMPPRINTFV(void *pvUser, const char *pszFormat, va_list va);
+/** Pointer to a generic printf-like function for dumping. */
+typedef FNRTDUMPPRINTFV *PFNRTDUMPPRINTFV;
+
/**
* A point in a two dimentional coordinate system.
@@ -2385,6 +2319,41 @@ typedef struct RTLOCKVALSRCPOS const *PCRTLOCKVALSRCPOS;
/**
+ * Digest types.
+ */
+typedef enum RTDIGESTTYPE
+{
+ /** Invalid digest value. */
+ RTDIGESTTYPE_INVALID = 0,
+ /** Unknown digest type. */
+ RTDIGESTTYPE_UNKNOWN,
+ /** CRC32 checksum. */
+ RTDIGESTTYPE_CRC32,
+ /** CRC64 checksum. */
+ RTDIGESTTYPE_CRC64,
+ /** MD2 checksum (unsafe!). */
+ RTDIGESTTYPE_MD2,
+ /** MD4 checksum (unsafe!!). */
+ RTDIGESTTYPE_MD4,
+ /** MD5 checksum (unsafe!). */
+ RTDIGESTTYPE_MD5,
+ /** SHA-1 checksum (unsafe!). */
+ RTDIGESTTYPE_SHA1,
+ /** SHA-224 checksum. */
+ RTDIGESTTYPE_SHA224,
+ /** SHA-256 checksum. */
+ RTDIGESTTYPE_SHA256,
+ /** SHA-384 checksum. */
+ RTDIGESTTYPE_SHA384,
+ /** SHA-512 checksum. */
+ RTDIGESTTYPE_SHA512,
+ /** End of valid types. */
+ RTDIGESTTYPE_END,
+ /** Usual 32-bit type blowup. */
+ RTDIGESTTYPE_32BIT_HACK = 0x7fffffff
+} RTDIGESTTYPE;
+
+/**
* Process exit codes.
*/
typedef enum RTEXITCODE
@@ -2421,6 +2390,165 @@ typedef RTRANGE *PRTRANGE;
/** Pointer to a readonly range descriptor. */
typedef const RTRANGE *PCRTRANGE;
+
+/**
+ * Generic pointer union.
+ */
+typedef union RTPTRUNION
+{
+ /** Pointer into the void... */
+ void *pv;
+ /** As a signed integer. */
+ intptr_t i;
+ /** As an unsigned integer. */
+ intptr_t u;
+ /** Pointer to char value. */
+ char *pch;
+ /** Pointer to char value. */
+ unsigned char *puch;
+ /** Pointer to a int value. */
+ int *pi;
+ /** Pointer to a unsigned int value. */
+ unsigned int *pu;
+ /** Pointer to a long value. */
+ long *pl;
+ /** Pointer to a long value. */
+ unsigned long *pul;
+ /** Pointer to a 8-bit unsigned value. */
+ uint8_t *pu8;
+ /** Pointer to a 16-bit unsigned value. */
+ uint16_t *pu16;
+ /** Pointer to a 32-bit unsigned value. */
+ uint32_t *pu32;
+ /** Pointer to a 64-bit unsigned value. */
+ uint64_t *pu64;
+ /** Pointer to a UTF-16 character. */
+ PRTUTF16 pwc;
+ /** Pointer to a UUID character. */
+ PRTUUID pUuid;
+} RTPTRUNION;
+/** Pointer to a pointer union. */
+typedef RTPTRUNION *PRTPTRUNION;
+
+/**
+ * Generic const pointer union.
+ */
+typedef union RTCPTRUNION
+{
+ /** Pointer into the void... */
+ void const *pv;
+ /** As a signed integer. */
+ intptr_t i;
+ /** As an unsigned integer. */
+ intptr_t u;
+ /** Pointer to char value. */
+ char const *pch;
+ /** Pointer to char value. */
+ unsigned char const *puch;
+ /** Pointer to a int value. */
+ int const *pi;
+ /** Pointer to a unsigned int value. */
+ unsigned int const *pu;
+ /** Pointer to a long value. */
+ long const *pl;
+ /** Pointer to a long value. */
+ unsigned long const *pul;
+ /** Pointer to a 8-bit unsigned value. */
+ uint8_t const *pu8;
+ /** Pointer to a 16-bit unsigned value. */
+ uint16_t const *pu16;
+ /** Pointer to a 32-bit unsigned value. */
+ uint32_t const *pu32;
+ /** Pointer to a 64-bit unsigned value. */
+ uint64_t const *pu64;
+ /** Pointer to a UTF-16 character. */
+ PCRTUTF16 pwc;
+ /** Pointer to a UUID character. */
+ PCRTUUID pUuid;
+} RTCPTRUNION;
+/** Pointer to a const pointer union. */
+typedef RTCPTRUNION *PRTCPTRUNION;
+
+/**
+ * Generic volatile pointer union.
+ */
+typedef union RTVPTRUNION
+{
+ /** Pointer into the void... */
+ void volatile *pv;
+ /** As a signed integer. */
+ intptr_t i;
+ /** As an unsigned integer. */
+ intptr_t u;
+ /** Pointer to char value. */
+ char volatile *pch;
+ /** Pointer to char value. */
+ unsigned char volatile *puch;
+ /** Pointer to a int value. */
+ int volatile *pi;
+ /** Pointer to a unsigned int value. */
+ unsigned int volatile *pu;
+ /** Pointer to a long value. */
+ long volatile *pl;
+ /** Pointer to a long value. */
+ unsigned long volatile *pul;
+ /** Pointer to a 8-bit unsigned value. */
+ uint8_t volatile *pu8;
+ /** Pointer to a 16-bit unsigned value. */
+ uint16_t volatile *pu16;
+ /** Pointer to a 32-bit unsigned value. */
+ uint32_t volatile *pu32;
+ /** Pointer to a 64-bit unsigned value. */
+ uint64_t volatile *pu64;
+ /** Pointer to a UTF-16 character. */
+ RTUTF16 volatile *pwc;
+ /** Pointer to a UUID character. */
+ RTUUID volatile *pUuid;
+} RTVPTRUNION;
+/** Pointer to a const pointer union. */
+typedef RTVPTRUNION *PRTVPTRUNION;
+
+/**
+ * Generic const volatile pointer union.
+ */
+typedef union RTCVPTRUNION
+{
+ /** Pointer into the void... */
+ void const volatile *pv;
+ /** As a signed integer. */
+ intptr_t i;
+ /** As an unsigned integer. */
+ intptr_t u;
+ /** Pointer to char value. */
+ char const volatile *pch;
+ /** Pointer to char value. */
+ unsigned char const volatile *puch;
+ /** Pointer to a int value. */
+ int const volatile *pi;
+ /** Pointer to a unsigned int value. */
+ unsigned int const volatile *pu;
+ /** Pointer to a long value. */
+ long const volatile *pl;
+ /** Pointer to a long value. */
+ unsigned long const volatile *pul;
+ /** Pointer to a 8-bit unsigned value. */
+ uint8_t const volatile *pu8;
+ /** Pointer to a 16-bit unsigned value. */
+ uint16_t const volatile *pu16;
+ /** Pointer to a 32-bit unsigned value. */
+ uint32_t const volatile *pu32;
+ /** Pointer to a 64-bit unsigned value. */
+ uint64_t const volatile *pu64;
+ /** Pointer to a UTF-16 character. */
+ RTUTF16 const volatile *pwc;
+ /** Pointer to a UUID character. */
+ RTUUID const volatile *pUuid;
+} RTCVPTRUNION;
+/** Pointer to a const pointer union. */
+typedef RTCVPTRUNION *PRTCVPTRUNION;
+
+
+
#ifdef __cplusplus
/**
* Strict type validation helper class.
diff --git a/include/iprt/uni.h b/include/iprt/uni.h
index a1161db1ad2..0ffdc631872 100644
--- a/include/iprt/uni.h
+++ b/include/iprt/uni.h
@@ -417,6 +417,59 @@ DECLINLINE(RTUNICP) RTUniCpToLower(RTUNICP CodePoint)
RTDECL(void) RTUniFree(PRTUNICP pusz);
+/**
+ * Checks if a code point valid.
+ *
+ * Any code point (defined or not) within the 17 unicode planes (0 thru 16),
+ * except surrogates will be considered valid code points by this function.
+ *
+ * @returns true if in range, false if not.
+ * @param CodePoint The unicode code point to validate.
+ */
+DECLINLINE(bool) RTUniCpIsValid(RTUNICP CodePoint)
+{
+ return CodePoint <= 0x00d7ff
+ || ( CodePoint <= 0x10ffff
+ && CodePoint >= 0x00e000);
+}
+
+
+/**
+ * Checks if the given code point is in the BMP range.
+ *
+ * Surrogates are not considered in the BMP range by this function.
+ *
+ * @returns true if in BMP, false if not.
+ * @param CodePoint The unicode code point to consider.
+ */
+DECLINLINE(bool) RTUniCpIsBMP(RTUNICP CodePoint)
+{
+ return CodePoint <= 0xd7ff
+ || ( CodePoint <= 0xffff
+ && CodePoint >= 0xe000);
+}
+
+
+/**
+ * Folds a unicode code point to lower case.
+ *
+ * @returns Folded code point.
+ * @param CodePoint The unicode code point to fold.
+ */
+DECLINLINE(size_t) RTUniCpCalcUtf8Len(RTUNICP CodePoint)
+{
+ if (CodePoint < 0x80)
+ return 1;
+ return 2
+ + (CodePoint >= 0x00000800)
+ + (CodePoint >= 0x00010000)
+ + (CodePoint >= 0x00200000)
+ + (CodePoint >= 0x04000000)
+ + (CodePoint >= 0x80000000) /* illegal */;
+}
+
+
+
RT_C_DECLS_END
/** @} */
diff --git a/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPVdma.cpp b/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPVdma.cpp
index 142941f4ef9..a7392161100 100644
--- a/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPVdma.cpp
+++ b/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPVdma.cpp
@@ -1262,10 +1262,7 @@ static NTSTATUS vboxVdmaProcessVReg(PVBOXMP_DEVEXT pDevExt,
NTSTATUS vboxVdmaTexPresentSetAlloc(PVBOXMP_DEVEXT pDevExt, const VBOXWDDM_ALLOC_DATA *pAllocData)
{
- VBOXMP_CRPACKER CrPacker;
- VBoxMpCrPackerInit(&CrPacker);
uint32_t u32CrConClientID;
-
NTSTATUS Status = vboxVdmaCrCtlGetDefaultClientId(pDevExt, &u32CrConClientID);
if (!NT_SUCCESS(Status))
{
@@ -1273,6 +1270,11 @@ NTSTATUS vboxVdmaTexPresentSetAlloc(PVBOXMP_DEVEXT pDevExt, const VBOXWDDM_ALLOC
return Status;
}
+ VBOXMP_CRPACKER *pCrPacker = (VBOXMP_CRPACKER *)RTMemTmpAlloc(sizeof(*pCrPacker));
+ if (!pCrPacker)
+ return STATUS_NO_MEMORY;
+ VBoxMpCrPackerInit(pCrPacker);
+
RECT Rect;
Rect.left = 0;
Rect.top = 0;
@@ -1280,21 +1282,23 @@ NTSTATUS vboxVdmaTexPresentSetAlloc(PVBOXMP_DEVEXT pDevExt, const VBOXWDDM_ALLOC
Rect.bottom = pAllocData->SurfDesc.height;
if (pDevExt->fCmdVbvaEnabled)
- return vboxVdmaTexPresentSubmit(pDevExt, &CrPacker, u32CrConClientID, pAllocData->hostID, pAllocData->SurfDesc.VidPnSourceId, 0, 0, 1, (RTRECT*)&Rect);
-
- if (pDevExt->fTexPresentEnabled)
+ Status = vboxVdmaTexPresentSubmit(pDevExt, pCrPacker, u32CrConClientID, pAllocData->hostID, pAllocData->SurfDesc.VidPnSourceId, 0, 0, 1, (RTRECT*)&Rect);
+ else if (pDevExt->fTexPresentEnabled)
{
VBOXVDMAPIPE_RECTS RectInfo;
RectInfo.ContextRect = Rect;
RectInfo.UpdateRects.cRects = 1;
RectInfo.UpdateRects.aRects[0] = Rect;
- return vboxVdmaProcessVRegTexPresent(pDevExt, &CrPacker, u32CrConClientID,
+ Status = vboxVdmaProcessVRegTexPresent(pDevExt, pCrPacker, u32CrConClientID,
pAllocData, pAllocData,
&Rect, &RectInfo);
}
+ else
+ Status = STATUS_NOT_IMPLEMENTED;
- return STATUS_NOT_IMPLEMENTED;
+ RTMemTmpFree(pCrPacker);
+ return Status;
}
static NTSTATUS vboxVdmaProcessVRegCmd(PVBOXMP_DEVEXT pDevExt, VBOXWDDM_CONTEXT *pContext,
diff --git a/src/VBox/Frontends/VirtualBox/Makefile.kmk b/src/VBox/Frontends/VirtualBox/Makefile.kmk
index c33570e987a..df5aae84623 100644
--- a/src/VBox/Frontends/VirtualBox/Makefile.kmk
+++ b/src/VBox/Frontends/VirtualBox/Makefile.kmk
@@ -56,6 +56,7 @@ VirtualBoxHardened_TEMPLATE = VBOXR3HARDENEDEXE
VirtualBoxHardened_SOURCES = src/hardenedmain.cpp
VirtualBoxHardened_NAME = VirtualBox
VirtualBoxHardened_INST.darwin = $(INST_BIN)VirtualBox $(INST_BIN)VirtualBoxVM
+VirtualBoxHardened_LDFLAGS.win = /SUBSYSTEM:$(if-expr "$(KBUILD_TYPE)" != "release",console,windows)
#
diff --git a/src/VBox/Frontends/VirtualBox/src/main.cpp b/src/VBox/Frontends/VirtualBox/src/main.cpp
index 67c5b5433c0..e2a86758800 100644
--- a/src/VBox/Frontends/VirtualBox/src/main.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/main.cpp
@@ -637,9 +637,11 @@ extern "C" DECLEXPORT(void) TrustedError(const char *pszWhere, SUPINITOP enmWhat
/* Prepare the error-message: */
QString strTitle = QApplication::tr("VirtualBox - Error In %1").arg(pszWhere);
- char msgBuf[1024];
- vsprintf(msgBuf, pszMsgFmt, va);
- QString strText = QApplication::tr("<html><b>%1 (rc=%2)</b><br/><br/>").arg(msgBuf).arg(rc);
+
+ char szMsgBuf[1024];
+ RTStrPrintfV(szMsgBuf, sizeof(szMsgBuf), pszMsgFmt, va);
+ QString strText = QApplication::tr("<html><b>%1 (rc=%2)</b><br/><br/>").arg(szMsgBuf).arg(rc);
+
switch (enmWhat)
{
case kSupInitOp_Driver:
@@ -651,6 +653,7 @@ extern "C" DECLEXPORT(void) TrustedError(const char *pszWhere, SUPINITOP enmWhat
break;
# ifdef RT_OS_LINUX
case kSupInitOp_IPRT:
+ case kSupInitOp_Misc:
if (rc == VERR_NO_MEMORY)
strText += g_QStrHintLinuxNoMemory;
else
@@ -672,6 +675,7 @@ extern "C" DECLEXPORT(void) TrustedError(const char *pszWhere, SUPINITOP enmWhat
/* no hints here */
break;
}
+
strText += "</html>";
# ifdef RT_OS_LINUX
diff --git a/src/VBox/HostDrivers/Support/Makefile.kmk b/src/VBox/HostDrivers/Support/Makefile.kmk
index c336e51bfcb..0486cbbce19 100644
--- a/src/VBox/HostDrivers/Support/Makefile.kmk
+++ b/src/VBox/HostDrivers/Support/Makefile.kmk
@@ -30,7 +30,11 @@ include $(KBUILD_PATH)/subheader.kmk
#
# Targets
#
-LIBRARIES += SUPR3 SUPR3Static SUPR3HardenedStatic
+LIBRARIES += SUPR3 SUPR3Static
+ifdef VBOX_WITH_HARDENING
+ LIBRARIES += SUPR3HardenedStatic
+endif
+DLLS.win += VBoxSupLib
ifdef VBOX_WITH_32_ON_64_MAIN_API
LIBRARIES += SUPR3-x86
endif
@@ -69,11 +73,70 @@ if !defined(VBOX_ONLY_DOCS) \
endif
endif # !VBOX_ONLY_DOCS && !VBOX_ONLY_EXTPACKS && !VBOX_ONLY_VALIDATIONKIT
+#
+# Authenticode related trust anchors and certificates -> .cpp
+#
+VBOX_SUP_WIN_CERTS_FILE = $(SUPR3_0_OUTDIR)/TrustAnchorsAndCerts.cpp
+VBOX_SUP_WIN_CERTS := \
+ SpcRootMicrosoft0=SpcRoot-MicrosoftAuthenticodeTmRootAuthority-01.taf \
+ SpcRootMicrosoft1=SpcRoot-MicrosoftRootAuthority-00c1008b3c3c8811d13ef663ecdf40.taf \
+ SpcRootMicrosoft2=SpcRoot-MicrosoftRootCertificateAuthority-79ad16a14aa0a5ad4c7358f407132e65.taf \
+ SpcRootMicrosoft3=SpcRoot-MicrosoftRootCertificateAuthority2010-28cc3a25bfba44ac449a9b586b4339aa.taf \
+ SpcRootMicrosoft4=SpcRoot-MicrosoftRootCertificateAuthority2011-3f8bc8b5fc9fb29643b569d66c42e144.taf \
+ SpcRootMicrosoft5=SpcRoot-MicrosoftDigitalMediaAuthority2005-6eff330eb6e7569740680870104baaba.taf \
+ NtRootMicrosoft6=NtRoot-MicrosoftCodeVerificationRoot-729404101f3e0ca347837fca175a8438.taf \
+ TimeRootMicrosoft0=Timestamp-CopyrightC1997MicrosoftCorp-01.taf \
+ TrustedCertVBox0=Trusted-OracleCorporationVirtualBox-51ca009816fdbd80f120e015ee75823e.taf
+VBOX_SUP_WIN_CERT_NAMES := $(foreach cert,$(VBOX_SUP_WIN_CERTS),$(firstword $(subst =,$(SPACE) ,$(cert))))
+VBOX_PATH_SUPR3_CERTIFICATES := $(PATH_SUB_CURRENT)/win/Certificates
+
+# 1=name, 2=filter, 3=buildcert?.
+if "$(KBUILD_TARGET)" == "win" && defined(VBOX_WITH_HARDENING)
+ VBOX_SUP_GEN_CERT_MACRO = 'SUPTAENTRY const g_aSUP$(1)TAs[] =' '{' \
+ $(if-expr "$(3)" == "",,' SUPTAENTRY_GEN(g_abSUPBuildCert),') \
+ $(foreach certnm,$(filter $(2),$(VBOX_SUP_WIN_CERT_NAMES)), ' SUPTAENTRY_GEN(g_abSUP$(certnm)),') \
+ '};' 'unsigned const g_cSUP$(1)TAs = RT_ELEMENTS(g_aSUP$(1)TAs);' '' ''
+else
+ VBOX_SUP_GEN_CERT_MACRO = 'SUPTAENTRY const g_aSUP$(1)TAs[] =' '{' \
+ $(foreach certnm,$(filter $(2),$(VBOX_SUP_WIN_CERT_NAMES)), ' SUPTAENTRY_GEN(g_abSUP$(certnm)),') \
+ '};' 'unsigned const g_cSUP$(1)TAs = RT_ELEMENTS(g_aSUP$(1)TAs);' '' ''
+endif
+
+$$(VBOX_SUP_WIN_CERTS_FILE): $(MAKEFILE_CURRENT) \
+ $(foreach cert,$(VBOX_SUP_WIN_CERTS),$(VBOX_PATH_SUPR3_CERTIFICATES)/$(lastword $(subst =,$(SPACE) ,$(cert)))) \
+ $(VBOX_BIN2C) \
+ $(if-expr "$(KBUILD_TARGET)" == "win" && defined(VBOX_WITH_HARDENING),$(VBOX_RTSIGNTOOL)) \
+ | $$(dir $$@)
+ $(QUIET)$(RM) -f -- $@ $@.cer
+ $(QUIET)$(APPEND) -n "$@" \
+ '' \
+ '#include <VBox/sup.h>' \
+ ''
+ $(foreach cert,$(VBOX_SUP_WIN_CERTS), $(NLTAB)$(VBOX_BIN2C) -ascii --append \
+ "SUP$(firstword $(subst =,$(SP) ,$(cert)))" \
+ "$(VBOX_PATH_SUPR3_CERTIFICATES)/$(lastword $(subst =,$(SP) ,$(cert)))" \
+ "$@")
+# The build certificate.
+if "$(KBUILD_TARGET)" == "win" && defined(VBOX_WITH_HARDENING)
+ $(VBOX_RTSIGNTOOL) extract-exe-signer-cert --exe $(VBOX_RTSIGNTOOL) --output "$@.cer" --der
+ $(VBOX_BIN2C) -ascii --append SUPBuildCert "$@.cer" $@
+ $(QUIET)$(RM) -f -- $@.cer
+endif
+# Generate certificate lists.
+ $(QUIET)$(APPEND) -n "$@" '' \
+ $(call VBOX_SUP_GEN_CERT_MACRO,All,%,build) \
+ $(call VBOX_SUP_GEN_CERT_MACRO,SpcRoot,SpcRoot%) \
+ $(call VBOX_SUP_GEN_CERT_MACRO,NtKernelRoot,NtRoot%) \
+ $(call VBOX_SUP_GEN_CERT_MACRO,Timestamp,TimeRoot%) \
+ $(call VBOX_SUP_GEN_CERT_MACRO,Trusted,TrustedCert%,build)
+
+tst: $(VBOX_SUP_WIN_CERTS_FILE)
+
#
# The Ring-3 Support Library (this is linked into the IPRT dll, VBoxRT).
#
-SUPR3_TEMPLATE = VBOXR3NP
+SUPR3_TEMPLATE = VBOXR3NP
SUPR3_DEFS = \
IN_SUP_R3 IN_RT_R3 \
$(if $(VBOX_WITH_SUPSVC),VBOX_WITH_SUPSVC) \
@@ -87,32 +150,216 @@ SUPR3_SOURCES = \
SUPLibTracerA.asm \
SUPR3HardenedIPRT.cpp \
SUPR3HardenedVerify.cpp \
- $(KBUILD_TARGET)/SUPLib-$(KBUILD_TARGET).cpp
+ $(KBUILD_TARGET)/SUPLib-$(KBUILD_TARGET).cpp \
+ $(VBOX_SUP_WIN_CERTS_FILE)
+ifdef VBOX_WITH_HARDENING
+ SUPR3_SOURCES.win = \
+ win/SUPHardenedVerifyImage-win.cpp
+endif
SUPR3-x86_TEMPLATE = VBoxR3Dll-x86
SUPR3-x86_EXTENDS = SUPR3
#
-# Static version of SUPR3.
+# Static version of SUPR3. This is more of a stub than anything else in a
+# hardened build, at least on windows.
#
SUPR3Static_TEMPLATE = VBOXR3STATIC
SUPR3Static_EXTENDS = SUPR3
+SUPR3Static_DEFS = $(SUPR3_DEFS) IN_SUP_R3_STATIC
+SUPR3Static_SOURCES.win = $(filter-out win/SUPHardenedVerifyImage-win.cpp, $(SUPR3_SOURCES.win))
+
#
# The static part of the hardened support library (ring-3).
#
+VBOX_PATH_RUNTIME_SRC ?= $(PATH_ROOT)/src/VBox/Runtime
SUPR3HardenedStatic_TEMPLATE = VBOXR3HARDENEDLIB
SUPR3HardenedStatic_DEFS = IN_SUP_HARDENED_R3
SUPR3HardenedStatic_DEFS += \
$(if $(VBOX_WITH_SUPSVC),VBOX_WITH_SUPSVC,) \
$(if $(VBOX_WITH_MAIN),VBOX_WITH_MAIN,) \
- $(if $(VBOX_WITH_RAW_MODE),VBOX_WITH_RAW_MODE,)
+ $(if $(VBOX_WITH_RAW_MODE),VBOX_WITH_RAW_MODE,) \
+ $(if $(VBOX_WITHOUT_DEBUGGER_CHECKS),VBOX_WITHOUT_DEBUGGER_CHECKS,)
+ifdef VBOX_WITH_VISTA_NO_SP
+ SUPR3HardenedStatic_DEFS.win += VBOX_WITH_VISTA_NO_SP
+endif
SUPR3HardenedStatic_INCS = .
SUPR3HardenedStatic_SOURCES = \
SUPR3HardenedMain.cpp \
SUPR3HardenedVerify.cpp \
+ SUPR3HardenedNoCrt.cpp \
$(KBUILD_TARGET)/SUPLib-$(KBUILD_TARGET).cpp
+SUPR3HardenedStatic_SOURCES.win = \
+ win/SUPR3HardenedMain-win.cpp \
+ win/SUPR3HardenedMainA-win.asm \
+ win/SUPHardenedVerifyProcess-win.cpp \
+ win/SUPHardenedVerifyImage-win.cpp \
+ $(VBOX_SUP_WIN_CERTS_FILE)
+
+if1of ($(KBUILD_TARGET),win) ## @todo some of this move up.
+ SUPR3HardenedStatic_SDKS += VBoxOpenSslHardened
+ SUPR3HardenedStatic_DEFS += IN_RT IN_RT_R3 IN_RT_STATIC IPRT_NO_CRT RT_WITH_NOCRT_ALIASES LOG_DISABLED IPRT_NO_ERROR_DATA
+ SUPR3HardenedStatic_DEFS.win += LDR_ONLY_PE __STRALIGN_H_
+
+ SUPR3HardenedStatic_INCS += $(PATH_ROOT)/include/iprt/nocrt $(VBOX_PATH_RUNTIME_SRC)/include
+
+ SUPR3HardenedStatic_SOURCES += \
+ $(VBOX_PATH_RUNTIME_SRC)/common/ldr/ldr.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/ldr/ldrEx.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/ldr/ldrPE.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/asn1/asn1-basics.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/asn1/asn1-cursor.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/asn1/asn1-default-allocator.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/asn1/asn1-dump.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/asn1/asn1-encode.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/asn1/asn1-ut-bitstring.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/asn1/asn1-ut-bitstring-decode.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/asn1/asn1-ut-boolean.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/asn1/asn1-ut-boolean-decode.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/asn1/asn1-ut-core.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/asn1/asn1-ut-core-decode.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/asn1/asn1-ut-dyntype.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/asn1/asn1-ut-dyntype-decode.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/asn1/asn1-ut-integer.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/asn1/asn1-ut-integer-decode.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/asn1/asn1-ut-null.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/asn1/asn1-ut-null-decode.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/asn1/asn1-ut-objid.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/asn1/asn1-ut-objid-decode.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/asn1/asn1-ut-octetstring.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/asn1/asn1-ut-octetstring-decode.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/asn1/asn1-ut-string.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/asn1/asn1-ut-string-decode.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/asn1/asn1-ut-time.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/asn1/asn1-ut-time-decode.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/crypto/digest-core.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/crypto/digest-builtin.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/crypto/pkcs7-asn1-decoder.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/crypto/pkcs7-core.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/crypto/pkcs7-init.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/crypto/pkcs7-sanity.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/crypto/pkcs7-verify.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/crypto/pkix-signature-builtin.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/crypto/pkix-signature-core.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/crypto/pkix-signature-rsa.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/crypto/pkix-verify.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/crypto/pkix-util.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/crypto/rsa-asn1-decoder.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/crypto/rsa-core.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/crypto/rsa-init.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/crypto/rsa-sanity.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/crypto/spc-asn1-decoder.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/crypto/spc-core.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/crypto/spc-init.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/crypto/spc-sanity.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/crypto/x509-asn1-decoder.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/crypto/x509-certpaths.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/crypto/x509-core.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/crypto/x509-init.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/crypto/x509-sanity.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/crypto/x509-verify.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/crypto/store.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/crypto/store-inmem.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/crypto/taf-asn1-decoder.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/crypto/taf-core.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/crypto/taf-init.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/crypto/taf-sanity.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/checksum/md2.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/checksum/md5.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/checksum/sha1.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/checksum/sha256.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/checksum/sha512.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/checksum/md2str.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/checksum/md5str.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/checksum/sha1str.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/checksum/sha256str.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/checksum/sha512str.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/err/errinfo.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/path/RTPathChangeToUnixSlashes.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/path/RTPathExt.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/string/RTStrPrintHexBytes.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/string/RTUtf16PrintHexBytes.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/string/RTUtf16ICmpAscii.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/string/strstrip.cpp \
+ \
+ $(VBOX_PATH_RUNTIME_SRC)/common/err/errmsg.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/math/bignum.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/misc/RTAssertMsg1Weak.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/misc/RTAssertMsg2Weak.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/misc/RTAssertMsg2WeakV.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/string/memchr.asm \
+ $(VBOX_PATH_RUNTIME_SRC)/common/string/memcmp.asm \
+ $(VBOX_PATH_RUNTIME_SRC)/common/string/memcpy.asm \
+ $(VBOX_PATH_RUNTIME_SRC)/common/string/memmove.asm \
+ $(VBOX_PATH_RUNTIME_SRC)/common/string/mempcpy.asm \
+ $(VBOX_PATH_RUNTIME_SRC)/common/string/memset.asm \
+ $(VBOX_PATH_RUNTIME_SRC)/common/string/RTStrCat.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/string/RTStrCmp.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/string/RTStrCopy.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/string/RTStrNCmp.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/string/RTStrNLen.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/string/strchr.asm \
+ $(VBOX_PATH_RUNTIME_SRC)/common/string/strcmp.asm \
+ $(VBOX_PATH_RUNTIME_SRC)/common/string/strcpy.asm \
+ $(VBOX_PATH_RUNTIME_SRC)/common/string/strformat.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/string/strformatrt.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/string/strformattype.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/string/stringalloc.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/string/strlen.asm \
+ $(VBOX_PATH_RUNTIME_SRC)/common/string/strncmp.asm \
+ $(VBOX_PATH_RUNTIME_SRC)/common/string/strncpy.asm \
+ $(VBOX_PATH_RUNTIME_SRC)/common/string/strprintf.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/string/strtonum.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/string/utf-16.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/string/utf-8.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/string/utf-8-case.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/string/unidata-upper.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/string/unidata-lower.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/common/time/time.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/generic/RTAssertShouldPanic-generic.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/generic/memsafer-generic.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/generic/uuid-generic.cpp \
+
+
+ SUPR3HardenedStatic_SOURCES.win += \
+ win/SUPR3HardenedNoCrt-win.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/nt/RTErrConvertFromNtStatus.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/win/RTErrConvertFromWin32.cpp \
+ $(VBOX_PATH_RUNTIME_SRC)/win/errmsgwin.cpp
+
+ # Add necessary compiler specific files from libcmt.lib and the lib dir.
+ ifeq ($(KBUILD_TARGET),win)
+ SUPR3HardenedStatic_VBOX_LIBC_OBJS = chkstk.obj
+ ifeq ($(KBUILD_TARGET_ARCH),x86)
+ SUPR3HardenedStatic_VBOX_LIBC_OBJS += alloca16.obj
+ endif
+ SUPR3HardenedStatic_SOURCES.win += $(addprefix $(SUPR3HardenedStatic_0_OUTDIR)/,$(SUPR3HardenedStatic_VBOX_LIBC_OBJS))
+
+ $(addprefix $$(SUPR3HardenedStatic_0_OUTDIR)/,$(SUPR3HardenedStatic_VBOX_LIBC_OBJS)): \
+ $$(PATH_TOOL_$(TEMPLATE_VBOXR3EXE_TOOL.win.$(KBUILD_TARGET_ARCH))_LIB)/libcmt.lib | $$(dir $$@)
+ $(TOOL_$(TEMPLATE_VBOXR3HARDENEDEXE_TOOL.win.$(KBUILD_TARGET_ARCH))_AR) "$<" \
+ /EXTRACT:`$(TOOL_$(TEMPLATE_VBOXR3HARDENEDEXE_TOOL.win.$(KBUILD_TARGET_ARCH))_AR) "$<" /LIST \
+ | $(SED_EXT) -n -e '/$(notdir $@)/p'` \
+ "/OUT:$@"
+ endif
+endif
+
+
+#
+# VBoxSupLib - Windows DLL for catching thread creation and termination.
+#
+VBoxSupLib_TEMPLATE = $(if "$(KBUILD_TARGET)" == "win",VBOXR3HARDENEDLIB,VBOXR3)
+VBoxSupLib_LDFLAGS.win.amd64 = -Entry:DllMainEntrypoint
+VBoxSupLib_LDFLAGS.win.x86 = -Entry:DllMainEntrypoint
+VBoxSupLib_DEFS = \
+ $(if $(VBOX_WITHOUT_DEBUGGER_CHECKS),VBOX_WITHOUT_DEBUGGER_CHECKS,)
+VBoxSupLib_SOURCES = \
+ $(KBUILD_TARGET)/VBoxSupLib-$(KBUILD_TARGET).cpp
+VBoxSupLib_LIBS.win = \
+ $(SUPR3HardenedStatic_1_INS_TARGET)
+
#
# VBoxSupSvc - The system wide service/daemon.
@@ -262,11 +509,17 @@ if1of ($(KBUILD_TARGET), darwin linux solaris win)
VBoxDrv_INST.darwin = $(INST_VBOXDRV)Contents/MacOS/
VBoxDrv_DEBUG_INST.darwin= $(patsubst %/,%,$(INST_VBOXDRV))
VBoxDrv_SDKS.win = ReorderCompilerIncs $(VBOX_WINDDK) $(VBOX_WINPSDK)INCS
+ ifdef VBOX_WITH_HARDENING
+ VBoxDrv_SDKS.win += VBoxOpenSslHardened
+ endif
VBoxDrv_DEFS := IN_RT_R0 IN_SUP_R0 SUPDRV_WITH_RELEASE_LOGGER VBOX_SVN_REV=$(VBOX_SVN_REV)
ifdef VBOX_WITH_DTRACE_R0DRV
VBoxDrv_DEFS += VBOX_WITH_DTRACE VBOX_WITH_DTRACE_R0DRV
endif
+ ifdef VBOX_WITHOUT_DEBUGGER_CHECKS
+ VBoxDrv_DEFS += VBOX_WITHOUT_DEBUGGER_CHECKS
+ endif
#VBoxDrv_DEFS.debug += DEBUG_DARWIN_GIP
VBoxDrv_DEFS.darwin := VBOX_WITH_HOST_VMX
VBoxDrv_DEFS.linux := \
@@ -283,6 +536,9 @@ if1of ($(KBUILD_TARGET), darwin linux solaris win)
ifdef VBOX_WITHOUT_NATIVE_R0_LOADER
VBoxDrv_DEFS.win += VBOX_WITHOUT_NATIVE_R0_LOADER
endif
+ ifdef VBOX_WITH_VISTA_NO_SP
+ VBoxDrv_DEFS.win += VBOX_WITH_VISTA_NO_SP
+ endif
VBoxDrv_INCS = . $(VBoxDrv_0_OUTDIR)
VBoxDrv_INCS.darwin = ./darwin
@@ -291,9 +547,9 @@ if1of ($(KBUILD_TARGET), darwin linux solaris win)
VBoxDrv_LIBS = $(PATH_STAGE_LIB)/RuntimeR0Drv$(VBOX_SUFF_LIB)
VBoxDrv_LIBS.linux.debug = $(VBoxDrv_LIBS) $(VBOX_GCC_LIBGCC)
VBoxDrv_LIBS.win = \
+ $(PATH_STAGE_LIB)/RuntimeR0Drv$(VBOX_SUFF_LIB) \
$(PATH_SDK_$(VBOX_WINDDK)_LIB)/ntoskrnl.lib \
- $(PATH_SDK_$(VBOX_WINDDK)_LIB)/hal.lib \
- $(PATH_STAGE_LIB)/RuntimeR0Drv$(VBOX_SUFF_LIB)
+ $(PATH_SDK_$(VBOX_WINDDK)_LIB)/hal.lib
#VBoxDrv_LDFLAGS.darwin = -v -Wl,-whyload -Wl,-v -Wl,-whatsloaded
VBoxDrv_LDFLAGS.solaris += -N misc/ctf
@@ -313,6 +569,12 @@ if1of ($(KBUILD_TARGET), darwin linux solaris win)
win/SUPDrv-win.cpp \
win/SUPDrvA-win.asm \
win/VBoxDrv.rc
+ ifdef VBOX_WITH_HARDENING
+ VBoxDrv_SOURCES.win += \
+ win/SUPHardenedVerifyImage-win.cpp \
+ win/SUPHardenedVerifyProcess-win.cpp \
+ $(VBOX_SUP_WIN_CERTS_FILE)
+ endif
VBoxDrv_SOURCES = \
SUPDrv.d \
SUPDrv.c \
diff --git a/src/VBox/HostDrivers/Support/SUPDrv.c b/src/VBox/HostDrivers/Support/SUPDrv.c
index 0be4002ceef..b2f81bab1fe 100644
--- a/src/VBox/HostDrivers/Support/SUPDrv.c
+++ b/src/VBox/HostDrivers/Support/SUPDrv.c
@@ -463,124 +463,130 @@ int VBOXCALL supdrvInitDevExt(PSUPDRVDEVEXT pDevExt, size_t cbSession)
/*
* Initialize it.
*/
- memset(pDevExt, 0, sizeof(*pDevExt));
+ memset(pDevExt, 0, sizeof(*pDevExt)); /* Does not wipe OS specific tail section of the structure. */
+ pDevExt->Spinlock = NIL_RTSPINLOCK;
+ pDevExt->hGipSpinlock = NIL_RTSPINLOCK;
+ pDevExt->hSessionHashTabSpinlock = NIL_RTSPINLOCK;
rc = RTSpinlockCreate(&pDevExt->Spinlock, RTSPINLOCK_FLAGS_INTERRUPT_SAFE, "SUPDrvDevExt");
if (RT_SUCCESS(rc))
- {
rc = RTSpinlockCreate(&pDevExt->hGipSpinlock, RTSPINLOCK_FLAGS_INTERRUPT_SAFE, "SUPDrvGip");
+ if (RT_SUCCESS(rc))
+ rc = RTSpinlockCreate(&pDevExt->hSessionHashTabSpinlock, RTSPINLOCK_FLAGS_INTERRUPT_SAFE, "SUPDrvSession");
+
+ if (RT_SUCCESS(rc))
+#ifdef SUPDRV_USE_MUTEX_FOR_LDR
+ rc = RTSemMutexCreate(&pDevExt->mtxLdr);
+#else
+ rc = RTSemFastMutexCreate(&pDevExt->mtxLdr);
+#endif
+ if (RT_SUCCESS(rc))
+ {
+ rc = RTSemFastMutexCreate(&pDevExt->mtxComponentFactory);
if (RT_SUCCESS(rc))
{
#ifdef SUPDRV_USE_MUTEX_FOR_LDR
- rc = RTSemMutexCreate(&pDevExt->mtxLdr);
+ rc = RTSemMutexCreate(&pDevExt->mtxGip);
#else
- rc = RTSemFastMutexCreate(&pDevExt->mtxLdr);
+ rc = RTSemFastMutexCreate(&pDevExt->mtxGip);
#endif
if (RT_SUCCESS(rc))
{
- rc = RTSemFastMutexCreate(&pDevExt->mtxComponentFactory);
+ rc = supdrvGipCreate(pDevExt);
if (RT_SUCCESS(rc))
{
-#ifdef SUPDRV_USE_MUTEX_FOR_LDR
- rc = RTSemMutexCreate(&pDevExt->mtxGip);
-#else
- rc = RTSemFastMutexCreate(&pDevExt->mtxGip);
-#endif
+ rc = supdrvTracerInit(pDevExt);
if (RT_SUCCESS(rc))
{
- rc = supdrvGipCreate(pDevExt);
- if (RT_SUCCESS(rc))
- {
- rc = supdrvTracerInit(pDevExt);
- if (RT_SUCCESS(rc))
- {
- pDevExt->pLdrInitImage = NULL;
- pDevExt->hLdrInitThread = NIL_RTNATIVETHREAD;
- pDevExt->u32Cookie = BIRD; /** @todo make this random? */
- pDevExt->cbSession = (uint32_t)cbSession;
-
- /*
- * Fixup the absolute symbols.
- *
- * Because of the table indexing assumptions we'll have a little #ifdef orgy
- * here rather than distributing this to OS specific files. At least for now.
- */
+ pDevExt->pLdrInitImage = NULL;
+ pDevExt->hLdrInitThread = NIL_RTNATIVETHREAD;
+ pDevExt->u32Cookie = BIRD; /** @todo make this random? */
+ pDevExt->cbSession = (uint32_t)cbSession;
+
+ /*
+ * Fixup the absolute symbols.
+ *
+ * Because of the table indexing assumptions we'll have a little #ifdef orgy
+ * here rather than distributing this to OS specific files. At least for now.
+ */
#ifdef RT_OS_DARWIN
# if ARCH_BITS == 32
- if (SUPR0GetPagingMode() >= SUPPAGINGMODE_AMD64)
- {
- g_aFunctions[0].pfn = (void *)1; /* SUPR0AbsIs64bit */
- g_aFunctions[1].pfn = (void *)0x80; /* SUPR0Abs64bitKernelCS - KERNEL64_CS, seg.h */
- g_aFunctions[2].pfn = (void *)0x88; /* SUPR0Abs64bitKernelSS - KERNEL64_SS, seg.h */
- g_aFunctions[3].pfn = (void *)0x88; /* SUPR0Abs64bitKernelDS - KERNEL64_SS, seg.h */
- }
- else
- g_aFunctions[0].pfn = g_aFunctions[1].pfn = g_aFunctions[2].pfn = g_aFunctions[4].pfn = (void *)0;
- g_aFunctions[4].pfn = (void *)0x08; /* SUPR0AbsKernelCS - KERNEL_CS, seg.h */
- g_aFunctions[5].pfn = (void *)0x10; /* SUPR0AbsKernelSS - KERNEL_DS, seg.h */
- g_aFunctions[6].pfn = (void *)0x10; /* SUPR0AbsKernelDS - KERNEL_DS, seg.h */
- g_aFunctions[7].pfn = (void *)0x10; /* SUPR0AbsKernelES - KERNEL_DS, seg.h */
- g_aFunctions[8].pfn = (void *)0x10; /* SUPR0AbsKernelFS - KERNEL_DS, seg.h */
- g_aFunctions[9].pfn = (void *)0x48; /* SUPR0AbsKernelGS - CPU_DATA_GS, seg.h */
+ if (SUPR0GetPagingMode() >= SUPPAGINGMODE_AMD64)
+ {
+ g_aFunctions[0].pfn = (void *)1; /* SUPR0AbsIs64bit */
+ g_aFunctions[1].pfn = (void *)0x80; /* SUPR0Abs64bitKernelCS - KERNEL64_CS, seg.h */
+ g_aFunctions[2].pfn = (void *)0x88; /* SUPR0Abs64bitKernelSS - KERNEL64_SS, seg.h */
+ g_aFunctions[3].pfn = (void *)0x88; /* SUPR0Abs64bitKernelDS - KERNEL64_SS, seg.h */
+ }
+ else
+ g_aFunctions[0].pfn = g_aFunctions[1].pfn = g_aFunctions[2].pfn = g_aFunctions[4].pfn = (void *)0;
+ g_aFunctions[4].pfn = (void *)0x08; /* SUPR0AbsKernelCS - KERNEL_CS, seg.h */
+ g_aFunctions[5].pfn = (void *)0x10; /* SUPR0AbsKernelSS - KERNEL_DS, seg.h */
+ g_aFunctions[6].pfn = (void *)0x10; /* SUPR0AbsKernelDS - KERNEL_DS, seg.h */
+ g_aFunctions[7].pfn = (void *)0x10; /* SUPR0AbsKernelES - KERNEL_DS, seg.h */
+ g_aFunctions[8].pfn = (void *)0x10; /* SUPR0AbsKernelFS - KERNEL_DS, seg.h */
+ g_aFunctions[9].pfn = (void *)0x48; /* SUPR0AbsKernelGS - CPU_DATA_GS, seg.h */
# else /* 64-bit darwin: */
- g_aFunctions[0].pfn = (void *)1; /* SUPR0AbsIs64bit */
- g_aFunctions[1].pfn = (void *)(uintptr_t)ASMGetCS(); /* SUPR0Abs64bitKernelCS */
- g_aFunctions[2].pfn = (void *)(uintptr_t)ASMGetSS(); /* SUPR0Abs64bitKernelSS */
- g_aFunctions[3].pfn = (void *)0; /* SUPR0Abs64bitKernelDS */
- g_aFunctions[4].pfn = (void *)(uintptr_t)ASMGetCS(); /* SUPR0AbsKernelCS */
- g_aFunctions[5].pfn = (void *)(uintptr_t)ASMGetSS(); /* SUPR0AbsKernelSS */
- g_aFunctions[6].pfn = (void *)0; /* SUPR0AbsKernelDS */
- g_aFunctions[7].pfn = (void *)0; /* SUPR0AbsKernelES */
- g_aFunctions[8].pfn = (void *)0; /* SUPR0AbsKernelFS */
- g_aFunctions[9].pfn = (void *)0; /* SUPR0AbsKernelGS */
+ g_aFunctions[0].pfn = (void *)1; /* SUPR0AbsIs64bit */
+ g_aFunctions[1].pfn = (void *)(uintptr_t)ASMGetCS(); /* SUPR0Abs64bitKernelCS */
+ g_aFunctions[2].pfn = (void *)(uintptr_t)ASMGetSS(); /* SUPR0Abs64bitKernelSS */
+ g_aFunctions[3].pfn = (void *)0; /* SUPR0Abs64bitKernelDS */
+ g_aFunctions[4].pfn = (void *)(uintptr_t)ASMGetCS(); /* SUPR0AbsKernelCS */
+ g_aFunctions[5].pfn = (void *)(uintptr_t)ASMGetSS(); /* SUPR0AbsKernelSS */
+ g_aFunctions[6].pfn = (void *)0; /* SUPR0AbsKernelDS */
+ g_aFunctions[7].pfn = (void *)0; /* SUPR0AbsKernelES */
+ g_aFunctions[8].pfn = (void *)0; /* SUPR0AbsKernelFS */
+ g_aFunctions[9].pfn = (void *)0; /* SUPR0AbsKernelGS */
# endif
#else /* !RT_OS_DARWIN */
# if ARCH_BITS == 64
- g_aFunctions[0].pfn = (void *)1; /* SUPR0AbsIs64bit */
- g_aFunctions[1].pfn = (void *)(uintptr_t)ASMGetCS(); /* SUPR0Abs64bitKernelCS */
- g_aFunctions[2].pfn = (void *)(uintptr_t)ASMGetSS(); /* SUPR0Abs64bitKernelSS */
- g_aFunctions[3].pfn = (void *)(uintptr_t)ASMGetDS(); /* SUPR0Abs64bitKernelDS */
+ g_aFunctions[0].pfn = (void *)1; /* SUPR0AbsIs64bit */
+ g_aFunctions[1].pfn = (void *)(uintptr_t)ASMGetCS(); /* SUPR0Abs64bitKernelCS */
+ g_aFunctions[2].pfn = (void *)(uintptr_t)ASMGetSS(); /* SUPR0Abs64bitKernelSS */
+ g_aFunctions[3].pfn = (void *)(uintptr_t)ASMGetDS(); /* SUPR0Abs64bitKernelDS */
# else
- g_aFunctions[0].pfn = g_aFunctions[1].pfn = g_aFunctions[2].pfn = g_aFunctions[4].pfn = (void *)0;
+ g_aFunctions[0].pfn = g_aFunctions[1].pfn = g_aFunctions[2].pfn = g_aFunctions[4].pfn = (void *)0;
# endif
- g_aFunctions[4].pfn = (void *)(uintptr_t)ASMGetCS(); /* SUPR0AbsKernelCS */
- g_aFunctions[5].pfn = (void *)(uintptr_t)ASMGetSS(); /* SUPR0AbsKernelSS */
- g_aFunctions[6].pfn = (void *)(uintptr_t)ASMGetDS(); /* SUPR0AbsKernelDS */
- g_aFunctions[7].pfn = (void *)(uintptr_t)ASMGetES(); /* SUPR0AbsKernelES */
- g_aFunctions[8].pfn = (void *)(uintptr_t)ASMGetFS(); /* SUPR0AbsKernelFS */
- g_aFunctions[9].pfn = (void *)(uintptr_t)ASMGetGS(); /* SUPR0AbsKernelGS */
+ g_aFunctions[4].pfn = (void *)(uintptr_t)ASMGetCS(); /* SUPR0AbsKernelCS */
+ g_aFunctions[5].pfn = (void *)(uintptr_t)ASMGetSS(); /* SUPR0AbsKernelSS */
+ g_aFunctions[6].pfn = (void *)(uintptr_t)ASMGetDS(); /* SUPR0AbsKernelDS */
+ g_aFunctions[7].pfn = (void *)(uintptr_t)ASMGetES(); /* SUPR0AbsKernelES */
+ g_aFunctions[8].pfn = (void *)(uintptr_t)ASMGetFS(); /* SUPR0AbsKernelFS */
+ g_aFunctions[9].pfn = (void *)(uintptr_t)ASMGetGS(); /* SUPR0AbsKernelGS */
#endif /* !RT_OS_DARWIN */
- return VINF_SUCCESS;
- }
+ return VINF_SUCCESS;
+ }
- supdrvGipDestroy(pDevExt);
- }
+ supdrvGipDestroy(pDevExt);
+ }
#ifdef SUPDRV_USE_MUTEX_FOR_GIP
- RTSemMutexDestroy(pDevExt->mtxGip);
- pDevExt->mtxGip = NIL_RTSEMMUTEX;
+ RTSemMutexDestroy(pDevExt->mtxGip);
+ pDevExt->mtxGip = NIL_RTSEMMUTEX;
#else
- RTSemFastMutexDestroy(pDevExt->mtxGip);
- pDevExt->mtxGip = NIL_RTSEMFASTMUTEX;
+ RTSemFastMutexDestroy(pDevExt->mtxGip);
+ pDevExt->mtxGip = NIL_RTSEMFASTMUTEX;
#endif
- }
- RTSemFastMutexDestroy(pDevExt->mtxComponentFactory);
- pDevExt->mtxComponentFactory = NIL_RTSEMFASTMUTEX;
- }
+ }
+ RTSemFastMutexDestroy(pDevExt->mtxComponentFactory);
+ pDevExt->mtxComponentFactory = NIL_RTSEMFASTMUTEX;
+ }
#ifdef SUPDRV_USE_MUTEX_FOR_LDR
- RTSemMutexDestroy(pDevExt->mtxLdr);
- pDevExt->mtxLdr = NIL_RTSEMMUTEX;
+ RTSemMutexDestroy(pDevExt->mtxLdr);
+ pDevExt->mtxLdr = NIL_RTSEMMUTEX;
#else
- RTSemFastMutexDestroy(pDevExt->mtxLdr);
- pDevExt->mtxLdr = NIL_RTSEMFASTMUTEX;
+ RTSemFastMutexDestroy(pDevExt->mtxLdr);
+ pDevExt->mtxLdr = NIL_RTSEMFASTMUTEX;
#endif
- }
- RTSpinlockDestroy(pDevExt->hGipSpinlock);
- pDevExt->hGipSpinlock = NIL_RTSPINLOCK;
- }
- RTSpinlockDestroy(pDevExt->Spinlock);
- pDevExt->Spinlock = NIL_RTSPINLOCK;
}
+
+ RTSpinlockDestroy(pDevExt->Spinlock);
+ pDevExt->Spinlock = NIL_RTSPINLOCK;
+ RTSpinlockDestroy(pDevExt->hGipSpinlock);
+ pDevExt->hGipSpinlock = NIL_RTSPINLOCK;
+ RTSpinlockDestroy(pDevExt->hSessionHashTabSpinlock);
+ pDevExt->hSessionHashTabSpinlock = NIL_RTSPINLOCK;
+
#ifdef SUPDRV_WITH_RELEASE_LOGGER
RTLogDestroy(RTLogRelSetDefaultInstance(NULL));
RTLogDestroy(RTLogSetDefaultInstance(NULL));
@@ -621,6 +627,8 @@ void VBOXCALL supdrvDeleteDevExt(PSUPDRVDEVEXT pDevExt)
pDevExt->Spinlock = NIL_RTSPINLOCK;
RTSemFastMutexDestroy(pDevExt->mtxComponentFactory);
pDevExt->mtxComponentFactory = NIL_RTSEMFASTMUTEX;
+ RTSpinlockDestroy(pDevExt->hSessionHashTabSpinlock);
+ pDevExt->hSessionHashTabSpinlock = NIL_RTSPINLOCK;
/*
* Free lists.
@@ -699,15 +707,10 @@ int VBOXCALL supdrvCreateSession(PSUPDRVDEVEXT pDevExt, bool fUser, bool fUnrest
pSession->pDevExt = pDevExt;
pSession->u32Cookie = BIRD_INV;
pSession->fUnrestricted = fUnrestricted;
+ /*pSession->fInHashTable = false; */
pSession->cRefs = 1;
- /*pSession->pLdrUsage = NULL;
- pSession->pVM = NULL;
- pSession->pUsage = NULL;
- pSession->pGip = NULL;
- pSession->fGipReferenced = false;
- pSession->Bundle.cUsed = 0; */
- pSession->Uid = NIL_RTUID;
- pSession->Gid = NIL_RTGID;
+ /*pSession->pCommonNextHash = NULL;
+ pSession->ppOsSessionPtr = NULL; */
if (fUser)
{
pSession->Process = RTProcSelf();
@@ -718,6 +721,14 @@ int VBOXCALL supdrvCreateSession(PSUPDRVDEVEXT pDevExt, bool fUser, bool fUnrest
pSession->Process = NIL_RTPROCESS;
pSession->R0Process = NIL_RTR0PROCESS;
}
+ /*pSession->pLdrUsage = NULL;
+ pSession->pVM = NULL;
+ pSession->pUsage = NULL;
+ pSession->pGip = NULL;
+ pSession->fGipReferenced = false;
+ pSession->Bundle.cUsed = 0; */
+ pSession->Uid = NIL_RTUID;
+ pSession->Gid = NIL_RTGID;
/*pSession->uTracerData = 0;*/
pSession->hTracerCaller = NIL_RTNATIVETHREAD;
RTListInit(&pSession->TpProviders);
@@ -745,14 +756,16 @@ int VBOXCALL supdrvCreateSession(PSUPDRVDEVEXT pDevExt, bool fUser, bool fUnrest
/**
- * Shared code for cleaning up a session (but not quite freeing it).
+ * Cleans up the session in the context of the process to which it belongs, the
+ * caller will free the session and the session spinlock.
*
- * This is primarily intended for MAC OS X where we have to clean up the memory
- * stuff before the file handle is closed.
+ * This should normally occur when the session is closed or as the process
+ * exits. Careful reference counting in the OS specfic code makes sure that
+ * there cannot be any races between process/handle cleanup callbacks and
+ * threads doing I/O control calls.
*
- * @param pDevExt Device extension.
+ * @param pDevExt The device extension.
* @param pSession Session data.
- * This data will be freed by this routine.
*/
static void supdrvCleanupSession(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession)
{
@@ -760,6 +773,11 @@ static void supdrvCleanupSession(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession)
PSUPDRVBUNDLE pBundle;
LogFlow(("supdrvCleanupSession: pSession=%p\n", pSession));
+ Assert(!pSession->fInHashTable);
+ Assert(!pSession->ppOsSessionPtr);
+ AssertReleaseMsg(pSession->R0Process == RTR0ProcHandleSelf() || pSession->R0Process == NIL_RTR0PROCESS,
+ ("R0Process=%p cur=%p; Process=%u curpid=%u\n", RTR0ProcHandleSelf(), RTProcSelf()));
+
/*
* Remove logger instances related to this session.
*/
@@ -963,13 +981,13 @@ static void supdrvCleanupSession(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession)
/**
- * Shared code for cleaning up a session.
+ * Common code for freeing a session when the reference count reaches zero.
*
* @param pDevExt Device extension.
* @param pSession Session data.
* This data will be freed by this routine.
*/
-static void supdrvCloseSession(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession)
+static void supdrvDestroySession(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession)
{
VBOXDRV_SESSION_CLOSE(pSession);
@@ -977,6 +995,7 @@ static void supdrvCloseSession(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession)
* Cleanup the session first.
*/
supdrvCleanupSession(pDevExt, pSession);
+ supdrvOSCleanupSession(pDevExt, pSession);
/*
* Free the rest of the session stuff.
@@ -985,7 +1004,261 @@ static void supdrvCloseSession(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession)
pSession->Spinlock = NIL_RTSPINLOCK;
pSession->pDevExt = NULL;
RTMemFree(pSession);
- LogFlow(("supdrvCloseSession: returns\n"));
+ LogFlow(("supdrvDestroySession: returns\n"));
+}
+
+
+/**
+ * Inserts the session into the global hash table.
+ *
+ * @retval VINF_SUCCESS on success.
+ * @retval VERR_WRONG_ORDER if the session was already inserted (asserted).
+ * @retval VERR_INVALID_PARAMETER if the session handle is invalid or a ring-0
+ * session (asserted).
+ * @retval VERR_DUPLICATE if there is already a session for that pid.
+ *
+ * @param pDevExt The device extension.
+ * @param pSession The session.
+ * @param ppOsSessionPtr Pointer to the OS session pointer, if any is
+ * available and used. This will set to point to the
+ * session while under the protection of the session
+ * hash table spinlock. It will also be kept in
+ * PSUPDRVSESSION::ppOsSessionPtr for lookup and
+ * cleanup use.
+ * @param pvUser Argument for supdrvOSSessionHashTabInserted.
+ */
+int VBOXCALL supdrvSessionHashTabInsert(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, PSUPDRVSESSION *ppOsSessionPtr,
+ void *pvUser)
+{
+ PSUPDRVSESSION pCur;
+ unsigned iHash;
+
+ /*
+ * Validate input.
+ */
+ AssertReturn(SUP_IS_SESSION_VALID(pSession), VERR_INVALID_PARAMETER);
+ AssertReturn(pSession->R0Process != NIL_RTR0PROCESS, VERR_INVALID_PARAMETER);
+
+ /*
+ * Calculate the hash table index and acquire the spinlock.
+ */
+ iHash = SUPDRV_SESSION_HASH(pSession->Process);
+
+ RTSpinlockAcquire(pDevExt->hSessionHashTabSpinlock);
+
+ /*
+ * If there are a collisions, we need to carefully check if we got a
+ * duplicate. There can only be one open session per process.
+ */
+ pCur = pDevExt->apSessionHashTab[iHash];
+ if (pCur)
+ {
+ while (pCur && pCur->Process != pSession->Process)
+ pCur = pCur->pCommonNextHash;
+
+ if (pCur)
+ {
+ RTSpinlockRelease(pDevExt->hSessionHashTabSpinlock);
+ if (pCur == pSession)
+ {
+ Assert(pSession->fInHashTable);
+ AssertFailed();
+ return VERR_WRONG_ORDER;
+ }
+ Assert(!pSession->fInHashTable);
+ if (pCur->R0Process == pSession->R0Process)
+ return VERR_RESOURCE_IN_USE;
+ return VERR_DUPLICATE;
+ }
+ }
+ Assert(!pSession->fInHashTable);
+ Assert(!pSession->ppOsSessionPtr);
+
+ /*
+ * Insert it, doing a callout to the OS specific code in case it has
+ * anything it wishes to do while we're holding the spinlock.
+ */
+ pSession->pCommonNextHash = pDevExt->apSessionHashTab[iHash];
+ pDevExt->apSessionHashTab[iHash] = pSession;
+ pSession->fInHashTable = true;
+ ASMAtomicIncS32(&pDevExt->cSessions);
+
+ pSession->ppOsSessionPtr = ppOsSessionPtr;
+ if (ppOsSessionPtr)
+ ASMAtomicWritePtr(ppOsSessionPtr, pSession);
+
+ supdrvOSSessionHashTabInserted(pDevExt, pSession, pvUser);
+
+ /*
+ * Retain a reference for the pointer in the session table.
+ */
+ ASMAtomicIncU32(&pSession->cRefs);
+
+ RTSpinlockRelease(pDevExt->hSessionHashTabSpinlock);
+ return VINF_SUCCESS;
+}
+
+
+/**
+ * Removes the session from the global hash table.
+ *
+ * @retval VINF_SUCCESS on success.
+ * @retval VERR_NOT_FOUND if the session was already removed (asserted).
+ * @retval VERR_INVALID_PARAMETER if the session handle is invalid or a ring-0
+ * session (asserted).
+ *
+ * @param pDevExt The device extension.
+ * @param pSession The session. The caller is expected to have a reference
+ * to this so it won't croak on us when we release the hash
+ * table reference.
+ * @param pvUser OS specific context value for the
+ * supdrvOSSessionHashTabInserted callback.
+ */
+int VBOXCALL supdrvSessionHashTabRemove(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, void *pvUser)
+{
+ PSUPDRVSESSION pCur;
+ unsigned iHash;
+ int32_t cRefs;
+
+ /*
+ * Validate input.
+ */
+ AssertReturn(SUP_IS_SESSION_VALID(pSession), VERR_INVALID_PARAMETER);
+ AssertReturn(pSession->R0Process != NIL_RTR0PROCESS, VERR_INVALID_PARAMETER);
+
+ /*
+ * Calculate the hash table index and acquire the spinlock.
+ */
+ iHash = SUPDRV_SESSION_HASH(pSession->Process);
+
+ RTSpinlockAcquire(pDevExt->hSessionHashTabSpinlock);
+
+ /*
+ * Unlink it.
+ */
+ pCur = pDevExt->apSessionHashTab[iHash];
+ if (pCur == pSession)
+ pDevExt->apSessionHashTab[iHash] = pSession->pCommonNextHash;
+ else
+ {
+ PSUPDRVSESSION pPrev = pCur;
+ while (pCur && pCur != pSession)
+ {
+ pPrev = pCur;
+ pCur = pCur->pCommonNextHash;
+ }
+ if (pCur)
+ pPrev->pCommonNextHash = pCur->pCommonNextHash;
+ else
+ {
+ Assert(!pSession->fInHashTable);
+ RTSpinlockRelease(pDevExt->hSessionHashTabSpinlock);
+ return VERR_NOT_FOUND;
+ }
+ }
+
+ pSession->pCommonNextHash = NULL;
+ pSession->fInHashTable = false;
+
+ ASMAtomicDecU32(&pDevExt->cSessions);
+
+ /*
+ * Clear OS specific session pointer if available and do the OS callback.
+ */
+ if (pSession->ppOsSessionPtr)
+ {
+ ASMAtomicCmpXchgPtr(pSession->ppOsSessionPtr, NULL, pSession);
+ pSession->ppOsSessionPtr = NULL;
+ }
+
+ supdrvOSSessionHashTabRemoved(pDevExt, pSession, pvUser);
+
+ RTSpinlockRelease(pDevExt->hSessionHashTabSpinlock);
+
+ /*
+ * Drop the reference the hash table had to the session. This shouldn't
+ * be the last reference!
+ */
+ cRefs = ASMAtomicDecU32(&pSession->cRefs);
+ Assert(cRefs > 0 && cRefs < _1M);
+ if (cRefs == 0)
+ supdrvDestroySession(pDevExt, pSession);
+
+ return VINF_SUCCESS;
+}
+
+
+/**
+ * Looks up the session for the current process in the global hash table or in
+ * OS specific pointer.
+ *
+ * @returns Pointer to the session with a reference that the caller must
+ * release. If no valid session was found, NULL is returned.
+ *
+ * @param pDevExt The device extension.
+ * @param Process The process ID.
+ * @param R0Process The ring-0 process handle.
+ * @param ppOsSessionPtr The OS session pointer if available. If not NULL,
+ * this is used instead of the hash table. For
+ * additional safety it must then be equal to the
+ * SUPDRVSESSION::ppOsSessionPtr member.
+ * This can be NULL even if the OS has a session
+ * pointer.
+ */
+PSUPDRVSESSION VBOXCALL supdrvSessionHashTabLookup(PSUPDRVDEVEXT pDevExt, RTPROCESS Process, RTR0PROCESS R0Process,
+ PSUPDRVSESSION *ppOsSessionPtr)
+{
+ PSUPDRVSESSION pCur;
+ unsigned iHash;
+
+ /*
+ * Validate input.
+ */
+ AssertReturn(R0Process != NIL_RTR0PROCESS, NULL);
+
+ /*
+ * Calculate the hash table index and acquire the spinlock.
+ */
+ iHash = SUPDRV_SESSION_HASH(Process);
+
+ RTSpinlockAcquire(pDevExt->hSessionHashTabSpinlock);
+
+ /*
+ * If an OS session pointer is provided, always use it.
+ */
+ if (ppOsSessionPtr)
+ {
+ pCur = *ppOsSessionPtr;
+ if ( pCur
+ && ( pCur->ppOsSessionPtr != ppOsSessionPtr
+ || pCur->Process != Process
+ || pCur->R0Process != R0Process) )
+ pCur = NULL;
+ }
+ else
+ {
+ /*
+ * Otherwise, do the hash table lookup.
+ */
+ pCur = pDevExt->apSessionHashTab[iHash];
+ while ( pCur
+ && ( pCur->Process != Process
+ || pCur->R0Process != R0Process) )
+ pCur = pCur->pCommonNextHash;
+ }
+
+ /*
+ * Retain the session.
+ */
+ if (pCur)
+ {
+ uint32_t cRefs = ASMAtomicIncU32(&pCur->cRefs);
+ Assert(cRefs > 1 && cRefs < _1M);
+ }
+
+ RTSpinlockRelease(pDevExt->hSessionHashTabSpinlock);
+
+ return pCur;
}
@@ -1022,7 +1295,7 @@ uint32_t VBOXCALL supdrvSessionRelease(PSUPDRVSESSION pSession)
cRefs = ASMAtomicDecU32(&pSession->cRefs);
AssertMsg(cRefs < _1M, ("%#x %p\n", cRefs, pSession));
if (cRefs == 0)
- supdrvCloseSession(pSession->pDevExt, pSession);
+ supdrvDestroySession(pSession->pDevExt, pSession);
return cRefs;
}
diff --git a/src/VBox/HostDrivers/Support/SUPDrvInternal.h b/src/VBox/HostDrivers/Support/SUPDrvInternal.h
index 20cd0512c38..8a22c62a552 100644
--- a/src/VBox/HostDrivers/Support/SUPDrvInternal.h
+++ b/src/VBox/HostDrivers/Support/SUPDrvInternal.h
@@ -58,7 +58,7 @@
# define _interlockedbittestandset64 _interlockedbittestandset64_StupidDDKVsCompilerCrap
# define _interlockedbittestandreset64 _interlockedbittestandreset64_StupidDDKVsCompilerCrap
# pragma warning(disable : 4163)
-# include <ntddk.h>
+# include <iprt/nt/nt.h>
# pragma warning(default : 4163)
# undef _InterlockedExchange
# undef _InterlockedExchangeAdd
@@ -69,7 +69,7 @@
# undef _interlockedbittestandset64
# undef _interlockedbittestandreset64
# else
-# include <ntddk.h>
+# include <iprt/nt/nt.h>
# endif
# include <memory.h>
# define memcmp(a,b,c) mymemcmp(a,b,c)
@@ -177,6 +177,13 @@
*/
#define OSDBGPRINT(a) SUPR0Printf a
+/** Debug printf macro shared with the ring-3 part. */
+#ifdef DEBUG_bird
+# define SUP_DPRINTF(a) SUPR0Printf a
+#else
+# define SUP_DPRINTF(a) do { } while (0)
+#endif
+
/** @name Context values for the per-session handle tables.
* The context value is used to distinguish between the different kinds of
@@ -434,8 +441,24 @@ typedef struct SUPDRVSESSION
uint32_t u32Cookie;
/** Set if is an unrestricted session, clear if restricted. */
bool fUnrestricted;
- /* Reference counter. */
+
+ /** Set if we're in the hash table, clear if not. Protected by the hash
+ * table spinlock. */
+ bool fInHashTable;
+ /** Reference counter. */
uint32_t volatile cRefs;
+ /** Pointer to the next session with the same hash (common hash table).
+ * Protected by the hash table spinlock. */
+ PSUPDRVSESSION pCommonNextHash;
+ /** Pointer to the OS specific session pointer, if available and in use.
+ * This is atomically set and cleared as the session is inserted and removed
+ * from the hash table (protected by the session hash table spinlock). */
+ PSUPDRVSESSION *ppOsSessionPtr;
+ /** The process (id) of the session. */
+ RTPROCESS Process;
+ /** Which process this session is associated with.
+ * This is NIL_RTR0PROCESS for kernel sessions and valid for user ones. */
+ RTR0PROCESS R0Process;
/** The VM associated with the session. */
PVM pVM;
@@ -445,7 +468,9 @@ typedef struct SUPDRVSESSION
/** Load usage records. (protected by SUPDRVDEVEXT::mtxLdr) */
PSUPDRVLDRUSAGE volatile pLdrUsage;
- /** Spinlock protecting the bundles and the GIP members. */
+ /** Spinlock protecting the bundles, the GIP members and the
+ * fProcessCleanupDone flag. It continues to be valid until the last
+ * reference to the session is released. */
RTSPINLOCK Spinlock;
/** The ring-3 mapping of the GIP (readonly). */
RTR0MEMOBJ GipMapObjR3;
@@ -460,11 +485,6 @@ typedef struct SUPDRVSESSION
RTUID Uid;
/** The group id of the session. (Set by the OS part.) */
RTGID Gid;
- /** The process (id) of the session. */
- RTPROCESS Process;
- /** Which process this session is associated with.
- * This is NIL_RTR0PROCESS for kernel sessions and valid for user ones. */
- RTR0PROCESS R0Process;
/** Per session tracer specfic data. */
uintptr_t uTracerData;
/** The thread currently actively talking to the tracer. (One at the time!) */
@@ -497,6 +517,10 @@ typedef struct SUPDRVSESSION
/** Pointer to the next session with the same hash. */
PSUPDRVSESSION pNextHash;
# endif
+# if defined(RT_OS_WINDOWS) && defined(VBOX_WITH_HARDENING)
+ /** Pointer to the process protection structure for this session. */
+ struct SUPDRVNTPROTECT *pNtProtect;
+# endif
#endif /* !SUPDRV_AGNOSTIC */
} SUPDRVSESSION;
@@ -612,8 +636,21 @@ typedef struct SUPDRVDEVEXT
/** Hash table for user tracer modules (SUPDRVVTGCOPY). */
RTLISTANCHOR aTrackerUmodHash[128];
+ /** @name Session Handle Table.
+ * @{ */
+ /** Spinlock protecting apSessionHashTab, cSessions,
+ * SUPDRVSESSION::ppOsSessionPtr, SUPDRVSESSION::pCommonNextHash, and possibly
+ * others depending on the OS. */
+ RTSPINLOCK hSessionHashTabSpinlock;
+ /** Session hash table hash table. The size of this table must make sense in
+ * comparison to GVMM_MAX_HANDLES. */
+ PSUPDRVSESSION apSessionHashTab[HC_ARCH_BITS == 64 ? 8191 : 127];
+ /** The number of open sessions. */
+ int32_t cSessions;
+ /** @} */
+
/*
- * Note! The non-agnostic bits must be a the very end of the structure!
+ * Note! The non-agnostic bits must be at the very end of the structure!
*/
#ifndef SUPDRV_AGNOSTIC
# ifdef RT_OS_WINDOWS
@@ -625,12 +662,43 @@ typedef struct SUPDRVDEVEXT
#endif
} SUPDRVDEVEXT;
+/** Calculates the index into g_apSessionHashTab.*/
+#define SUPDRV_SESSION_HASH(a_pid) ( (a_pid) % RT_ELEMENTS(((SUPDRVDEVEXT *)NULL)->apSessionHashTab) )
+
RT_C_DECLS_BEGIN
/*******************************************************************************
* OS Specific Functions *
*******************************************************************************/
+/**
+ * Called to clean up the session structure before it's freed.
+ *
+ * @param pDevExt The device globals.
+ * @param pSession The session that's being cleaned up.
+ */
+void VBOXCALL supdrvOSCleanupSession(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession);
+
+/**
+ * Called to let the OS specfic code perform additional insertion work while
+ * still under the protection of the hash table spinlock.
+ *
+ * @param pDevExt The device globals.
+ * @param pSession The session that was inserted.
+ * @param pvUser User context specified to the insert call.
+ */
+void VBOXCALL supdrvOSSessionHashTabInserted(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, void *pvUser);
+
+/**
+ * Called to let the OS specfic code perform additional removal work while still
+ * under the protection of the hash table spinlock.
+ *
+ * @param pDevExt The device globals.
+ * @param pSession The session that was removed.
+ * @param pvUser User context specified to the remove call.
+ */
+void VBOXCALL supdrvOSSessionHashTabRemoved(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, void *pvUser);
+
void VBOXCALL supdrvOSObjInitCreator(PSUPDRVOBJ pObj, PSUPDRVSESSION pSession);
bool VBOXCALL supdrvOSObjCanAccess(PSUPDRVOBJ pObj, PSUPDRVSESSION pSession, const char *pszObjName, int *prc);
bool VBOXCALL supdrvOSGetForcedAsyncTscMode(PSUPDRVDEVEXT pDevExt);
@@ -762,6 +830,10 @@ int VBOXCALL supdrvIDC(uintptr_t uIOCtl, PSUPDRVDEVEXT pDevExt, PSUPDRVSESSIO
int VBOXCALL supdrvInitDevExt(PSUPDRVDEVEXT pDevExt, size_t cbSession);
void VBOXCALL supdrvDeleteDevExt(PSUPDRVDEVEXT pDevExt);
int VBOXCALL supdrvCreateSession(PSUPDRVDEVEXT pDevExt, bool fUser, bool fUnrestricted, PSUPDRVSESSION *ppSession);
+int VBOXCALL supdrvSessionHashTabInsert(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, PSUPDRVSESSION *ppOsSessionPtr, void *pvUser);
+int VBOXCALL supdrvSessionHashTabRemove(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, void *pvUser);
+PSUPDRVSESSION VBOXCALL supdrvSessionHashTabLookup(PSUPDRVDEVEXT pDevExt, RTPROCESS Process, RTR0PROCESS R0Process,
+ PSUPDRVSESSION *ppOsSessionPtr);
uint32_t VBOXCALL supdrvSessionRetain(PSUPDRVSESSION pSession);
uint32_t VBOXCALL supdrvSessionRelease(PSUPDRVSESSION pSession);
diff --git a/src/VBox/HostDrivers/Support/SUPLib.cpp b/src/VBox/HostDrivers/Support/SUPLib.cpp
index a9c2b6692a5..2721d072308 100644
--- a/src/VBox/HostDrivers/Support/SUPLib.cpp
+++ b/src/VBox/HostDrivers/Support/SUPLib.cpp
@@ -1541,7 +1541,7 @@ SUPR3DECL(int) SUPR3HardenedVerifySelf(const char *pszArgv0, bool fInternal, PRT
/*
* Verify that the image file and parent directories are sane.
*/
- rc = supR3HardenedVerifyFile(szExecPath, RTHCUINTPTR_MAX, pErrInfo);
+ rc = supR3HardenedVerifyFile(szExecPath, RTHCUINTPTR_MAX, false /*fMaybe3rdParty*/, pErrInfo);
if (RT_FAILURE(rc))
return rc;
#endif
@@ -1585,7 +1585,7 @@ SUPR3DECL(int) SUPR3HardenedVerifyPlugIn(const char *pszFilename, PRTERRINFO pEr
* Only do the actual check in hardened builds.
*/
#ifdef VBOX_WITH_HARDENING
- int rc = supR3HardenedVerifyFile(pszFilename, RTHCUINTPTR_MAX, pErrInfo);
+ int rc = supR3HardenedVerifyFile(pszFilename, RTHCUINTPTR_MAX, true /*fMaybe3rdParty*/, pErrInfo);
if (RT_FAILURE(rc) && !RTErrInfoIsSet(pErrInfo))
LogRel(("supR3HardenedVerifyFile: Verification of \"%s\" failed, rc=%Rrc\n", pszFilename, rc));
return rc;
diff --git a/src/VBox/HostDrivers/Support/SUPLibInternal.h b/src/VBox/HostDrivers/Support/SUPLibInternal.h
index e1e05512746..bda35003c0b 100644
--- a/src/VBox/HostDrivers/Support/SUPLibInternal.h
+++ b/src/VBox/HostDrivers/Support/SUPLibInternal.h
@@ -103,7 +103,10 @@
* @{
*/
#if defined(IN_SUP_HARDENED_R3) && defined(RT_OS_WINDOWS)
+# define SUP_HARDENED_NEED_CRT_FUNCTIONS
+DECLHIDDEN(int) suplibHardenedMemComp(void const *pvDst, const void *pvSrc, size_t cbToComp);
DECLHIDDEN(void *) suplibHardenedMemCopy(void *pvDst, const void *pvSrc, size_t cbToCopy);
+DECLHIDDEN(void *) suplibHardenedMemSet(void *pvDst, int ch, size_t cbToSet);
DECLHIDDEN(char *) suplibHardenedStrCopy(char *pszDst, const char *pszSrc);
DECLHIDDEN(size_t) suplibHardenedStrLen(const char *psz);
DECLHIDDEN(char *) suplibHardenedStrCat(char *pszDst, const char *pszSrc);
@@ -111,7 +114,10 @@ DECLHIDDEN(int) suplibHardenedStrCmp(const char *psz1, const char *psz2);
DECLHIDDEN(int) suplibHardenedStrNCmp(const char *psz1, const char *psz2, size_t cchMax);
DECLHIDDEN(int) suplibHardenedStrICmp(const char *psz1, const char *psz2);
#else
+# undef SUP_HARDENED_NEED_CRT_FUNCTIONS
+# define suplibHardenedMemComp memcmp
# define suplibHardenedMemCopy memcpy
+# define suplibHardenedMemSet memset
# define suplibHardenedStrCopy strcpy
# define suplibHardenedStrLen strlen
# define suplibHardenedStrCat strcat
@@ -119,9 +125,23 @@ DECLHIDDEN(int) suplibHardenedStrICmp(const char *psz1, const char *psz2);
# define suplibHardenedStrNCmp strncmp
# define suplibHardenedStrICmp stricmp
#endif
-DECLNORETURN(void) suplibHardenedExit(RTEXITCODE rcExit);
+DECLNORETURN(void) suplibHardenedExit(RTEXITCODE rcExit);
+DECLHIDDEN(void) suplibHardenedPrintF(const char *pszFormat, ...);
+DECLHIDDEN(void) suplibHardenedPrintFV(const char *pszFormat, va_list va);
+
/** @} */
+/** Debug output macro. */
+#ifdef DEBUG_bird
+# ifdef IN_SUP_HARDENED_R3
+# define SUP_DPRINTF(a) suplibHardenedPrintF a
+# else
+# define SUP_DPRINTF(a) RTLogPrintf a
+# endif
+#else
+# define SUP_DPRINTF(a) do { } while (0)
+#endif
+
/*******************************************************************************
* Structures and Typedefs *
@@ -134,6 +154,7 @@ typedef enum SUPINSTFILETYPE
kSupIFT_Invalid = 0,
kSupIFT_Exe,
kSupIFT_Dll,
+ kSupIFT_Rc,
kSupIFT_Sys,
kSupIFT_Script,
kSupIFT_Data,
@@ -275,6 +296,17 @@ typedef DECLCALLBACK(int) FNSUPR3PREINIT(PSUPPREINITDATA pPreInitData, uint32_t
/** Pointer to supR3PreInit. */
typedef FNSUPR3PREINIT *PFNSUPR3PREINIT;
+/** The current SUPR3HardenedMain state / location. */
+typedef enum SUPR3HARDENEDMAINSTATE
+{
+ SUPR3HARDENEDMAINSTATE_NOT_YET_CALLED = 0,
+ SUPR3HARDENEDMAINSTATE_VERIFY_TRUST_READY,
+ SUPR3HARDENEDMAINSTATE_INIT_RUNTIME,
+ SUPR3HARDENEDMAINSTATE_GET_TRUSTED_MAIN,
+ SUPR3HARDENEDMAINSTATE_CALLED_TRUSTED_MAIN,
+ SUPR3HARDENEDMAINSTATE_END
+} SUPR3HARDENEDMAINSTATE;
+
/*******************************************************************************
* Global Variables *
@@ -287,6 +319,7 @@ extern DECLHIDDEN(PSUPGLOBALINFOPAGE) g_pSUPGlobalInfoPageR0;
#ifdef ___SUPDrvIOC_h___
extern DECLHIDDEN(PSUPQUERYFUNCS) g_pSupFunctions;
#endif
+extern DECLHIDDEN(SUPR3HARDENEDMAINSTATE) g_enmSupR3HardenedMainState;
/*******************************************************************************
@@ -359,14 +392,29 @@ DECLHIDDEN(int) supR3HardenedErrorV(int rc, bool fFatal, const char *pszForma
* Display an error which may or may not be fatal.
*/
DECLHIDDEN(int) supR3HardenedError(int rc, bool fFatal, const char *pszFormat, ...);
+
DECLHIDDEN(int) supR3HardenedVerifyAll(bool fFatal, bool fLeaveFilesOpen, const char *pszProgName);
DECLHIDDEN(int) supR3HardenedVerifyFixedDir(SUPINSTDIR enmDir, bool fFatal);
DECLHIDDEN(int) supR3HardenedVerifyFixedFile(const char *pszFilename, bool fFatal);
DECLHIDDEN(int) supR3HardenedVerifyDir(const char *pszDirPath, bool fRecursive, bool fCheckFiles, PRTERRINFO pErrInfo);
-DECLHIDDEN(int) supR3HardenedVerifyFile(const char *pszFilename, RTHCUINTPTR hNativeFile, PRTERRINFO pErrInfo);
+DECLHIDDEN(int) supR3HardenedVerifyFile(const char *pszFilename, RTHCUINTPTR hNativeFile, bool fMaybe3rdParty,
+ PRTERRINFO pErrInfo);
DECLHIDDEN(void) supR3HardenedGetPreInitData(PSUPPREINITDATA pPreInitData);
DECLHIDDEN(int) supR3HardenedRecvPreInitData(PCSUPPREINITDATA pPreInitData);
+#ifdef RT_OS_WINDOWS
+DECLHIDDEN(void) supR3HardenedWinInit(uint32_t fFlags);
+DECLHIDDEN(void) supR3HardenedWinInitVersion(void);
+DECLHIDDEN(void) supR3HardenedWinVerifyProcess(void);
+DECLHIDDEN(void) supR3HardenedWinResolveVerifyTrustApiAndHookThreadCreation(void);
+DECLHIDDEN(bool) supR3HardenedWinIsReSpawnNeeded(int cArgs, char **papszArgs);
+DECLHIDDEN(int) supR3HardenedWinReSpawn(void);
+DECLHIDDEN(void *) supR3HardenedWinLoadLibrary(const char *pszName, bool fSystem32Only);
+extern RTUTF16 g_wszSupLibHardenedExePath[1024];
+# ifdef RTPATH_MAX
+extern char g_szSupLibHardenedExePath[RTPATH_MAX];
+# endif
+#endif
SUPR3DECL(int) supR3PageLock(void *pvStart, size_t cPages, PSUPPAGE paPages);
SUPR3DECL(int) supR3PageUnlock(void *pvStart);
diff --git a/src/VBox/HostDrivers/Support/SUPLibLdr.cpp b/src/VBox/HostDrivers/Support/SUPLibLdr.cpp
index 9c9afa685f6..69bfbb0559e 100644
--- a/src/VBox/HostDrivers/Support/SUPLibLdr.cpp
+++ b/src/VBox/HostDrivers/Support/SUPLibLdr.cpp
@@ -780,7 +780,7 @@ SUPR3DECL(int) SUPR3HardenedLdrLoadPlugIn(const char *pszFilename, PRTLDRMOD phL
/*
* Verify the image file.
*/
- int rc = supR3HardenedVerifyFile(pszFilename, RTHCUINTPTR_MAX, pErrInfo);
+ int rc = supR3HardenedVerifyFile(pszFilename, RTHCUINTPTR_MAX, true /*fMaybe3rdParty*/, pErrInfo);
if (RT_FAILURE(rc))
{
if (!RTErrInfoIsSet(pErrInfo))
diff --git a/src/VBox/HostDrivers/Support/SUPR3HardenedMain.cpp b/src/VBox/HostDrivers/Support/SUPR3HardenedMain.cpp
index 151eed4e719..06a499e9229 100644
--- a/src/VBox/HostDrivers/Support/SUPR3HardenedMain.cpp
+++ b/src/VBox/HostDrivers/Support/SUPR3HardenedMain.cpp
@@ -4,7 +4,7 @@
*/
/*
- * Copyright (C) 2006-2013 Oracle Corporation
+ * Copyright (C) 2006-2014 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
@@ -120,25 +120,31 @@ typedef FNRTR3INITEX *PFNRTR3INITEX;
* Global Variables *
*******************************************************************************/
/** The pre-init data we pass on to SUPR3 (residing in VBoxRT). */
-static SUPPREINITDATA g_SupPreInitData;
+static SUPPREINITDATA g_SupPreInitData;
/** The program executable path. */
-static char g_szSupLibHardenedExePath[RTPATH_MAX];
+#ifndef RT_OS_WINDOWS
+static
+#endif
+char g_szSupLibHardenedExePath[RTPATH_MAX];
/** The program directory path. */
-static char g_szSupLibHardenedDirPath[RTPATH_MAX];
+static char g_szSupLibHardenedDirPath[RTPATH_MAX];
/** The program name. */
-static const char *g_pszSupLibHardenedProgName;
+static const char *g_pszSupLibHardenedProgName;
#ifdef SUP_HARDENED_SUID
/** The real UID at startup. */
-static uid_t g_uid;
+static uid_t g_uid;
/** The real GID at startup. */
-static gid_t g_gid;
+static gid_t g_gid;
# ifdef RT_OS_LINUX
-static uint32_t g_uCaps;
+static uint32_t g_uCaps;
# endif
#endif
+/** The current SUPR3HardenedMain state / location. */
+SUPR3HARDENEDMAINSTATE g_enmSupR3HardenedMainState = SUPR3HARDENEDMAINSTATE_NOT_YET_CALLED;
+
/*******************************************************************************
* Internal Functions *
@@ -149,129 +155,6 @@ static void supR3HardenedMainDropPrivileges(void);
static PFNSUPTRUSTEDERROR supR3HardenedMainGetTrustedError(const char *pszProgName);
-#ifdef RT_OS_WINDOWS
-/*
- * No CRT here, thank you.
- */
-
-/** memcpy */
-DECLHIDDEN(void *) suplibHardenedMemCopy(void *pvDst, const void *pvSrc, size_t cbToCopy)
-{
- size_t *puDst = (size_t *)pvDst;
- size_t const *puSrc = (size_t const *)pvSrc;
- while (cbToCopy >= sizeof(size_t))
- {
- *puDst++ = *puSrc++;
- cbToCopy -= sizeof(size_t);
- }
-
- uint8_t *pbDst = (uint8_t *)puDst;
- uint8_t const *pbSrc = (uint8_t const *)puSrc;
- while (cbToCopy > 0)
- {
- *pbDst++ = *pbSrc++;
- cbToCopy--;
- }
-
- return pvDst;
-}
-
-
-/** strcpy */
-DECLHIDDEN(char *) suplibHardenedStrCopy(char *pszDst, const char *pszSrc)
-{
- char *pszRet = pszDst;
- char ch;
- do
- {
- ch = *pszSrc++;
- *pszDst++ = ch;
- } while (ch);
- return pszRet;
-}
-
-
-/** strlen */
-DECLHIDDEN(size_t) suplibHardenedStrLen(const char *psz)
-{
- const char *pszStart = psz;
- while (*psz)
- psz++;
- return psz - pszStart;
-}
-
-
-/** strcat */
-DECLHIDDEN(char *) suplibHardenedStrCat(char *pszDst, const char *pszSrc)
-{
- char *pszRet = pszDst;
- while (*pszDst)
- pszDst++;
- suplibHardenedStrCopy(pszDst, pszSrc);
- return pszRet;
-}
-
-
-# ifdef RT_OS_WINDOWS
-/** stricmp */
-DECLHIDDEN(int) suplibHardenedStrICmp(const char *psz1, const char *psz2)
-{
- const char *pszOrg1 = psz1;
- const char *pszOrg2 = psz2;
-
- for (;;)
- {
- char ch1 = *psz1++;
- char ch2 = *psz1++;
- if (ch1 != ch2)
- {
- int rc = CompareStringA(LOCALE_USER_DEFAULT, NORM_IGNORECASE, pszOrg1, -1, pszOrg2, -1);
-# ifdef VBOX_STRICT
- if (rc == 0)
- __debugbreak();
-# endif
- return rc - 2;
- }
- if (ch1 == 0)
- return 0;
- }
-}
-# endif
-
-
-/** strcmp */
-DECLHIDDEN(int) suplibHardenedStrCmp(const char *psz1, const char *psz2)
-{
- for (;;)
- {
- char ch1 = *psz1++;
- char ch2 = *psz1++;
- if (ch1 != ch2)
- return ch1 < ch2 ? -1 : 1;
- if (ch1 == 0)
- return 0;
- }
-}
-
-
-/** strncmp */
-DECLHIDDEN(int) suplibHardenedStrNCmp(const char *psz1, const char *psz2, size_t cchMax)
-{
- while (cchMax-- > 0)
- {
- char ch1 = *psz1++;
- char ch2 = *psz1++;
- if (ch1 != ch2)
- return ch1 < ch2 ? -1 : 1;
- if (ch1 == 0)
- break;
- }
- return 0;
-}
-
-#endif /* RT_OS_WINDOWS */
-
-
/**
* Safely copy one or more strings into the given buffer.
*
@@ -422,16 +305,13 @@ static void suplibHardenedPrintHexOctal(uint64_t uValue, unsigned uBase, uint32_
do
{
- unsigned iDigit = uValue & fDigitMask;
+ *psz-- = pchDigits[uValue & fDigitMask];
uValue >>= cShift;
-
- *psz-- = uValue % 10;
- uValue /= 10;
} while (uValue > 0);
if ((fFlags & RTSTR_F_SPECIAL) && uBase == 16)
{
- *psz-- = 'x';
+ *psz-- = !(fFlags & RTSTR_F_CAPITAL) ? 'x' : 'X';
*psz-- = '0';
}
@@ -441,6 +321,83 @@ static void suplibHardenedPrintHexOctal(uint64_t uValue, unsigned uBase, uint32_
/**
+ * Writes a wide character string to standard error.
+ *
+ * @param pwsz The string.
+ */
+static void suplibHardenedPrintWideStr(PCRTUTF16 pwsz)
+{
+ for (;;)
+ {
+ RTUTF16 wc = *pwsz++;
+ if (!wc)
+ return;
+ if ( (wc < 0x7f && wc >= 0x20)
+ || wc == '\n'
+ || wc == '\r')
+ suplibHardenedPrintChr((char)wc);
+ else
+ {
+ suplibHardenedPrintStrN(RT_STR_TUPLE("\\x"));
+ suplibHardenedPrintHexOctal(wc, 16, 0);
+ }
+ }
+}
+
+#ifdef IPRT_NO_CRT
+
+/** Buffer structure used by suplibHardenedOutput. */
+struct SUPLIBHARDENEDOUTPUTBUF
+{
+ size_t off;
+ char szBuf[2048];
+};
+
+/** Callback for RTStrFormatV, see FNRTSTROUTPUT. */
+static DECLCALLBACK(size_t) suplibHardenedOutput(void *pvArg, const char *pachChars, size_t cbChars)
+{
+ SUPLIBHARDENEDOUTPUTBUF *pBuf = (SUPLIBHARDENEDOUTPUTBUF *)pvArg;
+ size_t cbTodo = cbChars;
+ for (;;)
+ {
+ size_t cbSpace = sizeof(pBuf->szBuf) - pBuf->off - 1;
+
+ /* Flush the buffer? */
+ if ( cbSpace == 0
+ || (cbTodo == 0 && pBuf->off))
+ {
+ suplibHardenedPrintStrN(pBuf->szBuf, pBuf->off);
+# ifdef RT_OS_WINDOWS
+ OutputDebugString(pBuf->szBuf);
+# endif
+ pBuf->off = 0;
+ cbSpace = sizeof(pBuf->szBuf) - 1;
+ }
+
+ /* Copy the string into the buffer. */
+ if (cbTodo == 1)
+ {
+ pBuf->szBuf[pBuf->off++] = *pachChars;
+ break;
+ }
+ if (cbSpace >= cbTodo)
+ {
+ memcpy(&pBuf->szBuf[pBuf->off], pachChars, cbTodo);
+ pBuf->off += cbTodo;
+ break;
+ }
+ memcpy(&pBuf->szBuf[pBuf->off], pachChars, cbSpace);
+ pBuf->off += cbSpace;
+ cbTodo -= cbSpace;
+ }
+ pBuf->szBuf[pBuf->off] = '\0';
+
+ return cbChars;
+}
+
+#endif /* IPRT_NO_CRT */
+
+/**
* Simple printf to standard error.
*
* @param pszFormat The format string.
@@ -448,6 +405,17 @@ static void suplibHardenedPrintHexOctal(uint64_t uValue, unsigned uBase, uint32_
*/
DECLHIDDEN(void) suplibHardenedPrintFV(const char *pszFormat, va_list va)
{
+#ifdef IPRT_NO_CRT
+ /*
+ * Use buffered output here to avoid character mixing on the windows
+ * console and to enable us to use OutputDebugString.
+ */
+ SUPLIBHARDENEDOUTPUTBUF Buf;
+ Buf.off = 0;
+ Buf.szBuf[0] = '\0';
+ RTStrFormatV(suplibHardenedOutput, &Buf, NULL, NULL, pszFormat, va);
+
+#else /* !IPRT_NO_CRT */
/*
* Format loop.
*/
@@ -543,13 +511,22 @@ DECLHIDDEN(void) suplibHardenedPrintFV(const char *pszFormat, va_list va)
break;
case 's':
- {
- const char *pszStr = va_arg(va, const char *);
- if (!RT_VALID_PTR(pszStr))
- pszStr = "<NULL>";
- suplibHardenedPrintStr(pszStr);
+ if (chArgSize == 'l')
+ {
+ PCRTUTF16 pwszStr = va_arg(va, PCRTUTF16 );
+ if (RT_VALID_PTR(pwszStr))
+ suplibHardenedPrintWideStr(pwszStr);
+ else
+ suplibHardenedPrintStr("<NULL>");
+ }
+ else
+ {
+ const char *pszStr = va_arg(va, const char *);
+ if (!RT_VALID_PTR(pszStr))
+ pszStr = "<NULL>";
+ suplibHardenedPrintStr(pszStr);
+ }
break;
- }
case 'd':
case 'i':
@@ -616,6 +593,20 @@ DECLHIDDEN(void) suplibHardenedPrintFV(const char *pszFormat, va_list va)
break;
}
+ case 'R':
+ if (pszFormat[0] == 'r' && pszFormat[1] == 'c')
+ {
+ int iValue = va_arg(va, int);
+ if (iValue < 0)
+ {
+ suplibHardenedPrintChr('-');
+ iValue = -iValue;
+ }
+ suplibHardenedPrintDecimal(iValue);
+ pszFormat += 2;
+ break;
+ }
+ /* fall thru */
/*
* Custom format.
@@ -635,6 +626,7 @@ DECLHIDDEN(void) suplibHardenedPrintFV(const char *pszFormat, va_list va)
/* Flush the last bits of the string. */
if (pszLast != pszFormat)
suplibHardenedPrintStrN(pszLast, pszFormat - pszLast);
+#endif /* !IPRT_NO_CRT */
}
@@ -653,7 +645,6 @@ DECLHIDDEN(void) suplibHardenedPrintF(const char *pszFormat, ...)
}
-
/**
* @copydoc RTPathStripFilename.
*/
@@ -862,9 +853,12 @@ static void supR3HardenedGetFullExePath(void)
suplibHardenedMemCopy(g_szSupLibHardenedExePath, pszImageName, cchImageName + 1);
#elif defined(RT_OS_WINDOWS)
- HMODULE hExe = GetModuleHandle(NULL);
- if (!GetModuleFileName(hExe, &g_szSupLibHardenedExePath[0], sizeof(g_szSupLibHardenedExePath)))
- supR3HardenedFatal("supR3HardenedExecDir: GetModuleFileName failed, rc=%d\n", GetLastError());
+ int cbRet = WideCharToMultiByte(CP_UTF8, 0 /*dwFlags*/,
+ g_wszSupLibHardenedExePath, -1,
+ g_szSupLibHardenedExePath, sizeof(g_szSupLibHardenedExePath),
+ NULL /*pchDefChar*/, NULL /* pfUsedDefChar */);
+ if (!cbRet)
+ supR3HardenedFatal("supR3HardenedExecDir: WideCharToMultiByte failed, rc=%d\n", GetLastError());
#else
# error needs porting.
#endif
@@ -955,6 +949,7 @@ DECLHIDDEN(void) supR3HardenedFatalMsgV(const char *pszWhere, SUPINITOP enmWha
suplibHardenedPrintStr("Tip! Make sure the kernel module is loaded. It may also help to reinstall VirtualBox.\n");
break;
+ case kSupInitOp_Misc:
case kSupInitOp_IPRT:
case kSupInitOp_Integrity:
case kSupInitOp_RootCheck:
@@ -987,9 +982,17 @@ DECLHIDDEN(void) supR3HardenedFatalMsgV(const char *pszWhere, SUPINITOP enmWha
if (pid <= 0)
#endif
{
- PFNSUPTRUSTEDERROR pfnTrustedError = supR3HardenedMainGetTrustedError(g_pszSupLibHardenedProgName);
- if (pfnTrustedError)
- pfnTrustedError(pszWhere, enmWhat, rc, pszMsgFmt, va);
+ static volatile bool s_fRecursive = false; /* Loader hooks may cause recursion. */
+ if (!s_fRecursive)
+ {
+ s_fRecursive = true;
+
+ PFNSUPTRUSTEDERROR pfnTrustedError = supR3HardenedMainGetTrustedError(g_pszSupLibHardenedProgName);
+ if (pfnTrustedError)
+ pfnTrustedError(pszWhere, enmWhat, rc, pszMsgFmt, va);
+
+ s_fRecursive = false;
+ }
}
/*
@@ -1081,6 +1084,14 @@ static void supR3HardenedMainOpenDevice(void)
case VERR_NO_MEMORY:
supR3HardenedFatalMsg("suplibOsInit", kSupInitOp_Driver, rc,
"Kernel memory allocation/mapping failed");
+ case VERR_SUPDRV_HARDENING_EVIL_HANDLE:
+ supR3HardenedFatalMsg("suplibOsInit", kSupInitOp_Driver, rc, "VERR_SUPDRV_HARDENING_EVIL_HANDLE");
+ case VERR_SUPLIB_NT_PROCESS_UNTRUSTED_0:
+ supR3HardenedFatalMsg("suplibOsInit", kSupInitOp_Driver, rc, "VERR_SUPLIB_NT_PROCESS_UNTRUSTED_0");
+ case VERR_SUPLIB_NT_PROCESS_UNTRUSTED_1:
+ supR3HardenedFatalMsg("suplibOsInit", kSupInitOp_Driver, rc, "VERR_SUPLIB_NT_PROCESS_UNTRUSTED_1");
+ case VERR_SUPLIB_NT_PROCESS_UNTRUSTED_2:
+ supR3HardenedFatalMsg("suplibOsInit", kSupInitOp_Driver, rc, "VERR_SUPLIB_NT_PROCESS_UNTRUSTED_2");
default:
supR3HardenedFatalMsg("suplibOsInit", kSupInitOp_Driver, rc,
"Unknown rc=%d", rc);
@@ -1324,11 +1335,10 @@ static void supR3HardenedMainInitRuntime(uint32_t fFlags)
* Open it and resolve the symbols.
*/
#if defined(RT_OS_WINDOWS)
- /** @todo consider using LOAD_WITH_ALTERED_SEARCH_PATH here! */
- HMODULE hMod = LoadLibraryEx(szPath, NULL /*hFile*/, 0 /* dwFlags */);
+ HMODULE hMod = (HMODULE)supR3HardenedWinLoadLibrary(szPath, false /*fSystem32Only*/);
if (!hMod)
supR3HardenedFatalMsg("supR3HardenedMainInitRuntime", kSupInitOp_IPRT, VERR_MODULE_NOT_FOUND,
- "LoadLibraryEx(\"%s\",,) failed (rc=%d)",
+ "LoadLibrary \"%s\" failed (rc=%d)",
szPath, GetLastError());
PFNRTR3INITEX pfnRTInitEx = (PFNRTR3INITEX)GetProcAddress(hMod, SUP_HARDENED_SYM("RTR3InitEx"));
if (!pfnRTInitEx)
@@ -1407,8 +1417,7 @@ static PFNSUPTRUSTEDERROR supR3HardenedMainGetTrustedError(const char *pszProgNa
* Open it and resolve the symbol.
*/
#if defined(RT_OS_WINDOWS)
- /** @todo consider using LOAD_WITH_ALTERED_SEARCH_PATH here! */
- HMODULE hMod = LoadLibraryEx(szPath, NULL /*hFile*/, 0 /* dwFlags */);
+ HMODULE hMod = (HMODULE)supR3HardenedWinLoadLibrary(szPath, false /*fSystem32Only*/);
if (!hMod)
return NULL;
FARPROC pfn = GetProcAddress(hMod, SUP_HARDENED_SYM("TrustedError"));
@@ -1451,10 +1460,9 @@ static PFNSUPTRUSTEDMAIN supR3HardenedMainGetTrustedMain(const char *pszProgName
* Open it and resolve the symbol.
*/
#if defined(RT_OS_WINDOWS)
- /** @todo consider using LOAD_WITH_ALTERED_SEARCH_PATH here! */
- HMODULE hMod = LoadLibraryEx(szPath, NULL /*hFile*/, 0 /* dwFlags */);
+ HMODULE hMod = (HMODULE)supR3HardenedWinLoadLibrary(szPath, false /*fSystem32Only*/);
if (!hMod)
- supR3HardenedFatal("supR3HardenedMainGetTrustedMain: LoadLibraryEx(\"%s\",,) failed, rc=%d\n",
+ supR3HardenedFatal("supR3HardenedMainGetTrustedMain: LoadLibrary \"%s\" failed, rc=%d\n",
szPath, GetLastError());
FARPROC pfn = GetProcAddress(hMod, SUP_HARDENED_SYM("TrustedMain"));
if (!pfn)
@@ -1535,15 +1543,37 @@ DECLHIDDEN(int) SUPR3HardenedMain(const char *pszProgName, uint32_t fFlags, int
#endif
/*
- * Validate the installation.
+ * Validate the installation. On Windows we leave the files open so they
+ * cannot be tampered with after they've been verified. We also check
+ * install loader hooks and check the process integrity.
*/
+#ifndef RT_OS_WINDOWS
supR3HardenedVerifyAll(true /* fFatal */, false /* fLeaveFilesOpen */, pszProgName);
+#else
+ supR3HardenedWinInit(fFlags);
+ supR3HardenedVerifyAll(true /* fFatal */, true /* fLeaveFilesOpen */, pszProgName);
+ supR3HardenedWinVerifyProcess();
+#endif
+
+#ifdef RT_OS_WINDOWS
+ /*
+ * On Windows we'll respawn the process with a special vboxdrv arrangement
+ * in place to monitor access to the process for its inception.
+ */
+ if ( !(fFlags & SUPSECMAIN_FLAGS_DONT_OPEN_DEV)
+ && supR3HardenedWinIsReSpawnNeeded(argc, argv))
+ return supR3HardenedWinReSpawn();
+#endif
/*
* Open the vboxdrv device.
*/
if (!(fFlags & SUPSECMAIN_FLAGS_DONT_OPEN_DEV))
supR3HardenedMainOpenDevice();
+#ifdef RT_OS_WINDOWS
+ supR3HardenedWinResolveVerifyTrustApiAndHookThreadCreation();
+ g_enmSupR3HardenedMainState = SUPR3HARDENEDMAINSTATE_VERIFY_TRUST_READY;
+#endif
/*
* Open the root service connection.
@@ -1567,85 +1597,16 @@ DECLHIDDEN(int) SUPR3HardenedMain(const char *pszProgName, uint32_t fFlags, int
* Load the IPRT, hand the SUPLib part the open driver and
* call RTR3InitEx.
*/
+ g_enmSupR3HardenedMainState = SUPR3HARDENEDMAINSTATE_INIT_RUNTIME;
supR3HardenedMainInitRuntime(fFlags);
/*
* Load the DLL/SO/DYLIB containing the actual program
* and pass control to it.
*/
+ g_enmSupR3HardenedMainState = SUPR3HARDENEDMAINSTATE_GET_TRUSTED_MAIN;
PFNSUPTRUSTEDMAIN pfnTrustedMain = supR3HardenedMainGetTrustedMain(pszProgName);
+ g_enmSupR3HardenedMainState = SUPR3HARDENEDMAINSTATE_CALLED_TRUSTED_MAIN;
return pfnTrustedMain(argc, argv, envp);
}
-
-#ifdef RT_OS_WINDOWS
-
-extern "C" int main(int argc, char **argv, char **envp);
-
-/**
- * The executable entry point.
- */
-extern "C" void __stdcall suplibHardenedWindowsMain(void)
-{
- RTEXITCODE rcExit = RTEXITCODE_FAILURE;
-
- /*
- * Convert the arguments to UTF-8.
- */
- int cArgs;
- PWSTR *papwszArgs = CommandLineToArgvW(GetCommandLineW(), &cArgs); /** @todo fix me! */
- if (papwszArgs)
- {
- char **papszArgs = (char **)HeapAlloc(GetProcessHeap(), 0 /* dwFlags*/, (cArgs + 1) * sizeof(const char **));
- if (papszArgs)
- {
- int iArg;
- for (iArg = 0; iArg < cArgs; iArg++)
- {
- int cbNeeded = WideCharToMultiByte(CP_UTF8, 0 /*dwFlags*/, papwszArgs[iArg], -1, NULL /*pszDst*/, 0 /*cbDst*/,
- NULL /*pchDefChar*/, NULL /* pfUsedDefChar */);
- if (!cbNeeded)
- {
- suplibHardenedPrintF("CommandLineToArgvW failed on argument %d: %u\n", iArg, GetLastError());
- break;
- }
-
- papszArgs[iArg] = (char *)HeapAlloc(GetProcessHeap(), 0 /*dwFlags*/, cbNeeded);
- if (!papszArgs[iArg])
- {
- suplibHardenedPrintF("HeapAlloc failed");
- break;
- }
-
- int cbRet = WideCharToMultiByte(CP_UTF8, 0 /*dwFlags*/, papwszArgs[iArg], -1, papszArgs[iArg], cbNeeded,
- NULL /*pchDefChar*/, NULL /* pfUsedDefChar */);
- if (!cbRet)
- {
- suplibHardenedPrintF("CommandLineToArgvW failed on argument %d: %u\n", iArg, GetLastError());
- break;
- }
- }
- if (iArg == cArgs)
- {
- papszArgs[iArg] = NULL;
-
- /*
- * Call the main function.
- */
- rcExit = (RTEXITCODE)main(cArgs, papszArgs, NULL);
- }
- }
- else
- suplibHardenedPrintF("HeapAlloc failed\n");
- }
- else
- suplibHardenedPrintF("CommandLineToArgvW failed\n");
-
- /*
- * Exit the process (never return).
- */
- for (;;)
- ExitProcess(rcExit);
-}
-
-#endif
diff --git a/src/VBox/HostDrivers/Support/SUPR3HardenedNoCrt.cpp b/src/VBox/HostDrivers/Support/SUPR3HardenedNoCrt.cpp
new file mode 100644
index 00000000000..e3ff7c0f605
--- /dev/null
+++ b/src/VBox/HostDrivers/Support/SUPR3HardenedNoCrt.cpp
@@ -0,0 +1,205 @@
+/* $Id$ */
+/** @file
+ * VirtualBox Support Library - Hardened main() no-crt routines.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#if RT_OS_WINDOWS
+# include <Windows.h>
+#endif
+
+#include <VBox/sup.h>
+
+#include "SUPLibInternal.h"
+
+
+#ifdef SUP_HARDENED_NEED_CRT_FUNCTIONS
+
+/** memcmp */
+DECLHIDDEN(int) suplibHardenedMemComp(void const *pvDst, const void *pvSrc, size_t cbToComp)
+{
+ size_t const *puDst = (size_t const *)pvDst;
+ size_t const *puSrc = (size_t const *)pvSrc;
+ while (cbToComp >= sizeof(size_t))
+ {
+ if (*puDst != *puSrc)
+ break;
+ puDst++;
+ puSrc++;
+ cbToComp -= sizeof(size_t);
+ }
+
+ uint8_t const *pbDst = (uint8_t const *)puDst;
+ uint8_t const *pbSrc = (uint8_t const *)puSrc;
+ while (cbToComp > 0)
+ {
+ if (*pbDst != *pbSrc)
+ {
+ if (*pbDst < *pbSrc)
+ return -1;
+ return 1;
+ }
+
+ pbDst++;
+ pbSrc++;
+ cbToComp--;
+ }
+
+ return 0;
+}
+
+
+/** memcpy */
+DECLHIDDEN(void *) suplibHardenedMemCopy(void *pvDst, const void *pvSrc, size_t cbToCopy)
+{
+ size_t *puDst = (size_t *)pvDst;
+ size_t const *puSrc = (size_t const *)pvSrc;
+ while (cbToCopy >= sizeof(size_t))
+ {
+ *puDst++ = *puSrc++;
+ cbToCopy -= sizeof(size_t);
+ }
+
+ uint8_t *pbDst = (uint8_t *)puDst;
+ uint8_t const *pbSrc = (uint8_t const *)puSrc;
+ while (cbToCopy > 0)
+ {
+ *pbDst++ = *pbSrc++;
+ cbToCopy--;
+ }
+
+ return pvDst;
+}
+
+
+/** memset */
+DECLHIDDEN(void *) suplibHardenedMemSet(void *pvDst, int ch, size_t cbToSet)
+{
+ uint8_t *pbDst = (uint8_t *)pvDst;
+ while (cbToSet > 0)
+ {
+ *pbDst++ = (uint8_t)ch;
+ cbToSet--;
+ }
+
+ return pvDst;
+}
+
+
+/** strcpy */
+DECLHIDDEN(char *) suplibHardenedStrCopy(char *pszDst, const char *pszSrc)
+{
+ char *pszRet = pszDst;
+ char ch;
+ do
+ {
+ ch = *pszSrc++;
+ *pszDst++ = ch;
+ } while (ch);
+ return pszRet;
+}
+
+
+/** strlen */
+DECLHIDDEN(size_t) suplibHardenedStrLen(const char *psz)
+{
+ const char *pszStart = psz;
+ while (*psz)
+ psz++;
+ return psz - pszStart;
+}
+
+
+/** strcat */
+DECLHIDDEN(char *) suplibHardenedStrCat(char *pszDst, const char *pszSrc)
+{
+ char *pszRet = pszDst;
+ while (*pszDst)
+ pszDst++;
+ suplibHardenedStrCopy(pszDst, pszSrc);
+ return pszRet;
+}
+
+
+# ifdef RT_OS_WINDOWS
+/** stricmp */
+DECLHIDDEN(int) suplibHardenedStrICmp(const char *psz1, const char *psz2)
+{
+ const char *pszOrg1 = psz1;
+ const char *pszOrg2 = psz2;
+
+ for (;;)
+ {
+ char ch1 = *psz1++;
+ char ch2 = *psz2++;
+ if (ch1 != ch2)
+ {
+ int rc = CompareStringA(LOCALE_USER_DEFAULT, NORM_IGNORECASE, pszOrg1, -1, pszOrg2, -1);
+# ifdef VBOX_STRICT
+ if (rc == 0)
+ __debugbreak();
+# endif
+ return rc - 2;
+ }
+ if (ch1 == 0)
+ return 0;
+ }
+}
+# endif
+
+
+/** strcmp */
+DECLHIDDEN(int) suplibHardenedStrCmp(const char *psz1, const char *psz2)
+{
+ for (;;)
+ {
+ char ch1 = *psz1++;
+ char ch2 = *psz2++;
+ if (ch1 != ch2)
+ return ch1 < ch2 ? -1 : 1;
+ if (ch1 == 0)
+ return 0;
+ }
+}
+
+
+/** strncmp */
+DECLHIDDEN(int) suplibHardenedStrNCmp(const char *psz1, const char *psz2, size_t cchMax)
+{
+ while (cchMax-- > 0)
+ {
+ char ch1 = *psz1++;
+ char ch2 = *psz2++;
+ if (ch1 != ch2)
+ return ch1 < ch2 ? -1 : 1;
+ if (ch1 == 0)
+ break;
+ }
+ return 0;
+}
+
+#endif /* SUP_HARDENED_NEED_CRT_FUNCTIONS */
+
diff --git a/src/VBox/HostDrivers/Support/SUPR3HardenedVerify.cpp b/src/VBox/HostDrivers/Support/SUPR3HardenedVerify.cpp
index 74b00c975b8..352c81f4522 100644
--- a/src/VBox/HostDrivers/Support/SUPR3HardenedVerify.cpp
+++ b/src/VBox/HostDrivers/Support/SUPR3HardenedVerify.cpp
@@ -73,6 +73,10 @@
#include <iprt/string.h>
#include "SUPLibInternal.h"
+#if defined(RT_OS_WINDOWS) && defined(VBOX_WITH_HARDENING)
+# define SUPHNTVI_NO_NT_STUFF
+# include "win/SUPHardenedVerify-win.h"
+#endif
/*******************************************************************************
@@ -85,6 +89,13 @@
# define dirfd(d) ((d)->d_fd)
#endif
+/** Compare table file names with externally supplied names. */
+#if defined(RT_OS_WINDOWS) || defined(RT_OS_OS2)
+# define SUP_COMP_FILENAME suplibHardenedStrICmp
+#else
+# define SUP_COMP_FILENAME suplibHardenedStrCmp
+#endif
+
/*******************************************************************************
* Global Variables *
@@ -106,9 +117,9 @@ static SUPINSTFILE const g_aSupInstallFiles[] =
{ kSupIFT_Dll, kSupID_AppPrivArch, false, "VBoxDD2R0.r0" },
#ifdef VBOX_WITH_RAW_MODE
- { kSupIFT_Dll, kSupID_AppPrivArch, false, "VMMGC.gc" },
- { kSupIFT_Dll, kSupID_AppPrivArch, false, "VBoxDDGC.gc" },
- { kSupIFT_Dll, kSupID_AppPrivArch, false, "VBoxDD2GC.gc" },
+ { kSupIFT_Rc, kSupID_AppPrivArch, false, "VMMGC.gc" },
+ { kSupIFT_Rc, kSupID_AppPrivArch, false, "VBoxDDGC.gc" },
+ { kSupIFT_Rc, kSupID_AppPrivArch, false, "VBoxDD2GC.gc" },
#endif
{ kSupIFT_Dll, kSupID_SharedLib, false, "VBoxRT" SUPLIB_DLL_SUFF },
@@ -153,7 +164,7 @@ static SUPINSTFILE const g_aSupInstallFiles[] =
#ifdef VBOX_WITH_MAIN
{ kSupIFT_Exe, kSupID_AppBin, false, "VBoxSVC" SUPLIB_EXE_SUFF },
#ifdef RT_OS_WINDOWS
- { kSupIFT_Dll, kSupID_AppPrivArchComp, false, "VBoxC" SUPLIB_DLL_SUFF },
+ { kSupIFT_Dll, kSupID_SharedLib, false, "VBoxC" SUPLIB_DLL_SUFF },
#else
{ kSupIFT_Exe, kSupID_AppPrivArch, false, "VBoxXPCOMIPCD" SUPLIB_EXE_SUFF },
{ kSupIFT_Dll, kSupID_SharedLib, false, "VBoxXPCOM" SUPLIB_DLL_SUFF },
@@ -346,7 +357,7 @@ DECLHIDDEN(int) supR3HardenedVerifyFixedDir(SUPINSTDIR enmDir, bool fFatal)
GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_DELETE | FILE_SHARE_WRITE,
NULL,
- OPEN_ALWAYS,
+ OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_BACKUP_SEMANTICS,
NULL);
if (hDir != INVALID_HANDLE_VALUE)
@@ -465,17 +476,35 @@ static int supR3HardenedVerifyFileInternal(int iFile, bool fFatal, bool fLeaveFi
rc = supR3HardenedMakeFilePath(pFile, szPath, sizeof(szPath), true /*fWithFilename*/, fFatal);
if (RT_SUCCESS(rc))
{
-#if defined(RT_OS_WINDOWS)
+#if defined(RT_OS_WINDOWS) /** @todo Need to use WCHAR on windows! */
HANDLE hFile = CreateFile(szPath,
GENERIC_READ,
FILE_SHARE_READ,
NULL,
- OPEN_ALWAYS,
+ OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if (hFile != INVALID_HANDLE_VALUE)
{
- /** @todo Check the type, and verify the signature (separate function so we can skip it). */
+# if defined(VBOX_WITH_HARDENING) && !defined(IN_SUP_R3_STATIC) /* Latter: Not in VBoxCpuReport and friends. */
+
+ char szErr[1024];
+ RTERRINFO ErrInfo;
+ RTErrInfoInit(&ErrInfo, szErr, sizeof(szErr));
+
+ uint32_t fFlags = SUPHNTVI_F_REQUIRE_BUILD_CERT;
+ if (pFile->enmType == kSupIFT_Rc)
+ fFlags |= SUPHNTVI_F_RC_IMAGE;
+
+ rc = supHardenedWinVerifyImageByHandleNoName(hFile, fFlags, &ErrInfo);
+ if (RT_FAILURE(rc))
+ {
+ rc = supR3HardenedError(rc, fFatal, "supR3HardenedVerifyFileInternal: '%s': Image verify error rc=%Rrc: %s\n",
+ szPath, rc, szErr);
+ CloseHandle(hFile);
+ }
+ else
+#endif
{
/* it's valid. */
if (fLeaveFileOpen)
@@ -490,8 +519,7 @@ static int supR3HardenedVerifyFileInternal(int iFile, bool fFatal, bool fLeaveFi
int err = GetLastError();
if (!pFile->fOptional || err != ERROR_FILE_NOT_FOUND)
rc = supR3HardenedError(VERR_PATH_NOT_FOUND, fFatal,
- "supR3HardenedVerifyFileInternal: Failed to open \"%s\": err=%d\n",
- szPath, err);
+ "supR3HardenedVerifyFileInternal: Failed to open '%s': err=%d\n", szPath, err);
}
#else /* UNIXY */
int fd = open(szPath, O_RDONLY, 0);
@@ -580,11 +608,7 @@ static int supR3HardenedVerifySameFile(int iFile, const char *pszFilename, bool
int rc = supR3HardenedMakeFilePath(pFile, szName, sizeof(szName), true /*fWithFilename*/, fFatal);
if (RT_FAILURE(rc))
return rc;
-#if defined(RT_OS_WINDOWS) || defined(RT_OS_OS2)
- if (suplibHardenedStrICmp(szName, pszFilename))
-#else
- if (suplibHardenedStrCmp(szName, pszFilename))
-#endif
+ if (SUP_COMP_FILENAME(szName, pszFilename))
{
/*
* Normalize the two paths and compare again.
@@ -595,14 +619,14 @@ static int supR3HardenedVerifySameFile(int iFile, const char *pszFilename, bool
char szName2[RTPATH_MAX];
if ( GetFullPathName(szName, RT_ELEMENTS(szName2), &szName2[0], &pszIgnored)
&& GetFullPathName(pszFilename, RT_ELEMENTS(szName), &szName[0], &pszIgnored))
- if (!suplibHardenedStrICmp(szName2, szName))
+ if (!SUP_COMP_FILENAME(szName2, szName))
rc = VINF_SUCCESS;
#else
AssertCompile(RTPATH_MAX >= PATH_MAX);
char szName2[RTPATH_MAX];
if ( realpath(szName, szName2) != NULL
&& realpath(pszFilename, szName) != NULL)
- if (!suplibHardenedStrCmp(szName2, szName))
+ if (!SUP_COMP_FILENAME(szName2, szName))
rc = VINF_SUCCESS;
#endif
@@ -644,7 +668,7 @@ DECLHIDDEN(int) supR3HardenedVerifyFixedFile(const char *pszFilename, bool fFata
*/
const char *pszName = supR3HardenedPathFilename(pszFilename);
for (unsigned iFile = 0; iFile < RT_ELEMENTS(g_aSupInstallFiles); iFile++)
- if (!suplibHardenedStrCmp(pszName, g_aSupInstallFiles[iFile].pszFile))
+ if (!SUP_COMP_FILENAME(pszName, g_aSupInstallFiles[iFile].pszFile))
{
int rc = supR3HardenedVerifySameFile(iFile, pszFilename, fFatal);
if (RT_SUCCESS(rc))
@@ -903,7 +927,7 @@ static int supR3HardenedVerifyPathSanity(const char *pszPath, PRTERRINFO pErrInf
* Check that it's an absolute path and copy the volume/root specifier.
*/
#if defined(RT_OS_WINDOWS) || defined(RT_OS_OS2)
- if ( RT_C_IS_ALPHA(pszSrc[0])
+ if ( !RT_C_IS_ALPHA(pszSrc[0])
|| pszSrc[1] != ':'
|| !RTPATH_IS_SLASH(pszSrc[2]))
return supR3HardenedSetError3(VERR_SUPLIB_PATH_NOT_ABSOLUTE, pErrInfo, "The path is not absolute: '", pszPath, "'");
@@ -1441,10 +1465,14 @@ DECLHIDDEN(int) supR3HardenedVerifyDir(const char *pszDirPath, bool fRecursive,
* @param hNativeFile Handle to the file, verify that it's the same
* as we ended up with when verifying the path.
* RTHCUINTPTR_MAX means NIL here.
+ * @param fMaybe3rdParty Set if the file is could be a supplied by a
+ * third party. Different validation rules may
+ * apply to 3rd party code on some platforms.
* @param pErrInfo Where to return extended error information.
* Optional.
*/
-DECLHIDDEN(int) supR3HardenedVerifyFile(const char *pszFilename, RTHCUINTPTR hNativeFile, PRTERRINFO pErrInfo)
+DECLHIDDEN(int) supR3HardenedVerifyFile(const char *pszFilename, RTHCUINTPTR hNativeFile,
+ bool fMaybe3rdParty, PRTERRINFO pErrInfo)
{
/*
* Validate the input path and parse it.
@@ -1476,10 +1504,50 @@ DECLHIDDEN(int) supR3HardenedVerifyFile(const char *pszFilename, RTHCUINTPTR hNa
}
/*
- * Verify the file.
+ * Verify the file handle against the last component, if specified.
*/
if (hNativeFile != RTHCUINTPTR_MAX)
- return supR3HardenedVerifySameFsObject(hNativeFile, &FsObjState, Info.szPath, pErrInfo);
+ {
+ rc = supR3HardenedVerifySameFsObject(hNativeFile, &FsObjState, Info.szPath, pErrInfo);
+ if (RT_FAILURE(rc))
+ return rc;
+ }
+
+#ifdef RT_OS_WINDOWS
+ /*
+ * The files shall be signed on windows, verify that.
+ */
+ HANDLE hVerify;
+ if (hNativeFile == RTHCUINTPTR_MAX)
+ hVerify = CreateFile(pszFilename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
+ else if (!DuplicateHandle(GetCurrentProcess(), (HANDLE)hNativeFile, GetCurrentProcess(), &hVerify,
+ GENERIC_READ, false /*bInheritHandle*/, 0 /*dwOptions*/))
+ hVerify = INVALID_HANDLE_VALUE;
+ if (hVerify != INVALID_HANDLE_VALUE)
+ {
+ uint32_t fFlags = SUPHNTVI_F_REQUIRE_KERNEL_CODE_SIGNING;
+ if (!fMaybe3rdParty)
+ fFlags = SUPHNTVI_F_REQUIRE_BUILD_CERT;
+ const char *pszSuffix = RTPathSuffix(pszFilename);
+ if ( pszSuffix
+ && pszSuffix[0] == '.'
+ && ( RT_C_TO_LOWER(pszSuffix[1]) == 'r'
+ || RT_C_TO_LOWER(pszSuffix[1]) == 'g')
+ && RT_C_TO_LOWER(pszSuffix[2]) == 'c'
+ && pszSuffix[3] == '\0' )
+ fFlags |= SUPHNTVI_F_RC_IMAGE;
+# ifndef IN_SUP_R3_STATIC /* Not in VBoxCpuReport and friends. */
+ rc = supHardenedWinVerifyImageByHandleNoName(hVerify, fFlags, pErrInfo);
+# endif
+ CloseHandle(hVerify);
+ }
+ else
+ rc = RTErrInfoSetF(pErrInfo, RTErrConvertFromWin32(GetLastError()),
+ "Error %u trying to open (or duplicate handle for) '%s'", GetLastError(), pszFilename);
+ if (RT_FAILURE(rc))
+ return rc;
+#endif
+
return VINF_SUCCESS;
}
diff --git a/src/VBox/HostDrivers/Support/darwin/SUPDrv-darwin.cpp b/src/VBox/HostDrivers/Support/darwin/SUPDrv-darwin.cpp
index a8f41c830e8..318d8445b6e 100644
--- a/src/VBox/HostDrivers/Support/darwin/SUPDrv-darwin.cpp
+++ b/src/VBox/HostDrivers/Support/darwin/SUPDrv-darwin.cpp
@@ -781,6 +781,25 @@ DECLEXPORT(int) VBOXCALL SUPDrvDarwinIDC(uint32_t uReq, PSUPDRVIDCREQHDR pReq)
}
+void VBOXCALL supdrvOSCleanupSession(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession)
+{
+ NOREF(pDevExt);
+ NOREF(pSession);
+}
+
+
+void VBOXCALL supdrvOSSessionHashTabInserted(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, void *pvUser)
+{
+ NOREF(pDevExt); NOREF(pSession); NOREF(pvUser);
+}
+
+
+void VBOXCALL supdrvOSSessionHashTabRemoved(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, void *pvUser)
+{
+ NOREF(pDevExt); NOREF(pSession); NOREF(pvUser);
+}
+
+
/**
* Initializes any OS specific object creator fields.
*/
diff --git a/src/VBox/HostDrivers/Support/freebsd/SUPDrv-freebsd.c b/src/VBox/HostDrivers/Support/freebsd/SUPDrv-freebsd.c
index f356a4998a5..6288a1eaa6c 100644
--- a/src/VBox/HostDrivers/Support/freebsd/SUPDrv-freebsd.c
+++ b/src/VBox/HostDrivers/Support/freebsd/SUPDrv-freebsd.c
@@ -495,6 +495,25 @@ int VBOXCALL SUPDrvFreeBSDIDC(uint32_t uReq, PSUPDRVIDCREQHDR pReq)
}
+void VBOXCALL supdrvOSCleanupSession(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession)
+{
+ NOREF(pDevExt);
+ NOREF(pSession);
+}
+
+
+void VBOXCALL supdrvOSSessionHashTabInserted(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, void *pvUser)
+{
+ NOREF(pDevExt); NOREF(pSession); NOREF(pvUser);
+}
+
+
+void VBOXCALL supdrvOSSessionHashTabRemoved(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, void *pvUser)
+{
+ NOREF(pDevExt); NOREF(pSession); NOREF(pvUser);
+}
+
+
void VBOXCALL supdrvOSObjInitCreator(PSUPDRVOBJ pObj, PSUPDRVSESSION pSession)
{
NOREF(pObj);
diff --git a/src/VBox/HostDrivers/Support/linux/SUPDrv-linux.c b/src/VBox/HostDrivers/Support/linux/SUPDrv-linux.c
index 87c361987d2..96b54370330 100644
--- a/src/VBox/HostDrivers/Support/linux/SUPDrv-linux.c
+++ b/src/VBox/HostDrivers/Support/linux/SUPDrv-linux.c
@@ -808,6 +808,25 @@ int VBOXCALL SUPDrvLinuxIDC(uint32_t uReq, PSUPDRVIDCREQHDR pReq)
EXPORT_SYMBOL(SUPDrvLinuxIDC);
+void VBOXCALL supdrvOSCleanupSession(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession)
+{
+ NOREF(pDevExt);
+ NOREF(pSession);
+}
+
+
+void VBOXCALL supdrvOSSessionHashTabInserted(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, void *pvUser)
+{
+ NOREF(pDevExt); NOREF(pSession); NOREF(pvUser);
+}
+
+
+void VBOXCALL supdrvOSSessionHashTabRemoved(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, void *pvUser)
+{
+ NOREF(pDevExt); NOREF(pSession); NOREF(pvUser);
+}
+
+
/**
* Initializes any OS specific object creator fields.
*/
diff --git a/src/VBox/HostDrivers/Support/os2/SUPDrv-os2.cpp b/src/VBox/HostDrivers/Support/os2/SUPDrv-os2.cpp
index c8fa3d13d3a..7e07ad634d6 100644
--- a/src/VBox/HostDrivers/Support/os2/SUPDrv-os2.cpp
+++ b/src/VBox/HostDrivers/Support/os2/SUPDrv-os2.cpp
@@ -363,6 +363,25 @@ DECLASM(int) VBoxDrvIOCtl(uint16_t sfn, uint8_t iCat, uint8_t iFunction, void *p
}
+void VBOXCALL supdrvOSCleanupSession(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession)
+{
+ NOREF(pDevExt);
+ NOREF(pSession);
+}
+
+
+void VBOXCALL supdrvOSSessionHashTabInserted(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, void *pvUser)
+{
+ NOREF(pDevExt); NOREF(pSession); NOREF(pvUser);
+}
+
+
+void VBOXCALL supdrvOSSessionHashTabRemoved(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, void *pvUser)
+{
+ NOREF(pDevExt); NOREF(pSession); NOREF(pvUser);
+}
+
+
void VBOXCALL supdrvOSObjInitCreator(PSUPDRVOBJ pObj, PSUPDRVSESSION pSession)
{
NOREF(pObj);
diff --git a/src/VBox/HostDrivers/Support/solaris/SUPDrv-solaris.c b/src/VBox/HostDrivers/Support/solaris/SUPDrv-solaris.c
index 7b32f225826..bd0a29fd3ee 100644
--- a/src/VBox/HostDrivers/Support/solaris/SUPDrv-solaris.c
+++ b/src/VBox/HostDrivers/Support/solaris/SUPDrv-solaris.c
@@ -902,6 +902,25 @@ static int VBoxSupDrvErr2SolarisErr(int rc)
}
+void VBOXCALL supdrvOSCleanupSession(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession)
+{
+ NOREF(pDevExt);
+ NOREF(pSession);
+}
+
+
+void VBOXCALL supdrvOSSessionHashTabInserted(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, void *pvUser)
+{
+ NOREF(pDevExt); NOREF(pSession); NOREF(pvUser);
+}
+
+
+void VBOXCALL supdrvOSSessionHashTabRemoved(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, void *pvUser)
+{
+ NOREF(pDevExt); NOREF(pSession); NOREF(pvUser);
+}
+
+
/**
* Initializes any OS specific object creator fields.
*/
diff --git a/src/VBox/HostDrivers/Support/testcase/Makefile.kmk b/src/VBox/HostDrivers/Support/testcase/Makefile.kmk
index 90ab02dffce..6a8f959a2b7 100644
--- a/src/VBox/HostDrivers/Support/testcase/Makefile.kmk
+++ b/src/VBox/HostDrivers/Support/testcase/Makefile.kmk
@@ -4,7 +4,7 @@
#
#
-# Copyright (C) 2006-2012 Oracle Corporation
+# Copyright (C) 2006-2014 Oracle Corporation
#
# This file is part of VirtualBox Open Source Edition (OSE), as
# available from http://www.virtualbox.org. This file is free software;
diff --git a/src/VBox/HostDrivers/Support/testcase/tstNtQueryStuff.cpp b/src/VBox/HostDrivers/Support/testcase/tstNtQueryStuff.cpp
index 814c4191832..46d6712d769 100644
--- a/src/VBox/HostDrivers/Support/testcase/tstNtQueryStuff.cpp
+++ b/src/VBox/HostDrivers/Support/testcase/tstNtQueryStuff.cpp
@@ -4,7 +4,7 @@
*/
/*
- * Copyright (C) 2006-2012 Oracle Corporation
+ * Copyright (C) 2006-2014 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
@@ -28,43 +28,7 @@
/*******************************************************************************
* Header Files *
*******************************************************************************/
-#include <ntstatus.h>
-#define WIN32_NO_STATUS
-#include <Windows.h>
-#include <winternl.h>
-
-typedef enum
-{
- MemoryBasicInformation = 0,
- MemoryWorkingSetList,
- MemorySectionName,
- MemoryBasicVlmInformation
-} MEMORY_INFORMATION_CLASS;
-
-typedef struct
-{
- UNICODE_STRING SectionFileName;
- WCHAR NameBuffer[ANYSIZE_ARRAY];
-} MEMORY_SECTION_NAME;
-
-extern "C"
-NTSYSAPI NTSTATUS NTAPI NtQueryVirtualMemory(IN HANDLE hProcess,
- IN LPCVOID pvWhere,
- IN MEMORY_INFORMATION_CLASS MemoryInfo,
- OUT PVOID pvBuf,
- IN SIZE_T cbBuf,
- OUT PSIZE_T pcbReturned OPTIONAL);
-
-#define ProcessDebugPort ((PROCESSINFOCLASS)7 )
-#define ProcessHandleCount ((PROCESSINFOCLASS)20)
-#define ProcessWow64Information ((PROCESSINFOCLASS)26)
-#define ProcessImageFileName ((PROCESSINFOCLASS)27)
-#define ProcessDebugObjectHandle ((PROCESSINFOCLASS)30)
-#define ProcessExecuteFlags ((PROCESSINFOCLASS)34)
-#define ProcessImageFileNameWin32 ((PROCESSINFOCLASS)43)
-#define ProcessImageFileMapping ((PROCESSINFOCLASS)44)
-
-
+#include <iprt/nt/nt-and-windows.h>
#include <iprt/test.h>
#include <iprt/string.h>
@@ -303,22 +267,21 @@ static void tstQueryInformationProcess(void)
RTTESTI_CHECK_MSG(NT_SUCCESS(rcNt), ("rcNt=%#x\n", rcNt));
if (NT_SUCCESS(rcNt))
RTTestIPrintf(RTTESTLVL_ALWAYS, "BasicInfo:\n"
- " UniqueProcessId = %#x (%6d)\n"
+ " UniqueProcessId = %#x (%6d)\n"
+ " InheritedFromUniqueProcessId = %#x (%6d)\n"
+ " ExitStatus = %#x\n"
" PebBaseAddress = %p\n"
- " Reserved1 = %p ExitStatus?\n"
- " Reserved2a = %p AffinityMask?\n"
- " Reserved2b = %p (%6d) BasePriority?\n"
- " Reserved3 = %p (%6d) InheritedFromUniqueProcessId?\n"
+ " AffinityMask = %#zx\n"
+ " BasePriority = %#zx\n"
,
BasicInfo.UniqueProcessId, BasicInfo.UniqueProcessId,
+ BasicInfo.InheritedFromUniqueProcessId, BasicInfo.InheritedFromUniqueProcessId,
+ BasicInfo.ExitStatus,
BasicInfo.PebBaseAddress,
- BasicInfo.Reserved1,
- BasicInfo.Reserved2[0],
- BasicInfo.Reserved2[1], BasicInfo.Reserved2[1],
- BasicInfo.Reserved3, BasicInfo.Reserved3
+ BasicInfo.AffinityMask,
+ BasicInfo.BasePriority
);
-
/* Debugger present? */
DWORD_PTR uPtr = ~(DWORD_PTR)0;
cbActual = 0;
@@ -434,7 +397,7 @@ static void tstQueryInformationProcess(void)
}
-int main()
+int main(int argc, char **argv)
{
RTEXITCODE rcExit = RTTestInitAndCreate("tstNtQueryStuff", &g_hTest);
if (rcExit != RTEXITCODE_SUCCESS)
@@ -442,10 +405,25 @@ int main()
RTTestBanner(g_hTest);
g_hProcess = GetCurrentProcess();
+ if (argc >= 2 && argv[1][0] != '-')
+ {
+ const char *pszPid = argv[1];
+ uint32_t idPid = RTStrToInt32(pszPid);
- //tstQueryVirtualMemory();
- tstQueryInformationProcess();
+ uint32_t fAccess = PROCESS_QUERY_INFORMATION;
+ if (argc >= 3)
+ fAccess = RTStrToInt32(argv[2]);
+ g_hProcess = OpenProcess(fAccess, FALSE, idPid);
+ if (g_hProcess == NULL)
+ {
+ RTTestIFailed("Error %u opening process %u (%s)\n", GetLastError(), idPid, pszPid);
+ return RTTestSummaryAndDestroy(g_hTest);
+ }
+ }
+
+ tstQueryVirtualMemory();
+ tstQueryInformationProcess();
return RTTestSummaryAndDestroy(g_hTest);
}
diff --git a/src/VBox/HostDrivers/Support/win/Certificates/Makefile.kup b/src/VBox/HostDrivers/Support/win/Certificates/Makefile.kup
new file mode 100644
index 00000000000..e69de29bb2d
--- /dev/null
+++ b/src/VBox/HostDrivers/Support/win/Certificates/Makefile.kup
diff --git a/src/VBox/HostDrivers/Support/win/Certificates/NtRoot-MicrosoftCodeVerificationRoot-729404101f3e0ca347837fca175a8438.cer b/src/VBox/HostDrivers/Support/win/Certificates/NtRoot-MicrosoftCodeVerificationRoot-729404101f3e0ca347837fca175a8438.cer
new file mode 100644
index 00000000000..32f92899936
--- /dev/null
+++ b/src/VBox/HostDrivers/Support/win/Certificates/NtRoot-MicrosoftCodeVerificationRoot-729404101f3e0ca347837fca175a8438.cer
Binary files differ
diff --git a/src/VBox/HostDrivers/Support/win/Certificates/NtRoot-MicrosoftCodeVerificationRoot-729404101f3e0ca347837fca175a8438.taf b/src/VBox/HostDrivers/Support/win/Certificates/NtRoot-MicrosoftCodeVerificationRoot-729404101f3e0ca347837fca175a8438.taf
new file mode 100644
index 00000000000..486b6fd7ae5
--- /dev/null
+++ b/src/VBox/HostDrivers/Support/win/Certificates/NtRoot-MicrosoftCodeVerificationRoot-729404101f3e0ca347837fca175a8438.taf
Binary files differ
diff --git a/src/VBox/HostDrivers/Support/win/Certificates/SpcRoot-MicrosoftAuthenticodeTmRootAuthority-01.taf b/src/VBox/HostDrivers/Support/win/Certificates/SpcRoot-MicrosoftAuthenticodeTmRootAuthority-01.taf
new file mode 100644
index 00000000000..7b46d69b9f5
--- /dev/null
+++ b/src/VBox/HostDrivers/Support/win/Certificates/SpcRoot-MicrosoftAuthenticodeTmRootAuthority-01.taf
Binary files differ
diff --git a/src/VBox/HostDrivers/Support/win/Certificates/SpcRoot-MicrosoftDigitalMediaAuthority2005-6eff330eb6e7569740680870104baaba.taf b/src/VBox/HostDrivers/Support/win/Certificates/SpcRoot-MicrosoftDigitalMediaAuthority2005-6eff330eb6e7569740680870104baaba.taf
new file mode 100644
index 00000000000..e55039abcd5
--- /dev/null
+++ b/src/VBox/HostDrivers/Support/win/Certificates/SpcRoot-MicrosoftDigitalMediaAuthority2005-6eff330eb6e7569740680870104baaba.taf
Binary files differ
diff --git a/src/VBox/HostDrivers/Support/win/Certificates/SpcRoot-MicrosoftRootAuthority-00c1008b3c3c8811d13ef663ecdf40.taf b/src/VBox/HostDrivers/Support/win/Certificates/SpcRoot-MicrosoftRootAuthority-00c1008b3c3c8811d13ef663ecdf40.taf
new file mode 100644
index 00000000000..46c6250a849
--- /dev/null
+++ b/src/VBox/HostDrivers/Support/win/Certificates/SpcRoot-MicrosoftRootAuthority-00c1008b3c3c8811d13ef663ecdf40.taf
Binary files differ
diff --git a/src/VBox/HostDrivers/Support/win/Certificates/SpcRoot-MicrosoftRootCertificateAuthority-79ad16a14aa0a5ad4c7358f407132e65.taf b/src/VBox/HostDrivers/Support/win/Certificates/SpcRoot-MicrosoftRootCertificateAuthority-79ad16a14aa0a5ad4c7358f407132e65.taf
new file mode 100644
index 00000000000..3131fc27236
--- /dev/null
+++ b/src/VBox/HostDrivers/Support/win/Certificates/SpcRoot-MicrosoftRootCertificateAuthority-79ad16a14aa0a5ad4c7358f407132e65.taf
Binary files differ
diff --git a/src/VBox/HostDrivers/Support/win/Certificates/SpcRoot-MicrosoftRootCertificateAuthority2010-28cc3a25bfba44ac449a9b586b4339aa.taf b/src/VBox/HostDrivers/Support/win/Certificates/SpcRoot-MicrosoftRootCertificateAuthority2010-28cc3a25bfba44ac449a9b586b4339aa.taf
new file mode 100644
index 00000000000..945de02c859
--- /dev/null
+++ b/src/VBox/HostDrivers/Support/win/Certificates/SpcRoot-MicrosoftRootCertificateAuthority2010-28cc3a25bfba44ac449a9b586b4339aa.taf
Binary files differ
diff --git a/src/VBox/HostDrivers/Support/win/Certificates/SpcRoot-MicrosoftRootCertificateAuthority2011-3f8bc8b5fc9fb29643b569d66c42e144.taf b/src/VBox/HostDrivers/Support/win/Certificates/SpcRoot-MicrosoftRootCertificateAuthority2011-3f8bc8b5fc9fb29643b569d66c42e144.taf
new file mode 100644
index 00000000000..610b14f1ff1
--- /dev/null
+++ b/src/VBox/HostDrivers/Support/win/Certificates/SpcRoot-MicrosoftRootCertificateAuthority2011-3f8bc8b5fc9fb29643b569d66c42e144.taf
Binary files differ
diff --git a/src/VBox/HostDrivers/Support/win/Certificates/Timestamp-CopyrightC1997MicrosoftCorp-01.taf b/src/VBox/HostDrivers/Support/win/Certificates/Timestamp-CopyrightC1997MicrosoftCorp-01.taf
new file mode 100644
index 00000000000..b9d8f7b8a26
--- /dev/null
+++ b/src/VBox/HostDrivers/Support/win/Certificates/Timestamp-CopyrightC1997MicrosoftCorp-01.taf
Binary files differ
diff --git a/src/VBox/HostDrivers/Support/win/Certificates/Trusted-OracleCorporationVirtualBox-51ca009816fdbd80f120e015ee75823e.cer b/src/VBox/HostDrivers/Support/win/Certificates/Trusted-OracleCorporationVirtualBox-51ca009816fdbd80f120e015ee75823e.cer
new file mode 100644
index 00000000000..abb6ee6358d
--- /dev/null
+++ b/src/VBox/HostDrivers/Support/win/Certificates/Trusted-OracleCorporationVirtualBox-51ca009816fdbd80f120e015ee75823e.cer
Binary files differ
diff --git a/src/VBox/HostDrivers/Support/win/Certificates/Trusted-OracleCorporationVirtualBox-51ca009816fdbd80f120e015ee75823e.taf b/src/VBox/HostDrivers/Support/win/Certificates/Trusted-OracleCorporationVirtualBox-51ca009816fdbd80f120e015ee75823e.taf
new file mode 100644
index 00000000000..1bc36b69a7e
--- /dev/null
+++ b/src/VBox/HostDrivers/Support/win/Certificates/Trusted-OracleCorporationVirtualBox-51ca009816fdbd80f120e015ee75823e.taf
Binary files differ
diff --git a/src/VBox/HostDrivers/Support/win/NtCreateSection-template-amd64-syscall-type-1.h b/src/VBox/HostDrivers/Support/win/NtCreateSection-template-amd64-syscall-type-1.h
new file mode 100644
index 00000000000..2b8c8c89147
--- /dev/null
+++ b/src/VBox/HostDrivers/Support/win/NtCreateSection-template-amd64-syscall-type-1.h
@@ -0,0 +1,78 @@
+SYSCALL(0x30);
+SYSCALL(0x31);
+SYSCALL(0x32);
+SYSCALL(0x33);
+SYSCALL(0x34);
+SYSCALL(0x35);
+SYSCALL(0x36);
+SYSCALL(0x37);
+SYSCALL(0x38);
+SYSCALL(0x39);
+SYSCALL(0x3A);
+SYSCALL(0x3B);
+SYSCALL(0x3C);
+SYSCALL(0x3D);
+SYSCALL(0x3E);
+SYSCALL(0x3F);
+SYSCALL(0x40);
+SYSCALL(0x41);
+SYSCALL(0x42);
+SYSCALL(0x43);
+SYSCALL(0x44);
+SYSCALL(0x45);
+SYSCALL(0x46);
+SYSCALL(0x47); /* XP64/W2K3-64, Vista, Windows 7 */
+SYSCALL(0x48); /* Windows 8.0 */
+SYSCALL(0x49); /* windows 8.1 */
+SYSCALL(0x4A);
+SYSCALL(0x4B);
+SYSCALL(0x4C);
+SYSCALL(0x4D);
+SYSCALL(0x4E);
+SYSCALL(0x4F);
+SYSCALL(0x51);
+SYSCALL(0x52);
+SYSCALL(0x53);
+SYSCALL(0x54);
+SYSCALL(0x55);
+SYSCALL(0x56);
+SYSCALL(0x57);
+SYSCALL(0x59);
+SYSCALL(0x5A);
+SYSCALL(0x5B);
+SYSCALL(0x5C);
+SYSCALL(0x5D);
+SYSCALL(0x5E);
+SYSCALL(0x5F);
+SYSCALL(0x60);
+SYSCALL(0x61);
+SYSCALL(0x62);
+SYSCALL(0x63);
+SYSCALL(0x64);
+SYSCALL(0x65);
+SYSCALL(0x66);
+SYSCALL(0x67);
+SYSCALL(0x68);
+SYSCALL(0x69);
+SYSCALL(0x6A);
+SYSCALL(0x6B);
+SYSCALL(0x6C);
+SYSCALL(0x6D);
+SYSCALL(0x6E);
+SYSCALL(0x6F);
+SYSCALL(0x70);
+SYSCALL(0x71);
+SYSCALL(0x72);
+SYSCALL(0x73);
+SYSCALL(0x74);
+SYSCALL(0x75);
+SYSCALL(0x76);
+SYSCALL(0x77);
+SYSCALL(0x78);
+SYSCALL(0x79);
+SYSCALL(0x7A);
+SYSCALL(0x7B);
+SYSCALL(0x7C);
+SYSCALL(0x7D);
+SYSCALL(0x7E);
+SYSCALL(0x7F);
diff --git a/src/VBox/HostDrivers/Support/win/NtCreateSection-template-x86-syscall-type-1.h b/src/VBox/HostDrivers/Support/win/NtCreateSection-template-x86-syscall-type-1.h
new file mode 100644
index 00000000000..f80a4d3fe90
--- /dev/null
+++ b/src/VBox/HostDrivers/Support/win/NtCreateSection-template-x86-syscall-type-1.h
@@ -0,0 +1,286 @@
+SYSCALL(0x28);
+SYSCALL(0x29);
+SYSCALL(0x2A);
+SYSCALL(0x2B);
+SYSCALL(0x2C);
+SYSCALL(0x2D);
+SYSCALL(0x2E);
+SYSCALL(0x2F);
+SYSCALL(0x30);
+SYSCALL(0x31);
+
+SYSCALL(0x32); /* WinXP */
+SYSCALL(0x33);
+
+SYSCALL(0x34); /* W2K3 */
+SYSCALL(0x35);
+SYSCALL(0x36);
+SYSCALL(0x37);
+SYSCALL(0x38);
+SYSCALL(0x39);
+SYSCALL(0x3A);
+SYSCALL(0x3B);
+SYSCALL(0x3C);
+SYSCALL(0x3D);
+SYSCALL(0x3E);
+SYSCALL(0x3F);
+SYSCALL(0x40);
+SYSCALL(0x41);
+SYSCALL(0x42);
+SYSCALL(0x43);
+SYSCALL(0x44);
+SYSCALL(0x45);
+SYSCALL(0x46);
+SYSCALL(0x47);
+SYSCALL(0x48);
+SYSCALL(0x49);
+SYSCALL(0x4A);
+
+SYSCALL(0x4B); /* Vista */
+SYSCALL(0x4C);
+SYSCALL(0x4D);
+SYSCALL(0x4E);
+SYSCALL(0x4F);
+SYSCALL(0x50);
+SYSCALL(0x51);
+SYSCALL(0x52);
+SYSCALL(0x53);
+
+SYSCALL(0x54); /* Windows 7 */
+SYSCALL(0x55);
+SYSCALL(0x56);
+SYSCALL(0x57);
+SYSCALL(0x59);
+SYSCALL(0x5A);
+SYSCALL(0x5B);
+SYSCALL(0x5C);
+SYSCALL(0x5D);
+SYSCALL(0x5E);
+SYSCALL(0x5F);
+SYSCALL(0x60);
+SYSCALL(0x61);
+SYSCALL(0x62);
+SYSCALL(0x63);
+SYSCALL(0x64);
+SYSCALL(0x65);
+SYSCALL(0x66);
+SYSCALL(0x67);
+SYSCALL(0x68);
+SYSCALL(0x69);
+SYSCALL(0x6A);
+SYSCALL(0x6B);
+SYSCALL(0x6C);
+SYSCALL(0x6D);
+SYSCALL(0x6E);
+SYSCALL(0x6F);
+SYSCALL(0x70);
+SYSCALL(0x71);
+SYSCALL(0x72);
+SYSCALL(0x73);
+SYSCALL(0x74);
+SYSCALL(0x75);
+SYSCALL(0x76);
+SYSCALL(0x77);
+SYSCALL(0x78);
+SYSCALL(0x79);
+SYSCALL(0x7A);
+SYSCALL(0x7B);
+SYSCALL(0x7C);
+SYSCALL(0x7D);
+SYSCALL(0x7E);
+SYSCALL(0x7F);
+SYSCALL(0x80);
+SYSCALL(0x81);
+SYSCALL(0x82);
+SYSCALL(0x83);
+SYSCALL(0x84);
+SYSCALL(0x85);
+SYSCALL(0x86);
+SYSCALL(0x87);
+SYSCALL(0x88);
+SYSCALL(0x89);
+SYSCALL(0x8A);
+SYSCALL(0x8B);
+SYSCALL(0x8C);
+SYSCALL(0x8D);
+SYSCALL(0x8E);
+SYSCALL(0x8F);
+SYSCALL(0x90);
+SYSCALL(0x91);
+SYSCALL(0x92);
+SYSCALL(0x93);
+SYSCALL(0x94);
+SYSCALL(0x95);
+SYSCALL(0x96);
+SYSCALL(0x97);
+SYSCALL(0x98);
+SYSCALL(0x99);
+SYSCALL(0x9A);
+SYSCALL(0x9B);
+SYSCALL(0x9C);
+SYSCALL(0x9D);
+SYSCALL(0x9E);
+SYSCALL(0x9F);
+
+SYSCALL(0x100);
+SYSCALL(0x101);
+SYSCALL(0x102);
+SYSCALL(0x103);
+SYSCALL(0x104);
+SYSCALL(0x105);
+SYSCALL(0x106);
+SYSCALL(0x107);
+SYSCALL(0x108);
+SYSCALL(0x109);
+SYSCALL(0x10A);
+SYSCALL(0x10B);
+SYSCALL(0x10C);
+SYSCALL(0x10D);
+SYSCALL(0x10E);
+SYSCALL(0x10F);
+SYSCALL(0x110);
+SYSCALL(0x111);
+SYSCALL(0x112);
+SYSCALL(0x113);
+SYSCALL(0x114);
+SYSCALL(0x115);
+SYSCALL(0x116);
+SYSCALL(0x117);
+SYSCALL(0x118);
+SYSCALL(0x119);
+SYSCALL(0x11A);
+SYSCALL(0x11B);
+SYSCALL(0x11C);
+SYSCALL(0x11D);
+SYSCALL(0x11E);
+SYSCALL(0x11F);
+SYSCALL(0x120);
+SYSCALL(0x121);
+SYSCALL(0x122);
+SYSCALL(0x123);
+SYSCALL(0x124);
+SYSCALL(0x125);
+SYSCALL(0x126);
+SYSCALL(0x127);
+SYSCALL(0x128);
+SYSCALL(0x129);
+SYSCALL(0x12A);
+SYSCALL(0x12B);
+SYSCALL(0x12C);
+SYSCALL(0x12D);
+SYSCALL(0x12E);
+SYSCALL(0x12F);
+SYSCALL(0x130);
+SYSCALL(0x131);
+SYSCALL(0x132);
+SYSCALL(0x133);
+SYSCALL(0x134);
+SYSCALL(0x135);
+SYSCALL(0x136);
+SYSCALL(0x137);
+SYSCALL(0x138);
+SYSCALL(0x139);
+SYSCALL(0x13A);
+SYSCALL(0x13B);
+SYSCALL(0x13C);
+SYSCALL(0x13D);
+SYSCALL(0x13E);
+SYSCALL(0x13F);
+SYSCALL(0x140);
+SYSCALL(0x141);
+SYSCALL(0x142);
+SYSCALL(0x143);
+SYSCALL(0x144);
+SYSCALL(0x145);
+SYSCALL(0x146);
+SYSCALL(0x147);
+SYSCALL(0x148);
+SYSCALL(0x149);
+SYSCALL(0x14A);
+SYSCALL(0x14B);
+SYSCALL(0x14C);
+SYSCALL(0x14D);
+SYSCALL(0x14E);
+SYSCALL(0x14F);
+SYSCALL(0x150);
+SYSCALL(0x151);
+SYSCALL(0x152);
+SYSCALL(0x153);
+
+SYSCALL(0x154); /* Windows 8.1 */
+SYSCALL(0x155);
+SYSCALL(0x156);
+SYSCALL(0x157);
+SYSCALL(0x158);
+SYSCALL(0x159);
+SYSCALL(0x15A);
+SYSCALL(0x15B);
+SYSCALL(0x15C);
+SYSCALL(0x15D);
+SYSCALL(0x15E);
+SYSCALL(0x15F);
+SYSCALL(0x160);
+SYSCALL(0x161);
+SYSCALL(0x162);
+SYSCALL(0x163);
+SYSCALL(0x164);
+SYSCALL(0x165);
+SYSCALL(0x166);
+SYSCALL(0x167);
+SYSCALL(0x168);
+SYSCALL(0x169);
+SYSCALL(0x16A);
+SYSCALL(0x16B);
+SYSCALL(0x16C);
+SYSCALL(0x16D);
+SYSCALL(0x16E);
+SYSCALL(0x16F);
+SYSCALL(0x170);
+SYSCALL(0x171);
+SYSCALL(0x172);
+SYSCALL(0x173);
+SYSCALL(0x174);
+SYSCALL(0x175);
+SYSCALL(0x176);
+SYSCALL(0x177);
+SYSCALL(0x178);
+SYSCALL(0x179);
+SYSCALL(0x17A);
+SYSCALL(0x17B);
+SYSCALL(0x17C);
+SYSCALL(0x17D);
+SYSCALL(0x17E);
+SYSCALL(0x17F);
+SYSCALL(0x180);
+SYSCALL(0x181);
+SYSCALL(0x182);
+SYSCALL(0x183);
+SYSCALL(0x184);
+SYSCALL(0x185);
+SYSCALL(0x186);
+SYSCALL(0x187);
+SYSCALL(0x188);
+SYSCALL(0x189);
+SYSCALL(0x18A);
+SYSCALL(0x18B);
+SYSCALL(0x18C);
+SYSCALL(0x18D);
+SYSCALL(0x18E);
+SYSCALL(0x18F);
+SYSCALL(0x190);
+SYSCALL(0x191);
+SYSCALL(0x192);
+SYSCALL(0x193);
+SYSCALL(0x194);
+SYSCALL(0x195);
+SYSCALL(0x196);
+SYSCALL(0x197);
+SYSCALL(0x198);
+SYSCALL(0x199);
+SYSCALL(0x19A);
+SYSCALL(0x19B);
+SYSCALL(0x19C);
+SYSCALL(0x19D);
+SYSCALL(0x19E);
+SYSCALL(0x19F);
+
diff --git a/src/VBox/HostDrivers/Support/win/SUPDrv-win.cpp b/src/VBox/HostDrivers/Support/win/SUPDrv-win.cpp
index 3c946b751b9..862b0d0c8de 100644
--- a/src/VBox/HostDrivers/Support/win/SUPDrv-win.cpp
+++ b/src/VBox/HostDrivers/Support/win/SUPDrv-win.cpp
@@ -27,21 +27,30 @@
/*******************************************************************************
* Header Files *
*******************************************************************************/
+#define IPRT_NT_MAP_TO_ZW
#define LOG_GROUP LOG_GROUP_SUP_DRV
#include "../SUPDrvInternal.h"
#include <excpt.h>
#include <ntimage.h>
#include <iprt/assert.h>
+#include <iprt/avl.h>
+#include <iprt/ctype.h>
#include <iprt/initterm.h>
#include <iprt/mem.h>
#include <iprt/process.h>
#include <iprt/power.h>
+#include <iprt/spinlock.h>
#include <iprt/string.h>
#include <VBox/log.h>
+#include <VBox/err.h>
#include <iprt/asm-amd64-x86.h>
+#ifdef VBOX_WITH_HARDENING
+# include "SUPHardenedVerify-win.h"
+#endif
+
/*******************************************************************************
* Defined Constants And Macros *
@@ -65,6 +74,22 @@
/** Win Symlink name for user access. */
#define DEVICE_NAME_DOS_USR L"\\DosDevices\\VBoxDrvU"
+#ifdef VBOX_WITH_HARDENING
+/** Win32 device name for hardened stub access. */
+# define DEVICE_NAME_STUB "\\\\.\\VBoxDrvStub"
+/** NT device name for hardened stub access. */
+# define DEVICE_NAME_NT_STUB L"\\Device\\VBoxDrvStub"
+///** Win Symlink name for hardened stub access. */
+//# define DEVICE_NAME_DOS_STUB L"\\DosDevices\\VBoxDrvStub"
+
+
+/** Macro for checking for deflecting calls to the stub device. */
+# define VBOXDRV_COMPLETE_IRP_AND_RETURN_IF_STUB_DEV(a_pDevObj, a_pIrp) \
+ do { if ((a_pDevObj) == g_pDevObjStub) supdrvNtCompleteRequest(STATUS_ACCESS_DENIED, a_pIrp); } while (0)
+#else
+# define VBOXDRV_COMPLETE_IRP_AND_RETURN_IF_STUB_DEV(a_pDevObj, a_pIrp) do {} while (0)
+#endif
+
/** Enables the fast I/O control code path. */
#define VBOXDRV_WITH_FAST_IO
@@ -72,15 +97,6 @@
/*******************************************************************************
* Structures and Typedefs *
*******************************************************************************/
-#if 0 //def RT_ARCH_AMD64
-typedef struct SUPDRVEXECMEM
-{
- PMDL pMdl;
- void *pvMapping;
- void *pvAllocation;
-} SUPDRVEXECMEM, *PSUPDRVEXECMEM;
-#endif
-
/**
* Device extension used by VBoxDrvU.
*/
@@ -103,6 +119,122 @@ typedef SUPDRVDEVEXTUSR *PSUPDRVDEVEXTUSR;
? (PSUPDRVDEVEXT)pDevObj->DeviceExtension \
: ((PSUPDRVDEVEXTUSR)pDevObj->DeviceExtension)->pMainDrvExt )
+#ifdef VBOX_WITH_HARDENING
+
+/**
+ * Device extension used by VBoxDrvS.
+ */
+typedef struct SUPDRVDEVEXTSTUB
+{
+ /** Common header. */
+ SUPDRVDEVEXTUSR Common;
+} SUPDRVDEVEXTSTUB;
+/** Pointer to the VBoxDrvS device extension. */
+typedef SUPDRVDEVEXTSTUB *PSUPDRVDEVEXTSTUB;
+/** Value of SUPDRVDEVEXTSTUB::Common.u32Cookie. */
+#define SUPDRVDEVEXTSTUB_COOKIE UINT32_C(0x90abcdef)
+
+
+/**
+ * The kind of process we're protecting.
+ */
+typedef enum SUPDRVNTPROTECTKIND
+{
+ kSupDrvNtProtectKind_Invalid = 0,
+
+ /** Stub process protection while performing process verification.
+ * Next: StubSpawning (or free) */
+ kSupDrvNtProtectKind_StubUnverified,
+ /** Stub process protection before it creates the VM process.
+ * Next: StubParent, StubDead. */
+ kSupDrvNtProtectKind_StubSpawning,
+ /** Stub process protection while having a VM process as child.
+ * Next: StubDead */
+ kSupDrvNtProtectKind_StubParent,
+ /** Dead stub process. */
+ kSupDrvNtProtectKind_StubDead,
+
+ /** Potential VM process.
+ * Next: VmProcessConfirmed, VmProcessDead. */
+ kSupDrvNtProtectKind_VmProcessUnconfirmed,
+ /** Confirmed VM process.
+ * Next: VmProcessDead. */
+ kSupDrvNtProtectKind_VmProcessConfirmed,
+ /** Dead VM process. */
+ kSupDrvNtProtectKind_VmProcessDead,
+
+ /** End of valid protection kinds. */
+ kSupDrvNtProtectKind_End
+} SUPDRVNTPROTECTKIND;
+
+/**
+ * A NT process protection structure.
+ */
+typedef struct SUPDRVNTPROTECT
+{
+ /** The AVL node core structure. The process ID is the pid. */
+ AVLPVNODECORE AvlCore;
+ /** Magic value (SUPDRVNTPROTECT_MAGIC). */
+ uint32_t volatile u32Magic;
+ /** Reference counter. */
+ uint32_t volatile cRefs;
+ /** The kind of process we're protecting. */
+ SUPDRVNTPROTECTKIND volatile enmProcessKind;
+ /** Vista, 7 & 8: Hack to allow more rights to the handle returned by
+ * NtCreateUserProcess. Only applicable to VmProcessUnconfirmed. */
+ bool fFirstProcessCreateHandle : 1;
+ /** Vista, 7 & 8: Hack to allow more rights to the handle returned by
+ * NtCreateUserProcess. Only applicable to VmProcessUnconfirmed. */
+ bool fFirstThreadCreateHandle : 1;
+ /** 8.1: Hack to allow more rights to the handle returned by
+ * NtCreateUserProcess. Only applicable to VmProcessUnconfirmed. */
+ bool fCsrssFirstProcessCreateHandle : 1;
+ /** Vista, 7 & 8: Hack to allow more rights to the handle duplicated by CSR
+ * during process creation. Only applicable to VmProcessUnconfirmed. */
+ bool fCsrssFirstProcessDuplicateHandle : 1;
+ /** 7,: Hack to allow the supid themes service duplicate handle privileges to
+ * our process. */
+ bool fThemesFirstProcessCreateHandle : 1;
+
+ /** The parent PID for VM processes, otherwise NULL. */
+ HANDLE hParentPid;
+ /** The PID of the CSRSS process associated with this process. */
+ HANDLE hCsrssPid;
+ /** Pointer to the CSRSS process structure (referenced). */
+ PEPROCESS pCsrssProcess;
+ /** State dependent data. */
+ union
+ {
+ /** A stub process in the StubParent state will keep a reference to a child
+ * while it's in the VmProcessUnconfirmed state so that it can be cleaned up
+ * correctly if things doesn't work out. */
+ struct SUPDRVNTPROTECT *pChild;
+ /** A process in the VmProcessUnconfirmed state will keep a weak
+ * reference to the parent's protection structure so it can clean up the pChild
+ * refernece the parent has to it. */
+ struct SUPDRVNTPROTECT *pParent;
+ } u;
+} SUPDRVNTPROTECT;
+/** Pointer to a NT process protection record. */
+typedef SUPDRVNTPROTECT *PSUPDRVNTPROTECT;
+/** The SUPDRVNTPROTECT::u32Magic value (Robert A. Heinlein). */
+# define SUPDRVNTPROTECT_MAGIC UINT32_C(0x19070707)
+/** The SUPDRVNTPROTECT::u32Magic value of a dead structure. */
+# define SUPDRVNTPROTECT_MAGIC_DEAD UINT32_C(0x19880508)
+
+/** Pointer to ObRegisterCallbacks. */
+typedef NTSTATUS (NTAPI *PFNOBREGISTERCALLBACKS)(POB_CALLBACK_REGISTRATION, PVOID *);
+/** Pointer to ObUnregisterCallbacks. */
+typedef VOID (NTAPI *PFNOBUNREGISTERCALLBACKS)(PVOID);
+/** Pointer to PsSetCreateProcessNotifyRoutineEx. */
+typedef NTSTATUS (NTAPI *PFNPSSETCREATEPROCESSNOTIFYROUTINEEX)(PCREATE_PROCESS_NOTIFY_ROUTINE_EX, BOOLEAN);
+/** Pointer to PsReferenceProcessFilePointer. */
+typedef NTSTATUS (NTAPI *PFNPSREFERENCEPROCESSFILEPOINTER)(PEPROCESS, PFILE_OBJECT *);
+/** Pointer to PsIsProtectedProcessLight. */
+typedef BOOLEAN (NTAPI *PFNPSISPROTECTEDPROCESSLIGHT)(PEPROCESS);
+
+#endif /* VBOX_WITH_HARDENINIG */
+
/*******************************************************************************
* Internal Functions *
@@ -122,6 +254,18 @@ static NTSTATUS _stdcall VBoxDrvNtInternalDeviceControl(PDEVICE_OBJECT pDevObj
static VOID _stdcall VBoxPowerDispatchCallback(PVOID pCallbackContext, PVOID pArgument1, PVOID pArgument2);
static NTSTATUS _stdcall VBoxDrvNtNotSupportedStub(PDEVICE_OBJECT pDevObj, PIRP pIrp);
static NTSTATUS VBoxDrvNtErr2NtStatus(int rc);
+#ifdef VBOX_WITH_HARDENING
+static NTSTATUS supdrvNtProtectInit(void);
+static void supdrvNtProtectTerm(void);
+static int supdrvNtProtectCreate(PSUPDRVNTPROTECT *ppNtProtect, HANDLE hPid,
+ SUPDRVNTPROTECTKIND enmProcessKind, bool fLink);
+static void supdrvNtProtectRelease(PSUPDRVNTPROTECT pNtProtect);
+static PSUPDRVNTPROTECT supdrvNtProtectLookup(HANDLE hPid);
+static int supdrvNtProtectFindAssociatedCsrss(PSUPDRVNTPROTECT pNtProtect);
+static int supdrvNtProtectVerifyProcess(PSUPDRVNTPROTECT pNtProtect);
+
+static bool supdrvNtIsDebuggerAttached(void);
+#endif
/*******************************************************************************
@@ -174,6 +318,41 @@ static FAST_IO_DISPATCH const g_VBoxDrvFastIoDispatch =
};
#endif /* VBOXDRV_WITH_FAST_IO */
+#ifdef VBOX_WITH_HARDENING
+/** Pointer to the stub device instance. */
+static PDEVICE_OBJECT g_pDevObjStub = NULL;
+/** Spinlock protecting g_NtProtectTree as well as the releasing of protection
+ * structures. */
+static RTSPINLOCK g_hNtProtectLock = NIL_RTSPINLOCK;
+/** AVL tree of SUPDRVNTPROTECT structures. */
+static AVLPVTREE g_NtProtectTree = NULL;
+/** Cookie returned by ObRegisterCallbacks for the callbacks. */
+static PVOID g_pvObCallbacksCookie = NULL;
+/** Combined windows NT version number. See SUP_MAKE_NT_VER_COMBINED. */
+uint32_t g_uNtVerCombined = 0;
+/** Pointer to ObRegisterCallbacks if available.. */
+static PFNOBREGISTERCALLBACKS g_pfnObRegisterCallbacks = NULL;
+/** Pointer to ObUnregisterCallbacks if available.. */
+static PFNOBUNREGISTERCALLBACKS g_pfnObUnRegisterCallbacks = NULL;
+/** Pointer to PsSetCreateProcessNotifyRoutineEx if available.. */
+static PFNPSSETCREATEPROCESSNOTIFYROUTINEEX g_pfnPsSetCreateProcessNotifyRoutineEx = NULL;
+/** Pointer to PsReferenceProcessFilePointer if available. */
+static PFNPSREFERENCEPROCESSFILEPOINTER g_pfnPsReferenceProcessFilePointer = NULL;
+/** Pointer to PsIsProtectedProcessLight. */
+static PFNPSISPROTECTEDPROCESSLIGHT g_pfnPsIsProtectedProcessLight = NULL;
+
+# ifdef RT_ARCH_AMD64
+extern "C" {
+/** Pointer to KiServiceLinkage (used to fake missing ZwQueryVirtualMemory on
+ * XP64 / W2K3-64). */
+PFNRT g_pfnKiServiceLinkage = NULL;
+/** Pointer to KiServiceInternal (used to fake missing ZwQueryVirtualMemory on
+ * XP64 / W2K3-64) */
+PFNRT g_pfnKiServiceInternal = NULL;
+}
+# endif
+#endif
+
/**
* Takes care of creating the devices and their symbolic links.
@@ -191,9 +370,9 @@ static NTSTATUS vboxdrvNtCreateDevices(PDRIVER_OBJECT pDrvObj)
NTSTATUS rcNt = IoCreateDevice(pDrvObj, sizeof(SUPDRVDEVEXT), &DevName, FILE_DEVICE_UNKNOWN, 0, FALSE, &g_pDevObjSys);
if (NT_SUCCESS(rcNt))
{
- UNICODE_STRING DosName;
- RtlInitUnicodeString(&DosName, DEVICE_NAME_DOS_SYS);
- rcNt = IoCreateSymbolicLink(&DosName, &DevName);
+ UNICODE_STRING DosNameSys;
+ RtlInitUnicodeString(&DosNameSys, DEVICE_NAME_DOS_SYS);
+ rcNt = IoCreateSymbolicLink(&DosNameSys, &DevName);
if (NT_SUCCESS(rcNt))
{
/*
@@ -203,24 +382,49 @@ static NTSTATUS vboxdrvNtCreateDevices(PDRIVER_OBJECT pDrvObj)
rcNt = IoCreateDevice(pDrvObj, sizeof(SUPDRVDEVEXTUSR), &DevName, FILE_DEVICE_UNKNOWN, 0, FALSE, &g_pDevObjUsr);
if (NT_SUCCESS(rcNt))
{
- UNICODE_STRING DosName;
- RtlInitUnicodeString(&DosName, DEVICE_NAME_DOS_USR);
- rcNt = IoCreateSymbolicLink(&DosName, &DevName);
+ UNICODE_STRING DosNameUsr;
+ RtlInitUnicodeString(&DosNameUsr, DEVICE_NAME_DOS_USR);
+ rcNt = IoCreateSymbolicLink(&DosNameUsr, &DevName);
if (NT_SUCCESS(rcNt))
{
PSUPDRVDEVEXTUSR pDevExtUsr = (PSUPDRVDEVEXTUSR)g_pDevObjUsr->DeviceExtension;
pDevExtUsr->pMainDrvExt = (PSUPDRVDEVEXT)g_pDevObjSys->DeviceExtension;
pDevExtUsr->u32Cookie = SUPDRVDEVEXTUSR_COOKIE;
- /* Done. */
- return rcNt;
- }
+#ifdef VBOX_WITH_HARDENING
+ /*
+ * Hardened stub device.
+ */
+ RtlInitUnicodeString(&DevName, DEVICE_NAME_NT_STUB);
+ rcNt = IoCreateDevice(pDrvObj, sizeof(SUPDRVDEVEXTSTUB), &DevName, FILE_DEVICE_UNKNOWN, 0, FALSE, &g_pDevObjStub);
+ if (NT_SUCCESS(rcNt))
+ {
+ //UNICODE_STRING DosNameStub;
+ //RtlInitUnicodeString(&DosNameStub, DEVICE_NAME_DOS_STUB);
+ //rcNt = IoCreateSymbolicLink(&DosNameStub, &DevName);
+ if (NT_SUCCESS(rcNt))
+ {
+ PSUPDRVDEVEXTSTUB pDevExtStub = (PSUPDRVDEVEXTSTUB)g_pDevObjStub->DeviceExtension;
+ pDevExtStub->Common.pMainDrvExt = (PSUPDRVDEVEXT)g_pDevObjSys->DeviceExtension;
+ pDevExtStub->Common.u32Cookie = SUPDRVDEVEXTSTUB_COOKIE;
+#endif
+
+ /* Done. */
+ return rcNt;
+#ifdef VBOX_WITH_HARDENING
+ }
- /* Bail out. */
+ /* Bail out. */
+ IoDeleteDevice(g_pDevObjStub);
+ g_pDevObjUsr = NULL;
+ }
+ IoDeleteSymbolicLink(&DosNameUsr);
+#endif
+ }
IoDeleteDevice(g_pDevObjUsr);
g_pDevObjUsr = NULL;
}
- IoDeleteSymbolicLink(&DosName);
+ IoDeleteSymbolicLink(&DosNameSys);
}
IoDeleteDevice(g_pDevObjSys);
g_pDevObjSys = NULL;
@@ -240,9 +444,28 @@ static void vboxdrvNtDestroyDevices(void)
RtlInitUnicodeString(&DosName, DEVICE_NAME_DOS_USR);
rcNt = IoDeleteSymbolicLink(&DosName);
- PSUPDRVDEVEXTUSR pDevExtUsr = (PSUPDRVDEVEXTUSR)g_pDevObjUsr->DeviceExtension;
- pDevExtUsr->pMainDrvExt = NULL;
+#ifdef VBOX_WITH_HARDENING
+ //RtlInitUnicodeString(&DosName, DEVICE_NAME_DOS_STUB);
+ //rcNt = IoDeleteSymbolicLink(&DosName);
+#endif
+ if (g_pDevObjUsr)
+ {
+ PSUPDRVDEVEXTUSR pDevExtUsr = (PSUPDRVDEVEXTUSR)g_pDevObjUsr->DeviceExtension;
+ pDevExtUsr->pMainDrvExt = NULL;
+ }
+#ifdef VBOX_WITH_HARDENING
+ if (g_pDevObjStub)
+ {
+ PSUPDRVDEVEXTSTUB pDevExtStub = (PSUPDRVDEVEXTSTUB)g_pDevObjStub->DeviceExtension;
+ pDevExtStub->Common.pMainDrvExt = NULL;
+ }
+#endif
+
+#ifdef VBOX_WITH_HARDENING
+ IoDeleteDevice(g_pDevObjStub);
+ g_pDevObjStub = NULL;
+#endif
IoDeleteDevice(g_pDevObjUsr);
g_pDevObjUsr = NULL;
IoDeleteDevice(g_pDevObjSys);
@@ -272,74 +495,94 @@ ULONG _stdcall DriverEntry(PDRIVER_OBJECT pDrvObj, PUNICODE_STRING pRegPath)
#endif
/*
- * Create device.
- * (That means creating a device object and a symbolic link so the DOS
- * subsystems (OS/2, win32, ++) can access the device.)
+ * Initialize the runtime (IPRT).
*/
- NTSTATUS rcNt = vboxdrvNtCreateDevices(pDrvObj);
- if (NT_SUCCESS(rcNt))
+ NTSTATUS rcNt;
+ int vrc = RTR0Init(0);
+ if (RT_SUCCESS(vrc))
{
- int vrc = RTR0Init(0);
- if (RT_SUCCESS(vrc))
- {
- Log(("VBoxDrv::DriverEntry\n"));
+ Log(("VBoxDrv::DriverEntry\n"));
+#ifdef VBOX_WITH_HARDENING
+ /*
+ * Initialize process protection.
+ */
+ rcNt = supdrvNtProtectInit();
+ if (NT_SUCCESS(rcNt))
+#endif
+ {
/*
- * Initialize the device extension.
+ * Create device.
+ * (That means creating a device object and a symbolic link so the DOS
+ * subsystems (OS/2, win32, ++) can access the device.)
*/
- PSUPDRVDEVEXT pDevExt = (PSUPDRVDEVEXT)g_pDevObjSys->DeviceExtension;
- memset(pDevExt, 0, sizeof(*pDevExt));
-
- vrc = supdrvInitDevExt(pDevExt, sizeof(SUPDRVSESSION));
- if (!vrc)
+ rcNt = vboxdrvNtCreateDevices(pDrvObj);
+ if (NT_SUCCESS(rcNt))
{
/*
- * Setup the driver entry points in pDrvObj.
+ * Initialize the device extension.
*/
- pDrvObj->DriverUnload = VBoxDrvNtUnload;
- pDrvObj->MajorFunction[IRP_MJ_CREATE] = VBoxDrvNtCreate;
- pDrvObj->MajorFunction[IRP_MJ_CLEANUP] = VBoxDrvNtCleanup;
- pDrvObj->MajorFunction[IRP_MJ_CLOSE] = VBoxDrvNtClose;
- pDrvObj->MajorFunction[IRP_MJ_DEVICE_CONTROL] = VBoxDrvNtDeviceControl;
- pDrvObj->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL] = VBoxDrvNtInternalDeviceControl;
- pDrvObj->MajorFunction[IRP_MJ_READ] = VBoxDrvNtNotSupportedStub;
- pDrvObj->MajorFunction[IRP_MJ_WRITE] = VBoxDrvNtNotSupportedStub;
+ PSUPDRVDEVEXT pDevExt = (PSUPDRVDEVEXT)g_pDevObjSys->DeviceExtension;
+ memset(pDevExt, 0, sizeof(*pDevExt));
- /* more? */
+ vrc = supdrvInitDevExt(pDevExt, sizeof(SUPDRVSESSION));
+ if (!vrc)
+ {
+ /*
+ * Setup the driver entry points in pDrvObj.
+ */
+ pDrvObj->DriverUnload = VBoxDrvNtUnload;
+ pDrvObj->MajorFunction[IRP_MJ_CREATE] = VBoxDrvNtCreate;
+ pDrvObj->MajorFunction[IRP_MJ_CLEANUP] = VBoxDrvNtCleanup;
+ pDrvObj->MajorFunction[IRP_MJ_CLOSE] = VBoxDrvNtClose;
+ pDrvObj->MajorFunction[IRP_MJ_DEVICE_CONTROL] = VBoxDrvNtDeviceControl;
+ pDrvObj->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL] = VBoxDrvNtInternalDeviceControl;
+ pDrvObj->MajorFunction[IRP_MJ_READ] = VBoxDrvNtNotSupportedStub;
+ pDrvObj->MajorFunction[IRP_MJ_WRITE] = VBoxDrvNtNotSupportedStub;
#ifdef VBOXDRV_WITH_FAST_IO
- /* Fast I/O to speed up guest execution roundtrips. */
- pDrvObj->FastIoDispatch = (PFAST_IO_DISPATCH)&g_VBoxDrvFastIoDispatch;
+ /* Fast I/O to speed up guest execution roundtrips. */
+ pDrvObj->FastIoDispatch = (PFAST_IO_DISPATCH)&g_VBoxDrvFastIoDispatch;
#endif
- /* Register ourselves for power state changes. */
- UNICODE_STRING CallbackName;
- OBJECT_ATTRIBUTES Attr;
+ /*
+ * Register ourselves for power state changes. We don't
+ * currently care if this fails.
+ */
+ UNICODE_STRING CallbackName;
+ RtlInitUnicodeString(&CallbackName, L"\\Callback\\PowerState");
- RtlInitUnicodeString(&CallbackName, L"\\Callback\\PowerState");
- InitializeObjectAttributes(&Attr, &CallbackName, OBJ_CASE_INSENSITIVE, NULL, NULL);
+ OBJECT_ATTRIBUTES Attr;
+ InitializeObjectAttributes(&Attr, &CallbackName, OBJ_CASE_INSENSITIVE, NULL, NULL);
- rcNt = ExCreateCallback(&pDevExt->pObjPowerCallback, &Attr, TRUE, TRUE);
- if (rcNt == STATUS_SUCCESS)
- pDevExt->hPowerCallback = ExRegisterCallback(pDevExt->pObjPowerCallback, VBoxPowerDispatchCallback,
- g_pDevObjSys);
+ rcNt = ExCreateCallback(&pDevExt->pObjPowerCallback, &Attr, TRUE, TRUE);
+ if (rcNt == STATUS_SUCCESS)
+ pDevExt->hPowerCallback = ExRegisterCallback(pDevExt->pObjPowerCallback,
+ VBoxPowerDispatchCallback,
+ g_pDevObjSys);
- Log(("VBoxDrv::DriverEntry returning STATUS_SUCCESS\n"));
- return STATUS_SUCCESS;
- }
+ /*
+ * Done! Returning success!
+ */
+ Log(("VBoxDrv::DriverEntry returning STATUS_SUCCESS\n"));
+ return STATUS_SUCCESS;
+ }
- Log(("supdrvInitDevExit failed with vrc=%d!\n", vrc));
- rcNt = VBoxDrvNtErr2NtStatus(vrc);
+ Log(("supdrvInitDevExit failed with vrc=%d!\n", vrc));
+ rcNt = VBoxDrvNtErr2NtStatus(vrc);
- RTR0Term();
- }
- else
- {
- Log(("RTR0Init failed with vrc=%d!\n", vrc));
- rcNt = VBoxDrvNtErr2NtStatus(vrc);
+ vboxdrvNtDestroyDevices();
+ }
+#ifdef VBOX_WITH_HARDENING
+ supdrvNtProtectTerm();
+#endif
}
-
- vboxdrvNtDestroyDevices();
+ RTR0Term();
+ }
+ else
+ {
+ Log(("RTR0Init failed with vrc=%d!\n", vrc));
+ rcNt = VBoxDrvNtErr2NtStatus(vrc);
}
if (NT_SUCCESS(rcNt))
rcNt = STATUS_INVALID_PARAMETER;
@@ -368,6 +611,9 @@ void _stdcall VBoxDrvNtUnload(PDRIVER_OBJECT pDrvObj)
* We ASSUME that it's not possible to unload a driver with open handles.
*/
supdrvDeleteDevExt(pDevExt);
+#ifdef VBOX_WITH_HARDENING
+ supdrvNtProtectTerm();
+#endif
RTR0Term();
vboxdrvNtDestroyDevices();
@@ -376,6 +622,37 @@ void _stdcall VBoxDrvNtUnload(PDRIVER_OBJECT pDrvObj)
/**
+ * For simplifying request completion into a simple return statement, extended
+ * version.
+ *
+ * @returns rcNt
+ * @param rcNt The status code.
+ * @param uInfo Extra info value.
+ * @param pIrp The IRP.
+ */
+DECLINLINE(NTSTATUS) supdrvNtCompleteRequestEx(NTSTATUS rcNt, ULONG_PTR uInfo, PIRP pIrp)
+{
+ pIrp->IoStatus.Status = rcNt;
+ pIrp->IoStatus.Information = uInfo;
+ IoCompleteRequest(pIrp, IO_NO_INCREMENT);
+ return rcNt;
+}
+
+
+/**
+ * For simplifying request completion into a simple return statement.
+ *
+ * @returns rcNt
+ * @param rcNt The status code.
+ * @param pIrp The IRP.
+ */
+DECLINLINE(NTSTATUS) supdrvNtCompleteRequest(NTSTATUS rcNt, PIRP pIrp)
+{
+ return supdrvNtCompleteRequestEx(rcNt, 0 /*uInfo*/, pIrp);
+}
+
+
+/**
* Create (i.e. Open) file entry point.
*
* @param pDevObj Device object.
@@ -384,49 +661,180 @@ void _stdcall VBoxDrvNtUnload(PDRIVER_OBJECT pDrvObj)
NTSTATUS _stdcall VBoxDrvNtCreate(PDEVICE_OBJECT pDevObj, PIRP pIrp)
{
Log(("VBoxDrvNtCreate: RequestorMode=%d\n", pIrp->RequestorMode));
- const bool fUnrestricted = pDevObj == g_pDevObjSys;
- PIO_STACK_LOCATION pStack = IoGetCurrentIrpStackLocation(pIrp);
+ PIO_STACK_LOCATION pStack = IoGetCurrentIrpStackLocation(pIrp);
PFILE_OBJECT pFileObj = pStack->FileObject;
- PSUPDRVDEVEXT pDevExt = SUPDRVNT_GET_DEVEXT(pDevObj);
+ PSUPDRVDEVEXT pDevExt = SUPDRVNT_GET_DEVEXT(pDevObj);
/*
* We are not remotely similar to a directory...
* (But this is possible.)
*/
if (pStack->Parameters.Create.Options & FILE_DIRECTORY_FILE)
- {
- pIrp->IoStatus.Status = STATUS_NOT_A_DIRECTORY;
- pIrp->IoStatus.Information = 0;
- IoCompleteRequest(pIrp, IO_NO_INCREMENT);
- return STATUS_NOT_A_DIRECTORY;
- }
+ return supdrvNtCompleteRequest(STATUS_NOT_A_DIRECTORY, pIrp);
/*
* Don't create a session for kernel clients, they'll close the handle
* immediately and work with the file object via
- * VBoxDrvNtInternalDeviceControl. The first request will there be one
- * to create a session.
+ * VBoxDrvNtInternalDeviceControl. The first request will be one to
+ * create a session.
*/
NTSTATUS rcNt;
if (pIrp->RequestorMode == KernelMode)
- rcNt = STATUS_SUCCESS;
+ {
+ if (pDevObj == g_pDevObjSys)
+ return supdrvNtCompleteRequestEx(STATUS_SUCCESS, FILE_OPENED, pIrp);
+
+ rcNt = STATUS_ACCESS_DENIED;
+ }
else
{
+#if defined(VBOX_WITH_HARDENING) && !defined(VBOX_WITHOUT_DEBUGGER_CHECKS)
/*
- * Call common code for the rest.
+ * Make sure no debuggers are attached to non-user processes.
*/
- pFileObj->FsContext = NULL;
- PSUPDRVSESSION pSession;
- int rc = supdrvCreateSession(pDevExt, true /*fUser*/, fUnrestricted, &pSession);
- if (!rc)
- pFileObj->FsContext = pSession;
- rcNt = pIrp->IoStatus.Status = VBoxDrvNtErr2NtStatus(rc);
- }
+ if ( pDevObj != g_pDevObjUsr
+ && supdrvNtIsDebuggerAttached())
+ {
+ LogRel(("vboxdrv: Process %p is being debugged, access to vboxdrv / vboxdrvu declined.\n",
+ PsGetProcessId(PsGetCurrentProcess())));
+ rcNt = STATUS_TRUST_FAILURE;
+ }
+ else
+#endif
+ {
+ int rc = VINF_SUCCESS;
- pIrp->IoStatus.Information = 0;
- IoCompleteRequest(pIrp, IO_NO_INCREMENT);
+#ifdef VBOX_WITH_HARDENING
+ /*
+ * Access to the stub device is only granted to processes which
+ * passes verification.
+ *
+ * Note! The stub device has no need for a SUPDRVSESSION structure,
+ * so the it uses the SUPDRVNTPROTECT directly instead.
+ */
+ if (pDevObj == g_pDevObjStub)
+ {
+ PSUPDRVNTPROTECT pNtProtect = NULL;
+ rc = supdrvNtProtectCreate(&pNtProtect, PsGetProcessId(PsGetCurrentProcess()),
+ kSupDrvNtProtectKind_StubUnverified, true /*fLink*/);
+ if (RT_SUCCESS(rc))
+ {
+ rc = supdrvNtProtectFindAssociatedCsrss(pNtProtect);
+ if (RT_SUCCESS(rc))
+ rc = supdrvNtProtectVerifyProcess(pNtProtect);
+ if (RT_SUCCESS(rc))
+ {
+ pFileObj->FsContext = pNtProtect; /* Keeps reference. */
+ return supdrvNtCompleteRequestEx(STATUS_SUCCESS, FILE_OPENED, pIrp);
+ }
- return rcNt;
+ supdrvNtProtectRelease(pNtProtect);
+ }
+ LogRel(("vboxdrv: Declined %p access to VBoxDrvStub: rc=%d\n", PsGetProcessId(PsGetCurrentProcess()), rc));
+ }
+ /*
+ * Unrestricted access is only granted to a process in the
+ * VmProcessUnconfirmed state that checks out correctly and is
+ * allowed to transition to VmProcessConfirmed. Again, only one
+ * session per process.
+ */
+ else if (pDevObj != g_pDevObjUsr)
+ {
+ PSUPDRVNTPROTECT pNtProtect = supdrvNtProtectLookup(PsGetProcessId(PsGetCurrentProcess()));
+ if (pNtProtect)
+ {
+ if (pNtProtect->enmProcessKind == kSupDrvNtProtectKind_VmProcessUnconfirmed)
+ {
+ rc = supdrvNtProtectVerifyProcess(pNtProtect);
+ if (RT_SUCCESS(rc))
+ {
+ /* Create a session. */
+ PSUPDRVSESSION pSession;
+ rc = supdrvCreateSession(pDevExt, true /*fUser*/, pDevObj == g_pDevObjSys /*fUnrestricted*/,
+ &pSession);
+ if (RT_SUCCESS(rc))
+ {
+ rc = supdrvSessionHashTabInsert(pDevExt, pSession, (PSUPDRVSESSION *)&pFileObj->FsContext, NULL);
+ supdrvSessionRelease(pSession);
+ if (RT_SUCCESS(rc))
+ {
+ pSession->pNtProtect = pNtProtect; /* Keeps reference. */
+ return supdrvNtCompleteRequestEx(STATUS_SUCCESS, FILE_OPENED, pIrp);
+ }
+ }
+
+ /* No second attempt. */
+ RTSpinlockAcquire(g_hNtProtectLock);
+ if (pNtProtect->enmProcessKind == kSupDrvNtProtectKind_VmProcessConfirmed)
+ pNtProtect->enmProcessKind = kSupDrvNtProtectKind_VmProcessDead;
+ RTSpinlockRelease(g_hNtProtectLock);
+
+ LogRel(("vboxdrv: supdrvCreateSession failed for process %p: rc=%d.\n",
+ PsGetProcessId(PsGetCurrentProcess()), rc));
+ }
+ else
+ LogRel(("vboxdrv: Process %p failed process verification: rc=%d.\n",
+ PsGetProcessId(PsGetCurrentProcess()), rc));
+ }
+ else
+ {
+ LogRel(("vboxdrv: %p is not a budding VM process (enmProcessKind=%d).\n",
+ PsGetProcessId(PsGetCurrentProcess()), pNtProtect->enmProcessKind));
+ rc = VERR_ACCESS_DENIED;
+ }
+ supdrvNtProtectRelease(pNtProtect);
+ }
+ else
+ {
+ LogRel(("vboxdrv: %p is not a budding VM process.\n", PsGetProcessId(PsGetCurrentProcess())));
+ rc = VERR_ACCESS_DENIED;
+ }
+ }
+ /*
+ * Call common code to create an unprivileged session.
+ */
+ else
+ {
+ PSUPDRVSESSION pSession;
+ rc = supdrvCreateSession(pDevExt, true /*fUser*/, false /*fUnrestricted*/, &pSession);
+ if (RT_SUCCESS(rc))
+ {
+ rc = supdrvSessionHashTabInsert(pDevExt, pSession, (PSUPDRVSESSION *)&pFileObj->FsContext, NULL);
+ supdrvSessionRelease(pSession);
+ if (RT_SUCCESS(rc))
+ {
+ pFileObj->FsContext = pSession; /* Keeps reference. No race. */
+ pSession->pNtProtect = NULL;
+ return supdrvNtCompleteRequestEx(STATUS_SUCCESS, FILE_OPENED, pIrp);
+ }
+ }
+ }
+
+#else /* !VBOX_WITH_HARDENING */
+ /*
+ * Call common code to create a session.
+ */
+ pFileObj->FsContext = NULL;
+ PSUPDRVSESSION pSession;
+ rc = supdrvCreateSession(pDevExt, true /*fUser*/, pDevObj == g_pDevObjSys /*fUnrestricted*/, &pSession);
+ if (RT_SUCCESS(rc))
+ {
+ rc = supdrvSessionHashTabInsert(pDevExt, pSession, (PSUPDRVSESSION *)&pFileObj->FsContext, NULL);
+ supdrvSessionRelease(pSession);
+ if (RT_SUCCESS(rc))
+ return supdrvNtCompleteRequestEx(STATUS_SUCCESS, FILE_OPENED, pIrp);
+
+ }
+#endif /* !VBOX_WITH_HARDENING */
+
+ /* bail out */
+ rcNt = VBoxDrvNtErr2NtStatus(rc);
+ }
+ }
+
+ Assert(!NT_SUCCESS(rcNt));
+ pFileObj->FsContext = NULL;
+ return supdrvNtCompleteRequest(rcNt, pIrp); /* Note. the IoStatus is completely ignored on error. */
}
@@ -441,20 +849,32 @@ NTSTATUS _stdcall VBoxDrvNtCleanup(PDEVICE_OBJECT pDevObj, PIRP pIrp)
PSUPDRVDEVEXT pDevExt = SUPDRVNT_GET_DEVEXT(pDevObj);
PIO_STACK_LOCATION pStack = IoGetCurrentIrpStackLocation(pIrp);
PFILE_OBJECT pFileObj = pStack->FileObject;
- PSUPDRVSESSION pSession = (PSUPDRVSESSION)pFileObj->FsContext;
- Log(("VBoxDrvNtCleanup: pDevExt=%p pFileObj=%p pSession=%p\n", pDevExt, pFileObj, pSession));
- if (pSession)
+#ifdef VBOX_WITH_HARDENING
+ if (pDevObj == g_pDevObjStub)
{
- supdrvSessionRelease(pSession);
- pFileObj->FsContext = NULL;
+ PSUPDRVNTPROTECT pNtProtect = (PSUPDRVNTPROTECT)pFileObj->FsContext;
+ Log(("VBoxDrvNtCleanup: pDevExt=%p pFileObj=%p pNtProtect=%p\n", pDevExt, pFileObj, pNtProtect));
+ if (pNtProtect)
+ {
+ supdrvNtProtectRelease(pNtProtect);
+ pFileObj->FsContext = NULL;
+ }
+ }
+ else
+#endif
+ {
+ PSUPDRVSESSION pSession = supdrvSessionHashTabLookup(pDevExt, RTProcSelf(), RTR0ProcHandleSelf(),
+ (PSUPDRVSESSION *)&pFileObj->FsContext);
+ Log(("VBoxDrvNtCleanup: pDevExt=%p pFileObj=%p pSession=%p\n", pDevExt, pFileObj, pSession));
+ if (pSession)
+ {
+ supdrvSessionHashTabRemove(pDevExt, pSession, NULL);
+ supdrvSessionRelease(pSession); /* Drops the reference from supdrvSessionHashTabLookup. */
+ }
}
- pIrp->IoStatus.Information = 0;
- pIrp->IoStatus.Status = STATUS_SUCCESS;
- IoCompleteRequest(pIrp, IO_NO_INCREMENT);
-
- return STATUS_SUCCESS;
+ return supdrvNtCompleteRequest(STATUS_SUCCESS, pIrp);
}
@@ -469,21 +889,232 @@ NTSTATUS _stdcall VBoxDrvNtClose(PDEVICE_OBJECT pDevObj, PIRP pIrp)
PSUPDRVDEVEXT pDevExt = SUPDRVNT_GET_DEVEXT(pDevObj);
PIO_STACK_LOCATION pStack = IoGetCurrentIrpStackLocation(pIrp);
PFILE_OBJECT pFileObj = pStack->FileObject;
- PSUPDRVSESSION pSession = (PSUPDRVSESSION)pFileObj->FsContext;
- Log(("VBoxDrvNtClose: pDevExt=%p pFileObj=%p pSession=%p\n", pDevExt, pFileObj, pSession));
- if (pSession)
+#ifdef VBOX_WITH_HARDENING
+ if (pDevObj == g_pDevObjStub)
{
- supdrvSessionRelease(pSession);
- pFileObj->FsContext = NULL;
+ PSUPDRVNTPROTECT pNtProtect = (PSUPDRVNTPROTECT)pFileObj->FsContext;
+ Log(("VBoxDrvNtClose: pDevExt=%p pFileObj=%p pNtProtect=%p\n", pDevExt, pFileObj, pNtProtect));
+ if (pNtProtect)
+ {
+ supdrvNtProtectRelease(pNtProtect);
+ pFileObj->FsContext = NULL;
+ }
+ }
+ else
+#endif
+ {
+ PSUPDRVSESSION pSession = supdrvSessionHashTabLookup(pDevExt, RTProcSelf(), RTR0ProcHandleSelf(),
+ (PSUPDRVSESSION *)&pFileObj->FsContext);
+ Log(("VBoxDrvNtCleanup: pDevExt=%p pFileObj=%p pSession=%p\n", pDevExt, pFileObj, pSession));
+ if (pSession)
+ {
+ supdrvSessionHashTabRemove(pDevExt, pSession, NULL);
+ supdrvSessionRelease(pSession); /* Drops the reference from supdrvSessionHashTabLookup. */
+ }
}
- pIrp->IoStatus.Information = 0;
- pIrp->IoStatus.Status = STATUS_SUCCESS;
- IoCompleteRequest(pIrp, IO_NO_INCREMENT);
+ return supdrvNtCompleteRequest(STATUS_SUCCESS, pIrp);
+}
+
- return STATUS_SUCCESS;
+#ifdef VBOXDRV_WITH_FAST_IO
+/**
+ * Fast I/O device control callback.
+ *
+ * This performs no buffering, neither on the way in or out.
+ *
+ * @returns TRUE if handled, FALSE if the normal I/O control routine should be
+ * called.
+ * @param pFileObj The file object.
+ * @param fWait Whether it's a blocking call
+ * @param pvInput The input buffer as specified by the user.
+ * @param cbInput The size of the input buffer.
+ * @param pvOutput The output buffer as specfied by the user.
+ * @param cbOutput The size of the output buffer.
+ * @param uFunction The function.
+ * @param pIoStatus Where to return the status of the operation.
+ * @param pDevObj The device object..
+ */
+static BOOLEAN _stdcall VBoxDrvNtFastIoDeviceControl(PFILE_OBJECT pFileObj, BOOLEAN fWait, PVOID pvInput, ULONG cbInput,
+ PVOID pvOutput, ULONG cbOutput, ULONG uCmd,
+ PIO_STATUS_BLOCK pIoStatus, PDEVICE_OBJECT pDevObj)
+{
+ PSUPDRVDEVEXT pDevExt = SUPDRVNT_GET_DEVEXT(pDevObj);
+
+ /*
+ * Check the input a little bit and get a the session references.
+ */
+ PSUPDRVSESSION pSession = supdrvSessionHashTabLookup(pDevExt, RTProcSelf(), RTR0ProcHandleSelf(),
+ (PSUPDRVSESSION *)&pFileObj->FsContext);
+ if (!pSession)
+ {
+ pIoStatus->Status = STATUS_TRUST_FAILURE;
+ pIoStatus->Information = 0;
+ return TRUE;
+ }
+
+ if (pSession->fUnrestricted)
+ {
+#if defined(VBOX_WITH_HARDENING) && !defined(VBOX_WITHOUT_DEBUGGER_CHECKS)
+ if (supdrvNtIsDebuggerAttached())
+ {
+ pIoStatus->Status = STATUS_TRUST_FAILURE;
+ pIoStatus->Information = 0;
+ supdrvSessionRelease(pSession);
+ return TRUE;
+ }
+#endif
+
+ /*
+ * Deal with the 2-3 high-speed IOCtl that takes their arguments from
+ * the session and iCmd, and does not return anything.
+ */
+ if ( uCmd == SUP_IOCTL_FAST_DO_RAW_RUN
+ || uCmd == SUP_IOCTL_FAST_DO_HM_RUN
+ || uCmd == SUP_IOCTL_FAST_DO_NOP)
+ {
+ int rc = supdrvIOCtlFast(uCmd, (unsigned)(uintptr_t)pvOutput/* VMCPU id */, pDevExt, pSession);
+ pIoStatus->Status = RT_SUCCESS(rc) ? STATUS_SUCCESS : STATUS_INVALID_PARAMETER;
+ pIoStatus->Information = 0; /* Could be used to pass rc if we liked. */
+ supdrvSessionRelease(pSession);
+ return TRUE;
+ }
+ }
+
+ /*
+ * The normal path.
+ */
+ NTSTATUS rcNt;
+ unsigned cbOut = 0;
+ int rc = 0;
+ Log2(("VBoxDrvNtFastIoDeviceControl(%p): ioctl=%#x pvIn=%p cbIn=%#x pvOut=%p cbOut=%#x pSession=%p\n",
+ pDevExt, uCmd, pvInput, cbInput, pvOutput, cbOutput, pSession));
+
+# ifdef RT_ARCH_AMD64
+ /* Don't allow 32-bit processes to do any I/O controls. */
+ if (!IoIs32bitProcess(NULL))
+# endif
+ {
+ /*
+ * In this fast I/O device control path we have to do our own buffering.
+ */
+ /* Verify that the I/O control function matches our pattern. */
+ if ((uCmd & 0x3) == METHOD_BUFFERED)
+ {
+ /* Get the header so we can validate it a little bit against the
+ parameters before allocating any memory kernel for the reqest. */
+ SUPREQHDR Hdr;
+ if (cbInput >= sizeof(Hdr) && cbOutput >= sizeof(Hdr))
+ {
+ __try
+ {
+ RtlCopyMemory(&Hdr, pvInput, sizeof(Hdr));
+ rcNt = STATUS_SUCCESS;
+ }
+ __except(EXCEPTION_EXECUTE_HANDLER)
+ {
+ rcNt = GetExceptionCode();
+ }
+ }
+ else
+ rcNt = STATUS_INVALID_PARAMETER;
+ if (NT_SUCCESS(rcNt))
+ {
+ /* Verify that the sizes in the request header are correct. */
+ ULONG cbBuf = RT_MAX(cbInput, cbOutput);
+ if ( cbInput == Hdr.cbIn
+ && cbOutput == Hdr.cbOut
+ && cbBuf < _1M*16)
+ {
+ /* Allocate a buffer and copy all the input into it. */
+ PSUPREQHDR pHdr = (PSUPREQHDR)ExAllocatePoolWithTag(NonPagedPool, cbBuf, 'VBox');
+ if (pHdr)
+ {
+ __try
+ {
+ RtlCopyMemory(pHdr, pvInput, cbInput);
+ if (cbInput < cbBuf)
+ RtlZeroMemory((uint8_t *)pHdr + cbInput, cbBuf - cbInput);
+ rcNt = STATUS_SUCCESS;
+ }
+ __except(EXCEPTION_EXECUTE_HANDLER)
+ {
+ rcNt = GetExceptionCode();
+ }
+ }
+ else
+ rcNt = STATUS_NO_MEMORY;
+ if (NT_SUCCESS(rcNt))
+ {
+ /*
+ * Now call the common code to do the real work.
+ */
+ rc = supdrvIOCtl(uCmd, pDevExt, pSession, pHdr);
+ if (RT_SUCCESS(rc))
+ {
+ /*
+ * Copy back the result.
+ */
+ cbOut = pHdr->cbOut;
+ if (cbOut > cbOutput)
+ {
+ cbOut = cbOutput;
+ OSDBGPRINT(("VBoxDrvNtFastIoDeviceControl: too much output! %#x > %#x; uCmd=%#x!\n",
+ pHdr->cbOut, cbOut, uCmd));
+ }
+ if (cbOut)
+ {
+ __try
+ {
+ RtlCopyMemory(pvOutput, pHdr, cbOut);
+ rcNt = STATUS_SUCCESS;
+ }
+ __except(EXCEPTION_EXECUTE_HANDLER)
+ {
+ rcNt = GetExceptionCode();
+ }
+ }
+ else
+ rcNt = STATUS_SUCCESS;
+ }
+ else if (rc == VERR_INVALID_PARAMETER)
+ rcNt = STATUS_INVALID_PARAMETER;
+ else
+ rcNt = STATUS_NOT_SUPPORTED;
+ Log2(("VBoxDrvNtFastIoDeviceControl: returns %#x cbOut=%d rc=%#x\n", rcNt, cbOut, rc));
+ }
+ ExFreePoolWithTag(pHdr, 'VBox');
+ }
+ else
+ {
+ Log(("VBoxDrvNtFastIoDeviceControl: Mismatching sizes (%#x) - Hdr=%#lx/%#lx Irp=%#lx/%#lx!\n",
+ uCmd, Hdr.cbIn, Hdr.cbOut, cbInput, cbOutput));
+ rcNt = STATUS_INVALID_PARAMETER;
+ }
+ }
+ }
+ else
+ {
+ Log(("VBoxDrvNtFastIoDeviceControl: not buffered request (%#x) - not supported\n", uCmd));
+ rcNt = STATUS_NOT_SUPPORTED;
+ }
+ }
+# ifdef RT_ARCH_AMD64
+ else
+ {
+ Log(("VBoxDrvNtFastIoDeviceControl: WOW64 req - not supported\n"));
+ rcNt = STATUS_NOT_SUPPORTED;
+ }
+# endif
+
+ /* complete the request. */
+ pIoStatus->Status = rcNt;
+ pIoStatus->Information = cbOut;
+ supdrvSessionRelease(pSession);
+ return TRUE; /* handled. */
}
+#endif /* VBOXDRV_WITH_FAST_IO */
#ifdef VBOXDRV_WITH_FAST_IO
@@ -678,26 +1309,41 @@ static BOOLEAN _stdcall VBoxDrvNtFastIoDeviceControl(PFILE_OBJECT pFileObj, BOOL
*/
NTSTATUS _stdcall VBoxDrvNtDeviceControl(PDEVICE_OBJECT pDevObj, PIRP pIrp)
{
+ VBOXDRV_COMPLETE_IRP_AND_RETURN_IF_STUB_DEV(pDevObj, pIrp);
+
PSUPDRVDEVEXT pDevExt = SUPDRVNT_GET_DEVEXT(pDevObj);
PIO_STACK_LOCATION pStack = IoGetCurrentIrpStackLocation(pIrp);
- PSUPDRVSESSION pSession = (PSUPDRVSESSION)pStack->FileObject->FsContext;
+ PSUPDRVSESSION pSession = supdrvSessionHashTabLookup(pDevExt, RTProcSelf(), RTR0ProcHandleSelf(),
+ (PSUPDRVSESSION *)&pStack->FileObject->FsContext);
+
+ if (!RT_VALID_PTR(pSession))
+ return supdrvNtCompleteRequest(STATUS_TRUST_FAILURE, pIrp);
/*
* Deal with the 2-3 high-speed IOCtl that takes their arguments from
* the session and iCmd, and does not return anything.
*/
- ULONG ulCmd = pStack->Parameters.DeviceIoControl.IoControlCode;
- if ( ( ulCmd == SUP_IOCTL_FAST_DO_RAW_RUN
+ if (pSession->fUnrestricted)
+ {
+#if defined(VBOX_WITH_HARDENING) && !defined(VBOX_WITHOUT_DEBUGGER_CHECKS)
+ if (supdrvNtIsDebuggerAttached())
+ {
+ supdrvSessionRelease(pSession);
+ return supdrvNtCompleteRequest(STATUS_TRUST_FAILURE, pIrp);
+ }
+#endif
+
+ ULONG ulCmd = pStack->Parameters.DeviceIoControl.IoControlCode;
+ if ( ulCmd == SUP_IOCTL_FAST_DO_RAW_RUN
|| ulCmd == SUP_IOCTL_FAST_DO_HM_RUN
|| ulCmd == SUP_IOCTL_FAST_DO_NOP)
- && pSession->fUnrestricted == true)
- {
- int rc = supdrvIOCtlFast(ulCmd, (unsigned)(uintptr_t)pIrp->UserBuffer /* VMCPU id */, pDevExt, pSession);
+ {
+ int rc = supdrvIOCtlFast(ulCmd, (unsigned)(uintptr_t)pIrp->UserBuffer /* VMCPU id */, pDevExt, pSession);
- /* Complete the I/O request. */
- NTSTATUS rcNt = pIrp->IoStatus.Status = RT_SUCCESS(rc) ? STATUS_SUCCESS : STATUS_INVALID_PARAMETER;
- IoCompleteRequest(pIrp, IO_NO_INCREMENT);
- return rcNt;
+ /* Complete the I/O request. */
+ supdrvSessionRelease(pSession);
+ return supdrvNtCompleteRequest(RT_SUCCESS(rc) ? STATUS_SUCCESS : STATUS_INVALID_PARAMETER, pIrp);
+ }
}
return VBoxDrvNtDeviceControlSlow(pDevExt, pSession, pIrp, pStack);
@@ -786,6 +1432,7 @@ static int VBoxDrvNtDeviceControlSlow(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSes
/* complete the request. */
pIrp->IoStatus.Status = rcNt;
pIrp->IoStatus.Information = cbOut;
+ supdrvSessionRelease(pSession);
IoCompleteRequest(pIrp, IO_NO_INCREMENT);
return rcNt;
}
@@ -799,6 +1446,8 @@ static int VBoxDrvNtDeviceControlSlow(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSes
*/
NTSTATUS _stdcall VBoxDrvNtInternalDeviceControl(PDEVICE_OBJECT pDevObj, PIRP pIrp)
{
+ VBOXDRV_COMPLETE_IRP_AND_RETURN_IF_STUB_DEV(pDevObj, pIrp);
+
PSUPDRVDEVEXT pDevExt = SUPDRVNT_GET_DEVEXT(pDevObj);
PIO_STACK_LOCATION pStack = IoGetCurrentIrpStackLocation(pIrp);
PFILE_OBJECT pFileObj = pStack ? pStack->FileObject : NULL;
@@ -928,6 +1577,36 @@ VOID _stdcall VBoxPowerDispatchCallback(PVOID pCallbackContext, PVOID pArgument1
/**
+ * Called to clean up the session structure before it's freed.
+ *
+ * @param pDevExt The device globals.
+ * @param pSession The session that's being cleaned up.
+ */
+void VBOXCALL supdrvOSCleanupSession(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession)
+{
+#ifdef VBOX_WITH_HARDENING
+ if (pSession->pNtProtect)
+ {
+ supdrvNtProtectRelease(pSession->pNtProtect);
+ pSession->pNtProtect = NULL;
+ }
+#endif
+}
+
+
+void VBOXCALL supdrvOSSessionHashTabInserted(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, void *pvUser)
+{
+ NOREF(pDevExt); NOREF(pSession); NOREF(pvUser);
+}
+
+
+void VBOXCALL supdrvOSSessionHashTabRemoved(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, void *pvUser)
+{
+ NOREF(pDevExt); NOREF(pSession); NOREF(pvUser);
+}
+
+
+/**
* Initializes any OS specific object creator fields.
*/
void VBOXCALL supdrvOSObjInitCreator(PSUPDRVOBJ pObj, PSUPDRVSESSION pSession)
@@ -1081,10 +1760,10 @@ int VBOXCALL supdrvOSLdrOpen(PSUPDRVDEVEXT pDevExt, PSUPDRVLDRIMAGE pImage, c
case /* 0xC0000263 */ STATUS_DRIVER_ENTRYPOINT_NOT_FOUND:
rc = VERR_LDR_IMPORTED_SYMBOL_NOT_FOUND;
break;
- case 0xC0000428 /* STATUS_INVALID_IMAGE_HASH */ :
+ case /* 0xC0000428 */ STATUS_INVALID_IMAGE_HASH:
rc = VERR_LDR_IMAGE_HASH;
break;
- case 0xC000010E /* STATUS_IMAGE_ALREADY_LOADED */ :
+ case /* 0xC000010E */ STATUS_IMAGE_ALREADY_LOADED:
Log(("WARNING: see @bugref{4853} for cause of this failure on Windows 7 x64\n"));
rc = VERR_ALREADY_LOADED;
break;
@@ -1508,6 +2187,12 @@ static NTSTATUS VBoxDrvNtErr2NtStatus(int rc)
case VERR_VERSION_MISMATCH: return STATUS_REVISION_MISMATCH;
}
+ if (rc < 0)
+ {
+ if (((uint32_t)rc & UINT32_C(0xffff0000)) == UINT32_C(0xffff0000))
+ return (NTSTATUS)( ((uint32_t)rc & UINT32_C(0xffff))
+ | UINT32_C(0xe9860000) ); /* STATUS_SEVERITY_ERROR + C-bit + facility 0x986 */
+ }
return STATUS_UNSUCCESSFUL;
}
@@ -1546,3 +2231,1779 @@ SUPR0DECL(int) SUPR0Printf(const char *pszFormat, ...)
return 0;
}
#endif
+
+
+#ifdef VBOX_WITH_HARDENING
+
+/** @name Identifying Special Processes: CSRSS.EXE
+ * @{ */
+
+
+/**
+ * Checks if the process is a system32 process by the given name.
+ *
+ * @returns true / false.
+ * @param pProcess The process to check.
+ * @param pszName The lower case process name (no path!).
+ */
+static bool supdrvNtProtectIsSystem32ProcessMatch(PEPROCESS pProcess, const char *pszName)
+{
+ Assert(strlen(pszName) < 16); /* see buffer below */
+
+ /*
+ * This test works on XP+.
+ */
+ const char *pszImageFile = (const char *)PsGetProcessImageFileName(pProcess);
+ if (!pszImageFile)
+ return false;
+
+ if (RTStrICmp(pszImageFile, pszName) != 0)
+ return false;
+
+ /*
+ * This test requires a Vista+ API.
+ */
+ if (g_pfnPsReferenceProcessFilePointer)
+ {
+ PFILE_OBJECT pFile = NULL;
+ NTSTATUS rcNt = g_pfnPsReferenceProcessFilePointer(pProcess, &pFile);
+ if (!NT_SUCCESS(rcNt))
+ return false;
+
+ union
+ {
+ OBJECT_NAME_INFORMATION Info;
+ uint8_t abBuffer[sizeof(g_System32NtPath) + 16 * sizeof(WCHAR)];
+ } Buf;
+ ULONG cbIgn;
+ rcNt = ObQueryNameString(pFile, &Buf.Info, sizeof(Buf) - sizeof(WCHAR), &cbIgn);
+ ObDereferenceObject(pFile);
+ if (!NT_SUCCESS(rcNt))
+ return false;
+
+ /* Terminate the name. */
+ PRTUTF16 pwszName = Buf.Info.Name.Buffer;
+ pwszName[Buf.Info.Name.Length / sizeof(RTUTF16)] = '\0';
+
+ /* Match the name against the system32 directory path. */
+ uint32_t cbSystem32 = g_System32NtPath.UniStr.Length;
+ if (Buf.Info.Name.Length < cbSystem32)
+ return false;
+ if (memcmp(pwszName, g_System32NtPath.UniStr.Buffer, cbSystem32))
+ return false;
+ pwszName += cbSystem32 / sizeof(RTUTF16);
+ if (*pwszName++ != '\\')
+ return false;
+
+ /* Compare the name. */
+ const char *pszRight = pszName;
+ for (;;)
+ {
+ WCHAR wchLeft = *pwszName++;
+ char chRight = *pszRight++;
+ Assert(chRight == RT_C_TO_LOWER(chRight));
+
+ if ( wchLeft != chRight
+ && RT_C_TO_LOWER(wchLeft) != chRight)
+ return false;
+ if (!chRight)
+ break;
+ }
+ }
+
+ return true;
+}
+
+
+/**
+ * Checks if the current process is likely to be CSRSS.
+ *
+ * @returns true/false.
+ * @param pProcess The process.
+ */
+static bool supdrvNtProtectIsCsrssByProcess(PEPROCESS pProcess)
+{
+ /*
+ * On Windows 8.1 CSRSS.EXE is a protected process.
+ */
+ if (g_pfnPsIsProtectedProcessLight)
+ {
+ if (!g_pfnPsIsProtectedProcessLight(pProcess))
+ return false;
+ }
+
+ /*
+ * The name tests.
+ */
+ if (!supdrvNtProtectIsSystem32ProcessMatch(pProcess, "csrss.exe"))
+ return false;
+
+ /** @todo Could extend the CSRSS.EXE check with that the TokenUser of the
+ * current process must be "NT AUTHORITY\SYSTEM" (S-1-5-18). */
+
+ return true;
+}
+
+
+/**
+ * Called in the context of VBoxDrvNtCreate to determin the CSRSS for the
+ * current process.
+ *
+ * The Client/Server Runtime Subsystem (CSRSS) process needs to be allowed some
+ * additional access right so we need to make 101% sure we correctly identify
+ * the CSRSS process a process is associated with.
+ *
+ * @returns IPRT status code.
+ * @param pNtProtect The NT protected process structure. The
+ * hCsrssPid member will be updated on success.
+ */
+static int supdrvNtProtectFindAssociatedCsrss(PSUPDRVNTPROTECT pNtProtect)
+{
+ Assert(pNtProtect->AvlCore.Key == PsGetCurrentProcessId());
+ Assert(pNtProtect->pCsrssProcess == NULL);
+ Assert(pNtProtect->hCsrssPid == NULL);
+
+ /*
+ * We'll try use the ApiPort LPC object for the session we're in to track
+ * down the CSRSS process. So, we start by constructing a path to it.
+ */
+ int rc;
+ uint32_t uSessionId = PsGetProcessSessionId(PsGetCurrentProcess());
+ WCHAR wszApiPort[48];
+ if (uSessionId == 0)
+ rc = RTUtf16CopyAscii(wszApiPort, RT_ELEMENTS(wszApiPort), "\\Windows\\ApiPort");
+ else
+ {
+ char szTmp[64];
+ ssize_t cchTmp = RTStrFormatU32(szTmp, sizeof(szTmp), uSessionId, 10, 0, 0, 0);
+ AssertReturn(cchTmp > 0, (int)cchTmp);
+ rc = RTUtf16CopyAscii(wszApiPort, RT_ELEMENTS(wszApiPort), "\\Sessions\\");
+ if (RT_SUCCESS(rc))
+ rc = RTUtf16CatAscii(wszApiPort, RT_ELEMENTS(wszApiPort), szTmp);
+ if (RT_SUCCESS(rc))
+ rc = RTUtf16CatAscii(wszApiPort, RT_ELEMENTS(wszApiPort), "\\Windows\\ApiPort");
+ }
+ AssertRCReturn(rc, rc);
+
+ UNICODE_STRING ApiPortStr;
+ ApiPortStr.Buffer = wszApiPort;
+ ApiPortStr.Length = (USHORT)(RTUtf16Len(wszApiPort) * sizeof(RTUTF16));
+ ApiPortStr.MaximumLength = ApiPortStr.Length + sizeof(RTUTF16);
+
+ /*
+ * The object cannot be opened, but we can reference it by name.
+ */
+ void *pvApiPortObj = NULL;
+ NTSTATUS rcNt = ObReferenceObjectByName(&ApiPortStr,
+ 0,
+ NULL /*pAccessState*/,
+ STANDARD_RIGHTS_READ,
+ *LpcPortObjectType,
+ KernelMode,
+ NULL /*pvParseContext*/,
+ &pvApiPortObj);
+ if (!NT_SUCCESS(rcNt))
+ {
+ SUPR0Printf("vboxdrv: Error opening '%ls': %#x\n", wszApiPort, rcNt);
+ return VERR_SUPDRV_APIPORT_OPEN_ERROR;
+ }
+
+ /*
+ * Query the processes in the system so we can locate CSRSS.EXE candidates.
+ * Note! Attempts at using SystemSessionProcessInformation failed with
+ * STATUS_ACCESS_VIOLATION.
+ */
+ ULONG cbNeeded = _64K;
+ uint32_t cbBuf;
+ uint8_t *pbBuf = NULL;
+ do
+ {
+ cbBuf = RT_ALIGN(cbNeeded + _4K, _64K);
+ pbBuf = (uint8_t *)RTMemAlloc(cbBuf);
+ if (!pbBuf)
+ break;
+
+ cbNeeded = 0;
+#if 0 /* doesn't work. */
+ SYSTEM_SESSION_PROCESS_INFORMATION Req;
+ Req.SessionId = uSessionId;
+ Req.BufferLength = cbBuf;
+ Req.Buffer = pbBuf;
+ rcNt = NtQuerySystemInformation(SystemSessionProcessInformation, &Req, sizeof(Req), &cbNeeded);
+#else
+ rcNt = NtQuerySystemInformation(SystemProcessInformation, pbBuf, cbBuf, &cbNeeded);
+#endif
+ if (NT_SUCCESS(rcNt))
+ break;
+
+ RTMemFree(pbBuf);
+ pbBuf = NULL;
+ } while ( rcNt == STATUS_INFO_LENGTH_MISMATCH
+ && cbNeeded > cbBuf
+ && cbNeeded < 32U*_1M);
+
+ if ( pbBuf
+ && NT_SUCCESS(rcNt)
+ && cbNeeded >= sizeof(SYSTEM_PROCESS_INFORMATION))
+ {
+ /*
+ * Walk the returned data and look for the process associated with the
+ * ApiPort object. The ApiPort object keeps the EPROCESS address of
+ * the owner process (i.e. CSRSS) relatively early in the structure. On
+ * 64-bit windows 8.1 it's at offset 0x18. So, obtain the EPROCESS
+ * pointer to likely CSRSS processes and check for a match in the first
+ * 0x40 bytes of the ApiPort object.
+ */
+ rc = VERR_SUPDRV_CSRSS_NOT_FOUND;
+ for (uint32_t offBuf = 0; offBuf <= cbNeeded - sizeof(SYSTEM_PROCESS_INFORMATION);)
+ {
+ PRTNT_SYSTEM_PROCESS_INFORMATION pProcInfo = (PRTNT_SYSTEM_PROCESS_INFORMATION)&pbBuf[offBuf];
+ if ( pProcInfo->ProcessName.Length == 9 * sizeof(WCHAR)
+ && pProcInfo->NumberOfThreads > 2 /* Very low guess. */
+ && pProcInfo->HandleCount > 32 /* Very low guess, I hope. */
+ && (uintptr_t)pProcInfo->ProcessName.Buffer - (uintptr_t)pbBuf < cbNeeded
+ && RT_C_TO_LOWER(pProcInfo->ProcessName.Buffer[0]) == 'c'
+ && RT_C_TO_LOWER(pProcInfo->ProcessName.Buffer[1]) == 's'
+ && RT_C_TO_LOWER(pProcInfo->ProcessName.Buffer[2]) == 'r'
+ && RT_C_TO_LOWER(pProcInfo->ProcessName.Buffer[3]) == 's'
+ && RT_C_TO_LOWER(pProcInfo->ProcessName.Buffer[4]) == 's'
+ && pProcInfo->ProcessName.Buffer[5] == '.'
+ && RT_C_TO_LOWER(pProcInfo->ProcessName.Buffer[6]) == 'e'
+ && RT_C_TO_LOWER(pProcInfo->ProcessName.Buffer[7]) == 'x'
+ && RT_C_TO_LOWER(pProcInfo->ProcessName.Buffer[8]) == 'e' )
+ {
+
+ /* Get the process structure and perform some more thorough
+ process checks. */
+ PEPROCESS pProcess;
+ rcNt = PsLookupProcessByProcessId(pProcInfo->UniqueProcessId, &pProcess);
+ if (NT_SUCCESS(rcNt))
+ {
+ if (supdrvNtProtectIsCsrssByProcess(pProcess))
+ {
+ if (PsGetProcessSessionId(pProcess) == uSessionId)
+ {
+ /* Final test, check the ApiPort.
+ Note! The old LPC (pre Vista) objects has the PID
+ much earlier in the structure. Might be
+ worth looking for it instead. */
+ bool fThatsIt = false;
+ __try
+ {
+ PEPROCESS *ppPortProc = (PEPROCESS *)pvApiPortObj;
+ uint32_t cTests = g_uNtVerCombined >= SUP_NT_VER_VISTA ? 16 : 38; /* ALPC since Vista. */
+ do
+ {
+ fThatsIt = *ppPortProc == pProcess;
+ ppPortProc++;
+ } while (!fThatsIt && --cTests > 0);
+ }
+ __except(EXCEPTION_EXECUTE_HANDLER)
+ {
+ fThatsIt = false;
+ }
+ if (fThatsIt)
+ {
+ /* Ok, we found it! Keep the process structure
+ reference as well as the PID so we can
+ safely identify it later on. */
+ pNtProtect->hCsrssPid = pProcInfo->UniqueProcessId;
+ pNtProtect->pCsrssProcess = pProcess;
+ rc = VINF_SUCCESS;
+ break;
+ }
+ }
+ }
+
+ ObDereferenceObject(pProcess);
+ }
+ }
+
+ /* Advance. */
+ if (!pProcInfo->NextEntryOffset)
+ break;
+ offBuf += pProcInfo->NextEntryOffset;
+ }
+ }
+ else
+ rc = VERR_SUPDRV_SESSION_PROCESS_ENUM_ERROR;
+ RTMemFree(pbBuf);
+ ObDereferenceObject(pvApiPortObj);
+ return rc;
+}
+
+
+/**
+ * Checks that the given process is the CSRSS process associated with protected
+ * process.
+ *
+ * @returns true / false.
+ * @param pNtProtect The NT protection structure.
+ * @param pCsrss The process structure of the alleged CSRSS.EXE
+ * process.
+ */
+static bool supdrvNtProtectIsAssociatedCsrss(PSUPDRVNTPROTECT pNtProtect, PEPROCESS pCsrss)
+{
+ if (pNtProtect->pCsrssProcess == pCsrss)
+ {
+ if (pNtProtect->hCsrssPid == PsGetProcessId(pCsrss))
+ {
+ return true;
+ }
+ }
+ return false;
+}
+
+
+/**
+ * Checks if the given process is the stupid themes service.
+ *
+ * The caller does some screening of access masks and what not. We do the rest.
+ *
+ * @returns true / false.
+ * @param pNtProtect The NT protection structure.
+ * @param pAnnoyingProcess The process structure of an process that might
+ * happen to be the annoying themes process.
+ */
+static bool supdrvNtProtectIsFrigginThemesService(PSUPDRVNTPROTECT pNtProtect, PEPROCESS pAnnoyingProcess)
+{
+ /*
+ * Check the process name.
+ */
+ if (!supdrvNtProtectIsSystem32ProcessMatch(pAnnoyingProcess, "svchost.exe"))
+ return false;
+
+ /** @todo Come up with more checks. */
+
+ return true;
+}
+
+
+/** @} */
+
+
+/** @name Process Creation Callbacks.
+ * @{ */
+
+/**
+ * Common worker used by the process creation hooks as well as the process
+ * handle creation hooks to check if a VM process is being created.
+ *
+ * @returns true if likely to be a VM process, false if not.
+ * @param pNtStub The NT protection structure for the possible
+ * stub process.
+ * @param hParentPid The parent pid.
+ * @param hChildPid The child pid.
+ */
+static bool supdrvNtProtectIsSpawningStubProcess(PSUPDRVNTPROTECT pNtStub, HANDLE hParentPid, HANDLE hChildPid)
+{
+ bool fRc = false;
+ if (pNtStub->AvlCore.Key == hParentPid) /* paranoia */
+ {
+ if (pNtStub->enmProcessKind == kSupDrvNtProtectKind_StubSpawning)
+ {
+ /* Compare short names. */
+ PEPROCESS pStubProcess;
+ NTSTATUS rcNt = PsLookupProcessByProcessId(hParentPid, &pStubProcess);
+ if (NT_SUCCESS(rcNt))
+ {
+ PEPROCESS pChildProcess;
+ rcNt = PsLookupProcessByProcessId(hChildPid, &pChildProcess);
+ if (NT_SUCCESS(rcNt))
+ {
+ const char *pszStub = (const char *)PsGetProcessImageFileName(pStubProcess);
+ const char *pszChild = (const char *)PsGetProcessImageFileName(pChildProcess);
+ fRc = pszStub != NULL
+ && pszChild != NULL
+ && strcmp(pszStub, pszChild) == 0;
+
+ /** @todo check that the full image names matches. */
+
+ ObDereferenceObject(pChildProcess);
+ }
+ ObDereferenceObject(pStubProcess);
+ }
+ }
+ }
+ return fRc;
+}
+
+
+/**
+ * Common code used by the notifies to protect a child process.
+ *
+ * @returns VBox status code.
+ * @param pNtStub The NT protect structure for the parent.
+ * @param hChildPid The child pid.
+ */
+static int supdrvNtProtectProtectNewStubChild(PSUPDRVNTPROTECT pNtParent, HANDLE hChildPid)
+{
+ /*
+ * Create a child protection struction.
+ */
+ PSUPDRVNTPROTECT pNtChild;
+ int rc = supdrvNtProtectCreate(&pNtChild, hChildPid, kSupDrvNtProtectKind_VmProcessUnconfirmed, false /*fLink*/);
+ if (RT_SUCCESS(rc))
+ {
+ pNtChild->fFirstProcessCreateHandle = true;
+ pNtChild->fFirstThreadCreateHandle = true;
+ pNtChild->fCsrssFirstProcessCreateHandle = true;
+ pNtChild->fCsrssFirstProcessDuplicateHandle = true;
+ pNtChild->fThemesFirstProcessCreateHandle = true;
+ pNtChild->hParentPid = pNtParent->AvlCore.Key;
+ pNtChild->hCsrssPid = pNtParent->hCsrssPid;
+ pNtChild->pCsrssProcess = pNtParent->pCsrssProcess;
+ if (pNtChild->pCsrssProcess)
+ ObReferenceObject(pNtChild->pCsrssProcess);
+
+ /*
+ * Take the spinlock, recheck parent conditions and link things.
+ */
+ RTSpinlockAcquire(g_hNtProtectLock);
+ if (pNtParent->enmProcessKind == kSupDrvNtProtectKind_StubSpawning)
+ {
+ bool fSuccess = RTAvlPVInsert(&g_NtProtectTree, &pNtChild->AvlCore);
+ if (fSuccess)
+ {
+ pNtParent->u.pChild = pNtChild; /* Parent keeps the initial reference. */
+ pNtParent->enmProcessKind = kSupDrvNtProtectKind_StubParent;
+ pNtChild->u.pParent = pNtParent;
+
+ RTSpinlockRelease(g_hNtProtectLock);
+ return VINF_SUCCESS;
+ }
+
+ rc = VERR_INTERNAL_ERROR_2;
+ }
+ else
+ rc = VERR_WRONG_ORDER;
+ RTSpinlockRelease(g_hNtProtectLock);
+
+ supdrvNtProtectRelease(pNtChild);
+ }
+ return rc;
+}
+
+
+/**
+ * Common process termination code.
+ *
+ * Transitions protected process to the dead states, protecting against handle
+ * PID reuse (esp. with unconfirmed VM processes) and handle cleanup issues.
+ *
+ * @param hDeadPid The PID of the dead process.
+ */
+static void supdrvNtProtectUnprotectDeadProcess(HANDLE hDeadPid)
+{
+ PSUPDRVNTPROTECT pNtProtect = supdrvNtProtectLookup(hDeadPid);
+ if (pNtProtect)
+ {
+ PSUPDRVNTPROTECT pNtChild = NULL;
+
+ RTSpinlockAcquire(g_hNtProtectLock);
+
+ /*
+ * If this is an unconfirmed VM process, we must release the reference
+ * the parent structure holds.
+ */
+ if (pNtProtect->enmProcessKind == kSupDrvNtProtectKind_VmProcessUnconfirmed)
+ {
+ PSUPDRVNTPROTECT pNtParent = pNtProtect->u.pParent;
+ AssertRelease(pNtParent); AssertRelease(pNtParent->u.pChild == pNtProtect);
+ pNtParent->u.pChild = NULL;
+ pNtProtect->u.pParent = NULL;
+ pNtChild = pNtProtect;
+ }
+ /*
+ * If this is a stub exitting before the VM process gets confirmed,
+ * release the protection of the potential VM process as this is not
+ * the prescribed behavior.
+ */
+ else if ( pNtProtect->enmProcessKind == kSupDrvNtProtectKind_StubParent
+ && pNtProtect->u.pChild)
+ {
+ pNtChild = pNtProtect->u.pChild;
+ pNtProtect->u.pChild = NULL;
+ pNtChild->u.pParent = NULL;
+ pNtChild->enmProcessKind = kSupDrvNtProtectKind_VmProcessDead;
+ }
+
+ /*
+ * Transition it to the dead state to prevent it from opening the
+ * support driver again or be posthumously abused as a vm process parent.
+ */
+ if ( pNtProtect->enmProcessKind == kSupDrvNtProtectKind_VmProcessUnconfirmed
+ || pNtProtect->enmProcessKind == kSupDrvNtProtectKind_VmProcessConfirmed)
+ pNtProtect->enmProcessKind = kSupDrvNtProtectKind_VmProcessDead;
+ else if ( pNtProtect->enmProcessKind == kSupDrvNtProtectKind_StubParent
+ || pNtProtect->enmProcessKind == kSupDrvNtProtectKind_StubSpawning
+ || pNtProtect->enmProcessKind == kSupDrvNtProtectKind_StubUnverified)
+ pNtProtect->enmProcessKind = kSupDrvNtProtectKind_StubDead;
+
+ RTSpinlockRelease(g_hNtProtectLock);
+
+ supdrvNtProtectRelease(pNtProtect);
+ supdrvNtProtectRelease(pNtChild);
+
+ /*
+ * Do session cleanups.
+ */
+ AssertReturnVoid((HANDLE)(uintptr_t)RTProcSelf() == hDeadPid);
+ if (g_pDevObjSys)
+ {
+ PSUPDRVDEVEXT pDevExt = (PSUPDRVDEVEXT)g_pDevObjSys->DeviceExtension;
+ PSUPDRVSESSION pSession = supdrvSessionHashTabLookup(pDevExt, (RTPROCESS)(uintptr_t)hDeadPid,
+ RTR0ProcHandleSelf(), NULL);
+ if (pSession)
+ {
+ supdrvSessionHashTabRemove(pDevExt, pSession, NULL);
+ supdrvSessionRelease(pSession); /* Drops the reference from supdrvSessionHashTabLookup. */
+ }
+ }
+ }
+}
+
+
+/**
+ * Common worker for the process creation callback that verifies a new child
+ * being created by the handle creation callback code.
+ *
+ * @param pNtStub The parent.
+ * @param pNtVm The child.
+ * @param fCallerChecks The result of any additional tests the caller made.
+ * This is in order to avoid duplicating the failure
+ * path code.
+ */
+static void supdrvNtProtectVerifyNewChildProtection(PSUPDRVNTPROTECT pNtStub, PSUPDRVNTPROTECT pNtVm, bool fCallerChecks)
+{
+ if ( fCallerChecks
+ && pNtStub->enmProcessKind == kSupDrvNtProtectKind_StubParent
+ && pNtVm->enmProcessKind == kSupDrvNtProtectKind_VmProcessUnconfirmed
+ && pNtVm->u.pParent == pNtStub
+ && pNtStub->u.pChild == pNtVm)
+ {
+ /* Fine, nothing to do. */
+ return;
+ }
+
+ LogRel(("vboxdrv: Misdetected vm stub; hParentPid=%p hChildPid=%p\n", pNtStub->AvlCore.Key, pNtVm->AvlCore.Key));
+ if (pNtStub->enmProcessKind != kSupDrvNtProtectKind_VmProcessConfirmed)
+ supdrvNtProtectUnprotectDeadProcess(pNtVm->AvlCore.Key);
+}
+
+
+/**
+ * Old style callback (since forever).
+ *
+ * @param hParentPid The parent PID.
+ * @param hNewPid The PID of the new child.
+ * @param fCreated TRUE if it's a creation notification,
+ * FALSE if termination.
+ * @remarks ASSUMES this arrives before the handle creation callback.
+ */
+static VOID __stdcall
+supdrvNtProtectCallback_ProcessCreateNotify(HANDLE hParentPid, HANDLE hNewPid, BOOLEAN fCreated)
+{
+ /*
+ * Is it a new process that needs protection?
+ */
+ if (fCreated)
+ {
+ PSUPDRVNTPROTECT pNtStub = supdrvNtProtectLookup(hParentPid);
+ if (pNtStub)
+ {
+ PSUPDRVNTPROTECT pNtVm = supdrvNtProtectLookup(hNewPid);
+ if (!pNtVm)
+ {
+ if (supdrvNtProtectIsSpawningStubProcess(pNtStub, hParentPid, hNewPid))
+ supdrvNtProtectProtectNewStubChild(pNtStub, hNewPid);
+ }
+ else
+ {
+ supdrvNtProtectVerifyNewChildProtection(pNtStub, pNtVm, true);
+ supdrvNtProtectRelease(pNtVm);
+ }
+ supdrvNtProtectRelease(pNtStub);
+ }
+ }
+ /*
+ * Process termination, do clean ups.
+ */
+ else
+ supdrvNtProtectUnprotectDeadProcess(hNewPid);
+}
+
+
+/**
+ * New style callback (Vista SP1+ / w2k8).
+ *
+ * @param pNewProcess The new process.
+ * @param hNewPid The PID of the new process.
+ * @param pInfo Process creation details. NULL if process
+ * termination notification.
+ * @remarks ASSUMES this arrives before the handle creation callback.
+ */
+static VOID __stdcall
+supdrvNtProtectCallback_ProcessCreateNotifyEx(PEPROCESS pNewProcess, HANDLE hNewPid, PPS_CREATE_NOTIFY_INFO pInfo)
+{
+ /*
+ * Is it a new process that needs protection?
+ */
+ if (pInfo)
+ {
+ PSUPDRVNTPROTECT pNtStub = supdrvNtProtectLookup(pInfo->CreatingThreadId.UniqueProcess);
+
+ Log(("vboxdrv/NewProcessEx: ctx=%04zx/%p pid=%04zx ppid=%04zx ctor=%04zx/%04zx rcNt=%#x %.*ls\n",
+ PsGetProcessId(PsGetCurrentProcess()), PsGetCurrentProcess(),
+ hNewPid, pInfo->ParentProcessId,
+ pInfo->CreatingThreadId.UniqueProcess, pInfo->CreatingThreadId.UniqueThread, pInfo->CreationStatus,
+ pInfo->FileOpenNameAvailable && pInfo->ImageFileName ? (size_t)pInfo->ImageFileName->Length / 2 : 0,
+ pInfo->FileOpenNameAvailable && pInfo->ImageFileName ? pInfo->ImageFileName->Buffer : NULL));
+
+ if (pNtStub)
+ {
+ PSUPDRVNTPROTECT pNtVm = supdrvNtProtectLookup(hNewPid);
+ if (!pNtVm)
+ {
+ /* Parent must be creator. */
+ if (pInfo->CreatingThreadId.UniqueProcess == pInfo->ParentProcessId)
+ {
+ if (supdrvNtProtectIsSpawningStubProcess(pNtStub, pInfo->ParentProcessId, hNewPid))
+ supdrvNtProtectProtectNewStubChild(pNtStub, hNewPid);
+ }
+ }
+ else
+ {
+ /* Parent must be creator (as above). */
+ supdrvNtProtectVerifyNewChildProtection(pNtStub, pNtVm,
+ pInfo->CreatingThreadId.UniqueProcess == pInfo->ParentProcessId);
+ supdrvNtProtectRelease(pNtVm);
+ }
+ supdrvNtProtectRelease(pNtStub);
+ }
+ }
+ /*
+ * Process termination, do clean ups.
+ */
+ else
+ supdrvNtProtectUnprotectDeadProcess(hNewPid);
+}
+
+/** @} */
+
+
+/** @name Process Handle Callbacks.
+ * @{ */
+
+/** Process rights that we allow for handles to stub and VM processes. */
+# define SUPDRV_NT_ALLOW_PROCESS_RIGHTS \
+ ( PROCESS_TERMINATE \
+ | PROCESS_VM_READ \
+ | PROCESS_QUERY_INFORMATION \
+ | PROCESS_QUERY_LIMITED_INFORMATION \
+ | PROCESS_SUSPEND_RESUME \
+ | DELETE \
+ | READ_CONTROL \
+ | SYNCHRONIZE)
+
+/** Evil process rights. */
+# define SUPDRV_NT_EVIL_PROCESS_RIGHTS \
+ ( PROCESS_CREATE_THREAD \
+ | PROCESS_SET_SESSIONID /*?*/ \
+ | PROCESS_VM_OPERATION \
+ | PROCESS_VM_WRITE \
+ | PROCESS_DUP_HANDLE \
+ | PROCESS_CREATE_PROCESS /*?*/ \
+ | PROCESS_SET_QUOTA /*?*/ \
+ | PROCESS_SET_INFORMATION \
+ | PROCESS_SET_LIMITED_INFORMATION /*?*/ \
+ | 0)
+AssertCompile((SUPDRV_NT_ALLOW_PROCESS_RIGHTS & SUPDRV_NT_EVIL_PROCESS_RIGHTS) == 0);
+
+
+static OB_PREOP_CALLBACK_STATUS __stdcall
+supdrvNtProtectCallback_ProcessHandlePre(PVOID pvUser, POB_PRE_OPERATION_INFORMATION pOpInfo)
+{
+ Assert(pvUser == NULL);
+ Assert(pOpInfo->Operation == OB_OPERATION_HANDLE_CREATE || pOpInfo->Operation == OB_OPERATION_HANDLE_DUPLICATE);
+ Assert(pOpInfo->ObjectType == *PsProcessType);
+
+ /*
+ * Protected? Kludge required for NtOpenProcess calls comming in before
+ * the create process hook triggers on Windows 8.1 (possibly others too).
+ */
+ HANDLE hObjPid = PsGetProcessId((PEPROCESS)pOpInfo->Object);
+ PSUPDRVNTPROTECT pNtProtect = supdrvNtProtectLookup(hObjPid);
+ if (!pNtProtect)
+ {
+ HANDLE hParentPid = PsGetProcessInheritedFromUniqueProcessId((PEPROCESS)pOpInfo->Object);
+ PSUPDRVNTPROTECT pNtStub = supdrvNtProtectLookup(hParentPid);
+ if (pNtStub)
+ {
+ if (supdrvNtProtectIsSpawningStubProcess(pNtStub, hParentPid, hObjPid))
+ {
+ supdrvNtProtectProtectNewStubChild(pNtStub, hObjPid);
+ pNtProtect = supdrvNtProtectLookup(hObjPid);
+ }
+ supdrvNtProtectRelease(pNtStub);
+ }
+ }
+ pOpInfo->CallContext = pNtProtect; /* Just for reference. */
+ if (pNtProtect)
+ {
+ /*
+ * Ok, it's a protected process. Strip rights as required or possible.
+ */
+ static ACCESS_MASK const s_fCsrssStupidDesires = 0x1fffff;
+ ACCESS_MASK fAllowedRights = SUPDRV_NT_ALLOW_PROCESS_RIGHTS;
+
+ if (pOpInfo->Operation == OB_OPERATION_HANDLE_CREATE)
+ {
+ /* Don't restrict the process accessing itself. */
+ if ((PEPROCESS)pOpInfo->Object == PsGetCurrentProcess())
+ {
+ pOpInfo->CallContext = NULL; /* don't assert */
+ pNtProtect->fFirstProcessCreateHandle = false;
+
+ Log(("vboxdrv/ProcessHandlePre: ctx=%04zx/%p wants %#x to %p in pid=%04zx [%d] %s\n",
+ PsGetProcessId(PsGetCurrentProcess()), PsGetCurrentProcess(),
+ pOpInfo->Parameters->CreateHandleInformation.DesiredAccess,
+ pOpInfo->Object, pNtProtect->AvlCore.Key, pNtProtect->enmProcessKind,
+ PsGetProcessImageFileName(PsGetCurrentProcess()) ));
+ }
+ else
+ {
+ /* Special case 1 on Vista, 7 & 8:
+ The CreateProcess code passes the handle over to CSRSS.EXE
+ and the code inBaseSrvCreateProcess will duplicate the
+ handle with 0x1fffff as access mask. NtDuplicateObject will
+ fail this call before it ever gets down here.
+
+ Special case 2 on 8.1:
+ The CreateProcess code requires additional rights for
+ something, we'll drop these in the stub code. */
+ if ( pNtProtect->enmProcessKind == kSupDrvNtProtectKind_VmProcessUnconfirmed
+ && pNtProtect->fFirstProcessCreateHandle
+ && pNtProtect->hParentPid == PsGetProcessId(PsGetCurrentProcess()))
+ {
+ if ( !pOpInfo->KernelHandle
+ && pOpInfo->Parameters->CreateHandleInformation.DesiredAccess == s_fCsrssStupidDesires)
+ {
+ if (g_uNtVerCombined < SUP_MAKE_NT_VER_SIMPLE(6, 3))
+ fAllowedRights |= s_fCsrssStupidDesires;
+ else
+ fAllowedRights = fAllowedRights
+ | PROCESS_VM_OPERATION
+ | PROCESS_VM_WRITE
+ | PROCESS_SET_INFORMATION
+ | PROCESS_SET_LIMITED_INFORMATION
+ | 0;
+ pOpInfo->CallContext = NULL; /* don't assert this. */
+ }
+ pNtProtect->fFirstProcessCreateHandle = false;
+ }
+
+ /* Special case 3 on 8.1:
+ The interaction between the CreateProcess code and CSRSS.EXE
+ has changed to the better with Windows 8.1. CSRSS.EXE no
+ longer duplicates the process (thread too) handle, but opens
+ it, thus allowing us to do our job. */
+ if ( g_uNtVerCombined >= SUP_MAKE_NT_VER_SIMPLE(6, 3)
+ && pNtProtect->enmProcessKind == kSupDrvNtProtectKind_VmProcessUnconfirmed
+ && pNtProtect->fCsrssFirstProcessCreateHandle
+ && supdrvNtProtectIsAssociatedCsrss(pNtProtect, PsGetCurrentProcess())
+ )
+ {
+ pNtProtect->fCsrssFirstProcessCreateHandle = false;
+ if (pOpInfo->Parameters->CreateHandleInformation.DesiredAccess == s_fCsrssStupidDesires)
+ {
+ /* Not needed: PROCESS_CREATE_THREAD, PROCESS_SET_SESSIONID,
+ PROCESS_CREATE_PROCESS */
+ fAllowedRights = fAllowedRights
+ | PROCESS_VM_OPERATION
+ | PROCESS_VM_WRITE
+ | PROCESS_DUP_HANDLE /* Needed for CreateProcess/VBoxTestOGL. */
+ | 0;
+ pOpInfo->CallContext = NULL; /* don't assert this. */
+ }
+ }
+
+ /* Special case 4, Windows 7, Vista, possibly 8, but not 8.1:
+ The Themes service requires PROCESS_DUP_HANDLE access to our
+ process or we won't get any menus and dialogs will be half
+ unreadable. This is _very_ unfortunate and more work will
+ go into making this more secure. */
+ if ( g_uNtVerCombined >= SUP_MAKE_NT_VER_SIMPLE(6, 0)
+ && g_uNtVerCombined < SUP_MAKE_NT_VER_SIMPLE(6, 2)
+ && pOpInfo->Parameters->CreateHandleInformation.DesiredAccess == 0x1478 /* 6.1.7600.16385 (win7_rtm.090713-1255) */
+ && pNtProtect->fThemesFirstProcessCreateHandle
+ && supdrvNtProtectIsFrigginThemesService(pNtProtect, PsGetCurrentProcess()))
+ {
+ pNtProtect->fThemesFirstProcessCreateHandle = true; /* Only once! */
+ fAllowedRights |= PROCESS_DUP_HANDLE;
+ pOpInfo->CallContext = NULL; /* don't assert this. */
+ }
+
+ Log(("vboxdrv/ProcessHandlePre: ctx=%04zx/%p wants %#x to %p/pid=%04zx [%d], allow %#x => %#x; %s\n",
+ PsGetProcessId(PsGetCurrentProcess()), PsGetCurrentProcess(),
+ pOpInfo->Parameters->CreateHandleInformation.DesiredAccess,
+ pOpInfo->Object, pNtProtect->AvlCore.Key, pNtProtect->enmProcessKind, fAllowedRights,
+ pOpInfo->Parameters->CreateHandleInformation.DesiredAccess & fAllowedRights,
+ PsGetProcessImageFileName(PsGetCurrentProcess())));
+
+ pOpInfo->Parameters->CreateHandleInformation.DesiredAccess &= fAllowedRights;
+ }
+ }
+ else
+ {
+ /* Don't restrict the process accessing itself. */
+ if ( (PEPROCESS)pOpInfo->Object == PsGetCurrentProcess()
+ && pOpInfo->Parameters->DuplicateHandleInformation.TargetProcess == pOpInfo->Object)
+ {
+ Log(("vboxdrv/ProcessHandlePre: ctx=%04zx/%p[%p] dup from %04zx/%p with %#x to %p in pid=%04zx [%d] %s\n",
+ PsGetProcessId(PsGetCurrentProcess()), PsGetCurrentProcess(),
+ pOpInfo->Parameters->DuplicateHandleInformation.TargetProcess,
+ PsGetProcessId((PEPROCESS)pOpInfo->Parameters->DuplicateHandleInformation.SourceProcess),
+ pOpInfo->Parameters->DuplicateHandleInformation.SourceProcess,
+ pOpInfo->Parameters->DuplicateHandleInformation.DesiredAccess,
+ pOpInfo->Object, pNtProtect->AvlCore.Key, pNtProtect->enmProcessKind,
+ PsGetProcessImageFileName(PsGetCurrentProcess()) ));
+
+ pOpInfo->CallContext = NULL; /* don't assert */
+ }
+ else
+ {
+ /* Special case 5 on Vista, 7 & 8:
+ This is the CSRSS.EXE end of special case #1. */
+ if ( g_uNtVerCombined < SUP_MAKE_NT_VER_SIMPLE(6, 3)
+ && pNtProtect->enmProcessKind == kSupDrvNtProtectKind_VmProcessUnconfirmed
+ && pNtProtect->fCsrssFirstProcessDuplicateHandle
+ && pNtProtect->hParentPid
+ == PsGetProcessId((PEPROCESS)pOpInfo->Parameters->DuplicateHandleInformation.SourceProcess)
+ && pOpInfo->Parameters->DuplicateHandleInformation.TargetProcess == PsGetCurrentProcess()
+ && supdrvNtProtectIsAssociatedCsrss(pNtProtect, PsGetCurrentProcess())
+ )
+ {
+ pNtProtect->fCsrssFirstProcessDuplicateHandle = false;
+ if (pOpInfo->Parameters->DuplicateHandleInformation.DesiredAccess == s_fCsrssStupidDesires)
+ {
+ /* Not needed: PROCESS_CREATE_THREAD, PROCESS_SET_SESSIONID,
+ PROCESS_CREATE_PROCESS, PROCESS_DUP_HANDLE */
+ fAllowedRights = fAllowedRights
+ | PROCESS_VM_OPERATION
+ | PROCESS_VM_WRITE
+ | PROCESS_DUP_HANDLE /* Needed for launching VBoxTestOGL. */
+ | 0;
+ pOpInfo->CallContext = NULL; /* don't assert this. */
+ }
+ }
+
+ Log(("vboxdrv/ProcessHandlePre: ctx=%04zx/%p[%p] dup from %04zx/%p with %#x to %p in pid=%04zx [%d] %s\n",
+ PsGetProcessId(PsGetCurrentProcess()), PsGetCurrentProcess(),
+ pOpInfo->Parameters->DuplicateHandleInformation.TargetProcess,
+ PsGetProcessId((PEPROCESS)pOpInfo->Parameters->DuplicateHandleInformation.SourceProcess),
+ pOpInfo->Parameters->DuplicateHandleInformation.SourceProcess,
+ pOpInfo->Parameters->DuplicateHandleInformation.DesiredAccess,
+ pOpInfo->Object, pNtProtect->AvlCore.Key, pNtProtect->enmProcessKind,
+ PsGetProcessImageFileName(PsGetCurrentProcess()) ));
+
+ pOpInfo->Parameters->DuplicateHandleInformation.DesiredAccess &= fAllowedRights;
+ }
+ }
+ supdrvNtProtectRelease(pNtProtect);
+ }
+
+ return OB_PREOP_SUCCESS;
+}
+
+
+static VOID __stdcall
+supdrvNtProtectCallback_ProcessHandlePost(PVOID pvUser, POB_POST_OPERATION_INFORMATION pOpInfo)
+{
+ Assert(pvUser == NULL);
+ Assert(pOpInfo->Operation == OB_OPERATION_HANDLE_CREATE || pOpInfo->Operation == OB_OPERATION_HANDLE_DUPLICATE);
+ Assert(pOpInfo->ObjectType == *PsProcessType);
+
+ if ( pOpInfo->CallContext
+ && NT_SUCCESS(pOpInfo->ReturnStatus))
+ {
+ ACCESS_MASK const fGrantedAccess = pOpInfo->Operation == OB_OPERATION_HANDLE_CREATE
+ ? pOpInfo->Parameters->CreateHandleInformation.GrantedAccess
+ : pOpInfo->Parameters->DuplicateHandleInformation.GrantedAccess;
+ AssertReleaseMsg( !(fGrantedAccess & ~( SUPDRV_NT_ALLOW_PROCESS_RIGHTS
+ | WRITE_OWNER | WRITE_DAC /* these two might be forced upon us */
+ | PROCESS_UNKNOWN_4000 /* Seen set on win 8.1 */
+ /*| PROCESS_UNKNOWN_8000 */ ) )
+ || pOpInfo->KernelHandle,
+ ("GrantedAccess=%#x - we allow %#x - we did not allow %#x\n",
+ fGrantedAccess, SUPDRV_NT_ALLOW_PROCESS_RIGHTS, fGrantedAccess & ~SUPDRV_NT_ALLOW_PROCESS_RIGHTS));
+ }
+}
+
+# undef SUPDRV_NT_ALLOW_PROCESS_RIGHTS
+
+/** @} */
+
+
+/** @name Thread Handle Callbacks
+ * @{ */
+
+/* From ntifs.h */
+extern "C" NTKERNELAPI PEPROCESS __stdcall IoThreadToProcess(PETHREAD);
+
+/** Thread rights that we allow for handles to stub and VM processes. */
+# define SUPDRV_NT_ALLOWED_THREAD_RIGHTS \
+ ( THREAD_TERMINATE \
+ | THREAD_GET_CONTEXT \
+ | THREAD_QUERY_INFORMATION \
+ | THREAD_QUERY_LIMITED_INFORMATION \
+ | DELETE \
+ | READ_CONTROL \
+ | SYNCHRONIZE)
+/** @todo consider THREAD_SET_LIMITED_INFORMATION & THREAD_RESUME */
+
+/** Evil thread rights.
+ * @remarks THREAD_RESUME is not included as it seems to be forced upon us by
+ * Windows 8.1, at least for some processes. We dont' actively
+ * allow it though, just tollerate it when forced to. */
+# define SUPDRV_NT_EVIL_THREAD_RIGHTS \
+ ( THREAD_SUSPEND_RESUME \
+ | THREAD_SET_CONTEXT \
+ | THREAD_SET_INFORMATION \
+ | THREAD_SET_LIMITED_INFORMATION /*?*/ \
+ | THREAD_SET_THREAD_TOKEN /*?*/ \
+ | THREAD_IMPERSONATE /*?*/ \
+ | THREAD_DIRECT_IMPERSONATION /*?*/ \
+ /*| THREAD_RESUME - see remarks. */ \
+ | 0)
+AssertCompile((SUPDRV_NT_EVIL_THREAD_RIGHTS & SUPDRV_NT_ALLOWED_THREAD_RIGHTS) == 0);
+
+
+static OB_PREOP_CALLBACK_STATUS __stdcall
+supdrvNtProtectCallback_ThreadHandlePre(PVOID pvUser, POB_PRE_OPERATION_INFORMATION pOpInfo)
+{
+ Assert(pvUser == NULL);
+ Assert(pOpInfo->Operation == OB_OPERATION_HANDLE_CREATE || pOpInfo->Operation == OB_OPERATION_HANDLE_DUPLICATE);
+ Assert(pOpInfo->ObjectType == *PsThreadType);
+
+ PEPROCESS pProcess = IoThreadToProcess((PETHREAD)pOpInfo->Object);
+ PSUPDRVNTPROTECT pNtProtect = supdrvNtProtectLookup(PsGetProcessId(pProcess));
+ pOpInfo->CallContext = pNtProtect; /* Just for reference. */
+ if (pNtProtect)
+ {
+ static ACCESS_MASK const s_fCsrssStupidDesires = 0x1fffff;
+ ACCESS_MASK fAllowedRights = SUPDRV_NT_ALLOWED_THREAD_RIGHTS;
+
+ if (pOpInfo->Operation == OB_OPERATION_HANDLE_CREATE)
+ {
+ /* Don't restrict the process accessing its own threads. */
+ if (pProcess == PsGetCurrentProcess())
+ {
+ Log(("vboxdrv/ThreadHandlePre: ctx=%04zx/%p wants %#x to %p in pid=%04zx [%d] self\n",
+ PsGetProcessId(PsGetCurrentProcess()), PsGetCurrentProcess(),
+ pOpInfo->Parameters->CreateHandleInformation.DesiredAccess,
+ pOpInfo->Object, pNtProtect->AvlCore.Key, pNtProtect->enmProcessKind));
+ pOpInfo->CallContext = NULL; /* don't assert */
+ pNtProtect->fFirstThreadCreateHandle = false;
+ }
+ else
+ {
+ /* Special case 1 on Vista, 7, 8:
+ The CreateProcess code passes the handle over to CSRSS.EXE
+ and the code inBaseSrvCreateProcess will duplicate the
+ handle with 0x1fffff as access mask. NtDuplicateObject will
+ fail this call before it ever gets down here. */
+ if ( g_uNtVerCombined < SUP_MAKE_NT_VER_SIMPLE(6, 3)
+ && pNtProtect->enmProcessKind == kSupDrvNtProtectKind_VmProcessUnconfirmed
+ && pNtProtect->fFirstThreadCreateHandle
+ && pNtProtect->hParentPid == PsGetProcessId(PsGetCurrentProcess()))
+ {
+ if ( !pOpInfo->KernelHandle
+ && pOpInfo->Parameters->CreateHandleInformation.DesiredAccess == s_fCsrssStupidDesires)
+ {
+ fAllowedRights |= s_fCsrssStupidDesires;
+ pOpInfo->CallContext = NULL; /* don't assert this. */
+ }
+ pNtProtect->fFirstThreadCreateHandle = false;
+ }
+
+ /* Special case 2 on 8.1, possibly also Vista, 7, 8:
+ When creating a process like VBoxTestOGL from the VM process,
+ CSRSS.EXE will try talk to the calling thread and, it
+ appears, impersonate it. We unfortunately need to allow
+ this or there will be no 3D support. Typical DbgPrint:
+ "SXS: BasepCreateActCtx() Calling csrss server failed. Status = 0xc00000a5" */
+ SUPDRVNTPROTECTKIND enmProcessKind;
+ if ( g_uNtVerCombined >= SUP_MAKE_NT_VER_COMBINED(6, 0, 0, 0, 0)
+ && ( (enmProcessKind = pNtProtect->enmProcessKind) == kSupDrvNtProtectKind_VmProcessConfirmed
+ || enmProcessKind == kSupDrvNtProtectKind_VmProcessUnconfirmed)
+ && supdrvNtProtectIsAssociatedCsrss(pNtProtect, PsGetCurrentProcess()) )
+ {
+ fAllowedRights |= THREAD_IMPERSONATE;
+ fAllowedRights |= THREAD_DIRECT_IMPERSONATION;
+ //fAllowedRights |= THREAD_SET_LIMITED_INFORMATION; - try without this one
+ pOpInfo->CallContext = NULL; /* don't assert this. */
+ }
+
+ Log(("vboxdrv/ThreadHandlePre: ctx=%04zx/%p wants %#x to %p in pid=%04zx [%d], allow %#x => %#x; %s\n",
+ PsGetProcessId(PsGetCurrentProcess()), PsGetCurrentProcess(),
+ pOpInfo->Parameters->CreateHandleInformation.DesiredAccess,
+ pOpInfo->Object, pNtProtect->AvlCore.Key, pNtProtect->enmProcessKind, fAllowedRights,
+ pOpInfo->Parameters->CreateHandleInformation.DesiredAccess & fAllowedRights,
+ PsGetProcessImageFileName(PsGetCurrentProcess())));
+
+ pOpInfo->Parameters->CreateHandleInformation.DesiredAccess &= fAllowedRights;
+ }
+ }
+ else
+ {
+ /* Don't restrict the process accessing its own threads. */
+ if ( pProcess == PsGetCurrentProcess()
+ && (PEPROCESS)pOpInfo->Parameters->DuplicateHandleInformation.TargetProcess == pProcess)
+ {
+ Log(("vboxdrv/ThreadHandlePre: ctx=%04zx/%p[%p] dup from %04zx/%p with %#x to %p in pid=%04zx [%d] self\n",
+ PsGetProcessId(PsGetCurrentProcess()), PsGetCurrentProcess(),
+ pOpInfo->Parameters->DuplicateHandleInformation.TargetProcess,
+ PsGetProcessId((PEPROCESS)pOpInfo->Parameters->DuplicateHandleInformation.SourceProcess),
+ pOpInfo->Parameters->DuplicateHandleInformation.SourceProcess,
+ pOpInfo->Parameters->DuplicateHandleInformation.DesiredAccess,
+ pOpInfo->Object, pNtProtect->AvlCore.Key, pNtProtect->enmProcessKind,
+ PsGetProcessImageFileName(PsGetCurrentProcess()) ));
+ pOpInfo->CallContext = NULL; /* don't assert */
+ }
+ else
+ {
+ /* Special case 3 on Vista, 7, 8:
+ This is the follow up to special case 1. */
+ SUPDRVNTPROTECTKIND enmProcessKind;
+ if ( g_uNtVerCombined >= SUP_MAKE_NT_VER_COMBINED(6, 0, 0, 0, 0)
+ && ( (enmProcessKind = pNtProtect->enmProcessKind) == kSupDrvNtProtectKind_VmProcessConfirmed
+ || enmProcessKind == kSupDrvNtProtectKind_VmProcessUnconfirmed)
+ && pOpInfo->Parameters->DuplicateHandleInformation.TargetProcess == PsGetCurrentProcess()
+ && supdrvNtProtectIsAssociatedCsrss(pNtProtect, PsGetCurrentProcess()) )
+ {
+ fAllowedRights |= THREAD_IMPERSONATE;
+ fAllowedRights |= THREAD_DIRECT_IMPERSONATION;
+ //fAllowedRights |= THREAD_SET_LIMITED_INFORMATION; - try without this one
+ pOpInfo->CallContext = NULL; /* don't assert this. */
+ }
+
+ Log(("vboxdrv/ThreadHandlePre: ctx=%04zx/%p[%p] dup from %04zx/%p with %#x to %p in pid=%04zx [%d], allow %#x => %#x; %s\n",
+ PsGetProcessId(PsGetCurrentProcess()), PsGetCurrentProcess(),
+ pOpInfo->Parameters->DuplicateHandleInformation.TargetProcess,
+ PsGetProcessId((PEPROCESS)pOpInfo->Parameters->DuplicateHandleInformation.SourceProcess),
+ pOpInfo->Parameters->DuplicateHandleInformation.SourceProcess,
+ pOpInfo->Parameters->DuplicateHandleInformation.DesiredAccess,
+ pOpInfo->Object, pNtProtect->AvlCore.Key, pNtProtect->enmProcessKind, fAllowedRights,
+ pOpInfo->Parameters->DuplicateHandleInformation.DesiredAccess & fAllowedRights,
+ PsGetProcessImageFileName(PsGetCurrentProcess()) ));
+
+ pOpInfo->Parameters->DuplicateHandleInformation.DesiredAccess &= fAllowedRights;
+ }
+ }
+
+ supdrvNtProtectRelease(pNtProtect);
+ }
+
+ return OB_PREOP_SUCCESS;
+}
+
+
+static VOID __stdcall
+supdrvNtProtectCallback_ThreadHandlePost(PVOID pvUser, POB_POST_OPERATION_INFORMATION pOpInfo)
+{
+ Assert(pvUser == NULL);
+ Assert(pOpInfo->Operation == OB_OPERATION_HANDLE_CREATE || pOpInfo->Operation == OB_OPERATION_HANDLE_DUPLICATE);
+ Assert(pOpInfo->ObjectType == *PsThreadType);
+
+ if ( pOpInfo->CallContext
+ && NT_SUCCESS(pOpInfo->ReturnStatus))
+ {
+ ACCESS_MASK const fGrantedAccess = pOpInfo->Parameters->CreateHandleInformation.GrantedAccess;
+ AssertReleaseMsg( !(fGrantedAccess & ~( SUPDRV_NT_ALLOWED_THREAD_RIGHTS
+ | WRITE_OWNER | WRITE_DAC /* these two might be forced upon us */
+ | THREAD_RESUME /* This seems to be force upon us too with 8.1. */
+ ) )
+ || pOpInfo->KernelHandle,
+ ("GrantedAccess=%#x - we allow %#x - we did not allow %#x\n",
+ fGrantedAccess, SUPDRV_NT_ALLOWED_THREAD_RIGHTS, fGrantedAccess & ~SUPDRV_NT_ALLOWED_THREAD_RIGHTS));
+ }
+}
+
+# undef SUPDRV_NT_ALLOWED_THREAD_RIGHTS
+
+/** @} */
+
+
+/**
+ * Creates a new process protection structure.
+ *
+ * @returns VBox status code.
+ * @param ppNtProtect Where to return the pointer to the structure
+ * on success.
+ * @param hPid The process ID of the process to protect.
+ * @param enmProcessKind The kind of process we're protecting.
+ * @param fLink Whether to link the structure into the tree.
+ */
+static int supdrvNtProtectCreate(PSUPDRVNTPROTECT *ppNtProtect, HANDLE hPid, SUPDRVNTPROTECTKIND enmProcessKind, bool fLink)
+{
+ AssertReturn(g_hNtProtectLock != NIL_RTSPINLOCK, VERR_WRONG_ORDER);
+
+ PSUPDRVNTPROTECT pNtProtect = (PSUPDRVNTPROTECT)RTMemAllocZ(sizeof(*pNtProtect));
+ if (!pNtProtect)
+ return VERR_NO_MEMORY;
+
+ pNtProtect->AvlCore.Key = hPid;
+ pNtProtect->u32Magic = SUPDRVNTPROTECT_MAGIC;
+ pNtProtect->cRefs = 1;
+ pNtProtect->enmProcessKind = enmProcessKind;
+ pNtProtect->hParentPid = NULL;
+ pNtProtect->hCsrssPid = NULL;
+ pNtProtect->pCsrssProcess = NULL;
+
+ if (fLink)
+ {
+ RTSpinlockAcquire(g_hNtProtectLock);
+ bool fSuccess = RTAvlPVInsert(&g_NtProtectTree, &pNtProtect->AvlCore);
+ RTSpinlockRelease(g_hNtProtectLock);
+
+ if (!fSuccess)
+ {
+ /* Duplicate entry, fail. */
+ pNtProtect->u32Magic = SUPDRVNTPROTECT_MAGIC_DEAD;
+ RTMemFree(pNtProtect);
+ return VERR_ACCESS_DENIED;
+ }
+ }
+
+ *ppNtProtect = pNtProtect;
+ return VINF_SUCCESS;
+}
+
+
+/**
+ * Releases a reference to a NT protection structure.
+ *
+ * @param pNtProtect The NT protection structure.
+ */
+static void supdrvNtProtectRelease(PSUPDRVNTPROTECT pNtProtect)
+{
+ if (!pNtProtect)
+ return;
+ AssertReturnVoid(pNtProtect->u32Magic == SUPDRVNTPROTECT_MAGIC);
+
+ RTSpinlockAcquire(g_hNtProtectLock);
+ uint32_t cRefs = ASMAtomicDecU32(&pNtProtect->cRefs);
+ if (cRefs != 0)
+ RTSpinlockRelease(g_hNtProtectLock);
+ else
+ {
+ /*
+ * That was the last reference. Remove it from the tree, invalidate it
+ * and free the resources associated with it. Also, release any
+ * child/parent references related to this protection structure.
+ */
+ ASMAtomicWriteU32(&pNtProtect->u32Magic, SUPDRVNTPROTECT_MAGIC_DEAD);
+ PSUPDRVNTPROTECT pRemoved = (PSUPDRVNTPROTECT)RTAvlPVRemove(&g_NtProtectTree, pNtProtect->AvlCore.Key);
+
+ PSUPDRVNTPROTECT pRemovedChild = NULL;
+ PSUPDRVNTPROTECT pChild = NULL;
+ if (pNtProtect->enmProcessKind == kSupDrvNtProtectKind_StubParent)
+ {
+ pChild = pNtProtect->u.pChild;
+ if (pChild)
+ {
+ pNtProtect->u.pChild = NULL;
+ pChild->u.pParent = NULL;
+ pChild->enmProcessKind = kSupDrvNtProtectKind_VmProcessDead;
+ uint32_t cChildRefs = ASMAtomicIncU32(&pChild->cRefs);
+ if (!cChildRefs)
+ pRemovedChild = (PSUPDRVNTPROTECT)RTAvlPVRemove(&g_NtProtectTree, pChild->AvlCore.Key);
+ else
+ pChild = NULL;
+ }
+ }
+ else
+ AssertRelease(pNtProtect->enmProcessKind != kSupDrvNtProtectKind_VmProcessUnconfirmed);
+
+ RTSpinlockRelease(g_hNtProtectLock);
+ Assert(pRemoved == pNtProtect);
+ Assert(pRemovedChild == pChild);
+
+ if (pNtProtect->pCsrssProcess)
+ {
+ ObDereferenceObject(pNtProtect->pCsrssProcess);
+ pNtProtect->pCsrssProcess = NULL;
+ }
+
+ RTMemFree(pNtProtect);
+ if (pChild)
+ RTMemFree(pChild);
+ }
+}
+
+
+/**
+ * Looks up a PID in the NT protect tree.
+ *
+ * @returns Pointer to a NT protection structure (with a referenced) on success,
+ * NULL if not found.
+ * @param hPid The process ID.
+ */
+static PSUPDRVNTPROTECT supdrvNtProtectLookup(HANDLE hPid)
+{
+ RTSpinlockAcquire(g_hNtProtectLock);
+ PSUPDRVNTPROTECT pFound = (PSUPDRVNTPROTECT)RTAvlPVGet(&g_NtProtectTree, hPid);
+ if (pFound)
+ ASMAtomicIncU32(&pFound->cRefs);
+ RTSpinlockRelease(g_hNtProtectLock);
+ return pFound;
+}
+
+
+/**
+ * Worker for supdrvNtProtectVerifyProcess that verifies the handles to a VM
+ * process and its thread.
+ *
+ * @returns VBox status code.
+ * @param pNtProtect The NT protect structure for getting information
+ * about special processes.
+ */
+static int supdrvNtProtectRestrictHandlesToProcessAndThread(PSUPDRVNTPROTECT pNtProtect)
+{
+ /*
+ * What to protect.
+ */
+ PEPROCESS pProtectedProcess = PsGetCurrentProcess();
+ HANDLE hProtectedPid = PsGetProcessId(pProtectedProcess);
+ PETHREAD pProtectedThread = PsGetCurrentThread();
+ AssertReturn(pNtProtect->AvlCore.Key == hProtectedPid, VERR_INTERNAL_ERROR_5);
+
+ /*
+ * Take a snapshot of all the handles in the system.
+ */
+ uint32_t cbBuf = _256K;
+ uint8_t *pbBuf = (uint8_t *)RTMemAlloc(cbBuf);
+ ULONG cbNeeded = cbBuf;
+ NTSTATUS rcNt = NtQuerySystemInformation(SystemExtendedHandleInformation, pbBuf, cbBuf, &cbNeeded);
+ if (!NT_SUCCESS(rcNt))
+ {
+ while ( rcNt == STATUS_INFO_LENGTH_MISMATCH
+ && cbNeeded > cbBuf
+ && cbBuf <= 32U*_1M)
+ {
+ cbBuf = RT_ALIGN_32(cbNeeded + _4K, _64K);
+ RTMemFree(pbBuf);
+ pbBuf = (uint8_t *)RTMemAlloc(cbBuf);
+ if (!pbBuf)
+ return VERR_NO_MEMORY;
+ rcNt = NtQuerySystemInformation(SystemExtendedHandleInformation, pbBuf, cbBuf, &cbNeeded);
+ }
+ if (!NT_SUCCESS(rcNt))
+ {
+ RTMemFree(pbBuf);
+ return RTErrConvertFromNtStatus(rcNt);
+ }
+ }
+
+ /*
+ * Walk the information and look for handles to the two objects we're protecting.
+ */
+ int rc = VINF_SUCCESS;
+
+ uint32_t cCsrssProcessHandles = 0;
+ uint32_t cSystemProcessHandles = 0;
+ uint32_t cEvilProcessHandles = 0;
+ uint32_t cBenignProcessHandles = 0;
+
+ uint32_t cCsrssThreadHandles = 0;
+ uint32_t cEvilThreadHandles = 0;
+ uint32_t cBenignThreadHandles = 0;
+
+ SYSTEM_HANDLE_INFORMATION_EX const *pInfo = (SYSTEM_HANDLE_INFORMATION_EX const *)pbBuf;
+ ULONG_PTR i = pInfo->NumberOfHandles;
+ AssertRelease(RT_OFFSETOF(SYSTEM_HANDLE_INFORMATION_EX, Handles[i]) == cbNeeded);
+ while (i-- > 0)
+ {
+ const char *pszType;
+ SYSTEM_HANDLE_ENTRY_INFO_EX const *pHandleInfo = &pInfo->Handles[i];
+ if (pHandleInfo->Object == pProtectedProcess)
+ {
+ /* Handles within the protected process is fine. */
+ if ( !(pHandleInfo->GrantedAccess & SUPDRV_NT_EVIL_PROCESS_RIGHTS)
+ || pHandleInfo->UniqueProcessId == hProtectedPid)
+ {
+ cBenignProcessHandles++;
+ continue;
+ }
+
+ /* CSRSS is allowed to have one evil process handle.
+ See the special cases in the hook code. */
+ if ( cCsrssProcessHandles < 1
+ && pHandleInfo->UniqueProcessId == pNtProtect->hCsrssPid)
+ {
+ cCsrssProcessHandles++;
+ continue;
+ }
+
+ /* The system process is allowed having one open process handle in
+ Windows 8.1 and later. */
+ if ( g_uNtVerCombined >= SUP_MAKE_NT_VER_SIMPLE(6, 3)
+ && cSystemProcessHandles < 1
+ && pHandleInfo->UniqueProcessId == PsGetProcessId(PsInitialSystemProcess))
+ {
+ cSystemProcessHandles++;
+ continue;
+ }
+
+ cEvilProcessHandles++;
+ pszType = "process";
+ }
+ else if (pHandleInfo->Object == pProtectedThread)
+ {
+ /* Handles within the protected process is fine. */
+ if ( !(pHandleInfo->GrantedAccess & SUPDRV_NT_EVIL_THREAD_RIGHTS)
+ || pHandleInfo->UniqueProcessId == hProtectedPid)
+ {
+ cBenignThreadHandles++;
+ continue;
+ }
+
+ /* CSRSS is allowed to have one evil handle to the primary thread
+ for LPC purposes. See the hook for special case. */
+ if ( cCsrssThreadHandles < 1
+ && pHandleInfo->UniqueProcessId == pNtProtect->hCsrssPid)
+ {
+ cCsrssThreadHandles++;
+ continue;
+ }
+
+ cEvilThreadHandles++;
+ pszType = "thread";
+ }
+ else
+ continue;
+
+ /* Found evil handle. Currently ignoring on pre-Vista. */
+# ifndef VBOX_WITH_VISTA_NO_SP
+ if ( g_uNtVerCombined >= SUP_NT_VER_VISTA
+# else
+ if ( g_uNtVerCombined >= SUP_MAKE_NT_VER_COMBINED(6, 0, 6001, 0, 0)
+# endif
+ || g_pfnObRegisterCallbacks)
+ {
+ LogRel(("vboxdrv: Found evil handle to budding VM process: pid=%p h=%p acc=%#x attr=%#x type=%s\n",
+ pHandleInfo->UniqueProcessId, pHandleInfo->HandleValue,
+ pHandleInfo->GrantedAccess, pHandleInfo->HandleAttributes, pszType));
+ rc = VERR_SUPDRV_HARDENING_EVIL_HANDLE;
+ }
+ }
+
+ return rc;
+}
+
+
+/**
+ * Checks if the current process checks out as a VM process stub.
+ *
+ * @returns VBox status code.
+ * @param pNtProtect The NT protect structure. This is upgraded to a
+ * final protection kind (state) on success.
+ */
+static int supdrvNtProtectVerifyProcess(PSUPDRVNTPROTECT pNtProtect)
+{
+ AssertReturn(PsGetProcessId(PsGetCurrentProcess()) == pNtProtect->AvlCore.Key, VERR_INTERNAL_ERROR_3);
+
+ /*
+ * Do the verification. The handle restriction checks are only preformed
+ * on VM processes.
+ */
+ int rc = VINF_SUCCESS;
+ if (pNtProtect->enmProcessKind >= kSupDrvNtProtectKind_VmProcessUnconfirmed)
+ rc = supdrvNtProtectRestrictHandlesToProcessAndThread(pNtProtect);
+ if (RT_SUCCESS(rc))
+ {
+ char szErr[256];
+ RT_ZERO(szErr);
+ RTERRINFO ErrInfo;
+ RTErrInfoInit(&ErrInfo, szErr, sizeof(szErr));
+
+ rc = supHardenedWinVerifyProcess(NtCurrentProcess(), NtCurrentThread(), &ErrInfo);
+ if (RT_FAILURE(rc))
+ RTLogWriteDebugger(szErr, strlen(szErr));
+ }
+
+ /*
+ * Upgrade and return.
+ */
+ RTSpinlockAcquire(g_hNtProtectLock);
+
+ /* Stub process verficiation is pretty much straight forward. */
+ if (pNtProtect->enmProcessKind == kSupDrvNtProtectKind_StubUnverified)
+ pNtProtect->enmProcessKind = RT_SUCCESS(rc) ? kSupDrvNtProtectKind_StubSpawning : kSupDrvNtProtectKind_StubDead;
+
+ /* The VM process verification is a little bit more complicated
+ because we need to drop the parent process reference as well. */
+ else if (pNtProtect->enmProcessKind == kSupDrvNtProtectKind_VmProcessUnconfirmed)
+ {
+ AssertRelease(pNtProtect->cRefs >= 2); /* Parent + Caller */
+ PSUPDRVNTPROTECT pParent = pNtProtect->u.pParent;
+ AssertRelease(pParent);
+ AssertRelease(pParent->u.pParent == pNtProtect);
+ AssertRelease(pParent->enmProcessKind == kSupDrvNtProtectKind_StubParent);
+ pParent->u.pParent = NULL;
+
+ pNtProtect->u.pParent = NULL;
+ ASMAtomicDecU32(&pNtProtect->cRefs);
+
+ if (RT_SUCCESS(rc))
+ pNtProtect->enmProcessKind = kSupDrvNtProtectKind_VmProcessConfirmed;
+ else
+ pNtProtect->enmProcessKind = kSupDrvNtProtectKind_VmProcessDead;
+ }
+
+ /* Since the stub and VM processes are only supposed to have one thread,
+ we're not supposed to be subject to any races from within the processes.
+
+ There is a race between VM process verification and the stub process
+ exiting, though. We require the stub process to be alive until the new
+ VM process has made it thru the validation. So, when the stub
+ terminates the notification handler will change the state of both stub
+ and VM process to dead.
+
+ Also, I'm not entirely certain where the process
+ termination notification is triggered from, so that can theorically
+ create a race in both cases. */
+ else
+ {
+ AssertReleaseMsg( pNtProtect->enmProcessKind == kSupDrvNtProtectKind_StubDead
+ || pNtProtect->enmProcessKind == kSupDrvNtProtectKind_VmProcessDead,
+ ("enmProcessKind=%d rc=%Rrc\n", pNtProtect->enmProcessKind, rc));
+ if (RT_SUCCESS(rc))
+ rc = VERR_INVALID_STATE; /* There should be no races here. */
+ }
+
+ RTSpinlockRelease(g_hNtProtectLock);
+ return rc;
+}
+
+
+# ifndef VBOX_WITHOUT_DEBUGGER_CHECKS
+
+/**
+ * Checks if the current process is being debugged.
+ * @return @c true if debugged, @c false if not.
+ */
+static bool supdrvNtIsDebuggerAttached(void)
+{
+ return PsIsProcessBeingDebugged(PsGetCurrentProcess()) != FALSE;
+}
+
+# endif /* !VBOX_WITHOUT_DEBUGGER_CHECKS */
+
+
+/**
+ * Terminates the hardening bits.
+ */
+static void supdrvNtProtectTerm(void)
+{
+ /*
+ * Stop intercepting process and thread handle creation calls.
+ */
+ if (g_pvObCallbacksCookie)
+ {
+ g_pfnObUnRegisterCallbacks(g_pvObCallbacksCookie);
+ g_pvObCallbacksCookie = NULL;
+ }
+
+ /*
+ * Stop intercepting process creation and termination notifications.
+ */
+ NTSTATUS rcNt;
+ if (g_pfnPsSetCreateProcessNotifyRoutineEx)
+ rcNt = g_pfnPsSetCreateProcessNotifyRoutineEx(supdrvNtProtectCallback_ProcessCreateNotifyEx, TRUE /*fRemove*/);
+ else
+ rcNt = PsSetCreateProcessNotifyRoutine(supdrvNtProtectCallback_ProcessCreateNotify, TRUE /*fRemove*/);
+ AssertMsg(NT_SUCCESS(rcNt), ("rcNt=%#x\n", rcNt));
+
+ Assert(g_NtProtectTree == NULL);
+
+ /*
+ * Clean up globals.
+ */
+ RTSpinlockDestroy(g_hNtProtectLock);
+ g_NtProtectTree = NIL_RTSPINLOCK;
+
+ supHardenedWinTermImageVerifier();
+}
+
+# ifdef RT_ARCH_X86
+DECLASM(void) supdrvNtQueryVirtualMemory_0xAF(void);
+DECLASM(void) supdrvNtQueryVirtualMemory_0xB0(void);
+DECLASM(void) supdrvNtQueryVirtualMemory_0xB1(void);
+DECLASM(void) supdrvNtQueryVirtualMemory_0xB2(void);
+DECLASM(void) supdrvNtQueryVirtualMemory_0xB3(void);
+DECLASM(void) supdrvNtQueryVirtualMemory_0xB4(void);
+DECLASM(void) supdrvNtQueryVirtualMemory_0xB5(void);
+DECLASM(void) supdrvNtQueryVirtualMemory_0xB6(void);
+DECLASM(void) supdrvNtQueryVirtualMemory_0xB7(void);
+DECLASM(void) supdrvNtQueryVirtualMemory_0xB8(void);
+DECLASM(void) supdrvNtQueryVirtualMemory_0xB9(void);
+DECLASM(void) supdrvNtQueryVirtualMemory_0xBA(void);
+DECLASM(void) supdrvNtQueryVirtualMemory_0xBB(void);
+DECLASM(void) supdrvNtQueryVirtualMemory_0xBC(void);
+DECLASM(void) supdrvNtQueryVirtualMemory_0xBD(void);
+DECLASM(void) supdrvNtQueryVirtualMemory_0xBE(void);
+# elif defined(RT_ARCH_AMD64)
+DECLASM(void) supdrvNtQueryVirtualMemory_0x1F(void);
+DECLASM(void) supdrvNtQueryVirtualMemory_0x20(void);
+DECLASM(void) supdrvNtQueryVirtualMemory_0x21(void);
+DECLASM(void) supdrvNtQueryVirtualMemory_0x22(void);
+DECLASM(void) supdrvNtQueryVirtualMemory_0x23(void);
+extern "C" NTSYSAPI NTSTATUS NTAPI ZwRequestWaitReplyPort(HANDLE, PVOID, PVOID);
+# endif
+
+/**
+ * Initalizes the hardening bits.
+ *
+ * @returns NT status code.
+ */
+static NTSTATUS supdrvNtProtectInit(void)
+{
+ /*
+ * Initialize the globals.
+ */
+
+ /* The NT version. */
+ ULONG uMajor, uMinor, uBuild;
+ PsGetVersion(&uMajor, &uMinor, &uBuild, NULL);
+ g_uNtVerCombined = SUP_MAKE_NT_VER_COMBINED(uMajor, uMinor, uBuild, 0, 0);
+
+ /* Resolve methods we want but isn't available everywhere. */
+ UNICODE_STRING RoutineName;
+
+ RtlInitUnicodeString(&RoutineName, L"ObRegisterCallbacks");
+ g_pfnObRegisterCallbacks = (PFNOBREGISTERCALLBACKS)MmGetSystemRoutineAddress(&RoutineName);
+
+ RtlInitUnicodeString(&RoutineName, L"ObUnRegisterCallbacks");
+ g_pfnObUnRegisterCallbacks = (PFNOBUNREGISTERCALLBACKS)MmGetSystemRoutineAddress(&RoutineName);
+
+ RtlInitUnicodeString(&RoutineName, L"PsSetCreateProcessNotifyRoutineEx");
+ g_pfnPsSetCreateProcessNotifyRoutineEx = (PFNPSSETCREATEPROCESSNOTIFYROUTINEEX)MmGetSystemRoutineAddress(&RoutineName);
+
+ RtlInitUnicodeString(&RoutineName, L"PsReferenceProcessFilePointer");
+ g_pfnPsReferenceProcessFilePointer = (PFNPSREFERENCEPROCESSFILEPOINTER)MmGetSystemRoutineAddress(&RoutineName);
+
+ RtlInitUnicodeString(&RoutineName, L"PsIsProtectedProcessLight");
+ g_pfnPsIsProtectedProcessLight = (PFNPSISPROTECTEDPROCESSLIGHT)MmGetSystemRoutineAddress(&RoutineName);
+
+ RtlInitUnicodeString(&RoutineName, L"ZwQueryVirtualMemory"); /* Yes, using Zw version here. */
+ g_pfnNtQueryVirtualMemory = (PFNNTQUERYVIRTUALMEMORY)MmGetSystemRoutineAddress(&RoutineName);
+ if (!g_pfnNtQueryVirtualMemory && g_uNtVerCombined < SUP_NT_VER_VISTA)
+ {
+ /* XP & W2K3 doesn't have this function exported, so we've cooked up a
+ few alternative in the assembly helper file that uses the code in
+ ZwQueryVolumeInformationFile with a different eax value. */
+# ifdef RT_ARCH_X86
+ uint8_t const *pbCode = (uint8_t const *)(uintptr_t)ZwQueryVolumeInformationFile;
+ if (*pbCode == 0xb8) /* mov eax, dword */
+ switch (*(uint32_t const *)&pbCode[1])
+ {
+ case 0xb0: g_pfnNtQueryVirtualMemory = (PFNNTQUERYVIRTUALMEMORY)supdrvNtQueryVirtualMemory_0xAF; break; /* just in case */
+ case 0xb1: g_pfnNtQueryVirtualMemory = (PFNNTQUERYVIRTUALMEMORY)supdrvNtQueryVirtualMemory_0xB0; break; /* just in case */
+ case 0xb2: g_pfnNtQueryVirtualMemory = (PFNNTQUERYVIRTUALMEMORY)supdrvNtQueryVirtualMemory_0xB1; break; /* just in case */
+ case 0xb3: g_pfnNtQueryVirtualMemory = (PFNNTQUERYVIRTUALMEMORY)supdrvNtQueryVirtualMemory_0xB2; break; /* XP SP3 */
+ case 0xb4: g_pfnNtQueryVirtualMemory = (PFNNTQUERYVIRTUALMEMORY)supdrvNtQueryVirtualMemory_0xB2; break; /* just in case */
+ case 0xb5: g_pfnNtQueryVirtualMemory = (PFNNTQUERYVIRTUALMEMORY)supdrvNtQueryVirtualMemory_0xB3; break; /* just in case */
+ case 0xb6: g_pfnNtQueryVirtualMemory = (PFNNTQUERYVIRTUALMEMORY)supdrvNtQueryVirtualMemory_0xB4; break; /* just in case */
+ case 0xb7: g_pfnNtQueryVirtualMemory = (PFNNTQUERYVIRTUALMEMORY)supdrvNtQueryVirtualMemory_0xB5; break; /* just in case */
+ case 0xb8: g_pfnNtQueryVirtualMemory = (PFNNTQUERYVIRTUALMEMORY)supdrvNtQueryVirtualMemory_0xB6; break; /* just in case */
+ case 0xb9: g_pfnNtQueryVirtualMemory = (PFNNTQUERYVIRTUALMEMORY)supdrvNtQueryVirtualMemory_0xB7; break; /* just in case */
+ case 0xba: g_pfnNtQueryVirtualMemory = (PFNNTQUERYVIRTUALMEMORY)supdrvNtQueryVirtualMemory_0xB8; break; /* just in case */
+ case 0xbb: g_pfnNtQueryVirtualMemory = (PFNNTQUERYVIRTUALMEMORY)supdrvNtQueryVirtualMemory_0xBA; break; /* W2K3 R2 SP2 */
+ case 0xbc: g_pfnNtQueryVirtualMemory = (PFNNTQUERYVIRTUALMEMORY)supdrvNtQueryVirtualMemory_0xBB; break; /* just in case */
+ case 0xbd: g_pfnNtQueryVirtualMemory = (PFNNTQUERYVIRTUALMEMORY)supdrvNtQueryVirtualMemory_0xBC; break; /* just in case */
+ case 0xbe: g_pfnNtQueryVirtualMemory = (PFNNTQUERYVIRTUALMEMORY)supdrvNtQueryVirtualMemory_0xBD; break; /* just in case */
+ case 0xbf: g_pfnNtQueryVirtualMemory = (PFNNTQUERYVIRTUALMEMORY)supdrvNtQueryVirtualMemory_0xBE; break; /* just in case */
+ }
+# elif defined(RT_ARCH_AMD64)
+ uint8_t const *pbCode = (uint8_t const *)(uintptr_t)ZwRequestWaitReplyPort;
+ if ( pbCode[ 0] == 0x48 /* mov rax, rsp */
+ && pbCode[ 1] == 0x8b
+ && pbCode[ 2] == 0xc4
+ && pbCode[ 3] == 0xfa /* cli */
+ && pbCode[ 4] == 0x48 /* sub rsp, 10h */
+ && pbCode[ 5] == 0x83
+ && pbCode[ 6] == 0xec
+ && pbCode[ 7] == 0x10
+ && pbCode[ 8] == 0x50 /* push rax */
+ && pbCode[ 9] == 0x9c /* pushfq */
+ && pbCode[10] == 0x6a /* push 10 */
+ && pbCode[11] == 0x10
+ && pbCode[12] == 0x48 /* lea rax, [nt!KiServiceLinkage] */
+ && pbCode[13] == 0x8d
+ && pbCode[14] == 0x05
+ && pbCode[19] == 0x50 /* push rax */
+ && pbCode[20] == 0xb8 /* mov eax,1fh <- the syscall no. */
+ /*&& pbCode[21] == 0x1f*/
+ && pbCode[22] == 0x00
+ && pbCode[23] == 0x00
+ && pbCode[24] == 0x00
+ && pbCode[25] == 0xe9 /* jmp KiServiceInternal */
+ )
+ {
+ uint8_t const *pbKiServiceInternal = &pbCode[30] + *(int32_t const *)&pbCode[26];
+ uint8_t const *pbKiServiceLinkage = &pbCode[19] + *(int32_t const *)&pbCode[15];
+ if (*pbKiServiceLinkage == 0xc3)
+ {
+ g_pfnKiServiceInternal = (PFNRT)pbKiServiceInternal;
+ g_pfnKiServiceLinkage = (PFNRT)pbKiServiceLinkage;
+ switch (pbCode[21])
+ {
+ case 0x1e: g_pfnNtQueryVirtualMemory = (PFNNTQUERYVIRTUALMEMORY)supdrvNtQueryVirtualMemory_0x1F; break;
+ case 0x1f: g_pfnNtQueryVirtualMemory = (PFNNTQUERYVIRTUALMEMORY)supdrvNtQueryVirtualMemory_0x20; break;
+ case 0x20: g_pfnNtQueryVirtualMemory = (PFNNTQUERYVIRTUALMEMORY)supdrvNtQueryVirtualMemory_0x21; break;
+ case 0x21: g_pfnNtQueryVirtualMemory = (PFNNTQUERYVIRTUALMEMORY)supdrvNtQueryVirtualMemory_0x22; break;
+ case 0x22: g_pfnNtQueryVirtualMemory = (PFNNTQUERYVIRTUALMEMORY)supdrvNtQueryVirtualMemory_0x23; break;
+ }
+ }
+ }
+# endif
+ }
+ if (!g_pfnNtQueryVirtualMemory)
+ {
+ LogRel(("vboxdrv: Cannot locate ZwQueryVirtualMemory in ntoskrnl, nor were we able to cook up a replacement.\n"));
+ return STATUS_PROCEDURE_NOT_FOUND;
+ }
+
+
+ /* The spinlock protecting our structures. */
+ int rc = RTSpinlockCreate(&g_hNtProtectLock, RTSPINLOCK_FLAGS_INTERRUPT_UNSAFE, "NtProtectLock");
+ if (RT_FAILURE(rc))
+ return VBoxDrvNtErr2NtStatus(rc);
+ g_NtProtectTree = NULL;
+
+ /* Image stuff + certificates. */
+ NTSTATUS rcNt;
+ rc = supHardenedWinInitImageVerifier(NULL);
+ if (RT_SUCCESS(rc))
+ {
+ /*
+ * Intercept process creation and termination.
+ */
+ if (g_pfnPsSetCreateProcessNotifyRoutineEx)
+ rcNt = g_pfnPsSetCreateProcessNotifyRoutineEx(supdrvNtProtectCallback_ProcessCreateNotifyEx, FALSE /*fRemove*/);
+ else
+ rcNt = PsSetCreateProcessNotifyRoutine(supdrvNtProtectCallback_ProcessCreateNotify, FALSE /*fRemove*/);
+ if (NT_SUCCESS(rcNt))
+ {
+ /*
+ * Intercept process and thread handle creation calls.
+ * The preferred method is only available on Vista SP1+.
+ */
+ if (g_pfnObRegisterCallbacks && g_pfnObUnRegisterCallbacks)
+ {
+ static OB_OPERATION_REGISTRATION s_aObOperations[] =
+ {
+ {
+ PsProcessType,
+ OB_OPERATION_HANDLE_CREATE | OB_OPERATION_HANDLE_DUPLICATE,
+ supdrvNtProtectCallback_ProcessHandlePre,
+ supdrvNtProtectCallback_ProcessHandlePost,
+ },
+ {
+ PsThreadType,
+ OB_OPERATION_HANDLE_CREATE | OB_OPERATION_HANDLE_DUPLICATE,
+ supdrvNtProtectCallback_ThreadHandlePre,
+ supdrvNtProtectCallback_ThreadHandlePost,
+ },
+ };
+ static OB_CALLBACK_REGISTRATION s_ObCallbackReg =
+ {
+ /* .Version = */ OB_FLT_REGISTRATION_VERSION,
+ /* .OperationRegistrationCount = */ RT_ELEMENTS(s_aObOperations),
+ /* .Altitude.Length = */ 0,
+ /* .Altitude.MaximumLength = */ 0,
+ /* .Altitude.Buffer = */ NULL,
+ /* .RegistrationContext = */ NULL,
+ /* .OperationRegistration = */ &s_aObOperations[0]
+ };
+ static WCHAR const *s_apwszAltitudes[] = /** @todo get a valid number */
+ {
+ L"48596.98940", L"46935.19485", L"49739.39704", L"40334.74976",
+ L"66667.98940", L"69888.19485", L"69889.39704", L"60364.74976",
+ L"85780.98940", L"88978.19485", L"89939.39704", L"80320.74976",
+ L"329879.98940", L"326787.19485", L"328915.39704", L"320314.74976",
+ };
+
+ rcNt = STATUS_FLT_INSTANCE_ALTITUDE_COLLISION;
+ for (uint32_t i = 0; i < RT_ELEMENTS(s_apwszAltitudes) && rcNt == STATUS_FLT_INSTANCE_ALTITUDE_COLLISION; i++)
+ {
+ s_ObCallbackReg.Altitude.Buffer = (WCHAR *)s_apwszAltitudes[i];
+ s_ObCallbackReg.Altitude.Length = (uint16_t)RTUtf16Len(s_apwszAltitudes[i]) * sizeof(WCHAR);
+ s_ObCallbackReg.Altitude.MaximumLength = s_ObCallbackReg.Altitude.Length + sizeof(WCHAR);
+
+ rcNt = g_pfnObRegisterCallbacks(&s_ObCallbackReg, &g_pvObCallbacksCookie);
+ if (NT_SUCCESS(rcNt))
+ {
+ /*
+ * Happy ending.
+ */
+ return STATUS_SUCCESS;
+ }
+ }
+ LogRel(("vboxdrv: ObRegisterCallbacks failed with rcNt=%#x\n", rcNt));
+ g_pvObCallbacksCookie = NULL;
+ }
+ else
+ {
+ /*
+ * For the time being, we do not implement extra process
+ * protection on pre-Vista-SP1 systems as they are lacking
+ * necessary KPIs. XP is end of life, we do not wish to
+ * spend more time on it, so we don't put up a fuss there.
+ * Vista users without SP1 can install SP1 (or later), darn it,
+ * so refuse to load.
+ */
+ /** @todo Hack up an XP solution - will require hooking kernel APIs or doing bad
+ * stuff to a couple of object types. */
+# ifndef VBOX_WITH_VISTA_NO_SP
+ if (g_uNtVerCombined >= SUP_NT_VER_VISTA)
+# else
+ if (g_uNtVerCombined >= SUP_MAKE_NT_VER_COMBINED(6, 0, 6001, 0, 0))
+# endif
+ {
+ DbgPrint("vboxdrv: ObRegisterCallbacks was not found. Please make sure you got the latest updates and service packs installed\n");
+ rcNt = STATUS_SXS_VERSION_CONFLICT;
+ }
+ else
+ {
+ Log(("vboxdrv: ObRegisterCallbacks was not found; ignored pre-Vista\n"));
+ return rcNt = STATUS_SUCCESS;
+ }
+ g_pvObCallbacksCookie = NULL;
+ }
+
+ /*
+ * Drop process create/term notifications.
+ */
+ if (g_pfnPsSetCreateProcessNotifyRoutineEx)
+ g_pfnPsSetCreateProcessNotifyRoutineEx(supdrvNtProtectCallback_ProcessCreateNotifyEx, TRUE /*fRemove*/);
+ else
+ PsSetCreateProcessNotifyRoutine(supdrvNtProtectCallback_ProcessCreateNotify, TRUE /*fRemove*/);
+ }
+ else
+ LogRel(("vboxdrv: PsSetCreateProcessNotifyRoutine%s failed with rcNt=%#x\n",
+ g_pfnPsSetCreateProcessNotifyRoutineEx ? "Ex" : "", rcNt));
+ supHardenedWinTermImageVerifier();
+ }
+ else
+ rcNt = VBoxDrvNtErr2NtStatus(rc);
+
+ RTSpinlockDestroy(g_hNtProtectLock);
+ g_NtProtectTree = NIL_RTSPINLOCK;
+ return rcNt;
+}
+
+#endif /* VBOX_WITH_HARDENING */
+
diff --git a/src/VBox/HostDrivers/Support/win/SUPDrvA-win.asm b/src/VBox/HostDrivers/Support/win/SUPDrvA-win.asm
index 6c5412a5eb9..a6ae8d63482 100644
--- a/src/VBox/HostDrivers/Support/win/SUPDrvA-win.asm
+++ b/src/VBox/HostDrivers/Support/win/SUPDrvA-win.asm
@@ -4,7 +4,7 @@
;
;
-; Copyright (C) 2006-2010 Oracle Corporation
+; Copyright (C) 2006-2014 Oracle Corporation
;
; This file is part of VirtualBox Open Source Edition (OSE), as
; available from http://www.virtualbox.org. This file is free software;
@@ -44,3 +44,76 @@ BEGINPROC SUPR0Printf
ENDPROC SUPR0Printf
%endif
+
+%ifdef RT_ARCH_X86
+;
+; Faking up ZwQueryVirtualMemory on XP and W2K3 where it's not exported.
+; Using ZwQueryVolumeInformationFile as a helper.
+;
+extern IMPNAME(ZwQueryVolumeInformationFile@20)
+
+BEGINPROC supdrvNtQueryVirtualMemory_Xxx
+ %macro NtQueryVirtualMemorySyscall 1
+ GLOBALNAME supdrvNtQueryVirtualMemory_ %+ %1
+ mov eax, %1
+ jmp supdrvNtQueryVirtualMemory_Jump
+ %endm
+ NtQueryVirtualMemorySyscall 0xAF
+ NtQueryVirtualMemorySyscall 0xB0
+ NtQueryVirtualMemorySyscall 0xB1
+ NtQueryVirtualMemorySyscall 0xB2
+ NtQueryVirtualMemorySyscall 0xB3
+ NtQueryVirtualMemorySyscall 0xB4
+ NtQueryVirtualMemorySyscall 0xB5
+ NtQueryVirtualMemorySyscall 0xB6
+ NtQueryVirtualMemorySyscall 0xB7
+ NtQueryVirtualMemorySyscall 0xB8
+ NtQueryVirtualMemorySyscall 0xB9
+ NtQueryVirtualMemorySyscall 0xBA
+ NtQueryVirtualMemorySyscall 0xBB
+ NtQueryVirtualMemorySyscall 0xBC
+ NtQueryVirtualMemorySyscall 0xBD
+ NtQueryVirtualMemorySyscall 0xBE
+
+supdrvNtQueryVirtualMemory_Jump:
+ mov edx, IMP2(ZwQueryVolumeInformationFile@20)
+ lea edx, [edx + 5]
+ jmp edx
+ENDPROC supdrvNtQueryVirtualMemory_Xxx
+
+%endif
+
+%ifdef RT_ARCH_AMD64
+;
+; Faking up ZwQueryVirtualMemory on XP64 and W2K3-64 where it's not exported.
+; The C code locates and verifies the essentials in ZwRequestWaitReplyPort.
+;
+extern NAME(g_pfnKiServiceLinkage)
+extern NAME(g_pfnKiServiceInternal)
+BEGINPROC supdrvNtQueryVirtualMemory_Xxx
+ %macro NtQueryVirtualMemorySyscall 1
+ GLOBALNAME supdrvNtQueryVirtualMemory_ %+ %1
+ mov eax, %1
+ jmp supdrvNtQueryVirtualMemory_Jump
+ %endm
+
+ NtQueryVirtualMemorySyscall 0x1F
+ NtQueryVirtualMemorySyscall 0x20
+ NtQueryVirtualMemorySyscall 0x21
+ NtQueryVirtualMemorySyscall 0x22
+ NtQueryVirtualMemorySyscall 0x23
+
+supdrvNtQueryVirtualMemory_Jump:
+ cli
+ mov r10, rsp ; save call frame pointer.
+ mov r11, [NAME(g_pfnKiServiceLinkage) wrt rip]
+ push 0
+ push 0
+ push r10 ; call frame pointer (incoming rsp).
+ pushfq
+ push 10h
+ push r11 ; r11 = KiServiceLinkage (ret w/ unwind info)
+ jmp qword [NAME(g_pfnKiServiceInternal) wrt rip]
+ENDPROC supdrvNtQueryVirtualMemory_Xxx
+%endif
+
diff --git a/src/VBox/HostDrivers/Support/win/SUPHardenedVerify-win.h b/src/VBox/HostDrivers/Support/win/SUPHardenedVerify-win.h
new file mode 100644
index 00000000000..7ab444b49e2
--- /dev/null
+++ b/src/VBox/HostDrivers/Support/win/SUPHardenedVerify-win.h
@@ -0,0 +1,149 @@
+/* $Id$ */
+/** @file
+ * VirtualBox Support Library/Driver - Hardened Verification, Windows.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+#ifndef ___win_SUPHardenedVerify_win_h
+#define ___win_SUPHardenedVerify_win_h
+
+#include <iprt/types.h>
+#include <iprt/crypto/x509.h>
+
+RT_C_DECLS_BEGIN
+
+#ifndef SUP_CERTIFICATES_ONLY
+# ifdef RT_OS_WINDOWS
+DECLHIDDEN(int) supHardenedWinInitImageVerifier(PRTERRINFO pErrInfo);
+DECLHIDDEN(void) supHardenedWinTermImageVerifier(void);
+DECLHIDDEN(int) supHardenedWinVerifyProcess(HANDLE hProcess, HANDLE hThread, PRTERRINFO pErrInfo);
+
+DECLHIDDEN(int) supHardenedWinVerifyImageByHandle(HANDLE hFile, PCRTUTF16 pwszName, uint32_t fFlags, bool *pfCacheable, PRTERRINFO pErrInfo);
+DECLHIDDEN(int) supHardenedWinVerifyImageByHandleNoName(HANDLE hFile, uint32_t fFlags, PRTERRINFO pErrInfo);
+/** @name SUPHNTVI_F_XXX - Flags for supHardenedWinVerifyImageByHandle.
+ * @{ */
+/** The signing certificate must be the same as the one the VirtualBox build
+ * was signed with. */
+# define SUPHNTVI_F_REQUIRE_BUILD_CERT RT_BIT(0)
+/** Require kernel code signing level. */
+# define SUPHNTVI_F_REQUIRE_KERNEL_CODE_SIGNING RT_BIT(1)
+/** Require the image to force the memory mapper to do signature checking. */
+# define SUPHNTVI_F_REQUIRE_SIGNATURE_ENFORCEMENT RT_BIT(2)
+/** Whether to allow image verification by catalog file. */
+# define SUPHNTVI_F_ALLOW_CAT_FILE_VERIFICATION RT_BIT(3)
+/** Raw-mode context image, always 32-bit. */
+# define SUPHNTVI_F_RC_IMAGE RT_BIT(31)
+/** @} */
+
+/** Which directory under the system root to get. */
+typedef enum SUPHARDNTSYSROOTDIR
+{
+ kSupHardNtSysRootDir_System32 = 0,
+ kSupHardNtSysRootDir_WinSxS,
+} SUPHARDNTSYSROOTDIR;
+
+DECLHIDDEN(int) supHardNtGetSystemRootDir(void *pvBuf, uint32_t cbBuf, SUPHARDNTSYSROOTDIR enmDir, PRTERRINFO pErrInfo);
+
+# ifndef SUPHNTVI_NO_NT_STUFF
+
+/** Typical system root directory buffer. */
+typedef struct SUPSYSROOTDIRBUF
+{
+ UNICODE_STRING UniStr;
+ WCHAR awcBuffer[260];
+} SUPSYSROOTDIRBUF;
+extern SUPSYSROOTDIRBUF g_System32NtPath;
+extern SUPSYSROOTDIRBUF g_WinSxSNtPath;
+extern SUPSYSROOTDIRBUF g_SupLibHardenedExeNtPath;
+extern uint32_t g_offSupLibHardenedExeNtName;
+
+/** Pointer to NtQueryVirtualMemory. */
+typedef NTSTATUS (NTAPI *PFNNTQUERYVIRTUALMEMORY)(HANDLE, void const *, MEMORY_INFORMATION_CLASS, PVOID, SIZE_T, PSIZE_T);
+extern PFNNTQUERYVIRTUALMEMORY g_pfnNtQueryVirtualMemory;
+
+# endif /* SUPHNTVI_NO_NT_STUFF */
+
+/** Creates a combined NT version number for simple comparisons. */
+#define SUP_MAKE_NT_VER_COMBINED(a_uMajor, a_uMinor, a_uBuild, a_uSpMajor, a_uSpMinor) \
+ ( ((uint32_t)((a_uMajor) & UINT32_C(0xf)) << 28) \
+ | ((uint32_t)((a_uMinor) & UINT32_C(0xf)) << 24) \
+ | ((uint32_t)((a_uBuild) & UINT32_C(0xffff)) << 8) \
+ | ((uint32_t)((a_uSpMajor) & UINT32_C(0xf)) << 4) \
+ | RT_MIN((uint32_t)(a_uSpMinor), UINT32_C(0xf)) )
+/** Simple version of SUP_MAKE_NT_VER_COMBINED. */
+#define SUP_MAKE_NT_VER_SIMPLE(a_uMajor, a_uMinor) SUP_MAKE_NT_VER_COMBINED(a_uMajor, a_uMinor, 0, 0, 0)
+extern uint32_t g_uNtVerCombined;
+
+/** Combined NT version number for XP. */
+#define SUP_NT_VER_XP SUP_MAKE_NT_VER_SIMPLE(5,1)
+/** Combined NT version number for Vista. */
+#define SUP_NT_VER_VISTA SUP_MAKE_NT_VER_SIMPLE(6,0)
+/** Combined NT version number for Windows 7. */
+#define SUP_NT_VER_W70 SUP_MAKE_NT_VER_SIMPLE(6,1)
+/** Combined NT version number for Windows 8.0. */
+#define SUP_NT_VER_W80 SUP_MAKE_NT_VER_SIMPLE(6,2)
+/** Combined NT version number for Windows 8.1. */
+#define SUP_NT_VER_W81 SUP_MAKE_NT_VER_SIMPLE(6,3)
+
+# endif
+
+# ifndef IN_SUP_HARDENED_R3
+# include <iprt/mem.h>
+# include <iprt/string.h>
+
+# define suplibHardenedAllocZ RTMemAllocZ
+# define suplibHardenedReAlloc RTMemRealloc
+# define suplibHardenedFree RTMemFree
+# define suplibHardenedMemComp memcmp
+# define suplibHardenedMemCopy memcpy
+# define suplibHardenedMemSet memset
+# define suplibHardenedStrCopy strcpy
+# define suplibHardenedStrLen strlen
+# define suplibHardenedStrCat strcat
+# define suplibHardenedStrCmp strcmp
+# define suplibHardenedStrNCmp strncmp
+# define suplibHardenedStrICmp stricmp
+# else /* IN_SUP_HARDENED_R3 */
+# include <iprt/mem.h>
+#if 0
+# define memcmp suplibHardenedMemComp
+# define memcpy suplibHardenedMemCopy
+# define memset suplibHardenedMemSet
+# define strcpy suplibHardenedStrCopy
+# define strlen suplibHardenedStrLen
+# define strcat suplibHardenedStrCat
+# define strcmp suplibHardenedStrCmp
+# define strncmp suplibHardenedStrNCmp
+# define stricmp suplibHardenedStrICmp
+#endif
+DECLHIDDEN(void *) suplibHardenedAllocZ(size_t cb);
+DECLHIDDEN(void *) suplibHardenedReAlloc(void *pvOld, size_t cbNew);
+DECLHIDDEN(void) suplibHardenedFree(void *pv);
+# endif /* IN_SUP_HARDENED_R3 */
+
+#endif /* SUP_CERTIFICATES_ONLY */
+
+RT_C_DECLS_END
+
+#endif
+
diff --git a/src/VBox/HostDrivers/Support/win/SUPHardenedVerifyImage-win.cpp b/src/VBox/HostDrivers/Support/win/SUPHardenedVerifyImage-win.cpp
new file mode 100644
index 00000000000..a66839c4410
--- /dev/null
+++ b/src/VBox/HostDrivers/Support/win/SUPHardenedVerifyImage-win.cpp
@@ -0,0 +1,1873 @@
+/* $Id$ */
+/** @file
+ * VirtualBox Support Library/Driver - Hardened Image Verification, Windows.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#ifdef IN_RING0
+# define IPRT_NT_MAP_TO_ZW
+# include <iprt/nt/nt.h>
+# include <ntimage.h>
+#else
+# include <iprt/nt/nt-and-windows.h>
+# include "Wintrust.h"
+# include "Softpub.h"
+# include "mscat.h"
+# ifndef LOAD_LIBRARY_SEARCH_APPLICATION_DIR
+# define LOAD_LIBRARY_SEARCH_SYSTEM32 0x800
+# endif
+#endif
+
+#include <VBox/sup.h>
+#include <VBox/err.h>
+#include <iprt/ctype.h>
+#include <iprt/ldr.h>
+#include <iprt/log.h>
+#include <iprt/path.h>
+#include <iprt/string.h>
+#include <iprt/crypto/pkcs7.h>
+#include <iprt/crypto/store.h>
+
+#ifdef IN_RING0
+# include "SUPDrvInternal.h"
+#else
+# include "SUPLibInternal.h"
+#endif
+#include "win/SUPHardenedVerify-win.h"
+
+
+/*******************************************************************************
+* Defined Constants And Macros *
+*******************************************************************************/
+/** The size of static hash (output) buffers.
+ * Avoids dynamic allocations and cleanups for of small buffers as well as extra
+ * calls for getting the appropriate buffer size. The largest digest in regular
+ * use by current windows version is SHA-512, we double this and hope it's
+ * enough a good while. */
+#define SUPHARDNTVI_MAX_CAT_HASH_SIZE 128
+
+
+/*******************************************************************************
+* Structures and Typedefs *
+*******************************************************************************/
+/**
+ * SUP image verifier loader reader instance.
+ */
+typedef struct SUPHNTVIRDR
+{
+ /** The core reader structure. */
+ RTLDRREADER Core;
+ /** The file handle . */
+ HANDLE hFile;
+ /** Current file offset. */
+ RTFOFF off;
+ /** The file size. */
+ RTFOFF cbFile;
+ /** Flags for the verification callback, SUPHNTVI_F_XXX. */
+ uint32_t fFlags;
+ /** The executable timstamp in second since unix epoch. */
+ uint64_t uTimestamp;
+ /** Log name. */
+ char szFilename[1];
+} SUPHNTVIRDR;
+/** Pointer to an SUP image verifier loader reader instance. */
+typedef SUPHNTVIRDR *PSUPHNTVIRDR;
+
+
+#ifdef IN_RING3
+typedef LONG (WINAPI * PFNWINVERIFYTRUST)(HWND hwnd, GUID const *pgActionID, PVOID pWVTData);
+typedef BOOL (WINAPI * PFNCRYPTCATADMINACQUIRECONTEXT)(HCATADMIN *phCatAdmin, const GUID *pGuidSubsystem, DWORD dwFlags);
+typedef BOOL (WINAPI * PFNCRYPTCATADMINACQUIRECONTEXT2)(HCATADMIN *phCatAdmin, const GUID *pGuidSubsystem, PCWSTR pwszHashAlgorithm,
+ struct _CERT_STRONG_SIGN_PARA const *pStrongHashPolicy, DWORD dwFlags);
+typedef BOOL (WINAPI * PFNCRYPTCATADMINCALCHASHFROMFILEHANDLE)(HANDLE hFile, DWORD *pcbHash, BYTE *pbHash, DWORD dwFlags);
+typedef BOOL (WINAPI * PFNCRYPTCATADMINCALCHASHFROMFILEHANDLE2)(HCATADMIN hCatAdmin, HANDLE hFile, DWORD *pcbHash,
+ BYTE *pbHash, DWORD dwFlags);
+typedef HCATINFO (WINAPI *PFNCRYPTCATADMINENUMCATALOGFROMHASH)(HCATADMIN hCatAdmin, BYTE *pbHash, DWORD cbHash,
+ DWORD dwFlags, HCATINFO *phPrevCatInfo);
+typedef BOOL (WINAPI * PFNCRYPTCATADMINRELEASECATALOGCONTEXT)(HCATADMIN hCatAdmin, HCATINFO hCatInfo, DWORD dwFlags);
+typedef BOOL (WINAPI * PFNCRYPTCATDADMINRELEASECONTEXT)(HCATADMIN hCatAdmin, DWORD dwFlags);
+typedef BOOL (WINAPI * PFNCRYPTCATCATALOGINFOFROMCONTEXT)(HCATINFO hCatInfo, CATALOG_INFO *psCatInfo, DWORD dwFlags);
+
+typedef HCERTSTORE (WINAPI *PFNCERTOPENSTORE)(PCSTR pszStoreProvider, DWORD dwEncodingType, HCRYPTPROV_LEGACY hCryptProv,
+ DWORD dwFlags, const void *pvParam);
+typedef BOOL (WINAPI *PFNCERTCLOSESTORE)(HCERTSTORE hCertStore, DWORD dwFlags);
+typedef PCCERT_CONTEXT (WINAPI *PFNCERTENUMCERTIFICATESINSTORE)(HCERTSTORE hCertStore, PCCERT_CONTEXT pPrevCertContext);
+#endif
+
+
+/*******************************************************************************
+* Global Variables *
+*******************************************************************************/
+/** The build certificate. */
+static RTCRX509CERTIFICATE g_BuildX509Cert;
+
+/** Store for root software publisher certificates. */
+static RTCRSTORE g_hSpcRootStore = NIL_RTCRSTORE;
+/** Store for root NT kernel certificates. */
+static RTCRSTORE g_hNtKernelRootStore = NIL_RTCRSTORE;
+
+/** Store containing SPC, NT kernel signing, and timestamp root certificates. */
+static RTCRSTORE g_hSpcAndNtKernelRootStore = NIL_RTCRSTORE;
+/** Store for supplemental certificates for use with
+ * g_hSpcAndNtKernelRootStore. */
+static RTCRSTORE g_hSpcAndNtKernelSuppStore = NIL_RTCRSTORE;
+
+/** The full \\SystemRoot\\System32 path. */
+SUPSYSROOTDIRBUF g_System32NtPath;
+/** The full \\SystemRoot\\WinSxS path. */
+SUPSYSROOTDIRBUF g_WinSxSNtPath;
+
+/** Set after we've retrived other SPC root certificates from the system. */
+static bool g_fHaveOtherRoots = false;
+
+#if defined(IN_RING3) && !defined(IN_SUP_HARDENED_R3)
+/** Combined windows NT version number. See SUP_MAKE_NT_VER_COMBINED and
+ * SUP_MAKE_NT_VER_SIMPLE. */
+uint32_t g_uNtVerCombined;
+#endif
+
+#ifdef IN_RING3
+/** Pointer to WinVerifyTrust. */
+PFNWINVERIFYTRUST g_pfnWinVerifyTrust;
+/** Pointer to CryptCATAdminAcquireContext. */
+PFNCRYPTCATADMINACQUIRECONTEXT g_pfnCryptCATAdminAcquireContext;
+/** Pointer to CryptCATAdminAcquireContext2 if available. */
+PFNCRYPTCATADMINACQUIRECONTEXT2 g_pfnCryptCATAdminAcquireContext2;
+/** Pointer to CryptCATAdminCalcHashFromFileHandle. */
+PFNCRYPTCATADMINCALCHASHFROMFILEHANDLE g_pfnCryptCATAdminCalcHashFromFileHandle;
+/** Pointer to CryptCATAdminCalcHashFromFileHandle2. */
+PFNCRYPTCATADMINCALCHASHFROMFILEHANDLE2 g_pfnCryptCATAdminCalcHashFromFileHandle2;
+/** Pointer to CryptCATAdminEnumCatalogFromHash. */
+PFNCRYPTCATADMINENUMCATALOGFROMHASH g_pfnCryptCATAdminEnumCatalogFromHash;
+/** Pointer to CryptCATAdminReleaseCatalogContext. */
+PFNCRYPTCATADMINRELEASECATALOGCONTEXT g_pfnCryptCATAdminReleaseCatalogContext;
+/** Pointer to CryptCATAdminReleaseContext. */
+PFNCRYPTCATDADMINRELEASECONTEXT g_pfnCryptCATAdminReleaseContext;
+/** Pointer to CryptCATCatalogInfoFromContext. */
+PFNCRYPTCATCATALOGINFOFROMCONTEXT g_pfnCryptCATCatalogInfoFromContext;
+#endif
+
+
+/*******************************************************************************
+* Internal Functions *
+*******************************************************************************/
+#ifdef IN_RING3
+static int supR3HardNtViCallWinVerifyTrust(HANDLE hFile, PCRTUTF16 pwszName, uint32_t fFlags, PRTERRINFO pErrInfo,
+ PFNWINVERIFYTRUST pfnWinVerifyTrust);
+static int supR3HardNtViCallWinVerifyTrustCatFile(HANDLE hFile, PCRTUTF16 pwszName, uint32_t fFlags, PRTERRINFO pErrInfo,
+ PFNWINVERIFYTRUST pfnWinVerifyTrust);
+#endif
+
+
+
+
+/** @copydoc RTLDRREADER::pfnRead */
+static DECLCALLBACK(int) supHardNtViRdrRead(PRTLDRREADER pReader, void *pvBuf, size_t cb, RTFOFF off)
+{
+ PSUPHNTVIRDR pNtViRdr = (PSUPHNTVIRDR)pReader;
+ Assert(pNtViRdr->Core.uMagic == RTLDRREADER_MAGIC);
+
+ if ((ULONG)cb != cb)
+ return VERR_OUT_OF_RANGE;
+
+
+ /*
+ * For some reason I'm getting occational read error in an XP VM with
+ * STATUS_FAILED_DRIVER_ENTRY. Redoing the call again works in the
+ * debugger, so try do that automatically.
+ */
+ for (uint32_t iTry = 0;; iTry++)
+ {
+ LARGE_INTEGER offNt;
+ offNt.QuadPart = off;
+
+ IO_STATUS_BLOCK Ios = RTNT_IO_STATUS_BLOCK_INITIALIZER;
+ NTSTATUS rcNt = NtReadFile(pNtViRdr->hFile,
+ NULL /*hEvent*/,
+ NULL /*ApcRoutine*/,
+ NULL /*ApcContext*/,
+ &Ios,
+ pvBuf,
+ (ULONG)cb,
+ &offNt,
+ NULL);
+ if (NT_SUCCESS(rcNt))
+ rcNt = Ios.Status;
+ if (NT_SUCCESS(rcNt))
+ {
+ if (Ios.Information == cb)
+ {
+ pNtViRdr->off = off + cb;
+ return VINF_SUCCESS;
+ }
+#ifdef IN_RING3
+ supR3HardenedError(VERR_READ_ERROR, false,
+ "supHardNtViRdrRead: Only got %#zx bytes when requesting %#zx bytes at %#llx in '%s'.\n",
+ Ios.Information, off, cb, pNtViRdr->szFilename);
+#endif
+ pNtViRdr->off = -1;
+ return VERR_READ_ERROR;
+ }
+
+ /*
+ * Delay a little before we retry?
+ */
+#ifdef IN_RING3
+ if (iTry == 0)
+ NtYieldExecution();
+ else if (iTry >= 1)
+ {
+ LARGE_INTEGER Time;
+ Time.QuadPart = -1000000 / 100; /* 1ms in 100ns units, relative time. */
+ NtDelayExecution(TRUE, &Time);
+ }
+#endif
+ /*
+ * Before we give up, we'll try split up the request in case the
+ * kernel is low on memory or similar. For simplicity reasons, we do
+ * this in a recursion fashion.
+ */
+ if (iTry >= 2)
+ {
+ if (cb >= _8K)
+ {
+ size_t const cbBlock = RT_ALIGN_Z(cb / 4, 512);
+ while (cb > 0)
+ {
+ size_t cbThisRead = RT_MIN(cb, cbBlock);
+ int rc = supHardNtViRdrRead(&pNtViRdr->Core, pvBuf, cbThisRead, off);
+ if (RT_FAILURE(rc))
+ return rc;
+ off += cbThisRead;
+ cb -= cbThisRead;
+ pvBuf = (uint8_t *)pvBuf + cbThisRead;
+ }
+ return VINF_SUCCESS;
+ }
+
+#ifdef IN_RING3
+ supR3HardenedError(VERR_READ_ERROR, false, "supHardNtViRdrRead: Error %#x reading %#zx bytes at %#llx in '%s'.\n",
+ rcNt, off, cb, pNtViRdr->szFilename);
+#endif
+ pNtViRdr->off = -1;
+ return VERR_READ_ERROR;
+ }
+ }
+}
+
+
+/** @copydoc RTLDRREADER::pfnTell */
+static DECLCALLBACK(RTFOFF) supHardNtViRdrTell(PRTLDRREADER pReader)
+{
+ PSUPHNTVIRDR pNtViRdr = (PSUPHNTVIRDR)pReader;
+ Assert(pNtViRdr->Core.uMagic == RTLDRREADER_MAGIC);
+ return pNtViRdr->off;
+}
+
+
+/** @copydoc RTLDRREADER::pfnSize */
+static DECLCALLBACK(RTFOFF) supHardNtViRdrSize(PRTLDRREADER pReader)
+{
+ PSUPHNTVIRDR pNtViRdr = (PSUPHNTVIRDR)pReader;
+ Assert(pNtViRdr->Core.uMagic == RTLDRREADER_MAGIC);
+ return pNtViRdr->cbFile;
+}
+
+
+/** @copydoc RTLDRREADER::pfnLogName */
+static DECLCALLBACK(const char *) supHardNtViRdrLogName(PRTLDRREADER pReader)
+{
+ PSUPHNTVIRDR pNtViRdr = (PSUPHNTVIRDR)pReader;
+ return pNtViRdr->szFilename;
+}
+
+
+/** @copydoc RTLDRREADER::pfnMap */
+static DECLCALLBACK(int) supHardNtViRdrMap(PRTLDRREADER pReader, const void **ppvBits)
+{
+ return VERR_NOT_SUPPORTED;
+}
+
+
+/** @copydoc RTLDRREADER::pfnUnmap */
+static DECLCALLBACK(int) supHardNtViRdrUnmap(PRTLDRREADER pReader, const void *pvBits)
+{
+ return VERR_NOT_SUPPORTED;
+}
+
+
+/** @copydoc RTLDRREADER::pfnDestroy */
+static DECLCALLBACK(int) supHardNtViRdrDestroy(PRTLDRREADER pReader)
+{
+ PSUPHNTVIRDR pNtViRdr = (PSUPHNTVIRDR)pReader;
+ Assert(pNtViRdr->Core.uMagic == RTLDRREADER_MAGIC);
+
+ pNtViRdr->Core.uMagic = ~RTLDRREADER_MAGIC;
+ pNtViRdr->hFile = NULL;
+
+ RTMemFree(pNtViRdr);
+ return VINF_SUCCESS;
+}
+
+
+/**
+ * Creates a loader reader instance for the given NT file handle.
+ *
+ * @returns iprt status code.
+ * @param hFile Native NT file handle.
+ * @param pwszName Optional file name.
+ * @param fFlags Flags, SUPHNTVI_F_XXX.
+ * @param ppNtViRdr Where to store the reader instance on success.
+ */
+static int supHardNtViRdrCreate(HANDLE hFile, PCRTUTF16 pwszName, uint32_t fFlags, PSUPHNTVIRDR *ppNtViRdr)
+{
+ /*
+ * Try determine the size of the file.
+ */
+ IO_STATUS_BLOCK Ios = RTNT_IO_STATUS_BLOCK_INITIALIZER;
+ FILE_STANDARD_INFORMATION StdInfo;
+ NTSTATUS rcNt = NtQueryInformationFile(hFile, &Ios, &StdInfo, sizeof(StdInfo), FileStandardInformation);
+ if (!NT_SUCCESS(rcNt) || !NT_SUCCESS(Ios.Status))
+ return VERR_LDRVI_FILE_LENGTH_ERROR;
+
+ /*
+ * Calc the file name length and allocate memory for the reader instance.
+ */
+ size_t cchFilename = 0;
+ if (pwszName)
+ cchFilename = RTUtf16CalcUtf8Len(pwszName);
+
+ int rc = VERR_NO_MEMORY;
+ PSUPHNTVIRDR pNtViRdr = (PSUPHNTVIRDR)RTMemAllocZ(sizeof(*pNtViRdr) + cchFilename);
+ if (!pNtViRdr)
+ return VERR_NO_MEMORY;
+
+ /*
+ * Initialize the structure.
+ */
+ if (cchFilename)
+ {
+ char *pszName = &pNtViRdr->szFilename[0];
+ rc = RTUtf16ToUtf8Ex(pwszName, RTSTR_MAX, &pszName, cchFilename + 1, NULL);
+ AssertStmt(RT_SUCCESS(rc), pNtViRdr->szFilename[0] = '\0');
+ }
+ else
+ pNtViRdr->szFilename[0] = '\0';
+
+ pNtViRdr->Core.uMagic = RTLDRREADER_MAGIC;
+ pNtViRdr->Core.pfnRead = supHardNtViRdrRead;
+ pNtViRdr->Core.pfnTell = supHardNtViRdrTell;
+ pNtViRdr->Core.pfnSize = supHardNtViRdrSize;
+ pNtViRdr->Core.pfnLogName = supHardNtViRdrLogName;
+ pNtViRdr->Core.pfnMap = supHardNtViRdrMap;
+ pNtViRdr->Core.pfnUnmap = supHardNtViRdrUnmap;
+ pNtViRdr->Core.pfnDestroy = supHardNtViRdrDestroy;
+ pNtViRdr->hFile = hFile;
+ pNtViRdr->off = 0;
+ pNtViRdr->cbFile = StdInfo.EndOfFile.QuadPart;
+ pNtViRdr->fFlags = fFlags;
+ *ppNtViRdr = pNtViRdr;
+ return VINF_SUCCESS;
+}
+
+
+/**
+ * Simple case insensitive UTF-16 / ASCII path compare.
+ *
+ * @returns true if equal, false if not.
+ * @param pwszLeft The UTF-16 path string.
+ * @param pszRight The ascii string.
+ */
+static bool supHardViUtf16PathIsEqual(PCRTUTF16 pwszLeft, const char *pszRight)
+{
+ for (;;)
+ {
+ RTUTF16 wc = *pwszLeft++;
+ uint8_t b = *pszRight++;
+ if (b != wc)
+ {
+ if (wc >= 0x80)
+ return false;
+ wc = RT_C_TO_LOWER(wc);
+ if (wc != b)
+ {
+ b = RT_C_TO_LOWER(b);
+ if (wc != b)
+ {
+ if (wc == '/')
+ wc = '\\';
+ if (b == '/')
+ b = '\\';
+ if (wc != b)
+ return false;
+ }
+ }
+ }
+ if (!b)
+ return true;
+ }
+}
+
+
+/**
+ * Simple case insensitive UTF-16 / ASCII ends-with path predicate.
+ *
+ * @returns true if equal, false if not.
+ * @param pwsz The UTF-16 path string.
+ * @param pszSuffix The ascii suffix string.
+ */
+static bool supHardViUtf16PathEndsWith(PCRTUTF16 pwsz, const char *pszSuffix)
+{
+ size_t cwc = RTUtf16Len(pwsz);
+ size_t cchSuffix = strlen(pszSuffix);
+ if (cwc >= cchSuffix)
+ return supHardViUtf16PathIsEqual(pwsz + cwc - cchSuffix, pszSuffix);
+ return false;
+}
+
+
+/**
+ * Simple case insensitive UTF-16 / ASCII starts-with path predicate.
+ *
+ * @returns true if starts with given string, false if not.
+ * @param pwsz The UTF-16 path string.
+ * @param pszPrefix The ascii prefix string.
+ */
+static bool supHardViUtf16PathStartsWith(PCRTUTF16 pwszLeft, const char *pszRight)
+{
+ for (;;)
+ {
+ RTUTF16 wc = *pwszLeft++;
+ uint8_t b = *pszRight++;
+ if (b != wc)
+ {
+ if (!b)
+ return true;
+ if (wc >= 0x80 || wc == 0)
+ return false;
+ wc = RT_C_TO_LOWER(wc);
+ if (wc != b)
+ {
+ b = RT_C_TO_LOWER(b);
+ if (wc != b)
+ {
+ if (wc == '/')
+ wc = '\\';
+ if (b == '/')
+ b = '\\';
+ if (wc != b)
+ return false;
+ }
+ }
+ }
+ }
+}
+
+
+/**
+ * Counts slashes in the given UTF-8 path string.
+ *
+ * @returns Number of slashes.
+ * @param pwsz The UTF-16 path string.
+ */
+static uint32_t supHardViUtf16PathCountSlashes(PCRTUTF16 pwsz)
+{
+ uint32_t cSlashes = 0;
+ RTUTF16 wc;
+ while ((wc = *pwsz++) != '\0')
+ if (wc == '/' || wc == '\\')
+ cSlashes++;
+ return cSlashes;
+}
+
+
+/**
+ * Checks if the unsigned DLL is fine or not.
+ *
+ * @returns VINF_LDRVI_NOT_SIGNED or @a rc.
+ * @param hLdrMod The loader module handle.
+ * @param pwszName The NT name of the DLL/EXE.
+ * @param fFlags Flags.
+ * @param rc The status code..
+ */
+static int supHardNtViCheckIfNotSignedOk(RTLDRMOD hLdrMod, PCRTUTF16 pwszName, uint32_t fFlags, int rc)
+{
+ if (fFlags & (SUPHNTVI_F_REQUIRE_BUILD_CERT | SUPHNTVI_F_REQUIRE_KERNEL_CODE_SIGNING))
+ return rc;
+
+ /*
+ * Version macros.
+ */
+ uint32_t const uNtVer = g_uNtVerCombined;
+#define IS_XP() ( uNtVer >= SUP_MAKE_NT_VER_SIMPLE(5, 1) && uNtVer < SUP_MAKE_NT_VER_SIMPLE(5, 2) )
+#define IS_W2K3() ( uNtVer >= SUP_MAKE_NT_VER_SIMPLE(5, 2) && uNtVer < SUP_MAKE_NT_VER_SIMPLE(5, 3) )
+#define IS_VISTA() ( uNtVer >= SUP_MAKE_NT_VER_SIMPLE(6, 0) && uNtVer < SUP_MAKE_NT_VER_SIMPLE(6, 1) )
+#define IS_W70() ( uNtVer >= SUP_MAKE_NT_VER_SIMPLE(6, 1) && uNtVer < SUP_MAKE_NT_VER_SIMPLE(6, 2) )
+#define IS_W80() ( uNtVer >= SUP_MAKE_NT_VER_SIMPLE(6, 2) && uNtVer < SUP_MAKE_NT_VER_SIMPLE(6, 3) )
+#define IS_W81() ( uNtVer >= SUP_MAKE_NT_VER_SIMPLE(6, 3) && uNtVer < SUP_MAKE_NT_VER_SIMPLE(6, 4) )
+
+ /*
+ * The System32 directory.
+ *
+ * System32 is full of unsigned DLLs shipped by microsoft, graphics
+ * hardware vendors, input device/method vendors and whatnot else that
+ * actually needs to be loaded into a process for it to work correctly.
+ * We have to ASSUME that anything our process attempts to load from
+ * System32 is trustworthy and that the Windows system with the help of
+ * anti-virus software make sure there is nothing evil lurking in System32
+ * or being loaded from it.
+ *
+ * A small measure of protection is to list DLLs we know should be signed
+ * and decline loading unsigned versions of them, assuming they have been
+ * replaced by an adversary with evil intentions.
+ */
+ PCRTUTF16 pwsz;
+ uint32_t cwcName = (uint32_t)RTUtf16Len(pwszName);
+ uint32_t cwcOther = g_System32NtPath.UniStr.Length / sizeof(WCHAR);
+ if ( cwcName > cwcOther
+ && RTPATH_IS_SLASH(pwszName[cwcOther])
+ && memcmp(pwszName, g_System32NtPath.UniStr.Buffer, g_System32NtPath.UniStr.Length) == 0)
+ {
+ pwsz = pwszName + cwcOther + 1;
+
+ /* Core DLLs. */
+ if (supHardViUtf16PathIsEqual(pwsz, "ntdll.dll"))
+ return uNtVer < SUP_NT_VER_VISTA ? VINF_LDRVI_NOT_SIGNED : rc;
+ if (supHardViUtf16PathIsEqual(pwsz, "kernel32.dll"))
+ return uNtVer < SUP_NT_VER_W81 ? VINF_LDRVI_NOT_SIGNED : rc;
+ if (supHardViUtf16PathIsEqual(pwsz, "kernelbase.dll"))
+ return IS_W80() || IS_W70() ? VINF_LDRVI_NOT_SIGNED : rc;
+ if (supHardViUtf16PathIsEqual(pwsz, "apisetschema.dll"))
+ return IS_W70() ? VINF_LDRVI_NOT_SIGNED : rc;
+ if (supHardViUtf16PathIsEqual(pwsz, "apphelp.dll"))
+ return uNtVer < SUP_MAKE_NT_VER_SIMPLE(6, 4) ? VINF_LDRVI_NOT_SIGNED : rc;
+
+#ifndef IN_RING0
+ /* The ATI drivers load system drivers into the process, allow this,
+ but reject anything else from a subdirectory. */
+ uint32_t cSlashes = supHardViUtf16PathCountSlashes(pwsz);
+ if (cSlashes > 0)
+ {
+ if ( cSlashes == 1
+ && supHardViUtf16PathStartsWith(pwsz, "drivers\\ati")
+ && ( supHardViUtf16PathEndsWith(pwsz, ".sys")
+ || supHardViUtf16PathEndsWith(pwsz, ".dll") ) )
+ return VINF_LDRVI_NOT_SIGNED;
+ return rc;
+ }
+
+ /* Check that this DLL isn't supposed to be signed on this windows
+ version. If it should, it's likely to be a fake. */
+ /** @todo list of signed dlls for various windows versions. */
+
+ /** @todo check file permissions? TrustedInstaller is supposed to be involved
+ * with all of them. */
+ return VINF_LDRVI_NOT_SIGNED;
+#else
+ return rc;
+#endif
+ }
+
+#ifndef IN_RING0
+ /*
+ * The WinSxS white list.
+ *
+ * Just like with System32 there are potentially a number of DLLs that
+ * could be required from WinSxS. However, so far only comctl32.dll
+ * variations have been required. So, we limit ourselves to explicit
+ * whitelisting of unsigned families of DLLs.
+ */
+ cwcOther = g_WinSxSNtPath.UniStr.Length / sizeof(WCHAR);
+ if ( cwcName > cwcOther
+ && RTPATH_IS_SLASH(pwszName[cwcOther])
+ && memcmp(pwszName, g_WinSxSNtPath.UniStr.Buffer, g_WinSxSNtPath.UniStr.Length) == 0)
+ {
+ pwsz = pwszName + cwcOther + 1;
+ cwcName -= cwcOther + 1;
+
+ /* The WinSxS layout means everything worth loading is exactly one level down. */
+ uint32_t cSlashes = supHardViUtf16PathCountSlashes(pwsz);
+ if (cSlashes != 1)
+ return rc;
+
+# if 0 /* See below */
+ /* The common controls mess. */
+# ifdef RT_ARCH_AMD64
+ if (supHardViUtf16PathStartsWith(pwsz, "amd64_microsoft.windows.common-controls_"))
+# elif defined(RT_ARCH_X86)
+ if (supHardViUtf16PathStartsWith(pwsz, "x86_microsoft.windows.common-controls_"))
+# else
+# error "Unsupported architecture"
+# endif
+ {
+ if (supHardViUtf16PathEndsWith(pwsz, "\\comctl32.dll"))
+ return VINF_LDRVI_NOT_SIGNED;
+ }
+# endif
+
+ /* Allow anything slightly microsoftish from WinSxS. W2K3 wanted winhttp.dll early on... */
+# ifdef RT_ARCH_AMD64
+ if (supHardViUtf16PathStartsWith(pwsz, "amd64_microsoft."))
+# elif defined(RT_ARCH_X86)
+ if (supHardViUtf16PathStartsWith(pwsz, "x86_microsoft."))
+# else
+# error "Unsupported architecture"
+# endif
+ {
+ return VINF_LDRVI_NOT_SIGNED;
+ }
+
+ return rc;
+ }
+#endif
+
+ return rc;
+}
+
+
+/**
+ * @callback_method_impl{RTCRPKCS7VERIFYCERTCALLBACK,
+ * Standard code signing. Use this for Microsoft SPC.}
+ */
+static DECLCALLBACK(int) supHardNtViCertVerifyCallback(PCRTCRX509CERTIFICATE pCert, RTCRX509CERTPATHS hCertPaths,
+ void *pvUser, PRTERRINFO pErrInfo)
+{
+ PSUPHNTVIRDR pNtViRdr = (PSUPHNTVIRDR)pvUser;
+ Assert(pNtViRdr->Core.uMagic == RTLDRREADER_MAGIC);
+
+ /*
+ * If there is no certificate path build & validator associated with this
+ * callback, it must be because of the build certificate. We trust the
+ * build certificate without any second thoughts.
+ */
+ if (hCertPaths == NIL_RTCRX509CERTPATHS)
+ {
+ if (RTCrX509Certificate_Compare(pCert, &g_BuildX509Cert) == 0) /* healthy paranoia */
+ return VINF_SUCCESS;
+ return RTErrInfoSetF(pErrInfo, VERR_SUP_VP_NOT_BUILD_CERT_IPE, "Not valid kernel code signature.");
+ }
+
+ /*
+ * Standard code signing capabilites required.
+ */
+ int rc = RTCrPkcs7VerifyCertCallbackCodeSigning(pCert, hCertPaths, NULL, pErrInfo);
+ if (RT_SUCCESS(rc))
+ {
+ /*
+ * If kernel signing, a valid certificate path must be anchored by the
+ * microsoft kernel signing root certificate.
+ */
+ if (pNtViRdr->fFlags & SUPHNTVI_F_REQUIRE_KERNEL_CODE_SIGNING)
+ {
+ uint32_t cPaths = RTCrX509CertPathsGetPathCount(hCertPaths);
+ uint32_t cFound = 0;
+ uint32_t cValid = 0;
+ for (uint32_t iPath = 0; iPath < cPaths; iPath++)
+ {
+ bool fTrusted;
+ PCRTCRX509NAME pSubject;
+ PCRTCRX509SUBJECTPUBLICKEYINFO pPublicKeyInfo;
+ int rcVerify;
+ rc = RTCrX509CertPathsQueryPathInfo(hCertPaths, iPath, &fTrusted, NULL /*pcNodes*/, &pSubject, &pPublicKeyInfo,
+ NULL, NULL /*pCertCtx*/, &rcVerify);
+ AssertRCBreak(rc);
+
+ if (RT_SUCCESS(rcVerify))
+ {
+ Assert(fTrusted);
+ cValid++;
+
+ /*
+ * Search the kernel signing root store for a matching anchor.
+ */
+ RTCRSTORECERTSEARCH Search;
+ rc = RTCrStoreCertFindBySubjectOrAltSubjectByRfc5280(g_hNtKernelRootStore, pSubject, &Search);
+ AssertRCBreak(rc);
+
+ PCRTCRCERTCTX pCertCtx;
+ while ((pCertCtx = RTCrStoreCertSearchNext(g_hNtKernelRootStore, &Search)) != NULL)
+ {
+ if (RTCrX509SubjectPublicKeyInfo_Compare(&pCertCtx->pCert->TbsCertificate.SubjectPublicKeyInfo,
+ pPublicKeyInfo) == 0)
+ cFound++;
+ RTCrCertCtxRelease(pCertCtx);
+ }
+
+ int rc2 = RTCrStoreCertSearchDestroy(g_hNtKernelRootStore, &Search); AssertRC(rc2);
+ }
+ }
+ if (RT_SUCCESS(rc) && cFound == 0)
+ rc = RTErrInfoSetF(pErrInfo, VERR_SUP_VP_NOT_VALID_KERNEL_CODE_SIGNATURE, "Not valid kernel code signature.");
+ if (RT_SUCCESS(rc) && cValid != 2 && g_fHaveOtherRoots)
+ rc = RTErrInfoSetF(pErrInfo, VERR_SUP_VP_UNEXPECTED_VALID_PATH_COUNT,
+ "Expected exactly %u valid paths, not %u.", 2, cValid);
+ }
+ }
+
+ /*
+ * More requirements? NT5 build lab?
+ */
+
+ return rc;
+}
+
+
+static DECLCALLBACK(int) supHardNtViCallback(RTLDRMOD hLdrMod, RTLDRSIGNATURETYPE enmSignature,
+ void const *pvSignature, size_t cbSignature,
+ PRTERRINFO pErrInfo, void *pvUser)
+{
+ /*
+ * Check out the input.
+ */
+ PSUPHNTVIRDR pNtViRdr = (PSUPHNTVIRDR)pvUser;
+ Assert(pNtViRdr->Core.uMagic == RTLDRREADER_MAGIC);
+
+ AssertReturn(cbSignature == sizeof(RTCRPKCS7CONTENTINFO), VERR_INTERNAL_ERROR_5);
+ PCRTCRPKCS7CONTENTINFO pContentInfo = (PCRTCRPKCS7CONTENTINFO)pvSignature;
+ AssertReturn(RTCrPkcs7ContentInfo_IsSignedData(pContentInfo), VERR_INTERNAL_ERROR_5);
+ AssertReturn(pContentInfo->u.pSignedData->SignerInfos.cItems == 1, VERR_INTERNAL_ERROR_5);
+ PCRTCRPKCS7SIGNERINFO pSignerInfo = &pContentInfo->u.pSignedData->SignerInfos.paItems[0];
+
+ /*
+ * If special certificate requirements, check them out before validating
+ * the signature.
+ */
+ if (pNtViRdr->fFlags & SUPHNTVI_F_REQUIRE_BUILD_CERT)
+ {
+ if (!RTCrX509Certificate_MatchIssuerAndSerialNumber(&g_BuildX509Cert,
+ &pSignerInfo->IssuerAndSerialNumber.Name,
+ &pSignerInfo->IssuerAndSerialNumber.SerialNumber))
+ return RTErrInfoSet(pErrInfo, VERR_SUP_VP_NOT_SIGNED_WITH_BUILD_CERT, "Not signed with the build certificate.");
+ }
+
+ /*
+ * Verify the signature.
+ */
+ RTTIMESPEC ValidationTime;
+ RTTimeSpecSetSeconds(&ValidationTime, pNtViRdr->uTimestamp);
+
+ return RTCrPkcs7VerifySignedData(pContentInfo, 0, g_hSpcAndNtKernelSuppStore, g_hSpcAndNtKernelRootStore, &ValidationTime,
+ supHardNtViCertVerifyCallback, pNtViRdr, pErrInfo);
+}
+
+
+/**
+ * Checks if it's safe to call WinVerifyTrust or whether we might end up in an
+ * infinite recursion.
+ *
+ * @returns true if ok, false if not.
+ * @param hFile The file name.
+ * @param pwszName The executable name.
+ */
+static bool supR3HardNtViCanCallWinVerifyTrust(HANDLE hFile, PCRTUTF16 pwszName)
+{
+ /*
+ * Recursion preventions hacks:
+ * - Don't try call WinVerifyTrust on Wintrust.dll when called from the
+ * create section hook. CRYPT32.DLL tries to load WinTrust.DLL in some cases.
+ */
+ size_t cwcName = RTUtf16Len(pwszName);
+ if ( hFile != NULL
+ && cwcName > g_System32NtPath.UniStr.Length / sizeof(WCHAR)
+ && !memcmp(pwszName, g_System32NtPath.UniStr.Buffer, g_System32NtPath.UniStr.Length)
+ && supHardViUtf16PathIsEqual(&pwszName[g_System32NtPath.UniStr.Length / sizeof(WCHAR)], "\\wintrust.dll"))
+ return false;
+
+ return true;
+}
+
+
+/**
+ * Verifies the given executable image.
+ *
+ * @returns IPRT status code.
+ * @param hFile File handle to the executable file.
+ * @param pwszName Full NT path to the DLL in question, used for dealing
+ * with unsigned system dlls as well as for error/logging.
+ * @param fFlags Flags, SUPHNTVI_F_XXX.
+ * @param pfCacheable Where to return whether the result can be cached. A
+ * valid value is always returned. Optional.
+ * @param pErrInfo Pointer to error info structure. Optional.
+ */
+DECLHIDDEN(int) supHardenedWinVerifyImageByHandle(HANDLE hFile, PCRTUTF16 pwszName, uint32_t fFlags,
+ bool *pfCacheable, PRTERRINFO pErrInfo)
+{
+ /* Clear the cacheable indicator as it needs to be valid in all return paths. */
+ if (pfCacheable)
+ *pfCacheable = false;
+
+ /*
+ * Create a reader instance.
+ */
+ PSUPHNTVIRDR pNtViRdr;
+ int rc = supHardNtViRdrCreate(hFile, pwszName, fFlags, &pNtViRdr);
+ if (RT_SUCCESS(rc))
+ {
+ /*
+ * Open the image.
+ */
+ RTLDRMOD hLdrMod;
+ rc = RTLdrOpenWithReader(&pNtViRdr->Core, RTLDR_O_FOR_VALIDATION,
+ fFlags & SUPHNTVI_F_RC_IMAGE ? RTLDRARCH_X86_32 : RTLDRARCH_HOST,
+ &hLdrMod, pErrInfo);
+ if (RT_SUCCESS(rc))
+ {
+ /*
+ * Verify it.
+ *
+ * The PKCS #7 SignedData signature is checked in the callback. Any
+ * signing certificate restrictions are also enforced there.
+ *
+ * For the time being, we use the executable timestamp as the
+ * certificate validation date. We must query that first to avoid
+ * potential issues re-entering the loader code from the callback.
+ */
+ rc = RTLdrQueryProp(hLdrMod, RTLDRPROP_TIMESTAMP_SECONDS, &pNtViRdr->uTimestamp, sizeof(pNtViRdr->uTimestamp));
+ if (RT_SUCCESS(rc))
+ {
+ rc = RTLdrVerifySignature(hLdrMod, supHardNtViCallback, pNtViRdr, pErrInfo);
+
+ /*
+ * Microsoft doesn't sign a whole bunch of DLLs, so we have to
+ * ASSUME that a bunch of system DLLs are fine.
+ */
+ if (rc == VERR_LDRVI_NOT_SIGNED)
+ rc = supHardNtViCheckIfNotSignedOk(hLdrMod, pwszName, fFlags, rc);
+ if (RT_FAILURE(rc))
+ RTErrInfoAddF(pErrInfo, rc, ": %ls", pwszName);
+
+ /*
+ * Check for the signature checking enforcement, if requested to do so.
+ */
+ if (RT_SUCCESS(rc) && (fFlags & SUPHNTVI_F_REQUIRE_SIGNATURE_ENFORCEMENT))
+ {
+ bool fEnforced = false;
+ int rc2 = RTLdrQueryProp(hLdrMod, RTLDRPROP_SIGNATURE_CHECKS_ENFORCED, &fEnforced, sizeof(fEnforced));
+ if (RT_FAILURE(rc2))
+ rc = RTErrInfoSetF(pErrInfo, rc2, "Querying RTLDRPROP_SIGNATURE_CHECKS_ENFORCED failed on %ls: %Rrc.",
+ pwszName, rc2);
+ else if (!fEnforced)
+ rc = RTErrInfoSetF(pErrInfo, VERR_SUP_VP_SIGNATURE_CHECKS_NOT_ENFORCED,
+ "The image '%ls' was not linked with /IntegrityCheck.", pwszName);
+ }
+ }
+ else
+ RTErrInfoSetF(pErrInfo, rc, "RTLdrQueryProp/RTLDRPROP_TIMESTAMP_SECONDS failed on %ls: %Rrc", pwszName, rc);
+
+ int rc2 = RTLdrClose(hLdrMod); AssertRC(rc2);
+
+#ifdef IN_RING3
+ /*
+ * Call the windows verify trust API if we've resolved it.
+ */
+ if ( g_pfnWinVerifyTrust
+ && supR3HardNtViCanCallWinVerifyTrust(hFile, pwszName))
+ {
+ if (pfCacheable)
+ *pfCacheable = g_pfnWinVerifyTrust != NULL;
+ if (rc != VERR_LDRVI_NOT_SIGNED)
+ {
+ if (rc == VINF_LDRVI_NOT_SIGNED)
+ {
+ if (fFlags & SUPHNTVI_F_ALLOW_CAT_FILE_VERIFICATION)
+ {
+ int rc2 = supR3HardNtViCallWinVerifyTrustCatFile(hFile, pwszName, fFlags, pErrInfo,
+ g_pfnWinVerifyTrust);
+ SUP_DPRINTF(("supR3HardNtViCallWinVerifyTrustCatFile -> %d (org %d)\n", rc2, rc));
+ rc = rc2;
+ }
+ else
+ {
+ AssertFailed();
+ rc = VERR_LDRVI_NOT_SIGNED;
+ }
+ }
+ else if (RT_SUCCESS(rc))
+ rc = supR3HardNtViCallWinVerifyTrust(hFile, pwszName, fFlags, pErrInfo, g_pfnWinVerifyTrust);
+ else
+ {
+ int rc2 = supR3HardNtViCallWinVerifyTrust(hFile, pwszName, fFlags, pErrInfo, g_pfnWinVerifyTrust);
+ AssertMsg(RT_FAILURE_NP(rc2),
+ ("rc=%Rrc, rc2=%Rrc %s", rc, rc2, pErrInfo ? pErrInfo->pszMsg : "<no-err-info>"));
+ }
+ }
+ }
+#else
+ if (pfCacheable)
+ *pfCacheable = true;
+#endif /* IN_RING3 */
+ }
+ else
+ supHardNtViRdrDestroy(&pNtViRdr->Core);
+ }
+ SUP_DPRINTF(("supHardenedWinVerifyImageByHandle: -> %d (%ls)\n", rc, pwszName));
+ return rc;
+}
+
+
+#ifdef IN_RING3
+/**
+ * supHardenedWinVerifyImageByHandle version without the name.
+ *
+ * The name is derived from the handle.
+ *
+ * @returns IPRT status code.
+ * @param hFile File handle to the executable file.
+ * @param fFlags Flags, SUPHNTVI_F_XXX.
+ * @param pErrInfo Pointer to error info structure. Optional.
+ */
+DECLHIDDEN(int) supHardenedWinVerifyImageByHandleNoName(HANDLE hFile, uint32_t fFlags, PRTERRINFO pErrInfo)
+{
+ /*
+ * Determine the NT name and call the verification function.
+ */
+ union
+ {
+ UNICODE_STRING UniStr;
+ uint8_t abBuffer[(MAX_PATH + 8 + 1) * 2];
+ } uBuf;
+
+ ULONG cbIgn;
+ NTSTATUS rcNt = NtQueryObject(hFile,
+ ObjectNameInformation,
+ &uBuf,
+ sizeof(uBuf) - sizeof(WCHAR),
+ &cbIgn);
+ if (NT_SUCCESS(rcNt))
+ uBuf.UniStr.Buffer[uBuf.UniStr.Length / sizeof(WCHAR)] = '\0';
+ else
+ uBuf.UniStr.Buffer = (WCHAR *)L"TODO3";
+
+ return supHardenedWinVerifyImageByHandle(hFile, uBuf.UniStr.Buffer, fFlags, NULL /*pfCacheable*/, pErrInfo);
+}
+#endif /* IN_RING3 */
+
+
+/**
+ * Retrieves the full official path to the system root or one of it's sub
+ * directories.
+ *
+ * This code is also used by the support driver.
+ *
+ * @returns VBox status code.
+ * @param pvBuf The output buffer. This will contain a
+ * UNICODE_STRING followed (at the kernel's
+ * discretion) the string buffer.
+ * @param cbBuf The size of the buffer @a pvBuf points to.
+ * @param enmDir Which directory under the system root we're
+ * interested in.
+ * @param pErrInfo Pointer to error info structure. Optional.
+ */
+DECLHIDDEN(int) supHardNtGetSystemRootDir(void *pvBuf, uint32_t cbBuf, SUPHARDNTSYSROOTDIR enmDir, PRTERRINFO pErrInfo)
+{
+ HANDLE hFile = RTNT_INVALID_HANDLE_VALUE;
+ IO_STATUS_BLOCK Ios = RTNT_IO_STATUS_BLOCK_INITIALIZER;
+
+ UNICODE_STRING NtName;
+ switch (enmDir)
+ {
+ case kSupHardNtSysRootDir_System32:
+ {
+ static const WCHAR s_wszNameSystem32[] = L"\\SystemRoot\\System32\\";
+ NtName.Buffer = (PWSTR)s_wszNameSystem32;
+ NtName.Length = sizeof(s_wszNameSystem32) - sizeof(WCHAR);
+ NtName.MaximumLength = sizeof(s_wszNameSystem32);
+ break;
+ }
+ case kSupHardNtSysRootDir_WinSxS:
+ {
+ static const WCHAR s_wszNameWinSxS[] = L"\\SystemRoot\\WinSxS\\";
+ NtName.Buffer = (PWSTR)s_wszNameWinSxS;
+ NtName.Length = sizeof(s_wszNameWinSxS) - sizeof(WCHAR);
+ NtName.MaximumLength = sizeof(s_wszNameWinSxS);
+ break;
+ }
+ default:
+ AssertFailed();
+ return VERR_INVALID_PARAMETER;
+ }
+
+ OBJECT_ATTRIBUTES ObjAttr;
+ InitializeObjectAttributes(&ObjAttr, &NtName, OBJ_CASE_INSENSITIVE, NULL /*hRootDir*/, NULL /*pSecDesc*/);
+
+ NTSTATUS rcNt = NtCreateFile(&hFile,
+ FILE_READ_DATA | SYNCHRONIZE,
+ &ObjAttr,
+ &Ios,
+ NULL /* Allocation Size*/,
+ FILE_ATTRIBUTE_NORMAL,
+ FILE_SHARE_READ | FILE_SHARE_WRITE,
+ FILE_OPEN,
+ FILE_DIRECTORY_FILE | FILE_OPEN_FOR_BACKUP_INTENT | FILE_SYNCHRONOUS_IO_NONALERT,
+ NULL /*EaBuffer*/,
+ 0 /*EaLength*/);
+ if (NT_SUCCESS(rcNt))
+ rcNt = Ios.Status;
+ if (NT_SUCCESS(rcNt))
+ {
+ ULONG cbIgn;
+ rcNt = NtQueryObject(hFile,
+ ObjectNameInformation,
+ pvBuf,
+ cbBuf - sizeof(WCHAR),
+ &cbIgn);
+ NtClose(hFile);
+ if (NT_SUCCESS(rcNt))
+ {
+ PUNICODE_STRING pUniStr = (PUNICODE_STRING)pvBuf;
+ if (pUniStr->Length > 0)
+ {
+ /* Make sure it's terminated so it can safely be printed.*/
+ pUniStr->Buffer[pUniStr->Length / sizeof(WCHAR)] = '\0';
+ return VINF_SUCCESS;
+ }
+
+ return RTErrInfoSetF(pErrInfo, VERR_SUP_VP_SYSTEM32_PATH,
+ "NtQueryObject returned an empty path for '%ls'", NtName.Buffer);
+ }
+ return RTErrInfoSetF(pErrInfo, VERR_SUP_VP_SYSTEM32_PATH, "NtQueryObject failed on '%ls' dir: %#x", NtName.Buffer, rcNt);
+ }
+ return RTErrInfoSetF(pErrInfo, VERR_SUP_VP_SYSTEM32_PATH, "Failure to open '%ls': %#x", NtName.Buffer, rcNt);
+}
+
+
+/**
+ * Initialize one certificate entry.
+ *
+ * @returns VBox status code.
+ * @param pCert The X.509 certificate representation to init.
+ * @param pabCert The raw DER encoded certificate.
+ * @param cbCert The size of the raw certificate.
+ * @param pErrInfo Where to return extended error info. Optional.
+ * @param pszErrorTag Error tag.
+ */
+static int supHardNtViCertInit(PRTCRX509CERTIFICATE pCert, unsigned char const *pabCert, unsigned cbCert,
+ PRTERRINFO pErrInfo, const char *pszErrorTag)
+{
+ AssertReturn(cbCert > 16 && cbCert < _128K,
+ RTErrInfoSetF(pErrInfo, VERR_INTERNAL_ERROR_3, "%s: cbCert=%#x out of range", pszErrorTag, cbCert));
+ AssertReturn(!RTCrX509Certificate_IsPresent(pCert),
+ RTErrInfoSetF(pErrInfo, VERR_WRONG_ORDER, "%s: Certificate already decoded?", pszErrorTag));
+
+ RTASN1CURSORPRIMARY PrimaryCursor;
+ RTAsn1CursorInitPrimary(&PrimaryCursor, pabCert, cbCert, pErrInfo, &g_RTAsn1DefaultAllocator, RTASN1CURSOR_FLAGS_DER, NULL);
+ int rc = RTCrX509Certificate_DecodeAsn1(&PrimaryCursor.Cursor, 0, pCert, pszErrorTag);
+ if (RT_SUCCESS(rc))
+ rc = RTCrX509Certificate_CheckSanity(pCert, 0, pErrInfo, pszErrorTag);
+ return rc;
+}
+
+
+static int supHardNtViCertStoreAddArray(RTCRSTORE hStore, PCSUPTAENTRY paCerts, unsigned cCerts, PRTERRINFO pErrInfo)
+{
+ for (uint32_t i = 0; i < cCerts; i++)
+ {
+ int rc = RTCrStoreCertAddEncoded(hStore, RTCRCERTCTX_F_ENC_TAF_DER, paCerts[i].pch, paCerts[i].cb, pErrInfo);
+ if (RT_FAILURE(rc))
+ return rc;
+ }
+ return VINF_SUCCESS;
+}
+
+
+/**
+ * Initialize a certificate table.
+ *
+ * @param phStore Where to return the store pointer.
+ * @param paCerts1 Pointer to the first certificate table.
+ * @param cCerts1 Entries in the first certificate table.
+ * @param paCerts2 Pointer to the second certificate table.
+ * @param cCerts2 Entries in the second certificate table.
+ * @param paCerts3 Pointer to the third certificate table.
+ * @param cCerts3 Entries in the third certificate table.
+ * @param pErrInfo Where to return extended error info. Optional.
+ * @param pszErrorTag Error tag.
+ */
+static int supHardNtViCertStoreInit(PRTCRSTORE phStore,
+ PCSUPTAENTRY paCerts1, unsigned cCerts1,
+ PCSUPTAENTRY paCerts2, unsigned cCerts2,
+ PCSUPTAENTRY paCerts3, unsigned cCerts3,
+ PRTERRINFO pErrInfo, const char *pszErrorTag)
+{
+ AssertReturn(*phStore == NIL_RTCRSTORE, VERR_WRONG_ORDER);
+
+ int rc = RTCrStoreCreateInMem(phStore, cCerts1 + cCerts2);
+ if (RT_FAILURE(rc))
+ return RTErrInfoSetF(pErrInfo, rc, "RTCrStoreCreateMemoryStore failed: %Rrc", rc);
+
+ rc = supHardNtViCertStoreAddArray(*phStore, paCerts1, cCerts1, pErrInfo);
+ if (RT_SUCCESS(rc))
+ rc = supHardNtViCertStoreAddArray(*phStore, paCerts2, cCerts2, pErrInfo);
+ if (RT_SUCCESS(rc))
+ rc = supHardNtViCertStoreAddArray(*phStore, paCerts3, cCerts3, pErrInfo);
+ return rc;
+}
+
+
+/**
+ * This initializes the certificates globals so we don't have to reparse them
+ * every time we need to verify an image.
+ *
+ * @returns IPRT status code.
+ * @param pErrInfo Where to return extended error info. Optional.
+ */
+DECLHIDDEN(int) supHardenedWinInitImageVerifier(PRTERRINFO pErrInfo)
+{
+ AssertReturn(!RTCrX509Certificate_IsPresent(&g_BuildX509Cert), VERR_WRONG_ORDER);
+
+ /*
+ * Get the system root paths.
+ */
+ int rc = supHardNtGetSystemRootDir(&g_System32NtPath, sizeof(g_System32NtPath), kSupHardNtSysRootDir_System32, pErrInfo);
+ if (RT_SUCCESS(rc))
+ rc = supHardNtGetSystemRootDir(&g_WinSxSNtPath, sizeof(g_WinSxSNtPath), kSupHardNtSysRootDir_WinSxS, pErrInfo);
+ if (RT_SUCCESS(rc))
+ {
+ /*
+ * Initialize it, leaving the cleanup to the termination call.
+ */
+ rc = supHardNtViCertInit(&g_BuildX509Cert, g_abSUPBuildCert, g_cbSUPBuildCert, pErrInfo, "BuildCertificate");
+ if (RT_SUCCESS(rc))
+ rc = supHardNtViCertStoreInit(&g_hSpcRootStore, g_aSUPSpcRootTAs, g_cSUPSpcRootTAs,
+ NULL, 0, NULL, 0, pErrInfo, "SpcRoot");
+ if (RT_SUCCESS(rc))
+ rc = supHardNtViCertStoreInit(&g_hNtKernelRootStore, g_aSUPNtKernelRootTAs, g_cSUPNtKernelRootTAs,
+ NULL, 0, NULL, 0, pErrInfo, "NtKernelRoot");
+ if (RT_SUCCESS(rc))
+ rc = supHardNtViCertStoreInit(&g_hSpcAndNtKernelRootStore,
+ g_aSUPSpcRootTAs, g_cSUPSpcRootTAs,
+ g_aSUPNtKernelRootTAs, g_cSUPNtKernelRootTAs,
+ g_aSUPTimestampTAs, g_cSUPTimestampTAs,
+ pErrInfo, "SpcAndNtKernelRoot");
+ if (RT_SUCCESS(rc))
+ rc = supHardNtViCertStoreInit(&g_hSpcAndNtKernelSuppStore,
+ NULL, 0, NULL, 0, NULL, 0,
+ pErrInfo, "SpcAndNtKernelSupplemental");
+
+ /* If the build certificate is a test singing certificate, it must be a
+ trusted root or we'll fail to validate anything. */
+ if ( RT_SUCCESS(rc)
+ && RTCrX509Name_Compare(&g_BuildX509Cert.TbsCertificate.Subject, &g_BuildX509Cert.TbsCertificate.Issuer) == 0)
+ rc = RTCrStoreCertAddEncoded(g_hSpcAndNtKernelRootStore, RTCRCERTCTX_F_ENC_X509_DER,
+ g_abSUPBuildCert, g_cbSUPBuildCert, pErrInfo);
+
+ if (RT_SUCCESS(rc))
+ return VINF_SUCCESS;
+ supHardenedWinTermImageVerifier();
+ }
+ return rc;
+}
+
+
+/**
+ * Releases resources allocated by supHardenedWinInitImageVerifier.
+ */
+DECLHIDDEN(void) supHardenedWinTermImageVerifier(void)
+{
+ if (RTCrX509Certificate_IsPresent(&g_BuildX509Cert))
+ RTAsn1VtDelete(&g_BuildX509Cert.SeqCore.Asn1Core);
+
+ RTCrStoreRelease(g_hSpcAndNtKernelSuppStore);
+ g_hSpcAndNtKernelSuppStore = NIL_RTCRSTORE;
+ RTCrStoreRelease(g_hSpcAndNtKernelRootStore);
+ g_hSpcAndNtKernelRootStore = NIL_RTCRSTORE;
+
+ RTCrStoreRelease(g_hNtKernelRootStore);
+ g_hNtKernelRootStore = NIL_RTCRSTORE;
+ RTCrStoreRelease(g_hSpcRootStore);
+ g_hSpcRootStore = NIL_RTCRSTORE;
+}
+
+#ifdef IN_RING3
+
+/**
+ * This is a hardcoded list of certificates we thing we might need.
+ *
+ * @returns true if wanted, false if not.
+ * @param pCert The certificate.
+ */
+static bool supR3HardenedWinIsDesiredRootCA(PCRTCRX509CERTIFICATE pCert)
+{
+ /*
+ * Check that it's a plausible root certificate.
+ */
+ if (!RTCrX509Certificate_IsSelfSigned(pCert))
+ return false;
+ if (RTAsn1Integer_UnsignedCompareWithU32(&pCert->TbsCertificate.T0.Version, 3) > 0)
+ {
+ if ( !(pCert->TbsCertificate.T3.fExtKeyUsage & RTCRX509CERT_KEY_USAGE_F_KEY_CERT_SIGN)
+ && (pCert->TbsCertificate.T3.fFlags & RTCRX509TBSCERTIFICATE_F_PRESENT_KEY_USAGE) )
+ return false;
+ if ( pCert->TbsCertificate.T3.pBasicConstraints
+ && !pCert->TbsCertificate.T3.pBasicConstraints->CA.fValue)
+ return false;
+ }
+ if (pCert->TbsCertificate.SubjectPublicKeyInfo.SubjectPublicKey.cBits < 256) /* mostly for u64KeyId reading. */
+ return false;
+
+ /*
+ * Array of names and key clues of the certificates we want.
+ */
+ static struct
+ {
+ uint64_t u64KeyId;
+ const char *pszName;
+ } const s_aWanted[] =
+ {
+ /* SPC */
+ { UINT64_C(0xffffffffffffffff), "C=US, O=VeriSign, Inc., OU=Class 3 Public Primary Certification Authority" },
+ { UINT64_C(0xffffffffffffffff), "L=Internet, O=VeriSign, Inc., OU=VeriSign Commercial Software Publishers CA" },
+ { UINT64_C(0x491857ead79dde00), "C=US, O=The Go Daddy Group, Inc., OU=Go Daddy Class 2 Certification Authority" },
+
+ /* TS */
+ { UINT64_C(0xffffffffffffffff), "O=Microsoft Trust Network, OU=Microsoft Corporation, OU=Microsoft Time Stamping Service Root, OU=Copyright (c) 1997 Microsoft Corp." },
+ { UINT64_C(0xffffffffffffffff), "O=VeriSign Trust Network, OU=VeriSign, Inc., OU=VeriSign Time Stamping Service Root, OU=NO LIABILITY ACCEPTED, (c)97 VeriSign, Inc." },
+ { UINT64_C(0xffffffffffffffff), "C=ZA, ST=Western Cape, L=Durbanville, O=Thawte, OU=Thawte Certification, CN=Thawte Timestamping CA" },
+
+ /* Additional Windows 8.1 list: */
+ { UINT64_C(0x5ad46780fa5df300), "DC=com, DC=microsoft, CN=Microsoft Root Certificate Authority" },
+ { UINT64_C(0x3be670c1bd02a900), "OU=Copyright (c) 1997 Microsoft Corp., OU=Microsoft Corporation, CN=Microsoft Root Authority" },
+ { UINT64_C(0x4d3835aa4180b200), "C=US, ST=Washington, L=Redmond, O=Microsoft Corporation, CN=Microsoft Root Certificate Authority 2011" },
+ { UINT64_C(0x646e3fe3ba08df00), "C=US, O=MSFT, CN=Microsoft Authenticode(tm) Root Authority" },
+ { UINT64_C(0xece4e4289e08b900), "C=US, ST=Washington, L=Redmond, O=Microsoft Corporation, CN=Microsoft Root Certificate Authority 2010" },
+ { UINT64_C(0x59faf1086271bf00), "C=US, ST=Arizona, L=Scottsdale, O=GoDaddy.com, Inc., CN=Go Daddy Root Certificate Authority - G2" },
+ { UINT64_C(0x3d98ab22bb04a300), "C=IE, O=Baltimore, OU=CyberTrust, CN=Baltimore CyberTrust Root" },
+ { UINT64_C(0x91e3728b8b40d000), "C=GB, ST=Greater Manchester, L=Salford, O=COMODO CA Limited, CN=COMODO Certification Authority" },
+ { UINT64_C(0x61a3a33f81aace00), "C=US, ST=UT, L=Salt Lake City, O=The USERTRUST Network, OU=http://www.usertrust.com, CN=UTN-USERFirst-Object" },
+ { UINT64_C(0x9e5bc2d78b6a3636), "C=ZA, ST=Western Cape, L=Cape Town, O=Thawte Consulting cc, OU=Certification Services Division, CN=Thawte Premium Server CA, Email=premium-server@thawte.com" },
+ { UINT64_C(0xf4fd306318ccda00), "C=US, O=GeoTrust Inc., CN=GeoTrust Global CA" },
+ { UINT64_C(0xa0ee62086758b15d), "C=US, O=Equifax, OU=Equifax Secure Certificate Authority" },
+ { UINT64_C(0x8ff6fc03c1edbd00), "C=US, ST=Arizona, L=Scottsdale, O=Starfield Technologies, Inc., CN=Starfield Root Certificate Authority - G2" },
+ { UINT64_C(0xa3ce8d99e60eda00), "C=BE, O=GlobalSign nv-sa, OU=Root CA, CN=GlobalSign Root CA" },
+ { UINT64_C(0xa671e9fec832b700), "C=US, O=Starfield Technologies, Inc., OU=Starfield Class 2 Certification Authority" },
+ { UINT64_C(0xa8de7211e13be200), "C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert Global Root CA" },
+ { UINT64_C(0x0ff3891b54348328), "C=US, O=Entrust.net, OU=www.entrust.net/CPS incorp. by ref. (limits liab.), OU=(c) 1999 Entrust.net Limited, CN=Entrust.netSecure Server Certification Authority" },
+ { UINT64_C(0x7ae89c50f0b6a00f), "C=US, O=GTE Corporation, OU=GTE CyberTrust Solutions, Inc., CN=GTE CyberTrust Global Root" },
+ { UINT64_C(0xd45980fbf0a0ac00), "C=US, O=thawte, Inc., OU=Certification Services Division, OU=(c) 2006 thawte, Inc. - For authorized use only, CN=thawte Primary Root CA" },
+ { UINT64_C(0x9e5bc2d78b6a3636), "C=ZA, ST=Western Cape, L=Cape Town, O=Thawte Consulting cc, OU=Certification Services Division, CN=Thawte Premium Server CA, Email=premium-server@thawte.com" },
+ { UINT64_C(0x7c4fd32ec1b1ce00), "C=PL, O=Unizeto Sp. z o.o., CN=Certum CA" },
+ { UINT64_C(0xd4fbe673e5ccc600), "C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert High Assurance EV Root CA" },
+ { UINT64_C(0x16e64d2a56ccf200), "C=US, ST=Arizona, L=Scottsdale, O=Starfield Technologies, Inc., OU=http://certificates.starfieldtech.com/repository/, CN=Starfield Services Root Certificate Authority" },
+ { UINT64_C(0x6e2ba21058eedf00), "C=US, ST=UT, L=Salt Lake City, O=The USERTRUST Network, OU=http://www.usertrust.com, CN=UTN - DATACorp SGC" },
+ { UINT64_C(0xb28612a94b4dad00), "O=Entrust.net, OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.), OU=(c) 1999 Entrust.net Limited, CN=Entrust.netCertification Authority (2048)" },
+ { UINT64_C(0x357a29080824af00), "C=US, O=VeriSign, Inc., OU=VeriSign Trust Network, OU=(c) 2006 VeriSign, Inc. - For authorized use only, CN=VeriSign Class3 Public Primary Certification Authority - G5" },
+ { UINT64_C(0x466cbc09db88c100), "C=IL, O=StartCom Ltd., OU=Secure Digital Certificate Signing, CN=StartCom Certification Authority" },
+ { UINT64_C(0x9259c8abe5ca713a), "L=ValiCert Validation Network, O=ValiCert, Inc., OU=ValiCert Class 2 Policy Validation Authority, CN=http://www.valicert.com/, Email=info@valicert.com" },
+ { UINT64_C(0x1f78fc529cbacb00), "C=US, O=VeriSign, Inc., OU=VeriSign Trust Network, OU=(c) 1999 VeriSign, Inc. - For authorized use only, CN=VeriSign Class3 Public Primary Certification Authority - G3" },
+ { UINT64_C(0x8043e4ce150ead00), "C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert Assured ID Root CA" },
+ { UINT64_C(0x00f2e6331af7b700), "C=SE, O=AddTrust AB, OU=AddTrust External TTP Network, CN=AddTrust External CA Root" },
+ };
+
+
+ uint64_t const u64KeyId = pCert->TbsCertificate.SubjectPublicKeyInfo.SubjectPublicKey.uBits.pu64[1];
+ uint32_t i = RT_ELEMENTS(s_aWanted);
+ while (i-- > 0)
+ if ( s_aWanted[i].u64KeyId == u64KeyId
+ || s_aWanted[i].u64KeyId == UINT64_MAX)
+ if (RTCrX509Name_MatchWithString(&pCert->TbsCertificate.Subject, s_aWanted[i].pszName))
+ return true;
+
+#ifdef DEBUG_bird
+ char szTmp[512];
+ szTmp[sizeof(szTmp) - 1] = '\0';
+ RTCrX509Name_FormatAsString(&pCert->TbsCertificate.Issuer, szTmp, sizeof(szTmp) - 1, NULL);
+ SUP_DPRINTF(("supR3HardenedWinIsDesiredRootCA: %#llx %s\n", u64KeyId, szTmp));
+#endif
+ return false;
+}
+
+/**
+ * Called by supR3HardenedWinResolveVerifyTrustApiAndHookThreadCreation to
+ * import selected root CAs from the system certificate store.
+ *
+ * These certificates permits us to correctly validate third party DLLs.
+ *
+ * @param fLoadLibraryFlags The LoadLibraryExW flags that the caller
+ * found to work. Avoids us having to retry on
+ * ERROR_INVALID_PARAMETER.
+ */
+static void supR3HardenedWinRetrieveTrustedRootCAs(DWORD fLoadLibraryFlags)
+{
+ uint32_t cAdded = 0;
+
+ /*
+ * Load crypt32.dll and resolve the APIs we need.
+ */
+ HMODULE hCrypt32 = LoadLibraryExW(L"\\\\.\\GLOBALROOT\\SystemRoot\\System32\\crypt32.dll", NULL, fLoadLibraryFlags);
+ if (!hCrypt32)
+ supR3HardenedFatal("Error loading 'crypt32.dll': %u", GetLastError());
+
+#define RESOLVE_CRYPT32_API(a_Name, a_pfnType) \
+ a_pfnType pfn##a_Name = (a_pfnType)GetProcAddress(hCrypt32, #a_Name); \
+ if (pfn##a_Name == NULL) supR3HardenedFatal("Error locating '" #a_Name "' in 'crypt32.dll': %u", GetLastError())
+ RESOLVE_CRYPT32_API(CertOpenStore, PFNCERTOPENSTORE);
+ RESOLVE_CRYPT32_API(CertCloseStore, PFNCERTCLOSESTORE);
+ RESOLVE_CRYPT32_API(CertEnumCertificatesInStore, PFNCERTENUMCERTIFICATESINSTORE);
+#undef RESOLVE_CRYPT32_API
+
+ /*
+ * Open the root store and look for the certificates we wish to use.
+ */
+ DWORD fOpenStore = CERT_STORE_OPEN_EXISTING_FLAG | CERT_STORE_READONLY_FLAG;
+ HCERTSTORE hStore = pfnCertOpenStore(CERT_STORE_PROV_SYSTEM_W, PKCS_7_ASN_ENCODING | X509_ASN_ENCODING,
+ NULL /* hCryptProv = default */, CERT_SYSTEM_STORE_LOCAL_MACHINE | fOpenStore, L"Root");
+ if (!hStore)
+ hStore = pfnCertOpenStore(CERT_STORE_PROV_SYSTEM_W, PKCS_7_ASN_ENCODING | X509_ASN_ENCODING,
+ NULL /* hCryptProv = default */, CERT_SYSTEM_STORE_CURRENT_USER | fOpenStore, L"Root");
+ if (hStore)
+ {
+ PCCERT_CONTEXT pCurCtx = NULL;
+ while ((pCurCtx = pfnCertEnumCertificatesInStore(hStore, pCurCtx)) != NULL)
+ {
+ if (pCurCtx->dwCertEncodingType & X509_ASN_ENCODING)
+ {
+ RTASN1CURSORPRIMARY PrimaryCursor;
+ RTAsn1CursorInitPrimary(&PrimaryCursor, pCurCtx->pbCertEncoded, pCurCtx->cbCertEncoded, NULL /*pErrInfo*/,
+ &g_RTAsn1DefaultAllocator, RTASN1CURSOR_FLAGS_DER, "CurCtx");
+ RTCRX509CERTIFICATE MyCert;
+ int rc = RTCrX509Certificate_DecodeAsn1(&PrimaryCursor.Cursor, 0, &MyCert, "Cert");
+ AssertRC(rc);
+ if (RT_SUCCESS(rc))
+ {
+ if (supR3HardenedWinIsDesiredRootCA(&MyCert))
+ {
+ rc = RTCrStoreCertAddEncoded(g_hSpcRootStore, RTCRCERTCTX_F_ENC_X509_DER,
+ pCurCtx->pbCertEncoded, pCurCtx->cbCertEncoded, NULL /*pErrInfo*/);
+ AssertRC(rc);
+
+ rc = RTCrStoreCertAddEncoded(g_hSpcAndNtKernelRootStore, RTCRCERTCTX_F_ENC_X509_DER,
+ pCurCtx->pbCertEncoded, pCurCtx->cbCertEncoded, NULL /*pErrInfo*/);
+ AssertRC(rc);
+ cAdded++;
+ }
+
+ RTCrX509Certificate_Delete(&MyCert);
+ }
+ }
+ }
+ pfnCertCloseStore(hStore, CERT_CLOSE_STORE_CHECK_FLAG);
+ g_fHaveOtherRoots = true;
+ }
+ SUP_DPRINTF(("supR3HardenedWinRetrieveTrustedRootCAs: cAdded=%u\n", cAdded));
+}
+
+
+/**
+ * Resolves the WinVerifyTrust API after the process has been verified and
+ * installs a thread creation hook.
+ *
+ * The WinVerifyTrust API is used in addition our own Authenticode verification
+ * code. If the image has the IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY flag
+ * set, it will be checked again by the kernel. All our image has this flag set
+ * and we require all VBox extensions to have it set as well. In effect, the
+ * authenticode signature will be checked two or three times.
+ */
+DECLHIDDEN(void) supR3HardenedWinResolveVerifyTrustApiAndHookThreadCreation(void)
+{
+# ifdef IN_SUP_HARDENED_R3
+ /*
+ * Load our the support library DLL that does the thread hooking as the
+ * security API may trigger the creation of COM worker threads (or
+ * whatever they are).
+ *
+ * The thread creation hook makes the threads very slippery to debuggers by
+ * irreversably disabling most (if not all) debug events for them.
+ */
+ char szPath[RTPATH_MAX];
+ supR3HardenedPathSharedLibs(szPath, sizeof(szPath) - sizeof("/VBoxSupLib.DLL"));
+ suplibHardenedStrCat(szPath, "/VBoxSupLib.DLL");
+ HMODULE hSupLibMod = (HMODULE)supR3HardenedWinLoadLibrary(szPath, true /*fSystem32Only*/);
+ if (hSupLibMod == NULL)
+ supR3HardenedFatal("Error loading '%s': %u", szPath, GetLastError());
+# endif
+
+ /*
+ * Resolve it.
+ */
+ DWORD fFlags = 0;
+ if (g_uNtVerCombined >= SUP_MAKE_NT_VER_SIMPLE(6, 0))
+ fFlags = LOAD_LIBRARY_SEARCH_SYSTEM32;
+ HMODULE hWintrust = LoadLibraryExW(L"\\\\.\\GLOBALROOT\\SystemRoot\\System32\\Wintrust.dll", NULL, fFlags);
+ if ( hWintrust == NULL
+ && fFlags
+ && g_uNtVerCombined < SUP_MAKE_NT_VER_SIMPLE(6, 2)
+ && GetLastError() == ERROR_INVALID_PARAMETER)
+ {
+ fFlags = 0;
+ hWintrust = LoadLibraryExW(L"\\\\.\\GLOBALROOT\\SystemRoot\\System32\\Wintrust.dll", NULL, fFlags);
+ }
+ if (hWintrust == NULL)
+ supR3HardenedFatal("Error loading 'Wintrust.dll': %u", GetLastError());
+
+#define RESOLVE_CRYPT_API(a_Name, a_pfnType, a_uMinWinVer) \
+ do { \
+ g_pfn##a_Name = (a_pfnType)GetProcAddress(hWintrust, #a_Name); \
+ if (g_pfn##a_Name == NULL && (a_uMinWinVer) < g_uNtVerCombined) \
+ supR3HardenedFatal("Error locating '" #a_Name "' in 'Wintrust.dll': %u", GetLastError()); \
+ } while (0)
+
+ PFNWINVERIFYTRUST pfnWinVerifyTrust = (PFNWINVERIFYTRUST)GetProcAddress(hWintrust, "WinVerifyTrust");
+ if (!pfnWinVerifyTrust)
+ supR3HardenedFatal("Error locating 'WinVerifyTrust' in 'Wintrust.dll': %u", GetLastError());
+
+ RESOLVE_CRYPT_API(CryptCATAdminAcquireContext, PFNCRYPTCATADMINACQUIRECONTEXT, 0);
+ RESOLVE_CRYPT_API(CryptCATAdminCalcHashFromFileHandle, PFNCRYPTCATADMINCALCHASHFROMFILEHANDLE, 0);
+ RESOLVE_CRYPT_API(CryptCATAdminEnumCatalogFromHash, PFNCRYPTCATADMINENUMCATALOGFROMHASH, 0);
+ RESOLVE_CRYPT_API(CryptCATAdminReleaseCatalogContext, PFNCRYPTCATADMINRELEASECATALOGCONTEXT, 0);
+ RESOLVE_CRYPT_API(CryptCATAdminReleaseContext, PFNCRYPTCATDADMINRELEASECONTEXT, 0);
+ RESOLVE_CRYPT_API(CryptCATCatalogInfoFromContext, PFNCRYPTCATCATALOGINFOFROMCONTEXT, 0);
+
+ RESOLVE_CRYPT_API(CryptCATAdminAcquireContext2, PFNCRYPTCATADMINACQUIRECONTEXT2, SUP_NT_VER_W80);
+ RESOLVE_CRYPT_API(CryptCATAdminCalcHashFromFileHandle2, PFNCRYPTCATADMINCALCHASHFROMFILEHANDLE2, SUP_NT_VER_W80);
+
+ /*
+ * Call it on ourselves and ntdll to make sure it loads all the providers
+ * now, we would otherwise geting into recursive trouble in the
+ * NtCreateSection hook.
+ */
+# ifdef IN_SUP_HARDENED_R3
+ RTERRINFOSTATIC ErrInfoStatic;
+ RTErrInfoInitStatic(&ErrInfoStatic);
+ int rc = supR3HardNtViCallWinVerifyTrust(NULL, g_SupLibHardenedExeNtPath.UniStr.Buffer, 0,
+ &ErrInfoStatic.Core, pfnWinVerifyTrust);
+ if (RT_FAILURE(rc))
+ supR3HardenedFatal("WinVerifyTrust failed on stub executable: %s", ErrInfoStatic.szMsg);
+# endif
+
+ if (g_uNtVerCombined >= SUP_MAKE_NT_VER_SIMPLE(6, 0)) /* ntdll isn't signed on XP, assuming this is the case on W2K3 for now. */
+ supR3HardNtViCallWinVerifyTrust(NULL, L"\\SystemRoot\\System32\\ntdll.dll", 0, NULL, pfnWinVerifyTrust);
+ supR3HardNtViCallWinVerifyTrustCatFile(NULL, L"\\SystemRoot\\System32\\ntdll.dll", 0, NULL, pfnWinVerifyTrust);
+
+ g_pfnWinVerifyTrust = pfnWinVerifyTrust;
+
+ /*
+ * Now, get trusted root CAs so we can verify a broader scope of signatures.
+ */
+ supR3HardenedWinRetrieveTrustedRootCAs(fFlags);
+}
+
+
+static int supR3HardNtViNtToWinPath(PCRTUTF16 pwszNtName, PCRTUTF16 *ppwszWinPath,
+ PRTUTF16 pwszWinPathBuf, size_t cwcWinPathBuf)
+{
+ static const RTUTF16 s_wszPrefix[] = L"\\\\.\\GLOBALROOT";
+
+ if (*pwszNtName != '\\' && *pwszNtName != '/')
+ return VERR_PATH_DOES_NOT_START_WITH_ROOT;
+
+ size_t cwcNtName = RTUtf16Len(pwszNtName);
+ if (RT_ELEMENTS(s_wszPrefix) + cwcNtName > cwcWinPathBuf)
+ return VERR_FILENAME_TOO_LONG;
+
+ memcpy(pwszWinPathBuf, s_wszPrefix, sizeof(s_wszPrefix));
+ memcpy(&pwszWinPathBuf[sizeof(s_wszPrefix) / sizeof(RTUTF16) - 1], pwszNtName, (cwcNtName + 1) * sizeof(RTUTF16));
+ *ppwszWinPath = pwszWinPathBuf;
+ return VINF_SUCCESS;
+}
+
+
+/**
+ * Calls WinVerifyTrust to verify an PE image.
+ *
+ * @returns VBox status code.
+ * @param hFile File handle to the executable file.
+ * @param pwszName Full NT path to the DLL in question, used for
+ * dealing with unsigned system dlls as well as for
+ * error/logging.
+ * @param fFlags Flags, SUPHNTVI_F_XXX.
+ * @param pErrInfo Pointer to error info structure. Optional.
+ * @param pfnWinVerifyTrust Pointer to the API.
+ */
+static int supR3HardNtViCallWinVerifyTrust(HANDLE hFile, PCRTUTF16 pwszName, uint32_t fFlags, PRTERRINFO pErrInfo,
+ PFNWINVERIFYTRUST pfnWinVerifyTrust)
+{
+ /*
+ * Convert the name into a Windows name.
+ */
+ RTUTF16 wszWinPathBuf[MAX_PATH];
+ PCRTUTF16 pwszWinPath;
+ int rc = supR3HardNtViNtToWinPath(pwszName, &pwszWinPath, wszWinPathBuf, RT_ELEMENTS(wszWinPathBuf));
+ if (RT_FAILURE(rc))
+ return RTErrInfoSetF(pErrInfo, rc, "Bad path passed to supR3HardNtViCallWinVerifyTrust: rc=%Rrc '%ls'", rc, pwszName);
+
+ /*
+ * Construct input parameters and call the API.
+ */
+ WINTRUST_FILE_INFO FileInfo;
+ RT_ZERO(FileInfo);
+ FileInfo.cbStruct = sizeof(FileInfo);
+ FileInfo.pcwszFilePath = pwszWinPath;
+ FileInfo.hFile = hFile;
+
+ GUID PolicyActionGuid = WINTRUST_ACTION_GENERIC_VERIFY_V2;
+
+ WINTRUST_DATA TrustData;
+ RT_ZERO(TrustData);
+ TrustData.cbStruct = sizeof(TrustData);
+ TrustData.fdwRevocationChecks = WTD_REVOKE_NONE; /* Keep simple for now. */
+ TrustData.dwStateAction = WTD_STATEACTION_VERIFY;
+ TrustData.dwUIChoice = WTD_UI_NONE;
+ TrustData.dwProvFlags = 0;
+ if (g_uNtVerCombined >= SUP_MAKE_NT_VER_SIMPLE(6, 0))
+ TrustData.dwProvFlags = WTD_CACHE_ONLY_URL_RETRIEVAL;
+ else
+ TrustData.dwProvFlags = WTD_REVOCATION_CHECK_NONE;
+ TrustData.dwUnionChoice = WTD_CHOICE_FILE;
+ TrustData.pFile = &FileInfo;
+
+ HRESULT hrc = pfnWinVerifyTrust(NULL /*hwnd*/, &PolicyActionGuid, &TrustData);
+ if (hrc == S_OK)
+ rc = VINF_SUCCESS;
+ else
+ {
+ /*
+ * Failed. Format a nice error message.
+ */
+# ifdef DEBUG_bird
+ __debugbreak();
+# endif
+ const char *pszErrConst = NULL;
+ switch (hrc)
+ {
+ case TRUST_E_SYSTEM_ERROR: pszErrConst = "TRUST_E_SYSTEM_ERROR"; break;
+ case TRUST_E_NO_SIGNER_CERT: pszErrConst = "TRUST_E_NO_SIGNER_CERT"; break;
+ case TRUST_E_COUNTER_SIGNER: pszErrConst = "TRUST_E_COUNTER_SIGNER"; break;
+ case TRUST_E_CERT_SIGNATURE: pszErrConst = "TRUST_E_CERT_SIGNATURE"; break;
+ case TRUST_E_TIME_STAMP: pszErrConst = "TRUST_E_TIME_STAMP"; break;
+ case TRUST_E_BAD_DIGEST: pszErrConst = "TRUST_E_BAD_DIGEST"; break;
+ case TRUST_E_BASIC_CONSTRAINTS: pszErrConst = "TRUST_E_BASIC_CONSTRAINTS"; break;
+ case TRUST_E_FINANCIAL_CRITERIA: pszErrConst = "TRUST_E_FINANCIAL_CRITERIA"; break;
+ case TRUST_E_PROVIDER_UNKNOWN: pszErrConst = "TRUST_E_PROVIDER_UNKNOWN"; break;
+ case TRUST_E_ACTION_UNKNOWN: pszErrConst = "TRUST_E_ACTION_UNKNOWN"; break;
+ case TRUST_E_SUBJECT_FORM_UNKNOWN: pszErrConst = "TRUST_E_SUBJECT_FORM_UNKNOWN"; break;
+ case TRUST_E_SUBJECT_NOT_TRUSTED: pszErrConst = "TRUST_E_SUBJECT_NOT_TRUSTED"; break;
+ case TRUST_E_NOSIGNATURE: pszErrConst = "TRUST_E_NOSIGNATURE"; break;
+ case TRUST_E_FAIL: pszErrConst = "TRUST_E_FAIL"; break;
+ case TRUST_E_EXPLICIT_DISTRUST: pszErrConst = "TRUST_E_EXPLICIT_DISTRUST"; break;
+ }
+ if (pszErrConst)
+ rc = RTErrInfoSetF(pErrInfo, VERR_LDRVI_UNSUPPORTED_ARCH,
+ "WinVerifyTrust failed with hrc=%s on '%ls'", pszErrConst, pwszName);
+ else
+ rc = RTErrInfoSetF(pErrInfo, VERR_LDRVI_UNSUPPORTED_ARCH,
+ "WinVerifyTrust failed with hrc=%Rhrc on '%ls'", hrc, pwszName);
+ }
+
+ /* clean up state data. */
+ TrustData.dwStateAction = WTD_STATEACTION_CLOSE;
+ FileInfo.hFile = NULL;
+ hrc = pfnWinVerifyTrust(NULL /*hwnd*/, &PolicyActionGuid, &TrustData);
+
+ return rc;
+}
+
+
+/**
+ * Calls WinVerifyTrust to verify an PE image via catalog files.
+ *
+ * @returns VBox status code.
+ * @param hFile File handle to the executable file.
+ * @param pwszName Full NT path to the DLL in question, used for
+ * dealing with unsigned system dlls as well as for
+ * error/logging.
+ * @param fFlags Flags, SUPHNTVI_F_XXX.
+ * @param pErrInfo Pointer to error info structure. Optional.
+ * @param pfnWinVerifyTrust Pointer to the API.
+ */
+static int supR3HardNtViCallWinVerifyTrustCatFile(HANDLE hFile, PCRTUTF16 pwszName, uint32_t fFlags, PRTERRINFO pErrInfo,
+ PFNWINVERIFYTRUST pfnWinVerifyTrust)
+{
+ SUP_DPRINTF(("supR3HardNtViCallWinVerifyTrustCatFile: hFile=%p pwszName=%ls\n", hFile, pwszName));
+
+ /*
+ * Convert the name into a Windows name.
+ */
+ RTUTF16 wszWinPathBuf[MAX_PATH];
+ PCRTUTF16 pwszWinPath;
+ int rc = supR3HardNtViNtToWinPath(pwszName, &pwszWinPath, wszWinPathBuf, RT_ELEMENTS(wszWinPathBuf));
+ if (RT_FAILURE(rc))
+ return RTErrInfoSetF(pErrInfo, rc, "Bad path passed to supR3HardNtViCallWinVerifyTrustCatFile: rc=%Rrc '%ls'", rc, pwszName);
+
+ /*
+ * Open the file if we didn't get a handle.
+ */
+ HANDLE hFileClose = NULL;
+ if (hFile == RTNT_INVALID_HANDLE_VALUE || hFile == NULL)
+ {
+ hFile = RTNT_INVALID_HANDLE_VALUE;
+ IO_STATUS_BLOCK Ios = RTNT_IO_STATUS_BLOCK_INITIALIZER;
+
+ UNICODE_STRING NtName;
+ NtName.Buffer = (PWSTR)pwszName;
+ NtName.Length = (USHORT)(RTUtf16Len(pwszName) * sizeof(WCHAR));
+ NtName.MaximumLength = NtName.Length + sizeof(WCHAR);
+
+ OBJECT_ATTRIBUTES ObjAttr;
+ InitializeObjectAttributes(&ObjAttr, &NtName, OBJ_CASE_INSENSITIVE, NULL /*hRootDir*/, NULL /*pSecDesc*/);
+
+ NTSTATUS rcNt = NtCreateFile(&hFile,
+ FILE_READ_DATA | SYNCHRONIZE,
+ &ObjAttr,
+ &Ios,
+ NULL /* Allocation Size*/,
+ FILE_ATTRIBUTE_NORMAL,
+ FILE_SHARE_READ,
+ FILE_OPEN,
+ FILE_NON_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT,
+ NULL /*EaBuffer*/,
+ 0 /*EaLength*/);
+ if (NT_SUCCESS(rcNt))
+ rcNt = Ios.Status;
+ if (!NT_SUCCESS(rcNt))
+ return RTErrInfoSetF(pErrInfo, RTErrConvertFromNtStatus(rcNt),
+ "NtCreateFile returned %#x opening '%ls'.", rcNt, pwszName);
+ hFileClose = hFile;
+ }
+
+ /*
+ * On Windows 8.0 and later there are more than one digest choice.
+ */
+ rc = VERR_LDRVI_NOT_SIGNED;
+ static struct
+ {
+ /** The digest algorithm name. */
+ const WCHAR *pszAlgorithm;
+ /** Cached catalog admin handle. */
+ HCATADMIN volatile hCachedCatAdmin;
+ } s_aHashes[] =
+ {
+ { NULL, NULL },
+ { L"SHA256", NULL },
+ };
+ for (uint32_t i = 0; i < RT_ELEMENTS(s_aHashes); i++)
+ {
+ /*
+ * Another loop for dealing with different trust provider policies
+ * required for successfully validating different catalog signatures.
+ */
+ bool fTryNextPolicy;
+ uint32_t iPolicy = 0;
+ static const GUID s_aPolicies[] =
+ {
+ DRIVER_ACTION_VERIFY, /* Works with microsoft bits. Most frequently used, thus first. */
+ WINTRUST_ACTION_GENERIC_VERIFY_V2, /* Works with ATI and other SPC kernel-code signed stuff. */
+ };
+ do
+ {
+ /*
+ * Create a context.
+ */
+ fTryNextPolicy = false;
+ BOOL fRc;
+ HCATADMIN hCatAdmin = ASMAtomicXchgPtr(&s_aHashes[i].hCachedCatAdmin, NULL);
+ if (hCatAdmin)
+ fRc = TRUE;
+ else if (g_pfnCryptCATAdminAcquireContext2)
+ fRc = g_pfnCryptCATAdminAcquireContext2(&hCatAdmin, &s_aPolicies[iPolicy], s_aHashes[i].pszAlgorithm,
+ NULL /*pStrongHashPolicy*/, 0 /*dwFlags*/);
+ else
+ fRc = g_pfnCryptCATAdminAcquireContext(&hCatAdmin, &s_aPolicies[iPolicy], 0 /*dwFlags*/);
+ if (fRc)
+ {
+ SUP_DPRINTF(("supR3HardNtViCallWinVerifyTrustCatFile: hCatAdmin=%p\n", hCatAdmin));
+
+ /*
+ * Hash the file.
+ */
+ BYTE abHash[SUPHARDNTVI_MAX_CAT_HASH_SIZE];
+ DWORD cbHash = sizeof(abHash);
+ if (g_pfnCryptCATAdminCalcHashFromFileHandle2)
+ fRc = g_pfnCryptCATAdminCalcHashFromFileHandle2(hCatAdmin, hFile, &cbHash, abHash, 0 /*dwFlags*/);
+ else
+ fRc = g_pfnCryptCATAdminCalcHashFromFileHandle(hFile, &cbHash, abHash, 0 /*dwFlags*/);
+ if (fRc)
+ {
+ /* Produce a string version of it that we can pass to WinVerifyTrust. */
+ RTUTF16 wszDigest[SUPHARDNTVI_MAX_CAT_HASH_SIZE * 2 + 1];
+ int rc2 = RTUtf16PrintHexBytes(wszDigest, RT_ELEMENTS(wszDigest), abHash, cbHash, RTSTRPRINTHEXBYTES_F_UPPER);
+ if (RT_SUCCESS(rc2))
+ {
+ SUP_DPRINTF(("supR3HardNtViCallWinVerifyTrustCatFile: cbHash=%u wszDigest=%ls\n", cbHash, wszDigest));
+
+ /*
+ * Enumerate catalog information that matches the hash.
+ */
+ uint32_t iCat = 0;
+ HCATINFO hCatInfoPrev = NULL;
+ do
+ {
+ /* Get the next match. */
+ HCATINFO hCatInfo = g_pfnCryptCATAdminEnumCatalogFromHash(hCatAdmin, abHash, cbHash, 0, &hCatInfoPrev);
+ if (!hCatInfo)
+ {
+ if (iCat == 0)
+ SUP_DPRINTF(("supR3HardNtViCallWinVerifyTrustCatFile: CryptCATAdminEnumCatalogFromHash failed %u\n", GetLastError()));
+ break;
+ }
+ Assert(hCatInfoPrev == NULL);
+ hCatInfoPrev = hCatInfo;
+
+ /*
+ * Call WinVerifyTrust.
+ */
+ CATALOG_INFO CatInfo;
+ CatInfo.cbStruct = sizeof(CatInfo);
+ CatInfo.wszCatalogFile[0] = '\0';
+ if (g_pfnCryptCATCatalogInfoFromContext(hCatInfo, &CatInfo, 0 /*dwFlags*/))
+ {
+ WINTRUST_CATALOG_INFO WtCatInfo;
+ RT_ZERO(WtCatInfo);
+ WtCatInfo.cbStruct = sizeof(WtCatInfo);
+ WtCatInfo.dwCatalogVersion = 0;
+ WtCatInfo.pcwszCatalogFilePath = CatInfo.wszCatalogFile;
+ WtCatInfo.pcwszMemberTag = wszDigest;
+ WtCatInfo.pcwszMemberFilePath = pwszWinPath;
+ WtCatInfo.pbCalculatedFileHash = abHash;
+ WtCatInfo.cbCalculatedFileHash = cbHash;
+ WtCatInfo.pcCatalogContext = NULL;
+
+ WINTRUST_DATA TrustData;
+ RT_ZERO(TrustData);
+ TrustData.cbStruct = sizeof(TrustData);
+ TrustData.fdwRevocationChecks = WTD_REVOKE_NONE; /* Keep simple for now. */
+ TrustData.dwStateAction = WTD_STATEACTION_VERIFY;
+ TrustData.dwUIChoice = WTD_UI_NONE;
+ TrustData.dwProvFlags = 0;
+ if (g_uNtVerCombined >= SUP_MAKE_NT_VER_SIMPLE(6, 0))
+ TrustData.dwProvFlags = WTD_CACHE_ONLY_URL_RETRIEVAL;
+ else
+ TrustData.dwProvFlags = WTD_REVOCATION_CHECK_NONE;
+ TrustData.dwUnionChoice = WTD_CHOICE_CATALOG;
+ TrustData.pCatalog = &WtCatInfo;
+
+ HRESULT hrc = pfnWinVerifyTrust(NULL /*hwnd*/, &s_aPolicies[iPolicy], &TrustData);
+ SUP_DPRINTF(("supR3HardNtViCallWinVerifyTrustCatFile: WinVerifyTrust => %#x; cat=%ls\n", hrc, CatInfo.wszCatalogFile));
+
+ if (SUCCEEDED(hrc))
+ rc = VINF_SUCCESS;
+ else if (hrc == TRUST_E_NOSIGNATURE)
+ { /* ignore because it's useless. */ }
+ else if (hrc == ERROR_INVALID_PARAMETER)
+ { /* This is returned if the given file isn't found in the catalog, it seems. */ }
+ else
+ {
+ rc = RTErrInfoSetF(pErrInfo, VERR_SUP_VP_WINTRUST_CAT_FAILURE,
+ "WinVerifyTrust failed with hrc=%#x on '%ls' and .cat-file='%ls'.",
+ hrc, pwszWinPath, CatInfo.wszCatalogFile);
+ fTryNextPolicy = (hrc == CERT_E_UNTRUSTEDROOT);
+ }
+
+ /* clean up state data. */
+ TrustData.dwStateAction = WTD_STATEACTION_CLOSE;
+ hrc = pfnWinVerifyTrust(NULL /*hwnd*/, &s_aPolicies[iPolicy], &TrustData);
+ Assert(SUCCEEDED(hrc));
+ }
+ else
+ {
+ rc = RTErrInfoSetF(pErrInfo, RTErrConvertFromWin32(GetLastError()),
+ "CryptCATCatalogInfoFromContext failed: %d [file=%s]",
+ GetLastError(), pwszName);
+ SUP_DPRINTF(("supR3HardNtViCallWinVerifyTrustCatFile: CryptCATCatalogInfoFromContext failed\n"));
+ }
+ iCat++;
+ } while (rc == VERR_LDRVI_NOT_SIGNED && iCat < 128);
+
+ if (hCatInfoPrev != NULL)
+ if (!g_pfnCryptCATAdminReleaseCatalogContext(hCatAdmin, hCatInfoPrev, 0 /*dwFlags*/))
+ AssertFailed();
+ }
+ else
+ rc = RTErrInfoSetF(pErrInfo, rc2, "RTUtf16PrintHexBytes failed: %Rrc", rc);
+ }
+ else
+ rc = RTErrInfoSetF(pErrInfo, RTErrConvertFromWin32(GetLastError()),
+ "CryptCATAdminCalcHashFromFileHandle[2] failed: %d [file=%s]", GetLastError(), pwszName);
+
+ if (!ASMAtomicCmpXchgPtr(&s_aHashes[i].hCachedCatAdmin, hCatAdmin, NULL))
+ if (!g_pfnCryptCATAdminReleaseContext(hCatAdmin, 0 /*dwFlags*/))
+ AssertFailed();
+ }
+ else
+ rc = RTErrInfoSetF(pErrInfo, RTErrConvertFromWin32(GetLastError()),
+ "CryptCATAdminAcquireContext[2] failed: %d [file=%s]", GetLastError(), pwszName);
+ iPolicy++;
+ } while ( fTryNextPolicy
+ && iPolicy < RT_ELEMENTS(s_aPolicies));
+
+ /*
+ * Only repeat if we've got g_pfnCryptCATAdminAcquireContext2 and can specify the hash algorithm.
+ */
+ if (!g_pfnCryptCATAdminAcquireContext2)
+ break;
+ if (rc != VERR_LDRVI_NOT_SIGNED)
+ break;
+ }
+
+ if (hFileClose != NULL)
+ NtClose(hFileClose);
+
+ return rc;
+}
+
+
+/**
+ * Initializes g_uNtVerCombined and g_NtVerInfo.
+ * Called from suplibHardenedWindowsMain and suplibOsInit.
+ */
+DECLHIDDEN(void) supR3HardenedWinInitVersion(void)
+{
+ /*
+ * Get the windows version. Use RtlGetVersion as GetVersionExW and
+ * GetVersion might not be telling the whole truth (8.0 on 8.1 depending on
+ * the application manifest).
+ */
+ OSVERSIONINFOEXW NtVerInfo;
+
+ suplibHardenedMemSet(&NtVerInfo, 0, sizeof(NtVerInfo));
+ NtVerInfo.dwOSVersionInfoSize = sizeof(RTL_OSVERSIONINFOEXW);
+ if (!NT_SUCCESS(RtlGetVersion((PRTL_OSVERSIONINFOW)&NtVerInfo)))
+ {
+ suplibHardenedMemSet(&NtVerInfo, 0, sizeof(NtVerInfo));
+ NtVerInfo.dwOSVersionInfoSize = sizeof(RTL_OSVERSIONINFOW);
+ if (!NT_SUCCESS(RtlGetVersion((PRTL_OSVERSIONINFOW)&NtVerInfo)))
+ {
+ NtVerInfo.dwOSVersionInfoSize = sizeof(NtVerInfo);
+ if (!GetVersionExW((OSVERSIONINFOW *)&NtVerInfo))
+ {
+ suplibHardenedMemSet(&NtVerInfo, 0, sizeof(NtVerInfo));
+ DWORD dwVer = GetVersion();
+ NtVerInfo.dwMajorVersion = RT_BYTE1(dwVer);
+ NtVerInfo.dwMinorVersion = RT_BYTE2(dwVer);
+ NtVerInfo.dwBuildNumber = RT_BIT_32(31) & dwVer ? 0 : RT_HI_U16(dwVer);
+ }
+ }
+ }
+ g_uNtVerCombined = SUP_MAKE_NT_VER_COMBINED(NtVerInfo.dwMajorVersion, NtVerInfo.dwMinorVersion, NtVerInfo.dwBuildNumber,
+ NtVerInfo.wServicePackMajor, NtVerInfo.wServicePackMinor);
+}
+
+#endif /* IN_RING3 */
+
diff --git a/src/VBox/HostDrivers/Support/win/SUPHardenedVerifyProcess-win.cpp b/src/VBox/HostDrivers/Support/win/SUPHardenedVerifyProcess-win.cpp
new file mode 100644
index 00000000000..8477352daf2
--- /dev/null
+++ b/src/VBox/HostDrivers/Support/win/SUPHardenedVerifyProcess-win.cpp
@@ -0,0 +1,1196 @@
+/* $Id$ */
+/** @file
+ * VirtualBox Support Library/Driver - Hardened Process Verification, Windows.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#ifdef IN_RING0
+# define IPRT_NT_MAP_TO_ZW
+# include <iprt/nt/nt.h>
+# include <ntimage.h>
+#else
+# include <iprt/nt/nt-and-windows.h>
+#endif
+
+#include <VBox/sup.h>
+#include <VBox/err.h>
+#include <iprt/ctype.h>
+#include <iprt/param.h>
+
+#ifdef IN_RING0
+# include "SUPDrvInternal.h"
+#else
+# include "SUPLibInternal.h"
+#endif
+#include "win/SUPHardenedVerify-win.h"
+
+
+/*******************************************************************************
+* Structures and Typedefs *
+*******************************************************************************/
+/**
+ * Virtual address space region.
+ */
+typedef struct SUPHNTVPREGION
+{
+ /** The RVA of the region. */
+ uint32_t uRva;
+ /** The size of the region. */
+ uint32_t cb;
+ /** The protection of the region. */
+ uint32_t fProt;
+} SUPHNTVPREGION;
+/** Pointer to a virtual address space region. */
+typedef SUPHNTVPREGION *PSUPHNTVPREGION;
+
+/**
+ * Virtual address space image information.
+ */
+typedef struct SUPHNTVPIMAGE
+{
+ /** The base address of the image. */
+ uintptr_t uImageBase;
+ /** The size of the image mapping. */
+ uintptr_t cbImage;
+
+ /** The name from the allowed lists. */
+ const char *pszName;
+ /** Name structure for NtQueryVirtualMemory/MemorySectionName. */
+ struct
+ {
+ /** The full unicode name. */
+ UNICODE_STRING UniStr;
+ /** Buffer space. */
+ WCHAR awcBuffer[260];
+ } Name;
+
+ /** The number of mapping regions. */
+ uint32_t cRegions;
+ /** Mapping regions. */
+ SUPHNTVPREGION aRegions[16];
+
+ /** The image characteristics from the FileHeader. */
+ uint16_t fImageCharecteristics;
+ /** The DLL characteristics from the OptionalHeader. */
+ uint16_t fDllCharecteristics;
+
+ /** Set if this is the DLL. */
+ bool fDll;
+ /** Set if the image is NTDLL an the verficiation code needs to watch out for
+ * the NtCreateSection patch. */
+ bool fNtCreateSectionPatch;
+ /** Whether the API set schema hack needs to be applied when verifying memory
+ * content. The hack means that we only check if the 1st section is mapped. */
+ bool fApiSetSchemaOnlySection1;
+} SUPHNTVPIMAGE;
+/** Pointer to image info from the virtual address space scan. */
+typedef SUPHNTVPIMAGE *PSUPHNTVPIMAGE;
+
+/**
+ * Virtual address space scanning state.
+ */
+typedef struct SUPHNTVPSTATE
+{
+ /** Number of images in aImages. */
+ uint32_t cImages;
+ /** Images found in the process.
+ * The array is large enough to hold the executable, all allowed DLLs, and one
+ * more so we can get the image name of the first unwanted DLL. */
+ SUPHNTVPIMAGE aImages[1+5+1];
+ /** Memory compare scratch buffer.*/
+ uint8_t abMemory[_4K];
+ /** File compare scratch buffer.*/
+ uint8_t abFile[_4K];
+ /** Section headers for use when comparing file and loaded image. */
+ IMAGE_SECTION_HEADER aSecHdrs[16];
+
+} SUPHNTVPSTATE;
+/** Pointer to stat information of a virtual address space scan. */
+typedef SUPHNTVPSTATE *PSUPHNTVPSTATE;
+
+
+/*******************************************************************************
+* Global Variables *
+*******************************************************************************/
+/**
+ * System DLLs allowed to be loaded into the process.
+ * @remarks supHardNtVpCheckDlls assumes these are lower case.
+ */
+static const char *g_apszSupNtVpAllowedDlls[] =
+{
+ "ntdll.dll",
+ "kernel32.dll",
+ "kernelbase.dll",
+ "apphelp.dll",
+ "apisetschema.dll"
+};
+
+/**
+ * VBox executables allowed to start VMs.
+ * @remarks Remember to keep in sync with SUPR3HardenedVerify.cpp.
+ */
+static const char *g_apszSupNtVpAllowedVmExes[] =
+{
+ "VBoxHeadless.exe",
+ "VirtualBox.exe",
+ "VBoxSDL.exe",
+ "VBoxNetDHCP.exe",
+ "VBoxNetNAT.exe",
+};
+
+/** Pointer to NtQueryVirtualMemory. Initialized by SUPDrv-win.cpp in
+ * ring-0, in ring-3 it's just a slightly confusing define. */
+#ifdef IN_RING0
+PFNNTQUERYVIRTUALMEMORY g_pfnNtQueryVirtualMemory = NULL;
+#else
+# define g_pfnNtQueryVirtualMemory NtQueryVirtualMemory
+#endif
+
+
+/**
+ * Fills in error information.
+ *
+ * @returns @a rc.
+ * @param pErrInfo Pointer to the extened error info structure.
+ * Can be NULL.
+ * @param pszErr Where to return error details.
+ * @param cbErr Size of the buffer @a pszErr points to.
+ * @param rc The status to return.
+ * @param pszMsg The format string for the message.
+ * @param ... The arguments for the format string.
+ */
+static int supHardNtVpSetInfo(PRTERRINFO pErrInfo, int rc, const char *pszMsg, ...)
+{
+ va_list va;
+#ifdef IN_RING3
+ va_start(va, pszMsg);
+ supR3HardenedError(rc, false /*fFatal*/, "%N\n", pszMsg, &va);
+ va_end(va);
+#endif
+
+ va_start(va, pszMsg);
+ RTErrInfoSetV(pErrInfo, rc, pszMsg, va);
+ va_end(va);
+
+ return rc;
+}
+
+
+static NTSTATUS supHardNtVpReadFile(HANDLE hFile, uint64_t off, void *pvBuf, size_t cbRead)
+{
+ if ((ULONG)cbRead != cbRead)
+ return STATUS_INTEGER_OVERFLOW;
+
+ IO_STATUS_BLOCK Ios = RTNT_IO_STATUS_BLOCK_INITIALIZER;
+ NTSTATUS rcNt = NtReadFile(hFile,
+ NULL /*hEvent*/,
+ NULL /*ApcRoutine*/,
+ NULL /*ApcContext*/,
+ &Ios,
+ pvBuf,
+ (ULONG)cbRead,
+ (PLARGE_INTEGER)&off,
+ NULL);
+ if (NT_SUCCESS(rcNt))
+ rcNt = Ios.Status;
+ return rcNt;
+}
+
+
+static NTSTATUS supHardNtVpReadMem(HANDLE hProcess, uintptr_t uPtr, void *pvBuf, size_t cbRead)
+{
+#ifdef IN_RING0
+ /* ASSUMES hProcess is the current process. */
+ /** @todo use MmCopyVirtualMemory where available! */
+ int rc = RTR0MemUserCopyFrom(pvBuf, uPtr, cbRead);
+ if (RT_SUCCESS(rc))
+ return STATUS_SUCCESS;
+ return STATUS_ACCESS_DENIED;
+#else
+ SIZE_T cbIgn;
+ NTSTATUS rcNt = NtReadVirtualMemory(hProcess, (PVOID)uPtr, pvBuf, cbRead, &cbIgn);
+ if (NT_SUCCESS(rcNt) && cbIgn != cbRead)
+ rcNt = STATUS_IO_DEVICE_ERROR;
+ return rcNt;
+#endif
+}
+
+
+static int supHardNtVpFileMemCompare(const void *pvFile, const void *pvMemory, size_t cbToCompare,
+ PSUPHNTVPIMAGE pImage, uint32_t uRva, PRTERRINFO pErrInfo)
+{
+ if (suplibHardenedMemComp(pvFile, pvMemory, cbToCompare) == 0)
+ return VINF_SUCCESS;
+
+ /* Find the exact location. */
+ const uint8_t *pbFile = (const uint8_t *)pvFile;
+ const uint8_t *pbMemory = (const uint8_t *)pvMemory;
+ while (cbToCompare > 0 && *pbFile == *pbMemory)
+ {
+ cbToCompare--;
+ pbFile++;
+ pbMemory++;
+ uRva++;
+ }
+
+ return supHardNtVpSetInfo(pErrInfo, VERR_SUP_VP_MEMORY_VS_FILE_MISMATCH,
+ "%s: memory compare at %#x failed: %#x != %#x\n", pImage->pszName, uRva, *pbFile, *pbMemory);
+}
+
+
+static int supHardNtVpCheckSectionProtection(PSUPHNTVPIMAGE pImage, uint32_t uRva, uint32_t cb, uint32_t fProt,
+ PRTERRINFO pErrInfo)
+{
+ uint32_t const cbOrg = cb;
+ if (!cb)
+ return VINF_SUCCESS;
+
+ for (uint32_t i = 0; i < pImage->cRegions; i++)
+ {
+ uint32_t offRegion = uRva - pImage->aRegions[i].uRva;
+ if (offRegion < pImage->aRegions[i].cb)
+ {
+ uint32_t cbLeft = pImage->aRegions[i].cb - offRegion;
+ if ( pImage->aRegions[i].fProt != fProt
+ && ( fProt != PAGE_READWRITE
+ || pImage->aRegions[i].fProt != PAGE_WRITECOPY))
+ return supHardNtVpSetInfo(pErrInfo, VERR_SUP_VP_SECTION_PROTECTION_MISMATCH,
+ "%s: RVA range %#x-%#x protection is %#x, expected %#x. (cb=%#x)",
+ pImage->pszName, uRva, uRva + cbLeft - 1, pImage->aRegions[i].fProt, fProt, cb);
+ if (cbLeft >= cb)
+ return VINF_SUCCESS;
+ cb -= cbLeft;
+ uRva += cbLeft;
+
+#if 0 /* This shouldn't ever be necessary. */
+ if ( i + 1 < pImage->cRegions
+ && uRva < pImage->aRegions[i + 1].uRva)
+ {
+ cbLeft = pImage->aRegions[i + 1].uRva - uRva;
+ if (cbLeft >= cb)
+ return VINF_SUCCESS;
+ cb -= cbLeft;
+ uRva += cbLeft;
+ }
+#endif
+ }
+ }
+
+ return supHardNtVpSetInfo(pErrInfo, cbOrg == cb ? VERR_SUP_VP_SECTION_NOT_MAPPED : VERR_SUP_VP_SECTION_NOT_FULLY_MAPPED,
+ "%s: RVA range %#x-%#x is not mapped?", pImage->pszName, uRva, uRva + cb - 1);
+}
+
+
+/**
+ * Compares process memory with the disk content.
+ *
+ * @returns VBox status code.
+ * @param pThis The process scanning state structure (for the
+ * two scratch buffers).
+ * @param pImage The image data collected during the address
+ * space scan.
+ * @param hProcess Handle to the process.
+ * @param hFile Handle to the image file.
+ * @param pErrInfo Pointer to error info structure. Optional.
+ */
+static int supHardNtVpVerifyImageCompareMemory(PSUPHNTVPSTATE pThis, PSUPHNTVPIMAGE pImage, HANDLE hProcess, HANDLE hFile,
+ PRTERRINFO pErrInfo)
+{
+ /*
+ * Read and find the file headers.
+ */
+ NTSTATUS rcNt = supHardNtVpReadFile(hFile, 0, pThis->abFile, sizeof(pThis->abFile));
+ if (!NT_SUCCESS(rcNt))
+ return supHardNtVpSetInfo(pErrInfo, VERR_SUP_VP_IMAGE_HDR_READ_ERROR,
+ "%s: Error reading image header: %#x", pImage->pszName, rcNt);
+
+ uint32_t offNtHdrs = 0;
+ PIMAGE_DOS_HEADER pDosHdr = (PIMAGE_DOS_HEADER)&pThis->abFile[0];
+ if (pDosHdr->e_magic == IMAGE_DOS_SIGNATURE)
+ {
+ offNtHdrs = pDosHdr->e_lfanew;
+ if (offNtHdrs > 512 || offNtHdrs < sizeof(*pDosHdr))
+ return supHardNtVpSetInfo(pErrInfo, VERR_SUP_VP_BAD_MZ_OFFSET,
+ "%s: Unexpected e_lfanew value: %#x", pImage->pszName, offNtHdrs);
+ }
+ PIMAGE_NT_HEADERS pNtHdrs = (PIMAGE_NT_HEADERS)&pThis->abFile[offNtHdrs];
+ if (pNtHdrs->Signature != IMAGE_NT_SIGNATURE)
+ return supHardNtVpSetInfo(pErrInfo, VERR_SUP_VP_BAD_IMAGE_SIGNATURE,
+ "%s: No PE signature at %#x: %#x", pImage->pszName, offNtHdrs, pNtHdrs->Signature);
+
+ /*
+ * Do basic header validation.
+ */
+#ifdef RT_ARCH_AMD64
+ if (pNtHdrs->FileHeader.Machine != IMAGE_FILE_MACHINE_AMD64)
+#else
+ if (pNtHdrs->FileHeader.Machine != IMAGE_FILE_MACHINE_I386)
+#endif
+ return supHardNtVpSetInfo(pErrInfo, VERR_SUP_VP_UNEXPECTED_IMAGE_MACHINE,
+ "%s: Unexpected machine: %#x", pImage->pszName, pNtHdrs->FileHeader.Machine);
+
+ if (pNtHdrs->FileHeader.SizeOfOptionalHeader != sizeof(pNtHdrs->OptionalHeader))
+ return supHardNtVpSetInfo(pErrInfo, VERR_SUP_VP_BAD_OPTIONAL_HEADER,
+ "%s: Unexpected optional header size: %#x",
+ pImage->pszName, pNtHdrs->FileHeader.SizeOfOptionalHeader);
+
+ if (pNtHdrs->OptionalHeader.Magic != RT_CONCAT3(IMAGE_NT_OPTIONAL_HDR,ARCH_BITS,_MAGIC))
+ return supHardNtVpSetInfo(pErrInfo, VERR_SUP_VP_BAD_OPTIONAL_HEADER,
+ "%s: Unexpected optional header magic: %#x", pImage->pszName, pNtHdrs->OptionalHeader.Magic);
+ if (pNtHdrs->OptionalHeader.NumberOfRvaAndSizes != IMAGE_NUMBEROF_DIRECTORY_ENTRIES)
+ return supHardNtVpSetInfo(pErrInfo, VERR_SUP_VP_BAD_OPTIONAL_HEADER,
+ "%s: Unexpected data dirs: %#x", pImage->pszName, pNtHdrs->OptionalHeader.NumberOfRvaAndSizes);
+
+ /*
+ * Before we start comparing things, store what we need to know from the headers.
+ */
+ uint32_t const cSections = pNtHdrs->FileHeader.NumberOfSections;
+ if (cSections > RT_ELEMENTS(pThis->aSecHdrs))
+ return supHardNtVpSetInfo(pErrInfo, VERR_SUP_VP_TOO_MANY_SECTIONS,
+ "%s: Too many section headers: %#x", pImage->pszName, cSections);
+ suplibHardenedMemCopy(pThis->aSecHdrs, pNtHdrs + 1, cSections * sizeof(IMAGE_SECTION_HEADER));
+
+ uintptr_t const uImageBase = pNtHdrs->OptionalHeader.ImageBase;
+ if (uImageBase & PAGE_OFFSET_MASK)
+ return supHardNtVpSetInfo(pErrInfo, VERR_SUP_VP_BAD_IMAGE_BASE,
+ "%s: Invalid image base: %p", pImage->pszName, uImageBase);
+
+ uint32_t const cbImage = pNtHdrs->OptionalHeader.SizeOfImage;
+ if (RT_ALIGN_32(pImage->cbImage, PAGE_SIZE) != RT_ALIGN_32(cbImage, PAGE_SIZE) && !pImage->fApiSetSchemaOnlySection1)
+ return supHardNtVpSetInfo(pErrInfo, VERR_SUP_VP_BAD_IMAGE_SIZE,
+ "%s: SizeOfImage (%#x) isn't close enough to the mapping size (%#x)",
+ pImage->pszName, cbImage, pImage->cbImage);
+
+ uint32_t const cbSectAlign = pNtHdrs->OptionalHeader.SectionAlignment;
+ if ( !RT_IS_POWER_OF_TWO(cbSectAlign)
+ || cbSectAlign < PAGE_SIZE
+ || cbSectAlign > (pImage->fApiSetSchemaOnlySection1 ? _64K : (uint32_t)PAGE_SIZE) )
+ return supHardNtVpSetInfo(pErrInfo, VERR_SUP_VP_BAD_SECTION_ALIGNMENT_VALUE,
+ "%s: Unexpected SectionAlignment value: %#x", pImage->pszName, cbSectAlign);
+
+ uint32_t const cbFileAlign = pNtHdrs->OptionalHeader.FileAlignment;
+ if (!RT_IS_POWER_OF_TWO(cbFileAlign) || cbFileAlign < 512 || cbFileAlign > PAGE_SIZE || cbFileAlign > cbSectAlign)
+ return supHardNtVpSetInfo(pErrInfo, VERR_SUP_VP_BAD_FILE_ALIGNMENT_VALUE,
+ "%s: Unexpected FileAlignment value: %#x (cbSectAlign=%#x)",
+ pImage->pszName, cbFileAlign, cbSectAlign);
+
+ uint32_t const cbHeaders = pNtHdrs->OptionalHeader.SizeOfHeaders;
+ uint32_t const cbMinHdrs = offNtHdrs + sizeof(*pNtHdrs) + sizeof(IMAGE_SECTION_HEADER) * cSections;
+ if (cbHeaders < cbMinHdrs)
+ return supHardNtVpSetInfo(pErrInfo, VERR_SUP_VP_BAD_SIZE_OF_HEADERS,
+ "%s: Headers are too small: %#x < %#x (cSections=%#x)",
+ pImage->pszName, cbHeaders, cbMinHdrs, cSections);
+ uint32_t const cbHdrsFile = RT_ALIGN_32(cbHeaders, cbFileAlign);
+ if (cbHdrsFile > sizeof(pThis->abFile))
+ return supHardNtVpSetInfo(pErrInfo, VERR_SUP_VP_BAD_SIZE_OF_HEADERS,
+ "%s: Headers are larger than expected: %#x/%#x (expected max %zx)",
+ pImage->pszName, cbHeaders, cbHdrsFile, sizeof(pThis->abFile));
+
+ /*
+ * Compare the file header with the loaded bits. The loader will fiddle
+ * with image base, changing it to the actual load address.
+ */
+ int rc;
+ if (!pImage->fApiSetSchemaOnlySection1)
+ {
+ rcNt = supHardNtVpReadMem(hProcess, pImage->uImageBase, pThis->abMemory, cbHdrsFile);
+ if (!NT_SUCCESS(rcNt))
+ return supHardNtVpSetInfo(pErrInfo, VERR_SUP_VP_MEMORY_READ_ERROR,
+ "%s: Error reading image header from memory: %#x", pImage->pszName, rcNt);
+ if (uImageBase != pImage->uImageBase)
+ pNtHdrs->OptionalHeader.ImageBase = pImage->uImageBase;
+
+ rc = supHardNtVpFileMemCompare(pThis->abFile, pThis->abMemory, cbHeaders, pImage, 0 /*uRva*/, pErrInfo);
+ if (RT_FAILURE(rc))
+ return rc;
+ rc = supHardNtVpCheckSectionProtection(pImage, 0 /*uRva*/, cbHdrsFile, PAGE_READONLY, pErrInfo);
+ if (RT_FAILURE(rc))
+ return rc;
+ }
+
+ /*
+ * Save some header fields we might be using later on.
+ */
+ pImage->fImageCharecteristics = pNtHdrs->FileHeader.Characteristics;
+ pImage->fDllCharecteristics = pNtHdrs->OptionalHeader.DllCharacteristics;
+
+ /*
+ * Validate sections and check them against the mapping regions.
+ */
+ uint32_t uRva = cbHdrsFile;
+ for (uint32_t i = 0; i < cSections; i++)
+ {
+ /* Validate the section. */
+ uint32_t uSectRva = pThis->aSecHdrs[i].VirtualAddress;
+ if (uSectRva < uRva || uSectRva > cbImage || RT_ALIGN_32(uSectRva, cbSectAlign) != uSectRva)
+ return supHardNtVpSetInfo(pErrInfo, VERR_SUP_VP_BAD_SECTION_RVA,
+ "%s: Section %u: Invalid virtual address: %#x (uRva=%#x, cbImage=%#x, cbSectAlign=%#x)",
+ pImage->pszName, i, uSectRva, uRva, cbImage, cbSectAlign);
+ uint32_t cbMap = pThis->aSecHdrs[i].Misc.VirtualSize;
+ if (cbMap > cbImage || uRva + cbMap > cbImage)
+ return supHardNtVpSetInfo(pErrInfo, VERR_SUP_VP_BAD_SECTION_VIRTUAL_SIZE,
+ "%s: Section %u: Invalid virtual size: %#x (uSectRva=%#x, uRva=%#x, cbImage=%#x)",
+ pImage->pszName, i, cbMap, uSectRva, uRva, cbImage);
+ uint32_t cbFile = pThis->aSecHdrs[i].SizeOfRawData;
+ if (cbFile != RT_ALIGN_32(cbFile, cbFileAlign) || cbFile > RT_ALIGN_32(cbMap, cbSectAlign))
+ return supHardNtVpSetInfo(pErrInfo, VERR_SUP_VP_BAD_SECTION_FILE_SIZE,
+ "%s: Section %u: Invalid file size: %#x (cbMap=%#x, uSectRva=%#x)",
+ pImage->pszName, i, cbFile, cbMap, uSectRva);
+
+ /* Validate the protection. */
+ if (!pImage->fApiSetSchemaOnlySection1 || i == 0)
+ {
+ if (pImage->fApiSetSchemaOnlySection1)
+ {
+ pImage->uImageBase -= uSectRva;
+ pImage->cbImage += uSectRva;
+ pImage->aRegions[i].uRva = uSectRva;
+ }
+
+ uint32_t fProt;
+ switch (pThis->aSecHdrs[i].Characteristics & (IMAGE_SCN_MEM_EXECUTE | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE))
+ {
+ case IMAGE_SCN_MEM_READ:
+ fProt = PAGE_READONLY;
+ break;
+ case IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE:
+ fProt = PAGE_READWRITE;
+ if (!suplibHardenedMemComp(pThis->aSecHdrs[i].Name, ".mrdata", 8)) /* w8.1, ntdll */
+ fProt = PAGE_READONLY;
+ break;
+ case IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_EXECUTE:
+ fProt = PAGE_EXECUTE_READ;
+ break;
+ case IMAGE_SCN_MEM_EXECUTE:
+ fProt = PAGE_EXECUTE;
+ break;
+ default:
+ return supHardNtVpSetInfo(pErrInfo, VERR_SUP_VP_UNEXPECTED_SECTION_FLAGS,
+ "%s: Section %u: Unexpected characteristics: %#x (uSectRva=%#x, cbMap=%#x)",
+ pImage->pszName, i, pThis->aSecHdrs[i].Characteristics, uSectRva, cbMap);
+
+ }
+ rc = supHardNtVpCheckSectionProtection(pImage, uSectRva, RT_ALIGN_32(cbMap, PAGE_SIZE), fProt, pErrInfo);
+ if (RT_FAILURE(rc))
+ return rc;
+ }
+
+ /* Advance the RVA. */
+ uRva = uSectRva + RT_ALIGN_32(cbMap, cbSectAlign);
+ }
+
+ /*
+ * Check the mapping regions with the image to make sure someone didn't
+ * fill executable code into some gap in the image.
+ */
+ /** @todo not vital. */
+
+
+ /*
+ * Compare executable code. If we're not loaded at the link address, we
+ * need to load base relocations and apply them while making the compare.
+ * A special case
+ */
+ /** @todo not vital. */
+
+
+ return VINF_SUCCESS;
+}
+
+
+/**
+ * Verifies the signature of the given image on disk, then checks if the memory
+ * mapping matches what we verified.
+ *
+ * @returns VBox status code.
+ * @param pThis The process scanning state structure (for the
+ * two scratch buffers).
+ * @param pImage The image data collected during the address
+ * space scan.
+ * @param hProcess Handle to the process.
+ * @param hFile Handle to the image file.
+ * @param pErrInfo Pointer to error info structure. Optional.
+ */
+static int supHardNtVpVerifyImage(PSUPHNTVPSTATE pThis, PSUPHNTVPIMAGE pImage, HANDLE hProcess, PRTERRINFO pErrInfo)
+{
+ /*
+ * Open the image.
+ */
+ HANDLE hFile = RTNT_INVALID_HANDLE_VALUE;
+ IO_STATUS_BLOCK Ios = RTNT_IO_STATUS_BLOCK_INITIALIZER;
+
+ OBJECT_ATTRIBUTES ObjAttr;
+ InitializeObjectAttributes(&ObjAttr, &pImage->Name.UniStr, OBJ_CASE_INSENSITIVE, NULL /*hRootDir*/, NULL /*pSecDesc*/);
+
+ NTSTATUS rcNt = NtCreateFile(&hFile,
+ GENERIC_READ,
+ &ObjAttr,
+ &Ios,
+ NULL /* Allocation Size*/,
+ FILE_ATTRIBUTE_NORMAL,
+ FILE_SHARE_READ,
+ FILE_OPEN,
+ FILE_NON_DIRECTORY_FILE,
+ NULL /*EaBuffer*/,
+ 0 /*EaLength*/);
+ if (NT_SUCCESS(rcNt))
+ rcNt = Ios.Status;
+ if (!NT_SUCCESS(rcNt))
+ return supHardNtVpSetInfo(pErrInfo, VERR_SUP_VP_IMAGE_FILE_OPEN_ERROR,
+ "Error opening image for scanning: %#x (name %ls)", rcNt, pImage->Name.UniStr.Buffer);
+
+ /*
+ * Validate the signature, then make an attempt at comparing memory and
+ * disk content.
+ */
+ int rc = supHardenedWinVerifyImageByHandle(hFile, pImage->Name.UniStr.Buffer,
+ pImage->fDll ? 0 : SUPHNTVI_F_REQUIRE_BUILD_CERT,
+ NULL /*pfCacheable*/, pErrInfo);
+ if (RT_SUCCESS(rc))
+ rc = supHardNtVpVerifyImageCompareMemory(pThis, pImage, hProcess, hFile, pErrInfo);
+
+ /*
+ * Clean up and return.
+ */
+ rcNt = NtClose(hFile);
+ if (!NT_SUCCESS(rcNt) && RT_SUCCESS(rc))
+ rc = supHardNtVpSetInfo(pErrInfo, VERR_SUP_VP_IMAGE_FILE_CLOSE_ERROR,
+ "Error closing image after scanning: %#x (name %ls)", rcNt, pImage->Name.UniStr.Buffer);
+ return rc;
+}
+
+
+/**
+ * Verifies that there is only one thread in the process.
+ *
+ * @returns VBox status code.
+ * @param hProcess The process.
+ * @param hThread The thread.
+ * @param pErrInfo Pointer to error info structure. Optional.
+ */
+static int supHardNtVpThread(HANDLE hProcess, HANDLE hThread, PRTERRINFO pErrInfo)
+{
+ /*
+ * Use the ThreadAmILastThread request to check that there is only one
+ * thread in the process.
+ */
+ ULONG cbIgn = 0;
+ ULONG fAmI = 0;
+ NTSTATUS rcNt = NtQueryInformationThread(hThread, ThreadAmILastThread, &fAmI, sizeof(fAmI), &cbIgn);
+ if (!NT_SUCCESS(rcNt))
+ return supHardNtVpSetInfo(pErrInfo, VERR_SUP_VP_NT_QI_THREAD_ERROR,
+ "NtQueryInformationThread/ThreadAmILastThread -> %#x", rcNt);
+ if (!fAmI)
+ return supHardNtVpSetInfo(pErrInfo, VERR_SUP_VP_THREAD_NOT_ALONE,
+ "More than one thread in process");
+
+ /** @todo Would be nice to verify the relation ship between hProcess and hThread
+ * as well... */
+ return VINF_SUCCESS;
+}
+
+
+#ifndef VBOX_WITHOUT_DEBUGGER_CHECKS
+/**
+ * Verifies that there isn't a debugger attached to the process.
+ *
+ * @returns VBox status code.
+ * @param hProcess The process.
+ * @param pErrInfo Pointer to error info structure. Optional.
+ */
+static int supHardNtVpDebugger(HANDLE hProcess, PRTERRINFO pErrInfo)
+{
+ /*
+ * Use the ProcessDebugPort request to check there is no debugger
+ * currently attached to the process.
+ */
+ ULONG cbIgn = 0;
+ uintptr_t uPtr = ~(uintptr_t)0;
+ NTSTATUS rcNt = NtQueryInformationProcess(hProcess,
+ ProcessDebugPort,
+ &uPtr, sizeof(uPtr), &cbIgn);
+ if (!NT_SUCCESS(rcNt))
+ return supHardNtVpSetInfo(pErrInfo, VERR_SUP_VP_NT_QI_PROCESS_DBG_PORT_ERROR,
+ "NtQueryInformationProcess/ProcessDebugPort -> %#x", rcNt);
+ if (uPtr != 0)
+ return supHardNtVpSetInfo(pErrInfo, VERR_SUP_VP_DEBUGGED,
+ "Debugger attached (%#zx)", uPtr);
+ return VINF_SUCCESS;
+}
+#endif /* !VBOX_WITHOUT_DEBUGGER_CHECKS */
+
+
+/**
+ * Allocates and initalizes a process stat structure for process virtual memory
+ * scanning.
+ *
+ * @returns Pointer to the state structure on success, NULL on failure.
+ * @param pErrInfo Pointer to error info structure. Optional.
+ */
+static PSUPHNTVPSTATE supHardNtVpCreateState(PRTERRINFO pErrInfo)
+{
+ /*
+ * Allocate the memory.
+ */
+ PSUPHNTVPSTATE pThis = (PSUPHNTVPSTATE)suplibHardenedAllocZ(sizeof(*pThis));
+ if (pThis)
+ return pThis;
+ supHardNtVpSetInfo(pErrInfo, VERR_NO_MEMORY, "Failed to allocate %zu bytes for state structures.", sizeof(*pThis));
+ return NULL;
+}
+
+
+/**
+ * Matches two UNICODE_STRING structures in a case sensitive fashion.
+ *
+ * @returns true if equal, false if not.
+ * @param pUniStr1 The first unicode string.
+ * @param pUniStr2 The first unicode string.
+ */
+static bool supHardNtVpAreUniStringsEqual(PCUNICODE_STRING pUniStr1, PCUNICODE_STRING pUniStr2)
+{
+ if (pUniStr1->Length != pUniStr2->Length)
+ return false;
+ return suplibHardenedMemComp(pUniStr1->Buffer, pUniStr2->Buffer, pUniStr1->Length) == 0;
+}
+
+
+/**
+ * Performs a case insensitive comparison of an ASCII and an UTF-16 file name.
+ *
+ * @returns true / false
+ * @param pszName1 The ASCII name.
+ * @param pwszName2 The UTF-16 name.
+ */
+static bool supHardNtVpAreNamesEqual(const char *pszName1, PCRTUTF16 pwszName2)
+{
+ for (;;)
+ {
+ char ch1 = *pszName1++;
+ RTUTF16 wc2 = *pwszName2++;
+ if (ch1 != wc2)
+ {
+ ch1 = RT_C_TO_LOWER(ch1);
+ wc2 = wc2 < 0x80 ? RT_C_TO_LOWER(wc2) : wc2;
+ if (ch1 != wc2)
+ return false;
+ }
+ if (!ch1)
+ return true;
+ }
+}
+
+
+/**
+ * Records an additional memory region for an image.
+ *
+ * @returns VBox status code.
+ * @param pImage The new image structure. Only the unicode name
+ * buffer is valid.
+ * @param pMemInfo The memory information for the image.
+ * @param pErrInfo Pointer to error info structure. Optional.
+ */
+static int supHardNtVpNewImage(PSUPHNTVPIMAGE pImage, PMEMORY_BASIC_INFORMATION pMemInfo, PRTERRINFO pErrInfo)
+{
+ /*
+ * Extract the final component.
+ */
+ unsigned cwcDirName = pImage->Name.UniStr.Length / sizeof(WCHAR);
+ PCRTUTF16 pwszFilename = &pImage->Name.UniStr.Buffer[cwcDirName];
+ while ( cwcDirName > 0
+ && pwszFilename[-1] != '\\'
+ && pwszFilename[-1] != '/'
+ && pwszFilename[-1] != ':')
+ {
+ pwszFilename--;
+ cwcDirName--;
+ }
+ if (!*pwszFilename)
+ return supHardNtVpSetInfo(pErrInfo, VERR_SUP_VP_NO_IMAGE_MAPPING_NAME,
+ "Empty filename (len=%u) for image at %p.", pImage->Name.UniStr.Length, pMemInfo->BaseAddress);
+
+ /*
+ * Drop trailing slashes from the directory name.
+ */
+ while ( cwcDirName > 0
+ && ( pImage->Name.UniStr.Buffer[cwcDirName - 1] == '\\'
+ || pImage->Name.UniStr.Buffer[cwcDirName - 1] == '/'))
+ cwcDirName--;
+
+ /*
+ * Match it against known DLLs.
+ */
+ pImage->pszName = NULL;
+ for (uint32_t i = 0; i < RT_ELEMENTS(g_apszSupNtVpAllowedDlls); i++)
+ if (supHardNtVpAreNamesEqual(g_apszSupNtVpAllowedDlls[i], pwszFilename))
+ {
+ pImage->pszName = g_apszSupNtVpAllowedDlls[i];
+ pImage->fDll = true;
+
+ /* The directory name must match the one we've got for System32. */
+ if ( cwcDirName * sizeof(WCHAR) != g_System32NtPath.UniStr.Length
+ || suplibHardenedMemComp(pImage->Name.UniStr.Buffer,
+ g_System32NtPath.UniStr.Buffer,
+ cwcDirName * sizeof(WCHAR)))
+ return supHardNtVpSetInfo(pErrInfo, VERR_SUP_VP_NON_SYSTEM32_DLL,
+ "Expected %ls to be loaded from %ls.",
+ pImage->Name.UniStr.Buffer, g_System32NtPath.UniStr.Buffer);
+
+ break;
+ }
+ if (!pImage->pszName)
+ {
+ /*
+ * Not a known DLL, executable?
+ */
+ for (uint32_t i = 0; i < RT_ELEMENTS(g_apszSupNtVpAllowedVmExes); i++)
+ if (supHardNtVpAreNamesEqual(g_apszSupNtVpAllowedVmExes[i], pwszFilename))
+ {
+ pImage->pszName = g_apszSupNtVpAllowedVmExes[i];
+ pImage->fDll = false;
+ break;
+ }
+ }
+ if (!pImage->pszName)
+ return supHardNtVpSetInfo(pErrInfo, VERR_SUP_VP_NOT_KNOWN_DLL_OR_EXE,
+ "Unknown image file %ls at %p.", pImage->Name.UniStr.Buffer, pMemInfo->BaseAddress);
+
+ /*
+ * Since it's a new image, we expect to be at the start of the mapping now.
+ */
+ if (pMemInfo->AllocationBase != pMemInfo->BaseAddress)
+ return supHardNtVpSetInfo(pErrInfo, VERR_SUP_VP_IMAGE_MAPPING_BASE_ERROR,
+ "Invalid AllocationBase/BaseAddress for %s: %p vs %p.",
+ pImage->pszName, pMemInfo->AllocationBase, pMemInfo->BaseAddress);
+
+ /*
+ * Check for size/rva overflow.
+ */
+ if (pMemInfo->RegionSize >= _2G)
+ return supHardNtVpSetInfo(pErrInfo, VERR_SUP_VP_TOO_LARGE_REGION,
+ "Region 0 of image %s is too large: %p.", pImage->pszName, pMemInfo->RegionSize);
+
+ /*
+ * Fill in details from the memory info.
+ */
+ pImage->uImageBase = (uintptr_t)pMemInfo->AllocationBase;
+ pImage->cbImage = pMemInfo->RegionSize;
+ pImage->cRegions = 1;
+ pImage->aRegions[0].uRva = 0;
+ pImage->aRegions[0].cb = (uint32_t)pMemInfo->RegionSize;
+ pImage->aRegions[0].fProt = pMemInfo->Protect;
+
+ return VINF_SUCCESS;
+}
+
+
+/**
+ * Records an additional memory region for an image.
+ *
+ * @returns VBox status code.
+ * @param pImage The image.
+ * @param pMemInfo The memory information for the region.
+ * @param pErrInfo Pointer to error info structure. Optional.
+ */
+static int supHardNtVpAddRegion(PSUPHNTVPIMAGE pImage, PMEMORY_BASIC_INFORMATION pMemInfo, PRTERRINFO pErrInfo)
+{
+ /*
+ * Make sure the base address matches.
+ */
+ if (pImage->uImageBase != (uintptr_t)pMemInfo->AllocationBase)
+ return supHardNtVpSetInfo(pErrInfo, VERR_SUPLIB_NT_PROCESS_UNTRUSTED_3,
+ "Base address mismatch for %s: have %p, found %p for region %p LB %#zx.",
+ pImage->pszName, pImage->uImageBase, pMemInfo->AllocationBase,
+ pMemInfo->BaseAddress, pMemInfo->RegionSize);
+
+ /*
+ * Check for size and rva overflows.
+ */
+ uintptr_t uRva = (uintptr_t)pMemInfo->BaseAddress - pImage->uImageBase;
+ if (pMemInfo->RegionSize >= _2G)
+ return supHardNtVpSetInfo(pErrInfo, VERR_SUP_VP_TOO_LARGE_REGION,
+ "Region %u of image %s is too large: %p/%p.", pImage->pszName, pMemInfo->RegionSize, uRva);
+ if (uRva >= _2G)
+ return supHardNtVpSetInfo(pErrInfo, VERR_SUP_VP_TOO_HIGH_REGION_RVA,
+ "Region %u of image %s is too high: %p/%p.", pImage->pszName, pMemInfo->RegionSize, uRva);
+
+
+ /*
+ * Record the region.
+ */
+ uint32_t iRegion = pImage->cRegions;
+ if (iRegion + 1 >= RT_ELEMENTS(pImage->aRegions))
+ return supHardNtVpSetInfo(pErrInfo, VERR_SUP_VP_TOO_MANY_IMAGE_REGIONS,
+ "Too many regions for %s.", pImage->pszName);
+ pImage->aRegions[iRegion].uRva = (uint32_t)uRva;
+ pImage->aRegions[iRegion].cb = (uint32_t)pMemInfo->RegionSize;
+ pImage->aRegions[iRegion].fProt = pMemInfo->Protect;
+ pImage->cbImage = pImage->aRegions[iRegion].uRva + pImage->aRegions[iRegion].cb;
+ pImage->cRegions++;
+
+ return VINF_SUCCESS;
+}
+
+
+/**
+ * Scans the virtual memory of the process.
+ *
+ * This collects the locations of DLLs and the EXE, and verifies that executable
+ * memory is only associated with these.
+ *
+ * @returns VBox status code.
+ * @param pThis The process scanning state structure. Details
+ * about images are added to this.
+ * @param hProcess The process to verify.
+ * @param pErrInfo Pointer to error info structure. Optional.
+ */
+static int supHardNtVpScanVirtualMemory(PSUPHNTVPSTATE pThis, HANDLE hProcess, PRTERRINFO pErrInfo)
+{
+ uint32_t cXpExceptions = 0;
+ uintptr_t cbAdvance = 0;
+ uintptr_t uPtrWhere = 0;
+ for (uint32_t i = 0; i < 1024; i++)
+ {
+ SIZE_T cbActual = 0;
+ MEMORY_BASIC_INFORMATION MemInfo = { 0, 0, 0, 0, 0, 0, 0 };
+ NTSTATUS rcNt = g_pfnNtQueryVirtualMemory(hProcess,
+ (void const *)uPtrWhere,
+ MemoryBasicInformation,
+ &MemInfo,
+ sizeof(MemInfo),
+ &cbActual);
+ if (!NT_SUCCESS(rcNt))
+ {
+ if (rcNt == STATUS_INVALID_PARAMETER)
+ return VINF_SUCCESS;
+ return supHardNtVpSetInfo(pErrInfo, VERR_SUP_VP_NT_QI_VIRTUAL_MEMORY_ERROR,
+ "NtQueryVirtualMemory failed for %p: %#x", uPtrWhere, rcNt);
+ }
+
+ /*
+ * Record images.
+ */
+ if ( MemInfo.Type == SEC_IMAGE
+ || MemInfo.Type == SEC_PROTECTED_IMAGE
+ || MemInfo.Type == (SEC_IMAGE | SEC_PROTECTED_IMAGE))
+ {
+ uint32_t iImg = pThis->cImages;
+ rcNt = g_pfnNtQueryVirtualMemory(hProcess,
+ (void const *)uPtrWhere,
+ MemorySectionName,
+ &pThis->aImages[iImg].Name,
+ sizeof(pThis->aImages[iImg].Name) - sizeof(WCHAR),
+ &cbActual);
+ if (!NT_SUCCESS(rcNt))
+ return supHardNtVpSetInfo(pErrInfo, VERR_SUP_VP_NT_QI_VIRTUAL_MEMORY_NM_ERROR,
+ "NtQueryVirtualMemory/MemorySectionName failed for %p: %#x", uPtrWhere, rcNt);
+ pThis->aImages[iImg].Name.UniStr.Buffer[pThis->aImages[iImg].Name.UniStr.Length / sizeof(WCHAR)] = '\0';
+
+ /* New or existing image? */
+ bool fNew = true;
+ uint32_t iSearch = iImg;
+ while (iSearch-- > 0)
+ if (supHardNtVpAreUniStringsEqual(&pThis->aImages[iSearch].Name.UniStr, &pThis->aImages[iImg].Name.UniStr))
+ {
+ int rc = supHardNtVpAddRegion(&pThis->aImages[iSearch], &MemInfo, pErrInfo);
+ if (RT_FAILURE(rc))
+ return rc;
+ fNew = false;
+ break;
+ }
+ else if (pThis->aImages[iSearch].uImageBase == (uintptr_t)MemInfo.AllocationBase)
+ return supHardNtVpSetInfo(pErrInfo, VERR_SUP_VP_NT_MAPPING_NAME_CHANGED,
+ "Unexpected base address match");
+
+ if (fNew)
+ {
+ int rc = supHardNtVpNewImage(&pThis->aImages[iImg], &MemInfo, pErrInfo);
+ if (RT_FAILURE(rc))
+ return rc;
+ pThis->cImages++;
+ if (pThis->cImages >= RT_ELEMENTS(pThis->aImages))
+ return supHardNtVpSetInfo(pErrInfo, VERR_SUP_VP_TOO_MANY_DLLS_LOADED,
+ "Internal error: aImages is full.\n");
+ }
+ }
+ /*
+ * XP, W2K3: Ignore the CSRSS read-only region as best we can.
+ */
+ else if ( (MemInfo.Protect & (PAGE_EXECUTE | PAGE_EXECUTE_READ | PAGE_EXECUTE_READWRITE | PAGE_EXECUTE_WRITECOPY))
+ == PAGE_EXECUTE_READ
+ && cXpExceptions == 0
+ && (uintptr_t)MemInfo.BaseAddress >= UINT32_C(0x78000000)
+ /* && MemInfo.BaseAddress == pPeb->ReadOnlySharedMemoryBase */
+ && g_uNtVerCombined < SUP_MAKE_NT_VER_SIMPLE(6, 0) )
+ cXpExceptions++;
+ /*
+ * Executable memory?
+ */
+ else if (MemInfo.Protect & (PAGE_EXECUTE | PAGE_EXECUTE_READ | PAGE_EXECUTE_READWRITE | PAGE_EXECUTE_WRITECOPY))
+ return supHardNtVpSetInfo(pErrInfo, VERR_SUP_VP_FOUND_EXEC_MEMORY,
+ "Found executable memory at %p (%p LB %#zx): type=%#x prot=%#x state=%#x aprot=%#x abase=%p",
+ uPtrWhere,
+ MemInfo.BaseAddress,
+ MemInfo.RegionSize,
+ MemInfo.Type,
+ MemInfo.Protect,
+ MemInfo.State,
+ MemInfo.AllocationBase,
+ MemInfo.AllocationProtect);
+
+ /*
+ * Advance.
+ */
+ cbAdvance = MemInfo.RegionSize;
+ if (uPtrWhere + cbAdvance <= uPtrWhere)
+ return supHardNtVpSetInfo(pErrInfo, VERR_SUP_VP_EMPTY_REGION_TOO_LARGE,
+ "Empty region at %p.", uPtrWhere);
+ uPtrWhere += MemInfo.RegionSize;
+ }
+
+ return supHardNtVpSetInfo(pErrInfo, VERR_SUP_VP_TOO_MANY_MEMORY_REGIONS,
+ "Too many virtual memory regions.\n");
+}
+
+
+/**
+ * Check the integrity of the executable of the process.
+ *
+ * @returns VBox status code.
+ * @param pThis The process scanning state structure. Details
+ * about images are added to this.
+ * @param hProcess The process to verify.
+ * @param pErrInfo Pointer to error info structure. Optional.
+ */
+static int supHardNtVpCheckExe(PSUPHNTVPSTATE pThis, HANDLE hProcess, PRTERRINFO pErrInfo)
+{
+ /*
+ * Make sure there is exactly one executable image.
+ */
+ unsigned cExecs = 0;
+ unsigned iExe = ~0U;
+ unsigned i = pThis->cImages;
+ while (i-- > 0)
+ {
+ if (!pThis->aImages[i].fDll)
+ {
+ cExecs++;
+ iExe = i;
+ }
+ }
+ if (cExecs == 0)
+ return supHardNtVpSetInfo(pErrInfo, VERR_SUP_VP_NO_FOUND_NO_EXE_MAPPING,
+ "No executable mapping found in the virtual address space.");
+ if (cExecs != 1)
+ return supHardNtVpSetInfo(pErrInfo, VERR_SUP_VP_FOUND_MORE_THAN_ONE_EXE_MAPPING,
+ "Found more than one executable mapping in the virtual address space.");
+ PSUPHNTVPIMAGE pImage = &pThis->aImages[iExe];
+
+ /*
+ * Check that it matches the executable image of the process.
+ */
+ int rc;
+ ULONG cbUniStr = sizeof(UNICODE_STRING) + RTPATH_MAX * sizeof(RTUTF16);
+ PUNICODE_STRING pUniStr = (PUNICODE_STRING)suplibHardenedAllocZ(cbUniStr);
+ if (!pUniStr)
+ return supHardNtVpSetInfo(pErrInfo, VERR_SUP_VP_NO_MEMORY,
+ "Error allocating %zu bytes for process name.", cbUniStr);
+ ULONG cbIgn = 0;
+ NTSTATUS rcNt = NtQueryInformationProcess(hProcess, ProcessImageFileName, pUniStr, cbUniStr - sizeof(WCHAR), &cbIgn);
+ if (NT_SUCCESS(rcNt))
+ {
+ if (supHardNtVpAreUniStringsEqual(pUniStr, &pImage->Name.UniStr))
+ rc = VINF_SUCCESS;
+ else
+ {
+ pUniStr->Buffer[pUniStr->Length / sizeof(WCHAR)] = '\0';
+ rc = supHardNtVpSetInfo(pErrInfo, VERR_SUP_VP_EXE_VS_PROC_NAME_MISMATCH,
+ "Process image name does not match the exectuable we found: %ls vs %ls.",
+ pUniStr->Buffer, pImage->Name.UniStr.Buffer);
+ }
+ }
+ else
+ rc = supHardNtVpSetInfo(pErrInfo, VERR_SUP_VP_NT_QI_PROCESS_NM_ERROR,
+ "NtQueryInformationProcess/ProcessImageFileName failed: %#x", rcNt);
+ suplibHardenedFree(pUniStr);
+ if (RT_FAILURE(rc))
+ return rc;
+
+ /*
+ * Validate the signing of the executable image.
+ * This will load the fDllCharecteristics and fImageCharecteristics members we use below.
+ */
+ rc = supHardNtVpVerifyImage(pThis, pImage, hProcess, pErrInfo);
+ if (RT_FAILURE(rc))
+ return rc;
+
+ /*
+ * Check linking requirements.
+ */
+ SECTION_IMAGE_INFORMATION ImageInfo;
+ rcNt = NtQueryInformationProcess(hProcess, ProcessImageInformation, &ImageInfo, sizeof(ImageInfo), NULL);
+ if (!NT_SUCCESS(rcNt))
+ return supHardNtVpSetInfo(pErrInfo, VERR_SUP_VP_NT_QI_PROCESS_IMG_INFO_ERROR,
+ "NtQueryInformationProcess/ProcessImageInformation failed: %#x", rcNt);
+ if ( !(ImageInfo.DllCharacteristics & IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY))
+ return supHardNtVpSetInfo(pErrInfo, VERR_SUP_VP_EXE_MISSING_FORCE_INTEGRITY,
+ "EXE DllCharacteristics=%#x, expected IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY to be set.",
+ ImageInfo.DllCharacteristics);
+ if (!(ImageInfo.DllCharacteristics & IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE))
+ return supHardNtVpSetInfo(pErrInfo, VERR_SUP_VP_EXE_MISSING_DYNAMIC_BASE,
+ "EXE DllCharacteristics=%#x, expected IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE to be set.",
+ ImageInfo.DllCharacteristics);
+ if (!(ImageInfo.DllCharacteristics & IMAGE_DLLCHARACTERISTICS_NX_COMPAT))
+ return supHardNtVpSetInfo(pErrInfo, VERR_SUP_VP_EXE_MISSING_NX_COMPAT,
+ "EXE DllCharacteristics=%#x, expected IMAGE_DLLCHARACTERISTICS_NX_COMPAT to be set.",
+ ImageInfo.DllCharacteristics);
+
+ if (pImage->fDllCharecteristics != ImageInfo.DllCharacteristics)
+ return supHardNtVpSetInfo(pErrInfo, VERR_SUP_VP_DLL_CHARECTERISTICS_MISMATCH,
+ "EXE Info.DllCharacteristics=%#x fDllCharecteristics=%#x.",
+ ImageInfo.DllCharacteristics, pImage->fDllCharecteristics);
+
+ if (pImage->fImageCharecteristics != ImageInfo.ImageCharacteristics)
+ return supHardNtVpSetInfo(pErrInfo, VERR_SUP_VP_DLL_CHARECTERISTICS_MISMATCH,
+ "EXE Info.ImageCharacteristics=%#x fImageCharecteristics=%#x.",
+ ImageInfo.ImageCharacteristics, pImage->fImageCharecteristics);
+
+ return VINF_SUCCESS;
+}
+
+
+/**
+ * Check the integrity of the DLLs found in the process.
+ *
+ * @returns VBox status code.
+ * @param pThis The process scanning state structure. Details
+ * about images are added to this.
+ * @param hProcess The process to verify.
+ * @param pErrInfo Pointer to error info structure. Optional.
+ */
+static int supHardNtVpCheckDlls(PSUPHNTVPSTATE pThis, HANDLE hProcess, PRTERRINFO pErrInfo)
+{
+ /*
+ * Check for duplicate entries.
+ */
+ uint32_t i = pThis->cImages;
+ while (i-- > 1)
+ {
+ const char *pszName = pThis->aImages[i].pszName;
+ uint32_t j = i;
+ while (j-- > 0)
+ if (pThis->aImages[j].pszName == pszName)
+ return supHardNtVpSetInfo(pErrInfo, VERR_SUP_VP_DUPLICATE_DLL_MAPPING,
+ "Duplicate image entries for %s: %ls and %ls",
+ pszName, pThis->aImages[i].Name.UniStr.Buffer, pThis->aImages[j].Name.UniStr.Buffer);
+ }
+
+ /*
+ * Check that both ntdll and kernel32 are present.
+ * ASSUMES the entries in g_apszSupNtVpAllowedDlls are all lower case.
+ */
+ uint32_t iNtDll = UINT32_MAX;
+ uint32_t iKernel32 = UINT32_MAX;
+ uint32_t iApiSetSchema = UINT32_MAX;
+ i = pThis->cImages;
+ while (i-- > 0)
+ if (suplibHardenedStrCmp(pThis->aImages[i].pszName, "ntdll.dll") == 0)
+ iNtDll = i;
+ else if (suplibHardenedStrCmp(pThis->aImages[i].pszName, "kernel32.dll") == 0)
+ iKernel32 = i;
+ else if (suplibHardenedStrCmp(pThis->aImages[i].pszName, "apisetschema.dll") == 0)
+ iApiSetSchema = i;
+ if (iNtDll == UINT32_MAX)
+ return supHardNtVpSetInfo(pErrInfo, VERR_SUP_VP_NO_NTDLL_MAPPING,
+ "The process has no NTDLL.DLL.");
+ if (iKernel32 == UINT32_MAX)
+ return supHardNtVpSetInfo(pErrInfo, VERR_SUP_VP_NO_KERNEL32_MAPPING,
+ "The process has no KERNEL32.DLL.");
+
+
+ /*
+ * Verify that the DLLs are correctly signed (by MS).
+ */
+ i = pThis->cImages;
+ while (i-- > 0)
+ {
+ pThis->aImages[i].fNtCreateSectionPatch = i == iNtDll;
+ pThis->aImages[i].fApiSetSchemaOnlySection1 = i == iApiSetSchema && pThis->aImages[i].cRegions == 1;
+
+ int rc = supHardNtVpVerifyImage(pThis, &pThis->aImages[i], hProcess, pErrInfo);
+ if (RT_FAILURE(rc))
+ return rc;
+ }
+
+ return VINF_SUCCESS;
+}
+
+
+/**
+ * Verifies the given process.
+ *
+ * The following requirements are checked:
+ * - The process only has one thread, the calling thread.
+ * - The process has no debugger attached.
+ * - The executable image of the process is verified to be signed with
+ * certificate known to this code at build time.
+ * - The executable image is one of a predefined set.
+ * - The process has only a very limited set of system DLLs loaded.
+ * - The system DLLs signatures check out fine.
+ * - The only executable memory in the process belongs to the system DLLs and
+ * the executable image.
+ *
+ * @returns VBox status code.
+ * @param hProcess The process to verify.
+ * @param hThread A thread in the process (the caller).
+ * @param pErrInfo Pointer to error info structure. Optional.
+ */
+DECLHIDDEN(int) supHardenedWinVerifyProcess(HANDLE hProcess, HANDLE hThread, PRTERRINFO pErrInfo)
+{
+ int rc = supHardNtVpThread(hProcess, hThread, pErrInfo);
+#ifndef VBOX_WITHOUT_DEBUGGER_CHECKS
+ if (RT_SUCCESS(rc))
+ rc = supHardNtVpDebugger(hProcess, pErrInfo);
+#endif
+ if (RT_SUCCESS(rc))
+ {
+ PSUPHNTVPSTATE pThis = supHardNtVpCreateState(pErrInfo);
+ if (pThis)
+ {
+ rc = supHardNtVpScanVirtualMemory(pThis, hProcess, pErrInfo);
+ if (RT_SUCCESS(rc))
+ rc = supHardNtVpCheckExe(pThis, hProcess, pErrInfo);
+ if (RT_SUCCESS(rc))
+ rc = supHardNtVpCheckDlls(pThis, hProcess, pErrInfo);
+
+ suplibHardenedFree(pThis);
+ }
+ else
+ rc = VERR_SUP_VP_NO_MEMORY_STATE;
+ }
+ return rc;
+}
+
diff --git a/src/VBox/HostDrivers/Support/win/SUPLib-win.cpp b/src/VBox/HostDrivers/Support/win/SUPLib-win.cpp
index 336724548c9..3881efa76aa 100644
--- a/src/VBox/HostDrivers/Support/win/SUPLib-win.cpp
+++ b/src/VBox/HostDrivers/Support/win/SUPLib-win.cpp
@@ -30,6 +30,7 @@
#define LOG_GROUP LOG_GROUP_SUP
#ifdef IN_SUP_HARDENED_R3
# undef DEBUG /* Warning: disables RT_STRICT */
+# undef LOG_DISABLED
# define LOG_DISABLED
/** @todo RTLOGREL_DISABLED */
# include <iprt/log.h>
@@ -38,11 +39,7 @@
#endif
#define USE_NT_DEVICE_IO_CONTROL_FILE
-#ifdef USE_NT_DEVICE_IO_CONTROL_FILE
-# include <iprt/nt/nt-and-windows.h>
-#else
-# include <Windows.h>
-#endif
+#include <iprt/nt/nt-and-windows.h>
#include <VBox/sup.h>
#include <VBox/types.h>
@@ -54,6 +51,9 @@
#include <iprt/string.h>
#include "../SUPLibInternal.h"
#include "../SUPDrvIOC.h"
+#ifdef VBOX_WITH_HARDENING
+# include "win/SUPHardenedVerify-win.h"
+#endif
/*******************************************************************************
@@ -74,11 +74,13 @@
/*******************************************************************************
* Internal Functions *
*******************************************************************************/
+#ifndef IN_SUP_HARDENED_R3
static int suplibOsCreateService(void);
//unused: static int suplibOsUpdateService(void);
static int suplibOsDeleteService(void);
static int suplibOsStartService(void);
static int suplibOsStopService(void);
+#endif
#ifdef USE_NT_DEVICE_IO_CONTROL_FILE
static int suplibConvertNtStatus(NTSTATUS rcNt);
#else
@@ -86,64 +88,104 @@ static int suplibConvertWin32Err(int);
#endif
-
-
int suplibOsInit(PSUPLIBDATA pThis, bool fPreInited, bool fUnrestricted)
{
/*
- * Nothing to do if pre-inited.
+ * Almost nothing to do if pre-inited.
*/
if (fPreInited)
+ {
+#if defined(VBOX_WITH_HARDENING) && !defined(IN_SUP_HARDENED_R3)
+# ifdef IN_SUP_R3_STATIC
+ return VERR_NOT_SUPPORTED;
+# else
+ supR3HardenedWinInitVersion();
+ return supHardenedWinInitImageVerifier(NULL);
+# endif
+#else
return VINF_SUCCESS;
+#endif
+ }
/*
* Try open the device.
*/
- HANDLE hDevice = CreateFile(fUnrestricted ? DEVICE_NAME_SYS : DEVICE_NAME_USR,
- GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,
- NULL,
- OPEN_EXISTING,
- FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
- NULL);
- if (hDevice == INVALID_HANDLE_VALUE)
- {
#ifndef IN_SUP_HARDENED_R3
- /*
- * Try start the service and retry opening it.
- */
- suplibOsStartService();
-
- hDevice = CreateFile(fUnrestricted ? DEVICE_NAME_SYS : DEVICE_NAME_USR,
- GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,
- NULL,
- OPEN_EXISTING,
- FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
- NULL);
- if (hDevice == INVALID_HANDLE_VALUE)
-#endif /* !IN_SUP_HARDENED_R3 */
+ uint32_t cTry = 0;
+#endif
+ HANDLE hDevice;
+ for (;;)
+ {
+ IO_STATUS_BLOCK Ios = RTNT_IO_STATUS_BLOCK_INITIALIZER;
+
+ static const WCHAR s_wszName[] = L"\\Device\\VBoxDrvU";
+ UNICODE_STRING NtName;
+ NtName.Buffer = (PWSTR)s_wszName;
+ NtName.Length = sizeof(s_wszName) - sizeof(WCHAR) * (fUnrestricted ? 2 : 1);
+ NtName.MaximumLength = NtName.Length;
+
+ OBJECT_ATTRIBUTES ObjAttr;
+ InitializeObjectAttributes(&ObjAttr, &NtName, OBJ_CASE_INSENSITIVE, NULL /*hRootDir*/, NULL /*pSecDesc*/);
+
+ hDevice = RTNT_INVALID_HANDLE_VALUE;
+
+ NTSTATUS rcNt = NtCreateFile(&hDevice,
+ GENERIC_READ | GENERIC_WRITE,
+ &ObjAttr,
+ &Ios,
+ NULL /* Allocation Size*/,
+ FILE_ATTRIBUTE_NORMAL,
+ FILE_SHARE_READ | FILE_SHARE_WRITE,
+ FILE_OPEN,
+ FILE_NON_DIRECTORY_FILE,
+ NULL /*EaBuffer*/,
+ 0 /*EaLength*/);
+ if (NT_SUCCESS(rcNt))
+ rcNt = Ios.Status;
+ if (!NT_SUCCESS(rcNt))
{
- int rc = GetLastError();
- switch (rc)
+#ifndef IN_SUP_HARDENED_R3
+ /*
+ * Failed to open, try starting the service and reopen the device
+ * exactly once.
+ */
+ if (cTry == 0 && !NT_SUCCESS(rcNt))
+ {
+ cTry++;
+ suplibOsStartService();
+ continue;
+ }
+#endif
+ switch (rcNt)
{
/** @todo someone must test what is actually returned. */
- case ERROR_DEV_NOT_EXIST:
- case ERROR_DEVICE_NOT_CONNECTED:
- case ERROR_BAD_DEVICE:
- case ERROR_DEVICE_REMOVED:
- case ERROR_DEVICE_NOT_AVAILABLE:
+ case STATUS_DEVICE_DOES_NOT_EXIST:
+ case STATUS_DEVICE_NOT_CONNECTED:
+ //case ERROR_BAD_DEVICE:
+ case STATUS_DEVICE_REMOVED:
+ //case ERROR_DEVICE_NOT_AVAILABLE:
return VERR_VM_DRIVER_LOAD_ERROR;
- case ERROR_PATH_NOT_FOUND:
- case ERROR_FILE_NOT_FOUND:
+ case STATUS_OBJECT_PATH_NOT_FOUND:
+ case STATUS_NO_SUCH_DEVICE:
+ case STATUS_NO_SUCH_FILE:
+ case STATUS_OBJECT_NAME_NOT_FOUND:
return VERR_VM_DRIVER_NOT_INSTALLED;
- case ERROR_ACCESS_DENIED:
- case ERROR_SHARING_VIOLATION:
+ case STATUS_ACCESS_DENIED:
+ case STATUS_SHARING_VIOLATION:
return VERR_VM_DRIVER_NOT_ACCESSIBLE;
+ case STATUS_UNSUCCESSFUL:
+ return VERR_SUPLIB_NT_PROCESS_UNTRUSTED_0;
+ case STATUS_TRUST_FAILURE:
+ return VERR_SUPLIB_NT_PROCESS_UNTRUSTED_1;
+ case STATUS_TOO_LATE:
+ return VERR_SUPDRV_HARDENING_EVIL_HANDLE;
default:
+
+ return rcNt;
return VERR_VM_DRIVER_OPEN_ERROR;
}
-
- return -1 /** @todo define proper error codes for suplibOsInit failure. */;
}
+ break;
}
/*
@@ -154,7 +196,6 @@ int suplibOsInit(PSUPLIBDATA pThis, bool fPreInited, bool fUnrestricted)
return VINF_SUCCESS;
}
-
#ifndef IN_SUP_HARDENED_R3
int suplibOsInstall(void)
@@ -439,7 +480,9 @@ static int suplibOsStartService(void)
*/
fRc = StartService(hService, 0, NULL);
DWORD LastError = GetLastError(); NOREF(LastError);
+#ifndef DEBUG_bird
AssertMsg(fRc, ("StartService failed with LastError=%Rwa\n", LastError));
+#endif
}
/*
@@ -651,6 +694,10 @@ static int suplibConvertNtStatus(NTSTATUS rcNt)
case STATUS_REVISION_MISMATCH: return VERR_VERSION_MISMATCH;
}
+ /* See VBoxDrvNtErr2NtStatus. */
+ if (((uint32_t)rcNt & 0xffff0000) == UINT32_C(0xe9860000)) /** @todo defines for these? */
+ return (int)((uint32_t)rcNt | UINT32_C(0xffff0000));
+
/* Fall back on IPRT for the rest. */
return RTErrConvertFromNtStatus(rcNt);
}
diff --git a/src/VBox/HostDrivers/Support/win/SUPR3HardenedMain-win.cpp b/src/VBox/HostDrivers/Support/win/SUPR3HardenedMain-win.cpp
new file mode 100644
index 00000000000..2700b778c14
--- /dev/null
+++ b/src/VBox/HostDrivers/Support/win/SUPR3HardenedMain-win.cpp
@@ -0,0 +1,1650 @@
+/* $Id$ */
+/** @file
+ * VirtualBox Support Library - Hardened main(), windows bits.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include <iprt/nt/nt-and-windows.h>
+#include <AccCtrl.h>
+#include <AclApi.h>
+#ifndef PROCESS_SET_LIMITED_INFORMATION
+# define PROCESS_SET_LIMITED_INFORMATION 0x2000
+#endif
+#ifndef LOAD_LIBRARY_SEARCH_APPLICATION_DIR
+# define LOAD_LIBRARY_SEARCH_APPLICATION_DIR 0x200
+# define LOAD_LIBRARY_SEARCH_SYSTEM32 0x800
+#endif
+
+#include <VBox/sup.h>
+#include <VBox/err.h>
+#include <iprt/ctype.h>
+#include <iprt/string.h>
+#include <iprt/initterm.h>
+#include <iprt/param.h>
+
+#include "SUPLibInternal.h"
+#include "win/SUPHardenedVerify-win.h"
+
+
+/*******************************************************************************
+* Defined Constants And Macros *
+*******************************************************************************/
+/** The first argument of a respawed stub argument.
+ * This just needs to be unique enough to avoid most confusion with real
+ * executable names, there are other checks in place to make sure we've respanwed. */
+#define SUPR3_RESPAWN_ARG0 "81954AF5-4D2F-31EB-A142-B7AF187A1C41-suplib-2ndchild"
+
+/** Unconditional assertion. */
+#define SUPR3HARDENED_ASSERT(a_Expr) \
+ do { \
+ if (!(a_Expr)) \
+ supR3HardenedFatal("%s: %s", __FUNCTION__, #a_Expr); \
+ } while (0)
+
+/** Unconditional assertion of NT_SUCCESS. */
+#define SUPR3HARDENED_ASSERT_NT_SUCCESS(a_Expr) \
+ do { \
+ NTSTATUS rcNtAssert = (a_Expr); \
+ if (!NT_SUCCESS(rcNtAssert)) \
+ supR3HardenedFatal("%s: %s -> %#x", __FUNCTION__, #a_Expr, rcNtAssert); \
+ } while (0)
+
+/** Unconditional assertion of a WIN32 API returning non-FALSE. */
+#define SUPR3HARDENED_ASSERT_WIN32_SUCCESS(a_Expr) \
+ do { \
+ BOOL fRcAssert = (a_Expr); \
+ if (fRcAssert == FALSE) \
+ supR3HardenedFatal("%s: %s -> %#x", __FUNCTION__, #a_Expr, GetLastError()); \
+ } while (0)
+
+
+/*******************************************************************************
+* Structures and Typedefs *
+*******************************************************************************/
+/**
+ * Security descriptor cleanup structure.
+ */
+typedef struct MYSECURITYCLEANUP
+{
+ union
+ {
+ SID Sid;
+ uint8_t abPadding[SECURITY_MAX_SID_SIZE];
+ } Everyone, Owner, User, Login;
+ union
+ {
+ ACL AclHdr;
+ uint8_t abPadding[1024];
+ } Acl;
+ PSECURITY_DESCRIPTOR pSecDesc;
+} MYSECURITYCLEANUP;
+/** Pointer to security cleanup structure. */
+typedef MYSECURITYCLEANUP *PMYSECURITYCLEANUP;
+
+
+/**
+ * Image verifier cache entry.
+ */
+typedef struct VERIFIERCACHEENTRY
+{
+ /** Pointer to the next entry with the same hash value. */
+ struct VERIFIERCACHEENTRY * volatile pNext;
+ /** The file handle. */
+ HANDLE hFile;
+ /** If fIndexNumber is set, this is an file system internal file identifier. */
+ LARGE_INTEGER IndexNumber;
+ /** The path hash value. */
+ uint32_t uHash;
+ /** The verification result. */
+ int rc;
+ /** Whether IndexNumber is valid */
+ bool fIndexNumberValid;
+ /** cwcPath * sizeof(RTUTF16). */
+ uint16_t cbPath;
+ /** The full path of this entry (variable size). */
+ RTUTF16 wszPath[1];
+} VERIFIERCACHEENTRY;
+/** Pointer to an image verifier path entry. */
+typedef VERIFIERCACHEENTRY *PVERIFIERCACHEENTRY;
+
+
+/*******************************************************************************
+* Global Variables *
+*******************************************************************************/
+/** @name Global variables initialized by suplibHardenedWindowsMain.
+ * @{ */
+/** Combined windows NT version number. See SUP_MAKE_NT_VER_COMBINED. */
+uint32_t g_uNtVerCombined = 0;
+/** Count calls to the special main function for linking santity checks. */
+static uint32_t volatile g_cSuplibHardenedWindowsMainCalls;
+/** The UTF-16 windows path to the executable. */
+RTUTF16 g_wszSupLibHardenedExePath[1024];
+/** The NT path of the executable. */
+SUPSYSROOTDIRBUF g_SupLibHardenedExeNtPath;
+/** The offset into g_SupLibHardenedExeNtPath of the executable name (WCHAR,
+ * not byte). This also gives the length of the exectuable directory path,
+ * including a trailing slash. */
+uint32_t g_offSupLibHardenedExeNtName;
+/** @} */
+
+/** @name Hook related variables.
+ * @{ */
+/** The jump back address of the patched NtCreateSection. */
+extern "C" PFNRT g_pfnNtCreateSectionJmpBack = NULL;
+/** Pointer to the bit of assembly code that will perform the original
+ * NtCreateSection operation. */
+static NTSTATUS (NTAPI * g_pfnNtCreateSectionReal)(PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES,
+ PLARGE_INTEGER, ULONG, ULONG, HANDLE);
+/** The hash table of verifier cache . */
+static VERIFIERCACHEENTRY * volatile g_apVerifierCache[128];
+/** @ */
+
+/** Static error info structure used during init. */
+static RTERRINFOSTATIC g_ErrInfoStatic;
+
+
+/*******************************************************************************
+* Internal Functions *
+*******************************************************************************/
+#ifdef RT_ARCH_AMD64
+# define SYSCALL(a_Num) DECLASM(void) RT_CONCAT(supR3HardenedJmpBack_NtCreateSection_,a_Num)(void)
+# include "NtCreateSection-template-amd64-syscall-type-1.h"
+# undef SYSCALL
+#endif
+#ifdef RT_ARCH_X86
+# define SYSCALL(a_Num) DECLASM(void) RT_CONCAT(supR3HardenedJmpBack_NtCreateSection_,a_Num)(void)
+# include "NtCreateSection-template-x86-syscall-type-1.h"
+# undef SYSCALL
+#endif
+
+
+
+/**
+ * Simple wide char search routine.
+ *
+ * @returns Pointer to the first location of @a wcNeedle in @a pwszHaystack.
+ * NULL if not found.
+ * @param pwszHaystack Pointer to the string that should be searched.
+ * @param wcNeedle The character to search for.
+ */
+static PRTUTF16 suplibHardenedWStrChr(PCRTUTF16 pwszHaystack, RTUTF16 wcNeedle)
+{
+ for (;;)
+ {
+ RTUTF16 wcCur = *pwszHaystack;
+ if (wcCur == wcNeedle)
+ return (PRTUTF16)pwszHaystack;
+ if (wcCur == '\0')
+ return NULL;
+ pwszHaystack++;
+ }
+}
+
+
+/**
+ * Simple wide char string length routine.
+ *
+ * @returns The number of characters in the given string. (Excludes the
+ * terminator.)
+ * @param pwsz The string.
+ */
+static size_t suplibHardenedWStrLen(PCRTUTF16 pwsz)
+{
+ PCRTUTF16 pwszCur = pwsz;
+ while (*pwszCur != '\0')
+ pwszCur++;
+ return pwszCur - pwsz;
+}
+
+
+/**
+ * Allocate zero filled memory on the heap.
+ *
+ * @returns Pointer to the memory. Will never return NULL, triggers a fatal
+ * error instead.
+ * @param cb The number of bytes to allocate.
+ */
+DECLHIDDEN(void *) suplibHardenedAllocZ(size_t cb)
+{
+ void *pv = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, cb);
+ if (!pv)
+ supR3HardenedFatal("HeapAlloc failed to allocate %zu bytes.\n", cb);
+ return pv;
+}
+
+
+/**
+ * Reallocates memory on the heap.
+ *
+ * @returns Pointer to the resized memory block. Will never return NULL,
+ * triggers a fatal error instead.
+ * @param pvOld The old memory block.
+ * @param cbNew The new block size.
+ */
+DECLHIDDEN(void *) suplibHardenedReAlloc(void *pvOld, size_t cbNew)
+{
+ if (!pvOld)
+ return suplibHardenedAllocZ(cbNew);
+ void *pv = HeapReAlloc(GetProcessHeap(), 0 /*dwFlags*/, pvOld, cbNew);
+ if (!pv)
+ supR3HardenedFatal("HeapReAlloc failed to allocate %zu bytes.\n", cbNew);
+ return pv;
+}
+
+
+/**
+ * Frees memory allocated by suplibHardenedAlloc, suplibHardenedAllocZ or
+ * suplibHardenedReAlloc.
+ *
+ * @param pv Pointer to the memeory to be freed.
+ */
+DECLHIDDEN(void) suplibHardenedFree(void *pv)
+{
+ if (pv)
+ HeapFree(GetProcessHeap(), 0 /* dwFlags*/, pv);
+}
+
+
+/**
+ * Wrapper around LoadLibraryEx that deals with the UTF-8 to UTF-16 conversion
+ * and supplies the right flags.
+ *
+ * @returns Module handle on success, NULL on failure.
+ * @param pszName The full path to the DLL.
+ * @param fSystem32Only Whether to only look for imports in the system32
+ * directory. If set to false, the application
+ * directory is also searched.
+ */
+DECLHIDDEN(void *) supR3HardenedWinLoadLibrary(const char *pszName, bool fSystem32Only)
+{
+ WCHAR wszPath[RTPATH_MAX];
+ PRTUTF16 pwszPath = wszPath;
+ int rc = RTStrToUtf16Ex(pszName, RTSTR_MAX, &pwszPath, RT_ELEMENTS(wszPath), NULL);
+ if (RT_SUCCESS(rc))
+ {
+ while (*pwszPath)
+ {
+ if (*pwszPath == '/')
+ *pwszPath = '\\';
+ pwszPath++;
+ }
+
+ DWORD fFlags = 0;
+ if (g_uNtVerCombined >= SUP_MAKE_NT_VER_SIMPLE(6, 0))
+ {
+ fFlags |= LOAD_LIBRARY_SEARCH_SYSTEM32;
+ if (!fSystem32Only)
+ fFlags |= LOAD_LIBRARY_SEARCH_APPLICATION_DIR;
+ }
+
+ void *pvRet = (void *)LoadLibraryExW(wszPath, NULL /*hFile*/, fFlags);
+
+ /* Vista, W7, W2K8R might not work without KB2533623, so retry with no flags. */
+ if ( !pvRet
+ && fFlags
+ && g_uNtVerCombined < SUP_MAKE_NT_VER_SIMPLE(6, 2)
+ && GetLastError() == ERROR_INVALID_PARAMETER)
+ pvRet = (void *)LoadLibraryExW(wszPath, NULL /*hFile*/, 0);
+
+ return pvRet;
+ }
+ supR3HardenedFatal("RTStrToUtf16Ex failed on '%s': %Rrc", pszName, rc);
+ return NULL;
+}
+
+
+/**
+ * Gets the internal index number of the file.
+ *
+ * @returns True if we got an index number, false if not.
+ * @param hFile The file in question.
+ * @param pIndexNumber where to return the index number.
+ */
+static bool supR3HardenedWinVerifyCacheGetIndexNumber(HANDLE hFile, PLARGE_INTEGER pIndexNumber)
+{
+ IO_STATUS_BLOCK Ios = RTNT_IO_STATUS_BLOCK_INITIALIZER;
+ NTSTATUS rcNt = NtQueryInformationFile(hFile, &Ios, pIndexNumber, sizeof(*pIndexNumber), FileInternalInformation);
+ if (NT_SUCCESS(rcNt))
+ rcNt = Ios.Status;
+#ifdef DEBUG_bird
+ if (!NT_SUCCESS(rcNt))
+ __debugbreak();
+#endif
+ return NT_SUCCESS(rcNt) && pIndexNumber->QuadPart != 0;
+}
+
+
+/**
+ * Calculates the hash value for the given UTF-16 string.
+ *
+ * @returns Hash value.
+ * @param pUniStr String to hash.
+ */
+static uint32_t supR3HardenedWinVerifyCacheHashPath(PCUNICODE_STRING pUniStr)
+{
+ uint32_t uHash = 0;
+ unsigned cwcLeft = pUniStr->Length / sizeof(WCHAR);
+ PRTUTF16 pwc = pUniStr->Buffer;
+
+ while (cwcLeft-- > 0)
+ {
+ RTUTF16 wc = *pwc++;
+ uHash = wc + (uHash << 6) + (uHash << 16) - uHash;
+ }
+ return uHash;
+}
+
+
+/**
+ * Inserts the given verifier result into the cache.
+ *
+ * @param pUniStr The full path of the image.
+ * @param hFile The file handle - must either be entered into
+ * the cache or closed.
+ * @param rc The verifier result.
+ * @param fCacheable Whether this is a cacheable result. Passed in
+ * here instead of being handled by the caller to
+ * save code duplication.
+ */
+static void supR3HardenedWinVerifyCacheInsert(PCUNICODE_STRING pUniStr, HANDLE hFile, int rc, bool fCacheable)
+{
+ /*
+ * Don't cache anything until we've got the WinVerifyTrust API up and running.
+ */
+ if ( g_enmSupR3HardenedMainState >= SUPR3HARDENEDMAINSTATE_VERIFY_TRUST_READY
+ && fCacheable)
+ {
+ /*
+ * Allocate and initalize a new entry.
+ */
+ PVERIFIERCACHEENTRY pEntry = (PVERIFIERCACHEENTRY)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
+ sizeof(VERIFIERCACHEENTRY) + pUniStr->Length);
+ if (pEntry)
+ {
+ pEntry->pNext = NULL;
+ pEntry->hFile = hFile;
+ pEntry->rc = rc;
+ pEntry->uHash = supR3HardenedWinVerifyCacheHashPath(pUniStr);
+ pEntry->cbPath = pUniStr->Length;
+ memcpy(pEntry->wszPath, pUniStr->Buffer, pUniStr->Length);
+ pEntry->wszPath[pUniStr->Length / sizeof(WCHAR)] = '\0';
+ pEntry->fIndexNumberValid = supR3HardenedWinVerifyCacheGetIndexNumber(hFile, &pEntry->IndexNumber);
+
+ /*
+ * Try insert it, careful with concurrent code as well as potential duplicates.
+ */
+ uint32_t iHashTab = pEntry->uHash % RT_ELEMENTS(g_apVerifierCache);
+ VERIFIERCACHEENTRY * volatile *ppEntry = &g_apVerifierCache[iHashTab];
+ for (;;)
+ {
+ if (ASMAtomicCmpXchgPtr(ppEntry, pEntry, NULL))
+ return;
+ PVERIFIERCACHEENTRY pOther = *ppEntry;
+ if (!pOther)
+ continue;
+ if ( pOther->uHash == pEntry->uHash
+ && pOther->cbPath == pEntry->cbPath
+ && memcmp(pOther->wszPath, pEntry->wszPath, pEntry->cbPath) == 0)
+ break;
+ ppEntry = &pOther->pNext;
+ }
+
+ /* Duplicate entry. */
+#ifdef DEBUG_bird
+ __debugbreak();
+#endif
+ HeapFree(GetProcessHeap(), 0 /* dwFlags*/, pEntry);
+ }
+ }
+ NtClose(hFile);
+}
+
+
+/**
+ * Looks up an entry in the verifier hash table.
+ *
+ * @return Pointer to the entry on if found, NULL if not.
+ * @param pUniStr The full path of the image.
+ * @param hFile The file handle.
+ */
+static PVERIFIERCACHEENTRY supR3HardenedWinVerifyCacheLookup(PCUNICODE_STRING pUniStr, HANDLE hFile)
+{
+ PRTUTF16 const pwszPath = pUniStr->Buffer;
+ uint16_t const cbPath = pUniStr->Length;
+ uint32_t uHash = supR3HardenedWinVerifyCacheHashPath(pUniStr);
+ uint32_t iHashTab = uHash % RT_ELEMENTS(g_apVerifierCache);
+ PVERIFIERCACHEENTRY pCur = g_apVerifierCache[iHashTab];
+ while (pCur)
+ {
+ if ( pCur->uHash == uHash
+ && pCur->cbPath == cbPath
+ && memcmp(pCur->wszPath, pwszPath, cbPath) == 0)
+ {
+
+ if (!pCur->fIndexNumberValid)
+ return pCur;
+ LARGE_INTEGER IndexNumber;
+ bool fIndexNumberValid = supR3HardenedWinVerifyCacheGetIndexNumber(hFile, &IndexNumber);
+ if ( fIndexNumberValid
+ && IndexNumber.QuadPart == pCur->IndexNumber.QuadPart)
+ return pCur;
+#ifdef DEBUG_bird
+ __debugbreak();
+#endif
+ }
+ pCur = pCur->pNext;
+ }
+ return NULL;
+}
+
+
+/**
+ * Hook that monitors NtCreateSection calls.
+ *
+ * @returns NT status code.
+ * @param phSection Where to return the section handle.
+ * @param fAccess The desired access.
+ * @param pObjAttribs The object attributes (optional).
+ * @param pcbSection The section size (optional).
+ * @param fProtect The max section protection.
+ * @param fAttribs The section attributes.
+ * @param hFile The file to create a section from (optional).
+ */
+static NTSTATUS NTAPI
+supR3HardenedMonitor_NtCreateSection(PHANDLE phSection, ACCESS_MASK fAccess, POBJECT_ATTRIBUTES pObjAttribs,
+ PLARGE_INTEGER pcbSection, ULONG fProtect, ULONG fAttribs, HANDLE hFile)
+{
+ if ( hFile != NULL
+ && hFile != INVALID_HANDLE_VALUE)
+ {
+ bool const fImage = RT_BOOL(fAttribs & (SEC_IMAGE | SEC_PROTECTED_IMAGE));
+ bool const fExecMap = RT_BOOL(fAccess & SECTION_MAP_EXECUTE);
+ bool const fExecProt = RT_BOOL(fProtect & (PAGE_EXECUTE | PAGE_EXECUTE_READ | PAGE_EXECUTE_WRITECOPY
+ | PAGE_EXECUTE_READWRITE));
+ if (fImage || fExecMap || fExecProt)
+ {
+ /*
+ * Query the name of the file, making sure to zero terminator the
+ * string. (2nd half of buffer is used for error info, see below.)
+ */
+ union
+ {
+ UNICODE_STRING UniStr;
+ uint8_t abBuffer[sizeof(UNICODE_STRING) + 2048 * sizeof(WCHAR)];
+ } uBuf;
+ RT_ZERO(uBuf);
+ ULONG cbNameBuf;
+ NTSTATUS rcNt = NtQueryObject(hFile, ObjectNameInformation, &uBuf, sizeof(uBuf) - sizeof(WCHAR) - 128, &cbNameBuf);
+ if (!NT_SUCCESS(rcNt))
+ {
+ supR3HardenedError(VINF_SUCCESS, false,
+ "supR3HardenedMonitor_NtCreateSection: NtQueryObject -> %#x (fImage=%d fExecMap=%d fExecProt=%d)\n",
+ fImage, fExecMap, fExecProt);
+ return rcNt;
+ }
+
+ /*
+ * Check the cache.
+ */
+ PVERIFIERCACHEENTRY pCacheHit = supR3HardenedWinVerifyCacheLookup(&uBuf.UniStr, hFile);
+ if (pCacheHit)
+ {
+ SUP_DPRINTF(("supR3HardenedMonitor_NtCreateSection: cache hit (%Rrc) on %ls\n", pCacheHit->rc, pCacheHit->wszPath));
+ if (RT_SUCCESS(pCacheHit->rc))
+ return g_pfnNtCreateSectionReal(phSection, fAccess, pObjAttribs, pcbSection, fProtect, fAttribs, hFile);
+ supR3HardenedError(VINF_SUCCESS, false,
+ "supR3HardenedMonitor_NtCreateSection: cached rc=%Rrc fImage=%d fExecMap=%d fExecProt=%d %ls\n",
+ pCacheHit->rc, fImage, fExecMap, fExecProt, uBuf.UniStr.Buffer);
+ return STATUS_TRUST_FAILURE;
+ }
+
+ /*
+ * On XP the loader might hand us handles with just FILE_EXECUTE and
+ * SYNCRHONIZE, the means reading will fail later on. So, we might
+ * have to reopen the file here in order to validate it - annoying.
+ */
+ HANDLE hMyFile = NULL;
+ rcNt = NtDuplicateObject(NtCurrentProcess(), hFile, NtCurrentProcess(),
+ &hMyFile,
+ FILE_READ_DATA | SYNCHRONIZE,
+ 0 /* Handle attributes*/, 0 /* Options */);
+ if (!NT_SUCCESS(rcNt))
+ {
+ if (rcNt == STATUS_ACCESS_DENIED)
+ {
+ HANDLE hFile = RTNT_INVALID_HANDLE_VALUE;
+ IO_STATUS_BLOCK Ios = RTNT_IO_STATUS_BLOCK_INITIALIZER;
+
+ OBJECT_ATTRIBUTES ObjAttr;
+ InitializeObjectAttributes(&ObjAttr, &uBuf.UniStr, OBJ_CASE_INSENSITIVE, NULL /*hRootDir*/, NULL /*pSecDesc*/);
+
+ rcNt = NtCreateFile(&hMyFile,
+ FILE_READ_DATA | SYNCHRONIZE,
+ &ObjAttr,
+ &Ios,
+ NULL /* Allocation Size*/,
+ FILE_ATTRIBUTE_NORMAL,
+ FILE_SHARE_READ,
+ FILE_OPEN,
+ FILE_NON_DIRECTORY_FILE,
+ NULL /*EaBuffer*/,
+ 0 /*EaLength*/);
+ if (NT_SUCCESS(rcNt))
+ rcNt = Ios.Status;
+ if (!NT_SUCCESS(rcNt))
+ {
+ supR3HardenedError(VINF_SUCCESS, false,
+ "supR3HardenedMonitor_NtCreateSection: Failed to duplicate and open the file: rcNt=%#x hFile=%p %ls\n",
+ rcNt, hFile, uBuf.UniStr.Buffer);
+ return rcNt;
+ }
+ }
+ else
+ {
+#ifdef DEBUG
+
+ supR3HardenedError(VINF_SUCCESS, false, "supR3HardenedMonitor_NtCreateSection: NtDuplicateObject(,%#x,) failed: %#x\n", hFile, rcNt);
+#endif
+ hMyFile = hFile;
+ }
+ }
+
+ /*
+ * Special Kludge for Windows XP and W2K3 and their stupid attempts
+ * at mapping a hidden XML file called c:\Windows\WindowsShell.Manifest
+ * with executable access. The image bit isn't set, fortunately.
+ */
+ if ( !fImage
+ && uBuf.UniStr.Length > g_System32NtPath.UniStr.Length - sizeof(L"System32") + sizeof(WCHAR)
+ && memcmp(uBuf.UniStr.Buffer, g_System32NtPath.UniStr.Buffer,
+ g_System32NtPath.UniStr.Length - sizeof(L"System32") + sizeof(WCHAR)) == 0)
+ {
+ PRTUTF16 pwszName = &uBuf.UniStr.Buffer[(g_System32NtPath.UniStr.Length - sizeof(L"System32") + sizeof(WCHAR)) / sizeof(WCHAR)];
+ if (RTUtf16ICmpAscii(pwszName, "WindowsShell.Manifest") == 0)
+ {
+ /*
+ * Drop all executable access to the mapping and let it continue.
+ */
+ SUP_DPRINTF(("supR3HardenedMonitor_NtCreateSection: Applying the drop-exec-kludge for '%ls'\n", uBuf.UniStr.Buffer));
+ if (fAccess & SECTION_MAP_EXECUTE)
+ fAccess = (fAccess & ~SECTION_MAP_EXECUTE) | SECTION_MAP_READ;
+ if (fProtect & PAGE_EXECUTE)
+ fProtect = (fProtect & ~PAGE_EXECUTE) | PAGE_READONLY;
+ fProtect = (fProtect & ~UINT32_C(0xf0)) | ((fProtect & UINT32_C(0xe0)) >> 4);
+ return g_pfnNtCreateSectionReal(phSection, fAccess, pObjAttribs, pcbSection, fProtect, fAttribs, hFile);
+ }
+ }
+
+ /*
+ * Check the path. We don't allow DLLs to be loaded from just anywhere:
+ * 1. System32 - normal code or cat signing.
+ * 2. WinSxS - normal code or cat signing.
+ * 3. VirtualBox - kernel code signing and integrity checks.
+ */
+ bool fSystem32 = false;
+ Assert(g_SupLibHardenedExeNtPath.UniStr.Buffer[g_offSupLibHardenedExeNtName - 1] == '\\');
+ uint32_t fFlags = 0;
+ if ( uBuf.UniStr.Length > g_System32NtPath.UniStr.Length
+ && memcmp(uBuf.UniStr.Buffer, g_System32NtPath.UniStr.Buffer, g_System32NtPath.UniStr.Length) == 0
+ && uBuf.UniStr.Buffer[g_System32NtPath.UniStr.Length / sizeof(WCHAR)] == '\\')
+ {
+ fSystem32 = true;
+ fFlags |= SUPHNTVI_F_ALLOW_CAT_FILE_VERIFICATION;
+ }
+ else if ( uBuf.UniStr.Length > g_WinSxSNtPath.UniStr.Length
+ && memcmp(uBuf.UniStr.Buffer, g_WinSxSNtPath.UniStr.Buffer, g_WinSxSNtPath.UniStr.Length) == 0
+ && uBuf.UniStr.Buffer[g_WinSxSNtPath.UniStr.Length / sizeof(WCHAR)] == '\\')
+ fFlags |= SUPHNTVI_F_ALLOW_CAT_FILE_VERIFICATION;
+ else if ( uBuf.UniStr.Length > g_offSupLibHardenedExeNtName
+ && memcmp(uBuf.UniStr.Buffer, g_SupLibHardenedExeNtPath.UniStr.Buffer,
+ g_offSupLibHardenedExeNtName * sizeof(WCHAR)) == 0)
+ fFlags |= SUPHNTVI_F_REQUIRE_KERNEL_CODE_SIGNING | SUPHNTVI_F_REQUIRE_SIGNATURE_ENFORCEMENT;
+ else
+ {
+ supR3HardenedError(VINF_SUCCESS, false,
+ "supR3HardenedMonitor_NtCreateSection: Not a trusted location: '%ls' (fImage=%d fExecMap=%d fExecProt=%d)\n",
+ uBuf.UniStr.Buffer, fImage, fExecMap, fExecProt);
+ if (hMyFile != hFile)
+ NtClose(hMyFile);
+ return STATUS_TRUST_FAILURE;
+ }
+
+ /*
+ * Do the verification. For better error message we borrow what's
+ * left of the path buffer for an RTERRINFO buffer.
+ */
+ RTERRINFO ErrInfo;
+ RTErrInfoInit(&ErrInfo, (char *)&uBuf.abBuffer[cbNameBuf], sizeof(uBuf) - cbNameBuf);
+
+ bool fCacheable = true;
+ int rc = supHardenedWinVerifyImageByHandle(hMyFile, uBuf.UniStr.Buffer, fFlags, &fCacheable, &ErrInfo);
+ if (RT_FAILURE(rc))
+ {
+ supR3HardenedError(VINF_SUCCESS, false,
+ "supR3HardenedMonitor_NtCreateSection: rc=%Rrc fImage=%d fExecMap=%d fExecProt=%d %ls: %s\n",
+ rc, fImage, fExecMap, fExecProt, uBuf.UniStr.Buffer, ErrInfo.pszMsg);
+ if (hMyFile != hFile)
+ NtClose(hMyFile);
+ return STATUS_TRUST_FAILURE;
+ }
+ if (hMyFile != hFile)
+ supR3HardenedWinVerifyCacheInsert(&uBuf.UniStr, hMyFile, rc, fCacheable);
+ }
+ }
+
+ /*
+ * Call checked out OK, call the original.
+ */
+ return g_pfnNtCreateSectionReal(phSection, fAccess, pObjAttribs, pcbSection, fProtect, fAttribs, hFile);
+}
+
+
+#ifdef RT_ARCH_AMD64
+/**
+ * Tries to allocate memory between @a uStart and @a uEnd.
+ *
+ * @returns Pointer to the memory on success. NULL on failure.
+ * @param uStart The start address.
+ * @param uEnd The end address. This is lower than @a uStart
+ * if @a iDirection is negative, and higher if
+ * positive.
+ * @param iDirection The search direction.
+ * @param cbAlloc The number of bytes to allocate.
+ */
+static void *supR3HardenedWinAllocHookMemory(uintptr_t uStart, uintptr_t uEnd, intptr_t iDirection, size_t cbAlloc)
+{
+ size_t const cbAllocGranularity = _64K;
+ size_t const uAllocGranularityMask = ~(cbAllocGranularity - 1);
+ HANDLE const hProc = GetCurrentProcess();
+
+ /*
+ * Make uEnd the last valid return address.
+ */
+ if (iDirection > 0)
+ {
+ SUPR3HARDENED_ASSERT(uEnd > cbAlloc);
+ uEnd -= cbAlloc;
+ uEnd &= uAllocGranularityMask;
+ }
+ else
+ uEnd = RT_ALIGN_Z(uEnd, cbAllocGranularity);
+
+ /*
+ * Search for free memory.
+ */
+ uintptr_t uCur = uStart & uAllocGranularityMask;
+ for (;;)
+ {
+ /*
+ * Examine the memory at this address, if it's free, try make the allocation here.
+ */
+ SIZE_T cbIgn;
+ MEMORY_BASIC_INFORMATION MemInfo;
+ SUPR3HARDENED_ASSERT_NT_SUCCESS(NtQueryVirtualMemory(hProc,
+ (void *)uCur,
+ MemoryBasicInformation,
+ &MemInfo,
+ sizeof(MemInfo),
+ &cbIgn));
+ if ( MemInfo.State == MEM_FREE
+ && MemInfo.RegionSize >= cbAlloc)
+ {
+ for (;;)
+ {
+ SUPR3HARDENED_ASSERT((uintptr_t)MemInfo.BaseAddress <= uCur);
+ void *pvMem = VirtualAllocEx(hProc, (void *)uCur, cbAlloc, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
+ if (pvMem)
+ {
+ if ( iDirection > 0
+ ? (uintptr_t)pvMem >= uStart
+ && (uintptr_t)pvMem <= uEnd
+ : (uintptr_t)pvMem >= uEnd
+ && (uintptr_t)pvMem <= uStart)
+ return pvMem;
+ VirtualFreeEx(hProc, pvMem, cbAlloc, MEM_RELEASE);
+ }
+
+ /* Advance within the free area and try again? */
+ uintptr_t uNext = iDirection > 0 ? uCur + cbAllocGranularity : uCur - cbAllocGranularity;
+ uNext &= uAllocGranularityMask;
+ if ( iDirection > 0
+ ? uNext <= uCur
+ || uNext > uEnd
+ || uNext - (uintptr_t)MemInfo.BaseAddress > MemInfo.RegionSize
+ || MemInfo.RegionSize - (uNext - (uintptr_t)MemInfo.BaseAddress) < cbAlloc
+ : uNext >= uCur
+ || uNext < uEnd
+ || uNext < (uintptr_t)MemInfo.BaseAddress)
+ break;
+ uCur = uNext;
+ }
+ }
+
+ /*
+ * Advance to the next memory region.
+ */
+ if (iDirection > 0)
+ {
+ uCur = (uintptr_t)MemInfo.BaseAddress + MemInfo.RegionSize;
+ uCur = RT_ALIGN_Z(uCur, cbAllocGranularity);
+ if (uCur >= uEnd)
+ break;
+ }
+ else
+ {
+ uCur = (uintptr_t)(MemInfo.AllocationBase ? MemInfo.AllocationBase : MemInfo.BaseAddress);
+ if (uCur > uEnd)
+ uCur -= cbAlloc;
+ uCur &= uAllocGranularityMask;
+ if (uCur < uEnd)
+ break;
+ }
+ }
+ return NULL;
+}
+#endif
+
+
+/**
+ * Install hooks for intercepting calls dealing with mapping shared libraries
+ * into the process.
+ *
+ * This allows us to prevent undesirable shared libraries from being loaded.
+ *
+ * @remarks We assume we're alone in this process, so no seralizing trickery is
+ * necessary when installing the patch.
+ */
+DECLHIDDEN(void) supR3HardenedWinInstallHooks(void)
+{
+#ifndef VBOX_WITHOUT_DEBUGGER_CHECKS
+ /*
+ * Install a anti debugging hack before we continue. This prevents most
+ * notifications from ending up in the debugger.
+ */
+ NTSTATUS rcNt = NtSetInformationThread(GetCurrentThread(), ThreadHideFromDebugger, NULL, 0);
+ if (!NT_SUCCESS(rcNt))
+ supR3HardenedFatalMsg("supR3HardenedWinInstallHooks", kSupInitOp_Misc, VERR_NO_MEMORY,
+ "NtSetInformationThread/ThreadHideFromDebugger failed: %#x\n", rcNt);
+#endif
+
+ /*
+ * Locate the routine.
+ */
+ HMODULE hmodNtDll = GetModuleHandleW(L"NTDLL");
+ SUPR3HARDENED_ASSERT(hmodNtDll != NULL);
+
+ FARPROC pfnNtCreateSection = GetProcAddress(hmodNtDll, "NtCreateSection");
+ SUPR3HARDENED_ASSERT(pfnNtCreateSection != NULL);
+ SUPR3HARDENED_ASSERT(pfnNtCreateSection == (FARPROC)NtCreateSection);
+
+ uint8_t * const pbNtCreateSection = (uint8_t *)(uintptr_t)pfnNtCreateSection;
+
+#ifdef RT_ARCH_AMD64
+ /*
+ * For 64-bit hosts we need some memory within a +/-2GB range of the
+ * actual function to be able to patch it.
+ */
+ size_t cbMem = _4K;
+ void *pvMem = supR3HardenedWinAllocHookMemory((uintptr_t)pfnNtCreateSection,
+ (uintptr_t)pfnNtCreateSection - _2G + PAGE_SIZE,
+ -1, cbMem);
+ if (!pvMem)
+ {
+ pvMem = supR3HardenedWinAllocHookMemory((uintptr_t)pfnNtCreateSection,
+ (uintptr_t)pfnNtCreateSection + _2G - PAGE_SIZE,
+ 1, cbMem);
+ if (!pvMem)
+ supR3HardenedFatalMsg("supR3HardenedWinInstallHooks", kSupInitOp_Misc, VERR_NO_MEMORY,
+ "Failed to allocate memory within the +/-2GB range from NTDLL.\n");
+ }
+ uintptr_t *puJmpTab = (uintptr_t *)pvMem;
+
+ /*
+ * Patch 64-bit hosts.
+ */
+ PFNRT pfnCallReal = NULL;
+ uint8_t offJmpBack = UINT8_MAX;
+
+ /* Pattern #1: XP64/W2K3-64 thru Windows 8.1
+ 0:000> u ntdll!NtCreateSection
+ ntdll!NtCreateSection:
+ 00000000`779f1750 4c8bd1 mov r10,rcx
+ 00000000`779f1753 b847000000 mov eax,47h
+ 00000000`779f1758 0f05 syscall
+ 00000000`779f175a c3 ret
+ 00000000`779f175b 0f1f440000 nop dword ptr [rax+rax]
+ The variant is the value loaded into eax: W2K3=??, Vista=47h?, W7=47h, W80=48h, W81=49h */
+ if ( pbNtCreateSection[ 0] == 0x4c /* mov r10, rcx */
+ && pbNtCreateSection[ 1] == 0x8b
+ && pbNtCreateSection[ 2] == 0xd1
+ && pbNtCreateSection[ 3] == 0xb8 /* mov eax, 000000xxh */
+ && pbNtCreateSection[ 5] == 0x00
+ && pbNtCreateSection[ 6] == 0x00
+ && pbNtCreateSection[ 7] == 0x00
+ && pbNtCreateSection[ 8] == 0x0f /* syscall */
+ && pbNtCreateSection[ 9] == 0x05
+ && pbNtCreateSection[10] == 0xc3 /* ret */
+ )
+ {
+ offJmpBack = 8; /* the 3rd instruction (syscall). */
+ switch (pbNtCreateSection[4])
+ {
+# define SYSCALL(a_Num) case a_Num: pfnCallReal = RT_CONCAT(supR3HardenedJmpBack_NtCreateSection_,a_Num); break;
+# include "NtCreateSection-template-amd64-syscall-type-1.h"
+# undef SYSCALL
+ }
+ }
+
+ if (pfnCallReal)
+ {
+ g_pfnNtCreateSectionJmpBack = (PFNRT)(uintptr_t)(pbNtCreateSection + offJmpBack);
+ *(PFNRT *)&g_pfnNtCreateSectionReal = pfnCallReal;
+ *puJmpTab = (uintptr_t)supR3HardenedMonitor_NtCreateSection;
+
+ DWORD dwOldProt;
+ SUPR3HARDENED_ASSERT_WIN32_SUCCESS(VirtualProtectEx(GetCurrentProcess(), pbNtCreateSection, 16,
+ PAGE_EXECUTE_READWRITE, &dwOldProt));
+ pbNtCreateSection[0] = 0xff;
+ pbNtCreateSection[1] = 0x25;
+ *(uint32_t *)&pbNtCreateSection[2] = (uint32_t)((uintptr_t)puJmpTab - (uintptr_t)&pbNtCreateSection[2+4]);
+
+ SUPR3HARDENED_ASSERT_WIN32_SUCCESS(VirtualProtectEx(GetCurrentProcess(), pbNtCreateSection, 16,
+ PAGE_EXECUTE_READ, &dwOldProt));
+ return;
+ }
+
+#else
+ /*
+ * Patch 32-bit hosts.
+ */
+ PFNRT pfnCallReal = NULL;
+ uint8_t offJmpBack = UINT8_MAX;
+
+ /* Pattern #1: XP thru Windows 7
+ kd> u ntdll!NtCreateSection
+ ntdll!NtCreateSection:
+ 7c90d160 b832000000 mov eax,32h
+ 7c90d165 ba0003fe7f mov edx,offset SharedUserData!SystemCallStub (7ffe0300)
+ 7c90d16a ff12 call dword ptr [edx]
+ 7c90d16c c21c00 ret 1Ch
+ 7c90d16f 90 nop
+ The variable bit is the value loaded into eax: XP=32h, W2K3=34h, Vista=4bh, W7=54h
+
+ Pattern #2: Windows 8.1
+ 0:000:x86> u ntdll_6a0f0000!NtCreateSection
+ ntdll_6a0f0000!NtCreateSection:
+ 6a15eabc b854010000 mov eax,154h
+ 6a15eac1 e803000000 call ntdll_6a0f0000!NtCreateSection+0xd (6a15eac9)
+ 6a15eac6 c21c00 ret 1Ch
+ 6a15eac9 8bd4 mov edx,esp
+ 6a15eacb 0f34 sysenter
+ 6a15eacd c3 ret
+ The variable bit is the value loaded into eax: W81=154h
+ Note! One nice thing here is that we can share code pattern #1. */
+
+ if ( pbNtCreateSection[ 0] == 0xb8 /* mov eax, 000000xxh*/
+ && pbNtCreateSection[ 2] <= 0x02
+ && pbNtCreateSection[ 3] == 0x00
+ && pbNtCreateSection[ 4] == 0x00
+ ( ( pbNtCreateSection[ 5] == 0xba /* mov edx, offset SharedUserData!SystemCallStub */
+ && pbNtCreateSection[ 6] == 0x00
+ && pbNtCreateSection[ 7] == 0x03
+ && pbNtCreateSection[ 8] == 0xfe
+ && pbNtCreateSection[ 9] == 0x7f
+ && pbNtCreateSection[10] == 0xff /* call [edx] */
+ && pbNtCreateSection[11] == 0x12
+ && pbNtCreateSection[12] == 0xc2 /* ret 1ch */
+ && pbNtCreateSection[13] == 0x1c
+ && pbNtCreateSection[14] == 0x00)
+
+ || ( pbNtCreateSection[ 5] == 0xe8 /* call [$+3] */
+ && RT_ABS(*(int32_t *)&pbNtCreateSection[6]) < 0x10
+ && pbNtCreateSection[10] == 0xc2 /* ret 1ch */
+ && pbNtCreateSection[11] == 0x1c
+ && pbNtCreateSection[12] == 0x00 )
+ )
+ )
+ {
+ offJmpBack = 5; /* the 2nd instruction. */
+ switch (*(uint32_t const *)&pbNtCreateSection[1])
+ {
+# define SYSCALL(a_Num) case a_Num: pfnCallReal = RT_CONCAT(supR3HardenedJmpBack_NtCreateSection_,a_Num); break;
+# include "NtCreateSection-template-x86-syscall-type-1.h"
+# undef SYSCALL
+ }
+ }
+
+ if (pfnCallReal)
+ {
+ g_pfnNtCreateSectionJmpBack = (PFNRT)(uintptr_t)(pbNtCreateSection + offJmpBack);
+ *(PFNRT *)&g_pfnNtCreateSectionReal = pfnCallReal;
+
+ DWORD dwOldProt;
+ SUPR3HARDENED_ASSERT_WIN32_SUCCESS(VirtualProtectEx(GetCurrentProcess(), pbNtCreateSection, 16,
+ PAGE_EXECUTE_READWRITE, &dwOldProt));
+ pbNtCreateSection[0] = 0xe9;
+ *(uint32_t *)&pbNtCreateSection[1] = (uintptr_t)supR3HardenedMonitor_NtCreateSection
+ - (uintptr_t)&pbNtCreateSection[1+4];
+
+ SUPR3HARDENED_ASSERT_WIN32_SUCCESS(VirtualProtectEx(GetCurrentProcess(), pbNtCreateSection, 16,
+ PAGE_EXECUTE_READ, &dwOldProt));
+ return;
+ }
+#endif
+
+ supR3HardenedFatalMsg("supR3HardenedWinInstallHooks", kSupInitOp_Misc, VERR_NO_MEMORY,
+ "Failed to install NtCreateSection monitor: %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x\n "
+#ifdef RT_ARCH_X86
+ "(It is also possible you are running 32-bit VirtualBox under 64-bit windows.)\n"
+#endif
+ ,
+ pbNtCreateSection[0], pbNtCreateSection[1], pbNtCreateSection[2], pbNtCreateSection[3],
+ pbNtCreateSection[4], pbNtCreateSection[5], pbNtCreateSection[6], pbNtCreateSection[7],
+ pbNtCreateSection[8], pbNtCreateSection[9], pbNtCreateSection[10], pbNtCreateSection[11],
+ pbNtCreateSection[12], pbNtCreateSection[13], pbNtCreateSection[14], pbNtCreateSection[15]);
+}
+
+
+/**
+ * Verifies the process integrity.
+ */
+DECLHIDDEN(void) supR3HardenedWinVerifyProcess(void)
+{
+ RTErrInfoInitStatic(&g_ErrInfoStatic);
+ int rc = supHardenedWinVerifyProcess(GetCurrentProcess(), GetCurrentThread(), &g_ErrInfoStatic.Core);
+ if (RT_FAILURE(rc))
+ supR3HardenedFatalMsg("supR3HardenedWinVerifyProcess", kSupInitOp_Integrity, rc,
+ "Failed to verify process integrity: %s", g_ErrInfoStatic.szMsg);
+}
+
+
+/**
+ * Gets the SID of the user associated with the process.
+ *
+ * @returns @c true if we've got a login SID, @c false if not.
+ * @param pSidUser Where to return the user SID.
+ * @param cbSidUser The size of the user SID buffer.
+ * @param pSidLogin Where to return the login SID.
+ * @param cbSidLogin The size of the login SID buffer.
+ */
+static bool supR3HardenedGetUserAndLogSids(PSID pSidUser, ULONG cbSidUser, PSID pSidLogin, ULONG cbSidLogin)
+{
+ HANDLE hToken;
+ SUPR3HARDENED_ASSERT_NT_SUCCESS(NtOpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken));
+ union
+ {
+ TOKEN_USER UserInfo;
+ TOKEN_GROUPS Groups;
+ uint8_t abPadding[4096];
+ } uBuf;
+ ULONG cbRet = 0;
+ SUPR3HARDENED_ASSERT_NT_SUCCESS(NtQueryInformationToken(hToken, TokenUser, &uBuf, sizeof(uBuf), &cbRet));
+ SUPR3HARDENED_ASSERT_NT_SUCCESS(RtlCopySid(cbSidUser, pSidUser, uBuf.UserInfo.User.Sid));
+
+ bool fLoginSid = false;
+ NTSTATUS rcNt = NtQueryInformationToken(hToken, TokenLogonSid, &uBuf, sizeof(uBuf), &cbRet);
+ if (NT_SUCCESS(rcNt))
+ {
+ for (DWORD i = 0; i < uBuf.Groups.GroupCount; i++)
+ if ((uBuf.Groups.Groups[i].Attributes & SE_GROUP_LOGON_ID) == SE_GROUP_LOGON_ID)
+ {
+ SUPR3HARDENED_ASSERT_NT_SUCCESS(RtlCopySid(cbSidLogin, pSidLogin, uBuf.Groups.Groups[i].Sid));
+ fLoginSid = true;
+ break;
+ }
+ }
+
+ SUPR3HARDENED_ASSERT_NT_SUCCESS(NtClose(hToken));
+
+ return fLoginSid;
+}
+
+
+/**
+ * Build security attributes for the process or the primary thread (@a fProcess)
+ *
+ * Process DACLs can be bypassed using the SeDebugPrivilege (generally available
+ * to admins, i.e. normal windows users), or by taking ownership and/or
+ * modifying the DACL. However, it restricts
+ *
+ * @param pSecAttrs Where to return the security attributes.
+ * @param pCleanup Cleanup record.
+ * @param fProcess Set if it's for the process, clear if it's for
+ * the primary thread.
+ */
+static void supR3HardenedInitSecAttrs(PSECURITY_ATTRIBUTES pSecAttrs, PMYSECURITYCLEANUP pCleanup, bool fProcess)
+{
+ /*
+ * Safe return values.
+ */
+ suplibHardenedMemSet(pCleanup, 0, sizeof(*pCleanup));
+
+ pSecAttrs->nLength = sizeof(*pSecAttrs);
+ pSecAttrs->bInheritHandle = FALSE;
+ pSecAttrs->lpSecurityDescriptor = NULL;
+
+/** @todo This isn't at all complete, just sketches... */
+
+ /*
+ * Create an ACL detailing the access of the above groups.
+ */
+ SUPR3HARDENED_ASSERT_NT_SUCCESS(RtlCreateAcl(&pCleanup->Acl.AclHdr, sizeof(pCleanup->Acl), ACL_REVISION));
+
+ ULONG fDeny = DELETE | WRITE_DAC | WRITE_OWNER | GENERIC_WRITE | GENERIC_EXECUTE | GENERIC_ALL;
+ ULONG fAllow = SYNCHRONIZE | READ_CONTROL;
+ ULONG fAllowLogin = SYNCHRONIZE | READ_CONTROL;
+ if (fProcess)
+ {
+ fDeny |= PROCESS_CREATE_THREAD | PROCESS_SET_SESSIONID | PROCESS_VM_OPERATION | PROCESS_VM_WRITE
+ | PROCESS_CREATE_PROCESS | PROCESS_DUP_HANDLE | PROCESS_SET_QUOTA
+ | PROCESS_SET_INFORMATION | PROCESS_SUSPEND_RESUME;
+ fAllow |= PROCESS_TERMINATE | PROCESS_VM_READ | PROCESS_QUERY_INFORMATION;
+ fAllowLogin |= PROCESS_TERMINATE | PROCESS_VM_READ | PROCESS_QUERY_INFORMATION;
+ if (g_uNtVerCombined >= SUP_MAKE_NT_VER_SIMPLE(6, 0)) /* Introduced in Vista. */
+ {
+ fAllow |= PROCESS_QUERY_LIMITED_INFORMATION;
+ fAllowLogin |= PROCESS_QUERY_LIMITED_INFORMATION;
+ }
+ if (g_uNtVerCombined >= SUP_MAKE_NT_VER_SIMPLE(6, 3)) /* Introduced in Windows 8.1. */
+ fAllow |= PROCESS_SET_LIMITED_INFORMATION;
+ }
+ else
+ {
+ fDeny |= THREAD_SUSPEND_RESUME | THREAD_SET_CONTEXT | THREAD_SET_INFORMATION | THREAD_SET_THREAD_TOKEN
+ | THREAD_IMPERSONATE | THREAD_DIRECT_IMPERSONATION;
+ fAllow |= THREAD_GET_CONTEXT | THREAD_QUERY_INFORMATION;
+ fAllowLogin |= THREAD_GET_CONTEXT | THREAD_QUERY_INFORMATION;
+ if (g_uNtVerCombined >= SUP_MAKE_NT_VER_SIMPLE(6, 0)) /* Introduced in Vista. */
+ {
+ fAllow |= THREAD_QUERY_LIMITED_INFORMATION | THREAD_SET_LIMITED_INFORMATION;
+ fAllowLogin |= THREAD_QUERY_LIMITED_INFORMATION;
+ }
+
+ }
+ fDeny |= ~fAllow & (SPECIFIC_RIGHTS_ALL | STANDARD_RIGHTS_ALL);
+
+ /* Deny everyone access to bad bits. */
+#if 1
+ SID_IDENTIFIER_AUTHORITY SIDAuthWorld = SECURITY_WORLD_SID_AUTHORITY;
+ SUPR3HARDENED_ASSERT_NT_SUCCESS(RtlInitializeSid(&pCleanup->Everyone.Sid, &SIDAuthWorld, 1));
+ *RtlSubAuthoritySid(&pCleanup->Everyone.Sid, 0) = SECURITY_WORLD_RID;
+ SUPR3HARDENED_ASSERT_NT_SUCCESS(RtlAddAccessDeniedAce(&pCleanup->Acl.AclHdr, ACL_REVISION,
+ fDeny, &pCleanup->Everyone.Sid));
+#endif
+
+#if 0
+ /* Grant some access to the owner - doesn't work. */
+ SID_IDENTIFIER_AUTHORITY SIDAuthCreator = SECURITY_CREATOR_SID_AUTHORITY;
+ SUPR3HARDENED_ASSERT_NT_SUCCESS(RtlInitializeSid(&pCleanup->Owner.Sid, &SIDAuthCreator, 1));
+ *RtlSubAuthoritySid(&pCleanup->Owner.Sid, 0) = SECURITY_CREATOR_OWNER_RID;
+
+ SUPR3HARDENED_ASSERT_NT_SUCCESS(RtlAddAccessDeniedAce(&pCleanup->Acl.AclHdr, ACL_REVISION,
+ fDeny, &pCleanup->Owner.Sid));
+ SUPR3HARDENED_ASSERT_NT_SUCCESS(RtlAddAccessAllowedAce(&pCleanup->Acl.AclHdr, ACL_REVISION,
+ fAllow, &pCleanup->Owner.Sid));
+#endif
+
+#if 1
+ bool fHasLoginSid = supR3HardenedGetUserAndLogSids(&pCleanup->User.Sid, sizeof(pCleanup->User),
+ &pCleanup->Login.Sid, sizeof(pCleanup->Login));
+
+# if 1
+ /* Grant minimal access to the user. */
+ SUPR3HARDENED_ASSERT_NT_SUCCESS(RtlAddAccessDeniedAce(&pCleanup->Acl.AclHdr, ACL_REVISION,
+ fDeny, &pCleanup->User.Sid));
+ SUPR3HARDENED_ASSERT_NT_SUCCESS(RtlAddAccessAllowedAce(&pCleanup->Acl.AclHdr, ACL_REVISION,
+ fAllow, &pCleanup->User.Sid));
+# endif
+
+# if 1
+ /* Grant very limited access to the login sid. */
+ if (fHasLoginSid)
+ {
+ SUPR3HARDENED_ASSERT_NT_SUCCESS(RtlAddAccessAllowedAce(&pCleanup->Acl.AclHdr, ACL_REVISION,
+ fAllowLogin, &pCleanup->Login.Sid));
+ }
+# endif
+
+#endif
+
+ /*
+ * Create a security descriptor with the above ACL.
+ */
+ PSECURITY_DESCRIPTOR pSecDesc = (PSECURITY_DESCRIPTOR)suplibHardenedAllocZ(SECURITY_DESCRIPTOR_MIN_LENGTH);
+ pCleanup->pSecDesc = pSecDesc;
+
+ SUPR3HARDENED_ASSERT_NT_SUCCESS(RtlCreateSecurityDescriptor(pSecDesc, SECURITY_DESCRIPTOR_REVISION));
+ SUPR3HARDENED_ASSERT_NT_SUCCESS(RtlSetDaclSecurityDescriptor(pSecDesc, TRUE /*fDaclPresent*/, &pCleanup->Acl.AclHdr,
+ FALSE /*fDaclDefaulted*/));
+ pSecAttrs->lpSecurityDescriptor = pSecDesc;
+}
+
+
+/**
+ * Predicate function which tests whether @a ch is a argument separator
+ * character.
+ *
+ * @returns True/false.
+ * @param ch The character to examine.
+ */
+DECLINLINE(bool) suplibCommandLineIsArgSeparator(int ch)
+{
+ return ch == ' '
+ || ch == '\t'
+ || ch == '\n'
+ || ch == '\r';
+}
+
+
+/**
+ * Construct the new command line. Since argc/argv are both derived from
+ * GetCommandLineW (see suplibHardenedWindowsMain), we skip the argument
+ * by argument UTF-8 -> UTF-16 conversion and quoting by going to the
+ * original source.
+ *
+ * The executable name, though, is replaced in case it's not a fullly
+ * qualified path.
+ *
+ * The re-spawn indicator is added immediately after the executable name
+ * so that we don't get tripped up missing close quote chars in the last
+ * argument.
+ *
+ * @returns Pointer to a command line string (heap).
+ */
+static PRTUTF16 supR3HardenedWinConstructCmdLine(void)
+{
+ /*
+ * Get the command line and skip the executable name.
+ */
+ PCRTUTF16 pwszArgs = GetCommandLineW();
+
+ /* Skip leading space (shouldn't be any, but whatever). */
+ while (suplibCommandLineIsArgSeparator(*pwszArgs))
+ pwszArgs++;
+ SUPR3HARDENED_ASSERT(*pwszArgs != '\0');
+
+ /* Walk to the end of it. */
+ int fQuoted = false;
+ do
+ {
+ if (*pwszArgs == '"')
+ {
+ fQuoted = !fQuoted;
+ pwszArgs++;
+ }
+ else if (*pwszArgs != '\\' || (pwszArgs[1] != '\\' && pwszArgs[1] != '"'))
+ pwszArgs++;
+ else
+ {
+ unsigned cSlashes = 0;
+ do
+ cSlashes++;
+ while (*++pwszArgs == '\\');
+ if (*pwszArgs == '"' && (cSlashes & 1))
+ pwszArgs++; /* odd number of slashes == escaped quote */
+ }
+ } while (*pwszArgs && (fQuoted || !suplibCommandLineIsArgSeparator(*pwszArgs)));
+
+ /* Skip trailing spaces. */
+ while (suplibCommandLineIsArgSeparator(*pwszArgs))
+ pwszArgs++;
+
+ /*
+ * Allocate a new buffer.
+ */
+ size_t cwcArgs = suplibHardenedWStrLen(pwszArgs);
+ size_t cwcCmdLine = (sizeof(SUPR3_RESPAWN_ARG0) - 1) / sizeof(SUPR3_RESPAWN_ARG0[0]) /* Respawn exe name. */
+ + !!cwcArgs + cwcArgs; /* if arguments present, add space + arguments. */
+ PRTUTF16 pwszCmdLine = (PRTUTF16)HeapAlloc(GetProcessHeap(), 0 /* dwFlags*/, (cwcCmdLine + 1) * sizeof(RTUTF16));
+ SUPR3HARDENED_ASSERT(pwszCmdLine != NULL);
+
+ /*
+ * Construct the new command line.
+ */
+ PRTUTF16 pwszDst = pwszCmdLine;
+ for (const char *pszSrc = SUPR3_RESPAWN_ARG0; *pszSrc; pszSrc++)
+ *pwszDst++ = *pszSrc;
+
+ if (cwcArgs)
+ {
+ *pwszDst++ = ' ';
+ suplibHardenedMemCopy(pwszDst, pwszArgs, cwcArgs * sizeof(RTUTF16));
+ pwszDst += cwcArgs;
+ }
+
+ *pwszDst = '\0';
+ SUPR3HARDENED_ASSERT(pwszDst - pwszCmdLine == cwcCmdLine);
+
+ return pwszCmdLine;
+}
+
+
+/**
+ * Does the actually respawning.
+ *
+ * @returns Exit code (if we get that far).
+ */
+static int supR3HardenedWinDoReSpawn(void)
+{
+ SUPR3HARDENED_ASSERT(g_cSuplibHardenedWindowsMainCalls == 1);
+
+ /*
+ * Configure the startup info and creation flags.
+ */
+ DWORD dwCreationFlags = 0;
+
+ STARTUPINFOEXW SiEx;
+ suplibHardenedMemSet(&SiEx, 0, sizeof(SiEx));
+ if (1)
+ SiEx.StartupInfo.cb = sizeof(SiEx.StartupInfo);
+ else
+ {
+ SiEx.StartupInfo.cb = sizeof(SiEx);
+ dwCreationFlags |= EXTENDED_STARTUPINFO_PRESENT;
+ /** @todo experiment with protected process stuff later on. */
+ }
+
+ SiEx.StartupInfo.dwFlags |= STARTF_USESTDHANDLES;
+ SiEx.StartupInfo.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
+ SiEx.StartupInfo.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
+ SiEx.StartupInfo.hStdError = GetStdHandle(STD_ERROR_HANDLE);
+
+ /*
+ * Set up security descriptors.
+ */
+ SECURITY_ATTRIBUTES ProcessSecAttrs;
+ MYSECURITYCLEANUP ProcessSecAttrsCleanup;
+ supR3HardenedInitSecAttrs(&ProcessSecAttrs, &ProcessSecAttrsCleanup, true /*fProcess*/);
+
+ SECURITY_ATTRIBUTES ThreadSecAttrs;
+ MYSECURITYCLEANUP ThreadSecAttrsCleanup;
+ supR3HardenedInitSecAttrs(&ThreadSecAttrs, &ThreadSecAttrsCleanup, false /*fProcess*/);
+
+ /*
+ * Construct the command line and launch the process.
+ */
+ PRTUTF16 pwszCmdLine = supR3HardenedWinConstructCmdLine();
+
+ PROCESS_INFORMATION ProcessInfo;
+ if (!CreateProcessW(g_wszSupLibHardenedExePath,
+ pwszCmdLine,
+ &ProcessSecAttrs,
+ &ThreadSecAttrs,
+ TRUE /*fInheritHandles*/,
+ dwCreationFlags,
+ NULL /*pwszzEnvironment*/,
+ NULL /*pwszCurDir*/,
+ &SiEx.StartupInfo,
+ &ProcessInfo))
+ supR3HardenedFatalMsg("supR3HardenedWinReSpawn", kSupInitOp_Misc, VERR_INVALID_NAME,
+ "Error relaunching VirtualBox VM process: %u\n"
+ "Command line: '%ls'",
+ GetLastError(), pwszCmdLine);
+
+ /*
+ * Close the unrestricted access handles. Since we need to wait on the
+ * child process, we'll reopen the process with limited access before doing
+ * away with the process handle returned by CreateProcess.
+ */
+ SUPR3HARDENED_ASSERT(CloseHandle(ProcessInfo.hThread));
+ ProcessInfo.hThread = NULL;
+
+ HANDLE hProcWait;
+ DWORD dwRights = SYNCHRONIZE;
+ if (g_uNtVerCombined >= SUP_MAKE_NT_VER_SIMPLE(6, 0)) /* Introduced in Vista. */
+ dwRights |= PROCESS_QUERY_LIMITED_INFORMATION;
+ else
+ dwRights |= PROCESS_QUERY_INFORMATION;
+ if (!DuplicateHandle(GetCurrentProcess(),
+ ProcessInfo.hProcess,
+ GetCurrentProcess(),
+ &hProcWait,
+ SYNCHRONIZE,
+ FALSE /*fInheritHandle*/,
+ 0))
+ {
+ /* This is unacceptable, kill the process. */
+ DWORD dwErr = GetLastError();
+ TerminateProcess(ProcessInfo.hProcess, RTEXITCODE_FAILURE);
+ supR3HardenedError(dwErr, false /*fFatal*/, "DuplicateHandle failed on child process handle: %u\n", dwErr);
+
+ DWORD dwExit;
+ BOOL fExitOk = GetExitCodeProcess(ProcessInfo.hProcess, &dwExit)
+ && dwExit != STILL_ACTIVE;
+ if (!fExitOk)
+ {
+ DWORD dwStartTick = GetTickCount();
+ DWORD dwWait;
+ do
+ {
+ TerminateProcess(ProcessInfo.hProcess, RTEXITCODE_FAILURE);
+ dwWait = WaitForSingleObject(ProcessInfo.hProcess, 1000);
+ fExitOk = GetExitCodeProcess(ProcessInfo.hProcess, &dwExit)
+ && dwExit != STILL_ACTIVE;
+ } while ( !fExitOk
+ && (dwWait == WAIT_TIMEOUT || dwWait == WAIT_IO_COMPLETION)
+ && GetTickCount() - dwStartTick < 60 * 1000);
+ if (fExitOk)
+ supR3HardenedError(dwErr, false /*fFatal*/,
+ "DuplicateHandle failed and we failed to kill child: dwErr=%u dwWait=%u err=%u hProcess=%p\n",
+ dwErr, dwWait, GetLastError(), ProcessInfo.hProcess);
+ }
+ supR3HardenedFatalMsg("supR3HardenedWinReSpawn", kSupInitOp_Misc, VERR_INVALID_NAME,
+ "DuplicateHandle failed on child process handle: %u\n", dwErr);
+ }
+
+ SUPR3HARDENED_ASSERT(CloseHandle(ProcessInfo.hProcess));
+ ProcessInfo.hProcess = NULL;
+
+ /*
+ * Wait for the process to terminate and proxy the termination code.
+ */
+ for (;;)
+ {
+ SetLastError(NO_ERROR);
+ DWORD dwWait = WaitForSingleObject(hProcWait, INFINITE);
+ if ( dwWait == WAIT_OBJECT_0
+ || dwWait == WAIT_ABANDONED_0)
+ break;
+ if ( dwWait != WAIT_TIMEOUT
+ && dwWait != WAIT_IO_COMPLETION)
+ supR3HardenedFatal("WaitForSingleObject returned %#x (last error %#x)\n", dwWait, GetLastError());
+ }
+
+ DWORD dwExit;
+ if ( !GetExitCodeProcess(hProcWait, &dwExit)
+ || dwExit == STILL_ACTIVE)
+ dwExit = RTEXITCODE_FAILURE;
+
+ CloseHandle(hProcWait);
+ suplibHardenedExit((RTEXITCODE)dwExit);
+}
+
+
+/**
+ * Called by the main code if supR3HardenedWinIsReSpawnNeeded returns @c true.
+ *
+ * @returns Program exit code.
+ */
+DECLHIDDEN(int) supR3HardenedWinReSpawn(void)
+{
+ /*
+ * Open the stub device.
+ */
+ HANDLE hFile = RTNT_INVALID_HANDLE_VALUE;
+ IO_STATUS_BLOCK Ios = RTNT_IO_STATUS_BLOCK_INITIALIZER;
+
+ static const WCHAR s_wszName[] = L"\\Device\\VBoxDrvStub";
+ UNICODE_STRING NtName;
+ NtName.Buffer = (PWSTR)s_wszName;
+ NtName.Length = sizeof(s_wszName) - sizeof(WCHAR);
+ NtName.MaximumLength = sizeof(s_wszName);
+
+ OBJECT_ATTRIBUTES ObjAttr;
+ InitializeObjectAttributes(&ObjAttr, &NtName, OBJ_CASE_INSENSITIVE, NULL /*hRootDir*/, NULL /*pSecDesc*/);
+
+ NTSTATUS rcNt = NtCreateFile(&hFile,
+ GENERIC_READ | GENERIC_WRITE,
+ &ObjAttr,
+ &Ios,
+ NULL /* Allocation Size*/,
+ FILE_ATTRIBUTE_NORMAL,
+ FILE_SHARE_READ | FILE_SHARE_WRITE,
+ FILE_OPEN,
+ FILE_NON_DIRECTORY_FILE,
+ NULL /*EaBuffer*/,
+ 0 /*EaLength*/);
+ if (NT_SUCCESS(rcNt))
+ rcNt = Ios.Status;
+ if (!NT_SUCCESS(rcNt))
+ {
+ int rc;
+ if ((rcNt & UINT32_C(0xffff0000)) == 0xe9860000) /* See VBoxDrvNtErr2NtStatus. */ /** @todo #defines for VBoxDrvNtErr2NtStatus mangling */
+ rc = (int)(rcNt | UINT32_C(0xffff0000));
+ else
+ supR3HardenedFatalMsg("supR3HardenedWinReSpawn", kSupInitOp_Driver, VERR_OPEN_FAILED,
+ "NtCreateFile(%ls) failed: %#x\n", s_wszName, rcNt);
+ supR3HardenedFatalMsg("supR3HardenedWinReSpawn", kSupInitOp_Driver, VERR_OPEN_FAILED,
+ "NtCreateFile(%ls) failed: %Rrc (rcNt=%#x)\n", s_wszName, rc, rcNt);
+ }
+
+ /*
+ * Respawn the process with kernel protection for the new process.
+ */
+ return supR3HardenedWinDoReSpawn();
+}
+
+
+/**
+ * Checks if re-spawning is required, replacing the respawn argument if not.
+ *
+ * @returns true if required, false if not. In the latter case, the first
+ * argument in the vector is replaced.
+ * @param cArgs The number of arguments.
+ * @param papszArgs Pointer to the argument vector.
+ */
+DECLHIDDEN(bool) supR3HardenedWinIsReSpawnNeeded(int cArgs, char **papszArgs)
+{
+ SUPR3HARDENED_ASSERT(g_cSuplibHardenedWindowsMainCalls == 1);
+
+ if (cArgs < 1)
+ return true;
+ if (suplibHardenedStrCmp(papszArgs[0], SUPR3_RESPAWN_ARG0))
+ return true;
+
+ /* Replace the argument. */
+ papszArgs[0] = g_szSupLibHardenedExePath;
+ return false;
+}
+
+
+/**
+ * Initializes the windows verficiation bits.
+ * @param fFlags The main flags.
+ */
+DECLHIDDEN(void) supR3HardenedWinInit(uint32_t fFlags)
+{
+ RTErrInfoInitStatic(&g_ErrInfoStatic);
+ int rc = supHardenedWinInitImageVerifier(&g_ErrInfoStatic.Core);
+ if (RT_FAILURE(rc))
+ supR3HardenedFatalMsg("supR3HardenedWinInit", kSupInitOp_Misc, rc,
+ "supHardenedWinInitImageVerifier failed: %s", g_ErrInfoStatic.szMsg);
+ supR3HardenedWinInstallHooks();
+
+#ifndef VBOX_WITH_VISTA_NO_SP
+ /*
+ * Complain about Vista w/o service pack if we're launching a VM.
+ */
+ if ( !(fFlags & SUPSECMAIN_FLAGS_DONT_OPEN_DEV)
+ && g_uNtVerCombined >= SUP_NT_VER_VISTA
+ && g_uNtVerCombined < SUP_MAKE_NT_VER_COMBINED(6, 0, 6001, 0, 0))
+ supR3HardenedFatalMsg("supR3HardenedWinInit", kSupInitOp_Misc, VERR_NOT_SUPPORTED,
+ "Window Vista without any service pack installed is not supported. Please install the latest service pack.");
+#endif
+}
+
+
+/**
+ * Converts the Windows command line string (UTF-16) to an array of UTF-8
+ * arguments suitable for passing to main().
+ *
+ * @returns Pointer to the argument array.
+ * @param pwszCmdLine The UTF-16 windows command line to parse.
+ * @param pcArgs Where to return the number of arguments.
+ */
+static char **suplibCommandLineToArgvWStub(PCRTUTF16 pwszCmdLine, int *pcArgs)
+{
+ /*
+ * Convert the command line string to UTF-8.
+ */
+ int cbNeeded = WideCharToMultiByte(CP_UTF8, 0 /*dwFlags*/, pwszCmdLine, -1, NULL /*pszDst*/, 0 /*cbDst*/,
+ NULL /*pchDefChar*/, NULL /* pfUsedDefChar */);
+ SUPR3HARDENED_ASSERT(cbNeeded > 0);
+ int cbAllocated = cbNeeded + 16;
+ char *pszCmdLine = (char *)suplibHardenedAllocZ(cbAllocated);
+
+ SUPR3HARDENED_ASSERT(WideCharToMultiByte(CP_UTF8, 0 /*dwFlags*/, pwszCmdLine, -1,
+ pszCmdLine, cbAllocated - 1,
+ NULL /*pchDefChar*/, NULL /* pfUsedDefChar */) == cbNeeded);
+
+ /*
+ * Parse the command line, carving argument strings out of it.
+ */
+ int cArgs = 0;
+ int cArgsAllocated = 4;
+ char **papszArgs = (char **)suplibHardenedAllocZ(sizeof(char *) * cArgsAllocated);
+ char *pszSrc = pszCmdLine;
+ for (;;)
+ {
+ /* skip leading blanks. */
+ char ch = *pszSrc;
+ while (suplibCommandLineIsArgSeparator(ch))
+ ch = *++pszSrc;
+ if (!ch)
+ break;
+
+ /* Add argument to the vector. */
+ if (cArgs + 2 >= cArgsAllocated)
+ {
+ cArgsAllocated *= 2;
+ papszArgs = (char **)suplibHardenedReAlloc(papszArgs, sizeof(char *) * cArgsAllocated);
+ }
+ papszArgs[cArgs++] = pszSrc;
+ papszArgs[cArgs] = NULL;
+
+ /* Unquote and unescape the string. */
+ char *pszDst = pszSrc++;
+ bool fQuoted = false;
+ do
+ {
+ if (ch == '"')
+ fQuoted = !fQuoted;
+ else if (ch != '\\' || (*pszSrc != '\\' && *pszSrc != '"'))
+ *pszDst++ = ch;
+ else
+ {
+ unsigned cSlashes = 0;
+ while ((ch = *pszSrc++) == '\\')
+ cSlashes++;
+ if (ch == '"')
+ {
+ while (cSlashes >= 2)
+ {
+ cSlashes -= 2;
+ *pszDst++ = '\\';
+ }
+ if (cSlashes)
+ *pszDst++ = '"';
+ else
+ fQuoted = !fQuoted;
+ }
+ else
+ {
+ pszSrc--;
+ while (cSlashes-- > 0)
+ *pszDst++ = '\\';
+ }
+ }
+
+ ch = *pszSrc++;
+ } while (ch != '\0' && (fQuoted || !suplibCommandLineIsArgSeparator(ch)));
+
+ /* Terminate the argument. */
+ *pszDst = '\0';
+ if (!ch)
+ break;
+ }
+
+ *pcArgs = cArgs;
+ return papszArgs;
+}
+
+
+extern "C" int main(int argc, char **argv, char **envp);
+
+/**
+ * The executable entry point.
+ *
+ * This is normally taken care of by the C runtime library, but we don't want to
+ * get involved with anything as complicated like the CRT in this setup. So, we
+ * it everything ourselves, including parameter parsing.
+ */
+extern "C" void __stdcall suplibHardenedWindowsMain(void)
+{
+ RTEXITCODE rcExit = RTEXITCODE_FAILURE;
+
+ g_cSuplibHardenedWindowsMainCalls++;
+
+ /*
+ * Init g_uNtVerCombined. (The code is shared with SUPR3.lib and lives in
+ * SUPHardenedVerfiyImage-win.cpp.)
+ */
+ supR3HardenedWinInitVersion();
+
+ /*
+ * Get the executable name.
+ */
+ DWORD cwcExecName = GetModuleFileNameW(GetModuleHandle(NULL), g_wszSupLibHardenedExePath,
+ RT_ELEMENTS(g_wszSupLibHardenedExePath));
+ if (cwcExecName >= RT_ELEMENTS(g_wszSupLibHardenedExePath))
+ supR3HardenedFatalMsg("suplibHardenedWindowsMain", kSupInitOp_Integrity, VERR_BUFFER_OVERFLOW,
+ "The executable path is too long.");
+
+ /* The NT version. */
+ HANDLE hFile = CreateFileW(g_wszSupLibHardenedExePath, GENERIC_READ, FILE_SHARE_READ, NULL /*pSecurityAttributes*/,
+ OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL /*hTemplateFile*/);
+ if (hFile == NULL || hFile == INVALID_HANDLE_VALUE)
+ supR3HardenedFatalMsg("suplibHardenedWindowsMain", kSupInitOp_Integrity, RTErrConvertFromWin32(GetLastError()),
+ "Error opening the executable: %u (%ls).", GetLastError());
+ RT_ZERO(g_SupLibHardenedExeNtPath);
+ ULONG cbIgn;
+ NTSTATUS rcNt = NtQueryObject(hFile, ObjectNameInformation, &g_SupLibHardenedExeNtPath,
+ sizeof(g_SupLibHardenedExeNtPath) - sizeof(WCHAR), &cbIgn);
+ if (!NT_SUCCESS(rcNt))
+ supR3HardenedFatalMsg("suplibHardenedWindowsMain", kSupInitOp_Integrity, RTErrConvertFromNtStatus(rcNt),
+ "NtQueryObject -> %#x (on %ls)\n", rcNt, g_wszSupLibHardenedExePath);
+ CloseHandle(hFile);
+
+ /* The NT executable name offset / dir path length. */
+ g_offSupLibHardenedExeNtName = g_SupLibHardenedExeNtPath.UniStr.Length / sizeof(WCHAR);
+ while ( g_offSupLibHardenedExeNtName > 1
+ && g_SupLibHardenedExeNtPath.UniStr.Buffer[g_offSupLibHardenedExeNtName - 1] != '\\' )
+ g_offSupLibHardenedExeNtName--;
+
+ /*
+ * Convert the arguments to UTF-8 and call the C/C++ main function.
+ */
+ int cArgs;
+ char **papszArgs = suplibCommandLineToArgvWStub(GetCommandLineW(), &cArgs);
+
+ rcExit = (RTEXITCODE)main(cArgs, papszArgs, NULL);
+
+ /*
+ * Exit the process (never return).
+ */
+ suplibHardenedExit(rcExit);
+}
+
diff --git a/src/VBox/HostDrivers/Support/win/SUPR3HardenedMainA-win.asm b/src/VBox/HostDrivers/Support/win/SUPR3HardenedMainA-win.asm
new file mode 100644
index 00000000000..282ce6a7b2a
--- /dev/null
+++ b/src/VBox/HostDrivers/Support/win/SUPR3HardenedMainA-win.asm
@@ -0,0 +1,76 @@
+; $Id$
+;; @file
+; VirtualBox Support Library - Hardened main(), Windows assembly bits.
+;
+
+;
+; Copyright (C) 2012-2014 Oracle Corporation
+;
+; This file is part of VirtualBox Open Source Edition (OSE), as
+; available from http://www.virtualbox.org. This file is free software;
+; you can redistribute it and/or modify it under the terms of the GNU
+; General Public License (GPL) as published by the Free Software
+; Foundation, in version 2 as it comes in the "COPYING" file of the
+; VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+; hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+;
+; The contents of this file may alternatively be used under the terms
+; of the Common Development and Distribution License Version 1.0
+; (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+; VirtualBox OSE distribution, in which case the provisions of the
+; CDDL are applicable instead of those of the GPL.
+;
+; You may elect to license modified versions of this file under the
+; terms and conditions of either the GPL or the CDDL or both.
+;
+
+;*******************************************************************************
+;* Header Files *
+;*******************************************************************************
+%include "iprt/asmdefs.mac"
+
+
+; External data.
+extern NAME(g_pfnNtCreateSectionJmpBack)
+
+
+BEGINCODE
+
+;
+; 64-bit
+;
+%ifdef RT_ARCH_AMD64
+ %macro supR3HardenedJmpBack_NtCreateSection_Xxx 1
+ BEGINPROC supR3HardenedJmpBack_NtCreateSection_ %+ %1
+ ; The code we replaced.
+ mov r10, rcx
+ mov eax, %1
+
+ ; Jump back to the original code.
+ jmp [NAME(g_pfnNtCreateSectionJmpBack) wrt RIP]
+ ENDPROC supR3HardenedJmpBack_NtCreateSection_ %+ %1
+ %endm
+ %define SYSCALL(a_Num) supR3HardenedJmpBack_NtCreateSection_Xxx a_Num
+ %include "NtCreateSection-template-amd64-syscall-type-1.h"
+
+%endif
+
+
+;
+; 32-bit.
+;
+%ifdef RT_ARCH_X86
+ %macro supR3HardenedJmpBack_NtCreateSection_Xxx 1
+ BEGINPROC supR3HardenedJmpBack_NtCreateSection_ %+ %1
+ ; The code we replaced.
+ mov eax, %1
+
+ ; Jump back to the original code.
+ jmp [NAME(g_pfnNtCreateSectionJmpBack)]
+ ENDPROC supR3HardenedJmpBack_NtCreateSection_ %+ %1
+ %endm
+ %define SYSCALL(a_Num) supR3HardenedJmpBack_NtCreateSection_Xxx a_Num
+ %include "NtCreateSection-template-x86-syscall-type-1.h"
+
+%endif
+
diff --git a/src/VBox/HostDrivers/Support/win/SUPR3HardenedNoCrt-win.cpp b/src/VBox/HostDrivers/Support/win/SUPR3HardenedNoCrt-win.cpp
new file mode 100644
index 00000000000..ea644ff2df9
--- /dev/null
+++ b/src/VBox/HostDrivers/Support/win/SUPR3HardenedNoCrt-win.cpp
@@ -0,0 +1,191 @@
+/* $Id$ */
+/** @file
+ * VirtualBox Support Library - Hardened main(), windows bits.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include <iprt/nt/nt-and-windows.h>
+#include <AccCtrl.h>
+#include <AclApi.h>
+#ifndef PROCESS_SET_LIMITED_INFORMATION
+# define PROCESS_SET_LIMITED_INFORMATION 0x2000
+#endif
+
+#include <VBox/sup.h>
+#include <VBox/err.h>
+#include <iprt/assert.h>
+#include <iprt/ctype.h>
+#include <iprt/string.h>
+#include <iprt/initterm.h>
+#include <iprt/param.h>
+#include <iprt/mem.h>
+
+#include "SUPLibInternal.h"
+#include "win/SUPHardenedVerify-win.h"
+
+
+/*
+ * assert.cpp
+ */
+
+RTDATADECL(char) g_szRTAssertMsg1[1024];
+RTDATADECL(char) g_szRTAssertMsg2[4096];
+RTDATADECL(const char * volatile) g_pszRTAssertExpr;
+RTDATADECL(const char * volatile) g_pszRTAssertFile;
+RTDATADECL(uint32_t volatile) g_u32RTAssertLine;
+RTDATADECL(const char * volatile) g_pszRTAssertFunction;
+
+RTDECL(bool) RTAssertMayPanic(void)
+{
+ return true;
+}
+
+
+RTDECL(void) RTAssertMsg1(const char *pszExpr, unsigned uLine, const char *pszFile, const char *pszFunction)
+{
+ /*
+ * Fill in the globals.
+ */
+ g_pszRTAssertExpr = pszExpr;
+ g_pszRTAssertFile = pszFile;
+ g_pszRTAssertFunction = pszFunction;
+ g_u32RTAssertLine = uLine;
+ RTStrPrintf(g_szRTAssertMsg1, sizeof(g_szRTAssertMsg1),
+ "\n!!Assertion Failed!!\n"
+ "Expression: %s\n"
+ "Location : %s(%d) %s\n",
+ pszExpr, pszFile, uLine, pszFunction);
+}
+
+
+RTDECL(void) RTAssertMsg2V(const char *pszFormat, va_list va)
+{
+ RTStrPrintfV(g_szRTAssertMsg2, sizeof(g_szRTAssertMsg2), pszFormat, va);
+ if (g_enmSupR3HardenedMainState < SUPR3HARDENEDMAINSTATE_CALLED_TRUSTED_MAIN)
+ supR3HardenedFatalMsg(g_pszRTAssertExpr, kSupInitOp_Misc, VERR_INTERNAL_ERROR,
+ "%s%s", g_szRTAssertMsg1, g_szRTAssertMsg2);
+ else
+ supR3HardenedError(VERR_INTERNAL_ERROR, false/*fFatal*/, "%s%s", g_szRTAssertMsg1, g_szRTAssertMsg2);
+}
+
+
+/*
+ * Memory allocator.
+ */
+
+RTDECL(void *) RTMemTmpAllocTag(size_t cb, const char *pszTag) RT_NO_THROW
+{
+ return RTMemAllocTag(cb, pszTag);
+}
+
+
+RTDECL(void *) RTMemTmpAllocZTag(size_t cb, const char *pszTag) RT_NO_THROW
+{
+ return RTMemAllocZTag(cb, pszTag);
+}
+
+
+RTDECL(void) RTMemTmpFree(void *pv) RT_NO_THROW
+{
+ RTMemFree(pv);
+}
+
+
+RTDECL(void *) RTMemAllocTag(size_t cb, const char *pszTag) RT_NO_THROW
+{
+ return suplibHardenedAllocZ(cb);
+}
+
+
+RTDECL(void *) RTMemAllocZTag(size_t cb, const char *pszTag) RT_NO_THROW
+{
+ return suplibHardenedAllocZ(cb);
+}
+
+
+RTDECL(void *) RTMemAllocVarTag(size_t cbUnaligned, const char *pszTag) RT_NO_THROW
+{
+ size_t cbAligned;
+ if (cbUnaligned >= 16)
+ cbAligned = RT_ALIGN_Z(cbUnaligned, 16);
+ else
+ cbAligned = RT_ALIGN_Z(cbUnaligned, sizeof(void *));
+ return RTMemAllocTag(cbAligned, pszTag);
+}
+
+
+RTDECL(void *) RTMemAllocZVarTag(size_t cbUnaligned, const char *pszTag) RT_NO_THROW
+{
+ size_t cbAligned;
+ if (cbUnaligned >= 16)
+ cbAligned = RT_ALIGN_Z(cbUnaligned, 16);
+ else
+ cbAligned = RT_ALIGN_Z(cbUnaligned, sizeof(void *));
+ return RTMemAllocZTag(cbAligned, pszTag);
+}
+
+
+RTDECL(void *) RTMemReallocTag(void *pvOld, size_t cbNew, const char *pszTag) RT_NO_THROW
+{
+ return suplibHardenedReAlloc(pvOld, cbNew);
+}
+
+
+RTDECL(void) RTMemFree(void *pv) RT_NO_THROW
+{
+ suplibHardenedFree(pv);
+}
+
+
+/*
+ * Simplified version of RTMemWipeThoroughly that avoids dragging in the
+ * random number code.
+ */
+
+RTDECL(void) RTMemWipeThoroughly(void *pv, size_t cb, size_t cMinPasses) RT_NO_THROW
+{
+ size_t cPasses = RT_MIN(cMinPasses, 6);
+ static const uint32_t s_aPatterns[] = { 0x00, 0xaa, 0x55, 0xff, 0xf0, 0x0f, 0xcc, 0x3c, 0xc3 };
+ uint32_t iPattern = 0;
+ do
+ {
+ memset(pv, s_aPatterns[iPattern], cb);
+ iPattern = (iPattern + 1) % RT_ELEMENTS(s_aPatterns);
+ ASMMemoryFence();
+
+ memset(pv, s_aPatterns[iPattern], cb);
+ iPattern = (iPattern + 1) % RT_ELEMENTS(s_aPatterns);
+ ASMMemoryFence();
+
+ memset(pv, s_aPatterns[iPattern], cb);
+ iPattern = (iPattern + 1) % RT_ELEMENTS(s_aPatterns);
+ ASMMemoryFence();
+ } while (cPasses-- > 0);
+
+ memset(pv, 0xff, cb);
+ ASMMemoryFence();
+}
+
diff --git a/src/VBox/HostDrivers/Support/win/VBoxSupLib-win.cpp b/src/VBox/HostDrivers/Support/win/VBoxSupLib-win.cpp
new file mode 100644
index 00000000000..ed307a35949
--- /dev/null
+++ b/src/VBox/HostDrivers/Support/win/VBoxSupLib-win.cpp
@@ -0,0 +1,92 @@
+/* $Id$ */
+/** @file
+ * IPRT - VBoxSupLib.dll, Windows.
+ */
+
+/*
+ * Copyright (C) 2006-2012 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include <iprt/nt/nt-and-windows.h>
+
+#include <iprt/path.h>
+
+
+/**
+ * The Dll main entry point.
+ */
+extern "C"
+BOOL __stdcall DllMainEntrypoint(HANDLE hModule, DWORD dwReason, PVOID pvReserved)
+{
+ switch (dwReason)
+ {
+ /*
+ * Make sure the DLL isn't ever unloaded.
+ */
+ case DLL_PROCESS_ATTACH:
+ {
+ WCHAR wszName[RTPATH_MAX];
+ SetLastError(NO_ERROR);
+ if ( GetModuleFileNameW((HMODULE)hModule, wszName, RT_ELEMENTS(wszName)) > 0
+ && GetLastError() == NO_ERROR)
+ {
+ int cExtraLoads = 2;
+ while (cExtraLoads-- > 0)
+ LoadLibraryW(wszName);
+ }
+ break;
+ }
+
+ case DLL_THREAD_ATTACH:
+ {
+#ifndef VBOX_WITHOUT_DEBUGGER_CHECKS
+ /*
+ * Anti debugging hack that prevents most debug notifications from
+ * ending up in the debugger.
+ */
+ NTSTATUS rcNt = NtSetInformationThread(GetCurrentThread(), ThreadHideFromDebugger, NULL, 0);
+ if (!NT_SUCCESS(rcNt))
+ {
+ __debugbreak();
+ return FALSE;
+ }
+#endif
+ break;
+ }
+
+ case DLL_THREAD_DETACH:
+ /* Nothing to do. */
+ break;
+
+ case DLL_PROCESS_DETACH:
+ /* Nothing to do. */
+ break;
+
+ default:
+ /* ignore */
+ break;
+ }
+ return TRUE;
+}
+
diff --git a/src/VBox/Installer/win/VBoxMergeApp.wxi b/src/VBox/Installer/win/VBoxMergeApp.wxi
index 25db74dbbdd..479df02a2b4 100644
--- a/src/VBox/Installer/win/VBoxMergeApp.wxi
+++ b/src/VBox/Installer/win/VBoxMergeApp.wxi
@@ -185,6 +185,8 @@
<File Id="file_VBoxREM64.dll" Name="VBoxREM64.dll"
Source="$(env.PATH_OUT)\bin\VBoxREM64.dll" />
<?endif ?>
+ <File Id="file_VBoxSupLib.dll" Name="VBoxSupLib.dll"
+ Source="$(env.PATH_OUT)\bin\VBoxSupLib.dll" />
<File Id="file_VBoxVMM.dll" Name="VBoxVMM.dll"
Source="$(env.PATH_OUT)\bin\VBoxVMM.dll" />
<?if $(env.VBOX_WITH_VRDP) = "yes" ?>
diff --git a/src/VBox/Main/src-server/MachineImpl.cpp b/src/VBox/Main/src-server/MachineImpl.cpp
index 4fc4f9f6b12..899b247412c 100644
--- a/src/VBox/Main/src-server/MachineImpl.cpp
+++ b/src/VBox/Main/src-server/MachineImpl.cpp
@@ -3165,6 +3165,19 @@ HRESULT Machine::lockMachine(const ComPtr<ISession> &aSession,
LogFlowThisFunc(("mSession.mPID=%d(0x%x)\n", mData->mSession.mPID, mData->mSession.mPID));
LogFlowThisFunc(("session.pid=%d(0x%x)\n", pid, pid));
+#if defined(VBOX_WITH_HARDENING) && defined(RT_OS_WINDOWS)
+ /* Hardened windows builds have spawns two processes when a VM is
+ launched, the 2nd one is the one that will end up here. */
+ RTPROCESS ppid;
+ int rc = RTProcQueryParent(pid, &ppid);
+ if ( (RT_SUCCESS(rc) && mData->mSession.mPID == ppid)
+ || rc == VERR_ACCESS_DENIED)
+ {
+ LogFlowThisFunc(("mSession.mPID => %d(%#x) - windows hardening stub\n", mData->mSession.mPID, pid));
+ mData->mSession.mPID = pid;
+ }
+#endif
+
if (mData->mSession.mPID != pid)
return setError(E_ACCESSDENIED,
tr("An unexpected process (PID=0x%08X) has tried to lock the "
diff --git a/src/VBox/NetworkServices/DHCP/Makefile.kmk b/src/VBox/NetworkServices/DHCP/Makefile.kmk
index a5e89f59586..118ef9f1f8c 100644
--- a/src/VBox/NetworkServices/DHCP/Makefile.kmk
+++ b/src/VBox/NetworkServices/DHCP/Makefile.kmk
@@ -35,6 +35,7 @@ endif
VBoxNetDHCPHardened_TEMPLATE = VBOXR3HARDENEDEXE
VBoxNetDHCPHardened_SOURCES = VBoxNetDHCPHardened.cpp
VBoxNetDHCPHardened_NAME = VBoxNetDHCP
+VBoxNetDHCPHardened_LDFLAGS.win = /SUBSYSTEM:windows
#
diff --git a/src/VBox/NetworkServices/NAT/Makefile.kmk b/src/VBox/NetworkServices/NAT/Makefile.kmk
index 81cf26d1874..a482d1e3486 100644
--- a/src/VBox/NetworkServices/NAT/Makefile.kmk
+++ b/src/VBox/NetworkServices/NAT/Makefile.kmk
@@ -35,6 +35,7 @@ ifdef VBOX_WITH_HARDENING
VBoxNetLwipNATHardened_DEFS += SERVICE_NAME=\"VBoxNetNAT\"
VBoxNetLwipNATHardened_TEMPLATE=VBOXR3HARDENEDEXE
VBoxNetLwipNATHardened_NAME = VBoxNetNAT
+ VBoxNetLwipNATHardened_LDFLAGS.win = /SUBSYSTEM:windows
endif
VBoxNetLwipNAT_TEMPLATE =
diff --git a/src/VBox/RDP/client/Makefile.in b/src/VBox/RDP/client/Makefile.in
index 145cad088ba..d61607b2d40 100644
--- a/src/VBox/RDP/client/Makefile.in
+++ b/src/VBox/RDP/client/Makefile.in
@@ -28,7 +28,7 @@ VNCLINK = @VNCLINK@
SOUNDOBJ = @SOUNDOBJ@
SCARDOBJ = @SCARDOBJ@
-RDPOBJ = tcp.o iso.o mcs.o secure.o licence.o rdp.o orders.o bitmap.o cache.o rdp5.o channels.o rdpdr.o serial.o printer.o disk.o parallel.o printercache.o mppc.o pstcache.o lspci.o seamless.o ssl.o Runtime/common/alloc/alloc.o Runtime/common/err/errmsg.o Runtime/common/err/errmsgxpcom.o Runtime/common/err/RTErrConvertFromErrno.o Runtime/common/err/RTErrConvertToErrno.o Runtime/common/path/RTPathAppend.o Runtime/common/path/RTPathAppendEx.o Runtime/common/path/RTPathCountComponents.o Runtime/common/path/RTPathFilename.o Runtime/common/path/rtPathRootSpecLen.o Runtime/common/path/RTPathStripFilename.o Runtime/common/path/RTPathStripTrailingSlash.o Runtime/common/path/rtPathVolumeSpecLen.o Runtime/common/string/RTStrCmp.o Runtime/common/string/RTStrNCmp.o Runtime/common/string/RTStrCopy.o Runtime/common/string/RTStrNLen.o Runtime/common/string/straprintf.o Runtime/common/string/stringalloc.o Runtime/common/string/strformat.o Runtime/common/string/strformatrt.o Runtime/common/string/strformattype.o Runtime/common/string/strprintf.o Runtime/common/string/strstrip.o Runtime/common/string/strtonum.o Runtime/common/string/unidata.o Runtime/common/string/utf-16.o Runtime/common/string/utf-8.o Runtime/common/string/utf-8-case.o Runtime/common/time/timesysalias.o Runtime/generic/pathhost-generic.o Runtime/r3/alloc.o Runtime/r3/dir.o Runtime/r3/fileio.o Runtime/r3/fs.o Runtime/r3/linux/sysfs.o Runtime/r3/linux/time-linux.o Runtime/r3/posix/dir-posix.o Runtime/r3/posix/env-posix.o Runtime/r3/posix/fileio-posix.o Runtime/r3/posix/fs2-posix.o Runtime/r3/posix/fs3-posix.o Runtime/r3/posix/path-posix.o Runtime/r3/posix/path2-posix.o Runtime/r3/posix/utf8-posix.o Runtime/r3/stream.o vrdp/rdpusb.o vrdp/USBGetDevices.o vrdp/USBLib.o vrdp/linux/USBProxyDevice-linux.o
+RDPOBJ = tcp.o iso.o mcs.o secure.o licence.o rdp.o orders.o bitmap.o cache.o rdp5.o channels.o rdpdr.o serial.o printer.o disk.o parallel.o printercache.o mppc.o pstcache.o lspci.o seamless.o ssl.o Runtime/common/alloc/alloc.o Runtime/common/err/errmsg.o Runtime/common/err/errmsgxpcom.o Runtime/common/err/RTErrConvertFromErrno.o Runtime/common/err/RTErrConvertToErrno.o Runtime/common/misc/sg.o Runtime/common/path/RTPathAppend.o Runtime/common/path/RTPathAppendEx.o Runtime/common/path/RTPathCountComponents.o Runtime/common/path/RTPathFilename.o Runtime/common/path/rtPathRootSpecLen.o Runtime/common/path/RTPathStripFilename.o Runtime/common/path/RTPathStripTrailingSlash.o Runtime/common/path/rtPathVolumeSpecLen.o Runtime/common/string/RTStrCmp.o Runtime/common/string/RTStrNCmp.o Runtime/common/string/RTStrCopy.o Runtime/common/string/RTStrNLen.o Runtime/common/string/straprintf.o Runtime/common/string/stringalloc.o Runtime/common/string/strformat.o Runtime/common/string/strformatrt.o Runtime/common/string/strformattype.o Runtime/common/string/strprintf.o Runtime/common/string/strstrip.o Runtime/common/string/strtonum.o Runtime/common/string/unidata-flags.o Runtime/common/string/unidata-upper.o Runtime/common/string/unidata-lower.o Runtime/common/string/utf-16.o Runtime/common/string/utf-8.o Runtime/common/string/utf-8-case.o Runtime/common/time/timesysalias.o Runtime/generic/pathhost-generic.o Runtime/r3/alloc.o Runtime/r3/dir.o Runtime/r3/fileio.o Runtime/r3/fs.o Runtime/r3/linux/sysfs.o Runtime/r3/linux/time-linux.o Runtime/r3/posix/dir-posix.o Runtime/r3/posix/env-posix.o Runtime/r3/posix/fileio-posix.o Runtime/r3/posix/fs2-posix.o Runtime/r3/posix/fs3-posix.o Runtime/r3/posix/path-posix.o Runtime/r3/posix/path2-posix.o Runtime/r3/posix/pipe-posix.o Runtime/r3/posix/thread2-posix.o Runtime/r3/posix/utf8-posix.o Runtime/r3/stream.o vrdp/rdpusb.o vrdp/USBGetDevices.o vrdp/USBLib.o vrdp/linux/USBProxyDevice-linux.o
X11OBJ = rdesktop.o xwin.o xkeymap.o ewmhints.o xclip.o cliprdr.o
VNCOBJ = vnc/rdp2vnc.o vnc/vnc.o vnc/xkeymap.o vnc/x11stubs.o
diff --git a/src/VBox/RDP/client/Makefile.kmk b/src/VBox/RDP/client/Makefile.kmk
index b5cad7b60be..a961f328852 100644
--- a/src/VBox/RDP/client/Makefile.kmk
+++ b/src/VBox/RDP/client/Makefile.kmk
@@ -270,20 +270,27 @@ rdesktop-src_SOURCES = \
$(PATH_ROOT)/include/iprt/avl.h=>include/iprt/avl.h \
$(PATH_ROOT)/include/iprt/cdefs.h=>include/iprt/cdefs.h \
$(PATH_ROOT)/include/iprt/cpp/autores.h=>include/iprt/cpp/autores.h \
+ $(PATH_ROOT)/include/iprt/critsect.h=>include/iprt/critsect.h \
$(PATH_ROOT)/include/iprt/ctype.h=>include/iprt/ctype.h \
$(PATH_ROOT)/include/iprt/dir.h=>include/iprt/dir.h \
$(PATH_ROOT)/include/iprt/env.h=>include/iprt/env.h \
$(PATH_ROOT)/include/iprt/err.h=>include/iprt/err.h \
+ $(PATH_ROOT)/include/iprt/errno.h=>include/iprt/errno.h \
$(PATH_ROOT)/include/iprt/file.h=>include/iprt/file.h \
$(PATH_ROOT)/include/iprt/fs.h=>include/iprt/fs.h \
$(PATH_ROOT)/include/iprt/linux/sysfs.h=>include/iprt/linux/sysfs.h \
$(PATH_ROOT)/include/iprt/list.h=>include/iprt/list.h \
$(PATH_ROOT)/include/iprt/log.h=>include/iprt/log.h \
+ $(PATH_ROOT)/include/iprt/lockvalidator.h=>include/iprt/lockvalidator.h \
$(PATH_ROOT)/include/iprt/mem.h=>include/iprt/mem.h \
$(PATH_ROOT)/include/iprt/net.h=>include/iprt/net.h \
$(PATH_ROOT)/include/iprt/param.h=>include/iprt/param.h \
$(PATH_ROOT)/include/iprt/path.h=>include/iprt/path.h \
+ $(PATH_ROOT)/include/iprt/pipe.h=>include/iprt/pipe.h \
+ $(PATH_ROOT)/include/iprt/poll.h=>include/iprt/poll.h \
$(PATH_ROOT)/include/iprt/process.h=>include/iprt/process.h \
+ $(PATH_ROOT)/include/iprt/queueatomic.h=>include/iprt/queueatomic.h \
+ $(PATH_ROOT)/include/iprt/sg.h=>include/iprt/sg.h \
$(PATH_ROOT)/include/iprt/stdarg.h=>include/iprt/stdarg.h \
$(PATH_ROOT)/include/iprt/stdint.h=>include/iprt/stdint.h \
$(PATH_ROOT)/include/iprt/stream.h=>include/iprt/stream.h \
@@ -314,6 +321,7 @@ rdesktop-src_SOURCES = \
$(PATH_ROOT)/src/VBox/Runtime/common/err/errmsgxpcom.cpp=>Runtime/common/err/errmsgxpcom.cpp \
$(PATH_ROOT)/src/VBox/Runtime/common/err/RTErrConvertFromErrno.cpp=>Runtime/common/err/RTErrConvertFromErrno.cpp \
$(PATH_ROOT)/src/VBox/Runtime/common/err/RTErrConvertToErrno.cpp=>Runtime/common/err/RTErrConvertToErrno.cpp \
+ $(PATH_ROOT)/src/VBox/Runtime/common/misc/sg.cpp=>Runtime/common/misc/sg.cpp \
$(PATH_ROOT)/src/VBox/Runtime/common/path/RTPathAppend.cpp=>Runtime/common/path/RTPathAppend.cpp \
$(PATH_ROOT)/src/VBox/Runtime/common/path/RTPathAppendEx.cpp=>Runtime/common/path/RTPathAppendEx.cpp \
$(PATH_ROOT)/src/VBox/Runtime/common/path/RTPathCountComponents.cpp=>Runtime/common/path/RTPathCountComponents.cpp \
@@ -334,7 +342,9 @@ rdesktop-src_SOURCES = \
$(PATH_ROOT)/src/VBox/Runtime/common/string/strprintf.cpp=>Runtime/common/string/strprintf.cpp \
$(PATH_ROOT)/src/VBox/Runtime/common/string/strstrip.cpp=>Runtime/common/string/strstrip.cpp \
$(PATH_ROOT)/src/VBox/Runtime/common/string/strtonum.cpp=>Runtime/common/string/strtonum.cpp \
- $(PATH_ROOT)/src/VBox/Runtime/common/string/unidata.cpp=>Runtime/common/string/unidata.cpp \
+ $(PATH_ROOT)/src/VBox/Runtime/common/string/unidata-flags.cpp=>Runtime/common/string/unidata-flags.cpp \
+ $(PATH_ROOT)/src/VBox/Runtime/common/string/unidata-upper.cpp=>Runtime/common/string/unidata-upper.cpp \
+ $(PATH_ROOT)/src/VBox/Runtime/common/string/unidata-lower.cpp=>Runtime/common/string/unidata-lower.cpp \
$(PATH_ROOT)/src/VBox/Runtime/common/string/utf-16.cpp=>Runtime/common/string/utf-16.cpp \
$(PATH_ROOT)/src/VBox/Runtime/common/string/utf-8.cpp=>Runtime/common/string/utf-8.cpp \
$(PATH_ROOT)/src/VBox/Runtime/common/string/utf-8-case.cpp=>Runtime/common/string/utf-8-case.cpp \
@@ -345,11 +355,14 @@ rdesktop-src_SOURCES = \
$(PATH_ROOT)/src/VBox/Runtime/include/internal/file.h=>include/internal/file.h \
$(PATH_ROOT)/src/VBox/Runtime/include/internal/fs.h=>include/internal/fs.h \
$(PATH_ROOT)/src/VBox/Runtime/include/internal/iprt.h=>include/internal/iprt.h \
+ $(PATH_ROOT)/src/VBox/Runtime/include/internal/lockvalidator.h=>include/internal/lockvalidator.h \
$(PATH_ROOT)/src/VBox/Runtime/include/internal/magics.h=>include/internal/magics.h \
$(PATH_ROOT)/src/VBox/Runtime/include/internal/mem.h=>include/internal/mem.h \
$(PATH_ROOT)/src/VBox/Runtime/include/internal/path.h=>include/internal/path.h \
+ $(PATH_ROOT)/src/VBox/Runtime/include/internal/pipe.h=>include/internal/pipe.h \
$(PATH_ROOT)/src/VBox/Runtime/include/internal/process.h=>include/internal/process.h \
$(PATH_ROOT)/src/VBox/Runtime/include/internal/string.h=>include/internal/string.h \
+ $(PATH_ROOT)/src/VBox/Runtime/include/internal/thread.h=>include/internal/thread.h \
$(PATH_ROOT)/src/VBox/Runtime/include/internal/time.h=>include/internal/time.h \
$(PATH_ROOT)/src/VBox/Runtime/r3/alloc.cpp=>Runtime/r3/alloc.cpp \
$(PATH_ROOT)/src/VBox/Runtime/r3/alloc-ef.h=>Runtime/r3/alloc-ef.h \
@@ -365,6 +378,8 @@ rdesktop-src_SOURCES = \
$(PATH_ROOT)/src/VBox/Runtime/r3/posix/fs3-posix.cpp=>Runtime/r3/posix/fs3-posix.cpp \
$(PATH_ROOT)/src/VBox/Runtime/r3/posix/path-posix.cpp=>Runtime/r3/posix/path-posix.cpp \
$(PATH_ROOT)/src/VBox/Runtime/r3/posix/path2-posix.cpp=>Runtime/r3/posix/path2-posix.cpp \
+ $(PATH_ROOT)/src/VBox/Runtime/r3/posix/pipe-posix.cpp=>Runtime/r3/posix/pipe-posix.cpp \
+ $(PATH_ROOT)/src/VBox/Runtime/r3/posix/thread2-posix.cpp=>Runtime/r3/posix/thread2-posix.cpp \
$(PATH_ROOT)/src/VBox/Runtime/r3/posix/utf8-posix.cpp=>Runtime/r3/posix/utf8-posix.cpp \
$(PATH_ROOT)/src/VBox/Runtime/r3/stream.cpp=>Runtime/r3/stream.cpp
diff --git a/src/VBox/Runtime/Makefile.kmk b/src/VBox/Runtime/Makefile.kmk
index db94d6c17f2..538835702b5 100644
--- a/src/VBox/Runtime/Makefile.kmk
+++ b/src/VBox/Runtime/Makefile.kmk
@@ -145,7 +145,7 @@ common/misc/buildconfig.cpp_DEFS = \
IPRT_BLDCFG_TYPE=\"$(KBUILD_TYPE)\"
#
-# Unicode Specification reader used to regenerate unidata.cpp.
+# Unicode Specification reader used to regenerate unidata-*.cpp.
#
uniread_TEMPLATE = VBoxBldProg
uniread_SOURCES = common/string/uniread.cpp
@@ -225,7 +225,16 @@ endif
RuntimeR3_TEMPLATE = VBoxR3Static
RuntimeR3_SDKS = VBOX_OPENSSL VBOX_LIBXML2
RuntimeR3_SDKS.win = $(VBOX_WINPSDK) $(VBOX_WINDDK)
-RuntimeR3_DEFS = IN_RT_R3 IN_SUP_R3 LDR_WITH_NATIVE LDR_WITH_ELF32 LDR_WITH_PE RT_WITH_VBOX RT_NO_GIP
+RuntimeR3_DEFS = \
+ IN_RT_R3 \
+ IN_SUP_R3 \
+ LDR_WITH_NATIVE \
+ LDR_WITH_ELF32 \
+ LDR_WITH_PE \
+ RT_WITH_VBOX \
+ RT_NO_GIP \
+ RT_WITHOUT_NOCRT_WRAPPERS \
+ IPRT_WITH_OPENSSL
#RuntimeR3_DEFS += RTMEM_WRAP_TO_EF_APIS
ifdef IPRT_WITH_KSTUFF
RuntimeR3_DEFS += LDR_WITH_KLDR
@@ -261,10 +270,37 @@ RuntimeR3_SOURCES = \
common/alloc/heapoffset.cpp \
common/alloc/memcache.cpp \
common/alloc/memtracker.cpp \
+ common/asn1/asn1-basics.cpp \
+ common/asn1/asn1-cursor.cpp \
+ common/asn1/asn1-default-allocator.cpp \
+ common/asn1/asn1-dump.cpp \
+ common/asn1/asn1-encode.cpp \
+ common/asn1/asn1-ut-bitstring.cpp \
+ common/asn1/asn1-ut-bitstring-decode.cpp \
+ common/asn1/asn1-ut-boolean.cpp \
+ common/asn1/asn1-ut-boolean-decode.cpp \
+ common/asn1/asn1-ut-core.cpp \
+ common/asn1/asn1-ut-core-decode.cpp \
+ common/asn1/asn1-ut-dyntype.cpp \
+ common/asn1/asn1-ut-dyntype-decode.cpp \
+ common/asn1/asn1-ut-integer.cpp \
+ common/asn1/asn1-ut-integer-decode.cpp \
+ common/asn1/asn1-ut-null.cpp \
+ common/asn1/asn1-ut-null-decode.cpp \
+ common/asn1/asn1-ut-objid.cpp \
+ common/asn1/asn1-ut-objid-decode.cpp \
+ common/asn1/asn1-ut-octetstring.cpp \
+ common/asn1/asn1-ut-octetstring-decode.cpp \
+ common/asn1/asn1-ut-string.cpp \
+ common/asn1/asn1-ut-string-decode.cpp \
+ common/asn1/asn1-ut-time.cpp \
+ common/asn1/asn1-ut-time-decode.cpp \
common/checksum/adler32.cpp \
common/checksum/crc32.cpp \
common/checksum/crc32c.cpp \
common/checksum/crc64.cpp \
+ common/checksum/md2.cpp \
+ common/checksum/md2str.cpp \
common/checksum/md5.cpp \
common/checksum/md5str.cpp \
common/checksum/ipv4.cpp \
@@ -282,6 +318,42 @@ RuntimeR3_SOURCES = \
common/checksum/sha512.cpp \
common/checksum/sha512str.cpp \
common/checksum/x509.cpp \
+ common/crypto/digest-core.cpp \
+ common/crypto/digest-builtin.cpp \
+ common/crypto/iprt-openssl.cpp \
+ common/crypto/rsa-asn1-decoder.cpp \
+ common/crypto/rsa-core.cpp \
+ common/crypto/rsa-init.cpp \
+ common/crypto/rsa-sanity.cpp \
+ common/crypto/pemfile.cpp \
+ common/crypto/pkcs7-asn1-decoder.cpp \
+ common/crypto/pkcs7-core.cpp \
+ common/crypto/pkcs7-init.cpp \
+ common/crypto/pkcs7-sanity.cpp \
+ common/crypto/pkcs7-verify.cpp \
+ common/crypto/pkix-signature-builtin.cpp \
+ common/crypto/pkix-signature-core.cpp \
+ common/crypto/pkix-signature-rsa.cpp \
+ common/crypto/pkix-util.cpp \
+ common/crypto/pkix-verify.cpp \
+ common/crypto/spc-asn1-decoder.cpp \
+ common/crypto/spc-core.cpp \
+ common/crypto/spc-init.cpp \
+ common/crypto/spc-sanity.cpp \
+ common/crypto/x509-asn1-decoder.cpp \
+ common/crypto/x509-certpaths.cpp \
+ common/crypto/x509-core.cpp \
+ common/crypto/x509-file.cpp \
+ common/crypto/x509-init.cpp \
+ common/crypto/x509-sanity.cpp \
+ common/crypto/x509-verify.cpp \
+ common/crypto/taf-asn1-decoder.cpp \
+ common/crypto/taf-core.cpp \
+ common/crypto/taf-init.cpp \
+ common/crypto/taf-sanity.cpp \
+ common/crypto/store.cpp \
+ common/crypto/store-inmem.cpp \
+ common/crypto/RTCrStoreCertAddFromFile.cpp \
common/dbg/dbg.cpp \
common/dbg/dbgas.cpp \
common/dbg/dbgcfg.cpp \
@@ -299,6 +371,7 @@ RuntimeR3_SOURCES = \
common/dvm/dvmmbr.cpp \
common/dvm/dvmvfs.cpp \
common/err/errinfo.cpp \
+ common/err/errinfo-alloc.cpp \
common/err/errmsg.cpp \
common/err/RTErrConvertFromErrno.cpp \
common/err/RTErrConvertToErrno.cpp \
@@ -319,6 +392,7 @@ RuntimeR3_SOURCES = \
common/log/logformat.cpp \
common/log/tracebuf.cpp \
common/log/tracedefault.cpp \
+ common/math/bignum.cpp \
common/misc/RTAssertMsg1Weak.cpp \
common/misc/RTAssertMsg2.cpp \
common/misc/RTAssertMsg2Add.cpp \
@@ -408,6 +482,16 @@ RuntimeR3_SOURCES = \
common/string/RTStrNLenEx.cpp \
common/string/RTStrPrintHexBytes.cpp \
common/string/RTStrStr.cpp \
+ common/string/RTUtf16Copy.cpp \
+ common/string/RTUtf16CopyAscii.cpp \
+ common/string/RTUtf16Cat.cpp \
+ common/string/RTUtf16CatAscii.cpp \
+ common/string/RTUtf16CmpAscii.cpp \
+ common/string/RTUtf16ICmpAscii.cpp \
+ common/string/RTUtf16End.cpp \
+ common/string/RTUtf16NLen.cpp \
+ common/string/RTUtf16NLenEx.cpp \
+ common/string/RTUtf16PrintHexBytes.cpp \
common/string/base64.cpp \
common/string/simplepattern.cpp \
common/string/straprintf.cpp \
@@ -424,10 +508,15 @@ RuntimeR3_SOURCES = \
common/string/strtonum.cpp \
common/string/strversion.cpp \
common/string/uni.cpp \
- common/string/unidata.cpp \
+ common/string/unidata-flags.cpp \
+ common/string/unidata-lower.cpp \
+ common/string/unidata-upper.cpp \
common/string/utf-16.cpp \
+ common/string/utf-16-case.cpp \
+ common/string/utf-16-latin-1.cpp \
common/string/utf-8.cpp \
common/string/utf-8-case.cpp \
+ common/string/utf-8-case2.cpp \
common/string/ministring.cpp \
common/table/avlgcptr.cpp \
common/table/avlhcphys.cpp \
@@ -489,6 +578,7 @@ RuntimeR3_SOURCES = \
generic/RTProcessQueryUsernameA-generic.cpp \
generic/RTTimerLRCreate-generic.cpp \
generic/mempool-generic.cpp \
+ generic/memsafer-generic.cpp \
generic/semfastmutex-generic.cpp \
generic/semxroads-generic.cpp \
generic/spinlock-generic.cpp \
@@ -609,6 +699,7 @@ RuntimeR3_SOURCES.win = \
nt/RTErrConvertFromNtStatus.cpp \
r3/nt/fs-nt.cpp \
r3/nt/pathint-nt.cpp \
+ r3/nt/RTProcQueryParent-r3-nt.cpp \
r3/win/env-win.cpp \
r3/win/RTHandleGetStandard-win.cpp \
r3/win/RTSystemQueryOSInfo-win.cpp \
@@ -646,7 +737,8 @@ RuntimeR3_SOURCES.win = \
r3/win/utf8-win.cpp \
r3/win/RTUuidCreate-win.cpp \
win/errmsgwin.cpp \
- win/RTErrConvertFromWin32.cpp
+ win/RTErrConvertFromWin32.cpp \
+ common/string/mempcpy.asm
RuntimeR3_SOURCES.win.amd64 := $(RuntimeWin64ASM_SOURCES)
RuntimeR3_SOURCES.win.x86 := $(RuntimeWin32ASM_SOURCES)
@@ -1089,11 +1181,12 @@ RuntimeR3_SOURCES.haiku = \
# Note! This is a bit of hacky since kBuild doesn't support building libraries
# for build programs.
#
-RuntimeBldProg_TEMPLATE := VBoxAdvBldProg
-RuntimeBldProg_EXTENDS := RuntimeR3
-RuntimeBldProg_BLD_TRG := $(KBUILD_HOST)
-RuntimeBldProg_BLD_TRG_ARCH := $(KBUILD_HOST_ARCH)
-RuntimeBldProg_BLD_TRG_CPU := $(KBUILD_HOST_CPU)
+RuntimeBldProg_TEMPLATE := VBoxAdvBldProg
+RuntimeBldProg_EXTENDS := RuntimeR3
+RuntimeBldProg_BLD_TRG := $(KBUILD_HOST)
+RuntimeBldProg_BLD_TRG_ARCH := $(KBUILD_HOST_ARCH)
+RuntimeBldProg_BLD_TRG_CPU := $(KBUILD_HOST_CPU)
+RuntimeBldProg_DEFS := $(RuntimeR3_DEFS) IPRT_WITHOUT_LDR_VERIFY
RuntimeBldProg_SOURCES = $(filter-out \
r3/xml.cpp \
common/zip/xarvfs.cpp \
@@ -1109,7 +1202,7 @@ RuntimeBldProg_SOURCES = $(filter-out \
RuntimeGuestR3_TEMPLATE := VBoxGuestR3Lib
## @todo change this to EXTEND the RuntimeR3 target.
RuntimeGuestR3_SDKS.win := $(RuntimeR3_SDKS.win)
-RuntimeGuestR3_DEFS := $(filter-out RTCRITSECT_STRICT RT_NO_GIP, $(RuntimeR3_DEFS))
+RuntimeGuestR3_DEFS := $(filter-out RTCRITSECT_STRICT RT_NO_GIP IPRT_WITH_OPENSSL, $(RuntimeR3_DEFS))
RuntimeGuestR3_DEFS.$(KBUILD_TARGET) := $(RuntimeR3_DEFS.$(KBUILD_TARGET))
RuntimeGuestR3_DEFS.$(KBUILD_HOST) := $(RuntimeR3_DEFS.$(KBUILD_HOST))
RuntimeGuestR3_INCS := $(RuntimeR3_INCS)
@@ -1122,6 +1215,7 @@ RuntimeGuestR3_SOURCES := $(filter-out \
common/checksum/RTSha1Digest.cpp \
common/checksum/RTSha256Digest.cpp \
common/checksum/sha% \
+ common/checksum/md2% \
common/checksum/x509.cpp \
generic/RTLogWriteUser-generic.cpp \
r3/xml.cpp \
@@ -1237,10 +1331,15 @@ RuntimeGuestR3Mini_SOURCES = \
common/string/stringalloc.cpp \
common/string/strprintf.cpp \
common/string/strtonum.cpp \
- common/string/unidata.cpp \
+ common/string/unidata-flags.cpp \
+ common/string/unidata-lower.cpp \
+ common/string/unidata-upper.cpp \
common/string/utf-8.cpp \
common/string/utf-8-case.cpp \
+ common/string/utf-8-case2.cpp \
common/string/utf-16.cpp \
+ common/string/utf-16-case.cpp \
+ common/string/utf-16-latin-1.cpp \
common/table/avlpv.cpp \
generic/critsect-generic.cpp \
generic/pathhost-generic.cpp \
@@ -1311,7 +1410,7 @@ ifdef VBOX_WITH_LIBCURL
endif
VBoxRT_SDKS += VBOX_OPENSSL
VBoxRT_SDKS.win = $(VBOX_WINPSDK) $(VBOX_WINDDK) VBOX_NTDLL
-if1of ($(KBUILD_TARGET)$(VBOX_WITH_HARDENING), darwin win)
+if1of ($(KBUILD_TARGET)$(VBOX_WITH_HARDENING), darwin win$(VBOX_WITH_HARDENING))
VBoxRT_INST = $(INST_DLL) $(INST_TESTCASE)
endif
VBoxRT_DEFS := $(filter-out RT_NO_GIP,$(RuntimeR3_DEFS)) IN_SUP_R3 IN_SUP_R3 IPRT_WITH_XAR
@@ -1721,9 +1820,9 @@ RuntimeR0Stub_SOURCES.solaris = \
# RuntimeR0Drv - Ring-0 library for host drivers.
#
RuntimeR0Drv_TEMPLATE = VBoxR0DrvLib
-RuntimeR0Drv_SDKS.win = ReorderCompilerIncs $(VBOX_WINDDK) $(VBOX_WINPSDK)INCS
+RuntimeR0Drv_SDKS.win = ReorderCompilerIncs $(VBOX_WINDDK) $(VBOX_WINPSDK)INCS VBOX_OPENSSL
RuntimeR0Drv_DEFS = IN_RT_R0 RT_WITH_VBOX RT_WITHOUT_NOCRT_WRAPPERS RT_NO_EXPORT_SYMBOL
-RuntimeR0Drv_DEFS.win = IN_SUP_R0
+RuntimeR0Drv_DEFS.win = IN_SUP_R0 LDR_ONLY_PE
RuntimeR0Drv_DEFS.linux = MODULE KBUILD_MODNAME=KBUILD_STR\(vboxdrv\) KBUILD_BASENAME=KBUILD_STR\(vboxdrv\) IN_SUP_R0
RuntimeR0Drv_INCS := $(PATH_SUB_CURRENT) include
@@ -1770,6 +1869,7 @@ RuntimeR0Drv_SOURCES = \
common/misc/sanity-c.c \
common/misc/sanity-cpp.cpp \
common/misc/term.cpp \
+ common/misc/RTMemWipeThoroughly.cpp \
common/path/rtPathVolumeSpecLen.cpp \
common/path/RTPathAbsDup.cpp \
common/path/RTPathAbsEx.cpp \
@@ -1809,8 +1909,15 @@ RuntimeR0Drv_SOURCES = \
common/string/strprintf.cpp \
common/string/strtonum.cpp \
common/string/stringalloc.cpp \
- common/string/utf-16.cpp \
+ common/string/unidata-flags.cpp \
+ common/string/unidata-lower.cpp \
+ common/string/unidata-upper.cpp \
common/string/utf-8.cpp \
+ common/string/utf-8-case.cpp \
+ common/string/utf-8-case2.cpp \
+ common/string/utf-16.cpp \
+ common/string/utf-16-case.cpp \
+ common/string/utf-16-latin-1.cpp \
common/table/avlpv.cpp \
common/time/time.cpp \
generic/RTLogWriteStdErr-stub-generic.cpp \
@@ -1867,6 +1974,90 @@ RuntimeR0Drv_SOURCES.linux = \
r0drv/powernotification-r0drv.c
RuntimeR0Drv_SOURCES.win = \
+ common/ldr/ldr.cpp \
+ common/ldr/ldrEx.cpp \
+ common/ldr/ldrPE.cpp \
+ common/asn1/asn1-basics.cpp \
+ common/asn1/asn1-dump.cpp \
+ common/asn1/asn1-cursor.cpp \
+ common/asn1/asn1-default-allocator.cpp \
+ common/asn1/asn1-encode.cpp \
+ common/asn1/asn1-ut-bitstring.cpp \
+ common/asn1/asn1-ut-bitstring-decode.cpp \
+ common/asn1/asn1-ut-boolean.cpp \
+ common/asn1/asn1-ut-boolean-decode.cpp \
+ common/asn1/asn1-ut-core.cpp \
+ common/asn1/asn1-ut-core-decode.cpp \
+ common/asn1/asn1-ut-dyntype.cpp \
+ common/asn1/asn1-ut-dyntype-decode.cpp \
+ common/asn1/asn1-ut-integer.cpp \
+ common/asn1/asn1-ut-integer-decode.cpp \
+ common/asn1/asn1-ut-null.cpp \
+ common/asn1/asn1-ut-null-decode.cpp \
+ common/asn1/asn1-ut-objid.cpp \
+ common/asn1/asn1-ut-objid-decode.cpp \
+ common/asn1/asn1-ut-octetstring.cpp \
+ common/asn1/asn1-ut-octetstring-decode.cpp \
+ common/asn1/asn1-ut-string.cpp \
+ common/asn1/asn1-ut-string-decode.cpp \
+ common/asn1/asn1-ut-time.cpp \
+ common/asn1/asn1-ut-time-decode.cpp \
+ common/crypto/digest-core.cpp \
+ common/crypto/digest-builtin.cpp \
+ common/crypto/rsa-asn1-decoder.cpp \
+ common/crypto/rsa-core.cpp \
+ common/crypto/rsa-init.cpp \
+ common/crypto/rsa-sanity.cpp \
+ common/crypto/pkcs7-asn1-decoder.cpp \
+ common/crypto/pkcs7-core.cpp \
+ common/crypto/pkcs7-init.cpp \
+ common/crypto/pkcs7-sanity.cpp \
+ common/crypto/pkcs7-verify.cpp \
+ common/crypto/pkix-signature-builtin.cpp \
+ common/crypto/pkix-signature-core.cpp \
+ common/crypto/pkix-signature-rsa.cpp \
+ common/crypto/pkix-util.cpp \
+ common/crypto/pkix-verify.cpp \
+ common/crypto/spc-asn1-decoder.cpp \
+ common/crypto/spc-core.cpp \
+ common/crypto/spc-init.cpp \
+ common/crypto/spc-sanity.cpp \
+ common/crypto/x509-asn1-decoder.cpp \
+ common/crypto/x509-certpaths.cpp \
+ common/crypto/x509-core.cpp \
+ common/crypto/x509-init.cpp \
+ common/crypto/x509-sanity.cpp \
+ common/crypto/x509-verify.cpp \
+ common/crypto/store.cpp \
+ common/crypto/store-inmem.cpp \
+ common/crypto/taf-asn1-decoder.cpp \
+ common/crypto/taf-core.cpp \
+ common/crypto/taf-init.cpp \
+ common/crypto/taf-sanity.cpp \
+ common/checksum/md2.cpp \
+ common/checksum/sha1.cpp \
+ common/checksum/sha256.cpp \
+ common/checksum/sha512.cpp \
+ common/checksum/md2str.cpp \
+ common/checksum/md5str.cpp \
+ common/checksum/sha1str.cpp \
+ common/checksum/sha256str.cpp \
+ common/checksum/sha512str.cpp \
+ common/err/errinfo.cpp \
+ common/path/RTPathChangeToUnixSlashes.cpp \
+ common/math/bignum.cpp \
+ common/string/RTStrPrintHexBytes.cpp \
+ common/string/RTUtf16Copy.cpp \
+ common/string/RTUtf16CopyAscii.cpp \
+ common/string/RTUtf16Cat.cpp \
+ common/string/RTUtf16CatAscii.cpp \
+ common/string/RTUtf16End.cpp \
+ common/string/RTUtf16NLen.cpp \
+ common/string/RTUtf16NLenEx.cpp \
+ common/string/RTUtf16PrintHexBytes.cpp \
+ common/string/strstrip.cpp \
+ generic/memsafer-generic.cpp \
+ \
common/misc/thread.cpp \
common/string/memcmp.asm \
common/string/memchr.asm \
@@ -1904,6 +2095,7 @@ RuntimeR0Drv_SOURCES.win = \
r0drv/nt/thread2-r0drv-nt.cpp \
r0drv/nt/time-r0drv-nt.cpp \
r0drv/nt/timer-r0drv-nt.cpp \
+ r0drv/nt/toxic-chkstk-r0drv-nt.asm \
r0drv/nt/RTTimerGetSystemGranularity-r0drv-nt.cpp
RuntimeR0Drv_SOURCES.win.amd64 := $(RuntimeWin64ASM_SOURCES)
@@ -2265,17 +2457,37 @@ RuntimeEFCPP_SOURCES := r3/alloc-ef-cpp.cpp
# later WINDDK ntdll.lib have and thus we may easily end up with
# images that does not load on older windows versions.
#
+if1of (win,$(KBUILD_TARGET) $(KBUILD_HOST))
RuntimeR3NtDll-amd64_TEMPLATE = VBoxR3Dll
RuntimeR3NtDll-amd64_BLD_TRG_ARCH = amd64
RuntimeR3NtDll-amd64_ARFLAGS = /NODEFAULTLIB /MACHINE:amd64
RuntimeR3NtDll-amd64_SOURCES = \
- r3/win/ntdll-mini-implib.c \
r3/win/ntdll-mini-implib.def
-RuntimeR3NtDll-x86_EXTENDS = RuntimeR3NtDll-amd64
+RuntimeR3NtDll-x86_TEMPLATE = VBoxR3Dll
RuntimeR3NtDll-x86_BLD_TRG_ARCH = x86
RuntimeR3NtDll-x86_ARFLAGS = /NODEFAULTLIB /MACHINE:x86
-
+RuntimeR3NtDll-x86_SOURCES = \
+ r3/win/ntdll-mini-implib.def \
+ $(RuntimeR3NtDll-x86_0_OUTDIR)/ntdll-mini-implib.asm
+RuntimeR3NtDll-x86_CLEAN = \
+ $(RuntimeR3NtDll-x86_0_OUTDIR)/ntdll-mini-implib.asm
+
+$$(RuntimeR3NtDll-x86_0_OUTDIR)/ntdll-mini-implib.asm: $(PATH_SUB_CURRENT)/r3/win/ntdll-mini-implib.def | $$(dir $$@)
+ $(call MSG_GENERATE,,$@,$<)
+ $(QUIET)$(APPEND) -nt "$@" \
+ ';Autogenerated, do not edit' \
+ '%include "iprt/asmdefs.mac"' \
+ 'BEGINCODE' \
+ '%macro IMPLIB_EXPORT 1' \
+ 'global %1:function' \
+ '%1: nop' \
+ '%endm' \
+ ''
+ $(QUIET)$(SED) -e '1,/EXPORTS/d' \
+ -e 's/^.*;;=[[:space:]]*\([^[:space:]]*\)[[:space:]]*$$/IMPLIB_EXPORT \1/' \
+ $< --append $@
+endif
#
# Bag of tricks required for making VCC100 output binaries work on NT4, W2K
@@ -2504,24 +2716,28 @@ if1of ($(LIBRARIES),RuntimeR3 RuntimeR0 RuntimeR0Drv RuntimeRC)
$(call MSG_L1,IPRT: skipped mangling test.)
else
# Generate a SED script from mangling.h that checks for known symbols.
- @$(SED) \
+ $(QUIET)$(SED) \
-e '/# *define.*RT_MANGLER/!d' \
-e 's/^.*RT_MANGLER(\([^)][^)]*\)).*$(DOLLAR)/\/^\1$(DOLLAR)\/b ok/' \
$(PATH_ROOT)/include/iprt/mangling.h \
--output "$@"
- @$(APPEND) -n '$@' \
+ $(QUIET)$(APPEND) -n '$@' \
':bad' \
- 's/^\(.*\)$(DOLLAR)/error: Missing # define \1 RT_MANGLER(\1)/' \
+ 's/^\(.*\)$(DOLLAR)/error: Missing # define \1 /' \
+ ':bad-pad' \
+ '/^.\{0,70\}$(DOLLAR)/ { s/$(DOLLAR)/ /; bbad-pad; }' \
+ 's/define \([^ ]*\) \([ ]*\)$(DOLLAR)/define \1 \2RT_MANGLER(\1)/' \
'p' \
- 'q 1' \
+ $(if-expr !defined(IPRT_IGNORE_TEST_MANGLING),'q 1') \
'' \
':ok' \
'd'
# Find the best way to generate a symbol list and subject it to mangling.h.
if $(intersects $(KBUILD_TARGET), linux) && "$(VBOX_GCC_fvisibility-hidden)"
$(call MSG_L1,IPRT: Testing mangling and visiblity for newer gcc...)
- @readelf -Ws $^ \
+ $(QUIET)readelf -Ws $^ \
| $(SED) \
+ -e 's/[[:space:]]\+/ /g' \
-e '/^ *[[:digit:]]\+:/!d' \
-e 's/^ \+[[:digit:]]\+: \+[[:xdigit:]]\+ \+[[:digit:]]\+ \+//' \
-e '/^SECTION/d' \
@@ -2529,7 +2745,10 @@ if1of ($(LIBRARIES),RuntimeR3 RuntimeR0 RuntimeR0Drv RuntimeRC)
-e 's/^[[:alpha:]]\+ \+//' \
-e '/LOCAL/d' \
-e 's/^[[:alpha:]]\+ \+//' \
+ -e '/^HIDDEN [[:xdigit:]]\+ RT/bkeep-hidden' \
+ -e '/^HIDDEN [[:xdigit:]]\+ g_[a-z0-9]*RT/bkeep-hidden' \
-e '/^HIDDEN/d' \
+ -e ':keep-hidden' \
-e 's/^[[:alpha:]]\+ \+//' \
-e '/^UND/d' \
-e 's/^[[:digit:]]\+ \+//' \
@@ -2550,7 +2769,7 @@ if1of ($(LIBRARIES),RuntimeR3 RuntimeR0 RuntimeR0Drv RuntimeRC)
-e '/^strlen/d' \
-e '/^_Z[[:alpha:]]*[[:digit:]]\+RTC/d' \
-e '/^_Z[[:alpha:]]*[[:digit:]]\+RTC/d' \
- \
+ \
-e '/^_ZnwjPv/d' \
-e '/^_ZnwmPv/d' \
-e '/^_ZNSt9bad_allocC1Ev/d' \
@@ -2561,7 +2780,7 @@ if1of ($(LIBRARIES),RuntimeR3 RuntimeR0 RuntimeR0Drv RuntimeRC)
-e '/^_ZN[a-zA-Z]*[[:digit:]]*__gnu_cxx/d' \
-e '/^_ZNSa.*ElementNode.*/d' \
-e '/^_ZSt.*ElementNode.*/d' \
- \
+ \
-e '/^_Z[[:digit:]]\+dbus/d' \
-e '/^_Z13RTDBusLoadLibv/d' \
\
@@ -2569,11 +2788,14 @@ if1of ($(LIBRARIES),RuntimeR3 RuntimeR0 RuntimeR0Drv RuntimeRC)
-e '/^VBoxGuest_/d'\
| $(SED) -nf "$@"
endif
- $(call MSG_L1,IPRT: Testing mangling for older gcc...)
- @nm $^ | $(SED) -n \
+ $(call MSG_L1,IPRT: Testing mangling using nm...)
+ $(QUIET)nm $^ 2> /dev/null \
+ | $(SED) -n \
-e 's/^[0-9a-f][0-9a-f]* //' \
-e '/^[TUDB] /!d' \
-e 's/^. //' \
+ $(if-expr "$(KBUILD_TARGET)" == "darwin" || "$(KBUILD_TARGET)" == "os2" || "$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)" == "win.x86", \
+ -e 's/^_//',) \
\
-e '/^g_cchrt/d'\
-e '/^g_frt/d'\
@@ -2585,6 +2807,8 @@ if1of ($(LIBRARIES),RuntimeR3 RuntimeR0 RuntimeR0Drv RuntimeRC)
-e '/^g_u64ProgramStart/d'\
-e '/^g_enmProcessPriority/d'\
-e '/^g_hDbgModStrCache/d'\
+ -e '/^g_pfnR0Darwin/d'\
+ -e '/^g_pDarwinLockGroup/d'\
\
-e '/^RTDBusLoadLib/d' \
\
@@ -2610,3 +2834,12 @@ endif
#
include $(FILE_KBUILD_SUB_FOOTER)
+
+#
+# Aliases for code templates.
+#
+rsa-template.o rsa-template.obj: rsa-core.o rsa-asn1-decoder.o rsa-sanity.o rsa-init.o
+taf-template.o taf-template.obj: taf-core.o taf-asn1-decoder.o taf-sanity.o taf-init.o
+x509-template.o x509-template.obj: x509-core.o x509-asn1-decoder.o x509-sanity.o x509-init.o
+pkcs7-template.o pkcs7-template.obj: pkcs7-core.o pkcs7-asn1-decoder.o pkcs7-sanity.o pkcs7-init.o
+
diff --git a/src/VBox/Runtime/common/asn1/Makefile.kup b/src/VBox/Runtime/common/asn1/Makefile.kup
new file mode 100644
index 00000000000..e69de29bb2d
--- /dev/null
+++ b/src/VBox/Runtime/common/asn1/Makefile.kup
diff --git a/src/VBox/Runtime/common/asn1/asn1-basics.cpp b/src/VBox/Runtime/common/asn1/asn1-basics.cpp
new file mode 100644
index 00000000000..7bc981bf494
--- /dev/null
+++ b/src/VBox/Runtime/common/asn1/asn1-basics.cpp
@@ -0,0 +1,592 @@
+/* $Id$ */
+/** @file
+ * IPRT - ASN.1, Basic Operations.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/asn1.h>
+
+#include <iprt/alloca.h>
+#include <iprt/bignum.h>
+#include <iprt/ctype.h>
+#include <iprt/err.h>
+#include <iprt/string.h>
+#include <iprt/uni.h>
+
+#include <iprt/formats/asn1.h>
+
+
+/*******************************************************************************
+* Structures and Typedefs *
+*******************************************************************************/
+/**
+ * ASN.1 content/value allocation.
+ *
+ * The currently most frequent use of the RTAsn1 module is to decode ASN.1 byte
+ * streams. In that scenario we do not allocate memory for the raw content
+ * bytes, but share it with the byte stream. Also, a great number of RTASN1CORE
+ * structures will never need to have any content bytes allocated with this.
+ *
+ * So, in order to avoid adding an extra 16 (64-bit) or 8 (32-bit) bytes to each
+ * RTASN1CORE structure just to keep track of the occational content allocation,
+ * we put the allocator tracking structure inside the allocation. During
+ * allocator operations it lives temporarily on the stack.
+ */
+typedef struct RTASN1MEMCONTENT
+{
+ /** The allocation tracker. */
+ RTASN1ALLOCATION Allocation;
+#if ARCH_BITS == 32
+ uint32_t Padding; /**< Alignment padding. */
+#endif
+ /** The content bytes, i.e. what RTASN1CORE::uData.pv points to. Use a 64-bit
+ * type here to emphasize that it's 8-byte aligned on all platforms. */
+ uint64_t au64Content[1];
+} RTASN1MEMCONTENT;
+AssertCompileMemberAlignment(RTASN1MEMCONTENT, au64Content, 8);
+/** Pointer to a ASN.1 content allocation. */
+typedef RTASN1MEMCONTENT *PRTASN1MEMCONTENT;
+
+
+
+
+RTDECL(int) RTAsn1MemGrowArray(PRTASN1ALLOCATION pAllocation, void **ppvArray, size_t cbEntry,
+ uint32_t cCurrent, uint32_t cNew)
+{
+ AssertReturn(pAllocation->pAllocator != NULL, VERR_WRONG_ORDER);
+ AssertReturn(cbEntry > 0, VERR_INVALID_PARAMETER);
+ AssertReturn(cNew > cCurrent, VERR_INVALID_PARAMETER);
+ AssertReturn(cNew < _1M, VERR_OUT_OF_RANGE);
+
+ pAllocation->cReallocs++;
+
+ void *pvOld = *ppvArray;
+
+ /* Initial allocation? */
+ if (cCurrent == 0)
+ {
+ AssertReturn(pvOld == NULL, VERR_INVALID_PARAMETER);
+ AssertReturn(cNew != 0, VERR_INVALID_PARAMETER);
+ return pAllocation->pAllocator->pfnAlloc(pAllocation->pAllocator, pAllocation, ppvArray, cNew * cbEntry);
+ }
+
+ /* Do we need to grow the allocation or did we already allocate sufficient memory in a previous call? */
+ size_t cbNew = cNew * cbEntry;
+ if (pAllocation->cbAllocated < cbNew)
+ {
+ /* Need to grow. Adjust the new size according to how many times we've been called. */
+ if (pAllocation->cReallocs > 2)
+ {
+ if (pAllocation->cReallocs > 8)
+ cNew += 8;
+ else if (pAllocation->cReallocs < 4)
+ cNew += 2;
+ else
+ cNew += 4;
+ cbNew += cNew * cbEntry;
+ }
+
+ int rc = pAllocation->pAllocator->pfnRealloc(pAllocation->pAllocator, pAllocation, pvOld, ppvArray, cbNew);
+ if (RT_FAILURE(rc))
+ return rc;
+ Assert(pAllocation->cbAllocated >= cbNew);
+
+ /* Clear the memory. */
+ size_t cbOld = cCurrent * cbEntry;
+ RT_BZERO((uint8_t *)*ppvArray + cbOld, pAllocation->cbAllocated - cbOld);
+ }
+
+ return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTAsn1MemAllocZ(PRTASN1ALLOCATION pAllocation, void **ppvMem, size_t cbMem)
+{
+ AssertReturn(pAllocation->pAllocator != NULL, VERR_WRONG_ORDER);
+ AssertPtr(ppvMem);
+ Assert(cbMem > 0);
+ int rc = pAllocation->pAllocator->pfnAlloc(pAllocation->pAllocator, pAllocation, ppvMem, cbMem);
+ Assert(pAllocation->cbAllocated >= cbMem || RT_FAILURE_NP(rc));
+ return rc;
+}
+
+
+RTDECL(int) RTAsn1MemDup(PRTASN1ALLOCATION pAllocation, void **ppvMem, const void *pvSrc, size_t cbMem)
+{
+ AssertReturn(pAllocation->pAllocator != NULL, VERR_WRONG_ORDER);
+ AssertPtr(ppvMem);
+ AssertPtr(pvSrc);
+ Assert(cbMem > 0);
+ int rc = pAllocation->pAllocator->pfnAlloc(pAllocation->pAllocator, pAllocation, ppvMem, cbMem);
+ if (RT_SUCCESS(rc))
+ {
+ Assert(pAllocation->cbAllocated >= cbMem);
+ memcpy(*ppvMem, pvSrc, cbMem);
+ return VINF_SUCCESS;
+ }
+ return rc;
+}
+
+
+RTDECL(void) RTAsn1MemFree(PRTASN1ALLOCATION pAllocation, void *pv)
+{
+ Assert(pAllocation->pAllocator != NULL);
+ if (pv)
+ {
+ pAllocation->pAllocator->pfnFree(pAllocation->pAllocator, pAllocation, pv);
+ Assert(pAllocation->cbAllocated == 0);
+ }
+}
+
+
+RTDECL(PRTASN1ALLOCATION) RTAsn1MemInitAllocation(PRTASN1ALLOCATION pAllocation, PCRTASN1ALLOCATORVTABLE pAllocator)
+{
+ pAllocation->cbAllocated = 0;
+ pAllocation->cReallocs = 0;
+ pAllocation->uReserved0 = 0;
+ pAllocation->pAllocator = pAllocator;
+ return pAllocation;
+}
+
+
+RTDECL(int) RTAsn1ContentAllocZ(PRTASN1CORE pAsn1Core, size_t cb, PCRTASN1ALLOCATORVTABLE pAllocator)
+{
+ AssertReturn(pAllocator != NULL, VERR_WRONG_ORDER);
+ AssertReturn(cb > 0 && cb < _1G, VERR_INVALID_PARAMETER);
+ AssertPtr(pAsn1Core);
+ AssertReturn(!(pAsn1Core->fFlags & RTASN1CORE_F_ALLOCATED_CONTENT), VERR_INVALID_STATE);
+
+ /* Initialize the temporary allocation tracker. */
+ RTASN1ALLOCATION Allocation;
+ Allocation.cbAllocated = 0;
+ Allocation.cReallocs = 0;
+ Allocation.uReserved0 = 0;
+ Allocation.pAllocator = pAllocator;
+
+ /* Make the allocation. */
+ uint32_t cbAlloc = RT_OFFSETOF(RTASN1MEMCONTENT, au64Content) + (uint32_t)cb;
+ PRTASN1MEMCONTENT pHdr;
+ int rc = pAllocator->pfnAlloc(pAllocator, &Allocation, (void **)&pHdr, cbAlloc);
+ if (RT_SUCCESS(rc))
+ {
+ Assert(Allocation.cbAllocated >= cbAlloc);
+ pHdr->Allocation = Allocation;
+ pAsn1Core->cb = (uint32_t)cb;
+ pAsn1Core->uData.pv = &pHdr->au64Content[0];
+ pAsn1Core->fFlags |= RTASN1CORE_F_ALLOCATED_CONTENT;
+ }
+
+ return rc;
+}
+
+
+RTDECL(int) RTAsn1ContentDup(PRTASN1CORE pAsn1Core, void const *pvSrc, size_t cbSrc, PCRTASN1ALLOCATORVTABLE pAllocator)
+{
+ int rc = RTAsn1ContentAllocZ(pAsn1Core, cbSrc, pAllocator);
+ if (RT_SUCCESS(rc))
+ memcpy((void *)pAsn1Core->uData.pv, pvSrc, cbSrc);
+ return rc;
+}
+
+
+RTDECL(int) RTAsn1ContentReallocZ(PRTASN1CORE pAsn1Core, size_t cb, PCRTASN1ALLOCATORVTABLE pAllocator)
+{
+ /* Validate input. */
+ AssertPtr(pAsn1Core);
+ AssertReturn(cb < _1G, VERR_INVALID_PARAMETER);
+
+ if (cb > 0)
+ {
+ /*
+ * Case 1 - Initial allocation.
+ */
+ uint32_t cbNeeded = RT_OFFSETOF(RTASN1MEMCONTENT, au64Content) + (uint32_t)cb;
+ if (!(pAsn1Core->fFlags & RTASN1CORE_F_ALLOCATED_CONTENT))
+ return RTAsn1ContentAllocZ(pAsn1Core, cb, pAllocator);
+
+ /* Locate the header. */
+ PRTASN1MEMCONTENT pHdr = RT_FROM_MEMBER(pAsn1Core->uData.pv, RTASN1MEMCONTENT, au64Content);
+
+ /*
+ * Case 2 - Reallocation using the same allocator.
+ */
+ if ( pHdr->Allocation.pAllocator == pAllocator
+ || !pAllocator)
+ {
+ pHdr->Allocation.cReallocs++;
+
+ /* Modify the allocation if necessary. */
+ if (pHdr->Allocation.cbAllocated < cbNeeded)
+ {
+ RTASN1ALLOCATION Allocation = pHdr->Allocation;
+ int rc = Allocation.pAllocator->pfnRealloc(Allocation.pAllocator, &Allocation, pHdr, (void **)&pHdr, cbNeeded);
+ if (RT_FAILURE(rc))
+ return rc;
+ Assert(Allocation.cbAllocated >= cbNeeded);
+ pAsn1Core->uData.pv = &pHdr->au64Content[0];
+ pHdr->Allocation = Allocation;
+ }
+
+ /* Clear any additional memory we're letting the user use and
+ update the content size. */
+ if (pAsn1Core->cb < cb)
+ RT_BZERO((uint8_t *)&pAsn1Core->uData.pu8[pAsn1Core->cb], cb - pAsn1Core->cb);
+ pAsn1Core->cb = (uint32_t)cb;
+ }
+ /*
+ * Case 3 - Reallocation using a different allocator.
+ */
+ else
+ {
+ /* Initialize the temporary allocation tracker. */
+ RTASN1ALLOCATION Allocation;
+ Allocation.cbAllocated = 0;
+ Allocation.cReallocs = pHdr->Allocation.cReallocs + 1;
+ Allocation.uReserved0 = 0;
+ Allocation.pAllocator = pAllocator;
+
+ /* Make the allocation. */
+ PRTASN1MEMCONTENT pHdrNew;
+ int rc = pAllocator->pfnAlloc(pAllocator, &Allocation, (void **)&pHdrNew, cbNeeded);
+ if (RT_FAILURE(rc))
+ return rc;
+ Assert(Allocation.cbAllocated >= cbNeeded);
+
+ /* Duplicate the old content and zero any new memory we might've added. */
+ if (pAsn1Core->cb >= cb)
+ memcpy(&pHdrNew->au64Content[0], &pHdr->au64Content[0], cb);
+ else
+ {
+ memcpy(&pHdrNew->au64Content[0], &pHdr->au64Content[0], pAsn1Core->cb);
+ RT_BZERO((uint8_t *)&pHdrNew->au64Content[0] + pAsn1Core->cb, cb - pAsn1Core->cb);
+ }
+
+ /* Update the core. */
+ pHdrNew->Allocation = Allocation;
+ pAsn1Core->uData.pv = &pHdrNew->au64Content[0];
+ pAsn1Core->fFlags |= RTASN1CORE_F_ALLOCATED_CONTENT; /* free cleared it. */
+ pAsn1Core->cb = (uint32_t)cb;
+
+ /* Free the old content. */
+ Allocation = pHdr->Allocation;
+ Allocation.pAllocator->pfnFree(Allocation.pAllocator, &Allocation, pHdr);
+ Assert(Allocation.cbAllocated == 0);
+ }
+ }
+ /*
+ * Case 4 - It's a request to free the memory.
+ */
+ else
+ RTAsn1ContentFree(pAsn1Core);
+ return VINF_SUCCESS;
+}
+
+
+RTDECL(void) RTAsn1ContentFree(PRTASN1CORE pAsn1Core)
+{
+ if (pAsn1Core)
+ {
+ pAsn1Core->cb = 0;
+ if (pAsn1Core->fFlags & RTASN1CORE_F_ALLOCATED_CONTENT)
+ {
+ pAsn1Core->fFlags &= ~RTASN1CORE_F_ALLOCATED_CONTENT;
+ AssertReturnVoid(pAsn1Core->uData.pv);
+
+ PRTASN1MEMCONTENT pHdr = RT_FROM_MEMBER(pAsn1Core->uData.pv, RTASN1MEMCONTENT, au64Content);
+ RTASN1ALLOCATION Allocation = pHdr->Allocation;
+
+ Allocation.pAllocator->pfnFree(Allocation.pAllocator, &Allocation, pHdr);
+ Assert(Allocation.cbAllocated == 0);
+ }
+ pAsn1Core->uData.pv = NULL;
+ }
+}
+
+
+
+/*
+ * Virtual method table based API.
+ */
+
+RTDECL(void) RTAsn1VtDelete(PRTASN1CORE pAsn1Core)
+{
+ if (pAsn1Core)
+ {
+ PCRTASN1COREVTABLE pOps = pAsn1Core->pOps;
+ if (pOps)
+ pOps->pfnDtor(pAsn1Core);
+ }
+}
+
+
+/**
+ * Context data passed by RTAsn1VtDeepEnum to it's worker callbacks.
+ */
+typedef struct RTASN1DEEPENUMCTX
+{
+ PFNRTASN1ENUMCALLBACK pfnCallback;
+ void *pvUser;
+} RTASN1DEEPENUMCTX;
+
+
+static DECLCALLBACK(int) rtAsn1VtDeepEnumDepthFirst(PRTASN1CORE pAsn1Core, const char *pszName, uint32_t uDepth, void *pvUser)
+{
+ AssertReturn(pAsn1Core, VINF_SUCCESS);
+
+ if (pAsn1Core->pOps && pAsn1Core->pOps->pfnEnum)
+ {
+ int rc = pAsn1Core->pOps->pfnEnum(pAsn1Core, rtAsn1VtDeepEnumDepthFirst, uDepth, pvUser);
+ if (rc != VINF_SUCCESS)
+ return rc;
+ }
+
+ RTASN1DEEPENUMCTX *pCtx = (RTASN1DEEPENUMCTX *)pvUser;
+ return pCtx->pfnCallback(pAsn1Core, pszName, uDepth, pCtx->pvUser);
+}
+
+
+static DECLCALLBACK(int) rtAsn1VtDeepEnumDepthLast(PRTASN1CORE pAsn1Core, const char *pszName, uint32_t uDepth, void *pvUser)
+{
+ AssertReturn(pAsn1Core, VINF_SUCCESS);
+
+ RTASN1DEEPENUMCTX *pCtx = (RTASN1DEEPENUMCTX *)pvUser;
+ int rc = pCtx->pfnCallback(pAsn1Core, pszName, uDepth, pCtx->pvUser);
+ if (rc == VINF_SUCCESS)
+ {
+ if (pAsn1Core->pOps && pAsn1Core->pOps->pfnEnum)
+ rc = pAsn1Core->pOps->pfnEnum(pAsn1Core, rtAsn1VtDeepEnumDepthFirst, uDepth, pvUser);
+ }
+ return rc;
+}
+
+
+RTDECL(int) RTAsn1VtDeepEnum(PRTASN1CORE pThisCore, bool fDepthFirst, uint32_t uDepth,
+ PFNRTASN1ENUMCALLBACK pfnCallback, void *pvUser)
+{
+ int rc;
+ if (RTAsn1Core_IsPresent(pThisCore))
+ {
+ PCRTASN1COREVTABLE pOps = pThisCore->pOps;
+ if (pOps && pOps->pfnEnum)
+ {
+ RTASN1DEEPENUMCTX Ctx;
+ Ctx.pfnCallback = pfnCallback;
+ Ctx.pvUser = pvUser;
+ rc = pOps->pfnEnum(pThisCore, fDepthFirst ? rtAsn1VtDeepEnumDepthFirst : rtAsn1VtDeepEnumDepthLast, uDepth, &Ctx);
+ }
+ else
+ rc = VINF_SUCCESS;
+ }
+ else
+ rc = VINF_SUCCESS;
+ return rc;
+}
+
+
+RTDECL(int) RTAsn1VtClone(PRTASN1CORE pThisCore, PRTASN1CORE pSrcCore, PCRTASN1ALLOCATORVTABLE pAllocator)
+{
+ AssertPtrReturn(pThisCore, VERR_INVALID_POINTER);
+ AssertPtrReturn(pSrcCore, VERR_INVALID_POINTER);
+ AssertPtrReturn(pAllocator, VERR_INVALID_POINTER);
+
+ if (RTAsn1Core_IsPresent(pSrcCore))
+ {
+ AssertPtrReturn(pSrcCore->pOps, VERR_INVALID_POINTER);
+ AssertPtr(pSrcCore->pOps->pfnClone);
+ return pSrcCore->pOps->pfnClone(pThisCore, pSrcCore, pAllocator);
+ }
+
+ RT_ZERO(*pThisCore);
+ return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTAsn1VtCompare(PCRTASN1CORE pLeftCore, PCRTASN1CORE pRightCore)
+{
+ int iDiff;
+ if (RTAsn1Core_IsPresent(pLeftCore))
+ {
+ if (RTAsn1Core_IsPresent(pRightCore))
+ {
+ PCRTASN1COREVTABLE pOps = pLeftCore->pOps;
+ if (pOps == pRightCore->pOps)
+ {
+ AssertPtr(pOps->pfnCompare);
+ iDiff = pOps->pfnCompare(pLeftCore, pRightCore);
+ }
+ else
+ iDiff = (uintptr_t)pOps < (uintptr_t)pRightCore->pOps ? -1 : 1;
+ }
+ else
+ iDiff = 1;
+ }
+ else
+ iDiff = 0 - (int)RTAsn1Core_IsPresent(pRightCore);
+ return iDiff;
+}
+
+
+RTDECL(int) RTAsn1VtCheckSanity(PCRTASN1CORE pThisCore, uint32_t fFlags,
+ PRTERRINFO pErrInfo, const char *pszErrorTag)
+{
+ int rc;
+ if (RTAsn1Core_IsPresent(pThisCore))
+ {
+ PCRTASN1COREVTABLE pOps = pThisCore->pOps;
+ if (pOps && pOps->pfnCheckSanity)
+ rc = pOps->pfnCheckSanity(pThisCore, fFlags, pErrInfo, pszErrorTag);
+ else if (pOps)
+ rc = RTErrInfoSetF(pErrInfo, VERR_ASN1_NO_CHECK_SANITY_METHOD,
+ "%s: Has no pfnCheckSanity function.", pszErrorTag);
+ else
+ rc = RTErrInfoSetF(pErrInfo, VERR_ASN1_NO_VTABLE, "%s: Has no Vtable function.", pszErrorTag);
+ }
+ else
+ rc = RTErrInfoSetF(pErrInfo, VERR_ASN1_NOT_PRESENT, "%s: Not present.", pszErrorTag);
+ return rc;
+}
+
+
+
+/*
+ * Dummy ASN.1 object.
+ */
+
+RTDECL(int) RTAsn1Dummy_InitEx(PRTASN1DUMMY pThis)
+{
+ return RTAsn1Core_InitEx(&pThis->Asn1Core,
+ UINT32_MAX,
+ ASN1_TAGCLASS_PRIVATE | ASN1_TAGFLAG_CONSTRUCTED,
+ NULL,
+ RTASN1CORE_F_DUMMY);
+}
+
+
+/*
+ * ASN.1 SEQUENCE OF object.
+ */
+
+RTDECL(int) RTAsn1SeqOfCore_Init(PRTASN1SEQOFCORE pThis, PCRTASN1COREVTABLE pVtable)
+{
+ return RTAsn1Core_InitEx(&pThis->Asn1Core,
+ ASN1_TAG_SEQUENCE,
+ ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_CONSTRUCTED,
+ pVtable,
+ RTASN1CORE_F_PRESENT);
+}
+
+
+RTDECL(int) RTAsn1SeqOfCore_Clone(PRTASN1SEQOFCORE pThis, PCRTASN1COREVTABLE pVtable, PCRTASN1SEQOFCORE pSrc)
+{
+ AssertReturn(pSrc->Asn1Core.pOps == pVtable, VERR_ASN1_INTERNAL_ERROR_5);
+ return RTAsn1Core_CloneNoContent(&pThis->Asn1Core, &pSrc->Asn1Core);
+}
+
+
+/*
+ * ASN.1 SET OF object.
+ */
+
+RTDECL(int) RTAsn1SetOfCore_Init(PRTASN1SETOFCORE pThis, PCRTASN1COREVTABLE pVtable)
+{
+ return RTAsn1Core_InitEx(&pThis->Asn1Core,
+ ASN1_TAG_SET,
+ ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_CONSTRUCTED,
+ pVtable,
+ RTASN1CORE_F_PRESENT);
+}
+
+
+RTDECL(int) RTAsn1SetOfCore_Clone(PRTASN1SETOFCORE pThis, PCRTASN1COREVTABLE pVtable, PCRTASN1SETOFCORE pSrc)
+{
+ AssertReturn(pSrc->Asn1Core.pOps == pVtable, VERR_ASN1_INTERNAL_ERROR_5);
+ return RTAsn1Core_CloneNoContent(&pThis->Asn1Core, &pSrc->Asn1Core);
+}
+
+
+/*
+ * ASN.1 SEQUENCE object.
+ */
+
+RTDECL(int) RTAsn1SequenceCore_Init(PRTASN1SEQUENCECORE pThis, PCRTASN1COREVTABLE pVtable)
+{
+ return RTAsn1Core_InitEx(&pThis->Asn1Core,
+ ASN1_TAG_SEQUENCE,
+ ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_CONSTRUCTED,
+ pVtable,
+ RTASN1CORE_F_PRESENT);
+}
+
+
+RTDECL(int) RTAsn1SequenceCore_Clone(PRTASN1SEQUENCECORE pThis, PCRTASN1COREVTABLE pVtable, PCRTASN1SEQUENCECORE pSrc)
+{
+ AssertReturn(pSrc->Asn1Core.pOps == pVtable, VERR_ASN1_INTERNAL_ERROR_5);
+ return RTAsn1Core_CloneNoContent(&pThis->Asn1Core, &pSrc->Asn1Core);
+}
+
+
+/*
+ * ASN.1 SEQUENCE object - only used by SPC, so probably doing something wrong there.
+ */
+
+RTDECL(int) RTAsn1SetCore_Init(PRTASN1SETCORE pThis, PCRTASN1COREVTABLE pVtable)
+{
+ return RTAsn1Core_InitEx(&pThis->Asn1Core,
+ ASN1_TAG_SET,
+ ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_CONSTRUCTED,
+ pVtable,
+ RTASN1CORE_F_PRESENT);
+}
+
+
+RTDECL(int) RTAsn1SetCore_Clone(PRTASN1SETCORE pThis, PCRTASN1COREVTABLE pVtable, PCRTASN1SETCORE pSrc)
+{
+ AssertReturn(pSrc->Asn1Core.pOps == pVtable, VERR_ASN1_INTERNAL_ERROR_5);
+ return RTAsn1Core_CloneNoContent(&pThis->Asn1Core, &pSrc->Asn1Core);
+}
+
+
+/*
+ * ASN.1 Context Tag object.
+ */
+
+RTDECL(int) RTAsn1ContextTagN_Init(PRTASN1CONTEXTTAG pThis, uint32_t uTag)
+{
+ return RTAsn1Core_InitEx(&pThis->Asn1Core,
+ uTag,
+ ASN1_TAGCLASS_CONTEXT | ASN1_TAGFLAG_CONSTRUCTED,
+ NULL,
+ RTASN1CORE_F_PRESENT);
+}
+
+
+RTDECL(int) RTAsn1ContextTagN_Clone(PRTASN1CONTEXTTAG pThis, PCRTASN1CONTEXTTAG pSrc, uint32_t uTag)
+{
+ Assert(pSrc->Asn1Core.uTag == uTag || !RTASN1CORE_IS_PRESENT(&pSrc->Asn1Core));
+ return RTAsn1Core_CloneNoContent(&pThis->Asn1Core, &pSrc->Asn1Core);
+}
+
diff --git a/src/VBox/Runtime/common/asn1/asn1-cursor.cpp b/src/VBox/Runtime/common/asn1/asn1-cursor.cpp
new file mode 100644
index 00000000000..9bad970692f
--- /dev/null
+++ b/src/VBox/Runtime/common/asn1/asn1-cursor.cpp
@@ -0,0 +1,505 @@
+/* $Id$ */
+/** @file
+ * IPRT - ASN.1, Basic Operations.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/asn1.h>
+
+#include <iprt/alloca.h>
+#include <iprt/err.h>
+#include <iprt/string.h>
+#include <iprt/ctype.h>
+
+#include <iprt/formats/asn1.h>
+
+
+/*******************************************************************************
+* Global Variables *
+*******************************************************************************/
+static char const g_achDigits[11] = "0123456789";
+
+
+
+RTDECL(PRTASN1CURSOR) RTAsn1CursorInitPrimary(PRTASN1CURSORPRIMARY pPrimaryCursor, void const *pvFirst, uint32_t cb,
+ PRTERRINFO pErrInfo, PCRTASN1ALLOCATORVTABLE pAllocator, uint32_t fFlags,
+ const char *pszErrorTag)
+{
+ pPrimaryCursor->Cursor.pbCur = (uint8_t const *)pvFirst;
+ pPrimaryCursor->Cursor.cbLeft = cb;
+ pPrimaryCursor->Cursor.fFlags = fFlags;
+ pPrimaryCursor->Cursor.pPrimary = pPrimaryCursor;
+ pPrimaryCursor->Cursor.pUp = NULL;
+ pPrimaryCursor->Cursor.pszErrorTag = pszErrorTag;
+ pPrimaryCursor->pErrInfo = pErrInfo;
+ pPrimaryCursor->pAllocator = pAllocator;
+ return &pPrimaryCursor->Cursor;
+}
+
+
+RTDECL(PRTASN1CURSOR) RTAsn1CursorInitSub(PRTASN1CURSOR pParent, uint32_t cb, PRTASN1CURSOR pChild, const char *pszErrorTag)
+{
+ Assert(pParent->pPrimary);
+ Assert(pParent->pbCur);
+
+ pChild->pbCur = pParent->pbCur;
+ pChild->cbLeft = cb;
+ pChild->fFlags = pParent->fFlags;
+ pChild->pPrimary = pParent->pPrimary;
+ pChild->pUp = pParent;
+ pChild->pszErrorTag = pszErrorTag;
+
+ AssertRelease(pParent->cbLeft >= cb);
+ pParent->pbCur += cb;
+ pParent->cbLeft -= cb;
+
+ return pChild;
+}
+
+
+RTDECL(PRTASN1CURSOR) RTAsn1CursorInitSubFromCore(PRTASN1CURSOR pParent, PRTASN1CORE pAsn1Core,
+ PRTASN1CURSOR pChild, const char *pszErrorTag)
+{
+ Assert(pParent->pPrimary);
+ Assert(pParent->pbCur);
+
+ pChild->pbCur = pAsn1Core->uData.pu8;
+ pChild->cbLeft = pAsn1Core->cb;
+ pChild->fFlags = pParent->fFlags;
+ pChild->pPrimary = pParent->pPrimary;
+ pChild->pUp = pParent;
+ pChild->pszErrorTag = pszErrorTag;
+
+ return pChild;
+}
+
+
+RTDECL(int) RTAsn1CursorSetInfoV(PRTASN1CURSOR pCursor, int rc, const char *pszMsg, va_list va)
+{
+ PRTERRINFO pErrInfo = pCursor->pPrimary->pErrInfo;
+ if (pErrInfo)
+ {
+ /* Format the message. */
+ RTErrInfoSetV(pErrInfo, rc, pszMsg, va);
+
+ /* Add the prefixes. This isn't the fastest way, but it's the one
+ which eats the least stack. */
+ char *pszBuf = pErrInfo->pszMsg;
+ size_t cbBuf = pErrInfo->cbMsg;
+ if (pszBuf && cbBuf > 32)
+ {
+ size_t cbMove = strlen(pszBuf) + 1;
+
+ /* Make sure there is a ': '. */
+ bool fFirst = false;
+ if (pszMsg[0] != '%' || pszMsg[1] != 's' || pszMsg[2] != ':')
+ {
+ if (cbMove + 2 < cbBuf)
+ {
+ memmove(pszBuf + 2, pszBuf, cbMove);
+ pszBuf[0] = ':';
+ pszBuf[1] = ' ';
+ cbMove += 2;
+ fFirst = true;
+ }
+ }
+
+ /* Add the prefixes from the cursor chain. */
+ while (pCursor)
+ {
+ if (pCursor->pszErrorTag)
+ {
+ size_t cchErrorTag = strlen(pCursor->pszErrorTag);
+ if (cchErrorTag + !fFirst + cbMove > cbBuf)
+ break;
+ memmove(pszBuf + cchErrorTag + !fFirst, pszBuf, cbMove);
+ memcpy(pszBuf, pCursor->pszErrorTag, cchErrorTag);
+ if (!fFirst)
+ pszBuf[cchErrorTag] = '.';
+ cbMove += cchErrorTag + !fFirst;
+ fFirst = false;
+ }
+ pCursor = pCursor->pUp;
+ }
+ }
+ }
+
+ return rc;
+}
+
+
+RTDECL(int) RTAsn1CursorSetInfo(PRTASN1CURSOR pCursor, int rc, const char *pszMsg, ...)
+{
+ va_list va;
+ va_start(va, pszMsg);
+ rc = RTAsn1CursorSetInfoV(pCursor, rc, pszMsg, va);
+ va_end(va);
+ return rc;
+}
+
+
+RTDECL(int) RTAsn1CursorCheckEnd(PRTASN1CURSOR pCursor)
+{
+ if (pCursor->cbLeft == 0)
+ return VINF_SUCCESS;
+ return RTAsn1CursorSetInfo(pCursor, VERR_ASN1_CURSOR_NOT_AT_END,
+ "%u (%#x) bytes left over", pCursor->cbLeft, pCursor->cbLeft);
+}
+
+
+RTDECL(PRTASN1ALLOCATION) RTAsn1CursorInitAllocation(PRTASN1CURSOR pCursor, PRTASN1ALLOCATION pAllocation)
+{
+ pAllocation->cbAllocated = 0;
+ pAllocation->cReallocs = 0;
+ pAllocation->uReserved0 = 0;
+ pAllocation->pAllocator = pCursor->pPrimary->pAllocator;
+ return pAllocation;
+}
+
+
+RTDECL(int) RTAsn1CursorReadHdr(PRTASN1CURSOR pCursor, PRTASN1CORE pAsn1Core, const char *pszErrorTag)
+{
+ /*
+ * Initialize the return structure in case of failure.
+ */
+ pAsn1Core->uTag = 0;
+ pAsn1Core->fClass = 0;
+ pAsn1Core->uRealTag = 0;
+ pAsn1Core->fRealClass = 0;
+ pAsn1Core->cbHdr = 0;
+ pAsn1Core->cb = 0;
+ pAsn1Core->fFlags = 0;
+ pAsn1Core->uData.pv = NULL;
+ pAsn1Core->pOps = NULL;
+
+ /*
+ * The header has at least two bytes: Type & length.
+ */
+ if (pCursor->cbLeft >= 2)
+ {
+ uint32_t uTag = pCursor->pbCur[0];
+ uint32_t cb = pCursor->pbCur[1];
+ pCursor->cbLeft -= 2;
+ pCursor->pbCur += 2;
+
+ pAsn1Core->uRealTag = pAsn1Core->uTag = uTag & ASN1_TAG_MASK;
+ pAsn1Core->fRealClass = pAsn1Core->fClass = uTag & ~ASN1_TAG_MASK;
+ pAsn1Core->cbHdr = 2;
+ if ((uTag & ASN1_TAG_MASK) == ASN1_TAG_USE_LONG_FORM)
+ return RTAsn1CursorSetInfo(pCursor, VERR_ASN1_CURSOR_LONG_TAG,
+ "%s: Implement parsing of tags > 30: %#x (length=%#x)", pszErrorTag, uTag, cb);
+
+ /* Extended length field? */
+ if (cb & RT_BIT(7))
+ {
+ if (cb != RT_BIT(7))
+ {
+ /* Definite form. */
+ uint8_t cbEnc = cb & 0x7f;
+ if (cbEnc > pCursor->cbLeft)
+ return RTAsn1CursorSetInfo(pCursor, VERR_ASN1_CURSOR_BAD_LENGTH_ENCODING,
+ "%s: Extended BER length field longer than available data: %#x vs %#x (uTag=%#x)",
+ pszErrorTag, cbEnc, pCursor->cbLeft, uTag);
+ switch (cbEnc)
+ {
+ case 1:
+ cb = pCursor->pbCur[0];
+ break;
+ case 2:
+ cb = RT_MAKE_U16(pCursor->pbCur[1], pCursor->pbCur[0]);
+ break;
+ case 3:
+ cb = RT_MAKE_U32_FROM_U8(pCursor->pbCur[2], pCursor->pbCur[1], pCursor->pbCur[0], 0);
+ break;
+ case 4:
+ cb = RT_MAKE_U32_FROM_U8(pCursor->pbCur[3], pCursor->pbCur[2], pCursor->pbCur[1], pCursor->pbCur[0]);
+ break;
+ default:
+ return RTAsn1CursorSetInfo(pCursor, VERR_ASN1_CURSOR_BAD_LENGTH_ENCODING,
+ "%s: Too long/short extended BER length field: %#x (uTag=%#x)",
+ pszErrorTag, cbEnc, uTag);
+ }
+ pCursor->cbLeft -= cbEnc;
+ pCursor->pbCur += cbEnc;
+ pAsn1Core->cbHdr += cbEnc;
+
+ /* Check the length encoding efficiency (T-REC-X.690-200811 10.1, 9.1). */
+ if (pCursor->fFlags & (RTASN1CURSOR_FLAGS_DER | RTASN1CURSOR_FLAGS_CER))
+ {
+ if (cb <= 0x7f)
+ return RTAsn1CursorSetInfo(pCursor, VERR_ASN1_CURSOR_BAD_LENGTH_ENCODING,
+ "%s: Invalid DER/CER length encoding: cbEnc=%u cb=%#x uTag=%#x",
+ pszErrorTag, cbEnc, cb, uTag);
+ uint8_t cbNeeded;
+ if (cb <= 0x000000ff) cbNeeded = 1;
+ else if (cb <= 0x0000ffff) cbNeeded = 2;
+ else if (cb <= 0x00ffffff) cbNeeded = 3;
+ else cbNeeded = 4;
+ if (cbNeeded != cbEnc)
+ return RTAsn1CursorSetInfo(pCursor, VERR_ASN1_CURSOR_BAD_LENGTH_ENCODING,
+ "%s: Invalid DER/CER length encoding: cb=%#x uTag=%#x cbEnc=%u cbNeeded=%u",
+ pszErrorTag, cb, uTag, cbEnc, cbNeeded);
+ }
+ }
+ /* Indefinite form. */
+ else if (pCursor->fFlags & RTASN1CURSOR_FLAGS_DER)
+ return RTAsn1CursorSetInfo(pCursor, VERR_ASN1_CURSOR_ILLEGAL_IDEFINITE_LENGTH,
+ "%s: Indefinite length form not allowed in DER mode (uTag=%#x).", pszErrorTag, uTag);
+ else
+ return RTAsn1CursorSetInfo(pCursor, VERR_ASN1_CURSOR_IDEFINITE_LENGTH_NOT_SUP,
+ "%s: Indefinite BER/CER length not supported (uTag=%#x)", pszErrorTag, uTag);
+ }
+
+ /* Check if the length makes sense. */
+ if (cb > pCursor->cbLeft)
+ return RTAsn1CursorSetInfo(pCursor, VERR_ASN1_CURSOR_BAD_LENGTH,
+ "%s: BER value length out of bounds: %#x (max=%#x uTag=%#x)",
+ pszErrorTag, cb, pCursor->cbLeft, uTag);
+
+ pAsn1Core->fFlags |= RTASN1CORE_F_PRESENT | RTASN1CORE_F_DECODED_CONTENT;
+ pAsn1Core->cb = cb;
+ pAsn1Core->uData.pv = (void *)pCursor->pbCur;
+ return VINF_SUCCESS;
+ }
+
+ if (pCursor->cbLeft)
+ return RTAsn1CursorSetInfo(pCursor, VERR_ASN1_CURSOR_TOO_LITTLE_DATA_LEFT,
+ "%s: Too little data left to form a valid BER header", pszErrorTag);
+ return RTAsn1CursorSetInfo(pCursor, VERR_ASN1_CURSOR_NO_MORE_DATA,
+ "%s: No more data reading BER header", pszErrorTag);
+}
+
+
+RTDECL(int) RTAsn1CursorMatchTagClassFlagsEx(PRTASN1CURSOR pCursor, PRTASN1CORE pAsn1Core, uint32_t uTag, uint32_t fClass,
+ bool fString, uint32_t fFlags, const char *pszErrorTag, const char *pszWhat)
+{
+ if (pAsn1Core->uTag == uTag)
+ {
+ if (pAsn1Core->fClass == fClass)
+ return VINF_SUCCESS;
+ if ( fString
+ && pAsn1Core->fClass == (fClass | ASN1_TAGFLAG_CONSTRUCTED))
+ {
+ if (!(pCursor->fFlags & (RTASN1CURSOR_FLAGS_DER | RTASN1CURSOR_FLAGS_CER)))
+ return VINF_SUCCESS;
+ if (pCursor->fFlags & RTASN1CURSOR_FLAGS_CER)
+ {
+ if (pAsn1Core->cb > 1000)
+ return VINF_SUCCESS;
+ return RTAsn1CursorSetInfo(pCursor, VERR_ASN1_CURSOR_ILLEGAL_CONSTRUCTED_STRING,
+ "%s: Constructed %s only allowed for >1000 byte in CER encoding: cb=%#x uTag=%#x fClass=%#x",
+ pszErrorTag, pszWhat, pAsn1Core->cb, pAsn1Core->uTag, pAsn1Core->fClass);
+ }
+ return RTAsn1CursorSetInfo(pCursor, VERR_ASN1_CURSOR_ILLEGAL_CONSTRUCTED_STRING,
+ "%s: DER encoding does not allow constructed %s (cb=%#x uTag=%#x fClass=%#x)",
+ pszErrorTag, pszWhat, pAsn1Core->cb, pAsn1Core->uTag, pAsn1Core->fClass);
+ }
+ }
+
+ if (fFlags & RTASN1CURSOR_GET_F_IMPLICIT)
+ {
+ pAsn1Core->fFlags |= RTASN1CORE_F_TAG_IMPLICIT;
+ pAsn1Core->uRealTag = uTag;
+ pAsn1Core->fRealClass = fClass;
+ return VINF_SUCCESS;
+ }
+
+ return RTAsn1CursorSetInfo(pCursor, pAsn1Core->uTag != uTag ? VERR_ASN1_CURSOR_TAG_MISMATCH : VERR_ASN1_CURSOR_TAG_FLAG_CLASS_MISMATCH,
+ "%s: Unexpected %s type/flags: %#x/%#x (expected %#x/%#x)",
+ pszErrorTag, pszWhat, pAsn1Core->uTag, pAsn1Core->fClass, uTag, fClass);
+}
+
+
+
+static int rtAsn1CursorGetXxxxCursor(PRTASN1CURSOR pCursor, uint32_t fFlags, uint32_t uTag, uint8_t fClass,
+ PRTASN1CORE pAsn1Core, PRTASN1CURSOR pRetCursor,
+ const char *pszErrorTag, const char *pszWhat)
+{
+ int rc = RTAsn1CursorReadHdr(pCursor, pAsn1Core, pszErrorTag);
+ if (RT_SUCCESS(rc))
+ {
+ if ( pAsn1Core->uTag == uTag
+ && pAsn1Core->fClass == fClass)
+ rc = VINF_SUCCESS;
+ else if (fFlags & RTASN1CURSOR_GET_F_IMPLICIT)
+ {
+ pAsn1Core->fFlags |= RTASN1CORE_F_TAG_IMPLICIT;
+ pAsn1Core->uRealTag = uTag;
+ pAsn1Core->fRealClass = fClass;
+ rc = VINF_SUCCESS;
+ }
+ else
+ return RTAsn1CursorSetInfo(pCursor, VERR_ASN1_CURSOR_ILLEGAL_CONSTRUCTED_STRING,
+ "%s: Unexpected %s type/flags: %#x/%#x (expected %#x/%#x)",
+ pszErrorTag, pszWhat, pAsn1Core->uTag, pAsn1Core->fClass, uTag, fClass);
+ RTAsn1CursorInitSub(pCursor, pAsn1Core->cb, pRetCursor, pszErrorTag);
+ pAsn1Core->fFlags |= RTASN1CORE_F_PRIMITE_TAG_STRUCT;
+ return VINF_SUCCESS;
+ }
+ return rc;
+}
+
+
+RTDECL(int) RTAsn1CursorGetSequenceCursor(PRTASN1CURSOR pCursor, uint32_t fFlags,
+ PRTASN1SEQUENCECORE pSeqCore, PRTASN1CURSOR pSeqCursor, const char *pszErrorTag)
+{
+ return rtAsn1CursorGetXxxxCursor(pCursor, fFlags, ASN1_TAG_SEQUENCE, ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_CONSTRUCTED,
+ &pSeqCore->Asn1Core, pSeqCursor, pszErrorTag, "sequence");
+}
+
+
+RTDECL(int) RTAsn1CursorGetSetCursor(PRTASN1CURSOR pCursor, uint32_t fFlags,
+ PRTASN1SETCORE pSetCore, PRTASN1CURSOR pSetCursor, const char *pszErrorTag)
+{
+ return rtAsn1CursorGetXxxxCursor(pCursor, fFlags, ASN1_TAG_SET, ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_CONSTRUCTED,
+ &pSetCore->Asn1Core, pSetCursor, pszErrorTag, "set");
+}
+
+
+RTDECL(int) RTAsn1CursorGetContextTagNCursor(PRTASN1CURSOR pCursor, uint32_t fFlags, uint32_t uExpectedTag,
+ PRTASN1CONTEXTTAG pCtxTag, PRTASN1CURSOR pCtxTagCursor, const char *pszErrorTag)
+{
+ return rtAsn1CursorGetXxxxCursor(pCursor, fFlags, uExpectedTag, ASN1_TAGCLASS_CONTEXT | ASN1_TAGFLAG_CONSTRUCTED,
+ &pCtxTag->Asn1Core, pCtxTagCursor, pszErrorTag, "ctx tag");
+}
+
+
+RTDECL(int) RTAsn1CursorPeek(PRTASN1CURSOR pCursor, PRTASN1CORE pAsn1Core)
+{
+ uint32_t cbSavedLeft = pCursor->cbLeft;
+ uint8_t const *pbSavedCur = pCursor->pbCur;
+ PRTERRINFO pErrInfo = pCursor->pPrimary->pErrInfo;
+ pCursor->pPrimary->pErrInfo = NULL;
+
+ int rc = RTAsn1CursorReadHdr(pCursor, pAsn1Core, "peek");
+
+ pCursor->pPrimary->pErrInfo = pErrInfo;
+ pCursor->pbCur = pbSavedCur;
+ pCursor->cbLeft = cbSavedLeft;
+ return rc;
+}
+
+
+RTDECL(bool) RTAsn1CursorIsNextEx(PRTASN1CURSOR pCursor, uint32_t uTag, uint8_t fClass)
+{
+ RTASN1CORE Asn1Core;
+ int rc = RTAsn1CursorPeek(pCursor, &Asn1Core);
+ if (RT_SUCCESS(rc))
+ return uTag == Asn1Core.uTag
+ && fClass == Asn1Core.fClass;
+ return false;
+}
+
+
+/** @name Legacy Interfaces.
+ * @{ */
+RTDECL(int) RTAsn1CursorGetCore(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1CORE pAsn1Core, const char *pszErrorTag)
+{
+ return RTAsn1Core_DecodeAsn1(pCursor, fFlags, pAsn1Core, pszErrorTag);
+}
+
+
+RTDECL(int) RTAsn1CursorGetNull(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1NULL pNull, const char *pszErrorTag)
+{
+ return RTAsn1Null_DecodeAsn1(pCursor, fFlags, pNull, pszErrorTag);
+}
+
+
+RTDECL(int) RTAsn1CursorGetInteger(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1INTEGER pInteger, const char *pszErrorTag)
+{
+ return RTAsn1Integer_DecodeAsn1(pCursor, fFlags, pInteger, pszErrorTag);
+}
+
+
+RTDECL(int) RTAsn1CursorGetBoolean(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1BOOLEAN pBoolean, const char *pszErrorTag)
+{
+ return RTAsn1Boolean_DecodeAsn1(pCursor, fFlags, pBoolean, pszErrorTag);
+}
+
+
+RTDECL(int) RTAsn1CursorGetObjId(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1OBJID pObjId, const char *pszErrorTag)
+{
+ return RTAsn1ObjId_DecodeAsn1(pCursor, fFlags, pObjId, pszErrorTag);
+}
+
+
+RTDECL(int) RTAsn1CursorGetTime(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1TIME pTime, const char *pszErrorTag)
+{
+ return RTAsn1Time_DecodeAsn1(pCursor, fFlags, pTime, pszErrorTag);
+}
+
+
+RTDECL(int) RTAsn1CursorGetBitStringEx(PRTASN1CURSOR pCursor, uint32_t fFlags, uint32_t cMaxBits, PRTASN1BITSTRING pBitString,
+ const char *pszErrorTag)
+{
+ return RTAsn1BitString_DecodeAsn1Ex(pCursor, fFlags, cMaxBits, pBitString, pszErrorTag);
+}
+
+
+RTDECL(int) RTAsn1CursorGetBitString(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1BITSTRING pBitString, const char *pszErrorTag)
+{
+ return RTAsn1BitString_DecodeAsn1(pCursor, fFlags, pBitString, pszErrorTag);
+}
+
+
+RTDECL(int) RTAsn1CursorGetOctetString(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1OCTETSTRING pOctetString,
+ const char *pszErrorTag)
+{
+ return RTAsn1OctetString_DecodeAsn1(pCursor, fFlags, pOctetString, pszErrorTag);
+}
+
+
+RTDECL(int) RTAsn1CursorGetString(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1STRING pString, const char *pszErrorTag)
+{
+ return RTAsn1String_DecodeAsn1(pCursor, fFlags, pString, pszErrorTag);
+}
+
+
+RTDECL(int) RTAsn1CursorGetIa5String(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1STRING pString, const char *pszErrorTag)
+{
+ return RTAsn1Ia5String_DecodeAsn1(pCursor, fFlags, pString, pszErrorTag);
+}
+
+
+RTDECL(int) RTAsn1CursorGetUtf8String(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1STRING pString, const char *pszErrorTag)
+{
+ return RTAsn1Utf8String_DecodeAsn1(pCursor, fFlags, pString, pszErrorTag);
+}
+
+
+RTDECL(int) RTAsn1CursorGetBmpString(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1STRING pString, const char *pszErrorTag)
+{
+ return RTAsn1BmpString_DecodeAsn1(pCursor, fFlags, pString, pszErrorTag);
+}
+
+
+RTDECL(int) RTAsn1CursorGetDynType(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1DYNTYPE pDynType, const char *pszErrorTag)
+{
+ return RTAsn1DynType_DecodeAsn1(pCursor, fFlags, pDynType, pszErrorTag);
+}
+/** @} */
+
diff --git a/src/VBox/Runtime/common/asn1/asn1-default-allocator.cpp b/src/VBox/Runtime/common/asn1/asn1-default-allocator.cpp
new file mode 100644
index 00000000000..16259b18ddf
--- /dev/null
+++ b/src/VBox/Runtime/common/asn1/asn1-default-allocator.cpp
@@ -0,0 +1,108 @@
+/* $Id$ */
+/** @file
+ * IPRT - ASN.1, Default Allocator.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#if defined(DEBUG_bird) && !defined(IPRT_NO_CRT)
+# define RTMEM_WRAP_TO_EF_APIS
+#endif
+#include "internal/iprt.h"
+#include <iprt/asn1.h>
+
+#include <iprt/mem.h>
+#include <iprt/err.h>
+#include <iprt/string.h>
+
+
+/**
+ * Aligns allocation sizes a little.
+ *
+ * @returns Aligned size.
+ * @param cb Requested size.
+ */
+static size_t rtAsn1DefaultAllocator_AlignSize(size_t cb)
+{
+ if (cb >= 64)
+ return RT_ALIGN_Z(cb, 64);
+ if (cb >= 32)
+ return RT_ALIGN_Z(cb, 32);
+ if (cb >= 16)
+ return RT_ALIGN_Z(cb, 16);
+ return cb;
+}
+
+
+/** @interface_method_impl{RTASN1ALLOCATORVTABLE, pfnFree} */
+static DECLCALLBACK(void) rtAsn1DefaultAllocator_Free(PCRTASN1ALLOCATORVTABLE pThis, PRTASN1ALLOCATION pAllocation, void *pv)
+{
+ RTMemFree(pv);
+ pAllocation->cbAllocated = 0;
+}
+
+
+/** @interface_method_impl{RTASN1ALLOCATORVTABLE, pfnAlloc} */
+static DECLCALLBACK(int) rtAsn1DefaultAllocator_Alloc(PCRTASN1ALLOCATORVTABLE pThis, PRTASN1ALLOCATION pAllocation,
+ void **ppv, size_t cb)
+{
+ size_t cbAlloc = rtAsn1DefaultAllocator_AlignSize(cb);
+ void *pv = RTMemAllocZ(cbAlloc);
+ if (pv)
+ {
+ *ppv = pv;
+ pAllocation->cbAllocated = (uint32_t)cbAlloc;
+ return VINF_SUCCESS;
+ }
+ return VERR_NO_MEMORY;
+}
+
+
+/** @interface_method_impl{RTASN1ALLOCATORVTABLE, pfnRealloc} */
+static DECLCALLBACK(int) rtAsn1DefaultAllocator_Realloc(PCRTASN1ALLOCATORVTABLE pThis, PRTASN1ALLOCATION pAllocation,
+ void *pvOld, void **ppvNew, size_t cbNew)
+{
+ Assert(pvOld);
+ Assert(cbNew);
+ size_t cbAlloc = rtAsn1DefaultAllocator_AlignSize(cbNew);
+ void *pv = RTMemRealloc(pvOld, cbAlloc);
+ if (pv)
+ {
+ *ppvNew = pv;
+ pAllocation->cbAllocated = (uint32_t)cbAlloc;
+ return VINF_SUCCESS;
+ }
+ return VERR_NO_MEMORY;
+}
+
+
+/** The default ASN.1 allocator. */
+RT_DECL_DATA_CONST(RTASN1ALLOCATORVTABLE const) g_RTAsn1DefaultAllocator =
+{
+ rtAsn1DefaultAllocator_Free,
+ rtAsn1DefaultAllocator_Alloc,
+ rtAsn1DefaultAllocator_Realloc
+};
+
diff --git a/src/VBox/Runtime/common/asn1/asn1-dump.cpp b/src/VBox/Runtime/common/asn1/asn1-dump.cpp
new file mode 100644
index 00000000000..c24db7ed771
--- /dev/null
+++ b/src/VBox/Runtime/common/asn1/asn1-dump.cpp
@@ -0,0 +1,796 @@
+/* $Id$ */
+/** @file
+ * IPRT - ASN.1, Structure Dumper.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/asn1.h>
+
+#include <iprt/err.h>
+#include <iprt/log.h>
+#ifdef IN_RING3
+# include <iprt/stream.h>
+#endif
+#include <iprt/string.h>
+
+#include <iprt/formats/asn1.h>
+
+
+/*******************************************************************************
+* Structures and Typedefs *
+*******************************************************************************/
+/**
+ * Dump data structure.
+ */
+typedef struct RTASN1DUMPDATA
+{
+ /** RTASN1DUMP_F_XXX. */
+ uint32_t fFlags;
+ /** The printfv like output function. */
+ PFNRTDUMPPRINTFV pfnPrintfV;
+ /** PrintfV user argument. */
+ void *pvUser;
+} RTASN1DUMPDATA;
+/** Pointer to a dump data structure. */
+typedef RTASN1DUMPDATA *PRTASN1DUMPDATA;
+
+
+/**
+ * Wrapper around FNRTASN1DUMPPRINTFV.
+ *
+ * @param pData The dump data structure.
+ * @param pszFormat Format string.
+ * @param ... Format arguments.
+ */
+static void rtAsn1DumpPrintf(PRTASN1DUMPDATA pData, const char *pszFormat, ...)
+{
+ va_list va;
+ va_start(va, pszFormat);
+ pData->pfnPrintfV(pData->pvUser, pszFormat, va);
+ va_end(va);
+}
+
+
+/**
+ * Prints indentation.
+ *
+ * @param pData The dump data structure.
+ * @param uDepth The indentation depth.
+ */
+static void rtAsn1DumpPrintIdent(PRTASN1DUMPDATA pData, uint32_t uDepth)
+{
+ uint32_t i = 0;
+ uDepth *= 2;
+ while (i < uDepth)
+ {
+ static char const s_szSpaces[] = " ";
+ uint32_t cch = RT_MIN(uDepth, sizeof(s_szSpaces) - 1);
+ rtAsn1DumpPrintf(pData, &s_szSpaces[sizeof(s_szSpaces) - 1 - cch]);
+ i += cch;
+ }
+}
+
+
+/**
+ * Dumps UTC TIME and GENERALIZED TIME
+ *
+ * @param pData The dump data structure.
+ * @param pAsn1Core The ASN.1 core object representation.
+ * @param pszName The member name.
+ * @param pszType The time type name.
+ */
+static void rtAsn1DumpTime(PRTASN1DUMPDATA pData, PCRTASN1CORE pAsn1Core, const char *pszName, const char *pszType)
+{
+ if ((pAsn1Core->fFlags & RTASN1CORE_F_PRIMITE_TAG_STRUCT))
+ {
+ PCRTASN1TIME pTime = (PCRTASN1TIME)pAsn1Core;
+ rtAsn1DumpPrintf(pData, "%-16s %s -- %04u-%02u-%02u %02u:%02u:%02.%09Z\n",
+ pszName, pszType,
+ pTime->Time.i32Year, pTime->Time.u8Month, pTime->Time.u8MonthDay,
+ pTime->Time.u8Hour, pTime->Time.u8Minute, pTime->Time.u8Second,
+ pTime->Time.u32Nanosecond);
+ }
+ else if (pAsn1Core->cb > 0 && pAsn1Core->cb < 32 && pAsn1Core->uData.pch)
+ rtAsn1DumpPrintf(pData, "%-16s %s '%.*s'\n",
+ pszName, pszType, (size_t)pAsn1Core->cb, pAsn1Core->uData.pch);
+ else
+ rtAsn1DumpPrintf(pData, "%-16s %s -- cb=%u\n", pszName, pszType, pAsn1Core->cb);
+}
+
+
+/**
+ * Dumps strings sharing the RTASN1STRING structure.
+ *
+ * @param pData The dump data structure.
+ * @param pAsn1Core The ASN.1 core object representation.
+ * @param pszName The member name.
+ * @param pszType The string type name.
+ * @param uDepth The current identation level.
+ */
+static void rtAsn1DumpString(PRTASN1DUMPDATA pData, PCRTASN1CORE pAsn1Core, const char *pszName, const char *pszType,
+ uint32_t uDepth)
+{
+ rtAsn1DumpPrintf(pData, "%-16s %s", pszName, pszType);
+
+ const char *pszPostfix = "'\n";
+ bool fUtf8 = false;
+ const char *pch = pAsn1Core->uData.pch;
+ uint32_t cch = pAsn1Core->cb;
+ PCRTASN1STRING pString = (PCRTASN1STRING)pAsn1Core;
+ if ( (pAsn1Core->fFlags & RTASN1CORE_F_PRIMITE_TAG_STRUCT)
+ && pString->pszUtf8
+ && pString->cchUtf8)
+ {
+ fUtf8 = true;
+ pszPostfix = "' -- utf-8\n";
+ }
+
+ if (cch == 0 || !pch)
+ rtAsn1DumpPrintf(pData, " -- cb=%u\n", pszName, pszType, pAsn1Core->cb);
+ else
+ {
+ if (cch >= 48)
+ {
+ rtAsn1DumpPrintf(pData, "\n");
+ rtAsn1DumpPrintIdent(pData, uDepth + 1);
+ }
+ rtAsn1DumpPrintf(pData, " '");
+
+ /** @todo Handle BMP and UNIVERSIAL strings specially. */
+ do
+ {
+ const char *pchStart = pch;
+ while ( cch > 0
+ && (uint8_t)*pch >= 0x20
+ && (!fUtf8 ? (uint8_t)*pch < 0x7f : (uint8_t)*pch != 0x7f)
+ && *pch != '\'')
+ cch--, pch++;
+ if (pchStart != pch)
+ rtAsn1DumpPrintf(pData, "%.*s", pch - pchStart, pchStart);
+
+ while ( cch > 0
+ && ( (uint8_t)*pch < 0x20
+ || (!fUtf8 ? (uint8_t)*pch >= 0x7f : (uint8_t)*pch == 0x7f)
+ || (uint8_t)*pch == '\'') )
+ {
+ rtAsn1DumpPrintf(pData, "\\x%02", *pch);
+ cch--;
+ pch++;
+ }
+ } while (cch > 0);
+
+ rtAsn1DumpPrintf(pData, pszPostfix);
+ }
+}
+
+
+/**
+ * Returns a name for the given object ID.
+ *
+ * This is just to make some of the dumps a little easier to read. It's no our
+ * intention to have the whole ODI repository encoded here.
+ *
+ * @returns Name if available, NULL if not.
+ * @param pszObjId The dotted object identifier string.
+ */
+static const char *rtAsn1DumpLookupObjIdName(const char *pszObjId)
+{
+#define STARTS_WITH_1(a_off, a_uValue) \
+ ( pszObjId[a_off] == (a_uValue) + '0' && pszObjId[a_off + 1] == '.' )
+#define STARTS_WITH_2(a_off, a_uValue) \
+ ( pszObjId[a_off] == (a_uValue) / 10 + '0' && pszObjId[a_off + 1] == (a_uValue) % 10 + '0' && pszObjId[a_off + 2] == '.' )
+#define STARTS_WITH_3(a_off, a_uValue) \
+ ( pszObjId[a_off] == (a_uValue) / 100 + '0' \
+ && pszObjId[a_off + 1] == ((a_uValue) % 100) / 10 + '0' \
+ && pszObjId[a_off + 2] == (a_uValue) % 10 + '0' \
+ && pszObjId[a_off + 3] == '.' )
+#define STARTS_WITH_6(a_off, a_uValue) \
+ ( pszObjId[a_off] == (a_uValue) / 100000 + '0' \
+ && pszObjId[a_off + 1] == ((a_uValue) % 100000) / 10000 + '0' \
+ && pszObjId[a_off + 2] == ((a_uValue) % 10000) / 1000 + '0' \
+ && pszObjId[a_off + 3] == ((a_uValue) % 1000) / 100 + '0' \
+ && pszObjId[a_off + 4] == ((a_uValue) % 100) / 10 + '0' \
+ && pszObjId[a_off + 5] == (a_uValue) % 10 + '0' \
+ && pszObjId[a_off + 6] == '.' )
+
+#define ENDS_WITH_1(a_off, a_uValue) \
+ ( pszObjId[a_off] == (a_uValue) + '0' && !pszObjId[a_off + 1] )
+#define ENDS_WITH_2(a_off, a_uValue) \
+ ( pszObjId[a_off] == (a_uValue) / 10 + '0' && pszObjId[a_off + 1] == (a_uValue) % 10 + '0' && !pszObjId[a_off + 2] )
+
+ if (STARTS_WITH_1(0, 0)) /* ITU-T assigned - top level 0. */
+ {
+
+ }
+ else if (STARTS_WITH_1(0, 1)) /* ISO assigned - top level 1. */
+ {
+ if (STARTS_WITH_1(2, 0)) /* ISO standard - 1.0. */
+ {
+ /* */
+ }
+ else if (STARTS_WITH_1(2, 2)) /* ISO member body - 1.2. */
+ {
+ if (STARTS_WITH_3(4, 840)) /* USA - 1.2.840. */
+ {
+ if (STARTS_WITH_6(8, 113549)) /* RSADSI / RSA Data Security inc - 1.2.840.113549. */
+ {
+ if (STARTS_WITH_1(15, 1)) /* PKCS - 1.2.840.113549.1. */
+ {
+ if (STARTS_WITH_1(17, 1)) /* PKCS-1 - 1.2.840.113549.1.1. */
+ {
+ if (ENDS_WITH_1(19, 1)) return "pkcs1-RsaEncryption";
+ else if (ENDS_WITH_1(19, 2)) return "pkcs1-Md2WithRsaEncryption";
+ else if (ENDS_WITH_1(19, 3)) return "pkcs1-Md4WithRsaEncryption";
+ else if (ENDS_WITH_1(19, 4)) return "pkcs1-Md5WithRsaEncryption";
+ else if (ENDS_WITH_1(19, 5)) return "pkcs1-Sha1WithRsaEncryption";
+ else if (ENDS_WITH_2(19, 10)) return "pkcs1-RsaPss";
+ else if (ENDS_WITH_2(19, 11)) return "pkcs1-Sha256WithRsaEncryption";
+ else if (ENDS_WITH_2(19, 12)) return "pkcs1-Sha384WithRsaEncryption";
+ else if (ENDS_WITH_2(19, 13)) return "pkcs1-Sha512WithRsaEncryption";
+ else if (ENDS_WITH_2(19, 14)) return "pkcs1-Sha224WithRsaEncryption";
+ }
+ else if (STARTS_WITH_1(17, 9)) /* PKCS-9 signatures - 1.2.840.113549.1.9. */
+ {
+ if (ENDS_WITH_1(19, 1)) return "pkcs9-EMailAddress";
+ else if (ENDS_WITH_1(19, 2)) return "pkcs9-UntrustedName";
+ else if (ENDS_WITH_1(19, 3)) return "pkcs9-ContentType";
+ else if (ENDS_WITH_1(19, 4)) return "pkcs9-MessageDigest";
+ else if (ENDS_WITH_1(19, 5)) return "pkcs9-SigningTime";
+ else if (ENDS_WITH_1(19, 6)) return "pkcs9-CounterSignature";
+ else if (ENDS_WITH_1(19, 7)) return "pkcs9-challengePassword";
+ else if (ENDS_WITH_1(19, 8)) return "pkcs9-UnstructuredAddress";
+ else if (ENDS_WITH_1(19, 9)) return "pkcs9-ExtendedCertificateAttributes";
+ else if (ENDS_WITH_2(19, 13)) return "pkcs9-SigningDescription";
+ else if (ENDS_WITH_2(19, 14)) return "pkcs9-ExtensionRequest";
+ else if (ENDS_WITH_2(19, 15)) return "pkcs9-SMimeCapabilities";
+ }
+ }
+ else if (STARTS_WITH_1(15, 2)) /* PKCS #2 - 1.2.840.113549.2. */
+ {
+ }
+ }
+ }
+ }
+ else if (STARTS_WITH_1(2, 3)) /* ISO identified organiziation - 1.3. */
+ {
+ if (STARTS_WITH_1(4, 6)) /* DOD - 1.3.6. */
+ {
+ if (STARTS_WITH_1(6, 1)) /* Internet - 1.3.6.1. */
+ {
+ if (STARTS_WITH_1(8, 4)) /* Private - 1.3.6.1.4. */
+ {
+ if (STARTS_WITH_1(10, 1)) /* IANA-registered Private Enterprises. */
+ {
+ if (STARTS_WITH_3(12, 311)) /* Microsoft - 1.3.6.1.4.1.311 */
+ {
+ if (STARTS_WITH_1(16, 1)) /* 1.3.6.1.4.1.311.1. */
+ {
+ }
+ else if (STARTS_WITH_1(16, 2)) /* 1.3.6.1.4.1.311.2 */
+ {
+ if (STARTS_WITH_1(18, 1)) /* 1.3.6.1.4.1.311.2.1. */
+ {
+ if (ENDS_WITH_1(20, 1)) return "Ms-??-2.1";
+ else if (ENDS_WITH_1(20, 4)) return "Ms-SpcIndirectDataContext";
+ else if (ENDS_WITH_2(20, 10)) return "Ms-SpcAgencyInfo";
+ else if (ENDS_WITH_2(20, 11)) return "Ms-SpcStatemntType";
+ else if (ENDS_WITH_2(20, 12)) return "Ms-SpcOpusInfo";
+ else if (ENDS_WITH_2(20, 14)) return "Ms-CertReqExtensions";
+ else if (ENDS_WITH_2(20, 15)) return "Ms-SpcPeImageData";
+ else if (ENDS_WITH_2(20, 18)) return "Ms-SpcRawFileData";
+ else if (ENDS_WITH_2(20, 19)) return "Ms-SpcStructuredStorageData";
+ else if (ENDS_WITH_2(20, 20)) return "Ms-SpcJavaClassDataType1";
+ else if (ENDS_WITH_2(20, 21)) return "Ms-SpcIndividualCodeSigning";
+ else if (ENDS_WITH_2(20, 22)) return "Ms-SpcCommericalSigning";
+ else if (ENDS_WITH_2(20, 25)) return "Ms-SpcLinkType2-Aka-CabData";
+ else if (ENDS_WITH_2(20, 26)) return "Ms-SpcMinimalCriterialInfo";
+ else if (ENDS_WITH_2(20, 27)) return "Ms-SpcFinacialCriterialInfo";
+ else if (ENDS_WITH_2(20, 28)) return "Ms-SpcLinkType3";
+ }
+ else if (STARTS_WITH_1(18, 3)) /* 1.3.6.1.4.1.311.2.3. */
+ {
+ if (ENDS_WITH_1(20, 1)) return "Ms-SpcPeImagePageHashesV1";
+ else if (ENDS_WITH_1(20, 2)) return "Ms-SpcPeImagePageHashesV2";
+ }
+ }
+ else if (STARTS_WITH_1(16, 3)) /* 1.3.6.1.4.1.311.3 */
+ {
+ if (STARTS_WITH_1(18, 3)) /* 1.3.6.1.4.1.311.3.3. */
+ {
+ if (ENDS_WITH_1(20, 1)) return "Ms-CounterSign";
+ else if (ENDS_WITH_1(20, 2)) return "Ms-??-3.2";
+ }
+ }
+ else if (STARTS_WITH_2(16, 10)) /* 1.3.6.1.4.1.311.10 */
+ {
+ if (STARTS_WITH_1(19, 3)) /* . */
+ {
+ if (ENDS_WITH_1(21, 1)) return "Ms-CertTrustListSigning";
+ else if (ENDS_WITH_1(21, 2)) return "Ms-TimeStampSigning";
+ else if (ENDS_WITH_1(21, 4)) return "Ms-EncryptedFileSystem";
+ else if (ENDS_WITH_1(21, 5)) return "Ms-WhqlCrypto";
+ else if (ENDS_WITH_1(21, 6)) return "Ms-Nt5Crypto";
+ else if (ENDS_WITH_1(21, 7)) return "Ms-OemWhqlCrypto";
+ else if (ENDS_WITH_1(21, 8)) return "Ms-EmbeddedNtCrypto";
+ else if (ENDS_WITH_1(21, 9)) return "Ms-RootListSigner";
+ else if (ENDS_WITH_2(21, 10)) return "Ms-QualifiedSubordination";
+ else if (ENDS_WITH_2(21, 11)) return "Ms-KeyRecovery";
+ else if (ENDS_WITH_2(21, 12)) return "Ms-DocumentSigning";
+ else if (ENDS_WITH_2(21, 13)) return "Ms-LifetimeSigning";
+ }
+ else if (STARTS_WITH_1(19, 5)) /* . */
+ {
+ if (ENDS_WITH_1(21, 1)) return "Ms-Drm";
+ else if (ENDS_WITH_1(21, 2)) return "Ms-DrmIndividualization";
+ }
+ else if (STARTS_WITH_1(19, 9)) /* . */
+ {
+ if (ENDS_WITH_1(21, 1)) return "Ms-CrossCertDistPoints";
+ }
+ }
+ else if (STARTS_WITH_2(16, 20)) /* 1.3.6.1.4.1.311.20 */
+ {
+ if (ENDS_WITH_1(19, 1)) return "Ms-AutoEnrollCtlUsage";
+ else if (ENDS_WITH_1(19, 2)) return "Ms-EnrollCerttypeExtension";
+ }
+ else if (STARTS_WITH_2(16, 21)) /* CertSrv Infrastructure - 1.3.6.1.4.1.311.21 */
+ {
+ if (ENDS_WITH_1(19, 1)) return "Ms-CaKeyCertIndexPair";
+ else if (ENDS_WITH_1(19, 2)) return "Ms-CertSrvPreviousCertHash";
+ else if (ENDS_WITH_1(19, 3)) return "Ms-CrlVirtualBase";
+ else if (ENDS_WITH_1(19, 4)) return "Ms-CrlNextPublish";
+ else if (ENDS_WITH_1(19, 6)) return "Ms-KeyRecovery";
+ else if (ENDS_WITH_1(19, 7)) return "Ms-CertificateTemplate";
+ else if (ENDS_WITH_1(19, 9)) return "Ms-DummySigner";
+ }
+ }
+ }
+ }
+ else if (STARTS_WITH_1(8, 5)) /* Security - 1.3.6.1.5. */
+ {
+ if (STARTS_WITH_1(10, 5)) /* Mechanisms - 1.3.6.1.5.5. */
+ {
+ if (STARTS_WITH_1(12, 7)) /* Public-Key Infrastructure (X.509) - 1.3.6.1.5.5.7. */
+ {
+ if (STARTS_WITH_1(14, 1)) /* Private Extension - 1.3.6.1.5.5.7.1. */
+ {
+ if (ENDS_WITH_1(16, 1)) return "pkix-AuthorityInfoAccess";
+ else if (ENDS_WITH_2(16, 12)) return "pkix-LogoType";
+ }
+ else if (STARTS_WITH_1(14, 2)) /* Private Extension - 1.3.6.1.5.5.7.2. */
+ {
+ if (ENDS_WITH_1(16, 1)) return "id-qt-CPS";
+ else if (ENDS_WITH_1(16, 2)) return "id-qt-UNotice";
+ else if (ENDS_WITH_1(16, 3)) return "id-qt-TextNotice";
+ else if (ENDS_WITH_1(16, 4)) return "id-qt-ACPS";
+ else if (ENDS_WITH_1(16, 5)) return "id-qt-ACUNotice";
+ }
+ else if (STARTS_WITH_1(14, 3)) /* Private Extension - 1.3.6.1.5.5.7.3. */
+ {
+ if (ENDS_WITH_1(16, 1)) return "id-kp-ServerAuth";
+ else if (ENDS_WITH_1(16, 2)) return "id-kp-ClientAuth";
+ else if (ENDS_WITH_1(16, 3)) return "id-kp-CodeSigning";
+ else if (ENDS_WITH_1(16, 4)) return "id-kp-EmailProtection";
+ else if (ENDS_WITH_1(16, 5)) return "id-kp-IPSecEndSystem";
+ else if (ENDS_WITH_1(16, 6)) return "id-kp-IPSecTunnel";
+ else if (ENDS_WITH_1(16, 7)) return "id-kp-IPSecUser";
+ else if (ENDS_WITH_1(16, 8)) return "id-kp-Timestamping";
+ else if (ENDS_WITH_1(16, 9)) return "id-kp-OCSPSigning";
+ else if (ENDS_WITH_2(16, 10)) return "id-kp-DVCS";
+ else if (ENDS_WITH_2(16, 11)) return "id-kp-SBGPCertAAServiceAuth";
+ else if (ENDS_WITH_2(16, 13)) return "id-kp-EAPOverPPP";
+ else if (ENDS_WITH_2(16, 14)) return "id-kp-EAPOverLAN";
+ }
+ }
+ }
+ }
+ }
+ }
+ else if (STARTS_WITH_2(4, 14)) /* 1.3.14. */
+ {
+ if (STARTS_WITH_1(7, 3)) /* OIW Security Special Interest Group - 1.3.14.3. */
+ {
+ if (STARTS_WITH_1(9, 2)) /* OIW SSIG algorithms - 1.3.14.3.2. */
+ {
+ if (ENDS_WITH_1(11, 2)) return "oiw-ssig-Md4WithRsa";
+ else if (ENDS_WITH_1(11, 3)) return "oiw-ssig-Md5WithRsa";
+ else if (ENDS_WITH_1(11, 4)) return "oiw-ssig-Md4WithRsaEncryption";
+ else if (ENDS_WITH_2(11, 15)) return "oiw-ssig-ShaWithRsaEncryption";
+ else if (ENDS_WITH_2(11, 24)) return "oiw-ssig-Md2WithRsaEncryption";
+ else if (ENDS_WITH_2(11, 25)) return "oiw-ssig-Md5WithRsaEncryption";
+ else if (ENDS_WITH_2(11, 26)) return "oiw-ssig-Sha1";
+ else if (ENDS_WITH_2(11, 29)) return "oiw-ssig-Sha1WithRsaEncryption";
+ }
+ }
+ }
+ }
+ }
+ else if (STARTS_WITH_1(0, 2)) /* Joint ISO/ITU-T assigned - top level 2.*/
+ {
+ if (STARTS_WITH_1(2, 1)) /* ASN.1 - 2.1. */
+ {
+ }
+ else if (STARTS_WITH_1(2, 5)) /* Directory (X.500) - 2.5. */
+ {
+ if (STARTS_WITH_1(4, 4)) /* X.500 Attribute types - 2.5.4. */
+ {
+ if (ENDS_WITH_1(6, 3)) return "x500-CommonName";
+ else if (ENDS_WITH_1(6, 6)) return "x500-CountryName";
+ else if (ENDS_WITH_1(6, 7)) return "x500-LocalityName";
+ else if (ENDS_WITH_1(6, 8)) return "x500-StatOrProvinceName";
+ else if (ENDS_WITH_2(6, 10)) return "x500-OrganizationName";
+ else if (ENDS_WITH_2(6, 11)) return "x500-OrganizationUnitName";
+ }
+ else if (STARTS_WITH_2(4, 29)) /* certificateExtension (id-ce) - 2.5.29. */
+ {
+ if (ENDS_WITH_1(7, 1)) return "id-ce-AuthorityKeyIdentifier-Deprecated";
+ else if (ENDS_WITH_1(7, 2)) return "id-ce-KeyAttributes-Deprecated";
+ else if (ENDS_WITH_1(7, 3)) return "id-ce-CertificatePolicies-Deprecated";
+ else if (ENDS_WITH_1(7, 4)) return "id-ce-KeyUsageRestriction-Deprecated";
+ else if (ENDS_WITH_1(7, 7)) return "id-ce-SubjectAltName-Deprecated";
+ else if (ENDS_WITH_1(7, 8)) return "id-ce-IssuerAltName-Deprecated";
+ else if (ENDS_WITH_2(7, 14)) return "id-ce-SubjectKeyIdentifier";
+ else if (ENDS_WITH_2(7, 15)) return "id-ce-KeyUsage";
+ else if (ENDS_WITH_2(7, 16)) return "id-ce-PrivateKeyUsagePeriod";
+ else if (ENDS_WITH_2(7, 17)) return "id-ce-SubjectAltName";
+ else if (ENDS_WITH_2(7, 18)) return "id-ce-issuerAltName";
+ else if (ENDS_WITH_2(7, 19)) return "id-ce-BasicConstraints";
+ else if (ENDS_WITH_2(7, 25)) return "id-ce-CrlDistributionPoints";
+ else if (ENDS_WITH_2(7, 29)) return "id-ce-CertificateIssuer";
+ else if (ENDS_WITH_2(7, 30)) return "id-ce-NameConstraints";
+ else if (ENDS_WITH_2(7, 31)) return "id-ce-CrlDistributionPoints";
+ else if (ENDS_WITH_2(7, 32)) return "id-ce-CertificatePolicies";
+ else if (STARTS_WITH_2(7, 32))
+ {
+ if (ENDS_WITH_1(10, 0)) return "id-ce-cp-anyPolicy";
+ }
+ else if (ENDS_WITH_2(7, 35)) return "id-ce-AuthorityKeyIdentifier";
+ else if (ENDS_WITH_2(7, 36)) return "id-ce-PolicyConstraints";
+ else if (ENDS_WITH_2(7, 37)) return "id-ce-ExtKeyUsage";
+ }
+ }
+ else if (STARTS_WITH_2(2, 16)) /* Join assignments by country - 2.16. */
+ {
+ if (0)
+ {
+ }
+ else if (STARTS_WITH_3(5, 840)) /* USA - 2.16.840. */
+ {
+ if (STARTS_WITH_1(9, 1)) /* US company arc. */
+ {
+ if (STARTS_WITH_3(11, 101)) /* US Government */
+ {
+ if (STARTS_WITH_1(15, 3)) /* Computer Security Objects Register */
+ {
+ if (STARTS_WITH_1(17, 4)) /* NIST Algorithms - 2.16.840.1.101.3.4. */
+ {
+ if (STARTS_WITH_1(19, 1)) /* AES - 2.16.840.1.101.3.4.1. */
+ {
+ }
+ else if (STARTS_WITH_1(19, 2)) /* Hash algorithms - 2.16.840.1.101.3.4.2. */
+ {
+ if (ENDS_WITH_1(21, 1)) return "nist-Sha256";
+ else if (ENDS_WITH_1(21, 2)) return "nist-Sha384";
+ else if (ENDS_WITH_1(21, 3)) return "nist-Sha512";
+ else if (ENDS_WITH_1(21, 4)) return "nist-Sha224";
+ }
+ }
+ }
+ }
+ else if (STARTS_WITH_6(11, 113730)) /* Netscape - 2.16.840.1.113730. */
+ {
+ if (STARTS_WITH_1(18, 1)) /* Netscape - 2.16.840.1.113730.1. */
+ {
+ if (ENDS_WITH_1(20, 1)) return "netscape-cert-type";
+ else if (ENDS_WITH_1(20, 2)) return "netscape-base-url";
+ else if (ENDS_WITH_1(20, 3)) return "netscape-revocation-url";
+ else if (ENDS_WITH_1(20, 4)) return "netscape-ca-revocation-url";
+ else if (ENDS_WITH_1(20, 7)) return "netscape-cert-renewal-url";
+ else if (ENDS_WITH_1(20, 8)) return "netscape-ca-policy-url";
+ else if (ENDS_WITH_1(20, 9)) return "netscape-HomePage-url";
+ else if (ENDS_WITH_2(20, 10)) return "netscape-EntityLogo";
+ else if (ENDS_WITH_2(20, 11)) return "netscape-UserPicture";
+ else if (ENDS_WITH_2(20, 12)) return "netscape-ssl-server-name";
+ else if (ENDS_WITH_2(20, 13)) return "netscape-comment";
+ }
+ else if (STARTS_WITH_1(18, 4)) /* Netscape - 2.16.840.1.113730.4. */
+ {
+ if (ENDS_WITH_1(20, 1)) return "netscape-eku-serverGatedCrypto";
+ }
+ }
+ else if (STARTS_WITH_6(11, 113733)) /* Verisign, Inc. - 2.16.840.1.113733. */
+ {
+ if (STARTS_WITH_1(18, 1)) /* Verisign PKI Sub Tree - 2.16.840.1.113733.1. */
+ {
+ if (ENDS_WITH_1(20, 6)) return "verisign-pki-extensions-subtree";
+ else if (STARTS_WITH_1(20, 6)) /* 2.16.840.1.113733.1.6. */
+ {
+ if (ENDS_WITH_1(22, 7)) return "verisign-pki-ext-RolloverID";
+ }
+ else if (ENDS_WITH_1(20, 7)) return "verisign-pki-policies";
+ else if (STARTS_WITH_1(20, 7)) /* 2.16.840.1.113733.1.7. */
+ {
+ if (ENDS_WITH_1(22, 9)) return "verisign-pki-policy-9";
+ else if (ENDS_WITH_2(22, 21)) return "verisign-pki-policy-21";
+ else if (ENDS_WITH_2(22, 23)) return "verisign-pki-policy-vtn-cp";
+ else if (STARTS_WITH_2(22, 23))
+ {
+ if (ENDS_WITH_1(25, 1)) return "verisign-pki-policy-vtn-cp-class1";
+ else if (ENDS_WITH_1(25, 2)) return "verisign-pki-policy-vtn-cp-class2";
+ else if (ENDS_WITH_1(25, 3)) return "verisign-pki-policy-vtn-cp-class3";
+ else if (ENDS_WITH_1(25, 4)) return "verisign-pki-policy-vtn-cp-class4";
+ else if (ENDS_WITH_1(25, 6)) return "verisign-pki-policy-vtn-cp-6";
+ }
+ }
+ else if (STARTS_WITH_1(20, 8)) /* 2.16.840.1.113733.1.8. */
+ {
+ if (ENDS_WITH_1(22, 1)) return "verisign-pki-eku-IssStrongCrypto";
+ }
+ else if (ENDS_WITH_2(22, 46)) return "verisign-pki-policy-cis";
+ else if (STARTS_WITH_2(22, 46))
+ {
+ if (ENDS_WITH_1(25, 1)) return "verisign-pki-policy-cis-type1";
+ else if (ENDS_WITH_1(25, 2)) return "verisign-pki-policy-cis-type2";
+ }
+ else if (ENDS_WITH_2(22, 48)) return "verisign-pki-policy-thawte";
+ else if (STARTS_WITH_2(22, 48))
+ {
+ if (ENDS_WITH_1(25, 1)) return "verisign-pki-policy-thawte-cps-1";
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ return NULL;
+}
+
+
+/** @callback_method_impl{FNRTASN1ENUMCALLBACK} */
+static DECLCALLBACK(int) rtAsn1DumpEnumCallback(PRTASN1CORE pAsn1Core, const char *pszName, uint32_t uDepth, void *pvUser)
+{
+ PRTASN1DUMPDATA pData = (PRTASN1DUMPDATA)pvUser;
+ if (!pAsn1Core->fFlags)
+ return VINF_SUCCESS;
+
+ rtAsn1DumpPrintIdent(pData, uDepth);
+
+ const char *pszValuePrefix = "-- value:";
+ const char *pszDefault = "";
+ if (pAsn1Core->fFlags & RTASN1CORE_F_DEFAULT)
+ {
+ pszValuePrefix = "DEFAULT";
+ pszDefault = "DEFAULT ";
+ }
+
+ bool fOpen = false;
+ switch (pAsn1Core->fClass & ASN1_TAGCLASS_MASK)
+ {
+ case ASN1_TAGCLASS_UNIVERSAL:
+ switch (pAsn1Core->fFlags & RTASN1CORE_F_TAG_IMPLICIT ? pAsn1Core->uRealTag : pAsn1Core->uTag)
+ {
+ case ASN1_TAG_BOOLEAN:
+ if (pAsn1Core->fFlags & RTASN1CORE_F_PRIMITE_TAG_STRUCT)
+ rtAsn1DumpPrintf(pData, "%-16s BOOLEAN %s %RTbool\n",
+ pszName, pszValuePrefix, ((PCRTASN1BOOLEAN)pAsn1Core)->fValue);
+ else if (pAsn1Core->cb == 1 && pAsn1Core->uData.pu8)
+ rtAsn1DumpPrintf(pData, "%-16s BOOLEAN %s %u\n",
+ pszName, pszValuePrefix, *pAsn1Core->uData.pu8);
+ else
+ rtAsn1DumpPrintf(pData, "%-16s BOOLEAN -- cb=%u\n", pszName, pAsn1Core->cb);
+ break;
+
+ case ASN1_TAG_INTEGER:
+ if ((pAsn1Core->fFlags & RTASN1CORE_F_PRIMITE_TAG_STRUCT) && pAsn1Core->cb <= 8)
+ rtAsn1DumpPrintf(pData, "%-16s INTEGER %s %llu / %#llx\n", pszName, pszValuePrefix,
+ ((PCRTASN1INTEGER)pAsn1Core)->uValue, ((PCRTASN1INTEGER)pAsn1Core)->uValue);
+ else if (pAsn1Core->cb == 0 || pAsn1Core->cb >= 512 || !pAsn1Core->uData.pu8)
+ rtAsn1DumpPrintf(pData, "%-16s INTEGER -- cb=%u\n", pszName, pAsn1Core->cb);
+ else if (pAsn1Core->cb <= 32)
+ rtAsn1DumpPrintf(pData, "%-16s INTEGER %s %.*Rhxs\n",
+ pszName, pszValuePrefix, (size_t)pAsn1Core->cb, pAsn1Core->uData.pu8);
+ else
+ rtAsn1DumpPrintf(pData, "%-16s INTEGER %s\n%.*Rhxd\n",
+ pszName, pszValuePrefix, (size_t)pAsn1Core->cb, pAsn1Core->uData.pu8);
+ break;
+
+ case ASN1_TAG_BIT_STRING:
+ if ((pAsn1Core->fFlags & RTASN1CORE_F_PRIMITE_TAG_STRUCT))
+ {
+ PCRTASN1BITSTRING pBitString = (PCRTASN1BITSTRING)pAsn1Core;
+ rtAsn1DumpPrintf(pData, "%-16s BIT STRING %s-- cb=%u cBits=%#x cMaxBits=%#x",
+ pszName, pszDefault, pBitString->Asn1Core.cb, pBitString->cBits, pBitString->cMaxBits);
+ if (pBitString->cBits <= 64)
+ rtAsn1DumpPrintf(pData, " value=%#llx\n", RTAsn1BitString_GetAsUInt64(pBitString));
+ else
+ rtAsn1DumpPrintf(pData, "\n");
+ }
+ else
+ rtAsn1DumpPrintf(pData, "%-16s BIT STRING %s-- cb=%u\n", pszName, pszDefault, pAsn1Core->cb);
+ fOpen = pAsn1Core->pOps != NULL;
+ break;
+
+ case ASN1_TAG_OCTET_STRING:
+ rtAsn1DumpPrintf(pData, "%-16s OCTET STRING %s-- cb=%u\n", pszName, pszDefault, pAsn1Core->cb);
+ fOpen = pAsn1Core->pOps != NULL;
+ break;
+
+ case ASN1_TAG_NULL:
+ rtAsn1DumpPrintf(pData, "%-16s NULL\n", pszName);
+ break;
+
+ case ASN1_TAG_OID:
+ if ((pAsn1Core->fFlags & RTASN1CORE_F_PRIMITE_TAG_STRUCT))
+ {
+ const char *pszObjIdName = rtAsn1DumpLookupObjIdName(((PCRTASN1OBJID)pAsn1Core)->szObjId);
+ if (pszObjIdName)
+ rtAsn1DumpPrintf(pData, "%-16s OBJECT IDENTIFIER %s%s ('%s')\n",
+ pszName, pszDefault, pszObjIdName, ((PCRTASN1OBJID)pAsn1Core)->szObjId);
+ else
+ rtAsn1DumpPrintf(pData, "%-16s OBJECT IDENTIFIER %s'%s'\n",
+ pszName, pszDefault, ((PCRTASN1OBJID)pAsn1Core)->szObjId);
+ }
+ else
+ rtAsn1DumpPrintf(pData, "%-16s OBJECT IDENTIFIER %s -- cb=%u\n",
+ pszName, pszDefault, pAsn1Core->cb);
+ break;
+
+ case ASN1_TAG_OBJECT_DESCRIPTOR:
+ rtAsn1DumpPrintf(pData, "%-16s OBJECT DESCRIPTOR -- cb=%u TODO\n", pszName, pAsn1Core->cb);
+ break;
+
+ case ASN1_TAG_EXTERNAL:
+ rtAsn1DumpPrintf(pData, "%-16s EXTERNAL -- cb=%u TODO\n", pszName, pAsn1Core->cb);
+ break;
+
+ case ASN1_TAG_REAL:
+ rtAsn1DumpPrintf(pData, "%-16s REAL -- cb=%u TODO\n", pszName, pAsn1Core->cb);
+ break;
+
+ case ASN1_TAG_ENUMERATED:
+ rtAsn1DumpPrintf(pData, "%-16s ENUMERATED -- cb=%u TODO\n", pszName, pAsn1Core->cb);
+ break;
+
+ case ASN1_TAG_EMBEDDED_PDV:
+ rtAsn1DumpPrintf(pData, "%-16s EMBEDDED PDV -- cb=%u TODO\n", pszName, pAsn1Core->cb);
+ break;
+
+ case ASN1_TAG_UTF8_STRING:
+ rtAsn1DumpString(pData, pAsn1Core, pszName, "UTF8 STRING", uDepth);
+ break;
+
+ case ASN1_TAG_RELATIVE_OID:
+ rtAsn1DumpPrintf(pData, "%-16s RELATIVE OBJECT IDENTIFIER -- cb=%u TODO\n", pszName, pAsn1Core->cb);
+ break;
+
+ case ASN1_TAG_SEQUENCE:
+ rtAsn1DumpPrintf(pData, "%-16s SEQUENCE -- cb=%u\n", pszName, pAsn1Core->cb);
+ fOpen = true;
+ break;
+ case ASN1_TAG_SET:
+ rtAsn1DumpPrintf(pData, "%-16s SET -- cb=%u\n", pszName, pAsn1Core->cb);
+ fOpen = true;
+ break;
+
+ case ASN1_TAG_NUMERIC_STRING:
+ rtAsn1DumpString(pData, pAsn1Core, pszName, "NUMERIC STRING", uDepth);
+ break;
+
+ case ASN1_TAG_PRINTABLE_STRING:
+ rtAsn1DumpString(pData, pAsn1Core, pszName, "PRINTABLE STRING", uDepth);
+ break;
+
+ case ASN1_TAG_T61_STRING:
+ rtAsn1DumpString(pData, pAsn1Core, pszName, "T61 STRING", uDepth);
+ break;
+
+ case ASN1_TAG_VIDEOTEX_STRING:
+ rtAsn1DumpString(pData, pAsn1Core, pszName, "VIDEOTEX STRING", uDepth);
+ break;
+
+ case ASN1_TAG_IA5_STRING:
+ rtAsn1DumpString(pData, pAsn1Core, pszName, "IA5 STRING", uDepth);
+ break;
+
+ case ASN1_TAG_GRAPHIC_STRING:
+ rtAsn1DumpString(pData, pAsn1Core, pszName, "GRAPHIC STRING", uDepth);
+ break;
+
+ case ASN1_TAG_VISIBLE_STRING:
+ rtAsn1DumpString(pData, pAsn1Core, pszName, "VISIBLE STRING", uDepth);
+ break;
+
+ case ASN1_TAG_GENERAL_STRING:
+ rtAsn1DumpString(pData, pAsn1Core, pszName, "GENERAL STRING", uDepth);
+ break;
+
+ case ASN1_TAG_UNIVERSAL_STRING:
+ rtAsn1DumpString(pData, pAsn1Core, pszName, "UNIVERSAL STRING", uDepth);
+ break;
+
+ case ASN1_TAG_BMP_STRING:
+ rtAsn1DumpString(pData, pAsn1Core, pszName, "BMP STRING", uDepth);
+ break;
+
+ case ASN1_TAG_UTC_TIME:
+ rtAsn1DumpTime(pData, pAsn1Core, pszName, "UTC TIME");
+ break;
+
+ case ASN1_TAG_GENERALIZED_TIME:
+ rtAsn1DumpTime(pData, pAsn1Core, pszName, "GENERALIZED TIME");
+ break;
+
+ case ASN1_TAG_CHARACTER_STRING:
+ rtAsn1DumpPrintf(pData, "%-16s CHARACTER STRING -- cb=%u TODO\n", pszName, pAsn1Core->cb);
+ break;
+
+ default:
+ rtAsn1DumpPrintf(pData, "[UNIVERSAL %u]\n", pAsn1Core->uTag);
+ break;
+ }
+ break;
+ case ASN1_TAGCLASS_CONTEXT:
+ rtAsn1DumpPrintf(pData, "%-16s [%u]\n", pszName, pAsn1Core->uTag);
+ fOpen = true;
+ break;
+ case ASN1_TAGCLASS_APPLICATION:
+ rtAsn1DumpPrintf(pData, "%-16s [APPLICATION %u]\n", pszName, pAsn1Core->uTag);
+ fOpen = true;
+ break;
+ case ASN1_TAGCLASS_PRIVATE:
+ rtAsn1DumpPrintf(pData, "%-16s [PRIVATE %u]\n", pszName, pAsn1Core->uTag);
+ fOpen = true;
+ break;
+ }
+ /** @todo {} */
+
+ /*
+ * Recurse.
+ */
+ if ( pAsn1Core->pOps
+ && pAsn1Core->pOps->pfnEnum)
+ pAsn1Core->pOps->pfnEnum(pAsn1Core, rtAsn1DumpEnumCallback, uDepth, pData);
+ return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTAsn1Dump(PCRTASN1CORE pAsn1Core, uint32_t fFlags, uint32_t uLevel, PFNRTDUMPPRINTFV pfnPrintfV, void *pvUser)
+{
+ if ( pAsn1Core->pOps
+ && pAsn1Core->pOps->pfnEnum)
+ {
+ RTASN1DUMPDATA Data;
+ Data.fFlags = fFlags;
+ Data.pfnPrintfV = pfnPrintfV;
+ Data.pvUser = pvUser;
+
+ return pAsn1Core->pOps->pfnEnum((PRTASN1CORE)pAsn1Core, rtAsn1DumpEnumCallback, uLevel, &Data);
+ }
+ return VINF_SUCCESS;
+}
+
diff --git a/src/VBox/Runtime/common/asn1/asn1-encode.cpp b/src/VBox/Runtime/common/asn1/asn1-encode.cpp
new file mode 100644
index 00000000000..6e22c221e2c
--- /dev/null
+++ b/src/VBox/Runtime/common/asn1/asn1-encode.cpp
@@ -0,0 +1,426 @@
+/* $Id$ */
+/** @file
+ * IPRT - ASN.1, Encoding.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/asn1.h>
+
+#include <iprt/assert.h>
+#include <iprt/bignum.h>
+#include <iprt/ctype.h>
+#include <iprt/err.h>
+
+#include <iprt/formats/asn1.h>
+
+
+/*******************************************************************************
+* Structures and Typedefs *
+*******************************************************************************/
+/**
+ * Argument package for rtAsn1EncodePrepareCallback passed by RTAsn1EncodePrepare.
+ */
+typedef struct RTASN1ENCODEPREPARGS
+{
+ /** The size at this level. */
+ uint32_t cb;
+ /** RTASN1ENCODE_F_XXX. */
+ uint32_t fFlags;
+ /** Pointer to the error info. (optional) */
+ PRTERRINFO pErrInfo;
+} RTASN1ENCODEPREPARGS;
+
+
+/**
+ * Argument package for rtAsn1EncodeWriteCallback passed by RTAsn1EncodeWrite.
+ */
+typedef struct RTASN1ENCODEWRITEARGS
+{
+ /** RTASN1ENCODE_F_XXX. */
+ uint32_t fFlags;
+ /** Pointer to the writer funtion. */
+ PFNRTASN1ENCODEWRITER pfnWriter;
+ /** User argument to the writer function. */
+ void *pvUser;
+ /** Pointer to the error info. (optional) */
+ PRTERRINFO pErrInfo;
+} RTASN1ENCODEWRITEARGS;
+
+
+RTDECL(int) RTAsn1EncodeRecalcHdrSize(PRTASN1CORE pAsn1Core, uint32_t fFlags, PRTERRINFO pErrInfo)
+{
+ AssertReturn((fFlags & RTASN1ENCODE_F_RULE_MASK) == RTASN1ENCODE_F_DER, VERR_INVALID_FLAGS);
+ int rc = VINF_SUCCESS;
+
+ uint8_t cbHdr;
+ if ((pAsn1Core->fFlags & (RTASN1CORE_F_PRESENT | RTASN1CORE_F_DUMMY | RTASN1CORE_F_DEFAULT)) == RTASN1CORE_F_PRESENT)
+ {
+ /*
+ * The minimum header size is two bytes.
+ */
+ cbHdr = 2;
+
+ /*
+ * Add additional bytes for encoding the tag.
+ */
+ uint32_t uTag = pAsn1Core->uTag;
+ if (uTag >= ASN1_TAG_USE_LONG_FORM)
+ {
+ AssertReturn(pAsn1Core->uTag != UINT32_MAX, RTErrInfoSet(pErrInfo, VERR_ASN1_DUMMY_OBJECT, "uTag=UINT32_MAX"));
+ do
+ {
+ cbHdr++;
+ uTag >>= 7;
+ } while (uTag > 0);
+ }
+
+ /*
+ * Add additional bytes for encoding the content length.
+ */
+ uint32_t cb = pAsn1Core->cb;
+ if (cb >= 0x80)
+ {
+ AssertReturn(cb < _1G, RTErrInfoSetF(pErrInfo, VERR_ASN1_TOO_LONG, "cb=%u (%#x)", cb, cb));
+
+ if (cb <= UINT32_C(0xffff))
+ {
+ if (cb <= UINT32_C(0xff))
+ cbHdr += 1;
+ else
+ cbHdr += 2;
+ }
+ else
+ {
+ if (cb <= UINT32_C(0xffffff))
+ cbHdr += 3;
+ else
+ cbHdr += 4;
+ }
+ }
+ }
+ /*
+ * Not present, dummy or otherwise not encoded.
+ */
+ else
+ {
+ cbHdr = 0;
+ if (pAsn1Core->fFlags & RTASN1CORE_F_DEFAULT)
+ rc = VINF_ASN1_NOT_ENCODED;
+ else
+ {
+ Assert(RTASN1CORE_IS_DUMMY(pAsn1Core));
+ Assert(pAsn1Core->pOps && pAsn1Core->pOps->pfnEnum);
+ rc = VINF_SUCCESS;
+ }
+ }
+
+ /*
+ * Update the header length.
+ */
+ pAsn1Core->cbHdr = cbHdr;
+ return rc;
+}
+
+
+/**
+ * @callback_method_impl{FNRTASN1ENUMCALLBACK}
+ */
+static DECLCALLBACK(int) rtAsn1EncodePrepareCallback(PRTASN1CORE pAsn1Core, const char *pszName, uint32_t uDepth, void *pvUser)
+{
+ RTASN1ENCODEPREPARGS *pArgs = (RTASN1ENCODEPREPARGS *)pvUser;
+ if (RTASN1CORE_IS_PRESENT(pAsn1Core))
+ {
+ /*
+ * Depth first, where relevant.
+ */
+ uint32_t const cbSaved = pArgs->cb;
+ if (pAsn1Core->pOps)
+ {
+ /*
+ * Use the encoding preparation method when available.
+ */
+ int rc;
+ if (pAsn1Core->pOps->pfnEncodePrep)
+ rc = pAsn1Core->pOps->pfnEncodePrep(pAsn1Core, pArgs->fFlags, pArgs->pErrInfo);
+ else if (pAsn1Core->pOps->pfnEnum)
+ {
+ /*
+ * Recurse to prepare the child objects (if any).
+ */
+ rc = pAsn1Core->pOps->pfnEnum(pAsn1Core, rtAsn1EncodePrepareCallback, uDepth + 1, pArgs);
+ if (RT_SUCCESS(rc))
+ pAsn1Core->cb = pArgs->cb - cbSaved;
+ }
+ else
+ {
+ /*
+ * Must be a primitive type if DER.
+ */
+ if ( (pAsn1Core->fClass & ASN1_TAGFLAG_CONSTRUCTED)
+ && (pArgs->fFlags & RTASN1ENCODE_F_DER) )
+ return RTErrInfoSetF(pArgs->pErrInfo, VERR_ASN1_EXPECTED_PRIMITIVE,
+ "Expected primitive ASN.1 object: uTag=%#x fClass=%#x cb=%u",
+ RTASN1CORE_GET_TAG(pAsn1Core), pAsn1Core->fClass, pAsn1Core->cb);
+ rc = VINF_SUCCESS;
+ }
+ if (RT_SUCCESS(rc))
+ rc = RTAsn1EncodeRecalcHdrSize(pAsn1Core, pArgs->fFlags, pArgs->pErrInfo);
+ if (RT_FAILURE(rc))
+ return rc;
+ }
+ else
+ {
+ AssertFailed();
+ pAsn1Core->cb = 0;
+ pAsn1Core->cbHdr = 0;
+ }
+
+ /*
+ * Recalculate the output size, thus far. Dummy objects propagates the
+ * content size, but the header size is zero. Other objects with
+ * header size zero are not encoded and should be omitted entirely.
+ */
+ if (pAsn1Core->cbHdr > 0 || RTASN1CORE_IS_DUMMY(pAsn1Core))
+ pArgs->cb = RTASN1CORE_GET_RAW_ASN1_SIZE(pAsn1Core) + cbSaved;
+ else
+ pArgs->cb = cbSaved;
+ }
+
+ return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTAsn1EncodePrepare(PRTASN1CORE pRoot, uint32_t fFlags, uint32_t *pcbEncoded, PRTERRINFO pErrInfo)
+{
+ AssertReturn((fFlags & RTASN1ENCODE_F_RULE_MASK) == RTASN1ENCODE_F_DER, VERR_INVALID_FLAGS);
+
+ /*
+ * This is implemented as a recursive enumeration of the ASN.1 object structure.
+ */
+ RTASN1ENCODEPREPARGS Args;
+ Args.cb = 0;
+ Args.fFlags = fFlags;
+ Args.pErrInfo = pErrInfo;
+ int rc = rtAsn1EncodePrepareCallback(pRoot, "root", 0, &Args);
+ if (pcbEncoded)
+ *pcbEncoded = RTASN1CORE_GET_RAW_ASN1_SIZE(pRoot);
+ return rc;
+}
+
+
+RTDECL(int) RTAsnEncodeWriteHeader(PCRTASN1CORE pAsn1Core, uint32_t fFlags, FNRTASN1ENCODEWRITER pfnWriter, void *pvUser,
+ PRTERRINFO pErrInfo)
+{
+ AssertReturn((fFlags & RTASN1ENCODE_F_RULE_MASK) == RTASN1ENCODE_F_DER, VERR_INVALID_FLAGS);
+
+ if ((pAsn1Core->fFlags & (RTASN1CORE_F_PRESENT | RTASN1CORE_F_DUMMY | RTASN1CORE_F_DEFAULT)) == RTASN1CORE_F_PRESENT)
+ {
+ uint8_t abHdr[16]; /* 2 + max 5 tag + max 4 length = 11 */
+ uint8_t *pbDst = &abHdr[0];
+
+ /*
+ * Encode the tag.
+ */
+ uint32_t uTag = pAsn1Core->uTag;
+ if (uTag < ASN1_TAG_USE_LONG_FORM)
+ *pbDst++ = (uint8_t)uTag | (pAsn1Core->fClass & ~ASN1_TAG_MASK);
+ else
+ {
+ AssertReturn(pAsn1Core->uTag != UINT32_MAX, RTErrInfoSet(pErrInfo, VERR_ASN1_DUMMY_OBJECT, "uTag=UINT32_MAX"));
+
+ /* In the long form, the tag is encoded MSB style with the 8th bit
+ of each byte indicating the whether there are more byte. */
+ *pbDst++ = ASN1_TAG_USE_LONG_FORM | (pAsn1Core->fClass & ~ASN1_TAG_MASK);
+ if (uTag <= UINT32_C(0x7f))
+ *pbDst++ = uTag;
+ else if (uTag <= UINT32_C(0x3fff)) /* 2**(7*2) = 0x4000 (16384) */
+ {
+ *pbDst++ = (uTag >> 7) | 0x80;
+ *pbDst++ = uTag & 0x7f;
+ }
+ else if (uTag <= UINT32_C(0x1fffff)) /* 2**(7*3) = 0x200000 (2097152) */
+ {
+ *pbDst++ = (uTag >> 14) | 0x80;
+ *pbDst++ = ((uTag >> 7) & 0x7f) | 0x80;
+ *pbDst++ = uTag & 0x7f;
+ }
+ else if (uTag <= UINT32_C(0xfffffff)) /* 2**(7*4) = 0x10000000 (268435456) */
+ {
+ *pbDst++ = (uTag >> 21) | 0x80;
+ *pbDst++ = ((uTag >> 14) & 0x7f) | 0x80;
+ *pbDst++ = ((uTag >> 7) & 0x7f) | 0x80;
+ *pbDst++ = uTag & 0x7f;
+ }
+ else
+ {
+ *pbDst++ = (uTag >> 28) | 0x80;
+ *pbDst++ = ((uTag >> 21) & 0x7f) | 0x80;
+ *pbDst++ = ((uTag >> 14) & 0x7f) | 0x80;
+ *pbDst++ = ((uTag >> 7) & 0x7f) | 0x80;
+ *pbDst++ = uTag & 0x7f;
+ }
+ }
+
+ /*
+ * Encode the length.
+ */
+ uint32_t cb = pAsn1Core->cb;
+ if (cb < 0x80)
+ *pbDst++ = (uint8_t)cb;
+ else
+ {
+ AssertReturn(cb < _1G, RTErrInfoSetF(pErrInfo, VERR_ASN1_TOO_LONG, "cb=%u (%#x)", cb, cb));
+
+ if (cb <= UINT32_C(0xffff))
+ {
+ if (cb <= UINT32_C(0xff))
+ {
+ pbDst[0] = 0x81;
+ pbDst[1] = (uint8_t)cb;
+ pbDst += 2;
+ }
+ else
+ {
+ pbDst[0] = 0x82;
+ pbDst[1] = cb >> 8;
+ pbDst[2] = (uint8_t)cb;
+ pbDst += 3;
+ }
+ }
+ else
+ {
+ if (cb <= UINT32_C(0xffffff))
+ {
+ pbDst[0] = 0x83;
+ pbDst[1] = (uint8_t)(cb >> 16);
+ pbDst[2] = (uint8_t)(cb >> 8);
+ pbDst[3] = (uint8_t)cb;
+ pbDst += 4;
+ }
+ else
+ {
+ pbDst[0] = 0x84;
+ pbDst[1] = (uint8_t)(cb >> 24);
+ pbDst[2] = (uint8_t)(cb >> 16);
+ pbDst[3] = (uint8_t)(cb >> 8);
+ pbDst[4] = (uint8_t)cb;
+ pbDst += 5;
+ }
+ }
+ }
+
+ size_t const cbHdr = pbDst - &abHdr[0];
+ Assert(sizeof(abHdr) >= cbHdr);
+ Assert(pAsn1Core->cbHdr == cbHdr);
+
+ /*
+ * Write it.
+ */
+ return pfnWriter(abHdr, cbHdr, pvUser, pErrInfo);
+ }
+
+ /*
+ * Not present, dummy or otherwise not encoded.
+ */
+ Assert(pAsn1Core->cbHdr == 0);
+ if (pAsn1Core->fFlags & RTASN1CORE_F_DEFAULT)
+ return VINF_ASN1_NOT_ENCODED;
+ Assert(RTASN1CORE_IS_DUMMY(pAsn1Core));
+ Assert(pAsn1Core->pOps && pAsn1Core->pOps->pfnEnum);
+ return VINF_SUCCESS;
+}
+
+
+/**
+ * @callback_method_impl{FNRTASN1ENUMCALLBACK}
+ */
+static DECLCALLBACK(int) rtAsn1EncodeWriteCallback(PRTASN1CORE pAsn1Core, const char *pszName, uint32_t uDepth, void *pvUser)
+{
+ RTASN1ENCODEWRITEARGS *pArgs = (RTASN1ENCODEWRITEARGS *)pvUser;
+ int rc;
+ if (RTASN1CORE_IS_PRESENT(pAsn1Core))
+ {
+ /*
+ * If there is an write method, use it.
+ */
+ if ( pAsn1Core->pOps
+ && pAsn1Core->pOps->pfnEncodeWrite)
+ rc = pAsn1Core->pOps->pfnEncodeWrite(pAsn1Core, pArgs->fFlags, pArgs->pfnWriter, pArgs->pvUser, pArgs->pErrInfo);
+ else
+ {
+ /*
+ * Generic path. Start by writing the header for this object.
+ */
+ rc = RTAsnEncodeWriteHeader(pAsn1Core, pArgs->fFlags, pArgs->pfnWriter, pArgs->pvUser, pArgs->pErrInfo);
+ if (RT_SUCCESS(rc))
+ {
+ /*
+ * If there is an enum function, call it to assemble the content.
+ * Otherwise ASSUME the pointer in the header points to the content.
+ */
+ if ( pAsn1Core->pOps
+ && pAsn1Core->pOps->pfnEnum)
+ {
+ if (rc != VINF_ASN1_NOT_ENCODED)
+ rc = pAsn1Core->pOps->pfnEnum(pAsn1Core, rtAsn1EncodeWriteCallback, uDepth + 1, pArgs);
+ }
+ else if (pAsn1Core->cb && rc != VINF_ASN1_NOT_ENCODED)
+ {
+ Assert(!RTASN1CORE_IS_DUMMY(pAsn1Core));
+ AssertPtrReturn(pAsn1Core->uData.pv,
+ RTErrInfoSetF(pArgs->pErrInfo, VERR_ASN1_INVALID_DATA_POINTER,
+ "Invalid uData pointer %p for no pfnEnum object with %#x bytes of content",
+ pAsn1Core->uData.pv, pAsn1Core->cb));
+ rc = pArgs->pfnWriter(pAsn1Core->uData.pv, pAsn1Core->cb, pArgs->pvUser, pArgs->pErrInfo);
+ }
+ }
+ }
+ if (RT_SUCCESS(rc))
+ rc = VINF_SUCCESS;
+ }
+ else
+ rc = VINF_SUCCESS;
+ return rc;
+}
+
+
+RTDECL(int) RTAsn1EncodeWrite(PCRTASN1CORE pRoot, uint32_t fFlags, FNRTASN1ENCODEWRITER pfnWriter, void *pvUser,
+ PRTERRINFO pErrInfo)
+{
+ AssertReturn((fFlags & RTASN1ENCODE_F_RULE_MASK) == RTASN1ENCODE_F_DER, VERR_INVALID_FLAGS);
+
+ /*
+ * This is implemented as a recursive enumeration of the ASN.1 object structure.
+ */
+ RTASN1ENCODEWRITEARGS Args;
+ Args.fFlags = fFlags;
+ Args.pfnWriter = pfnWriter;
+ Args.pvUser = pvUser;
+ Args.pErrInfo = pErrInfo;
+ return rtAsn1EncodeWriteCallback((PRTASN1CORE)pRoot, "root", 0, &Args);
+}
+
diff --git a/src/VBox/Runtime/common/asn1/asn1-ut-bitstring-decode.cpp b/src/VBox/Runtime/common/asn1/asn1-ut-bitstring-decode.cpp
new file mode 100644
index 00000000000..d6dd3b66699
--- /dev/null
+++ b/src/VBox/Runtime/common/asn1/asn1-ut-bitstring-decode.cpp
@@ -0,0 +1,130 @@
+/* $Id$ */
+/** @file
+ * IPRT - ASN.1, BIT STRING Type, Decoding.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/asn1.h>
+
+#include <iprt/err.h>
+#include <iprt/string.h>
+
+#include <iprt/formats/asn1.h>
+
+
+
+RTDECL(int) RTAsn1BitString_DecodeAsn1Ex(PRTASN1CURSOR pCursor, uint32_t fFlags, uint32_t cMaxBits, PRTASN1BITSTRING pThis,
+ const char *pszErrorTag)
+{
+ pThis->cBits = 0;
+ pThis->cMaxBits = cMaxBits;
+ pThis->uBits.pv = NULL;
+ pThis->pEncapsulated = NULL;
+ RTAsn1CursorInitAllocation(pCursor, &pThis->EncapsulatedAllocation);
+
+ int rc = RTAsn1CursorReadHdr(pCursor, &pThis->Asn1Core, pszErrorTag);
+ if (RT_SUCCESS(rc))
+ {
+ rc = RTAsn1CursorMatchTagClassFlagsString(pCursor, &pThis->Asn1Core, ASN1_TAG_BIT_STRING,
+ ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_PRIMITIVE,
+ fFlags, pszErrorTag, "BIT STRING");
+ if (RT_SUCCESS(rc))
+ {
+ if (!(pThis->Asn1Core.fClass & ASN1_TAGFLAG_CONSTRUCTED))
+ {
+ if ( ( cMaxBits == UINT32_MAX
+ || RT_ALIGN(cMaxBits, 8) / 8 + 1 >= pThis->Asn1Core.cb)
+ && pThis->Asn1Core.cb > 0)
+ {
+ uint8_t cUnusedBits = pThis->Asn1Core.cb > 0 ? *pThis->Asn1Core.uData.pu8 : 0;
+ if (pThis->Asn1Core.cb < 2)
+ {
+ /* Not bits present. */
+ if (cUnusedBits == 0)
+ {
+ pThis->cBits = 0;
+ pThis->uBits.pv = NULL;
+ RTAsn1CursorSkip(pCursor, pThis->Asn1Core.cb);
+ pThis->Asn1Core.pOps = &g_RTAsn1BitString_Vtable;
+ pThis->Asn1Core.fFlags |= RTASN1CORE_F_PRIMITE_TAG_STRUCT;
+ return VINF_SUCCESS;
+ }
+ rc = RTAsn1CursorSetInfo(pCursor, VERR_ASN1_INVALID_BITSTRING_ENCODING,
+ "%s: Bad unused bit count: %#x (cb=%#x)",
+ pszErrorTag, cUnusedBits, pThis->Asn1Core.cb);
+ }
+ else if (cUnusedBits < 8)
+ {
+ pThis->cBits = (pThis->Asn1Core.cb - 1) * 8;
+ pThis->cBits -= cUnusedBits;
+ pThis->uBits.pu8 = pThis->Asn1Core.uData.pu8 + 1;
+ if ( !(pCursor->fFlags & (RTASN1CURSOR_FLAGS_DER | RTASN1CURSOR_FLAGS_CER))
+ || cUnusedBits == 0
+ || !( pThis->uBits.pu8[pThis->Asn1Core.cb - 2] & (((uint8_t)1 << cUnusedBits) - (uint8_t)1) ) )
+ {
+ RTAsn1CursorSkip(pCursor, pThis->Asn1Core.cb);
+ pThis->Asn1Core.pOps = &g_RTAsn1BitString_Vtable;
+ pThis->Asn1Core.fFlags |= RTASN1CORE_F_PRIMITE_TAG_STRUCT;
+ return VINF_SUCCESS;
+ }
+ rc = RTAsn1CursorSetInfo(pCursor, VERR_ASN1_INVALID_BITSTRING_ENCODING,
+ "%s: Unused bits shall be zero in DER/CER mode: last byte=%#x cUnused=%#x",
+ pszErrorTag, pThis->uBits.pu8[pThis->cBits / 8], cUnusedBits);
+ }
+ else
+ rc = RTAsn1CursorSetInfo(pCursor, VERR_ASN1_INVALID_BITSTRING_ENCODING,
+ "%s: Bad unused bit count: %#x (cb=%#x)",
+ pszErrorTag, cUnusedBits, pThis->Asn1Core.cb);
+ }
+ else
+ rc = RTAsn1CursorSetInfo(pCursor, VERR_ASN1_INVALID_BITSTRING_ENCODING,
+ "%s: Size mismatch: cb=%#x, expected %#x (cMaxBits=%#x)",
+ pszErrorTag, pThis->Asn1Core.cb, RT_ALIGN(cMaxBits, 8) / 8 + 1, cMaxBits);
+ }
+ else
+ rc = RTAsn1CursorSetInfo(pCursor, VERR_ASN1_CONSTRUCTED_STRING_NOT_IMPL,
+ "%s: Constructed BIT STRING not implemented.", pszErrorTag);
+ }
+ }
+ RT_ZERO(*pThis);
+ return rc;
+}
+
+
+RTDECL(int) RTAsn1BitString_DecodeAsn1(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1BITSTRING pThis, const char *pszErrorTag)
+{
+ return RTAsn1BitString_DecodeAsn1Ex(pCursor, fFlags, UINT32_MAX, pThis, pszErrorTag);
+}
+
+
+/*
+ * Generate code for the associated collection types.
+ */
+#define RTASN1TMPL_TEMPLATE_FILE "../common/asn1/asn1-ut-bitstring-template.h"
+#include <iprt/asn1-generator-internal-header.h>
+#include <iprt/asn1-generator-asn1-decoder.h>
+
diff --git a/src/VBox/Runtime/common/asn1/asn1-ut-bitstring-template.h b/src/VBox/Runtime/common/asn1/asn1-ut-bitstring-template.h
new file mode 100644
index 00000000000..a30a37276a0
--- /dev/null
+++ b/src/VBox/Runtime/common/asn1/asn1-ut-bitstring-template.h
@@ -0,0 +1,45 @@
+/* $Id$ */
+/** @file
+ * IPRT - ASN.1, Bit String Type, Collection Type Template.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+#define RTASN1TMPL_DECL RTDECL
+
+#define RTASN1TMPL_TYPE RTASN1SEQOFBITSTRINGS
+#define RTASN1TMPL_EXT_NAME RTAsn1SeqOfBitStrings
+#define RTASN1TMPL_INT_NAME rtAsn1SeqOfBitStrings
+RTASN1TMPL_SEQ_OF(RTASN1BITSTRING, RTAsn1BitString);
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+#define RTASN1TMPL_TYPE RTASN1SETOFBITSTRINGS
+#define RTASN1TMPL_EXT_NAME RTAsn1SetOfBitStrings
+#define RTASN1TMPL_INT_NAME rtAsn1SetOfBitStrings
+RTASN1TMPL_SET_OF(RTASN1BITSTRING, RTAsn1BitString);
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
diff --git a/src/VBox/Runtime/common/asn1/asn1-ut-bitstring.cpp b/src/VBox/Runtime/common/asn1/asn1-ut-bitstring.cpp
new file mode 100644
index 00000000000..ad020927a69
--- /dev/null
+++ b/src/VBox/Runtime/common/asn1/asn1-ut-bitstring.cpp
@@ -0,0 +1,516 @@
+/* $Id$ */
+/** @file
+ * IPRT - ASN.1, Bit String Type.
+ *
+ * @remarks This file should remain very similar to asn1-ut-octetstring.cpp.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/asn1.h>
+
+#include <iprt/alloca.h>
+#include <iprt/bignum.h>
+#include <iprt/ctype.h>
+#include <iprt/err.h>
+#include <iprt/string.h>
+#include <iprt/uni.h>
+
+#include <iprt/formats/asn1.h>
+
+
+/*******************************************************************************
+* Structures and Typedefs *
+*******************************************************************************/
+typedef struct RTASN1BITSTRINGWRITERCTX
+{
+ /** Pointer to the output buffer. */
+ uint8_t *pbBuf;
+ /** The current buffer offset. */
+ uint32_t offBuf;
+ /** The size of the buffer. */
+ uint32_t cbBuf;
+} RTASN1BITSTRINGWRITERCTX;
+
+
+/** @callback_method_impl{FNRTASN1ENCODEWRITER,
+ * Used to refresh the content of octet and bit strings. } */
+static DECLCALLBACK(int) rtAsn1BitStringEncodeWriter(const void *pvBuf, size_t cbToWrite, void *pvUser, PRTERRINFO pErrInfo)
+{
+ RTASN1BITSTRINGWRITERCTX *pCtx = (RTASN1BITSTRINGWRITERCTX *)pvUser;
+ AssertReturn(cbToWrite <= pCtx->cbBuf - pCtx->offBuf,
+ RTErrInfoSetF(pErrInfo, VERR_BUFFER_OVERFLOW,
+ "cbToWrite=%#x offBuf=%#x cbBuf=%#x", cbToWrite, pCtx->cbBuf, pCtx->offBuf));
+ memcpy(&pCtx->pbBuf[pCtx->offBuf], pvBuf, cbToWrite);
+ pCtx->offBuf += (uint32_t)cbToWrite;
+ return VINF_SUCCESS;
+}
+
+
+/** @callback_method_impl{FNRTASN1ENCODEWRITER,
+ * Used to compare the encoded raw content of an octet or bit string with the
+ * encapsulated object. } */
+static DECLCALLBACK(int) rtAsn1BitStringEncodeCompare(const void *pvBuf, size_t cbToWrite, void *pvUser, PRTERRINFO pErrInfo)
+{
+ RTASN1BITSTRINGWRITERCTX *pCtx = (RTASN1BITSTRINGWRITERCTX *)pvUser;
+ AssertReturn(cbToWrite <= pCtx->cbBuf - pCtx->offBuf, VERR_BUFFER_OVERFLOW);
+ if (!memcmp(&pCtx->pbBuf[pCtx->offBuf], pvBuf, cbToWrite) != 0)
+ return VERR_NOT_EQUAL;
+ pCtx->offBuf += (uint32_t)cbToWrite;
+ return VINF_SUCCESS;
+}
+
+
+
+/*
+ * ASN.1 BIT STRING - Special Methods.
+ */
+
+RTDECL(uint64_t) RTAsn1BitString_GetAsUInt64(PCRTASN1BITSTRING pThis)
+{
+ /*
+ * Extract the first 64 bits in host order.
+ */
+ uint8_t const *pb = pThis->uBits.pu8;
+ uint64_t uRet = 0;
+ uint32_t cShift = 0;
+ uint32_t cBits = RT_MIN(pThis->cBits, 64);
+ while (cBits > 0)
+ {
+ uint8_t b = *pb++;
+#if 1 /* We don't have a bit-order constant... */
+ b = ((b & 0x01) << 7)
+ | ((b & 0x02) << 5)
+ | ((b & 0x04) << 3)
+ | ((b & 0x08) << 1)
+ | ((b & 0x10) >> 1)
+ | ((b & 0x20) >> 3)
+ | ((b & 0x40) >> 5)
+ | ((b & 0x80) >> 7);
+#endif
+ if (cBits < 8)
+ {
+ b &= RT_BIT_32(cBits) - 1;
+ uRet |= (uint64_t)b << cShift;
+ break;
+ }
+ uRet |= (uint64_t)b << cShift;
+ cShift += 8;
+ cBits -= 8;
+ }
+
+ return uRet;
+}
+
+
+RTDECL(int) RTAsn1BitString_RefreshContent(PRTASN1BITSTRING pThis, uint32_t fFlags,
+ PCRTASN1ALLOCATORVTABLE pAllocator, PRTERRINFO pErrInfo)
+{
+ AssertReturn(pThis->pEncapsulated, VERR_INVALID_STATE);
+
+ uint32_t cbEncoded;
+ int rc = RTAsn1EncodePrepare(pThis->pEncapsulated, fFlags, &cbEncoded, pErrInfo);
+ if (RT_SUCCESS(rc))
+ {
+ pThis->Asn1Core.cb = 1 + cbEncoded;
+ pThis->cBits = cbEncoded * 8;
+ AssertReturn(pThis->cBits / 8 == cbEncoded, RTErrInfoSetF(pErrInfo, VERR_TOO_MUCH_DATA, "cbEncoded=%#x", cbEncoded));
+
+ rc = RTAsn1ContentReallocZ(&pThis->Asn1Core, cbEncoded + 1, pAllocator);
+ if (RT_SUCCESS(rc))
+ {
+ pThis->uBits.pu8 = pThis->Asn1Core.uData.pu8 + 1;
+
+ /* Initialize the writer context and write the first byte concerning unused bits. */
+ RTASN1BITSTRINGWRITERCTX Ctx;
+ Ctx.pbBuf = (uint8_t *)pThis->Asn1Core.uData.pu8;
+ Ctx.cbBuf = cbEncoded + 1;
+ Ctx.offBuf = 1;
+ *Ctx.pbBuf = 0;
+
+ rc = RTAsn1EncodeWrite(pThis->pEncapsulated, fFlags, rtAsn1BitStringEncodeWriter, &Ctx, pErrInfo);
+ if (RT_SUCCESS(rc))
+ {
+ if (Ctx.offBuf == cbEncoded + 1)
+ return VINF_SUCCESS;
+
+ rc = RTErrInfoSetF(pErrInfo, rc, "Expected %#x + 1 bytes, got %#x", cbEncoded, Ctx.offBuf);
+ }
+ }
+ else
+ rc = RTErrInfoSetF(pErrInfo, rc, "Error allocating %#x + 1 bytes for storing content\n", cbEncoded);
+ }
+ return rc;
+}
+
+
+RTDECL(bool) RTAsn1BitString_AreContentBitsValid(PCRTASN1BITSTRING pThis, uint32_t fFlags)
+{
+ if (pThis->pEncapsulated)
+ {
+ if (pThis->cBits & 7)
+ return false;
+
+ /* Check the encoded length of the bits. */
+ uint32_t cbEncoded;
+ int rc = RTAsn1EncodePrepare(pThis->pEncapsulated, fFlags, &cbEncoded, NULL);
+ if (RT_FAILURE(rc))
+ return false;
+ if (pThis->Asn1Core.cb != 1 + cbEncoded)
+ return false;
+
+ /* Check the encoded bits, if there are any. */
+ if (cbEncoded)
+ {
+ if (!pThis->Asn1Core.uData.pv)
+ return false;
+
+ /* Check the first byte, the unused bit count. */
+ if (*pThis->Asn1Core.uData.pu8 != 0)
+ return false;
+
+ /* Check the other bytes. */
+ RTASN1BITSTRINGWRITERCTX Ctx;
+ Ctx.pbBuf = (uint8_t *)pThis->Asn1Core.uData.pu8;
+ Ctx.cbBuf = cbEncoded + 1;
+ Ctx.offBuf = 1;
+ rc = RTAsn1EncodeWrite(pThis->pEncapsulated, fFlags, rtAsn1BitStringEncodeCompare, &Ctx, NULL);
+ if (RT_FAILURE(rc))
+ return false;
+ }
+ }
+ return true;
+}
+
+
+
+
+/*
+ * ASN.1 BIT STRING - Standard Methods.
+ */
+
+/** @interface_method_impl{FNRTASN1COREVTENCODEPREP} */
+static DECLCALLBACK(int) RTAsn1BitString_EncodePrep(PRTASN1CORE pThisCore, uint32_t fFlags, PRTERRINFO pErrInfo)
+{
+ PRTASN1BITSTRING pThis = (PRTASN1BITSTRING)pThisCore;
+ if (!pThis->pEncapsulated)
+ {
+ Assert(pThis->cBits == 0 || pThis->Asn1Core.uData.pv);
+ return VINF_SUCCESS;
+ }
+
+ /* Figure out the size of the encapsulated content. */
+ uint32_t cbEncoded;
+ int rc = RTAsn1EncodePrepare(pThis->pEncapsulated, fFlags, &cbEncoded, pErrInfo);
+ if (RT_SUCCESS(rc))
+ {
+ /* Free the bytes if they don't match up. */
+ if (pThis->Asn1Core.uData.pv)
+ {
+ bool fMustFree = pThis->Asn1Core.cb != 1 + cbEncoded || (pThis->cBits & 7);
+ if (!fMustFree)
+ {
+ RTASN1BITSTRINGWRITERCTX Ctx;
+ Ctx.pbBuf = (uint8_t *)pThis->Asn1Core.uData.pu8;
+ Ctx.cbBuf = 1 + cbEncoded;
+ Ctx.offBuf = 1;
+ fMustFree = *Ctx.pbBuf != 0;
+ if (!fMustFree)
+ {
+ rc = RTAsn1EncodeWrite(pThis->pEncapsulated, fFlags, rtAsn1BitStringEncodeCompare, &Ctx, NULL);
+ fMustFree = RT_FAILURE_NP(rc);
+ }
+ }
+ if (fMustFree)
+ {
+ pThis->uBits.pv = NULL;
+ RTAsn1ContentFree(&pThis->Asn1Core);
+ }
+ }
+ pThis->Asn1Core.cb = 1 + cbEncoded;
+ pThis->cBits = cbEncoded * 8;
+
+ rc = RTAsn1EncodeRecalcHdrSize(&pThis->Asn1Core, fFlags, pErrInfo);
+ }
+ return rc;
+}
+
+
+/** @interface_method_impl{FNRTASN1COREVTENCODEWRITE} */
+static DECLCALLBACK(int) RTAsn1BitString_EncodeWrite(PRTASN1CORE pThisCore, uint32_t fFlags, PFNRTASN1ENCODEWRITER pfnWriter,
+ void *pvUser, PRTERRINFO pErrInfo)
+{
+ PRTASN1BITSTRING pThis = (PRTASN1BITSTRING)pThisCore;
+
+ AssertReturn(RT_ALIGN(pThis->cBits, 7) / 8 + 1 == pThis->Asn1Core.cb, VERR_INTERNAL_ERROR_3);
+
+ /*
+ * First the header.
+ */
+ int rc = RTAsnEncodeWriteHeader(&pThis->Asn1Core, fFlags, pfnWriter, pvUser, pErrInfo);
+ if (RT_SUCCESS(rc) && rc != VINF_ASN1_NOT_ENCODED)
+ {
+ /*
+ * The content starts with an unused bit count. Calculate it in case we
+ * need to write it out.
+ */
+ uint8_t cUnusedBits = 0;
+ if ((pThis->cBits & 7) != 0)
+ cUnusedBits = 8 - (pThis->cBits & 7);
+
+ /*
+ * If nothing is encapsulated, the core points to the content (if we have any).
+ */
+ if (!pThis->pEncapsulated)
+ {
+ if (pThis->cBits > 0)
+ {
+ Assert(pThis->Asn1Core.uData.pu8[0] == cUnusedBits);
+ rc = pfnWriter(pThis->Asn1Core.uData.pu8, pThis->Asn1Core.cb, pvUser, pErrInfo);
+ }
+ else
+ rc = pfnWriter(&cUnusedBits, sizeof(cUnusedBits), pvUser, pErrInfo);
+ }
+ /*
+ * Write the unused bit count and then call upon the encapsulated
+ * content to serialize itself.
+ */
+ else
+ {
+ rc = pfnWriter(&cUnusedBits, sizeof(cUnusedBits), pvUser, pErrInfo);
+ if (RT_SUCCESS(rc))
+ rc = RTAsn1EncodeWrite(pThis->pEncapsulated, fFlags, pfnWriter, pvUser, pErrInfo);
+ }
+ }
+ return rc;
+}
+
+
+RT_DECL_DATA_CONST(RTASN1COREVTABLE const) g_RTAsn1BitString_Vtable =
+{
+ "RTAsn1BitString",
+ sizeof(RTASN1BITSTRING),
+ ASN1_TAG_BIT_STRING,
+ ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_PRIMITIVE,
+ 0,
+ (PFNRTASN1COREVTDTOR)RTAsn1BitString_Delete,
+ (PFNRTASN1COREVTENUM)RTAsn1BitString_Enum,
+ (PFNRTASN1COREVTCLONE)RTAsn1BitString_Clone,
+ (PFNRTASN1COREVTCOMPARE)RTAsn1BitString_Compare,
+ (PFNRTASN1COREVTCHECKSANITY)RTAsn1BitString_CheckSanity,
+ RTAsn1BitString_EncodePrep,
+ RTAsn1BitString_EncodeWrite
+};
+
+
+RTDECL(int) RTAsn1BitString_Init(PRTASN1BITSTRING pThis, PCRTASN1ALLOCATORVTABLE pAllocator)
+{
+ RT_ZERO(*pThis);
+
+ RTAsn1Core_InitEx(&pThis->Asn1Core, ASN1_TAG_BIT_STRING, ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_PRIMITIVE,
+ &g_RTAsn1BitString_Vtable, RTASN1CORE_F_PRESENT | RTASN1CORE_F_PRIMITE_TAG_STRUCT);
+ /*pThis->cBits = 0;
+ pThis->cMaxBits = 0;
+ pThis->uBits.pv = NULL;
+ pThis->pEncapsulated = NULL; */
+ RTAsn1MemInitAllocation(&pThis->EncapsulatedAllocation, pAllocator);
+
+ return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTAsn1BitString_Clone(PRTASN1BITSTRING pThis, PCRTASN1BITSTRING pSrc, PCRTASN1ALLOCATORVTABLE pAllocator)
+{
+ AssertPtr(pSrc); AssertPtr(pThis); AssertPtr(pAllocator);
+
+ RT_ZERO(*pThis);
+ if (RTAsn1BitString_IsPresent(pSrc))
+ {
+ AssertReturn(pSrc->Asn1Core.pOps == &g_RTAsn1BitString_Vtable, VERR_INTERNAL_ERROR_3);
+
+ int rc;
+ if (!pSrc->pEncapsulated)
+ rc = RTAsn1Core_CloneContent(&pThis->Asn1Core, &pSrc->Asn1Core, pAllocator);
+ else
+ rc = RTAsn1Core_CloneNoContent(&pThis->Asn1Core, &pSrc->Asn1Core);
+ if (RT_FAILURE(rc))
+ return rc;
+
+ RTAsn1MemInitAllocation(&pThis->EncapsulatedAllocation, pAllocator);
+ pThis->cBits = pSrc->cBits;
+ pThis->cMaxBits = pSrc->cMaxBits;
+ if (!pSrc->pEncapsulated)
+ pThis->uBits.pv = pThis->Asn1Core.uData.pu8 ? pThis->Asn1Core.uData.pu8 + 1 : NULL;
+ else
+ {
+ PCRTASN1COREVTABLE pOps = pSrc->pEncapsulated->pOps;
+ Assert(!pOps || pOps->pfnClone);
+ if (pOps && pOps->pfnClone)
+ {
+ /* We can clone the decoded encapsulated object. */
+ rc = RTAsn1MemAllocZ(&pThis->EncapsulatedAllocation, (void **)&pThis->pEncapsulated, pOps->cbStruct);
+ if (RT_SUCCESS(rc))
+ {
+ rc = pOps->pfnClone(pThis->pEncapsulated, pSrc->pEncapsulated, pAllocator);
+ if (RT_FAILURE(rc))
+ RTAsn1MemFree(&pThis->EncapsulatedAllocation, pThis->pEncapsulated);
+ }
+ }
+ else
+ {
+ /* Borrow the encapsulated pointer and use RTAsn1BitString_RefreshContent
+ to get an accurate copy of the bytes. */
+ pThis->pEncapsulated = pSrc->pEncapsulated;
+ rc = RTAsn1BitString_RefreshContent(pThis, RTASN1ENCODE_F_DER, pAllocator, NULL);
+ pThis->pEncapsulated = NULL;
+ }
+ if (RT_FAILURE(rc))
+ {
+ RTAsn1ContentFree(&pThis->Asn1Core);
+ RT_ZERO(*pThis);
+ return rc;
+ }
+ }
+ }
+ return VINF_SUCCESS;
+}
+
+
+RTDECL(void) RTAsn1BitString_Delete(PRTASN1BITSTRING pThis)
+{
+ if ( pThis
+ && RTAsn1BitString_IsPresent(pThis))
+ {
+ Assert(pThis->Asn1Core.pOps == &g_RTAsn1BitString_Vtable);
+
+ /* Destroy the encapsulated object. */
+ if (pThis->pEncapsulated)
+ {
+ RTAsn1VtDelete(pThis->pEncapsulated);
+ if (pThis->EncapsulatedAllocation.cbAllocated)
+ RTAsn1MemFree(&pThis->EncapsulatedAllocation, pThis->pEncapsulated);
+ }
+
+ /* Delete content and wipe the content. */
+ RTAsn1ContentFree(&pThis->Asn1Core);
+ RT_ZERO(*pThis);
+ }
+}
+
+
+RTDECL(int) RTAsn1BitString_Enum(PRTASN1BITSTRING pThis, PFNRTASN1ENUMCALLBACK pfnCallback, uint32_t uDepth, void *pvUser)
+{
+ Assert(pThis && (!RTAsn1BitString_IsPresent(pThis) || pThis->Asn1Core.pOps == &g_RTAsn1BitString_Vtable));
+
+ /* Enumerate the encapsulated object if present. */
+ if (pThis->pEncapsulated)
+ return pfnCallback(pThis->pEncapsulated, "Encapsulated", uDepth + 1, pvUser);
+ return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTAsn1BitString_Compare(PCRTASN1BITSTRING pLeft, PCRTASN1BITSTRING pRight)
+{
+ Assert(pLeft && (!RTAsn1BitString_IsPresent(pLeft) || pLeft->Asn1Core.pOps == &g_RTAsn1BitString_Vtable));
+ Assert(pRight && (!RTAsn1BitString_IsPresent(pRight) || pRight->Asn1Core.pOps == &g_RTAsn1BitString_Vtable));
+
+ int iDiff;
+ if (RTAsn1BitString_IsPresent(pLeft))
+ {
+ if (RTAsn1BitString_IsPresent(pRight))
+ {
+ /* Since it's really hard to tell whether encapsulated objects have
+ been modified or not, we might have to refresh both objects
+ while doing this compare. We'll try our best to avoid it though. */
+ if (pLeft->pEncapsulated || pRight->pEncapsulated)
+ {
+ if ( pLeft->pEncapsulated
+ && pRight->pEncapsulated
+ && pLeft->pEncapsulated->pOps == pRight->pEncapsulated->pOps)
+ iDiff = pLeft->pEncapsulated->pOps->pfnCompare(pLeft->pEncapsulated, pRight->pEncapsulated);
+ else
+ {
+ /* No direct comparison of encapsulated objects possible,
+ make sure we've got the rigth bytes then. */
+ if ( pLeft->pEncapsulated
+ && !RTAsn1BitString_AreContentBitsValid(pLeft, RTASN1ENCODE_F_DER))
+ {
+ int rc = RTAsn1BitString_RefreshContent((PRTASN1BITSTRING)pLeft, RTASN1ENCODE_F_DER,
+ pLeft->EncapsulatedAllocation.pAllocator, NULL);
+ AssertRC(rc);
+ }
+
+ if ( pRight->pEncapsulated
+ && !RTAsn1BitString_AreContentBitsValid(pRight, RTASN1ENCODE_F_DER))
+ {
+ int rc = RTAsn1BitString_RefreshContent((PRTASN1BITSTRING)pRight, RTASN1ENCODE_F_DER,
+ pRight->EncapsulatedAllocation.pAllocator, NULL);
+ AssertRC(rc);
+ }
+
+ /* Compare the content bytes. */
+ iDiff = RTAsn1Core_CompareEx(&pLeft->Asn1Core, &pRight->Asn1Core, true /*fIgnoreTagAndClass*/);
+ }
+ }
+ /*
+ * No encapsulated object, just compare the raw content bytes.
+ */
+ else
+ iDiff = RTAsn1Core_CompareEx(&pLeft->Asn1Core, &pRight->Asn1Core, true /*fIgnoreTagAndClass*/);
+ }
+ else
+ iDiff = -1;
+ }
+ else
+ iDiff = 0 - (int)RTAsn1BitString_IsPresent(pRight);
+ return iDiff;
+}
+
+
+RTDECL(int) RTAsn1BitString_CheckSanity(PCRTASN1BITSTRING pThis, uint32_t fFlags, PRTERRINFO pErrInfo, const char *pszErrorTag)
+{
+ if (RT_UNLIKELY(!RTAsn1BitString_IsPresent(pThis)))
+ return RTErrInfoSetF(pErrInfo, VERR_ASN1_NOT_PRESENT, "%s: Missing (BIT STRING).", pszErrorTag);
+
+ if (pThis->cBits > pThis->cMaxBits)
+ return RTErrInfoSetF(pErrInfo, VERR_ASN1_BITSTRING_OUT_OF_BOUNDS, "%s: Exceeding max bits: cBits=%u cMaxBits=%u.",
+ pszErrorTag, pThis->cBits, pThis->cMaxBits);
+
+ if (pThis->pEncapsulated)
+ return pThis->pEncapsulated->pOps->pfnCheckSanity(pThis->pEncapsulated, fFlags & RTASN1_CHECK_SANITY_F_COMMON_MASK,
+ pErrInfo, pszErrorTag);
+ return VINF_SUCCESS;
+}
+
+/*
+ * Generate code for the associated collection types.
+ */
+#define RTASN1TMPL_TEMPLATE_FILE "../common/asn1/asn1-ut-bitstring-template.h"
+#include <iprt/asn1-generator-internal-header.h>
+#include <iprt/asn1-generator-core.h>
+#include <iprt/asn1-generator-init.h>
+#include <iprt/asn1-generator-sanity.h>
+
diff --git a/src/VBox/Runtime/common/asn1/asn1-ut-boolean-decode.cpp b/src/VBox/Runtime/common/asn1/asn1-ut-boolean-decode.cpp
new file mode 100644
index 00000000000..cdead7fa698
--- /dev/null
+++ b/src/VBox/Runtime/common/asn1/asn1-ut-boolean-decode.cpp
@@ -0,0 +1,81 @@
+/* $Id$ */
+/** @file
+ * IPRT - ASN.1, BOOLEAN Type, Decoding.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/asn1.h>
+
+#include <iprt/err.h>
+#include <iprt/string.h>
+
+#include <iprt/formats/asn1.h>
+
+
+
+RTDECL(int) RTAsn1Boolean_DecodeAsn1(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1BOOLEAN pThis, const char *pszErrorTag)
+{
+ pThis->fValue = 0;
+ int rc = RTAsn1CursorReadHdr(pCursor, &pThis->Asn1Core, pszErrorTag);
+ if (RT_SUCCESS(rc))
+ {
+ rc = RTAsn1CursorMatchTagClassFlags(pCursor, &pThis->Asn1Core, ASN1_TAG_BOOLEAN,
+ ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_PRIMITIVE, fFlags, pszErrorTag, "BOOLEAN");
+ if (RT_SUCCESS(rc))
+ {
+ if (pThis->Asn1Core.cb == 1)
+ {
+ RTAsn1CursorSkip(pCursor, pThis->Asn1Core.cb);
+ pThis->Asn1Core.fFlags |= RTASN1CORE_F_PRIMITE_TAG_STRUCT;
+ pThis->Asn1Core.pOps = &g_RTAsn1Boolean_Vtable;
+
+ pThis->fValue = *pThis->Asn1Core.uData.pu8 != 0;
+ if ( *pThis->Asn1Core.uData.pu8 == 0
+ || *pThis->Asn1Core.uData.pu8 == 0xff
+ || !(pCursor->fFlags & (RTASN1CURSOR_FLAGS_DER | RTASN1CURSOR_FLAGS_CER)) )
+ return VINF_SUCCESS;
+
+ rc = RTAsn1CursorSetInfo(pCursor, VERR_ASN1_INVALID_BOOLEAN_ENCODING,
+ "%s: Invalid CER/DER boolean value: %#x, valid: 0, 0xff",
+ pszErrorTag, *pThis->Asn1Core.uData.pu8);
+ }
+ else
+ rc = RTAsn1CursorSetInfo(pCursor, VERR_ASN1_INVALID_BOOLEAN_ENCODING, "%s: Invalid boolean length, exepcted 1: %#x",
+ pszErrorTag, pThis->Asn1Core.cb);
+ }
+ }
+ return rc;
+}
+
+
+/*
+ * Generate code for the associated collection types.
+ */
+#define RTASN1TMPL_TEMPLATE_FILE "../common/asn1/asn1-ut-boolean-template.h"
+#include <iprt/asn1-generator-internal-header.h>
+#include <iprt/asn1-generator-asn1-decoder.h>
+
diff --git a/src/VBox/Runtime/common/asn1/asn1-ut-boolean-template.h b/src/VBox/Runtime/common/asn1/asn1-ut-boolean-template.h
new file mode 100644
index 00000000000..a061765150b
--- /dev/null
+++ b/src/VBox/Runtime/common/asn1/asn1-ut-boolean-template.h
@@ -0,0 +1,45 @@
+/* $Id$ */
+/** @file
+ * IPRT - ASN.1, BOOLEAN Type, Collection Type Template.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+#define RTASN1TMPL_DECL RTDECL
+
+#define RTASN1TMPL_TYPE RTASN1SEQOFBOOLEANS
+#define RTASN1TMPL_EXT_NAME RTAsn1SeqOfBooleans
+#define RTASN1TMPL_INT_NAME rtAsn1SeqOfBooleans
+RTASN1TMPL_SEQ_OF(RTASN1BOOLEAN, RTAsn1Boolean);
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+#define RTASN1TMPL_TYPE RTASN1SETOFBOOLEANS
+#define RTASN1TMPL_EXT_NAME RTAsn1SetOfBooleans
+#define RTASN1TMPL_INT_NAME rtAsn1SetOfBooleans
+RTASN1TMPL_SET_OF(RTASN1BOOLEAN, RTAsn1Boolean);
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
diff --git a/src/VBox/Runtime/common/asn1/asn1-ut-boolean.cpp b/src/VBox/Runtime/common/asn1/asn1-ut-boolean.cpp
new file mode 100644
index 00000000000..bb59c92a88e
--- /dev/null
+++ b/src/VBox/Runtime/common/asn1/asn1-ut-boolean.cpp
@@ -0,0 +1,203 @@
+/* $Id$ */
+/** @file
+ * IPRT - ASN.1, BOOLEAN Type.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/asn1.h>
+
+#include <iprt/bignum.h>
+#include <iprt/err.h>
+#include <iprt/string.h>
+
+#include <iprt/formats/asn1.h>
+
+
+/*******************************************************************************
+* Global Variables *
+*******************************************************************************/
+/** The false value (DER & CER). */
+static const uint8_t g_bFalse = 0;
+/** The true value (DER & CER). */
+static const uint8_t g_bTrue = 0xff;
+
+
+/*
+ * ASN.1 BOOLEAN - Special Methods.
+ */
+
+RTDECL(int) RTAsn1Boolean_InitDefault(PRTASN1BOOLEAN pThis, bool fValue, PCRTASN1ALLOCATORVTABLE pAllocator)
+{
+ RTAsn1Core_InitEx(&pThis->Asn1Core, ASN1_TAG_BOOLEAN, ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_PRIMITIVE,
+ &g_RTAsn1Boolean_Vtable, RTASN1CORE_F_DEFAULT | RTASN1CORE_F_PRIMITE_TAG_STRUCT);
+ pThis->fValue = fValue;
+ pThis->Asn1Core.uData.pv = (void *)(fValue ? &g_bTrue : &g_bFalse);
+ return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTAsn1Boolean_Set(PRTASN1BOOLEAN pThis, bool fValue)
+{
+ /* Since we don't need an allocator, let's automatically initialize the struct. */
+ if (!RTAsn1Boolean_IsPresent(pThis))
+ RTAsn1Boolean_Init(pThis, NULL);
+ else
+ RTAsn1ContentFree(&pThis->Asn1Core);
+ pThis->fValue = fValue;
+ pThis->Asn1Core.uData.pv = (void *)(fValue ? &g_bTrue : &g_bFalse);
+ pThis->Asn1Core.cb = 1;
+ pThis->Asn1Core.fFlags &= ~RTASN1CORE_F_DEFAULT;
+ pThis->Asn1Core.fFlags |= RTASN1CORE_F_PRESENT;
+ return VINF_SUCCESS;
+}
+
+
+
+/*
+ * ASN.1 BOOLEAN - Standard Methods.
+ */
+
+RT_DECL_DATA_CONST(RTASN1COREVTABLE const) g_RTAsn1Boolean_Vtable =
+{
+ "RTAsn1Boolean",
+ sizeof(RTASN1BOOLEAN),
+ ASN1_TAG_BOOLEAN,
+ ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_PRIMITIVE,
+ 0,
+ (PFNRTASN1COREVTDTOR)RTAsn1Boolean_Delete,
+ NULL,
+ (PFNRTASN1COREVTCLONE)RTAsn1Boolean_Clone,
+ (PFNRTASN1COREVTCOMPARE)RTAsn1Boolean_Compare,
+ (PFNRTASN1COREVTCHECKSANITY)RTAsn1Boolean_CheckSanity,
+ NULL,
+ NULL
+};
+
+
+RTDECL(int) RTAsn1Boolean_Init(PRTASN1BOOLEAN pThis, PCRTASN1ALLOCATORVTABLE pAllocator)
+{
+ RTAsn1Core_InitEx(&pThis->Asn1Core, ASN1_TAG_BOOLEAN, ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_PRIMITIVE,
+ &g_RTAsn1Boolean_Vtable, RTASN1CORE_F_PRESENT | RTASN1CORE_F_PRIMITE_TAG_STRUCT);
+ pThis->fValue = true;
+ pThis->Asn1Core.cb = 1;
+ pThis->Asn1Core.uData.pv = (void *)&g_bTrue;
+ return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTAsn1Boolean_Clone(PRTASN1BOOLEAN pThis, PCRTASN1BOOLEAN pSrc, PCRTASN1ALLOCATORVTABLE pAllocator)
+{
+ AssertPtr(pSrc); AssertPtr(pThis); AssertPtr(pAllocator);
+ RT_ZERO(*pThis);
+ if (RTAsn1Boolean_IsPresent(pSrc))
+ {
+ AssertReturn(pSrc->Asn1Core.pOps == &g_RTAsn1Boolean_Vtable, VERR_INTERNAL_ERROR_3);
+ AssertReturn(pSrc->Asn1Core.cb <= 1, VERR_INTERNAL_ERROR_4);
+
+ int rc;
+ if ( pSrc->Asn1Core.cb == 1
+ && pSrc->Asn1Core.uData.pu8[0] != 0x00
+ && pSrc->Asn1Core.uData.pu8[0] != 0xff)
+ {
+ /* DER/CER incompatible value must be copied as-is. */
+ rc = RTAsn1Core_CloneContent(&pThis->Asn1Core, &pSrc->Asn1Core, pAllocator);
+ if (RT_FAILURE(rc))
+ return rc;
+ }
+ else
+ {
+ /* No value or one of the standard values. */
+ rc = RTAsn1Core_CloneNoContent(&pThis->Asn1Core, &pSrc->Asn1Core);
+ if (RT_FAILURE(rc))
+ return rc;
+ pThis->Asn1Core.uData.pv = (void *)(pSrc->fValue ? &g_bTrue : &g_bFalse);
+ }
+ pThis->fValue = pSrc->fValue;
+ }
+ return VINF_SUCCESS;
+}
+
+
+RTDECL(void) RTAsn1Boolean_Delete(PRTASN1BOOLEAN pThis)
+{
+ if ( pThis
+ && RTAsn1Boolean_IsPresent(pThis))
+ {
+ Assert(pThis->Asn1Core.pOps == &g_RTAsn1Boolean_Vtable);
+ Assert(pThis->Asn1Core.cb <= 1);
+
+ RTAsn1ContentFree(&pThis->Asn1Core);
+ RT_ZERO(*pThis);
+ }
+}
+
+
+RTDECL(int) RTAsn1Boolean_Enum(PRTASN1BOOLEAN pThis, PFNRTASN1ENUMCALLBACK pfnCallback, uint32_t uDepth, void *pvUser)
+{
+ Assert(pThis && (!RTAsn1Boolean_IsPresent(pThis) || pThis->Asn1Core.pOps == &g_RTAsn1Boolean_Vtable));
+
+ /* No children to enumerate. */
+ return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTAsn1Boolean_Compare(PCRTASN1BOOLEAN pLeft, PCRTASN1BOOLEAN pRight)
+{
+ Assert(pLeft && (!RTAsn1Boolean_IsPresent(pLeft) || pLeft->Asn1Core.pOps == &g_RTAsn1Boolean_Vtable));
+ Assert(pRight && (!RTAsn1Boolean_IsPresent(pRight) || pRight->Asn1Core.pOps == &g_RTAsn1Boolean_Vtable));
+
+ int iDiff;
+ if (RTAsn1Boolean_IsPresent(pLeft))
+ {
+ if (RTAsn1Boolean_IsPresent(pRight))
+ iDiff = (int)pLeft->fValue - (int)pRight->fValue;
+ else
+ iDiff = -1;
+ }
+ else
+ iDiff = 0 - (int)RTAsn1Boolean_IsPresent(pRight);
+ return iDiff;
+}
+
+
+RTDECL(int) RTAsn1Boolean_CheckSanity(PCRTASN1BOOLEAN pThis, uint32_t fFlags, PRTERRINFO pErrInfo, const char *pszErrorTag)
+{
+ if (RT_UNLIKELY(!RTAsn1Boolean_IsPresent(pThis)))
+ return RTErrInfoSetF(pErrInfo, VERR_ASN1_NOT_PRESENT, "%s: Missing (BOOLEAN).", pszErrorTag);
+ return VINF_SUCCESS;
+}
+
+
+/*
+ * Generate code for the associated collection types.
+ */
+#define RTASN1TMPL_TEMPLATE_FILE "../common/asn1/asn1-ut-boolean-template.h"
+#include <iprt/asn1-generator-internal-header.h>
+#include <iprt/asn1-generator-core.h>
+#include <iprt/asn1-generator-init.h>
+#include <iprt/asn1-generator-sanity.h>
+
diff --git a/src/VBox/Runtime/common/asn1/asn1-ut-core-decode.cpp b/src/VBox/Runtime/common/asn1/asn1-ut-core-decode.cpp
new file mode 100644
index 00000000000..817c457aff3
--- /dev/null
+++ b/src/VBox/Runtime/common/asn1/asn1-ut-core-decode.cpp
@@ -0,0 +1,56 @@
+/* $Id$ */
+/** @file
+ * IPRT - ASN.1, Generic Core Type, Decoding.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/asn1.h>
+
+#include <iprt/err.h>
+#include <iprt/string.h>
+
+
+RTDECL(int) RTAsn1Core_DecodeAsn1(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1CORE pThis, const char *pszErrorTag)
+{
+ int rc = RTAsn1CursorReadHdr(pCursor, pThis, pszErrorTag);
+ if (RT_SUCCESS(rc))
+ {
+ RTAsn1CursorSkip(pCursor, pThis->cb);
+ pThis->pOps = &g_RTAsn1Core_Vtable;
+ return VINF_SUCCESS;
+ }
+ return rc;
+}
+
+
+/*
+ * Generate code for the associated collection types.
+ */
+#define RTASN1TMPL_TEMPLATE_FILE "../common/asn1/asn1-ut-core-template.h"
+#include <iprt/asn1-generator-internal-header.h>
+#include <iprt/asn1-generator-asn1-decoder.h>
+
diff --git a/src/VBox/Runtime/common/asn1/asn1-ut-core-template.h b/src/VBox/Runtime/common/asn1/asn1-ut-core-template.h
new file mode 100644
index 00000000000..4cc5c251685
--- /dev/null
+++ b/src/VBox/Runtime/common/asn1/asn1-ut-core-template.h
@@ -0,0 +1,45 @@
+/* $Id$ */
+/** @file
+ * IPRT - ASN.1, Generic Core Type, Collection Type Template.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+#define RTASN1TMPL_DECL RTDECL
+
+#define RTASN1TMPL_TYPE RTASN1SEQOFCORES
+#define RTASN1TMPL_EXT_NAME RTAsn1SeqOfCores
+#define RTASN1TMPL_INT_NAME rtAsn1SeqOfCores
+RTASN1TMPL_SEQ_OF(RTASN1CORE, RTAsn1Core);
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+#define RTASN1TMPL_TYPE RTASN1SETOFCORES
+#define RTASN1TMPL_EXT_NAME RTAsn1SetOfCores
+#define RTASN1TMPL_INT_NAME rtAsn1SetOfCores
+RTASN1TMPL_SET_OF(RTASN1CORE, RTAsn1Core);
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
diff --git a/src/VBox/Runtime/common/asn1/asn1-ut-core.cpp b/src/VBox/Runtime/common/asn1/asn1-ut-core.cpp
new file mode 100644
index 00000000000..8e8a1aa3890
--- /dev/null
+++ b/src/VBox/Runtime/common/asn1/asn1-ut-core.cpp
@@ -0,0 +1,278 @@
+/* $Id$ */
+/** @file
+ * IPRT - ASN.1, Generic Core Type.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/asn1.h>
+
+#include <iprt/alloca.h>
+#include <iprt/bignum.h>
+#include <iprt/ctype.h>
+#include <iprt/err.h>
+#include <iprt/string.h>
+#include <iprt/uni.h>
+
+#include <iprt/formats/asn1.h>
+
+
+/*
+ * ASN.1 Core - Special methods (for all applications of RTASN1CORE).
+ */
+
+RTDECL(int) RTAsn1Core_SetTagAndFlags(PRTASN1CORE pAsn1Core, uint32_t uTag, uint8_t fClass)
+{
+ if (!(pAsn1Core->fFlags & RTASN1CORE_F_TAG_IMPLICIT))
+ {
+ pAsn1Core->fRealClass = pAsn1Core->fClass;
+ pAsn1Core->uRealTag = pAsn1Core->uTag;
+ Assert(pAsn1Core->uRealTag == pAsn1Core->uTag);
+ pAsn1Core->fFlags |= RTASN1CORE_F_TAG_IMPLICIT;
+ }
+ pAsn1Core->uTag = uTag;
+ pAsn1Core->fClass = fClass;
+ return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTAsn1Core_ChangeTag(PRTASN1CORE pAsn1Core, uint32_t uTag)
+{
+ if (!(pAsn1Core->fFlags & RTASN1CORE_F_TAG_IMPLICIT))
+ pAsn1Core->uTag = uTag;
+ pAsn1Core->uRealTag = uTag;
+ return VINF_SUCCESS;
+}
+
+
+RTDECL(void) RTAsn1Core_ResetImplict(PRTASN1CORE pThis)
+{
+ AssertPtr(pThis);
+ if (pThis->fFlags & RTASN1CORE_F_TAG_IMPLICIT)
+ {
+ pThis->fFlags &= ~RTASN1CORE_F_TAG_IMPLICIT;
+ pThis->uTag = pThis->uRealTag;
+ pThis->fClass = pThis->fRealClass;
+ }
+}
+
+
+RTDECL(int) RTAsn1Core_InitEx(PRTASN1CORE pAsn1Core, uint32_t uTag, uint8_t fClass, PCRTASN1COREVTABLE pOps, uint32_t fFlags)
+{
+ pAsn1Core->uTag = uTag;
+ pAsn1Core->fClass = fClass;
+ pAsn1Core->uRealTag = uTag;
+ pAsn1Core->fRealClass = fClass;
+ pAsn1Core->cbHdr = 0;
+ pAsn1Core->cb = 0;
+ pAsn1Core->fFlags = fFlags;
+ pAsn1Core->uData.pv = NULL;
+ pAsn1Core->pOps = pOps;
+ return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTAsn1Core_InitDefault(PRTASN1CORE pAsn1Core, uint32_t uTag, uint8_t fClass)
+{
+ return RTAsn1Core_InitEx(pAsn1Core, uTag, fClass, NULL, RTASN1CORE_F_DEFAULT);
+}
+
+
+static int rtAsn1Core_CloneEx(PRTASN1CORE pThis, PCRTASN1CORE pSrc, PCRTASN1ALLOCATORVTABLE pAllocator, bool fCopyContent)
+{
+ Assert(RTASN1CORE_IS_PRESENT(pSrc));
+ pThis->uTag = pSrc->uTag;
+ pThis->fClass = pSrc->fClass;
+ pThis->uRealTag = pSrc->uRealTag;
+ pThis->fRealClass = pSrc->fRealClass;
+ pThis->cbHdr = pSrc->cbHdr;
+ pThis->fFlags = pSrc->fFlags & ~(RTASN1CORE_F_ALLOCATED_CONTENT | RTASN1CORE_F_DECODED_CONTENT);
+ pThis->pOps = pSrc->pOps;
+ pThis->cb = 0;
+ pThis->uData.pv = NULL;
+ if (pSrc->cb)
+ {
+ if (!fCopyContent)
+ pThis->cb = pSrc->cb;
+ else
+ {
+ int rc = RTAsn1ContentDup(pThis, pSrc->uData.pv, pSrc->cb, pAllocator);
+ if (RT_FAILURE(rc))
+ {
+ RT_ZERO(*pThis);
+ return rc;
+ }
+ Assert(pThis->cb == pSrc->cb);
+ AssertPtr(pThis->uData.pv);
+ }
+ }
+ return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTAsn1Core_CloneContent(PRTASN1CORE pThis, PCRTASN1CORE pSrc, PCRTASN1ALLOCATORVTABLE pAllocator)
+{
+ return rtAsn1Core_CloneEx(pThis, pSrc, pAllocator, true /*fConpyContent*/);
+}
+
+
+RTDECL(int) RTAsn1Core_CloneNoContent(PRTASN1CORE pThis, PCRTASN1CORE pSrc)
+{
+ return rtAsn1Core_CloneEx(pThis, pSrc, NULL, false /*fConpyContent*/);
+}
+
+
+RTDECL(int) RTAsn1Core_CompareEx(PCRTASN1CORE pLeft, PCRTASN1CORE pRight, bool fIgnoreTagAndClass)
+{
+ int iDiff;
+ if (RTASN1CORE_IS_PRESENT(pLeft))
+ {
+ if (RTASN1CORE_IS_PRESENT(pRight))
+ {
+ iDiff = memcmp(pLeft->uData.pv, pRight->uData.pv, RT_MIN(pLeft->cb, pRight->cb));
+ if (!iDiff)
+ {
+ if (pLeft->cb != pRight->cb)
+ iDiff = pLeft->cb < pRight->cb ? -1 : 1;
+ else if (!fIgnoreTagAndClass)
+ {
+ if (pLeft->uTag != pRight->uTag)
+ iDiff = pLeft->uTag < pRight->uTag ? -1 : 1;
+ else if (pLeft->fClass != pRight->fClass)
+ iDiff = pLeft->fClass < pRight->fClass ? -1 : 1;
+ }
+ }
+ else
+ iDiff = iDiff < 0 ? -1 : 1;
+ }
+ else
+ iDiff = -1;
+ }
+ else
+ iDiff = 0 - (int)RTASN1CORE_IS_PRESENT(pRight);
+ return iDiff;
+}
+
+
+
+/*
+ * ASN.1 Core - Standard Methods.
+ *
+ * Note! Children of the ASN.1 Core doesn't normally call these, they are for
+ * when RTASN1CORE is used as a member type.
+ */
+
+RT_DECL_DATA_CONST(RTASN1COREVTABLE const) g_RTAsn1Core_Vtable =
+{
+ "RTAsn1Core",
+ sizeof(RTASN1CORE),
+ UINT8_MAX,
+ UINT8_MAX,
+ 0,
+ RTAsn1Core_Delete,
+ RTAsn1Core_Enum,
+ (PFNRTASN1COREVTCLONE)RTAsn1Core_Clone,
+ (PFNRTASN1COREVTCOMPARE)RTAsn1Core_Compare,
+ (PFNRTASN1COREVTCHECKSANITY)RTAsn1Core_CheckSanity,
+ NULL,
+ NULL
+};
+
+
+RTDECL(int) RTAsn1Core_Init(PRTASN1CORE pThis, PCRTASN1ALLOCATORVTABLE pAllocator)
+{
+ return RTAsn1Core_InitEx(pThis, 0, ASN1_TAGCLASS_CONTEXT | ASN1_TAGFLAG_PRIMITIVE,
+ &g_RTAsn1Core_Vtable, RTASN1CORE_F_PRESENT);
+}
+
+
+RTDECL(int) RTAsn1Core_Clone(PRTASN1CORE pThis, PCRTASN1CORE pSrc, PCRTASN1ALLOCATORVTABLE pAllocator)
+{
+ int rc;
+ RT_ZERO(*pThis);
+ if (RTASN1CORE_IS_PRESENT(pSrc))
+ {
+ Assert(pSrc->pOps == &g_RTAsn1Core_Vtable);
+
+ rc = RTAsn1Core_CloneContent(pThis, pSrc, pAllocator);
+ }
+ else
+ rc = VINF_SUCCESS;
+ return rc;
+}
+
+
+RTDECL(void) RTAsn1Core_Delete(PRTASN1CORE pThis)
+{
+ if (pThis && RTASN1CORE_IS_PRESENT(pThis))
+ {
+ Assert(pThis->pOps == &g_RTAsn1Core_Vtable);
+
+ RTAsn1ContentFree(pThis);
+ RT_ZERO(*pThis);
+ }
+}
+
+
+RTDECL(int) RTAsn1Core_Enum(PRTASN1CORE pThis, PFNRTASN1ENUMCALLBACK pfnCallback, uint32_t uDepth, void *pvUser)
+{
+ /* We have no children to enumerate. */
+ Assert(pThis && (!RTASN1CORE_IS_PRESENT(pThis) || pThis->pOps == &g_RTAsn1Core_Vtable));
+ NOREF(pThis);
+ NOREF(pfnCallback);
+ NOREF(uDepth);
+ NOREF(pvUser);
+ return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTAsn1Core_Compare(PCRTASN1CORE pLeft, PCRTASN1CORE pRight)
+{
+ Assert(pLeft && (!RTASN1CORE_IS_PRESENT(pLeft) || pLeft->pOps == &g_RTAsn1Core_Vtable));
+ Assert(pRight && (!RTASN1CORE_IS_PRESENT(pRight) || pRight->pOps == &g_RTAsn1Core_Vtable));
+
+ return RTAsn1Core_CompareEx(pLeft, pRight, false /*fIgnoreTagAndClass*/);
+}
+
+
+RTDECL(int) RTAsn1Core_CheckSanity(PCRTASN1CORE pThis, uint32_t fFlags, PRTERRINFO pErrInfo, const char *pszErrorTag)
+{
+ /* We can only check that it's present. */
+ if (!RTAsn1Core_IsPresent(pThis))
+ return RTErrInfoSetF(pErrInfo, VERR_ASN1_NOT_PRESENT, "%s: Missing (RTASN1CORE).", pszErrorTag);
+ return VINF_SUCCESS;
+}
+
+
+/*
+ * Generate code for the associated collection types.
+ */
+#define RTASN1TMPL_TEMPLATE_FILE "../common/asn1/asn1-ut-core-template.h"
+#include <iprt/asn1-generator-internal-header.h>
+#include <iprt/asn1-generator-core.h>
+#include <iprt/asn1-generator-init.h>
+#include <iprt/asn1-generator-sanity.h>
+
diff --git a/src/VBox/Runtime/common/asn1/asn1-ut-dyntype-decode.cpp b/src/VBox/Runtime/common/asn1/asn1-ut-dyntype-decode.cpp
new file mode 100644
index 00000000000..6bc2647688a
--- /dev/null
+++ b/src/VBox/Runtime/common/asn1/asn1-ut-dyntype-decode.cpp
@@ -0,0 +1,228 @@
+/* $Id$ */
+/** @file
+ * IPRT - ASN.1, Dynamic Type, Decoding.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/asn1.h>
+
+#include <iprt/err.h>
+#include <iprt/string.h>
+
+#include <iprt/formats/asn1.h>
+
+
+
+RTDECL(int) RTAsn1DynType_DecodeAsn1(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1DYNTYPE pDynType, const char *pszErrorTag)
+{
+ RT_ZERO(*pDynType);
+
+ Assert(!(fFlags & RTASN1CURSOR_GET_F_IMPLICIT));
+ uint32_t cbSavedLeft = pCursor->cbLeft;
+ uint8_t const *pbSavedCur = pCursor->pbCur;
+
+ int rc = RTAsn1CursorReadHdr(pCursor, &pDynType->u.Core, pszErrorTag);
+ if (RT_SUCCESS(rc))
+ {
+ pDynType->enmType = RTASN1TYPE_CORE;
+
+ if (pDynType->u.Core.fClass == (ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_PRIMITIVE))
+ {
+ switch (pDynType->u.Core.uTag)
+ {
+ case ASN1_TAG_BOOLEAN:
+ pDynType->enmType = RTASN1TYPE_BOOLEAN;
+ break;
+ case ASN1_TAG_INTEGER:
+ pDynType->enmType = RTASN1TYPE_INTEGER;
+ break;
+ //case ASN1_TAG_ENUMERATED:
+ // pDynType->enmType = RTASN1TYPE_ENUMERATED;
+ // break;
+ //case ASN1_TAG_REAL:
+ // pDynType->enmType = RTASN1TYPE_REAL;
+ // break;
+ case ASN1_TAG_BIT_STRING:
+ pDynType->enmType = RTASN1TYPE_BIT_STRING;
+ break;
+ case ASN1_TAG_OCTET_STRING:
+ pDynType->enmType = RTASN1TYPE_OCTET_STRING;
+ break;
+ case ASN1_TAG_NULL:
+ pDynType->enmType = RTASN1TYPE_NULL;
+ break;
+ case ASN1_TAG_SEQUENCE:
+ return RTAsn1CursorSetInfo(pCursor, VERR_ASN1_DYNTYPE_BAD_TAG, "ASN.1 SEQUENCE shall be constructed.");
+ case ASN1_TAG_SET:
+ return RTAsn1CursorSetInfo(pCursor, VERR_ASN1_DYNTYPE_BAD_TAG, "ASN.1 SET shall be constructed.");
+ case ASN1_TAG_OID:
+ pDynType->enmType = RTASN1TYPE_OBJID;
+ break;
+ //case ASN1_TAG_RELATIVE_OID:
+ // pDynType->enmType = RTASN1TYPE_RELATIVE_OBJID;
+ // break;
+ case ASN1_TAG_UTC_TIME:
+ case ASN1_TAG_GENERALIZED_TIME:
+ pDynType->enmType = RTASN1TYPE_TIME;
+ break;
+ case ASN1_TAG_UTF8_STRING:
+ case ASN1_TAG_NUMERIC_STRING:
+ case ASN1_TAG_PRINTABLE_STRING:
+ case ASN1_TAG_T61_STRING:
+ case ASN1_TAG_VIDEOTEX_STRING:
+ case ASN1_TAG_IA5_STRING:
+ case ASN1_TAG_GRAPHIC_STRING:
+ case ASN1_TAG_VISIBLE_STRING:
+ case ASN1_TAG_UNIVERSAL_STRING:
+ case ASN1_TAG_GENERAL_STRING:
+ case ASN1_TAG_BMP_STRING:
+ pDynType->enmType = RTASN1TYPE_STRING;
+ break;
+ //case ASN1_TAG_CHARACTER_STRING:
+ // pDynType->enmType = RTASN1TYPE_CHARACTER_STRING;
+ // break;
+
+ default:
+ return RTAsn1CursorSetInfo(pCursor, VERR_ASN1_DYNTYPE_TAG_NOT_IMPL,
+ "Primitive tag %u (%#x) not implemented.",
+ pDynType->u.Core.uTag, pDynType->u.Core.uTag);
+ }
+ }
+ else if (pDynType->u.Core.fClass == (ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_CONSTRUCTED))
+ switch (pDynType->u.Core.uTag)
+ {
+ case ASN1_TAG_BOOLEAN:
+ return RTAsn1CursorSetInfo(pCursor, VERR_ASN1_DYNTYPE_BAD_TAG, "ASN.1 BOOLEAN shall be primitive.");
+ case ASN1_TAG_INTEGER:
+ return RTAsn1CursorSetInfo(pCursor, VERR_ASN1_DYNTYPE_BAD_TAG, "ASN.1 BOOLEAN shall be primitive.");
+ case ASN1_TAG_ENUMERATED:
+ return RTAsn1CursorSetInfo(pCursor, VERR_ASN1_DYNTYPE_BAD_TAG, "ASN.1 ENUMERATED shall be primitive.");
+ case ASN1_TAG_REAL:
+ return RTAsn1CursorSetInfo(pCursor, VERR_ASN1_DYNTYPE_BAD_TAG, "ASN.1 REAL shall be primitive.");
+ case ASN1_TAG_BIT_STRING:
+ pDynType->enmType = RTASN1TYPE_BIT_STRING;
+ break;
+ case ASN1_TAG_OCTET_STRING:
+ pDynType->enmType = RTASN1TYPE_OCTET_STRING;
+ break;
+ case ASN1_TAG_NULL:
+ return RTAsn1CursorSetInfo(pCursor, VERR_ASN1_DYNTYPE_BAD_TAG, "ASN.1 NULL shall be primitive.");
+ case ASN1_TAG_SEQUENCE:
+#if 0
+ pDynType->enmType = RTASN1TYPE_SEQUENCE_CORE;
+ pDynType->u.SeqCore.Asn1Core.fFlags |= RTASN1CORE_F_PRIMITE_TAG_STRUCT;
+ RTAsn1CursorSkip(pCursor, pDynType->u.Core.cb);
+ return VINF_SUCCESS;
+#else
+ pDynType->enmType = RTASN1TYPE_CORE;
+#endif
+ break;
+ case ASN1_TAG_SET:
+#if 0
+ pDynType->enmType = RTASN1TYPE_SET_CORE;
+ pDynType->u.SeqCore.Asn1Core.fFlags |= RTASN1CORE_F_PRIMITE_TAG_STRUCT;
+ RTAsn1CursorSkip(pCursor, pDynType->u.Core.cb);
+ return VINF_SUCCESS;
+#else
+ pDynType->enmType = RTASN1TYPE_CORE;
+#endif
+ break;
+ case ASN1_TAG_OID:
+ return RTAsn1CursorSetInfo(pCursor, VERR_ASN1_DYNTYPE_BAD_TAG, "ASN.1 OBJECT ID shall be primitive.");
+ case ASN1_TAG_RELATIVE_OID:
+ return RTAsn1CursorSetInfo(pCursor, VERR_ASN1_DYNTYPE_BAD_TAG, "ASN.1 RELATIVE OID shall be primitive.");
+
+ case ASN1_TAG_UTF8_STRING:
+ case ASN1_TAG_NUMERIC_STRING:
+ case ASN1_TAG_PRINTABLE_STRING:
+ case ASN1_TAG_T61_STRING:
+ case ASN1_TAG_VIDEOTEX_STRING:
+ case ASN1_TAG_IA5_STRING:
+ case ASN1_TAG_GRAPHIC_STRING:
+ case ASN1_TAG_VISIBLE_STRING:
+ case ASN1_TAG_UNIVERSAL_STRING:
+ case ASN1_TAG_GENERAL_STRING:
+ case ASN1_TAG_BMP_STRING:
+ pDynType->enmType = RTASN1TYPE_STRING;
+ break;
+ //case ASN1_TAG_CHARACTER_STRING:
+ // pDynType->enmType = RTASN1TYPE_CHARACTER_STRING;
+ // break;
+
+ default:
+ return RTAsn1CursorSetInfo(pCursor, VERR_ASN1_DYNTYPE_TAG_NOT_IMPL,
+ "Constructed tag %u (%#x) not implemented.",
+ pDynType->u.Core.uTag, pDynType->u.Core.uTag);
+ }
+ else
+ {
+ RTAsn1CursorSkip(pCursor, pDynType->u.Core.cb);
+ return VINF_SUCCESS;
+ }
+
+ /*
+ * Restore the cursor and redo with specific type.
+ */
+ pCursor->pbCur = pbSavedCur;
+ pCursor->cbLeft = cbSavedLeft;
+
+ switch (pDynType->enmType)
+ {
+ case RTASN1TYPE_INTEGER:
+ rc = RTAsn1Integer_DecodeAsn1(pCursor, 0, &pDynType->u.Integer, pszErrorTag);
+ break;
+ case RTASN1TYPE_BOOLEAN:
+ rc = RTAsn1Boolean_DecodeAsn1(pCursor, 0, &pDynType->u.Boolean, pszErrorTag);
+ break;
+ case RTASN1TYPE_OBJID:
+ rc = RTAsn1ObjId_DecodeAsn1(pCursor, 0, &pDynType->u.ObjId, pszErrorTag);
+ break;
+ case RTASN1TYPE_BIT_STRING:
+ rc = RTAsn1BitString_DecodeAsn1(pCursor, 0, &pDynType->u.BitString, pszErrorTag);
+ break;
+ case RTASN1TYPE_OCTET_STRING:
+ rc = RTAsn1OctetString_DecodeAsn1(pCursor, 0, &pDynType->u.OctetString, pszErrorTag);
+ break;
+ case RTASN1TYPE_NULL:
+ rc = RTAsn1Null_DecodeAsn1(pCursor, 0, &pDynType->u.Asn1Null, pszErrorTag);
+ break;
+ case RTASN1TYPE_TIME:
+ rc = RTAsn1Time_DecodeAsn1(pCursor, 0, &pDynType->u.Time, pszErrorTag);
+ break;
+ case RTASN1TYPE_STRING:
+ rc = RTAsn1String_DecodeAsn1(pCursor, 0, &pDynType->u.String, pszErrorTag);
+ break;
+ case RTASN1TYPE_CORE:
+ rc = RTAsn1Core_DecodeAsn1(pCursor, 0, &pDynType->u.Core, pszErrorTag);
+ break;
+ default:
+ AssertFailedReturn(VERR_INTERNAL_ERROR_4);
+ }
+ }
+ return rc;
+}
+
diff --git a/src/VBox/Runtime/common/asn1/asn1-ut-dyntype.cpp b/src/VBox/Runtime/common/asn1/asn1-ut-dyntype.cpp
new file mode 100644
index 00000000000..e294f885927
--- /dev/null
+++ b/src/VBox/Runtime/common/asn1/asn1-ut-dyntype.cpp
@@ -0,0 +1,169 @@
+/* $Id$ */
+/** @file
+ * IPRT - ASN.1, Basic Operations.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/asn1.h>
+
+#include <iprt/err.h>
+#include <iprt/string.h>
+
+#include <iprt/formats/asn1.h>
+
+
+/*
+ * ASN.1 dynamic type union - Standard Methods.
+ */
+
+
+RTDECL(int) RTAsn1DynType_Init(PRTASN1DYNTYPE pThis, PCRTASN1ALLOCATORVTABLE pAllocator)
+{
+ RT_ZERO(*pThis);
+ pThis->enmType = RTASN1TYPE_NOT_PRESENT;
+ return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTAsn1DynType_Clone(PRTASN1DYNTYPE pThis, PCRTASN1DYNTYPE pSrc, PCRTASN1ALLOCATORVTABLE pAllocator)
+{
+ AssertPtr(pSrc); AssertPtr(pThis); AssertPtr(pAllocator);
+ RT_ZERO(*pThis);
+ if (RTAsn1DynType_IsPresent(pSrc))
+ {
+ int rc;
+ switch (pSrc->enmType)
+ {
+ case RTASN1TYPE_CORE: rc = RTAsn1Core_Clone(&pThis->u.Core, &pSrc->u.Core, pAllocator); break;
+ case RTASN1TYPE_NULL: rc = RTAsn1Null_Clone(&pThis->u.Asn1Null, &pSrc->u.Asn1Null, pAllocator); break;
+ case RTASN1TYPE_INTEGER: rc = RTAsn1Integer_Clone(&pThis->u.Integer, &pSrc->u.Integer, pAllocator); break;
+ case RTASN1TYPE_BOOLEAN: rc = RTAsn1Boolean_Clone(&pThis->u.Boolean, &pSrc->u.Boolean, pAllocator); break;
+ case RTASN1TYPE_STRING: rc = RTAsn1String_Clone(&pThis->u.String, &pSrc->u.String, pAllocator); break;
+ case RTASN1TYPE_OCTET_STRING: rc = RTAsn1OctetString_Clone(&pThis->u.OctetString, &pSrc->u.OctetString, pAllocator); break;
+ case RTASN1TYPE_BIT_STRING: rc = RTAsn1BitString_Clone(&pThis->u.BitString, &pSrc->u.BitString, pAllocator); break;
+ case RTASN1TYPE_TIME: rc = RTAsn1Time_Clone(&pThis->u.Time, &pSrc->u.Time, pAllocator); break;
+#if 0
+ case RTASN1TYPE_SEQUENCE_CORE: rc = VERR_NOT_SUPPORTED; //rc = RTAsn1SequenceCore_Clone(&pThis->u.SeqCore, &pSrc->u.SeqCore, pAllocator); break;
+ case RTASN1TYPE_SET_CORE: rc = VERR_NOT_SUPPORTED; //rc = RTAsn1SetCore_Clone(&pThis->u.SetCore, &pSrc->u.SetCore, pAllocator); break;
+#endif
+ case RTASN1TYPE_OBJID: rc = RTAsn1ObjId_Clone(&pThis->u.ObjId, &pSrc->u.ObjId, pAllocator); break;
+ default:
+ AssertFailedReturn(VERR_ASN1_INTERNAL_ERROR_2);
+ }
+ if (RT_FAILURE(rc))
+ {
+ RT_ZERO(*pThis);
+ return rc;
+ }
+ pThis->enmType = pSrc->enmType;
+ }
+ else
+ pThis->enmType = RTASN1TYPE_NOT_PRESENT;
+ return VINF_SUCCESS;
+}
+
+
+RTDECL(void) RTAsn1DynType_Delete(PRTASN1DYNTYPE pThis)
+{
+ if ( pThis
+ && RTAsn1DynType_IsPresent(pThis))
+ {
+ if ( pThis->u.Core.pOps
+ && pThis->u.Core.pOps->pfnDtor)
+ pThis->u.Core.pOps->pfnDtor(&pThis->u.Core);
+ RT_ZERO(*pThis);
+ }
+}
+
+
+RTDECL(int) RTAsn1DynType_Enum(PRTASN1DYNTYPE pThis, PFNRTASN1ENUMCALLBACK pfnCallback, uint32_t uDepth, void *pvUser)
+{
+ if ( pThis
+ && RTAsn1DynType_IsPresent(pThis))
+ {
+ if ( pThis->u.Core.pOps
+ && pThis->u.Core.pOps->pfnEnum)
+ return pThis->u.Core.pOps->pfnEnum(&pThis->u.Core, pfnCallback, uDepth, pvUser);
+ }
+ return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTAsn1DynType_Compare(PCRTASN1DYNTYPE pLeft, PCRTASN1DYNTYPE pRight)
+{
+ if (RTAsn1DynType_IsPresent(pLeft) && RTAsn1DynType_IsPresent(pRight))
+ {
+ if (pLeft->enmType != pRight->enmType)
+ return pLeft->enmType < pRight->enmType ? -1 : 1;
+
+ switch (pLeft->enmType)
+ {
+ case RTASN1TYPE_CORE: return RTAsn1Core_Compare(&pLeft->u.Core, &pRight->u.Core); break;
+ case RTASN1TYPE_NULL: return RTAsn1Null_Compare(&pLeft->u.Asn1Null, &pRight->u.Asn1Null);
+ case RTASN1TYPE_INTEGER: return RTAsn1Integer_Compare(&pLeft->u.Integer, &pRight->u.Integer);
+ case RTASN1TYPE_BOOLEAN: return RTAsn1Boolean_Compare(&pLeft->u.Boolean, &pRight->u.Boolean);
+ case RTASN1TYPE_STRING: return RTAsn1String_Compare(&pLeft->u.String, &pRight->u.String);
+ case RTASN1TYPE_OCTET_STRING: return RTAsn1OctetString_Compare(&pLeft->u.OctetString, &pRight->u.OctetString);
+ case RTASN1TYPE_BIT_STRING: return RTAsn1BitString_Compare(&pLeft->u.BitString, &pRight->u.BitString);
+ case RTASN1TYPE_TIME: return RTAsn1Time_Compare(&pLeft->u.Time, &pRight->u.Time);
+ case RTASN1TYPE_OBJID: return RTAsn1ObjId_Compare(&pLeft->u.ObjId, &pRight->u.ObjId);
+ default: AssertFailedReturn(-1);
+ }
+ }
+ else
+ return (int)RTAsn1DynType_IsPresent(pLeft) - (int)RTAsn1DynType_IsPresent(pRight);
+}
+
+
+RTDECL(int) RTAsn1DynType_CheckSanity(PCRTASN1DYNTYPE pThis, uint32_t fFlags, PRTERRINFO pErrInfo, const char *pszErrorTag)
+{
+ if (RT_UNLIKELY(!RTAsn1DynType_IsPresent(pThis)))
+ return RTErrInfoSetF(pErrInfo, VERR_ASN1_NOT_PRESENT, "%s: Missing (DYNTYPE).", pszErrorTag);
+
+ int rc;
+ switch (pThis->enmType)
+ {
+ case RTASN1TYPE_CORE: rc = RTAsn1Core_CheckSanity(&pThis->u.Core, fFlags, pErrInfo, pszErrorTag); break;
+ case RTASN1TYPE_NULL: rc = RTAsn1Null_CheckSanity(&pThis->u.Asn1Null, fFlags, pErrInfo, pszErrorTag); break;
+ case RTASN1TYPE_INTEGER: rc = RTAsn1Integer_CheckSanity(&pThis->u.Integer, fFlags, pErrInfo, pszErrorTag); break;
+ case RTASN1TYPE_BOOLEAN: rc = RTAsn1Boolean_CheckSanity(&pThis->u.Boolean, fFlags, pErrInfo, pszErrorTag); break;
+ case RTASN1TYPE_STRING: rc = RTAsn1String_CheckSanity(&pThis->u.String, fFlags, pErrInfo, pszErrorTag); break;
+ case RTASN1TYPE_OCTET_STRING: rc = RTAsn1OctetString_CheckSanity(&pThis->u.OctetString, fFlags, pErrInfo, pszErrorTag); break;
+ case RTASN1TYPE_BIT_STRING: rc = RTAsn1BitString_CheckSanity(&pThis->u.BitString, fFlags, pErrInfo, pszErrorTag); break;
+ case RTASN1TYPE_TIME: rc = RTAsn1Time_CheckSanity(&pThis->u.Time, fFlags, pErrInfo, pszErrorTag); break;
+#if 0
+ case RTASN1TYPE_SEQUENCE_CORE: rc = VINF_SUCCESS; //rc = RTAsn1SequenceCore_CheckSanity(&pThis->u.SeqCore, fFlags, pErrInfo, pszErrorTag); break;
+ case RTASN1TYPE_SET_CORE: rc = VINF_SUCCESS; //rc = RTAsn1SetCore_CheckSanity(&pThis->u.SetCore, fFlags, pErrInfo, pszErrorTag); break;
+#endif
+ case RTASN1TYPE_OBJID: rc = RTAsn1ObjId_CheckSanity(&pThis->u.ObjId, fFlags, pErrInfo, pszErrorTag); break;
+ default:
+ AssertFailedReturn(VERR_ASN1_INTERNAL_ERROR_2);
+ }
+
+ return rc;
+}
+
diff --git a/src/VBox/Runtime/common/asn1/asn1-ut-integer-decode.cpp b/src/VBox/Runtime/common/asn1/asn1-ut-integer-decode.cpp
new file mode 100644
index 00000000000..05f1c368520
--- /dev/null
+++ b/src/VBox/Runtime/common/asn1/asn1-ut-integer-decode.cpp
@@ -0,0 +1,79 @@
+/* $Id$ */
+/** @file
+ * IPRT - ASN.1, INTEGER Type, Decoding.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/asn1.h>
+
+#include <iprt/err.h>
+#include <iprt/string.h>
+
+#include <iprt/formats/asn1.h>
+
+
+RTDECL(int) RTAsn1Integer_DecodeAsn1(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1INTEGER pThis, const char *pszErrorTag)
+{
+ pThis->uValue.u = 0;
+ int rc = RTAsn1CursorReadHdr(pCursor, &pThis->Asn1Core, pszErrorTag);
+ if (RT_SUCCESS(rc))
+ {
+ rc = RTAsn1CursorMatchTagClassFlags(pCursor, &pThis->Asn1Core, ASN1_TAG_INTEGER,
+ ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_PRIMITIVE,
+ fFlags, pszErrorTag, "INTEGER");
+ if (RT_SUCCESS(rc))
+ {
+ uint32_t offLast = pThis->Asn1Core.cb - 1;
+ switch (pThis->Asn1Core.cb)
+ {
+ default:
+ case 8: pThis->uValue.u |= (uint64_t)pThis->Asn1Core.uData.pu8[offLast - 7] << 56;
+ case 7: pThis->uValue.u |= (uint64_t)pThis->Asn1Core.uData.pu8[offLast - 6] << 48;
+ case 6: pThis->uValue.u |= (uint64_t)pThis->Asn1Core.uData.pu8[offLast - 5] << 40;
+ case 5: pThis->uValue.u |= (uint64_t)pThis->Asn1Core.uData.pu8[offLast - 4] << 32;
+ case 4: pThis->uValue.u |= (uint32_t)pThis->Asn1Core.uData.pu8[offLast - 3] << 24;
+ case 3: pThis->uValue.u |= (uint32_t)pThis->Asn1Core.uData.pu8[offLast - 2] << 16;
+ case 2: pThis->uValue.u |= (uint16_t)pThis->Asn1Core.uData.pu8[offLast - 1] << 8;
+ case 1: pThis->uValue.u |= pThis->Asn1Core.uData.pu8[offLast];
+ }
+ RTAsn1CursorSkip(pCursor, pThis->Asn1Core.cb);
+ pThis->Asn1Core.fFlags |= RTASN1CORE_F_PRIMITE_TAG_STRUCT;
+ pThis->Asn1Core.pOps = &g_RTAsn1Integer_Vtable;
+ return VINF_SUCCESS;
+ }
+ }
+ return rc;
+}
+
+
+/*
+ * Generate code for the associated collection types.
+ */
+#define RTASN1TMPL_TEMPLATE_FILE "../common/asn1/asn1-ut-integer-template.h"
+#include <iprt/asn1-generator-internal-header.h>
+#include <iprt/asn1-generator-asn1-decoder.h>
+
diff --git a/src/VBox/Runtime/common/asn1/asn1-ut-integer-template.h b/src/VBox/Runtime/common/asn1/asn1-ut-integer-template.h
new file mode 100644
index 00000000000..d815c0ceebb
--- /dev/null
+++ b/src/VBox/Runtime/common/asn1/asn1-ut-integer-template.h
@@ -0,0 +1,45 @@
+/* $Id$ */
+/** @file
+ * IPRT - ASN.1, INTEGER Type, Collection Type Template.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+#define RTASN1TMPL_DECL RTDECL
+
+#define RTASN1TMPL_TYPE RTASN1SEQOFINTEGERS
+#define RTASN1TMPL_EXT_NAME RTAsn1SeqOfIntegers
+#define RTASN1TMPL_INT_NAME rtAsn1SeqOfIntegers
+RTASN1TMPL_SEQ_OF(RTASN1INTEGER, RTAsn1Integer);
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+#define RTASN1TMPL_TYPE RTASN1SETOFINTEGERS
+#define RTASN1TMPL_EXT_NAME RTAsn1SetOfIntegers
+#define RTASN1TMPL_INT_NAME rtAsn1SetOfIntegers
+RTASN1TMPL_SET_OF(RTASN1INTEGER, RTAsn1Integer);
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
diff --git a/src/VBox/Runtime/common/asn1/asn1-ut-integer.cpp b/src/VBox/Runtime/common/asn1/asn1-ut-integer.cpp
new file mode 100644
index 00000000000..36f4df9a44e
--- /dev/null
+++ b/src/VBox/Runtime/common/asn1/asn1-ut-integer.cpp
@@ -0,0 +1,451 @@
+/* $Id$ */
+/** @file
+ * IPRT - ASN.1, INTEGER Type.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/asn1.h>
+
+#include <iprt/bignum.h>
+#include <iprt/err.h>
+#include <iprt/string.h>
+
+#include <iprt/formats/asn1.h>
+
+
+/*******************************************************************************
+* Global Variables *
+*******************************************************************************/
+/** Fixed on-byte constants for small numbers.
+ * Good for structure version values and such. */
+static const uint8_t g_abSmall[] =
+{
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
+ 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
+};
+
+
+
+/*
+ * ASN.1 INTEGER - Special Methods.
+ */
+
+
+/**
+ * Updates the native value we keep in RTASN1INTEGER::uValue.
+ *
+ * @param pThis The integer.
+ */
+static void rtAsn1Integer_UpdateNativeValue(PRTASN1INTEGER pThis)
+{
+ uint32_t offLast = pThis->Asn1Core.cb - 1;
+ switch (pThis->Asn1Core.cb)
+ {
+ default:
+ case 8: pThis->uValue.u |= (uint64_t)pThis->Asn1Core.uData.pu8[offLast - 7] << 56;
+ case 7: pThis->uValue.u |= (uint64_t)pThis->Asn1Core.uData.pu8[offLast - 6] << 48;
+ case 6: pThis->uValue.u |= (uint64_t)pThis->Asn1Core.uData.pu8[offLast - 5] << 40;
+ case 5: pThis->uValue.u |= (uint64_t)pThis->Asn1Core.uData.pu8[offLast - 4] << 32;
+ case 4: pThis->uValue.u |= (uint32_t)pThis->Asn1Core.uData.pu8[offLast - 3] << 24;
+ case 3: pThis->uValue.u |= (uint32_t)pThis->Asn1Core.uData.pu8[offLast - 2] << 16;
+ case 2: pThis->uValue.u |= (uint16_t)pThis->Asn1Core.uData.pu8[offLast - 1] << 8;
+ case 1: pThis->uValue.u |= pThis->Asn1Core.uData.pu8[offLast];
+ }
+}
+
+
+RTDECL(int) RTAsn1Integer_InitU64(PRTASN1INTEGER pThis, uint64_t uValue, PCRTASN1ALLOCATORVTABLE pAllocator)
+{
+ /*
+ * Initialize the core and the native value.
+ */
+ RTAsn1Core_InitEx(&pThis->Asn1Core,
+ ASN1_TAG_INTEGER,
+ ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_PRIMITIVE,
+ &g_RTAsn1Integer_Vtable,
+ RTASN1CORE_F_PRESENT | RTASN1CORE_F_PRIMITE_TAG_STRUCT);
+ pThis->uValue.u = uValue;
+
+ /*
+ * Use one of the constants if possible.
+ */
+ if (uValue < RT_ELEMENTS(g_abSmall))
+ {
+ pThis->Asn1Core.cb = 1;
+ pThis->Asn1Core.uData.pv = (void *)&g_abSmall[0];
+ }
+ else
+ {
+ /*
+ * Need to turn uValue into a big endian number without any
+ * unnecessary leading zero bytes.
+ */
+ /* Figure the size. */
+ uint32_t cb = 0;
+ if (uValue <= UINT32_MAX)
+ {
+ if (uValue <= UINT16_MAX)
+ {
+ if (uValue <= UINT8_MAX)
+ cb = 1;
+ else
+ cb = 2;
+ }
+ else
+ {
+ if (uValue <= UINT32_C(0xffffff))
+ cb = 3;
+ else
+ cb = 4;
+ }
+ }
+ else
+ {
+ if (uValue <= UINT64_C(0x0000FfffFfffFfff))
+ {
+ if (uValue <= UINT64_C(0x000000ffFfffFfff))
+ cb = 5;
+ else
+ cb = 6;
+ }
+ else
+ {
+ if (uValue <= UINT64_C(0x00ffFfffFfffFfff))
+ cb = 7;
+ else
+ cb = 8;
+ }
+ }
+
+ /* Allocate space. */
+ int rc = RTAsn1ContentAllocZ(&pThis->Asn1Core, cb, pAllocator);
+ if (RT_FAILURE(rc))
+ {
+ RT_ZERO(*pThis);
+ return rc;
+ }
+
+ /* Serialize the number in MSB order. */
+ uint8_t *pb = (uint8_t *)pThis->Asn1Core.uData.pu8;
+ while (cb-- > 0)
+ {
+ pb[cb] = (uint8_t)uValue;
+ uValue >>= 8;
+ }
+ Assert(uValue == 0);
+ }
+ return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTAsn1Integer_InitDefault(PRTASN1INTEGER pThis, uint64_t uValue, PCRTASN1ALLOCATORVTABLE pAllocator)
+{
+ int rc = RTAsn1Integer_InitU64(pThis, uValue, pAllocator);
+ if (RT_SUCCESS(rc))
+ {
+ pThis->Asn1Core.fFlags &= ~RTASN1CORE_F_PRESENT;
+ pThis->Asn1Core.fFlags |= RTASN1CORE_F_DEFAULT;
+ }
+ return rc;
+}
+
+
+RTDECL(int32_t) RTAsn1Integer_UnsignedLastBit(PCRTASN1INTEGER pThis)
+{
+ AssertReturn(pThis->Asn1Core.fFlags, -1);
+ uint8_t const *pb = pThis->Asn1Core.uData.pu8;
+ AssertReturn(pb, -1);
+ uint32_t cb = pThis->Asn1Core.cb;
+ AssertReturn(pThis->Asn1Core.cb < (uint32_t)INT32_MAX / 8, -1);
+
+ while (cb-- > 0)
+ {
+ uint8_t b = *pb++;
+ if (b)
+ {
+ int32_t iRet = cb * 8;
+ if (b & 0x80) iRet += 7;
+ else if (b & 0x40) iRet += 6;
+ else if (b & 0x20) iRet += 5;
+ else if (b & 0x10) iRet += 4;
+ else if (b & 0x08) iRet += 3;
+ else if (b & 0x04) iRet += 2;
+ else if (b & 0x02) iRet += 1;
+ else Assert(b == 0x01);
+ return iRet;
+ }
+ }
+ return -1;
+}
+
+
+RTDECL(int) RTAsn1Integer_UnsignedCompare(PCRTASN1INTEGER pLeft, PCRTASN1INTEGER pRight)
+{
+ Assert(pLeft && (!RTAsn1Integer_IsPresent(pLeft) || pLeft->Asn1Core.pOps == &g_RTAsn1Integer_Vtable));
+ Assert(pRight && (!RTAsn1Integer_IsPresent(pRight) || pRight->Asn1Core.pOps == &g_RTAsn1Integer_Vtable));
+
+ int iDiff;
+ if (RTAsn1Integer_IsPresent(pLeft))
+ {
+ if (RTAsn1Integer_IsPresent(pRight))
+ {
+ if ( pLeft->Asn1Core.cb > 8
+ || pRight->Asn1Core.cb > 8)
+ {
+ uint32_t iLeft = RTAsn1Integer_UnsignedLastBit(pLeft);
+ uint32_t iRight = RTAsn1Integer_UnsignedLastBit(pRight);
+ if (iLeft != iRight)
+ return iLeft < iRight ? -1 : 1;
+
+ uint32_t i = iLeft / 8;
+ if (i > 8)
+ {
+ uint8_t const *pbLeft = &pLeft->Asn1Core.uData.pu8[pLeft->Asn1Core.cb - i - 1];
+ uint8_t const *pbRight = &pRight->Asn1Core.uData.pu8[pRight->Asn1Core.cb - i - 1];
+ for (;;)
+ {
+ if (*pbLeft != *pbRight)
+ return *pbLeft < *pbRight ? -1 : 1;
+ if (--i <= 8)
+ break;
+ pbLeft++;
+ pbRight++;
+ }
+ }
+ }
+
+ if (pLeft->uValue.u == pRight->uValue.u)
+ iDiff = 0;
+ else
+ iDiff = pLeft->uValue.u < pRight->uValue.u ? -1 : 1;
+ }
+ else
+ iDiff = -1;
+ }
+ else
+ iDiff = 0 - (int)RTAsn1Integer_IsPresent(pRight);
+ return iDiff;
+}
+
+
+RTDECL(int) RTAsn1Integer_UnsignedCompareWithU64(PCRTASN1INTEGER pThis, uint64_t u64Const)
+{
+ int iDiff;
+ if (RTAsn1Integer_IsPresent(pThis))
+ {
+ if (pThis->Asn1Core.cb > 8)
+ {
+ int32_t iLast = RTAsn1Integer_UnsignedLastBit(pThis);
+ if (iLast >= 64)
+ return 1;
+ }
+
+ if (pThis->uValue.u == u64Const)
+ iDiff = 0;
+ else
+ iDiff = pThis->uValue.u < u64Const ? -1 : 1;
+ }
+ else
+ iDiff = 1;
+ return iDiff;
+}
+
+
+RTDECL(int) RTAsn1Integer_UnsignedCompareWithU32(PCRTASN1INTEGER pThis, uint32_t u32Const)
+{
+ int iDiff;
+ if (RTAsn1Integer_IsPresent(pThis))
+ {
+ if (pThis->Asn1Core.cb > 8)
+ {
+ int32_t iLast = RTAsn1Integer_UnsignedLastBit(pThis);
+ if (iLast >= 32)
+ return 1;
+ }
+
+ if (pThis->uValue.u == u32Const)
+ iDiff = 0;
+ else
+ iDiff = pThis->uValue.u < u32Const ? -1 : 1;
+ }
+ else
+ iDiff = 1;
+ return iDiff;
+}
+
+
+RTDECL(int) RTAsn1Integer_ToBigNum(PCRTASN1INTEGER pThis, PRTBIGNUM pBigNum, uint32_t fBigNumInit)
+{
+ AssertReturn(!(fBigNumInit & ~( RTBIGNUMINIT_F_SENSITIVE | RTBIGNUMINIT_F_UNSIGNED | RTBIGNUMINIT_F_SIGNED
+ | RTBIGNUMINIT_F_ENDIAN_LITTLE | RTBIGNUMINIT_F_ENDIAN_BIG)),
+ VERR_INVALID_PARAMETER);
+ AssertReturn(RTAsn1Integer_IsPresent(pThis), VERR_INVALID_PARAMETER);
+
+ if (!(fBigNumInit & (RTBIGNUMINIT_F_UNSIGNED | RTBIGNUMINIT_F_SIGNED)))
+ fBigNumInit |= RTBIGNUMINIT_F_SIGNED;
+
+ if (!(fBigNumInit & (RTBIGNUMINIT_F_ENDIAN_BIG | RTBIGNUMINIT_F_ENDIAN_LITTLE)))
+ fBigNumInit |= RTBIGNUMINIT_F_ENDIAN_BIG;
+
+ return RTBigNumInit(pBigNum, fBigNumInit, pThis->Asn1Core.uData.pv, pThis->Asn1Core.cb);
+}
+
+
+RTDECL(int) RTAsn1Integer_FromBigNum(PRTASN1INTEGER pThis, PCRTBIGNUM pBigNum, PCRTASN1ALLOCATORVTABLE pAllocator)
+{
+ AssertPtr(pThis); AssertPtr(pBigNum); AssertPtr(pAllocator);
+
+ /* Be nice and auto init the object. */
+ if (!RTAsn1Integer_IsPresent(pThis))
+ RTAsn1Integer_Init(pThis, NULL);
+
+ uint32_t cb = RTBigNumByteWidth(pBigNum); Assert(cb > 0);
+ int rc = RTAsn1ContentReallocZ(&pThis->Asn1Core, cb, pAllocator);
+ if (RT_SUCCESS(rc))
+ {
+ Assert(cb == pThis->Asn1Core.cb);
+ rc = RTBigNumToBytesBigEndian(pBigNum, (void *)pThis->Asn1Core.uData.pv, cb);
+ if (RT_SUCCESS(rc))
+ rtAsn1Integer_UpdateNativeValue(pThis);
+ }
+ return rc;
+}
+
+
+
+/*
+ * ASN.1 INTEGER - Standard Methods.
+ */
+
+RT_DECL_DATA_CONST(RTASN1COREVTABLE const) g_RTAsn1Integer_Vtable =
+{
+ "RTAsn1Integer",
+ sizeof(RTASN1INTEGER),
+ ASN1_TAG_INTEGER,
+ ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_PRIMITIVE,
+ 0,
+ (PFNRTASN1COREVTDTOR)RTAsn1Integer_Delete,
+ NULL,
+ (PFNRTASN1COREVTCLONE)RTAsn1Integer_Clone,
+ (PFNRTASN1COREVTCOMPARE)RTAsn1Integer_Compare,
+ (PFNRTASN1COREVTCHECKSANITY)RTAsn1Integer_CheckSanity,
+ NULL,
+ NULL
+};
+
+
+RTDECL(int) RTAsn1Integer_Init(PRTASN1INTEGER pThis, PCRTASN1ALLOCATORVTABLE pAllocator)
+{
+ RTAsn1Core_InitEx(&pThis->Asn1Core,
+ ASN1_TAG_INTEGER,
+ ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_PRIMITIVE,
+ &g_RTAsn1Integer_Vtable,
+ RTASN1CORE_F_PRESENT | RTASN1CORE_F_PRIMITE_TAG_STRUCT);
+ pThis->uValue.u = 1;
+ pThis->Asn1Core.cb = 1;
+ pThis->Asn1Core.uData.pv = (void *)&g_abSmall[0];
+ return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTAsn1Integer_Clone(PRTASN1INTEGER pThis, PCRTASN1INTEGER pSrc, PCRTASN1ALLOCATORVTABLE pAllocator)
+{
+ AssertPtr(pSrc); AssertPtr(pThis); AssertPtr(pAllocator);
+ RT_ZERO(*pThis);
+ if (RTAsn1Integer_IsPresent(pSrc))
+ {
+ AssertReturn(pSrc->Asn1Core.pOps == &g_RTAsn1Integer_Vtable, VERR_INTERNAL_ERROR_3);
+
+ int rc;
+ if ( pSrc->Asn1Core.cb != 1
+ || pSrc->uValue.u >= RT_ELEMENTS(g_abSmall))
+ {
+ /* Value is too large, copy it. */
+ rc = RTAsn1Core_CloneContent(&pThis->Asn1Core, &pSrc->Asn1Core, pAllocator);
+ if (RT_FAILURE(rc))
+ return rc;
+ }
+ else
+ {
+ /* Use one of the const values. */
+ rc = RTAsn1Core_CloneNoContent(&pThis->Asn1Core, &pSrc->Asn1Core);
+ if (RT_FAILURE(rc))
+ return rc;
+ Assert(g_abSmall[pSrc->uValue.u] == pSrc->uValue.u);
+ pThis->Asn1Core.uData.pv = (void *)&g_abSmall[pSrc->uValue.u];
+ }
+ pThis->uValue.u = pSrc->uValue.u;
+ }
+ return VINF_SUCCESS;
+}
+
+
+RTDECL(void) RTAsn1Integer_Delete(PRTASN1INTEGER pThis)
+{
+ if ( pThis
+ && RTAsn1Integer_IsPresent(pThis))
+ {
+ Assert(pThis->Asn1Core.pOps == &g_RTAsn1Integer_Vtable);
+
+ RTAsn1ContentFree(&pThis->Asn1Core);
+ RT_ZERO(*pThis);
+ }
+}
+
+
+RTDECL(int) RTAsn1Integer_Enum(PRTASN1INTEGER pThis, PFNRTASN1ENUMCALLBACK pfnCallback, uint32_t uDepth, void *pvUser)
+{
+ Assert(pThis && (!RTAsn1Integer_IsPresent(pThis) || pThis->Asn1Core.pOps == &g_RTAsn1Integer_Vtable));
+
+ /* No children to enumerate. */
+ return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTAsn1Integer_Compare(PCRTASN1INTEGER pLeft, PCRTASN1INTEGER pRight)
+{
+ return RTAsn1Integer_UnsignedCompare(pLeft, pRight);
+}
+
+
+RTDECL(int) RTAsn1Integer_CheckSanity(PCRTASN1INTEGER pThis, uint32_t fFlags, PRTERRINFO pErrInfo, const char *pszErrorTag)
+{
+ if (RT_UNLIKELY(!RTAsn1Integer_IsPresent(pThis)))
+ return RTErrInfoSetF(pErrInfo, VERR_ASN1_NOT_PRESENT, "%s: Missing (INTEGER).", pszErrorTag);
+ return VINF_SUCCESS;
+}
+
+
+/*
+ * Generate code for the associated collection types.
+ */
+#define RTASN1TMPL_TEMPLATE_FILE "../common/asn1/asn1-ut-integer-template.h"
+#include <iprt/asn1-generator-internal-header.h>
+#include <iprt/asn1-generator-core.h>
+#include <iprt/asn1-generator-init.h>
+#include <iprt/asn1-generator-sanity.h>
+
diff --git a/src/VBox/Runtime/common/asn1/asn1-ut-null-decode.cpp b/src/VBox/Runtime/common/asn1/asn1-ut-null-decode.cpp
new file mode 100644
index 00000000000..990f696999d
--- /dev/null
+++ b/src/VBox/Runtime/common/asn1/asn1-ut-null-decode.cpp
@@ -0,0 +1,61 @@
+/* $Id$ */
+/** @file
+ * IPRT - ASN.1, NULL type, Decoding.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/asn1.h>
+
+#include <iprt/err.h>
+#include <iprt/string.h>
+
+#include <iprt/formats/asn1.h>
+
+
+RTDECL(int) RTAsn1Null_DecodeAsn1(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1NULL pThis, const char *pszErrorTag)
+{
+ int rc = RTAsn1CursorReadHdr(pCursor, &pThis->Asn1Core, pszErrorTag);
+ if (RT_SUCCESS(rc))
+ {
+ rc = RTAsn1CursorMatchTagClassFlags(pCursor, &pThis->Asn1Core, ASN1_TAG_NULL,
+ ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_PRIMITIVE, fFlags, pszErrorTag, "NULL");
+ if (RT_SUCCESS(rc))
+ {
+ if (pThis->Asn1Core.cb == 0)
+ {
+ pThis->Asn1Core.fFlags |= RTASN1CORE_F_PRIMITE_TAG_STRUCT;
+ pThis->Asn1Core.pOps = &g_RTAsn1Null_Vtable;
+ return VINF_SUCCESS;
+ }
+
+ rc = RTAsn1CursorSetInfo(pCursor, VERR_ASN1_INVALID_NULL_ENCODING,
+ "%s: Expected NULL object to have zero length: %#x", pszErrorTag, pThis->Asn1Core.cb);
+ }
+ }
+ return rc;
+}
+
diff --git a/src/VBox/Runtime/common/asn1/asn1-ut-null.cpp b/src/VBox/Runtime/common/asn1/asn1-ut-null.cpp
new file mode 100644
index 00000000000..273e7dfbea5
--- /dev/null
+++ b/src/VBox/Runtime/common/asn1/asn1-ut-null.cpp
@@ -0,0 +1,127 @@
+/* $Id$ */
+/** @file
+ * IPRT - ASN.1, NULL type.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/asn1.h>
+
+#include <iprt/err.h>
+#include <iprt/string.h>
+
+#include <iprt/formats/asn1.h>
+
+
+/*
+ * ASN.1 NULL - Special Methods.
+ */
+
+
+/*
+ * ASN.1 NULL - Standard Methods.
+ */
+
+
+RT_DECL_DATA_CONST(RTASN1COREVTABLE const) g_RTAsn1Null_Vtable =
+{
+ "RTAsn1Null",
+ sizeof(RTASN1NULL),
+ ASN1_TAG_NULL,
+ ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_PRIMITIVE,
+ 0,
+ (PFNRTASN1COREVTDTOR)RTAsn1Null_Delete,
+ (PFNRTASN1COREVTENUM)RTAsn1Null_Enum,
+ (PFNRTASN1COREVTCLONE)RTAsn1Null_Clone,
+ (PFNRTASN1COREVTCOMPARE)RTAsn1Null_Compare,
+ (PFNRTASN1COREVTCHECKSANITY)RTAsn1Null_CheckSanity,
+ NULL,
+ NULL
+};
+
+
+RTDECL(int) RTAsn1Null_Init(PRTASN1NULL pThis, PCRTASN1ALLOCATORVTABLE pAllocator)
+{
+ return RTAsn1Core_InitEx(&pThis->Asn1Core, ASN1_TAG_NULL, ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_PRIMITIVE,
+ &g_RTAsn1Null_Vtable, RTASN1CORE_F_PRESENT | RTASN1CORE_F_PRIMITE_TAG_STRUCT);
+}
+
+
+RTDECL(int) RTAsn1Null_Clone(PRTASN1NULL pThis, PCRTASN1NULL pSrc, PCRTASN1ALLOCATORVTABLE pAllocator)
+{
+ AssertPtr(pSrc); AssertPtr(pThis); AssertPtr(pAllocator);
+ RT_ZERO(*pThis);
+ if (RTAsn1Null_IsPresent(pSrc))
+ {
+ AssertReturn(pSrc->Asn1Core.pOps == &g_RTAsn1Null_Vtable, VERR_INTERNAL_ERROR_3);
+ AssertReturn(pSrc->Asn1Core.cb == 0, VERR_INTERNAL_ERROR_4);
+
+ int rc = RTAsn1Core_CloneNoContent(&pThis->Asn1Core, &pSrc->Asn1Core);
+ if (RT_FAILURE(rc))
+ return rc;
+ }
+ return VINF_SUCCESS;
+}
+
+
+RTDECL(void) RTAsn1Null_Delete(PRTASN1NULL pThis)
+{
+ if ( pThis
+ && RTAsn1Null_IsPresent(pThis))
+ {
+ Assert(pThis->Asn1Core.pOps == &g_RTAsn1Null_Vtable);
+ RT_ZERO(*pThis);
+ }
+}
+
+
+RTDECL(int) RTAsn1Null_Enum(PRTASN1NULL pThis, PFNRTASN1ENUMCALLBACK pfnCallback, uint32_t uDepth, void *pvUser)
+{
+ Assert(pThis && (!RTAsn1Null_IsPresent(pThis) || pThis->Asn1Core.pOps == &g_RTAsn1Null_Vtable));
+
+ /* No children to enumerate. */
+ return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTAsn1Null_Compare(PCRTASN1NULL pLeft, PCRTASN1NULL pRight)
+{
+ Assert(pLeft && (!RTAsn1Null_IsPresent(pLeft) || pLeft->Asn1Core.pOps == &g_RTAsn1Null_Vtable));
+ Assert(pRight && (!RTAsn1Null_IsPresent(pRight) || pRight->Asn1Core.pOps == &g_RTAsn1Null_Vtable));
+
+ return (int)RTAsn1Null_IsPresent(pLeft) - (int)RTAsn1Null_IsPresent(pRight);
+}
+
+
+RTDECL(int) RTAsn1Null_CheckSanity(PCRTASN1NULL pThis, uint32_t fFlags, PRTERRINFO pErrInfo, const char *pszErrorTag)
+{
+ if (RT_UNLIKELY(!RTAsn1Null_IsPresent(pThis)))
+ return RTErrInfoSetF(pErrInfo, VERR_ASN1_NOT_PRESENT, "%s: Missing (NULL).", pszErrorTag);
+ return VINF_SUCCESS;
+}
+
+/* No NULL object collections. */
+
diff --git a/src/VBox/Runtime/common/asn1/asn1-ut-objid-decode.cpp b/src/VBox/Runtime/common/asn1/asn1-ut-objid-decode.cpp
new file mode 100644
index 00000000000..b5648d168f8
--- /dev/null
+++ b/src/VBox/Runtime/common/asn1/asn1-ut-objid-decode.cpp
@@ -0,0 +1,362 @@
+/* $Id$ */
+/** @file
+ * IPRT - ASN.1, OBJECT IDENTIFIER Type, Decoder.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/asn1.h>
+
+#include <iprt/alloca.h>
+#include <iprt/err.h>
+#include <iprt/string.h>
+#include <iprt/ctype.h>
+
+#include <iprt/formats/asn1.h>
+
+
+/*******************************************************************************
+* Global Variables *
+*******************************************************************************/
+static char const g_achDigits[11] = "0123456789";
+
+
+/*******************************************************************************
+* Internal Functions *
+*******************************************************************************/
+DECLHIDDEN(int) rtAsn1ObjId_InternalFormatComponent(uint32_t uValue, char **ppszObjId, size_t *pcbObjId); /* asn1-ut-objid.cpp */
+
+
+/**
+ * Internal worker for RTAsn1ObjId_DecodeAsn1 that formats a component, with a
+ * leading dot.
+ *
+ * @returns VBox status code (caller complains on failure).
+ * @param uValue The component ID value.
+ * @param ppszObjId Pointer to the output buffer pointer.
+ * @param pcbObjId Pointer to the remaining size of the output buffer.
+ */
+DECLHIDDEN(int) rtAsn1ObjId_InternalFormatComponent(uint32_t uValue, char **ppszObjId, size_t *pcbObjId)
+{
+ /*
+ * Format the number backwards.
+ */
+ char szTmp[32];
+ char *psz = &szTmp[sizeof(szTmp) - 1];
+ *psz = '\0';
+
+ do
+ {
+ *--psz = g_achDigits[uValue % 10];
+ uValue /= 10;
+ } while (uValue > 0);
+
+ /*
+ * Do we have enough space?
+ * We add a dot and save space for the terminator.
+ */
+ size_t cchNeeded = &szTmp[sizeof(szTmp) - 1] - psz;
+ if (1 + cchNeeded < *pcbObjId)
+ {
+ *pcbObjId -= cchNeeded + 1;
+ char *pszObjId = *ppszObjId;
+ *ppszObjId = pszObjId + cchNeeded + 1;
+
+ *pszObjId = '.';
+ memcpy(pszObjId + 1, psz, cchNeeded);
+ return VINF_SUCCESS;
+ }
+
+ AssertFailed();
+ return VERR_ASN1_OBJID_TOO_LONG_STRING_FORM;
+}
+
+
+/**
+ * Reads one object ID component, returning it's value and encoded length.
+ *
+ * @returns The encoded length (positive) on success, negative IPRT status code
+ * on failure.
+ * @param pbContent The start of the component to parse.
+ * @param cbContent The number of content bytes left.
+ * @param puValue Where to return the value.
+ */
+static int rtAsn1ObjId_ReadComponent(uint8_t const *pbContent, uint32_t cbContent, uint32_t *puValue)
+{
+ if (cbContent >= 1)
+ {
+ /* The first byte. */
+ uint8_t b = *pbContent;
+ if (!(b & 0x80))
+ {
+ *puValue = b;
+ return 1;
+ }
+
+ /* Encoded as more than one byte. Make sure that it's efficently
+ encoded as 8.19.2 indicates it must. */
+ if (b != 0x80)
+ {
+ uint32_t off = 1;
+ uint32_t uValue = b & 0x7f;
+ while (off < cbContent)
+ {
+ b = pbContent[off++];
+ uValue <<= 7;
+ uValue |= b & 0x7f;
+ if (!(b & 0x80))
+ {
+ *puValue = uValue;
+ return (int)off;
+ }
+
+ if (RT_UNLIKELY(uValue & UINT32_C(0x0e000000)))
+ return VERR_ASN1_OBJID_COMPONENT_TOO_BIG;
+ }
+ }
+ return VERR_ASN1_INVALID_OBJID_ENCODING;
+ }
+ return VERR_NO_DATA;
+}
+
+
+/**
+ * This function parses the binary content of an OBJECT IDENTIFIER, check the
+ * encoding as well as calculating the storage requirements.
+ *
+ * @returns IPRT status code
+ * @param pbContent Pointer to the content.
+ * @param cbContent The length of the content.
+ * @param pCursor The cursor (for error reporting).
+ * @param pszErrorTag The error tag.
+ * @param pcComponents Where to return the component count.
+ * @param pcchObjId Where to return the length of the dotted string
+ * representation.
+ */
+static int rtAsn1ObjId_PreParse(uint8_t const *pbContent, uint32_t cbContent, PRTASN1CURSOR pCursor, const char *pszErrorTag,
+ uint8_t *pcComponents, uint8_t *pcchObjId)
+{
+ int rc;
+ if (cbContent >= 1 && cbContent < _1K)
+ {
+ /*
+ * Decode the first two numbers. Monkey business: X*40 + Y
+ * Where X is the first number, X in {0,1,2}, and Y is the second
+ * one. The range of Y is {0,...,39} for X in {0,1}, but has a
+ * free range for X = 2.
+ */
+ uint32_t cComponents = 1;
+ uint32_t uValue;
+ rc = rtAsn1ObjId_ReadComponent(pbContent, cbContent, &uValue);
+ if (rc > 0)
+ {
+ uint32_t cchObjId = 1;
+ uValue = uValue < 2*40 ? uValue % 40 : uValue - 2*40; /* Y */
+ do
+ {
+ cComponents++;
+
+ /* Figure the encoded string length, binary search fashion. */
+ if (uValue < 10000)
+ {
+ if (uValue < 100)
+ {
+ if (uValue < 10)
+ cchObjId += 1 + 1;
+ else
+ cchObjId += 1 + 2;
+ }
+ else
+ {
+ if (uValue < 1000)
+ cchObjId += 1 + 3;
+ else
+ cchObjId += 1 + 4;
+ }
+ }
+ else
+ {
+ if (uValue < 1000000)
+ {
+ if (uValue < 100000)
+ cchObjId += 1 + 5;
+ else
+ cchObjId += 1 + 6;
+ }
+ else
+ {
+ if (uValue < 10000000)
+ cchObjId += 1 + 7;
+ else if (uValue < 100000000)
+ cchObjId += 1 + 8;
+ else
+ cchObjId += 1 + 9;
+ }
+ }
+
+ /* advance. */
+ pbContent += rc;
+ cbContent -= rc;
+ if (!cbContent)
+ {
+ if (cComponents < 128)
+ {
+ if (cchObjId < RT_SIZEOFMEMB(RTASN1OBJID, szObjId))
+ {
+ *pcComponents = cComponents;
+ *pcchObjId = cchObjId;
+ return VINF_SUCCESS;
+ }
+ return RTAsn1CursorSetInfo(pCursor, VERR_ASN1_OBJID_TOO_LONG_STRING_FORM,
+ "Object ID has a too long string form: %#x (max %#x)",
+ cchObjId, RT_SIZEOFMEMB(RTASN1OBJID, szObjId));
+ }
+ return RTAsn1CursorSetInfo(pCursor, VERR_ASN1_OBJID_TOO_MANY_COMPONENTS,
+ "Object ID has too many components: %#x (max 127)", cComponents);
+ }
+
+ /* next */
+ rc = rtAsn1ObjId_ReadComponent(pbContent, cbContent, &uValue);
+ } while (rc > 0);
+ }
+ rc = RTAsn1CursorSetInfo(pCursor, rc, "Bad object ID component #%u encoding: %.*Rhxs",
+ cComponents, cbContent, pbContent);
+ }
+ else if (cbContent)
+ rc = RTAsn1CursorSetInfo(pCursor, VERR_ASN1_INVALID_OBJID_ENCODING, "Object ID content is loo long: %#x", cbContent);
+ else
+ rc = RTAsn1CursorSetInfo(pCursor, VERR_ASN1_INVALID_OBJID_ENCODING, "Zero length object ID content");
+ return rc;
+}
+
+
+
+RTDECL(int) RTAsn1ObjId_DecodeAsn1(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1OBJID pThis, const char *pszErrorTag)
+{
+ int rc = RTAsn1CursorReadHdr(pCursor, &pThis->Asn1Core, pszErrorTag);
+ if (RT_SUCCESS(rc))
+ {
+ rc = RTAsn1CursorMatchTagClassFlags(pCursor, &pThis->Asn1Core, ASN1_TAG_OID,
+ ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_PRIMITIVE, fFlags, pszErrorTag, "OID");
+ if (RT_SUCCESS(rc))
+ {
+ /*
+ * Validate and count things first.
+ */
+ uint8_t cComponents;
+ uint8_t cchObjId;
+ rc = rtAsn1ObjId_PreParse(pCursor->pbCur, pThis->Asn1Core.cb, pCursor, pszErrorTag, &cComponents, &cchObjId);
+ if (RT_SUCCESS(rc))
+ {
+ /*
+ * Allocate memory for the components array, either out of the
+ * string buffer or off the heap.
+ */
+ pThis->cComponents = cComponents;
+ RTAsn1CursorInitAllocation(pCursor, &pThis->Allocation);
+#if 0 /** @todo breaks with arrays of ObjIds or structs containing them. They get resized and repositioned in memory, thus invalidating the pointer. Add recall-pointers callback, or just waste memory? Or maybe make all arrays pointer-arrays? */
+ if (cComponents * sizeof(uint32_t) <= sizeof(pThis->szObjId) - cchObjId - 1)
+ pThis->pauComponents = (uint32_t *)&pThis->szObjId[sizeof(pThis->szObjId) - cComponents * sizeof(uint32_t)];
+ else
+#endif
+ rc = RTAsn1MemAllocZ(&pThis->Allocation, (void **)&pThis->pauComponents,
+ cComponents * sizeof(pThis->pauComponents[0]));
+ if (RT_SUCCESS(rc))
+ {
+ uint32_t *pauComponents = (uint32_t *)pThis->pauComponents;
+
+ /*
+ * Deal with the two first components first since they are
+ * encoded in a weird way to save a byte.
+ */
+ uint8_t const *pbContent = pCursor->pbCur;
+ uint32_t cbContent = pThis->Asn1Core.cb;
+ uint32_t uValue;
+ rc = rtAsn1ObjId_ReadComponent(pbContent, cbContent, &uValue); AssertRC(rc);
+ if (RT_SUCCESS(rc))
+ {
+ pbContent += rc;
+ cbContent -= rc;
+
+ if (uValue < 80)
+ {
+ pauComponents[0] = uValue / 40;
+ pauComponents[1] = uValue % 40;
+ }
+ else
+ {
+ pauComponents[0] = 2;
+ pauComponents[1] = uValue - 2*40;
+ }
+
+ char *pszObjId = &pThis->szObjId[0];
+ *pszObjId++ = g_achDigits[pauComponents[0]];
+ size_t cbObjIdLeft = cchObjId + 1 - 1;
+
+ rc = rtAsn1ObjId_InternalFormatComponent(pauComponents[1], &pszObjId, &cbObjIdLeft); AssertRC(rc);
+ if (RT_SUCCESS(rc))
+ {
+ /*
+ * The other components are encoded in less complicated manner.
+ */
+ for (uint32_t i = 2; i < cComponents; i++)
+ {
+ rc = rtAsn1ObjId_ReadComponent(pbContent, cbContent, &uValue);
+ AssertRCBreak(rc);
+ pbContent += rc;
+ cbContent -= rc;
+ pauComponents[i] = uValue;
+ rc = rtAsn1ObjId_InternalFormatComponent(uValue, &pszObjId, &cbObjIdLeft);
+ AssertRCBreak(rc);
+ }
+ if (RT_SUCCESS(rc))
+ {
+ Assert(cbObjIdLeft == 1);
+ *pszObjId = '\0';
+
+ RTAsn1CursorSkip(pCursor, pThis->Asn1Core.cb);
+ pThis->Asn1Core.fFlags |= RTASN1CORE_F_PRIMITE_TAG_STRUCT;
+ pThis->Asn1Core.pOps = &g_RTAsn1ObjId_Vtable;
+ return VINF_SUCCESS;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+
+
+/*
+ * Generate code for the associated collection types.
+ */
+#define RTASN1TMPL_TEMPLATE_FILE "../common/asn1/asn1-ut-objid-template.h"
+#include <iprt/asn1-generator-internal-header.h>
+#include <iprt/asn1-generator-asn1-decoder.h>
+
diff --git a/src/VBox/Runtime/common/asn1/asn1-ut-objid-template.h b/src/VBox/Runtime/common/asn1/asn1-ut-objid-template.h
new file mode 100644
index 00000000000..a62534dcec5
--- /dev/null
+++ b/src/VBox/Runtime/common/asn1/asn1-ut-objid-template.h
@@ -0,0 +1,45 @@
+/* $Id$ */
+/** @file
+ * IPRT - ASN.1, OBJECT IDENTIFIER Type, Collection Type Template.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+#define RTASN1TMPL_DECL RTDECL
+
+#define RTASN1TMPL_TYPE RTASN1SEQOFOBJIDS
+#define RTASN1TMPL_EXT_NAME RTAsn1SeqOfObjIds
+#define RTASN1TMPL_INT_NAME rtAsn1SeqOfObjIds
+RTASN1TMPL_SEQ_OF(RTASN1OBJID, RTAsn1ObjId);
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+#define RTASN1TMPL_TYPE RTASN1SETOFOBJIDS
+#define RTASN1TMPL_EXT_NAME RTAsn1SetOfObjIds
+#define RTASN1TMPL_INT_NAME rtAsn1SetOfObjIds
+RTASN1TMPL_SET_OF(RTASN1OBJID, RTAsn1ObjId);
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
diff --git a/src/VBox/Runtime/common/asn1/asn1-ut-objid.cpp b/src/VBox/Runtime/common/asn1/asn1-ut-objid.cpp
new file mode 100644
index 00000000000..583775b7de8
--- /dev/null
+++ b/src/VBox/Runtime/common/asn1/asn1-ut-objid.cpp
@@ -0,0 +1,537 @@
+/* $Id$ */
+/** @file
+ * IPRT - ASN.1, OBJECT IDENTIFIER Type.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/asn1.h>
+
+#include <iprt/alloca.h>
+#include <iprt/bignum.h>
+#include <iprt/ctype.h>
+#include <iprt/err.h>
+#include <iprt/string.h>
+#include <iprt/uni.h>
+
+#include <iprt/formats/asn1.h>
+
+
+/*******************************************************************************
+* Global Variables *
+*******************************************************************************/
+static char const g_szDefault[] = "2.16.840.1.113894";
+static uint32_t const g_auDefault[] = { 2, 16, 840, 1, 113894 };
+static uint8_t const g_abDefault[] =
+{
+ 2*40 + 16, 0x80 | (840 >> 7), 840 & 0x7f, 1, 0x80 | (113894 >> 14), 0x80 | ((113894 >> 7) & 0x7f), 113894 & 0x7f
+};
+
+
+/*******************************************************************************
+* Internal Functions *
+*******************************************************************************/
+DECLHIDDEN(int) rtAsn1ObjId_InternalFormatComponent(uint32_t uValue, char **ppszObjId, size_t *pcbObjId); /* asn1-ut-objid.cpp */
+/** @todo check if we really need this. */
+
+
+
+/*
+ * ASN.1 OBJECT IDENTIFIER - Special Methods.
+ */
+
+/**
+ * Encodes the ASN.1 byte sequence for a set of components.
+ *
+ * @returns IPRT status code.
+ * @param cComponents The number of components. Must be at least two.
+ * @param pauComponents The components array.
+ * @param pbEncoded The output buffer.
+ * @param pcbEncoded On input, this holds the size of the output buffer.
+ * On successful return it's the encoded size in bytes.
+ */
+static int rtAsn1ObjId_EncodeComponents(uint32_t cComponents, uint32_t const *pauComponents,
+ uint8_t *pbEncoded, uint32_t *pcbEncoded)
+{
+ uint8_t *pbCur = pbEncoded;
+ uint32_t cbLeft = *pcbEncoded;
+
+ /* The first two componets are encoded together to save a byte, so the loop
+ organization is a little special. */
+ AssertReturn(cComponents >= 2, VERR_ASN1_INTERNAL_ERROR_1);
+ AssertReturn(pauComponents[0] <= 2, VERR_ASN1_INTERNAL_ERROR_1);
+ AssertReturn(pauComponents[1] <= (pauComponents[0] < 2 ? 39 : UINT32_MAX - 80), VERR_ASN1_INTERNAL_ERROR_1);
+ uint32_t i = 1;
+ uint32_t uValue = pauComponents[0] * 40 + pauComponents[1];
+
+ for (;;)
+ {
+ if (uValue < 0x80)
+ {
+ if (RT_UNLIKELY(cbLeft < 1))
+ return VERR_BUFFER_OVERFLOW;
+ cbLeft -= 1;
+ *pbCur++ = (uint8_t)uValue;
+ }
+ else if (uValue < 0x4000)
+ {
+ if (RT_UNLIKELY(cbLeft < 2))
+ return VERR_BUFFER_OVERFLOW;
+ cbLeft -= 2;
+ pbCur[0] = (uValue >> 7) | 0x80;
+ pbCur[1] = uValue & 0x7f;
+ pbCur += 2;
+ }
+ else if (uValue < 0x200000)
+ {
+ if (RT_UNLIKELY(cbLeft < 3))
+ return VERR_BUFFER_OVERFLOW;
+ cbLeft -= 3;
+ pbCur[0] = (uValue >> 14) | 0x80;
+ pbCur[1] = ((uValue >> 7) & 0x7f) | 0x80;
+ pbCur[2] = uValue & 0x7f;
+ pbCur += 3;
+ }
+ else if (uValue < 0x10000000)
+ {
+ if (RT_UNLIKELY(cbLeft < 4))
+ return VERR_BUFFER_OVERFLOW;
+ cbLeft -= 4;
+ pbCur[0] = (uValue >> 21) | 0x80;
+ pbCur[1] = ((uValue >> 14) & 0x7f) | 0x80;
+ pbCur[2] = ((uValue >> 7) & 0x7f) | 0x80;
+ pbCur[3] = uValue & 0x7f;
+ pbCur += 4;
+ }
+ else
+ {
+ if (RT_UNLIKELY(cbLeft < 5))
+ return VERR_BUFFER_OVERFLOW;
+ cbLeft -= 5;
+ pbCur[0] = (uValue >> 28) | 0x80;
+ pbCur[1] = ((uValue >> 21) & 0x7f) | 0x80;
+ pbCur[2] = ((uValue >> 14) & 0x7f) | 0x80;
+ pbCur[3] = ((uValue >> 7) & 0x7f) | 0x80;
+ pbCur[4] = uValue & 0x7f;
+ pbCur += 5;
+ }
+
+ /* Advance / return. */
+ i++;
+ if (i >= cComponents)
+ {
+ *pcbEncoded = (uint32_t)(pbCur - pbEncoded);
+ return VINF_SUCCESS;
+ }
+ uValue = pauComponents[i];
+ }
+}
+
+
+RTDECL(int) RTAsn1ObjId_InitFromString(PRTASN1OBJID pThis, const char *pszObjId, PCRTASN1ALLOCATORVTABLE pAllocator)
+{
+ RT_ZERO(*pThis);
+
+ /*
+ * Check the string, counting the number of components and checking their validity.
+ */
+ size_t cbObjId = strlen(pszObjId) + 1;
+ AssertReturn(cbObjId < sizeof(pThis->szObjId), VERR_ASN1_OBJID_TOO_LONG_STRING_FORM);
+
+ const char *psz = pszObjId;
+
+ /* Special checking of the first component. It has only three valid values: 0,1,2. */
+ char ch = *psz++;
+ if (RT_UNLIKELY(ch < '0' || ch > '2'))
+ return VERR_ASN1_OBJID_INVALID_DOTTED_STRING;
+ char const chFirst = ch;
+ ch = *psz++;
+ if (RT_UNLIKELY(ch != '.'))
+ return VERR_ASN1_OBJID_INVALID_DOTTED_STRING;
+
+ /* The 2nd component. It the first is 0 or 1, it has a max of 39. */
+ uint32_t cComponents = 1;
+ if (chFirst < '2')
+ {
+ ch = *psz++;
+ if (*psz == '.')
+ {
+ if (RT_UNLIKELY(!RT_C_IS_DIGIT(ch)))
+ return VERR_ASN1_OBJID_INVALID_DOTTED_STRING;
+ }
+ else
+ {
+ if (RT_UNLIKELY(ch < '0' || ch > '3'))
+ return VERR_ASN1_OBJID_INVALID_DOTTED_STRING;
+ ch = *psz++;
+ if (RT_UNLIKELY(!RT_C_IS_DIGIT(ch)))
+ return VERR_ASN1_OBJID_INVALID_DOTTED_STRING;
+ if (*psz != '.')
+ return VERR_ASN1_OBJID_INVALID_DOTTED_STRING;
+ }
+ cComponents++;
+ }
+ else
+ psz--;
+
+ /* Subsequent components have max values of UINT32_MAX - 80. */
+ while ((ch = *psz++) != '\0')
+ {
+ if (RT_UNLIKELY(ch != '.'))
+ return VERR_ASN1_OBJID_INVALID_DOTTED_STRING;
+ const char *pszStart = psz;
+
+ /* Special treatment of the first digit. Need to make sure it isn't an
+ unnecessary leading 0. */
+ ch = *psz++;
+ if (RT_UNLIKELY(!RT_C_IS_DIGIT(ch)))
+ return VERR_ASN1_OBJID_INVALID_DOTTED_STRING;
+ if (RT_UNLIKELY(ch == '0' && RT_C_IS_DIGIT(*psz)))
+ return VERR_ASN1_OBJID_INVALID_DOTTED_STRING;
+
+ /* The rest of the digits. */
+ while ((ch = *psz) != '.' && ch != '\0')
+ {
+ if (RT_UNLIKELY(!RT_C_IS_DIGIT(ch)))
+ return VERR_ASN1_OBJID_INVALID_DOTTED_STRING;
+ psz++;
+ }
+
+ /* Check the value range. */
+ if (RT_UNLIKELY(psz - pszStart >= 9))
+ if ( psz - pszStart > 9
+ || strncmp(pszStart, "4294967216", 9) >= 0) /* 2^32 - 80 */
+ return VERR_ASN1_OBJID_INVALID_DOTTED_STRING;
+
+ cComponents++;
+ }
+
+ if (RT_UNLIKELY(cComponents >= 128))
+ return VERR_ASN1_OBJID_TOO_MANY_COMPONENTS;
+ pThis->cComponents = (uint8_t)cComponents;
+
+ /*
+ * Find space for the component array, either at the unused end of szObjId
+ * or on the heap.
+ */
+ int rc;
+ RTAsn1MemInitAllocation(&pThis->Allocation, pAllocator);
+#if 0 /** @todo breaks with arrays of ObjIds or structs containing them. They get resized and repositioned in memory, thus invalidating the pointer. Add recall-pointers callback, or just waste memory? Or maybe make all arrays pointer-arrays? */
+ size_t cbLeft = sizeof(pThis->szObjId) - cbObjId;
+ if (cbLeft >= cComponents * sizeof(uint32_t))
+ {
+ pThis->pauComponents = (uint32_t *)&pThis->szObjId[sizeof(pThis->szObjId) - cComponents * sizeof(uint32_t)];
+ cbLeft -= cComponents * sizeof(uint32_t);
+ rc = VINF_SUCCESS;
+ }
+ else
+#endif
+ rc = RTAsn1MemAllocZ(&pThis->Allocation, (void **)&pThis->pauComponents, cComponents * sizeof(uint32_t));
+ if (RT_SUCCESS(rc))
+ {
+ /*
+ * Fill the elements array.
+ */
+ uint32_t *pauComponents = (uint32_t *)pThis->pauComponents;
+ rc = VINF_SUCCESS;
+ psz = pszObjId;
+ for (uint32_t i = 0; i < cComponents; i++)
+ {
+ uint32_t uValue = 0;
+ rc = RTStrToUInt32Ex(psz, (char **)&psz, 10, &uValue);
+ if (rc == VWRN_TRAILING_CHARS)
+ {
+ pauComponents[i] = uValue;
+ AssertBreakStmt(*psz == '.', rc = VERR_TRAILING_CHARS);
+ psz++;
+ }
+ else if (rc == VINF_SUCCESS)
+ {
+ pauComponents[i] = uValue;
+ Assert(*psz == '\0');
+ }
+ else if (RT_FAILURE(rc))
+ break;
+ else
+ {
+ rc = -rc;
+ break;
+ }
+ }
+ if (rc == VINF_SUCCESS && *psz == '\0')
+ {
+ /*
+ * Initialize the core structure before we start on the encoded bytes.
+ */
+ RTAsn1Core_InitEx(&pThis->Asn1Core,
+ ASN1_TAG_OID,
+ ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_PRIMITIVE,
+ &g_RTAsn1ObjId_Vtable,
+ RTASN1CORE_F_PRESENT | RTASN1CORE_F_PRIMITE_TAG_STRUCT);
+
+ /*
+ * Encode the value into the string buffer. This will NOT overflow
+ * because the string representation is much less efficient than the
+ * binary ASN.1 representation (base-10 + separators vs. base-128).
+ */
+ pThis->Asn1Core.cb = (uint32_t)cbObjId;
+ rc = rtAsn1ObjId_EncodeComponents(cComponents, pThis->pauComponents,
+ (uint8_t *)&pThis->szObjId[0], &pThis->Asn1Core.cb);
+ if (RT_SUCCESS(rc))
+ {
+ /*
+ * Now, find a place for the encoded bytes. There might be
+ * enough room left in the szObjId for it if we're lucky.
+ */
+#if 0 /** @todo breaks with arrays of ObjIds or structs containing them. They get resized and repositioned in memory, thus invalidating the pointer. Add recall-pointers callback, or just waste memory? Or maybe make all arrays pointer-arrays? */
+ if (pThis->Asn1Core.cb >= cbLeft)
+ pThis->Asn1Core.uData.pv = memmove(&pThis->szObjId[cbObjId], &pThis->szObjId[0], pThis->Asn1Core.cb);
+ else
+#endif
+ rc = RTAsn1ContentDup(&pThis->Asn1Core, pThis->szObjId, pThis->Asn1Core.cb, pAllocator);
+ if (RT_SUCCESS(rc))
+ {
+ /*
+ * Finally, copy the dotted string.
+ */
+ memcpy(pThis->szObjId, pszObjId, cbObjId);
+ return VINF_SUCCESS;
+ }
+ }
+ else
+ {
+ AssertMsgFailed(("%Rrc\n", rc));
+ rc = VERR_ASN1_INTERNAL_ERROR_3;
+ }
+ }
+ else
+ rc = VERR_ASN1_OBJID_INVALID_DOTTED_STRING;
+ }
+ RT_ZERO(*pThis);
+ return rc;
+}
+
+
+RTDECL(int) RTAsn1ObjId_CompareWithString(PCRTASN1OBJID pThis, const char *pszRight)
+{
+ return strcmp(pThis->szObjId, pszRight);
+}
+
+
+RTDECL(bool) RTAsn1ObjId_StartsWith(PCRTASN1OBJID pThis, const char *pszStartsWith)
+{
+ size_t cchStartsWith = strlen(pszStartsWith);
+ return !strncmp(pThis->szObjId, pszStartsWith, cchStartsWith)
+ && ( pszStartsWith[cchStartsWith] == '.'
+ || pszStartsWith[cchStartsWith] == '\0');
+}
+
+
+RTDECL(uint8_t) RTAsn1ObjIdCountComponents(PCRTASN1OBJID pThis)
+{
+ return pThis->cComponents;
+}
+
+
+RTDECL(uint32_t) RTAsn1ObjIdGetComponentsAsUInt32(PCRTASN1OBJID pThis, uint8_t iComponent)
+{
+ if (iComponent < pThis->cComponents)
+ return pThis->pauComponents[iComponent];
+ return UINT32_MAX;
+}
+
+
+RTDECL(uint32_t) RTAsn1ObjIdGetLastComponentsAsUInt32(PCRTASN1OBJID pThis)
+{
+ return pThis->pauComponents[pThis->cComponents - 1];
+}
+
+
+/*
+ * ASN.1 OBJECT IDENTIFIER - Standard Methods.
+ */
+
+RT_DECL_DATA_CONST(RTASN1COREVTABLE const) g_RTAsn1ObjId_Vtable =
+{
+ "RTAsn1ObjId",
+ sizeof(RTASN1OBJID),
+ ASN1_TAG_OID,
+ ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_PRIMITIVE,
+ 0,
+ (PFNRTASN1COREVTDTOR)RTAsn1ObjId_Delete,
+ NULL,
+ (PFNRTASN1COREVTCLONE)RTAsn1ObjId_Clone,
+ (PFNRTASN1COREVTCOMPARE)RTAsn1ObjId_Compare,
+ (PFNRTASN1COREVTCHECKSANITY)RTAsn1ObjId_CheckSanity,
+ NULL,
+ NULL
+};
+
+
+RTDECL(int) RTAsn1ObjId_Init(PRTASN1OBJID pThis, PCRTASN1ALLOCATORVTABLE pAllocator)
+{
+ RTAsn1Core_InitEx(&pThis->Asn1Core,
+ ASN1_TAG_OID,
+ ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_PRIMITIVE,
+ &g_RTAsn1ObjId_Vtable,
+ RTASN1CORE_F_PRESENT | RTASN1CORE_F_PRIMITE_TAG_STRUCT);
+ pThis->Asn1Core.cb = sizeof(g_abDefault);
+ pThis->Asn1Core.uData.pv = (void *)&g_abDefault[0];
+ pThis->cComponents = RT_ELEMENTS(g_auDefault);
+ pThis->pauComponents = g_auDefault;
+ AssertCompile(sizeof(g_szDefault) <= sizeof(pThis->szObjId));
+ memcpy(pThis->szObjId, g_szDefault, sizeof(g_szDefault));
+ return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTAsn1ObjId_Clone(PRTASN1OBJID pThis, PCRTASN1OBJID pSrc, PCRTASN1ALLOCATORVTABLE pAllocator)
+{
+ AssertPtr(pSrc); AssertPtr(pThis); AssertPtr(pAllocator);
+ RT_ZERO(*pThis);
+ if (RTAsn1ObjId_IsPresent(pSrc))
+ {
+ AssertReturn(pSrc->Asn1Core.pOps == &g_RTAsn1ObjId_Vtable, VERR_INTERNAL_ERROR_3);
+
+ /* Copy the dotted string representation. */
+ size_t cbObjId = strlen(pSrc->szObjId) + 1;
+ AssertReturn(cbObjId <= sizeof(pThis->szObjId), VERR_INTERNAL_ERROR_5);
+ memcpy(pThis->szObjId, pSrc->szObjId, cbObjId);
+
+ /* Copy the integer component array. Try fit it in the unused space of
+ the dotted object string buffer. We place it at the end of the
+ buffer as that is simple alignment wise and avoid wasting bytes that
+ could be used to sequueze in the content bytes (see below). */
+ int rc;
+ RTAsn1MemInitAllocation(&pThis->Allocation, pAllocator);
+ pThis->cComponents = pSrc->cComponents;
+ size_t cbLeft = sizeof(pThis->szObjId);
+#if 0 /** @todo breaks with arrays of ObjIds or structs containing them. They get resized and repositioned in memory, thus invalidating the pointer. Add recall-pointers callback, or just waste memory? Or maybe make all arrays pointer-arrays? */
+ if (pSrc->cComponents * sizeof(uint32_t) <= cbLeft)
+ {
+ pThis->pauComponents = (uint32_t *)&pThis->szObjId[sizeof(pThis->szObjId) - pSrc->cComponents * sizeof(uint32_t)];
+ memcpy((uint32_t *)pThis->pauComponents, pSrc->pauComponents, pSrc->cComponents * sizeof(uint32_t));
+ cbLeft -= pSrc->cComponents * sizeof(uint32_t);
+ rc = VINF_SUCCESS;
+ }
+ else
+#endif
+ {
+ rc = RTAsn1MemDup(&pThis->Allocation, (void **)&pThis->pauComponents, pSrc->pauComponents,
+ pSrc->cComponents * sizeof(uint32_t));
+ }
+ if (RT_SUCCESS(rc))
+ {
+ /* See if we can fit the content value into the szObjId as well.
+ It will follow immediately after the string as the component
+ array is the end of the string buffer, when present. */
+#if 0 /** @todo breaks with arrays of ObjIds or structs containing them. They get resized and repositioned in memory, thus invalidating the pointer. Add recall-pointers callback, or just waste memory? Or maybe make all arrays pointer-arrays? */
+ uint32_t cbContent = pSrc->Asn1Core.cb;
+ if (cbContent <= cbLeft)
+ {
+ rc = RTAsn1Core_CloneNoContent(&pThis->Asn1Core, &pSrc->Asn1Core);
+ if (RT_SUCCESS(rc))
+ {
+ pThis->Asn1Core.uData.pv = memcpy(&pThis->szObjId[cbObjId], pSrc->Asn1Core.uData.pv, cbContent);
+ return VINF_SUCCESS;
+ }
+ }
+ else
+#endif
+ {
+ rc = RTAsn1Core_CloneContent(&pThis->Asn1Core, &pSrc->Asn1Core, pAllocator);
+ if (RT_SUCCESS(rc))
+ return VINF_SUCCESS;
+ }
+ }
+
+ /* failed, clean up. */
+ if (pThis->Allocation.cbAllocated)
+ RTAsn1MemFree(&pThis->Allocation, (uint32_t *)pThis->pauComponents);
+ RT_ZERO(*pThis);
+ return rc;
+ }
+ return VINF_SUCCESS;
+}
+
+
+RTDECL(void) RTAsn1ObjId_Delete(PRTASN1OBJID pThis)
+{
+ if ( pThis
+ && RTAsn1ObjId_IsPresent(pThis))
+ {
+ Assert(pThis->Asn1Core.pOps == &g_RTAsn1ObjId_Vtable);
+
+ if (pThis->Allocation.cbAllocated)
+ RTAsn1MemFree(&pThis->Allocation, (uint32_t *)pThis->pauComponents);
+ RTAsn1ContentFree(&pThis->Asn1Core);
+ RT_ZERO(*pThis);
+ }
+}
+
+
+RTDECL(int) RTAsn1ObjId_Enum(PRTASN1OBJID pThis, PFNRTASN1ENUMCALLBACK pfnCallback, uint32_t uDepth, void *pvUser)
+{
+ Assert(pThis && (!RTAsn1ObjId_IsPresent(pThis) || pThis->Asn1Core.pOps == &g_RTAsn1ObjId_Vtable));
+
+ /* No children to enumerate. */
+ return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTAsn1ObjId_Compare(PCRTASN1OBJID pLeft, PCRTASN1OBJID pRight)
+{
+ if (!RTAsn1ObjId_IsPresent(pLeft) || RTAsn1ObjId_IsPresent(pRight))
+ return (int)RTAsn1ObjId_IsPresent(pLeft) - (int)RTAsn1ObjId_IsPresent(pRight);
+
+ uint8_t cComponents = RT_MIN(pLeft->cComponents, pRight->cComponents);
+ for (uint32_t i = 0; i < cComponents; i++)
+ if (pLeft->pauComponents[i] != pRight->pauComponents[i])
+ return pLeft->pauComponents[i] < pRight->pauComponents[i] ? -1 : 1;
+
+ if (pLeft->cComponents == pRight->cComponents)
+ return 0;
+ return pLeft->cComponents < pRight->cComponents ? -1 : 1;
+}
+
+
+RTDECL(int) RTAsn1ObjId_CheckSanity(PCRTASN1OBJID pThis, uint32_t fFlags, PRTERRINFO pErrInfo, const char *pszErrorTag)
+{
+ if (RT_UNLIKELY(!RTAsn1ObjId_IsPresent(pThis)))
+ return RTErrInfoSetF(pErrInfo, VERR_ASN1_NOT_PRESENT, "%s: Missing (OBJID).", pszErrorTag);
+ return VINF_SUCCESS;
+}
+
+
+/*
+ * Generate code for the associated collection types.
+ */
+#define RTASN1TMPL_TEMPLATE_FILE "../common/asn1/asn1-ut-objid-template.h"
+#include <iprt/asn1-generator-internal-header.h>
+#include <iprt/asn1-generator-core.h>
+#include <iprt/asn1-generator-init.h>
+#include <iprt/asn1-generator-sanity.h>
+
diff --git a/src/VBox/Runtime/common/asn1/asn1-ut-octetstring-decode.cpp b/src/VBox/Runtime/common/asn1/asn1-ut-octetstring-decode.cpp
new file mode 100644
index 00000000000..e89bbfcef25
--- /dev/null
+++ b/src/VBox/Runtime/common/asn1/asn1-ut-octetstring-decode.cpp
@@ -0,0 +1,78 @@
+/* $Id$ */
+/** @file
+ * IPRT - ASN.1, OCTET STRING Type, Decoding.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/asn1.h>
+
+#include <iprt/err.h>
+#include <iprt/string.h>
+
+#include <iprt/formats/asn1.h>
+
+
+RTDECL(int) RTAsn1OctetString_DecodeAsn1(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1OCTETSTRING pThis,
+ const char *pszErrorTag)
+{
+ pThis->pEncapsulated = NULL;
+ RTAsn1CursorInitAllocation(pCursor, &pThis->EncapsulatedAllocation);
+
+ int rc = RTAsn1CursorReadHdr(pCursor, &pThis->Asn1Core, pszErrorTag);
+ if (RT_SUCCESS(rc))
+ {
+ rc = RTAsn1CursorMatchTagClassFlagsString(pCursor, &pThis->Asn1Core, ASN1_TAG_OCTET_STRING,
+ ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_PRIMITIVE,
+ fFlags, pszErrorTag, "OCTET STRING");
+ if (RT_SUCCESS(rc))
+ {
+ if ( !(pThis->Asn1Core.fClass & ASN1_TAGFLAG_CONSTRUCTED)
+ || (fFlags & RTASN1CURSOR_GET_F_IMPLICIT) ) /* PKCS #7 ContentInfo tweak. */
+ {
+ RTAsn1CursorSkip(pCursor, pThis->Asn1Core.cb);
+ pThis->Asn1Core.pOps = &g_RTAsn1OctetString_Vtable;
+ pThis->Asn1Core.fFlags |= RTASN1CORE_F_PRIMITE_TAG_STRUCT;
+ return VINF_SUCCESS;
+ }
+ rc = RTAsn1CursorSetInfo(pCursor, VERR_ASN1_CONSTRUCTED_STRING_NOT_IMPL,
+ "%s: Constructed OCTET STRING not implemented.", pszErrorTag);
+ }
+ else
+ rc = RTAsn1CursorSetInfo(pCursor, rc, "%s: Not OCTET STRING: fClass=%#x / uTag=%#x",
+ pszErrorTag, pThis->Asn1Core.fClass, pThis->Asn1Core.uTag);
+ }
+ return rc;
+}
+
+
+/*
+ * Generate code for the associated collection types.
+ */
+#define RTASN1TMPL_TEMPLATE_FILE "../common/asn1/asn1-ut-octetstring-template.h"
+#include <iprt/asn1-generator-internal-header.h>
+#include <iprt/asn1-generator-asn1-decoder.h>
+
diff --git a/src/VBox/Runtime/common/asn1/asn1-ut-octetstring-template.h b/src/VBox/Runtime/common/asn1/asn1-ut-octetstring-template.h
new file mode 100644
index 00000000000..5e9e5040b9e
--- /dev/null
+++ b/src/VBox/Runtime/common/asn1/asn1-ut-octetstring-template.h
@@ -0,0 +1,45 @@
+/* $Id$ */
+/** @file
+ * IPRT - ASN.1, Octet String Type, Collection Type Template.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+#define RTASN1TMPL_DECL RTDECL
+
+#define RTASN1TMPL_TYPE RTASN1SEQOFOCTETSTRINGS
+#define RTASN1TMPL_EXT_NAME RTAsn1SeqOfOctetStrings
+#define RTASN1TMPL_INT_NAME rtAsn1SeqOfOctetStrings
+RTASN1TMPL_SEQ_OF(RTASN1OCTETSTRING, RTAsn1OctetString);
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+#define RTASN1TMPL_TYPE RTASN1SETOFOCTETSTRINGS
+#define RTASN1TMPL_EXT_NAME RTAsn1SetOfOctetStrings
+#define RTASN1TMPL_INT_NAME rtAsn1SetOfOctetStrings
+RTASN1TMPL_SET_OF(RTASN1OCTETSTRING, RTAsn1OctetString);
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
diff --git a/src/VBox/Runtime/common/asn1/asn1-ut-octetstring.cpp b/src/VBox/Runtime/common/asn1/asn1-ut-octetstring.cpp
new file mode 100644
index 00000000000..dc28a9bd5a5
--- /dev/null
+++ b/src/VBox/Runtime/common/asn1/asn1-ut-octetstring.cpp
@@ -0,0 +1,426 @@
+/* $Id$ */
+/** @file
+ * IPRT - ASN.1, Octet String.
+ *
+ * @remarks This file should remain very similar to asn1-ut-bitstring.cpp.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/asn1.h>
+
+#include <iprt/alloca.h>
+#include <iprt/bignum.h>
+#include <iprt/ctype.h>
+#include <iprt/err.h>
+#include <iprt/string.h>
+#include <iprt/uni.h>
+
+#include <iprt/formats/asn1.h>
+
+
+/*******************************************************************************
+* Structures and Typedefs *
+*******************************************************************************/
+typedef struct RTASN1OCTETSTRINGWRITERCTX
+{
+ /** Pointer to the output buffer. */
+ uint8_t *pbBuf;
+ /** The current buffer offset. */
+ uint32_t offBuf;
+ /** The size of the buffer. */
+ uint32_t cbBuf;
+} RTASN1OCTETSTRINGWRITERCTX;
+
+
+/** @callback_method_impl{FNRTASN1ENCODEWRITER,
+ * Used to refresh the content of octet and bit strings. } */
+static DECLCALLBACK(int) rtAsn1OctetStringEncodeWriter(const void *pvBuf, size_t cbToWrite, void *pvUser, PRTERRINFO pErrInfo)
+{
+ RTASN1OCTETSTRINGWRITERCTX *pCtx = (RTASN1OCTETSTRINGWRITERCTX *)pvUser;
+ AssertReturn(cbToWrite <= pCtx->cbBuf - pCtx->offBuf,
+ RTErrInfoSetF(pErrInfo, VERR_BUFFER_OVERFLOW,
+ "cbToWrite=%#x offBuf=%#x cbBuf=%#x", cbToWrite, pCtx->cbBuf, pCtx->offBuf));
+ memcpy(&pCtx->pbBuf[pCtx->offBuf], pvBuf, cbToWrite);
+ pCtx->offBuf += (uint32_t)cbToWrite;
+ return VINF_SUCCESS;
+}
+
+
+/** @callback_method_impl{FNRTASN1ENCODEWRITER,
+ * Used to compare the encoded raw content of an octet or bit string with the
+ * encapsulated object. } */
+static DECLCALLBACK(int) rtAsn1OctetStringEncodeCompare(const void *pvBuf, size_t cbToWrite, void *pvUser, PRTERRINFO pErrInfo)
+{
+ RTASN1OCTETSTRINGWRITERCTX *pCtx = (RTASN1OCTETSTRINGWRITERCTX *)pvUser;
+ AssertReturn(cbToWrite <= pCtx->cbBuf - pCtx->offBuf, VERR_BUFFER_OVERFLOW);
+ if (!memcmp(&pCtx->pbBuf[pCtx->offBuf], pvBuf, cbToWrite) != 0)
+ return VERR_NOT_EQUAL;
+ pCtx->offBuf += (uint32_t)cbToWrite;
+ return VINF_SUCCESS;
+}
+
+
+/*
+ * ASN.1 OCTET STRING - Specific Methods
+ */
+
+RTDECL(int) RTAsn1OctetString_RefreshContent(PRTASN1OCTETSTRING pThis, uint32_t fFlags,
+ PCRTASN1ALLOCATORVTABLE pAllocator, PRTERRINFO pErrInfo)
+{
+ AssertReturn(pThis->pEncapsulated, VERR_INVALID_STATE);
+
+ uint32_t cbEncoded;
+ int rc = RTAsn1EncodePrepare(pThis->pEncapsulated, fFlags, &cbEncoded, pErrInfo);
+ if (RT_SUCCESS(rc))
+ {
+ pThis->Asn1Core.cb = cbEncoded;
+
+ rc = RTAsn1ContentReallocZ(&pThis->Asn1Core, cbEncoded, pAllocator);
+ if (RT_SUCCESS(rc))
+ {
+ /* Initialize the writer context. */
+ RTASN1OCTETSTRINGWRITERCTX Ctx;
+ Ctx.pbBuf = (uint8_t *)pThis->Asn1Core.uData.pu8;
+ Ctx.cbBuf = cbEncoded;
+ Ctx.offBuf = 0;
+
+ rc = RTAsn1EncodeWrite(pThis->pEncapsulated, fFlags, rtAsn1OctetStringEncodeWriter, &Ctx, pErrInfo);
+ if (RT_SUCCESS(rc))
+ {
+ if (Ctx.offBuf == cbEncoded)
+ return VINF_SUCCESS;
+
+ rc = RTErrInfoSetF(pErrInfo, rc, "Expected %#x bytes, got %#x", cbEncoded, Ctx.offBuf);
+ }
+ }
+ else
+ rc = RTErrInfoSetF(pErrInfo, rc, "Error allocating %#x bytes for storing content\n", cbEncoded);
+ }
+ return rc;
+}
+
+
+RTDECL(bool) RTAsn1OctetString_AreContentBytesValid(PCRTASN1OCTETSTRING pThis, uint32_t fFlags)
+{
+ if (pThis->pEncapsulated)
+ {
+ /* Check the encoded length of the octets. */
+ uint32_t cbEncoded;
+ int rc = RTAsn1EncodePrepare(pThis->pEncapsulated, fFlags, &cbEncoded, NULL);
+ if (RT_FAILURE(rc))
+ return false;
+ if (pThis->Asn1Core.cb != cbEncoded)
+ return false;
+
+ /* Check the encoded bytes, if there are any. */
+ if (cbEncoded)
+ {
+ if (!pThis->Asn1Core.uData.pv)
+ return false;
+
+ /* Check the other bytes. */
+ RTASN1OCTETSTRINGWRITERCTX Ctx;
+ Ctx.pbBuf = (uint8_t *)pThis->Asn1Core.uData.pu8;
+ Ctx.cbBuf = cbEncoded;
+ Ctx.offBuf = 0;
+ rc = RTAsn1EncodeWrite(pThis->pEncapsulated, fFlags, rtAsn1OctetStringEncodeCompare, &Ctx, NULL);
+ if (RT_FAILURE(rc))
+ return false;
+ }
+ }
+ return true;
+}
+
+
+/*
+ * ASN.1 OCTET STRING - Standard Methods.
+ */
+
+/** @interface_method_impl{FNRTASN1COREVTENCODEPREP} */
+static DECLCALLBACK(int) RTAsn1OctetString_EncodePrep(PRTASN1CORE pThisCore, uint32_t fFlags, PRTERRINFO pErrInfo)
+{
+ PRTASN1OCTETSTRING pThis = (PRTASN1OCTETSTRING)pThisCore;
+ if (!pThis->pEncapsulated)
+ {
+ Assert(pThis->Asn1Core.cb == 0 || pThis->Asn1Core.uData.pv);
+ return VINF_SUCCESS;
+ }
+
+ /* Figure out the size of the encapsulated content. */
+ uint32_t cbEncoded;
+ int rc = RTAsn1EncodePrepare(pThis->pEncapsulated, fFlags, &cbEncoded, pErrInfo);
+ if (RT_SUCCESS(rc))
+ {
+ /* Free the bytes if they don't match up. */
+ if (pThis->Asn1Core.uData.pv)
+ {
+ bool fMustFree = pThis->Asn1Core.cb != cbEncoded;
+ if (!fMustFree)
+ {
+ RTASN1OCTETSTRINGWRITERCTX Ctx;
+ Ctx.pbBuf = (uint8_t *)pThis->Asn1Core.uData.pu8;
+ Ctx.cbBuf = cbEncoded;
+ Ctx.offBuf = 0;
+ rc = RTAsn1EncodeWrite(pThis->pEncapsulated, fFlags, rtAsn1OctetStringEncodeCompare, &Ctx, NULL);
+ fMustFree = RT_FAILURE_NP(rc);
+ }
+ if (fMustFree)
+ RTAsn1ContentFree(&pThis->Asn1Core);
+ }
+
+ pThis->Asn1Core.cb = cbEncoded;
+ rc = RTAsn1EncodeRecalcHdrSize(&pThis->Asn1Core, fFlags, pErrInfo);
+ }
+ return rc;
+}
+
+
+/** @interface_method_impl{FNRTASN1COREVTENCODEWRITE} */
+static DECLCALLBACK(int) RTAsn1OctetString_EncodeWrite(PRTASN1CORE pThisCore, uint32_t fFlags, PFNRTASN1ENCODEWRITER pfnWriter,
+ void *pvUser, PRTERRINFO pErrInfo)
+{
+ PRTASN1OCTETSTRING pThis = (PRTASN1OCTETSTRING)pThisCore;
+
+ /*
+ * First the header.
+ */
+ int rc = RTAsnEncodeWriteHeader(&pThis->Asn1Core, fFlags, pfnWriter, pvUser, pErrInfo);
+ if (RT_SUCCESS(rc) && rc != VINF_ASN1_NOT_ENCODED)
+ {
+ /*
+ * If nothing is encapsulated, the core points to the content (if we have any).
+ */
+ if (!pThis->pEncapsulated)
+ {
+ if (pThis->Asn1Core.cb > 0)
+ rc = pfnWriter(pThis->Asn1Core.uData.pu8, pThis->Asn1Core.cb, pvUser, pErrInfo);
+ }
+ /*
+ * Call upon the encapsulated content to serialize itself.
+ */
+ else
+ rc = RTAsn1EncodeWrite(pThis->pEncapsulated, fFlags, pfnWriter, pvUser, pErrInfo);
+ }
+ return rc;
+}
+
+
+RT_DECL_DATA_CONST(RTASN1COREVTABLE const) g_RTAsn1OctetString_Vtable =
+{
+ "OctetString",
+ sizeof(RTASN1OCTETSTRING),
+ ASN1_TAG_OCTET_STRING,
+ ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_PRIMITIVE,
+ 0,
+ (PFNRTASN1COREVTDTOR)RTAsn1OctetString_Delete,
+ (PFNRTASN1COREVTENUM)RTAsn1OctetString_Enum,
+ (PFNRTASN1COREVTCLONE)RTAsn1OctetString_Clone,
+ (PFNRTASN1COREVTCOMPARE)RTAsn1OctetString_Compare,
+ (PFNRTASN1COREVTCHECKSANITY)RTAsn1OctetString_CheckSanity,
+ RTAsn1OctetString_EncodePrep,
+ RTAsn1OctetString_EncodeWrite
+};
+
+
+RTDECL(int) RTAsn1OctetString_Init(PRTASN1OCTETSTRING pThis, PCRTASN1ALLOCATORVTABLE pAllocator)
+{
+ RT_ZERO(*pThis);
+
+ RTAsn1Core_InitEx(&pThis->Asn1Core, ASN1_TAG_OCTET_STRING, ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_PRIMITIVE,
+ &g_RTAsn1OctetString_Vtable, RTASN1CORE_F_PRESENT | RTASN1CORE_F_PRIMITE_TAG_STRUCT);
+ /*pThis->pEncapsulated = NULL;*/
+ RTAsn1MemInitAllocation(&pThis->EncapsulatedAllocation, pAllocator);
+
+ return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTAsn1OctetString_Clone(PRTASN1OCTETSTRING pThis, PCRTASN1OCTETSTRING pSrc, PCRTASN1ALLOCATORVTABLE pAllocator)
+{
+ AssertPtr(pSrc); AssertPtr(pThis); AssertPtr(pAllocator);
+
+ RT_ZERO(*pThis);
+ if (RTAsn1OctetString_IsPresent(pSrc))
+ {
+ AssertReturn(pSrc->Asn1Core.pOps == &g_RTAsn1OctetString_Vtable, VERR_INTERNAL_ERROR_3);
+
+ int rc;
+ if (!pSrc->pEncapsulated)
+ rc = RTAsn1Core_CloneContent(&pThis->Asn1Core, &pSrc->Asn1Core, pAllocator);
+ else
+ rc = RTAsn1Core_CloneNoContent(&pThis->Asn1Core, &pSrc->Asn1Core);
+ if (RT_FAILURE(rc))
+ return rc;
+
+ RTAsn1MemInitAllocation(&pThis->EncapsulatedAllocation, pAllocator);
+ if (pSrc->pEncapsulated)
+ {
+ PCRTASN1COREVTABLE pOps = pSrc->pEncapsulated->pOps;
+ Assert(!pOps || pOps->pfnClone);
+ if (pOps && pOps->pfnClone)
+ {
+ /* We can clone the decoded encapsulated object. */
+ rc = RTAsn1MemAllocZ(&pThis->EncapsulatedAllocation, (void **)&pThis->pEncapsulated, pOps->cbStruct);
+ if (RT_SUCCESS(rc))
+ {
+ rc = pOps->pfnClone(pThis->pEncapsulated, pSrc->pEncapsulated, pAllocator);
+ if (RT_FAILURE(rc))
+ RTAsn1MemFree(&pThis->EncapsulatedAllocation, pThis->pEncapsulated);
+ }
+ }
+ else
+ {
+ /* Borrow the encapsulated pointer and use RTAsn1OctetString_RefreshContent
+ to get an accurate copy of the bytes. */
+ pThis->pEncapsulated = pSrc->pEncapsulated;
+ rc = RTAsn1OctetString_RefreshContent(pThis, RTASN1ENCODE_F_DER, pAllocator, NULL);
+ pThis->pEncapsulated = NULL;
+ }
+ if (RT_FAILURE(rc))
+ {
+ RTAsn1ContentFree(&pThis->Asn1Core);
+ RT_ZERO(*pThis);
+ return rc;
+ }
+ }
+ }
+ return VINF_SUCCESS;
+}
+
+
+RTDECL(void) RTAsn1OctetString_Delete(PRTASN1OCTETSTRING pThis)
+{
+ if ( pThis
+ && RTAsn1OctetString_IsPresent(pThis))
+ {
+ Assert(pThis->Asn1Core.pOps == &g_RTAsn1OctetString_Vtable);
+
+ /* Destroy the encapsulated object. */
+ if (pThis->pEncapsulated)
+ {
+ RTAsn1VtDelete(pThis->pEncapsulated);
+ if (pThis->EncapsulatedAllocation.cbAllocated)
+ RTAsn1MemFree(&pThis->EncapsulatedAllocation, pThis->pEncapsulated);
+ }
+
+ /* Delete content and wipe the content. */
+ RTAsn1ContentFree(&pThis->Asn1Core);
+ RT_ZERO(*pThis);
+ }
+}
+
+
+RTDECL(int) RTAsn1OctetString_Enum(PRTASN1OCTETSTRING pThis, PFNRTASN1ENUMCALLBACK pfnCallback, uint32_t uDepth, void *pvUser)
+{
+ Assert(pThis && (!RTAsn1OctetString_IsPresent(pThis) || pThis->Asn1Core.pOps == &g_RTAsn1OctetString_Vtable));
+
+ /* Enumerate the encapsulated object if present. */
+ if (pThis->pEncapsulated)
+ return pfnCallback(pThis->pEncapsulated, "Encapsulated", uDepth + 1, pvUser);
+ return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTAsn1OctetString_Compare(PCRTASN1OCTETSTRING pLeft, PCRTASN1OCTETSTRING pRight)
+{
+ Assert(pLeft && (!RTAsn1OctetString_IsPresent(pLeft) || pLeft->Asn1Core.pOps == &g_RTAsn1OctetString_Vtable));
+ Assert(pRight && (!RTAsn1OctetString_IsPresent(pRight) || pRight->Asn1Core.pOps == &g_RTAsn1OctetString_Vtable));
+
+ int iDiff;
+ if (RTAsn1OctetString_IsPresent(pLeft))
+ {
+ if (RTAsn1OctetString_IsPresent(pRight))
+ {
+ /* Since it's really hard to tell whether encapsulated objects have
+ been modified or not, we might have to refresh both objects
+ while doing this compare. We'll try our best to avoid it though. */
+ if (pLeft->pEncapsulated || pRight->pEncapsulated)
+ {
+ if ( pLeft->pEncapsulated
+ && pRight->pEncapsulated
+ && pLeft->pEncapsulated->pOps == pRight->pEncapsulated->pOps)
+ iDiff = pLeft->pEncapsulated->pOps->pfnCompare(pLeft->pEncapsulated, pRight->pEncapsulated);
+ else
+ {
+ /* No direct comparison of encapsulated objects possible,
+ make sure we've got the rigth bytes then. */
+ if ( pLeft->pEncapsulated
+ && !RTAsn1OctetString_AreContentBytesValid(pLeft, RTASN1ENCODE_F_DER))
+ {
+ int rc = RTAsn1OctetString_RefreshContent((PRTASN1OCTETSTRING)pLeft, RTASN1ENCODE_F_DER,
+ pLeft->EncapsulatedAllocation.pAllocator, NULL);
+ AssertRC(rc);
+ }
+
+ if ( pRight->pEncapsulated
+ && !RTAsn1OctetString_AreContentBytesValid(pRight, RTASN1ENCODE_F_DER))
+ {
+ int rc = RTAsn1OctetString_RefreshContent((PRTASN1OCTETSTRING)pRight, RTASN1ENCODE_F_DER,
+ pRight->EncapsulatedAllocation.pAllocator, NULL);
+ AssertRC(rc);
+ }
+
+ /* Compare the content bytes. */
+ iDiff = RTAsn1Core_CompareEx(&pLeft->Asn1Core, &pRight->Asn1Core, true /*fIgnoreTagAndClass*/);
+ }
+ }
+ /*
+ * No encapsulated object, just compare the raw content bytes.
+ */
+ else
+ iDiff = RTAsn1Core_CompareEx(&pLeft->Asn1Core, &pRight->Asn1Core, true /*fIgnoreTagAndClass*/);
+ }
+ else
+ iDiff = -1;
+ }
+ else
+ iDiff = 0 - (int)RTAsn1OctetString_IsPresent(pRight);
+ return iDiff;
+}
+
+
+RTDECL(int) RTAsn1OctetString_CheckSanity(PCRTASN1OCTETSTRING pThis, uint32_t fFlags, PRTERRINFO pErrInfo, const char *pszErrorTag)
+{
+ if (RT_UNLIKELY(!RTAsn1OctetString_IsPresent(pThis)))
+ return RTErrInfoSetF(pErrInfo, VERR_ASN1_NOT_PRESENT, "%s: Missing (OCTET STRING).", pszErrorTag);
+
+ if (pThis->pEncapsulated)
+ return pThis->pEncapsulated->pOps->pfnCheckSanity(pThis->pEncapsulated, fFlags & RTASN1_CHECK_SANITY_F_COMMON_MASK,
+ pErrInfo, pszErrorTag);
+ return VINF_SUCCESS;
+}
+
+
+/*
+ * Generate code for the associated collection types.
+ */
+#define RTASN1TMPL_TEMPLATE_FILE "../common/asn1/asn1-ut-octetstring-template.h"
+#include <iprt/asn1-generator-internal-header.h>
+#include <iprt/asn1-generator-core.h>
+#include <iprt/asn1-generator-init.h>
+#include <iprt/asn1-generator-sanity.h>
+
diff --git a/src/VBox/Runtime/common/asn1/asn1-ut-string-decode.cpp b/src/VBox/Runtime/common/asn1/asn1-ut-string-decode.cpp
new file mode 100644
index 00000000000..beb3743ccfa
--- /dev/null
+++ b/src/VBox/Runtime/common/asn1/asn1-ut-string-decode.cpp
@@ -0,0 +1,187 @@
+/* $Id$ */
+/** @file
+ * IPRT - ASN.1, XXX STRING Types, Decoding.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/asn1.h>
+
+#include <iprt/alloca.h>
+#include <iprt/err.h>
+#include <iprt/string.h>
+#include <iprt/ctype.h>
+
+#include <iprt/formats/asn1.h>
+
+
+RTDECL(int) RTAsn1String_DecodeAsn1(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1STRING pThis, const char *pszErrorTag)
+{
+ RT_ZERO(*pThis);
+ AssertReturn(!(fFlags & RTASN1CURSOR_GET_F_IMPLICIT), VERR_INVALID_PARAMETER);
+
+ int rc = RTAsn1CursorReadHdr(pCursor, &pThis->Asn1Core, pszErrorTag);
+ if (RT_SUCCESS(rc))
+ {
+ /*
+ * Do tag matching.
+ */
+ switch (pThis->Asn1Core.uTag)
+ {
+ case ASN1_TAG_UTF8_STRING:
+ case ASN1_TAG_NUMERIC_STRING:
+ case ASN1_TAG_PRINTABLE_STRING:
+ case ASN1_TAG_T61_STRING:
+ case ASN1_TAG_VIDEOTEX_STRING:
+ case ASN1_TAG_IA5_STRING:
+ case ASN1_TAG_GENERALIZED_TIME:
+ case ASN1_TAG_GRAPHIC_STRING:
+ case ASN1_TAG_VISIBLE_STRING:
+ case ASN1_TAG_GENERAL_STRING:
+ case ASN1_TAG_UNIVERSAL_STRING:
+ case ASN1_TAG_BMP_STRING:
+ rc = VINF_SUCCESS;
+ break;
+ default:
+ rc = RTAsn1CursorSetInfo(pCursor, VERR_ASN1_CURSOR_TAG_MISMATCH,
+ "%s: Not a string object: fClass=%#x / uTag=%#x",
+ pszErrorTag, pThis->Asn1Core.fClass, pThis->Asn1Core.uTag);
+ }
+ if (RT_SUCCESS(rc))
+ {
+ /*
+ * Match flags. CER/DER makes it complicated.
+ */
+ if (pThis->Asn1Core.fClass == (ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_PRIMITIVE))
+ {
+ /*
+ * Primitive strings are simple.
+ */
+ RTAsn1CursorSkip(pCursor, pThis->Asn1Core.cb);
+ pThis->Asn1Core.pOps = &g_RTAsn1String_Vtable;
+ pThis->Asn1Core.fFlags |= RTASN1CORE_F_PRIMITE_TAG_STRUCT;
+ RTAsn1CursorInitAllocation(pCursor, &pThis->Allocation);
+
+ /* UTF-8 conversion is done lazily, upon request. */
+ return VINF_SUCCESS;
+ }
+
+ if (pThis->Asn1Core.fClass == (ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_CONSTRUCTED))
+ {
+ /*
+ * Constructed strings are not yet fully implemented.
+ */
+ if (pCursor->fFlags & RTASN1CURSOR_FLAGS_DER)
+ rc = RTAsn1CursorSetInfo(pCursor, VERR_ASN1_CURSOR_ILLEGAL_CONSTRUCTED_STRING,
+ "%s: DER encoding does not allow constructed strings (cb=%#x uTag=%#x fClass=%#x)",
+ pszErrorTag, pThis->Asn1Core.cb, pThis->Asn1Core.uTag, pThis->Asn1Core.fClass);
+ else if (pCursor->fFlags & RTASN1CURSOR_FLAGS_CER)
+ {
+ if (pThis->Asn1Core.cb > 1000)
+ rc = VINF_SUCCESS;
+ else
+ rc = RTAsn1CursorSetInfo(pCursor, VERR_ASN1_CURSOR_ILLEGAL_CONSTRUCTED_STRING,
+ "%s: Constructed strings only allowed for >1000 byte in CER encoding: cb=%#x uTag=%#x fClass=%#x",
+ pszErrorTag, pThis->Asn1Core.cb,
+ pThis->Asn1Core.uTag, pThis->Asn1Core.fClass);
+ }
+ /** @todo implement constructed strings. */
+ if (RT_SUCCESS(rc))
+ rc = RTAsn1CursorSetInfo(pCursor, VERR_ASN1_CONSTRUCTED_STRING_NOT_IMPL,
+ "%s: Support for constructed strings is not implemented", pszErrorTag);
+ }
+ else
+ rc = RTAsn1CursorSetInfo(pCursor, VERR_ASN1_CURSOR_TAG_FLAG_CLASS_MISMATCH,
+ "%s: Not a valid string object: fClass=%#x / uTag=%#x",
+ pszErrorTag, pThis->Asn1Core.fClass, pThis->Asn1Core.uTag);
+ }
+ }
+ RT_ZERO(*pThis);
+ return rc;
+}
+
+
+/**
+ * Common worker for the specific string type getters.
+ *
+ * @returns IPRT status code
+ * @param pCursor The cursor.
+ * @param fFlags The RTASN1CURSOR_GET_F_XXX flags.
+ * @param uTag The string tag.
+ * @param pThis The output object.
+ * @param pszErrorTag The error tag.
+ * @param pszWhat The string type name.
+ */
+static int rtAsn1XxxString_DecodeAsn1(PRTASN1CURSOR pCursor, uint32_t fFlags, uint8_t uTag, PRTASN1STRING pThis,
+ const char *pszErrorTag, const char *pszWhat)
+{
+ pThis->cchUtf8 = 0;
+ pThis->pszUtf8 = NULL;
+
+ int rc = RTAsn1CursorReadHdr(pCursor, &pThis->Asn1Core, pszErrorTag);
+ if (RT_SUCCESS(rc))
+ {
+ rc = RTAsn1CursorMatchTagClassFlagsString(pCursor, &pThis->Asn1Core, uTag,
+ ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_PRIMITIVE,
+ fFlags, pszErrorTag, pszWhat);
+ if (RT_SUCCESS(rc))
+ {
+ if (!(pThis->Asn1Core.fClass & ASN1_TAGFLAG_CONSTRUCTED))
+ {
+ RTAsn1CursorSkip(pCursor, pThis->Asn1Core.cb);
+ pThis->Asn1Core.pOps = &g_RTAsn1String_Vtable;
+ pThis->Asn1Core.fFlags |= RTASN1CORE_F_PRIMITE_TAG_STRUCT;
+ RTAsn1CursorInitAllocation(pCursor, &pThis->Allocation);
+ /* UTF-8 conversion is done lazily, upon request. */
+ return VINF_SUCCESS;
+ }
+ rc = RTAsn1CursorSetInfo(pCursor, VERR_ASN1_CONSTRUCTED_STRING_NOT_IMPL,
+ "%s: Constructed %s not implemented.", pszErrorTag, pszWhat);
+ }
+ }
+ return rc;
+}
+
+
+/*
+ * Generate code for the tag specific decoders.
+ */
+#define RTASN1STRING_IMPL(a_uTag, a_szTag, a_Api) \
+ RTDECL(int) RT_CONCAT(a_Api,_DecodeAsn1)(PRTASN1CURSOR pCursor, uint32_t fFlags, \
+ PRTASN1STRING pThis, const char *pszErrorTag) \
+ { \
+ return rtAsn1XxxString_DecodeAsn1(pCursor, fFlags, a_uTag, pThis, pszErrorTag, a_szTag); \
+ }
+#include "asn1-ut-string-template2.h"
+
+
+/*
+ * Generate code for the associated collection types.
+ */
+#define RTASN1TMPL_TEMPLATE_FILE "../common/asn1/asn1-ut-string-template.h"
+#include <iprt/asn1-generator-internal-header.h>
+#include <iprt/asn1-generator-asn1-decoder.h>
+
diff --git a/src/VBox/Runtime/common/asn1/asn1-ut-string-template.h b/src/VBox/Runtime/common/asn1/asn1-ut-string-template.h
new file mode 100644
index 00000000000..2a91ed4ecf8
--- /dev/null
+++ b/src/VBox/Runtime/common/asn1/asn1-ut-string-template.h
@@ -0,0 +1,45 @@
+/* $Id$ */
+/** @file
+ * IPRT - ASN.1, XXX STRING Types, Collection Type Template.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+#define RTASN1TMPL_DECL RTDECL
+
+#define RTASN1TMPL_TYPE RTASN1SEQOFSTRINGS
+#define RTASN1TMPL_EXT_NAME RTAsn1SeqOfStrings
+#define RTASN1TMPL_INT_NAME rtAsn1SeqOfStrings
+RTASN1TMPL_SEQ_OF(RTASN1STRING, RTAsn1String);
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+#define RTASN1TMPL_TYPE RTASN1SETOFSTRINGS
+#define RTASN1TMPL_EXT_NAME RTAsn1SetOfStrings
+#define RTASN1TMPL_INT_NAME rtAsn1SetOfStrings
+RTASN1TMPL_SET_OF(RTASN1STRING, RTAsn1String);
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
diff --git a/src/VBox/Runtime/common/asn1/asn1-ut-string-template2.h b/src/VBox/Runtime/common/asn1/asn1-ut-string-template2.h
new file mode 100644
index 00000000000..37e4591fe45
--- /dev/null
+++ b/src/VBox/Runtime/common/asn1/asn1-ut-string-template2.h
@@ -0,0 +1,39 @@
+/* $Id$ */
+/** @file
+ * IPRT - ASN.1, XXX STRING Types, Template for type specific wrappers.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+RTASN1STRING_IMPL(ASN1_TAG_NUMERIC_STRING, "NUMERIC STRING", RTAsn1NumericString)
+RTASN1STRING_IMPL(ASN1_TAG_PRINTABLE_STRING, "PRINTABLE STRING", RTAsn1PrintableString)
+RTASN1STRING_IMPL(ASN1_TAG_T61_STRING, "T61 STRING", RTAsn1T61String)
+RTASN1STRING_IMPL(ASN1_TAG_VIDEOTEX_STRING, "VIDEOTEX STRING", RTAsn1VideotexString)
+RTASN1STRING_IMPL(ASN1_TAG_VISIBLE_STRING, "VISIBLE STRING", RTAsn1VisibleString)
+RTASN1STRING_IMPL(ASN1_TAG_IA5_STRING, "IA5 STRING", RTAsn1Ia5String)
+RTASN1STRING_IMPL(ASN1_TAG_GRAPHIC_STRING, "GRAPHIC STRING", RTAsn1GraphicString)
+RTASN1STRING_IMPL(ASN1_TAG_GENERAL_STRING, "GENERAL STRING", RTAsn1GeneralString)
+RTASN1STRING_IMPL(ASN1_TAG_UTF8_STRING, "UTF8 STRING", RTAsn1Utf8String)
+RTASN1STRING_IMPL(ASN1_TAG_BMP_STRING, "BMP STRING", RTAsn1BmpString)
+RTASN1STRING_IMPL(ASN1_TAG_UNIVERSAL_STRING, "UNIVERSAL STRING", RTAsn1UniversalString)
+
diff --git a/src/VBox/Runtime/common/asn1/asn1-ut-string.cpp b/src/VBox/Runtime/common/asn1/asn1-ut-string.cpp
new file mode 100644
index 00000000000..6571273591d
--- /dev/null
+++ b/src/VBox/Runtime/common/asn1/asn1-ut-string.cpp
@@ -0,0 +1,1811 @@
+/* $Id$ */
+/** @file
+ * IPRT - ASN.1, XXX STRING Types.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/asn1.h>
+
+#include <iprt/ctype.h>
+#include <iprt/err.h>
+#include <iprt/string.h>
+#include <iprt/uni.h>
+
+#include <iprt/formats/asn1.h>
+
+
+/*******************************************************************************
+* Global Variables *
+*******************************************************************************/
+static uint8_t const g_acbStringTags[] =
+{
+ /* [ASN1_TAG_EOC] = */ 0,
+ /* [ASN1_TAG_BOOLEAN] = */ 0,
+ /* [ASN1_TAG_INTEGER] = */ 0,
+ /* [ASN1_TAG_BIT_STRING] = */ 0,
+ /* [ASN1_TAG_OCTET_STRING] = */ 0,
+ /* [ASN1_TAG_NULL] = */ 0,
+ /* [ASN1_TAG_OID] = */ 0,
+ /* [ASN1_TAG_OBJECT_DESCRIPTOR] = */ 0,
+ /* [ASN1_TAG_EXTERNAL] = */ 0,
+ /* [ASN1_TAG_REAL] = */ 0,
+ /* [ASN1_TAG_ENUMERATED] = */ 0,
+ /* [ASN1_TAG_EMBEDDED_PDV] = */ 0,
+ /* [ASN1_TAG_UTF8_STRING] = */ 1,
+ /* [ASN1_TAG_RELATIVE_OID] = */ 0,
+ /* [ASN1_TAG_RESERVED_14] = */ 0,
+ /* [ASN1_TAG_RESERVED_15] = */ 0,
+ /* [ASN1_TAG_SEQUENCE] = */ 0,
+ /* [ASN1_TAG_SET] = */ 0,
+ /* [ASN1_TAG_NUMERIC_STRING] = */ 1,
+ /* [ASN1_TAG_PRINTABLE_STRING] = */ 1,
+ /* [ASN1_TAG_T61_STRING] = */ 1,
+ /* [ASN1_TAG_VIDEOTEX_STRING] = */ 1,
+ /* [ASN1_TAG_IA5_STRING] = */ 1,
+ /* [ASN1_TAG_UTC_TIME] = */ 0,
+ /* [ASN1_TAG_GENERALIZED_TIME] = */ 0,
+ /* [ASN1_TAG_GRAPHIC_STRING] = */ 1,
+ /* [ASN1_TAG_VISIBLE_STRING] = */ 1,
+ /* [ASN1_TAG_GENERAL_STRING] = */ 1,
+ /* [ASN1_TAG_UNIVERSAL_STRING] = */ 4,
+ /* [ASN1_TAG_CHARACTER_STRING] = */ 1,
+ /* [ASN1_TAG_BMP_STRING] = */ 2,
+};
+
+
+
+
+/*
+ * ISO/IEC-2022 + TeletexString mess.
+ */
+
+/**
+ * ISO-2022 codepoint mappings.
+ */
+typedef struct RTISO2022MAP
+{
+ /** The number of bytes per character. */
+ uint8_t cb;
+ /** The registration number. */
+ uint16_t uRegistration;
+ /** The size of the pauToUni table. */
+ uint16_t cToUni;
+ /** Pointer to the convertion table from ISO-2022 to Unicode.
+ * ASSUMES that unicode chars above 0xffff won't be required. */
+ uint16_t const *pauToUni;
+
+ /** Escape sequence for loading into G0 or C0 or C1 depending on the type (sans
+ * ESC). */
+ uint8_t abEscLoadXX[6];
+ /** Escape sequence for loading into G1 (sans ESC). */
+ uint8_t abEscLoadG1[6];
+ /** Escape sequence for loading into G2 (sans ESC). */
+ uint8_t abEscLoadG2[6];
+ /** Escape sequence for loading into G3 (sans ESC). */
+ uint8_t abEscLoadG3[6];
+} RTISO2022MAP;
+/** Pointer to const ISO-2022 mappings. */
+typedef RTISO2022MAP const *PCRTISO2022MAP;
+
+/** Unused codepoint value. */
+#define RTISO2022_UNUSED UINT16_C(0xffff)
+
+
+/** Dummy mappings to avoid dealing with NULL pointers in the decoder
+ * registers. */
+static const RTISO2022MAP g_DummyMap =
+{
+ 1, UINT16_MAX, 0, NULL,
+ { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff } /* No escape into G0 */,
+ { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff } /* No escape into G1 */,
+ { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff } /* No escape into G2 */,
+ { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff } /* No escape into G3 */
+};
+
+
+/** GL mappings for ISO-IR-168 (Japanese, update of #87), with space and
+ * delete. */
+static const RTISO2022MAP g_IsoIr168Map =
+{
+ //2, 168, RT_ELEMENTS(g_awcIsoIr168Decode), g_awcIsoIr168Decode,
+ 2, 168, 0, NULL,
+ { 0x26, 0x40, 0x2b, 0x24, 0x42, 0xff } /* Esc into G0 */,
+ { 0x26, 0x40, 0x2b, 0x24, 0x29, 0x42 } /* Esc into G1 */,
+ { 0x26, 0x40, 0x2b, 0x24, 0x2a, 0x42 } /* Esc into G2 */,
+ { 0x26, 0x40, 0x2b, 0x24, 0x2b, 0x42 } /* Esc into G3 */,
+};
+
+
+/** GL mappings for ISO-IR-165 (Chinese), with space and delete. */
+static const RTISO2022MAP g_IsoIr165Map =
+{
+ //2, 165, RT_ELEMENTS(g_awcIsoIr165Decode), g_awcIsoIr165Decode,
+ 2, 165, 0, NULL,
+ { 0x24, 0x28, 0x45, 0xff, 0xff, 0xff } /* Esc into G0 */,
+ { 0x24, 0x29, 0x45, 0xff, 0xff, 0xff } /* Esc into G1 */,
+ { 0x24, 0x2a, 0x45, 0xff, 0xff, 0xff } /* Esc into G2 */,
+ { 0x24, 0x2b, 0x45, 0xff, 0xff, 0xff } /* Esc into G3 */,
+};
+
+
+/** GL mappings for ISO-IR-150 (Greek), with space and delete. */
+static const RTISO2022MAP g_IsoIr150Map =
+{
+ //1, 150, RT_ELEMENTS(g_awcIsoIr150Decode), g_awcIsoIr150Decode,
+ 1, 150, 0, NULL,
+ { 0x28, 0x21, 0x40, 0xff, 0xff, 0xff } /* Esc into G0 */,
+ { 0x29, 0x21, 0x40, 0xff, 0xff, 0xff } /* Esc into G1 */,
+ { 0x2a, 0x21, 0x40, 0xff, 0xff, 0xff } /* Esc into G2 */,
+ { 0x2b, 0x21, 0x40, 0xff, 0xff, 0xff } /* Esc into G3 */,
+};
+
+
+/** GL mappings for ISO-IR-103 (Teletex supplementary), with space and
+ * delete. */
+static const RTISO2022MAP g_IsoIr103Map =
+{
+ //1, 103, RT_ELEMENTS(g_awcIsoIr103Decode), g_awcIsoIr103Decode,
+ 1, 103, 0, NULL,
+ { 0x28, 0x76, 0xff, 0xff, 0xff, 0xff } /* Esc into G0 */,
+ { 0x29, 0x76, 0xff, 0xff, 0xff, 0xff } /* Esc into G1 */,
+ { 0x2a, 0x76, 0xff, 0xff, 0xff, 0xff } /* Esc into G2 */,
+ { 0x2b, 0x76, 0xff, 0xff, 0xff, 0xff } /* Esc into G3 */,
+};
+
+
+/**
+ * GL mapping from ISO-IR-102 (Teletex primary) to unicode, with space and
+ * delete.
+ *
+ * Mostly 1:1, except that (a) what would be dollar is currency sign, (b)
+ * positions 0x5c, 0x5e, 0x7b, 0x7d and 0x7e are defined not to be used.
+ */
+static uint16_t const g_awcIsoIr102Decode[0x60] =
+{
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x00A4, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0xffff, 0x005d, 0xffff, 0x005f,
+ 0xffff, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0xffff, 0x007c, 0xffff, 0xffff, 0x007f,
+};
+
+/** GL mappings for ISO-IR-102, with space and delete. */
+static const RTISO2022MAP g_IsoIr102Map =
+{
+ 1, 102, RT_ELEMENTS(g_awcIsoIr102Decode), g_awcIsoIr102Decode,
+ { 0x28, 0x75, 0xff, 0xff, 0xff, 0xff } /* Esc into G0 */,
+ { 0x29, 0x75, 0xff, 0xff, 0xff, 0xff } /* Esc into G1 */,
+ { 0x2a, 0x75, 0xff, 0xff, 0xff, 0xff } /* Esc into G2 */,
+ { 0x2b, 0x75, 0xff, 0xff, 0xff, 0xff } /* Esc into G3 */,
+};
+
+
+/** GL mappings for ISO-IR-87 (Japanese), with space and delete. */
+static const RTISO2022MAP g_IsoIr87Map =
+{
+ //1, 87, RT_ELEMENTS(g_awcIsoIr87Decode), g_awcIsoIr97Decode,
+ 1, 87, 0, NULL,
+ { 0x24, 0x42, 0xff, 0xff, 0xff, 0xff } /* Esc into G0 */,
+ { 0x24, 0x29, 0x42, 0xff, 0xff, 0xff } /* Esc into G1 */,
+ { 0x24, 0x2a, 0x42, 0xff, 0xff, 0xff } /* Esc into G2 */,
+ { 0x24, 0x2b, 0x42, 0xff, 0xff, 0xff } /* Esc into G3 */,
+};
+
+
+/**
+ * GL mapping from ISO-IR-6 (ASCII) to unicode, with space and delete.
+ *
+ * Completely 1:1.
+ */
+static uint16_t const g_awcIsoIr6Decode[0x60] =
+{
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x006b, 0x007c, 0x007d, 0x007e, 0x007f,
+};
+
+/** GL mappings for ISO-IR-6 (ASCII), with space and delete. */
+static const RTISO2022MAP g_IsoIr6Map =
+{
+ 1, 6, RT_ELEMENTS(g_awcIsoIr6Decode), g_awcIsoIr6Decode,
+ { 0x28, 0x42, 0xff, 0xff, 0xff, 0xff } /* Esc into G0 */,
+ { 0x29, 0x42, 0xff, 0xff, 0xff, 0xff } /* Esc into G1 */,
+ { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff } /* Esc into G2 */,
+ { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff } /* Esc into G3 */,
+};
+
+
+/** GL maps. */
+static PCRTISO2022MAP g_paGLMaps[] =
+{
+ &g_IsoIr6Map,
+ &g_IsoIr102Map,
+ &g_IsoIr103Map,
+ &g_IsoIr150Map,
+ &g_IsoIr165Map,
+ &g_IsoIr168Map,
+};
+
+
+
+/** GR mappings for ISO-IR-164 (Hebrew supplementary). */
+static const RTISO2022MAP g_IsoIr164Map =
+{
+ //1, 164, RT_ELEMENTS(g_awcIsoIr164Decode), g_awcIsoIr164Decode
+ 1, 164, 0, NULL,
+ { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff } /* Esc into G0 */,
+ { 0x2d, 0x53, 0xff, 0xff, 0xff, 0xff } /* Esc into G1 */,
+ { 0x2e, 0x53, 0xff, 0xff, 0xff, 0xff } /* Esc into G2 */,
+ { 0x2f, 0x53, 0xff, 0xff, 0xff, 0xff } /* Esc into G3 */,
+};
+
+
+/** GR mappings for ISO-IR-156 (Supplementary for ASCII (#6)). */
+static const RTISO2022MAP g_IsoIr156Map =
+{
+ //1, 156, RT_ELEMENTS(g_awcIsoIr156Decode), g_awcIsoIr156Decode
+ 1, 156, 0, NULL,
+ { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff } /* Esc into G0 */,
+ { 0x2d, 0x52, 0xff, 0xff, 0xff, 0xff } /* Esc into G1 */,
+ { 0x2e, 0x52, 0xff, 0xff, 0xff, 0xff } /* Esc into G2 */,
+ { 0x2f, 0x52, 0xff, 0xff, 0xff, 0xff } /* Esc into G3 */,
+};
+
+
+/** GR mappings for ISO-IR-153 (Basic Cyrillic). */
+static const RTISO2022MAP g_IsoIr153Map =
+{
+ //1, 153, RT_ELEMENTS(g_awcIsoIr153Decode), g_awcIsoIr153Decode
+ 1, 153, 0, NULL,
+ { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff } /* Esc into G0 */,
+ { 0x2d, 0x4f, 0xff, 0xff, 0xff, 0xff } /* Esc into G1 */,
+ { 0x2e, 0x4f, 0xff, 0xff, 0xff, 0xff } /* Esc into G2 */,
+ { 0x2f, 0x4f, 0xff, 0xff, 0xff, 0xff } /* Esc into G3 */,
+};
+
+
+/** GR mappings for ISO-IR-144 (Cryllic part of Latin/Cyrillic). */
+static const RTISO2022MAP g_IsoIr144Map =
+{
+ //1, 144, RT_ELEMENTS(g_awcIsoIr144Decode), g_awcIsoIr144Decode
+ 1, 144, 0, NULL,
+ { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff } /* Esc into G0 */,
+ { 0x2d, 0x4f, 0xff, 0xff, 0xff, 0xff } /* Esc into G1 */,
+ { 0x2e, 0x4f, 0xff, 0xff, 0xff, 0xff } /* Esc into G2 */,
+ { 0x2f, 0x4f, 0xff, 0xff, 0xff, 0xff } /* Esc into G3 */,
+};
+
+
+/** GR mappings for ISO-IR-126 (Latin/Greek). */
+static const RTISO2022MAP g_IsoIr126Map =
+{
+ //1, 126, RT_ELEMENTS(g_awcIsoIr126Decode), g_awcIsoIr126Decode
+ 1, 126, 0, NULL,
+ { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff } /* Esc into G0 */,
+ { 0x2d, 0x46, 0xff, 0xff, 0xff, 0xff } /* Esc into G1 */,
+ { 0x2e, 0x46, 0xff, 0xff, 0xff, 0xff } /* Esc into G2 */,
+ { 0x2f, 0x46, 0xff, 0xff, 0xff, 0xff } /* Esc into G3 */,
+};
+
+
+/** GR maps. */
+static PCRTISO2022MAP g_paGRMaps[] =
+{
+ &g_IsoIr126Map,
+ &g_IsoIr144Map,
+ &g_IsoIr153Map,
+ &g_IsoIr156Map,
+ &g_IsoIr164Map,
+};
+
+
+
+/** C0 mapping from ISO-IR-106 to unicode. */
+static uint16_t g_awcIsoIr106Decode[0x20] =
+{
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x0008, 0xffff, 0x000a, 0xffff, 0x000c, 0x000d, 0x000e, 0x000f,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x008e, 0x000a, 0x001b, 0xffff, 0x008f, 0xffff, 0xffff,
+};
+
+/** C0 mappings for ISO-IR-106. */
+static const RTISO2022MAP g_IsoIr106Map =
+{
+ 1, 106, RT_ELEMENTS(g_awcIsoIr106Decode), g_awcIsoIr106Decode,
+ { 0x21, 0x45, 0xff, 0xff, 0xff, 0xff } /* Esc into C0 */,
+ { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff } /* N/A */,
+ { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff } /* N/A */,
+ { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff } /* N/A */,
+};
+
+/** C0 maps. */
+static PCRTISO2022MAP g_paC0Maps[] =
+{
+ &g_IsoIr106Map,
+};
+
+
+
+/** C1 mapping from ISO-IR-107 to unicode. */
+static uint16_t g_awcIsoIr107Decode[0x20] =
+{
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x008b, 0x008c, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x009b, 0xffff, 0xffff, 0xffff, 0xffff,
+};
+
+/** C1 mappings for ISO-IR-107. */
+static const RTISO2022MAP g_IsoIr107Map =
+{
+ 1, 107, RT_ELEMENTS(g_awcIsoIr107Decode), g_awcIsoIr107Decode,
+ { 0x22, 0x48, 0xff, 0xff, 0xff, 0xff } /* Esc into C1 */,
+ { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff } /* N/A */,
+ { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff } /* N/A */,
+ { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff } /* N/A */,
+};
+
+/** C1 maps. */
+static PCRTISO2022MAP g_paC1Maps[] =
+{
+ &g_IsoIr107Map,
+};
+
+
+static int rtIso2022Decoder_LookupAndSet(PCRTISO2022MAP *ppMapRet, uint16_t uRegistration, PCRTISO2022MAP *papMaps, uint32_t cMaps)
+{
+ uint32_t i = cMaps;
+ while (i-- > 0)
+ if (papMaps[i]->uRegistration == uRegistration)
+ {
+ /** @todo skip non-Teletex codesets if we ever add more than we need for it. */
+ *ppMapRet = papMaps[i];
+ return VINF_SUCCESS;
+ }
+ return VERR_ASN1_INVALID_T61_STRING_ENCODING;
+}
+
+
+/**
+ * ISO-2022 decoder state.
+ */
+typedef struct RTISO2022DECODERSTATE
+{
+ /** Pointer to the string */
+ uint8_t const *pabString;
+ /** The string size. */
+ uint32_t cbString;
+ /** The current string position. */
+ uint32_t offString;
+
+ /** The GL mapping. */
+ PCRTISO2022MAP pMapGL;
+ /** The GR mapping. */
+ PCRTISO2022MAP pMapGR;
+ /** The lower control set (C0) mapping. */
+ PCRTISO2022MAP pMapC0;
+ /** The higher control set (C1) mapping. */
+ PCRTISO2022MAP pMapC1;
+ /** The G0, G1, G2, and G3 mappings. */
+ PCRTISO2022MAP apMapGn[4];
+ /** Used by SS2 & SS3 to store the orignal GL value that is to be restored. */
+ PCRTISO2022MAP pRestoreGL;
+ /** Pointer to extended error info buffer, optional. */
+ PRTERRINFO pErrInfo;
+} RTISO2022DECODERSTATE;
+/** Pointer to a const ISO-2022 decoder state. */
+typedef RTISO2022DECODERSTATE *PRTISO2022DECODERSTATE;
+
+
+static int rtIso2022Decoder_SetGL(PRTISO2022DECODERSTATE pThis, PCRTISO2022MAP pNewMap)
+{
+ pThis->pMapGL = pNewMap;
+ return VINF_SUCCESS;
+}
+
+
+static int rtIso2022Decoder_SetGR(PRTISO2022DECODERSTATE pThis, PCRTISO2022MAP pNewMap)
+{
+ pThis->pMapGR = pNewMap;
+ return VINF_SUCCESS;
+}
+
+
+static int rtIso2022Decoder_SetGLForOneChar(PRTISO2022DECODERSTATE pThis, PCRTISO2022MAP pTmpMap)
+{
+ pThis->pRestoreGL = pThis->pMapGL;
+ pThis->pMapGL = pTmpMap;
+ return VINF_SUCCESS;
+}
+
+
+static int rtIso2022Decoder_SetC0(PRTISO2022DECODERSTATE pThis, uint16_t uRegistration)
+{
+ return rtIso2022Decoder_LookupAndSet(&pThis->pMapC0, uRegistration, g_paC0Maps, RT_ELEMENTS(g_paC0Maps));
+}
+
+
+static int rtIso2022Decoder_SetC1(PRTISO2022DECODERSTATE pThis, uint16_t uRegistration)
+{
+ return rtIso2022Decoder_LookupAndSet(&pThis->pMapC1, uRegistration, g_paC1Maps, RT_ELEMENTS(g_paC1Maps));
+}
+
+
+/**
+ * Worker for rtIso2022Decoder_FindEscAndSet.
+ *
+ * @returns true if match, false if not.
+ * @param pabLeft Pointer to the first string byte after the ESC.
+ * @param cbLeft The number of bytes left in the string.
+ * @param pabRight Pointer to the abEscLoad* byte array to match with.
+ * @param cbRight Size of the mapping sequence (fixed).
+ * @param pcchMatch Where to return the length of the escape sequence (sans
+ * ESC) on success.
+ */
+static bool rtIso2022Decoder_MatchEscSeqFrom2ndByte(uint8_t const *pabLeft, uint32_t cbLeft,
+ uint8_t const *pabRight, uint32_t cbRight,
+ uint32_t *pcchMatch)
+{
+ Assert(cbRight == 6);
+ uint32_t i = 1;
+ while (i < cbRight)
+ {
+ if (pabRight[i] == 0xff)
+ break;
+ if (cbLeft <= i || pabLeft[i] != pabRight[i])
+ return false;
+ i++;
+ }
+ *pcchMatch = i;
+ return true;
+}
+
+
+/**
+ * Finds a the set with a matching abEscLoad* escape sequence and loads it into
+ * the designated register.
+ *
+ * @returns The length of the sequence on success, negative error status code on
+ * failure.
+ * @param pThis The decoder instance.
+ * @param ppMapRet Used to specify C0 or C1 maps when processing
+ * escape sequences for loading these. Only the
+ * abEscLoadXX arrays will be searched if this is
+ * not NULL. For loading {G0,...,G3} pass NULL.
+ * @param pb Pointer to the start of the escape sequence.
+ * @param cb The number of bytes remaining in the string.
+ * @param papMaps The maps to search.
+ * @param cMaps The number of maps @a papMaps points to.
+ */
+static int rtIso2022Decoder_FindEscAndSet(PRTISO2022DECODERSTATE pThis,
+ PCRTISO2022MAP *ppMapRet, PCRTISO2022MAP *papMaps, uint32_t cMaps)
+{
+ /* Skip the ESC.*/
+ uint8_t const *pb = &pThis->pabString[pThis->offString + 1];
+ uint32_t cb = pThis->cbString - (pThis->offString + 1);
+
+ /* Cache the first char. */
+ uint8_t const b0 = pb[0];
+
+ /* Scan the array of maps for matching sequences. */
+ uint32_t i = cMaps;
+ while (i-- > 0)
+ {
+ uint32_t cchMatch;
+ PCRTISO2022MAP pMap = papMaps[i];
+ /** @todo skip non-Teletex codesets if we ever add more than we need for it. */
+ if ( pMap->abEscLoadXX[0] == b0
+ && rtIso2022Decoder_MatchEscSeqFrom2ndByte(pb, cb, pMap->abEscLoadXX, sizeof(pMap->abEscLoadXX), &cchMatch) )
+ {
+ if (ppMapRet)
+ *ppMapRet = pMap;
+ else
+ pThis->apMapGn[0] = pMap;
+ return cchMatch + 1;
+ }
+ else if (!ppMapRet) /* ppMapRet is NULL if Gn. */
+ {
+ uint32_t iGn;
+ if ( pMap->abEscLoadG1[0] == b0
+ && rtIso2022Decoder_MatchEscSeqFrom2ndByte(pb, cb, pMap->abEscLoadG1, sizeof(pMap->abEscLoadG1), &cchMatch))
+ iGn = 1;
+ else if ( pMap->abEscLoadG2[0] == b0
+ && rtIso2022Decoder_MatchEscSeqFrom2ndByte(pb, cb, pMap->abEscLoadG2, sizeof(pMap->abEscLoadG2), &cchMatch))
+ iGn = 2;
+ else if ( pMap->abEscLoadG3[0] == b0
+ && rtIso2022Decoder_MatchEscSeqFrom2ndByte(pb, cb, pMap->abEscLoadG3, sizeof(pMap->abEscLoadG3), &cchMatch))
+ iGn = 3;
+ else
+ iGn = UINT32_MAX;
+ if (iGn != UINT32_MAX)
+ {
+ pThis->apMapGn[iGn] = pMap;
+ return cchMatch + 1;
+ }
+ }
+ }
+ return VERR_ASN1_TELETEX_UNSUPPORTED_CHARSET;
+}
+
+
+/**
+ * Interprets an escape sequence.
+ *
+ * @returns The length of the sequence on success, negative error status code on
+ * failure.
+ * @param pThis The decoder instance. The offString must be
+ * pointing to the escape byte.
+ */
+static int rtIso2022Decoder_InterpretEsc(PRTISO2022DECODERSTATE pThis)
+{
+ /* the first escape byte. */
+ uint32_t offString = pThis->offString;
+ if (offString + 1 >= pThis->cbString)
+ return RTErrInfoSetF(pThis->pErrInfo, VERR_ASN1_INVALID_T61_STRING_ENCODING,
+ "@%u: Unexpected EOS parsing ESC...", offString);
+ int rc;
+ switch (pThis->pabString[offString + 1])
+ {
+ /*
+ * GL selection:
+ */
+ case 0x6e: /* Lock shift two: G2 -> GL */
+ rc = rtIso2022Decoder_SetGL(pThis, pThis->apMapGn[2]);
+ break;
+ case 0x6f: /* Lock shift three: G3 -> GL */
+ rc = rtIso2022Decoder_SetGL(pThis, pThis->apMapGn[3]);
+ break;
+ case 0x4e: /* Single shift two: G2 -> GL for one char. */
+ rc = rtIso2022Decoder_SetGLForOneChar(pThis, pThis->apMapGn[2]);
+ break;
+ case 0x4f: /* Single shift three: G3 -> GL for one char. */
+ rc = rtIso2022Decoder_SetGLForOneChar(pThis, pThis->apMapGn[3]);
+ break;
+
+ /*
+ * GR selection:
+ */
+ case 0x7e: /* Locking shift one right: G1 -> GR. */
+ rc = rtIso2022Decoder_SetGR(pThis, pThis->apMapGn[1]);
+ break;
+ case 0x7d: /* Locking shift two right: G2 -> GR. */
+ rc = rtIso2022Decoder_SetGR(pThis, pThis->apMapGn[2]);
+ break;
+ case 0x7c: /* Locking shift three right: G3 -> GR. */
+ rc = rtIso2022Decoder_SetGR(pThis, pThis->apMapGn[3]);
+ break;
+
+ /*
+ * Cx selection:
+ */
+ case 0x21: /* C0-designate */
+ return rtIso2022Decoder_FindEscAndSet(pThis, &pThis->pMapC0, g_paC0Maps, RT_ELEMENTS(g_paC0Maps));
+ case 0x22: /* C1-designate */
+ return rtIso2022Decoder_FindEscAndSet(pThis, &pThis->pMapC1, g_paC1Maps, RT_ELEMENTS(g_paC1Maps));
+
+ /*
+ * Single-byte character set selection.
+ */
+ case 0x28: /* G0-designate, 94 chars. */
+ case 0x29: /* G1-designate, 94 chars. */
+ case 0x2a: /* G2-designate, 94 chars. */
+ case 0x2b: /* G3-designate, 94 chars. */
+ return rtIso2022Decoder_FindEscAndSet(pThis, NULL, g_paGLMaps, RT_ELEMENTS(g_paGLMaps));
+
+ case 0x2c: /* G0-designate, 96 chars. */
+ case 0x2d: /* G1-designate, 96 chars. */
+ case 0x2e: /* G2-designate, 96 chars. */
+ case 0x2f: /* G3-designate, 96 chars. */
+ return rtIso2022Decoder_FindEscAndSet(pThis, NULL, g_paGRMaps, RT_ELEMENTS(g_paGRMaps));
+
+ /*
+ * Multibyte character set selection.
+ */
+ case 0x24:
+ if (offString + 2 >= pThis->cbString)
+ return RTErrInfoSetF(pThis->pErrInfo, VERR_ASN1_INVALID_T61_STRING_ENCODING,
+ "@%u: Unexpected EOS parsing ESC %#x...", offString, pThis->pabString[offString + 1]);
+ switch (pThis->pabString[offString + 2])
+ {
+ case 0x28: /* G0-designate, 94^n chars. */
+ case 0x29: /* G1-designate, 94^n chars. */
+ case 0x2a: /* G2-designate, 94^n chars. */
+ case 0x2b: /* G3-designate, 94^n chars. */
+ default: /* G0-designate that skips the 0x28? (See japanese ones.) */
+ return rtIso2022Decoder_FindEscAndSet(pThis, NULL, g_paGLMaps, RT_ELEMENTS(g_paGLMaps));
+
+ case 0x2c: /* G0-designate, 96^n chars. */
+ case 0x2d: /* G1-designate, 96^n chars. */
+ case 0x2e: /* G2-designate, 96^n chars. */
+ case 0x2f: /* G3-designate, 96^n chars. */
+ return rtIso2022Decoder_FindEscAndSet(pThis, NULL, g_paGRMaps, RT_ELEMENTS(g_paGRMaps));
+ } \
+ break;
+
+ case 0x26: /* Special escape prefix for #168. */
+ return rtIso2022Decoder_FindEscAndSet(pThis, NULL, g_paGLMaps, RT_ELEMENTS(g_paGLMaps));
+
+ /*
+ * Unknown/unsupported/unimplemented.
+ */
+ case 0x25: /* Designate other coding system. */
+ return RTErrInfoSetF(pThis->pErrInfo, VERR_ASN1_TELETEX_UNSUPPORTED_ESC_SEQ,
+ "@%u: ESC DOCS not supported\n", offString);
+ default:
+ return RTErrInfoSetF(pThis->pErrInfo, VERR_ASN1_TELETEX_UNKNOWN_ESC_SEQ,
+ "@%u: Unknown escape sequence: ESC %#x...\n", offString, pThis->pabString[offString + 1]);
+ }
+
+ /* Only single byte escapes sequences for shifting ends up here. */
+ if (RT_SUCCESS(rc))
+ return 1;
+ return rc;
+}
+
+
+static int rtIso2022Decoder_ControlCharHook(PRTISO2022DECODERSTATE pThis, uint16_t wcControl)
+{
+ int rc;
+ switch (wcControl)
+ {
+ case 0x000e: /* Locking shift zero: G0 -> GL. */
+ rc = rtIso2022Decoder_SetGL(pThis, pThis->apMapGn[0]);
+ break;
+
+ case 0x000f: /* Locking shift one: G1 -> GL. */
+ rc = rtIso2022Decoder_SetGL(pThis, pThis->apMapGn[1]);
+ break;
+
+ case 0x008e: /* Single shift two: G2 -> GL for one char. */
+ rc = rtIso2022Decoder_SetGLForOneChar(pThis, pThis->apMapGn[2]);
+ break;
+
+ case 0x008f: /* Single shift three: G3 -> GL for one char. */
+ rc = rtIso2022Decoder_SetGLForOneChar(pThis, pThis->apMapGn[3]);
+ break;
+
+ case 0x002b: /* Escape should be handled by the caller. */
+ rc = rtIso2022Decoder_InterpretEsc(pThis);
+ break;
+
+ default:
+ return 0;
+ }
+
+ return RT_SUCCESS(rc) ? 1 : rc;
+}
+
+
+static int rtIso2022Decoder_Init(PRTISO2022DECODERSTATE pThis, const char *pchString, uint32_t cchString,
+ uint32_t uGL, uint32_t uC0, uint32_t uC1, uint32_t uG0,
+ PRTERRINFO pErrInfo)
+{
+ pThis->pabString = (uint8_t const *)pchString;
+ pThis->cbString = cchString;
+ pThis->offString = 0;
+
+ pThis->pMapGL = &g_DummyMap;
+ pThis->pMapGR = &g_DummyMap;
+ pThis->pMapC0 = &g_DummyMap;
+ pThis->pMapC1 = &g_DummyMap;
+ pThis->pRestoreGL = NULL;
+ pThis->apMapGn[0] = &g_DummyMap;
+ pThis->apMapGn[1] = &g_DummyMap;
+ pThis->apMapGn[2] = &g_DummyMap;
+ pThis->apMapGn[3] = &g_DummyMap;
+ pThis->pErrInfo = pErrInfo;
+
+ int rc = VINF_SUCCESS;
+ if (uGL != UINT32_MAX)
+ rc = rtIso2022Decoder_LookupAndSet(&pThis->pMapGL, uGL, g_paGLMaps, RT_ELEMENTS(g_paGLMaps));
+ if (RT_SUCCESS(rc) && uG0 != UINT32_MAX)
+ rc = rtIso2022Decoder_LookupAndSet(&pThis->apMapGn[0], uG0, g_paGLMaps, RT_ELEMENTS(g_paGLMaps));
+ if (RT_SUCCESS(rc) && uC0 != UINT32_MAX)
+ rc = rtIso2022Decoder_SetC0(pThis, uC0);
+ if (RT_SUCCESS(rc) && uC1 != UINT32_MAX)
+ rc = rtIso2022Decoder_SetC1(pThis, uC1);
+ return rc;
+}
+
+
+static int rtIso2022Decoder_GetNextUniCpSlow(PRTISO2022DECODERSTATE pThis, PRTUNICP pUniCp)
+{
+ while (pThis->offString < pThis->cbString)
+ {
+ uint8_t b = pThis->pabString[pThis->offString];
+ if (!(b & 0x80))
+ {
+ if (b >= 0x20)
+ {
+ /*
+ * GL range.
+ */
+ b -= 0x20;
+ PCRTISO2022MAP pMap = pThis->pMapGL;
+
+ /* Single byte character map. */
+ if (pMap->cb == 1)
+ {
+ if (RT_LIKELY(b < pMap->cToUni))
+ {
+ uint16_t wc = pMap->pauToUni[b];
+ if (RT_LIKELY(wc != RTISO2022_UNUSED))
+ {
+ *pUniCp = wc;
+ pThis->offString += 1;
+ return VINF_SUCCESS;
+ }
+ *pUniCp = RTUNICP_INVALID;
+ return RTErrInfoSetF(pThis->pErrInfo, VERR_ASN1_INVALID_T61_STRING_ENCODING,
+ "@%u: GL b=%#x is marked unused in map #u range %u.",
+ pThis->offString, b + 0x20, pMap->uRegistration, pMap->cToUni);
+ }
+ *pUniCp = RTUNICP_INVALID;
+ return RTErrInfoSetF(pThis->pErrInfo, VERR_ASN1_INVALID_T61_STRING_ENCODING,
+ "@%u: GL b=%#x is outside map #u range %u.",
+ pThis->offString, b + 0x20, pMap->uRegistration, pMap->cToUni);
+ }
+
+ /* Double byte character set. */
+ Assert(pMap->cb == 2);
+ if (pThis->offString + 1 < pThis->cbString)
+ {
+ uint8_t b2 = pThis->pabString[pThis->offString + 1];
+ b2 -= 0x20;
+ if (RT_LIKELY(b2 < 0x60))
+ {
+ uint16_t u16 = ((uint16_t)b << 8) | b2;
+ if (RT_LIKELY(u16 < pMap->cToUni))
+ {
+ uint16_t wc = pMap->pauToUni[b];
+ if (RT_LIKELY(wc != RTISO2022_UNUSED))
+ {
+ *pUniCp = wc;
+ pThis->offString += 2;
+ return VINF_SUCCESS;
+ }
+ *pUniCp = RTUNICP_INVALID;
+ return RTErrInfoSetF(pThis->pErrInfo, VERR_ASN1_INVALID_T61_STRING_ENCODING,
+ "@%u: GL b=%#x is marked unused in map #u.",
+ pThis->offString, b + 0x20, pMap->uRegistration);
+ }
+ if (u16 >= 0x7f00)
+ {
+ *pUniCp = 0x7f; /* delete */
+ pThis->offString += 2;
+ return VINF_SUCCESS;
+ }
+ *pUniCp = RTUNICP_INVALID;
+ return RTErrInfoSetF(pThis->pErrInfo, VERR_ASN1_INVALID_T61_STRING_ENCODING,
+ "@%u: GL u16=%#x (b0=%#x b1=%#x) is outside map #u range %u.",
+ pThis->offString, u16, b + 0x20, b2 + 0x20, pMap->uRegistration, pMap->cToUni);
+ }
+ return RTErrInfoSetF(pThis->pErrInfo, VERR_ASN1_INVALID_T61_STRING_ENCODING,
+ "@%u: 2nd GL byte outside GL range: b0=%#x b1=%#x (map #u)",
+ pThis->offString, b + 0x20, b2 + 0x20, pMap->uRegistration);
+
+ }
+ return RTErrInfoSetF(pThis->pErrInfo, VERR_ASN1_INVALID_T61_STRING_ENCODING,
+ "@%u: EOS reading 2nd byte for GL b=%#x (map #u).",
+ pThis->offString, b + 0x20, pMap->uRegistration);
+ }
+ else
+ {
+ /*
+ * C0 range.
+ */
+ Assert(pThis->pMapC0->cb == 0x20);
+ uint16_t wc = pThis->pMapC0->pauToUni[b];
+ if (wc != RTISO2022_UNUSED)
+ {
+ int rc;
+ if (b == 0x1b || wc == 0x1b) /* ESC is hardcoded, or so they say. */
+ rc = rtIso2022Decoder_InterpretEsc(pThis);
+ else
+ rc = rtIso2022Decoder_ControlCharHook(pThis, wc);
+ if (RT_SUCCESS(rc))
+ {
+ if (rc == 0)
+ {
+ pThis->offString += 1;
+ *pUniCp = wc;
+ return VINF_SUCCESS;
+ }
+ pThis->offString += rc;
+ }
+ else
+ return rc;
+ }
+ else
+ return RTErrInfoSetF(pThis->pErrInfo, VERR_ASN1_INVALID_T61_STRING_ENCODING,
+ "@%u: C0 b=%#x is marked unused in map #u.",
+ pThis->offString, b, pThis->pMapC0->uRegistration);
+ }
+ }
+ else
+ {
+ if (b >= 0xa0)
+ {
+ /*
+ * GR range.
+ */
+ b -= 0xa0;
+ PCRTISO2022MAP pMap = pThis->pMapGR;
+
+ /* Single byte character map. */
+ if (pMap->cb == 1)
+ {
+ /** @todo 0xa0 = SPACE and 0xff = DELETE if it's a 94 charater map... */
+ if (RT_LIKELY(b < pMap->cToUni))
+ {
+ uint16_t wc = pMap->pauToUni[b];
+ if (RT_LIKELY(wc != RTISO2022_UNUSED))
+ {
+ *pUniCp = wc;
+ pThis->offString += 1;
+ return VINF_SUCCESS;
+ }
+
+ *pUniCp = RTUNICP_INVALID;
+ return RTErrInfoSetF(pThis->pErrInfo, VERR_ASN1_INVALID_T61_STRING_ENCODING,
+ "@%u: GR b=%#x is marked unused in map #u.",
+ pThis->offString, b + 0xa0, pMap->uRegistration);
+ }
+ *pUniCp = RTUNICP_INVALID;
+ return RTErrInfoSetF(pThis->pErrInfo, VERR_ASN1_INVALID_T61_STRING_ENCODING,
+ "@%u: GR b=%#x is outside map #u range %u",
+ pThis->offString, b + 0xa0, pMap->uRegistration, pMap->cToUni);
+ }
+
+ /* Double byte character set. */
+ Assert(pMap->cb == 2);
+ if (pThis->offString + 1 < pThis->cbString)
+ {
+ uint8_t b2 = pThis->pabString[pThis->offString + 1];
+ b2 -= 0xa0;
+ if (RT_LIKELY(b2 < 0x60))
+ {
+ uint16_t u16 = ((uint16_t)b << 8) | b2;
+ if (RT_LIKELY(u16 < pMap->cToUni))
+ {
+ uint16_t wc = pMap->pauToUni[b];
+ if (RT_LIKELY(wc != RTISO2022_UNUSED))
+ {
+ *pUniCp = wc;
+ pThis->offString += 2;
+ return VINF_SUCCESS;
+ }
+
+ *pUniCp = RTUNICP_INVALID;
+ return RTErrInfoSetF(pThis->pErrInfo, VERR_ASN1_INVALID_T61_STRING_ENCODING,
+ "@%u: GR b=%#x is marked unused in map #u.",
+ pThis->offString, b + 0xa0, pMap->uRegistration);
+ }
+ *pUniCp = RTUNICP_INVALID;
+ return RTErrInfoSetF(pThis->pErrInfo, VERR_ASN1_INVALID_T61_STRING_ENCODING,
+ "@%u: GR u16=%#x (b0=%#x b1=%#x) is outside map #u range %u.",
+ pThis->offString, u16, b + 0xa0, b2 + 0xa0, pMap->uRegistration, pMap->cToUni);
+ }
+ return RTErrInfoSetF(pThis->pErrInfo, VERR_ASN1_INVALID_T61_STRING_ENCODING,
+ "@%u: 2nd GR byte outside GR range: b0=%#x b1=%#x (map #u).",
+ pThis->offString, b + 0xa0, b2 + 0xa0, pMap->uRegistration);
+
+ }
+ return RTErrInfoSetF(pThis->pErrInfo, VERR_ASN1_INVALID_T61_STRING_ENCODING,
+ "@%u: EOS reading 2nd byte for GR b=%#x (map #u).",
+ pThis->offString, b + 0xa0, pMap->uRegistration);
+ }
+ else
+ {
+ /*
+ * C2 range.
+ */
+ Assert(pThis->pMapC1->cb == 0x20);
+ b -= 0x80;
+ uint16_t wc = pThis->pMapC1->pauToUni[b];
+ if (wc != RTISO2022_UNUSED)
+ {
+ int rc = rtIso2022Decoder_ControlCharHook(pThis, wc);
+ if (RT_SUCCESS(rc))
+ {
+ if (rc == 0)
+ {
+ pThis->offString += 1;
+ *pUniCp = wc;
+ return VINF_SUCCESS;
+ }
+ pThis->offString += rc;
+ }
+ else
+ return rc;
+ }
+ else
+ return RTErrInfoSetF(pThis->pErrInfo, VERR_ASN1_INVALID_T61_STRING_ENCODING,
+ "@%u: C1 b=%#x is marked unused in map #u.",
+ pThis->offString, b + 0x80, pThis->pMapC1->uRegistration);
+ }
+ }
+ }
+
+ /* End of string. */
+ *pUniCp = RTUNICP_INVALID;
+ return VERR_END_OF_STRING;
+}
+
+DECLINLINE(int) rtIso2022Decoder_GetNextUniCp(PRTISO2022DECODERSTATE pThis, PRTUNICP pUniCp)
+{
+ /*
+ * Deal with single byte GL.
+ */
+ uint32_t const offString = pThis->offString;
+ if (pThis->offString < pThis->cbString)
+ {
+ PCRTISO2022MAP const pMapGL = pThis->pMapGL;
+ if (pMapGL->cb == 1)
+ {
+ uint8_t const b = pThis->pabString[offString] - (uint8_t)0x20;
+ if (b < pMapGL->cToUni)
+ {
+ uint16_t wc = pMapGL->pauToUni[b];
+ if (wc != RTISO2022_UNUSED)
+ {
+ pThis->offString = offString + 1;
+ *pUniCp = wc;
+ return VINF_SUCCESS;
+ }
+ }
+ }
+
+ /*
+ * Deal with complications in the non-inline function.
+ */
+ return rtIso2022Decoder_GetNextUniCpSlow(pThis, pUniCp);
+ }
+
+ *pUniCp = RTUNICP_INVALID;
+ return VERR_END_OF_STRING;
+}
+
+
+static int rtIso2022ValidateString(uint32_t uProfile, const char *pch, uint32_t cch, size_t *pcchUtf8, PRTERRINFO pErrInfo)
+{
+ AssertReturn(uProfile == ASN1_TAG_T61_STRING, VERR_INVALID_PARAMETER); /* just a place holder for now. */
+
+ RTISO2022DECODERSTATE Decoder;
+ int rc = rtIso2022Decoder_Init(&Decoder, pch, cch, 102, 106, 107, 102, pErrInfo);
+ if (RT_SUCCESS(rc))
+ {
+ size_t cchUtf8 = 0;
+ for (;;)
+ {
+ RTUNICP uc;
+ rc = rtIso2022Decoder_GetNextUniCp(&Decoder, &uc);
+ if (RT_SUCCESS(rc))
+ cchUtf8 += RTStrCpSize(uc);
+ else
+ {
+ if (RT_LIKELY(rc == VERR_END_OF_STRING))
+ {
+ *pcchUtf8 = cchUtf8;
+ return VINF_SUCCESS;
+ }
+ return rc;
+ }
+ }
+ }
+ return rc;
+}
+
+
+static int rtIso2022RecodeAsUtf8(uint32_t uProfile, const char *pchSrc, uint32_t cchSrc, char *pszDst, size_t cbDst)
+{
+ AssertReturn(uProfile == ASN1_TAG_T61_STRING, VERR_INVALID_PARAMETER); /* just a place holder for now. */
+ AssertReturn(cbDst > 0, VERR_INVALID_PARAMETER);
+
+ RTISO2022DECODERSTATE Decoder;
+ int rc = rtIso2022Decoder_Init(&Decoder, pchSrc, cchSrc, 102, 106, 107, 102, NULL /*pErrInfo*/);
+ if (RT_SUCCESS(rc))
+ {
+ size_t cchUtf8 = 0;
+ for (;;)
+ {
+ RTUNICP uc;
+ rc = rtIso2022Decoder_GetNextUniCp(&Decoder, &uc);
+ if (RT_SUCCESS(rc))
+ {
+ if (uc < 0x80 && cbDst > 1)
+ {
+ *pszDst++ = (char)uc;
+ cbDst--;
+ }
+ else
+ {
+ size_t cchUniCp = RTStrCpSize(uc);
+ if (cbDst > cchUniCp)
+ {
+ cbDst -= cchUniCp;
+ pszDst = RTStrPutCp(pszDst, uc);
+ }
+ else
+ {
+ *pszDst = '\0';
+ return VERR_BUFFER_OVERFLOW;
+ }
+ }
+ }
+ else if (RT_LIKELY(rc == VERR_END_OF_STRING))
+ {
+ *pszDst = '\0';
+ return VINF_SUCCESS;
+ }
+ else
+ return rc;
+ }
+ }
+ return rc;
+}
+
+
+
+/** The unicode mapping of the C1 area of windows codepage 1252.
+ * The rest of the code page is 1:1 with unicode. */
+static uint16_t g_awcWin1252_C1[0x20] =
+{
+ 0x20ac, 0x0081, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, 0x02c6, 0x2030, 0x0160, 0x2039, 0x0152, 0x008d, 0x017d, 0x008f,
+ 0x0090, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x02dc, 0x2122, 0x0161, 0x203a, 0x0153, 0x009d, 0x017e, 0x0178,
+};
+
+
+static size_t rtWin1252CalcUtf8Length(const char *pch, uint32_t cch)
+{
+ size_t cchUtf8 = 0;
+ while (cch-- > 0)
+ {
+ uint8_t const b = *pch++;
+ if (b < 0x80)
+ cchUtf8 += 1;
+ else if (b >= 0xa0)
+ cchUtf8 += 2;
+ else
+ {
+ uint16_t const wc = g_awcWin1252_C1[b - 0x80];
+ cchUtf8 += RTStrCpSize(wc);
+ }
+ }
+ return cchUtf8;
+}
+
+
+static int rtWin1252RecodeAsUtf8(const char *pchSrc, uint32_t cchSrc, char *pszDst, size_t cbDst)
+{
+ while (cchSrc-- > 0)
+ {
+ uint8_t b = *pchSrc++;
+ if (b < 0x80)
+ {
+ if (cbDst <= 1)
+ return VERR_BUFFER_OVERFLOW;
+ *pszDst++ = (char)b;
+ }
+ else
+ {
+ uint16_t const wc = b >= 0xa0 ? b : g_awcWin1252_C1[b - 0x80];
+ size_t cchCp = RTStrCpSize(wc);
+ if (cbDst <= cchCp)
+ return VERR_BUFFER_OVERFLOW;
+ pszDst = RTStrPutCp(pszDst, wc);
+ }
+ }
+
+ if (!cbDst)
+ return VERR_BUFFER_OVERFLOW;
+ *pszDst = '\0';
+ return VINF_SUCCESS;
+}
+
+
+
+/*
+ * ASN.1 STRING - Specific Methods.
+ */
+
+/** rtAsn1String_IsTeletexLatin1 results. */
+typedef enum RTASN1TELETEXVARIANT
+{
+ /** Couldn't find hard evidence of either. */
+ RTASN1TELETEXVARIANT_UNDECIDED = 1,
+ /** Pretty certain that it's real teletex. */
+ RTASN1TELETEXVARIANT_TELETEX,
+ /** Pretty sure it's latin-1 or Windows-1252. */
+ RTASN1TELETEXVARIANT_LATIN1,
+ /** Pretty sure it's Windows-1252. */
+ RTASN1TELETEXVARIANT_WIN_1252
+} RTASN1TELETEXVARIANT;
+
+/**
+ * Takes a guess as whether TELETEX STRING (T61 STRING) is actually is Latin-1
+ * or the real thing.
+ *
+ * According to RFC-2459, section 4.1.2.4, various libraries, certificate
+ * authorities and others have perverted the TeletexString/T61String tag by
+ * ISO-8859-1 (aka latin-1) strings (more probably these are actually Windows
+ * CP-1252 rather than latin-1). We'll try detect incompatible latin-1
+ * perversions by:
+ * - The use of GR (0xf0-0xff) chars.
+ * - The lack of ESC sequences and shifts (LS0,LS1,SS2,SS3)
+ *
+ * An ASSUMTION here is that GR is not loaded with anything at the start of a
+ * teletex string, as per table 3 in section 8.23.5.2 in T-REC-X.590.200811.
+ *
+ * @retval @c true if chances are good that it's LATIN-1.
+ * @retval @c false if changes are very good that it's real teletex.
+ * @param pch The first char in the string.
+ * @param cch The string length.
+ *
+ * @remarks Useful info on Teletex and ISO/IEC-2022:
+ * https://www.mail-archive.com/asn1@asn1.org/msg00460.html
+ * http://en.wikipedia.org/wiki/ISO/IEC_2022
+ * http://www.open-std.org/cen/tc304/guide/GCONCEPT.HTM
+ * http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-035.pdf
+ */
+static RTASN1TELETEXVARIANT rtAsn1String_IsTeletexLatin1(const char *pch, uint32_t cch)
+{
+ RTASN1TELETEXVARIANT enmVariant = RTASN1TELETEXVARIANT_UNDECIDED;
+ while (cch-- > 0)
+ {
+ uint8_t const b = *pch;
+ if (b >= 0x20 && b <= 0x7f)
+ {
+ if (g_awcIsoIr102Decode[b - 0x20] == RTISO2022_UNUSED)
+ enmVariant = RTASN1TELETEXVARIANT_LATIN1;
+ }
+ else
+ {
+ if ( b == 0x1b /* ESC */
+ || b == 0x0e /* LS0 / SI */
+ || b == 0x0f /* LS1 / SO */
+ || b == 0x19 /* SS2 */
+ || b == 0x1d /* SS3 */ )
+ return RTASN1TELETEXVARIANT_TELETEX;
+
+ if (b >= 0xa0)
+ enmVariant = RTASN1TELETEXVARIANT_LATIN1;
+ else if (b >= 0x80 && b <= 0x9f)
+ {
+ /* Any use of C1 characters defined by windows cp-1252 will
+ lead us to believe it's the windows code rather than the
+ ISO/IEC standard that is being used. (Not that it makes
+ much of a difference, because we're gonna treat it as the
+ windows codepage, anyways.) */
+ if ( b != 0x81
+ && b != 0x8d
+ && b != 0x8f
+ && b != 0x90
+ && b != 0x9d)
+ return RTASN1TELETEXVARIANT_WIN_1252;
+ }
+ }
+ }
+ return RTASN1TELETEXVARIANT_UNDECIDED;
+}
+
+
+/**
+ * Checks the encoding of an ASN.1 string according to it's tag.
+ *
+ * @returns IPRT status code.
+ * @param pThis The string to santity check.
+ * @param pErrInfo Where to store extra error info. Optional.
+ * @param pcchUtf8 Where to return the UTF-8 string length. Optional.
+ */
+static int rtAsn1String_CheckSanity(PCRTASN1STRING pThis, PRTERRINFO pErrInfo, const char *pszErrorTag, size_t *pcchUtf8)
+{
+ int rc;
+ uint32_t cch = pThis->Asn1Core.cb;
+ size_t cchUtf8 = cch;
+ const char *pch = pThis->Asn1Core.uData.pch;
+ uint32_t uTag = RTASN1CORE_GET_TAG(&pThis->Asn1Core);
+ switch (uTag)
+ {
+ case ASN1_TAG_UTF8_STRING:
+ rc = RTStrValidateEncodingEx(pch, cch, 0);
+ if (RT_SUCCESS(rc))
+ break;
+ return RTErrInfoSetF(pErrInfo, VERR_ASN1_INVALID_UTF8_STRING_ENCODING,
+ "%s: Bad UTF-8 encoding (%Rrc)", pszErrorTag, rc);
+
+ case ASN1_TAG_NUMERIC_STRING:
+ while (cch-- > 0)
+ {
+ char ch = *pch++;
+ if ( !RT_C_IS_DIGIT(ch)
+ && ch != ' ')
+ return RTErrInfoSetF(pErrInfo, VERR_ASN1_INVALID_NUMERIC_STRING_ENCODING,
+ "%s: Bad numberic string: ch=%#x", pszErrorTag, ch);
+ }
+ break;
+
+ case ASN1_TAG_PRINTABLE_STRING:
+ while (cch-- > 0)
+ {
+ char ch = *pch++;
+ if ( !RT_C_IS_ALNUM(ch)
+ && ch != ' '
+ && ch != '\''
+ && ch != '('
+ && ch != ')'
+ && ch != '+'
+ && ch != ','
+ && ch != '-'
+ && ch != '.'
+ && ch != '/'
+ && ch != ':'
+ && ch != '='
+ && ch != '?'
+ )
+ return RTErrInfoSetF(pErrInfo, VERR_ASN1_INVALID_PRINTABLE_STRING_ENCODING,
+ "%s: Bad printable string: ch=%#x", pszErrorTag, ch);
+ }
+ break;
+
+ case ASN1_TAG_IA5_STRING: /* ASCII */
+ while (cch-- > 0)
+ {
+ unsigned char ch = *pch++;
+ if (ch == 0 || ch >= 0x80)
+ return RTErrInfoSetF(pErrInfo, VERR_ASN1_INVALID_IA5_STRING_ENCODING,
+ "%s: Bad IA5 string: ch=%#x", pszErrorTag, ch);
+ }
+ break;
+
+ case ASN1_TAG_T61_STRING:
+ switch (rtAsn1String_IsTeletexLatin1(pch, cch))
+ {
+ default:
+ rc = rtIso2022ValidateString(ASN1_TAG_T61_STRING, pch, cch, &cchUtf8, pErrInfo);
+ if (RT_FAILURE(rc))
+ return rc;
+ break;
+ case RTASN1TELETEXVARIANT_UNDECIDED:
+ case RTASN1TELETEXVARIANT_LATIN1:
+ case RTASN1TELETEXVARIANT_WIN_1252:
+ cchUtf8 = rtWin1252CalcUtf8Length(pch, cch);
+ break;
+ }
+ break;
+
+ case ASN1_TAG_VIDEOTEX_STRING:
+ case ASN1_TAG_GRAPHIC_STRING:
+ return VERR_ASN1_STRING_TYPE_NOT_IMPLEMENTED;
+
+ case ASN1_TAG_VISIBLE_STRING:
+ while (cch-- > 0)
+ {
+ unsigned char ch = *pch++;
+ if (ch < 0x20 || ch >= 0x7f)
+ return RTErrInfoSetF(pErrInfo, VERR_ASN1_INVALID_VISIBLE_STRING_ENCODING,
+ "%s: Bad visible string: ch=%#x", pszErrorTag, ch);
+ }
+ break;
+
+ case ASN1_TAG_GENERAL_STRING:
+ return VERR_ASN1_STRING_TYPE_NOT_IMPLEMENTED;
+
+ case ASN1_TAG_UNIVERSAL_STRING:
+ if (!(cch & 3))
+ {
+ uint8_t const *pb = (uint8_t const *)pch;
+ cchUtf8 = 0;
+ while (cch > 0)
+ {
+ RTUNICP uc = RT_MAKE_U32_FROM_U8(pb[3], pb[2], pb[1], pb[0]); /* big endian */
+ if (!RTUniCpIsValid(uc))
+ return RTErrInfoSetF(pErrInfo, VERR_ASN1_INVALID_UNIVERSAL_STRING_ENCODING,
+ "%s: Bad universal string: uc=%#x", pszErrorTag, uc);
+ cchUtf8 += RTUniCpCalcUtf8Len(uc);
+
+ /* next */
+ pb += 4;
+ cch -= 4;
+ }
+ break;
+ }
+ return RTErrInfoSetF(pErrInfo, VERR_ASN1_INVALID_UNIVERSAL_STRING_ENCODING,
+ "%s: Bad universal string: size not a multiple of 4: cch=%#x", pszErrorTag, cch);
+
+ case ASN1_TAG_BMP_STRING:
+ if (!(cch & 1))
+ {
+ uint8_t const *pb = (uint8_t const *)pch;
+ cchUtf8 = 0;
+ while (cch > 0)
+ {
+ RTUNICP uc = RT_MAKE_U32_FROM_U8(0, 0, pb[1], pb[0]); /* big endian */
+ if (!RTUniCpIsValid(uc))
+ return RTErrInfoSetF(pErrInfo, VERR_ASN1_INVALID_BMP_STRING_ENCODING,
+ "%s: Bad BMP string: uc=%#x", pszErrorTag, uc);
+ cchUtf8 += RTUniCpCalcUtf8Len(uc);
+
+ /* next */
+ pb += 2;
+ cch -= 2;
+ }
+ break;
+ }
+ return RTErrInfoSetF(pErrInfo, VERR_ASN1_INVALID_BMP_STRING_ENCODING,
+ "%s: Bad BMP string: odd number of bytes cch=%#x", pszErrorTag, cch);
+
+ default:
+ AssertMsgFailedReturn(("uTag=%#x\n", uTag), VERR_INTERNAL_ERROR_3);
+ }
+
+ if (pcchUtf8)
+ *pcchUtf8 = cchUtf8;
+ return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTAsn1String_CompareValues(PCRTASN1STRING pLeft, PCRTASN1STRING pRight)
+{
+ return RTAsn1String_CompareEx(pLeft, pRight, false /*fTypeToo*/);
+}
+
+
+RTDECL(int) RTAsn1String_CompareEx(PCRTASN1STRING pLeft, PCRTASN1STRING pRight, bool fTypeToo)
+{
+ Assert(pLeft && (!RTAsn1String_IsPresent(pLeft) || pLeft->Asn1Core.pOps == &g_RTAsn1String_Vtable));
+ Assert(pRight && (!RTAsn1String_IsPresent(pRight) || pRight->Asn1Core.pOps == &g_RTAsn1String_Vtable));
+
+ int iDiff;
+ if (RTAsn1String_IsPresent(pLeft))
+ {
+ if (RTAsn1String_IsPresent(pRight))
+ {
+ if (!fTypeToo || RTASN1CORE_GET_TAG(&pLeft->Asn1Core) == RTASN1CORE_GET_TAG(&pRight->Asn1Core))
+ iDiff = RTAsn1Core_CompareEx(&pLeft->Asn1Core, &pRight->Asn1Core, true /*fIgnoreTagAndClass*/);
+ else
+ iDiff = RTASN1CORE_GET_TAG(&pLeft->Asn1Core) < RTASN1CORE_GET_TAG(&pRight->Asn1Core) ? -1 : 1;
+ }
+ else
+ iDiff = 1;
+ }
+ else
+ iDiff = 0 - RTAsn1String_IsPresent(pRight);
+ return iDiff;
+}
+
+
+RTDECL(int) RTAsn1String_CompareWithString(PCRTASN1STRING pThis, const char *pszString, size_t cchString)
+{
+ Assert(pThis && (!RTAsn1String_IsPresent(pThis) || pThis->Asn1Core.pOps == &g_RTAsn1String_Vtable));
+ AssertPtr(pszString);
+
+ int iDiff;
+ if (RTAsn1String_IsPresent(pThis))
+ {
+ if (cchString == RTSTR_MAX)
+ cchString = strlen(pszString);
+
+ /*
+ * If there is a UTF-8 conversion available already, use it.
+ */
+ if (pThis->pszUtf8)
+ {
+ iDiff = strncmp(pThis->pszUtf8, pszString, cchString);
+ if (!iDiff && pThis->cchUtf8 != cchString)
+ iDiff = pThis->cchUtf8 < cchString ? -1 : 1;
+ }
+ else
+ {
+ /*
+ * Some types are UTF-8 compatible, so try do the compare without
+ * RTAsn1String_QueryUtf8.
+ */
+ uint32_t cch = pThis->Asn1Core.cb;
+ const char *pch = pThis->Asn1Core.uData.pch;
+ switch (RTASN1CORE_GET_TAG(&pThis->Asn1Core))
+ {
+ case ASN1_TAG_UTF8_STRING:
+ case ASN1_TAG_NUMERIC_STRING:
+ case ASN1_TAG_IA5_STRING:
+ case ASN1_TAG_PRINTABLE_STRING:
+ iDiff = strncmp(pch, pszString, RT_MIN(cch, cchString));
+ if (iDiff && cch != cchString)
+ iDiff = cch < cchString ? - 1 : 1;
+ break;
+
+ /** @todo Implement compating ASN1_TAG_BMP_STRING, ASN1_TAG_UNIVERSAL_STRING and
+ * ASN1_TAG_T61_STRING with UTF-8 strings without conversion. */
+
+ default:
+ {
+ int rc = RTAsn1String_QueryUtf8(pThis, NULL, NULL);
+ if (RT_SUCCESS(rc))
+ {
+ iDiff = strncmp(pThis->pszUtf8, pszString, cchString);
+ if (!iDiff && pThis->cchUtf8 != cchString)
+ iDiff = pThis->cchUtf8 < cchString ? -1 : 1;
+ }
+ else
+ iDiff = -1;
+ break;
+ }
+ }
+ }
+
+ /* Reduce the strcmp return value. */
+ if (iDiff != 0)
+ iDiff = iDiff < 0 ? -1 : 1;
+ }
+ else
+ iDiff = -1;
+ return iDiff;
+}
+
+
+RTDECL(int) RTAsn1String_QueryUtf8(PCRTASN1STRING pThis, const char **ppsz, size_t *pcch)
+{
+ Assert(pThis->Asn1Core.pOps == &g_RTAsn1String_Vtable);
+
+ char *psz = (char *)pThis->pszUtf8;
+ size_t cch = pThis->cchUtf8;
+ if (!psz)
+ {
+
+ /*
+ * Convert the first time around. Start by validating the encoding and
+ * calculating the length.
+ */
+ int rc = rtAsn1String_CheckSanity(pThis, NULL, NULL, &cch);
+ if (RT_SUCCESS(rc))
+ {
+ PRTASN1STRING pThisNC = (PRTASN1STRING)pThis;
+ rc = RTAsn1MemAllocZ(&pThisNC->Allocation, (void **)&psz, cch + 1);
+ if (RT_SUCCESS(rc))
+ {
+ /*
+ * Got memory, now do the actual convertion to UTF-8 / copying.
+ */
+ switch (RTASN1CORE_GET_TAG(&pThis->Asn1Core))
+ {
+ case ASN1_TAG_UTF8_STRING:
+ case ASN1_TAG_NUMERIC_STRING:
+ case ASN1_TAG_PRINTABLE_STRING:
+ case ASN1_TAG_IA5_STRING:
+ case ASN1_TAG_VISIBLE_STRING:
+ Assert(cch == pThis->Asn1Core.cb);
+ memcpy(psz, pThis->Asn1Core.uData.pch, cch);
+ psz[cch] = '\0';
+ break;
+
+ case ASN1_TAG_T61_STRING:
+ switch (rtAsn1String_IsTeletexLatin1(pThis->Asn1Core.uData.pch, pThis->Asn1Core.cb))
+ {
+ default:
+ rc = rtIso2022RecodeAsUtf8(ASN1_TAG_T61_STRING, pThis->Asn1Core.uData.pch, pThis->Asn1Core.cb,
+ psz, cch + 1);
+ break;
+ case RTASN1TELETEXVARIANT_UNDECIDED:
+ case RTASN1TELETEXVARIANT_LATIN1:
+ case RTASN1TELETEXVARIANT_WIN_1252:
+ rc = rtWin1252RecodeAsUtf8(pThis->Asn1Core.uData.pch, pThis->Asn1Core.cb, psz, cch + 1);
+ break;
+ }
+ AssertReturnStmt(RT_SUCCESS(rc), RTAsn1MemFree(&pThisNC->Allocation, psz), VERR_INTERNAL_ERROR_3);
+ break;
+
+ /* case ASN1_TAG_VIDEOTEX_STRING: */
+ /* case ASN1_TAG_GRAPHIC_STRING: */
+ /* case ASN1_TAG_GENERAL_STRING: */
+
+ case ASN1_TAG_UNIVERSAL_STRING:
+ {
+ char *pszDst = psz;
+ size_t cchSrc = pThis->Asn1Core.cb;
+ uint8_t const *pbSrc = (uint8_t const *)psz;
+ while (cchSrc > 0)
+ {
+ RTUNICP uc = RT_MAKE_U32_FROM_U8(pbSrc[3], pbSrc[2], pbSrc[1], pbSrc[0]); /* big endian */
+ AssertReturnStmt(RTUniCpIsValid(uc), RTAsn1MemFree(&pThisNC->Allocation, psz), VERR_INTERNAL_ERROR_2);
+ pszDst = RTStrPutCp(pszDst, uc);
+
+ /* next */
+ pbSrc += 4;
+ cchSrc -= 4;
+ }
+ Assert((size_t)(pszDst - psz) == cch);
+ break;
+ }
+
+ case ASN1_TAG_BMP_STRING:
+ rc = RTUtf16ToUtf8Ex(pThis->Asn1Core.uData.pwc, pThis->Asn1Core.cb / sizeof(RTUTF16),
+ (char **)&pThis->pszUtf8, cch + 1, NULL);
+ AssertReturnStmt(RT_SUCCESS(rc), RTAsn1MemFree(&pThisNC->Allocation, psz), VERR_INTERNAL_ERROR_3);
+ break;
+
+ default:
+ RTAsn1MemFree(&pThisNC->Allocation, psz);
+ AssertMsgFailedReturn(("uTag=%#x\n", RTASN1CORE_GET_TAG(&pThis->Asn1Core)), VERR_INTERNAL_ERROR_3);
+ }
+
+ /*
+ * Successfully produced UTF-8. Save it in the object.
+ */
+ pThisNC->pszUtf8 = psz;
+ pThisNC->cchUtf8 = (uint32_t)cch;
+ }
+ else
+ return rc;
+ }
+ else
+ return rc;
+ }
+
+ /*
+ * Success.
+ */
+ if (ppsz)
+ *ppsz = psz;
+ if (pcch)
+ *pcch = cch;
+ return VINF_SUCCESS;
+}
+
+
+
+RTDECL(int) RTAsn1String_QueryUtf8Len(PCRTASN1STRING pThis, size_t *pcch)
+{
+ Assert(pThis->Asn1Core.pOps == &g_RTAsn1String_Vtable);
+
+ size_t cch = pThis->cchUtf8;
+ if (!cch && !pThis->pszUtf8)
+ {
+ int rc = rtAsn1String_CheckSanity(pThis, NULL, NULL, &cch);
+ if (RT_FAILURE(rc))
+ return rc;
+ }
+
+ *pcch = cch;
+ return VINF_SUCCESS;
+}
+
+
+
+
+RTDECL(int) RTAsn1String_InitEx(PRTASN1STRING pThis, uint32_t uTag, void const *pvValue, size_t cbValue,
+ PCRTASN1ALLOCATORVTABLE pAllocator)
+{
+ RT_ZERO(*pThis);
+ AssertMsgReturn(uTag < RT_ELEMENTS(g_acbStringTags) && g_acbStringTags[uTag] > 0, ("uTag=%#x\n", uTag),
+ VERR_INVALID_PARAMETER);
+
+ RTAsn1MemInitAllocation(&pThis->Allocation, pAllocator);
+ RTAsn1Core_InitEx(&pThis->Asn1Core,
+ uTag,
+ ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_PRIMITIVE,
+ &g_RTAsn1String_Vtable,
+ RTASN1CORE_F_PRESENT | RTASN1CORE_F_PRIMITE_TAG_STRUCT);
+
+ if (cbValue > 0)
+ {
+ int rc = RTAsn1ContentDup(&pThis->Asn1Core, pvValue, cbValue, pAllocator);
+ if (RT_FAILURE(rc))
+ return rc;
+ }
+
+ return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTAsn1String_InitWithValue(PRTASN1STRING pThis, const char *pszUtf8Value, PCRTASN1ALLOCATORVTABLE pAllocator)
+{
+ Assert(RTStrValidateEncoding(pszUtf8Value));
+ return RTAsn1String_InitEx(pThis, ASN1_TAG_UTF8_STRING, pszUtf8Value, strlen(pszUtf8Value), pAllocator);
+}
+
+
+RTDECL(int) RTAsn1String_RecodeAsUtf8(PRTASN1STRING pThis, PCRTASN1ALLOCATORVTABLE pAllocator)
+{
+ /*
+ * Query the UTF-8 string. Do this even if it's already an
+ * ASN1_TAG_UTF8_STRING object as it makes sure we've got a valid UTF-8
+ * string upon successful return.
+ */
+ int rc = RTAsn1String_QueryUtf8(pThis, NULL, NULL);
+ if (RT_SUCCESS(rc))
+ {
+ if (RTASN1CORE_GET_TAG(&pThis->Asn1Core) != ASN1_TAG_UTF8_STRING)
+ {
+ /*
+ * Resize the content, copy the UTF-8 bytes in there, and change
+ * the tag.
+ */
+ rc = RTAsn1ContentReallocZ(&pThis->Asn1Core, pThis->cchUtf8, pAllocator);
+ if (RT_SUCCESS(rc))
+ {
+ memcpy((void *)pThis->Asn1Core.uData.pv, pThis->pszUtf8, pThis->cchUtf8);
+ rc = RTAsn1Core_ChangeTag(&pThis->Asn1Core, ASN1_TAG_UTF8_STRING);
+ }
+ }
+ }
+ return rc;
+}
+
+
+
+/*
+ * ASN.1 STRING - Standard Methods.
+ */
+
+RT_DECL_DATA_CONST(RTASN1COREVTABLE const) g_RTAsn1String_Vtable =
+{
+ "RTAsn1String",
+ sizeof(RTASN1STRING),
+ UINT8_MAX,
+ ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_PRIMITIVE,
+ 0,
+ (PFNRTASN1COREVTDTOR)RTAsn1String_Delete,
+ NULL,
+ (PFNRTASN1COREVTCLONE)RTAsn1String_Clone,
+ (PFNRTASN1COREVTCOMPARE)RTAsn1String_Compare,
+ (PFNRTASN1COREVTCHECKSANITY)RTAsn1String_CheckSanity,
+ NULL,
+ NULL
+};
+
+
+RTDECL(int) RTAsn1String_Init(PRTASN1STRING pThis, PCRTASN1ALLOCATORVTABLE pAllocator)
+{
+ return RTAsn1String_InitEx(pThis, ASN1_TAG_UTF8_STRING, NULL /*pvValue*/, 0 /*cbValue*/, pAllocator);
+}
+
+
+RTDECL(int) RTAsn1String_Clone(PRTASN1STRING pThis, PCRTASN1STRING pSrc, PCRTASN1ALLOCATORVTABLE pAllocator)
+{
+ AssertPtr(pSrc); AssertPtr(pThis); AssertPtr(pAllocator);
+ RT_ZERO(*pThis);
+ if (RTAsn1String_IsPresent(pSrc))
+ {
+ AssertReturn(pSrc->Asn1Core.pOps == &g_RTAsn1String_Vtable, VERR_INTERNAL_ERROR_3);
+ int rc = RTAsn1Core_CloneContent(&pThis->Asn1Core, &pSrc->Asn1Core, pAllocator);
+ if (RT_SUCCESS(rc))
+ {
+ /* Don't copy the UTF-8 representation, decode it when queried. */
+ RTAsn1MemInitAllocation(&pThis->Allocation, pAllocator);
+ return VINF_SUCCESS;
+ }
+ }
+ return VINF_SUCCESS;
+}
+
+
+RTDECL(void) RTAsn1String_Delete(PRTASN1STRING pThis)
+{
+ if ( pThis
+ && RTAsn1String_IsPresent(pThis))
+ {
+ Assert(pThis->Asn1Core.pOps == &g_RTAsn1String_Vtable);
+
+ if (pThis->Allocation.cbAllocated)
+ RTAsn1MemFree(&pThis->Allocation, (char *)pThis->pszUtf8);
+ RTAsn1ContentFree(&pThis->Asn1Core);
+ RT_ZERO(*pThis);
+ }
+}
+
+
+RTDECL(int) RTAsn1String_Enum(PRTASN1STRING pThis, PFNRTASN1ENUMCALLBACK pfnCallback, uint32_t uDepth, void *pvUser)
+{
+ Assert(pThis && (!RTAsn1String_IsPresent(pThis) || pThis->Asn1Core.pOps == &g_RTAsn1String_Vtable));
+
+ /* No children to enumerate. */
+ return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTAsn1String_Compare(PCRTASN1STRING pLeft, PCRTASN1STRING pRight)
+{
+ /* Compare tag and binary value. */
+ return RTAsn1String_CompareEx(pLeft, pRight, true /*fTypeToo*/);
+}
+
+
+RTDECL(int) RTAsn1String_CheckSanity(PCRTASN1STRING pThis, uint32_t fFlags, PRTERRINFO pErrInfo, const char *pszErrorTag)
+{
+ if (RT_UNLIKELY(!RTAsn1String_IsPresent(pThis)))
+ return RTErrInfoSetF(pErrInfo, VERR_ASN1_NOT_PRESENT, "%s: Missing (STRING).", pszErrorTag);
+ return rtAsn1String_CheckSanity(pThis, pErrInfo, pszErrorTag, NULL /*pcchUtf8*/);
+}
+
+
+/*
+ * Generate code for the tag specific methods.
+ * Note! This is very similar to what we're doing in asn1-ut-time.cpp.
+ */
+#define RTASN1STRING_IMPL(a_uTag, a_szTag, a_Api) \
+ \
+ RTDECL(int) RT_CONCAT(a_Api,_Init)(PRTASN1STRING pThis, PCRTASN1ALLOCATORVTABLE pAllocator) \
+ { \
+ return RTAsn1String_InitEx(pThis, a_uTag, NULL /*pvValue*/, 0 /*cbValue*/, pAllocator); \
+ } \
+ \
+ RTDECL(int) RT_CONCAT(a_Api,_Clone)(PRTASN1STRING pThis, PCRTASN1STRING pSrc, PCRTASN1ALLOCATORVTABLE pAllocator) \
+ { \
+ AssertReturn(RTASN1CORE_GET_TAG(&pSrc->Asn1Core) == a_uTag || !RTAsn1String_IsPresent(pSrc), \
+ VERR_ASN1_STRING_TAG_MISMATCH); \
+ return RTAsn1String_Clone(pThis, pSrc, pAllocator); \
+ } \
+ \
+ RTDECL(void) RT_CONCAT(a_Api,_Delete)(PRTASN1STRING pThis) \
+ { \
+ Assert( !pThis \
+ || !RTAsn1String_IsPresent(pThis) \
+ || ( pThis->Asn1Core.pOps == &g_RTAsn1String_Vtable \
+ && RTASN1CORE_GET_TAG(&pThis->Asn1Core) == a_uTag) ); \
+ RTAsn1String_Delete(pThis); \
+ } \
+ \
+ RTDECL(int) RT_CONCAT(a_Api,_Enum)(PRTASN1STRING pThis, PFNRTASN1ENUMCALLBACK pfnCallback, uint32_t uDepth, void *pvUser) \
+ { \
+ Assert( pThis \
+ && ( !RTAsn1String_IsPresent(pThis) \
+ || ( pThis->Asn1Core.pOps == &g_RTAsn1String_Vtable \
+ && RTASN1CORE_GET_TAG(&pThis->Asn1Core) == a_uTag) ) ); \
+ /* No children to enumerate. */ \
+ return VINF_SUCCESS; \
+ } \
+ \
+ RTDECL(int) RT_CONCAT(a_Api,_Compare)(PCRTASN1STRING pLeft, PCRTASN1STRING pRight) \
+ { \
+ int iDiff = RTAsn1String_CompareEx(pLeft, pRight, true /*fTypeToo*/); \
+ if (!iDiff && RTASN1CORE_GET_TAG(&pLeft->Asn1Core) != a_uTag && RTAsn1String_IsPresent(pLeft)) \
+ iDiff = RTASN1CORE_GET_TAG(&pLeft->Asn1Core) < a_uTag ? -1 : 1; \
+ return iDiff; \
+ } \
+ \
+ RTDECL(int) RT_CONCAT(a_Api,_CheckSanity)(PCRTASN1STRING pThis, uint32_t fFlags, \
+ PRTERRINFO pErrInfo, const char *pszErrorTag) \
+ { \
+ if (RTASN1CORE_GET_TAG(&pThis->Asn1Core) != a_uTag && RTAsn1String_IsPresent(pThis)) \
+ return RTErrInfoSetF(pErrInfo, VERR_ASN1_STRING_TAG_MISMATCH, "%s: uTag=%#x, expected %#x (%s)", \
+ pszErrorTag, RTASN1CORE_GET_TAG(&pThis->Asn1Core), a_uTag, a_szTag); \
+ return RTAsn1String_CheckSanity(pThis, fFlags, pErrInfo, pszErrorTag); \
+ }
+
+#include "asn1-ut-string-template2.h"
+
+
+/*
+ * Generate code for the associated collection types.
+ */
+#define RTASN1TMPL_TEMPLATE_FILE "../common/asn1/asn1-ut-string-template.h"
+#include <iprt/asn1-generator-internal-header.h>
+#include <iprt/asn1-generator-core.h>
+#include <iprt/asn1-generator-init.h>
+#include <iprt/asn1-generator-sanity.h>
+
diff --git a/src/VBox/Runtime/common/asn1/asn1-ut-time-decode.cpp b/src/VBox/Runtime/common/asn1/asn1-ut-time-decode.cpp
new file mode 100644
index 00000000000..c1a610f9fc3
--- /dev/null
+++ b/src/VBox/Runtime/common/asn1/asn1-ut-time-decode.cpp
@@ -0,0 +1,389 @@
+/* $Id$ */
+/** @file
+ * IPRT - ASN.1, UTC TIME and GENERALIZED TIME Types, Decoding.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/asn1.h>
+
+#include <iprt/alloca.h>
+#include <iprt/err.h>
+#include <iprt/string.h>
+#include <iprt/ctype.h>
+
+#include <iprt/formats/asn1.h>
+
+
+/**
+ * Common code for UTCTime and GeneralizedTime converters that normalizes the
+ * converted time and checks that the input values doesn't change.
+ *
+ * @returns IPRT status code.
+ * @param pCursor The cursor to use when reporting an error.
+ * @param pThis The time to normalize and check.
+ * @param pszType The type name.
+ * @param pszErrorTag The error tag.
+ */
+static int rtAsn1Time_NormalizeTime(PRTASN1CURSOR pCursor, PRTASN1TIME pThis, const char *pszType, const char *pszErrorTag)
+{
+ int rc;
+ if ( pThis->Time.u8Month > 0
+ && pThis->Time.u8Month <= 12
+ && pThis->Time.u8Hour < 24
+ && pThis->Time.u8Minute < 60
+ && pThis->Time.u8Second < 60) /** @todo what about leap seconds? */
+ {
+ RTTIME const TimeCopy = pThis->Time;
+ if (RTTimeNormalize(&pThis->Time))
+ {
+ if ( TimeCopy.u8MonthDay == pThis->Time.u8MonthDay
+ && TimeCopy.u8Month == pThis->Time.u8Month
+ && TimeCopy.i32Year == pThis->Time.i32Year
+ && TimeCopy.u8Hour == pThis->Time.u8Hour
+ && TimeCopy.u8Minute == pThis->Time.u8Minute
+ && TimeCopy.u8Second == pThis->Time.u8Second)
+ return VINF_SUCCESS;
+
+ rc = RTAsn1CursorSetInfo(pCursor, VERR_ASN1_TIME_NORMALIZE_MISMATCH,
+ "%s: Normalized result not the same as %s: '%.*s'",
+ pszErrorTag, pszType, pThis->Asn1Core.cb, pThis->Asn1Core.uData.pch);
+ }
+ else
+ rc = RTAsn1CursorSetInfo(pCursor, VERR_ASN1_TIME_NORMALIZE_ERROR,
+ "%s: RTTimeNormalize failed on %s: '%.*s'",
+ pszErrorTag, pszType, pThis->Asn1Core.cb, pThis->Asn1Core.uData.pch);
+ }
+ else
+ rc = RTAsn1CursorSetInfo(pCursor, VERR_ASN1_TIME_BAD_NORMALIZE_INPUT,
+ "%s: Bad %s values: '%.*s'; mth=%u h=%u min=%u sec=%u",
+ pszErrorTag, pszType, pThis->Asn1Core.cb, pThis->Asn1Core.uData.pch,
+ pThis->Time.u8Month, pThis->Time.u8Hour, pThis->Time.u8Minute, pThis->Time.u8Second);
+ return rc;
+}
+
+
+/**
+ * Converts the UTCTime string into an the RTTIME member of RTASN1TIME.
+ *
+ * @returns IPRT status code.
+ * @param pCursor The cursor to use when reporting an error.
+ * @param pThis The time to parse.
+ * @param pszErrorTag The error tag.
+ */
+static int rtAsn1Time_ConvertUTCTime(PRTASN1CURSOR pCursor, PRTASN1TIME pThis, const char *pszErrorTag)
+{
+ /*
+ * While the current spec says the seconds field is not optional, this
+ * restriction was added later on. So, when parsing UTCTime we must deal
+ * with it being absent.
+ */
+ int rc;
+ bool fHaveSeconds = pThis->Asn1Core.cb == sizeof("YYMMDDHHMMSSZ") - 1;
+ if (fHaveSeconds || pThis->Asn1Core.cb == sizeof("YYMMDDHHMMZ") - 1)
+ {
+ const char *pachTime = pThis->Asn1Core.uData.pch;
+
+ /* Basic encoding validation. */
+ if ( RT_C_IS_DIGIT(pachTime[0]) /* Y */
+ && RT_C_IS_DIGIT(pachTime[1]) /* Y */
+ && RT_C_IS_DIGIT(pachTime[2]) /* M */
+ && RT_C_IS_DIGIT(pachTime[3]) /* M */
+ && RT_C_IS_DIGIT(pachTime[4]) /* D */
+ && RT_C_IS_DIGIT(pachTime[5]) /* D */
+ && RT_C_IS_DIGIT(pachTime[6]) /* H */
+ && RT_C_IS_DIGIT(pachTime[7]) /* H */
+ && RT_C_IS_DIGIT(pachTime[8]) /* M */
+ && RT_C_IS_DIGIT(pachTime[9]) /* M */
+ && ( !fHaveSeconds
+ || ( RT_C_IS_DIGIT(pachTime[10]) /* S */
+ && RT_C_IS_DIGIT(pachTime[11]) /* S */ ) )
+ && pachTime[fHaveSeconds ? 12 : 10] == 'Z'
+ )
+ {
+ /* Basic conversion. */
+ pThis->Time.i32Year = (pachTime[0] - '0') * 10 + (pachTime[1] - '0');
+ pThis->Time.i32Year += pThis->Time.i32Year < 50 ? 2000 : 1900;
+ pThis->Time.u8Month = (pachTime[2] - '0') * 10 + (pachTime[3] - '0');
+ pThis->Time.u8WeekDay = 0;
+ pThis->Time.u16YearDay = 0;
+ pThis->Time.u8MonthDay = (pachTime[4] - '0') * 10 + (pachTime[5] - '0');
+ pThis->Time.u8Hour = (pachTime[6] - '0') * 10 + (pachTime[7] - '0');
+ pThis->Time.u8Minute = (pachTime[8] - '0') * 10 + (pachTime[9] - '0');
+ if (fHaveSeconds)
+ pThis->Time.u8Second = (pachTime[10] - '0') * 10 + (pachTime[11] - '0');
+ else
+ pThis->Time.u8Second = 0;
+ pThis->Time.u32Nanosecond = 0;
+ pThis->Time.fFlags = RTTIME_FLAGS_TYPE_UTC;
+ pThis->Time.offUTC = 0;
+
+ /* Check the convered data and normalize the time structure. */
+ rc = rtAsn1Time_NormalizeTime(pCursor, pThis, "UTCTime", pszErrorTag);
+ if (RT_SUCCESS(rc))
+ return rc;
+ }
+ else
+ rc = RTAsn1CursorSetInfo(pCursor, VERR_ASN1_INVALID_UTC_TIME_ENCODING, "%s: Bad UTCTime encoding: '%.*s'",
+ pszErrorTag, pThis->Asn1Core.cb, pachTime);
+ }
+ else
+ rc = RTAsn1CursorSetInfo(pCursor, VERR_ASN1_INVALID_UTC_TIME_ENCODING, "%s: Bad UTCTime length: %#x",
+ pszErrorTag, pThis->Asn1Core.cb);
+ RT_ZERO(*pThis);
+ return rc;
+}
+
+
+/**
+ * Converts the fraction part of a generalized time into nanoseconds.
+ *
+ * @returns IPRT status code.
+ * @param pCursor The cursor to use when reporting an error.
+ * @param pchFraction Pointer to the start of the fraction (dot).
+ * @param cchFraction The length of the fraction.
+ * @param pThis The time object we're working on,
+ * Time.u32Nanoseconds will be update.
+ * @param pszErrorTag The error tag.
+ */
+static int rtAsn1Time_ConvertGeneralizedTimeFraction(PRTASN1CURSOR pCursor, const char *pchFraction, uint32_t cchFraction,
+ PRTASN1TIME pThis, const char *pszErrorTag)
+{
+ pThis->Time.u32Nanosecond = 0;
+
+ /*
+ * Check the dot.
+ */
+ if (*pchFraction == '.')
+ return RTAsn1CursorSetInfo(pCursor, VERR_ASN1_INVALID_GENERALIZED_TIME_ENCODING,
+ "%s: Expected GeneralizedTime fraction dot, found: '%c' ('%.*s')",
+ pszErrorTag, *pchFraction, pThis->Asn1Core.cb, pThis->Asn1Core.uData.pch);
+ pchFraction++;
+ cchFraction--;
+ if (!cchFraction)
+ return RTAsn1CursorSetInfo(pCursor, VERR_ASN1_INVALID_GENERALIZED_TIME_ENCODING,
+ "%s: No digit following GeneralizedTime fraction dot: '%.*s'",
+ pszErrorTag, pThis->Asn1Core.cb, pThis->Asn1Core);
+
+ /*
+ * Do the conversion.
+ */
+ char chLastDigit;
+ uint32_t uMult = 1000000000;
+ do
+ {
+ char chDigit = chLastDigit = *pchFraction;
+ if (!RT_C_IS_DIGIT(chDigit))
+ return RTAsn1CursorSetInfo(pCursor, VERR_ASN1_INVALID_GENERALIZED_TIME_ENCODING,
+ "%s: Bad GeneralizedTime fraction digit: '%.*s'",
+ pszErrorTag, pThis->Asn1Core.cb, pThis->Asn1Core.uData.pch);
+ pThis->Time.u32Nanosecond += uMult * (uint32_t)(chDigit - '0');
+
+ /* Advance */
+ cchFraction--;
+ pchFraction++;
+ uMult /= 10;
+ } while (cchFraction > 0 && uMult > 0);
+
+ /*
+ * Lazy bird: For now, we don't permit higher resolution than we can
+ * internally represent. Deal with this if it ever becomes an issue.
+ */
+ if (cchFraction > 0)
+ return RTAsn1CursorSetInfo(pCursor, VERR_ASN1_INVALID_GENERALIZED_TIME_ENCODING,
+ "%s: Bad GeneralizedTime fraction too long: '%.*s'",
+ pszErrorTag, pThis->Asn1Core.cb, pThis->Asn1Core.uData.pch);
+ if (chLastDigit == '0')
+ return RTAsn1CursorSetInfo(pCursor, VERR_ASN1_INVALID_GENERALIZED_TIME_ENCODING,
+ "%s: Trailing zeros not allowed for GeneralizedTime: '%.*s'",
+ pszErrorTag, pThis->Asn1Core.cb, pThis->Asn1Core.uData.pch);
+ return VINF_SUCCESS;
+}
+
+
+/**
+ * Converts the GeneralizedTime string into an the RTTIME member of RTASN1TIME.
+ *
+ * @returns IPRT status code.
+ * @param pCursor The cursor to use when reporting an error.
+ * @param pThis The time to parse.
+ * @param pszErrorTag The error tag.
+ */
+static int rtAsn1Time_ConvertGeneralizedTime(PRTASN1CURSOR pCursor, PRTASN1TIME pThis, const char *pszErrorTag)
+{
+ int rc;
+ if (pThis->Asn1Core.cb >= sizeof("YYYYMMDDHHMMSSZ") - 1)
+ {
+ const char *pachTime = pThis->Asn1Core.uData.pch;
+
+ /* Basic encoding validation. */
+ if ( RT_C_IS_DIGIT(pachTime[0]) /* Y */
+ && RT_C_IS_DIGIT(pachTime[1]) /* Y */
+ && RT_C_IS_DIGIT(pachTime[2]) /* Y */
+ && RT_C_IS_DIGIT(pachTime[3]) /* Y */
+ && RT_C_IS_DIGIT(pachTime[4]) /* M */
+ && RT_C_IS_DIGIT(pachTime[5]) /* M */
+ && RT_C_IS_DIGIT(pachTime[6]) /* D */
+ && RT_C_IS_DIGIT(pachTime[7]) /* D */
+ && RT_C_IS_DIGIT(pachTime[8]) /* H */
+ && RT_C_IS_DIGIT(pachTime[9]) /* H */
+ && RT_C_IS_DIGIT(pachTime[10]) /* M */
+ && RT_C_IS_DIGIT(pachTime[11]) /* M */
+ && RT_C_IS_DIGIT(pachTime[12]) /* S */ /** @todo was this once optional? */
+ && RT_C_IS_DIGIT(pachTime[13]) /* S */
+ && pachTime[pThis->Asn1Core.cb - 1] == 'Z'
+ )
+ {
+ /* Basic conversion. */
+ pThis->Time.i32Year = 1000 * (pachTime[0] - '0')
+ + 100 * (pachTime[1] - '0')
+ + 10 * (pachTime[2] - '0')
+ + (pachTime[3] - '0');
+ pThis->Time.u8Month = (pachTime[4] - '0') * 10 + (pachTime[5] - '0');
+ pThis->Time.u8WeekDay = 0;
+ pThis->Time.u16YearDay = 0;
+ pThis->Time.u8MonthDay = (pachTime[6] - '0') * 10 + (pachTime[7] - '0');
+ pThis->Time.u8Hour = (pachTime[8] - '0') * 10 + (pachTime[9] - '0');
+ pThis->Time.u8Minute = (pachTime[10] - '0') * 10 + (pachTime[11] - '0');
+ pThis->Time.u8Second = (pachTime[12] - '0') * 10 + (pachTime[13] - '0');
+ pThis->Time.u32Nanosecond = 0;
+ pThis->Time.fFlags = RTTIME_FLAGS_TYPE_UTC;
+ pThis->Time.offUTC = 0;
+
+ /* Optional fraction part. */
+ rc = VINF_SUCCESS;
+ uint32_t cchLeft = pThis->Asn1Core.cb - 14 - 1;
+ if (cchLeft > 0)
+ rc = rtAsn1Time_ConvertGeneralizedTimeFraction(pCursor, pachTime + 14, cchLeft, pThis, pszErrorTag);
+
+ /* Check the convered data and normalize the time structure. */
+ if (RT_SUCCESS(rc))
+ {
+ rc = rtAsn1Time_NormalizeTime(pCursor, pThis, "GeneralizedTime", pszErrorTag);
+ if (RT_SUCCESS(rc))
+ return VINF_SUCCESS;
+ }
+ }
+ else
+ rc = RTAsn1CursorSetInfo(pCursor, VERR_ASN1_INVALID_GENERALIZED_TIME_ENCODING,
+ "%s: Bad GeneralizedTime encoding: '%.*s'",
+ pszErrorTag, pThis->Asn1Core.cb, pachTime);
+ }
+ else
+ rc = RTAsn1CursorSetInfo(pCursor, VERR_ASN1_INVALID_GENERALIZED_TIME_ENCODING,
+ "%s: Bad GeneralizedTime length: %#x",
+ pszErrorTag, pThis->Asn1Core.cb);
+ RT_ZERO(*pThis);
+ return rc;
+}
+
+
+RTDECL(int) RTAsn1Time_DecodeAsn1(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1TIME pThis, const char *pszErrorTag)
+{
+ Assert(!(fFlags & RTASN1CURSOR_GET_F_IMPLICIT));
+ int rc = RTAsn1CursorReadHdr(pCursor, &pThis->Asn1Core, pszErrorTag);
+ if (RT_SUCCESS(rc))
+ {
+ if (pThis->Asn1Core.fClass == (ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_PRIMITIVE) )
+ {
+ if (pThis->Asn1Core.uTag == ASN1_TAG_UTC_TIME)
+ {
+ RTAsn1CursorSkip(pCursor, pThis->Asn1Core.cb);
+ pThis->Asn1Core.pOps = &g_RTAsn1Time_Vtable;
+ pThis->Asn1Core.fFlags |= RTASN1CORE_F_PRIMITE_TAG_STRUCT;
+ return rtAsn1Time_ConvertUTCTime(pCursor, pThis, pszErrorTag);
+ }
+
+ if (pThis->Asn1Core.uTag == ASN1_TAG_GENERALIZED_TIME)
+ {
+ RTAsn1CursorSkip(pCursor, pThis->Asn1Core.cb);
+ pThis->Asn1Core.pOps = &g_RTAsn1Time_Vtable;
+ pThis->Asn1Core.fFlags |= RTASN1CORE_F_PRIMITE_TAG_STRUCT;
+ return rtAsn1Time_ConvertGeneralizedTime(pCursor, pThis, pszErrorTag);
+ }
+
+ rc = RTAsn1CursorSetInfo(pCursor, VERR_ASN1_CURSOR_TAG_MISMATCH, "%s: Not UTCTime nor GeneralizedTime: uTag=%#x",
+ pszErrorTag, pThis->Asn1Core.uTag);
+ }
+ else
+ rc = RTAsn1CursorSetInfo(pCursor, VERR_ASN1_CURSOR_TAG_FLAG_CLASS_MISMATCH,
+ "%s: Not UTCTime nor GeneralizedTime: fClass=%#x / uTag=%#x",
+ pszErrorTag, pThis->Asn1Core.fClass, pThis->Asn1Core.uTag);
+ }
+ RT_ZERO(*pThis);
+ return rc;
+}
+
+
+RTDECL(int) RTAsn1UtcTime_DecodeAsn1(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1TIME pThis, const char *pszErrorTag)
+{
+ int rc = RTAsn1CursorReadHdr(pCursor, &pThis->Asn1Core, pszErrorTag);
+ if (RT_SUCCESS(rc))
+ {
+ rc = RTAsn1CursorMatchTagClassFlags(pCursor, &pThis->Asn1Core, ASN1_TAG_UTC_TIME,
+ ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_PRIMITIVE,
+ fFlags, pszErrorTag, "UTC TIME");
+ if (RT_SUCCESS(rc))
+ {
+ RTAsn1CursorSkip(pCursor, pThis->Asn1Core.cb);
+ pThis->Asn1Core.pOps = &g_RTAsn1Time_Vtable;
+ pThis->Asn1Core.fFlags |= RTASN1CORE_F_PRIMITE_TAG_STRUCT;
+ return rtAsn1Time_ConvertUTCTime(pCursor, pThis, pszErrorTag);
+ }
+ }
+ RT_ZERO(*pThis);
+ return rc;
+}
+
+
+RTDECL(int) RTAsn1GeneralizedTime_DecodeAsn1(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1TIME pThis, const char *pszErrorTag)
+{
+ int rc = RTAsn1CursorReadHdr(pCursor, &pThis->Asn1Core, pszErrorTag);
+ if (RT_SUCCESS(rc))
+ {
+ rc = RTAsn1CursorMatchTagClassFlags(pCursor, &pThis->Asn1Core, ASN1_TAG_GENERALIZED_TIME,
+ ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_PRIMITIVE,
+ fFlags, pszErrorTag, "GENERALIZED TIME");
+ if (RT_SUCCESS(rc))
+ {
+ RTAsn1CursorSkip(pCursor, pThis->Asn1Core.cb);
+ pThis->Asn1Core.pOps = &g_RTAsn1Time_Vtable;
+ pThis->Asn1Core.fFlags |= RTASN1CORE_F_PRIMITE_TAG_STRUCT;
+ return rtAsn1Time_ConvertGeneralizedTime(pCursor, pThis, pszErrorTag);
+ }
+ }
+ RT_ZERO(*pThis);
+ return rc;
+}
+
+
+/*
+ * Generate code for the associated collection types.
+ */
+#define RTASN1TMPL_TEMPLATE_FILE "../common/asn1/asn1-ut-time-template.h"
+#include <iprt/asn1-generator-internal-header.h>
+#include <iprt/asn1-generator-asn1-decoder.h>
+
diff --git a/src/VBox/Runtime/common/asn1/asn1-ut-time-template.h b/src/VBox/Runtime/common/asn1/asn1-ut-time-template.h
new file mode 100644
index 00000000000..1c48a6eef79
--- /dev/null
+++ b/src/VBox/Runtime/common/asn1/asn1-ut-time-template.h
@@ -0,0 +1,46 @@
+/* $Id$ */
+/** @file
+ * IPRT - ASN.1, UTC TIME and GENERALIZED TIME Types, Collection Type Template.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+#define RTASN1TMPL_DECL RTDECL
+
+#define RTASN1TMPL_TYPE RTASN1SEQOFTIMES
+#define RTASN1TMPL_EXT_NAME RTAsn1SeqOfTimes
+#define RTASN1TMPL_INT_NAME rtAsn1SeqOfTimes
+RTASN1TMPL_SEQ_OF(RTASN1TIME, RTAsn1Time);
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+#define RTASN1TMPL_TYPE RTASN1SETOFTIMES
+#define RTASN1TMPL_EXT_NAME RTAsn1SetOfTimes
+#define RTASN1TMPL_INT_NAME rtAsn1SetOfTimes
+RTASN1TMPL_SET_OF(RTASN1TIME, RTAsn1Time);
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
diff --git a/src/VBox/Runtime/common/asn1/asn1-ut-time-template2.h b/src/VBox/Runtime/common/asn1/asn1-ut-time-template2.h
new file mode 100644
index 00000000000..ec01c76ca85
--- /dev/null
+++ b/src/VBox/Runtime/common/asn1/asn1-ut-time-template2.h
@@ -0,0 +1,30 @@
+/* $Id$ */
+/** @file
+ * IPRT - ASN.1, UTC TIME and GENERALIZED TIME Types, Template for type specific wrappers.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+RTASN1TIME_IMPL(ASN1_TAG_UTC_TIME, "UTC TIME", RTAsn1UtcTime)
+RTASN1TIME_IMPL(ASN1_TAG_GENERALIZED_TIME, "GENERALIZED TIME", RTAsn1GeneralizedTime)
+
diff --git a/src/VBox/Runtime/common/asn1/asn1-ut-time.cpp b/src/VBox/Runtime/common/asn1/asn1-ut-time.cpp
new file mode 100644
index 00000000000..340a833cc36
--- /dev/null
+++ b/src/VBox/Runtime/common/asn1/asn1-ut-time.cpp
@@ -0,0 +1,270 @@
+/* $Id$ */
+/** @file
+ * IPRT - ASN.1, UTC TIME and GENERALIZED TIME Types.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/asn1.h>
+
+#include <iprt/ctype.h>
+#include <iprt/err.h>
+#include <iprt/string.h>
+#include <iprt/uni.h>
+
+#include <iprt/formats/asn1.h>
+
+
+/*******************************************************************************
+* Global Variables *
+*******************************************************************************/
+/** The UTC TIME encoding of the IPRT epoch time. */
+static const char g_szEpochUtc[] = "700101000000Z";
+/** The GENERALIZED TIME encoding of the IPRT epoch time. */
+static const char g_szEpochGeneralized[] = "19700101000000Z";
+
+
+/*
+ * ASN.1 TIME - Special Methods.
+ */
+
+RTDECL(int) RTAsn1Time_InitEx(PRTASN1TIME pThis, uint32_t uTag, PCRTASN1ALLOCATORVTABLE pAllocator)
+{
+ AssertReturn(uTag == ASN1_TAG_UTC_TIME || uTag == ASN1_TAG_GENERALIZED_TIME, VERR_INVALID_PARAMETER);
+ RTAsn1Core_InitEx(&pThis->Asn1Core,
+ uTag,
+ ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_PRIMITIVE,
+ &g_RTAsn1Time_Vtable,
+ RTASN1CORE_F_PRESENT | RTASN1CORE_F_PRIMITE_TAG_STRUCT);
+ if (uTag == ASN1_TAG_UTC_TIME)
+ {
+ pThis->Asn1Core.cb = sizeof(g_szEpochUtc) - 1;
+ pThis->Asn1Core.uData.pv = &g_szEpochUtc[0];
+ }
+ else
+ {
+ pThis->Asn1Core.cb = sizeof(g_szEpochGeneralized) - 1;
+ pThis->Asn1Core.uData.pv = &g_szEpochGeneralized[0];
+ }
+ return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTAsn1Time_CompareWithTimeSpec(PCRTASN1TIME pLeft, PCRTTIMESPEC pTsRight)
+{
+ int iDiff = RTAsn1Time_IsPresent(pLeft) ? 0 : -1;
+ if (!iDiff)
+ {
+ RTTIMESPEC TsLeft;
+ AssertReturn(RTTimeImplode(&TsLeft, &pLeft->Time), -1);
+
+ iDiff = RTTimeSpecCompare(&TsLeft, pTsRight);
+ }
+
+ return iDiff;
+}
+
+
+/*
+ * ASN.1 TIME - Standard Methods.
+ */
+
+RT_DECL_DATA_CONST(RTASN1COREVTABLE const) g_RTAsn1Time_Vtable =
+{
+ "RTAsn1Time",
+ sizeof(RTASN1TIME),
+ UINT8_MAX,
+ ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_PRIMITIVE,
+ 0,
+ (PFNRTASN1COREVTDTOR)RTAsn1Time_Delete,
+ NULL,
+ (PFNRTASN1COREVTCLONE)RTAsn1Time_Clone,
+ (PFNRTASN1COREVTCOMPARE)RTAsn1Time_Compare,
+ (PFNRTASN1COREVTCHECKSANITY)RTAsn1Time_CheckSanity,
+ NULL,
+ NULL
+};
+
+
+RTDECL(int) RTAsn1Time_Init(PRTASN1TIME pThis, PCRTASN1ALLOCATORVTABLE pAllocator)
+{
+ /* Using UTC TIME since epoch would be encoded using UTC TIME following
+ X.509 Validity / Whatever time tag guidelines. */
+ return RTAsn1Time_InitEx(pThis, ASN1_TAG_UTC_TIME, pAllocator);
+}
+
+
+RTDECL(int) RTAsn1Time_Clone(PRTASN1TIME pThis, PCRTASN1TIME pSrc, PCRTASN1ALLOCATORVTABLE pAllocator)
+{
+ AssertPtr(pSrc); AssertPtr(pThis); AssertPtr(pAllocator);
+ RT_ZERO(*pThis);
+ if (RTAsn1Time_IsPresent(pSrc))
+ {
+ AssertReturn(pSrc->Asn1Core.pOps == &g_RTAsn1Time_Vtable, VERR_INTERNAL_ERROR_3);
+
+ int rc = RTAsn1Core_CloneContent(&pThis->Asn1Core, &pSrc->Asn1Core, pAllocator);
+ if (RT_SUCCESS(rc))
+ {
+ pThis->Time = pSrc->Time;
+ return VINF_SUCCESS;
+ }
+ return rc;
+ }
+ return VINF_SUCCESS;
+}
+
+
+RTDECL(void) RTAsn1Time_Delete(PRTASN1TIME pThis)
+{
+ if ( pThis
+ && RTAsn1Time_IsPresent(pThis))
+ {
+ Assert(pThis->Asn1Core.pOps == &g_RTAsn1Time_Vtable);
+
+ RTAsn1ContentFree(&pThis->Asn1Core);
+ RT_ZERO(*pThis);
+ }
+}
+
+
+RTDECL(int) RTAsn1Time_Enum(PRTASN1TIME pThis, PFNRTASN1ENUMCALLBACK pfnCallback, uint32_t uDepth, void *pvUser)
+{
+ Assert(pThis && (!RTAsn1Time_IsPresent(pThis) || pThis->Asn1Core.pOps == &g_RTAsn1Time_Vtable));
+
+ /* No children to enumerate. */
+ return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTAsn1Time_Compare(PCRTASN1TIME pLeft, PCRTASN1TIME pRight)
+{
+ Assert(pLeft && (!RTAsn1Time_IsPresent(pLeft) || pLeft->Asn1Core.pOps == &g_RTAsn1Time_Vtable));
+ Assert(pRight && (!RTAsn1Time_IsPresent(pRight) || pRight->Asn1Core.pOps == &g_RTAsn1Time_Vtable));
+
+ int iDiff;
+ if (RTAsn1Time_IsPresent(pLeft))
+ {
+ if (RTAsn1Time_IsPresent(pRight))
+ {
+ RTTIMESPEC TsLeft;
+ AssertReturn(RTTimeImplode(&TsLeft, &pLeft->Time), -1);
+
+ RTTIMESPEC TsRight;
+ AssertReturn(RTTimeImplode(&TsRight, &pRight->Time), 1);
+
+ iDiff = RTTimeSpecCompare(&TsLeft, &TsRight);
+ }
+ else
+ iDiff = -1;
+ }
+ else
+ iDiff = 0 - (int)RTAsn1Time_IsPresent(pRight);
+ return iDiff;
+}
+
+
+RTDECL(int) RTAsn1Time_CheckSanity(PCRTASN1TIME pThis, uint32_t fFlags, PRTERRINFO pErrInfo, const char *pszErrorTag)
+{
+ if (RT_UNLIKELY(!RTAsn1Time_IsPresent(pThis)))
+ return RTErrInfoSetF(pErrInfo, VERR_ASN1_NOT_PRESENT, "%s: Missing (TIME).", pszErrorTag);
+ return VINF_SUCCESS;
+}
+
+
+/*
+ * Generate code for the tag specific methods.
+ * Note! This is very similar to what we're doing in asn1-ut-string.cpp.
+ */
+#define RTASN1TIME_IMPL(a_uTag, a_szTag, a_Api) \
+ \
+ RTDECL(int) RT_CONCAT(a_Api,_Init)(PRTASN1TIME pThis, PCRTASN1ALLOCATORVTABLE pAllocator) \
+ { \
+ return RTAsn1Time_InitEx(pThis, a_uTag, pAllocator); \
+ } \
+ \
+ RTDECL(int) RT_CONCAT(a_Api,_Clone)(PRTASN1TIME pThis, PCRTASN1TIME pSrc, PCRTASN1ALLOCATORVTABLE pAllocator) \
+ { \
+ AssertReturn(RTASN1CORE_GET_TAG(&pSrc->Asn1Core) == a_uTag || !RTAsn1Time_IsPresent(pSrc), \
+ VERR_ASN1_TIME_TAG_MISMATCH); \
+ return RTAsn1Time_Clone(pThis, pSrc, pAllocator); \
+ } \
+ \
+ RTDECL(void) RT_CONCAT(a_Api,_Delete)(PRTASN1TIME pThis) \
+ { \
+ Assert( !pThis \
+ || !RTAsn1Time_IsPresent(pThis) \
+ || ( pThis->Asn1Core.pOps == &g_RTAsn1Time_Vtable \
+ && RTASN1CORE_GET_TAG(&pThis->Asn1Core) == a_uTag) ); \
+ RTAsn1Time_Delete(pThis); \
+ } \
+ \
+ RTDECL(int) RT_CONCAT(a_Api,_Enum)(PRTASN1TIME pThis, PFNRTASN1ENUMCALLBACK pfnCallback, uint32_t uDepth, void *pvUser) \
+ { \
+ Assert( pThis \
+ && ( !RTAsn1Time_IsPresent(pThis) \
+ || ( pThis->Asn1Core.pOps == &g_RTAsn1Time_Vtable \
+ && RTASN1CORE_GET_TAG(&pThis->Asn1Core) == a_uTag) ) ); \
+ /* No children to enumerate. */ \
+ return VINF_SUCCESS; \
+ } \
+ \
+ RTDECL(int) RT_CONCAT(a_Api,_Compare)(PCRTASN1TIME pLeft, PCRTASN1TIME pRight) \
+ { \
+ int iDiff = RTAsn1Time_Compare(pLeft, pRight); \
+ if (!iDiff && RTAsn1Time_IsPresent(pLeft)) \
+ { \
+ if (RTASN1CORE_GET_TAG(&pLeft->Asn1Core) == RTASN1CORE_GET_TAG(&pRight->Asn1Core)) \
+ { \
+ if (RTASN1CORE_GET_TAG(&pLeft->Asn1Core) != a_uTag) \
+ iDiff = RTASN1CORE_GET_TAG(&pLeft->Asn1Core) < a_uTag ? -1 : 1; \
+ } \
+ else \
+ iDiff = RTASN1CORE_GET_TAG(&pLeft->Asn1Core) < RTASN1CORE_GET_TAG(&pRight->Asn1Core) ? -1 : 1; \
+ } \
+ return iDiff; \
+ } \
+ \
+ RTDECL(int) RT_CONCAT(a_Api,_CheckSanity)(PCRTASN1TIME pThis, uint32_t fFlags, \
+ PRTERRINFO pErrInfo, const char *pszErrorTag) \
+ { \
+ if (RTASN1CORE_GET_TAG(&pThis->Asn1Core) != a_uTag && RTAsn1Time_IsPresent(pThis)) \
+ return RTErrInfoSetF(pErrInfo, VERR_ASN1_TIME_TAG_MISMATCH, "%s: uTag=%#x, expected %#x (%s)", \
+ pszErrorTag, RTASN1CORE_GET_TAG(&pThis->Asn1Core), a_uTag, a_szTag); \
+ return RTAsn1Time_CheckSanity(pThis, fFlags, pErrInfo, pszErrorTag); \
+ }
+
+#include "asn1-ut-time-template2.h"
+
+
+/*
+ * Generate code for the associated collection types.
+ */
+#define RTASN1TMPL_TEMPLATE_FILE "../common/asn1/asn1-ut-time-template.h"
+#include <iprt/asn1-generator-internal-header.h>
+#include <iprt/asn1-generator-core.h>
+#include <iprt/asn1-generator-init.h>
+#include <iprt/asn1-generator-sanity.h>
+
diff --git a/src/VBox/Runtime/common/checksum/md2.cpp b/src/VBox/Runtime/common/checksum/md2.cpp
new file mode 100644
index 00000000000..c0414f16461
--- /dev/null
+++ b/src/VBox/Runtime/common/checksum/md2.cpp
@@ -0,0 +1,72 @@
+/* $Id$ */
+/** @file
+ * IPRT - Message-Digest Algorithm 2.
+ */
+
+/*
+ * Copyright (C) 2009-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include "internal/iprt.h"
+
+#include <openssl/md2.h>
+
+#define RT_MD2_PRIVATE_CONTEXT
+#include <iprt/md2.h>
+
+#include <iprt/assert.h>
+
+AssertCompile(RT_SIZEOFMEMB(RTMD2CONTEXT, abPadding) >= RT_SIZEOFMEMB(RTMD2CONTEXT, Private));
+
+
+RTDECL(void) RTMd2(const void *pvBuf, size_t cbBuf, uint8_t pabDigest[RTMD2_HASH_SIZE])
+{
+ RTMD2CONTEXT Ctx;
+ RTMd2Init(&Ctx);
+ RTMd2Update(&Ctx, pvBuf, cbBuf);
+ RTMd2Final(&Ctx, pabDigest);
+}
+RT_EXPORT_SYMBOL(RTMd2);
+
+
+RTDECL(void) RTMd2Init(PRTMD2CONTEXT pCtx)
+{
+ MD2_Init(&pCtx->Private);
+}
+RT_EXPORT_SYMBOL(RTMd2Init);
+
+
+RTDECL(void) RTMd2Update(PRTMD2CONTEXT pCtx, const void *pvBuf, size_t cbBuf)
+{
+ MD2_Update(&pCtx->Private, (const unsigned char *)pvBuf, cbBuf);
+}
+RT_EXPORT_SYMBOL(RTMd2Update);
+
+
+RTDECL(void) RTMd2Final(PRTMD2CONTEXT pCtx, uint8_t pabDigest[RTMD2_HASH_SIZE])
+{
+ MD2_Final((unsigned char *)&pabDigest[0], &pCtx->Private);
+}
+RT_EXPORT_SYMBOL(RTMd2Final);
+
diff --git a/src/VBox/Runtime/common/checksum/md2str.cpp b/src/VBox/Runtime/common/checksum/md2str.cpp
new file mode 100644
index 00000000000..8158731a007
--- /dev/null
+++ b/src/VBox/Runtime/common/checksum/md2str.cpp
@@ -0,0 +1,49 @@
+/* $Id$ */
+/** @file
+ * IPRT - MD2 string functions.
+ */
+
+/*
+ * Copyright (C) 2009-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/md2.h>
+
+#include <iprt/assert.h>
+#include <iprt/err.h>
+#include <iprt/string.h>
+
+
+RTDECL(int) RTMd2ToString(uint8_t const pabDigest[RTMD2_HASH_SIZE], char *pszDigest, size_t cchDigest)
+{
+ return RTStrPrintHexBytes(pszDigest, cchDigest, &pabDigest[0], RTMD2_HASH_SIZE, 0 /*fFlags*/);
+}
+
+
+RTDECL(int) RTMd2FromString(char const *pszDigest, uint8_t pabDigest[RTMD2_HASH_SIZE])
+{
+ return RTStrConvertHexBytes(RTStrStripL(pszDigest), &pabDigest[0], RTMD2_HASH_SIZE, 0 /*fFlags*/);
+}
+
diff --git a/src/VBox/Runtime/common/crypto/Makefile.kup b/src/VBox/Runtime/common/crypto/Makefile.kup
new file mode 100644
index 00000000000..e69de29bb2d
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/Makefile.kup
diff --git a/src/VBox/Runtime/common/crypto/RTCrStoreCertAddFromFile.cpp b/src/VBox/Runtime/common/crypto/RTCrStoreCertAddFromFile.cpp
new file mode 100644
index 00000000000..ebe6d885f23
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/RTCrStoreCertAddFromFile.cpp
@@ -0,0 +1,114 @@
+/* $Id$ */
+/** @file
+ * IPRT - Cryptographic (Certificate) Store, RTCrStoreCertAddFromFile.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/crypto/store.h>
+
+#include <iprt/assert.h>
+#include <iprt/err.h>
+#include <iprt/crypto/pem.h>
+
+
+/*******************************************************************************
+* Global Variables *
+*******************************************************************************/
+static RTCRPEMMARKERWORD const g_aWords_Certificate[] = { { RT_STR_TUPLE("CERTIFICATE") } };
+/** X509 Certificate markers. */
+static RTCRPEMMARKER const g_aCertificateMarkers[] = { { g_aWords_Certificate, RT_ELEMENTS(g_aWords_Certificate) } };
+
+
+#if 0
+RTDECL(int) RTCrX509Certificates_ReadFromFile(const char *pszFilename, uint32_t fFlags,
+ PRTCRX509CERTIFICATES pCertificates, PRTERRINFO pErrInfo)
+{
+ AssertReturn(!fFlags, VERR_INVALID_FLAGS);
+ PCRTCRPEMSECTION pSectionHead;
+ int rc = RTCrPemReadFile(pszFilename, 0, g_aCertificateMarkers, RT_ELEMENTS(g_aCertificateMarkers), &pSectionHead, pErrInfo);
+ if (RT_SUCCESS(rc))
+ {
+ pCertificates->Allocation
+
+ PCRTCRPEMSECTION pCurSec = pSectionHead;
+ while (pCurSec)
+ {
+
+ pCurSec = pCurSec->pNext;
+ }
+
+ RTCrPemFreeSections(pSectionHead);
+ }
+ return rc;
+}
+#endif
+
+
+RTDECL(int) RTCrStoreCertAddFromFile(RTCRSTORE hStore, uint32_t fFlags, const char *pszFilename, PRTERRINFO pErrInfo)
+{
+ AssertReturn(!fFlags, VERR_INVALID_FLAGS);
+#if 0
+ RTCRX509CERTIFICATES Certs;
+ int rc = RTCrX509Certificates_ReadFromFile(pszFilename, 0, &Certs, pErrInfo);
+ if (RT_SUCCESS(rc))
+ {
+ for (uint32_t i = 0; i < Certs.cCerts; i++)
+ {
+ int rc2 = RTCrStoreCertAddEncoded(hStore, RTCRCERTCTX_F_ENC_X509_DER,
+ RTASN1CORE_GET_RAW_ASN1_PTR(&Certs.paCerts[i].SeqCore.Asn1Core),
+ RTASN1CORE_GET_RAW_ASN1_SIZE(&Certs.paCerts[i].SeqCore.Asn1Core),
+ RT_SUCCESS(rc) ? pErrInfo : NULL);
+ if (RT_FAILURE(rc2) && RT_SUCCESS(rc))
+ rc = rc2;
+ }
+
+ RTAsn1Destroy(&Certs.SetCore.Asn1Core);
+ }
+ return rc;
+#else
+
+ PCRTCRPEMSECTION pSectionHead;
+ int rc = RTCrPemReadFile(pszFilename, 0, g_aCertificateMarkers, RT_ELEMENTS(g_aCertificateMarkers), &pSectionHead, pErrInfo);
+ if (RT_SUCCESS(rc))
+ {
+ PCRTCRPEMSECTION pCurSec = pSectionHead;
+ while (pCurSec)
+ {
+ int rc2 = RTCrStoreCertAddEncoded(hStore, RTCRCERTCTX_F_ENC_X509_DER, pCurSec->pbData, pCurSec->cbData,
+ RT_SUCCESS(rc) ? pErrInfo : NULL);
+ if (RT_FAILURE(rc2) && RT_SUCCESS(rc))
+ rc = rc2;
+ pCurSec = pCurSec->pNext;
+ }
+
+ RTCrPemFreeSections(pSectionHead);
+ }
+ return rc;
+#endif
+}
+
diff --git a/src/VBox/Runtime/common/crypto/digest-builtin.cpp b/src/VBox/Runtime/common/crypto/digest-builtin.cpp
new file mode 100644
index 00000000000..e37c50e70be
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/digest-builtin.cpp
@@ -0,0 +1,493 @@
+/* $Id$ */
+/** @file
+ * IPRT - Crypto - Cryptographic Hash / Message Digest API, Built-in providers.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/crypto/digest.h>
+
+#include <iprt/err.h>
+#include <iprt/mem.h>
+#include <iprt/string.h>
+#include <iprt/md2.h>
+#include <iprt/md5.h>
+#include <iprt/sha.h>
+#include <iprt/crypto/pkix.h>
+
+#ifdef IPRT_WITH_OPENSSL
+# include "internal/iprt-openssl.h"
+# include <openssl/evp.h>
+#endif
+
+/*
+ * MD2
+ */
+
+/** @impl_interface_method{RTCRDIGESTDESC::pfnUpdate} */
+static DECLCALLBACK(void) rtCrDigestMd2_Update(void *pvState, const void *pvData, size_t cbData)
+{
+ RTMd2Update((PRTMD2CONTEXT)pvState, pvData, cbData);
+}
+
+/** @impl_interface_method{RTCRDIGESTDESC::pfnFinal} */
+static DECLCALLBACK(void) rtCrDigestMd2_Final(void *pvState, uint8_t *pbHash)
+{
+ RTMd2Final((PRTMD2CONTEXT)pvState, pbHash);
+}
+
+/** @impl_interface_method{RTCRDIGESTDESC::pfnInit} */
+static DECLCALLBACK(int) rtCrDigestMd2_Init(void *pvState, void *pvOpaque, bool fReInit)
+{
+ AssertReturn(pvOpaque == NULL, VERR_INVALID_PARAMETER);
+ RTMd2Init((PRTMD2CONTEXT)pvState);
+ return VINF_SUCCESS;
+}
+
+/** MD2 alias ODIs. */
+static const char * const g_apszMd2Aliases[] =
+{
+ RTCR_PKCS1_MD2_WITH_RSA_OID,
+ "1.3.14.3.2.24" /* OIW md2WithRSASignature */,
+ NULL
+};
+
+/** MD2 descriptor. */
+static RTCRDIGESTDESC const g_rtCrDigestMd2Desc =
+{
+ "md2",
+ "1.2.840.113549.2.2",
+ g_apszMd2Aliases,
+ RTDIGESTTYPE_MD2,
+ RTMD2_HASH_SIZE,
+ sizeof(RTMD2CONTEXT),
+ 0,
+ rtCrDigestMd2_Update,
+ rtCrDigestMd2_Final,
+ rtCrDigestMd2_Init,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+};
+
+
+/*
+ * MD5
+ */
+
+/** @impl_interface_method{RTCRDIGESTDESC::pfnUpdate} */
+static DECLCALLBACK(void) rtCrDigestMd5_Update(void *pvState, const void *pvData, size_t cbData)
+{
+ RTMd5Update((PRTMD5CONTEXT)pvState, pvData, cbData);
+}
+
+/** @impl_interface_method{RTCRDIGESTDESC::pfnFinal} */
+static DECLCALLBACK(void) rtCrDigestMd5_Final(void *pvState, uint8_t *pbHash)
+{
+ RTMd5Final(pbHash, (PRTMD5CONTEXT)pvState);
+}
+
+/** @impl_interface_method{RTCRDIGESTDESC::pfnInit} */
+static DECLCALLBACK(int) rtCrDigestMd5_Init(void *pvState, void *pvOpaque, bool fReInit)
+{
+ AssertReturn(pvOpaque == NULL, VERR_INVALID_PARAMETER);
+ RTMd5Init((PRTMD5CONTEXT)pvState);
+ return VINF_SUCCESS;
+}
+
+/** MD5 alias ODIs. */
+static const char * const g_apszMd5Aliases[] =
+{
+ RTCR_PKCS1_MD5_WITH_RSA_OID,
+ "1.3.14.3.2.25" /* OIW md5WithRSASignature */,
+ NULL
+};
+
+/** MD5 descriptor. */
+static RTCRDIGESTDESC const g_rtCrDigestMd5Desc =
+{
+ "md5",
+ "1.2.840.113549.2.5",
+ g_apszMd5Aliases,
+ RTDIGESTTYPE_MD5,
+ RTMD5_HASH_SIZE,
+ sizeof(RTMD5CONTEXT),
+ 0,
+ rtCrDigestMd5_Update,
+ rtCrDigestMd5_Final,
+ rtCrDigestMd5_Init,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+};
+
+
+/*
+ * SHA-1
+ */
+
+/** @impl_interface_method{RTCRDIGESTDESC::pfnUpdate} */
+static DECLCALLBACK(void) rtCrDigestSha1_Update(void *pvState, const void *pvData, size_t cbData)
+{
+ RTSha1Update((PRTSHA1CONTEXT)pvState, pvData, cbData);
+}
+
+/** @impl_interface_method{RTCRDIGESTDESC::pfnFinal} */
+static DECLCALLBACK(void) rtCrDigestSha1_Final(void *pvState, uint8_t *pbHash)
+{
+ RTSha1Final((PRTSHA1CONTEXT)pvState, pbHash);
+}
+
+/** @impl_interface_method{RTCRDIGESTDESC::pfnInit} */
+static DECLCALLBACK(int) rtCrDigestSha1_Init(void *pvState, void *pvOpaque, bool fReInit)
+{
+ AssertReturn(pvOpaque == NULL, VERR_INVALID_PARAMETER);
+ RTSha1Init((PRTSHA1CONTEXT)pvState);
+ return VINF_SUCCESS;
+}
+
+/** SHA-1 alias ODIs. */
+static const char * const g_apszSha1Aliases[] =
+{
+ RTCR_PKCS1_SHA1_WITH_RSA_OID,
+ "1.3.14.3.2.29" /* OIW sha1WithRSASignature */,
+ NULL
+};
+
+/** SHA-1 descriptor. */
+static RTCRDIGESTDESC const g_rtCrDigestSha1Desc =
+{
+ "sha-1",
+ "1.3.14.3.2.26",
+ g_apszSha1Aliases,
+ RTDIGESTTYPE_SHA1,
+ RTSHA1_HASH_SIZE,
+ sizeof(RTSHA1CONTEXT),
+ 0,
+ rtCrDigestSha1_Update,
+ rtCrDigestSha1_Final,
+ rtCrDigestSha1_Init,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+};
+
+
+/*
+ * SHA-256
+ */
+
+/** @impl_interface_method{RTCRDIGESTDESC::pfnUpdate} */
+static DECLCALLBACK(void) rtCrDigestSha256_Update(void *pvState, const void *pvData, size_t cbData)
+{
+ RTSha256Update((PRTSHA256CONTEXT)pvState, pvData, cbData);
+}
+
+/** @impl_interface_method{RTCRDIGESTDESC::pfnFinal} */
+static DECLCALLBACK(void) rtCrDigestSha256_Final(void *pvState, uint8_t *pbHash)
+{
+ RTSha256Final((PRTSHA256CONTEXT)pvState, pbHash);
+}
+
+/** @impl_interface_method{RTCRDIGESTDESC::pfnInit} */
+static DECLCALLBACK(int) rtCrDigestSha256_Init(void *pvState, void *pvOpaque, bool fReInit)
+{
+ AssertReturn(pvOpaque == NULL, VERR_INVALID_PARAMETER);
+ RTSha256Init((PRTSHA256CONTEXT)pvState);
+ return VINF_SUCCESS;
+}
+
+/** SHA-256 alias ODIs. */
+static const char * const g_apszSha256Aliases[] =
+{
+ RTCR_PKCS1_SHA256_WITH_RSA_OID,
+ NULL
+};
+
+/** SHA-256 descriptor. */
+static RTCRDIGESTDESC const g_rtCrDigestSha256Desc =
+{
+ "sha-256",
+ "2.16.840.1.101.3.4.2.1",
+ g_apszSha256Aliases,
+ RTDIGESTTYPE_SHA256,
+ RTSHA256_HASH_SIZE,
+ sizeof(RTSHA256CONTEXT),
+ 0,
+ rtCrDigestSha256_Update,
+ rtCrDigestSha256_Final,
+ rtCrDigestSha256_Init,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+};
+
+
+/*
+ * SHA-512
+ */
+
+/** @impl_interface_method{RTCRDIGESTDESC::pfnUpdate} */
+static DECLCALLBACK(void) rtCrDigestSha512_Update(void *pvState, const void *pvData, size_t cbData)
+{
+ RTSha512Update((PRTSHA512CONTEXT)pvState, pvData, cbData);
+}
+
+/** @impl_interface_method{RTCRDIGESTDESC::pfnFinal} */
+static DECLCALLBACK(void) rtCrDigestSha512_Final(void *pvState, uint8_t *pbHash)
+{
+ RTSha512Final((PRTSHA512CONTEXT)pvState, pbHash);
+}
+
+/** @impl_interface_method{RTCRDIGESTDESC::pfnInit} */
+static DECLCALLBACK(int) rtCrDigestSha512_Init(void *pvState, void *pvOpaque, bool fReInit)
+{
+ AssertReturn(pvOpaque == NULL, VERR_INVALID_PARAMETER);
+ RTSha512Init((PRTSHA512CONTEXT)pvState);
+ return VINF_SUCCESS;
+}
+
+/** SHA-512 alias ODIs. */
+static const char * const g_apszSha512Aliases[] =
+{
+ RTCR_PKCS1_SHA512_WITH_RSA_OID,
+ NULL
+};
+
+/** SHA-512 descriptor. */
+static RTCRDIGESTDESC const g_rtCrDigestSha512Desc =
+{
+ "sha-512",
+ "2.16.840.1.101.3.4.2.3",
+ g_apszSha512Aliases,
+ RTDIGESTTYPE_SHA512,
+ RTSHA512_HASH_SIZE,
+ sizeof(RTSHA512CONTEXT),
+ 0,
+ rtCrDigestSha512_Update,
+ rtCrDigestSha512_Final,
+ rtCrDigestSha512_Init,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+};
+
+
+/**
+ * Array of built in message digest vtables.
+ */
+static PCRTCRDIGESTDESC const g_apDigestOps[] =
+{
+ &g_rtCrDigestMd5Desc,
+ &g_rtCrDigestSha1Desc,
+ &g_rtCrDigestSha256Desc,
+ &g_rtCrDigestSha512Desc,
+};
+
+
+#ifdef IPRT_WITH_OPENSSL
+/*
+ * OpenSSL EVP.
+ */
+
+/** @impl_interface_method{RTCRDIGESTDESC::pfnUpdate} */
+static DECLCALLBACK(void) rtCrDigestOsslEvp_Update(void *pvState, const void *pvData, size_t cbData)
+{
+ EVP_DigestUpdate((EVP_MD_CTX *)pvState, pvData, cbData);
+}
+
+
+/** @impl_interface_method{RTCRDIGESTDESC::pfnFinal} */
+static DECLCALLBACK(void) rtCrDigestOsslEvp_Final(void *pvState, uint8_t *pbHash)
+{
+ unsigned int cbHash = EVP_MAX_MD_SIZE;
+ EVP_DigestFinal((EVP_MD_CTX *)pvState, (unsigned char *)pbHash, &cbHash);
+}
+
+/** @impl_interface_method{RTCRDIGESTDESC::pfnInit} */
+static DECLCALLBACK(int) rtCrDigestOsslEvp_Init(void *pvState, void *pvOpaque, bool fReInit)
+{
+ EVP_MD_CTX *pThis = (EVP_MD_CTX *)pvState;
+ EVP_MD const *pEvpType = (EVP_MD const *)pvOpaque;
+
+ if (fReInit)
+ {
+ pEvpType = EVP_MD_CTX_md(pThis);
+ EVP_MD_CTX_cleanup(pThis);
+ }
+
+ AssertPtrReturn(pEvpType, VERR_INVALID_PARAMETER);
+ Assert(pEvpType->md_size);
+ if (EVP_DigestInit(pThis, pEvpType))
+ return VINF_SUCCESS;
+ return VERR_CR_DIGEST_OSSL_DIGEST_INIT_ERROR;
+}
+
+
+/** @impl_interface_method{RTCRDIGESTDESC::pfn} */
+static DECLCALLBACK(void) rtCrDigestOsslEvp_Delete(void *pvState)
+{
+ EVP_MD_CTX *pThis = (EVP_MD_CTX *)pvState;
+ EVP_MD_CTX_cleanup(pThis);
+}
+
+
+/** @impl_interface_method{RTCRDIGESTDESC::pfnClone} */
+static DECLCALLBACK(int) rtCrDigestOsslEvp_Clone(void *pvState, void const *pvSrcState)
+{
+ EVP_MD_CTX *pThis = (EVP_MD_CTX *)pvState;
+ EVP_MD_CTX const *pSrc = (EVP_MD_CTX const *)pvSrcState;
+
+ if (EVP_MD_CTX_copy(pThis, pSrc))
+ return VINF_SUCCESS;
+ return VERR_CR_DIGEST_OSSL_DIGEST_CTX_COPY_ERROR;
+}
+
+
+/** @impl_interface_method{RTCRDIGESTDESC::pfnGetHashSize} */
+static DECLCALLBACK(uint32_t) rtCrDigestOsslEvp_GetHashSize(void *pvState)
+{
+ EVP_MD_CTX *pThis = (EVP_MD_CTX *)pvState;
+ return EVP_MD_size(EVP_MD_CTX_md(pThis));
+}
+
+
+/** @impl_interface_method{RTCRDIGESTDESC::pfnGetHashSize} */
+static DECLCALLBACK(RTDIGESTTYPE) rtCrDigestOsslEvp_GetDigestType(void *pvState)
+{
+ EVP_MD_CTX *pThis = (EVP_MD_CTX *)pvState;
+ /** @todo figure which digest algorithm it is! */
+ return RTDIGESTTYPE_UNKNOWN;
+}
+
+
+/** Descriptor for the OpenSSL EVP base message digest provider. */
+static RTCRDIGESTDESC const g_rtCrDigestOpenSslDesc =
+{
+ "OpenSSL EVP",
+ NULL,
+ NULL,
+ RTDIGESTTYPE_UNKNOWN,
+ EVP_MAX_MD_SIZE,
+ sizeof(EVP_MD_CTX),
+ 0,
+ rtCrDigestOsslEvp_Update,
+ rtCrDigestOsslEvp_Final,
+ rtCrDigestOsslEvp_Init,
+ rtCrDigestOsslEvp_Delete,
+ rtCrDigestOsslEvp_Clone,
+ rtCrDigestOsslEvp_GetHashSize,
+ rtCrDigestOsslEvp_GetDigestType
+};
+
+#endif /* IPRT_WITH_OPENSSL */
+
+
+PCRTCRDIGESTDESC RTCrDigestFindByObjIdString(const char *pszObjId, void **ppvOpaque)
+{
+ if (ppvOpaque)
+ *ppvOpaque = NULL;
+
+ /*
+ * Primary OIDs.
+ */
+ uint32_t i = RT_ELEMENTS(g_apDigestOps);
+ while (i-- > 0)
+ if (strcmp(g_apDigestOps[i]->pszObjId, pszObjId) == 0)
+ return g_apDigestOps[i];
+
+ /*
+ * Alias OIDs.
+ */
+ i = RT_ELEMENTS(g_apDigestOps);
+ while (i-- > 0)
+ {
+ const char * const *ppszAliases = g_apDigestOps[i]->papszObjIdAliases;
+ if (ppszAliases)
+ for (; *ppszAliases; ppszAliases++)
+ if (strcmp(*ppszAliases, pszObjId) == 0)
+ return g_apDigestOps[i];
+ }
+
+#ifdef IPRT_WITH_OPENSSL
+ /*
+ * Try EVP and see if it knows the algorithm.
+ */
+ if (ppvOpaque)
+ {
+ rtCrOpenSslInit();
+ int iAlgoNid = OBJ_txt2nid(pszObjId);
+ if (iAlgoNid != NID_undef)
+ {
+ const char *pszAlogSn = OBJ_nid2sn(iAlgoNid);
+ const EVP_MD *pEvpMdType = EVP_get_digestbyname(pszAlogSn);
+ if (pEvpMdType)
+ {
+ /*
+ * Return the OpenSSL provider descriptor and the EVP_MD address.
+ */
+ Assert(pEvpMdType->md_size);
+ *ppvOpaque = (void *)pEvpMdType;
+ return &g_rtCrDigestOpenSslDesc;
+ }
+ }
+ }
+#endif
+ return NULL;
+}
+
+
+PCRTCRDIGESTDESC RTCrDigestFindByObjId(PCRTASN1OBJID pObjId, void **ppvOpaque)
+{
+ return RTCrDigestFindByObjIdString(pObjId->szObjId, ppvOpaque);
+}
+
+
+RTDECL(int) RTCrDigestCreateByObjIdString(PRTCRDIGEST phDigest, const char *pszObjId)
+{
+ void *pvOpaque;
+ PCRTCRDIGESTDESC pDesc = RTCrDigestFindByObjIdString(pszObjId, &pvOpaque);
+ if (pDesc)
+ return RTCrDigestCreate(phDigest, pDesc, pvOpaque);
+ return VERR_NOT_FOUND;
+}
+
+
+RTDECL(int) RTCrDigestCreateByObjId(PRTCRDIGEST phDigest, PCRTASN1OBJID pObjId)
+{
+ void *pvOpaque;
+ PCRTCRDIGESTDESC pDesc = RTCrDigestFindByObjId(pObjId, &pvOpaque);
+ if (pDesc)
+ return RTCrDigestCreate(phDigest, pDesc, pvOpaque);
+ return VERR_NOT_FOUND;
+}
+
diff --git a/src/VBox/Runtime/common/crypto/digest-core.cpp b/src/VBox/Runtime/common/crypto/digest-core.cpp
new file mode 100644
index 00000000000..fef09afe723
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/digest-core.cpp
@@ -0,0 +1,338 @@
+/* $Id$ */
+/** @file
+ * IPRT - Crypto - Cryptographic Hash / Message Digest API
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/crypto/digest.h>
+
+#include <iprt/asm.h>
+#include <iprt/err.h>
+#include <iprt/mem.h>
+#include <iprt/string.h>
+
+
+/*******************************************************************************
+* Structures and Typedefs *
+*******************************************************************************/
+/**
+ * Generic message digest instance.
+ */
+typedef struct RTCRDIGESTINT
+{
+ /** Magic value (RTCRDIGESTINT_MAGIC). */
+ uint32_t u32Magic;
+ /** Reference counter. */
+ uint32_t volatile cRefs;
+ /** Pointer to the message digest descriptor. */
+ PCRTCRDIGESTDESC pDesc;
+ /** The offset into abState of the storage space . At
+ * least RTCRDIGESTDESC::cbHash bytes is available at that location. */
+ uint32_t offHash;
+ /** State. */
+ uint32_t uState;
+ /** The number of bytes consumed. */
+ uint64_t cbConsumed;
+ /** Opaque data specific to the message digest algorithm, size given by
+ * RTCRDIGESTDESC::cbState. This is followed by space for the final hash at
+ * offHash with size RTCRDIGESTDESC::cbHash. */
+ uint8_t abState[1];
+} RTCRDIGESTINT;
+/** Pointer to a message digest instance. */
+typedef RTCRDIGESTINT *PRTCRDIGESTINT;
+
+/** Magic value for RTCRDIGESTINT::u32Magic (Ralph C. Merkle). */
+#define RTCRDIGESTINT_MAGIC UINT32_C(0x19520202)
+
+/** @name RTCRDIGESTINT::uState values.
+ * @{ */
+/** Ready for more data. */
+#define RTCRDIGEST_STATE_READY UINT32_C(1)
+/** The hash has been finalized and can be found at offHash. */
+#define RTCRDIGEST_STATE_FINAL UINT32_C(2)
+/** Busted state, can happen after re-init. */
+#define RTCRDIGEST_STATE_BUSTED UINT32_C(3)
+/** @} */
+
+
+
+RTDECL(int) RTCrDigestCreate(PRTCRDIGEST phDigest, PCRTCRDIGESTDESC pDesc, void *pvOpaque)
+{
+ AssertPtrReturn(phDigest, VERR_INVALID_POINTER);
+ AssertPtrReturn(pDesc, VERR_INVALID_POINTER);
+
+ int rc = VINF_SUCCESS;
+ uint32_t offHash = RT_ALIGN_32(pDesc->cbState, 8);
+ PRTCRDIGESTINT pThis = (PRTCRDIGESTINT)RTMemAllocZ(RT_OFFSETOF(RTCRDIGESTINT, abState[offHash + pDesc->cbHash]));
+ if (pThis)
+ {
+ pThis->u32Magic = RTCRDIGESTINT_MAGIC;
+ pThis->cRefs = 1;
+ pThis->offHash = offHash;
+ pThis->pDesc = pDesc;
+ pThis->uState = RTCRDIGEST_STATE_READY;
+ if (pDesc->pfnInit)
+ rc = pDesc->pfnInit(pThis->abState, pvOpaque, false /*fReInit*/);
+ if (RT_SUCCESS(rc))
+ {
+ *phDigest = pThis;
+ return VINF_SUCCESS;
+ }
+ pThis->u32Magic = 0;
+ RTMemFree(pThis);
+ }
+ else
+ rc = VERR_NO_MEMORY;
+ return rc;
+}
+
+
+RTDECL(int) RTCrDigestClone(PRTCRDIGEST phDigest, RTCRDIGEST hSrc)
+{
+ AssertPtrReturn(phDigest, VERR_INVALID_POINTER);
+ AssertPtrReturn(hSrc, VERR_INVALID_HANDLE);
+ AssertReturn(hSrc->u32Magic == RTCRDIGESTINT_MAGIC, VERR_INVALID_HANDLE);
+
+ int rc = VINF_SUCCESS;
+ uint32_t const offHash = hSrc->offHash;
+ PRTCRDIGESTINT pThis = (PRTCRDIGESTINT)RTMemAllocZ(RT_OFFSETOF(RTCRDIGESTINT, abState[offHash + hSrc->pDesc->cbHash]));
+ if (pThis)
+ {
+ pThis->u32Magic = RTCRDIGESTINT_MAGIC;
+ pThis->cRefs = 1;
+ pThis->offHash = offHash;
+ pThis->pDesc = hSrc->pDesc;
+ if (hSrc->pDesc->pfnClone)
+ rc = hSrc->pDesc->pfnClone(pThis->abState, hSrc->abState);
+ else
+ memcpy(pThis->abState, hSrc->abState, offHash);
+ memcpy(&pThis->abState[offHash], &hSrc->abState[offHash], hSrc->pDesc->cbHash);
+ pThis->uState = hSrc->uState;
+
+ if (RT_SUCCESS(rc))
+ {
+ *phDigest = pThis;
+ return VINF_SUCCESS;
+ }
+ pThis->u32Magic = 0;
+ RTMemFree(pThis);
+ }
+ else
+ rc = VERR_NO_MEMORY;
+ return rc;
+}
+
+
+RTDECL(int) RTCrDigestReset(RTCRDIGEST hDigest)
+{
+ PRTCRDIGESTINT pThis = hDigest;
+ AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
+ AssertReturn(pThis->u32Magic == RTCRDIGESTINT_MAGIC, VERR_INVALID_HANDLE);
+
+ pThis->cbConsumed = 0;
+ pThis->uState = RTCRDIGEST_STATE_READY;
+
+ int rc = VINF_SUCCESS;
+ if (pThis->pDesc->pfnInit)
+ {
+ rc = pThis->pDesc->pfnInit(pThis->abState, NULL, true /*fReInit*/);
+ if (RT_FAILURE(rc))
+ pThis->uState = RTCRDIGEST_STATE_BUSTED;
+ RT_BZERO(&pThis->abState[pThis->offHash], pThis->pDesc->cbHash);
+ }
+ else
+ RT_BZERO(pThis->abState, pThis->offHash + pThis->pDesc->cbHash);
+ return rc;
+}
+
+
+RTDECL(uint32_t) RTCrDigestRetain(RTCRDIGEST hDigest)
+{
+ PRTCRDIGESTINT pThis = hDigest;
+ AssertPtrReturn(pThis, UINT32_MAX);
+ AssertReturn(pThis->u32Magic == RTCRDIGESTINT_MAGIC, UINT32_MAX);
+
+ uint32_t cRefs = ASMAtomicIncU32(&pThis->cRefs);
+ Assert(cRefs < 64);
+ return cRefs;
+}
+
+
+RTDECL(uint32_t) RTCrDigestRelease(RTCRDIGEST hDigest)
+{
+ PRTCRDIGESTINT pThis = hDigest;
+ if (pThis == NIL_RTCRDIGEST)
+ return 0;
+ AssertPtrReturn(pThis, UINT32_MAX);
+ AssertReturn(pThis->u32Magic == RTCRDIGESTINT_MAGIC, UINT32_MAX);
+
+ uint32_t cRefs = ASMAtomicDecU32(&pThis->cRefs);
+ if (!cRefs)
+ {
+ pThis->u32Magic = ~RTCRDIGESTINT_MAGIC;
+ if (pThis->pDesc->pfnDelete)
+ pThis->pDesc->pfnDelete(pThis->abState);
+ RTMemFree(pThis);
+ }
+ Assert(cRefs < 64);
+ return cRefs;
+}
+
+
+RTDECL(int) RTCrDigestUpdate(RTCRDIGEST hDigest, void const *pvData, size_t cbData)
+{
+ PRTCRDIGESTINT pThis = hDigest;
+ AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
+ AssertReturn(pThis->u32Magic == RTCRDIGESTINT_MAGIC, VERR_INVALID_HANDLE);
+ AssertReturn(pThis->uState == RTCRDIGEST_STATE_READY, VERR_INVALID_STATE);
+
+ pThis->pDesc->pfnUpdate(pThis->abState, pvData, cbData);
+ pThis->cbConsumed += cbData;
+ return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTCrDigestFinal(RTCRDIGEST hDigest, void *pvHash, size_t cbHash)
+{
+ PRTCRDIGESTINT pThis = hDigest;
+ AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
+ AssertReturn(pThis->u32Magic == RTCRDIGESTINT_MAGIC, VERR_INVALID_HANDLE);
+ AssertReturn(pThis->uState == RTCRDIGEST_STATE_READY || pThis->uState == RTCRDIGEST_STATE_FINAL, VERR_INVALID_STATE);
+ AssertPtrNullReturn(pvHash, VERR_INVALID_POINTER);
+
+ /*
+ * Make sure the hash calculation is final.
+ */
+ if (pThis->uState == RTCRDIGEST_STATE_READY)
+ {
+ pThis->pDesc->pfnFinal(pThis->abState, &pThis->abState[pThis->offHash]);
+ pThis->uState = RTCRDIGEST_STATE_FINAL;
+ }
+ else
+ AssertReturn(pThis->uState == RTCRDIGEST_STATE_FINAL, VERR_INVALID_STATE);
+
+ /*
+ * Copy out the hash if requested.
+ */
+ if (cbHash > 0)
+ {
+ uint32_t cbNeeded = pThis->pDesc->cbHash;
+ if (pThis->pDesc->pfnGetHashSize)
+ cbNeeded = pThis->pDesc->pfnGetHashSize(pThis->abState);
+ Assert(cbNeeded > 0);
+
+ if (cbNeeded == cbHash)
+ memcpy(pvHash, &pThis->abState[pThis->offHash], cbNeeded);
+ else if (cbNeeded > cbHash)
+ {
+ memcpy(pvHash, &pThis->abState[pThis->offHash], cbNeeded);
+ memset((uint8_t *)pvHash + cbNeeded, 0, cbHash - cbNeeded);
+ return VINF_BUFFER_UNDERFLOW;
+ }
+ else
+ {
+ memcpy(pvHash, &pThis->abState[pThis->offHash], cbHash);
+ return VERR_BUFFER_OVERFLOW;
+ }
+ }
+
+ return VINF_SUCCESS;
+}
+
+
+RTDECL(bool) RTCrDigestMatch(RTCRDIGEST hDigest, void const *pvHash, size_t cbHash)
+{
+ PRTCRDIGESTINT pThis = hDigest;
+
+ int rc = RTCrDigestFinal(pThis, NULL, 0);
+ AssertRCReturn(rc, false);
+
+ AssertPtrReturn(pvHash, false);
+ return pThis->pDesc->cbHash == cbHash
+ && !memcmp(&pThis->abState[pThis->offHash], pvHash, cbHash);
+}
+
+
+RTDECL(uint8_t const *) RTCrDigestGetHash(RTCRDIGEST hDigest)
+{
+ PRTCRDIGESTINT pThis = hDigest;
+ AssertPtrReturn(pThis, NULL);
+ AssertReturn(pThis->u32Magic == RTCRDIGESTINT_MAGIC, NULL);
+
+ int rc = RTCrDigestFinal(pThis, NULL, 0);
+ AssertRCReturn(rc, NULL);
+
+ return &pThis->abState[pThis->offHash];
+}
+
+
+RTDECL(uint32_t) RTCrDigestGetHashSize(RTCRDIGEST hDigest)
+{
+ PRTCRDIGESTINT pThis = hDigest;
+ AssertPtrReturn(pThis, 0);
+ AssertReturn(pThis->u32Magic == RTCRDIGESTINT_MAGIC, 0);
+ if (pThis->pDesc->pfnGetHashSize)
+ {
+ uint32_t cbHash = pThis->pDesc->pfnGetHashSize(pThis->abState);
+ Assert(cbHash <= pThis->pDesc->cbHash);
+ return cbHash;
+ }
+ return pThis->pDesc->cbHash;
+}
+
+
+RTDECL(uint64_t) RTCrDigestGetConsumedSize(RTCRDIGEST hDigest)
+{
+ PRTCRDIGESTINT pThis = hDigest;
+ AssertPtrReturn(pThis, 0);
+ AssertReturn(pThis->u32Magic == RTCRDIGESTINT_MAGIC, 0);
+ return pThis->cbConsumed;
+}
+
+
+RTDECL(bool) RTCrDigestIsFinalized(RTCRDIGEST hDigest)
+{
+ PRTCRDIGESTINT pThis = hDigest;
+ AssertPtrReturn(pThis, false);
+ AssertReturn(pThis->u32Magic == RTCRDIGESTINT_MAGIC, false);
+ return pThis->uState == RTCRDIGEST_STATE_FINAL;
+}
+
+
+RTDECL(RTDIGESTTYPE) RTCrDigestGetType(RTCRDIGEST hDigest)
+{
+ PRTCRDIGESTINT pThis = hDigest;
+ AssertPtrReturn(pThis, RTDIGESTTYPE_INVALID);
+ AssertReturn(pThis->u32Magic == RTCRDIGESTINT_MAGIC, RTDIGESTTYPE_INVALID);
+
+ RTDIGESTTYPE enmType = pThis->pDesc->enmType;
+ if (pThis->pDesc->pfnGetDigestType)
+ enmType = pThis->pDesc->pfnGetDigestType(pThis->abState);
+ return enmType;
+}
+
diff --git a/src/VBox/Runtime/common/crypto/iprt-openssl.cpp b/src/VBox/Runtime/common/crypto/iprt-openssl.cpp
new file mode 100644
index 00000000000..c8aee869dcd
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/iprt-openssl.cpp
@@ -0,0 +1,88 @@
+/* $Id$ */
+/** @file
+ * IPRT - Crypto - OpenSSL Helpers.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include "internal/iprt.h"
+
+#ifdef IPRT_WITH_OPENSSL /* Whole file. */
+# include <iprt/err.h>
+# include <iprt/string.h>
+
+# include "internal/iprt-openssl.h"
+# include <openssl/x509.h>
+# include <openssl/err.h>
+
+
+DECLHIDDEN(void) rtCrOpenSslInit(void)
+{
+ static bool s_fOssInitalized;
+ if (!s_fOssInitalized)
+ {
+ OpenSSL_add_all_algorithms();
+ ERR_load_ERR_strings();
+ ERR_load_crypto_strings();
+
+ s_fOssInitalized = true;
+ }
+}
+
+
+DECLHIDDEN(int) rtCrOpenSslErrInfoCallback(const char *pach, size_t cch, void *pvUser)
+{
+ PRTERRINFO pErrInfo = (PRTERRINFO)pvUser;
+ size_t cchAlready = pErrInfo->fFlags & RTERRINFO_FLAGS_SET ? strlen(pErrInfo->pszMsg) : 0;
+ if (cchAlready + 1 < pErrInfo->cbMsg)
+ RTStrCopyEx(pErrInfo->pszMsg + cchAlready, pErrInfo->cbMsg - cchAlready, pach, cch);
+ return -1;
+}
+
+
+DECLHIDDEN(int) rtCrOpenSslAddX509CertToStack(void *pvOsslStack, PCRTCRX509CERTIFICATE pCert)
+{
+ int rc;
+ const unsigned char *pabEncoded = (const unsigned char *)RTASN1CORE_GET_RAW_ASN1_PTR(&pCert->SeqCore.Asn1Core);
+ uint32_t cbEncoded = RTASN1CORE_GET_RAW_ASN1_SIZE(&pCert->SeqCore.Asn1Core);
+ X509 *pOsslCert = NULL;
+ if (d2i_X509(&pOsslCert, &pabEncoded, cbEncoded) == pOsslCert)
+ {
+ if (sk_X509_push((STACK_OF(X509) *)pvOsslStack, pOsslCert))
+ rc = VINF_SUCCESS;
+ else
+ {
+ rc = VERR_NO_MEMORY;
+ X509_free(pOsslCert);
+ }
+ }
+ else
+ rc = VERR_CR_X509_OSSL_D2I_FAILED;
+ return rc;
+}
+
+#endif /* IPRT_WITH_OPENSSL */
+
diff --git a/src/VBox/Runtime/common/crypto/pemfile.cpp b/src/VBox/Runtime/common/crypto/pemfile.cpp
new file mode 100644
index 00000000000..15eee208912
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/pemfile.cpp
@@ -0,0 +1,411 @@
+/* $Id$ */
+/** @file
+ * IPRT - Crypto - PEM file reader / writer.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/crypto/pem.h>
+
+#include <iprt/base64.h>
+#include <iprt/ctype.h>
+#include <iprt/err.h>
+#include <iprt/mem.h>
+#include <iprt/file.h>
+#include <iprt/string.h>
+
+
+
+/**
+ * Looks for a PEM-like marker.
+ *
+ * @returns true if found, fasle if not.
+ * @param pbContent Start of the content to search thru.
+ * @param cbContent The size of the content to search.
+ * @param offStart The offset into pbContent to start searching.
+ * @param pszLeadWord The lead word (BEGIN/END).
+ * @param cchLeadWord The length of the lead word.
+ * @param paMarkers Pointer to an array of markers.
+ * @param cMarkers Number of markers in the array.
+ * @param ppMatch Where to return the pointer to the matching
+ * marker. Optional.
+ * @param poffBegin Where to return the start offset of the marker.
+ * Optional.
+ * @param poffEnd Where to return the end offset of the marker
+ * (trailing whitespace and newlines will be
+ * skipped). Optional.
+ */
+static bool rtCrPemFindMarker(uint8_t const *pbContent, size_t cbContent, size_t offStart,
+ const char *pszLeadWord, size_t cchLeadWord, PCRTCRPEMMARKER paMarkers, size_t cMarkers,
+ PCRTCRPEMMARKER *ppMatch, size_t *poffBegin, size_t *poffEnd)
+{
+ /* Remember the start of the content for the purpose of calculating offsets. */
+ uint8_t const * const pbStart = pbContent;
+
+ /* Skip adhead by offStart */
+ if (offStart >= cbContent)
+ return false;
+ pbContent += offStart;
+ cbContent -= offStart;
+
+ /*
+ * Search the content.
+ */
+ while (cbContent > 6)
+ {
+ /*
+ * Look for dashes.
+ */
+ uint8_t const *pbStartSearch = pbContent;
+ pbContent = (uint8_t const *)memchr(pbContent, '-', cbContent);
+ if (!pbContent)
+ break;
+
+ cbContent -= pbContent - pbStartSearch;
+ if (cbContent < 6)
+ break;
+
+ /*
+ * There must be at least three to interest us.
+ */
+ if ( pbContent[1] == '-'
+ && pbContent[2] == '-')
+ {
+ unsigned cDashes = 3;
+ while (cDashes < cbContent && pbContent[cDashes] == '-')
+ cDashes++;
+
+ if (poffBegin)
+ *poffBegin = pbContent - pbStart;
+ cbContent -= cDashes;
+ pbContent += cDashes;
+
+ /*
+ * Match lead word.
+ */
+ if ( cbContent > cchLeadWord
+ && memcmp(pbContent, pszLeadWord, cchLeadWord) == 0
+ && RT_C_IS_BLANK(pbContent[cchLeadWord]) )
+ {
+ pbContent += cchLeadWord;
+ cbContent -= cchLeadWord;
+ while (cbContent > 0 && RT_C_IS_BLANK(*pbContent))
+ {
+ pbContent++;
+ cbContent--;
+ }
+
+ /*
+ * Match one of the specified markers.
+ */
+ uint8_t const *pbSavedContent = pbContent;
+ size_t const cbSavedContent = cbContent;
+ uint32_t iMarker = 0;
+ while (iMarker < cMarkers)
+ {
+ pbContent = pbSavedContent;
+ cbContent = cbSavedContent;
+
+ uint32_t cWords = paMarkers[iMarker].cWords;
+ PCRTCRPEMMARKERWORD pWord = paMarkers[iMarker].paWords;
+ while (cWords > 0)
+ {
+ uint32_t const cchWord = pWord->cchWord;
+ if (cbContent <= cchWord)
+ break;
+ if (memcmp(pbContent, pWord->pszWord, cchWord))
+ break;
+ pbContent += cchWord;
+ cbContent -= cchWord;
+
+ if (!cbContent || !RT_C_IS_BLANK(*pbContent))
+ break;
+ do
+ {
+ pbContent++;
+ cbContent--;
+ } while (cbContent > 0 && RT_C_IS_BLANK(*pbContent));
+
+ cWords--;
+ if (cWords == 0)
+ {
+ /*
+ * If there are three or more dashes following now, we've got a hit.
+ */
+ if ( cbContent > 3
+ && pbContent[0] == '-'
+ && pbContent[1] == '-'
+ && pbContent[2] == '-')
+ {
+ cDashes = 3;
+ while (cDashes < cbContent && pbContent[cDashes] == '-')
+ cDashes++;
+ cbContent -= cDashes;
+ pbContent += cDashes;
+
+ /*
+ * Skip spaces and newline.
+ */
+ while (cbContent > 0 && RT_C_IS_SPACE(*pbContent))
+ pbContent++, cbContent--;
+ if (poffEnd)
+ *poffEnd = pbContent - pbStart;
+ if (*ppMatch)
+ *ppMatch = &paMarkers[iMarker];
+ return true;
+ }
+ break;
+ }
+ } /* for each word in marker. */
+ } /* for each marker. */
+ }
+ }
+ else
+ {
+ pbContent++;
+ cbContent--;
+ }
+ }
+
+ return false;
+}
+
+
+static bool rtCrPemFindMarkerSection(uint8_t const *pbContent, size_t cbContent, size_t offStart,
+ PCRTCRPEMMARKER paMarkers, size_t cMarkers,
+ PCRTCRPEMMARKER *ppMatch, size_t *poffBegin, size_t *poffEnd, size_t *poffResume)
+{
+ /** @todo Detect BEGIN / END mismatch. */
+ PCRTCRPEMMARKER pMatch;
+ if (rtCrPemFindMarker(pbContent, cbContent, offStart, "BEGIN", 5, paMarkers, cMarkers,
+ &pMatch, NULL /*poffStart*/, poffBegin))
+ return rtCrPemFindMarker(pbContent, cbContent, *poffBegin, "END", 3, pMatch, 1,
+ NULL /*ppMatch*/, poffEnd, poffResume);
+ return false;
+}
+
+
+
+/**
+ * Does the decoding of a PEM-like data blob after it has been located.
+ *
+ * @returns IPRT status ocde
+ * @param pbContent The start of the PEM-like content (text).
+ * @param cbContent The max size of the PEM-like content.
+ * @param ppvDecoded Where to return a heap block containing the
+ * decoded content.
+ * @param pcbDecoded Where to return the size of the decoded content.
+ */
+static int rtCrPemDecodeBase64(uint8_t const *pbContent, size_t cbContent, void **ppvDecoded, size_t *pcbDecoded)
+{
+ ssize_t cbDecoded = RTBase64DecodedSizeEx((const char *)pbContent, cbContent, NULL);
+ if (cbDecoded < 0)
+ return VERR_INVALID_BASE64_ENCODING;
+
+ *pcbDecoded = cbDecoded;
+ void *pvDecoded = RTMemAlloc(cbDecoded);
+ if (!pvDecoded)
+ return VERR_NO_MEMORY;
+
+ size_t cbActual;
+ int rc = RTBase64DecodeEx((const char *)pbContent, cbContent, pvDecoded, cbDecoded, &cbActual, NULL);
+ if (RT_SUCCESS(rc))
+ {
+ if (cbActual == (size_t)cbDecoded)
+ {
+ *ppvDecoded = pvDecoded;
+ return VINF_SUCCESS;
+ }
+ rc = VERR_INTERNAL_ERROR_3;
+ }
+ RTMemFree(pvDecoded);
+ return rc;
+}
+
+
+/**
+ * Checks if the content of a file looks to be binary or not.
+ *
+ * @returns true if likely to be binary, false if not binary.
+ * @param pbFile The file bytes to scan.
+ * @param cbFile The number of bytes.
+ */
+static bool rtCrPemIsBinaryFile(uint8_t *pbFile, size_t cbFile)
+{
+ /*
+ * Assume a well formed PEM file contains only 7-bit ASCII and restricts
+ * itself to the following control characters:
+ * tab, newline, return, form feed
+ */
+ while (cbFile-- > 0)
+ {
+ uint8_t const b = *pbFile++;
+ if ( b >= 0x7f
+ || (b < 32 && b != '\t' && b != '\n' && b != '\r' && b != '\f') )
+ {
+ /* Ignore EOT (4), SUB (26) and NUL (0) at the end of the file. */
+ if ( (b == 4 || b == 26)
+ && ( cbFile == 0
+ || ( cbFile == 1
+ && *pbFile == '\0')))
+ return true;
+ if (b == 0 && cbFile == 0)
+ return true;
+ return false;
+ }
+ }
+ return true;
+}
+
+
+RTDECL(int) RTCrPemFreeSections(PCRTCRPEMSECTION pSectionHead)
+{
+ while (pSectionHead != NULL)
+ {
+ PRTCRPEMSECTION pFree = (PRTCRPEMSECTION)pSectionHead;
+ pSectionHead = pSectionHead->pNext;
+
+ if (pFree->pMarker)
+ {
+ if (pFree->pbData)
+ {
+ RTMemFree(pFree->pbData);
+ pFree->pbData = NULL;
+ pFree->cbData = 0;
+ }
+
+ if (pFree->pszPreamble)
+ {
+ RTMemFree(pFree->pszPreamble);
+ pFree->pszPreamble = NULL;
+ pFree->cchPreamble = 0;
+ }
+ }
+ else
+ {
+ RTFileReadAllFree(pFree->pbData, pFree->cbData);
+ Assert(!pFree->pszPreamble);
+ }
+ pFree->pbData = NULL;
+ pFree->cbData = 0;
+ }
+ return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTCrPemReadFile(const char *pszFilename, uint32_t fFlags, PCRTCRPEMMARKER paMarkers, size_t cMarkers,
+ PCRTCRPEMSECTION *ppSectionHead, PRTERRINFO pErrInfo)
+{
+ AssertReturn(!fFlags, VERR_INVALID_FLAGS);
+
+ size_t cbContent;
+ uint8_t *pbContent;
+ int rc = RTFileReadAllEx(pszFilename, 0, 64U*_1M, RTFILE_RDALL_O_DENY_WRITE, (void **)&pbContent, &cbContent);
+ if (RT_SUCCESS(rc))
+ {
+ PRTCRPEMSECTION pSection = (PRTCRPEMSECTION)RTMemAllocZ(sizeof(*pSection));
+ if (pSection)
+ {
+ /*
+ * Try locate the first section.
+ */
+ size_t offBegin, offEnd, offResume;
+ PCRTCRPEMMARKER pMatch;
+ if ( !rtCrPemIsBinaryFile(pbContent, cbContent)
+ && rtCrPemFindMarkerSection(pbContent, cbContent, 0 /*offStart*/, paMarkers, cMarkers,
+ &pMatch, &offBegin, &offEnd, &offResume) )
+ {
+ PCRTCRPEMSECTION *ppNext = ppSectionHead;
+ for (;;)
+ {
+ //pSection->pNext = NULL;
+ pSection->pMarker = pMatch;
+ //pSection->pbData = NULL;
+ //pSection->cbData = 0;
+ //pSection->pszPreamble = NULL;
+ //pSection->cchPreamble = 0;
+
+ *ppNext = pSection;
+ ppNext = &pSection->pNext;
+
+ /* Decode the section. */
+ /** @todo copy the preamble as well. */
+ rc = rtCrPemDecodeBase64(pbContent + offBegin, offEnd - offBegin,
+ (void **)&pSection->pbData, &pSection->cbData);
+ if (RT_FAILURE(rc))
+ {
+ pSection->pbData = NULL;
+ pSection->cbData = 0;
+ break;
+ }
+
+ /* More sections? */
+ if ( offResume + 12 >= cbContent
+ || offResume >= cbContent
+ || !rtCrPemFindMarkerSection(pbContent, cbContent, offResume, paMarkers, cMarkers,
+ &pMatch, &offBegin, &offEnd, &offResume) )
+ break; /* No. */
+
+ /* Ok, allocate a new record for it. */
+ pSection = (PRTCRPEMSECTION)RTMemAllocZ(sizeof(*pSection));
+ if (RT_UNLIKELY(!pSection))
+ {
+ rc = VERR_NO_MEMORY;
+ break;
+ }
+ }
+ if (RT_SUCCESS(rc))
+ {
+ RTFileReadAllFree(pbContent, cbContent);
+ return rc;
+ }
+
+ RTCrPemFreeSections(*ppSectionHead);
+ }
+ else
+ {
+ /*
+ * No PEM section found. Return the whole file as one binary section.
+ */
+ //pSection->pNext = NULL;
+ //pSection->pMarker = NULL;
+ pSection->pbData = pbContent;
+ pSection->cbData = cbContent;
+ //pSection->pszPreamble = NULL;
+ //pSection->cchPreamble = 0;
+ *ppSectionHead = pSection;
+ return VINF_SUCCESS;
+ }
+ }
+ else
+ rc = VERR_NO_MEMORY;
+ RTFileReadAllFree(pbContent, cbContent);
+ }
+ *ppSectionHead = NULL;
+ return rc;
+}
+
diff --git a/src/VBox/Runtime/common/crypto/pkcs7-asn1-decoder.cpp b/src/VBox/Runtime/common/crypto/pkcs7-asn1-decoder.cpp
new file mode 100644
index 00000000000..e830ea40e64
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/pkcs7-asn1-decoder.cpp
@@ -0,0 +1,89 @@
+/* $Id$ */
+/** @file
+ * IPRT - Crypto - PKCS \#7, Decoder for ASN.1.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/crypto/pkcs7.h>
+
+#include <iprt/err.h>
+#include <iprt/string.h>
+#include <iprt/crypto/spc.h>
+
+#include "pkcs7-internal.h"
+
+
+/*
+ * PKCS #7 ContentInfo
+ */
+
+static int rtCrPkcs7ContentInfo_DecodeExtra(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTCRPKCS7CONTENTINFO pThis,
+ const char *pszErrorTag)
+{
+ pThis->u.pCore = NULL;
+
+ int rc;
+ RTASN1CURSOR ContentCursor;
+ if (RTAsn1ObjId_CompareWithString(&pThis->ContentType, RTCRPKCS7SIGNEDDATA_OID) == 0)
+ {
+ rc = RTAsn1MemAllocZ(&pThis->Content.EncapsulatedAllocation, (void **)&pThis->Content.pEncapsulated,
+ sizeof(*pThis->u.pSignedData));
+ if (RT_SUCCESS(rc))
+ {
+ pThis->u.pCore = pThis->Content.pEncapsulated;
+ RTAsn1CursorInitSubFromCore(pCursor, &pThis->Content.Asn1Core, &ContentCursor, "Content");
+ rc = RTCrPkcs7SignedData_DecodeAsn1(&ContentCursor, 0, pThis->u.pSignedData, "SignedData");
+ }
+ }
+ else if (RTAsn1ObjId_CompareWithString(&pThis->ContentType, RTCRSPCINDIRECTDATACONTENT_OID) == 0)
+ {
+ rc = RTAsn1MemAllocZ(&pThis->Content.EncapsulatedAllocation, (void **)&pThis->Content.pEncapsulated,
+ sizeof(*pThis->u.pIndirectDataContent));
+ if (RT_SUCCESS(rc))
+ {
+ pThis->u.pCore = pThis->Content.pEncapsulated;
+ RTAsn1CursorInitSubFromCore(pCursor, &pThis->Content.Asn1Core, &ContentCursor, "Content");
+ rc = RTCrSpcIndirectDataContent_DecodeAsn1(&ContentCursor, 0, pThis->u.pIndirectDataContent, "IndirectDataContent");
+ }
+ }
+ else
+ return VINF_SUCCESS;
+
+ if (RT_SUCCESS(rc))
+ rc = RTAsn1CursorCheckEnd(&ContentCursor);
+ if (RT_SUCCESS(rc))
+ return VINF_SUCCESS;
+ return rc;
+}
+
+
+/*
+ * Generate the code.
+ */
+#include <iprt/asn1-generator-asn1-decoder.h>
+
diff --git a/src/VBox/Runtime/common/crypto/pkcs7-core.cpp b/src/VBox/Runtime/common/crypto/pkcs7-core.cpp
new file mode 100644
index 00000000000..a693c46ff7f
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/pkcs7-core.cpp
@@ -0,0 +1,54 @@
+/* $Id$ */
+/** @file
+ * IPRT - Crypto - PKCS \#7, Core APIs.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/crypto/pkcs7.h>
+
+#include <iprt/err.h>
+#include <iprt/string.h>
+
+#include "pkcs7-internal.h"
+
+
+/*
+ * PCKS #7 ContentInfo.
+ */
+
+RTDECL(bool) RTCrPkcs7ContentInfo_IsSignedData(PCRTCRPKCS7CONTENTINFO pThis)
+{
+ return RTAsn1ObjId_CompareWithString(&pThis->ContentType, RTCRPKCS7SIGNEDDATA_OID) == 0;
+}
+
+
+/*
+ * Generate the standard core code.
+ */
+#include <iprt/asn1-generator-core.h>
+
diff --git a/src/VBox/Runtime/common/crypto/pkcs7-init.cpp b/src/VBox/Runtime/common/crypto/pkcs7-init.cpp
new file mode 100644
index 00000000000..18d49c02473
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/pkcs7-init.cpp
@@ -0,0 +1,53 @@
+/* $Id$ */
+/** @file
+ * IPRT - Crypto - PKCS \#7, Initialization API.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/crypto/pkcs7.h>
+
+#include <iprt/err.h>
+#include <iprt/string.h>
+#include <iprt/uni.h>
+
+#include "pkcs7-internal.h"
+
+
+static int rtCrPkcs7ContentInfo_CloneExtra(PRTCRPKCS7CONTENTINFO pThis)
+{
+ pThis->u.pCore = pThis->Content.pEncapsulated;
+ return VINF_SUCCESS;
+}
+
+
+/*
+ * Generate the code.
+ */
+#include <iprt/asn1-generator-init.h>
+
+
diff --git a/src/VBox/Runtime/common/crypto/pkcs7-internal.h b/src/VBox/Runtime/common/crypto/pkcs7-internal.h
new file mode 100644
index 00000000000..1b7f1da2a84
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/pkcs7-internal.h
@@ -0,0 +1,35 @@
+/* $Id$ */
+/** @file
+ * IPRT - Crypto - PKCS \#7, Internal Header.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+#ifndef ___common_crypto_pkcs7_internal_h
+#define ___common_crypto_pkcs7_internal_h
+
+#define RTASN1TMPL_TEMPLATE_FILE "../common/crypto/pkcs7-template.h"
+#include <iprt/asn1-generator-internal-header.h>
+
+#endif
+
diff --git a/src/VBox/Runtime/common/crypto/pkcs7-sanity.cpp b/src/VBox/Runtime/common/crypto/pkcs7-sanity.cpp
new file mode 100644
index 00000000000..1107cd8e901
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/pkcs7-sanity.cpp
@@ -0,0 +1,209 @@
+/* $Id$ */
+/** @file
+ * IPRT - Crypto - PKCS \#7, Sanity Checkers.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/crypto/pkcs7.h>
+
+#include <iprt/err.h>
+#include <iprt/string.h>
+
+//#include <iprt/stream.h>
+
+#include "pkcs7-internal.h"
+
+
+static int rtCrPkcs7SignedData_CheckSanityExtra(PCRTCRPKCS7SIGNEDDATA pSignedData, uint32_t fFlags,
+ PRTERRINFO pErrInfo, const char *pszErrorTag)
+{
+ bool const fAuthenticode = RT_BOOL(fFlags & RTCRPKCS7SIGNEDDATA_SANITY_F_AUTHENTICODE);
+
+ //RTAsn1Dump(&pSignedData->SeqCore.Asn1Core, 0, 0, RTAsn1DumpStrmPrintfV, g_pStdOut);
+
+ if (RTAsn1Integer_UnsignedCompareWithU32(&pSignedData->Version, RTCRPKCS7SIGNEDDATA_V1) != 0)
+ return RTErrInfoSetF(pErrInfo, VERR_CR_PKCS7_SIGNED_DATA_VERSION, "SignedData version is %llu, expected %u",
+ pSignedData->Version.uValue.u, RTCRPKCS7SIGNEDDATA_V1);
+
+ /*
+ * DigestAlgorithms.
+ */
+ if (pSignedData->DigestAlgorithms.cItems == 0) /** @todo this might be too strict */
+ return RTErrInfoSet(pErrInfo, VERR_CR_PKCS7_SIGNED_DATA_NO_DIGEST_ALGOS, "SignedData.DigestAlgorithms is empty");
+ if (pSignedData->DigestAlgorithms.cItems != 1 && fAuthenticode)
+ return RTErrInfoSetF(pErrInfo, VERR_CR_SPC_NOT_EXACTLY_ONE_DIGEST_ALGO,
+ "SignedData.DigestAlgorithms has more than one algorithm (%u)",
+ pSignedData->DigestAlgorithms.cItems);
+
+ if (fFlags & RTCRPKCS7SIGNEDDATA_SANITY_F_ONLY_KNOWN_HASH)
+ for (uint32_t i = 0; i < pSignedData->DigestAlgorithms.cItems; i++)
+ {
+ if (RTCrX509AlgorithmIdentifier_QueryDigestType(&pSignedData->DigestAlgorithms.paItems[i]) == RTDIGESTTYPE_INVALID)
+ return RTErrInfoSetF(pErrInfo, VERR_CR_PKCS7_UNKNOWN_DIGEST_ALGORITHM,
+ "SignedData.DigestAlgorithms[%i] is not known: %s",
+ i, pSignedData->DigestAlgorithms.paItems[i].Algorithm.szObjId);
+ if (pSignedData->DigestAlgorithms.paItems[i].Parameters.enmType != RTASN1TYPE_NULL)
+ return RTErrInfoSetF(pErrInfo, VERR_CR_PKCS7_DIGEST_PARAMS_NOT_IMPL,
+ "SignedData.DigestAlgorithms[%i] has parameters: tag=%u",
+ i, pSignedData->DigestAlgorithms.paItems[i].Parameters.u.Core.uTag);
+ }
+
+ /*
+ * Certificates.
+ */
+ if ( (fFlags & RTCRPKCS7SIGNEDDATA_SANITY_F_SIGNING_CERT_PRESENT)
+ && pSignedData->Certificates.cItems == 0)
+ return RTErrInfoSet(pErrInfo, VERR_CR_PKCS7_NO_CERTIFICATES,
+ "SignedData.Certifcates is empty, expected at least one certificate");
+
+ if (pSignedData->Certificates.cItems > 0)
+ {
+ int rc = RTCrX509Certificates_CheckSanity(&pSignedData->Certificates, 0, pErrInfo, "SignedData.T0.Certificates");
+ if (RT_FAILURE(rc))
+ return rc;
+ }
+
+ /*
+ * Crls.
+ */
+ if (fAuthenticode && RTAsn1Core_IsPresent(&pSignedData->Crls))
+ return RTErrInfoSet(pErrInfo, VERR_CR_PKCS7_EXPECTED_NO_CRLS,
+ "SignedData.Crls is not empty as expected for authenticode.");
+ /** @todo check Crls when they become important. */
+
+ /*
+ * SignerInfos.
+ */
+ if (pSignedData->SignerInfos.cItems == 0)
+ return RTErrInfoSet(pErrInfo, VERR_CR_PKCS7_NO_SIGNER_INFOS, "SignedData.SignerInfos is empty?");
+ if (fAuthenticode && pSignedData->SignerInfos.cItems != 1)
+ return RTErrInfoSetF(pErrInfo, VERR_CR_PKCS7_EXPECTED_ONE_SIGNER_INFO,
+ "SignedData.SignerInfos should have one entry for authenticode: %u",
+ pSignedData->SignerInfos.cItems);
+
+ for (uint32_t i = 0; i < pSignedData->SignerInfos.cItems; i++)
+ {
+ PCRTCRPKCS7SIGNERINFO pSignerInfo = &pSignedData->SignerInfos.paItems[i];
+
+ if (RTAsn1Integer_UnsignedCompareWithU32(&pSignerInfo->Version, RTCRPKCS7SIGNERINFO_V1) != 0)
+ return RTErrInfoSetF(pErrInfo, VERR_CR_PKCS7_SIGNER_INFO_VERSION,
+ "SignedData.SignerInfos[%u] version is %llu, expected %u",
+ pSignerInfo->Version.uValue.u, RTCRPKCS7SIGNERINFO_V1);
+
+ /* IssuerAndSerialNumber. */
+ int rc = RTCrX509Name_CheckSanity(&pSignerInfo->IssuerAndSerialNumber.Name, 0, pErrInfo,
+ "SignedData.SignerInfos[#].IssuerAndSerialNumber.Name");
+ if (RT_FAILURE(rc))
+ return rc;
+
+ if (pSignerInfo->IssuerAndSerialNumber.SerialNumber.Asn1Core.cb == 0)
+ return RTErrInfoSetF(pErrInfo, VERR_CR_PKCS7_SIGNER_INFO_NO_ISSUER_SERIAL_NO,
+ "SignedData.SignerInfos[%u].IssuerAndSerialNumber.SerialNumber is missing (zero length)", i);
+
+ PCRTCRX509CERTIFICATE pCert;
+ pCert = RTCrX509Certificates_FindByIssuerAndSerialNumber(&pSignedData->Certificates,
+ &pSignerInfo->IssuerAndSerialNumber.Name,
+ &pSignerInfo->IssuerAndSerialNumber.SerialNumber);
+ if (!pCert && (fFlags & RTCRPKCS7SIGNEDDATA_SANITY_F_SIGNING_CERT_PRESENT))
+ return RTErrInfoSetF(pErrInfo, VERR_CR_PKCS7_SIGNER_CERT_NOT_SHIPPED,
+ "SignedData.SignerInfos[%u].IssuerAndSerialNumber not found in T0.Certificates", i);
+
+ /* DigestAlgorithm */
+ uint32_t j = 0;
+ while ( j < pSignedData->DigestAlgorithms.cItems
+ && RTCrX509AlgorithmIdentifier_Compare(&pSignedData->DigestAlgorithms.paItems[j],
+ &pSignerInfo->DigestAlgorithm) != 0)
+ j++;
+ if (j >= pSignedData->DigestAlgorithms.cItems)
+ return RTErrInfoSetF(pErrInfo, VERR_CR_PKCS7_DIGEST_ALGO_NOT_FOUND_IN_LIST,
+ "SignedData.SignerInfos[%u].DigestAlgorithm (%s) not found in SignedData.DigestAlgorithms",
+ i, pSignerInfo->DigestAlgorithm.Algorithm.szObjId);
+
+ /* Digest encryption algorithm. */
+ if ( pCert
+ && RTCrX509AlgorithmIdentifier_Compare(&pSignerInfo->DigestEncryptionAlgorithm,
+ &pCert->TbsCertificate.SubjectPublicKeyInfo.Algorithm) != 0)
+ return RTErrInfoSetF(pErrInfo, VERR_CR_PKCS7_SIGNER_INFO_DIGEST_ENCRYPT_MISMATCH,
+ "SignedData.SignerInfos[%u].DigestEncryptionAlgorithm (%s) mismatch with certificate (%s)",
+ i, pSignerInfo->DigestEncryptionAlgorithm.Algorithm.szObjId,
+ pCert->TbsCertificate.SubjectPublicKeyInfo.Algorithm.Algorithm.szObjId);
+
+ /* Authenticated attributes we know. */
+ if (RTCrPkcs7Attributes_IsPresent(&pSignerInfo->AuthenticatedAttributes))
+ {
+ bool fFoundContentInfo = false;
+ bool fFoundMessageDigest = false;
+ for (j = 0; j < pSignerInfo->AuthenticatedAttributes.cItems; j++)
+ {
+ PCRTCRPKCS7ATTRIBUTE pAttrib = &pSignerInfo->AuthenticatedAttributes.paItems[j];
+ if (RTAsn1ObjId_CompareWithString(&pAttrib->Type, RTCR_PKCS9_ID_CONTENT_TYPE_OID) == 0)
+ {
+ if (fFoundContentInfo)
+ return RTErrInfoSet(pErrInfo, VERR_CR_PKCS7_MISSING_CONTENT_TYPE_ATTRIB,
+ "Multiple authenticated content-type attributes.");
+ fFoundContentInfo = true;
+ AssertReturn(pAttrib->enmType == RTCRPKCS7ATTRIBUTETYPE_OBJ_IDS, VERR_INTERNAL_ERROR_3);
+ if (pAttrib->uValues.pObjIds->cItems != 1)
+ return RTErrInfoSetF(pErrInfo, VERR_CR_PKCS7_BAD_CONTENT_TYPE_ATTRIB,
+ "Expected exactly one value for content-type attrib, found: %u",
+ pAttrib->uValues.pObjIds->cItems);
+ }
+ else if (RTAsn1ObjId_CompareWithString(&pAttrib->Type, RTCR_PKCS9_ID_MESSAGE_DIGEST_OID) == 0)
+ {
+ if (fFoundMessageDigest)
+ return RTErrInfoSet(pErrInfo, VERR_CR_PKCS7_MISSING_MESSAGE_DIGEST_ATTRIB,
+ "Multiple authenticated message-digest attributes.");
+ fFoundMessageDigest = true;
+ AssertReturn(pAttrib->enmType == RTCRPKCS7ATTRIBUTETYPE_OCTET_STRINGS, VERR_INTERNAL_ERROR_3);
+ if (pAttrib->uValues.pOctetStrings->cItems != 1)
+ return RTErrInfoSetF(pErrInfo, VERR_CR_PKCS7_BAD_CONTENT_TYPE_ATTRIB,
+ "Expected exactly one value for message-digest attrib, found: %u",
+ pAttrib->uValues.pOctetStrings->cItems);
+ }
+ else
+ AssertReturn(pAttrib->enmType == RTCRPKCS7ATTRIBUTETYPE_UNKNOWN, VERR_INTERNAL_ERROR_3);
+ }
+
+ if (!fFoundContentInfo)
+ return RTErrInfoSet(pErrInfo, VERR_CR_PKCS7_MISSING_CONTENT_TYPE_ATTRIB,
+ "Missing authenticated content-type attribute.");
+ if (!fFoundMessageDigest)
+ return RTErrInfoSet(pErrInfo, VERR_CR_PKCS7_MISSING_MESSAGE_DIGEST_ATTRIB,
+ "Missing authenticated message-digest attribute.");
+ }
+ }
+
+ return VINF_SUCCESS;
+}
+
+
+/*
+ * Generate the code.
+ */
+#include <iprt/asn1-generator-sanity.h>
+
diff --git a/src/VBox/Runtime/common/crypto/pkcs7-template.h b/src/VBox/Runtime/common/crypto/pkcs7-template.h
new file mode 100644
index 00000000000..dd2aef97d58
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/pkcs7-template.h
@@ -0,0 +1,160 @@
+/* $Id$ */
+/** @file
+ * IPRT - Crypto - PKCS \#7, Core APIs, Code Generator Template.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+#define RTASN1TMPL_DECL RTDECL
+
+/*
+ * One PCKS #7 IssuerAndSerialNumber.
+ */
+#define RTASN1TMPL_TYPE RTCRPKCS7ISSUERANDSERIALNUMBER
+#define RTASN1TMPL_EXT_NAME RTCrPkcs7IssuerAndSerialNumber
+#define RTASN1TMPL_INT_NAME rtCrPkcs7IssuerAndSerialNumber
+RTASN1TMPL_BEGIN_SEQCORE();
+RTASN1TMPL_MEMBER( Name, RTCRX509NAME, RTCrX509Name);
+RTASN1TMPL_MEMBER( SerialNumber, RTASN1INTEGER, RTAsn1Integer);
+RTASN1TMPL_END_SEQCORE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * One PCKS #7 Attribute.
+ */
+#define RTASN1TMPL_TYPE RTCRPKCS7ATTRIBUTE
+#define RTASN1TMPL_EXT_NAME RTCrPkcs7Attribute
+#define RTASN1TMPL_INT_NAME rtCrPkcs7Attribute
+RTASN1TMPL_BEGIN_SEQCORE();
+RTASN1TMPL_MEMBER( Type, RTASN1OBJID, RTAsn1ObjId);
+RTASN1TMPL_MEMBER_DYN_BEGIN(RTCRPKCS7ATTRIBUTETYPE, enmType, Allocation);
+RTASN1TMPL_MEMBER_DYN( uValues, pOctetStrings, RTASN1SETOFOCTETSTRINGS, RTAsn1SetOfOctetStrings, Allocation,
+ enmType, RTCRPKCS7ATTRIBUTETYPE_OCTET_STRINGS, RTAsn1ObjId_CompareWithString(&pThis->Type, RTCR_PKCS9_ID_MESSAGE_DIGEST_OID) == 0);
+RTASN1TMPL_MEMBER_DYN( uValues, pObjIds, RTASN1SETOFOBJIDS, RTAsn1SetOfObjIds, Allocation,
+ enmType, RTCRPKCS7ATTRIBUTETYPE_OBJ_IDS, RTAsn1ObjId_CompareWithString(&pThis->Type, RTCR_PKCS9_ID_CONTENT_TYPE_OID) == 0);
+RTASN1TMPL_MEMBER_DYN_DEFAULT( uValues, pCores, RTASN1SETOFCORES, RTAsn1SetOfCores, Allocation,
+ enmType, RTCRPKCS7ATTRIBUTETYPE_UNKNOWN);
+RTASN1TMPL_MEMBER_DYN_END(RTCRPKCS7ATTRIBUTETYPE, enmType, Allocation);
+RTASN1TMPL_END_SEQCORE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * Set of PCKS #7 Attributes.
+ */
+#define RTASN1TMPL_TYPE RTCRPKCS7ATTRIBUTES
+#define RTASN1TMPL_EXT_NAME RTCrPkcs7Attributes
+#define RTASN1TMPL_INT_NAME rtCrPkcs7Attributes
+RTASN1TMPL_SET_OF(RTCRPKCS7ATTRIBUTE, RTCrPkcs7Attribute);
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * One PCKS #7 SignerInfo.
+ */
+#define RTASN1TMPL_TYPE RTCRPKCS7SIGNERINFO
+#define RTASN1TMPL_EXT_NAME RTCrPkcs7SignerInfo
+#define RTASN1TMPL_INT_NAME rtCrPkcs7SignerInfo
+RTASN1TMPL_BEGIN_SEQCORE();
+RTASN1TMPL_MEMBER( Version, RTASN1INTEGER, RTAsn1Integer);
+RTASN1TMPL_MEMBER( IssuerAndSerialNumber, RTCRPKCS7ISSUERANDSERIALNUMBER, RTCrPkcs7IssuerAndSerialNumber);
+RTASN1TMPL_MEMBER( DigestAlgorithm, RTCRX509ALGORITHMIDENTIFIER, RTCrX509AlgorithmIdentifier);
+RTASN1TMPL_MEMBER_OPT_ITAG( AuthenticatedAttributes, RTCRPKCS7ATTRIBUTES, RTCrPkcs7Attributes, 0);
+RTASN1TMPL_MEMBER( DigestEncryptionAlgorithm, RTCRX509ALGORITHMIDENTIFIER, RTCrX509AlgorithmIdentifier);
+RTASN1TMPL_MEMBER( EncryptedDigest, RTASN1OCTETSTRING, RTAsn1OctetString);
+RTASN1TMPL_MEMBER_OPT_ITAG( UnauthenticatedAttributes, RTCRPKCS7ATTRIBUTES, RTCrPkcs7Attributes, 1);
+RTASN1TMPL_END_SEQCORE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * Set of PCKS #7 SignerInfos.
+ */
+#define RTASN1TMPL_TYPE RTCRPKCS7SIGNERINFOS
+#define RTASN1TMPL_EXT_NAME RTCrPkcs7SignerInfos
+#define RTASN1TMPL_INT_NAME rtCrPkcs7SignerInfos
+RTASN1TMPL_SET_OF(RTCRPKCS7SIGNERINFO, RTCrPkcs7SignerInfo);
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * PCKS #7 SignedData.
+ */
+#define RTASN1TMPL_TYPE RTCRPKCS7SIGNEDDATA
+#define RTASN1TMPL_EXT_NAME RTCrPkcs7SignedData
+#define RTASN1TMPL_INT_NAME rtCrPkcs7SignedData
+RTASN1TMPL_BEGIN_SEQCORE();
+RTASN1TMPL_MEMBER( Version, RTASN1INTEGER, RTAsn1Integer);
+RTASN1TMPL_MEMBER( DigestAlgorithms, RTCRX509ALGORITHMIDENTIFIERS, RTCrX509AlgorithmIdentifiers);
+RTASN1TMPL_MEMBER( ContentInfo, RTCRPKCS7CONTENTINFO, RTCrPkcs7ContentInfo);
+RTASN1TMPL_MEMBER_OPT_ITAG( Certificates, RTCRX509CERTIFICATES, RTCrX509Certificates, 0);
+RTASN1TMPL_MEMBER_OPT_ITAG( Crls, RTASN1CORE, RTAsn1Core, 1);
+RTASN1TMPL_MEMBER( SignerInfos, RTCRPKCS7SIGNERINFOS, RTCrPkcs7SignerInfos);
+RTASN1TMPL_EXEC_CHECK_SANITY( rc = rtCrPkcs7SignedData_CheckSanityExtra(pThis, fFlags, pErrInfo, pszErrorTag) ) /* no ; */
+RTASN1TMPL_END_SEQCORE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * PCKS #7 DigestInfo.
+ */
+#define RTASN1TMPL_TYPE RTCRPKCS7DIGESTINFO
+#define RTASN1TMPL_EXT_NAME RTCrPkcs7DigestInfo
+#define RTASN1TMPL_INT_NAME rtCrPkcs7DigestInfo
+RTASN1TMPL_BEGIN_SEQCORE();
+RTASN1TMPL_MEMBER( DigestAlgorithm, RTCRX509ALGORITHMIDENTIFIER, RTCrX509AlgorithmIdentifier);
+RTASN1TMPL_MEMBER( Digest, RTASN1OCTETSTRING, RTAsn1OctetString);
+RTASN1TMPL_END_SEQCORE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * PCKS #7 ContentInfo.
+ */
+#define RTASN1TMPL_TYPE RTCRPKCS7CONTENTINFO
+#define RTASN1TMPL_EXT_NAME RTCrPkcs7ContentInfo
+#define RTASN1TMPL_INT_NAME rtCrPkcs7ContentInfo
+RTASN1TMPL_BEGIN_SEQCORE();
+RTASN1TMPL_MEMBER( ContentType, RTASN1OBJID, RTAsn1ObjId);
+RTASN1TMPL_MEMBER_OPT_ITAG( Content, RTASN1OCTETSTRING, RTAsn1OctetString, 0);
+RTASN1TMPL_EXEC_DECODE( rc = rtCrPkcs7ContentInfo_DecodeExtra(pCursor, fFlags, pThis, pszErrorTag)) /* no ; */
+RTASN1TMPL_EXEC_CLONE( rc = rtCrPkcs7ContentInfo_CloneExtra(pThis) ) /* no ; */
+RTASN1TMPL_END_SEQCORE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
diff --git a/src/VBox/Runtime/common/crypto/pkcs7-verify.cpp b/src/VBox/Runtime/common/crypto/pkcs7-verify.cpp
new file mode 100644
index 00000000000..9b4b9334399
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/pkcs7-verify.cpp
@@ -0,0 +1,553 @@
+/* $Id$ */
+/** @file
+ * IPRT - Crypto - PKCS \#7, Verification
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/crypto/pkcs7.h>
+
+#include <iprt/err.h>
+#include <iprt/string.h>
+#include <iprt/crypto/digest.h>
+#include <iprt/crypto/pkix.h>
+#include <iprt/crypto/store.h>
+#include <iprt/crypto/x509.h>
+
+#ifdef IPRT_WITH_OPENSSL
+# include "internal/iprt-openssl.h"
+# include <openssl/pkcs7.h>
+# include <openssl/x509.h>
+# include <openssl/err.h>
+#endif
+
+
+
+#ifdef IPRT_WITH_OPENSSL
+static int rtCrPkcs7VerifySignedDataUsingOpenSsl(PCRTCRPKCS7CONTENTINFO pContentInfo, uint32_t fFlags,
+ RTCRSTORE hAdditionalCerts, RTCRSTORE hTrustedCerts,
+ void const *pvContent, uint32_t cbContent, PRTERRINFO pErrInfo)
+{
+ /*
+ * Verify using OpenSSL.
+ */
+ int rcOssl;
+ unsigned char const *pbRawContent = RTASN1CORE_GET_RAW_ASN1_PTR(&pContentInfo->SeqCore.Asn1Core);
+ PKCS7 *pOsslPkcs7 = NULL;
+ if (d2i_PKCS7(&pOsslPkcs7, &pbRawContent, RTASN1CORE_GET_RAW_ASN1_SIZE(&pContentInfo->SeqCore.Asn1Core)) == pOsslPkcs7)
+ {
+ STACK_OF(X509) *pAddCerts = NULL;
+ if (hAdditionalCerts != NIL_RTCRSTORE)
+ rcOssl = RTCrStoreConvertToOpenSslCertStack(hAdditionalCerts, 0, (void **)&pAddCerts);
+ else
+ {
+ pAddCerts = sk_X509_new_null();
+ if (!pAddCerts)
+ rcOssl = VERR_NO_MEMORY;
+ }
+ if (RT_SUCCESS(rcOssl))
+ {
+ for (uint32_t i = 0; i < pContentInfo->u.pSignedData->Certificates.cItems; i++)
+ rtCrOpenSslAddX509CertToStack(pAddCerts, &pContentInfo->u.pSignedData->Certificates.paItems[i]);
+
+
+ X509_STORE *pTrustedCerts = NULL;
+ if (hTrustedCerts != NIL_RTCRSTORE)
+ rcOssl = RTCrStoreConvertToOpenSslCertStore(hTrustedCerts, 0, (void **)&pTrustedCerts);
+ if (RT_SUCCESS(rcOssl))
+ {
+ rtCrOpenSslInit();
+
+ BIO *pBioContent = BIO_new_mem_buf((void *)pvContent, cbContent);
+ if (pBioContent)
+ {
+ uint32_t fOsslFlags = PKCS7_NOCHAIN;
+ fOsslFlags |= PKCS7_NOVERIFY; // temporary hack.
+ if (PKCS7_verify(pOsslPkcs7, pAddCerts, pTrustedCerts, pBioContent, NULL /*out*/, fOsslFlags))
+ rcOssl = VINF_SUCCESS;
+ else
+ {
+ rcOssl = RTErrInfoSet(pErrInfo, VERR_CR_PKCS7_OSSL_VERIFY_FAILED, "PKCS7_verify failed: ");
+ if (pErrInfo)
+ ERR_print_errors_cb(rtCrOpenSslErrInfoCallback, pErrInfo);
+ }
+ BIO_free(pBioContent);
+ }
+ if (pTrustedCerts)
+ X509_STORE_free(pTrustedCerts);
+ }
+ else
+ rcOssl = RTErrInfoSet(pErrInfo, rcOssl, "RTCrStoreConvertToOpenSslCertStack failed");
+ if (pAddCerts)
+ sk_X509_pop_free(pAddCerts, X509_free);
+ }
+ else
+ rcOssl = RTErrInfoSet(pErrInfo, rcOssl, "RTCrStoreConvertToOpenSslCertStack failed");
+ PKCS7_free(pOsslPkcs7);
+ }
+ else
+ rcOssl = RTErrInfoSet(pErrInfo, VERR_CR_PKCS7_OSSL_D2I_FAILED, "d2i_PKCS7 failed");
+
+ return rcOssl;
+}
+#endif /* IPRT_WITH_OPENSSL */
+
+
+/**
+ * @callback_method_impl{RTCRPKCS7VERIFYCERTCALLBACK,
+ * Default implementation that checks for the DigitalSignature KeyUsage bit.}
+ */
+RTDECL(int) RTCrPkcs7VerifyCertCallbackDefault(PCRTCRX509CERTIFICATE pCert, RTCRX509CERTPATHS hCertPaths,
+ void *pvUser, PRTERRINFO pErrInfo)
+{
+ /*
+ * Check for the digital signature key usage.
+ */
+ if ( (pCert->TbsCertificate.T3.fFlags & RTCRX509TBSCERTIFICATE_F_PRESENT_KEY_USAGE)
+ && !(pCert->TbsCertificate.T3.fKeyUsage & RTCRX509CERT_KEY_USAGE_F_DIGITAL_SIGNATURE))
+ return RTErrInfoSetF(pErrInfo, VERR_CR_PKCS7_KEY_USAGE_MISMATCH, "fKeyUsage=%#x, missing %#x",
+ pCert->TbsCertificate.T3.fKeyUsage, RTCRX509CERT_KEY_USAGE_F_DIGITAL_SIGNATURE);
+ return VINF_SUCCESS;
+}
+
+
+/**
+ * @callback_method_impl{RTCRPKCS7VERIFYCERTCALLBACK,
+ * Standard code signing. Use this for Microsoft SPC.}
+ */
+RTDECL(int) RTCrPkcs7VerifyCertCallbackCodeSigning(PCRTCRX509CERTIFICATE pCert, RTCRX509CERTPATHS hCertPaths,
+ void *pvUser, PRTERRINFO pErrInfo)
+{
+ /*
+ * Check for the digital signature key usage. Not required to be present.
+ */
+ if (pCert->TbsCertificate.T3.fFlags & RTCRX509TBSCERTIFICATE_F_PRESENT_KEY_USAGE)
+ {
+ if (!(pCert->TbsCertificate.T3.fKeyUsage & RTCRX509CERT_KEY_USAGE_F_DIGITAL_SIGNATURE))
+ return RTErrInfoSetF(pErrInfo, VERR_CR_PKCS7_KEY_USAGE_MISMATCH, "fKeyUsage=%#x, missing %#x",
+ pCert->TbsCertificate.T3.fKeyUsage, RTCRX509CERT_KEY_USAGE_F_DIGITAL_SIGNATURE);
+ }
+
+ /*
+ * Check the extended key usage bits if present.
+ */
+ if (!(pCert->TbsCertificate.T3.fFlags & RTCRX509TBSCERTIFICATE_F_PRESENT_EXT_KEY_USAGE))
+ return RTErrInfoSetF(pErrInfo, VERR_CR_PKCS7_KEY_USAGE_MISMATCH, "No extended key usage certificate attribute.");
+ if (!(pCert->TbsCertificate.T3.fExtKeyUsage & RTCRX509CERT_EKU_F_CODE_SIGNING))
+ return RTErrInfoSetF(pErrInfo, VERR_CR_PKCS7_KEY_USAGE_MISMATCH, "fExtKeyUsage=%#x, missing %#x",
+ pCert->TbsCertificate.T3.fExtKeyUsage, RTCRX509CERT_EKU_F_CODE_SIGNING);
+ return VINF_SUCCESS;
+}
+
+
+/**
+ * Deals with authenticated attributes.
+ *
+ * When authenticated attributes are present (checked by caller) we must:
+ * - fish out the content type and check it against the content inof,
+ * - fish out the message digest among and check it against *phDigest,
+ * - compute the message digest of the authenticated attributes and
+ * replace *phDigest with this for the signature verification.
+ *
+ * @returns IPRT status code.
+ * @param pSignerInfo The signer info being verified.
+ * @param pSignedData The signed data.
+ * @param phDigest On input this is the digest of the content. On
+ * output it will (on success) be a reference to
+ * the message digest of the authenticated
+ * attributes. The input reference is consumed.
+ * The caller shall release the output reference.
+ * @param fFlags Flags.
+ * @param pErrInfo Extended error info, optional.
+ */
+static int rtCrPkcs7VerifySignerInfoAuthAttribs(PCRTCRPKCS7SIGNERINFO pSignerInfo, PCRTCRPKCS7SIGNEDDATA pSignedData,
+ PRTCRDIGEST phDigest, uint32_t fFlags, PRTERRINFO pErrInfo)
+{
+ /*
+ * Scan the attributes and validate the two required attributes
+ * (RFC-2315, chapter 9.2, fourth bullet). Checking that we've got exactly
+ * one of each of them is checked by the santiy checker function, so we'll
+ * just assert that it did it's job here.
+ */
+ uint32_t cContentTypes = 0;
+ uint32_t cMessageDigests = 0;
+ uint32_t i = pSignerInfo->AuthenticatedAttributes.cItems;
+ while (i-- > 0)
+ {
+ PCRTCRPKCS7ATTRIBUTE pAttrib = &pSignerInfo->AuthenticatedAttributes.paItems[i];
+
+ if (RTAsn1ObjId_CompareWithString(&pAttrib->Type, RTCR_PKCS9_ID_CONTENT_TYPE_OID) == 0)
+ {
+ AssertReturn(!cContentTypes, VERR_CR_PKCS7_INTERNAL_ERROR);
+ AssertReturn(pAttrib->enmType == RTCRPKCS7ATTRIBUTETYPE_OBJ_IDS, VERR_CR_PKCS7_INTERNAL_ERROR);
+ AssertReturn(pAttrib->uValues.pObjIds->cItems == 1, VERR_CR_PKCS7_INTERNAL_ERROR);
+
+ if (RTAsn1ObjId_Compare(&pAttrib->uValues.pObjIds->paItems[0], &pSignedData->ContentInfo.ContentType) != 0)
+ return RTErrInfoSetF(pErrInfo, VERR_CR_PKCS7_CONTENT_TYPE_ATTRIB_MISMATCH,
+ "Expected content-type %s, found %s",
+ &pAttrib->uValues.pObjIds->paItems[0], pSignedData->ContentInfo.ContentType.szObjId);
+ cContentTypes++;
+ }
+ else if (RTAsn1ObjId_CompareWithString(&pAttrib->Type, RTCR_PKCS9_ID_MESSAGE_DIGEST_OID) == 0)
+ {
+ AssertReturn(!cMessageDigests, VERR_CR_PKCS7_INTERNAL_ERROR);
+ AssertReturn(pAttrib->enmType == RTCRPKCS7ATTRIBUTETYPE_OCTET_STRINGS, VERR_CR_PKCS7_INTERNAL_ERROR);
+ AssertReturn(pAttrib->uValues.pOctetStrings->cItems == 1, VERR_CR_PKCS7_INTERNAL_ERROR);
+
+ if (!RTCrDigestMatch(*phDigest,
+ pAttrib->uValues.pOctetStrings->paItems[0].Asn1Core.uData.pv,
+ pAttrib->uValues.pOctetStrings->paItems[0].Asn1Core.cb))
+ {
+ size_t cbHash = RTCrDigestGetHashSize(*phDigest);
+ if (cbHash != pAttrib->uValues.pOctetStrings->paItems[0].Asn1Core.cb)
+ return RTErrInfoSetF(pErrInfo, VERR_CR_PKCS7_MESSAGE_DIGEST_ATTRIB_MISMATCH,
+ "Authenticated message-digest attribute mismatch: cbHash=%#zx cbValue=%#x",
+ cbHash, pAttrib->uValues.pOctetStrings->paItems[0].Asn1Core.cb);
+ return RTErrInfoSetF(pErrInfo, VERR_CR_PKCS7_MESSAGE_DIGEST_ATTRIB_MISMATCH,
+ "Authenticated message-digest attribute mismatch (cbHash=%#zx):\n"
+ "signed: %.*Rhxs\n"
+ "our: %.*Rhxs\n",
+ cbHash,
+ cbHash, pAttrib->uValues.pOctetStrings->paItems[0].Asn1Core.uData.pv,
+ cbHash, RTCrDigestGetHash(*phDigest));
+ }
+ cMessageDigests++;
+ }
+ }
+
+ AssertReturn(cContentTypes == 1, VERR_CR_PKCS7_INTERNAL_ERROR);
+ AssertReturn(cMessageDigests == 1, VERR_CR_PKCS7_INTERNAL_ERROR);
+
+ /*
+ * Calculate the digest of the the authenticated attributes for use in the
+ * signature validation.
+ */
+ if ( pSignerInfo->DigestAlgorithm.Parameters.enmType != RTASN1TYPE_NULL
+ && pSignerInfo->DigestAlgorithm.Parameters.enmType != RTASN1TYPE_NOT_PRESENT)
+ return RTErrInfoSet(pErrInfo, VERR_CR_PKCS7_DIGEST_PARAMS_NOT_IMPL, "Digest algorithm has unsupported parameters");
+
+ RTCRDIGEST hDigest;
+ int rc = RTCrDigestCreateByObjId(&hDigest, &pSignerInfo->DigestAlgorithm.Algorithm);
+ if (RT_SUCCESS(rc))
+ {
+ RTCrDigestRelease(*phDigest);
+ *phDigest = hDigest;
+
+ /* ASSUMES that the attributes are encoded according to DER. */
+ uint8_t const *pbData = (uint8_t const *)RTASN1CORE_GET_RAW_ASN1_PTR(&pSignerInfo->AuthenticatedAttributes.SetCore.Asn1Core);
+ uint32_t cbData = RTASN1CORE_GET_RAW_ASN1_SIZE(&pSignerInfo->AuthenticatedAttributes.SetCore.Asn1Core);
+ uint8_t bSetOfTag = ASN1_TAG_SET | ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_CONSTRUCTED;
+ rc = RTCrDigestUpdate(hDigest, &bSetOfTag, sizeof(bSetOfTag)); /* Replace the implict tag with a SET-OF tag. */
+ if (RT_SUCCESS(rc))
+ rc = RTCrDigestUpdate(hDigest, pbData + sizeof(bSetOfTag), cbData - sizeof(bSetOfTag)); /* Skip the implicit tag. */
+ if (RT_SUCCESS(rc))
+ rc = RTCrDigestFinal(hDigest, NULL, 0);
+ }
+ return rc;
+}
+
+
+/**
+ * Verifies one signature on a PKCS \#7 SignedData.
+ *
+ * @returns IPRT status code.
+ * @param pSignerInfo The signature.
+ * @param pSignedData The SignedData.
+ * @param pahDigests Array of content digests that runs parallel to
+ * pSignedData->DigestAlgorithms.
+ * @param fFlags Verficiation flags.
+ * @param hAdditionalCerts Store containing optional certificates,
+ * optional.
+ * @param hTrustedCerts Store containing trusted certificates, required.
+ * @param pValidationTime The time we're supposed to validate the
+ * certificates chains at.
+ * @param pfnVerifyCert Signing certificate verification callback.
+ * @param pvUser Callback parameter.
+ * @param pErrInfo Where to store additional error details,
+ * optional.
+ */
+static int rtCrPkcs7VerifySignerInfo(PCRTCRPKCS7SIGNERINFO pSignerInfo, PCRTCRPKCS7SIGNEDDATA pSignedData,
+ PRTCRDIGEST pahDigests, uint32_t fFlags, RTCRSTORE hAdditionalCerts, RTCRSTORE hTrustedCerts,
+ PCRTTIMESPEC pValidationTime, RTCRPKCS7VERIFYCERTCALLBACK pfnVerifyCert, void *pvUser,
+ PRTERRINFO pErrInfo)
+{
+ /*
+ * Check for counter signatures with timestamp. Verify the signature for
+ * the current time if not present.
+ */
+ /** @todo timestamp counter signatures. */
+
+ /*
+ * Locate the certificate used for signing.
+ */
+ PCRTCRCERTCTX pSignerCertCtx = NULL;
+ PCRTCRX509CERTIFICATE pSignerCert = NULL;
+ RTCRSTORE hSignerCertSrc = hTrustedCerts;
+ if (hSignerCertSrc != NIL_RTCRSTORE)
+ pSignerCertCtx = RTCrStoreCertByIssuerAndSerialNo(hSignerCertSrc, &pSignerInfo->IssuerAndSerialNumber.Name,
+ &pSignerInfo->IssuerAndSerialNumber.SerialNumber);
+ if (!pSignerCertCtx)
+ {
+ hSignerCertSrc = hAdditionalCerts;
+ if (hSignerCertSrc != NIL_RTCRSTORE)
+ pSignerCertCtx = RTCrStoreCertByIssuerAndSerialNo(hSignerCertSrc, &pSignerInfo->IssuerAndSerialNumber.Name,
+ &pSignerInfo->IssuerAndSerialNumber.SerialNumber);
+ }
+ if (pSignerCertCtx)
+ pSignerCert = pSignerCertCtx->pCert;
+ else
+ {
+ hSignerCertSrc = NULL;
+ pSignerCert = RTCrX509Certificates_FindByIssuerAndSerialNumber(&pSignedData->Certificates,
+ &pSignerInfo->IssuerAndSerialNumber.Name,
+ &pSignerInfo->IssuerAndSerialNumber.SerialNumber);
+ if (!pSignerCert)
+ return RTErrInfoSetF(pErrInfo, VERR_CR_PKCS7_SIGNED_DATA_CERT_NOT_FOUND,
+ "Certificate not found: serial=%.*Rhxs",
+ pSignerInfo->IssuerAndSerialNumber.SerialNumber.Asn1Core.cb,
+ pSignerInfo->IssuerAndSerialNumber.SerialNumber.Asn1Core.uData.pv);
+ }
+
+ /*
+ * If not a trusted certificate, we'll have to build certificate paths
+ * and verify them. If no valid paths are found, this step will fail.
+ */
+ int rc = VINF_SUCCESS;
+ if ( hSignerCertSrc == NIL_RTCRSTORE
+ || hSignerCertSrc != hTrustedCerts)
+ {
+ RTCRX509CERTPATHS hCertPaths;
+ rc = RTCrX509CertPathsCreate(&hCertPaths, pSignerCert);
+ if (RT_SUCCESS(rc))
+ {
+ rc = RTCrX509CertPathsSetValidTimeSpec(hCertPaths, pValidationTime);
+ if (hTrustedCerts != NIL_RTCRSTORE && RT_SUCCESS(rc))
+ rc = RTCrX509CertPathsSetTrustedStore(hCertPaths, hTrustedCerts);
+ if (hAdditionalCerts != NIL_RTCRSTORE && RT_SUCCESS(rc))
+ rc = RTCrX509CertPathsSetUntrustedStore(hCertPaths, hAdditionalCerts);
+ if (pSignedData->Certificates.cItems > 0 && RT_SUCCESS(rc))
+ rc = RTCrX509CertPathsSetUntrustedArray(hCertPaths,
+ pSignedData->Certificates.paItems,
+ pSignedData->Certificates.cItems);
+ if (RT_SUCCESS(rc))
+ {
+ rc = RTCrX509CertPathsBuild(hCertPaths, pErrInfo);
+ if (RT_SUCCESS(rc))
+ rc = RTCrX509CertPathsValidateAll(hCertPaths, NULL, pErrInfo);
+
+ /*
+ * Check that the certificate purpose and whatnot matches what
+ * is being signed.
+ */
+ if (RT_SUCCESS(rc))
+ rc = pfnVerifyCert(pSignerCert, hCertPaths, pvUser, pErrInfo);
+ }
+ else
+ RTErrInfoSetF(pErrInfo, rc, "Error configuring path builder: %Rrc", rc);
+ RTCrX509CertPathsRelease(hCertPaths);
+ }
+ }
+ /*
+ * Check that the certificate purpose matches what is signed.
+ */
+ else
+ rc = pfnVerifyCert(pSignerCert, NIL_RTCRX509CERTPATHS, pvUser, pErrInfo);
+
+ /*
+ * Find the digest that is signed and reference it so we can replace it
+ * below if necessary.
+ */
+ RTCRDIGEST hDigest = NIL_RTCRDIGEST;
+ uint32_t iDigest = pSignedData->DigestAlgorithms.cItems;
+ while (iDigest-- > 0)
+ if (RTCrX509AlgorithmIdentifier_Compare(&pSignedData->DigestAlgorithms.paItems[iDigest],
+ &pSignerInfo->DigestAlgorithm) == 0)
+ {
+ hDigest = pahDigests[iDigest];
+ uint32_t cRefs = RTCrDigestRetain(hDigest);
+ AssertStmt(cRefs != UINT32_MAX, cRefs = NIL_RTCRDIGEST; rc = VERR_CR_PKCS7_INTERNAL_ERROR);
+ break;
+ }
+ if (hDigest == NIL_RTCRDIGEST && RT_SUCCESS(rc))
+ rc = RTErrInfoSetF(pErrInfo, VERR_CR_PKCS7_DIGEST_ALGO_NOT_FOUND_IN_LIST,
+ "SignerInfo.DigestAlgorithm %s not found.",
+ pSignerInfo->DigestAlgorithm.Algorithm.szObjId);
+
+ /*
+ * If there are authenticated attributes, we've got more work before we
+ * can verify the signature.
+ */
+ if ( RT_SUCCESS(rc)
+ && RTCrPkcs7Attributes_IsPresent(&pSignerInfo->AuthenticatedAttributes))
+ rc = rtCrPkcs7VerifySignerInfoAuthAttribs(pSignerInfo, pSignedData, &hDigest, fFlags, pErrInfo);
+
+ /*
+ * Verify the signature.
+ */
+ if (RT_SUCCESS(rc))
+ {
+ RTCRPKIXSIGNATURE hSignature;
+ rc = RTCrPkixSignatureCreateByObjId(&hSignature,
+ &pSignerCert->TbsCertificate.SubjectPublicKeyInfo.Algorithm.Algorithm,
+ false /*fSigning*/,
+ &pSignerCert->TbsCertificate.SubjectPublicKeyInfo.SubjectPublicKey,
+ &pSignerInfo->DigestEncryptionAlgorithm.Parameters);
+ if (RT_SUCCESS(rc))
+ {
+ /** @todo Check that DigestEncryptionAlgorithm is compatible with hSignature
+ * (this is not vital). */
+ rc = RTCrPkixSignatureVerifyOctetString(hSignature, hDigest, &pSignerInfo->EncryptedDigest);
+ if (RT_FAILURE(rc))
+ rc = RTErrInfoSetF(pErrInfo, VERR_CR_PKCS7_SIGNATURE_VERIFICATION_FAILED,
+ "Signature verficiation failed: %Rrc", rc);
+ RTCrPkixSignatureRelease(hSignature);
+ }
+ else
+ rc = RTErrInfoSetF(pErrInfo, rc, "Failure to instantiate public key algorithm [IPRT]: %s (%s)",
+ pSignerCert->TbsCertificate.SubjectPublicKeyInfo.Algorithm.Algorithm.szObjId,
+ pSignerInfo->DigestEncryptionAlgorithm.Algorithm.szObjId);
+ }
+
+ RTCrDigestRelease(hDigest);
+ RTCrCertCtxRelease(pSignerCertCtx);
+ return rc;
+}
+
+
+RTDECL(int) RTCrPkcs7VerifySignedData(PCRTCRPKCS7CONTENTINFO pContentInfo, uint32_t fFlags,
+ RTCRSTORE hAdditionalCerts, RTCRSTORE hTrustedCerts,
+ PCRTTIMESPEC pValidationTime, PRTCRPKCS7VERIFYCERTCALLBACK pfnVerifyCert, void *pvUser,
+ PRTERRINFO pErrInfo)
+{
+ /*
+ * Check the input.
+ */
+ if (pfnVerifyCert)
+ AssertPtrReturn(pfnVerifyCert, VERR_INVALID_POINTER);
+ else
+ pfnVerifyCert = RTCrPkcs7VerifyCertCallbackDefault;
+
+ if (!RTCrPkcs7ContentInfo_IsSignedData(pContentInfo))
+ return RTErrInfoSet(pErrInfo, VERR_CR_PKCS7_NOT_SIGNED_DATA, "Not PKCS #7 SignedData.");
+ PCRTCRPKCS7SIGNEDDATA pSignedData = pContentInfo->u.pSignedData;
+ int rc = RTCrPkcs7SignedData_CheckSanity(pSignedData, 0, pErrInfo, "");
+ if (RT_FAILURE(rc))
+ return rc;
+
+ /*
+ * Hash the content info.
+ */
+ /* Exactly what the content is, for some stupid reason unnecessarily
+ complicated. Figure it out here as we'll need it for the OpenSSL code
+ path as well. */
+ void const *pvContent = pSignedData->ContentInfo.Content.Asn1Core.uData.pv;
+ uint32_t cbContent = pSignedData->ContentInfo.Content.Asn1Core.cb;
+ if (pSignedData->ContentInfo.Content.pEncapsulated)
+ {
+ pvContent = pSignedData->ContentInfo.Content.pEncapsulated->uData.pv;
+ cbContent = pSignedData->ContentInfo.Content.pEncapsulated->cb;
+ }
+
+ /* Check that there aren't too many or too few hash algorithms for our
+ implementation and purposes. */
+ RTCRDIGEST ahDigests[2];
+ uint32_t const cDigests = pSignedData->DigestAlgorithms.cItems;
+ if (!cDigests) /** @todo we might have to support this... */
+ return RTErrInfoSetF(pErrInfo, VERR_CR_PKCS7_NO_DIGEST_ALGORITHMS, "No digest algorithms");
+
+ if (cDigests > RT_ELEMENTS(ahDigests))
+ return RTErrInfoSetF(pErrInfo, VERR_CR_PKCS7_TOO_MANY_DIGEST_ALGORITHMS,
+ "Too many digest algorithm: cAlgorithms=%u", cDigests);
+
+ /* Create the message digest calculators. */
+ rc = VERR_CR_PKCS7_NO_DIGEST_ALGORITHMS;
+ uint32_t i;
+ for (i = 0; i < cDigests; i++)
+ {
+ rc = RTCrDigestCreateByObjId(&ahDigests[i], &pSignedData->DigestAlgorithms.paItems[i].Algorithm);
+ if (RT_FAILURE(rc))
+ {
+ rc = RTErrInfoSetF(pErrInfo, VERR_CR_PKCS7_DIGEST_CREATE_ERROR, "Error creating digest for '%s': %Rrc",
+ pSignedData->DigestAlgorithms.paItems[i].Algorithm.szObjId, rc);
+ break;
+ }
+ }
+ if (RT_SUCCESS(rc))
+ {
+ /* Hash the content. */
+ for (i = 0; i < cDigests && RT_SUCCESS(rc); i++)
+ {
+ rc = RTCrDigestUpdate(ahDigests[i], pvContent, cbContent);
+ if (RT_SUCCESS(rc))
+ rc = RTCrDigestFinal(ahDigests[i], NULL, 0);
+ }
+ if (RT_SUCCESS(rc))
+ {
+ /*
+ * Validate the signed infos.
+ */
+ rc = VERR_CR_PKCS7_NO_SIGNER_INFOS;
+ for (i = 0; i < pSignedData->SignerInfos.cItems; i++)
+ {
+ rc = rtCrPkcs7VerifySignerInfo(&pSignedData->SignerInfos.paItems[i], pSignedData, ahDigests,
+ fFlags, hAdditionalCerts, hTrustedCerts, pValidationTime,
+ pfnVerifyCert, pvUser, pErrInfo);
+ if (RT_FAILURE(rc))
+ break;
+ }
+ }
+ else
+ rc = RTErrInfoSetF(pErrInfo, VERR_CR_PKCS7_DIGEST_CALC_ERROR,
+ "Hashing content failed unexpectedly (i=%u): %Rrc", i, rc);
+
+ /* Clean up digests. */
+ i = cDigests;
+ }
+ while (i-- > 0)
+ {
+ int rc2 = RTCrDigestRelease(ahDigests[i]);
+ AssertRC(rc2);
+ }
+
+
+#ifdef IPRT_WITH_OPENSSL
+ /*
+ * Verify using OpenSSL and combine the results (should be identical).
+ */
+ int rcOssl = rtCrPkcs7VerifySignedDataUsingOpenSsl(pContentInfo, fFlags, hAdditionalCerts, hTrustedCerts,
+ pvContent, cbContent, RT_SUCCESS(rc) ? pErrInfo : NULL);
+ if (RT_SUCCESS(rcOssl) && RT_SUCCESS(rc))
+ return rc;
+// AssertMsg(RT_FAILURE_NP(rcOssl) && RT_FAILURE_NP(rc), ("%Rrc, %Rrc\n", rcOssl, rc));
+ if (RT_FAILURE(rc))
+ return rc;
+ return rcOssl;
+#else
+ return rc;
+#endif
+}
+
diff --git a/src/VBox/Runtime/common/crypto/pkix-signature-builtin.cpp b/src/VBox/Runtime/common/crypto/pkix-signature-builtin.cpp
new file mode 100644
index 00000000000..675a1ce7144
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/pkix-signature-builtin.cpp
@@ -0,0 +1,139 @@
+/* $Id$ */
+/** @file
+ * IPRT - Crypto - Public Key Signature Schemas, Built-in providers.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/crypto/pkix.h>
+
+#include <iprt/err.h>
+#include <iprt/string.h>
+
+#ifdef IPRT_WITH_OPENSSL
+# include "internal/iprt-openssl.h"
+# include <openssl/evp.h>
+#endif
+
+#include "pkix-signature-builtin.h"
+
+
+/*******************************************************************************
+* Global Variables *
+*******************************************************************************/
+/**
+ * Array of built in message digest vtables.
+ */
+static PCRTCRPKIXSIGNATUREDESC const g_apPkixSignatureDescriptors[] =
+{
+ &g_rtCrPkixSigningHashWithRsaDesc,
+};
+
+
+
+PCRTCRPKIXSIGNATUREDESC RTCrPkixSignatureFindByObjIdString(const char *pszObjId, void **ppvOpaque)
+{
+ if (ppvOpaque)
+ *ppvOpaque = NULL;
+
+ /*
+ * Primary OIDs.
+ */
+ uint32_t i = RT_ELEMENTS(g_apPkixSignatureDescriptors);
+ while (i-- > 0)
+ if (strcmp(g_apPkixSignatureDescriptors[i]->pszObjId, pszObjId) == 0)
+ return g_apPkixSignatureDescriptors[i];
+
+ /*
+ * Alias OIDs.
+ */
+ i = RT_ELEMENTS(g_apPkixSignatureDescriptors);
+ while (i-- > 0)
+ {
+ const char * const *ppszAliases = g_apPkixSignatureDescriptors[i]->papszObjIdAliases;
+ if (ppszAliases)
+ for (; *ppszAliases; ppszAliases++)
+ if (strcmp(*ppszAliases, pszObjId) == 0)
+ return g_apPkixSignatureDescriptors[i];
+ }
+
+#if 0//def IPRT_WITH_OPENSSL
+ /*
+ * Try EVP and see if it knows the algorithm.
+ */
+ if (ppvOpaque)
+ {
+ rtCrOpenSslInit();
+ int iAlgoNid = OBJ_txt2nid(pszObjId);
+ if (iAlgoNid != NID_undef)
+ {
+ const char *pszAlogSn = OBJ_nid2sn(iAlgoNid);
+ const EVP_MD *pEvpMdType = EVP_get_digestbyname(pszAlogSn);
+ if (pEvpMdType)
+ {
+ /*
+ * Return the OpenSSL provider descriptor and the EVP_MD address.
+ */
+ Assert(pEvpMdType->md_size);
+ *ppvOpaque = (void *)pEvpMdType;
+ return &g_rtCrPkixSignatureOpenSslDesc;
+ }
+ }
+ }
+#endif
+ return NULL;
+}
+
+
+PCRTCRPKIXSIGNATUREDESC RTCrPkixSignatureFindByObjId(PCRTASN1OBJID pObjId, void **ppvOpaque)
+{
+ return RTCrPkixSignatureFindByObjIdString(pObjId->szObjId, ppvOpaque);
+}
+
+
+RTDECL(int) RTCrPkixSignatureCreateByObjIdString(PRTCRPKIXSIGNATURE phSignature, const char *pszObjId, bool fSigning,
+ PCRTASN1BITSTRING pKey,PCRTASN1DYNTYPE pParams)
+{
+ void *pvOpaque;
+ PCRTCRPKIXSIGNATUREDESC pDesc = RTCrPkixSignatureFindByObjIdString(pszObjId, &pvOpaque);
+ if (pDesc)
+ return RTCrPkixSignatureCreate(phSignature, pDesc, pvOpaque, fSigning, pKey, pParams);
+ return VERR_NOT_FOUND;
+}
+
+
+RTDECL(int) RTCrPkixSignatureCreateByObjId(PRTCRPKIXSIGNATURE phSignature, PCRTASN1OBJID pObjId, bool fSigning,
+ PCRTASN1BITSTRING pKey, PCRTASN1DYNTYPE pParams)
+{
+ void *pvOpaque;
+ PCRTCRPKIXSIGNATUREDESC pDesc = RTCrPkixSignatureFindByObjId(pObjId, &pvOpaque);
+ if (pDesc)
+ return RTCrPkixSignatureCreate(phSignature, pDesc, pvOpaque, fSigning, pKey, pParams);
+ return VERR_NOT_FOUND;
+}
+
+
diff --git a/src/VBox/Runtime/common/crypto/pkix-signature-builtin.h b/src/VBox/Runtime/common/crypto/pkix-signature-builtin.h
new file mode 100644
index 00000000000..8b77dcb8854
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/pkix-signature-builtin.h
@@ -0,0 +1,36 @@
+/* $Id$ */
+/** @file
+ * IPRT - Crypto - Public Key Signature Schemas, Built-in providers.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+#ifndef ___common_crypto_pkix_signature_builtin_h
+#define ___common_crypto_pkix_signature_builtin_h
+
+#include <iprt/crypto/pkix.h>
+
+extern DECLHIDDEN(RTCRPKIXSIGNATUREDESC const) g_rtCrPkixSigningHashWithRsaDesc;
+
+#endif
+
diff --git a/src/VBox/Runtime/common/crypto/pkix-signature-core.cpp b/src/VBox/Runtime/common/crypto/pkix-signature-core.cpp
new file mode 100644
index 00000000000..49a02661f8c
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/pkix-signature-core.cpp
@@ -0,0 +1,274 @@
+/* $Id$ */
+/** @file
+ * IPRT - Crypto - Public Key Signature Schema Algorithm, Core API.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/crypto/pkix.h>
+
+#include <iprt/assert.h>
+#include <iprt/asm.h>
+#include <iprt/err.h>
+#include <iprt/mem.h>
+#include <iprt/string.h>
+#include <iprt/crypto/digest.h>
+
+
+/*******************************************************************************
+* Structures and Typedefs *
+*******************************************************************************/
+/**
+ * Generic public key signature scheme instance.
+ */
+typedef struct RTCRPKIXSIGNATUREINT
+{
+ /** Magic value (RTCRPKIXSIGNATUREINT_MAGIC). */
+ uint32_t u32Magic;
+ /** Reference counter. */
+ uint32_t volatile cRefs;
+ /** Pointer to the message digest descriptor. */
+ PCRTCRPKIXSIGNATUREDESC pDesc;
+ /** The operation this instance is licensed for. */
+ bool fSigning;
+ /** State. */
+ uint32_t uState;
+#if ARCH_BITS == 32
+ uint32_t uPadding;
+#endif
+
+ /** Opaque data specific to the message digest algorithm, size given by
+ * RTCRPKIXSIGNATUREDESC::cbState. */
+ uint8_t abState[1];
+} RTCRPKIXSIGNATUREINT;
+AssertCompileMemberAlignment(RTCRPKIXSIGNATUREINT, abState, 8);
+/** Pointer to a public key algorithm instance. */
+typedef RTCRPKIXSIGNATUREINT *PRTCRPKIXSIGNATUREINT;
+
+/** Magic value for RTCRPKIXSIGNATUREINT::u32Magic (Baley Withfield Diffie). */
+#define RTCRPKIXSIGNATUREINT_MAGIC UINT32_C(0x19440605)
+
+/** @name RTCRPKIXSIGNATUREINT::uState values.
+ * @{ */
+/** Ready to go. */
+#define RTCRPKIXSIGNATURE_STATE_READY UINT32_C(1)
+/** Need reset. */
+#define RTCRPKIXSIGNATURE_STATE_DONE UINT32_C(2)
+/** Busted state, can happen after re-init. */
+#define RTCRPKIXSIGNATURE_STATE_BUSTED UINT32_C(3)
+/** @} */
+
+
+
+RTDECL(int) RTCrPkixSignatureCreate(PRTCRPKIXSIGNATURE phSignature, PCRTCRPKIXSIGNATUREDESC pDesc, void *pvOpaque,
+ bool fSigning, PCRTASN1BITSTRING pKey, PCRTASN1DYNTYPE pParams)
+{
+ /*
+ * Validate input.
+ */
+ AssertPtrReturn(phSignature, VERR_INVALID_POINTER);
+ AssertPtrReturn(pDesc, VERR_INVALID_POINTER);
+ AssertPtrReturn(pKey, VERR_INVALID_POINTER);
+ AssertReturn(RTAsn1BitString_IsPresent(pKey), VERR_INVALID_PARAMETER);
+ if (pParams)
+ {
+ AssertPtrReturn(pParams, VERR_INVALID_POINTER);
+ if ( pParams->enmType == RTASN1TYPE_NULL
+ || !RTASN1CORE_IS_PRESENT(&pParams->u.Core))
+ pParams = NULL;
+ }
+
+ /*
+ * Instantiate the algorithm for the given operation.
+ */
+ int rc = VINF_SUCCESS;
+ PRTCRPKIXSIGNATUREINT pThis = (PRTCRPKIXSIGNATUREINT)RTMemAllocZ(RT_OFFSETOF(RTCRPKIXSIGNATUREINT, abState[pDesc->cbState]));
+ if (pThis)
+ {
+ pThis->u32Magic = RTCRPKIXSIGNATUREINT_MAGIC;
+ pThis->cRefs = 1;
+ pThis->pDesc = pDesc;
+ pThis->fSigning = fSigning;
+ pThis->uState = RTCRPKIXSIGNATURE_STATE_READY;
+ if (pDesc->pfnInit)
+ rc = pDesc->pfnInit(pDesc, pThis->abState, pvOpaque, fSigning, pKey, pParams);
+ if (RT_SUCCESS(rc))
+ {
+ *phSignature = pThis;
+ return VINF_SUCCESS;
+ }
+ pThis->u32Magic = 0;
+ RTMemFree(pThis);
+ }
+ else
+ rc = VERR_NO_MEMORY;
+ return rc;
+
+}
+
+
+RTDECL(uint32_t) RTCrPkixSignatureRetain(RTCRPKIXSIGNATURE hSignature)
+{
+ PRTCRPKIXSIGNATUREINT pThis = hSignature;
+ AssertPtrReturn(pThis, UINT32_MAX);
+ AssertReturn(pThis->u32Magic == RTCRPKIXSIGNATUREINT_MAGIC, UINT32_MAX);
+
+ uint32_t cRefs = ASMAtomicIncU32(&pThis->cRefs);
+ Assert(cRefs < 64);
+ return cRefs;
+}
+
+
+RTDECL(uint32_t) RTCrPkixSignatureRelease(RTCRPKIXSIGNATURE hSignature)
+{
+ PRTCRPKIXSIGNATUREINT pThis = hSignature;
+ if (pThis == NIL_RTCRPKIXSIGNATURE)
+ return 0;
+ AssertPtrReturn(pThis, UINT32_MAX);
+ AssertReturn(pThis->u32Magic == RTCRPKIXSIGNATUREINT_MAGIC, UINT32_MAX);
+
+ uint32_t cRefs = ASMAtomicDecU32(&pThis->cRefs);
+ Assert(cRefs < 64);
+ if (!cRefs)
+ {
+ pThis->u32Magic = ~RTCRPKIXSIGNATUREINT_MAGIC;
+ if (pThis->pDesc->pfnDelete)
+ pThis->pDesc->pfnDelete(pThis->pDesc, pThis->abState, pThis->fSigning);
+
+ size_t cbToWipe = RT_OFFSETOF(RTCRPKIXSIGNATUREINT, abState[pThis->pDesc->cbState]);
+ RTMemWipeThoroughly(pThis, cbToWipe, 6);
+
+ RTMemFree(pThis);
+ }
+ return cRefs;
+}
+
+
+/**
+ * Resets the signature provider instance prior to a new signing or verification
+ * opartion.
+ *
+ * @returns IPRT status code.
+ * @param pThis The instance to reset.
+ */
+static int rtCrPkxiSignatureReset(PRTCRPKIXSIGNATUREINT pThis)
+{
+ if (pThis->uState == RTCRPKIXSIGNATURE_STATE_DONE)
+ {
+ if (pThis->pDesc->pfnReset)
+ {
+ int rc = pThis->pDesc->pfnReset(pThis->pDesc, pThis->abState, pThis->fSigning);
+ if (RT_FAILURE(rc))
+ {
+ pThis->uState = RTCRPKIXSIGNATURE_STATE_BUSTED;
+ return rc;
+ }
+ }
+ pThis->uState = RTCRPKIXSIGNATURE_STATE_READY;
+ }
+ return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTCrPkixSignatureVerify(RTCRPKIXSIGNATURE hSignature, RTCRDIGEST hDigest,
+ void const *pvSignature, size_t cbSignature)
+{
+ PRTCRPKIXSIGNATUREINT pThis = hSignature;
+ AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
+ AssertReturn(pThis->u32Magic == RTCRPKIXSIGNATUREINT_MAGIC, VERR_INVALID_HANDLE);
+ AssertReturn(!pThis->fSigning, VERR_INVALID_FUNCTION);
+ AssertReturn(pThis->uState == RTCRPKIXSIGNATURE_STATE_READY || pThis->uState == RTCRPKIXSIGNATURE_STATE_DONE, VERR_INVALID_STATE);
+
+ uint32_t cRefs = RTCrDigestRetain(hDigest);
+ AssertReturn(cRefs != UINT32_MAX, VERR_INVALID_HANDLE);
+
+ int rc = rtCrPkxiSignatureReset(pThis);
+ if (RT_SUCCESS(rc))
+ {
+ rc = pThis->pDesc->pfnVerify(pThis->pDesc, pThis->abState, hDigest, pvSignature, cbSignature);
+ pThis->uState = RTCRPKIXSIGNATURE_STATE_DONE;
+ }
+
+ RTCrDigestRelease(hDigest);
+ return rc;
+}
+
+
+RTDECL(int) RTCrPkixSignatureVerifyBitString(RTCRPKIXSIGNATURE hSignature, RTCRDIGEST hDigest, PCRTASN1BITSTRING pSignature)
+{
+ /*
+ * Just unpack it and pass it on to the lower level API.
+ */
+ AssertPtrReturn(pSignature, VERR_INVALID_POINTER);
+ AssertReturn(RTAsn1BitString_IsPresent(pSignature), VERR_INVALID_PARAMETER);
+ uint32_t cbData = RTASN1BITSTRING_GET_BYTE_SIZE(pSignature);
+ void const *pvData = RTASN1BITSTRING_GET_BIT0_PTR(pSignature);
+ AssertPtrReturn(pvData, VERR_INVALID_PARAMETER);
+
+ return RTCrPkixSignatureVerify(hSignature, hDigest, pvData, cbData);
+}
+
+
+RTDECL(int) RTCrPkixSignatureVerifyOctetString(RTCRPKIXSIGNATURE hSignature, RTCRDIGEST hDigest, PCRTASN1OCTETSTRING pSignature)
+{
+ /*
+ * Just unpack it and pass it on to the lower level API.
+ */
+ AssertPtrReturn(pSignature, VERR_INVALID_POINTER);
+ AssertReturn(RTAsn1OctetString_IsPresent(pSignature), VERR_INVALID_PARAMETER);
+ uint32_t cbData = pSignature->Asn1Core.cb;
+ void const *pvData = pSignature->Asn1Core.uData.pv;
+ AssertPtrReturn(pvData, VERR_INVALID_PARAMETER);
+
+ return RTCrPkixSignatureVerify(hSignature, hDigest, pvData, cbData);
+}
+
+
+RTDECL(int) RTCrPkixSignatureSign(RTCRPKIXSIGNATURE hSignature, RTCRDIGEST hDigest,
+ void *pvSignature, size_t *pcbSignature)
+{
+ PRTCRPKIXSIGNATUREINT pThis = hSignature;
+ AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
+ AssertReturn(pThis->u32Magic == RTCRPKIXSIGNATUREINT_MAGIC, VERR_INVALID_HANDLE);
+ AssertReturn(pThis->fSigning, VERR_INVALID_FUNCTION);
+ AssertReturn(pThis->uState == RTCRPKIXSIGNATURE_STATE_READY || pThis->uState == RTCRPKIXSIGNATURE_STATE_DONE, VERR_INVALID_STATE);
+
+ uint32_t cRefs = RTCrDigestRetain(hDigest);
+ AssertReturn(cRefs != UINT32_MAX, VERR_INVALID_HANDLE);
+
+ int rc = rtCrPkxiSignatureReset(pThis);
+ if (RT_SUCCESS(rc))
+ {
+ rc = pThis->pDesc->pfnSign(pThis->pDesc, pThis->abState, hDigest, pvSignature, pcbSignature);
+ if (rc != VERR_BUFFER_OVERFLOW)
+ pThis->uState = RTCRPKIXSIGNATURE_STATE_DONE;
+ }
+
+ RTCrDigestRelease(hDigest);
+ return rc;
+}
+
diff --git a/src/VBox/Runtime/common/crypto/pkix-signature-rsa.cpp b/src/VBox/Runtime/common/crypto/pkix-signature-rsa.cpp
new file mode 100644
index 00000000000..2a188d4e523
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/pkix-signature-rsa.cpp
@@ -0,0 +1,407 @@
+/* $Id$ */
+/** @file
+ * IPRT - Crypto - Public Key Signature Schema Algorithm, RSA Providers.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/crypto/rsa.h>
+
+#include <iprt/bignum.h>
+#include <iprt/err.h>
+#include <iprt/mem.h>
+#include <iprt/string.h>
+#include <iprt/crypto/digest.h>
+#include <iprt/crypto/pkix.h>
+
+#include "rsa-internal.h"
+#include "pkix-signature-builtin.h"
+
+
+/*******************************************************************************
+* Structures and Typedefs *
+*******************************************************************************/
+/**
+ * RSA signature provider instance.
+ */
+typedef struct RTCRPKIXSIGNATURERSA
+{
+ /** Set if we're signing, clear if verifying. */
+ bool fSigning;
+ /** The modulus. */
+ RTBIGNUM Modulus;
+ /** The exponent. */
+ RTBIGNUM Exponent;
+
+ /** Temporary big number for use when signing or verifiying. */
+ RTBIGNUM TmpBigNum1;
+ /** Temporary big number for use when signing or verifiying. */
+ RTBIGNUM TmpBigNum2;
+
+ /** Scratch space for decoding the key. */
+ union
+ {
+ /** Public key. */
+ RTCRRSAPUBLICKEY PublicKey;
+ /** Private key. */
+ RTCRRSAPRIVATEKEY PrivateKey;
+ /** Scratch area where we assemble the signature. */
+ uint8_t abSignature[RTCRRSA_MAX_MODULUS_BITS / 8 * 2];
+ } Scratch;
+} RTCRPKIXSIGNATURERSA;
+/** Pointer to an RSA signature provider instance. */
+typedef RTCRPKIXSIGNATURERSA *PRTCRPKIXSIGNATURERSA;
+
+
+/*******************************************************************************
+* Global Variables *
+*******************************************************************************/
+/** @name Pre-encoded DigestInfo DER sequences.
+ * @{ */
+static const uint8_t g_abMd2[] =
+{/* { { 1.2.840.113549.2.2 (MD2), NULL }, hash octet-string } */
+ 0x30,0x20, 0x30,0x0c, 0x06,0x08,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x02,0x02, 0x05,0x00, 0x04,0x10
+};
+static const uint8_t g_abMd4[] =
+{/* { { 1.2.840.113549.2.4 (MD4), NULL }, hash octet-string } */
+ 0x30,0x20, 0x30,0x0c, 0x06,0x08,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x02,0x04, 0x05,0x00, 0x04,0x10
+};
+static const uint8_t g_abMd5[] =
+{/* { { 1.2.840.113549.2.5 (MD5), NULL }, hash octet-string } */
+ 0x30,0x20, 0x30,0x0c, 0x06,0x08,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x02,0x05, 0x05,0x00, 0x04,0x10
+};
+static const uint8_t g_abSha1[] =
+{/* { { 1.3.14.3.2.26 (SHA-1), NULL }, hash octet-string } */
+ 0x30,0x21, 0x30,0x09, 0x06,0x05,0x2b,0x0e,0x03,0x02,0x1a, 0x05,0x00, 0x04,0x14
+};
+static const uint8_t g_abSha256[] =
+{/* { { 2.16.840.1.101.3.4.2.1 (SHA-256), NULL }, hash octet-string } */
+ 0x30,0x31, 0x30,0x0d, 0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x01, 0x05,0x00, 0x04,0x20
+};
+static const uint8_t g_abSha384[] =
+{/* { { 2.16.840.1.101.3.4.2.2 (SHA-384), NULL }, hash octet-string } */
+ 0x30,0x41, 0x30,0x0d, 0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x02, 0x05,0x00, 0x04,0x30
+};
+static const uint8_t g_abSha512[] =
+{/* { { 2.16.840.1.101.3.4.2.3 (SHA-512), NULL }, hash octet-string } */
+ 0x30,0x51, 0x30,0x0d, 0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x03, 0x05,0x00, 0x04,0x40
+};
+static const uint8_t g_abSha224[] =
+{/* { { 2.16.840.1.101.3.4.2.4 (SHA-224), NULL }, hash octet-string } */
+ 0x30,0x21, 0x30,0x0d, 0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x04, 0x05,0x00, 0x04,0x14
+};
+/** @} */
+
+/** Lookup array for the pre-encoded DigestInfo DER sequences. */
+static struct
+{
+ RTDIGESTTYPE enmDigest;
+ const uint8_t *pb;
+ size_t cb;
+} const g_aDigestInfos[] =
+{
+ { RTDIGESTTYPE_MD2, g_abMd2, sizeof(g_abMd2) },
+ { RTDIGESTTYPE_MD4, g_abMd4, sizeof(g_abMd4) },
+ { RTDIGESTTYPE_MD5, g_abMd5, sizeof(g_abMd5) },
+ { RTDIGESTTYPE_SHA1, g_abSha1, sizeof(g_abSha1) },
+ { RTDIGESTTYPE_SHA256, g_abSha256, sizeof(g_abSha256) },
+ { RTDIGESTTYPE_SHA384, g_abSha384, sizeof(g_abSha384) },
+ { RTDIGESTTYPE_SHA512, g_abSha512, sizeof(g_abSha512) },
+ { RTDIGESTTYPE_SHA224, g_abSha224, sizeof(g_abSha224) },
+};
+
+
+/** @impl_interface_method{RTCRPKIXSIGNATUREDESC,pfnInit} */
+static DECLCALLBACK(int) rtCrPkixSignatureRsa_Init(PCRTCRPKIXSIGNATUREDESC pDesc, void *pvState, void *pvOpaque,
+ bool fSigning, PCRTASN1BITSTRING pKey, PCRTASN1DYNTYPE pParams)
+{
+ if (pParams)
+ return VERR_CR_PKIX_SIGNATURE_TAKES_NO_PARAMETERS;
+
+ PRTCRPKIXSIGNATURERSA pThis = (PRTCRPKIXSIGNATURERSA)pvState;
+ pThis->fSigning = fSigning;
+
+ /*
+ * Decode the key and pick the bits we really need from it.
+ */
+ RTASN1CURSORPRIMARY PrimaryCursor;
+ RTAsn1CursorInitPrimary(&PrimaryCursor, RTASN1BITSTRING_GET_BIT0_PTR(pKey), RTASN1BITSTRING_GET_BYTE_SIZE(pKey),
+ NULL, &g_RTAsn1DefaultAllocator, RTASN1CURSOR_FLAGS_DER, "rsa");
+ int rc;
+ if (!fSigning)
+ {
+ rc = RTCrRsaPublicKey_DecodeAsn1(&PrimaryCursor.Cursor, 0, &pThis->Scratch.PublicKey, "PublicKey");
+ if (RT_SUCCESS(rc))
+ {
+ rc = RTAsn1Integer_ToBigNum(&pThis->Scratch.PublicKey.Modulus, &pThis->Modulus, 0);
+ if (RT_SUCCESS(rc))
+ {
+ rc = RTAsn1Integer_ToBigNum(&pThis->Scratch.PublicKey.PublicExponent, &pThis->Exponent, 0);
+ if (RT_SUCCESS(rc))
+ {
+ RTAsn1VtDelete(&pThis->Scratch.PublicKey.SeqCore.Asn1Core);
+ return VINF_SUCCESS;
+ }
+ RTBigNumDestroy(&pThis->Modulus);
+ }
+ RTAsn1VtDelete(&pThis->Scratch.PublicKey.SeqCore.Asn1Core);
+ }
+ }
+ else
+ {
+ rc = RTCrRsaPrivateKey_DecodeAsn1(&PrimaryCursor.Cursor, 0, &pThis->Scratch.PrivateKey, "PrivateKey");
+ if (RT_SUCCESS(rc))
+ {
+ rc = RTAsn1Integer_ToBigNum(&pThis->Scratch.PrivateKey.Modulus, &pThis->Modulus, RTBIGNUMINIT_F_SENSITIVE);
+ if (RT_SUCCESS(rc))
+ {
+ rc = RTAsn1Integer_ToBigNum(&pThis->Scratch.PrivateKey.PublicExponent, &pThis->Exponent, RTBIGNUMINIT_F_SENSITIVE);
+ if (RT_SUCCESS(rc))
+ {
+ RTAsn1VtDelete(&pThis->Scratch.PrivateKey.SeqCore.Asn1Core);
+ return VINF_SUCCESS;
+ }
+ RTBigNumDestroy(&pThis->Modulus);
+ }
+ RTAsn1VtDelete(&pThis->Scratch.PrivateKey.SeqCore.Asn1Core);
+ }
+ }
+ return rc;
+}
+
+
+/** @impl_interface_method{RTCRPKIXSIGNATUREDESC,pfnReset} */
+static DECLCALLBACK(int) rtCrPkixSignatureRsa_Reset(PCRTCRPKIXSIGNATUREDESC pDesc, void *pvState, bool fSigning)
+{
+ PRTCRPKIXSIGNATURERSA pThis = (PRTCRPKIXSIGNATURERSA)pvState;
+ Assert(pThis->fSigning == fSigning); NOREF(pThis);
+ return VINF_SUCCESS;
+}
+
+
+/** @impl_interface_method{RTCRPKIXSIGNATUREDESC,pfnDelete} */
+static DECLCALLBACK(void) rtCrPkixSignatureRsa_Delete(PCRTCRPKIXSIGNATUREDESC pDesc, void *pvState, bool fSigning)
+{
+ PRTCRPKIXSIGNATURERSA pThis = (PRTCRPKIXSIGNATURERSA)pvState;
+ Assert(pThis->fSigning == fSigning); NOREF(pThis);
+
+ RTBigNumDestroy(&pThis->Modulus);
+ RTBigNumDestroy(&pThis->Exponent);
+}
+
+
+/**
+ * Common worker for rtCrPkixSignatureRsa_Verify and
+ * rtCrPkixSignatureRsa_Sign that encodes an EMSA-PKCS1-V1_5 signature in
+ * the scratch area.
+ *
+ * This function is referred to as EMSA-PKCS1-v1_5-ENCODE(M,k) in RFC-3447 and
+ * is described in section 9.2
+ *
+ * @returns IPRT status code.
+ * @param pThis The RSA signature provider instance.
+ * @param hDigest The digest which hash to turn into a signature.
+ * @param cbEncodedMsg The desired encoded message length.
+ */
+static int rtCrPkixSignatureRsa_EmsaPkcs1V15Encode(PRTCRPKIXSIGNATURERSA pThis, RTCRDIGEST hDigest, size_t cbEncodedMsg)
+{
+ AssertReturn(cbEncodedMsg * 2 <= sizeof(pThis->Scratch), VERR_CR_PKIX_INTERNAL_ERROR);
+
+ /*
+ * Figure out which hash and select the associate prebaked DigestInfo.
+ */
+ RTDIGESTTYPE const enmDigest = RTCrDigestGetType(hDigest);
+ AssertReturn(enmDigest != RTDIGESTTYPE_INVALID && enmDigest != RTDIGESTTYPE_UNKNOWN, VERR_CR_PKIX_UNKNOWN_DIGEST_TYPE);
+ uint8_t const *pbDigestInfoStart = NULL;
+ size_t cbDigestInfoStart = 0;
+ for (uint32_t i = 0; i < RT_ELEMENTS(g_aDigestInfos); i++)
+ if (g_aDigestInfos[i].enmDigest == enmDigest)
+ {
+ pbDigestInfoStart = g_aDigestInfos[i].pb;
+ cbDigestInfoStart = g_aDigestInfos[i].cb;
+ break;
+ }
+ if (!pbDigestInfoStart)
+ return VERR_CR_PKIX_UNKNOWN_DIGEST_TYPE;
+
+ /*
+ * Get the hash size and verify that it matches what we've got in the
+ * precooked DigestInfo. ASSUMES less that 256 bytes of hash.
+ */
+ uint32_t const cbHash = RTCrDigestGetHashSize(hDigest);
+ AssertReturn(cbHash > 0 && cbHash < _16K, VERR_OUT_OF_RANGE);
+ AssertReturn(cbHash == pbDigestInfoStart[cbDigestInfoStart - 1], VERR_CR_PKIX_INTERNAL_ERROR);
+
+ if (cbDigestInfoStart + cbHash + 11 > cbEncodedMsg)
+ return VERR_CR_PKIX_HASH_TOO_LONG_FOR_KEY;
+
+ /*
+ * Encode the message the first part of the scratch area.
+ */
+ uint8_t *pbDst = &pThis->Scratch.abSignature[0];
+ pbDst[0] = 0x00;
+ pbDst[1] = 0x01;
+ size_t cbFFs = cbEncodedMsg - cbHash - cbDigestInfoStart - 3;
+ memset(&pbDst[2], 0xff, cbFFs);
+ pbDst += cbFFs + 2;
+ *pbDst++ = 0x00;
+ memcpy(pbDst, pbDigestInfoStart, cbDigestInfoStart);
+ pbDst += cbDigestInfoStart;
+ int rc = RTCrDigestFinal(hDigest, pbDst, cbHash);
+ if (RT_FAILURE(rc))
+ return rc;
+ pbDst += cbHash;
+ Assert((size_t)(pbDst - &pThis->Scratch.abSignature[0]) == cbEncodedMsg);
+ return VINF_SUCCESS;
+}
+
+
+/** @impl_interface_method{RTCRPKIXSIGNATUREDESC,pfnVerify} */
+static DECLCALLBACK(int) rtCrPkixSignatureRsa_Verify(PCRTCRPKIXSIGNATUREDESC pDesc, void *pvState,
+ RTCRDIGEST hDigest, void const *pvSignature, size_t cbSignature)
+{
+ PRTCRPKIXSIGNATURERSA pThis = (PRTCRPKIXSIGNATURERSA)pvState;
+ Assert(!pThis->fSigning);
+ if (cbSignature > sizeof(pThis->Scratch) / 2)
+ return VERR_CR_PKIX_SIGNATURE_TOO_LONG;
+
+ /*
+ * 8.2.2.1 - Length check.
+ */
+ if (cbSignature != RTBigNumByteWidth(&pThis->Modulus))
+ return VERR_CR_PKIX_INVALID_SIGNATURE_LENGTH;
+
+ /*
+ * 8.2.2.2 - RSA verification / Decrypt the signature.
+ */
+ /* a) s = OS2IP(S) -- Convert signature to integer. */
+ int rc = RTBigNumInit(&pThis->TmpBigNum1, RTBIGNUMINIT_F_ENDIAN_BIG | RTBIGNUMINIT_F_UNSIGNED,
+ pvSignature, cbSignature);
+ if (RT_FAILURE(rc))
+ return rc;
+ /* b) RSAVP1 - 5.2.2.2: Range check (0 <= s < n). */
+ if (RTBigNumCompare(&pThis->TmpBigNum1, &pThis->Modulus) < 0)
+ {
+ if (RTBigNumCompareWithU64(&pThis->TmpBigNum1, 0) >= 0)
+ {
+ /* b) RSAVP1 - 5.2.2.3: s^e mod n */
+ rc = RTBigNumInitZero(&pThis->TmpBigNum2, 0);
+ if (RT_SUCCESS(rc))
+ {
+ rc = RTBigNumModExp(&pThis->TmpBigNum2, &pThis->TmpBigNum1, &pThis->Exponent, &pThis->Modulus);
+ if (RT_SUCCESS(rc))
+ {
+ /* c) EM' = I2OSP(m, k) -- Convert the result to bytes. */
+ uint32_t cbDecrypted = RTBigNumByteWidth(&pThis->TmpBigNum2) + 1; /* 1 = leading zero byte */
+ if (cbDecrypted <= sizeof(pThis->Scratch) / 2)
+ {
+ uint8_t *pbDecrypted = &pThis->Scratch.abSignature[sizeof(pThis->Scratch) / 2];
+ rc = RTBigNumToBytesBigEndian(&pThis->TmpBigNum2, pbDecrypted, cbDecrypted);
+ if (RT_SUCCESS(rc))
+ {
+ /*
+ * 8.2.2.3 - Build a hopefully identical signature using hDigest.
+ */
+ rc = rtCrPkixSignatureRsa_EmsaPkcs1V15Encode(pThis, hDigest, cbDecrypted);
+ if (RT_SUCCESS(rc))
+ {
+ /*
+ * 8.2.2.4 - Compare the two.
+ */
+ if (memcmp(&pThis->Scratch.abSignature[0], pbDecrypted, cbDecrypted) == 0)
+ rc = VINF_SUCCESS;
+ else
+ rc = VERR_CR_PKIX_SIGNATURE_MISMATCH;
+ }
+ }
+ }
+ else
+ rc = VERR_CR_PKIX_SIGNATURE_TOO_LONG;
+ }
+ RTBigNumDestroy(&pThis->TmpBigNum2);
+ }
+ }
+ else
+ rc = VERR_CR_PKIX_SIGNATURE_NEGATIVE;
+ }
+ else
+ rc = VERR_CR_PKIX_SIGNATURE_GE_KEY;
+ RTBigNumDestroy(&pThis->TmpBigNum1);
+ return rc;
+}
+
+
+/** @impl_interface_method{RTCRPKIXSIGNATUREDESC,pfnSign} */
+static DECLCALLBACK(int) rtCrPkixSignatureRsa_Sign(PCRTCRPKIXSIGNATUREDESC pDesc, void *pvState,
+ RTCRDIGEST hDigest, void *pvSignature, size_t *pcbSignature)
+{
+ PRTCRPKIXSIGNATURERSA pThis = (PRTCRPKIXSIGNATURERSA)pvState;
+ Assert(pThis->fSigning); NOREF(pThis);
+ return VERR_NOT_IMPLEMENTED;
+}
+
+
+
+
+/** RSA alias ODIs. */
+static const char * const g_apszHashWithRsaAliases[] =
+{
+ RTCR_PKCS1_MD2_WITH_RSA_OID,
+ RTCR_PKCS1_MD4_WITH_RSA_OID,
+ RTCR_PKCS1_MD5_WITH_RSA_OID,
+ RTCR_PKCS1_SHA1_WITH_RSA_OID,
+ RTCR_PKCS1_SHA256_WITH_RSA_OID,
+ RTCR_PKCS1_SHA384_WITH_RSA_OID,
+ RTCR_PKCS1_SHA512_WITH_RSA_OID,
+ RTCR_PKCS1_SHA224_WITH_RSA_OID,
+ /* Note: Note quite sure about these OIW oddballs. */
+ "1.3.14.3.2.11" /* OIW rsaSignature */,
+ "1.3.14.3.2.14" /* OIW mdc2WithRSASignature */,
+ "1.3.14.3.2.15" /* OIW shaWithRSASignature */,
+ "1.3.14.3.2.24" /* OIW md2WithRSASignature */,
+ "1.3.14.3.2.25" /* OIW md5WithRSASignature */,
+ "1.3.14.3.2.29" /* OIW sha1WithRSASignature */,
+ NULL
+};
+
+
+/** RSA descriptor. */
+DECL_HIDDEN_CONST(RTCRPKIXSIGNATUREDESC const) g_rtCrPkixSigningHashWithRsaDesc =
+{
+ "RSASSA-PKCS1-v1_5",
+ RTCR_PKCS1_RSA_OID,
+ g_apszHashWithRsaAliases,
+ sizeof(RTCRPKIXSIGNATURERSA),
+ 0,
+ 0,
+ rtCrPkixSignatureRsa_Init,
+ rtCrPkixSignatureRsa_Reset,
+ rtCrPkixSignatureRsa_Delete,
+ rtCrPkixSignatureRsa_Verify,
+ rtCrPkixSignatureRsa_Sign,
+};
+
diff --git a/src/VBox/Runtime/common/crypto/pkix-util.cpp b/src/VBox/Runtime/common/crypto/pkix-util.cpp
new file mode 100644
index 00000000000..52a201d2403
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/pkix-util.cpp
@@ -0,0 +1,92 @@
+/* $Id$ */
+/** @file
+ * IPRT - Crypto - Public Key Infrastructure API, Utilities.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/crypto/pkix.h>
+
+#include <iprt/err.h>
+#include <iprt/string.h>
+
+#ifdef IPRT_WITH_OPENSSL
+# include "internal/iprt-openssl.h"
+# include "openssl/evp.h"
+#endif
+
+
+
+
+RTDECL(const char *) RTCrPkixGetCiperOidFromSignatureAlgorithm(PCRTASN1OBJID pAlgorithm)
+{
+ /*
+ * This is all hardcoded, at least for the time being.
+ */
+ if (RTAsn1ObjId_StartsWith(pAlgorithm, RTCR_PKCS1_OID))
+ {
+ if (RTAsn1ObjIdCountComponents(pAlgorithm) == 7)
+ switch (RTAsn1ObjIdGetLastComponentsAsUInt32(pAlgorithm))
+ {
+ case 2:
+ case 3:
+ case 4:
+ case 5:
+ case 11:
+ case 12:
+ case 13:
+ case 14:
+ return RTCR_PKCS1_RSA_OID;
+ case 1: AssertFailed();
+ default:
+ return NULL;
+ }
+ }
+ /*
+ * OIW oddballs.
+ */
+ else if (RTAsn1ObjId_StartsWith(pAlgorithm, "1.3.14.3.2"))
+ {
+ if (RTAsn1ObjIdCountComponents(pAlgorithm) == 6)
+ switch (RTAsn1ObjIdGetLastComponentsAsUInt32(pAlgorithm))
+ {
+ case 11:
+ case 14:
+ case 15:
+ case 24:
+ case 25:
+ case 29:
+ return RTCR_PKCS1_RSA_OID;
+ default:
+ return NULL;
+ }
+ }
+
+
+ return NULL;
+}
+
diff --git a/src/VBox/Runtime/common/crypto/pkix-verify.cpp b/src/VBox/Runtime/common/crypto/pkix-verify.cpp
new file mode 100644
index 00000000000..0b881bd2cf3
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/pkix-verify.cpp
@@ -0,0 +1,178 @@
+/* $Id$ */
+/** @file
+ * IPRT - Crypto - Public Key Infrastructure API, Verification.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/crypto/pkix.h>
+
+#include <iprt/err.h>
+#include <iprt/string.h>
+#include <iprt/crypto/digest.h>
+
+#ifdef IPRT_WITH_OPENSSL
+# include "internal/iprt-openssl.h"
+# include "openssl/evp.h"
+#endif
+
+
+RTDECL(int) RTCrPkixPubKeyVerifySignature(PCRTASN1OBJID pAlgorithm, PCRTASN1DYNTYPE pParameters, PCRTASN1BITSTRING pPublicKey,
+ PCRTASN1BITSTRING pSignatureValue, const void *pvData, size_t cbData,
+ PRTERRINFO pErrInfo)
+{
+ /*
+ * Valid input.
+ */
+ AssertPtrReturn(pAlgorithm, VERR_INVALID_POINTER);
+ AssertReturn(RTAsn1ObjId_IsPresent(pAlgorithm), VERR_INVALID_POINTER);
+
+ if (pParameters)
+ {
+ AssertPtrReturn(pParameters, VERR_INVALID_POINTER);
+ if (pParameters->enmType == RTASN1TYPE_NULL)
+ pParameters = NULL;
+ }
+
+ AssertPtrReturn(pPublicKey, VERR_INVALID_POINTER);
+ AssertReturn(RTAsn1BitString_IsPresent(pPublicKey), VERR_INVALID_POINTER);
+
+ AssertPtrReturn(pSignatureValue, VERR_INVALID_POINTER);
+ AssertReturn(RTAsn1BitString_IsPresent(pSignatureValue), VERR_INVALID_POINTER);
+
+ AssertPtrReturn(pvData, VERR_INVALID_POINTER);
+ AssertReturn(cbData > 0, VERR_INVALID_PARAMETER);
+
+ /*
+ * Parameters are not currently supported (openssl code path).
+ */
+ if (pParameters)
+ return RTErrInfoSet(pErrInfo, VERR_CR_PKIX_CIPHER_ALGO_PARAMS_NOT_IMPL,
+ "Cipher algorithm parameters are not yet supported.");
+
+ /*
+ * Validate using IPRT.
+ */
+ RTCRPKIXSIGNATURE hSignature;
+ int rcIprt = RTCrPkixSignatureCreateByObjId(&hSignature, pAlgorithm, false /*fSigning*/, pPublicKey, pParameters);
+ if (RT_FAILURE(rcIprt))
+ return RTErrInfoSetF(pErrInfo, VERR_CR_PKIX_CIPHER_ALGO_NOT_KNOWN,
+ "Unknown public key algorithm [IPRT]: %s", pAlgorithm->szObjId);
+
+ RTCRDIGEST hDigest;
+ rcIprt = RTCrDigestCreateByObjId(&hDigest, pAlgorithm);
+ if (RT_SUCCESS(rcIprt))
+ {
+ /* Calculate the digest. */
+ rcIprt = RTCrDigestUpdate(hDigest, pvData, cbData);
+ if (RT_SUCCESS(rcIprt))
+ {
+ rcIprt = RTCrPkixSignatureVerifyBitString(hSignature, hDigest, pSignatureValue);
+ if (RT_FAILURE(rcIprt))
+ RTErrInfoSet(pErrInfo, rcIprt, "RTCrPkixSignatureVerifyBitString failed");
+ }
+ else
+ RTErrInfoSet(pErrInfo, rcIprt, "RTCrDigestUpdate failed");
+ RTCrDigestRelease(hDigest);
+ }
+ else
+ RTErrInfoSetF(pErrInfo, rcIprt, "Unknown digest algorithm [IPRT]: %s", pAlgorithm->szObjId);
+ RTCrPkixSignatureRelease(hSignature);
+
+#ifdef IPRT_WITH_OPENSSL
+ /*
+ * Validate using OpenSSL EVP.
+ */
+ rtCrOpenSslInit();
+
+ /* Translate the algorithm ID into a EVP message digest type pointer. */
+ int iAlgoNid = OBJ_txt2nid(pAlgorithm->szObjId);
+ if (iAlgoNid == NID_undef)
+ return RTErrInfoSetF(pErrInfo, VERR_CR_PKIX_OSSL_CIPHER_ALGO_NOT_KNOWN,
+ "Unknown public key algorithm [OpenSSL]: %s", pAlgorithm->szObjId);
+ const char *pszAlogSn = OBJ_nid2sn(iAlgoNid);
+ const EVP_MD *pEvpMdType = EVP_get_digestbyname(pszAlogSn);
+ if (!pEvpMdType)
+ return RTErrInfoSetF(pErrInfo, VERR_CR_PKIX_OSSL_CIPHER_ALGO_NOT_KNOWN_EVP,
+ "EVP_get_digestbyname failed on %s (%s)", pszAlogSn, pAlgorithm->szObjId);
+
+ /* Initialize the EVP message digest context. */
+ EVP_MD_CTX EvpMdCtx;
+ EVP_MD_CTX_init(&EvpMdCtx);
+ if (!EVP_VerifyInit_ex(&EvpMdCtx, pEvpMdType, NULL /*engine*/))
+ return RTErrInfoSetF(pErrInfo, VERR_CR_PKIX_OSSL_CIPHER_ALOG_INIT_FAILED,
+ "EVP_VerifyInit_ex failed (algorithm type is %s / %s)", pszAlogSn, pAlgorithm->szObjId);
+
+ /* Create an EVP public key. */
+ int rcOssl;
+ EVP_PKEY *pEvpPublicKey = EVP_PKEY_new();
+ if (pEvpPublicKey)
+ {
+ pEvpPublicKey->type = EVP_PKEY_type(pEvpMdType->required_pkey_type[0]);
+ if (pEvpPublicKey->type != NID_undef)
+ {
+ const unsigned char *puchPublicKey = RTASN1BITSTRING_GET_BIT0_PTR(pPublicKey);
+ if (d2i_PublicKey(pEvpPublicKey->type, &pEvpPublicKey, &puchPublicKey, RTASN1BITSTRING_GET_BYTE_SIZE(pPublicKey)))
+ {
+ /* Digest the data. */
+ EVP_VerifyUpdate(&EvpMdCtx, pvData, cbData);
+
+ /* Verify the signature. */
+ if (EVP_VerifyFinal(&EvpMdCtx,
+ RTASN1BITSTRING_GET_BIT0_PTR(pSignatureValue),
+ RTASN1BITSTRING_GET_BYTE_SIZE(pSignatureValue),
+ pEvpPublicKey) > 0)
+ rcOssl = VINF_SUCCESS;
+ else
+ rcOssl = RTErrInfoSet(pErrInfo, VERR_CR_PKIX_OSSL_VERIFY_FINAL_FAILED, "EVP_VerifyFinal failed");
+ }
+ else
+ rcOssl = RTErrInfoSet(pErrInfo, VERR_CR_PKIX_OSSL_D2I_PUBLIC_KEY_FAILED, "d2i_PublicKey failed");
+ }
+ else
+ rcOssl = RTErrInfoSetF(pErrInfo, VERR_CR_PKIX_OSSL_EVP_PKEY_TYPE_ERROR,
+ "EVP_PKEY_type(%d) failed", pEvpMdType->required_pkey_type[0]);
+ /* Cleanup and return.*/
+ EVP_PKEY_free(pEvpPublicKey);
+ }
+ EVP_MD_CTX_cleanup(&EvpMdCtx);
+
+ /*
+ * Check the result.
+ */
+ if (RT_SUCCESS(rcIprt) && RT_SUCCESS(rcOssl))
+ return VINF_SUCCESS;
+ if (RT_FAILURE_NP(rcIprt) && RT_FAILURE_NP(rcOssl))
+ return rcIprt;
+ AssertMsgFailed(("rcIprt=%Rrc rcOssl=%Rrc\n", rcIprt, rcOssl));
+ if (RT_FAILURE_NP(rcOssl))
+ return rcOssl;
+#endif /* IPRT_WITH_OPENSSL */
+
+ return rcIprt;
+}
+
diff --git a/src/VBox/Runtime/common/crypto/rsa-asn1-decoder.cpp b/src/VBox/Runtime/common/crypto/rsa-asn1-decoder.cpp
new file mode 100644
index 00000000000..7cd6a30b57c
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/rsa-asn1-decoder.cpp
@@ -0,0 +1,43 @@
+/* $Id$ */
+/** @file
+ * IPRT - Crypto - RSA, Decoder for ASN.1.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/crypto/rsa.h>
+
+#include <iprt/err.h>
+#include <iprt/string.h>
+
+#include "rsa-internal.h"
+
+/*
+ * Generate the code.
+ */
+#include <iprt/asn1-generator-asn1-decoder.h>
+
diff --git a/src/VBox/Runtime/common/crypto/rsa-core.cpp b/src/VBox/Runtime/common/crypto/rsa-core.cpp
new file mode 100644
index 00000000000..6a4eb0c6cd2
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/rsa-core.cpp
@@ -0,0 +1,44 @@
+/* $Id$ */
+/** @file
+ * IPRT - Crypto - RSA, Core APIs.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/crypto/rsa.h>
+
+#include <iprt/err.h>
+#include <iprt/mem.h>
+#include <iprt/string.h>
+
+#include "rsa-internal.h"
+
+/*
+ * Generate the code.
+ */
+#include <iprt/asn1-generator-core.h>
+
diff --git a/src/VBox/Runtime/common/crypto/rsa-init.cpp b/src/VBox/Runtime/common/crypto/rsa-init.cpp
new file mode 100644
index 00000000000..7c4d8022d7b
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/rsa-init.cpp
@@ -0,0 +1,43 @@
+/* $Id$ */
+/** @file
+ * IPRT - Crypto - RSA, Initialization API.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/crypto/rsa.h>
+
+#include <iprt/err.h>
+#include <iprt/string.h>
+
+#include "rsa-internal.h"
+
+/*
+ * Generate the code.
+ */
+#include <iprt/asn1-generator-init.h>
+
diff --git a/src/VBox/Runtime/common/crypto/rsa-internal.h b/src/VBox/Runtime/common/crypto/rsa-internal.h
new file mode 100644
index 00000000000..89481fb8e3c
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/rsa-internal.h
@@ -0,0 +1,39 @@
+/* $Id$ */
+/** @file
+ * IPRT - Crypto - RSA, Internal Header.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+#ifndef ___common_crypto_rsa_internal_h
+#define ___common_crypto_rsa_internal_h
+
+/** The max number of bits we support in the modulus. */
+#define RTCRRSA_MAX_MODULUS_BITS 16384
+
+#define RTASN1TMPL_TEMPLATE_FILE "../common/crypto/rsa-template.h"
+#include <iprt/asn1-generator-internal-header.h>
+
+#endif
+
+
diff --git a/src/VBox/Runtime/common/crypto/rsa-sanity.cpp b/src/VBox/Runtime/common/crypto/rsa-sanity.cpp
new file mode 100644
index 00000000000..86a9e4618db
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/rsa-sanity.cpp
@@ -0,0 +1,43 @@
+/* $Id$ */
+/** @file
+ * IPRT - Crypto - RSA, Sanity Checkers.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/crypto/rsa.h>
+
+#include <iprt/err.h>
+#include <iprt/string.h>
+
+#include "rsa-internal.h"
+
+/*
+ * Generate the code.
+ */
+#include <iprt/asn1-generator-sanity.h>
+
diff --git a/src/VBox/Runtime/common/crypto/rsa-template.h b/src/VBox/Runtime/common/crypto/rsa-template.h
new file mode 100644
index 00000000000..0ec0ed41484
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/rsa-template.h
@@ -0,0 +1,109 @@
+/* $Id$ */
+/** @file
+ * IPRT - Crypto - RSA, Code Generator Template.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+#define RTASN1TMPL_DECL RTDECL
+
+/*
+ * RSA public key.
+ */
+#define RTASN1TMPL_TYPE RTCRRSAPUBLICKEY
+#define RTASN1TMPL_EXT_NAME RTCrRsaPublicKey
+#define RTASN1TMPL_INT_NAME rtCrRsaPublicKey
+RTASN1TMPL_BEGIN_SEQCORE();
+RTASN1TMPL_MEMBER( Modulus, RTASN1INTEGER, RTAsn1Integer);
+RTASN1TMPL_MEMBER( PublicExponent, RTASN1INTEGER, RTAsn1Integer);
+RTASN1TMPL_END_SEQCORE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * One RSA other prime info.
+ */
+#define RTASN1TMPL_TYPE RTCRRSAOTHERPRIMEINFO
+#define RTASN1TMPL_EXT_NAME RTCrRsaOtherPrimeInfo
+#define RTASN1TMPL_INT_NAME rtCrRsaOtherPrimeInfo
+RTASN1TMPL_BEGIN_SEQCORE();
+RTASN1TMPL_MEMBER( Prime, RTASN1INTEGER, RTAsn1Integer);
+RTASN1TMPL_MEMBER( Exponent, RTASN1INTEGER, RTAsn1Integer);
+RTASN1TMPL_MEMBER( Coefficient, RTASN1INTEGER, RTAsn1Integer);
+RTASN1TMPL_END_SEQCORE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * Sequence of RSA other prime infos.
+ */
+#define RTASN1TMPL_TYPE RTCRRSAOTHERPRIMEINFOS
+#define RTASN1TMPL_EXT_NAME RTCrRsaOtherPrimeInfos
+#define RTASN1TMPL_INT_NAME rtCrRsaOtherPrimeInfos
+RTASN1TMPL_SEQ_OF(RTCRRSAOTHERPRIMEINFO, RTCrRsaOtherPrimeInfo);
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * RSA private key.
+ */
+#define RTASN1TMPL_TYPE RTCRRSAPRIVATEKEY
+#define RTASN1TMPL_EXT_NAME RTCrRsaPrivateKey
+#define RTASN1TMPL_INT_NAME rtCrRsaPrivateKey
+RTASN1TMPL_BEGIN_SEQCORE();
+RTASN1TMPL_MEMBER( Version, RTASN1INTEGER, RTAsn1Integer);
+RTASN1TMPL_MEMBER( Modulus, RTASN1INTEGER, RTAsn1Integer);
+RTASN1TMPL_MEMBER( PublicExponent, RTASN1INTEGER, RTAsn1Integer);
+RTASN1TMPL_MEMBER( PrivateExponent, RTASN1INTEGER, RTAsn1Integer);
+RTASN1TMPL_MEMBER( Prime1, RTASN1INTEGER, RTAsn1Integer);
+RTASN1TMPL_MEMBER( Prime2, RTASN1INTEGER, RTAsn1Integer);
+RTASN1TMPL_MEMBER( Exponent1, RTASN1INTEGER, RTAsn1Integer);
+RTASN1TMPL_MEMBER( Exponent2, RTASN1INTEGER, RTAsn1Integer);
+RTASN1TMPL_MEMBER( Coefficient, RTASN1INTEGER, RTAsn1Integer);
+RTASN1TMPL_MEMBER_OPT_ITAG_EX( OtherPrimeInfos, RTCRRSAOTHERPRIMEINFOS, RTCrRsaOtherPrimeInfos, ASN1_TAG_SEQUENCE, RTASN1TMPL_ITAG_F_UC, RT_NOTHING);
+RTASN1TMPL_END_SEQCORE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * RSA Digest Info.
+ */
+#define RTASN1TMPL_TYPE RTCRRSADIGESTINFO
+#define RTASN1TMPL_EXT_NAME RTCrRsaDigestInfo
+#define RTASN1TMPL_INT_NAME rtCrRsaDigestInfo
+RTASN1TMPL_BEGIN_SEQCORE();
+RTASN1TMPL_MEMBER( DigestAlgorithm, RTCRX509ALGORITHMIDENTIFIER, RTCrX509AlgorithmIdentifier);
+RTASN1TMPL_MEMBER( Digest, RTASN1OCTETSTRING, RTAsn1OctetString);
+RTASN1TMPL_END_SEQCORE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
diff --git a/src/VBox/Runtime/common/crypto/spc-asn1-decoder.cpp b/src/VBox/Runtime/common/crypto/spc-asn1-decoder.cpp
new file mode 100644
index 00000000000..39439d5cd01
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/spc-asn1-decoder.cpp
@@ -0,0 +1,75 @@
+/* $Id$ */
+/** @file
+ * IPRT - Crypto - Microsoft SPC / Authenticode, Decoder for ASN.1.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/crypto/spc.h>
+
+#include <iprt/err.h>
+#include <iprt/string.h>
+#include <iprt/uuid.h>
+
+#include "spc-internal.h"
+
+
+/*
+ * One SPC Serialized Object Attribute.
+ */
+
+/** Decode the content of the octet string value if known. */
+static int rtCrSpcSerializedObject_DecodeMore(PRTASN1CURSOR pCursor, uint32_t fFlags,
+ PRTCRSPCSERIALIZEDOBJECT pThis, const char *pszErrorTag)
+
+{
+ int rc;
+ RTASN1CURSOR SubCursor;
+ if (RTUuidCompareStr(pThis->Uuid.Asn1Core.uData.pUuid, RTCRSPCSERIALIZEDOBJECT_UUID_STR) == 0)
+ {
+ rc = RTAsn1MemAllocZ(&pThis->SerializedData.EncapsulatedAllocation, (void **)&pThis->u.pData, sizeof(*pThis->u.pData));
+ if (RT_SUCCESS(rc))
+ {
+ pThis->SerializedData.pEncapsulated = (PRTASN1CORE)pThis->u.pData;
+ pThis->enmType = RTCRSPCSERIALIZEDOBJECTTYPE_ATTRIBUTES;
+
+ RTAsn1CursorInitSubFromCore(pCursor, &pThis->SerializedData.Asn1Core, &SubCursor, "SerializedData");
+ rc = RTCrSpcSerializedObjectAttributes_DecodeAsn1(&SubCursor, 0, pThis->u.pData, "SD");
+ }
+ }
+ else
+ return VINF_SUCCESS;
+ if (RT_SUCCESS(rc))
+ rc = RTAsn1CursorCheckEnd(&SubCursor);
+ return rc;
+}
+
+/*
+ * Generate the code.
+ */
+#include <iprt/asn1-generator-asn1-decoder.h>
+
diff --git a/src/VBox/Runtime/common/crypto/spc-core.cpp b/src/VBox/Runtime/common/crypto/spc-core.cpp
new file mode 100644
index 00000000000..447422473b3
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/spc-core.cpp
@@ -0,0 +1,89 @@
+/* $Id$ */
+/** @file
+ * IPRT - Crypto - Microsoft SPC / Authenticode, Core APIs.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/crypto/spc.h>
+
+#include <iprt/err.h>
+#include <iprt/string.h>
+#include <iprt/uuid.h>
+
+#include "spc-internal.h"
+
+
+RTDECL(int) RTCrSpcSerializedPageHashesV2_UpdateDerivedData(PRTCRSPCSERIALIZEDPAGEHASHESV2 pThis)
+{
+ pThis->pData = (PCRTCRSPCPEIMAGEPAGEHASHESV2)pThis->RawData.Asn1Core.uData.pv;
+ return VINF_SUCCESS;
+}
+
+
+/*
+ * SPC Indirect Data Content.
+ */
+
+RTDECL(PCRTCRSPCSERIALIZEDOBJECTATTRIBUTE) RTCrSpcIndirectDataContent_GetPeImageHashesV2(PCRTCRSPCINDIRECTDATACONTENT pIndData)
+{
+ if (pIndData->Data.enmType == RTCRSPCAAOVTYPE_PE_IMAGE_DATA)
+ {
+ Assert(RTAsn1ObjId_CompareWithString(&pIndData->Data.Type, RTCRSPCPEIMAGEDATA_OID) == 0);
+
+ if ( pIndData->Data.uValue.pPeImage
+ && pIndData->Data.uValue.pPeImage->T0.File.enmChoice == RTCRSPCLINKCHOICE_MONIKER
+ && RTCrSpcSerializedObject_IsPresent(pIndData->Data.uValue.pPeImage->T0.File.u.pMoniker) )
+ {
+ if (pIndData->Data.uValue.pPeImage->T0.File.u.pMoniker->enmType == RTCRSPCSERIALIZEDOBJECTTYPE_ATTRIBUTES)
+ {
+ Assert(RTUuidCompareStr(pIndData->Data.uValue.pPeImage->T0.File.u.pMoniker->Uuid.Asn1Core.uData.pUuid,
+ RTCRSPCSERIALIZEDOBJECT_UUID_STR) == 0);
+ PCRTCRSPCSERIALIZEDOBJECTATTRIBUTES pData = pIndData->Data.uValue.pPeImage->T0.File.u.pMoniker->u.pData;
+ if (pData)
+ {
+ for (uint32_t i = 0; i < pData->cItems; i++)
+ {
+ if (pData->paItems[i].enmType == RTCRSPCSERIALIZEDOBJECTATTRIBUTETYPE_PAGE_HASHES_V2)
+ {
+ Assert(RTAsn1ObjId_CompareWithString(&pData->paItems[i].Type, RTCRSPC_PE_IMAGE_HASHES_V2_OID) == 0);
+ return &pData->paItems[i];
+ }
+ }
+ }
+ }
+ }
+ }
+ return NULL;
+}
+
+
+/*
+ * Generate the standard core code.
+ */
+#include <iprt/asn1-generator-core.h>
+
diff --git a/src/VBox/Runtime/common/crypto/spc-init.cpp b/src/VBox/Runtime/common/crypto/spc-init.cpp
new file mode 100644
index 00000000000..2e09cdba61c
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/spc-init.cpp
@@ -0,0 +1,46 @@
+/* $Id$ */
+/** @file
+ * IPRT - Crypto - Microsoft SPC / Authenticode, Initialization API.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/crypto/spc.h>
+
+#include <iprt/err.h>
+#include <iprt/string.h>
+#include <iprt/uuid.h>
+
+#include "spc-internal.h"
+
+
+/*
+ * Generate the standard core code.
+ */
+#include <iprt/asn1-generator-init.h>
+
+
diff --git a/src/VBox/Runtime/common/crypto/spc-internal.h b/src/VBox/Runtime/common/crypto/spc-internal.h
new file mode 100644
index 00000000000..d2767dc21d3
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/spc-internal.h
@@ -0,0 +1,35 @@
+/* $Id$ */
+/** @file
+ * IPRT - Crypto - Microsoft SPC / Authenticode, Internal Header.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+#ifndef ___common_crypto_spc_internal_h
+#define ___common_crypto_spc_internal_h
+
+#define RTASN1TMPL_TEMPLATE_FILE "../common/crypto/spc-template.h"
+#include <iprt/asn1-generator-internal-header.h>
+
+#endif
+
diff --git a/src/VBox/Runtime/common/crypto/spc-sanity.cpp b/src/VBox/Runtime/common/crypto/spc-sanity.cpp
new file mode 100644
index 00000000000..bcf393eb3c2
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/spc-sanity.cpp
@@ -0,0 +1,179 @@
+/* $Id$ */
+/** @file
+ * IPRT - Crypto - Microsoft SPC / Authenticode, Sanity Checkers.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/crypto/spc.h>
+
+#include <iprt/assert.h>
+#include <iprt/err.h>
+#include <iprt/uuid.h>
+
+#include "spc-internal.h"
+
+
+RTDECL(int) RTCrSpcIndirectDataContent_CheckSanityEx(PCRTCRSPCINDIRECTDATACONTENT pIndData,
+ PCRTCRPKCS7SIGNEDDATA pSignedData,
+ uint32_t fFlags,
+ PRTERRINFO pErrInfo)
+{
+ /*
+ * Match up the digest algorithms (page 8, v1.0).
+ */
+ if (pSignedData->SignerInfos.cItems != 1)
+ return RTErrInfoSetF(pErrInfo, VERR_CR_SPC_NOT_EXACTLY_ONE_SIGNER_INFOS,
+ "SpcIndirectDataContent expects SignedData to have exactly one SignerInfos entries, found: %u",
+ pSignedData->SignerInfos.cItems);
+ if (pSignedData->DigestAlgorithms.cItems != 1)
+ return RTErrInfoSetF(pErrInfo, VERR_CR_SPC_NOT_EXACTLY_ONE_DIGEST_ALGO,
+ "SpcIndirectDataContent expects SignedData to have exactly one DigestAlgorithms entries, found: %u",
+ pSignedData->DigestAlgorithms.cItems);
+
+ if (RTCrX509AlgorithmIdentifier_Compare(&pIndData->DigestInfo.DigestAlgorithm, /** @todo not entirely sure about this check... */
+ &pSignedData->SignerInfos.paItems[0].DigestAlgorithm) != 0)
+ return RTErrInfoSetF(pErrInfo, VERR_CR_SPC_SIGNED_IND_DATA_DIGEST_ALGO_MISMATCH,
+ "SpcIndirectDataContent DigestInfo and SignerInfos algorithms mismatch: %s vs %s",
+ pIndData->DigestInfo.DigestAlgorithm.Algorithm.szObjId,
+ pSignedData->SignerInfos.paItems[0].DigestAlgorithm.Algorithm.szObjId);
+
+ if (RTCrX509AlgorithmIdentifier_Compare(&pIndData->DigestInfo.DigestAlgorithm,
+ &pSignedData->DigestAlgorithms.paItems[0]) != 0)
+ return RTErrInfoSetF(pErrInfo, VERR_CR_SPC_IND_DATA_DIGEST_ALGO_NOT_IN_DIGEST_ALGOS,
+ "SpcIndirectDataContent DigestInfo and SignedData.DigestAlgorithms[0] mismatch: %s vs %s",
+ pIndData->DigestInfo.DigestAlgorithm.Algorithm.szObjId,
+ pSignedData->DigestAlgorithms.paItems[0].Algorithm.szObjId);
+
+ if (fFlags & RTCRSPCINDIRECTDATACONTENT_SANITY_F_ONLY_KNOWN_HASH)
+ {
+ if (RTCrX509AlgorithmIdentifier_QueryDigestType(&pIndData->DigestInfo.DigestAlgorithm) == RTDIGESTTYPE_INVALID)
+ return RTErrInfoSetF(pErrInfo, VERR_CR_SPC_UNKNOWN_DIGEST_ALGO,
+ "SpcIndirectDataContent DigestAlgortihm is not known: %s",
+ pIndData->DigestInfo.DigestAlgorithm.Algorithm.szObjId);
+ }
+
+ uint32_t cbDigest = RTCrX509AlgorithmIdentifier_QueryDigestSize(&pIndData->DigestInfo.DigestAlgorithm);
+ if ( pIndData->DigestInfo.Digest.Asn1Core.cb != cbDigest
+ && (cbDigest != UINT32_MAX || (fFlags & RTCRSPCINDIRECTDATACONTENT_SANITY_F_ONLY_KNOWN_HASH)))
+ return RTErrInfoSetF(pErrInfo, VERR_CR_SPC_IND_DATA_DIGEST_SIZE_MISMATCH,
+ "SpcIndirectDataContent Digest size mismatch with algorithm: %u, expected %u (%s)",
+ pIndData->DigestInfo.Digest.Asn1Core.cb, cbDigest,
+ pIndData->DigestInfo.DigestAlgorithm.Algorithm.szObjId);
+
+ /*
+ * Data.
+ */
+ if (fFlags & RTCRSPCINDIRECTDATACONTENT_SANITY_F_PE_IMAGE)
+ {
+ if ( pIndData->Data.enmType != RTCRSPCAAOVTYPE_PE_IMAGE_DATA
+ || RTAsn1ObjId_CompareWithString(&pIndData->Data.Type, RTCRSPCPEIMAGEDATA_OID) != 0)
+ return RTErrInfoSetF(pErrInfo, VERR_CR_SPC_EXPECTED_PE_IMAGE_DATA,
+ "SpcIndirectDataContent.Data.Type is %s, expected %s (SpcPeImageData) [enmType=%d]",
+ pIndData->Data.Type.szObjId, RTCRSPCPEIMAGEDATA_OID, pIndData->Data.enmType);
+ if ( pIndData->Data.uValue.pPeImage
+ || !RTCrSpcPeImageData_IsPresent(pIndData->Data.uValue.pPeImage) )
+ return RTErrInfoSet(pErrInfo, VERR_CR_SPC_PEIMAGE_DATA_NOT_PRESENT,
+ "SpcIndirectDataContent.Data.uValue/PEImage is missing");
+
+ if ( pIndData->Data.uValue.pPeImage->T0.File.enmChoice == RTCRSPCLINKCHOICE_MONIKER
+ && RTCrSpcSerializedObject_IsPresent(pIndData->Data.uValue.pPeImage->T0.File.u.pMoniker) )
+ {
+ PCRTCRSPCSERIALIZEDOBJECT pObj = pIndData->Data.uValue.pPeImage->T0.File.u.pMoniker;
+
+ if (pObj->Uuid.Asn1Core.cb != sizeof(RTUUID))
+ return RTErrInfoSetF(pErrInfo, VERR_CR_SPC_BAD_MONIKER_UUID,
+ "SpcIndirectDataContent...MonikerT1.Uuid incorrect size: %u, expected %u.",
+ pObj->Uuid.Asn1Core.cb, sizeof(RTUUID));
+ if (RTUuidCompareStr(pObj->Uuid.Asn1Core.uData.pUuid, RTCRSPCSERIALIZEDOBJECT_UUID_STR) != 0)
+ return RTErrInfoSetF(pErrInfo, VERR_CR_SPC_UNKNOWN_MONIKER_UUID,
+ "SpcIndirectDataContent...MonikerT1.Uuid mismatch: %RTuuid, expected %s.",
+ pObj->Uuid.Asn1Core.uData.pUuid, RTCRSPCSERIALIZEDOBJECT_UUID_STR);
+
+ if (pObj->enmType != RTCRSPCSERIALIZEDOBJECTTYPE_ATTRIBUTES)
+ return RTErrInfoSetF(pErrInfo, VERR_CR_SPC_BAD_MONIKER_CHOICE,
+ "SpcIndirectDataContent...pMoniker->enmType=%d, expected %d.",
+ pObj->enmType, RTCRSPCSERIALIZEDOBJECTTYPE_ATTRIBUTES);
+ if (!pObj->u.pData)
+ return RTErrInfoSet(pErrInfo, VERR_CR_SPC_MONIKER_BAD_DATA,
+ "SpcIndirectDataContent...pMoniker->pData is NULL.");
+
+ uint32_t cPageHashV1 = 0;
+ uint32_t cPageHashV2 = 0;
+ for (uint32_t i = 0; i < pObj->u.pData->cItems; i++)
+ {
+ PCRTCRSPCSERIALIZEDOBJECTATTRIBUTE pAttr = &pObj->u.pData->paItems[i];
+ if (RTAsn1ObjId_CompareWithString(&pAttr->Type, RTCRSPC_PE_IMAGE_HASHES_V2_OID) == 0)
+ {
+ if (cPageHashV2 > 0)
+ return RTErrInfoSetF(pErrInfo, VERR_CR_SPC_PEIMAGE_MULTIPLE_V2_HASH_TABS,
+ "SpcIndirectDataContent...MonikerT1 multiple page hash v2 attributes (%u).", i);
+ cPageHashV2++;
+ AssertPtr(pAttr->u.pPageHashesV2->pData);
+ }
+ else if (RTAsn1ObjId_CompareWithString(&pAttr->Type, RTCRSPC_PE_IMAGE_HASHES_V1_OID) == 0)
+ {
+#if 1
+ return RTErrInfoSetF(pErrInfo, VERR_CR_SPC_PEIMAGE_V1_HASH_TABS_NOT_IMPL,
+ "SpcIndirectDataContent...MonikerT1 implement page hash v1 attributes (%u).", i);
+#else
+ if (cPageHashV1 > 0)
+ return RTErrInfoSetF(pErrInfo, VERR_CR_SPC_PEIMAGE_MULTIPLE_V1_HASH_TABS,
+ "SpcIndirectDataContent...MonikerT1 multiple page hash v1 attributes (%u).", i);
+ cPageHashV1++;
+#endif
+ }
+ else
+ return RTErrInfoSetF(pErrInfo, VERR_CR_SPC_PEIMAGE_UNKNOWN_ATTRIBUTE,
+ "SpcIndirectDataContent...MonikerT1 unknown attribute %u: %s.",
+ i, pAttr->Type.szObjId);
+ }
+ }
+ else if ( pIndData->Data.uValue.pPeImage->T0.File.enmChoice == RTCRSPCLINKCHOICE_FILE
+ && RTCrSpcString_IsPresent(&pIndData->Data.uValue.pPeImage->T0.File.u.pT2->File) )
+ {
+ /* Could check for "<<<Obsolete>>>" here, but it's really irrelevant. */
+ }
+ else if ( pIndData->Data.uValue.pPeImage->T0.File.enmChoice == RTCRSPCLINKCHOICE_URL
+ && RTAsn1String_IsPresent(pIndData->Data.uValue.pPeImage->T0.File.u.pUrl) )
+ return RTErrInfoSet(pErrInfo, VERR_CR_SPC_PEIMAGE_URL_UNEXPECTED,
+ "SpcIndirectDataContent.Data.uValue.pPeImage->File is an URL, expected object Moniker or File.");
+ else
+ return RTErrInfoSet(pErrInfo, VERR_CR_SPC_PEIMAGE_NO_CONTENT,
+ "SpcIndirectDataContent.Data.uValue.pPeImage->File has no content");
+ }
+
+ return VINF_SUCCESS;
+}
+
+
+/*
+ * Generate the standard core code.
+ */
+#include <iprt/asn1-generator-sanity.h>
+
+
diff --git a/src/VBox/Runtime/common/crypto/spc-template.h b/src/VBox/Runtime/common/crypto/spc-template.h
new file mode 100644
index 00000000000..6280d21b4f8
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/spc-template.h
@@ -0,0 +1,184 @@
+/* $Id$ */
+/** @file
+ * IPRT - Crypto - Microsoft SPC / Authenticode, Code Generator Template.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+#define RTASN1TMPL_DECL RTDECL
+
+
+/*
+ * One SPC Serialized Page Hashes V2 Object.
+ */
+#define RTASN1TMPL_TYPE RTCRSPCSERIALIZEDPAGEHASHESV2
+#define RTASN1TMPL_EXT_NAME RTCrSpcSerializedPageHashesV2
+#define RTASN1TMPL_INT_NAME rtCrSpcSerializedPageHashesV2
+RTASN1TMPL_BEGIN_SETCORE();
+RTASN1TMPL_MEMBER( RawData, RTASN1OCTETSTRING, RTAsn1OctetString);
+RTASN1TMPL_EXEC_DECODE( rc = RTCrSpcSerializedPageHashesV2_UpdateDerivedData(pThis) ) /* no ; */
+RTASN1TMPL_EXEC_CLONE( rc = RTCrSpcSerializedPageHashesV2_UpdateDerivedData(pThis) ) /* no ; */
+RTASN1TMPL_END_SETCORE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * One SPC Serialized Object Attribute.
+ */
+#define RTASN1TMPL_TYPE RTCRSPCSERIALIZEDOBJECTATTRIBUTE
+#define RTASN1TMPL_EXT_NAME RTCrSpcSerializedObjectAttribute
+#define RTASN1TMPL_INT_NAME rtCrSpcSerializedObjectAttribute
+RTASN1TMPL_BEGIN_SEQCORE();
+RTASN1TMPL_MEMBER( Type, RTASN1OBJID, RTAsn1ObjId);
+RTASN1TMPL_MEMBER_DYN_BEGIN( RTCRSPCSERIALIZEDOBJECTATTRIBUTETYPE, enmType, Allocation);
+RTASN1TMPL_MEMBER_DYN( u, pPageHashesV2, RTCRSPCSERIALIZEDPAGEHASHESV2, RTCrSpcSerializedPageHashesV2, Allocation, enmType,
+ RTCRSPCSERIALIZEDOBJECTATTRIBUTETYPE_PAGE_HASHES_V2, RTAsn1ObjId_CompareWithString(&pThis->Type, RTCRSPC_PE_IMAGE_HASHES_V2_OID) == 0);
+RTASN1TMPL_MEMBER_DYN_DEFAULT( u, pCore, RTASN1CORE, RTAsn1Core, Allocation, enmType, RTCRSPCSERIALIZEDOBJECTATTRIBUTETYPE_UNKNOWN);
+RTASN1TMPL_MEMBER_DYN_END( RTCRSPCSERIALIZEDOBJECTATTRIBUTETYPE, enmType, Allocation);
+RTASN1TMPL_END_SEQCORE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+/*
+ * Set of SPC Serialized Object Attributes.
+ */
+#define RTASN1TMPL_TYPE RTCRSPCSERIALIZEDOBJECTATTRIBUTES
+#define RTASN1TMPL_EXT_NAME RTCrSpcSerializedObjectAttributes
+#define RTASN1TMPL_INT_NAME rtCrSpcSerializedObjectAttributes
+RTASN1TMPL_SET_OF(RTCRSPCSERIALIZEDOBJECTATTRIBUTE, RTCrSpcSerializedObjectAttribute);
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * One SPC Serialized Object.
+ */
+#define RTASN1TMPL_TYPE RTCRSPCSERIALIZEDOBJECT
+#define RTASN1TMPL_EXT_NAME RTCrSpcSerializedObject
+#define RTASN1TMPL_INT_NAME rtCrSpcSerializedObject
+RTASN1TMPL_BEGIN_SEQCORE();
+RTASN1TMPL_MEMBER_EX( Uuid, RTASN1OCTETSTRING, RTAsn1OctetString,
+ RTASN1TMPL_MEMBER_CONSTR_MIN_MAX(Uuid, RTASN1OCTETSTRING, RTAsn1OctetString, 16, 16, RT_NOTHING));
+RTASN1TMPL_MEMBER( SerializedData, RTASN1OCTETSTRING, RTAsn1OctetString);
+RTASN1TMPL_EXEC_DECODE( rc = rtCrSpcSerializedObject_DecodeMore(pCursor, fFlags, pThis, pszErrorTag) ) /* no ; */
+RTASN1TMPL_END_SEQCORE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * Choosy SPC strings.
+ */
+#define RTASN1TMPL_TYPE RTCRSPCSTRING
+#define RTASN1TMPL_EXT_NAME RTCrSpcString
+#define RTASN1TMPL_INT_NAME rtCrSpcString
+RTASN1TMPL_BEGIN_PCHOICE();
+RTASN1TMPL_PCHOICE_ITAG_CP( 0, RTCRSPCSTRINGCHOICE_UCS2, u.pUcs2, Ucs2, RTASN1STRING, RTAsn1BmpString);
+RTASN1TMPL_PCHOICE_ITAG_CP( 1, RTCRSPCSTRINGCHOICE_ASCII, u.pAscii, Ascii, RTASN1STRING, RTAsn1Ia5String);
+RTASN1TMPL_END_PCHOICE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * SPC Link.
+ */
+#define RTASN1TMPL_TYPE RTCRSPCLINK
+#define RTASN1TMPL_EXT_NAME RTCrSpcLink
+#define RTASN1TMPL_INT_NAME rtCrSpcLink
+RTASN1TMPL_BEGIN_PCHOICE();
+RTASN1TMPL_PCHOICE_ITAG_CP( 0, RTCRSPCLINKCHOICE_URL, u.pUrl, Url, RTASN1STRING, RTAsn1Ia5String);
+RTASN1TMPL_PCHOICE_ITAG( 1, RTCRSPCLINKCHOICE_MONIKER, u.pMoniker, Moniker, RTCRSPCSERIALIZEDOBJECT, RTCrSpcSerializedObject);
+RTASN1TMPL_PCHOICE_XTAG( 2, RTCRSPCLINKCHOICE_FILE, u.pT2, CtxTag2, File, RTCRSPCSTRING, RTCrSpcString);
+RTASN1TMPL_END_PCHOICE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * SPC PE Image Data.
+ *
+ * Note! This is not correctly declared in available specifications. The file
+ * member is tagged. Seeing the the '--#public--' comment in the specs,
+ * one can't only guess that there are other alternatives in that part
+ * of the structure that microsoft does not wish to document.
+ */
+#define RTASN1TMPL_TYPE RTCRSPCPEIMAGEDATA
+#define RTASN1TMPL_EXT_NAME RTCrSpcPeImageData
+#define RTASN1TMPL_INT_NAME rtCrSpcPeImageData
+RTASN1TMPL_BEGIN_SEQCORE();
+/** @todo The flags defaults to includeResources. Could be expressed here rather
+ * than left to the user to deal with. */
+RTASN1TMPL_MEMBER_OPT_ITAG_EX( Flags, RTASN1BITSTRING, RTAsn1BitString, ASN1_TAG_BIT_STRING, RTASN1TMPL_ITAG_F_UP,
+ RTASN1TMPL_MEMBER_CONSTR_BITSTRING_MIN_MAX(Flags, 0, 3, RT_NOTHING));
+RTASN1TMPL_MEMBER_OPT_XTAG_EX( T0, CtxTag0, File, RTCRSPCLINK, RTCrSpcLink, 0, \
+ RTASN1TMPL_MEMBER_CONSTR_PRESENT(T0.File, RTCrSpcLink, RT_NOTHING));
+RTASN1TMPL_END_SEQCORE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * SPC Attribute Type And Optional Value.
+ *
+ * Note! The value doesn't look very optional in available examples and specs.
+ * The available specs also claim there is an explicit 0 tag around the
+ * data, which isn't there is in signed executables. Gotta love Microsoft...
+ */
+#define RTASN1TMPL_TYPE RTCRSPCATTRIBUTETYPEANDOPTIONALVALUE
+#define RTASN1TMPL_EXT_NAME RTCrSpcAttributeTypeAndOptionalValue
+#define RTASN1TMPL_INT_NAME rtCrSpcAttributeTypeAndOptionalValue
+RTASN1TMPL_BEGIN_SEQCORE();
+RTASN1TMPL_MEMBER( Type, RTASN1OBJID, RTAsn1ObjId);
+RTASN1TMPL_MEMBER_DYN_BEGIN( RTCRSPCAAOVTYPE, enmType, Allocation);
+RTASN1TMPL_MEMBER_DYN( uValue, pPeImage, RTCRSPCPEIMAGEDATA, RTCrSpcPeImageData, Allocation, enmType,
+ RTCRSPCAAOVTYPE_PE_IMAGE_DATA, RTAsn1ObjId_CompareWithString(&pThis->Type, RTCRSPCPEIMAGEDATA_OID) == 0);
+RTASN1TMPL_MEMBER_DYN_DEFAULT( uValue, pCore, RTASN1CORE, RTAsn1Core, Allocation, enmType, RTCRSPCAAOVTYPE_UNKNOWN);
+RTASN1TMPL_MEMBER_DYN_END( RTCRSPCAAOVTYPE, enmType, Allocation);
+RTASN1TMPL_END_SEQCORE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * SPC Indirect Data Content.
+ */
+#define RTASN1TMPL_TYPE RTCRSPCINDIRECTDATACONTENT
+#define RTASN1TMPL_EXT_NAME RTCrSpcIndirectDataContent
+#define RTASN1TMPL_INT_NAME rtCrSpcIndirectDataContent
+RTASN1TMPL_BEGIN_SEQCORE();
+RTASN1TMPL_MEMBER( Data, RTCRSPCATTRIBUTETYPEANDOPTIONALVALUE, RTCrSpcAttributeTypeAndOptionalValue);
+RTASN1TMPL_MEMBER( DigestInfo, RTCRPKCS7DIGESTINFO, RTCrPkcs7DigestInfo);
+RTASN1TMPL_END_SEQCORE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
diff --git a/src/VBox/Runtime/common/crypto/store-inmem.cpp b/src/VBox/Runtime/common/crypto/store-inmem.cpp
new file mode 100644
index 00000000000..34882749794
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/store-inmem.cpp
@@ -0,0 +1,359 @@
+/* $Id$ */
+/** @file
+ * IPRT - In Memory Cryptographic Certificate Store.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/crypto/store.h>
+
+#include <iprt/err.h>
+#include <iprt/mem.h>
+#include <iprt/string.h>
+
+#include "store-internal.h"
+
+
+/*******************************************************************************
+* Structures and Typedefs *
+*******************************************************************************/
+/**
+ * A certificate entry in the in-memory store.
+ */
+typedef struct RTCRSTOREINMEMCERT
+{
+ /** The core certificate context. */
+ RTCRCERTCTXINT Core;
+ /** Internal copy of the flag (paranoia). */
+ uint32_t fFlags;
+ /** Decoded data. */
+ union
+ {
+ /** ASN.1 core structure for generic access. */
+ RTASN1CORE Asn1Core;
+ /** The decoded X.509 certificate (RTCRCERTCTX_F_ENC_X509_DER). */
+ RTCRX509CERTIFICATE X509Cert;
+ /** The decoded trust anchor info (RTCRCERTCTX_F_ENC_TAF_DER). */
+ RTCRTAFTRUSTANCHORINFO TaInfo;
+ } u;
+ /** Pointer to the store if still in it (no reference). */
+ struct RTCRSTOREINMEM *pStore;
+ /** The DER encoding of the certificate. */
+ uint8_t abEncoded[1];
+} RTCRSTOREINMEMCERT;
+AssertCompileMembersAtSameOffset(RTCRSTOREINMEMCERT, u.X509Cert.SeqCore.Asn1Core, RTCRSTOREINMEMCERT, u.Asn1Core);
+AssertCompileMembersAtSameOffset(RTCRSTOREINMEMCERT, u.TaInfo.SeqCore.Asn1Core, RTCRSTOREINMEMCERT, u.Asn1Core);
+/** Pointer to an in-memory store certificate entry. */
+typedef RTCRSTOREINMEMCERT *PRTCRSTOREINMEMCERT;
+
+
+/**
+ * The per instance data of a in-memory crypto store.
+ *
+ * Currently we ASSUME we don't need serialization. Add that when needed!
+ */
+typedef struct RTCRSTOREINMEM
+{
+ /** The number of certificates. */
+ uint32_t cCerts;
+ /** The max number of certificates papCerts can store before growing it. */
+ uint32_t cCertsAlloc;
+ /** Array of certificates. */
+ PRTCRSTOREINMEMCERT *papCerts;
+} RTCRSTOREINMEM;
+/** Pointer to an in-memory crypto store. */
+typedef RTCRSTOREINMEM *PRTCRSTOREINMEM;
+
+
+
+
+static DECLCALLBACK(void) rtCrStoreInMemCertEntry_Dtor(PRTCRCERTCTXINT pCertCtx)
+{
+ PRTCRSTOREINMEMCERT pEntry = (PRTCRSTOREINMEMCERT)pCertCtx;
+ AssertRelease(!pEntry->pStore);
+
+ pEntry->Core.pfnDtor = NULL;
+ RTAsn1VtDelete(&pEntry->u.Asn1Core);
+ RTMemFree(pEntry);
+}
+
+
+/**
+ * Internal method for allocating and initalizing a certificate entry in the
+ * in-memory store.
+ *
+ * @returns IPRT status code.
+ * @param pThis The in-memory store instance.
+ * @param fEnc RTCRCERTCTX_F_ENC_X509_DER or RTCRCERTCTX_F_ENC_TAF_DER.
+ * @param pbSrc The DER encoded X.509 certificate to add.
+ * @param cbSrc The size of the encoded certificate.
+ * @param pErrInfo Where to return extended error info. Optional.
+ * @param ppEntry Where to return the pointer to the new entry.
+ */
+static int rtCrStoreInMemCreateCertEntry(PRTCRSTOREINMEM pThis, uint32_t fEnc, uint8_t const *pbSrc, uint32_t cbSrc,
+ PRTERRINFO pErrInfo, PRTCRSTOREINMEMCERT *ppEntry)
+{
+ int rc;
+ PRTCRSTOREINMEMCERT pEntry = (PRTCRSTOREINMEMCERT)RTMemAllocZ(RT_UOFFSETOF(RTCRSTOREINMEMCERT, abEncoded[cbSrc]));
+ if (pEntry)
+ {
+ memcpy(pEntry->abEncoded, pbSrc, cbSrc);
+ pEntry->Core.u32Magic = RTCRCERTCTXINT_MAGIC;
+ pEntry->Core.cRefs = 1;
+ pEntry->Core.pfnDtor = rtCrStoreInMemCertEntry_Dtor;
+ pEntry->Core.Public.fFlags = fEnc;
+ pEntry->Core.Public.cbEncoded = cbSrc;
+ pEntry->Core.Public.pabEncoded = &pEntry->abEncoded[0];
+ if (fEnc == RTCRCERTCTX_F_ENC_X509_DER)
+ {
+ pEntry->Core.Public.pCert = &pEntry->u.X509Cert;
+ pEntry->Core.Public.pTaInfo = NULL;
+ }
+ else
+ {
+ pEntry->Core.Public.pCert = NULL;
+ pEntry->Core.Public.pTaInfo = &pEntry->u.TaInfo;
+ }
+ pEntry->pStore = pThis;
+
+ RTASN1CURSORPRIMARY Cursor;
+ RTAsn1CursorInitPrimary(&Cursor, &pEntry->abEncoded[0], cbSrc, pErrInfo, &g_RTAsn1DefaultAllocator,
+ RTASN1CURSOR_FLAGS_DER, "InMem");
+ if (fEnc == RTCRCERTCTX_F_ENC_X509_DER)
+ rc = RTCrX509Certificate_DecodeAsn1(&Cursor.Cursor, 0, &pEntry->u.X509Cert, "Cert");
+ else
+ rc = RTCrTafTrustAnchorInfo_DecodeAsn1(&Cursor.Cursor, 0, &pEntry->u.TaInfo, "TaInfo");
+ if (RT_SUCCESS(rc))
+ {
+ if (fEnc == RTCRCERTCTX_F_ENC_X509_DER)
+ rc = RTCrX509Certificate_CheckSanity(&pEntry->u.X509Cert, 0, pErrInfo, "Cert");
+ else
+ rc = RTCrTafTrustAnchorInfo_CheckSanity(&pEntry->u.TaInfo, 0, pErrInfo, "TaInfo");
+ if (RT_SUCCESS(rc))
+ {
+ *ppEntry = pEntry;
+ return VINF_SUCCESS;
+ }
+
+ RTAsn1VtDelete(&pEntry->u.Asn1Core);
+ }
+ RTMemFree(pEntry);
+ }
+ else
+ rc = VERR_NO_MEMORY;
+ return rc;
+}
+
+
+/**
+ * Grows the certificate pointer array to at least @a cMin entries.
+ *
+ * @returns IPRT status code.
+ * @param pThis The in-memory store instance.
+ * @param cMin The new minimum store size.
+ */
+static int rtCrStoreInMemGrow(PRTCRSTOREINMEM pThis, uint32_t cMin)
+{
+ AssertReturn(cMin <= _1M, VERR_OUT_OF_RANGE);
+ AssertReturn(cMin > pThis->cCertsAlloc, VERR_INTERNAL_ERROR_3);
+
+ if (cMin < 64)
+ cMin = RT_ALIGN_32(cMin, 8);
+ else
+ cMin = RT_ALIGN_32(cMin, 32);
+
+ void *pv = RTMemRealloc(pThis->papCerts, cMin * sizeof(pThis->papCerts[0]));
+ if (pv)
+ {
+ pThis->papCerts = (PRTCRSTOREINMEMCERT *)pv;
+ for (uint32_t i = pThis->cCertsAlloc; i < cMin; i++)
+ pThis->papCerts[i] = NULL;
+ pThis->cCertsAlloc = cMin;
+ return VINF_SUCCESS;
+ }
+ return VERR_NO_MEMORY;
+}
+
+
+
+/** @interface_method_impl{RTCRSTOREPROVIDER, pfnDestroyStore} */
+static DECLCALLBACK(void) rtCrStoreInMem_DestroyStore(void *pvProvider)
+{
+ PRTCRSTOREINMEM pThis = (PRTCRSTOREINMEM)pvProvider;
+
+ while (pThis->cCerts > 0)
+ {
+ uint32_t i = --pThis->cCerts;
+ PRTCRSTOREINMEMCERT pEntry = pThis->papCerts[i];
+ pThis->papCerts[i] = NULL;
+ AssertPtr(pEntry);
+
+ pEntry->pStore = NULL;
+ RTCrCertCtxRelease(&pEntry->Core.Public);
+ }
+
+ RTMemFree(pThis->papCerts);
+ pThis->papCerts = NULL;
+ RTMemFree(pThis);
+}
+
+
+/** @interface_method_impl{RTCRSTOREPROVIDER, pfnCertCtxQueryPrivateKey} */
+static DECLCALLBACK(int) rtCrStoreInMem_CertCtxQueryPrivateKey(void *pvProvider, PRTCRCERTCTXINT pCertCtx,
+ uint8_t *pbKey, size_t cbKey, size_t *pcbKeyRet)
+{
+ //PRTCRSTOREINMEM pThis = (PRTCRSTOREINMEM)pvProvider;
+ return VERR_NOT_FOUND;
+}
+
+
+/** @interface_method_impl{RTCRSTOREPROVIDER, pfnCertFindAll} */
+static DECLCALLBACK(int) rtCrStoreInMem_CertFindAll(void *pvProvider, PRTCRSTORECERTSEARCH pSearch)
+{
+ PRTCRSTOREINMEM pThis = (PRTCRSTOREINMEM)pvProvider;
+ pSearch->auOpaque[0] = ~(uintptr_t)pvProvider;
+ pSearch->auOpaque[1] = 0;
+ pSearch->auOpaque[2] = ~(uintptr_t)0; /* For the front-end API. */
+ pSearch->auOpaque[3] = ~(uintptr_t)0; /* For the front-end API. */
+ return VINF_SUCCESS;
+}
+
+
+/** @interface_method_impl{RTCRSTOREPROVIDER, pfnCertSearchNext} */
+static DECLCALLBACK(PCRTCRCERTCTX) rtCrStoreInMem_CertSearchNext(void *pvProvider, PRTCRSTORECERTSEARCH pSearch)
+{
+ PRTCRSTOREINMEM pThis = (PRTCRSTOREINMEM)pvProvider;
+ AssertReturn(pSearch->auOpaque[0] == ~(uintptr_t)pvProvider, NULL);
+
+ uintptr_t i = pSearch->auOpaque[1];
+ if (i < pThis->cCerts)
+ {
+ pSearch->auOpaque[1] = i + 1;
+ pThis->papCerts[i]->Core.cRefs++;
+ return &pThis->papCerts[i]->Core.Public;
+ }
+ return NULL;
+}
+
+
+/** @interface_method_impl{RTCRSTOREPROVIDER, pfnCertSearchDestroy} */
+static DECLCALLBACK(void) rtCrStoreInMem_CertSearchDestroy(void *pvProvider, PRTCRSTORECERTSEARCH pSearch)
+{
+ NOREF(pvProvider);
+ AssertReturnVoid(pSearch->auOpaque[0] == ~(uintptr_t)pvProvider);
+ pSearch->auOpaque[0] = 0;
+ pSearch->auOpaque[1] = 0;
+ pSearch->auOpaque[2] = 0;
+ pSearch->auOpaque[3] = 0;
+}
+
+
+/** @interface_method_impl{RTCRSTOREPROVIDER, pfnCertSearchDestroy} */
+static DECLCALLBACK(int) rtCrStoreInMem_CertAddEncoded(void *pvProvider, uint32_t fFlags,
+ uint8_t const *pbEncoded, uint32_t cbEncoded, PRTERRINFO pErrInfo)
+{
+ PRTCRSTOREINMEM pThis = (PRTCRSTOREINMEM)pvProvider;
+ int rc;
+
+ AssertMsgReturn( fFlags == RTCRCERTCTX_F_ENC_X509_DER
+ || fFlags == RTCRCERTCTX_F_ENC_TAF_DER
+ , ("Only X.509 and TAF DER are supported: %#x\n", fFlags), VERR_INVALID_FLAGS);
+
+ if (pThis->cCerts + 1 > pThis->cCertsAlloc)
+ {
+ rc = rtCrStoreInMemGrow(pThis, pThis->cCerts + 1);
+ if (RT_FAILURE(rc))
+ return rc;
+ }
+
+ rc = rtCrStoreInMemCreateCertEntry(pThis, fFlags, pbEncoded, cbEncoded, pErrInfo, &pThis->papCerts[pThis->cCerts]);
+ if (RT_SUCCESS(rc))
+ {
+ pThis->cCerts++;
+ return VINF_SUCCESS;
+ }
+ return rc;
+}
+
+
+/**
+ * In-memory store provider.
+ */
+static RTCRSTOREPROVIDER const g_rtCrStoreInMemProvider =
+{
+ "in-memory",
+ rtCrStoreInMem_DestroyStore,
+ rtCrStoreInMem_CertCtxQueryPrivateKey,
+ rtCrStoreInMem_CertFindAll,
+ rtCrStoreInMem_CertSearchNext,
+ rtCrStoreInMem_CertSearchDestroy,
+ rtCrStoreInMem_CertAddEncoded,
+ NULL,
+ 42
+};
+
+
+/**
+ * Common worker for RTCrStoreCreateInMem and future constructors...
+ *
+ * @returns IPRT status code.
+ * @param ppStore Where to return the store instance.
+ */
+static int rtCrStoreInMemCreateInternal(PRTCRSTOREINMEM *ppStore)
+{
+ PRTCRSTOREINMEM pStore = (PRTCRSTOREINMEM)RTMemAlloc(sizeof(*pStore));
+ if (pStore)
+ {
+ pStore->cCerts = 0;
+ pStore->cCertsAlloc = 0;
+ pStore->papCerts = NULL;
+ *ppStore = pStore;
+ return VINF_SUCCESS;
+ }
+ return VERR_NO_MEMORY;
+}
+
+
+RTDECL(int) RTCrStoreCreateInMem(PRTCRSTORE phStore, uint32_t cSizeHint)
+{
+ PRTCRSTOREINMEM pStore;
+ int rc = rtCrStoreInMemCreateInternal(&pStore);
+ if (RT_SUCCESS(rc))
+ {
+ if (cSizeHint)
+ rc = rtCrStoreInMemGrow(pStore, RT_MIN(cSizeHint, 512));
+ if (RT_SUCCESS(rc))
+ {
+ rc = rtCrStoreCreate(&g_rtCrStoreInMemProvider, pStore, phStore);
+ if (RT_SUCCESS(rc))
+ return VINF_SUCCESS;
+ }
+ RTMemFree(pStore);
+ }
+ return rc;
+}
+
diff --git a/src/VBox/Runtime/common/crypto/store-internal.h b/src/VBox/Runtime/common/crypto/store-internal.h
new file mode 100644
index 00000000000..dc0549439af
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/store-internal.h
@@ -0,0 +1,161 @@
+/* $Id$ */
+/** @file
+ * IPRT - Cryptographic Store, Internal Header.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+#ifndef ___common_crypto_store_internal_h
+#define ___common_crypto_store_internal_h
+
+
+/**
+ * Internal certificate context.
+ *
+ * In addition to the externally visible structure (RTCRCERTCTX) this has the
+ * reference counter and store reference. (This structure may again be part of
+ * a larger structure internal to the store, depending on the source store.)
+ */
+typedef struct RTCRCERTCTXINT
+{
+ /** Magic number (RTCRCERTCTXINT_MAGIC). */
+ uint32_t u32Magic;
+ /** Reference counter. */
+ uint32_t volatile cRefs;
+ /**
+ * Destructor that gets called with cRefs reaches zero.
+ * @param pCertCtx The internal certificate context.
+ */
+ DECLCALLBACKMEMBER(void, pfnDtor)(struct RTCRCERTCTXINT *pCertCtx);
+ /** The public store context. */
+ RTCRCERTCTX Public;
+} RTCRCERTCTXINT;
+/** Pointer to an internal certificate context. */
+typedef RTCRCERTCTXINT *PRTCRCERTCTXINT;
+
+/** Magic value for RTCRCERTCTXINT::u32Magic (Alan Mathison Turing). */
+#define RTCRCERTCTXINT_MAGIC UINT32_C(0x19120623)
+/** Dead magic value for RTCRCERTCTXINT::u32Magic. */
+#define RTCRCERTCTXINT_MAGIC_DEAD UINT32_C(0x19540607)
+
+
+/**
+ * IPRT Cryptographic Store Provider.
+ *
+ * @remarks This is a very incomplete sketch.
+ */
+typedef struct RTCRSTOREPROVIDER
+{
+ /** The provider name. */
+ const char *pszName;
+
+ /**
+ * Called to destroy an open store.
+ *
+ * @param pvProvider The provider specific data.
+ */
+ DECLCALLBACKMEMBER(void, pfnDestroyStore)(void *pvProvider);
+
+ /**
+ * Queries the private key.
+ *
+ * @returns IPRT status code.
+ * @retval VERR_NOT_FOUND if not private key.
+ * @retval VERR_ACCESS_DENIED if the private key isn't allowed to leave the
+ * store. One would then have to use the pfnCertCtxSign method.
+ *
+ * @param pvProvider The provider specific data.
+ * @param pCertCtx The internal certificate context.
+ * @param pbKey Where to return the key bytes.
+ * @param cbKey The size of the buffer @a pbKey points to.
+ * @param pcbKeyRet Where to return the size of the returned key.
+ */
+ DECLCALLBACKMEMBER(int, pfnCertCtxQueryPrivateKey)(void *pvProvider, PRTCRCERTCTXINT pCertCtx,
+ uint8_t *pbKey, size_t cbKey, size_t *pcbKeyRet);
+
+ /**
+ * Open an enumeration of all certificates.
+ *
+ * @returns IPRT status code
+ * @param pvProvider The provider specific data.
+ * @param pSearch Pointer to opaque search state structure. The
+ * provider should initalize this on success.
+ */
+ DECLCALLBACKMEMBER(int, pfnCertFindAll)(void *pvProvider, PRTCRSTORECERTSEARCH pSearch);
+
+ /**
+ * Get the next certificate.
+ *
+ * @returns Reference to the next certificate context (must be released by
+ * caller). NULL if no more certificates in the search result.
+ * @param pvProvider The provider specific data.
+ * @param pSearch Pointer to opaque search state structure.
+ */
+ DECLCALLBACKMEMBER(PCRTCRCERTCTX, pfnCertSearchNext)(void *pvProvider, PRTCRSTORECERTSEARCH pSearch);
+
+ /**
+ * Closes a certficate search state.
+ *
+ * @param pvProvider The provider specific data.
+ * @param pSearch Pointer to opaque search state structure to destroy.
+ */
+ DECLCALLBACKMEMBER(void, pfnCertSearchDestroy)(void *pvProvider, PRTCRSTORECERTSEARCH pSearch);
+
+ /**
+ * Adds a certificate to the store.
+ *
+ * @param pvProvider The provider specific data.
+ * @param fFlags RTCRCERTCTX_F_XXX.
+ * @param pbEncoded The encoded certificate bytes.
+ * @param cbEncoded The size of the encoded certificate.
+ * @param pErrInfo Where to store extended error info. Optional.
+ */
+ DECLCALLBACKMEMBER(int, pfnCertAddEncoded)(void *pvProvider, uint32_t fFlags, uint8_t const *pbEncoded, uint32_t cbEncoded,
+ PRTERRINFO pErrInfo);
+
+
+ /* Optional: */
+
+ /**
+ * Find all certficates matching a given issuer and serial number.
+ *
+ * (Usually only one result.)
+ *
+ * @returns IPRT status code
+ * @param pvProvider The provider specific data.
+ * @param phSearch Pointer to a provider specific search handle.
+ */
+ DECLCALLBACKMEMBER(int, pfnCertFindByIssuerAndSerialNo)(void *pvProvider, PCRTCRX509NAME pIssuer, PCRTASN1INTEGER pSerialNo,
+ PRTCRSTORECERTSEARCH phSearch);
+ /** Non-zero end marker. */
+ uintptr_t uEndMarker;
+} RTCRSTOREPROVIDER;
+
+/** Pointer to a store provider call table. */
+typedef RTCRSTOREPROVIDER const *PCRTCRSTOREPROVIDER;
+
+
+DECLHIDDEN(int) rtCrStoreCreate(PCRTCRSTOREPROVIDER pProvider, void *pvProvider, PRTCRSTORE phStore);
+
+#endif
+
diff --git a/src/VBox/Runtime/common/crypto/store.cpp b/src/VBox/Runtime/common/crypto/store.cpp
new file mode 100644
index 00000000000..85a1fce8538
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/store.cpp
@@ -0,0 +1,436 @@
+/* $Id$ */
+/** @file
+ * IPRT - Cryptographic (Certificate) Store.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/crypto/store.h>
+
+#include <iprt/asm.h>
+#include <iprt/err.h>
+#include <iprt/mem.h>
+#include <iprt/string.h>
+
+#include <iprt/crypto/x509.h>
+
+#ifdef IPRT_WITH_OPENSSL
+# include <openssl/x509.h>
+#endif
+
+#include "store-internal.h"
+
+
+/*******************************************************************************
+* Structures and Typedefs *
+*******************************************************************************/
+/**
+ * Internal representation of a (certificate,++) store.
+ */
+typedef struct RTCRSTOREINT
+{
+ /** Magic number (RTCRSTOREINT_MAGIC). */
+ uint32_t u32Magic;
+ /** Reference counter. */
+ uint32_t volatile cRefs;
+ /** Pointer to the store provider. */
+ PCRTCRSTOREPROVIDER pProvider;
+ /** Provider specific data. */
+ void *pvProvider;
+} RTCRSTOREINT;
+/** Pointer to the internal representation of a store. */
+typedef RTCRSTOREINT *PRTCRSTOREINT;
+
+/** Magic value for RTCRSTOREINT::u32Magic (Alfred Dillwyn "Dilly" Knox). */
+#define RTCRSTOREINT_MAGIC UINT32_C(0x18840723)
+/** Dead magic value for RTCRSTOREINT::u32Magic. */
+#define RTCRSTOREINT_MAGIC_DEAD UINT32_C(0x19430227)
+
+
+
+/**
+ * Internal method a store provider uses to create a store handle.
+ *
+ * @returns IPRT status code
+ * @param pProvider Pointer to the store provider callback table.
+ * @param pvProvider Pointer to the provider specific instance data.
+ * @param phStore Where to return the store handle.
+ */
+DECLHIDDEN(int) rtCrStoreCreate(PCRTCRSTOREPROVIDER pProvider, void *pvProvider, PRTCRSTORE phStore)
+{
+ PRTCRSTOREINT pThis = (PRTCRSTOREINT)RTMemAlloc(sizeof(*pThis));
+ if (pThis)
+ {
+ pThis->pvProvider = pvProvider;
+ pThis->pProvider = pProvider;
+ pThis->cRefs = 1;
+ pThis->u32Magic = RTCRSTOREINT_MAGIC;
+ *phStore = pThis;
+ return VINF_SUCCESS;
+ }
+ return VERR_NO_MEMORY;
+}
+
+
+
+RTDECL(uint32_t) RTCrStoreRetain(RTCRSTORE hStore)
+{
+ PRTCRSTOREINT pThis = (PRTCRSTOREINT)hStore;
+ AssertPtrReturn(pThis, UINT32_MAX);
+ AssertReturn(pThis->u32Magic == RTCRSTOREINT_MAGIC, UINT32_MAX);
+
+ uint32_t cRet = ASMAtomicIncU32(&pThis->cRefs);
+ Assert(cRet < 8192);
+ return cRet;
+}
+
+
+RTDECL(uint32_t) RTCrStoreRelease(RTCRSTORE hStore)
+{
+ if (hStore == NIL_RTCRSTORE)
+ return 0;
+
+ PRTCRSTOREINT pThis = (PRTCRSTOREINT)hStore;
+ AssertPtrReturn(pThis, UINT32_MAX);
+ AssertReturn(pThis->u32Magic == RTCRSTOREINT_MAGIC, UINT32_MAX);
+
+ uint32_t cStore = ASMAtomicDecU32(&pThis->cRefs);
+ if (!cStore)
+ {
+ ASMAtomicWriteU32(&pThis->u32Magic, RTCRSTOREINT_MAGIC_DEAD);
+ pThis->pProvider->pfnDestroyStore(pThis->pvProvider);
+ RTMemFree(pThis);
+ }
+ return cStore;
+}
+
+
+RTDECL(PCRTCRCERTCTX) RTCrStoreCertByIssuerAndSerialNo(RTCRSTORE hStore, PCRTCRX509NAME pIssuer, PCRTASN1INTEGER pSerialNo)
+{
+ PRTCRSTOREINT pThis = (PRTCRSTOREINT)hStore;
+ AssertPtrReturn(pThis, NULL);
+ AssertReturn(pThis->u32Magic == RTCRSTOREINT_MAGIC, NULL);
+ AssertPtrReturn(pIssuer, NULL);
+
+ int rc;
+ RTCRSTORECERTSEARCH Search;
+ if (pThis->pProvider->pfnCertFindByIssuerAndSerialNo)
+ rc = pThis->pProvider->pfnCertFindByIssuerAndSerialNo(pThis->pvProvider, pIssuer, pSerialNo, &Search);
+ else
+ rc = pThis->pProvider->pfnCertFindAll(pThis->pvProvider, &Search);
+
+ PCRTCRCERTCTX pCertCtx = NULL;
+ if (RT_SUCCESS(rc))
+ {
+ for (;;)
+ {
+ pCertCtx = pThis->pProvider->pfnCertSearchNext(pThis->pvProvider, &Search);
+ if (!pCertCtx)
+ break;
+
+ if ( pCertCtx->pCert
+ && RTCrX509Certificate_MatchIssuerAndSerialNumber(pCertCtx->pCert, pIssuer, pSerialNo))
+ break;
+ RTCrCertCtxRelease(pCertCtx);
+ }
+
+ pThis->pProvider->pfnCertSearchDestroy(pThis->pvProvider, &Search);
+ }
+ else
+ AssertMsg(rc == VERR_NOT_FOUND, ("%Rrc\n", rc));
+ return pCertCtx;
+}
+
+
+RTDECL(int) RTCrStoreCertAddEncoded(RTCRSTORE hStore, uint32_t fFlags, void const *pvSrc, size_t cbSrc, PRTERRINFO pErrInfo)
+{
+ PRTCRSTOREINT pThis = (PRTCRSTOREINT)hStore;
+ AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
+ AssertReturn(pThis->u32Magic == RTCRSTOREINT_MAGIC, VERR_INVALID_HANDLE);
+ AssertPtrReturn(pvSrc, VERR_INVALID_POINTER);
+ AssertReturn(cbSrc > 16 && cbSrc < _1M, VERR_OUT_OF_RANGE);
+ AssertMsgReturn( fFlags == RTCRCERTCTX_F_ENC_X509_DER
+ || fFlags == RTCRCERTCTX_F_ENC_TAF_DER
+ , ("Only X.509 and TAF DER supported: %#x\n", fFlags), VERR_INVALID_FLAGS);
+
+ int rc;
+ if (pThis->pProvider->pfnCertAddEncoded)
+ rc = pThis->pProvider->pfnCertAddEncoded(pThis->pvProvider, fFlags, (uint8_t const *)pvSrc, (uint32_t)cbSrc, pErrInfo);
+ else
+ rc = VERR_WRITE_PROTECT;
+
+ return rc;
+}
+
+
+
+/*
+ * Searching.
+ * Searching.
+ * Searching.
+ */
+
+RTDECL(int) RTCrStoreCertFindAll(RTCRSTORE hStore, PRTCRSTORECERTSEARCH pSearch)
+{
+ PRTCRSTOREINT pThis = (PRTCRSTOREINT)hStore;
+ AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
+ AssertReturn(pThis->u32Magic == RTCRSTOREINT_MAGIC, VERR_INVALID_HANDLE);
+ AssertPtrReturn(pSearch, VERR_INVALID_POINTER);
+
+ return pThis->pProvider->pfnCertFindAll(pThis->pvProvider, pSearch);
+}
+
+
+/** Indicator for RTCrStoreCertFindBySubjectOrAltSubjectByRfc5280 searches
+ * implemented by this front-end code. */
+#define RTCRSTORECERTSEARCH_BY_SUBECT_OR_ALT_SUBJECT_BY_RFC5280 UINT32_C(0x5be9145d)
+
+RTDECL(int) RTCrStoreCertFindBySubjectOrAltSubjectByRfc5280(RTCRSTORE hStore, PCRTCRX509NAME pSubject,
+ PRTCRSTORECERTSEARCH pSearch)
+{
+ PRTCRSTOREINT pThis = (PRTCRSTOREINT)hStore;
+ AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
+ AssertReturn(pThis->u32Magic == RTCRSTOREINT_MAGIC, VERR_INVALID_HANDLE);
+ AssertPtrReturn(pSearch, VERR_INVALID_POINTER);
+
+ int rc = pThis->pProvider->pfnCertFindAll(pThis->pvProvider, pSearch);
+ if (RT_SUCCESS(rc))
+ {
+ pSearch->auOpaque[2] = RTCRSTORECERTSEARCH_BY_SUBECT_OR_ALT_SUBJECT_BY_RFC5280;
+ pSearch->auOpaque[3] = (uintptr_t)pSubject;
+ }
+ return rc;
+}
+
+
+RTDECL(PCRTCRCERTCTX) RTCrStoreCertSearchNext(RTCRSTORE hStore, PRTCRSTORECERTSEARCH pSearch)
+{
+ PRTCRSTOREINT pThis = (PRTCRSTOREINT)hStore;
+ AssertPtrReturn(pThis, NULL);
+ AssertReturn(pThis->u32Magic == RTCRSTOREINT_MAGIC, NULL);
+ AssertPtrReturn(pSearch, NULL);
+
+ PCRTCRCERTCTX pRet;
+ switch (pSearch->auOpaque[2])
+ {
+ default:
+ pRet = pThis->pProvider->pfnCertSearchNext(pThis->pvProvider, pSearch);
+ break;
+
+ case RTCRSTORECERTSEARCH_BY_SUBECT_OR_ALT_SUBJECT_BY_RFC5280:
+ {
+ PCRTCRX509NAME pSubject = (PCRTCRX509NAME)pSearch->auOpaque[3];
+ AssertPtrReturn(pSubject, NULL);
+
+ for (;;)
+ {
+ pRet = pThis->pProvider->pfnCertSearchNext(pThis->pvProvider, pSearch);
+ if (!pRet)
+ break;
+ if (pRet->pCert)
+ {
+ if (RTCrX509Certificate_MatchSubjectOrAltSubjectByRfc5280(pRet->pCert, pSubject))
+ break;
+ }
+ else if (pRet->pTaInfo)
+ {
+ if ( RTCrTafCertPathControls_IsPresent(&pRet->pTaInfo->CertPath)
+ && RTCrX509Name_MatchByRfc5280(&pRet->pTaInfo->CertPath.TaName, pSubject))
+ break;
+ }
+ RTCrCertCtxRelease(pRet);
+ }
+ break;
+ }
+ }
+ return pRet;
+}
+
+
+RTDECL(int) RTCrStoreCertSearchDestroy(RTCRSTORE hStore, PRTCRSTORECERTSEARCH pSearch)
+{
+ PRTCRSTOREINT pThis = (PRTCRSTOREINT)hStore;
+ AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
+ AssertReturn(pThis->u32Magic == RTCRSTOREINT_MAGIC, VERR_INVALID_HANDLE);
+ if (pSearch)
+ {
+ AssertPtrReturn(pSearch, VERR_INVALID_POINTER);
+ pThis->pProvider->pfnCertSearchDestroy(pThis->pvProvider, pSearch);
+ }
+ return VINF_SUCCESS;
+}
+
+
+
+#ifdef IPRT_WITH_OPENSSL
+/*
+ * OpenSSL helper.
+ * OpenSSL helper.
+ * OpenSSL helper.
+ */
+
+RTDECL(int) RTCrStoreConvertToOpenSslCertStore(RTCRSTORE hStore, uint32_t fFlags, void **ppvOpenSslStore)
+{
+ PRTCRSTOREINT pThis = (PRTCRSTOREINT)hStore;
+ AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
+ AssertReturn(pThis->u32Magic == RTCRSTOREINT_MAGIC, VERR_INVALID_HANDLE);
+
+ /*
+ * Use the pfnCertFindAll method to add all certificates to the store we're returning.
+ */
+ int rc;
+ X509_STORE *pOsslStore = X509_STORE_new();
+ if (pOsslStore)
+ {
+ RTCRSTORECERTSEARCH Search;
+ rc = pThis->pProvider->pfnCertFindAll(pThis->pvProvider, &Search);
+ if (RT_SUCCESS(rc))
+ {
+ do
+ {
+ PCRTCRCERTCTX pCertCtx = pThis->pProvider->pfnCertSearchNext(pThis->pvProvider, &Search);
+ if (!pCertCtx)
+ break;
+
+ if (pCertCtx->fFlags & RTCRCERTCTX_F_ENC_X509_DER)
+ {
+ X509 *pOsslCert = NULL;
+ const unsigned char *pabEncoded = (const unsigned char *)pCertCtx->pabEncoded;
+ if (d2i_X509(&pOsslCert, &pabEncoded, pCertCtx->cbEncoded) == pOsslCert)
+ {
+ if (!X509_STORE_add_cert(pOsslStore, pOsslCert))
+ rc = VERR_NO_MEMORY;
+ X509_free(pOsslCert);
+ }
+ }
+
+ RTCrCertCtxRelease(pCertCtx);
+ } while (RT_SUCCESS(rc));
+
+ pThis->pProvider->pfnCertSearchDestroy(pThis->pvProvider, &Search);
+ if (RT_SUCCESS(rc))
+ {
+ *ppvOpenSslStore = pOsslStore;
+ return VINF_SUCCESS;
+ }
+ }
+ X509_STORE_free(pOsslStore);
+ }
+ return rc;
+}
+
+
+RTDECL(int) RTCrStoreConvertToOpenSslCertStack(RTCRSTORE hStore, uint32_t fFlags, void **ppvOpenSslStack)
+{
+ PRTCRSTOREINT pThis = (PRTCRSTOREINT)hStore;
+ AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
+ AssertReturn(pThis->u32Magic == RTCRSTOREINT_MAGIC, VERR_INVALID_HANDLE);
+
+ /*
+ * Use the pfnCertFindAll method to add all certificates to the store we're returning.
+ */
+ int rc;
+ STACK_OF(X509) *pOsslStack = sk_X509_new_null();
+ if (pOsslStack)
+ {
+ RTCRSTORECERTSEARCH Search;
+ rc = pThis->pProvider->pfnCertFindAll(pThis->pvProvider, &Search);
+ if (RT_SUCCESS(rc))
+ {
+ do
+ {
+ PCRTCRCERTCTX pCertCtx = pThis->pProvider->pfnCertSearchNext(pThis->pvProvider, &Search);
+ if (!pCertCtx)
+ break;
+
+ if (pCertCtx->fFlags & RTCRCERTCTX_F_ENC_X509_DER)
+ {
+ X509 *pOsslCert = NULL;
+ const unsigned char *pabEncoded = (const unsigned char *)pCertCtx->pabEncoded;
+ if (d2i_X509(&pOsslCert, &pabEncoded, pCertCtx->cbEncoded) == pOsslCert)
+ {
+ if (!sk_X509_push(pOsslStack, pOsslCert))
+ {
+ rc = VERR_NO_MEMORY;
+ X509_free(pOsslCert);
+ }
+ }
+ }
+
+ RTCrCertCtxRelease(pCertCtx);
+ } while (RT_SUCCESS(rc));
+
+ pThis->pProvider->pfnCertSearchDestroy(pThis->pvProvider, &Search);
+ if (RT_SUCCESS(rc))
+ {
+ *ppvOpenSslStack = pOsslStack;
+ return VINF_SUCCESS;
+ }
+ }
+ sk_X509_pop_free(pOsslStack, X509_free);
+ }
+ return rc;
+}
+
+#endif /* IPRT_WITH_OPENSSL */
+
+
+/*
+ * Certificate context.
+ * Certificate context.
+ * Certificate context.
+ */
+
+
+RTDECL(uint32_t) RTCrCertCtxRetain(PCRTCRCERTCTX pCertCtx)
+{
+ AssertPtrReturn(pCertCtx, UINT32_MAX);
+ PRTCRCERTCTXINT pThis = RT_FROM_MEMBER(pCertCtx, RTCRCERTCTXINT, Public);
+ AssertReturn(pThis->u32Magic == RTCRCERTCTXINT_MAGIC, UINT32_MAX);
+ uint32_t cRet = ASMAtomicIncU32(&pThis->cRefs);
+ Assert(cRet < 64);
+ return cRet;
+}
+
+
+RTDECL(uint32_t) RTCrCertCtxRelease(PCRTCRCERTCTX pCertCtx)
+{
+ if (!pCertCtx)
+ return 0;
+
+ AssertPtrReturn(pCertCtx, UINT32_MAX);
+ PRTCRCERTCTXINT pThis = RT_FROM_MEMBER(pCertCtx, RTCRCERTCTXINT, Public);
+ AssertReturn(pThis->u32Magic == RTCRCERTCTXINT_MAGIC, UINT32_MAX);
+ uint32_t cRet = ASMAtomicDecU32(&pThis->cRefs);
+ if (!cRet)
+ {
+ ASMAtomicWriteU32(&pThis->u32Magic, RTCRCERTCTXINT_MAGIC_DEAD);
+ pThis->pfnDtor(pThis);
+ }
+ return cRet;
+}
+
diff --git a/src/VBox/Runtime/common/crypto/taf-asn1-decoder.cpp b/src/VBox/Runtime/common/crypto/taf-asn1-decoder.cpp
new file mode 100644
index 00000000000..6a1a79a5c1d
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/taf-asn1-decoder.cpp
@@ -0,0 +1,44 @@
+/* $Id$ */
+/** @file
+ * IPRT - Crypto - Trust Anchor Format (RFC-5914), Decoder for ASN.1.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/crypto/taf.h>
+
+#include <iprt/err.h>
+#include <iprt/mem.h>
+#include <iprt/string.h>
+
+#include "taf-internal.h"
+
+/*
+ * Generate the code.
+ */
+#include <iprt/asn1-generator-asn1-decoder.h>
+
diff --git a/src/VBox/Runtime/common/crypto/taf-core.cpp b/src/VBox/Runtime/common/crypto/taf-core.cpp
new file mode 100644
index 00000000000..057b2faca93
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/taf-core.cpp
@@ -0,0 +1,41 @@
+/* $Id$ */
+/** @file
+ * IPRT - Crypto - Trust Anchor Format (RFC-5914), Core API.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/crypto/taf.h>
+
+#include "taf-internal.h"
+
+
+/*
+ * Generate the code.
+ */
+#include <iprt/asn1-generator-core.h>
+
diff --git a/src/VBox/Runtime/common/crypto/taf-init.cpp b/src/VBox/Runtime/common/crypto/taf-init.cpp
new file mode 100644
index 00000000000..d4d4699f82f
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/taf-init.cpp
@@ -0,0 +1,44 @@
+/* $Id$ */
+/** @file
+ * IPRT - Crypto - Trust Anchor Format (RFC-5914), Initialization API.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/crypto/taf.h>
+
+#include <iprt/err.h>
+#include <iprt/string.h>
+#include <iprt/crypto/x509.h>
+
+#include "taf-internal.h"
+
+/*
+ * Generate the code.
+ */
+#include <iprt/asn1-generator-init.h>
+
diff --git a/src/VBox/Runtime/common/crypto/taf-internal.h b/src/VBox/Runtime/common/crypto/taf-internal.h
new file mode 100644
index 00000000000..b0e9df0b954
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/taf-internal.h
@@ -0,0 +1,35 @@
+/* $Id$ */
+/** @file
+ * IPRT - Crypto - TAF, Internal Header.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+#ifndef ___common_crypto_taf_internal_h
+#define ___common_crypto_taf_internal_h
+
+#define RTASN1TMPL_TEMPLATE_FILE "../common/crypto/taf-template.h"
+#include <iprt/asn1-generator-internal-header.h>
+
+#endif
+
diff --git a/src/VBox/Runtime/common/crypto/taf-sanity.cpp b/src/VBox/Runtime/common/crypto/taf-sanity.cpp
new file mode 100644
index 00000000000..4f3e7a00b74
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/taf-sanity.cpp
@@ -0,0 +1,42 @@
+/* $Id$ */
+/** @file
+ * IPRT - Crypto - Trust Anchor Format (RFC-5914), Sanity Checkers.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/crypto/taf.h>
+
+#include <iprt/err.h>
+
+#include "taf-internal.h"
+
+/*
+ * Generate the code.
+ */
+#include <iprt/asn1-generator-sanity.h>
+
diff --git a/src/VBox/Runtime/common/crypto/taf-template.h b/src/VBox/Runtime/common/crypto/taf-template.h
new file mode 100644
index 00000000000..0772e86275d
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/taf-template.h
@@ -0,0 +1,94 @@
+/* $Id$ */
+/** @file
+ * IPRT - Crypto - Trust Anchor Format (RFC-5914), Code Generator Template.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+#define RTASN1TMPL_DECL RTDECL
+
+/*
+ * CertPathControls (not sequence-/set-of).
+ */
+#define RTASN1TMPL_TYPE RTCRTAFCERTPATHCONTROLS
+#define RTASN1TMPL_EXT_NAME RTCrTafCertPathControls
+#define RTASN1TMPL_INT_NAME rtCrTafCertPathControls
+RTASN1TMPL_BEGIN_SEQCORE();
+RTASN1TMPL_MEMBER( TaName, RTCRX509NAME, RTCrX509Name);
+RTASN1TMPL_MEMBER_OPT_ITAG( Certificate, RTCRX509CERTIFICATE, RTCrX509Certificate, 0);
+RTASN1TMPL_MEMBER_OPT_ITAG( PolicySet, RTCRX509CERTIFICATEPOLICIES, RTCrX509CertificatePolicies, 1);
+RTASN1TMPL_MEMBER_OPT_ITAG_BITSTRING(PolicyFlags, 3 /* max bits */, 2);
+RTASN1TMPL_MEMBER_OPT_ITAG( NameConstr, RTCRX509NAMECONSTRAINTS, RTCrX509NameConstraints, 3);
+RTASN1TMPL_MEMBER_OPT_ITAG_EX( PathLenConstraint, RTASN1INTEGER, RTAsn1Integer, 4, RTASN1TMPL_ITAG_F_CP, RT_NOTHING);
+RTASN1TMPL_END_SEQCORE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * TrustAnchorInfo.
+ */
+#define RTASN1TMPL_TYPE RTCRTAFTRUSTANCHORINFO
+#define RTASN1TMPL_EXT_NAME RTCrTafTrustAnchorInfo
+#define RTASN1TMPL_INT_NAME rtCrTafTrustAnchorInfo
+RTASN1TMPL_BEGIN_SEQCORE();
+RTASN1TMPL_MEMBER_DEF_ITAG_UP( Version, RTASN1INTEGER, RTAsn1Integer, ASN1_TAG_INTEGER, RTCRTAFTRUSTANCHORINFO_V1);
+RTASN1TMPL_MEMBER( PubKey, RTCRX509SUBJECTPUBLICKEYINFO, RTCrX509SubjectPublicKeyInfo);
+RTASN1TMPL_MEMBER( KeyIdentifier, RTASN1OCTETSTRING, RTAsn1OctetString);
+RTASN1TMPL_MEMBER_OPT_UTF8_STRING_EX(TaTitle, RTASN1TMPL_MEMBER_CONSTR_MIN_MAX(TaTitleLangTag, RTASN1STRING, RTAsn1String, 1, 64, RT_NOTHING));
+RTASN1TMPL_MEMBER_OPT_ITAG_EX( CertPath, RTCRTAFCERTPATHCONTROLS, RTCrTafCertPathControls, ASN1_TAG_SEQUENCE, RTASN1TMPL_ITAG_F_UC, RT_NOTHING);
+RTASN1TMPL_MEMBER_OPT_XTAG( T1, CtxTag1, Exts, RTCRX509EXTENSIONS, RTCrX509Extensions, 1);
+RTASN1TMPL_MEMBER_OPT_UTF8_STRING_EX(TaTitleLangTag, RTASN1TMPL_MEMBER_CONSTR_MIN_MAX(TaTitleLangTag, RTASN1STRING, RTAsn1String, 2, 4, RT_NOTHING));
+RTASN1TMPL_END_SEQCORE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * TrustAnchorChoice.
+ */
+#define RTASN1TMPL_TYPE RTCRTAFTRUSTANCHORCHOICE
+#define RTASN1TMPL_EXT_NAME RTCrTafTrustAnchorChoice
+#define RTASN1TMPL_INT_NAME rtCrTafTrustAnchorChoice
+RTASN1TMPL_BEGIN_PCHOICE();
+RTASN1TMPL_PCHOICE_ITAG(ASN1_TAG_SEQUENCE, RTCRTAFTRUSTANCHORCHOICEVAL_CERTIFICATE, u.pCertificate, Certificate, RTCRX509CERTIFICATE, RTCrX509Certificate);
+RTASN1TMPL_PCHOICE_XTAG(1, RTCRTAFTRUSTANCHORCHOICEVAL_TBS_CERTIFICATE, u.pT1, CtxTag1, TbsCert, RTCRX509TBSCERTIFICATE, RTCrX509TbsCertificate);
+RTASN1TMPL_PCHOICE_XTAG(2, RTCRTAFTRUSTANCHORCHOICEVAL_TRUST_ANCHOR_INFO, u.pT2, CtxTag2, TaInfo, RTCRTAFTRUSTANCHORINFO, RTCrTafTrustAnchorInfo);
+RTASN1TMPL_END_PCHOICE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * TrustAnchorList
+ */
+#define RTASN1TMPL_TYPE RTCRTAFTRUSTANCHORLIST
+#define RTASN1TMPL_EXT_NAME RTCrTafTrustAnchorList
+#define RTASN1TMPL_INT_NAME rtCrTafTrustAnchorList
+RTASN1TMPL_SEQ_OF(RTCRTAFTRUSTANCHORCHOICE, RTCrTafTrustAnchorChoice);
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
diff --git a/src/VBox/Runtime/common/crypto/x509-asn1-decoder.cpp b/src/VBox/Runtime/common/crypto/x509-asn1-decoder.cpp
new file mode 100644
index 00000000000..6434aced9f2
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/x509-asn1-decoder.cpp
@@ -0,0 +1,217 @@
+/* $Id$ */
+/** @file
+ * IPRT - Crypto - X.509, Decoder for ASN.1.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/crypto/x509.h>
+
+#include <iprt/err.h>
+#include <iprt/string.h>
+
+#include "x509-internal.h"
+
+
+/*
+ * One X.509 Extension.
+ */
+RTDECL(int) RTCrX509Extension_ExtnValue_DecodeAsn1(PRTASN1CURSOR pCursor, uint32_t fFlags,
+ PRTCRX509EXTENSION pThis, const char *pszErrorTag)
+{
+ pThis->enmValue = RTCRX509EXTENSIONVALUE_UNKNOWN;
+
+ /*
+ * Decode the encapsulated extension bytes if know the format.
+ */
+ RTASN1CURSOR ValueCursor;
+ RTAsn1CursorInitSubFromCore(pCursor, &pThis->ExtnValue.Asn1Core, &ValueCursor, "ExtnValue");
+ pCursor = &ValueCursor;
+
+ int rc;
+ if (RTAsn1ObjId_CompareWithString(&pThis->ExtnId, RTCRX509_ID_CE_AUTHORITY_KEY_IDENTIFIER_OID) == 0)
+ {
+ /* 4.2.1.1 Authority Key Identifier */
+ PRTCRX509AUTHORITYKEYIDENTIFIER pThat;
+ rc = RTAsn1MemAllocZ(&pThis->ExtnValue.EncapsulatedAllocation, (void **)&pThat, sizeof(*pThat));
+ if (RT_SUCCESS(rc))
+ {
+ pThis->ExtnValue.pEncapsulated = &pThat->SeqCore.Asn1Core;
+ pThis->enmValue = RTCRX509EXTENSIONVALUE_AUTHORITY_KEY_IDENTIFIER;
+ rc = RTCrX509AuthorityKeyIdentifier_DecodeAsn1(&ValueCursor, 0, pThat, "AuthorityKeyIdentifier");
+ }
+ }
+ else if (RTAsn1ObjId_CompareWithString(&pThis->ExtnId, RTCRX509_ID_CE_OLD_AUTHORITY_KEY_IDENTIFIER_OID) == 0)
+ {
+ /* Old and obsolete version of the above, still found in microsoft certificates. */
+ PRTCRX509OLDAUTHORITYKEYIDENTIFIER pThat;
+ rc = RTAsn1MemAllocZ(&pThis->ExtnValue.EncapsulatedAllocation, (void **)&pThat, sizeof(*pThat));
+ if (RT_SUCCESS(rc))
+ {
+ pThis->ExtnValue.pEncapsulated = &pThat->SeqCore.Asn1Core;
+ pThis->enmValue = RTCRX509EXTENSIONVALUE_OLD_AUTHORITY_KEY_IDENTIFIER;
+ rc = RTCrX509OldAuthorityKeyIdentifier_DecodeAsn1(&ValueCursor, 0, pThat, "OldAuthorityKeyIdentifier");
+ }
+ }
+ else if (RTAsn1ObjId_CompareWithString(&pThis->ExtnId, RTCRX509_ID_CE_SUBJECT_KEY_IDENTIFIER_OID) == 0)
+ {
+ /* 4.2.1.2 Subject Key Identifier */
+ PRTASN1OCTETSTRING pThat;
+ rc = RTAsn1MemAllocZ(&pThis->ExtnValue.EncapsulatedAllocation, (void **)&pThat, sizeof(*pThat));
+ if (RT_SUCCESS(rc))
+ {
+ pThis->ExtnValue.pEncapsulated = &pThat->Asn1Core;
+ pThis->enmValue = RTCRX509EXTENSIONVALUE_OCTET_STRING;
+ rc = RTAsn1CursorGetOctetString(&ValueCursor, 0, pThat, "SubjectKeyIdentifier");
+ }
+ }
+ else if (RTAsn1ObjId_CompareWithString(&pThis->ExtnId, RTCRX509_ID_CE_KEY_USAGE_OID) == 0)
+ {
+ /* 4.2.1.3 Key Usage */
+ PRTASN1BITSTRING pThat;
+ rc = RTAsn1MemAllocZ(&pThis->ExtnValue.EncapsulatedAllocation, (void **)&pThat, sizeof(*pThat));
+ if (RT_SUCCESS(rc))
+ {
+ pThis->ExtnValue.pEncapsulated = &pThat->Asn1Core;
+ pThis->enmValue = RTCRX509EXTENSIONVALUE_BIT_STRING;
+ rc = RTAsn1CursorGetBitStringEx(&ValueCursor, 0, 9, pThat, "KeyUsage");
+ }
+ }
+ else if (RTAsn1ObjId_CompareWithString(&pThis->ExtnId, RTCRX509_ID_CE_CERTIFICATE_POLICIES_OID) == 0)
+ {
+ /* 4.2.1.4 Certificate Policies */
+ PRTCRX509CERTIFICATEPOLICIES pThat;
+ rc = RTAsn1MemAllocZ(&pThis->ExtnValue.EncapsulatedAllocation, (void **)&pThat, sizeof(*pThat));
+ if (RT_SUCCESS(rc))
+ {
+ pThis->ExtnValue.pEncapsulated = &pThat->SeqCore.Asn1Core;
+ pThis->enmValue = RTCRX509EXTENSIONVALUE_CERTIFICATE_POLICIES;
+ rc = RTCrX509CertificatePolicies_DecodeAsn1(&ValueCursor, 0, pThat, "CertPolicies");
+ }
+ }
+ else if (RTAsn1ObjId_CompareWithString(&pThis->ExtnId, RTCRX509_ID_CE_POLICY_MAPPINGS_OID) == 0)
+ {
+ /* 4.2.1.5 Policy Mappings */
+ PRTCRX509POLICYMAPPINGS pThat;
+ rc = RTAsn1MemAllocZ(&pThis->ExtnValue.EncapsulatedAllocation, (void **)&pThat, sizeof(*pThat));
+ if (RT_SUCCESS(rc))
+ {
+ pThis->ExtnValue.pEncapsulated = &pThat->SeqCore.Asn1Core;
+ pThis->enmValue = RTCRX509EXTENSIONVALUE_POLICY_MAPPINGS;
+ rc = RTCrX509PolicyMappings_DecodeAsn1(&ValueCursor, 0, pThat, "PolicyMapppings");
+ }
+ }
+ else if ( RTAsn1ObjId_CompareWithString(&pThis->ExtnId, RTCRX509_ID_CE_SUBJECT_ALT_NAME_OID) == 0
+ || RTAsn1ObjId_CompareWithString(&pThis->ExtnId, RTCRX509_ID_CE_ISSUER_ALT_NAME_OID) == 0)
+ {
+ /* 4.2.1.6 Subject Alternative Name / 4.2.1.7 Issuer Alternative Name */
+ PRTCRX509GENERALNAMES pThat;
+ rc = RTAsn1MemAllocZ(&pThis->ExtnValue.EncapsulatedAllocation, (void **)&pThat, sizeof(*pThat));
+ if (RT_SUCCESS(rc))
+ {
+ pThis->ExtnValue.pEncapsulated = &pThat->SeqCore.Asn1Core;
+ pThis->enmValue = RTCRX509EXTENSIONVALUE_GENERAL_NAMES;
+ rc = RTCrX509GeneralNames_DecodeAsn1(&ValueCursor, 0, pThat, "AltName");
+ }
+ }
+ else if (RTAsn1ObjId_CompareWithString(&pThis->ExtnId, RTCRX509_ID_CE_BASIC_CONSTRAINTS_OID) == 0)
+ {
+ /* 4.2.1.9 Basic Constraints */
+ PRTCRX509BASICCONSTRAINTS pThat;
+ rc = RTAsn1MemAllocZ(&pThis->ExtnValue.EncapsulatedAllocation, (void **)&pThat, sizeof(*pThat));
+ if (RT_SUCCESS(rc))
+ {
+ pThis->ExtnValue.pEncapsulated = &pThat->SeqCore.Asn1Core;
+ pThis->enmValue = RTCRX509EXTENSIONVALUE_BASIC_CONSTRAINTS;
+ rc = RTCrX509BasicConstraints_DecodeAsn1(&ValueCursor, 0, pThat, "BasicConstraints");
+ }
+ }
+ else if (RTAsn1ObjId_CompareWithString(&pThis->ExtnId, RTCRX509_ID_CE_NAME_CONSTRAINTS_OID) == 0)
+ {
+ /* 4.2.1.10 Name Constraints */
+ PRTCRX509NAMECONSTRAINTS pThat;
+ rc = RTAsn1MemAllocZ(&pThis->ExtnValue.EncapsulatedAllocation, (void **)&pThat, sizeof(*pThat));
+ if (RT_SUCCESS(rc))
+ {
+ pThis->ExtnValue.pEncapsulated = &pThat->SeqCore.Asn1Core;
+ pThis->enmValue = RTCRX509EXTENSIONVALUE_NAME_CONSTRAINTS;
+ rc = RTCrX509NameConstraints_DecodeAsn1(&ValueCursor, 0, pThat, "NameConstraints");
+ }
+ }
+ else if (RTAsn1ObjId_CompareWithString(&pThis->ExtnId, RTCRX509_ID_CE_POLICY_CONSTRAINTS_OID) == 0)
+ {
+ /* 4.2.1.11 Policy Constraints */
+ PRTCRX509POLICYCONSTRAINTS pThat;
+ rc = RTAsn1MemAllocZ(&pThis->ExtnValue.EncapsulatedAllocation, (void **)&pThat, sizeof(*pThat));
+ if (RT_SUCCESS(rc))
+ {
+ pThis->ExtnValue.pEncapsulated = &pThat->SeqCore.Asn1Core;
+ pThis->enmValue = RTCRX509EXTENSIONVALUE_POLICY_CONSTRAINTS;
+ rc = RTCrX509PolicyConstraints_DecodeAsn1(&ValueCursor, 0, pThat, "PolicyConstraints");
+ }
+ }
+ else if (RTAsn1ObjId_CompareWithString(&pThis->ExtnId, RTCRX509_ID_CE_EXT_KEY_USAGE_OID) == 0)
+ {
+ /* 4.2.1.12 Extended Key Usage */
+ PRTASN1SEQOFOBJIDS pThat;
+ rc = RTAsn1MemAllocZ(&pThis->ExtnValue.EncapsulatedAllocation, (void **)&pThat, sizeof(*pThat));
+ if (RT_SUCCESS(rc))
+ {
+ pThis->ExtnValue.pEncapsulated = &pThat->SeqCore.Asn1Core;
+ pThis->enmValue = RTCRX509EXTENSIONVALUE_SEQ_OF_OBJ_IDS;
+ rc = RTAsn1SeqOfObjIds_DecodeAsn1(&ValueCursor, 0, pThat, "ExKeyUsage");
+ }
+ }
+ else if (RTAsn1ObjId_CompareWithString(&pThis->ExtnId, RTCRX509_ID_CE_EXT_KEY_USAGE_OID) == 0)
+ {
+ /* 4.2.1.14 Inhibit anyPolicy */
+ PRTASN1INTEGER pThat;
+ rc = RTAsn1MemAllocZ(&pThis->ExtnValue.EncapsulatedAllocation, (void **)&pThat, sizeof(*pThat));
+ if (RT_SUCCESS(rc))
+ {
+ pThis->ExtnValue.pEncapsulated = &pThat->Asn1Core;
+ pThis->enmValue = RTCRX509EXTENSIONVALUE_INTEGER;
+ rc = RTAsn1CursorGetInteger(&ValueCursor, 0, pThat, "InhibitAnyPolicy");
+ }
+ }
+ else
+ return VINF_SUCCESS;
+
+ if (RT_SUCCESS(rc))
+ rc = RTAsn1CursorCheckEnd(&ValueCursor);
+
+ if (RT_SUCCESS(rc))
+ return VINF_SUCCESS;
+ return rc;
+}
+
+
+/*
+ * Generate the code.
+ */
+#include <iprt/asn1-generator-asn1-decoder.h>
+
diff --git a/src/VBox/Runtime/common/crypto/x509-certpaths.cpp b/src/VBox/Runtime/common/crypto/x509-certpaths.cpp
new file mode 100644
index 00000000000..9043130cf6d
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/x509-certpaths.cpp
@@ -0,0 +1,2790 @@
+/* $Id$ */
+/** @file
+ * IPRT - Crypto - X.509, Simple Certificate Path Builder & Validator.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/crypto/x509.h>
+
+#include <iprt/asm.h>
+#include <iprt/ctype.h>
+#include <iprt/err.h>
+#include <iprt/mem.h>
+#include <iprt/string.h>
+#include <iprt/list.h>
+#include <iprt/time.h>
+#include <iprt/crypto/store.h>
+
+#include "x509-internal.h"
+
+
+/*******************************************************************************
+* Structures and Typedefs *
+*******************************************************************************/
+/**
+ * X.509 certificate path node.
+ */
+typedef struct RTCRX509CERTPATHNODE
+{
+ /** Sibling list entry. */
+ RTLISTNODE SiblingEntry;
+ /** List of children or leaf list entry. */
+ RTLISTANCHOR ChildListOrLeafEntry;
+ /** Pointer to the parent node. NULL for root. */
+ struct RTCRX509CERTPATHNODE *pParent;
+
+ /** The distance between this node and the target. */
+ uint32_t uDepth : 8;
+ /** Indicates the source of this certificate. */
+ uint32_t uSrc : 3;
+ /** Set if this is a leaf node. */
+ uint32_t fLeaf : 1;
+ /** Makes sure it's a 32-bit bitfield. */
+ uint32_t uReserved : 20;
+
+ /** Leaf only: The result of the last path vertification. */
+ int rcVerify;
+
+ /** Pointer to the certificate. This can be NULL only for trust anchors. */
+ PCRTCRX509CERTIFICATE pCert;
+
+ /** If the certificate or trust anchor was obtained from a store, this is the
+ * associated certificate context (referenced of course). This is used to
+ * access the trust anchor information, if present.
+ *
+ * (If this is NULL it's from a certificate array or some such given directly to
+ * the path building code. It's assumed the caller doesn't free these until the
+ * path validation/whatever is done with and the paths destroyed.) */
+ PCRTCRCERTCTX pCertCtx;
+} RTCRX509CERTPATHNODE;
+/** Pointer to a X.509 path node. */
+typedef RTCRX509CERTPATHNODE *PRTCRX509CERTPATHNODE;
+
+/** @name RTCRX509CERTPATHNODE::uSrc values.
+ * The trusted and untrusted sources ordered in priority order, where higher
+ * number means high priority in case of duplicates.
+ * @{ */
+#define RTCRX509CERTPATHNODE_SRC_NONE 0
+#define RTCRX509CERTPATHNODE_SRC_TARGET 1
+#define RTCRX509CERTPATHNODE_SRC_UNTRUSTED_ARRAY 2
+#define RTCRX509CERTPATHNODE_SRC_UNTRUSTED_STORE 3
+#define RTCRX509CERTPATHNODE_SRC_TRUSTED_STORE 4
+#define RTCRX509CERTPATHNODE_SRC_TRUSTED_CERT 5
+#define RTCRX509CERTPATHNODE_SRC_IS_TRUSTED(uSrc) ((uSrc) >= RTCRX509CERTPATHNODE_SRC_TRUSTED_STORE)
+/** @} */
+
+
+/**
+ * Policy tree node.
+ */
+typedef struct RTCRX509CERTPATHSPOLICYNODE
+{
+ /** Sibling list entry. */
+ RTLISTNODE SiblingEntry;
+ /** Tree depth list entry. */
+ RTLISTNODE DepthEntry;
+ /** List of children or leaf list entry. */
+ RTLISTANCHOR ChildList;
+ /** Pointer to the parent. */
+ struct RTCRX509CERTPATHSPOLICYNODE *pParent;
+
+ /** The policy object ID. */
+ PCRTASN1OBJID pValidPolicy;
+
+ /** Optional sequence of policy qualifiers. */
+ PCRTCRX509POLICYQUALIFIERINFOS pPolicyQualifiers;
+
+ /** The first policy ID in the exepcted policy set. */
+ PCRTASN1OBJID pExpectedPolicyFirst;
+ /** Set if we've already mapped pExpectedPolicyFirst. */
+ bool fAlreadyMapped;
+ /** Number of additional items in the expected policy set. */
+ uint32_t cMoreExpectedPolicySet;
+ /** Additional items in the expected policy set. */
+ PCRTASN1OBJID *papMoreExpectedPolicySet;
+} RTCRX509CERTPATHSPOLICYNODE;
+/** Pointer to a policy tree node. */
+typedef RTCRX509CERTPATHSPOLICYNODE *PRTCRX509CERTPATHSPOLICYNODE;
+
+
+/**
+ * Path builder and validator instance.
+ *
+ * The path builder creates a tree of certificates by forward searching from the
+ * end-entity towards a trusted source. The leaf nodes are inserted into list
+ * ordered by the source of the leaf certificate and the path length (i.e. tree
+ * depth).
+ *
+ * The path validator works the tree from the leaf end and validates each
+ * potential path found by the builder. It is generally happy with one working
+ * path, but may be told to verify all of them.
+ */
+typedef struct RTCRX509CERTPATHSINT
+{
+ /** Magic number. */
+ uint32_t u32Magic;
+ /** Reference counter. */
+ uint32_t volatile cRefs;
+
+ /** @name Input
+ * @{ */
+ /** The target certificate (end entity) to build a trusted path for. */
+ PCRTCRX509CERTIFICATE pTarget;
+
+ /** Lone trusted certificate. */
+ PCRTCRX509CERTIFICATE pTrustedCert;
+ /** Store of trusted certificates. */
+ RTCRSTORE hTrustedStore;
+
+ /** Store of untrusted certificates. */
+ RTCRSTORE hUntrustedStore;
+ /** Array of untrusted certificates, typically from the protocol (like the
+ * certificates member of PKCS \#7 SignedData). */
+ PCRTCRX509CERTIFICATE paUntrustedCerts;
+ /** Number of entries in paUntrusted. */
+ uint32_t cUntrustedCerts;
+
+ /** UTC time we're going to validate the path at, requires
+ * RTCRX509CERTPATHSINT_F_VALID_TIME to be set. */
+ RTTIMESPEC ValidTime;
+ /** Number of policy OIDs in the user initial policy set, 0 means anyPolicy. */
+ uint32_t cInitialUserPolicySet;
+ /** The user initial policy set. As with all other user provided data, we
+ * assume it's immutable and remains valid for the usage period of the path
+ * builder & validator. */
+ PCRTASN1OBJID *papInitialUserPolicySet;
+ /** Number of certificates before the user wants an explicit policy result.
+ * Set to UINT32_MAX no explicit policy restriction required by the user. */
+ uint32_t cInitialExplicitPolicy;
+ /** Number of certificates before the user wants policy mapping to be
+ * inhibited. Set to UINT32_MAX if no initial policy mapping inhibition
+ * desired by the user. */
+ uint32_t cInitialPolicyMappingInhibit;
+ /** Number of certificates before the user wants the anyPolicy to be rejected.
+ * Set to UINT32_MAX no explicit policy restriction required by the user. */
+ uint32_t cInitialInhibitAnyPolicy;
+ /** Initial name restriction: Permitted subtrees. */
+ PCRTCRX509GENERALSUBTREES pInitialPermittedSubtrees;
+ /** Initial name restriction: Excluded subtrees. */
+ PCRTCRX509GENERALSUBTREES pInitialExcludedSubtrees;
+
+ /** Flags RTCRX509CERTPATHSINT_F_XXX. */
+ uint32_t fFlags;
+ /** @} */
+
+ /** Sticky status for remembering allocation errors and the like. */
+ int32_t rc;
+ /** Where to store extended error info (optional). */
+ PRTERRINFO pErrInfo;
+
+ /** @name Path Builder Output
+ * @{ */
+ /** Pointer to the root of the tree. This will always be non-NULL after path
+ * building and thus can be reliably used to tell if path building has taken
+ * place or not. */
+ PRTCRX509CERTPATHNODE pRoot;
+ /** List of working leaf tree nodes. */
+ RTLISTANCHOR LeafList;
+ /** The number of paths (leafs). */
+ uint32_t cPaths;
+ /** @} */
+
+ /** Path Validator State. */
+ struct
+ {
+ /** Number of nodes in the certificate path we're validating (aka 'n'). */
+ uint32_t cNodes;
+ /** The current node (0 being the trust anchor). */
+ uint32_t iNode;
+
+ /** The root node of the valid policy tree. */
+ PRTCRX509CERTPATHSPOLICYNODE pValidPolicyTree;
+ /** An array of length cNodes + 1 which tracks all nodes at the given (index)
+ * tree depth via the RTCRX509CERTPATHSPOLICYNODE::DepthEntry member. */
+ PRTLISTANCHOR paValidPolicyDepthLists;
+
+ /** Number of entries in paPermittedSubtrees (name constraints).
+ * If zero, no permitted name constrains currently in effect. */
+ uint32_t cPermittedSubtrees;
+ /** The allocated size of papExcludedSubtrees */
+ uint32_t cPermittedSubtreesAlloc;
+ /** Array of permitted subtrees we've collected so far (name constraints). */
+ PCRTCRX509GENERALSUBTREE *papPermittedSubtrees;
+ /** Set if we end up with an empty set after calculating a name constraints
+ * union. */
+ bool fNoPermittedSubtrees;
+
+ /** Number of entries in paExcludedSubtrees (name constraints).
+ * If zero, no excluded name constrains currently in effect. */
+ uint32_t cExcludedSubtrees;
+ /** Array of excluded subtrees we've collected so far (name constraints). */
+ PCRTCRX509GENERALSUBTREES *papExcludedSubtrees;
+
+ /** Number of non-self-issued certificates to be processed before a non-NULL
+ * paValidPolicyTree is required. */
+ uint32_t cExplicitPolicy;
+ /** Number of non-self-issued certificates to be processed we stop processing
+ * policy mapping extensions. */
+ uint32_t cInhibitPolicyMapping;
+ /** Number of non-self-issued certificates to be processed before a the
+ * anyPolicy is rejected. */
+ uint32_t cInhibitAnyPolicy;
+ /** Number of non-self-issued certificates we're allowed to process. */
+ uint32_t cMaxPathLength;
+
+ /** The working issuer name. */
+ PCRTCRX509NAME pWorkingIssuer;
+ /** The working public key algorithm ID. */
+ PCRTASN1OBJID pWorkingPublicKeyAlgorithm;
+ /** The working public key algorithm parameters. */
+ PCRTASN1DYNTYPE pWorkingPublicKeyParameters;
+ /** A bit string containing the public key. */
+ PCRTASN1BITSTRING pWorkingPublicKey;
+ } v;
+
+ /** An object identifier initialized to anyPolicy. */
+ RTASN1OBJID AnyPolicyObjId;
+} RTCRX509CERTPATHSINT;
+typedef RTCRX509CERTPATHSINT *PRTCRX509CERTPATHSINT;
+
+/** Magic value for RTCRX509CERTPATHSINT::u32Magic (Bruce Schneier). */
+#define RTCRX509CERTPATHSINT_MAGIC UINT32_C(0x19630115)
+
+/** @name RTCRX509CERTPATHSINT_F_XXX - Certificate path build flags.
+ * @{ */
+#define RTCRX509CERTPATHSINT_F_VALID_TIME RT_BIT_32(0)
+#define RTCRX509CERTPATHSINT_F_ELIMINATE_UNTRUSTED_PATHS RT_BIT_32(1)
+#define RTCRX509CERTPATHSINT_F_VALID_MASK UINT32_C(0x00000003)
+/** @} */
+
+
+/*******************************************************************************
+* Internal Functions *
+*******************************************************************************/
+static void rtCrX509CertPathsDestroyTree(PRTCRX509CERTPATHSINT pThis);
+static void rtCrX509CpvCleanup(PRTCRX509CERTPATHSINT pThis);
+
+
+/** @name Path Builder and Validator Config APIs
+ * @{
+ */
+
+RTDECL(int) RTCrX509CertPathsCreate(PRTCRX509CERTPATHS phCertPaths, PCRTCRX509CERTIFICATE pTarget)
+{
+ AssertPtrReturn(phCertPaths, VERR_INVALID_POINTER);
+
+ PRTCRX509CERTPATHSINT pThis = (PRTCRX509CERTPATHSINT)RTMemAllocZ(sizeof(*pThis));
+ if (pThis)
+ {
+ int rc = RTAsn1ObjId_InitFromString(&pThis->AnyPolicyObjId, RTCRX509_ID_CE_CP_ANY_POLICY_OID, &g_RTAsn1DefaultAllocator);
+ if (RT_SUCCESS(rc))
+ {
+ pThis->u32Magic = RTCRX509CERTPATHSINT_MAGIC;
+ pThis->cRefs = 1;
+ pThis->pTarget = pTarget;
+ pThis->hTrustedStore = NIL_RTCRSTORE;
+ pThis->hUntrustedStore = NIL_RTCRSTORE;
+ pThis->cInitialExplicitPolicy = UINT32_MAX;
+ pThis->cInitialPolicyMappingInhibit = UINT32_MAX;
+ pThis->cInitialInhibitAnyPolicy = UINT32_MAX;
+ pThis->rc = VINF_SUCCESS;
+ RTListInit(&pThis->LeafList);
+ *phCertPaths = pThis;
+ return VINF_SUCCESS;
+ }
+ return rc;
+ }
+ return VERR_NO_MEMORY;
+}
+
+
+RTDECL(uint32_t) RTCrX509CertPathsRetain(RTCRX509CERTPATHS hCertPaths)
+{
+ PRTCRX509CERTPATHSINT pThis = hCertPaths;
+ AssertPtrReturn(pThis, UINT32_MAX);
+
+ uint32_t cRefs = ASMAtomicIncU32(&pThis->cRefs);
+ Assert(cRefs > 0 && cRefs < 64);
+ return cRefs;
+}
+
+
+RTDECL(uint32_t) RTCrX509CertPathsRelease(RTCRX509CERTPATHS hCertPaths)
+{
+ uint32_t cRefs;
+ if (hCertPaths != NIL_RTCRX509CERTPATHS)
+ {
+ PRTCRX509CERTPATHSINT pThis = hCertPaths;
+ AssertPtrReturn(pThis, UINT32_MAX);
+ AssertReturn(pThis->u32Magic == RTCRX509CERTPATHSINT_MAGIC, UINT32_MAX);
+
+ cRefs = ASMAtomicDecU32(&pThis->cRefs);
+ Assert(cRefs < 64);
+ if (!cRefs)
+ {
+ /*
+ * No more references, destroy the whole thing.
+ */
+ ASMAtomicWriteU32(&pThis->u32Magic, ~RTCRX509CERTPATHSINT_MAGIC);
+
+ /* config */
+ pThis->pTarget = NULL; /* Referencing user memory. */
+ pThis->pTrustedCert = NULL; /* Referencing user memory. */
+ RTCrStoreRelease(pThis->hTrustedStore);
+ pThis->hTrustedStore = NIL_RTCRSTORE;
+ RTCrStoreRelease(pThis->hUntrustedStore);
+ pThis->hUntrustedStore = NIL_RTCRSTORE;
+ pThis->paUntrustedCerts = NULL; /* Referencing user memory. */
+ pThis->papInitialUserPolicySet = NULL; /* Referencing user memory. */
+ pThis->pInitialPermittedSubtrees = NULL; /* Referencing user memory. */
+ pThis->pInitialExcludedSubtrees = NULL; /* Referencing user memory. */
+
+ /* builder */
+ rtCrX509CertPathsDestroyTree(pThis);
+
+ /* validator */
+ rtCrX509CpvCleanup(pThis);
+
+ /* misc */
+ RTAsn1VtDelete(&pThis->AnyPolicyObjId.Asn1Core);
+
+ /* Finally, the instance itself. */
+ RTMemFree(pThis);
+ }
+ }
+ else
+ cRefs = 0;
+ return cRefs;
+}
+
+
+
+RTDECL(int) RTCrX509CertPathsSetTrustedStore(RTCRX509CERTPATHS hCertPaths, RTCRSTORE hTrustedStore)
+{
+ PRTCRX509CERTPATHSINT pThis = hCertPaths;
+ AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
+ AssertReturn(pThis->u32Magic == RTCRX509CERTPATHSINT_MAGIC, VERR_INVALID_HANDLE);
+ AssertReturn(pThis->pRoot == NULL, VERR_WRONG_ORDER);
+
+ if (pThis->hTrustedStore != NIL_RTCRSTORE)
+ {
+ RTCrStoreRelease(pThis->hTrustedStore);
+ pThis->hTrustedStore = NIL_RTCRSTORE;
+ }
+ if (hTrustedStore != NIL_RTCRSTORE)
+ {
+ AssertReturn(RTCrStoreRetain(hTrustedStore) != UINT32_MAX, VERR_INVALID_HANDLE);
+ pThis->hTrustedStore = hTrustedStore;
+ }
+ return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTCrX509CertPathsSetUntrustedStore(RTCRX509CERTPATHS hCertPaths, RTCRSTORE hUntrustedStore)
+{
+ PRTCRX509CERTPATHSINT pThis = hCertPaths;
+ AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
+ AssertReturn(pThis->u32Magic == RTCRX509CERTPATHSINT_MAGIC, VERR_INVALID_HANDLE);
+ AssertReturn(pThis->pRoot == NULL, VERR_WRONG_ORDER);
+
+ if (pThis->hUntrustedStore != NIL_RTCRSTORE)
+ {
+ RTCrStoreRelease(pThis->hUntrustedStore);
+ pThis->hUntrustedStore = NIL_RTCRSTORE;
+ }
+ if (hUntrustedStore != NIL_RTCRSTORE)
+ {
+ AssertReturn(RTCrStoreRetain(hUntrustedStore) != UINT32_MAX, VERR_INVALID_HANDLE);
+ pThis->hUntrustedStore = hUntrustedStore;
+ }
+ return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTCrX509CertPathsSetUntrustedArray(RTCRX509CERTPATHS hCertPaths, PCRTCRX509CERTIFICATE paCerts, uint32_t cCerts)
+{
+ PRTCRX509CERTPATHSINT pThis = hCertPaths;
+ AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
+ AssertReturn(pThis->u32Magic == RTCRX509CERTPATHSINT_MAGIC, VERR_INVALID_HANDLE);
+
+ pThis->paUntrustedCerts = paCerts;
+ pThis->cUntrustedCerts = cCerts;
+ return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTCrX509CertPathsSetValidTime(RTCRX509CERTPATHS hCertPaths, PCRTTIME pTime)
+{
+ PRTCRX509CERTPATHSINT pThis = hCertPaths;
+ AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
+ AssertReturn(pThis->u32Magic == RTCRX509CERTPATHSINT_MAGIC, VERR_INVALID_HANDLE);
+ AssertReturn(pThis->pRoot == NULL, VERR_WRONG_ORDER);
+
+ if (pTime)
+ {
+ if (RTTimeImplode(&pThis->ValidTime, pTime))
+ return VERR_INVALID_PARAMETER;
+ pThis->fFlags |= RTCRX509CERTPATHSINT_F_VALID_TIME;
+ }
+ else
+ pThis->fFlags &= ~RTCRX509CERTPATHSINT_F_VALID_TIME;
+ return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTCrX509CertPathsSetValidTimeSpec(RTCRX509CERTPATHS hCertPaths, PCRTTIMESPEC pTimeSpec)
+{
+ PRTCRX509CERTPATHSINT pThis = hCertPaths;
+ AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
+ AssertReturn(pThis->u32Magic == RTCRX509CERTPATHSINT_MAGIC, VERR_INVALID_HANDLE);
+ AssertReturn(pThis->pRoot == NULL, VERR_WRONG_ORDER);
+
+ if (pTimeSpec)
+ {
+ pThis->ValidTime = *pTimeSpec;
+ pThis->fFlags |= RTCRX509CERTPATHSINT_F_VALID_TIME;
+ }
+ else
+ pThis->fFlags &= ~RTCRX509CERTPATHSINT_F_VALID_TIME;
+ return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTCrX509CertPathsCreateEx(PRTCRX509CERTPATHS phCertPaths, PCRTCRX509CERTIFICATE pTarget, RTCRSTORE hTrustedStore,
+ RTCRSTORE hUntrustedStore, PCRTCRX509CERTIFICATE paUntrustedCerts, uint32_t cUntrustedCerts,
+ PCRTTIMESPEC pValidTime)
+{
+ int rc = RTCrX509CertPathsCreate(phCertPaths, pTarget);
+ if (RT_SUCCESS(rc))
+ {
+ PRTCRX509CERTPATHSINT pThis = *phCertPaths;
+
+ rc = RTCrX509CertPathsSetTrustedStore(pThis, hTrustedStore);
+ if (RT_SUCCESS(rc))
+ {
+ rc = RTCrX509CertPathsSetUntrustedStore(pThis, hUntrustedStore);
+ if (RT_SUCCESS(rc))
+ {
+ rc = RTCrX509CertPathsSetUntrustedArray(pThis, paUntrustedCerts, cUntrustedCerts);
+ if (RT_SUCCESS(rc))
+ {
+ rc = RTCrX509CertPathsSetValidTimeSpec(pThis, pValidTime);
+ if (RT_SUCCESS(rc))
+ {
+ return VINF_SUCCESS;
+ }
+ }
+ RTCrStoreRelease(pThis->hUntrustedStore);
+ }
+ RTCrStoreRelease(pThis->hTrustedStore);
+ }
+ RTMemFree(pThis);
+ *phCertPaths = NIL_RTCRX509CERTPATHS;
+ }
+ return rc;
+}
+
+/** @} */
+
+
+
+/** @name Path Builder and Validator Common Utility Functions.
+ * @{
+ */
+
+/**
+ * Checks if the certificate is self-issued.
+ *
+ * @returns true / false.
+ * @param pNode The path node to check..
+ */
+static bool rtCrX509CertPathsIsSelfIssued(PRTCRX509CERTPATHNODE pNode)
+{
+ return pNode->pCert
+ && RTCrX509Name_MatchByRfc5280(&pNode->pCert->TbsCertificate.Subject, &pNode->pCert->TbsCertificate.Issuer);
+}
+
+/** @} */
+
+
+
+/** @name Path Builder Functions.
+ * @{
+ */
+
+/**
+ *
+ * @returns
+ * @param pThis .
+ */
+static PRTCRX509CERTPATHNODE rtCrX509CertPathsNewNode(PRTCRX509CERTPATHSINT pThis)
+{
+ PRTCRX509CERTPATHNODE pNode = (PRTCRX509CERTPATHNODE)RTMemAllocZ(sizeof(*pNode));
+ if (RT_LIKELY(pNode))
+ {
+ RTListInit(&pNode->SiblingEntry);
+ RTListInit(&pNode->ChildListOrLeafEntry);
+ pNode->rcVerify = VERR_CR_X509_NOT_VERIFIED;
+
+ return pNode;
+ }
+
+ pThis->rc = RTErrInfoSet(pThis->pErrInfo, VERR_NO_MEMORY, "No memory for path node");
+ return NULL;
+}
+
+
+static void rtCrX509CertPathsDestroyNode(PRTCRX509CERTPATHNODE pNode)
+{
+ if (pNode->pCertCtx)
+ {
+ RTCrCertCtxRelease(pNode->pCertCtx);
+ pNode->pCertCtx = NULL;
+ }
+ RT_ZERO(*pNode);
+ RTMemFree(pNode);
+}
+
+
+static void rtCrX509CertPathsAddIssuer(PRTCRX509CERTPATHSINT pThis, PRTCRX509CERTPATHNODE pParent,
+ PCRTCRX509CERTIFICATE pCert, PCRTCRCERTCTX pCertCtx, uint8_t uSrc)
+{
+ /*
+ * Check if we've seen this certificate already in the current path or
+ * among the already gathered issuers.
+ */
+ if (pCert)
+ {
+ /* No duplicate certificates in the path. */
+ PRTCRX509CERTPATHNODE pTmpNode = pParent;
+ while (pTmpNode)
+ {
+ Assert(pTmpNode->pCert);
+ if ( pTmpNode->pCert == pCert
+ || RTCrX509Certificate_Compare(pTmpNode->pCert, pCert) == 0)
+ return;
+ pTmpNode = pTmpNode->pParent;
+ }
+
+ /* No duplicate tree branches. */
+ RTListForEach(&pParent->ChildListOrLeafEntry, pTmpNode, RTCRX509CERTPATHNODE, SiblingEntry)
+ {
+ if (RTCrX509Certificate_Compare(pTmpNode->pCert, pCert) == 0)
+ return;
+ }
+ }
+ else
+ Assert(pCertCtx);
+
+ /*
+ * Reference the context core before making the allocation.
+ */
+ if (pCertCtx)
+ AssertReturnVoidStmt(RTCrCertCtxRetain(pCertCtx) != UINT32_MAX,
+ pThis->rc = RTErrInfoSetF(pThis->pErrInfo, VERR_CR_X509_CPB_BAD_CERT_CTX,
+ "Bad pCertCtx=%p", pCertCtx));
+
+ /*
+ * We haven't see it, append it as a child.
+ */
+ PRTCRX509CERTPATHNODE pNew = rtCrX509CertPathsNewNode(pThis);
+ if (pNew)
+ {
+ pNew->pParent = pParent;
+ pNew->pCert = pCert;
+ pNew->pCertCtx = pCertCtx;
+ pNew->uSrc = uSrc;
+ pNew->uDepth = pParent->uDepth + 1;
+ RTListAppend(&pParent->ChildListOrLeafEntry, &pNew->SiblingEntry);
+ }
+ else
+ RTCrCertCtxRelease(pCertCtx);
+}
+
+
+static void rtCrX509CertPathsGetIssuersFromStore(PRTCRX509CERTPATHSINT pThis, PRTCRX509CERTPATHNODE pNode,
+ PCRTCRX509NAME pIssuer, RTCRSTORE hStore, uint8_t uSrc)
+{
+ RTCRSTORECERTSEARCH Search;
+ int rc = RTCrStoreCertFindBySubjectOrAltSubjectByRfc5280(hStore, pIssuer, &Search);
+ if (RT_SUCCESS(rc))
+ {
+ PCRTCRCERTCTX pCertCtx;
+ while ((pCertCtx = RTCrStoreCertSearchNext(hStore, &Search)) != NULL)
+ {
+ if ( pCertCtx->pCert
+ || ( RTCRX509CERTPATHNODE_SRC_IS_TRUSTED(uSrc)
+ && pCertCtx->pTaInfo) )
+ rtCrX509CertPathsAddIssuer(pThis, pNode, pCertCtx->pCert, pCertCtx, uSrc);
+ RTCrCertCtxRelease(pCertCtx);
+ }
+ RTCrStoreCertSearchDestroy(hStore, &Search);
+ }
+}
+
+
+static void rtCrX509CertPathsGetIssuers(PRTCRX509CERTPATHSINT pThis, PRTCRX509CERTPATHNODE pNode)
+{
+ Assert(RTListIsEmpty(&pNode->ChildListOrLeafEntry));
+ Assert(!pNode->fLeaf);
+ Assert(pNode->pCert);
+
+ /*
+ * Don't recurse infintely.
+ */
+ if (RT_UNLIKELY(pNode->uDepth >= 50))
+ return;
+
+ PCRTCRX509NAME const pIssuer = &pNode->pCert->TbsCertificate.Issuer;
+
+ /*
+ * Trusted certificate.
+ */
+ if ( pThis->pTrustedCert
+ && RTCrX509Certificate_MatchSubjectOrAltSubjectByRfc5280(pThis->pTrustedCert, pIssuer))
+ rtCrX509CertPathsAddIssuer(pThis, pNode, pThis->pTrustedCert, NULL, RTCRX509CERTPATHNODE_SRC_TRUSTED_CERT);
+
+ /*
+ * Trusted certificate store.
+ */
+ if (pThis->hTrustedStore != NIL_RTCRSTORE)
+ rtCrX509CertPathsGetIssuersFromStore(pThis, pNode, pIssuer, pThis->hTrustedStore,
+ RTCRX509CERTPATHNODE_SRC_TRUSTED_STORE);
+
+ /*
+ * Untrusted store.
+ */
+ if (pThis->hUntrustedStore != NIL_RTCRSTORE)
+ rtCrX509CertPathsGetIssuersFromStore(pThis, pNode, pIssuer, pThis->hTrustedStore,
+ RTCRX509CERTPATHNODE_SRC_UNTRUSTED_STORE);
+
+ /*
+ * Untrusted array.
+ */
+ if (pThis->paUntrustedCerts)
+ for (uint32_t i = 0; i < pThis->cUntrustedCerts; i++)
+ if (RTCrX509Certificate_MatchSubjectOrAltSubjectByRfc5280(&pThis->paUntrustedCerts[i], pIssuer))
+ rtCrX509CertPathsAddIssuer(pThis, pNode, &pThis->paUntrustedCerts[i], NULL,
+ RTCRX509CERTPATHNODE_SRC_UNTRUSTED_ARRAY);
+}
+
+
+static PRTCRX509CERTPATHNODE rtCrX509CertPathsGetNextRightUp(PRTCRX509CERTPATHSINT pThis, PRTCRX509CERTPATHNODE pNode)
+{
+ for (;;)
+ {
+ /* The root node has no siblings. */
+ PRTCRX509CERTPATHNODE pParent = pNode->pParent;
+ if (!pNode->pParent)
+ return NULL;
+
+ /* Try go to the right. */
+ PRTCRX509CERTPATHNODE pNext = RTListGetNext(&pParent->ChildListOrLeafEntry, pNode, RTCRX509CERTPATHNODE, SiblingEntry);
+ if (pNext)
+ return pNext;
+
+ /* Up. */
+ pNode = pParent;
+ }
+}
+
+
+static PRTCRX509CERTPATHNODE rtCrX509CertPathsEliminatePath(PRTCRX509CERTPATHSINT pThis, PRTCRX509CERTPATHNODE pNode)
+{
+ for (;;)
+ {
+ Assert(RTListIsEmpty(&pNode->ChildListOrLeafEntry));
+
+ /* Don't remove the root node. */
+ PRTCRX509CERTPATHNODE pParent = pNode->pParent;
+ if (!pParent)
+ return NULL;
+
+ /* Before removing and deleting the node check if there is sibling
+ right to it that we should continue processing from. */
+ PRTCRX509CERTPATHNODE pNext = RTListGetNext(&pParent->ChildListOrLeafEntry, pNode, RTCRX509CERTPATHNODE, SiblingEntry);
+ RTListNodeRemove(&pNode->SiblingEntry);
+ rtCrX509CertPathsDestroyNode(pNode);
+
+ if (pNext)
+ return pNext;
+
+ /* If the parent node cannot be removed, do a normal get-next-rigth-up
+ to find the continuation point for the tree loop. */
+ if (!RTListIsEmpty(&pParent->ChildListOrLeafEntry))
+ return rtCrX509CertPathsGetNextRightUp(pThis, pParent);
+
+ pNode = pParent;
+ }
+}
+
+
+/**
+ * Destroys the whole path tree.
+ *
+ * @param pThis The path builder and verifier instance.
+ */
+static void rtCrX509CertPathsDestroyTree(PRTCRX509CERTPATHSINT pThis)
+{
+ PRTCRX509CERTPATHNODE pNode, pNextLeaf;
+ RTListForEachSafe(&pThis->LeafList, pNode, pNextLeaf, RTCRX509CERTPATHNODE, ChildListOrLeafEntry)
+ {
+ RTListNodeRemove(&pNode->ChildListOrLeafEntry);
+ RTListInit(&pNode->ChildListOrLeafEntry);
+
+ for (;;)
+ {
+ PRTCRX509CERTPATHNODE pParent = pNode->pParent;
+
+ RTListNodeRemove(&pNode->SiblingEntry);
+ rtCrX509CertPathsDestroyNode(pNode);
+
+ if (!pParent)
+ {
+ pThis->pRoot = NULL;
+ break;
+ }
+
+ if (!RTListIsEmpty(&pParent->ChildListOrLeafEntry))
+ break;
+
+ pNode = pParent;
+ }
+ }
+ Assert(!pThis->pRoot);
+}
+
+
+/**
+ * Adds a leaf node.
+ *
+ * This should normally be a trusted certificate, but the caller can also
+ * request the incomplete paths, in which case this will be an untrusted
+ * certificate.
+ *
+ * @returns Pointer to the next node in the tree to process.
+ * @param pThis The path builder instance.
+ * @param pNode The leaf node.
+ */
+static PRTCRX509CERTPATHNODE rtCrX509CertPathsAddLeaf(PRTCRX509CERTPATHSINT pThis, PRTCRX509CERTPATHNODE pNode)
+{
+ pNode->fLeaf = true;
+
+ /*
+ * Priority insert by source and depth.
+ */
+ PRTCRX509CERTPATHNODE pCurLeaf;
+ RTListForEach(&pThis->LeafList, pCurLeaf, RTCRX509CERTPATHNODE, ChildListOrLeafEntry)
+ {
+ if ( pNode->uSrc > pCurLeaf->uSrc
+ || ( pNode->uSrc == pCurLeaf->uSrc
+ && pNode->uDepth < pCurLeaf->uDepth) )
+ {
+ RTListNodeInsertBefore(&pCurLeaf->ChildListOrLeafEntry, &pNode->ChildListOrLeafEntry);
+ pThis->cPaths++;
+ return rtCrX509CertPathsGetNextRightUp(pThis, pNode);
+ }
+ }
+
+ RTListAppend(&pThis->LeafList, &pNode->ChildListOrLeafEntry);
+ pThis->cPaths++;
+ return rtCrX509CertPathsGetNextRightUp(pThis, pNode);
+}
+
+
+
+RTDECL(int) RTCrX509CertPathsBuild(RTCRX509CERTPATHS hCertPaths, PRTERRINFO pErrInfo)
+{
+ /*
+ * Validate the input.
+ */
+ PRTCRX509CERTPATHSINT pThis = hCertPaths;
+ AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
+ AssertReturn(pThis->u32Magic == RTCRX509CERTPATHSINT_MAGIC, VERR_INVALID_HANDLE);
+ AssertReturn(!(pThis->fFlags & ~RTCRX509CERTPATHSINT_F_VALID_MASK), VERR_INVALID_PARAMETER);
+ AssertReturn( (pThis->paUntrustedCerts == NULL && pThis->cUntrustedCerts == 0)
+ || (pThis->paUntrustedCerts != NULL && pThis->cUntrustedCerts > 0),
+ VERR_INVALID_PARAMETER);
+ AssertReturn(RTListIsEmpty(&pThis->LeafList), VERR_INVALID_PARAMETER);
+ AssertReturn(pThis->pRoot == NULL, VERR_INVALID_PARAMETER);
+ AssertReturn(pThis->rc == VINF_SUCCESS, pThis->rc);
+ AssertPtrReturn(pThis->pTarget, VERR_INVALID_PARAMETER);
+ Assert(RT_SUCCESS(RTCrX509Certificate_CheckSanity(pThis->pTarget, 0, NULL, NULL)));
+
+ /*
+ * Set up the target.
+ */
+ PRTCRX509CERTPATHNODE pCur;
+ pThis->pRoot = pCur = rtCrX509CertPathsNewNode(pThis);
+ if (pThis->pRoot)
+ {
+ pCur->pCert = pThis->pTarget;
+ pCur->uDepth = 0;
+ pCur->uSrc = RTCRX509CERTPATHNODE_SRC_TARGET;
+
+ pThis->pErrInfo = pErrInfo;
+
+ /*
+ * The tree construction loop.
+ * Walks down, up, and right as the tree is constructed.
+ */
+ do
+ {
+ /*
+ * Check for the two leaf cases first.
+ */
+ if (RTCRX509CERTPATHNODE_SRC_IS_TRUSTED(pCur->uSrc))
+ pCur = rtCrX509CertPathsAddLeaf(pThis, pCur);
+#if 0 /* This isn't right.*/
+ else if (rtCrX509CertPathsIsSelfIssued(pCur))
+ {
+ if (pThis->fFlags & RTCRX509CERTPATHSINT_F_ELIMINATE_UNTRUSTED_PATHS)
+ pCur = rtCrX509CertPathsEliminatePath(pThis, pCur);
+ else
+ pCur = rtCrX509CertPathsAddLeaf(pThis, pCur);
+ }
+#endif
+ /*
+ * Not a leaf, find all potential issuers and decend into these.
+ */
+ else
+ {
+ rtCrX509CertPathsGetIssuers(pThis, pCur);
+ if (RT_FAILURE(pThis->rc))
+ break;
+
+ if (!RTListIsEmpty(&pCur->ChildListOrLeafEntry))
+ pCur = RTListGetFirst(&pCur->ChildListOrLeafEntry, RTCRX509CERTPATHNODE, SiblingEntry);
+ else if (pThis->fFlags & RTCRX509CERTPATHSINT_F_ELIMINATE_UNTRUSTED_PATHS)
+ pCur = rtCrX509CertPathsEliminatePath(pThis, pCur);
+ else
+ pCur = rtCrX509CertPathsAddLeaf(pThis, pCur);
+ }
+ } while (pCur);
+
+ pThis->pErrInfo = NULL;
+ if (RT_SUCCESS(pThis->rc))
+ return VINF_SUCCESS;
+ }
+ else
+ Assert(RT_FAILURE_NP(pThis->rc));
+ return pThis->rc;
+}
+
+
+/**
+ * Looks up path by leaf/path index.
+ *
+ * @returns Pointer to the leaf node of the path.
+ * @param pThis The path builder & validator instance.
+ * @param iPath The oridnal of the path to get.
+ */
+static PRTCRX509CERTPATHNODE rtCrX509CertPathsGetLeafByIndex(PRTCRX509CERTPATHSINT pThis, uint32_t iPath)
+{
+ Assert(iPath < pThis->cPaths);
+
+ uint32_t iCurPath = 0;
+ PRTCRX509CERTPATHNODE pCurLeaf;
+ RTListForEach(&pThis->LeafList, pCurLeaf, RTCRX509CERTPATHNODE, ChildListOrLeafEntry)
+ {
+ if (iCurPath == iPath)
+ return pCurLeaf;
+ iCurPath++;
+ }
+
+ AssertFailedReturn(NULL);
+}
+
+
+static void rtDumpPrintf(PFNRTDUMPPRINTFV pfnPrintfV, void *pvUser, const char *pszFormat, ...)
+{
+ va_list va;
+ va_start(va, pszFormat);
+ pfnPrintfV(pvUser, pszFormat, va);
+ va_end(va);
+}
+
+
+static void rtDumpIndent(PFNRTDUMPPRINTFV pfnPrintfV, void *pvUser, uint32_t cchSpaces, const char *pszFormat, ...)
+{
+ static const char s_szSpaces[] = " ";
+ while (cchSpaces > 0)
+ {
+ uint32_t cchBurst = RT_MIN(sizeof(s_szSpaces) - 1, cchSpaces);
+ rtDumpPrintf(pfnPrintfV, pvUser, &s_szSpaces[sizeof(s_szSpaces) - cchBurst - 1]);
+ cchSpaces -= cchBurst;
+ }
+
+ va_list va;
+ va_start(va, pszFormat);
+ pfnPrintfV(pvUser, pszFormat, va);
+ va_end(va);
+}
+
+/** @name X.500 attribute types
+ * See RFC-4519 among others.
+ * @{ */
+#define RTCRX500_ID_AT_OBJECT_CLASS_OID "2.5.4.0"
+#define RTCRX500_ID_AT_ALIASED_ENTRY_NAME_OID "2.5.4.1"
+#define RTCRX500_ID_AT_KNOWLDGEINFORMATION_OID "2.5.4.2"
+#define RTCRX500_ID_AT_COMMON_NAME_OID "2.5.4.3"
+#define RTCRX500_ID_AT_SURNAME_OID "2.5.4.4"
+#define RTCRX500_ID_AT_SERIAL_NUMBER_OID "2.5.4.5"
+#define RTCRX500_ID_AT_COUNTRY_NAME_OID "2.5.4.6"
+#define RTCRX500_ID_AT_LOCALITY_NAME_OID "2.5.4.7"
+#define RTCRX500_ID_AT_STATE_OR_PROVINCE_NAME_OID "2.5.4.8"
+#define RTCRX500_ID_AT_STREET_ADDRESS_OID "2.5.4.9"
+#define RTCRX500_ID_AT_ORGANIZATION_NAME_OID "2.5.4.10"
+#define RTCRX500_ID_AT_ORGANIZATION_UNIT_NAME_OID "2.5.4.11"
+#define RTCRX500_ID_AT_TITLE_OID "2.5.4.12"
+#define RTCRX500_ID_AT_DESCRIPTION_OID "2.5.4.13"
+#define RTCRX500_ID_AT_SEARCH_GUIDE_OID "2.5.4.14"
+#define RTCRX500_ID_AT_BUSINESS_CATEGORY_OID "2.5.4.15"
+#define RTCRX500_ID_AT_POSTAL_ADDRESS_OID "2.5.4.16"
+#define RTCRX500_ID_AT_POSTAL_CODE_OID "2.5.4.17"
+#define RTCRX500_ID_AT_POST_OFFICE_BOX_OID "2.5.4.18"
+#define RTCRX500_ID_AT_PHYSICAL_DELIVERY_OFFICE_NAME_OID "2.5.4.19"
+#define RTCRX500_ID_AT_TELEPHONE_NUMBER_OID "2.5.4.20"
+#define RTCRX500_ID_AT_TELEX_NUMBER_OID "2.5.4.21"
+#define RTCRX500_ID_AT_TELETEX_TERMINAL_IDENTIFIER_OID "2.5.4.22"
+#define RTCRX500_ID_AT_FACIMILE_TELEPHONE_NUMBER_OID "2.5.4.23"
+#define RTCRX500_ID_AT_X121_ADDRESS_OID "2.5.4.24"
+#define RTCRX500_ID_AT_INTERNATIONAL_ISDN_NUMBER_OID "2.5.4.25"
+#define RTCRX500_ID_AT_REGISTERED_ADDRESS_OID "2.5.4.26"
+#define RTCRX500_ID_AT_DESTINATION_INDICATOR_OID "2.5.4.27"
+#define RTCRX500_ID_AT_PREFERRED_DELIVERY_METHOD_OID "2.5.4.28"
+#define RTCRX500_ID_AT_PRESENTATION_ADDRESS_OID "2.5.4.29"
+#define RTCRX500_ID_AT_SUPPORTED_APPLICATION_CONTEXT_OID "2.5.4.30"
+#define RTCRX500_ID_AT_MEMBER_OID "2.5.4.31"
+#define RTCRX500_ID_AT_OWNER_OID "2.5.4.32"
+#define RTCRX500_ID_AT_ROLE_OCCUPANT_OID "2.5.4.33"
+#define RTCRX500_ID_AT_SEE_ALSO_OID "2.5.4.34"
+#define RTCRX500_ID_AT_USER_PASSWORD_OID "2.5.4.35"
+#define RTCRX500_ID_AT_USER_CERTIFICATE_OID "2.5.4.36"
+#define RTCRX500_ID_AT_CA_CERTIFICATE_OID "2.5.4.37"
+#define RTCRX500_ID_AT_AUTHORITY_REVOCATION_LIST_OID "2.5.4.38"
+#define RTCRX500_ID_AT_CERTIFICATE_REVOCATION_LIST_OID "2.5.4.39"
+#define RTCRX500_ID_AT_CROSS_CERTIFICATE_PAIR_OID "2.5.4.40"
+#define RTCRX500_ID_AT_NAME_OID "2.5.4.41"
+#define RTCRX500_ID_AT_GIVEN_NAME_OID "2.5.4.42"
+#define RTCRX500_ID_AT_INITIALS_OID "2.5.4.43"
+#define RTCRX500_ID_AT_GENERATION_QUALIFIER_OID "2.5.4.44"
+#define RTCRX500_ID_AT_UNIQUE_IDENTIFIER_OID "2.5.4.45"
+#define RTCRX500_ID_AT_DN_QUALIFIER_OID "2.5.4.46"
+#define RTCRX500_ID_AT_ENHANCHED_SEARCH_GUIDE_OID "2.5.4.47"
+#define RTCRX500_ID_AT_PROTOCOL_INFORMATION_OID "2.5.4.48"
+#define RTCRX500_ID_AT_DISTINGUISHED_NAME_OID "2.5.4.49"
+#define RTCRX500_ID_AT_UNIQUE_MEMBER_OID "2.5.4.50"
+#define RTCRX500_ID_AT_HOUSE_IDENTIFIER_OID "2.5.4.51"
+#define RTCRX500_ID_AT_SUPPORTED_ALGORITHMS_OID "2.5.4.52"
+#define RTCRX500_ID_AT_DELTA_REVOCATION_LIST_OID "2.5.4.53"
+#define RTCRX500_ID_AT_ATTRIBUTE_CERTIFICATE_OID "2.5.4.58"
+#define RTCRX500_ID_AT_PSEUDONYM_OID "2.5.4.65"
+/** @} */
+
+
+static void rtCrX509NameDump(PCRTCRX509NAME pName, PFNRTDUMPPRINTFV pfnPrintfV, void *pvUser)
+{
+ for (uint32_t i = 0; i < pName->cItems; i++)
+ for (uint32_t j = 0; j < pName->paItems[i].cItems; j++)
+ {
+ PRTCRX509ATTRIBUTETYPEANDVALUE pAttrib = &pName->paItems[i].paItems[j];
+
+ const char *pszType = pAttrib->Type.szObjId;
+ if ( !strncmp(pAttrib->Type.szObjId, "2.5.4.", 6)
+ && (pAttrib->Type.szObjId[8] == '\0' || pAttrib->Type.szObjId[9] == '\0'))
+ {
+ switch (RTStrToUInt8(&pAttrib->Type.szObjId[6]))
+ {
+ case 3: pszType = "cn"; break;
+ case 4: pszType = "sn"; break;
+ case 5: pszType = "serialNumber"; break;
+ case 6: pszType = "c"; break;
+ case 7: pszType = "l"; break;
+ case 8: pszType = "st"; break;
+ case 9: pszType = "street"; break;
+ case 10: pszType = "o"; break;
+ case 11: pszType = "ou"; break;
+ case 13: pszType = "description"; break;
+ case 15: pszType = "businessCategory"; break;
+ case 16: pszType = "postalAddress"; break;
+ case 17: pszType = "postalCode"; break;
+ case 18: pszType = "postOfficeBox"; break;
+ case 20: pszType = "telephoneNumber"; break;
+ case 26: pszType = "registeredAddress"; break;
+ case 31: pszType = "member"; break;
+ case 41: pszType = "name"; break;
+ case 42: pszType = "givenName"; break;
+ case 43: pszType = "initials"; break;
+ case 45: pszType = "x500UniqueIdentifier"; break;
+ case 50: pszType = "uniqueMember"; break;
+ }
+ }
+ rtDumpPrintf(pfnPrintfV, pvUser, "/%s=", pszType);
+ if (pAttrib->Value.enmType == RTASN1TYPE_STRING)
+ {
+ if (pAttrib->Value.u.String.pszUtf8)
+ rtDumpPrintf(pfnPrintfV, pvUser, "%s", pAttrib->Value.u.String.pszUtf8);
+ else
+ {
+ const char *pch = pAttrib->Value.u.String.Asn1Core.uData.pch;
+ uint32_t cch = pAttrib->Value.u.String.Asn1Core.cb;
+ int rc = RTStrValidateEncodingEx(pch, cch, 0);
+ if (RT_SUCCESS(rc) && cch)
+ rtDumpPrintf(pfnPrintfV, pvUser, "%.*s", (size_t)cch, pch);
+ else
+ while (cch > 0)
+ {
+ if (RT_C_IS_PRINT(*pch))
+ rtDumpPrintf(pfnPrintfV, pvUser, "%c", *pch);
+ else
+ rtDumpPrintf(pfnPrintfV, pvUser, "\\x%02x", *pch);
+ cch--;
+ pch++;
+ }
+ }
+ }
+ else
+ rtDumpPrintf(pfnPrintfV, pvUser, "<not-string: uTag=%#x>", pAttrib->Value.u.Core.uTag);
+ }
+}
+
+
+static const char *rtCrX509CertPathsNodeGetSourceName(PRTCRX509CERTPATHNODE pNode)
+{
+ switch (pNode->uSrc)
+ {
+ case RTCRX509CERTPATHNODE_SRC_TARGET: return "target";
+ case RTCRX509CERTPATHNODE_SRC_UNTRUSTED_ARRAY: return "untrusted_array";
+ case RTCRX509CERTPATHNODE_SRC_UNTRUSTED_STORE: return "untrusted_store";
+ case RTCRX509CERTPATHNODE_SRC_TRUSTED_STORE: return "trusted_store";
+ case RTCRX509CERTPATHNODE_SRC_TRUSTED_CERT: return "trusted_cert";
+ default: return "invalid";
+ }
+}
+
+
+static void rtCrX509CertPathsDumpOneWorker(PRTCRX509CERTPATHSINT pThis, uint32_t iPath, PRTCRX509CERTPATHNODE pCurLeaf,
+ uint32_t uVerbosity, PFNRTDUMPPRINTFV pfnPrintfV, void *pvUser)
+{
+ rtDumpPrintf(pfnPrintfV, pvUser, "Path #%u: %s, %u deep, rcVerify=%Rrc\n",
+ iPath, RTCRX509CERTPATHNODE_SRC_IS_TRUSTED(pCurLeaf->uSrc) ? "trusted" : "untrusted", pCurLeaf->uDepth,
+ pCurLeaf->rcVerify);
+
+ for (uint32_t iIndent = 2; pCurLeaf; iIndent += 2, pCurLeaf = pCurLeaf->pParent)
+ {
+ if (pCurLeaf->pCert)
+ {
+ rtDumpIndent(pfnPrintfV, pvUser, iIndent, "Issuer : ");
+ rtCrX509NameDump(&pCurLeaf->pCert->TbsCertificate.Issuer, pfnPrintfV, pvUser);
+ rtDumpPrintf(pfnPrintfV, pvUser, "\n");
+
+ rtDumpIndent(pfnPrintfV, pvUser, iIndent, "Subject: ");
+ rtCrX509NameDump(&pCurLeaf->pCert->TbsCertificate.Subject, pfnPrintfV, pvUser);
+ rtDumpPrintf(pfnPrintfV, pvUser, "\n");
+
+ if (uVerbosity >= 4)
+ RTAsn1Dump(&pCurLeaf->pCert->SeqCore.Asn1Core, 0, iIndent, pfnPrintfV, pvUser);
+ else if (uVerbosity >= 3)
+ RTAsn1Dump(&pCurLeaf->pCert->TbsCertificate.T3.Extensions.SeqCore.Asn1Core, 0, iIndent, pfnPrintfV, pvUser);
+ }
+ else
+ {
+ Assert(pCurLeaf->pCertCtx); Assert(pCurLeaf->pCertCtx->pTaInfo);
+ rtDumpIndent(pfnPrintfV, pvUser, iIndent, "Subject: ");
+ rtCrX509NameDump(&pCurLeaf->pCertCtx->pTaInfo->CertPath.TaName, pfnPrintfV, pvUser);
+
+ if (uVerbosity >= 4)
+ RTAsn1Dump(&pCurLeaf->pCertCtx->pTaInfo->SeqCore.Asn1Core, 0, iIndent, pfnPrintfV, pvUser);
+ }
+
+ const char *pszSrc = rtCrX509CertPathsNodeGetSourceName(pCurLeaf);
+ rtDumpIndent(pfnPrintfV, pvUser, iIndent, "Source : %s\n", pszSrc);
+ }
+}
+
+
+RTDECL(int) RTCrX509CertPathsDumpOne(RTCRX509CERTPATHS hCertPaths, uint32_t iPath, uint32_t uVerbosity,
+ PFNRTDUMPPRINTFV pfnPrintfV, void *pvUser)
+{
+ /*
+ * Validate the input.
+ */
+ PRTCRX509CERTPATHSINT pThis = hCertPaths;
+ AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
+ AssertReturn(pThis->u32Magic == RTCRX509CERTPATHSINT_MAGIC, VERR_INVALID_HANDLE);
+ AssertPtrReturn(pfnPrintfV, VERR_INVALID_POINTER);
+ int rc;
+ if (iPath < pThis->cPaths)
+ {
+ PRTCRX509CERTPATHNODE pLeaf = rtCrX509CertPathsGetLeafByIndex(pThis, iPath);
+ if (pLeaf)
+ {
+ rtCrX509CertPathsDumpOneWorker(pThis, iPath, pLeaf, uVerbosity, pfnPrintfV, pvUser);
+ rc = VINF_SUCCESS;
+ }
+ else
+ rc = VERR_CR_X509_CERTPATHS_INTERNAL_ERROR;
+ }
+ else
+ rc = VERR_NOT_FOUND;
+ return rc;
+}
+
+
+RTDECL(int) RTCrX509CertPathsDumpAll(RTCRX509CERTPATHS hCertPaths, uint32_t uVerbosity, PFNRTDUMPPRINTFV pfnPrintfV, void *pvUser)
+{
+ /*
+ * Validate the input.
+ */
+ PRTCRX509CERTPATHSINT pThis = hCertPaths;
+ AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
+ AssertReturn(pThis->u32Magic == RTCRX509CERTPATHSINT_MAGIC, VERR_INVALID_HANDLE);
+ AssertPtrReturn(pfnPrintfV, VERR_INVALID_POINTER);
+
+ /*
+ * Dump all the paths.
+ */
+ rtDumpPrintf(pfnPrintfV, pvUser, "%u paths, rc=%Rrc\n", pThis->cPaths, pThis->rc);
+ uint32_t iPath = 0;
+ PRTCRX509CERTPATHNODE pCurLeaf, pNextLeaf;
+ RTListForEachSafe(&pThis->LeafList, pCurLeaf, pNextLeaf, RTCRX509CERTPATHNODE, ChildListOrLeafEntry)
+ {
+ rtCrX509CertPathsDumpOneWorker(pThis, iPath, pCurLeaf, uVerbosity, pfnPrintfV, pvUser);
+ iPath++;
+ }
+
+ return VINF_SUCCESS;
+}
+
+
+/** @} */
+
+
+/** @name Path Validator Functions.
+ * @{
+ */
+
+
+static void *rtCrX509CpvAllocZ(PRTCRX509CERTPATHSINT pThis, size_t cb, const char *pszWhat)
+{
+ void *pv = RTMemAllocZ(cb);
+ if (!pv)
+ pThis->rc = RTErrInfoSetF(pThis->pErrInfo, VERR_NO_MEMORY, "Failed to allocate %zu bytes for %s", cb, pszWhat);
+ return pv;
+}
+
+
+DECL_NO_INLINE(static, bool) rtCrX509CpvFailed(PRTCRX509CERTPATHSINT pThis, int rc, const char *pszFormat, ...)
+{
+ va_list va;
+ va_start(va, pszFormat);
+ pThis->rc = RTErrInfoSetV(pThis->pErrInfo, rc, pszFormat, va);
+ va_end(va);
+ return false;
+}
+
+
+/**
+ * Adds a sequence of excluded sub-trees.
+ *
+ * Don't waste time optimizing the output if this is supposed to be a union.
+ * Unless the path is very long, it's a lot more work to optimize and the result
+ * will be the same anyway.
+ *
+ * @returns success indicator.
+ * @param pThis The validator instance.
+ * @param pSubtrees The sequence of sub-trees to add.
+ */
+static bool rtCrX509CpvAddExcludedSubtrees(PRTCRX509CERTPATHSINT pThis, PCRTCRX509GENERALSUBTREES pSubtrees)
+{
+ if (((pThis->v.cExcludedSubtrees + 1) & 0xf) == 0)
+ {
+ void *pvNew = RTMemRealloc(pThis->v.papExcludedSubtrees,
+ (pThis->v.cExcludedSubtrees + 16) * sizeof(pThis->v.papExcludedSubtrees[0]));
+ if (RT_UNLIKELY(!pvNew))
+ return rtCrX509CpvFailed(pThis, VERR_NO_MEMORY, "Error growing subtrees pointer array to %u elements",
+ pThis->v.cExcludedSubtrees + 16);
+ pThis->v.papExcludedSubtrees = (PCRTCRX509GENERALSUBTREES *)pvNew;
+ }
+ pThis->v.papExcludedSubtrees[pThis->v.cExcludedSubtrees] = pSubtrees;
+ pThis->v.cExcludedSubtrees++;
+ return true;
+}
+
+
+/**
+ * Checks if a sub-tree is according to RFC-5280.
+ *
+ * @returns Success indiciator.
+ * @param pThis The validator instance.
+ * @param pSubtree The subtree to check.
+ */
+static bool rtCrX509CpvCheckSubtreeValidity(PRTCRX509CERTPATHSINT pThis, PCRTCRX509GENERALSUBTREE pSubtree)
+{
+ if ( pSubtree->Base.enmChoice <= RTCRX509GENERALNAMECHOICE_INVALID
+ || pSubtree->Base.enmChoice >= RTCRX509GENERALNAMECHOICE_END)
+ return rtCrX509CpvFailed(pThis, VERR_CR_X509_CPV_UNEXP_GENERAL_SUBTREE_CHOICE,
+ "Unexpected GeneralSubtree choice %#x", pSubtree->Base.enmChoice);
+
+ if (RTAsn1Integer_UnsignedCompareWithU32(&pSubtree->Minimum, 0) != 0)
+ return rtCrX509CpvFailed(pThis, VERR_CR_X509_CPV_UNEXP_GENERAL_SUBTREE_MIN,
+ "Unexpected GeneralSubtree Minimum value: %#llx",
+ pSubtree->Minimum.uValue);
+
+ if (RTAsn1Integer_IsPresent(&pSubtree->Maximum))
+ return rtCrX509CpvFailed(pThis, VERR_CR_X509_CPV_UNEXP_GENERAL_SUBTREE_MAX,
+ "Unexpected GeneralSubtree Maximum value: %#llx",
+ pSubtree->Maximum.uValue);
+
+ return true;
+}
+
+
+/**
+ * Grows the array of permitted sub-trees.
+ *
+ * @returns success indiciator.
+ * @param pThis The validator instance.
+ * @param cAdding The number of subtrees we should grow by
+ * (relative to the current number of valid
+ * entries).
+ */
+static bool rtCrX509CpvGrowPermittedSubtrees(PRTCRX509CERTPATHSINT pThis, uint32_t cAdding)
+{
+ uint32_t cNew = RT_ALIGN_32(pThis->v.cPermittedSubtrees + cAdding, 16);
+ if (cNew > pThis->v.cPermittedSubtreesAlloc)
+ {
+ if (cNew >= _4K)
+ return rtCrX509CpvFailed(pThis, VERR_NO_MEMORY, "Too many permitted subtrees: %u (cur %u)",
+ cNew, pThis->v.cPermittedSubtrees);
+ void *pvNew = RTMemRealloc(pThis->v.papPermittedSubtrees, cNew * sizeof(pThis->v.papPermittedSubtrees[0]));
+ if (RT_UNLIKELY(!pvNew))
+ return rtCrX509CpvFailed(pThis, VERR_NO_MEMORY, "Error growing subtrees pointer array from %u to %u elements",
+ pThis->v.cPermittedSubtreesAlloc, cNew);
+ pThis->v.papPermittedSubtrees = (PCRTCRX509GENERALSUBTREE *)pvNew;
+ }
+ return true;
+}
+
+
+/**
+ * Adds a sequence of permitted sub-trees.
+ *
+ * We store reference to each individual sub-tree because we must support
+ * intersection calculation.
+ *
+ * @returns success indiciator.
+ * @param pThis The validator instance.
+ * @param cSubtrees The number of sub-trees to add.
+ * @param paSubtrees Array of sub-trees to add.
+ */
+static bool rtCrX509CpvAddPermittedSubtrees(PRTCRX509CERTPATHSINT pThis, uint32_t cSubtrees, PCRTCRX509GENERALSUBTREE paSubtrees)
+{
+ /*
+ * If the array is empty, assume no permitted names.
+ */
+ if (!cSubtrees)
+ {
+ pThis->v.fNoPermittedSubtrees = true;
+ return true;
+ }
+
+ /*
+ * Grow the array if necessary.
+ */
+ if (!rtCrX509CpvGrowPermittedSubtrees(pThis, cSubtrees))
+ return false;
+
+ /*
+ * Append each subtree to the array.
+ */
+ uint32_t iDst = pThis->v.cPermittedSubtrees;
+ for (uint32_t iSrc = 0; iSrc < cSubtrees; iSrc++)
+ {
+ if (!rtCrX509CpvCheckSubtreeValidity(pThis, &paSubtrees[iSrc]))
+ return false;
+ pThis->v.papPermittedSubtrees[iDst] = &paSubtrees[iSrc];
+ iDst++;
+ }
+ pThis->v.cPermittedSubtrees = iDst;
+
+ return true;
+}
+
+
+/**
+ * Calculates the intersection between @a pSubtrees and the current permitted
+ * sub-trees.
+ *
+ * @returns Success indicator.
+ * @param pThis The validator instance.
+ * @param pSubtrees The sub-tree sequence to intersect with.
+ */
+static bool rtCrX509CpvIntersectionPermittedSubtrees(PRTCRX509CERTPATHSINT pThis, PCRTCRX509GENERALSUBTREES pSubtrees)
+{
+ /*
+ * Deal with special cases first.
+ */
+ if (pThis->v.fNoPermittedSubtrees)
+ {
+ Assert(pThis->v.cPermittedSubtrees == 0);
+ return true;
+ }
+
+ uint32_t cRight = pSubtrees->cItems;
+ PCRTCRX509GENERALSUBTREE paRight = pSubtrees->paItems;
+ if (cRight == 0)
+ {
+ pThis->v.cPermittedSubtrees = 0;
+ pThis->v.fNoPermittedSubtrees = true;
+ return true;
+ }
+
+ uint32_t cLeft = pThis->v.cPermittedSubtrees;
+ PCRTCRX509GENERALSUBTREE *papLeft = pThis->v.papPermittedSubtrees;
+ if (!cLeft) /* first name constraint, no initial constraint */
+ return rtCrX509CpvAddPermittedSubtrees(pThis, cRight, paRight);
+
+ /*
+ * Create a new array with the intersection, freeing the old (left) array
+ * once we're done.
+ */
+ bool afRightTags[RTCRX509GENERALNAMECHOICE_END] = { 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+
+ pThis->v.cPermittedSubtrees = 0;
+ pThis->v.cPermittedSubtreesAlloc = 0;
+ pThis->v.papPermittedSubtrees = NULL;
+
+ for (uint32_t iRight = 0; iRight < cRight; iRight++)
+ {
+ if (!rtCrX509CpvCheckSubtreeValidity(pThis, &paRight[iRight]))
+ return false;
+
+ RTCRX509GENERALNAMECHOICE const enmRightChoice = paRight[iRight].Base.enmChoice;
+ afRightTags[enmRightChoice] = true;
+
+ bool fHaveRight = false;
+ for (uint32_t iLeft = 0; iLeft < cLeft; iLeft++)
+ if (papLeft[iLeft]->Base.enmChoice == enmRightChoice)
+ {
+ if (RTCrX509GeneralSubtree_Compare(papLeft[iLeft], &paRight[iRight]) == 0)
+ {
+ if (!fHaveRight)
+ {
+ fHaveRight = true;
+ rtCrX509CpvAddPermittedSubtrees(pThis, 1, papLeft[iLeft]);
+ }
+ }
+ else if (RTCrX509GeneralSubtree_ConstraintMatch(papLeft[iLeft], &paRight[iRight]))
+ {
+ if (!fHaveRight)
+ {
+ fHaveRight = true;
+ rtCrX509CpvAddPermittedSubtrees(pThis, 1, &paRight[iRight]);
+ }
+ }
+ else if (RTCrX509GeneralSubtree_ConstraintMatch(&paRight[iRight], papLeft[iLeft]))
+ rtCrX509CpvAddPermittedSubtrees(pThis, 1, papLeft[iLeft]);
+ }
+ }
+
+ /*
+ * Add missing types not specified in the right set.
+ */
+ for (uint32_t iLeft = 0; iLeft < cLeft; iLeft++)
+ if (!afRightTags[papLeft[iLeft]->Base.enmChoice])
+ rtCrX509CpvAddPermittedSubtrees(pThis, 1, papLeft[iLeft]);
+
+ /*
+ * If we ended up with an empty set, no names are permitted any more.
+ */
+ if (pThis->v.cPermittedSubtrees == 0)
+ pThis->v.fNoPermittedSubtrees = true;
+
+ RTMemFree(papLeft);
+ return RT_SUCCESS(pThis->rc);
+}
+
+
+/**
+ * Check if the given X.509 name is permitted by current name constraints.
+ *
+ * @returns true is permitteded, false if not (caller set error info).
+ * @param pThis The validator instance.
+ * @param pName The name to match.
+ */
+static bool rtCrX509CpvIsNamePermitted(PRTCRX509CERTPATHSINT pThis, PCRTCRX509NAME pName)
+{
+ uint32_t i = pThis->v.cPermittedSubtrees;
+ if (i == 0)
+ return !pThis->v.fNoPermittedSubtrees;
+
+ while (i-- > 0)
+ {
+ PCRTCRX509GENERALSUBTREE pConstraint = pThis->v.papPermittedSubtrees[i];
+ if ( RTCRX509GENERALNAME_IS_DIRECTORY_NAME(&pConstraint->Base)
+ && RTCrX509Name_ConstraintMatch(&pConstraint->Base.u.pT4->DirectoryName, pName))
+ return true;
+ }
+ return false;
+}
+
+
+/**
+ * Check if the given X.509 general name is permitted by current name
+ * constraints.
+ *
+ * @returns true is permitteded, false if not (caller sets error info).
+ * @param pThis The validator instance.
+ * @param pGeneralName The name to match.
+ */
+static bool rtCrX509CpvIsGeneralNamePermitted(PRTCRX509CERTPATHSINT pThis, PCRTCRX509GENERALNAME pGeneralName)
+{
+ uint32_t i = pThis->v.cPermittedSubtrees;
+ if (i == 0)
+ return !pThis->v.fNoPermittedSubtrees;
+
+ while (i-- > 0)
+ if (RTCrX509GeneralName_ConstraintMatch(&pThis->v.papPermittedSubtrees[i]->Base, pGeneralName))
+ return true;
+ return false;
+}
+
+
+/**
+ * Check if the given X.509 name is excluded by current name constraints.
+ *
+ * @returns true if excluded (caller sets error info), false if not explicitly
+ * excluded.
+ * @param pThis The validator instance.
+ * @param pName The name to match.
+ */
+static bool rtCrX509CpvIsNameExcluded(PRTCRX509CERTPATHSINT pThis, PCRTCRX509NAME pName)
+{
+ uint32_t i = pThis->v.cExcludedSubtrees;
+ while (i-- > 0)
+ {
+ PCRTCRX509GENERALSUBTREES pSubTrees = pThis->v.papExcludedSubtrees[i];
+ uint32_t j = pSubTrees->cItems;
+ while (j-- > 0)
+ if ( RTCRX509GENERALNAME_IS_DIRECTORY_NAME(&pSubTrees->paItems[j].Base)
+ && RTCrX509Name_ConstraintMatch(&pSubTrees->paItems[j].Base.u.pT4->DirectoryName, pName))
+ return true;
+ }
+ return false;
+}
+
+
+/**
+ * Check if the given X.509 general name is excluded by current name
+ * constraints.
+ *
+ * @returns true if excluded (caller sets error info), false if not explicitly
+ * excluded.
+ * @param pThis The validator instance.
+ * @param pGeneralName The name to match.
+ */
+static bool rtCrX509CpvIsGeneralNameExcluded(PRTCRX509CERTPATHSINT pThis, PCRTCRX509GENERALNAME pGeneralName)
+{
+ uint32_t i = pThis->v.cExcludedSubtrees;
+ while (i-- > 0)
+ {
+ PCRTCRX509GENERALSUBTREES pSubTrees = pThis->v.papExcludedSubtrees[i];
+ uint32_t j = pSubTrees->cItems;
+ while (j-- > 0)
+ if (RTCrX509GeneralName_ConstraintMatch(&pSubTrees->paItems[j].Base, pGeneralName))
+ return true;
+ }
+ return false;
+}
+
+
+/**
+ * Creates a new node and inserts it.
+ *
+ * @param pThis The path builder & validator instance.
+ * @param pParent The parent node. NULL for the root node.
+ * @param iDepth The tree depth to insert at.
+ * @param pValidPolicy The valid policy of the new node.
+ * @param pQualifiers The qualifiers of the new node.
+ * @param pExpectedPolicy The (first) expected polcy of the new node.
+ */
+static bool rtCrX509CpvPolicyTreeInsertNew(PRTCRX509CERTPATHSINT pThis, PRTCRX509CERTPATHSPOLICYNODE pParent, uint32_t iDepth,
+ PCRTASN1OBJID pValidPolicy, PCRTCRX509POLICYQUALIFIERINFOS pQualifiers,
+ PCRTASN1OBJID pExpectedPolicy)
+{
+ Assert(iDepth <= pThis->v.cNodes);
+
+ PRTCRX509CERTPATHSPOLICYNODE pNode;
+ pNode = (PRTCRX509CERTPATHSPOLICYNODE)rtCrX509CpvAllocZ(pThis, sizeof(*pNode), "policy tree node");
+ if (pNode)
+ {
+ pNode->pParent = pParent;
+ if (pParent)
+ RTListAppend(&pParent->ChildList, &pNode->SiblingEntry);
+ else
+ {
+ Assert(pThis->v.pValidPolicyTree == NULL);
+ pThis->v.pValidPolicyTree = pNode;
+ RTListInit(&pNode->SiblingEntry);
+ }
+ RTListInit(&pNode->ChildList);
+ RTListAppend(&pThis->v.paValidPolicyDepthLists[iDepth], &pNode->DepthEntry);
+
+ pNode->pValidPolicy = pValidPolicy;
+ pNode->pPolicyQualifiers = pQualifiers;
+ pNode->pExpectedPolicyFirst = pExpectedPolicy;
+ pNode->cMoreExpectedPolicySet = 0;
+ pNode->papMoreExpectedPolicySet = NULL;
+ return true;
+ }
+ return false;
+}
+
+
+/**
+ * Unlinks and frees a node in the valid policy tree.
+ *
+ * @param pThis The path builder & validator instance.
+ * @param pNode The node to destroy.
+ */
+static void rtCrX509CpvPolicyTreeDestroyNode(PRTCRX509CERTPATHSINT pThis, PRTCRX509CERTPATHSPOLICYNODE pNode)
+{
+ Assert(RTListIsEmpty(&pNode->ChildList));
+ if (pNode->pParent)
+ RTListNodeRemove(&pNode->SiblingEntry);
+ else
+ pThis->v.pValidPolicyTree = NULL;
+ RTListNodeRemove(&pNode->DepthEntry);
+ pNode->pParent = NULL;
+
+ if (pNode->papMoreExpectedPolicySet)
+ {
+ RTMemFree(pNode->papMoreExpectedPolicySet);
+ pNode->papMoreExpectedPolicySet = NULL;
+ }
+ RTMemFree(pNode);
+}
+
+
+/**
+ * Unlinks and frees a sub-tree in the valid policy tree.
+ *
+ * @param pThis The path builder & validator instance.
+ * @param pNode The node that is the root of the subtree.
+ */
+static void rtCrX509CpvPolicyTreeDestroySubtree(PRTCRX509CERTPATHSINT pThis, PRTCRX509CERTPATHSPOLICYNODE pNode)
+{
+ if (!RTListIsEmpty(&pNode->ChildList))
+ {
+ PRTCRX509CERTPATHSPOLICYNODE pCur = pNode;
+ do
+ {
+ Assert(!RTListIsEmpty(&pCur->ChildList));
+
+ /* Decend until we find a leaf. */
+ do
+ pCur = RTListGetFirst(&pCur->ChildList, RTCRX509CERTPATHSPOLICYNODE, SiblingEntry);
+ while (!RTListIsEmpty(&pCur->ChildList));
+
+ /* Remove it and all leafy siblings. */
+ PRTCRX509CERTPATHSPOLICYNODE pParent = pCur->pParent;
+ do
+ {
+ Assert(pCur != pNode);
+ rtCrX509CpvPolicyTreeDestroyNode(pThis, pCur);
+ pCur = RTListGetFirst(&pParent->ChildList, RTCRX509CERTPATHSPOLICYNODE, SiblingEntry);
+ if (!pCur)
+ {
+ pCur = pParent;
+ pParent = pParent->pParent;
+ }
+ } while (RTListIsEmpty(&pCur->ChildList) && pCur != pNode);
+ } while (pCur != pNode);
+ }
+
+ rtCrX509CpvPolicyTreeDestroyNode(pThis, pNode);
+}
+
+
+
+/**
+ * Destroys the entire policy tree.
+ *
+ * @param pThis The path builder & validator instance.
+ */
+static void rtCrX509CpvPolicyTreeDestroy(PRTCRX509CERTPATHSINT pThis)
+{
+ uint32_t i = pThis->v.cNodes + 1;
+ while (i-- > 0)
+ {
+ PRTCRX509CERTPATHSPOLICYNODE pCur, pNext;
+ RTListForEachSafe(&pThis->v.paValidPolicyDepthLists[i], pCur, pNext, RTCRX509CERTPATHSPOLICYNODE, DepthEntry)
+ {
+ rtCrX509CpvPolicyTreeDestroyNode(pThis, pCur);
+ }
+ }
+}
+
+
+/**
+ * Removes all leaf nodes at level @a iDepth and above.
+ *
+ * @param pThis The path builder & validator instance.
+ * @param iDepth The depth to start pruning at.
+ */
+static void rtCrX509CpvPolicyTreePrune(PRTCRX509CERTPATHSINT pThis, uint32_t iDepth)
+{
+ do
+ {
+ PRTLISTANCHOR pList = &pThis->v.paValidPolicyDepthLists[iDepth];
+ PRTCRX509CERTPATHSPOLICYNODE pCur, pNext;
+ RTListForEachSafe(pList, pCur, pNext, RTCRX509CERTPATHSPOLICYNODE, DepthEntry)
+ {
+ if (RTListIsEmpty(&pCur->ChildList))
+ rtCrX509CpvPolicyTreeDestroyNode(pThis, pCur);
+ }
+
+ } while (iDepth-- > 0);
+}
+
+
+/**
+ * Checks if @a pPolicy is the valid policy of a child of @a pNode.
+ *
+ * @returns true if in child node, false if not.
+ * @param pNode The node which children to check.
+ * @param pPolicy The valid policy to look for among the children.
+ */
+static bool rtCrX509CpvPolicyTreeIsChild(PRTCRX509CERTPATHSPOLICYNODE pNode, PCRTASN1OBJID pPolicy)
+{
+ PRTCRX509CERTPATHSPOLICYNODE pChild;
+ RTListForEach(&pNode->ChildList, pChild, RTCRX509CERTPATHSPOLICYNODE, SiblingEntry)
+ {
+ if (RTAsn1ObjId_Compare(pChild->pValidPolicy, pPolicy) == 0)
+ return true;
+ }
+ return true;
+}
+
+
+/**
+ * Prunes the valid policy tree according to the specified user policy set.
+ *
+ * @returns Pointer to the policy object from @a papPolicies if found, NULL if
+ * no match.
+ * @param pObjId The object ID to locate at match in the set.
+ * @param cPolicies The number of policies in @a papPolicies.
+ * @param papPolicies The policy set to search.
+ */
+static PCRTASN1OBJID rtCrX509CpvFindObjIdInPolicySet(PCRTASN1OBJID pObjId, uint32_t cPolicies, PCRTASN1OBJID *papPolicies)
+{
+ uint32_t i = cPolicies;
+ while (i-- > 0)
+ if (RTAsn1ObjId_Compare(pObjId, papPolicies[i]) == 0)
+ return papPolicies[i];
+ return NULL;
+}
+
+
+/**
+ * Prunes the valid policy tree according to the specified user policy set.
+ *
+ * @returns success indicator (allocates memory)
+ * @param pThis The path builder & validator instance.
+ * @param cPolicies The number of policies in @a papPolicies.
+ * @param papPolicies The user initial policies.
+ */
+static bool rtCrX509CpvPolicyTreeIntersect(PRTCRX509CERTPATHSINT pThis, uint32_t cPolicies, PCRTASN1OBJID *papPolicies)
+{
+ /*
+ * 4.1.6.g.i - NULL tree remains NULL.
+ */
+ if (!pThis->v.pValidPolicyTree)
+ return true;
+
+ /*
+ * 4.1.6.g.ii - If the user set includes anyPolicy, the whole tree is the
+ * result of the intersection.
+ */
+ uint32_t i = cPolicies;
+ while (i-- > 0)
+ if (RTAsn1ObjId_CompareWithString(papPolicies[i], RTCRX509_ID_CE_CP_ANY_POLICY_OID) == 0)
+ return true;
+
+ /*
+ * 4.1.6.g.iii - Complicated.
+ */
+ PRTCRX509CERTPATHSPOLICYNODE pCur, pNext;
+ PRTLISTANCHOR pList;
+
+ /* 1 & 2: Delete nodes which parent has valid policy == anyPolicy and which
+ valid policy is neither anyPolicy nor a member of papszPolicies.
+ While doing so, construct a set of unused user policies that
+ we'll replace anyPolicy nodes with in step 3. */
+ uint32_t cPoliciesLeft = 0;
+ PCRTASN1OBJID *papPoliciesLeft = NULL;
+ if (cPolicies)
+ {
+ papPoliciesLeft = (PCRTASN1OBJID *)rtCrX509CpvAllocZ(pThis, cPolicies * sizeof(papPoliciesLeft[0]), "papPoliciesLeft");
+ if (!papPoliciesLeft)
+ return false;
+ for (i = 0; i < cPolicies; i++)
+ papPoliciesLeft[i] = papPolicies[i];
+ }
+
+ for (uint32_t iDepth = 1; iDepth <= pThis->v.cNodes; iDepth++)
+ {
+ pList = &pThis->v.paValidPolicyDepthLists[iDepth];
+ RTListForEachSafe(pList, pCur, pNext, RTCRX509CERTPATHSPOLICYNODE, DepthEntry)
+ {
+ Assert(pCur->pParent);
+ if ( RTAsn1ObjId_CompareWithString(pCur->pParent->pValidPolicy, RTCRX509_ID_CE_CP_ANY_POLICY_OID) == 0
+ && RTAsn1ObjId_CompareWithString(pCur->pValidPolicy, RTCRX509_ID_CE_CP_ANY_POLICY_OID) != 0)
+ {
+ PCRTASN1OBJID pFound = rtCrX509CpvFindObjIdInPolicySet(pCur->pValidPolicy, cPolicies, papPolicies);
+ if (!pFound)
+ rtCrX509CpvPolicyTreeDestroySubtree(pThis, pCur);
+ else
+ for (i = 0; i < cPoliciesLeft; i++)
+ if (papPoliciesLeft[i] == pFound)
+ {
+ cPoliciesLeft--;
+ if (i < cPoliciesLeft)
+ papPoliciesLeft[i] = papPoliciesLeft[cPoliciesLeft];
+ papPoliciesLeft[cPoliciesLeft] = NULL;
+ break;
+ }
+ }
+ }
+ }
+
+ /*
+ * 4.1.5.g.iii.3 - Replace anyPolicy nodes on the final tree depth with
+ * the policies in papPoliciesLeft.
+ */
+ pList = &pThis->v.paValidPolicyDepthLists[pThis->v.cNodes];
+ RTListForEachSafe(pList, pCur, pNext, RTCRX509CERTPATHSPOLICYNODE, DepthEntry)
+ {
+ if (RTAsn1ObjId_CompareWithString(pCur->pValidPolicy, RTCRX509_ID_CE_CP_ANY_POLICY_OID) == 0)
+ {
+ for (i = 0; i < cPoliciesLeft; i++)
+ rtCrX509CpvPolicyTreeInsertNew(pThis, pCur->pParent, pThis->v.cNodes - 1,
+ papPoliciesLeft[i], pCur->pPolicyQualifiers, papPoliciesLeft[i]);
+ rtCrX509CpvPolicyTreeDestroyNode(pThis, pCur);
+ }
+ }
+
+ RTMemFree(papPoliciesLeft);
+
+ /*
+ * 4.1.5.g.iii.4 - Prune the tree
+ */
+ rtCrX509CpvPolicyTreePrune(pThis, pThis->v.cNodes - 1);
+
+ return RT_SUCCESS(pThis->rc);
+}
+
+
+
+/**
+ * Frees the path validator state.
+ *
+ * @param pThis The path builder & validator instance.
+ */
+static void rtCrX509CpvCleanup(PRTCRX509CERTPATHSINT pThis)
+{
+ /*
+ * Destroy the policy tree and all its nodes. We do this from the bottom
+ * up via the depth lists, saving annoying tree traversal.
+ */
+ if (pThis->v.paValidPolicyDepthLists)
+ {
+ rtCrX509CpvPolicyTreeDestroy(pThis);
+
+ RTMemFree(pThis->v.paValidPolicyDepthLists);
+ pThis->v.paValidPolicyDepthLists = NULL;
+ }
+
+ Assert(pThis->v.pValidPolicyTree == NULL);
+ pThis->v.pValidPolicyTree = NULL;
+
+ /*
+ * Destroy the name constraint arrays.
+ */
+ if (pThis->v.papPermittedSubtrees)
+ {
+ RTMemFree(pThis->v.papPermittedSubtrees);
+ pThis->v.papPermittedSubtrees = NULL;
+ }
+ pThis->v.cPermittedSubtrees = 0;
+ pThis->v.cPermittedSubtreesAlloc = 0;
+ pThis->v.fNoPermittedSubtrees = false;
+
+ if (pThis->v.papExcludedSubtrees)
+ {
+ RTMemFree(pThis->v.papExcludedSubtrees);
+ pThis->v.papExcludedSubtrees = NULL;
+ }
+ pThis->v.cExcludedSubtrees = 0;
+
+ /*
+ * Clear other pointers.
+ */
+ pThis->v.pWorkingIssuer = NULL;
+ pThis->v.pWorkingPublicKey = NULL;
+ pThis->v.pWorkingPublicKeyAlgorithm = NULL;
+ pThis->v.pWorkingPublicKeyParameters = NULL;
+}
+
+
+
+/**
+ * Initializes the state.
+ *
+ * Caller must check pThis->rc.
+ *
+ * @param pThis The path builder & validator instance.
+ * @param pTrustAnchor The trust anchor node for the path that we're about
+ * to validate.
+ */
+static void rtCrX509CpvInit(PRTCRX509CERTPATHSINT pThis, PRTCRX509CERTPATHNODE pTrustAnchor)
+{
+ rtCrX509CpvCleanup(pThis);
+
+ /*
+ * The node count does not include the trust anchor.
+ */
+ pThis->v.cNodes = pTrustAnchor->uDepth;
+
+ /*
+ * Valid policy tree starts with an anyPolicy node.
+ */
+ uint32_t i = pThis->v.cNodes + 1;
+ pThis->v.paValidPolicyDepthLists = (PRTLISTANCHOR)rtCrX509CpvAllocZ(pThis, i * sizeof(RTLISTANCHOR),
+ "paValidPolicyDepthLists");
+ if (RT_UNLIKELY(!pThis->v.paValidPolicyDepthLists))
+ return;
+ while (i-- > 0)
+ RTListInit(&pThis->v.paValidPolicyDepthLists[i]);
+
+ if (!rtCrX509CpvPolicyTreeInsertNew(pThis, NULL, 0 /* iDepth*/, &pThis->AnyPolicyObjId, NULL, &pThis->AnyPolicyObjId))
+ return;
+ Assert(!RTListIsEmpty(&pThis->v.paValidPolicyDepthLists[0])); Assert(pThis->v.pValidPolicyTree);
+
+ /*
+ * Name constrains.
+ */
+ if (pThis->pInitialPermittedSubtrees)
+ rtCrX509CpvAddPermittedSubtrees(pThis, pThis->pInitialPermittedSubtrees->cItems,
+ pThis->pInitialPermittedSubtrees->paItems);
+ if (pThis->pInitialExcludedSubtrees)
+ rtCrX509CpvAddExcludedSubtrees(pThis, pThis->pInitialExcludedSubtrees);
+
+ /*
+ * Counters.
+ */
+ pThis->v.cExplicitPolicy = pThis->cInitialExplicitPolicy;
+ pThis->v.cInhibitPolicyMapping = pThis->cInitialPolicyMappingInhibit;
+ pThis->v.cInhibitAnyPolicy = pThis->cInitialInhibitAnyPolicy;
+ pThis->v.cMaxPathLength = pThis->v.cNodes;
+
+ /*
+ * Certificate info from the trust anchor.
+ */
+ if (pTrustAnchor->pCert)
+ {
+ PCRTCRX509TBSCERTIFICATE const pTbsCert = &pTrustAnchor->pCert->TbsCertificate;
+ pThis->v.pWorkingIssuer = &pTbsCert->Subject;
+ pThis->v.pWorkingPublicKey = &pTbsCert->SubjectPublicKeyInfo.SubjectPublicKey;
+ pThis->v.pWorkingPublicKeyAlgorithm = &pTbsCert->SubjectPublicKeyInfo.Algorithm.Algorithm;
+ pThis->v.pWorkingPublicKeyParameters = &pTbsCert->SubjectPublicKeyInfo.Algorithm.Parameters;
+ }
+ else
+ {
+ Assert(pTrustAnchor->pCertCtx); Assert(pTrustAnchor->pCertCtx->pTaInfo);
+
+ PCRTCRTAFTRUSTANCHORINFO const pTaInfo = pTrustAnchor->pCertCtx->pTaInfo;
+ pThis->v.pWorkingIssuer = &pTaInfo->CertPath.TaName;
+ pThis->v.pWorkingPublicKey = &pTaInfo->PubKey.SubjectPublicKey;
+ pThis->v.pWorkingPublicKeyAlgorithm = &pTaInfo->PubKey.Algorithm.Algorithm;
+ pThis->v.pWorkingPublicKeyParameters = &pTaInfo->PubKey.Algorithm.Parameters;
+ }
+ if ( !RTASN1CORE_IS_PRESENT(&pThis->v.pWorkingPublicKeyParameters->u.Core)
+ || pThis->v.pWorkingPublicKeyParameters->enmType == RTASN1TYPE_NULL)
+ pThis->v.pWorkingPublicKeyParameters = NULL;
+}
+
+
+/**
+ * Step 6.1.3.a.
+ */
+static bool rtCrX509CpvCheckBasicCertInfo(PRTCRX509CERTPATHSINT pThis, PRTCRX509CERTPATHNODE pNode)
+{
+ /*
+ * 6.1.3.a.1 - Verify the certificate signature.
+ */
+ int rc = RTCrX509Certificate_VerifySignature(pNode->pCert, pThis->v.pWorkingPublicKeyAlgorithm,
+ pThis->v.pWorkingPublicKeyParameters, pThis->v.pWorkingPublicKey,
+ pThis->pErrInfo);
+ if (RT_FAILURE(rc))
+ {
+ pThis->rc = rc;
+ return false;
+ }
+
+ /*
+ * 6.1.3.a.2 - Verify that the certificate is valid at the specified time.
+ */
+ if (!RTCrX509Validity_IsValidAtTimeSpec(&pNode->pCert->TbsCertificate.Validity, &pThis->ValidTime))
+ return rtCrX509CpvFailed(pThis, VERR_CR_X509_CPV_NOT_VALID_AT_TIME, "Certificate is not valid");
+
+ /*
+ * 6.1.3.a.3 - Verified that the certficiate is not revoked.
+ */
+ /** @todo rainy day. */
+
+ /*
+ * 6.1.3.a.4 - Check the issuer name.
+ */
+ if (!RTCrX509Name_MatchByRfc5280(&pNode->pCert->TbsCertificate.Issuer, pThis->v.pWorkingIssuer))
+ return rtCrX509CpvFailed(pThis, VERR_CR_X509_CPV_ISSUER_MISMATCH, "Issuer mismatch");
+
+ return true;
+}
+
+
+/**
+ * Step 6.1.3.b-c.
+ */
+static bool rtCrX509CpvCheckNameConstraints(PRTCRX509CERTPATHSINT pThis, PRTCRX509CERTPATHNODE pNode)
+{
+ if (pThis->v.fNoPermittedSubtrees)
+ return rtCrX509CpvFailed(pThis, VERR_CR_X509_CPV_NO_PERMITTED_NAMES, "No permitted subtrees");
+
+ if ( pNode->pCert->TbsCertificate.Subject.cItems > 0
+ && ( !rtCrX509CpvIsNamePermitted(pThis, &pNode->pCert->TbsCertificate.Subject)
+ || rtCrX509CpvIsNameExcluded(pThis, &pNode->pCert->TbsCertificate.Subject)) )
+ return rtCrX509CpvFailed(pThis, VERR_CR_X509_CPV_NAME_NOT_PERMITTED,
+ "Subject name is not permitted by current name constraints");
+
+ PCRTCRX509GENERALNAMES pAltSubjectName = pNode->pCert->TbsCertificate.T3.pAltSubjectName;
+ if (pAltSubjectName)
+ {
+ uint32_t i = pAltSubjectName->cItems;
+ while (i-- > 0)
+ if ( !rtCrX509CpvIsGeneralNamePermitted(pThis, &pAltSubjectName->paItems[i])
+ || rtCrX509CpvIsGeneralNameExcluded(pThis, &pAltSubjectName->paItems[i]))
+ return rtCrX509CpvFailed(pThis, VERR_CR_X509_CPV_ALT_NAME_NOT_PERMITTED,
+ "Alternative name #%u is is not permitted by current name constraints", i);
+ }
+
+ return true;
+}
+
+
+/**
+ * Step 6.1.3.d-f.
+ */
+static bool rtCrX509CpvWorkValidPolicyTree(PRTCRX509CERTPATHSINT pThis, uint32_t iDepth, PRTCRX509CERTPATHNODE pNode,
+ bool fSelfIssued)
+{
+ PCRTCRX509CERTIFICATEPOLICIES pPolicies = pNode->pCert->TbsCertificate.T3.pCertificatePolicies;
+ if (pPolicies)
+ {
+ /*
+ * 6.1.3.d.1 - Work the certiciate policies into the tree.
+ */
+ PRTCRX509CERTPATHSPOLICYNODE pCur;
+ PRTLISTANCHOR pListAbove = &pThis->v.paValidPolicyDepthLists[iDepth - 1];
+ uint32_t iAnyPolicy = UINT32_MAX;
+ uint32_t i = pPolicies->cItems;
+ while (i-- > 0)
+ {
+ PCRTCRX509POLICYQUALIFIERINFOS const pQualifiers = &pPolicies->paItems[i].PolicyQualifiers;
+ PCRTASN1OBJID const pIdP = &pPolicies->paItems[i].PolicyIdentifier;
+ if (RTAsn1ObjId_CompareWithString(pIdP, RTCRX509_ID_CE_CP_ANY_POLICY_OID) == 0)
+ {
+ iAnyPolicy++;
+ continue;
+ }
+
+ /*
+ * 6.1.3.d.1.i - Create children for matching policies.
+ */
+ uint32_t cMatches = 0;
+ RTListForEach(pListAbove, pCur, RTCRX509CERTPATHSPOLICYNODE, DepthEntry)
+ {
+ bool fMatch = RTAsn1ObjId_Compare(pCur->pExpectedPolicyFirst, pIdP) == 0;
+ if (!fMatch && pCur->cMoreExpectedPolicySet)
+ for (uint32_t j = 0; !fMatch && j < pCur->cMoreExpectedPolicySet; j++)
+ fMatch = RTAsn1ObjId_Compare(pCur->papMoreExpectedPolicySet[j], pIdP) == 0;
+ if (fMatch)
+ {
+ if (!rtCrX509CpvPolicyTreeInsertNew(pThis, pCur, iDepth, pIdP, pQualifiers, pIdP))
+ return false;
+ cMatches++;
+ }
+ }
+
+ /*
+ * 6.1.3.d.1.ii - If no matches above do the same for anyPolicy
+ * nodes, only match with valid policy this time.
+ */
+ if (cMatches == 0)
+ {
+ RTListForEach(pListAbove, pCur, RTCRX509CERTPATHSPOLICYNODE, DepthEntry)
+ {
+ if (RTAsn1ObjId_CompareWithString(pCur->pExpectedPolicyFirst, RTCRX509_ID_CE_CP_ANY_POLICY_OID) == 0)
+ {
+ if (!rtCrX509CpvPolicyTreeInsertNew(pThis, pCur, iDepth, pIdP, pQualifiers, pIdP))
+ return false;
+ }
+ }
+ }
+ }
+
+ /*
+ * 6.1.3.d.2 - If anyPolicy present, make sure all expected policies
+ * are propagated to the current depth.
+ */
+ if ( iAnyPolicy < pPolicies->cItems
+ && ( pThis->v.cInhibitAnyPolicy > 0
+ || (pNode->pParent && fSelfIssued) ) )
+ {
+ PCRTCRX509POLICYQUALIFIERINFOS pApQ = &pPolicies->paItems[iAnyPolicy].PolicyQualifiers;
+ RTListForEach(pListAbove, pCur, RTCRX509CERTPATHSPOLICYNODE, DepthEntry)
+ {
+ if (!rtCrX509CpvPolicyTreeIsChild(pCur, pCur->pExpectedPolicyFirst))
+ rtCrX509CpvPolicyTreeInsertNew(pThis, pCur, iDepth, pCur->pExpectedPolicyFirst, pApQ,
+ pCur->pExpectedPolicyFirst);
+ for (uint32_t j = 0; j < pCur->cMoreExpectedPolicySet; j++)
+ if (!rtCrX509CpvPolicyTreeIsChild(pCur, pCur->papMoreExpectedPolicySet[j]))
+ rtCrX509CpvPolicyTreeInsertNew(pThis, pCur, iDepth, pCur->papMoreExpectedPolicySet[j], pApQ,
+ pCur->papMoreExpectedPolicySet[j]);
+ }
+ }
+ /*
+ * 6.1.3.d.3 - Prune the tree.
+ */
+ else
+ rtCrX509CpvPolicyTreePrune(pThis, iDepth - 1);
+ }
+ else
+ {
+ /*
+ * 6.1.3.e - No policy extension present, set tree to NULL.
+ */
+ rtCrX509CpvPolicyTreeDestroy(pThis);
+ }
+
+ /*
+ * 6.1.3.f - NULL tree check.
+ */
+ if ( pThis->v.pValidPolicyTree == NULL
+ && pThis->v.cExplicitPolicy == 0)
+ return rtCrX509CpvFailed(pThis, VERR_CR_X509_CPV_NO_VALID_POLICY,
+ "An explicit policy is called for but the valid policy tree is NULL.");
+ return RT_SUCCESS(pThis->rc);
+}
+
+
+/**
+ * Step 6.1.4.a-b.
+ */
+static bool rtCrX509CpvSoakUpPolicyMappings(PRTCRX509CERTPATHSINT pThis, uint32_t iDepth,
+ PCRTCRX509POLICYMAPPINGS pPolicyMappings)
+{
+ /*
+ * 6.1.4.a - The anyPolicy is not allowed in policy mappings as it would
+ * allow an evil intermediate certificate to expand the policy
+ * scope of a certiciate chain without regard to upstream.
+ */
+ uint32_t i = pPolicyMappings->cItems;
+ while (i-- > 0)
+ {
+ if (RTAsn1ObjId_CompareWithString(&pPolicyMappings->paItems[i].IssuerDomainPolicy, RTCRX509_ID_CE_CP_ANY_POLICY_OID) == 0)
+ return rtCrX509CpvFailed(pThis, VERR_CR_X509_CPV_INVALID_POLICY_MAPPING,
+ "Invalid policy mapping %#u: IssuerDomainPolicy is anyPolicy.", i);
+
+ if (RTAsn1ObjId_CompareWithString(&pPolicyMappings->paItems[i].SubjectDomainPolicy, RTCRX509_ID_CE_CP_ANY_POLICY_OID) == 0)
+ return rtCrX509CpvFailed(pThis, VERR_CR_X509_CPV_INVALID_POLICY_MAPPING,
+ "Invalid policy mapping %#u: SubjectDomainPolicy is anyPolicy.", i);
+ }
+
+ PRTCRX509CERTPATHSPOLICYNODE pCur, pNext;
+ if (pThis->v.cInhibitPolicyMapping > 0)
+ {
+ /*
+ * 6.1.4.b.1 - Do the policy mapping.
+ */
+ i = pPolicyMappings->cItems;
+ while (i-- > 0)
+ {
+ uint32_t cFound = 0;
+ RTListForEach(&pThis->v.paValidPolicyDepthLists[iDepth], pCur, RTCRX509CERTPATHSPOLICYNODE, DepthEntry)
+ {
+ if (RTAsn1ObjId_Compare(pCur->pValidPolicy, &pPolicyMappings->paItems[i].IssuerDomainPolicy))
+ {
+ if (!pCur->fAlreadyMapped)
+ {
+ pCur->fAlreadyMapped = true;
+ pCur->pExpectedPolicyFirst = &pPolicyMappings->paItems[i].SubjectDomainPolicy;
+ }
+ else
+ {
+ uint32_t iExpected = pCur->cMoreExpectedPolicySet;
+ void *pvNew = RTMemRealloc(pCur->papMoreExpectedPolicySet,
+ sizeof(pCur->papMoreExpectedPolicySet[0]) * (iExpected + 1));
+ if (!pvNew)
+ return rtCrX509CpvFailed(pThis, VERR_NO_MEMORY,
+ "Error growing papMoreExpectedPolicySet array (cur %u, depth %u)",
+ pCur->cMoreExpectedPolicySet, iDepth);
+ pCur->papMoreExpectedPolicySet = (PCRTASN1OBJID *)pvNew;
+ pCur->papMoreExpectedPolicySet[iExpected] = &pPolicyMappings->paItems[i].SubjectDomainPolicy;
+ pCur->cMoreExpectedPolicySet = iExpected + 1;
+ }
+ cFound++;
+ }
+ }
+
+ /*
+ * If no mapping took place, look for an anyPolicy node.
+ */
+ if (!cFound)
+ {
+ RTListForEach(&pThis->v.paValidPolicyDepthLists[iDepth], pCur, RTCRX509CERTPATHSPOLICYNODE, DepthEntry)
+ {
+ if (RTAsn1ObjId_CompareWithString(pCur->pValidPolicy, RTCRX509_ID_CE_CP_ANY_POLICY_OID) == 0)
+ {
+ if (!rtCrX509CpvPolicyTreeInsertNew(pThis, pCur->pParent, iDepth,
+ &pPolicyMappings->paItems[i].IssuerDomainPolicy,
+ pCur->pPolicyQualifiers,
+ &pPolicyMappings->paItems[i].SubjectDomainPolicy))
+ return false;
+ break;
+ }
+ }
+ }
+ }
+ }
+ else
+ {
+ /*
+ * 6.1.4.b.2 - Remove matching policies from the tree if mapping is
+ * inhibited and prune the tree.
+ */
+ uint32_t cRemoved = 0;
+ i = pPolicyMappings->cItems;
+ while (i-- > 0)
+ {
+ RTListForEachSafe(&pThis->v.paValidPolicyDepthLists[iDepth], pCur, pNext, RTCRX509CERTPATHSPOLICYNODE, DepthEntry)
+ {
+ if (RTAsn1ObjId_Compare(pCur->pValidPolicy, &pPolicyMappings->paItems[i].IssuerDomainPolicy))
+ {
+ rtCrX509CpvPolicyTreeDestroyNode(pThis, pCur);
+ cRemoved++;
+ }
+ }
+ }
+ if (cRemoved)
+ rtCrX509CpvPolicyTreePrune(pThis, iDepth - 1);
+ }
+
+ return true;
+}
+
+
+/**
+ * Step 6.1.4.d-f & 6.1.5.c-e.
+ */
+static void rtCrX509CpvSetWorkingPublicKeyInfo(PRTCRX509CERTPATHSINT pThis, PRTCRX509CERTPATHNODE pNode)
+{
+ PCRTCRX509TBSCERTIFICATE const pTbsCert = &pNode->pCert->TbsCertificate;
+
+ /*
+ * 6.1.4.d - The public key.
+ */
+ pThis->v.pWorkingPublicKey = &pTbsCert->SubjectPublicKeyInfo.SubjectPublicKey;
+
+ /*
+ * 6.1.4.e - The public key parameters. Use new ones if present, keep old
+ * if the algorithm remains the same.
+ */
+ if ( RTASN1CORE_IS_PRESENT(&pTbsCert->SubjectPublicKeyInfo.Algorithm.Parameters.u.Core)
+ && pTbsCert->SubjectPublicKeyInfo.Algorithm.Parameters.enmType != RTASN1TYPE_NULL)
+ pThis->v.pWorkingPublicKeyParameters = &pTbsCert->SubjectPublicKeyInfo.Algorithm.Parameters;
+ else if ( pThis->v.pWorkingPublicKeyParameters
+ && RTAsn1ObjId_Compare(pThis->v.pWorkingPublicKeyAlgorithm, &pTbsCert->SubjectPublicKeyInfo.Algorithm.Algorithm) != 0)
+ pThis->v.pWorkingPublicKeyParameters = NULL;
+
+ /*
+ * 6.1.4.f - The public algorithm.
+ */
+ pThis->v.pWorkingPublicKeyAlgorithm = &pTbsCert->SubjectPublicKeyInfo.Algorithm.Algorithm;
+}
+
+
+/**
+ * Step 6.1.4.g.
+ */
+static bool rtCrX509CpvSoakUpNameConstraints(PRTCRX509CERTPATHSINT pThis, PCRTCRX509NAMECONSTRAINTS pNameConstraints)
+{
+ if (pNameConstraints->T0.PermittedSubtrees.cItems > 0)
+ if (!rtCrX509CpvIntersectionPermittedSubtrees(pThis, &pNameConstraints->T0.PermittedSubtrees))
+ return false;
+
+ if (pNameConstraints->T1.ExcludedSubtrees.cItems > 0)
+ if (!rtCrX509CpvAddExcludedSubtrees(pThis, &pNameConstraints->T1.ExcludedSubtrees))
+ return false;
+
+ return true;
+}
+
+
+/**
+ * Step 6.1.4.i.
+ */
+static bool rtCrX509CpvSoakUpPolicyConstraints(PRTCRX509CERTPATHSINT pThis, PCRTCRX509POLICYCONSTRAINTS pPolicyConstraints)
+{
+ if (RTAsn1Integer_IsPresent(&pPolicyConstraints->RequireExplicitPolicy))
+ {
+ if (RTAsn1Integer_UnsignedCompareWithU32(&pPolicyConstraints->RequireExplicitPolicy, pThis->v.cExplicitPolicy) < 0)
+ pThis->v.cExplicitPolicy = pPolicyConstraints->RequireExplicitPolicy.uValue.s.Lo;
+ }
+
+ if (RTAsn1Integer_IsPresent(&pPolicyConstraints->InhibitPolicyMapping))
+ {
+ if (RTAsn1Integer_UnsignedCompareWithU32(&pPolicyConstraints->InhibitPolicyMapping, pThis->v.cInhibitPolicyMapping) < 0)
+ pThis->v.cInhibitPolicyMapping = pPolicyConstraints->InhibitPolicyMapping.uValue.s.Lo;
+ }
+ return true;
+}
+
+
+/**
+ * Step 6.1.4.j.
+ */
+static bool rtCrX509CpvSoakUpInhibitAnyPolicy(PRTCRX509CERTPATHSINT pThis, PCRTASN1INTEGER pInhibitAnyPolicy)
+{
+ if (RTAsn1Integer_UnsignedCompareWithU32(pInhibitAnyPolicy, pThis->v.cInhibitAnyPolicy) < 0)
+ pThis->v.cInhibitAnyPolicy = pInhibitAnyPolicy->uValue.s.Lo;
+ return true;
+}
+
+
+/**
+ * Steps 6.1.4.k, 6.1.4.l, 6.1.4.m, and 6.1.4.n.
+ */
+static bool rtCrX509CpvCheckAndSoakUpBasicConstraintsAndKeyUsage(PRTCRX509CERTPATHSINT pThis, PRTCRX509CERTPATHNODE pNode,
+ bool fSelfIssued)
+{
+ /* 6.1.4.k - If basic constraints present, CA must be set. */
+ if (RTAsn1Integer_UnsignedCompareWithU32(&pNode->pCert->TbsCertificate.T0.Version, RTCRX509TBSCERTIFICATE_V3) != 0)
+ {
+ /* Note! Add flags if support for older certificates is needed later. */
+ return rtCrX509CpvFailed(pThis, VERR_CR_X509_CPV_NOT_V3_CERT,
+ "Only version 3 certificates are supported (Version=%llu)",
+ pNode->pCert->TbsCertificate.T0.Version.uValue);
+ }
+ PCRTCRX509BASICCONSTRAINTS pBasicConstraints = pNode->pCert->TbsCertificate.T3.pBasicConstraints;
+ if (pBasicConstraints)
+ {
+ if (!pBasicConstraints->CA.fValue)
+ return rtCrX509CpvFailed(pThis, VERR_CR_X509_CPV_NOT_CA_CERT,
+ "Intermediate certificate (#%u) is not marked as a CA", pThis->v.iNode);
+ }
+
+ /* 6.1.4.l - Work cMaxPathLength. */
+ if (!fSelfIssued)
+ {
+ if (pThis->v.cMaxPathLength > 0)
+ pThis->v.cMaxPathLength--;
+ else
+ return rtCrX509CpvFailed(pThis, VERR_CR_X509_CPV_MAX_PATH_LENGTH,
+ "Hit max path length at node #%u", pThis->v.iNode);
+ }
+
+ /* 6.1.4.m - Update cMaxPathLength if basic constrain field is present and smaller. */
+ if (pBasicConstraints)
+ {
+ if (RTAsn1Integer_IsPresent(&pBasicConstraints->PathLenConstraint))
+ if (RTAsn1Integer_UnsignedCompareWithU32(&pBasicConstraints->PathLenConstraint, pThis->v.cMaxPathLength) < 0)
+ pThis->v.cMaxPathLength = pBasicConstraints->PathLenConstraint.uValue.s.Lo;
+ }
+
+ /* 6.1.4.n - Require keyCertSign in key usage if the extension is present. */
+ PCRTCRX509TBSCERTIFICATE const pTbsCert = &pNode->pCert->TbsCertificate;
+ if ( (pTbsCert->T3.fFlags & RTCRX509TBSCERTIFICATE_F_PRESENT_KEY_USAGE)
+ && !(pTbsCert->T3.fKeyUsage & RTCRX509CERT_KEY_USAGE_F_KEY_CERT_SIGN))
+ return rtCrX509CpvFailed(pThis, VERR_CR_X509_CPV_MISSING_KEY_CERT_SIGN,
+ "Node #%u does not have KeyCertSign set (keyUsage=%#x)",
+ pThis->v.iNode, pTbsCert->T3.fKeyUsage);
+
+ return true;
+}
+
+
+/**
+ * Step 6.1.4.o - check out critical extensions.
+ */
+static bool rtCrX509CpvCheckCriticalExtensions(PRTCRX509CERTPATHSINT pThis, PRTCRX509CERTPATHNODE pNode)
+{
+ uint32_t cLeft = pNode->pCert->TbsCertificate.T3.Extensions.cItems;
+ PCRTCRX509EXTENSION pCur = pNode->pCert->TbsCertificate.T3.Extensions.paItems;
+ while (cLeft-- > 0)
+ {
+ if (pCur->Critical.fValue)
+ {
+ if ( RTAsn1ObjId_CompareWithString(&pCur->ExtnId, RTCRX509_ID_CE_KEY_USAGE_OID) != 0
+ && RTAsn1ObjId_CompareWithString(&pCur->ExtnId, RTCRX509_ID_CE_SUBJECT_ALT_NAME_OID) != 0
+ && RTAsn1ObjId_CompareWithString(&pCur->ExtnId, RTCRX509_ID_CE_ISSUER_ALT_NAME_OID) != 0
+ && RTAsn1ObjId_CompareWithString(&pCur->ExtnId, RTCRX509_ID_CE_BASIC_CONSTRAINTS_OID) != 0
+ && RTAsn1ObjId_CompareWithString(&pCur->ExtnId, RTCRX509_ID_CE_NAME_CONSTRAINTS_OID) != 0
+ && RTAsn1ObjId_CompareWithString(&pCur->ExtnId, RTCRX509_ID_CE_CERTIFICATE_POLICIES_OID) != 0
+ && RTAsn1ObjId_CompareWithString(&pCur->ExtnId, RTCRX509_ID_CE_POLICY_MAPPINGS_OID) != 0
+ && RTAsn1ObjId_CompareWithString(&pCur->ExtnId, RTCRX509_ID_CE_POLICY_CONSTRAINTS_OID) != 0
+ && RTAsn1ObjId_CompareWithString(&pCur->ExtnId, RTCRX509_ID_CE_EXT_KEY_USAGE_OID) != 0
+ && RTAsn1ObjId_CompareWithString(&pCur->ExtnId, RTCRX509_ID_CE_INHIBIT_ANY_POLICY_OID) != 0
+ )
+ return rtCrX509CpvFailed(pThis, VERR_CR_X509_CPV_UNKNOWN_CRITICAL_EXTENSION,
+ "Node #%u has an unknown critical extension: %s", pThis->v.iNode, pCur->ExtnId.szObjId);
+ }
+
+ pCur++;
+ }
+
+ return true;
+}
+
+
+/**
+ * Step 6.1.5 - The wrapping up.
+ */
+static bool rtCrX509CpvWrapUp(PRTCRX509CERTPATHSINT pThis, PRTCRX509CERTPATHNODE pNode)
+{
+ Assert(!pNode->pParent); Assert(pThis->pTarget == pNode->pCert);
+
+ /*
+ * 6.1.5.a - Decrement explicit policy.
+ */
+ if (pThis->v.cExplicitPolicy > 0)
+ pThis->v.cExplicitPolicy--;
+
+ /*
+ * 6.1.5.b - Policy constraints and explicit policy.
+ */
+ PCRTCRX509POLICYCONSTRAINTS pPolicyConstraints = pNode->pCert->TbsCertificate.T3.pPolicyConstraints;
+ if ( pPolicyConstraints
+ && RTAsn1Integer_IsPresent(&pPolicyConstraints->RequireExplicitPolicy)
+ && RTAsn1Integer_UnsignedCompareWithU32(&pPolicyConstraints->RequireExplicitPolicy, 0) == 0)
+ pThis->v.cExplicitPolicy = 0;
+
+ /*
+ * 6.1.5.c-e - Update working public key info.
+ */
+ rtCrX509CpvSetWorkingPublicKeyInfo(pThis, pNode);
+
+ /*
+ * 6.1.5.f - Critical extensions.
+ */
+ if (!rtCrX509CpvCheckCriticalExtensions(pThis, pNode))
+ return false;
+
+ /*
+ * 6.1.5.g - Calculate the intersection between the user initial policy set
+ * and the valid policy tree.
+ */
+ rtCrX509CpvPolicyTreeIntersect(pThis, pThis->cInitialUserPolicySet, pThis->papInitialUserPolicySet);
+
+ if ( pThis->v.cExplicitPolicy == 0
+ && pThis->v.pValidPolicyTree == NULL)
+ return rtCrX509CpvFailed(pThis, VERR_CR_X509_CPV_NO_VALID_POLICY, "No valid policy (wrap-up).");
+
+ return true;
+}
+
+
+/**
+ * Worker that validates one path.
+ *
+ * This implements the the algorithm in RFC-5280, section 6.1, with exception of
+ * the CRL checks in 6.1.3.a.3.
+ *
+ * @returns success indicator.
+ * @param pThis The path builder & validator instance.
+ * @param pTrustAnchor The trust anchor node.
+ */
+static bool rtCrX509CpvOneWorker(PRTCRX509CERTPATHSINT pThis, PRTCRX509CERTPATHNODE pTrustAnchor)
+{
+ /*
+ * Special case, target certificate is trusted.
+ */
+ if (!pTrustAnchor->pParent)
+ return rtCrX509CpvFailed(pThis, VERR_CR_X509_CERTPATHS_INTERNAL_ERROR, "Target certificate is trusted.");
+
+ /*
+ * Normal processing.
+ */
+ rtCrX509CpvInit(pThis, pTrustAnchor);
+ if (RT_SUCCESS(pThis->rc))
+ {
+ PRTCRX509CERTPATHNODE pNode = pTrustAnchor->pParent;
+ uint32_t iNode = pThis->v.iNode = 1; /* We count to cNode (inclusive). Same a validation tree depth. */
+ while (pNode && RT_SUCCESS(pThis->rc))
+ {
+ /*
+ * Basic certificate processing.
+ */
+ if (!rtCrX509CpvCheckBasicCertInfo(pThis, pNode)) /* Step 6.1.3.a */
+ break;
+
+ bool const fSelfIssued = rtCrX509CertPathsIsSelfIssued(pNode);
+ if (!fSelfIssued || !pNode->pParent) /* Step 6.1.3.b-c */
+ if (!rtCrX509CpvCheckNameConstraints(pThis, pNode))
+ break;
+
+ if (!rtCrX509CpvWorkValidPolicyTree(pThis, iNode, pNode, fSelfIssued)) /* Step 6.1.3.d-f */
+ break;
+
+ /*
+ * If it's the last certificate in the path, do wrap-ups.
+ */
+ if (!pNode->pParent) /* Step 6.1.5 */
+ {
+ Assert(iNode == pThis->v.cNodes);
+ if (!rtCrX509CpvWrapUp(pThis, pNode))
+ break;
+ AssertRCBreak(pThis->rc);
+ return true;
+ }
+
+ /*
+ * Preparations for the next certificate.
+ */
+ PCRTCRX509TBSCERTIFICATE const pTbsCert = &pNode->pCert->TbsCertificate;
+ if ( pTbsCert->T3.pPolicyMappings
+ && !rtCrX509CpvSoakUpPolicyMappings(pThis, iNode, pTbsCert->T3.pPolicyMappings)) /* Step 6.1.4.a-b */
+ break;
+
+ pThis->v.pWorkingIssuer = &pTbsCert->Subject; /* Step 6.1.4.c */
+
+ rtCrX509CpvSetWorkingPublicKeyInfo(pThis, pNode); /* Step 6.1.4.d-f */
+
+ if ( pTbsCert->T3.pNameConstraints /* Step 6.1.4.g */
+ && !rtCrX509CpvSoakUpNameConstraints(pThis, pTbsCert->T3.pNameConstraints))
+ break;
+
+ if (!fSelfIssued) /* Step 6.1.4.h */
+ {
+ if (pThis->v.cExplicitPolicy > 0)
+ pThis->v.cExplicitPolicy--;
+ if (pThis->v.cInhibitPolicyMapping > 0)
+ pThis->v.cInhibitPolicyMapping--;
+ if (pThis->v.cInhibitAnyPolicy > 0)
+ pThis->v.cInhibitAnyPolicy--;
+ }
+
+ if ( pTbsCert->T3.pPolicyConstraints /* Step 6.1.4.j */
+ && !rtCrX509CpvSoakUpPolicyConstraints(pThis, pTbsCert->T3.pPolicyConstraints))
+ break;
+
+ if ( pTbsCert->T3.pInhibitAnyPolicy /* Step 6.1.4.j */
+ && !rtCrX509CpvSoakUpInhibitAnyPolicy(pThis, pTbsCert->T3.pInhibitAnyPolicy))
+ break;
+
+ if (!rtCrX509CpvCheckAndSoakUpBasicConstraintsAndKeyUsage(pThis, pNode, fSelfIssued)) /* Step 6.1.4.k-n */
+ break;
+
+ if (!rtCrX509CpvCheckCriticalExtensions(pThis, pNode)) /* Step 6.1.4.o */
+ break;
+
+ /*
+ * Advance to the next certificate.
+ */
+ pNode = pNode->pParent;
+ pThis->v.iNode = ++iNode;
+ }
+ AssertStmt(RT_FAILURE_NP(pThis->rc), pThis->rc = VERR_CR_X509_CERTPATHS_INTERNAL_ERROR);
+ }
+ return false;
+}
+
+
+RTDECL(int) RTCrX509CertPathsValidateOne(RTCRX509CERTPATHS hCertPaths, uint32_t iPath, PRTERRINFO pErrInfo)
+{
+ /*
+ * Validate the input.
+ */
+ PRTCRX509CERTPATHSINT pThis = hCertPaths;
+ AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
+ AssertReturn(pThis->u32Magic == RTCRX509CERTPATHSINT_MAGIC, VERR_INVALID_HANDLE);
+ AssertReturn(!(pThis->fFlags & ~RTCRX509CERTPATHSINT_F_VALID_MASK), VERR_INVALID_PARAMETER);
+ AssertPtrReturn(pThis->pTarget, VERR_INVALID_PARAMETER);
+ AssertPtrReturn(pThis->pRoot, VERR_INVALID_PARAMETER);
+ AssertReturn(pThis->rc == VINF_SUCCESS, VERR_INVALID_PARAMETER);
+
+ /*
+ * Locate the path and validate it.
+ */
+ int rc;
+ if (iPath < pThis->cPaths)
+ {
+ PRTCRX509CERTPATHNODE pLeaf = rtCrX509CertPathsGetLeafByIndex(pThis, iPath);
+ if (pLeaf)
+ {
+ if (RTCRX509CERTPATHNODE_SRC_IS_TRUSTED(pLeaf->uSrc))
+ {
+ pThis->pErrInfo = pErrInfo;
+ rtCrX509CpvOneWorker(pThis, pLeaf);
+ pThis->pErrInfo = NULL;
+ rc = pThis->rc;
+ pThis->rc = VINF_SUCCESS;
+ }
+ else
+ rc = RTErrInfoSetF(pErrInfo, VERR_CR_X509_NO_TRUST_ANCHOR, "Path #%u is does not have a trust anchor: uSrc=%s",
+ iPath, rtCrX509CertPathsNodeGetSourceName(pLeaf));
+ pLeaf->rcVerify = rc;
+ }
+ else
+ rc = VERR_CR_X509_CERTPATHS_INTERNAL_ERROR;
+ }
+ else
+ rc = VERR_NOT_FOUND;
+ return rc;
+}
+
+
+RTDECL(int) RTCrX509CertPathsValidateAll(RTCRX509CERTPATHS hCertPaths, uint32_t *pcValidPaths, PRTERRINFO pErrInfo)
+{
+ /*
+ * Validate the input.
+ */
+ PRTCRX509CERTPATHSINT pThis = hCertPaths;
+ AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
+ AssertReturn(pThis->u32Magic == RTCRX509CERTPATHSINT_MAGIC, VERR_INVALID_HANDLE);
+ AssertReturn(!(pThis->fFlags & ~RTCRX509CERTPATHSINT_F_VALID_MASK), VERR_INVALID_PARAMETER);
+ AssertPtrReturn(pThis->pTarget, VERR_INVALID_PARAMETER);
+ AssertPtrReturn(pThis->pRoot, VERR_INVALID_PARAMETER);
+ AssertReturn(pThis->rc == VINF_SUCCESS, VERR_INVALID_PARAMETER);
+ AssertPtrNullReturn(pcValidPaths, VERR_INVALID_POINTER);
+
+ /*
+ * Validate the paths.
+ */
+ pThis->pErrInfo = pErrInfo;
+
+ int rcLastFailure = VINF_SUCCESS;
+ uint32_t cValidPaths = 0;
+ uint32_t iPath = 0;
+ PRTCRX509CERTPATHNODE pCurLeaf;
+ RTListForEach(&pThis->LeafList, pCurLeaf, RTCRX509CERTPATHNODE, ChildListOrLeafEntry)
+ {
+ if (RTCRX509CERTPATHNODE_SRC_IS_TRUSTED(pCurLeaf->uSrc))
+ {
+ rtCrX509CpvOneWorker(hCertPaths, pCurLeaf);
+ if (RT_SUCCESS(pThis->rc))
+ cValidPaths++;
+ else
+ rcLastFailure = pThis->rc;
+ pCurLeaf->rcVerify = pThis->rc;
+ pThis->rc = VINF_SUCCESS;
+ }
+ else
+ pCurLeaf->rcVerify = VERR_CR_X509_NO_TRUST_ANCHOR;
+ }
+
+ pThis->pErrInfo = NULL;
+
+ if (pcValidPaths)
+ *pcValidPaths = cValidPaths;
+ if (cValidPaths > 0)
+ return VINF_SUCCESS;
+ if (RT_SUCCESS_NP(rcLastFailure))
+ return RTErrInfoSetF(pErrInfo, VERR_CR_X509_CPV_NO_TRUSTED_PATHS,
+ "None of the %u path(s) have a trust anchor.", pThis->cPaths);
+ return rcLastFailure;
+}
+
+
+RTDECL(uint32_t) RTCrX509CertPathsGetPathCount(RTCRX509CERTPATHS hCertPaths)
+{
+ /*
+ * Validate the input.
+ */
+ PRTCRX509CERTPATHSINT pThis = hCertPaths;
+ AssertPtrReturn(pThis, UINT32_MAX);
+ AssertReturn(pThis->u32Magic == RTCRX509CERTPATHSINT_MAGIC, UINT32_MAX);
+ AssertPtrReturn(pThis->pRoot, UINT32_MAX);
+
+ /*
+ * Return data.
+ */
+ return pThis->cPaths;
+}
+
+
+RTDECL(int) RTCrX509CertPathsQueryPathInfo(RTCRX509CERTPATHS hCertPaths, uint32_t iPath,
+ bool *pfTrusted, uint32_t *pcNodes, PCRTCRX509NAME *ppSubject,
+ PCRTCRX509SUBJECTPUBLICKEYINFO *ppPublicKeyInfo,
+ PCRTCRX509CERTIFICATE *ppCert, PCRTCRCERTCTX *ppCertCtx,
+ int *prcVerify)
+{
+ /*
+ * Validate the input.
+ */
+ PRTCRX509CERTPATHSINT pThis = hCertPaths;
+ AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
+ AssertReturn(pThis->u32Magic == RTCRX509CERTPATHSINT_MAGIC, VERR_INVALID_HANDLE);
+ AssertPtrReturn(pThis->pRoot, VERR_WRONG_ORDER);
+ AssertReturn(iPath < pThis->cPaths, VERR_NOT_FOUND);
+
+ /*
+ * Get the data.
+ */
+ PRTCRX509CERTPATHNODE pLeaf = rtCrX509CertPathsGetLeafByIndex(pThis, iPath);
+ AssertReturn(pLeaf, VERR_CR_X509_INTERNAL_ERROR);
+
+ if (pfTrusted)
+ *pfTrusted = RTCRX509CERTPATHNODE_SRC_IS_TRUSTED(pLeaf->uSrc);
+
+ if (pcNodes)
+ *pcNodes = pLeaf->uDepth + 1; /* Includes both trust anchor and target. */
+
+ if (ppSubject)
+ *ppSubject = pLeaf->pCert ? &pLeaf->pCert->TbsCertificate.Subject : &pLeaf->pCertCtx->pTaInfo->CertPath.TaName;
+
+ if (ppPublicKeyInfo)
+ *ppPublicKeyInfo = pLeaf->pCert ? &pLeaf->pCert->TbsCertificate.SubjectPublicKeyInfo : &pLeaf->pCertCtx->pTaInfo->PubKey;
+
+ if (ppCert)
+ *ppCert = pLeaf->pCert;
+
+ if (ppCertCtx)
+ {
+ if (pLeaf->pCertCtx)
+ {
+ uint32_t cRefs = RTCrCertCtxRetain(pLeaf->pCertCtx);
+ AssertReturn(cRefs != UINT32_MAX, VERR_CR_X509_INTERNAL_ERROR);
+ }
+ *ppCertCtx = pLeaf->pCertCtx;
+ }
+
+ if (prcVerify)
+ *prcVerify = pLeaf->rcVerify;
+
+ return VINF_SUCCESS;
+}
+
+
+RTDECL(uint32_t) RTCrX509CertPathsGetPathLength(RTCRX509CERTPATHS hCertPaths, uint32_t iPath)
+{
+ /*
+ * Validate the input.
+ */
+ PRTCRX509CERTPATHSINT pThis = hCertPaths;
+ AssertPtrReturn(pThis, UINT32_MAX);
+ AssertReturn(pThis->u32Magic == RTCRX509CERTPATHSINT_MAGIC, UINT32_MAX);
+ AssertPtrReturn(pThis->pRoot, UINT32_MAX);
+ AssertReturn(iPath < pThis->cPaths, UINT32_MAX);
+
+ /*
+ * Get the data.
+ */
+ PRTCRX509CERTPATHNODE pLeaf = rtCrX509CertPathsGetLeafByIndex(pThis, iPath);
+ AssertReturn(pLeaf, UINT32_MAX);
+ return pLeaf->uDepth + 1;
+}
+
+
+RTDECL(int) RTCrX509CertPathsGetPathVerifyResult(RTCRX509CERTPATHS hCertPaths, uint32_t iPath)
+{
+ /*
+ * Validate the input.
+ */
+ PRTCRX509CERTPATHSINT pThis = hCertPaths;
+ AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
+ AssertReturn(pThis->u32Magic == RTCRX509CERTPATHSINT_MAGIC, VERR_INVALID_HANDLE);
+ AssertPtrReturn(pThis->pRoot, VERR_WRONG_ORDER);
+ AssertReturn(iPath < pThis->cPaths, VERR_NOT_FOUND);
+
+ /*
+ * Get the data.
+ */
+ PRTCRX509CERTPATHNODE pLeaf = rtCrX509CertPathsGetLeafByIndex(pThis, iPath);
+ AssertReturn(pLeaf, VERR_CR_X509_INTERNAL_ERROR);
+
+ return pLeaf->rcVerify;
+}
+
+
+static PRTCRX509CERTPATHNODE rtCrX509CertPathsGetPathNodeByIndexes(PRTCRX509CERTPATHSINT pThis, uint32_t iPath, uint32_t iNode)
+{
+ PRTCRX509CERTPATHNODE pNode = rtCrX509CertPathsGetLeafByIndex(pThis, iPath);
+ Assert(pNode);
+ if (pNode)
+ {
+ if (iNode <= pNode->uDepth)
+ {
+ uint32_t uCertDepth = pNode->uDepth - iNode;
+ while (pNode->uDepth > uCertDepth)
+ pNode = pNode->pParent;
+ Assert(pNode);
+ Assert(pNode && pNode->uDepth == uCertDepth);
+ return pNode;
+ }
+ }
+
+ return NULL;
+}
+
+
+RTDECL(PCRTCRX509CERTIFICATE) RTCrX509CertPathsGetPathNodeCert(RTCRX509CERTPATHS hCertPaths, uint32_t iPath, uint32_t iNode)
+{
+ /*
+ * Validate the input.
+ */
+ PRTCRX509CERTPATHSINT pThis = hCertPaths;
+ AssertPtrReturn(pThis, NULL);
+ AssertReturn(pThis->u32Magic == RTCRX509CERTPATHSINT_MAGIC, NULL);
+ AssertPtrReturn(pThis->pRoot, NULL);
+ AssertReturn(iPath < pThis->cPaths, NULL);
+
+ /*
+ * Get the data.
+ */
+ PRTCRX509CERTPATHNODE pNode = rtCrX509CertPathsGetPathNodeByIndexes(pThis, iPath, iNode);
+ if (pNode)
+ return pNode->pCert;
+ return NULL;
+}
+
+
+/** @} */
+
diff --git a/src/VBox/Runtime/common/crypto/x509-core.cpp b/src/VBox/Runtime/common/crypto/x509-core.cpp
new file mode 100644
index 00000000000..e8a768e4c95
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/x509-core.cpp
@@ -0,0 +1,1520 @@
+/* $Id$ */
+/** @file
+ * IPRT - Crypto - X.509, Core APIs.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/crypto/x509.h>
+
+#include <iprt/err.h>
+#include <iprt/string.h>
+#include <iprt/uni.h>
+
+#include "x509-internal.h"
+
+
+/*
+ * Generate the code.
+ */
+#include <iprt/asn1-generator-core.h>
+
+
+/*
+ * X.509 Validity.
+ */
+
+RTDECL(bool) RTCrX509Validity_IsValidAtTimeSpec(PCRTCRX509VALIDITY pThis, PCRTTIMESPEC pTimeSpec)
+{
+ if (RTAsn1Time_CompareWithTimeSpec(&pThis->NotBefore, pTimeSpec) > 0)
+ return false;
+ if (RTAsn1Time_CompareWithTimeSpec(&pThis->NotAfter, pTimeSpec) < 0)
+ return false;
+ return true;
+}
+
+
+/*
+ * One X.509 Algorithm Identifier.
+ */
+
+RTDECL(RTDIGESTTYPE) RTCrX509AlgorithmIdentifier_QueryDigestType(PCRTCRX509ALGORITHMIDENTIFIER pThis)
+{
+ AssertPtrReturn(pThis, RTDIGESTTYPE_INVALID);
+ if (!strcmp(pThis->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_MD5))
+ return RTDIGESTTYPE_MD5;
+ if (!strcmp(pThis->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_SHA1))
+ return RTDIGESTTYPE_SHA1;
+ if (!strcmp(pThis->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_SHA256))
+ return RTDIGESTTYPE_SHA256;
+ if (!strcmp(pThis->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_SHA512))
+ return RTDIGESTTYPE_SHA512;
+ return RTDIGESTTYPE_INVALID;
+}
+
+
+RTDECL(uint32_t) RTCrX509AlgorithmIdentifier_QueryDigestSize(PCRTCRX509ALGORITHMIDENTIFIER pThis)
+{
+ AssertPtrReturn(pThis, UINT32_MAX);
+
+ /* common */
+ if (!strcmp(pThis->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_MD5))
+ return 128 / 8;
+ if (!strcmp(pThis->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_SHA1))
+ return 160 / 8;
+ if (!strcmp(pThis->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_SHA256))
+ return 256 / 8;
+ if (!strcmp(pThis->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_SHA512))
+ return 512 / 8;
+
+ /* Less common. */
+ if (!strcmp(pThis->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_MD2))
+ return 128 / 8;
+ if (!strcmp(pThis->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_MD4))
+ return 128 / 8;
+ if (!strcmp(pThis->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_SHA384))
+ return 384 / 8;
+ if (!strcmp(pThis->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_SHA224))
+ return 224 / 8;
+ if (!strcmp(pThis->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_WHIRLPOOL))
+ return 512 / 8;
+
+ return UINT32_MAX;
+}
+
+
+RTDECL(int) RTCrX509AlgorithmIdentifier_CompareWithString(PCRTCRX509ALGORITHMIDENTIFIER pThis, const char *pszObjId)
+{
+ return strcmp(pThis->Algorithm.szObjId, pszObjId);
+}
+
+
+RTDECL(int) RTCrX509AlgorithmIdentifier_CompareDigestAndEncryptedDigest(PCRTCRX509ALGORITHMIDENTIFIER pDigest,
+ PCRTCRX509ALGORITHMIDENTIFIER pEncryptedDigest)
+{
+ /* common */
+ if (!strcmp(pDigest->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_MD5))
+ {
+ if (!strcmp(pEncryptedDigest->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_MD5_WITH_RSA))
+ return 0;
+ }
+ else if (!strcmp(pDigest->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_SHA1))
+ {
+ if (!strcmp(pEncryptedDigest->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_SHA1_WITH_RSA))
+ return 0;
+ }
+ else if (!strcmp(pDigest->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_SHA256))
+ {
+ if (!strcmp(pEncryptedDigest->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_SHA256_WITH_RSA))
+ return 0;
+ }
+ else if (!strcmp(pDigest->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_SHA512))
+ {
+ if (!strcmp(pEncryptedDigest->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_SHA512_WITH_RSA))
+ return 0;
+ }
+ /* Less common. */
+ else if (!strcmp(pDigest->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_MD2))
+ {
+ if (!strcmp(pEncryptedDigest->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_MD2_WITH_RSA))
+ return 0;
+ }
+ else if (!strcmp(pDigest->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_MD4))
+ {
+ if (!strcmp(pEncryptedDigest->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_MD4_WITH_RSA))
+ return 0;
+ }
+ else if (!strcmp(pDigest->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_SHA384))
+ {
+ if (!strcmp(pEncryptedDigest->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_SHA384_WITH_RSA))
+ return 0;
+ }
+ else if (!strcmp(pDigest->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_SHA224))
+ {
+ if (!strcmp(pEncryptedDigest->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_SHA224_WITH_RSA))
+ return 0;
+ }
+ else if (!strcmp(pDigest->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_WHIRLPOOL))
+ {
+ /* ?? */
+ }
+ else
+ return -1;
+ return 1;
+}
+
+
+/*
+ * Set of X.509 Algorithm Identifiers.
+ */
+
+
+/*
+ * One X.509 AttributeTypeAndValue.
+ */
+
+
+/*
+ * Set of X.509 AttributeTypeAndValues / X.509 RelativeDistinguishedName.
+ */
+
+/**
+ * Slow code path of rtCrX509CanNameIsNothing.
+ *
+ * @returns true if @uc maps to nothing, false if not.
+ * @param uc The unicode code point.
+ */
+static bool rtCrX509CanNameIsNothingSlow(RTUNICP uc)
+{
+ switch (uc)
+ {
+ /* 2.2 Map - Paragraph 1: */
+ case 0x00ad:
+ case 0x1806:
+ case 0x034f:
+ case 0x180b: case 0x180c: case 0x180d:
+
+ case 0xfe00: case 0xfe01: case 0xfe02: case 0xfe03:
+ case 0xfe04: case 0xfe05: case 0xfe06: case 0xfe07:
+ case 0xfe08: case 0xfe09: case 0xfe0a: case 0xfe0b:
+ case 0xfe0c: case 0xfe0d: case 0xfe0e: case 0xfe0f:
+
+ case 0xfffc:
+
+ /* 2.2 Map - Paragraph 3 (control code/function): */
+ case 0x0000: case 0x0001: case 0x0002: case 0x0003:
+ case 0x0004: case 0x0005: case 0x0006: case 0x0007:
+ case 0x0008:
+
+ case 0x000e: case 0x000f:
+ case 0x0010: case 0x0011: case 0x0012: case 0x0013:
+ case 0x0014: case 0x0015: case 0x0016: case 0x0017:
+ case 0x0018: case 0x0019: case 0x001a: case 0x001b:
+ case 0x001c: case 0x001d: case 0x001e: case 0x001f:
+
+ case 0x007f:
+ case 0x0080: case 0x0081: case 0x0082: case 0x0083:
+ case 0x0084: /*case 0x0085:*/ case 0x0086: case 0x0087:
+ case 0x0088: case 0x0089: case 0x008a: case 0x008b:
+ case 0x008c: case 0x008d: case 0x008e: case 0x008f:
+ case 0x0090: case 0x0091: case 0x0092: case 0x0093:
+ case 0x0094: case 0x0095: case 0x0096: case 0x0097:
+ case 0x0098: case 0x0099: case 0x009a: case 0x009b:
+ case 0x009c: case 0x009d: case 0x009e: case 0x009f:
+
+ case 0x06dd:
+ case 0x070f:
+ case 0x180e:
+ case 0x200c: case 0x200d: case 0x200e: case 0x200f:
+ case 0x202a: case 0x202b: case 0x202c: case 0x202d: case 0x202e:
+ case 0x2060: case 0x2061: case 0x2062: case 0x2063:
+ case 0x206a: case 0x206b: case 0x206c: case 0x206d: case 0x206e: case 0x206f:
+ case 0xfeff:
+ case 0xfff9: case 0xfffa: case 0xfffb:
+ case 0x1d173: case 0x1d174: case 0x1d175: case 0x1d176: case 0x1d177: case 0x1d178: case 0x1d179: case 0x1d17a:
+ case 0xe0001:
+ case 0xe0020: case 0xe0021: case 0xe0022: case 0xe0023:
+ case 0xe0024: case 0xe0025: case 0xe0026: case 0xe0027:
+ case 0xe0028: case 0xe0029: case 0xe002a: case 0xe002b:
+ case 0xe002c: case 0xe002d: case 0xe002e: case 0xe002f:
+ case 0xe0030: case 0xe0031: case 0xe0032: case 0xe0033:
+ case 0xe0034: case 0xe0035: case 0xe0036: case 0xe0037:
+ case 0xe0038: case 0xe0039: case 0xe003a: case 0xe003b:
+ case 0xe003c: case 0xe003d: case 0xe003e: case 0xe003f:
+ case 0xe0040: case 0xe0041: case 0xe0042: case 0xe0043:
+ case 0xe0044: case 0xe0045: case 0xe0046: case 0xe0047:
+ case 0xe0048: case 0xe0049: case 0xe004a: case 0xe004b:
+ case 0xe004c: case 0xe004d: case 0xe004e: case 0xe004f:
+ case 0xe0050: case 0xe0051: case 0xe0052: case 0xe0053:
+ case 0xe0054: case 0xe0055: case 0xe0056: case 0xe0057:
+ case 0xe0058: case 0xe0059: case 0xe005a: case 0xe005b:
+ case 0xe005c: case 0xe005d: case 0xe005e: case 0xe005f:
+ case 0xe0060: case 0xe0061: case 0xe0062: case 0xe0063:
+ case 0xe0064: case 0xe0065: case 0xe0066: case 0xe0067:
+ case 0xe0068: case 0xe0069: case 0xe006a: case 0xe006b:
+ case 0xe006c: case 0xe006d: case 0xe006e: case 0xe006f:
+ case 0xe0070: case 0xe0071: case 0xe0072: case 0xe0073:
+ case 0xe0074: case 0xe0075: case 0xe0076: case 0xe0077:
+ case 0xe0078: case 0xe0079: case 0xe007a: case 0xe007b:
+ case 0xe007c: case 0xe007d: case 0xe007e: case 0xe007f:
+
+ /* 2.2 Map - Paragraph 4. */
+ case 0x200b:
+ return true;
+ }
+ return false;
+}
+
+
+/**
+ * Checks if @a uc maps to nothing according to mapping rules of RFC-5280 and
+ * RFC-4518.
+ *
+ * @returns true if @uc maps to nothing, false if not.
+ * @param uc The unicode code point.
+ */
+DECLINLINE(bool) rtCrX509CanNameIsNothing(RTUNICP uc)
+{
+ if (uc > 0x001f && uc < 0x00ad)
+ return false;
+ return rtCrX509CanNameIsNothingSlow(uc);
+}
+
+
+/**
+ * Slow code path of rtCrX509CanNameIsSpace.
+ *
+ * @returns true if space, false if not.
+ * @param uc The unicode code point.
+ */
+static bool rtCrX509CanNameIsSpaceSlow(RTUNICP uc)
+{
+ switch (uc)
+ {
+ /* 2.2 Map - Paragraph 2. */
+ case 0x09:
+ case 0x0a:
+ case 0x0b:
+ case 0x0c:
+ case 0x0d:
+ case 0x20:
+ case 0x0085:
+ case 0x00a0:
+ case 0x1680:
+ case 0x2000: case 0x2001: case 0x2002: case 0x2003:
+ case 0x2004: case 0x2005: case 0x2006: case 0x2007:
+ case 0x2008: case 0x2009: case 0x200a:
+ case 0x2028: case 0x2029:
+ case 0x202f:
+ case 0x205f:
+ case 0x3000:
+ return true;
+ }
+ return false;
+}
+
+
+/**
+ * Checks if @a uc is a space character according to the mapping rules of
+ * RFC-5280 and RFC-4518.
+ *
+ * @returns true if space, false if not.
+ * @param uc The unicode code point.
+ */
+DECLINLINE(bool) rtCrX509CanNameIsSpace(RTUNICP uc)
+{
+ if (uc < 0x0085)
+ {
+ if (uc > 0x0020)
+ return false;
+ if (uc == 0x0020) /* space */
+ return true;
+ }
+ return rtCrX509CanNameIsSpaceSlow(uc);
+}
+
+
+static const char *rtCrX509CanNameStripLeft(const char *psz, size_t *pcch)
+{
+ /*
+ * Return space when we've encountered the first non-space-non-nothing code point.
+ */
+ const char * const pszStart = psz;
+ const char *pszPrev;
+ for (;;)
+ {
+ pszPrev = psz;
+ RTUNICP uc;
+ int rc = RTStrGetCpEx(&psz, &uc);
+ AssertRCBreak(rc);
+ if (!uc)
+ {
+ if ((uintptr_t)(pszPrev - pszStart) >= *pcch)
+ break;
+ /* NUL inside the string, maps to nothing => ignore it. */
+ }
+ else if (!rtCrX509CanNameIsSpace(uc) && !rtCrX509CanNameIsNothing(uc))
+ break;
+ }
+ *pcch -= pszPrev - pszStart;
+ return pszPrev;
+}
+
+
+static RTUNICP rtCrX509CanNameGetNextCpWithMappingSlowSpace(const char **ppsz, size_t *pcch)
+{
+ /*
+ * Return space when we've encountered the first non-space-non-nothing code point.
+ */
+ RTUNICP uc;
+ const char *psz = *ppsz;
+ const char * const pszStart = psz;
+ const char *pszPrev;
+ for (;;)
+ {
+ pszPrev = psz;
+ int rc = RTStrGetCpEx(&psz, &uc);
+ AssertRCBreakStmt(rc, uc = 0x20);
+ if (!uc)
+ {
+ if ((uintptr_t)(pszPrev - pszStart) >= *pcch)
+ {
+ uc = 0; /* End of string: Ignore trailing spaces. */
+ break;
+ }
+ /* NUL inside the string, maps to nothing => ignore it. */
+ }
+ else if (!rtCrX509CanNameIsSpace(uc) && !rtCrX509CanNameIsNothing(uc))
+ {
+ uc = 0x20; /* Return space before current char. */
+ break;
+ }
+ }
+
+ *ppsz = pszPrev;
+ *pcch -= pszPrev - pszStart;
+ return uc;
+}
+
+
+DECLINLINE(RTUNICP) rtCrX509CanNameGetNextCpIgnoreNul(const char **ppsz, size_t *pcch)
+{
+ while (*pcch > 0)
+ {
+ const char *psz = *ppsz;
+ RTUNICP uc = *psz;
+ if (uc < 0x80)
+ {
+ *pcch -= 1;
+ *ppsz = psz + 1;
+ }
+ else
+ {
+ int rc = RTStrGetCpEx(ppsz, &uc);
+ AssertRCReturn(rc, uc);
+ size_t cchCp = *ppsz - psz;
+ AssertReturn(cchCp <= *pcch, 0);
+ *pcch -= cchCp;
+ }
+ if (uc != 0)
+ return uc;
+ }
+ return 0;
+}
+
+
+static RTUNICP rtCrX509CanNameGetNextCpWithMappingSlowNothing(const char **ppsz, size_t *pcch)
+{
+ /*
+ * Return first code point which doesn't map to nothing. If we encounter
+ * a space, we defer to the mapping-after-space routine above.
+ */
+ for (;;)
+ {
+ RTUNICP uc = rtCrX509CanNameGetNextCpIgnoreNul(ppsz, pcch);
+ if (rtCrX509CanNameIsSpace(uc))
+ return rtCrX509CanNameGetNextCpWithMappingSlowSpace(ppsz, pcch);
+ if (!rtCrX509CanNameIsNothing(uc) || uc == 0)
+ return uc;
+ }
+}
+
+
+DECLINLINE(RTUNICP) rtCrX509CanNameGetNextCpWithMapping(const char **ppsz, size_t *pcch)
+{
+ RTUNICP uc = rtCrX509CanNameGetNextCpIgnoreNul(ppsz, pcch);
+ if (uc)
+ {
+ if (!rtCrX509CanNameIsSpace(uc))
+ {
+ if (!rtCrX509CanNameIsNothing(uc))
+ return uc;
+ return rtCrX509CanNameGetNextCpWithMappingSlowNothing(ppsz, pcch);
+ }
+ return rtCrX509CanNameGetNextCpWithMappingSlowSpace(ppsz, pcch);
+ }
+ return uc;
+}
+
+
+RTDECL(bool) RTCrX509AttributeTypeAndValue_MatchAsRdnByRfc5280(PCRTCRX509ATTRIBUTETYPEANDVALUE pLeft,
+ PCRTCRX509ATTRIBUTETYPEANDVALUE pRight)
+{
+ if (RTAsn1ObjId_Compare(&pLeft->Type, &pRight->Type) == 0)
+ {
+ /*
+ * Try for perfect match in case we get luck.
+ */
+#ifdef DEBUG_bird /* Want to test the complicated code path first */
+ if (pLeft->Value.enmType != RTASN1TYPE_STRING || pRight->Value.enmType != RTASN1TYPE_STRING)
+#endif
+ if (RTAsn1DynType_Compare(&pLeft->Value, &pRight->Value) == 0)
+ return true;
+
+ /*
+ * If both are string types, we can compare them according to RFC-5280.
+ */
+ if ( pLeft->Value.enmType == RTASN1TYPE_STRING
+ && pRight->Value.enmType == RTASN1TYPE_STRING)
+ {
+ size_t cchLeft;
+ const char *pszLeft;
+ int rc = RTAsn1String_QueryUtf8(&pLeft->Value.u.String, &pszLeft, &cchLeft);
+ if (RT_SUCCESS(rc))
+ {
+ size_t cchRight;
+ const char *pszRight;
+ rc = RTAsn1String_QueryUtf8(&pRight->Value.u.String, &pszRight, &cchRight);
+ if (RT_SUCCESS(rc))
+ {
+ /*
+ * Perform a simplified RFC-5280 comparsion.
+ * The algorithm as be relaxed on the following counts:
+ * 1. No unicode normalization.
+ * 2. Prohibited characters not checked for.
+ * 3. Bidirectional characters are not ignored.
+ */
+ pszLeft = rtCrX509CanNameStripLeft(pszLeft, &cchLeft);
+ pszRight = rtCrX509CanNameStripLeft(pszRight, &cchRight);
+ while (*pszLeft && *pszRight)
+ {
+ RTUNICP ucLeft = rtCrX509CanNameGetNextCpWithMapping(&pszLeft, &cchLeft);
+ RTUNICP ucRight = rtCrX509CanNameGetNextCpWithMapping(&pszRight, &cchRight);
+ if (ucLeft != ucRight)
+ {
+ ucLeft = RTUniCpToLower(ucLeft);
+ ucRight = RTUniCpToLower(ucRight);
+ if (ucLeft != ucRight)
+ return false;
+ }
+ }
+
+ return cchRight == 0 && cchLeft == 0;
+ }
+ }
+ }
+ }
+ return false;
+}
+
+
+RTDECL(bool) RTCrX509RelativeDistinguishedName_MatchByRfc5280(PCRTCRX509RELATIVEDISTINGUISHEDNAME pLeft,
+ PCRTCRX509RELATIVEDISTINGUISHEDNAME pRight)
+{
+ /*
+ * No match if the attribute count differs.
+ */
+ uint32_t const cItems = pLeft->cItems;
+ if (cItems == pRight->cItems)
+ {
+ /*
+ * Compare each attribute, but don't insist on the same order nor
+ * bother checking for duplicates (too complicated).
+ */
+ for (uint32_t iLeft = 0; iLeft < cItems; iLeft++)
+ {
+ PCRTCRX509ATTRIBUTETYPEANDVALUE pLeftAttr = &pLeft->paItems[iLeft];
+ bool fFound = false;
+ for (uint32_t iRight = 0; iRight < cItems; iRight++)
+ if (RTCrX509AttributeTypeAndValue_MatchAsRdnByRfc5280(pLeftAttr, &pRight->paItems[iRight]))
+ {
+ fFound = true;
+ break;
+ }
+ if (!fFound)
+ return false;
+ }
+ return true;
+ }
+ return false;
+
+}
+
+
+/*
+ * X.509 Name.
+ */
+
+RTDECL(bool) RTCrX509Name_MatchByRfc5280(PCRTCRX509NAME pLeft, PCRTCRX509NAME pRight)
+{
+ uint32_t const cItems = pLeft->cItems;
+ if (cItems == pRight->cItems)
+ {
+ /* Require exact order. */
+ for (uint32_t iRdn = 0; iRdn < cItems; iRdn++)
+ if (!RTCrX509RelativeDistinguishedName_MatchByRfc5280(&pLeft->paItems[iRdn], &pRight->paItems[iRdn]))
+ return false;
+ return true;
+ }
+ return false;
+}
+
+
+RTDECL(bool) RTCrX509Name_ConstraintMatch(PCRTCRX509NAME pConstraint, PCRTCRX509NAME pName)
+{
+ /*
+ * Check that the constraint is a prefix of the name. This means that
+ * the name must have at least as many components and the constraint.
+ */
+ if (pName->cItems >= pConstraint->cItems)
+ {
+ /*
+ * Parallel crawl of the two RDNs arrays.
+ */
+ for (uint32_t i = 0; pConstraint->cItems; i++)
+ {
+ PCRTCRX509RELATIVEDISTINGUISHEDNAME pConstrRdns = &pConstraint->paItems[i];
+ PCRTCRX509RELATIVEDISTINGUISHEDNAME pNameRdns = &pName->paItems[i];
+
+ /*
+ * Walk the constraint attribute & value array.
+ */
+ for (uint32_t iConstrAttrib = 0; iConstrAttrib < pConstrRdns->cItems; iConstrAttrib++)
+ {
+ PCRTCRX509ATTRIBUTETYPEANDVALUE pConstrAttrib = &pConstrRdns->paItems[iConstrAttrib];
+
+ /*
+ * Find matching attribute & value in the name.
+ */
+ bool fFound = false;
+ for (uint32_t iNameAttrib = 0; iNameAttrib < pNameRdns->cItems; iNameAttrib++)
+ if (RTCrX509AttributeTypeAndValue_MatchAsRdnByRfc5280(pConstrAttrib, &pNameRdns->paItems[iNameAttrib]))
+ {
+ fFound = true;
+ break;
+ }
+ if (fFound)
+ return false;
+ }
+ }
+ return true;
+ }
+ return false;
+}
+
+
+/**
+ * Mapping between X.500 object IDs and short and long names.
+ *
+ * See RFC-1327, ...
+ */
+static struct
+{
+ const char *pszOid;
+ const char *pszShortNm;
+ size_t cchShortNm;
+ const char *pszLongNm;
+} const g_aRdnMap[] =
+{
+ { "0.9.2342.19200300.100.1.25", RT_STR_TUPLE("DC"), "DomainComponent" },
+ { "1.2.840.113549.1.9.1", RT_STR_TUPLE("Email"), "EmailAddress" },
+ { "2.5.4.3", RT_STR_TUPLE("CN"), "CommonName" },
+ { "2.5.4.4", RT_STR_TUPLE("S"), "Surname" },
+ { "2.5.4.6", RT_STR_TUPLE("C"), "CountryName" },
+ { "2.5.4.7", RT_STR_TUPLE("L"), "LocalityName" },
+ { "2.5.4.8", RT_STR_TUPLE("ST"), "StatOrProviceName" },
+ { "2.5.4.10", RT_STR_TUPLE("O"), "OrganizationName" },
+ { "2.5.4.11", RT_STR_TUPLE("OU"), "OrganizationUnitName" },
+ { "2.5.4.42", RT_STR_TUPLE("G"), "GivenName" },
+ { "2.5.4.43", RT_STR_TUPLE("I"), "Initials" },
+ { "2.5.4.44", RT_STR_TUPLE("GQ"), "GenerationQualifier" },
+};
+
+
+RTDECL(bool) RTCrX509Name_MatchWithString(PCRTCRX509NAME pThis, const char *pszString)
+{
+ /* Keep track of the string length. */
+ size_t cchString = strlen(pszString);
+
+ /*
+ * The usual double loop for walking the components.
+ */
+ for (uint32_t i = 0; i < pThis->cItems; i++)
+ {
+ PCRTCRX509RELATIVEDISTINGUISHEDNAME pRdn = &pThis->paItems[i];
+ for (uint32_t j = 0; j < pRdn->cItems; j++)
+ {
+ PCRTCRX509ATTRIBUTETYPEANDVALUE pComponent = &pRdn->paItems[j];
+
+ /*
+ * Must be a string.
+ */
+ if (pComponent->Value.enmType != RTASN1TYPE_STRING)
+ return false;
+
+ /*
+ * Look up the component name prefix and check whether it's also in the string.
+ */
+ uint32_t iName = RT_ELEMENTS(g_aRdnMap);
+ while (iName-- > 0)
+ if (RTAsn1ObjId_CompareWithString(&pComponent->Type, g_aRdnMap[iName].pszOid) == 0)
+ break;
+ AssertMsgReturn(iName != UINT32_MAX, ("Please extend g_aRdnMap with '%s'.\n", pComponent->Type.szObjId), false);
+
+ if ( strncmp(pszString, g_aRdnMap[iName].pszShortNm, g_aRdnMap[iName].cchShortNm) != 0
+ || pszString[g_aRdnMap[iName].cchShortNm] != '=')
+ return false;
+
+ pszString += g_aRdnMap[iName].cchShortNm + 1;
+ cchString -= g_aRdnMap[iName].cchShortNm + 1;
+
+ /*
+ * Compare the component string.
+ */
+ size_t cchComponent;
+ int rc = RTAsn1String_QueryUtf8Len(&pComponent->Value.u.String, &cchComponent);
+ AssertRCReturn(rc, false);
+
+ if (cchComponent > cchString)
+ return false;
+ if (RTAsn1String_CompareWithString(&pComponent->Value.u.String, pszString, cchComponent) != 0)
+ return false;
+
+ cchString -= cchComponent;
+ pszString += cchComponent;
+
+ /*
+ * Check separator comma + space and skip extra spaces before the next component.
+ */
+ if (cchString)
+ {
+ if (pszString[0] != ',')
+ return false;
+ if (pszString[1] != ' ' && pszString[1] != '\t')
+ return false;
+ pszString += 2;
+ cchString -= 2;
+
+ while (*pszString == ' ' || *pszString == '\t')
+ {
+ pszString++;
+ cchString--;
+ }
+ }
+ }
+ }
+
+ /*
+ * If we got thru the whole name and the whole string, we're good.
+ */
+ return *pszString == '\0';
+}
+
+
+RTDECL(int) RTCrX509Name_FormatAsString(PCRTCRX509NAME pThis, char *pszBuf, size_t cbBuf, size_t *pcbActual)
+{
+ /*
+ * The usual double loop for walking the components.
+ */
+ size_t off = 0;
+ int rc = VINF_SUCCESS;
+ for (uint32_t i = 0; i < pThis->cItems; i++)
+ {
+ PCRTCRX509RELATIVEDISTINGUISHEDNAME pRdn = &pThis->paItems[i];
+ for (uint32_t j = 0; j < pRdn->cItems; j++)
+ {
+ PCRTCRX509ATTRIBUTETYPEANDVALUE pComponent = &pRdn->paItems[j];
+
+ /*
+ * Must be a string.
+ */
+ if (pComponent->Value.enmType != RTASN1TYPE_STRING)
+ return VERR_CR_X509_NAME_NOT_STRING;
+
+ /*
+ * Look up the component name prefix.
+ */
+ uint32_t iName = RT_ELEMENTS(g_aRdnMap);
+ while (iName-- > 0)
+ if (RTAsn1ObjId_CompareWithString(&pComponent->Type, g_aRdnMap[iName].pszOid) == 0)
+ break;
+ AssertMsgReturn(iName != UINT32_MAX, ("Please extend g_aRdnMap with '%s'.\n", pComponent->Type.szObjId),
+ VERR_CR_X509_NAME_MISSING_RDN_MAP_ENTRY);
+
+ /*
+ * Append the prefix.
+ */
+ if (off)
+ {
+ if (off + 2 < cbBuf)
+ {
+ pszBuf[off] = ',';
+ pszBuf[off + 1] = ' ';
+ }
+ else
+ rc = VERR_BUFFER_OVERFLOW;
+ off += 2;
+ }
+
+ if (off + g_aRdnMap[iName].cchShortNm + 1 < cbBuf)
+ {
+ memcpy(&pszBuf[off], g_aRdnMap[iName].pszShortNm, g_aRdnMap[iName].cchShortNm);
+ pszBuf[off + g_aRdnMap[iName].cchShortNm] = '=';
+ }
+ else
+ rc = VERR_BUFFER_OVERFLOW;
+ off += g_aRdnMap[iName].cchShortNm + 1;
+
+ /*
+ * Add the component string.
+ */
+ const char *pszUtf8;
+ size_t cchUtf8;
+ int rc2 = RTAsn1String_QueryUtf8(&pComponent->Value.u.String, &pszUtf8, &cchUtf8);
+ AssertRCReturn(rc2, rc2);
+ if (off + cchUtf8 < cbBuf)
+ memcpy(&pszBuf[off], pszUtf8, cchUtf8);
+ else
+ rc = VERR_BUFFER_OVERFLOW;
+ off += cchUtf8;
+ }
+ }
+
+ if (pcbActual)
+ *pcbActual = off + 1;
+ if (off < cbBuf)
+ pszBuf[off] = '\0';
+ return rc;
+}
+
+
+
+/*
+ * One X.509 GeneralName.
+ */
+
+/**
+ * Name constraint matching (RFC-5280): DNS Name.
+ *
+ * @returns true on match, false on mismatch.
+ * @param pConstraint The constraint name.
+ * @param pName The name to match against the constraint.
+ */
+static bool rtCrX509GeneralName_ConstraintMatchDnsName(PCRTCRX509GENERALNAME pConstraint, PCRTCRX509GENERALNAME pName)
+{
+ /*
+ * Empty constraint string is taken to match everything.
+ */
+ if (pConstraint->u.pT2_DnsName->Asn1Core.cb == 0)
+ return true;
+
+ /*
+ * Get the UTF-8 strings for the two.
+ */
+ size_t cchConstraint;
+ char const *pszConstraint;
+ int rc = RTAsn1String_QueryUtf8(pConstraint->u.pT2_DnsName, &pszConstraint, &cchConstraint);
+ if (RT_SUCCESS(rc))
+ {
+ size_t cchFull;
+ char const *pszFull;
+ rc = RTAsn1String_QueryUtf8(pName->u.pT2_DnsName, &pszFull, &cchFull);
+ if (RT_SUCCESS(rc))
+ {
+ /*
+ * No match if the constraint is longer.
+ */
+ if (cchConstraint > cchFull)
+ return false;
+
+ /*
+ * No match if the constraint and name tail doesn't match
+ * in a case-insensitive compare.
+ */
+ size_t offFull = cchFull - cchConstraint;
+ if (RTStrICmp(&pszFull[offFull], pszConstraint) != 0)
+ return false;
+ if (!offFull)
+ return true;
+
+ /*
+ * The matching constraint must be delimited by a dot in the full
+ * name. There seems to be some discussion whether ".oracle.com"
+ * should match "www..oracle.com". This implementation does choose
+ * to not succeed in that case.
+ */
+ if ((pszFull[offFull - 1] == '.') ^ (pszFull[offFull] == '.'))
+ return true;
+
+ return false;
+ }
+ }
+
+ /* fall back. */
+ return RTCrX509GeneralName_Compare(pConstraint, pName) == 0;
+}
+
+
+/**
+ * Name constraint matching (RFC-5280): RFC-822 (email).
+ *
+ * @returns true on match, false on mismatch.
+ * @param pConstraint The constraint name.
+ * @param pName The name to match against the constraint.
+ */
+static bool rtCrX509GeneralName_ConstraintMatchRfc822Name(PCRTCRX509GENERALNAME pConstraint, PCRTCRX509GENERALNAME pName)
+{
+ /*
+ * Empty constraint string is taken to match everything.
+ */
+ if (pConstraint->u.pT1_Rfc822->Asn1Core.cb == 0)
+ return true;
+
+ /*
+ * Get the UTF-8 strings for the two.
+ */
+ size_t cchConstraint;
+ char const *pszConstraint;
+ int rc = RTAsn1String_QueryUtf8(pConstraint->u.pT1_Rfc822, &pszConstraint, &cchConstraint);
+ if (RT_SUCCESS(rc))
+ {
+ size_t cchFull;
+ char const *pszFull;
+ rc = RTAsn1String_QueryUtf8(pName->u.pT1_Rfc822, &pszFull, &cchFull);
+ if (RT_SUCCESS(rc))
+ {
+ /*
+ * No match if the constraint is longer.
+ */
+ if (cchConstraint > cchFull)
+ return false;
+
+ /*
+ * A lone dot matches everything.
+ */
+ if (cchConstraint == 1 && *pszConstraint == '.')
+ return true;
+
+ /*
+ * If there is a '@' in the constraint, the entire address must match.
+ */
+ const char *pszConstraintAt = (const char *)memchr(pszConstraint, '@', cchConstraint);
+ if (pszConstraintAt)
+ return cchConstraint == cchFull && RTStrICmp(pszConstraint, pszFull) == 0;
+
+ /*
+ * No match if the constraint and name tail doesn't match
+ * in a case-insensitive compare.
+ */
+ size_t offFull = cchFull - cchConstraint;
+ if (RTStrICmp(&pszFull[offFull], pszConstraint) != 0)
+ return false;
+
+ /*
+ * If the constraint starts with a dot, we're supposed to be
+ * satisfied with a tail match.
+ */
+ /** @todo Check if this should match even if offFull == 0. */
+ if (*pszConstraint == '.')
+ return true;
+
+ /*
+ * Otherwise, we require a hostname match and thus expect an '@'
+ * immediatly preceding the constraint match.
+ */
+ if (pszFull[offFull - 1] == '@')
+ return true;
+
+ return false;
+ }
+ }
+
+ /* fall back. */
+ return RTCrX509GeneralName_Compare(pConstraint, pName) == 0;
+}
+
+
+/**
+ * Extracts the hostname from an URI.
+ *
+ * @returns true if successfully extract, false if no hostname present.
+ * @param pszUri The URI.
+ * @param pchHostName .
+ * @param pcchHostName .
+ */
+static bool rtCrX509GeneralName_ExtractHostName(const char *pszUri, const char **pchHostName, size_t *pcchHostName)
+{
+ /*
+ * Skip the schema name.
+ */
+ const char *pszStart = strchr(pszUri, ':');
+ while (pszStart && (pszStart[1] != '/' || pszStart[2] != '/'))
+ pszStart = strchr(pszStart + 1, ':');
+ if (pszStart)
+ {
+ pszStart += 3;
+
+ /*
+ * The name ends with the first slash or ":port".
+ */
+ const char *pszEnd = strchr(pszStart, '/');
+ if (!pszEnd)
+ pszEnd = strchr(pszStart, '\0');
+ if (memchr(pszStart, ':', pszEnd - pszStart))
+ do
+ pszEnd--;
+ while (*pszEnd != ':');
+ if (pszEnd != pszStart)
+ {
+ /*
+ * Drop access credentials at the front of the string if present.
+ */
+ const char *pszAt = (const char *)memchr(pszStart, '@', pszEnd - pszStart);
+ if (pszAt)
+ pszStart = pszAt + 1;
+
+ /*
+ * If there is still some string left, that's the host name.
+ */
+ if (pszEnd != pszStart)
+ {
+ *pcchHostName = pszEnd - pszStart;
+ *pchHostName = pszStart;
+ return true;
+ }
+ }
+ }
+
+ *pcchHostName = 0;
+ *pchHostName = NULL;
+ return false;
+}
+
+
+/**
+ * Name constraint matching (RFC-5280): URI.
+ *
+ * @returns true on match, false on mismatch.
+ * @param pConstraint The constraint name.
+ * @param pName The name to match against the constraint.
+ */
+static bool rtCrX509GeneralName_ConstraintMatchUri(PCRTCRX509GENERALNAME pConstraint, PCRTCRX509GENERALNAME pName)
+{
+ /*
+ * Empty constraint string is taken to match everything.
+ */
+ if (pConstraint->u.pT6_Uri->Asn1Core.cb == 0)
+ return true;
+
+ /*
+ * Get the UTF-8 strings for the two.
+ */
+ size_t cchConstraint;
+ char const *pszConstraint;
+ int rc = RTAsn1String_QueryUtf8(pConstraint->u.pT6_Uri, &pszConstraint, &cchConstraint);
+ if (RT_SUCCESS(rc))
+ {
+ size_t cchFull;
+ char const *pszFull;
+ rc = RTAsn1String_QueryUtf8(pName->u.pT6_Uri, &pszFull, &cchFull);
+ if (RT_SUCCESS(rc))
+ {
+ /*
+ * Isolate the hostname in the name.
+ */
+ size_t cchHostName;
+ const char *pchHostName;
+ if (rtCrX509GeneralName_ExtractHostName(pszFull, &pchHostName, &cchHostName))
+ {
+ /*
+ * Domain constraint.
+ */
+ if (*pszConstraint == '.')
+ {
+ if (cchHostName >= cchConstraint)
+ {
+ size_t offHostName = cchHostName - cchConstraint;
+ if (RTStrICmp(&pchHostName[offHostName], pszConstraint) == 0)
+ {
+ /* "http://www..oracle.com" does not match ".oracle.com".
+ It's debatable whether "http://.oracle.com/" should match. */
+ if ( !offHostName
+ || pchHostName[offHostName - 1] != '.')
+ return true;
+ }
+ }
+ }
+ /*
+ * Host name constraint. Full match required.
+ */
+ else if ( cchHostName == cchConstraint
+ && RTStrNICmp(pchHostName, pszConstraint, cchHostName) == 0)
+ return true;
+ }
+ return false;
+ }
+ }
+
+ /* fall back. */
+ return RTCrX509GeneralName_Compare(pConstraint, pName) == 0;
+}
+
+
+/**
+ * Name constraint matching (RFC-5280): IP address.
+ *
+ * @returns true on match, false on mismatch.
+ * @param pConstraint The constraint name.
+ * @param pName The name to match against the constraint.
+ */
+static bool rtCrX509GeneralName_ConstraintMatchIpAddress(PCRTCRX509GENERALNAME pConstraint, PCRTCRX509GENERALNAME pName)
+{
+ uint8_t const *pbConstraint = pConstraint->u.pT7_IpAddress->Asn1Core.uData.pu8;
+ uint8_t const *pbFull = pName->u.pT7_IpAddress->Asn1Core.uData.pu8;
+
+ /*
+ * IPv4.
+ */
+ if ( pConstraint->u.pT7_IpAddress->Asn1Core.cb == 8 /* ip+netmask*/
+ && pName->u.pT7_IpAddress->Asn1Core.cb == 4) /* ip */
+ return ((pbFull[0] ^ pbConstraint[0]) & pbConstraint[4]) == 0
+ && ((pbFull[1] ^ pbConstraint[1]) & pbConstraint[5]) == 0
+ && ((pbFull[2] ^ pbConstraint[2]) & pbConstraint[6]) == 0
+ && ((pbFull[3] ^ pbConstraint[3]) & pbConstraint[7]) == 0;
+
+ /*
+ * IPv6.
+ */
+ if ( pConstraint->u.pT7_IpAddress->Asn1Core.cb == 32 /* ip+netmask*/
+ && pName->u.pT7_IpAddress->Asn1Core.cb == 16) /* ip */
+ {
+ for (uint32_t i = 0; i < 16; i++)
+ if (((pbFull[i] ^ pbConstraint[i]) & pbConstraint[i + 16]) != 0)
+ return false;
+ return true;
+ }
+
+ return RTCrX509GeneralName_Compare(pConstraint, pName) == 0;
+}
+
+
+RTDECL(bool) RTCrX509GeneralName_ConstraintMatch(PCRTCRX509GENERALNAME pConstraint, PCRTCRX509GENERALNAME pName)
+{
+ if (pConstraint->enmChoice == pName->enmChoice)
+ {
+ if (RTCRX509GENERALNAME_IS_DIRECTORY_NAME(pConstraint))
+ return RTCrX509Name_ConstraintMatch(&pConstraint->u.pT4->DirectoryName, &pName->u.pT4->DirectoryName);
+
+ if (RTCRX509GENERALNAME_IS_DNS_NAME(pConstraint))
+ return rtCrX509GeneralName_ConstraintMatchDnsName(pConstraint, pName);
+
+ if (RTCRX509GENERALNAME_IS_RFC822_NAME(pConstraint))
+ return rtCrX509GeneralName_ConstraintMatchRfc822Name(pConstraint, pName);
+
+ if (RTCRX509GENERALNAME_IS_URI(pConstraint))
+ return rtCrX509GeneralName_ConstraintMatchUri(pConstraint, pName);
+
+ if (RTCRX509GENERALNAME_IS_IP_ADDRESS(pConstraint))
+ return rtCrX509GeneralName_ConstraintMatchIpAddress(pConstraint, pName);
+
+ AssertFailed();
+ return RTCrX509GeneralName_Compare(pConstraint, pName) == 0;
+ }
+ return false;
+}
+
+
+/*
+ * Sequence of X.509 GeneralNames.
+ */
+
+
+/*
+ * X.509 UniqueIdentifier.
+ */
+
+
+/*
+ * X.509 SubjectPublicKeyInfo.
+ */
+
+
+/*
+ * X.509 AuthorityKeyIdentifier (IPRT representation).
+ */
+
+
+/*
+ * One X.509 PolicyQualifierInfo.
+ */
+
+
+/*
+ * Sequence of X.509 PolicyQualifierInfo.
+ */
+
+
+/*
+ * One X.509 PolicyInformation.
+ */
+
+
+/*
+ * Sequence of X.509 CertificatePolicies.
+ */
+
+
+/*
+ * One X.509 PolicyMapping (IPRT representation).
+ */
+
+
+/*
+ * Sequence of X.509 PolicyMappings (IPRT representation).
+ */
+
+
+/*
+ * X.509 BasicConstraints (IPRT representation).
+ */
+
+
+/*
+ * X.509 GeneralSubtree (IPRT representation).
+ */
+
+
+RTDECL(bool) RTCrX509GeneralSubtree_ConstraintMatch(PCRTCRX509GENERALSUBTREE pConstraint, PCRTCRX509GENERALSUBTREE pName)
+{
+ return RTCrX509GeneralName_ConstraintMatch(&pConstraint->Base, &pName->Base);
+}
+
+
+/*
+ * Sequence of X.509 GeneralSubtrees (IPRT representation).
+ */
+
+
+/*
+ * X.509 NameConstraints (IPRT representation).
+ */
+
+
+/*
+ * X.509 PolicyConstraints (IPRT representation).
+ */
+
+
+/*
+ * One X.509 Extension.
+ */
+
+
+/*
+ * Sequence of X.509 Extensions.
+ */
+
+
+/*
+ * X.509 TbsCertificate.
+ */
+
+static void rtCrx509TbsCertificate_AddKeyUsageFlags(PRTCRX509TBSCERTIFICATE pThis, PCRTCRX509EXTENSION pExtension)
+{
+ AssertReturnVoid(pExtension->enmValue == RTCRX509EXTENSIONVALUE_BIT_STRING);
+ AssertReturnVoid(pExtension->ExtnValue.pEncapsulated->cb <= 2);
+ pThis->T3.fKeyUsage |= (uint32_t)RTAsn1BitString_GetAsUInt64((PCRTASN1BITSTRING)pExtension->ExtnValue.pEncapsulated);
+}
+
+
+static void rtCrx509TbsCertificate_AddExtKeyUsageFlags(PRTCRX509TBSCERTIFICATE pThis, PCRTCRX509EXTENSION pExtension)
+{
+ AssertReturnVoid(pExtension->enmValue == RTCRX509EXTENSIONVALUE_SEQ_OF_OBJ_IDS);
+ PCRTASN1SEQOFOBJIDS pObjIds = (PCRTASN1SEQOFOBJIDS)pExtension->ExtnValue.pEncapsulated;
+ uint32_t i = pObjIds->cItems;
+ while (i-- > 0)
+ {
+
+ if (RTAsn1ObjId_CompareWithString(&pObjIds->paItems[i], RTCRX509_ANY_EXTENDED_KEY_USAGE_OID) == 0)
+ pThis->T3.fExtKeyUsage |= RTCRX509CERT_EKU_F_ANY;
+ else if (RTAsn1ObjId_StartsWith(&pObjIds->paItems[i], RTCRX509_ID_KP_OID))
+ {
+ if (RTAsn1ObjIdCountComponents(&pObjIds->paItems[i]) == 9)
+ switch (RTAsn1ObjIdGetLastComponentsAsUInt32(&pObjIds->paItems[i]))
+ {
+ case 1: pThis->T3.fExtKeyUsage |= RTCRX509CERT_EKU_F_SERVER_AUTH; break;
+ case 2: pThis->T3.fExtKeyUsage |= RTCRX509CERT_EKU_F_CLIENT_AUTH; break;
+ case 3: pThis->T3.fExtKeyUsage |= RTCRX509CERT_EKU_F_CODE_SIGNING; break;
+ case 4: pThis->T3.fExtKeyUsage |= RTCRX509CERT_EKU_F_EMAIL_PROTECTION; break;
+ case 5: pThis->T3.fExtKeyUsage |= RTCRX509CERT_EKU_F_IPSEC_END_SYSTEM; break;
+ case 6: pThis->T3.fExtKeyUsage |= RTCRX509CERT_EKU_F_IPSEC_TUNNEL; break;
+ case 7: pThis->T3.fExtKeyUsage |= RTCRX509CERT_EKU_F_IPSEC_USER; break;
+ case 8: pThis->T3.fExtKeyUsage |= RTCRX509CERT_EKU_F_TIME_STAMPING; break;
+ case 9: pThis->T3.fExtKeyUsage |= RTCRX509CERT_EKU_F_OCSP_SIGNING; break;
+ case 10: pThis->T3.fExtKeyUsage |= RTCRX509CERT_EKU_F_DVCS; break;
+ case 11: pThis->T3.fExtKeyUsage |= RTCRX509CERT_EKU_F_SBGP_CERT_AA_SERVICE_AUTH; break;
+ case 13: pThis->T3.fExtKeyUsage |= RTCRX509CERT_EKU_F_EAP_OVER_PPP; break;
+ case 14: pThis->T3.fExtKeyUsage |= RTCRX509CERT_EKU_F_EAP_OVER_LAN; break;
+ default: pThis->T3.fExtKeyUsage |= RTCRX509CERT_EKU_F_OTHER; break;
+ }
+ else
+ pThis->T3.fExtKeyUsage |= RTCRX509CERT_EKU_F_OTHER;
+ }
+ else if (RTAsn1ObjId_StartsWith(&pObjIds->paItems[i], RTCRX509_APPLE_EKU_APPLE_EXTENDED_KEY_USAGE_OID))
+ {
+ if (RTAsn1ObjId_CompareWithString(&pObjIds->paItems[i], RTCRX509_APPLE_EKU_CODE_SIGNING_OID) == 0)
+ pThis->T3.fExtKeyUsage |= RTCRX509CERT_EKU_F_APPLE_CODE_SIGNING;
+ else if (RTAsn1ObjId_CompareWithString(&pObjIds->paItems[i], RTCRX509_APPLE_EKU_CODE_SIGNING_DEVELOPMENT_OID) == 0)
+ pThis->T3.fExtKeyUsage |= RTCRX509CERT_EKU_F_APPLE_CODE_SIGNING_DEVELOPMENT;
+ else if (RTAsn1ObjId_CompareWithString(&pObjIds->paItems[i], RTCRX509_APPLE_EKU_SOFTWARE_UPDATE_SIGNING_OID) == 0)
+ pThis->T3.fExtKeyUsage |= RTCRX509CERT_EKU_F_APPLE_SOFTWARE_UPDATE_SIGNING;
+ else if (RTAsn1ObjId_CompareWithString(&pObjIds->paItems[i], RTCRX509_APPLE_EKU_CODE_SIGNING_THRID_PARTY_OID) == 0)
+ pThis->T3.fExtKeyUsage |= RTCRX509CERT_EKU_F_APPLE_CODE_SIGNING_THIRD_PARTY;
+ else if (RTAsn1ObjId_CompareWithString(&pObjIds->paItems[i], RTCRX509_APPLE_EKU_RESOURCE_SIGNING_OID) == 0)
+ pThis->T3.fExtKeyUsage |= RTCRX509CERT_EKU_F_APPLE_RESOURCE_SIGNING;
+ else if (RTAsn1ObjId_CompareWithString(&pObjIds->paItems[i], RTCRX509_APPLE_EKU_SYSTEM_IDENTITY_OID) == 0)
+ pThis->T3.fExtKeyUsage |= RTCRX509CERT_EKU_F_APPLE_SYSTEM_IDENTITY;
+ else
+ pThis->T3.fExtKeyUsage |= RTCRX509CERT_EKU_F_OTHER;
+ }
+ else if (RTAsn1ObjId_StartsWith(&pObjIds->paItems[i], "1.3.6.1.4.1.311"))
+ {
+ if (RTAsn1ObjId_CompareWithString(&pObjIds->paItems[i], RTCRX509_MS_EKU_TIMESTAMP_SIGNING_OID) == 0)
+ pThis->T3.fExtKeyUsage |= RTCRX509CERT_EKU_F_MS_TIMESTAMP_SIGNING;
+ else if (RTAsn1ObjId_CompareWithString(&pObjIds->paItems[i], RTCRX509_MS_EKU_NT5_CRYPTO_OID) == 0)
+ pThis->T3.fExtKeyUsage |= RTCRX509CERT_EKU_F_MS_NT5_CRYPTO;
+ else if (RTAsn1ObjId_CompareWithString(&pObjIds->paItems[i], RTCRX509_MS_EKU_OEM_WHQL_CRYPTO_OID) == 0)
+ pThis->T3.fExtKeyUsage |= RTCRX509CERT_EKU_F_MS_OEM_WHQL_CRYPTO;
+ else if (RTAsn1ObjId_CompareWithString(&pObjIds->paItems[i], RTCRX509_MS_EKU_EMBEDDED_NT_CRYPTO_OID) == 0)
+ pThis->T3.fExtKeyUsage |= RTCRX509CERT_EKU_F_MS_EMBEDDED_NT_CRYPTO;
+ else if (RTAsn1ObjId_CompareWithString(&pObjIds->paItems[i], RTCRX509_MS_EKU_KERNEL_MODE_CODE_SIGNING_OID) == 0)
+ pThis->T3.fExtKeyUsage |= RTCRX509CERT_EKU_F_MS_KERNEL_MODE_CODE_SIGNING;
+ else if (RTAsn1ObjId_CompareWithString(&pObjIds->paItems[i], RTCRX509_MS_EKU_LIFETIME_SIGNING_OID) == 0)
+ pThis->T3.fExtKeyUsage |= RTCRX509CERT_EKU_F_MS_LIFETIME_SIGNING;
+ else if (RTAsn1ObjId_CompareWithString(&pObjIds->paItems[i], RTCRX509_MS_EKU_DRM_OID) == 0)
+ pThis->T3.fExtKeyUsage |= RTCRX509CERT_EKU_F_MS_DRM;
+ else if (RTAsn1ObjId_CompareWithString(&pObjIds->paItems[i], RTCRX509_MS_EKU_DRM_INDIVIDUALIZATION_OID) == 0)
+ pThis->T3.fExtKeyUsage |= RTCRX509CERT_EKU_F_MS_DRM_INDIVIDUALIZATION;
+ else
+ pThis->T3.fExtKeyUsage |= RTCRX509CERT_EKU_F_OTHER;
+ }
+ else
+ pThis->T3.fExtKeyUsage |= RTCRX509CERT_EKU_F_OTHER;
+ }
+}
+
+
+/**
+ * (Re-)Process the certificate extensions.
+ *
+ * Will fail if duplicate extensions are encountered.
+ *
+ * @returns IPRT status code.
+ * @param pThis The to-be-signed certificate part.
+ * @param pErrInfo Where to return extended error details,
+ * optional.
+ */
+RTDECL(int) RTCrX509TbsCertificate_ReprocessExtensions(PRTCRX509TBSCERTIFICATE pThis, PRTERRINFO pErrInfo)
+{
+ /*
+ * Clear all variables we will set.
+ */
+ pThis->T3.fFlags = 0;
+ pThis->T3.fKeyUsage = 0;
+ pThis->T3.fExtKeyUsage = 0;
+ pThis->T3.pAuthorityKeyIdentifier = NULL;
+ pThis->T3.pSubjectKeyIdentifier = NULL;
+ pThis->T3.pAltSubjectName = NULL;
+ pThis->T3.pAltIssuerName = NULL;
+ pThis->T3.pCertificatePolicies = NULL;
+ pThis->T3.pPolicyMappings = NULL;
+ pThis->T3.pBasicConstraints = NULL;
+ pThis->T3.pNameConstraints = NULL;
+ pThis->T3.pPolicyConstraints = NULL;
+ pThis->T3.pInhibitAnyPolicy = NULL;
+
+#define CHECK_SET_PRESENT_RET_ON_DUP(a_pThis, a_pErrInfo, a_fPresentFlag) \
+ do { \
+ if ((a_pThis)->T3.fFlags & (a_fPresentFlag)) \
+ return RTErrInfoSet(a_pErrInfo, VERR_CR_X509_TBSCERT_DUPLICATE_EXTENSION, \
+ "Duplicate extension " #a_fPresentFlag); \
+ (a_pThis)->T3.fFlags |= (a_fPresentFlag); \
+ } while (0)
+
+ /*
+ * Process all the extensions.
+ */
+ for (uint32_t i = 0; i < pThis->T3.Extensions.cItems; i++)
+ {
+ PCRTASN1OBJID pExtnId = &pThis->T3.Extensions.paItems[i].ExtnId;
+ PCRTASN1OCTETSTRING pExtValue = &pThis->T3.Extensions.paItems[i].ExtnValue;
+ if (RTAsn1ObjId_CompareWithString(pExtnId, RTCRX509_ID_CE_KEY_USAGE_OID) == 0)
+ {
+ CHECK_SET_PRESENT_RET_ON_DUP(pThis, pErrInfo, RTCRX509TBSCERTIFICATE_F_PRESENT_KEY_USAGE);
+ rtCrx509TbsCertificate_AddKeyUsageFlags(pThis, &pThis->T3.Extensions.paItems[i]);
+ Assert(pThis->T3.Extensions.paItems[i].enmValue == RTCRX509EXTENSIONVALUE_BIT_STRING);
+ }
+ else if (RTAsn1ObjId_CompareWithString(pExtnId, RTCRX509_ID_CE_EXT_KEY_USAGE_OID) == 0)
+ {
+ CHECK_SET_PRESENT_RET_ON_DUP(pThis, pErrInfo, RTCRX509TBSCERTIFICATE_F_PRESENT_EXT_KEY_USAGE);
+ rtCrx509TbsCertificate_AddExtKeyUsageFlags(pThis, &pThis->T3.Extensions.paItems[i]);
+ Assert(pThis->T3.Extensions.paItems[i].enmValue == RTCRX509EXTENSIONVALUE_SEQ_OF_OBJ_IDS);
+ }
+ else if (RTAsn1ObjId_CompareWithString(pExtnId, RTCRX509_ID_CE_AUTHORITY_KEY_IDENTIFIER_OID) == 0)
+ {
+ CHECK_SET_PRESENT_RET_ON_DUP(pThis, pErrInfo, RTCRX509TBSCERTIFICATE_F_PRESENT_AUTHORITY_KEY_IDENTIFIER);
+ pThis->T3.pAuthorityKeyIdentifier = (PCRTCRX509AUTHORITYKEYIDENTIFIER)pExtValue->pEncapsulated;
+ Assert(pThis->T3.Extensions.paItems[i].enmValue == RTCRX509EXTENSIONVALUE_AUTHORITY_KEY_IDENTIFIER);
+ }
+ else if (RTAsn1ObjId_CompareWithString(pExtnId, RTCRX509_ID_CE_OLD_AUTHORITY_KEY_IDENTIFIER_OID) == 0)
+ {
+ CHECK_SET_PRESENT_RET_ON_DUP(pThis, pErrInfo, RTCRX509TBSCERTIFICATE_F_PRESENT_OLD_AUTHORITY_KEY_IDENTIFIER);
+ pThis->T3.pOldAuthorityKeyIdentifier = (PCRTCRX509OLDAUTHORITYKEYIDENTIFIER)pExtValue->pEncapsulated;
+ Assert(pThis->T3.Extensions.paItems[i].enmValue == RTCRX509EXTENSIONVALUE_OLD_AUTHORITY_KEY_IDENTIFIER);
+ }
+ else if (RTAsn1ObjId_CompareWithString(pExtnId, RTCRX509_ID_CE_SUBJECT_KEY_IDENTIFIER_OID) == 0)
+ {
+ CHECK_SET_PRESENT_RET_ON_DUP(pThis, pErrInfo, RTCRX509TBSCERTIFICATE_F_PRESENT_SUBJECT_KEY_IDENTIFIER);
+ pThis->T3.pSubjectKeyIdentifier = (PCRTASN1OCTETSTRING)pExtValue->pEncapsulated;
+ Assert(pThis->T3.Extensions.paItems[i].enmValue == RTCRX509EXTENSIONVALUE_OCTET_STRING);
+ }
+ else if (RTAsn1ObjId_CompareWithString(pExtnId, RTCRX509_ID_CE_SUBJECT_ALT_NAME_OID) == 0)
+ {
+ CHECK_SET_PRESENT_RET_ON_DUP(pThis, pErrInfo, RTCRX509TBSCERTIFICATE_F_PRESENT_SUBJECT_ALT_NAME);
+ pThis->T3.pAltSubjectName = (PCRTCRX509GENERALNAMES)pExtValue->pEncapsulated;
+ Assert(pThis->T3.Extensions.paItems[i].enmValue == RTCRX509EXTENSIONVALUE_GENERAL_NAMES);
+ }
+ else if (RTAsn1ObjId_CompareWithString(pExtnId, RTCRX509_ID_CE_ISSUER_ALT_NAME_OID) == 0)
+ {
+ CHECK_SET_PRESENT_RET_ON_DUP(pThis, pErrInfo, RTCRX509TBSCERTIFICATE_F_PRESENT_ISSUER_ALT_NAME);
+ pThis->T3.pAltIssuerName = (PCRTCRX509GENERALNAMES)pExtValue->pEncapsulated;
+ Assert(pThis->T3.Extensions.paItems[i].enmValue == RTCRX509EXTENSIONVALUE_GENERAL_NAMES);
+ }
+ else if (RTAsn1ObjId_CompareWithString(pExtnId, RTCRX509_ID_CE_CERTIFICATE_POLICIES_OID) == 0)
+ {
+ CHECK_SET_PRESENT_RET_ON_DUP(pThis, pErrInfo, RTCRX509TBSCERTIFICATE_F_PRESENT_CERTIFICATE_POLICIES);
+ pThis->T3.pCertificatePolicies = (PCRTCRX509CERTIFICATEPOLICIES)pExtValue->pEncapsulated;
+ Assert(pThis->T3.Extensions.paItems[i].enmValue == RTCRX509EXTENSIONVALUE_CERTIFICATE_POLICIES);
+ }
+ else if (RTAsn1ObjId_CompareWithString(pExtnId, RTCRX509_ID_CE_POLICY_MAPPINGS_OID) == 0)
+ {
+ CHECK_SET_PRESENT_RET_ON_DUP(pThis, pErrInfo, RTCRX509TBSCERTIFICATE_F_PRESENT_POLICY_MAPPINGS);
+ pThis->T3.pPolicyMappings = (PCRTCRX509POLICYMAPPINGS)pExtValue->pEncapsulated;
+ Assert(pThis->T3.Extensions.paItems[i].enmValue == RTCRX509EXTENSIONVALUE_POLICY_MAPPINGS);
+ }
+ else if (RTAsn1ObjId_CompareWithString(pExtnId, RTCRX509_ID_CE_BASIC_CONSTRAINTS_OID) == 0)
+ {
+ CHECK_SET_PRESENT_RET_ON_DUP(pThis, pErrInfo, RTCRX509TBSCERTIFICATE_F_PRESENT_BASIC_CONSTRAINTS);
+ pThis->T3.pBasicConstraints = (PCRTCRX509BASICCONSTRAINTS)pExtValue->pEncapsulated;
+ Assert(pThis->T3.Extensions.paItems[i].enmValue == RTCRX509EXTENSIONVALUE_BASIC_CONSTRAINTS);
+ }
+ else if (RTAsn1ObjId_CompareWithString(pExtnId, RTCRX509_ID_CE_NAME_CONSTRAINTS_OID) == 0)
+ {
+ CHECK_SET_PRESENT_RET_ON_DUP(pThis, pErrInfo, RTCRX509TBSCERTIFICATE_F_PRESENT_NAME_CONSTRAINTS);
+ pThis->T3.pNameConstraints = (PCRTCRX509NAMECONSTRAINTS)pExtValue->pEncapsulated;
+ Assert(pThis->T3.Extensions.paItems[i].enmValue == RTCRX509EXTENSIONVALUE_NAME_CONSTRAINTS);
+ }
+ else if (RTAsn1ObjId_CompareWithString(pExtnId, RTCRX509_ID_CE_POLICY_CONSTRAINTS_OID) == 0)
+ {
+ CHECK_SET_PRESENT_RET_ON_DUP(pThis, pErrInfo, RTCRX509TBSCERTIFICATE_F_PRESENT_POLICY_CONSTRAINTS);
+ pThis->T3.pPolicyConstraints = (PCRTCRX509POLICYCONSTRAINTS)pExtValue->pEncapsulated;
+ Assert(pThis->T3.Extensions.paItems[i].enmValue == RTCRX509EXTENSIONVALUE_POLICY_CONSTRAINTS);
+ }
+ else if (RTAsn1ObjId_CompareWithString(pExtnId, RTCRX509_ID_CE_INHIBIT_ANY_POLICY_OID) == 0)
+ {
+ CHECK_SET_PRESENT_RET_ON_DUP(pThis, pErrInfo, RTCRX509TBSCERTIFICATE_F_PRESENT_INHIBIT_ANY_POLICY);
+ pThis->T3.pInhibitAnyPolicy = (PCRTASN1INTEGER)pExtValue->pEncapsulated;
+ Assert(pThis->T3.Extensions.paItems[i].enmValue == RTCRX509EXTENSIONVALUE_INTEGER);
+ }
+ else if (RTAsn1ObjId_CompareWithString(pExtnId, RTCRX509_ID_CE_ACCEPTABLE_CERT_POLICIES_OID) == 0)
+ pThis->T3.fFlags |= RTCRX509TBSCERTIFICATE_F_PRESENT_ACCEPTABLE_CERT_POLICIES;
+ else
+ pThis->T3.fFlags |= RTCRX509TBSCERTIFICATE_F_PRESENT_OTHER;
+ }
+
+ if (!pThis->T3.fFlags)
+ pThis->T3.fFlags |= RTCRX509TBSCERTIFICATE_F_PRESENT_NONE;
+
+#undef CHECK_SET_PRESENT_RET_ON_DUP
+ return VINF_SUCCESS;
+}
+
+
+
+/*
+ * One X.509 Certificate.
+ */
+
+RTDECL(bool) RTCrX509Certificate_MatchIssuerAndSerialNumber(PCRTCRX509CERTIFICATE pCertificate,
+ PCRTCRX509NAME pIssuer, PCRTASN1INTEGER pSerialNumber)
+{
+ if ( RTAsn1Integer_UnsignedCompare(&pCertificate->TbsCertificate.SerialNumber, pSerialNumber) == 0
+ && RTCrX509Name_Compare(&pCertificate->TbsCertificate.Issuer, pIssuer) == 0)
+ return true;
+ return false;
+}
+
+
+RTDECL(bool) RTCrX509Certificate_MatchSubjectOrAltSubjectByRfc5280(PCRTCRX509CERTIFICATE pThis, PCRTCRX509NAME pName)
+{
+ if (RTCrX509Name_MatchByRfc5280(&pThis->TbsCertificate.Subject, pName))
+ return true;
+
+ if (RTCrX509Extensions_IsPresent(&pThis->TbsCertificate.T3.Extensions))
+ for (uint32_t i = 0; i < pThis->TbsCertificate.T3.Extensions.cItems; i++)
+ {
+ PCRTCRX509EXTENSION pExt = &pThis->TbsCertificate.T3.Extensions.paItems[i];
+ if ( pExt->enmValue == RTCRX509EXTENSIONVALUE_GENERAL_NAMES
+ && RTAsn1ObjId_CompareWithString(&pExt->ExtnId, RTCRX509_ID_CE_SUBJECT_ALT_NAME_OID))
+ {
+ PCRTCRX509GENERALNAMES pGeneralNames = (PCRTCRX509GENERALNAMES)pExt->ExtnValue.pEncapsulated;
+ for (uint32_t j = 0; j < pGeneralNames->cItems; j++)
+ if ( RTCRX509GENERALNAME_IS_DIRECTORY_NAME(&pGeneralNames->paItems[j])
+ && RTCrX509Name_MatchByRfc5280(&pGeneralNames->paItems[j].u.pT4->DirectoryName, pName))
+ return true;
+ }
+ }
+ return false;
+}
+
+
+RTDECL(bool) RTCrX509Certificate_IsSelfSigned(PCRTCRX509CERTIFICATE pCertificate)
+{
+ if (RTCrX509Certificate_IsPresent(pCertificate))
+ {
+ return RTCrX509Name_MatchByRfc5280(&pCertificate->TbsCertificate.Subject,
+ &pCertificate->TbsCertificate.Issuer);
+ }
+ return false;
+}
+
+
+/*
+ * Set of X.509 Certificates.
+ */
+
+RTDECL(PCRTCRX509CERTIFICATE)
+RTCrX509Certificates_FindByIssuerAndSerialNumber(PCRTCRX509CERTIFICATES pCertificates,
+ PCRTCRX509NAME pIssuer, PCRTASN1INTEGER pSerialNumber)
+{
+ for (uint32_t i = 0; i < pCertificates->cItems; i++)
+ if (RTCrX509Certificate_MatchIssuerAndSerialNumber(&pCertificates->paItems[i], pIssuer, pSerialNumber))
+ return &pCertificates->paItems[i];
+ return NULL;
+}
+
+
diff --git a/src/VBox/Runtime/common/crypto/x509-file.cpp b/src/VBox/Runtime/common/crypto/x509-file.cpp
new file mode 100644
index 00000000000..7228400903b
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/x509-file.cpp
@@ -0,0 +1,105 @@
+/* $Id$ */
+/** @file
+ * IPRT - Crypto - X.509, File related APIs.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/crypto/x509.h>
+
+#include <iprt/assert.h>
+#include <iprt/err.h>
+#include <iprt/path.h>
+#include <iprt/crypto/pem.h>
+
+
+/*******************************************************************************
+* Global Variables *
+*******************************************************************************/
+static RTCRPEMMARKERWORD const g_aWords_Certificate[] = { { RT_STR_TUPLE("CERTIFICATE") } };
+/** X509 Certificate markers. */
+static RTCRPEMMARKER const g_aCertificateMarkers[] = { { g_aWords_Certificate, RT_ELEMENTS(g_aWords_Certificate) } };
+
+
+RTDECL(int) RTCrX509Certificate_ReadFromFile(PRTCRX509CERTIFICATE pCertificate, const char *pszFilename, uint32_t fFlags,
+ PCRTASN1ALLOCATORVTABLE pAllocator, PRTERRINFO pErrInfo)
+{
+ AssertReturn(!fFlags, VERR_INVALID_FLAGS);
+ PCRTCRPEMSECTION pSectionHead;
+ int rc = RTCrPemReadFile(pszFilename, 0, g_aCertificateMarkers, RT_ELEMENTS(g_aCertificateMarkers), &pSectionHead, pErrInfo);
+ if (RT_SUCCESS(rc))
+ {
+ RTCRX509CERTIFICATE TmpCert;
+ RTASN1CURSORPRIMARY PrimaryCursor;
+ RTAsn1CursorInitPrimary(&PrimaryCursor, pSectionHead->pbData, (uint32_t)RT_MIN(pSectionHead->cbData, UINT32_MAX),
+ pErrInfo, pAllocator, RTASN1CURSOR_FLAGS_DER, RTPathFilename(pszFilename));
+ rc = RTCrX509Certificate_DecodeAsn1(&PrimaryCursor.Cursor, 0, &TmpCert, "Cert");
+ if (RT_SUCCESS(rc))
+ {
+ rc = RTCrX509Certificate_CheckSanity(&TmpCert, 0, pErrInfo, "Cert");
+ if (RT_SUCCESS(rc))
+ {
+ rc = RTCrX509Certificate_Clone(pCertificate, &TmpCert, &g_RTAsn1DefaultAllocator);
+ if (RT_SUCCESS(rc))
+ {
+ if (pSectionHead->pNext || PrimaryCursor.Cursor.cbLeft)
+ rc = VINF_ASN1_MORE_DATA;
+ }
+ }
+ RTCrX509Certificate_Delete(&TmpCert);
+ }
+ RTCrPemFreeSections(pSectionHead);
+ }
+ return rc;
+}
+
+
+
+#if 0
+RTDECL(int) RTCrX509Certificates_ReadFromFile(const char *pszFilename, uint32_t fFlags,
+ PRTCRX509CERTIFICATES pCertificates, PRTERRINFO pErrInfo)
+{
+ AssertReturn(!fFlags, VERR_INVALID_FLAGS);
+ PCRTCRPEMSECTION pSectionHead;
+ int rc = RTCrPemReadFile(pszFilename, 0, g_aCertificateMarkers, RT_ELEMENTS(g_aCertificateMarkers), &pSectionHead, pErrInfo);
+ if (RT_SUCCESS(rc))
+ {
+ pCertificates->Allocation
+
+ PCRTCRPEMSECTION pCurSec = pSectionHead;
+ while (pCurSec)
+ {
+
+ pCurSec = pCurSec->pNext;
+ }
+
+ RTCrPemFreeSections(pSectionHead);
+ }
+ return rc;
+}
+#endif
+
diff --git a/src/VBox/Runtime/common/crypto/x509-init.cpp b/src/VBox/Runtime/common/crypto/x509-init.cpp
new file mode 100644
index 00000000000..0b60a05dc8b
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/x509-init.cpp
@@ -0,0 +1,76 @@
+/* $Id$ */
+/** @file
+ * IPRT - Crypto - X.509, Initialization API.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/crypto/x509.h>
+
+#include <iprt/err.h>
+#include <iprt/string.h>
+#include <iprt/uni.h>
+
+#include "x509-internal.h"
+
+
+static int rtCrX509Extension_ExtnValue_Clone(PRTCRX509EXTENSION pThis, PCRTCRX509EXTENSION pSrc)
+{
+ pThis->enmValue = pSrc->enmValue;
+ return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTCrX509Name_RecodeAsUtf8(PRTCRX509NAME pThis, PCRTASN1ALLOCATORVTABLE pAllocator)
+{
+ uint32_t cRdns = pThis->cItems;
+ PRTCRX509RELATIVEDISTINGUISHEDNAME pRdn = &pThis->paItems[0];
+ while (cRdns-- > 0)
+ {
+ uint32_t cAttribs = pRdn->cItems;
+ PRTCRX509ATTRIBUTETYPEANDVALUE pAttrib = &pRdn->paItems[0];
+ while (cAttribs-- > 0)
+ {
+ if (pAttrib->Value.enmType == RTASN1TYPE_STRING)
+ {
+ int rc = RTAsn1String_RecodeAsUtf8(&pAttrib->Value.u.String, pAllocator);
+ if (RT_FAILURE(rc))
+ return rc;
+ }
+ pAttrib++;
+ }
+ pRdn++;
+ }
+ return VINF_SUCCESS;
+}
+
+
+/*
+ * Generate the code.
+ */
+#include <iprt/asn1-generator-init.h>
+
diff --git a/src/VBox/Runtime/common/crypto/x509-internal.h b/src/VBox/Runtime/common/crypto/x509-internal.h
new file mode 100644
index 00000000000..689ae37271a
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/x509-internal.h
@@ -0,0 +1,35 @@
+/* $Id$ */
+/** @file
+ * IPRT - Crypto - X.509, Internal Header.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+#ifndef ___common_crypto_x509_internal_h
+#define ___common_crypto_x509_internal_h
+
+#define RTASN1TMPL_TEMPLATE_FILE "../common/crypto/x509-template.h"
+#include <iprt/asn1-generator-internal-header.h>
+
+#endif
+
diff --git a/src/VBox/Runtime/common/crypto/x509-sanity.cpp b/src/VBox/Runtime/common/crypto/x509-sanity.cpp
new file mode 100644
index 00000000000..3a6a0edf52b
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/x509-sanity.cpp
@@ -0,0 +1,149 @@
+/* $Id$ */
+/** @file
+ * IPRT - Crypto - X.509, Sanity Checkers.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/crypto/x509.h>
+
+#include <iprt/err.h>
+#include <iprt/string.h>
+
+#include "x509-internal.h"
+
+
+
+static int rtCrX509Validity_CheckSanityExtra(PCRTCRX509VALIDITY pThis, uint32_t fFlags, PRTERRINFO pErrInfo, const char *pszErrorTag)
+{
+ if (RTAsn1Time_Compare(&pThis->NotBefore, &pThis->NotAfter) > 0)
+ return RTErrInfoSetF(pErrInfo, VERR_CR_X509_VALIDITY_SWAPPED, "%s: NotBefore is after NotAfter", pszErrorTag);
+ /** @todo check tag constraints? */
+ return VINF_SUCCESS;
+}
+
+
+static int rtCrX509Name_CheckSanityExtra(PCRTCRX509NAME pThis, uint32_t fFlags, PRTERRINFO pErrInfo, const char *pszErrorTag)
+{
+ if (pThis->cItems == 0)
+ return RTErrInfoSetF(pErrInfo, VERR_CR_X509_NAME_EMPTY_SET, "%s: Has no components.", pszErrorTag);
+
+ for (uint32_t i = 0; i < pThis->cItems; i++)
+ {
+ if (pThis->cItems == 0)
+ return RTErrInfoSetF(pErrInfo, VERR_CR_X509_NAME_EMPTY_SUB_SET,
+ "%s: Items[%u] has no sub components.", pszErrorTag, i);
+
+ for (uint32_t j = 0; j < pThis->paItems[i].cItems; j++)
+ {
+ if (pThis->paItems[i].paItems[j].Value.enmType != RTASN1TYPE_STRING)
+ return RTErrInfoSetF(pErrInfo, VERR_CR_X509_NAME_NOT_STRING,
+ "%s: Items[%u].paItems[%u].enmType is %d instead of string (%d).",
+ pszErrorTag, i, j, pThis->paItems[i].paItems[j].Value.enmType, RTASN1TYPE_STRING);
+ if (pThis->paItems[i].paItems[j].Value.u.String.Asn1Core.cb == 0)
+ return RTErrInfoSetF(pErrInfo, VERR_CR_X509_NAME_EMPTY_STRING,
+ "%s: Items[%u].paItems[%u] is an empty string", pszErrorTag, i, j);
+ switch (pThis->paItems[i].paItems[j].Value.u.String.Asn1Core.uTag)
+ {
+ case ASN1_TAG_PRINTABLE_STRING:
+ case ASN1_TAG_UTF8_STRING:
+ break;
+ case ASN1_TAG_T61_STRING:
+ case ASN1_TAG_UNIVERSAL_STRING:
+ case ASN1_TAG_BMP_STRING:
+ break;
+ case ASN1_TAG_IA5_STRING: /* Used by "Microsoft Root Certificate Authority" in the "com" part of the Issuer. */
+ break;
+ default:
+ return RTErrInfoSetF(pErrInfo, VERR_CR_X509_INVALID_NAME_STRING_TAG,
+ "%s: Items[%u].paItems[%u] invalid string type: %u", pszErrorTag, i, j,
+ pThis->paItems[i].paItems[j].Value.u.String.Asn1Core.uTag);
+ }
+ }
+ }
+
+ return VINF_SUCCESS;
+}
+
+
+static int rtCrX509SubjectPublicKeyInfo_CheckSanityExtra(PCRTCRX509SUBJECTPUBLICKEYINFO pThis, uint32_t fFlags,
+ PRTERRINFO pErrInfo, const char *pszErrorTag)
+{
+ if (pThis->SubjectPublicKey.cBits <= 32)
+ return RTErrInfoSetF(pErrInfo, VERR_CR_X509_PUBLIC_KEY_TOO_SMALL,
+ "%s: SubjectPublicKey is too small, only %u bits", pszErrorTag, pThis->SubjectPublicKey.cBits);
+ return VINF_SUCCESS;
+}
+
+
+static int rtCrX509TbsCertificate_CheckSanityExtra(PCRTCRX509TBSCERTIFICATE pThis, uint32_t fFlags,
+ PRTERRINFO pErrInfo, const char *pszErrorTag)
+{
+ if ( RTAsn1Integer_IsPresent(&pThis->T0.Version)
+ && RTAsn1Integer_UnsignedCompareWithU32(&pThis->T0.Version, RTCRX509TBSCERTIFICATE_V1) != 0
+ && RTAsn1Integer_UnsignedCompareWithU32(&pThis->T0.Version, RTCRX509TBSCERTIFICATE_V2) != 0
+ && RTAsn1Integer_UnsignedCompareWithU32(&pThis->T0.Version, RTCRX509TBSCERTIFICATE_V3) != 0)
+ return RTErrInfoSetF(pErrInfo, VERR_CR_X509_TBSCERT_UNSUPPORTED_VERSION,
+ "%s: Unknown Version number: %llu",
+ pszErrorTag, pThis->T0.Version.uValue.u);
+
+ if ( pThis->SerialNumber.Asn1Core.cb < 1
+ || pThis->SerialNumber.Asn1Core.cb > 1024)
+ return RTErrInfoSetF(pErrInfo, VERR_CR_X509_TBSCERT_SERIAL_NUMBER_OUT_OF_BOUNDS,
+ "%s: Bad SerialNumber length: %u", pszErrorTag, pThis->SerialNumber.Asn1Core.cb);
+
+ if ( ( RTAsn1BitString_IsPresent(&pThis->T1.IssuerUniqueId)
+ || RTAsn1BitString_IsPresent(&pThis->T2.SubjectUniqueId))
+ && RTAsn1Integer_UnsignedCompareWithU32(&pThis->T0.Version, RTCRX509TBSCERTIFICATE_V2) < 0)
+ return RTErrInfoSetF(pErrInfo, VERR_CR_X509_TBSCERT_UNIQUE_IDS_REQ_V2,
+ "%s: IssuerUniqueId and SubjectUniqueId requires version 2", pszErrorTag);
+
+ if ( RTCrX509Extensions_IsPresent(&pThis->T3.Extensions)
+ && RTAsn1Integer_UnsignedCompareWithU32(&pThis->T0.Version, RTCRX509TBSCERTIFICATE_V3) < 0)
+ return RTErrInfoSetF(pErrInfo, VERR_CR_X509_TBSCERT_EXTS_REQ_V3, "%s: Extensions requires version 3", pszErrorTag);
+
+ return VINF_SUCCESS;
+}
+
+
+static int rtCrX509Certificate_CheckSanityExtra(PCRTCRX509CERTIFICATE pThis, uint32_t fFlags,
+ PRTERRINFO pErrInfo, const char *pszErrorTag)
+{
+ if (RTCrX509AlgorithmIdentifier_Compare(&pThis->SignatureAlgorithm, &pThis->TbsCertificate.Signature) != 0)
+ return RTErrInfoSetF(pErrInfo, VERR_CR_X509_CERT_TBS_SIGN_ALGO_MISMATCH,
+ "%s: SignatureAlgorithm (%s) does not match TbsCertificate.Signature (%s).", pszErrorTag,
+ pThis->SignatureAlgorithm.Algorithm.szObjId,
+ pThis->TbsCertificate.Signature.Algorithm.szObjId);
+ return VINF_SUCCESS;
+}
+
+
+/*
+ * Generate the code.
+ */
+#include <iprt/asn1-generator-sanity.h>
+
diff --git a/src/VBox/Runtime/common/crypto/x509-template.h b/src/VBox/Runtime/common/crypto/x509-template.h
new file mode 100644
index 00000000000..b7c47c16a59
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/x509-template.h
@@ -0,0 +1,441 @@
+/* $Id$ */
+/** @file
+ * IPRT - Crypto - X.509, Code Generator Template.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+#define RTASN1TMPL_DECL RTDECL
+
+/*
+ * X.509 Validity.
+ */
+#define RTASN1TMPL_TYPE RTCRX509VALIDITY
+#define RTASN1TMPL_EXT_NAME RTCrX509Validity
+#define RTASN1TMPL_INT_NAME rtCrX509Validity
+RTASN1TMPL_BEGIN_SEQCORE();
+RTASN1TMPL_MEMBER( NotBefore, RTASN1TIME, RTAsn1Time);
+RTASN1TMPL_MEMBER( NotAfter, RTASN1TIME, RTAsn1Time);
+RTASN1TMPL_EXEC_CHECK_SANITY( rc = rtCrX509Validity_CheckSanityExtra(pThis, fFlags, pErrInfo, pszErrorTag) )
+RTASN1TMPL_END_SEQCORE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * One X.509 Algorithm Identifier.
+ */
+#define RTASN1TMPL_TYPE RTCRX509ALGORITHMIDENTIFIER
+#define RTASN1TMPL_EXT_NAME RTCrX509AlgorithmIdentifier
+#define RTASN1TMPL_INT_NAME rtCrX509AlgorithmIdentifier
+RTASN1TMPL_BEGIN_SEQCORE();
+RTASN1TMPL_MEMBER( Algorithm, RTASN1OBJID, RTAsn1ObjId);
+RTASN1TMPL_MEMBER( Parameters, RTASN1DYNTYPE, RTAsn1DynType);
+RTASN1TMPL_END_SEQCORE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * Set of X.509 Algorithm Identifiers.
+ */
+#define RTASN1TMPL_TYPE RTCRX509ALGORITHMIDENTIFIERS
+#define RTASN1TMPL_EXT_NAME RTCrX509AlgorithmIdentifiers
+#define RTASN1TMPL_INT_NAME rtCrX509AlgorithmIdentifiers
+RTASN1TMPL_SET_OF(RTCRX509ALGORITHMIDENTIFIER, RTCrX509AlgorithmIdentifier);
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * One X.509 AttributeTypeAndValue.
+ */
+#define RTASN1TMPL_TYPE RTCRX509ATTRIBUTETYPEANDVALUE
+#define RTASN1TMPL_EXT_NAME RTCrX509AttributeTypeAndValue
+#define RTASN1TMPL_INT_NAME rtCrX509AttributeTypeAndValue
+RTASN1TMPL_BEGIN_SEQCORE();
+RTASN1TMPL_MEMBER( Type, RTASN1OBJID, RTAsn1ObjId);
+RTASN1TMPL_MEMBER( Value, RTASN1DYNTYPE, RTAsn1DynType);
+RTASN1TMPL_END_SEQCORE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * Set of X.509 AttributeTypeAndValues / X.509 RelativeDistinguishedName.
+ */
+#define RTASN1TMPL_TYPE RTCRX509ATTRIBUTETYPEANDVALUES
+#define RTASN1TMPL_EXT_NAME RTCrX509AttributeTypeAndValues
+#define RTASN1TMPL_INT_NAME rtCrX509AttributeTypeAndValues
+RTASN1TMPL_SET_OF(RTCRX509ATTRIBUTETYPEANDVALUE, RTCrX509AttributeTypeAndValue);
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+/*
+ * X.509 Name.
+ */
+#define RTASN1TMPL_TYPE RTCRX509NAME
+#define RTASN1TMPL_EXT_NAME RTCrX509Name
+#define RTASN1TMPL_INT_NAME rtCrX509Name
+#undef RTASN1TMPL_SET_SEQ_EXEC_CHECK_SANITY
+#define RTASN1TMPL_SET_SEQ_EXEC_CHECK_SANITY() rc = rtCrX509Name_CheckSanityExtra(pThis, fFlags, pErrInfo, pszErrorTag)
+RTASN1TMPL_SEQ_OF(RTCRX509RELATIVEDISTINGUISHEDNAME, RTCrX509RelativeDistinguishedName);
+#undef RTASN1TMPL_SET_SEQ_EXEC_CHECK_SANITY
+#define RTASN1TMPL_SET_SEQ_EXEC_CHECK_SANITY() do { } while (0)
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+/*
+ * One X.509 GeneralName.
+ * Note! This is simplified and might not work correctly for all types with
+ * non-DER compatible encodings.
+ */
+#define RTASN1TMPL_TYPE RTCRX509GENERALNAME
+#define RTASN1TMPL_EXT_NAME RTCrX509GeneralName
+#define RTASN1TMPL_INT_NAME rtCrX509GeneralName
+RTASN1TMPL_BEGIN_PCHOICE();
+RTASN1TMPL_PCHOICE_XTAG( 0, RTCRX509GENERALNAMECHOICE_OTHER_NAME, u.pT0, CtxTag0, Other, RTASN1DYNTYPE, RTAsn1DynType); /** @todo */
+RTASN1TMPL_PCHOICE_ITAG_CP( 1, RTCRX509GENERALNAMECHOICE_RFC822_NAME, u.pT1_Rfc822, Rfc822, RTASN1STRING, RTAsn1Ia5String);
+RTASN1TMPL_PCHOICE_ITAG_CP( 2, RTCRX509GENERALNAMECHOICE_DNS_NAME, u.pT2_DnsName, DnsType, RTASN1STRING, RTAsn1Ia5String);
+RTASN1TMPL_PCHOICE_XTAG( 3, RTCRX509GENERALNAMECHOICE_X400_ADDRESS, u.pT3, CtxTag3, X400Address, RTASN1DYNTYPE, RTAsn1DynType); /** @todo */
+RTASN1TMPL_PCHOICE_XTAG( 4, RTCRX509GENERALNAMECHOICE_DIRECTORY_NAME, u.pT4, CtxTag4, DirectoryName, RTCRX509NAME, RTCrX509Name);
+RTASN1TMPL_PCHOICE_XTAG( 5, RTCRX509GENERALNAMECHOICE_EDI_PARTY_NAME, u.pT5, CtxTag5, EdiPartyName, RTASN1DYNTYPE, RTAsn1DynType); /** @todo */
+RTASN1TMPL_PCHOICE_ITAG_CP( 6, RTCRX509GENERALNAMECHOICE_URI, u.pT6_Uri, Uri, RTASN1STRING, RTAsn1Ia5String);
+RTASN1TMPL_PCHOICE_ITAG_CP( 7, RTCRX509GENERALNAMECHOICE_IP_ADDRESS, u.pT7_IpAddress, IpAddress, RTASN1OCTETSTRING, RTAsn1OctetString); /** @todo Constraints */
+RTASN1TMPL_PCHOICE_ITAG_CP( 8, RTCRX509GENERALNAMECHOICE_REGISTERED_ID, u.pT8_RegisteredId,RegisteredId,RTASN1OBJID, RTAsn1ObjId);
+RTASN1TMPL_END_PCHOICE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * Sequence of X.509 GeneralNames.
+ */
+#define RTASN1TMPL_TYPE RTCRX509GENERALNAMES
+#define RTASN1TMPL_EXT_NAME RTCrX509GeneralNames
+#define RTASN1TMPL_INT_NAME rtCrX509GeneralNames
+RTASN1TMPL_SEQ_OF(RTCRX509GENERALNAME, RTCrX509GeneralName);
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * X.509 UniqueIdentifier - RTASN1BITSTRING alias.
+ */
+
+
+/*
+ * X.509 SubjectPublicKeyInfo.
+ */
+#define RTASN1TMPL_TYPE RTCRX509SUBJECTPUBLICKEYINFO
+#define RTASN1TMPL_EXT_NAME RTCrX509SubjectPublicKeyInfo
+#define RTASN1TMPL_INT_NAME rtCrX509SubjectPublicKeyInfo
+RTASN1TMPL_BEGIN_SEQCORE();
+RTASN1TMPL_MEMBER( Algorithm, RTCRX509ALGORITHMIDENTIFIER, RTCrX509AlgorithmIdentifier);
+RTASN1TMPL_MEMBER( SubjectPublicKey, RTASN1BITSTRING, RTAsn1BitString);
+RTASN1TMPL_EXEC_CHECK_SANITY( rc = rtCrX509SubjectPublicKeyInfo_CheckSanityExtra(pThis, fFlags, pErrInfo, pszErrorTag) )
+RTASN1TMPL_END_SEQCORE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * X.509 AuthorityKeyIdentifier (IPRT representation).
+ */
+#define RTASN1TMPL_TYPE RTCRX509AUTHORITYKEYIDENTIFIER
+#define RTASN1TMPL_EXT_NAME RTCrX509AuthorityKeyIdentifier
+#define RTASN1TMPL_INT_NAME rtCrX509AuthorityKeyIdentifier
+RTASN1TMPL_BEGIN_SEQCORE();
+RTASN1TMPL_MEMBER_OPT_ITAG_CP( KeyIdentifier, RTASN1OCTETSTRING, RTAsn1OctetString, 0);
+RTASN1TMPL_MEMBER_OPT_ITAG( AuthorityCertIssuer, RTCRX509GENERALNAMES, RTCrX509GeneralNames, 1);
+RTASN1TMPL_MEMBER_OPT_ITAG_CP( AuthorityCertSerialNumber, RTASN1INTEGER, RTAsn1Integer, 2);
+RTASN1TMPL_END_SEQCORE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * X.509 OldAuthorityKeyIdentifier (IPRT representation).
+ */
+#define RTASN1TMPL_TYPE RTCRX509OLDAUTHORITYKEYIDENTIFIER
+#define RTASN1TMPL_EXT_NAME RTCrX509OldAuthorityKeyIdentifier
+#define RTASN1TMPL_INT_NAME rtCrX509OldAuthorityKeyIdentifier
+RTASN1TMPL_BEGIN_SEQCORE();
+RTASN1TMPL_MEMBER_OPT_ITAG_CP( KeyIdentifier, RTASN1OCTETSTRING, RTAsn1OctetString, 0);
+RTASN1TMPL_MEMBER_OPT_XTAG( T1, CtxTag1, AuthorityCertIssuer, RTCRX509NAME, RTCrX509Name, 1);
+RTASN1TMPL_MEMBER_OPT_ITAG_CP( AuthorityCertSerialNumber, RTASN1INTEGER, RTAsn1Integer, 2);
+RTASN1TMPL_END_SEQCORE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * One X.509 PolicyQualifierInfo.
+ */
+#define RTASN1TMPL_TYPE RTCRX509POLICYQUALIFIERINFO
+#define RTASN1TMPL_EXT_NAME RTCrX509PolicyQualifierInfo
+#define RTASN1TMPL_INT_NAME rtCrX509PolicyQualifierInfo
+RTASN1TMPL_BEGIN_SEQCORE();
+RTASN1TMPL_MEMBER( PolicyQualifierId, RTASN1OBJID, RTAsn1ObjId);
+RTASN1TMPL_MEMBER( Qualifier, RTASN1DYNTYPE, RTAsn1DynType);
+RTASN1TMPL_END_SEQCORE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * Sequence of X.509 PolicyQualifierInfo.
+ */
+#define RTASN1TMPL_TYPE RTCRX509POLICYQUALIFIERINFOS
+#define RTASN1TMPL_EXT_NAME RTCrX509PolicyQualifierInfos
+#define RTASN1TMPL_INT_NAME rtCrX509PolicyQualifierInfos
+RTASN1TMPL_SEQ_OF(RTCRX509POLICYQUALIFIERINFO, RTCrX509PolicyQualifierInfo);
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * One X.509 PolicyInformation.
+ */
+#define RTASN1TMPL_TYPE RTCRX509POLICYINFORMATION
+#define RTASN1TMPL_EXT_NAME RTCrX509PolicyInformation
+#define RTASN1TMPL_INT_NAME rtCrX509PolicyInformation
+RTASN1TMPL_BEGIN_SEQCORE();
+RTASN1TMPL_MEMBER( PolicyIdentifier, RTASN1OBJID, RTAsn1ObjId);
+RTASN1TMPL_MEMBER_OPT_ITAG_UC( PolicyQualifiers, RTCRX509POLICYQUALIFIERINFOS, RTCrX509PolicyQualifierInfos, ASN1_TAG_SEQUENCE);
+RTASN1TMPL_END_SEQCORE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * Sequence of X.509 CertificatePolicies.
+ */
+#define RTASN1TMPL_TYPE RTCRX509CERTIFICATEPOLICIES
+#define RTASN1TMPL_EXT_NAME RTCrX509CertificatePolicies
+#define RTASN1TMPL_INT_NAME rtCrX509CertificatePolicies
+RTASN1TMPL_SEQ_OF(RTCRX509POLICYINFORMATION, RTCrX509PolicyInformation);
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * One X.509 PolicyMapping (IPRT representation).
+ */
+#define RTASN1TMPL_TYPE RTCRX509POLICYMAPPING
+#define RTASN1TMPL_EXT_NAME RTCrX509PolicyMapping
+#define RTASN1TMPL_INT_NAME rtCrX509PolicyMapping
+RTASN1TMPL_BEGIN_SEQCORE();
+RTASN1TMPL_MEMBER( IssuerDomainPolicy, RTASN1OBJID, RTAsn1ObjId);
+RTASN1TMPL_MEMBER( SubjectDomainPolicy, RTASN1OBJID, RTAsn1ObjId);
+RTASN1TMPL_END_SEQCORE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * Sequence of X.509 PolicyMappings (IPRT representation).
+ */
+#define RTASN1TMPL_TYPE RTCRX509POLICYMAPPINGS
+#define RTASN1TMPL_EXT_NAME RTCrX509PolicyMappings
+#define RTASN1TMPL_INT_NAME rtCrX509PolicyMappings
+RTASN1TMPL_SEQ_OF(RTCRX509POLICYMAPPING, RTCrX509PolicyMapping);
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * X.509 BasicConstraints (IPRT representation).
+ */
+#define RTASN1TMPL_TYPE RTCRX509BASICCONSTRAINTS
+#define RTASN1TMPL_EXT_NAME RTCrX509BasicConstraints
+#define RTASN1TMPL_INT_NAME rtCrX509BasicConstraints
+RTASN1TMPL_BEGIN_SEQCORE();
+RTASN1TMPL_MEMBER_DEF_ITAG_UP( CA, RTASN1BOOLEAN, RTAsn1Boolean, ASN1_TAG_BOOLEAN, false);
+RTASN1TMPL_MEMBER_OPT_ITAG_UP( PathLenConstraint, RTASN1INTEGER, RTAsn1Integer, ASN1_TAG_INTEGER);
+RTASN1TMPL_END_SEQCORE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * X.509 GeneralSubtree (IPRT representation).
+ */
+#define RTASN1TMPL_TYPE RTCRX509GENERALSUBTREE
+#define RTASN1TMPL_EXT_NAME RTCrX509GeneralSubtree
+#define RTASN1TMPL_INT_NAME rtCrX509GeneralSubtree
+RTASN1TMPL_BEGIN_SEQCORE();
+RTASN1TMPL_MEMBER( Base, RTCRX509GENERALNAME, RTCrX509GeneralName);
+RTASN1TMPL_MEMBER_DEF_ITAG_UP( Minimum, RTASN1INTEGER, RTAsn1Integer, ASN1_TAG_INTEGER, 0);
+RTASN1TMPL_MEMBER_OPT_ITAG_UP( Maximum, RTASN1INTEGER, RTAsn1Integer, ASN1_TAG_INTEGER);
+RTASN1TMPL_END_SEQCORE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+
+/*
+ * Sequence of X.509 GeneralSubtrees (IPRT representation).
+ */
+#define RTASN1TMPL_TYPE RTCRX509GENERALSUBTREES
+#define RTASN1TMPL_EXT_NAME RTCrX509GeneralSubtrees
+#define RTASN1TMPL_INT_NAME rtCrX509GeneralSubtrees
+RTASN1TMPL_SEQ_OF(RTCRX509GENERALSUBTREE, RTCrX509GeneralSubtree);
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * X.509 NameConstraints (IPRT representation).
+ */
+#define RTASN1TMPL_TYPE RTCRX509NAMECONSTRAINTS
+#define RTASN1TMPL_EXT_NAME RTCrX509NameConstraints
+#define RTASN1TMPL_INT_NAME rtCrX509NameConstraints
+RTASN1TMPL_BEGIN_SEQCORE();
+RTASN1TMPL_MEMBER_OPT_XTAG( T0, CtxTag0, PermittedSubtrees, RTCRX509GENERALSUBTREES, RTCrX509GeneralSubtrees, 0);
+RTASN1TMPL_MEMBER_OPT_XTAG( T1, CtxTag1, ExcludedSubtrees, RTCRX509GENERALSUBTREES, RTCrX509GeneralSubtrees, 1);
+RTASN1TMPL_END_SEQCORE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * X.509 PolicyConstraints (IPRT representation).
+ */
+#define RTASN1TMPL_TYPE RTCRX509POLICYCONSTRAINTS
+#define RTASN1TMPL_EXT_NAME RTCrX509PolicyConstraints
+#define RTASN1TMPL_INT_NAME rtCrX509PolicyConstraints
+RTASN1TMPL_BEGIN_SEQCORE();
+RTASN1TMPL_MEMBER_OPT_ITAG_CP( RequireExplicitPolicy, RTASN1INTEGER, RTAsn1Integer, 0);
+RTASN1TMPL_MEMBER_OPT_ITAG_CP( InhibitPolicyMapping, RTASN1INTEGER, RTAsn1Integer, 1);
+RTASN1TMPL_END_SEQCORE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * One X.509 Extension.
+ */
+#define RTASN1TMPL_TYPE RTCRX509EXTENSION
+#define RTASN1TMPL_EXT_NAME RTCrX509Extension
+#define RTASN1TMPL_INT_NAME rtCrX509Extension
+RTASN1TMPL_BEGIN_SEQCORE();
+RTASN1TMPL_MEMBER( ExtnId, RTASN1OBJID, RTAsn1ObjId);
+RTASN1TMPL_MEMBER_DEF_ITAG_UP( Critical, RTASN1BOOLEAN, RTAsn1Boolean, ASN1_TAG_BOOLEAN, false);
+RTASN1TMPL_MEMBER( ExtnValue, RTASN1OCTETSTRING, RTAsn1OctetString);
+RTASN1TMPL_EXEC_DECODE(rc = RTCrX509Extension_ExtnValue_DecodeAsn1(pCursor, fFlags, pThis, "ExtnValue"))
+RTASN1TMPL_EXEC_CLONE( rc = rtCrX509Extension_ExtnValue_Clone(pThis, pSrc))
+RTASN1TMPL_END_SEQCORE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * Sequence of X.509 Extensions.
+ */
+#define RTASN1TMPL_TYPE RTCRX509EXTENSIONS
+#define RTASN1TMPL_EXT_NAME RTCrX509Extensions
+#define RTASN1TMPL_INT_NAME rtCrX509Extensions
+RTASN1TMPL_SEQ_OF(RTCRX509EXTENSION, RTCrX509Extension);
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * X.509 TbsCertificate.
+ */
+#define RTASN1TMPL_TYPE RTCRX509TBSCERTIFICATE
+#define RTASN1TMPL_EXT_NAME RTCrX509TbsCertificate
+#define RTASN1TMPL_INT_NAME rtCrX509TbsCertificate
+RTASN1TMPL_BEGIN_SEQCORE();
+RTASN1TMPL_MEMBER_OPT_XTAG( T0, CtxTag0, Version, RTASN1INTEGER, RTAsn1Integer, 0);
+RTASN1TMPL_MEMBER( SerialNumber, RTASN1INTEGER, RTAsn1Integer);
+RTASN1TMPL_MEMBER( Signature, RTCRX509ALGORITHMIDENTIFIER, RTCrX509AlgorithmIdentifier);
+RTASN1TMPL_MEMBER( Issuer, RTCRX509NAME, RTCrX509Name);
+RTASN1TMPL_MEMBER( Validity, RTCRX509VALIDITY, RTCrX509Validity);
+RTASN1TMPL_MEMBER( Subject, RTCRX509NAME, RTCrX509Name);
+RTASN1TMPL_MEMBER( SubjectPublicKeyInfo, RTCRX509SUBJECTPUBLICKEYINFO, RTCrX509SubjectPublicKeyInfo);
+RTASN1TMPL_MEMBER_OPT_XTAG( T1, CtxTag1, IssuerUniqueId, RTCRX509UNIQUEIDENTIFIER, RTCrX509UniqueIdentifier, 1);
+RTASN1TMPL_MEMBER_OPT_XTAG( T2, CtxTag2, SubjectUniqueId, RTCRX509UNIQUEIDENTIFIER, RTCrX509UniqueIdentifier, 2);
+RTASN1TMPL_MEMBER_OPT_XTAG( T3, CtxTag3, Extensions, RTCRX509EXTENSIONS, RTCrX509Extensions, 3);
+RTASN1TMPL_EXEC_DECODE( rc = RTCrX509TbsCertificate_ReprocessExtensions(pThis, pCursor->pPrimary->pErrInfo) )
+RTASN1TMPL_EXEC_CLONE( rc = RTCrX509TbsCertificate_ReprocessExtensions(pThis, NULL) )
+RTASN1TMPL_EXEC_CHECK_SANITY( rc = rtCrX509TbsCertificate_CheckSanityExtra(pThis, fFlags, pErrInfo, pszErrorTag) )
+RTASN1TMPL_END_SEQCORE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * One X.509 Certificate.
+ */
+#define RTASN1TMPL_TYPE RTCRX509CERTIFICATE
+#define RTASN1TMPL_EXT_NAME RTCrX509Certificate
+#define RTASN1TMPL_INT_NAME rtCrX509Certificate
+RTASN1TMPL_BEGIN_SEQCORE();
+RTASN1TMPL_MEMBER( TbsCertificate, RTCRX509TBSCERTIFICATE, RTCrX509TbsCertificate);
+RTASN1TMPL_MEMBER( SignatureAlgorithm, RTCRX509ALGORITHMIDENTIFIER, RTCrX509AlgorithmIdentifier);
+RTASN1TMPL_MEMBER( SignatureValue, RTASN1BITSTRING, RTAsn1BitString);
+RTASN1TMPL_EXEC_CHECK_SANITY( rc = rtCrX509Certificate_CheckSanityExtra(pThis, fFlags, pErrInfo, pszErrorTag) )
+RTASN1TMPL_END_SEQCORE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * Set of X.509 Certificates.
+ */
+/** @todo Microsoft Hacks. ExtendedCertificates. */
+#define RTASN1TMPL_TYPE RTCRX509CERTIFICATES
+#define RTASN1TMPL_EXT_NAME RTCrX509Certificates
+#define RTASN1TMPL_INT_NAME rtCrX509Certificates
+RTASN1TMPL_SET_OF(RTCRX509CERTIFICATE, RTCrX509Certificate);
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
diff --git a/src/VBox/Runtime/common/crypto/x509-verify.cpp b/src/VBox/Runtime/common/crypto/x509-verify.cpp
new file mode 100644
index 00000000000..f08ef2dd128
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/x509-verify.cpp
@@ -0,0 +1,85 @@
+/* $Id$ */
+/** @file
+ * IPRT - Crypto - X.509, Signature verficiation.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/crypto/x509.h>
+#include <iprt/crypto/pkix.h>
+
+#include <iprt/err.h>
+#include <iprt/string.h>
+
+
+RTDECL(int) RTCrX509Certificate_VerifySignature(PCRTCRX509CERTIFICATE pThis, PCRTASN1OBJID pAlgorithm,
+ PCRTASN1DYNTYPE pParameters, PCRTASN1BITSTRING pPublicKey,
+ PRTERRINFO pErrInfo)
+{
+ /*
+ * Validate the input a little.
+ */
+ AssertPtrReturn(pThis, VERR_INVALID_POINTER);
+ AssertReturn(RTCrX509Certificate_IsPresent(pThis), VERR_INVALID_PARAMETER);
+
+ AssertPtrReturn(pAlgorithm, VERR_INVALID_POINTER);
+ AssertReturn(RTAsn1ObjId_IsPresent(pAlgorithm), VERR_INVALID_POINTER);
+
+ if (pParameters)
+ {
+ AssertPtrReturn(pParameters, VERR_INVALID_POINTER);
+ if (pParameters->enmType == RTASN1TYPE_NULL)
+ pParameters = NULL;
+ }
+
+ AssertPtrReturn(pPublicKey, VERR_INVALID_POINTER);
+ AssertReturn(RTAsn1BitString_IsPresent(pPublicKey), VERR_INVALID_POINTER);
+
+ /*
+ * Check if the algorithm matches.
+ */
+ const char *pszCipherOid = RTCrPkixGetCiperOidFromSignatureAlgorithm(&pThis->SignatureAlgorithm.Algorithm);
+ if (!pszCipherOid)
+ return RTErrInfoSetF(pErrInfo, VERR_CR_X509_UNKNOWN_CERT_SIGN_ALGO,
+ "Certificate signature algorithm not known: %s",
+ pThis->SignatureAlgorithm.Algorithm.szObjId);
+
+ if (RTAsn1ObjId_CompareWithString(pAlgorithm, pszCipherOid) != 0)
+ return RTErrInfoSetF(pErrInfo, VERR_CR_X509_CERT_SIGN_ALGO_MISMATCH,
+ "Certificate signature cipher algorithm mismatch: cert uses %s (%s) while key uses %s",
+ pszCipherOid, pThis->SignatureAlgorithm.Algorithm.szObjId, pAlgorithm->szObjId);
+
+ /*
+ * Here we should recode the to-be-signed part as DER, but we'll ASSUME
+ * that it's already in DER encoding. This is safe.
+ */
+ return RTCrPkixPubKeyVerifySignature(&pThis->SignatureAlgorithm.Algorithm, pParameters, pPublicKey, &pThis->SignatureValue,
+ RTASN1CORE_GET_RAW_ASN1_PTR(&pThis->TbsCertificate.SeqCore.Asn1Core),
+ RTASN1CORE_GET_RAW_ASN1_SIZE(&pThis->TbsCertificate.SeqCore.Asn1Core),
+ pErrInfo);
+}
+
diff --git a/src/VBox/Runtime/common/err/errinfo-alloc.cpp b/src/VBox/Runtime/common/err/errinfo-alloc.cpp
new file mode 100644
index 00000000000..2eb19cf0cbf
--- /dev/null
+++ b/src/VBox/Runtime/common/err/errinfo-alloc.cpp
@@ -0,0 +1,70 @@
+/* $Id$ */
+/** @file
+ * IPRT - Error Info, Allocators.
+ */
+
+/*
+ * Copyright (C) 2010-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/err.h>
+
+#include <iprt/assert.h>
+#include <iprt/mem.h>
+#include <iprt/string.h>
+
+
+
+RTDECL(PRTERRINFO) RTErrInfoAlloc(size_t cbMsg)
+{
+ PRTERRINFO pErrInfo;
+ RTErrInfoAllocEx(cbMsg, &pErrInfo);
+ return pErrInfo;
+}
+
+
+RTDECL(int) RTErrInfoAllocEx(size_t cbMsg, PRTERRINFO *ppErrInfo)
+{
+ if (cbMsg == 0)
+ cbMsg = _4K;
+ else
+ cbMsg = RT_ALIGN_Z(cbMsg, 256);
+
+ PRTERRINFO pErrInfo;
+ *ppErrInfo = pErrInfo = (PRTERRINFO)RTMemTmpAlloc(sizeof(*pErrInfo) + cbMsg);
+ if (RT_UNLIKELY(!pErrInfo))
+ return VERR_NO_TMP_MEMORY;
+
+ RTErrInfoInit(pErrInfo, (char *)(pErrInfo + 1), cbMsg);
+ pErrInfo->fFlags = RTERRINFO_FLAGS_T_ALLOC | RTERRINFO_FLAGS_MAGIC;
+ return VINF_SUCCESS;
+}
+
+
+RTDECL(void) RTErrInfoFree(PRTERRINFO pErrInfo)
+{
+ RTMemTmpFree(pErrInfo);
+}
+
diff --git a/src/VBox/Runtime/common/err/errinfo.cpp b/src/VBox/Runtime/common/err/errinfo.cpp
index 0add045478a..47249e7ff44 100644
--- a/src/VBox/Runtime/common/err/errinfo.cpp
+++ b/src/VBox/Runtime/common/err/errinfo.cpp
@@ -1,10 +1,10 @@
/* $Id$ */
/** @file
- * IPRT - Error Info.
+ * IPRT - Error Info, Setters.
*/
/*
- * Copyright (C) 2010-2012 Oracle Corporation
+ * Copyright (C) 2010-2014 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
@@ -32,51 +32,42 @@
#include <iprt/err.h>
#include <iprt/assert.h>
-#include <iprt/mem.h>
#include <iprt/string.h>
-
-RTDECL(PRTERRINFO) RTErrInfoAlloc(size_t cbMsg)
+RTDECL(int) RTErrInfoSet(PRTERRINFO pErrInfo, int rc, const char *pszMsg)
{
- PRTERRINFO pErrInfo;
- RTErrInfoAllocEx(cbMsg, &pErrInfo);
- return pErrInfo;
-}
-
+ if (pErrInfo)
+ {
+ AssertPtr(pErrInfo);
+ Assert((pErrInfo->fFlags & RTERRINFO_FLAGS_MAGIC_MASK) == RTERRINFO_FLAGS_MAGIC);
-RTDECL(int) RTErrInfoAllocEx(size_t cbMsg, PRTERRINFO *ppErrInfo)
-{
- if (cbMsg == 0)
- cbMsg = _4K;
- else
- cbMsg = RT_ALIGN_Z(cbMsg, 256);
-
- PRTERRINFO pErrInfo;
- *ppErrInfo = pErrInfo = (PRTERRINFO)RTMemTmpAlloc(sizeof(*pErrInfo) + cbMsg);
- if (RT_UNLIKELY(!pErrInfo))
- return VERR_NO_TMP_MEMORY;
-
- RTErrInfoInit(pErrInfo, (char *)(pErrInfo + 1), cbMsg);
- pErrInfo->fFlags = RTERRINFO_FLAGS_T_ALLOC | RTERRINFO_FLAGS_MAGIC;
- return VINF_SUCCESS;
+ RTStrCopy(pErrInfo->pszMsg, pErrInfo->cbMsg, pszMsg);
+ pErrInfo->rc = rc;
+ pErrInfo->fFlags |= RTERRINFO_FLAGS_SET;
+ }
+ return rc;
}
-RTDECL(void) RTErrInfoFree(PRTERRINFO pErrInfo)
+RTDECL(int) RTErrInfoSetF(PRTERRINFO pErrInfo, int rc, const char *pszFormat, ...)
{
- RTMemTmpFree(pErrInfo);
+ va_list va;
+ va_start(va, pszFormat);
+ RTErrInfoSetV(pErrInfo, rc, pszFormat, va);
+ va_end(va);
+ return rc;
}
-RTDECL(int) RTErrInfoSet(PRTERRINFO pErrInfo, int rc, const char *pszMsg)
+RTDECL(int) RTErrInfoSetV(PRTERRINFO pErrInfo, int rc, const char *pszFormat, va_list va)
{
if (pErrInfo)
{
AssertPtr(pErrInfo);
Assert((pErrInfo->fFlags & RTERRINFO_FLAGS_MAGIC_MASK) == RTERRINFO_FLAGS_MAGIC);
- RTStrCopy(pErrInfo->pszMsg, pErrInfo->cbMsg, pszMsg);
+ RTStrPrintfV(pErrInfo->pszMsg, pErrInfo->cbMsg, pszFormat, va);
pErrInfo->rc = rc;
pErrInfo->fFlags |= RTERRINFO_FLAGS_SET;
}
@@ -84,26 +75,52 @@ RTDECL(int) RTErrInfoSet(PRTERRINFO pErrInfo, int rc, const char *pszMsg
}
-RTDECL(int) RTErrInfoSetF(PRTERRINFO pErrInfo, int rc, const char *pszFormat, ...)
+RTDECL(int) RTErrInfoAdd(PRTERRINFO pErrInfo, int rc, const char *pszMsg)
+{
+ if (pErrInfo)
+ {
+ AssertPtr(pErrInfo);
+ if (pErrInfo->fFlags & RTERRINFO_FLAGS_SET)
+ RTStrCat(pErrInfo->pszMsg, pErrInfo->cbMsg, pszMsg);
+ else
+ {
+ while (*pszMsg == ' ')
+ pszMsg++;
+ return RTErrInfoSet(pErrInfo, rc, pszMsg);
+ }
+ }
+ return rc;
+}
+
+
+RTDECL(int) RTErrInfoAddF(PRTERRINFO pErrInfo, int rc, const char *pszFormat, ...)
{
va_list va;
va_start(va, pszFormat);
- RTErrInfoSetV(pErrInfo, rc, pszFormat, va);
+ RTErrInfoAddV(pErrInfo, rc, pszFormat, va);
va_end(va);
return rc;
}
-RTDECL(int) RTErrInfoSetV(PRTERRINFO pErrInfo, int rc, const char *pszFormat, va_list va)
+RTDECL(int) RTErrInfoAddV(PRTERRINFO pErrInfo, int rc, const char *pszFormat, va_list va)
{
if (pErrInfo)
{
AssertPtr(pErrInfo);
Assert((pErrInfo->fFlags & RTERRINFO_FLAGS_MAGIC_MASK) == RTERRINFO_FLAGS_MAGIC);
-
- RTStrPrintfV(pErrInfo->pszMsg, pErrInfo->cbMsg, pszFormat, va);
- pErrInfo->rc = rc;
- pErrInfo->fFlags |= RTERRINFO_FLAGS_SET;
+ if (pErrInfo->fFlags & RTERRINFO_FLAGS_SET)
+ {
+ char *pszOut = (char *)memchr(pErrInfo->pszMsg, '\0', pErrInfo->cbMsg - 2);
+ if (pszOut)
+ RTStrPrintfV(pszOut, &pErrInfo->pszMsg[pErrInfo->cbMsg] - pszOut, pszFormat, va);
+ }
+ else
+ {
+ while (*pszFormat == ' ')
+ pszFormat++;
+ return RTErrInfoSetV(pErrInfo, rc, pszFormat, va);
+ }
}
return rc;
}
diff --git a/src/VBox/Runtime/common/err/errmsg.cpp b/src/VBox/Runtime/common/err/errmsg.cpp
index 8b3aaf724c8..0f950b47c8f 100644
--- a/src/VBox/Runtime/common/err/errmsg.cpp
+++ b/src/VBox/Runtime/common/err/errmsg.cpp
@@ -45,7 +45,11 @@
*/
static const RTSTATUSMSG g_aStatusMsgs[] =
{
-#include "errmsgdata.h"
+#ifndef IPRT_NO_ERROR_DATA
+# include "errmsgdata.h"
+#else
+ { "Success.", "Success.", "VINF_SUCCESS", 0 },
+#endif
{ NULL, NULL, NULL, 0 }
};
@@ -76,7 +80,7 @@ RTDECL(PCRTSTATUSMSG) RTErrGet(int rc)
{
unsigned iFound = ~0;
unsigned i;
- for (i = 0; i < RT_ELEMENTS(g_aStatusMsgs); i++)
+ for (i = 0; i < RT_ELEMENTS(g_aStatusMsgs) - 1; i++)
{
if (g_aStatusMsgs[i].iCode == rc)
{
@@ -104,7 +108,7 @@ RTDECL(PCRTSTATUSMSG) RTErrGet(int rc)
* Need to use the temporary stuff.
*/
int iMsg = ASMAtomicXchgU32(&g_iUnknownMsgs, (g_iUnknownMsgs + 1) % RT_ELEMENTS(g_aUnknownMsgs));
- RTStrPrintf(&g_aszUnknownStr[iMsg][0], sizeof(g_aszUnknownStr[iMsg]), "Unknown Status 0x%X", rc);
+ RTStrPrintf(&g_aszUnknownStr[iMsg][0], sizeof(g_aszUnknownStr[iMsg]), "Unknown Status %d (%#x)", rc, rc);
return &g_aUnknownMsgs[iMsg];
}
RT_EXPORT_SYMBOL(RTErrGet);
diff --git a/src/VBox/Runtime/common/ldr/Makefile.kup b/src/VBox/Runtime/common/ldr/Makefile.kup
index e69de29bb2d..d3f5a12faa9 100644
--- a/src/VBox/Runtime/common/ldr/Makefile.kup
+++ b/src/VBox/Runtime/common/ldr/Makefile.kup
@@ -0,0 +1 @@
+
diff --git a/src/VBox/Runtime/common/ldr/ldr.cpp b/src/VBox/Runtime/common/ldr/ldr.cpp
index ebe85edb149..af893b0d2e6 100644
--- a/src/VBox/Runtime/common/ldr/ldr.cpp
+++ b/src/VBox/Runtime/common/ldr/ldr.cpp
@@ -40,23 +40,6 @@
#include "internal/ldr.h"
-RTDECL(bool) RTLdrIsLoadable(const char *pszFilename)
-{
- /*
- * Try to load the library.
- */
- RTLDRMOD hLib;
- int rc = RTLdrLoad(pszFilename, &hLib);
- if (RT_SUCCESS(rc))
- {
- RTLdrClose(hLib);
- return true;
- }
- return false;
-}
-RT_EXPORT_SYMBOL(RTLdrIsLoadable);
-
-
RTDECL(int) RTLdrGetSymbol(RTLDRMOD hLdrMod, const char *pszSymbol, void **ppvValue)
{
LogFlow(("RTLdrGetSymbol: hLdrMod=%RTldrm pszSymbol=%p:{%s} ppvValue=%p\n",
diff --git a/src/VBox/Runtime/common/ldr/ldrELF.cpp b/src/VBox/Runtime/common/ldr/ldrELF.cpp
index 7ddb3f5fa08..fef4633fa62 100644
--- a/src/VBox/Runtime/common/ldr/ldrELF.cpp
+++ b/src/VBox/Runtime/common/ldr/ldrELF.cpp
@@ -116,8 +116,9 @@ static const char *rtldrElfGetShdrType(uint32_t iType)
* @param fFlags Reserved, MBZ.
* @param enmArch Architecture specifier.
* @param phLdrMod Where to store the handle.
+ * @param pErrInfo Where to return extended error information. Optional.
*/
-int rtldrELFOpen(PRTLDRREADER pReader, uint32_t fFlags, RTLDRARCH enmArch, PRTLDRMOD phLdrMod)
+int rtldrELFOpen(PRTLDRREADER pReader, uint32_t fFlags, RTLDRARCH enmArch, PRTLDRMOD phLdrMod, PRTERRINFO pErrInfo)
{
const char *pszLogName = pReader->pfnLogName(pReader); NOREF(pszLogName);
diff --git a/src/VBox/Runtime/common/ldr/ldrELFRelocatable.cpp.h b/src/VBox/Runtime/common/ldr/ldrELFRelocatable.cpp.h
index 7694b686017..a24b95e45fb 100644
--- a/src/VBox/Runtime/common/ldr/ldrELFRelocatable.cpp.h
+++ b/src/VBox/Runtime/common/ldr/ldrELFRelocatable.cpp.h
@@ -1401,6 +1401,8 @@ static RTLDROPS RTLDRELF_MID(s_rtldrElf,Ops) =
RTLDRELF_NAME(RvaToSegOffset),
RTLDRELF_NAME(ReadDbgInfo),
NULL /*pfnQueryProp*/,
+ NULL /*pfnVerifySignature*/,
+ NULL /*pfnHashImage*/,
42
};
diff --git a/src/VBox/Runtime/common/ldr/ldrEx.cpp b/src/VBox/Runtime/common/ldr/ldrEx.cpp
index 23d1a09b42e..bf38b81de8e 100644
--- a/src/VBox/Runtime/common/ldr/ldrEx.cpp
+++ b/src/VBox/Runtime/common/ldr/ldrEx.cpp
@@ -32,27 +32,44 @@
#include <iprt/ldr.h>
#include "internal/iprt.h"
-#include <iprt/alloc.h>
#include <iprt/assert.h>
+#include <iprt/err.h>
#include <iprt/log.h>
+#include <iprt/md5.h>
+#include <iprt/mem.h>
+#include <iprt/sha.h>
#include <iprt/string.h>
-#include <iprt/err.h>
#include "internal/ldr.h"
#include "internal/ldrMZ.h"
+#ifdef LDR_ONLY_PE
+# undef LDR_WITH_PE
+# undef LDR_WITH_KLDR
+# undef LDR_WITH_ELF
+# undef LDR_WITH_LX
+# undef LDR_WITH_LE
+# undef LDR_WITH_NE
+# undef LDR_WITH_MZ
+# undef LDR_WITH_AOUT
+# define LDR_WITH_PE
+#endif
-/**
- * Open part with reader.
- *
- * @returns iprt status code.
- * @param pReader The loader reader instance which will provide the raw image bits.
- * @param fFlags Reserved, MBZ.
- * @param enmArch Architecture specifier.
- * @param phMod Where to store the handle.
- */
-int rtldrOpenWithReader(PRTLDRREADER pReader, uint32_t fFlags, RTLDRARCH enmArch, PRTLDRMOD phMod)
+
+RTDECL(int) RTLdrOpenWithReader(PRTLDRREADER pReader, uint32_t fFlags, RTLDRARCH enmArch, PRTLDRMOD phMod, PRTERRINFO pErrInfo)
{
/*
+ * Resolve RTLDRARCH_HOST.
+ */
+ if (enmArch == RTLDRARCH_HOST)
+#if defined(RT_ARCH_AMD64)
+ enmArch = RTLDRARCH_AMD64;
+#elif defined(RT_ARCH_X86)
+ enmArch = RTLDRARCH_X86_32;
+#else
+ enmArch = RTLDRARCH_WHATEVER;
+#endif
+
+ /*
* Read and verify the file signature.
*/
union
@@ -104,37 +121,37 @@ int rtldrOpenWithReader(PRTLDRREADER pReader, uint32_t fFlags, RTLDRARCH enmArch
*/
if (uSign.u32 == IMAGE_NT_SIGNATURE)
#ifdef LDR_WITH_PE
- rc = rtldrPEOpen(pReader, fFlags, enmArch, offHdr, phMod);
+ rc = rtldrPEOpen(pReader, fFlags, enmArch, offHdr, phMod, pErrInfo);
#else
rc = VERR_PE_EXE_NOT_SUPPORTED;
#endif
else if (uSign.u32 == IMAGE_ELF_SIGNATURE)
#if defined(LDR_WITH_ELF)
- rc = rtldrELFOpen(pReader, fFlags, enmArch, phMod);
+ rc = rtldrELFOpen(pReader, fFlags, enmArch, phMod, pErrInfo);
#else
rc = VERR_ELF_EXE_NOT_SUPPORTED;
#endif
else if (uSign.au16[0] == IMAGE_LX_SIGNATURE)
#ifdef LDR_WITH_LX
- rc = rtldrLXOpen(pReader, fFlags, enmArch, offHdr, phMod);
+ rc = rtldrLXOpen(pReader, fFlags, enmArch, offHdr, phMod, pErrInfo);
#else
rc = VERR_LX_EXE_NOT_SUPPORTED;
#endif
else if (uSign.au16[0] == IMAGE_LE_SIGNATURE)
#ifdef LDR_WITH_LE
- rc = rtldrLEOpen(pReader, fFlags, enmArch, phMod);
+ rc = rtldrLEOpen(pReader, fFlags, enmArch, phMod, pErrInfo);
#else
rc = VERR_LE_EXE_NOT_SUPPORTED;
#endif
else if (uSign.au16[0] == IMAGE_NE_SIGNATURE)
#ifdef LDR_WITH_NE
- rc = rtldrNEOpen(pReader, fFlags, enmArch, phMod);
+ rc = rtldrNEOpen(pReader, fFlags, enmArch, phMod, pErrInfo);
#else
rc = VERR_NE_EXE_NOT_SUPPORTED;
#endif
else if (uSign.au16[0] == IMAGE_DOS_SIGNATURE)
#ifdef LDR_WITH_MZ
- rc = rtldrMZOpen(pReader, fFlags, enmArch, phMod);
+ rc = rtldrMZOpen(pReader, fFlags, enmArch, phMod, pErrInfo);
#else
rc = VERR_MZ_EXE_NOT_SUPPORTED;
#endif
@@ -142,7 +159,7 @@ int rtldrOpenWithReader(PRTLDRREADER pReader, uint32_t fFlags, RTLDRARCH enmArch
|| uSign.u32 == IMAGE_AOUT_Z_SIGNATURE*/ /** @todo find the aout magics in emx or binutils. */
0)
#ifdef LDR_WITH_AOUT
- rc = rtldrAOUTOpen(pReader, fFlags, enmArch, phMod);
+ rc = rtldrAOUTOpen(pReader, fFlags, enmArch, phMod, pErrInfo);
#else
rc = VERR_AOUT_EXE_NOT_SUPPORTED;
#endif
@@ -157,7 +174,11 @@ int rtldrOpenWithReader(PRTLDRREADER pReader, uint32_t fFlags, RTLDRARCH enmArch
#ifdef LDR_WITH_KLDR
/* Try kLdr if it's a format we don't recognize. */
if (rc <= VERR_INVALID_EXE_SIGNATURE && rc > VERR_BAD_EXE_FORMAT)
- rc = rtldrkLdrOpen(pReader, fFlags, enmArch, phMod);
+ {
+ int rc2 = rtldrkLdrOpen(pReader, fFlags, enmArch, phMod, pErrInfo);
+ if (rc2 == VERR_MZ_EXE_NOT_SUPPORTED) /* Quick fix for bad return code. */
+ rc = rc;
+ }
#endif
LogFlow(("rtldrOpenWithReader: %s: returns %Rrc *phMod=%p\n", pReader->pfnLogName(pReader), rc, *phMod));
@@ -541,20 +562,46 @@ RT_EXPORT_SYMBOL(RTLdrRvaToSegOffset);
RTDECL(int) RTLdrQueryProp(RTLDRMOD hLdrMod, RTLDRPROP enmProp, void *pvBuf, size_t cbBuf)
{
+ return RTLdrQueryPropEx(hLdrMod, enmProp, pvBuf, cbBuf, NULL);
+}
+RT_EXPORT_SYMBOL(RTLdrQueryProp);
+
+
+RTDECL(int) RTLdrQueryPropEx(RTLDRMOD hLdrMod, RTLDRPROP enmProp, void *pvBuf, size_t cbBuf, size_t *pcbRet)
+{
AssertMsgReturn(rtldrIsValid(hLdrMod), ("hLdrMod=%p\n", hLdrMod), RTLDRENDIAN_INVALID);
PRTLDRMODINTERNAL pMod = (PRTLDRMODINTERNAL)hLdrMod;
+ AssertPtrNullReturn(pcbRet, VERR_INVALID_POINTER);
+ size_t cbRet;
+ if (!pcbRet)
+ pcbRet = &cbRet;
+
/*
* Do some pre screening of the input
*/
switch (enmProp)
{
case RTLDRPROP_UUID:
+ *pcbRet = sizeof(RTUUID);
AssertReturn(cbBuf == sizeof(RTUUID), VERR_INVALID_PARAMETER);
break;
case RTLDRPROP_TIMESTAMP_SECONDS:
+ *pcbRet = sizeof(int64_t);
AssertReturn(cbBuf == sizeof(int32_t) || cbBuf == sizeof(int64_t), VERR_INVALID_PARAMETER);
break;
+ case RTLDRPROP_IS_SIGNED:
+ *pcbRet = sizeof(bool);
+ AssertReturn(cbBuf == sizeof(bool), VERR_INVALID_PARAMETER);
+ break;
+ case RTLDRPROP_PKCS7_SIGNED_DATA:
+ *pcbRet = 0;
+ break;
+ case RTLDRPROP_SIGNATURE_CHECKS_ENFORCED:
+ *pcbRet = sizeof(bool);
+ AssertReturn(cbBuf == sizeof(bool), VERR_INVALID_PARAMETER);
+ break;
+
default:
AssertFailedReturn(VERR_INVALID_FUNCTION);
}
@@ -565,9 +612,57 @@ RTDECL(int) RTLdrQueryProp(RTLDRMOD hLdrMod, RTLDRPROP enmProp, void *pvBuf, siz
*/
if (!pMod->pOps->pfnQueryProp)
return VERR_NOT_SUPPORTED;
- return pMod->pOps->pfnQueryProp(pMod, enmProp, pvBuf, cbBuf);
+ return pMod->pOps->pfnQueryProp(pMod, enmProp, pvBuf, cbBuf, pcbRet);
}
-RT_EXPORT_SYMBOL(RTLdrQueryProp);
+RT_EXPORT_SYMBOL(RTLdrQueryPropEx);
+
+
+RTDECL(int) RTLdrVerifySignature(RTLDRMOD hLdrMod, PFNRTLDRVALIDATESIGNEDDATA pfnCallback, void *pvUser, PRTERRINFO pErrInfo)
+{
+ AssertMsgReturn(rtldrIsValid(hLdrMod), ("hLdrMod=%p\n", hLdrMod), VERR_INVALID_HANDLE);
+ PRTLDRMODINTERNAL pMod = (PRTLDRMODINTERNAL)hLdrMod;
+ AssertPtrReturn(pfnCallback, VERR_INVALID_POINTER);
+
+ /*
+ * Call the image specific worker, if there is one.
+ */
+ if (!pMod->pOps->pfnVerifySignature)
+ return VERR_NOT_SUPPORTED;
+ return pMod->pOps->pfnVerifySignature(pMod, pfnCallback, pvUser, pErrInfo);
+}
+RT_EXPORT_SYMBOL(RTLdrVerifySignature);
+
+
+RTDECL(int) RTLdrHashImage(RTLDRMOD hLdrMod, RTDIGESTTYPE enmDigest, char *pszDigest, size_t cbDigest)
+{
+ AssertMsgReturn(rtldrIsValid(hLdrMod), ("hLdrMod=%p\n", hLdrMod), VERR_INVALID_HANDLE);
+ PRTLDRMODINTERNAL pMod = (PRTLDRMODINTERNAL)hLdrMod;
+
+ /*
+ * Make sure there is sufficient space for the wanted digest and that
+ * it's supported.
+ */
+ switch (enmDigest)
+ {
+ case RTDIGESTTYPE_MD5: AssertReturn(cbDigest >= RTMD5_DIGEST_LEN + 1, VERR_BUFFER_OVERFLOW); break;
+ case RTDIGESTTYPE_SHA1: AssertReturn(cbDigest >= RTSHA1_DIGEST_LEN + 1, VERR_BUFFER_OVERFLOW); break;
+ case RTDIGESTTYPE_SHA256: AssertReturn(cbDigest >= RTSHA256_DIGEST_LEN + 1, VERR_BUFFER_OVERFLOW); break;
+ case RTDIGESTTYPE_SHA512: AssertReturn(cbDigest >= RTSHA512_DIGEST_LEN + 1, VERR_BUFFER_OVERFLOW); break;
+ default:
+ if (enmDigest > RTDIGESTTYPE_INVALID && enmDigest < RTDIGESTTYPE_END)
+ return VERR_NOT_SUPPORTED;
+ AssertFailedReturn(VERR_INVALID_PARAMETER);
+ }
+ AssertPtrReturn(pszDigest, VERR_INVALID_POINTER);
+
+ /*
+ * Call the image specific worker, if there is one.
+ */
+ if (!pMod->pOps->pfnHashImage)
+ return VERR_NOT_SUPPORTED;
+ return pMod->pOps->pfnHashImage(pMod, enmDigest, pszDigest, cbDigest);
+}
+RT_EXPORT_SYMBOL(RTLdrHashImage);
/**
diff --git a/src/VBox/Runtime/common/ldr/ldrFile.cpp b/src/VBox/Runtime/common/ldr/ldrFile.cpp
index 92b61c4a3b9..aab38f3a368 100644
--- a/src/VBox/Runtime/common/ldr/ldrFile.cpp
+++ b/src/VBox/Runtime/common/ldr/ldrFile.cpp
@@ -217,6 +217,7 @@ static int rtldrFileCreate(PRTLDRREADER *ppReader, const char *pszFilename)
rc = RTFileGetSize(pFileReader->hFile, (uint64_t *)&pFileReader->cbFile);
if (RT_SUCCESS(rc))
{
+ pFileReader->Core.uMagic = RTLDRREADER_MAGIC;
pFileReader->Core.pfnRead = rtldrFileRead;
pFileReader->Core.pfnTell = rtldrFileTell;
pFileReader->Core.pfnSize = rtldrFileSize;
@@ -257,25 +258,13 @@ RTDECL(int) RTLdrOpen(const char *pszFilename, uint32_t fFlags, RTLDRARCH enmArc
AssertMsgReturn(enmArch > RTLDRARCH_INVALID && enmArch < RTLDRARCH_END, ("%d\n", enmArch), VERR_INVALID_PARAMETER);
/*
- * Resolve RTLDRARCH_HOST.
- */
- if (enmArch == RTLDRARCH_HOST)
-#if defined(RT_ARCH_AMD64)
- enmArch = RTLDRARCH_AMD64;
-#elif defined(RT_ARCH_X86)
- enmArch = RTLDRARCH_X86_32;
-#else
- enmArch = RTLDRARCH_WHATEVER;
-#endif
-
- /*
* Create file reader & invoke worker which identifies and calls the image interpreter.
*/
PRTLDRREADER pReader;
int rc = rtldrFileCreate(&pReader, pszFilename);
if (RT_SUCCESS(rc))
{
- rc = rtldrOpenWithReader(pReader, fFlags, enmArch, phLdrMod);
+ rc = RTLdrOpenWithReader(pReader, fFlags, enmArch, phLdrMod, NULL);
if (RT_SUCCESS(rc))
{
LogFlow(("RTLdrOpen: return %Rrc *phLdrMod\n", rc, *phLdrMod));
@@ -308,25 +297,13 @@ RTDECL(int) RTLdrOpenkLdr(const char *pszFilename, uint32_t fFlags, RTLDRARCH en
AssertMsgReturn(!(fFlags & ~RTLDR_O_VALID_MASK), ("%#x\n", fFlags), VERR_INVALID_PARAMETER);
/*
- * Resolve RTLDRARCH_HOST.
- */
- if (enmArch == RTLDRARCH_HOST)
-# if defined(RT_ARCH_AMD64)
- enmArch = RTLDRARCH_AMD64;
-# elif defined(RT_ARCH_X86)
- enmArch = RTLDRARCH_X86_32;
-# else
- enmArch = RTLDRARCH_WHATEVER;
-# endif
-
- /*
* Create file reader & invoke worker which identifies and calls the image interpreter.
*/
PRTLDRREADER pReader;
int rc = rtldrFileCreate(&pReader, pszFilename);
if (RT_SUCCESS(rc))
{
- rc = rtldrkLdrOpen(pReader, fFlags, enmArch, phLdrMod);
+ rc = rtldrkLdrOpen(pReader, fFlags, enmArch, phLdrMod, NULL);
if (RT_SUCCESS(rc))
{
LogFlow(("RTLdrOpenkLdr: return %Rrc *phLdrMod\n", rc, *phLdrMod));
diff --git a/src/VBox/Runtime/common/ldr/ldrMemory.cpp b/src/VBox/Runtime/common/ldr/ldrMemory.cpp
index c478bebc99b..fe16d9933c2 100644
--- a/src/VBox/Runtime/common/ldr/ldrMemory.cpp
+++ b/src/VBox/Runtime/common/ldr/ldrMemory.cpp
@@ -243,7 +243,7 @@ static int rtldrRdrMem_Create(PRTLDRREADER *ppReader, const char *pszName, size_
pThis->pfnDtor = pfnDtor ? pfnDtor : rtldrRdrMemDefaultDtor;
pThis->pvMapping = NULL;
pThis->cMappings = 0;
- pThis->Core.pszName = "rdrmem";
+ pThis->Core.uMagic = RTLDRREADER_MAGIC;
pThis->Core.pfnRead = rtldrRdrMem_Read;
pThis->Core.pfnTell = rtldrRdrMem_Tell;
pThis->Core.pfnSize = rtldrRdrMem_Size;
@@ -304,7 +304,7 @@ RTDECL(int) RTLdrOpenInMemory(const char *pszName, uint32_t fFlags, RTLDRARCH en
int rc = rtldrRdrMem_Create(&pReader, pszName, cbImage, pfnRead, pfnDtor, pvUser);
if (RT_SUCCESS(rc))
{
- rc = rtldrOpenWithReader(pReader, fFlags, enmArch, phLdrMod);
+ rc = RTLdrOpenWithReader(pReader, fFlags, enmArch, phLdrMod, NULL);
if (RT_SUCCESS(rc))
{
LogFlow(("RTLdrOpen: return %Rrc *phLdrMod\n", rc, *phLdrMod));
diff --git a/src/VBox/Runtime/common/ldr/ldrNative.cpp b/src/VBox/Runtime/common/ldr/ldrNative.cpp
index a390b93f337..2d7cbde5903 100644
--- a/src/VBox/Runtime/common/ldr/ldrNative.cpp
+++ b/src/VBox/Runtime/common/ldr/ldrNative.cpp
@@ -82,6 +82,8 @@ static const RTLDROPS g_rtldrNativeOps =
NULL,
NULL,
NULL,
+ NULL,
+ NULL,
42
};
@@ -318,3 +320,20 @@ RTDECL(uintptr_t) RTLdrGetNativeHandle(RTLDRMOD hLdrMod)
}
RT_EXPORT_SYMBOL(RTLdrGetNativeHandle);
+
+RTDECL(bool) RTLdrIsLoadable(const char *pszFilename)
+{
+ /*
+ * Try to load the library.
+ */
+ RTLDRMOD hLib;
+ int rc = RTLdrLoad(pszFilename, &hLib);
+ if (RT_SUCCESS(rc))
+ {
+ RTLdrClose(hLib);
+ return true;
+ }
+ return false;
+}
+RT_EXPORT_SYMBOL(RTLdrIsLoadable);
+
diff --git a/src/VBox/Runtime/common/ldr/ldrPE.cpp b/src/VBox/Runtime/common/ldr/ldrPE.cpp
index ac047aa462f..2ddc73ebab3 100644
--- a/src/VBox/Runtime/common/ldr/ldrPE.cpp
+++ b/src/VBox/Runtime/common/ldr/ldrPE.cpp
@@ -32,12 +32,20 @@
#include <iprt/ldr.h>
#include "internal/iprt.h"
-#include <iprt/alloc.h>
#include <iprt/assert.h>
+#include <iprt/asm.h>
+#include <iprt/err.h>
#include <iprt/log.h>
+#include <iprt/md5.h>
+#include <iprt/mem.h>
#include <iprt/path.h>
+#include <iprt/sha.h>
#include <iprt/string.h>
-#include <iprt/err.h>
+#ifndef IPRT_WITHOUT_LDR_VERIFY
+# include <iprt/crypto/pkcs7.h>
+# include <iprt/crypto/spc.h>
+# include <iprt/crypto/x509.h>
+#endif
#include <iprt/formats/codeview.h>
#include "internal/ldrPE.h"
#include "internal/ldr.h"
@@ -53,6 +61,13 @@
*/
#define PE_RVA2TYPE(pvBits, rva, type) ((type) ((uintptr_t)pvBits + (uintptr_t)(rva)) )
+/** The max size of the security directory. */
+#ifdef IN_RING3
+# define RTLDRMODPE_MAX_SECURITY_DIR_SIZE _4M
+#else
+# define RTLDRMODPE_MAX_SECURITY_DIR_SIZE _1M
+#endif
+
/*******************************************************************************
* Structures and Typedefs *
@@ -91,6 +106,8 @@ typedef struct RTLDRMODPE
uint32_t cbHeaders;
/** The image timestamp. */
uint32_t uTimestamp;
+ /** Set if the image is 64-bit, clear if 32-bit. */
+ bool f64Bit;
/** The import data directory entry. */
IMAGE_DATA_DIRECTORY ImportDir;
/** The base relocation data directory entry. */
@@ -99,7 +116,20 @@ typedef struct RTLDRMODPE
IMAGE_DATA_DIRECTORY ExportDir;
/** The debug directory entry. */
IMAGE_DATA_DIRECTORY DebugDir;
-} RTLDRMODPE, *PRTLDRMODPE;
+ /** The security directory entry. */
+ IMAGE_DATA_DIRECTORY SecurityDir;
+
+ /** Offset of the first PKCS \#7 SignedData signature if present. */
+ uint32_t offPkcs7SignedData;
+ /** Size of the first PKCS \#7 SignedData. */
+ uint32_t cbPkcs7SignedData;
+
+ /** Copy of the optional header field DllCharacteristics. */
+ uint16_t fDllCharacteristics;
+} RTLDRMODPE;
+/** Pointer to the instance data for a PE loader module. */
+typedef RTLDRMODPE *PRTLDRMODPE;
+
/**
* PE Loader module operations.
@@ -131,6 +161,79 @@ typedef struct RTLDROPSPE
} RTLDROPSPE, *PRTLDROPSPE;
+/**
+ * PE hash context union.
+ */
+typedef union RTLDRPEHASHCTXUNION
+{
+ RTSHA512CONTEXT Sha512;
+ RTSHA256CONTEXT Sha256;
+ RTSHA1CONTEXT Sha1;
+ RTMD5CONTEXT Md5;
+} RTLDRPEHASHCTXUNION;
+/** Pointer to a PE hash context union. */
+typedef RTLDRPEHASHCTXUNION *PRTLDRPEHASHCTXUNION;
+
+
+/**
+ * PE hash digests
+ */
+typedef union RTLDRPEHASHRESUNION
+{
+ uint8_t abSha512[RTSHA512_HASH_SIZE];
+ uint8_t abSha256[RTSHA256_HASH_SIZE];
+ uint8_t abSha1[RTSHA1_HASH_SIZE];
+ uint8_t abMd5[RTMD5_HASH_SIZE];
+} RTLDRPEHASHRESUNION;
+/** Pointer to a PE hash work set. */
+typedef RTLDRPEHASHRESUNION *PRTLDRPEHASHRESUNION;
+
+/**
+ * Special places to watch out for when hashing a PE image.
+ */
+typedef struct RTLDRPEHASHSPECIALS
+{
+ uint32_t cbToHash;
+ uint32_t offCksum;
+ uint32_t cbCksum;
+ uint32_t offSecDir;
+ uint32_t cbSecDir;
+ uint32_t offEndSpecial;
+} RTLDRPEHASHSPECIALS;
+/** Pointer to the structure with the special hash places. */
+typedef RTLDRPEHASHSPECIALS *PRTLDRPEHASHSPECIALS;
+
+
+#ifndef IPRT_WITHOUT_LDR_VERIFY
+/**
+ * Parsed signature data.
+ */
+typedef struct RTLDRPESIGNATURE
+{
+ /** The outer content info wrapper. */
+ RTCRPKCS7CONTENTINFO ContentInfo;
+ /** Pointer to the decoded SignedData inside the ContentInfo member. */
+ PRTCRPKCS7SIGNEDDATA pSignedData;
+ /** Pointer to the indirect data content. */
+ PRTCRSPCINDIRECTDATACONTENT pIndData;
+ /** The digest type employed by the signature. */
+ RTDIGESTTYPE enmDigest;
+
+ /** Pointer to the raw signatures. This is allocated in the continuation of
+ * this structure to keep things simple. The size is given by the security
+ * export directory. */
+ WIN_CERTIFICATE const *pRawData;
+
+ /** Hash scratch data. */
+ RTLDRPEHASHCTXUNION HashCtx;
+ /** Hash result. */
+ RTLDRPEHASHRESUNION HashRes;
+} RTLDRPESIGNATURE;
+/** Pointed to SigneData parsing stat and output. */
+typedef RTLDRPESIGNATURE *PRTLDRPESIGNATURE;
+#endif
+
+
/*******************************************************************************
* Internal Functions *
*******************************************************************************/
@@ -250,7 +353,7 @@ static int rtldrPEReadPartByRva(PRTLDRMODPE pThis, const void *pvBits, uint32_t
if (cbToRead)
{
if ((RTFOFF)offFile + cbToRead > cbFile)
- cbToRead = cbFile - (RTFOFF)offFile;
+ cbToRead = (uint32_t)(cbFile - (RTFOFF)offFile);
int rc = pThis->Core.pReader->pfnRead(pThis->Core.pReader, pbMem, cbToRead, offFile);
if (RT_FAILURE(rc))
{
@@ -330,11 +433,11 @@ static int rtldrPEReadPart(PRTLDRMODPE pThis, const void *pvBits, RTFOFF offFile
{
if (uRva == NIL_RTLDRADDR || uRva > pThis->cbImage)
{
- if (offFile < 0)
+ if (offFile < 0 || offFile >= UINT32_MAX)
return VERR_INVALID_PARAMETER;
- return rtldrPEReadPartFromFile(pThis, offFile, cbMem, ppvMem);
+ return rtldrPEReadPartFromFile(pThis, (uint32_t)offFile, cbMem, ppvMem);
}
- return rtldrPEReadPartByRva(pThis, pvBits, uRva, cbMem, ppvMem);
+ return rtldrPEReadPartByRva(pThis, pvBits, (uint32_t)uRva, cbMem, ppvMem);
}
@@ -548,7 +651,7 @@ static DECLCALLBACK(int) rtldrPEResolveImports32(PRTLDRMODPE pModPe, const void
AssertMsgFailed(("bad import data thunk!\n"));
rc = VERR_BAD_EXE_FORMAT;
}
- pFirstThunk->u1.Function = Value;
+ pFirstThunk->u1.Function = (uint32_t)Value;
if (pFirstThunk->u1.Function != Value)
{
AssertMsgFailed(("external symbol address to big!\n"));
@@ -663,7 +766,8 @@ static int rtldrPEApplyFixups(PRTLDRMODPE pModPe, const void *pvBitsR, void *pvB
/* Some bound checking just to be sure it works... */
if ((uintptr_t)pbr - (uintptr_t)pBaseRelocs + pbr->SizeOfBlock > cbBaseRelocs)
- cRelocations = (((uintptr_t)pBaseRelocs + cbBaseRelocs) - (uintptr_t)pbr - sizeof(IMAGE_BASE_RELOCATION)) / sizeof(uint16_t);
+ cRelocations = (uint32_t)( (((uintptr_t)pBaseRelocs + cbBaseRelocs) - (uintptr_t)pbr - sizeof(IMAGE_BASE_RELOCATION))
+ / sizeof(uint16_t) );
/*
* Loop thru the fixups in this chunk.
@@ -691,7 +795,7 @@ static int rtldrPEApplyFixups(PRTLDRMODPE pModPe, const void *pvBitsR, void *pvB
switch (fType)
{
case IMAGE_REL_BASED_HIGHLOW: /* 32-bit, add delta. */
- *u.pu32 += uDelta;
+ *u.pu32 += (uint32_t)uDelta;
break;
case IMAGE_REL_BASED_DIR64: /* 64-bit, add delta. */
*u.pu64 += (RTINTPTR)uDelta;
@@ -716,7 +820,7 @@ static int rtldrPEApplyFixups(PRTLDRMODPE pModPe, const void *pvBitsR, void *pvB
cRelocations--;
pwoffFixup++;
int32_t i32 = (uint32_t)(*u.pu16 << 16) | *pwoffFixup;
- i32 += uDelta;
+ i32 += (uint32_t)uDelta;
i32 += 0x8000; //??
*u.pu16 = (uint16_t)(i32 >> 16);
break;
@@ -759,7 +863,8 @@ static int rtldrPEApplyFixups(PRTLDRMODPE pModPe, const void *pvBitsR, void *pvB
/** @copydoc RTLDROPS::pfnRelocate. */
-static int rtldrPERelocate(PRTLDRMODINTERNAL pMod, void *pvBits, RTUINTPTR NewBaseAddress, RTUINTPTR OldBaseAddress, PFNRTLDRIMPORT pfnGetImport, void *pvUser)
+static DECLCALLBACK(int) rtldrPERelocate(PRTLDRMODINTERNAL pMod, void *pvBits, RTUINTPTR NewBaseAddress, RTUINTPTR OldBaseAddress,
+ PFNRTLDRIMPORT pfnGetImport, void *pvUser)
{
PRTLDRMODPE pModPe = (PRTLDRMODPE)pMod;
@@ -925,7 +1030,7 @@ static int rtldrPEEnumSymbolsSlow(PRTLDRMODPE pThis, unsigned fFlags, RTUINTPTR
(void const **)&paOrdinals);
if (RT_SUCCESS(rc))
{
- uintptr_t uNamePrev = 0;
+ uint32_t uNamePrev = 0;
for (uint32_t uOrdinal = 0; uOrdinal < cOrdinals; uOrdinal++)
{
if (paAddress[uOrdinal] /* needed? */)
@@ -1062,7 +1167,7 @@ static DECLCALLBACK(int) rtldrPEEnumSymbols(PRTLDRMODINTERNAL pMod, unsigned fFl
uint32_t *paAddress = PE_RVA2TYPE(pvBits, pExpDir->AddressOfFunctions, uint32_t *);
uint32_t *paRVANames = PE_RVA2TYPE(pvBits, pExpDir->AddressOfNames, uint32_t *);
uint16_t *paOrdinals = PE_RVA2TYPE(pvBits, pExpDir->AddressOfNameOrdinals, uint16_t *);
- uintptr_t uNamePrev = 0;
+ uint32_t uNamePrev = 0;
unsigned cOrdinals = RT_MAX(pExpDir->NumberOfNames, pExpDir->NumberOfFunctions);
for (unsigned uOrdinal = 0; uOrdinal < cOrdinals; uOrdinal++)
{
@@ -1073,7 +1178,7 @@ static DECLCALLBACK(int) rtldrPEEnumSymbols(PRTLDRMODINTERNAL pMod, unsigned fFl
*/
const char *pszName = NULL;
/* Search from previous + 1 to the end. */
- unsigned uName = uNamePrev + 1;
+ uint32_t uName = uNamePrev + 1;
while (uName < pExpDir->NumberOfNames)
{
if (paOrdinals[uName] == uOrdinal)
@@ -1146,6 +1251,14 @@ static DECLCALLBACK(int) rtldrPE_EnumDbgInfo(PRTLDRMODINTERNAL pMod, const void
return VINF_SUCCESS;
/*
+ * Allocate temporary memory for a path buffer (this code is also compiled
+ * and maybe even used in stack starved environments).
+ */
+ char *pszPath = (char *)RTMemTmpAlloc(RTPATH_MAX);
+ if (!pszPath)
+ return VERR_NO_TMP_MEMORY;
+
+ /*
* Get the debug directory.
*/
if (!pvBits)
@@ -1155,7 +1268,10 @@ static DECLCALLBACK(int) rtldrPE_EnumDbgInfo(PRTLDRMODINTERNAL pMod, const void
int rcRet = rtldrPEReadPartByRva(pModPe, pvBits, pModPe->DebugDir.VirtualAddress, pModPe->DebugDir.Size,
(void const **)&paDbgDir);
if (RT_FAILURE(rcRet))
+ {
+ RTMemTmpFree(pszPath);
return rcRet;
+ }
/*
* Enumerate the debug directory.
@@ -1169,7 +1285,6 @@ static DECLCALLBACK(int) rtldrPE_EnumDbgInfo(PRTLDRMODINTERNAL pMod, const void
continue;
void const *pvPart = NULL;
- char szPath[RTPATH_MAX];
RTLDRDBGINFO DbgInfo;
RT_ZERO(DbgInfo.u);
DbgInfo.iDbgInfo = i;
@@ -1189,7 +1304,7 @@ static DECLCALLBACK(int) rtldrPE_EnumDbgInfo(PRTLDRMODINTERNAL pMod, const void
DbgInfo.u.Cv.uMajorVer = paDbgDir[i].MajorVersion;
DbgInfo.u.Cv.uMinorVer = paDbgDir[i].MinorVersion;
DbgInfo.u.Cv.uTimestamp = paDbgDir[i].TimeDateStamp;
- if ( paDbgDir[i].SizeOfData < sizeof(szPath)
+ if ( paDbgDir[i].SizeOfData < RTPATH_MAX
&& paDbgDir[i].SizeOfData > 16
&& ( DbgInfo.LinkAddress != NIL_RTLDRADDR
|| DbgInfo.offFile > 0)
@@ -1227,7 +1342,7 @@ static DECLCALLBACK(int) rtldrPE_EnumDbgInfo(PRTLDRMODINTERNAL pMod, const void
case IMAGE_DEBUG_TYPE_MISC:
DbgInfo.enmType = RTLDRDBGINFOTYPE_UNKNOWN;
- if ( paDbgDir[i].SizeOfData < sizeof(szPath)
+ if ( paDbgDir[i].SizeOfData < RTPATH_MAX
&& paDbgDir[i].SizeOfData > RT_UOFFSETOF(IMAGE_DEBUG_MISC, Data))
{
DbgInfo.enmType = RTLDRDBGINFOTYPE_CODEVIEW_DBG;
@@ -1248,12 +1363,11 @@ static DECLCALLBACK(int) rtldrPE_EnumDbgInfo(PRTLDRMODINTERNAL pMod, const void
DbgInfo.pszExtFile = (const char *)&pMisc->Data[0];
else
{
- char *pszPath = szPath;
rc = RTUtf16ToUtf8Ex((PCRTUTF16)&pMisc->Data[0],
(pMisc->Length - RT_OFFSETOF(IMAGE_DEBUG_MISC, Data)) / sizeof(RTUTF16),
- &pszPath, sizeof(szPath), NULL);
+ &pszPath, RTPATH_MAX, NULL);
if (RT_SUCCESS(rc))
- DbgInfo.pszExtFile = szPath;
+ DbgInfo.pszExtFile = pszPath;
else
rcRet = rc; /* continue without a filename. */
}
@@ -1282,12 +1396,11 @@ static DECLCALLBACK(int) rtldrPE_EnumDbgInfo(PRTLDRMODINTERNAL pMod, const void
(I don't think we know exactly which encoding this is anyway, as
it's probably the current ANSI/Windows code page for the process
generating the image anyways.) */
- if (DbgInfo.pszExtFile && DbgInfo.pszExtFile != szPath)
+ if (DbgInfo.pszExtFile && DbgInfo.pszExtFile != pszPath)
{
- char *pszPath = szPath;
rc = RTLatin1ToUtf8Ex(DbgInfo.pszExtFile,
paDbgDir[i].SizeOfData - ((uintptr_t)DbgInfo.pszExtFile - (uintptr_t)pvBits),
- &pszPath, sizeof(szPath), NULL);
+ &pszPath, RTPATH_MAX, NULL);
if (RT_FAILURE(rc))
{
rcRet = rc;
@@ -1295,7 +1408,7 @@ static DECLCALLBACK(int) rtldrPE_EnumDbgInfo(PRTLDRMODINTERNAL pMod, const void
}
}
if (DbgInfo.pszExtFile)
- RTPathChangeToUnixSlashes(szPath, true /*fForce*/);
+ RTPathChangeToUnixSlashes(pszPath, true /*fForce*/);
rc = pfnCallback(pMod, &DbgInfo, pvUser);
rtldrPEFreePart(pModPe, pvBits, pvPart);
@@ -1307,6 +1420,7 @@ static DECLCALLBACK(int) rtldrPE_EnumDbgInfo(PRTLDRMODINTERNAL pMod, const void
}
rtldrPEFreePart(pModPe, pvBits, paDbgDir);
+ RTMemTmpFree(pszPath);
return rcRet;
}
@@ -1490,18 +1604,45 @@ static DECLCALLBACK(int) rtldrPE_RvaToSegOffset(PRTLDRMODINTERNAL pMod, RTLDRADD
/** @interface_method_impl{RTLDROPS,pfnQueryProp} */
-static DECLCALLBACK(int) rtldrPE_QueryProp(PRTLDRMODINTERNAL pMod, RTLDRPROP enmProp, void *pvBuf, size_t cbBuf)
+static DECLCALLBACK(int) rtldrPE_QueryProp(PRTLDRMODINTERNAL pMod, RTLDRPROP enmProp, void *pvBuf, size_t cbBuf, size_t *pcbRet)
{
PRTLDRMODPE pModPe = (PRTLDRMODPE)pMod;
switch (enmProp)
{
case RTLDRPROP_TIMESTAMP_SECONDS:
+ Assert(*pcbRet == cbBuf);
if (cbBuf == sizeof(int32_t))
*(int32_t *)pvBuf = pModPe->uTimestamp;
else if (cbBuf == sizeof(int64_t))
*(int64_t *)pvBuf = pModPe->uTimestamp;
else
- return VERR_INVALID_PARAMETER;
+ AssertFailedReturn(VERR_INTERNAL_ERROR_3);
+ break;
+
+ case RTLDRPROP_IS_SIGNED:
+ Assert(cbBuf == sizeof(bool));
+ Assert(*pcbRet == cbBuf);
+ *(bool *)pvBuf = pModPe->offPkcs7SignedData != 0;
+ break;
+
+ case RTLDRPROP_PKCS7_SIGNED_DATA:
+ {
+ if (pModPe->cbPkcs7SignedData == 0)
+ return VERR_NOT_FOUND;
+ Assert(pModPe->offPkcs7SignedData > pModPe->SecurityDir.VirtualAddress);
+
+ *pcbRet = pModPe->cbPkcs7SignedData;
+ if (cbBuf < pModPe->cbPkcs7SignedData)
+ return VERR_BUFFER_OVERFLOW;
+ return pModPe->Core.pReader->pfnRead(pModPe->Core.pReader, pvBuf, pModPe->cbPkcs7SignedData,
+ pModPe->offPkcs7SignedData);
+ }
+
+ case RTLDRPROP_SIGNATURE_CHECKS_ENFORCED:
+ Assert(cbBuf == sizeof(bool));
+ Assert(*pcbRet == cbBuf);
+ *(bool *)pvBuf = pModPe->offPkcs7SignedData > 0
+ && (pModPe->fDllCharacteristics & IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY);
break;
default:
@@ -1511,6 +1652,806 @@ static DECLCALLBACK(int) rtldrPE_QueryProp(PRTLDRMODINTERNAL pMod, RTLDRPROP enm
}
+
+/*
+ * Lots of Authenticode fun ahead.
+ */
+
+
+/**
+ * Initializes the hash context.
+ *
+ * @returns VINF_SUCCESS or VERR_NOT_SUPPORTED.
+ * @param pHashCtx The hash context union.
+ * @param enmDigest The hash type we're calculating..
+ */
+static int rtLdrPE_HashInit(PRTLDRPEHASHCTXUNION pHashCtx, RTDIGESTTYPE enmDigest)
+{
+ switch (enmDigest)
+ {
+ case RTDIGESTTYPE_SHA512: RTSha512Init(&pHashCtx->Sha512); break;
+ case RTDIGESTTYPE_SHA256: RTSha256Init(&pHashCtx->Sha256); break;
+ case RTDIGESTTYPE_SHA1: RTSha1Init(&pHashCtx->Sha1); break;
+ case RTDIGESTTYPE_MD5: RTMd5Init(&pHashCtx->Md5); break;
+ default: AssertFailedReturn(VERR_NOT_SUPPORTED);
+ }
+ return VINF_SUCCESS;
+}
+
+
+/**
+ * Updates the hash with more data.
+ *
+ * @param pHashCtx The hash context union.
+ * @param enmDigest The hash type we're calculating..
+ * @param pvBuf Pointer to a buffer with bytes to add to thash.
+ * @param cbBuf How many bytes to add from @a pvBuf.
+ */
+static void rtLdrPE_HashUpdate(PRTLDRPEHASHCTXUNION pHashCtx, RTDIGESTTYPE enmDigest, void const *pvBuf, size_t cbBuf)
+{
+ switch (enmDigest)
+ {
+ case RTDIGESTTYPE_SHA512: RTSha512Update(&pHashCtx->Sha512, pvBuf, cbBuf); break;
+ case RTDIGESTTYPE_SHA256: RTSha256Update(&pHashCtx->Sha256, pvBuf, cbBuf); break;
+ case RTDIGESTTYPE_SHA1: RTSha1Update(&pHashCtx->Sha1, pvBuf, cbBuf); break;
+ case RTDIGESTTYPE_MD5: RTMd5Update(&pHashCtx->Md5, pvBuf, cbBuf); break;
+ default: AssertReleaseFailed();
+ }
+}
+
+
+/**
+ * Finalizes the hash calculations.
+ *
+ * @param pHashCtx The hash context union.
+ * @param enmDigest The hash type we're calculating..
+ * @param pHashRes The hash result union.
+ */
+static void rtLdrPE_HashFinalize(PRTLDRPEHASHCTXUNION pHashCtx, RTDIGESTTYPE enmDigest, PRTLDRPEHASHRESUNION pHashRes)
+{
+ switch (enmDigest)
+ {
+ case RTDIGESTTYPE_SHA512: RTSha512Final(&pHashCtx->Sha512, pHashRes->abSha512); break;
+ case RTDIGESTTYPE_SHA256: RTSha256Final(&pHashCtx->Sha256, pHashRes->abSha256); break;
+ case RTDIGESTTYPE_SHA1: RTSha1Final(&pHashCtx->Sha1, pHashRes->abSha1); break;
+ case RTDIGESTTYPE_MD5: RTMd5Final(pHashRes->abMd5, &pHashCtx->Md5); break;
+ default: AssertReleaseFailed();
+ }
+}
+
+
+/**
+ * Returns the digest size for the given digest type.
+ *
+ * @returns Size in bytes.
+ * @param enmDigest The hash type in question.
+ */
+static uint32_t rtLdrPE_HashGetHashSize(RTDIGESTTYPE enmDigest)
+{
+ switch (enmDigest)
+ {
+ case RTDIGESTTYPE_SHA512: return RTSHA512_HASH_SIZE;
+ case RTDIGESTTYPE_SHA256: return RTSHA256_HASH_SIZE;
+ case RTDIGESTTYPE_SHA1: return RTSHA1_HASH_SIZE;
+ case RTDIGESTTYPE_MD5: return RTMD5_HASH_SIZE;
+ default: AssertReleaseFailedReturn(0);
+ }
+}
+
+
+/**
+ * Calculate the special too watch out for when hashing the image.
+ *
+ * @returns IPRT status code.
+ * @param pModPe The PE module.
+ * @param pPlaces The structure where to store the special places.
+ * @param pErrInfo Optional error info.
+ */
+static int rtldrPe_CalcSpecialHashPlaces(PRTLDRMODPE pModPe, PRTLDRPEHASHSPECIALS pPlaces, PRTERRINFO pErrInfo)
+{
+ /*
+ * If we're here despite a missing signature, we need to get the file size.
+ */
+ pPlaces->cbToHash = pModPe->SecurityDir.VirtualAddress;
+ if (pPlaces->cbToHash == 0)
+ {
+ RTFOFF cbFile = pModPe->Core.pReader->pfnSize(pModPe->Core.pReader);
+ pPlaces->cbToHash = (uint32_t)cbFile;
+ if (pPlaces->cbToHash != (RTFOFF)cbFile)
+ return RTErrInfoSetF(pErrInfo, VERR_LDRVI_FILE_LENGTH_ERROR, "File is too large: %RTfoff", cbFile);
+ }
+
+ /*
+ * Calculate the special places.
+ */
+ pPlaces->offCksum = (uint32_t)pModPe->offNtHdrs
+ + (pModPe->f64Bit
+ ? RT_OFFSETOF(IMAGE_NT_HEADERS64, OptionalHeader.CheckSum)
+ : RT_OFFSETOF(IMAGE_NT_HEADERS32, OptionalHeader.CheckSum));
+ pPlaces->cbCksum = RT_SIZEOFMEMB(IMAGE_NT_HEADERS32, OptionalHeader.CheckSum);
+ pPlaces->offSecDir = (uint32_t)pModPe->offNtHdrs
+ + (pModPe->f64Bit
+ ? RT_OFFSETOF(IMAGE_NT_HEADERS64, OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_SECURITY])
+ : RT_OFFSETOF(IMAGE_NT_HEADERS32, OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_SECURITY]));
+ pPlaces->cbSecDir = sizeof(IMAGE_DATA_DIRECTORY);
+ pPlaces->offEndSpecial = pPlaces->offSecDir + pPlaces->cbSecDir;
+ return VINF_SUCCESS;
+}
+
+
+/**
+ * Calculates the whole image hash.
+ *
+ * The Authenticode_PE.docx version 1.0 explains how the hash is calculated,
+ * points 8 thru 14 are bogus. If you study them a little carefully, it is
+ * clear that the algorithm will only work if the raw data for the section have
+ * no gaps between them or in front of them. So, this elaborate section sorting
+ * by PointerToRawData and working them section by section could simply be
+ * replaced by one point:
+ *
+ * 8. Add all the file content between SizeOfHeaders and the
+ * attribute certificate table to the hash. Then finalize
+ * the hash.
+ *
+ * Not sure if Microsoft is screwing with us on purpose here or whether they
+ * assigned some of this work to less talented engineers and tech writers. I
+ * love fact that they say it's "simplified" and should yield the correct hash
+ * for "almost all" files. Stupid, Stupid, Microsofties!!
+ *
+ * My simplified implementation that just hashes the entire file up to the
+ * signature or end of the file produces the same SHA1 values as "signtool
+ * verify /v" does both for edited executables with gaps between/before/after
+ * sections raw data and normal executables without any gaps.
+ *
+ * @returns IPRT status code.
+ * @param pModPe The PE module.
+ * @param pvScratch Scratch buffer.
+ * @param cbScratch Size of the scratch buffer.
+ * @param enmDigest The hash digest type we're calculating.
+ * @param pHashCtx Hash context scratch area.
+ * @param pHashRes Hash result buffer.
+ * @param pErrInfo Optional error info buffer.
+ */
+static int rtldrPE_HashImageCommon(PRTLDRMODPE pModPe, void *pvScratch, uint32_t cbScratch, RTDIGESTTYPE enmDigest,
+ PRTLDRPEHASHCTXUNION pHashCtx, PRTLDRPEHASHRESUNION pHashRes, PRTERRINFO pErrInfo)
+{
+ int rc = rtLdrPE_HashInit(pHashCtx, enmDigest);
+ if (RT_FAILURE(rc))
+ return rc;
+
+ /*
+ * Calculate the special places.
+ */
+ RTLDRPEHASHSPECIALS SpecialPlaces;
+ rc = rtldrPe_CalcSpecialHashPlaces(pModPe, &SpecialPlaces, pErrInfo);
+ if (RT_FAILURE(rc))
+ return rc;
+
+ /*
+ * Work our way thru the image data.
+ */
+ uint32_t off = 0;
+ while (off < SpecialPlaces.cbToHash)
+ {
+ uint32_t cbRead = RT_MIN(SpecialPlaces.cbToHash - off, cbScratch);
+ uint8_t *pbCur = (uint8_t *)pvScratch;
+ rc = pModPe->Core.pReader->pfnRead(pModPe->Core.pReader, pbCur, cbRead, off);
+ if (RT_FAILURE(rc))
+ return RTErrInfoSetF(pErrInfo, VERR_LDRVI_READ_ERROR_HASH, "Hash read error at %#x: %Rrc (cbRead=%#zx)",
+ off, rc, cbRead);
+
+ if (off < SpecialPlaces.offEndSpecial)
+ {
+ if (off < SpecialPlaces.offCksum)
+ {
+ /* Hash everything up to the checksum. */
+ uint32_t cbChunk = RT_MIN(SpecialPlaces.offCksum - off, cbRead);
+ rtLdrPE_HashUpdate(pHashCtx, enmDigest, pbCur, cbChunk);
+ pbCur += cbChunk;
+ cbRead -= cbChunk;
+ off += cbChunk;
+ }
+
+ if (off < SpecialPlaces.offCksum + SpecialPlaces.cbCksum && off >= SpecialPlaces.offCksum)
+ {
+ /* Skip the checksum */
+ uint32_t cbChunk = RT_MIN(SpecialPlaces.offCksum + SpecialPlaces.cbCksum - off, cbRead);
+ pbCur += cbChunk;
+ cbRead -= cbChunk;
+ off += cbChunk;
+ }
+
+ if (off < SpecialPlaces.offSecDir && off >= SpecialPlaces.offCksum + SpecialPlaces.cbCksum)
+ {
+ /* Hash everything between the checksum and the data dir entry. */
+ uint32_t cbChunk = RT_MIN(SpecialPlaces.offSecDir - off, cbRead);
+ rtLdrPE_HashUpdate(pHashCtx, enmDigest, pbCur, cbChunk);
+ pbCur += cbChunk;
+ cbRead -= cbChunk;
+ off += cbChunk;
+ }
+
+ if (off < SpecialPlaces.offSecDir + SpecialPlaces.cbSecDir && off >= SpecialPlaces.offSecDir)
+ {
+ /* Skip the security data directory entry. */
+ uint32_t cbChunk = RT_MIN(SpecialPlaces.offSecDir + SpecialPlaces.cbSecDir - off, cbRead);
+ pbCur += cbChunk;
+ cbRead -= cbChunk;
+ off += cbChunk;
+ }
+ }
+
+ rtLdrPE_HashUpdate(pHashCtx, enmDigest, pbCur, cbRead);
+
+ /* Advance */
+ off += cbRead;
+ }
+
+ /*
+ * If there isn't a signature, experiments with signtool indicates that we
+ * have to zero padd the file size until it's a multiple of 8. (This is
+ * most likely to give 64-bit values in the certificate a natural alignment
+ * when memory mapped.)
+ */
+ if ( pModPe->SecurityDir.Size != SpecialPlaces.cbToHash
+ && SpecialPlaces.cbToHash != RT_ALIGN_32(SpecialPlaces.cbToHash, WIN_CERTIFICATE_ALIGNMENT))
+ {
+ static const uint8_t s_abZeros[WIN_CERTIFICATE_ALIGNMENT] = { 0,0,0,0, 0,0,0,0 };
+ rtLdrPE_HashUpdate(pHashCtx, enmDigest, s_abZeros,
+ RT_ALIGN_32(SpecialPlaces.cbToHash, WIN_CERTIFICATE_ALIGNMENT) - SpecialPlaces.cbToHash);
+ }
+
+ /*
+ * Done. Finalize the hashes.
+ */
+ rtLdrPE_HashFinalize(pHashCtx, enmDigest, pHashRes);
+ return VINF_SUCCESS;
+}
+
+#ifndef IPRT_WITHOUT_LDR_VERIFY
+
+/**
+ * Verifies image preconditions not checked by the open validation code.
+ *
+ * @returns IPRT status code.
+ * @param pModPe The PE module.
+ * @param pErrInfo Optional error info buffer.
+ */
+static int rtldrPE_VerifySignatureImagePrecoditions(PRTLDRMODPE pModPe, PRTERRINFO pErrInfo)
+{
+ /*
+ * Validate the sections. While doing so, track the amount of section raw
+ * section data in the file so we can use this to validate the signature
+ * table location later.
+ */
+ uint32_t offNext = pModPe->cbHeaders; /* same */
+ for (uint32_t i = 0; i < pModPe->cSections; i++)
+ if (pModPe->paSections[i].SizeOfRawData > 0)
+ {
+ uint64_t offEnd = (uint64_t)pModPe->paSections[i].PointerToRawData + pModPe->paSections[i].SizeOfRawData;
+ if (offEnd > offNext)
+ {
+ if (offEnd >= _2G)
+ return RTErrInfoSetF(pErrInfo, VERR_LDRVI_SECTION_RAW_DATA_VALUES,
+ "Section %#u specifies file data after 2GB: PointerToRawData=%#x SizeOfRawData=%#x",
+ i, pModPe->paSections[i].PointerToRawData, pModPe->paSections[i].SizeOfRawData);
+ offNext = (uint32_t)offEnd;
+ }
+ }
+ uint32_t offEndOfSectionData = offNext;
+
+ /*
+ * Validate the signature.
+ */
+ if (!pModPe->SecurityDir.Size)
+ return RTErrInfoSet(pErrInfo, VERR_LDRVI_NOT_SIGNED, "Not signed.");
+
+ uint32_t const offSignature = pModPe->SecurityDir.VirtualAddress;
+ uint32_t const cbSignature = pModPe->SecurityDir.Size;
+ if ( cbSignature <= sizeof(WIN_CERTIFICATE)
+ || cbSignature >= RTLDRMODPE_MAX_SECURITY_DIR_SIZE
+ || offSignature >= _2G)
+ return RTErrInfoSetF(pErrInfo, VERR_LDRVI_INVALID_SECURITY_DIR_ENTRY,
+ "Invalid security data dir entry: cb=%#x off=%#x", cbSignature, offSignature);
+
+ if (offSignature < offEndOfSectionData)
+ return RTErrInfoSetF(pErrInfo, VERR_LDRVI_INVALID_SECURITY_DIR_ENTRY,
+ "Invalid security data dir entry offset: %#x offEndOfSectionData=%#x",
+ offSignature, offEndOfSectionData);
+
+ if (RT_ALIGN_32(offSignature, WIN_CERTIFICATE_ALIGNMENT) != offSignature)
+ return RTErrInfoSetF(pErrInfo, VERR_LDRVI_INVALID_SECURITY_DIR_ENTRY,
+ "Misaligned security dir entry offset: %#x (alignment=%#x)",
+ offSignature, WIN_CERTIFICATE_ALIGNMENT);
+
+
+ return VINF_SUCCESS;
+}
+
+
+/**
+ * Reads and checks the raw signature data.
+ *
+ * @returns IPRT status code.
+ * @param pModPe The PE module.
+ * @param ppSignature Where to return the pointer to the parsed
+ * signature data. Pass to
+ * rtldrPE_VerifySignatureDestroy when done.
+ * @param pErrInfo Optional error info buffer.
+ */
+static int rtldrPE_VerifySignatureRead(PRTLDRMODPE pModPe, PRTLDRPESIGNATURE *ppSignature, PRTERRINFO pErrInfo)
+{
+ *ppSignature = NULL;
+ AssertReturn(pModPe->SecurityDir.Size > 0, VERR_INTERNAL_ERROR_2);
+
+ /*
+ * Allocate memory for reading and parsing it.
+ */
+ if (pModPe->SecurityDir.Size >= RTLDRMODPE_MAX_SECURITY_DIR_SIZE)
+ return RTErrInfoSetF(pErrInfo, VERR_LDRVI_INVALID_SECURITY_DIR_ENTRY,
+ "Signature directory is to large: %#x", pModPe->SecurityDir.Size);
+
+ PRTLDRPESIGNATURE pSignature = (PRTLDRPESIGNATURE)RTMemTmpAllocZ(sizeof(*pSignature) + 64 + pModPe->SecurityDir.Size);
+ if (!pSignature)
+ return RTErrInfoSetF(pErrInfo, VERR_LDRVI_NO_MEMORY_SIGNATURE, "Failed to allocate %zu bytes",
+ sizeof(*pSignature) + 64 + pModPe->SecurityDir.Size);
+ pSignature->pRawData = RT_ALIGN_PT(pSignature + 1, 64, WIN_CERTIFICATE const *);
+
+
+ /*
+ * Read it.
+ */
+ int rc = pModPe->Core.pReader->pfnRead(pModPe->Core.pReader, (void *)pSignature->pRawData,
+ pModPe->SecurityDir.Size, pModPe->SecurityDir.VirtualAddress);
+ if (RT_SUCCESS(rc))
+ {
+ /*
+ * Check the table we've read in.
+ */
+ uint32_t cbLeft = pModPe->SecurityDir.Size;
+ WIN_CERTIFICATE const *pEntry = pSignature->pRawData;
+ for (;;)
+ {
+ if ( cbLeft < sizeof(*pEntry)
+ || pEntry->dwLength > cbLeft
+ || pEntry->dwLength < sizeof(*pEntry))
+ rc = RTErrInfoSetF(pErrInfo, VERR_LDRVI_BAD_CERT_HDR_LENGTH,
+ "Bad WIN_CERTIFICATE length: %#x (max %#x, signature=%u)",
+ pEntry->dwLength, cbLeft, 0);
+ else if (pEntry->wRevision != WIN_CERT_REVISION_2_0)
+ rc = RTErrInfoSetF(pErrInfo, VERR_LDRVI_BAD_CERT_HDR_REVISION,
+ "Unsupported WIN_CERTIFICATE revision value: %#x (signature=%u)",
+ pEntry->wRevision, 0);
+ else if (pEntry->wCertificateType != WIN_CERT_TYPE_PKCS_SIGNED_DATA)
+ rc = RTErrInfoSetF(pErrInfo, VERR_LDRVI_BAD_CERT_HDR_TYPE,
+ "Unsupported WIN_CERTIFICATE certificate type: %#x (signature=%u)",
+ pEntry->wCertificateType, 0);
+ else
+ {
+ /* advance */
+ uint32_t cbEntry = RT_ALIGN(pEntry->dwLength, WIN_CERTIFICATE_ALIGNMENT);
+ if (cbEntry >= cbLeft)
+ break;
+ cbLeft -= cbEntry;
+ pEntry = (WIN_CERTIFICATE *)((uintptr_t)pEntry + cbEntry);
+
+ /* For now, only one entry is supported. */
+ rc = RTErrInfoSet(pErrInfo, VERR_LDRVI_BAD_CERT_MULTIPLE, "Multiple WIN_CERTIFICATE entries are not supported.");
+ }
+ break;
+ }
+ if (RT_SUCCESS(rc))
+ {
+ *ppSignature = pSignature;
+ return VINF_SUCCESS;
+ }
+ }
+ else
+ rc = RTErrInfoSetF(pErrInfo, VERR_LDRVI_READ_ERROR_SIGNATURE, "Signature read error: %Rrc", rc);
+ RTMemTmpFree(pSignature);
+ return rc;
+}
+
+
+/**
+ * Destroys the parsed signature.
+ *
+ * @param pModPe The PE module.
+ * @param pSignature The signature data to destroy.
+ */
+static void rtldrPE_VerifySignatureDestroy(PRTLDRMODPE pModPe, PRTLDRPESIGNATURE pSignature)
+{
+ RTCrPkcs7ContentInfo_Delete(&pSignature->ContentInfo);
+ RTMemTmpFree(pSignature);
+}
+
+
+/**
+ * Decodes the raw signature.
+ *
+ * @returns IPRT status code.
+ * @param pModPe The PE module.
+ * @param pSignature The signature data.
+ * @param pErrInfo Optional error info buffer.
+ */
+static int rtldrPE_VerifySignatureDecode(PRTLDRMODPE pModPe, PRTLDRPESIGNATURE pSignature, PRTERRINFO pErrInfo)
+{
+ WIN_CERTIFICATE const *pEntry = pSignature->pRawData;
+ AssertReturn(pEntry->wCertificateType == WIN_CERT_TYPE_PKCS_SIGNED_DATA, VERR_INTERNAL_ERROR_2);
+ AssertReturn(pEntry->wRevision == WIN_CERT_REVISION_2_0, VERR_INTERNAL_ERROR_2);
+
+ RTASN1CURSORPRIMARY PrimaryCursor;
+ RTAsn1CursorInitPrimary(&PrimaryCursor,
+ &pEntry->bCertificate[0],
+ pEntry->dwLength - RT_OFFSETOF(WIN_CERTIFICATE, bCertificate),
+ pErrInfo,
+ &g_RTAsn1DefaultAllocator,
+ 0,
+ "WinCert");
+
+ int rc = RTCrPkcs7ContentInfo_DecodeAsn1(&PrimaryCursor.Cursor, 0, &pSignature->ContentInfo, "CI");
+ if (RT_SUCCESS(rc))
+ {
+ if (RTCrPkcs7ContentInfo_IsSignedData(&pSignature->ContentInfo))
+ {
+ pSignature->pSignedData = pSignature->ContentInfo.u.pSignedData;
+
+ /*
+ * Decode the authenticode bits.
+ */
+ if (!strcmp(pSignature->pSignedData->ContentInfo.ContentType.szObjId, RTCRSPCINDIRECTDATACONTENT_OID))
+ {
+ pSignature->pIndData = pSignature->pSignedData->ContentInfo.u.pIndirectDataContent;
+ Assert(pSignature->pIndData);
+
+ /*
+ * Check that things add up.
+ */
+ if (RT_SUCCESS(rc))
+ rc = RTCrPkcs7SignedData_CheckSanity(pSignature->pSignedData,
+ RTCRPKCS7SIGNEDDATA_SANITY_F_AUTHENTICODE
+ | RTCRPKCS7SIGNEDDATA_SANITY_F_ONLY_KNOWN_HASH
+ | RTCRPKCS7SIGNEDDATA_SANITY_F_SIGNING_CERT_PRESENT,
+ pErrInfo, "SD");
+ if (RT_SUCCESS(rc))
+ rc = RTCrSpcIndirectDataContent_CheckSanityEx(pSignature->pIndData,
+ pSignature->pSignedData,
+ RTCRSPCINDIRECTDATACONTENT_SANITY_F_ONLY_KNOWN_HASH,
+ pErrInfo);
+ if (RT_SUCCESS(rc))
+ {
+ PCRTCRX509ALGORITHMIDENTIFIER pDigestAlgorithm = &pSignature->pIndData->DigestInfo.DigestAlgorithm;
+ pSignature->enmDigest = RTCrX509AlgorithmIdentifier_QueryDigestType(pDigestAlgorithm);
+ AssertReturn(pSignature->enmDigest != RTDIGESTTYPE_INVALID, VERR_INTERNAL_ERROR_4); /* Checked above! */
+ }
+ }
+ else
+ rc = RTErrInfoSetF(pErrInfo, VERR_LDRVI_EXPECTED_INDIRECT_DATA_CONTENT_OID,
+ "Unknown pSignedData.ContentInfo.ContentType.szObjId value: %s (expected %s)",
+ pSignature->pSignedData->ContentInfo.ContentType.szObjId, RTCRSPCINDIRECTDATACONTENT_OID);
+ }
+ }
+ return rc;
+}
+
+
+static int rtldrPE_VerifyAllPageHashesV2(PRTLDRMODPE pModPe, PCRTCRSPCSERIALIZEDOBJECTATTRIBUTE pAttrib, RTDIGESTTYPE enmDigest,
+ void *pvScratch, size_t cbScratch, PRTERRINFO pErrInfo)
+{
+ AssertReturn(cbScratch >= _4K, VERR_INTERNAL_ERROR_3);
+
+ /*
+ * Calculate the special places.
+ */
+ RTLDRPEHASHSPECIALS SpecialPlaces;
+ int rc = rtldrPe_CalcSpecialHashPlaces(pModPe, &SpecialPlaces, pErrInfo);
+ if (RT_FAILURE(rc))
+ return rc;
+
+ uint32_t const cbHash = rtLdrPE_HashGetHashSize(enmDigest);
+ uint32_t const cPages = pAttrib->u.pPageHashesV2->RawData.Asn1Core.cb / (cbHash + 4);
+ if (cPages * (cbHash + 4) != pAttrib->u.pPageHashesV2->RawData.Asn1Core.cb)
+ return RTErrInfoSetF(pErrInfo, VERR_LDRVI_PAGE_HASH_TAB_SIZE_OVERFLOW,
+ "Page Hashes V2 size issue: cb=%#x cbHash=%#x",
+ pAttrib->u.pPageHashesV2->RawData.Asn1Core.cb, cbHash);
+
+ /*
+ * Walk the table.
+ */
+ uint32_t const cbScratchReadMax = cbScratch & ~(uint32_t)(_4K - 1);
+ uint32_t cbScratchRead = 0;
+ uint32_t offScratchRead = 0;
+
+ uint32_t offPrev = 0;
+ uint32_t offSectEnd = pModPe->cbHeaders;
+ uint32_t iSh = UINT32_MAX;
+ uint8_t const *pbHashTab = pAttrib->u.pPageHashesV2->RawData.Asn1Core.uData.pu8;
+ for (uint32_t iPage = 0; iPage < cPages; iPage++)
+ {
+ /* Decode the page offset. */
+ uint32_t const offFile = RT_MAKE_U32_FROM_U8(pbHashTab[0], pbHashTab[1], pbHashTab[2], pbHashTab[3]);
+ if (offFile >= SpecialPlaces.cbToHash)
+ {
+ /* The last entry is zero. */
+ if ( offFile == SpecialPlaces.cbToHash
+ && iPage + 1 == cPages
+ && ASMMemIsAll8(pbHashTab + 4, cbHash, 0) == NULL)
+ return VINF_SUCCESS;
+ return RTErrInfoSetF(pErrInfo, VERR_LDRVI_PAGE_HASH_TAB_TOO_LONG,
+ "Page hash entry #%u is beyond the signature table start: %#x, %#x",
+ iPage, offFile, SpecialPlaces.cbToHash);
+ }
+ if (offFile < offPrev)
+ return RTErrInfoSetF(pErrInfo, VERR_LDRVI_PAGE_HASH_TAB_NOT_STRICTLY_SORTED,
+ "Page hash table is not strictly sorted: entry #%u @%#x, previous @%#x\n",
+ iPage, offFile, offPrev);
+
+ /* Figure out how much to read and how much to zero. Need keep track
+ of the on-disk section boundraries. */
+ if (offFile >= offSectEnd)
+ {
+ iSh++;
+ if ( iSh < pModPe->cSections
+ && offFile - pModPe->paSections[iSh].PointerToRawData < pModPe->paSections[iSh].SizeOfRawData)
+ offSectEnd = pModPe->paSections[iSh].PointerToRawData + pModPe->paSections[iSh].SizeOfRawData;
+ else
+ {
+ iSh = 0;
+ while ( iSh < pModPe->cSections
+ && offFile - pModPe->paSections[iSh].PointerToRawData >= pModPe->paSections[iSh].SizeOfRawData)
+ iSh++;
+ if (iSh < pModPe->cSections)
+ offSectEnd = pModPe->paSections[iSh].PointerToRawData + pModPe->paSections[iSh].SizeOfRawData;
+ else
+ return RTErrInfoSetF(pErrInfo, VERR_PAGE_HASH_TAB_HASHES_NON_SECTION_DATA,
+ "Page hash entry #%u isn't in any section: %#x", iPage, offFile);
+ }
+ }
+
+ uint32_t cbRead = _4K;
+ if (offFile + cbRead > offSectEnd)
+ cbRead = offSectEnd - offFile;
+
+ if (offFile + cbRead > SpecialPlaces.cbToHash)
+ cbRead = SpecialPlaces.cbToHash - offFile;
+
+ /* Did we get a cache hit? */
+ uint8_t *pbCur = (uint8_t *)pvScratch;
+ if ( offFile + cbRead <= offScratchRead + cbScratchRead
+ && offFile >= offScratchRead)
+ pbCur += offFile - offScratchRead;
+ /* Missed, read more. */
+ else
+ {
+ offScratchRead = offFile;
+ cbScratchRead = offSectEnd - offFile;
+ if (cbScratchRead > cbScratchReadMax)
+ cbScratchRead = cbScratchReadMax;
+ rc = pModPe->Core.pReader->pfnRead(pModPe->Core.pReader, pbCur, cbScratchRead, offScratchRead);
+ if (RT_FAILURE(rc))
+ return RTErrInfoSetF(pErrInfo, VERR_LDRVI_READ_ERROR_HASH,
+ "Page hash read error at %#x: %Rrc (cbScratchRead=%#zx)",
+ offScratchRead, rc, cbScratchRead);
+ }
+
+ /* Zero any additional bytes in the page. */
+ if (cbRead != _4K)
+ memset(pbCur + cbRead, 0, _4K - cbRead);
+
+ /*
+ * Hash it.
+ */
+ RTLDRPEHASHCTXUNION HashCtx;
+ rc = rtLdrPE_HashInit(&HashCtx, enmDigest);
+ AssertRCReturn(rc, rc);
+
+ /* Deal with special places. */
+ uint32_t cbLeft = _4K;
+ if (offFile < SpecialPlaces.offEndSpecial)
+ {
+ uint32_t off = offFile;
+ if (off < SpecialPlaces.offCksum)
+ {
+ /* Hash everything up to the checksum. */
+ uint32_t cbChunk = RT_MIN(SpecialPlaces.offCksum - off, cbLeft);
+ rtLdrPE_HashUpdate(&HashCtx, enmDigest, pbCur, cbChunk);
+ pbCur += cbChunk;
+ cbLeft -= cbChunk;
+ off += cbChunk;
+ }
+
+ if (off < SpecialPlaces.offCksum + SpecialPlaces.cbCksum && off >= SpecialPlaces.offCksum)
+ {
+ /* Skip the checksum */
+ uint32_t cbChunk = RT_MIN(SpecialPlaces.offCksum + SpecialPlaces.cbCksum - off, cbLeft);
+ pbCur += cbChunk;
+ cbLeft -= cbChunk;
+ off += cbChunk;
+ }
+
+ if (off < SpecialPlaces.offSecDir && off >= SpecialPlaces.offCksum + SpecialPlaces.cbCksum)
+ {
+ /* Hash everything between the checksum and the data dir entry. */
+ uint32_t cbChunk = RT_MIN(SpecialPlaces.offSecDir - off, cbLeft);
+ rtLdrPE_HashUpdate(&HashCtx, enmDigest, pbCur, cbChunk);
+ pbCur += cbChunk;
+ cbLeft -= cbChunk;
+ off += cbChunk;
+ }
+
+ if (off < SpecialPlaces.offSecDir + SpecialPlaces.cbSecDir && off >= SpecialPlaces.offSecDir)
+ {
+ /* Skip the security data directory entry. */
+ uint32_t cbChunk = RT_MIN(SpecialPlaces.offSecDir + SpecialPlaces.cbSecDir - off, cbLeft);
+ pbCur += cbChunk;
+ cbLeft -= cbChunk;
+ off += cbChunk;
+ }
+ }
+
+ rtLdrPE_HashUpdate(&HashCtx, enmDigest, pbCur, cbLeft);
+
+ /*
+ * Finish the hash calculation and compare the result.
+ */
+ RTLDRPEHASHRESUNION HashRes;
+ rtLdrPE_HashFinalize(&HashCtx, enmDigest, &HashRes);
+
+ pbHashTab += 4;
+ if (memcmp(pbHashTab, &HashRes, cbHash) != 0)
+ return RTErrInfoSetF(pErrInfo, VERR_LDRVI_PAGE_HASH_MISMATCH,
+ "Page hash v2 failed for page #%u, @%#x, %#x bytes: %.*Rhxs != %.*Rhxs",
+ iPage, offFile, cbRead, (size_t)cbHash, pbHashTab, (size_t)cbHash, &HashRes);
+ pbHashTab += cbHash;
+ offPrev = offFile;
+ }
+
+ return VINF_SUCCESS;
+}
+
+
+/**
+ * Validates the image hash, including page hashes if present.
+ *
+ * @returns IPRT status code.
+ * @param pModPe The PE module.
+ * @param pSignature The decoded signature data.
+ * @param pErrInfo Optional error info buffer.
+ */
+static int rtldrPE_VerifySignatureValidateHash(PRTLDRMODPE pModPe, PRTLDRPESIGNATURE pSignature, PRTERRINFO pErrInfo)
+{
+ AssertReturn(pSignature->enmDigest > RTDIGESTTYPE_INVALID && pSignature->enmDigest < RTDIGESTTYPE_END, VERR_INTERNAL_ERROR_4);
+ AssertPtrReturn(pSignature->pIndData, VERR_INTERNAL_ERROR_5);
+ AssertReturn(RTASN1CORE_IS_PRESENT(&pSignature->pIndData->DigestInfo.Digest.Asn1Core), VERR_INTERNAL_ERROR_5);
+ AssertPtrReturn(pSignature->pIndData->DigestInfo.Digest.Asn1Core.uData.pv, VERR_INTERNAL_ERROR_5);
+
+ uint32_t const cbHash = rtLdrPE_HashGetHashSize(pSignature->enmDigest);
+ AssertReturn(pSignature->pIndData->DigestInfo.Digest.Asn1Core.cb == cbHash, VERR_INTERNAL_ERROR_5);
+
+ /*
+ * Allocate a temporary memory buffer.
+ */
+#ifdef IN_RING0
+ uint32_t cbScratch = _256K;
+#else
+ uint32_t cbScratch = _1M;
+#endif
+ void *pvScratch = RTMemTmpAlloc(cbScratch);
+ if (!pvScratch)
+ {
+ cbScratch = _4K;
+ pvScratch = RTMemTmpAlloc(cbScratch);
+ if (!pvScratch)
+ return RTErrInfoSet(pErrInfo, VERR_NO_TMP_MEMORY, "Failed to allocate 4KB of scratch space for hashing image.");
+ }
+
+ /*
+ * Calculate and compare the full image hash.
+ */
+ int rc = rtldrPE_HashImageCommon(pModPe, pvScratch, cbScratch, pSignature->enmDigest,
+ &pSignature->HashCtx, &pSignature->HashRes, pErrInfo);
+ if (RT_SUCCESS(rc))
+ {
+ if (!memcmp(&pSignature->HashRes, pSignature->pIndData->DigestInfo.Digest.Asn1Core.uData.pv, cbHash))
+ {
+ /*
+ * Compare the page hashes if present.
+ */
+ PCRTCRSPCSERIALIZEDOBJECTATTRIBUTE pAttrib = RTCrSpcIndirectDataContent_GetPeImageHashesV2(pSignature->pIndData);
+ if (pAttrib)
+ rc = rtldrPE_VerifyAllPageHashesV2(pModPe, pAttrib, pSignature->enmDigest, pvScratch, cbScratch, pErrInfo);
+
+ return rc;
+ }
+ rc = RTErrInfoSetF(pErrInfo, VERR_LDRVI_IMAGE_HASH_MISMATCH,
+ "Full image signature mismatch: %.*Rhxs, expected %.*Rhxs",
+ cbHash, &pSignature->HashRes,
+ cbHash, pSignature->pIndData->DigestInfo.Digest.Asn1Core.uData.pv);
+ }
+
+ RTMemTmpFree(pvScratch);
+ return rc;
+}
+
+#endif /* !IPRT_WITHOUT_LDR_VERIFY */
+
+
+/** @interface_method_impl{RTLDROPS,pfnVerifySignature} */
+static DECLCALLBACK(int) rtldrPE_VerifySignature(PRTLDRMODINTERNAL pMod, PFNRTLDRVALIDATESIGNEDDATA pfnCallback, void *pvUser,
+ PRTERRINFO pErrInfo)
+{
+#ifndef IPRT_WITHOUT_LDR_VERIFY
+ PRTLDRMODPE pModPe = (PRTLDRMODPE)pMod;
+
+ int rc = rtldrPE_VerifySignatureImagePrecoditions(pModPe, pErrInfo);
+ if (RT_SUCCESS(rc))
+ {
+ PRTLDRPESIGNATURE pSignature = NULL;
+ rc = rtldrPE_VerifySignatureRead(pModPe, &pSignature, pErrInfo);
+ if (RT_SUCCESS(rc))
+ {
+ rc = rtldrPE_VerifySignatureDecode(pModPe, pSignature, pErrInfo);
+ if (RT_SUCCESS(rc))
+ rc = rtldrPE_VerifySignatureValidateHash(pModPe, pSignature, pErrInfo);
+ if (RT_SUCCESS(rc))
+ {
+ rc = pfnCallback(&pModPe->Core, RTLDRSIGNATURETYPE_PKCS7_SIGNED_DATA,
+ &pSignature->ContentInfo, sizeof(pSignature->ContentInfo),
+ pErrInfo, pvUser);
+ }
+ rtldrPE_VerifySignatureDestroy(pModPe, pSignature);
+ }
+ }
+ return rc;
+#else
+ return VERR_NOT_SUPPORTED;
+#endif
+}
+
+
+
+/** @interface_method_impl{RTLDROPS,pfnHashImage} */
+static DECLCALLBACK(int) rtldrPE_HashImage(PRTLDRMODINTERNAL pMod, RTDIGESTTYPE enmDigest, char *pszDigest, size_t cbDigest)
+{
+ PRTLDRMODPE pModPe = (PRTLDRMODPE)pMod;
+
+ /*
+ * Allocate a temporary memory buffer.
+ */
+ uint32_t cbScratch = _16K;
+ void *pvScratch = RTMemTmpAlloc(cbScratch);
+ if (!pvScratch)
+ {
+ cbScratch = _4K;
+ pvScratch = RTMemTmpAlloc(cbScratch);
+ if (!pvScratch)
+ return VERR_NO_TMP_MEMORY;
+ }
+
+ /*
+ * Do the hashing.
+ */
+ RTLDRPEHASHCTXUNION HashCtx;
+ RTLDRPEHASHRESUNION HashRes;
+ int rc = rtldrPE_HashImageCommon(pModPe, pvScratch, cbScratch, enmDigest, &HashCtx, &HashRes, NULL);
+ if (RT_SUCCESS(rc))
+ {
+ /*
+ * Format the digest into as human readable hash string.
+ */
+ switch (enmDigest)
+ {
+ case RTDIGESTTYPE_SHA512: rc = RTSha512ToString(HashRes.abSha512, pszDigest, cbDigest); break;
+ case RTDIGESTTYPE_SHA256: rc = RTSha256ToString(HashRes.abSha256, pszDigest, cbDigest); break;
+ case RTDIGESTTYPE_SHA1: rc = RTSha1ToString(HashRes.abSha1, pszDigest, cbDigest); break;
+ case RTDIGESTTYPE_MD5: rc = RTMd5ToString(HashRes.abMd5, pszDigest, cbDigest); break;
+ default: AssertFailedReturn(VERR_INTERNAL_ERROR_3);
+ }
+ }
+ return rc;
+}
+
+
/** @copydoc RTLDROPS::pfnDone */
static DECLCALLBACK(int) rtldrPEDone(PRTLDRMODINTERNAL pMod)
{
@@ -1523,6 +2464,7 @@ static DECLCALLBACK(int) rtldrPEDone(PRTLDRMODINTERNAL pMod)
return VINF_SUCCESS;
}
+
/** @copydoc RTLDROPS::pfnClose */
static DECLCALLBACK(int) rtldrPEClose(PRTLDRMODINTERNAL pMod)
{
@@ -1565,6 +2507,8 @@ static const RTLDROPSPE s_rtldrPE32Ops =
rtldrPE_RvaToSegOffset,
NULL,
rtldrPE_QueryProp,
+ rtldrPE_VerifySignature,
+ rtldrPE_HashImage,
42
},
rtldrPEResolveImports32,
@@ -1596,6 +2540,8 @@ static const RTLDROPSPE s_rtldrPE64Ops =
rtldrPE_RvaToSegOffset,
NULL,
rtldrPE_QueryProp,
+ rtldrPE_VerifySignature,
+ rtldrPE_HashImage,
42
},
rtldrPEResolveImports64,
@@ -1659,23 +2605,28 @@ static void rtldrPEConvert32BitLoadConfigTo64Bit(PIMAGE_LOAD_CONFIG_DIRECTORY64
/*
* volatile everywhere! Trying to prevent the compiler being a smarta$$ and reorder stuff.
*/
- IMAGE_LOAD_CONFIG_DIRECTORY32 volatile *pLoadCfg32 = (IMAGE_LOAD_CONFIG_DIRECTORY32 volatile *)pLoadCfg;
- IMAGE_LOAD_CONFIG_DIRECTORY64 volatile *pLoadCfg64 = pLoadCfg;
-
- pLoadCfg64->SEHandlerCount = pLoadCfg32->SEHandlerCount;
- pLoadCfg64->SEHandlerTable = pLoadCfg32->SEHandlerTable;
- pLoadCfg64->SecurityCookie = pLoadCfg32->SecurityCookie;
- pLoadCfg64->EditList = pLoadCfg32->EditList;
- pLoadCfg64->Reserved1 = pLoadCfg32->Reserved1;
- pLoadCfg64->CSDVersion = pLoadCfg32->CSDVersion;
- pLoadCfg64->ProcessHeapFlags = pLoadCfg32->ProcessHeapFlags; /* switched place with ProcessAffinityMask, but we're more than 16 byte off by now so it doesn't matter. */
- pLoadCfg64->ProcessAffinityMask = pLoadCfg32->ProcessAffinityMask;
- pLoadCfg64->VirtualMemoryThreshold = pLoadCfg32->VirtualMemoryThreshold;
- pLoadCfg64->MaximumAllocationSize = pLoadCfg32->MaximumAllocationSize;
- pLoadCfg64->LockPrefixTable = pLoadCfg32->LockPrefixTable;
- pLoadCfg64->DeCommitTotalFreeThreshold = pLoadCfg32->DeCommitTotalFreeThreshold;
- uint32_t u32DeCommitFreeBlockThreshold = pLoadCfg32->DeCommitFreeBlockThreshold;
- pLoadCfg64->DeCommitFreeBlockThreshold = u32DeCommitFreeBlockThreshold;
+ IMAGE_LOAD_CONFIG_DIRECTORY32_V3 volatile *pLoadCfg32 = (IMAGE_LOAD_CONFIG_DIRECTORY32_V3 volatile *)pLoadCfg;
+ IMAGE_LOAD_CONFIG_DIRECTORY64_V3 volatile *pLoadCfg64 = pLoadCfg;
+
+ pLoadCfg64->GuardFlags = pLoadCfg32->GuardFlags;
+ pLoadCfg64->GuardCFFunctionCount = pLoadCfg32->GuardCFFunctionCount;
+ pLoadCfg64->GuardCFFunctionTable = pLoadCfg32->GuardCFFunctionTable;
+ pLoadCfg64->Reserved2 = pLoadCfg32->Reserved2;
+ pLoadCfg64->GuardCFCCheckFunctionPointer= pLoadCfg32->GuardCFCCheckFunctionPointer;
+ pLoadCfg64->SEHandlerCount = pLoadCfg32->SEHandlerCount;
+ pLoadCfg64->SEHandlerTable = pLoadCfg32->SEHandlerTable;
+ pLoadCfg64->SecurityCookie = pLoadCfg32->SecurityCookie;
+ pLoadCfg64->EditList = pLoadCfg32->EditList;
+ pLoadCfg64->Reserved1 = pLoadCfg32->Reserved1;
+ pLoadCfg64->CSDVersion = pLoadCfg32->CSDVersion;
+ pLoadCfg64->ProcessHeapFlags = pLoadCfg32->ProcessHeapFlags; /* switched place with ProcessAffinityMask, but we're more than 16 byte off by now so it doesn't matter. */
+ pLoadCfg64->ProcessAffinityMask = pLoadCfg32->ProcessAffinityMask;
+ pLoadCfg64->VirtualMemoryThreshold = pLoadCfg32->VirtualMemoryThreshold;
+ pLoadCfg64->MaximumAllocationSize = pLoadCfg32->MaximumAllocationSize;
+ pLoadCfg64->LockPrefixTable = pLoadCfg32->LockPrefixTable;
+ pLoadCfg64->DeCommitTotalFreeThreshold = pLoadCfg32->DeCommitTotalFreeThreshold;
+ uint32_t u32DeCommitFreeBlockThreshold = pLoadCfg32->DeCommitFreeBlockThreshold;
+ pLoadCfg64->DeCommitFreeBlockThreshold = u32DeCommitFreeBlockThreshold;
/* the rest is equal. */
Assert( RT_OFFSETOF(IMAGE_LOAD_CONFIG_DIRECTORY32, DeCommitFreeBlockThreshold)
== RT_OFFSETOF(IMAGE_LOAD_CONFIG_DIRECTORY64, DeCommitFreeBlockThreshold));
@@ -1719,7 +2670,7 @@ static int rtldrPEValidateFileHeader(PIMAGE_FILE_HEADER pFileHdr, uint32_t fFlag
}
/* This restriction needs to be implemented elsewhere. */
if ( (pFileHdr->Characteristics & IMAGE_FILE_RELOCS_STRIPPED)
- && !(fFlags & RTLDR_O_FOR_DEBUG))
+ && !(fFlags & (RTLDR_O_FOR_DEBUG | RTLDR_O_FOR_VALIDATION)))
{
Log(("rtldrPEOpen: %s: IMAGE_FILE_RELOCS_STRIPPED\n", pszLogName));
return VERR_BAD_EXE_FORMAT;
@@ -1855,6 +2806,8 @@ static int rtldrPEValidateOptionalHeader(const IMAGE_OPTIONAL_HEADER64 *pOptHdr,
break;
case IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT: // 13
+ if (fFlags & (RTLDR_O_FOR_DEBUG | RTLDR_O_FOR_VALIDATION))
+ break;
Log(("rtldrPEOpen: %s: dir no. %d (DELAY_IMPORT) VirtualAddress=%#x Size=%#x is not supported!!!\n",
pszLogName, i, pDir->VirtualAddress, pDir->Size));
return VERR_LDRPE_DELAY_IMPORT;
@@ -1869,7 +2822,7 @@ static int rtldrPEValidateOptionalHeader(const IMAGE_OPTIONAL_HEADER64 *pOptHdr,
Log(("rtldrPEOpen: %s: Security directory is too small: %#x bytes\n", pszLogName, i, pDir->Size));
return VERR_LDRPE_CERT_MALFORMED;
}
- if (pDir->Size >= _1M)
+ if (pDir->Size >= RTLDRMODPE_MAX_SECURITY_DIR_SIZE)
{
Log(("rtldrPEOpen: %s: Security directory is too large: %#x bytes\n", pszLogName, i, pDir->Size));
return VERR_LDRPE_CERT_MALFORMED;
@@ -1893,11 +2846,15 @@ static int rtldrPEValidateOptionalHeader(const IMAGE_OPTIONAL_HEADER64 *pOptHdr,
return VERR_LDRPE_GLOBALPTR;
case IMAGE_DIRECTORY_ENTRY_TLS: // 9
+ if (fFlags & (RTLDR_O_FOR_DEBUG | RTLDR_O_FOR_VALIDATION))
+ break;
Log(("rtldrPEOpen: %s: dir no. %d (TLS) VirtualAddress=%#x Size=%#x is not supported!!!\n",
pszLogName, i, pDir->VirtualAddress, pDir->Size));
return VERR_LDRPE_TLS;
case IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR:// 14
+ if (fFlags & (RTLDR_O_FOR_DEBUG | RTLDR_O_FOR_VALIDATION))
+ break;
Log(("rtldrPEOpen: %s: dir no. %d (COM_DESCRIPTOR) VirtualAddress=%#x Size=%#x is not supported!!!\n",
pszLogName, i, pDir->VirtualAddress, pDir->Size));
return VERR_LDRPE_COM_DESCRIPTOR;
@@ -1944,7 +2901,7 @@ static int rtldrPEValidateSectionHeaders(const IMAGE_SECTION_HEADER *paSections,
Log3(("RTLdrPE: Section Headers:\n"));
for (unsigned cSHdrsLeft = cSections; cSHdrsLeft > 0; cSHdrsLeft--, pSH++)
{
- const unsigned iSH = pSH - &paSections[0]; NOREF(iSH);
+ const unsigned iSH = (unsigned)(pSH - &paSections[0]); NOREF(iSH);
Log3(("RTLdrPE: #%d '%-8.8s' Characteristics: %08RX32\n"
"RTLdrPE: VirtAddr: %08RX32 VirtSize: %08RX32\n"
"RTLdrPE: FileOff: %08RX32 FileSize: %08RX32\n"
@@ -2109,17 +3066,18 @@ static int rtldrPEReadRVA(PRTLDRMODPE pModPe, void *pvBuf, uint32_t cb, uint32_t
/**
- * Validates the data of some selected data directories entries.
+ * Validates the data of some selected data directories entries and remember
+ * important bits for later.
*
- * This requires a valid section table and thus has to wait
- * till after we've read and validated it.
+ * This requires a valid section table and thus has to wait till after we've
+ * read and validated it.
*
* @returns iprt status code.
* @param pModPe The PE module instance.
* @param pOptHdr Pointer to the optional header (valid).
* @param fFlags Loader flags, RTLDR_O_XXX.
*/
-static int rtldrPEValidateDirectories(PRTLDRMODPE pModPe, const IMAGE_OPTIONAL_HEADER64 *pOptHdr, uint32_t fFlags)
+static int rtldrPEValidateDirectoriesAndRememberStuff(PRTLDRMODPE pModPe, const IMAGE_OPTIONAL_HEADER64 *pOptHdr, uint32_t fFlags)
{
const char *pszLogName = pModPe->Core.pReader->pfnLogName(pModPe->Core.pReader); NOREF(pszLogName);
union /* combine stuff we're reading to help reduce stack usage. */
@@ -2135,16 +3093,22 @@ static int rtldrPEValidateDirectories(PRTLDRMODPE pModPe, const IMAGE_OPTIONAL_H
IMAGE_DATA_DIRECTORY Dir = pOptHdr->DataDirectory[IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG];
if (Dir.Size)
{
- const size_t cbExpect = pOptHdr->Magic == IMAGE_NT_OPTIONAL_HDR32_MAGIC
- ? sizeof(IMAGE_LOAD_CONFIG_DIRECTORY32)
- : sizeof(IMAGE_LOAD_CONFIG_DIRECTORY64);
- if ( Dir.Size != cbExpect
- && ( cbExpect == sizeof(IMAGE_LOAD_CONFIG_DIRECTORY32)
- && Dir.Size != (uint32_t)RT_OFFSETOF(IMAGE_LOAD_CONFIG_DIRECTORY32, SEHandlerTable))
- )
+ const size_t cbExpectV3 = !pModPe->f64Bit
+ ? sizeof(IMAGE_LOAD_CONFIG_DIRECTORY32_V3)
+ : sizeof(IMAGE_LOAD_CONFIG_DIRECTORY64_V3);
+ const size_t cbExpectV2 = !pModPe->f64Bit
+ ? sizeof(IMAGE_LOAD_CONFIG_DIRECTORY32_V2)
+ : sizeof(IMAGE_LOAD_CONFIG_DIRECTORY64_V2);
+ const size_t cbExpectV1 = !pModPe->f64Bit
+ ? sizeof(IMAGE_LOAD_CONFIG_DIRECTORY32_V1)
+ : sizeof(IMAGE_LOAD_CONFIG_DIRECTORY64_V2) /*No V1*/;
+
+ if ( Dir.Size != cbExpectV3
+ && Dir.Size != cbExpectV2
+ && Dir.Size != cbExpectV1)
{
- Log(("rtldrPEOpen: %s: load cfg dir: unexpected dir size of %d bytes, expected %d.\n",
- pszLogName, Dir.Size, cbExpect));
+ Log(("rtldrPEOpen: %s: load cfg dir: unexpected dir size of %d bytes, expected %d, %d, or %d.\n",
+ pszLogName, Dir.Size, cbExpectV3, cbExpectV2, cbExpectV1));
return VERR_LDRPE_LOAD_CONFIG_SIZE;
}
@@ -2157,13 +3121,32 @@ static int rtldrPEValidateDirectories(PRTLDRMODPE pModPe, const IMAGE_OPTIONAL_H
return rc;
rtldrPEConvert32BitLoadConfigTo64Bit(&u.Cfg64);
- if (u.Cfg64.Size != cbExpect)
+ if (u.Cfg64.Size != Dir.Size)
{
- Log(("rtldrPEOpen: %s: load cfg dir: unexpected header size of %d bytes, expected %d.\n",
- pszLogName, u.Cfg64.Size, cbExpect));
- return VERR_LDRPE_LOAD_CONFIG_SIZE;
+ /* Kludge, seen ati shipping 32-bit DLLs and EXEs with Dir.Size=0x40
+ and Cfg64.Size=0x5c or 0x48. Windows seems to deal with it, so
+ lets do so as well. */
+ if ( Dir.Size < u.Cfg64.Size
+ && ( u.Cfg64.Size == cbExpectV3
+ || u.Cfg64.Size == cbExpectV2) )
+ {
+ Log(("rtldrPEOpen: %s: load cfg dir: Header (%d) and directory (%d) size mismatch, applying the ATI kludge\n",
+ pszLogName, u.Cfg64.Size, Dir.Size));
+ Dir.Size = u.Cfg64.Size;
+ memset(&u.Cfg64, 0, sizeof(u.Cfg64));
+ rc = rtldrPEReadRVA(pModPe, &u.Cfg64, Dir.Size, Dir.VirtualAddress);
+ if (RT_FAILURE(rc))
+ return rc;
+ rtldrPEConvert32BitLoadConfigTo64Bit(&u.Cfg64);
+ }
+ if (u.Cfg64.Size != Dir.Size)
+ {
+ Log(("rtldrPEOpen: %s: load cfg dir: unexpected header size of %d bytes, expected %d.\n",
+ pszLogName, u.Cfg64.Size, Dir.Size));
+ return VERR_LDRPE_LOAD_CONFIG_SIZE;
+ }
}
- if (u.Cfg64.LockPrefixTable)
+ if (u.Cfg64.LockPrefixTable && !(fFlags & (RTLDR_O_FOR_DEBUG | RTLDR_O_FOR_VALIDATION)))
{
Log(("rtldrPEOpen: %s: load cfg dir: lock prefix table at %RX64. We don't support lock prefix tables!\n",
pszLogName, u.Cfg64.LockPrefixTable));
@@ -2178,12 +3161,28 @@ static int rtldrPEValidateDirectories(PRTLDRMODPE pModPe, const IMAGE_OPTIONAL_H
return VERR_BAD_EXE_FORMAT;
}
#endif
- if (u.Cfg64.EditList)
+ if (u.Cfg64.EditList && !(fFlags & (RTLDR_O_FOR_DEBUG | RTLDR_O_FOR_VALIDATION)))
{
Log(("rtldrPEOpen: %s: load cfg dir: EditList=%RX64 is unsupported!\n",
pszLogName, u.Cfg64.EditList));
return VERR_BAD_EXE_FORMAT;
}
+ /** @todo GuardCFC? Possibly related to:
+ * http://research.microsoft.com/pubs/69217/ccs05-cfi.pdf
+ * Not trusting something designed by bakas who don't know how to modify a
+ * structure without messing up its natural alignment. */
+ if ( ( u.Cfg64.GuardCFCCheckFunctionPointer
+ || u.Cfg64.Reserved2
+ || u.Cfg64.GuardCFFunctionTable
+ || u.Cfg64.GuardCFFunctionCount
+ || u.Cfg64.GuardFlags)
+ && !(fFlags & (RTLDR_O_FOR_DEBUG | RTLDR_O_FOR_VALIDATION)))
+ {
+ Log(("rtldrPEOpen: %s: load cfg dir: Guard stuff: %RX64,%RX64,%RX64,%RX64,%RX32!\n",
+ pszLogName, u.Cfg64.GuardCFCCheckFunctionPointer, u.Cfg64.Reserved2,
+ u.Cfg64.GuardCFFunctionTable, u.Cfg64.GuardCFFunctionCount, u.Cfg64.GuardFlags));
+ return VERR_BAD_EXE_FORMAT;
+ }
}
/*
@@ -2191,7 +3190,7 @@ static int rtldrPEValidateDirectories(PRTLDRMODPE pModPe, const IMAGE_OPTIONAL_H
* take a look at the signature.
*/
Dir = pOptHdr->DataDirectory[IMAGE_DIRECTORY_ENTRY_SECURITY];
- if (Dir.Size && !(fFlags & RTLDR_O_FOR_DEBUG))
+ if (Dir.Size)
{
PWIN_CERTIFICATE pFirst = (PWIN_CERTIFICATE)RTMemTmpAlloc(Dir.Size);
if (!pFirst)
@@ -2199,14 +3198,14 @@ static int rtldrPEValidateDirectories(PRTLDRMODPE pModPe, const IMAGE_OPTIONAL_H
int rc = pModPe->Core.pReader->pfnRead(pModPe->Core.pReader, pFirst, Dir.Size, Dir.VirtualAddress);
if (RT_SUCCESS(rc))
{
- uint32_t off = 0;
- PWIN_CERTIFICATE pCur = pFirst;
+ uint32_t off = 0;
do
{
+ PWIN_CERTIFICATE pCur = (PWIN_CERTIFICATE)((uint8_t *)pFirst + off);
+
/* validate the members. */
- uint32_t const cbCur = RT_ALIGN_32(pCur->dwLength, 8);
- if ( cbCur < sizeof(WIN_CERTIFICATE)
- || cbCur + off > RT_ALIGN_32(Dir.Size, 8))
+ if ( pCur->dwLength < sizeof(WIN_CERTIFICATE)
+ || pCur->dwLength + off > Dir.Size)
{
Log(("rtldrPEOpen: %s: cert at %#x/%#x: dwLength=%#x\n", pszLogName, off, Dir.Size, pCur->dwLength));
rc = VERR_LDRPE_CERT_MALFORMED;
@@ -2232,11 +3231,17 @@ static int rtldrPEValidateDirectories(PRTLDRMODPE pModPe, const IMAGE_OPTIONAL_H
break;
}
- /** @todo Rainy Day: Implement further verification using openssl. */
+ /* Remember the first signed data certificate. */
+ if ( pCur->wCertificateType == WIN_CERT_TYPE_PKCS_SIGNED_DATA
+ && pModPe->offPkcs7SignedData == 0)
+ {
+ pModPe->offPkcs7SignedData = Dir.VirtualAddress
+ + (uint32_t)((uintptr_t)&pCur->bCertificate[0] - (uintptr_t)pFirst);
+ pModPe->cbPkcs7SignedData = pCur->dwLength - RT_OFFSETOF(WIN_CERTIFICATE, bCertificate);
+ }
/* next */
- off += cbCur;
- pCur = (PWIN_CERTIFICATE)((uint8_t *)pCur + cbCur);
+ off += RT_ALIGN(pCur->dwLength, WIN_CERTIFICATE_ALIGNMENT);
} while (off < Dir.Size);
}
RTMemTmpFree(pFirst);
@@ -2258,8 +3263,10 @@ static int rtldrPEValidateDirectories(PRTLDRMODPE pModPe, const IMAGE_OPTIONAL_H
* @param enmArch Architecture specifier.
* @param offNtHdrs The offset of the NT headers (where you find "PE\0\0").
* @param phLdrMod Where to store the handle.
+ * @param pErrInfo Where to return extended error information. Optional.
*/
-int rtldrPEOpen(PRTLDRREADER pReader, uint32_t fFlags, RTLDRARCH enmArch, RTFOFF offNtHdrs, PRTLDRMOD phLdrMod)
+int rtldrPEOpen(PRTLDRREADER pReader, uint32_t fFlags, RTLDRARCH enmArch, RTFOFF offNtHdrs,
+ PRTLDRMOD phLdrMod, PRTERRINFO pErrInfo)
{
/*
* Read and validate the file header.
@@ -2348,16 +3355,20 @@ int rtldrPEOpen(PRTLDRREADER pReader, uint32_t fFlags, RTLDRARCH enmArch, RTFOFF
pModPe->cbImage = OptHdr.SizeOfImage;
pModPe->cbHeaders = OptHdr.SizeOfHeaders;
pModPe->uTimestamp = FileHdr.TimeDateStamp;
+ pModPe->f64Bit = FileHdr.SizeOfOptionalHeader == sizeof(OptHdr);
pModPe->ImportDir = OptHdr.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT];
pModPe->RelocDir = OptHdr.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC];
pModPe->ExportDir = OptHdr.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT];
pModPe->DebugDir = OptHdr.DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG];
+ pModPe->SecurityDir = OptHdr.DataDirectory[IMAGE_DIRECTORY_ENTRY_SECURITY];
+ pModPe->fDllCharacteristics = OptHdr.DllCharacteristics;
/*
* Perform validation of some selected data directories which requires
- * inspection of the actual data.
+ * inspection of the actual data. This also saves some certificate
+ * information.
*/
- rc = rtldrPEValidateDirectories(pModPe, &OptHdr, fFlags);
+ rc = rtldrPEValidateDirectoriesAndRememberStuff(pModPe, &OptHdr, fFlags);
if (RT_SUCCESS(rc))
{
*phLdrMod = &pModPe->Core;
diff --git a/src/VBox/Runtime/common/ldr/ldrkStuff.cpp b/src/VBox/Runtime/common/ldr/ldrkStuff.cpp
index 52a5e814eed..0fc4ca40e13 100644
--- a/src/VBox/Runtime/common/ldr/ldrkStuff.cpp
+++ b/src/VBox/Runtime/common/ldr/ldrkStuff.cpp
@@ -837,7 +837,7 @@ static DECLCALLBACK(int) rtkldr_ReadDbgInfo(PRTLDRMODINTERNAL pMod, uint32_t iDb
/** @interface_method_impl{RTLDROPS,pfnQueryProp} */
-static DECLCALLBACK(int) rtkldr_QueryProp(PRTLDRMODINTERNAL pMod, RTLDRPROP enmProp, void *pvBuf, size_t cbBuf)
+static DECLCALLBACK(int) rtkldr_QueryProp(PRTLDRMODINTERNAL pMod, RTLDRPROP enmProp, void *pvBuf, size_t cbBuf, size_t *pcbRet)
{
PRTLDRMODKLDR pThis = (PRTLDRMODKLDR)pMod;
int rc;
@@ -880,6 +880,8 @@ static const RTLDROPS g_rtkldrOps =
rtkldr_RvaToSegOffset,
rtkldr_ReadDbgInfo,
rtkldr_QueryProp,
+ NULL,
+ NULL,
42
};
@@ -892,8 +894,9 @@ static const RTLDROPS g_rtkldrOps =
* @param fFlags Reserved, MBZ.
* @param enmArch CPU architecture specifier for the image to be loaded.
* @param phLdrMod Where to store the handle.
+ * @param pErrInfo Where to return extended error information. Optional.
*/
-int rtldrkLdrOpen(PRTLDRREADER pReader, uint32_t fFlags, RTLDRARCH enmArch, PRTLDRMOD phLdrMod)
+int rtldrkLdrOpen(PRTLDRREADER pReader, uint32_t fFlags, RTLDRARCH enmArch, PRTLDRMOD phLdrMod, PRTERRINFO pErrInfo)
{
/* Convert enmArch to k-speak. */
KCPUARCH enmCpuArch;
diff --git a/src/VBox/Runtime/common/log/log.cpp b/src/VBox/Runtime/common/log/log.cpp
index f2e89d2f184..ceb7d800b7d 100644
--- a/src/VBox/Runtime/common/log/log.cpp
+++ b/src/VBox/Runtime/common/log/log.cpp
@@ -2608,6 +2608,22 @@ RTDECL(void) RTLogPrintfV(const char *pszFormat, va_list args)
}
RT_EXPORT_SYMBOL(RTLogPrintfV);
+
+/**
+ * Dumper vprintf-like function outputting to a logger.
+ *
+ * @param pvUser Pointer to the logger instance to use, NULL for
+ * default instance.
+ * @param pszFormat Format string.
+ * @param va Format arguments.
+ */
+RTDECL(void) RTLogDumpPrintfV(void *pvUser, const char *pszFormat, va_list va)
+{
+ RTLogLoggerV((PRTLOGGER)pvUser, pszFormat, va);
+}
+RT_EXPORT_SYMBOL(RTLogDumpPrintfV);
+
+
#ifdef IN_RING3
/**
diff --git a/src/VBox/Runtime/common/math/bignum.cpp b/src/VBox/Runtime/common/math/bignum.cpp
new file mode 100644
index 00000000000..f6c28d32d34
--- /dev/null
+++ b/src/VBox/Runtime/common/math/bignum.cpp
@@ -0,0 +1,1898 @@
+/* $Id$ */
+/** @file
+ * IPRT - Big Integer Numbers.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#if defined(DEBUG_bird) && !defined(IN_SUP_HARDENED_R3)
+# define RTMEM_WRAP_TO_EF_APIS
+#endif
+#include "internal/iprt.h"
+#include <iprt/bignum.h>
+
+#include <iprt/asm.h>
+#include <iprt/asm-math.h>
+#include <iprt/err.h>
+#include <iprt/mem.h>
+#include <iprt/memsafer.h>
+#include <iprt/string.h>
+
+
+/** The max size (in bytes) of an elements array. */
+#define RTBIGNUM_MAX_SIZE _4M
+
+
+/**
+ * Scrambles a big number if required.
+ *
+ * @param pBigNum The big number.
+ */
+DECLINLINE(void) rtBigNumScramble(PRTBIGNUM pBigNum)
+{
+ if (pBigNum->fSensitive)
+ {
+ AssertReturnVoid(!pBigNum->fCurScrambled);
+ if (pBigNum->pauElements)
+ {
+ int rc = RTMemSaferScramble(pBigNum->pauElements, pBigNum->cAllocated * RTBIGNUM_ELEMENT_SIZE); AssertRC(rc);
+ pBigNum->fCurScrambled = RT_SUCCESS(rc);
+ }
+ else
+ pBigNum->fCurScrambled = true;
+ }
+}
+
+
+/**
+ * Unscrambles a big number if required.
+ *
+ * @returns IPRT status code.
+ * @param pBigNum The big number.
+ */
+DECLINLINE(int) rtBigNumUnscramble(PRTBIGNUM pBigNum)
+{
+ if (pBigNum->fSensitive)
+ {
+ AssertReturn(pBigNum->fCurScrambled, VERR_INTERNAL_ERROR_2);
+ if (pBigNum->pauElements)
+ {
+ int rc = RTMemSaferUnscramble(pBigNum->pauElements, pBigNum->cAllocated * RTBIGNUM_ELEMENT_SIZE); AssertRC(rc);
+ pBigNum->fCurScrambled = !RT_SUCCESS(rc);
+ return rc;
+ }
+ else
+ pBigNum->fCurScrambled = false;
+ }
+ return VINF_SUCCESS;
+}
+
+
+/**
+ * Getter function for pauElements which extends the array to infinity.
+ *
+ * @returns The element value.
+ * @param pBigNum The big number.
+ * @param iElement The element index.
+ */
+DECLINLINE(RTBIGNUMELEMENT) rtBigNumGetElement(PCRTBIGNUM pBigNum, uint32_t iElement)
+{
+ if (iElement < pBigNum->cUsed)
+ return pBigNum->pauElements[iElement];
+ return 0;
+}
+
+
+/**
+ * Grows the pauElements array so it can fit at least @a cNewUsed entries.
+ *
+ * @returns IPRT status code.
+ * @param pBigNum The big number.
+ * @param cNewUsed The new cUsed value.
+ */
+static int rtBigNumGrow(PRTBIGNUM pBigNum, uint32_t cNewUsed)
+{
+ uint32_t const cbOld = pBigNum->cAllocated * RTBIGNUM_ELEMENT_SIZE;
+ uint32_t const cNew = RT_ALIGN_32(cNewUsed, 4);
+ uint32_t const cbNew = cNew * RTBIGNUM_ELEMENT_SIZE;
+ Assert(cbNew > cbOld);
+
+ void *pvNew;
+ if (pBigNum->fSensitive)
+ pvNew = RTMemSaferReallocZ(cbOld, pBigNum->pauElements, cbNew);
+ else
+ pvNew = RTMemRealloc(pBigNum->pauElements, cbNew);
+ if (RT_LIKELY(pvNew))
+ {
+ if (cbNew > cbOld)
+ RT_BZERO((char *)pvNew + cbOld, cbNew - cbOld);
+
+ pBigNum->pauElements = (RTBIGNUMELEMENT *)pvNew;
+ pBigNum->cUsed = cNewUsed;
+ pBigNum->cAllocated = cNew;
+ return VINF_SUCCESS;
+ }
+ return VERR_NO_MEMORY;
+}
+
+
+/**
+ * Changes the cUsed member, growing the pauElements array if necessary.
+ *
+ * No assumptions about the value of any added elements should be made. This
+ * method is mainly for resizing result values where the caller will repopulate
+ * the element values short after this call.
+ *
+ * @returns IPRT status code.
+ * @param pBigNum The big number.
+ * @param cNewUsed The new cUsed value.
+ */
+DECLINLINE(int) rtBigNumSetUsed(PRTBIGNUM pBigNum, uint32_t cNewUsed)
+{
+ if (pBigNum->cAllocated >= cNewUsed)
+ {
+ pBigNum->cUsed = cNewUsed;
+ return VINF_SUCCESS;
+ }
+ return rtBigNumGrow(pBigNum, cNewUsed);
+}
+
+/**
+ * The slow part of rtBigNumEnsureElementPresent where we need to do actual zero
+ * extending.
+ *
+ * @returns IPRT status code.
+ * @param pBigNum The big number.
+ * @param iElement The element we wish to access.
+ */
+static int rtBigNumEnsureElementPresentSlow(PRTBIGNUM pBigNum, uint32_t iElement)
+{
+ uint32_t const cOldUsed = pBigNum->cUsed;
+ int rc = rtBigNumSetUsed(pBigNum, iElement + 1);
+ if (RT_SUCCESS(rc))
+ {
+ RT_BZERO(&pBigNum->pauElements[cOldUsed], (iElement + 1 - cOldUsed) * RTBIGNUM_ELEMENT_SIZE);
+ return VINF_SUCCESS;
+ }
+ return rc;
+}
+
+
+/**
+ * Zero extends the element array to make sure a the specified element index is
+ * accessible.
+ *
+ * This is typically used with bit operations and self modifying methods. Any
+ * new elements added will be initialized to zero. The caller is responsible
+ * for there not being any trailing zero elements.
+ *
+ * The number must be unscrambled.
+ *
+ * @returns IPRT status code.
+ * @param pBigNum The big number.
+ * @param iElement The element we wish to access.
+ */
+DECLINLINE(int) rtBigNumEnsureElementPresent(PRTBIGNUM pBigNum, uint32_t iElement)
+{
+ if (iElement < pBigNum->cUsed)
+ return VINF_SUCCESS;
+ return rtBigNumEnsureElementPresentSlow(pBigNum, iElement);
+}
+
+
+/**
+ * Strips zero elements from the magnitude value.
+ *
+ * @param pBigNum The big number to strip.
+ */
+static void rtBigNumStripTrailingZeros(PRTBIGNUM pBigNum)
+{
+ uint32_t i = pBigNum->cUsed;
+ while (i > 0 && pBigNum->pauElements[i - 1] == 0)
+ i--;
+ pBigNum->cUsed = i;
+}
+
+
+/**
+ * Initialize the big number to zero.
+ *
+ * @returns @a pBigNum
+ * @param pBigNum The big number.
+ * @param fFlags The flags.
+ * @internal
+ */
+DECLINLINE(PRTBIGNUM) rtBigNumInitZeroInternal(PRTBIGNUM pBigNum, uint32_t fFlags)
+{
+ RT_ZERO(*pBigNum);
+ pBigNum->fSensitive = RT_BOOL(fFlags & RTBIGNUMINIT_F_SENSITIVE);
+ return pBigNum;
+}
+
+
+/**
+ * Initialize the big number to zero from a template variable.
+ *
+ * @returns @a pBigNum
+ * @param pBigNum The big number.
+ * @param pTemplate The template big number.
+ * @internal
+ */
+DECLINLINE(PRTBIGNUM) rtBigNumInitZeroTemplate(PRTBIGNUM pBigNum, PCRTBIGNUM pTemplate)
+{
+ RT_ZERO(*pBigNum);
+ pBigNum->fSensitive = pTemplate->fSensitive;
+ return pBigNum;
+}
+
+
+RTDECL(int) RTBigNumInit(PRTBIGNUM pBigNum, uint32_t fFlags, void const *pvRaw, size_t cbRaw)
+{
+ /*
+ * Validate input.
+ */
+ AssertPtrReturn(pBigNum, VERR_INVALID_POINTER);
+ AssertReturn(RT_BOOL(fFlags & RTBIGNUMINIT_F_ENDIAN_BIG) ^ RT_BOOL(fFlags & RTBIGNUMINIT_F_ENDIAN_LITTLE),
+ VERR_INVALID_PARAMETER);
+ AssertReturn(RT_BOOL(fFlags & RTBIGNUMINIT_F_UNSIGNED) ^ RT_BOOL(fFlags & RTBIGNUMINIT_F_SIGNED), VERR_INVALID_PARAMETER);
+ if (cbRaw)
+ AssertPtrReturn(pvRaw, VERR_INVALID_POINTER);
+
+ /*
+ * Initalize the big number to zero.
+ */
+ rtBigNumInitZeroInternal(pBigNum, fFlags);
+
+ /*
+ * Strip the input and figure the sign flag.
+ */
+ uint8_t const *pb = (uint8_t const *)pvRaw;
+ if (cbRaw)
+ {
+ if (fFlags & RTBIGNUMINIT_F_ENDIAN_LITTLE)
+ {
+ if (fFlags & RTBIGNUMINIT_F_UNSIGNED)
+ {
+ while (cbRaw > 0 && pb[cbRaw - 1] == 0)
+ cbRaw--;
+ }
+ else
+ {
+ if (pb[cbRaw - 1] >> 7)
+ {
+ pBigNum->fNegative = 1;
+ while (cbRaw > 1 && pb[cbRaw - 1] == 0xff)
+ cbRaw--;
+ }
+ else
+ while (cbRaw > 0 && pb[cbRaw - 1] == 0)
+ cbRaw--;
+ }
+ }
+ else
+ {
+ if (fFlags & RTBIGNUMINIT_F_UNSIGNED)
+ {
+ while (cbRaw > 0 && *pb == 0)
+ pb++, cbRaw--;
+ }
+ else
+ {
+ if (*pb >> 7)
+ {
+ pBigNum->fNegative = 1;
+ while (cbRaw > 1 && *pb == 0xff)
+ pb++, cbRaw--;
+ }
+ else
+ while (cbRaw > 0 && *pb == 0)
+ pb++, cbRaw--;
+ }
+ }
+ }
+
+ /*
+ * Allocate memory for the elements.
+ */
+ size_t cbAligned = RT_ALIGN_Z(cbRaw, RTBIGNUM_ELEMENT_SIZE);
+ if (RT_UNLIKELY(cbAligned >= RTBIGNUM_MAX_SIZE))
+ return VERR_OUT_OF_RANGE;
+ pBigNum->cUsed = (uint32_t)cbAligned / RTBIGNUM_ELEMENT_SIZE;
+ if (pBigNum->cUsed)
+ {
+ pBigNum->cAllocated = RT_ALIGN_32(pBigNum->cUsed, 4);
+ if (pBigNum->fSensitive)
+ pBigNum->pauElements = (RTBIGNUMELEMENT *)RTMemSaferAllocZ(pBigNum->cAllocated * RTBIGNUM_ELEMENT_SIZE);
+ else
+ pBigNum->pauElements = (RTBIGNUMELEMENT *)RTMemAlloc(pBigNum->cAllocated * RTBIGNUM_ELEMENT_SIZE);
+ if (RT_UNLIKELY(!pBigNum->pauElements))
+ return VERR_NO_MEMORY;
+
+ /*
+ * Initialize the array.
+ */
+ uint32_t i = 0;
+ if (fFlags & RTBIGNUMINIT_F_ENDIAN_LITTLE)
+ {
+ while (cbRaw >= RTBIGNUM_ELEMENT_SIZE)
+ {
+#if RTBIGNUM_ELEMENT_SIZE == 8
+ pBigNum->pauElements[i] = RT_MAKE_U64_FROM_U8(pb[0], pb[1], pb[2], pb[3], pb[4], pb[5], pb[6], pb[7]);
+#elif RTBIGNUM_ELEMENT_SIZE == 4
+ pBigNum->pauElements[i] = RT_MAKE_U32_FROM_U8(pb[0], pb[1], pb[2], pb[3]);
+#else
+# error "Bad RTBIGNUM_ELEMENT_SIZE value"
+#endif
+ i++;
+ pb += RTBIGNUM_ELEMENT_SIZE;
+ cbRaw -= RTBIGNUM_ELEMENT_SIZE;
+ }
+
+ if (cbRaw > 0)
+ {
+ RTBIGNUMELEMENT uLast = pBigNum->fNegative ? ~(RTBIGNUMELEMENT)0 : 0;
+ switch (cbRaw)
+ {
+ default: AssertFailed();
+#if RTBIGNUM_ELEMENT_SIZE == 8
+ case 7: uLast = (uLast << 8) | pb[6];
+ case 6: uLast = (uLast << 8) | pb[5];
+ case 5: uLast = (uLast << 8) | pb[4];
+ case 4: uLast = (uLast << 8) | pb[3];
+#endif
+ case 3: uLast = (uLast << 8) | pb[2];
+ case 2: uLast = (uLast << 8) | pb[1];
+ case 1: uLast = (uLast << 8) | pb[0];
+ }
+ pBigNum->pauElements[i] = uLast;
+ }
+ }
+ else
+ {
+ pb += cbRaw;
+ while (cbRaw >= RTBIGNUM_ELEMENT_SIZE)
+ {
+ pb -= RTBIGNUM_ELEMENT_SIZE;
+#if RTBIGNUM_ELEMENT_SIZE == 8
+ pBigNum->pauElements[i] = RT_MAKE_U64_FROM_U8(pb[7], pb[6], pb[5], pb[4], pb[3], pb[2], pb[1], pb[0]);
+#elif RTBIGNUM_ELEMENT_SIZE == 4
+ pBigNum->pauElements[i] = RT_MAKE_U32_FROM_U8(pb[3], pb[2], pb[1], pb[0]);
+#else
+# error "Bad RTBIGNUM_ELEMENT_SIZE value"
+#endif
+ i++;
+ cbRaw -= RTBIGNUM_ELEMENT_SIZE;
+ }
+
+ if (cbRaw > 0)
+ {
+ RTBIGNUMELEMENT uLast = pBigNum->fNegative ? ~(RTBIGNUMELEMENT)0 : 0;
+ pb -= cbRaw;
+ switch (cbRaw)
+ {
+ default: AssertFailed();
+#if RTBIGNUM_ELEMENT_SIZE == 8
+ case 7: uLast = (uLast << 8) | *pb++;
+ case 6: uLast = (uLast << 8) | *pb++;
+ case 5: uLast = (uLast << 8) | *pb++;
+ case 4: uLast = (uLast << 8) | *pb++;
+#endif
+ case 3: uLast = (uLast << 8) | *pb++;
+ case 2: uLast = (uLast << 8) | *pb++;
+ case 1: uLast = (uLast << 8) | *pb++;
+ }
+ pBigNum->pauElements[i] = uLast;
+ }
+ }
+
+ /*
+ * If negative, negate it so we get a positive magnitude value in pauElements.
+ */
+ if (pBigNum->fNegative)
+ {
+ pBigNum->pauElements[0] = 0U - pBigNum->pauElements[0];
+ for (i = 1; i < pBigNum->cUsed; i++)
+ pBigNum->pauElements[i] = 0U - pBigNum->pauElements[i] - 1U;
+ }
+ }
+
+ rtBigNumScramble(pBigNum);
+ return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTBigNumInitZero(PRTBIGNUM pBigNum, uint32_t fFlags)
+{
+ AssertReturn(!(fFlags & ~RTBIGNUMINIT_F_SENSITIVE), VERR_INVALID_PARAMETER);
+ AssertPtrReturn(pBigNum, VERR_INVALID_POINTER);
+
+ rtBigNumInitZeroInternal(pBigNum, fFlags);
+ rtBigNumScramble(pBigNum);
+ return VINF_SUCCESS;
+}
+
+
+/**
+ * Internal clone function that assumes the caller takes care of scrambling.
+ *
+ * @returns IPRT status code.
+ * @param pBigNum The target number.
+ * @param pSrc The source number.
+ */
+static int rtBigNumCloneInternal(PRTBIGNUM pBigNum, PCRTBIGNUM pSrc)
+{
+ Assert(!pSrc->fCurScrambled);
+ int rc = VINF_SUCCESS;
+
+ /*
+ * Copy over the data.
+ */
+ RT_ZERO(*pBigNum);
+ pBigNum->fNegative = pSrc->fNegative;
+ pBigNum->fSensitive = pSrc->fSensitive;
+ pBigNum->cUsed = pSrc->cUsed;
+ if (pSrc->cUsed)
+ {
+ /* Duplicate the element array. */
+ pBigNum->cAllocated = RT_ALIGN_32(pBigNum->cUsed, 4);
+ if (pBigNum->fSensitive)
+ pBigNum->pauElements = (RTBIGNUMELEMENT *)RTMemSaferAllocZ(pBigNum->cAllocated * RTBIGNUM_ELEMENT_SIZE);
+ else
+ pBigNum->pauElements = (RTBIGNUMELEMENT *)RTMemAlloc(pBigNum->cAllocated * RTBIGNUM_ELEMENT_SIZE);
+ if (RT_LIKELY(pBigNum->pauElements))
+ memcpy(pBigNum->pauElements, pSrc->pauElements, pBigNum->cUsed * RTBIGNUM_ELEMENT_SIZE);
+ else
+ {
+ RT_ZERO(*pBigNum);
+ rc = VERR_NO_MEMORY;
+ }
+ }
+ return rc;
+}
+
+
+RTDECL(int) RTBigNumClone(PRTBIGNUM pBigNum, PCRTBIGNUM pSrc)
+{
+ int rc = rtBigNumUnscramble((PRTBIGNUM)pSrc);
+ if (RT_SUCCESS(rc))
+ {
+ rc = rtBigNumCloneInternal(pBigNum, pSrc);
+ if (RT_SUCCESS(rc))
+ rtBigNumScramble(pBigNum);
+ rtBigNumScramble((PRTBIGNUM)pSrc);
+ }
+ return rc;
+}
+
+
+RTDECL(int) RTBigNumDestroy(PRTBIGNUM pBigNum)
+{
+ if (pBigNum)
+ {
+ if (pBigNum->pauElements)
+ {
+ Assert(pBigNum->cAllocated > 0);
+ if (pBigNum->fSensitive)
+ {
+ RTMemSaferFree(pBigNum->pauElements, pBigNum->cAllocated * RTBIGNUM_ELEMENT_SIZE);
+ RT_ZERO(*pBigNum);
+ }
+ RTMemFree(pBigNum->pauElements);
+ pBigNum->pauElements = NULL;
+ }
+ }
+ return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTBigNumAssign(PRTBIGNUM pDst, PCRTBIGNUM pSrc)
+{
+ AssertReturn(pDst->fSensitive >= pSrc->fSensitive, VERR_BIGNUM_SENSITIVE_INPUT);
+ int rc = rtBigNumUnscramble(pDst);
+ if (RT_SUCCESS(rc))
+ {
+ rc = rtBigNumUnscramble((PRTBIGNUM)pSrc);
+ if (RT_SUCCESS(rc))
+ {
+ if ( pDst->fSensitive == pSrc->fSensitive
+ || pDst->fSensitive)
+ {
+ if (pDst->cAllocated >= pSrc->cUsed)
+ {
+ pDst->cUsed = pSrc->cUsed;
+ pDst->fNegative = pSrc->fNegative;
+ memcpy(pDst->pauElements, pSrc->pauElements, pSrc->cUsed * RTBIGNUM_ELEMENT_SIZE);
+ }
+ else
+ {
+ rc = rtBigNumGrow(pDst, pSrc->cUsed);
+ if (RT_SUCCESS(rc))
+ {
+ pDst->fNegative = pSrc->fNegative;
+ memcpy(pDst->pauElements, pSrc->pauElements, pSrc->cUsed * RTBIGNUM_ELEMENT_SIZE);
+ }
+ }
+ }
+ else
+ rc = VERR_BIGNUM_SENSITIVE_INPUT;
+ rtBigNumScramble((PRTBIGNUM)pSrc);
+ }
+ rtBigNumScramble(pDst);
+ }
+ return rc;
+}
+
+
+static uint32_t rtBigNumElementBitCount(RTBIGNUMELEMENT uElement)
+{
+#if RTBIGNUM_ELEMENT_SIZE == 8
+ if (uElement >> 32)
+ return ASMBitLastSetU32((uint32_t)(uElement >> 32)) + 32;
+ return ASMBitLastSetU32((uint32_t)uElement);
+#elif RTBIGNUM_ELEMENT_SIZE == 4
+ return ASMBitLastSetU32(uElement);
+#else
+# error "Bad RTBIGNUM_ELEMENT_SIZE value"
+#endif
+}
+
+
+/**
+ * Same as RTBigNumBitWidth, except that it ignore the signed bit.
+ *
+ * The number must be unscrambled.
+ *
+ * @returns The effective width of the magnitude, in bits. Returns 0 if the
+ * value is zero.
+ * @param pBigNum The bit number.
+ */
+static uint32_t rtBigNumMagnitudeBitWidth(PCRTBIGNUM pBigNum)
+{
+ uint32_t idxLast = pBigNum->cUsed;
+ if (idxLast)
+ {
+ idxLast--;
+ RTBIGNUMELEMENT uLast = pBigNum->pauElements[idxLast]; Assert(uLast);
+ return rtBigNumElementBitCount(uLast) + idxLast * RTBIGNUM_ELEMENT_BITS;
+ }
+ return 0;
+}
+
+
+RTDECL(uint32_t) RTBigNumBitWidth(PCRTBIGNUM pBigNum)
+{
+ uint32_t idxLast = pBigNum->cUsed;
+ if (idxLast)
+ {
+ idxLast--;
+ rtBigNumUnscramble((PRTBIGNUM)pBigNum);
+ RTBIGNUMELEMENT uLast = pBigNum->pauElements[idxLast]; Assert(uLast);
+ rtBigNumScramble((PRTBIGNUM)pBigNum);
+ return rtBigNumElementBitCount(uLast) + idxLast * RTBIGNUM_ELEMENT_BITS + pBigNum->fNegative;
+ }
+ return 0;
+}
+
+
+RTDECL(uint32_t) RTBigNumByteWidth(PCRTBIGNUM pBigNum)
+{
+ uint32_t cBits = RTBigNumBitWidth(pBigNum);
+ return (cBits + 7) / 8;
+}
+
+
+RTDECL(int) RTBigNumToBytesBigEndian(PCRTBIGNUM pBigNum, void *pvBuf, size_t cbWanted)
+{
+ AssertPtrReturn(pvBuf, VERR_INVALID_POINTER);
+ AssertReturn(cbWanted > 0, VERR_INVALID_PARAMETER);
+
+ int rc = rtBigNumUnscramble((PRTBIGNUM)pBigNum);
+ if (RT_SUCCESS(rc))
+ {
+ rc = VINF_SUCCESS;
+ if (pBigNum->cUsed != 0)
+ {
+ uint8_t *pbDst = (uint8_t *)pvBuf;
+ pbDst += cbWanted - 1;
+ for (uint32_t i = 0; i < pBigNum->cUsed; i++)
+ {
+ RTBIGNUMELEMENT uElement = pBigNum->pauElements[i];
+ if (pBigNum->fNegative)
+ uElement = (RTBIGNUMELEMENT)0 - uElement - (i > 0);
+ if (cbWanted >= sizeof(uElement))
+ {
+ *pbDst-- = (uint8_t)uElement;
+ uElement >>= 8;
+ *pbDst-- = (uint8_t)uElement;
+ uElement >>= 8;
+ *pbDst-- = (uint8_t)uElement;
+ uElement >>= 8;
+ *pbDst-- = (uint8_t)uElement;
+#if RTBIGNUM_ELEMENT_SIZE == 8
+ uElement >>= 8;
+ *pbDst-- = (uint8_t)uElement;
+ uElement >>= 8;
+ *pbDst-- = (uint8_t)uElement;
+ uElement >>= 8;
+ *pbDst-- = (uint8_t)uElement;
+ uElement >>= 8;
+ *pbDst-- = (uint8_t)uElement;
+#elif RTBIGNUM_ELEMENT_SIZE != 4
+# error "Bad RTBIGNUM_ELEMENT_SIZE value"
+#endif
+ cbWanted -= sizeof(uElement);
+ }
+ else
+ {
+
+ uint32_t cBitsLeft = RTBIGNUM_ELEMENT_BITS;
+ while (cbWanted > 0)
+ {
+ *pbDst-- = (uint8_t)uElement;
+ uElement >>= 8;
+ cBitsLeft -= 8;
+ cbWanted--;
+ }
+ Assert(cBitsLeft > 0); Assert(cBitsLeft < RTBIGNUM_ELEMENT_BITS);
+ if ( i + 1 < pBigNum->cUsed
+ || ( !pBigNum->fNegative
+ ? uElement != 0
+ : uElement != ((RTBIGNUMELEMENT)1 << cBitsLeft) - 1U ) )
+ rc = VERR_BUFFER_OVERFLOW;
+ break;
+ }
+ }
+
+ /* Sign extend the number to the desired output size. */
+ if (cbWanted > 0)
+ memset(pbDst - cbWanted, pBigNum->fNegative ? 0 : 0xff, cbWanted);
+ }
+ else
+ RT_BZERO(pvBuf, cbWanted);
+ rtBigNumScramble((PRTBIGNUM)pBigNum);
+ }
+ return rc;
+}
+
+
+RTDECL(int) RTBigNumCompare(PRTBIGNUM pLeft, PRTBIGNUM pRight)
+{
+ int rc = rtBigNumUnscramble(pLeft);
+ if (RT_SUCCESS(rc))
+ {
+ rc = rtBigNumUnscramble(pRight);
+ if (RT_SUCCESS(rc))
+ {
+ if (pLeft->fNegative == pRight->fNegative)
+ {
+ if (pLeft->cUsed == pRight->cUsed)
+ {
+ rc = 0;
+ uint32_t i = pLeft->cUsed;
+ while (i-- > 0)
+ if (pLeft->pauElements[i] != pRight->pauElements[i])
+ {
+ rc = pLeft->pauElements[i] < pRight->pauElements[i] ? -1 : 1;
+ break;
+ }
+ if (pLeft->fNegative)
+ rc = -rc;
+ }
+ else
+ rc = !pLeft->fNegative
+ ? pLeft->cUsed < pRight->cUsed ? -1 : 1
+ : pLeft->cUsed < pRight->cUsed ? 1 : -1;
+ }
+ else
+ rc = pLeft->fNegative ? -1 : 1;
+
+ rtBigNumScramble(pRight);
+ }
+ rtBigNumScramble(pLeft);
+ }
+ return rc;
+}
+
+
+RTDECL(int) RTBigNumCompareWithU64(PRTBIGNUM pLeft, uint64_t uRight)
+{
+ int rc = rtBigNumUnscramble(pLeft);
+ if (RT_SUCCESS(rc))
+ {
+ if (!pLeft->fNegative)
+ {
+ if (pLeft->cUsed * RTBIGNUM_ELEMENT_SIZE <= sizeof(uRight))
+ {
+ if (pLeft->cUsed == 0)
+ rc = uRight == 0 ? 0 : -1;
+ else
+ {
+#if RTBIGNUM_ELEMENT_SIZE == 8
+ uint64_t uLeft = rtBigNumGetElement(pLeft, 0);
+ if (uLeft < uRight)
+ rc = -1;
+ else
+ rc = uLeft == uRight ? 0 : 1;
+#elif RTBIGNUM_ELEMENT_SIZE == 4
+ uint32_t uSubLeft = rtBigNumGetElement(pLeft, 1);
+ uint32_t uSubRight = uRight >> 32;
+ if (uSubLeft == uSubRight)
+ {
+ uSubLeft = rtBigNumGetElement(pLeft, 0);
+ uSubRight = (uint32_t)uRight;
+ }
+ if (uSubLeft < uSubRight)
+ rc = -1;
+ else
+ rc = uSubLeft == uSubRight ? 0 : 1;
+#else
+# error "Bad RTBIGNUM_ELEMENT_SIZE value"
+#endif
+ }
+ }
+ else
+ rc = 1;
+ }
+ else
+ rc = -1;
+ rtBigNumScramble(pLeft);
+ }
+ return rc;
+}
+
+
+RTDECL(int) RTBigNumCompareWithS64(PRTBIGNUM pLeft, int64_t iRight)
+{
+ int rc = rtBigNumUnscramble(pLeft);
+ if (RT_SUCCESS(rc))
+ {
+ if (pLeft->fNegative == (iRight < 0))
+ {
+ if (pLeft->cUsed * RTBIGNUM_ELEMENT_SIZE <= sizeof(iRight))
+ {
+ uint64_t uRightMagn = !pLeft->fNegative ? (uint64_t)iRight : (uint64_t)-iRight;
+#if RTBIGNUM_ELEMENT_SIZE == 8
+ uint64_t uLeft = rtBigNumGetElement(pLeft, 0);
+ if (uLeft < uRightMagn)
+ rc = -1;
+ else
+ rc = uLeft == (uint64_t)uRightMagn ? 0 : 1;
+#elif RTBIGNUM_ELEMENT_SIZE == 4
+ uint32_t uSubLeft = rtBigNumGetElement(pLeft, 1);
+ uint32_t uSubRight = uRightMagn >> 32;
+ if (uSubLeft == uSubRight)
+ {
+ uSubLeft = rtBigNumGetElement(pLeft, 0);
+ uSubRight = (uint32_t)uRightMagn;
+ }
+ if (uSubLeft < uSubRight)
+ rc = -1;
+ else
+ rc = uSubLeft == uSubRight ? 0 : 1;
+#else
+# error "Bad RTBIGNUM_ELEMENT_SIZE value"
+#endif
+ if (pLeft->fNegative)
+ rc = -rc;
+ }
+ else
+ rc = pLeft->fNegative ? -1 : 1;
+ }
+ else
+ rc = pLeft->fNegative ? -1 : 1;
+ rtBigNumScramble(pLeft);
+ }
+ return rc;
+}
+
+
+#define RTBIGNUMELEMENT_HALF_MASK ( ((RTBIGNUMELEMENT)1 << (RTBIGNUM_ELEMENT_BITS / 2)) - (RTBIGNUMELEMENT)1)
+#define RTBIGNUMELEMENT_LO_HALF(a_uElement) ( (RTBIGNUMELEMENT_HALF_MASK) & (a_uElement) )
+#define RTBIGNUMELEMENT_HI_HALF(a_uElement) ( (a_uElement) >> (RTBIGNUM_ELEMENT_BITS / 2) )
+
+
+/**
+ * Compares the magnitude values of two big numbers.
+ *
+ * @retval -1 if pLeft is smaller than pRight.
+ * @retval 0 if pLeft is equal to pRight.
+ * @retval 1 if pLeft is larger than pRight.
+ * @param pLeft The left side number.
+ * @param pRight The right side number.
+ */
+static int rtBigNumMagnitudeCompare(PCRTBIGNUM pLeft, PCRTBIGNUM pRight)
+{
+ Assert(!pLeft->fCurScrambled); Assert(!pRight->fCurScrambled);
+ int rc;
+ uint32_t i = pLeft->cUsed;
+ if (i == pRight->cUsed)
+ {
+ rc = 0;
+ while (i-- > 0)
+ if (pLeft->pauElements[i] != pRight->pauElements[i])
+ {
+ rc = pLeft->pauElements[i] < pRight->pauElements[i] ? -1 : 1;
+ break;
+ }
+ }
+ else
+ rc = i < pRight->cUsed ? -1 : 1;
+ return rc;
+}
+
+
+/**
+ * Does addition with carry.
+ *
+ * This is a candidate for inline assembly on some platforms.
+ *
+ * @returns The result (the sum)
+ * @param uAugend What to add to.
+ * @param uAddend What to add to it.
+ * @param pfCarry Where to read the input carry and return the output
+ * carry.
+ */
+DECLINLINE(RTBIGNUMELEMENT) rtBigNumElementAddWithCarry(RTBIGNUMELEMENT uAugend, RTBIGNUMELEMENT uAddend,
+ RTBIGNUMELEMENT *pfCarry)
+{
+ RTBIGNUMELEMENT uRet = uAugend + uAddend + *pfCarry;
+
+ /* Determin carry the expensive way. */
+ RTBIGNUMELEMENT uTmp = RTBIGNUMELEMENT_HI_HALF(uAugend) + RTBIGNUMELEMENT_HI_HALF(uAddend);
+ if (uTmp < RTBIGNUMELEMENT_HALF_MASK)
+ *pfCarry = 0;
+ else
+ *pfCarry = uTmp > RTBIGNUMELEMENT_HALF_MASK
+ || RTBIGNUMELEMENT_LO_HALF(uAugend) + RTBIGNUMELEMENT_LO_HALF(uAddend) + *pfCarry
+ > RTBIGNUMELEMENT_HALF_MASK;
+ return uRet;
+}
+
+
+/**
+ * Adds two magnitudes and stores them into a third.
+ *
+ * All variables must be unscrambled. The sign flag is not considered nor
+ * touched.
+ *
+ * @returns IPRT status code.
+ * @param pResult The resultant.
+ * @param pAugend To whom it shall be addede.
+ * @param pAddend The nombre to addede.
+ */
+static int rtBigNumMagnitudeAdd(PRTBIGNUM pResult, PCRTBIGNUM pAugend, PCRTBIGNUM pAddend)
+{
+ Assert(!pResult->fCurScrambled); Assert(!pAugend->fCurScrambled); Assert(!pAddend->fCurScrambled);
+ Assert(pResult != pAugend); Assert(pResult != pAddend);
+
+ uint32_t cElements = RT_MAX(pAugend->cUsed, pAddend->cUsed);
+ int rc = rtBigNumSetUsed(pResult, cElements);
+ if (RT_SUCCESS(rc))
+ {
+ /*
+ * The primitive way, requires at least two additions for each entry
+ * without machine code help.
+ */
+ RTBIGNUMELEMENT fCarry = 0;
+ for (uint32_t i = 0; i < cElements; i++)
+ pResult->pauElements[i] = rtBigNumElementAddWithCarry(rtBigNumGetElement(pAugend, i),
+ rtBigNumGetElement(pAddend, i),
+ &fCarry);
+ if (fCarry)
+ {
+ rc = rtBigNumSetUsed(pResult, cElements + 1);
+ if (RT_SUCCESS(rc))
+ pResult->pauElements[cElements++] = 1;
+ }
+ Assert(pResult->cUsed == cElements || RT_FAILURE_NP(rc));
+ }
+
+ return rc;
+}
+
+
+/**
+ * Does addition with borrow.
+ *
+ * This is a candidate for inline assembly on some platforms.
+ *
+ * @returns The result (the sum)
+ * @param uMinuend What to subtract from.
+ * @param uSubtrahend What to subtract.
+ * @param pfBorrow Where to read the input borrow and return the output
+ * borrow.
+ */
+DECLINLINE(RTBIGNUMELEMENT) rtBigNumElementSubWithBorrow(RTBIGNUMELEMENT uMinuend, RTBIGNUMELEMENT uSubtrahend,
+ RTBIGNUMELEMENT *pfBorrow)
+{
+ RTBIGNUMELEMENT uRet = uMinuend - uSubtrahend - *pfBorrow;
+
+ /* Figure out if we borrowed. */
+ *pfBorrow = !*pfBorrow ? uMinuend < uSubtrahend : uMinuend <= uSubtrahend;
+ return uRet;
+}
+
+
+/**
+ * Substracts a smaller (or equal) magnitude from another one and stores it into
+ * a third.
+ *
+ * All variables must be unscrambled. The sign flag is not considered nor
+ * touched. For this reason, the @a pMinuend must be larger or equal to @a
+ * pSubtrahend.
+ *
+ * @returns IPRT status code.
+ * @param pResult There to store the result.
+ * @param pMinuend What to subtract from.
+ * @param pSubtrahend What to subtract.
+ */
+static int rtBigNumMagnitudeSub(PRTBIGNUM pResult, PCRTBIGNUM pMinuend, PCRTBIGNUM pSubtrahend)
+{
+ Assert(!pResult->fCurScrambled); Assert(!pMinuend->fCurScrambled); Assert(!pSubtrahend->fCurScrambled);
+ Assert(pResult != pMinuend); Assert(pResult != pSubtrahend);
+ Assert(pMinuend->cUsed >= pSubtrahend->cUsed);
+
+ int rc = rtBigNumSetUsed(pResult, pMinuend->cUsed);
+ if (RT_SUCCESS(rc))
+ {
+ /*
+ * The primitive way, as usual.
+ */
+ RTBIGNUMELEMENT fBorrow = 0;
+ for (uint32_t i = 0; i < pMinuend->cUsed; i++)
+ pResult->pauElements[i] = rtBigNumElementSubWithBorrow(pMinuend->pauElements[i],
+ rtBigNumGetElement(pSubtrahend, i),
+ &fBorrow);
+ Assert(fBorrow == 0);
+
+ /*
+ * Trim the result.
+ */
+ rtBigNumStripTrailingZeros(pResult);
+ }
+
+ return rc;
+}
+
+
+/**
+ * Substracts a smaller (or equal) magnitude from another one and stores the
+ * result into the first.
+ *
+ * All variables must be unscrambled. The sign flag is not considered nor
+ * touched. For this reason, the @a pMinuendResult must be larger or equal to
+ * @a pSubtrahend.
+ *
+ * @param pMinuendResult What to subtract from and return as result.
+ * @param pSubtrahend What to subtract.
+ */
+static void rtBigNumMagnitudeSubThis(PRTBIGNUM pMinuendResult, PCRTBIGNUM pSubtrahend)
+{
+ Assert(!pMinuendResult->fCurScrambled); Assert(!pSubtrahend->fCurScrambled);
+ Assert(pMinuendResult != pSubtrahend);
+ Assert(pMinuendResult->cUsed >= pSubtrahend->cUsed);
+
+ /*
+ * The primitive way, as usual.
+ */
+ RTBIGNUMELEMENT fBorrow = 0;
+ for (uint32_t i = 0; i < pMinuendResult->cUsed; i++)
+ pMinuendResult->pauElements[i] = rtBigNumElementSubWithBorrow(pMinuendResult->pauElements[i],
+ rtBigNumGetElement(pSubtrahend, i),
+ &fBorrow);
+ Assert(fBorrow == 0);
+
+ /*
+ * Trim the result.
+ */
+ rtBigNumStripTrailingZeros(pMinuendResult);
+}
+
+
+RTDECL(int) RTBigNumAdd(PRTBIGNUM pResult, PCRTBIGNUM pAugend, PCRTBIGNUM pAddend)
+{
+ Assert(pResult != pAugend); Assert(pResult != pAddend);
+ AssertReturn(pResult->fSensitive >= (pAugend->fSensitive | pAddend->fSensitive), VERR_BIGNUM_SENSITIVE_INPUT);
+
+ int rc = rtBigNumUnscramble(pResult);
+ if (RT_SUCCESS(rc))
+ {
+ rc = rtBigNumUnscramble((PRTBIGNUM)pAugend);
+ if (RT_SUCCESS(rc))
+ {
+ rc = rtBigNumUnscramble((PRTBIGNUM)pAddend);
+ if (RT_SUCCESS(rc))
+ {
+ /*
+ * Same sign: Add magnitude, keep sign.
+ * 1 + 1 = 2
+ * (-1) + (-1) = -2
+ */
+ if (pAugend->fNegative == pAddend->fNegative)
+ {
+ pResult->fNegative = pAugend->fNegative;
+ rc = rtBigNumMagnitudeAdd(pResult, pAugend, pAddend);
+ }
+ /*
+ * Different sign: Subtract smaller from larger, keep sign of larger.
+ * (-5) + 3 = -2
+ * 5 + (-3) = 2
+ * (-1) + 3 = 2
+ * 1 + (-3) = -2
+ */
+ else if (rtBigNumMagnitudeCompare(pAugend, pAddend) >= 0)
+ {
+ pResult->fNegative = pAugend->fNegative;
+ rc = rtBigNumMagnitudeSub(pResult, pAugend, pAddend);
+ if (!pResult->cUsed)
+ pResult->fNegative = 0;
+ }
+ else
+ {
+ pResult->fNegative = pAddend->fNegative;
+ rc = rtBigNumMagnitudeSub(pResult, pAddend, pAugend);
+ }
+ rtBigNumScramble((PRTBIGNUM)pAddend);
+ }
+ rtBigNumScramble((PRTBIGNUM)pAugend);
+ }
+ rtBigNumScramble(pResult);
+ }
+ return rc;
+}
+
+
+RTDECL(int) RTBigNumSubtract(PRTBIGNUM pResult, PCRTBIGNUM pMinuend, PCRTBIGNUM pSubtrahend)
+{
+ Assert(pResult != pMinuend); Assert(pResult != pSubtrahend);
+ AssertReturn(pResult->fSensitive >= (pMinuend->fSensitive | pSubtrahend->fSensitive), VERR_BIGNUM_SENSITIVE_INPUT);
+
+ int rc = rtBigNumUnscramble(pResult);
+ if (RT_SUCCESS(rc))
+ {
+ if (pMinuend != pSubtrahend)
+ {
+ rc = rtBigNumUnscramble((PRTBIGNUM)pMinuend);
+ if (RT_SUCCESS(rc))
+ {
+ rc = rtBigNumUnscramble((PRTBIGNUM)pSubtrahend);
+ if (RT_SUCCESS(rc))
+ {
+ /*
+ * Different sign: Add magnitude, keep sign of first.
+ * 1 - (-2) == 3
+ * -1 - 2 == -3
+ */
+ if (pMinuend->fNegative != pSubtrahend->fNegative)
+ {
+ pResult->fNegative = pMinuend->fNegative;
+ rc = rtBigNumMagnitudeAdd(pResult, pMinuend, pSubtrahend);
+ }
+ /*
+ * Same sign, minuend has greater or equal absolute value: Subtract, keep sign of first.
+ * 10 - 7 = 3
+ */
+ else if (rtBigNumMagnitudeCompare(pMinuend, pSubtrahend) >= 0)
+ {
+ pResult->fNegative = pMinuend->fNegative;
+ rc = rtBigNumMagnitudeSub(pResult, pMinuend, pSubtrahend);
+ }
+ /*
+ * Same sign, subtrahend is larger: Reverse and subtract, invert sign of first.
+ * 7 - 10 = -3
+ * -1 - (-3) = 2
+ */
+ else
+ {
+ pResult->fNegative = !pMinuend->fNegative;
+ rc = rtBigNumMagnitudeSub(pResult, pSubtrahend, pMinuend);
+ }
+ rtBigNumScramble((PRTBIGNUM)pSubtrahend);
+ }
+ rtBigNumScramble((PRTBIGNUM)pMinuend);
+ }
+ }
+ else
+ {
+ /* zero. */
+ pResult->fNegative = 0;
+ pResult->cUsed = 0;
+ }
+ rtBigNumScramble(pResult);
+ }
+ return rc;
+}
+
+
+RTDECL(int) RTBigNumNegateThis(PRTBIGNUM pThis)
+{
+ pThis->fNegative = !pThis->fNegative;
+ return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTBigNumNegate(PRTBIGNUM pResult, PCRTBIGNUM pBigNum)
+{
+ int rc = RTBigNumAssign(pResult, pBigNum);
+ if (RT_SUCCESS(rc))
+ rc = RTBigNumNegateThis(pResult);
+ return rc;
+}
+
+
+/**
+ * Multiplies the magnitudes of two values, letting the caller care about the
+ * sign bit.
+ *
+ * @returns IPRT status code.
+ * @param pResult Where to store the result.
+ * @param pMultiplicand The first value.
+ * @param pMultiplier The second value.
+ */
+static int rtBigNumMagnitudeMultiply(PRTBIGNUM pResult, PCRTBIGNUM pMultiplicand, PCRTBIGNUM pMultiplier)
+{
+ Assert(pResult != pMultiplicand); Assert(pResult != pMultiplier);
+ Assert(!pResult->fCurScrambled); Assert(!pMultiplicand->fCurScrambled); Assert(!pMultiplier->fCurScrambled);
+
+ /*
+ * Multiplication involving zero is zero.
+ */
+ if (!pMultiplicand->cUsed || !pMultiplier->cUsed)
+ {
+ pResult->fNegative = 0;
+ pResult->cUsed = 0;
+ return VINF_SUCCESS;
+ }
+
+ /*
+ * Allocate a result array that is the sum of the two factors, initialize
+ * it to zero.
+ */
+ uint32_t cMax = pMultiplicand->cUsed + pMultiplier->cUsed;
+ int rc = rtBigNumSetUsed(pResult, cMax);
+ if (RT_SUCCESS(rc))
+ {
+ RT_BZERO(pResult->pauElements, pResult->cUsed * RTBIGNUM_ELEMENT_SIZE);
+
+ for (uint32_t i = 0; i < pMultiplier->cUsed; i++)
+ {
+ RTBIGNUMELEMENT uMultiplier = pMultiplier->pauElements[i];
+ for (uint32_t j = 0; j < pMultiplicand->cUsed; j++)
+ {
+ RTBIGNUMELEMENT uHi;
+ RTBIGNUMELEMENT uLo;
+#if RTBIGNUM_ELEMENT_SIZE == 4
+ uint64_t u64 = ASMMult2xU32RetU64(pMultiplicand->pauElements[j], uMultiplier);
+ uLo = (uint32_t)u64;
+ uHi = u64 >> 32;
+#elif RTBIGNUM_ELEMENT_SIZE == 8
+ uLo = ASMMult2xU64Ret2xU64(pMultiplicand->pauElements[j], uMultiplier, &uHi);
+#else
+# error "Invalid RTBIGNUM_ELEMENT_SIZE value"
+#endif
+ RTBIGNUMELEMENT fCarry = 0;
+ uint64_t k = i + j;
+ pResult->pauElements[k] = rtBigNumElementAddWithCarry(pResult->pauElements[k], uLo, &fCarry);
+ k++;
+ pResult->pauElements[k] = rtBigNumElementAddWithCarry(pResult->pauElements[k], uHi, &fCarry);
+ while (fCarry)
+ {
+ k++;
+ pResult->pauElements[k] = rtBigNumElementAddWithCarry(pResult->pauElements[k], 0, &fCarry);
+ }
+ Assert(k < cMax);
+ }
+ }
+
+ /* It's possible we overestimated the output size by 1 element. */
+ rtBigNumStripTrailingZeros(pResult);
+ }
+ return rc;
+}
+
+
+RTDECL(int) RTBigNumMultiply(PRTBIGNUM pResult, PCRTBIGNUM pMultiplicand, PCRTBIGNUM pMultiplier)
+{
+ Assert(pResult != pMultiplicand); Assert(pResult != pMultiplier);
+ AssertReturn(pResult->fSensitive >= (pMultiplicand->fSensitive | pMultiplier->fSensitive), VERR_BIGNUM_SENSITIVE_INPUT);
+
+ int rc = rtBigNumUnscramble(pResult);
+ if (RT_SUCCESS(rc))
+ {
+ rc = rtBigNumUnscramble((PRTBIGNUM)pMultiplicand);
+ if (RT_SUCCESS(rc))
+ {
+ rc = rtBigNumUnscramble((PRTBIGNUM)pMultiplier);
+ if (RT_SUCCESS(rc))
+ {
+ /*
+ * The sign values follow XOR rules:
+ * -1 * 1 = -1; 1 ^ 0 = 1
+ * 1 * -1 = -1; 1 ^ 0 = 1
+ * -1 * -1 = 1; 1 ^ 1 = 0
+ * 1 * 1 = 1; 0 ^ 0 = 0
+ */
+ pResult->fNegative = pMultiplicand->fNegative ^ pMultiplier->fNegative;
+ rc = rtBigNumMagnitudeMultiply(pResult, pMultiplicand, pMultiplier);
+
+ rtBigNumScramble((PRTBIGNUM)pMultiplier);
+ }
+ rtBigNumScramble((PRTBIGNUM)pMultiplicand);
+ }
+ rtBigNumScramble(pResult);
+ }
+ return rc;
+}
+
+
+/**
+ * Copies the magnitude of on number (@a pSrc) to another (@a pBigNum).
+ *
+ * The variables must be unscrambled. The sign flag is not considered nor
+ * touched.
+ *
+ * @returns IPRT status code.
+ * @param pDst The destination number.
+ * @param pSrc The source number.
+ */
+DECLINLINE(int) rtBigNumMagnitudeCopy(PRTBIGNUM pDst, PCRTBIGNUM pSrc)
+{
+ int rc = rtBigNumSetUsed(pDst, pSrc->cUsed);
+ if (RT_SUCCESS(rc))
+ memcpy(pDst->pauElements, pSrc->pauElements, pSrc->cUsed * RTBIGNUM_ELEMENT_SIZE);
+ return rc;
+}
+
+
+/**
+ * Clears a bit in the magnitude of @a pBigNum.
+ *
+ * The variables must be unscrambled.
+ *
+ * @param pBigNum The big number.
+ * @param iBit The bit to clear (0-based).
+ */
+DECLINLINE(void) rtBigNumMagnitudeClearBit(PRTBIGNUM pBigNum, uint32_t iBit)
+{
+ uint32_t iElement = iBit / RTBIGNUM_ELEMENT_BITS;
+ if (iElement < pBigNum->cUsed)
+ {
+ pBigNum->pauElements[iElement] &= ~RTBIGNUM_ELEMENT_BIT(iBit);
+ if (iElement + 1 == pBigNum->cUsed && !pBigNum->pauElements[iElement])
+ rtBigNumStripTrailingZeros(pBigNum);
+ }
+}
+
+
+/**
+ * Sets a bit in the magnitude of @a pBigNum.
+ *
+ * The variables must be unscrambled.
+ *
+ * @returns IPRT status code.
+ * @param pBigNum The big number.
+ * @param iBit The bit to clear (0-based).
+ */
+DECLINLINE(int) rtBigNumMagnitudeSetBit(PRTBIGNUM pBigNum, uint32_t iBit)
+{
+ uint32_t iElement = iBit / RTBIGNUM_ELEMENT_BITS;
+ int rc = rtBigNumEnsureElementPresent(pBigNum, iElement);
+ if (RT_SUCCESS(rc))
+ {
+ pBigNum->pauElements[iElement] |= RTBIGNUM_ELEMENT_BIT(iBit);
+ return VINF_SUCCESS;
+ }
+ return rc;
+}
+
+
+/**
+ * Writes a bit in the magnitude of @a pBigNum.
+ *
+ * The variables must be unscrambled.
+ *
+ * @returns IPRT status code.
+ * @param pBigNum The big number.
+ * @param iBit The bit to write (0-based).
+ * @param fValue The bit value.
+ */
+DECLINLINE(int) rtBigNumMagnitudeWriteBit(PRTBIGNUM pBigNum, uint32_t iBit, bool fValue)
+{
+ if (fValue)
+ return rtBigNumMagnitudeSetBit(pBigNum, iBit);
+ rtBigNumMagnitudeClearBit(pBigNum, iBit);
+ return VINF_SUCCESS;
+}
+
+
+/**
+ * Returns the given magnitude bit.
+ *
+ * The variables must be unscrambled.
+ *
+ * @returns The bit value (1 or 0).
+ * @param pBigNum The big number.
+ * @param iBit The bit to return (0-based).
+ */
+DECLINLINE(RTBIGNUMELEMENT) rtBigNumMagnitudeGetBit(PCRTBIGNUM pBigNum, uint32_t iBit)
+{
+ uint32_t iElement = iBit / RTBIGNUM_ELEMENT_BITS;
+ if (iElement < pBigNum->cUsed)
+ return (pBigNum->pauElements[iElement] >> iBit) & 1;
+ return 0;
+}
+
+
+/**
+ * Shifts the magnitude left by one.
+ *
+ * The variables must be unscrambled.
+ *
+ * @returns IPRT status code.
+ * @param pBigNum The big number.
+ * @param uCarry The value to shift in at the bottom.
+ */
+DECLINLINE(int) rtBigNumMagnitudeShiftLeftOne(PRTBIGNUM pBigNum, RTBIGNUMELEMENT uCarry)
+{
+ Assert(uCarry <= 1);
+
+ /* Do the shifting. */
+ uint32_t cUsed = pBigNum->cUsed;
+ for (uint32_t i = 0; i < cUsed; i++)
+ {
+ RTBIGNUMELEMENT uTmp = pBigNum->pauElements[i];
+ pBigNum->pauElements[i] = (uTmp << 1) | uCarry;
+ uCarry = uTmp >> (RTBIGNUM_ELEMENT_BITS - 1);
+ }
+
+ /* If we still carry a bit, we need to increase the size. */
+ if (uCarry)
+ {
+ int rc = rtBigNumSetUsed(pBigNum, cUsed + 1);
+ pBigNum->pauElements[cUsed] = uCarry;
+ }
+
+ return VINF_SUCCESS;
+}
+
+
+/**
+ * Divides the magnitudes of two values, letting the caller care about the sign
+ * bit.
+ *
+ * All variables must be unscrambled. The sign flag is not considered nor
+ * touched, this means the caller have to check for zero outputs.
+ *
+ * @returns IPRT status code.
+ * @param pQuotient Where to return the quotient.
+ * @param pRemainder Where to return the reminder.
+ * @param pDividend What to divide.
+ * @param pDivisor What to divide by.
+ */
+static int rtBigNumMagnitudeDivide(PRTBIGNUM pQuotient, PRTBIGNUM pRemainder, PCRTBIGNUM pDividend, PCRTBIGNUM pDivisor)
+{
+ Assert(pQuotient != pDividend); Assert(pQuotient != pDivisor); Assert(pRemainder != pDividend); Assert(pRemainder != pDivisor); Assert(pRemainder != pQuotient);
+ Assert(!pQuotient->fCurScrambled); Assert(!pRemainder->fCurScrambled); Assert(!pDividend->fCurScrambled); Assert(!pDivisor->fCurScrambled);
+
+ /*
+ * Just set both output values to zero as that's the return for several
+ * special case and the initial state of the general case.
+ */
+ pQuotient->cUsed = 0;
+ pRemainder->cUsed = 0;
+
+ /*
+ * Dividing something by zero is undefined.
+ * Diving zero by something is zero, unless the divsor is also zero.
+ */
+ if (!pDivisor->cUsed || !pDividend->cUsed)
+ return pDivisor->cUsed ? VINF_SUCCESS : VERR_BIGNUM_DIV_BY_ZERO;
+
+ /*
+ * Dividing by one? Quotient = dividend, no remainder.
+ */
+ if (pDivisor->cUsed == 1 && pDivisor->pauElements[0] == 1)
+ return rtBigNumMagnitudeCopy(pQuotient, pDividend);
+
+ /*
+ * Dividend smaller than the divisor. Zero quotient, all divisor.
+ */
+ int iDiff = rtBigNumMagnitudeCompare(pDividend, pDivisor);
+ if (iDiff < 0)
+ return rtBigNumMagnitudeCopy(pRemainder, pDividend);
+
+ /*
+ * Since we already have done the compare, check if the two values are the
+ * same. The result is 1 and no remainder then.
+ */
+ if (iDiff == 0)
+ {
+ int rc = rtBigNumSetUsed(pQuotient, 1);
+ if (RT_SUCCESS(rc))
+ pQuotient->pauElements[0] = 1;
+ return rc;
+ }
+
+ /*
+ * Do very simple long division. This ain't fast, but it does the trick.
+ */
+ int rc = VINF_SUCCESS;
+ uint32_t iBit = rtBigNumMagnitudeBitWidth(pDividend);
+ while (iBit-- > 0)
+ {
+ rc = rtBigNumMagnitudeShiftLeftOne(pRemainder, rtBigNumMagnitudeGetBit(pDividend, iBit));
+ AssertRCBreak(rc);
+ iDiff = rtBigNumMagnitudeCompare(pRemainder, pDivisor);
+ if (iDiff >= 0)
+ {
+ if (iDiff != 0)
+ rtBigNumMagnitudeSubThis(pRemainder, pDivisor);
+ else
+ pRemainder->cUsed = 0;
+ rc = rtBigNumMagnitudeSetBit(pQuotient, iBit);
+ AssertRCBreak(rc);
+ }
+ }
+
+ /* This shouldn't be necessary. */
+ rtBigNumStripTrailingZeros(pQuotient);
+ rtBigNumStripTrailingZeros(pRemainder);
+ return rc;
+}
+
+
+RTDECL(int) RTBigNumDivide(PRTBIGNUM pQuotient, PRTBIGNUM pRemainder, PCRTBIGNUM pDividend, PCRTBIGNUM pDivisor)
+{
+ Assert(pQuotient != pDividend); Assert(pQuotient != pDivisor); Assert(pRemainder != pDividend); Assert(pRemainder != pDivisor); Assert(pRemainder != pQuotient);
+ AssertReturn(pQuotient->fSensitive >= (pDividend->fSensitive | pDivisor->fSensitive), VERR_BIGNUM_SENSITIVE_INPUT);
+ AssertReturn(pRemainder->fSensitive >= (pDividend->fSensitive | pDivisor->fSensitive), VERR_BIGNUM_SENSITIVE_INPUT);
+
+ int rc = rtBigNumUnscramble(pQuotient);
+ if (RT_SUCCESS(rc))
+ {
+ rc = rtBigNumUnscramble(pRemainder);
+ if (RT_SUCCESS(rc))
+ {
+ rc = rtBigNumUnscramble((PRTBIGNUM)pDividend);
+ if (RT_SUCCESS(rc))
+ {
+ rc = rtBigNumUnscramble((PRTBIGNUM)pDivisor);
+ if (RT_SUCCESS(rc))
+ {
+ /*
+ * The sign value of the remainder is the same as the dividend.
+ * The sign values of the quotient follow XOR rules, just like multiplication:
+ * -3 / 2 = -1; r=-1; 1 ^ 0 = 1
+ * 3 / -2 = -1; r= 1; 1 ^ 0 = 1
+ * -3 / -2 = 1; r=-1; 1 ^ 1 = 0
+ * 3 / 2 = 1; r= 1; 0 ^ 0 = 0
+ */
+ pQuotient->fNegative = pDividend->fNegative ^ pDivisor->fNegative;
+ pRemainder->fNegative = pDividend->fNegative;
+
+ rc = rtBigNumMagnitudeDivide(pQuotient, pRemainder, pDividend, pDivisor);
+
+ if (pQuotient->cUsed == 0)
+ pQuotient->fNegative = 0;
+ if (pRemainder->cUsed == 0)
+ pRemainder->fNegative = 0;
+
+ rtBigNumScramble((PRTBIGNUM)pDivisor);
+ }
+ rtBigNumScramble((PRTBIGNUM)pDividend);
+ }
+ rtBigNumScramble(pRemainder);
+ }
+ rtBigNumScramble(pQuotient);
+ }
+ return rc;
+}
+
+
+/**
+ * Calculates the modulus of a magnitude value, leaving the sign bit to the
+ * caller.
+ *
+ * All variables must be unscrambled. The sign flag is not considered nor
+ * touched, this means the caller have to check for zero outputs.
+ *
+ * @returns IPRT status code.
+ * @param pRemainder Where to return the reminder.
+ * @param pDividend What to divide.
+ * @param pDivisor What to divide by.
+ */
+static int rtBigNumMagnitudeModulo(PRTBIGNUM pRemainder, PCRTBIGNUM pDividend, PCRTBIGNUM pDivisor)
+{
+ Assert(pRemainder != pDividend); Assert(pRemainder != pDivisor);
+ Assert(!pRemainder->fCurScrambled); Assert(!pDividend->fCurScrambled); Assert(!pDivisor->fCurScrambled);
+
+ /*
+ * Just set the output value to zero as that's the return for several
+ * special case and the initial state of the general case.
+ */
+ pRemainder->cUsed = 0;
+
+ /*
+ * Dividing something by zero is undefined.
+ * Diving zero by something is zero, unless the divsor is also zero.
+ */
+ if (!pDivisor->cUsed || !pDividend->cUsed)
+ return pDivisor->cUsed ? VINF_SUCCESS : VERR_BIGNUM_DIV_BY_ZERO;
+
+ /*
+ * Dividing by one? Quotient = dividend, no remainder.
+ */
+ if (pDivisor->cUsed == 1 && pDivisor->pauElements[0] == 1)
+ return VINF_SUCCESS;
+
+ /*
+ * Dividend smaller than the divisor. Zero quotient, all divisor.
+ */
+ int iDiff = rtBigNumMagnitudeCompare(pDividend, pDivisor);
+ if (iDiff < 0)
+ return rtBigNumMagnitudeCopy(pRemainder, pDividend);
+
+ /*
+ * Since we already have done the compare, check if the two values are the
+ * same. The result is 1 and no remainder then.
+ */
+ if (iDiff == 0)
+ return VINF_SUCCESS;
+
+ /*
+ * Do very simple long division. This ain't fast, but it does the trick.
+ */
+ int rc = VINF_SUCCESS;
+ uint32_t iBit = rtBigNumMagnitudeBitWidth(pDividend);
+ while (iBit-- > 0)
+ {
+ rc = rtBigNumMagnitudeShiftLeftOne(pRemainder, rtBigNumMagnitudeGetBit(pDividend, iBit));
+ AssertRCBreak(rc);
+ iDiff = rtBigNumMagnitudeCompare(pRemainder, pDivisor);
+ if (iDiff >= 0)
+ {
+ if (iDiff != 0)
+ rtBigNumMagnitudeSubThis(pRemainder, pDivisor);
+ else
+ pRemainder->cUsed = 0;
+ AssertRCBreak(rc);
+ }
+ }
+
+ /* This shouldn't be necessary. */
+ rtBigNumStripTrailingZeros(pRemainder);
+ return rc;
+}
+
+
+RTDECL(int) RTBigNumModulo(PRTBIGNUM pRemainder, PCRTBIGNUM pDividend, PCRTBIGNUM pDivisor)
+{
+ Assert(pRemainder != pDividend); Assert(pRemainder != pDivisor);
+ AssertReturn(pRemainder->fSensitive >= (pDividend->fSensitive | pDivisor->fSensitive), VERR_BIGNUM_SENSITIVE_INPUT);
+
+ int rc = rtBigNumUnscramble(pRemainder);
+ if (RT_SUCCESS(rc))
+ {
+ rc = rtBigNumUnscramble((PRTBIGNUM)pDividend);
+ if (RT_SUCCESS(rc))
+ {
+ rc = rtBigNumUnscramble((PRTBIGNUM)pDivisor);
+ if (RT_SUCCESS(rc))
+ {
+ /*
+ * The sign value of the remainder is the same as the dividend.
+ */
+ pRemainder->fNegative = pDividend->fNegative;
+
+ rc = rtBigNumMagnitudeModulo(pRemainder, pDividend, pDivisor);
+
+ if (pRemainder->cUsed == 0)
+ pRemainder->fNegative = 0;
+
+ rtBigNumScramble((PRTBIGNUM)pDivisor);
+ }
+ rtBigNumScramble((PRTBIGNUM)pDividend);
+ }
+ rtBigNumScramble(pRemainder);
+ }
+ return rc;
+}
+
+
+
+/**
+ * Exponentiate the magnitude.
+ *
+ * All variables must be unscrambled. The sign flag is not considered nor
+ * touched, this means the caller have to reject negative exponents.
+ *
+ * @returns IPRT status code.
+ * @param pResult Where to return power.
+ * @param pBase The base value.
+ * @param pExponent The exponent (assumed positive or zero).
+ */
+static int rtBigNumMagnitudeExponentiate(PRTBIGNUM pResult, PCRTBIGNUM pBase, PCRTBIGNUM pExponent)
+{
+ Assert(pResult != pBase); Assert(pResult != pExponent);
+ Assert(!pResult->fCurScrambled); Assert(!pBase->fCurScrambled); Assert(!pExponent->fCurScrambled);
+
+ /*
+ * A couple of special cases.
+ */
+ int rc;
+ /* base ^ 0 => 1. */
+ if (pExponent->cUsed == 0)
+ {
+ rc = rtBigNumSetUsed(pResult, 1);
+ if (RT_SUCCESS(rc))
+ pResult->pauElements[0] = 1;
+ return rc;
+ }
+
+ /* base ^ 1 => base. */
+ if (pExponent->cUsed == 1 && pExponent->pauElements[0] == 1)
+ return rtBigNumMagnitudeCopy(pResult, pBase);
+
+ /*
+ * Set up.
+ */
+ /* Init temporary power-of-two variable to base. */
+ RTBIGNUM Pow2;
+ rc = rtBigNumCloneInternal(&Pow2, pBase);
+ if (RT_SUCCESS(rc))
+ {
+ /* Init result to 1. */
+ rc = rtBigNumSetUsed(pResult, 1);
+ if (RT_SUCCESS(rc))
+ {
+ pResult->pauElements[0] = 1;
+
+ /* Make a temporary variable that we can use for temporary storage of the result. */
+ RTBIGNUM TmpMultiplicand;
+ rc = rtBigNumCloneInternal(&TmpMultiplicand, pResult);
+ if (RT_SUCCESS(rc))
+ {
+ /*
+ * Exponentiation by squaring. Reduces the number of
+ * multiplications to: NumBitsSet(Exponent) + BitWidth(Exponent).
+ */
+ uint32_t const cExpBits = rtBigNumMagnitudeBitWidth(pExponent);
+ uint32_t iBit = 0;
+ for (;;)
+ {
+ if (rtBigNumMagnitudeGetBit(pExponent, iBit) != 0)
+ {
+ rc = rtBigNumMagnitudeCopy(&TmpMultiplicand, pResult);
+ if (RT_SUCCESS(rc))
+ rc = rtBigNumMagnitudeMultiply(pResult, &TmpMultiplicand, &Pow2);
+ if (RT_FAILURE(rc))
+ break;
+ }
+
+ /* Done? */
+ iBit++;
+ if (iBit >= cExpBits)
+ break;
+
+ /* Not done yet, square the base again. */
+ rc = rtBigNumMagnitudeCopy(&TmpMultiplicand, &Pow2);
+ if (RT_SUCCESS(rc))
+ rc = rtBigNumMagnitudeMultiply(&Pow2, &TmpMultiplicand, &TmpMultiplicand);
+ if (RT_FAILURE(rc))
+ break;
+ }
+ }
+ }
+ RTBigNumDestroy(&Pow2);
+ }
+ return rc;
+}
+
+
+RTDECL(int) RTBigNumExponentiate(PRTBIGNUM pResult, PCRTBIGNUM pBase, PCRTBIGNUM pExponent)
+{
+ Assert(pResult != pBase); Assert(pResult != pExponent);
+ AssertReturn(pResult->fSensitive >= (pBase->fSensitive | pExponent->fSensitive), VERR_BIGNUM_SENSITIVE_INPUT);
+
+ int rc = rtBigNumUnscramble(pResult);
+ if (RT_SUCCESS(rc))
+ {
+ rc = rtBigNumUnscramble((PRTBIGNUM)pBase);
+ if (RT_SUCCESS(rc))
+ {
+ rc = rtBigNumUnscramble((PRTBIGNUM)pExponent);
+ if (RT_SUCCESS(rc))
+ {
+ if (!pExponent->fNegative)
+ {
+ pResult->fNegative = pBase->fNegative; /* sign unchanged. */
+ rc = rtBigNumMagnitudeExponentiate(pResult, pBase, pExponent);
+ }
+ else
+ rc = VERR_BIGNUM_NEGATIVE_EXPONENT;
+
+ rtBigNumScramble((PRTBIGNUM)pExponent);
+ }
+ rtBigNumScramble((PRTBIGNUM)pBase);
+ }
+ rtBigNumScramble(pResult);
+ }
+ return rc;
+}
+
+
+/**
+ * Modular exponentiation, magnitudes only.
+ *
+ * All variables must be unscrambled. The sign flag is not considered nor
+ * touched, this means the caller have to reject negative exponents and do any
+ * other necessary sign bit fiddling.
+ *
+ * @returns IPRT status code.
+ * @param pResult Where to return the remainder of the power.
+ * @param pBase The base value.
+ * @param pExponent The exponent (assumed positive or zero).
+ * @param pModulus The modulus value (or divisor if you like).
+ */
+static int rtBigNumMagnitudeModExp(PRTBIGNUM pResult, PRTBIGNUM pBase, PRTBIGNUM pExponent, PRTBIGNUM pModulus)
+{
+ Assert(pResult != pBase); Assert(pResult != pBase); Assert(pResult != pExponent); Assert(pResult != pModulus);
+ Assert(!pResult->fCurScrambled); Assert(!pBase->fCurScrambled); Assert(!pExponent->fCurScrambled); Assert(!pModulus->fCurScrambled);
+ int rc;
+
+ /*
+ * Check some special cases to get them out of the way.
+ */
+ /* Div by 0 => invalid. */
+ if (pModulus->cUsed == 0)
+ return VERR_BIGNUM_DIV_BY_ZERO;
+
+ /* Div by 1 => no remainder. */
+ if (pModulus->cUsed == 1 && pModulus->pauElements[0] == 1)
+ {
+ pResult->cUsed = 0;
+ return VINF_SUCCESS;
+ }
+
+ /* base ^ 0 => 1. */
+ if (pExponent->cUsed == 0)
+ {
+ rc = rtBigNumSetUsed(pResult, 1);
+ if (RT_SUCCESS(rc))
+ pResult->pauElements[0] = 1;
+ return rc;
+ }
+
+ /* base ^ 1 => base. */
+ if (pExponent->cUsed == 1 && pExponent->pauElements[0] == 1)
+ return rtBigNumMagnitudeModulo(pResult, pBase, pModulus);
+
+ /*
+ * Set up.
+ */
+ /* Result = 1; preallocate space for the result while at it. */
+ rc = rtBigNumSetUsed(pResult, pModulus->cUsed + 1);
+ if (RT_SUCCESS(rc))
+ rc = rtBigNumSetUsed(pResult, 1);
+ if (RT_SUCCESS(rc))
+ {
+ pResult->pauElements[0] = 1;
+
+ /* ModBase = pBase or pBase % pModulus depending on the difference in size. */
+ RTBIGNUM Pow2;
+ if (pBase->cUsed <= pModulus->cUsed + pModulus->cUsed / 2)
+ rc = rtBigNumCloneInternal(&Pow2, pBase);
+ else
+ rc = rtBigNumMagnitudeModulo(rtBigNumInitZeroTemplate(&Pow2, pBase), pBase, pModulus);
+
+ /* Need a couple of temporary variables. */
+ RTBIGNUM TmpMultiplicand;
+ rtBigNumInitZeroTemplate(&TmpMultiplicand, pResult);
+
+ RTBIGNUM TmpProduct;
+ rtBigNumInitZeroTemplate(&TmpProduct, pResult);
+
+ /*
+ * We combine the exponentiation by squaring with the fact that:
+ * (a*b) mod n = ( (a mod n) * (b mod n) ) mod n
+ *
+ * Thus, we can reduce the size of intermediate results by mod'ing them
+ * in each step.
+ */
+ uint32_t const cExpBits = rtBigNumMagnitudeBitWidth(pExponent);
+ uint32_t iBit = 0;
+ for (;;)
+ {
+ if (rtBigNumMagnitudeGetBit(pExponent, iBit) != 0)
+ {
+ rc = rtBigNumMagnitudeCopy(&TmpMultiplicand, pResult);
+ if (RT_SUCCESS(rc))
+ rc = rtBigNumMagnitudeMultiply(&TmpProduct, &TmpMultiplicand, &Pow2);
+ if (RT_SUCCESS(rc))
+ rc = rtBigNumMagnitudeModulo(pResult, &TmpProduct, pModulus);
+ if (RT_FAILURE(rc))
+ break;
+ }
+
+ /* Done? */
+ iBit++;
+ if (iBit >= cExpBits)
+ break;
+
+ /* Not done yet, square and mod the base again. */
+ rc = rtBigNumMagnitudeCopy(&TmpMultiplicand, &Pow2);
+ if (RT_SUCCESS(rc))
+ rc = rtBigNumMagnitudeMultiply(&TmpProduct, &TmpMultiplicand, &TmpMultiplicand);
+ if (RT_SUCCESS(rc))
+ rc = rtBigNumMagnitudeModulo(&Pow2, &TmpProduct, pModulus);
+ if (RT_FAILURE(rc))
+ break;
+ }
+
+ RTBigNumDestroy(&TmpMultiplicand);
+ RTBigNumDestroy(&TmpProduct);
+ RTBigNumDestroy(&Pow2);
+ }
+ return rc;
+}
+
+
+RTDECL(int) RTBigNumModExp(PRTBIGNUM pResult, PRTBIGNUM pBase, PRTBIGNUM pExponent, PRTBIGNUM pModulus)
+{
+ Assert(pResult != pBase); Assert(pResult != pBase); Assert(pResult != pExponent); Assert(pResult != pModulus);
+ AssertReturn(pResult->fSensitive >= (pBase->fSensitive | pExponent->fSensitive | pModulus->fSensitive),
+ VERR_BIGNUM_SENSITIVE_INPUT);
+
+ int rc = rtBigNumUnscramble(pResult);
+ if (RT_SUCCESS(rc))
+ {
+ rc = rtBigNumUnscramble((PRTBIGNUM)pBase);
+ if (RT_SUCCESS(rc))
+ {
+ rc = rtBigNumUnscramble((PRTBIGNUM)pExponent);
+ if (RT_SUCCESS(rc))
+ {
+ rc = rtBigNumUnscramble((PRTBIGNUM)pModulus);
+ if (RT_SUCCESS(rc))
+ {
+ if (!pExponent->fNegative)
+ {
+ pResult->fNegative = pModulus->fNegative; /* pBase ^ pExponent / pModulus; result = remainder. */
+ rc = rtBigNumMagnitudeModExp(pResult, pBase, pExponent, pModulus);
+ }
+ else
+ rc = VERR_BIGNUM_NEGATIVE_EXPONENT;
+ rtBigNumScramble((PRTBIGNUM)pModulus);
+ }
+ rtBigNumScramble((PRTBIGNUM)pExponent);
+ }
+ rtBigNumScramble((PRTBIGNUM)pBase);
+ }
+ rtBigNumScramble(pResult);
+ }
+ return rc;
+}
+
diff --git a/src/VBox/Runtime/common/misc/sg.cpp b/src/VBox/Runtime/common/misc/sg.cpp
index 596c3eb1f20..c89351a6752 100644
--- a/src/VBox/Runtime/common/misc/sg.cpp
+++ b/src/VBox/Runtime/common/misc/sg.cpp
@@ -47,12 +47,14 @@ static void *sgBufGet(PRTSGBUF pSgBuf, size_t *pcbData)
return NULL;
}
+#ifndef RDESKTOP
AssertReleaseMsg( pSgBuf->cbSegLeft <= 32 * _1M
&& (uintptr_t)pSgBuf->pvSegCur >= (uintptr_t)pSgBuf->paSegs[pSgBuf->idxSeg].pvSeg
&& (uintptr_t)pSgBuf->pvSegCur + pSgBuf->cbSegLeft <= (uintptr_t)pSgBuf->paSegs[pSgBuf->idxSeg].pvSeg + pSgBuf->paSegs[pSgBuf->idxSeg].cbSeg,
("pSgBuf->idxSeg=%d pSgBuf->cSegs=%d pSgBuf->pvSegCur=%p pSgBuf->cbSegLeft=%zd pSgBuf->paSegs[%d].pvSeg=%p pSgBuf->paSegs[%d].cbSeg=%zd\n",
pSgBuf->idxSeg, pSgBuf->cSegs, pSgBuf->pvSegCur, pSgBuf->cbSegLeft,
pSgBuf->idxSeg, pSgBuf->paSegs[pSgBuf->idxSeg].pvSeg, pSgBuf->idxSeg, pSgBuf->paSegs[pSgBuf->idxSeg].cbSeg));
+#endif
cbData = RT_MIN(*pcbData, pSgBuf->cbSegLeft);
pvBuf = pSgBuf->pvSegCur;
diff --git a/src/VBox/Runtime/common/string/RTStrPrintHexBytes.cpp b/src/VBox/Runtime/common/string/RTStrPrintHexBytes.cpp
index c0b5a58ebe1..3e7b77cce73 100644
--- a/src/VBox/Runtime/common/string/RTStrPrintHexBytes.cpp
+++ b/src/VBox/Runtime/common/string/RTStrPrintHexBytes.cpp
@@ -4,7 +4,7 @@
*/
/*
- * Copyright (C) 2009-2010 Oracle Corporation
+ * Copyright (C) 2009-2014 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
@@ -37,20 +37,23 @@
RTDECL(int) RTStrPrintHexBytes(char *pszBuf, size_t cchBuf, void const *pv, size_t cb, uint32_t fFlags)
{
- AssertReturn(!fFlags, VERR_INVALID_PARAMETER);
+ AssertReturn(!(fFlags & ~RTSTRPRINTHEXBYTES_F_UPPER), VERR_INVALID_PARAMETER);
AssertPtrReturn(pszBuf, VERR_INVALID_POINTER);
AssertReturn(cb * 2 >= cb, VERR_BUFFER_OVERFLOW);
AssertReturn(cchBuf >= cb * 2 + 1, VERR_BUFFER_OVERFLOW);
if (cb)
AssertPtrReturn(pv, VERR_INVALID_POINTER);
+ static char const s_szHexDigitsLower[17] = "0123456789abcdef";
+ static char const s_szHexDigitsUpper[17] = "0123456789ABCDEF";
+ const char *pszHexDigits = !(fFlags & RTSTRPRINTHEXBYTES_F_UPPER) ? s_szHexDigitsLower : s_szHexDigitsUpper;
+
uint8_t const *pb = (uint8_t const *)pv;
while (cb-- > 0)
{
- static char const s_szHexDigits[17] = "0123456789abcdef";
uint8_t b = *pb++;
- *pszBuf++ = s_szHexDigits[b >> 4];
- *pszBuf++ = s_szHexDigits[b & 0xf];
+ *pszBuf++ = pszHexDigits[b >> 4];
+ *pszBuf++ = pszHexDigits[b & 0xf];
}
*pszBuf = '\0';
return VINF_SUCCESS;
diff --git a/src/VBox/Runtime/common/string/RTUtf16Cat.cpp b/src/VBox/Runtime/common/string/RTUtf16Cat.cpp
new file mode 100644
index 00000000000..8f4a2b21f87
--- /dev/null
+++ b/src/VBox/Runtime/common/string/RTUtf16Cat.cpp
@@ -0,0 +1,42 @@
+/* $Id$ */
+/** @file
+ * IPRT - RTUtf16Cat.
+ */
+
+/*
+ * Copyright (C) 2010-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include <iprt/string.h>
+#include "internal/iprt.h"
+
+
+RTDECL(int) RTUtf16Cat(PRTUTF16 pwszDst, size_t cwcDst, PCRTUTF16 pwszSrc)
+{
+ PRTUTF16 pwszDst2 = (PRTUTF16)RTUtf16End(pwszDst, cwcDst);
+ AssertReturn(pwszDst2, VERR_INVALID_PARAMETER);
+ return RTUtf16Copy(pwszDst2, cwcDst - (pwszDst2 - pwszDst), pwszSrc);
+}
+RT_EXPORT_SYMBOL(RTUtf16Cat);
+
diff --git a/src/VBox/Runtime/common/string/RTUtf16CatAscii.cpp b/src/VBox/Runtime/common/string/RTUtf16CatAscii.cpp
new file mode 100644
index 00000000000..8a28bd6b598
--- /dev/null
+++ b/src/VBox/Runtime/common/string/RTUtf16CatAscii.cpp
@@ -0,0 +1,42 @@
+/* $Id$ */
+/** @file
+ * IPRT - RTUtf16CatAscii.
+ */
+
+/*
+ * Copyright (C) 2010-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include <iprt/string.h>
+#include "internal/iprt.h"
+
+
+RTDECL(int) RTUtf16CatAscii(PRTUTF16 pwszDst, size_t cwcDst, const char *pszSrc)
+{
+ PRTUTF16 pwszDst2 = (PRTUTF16)RTUtf16End(pwszDst, cwcDst);
+ AssertReturn(pwszDst2, VERR_INVALID_PARAMETER);
+ return RTUtf16CopyAscii(pwszDst2, cwcDst - (pwszDst2 - pwszDst), pszSrc);
+}
+RT_EXPORT_SYMBOL(RTUtf16CatAscii);
+
diff --git a/src/VBox/Runtime/common/string/RTUtf16CmpAscii.cpp b/src/VBox/Runtime/common/string/RTUtf16CmpAscii.cpp
new file mode 100644
index 00000000000..93d08c15ea7
--- /dev/null
+++ b/src/VBox/Runtime/common/string/RTUtf16CmpAscii.cpp
@@ -0,0 +1,50 @@
+/* $Id$ */
+/** @file
+ * IPRT - RTUtf16CmpAscii.
+ */
+
+/*
+ * Copyright (C) 2010-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include <iprt/string.h>
+#include "internal/iprt.h"
+
+#include <iprt/assert.h>
+
+
+RTDECL(int) RTUtf16CmpAscii(PCRTUTF16 pwsz1, const char *psz2)
+{
+ for (;;)
+ {
+ RTUTF16 wc1 = *pwsz1++;
+ unsigned char uch2 = *psz2++; Assert(uch2 < 0x80);
+ if (wc1 != uch2)
+ return wc1 < uch2 ? -1 : 1;
+ if (!uch2)
+ return 0;
+ }
+}
+RT_EXPORT_SYMBOL(RTUtf16ICmpAscii);
+
diff --git a/src/VBox/Runtime/common/string/RTUtf16Copy.cpp b/src/VBox/Runtime/common/string/RTUtf16Copy.cpp
new file mode 100644
index 00000000000..10d513d0c0c
--- /dev/null
+++ b/src/VBox/Runtime/common/string/RTUtf16Copy.cpp
@@ -0,0 +1,52 @@
+/* $Id$ */
+/** @file
+ * IPRT - RTUtf16Copy.
+ */
+
+/*
+ * Copyright (C) 2010-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include <iprt/string.h>
+#include "internal/iprt.h"
+
+
+RTDECL(int) RTUtf16Copy(PRTUTF16 pwszDst, size_t cwcDst, PCRTUTF16 pwszSrc)
+{
+ size_t wcwSrc = RTUtf16Len(pwszSrc);
+ if (RT_LIKELY(wcwSrc < cwcDst))
+ {
+ memcpy(pwszDst, pwszSrc, wcwSrc + 1);
+ return VINF_SUCCESS;
+ }
+
+ if (cwcDst != 0)
+ {
+ memcpy(pwszDst, pwszSrc, cwcDst - 1);
+ pwszDst[cwcDst - 1] = '\0';
+ }
+ return VERR_BUFFER_OVERFLOW;
+}
+RT_EXPORT_SYMBOL(RTUtf16Copy);
+
diff --git a/src/VBox/Runtime/common/string/RTUtf16CopyAscii.cpp b/src/VBox/Runtime/common/string/RTUtf16CopyAscii.cpp
new file mode 100644
index 00000000000..117fed16d9f
--- /dev/null
+++ b/src/VBox/Runtime/common/string/RTUtf16CopyAscii.cpp
@@ -0,0 +1,70 @@
+/* $Id$ */
+/** @file
+ * IPRT - RTUtf16CopyAscii.
+ */
+
+/*
+ * Copyright (C) 2010-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include <iprt/string.h>
+#include "internal/iprt.h"
+
+
+RTDECL(int) RTUtf16CopyAscii(PRTUTF16 pwszDst, size_t cwcDst, const char *pszSrc)
+{
+ int rc;
+ size_t cchSrc = strlen(pszSrc);
+ size_t cchCopy;
+ if (RT_LIKELY(cchSrc < cwcDst))
+ {
+ rc = VINF_SUCCESS;
+ cchCopy = cchSrc;
+ }
+ else if (cwcDst != 0)
+ {
+ rc = VERR_BUFFER_OVERFLOW;
+ cchSrc = cwcDst - 1;
+ }
+ else
+ return VERR_BUFFER_OVERFLOW;
+
+ pwszDst[cchCopy] = '\0';
+ while (cchCopy-- > 0)
+ {
+ unsigned char ch = pszSrc[cchCopy];
+ if (RT_LIKELY(ch < 0x80))
+ pwszDst[cchCopy] = ch;
+ else
+ {
+ AssertMsgFailed(("ch=%#x\n", ch));
+ pwszDst[cchCopy] = 0x7f;
+ if (rc == VINF_SUCCESS)
+ rc = VERR_OUT_OF_RANGE;
+ }
+ }
+ return rc;
+}
+RT_EXPORT_SYMBOL(RTUtf16CopyAscii);
+
diff --git a/src/VBox/Runtime/common/string/RTUtf16End.cpp b/src/VBox/Runtime/common/string/RTUtf16End.cpp
new file mode 100644
index 00000000000..ec30413ee05
--- /dev/null
+++ b/src/VBox/Runtime/common/string/RTUtf16End.cpp
@@ -0,0 +1,46 @@
+/* $Id$ */
+/** @file
+ * IPRT - RTUtf16End.
+ */
+
+/*
+ * Copyright (C) 2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include <iprt/string.h>
+#include "internal/iprt.h"
+
+
+RTDECL(PCRTUTF16) RTUtf16End(PCRTUTF16 pwszString, size_t cwcMax)
+{
+ while (cwcMax-- > 0)
+ {
+ if (!*pwszString)
+ return pwszString;
+ pwszString++;
+ }
+ return NULL;
+}
+RT_EXPORT_SYMBOL(RTUtf16Cat);
+
diff --git a/src/VBox/Runtime/common/string/RTUtf16ICmpAscii.cpp b/src/VBox/Runtime/common/string/RTUtf16ICmpAscii.cpp
new file mode 100644
index 00000000000..805baeab1d3
--- /dev/null
+++ b/src/VBox/Runtime/common/string/RTUtf16ICmpAscii.cpp
@@ -0,0 +1,56 @@
+/* $Id$ */
+/** @file
+ * IPRT - RTUtf16ICmpAscii.
+ */
+
+/*
+ * Copyright (C) 2010-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include <iprt/string.h>
+#include "internal/iprt.h"
+
+#include <iprt/assert.h>
+#include <iprt/ctype.h>
+
+
+RTDECL(int) RTUtf16ICmpAscii(PCRTUTF16 pwsz1, const char *psz2)
+{
+ for (;;)
+ {
+ RTUTF16 wc1 = *pwsz1++;
+ unsigned char uch2 = *psz2++; Assert(uch2 < 0x80);
+ if (wc1 != uch2)
+ {
+ if (wc1 >= 0x80)
+ return 1;
+ if (RT_C_TO_LOWER(wc1) != RT_C_TO_LOWER(uch2))
+ return wc1 < uch2 ? -1 : 1;
+ }
+ if (!uch2)
+ return 0;
+ }
+}
+RT_EXPORT_SYMBOL(RTUtf16ICmpAscii);
+
diff --git a/src/VBox/Runtime/common/string/RTUtf16NLen.cpp b/src/VBox/Runtime/common/string/RTUtf16NLen.cpp
new file mode 100644
index 00000000000..4c417c32cf9
--- /dev/null
+++ b/src/VBox/Runtime/common/string/RTUtf16NLen.cpp
@@ -0,0 +1,43 @@
+/* $Id$ */
+/** @file
+ * IPRT - RTUtf16NLen.
+ */
+
+/*
+ * Copyright (C) 2008-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include <iprt/string.h>
+#include "internal/iprt.h"
+
+
+RTDECL(size_t) RTUtf16NLen(PCRTUTF16 pwszString, size_t cwcMax)
+{
+ PCRTUTF16 pwszStart = pwszString;
+ while (cwcMax-- > 0 && pwszString != '\0')
+ pwszString++;
+ return pwszString - pwszStart;
+}
+RT_EXPORT_SYMBOL(RTUtf16NLen);
+
diff --git a/src/VBox/Runtime/common/string/RTUtf16NLenEx.cpp b/src/VBox/Runtime/common/string/RTUtf16NLenEx.cpp
new file mode 100644
index 00000000000..8359b34e1d3
--- /dev/null
+++ b/src/VBox/Runtime/common/string/RTUtf16NLenEx.cpp
@@ -0,0 +1,46 @@
+/* $Id$ */
+/** @file
+ * IPRT - RTUtf16NLenEx.
+ */
+
+/*
+ * Copyright (C) 2008-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include <iprt/string.h>
+#include "internal/iprt.h"
+
+
+RTDECL(int) RTUtf16NLenEx(PCRTUTF16 pwszString, size_t cwcMax, size_t *pcwc)
+{
+ PCRTUTF16 pwcEnd = RTUtf16End(pwszString, cwcMax);
+ if (!pwcEnd)
+ {
+ *pcwc = cwcMax;
+ return VERR_BUFFER_OVERFLOW;
+ }
+ *pcwc = pwcEnd - pwszString;
+ return VINF_SUCCESS;
+}
+RT_EXPORT_SYMBOL(RTUtf16NLenEx);
+
diff --git a/src/VBox/Runtime/common/string/RTUtf16PrintHexBytes.cpp b/src/VBox/Runtime/common/string/RTUtf16PrintHexBytes.cpp
new file mode 100644
index 00000000000..08c77bab84d
--- /dev/null
+++ b/src/VBox/Runtime/common/string/RTUtf16PrintHexBytes.cpp
@@ -0,0 +1,61 @@
+/* $Id$ */
+/** @file
+ * IPRT - RTUtf16PrintHexBytes.
+ */
+
+/*
+ * Copyright (C) 2009-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/string.h>
+
+#include <iprt/assert.h>
+#include <iprt/err.h>
+
+
+RTDECL(int) RTUtf16PrintHexBytes(PRTUTF16 pwszBuf, size_t cwcBuf, void const *pv, size_t cb, uint32_t fFlags)
+{
+ AssertReturn(!(fFlags & ~RTSTRPRINTHEXBYTES_F_UPPER), VERR_INVALID_PARAMETER);
+ AssertPtrReturn(pwszBuf, VERR_INVALID_POINTER);
+ AssertReturn(cb * 2 >= cb, VERR_BUFFER_OVERFLOW);
+ AssertReturn(cwcBuf >= cb * 2 + 1, VERR_BUFFER_OVERFLOW);
+ if (cb)
+ AssertPtrReturn(pv, VERR_INVALID_POINTER);
+
+ static char const s_szHexDigitsLower[17] = "0123456789abcdef";
+ static char const s_szHexDigitsUpper[17] = "0123456789ABCDEF";
+ const char *pszHexDigits = !(fFlags & RTSTRPRINTHEXBYTES_F_UPPER) ? s_szHexDigitsLower : s_szHexDigitsUpper;
+
+ uint8_t const *pb = (uint8_t const *)pv;
+ while (cb-- > 0)
+ {
+ uint8_t b = *pb++;
+ *pwszBuf++ = pszHexDigits[b >> 4];
+ *pwszBuf++ = pszHexDigits[b & 0xf];
+ }
+ *pwszBuf = '\0';
+ return VINF_SUCCESS;
+}
+
diff --git a/src/VBox/Runtime/common/string/base64.cpp b/src/VBox/Runtime/common/string/base64.cpp
index 252368624ae..c33692fbc22 100644
--- a/src/VBox/Runtime/common/string/base64.cpp
+++ b/src/VBox/Runtime/common/string/base64.cpp
@@ -34,6 +34,7 @@
#include <iprt/assert.h>
#include <iprt/err.h>
#include <iprt/ctype.h>
+#include <iprt/string.h>
#ifdef RT_STRICT
# include <iprt/asm.h>
#endif
@@ -119,17 +120,7 @@ static void rtBase64Sanity(void)
#endif /* RT_STRICT */
-/**
- * Calculates the decoded data size for a Base64 encoded string.
- *
- * @returns The length in bytes. -1 if the encoding is bad.
- *
- * @param pszString The Base64 encoded string.
- * @param ppszEnd If not NULL, this will point to the first char
- * following the Base64 encoded text block. If
- * NULL the entire string is assumed to be Base64.
- */
-RTDECL(ssize_t) RTBase64DecodedSize(const char *pszString, char **ppszEnd)
+RTDECL(ssize_t) RTBase64DecodedSizeEx(const char *pszString, size_t cchStringMax, char **ppszEnd)
{
#ifdef RT_STRICT
rtBase64Sanity();
@@ -143,7 +134,7 @@ RTDECL(ssize_t) RTBase64DecodedSize(const char *pszString, char **ppszEnd)
unsigned ch;
AssertCompile(sizeof(char) == sizeof(uint8_t));
- while ((ch = *pszString))
+ while (cchStringMax > 0 && (ch = *pszString))
{
u8 = g_au8CharToVal[ch];
if (u8 < 64)
@@ -153,6 +144,7 @@ RTDECL(ssize_t) RTBase64DecodedSize(const char *pszString, char **ppszEnd)
/* advance */
pszString++;
+ cchStringMax--;
}
/*
@@ -165,7 +157,8 @@ RTDECL(ssize_t) RTBase64DecodedSize(const char *pszString, char **ppszEnd)
cbPad = 1;
c6Bits++;
pszString++;
- while ((ch = *pszString))
+ cchStringMax--;
+ while (cchStringMax > 0 && (ch = *pszString))
{
u8 = g_au8CharToVal[ch];
if (u8 != BASE64_SPACE)
@@ -176,6 +169,7 @@ RTDECL(ssize_t) RTBase64DecodedSize(const char *pszString, char **ppszEnd)
cbPad++;
}
pszString++;
+ cchStringMax--;
}
if (cbPad >= 3)
return -1;
@@ -215,31 +209,18 @@ RTDECL(ssize_t) RTBase64DecodedSize(const char *pszString, char **ppszEnd)
*ppszEnd = (char *)pszString;
return cb;
}
+RT_EXPORT_SYMBOL(RTBase64DecodedSizeEx);
+
+
+RTDECL(ssize_t) RTBase64DecodedSize(const char *pszString, char **ppszEnd)
+{
+ return RTBase64DecodedSizeEx(pszString, RTSTR_MAX, ppszEnd);
+}
RT_EXPORT_SYMBOL(RTBase64DecodedSize);
-/**
- * Decodes a Base64 encoded string into the buffer supplied by the caller.
- *
- * @returns IPRT status code.
- * @retval VERR_BUFFER_OVERFLOW if the buffer is too small. pcbActual will not
- * be set, nor will ppszEnd.
- * @retval VERR_INVALID_BASE64_ENCODING if the encoding is wrong.
- *
- * @param pszString The Base64 string. Whether the entire string or
- * just the start of the string is in Base64 depends
- * on whether ppszEnd is specified or not.
- * @param pvData Where to store the decoded data.
- * @param cbData The size of the output buffer that pvData points to.
- * @param pcbActual Where to store the actual number of bytes returned.
- * Optional.
- * @param ppszEnd Indicates that the string may contain other stuff
- * after the Base64 encoded data when not NULL. Will
- * be set to point to the first char that's not part of
- * the encoding. If NULL the entire string must be part
- * of the Base64 encoded data.
- */
-RTDECL(int) RTBase64Decode(const char *pszString, void *pvData, size_t cbData, size_t *pcbActual, char **ppszEnd)
+RTDECL(int) RTBase64DecodeEx(const char *pszString, size_t cchStringMax, void *pvData, size_t cbData,
+ size_t *pcbActual, char **ppszEnd)
{
#ifdef RT_STRICT
rtBase64Sanity();
@@ -250,7 +231,7 @@ RTDECL(int) RTBase64Decode(const char *pszString, void *pvData, size_t cbData, s
*/
uint8_t u8Trio[3] = { 0, 0, 0 }; /* shuts up gcc */
uint8_t *pbData = (uint8_t *)pvData;
- uint8_t u8 = BASE64_INVALID;
+ uint8_t u8;
unsigned c6Bits = 0;
unsigned ch;
AssertCompile(sizeof(char) == sizeof(uint8_t));
@@ -258,8 +239,8 @@ RTDECL(int) RTBase64Decode(const char *pszString, void *pvData, size_t cbData, s
for (;;)
{
/* The first 6-bit group. */
- while ((u8 = g_au8CharToVal[ch = *pszString]) == BASE64_SPACE)
- pszString++;
+ while ((u8 = cchStringMax > 0 ? g_au8CharToVal[ch = *pszString] : BASE64_INVALID) == BASE64_SPACE)
+ pszString++, cchStringMax--;
if (u8 >= 64)
{
c6Bits = 0;
@@ -267,10 +248,11 @@ RTDECL(int) RTBase64Decode(const char *pszString, void *pvData, size_t cbData, s
}
u8Trio[0] = u8 << 2;
pszString++;
+ cchStringMax--;
/* The second 6-bit group. */
- while ((u8 = g_au8CharToVal[ch = *pszString]) == BASE64_SPACE)
- pszString++;
+ while ((u8 = cchStringMax > 0 ? g_au8CharToVal[ch = *pszString] : BASE64_INVALID) == BASE64_SPACE)
+ pszString++, cchStringMax--;
if (u8 >= 64)
{
c6Bits = 1;
@@ -279,10 +261,12 @@ RTDECL(int) RTBase64Decode(const char *pszString, void *pvData, size_t cbData, s
u8Trio[0] |= u8 >> 4;
u8Trio[1] = u8 << 4;
pszString++;
+ cchStringMax--;
/* The third 6-bit group. */
- while ((u8 = g_au8CharToVal[ch = *pszString]) == BASE64_SPACE)
- pszString++;
+ u8 = BASE64_INVALID;
+ while ((u8 = cchStringMax > 0 ? g_au8CharToVal[ch = *pszString] : BASE64_INVALID) == BASE64_SPACE)
+ pszString++, cchStringMax--;
if (u8 >= 64)
{
c6Bits = 2;
@@ -291,10 +275,12 @@ RTDECL(int) RTBase64Decode(const char *pszString, void *pvData, size_t cbData, s
u8Trio[1] |= u8 >> 2;
u8Trio[2] = u8 << 6;
pszString++;
+ cchStringMax--;
/* The fourth 6-bit group. */
- while ((u8 = g_au8CharToVal[ch = *pszString]) == BASE64_SPACE)
- pszString++;
+ u8 = BASE64_INVALID;
+ while ((u8 = cchStringMax > 0 ? g_au8CharToVal[ch = *pszString] : BASE64_INVALID) == BASE64_SPACE)
+ pszString++, cchStringMax--;
if (u8 >= 64)
{
c6Bits = 3;
@@ -302,6 +288,7 @@ RTDECL(int) RTBase64Decode(const char *pszString, void *pvData, size_t cbData, s
}
u8Trio[2] |= u8;
pszString++;
+ cchStringMax--;
/* flush the trio */
if (cbData < 3)
@@ -322,7 +309,8 @@ RTDECL(int) RTBase64Decode(const char *pszString, void *pvData, size_t cbData, s
{
cbPad = 1;
pszString++;
- while ((ch = *pszString))
+ cchStringMax--;
+ while (cchStringMax > 0 && (ch = *pszString))
{
u8 = g_au8CharToVal[ch];
if (u8 != BASE64_SPACE)
@@ -332,6 +320,7 @@ RTDECL(int) RTBase64Decode(const char *pszString, void *pvData, size_t cbData, s
cbPad++;
}
pszString++;
+ cchStringMax--;
}
if (cbPad >= 3)
return VERR_INVALID_BASE64_ENCODING;
@@ -399,6 +388,13 @@ RTDECL(int) RTBase64Decode(const char *pszString, void *pvData, size_t cbData, s
*pcbActual = pbData - (uint8_t *)pvData;
return VINF_SUCCESS;
}
+RT_EXPORT_SYMBOL(RTBase64DecodeEx);
+
+
+RTDECL(int) RTBase64Decode(const char *pszString, void *pvData, size_t cbData, size_t *pcbActual, char **ppszEnd)
+{
+ return RTBase64DecodeEx(pszString, RTSTR_MAX, pvData, cbData, pcbActual, ppszEnd);
+}
RT_EXPORT_SYMBOL(RTBase64Decode);
diff --git a/src/VBox/Runtime/common/string/strncmp.asm b/src/VBox/Runtime/common/string/strncmp.asm
new file mode 100644
index 00000000000..48aa2bc826c
--- /dev/null
+++ b/src/VBox/Runtime/common/string/strncmp.asm
@@ -0,0 +1,121 @@
+; $Id$
+;; @file
+; IPRT - No-CRT strncmp - AMD64 & X86.
+;
+
+;
+; Copyright (C) 2006-2014 Oracle Corporation
+;
+; This file is part of VirtualBox Open Source Edition (OSE), as
+; available from http://www.virtualbox.org. This file is free software;
+; you can redistribute it and/or modify it under the terms of the GNU
+; General Public License (GPL) as published by the Free Software
+; Foundation, in version 2 as it comes in the "COPYING" file of the
+; VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+; hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+;
+; The contents of this file may alternatively be used under the terms
+; of the Common Development and Distribution License Version 1.0
+; (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+; VirtualBox OSE distribution, in which case the provisions of the
+; CDDL are applicable instead of those of the GPL.
+;
+; You may elect to license modified versions of this file under the
+; terms and conditions of either the GPL or the CDDL or both.
+;
+
+%include "iprt/asmdefs.mac"
+
+BEGINCODE
+
+;;
+; @param psz1 gcc: rdi msc: rcx x86:[esp+4]
+; @param psz2 gcc: rsi msc: rdx x86:[esp+8]
+; @param cch gcc: rdx msc: r8 x86:[esp+12]
+RT_NOCRT_BEGINPROC strncmp
+ ; input
+%ifdef RT_ARCH_AMD64
+ %ifdef ASM_CALL64_MSC
+ %define psz1 rcx
+ %define psz2 rdx
+ %define cch r8
+ %else
+ %define psz1 rdi
+ %define psz2 rsi
+ %define cch rdx
+ %endif
+%elifdef RT_ARCH_X86
+ mov ecx, [esp + 4]
+ mov edx, [esp + 8]
+ push ebx
+ mov ebx, [esp + 12+4]
+ %define psz1 ecx
+ %define psz2 edx
+ %define cch ebx
+%else
+ %error "Unknown arch"
+%endif
+
+ ;
+ ; The loop.
+ ;
+ test cch, cch
+ jz .equal
+.next:
+ mov al, [psz1]
+ mov ah, [psz2]
+ cmp al, ah
+ jne .not_equal
+ test al, al
+ jz .equal
+ dec cch
+ jz .equal
+
+ mov al, [psz1 + 1]
+ mov ah, [psz2 + 1]
+ cmp al, ah
+ jne .not_equal
+ test al, al
+ jz .equal
+ dec cch
+ jz .equal
+
+ mov al, [psz1 + 2]
+ mov ah, [psz2 + 2]
+ cmp al, ah
+ jne .not_equal
+ test al, al
+ jz .equal
+ dec cch
+ jz .equal
+
+ mov al, [psz1 + 3]
+ mov ah, [psz2 + 3]
+ cmp al, ah
+ jne .not_equal
+ test al, al
+ jz .equal
+ dec cch
+ jz .equal
+
+ add psz1, 4
+ add psz2, 4
+ jmp .next
+
+.equal:
+ xor eax, eax
+%ifdef RT_ARCH_X86
+ pop ebx
+%endif
+ ret
+
+.not_equal:
+ movzx ecx, ah
+ and eax, 0ffh
+ sub eax, ecx
+%ifdef RT_ARCH_X86
+ pop ebx
+%endif
+ ret
+ENDPROC RT_NOCRT(strncmp)
+
diff --git a/src/VBox/Runtime/common/string/unidata-flags.cpp b/src/VBox/Runtime/common/string/unidata-flags.cpp
new file mode 100644
index 00000000000..75772df1dc6
--- /dev/null
+++ b/src/VBox/Runtime/common/string/unidata-flags.cpp
@@ -0,0 +1,47008 @@
+/* $Id$ */
+/** @file
+ * IPRT - Unicode Tables.
+ *
+ * Automatically Generated from d:\src\unicode\6.3.0\
+ * by ..\..\..\..\..\out\win.amd64\debug\obj\uniread\uniread.exe (May 22 2014 19:07:40)
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+#include <iprt/uni.h>
+
+static const uint8_t g_afRTUniFlags0x000000[] =
+{
+ 0, /* U+000000: <control>*/
+ 0, /* U+000001: <control>*/
+ 0, /* U+000002: <control>*/
+ 0, /* U+000003: <control>*/
+ 0, /* U+000004: <control>*/
+ 0, /* U+000005: <control>*/
+ 0, /* U+000006: <control>*/
+ 0, /* U+000007: <control>*/
+ 0, /* U+000008: <control>*/
+ RTUNI_WSPACE, /* U+000009: <control>*/
+ RTUNI_WSPACE, /* U+00000a: <control>*/
+ RTUNI_WSPACE, /* U+00000b: <control>*/
+ RTUNI_WSPACE, /* U+00000c: <control>*/
+ RTUNI_WSPACE, /* U+00000d: <control>*/
+ 0, /* U+00000e: <control>*/
+ 0, /* U+00000f: <control>*/
+ 0, /* U+000010: <control>*/
+ 0, /* U+000011: <control>*/
+ 0, /* U+000012: <control>*/
+ 0, /* U+000013: <control>*/
+ 0, /* U+000014: <control>*/
+ 0, /* U+000015: <control>*/
+ 0, /* U+000016: <control>*/
+ 0, /* U+000017: <control>*/
+ 0, /* U+000018: <control>*/
+ 0, /* U+000019: <control>*/
+ 0, /* U+00001a: <control>*/
+ 0, /* U+00001b: <control>*/
+ 0, /* U+00001c: <control>*/
+ 0, /* U+00001d: <control>*/
+ 0, /* U+00001e: <control>*/
+ 0, /* U+00001f: <control>*/
+ RTUNI_WSPACE, /* U+000020: SPACE*/
+ 0, /* U+000021: EXCLAMATION MARK*/
+ 0, /* U+000022: QUOTATION MARK*/
+ 0, /* U+000023: NUMBER SIGN*/
+ 0, /* U+000024: DOLLAR SIGN*/
+ 0, /* U+000025: PERCENT SIGN*/
+ 0, /* U+000026: AMPERSAND*/
+ 0, /* U+000027: APOSTROPHE*/
+ 0, /* U+000028: LEFT PARENTHESIS*/
+ 0, /* U+000029: RIGHT PARENTHESIS*/
+ 0, /* U+00002a: ASTERISK*/
+ 0, /* U+00002b: PLUS SIGN*/
+ 0, /* U+00002c: COMMA*/
+ 0, /* U+00002d: HYPHEN-MINUS*/
+ 0, /* U+00002e: FULL STOP*/
+ 0, /* U+00002f: SOLIDUS*/
+ RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+000030: DIGIT ZERO*/
+ RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+000031: DIGIT ONE*/
+ RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+000032: DIGIT TWO*/
+ RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+000033: DIGIT THREE*/
+ RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+000034: DIGIT FOUR*/
+ RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+000035: DIGIT FIVE*/
+ RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+000036: DIGIT SIX*/
+ RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+000037: DIGIT SEVEN*/
+ RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+000038: DIGIT EIGHT*/
+ RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+000039: DIGIT NINE*/
+ 0, /* U+00003a: COLON*/
+ 0, /* U+00003b: SEMICOLON*/
+ 0, /* U+00003c: LESS-THAN SIGN*/
+ 0, /* U+00003d: EQUALS SIGN*/
+ 0, /* U+00003e: GREATER-THAN SIGN*/
+ 0, /* U+00003f: QUESTION MARK*/
+ 0, /* U+000040: COMMERCIAL AT*/
+ RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_UPPER, /* U+000041: LATIN CAPITAL LETTER A*/
+ RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_UPPER, /* U+000042: LATIN CAPITAL LETTER B*/
+ RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_UPPER, /* U+000043: LATIN CAPITAL LETTER C*/
+ RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_UPPER, /* U+000044: LATIN CAPITAL LETTER D*/
+ RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_UPPER, /* U+000045: LATIN CAPITAL LETTER E*/
+ RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_UPPER, /* U+000046: LATIN CAPITAL LETTER F*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000047: LATIN CAPITAL LETTER G*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000048: LATIN CAPITAL LETTER H*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000049: LATIN CAPITAL LETTER I*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00004a: LATIN CAPITAL LETTER J*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00004b: LATIN CAPITAL LETTER K*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00004c: LATIN CAPITAL LETTER L*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00004d: LATIN CAPITAL LETTER M*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00004e: LATIN CAPITAL LETTER N*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00004f: LATIN CAPITAL LETTER O*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000050: LATIN CAPITAL LETTER P*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000051: LATIN CAPITAL LETTER Q*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000052: LATIN CAPITAL LETTER R*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000053: LATIN CAPITAL LETTER S*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000054: LATIN CAPITAL LETTER T*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000055: LATIN CAPITAL LETTER U*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000056: LATIN CAPITAL LETTER V*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000057: LATIN CAPITAL LETTER W*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000058: LATIN CAPITAL LETTER X*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000059: LATIN CAPITAL LETTER Y*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00005a: LATIN CAPITAL LETTER Z*/
+ 0, /* U+00005b: LEFT SQUARE BRACKET*/
+ 0, /* U+00005c: REVERSE SOLIDUS*/
+ 0, /* U+00005d: RIGHT SQUARE BRACKET*/
+ 0, /* U+00005e: CIRCUMFLEX ACCENT*/
+ 0, /* U+00005f: LOW LINE*/
+ 0, /* U+000060: GRAVE ACCENT*/
+ RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_LOWER, /* U+000061: LATIN SMALL LETTER A*/
+ RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_LOWER, /* U+000062: LATIN SMALL LETTER B*/
+ RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_LOWER, /* U+000063: LATIN SMALL LETTER C*/
+ RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_LOWER, /* U+000064: LATIN SMALL LETTER D*/
+ RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_LOWER, /* U+000065: LATIN SMALL LETTER E*/
+ RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_LOWER, /* U+000066: LATIN SMALL LETTER F*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000067: LATIN SMALL LETTER G*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000068: LATIN SMALL LETTER H*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000069: LATIN SMALL LETTER I*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00006a: LATIN SMALL LETTER J*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00006b: LATIN SMALL LETTER K*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00006c: LATIN SMALL LETTER L*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00006d: LATIN SMALL LETTER M*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00006e: LATIN SMALL LETTER N*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00006f: LATIN SMALL LETTER O*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000070: LATIN SMALL LETTER P*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000071: LATIN SMALL LETTER Q*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000072: LATIN SMALL LETTER R*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000073: LATIN SMALL LETTER S*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000074: LATIN SMALL LETTER T*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000075: LATIN SMALL LETTER U*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000076: LATIN SMALL LETTER V*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000077: LATIN SMALL LETTER W*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000078: LATIN SMALL LETTER X*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000079: LATIN SMALL LETTER Y*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00007a: LATIN SMALL LETTER Z*/
+ 0, /* U+00007b: LEFT CURLY BRACKET*/
+ 0, /* U+00007c: VERTICAL LINE*/
+ 0, /* U+00007d: RIGHT CURLY BRACKET*/
+ 0, /* U+00007e: TILDE*/
+ 0, /* U+00007f: <control>*/
+ 0, /* U+000080: <control>*/
+ 0, /* U+000081: <control>*/
+ 0, /* U+000082: <control>*/
+ 0, /* U+000083: <control>*/
+ 0, /* U+000084: <control>*/
+ RTUNI_WSPACE, /* U+000085: <control>*/
+ 0, /* U+000086: <control>*/
+ 0, /* U+000087: <control>*/
+ 0, /* U+000088: <control>*/
+ 0, /* U+000089: <control>*/
+ 0, /* U+00008a: <control>*/
+ 0, /* U+00008b: <control>*/
+ 0, /* U+00008c: <control>*/
+ 0, /* U+00008d: <control>*/
+ 0, /* U+00008e: <control>*/
+ 0, /* U+00008f: <control>*/
+ 0, /* U+000090: <control>*/
+ 0, /* U+000091: <control>*/
+ 0, /* U+000092: <control>*/
+ 0, /* U+000093: <control>*/
+ 0, /* U+000094: <control>*/
+ 0, /* U+000095: <control>*/
+ 0, /* U+000096: <control>*/
+ 0, /* U+000097: <control>*/
+ 0, /* U+000098: <control>*/
+ 0, /* U+000099: <control>*/
+ 0, /* U+00009a: <control>*/
+ 0, /* U+00009b: <control>*/
+ 0, /* U+00009c: <control>*/
+ 0, /* U+00009d: <control>*/
+ 0, /* U+00009e: <control>*/
+ 0, /* U+00009f: <control>*/
+ RTUNI_WSPACE, /* U+0000a0: NO-BREAK SPACE*/
+ 0, /* U+0000a1: INVERTED EXCLAMATION MARK*/
+ 0, /* U+0000a2: CENT SIGN*/
+ 0, /* U+0000a3: POUND SIGN*/
+ 0, /* U+0000a4: CURRENCY SIGN*/
+ 0, /* U+0000a5: YEN SIGN*/
+ 0, /* U+0000a6: BROKEN BAR*/
+ 0, /* U+0000a7: SECTION SIGN*/
+ 0, /* U+0000a8: DIAERESIS*/
+ 0, /* U+0000a9: COPYRIGHT SIGN*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0000aa: FEMININE ORDINAL INDICATOR*/
+ 0, /* U+0000ab: LEFT-POINTING DOUBLE ANGLE QUOTATION MARK*/
+ 0, /* U+0000ac: NOT SIGN*/
+ 0, /* U+0000ad: SOFT HYPHEN*/
+ 0, /* U+0000ae: REGISTERED SIGN*/
+ 0, /* U+0000af: MACRON*/
+ 0, /* U+0000b0: DEGREE SIGN*/
+ 0, /* U+0000b1: PLUS-MINUS SIGN*/
+ 0, /* U+0000b2: SUPERSCRIPT TWO*/
+ 0, /* U+0000b3: SUPERSCRIPT THREE*/
+ 0, /* U+0000b4: ACUTE ACCENT*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0000b5: MICRO SIGN*/
+ 0, /* U+0000b6: PILCROW SIGN*/
+ 0, /* U+0000b7: MIDDLE DOT*/
+ 0, /* U+0000b8: CEDILLA*/
+ 0, /* U+0000b9: SUPERSCRIPT ONE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0000ba: MASCULINE ORDINAL INDICATOR*/
+ 0, /* U+0000bb: RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK*/
+ 0, /* U+0000bc: VULGAR FRACTION ONE QUARTER*/
+ 0, /* U+0000bd: VULGAR FRACTION ONE HALF*/
+ 0, /* U+0000be: VULGAR FRACTION THREE QUARTERS*/
+ 0, /* U+0000bf: INVERTED QUESTION MARK*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0000c0: LATIN CAPITAL LETTER A WITH GRAVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0000c1: LATIN CAPITAL LETTER A WITH ACUTE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0000c2: LATIN CAPITAL LETTER A WITH CIRCUMFLEX*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0000c3: LATIN CAPITAL LETTER A WITH TILDE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0000c4: LATIN CAPITAL LETTER A WITH DIAERESIS*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0000c5: LATIN CAPITAL LETTER A WITH RING ABOVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0000c6: LATIN CAPITAL LETTER AE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0000c7: LATIN CAPITAL LETTER C WITH CEDILLA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0000c8: LATIN CAPITAL LETTER E WITH GRAVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0000c9: LATIN CAPITAL LETTER E WITH ACUTE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0000ca: LATIN CAPITAL LETTER E WITH CIRCUMFLEX*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0000cb: LATIN CAPITAL LETTER E WITH DIAERESIS*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0000cc: LATIN CAPITAL LETTER I WITH GRAVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0000cd: LATIN CAPITAL LETTER I WITH ACUTE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0000ce: LATIN CAPITAL LETTER I WITH CIRCUMFLEX*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0000cf: LATIN CAPITAL LETTER I WITH DIAERESIS*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0000d0: LATIN CAPITAL LETTER ETH*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0000d1: LATIN CAPITAL LETTER N WITH TILDE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0000d2: LATIN CAPITAL LETTER O WITH GRAVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0000d3: LATIN CAPITAL LETTER O WITH ACUTE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0000d4: LATIN CAPITAL LETTER O WITH CIRCUMFLEX*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0000d5: LATIN CAPITAL LETTER O WITH TILDE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0000d6: LATIN CAPITAL LETTER O WITH DIAERESIS*/
+ 0, /* U+0000d7: MULTIPLICATION SIGN*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0000d8: LATIN CAPITAL LETTER O WITH STROKE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0000d9: LATIN CAPITAL LETTER U WITH GRAVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0000da: LATIN CAPITAL LETTER U WITH ACUTE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0000db: LATIN CAPITAL LETTER U WITH CIRCUMFLEX*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0000dc: LATIN CAPITAL LETTER U WITH DIAERESIS*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0000dd: LATIN CAPITAL LETTER Y WITH ACUTE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0000de: LATIN CAPITAL LETTER THORN*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0000df: LATIN SMALL LETTER SHARP S*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0000e0: LATIN SMALL LETTER A WITH GRAVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0000e1: LATIN SMALL LETTER A WITH ACUTE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0000e2: LATIN SMALL LETTER A WITH CIRCUMFLEX*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0000e3: LATIN SMALL LETTER A WITH TILDE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0000e4: LATIN SMALL LETTER A WITH DIAERESIS*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0000e5: LATIN SMALL LETTER A WITH RING ABOVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0000e6: LATIN SMALL LETTER AE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0000e7: LATIN SMALL LETTER C WITH CEDILLA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0000e8: LATIN SMALL LETTER E WITH GRAVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0000e9: LATIN SMALL LETTER E WITH ACUTE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0000ea: LATIN SMALL LETTER E WITH CIRCUMFLEX*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0000eb: LATIN SMALL LETTER E WITH DIAERESIS*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0000ec: LATIN SMALL LETTER I WITH GRAVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0000ed: LATIN SMALL LETTER I WITH ACUTE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0000ee: LATIN SMALL LETTER I WITH CIRCUMFLEX*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0000ef: LATIN SMALL LETTER I WITH DIAERESIS*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0000f0: LATIN SMALL LETTER ETH*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0000f1: LATIN SMALL LETTER N WITH TILDE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0000f2: LATIN SMALL LETTER O WITH GRAVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0000f3: LATIN SMALL LETTER O WITH ACUTE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0000f4: LATIN SMALL LETTER O WITH CIRCUMFLEX*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0000f5: LATIN SMALL LETTER O WITH TILDE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0000f6: LATIN SMALL LETTER O WITH DIAERESIS*/
+ 0, /* U+0000f7: DIVISION SIGN*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0000f8: LATIN SMALL LETTER O WITH STROKE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0000f9: LATIN SMALL LETTER U WITH GRAVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0000fa: LATIN SMALL LETTER U WITH ACUTE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0000fb: LATIN SMALL LETTER U WITH CIRCUMFLEX*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0000fc: LATIN SMALL LETTER U WITH DIAERESIS*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0000fd: LATIN SMALL LETTER Y WITH ACUTE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0000fe: LATIN SMALL LETTER THORN*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0000ff: LATIN SMALL LETTER Y WITH DIAERESIS*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000100: LATIN CAPITAL LETTER A WITH MACRON*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000101: LATIN SMALL LETTER A WITH MACRON*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000102: LATIN CAPITAL LETTER A WITH BREVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000103: LATIN SMALL LETTER A WITH BREVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000104: LATIN CAPITAL LETTER A WITH OGONEK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000105: LATIN SMALL LETTER A WITH OGONEK*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000106: LATIN CAPITAL LETTER C WITH ACUTE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000107: LATIN SMALL LETTER C WITH ACUTE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000108: LATIN CAPITAL LETTER C WITH CIRCUMFLEX*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000109: LATIN SMALL LETTER C WITH CIRCUMFLEX*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00010a: LATIN CAPITAL LETTER C WITH DOT ABOVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00010b: LATIN SMALL LETTER C WITH DOT ABOVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00010c: LATIN CAPITAL LETTER C WITH CARON*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00010d: LATIN SMALL LETTER C WITH CARON*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00010e: LATIN CAPITAL LETTER D WITH CARON*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00010f: LATIN SMALL LETTER D WITH CARON*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000110: LATIN CAPITAL LETTER D WITH STROKE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000111: LATIN SMALL LETTER D WITH STROKE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000112: LATIN CAPITAL LETTER E WITH MACRON*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000113: LATIN SMALL LETTER E WITH MACRON*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000114: LATIN CAPITAL LETTER E WITH BREVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000115: LATIN SMALL LETTER E WITH BREVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000116: LATIN CAPITAL LETTER E WITH DOT ABOVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000117: LATIN SMALL LETTER E WITH DOT ABOVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000118: LATIN CAPITAL LETTER E WITH OGONEK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000119: LATIN SMALL LETTER E WITH OGONEK*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00011a: LATIN CAPITAL LETTER E WITH CARON*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00011b: LATIN SMALL LETTER E WITH CARON*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00011c: LATIN CAPITAL LETTER G WITH CIRCUMFLEX*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00011d: LATIN SMALL LETTER G WITH CIRCUMFLEX*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00011e: LATIN CAPITAL LETTER G WITH BREVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00011f: LATIN SMALL LETTER G WITH BREVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000120: LATIN CAPITAL LETTER G WITH DOT ABOVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000121: LATIN SMALL LETTER G WITH DOT ABOVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000122: LATIN CAPITAL LETTER G WITH CEDILLA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000123: LATIN SMALL LETTER G WITH CEDILLA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000124: LATIN CAPITAL LETTER H WITH CIRCUMFLEX*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000125: LATIN SMALL LETTER H WITH CIRCUMFLEX*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000126: LATIN CAPITAL LETTER H WITH STROKE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000127: LATIN SMALL LETTER H WITH STROKE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000128: LATIN CAPITAL LETTER I WITH TILDE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000129: LATIN SMALL LETTER I WITH TILDE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00012a: LATIN CAPITAL LETTER I WITH MACRON*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00012b: LATIN SMALL LETTER I WITH MACRON*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00012c: LATIN CAPITAL LETTER I WITH BREVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00012d: LATIN SMALL LETTER I WITH BREVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00012e: LATIN CAPITAL LETTER I WITH OGONEK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00012f: LATIN SMALL LETTER I WITH OGONEK*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000130: LATIN CAPITAL LETTER I WITH DOT ABOVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000131: LATIN SMALL LETTER DOTLESS I*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000132: LATIN CAPITAL LIGATURE IJ*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000133: LATIN SMALL LIGATURE IJ*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000134: LATIN CAPITAL LETTER J WITH CIRCUMFLEX*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000135: LATIN SMALL LETTER J WITH CIRCUMFLEX*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000136: LATIN CAPITAL LETTER K WITH CEDILLA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000137: LATIN SMALL LETTER K WITH CEDILLA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000138: LATIN SMALL LETTER KRA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000139: LATIN CAPITAL LETTER L WITH ACUTE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00013a: LATIN SMALL LETTER L WITH ACUTE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00013b: LATIN CAPITAL LETTER L WITH CEDILLA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00013c: LATIN SMALL LETTER L WITH CEDILLA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00013d: LATIN CAPITAL LETTER L WITH CARON*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00013e: LATIN SMALL LETTER L WITH CARON*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00013f: LATIN CAPITAL LETTER L WITH MIDDLE DOT*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000140: LATIN SMALL LETTER L WITH MIDDLE DOT*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000141: LATIN CAPITAL LETTER L WITH STROKE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000142: LATIN SMALL LETTER L WITH STROKE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000143: LATIN CAPITAL LETTER N WITH ACUTE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000144: LATIN SMALL LETTER N WITH ACUTE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000145: LATIN CAPITAL LETTER N WITH CEDILLA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000146: LATIN SMALL LETTER N WITH CEDILLA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000147: LATIN CAPITAL LETTER N WITH CARON*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000148: LATIN SMALL LETTER N WITH CARON*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000149: LATIN SMALL LETTER N PRECEDED BY APOSTROPHE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00014a: LATIN CAPITAL LETTER ENG*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00014b: LATIN SMALL LETTER ENG*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00014c: LATIN CAPITAL LETTER O WITH MACRON*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00014d: LATIN SMALL LETTER O WITH MACRON*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00014e: LATIN CAPITAL LETTER O WITH BREVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00014f: LATIN SMALL LETTER O WITH BREVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000150: LATIN CAPITAL LETTER O WITH DOUBLE ACUTE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000151: LATIN SMALL LETTER O WITH DOUBLE ACUTE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000152: LATIN CAPITAL LIGATURE OE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000153: LATIN SMALL LIGATURE OE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000154: LATIN CAPITAL LETTER R WITH ACUTE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000155: LATIN SMALL LETTER R WITH ACUTE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000156: LATIN CAPITAL LETTER R WITH CEDILLA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000157: LATIN SMALL LETTER R WITH CEDILLA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000158: LATIN CAPITAL LETTER R WITH CARON*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000159: LATIN SMALL LETTER R WITH CARON*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00015a: LATIN CAPITAL LETTER S WITH ACUTE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00015b: LATIN SMALL LETTER S WITH ACUTE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00015c: LATIN CAPITAL LETTER S WITH CIRCUMFLEX*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00015d: LATIN SMALL LETTER S WITH CIRCUMFLEX*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00015e: LATIN CAPITAL LETTER S WITH CEDILLA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00015f: LATIN SMALL LETTER S WITH CEDILLA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000160: LATIN CAPITAL LETTER S WITH CARON*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000161: LATIN SMALL LETTER S WITH CARON*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000162: LATIN CAPITAL LETTER T WITH CEDILLA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000163: LATIN SMALL LETTER T WITH CEDILLA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000164: LATIN CAPITAL LETTER T WITH CARON*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000165: LATIN SMALL LETTER T WITH CARON*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000166: LATIN CAPITAL LETTER T WITH STROKE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000167: LATIN SMALL LETTER T WITH STROKE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000168: LATIN CAPITAL LETTER U WITH TILDE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000169: LATIN SMALL LETTER U WITH TILDE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00016a: LATIN CAPITAL LETTER U WITH MACRON*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00016b: LATIN SMALL LETTER U WITH MACRON*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00016c: LATIN CAPITAL LETTER U WITH BREVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00016d: LATIN SMALL LETTER U WITH BREVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00016e: LATIN CAPITAL LETTER U WITH RING ABOVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00016f: LATIN SMALL LETTER U WITH RING ABOVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000170: LATIN CAPITAL LETTER U WITH DOUBLE ACUTE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000171: LATIN SMALL LETTER U WITH DOUBLE ACUTE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000172: LATIN CAPITAL LETTER U WITH OGONEK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000173: LATIN SMALL LETTER U WITH OGONEK*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000174: LATIN CAPITAL LETTER W WITH CIRCUMFLEX*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000175: LATIN SMALL LETTER W WITH CIRCUMFLEX*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000176: LATIN CAPITAL LETTER Y WITH CIRCUMFLEX*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000177: LATIN SMALL LETTER Y WITH CIRCUMFLEX*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000178: LATIN CAPITAL LETTER Y WITH DIAERESIS*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000179: LATIN CAPITAL LETTER Z WITH ACUTE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00017a: LATIN SMALL LETTER Z WITH ACUTE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00017b: LATIN CAPITAL LETTER Z WITH DOT ABOVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00017c: LATIN SMALL LETTER Z WITH DOT ABOVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00017d: LATIN CAPITAL LETTER Z WITH CARON*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00017e: LATIN SMALL LETTER Z WITH CARON*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00017f: LATIN SMALL LETTER LONG S*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000180: LATIN SMALL LETTER B WITH STROKE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000181: LATIN CAPITAL LETTER B WITH HOOK*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000182: LATIN CAPITAL LETTER B WITH TOPBAR*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000183: LATIN SMALL LETTER B WITH TOPBAR*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000184: LATIN CAPITAL LETTER TONE SIX*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000185: LATIN SMALL LETTER TONE SIX*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000186: LATIN CAPITAL LETTER OPEN O*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000187: LATIN CAPITAL LETTER C WITH HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000188: LATIN SMALL LETTER C WITH HOOK*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000189: LATIN CAPITAL LETTER AFRICAN D*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00018a: LATIN CAPITAL LETTER D WITH HOOK*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00018b: LATIN CAPITAL LETTER D WITH TOPBAR*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00018c: LATIN SMALL LETTER D WITH TOPBAR*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00018d: LATIN SMALL LETTER TURNED DELTA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00018e: LATIN CAPITAL LETTER REVERSED E*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00018f: LATIN CAPITAL LETTER SCHWA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000190: LATIN CAPITAL LETTER OPEN E*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000191: LATIN CAPITAL LETTER F WITH HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000192: LATIN SMALL LETTER F WITH HOOK*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000193: LATIN CAPITAL LETTER G WITH HOOK*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000194: LATIN CAPITAL LETTER GAMMA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000195: LATIN SMALL LETTER HV*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000196: LATIN CAPITAL LETTER IOTA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000197: LATIN CAPITAL LETTER I WITH STROKE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000198: LATIN CAPITAL LETTER K WITH HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000199: LATIN SMALL LETTER K WITH HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00019a: LATIN SMALL LETTER L WITH BAR*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00019b: LATIN SMALL LETTER LAMBDA WITH STROKE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00019c: LATIN CAPITAL LETTER TURNED M*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00019d: LATIN CAPITAL LETTER N WITH LEFT HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00019e: LATIN SMALL LETTER N WITH LONG RIGHT LEG*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00019f: LATIN CAPITAL LETTER O WITH MIDDLE TILDE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0001a0: LATIN CAPITAL LETTER O WITH HORN*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0001a1: LATIN SMALL LETTER O WITH HORN*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0001a2: LATIN CAPITAL LETTER OI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0001a3: LATIN SMALL LETTER OI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0001a4: LATIN CAPITAL LETTER P WITH HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0001a5: LATIN SMALL LETTER P WITH HOOK*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0001a6: LATIN LETTER YR*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0001a7: LATIN CAPITAL LETTER TONE TWO*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0001a8: LATIN SMALL LETTER TONE TWO*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0001a9: LATIN CAPITAL LETTER ESH*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0001aa: LATIN LETTER REVERSED ESH LOOP*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0001ab: LATIN SMALL LETTER T WITH PALATAL HOOK*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0001ac: LATIN CAPITAL LETTER T WITH HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0001ad: LATIN SMALL LETTER T WITH HOOK*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0001ae: LATIN CAPITAL LETTER T WITH RETROFLEX HOOK*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0001af: LATIN CAPITAL LETTER U WITH HORN*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0001b0: LATIN SMALL LETTER U WITH HORN*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0001b1: LATIN CAPITAL LETTER UPSILON*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0001b2: LATIN CAPITAL LETTER V WITH HOOK*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0001b3: LATIN CAPITAL LETTER Y WITH HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0001b4: LATIN SMALL LETTER Y WITH HOOK*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0001b5: LATIN CAPITAL LETTER Z WITH STROKE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0001b6: LATIN SMALL LETTER Z WITH STROKE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0001b7: LATIN CAPITAL LETTER EZH*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0001b8: LATIN CAPITAL LETTER EZH REVERSED*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0001b9: LATIN SMALL LETTER EZH REVERSED*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0001ba: LATIN SMALL LETTER EZH WITH TAIL*/
+ RTUNI_ALPHA, /* U+0001bb: LATIN LETTER TWO WITH STROKE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0001bc: LATIN CAPITAL LETTER TONE FIVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0001bd: LATIN SMALL LETTER TONE FIVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0001be: LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0001bf: LATIN LETTER WYNN*/
+ RTUNI_ALPHA, /* U+0001c0: LATIN LETTER DENTAL CLICK*/
+ RTUNI_ALPHA, /* U+0001c1: LATIN LETTER LATERAL CLICK*/
+ RTUNI_ALPHA, /* U+0001c2: LATIN LETTER ALVEOLAR CLICK*/
+ RTUNI_ALPHA, /* U+0001c3: LATIN LETTER RETROFLEX CLICK*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0001c4: LATIN CAPITAL LETTER DZ WITH CARON*/
+ RTUNI_ALPHA, /* U+0001c5: LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0001c6: LATIN SMALL LETTER DZ WITH CARON*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0001c7: LATIN CAPITAL LETTER LJ*/
+ RTUNI_ALPHA, /* U+0001c8: LATIN CAPITAL LETTER L WITH SMALL LETTER J*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0001c9: LATIN SMALL LETTER LJ*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0001ca: LATIN CAPITAL LETTER NJ*/
+ RTUNI_ALPHA, /* U+0001cb: LATIN CAPITAL LETTER N WITH SMALL LETTER J*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0001cc: LATIN SMALL LETTER NJ*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0001cd: LATIN CAPITAL LETTER A WITH CARON*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0001ce: LATIN SMALL LETTER A WITH CARON*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0001cf: LATIN CAPITAL LETTER I WITH CARON*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0001d0: LATIN SMALL LETTER I WITH CARON*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0001d1: LATIN CAPITAL LETTER O WITH CARON*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0001d2: LATIN SMALL LETTER O WITH CARON*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0001d3: LATIN CAPITAL LETTER U WITH CARON*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0001d4: LATIN SMALL LETTER U WITH CARON*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0001d5: LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0001d6: LATIN SMALL LETTER U WITH DIAERESIS AND MACRON*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0001d7: LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0001d8: LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0001d9: LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0001da: LATIN SMALL LETTER U WITH DIAERESIS AND CARON*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0001db: LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0001dc: LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0001dd: LATIN SMALL LETTER TURNED E*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0001de: LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0001df: LATIN SMALL LETTER A WITH DIAERESIS AND MACRON*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0001e0: LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0001e1: LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0001e2: LATIN CAPITAL LETTER AE WITH MACRON*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0001e3: LATIN SMALL LETTER AE WITH MACRON*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0001e4: LATIN CAPITAL LETTER G WITH STROKE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0001e5: LATIN SMALL LETTER G WITH STROKE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0001e6: LATIN CAPITAL LETTER G WITH CARON*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0001e7: LATIN SMALL LETTER G WITH CARON*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0001e8: LATIN CAPITAL LETTER K WITH CARON*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0001e9: LATIN SMALL LETTER K WITH CARON*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0001ea: LATIN CAPITAL LETTER O WITH OGONEK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0001eb: LATIN SMALL LETTER O WITH OGONEK*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0001ec: LATIN CAPITAL LETTER O WITH OGONEK AND MACRON*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0001ed: LATIN SMALL LETTER O WITH OGONEK AND MACRON*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0001ee: LATIN CAPITAL LETTER EZH WITH CARON*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0001ef: LATIN SMALL LETTER EZH WITH CARON*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0001f0: LATIN SMALL LETTER J WITH CARON*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0001f1: LATIN CAPITAL LETTER DZ*/
+ RTUNI_ALPHA, /* U+0001f2: LATIN CAPITAL LETTER D WITH SMALL LETTER Z*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0001f3: LATIN SMALL LETTER DZ*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0001f4: LATIN CAPITAL LETTER G WITH ACUTE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0001f5: LATIN SMALL LETTER G WITH ACUTE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0001f6: LATIN CAPITAL LETTER HWAIR*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0001f7: LATIN CAPITAL LETTER WYNN*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0001f8: LATIN CAPITAL LETTER N WITH GRAVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0001f9: LATIN SMALL LETTER N WITH GRAVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0001fa: LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0001fb: LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0001fc: LATIN CAPITAL LETTER AE WITH ACUTE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0001fd: LATIN SMALL LETTER AE WITH ACUTE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0001fe: LATIN CAPITAL LETTER O WITH STROKE AND ACUTE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0001ff: LATIN SMALL LETTER O WITH STROKE AND ACUTE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000200: LATIN CAPITAL LETTER A WITH DOUBLE GRAVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000201: LATIN SMALL LETTER A WITH DOUBLE GRAVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000202: LATIN CAPITAL LETTER A WITH INVERTED BREVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000203: LATIN SMALL LETTER A WITH INVERTED BREVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000204: LATIN CAPITAL LETTER E WITH DOUBLE GRAVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000205: LATIN SMALL LETTER E WITH DOUBLE GRAVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000206: LATIN CAPITAL LETTER E WITH INVERTED BREVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000207: LATIN SMALL LETTER E WITH INVERTED BREVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000208: LATIN CAPITAL LETTER I WITH DOUBLE GRAVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000209: LATIN SMALL LETTER I WITH DOUBLE GRAVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00020a: LATIN CAPITAL LETTER I WITH INVERTED BREVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00020b: LATIN SMALL LETTER I WITH INVERTED BREVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00020c: LATIN CAPITAL LETTER O WITH DOUBLE GRAVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00020d: LATIN SMALL LETTER O WITH DOUBLE GRAVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00020e: LATIN CAPITAL LETTER O WITH INVERTED BREVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00020f: LATIN SMALL LETTER O WITH INVERTED BREVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000210: LATIN CAPITAL LETTER R WITH DOUBLE GRAVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000211: LATIN SMALL LETTER R WITH DOUBLE GRAVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000212: LATIN CAPITAL LETTER R WITH INVERTED BREVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000213: LATIN SMALL LETTER R WITH INVERTED BREVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000214: LATIN CAPITAL LETTER U WITH DOUBLE GRAVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000215: LATIN SMALL LETTER U WITH DOUBLE GRAVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000216: LATIN CAPITAL LETTER U WITH INVERTED BREVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000217: LATIN SMALL LETTER U WITH INVERTED BREVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000218: LATIN CAPITAL LETTER S WITH COMMA BELOW*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000219: LATIN SMALL LETTER S WITH COMMA BELOW*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00021a: LATIN CAPITAL LETTER T WITH COMMA BELOW*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00021b: LATIN SMALL LETTER T WITH COMMA BELOW*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00021c: LATIN CAPITAL LETTER YOGH*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00021d: LATIN SMALL LETTER YOGH*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00021e: LATIN CAPITAL LETTER H WITH CARON*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00021f: LATIN SMALL LETTER H WITH CARON*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000220: LATIN CAPITAL LETTER N WITH LONG RIGHT LEG*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000221: LATIN SMALL LETTER D WITH CURL*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000222: LATIN CAPITAL LETTER OU*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000223: LATIN SMALL LETTER OU*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000224: LATIN CAPITAL LETTER Z WITH HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000225: LATIN SMALL LETTER Z WITH HOOK*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000226: LATIN CAPITAL LETTER A WITH DOT ABOVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000227: LATIN SMALL LETTER A WITH DOT ABOVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000228: LATIN CAPITAL LETTER E WITH CEDILLA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000229: LATIN SMALL LETTER E WITH CEDILLA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00022a: LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00022b: LATIN SMALL LETTER O WITH DIAERESIS AND MACRON*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00022c: LATIN CAPITAL LETTER O WITH TILDE AND MACRON*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00022d: LATIN SMALL LETTER O WITH TILDE AND MACRON*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00022e: LATIN CAPITAL LETTER O WITH DOT ABOVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00022f: LATIN SMALL LETTER O WITH DOT ABOVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000230: LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000231: LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000232: LATIN CAPITAL LETTER Y WITH MACRON*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000233: LATIN SMALL LETTER Y WITH MACRON*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000234: LATIN SMALL LETTER L WITH CURL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000235: LATIN SMALL LETTER N WITH CURL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000236: LATIN SMALL LETTER T WITH CURL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000237: LATIN SMALL LETTER DOTLESS J*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000238: LATIN SMALL LETTER DB DIGRAPH*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000239: LATIN SMALL LETTER QP DIGRAPH*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00023a: LATIN CAPITAL LETTER A WITH STROKE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00023b: LATIN CAPITAL LETTER C WITH STROKE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00023c: LATIN SMALL LETTER C WITH STROKE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00023d: LATIN CAPITAL LETTER L WITH BAR*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00023e: LATIN CAPITAL LETTER T WITH DIAGONAL STROKE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00023f: LATIN SMALL LETTER S WITH SWASH TAIL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000240: LATIN SMALL LETTER Z WITH SWASH TAIL*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000241: LATIN CAPITAL LETTER GLOTTAL STOP*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000242: LATIN SMALL LETTER GLOTTAL STOP*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000243: LATIN CAPITAL LETTER B WITH STROKE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000244: LATIN CAPITAL LETTER U BAR*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000245: LATIN CAPITAL LETTER TURNED V*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000246: LATIN CAPITAL LETTER E WITH STROKE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000247: LATIN SMALL LETTER E WITH STROKE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000248: LATIN CAPITAL LETTER J WITH STROKE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000249: LATIN SMALL LETTER J WITH STROKE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00024a: LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00024b: LATIN SMALL LETTER Q WITH HOOK TAIL*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00024c: LATIN CAPITAL LETTER R WITH STROKE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00024d: LATIN SMALL LETTER R WITH STROKE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00024e: LATIN CAPITAL LETTER Y WITH STROKE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00024f: LATIN SMALL LETTER Y WITH STROKE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000250: LATIN SMALL LETTER TURNED A*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000251: LATIN SMALL LETTER ALPHA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000252: LATIN SMALL LETTER TURNED ALPHA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000253: LATIN SMALL LETTER B WITH HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000254: LATIN SMALL LETTER OPEN O*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000255: LATIN SMALL LETTER C WITH CURL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000256: LATIN SMALL LETTER D WITH TAIL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000257: LATIN SMALL LETTER D WITH HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000258: LATIN SMALL LETTER REVERSED E*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000259: LATIN SMALL LETTER SCHWA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00025a: LATIN SMALL LETTER SCHWA WITH HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00025b: LATIN SMALL LETTER OPEN E*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00025c: LATIN SMALL LETTER REVERSED OPEN E*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00025d: LATIN SMALL LETTER REVERSED OPEN E WITH HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00025e: LATIN SMALL LETTER CLOSED REVERSED OPEN E*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00025f: LATIN SMALL LETTER DOTLESS J WITH STROKE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000260: LATIN SMALL LETTER G WITH HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000261: LATIN SMALL LETTER SCRIPT G*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000262: LATIN LETTER SMALL CAPITAL G*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000263: LATIN SMALL LETTER GAMMA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000264: LATIN SMALL LETTER RAMS HORN*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000265: LATIN SMALL LETTER TURNED H*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000266: LATIN SMALL LETTER H WITH HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000267: LATIN SMALL LETTER HENG WITH HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000268: LATIN SMALL LETTER I WITH STROKE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000269: LATIN SMALL LETTER IOTA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00026a: LATIN LETTER SMALL CAPITAL I*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00026b: LATIN SMALL LETTER L WITH MIDDLE TILDE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00026c: LATIN SMALL LETTER L WITH BELT*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00026d: LATIN SMALL LETTER L WITH RETROFLEX HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00026e: LATIN SMALL LETTER LEZH*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00026f: LATIN SMALL LETTER TURNED M*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000270: LATIN SMALL LETTER TURNED M WITH LONG LEG*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000271: LATIN SMALL LETTER M WITH HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000272: LATIN SMALL LETTER N WITH LEFT HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000273: LATIN SMALL LETTER N WITH RETROFLEX HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000274: LATIN LETTER SMALL CAPITAL N*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000275: LATIN SMALL LETTER BARRED O*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000276: LATIN LETTER SMALL CAPITAL OE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000277: LATIN SMALL LETTER CLOSED OMEGA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000278: LATIN SMALL LETTER PHI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000279: LATIN SMALL LETTER TURNED R*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00027a: LATIN SMALL LETTER TURNED R WITH LONG LEG*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00027b: LATIN SMALL LETTER TURNED R WITH HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00027c: LATIN SMALL LETTER R WITH LONG LEG*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00027d: LATIN SMALL LETTER R WITH TAIL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00027e: LATIN SMALL LETTER R WITH FISHHOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00027f: LATIN SMALL LETTER REVERSED R WITH FISHHOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000280: LATIN LETTER SMALL CAPITAL R*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000281: LATIN LETTER SMALL CAPITAL INVERTED R*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000282: LATIN SMALL LETTER S WITH HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000283: LATIN SMALL LETTER ESH*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000284: LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000285: LATIN SMALL LETTER SQUAT REVERSED ESH*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000286: LATIN SMALL LETTER ESH WITH CURL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000287: LATIN SMALL LETTER TURNED T*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000288: LATIN SMALL LETTER T WITH RETROFLEX HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000289: LATIN SMALL LETTER U BAR*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00028a: LATIN SMALL LETTER UPSILON*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00028b: LATIN SMALL LETTER V WITH HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00028c: LATIN SMALL LETTER TURNED V*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00028d: LATIN SMALL LETTER TURNED W*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00028e: LATIN SMALL LETTER TURNED Y*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00028f: LATIN LETTER SMALL CAPITAL Y*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000290: LATIN SMALL LETTER Z WITH RETROFLEX HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000291: LATIN SMALL LETTER Z WITH CURL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000292: LATIN SMALL LETTER EZH*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000293: LATIN SMALL LETTER EZH WITH CURL*/
+ RTUNI_ALPHA, /* U+000294: LATIN LETTER GLOTTAL STOP*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000295: LATIN LETTER PHARYNGEAL VOICED FRICATIVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000296: LATIN LETTER INVERTED GLOTTAL STOP*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000297: LATIN LETTER STRETCHED C*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000298: LATIN LETTER BILABIAL CLICK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000299: LATIN LETTER SMALL CAPITAL B*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00029a: LATIN SMALL LETTER CLOSED OPEN E*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00029b: LATIN LETTER SMALL CAPITAL G WITH HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00029c: LATIN LETTER SMALL CAPITAL H*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00029d: LATIN SMALL LETTER J WITH CROSSED-TAIL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00029e: LATIN SMALL LETTER TURNED K*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00029f: LATIN LETTER SMALL CAPITAL L*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0002a0: LATIN SMALL LETTER Q WITH HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0002a1: LATIN LETTER GLOTTAL STOP WITH STROKE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0002a2: LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0002a3: LATIN SMALL LETTER DZ DIGRAPH*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0002a4: LATIN SMALL LETTER DEZH DIGRAPH*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0002a5: LATIN SMALL LETTER DZ DIGRAPH WITH CURL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0002a6: LATIN SMALL LETTER TS DIGRAPH*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0002a7: LATIN SMALL LETTER TESH DIGRAPH*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0002a8: LATIN SMALL LETTER TC DIGRAPH WITH CURL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0002a9: LATIN SMALL LETTER FENG DIGRAPH*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0002aa: LATIN SMALL LETTER LS DIGRAPH*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0002ab: LATIN SMALL LETTER LZ DIGRAPH*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0002ac: LATIN LETTER BILABIAL PERCUSSIVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0002ad: LATIN LETTER BIDENTAL PERCUSSIVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0002ae: LATIN SMALL LETTER TURNED H WITH FISHHOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0002af: LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0002b0: MODIFIER LETTER SMALL H*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0002b1: MODIFIER LETTER SMALL H WITH HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0002b2: MODIFIER LETTER SMALL J*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0002b3: MODIFIER LETTER SMALL R*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0002b4: MODIFIER LETTER SMALL TURNED R*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0002b5: MODIFIER LETTER SMALL TURNED R WITH HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0002b6: MODIFIER LETTER SMALL CAPITAL INVERTED R*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0002b7: MODIFIER LETTER SMALL W*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0002b8: MODIFIER LETTER SMALL Y*/
+ RTUNI_ALPHA, /* U+0002b9: MODIFIER LETTER PRIME*/
+ RTUNI_ALPHA, /* U+0002ba: MODIFIER LETTER DOUBLE PRIME*/
+ RTUNI_ALPHA, /* U+0002bb: MODIFIER LETTER TURNED COMMA*/
+ RTUNI_ALPHA, /* U+0002bc: MODIFIER LETTER APOSTROPHE*/
+ RTUNI_ALPHA, /* U+0002bd: MODIFIER LETTER REVERSED COMMA*/
+ RTUNI_ALPHA, /* U+0002be: MODIFIER LETTER RIGHT HALF RING*/
+ RTUNI_ALPHA, /* U+0002bf: MODIFIER LETTER LEFT HALF RING*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0002c0: MODIFIER LETTER GLOTTAL STOP*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0002c1: MODIFIER LETTER REVERSED GLOTTAL STOP*/
+ 0, /* U+0002c2: MODIFIER LETTER LEFT ARROWHEAD*/
+ 0, /* U+0002c3: MODIFIER LETTER RIGHT ARROWHEAD*/
+ 0, /* U+0002c4: MODIFIER LETTER UP ARROWHEAD*/
+ 0, /* U+0002c5: MODIFIER LETTER DOWN ARROWHEAD*/
+ RTUNI_ALPHA, /* U+0002c6: MODIFIER LETTER CIRCUMFLEX ACCENT*/
+ RTUNI_ALPHA, /* U+0002c7: CARON*/
+ RTUNI_ALPHA, /* U+0002c8: MODIFIER LETTER VERTICAL LINE*/
+ RTUNI_ALPHA, /* U+0002c9: MODIFIER LETTER MACRON*/
+ RTUNI_ALPHA, /* U+0002ca: MODIFIER LETTER ACUTE ACCENT*/
+ RTUNI_ALPHA, /* U+0002cb: MODIFIER LETTER GRAVE ACCENT*/
+ RTUNI_ALPHA, /* U+0002cc: MODIFIER LETTER LOW VERTICAL LINE*/
+ RTUNI_ALPHA, /* U+0002cd: MODIFIER LETTER LOW MACRON*/
+ RTUNI_ALPHA, /* U+0002ce: MODIFIER LETTER LOW GRAVE ACCENT*/
+ RTUNI_ALPHA, /* U+0002cf: MODIFIER LETTER LOW ACUTE ACCENT*/
+ RTUNI_ALPHA, /* U+0002d0: MODIFIER LETTER TRIANGULAR COLON*/
+ RTUNI_ALPHA, /* U+0002d1: MODIFIER LETTER HALF TRIANGULAR COLON*/
+ 0, /* U+0002d2: MODIFIER LETTER CENTRED RIGHT HALF RING*/
+ 0, /* U+0002d3: MODIFIER LETTER CENTRED LEFT HALF RING*/
+ 0, /* U+0002d4: MODIFIER LETTER UP TACK*/
+ 0, /* U+0002d5: MODIFIER LETTER DOWN TACK*/
+ 0, /* U+0002d6: MODIFIER LETTER PLUS SIGN*/
+ 0, /* U+0002d7: MODIFIER LETTER MINUS SIGN*/
+ 0, /* U+0002d8: BREVE*/
+ 0, /* U+0002d9: DOT ABOVE*/
+ 0, /* U+0002da: RING ABOVE*/
+ 0, /* U+0002db: OGONEK*/
+ 0, /* U+0002dc: SMALL TILDE*/
+ 0, /* U+0002dd: DOUBLE ACUTE ACCENT*/
+ 0, /* U+0002de: MODIFIER LETTER RHOTIC HOOK*/
+ 0, /* U+0002df: MODIFIER LETTER CROSS ACCENT*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0002e0: MODIFIER LETTER SMALL GAMMA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0002e1: MODIFIER LETTER SMALL L*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0002e2: MODIFIER LETTER SMALL S*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0002e3: MODIFIER LETTER SMALL X*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0002e4: MODIFIER LETTER SMALL REVERSED GLOTTAL STOP*/
+ 0, /* U+0002e5: MODIFIER LETTER EXTRA-HIGH TONE BAR*/
+ 0, /* U+0002e6: MODIFIER LETTER HIGH TONE BAR*/
+ 0, /* U+0002e7: MODIFIER LETTER MID TONE BAR*/
+ 0, /* U+0002e8: MODIFIER LETTER LOW TONE BAR*/
+ 0, /* U+0002e9: MODIFIER LETTER EXTRA-LOW TONE BAR*/
+ 0, /* U+0002ea: MODIFIER LETTER YIN DEPARTING TONE MARK*/
+ 0, /* U+0002eb: MODIFIER LETTER YANG DEPARTING TONE MARK*/
+ RTUNI_ALPHA, /* U+0002ec: MODIFIER LETTER VOICING*/
+ 0, /* U+0002ed: MODIFIER LETTER UNASPIRATED*/
+ RTUNI_ALPHA, /* U+0002ee: MODIFIER LETTER DOUBLE APOSTROPHE*/
+ 0, /* U+0002ef: MODIFIER LETTER LOW DOWN ARROWHEAD*/
+ 0, /* U+0002f0: MODIFIER LETTER LOW UP ARROWHEAD*/
+ 0, /* U+0002f1: MODIFIER LETTER LOW LEFT ARROWHEAD*/
+ 0, /* U+0002f2: MODIFIER LETTER LOW RIGHT ARROWHEAD*/
+ 0, /* U+0002f3: MODIFIER LETTER LOW RING*/
+ 0, /* U+0002f4: MODIFIER LETTER MIDDLE GRAVE ACCENT*/
+ 0, /* U+0002f5: MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT*/
+ 0, /* U+0002f6: MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT*/
+ 0, /* U+0002f7: MODIFIER LETTER LOW TILDE*/
+ 0, /* U+0002f8: MODIFIER LETTER RAISED COLON*/
+ 0, /* U+0002f9: MODIFIER LETTER BEGIN HIGH TONE*/
+ 0, /* U+0002fa: MODIFIER LETTER END HIGH TONE*/
+ 0, /* U+0002fb: MODIFIER LETTER BEGIN LOW TONE*/
+ 0, /* U+0002fc: MODIFIER LETTER END LOW TONE*/
+ 0, /* U+0002fd: MODIFIER LETTER SHELF*/
+ 0, /* U+0002fe: MODIFIER LETTER OPEN SHELF*/
+ 0, /* U+0002ff: MODIFIER LETTER LOW LEFT ARROW*/
+ 0, /* U+000300: COMBINING GRAVE ACCENT*/
+ 0, /* U+000301: COMBINING ACUTE ACCENT*/
+ 0, /* U+000302: COMBINING CIRCUMFLEX ACCENT*/
+ 0, /* U+000303: COMBINING TILDE*/
+ 0, /* U+000304: COMBINING MACRON*/
+ 0, /* U+000305: COMBINING OVERLINE*/
+ 0, /* U+000306: COMBINING BREVE*/
+ 0, /* U+000307: COMBINING DOT ABOVE*/
+ 0, /* U+000308: COMBINING DIAERESIS*/
+ 0, /* U+000309: COMBINING HOOK ABOVE*/
+ 0, /* U+00030a: COMBINING RING ABOVE*/
+ 0, /* U+00030b: COMBINING DOUBLE ACUTE ACCENT*/
+ 0, /* U+00030c: COMBINING CARON*/
+ 0, /* U+00030d: COMBINING VERTICAL LINE ABOVE*/
+ 0, /* U+00030e: COMBINING DOUBLE VERTICAL LINE ABOVE*/
+ 0, /* U+00030f: COMBINING DOUBLE GRAVE ACCENT*/
+ 0, /* U+000310: COMBINING CANDRABINDU*/
+ 0, /* U+000311: COMBINING INVERTED BREVE*/
+ 0, /* U+000312: COMBINING TURNED COMMA ABOVE*/
+ 0, /* U+000313: COMBINING COMMA ABOVE*/
+ 0, /* U+000314: COMBINING REVERSED COMMA ABOVE*/
+ 0, /* U+000315: COMBINING COMMA ABOVE RIGHT*/
+ 0, /* U+000316: COMBINING GRAVE ACCENT BELOW*/
+ 0, /* U+000317: COMBINING ACUTE ACCENT BELOW*/
+ 0, /* U+000318: COMBINING LEFT TACK BELOW*/
+ 0, /* U+000319: COMBINING RIGHT TACK BELOW*/
+ 0, /* U+00031a: COMBINING LEFT ANGLE ABOVE*/
+ 0, /* U+00031b: COMBINING HORN*/
+ 0, /* U+00031c: COMBINING LEFT HALF RING BELOW*/
+ 0, /* U+00031d: COMBINING UP TACK BELOW*/
+ 0, /* U+00031e: COMBINING DOWN TACK BELOW*/
+ 0, /* U+00031f: COMBINING PLUS SIGN BELOW*/
+ 0, /* U+000320: COMBINING MINUS SIGN BELOW*/
+ 0, /* U+000321: COMBINING PALATALIZED HOOK BELOW*/
+ 0, /* U+000322: COMBINING RETROFLEX HOOK BELOW*/
+ 0, /* U+000323: COMBINING DOT BELOW*/
+ 0, /* U+000324: COMBINING DIAERESIS BELOW*/
+ 0, /* U+000325: COMBINING RING BELOW*/
+ 0, /* U+000326: COMBINING COMMA BELOW*/
+ 0, /* U+000327: COMBINING CEDILLA*/
+ 0, /* U+000328: COMBINING OGONEK*/
+ 0, /* U+000329: COMBINING VERTICAL LINE BELOW*/
+ 0, /* U+00032a: COMBINING BRIDGE BELOW*/
+ 0, /* U+00032b: COMBINING INVERTED DOUBLE ARCH BELOW*/
+ 0, /* U+00032c: COMBINING CARON BELOW*/
+ 0, /* U+00032d: COMBINING CIRCUMFLEX ACCENT BELOW*/
+ 0, /* U+00032e: COMBINING BREVE BELOW*/
+ 0, /* U+00032f: COMBINING INVERTED BREVE BELOW*/
+ 0, /* U+000330: COMBINING TILDE BELOW*/
+ 0, /* U+000331: COMBINING MACRON BELOW*/
+ 0, /* U+000332: COMBINING LOW LINE*/
+ 0, /* U+000333: COMBINING DOUBLE LOW LINE*/
+ 0, /* U+000334: COMBINING TILDE OVERLAY*/
+ 0, /* U+000335: COMBINING SHORT STROKE OVERLAY*/
+ 0, /* U+000336: COMBINING LONG STROKE OVERLAY*/
+ 0, /* U+000337: COMBINING SHORT SOLIDUS OVERLAY*/
+ 0, /* U+000338: COMBINING LONG SOLIDUS OVERLAY*/
+ 0, /* U+000339: COMBINING RIGHT HALF RING BELOW*/
+ 0, /* U+00033a: COMBINING INVERTED BRIDGE BELOW*/
+ 0, /* U+00033b: COMBINING SQUARE BELOW*/
+ 0, /* U+00033c: COMBINING SEAGULL BELOW*/
+ 0, /* U+00033d: COMBINING X ABOVE*/
+ 0, /* U+00033e: COMBINING VERTICAL TILDE*/
+ 0, /* U+00033f: COMBINING DOUBLE OVERLINE*/
+ 0, /* U+000340: COMBINING GRAVE TONE MARK*/
+ 0, /* U+000341: COMBINING ACUTE TONE MARK*/
+ 0, /* U+000342: COMBINING GREEK PERISPOMENI*/
+ 0, /* U+000343: COMBINING GREEK KORONIS*/
+ 0, /* U+000344: COMBINING GREEK DIALYTIKA TONOS*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000345: COMBINING GREEK YPOGEGRAMMENI*/
+ 0, /* U+000346: COMBINING BRIDGE ABOVE*/
+ 0, /* U+000347: COMBINING EQUALS SIGN BELOW*/
+ 0, /* U+000348: COMBINING DOUBLE VERTICAL LINE BELOW*/
+ 0, /* U+000349: COMBINING LEFT ANGLE BELOW*/
+ 0, /* U+00034a: COMBINING NOT TILDE ABOVE*/
+ 0, /* U+00034b: COMBINING HOMOTHETIC ABOVE*/
+ 0, /* U+00034c: COMBINING ALMOST EQUAL TO ABOVE*/
+ 0, /* U+00034d: COMBINING LEFT RIGHT ARROW BELOW*/
+ 0, /* U+00034e: COMBINING UPWARDS ARROW BELOW*/
+ 0, /* U+00034f: COMBINING GRAPHEME JOINER*/
+ 0, /* U+000350: COMBINING RIGHT ARROWHEAD ABOVE*/
+ 0, /* U+000351: COMBINING LEFT HALF RING ABOVE*/
+ 0, /* U+000352: COMBINING FERMATA*/
+ 0, /* U+000353: COMBINING X BELOW*/
+ 0, /* U+000354: COMBINING LEFT ARROWHEAD BELOW*/
+ 0, /* U+000355: COMBINING RIGHT ARROWHEAD BELOW*/
+ 0, /* U+000356: COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW*/
+ 0, /* U+000357: COMBINING RIGHT HALF RING ABOVE*/
+ 0, /* U+000358: COMBINING DOT ABOVE RIGHT*/
+ 0, /* U+000359: COMBINING ASTERISK BELOW*/
+ 0, /* U+00035a: COMBINING DOUBLE RING BELOW*/
+ 0, /* U+00035b: COMBINING ZIGZAG ABOVE*/
+ 0, /* U+00035c: COMBINING DOUBLE BREVE BELOW*/
+ 0, /* U+00035d: COMBINING DOUBLE BREVE*/
+ 0, /* U+00035e: COMBINING DOUBLE MACRON*/
+ 0, /* U+00035f: COMBINING DOUBLE MACRON BELOW*/
+ 0, /* U+000360: COMBINING DOUBLE TILDE*/
+ 0, /* U+000361: COMBINING DOUBLE INVERTED BREVE*/
+ 0, /* U+000362: COMBINING DOUBLE RIGHTWARDS ARROW BELOW*/
+ 0, /* U+000363: COMBINING LATIN SMALL LETTER A*/
+ 0, /* U+000364: COMBINING LATIN SMALL LETTER E*/
+ 0, /* U+000365: COMBINING LATIN SMALL LETTER I*/
+ 0, /* U+000366: COMBINING LATIN SMALL LETTER O*/
+ 0, /* U+000367: COMBINING LATIN SMALL LETTER U*/
+ 0, /* U+000368: COMBINING LATIN SMALL LETTER C*/
+ 0, /* U+000369: COMBINING LATIN SMALL LETTER D*/
+ 0, /* U+00036a: COMBINING LATIN SMALL LETTER H*/
+ 0, /* U+00036b: COMBINING LATIN SMALL LETTER M*/
+ 0, /* U+00036c: COMBINING LATIN SMALL LETTER R*/
+ 0, /* U+00036d: COMBINING LATIN SMALL LETTER T*/
+ 0, /* U+00036e: COMBINING LATIN SMALL LETTER V*/
+ 0, /* U+00036f: COMBINING LATIN SMALL LETTER X*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000370: GREEK CAPITAL LETTER HETA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000371: GREEK SMALL LETTER HETA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000372: GREEK CAPITAL LETTER ARCHAIC SAMPI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000373: GREEK SMALL LETTER ARCHAIC SAMPI*/
+ RTUNI_ALPHA, /* U+000374: GREEK NUMERAL SIGN*/
+ 0, /* U+000375: GREEK LOWER NUMERAL SIGN*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000376: GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000377: GREEK SMALL LETTER PAMPHYLIAN DIGAMMA*/
+ 0, /* U+000378: */
+ 0, /* U+000379: */
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00037a: GREEK YPOGEGRAMMENI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00037b: GREEK SMALL REVERSED LUNATE SIGMA SYMBOL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00037c: GREEK SMALL DOTTED LUNATE SIGMA SYMBOL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00037d: GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL*/
+ 0, /* U+00037e: GREEK QUESTION MARK*/
+ 0, /* U+00037f: */
+ 0, /* U+000380: */
+ 0, /* U+000381: */
+ 0, /* U+000382: */
+ 0, /* U+000383: */
+ 0, /* U+000384: GREEK TONOS*/
+ 0, /* U+000385: GREEK DIALYTIKA TONOS*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000386: GREEK CAPITAL LETTER ALPHA WITH TONOS*/
+ 0, /* U+000387: GREEK ANO TELEIA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000388: GREEK CAPITAL LETTER EPSILON WITH TONOS*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000389: GREEK CAPITAL LETTER ETA WITH TONOS*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00038a: GREEK CAPITAL LETTER IOTA WITH TONOS*/
+ 0, /* U+00038b: */
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00038c: GREEK CAPITAL LETTER OMICRON WITH TONOS*/
+ 0, /* U+00038d: */
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00038e: GREEK CAPITAL LETTER UPSILON WITH TONOS*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00038f: GREEK CAPITAL LETTER OMEGA WITH TONOS*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000390: GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000391: GREEK CAPITAL LETTER ALPHA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000392: GREEK CAPITAL LETTER BETA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000393: GREEK CAPITAL LETTER GAMMA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000394: GREEK CAPITAL LETTER DELTA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000395: GREEK CAPITAL LETTER EPSILON*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000396: GREEK CAPITAL LETTER ZETA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000397: GREEK CAPITAL LETTER ETA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000398: GREEK CAPITAL LETTER THETA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000399: GREEK CAPITAL LETTER IOTA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00039a: GREEK CAPITAL LETTER KAPPA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00039b: GREEK CAPITAL LETTER LAMDA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00039c: GREEK CAPITAL LETTER MU*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00039d: GREEK CAPITAL LETTER NU*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00039e: GREEK CAPITAL LETTER XI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00039f: GREEK CAPITAL LETTER OMICRON*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0003a0: GREEK CAPITAL LETTER PI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0003a1: GREEK CAPITAL LETTER RHO*/
+ 0, /* U+0003a2: */
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0003a3: GREEK CAPITAL LETTER SIGMA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0003a4: GREEK CAPITAL LETTER TAU*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0003a5: GREEK CAPITAL LETTER UPSILON*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0003a6: GREEK CAPITAL LETTER PHI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0003a7: GREEK CAPITAL LETTER CHI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0003a8: GREEK CAPITAL LETTER PSI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0003a9: GREEK CAPITAL LETTER OMEGA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0003aa: GREEK CAPITAL LETTER IOTA WITH DIALYTIKA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0003ab: GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0003ac: GREEK SMALL LETTER ALPHA WITH TONOS*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0003ad: GREEK SMALL LETTER EPSILON WITH TONOS*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0003ae: GREEK SMALL LETTER ETA WITH TONOS*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0003af: GREEK SMALL LETTER IOTA WITH TONOS*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0003b0: GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0003b1: GREEK SMALL LETTER ALPHA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0003b2: GREEK SMALL LETTER BETA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0003b3: GREEK SMALL LETTER GAMMA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0003b4: GREEK SMALL LETTER DELTA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0003b5: GREEK SMALL LETTER EPSILON*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0003b6: GREEK SMALL LETTER ZETA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0003b7: GREEK SMALL LETTER ETA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0003b8: GREEK SMALL LETTER THETA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0003b9: GREEK SMALL LETTER IOTA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0003ba: GREEK SMALL LETTER KAPPA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0003bb: GREEK SMALL LETTER LAMDA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0003bc: GREEK SMALL LETTER MU*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0003bd: GREEK SMALL LETTER NU*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0003be: GREEK SMALL LETTER XI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0003bf: GREEK SMALL LETTER OMICRON*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0003c0: GREEK SMALL LETTER PI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0003c1: GREEK SMALL LETTER RHO*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0003c2: GREEK SMALL LETTER FINAL SIGMA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0003c3: GREEK SMALL LETTER SIGMA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0003c4: GREEK SMALL LETTER TAU*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0003c5: GREEK SMALL LETTER UPSILON*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0003c6: GREEK SMALL LETTER PHI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0003c7: GREEK SMALL LETTER CHI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0003c8: GREEK SMALL LETTER PSI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0003c9: GREEK SMALL LETTER OMEGA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0003ca: GREEK SMALL LETTER IOTA WITH DIALYTIKA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0003cb: GREEK SMALL LETTER UPSILON WITH DIALYTIKA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0003cc: GREEK SMALL LETTER OMICRON WITH TONOS*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0003cd: GREEK SMALL LETTER UPSILON WITH TONOS*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0003ce: GREEK SMALL LETTER OMEGA WITH TONOS*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0003cf: GREEK CAPITAL KAI SYMBOL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0003d0: GREEK BETA SYMBOL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0003d1: GREEK THETA SYMBOL*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0003d2: GREEK UPSILON WITH HOOK SYMBOL*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0003d3: GREEK UPSILON WITH ACUTE AND HOOK SYMBOL*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0003d4: GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0003d5: GREEK PHI SYMBOL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0003d6: GREEK PI SYMBOL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0003d7: GREEK KAI SYMBOL*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0003d8: GREEK LETTER ARCHAIC KOPPA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0003d9: GREEK SMALL LETTER ARCHAIC KOPPA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0003da: GREEK LETTER STIGMA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0003db: GREEK SMALL LETTER STIGMA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0003dc: GREEK LETTER DIGAMMA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0003dd: GREEK SMALL LETTER DIGAMMA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0003de: GREEK LETTER KOPPA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0003df: GREEK SMALL LETTER KOPPA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0003e0: GREEK LETTER SAMPI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0003e1: GREEK SMALL LETTER SAMPI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0003e2: COPTIC CAPITAL LETTER SHEI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0003e3: COPTIC SMALL LETTER SHEI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0003e4: COPTIC CAPITAL LETTER FEI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0003e5: COPTIC SMALL LETTER FEI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0003e6: COPTIC CAPITAL LETTER KHEI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0003e7: COPTIC SMALL LETTER KHEI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0003e8: COPTIC CAPITAL LETTER HORI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0003e9: COPTIC SMALL LETTER HORI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0003ea: COPTIC CAPITAL LETTER GANGIA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0003eb: COPTIC SMALL LETTER GANGIA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0003ec: COPTIC CAPITAL LETTER SHIMA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0003ed: COPTIC SMALL LETTER SHIMA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0003ee: COPTIC CAPITAL LETTER DEI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0003ef: COPTIC SMALL LETTER DEI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0003f0: GREEK KAPPA SYMBOL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0003f1: GREEK RHO SYMBOL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0003f2: GREEK LUNATE SIGMA SYMBOL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0003f3: GREEK LETTER YOT*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0003f4: GREEK CAPITAL THETA SYMBOL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0003f5: GREEK LUNATE EPSILON SYMBOL*/
+ 0, /* U+0003f6: GREEK REVERSED LUNATE EPSILON SYMBOL*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0003f7: GREEK CAPITAL LETTER SHO*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0003f8: GREEK SMALL LETTER SHO*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0003f9: GREEK CAPITAL LUNATE SIGMA SYMBOL*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0003fa: GREEK CAPITAL LETTER SAN*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0003fb: GREEK SMALL LETTER SAN*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0003fc: GREEK RHO WITH STROKE SYMBOL*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0003fd: GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0003fe: GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0003ff: GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000400: CYRILLIC CAPITAL LETTER IE WITH GRAVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000401: CYRILLIC CAPITAL LETTER IO*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000402: CYRILLIC CAPITAL LETTER DJE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000403: CYRILLIC CAPITAL LETTER GJE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000404: CYRILLIC CAPITAL LETTER UKRAINIAN IE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000405: CYRILLIC CAPITAL LETTER DZE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000406: CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000407: CYRILLIC CAPITAL LETTER YI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000408: CYRILLIC CAPITAL LETTER JE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000409: CYRILLIC CAPITAL LETTER LJE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00040a: CYRILLIC CAPITAL LETTER NJE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00040b: CYRILLIC CAPITAL LETTER TSHE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00040c: CYRILLIC CAPITAL LETTER KJE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00040d: CYRILLIC CAPITAL LETTER I WITH GRAVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00040e: CYRILLIC CAPITAL LETTER SHORT U*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00040f: CYRILLIC CAPITAL LETTER DZHE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000410: CYRILLIC CAPITAL LETTER A*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000411: CYRILLIC CAPITAL LETTER BE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000412: CYRILLIC CAPITAL LETTER VE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000413: CYRILLIC CAPITAL LETTER GHE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000414: CYRILLIC CAPITAL LETTER DE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000415: CYRILLIC CAPITAL LETTER IE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000416: CYRILLIC CAPITAL LETTER ZHE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000417: CYRILLIC CAPITAL LETTER ZE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000418: CYRILLIC CAPITAL LETTER I*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000419: CYRILLIC CAPITAL LETTER SHORT I*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00041a: CYRILLIC CAPITAL LETTER KA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00041b: CYRILLIC CAPITAL LETTER EL*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00041c: CYRILLIC CAPITAL LETTER EM*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00041d: CYRILLIC CAPITAL LETTER EN*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00041e: CYRILLIC CAPITAL LETTER O*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00041f: CYRILLIC CAPITAL LETTER PE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000420: CYRILLIC CAPITAL LETTER ER*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000421: CYRILLIC CAPITAL LETTER ES*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000422: CYRILLIC CAPITAL LETTER TE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000423: CYRILLIC CAPITAL LETTER U*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000424: CYRILLIC CAPITAL LETTER EF*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000425: CYRILLIC CAPITAL LETTER HA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000426: CYRILLIC CAPITAL LETTER TSE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000427: CYRILLIC CAPITAL LETTER CHE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000428: CYRILLIC CAPITAL LETTER SHA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000429: CYRILLIC CAPITAL LETTER SHCHA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00042a: CYRILLIC CAPITAL LETTER HARD SIGN*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00042b: CYRILLIC CAPITAL LETTER YERU*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00042c: CYRILLIC CAPITAL LETTER SOFT SIGN*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00042d: CYRILLIC CAPITAL LETTER E*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00042e: CYRILLIC CAPITAL LETTER YU*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00042f: CYRILLIC CAPITAL LETTER YA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000430: CYRILLIC SMALL LETTER A*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000431: CYRILLIC SMALL LETTER BE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000432: CYRILLIC SMALL LETTER VE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000433: CYRILLIC SMALL LETTER GHE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000434: CYRILLIC SMALL LETTER DE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000435: CYRILLIC SMALL LETTER IE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000436: CYRILLIC SMALL LETTER ZHE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000437: CYRILLIC SMALL LETTER ZE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000438: CYRILLIC SMALL LETTER I*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000439: CYRILLIC SMALL LETTER SHORT I*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00043a: CYRILLIC SMALL LETTER KA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00043b: CYRILLIC SMALL LETTER EL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00043c: CYRILLIC SMALL LETTER EM*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00043d: CYRILLIC SMALL LETTER EN*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00043e: CYRILLIC SMALL LETTER O*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00043f: CYRILLIC SMALL LETTER PE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000440: CYRILLIC SMALL LETTER ER*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000441: CYRILLIC SMALL LETTER ES*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000442: CYRILLIC SMALL LETTER TE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000443: CYRILLIC SMALL LETTER U*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000444: CYRILLIC SMALL LETTER EF*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000445: CYRILLIC SMALL LETTER HA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000446: CYRILLIC SMALL LETTER TSE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000447: CYRILLIC SMALL LETTER CHE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000448: CYRILLIC SMALL LETTER SHA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000449: CYRILLIC SMALL LETTER SHCHA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00044a: CYRILLIC SMALL LETTER HARD SIGN*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00044b: CYRILLIC SMALL LETTER YERU*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00044c: CYRILLIC SMALL LETTER SOFT SIGN*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00044d: CYRILLIC SMALL LETTER E*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00044e: CYRILLIC SMALL LETTER YU*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00044f: CYRILLIC SMALL LETTER YA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000450: CYRILLIC SMALL LETTER IE WITH GRAVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000451: CYRILLIC SMALL LETTER IO*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000452: CYRILLIC SMALL LETTER DJE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000453: CYRILLIC SMALL LETTER GJE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000454: CYRILLIC SMALL LETTER UKRAINIAN IE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000455: CYRILLIC SMALL LETTER DZE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000456: CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000457: CYRILLIC SMALL LETTER YI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000458: CYRILLIC SMALL LETTER JE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000459: CYRILLIC SMALL LETTER LJE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00045a: CYRILLIC SMALL LETTER NJE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00045b: CYRILLIC SMALL LETTER TSHE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00045c: CYRILLIC SMALL LETTER KJE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00045d: CYRILLIC SMALL LETTER I WITH GRAVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00045e: CYRILLIC SMALL LETTER SHORT U*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00045f: CYRILLIC SMALL LETTER DZHE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000460: CYRILLIC CAPITAL LETTER OMEGA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000461: CYRILLIC SMALL LETTER OMEGA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000462: CYRILLIC CAPITAL LETTER YAT*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000463: CYRILLIC SMALL LETTER YAT*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000464: CYRILLIC CAPITAL LETTER IOTIFIED E*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000465: CYRILLIC SMALL LETTER IOTIFIED E*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000466: CYRILLIC CAPITAL LETTER LITTLE YUS*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000467: CYRILLIC SMALL LETTER LITTLE YUS*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000468: CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000469: CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00046a: CYRILLIC CAPITAL LETTER BIG YUS*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00046b: CYRILLIC SMALL LETTER BIG YUS*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00046c: CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00046d: CYRILLIC SMALL LETTER IOTIFIED BIG YUS*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00046e: CYRILLIC CAPITAL LETTER KSI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00046f: CYRILLIC SMALL LETTER KSI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000470: CYRILLIC CAPITAL LETTER PSI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000471: CYRILLIC SMALL LETTER PSI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000472: CYRILLIC CAPITAL LETTER FITA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000473: CYRILLIC SMALL LETTER FITA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000474: CYRILLIC CAPITAL LETTER IZHITSA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000475: CYRILLIC SMALL LETTER IZHITSA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000476: CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000477: CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000478: CYRILLIC CAPITAL LETTER UK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000479: CYRILLIC SMALL LETTER UK*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00047a: CYRILLIC CAPITAL LETTER ROUND OMEGA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00047b: CYRILLIC SMALL LETTER ROUND OMEGA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00047c: CYRILLIC CAPITAL LETTER OMEGA WITH TITLO*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00047d: CYRILLIC SMALL LETTER OMEGA WITH TITLO*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00047e: CYRILLIC CAPITAL LETTER OT*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00047f: CYRILLIC SMALL LETTER OT*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000480: CYRILLIC CAPITAL LETTER KOPPA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000481: CYRILLIC SMALL LETTER KOPPA*/
+ 0, /* U+000482: CYRILLIC THOUSANDS SIGN*/
+ 0, /* U+000483: COMBINING CYRILLIC TITLO*/
+ 0, /* U+000484: COMBINING CYRILLIC PALATALIZATION*/
+ 0, /* U+000485: COMBINING CYRILLIC DASIA PNEUMATA*/
+ 0, /* U+000486: COMBINING CYRILLIC PSILI PNEUMATA*/
+ 0, /* U+000487: COMBINING CYRILLIC POKRYTIE*/
+ 0, /* U+000488: COMBINING CYRILLIC HUNDRED THOUSANDS SIGN*/
+ 0, /* U+000489: COMBINING CYRILLIC MILLIONS SIGN*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00048a: CYRILLIC CAPITAL LETTER SHORT I WITH TAIL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00048b: CYRILLIC SMALL LETTER SHORT I WITH TAIL*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00048c: CYRILLIC CAPITAL LETTER SEMISOFT SIGN*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00048d: CYRILLIC SMALL LETTER SEMISOFT SIGN*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00048e: CYRILLIC CAPITAL LETTER ER WITH TICK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00048f: CYRILLIC SMALL LETTER ER WITH TICK*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000490: CYRILLIC CAPITAL LETTER GHE WITH UPTURN*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000491: CYRILLIC SMALL LETTER GHE WITH UPTURN*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000492: CYRILLIC CAPITAL LETTER GHE WITH STROKE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000493: CYRILLIC SMALL LETTER GHE WITH STROKE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000494: CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000495: CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000496: CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000497: CYRILLIC SMALL LETTER ZHE WITH DESCENDER*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000498: CYRILLIC CAPITAL LETTER ZE WITH DESCENDER*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000499: CYRILLIC SMALL LETTER ZE WITH DESCENDER*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00049a: CYRILLIC CAPITAL LETTER KA WITH DESCENDER*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00049b: CYRILLIC SMALL LETTER KA WITH DESCENDER*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00049c: CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00049d: CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00049e: CYRILLIC CAPITAL LETTER KA WITH STROKE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00049f: CYRILLIC SMALL LETTER KA WITH STROKE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0004a0: CYRILLIC CAPITAL LETTER BASHKIR KA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0004a1: CYRILLIC SMALL LETTER BASHKIR KA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0004a2: CYRILLIC CAPITAL LETTER EN WITH DESCENDER*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0004a3: CYRILLIC SMALL LETTER EN WITH DESCENDER*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0004a4: CYRILLIC CAPITAL LIGATURE EN GHE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0004a5: CYRILLIC SMALL LIGATURE EN GHE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0004a6: CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0004a7: CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0004a8: CYRILLIC CAPITAL LETTER ABKHASIAN HA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0004a9: CYRILLIC SMALL LETTER ABKHASIAN HA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0004aa: CYRILLIC CAPITAL LETTER ES WITH DESCENDER*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0004ab: CYRILLIC SMALL LETTER ES WITH DESCENDER*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0004ac: CYRILLIC CAPITAL LETTER TE WITH DESCENDER*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0004ad: CYRILLIC SMALL LETTER TE WITH DESCENDER*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0004ae: CYRILLIC CAPITAL LETTER STRAIGHT U*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0004af: CYRILLIC SMALL LETTER STRAIGHT U*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0004b0: CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0004b1: CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0004b2: CYRILLIC CAPITAL LETTER HA WITH DESCENDER*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0004b3: CYRILLIC SMALL LETTER HA WITH DESCENDER*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0004b4: CYRILLIC CAPITAL LIGATURE TE TSE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0004b5: CYRILLIC SMALL LIGATURE TE TSE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0004b6: CYRILLIC CAPITAL LETTER CHE WITH DESCENDER*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0004b7: CYRILLIC SMALL LETTER CHE WITH DESCENDER*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0004b8: CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0004b9: CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0004ba: CYRILLIC CAPITAL LETTER SHHA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0004bb: CYRILLIC SMALL LETTER SHHA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0004bc: CYRILLIC CAPITAL LETTER ABKHASIAN CHE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0004bd: CYRILLIC SMALL LETTER ABKHASIAN CHE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0004be: CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0004bf: CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0004c0: CYRILLIC LETTER PALOCHKA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0004c1: CYRILLIC CAPITAL LETTER ZHE WITH BREVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0004c2: CYRILLIC SMALL LETTER ZHE WITH BREVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0004c3: CYRILLIC CAPITAL LETTER KA WITH HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0004c4: CYRILLIC SMALL LETTER KA WITH HOOK*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0004c5: CYRILLIC CAPITAL LETTER EL WITH TAIL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0004c6: CYRILLIC SMALL LETTER EL WITH TAIL*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0004c7: CYRILLIC CAPITAL LETTER EN WITH HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0004c8: CYRILLIC SMALL LETTER EN WITH HOOK*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0004c9: CYRILLIC CAPITAL LETTER EN WITH TAIL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0004ca: CYRILLIC SMALL LETTER EN WITH TAIL*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0004cb: CYRILLIC CAPITAL LETTER KHAKASSIAN CHE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0004cc: CYRILLIC SMALL LETTER KHAKASSIAN CHE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0004cd: CYRILLIC CAPITAL LETTER EM WITH TAIL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0004ce: CYRILLIC SMALL LETTER EM WITH TAIL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0004cf: CYRILLIC SMALL LETTER PALOCHKA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0004d0: CYRILLIC CAPITAL LETTER A WITH BREVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0004d1: CYRILLIC SMALL LETTER A WITH BREVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0004d2: CYRILLIC CAPITAL LETTER A WITH DIAERESIS*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0004d3: CYRILLIC SMALL LETTER A WITH DIAERESIS*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0004d4: CYRILLIC CAPITAL LIGATURE A IE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0004d5: CYRILLIC SMALL LIGATURE A IE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0004d6: CYRILLIC CAPITAL LETTER IE WITH BREVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0004d7: CYRILLIC SMALL LETTER IE WITH BREVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0004d8: CYRILLIC CAPITAL LETTER SCHWA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0004d9: CYRILLIC SMALL LETTER SCHWA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0004da: CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0004db: CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0004dc: CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0004dd: CYRILLIC SMALL LETTER ZHE WITH DIAERESIS*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0004de: CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0004df: CYRILLIC SMALL LETTER ZE WITH DIAERESIS*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0004e0: CYRILLIC CAPITAL LETTER ABKHASIAN DZE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0004e1: CYRILLIC SMALL LETTER ABKHASIAN DZE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0004e2: CYRILLIC CAPITAL LETTER I WITH MACRON*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0004e3: CYRILLIC SMALL LETTER I WITH MACRON*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0004e4: CYRILLIC CAPITAL LETTER I WITH DIAERESIS*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0004e5: CYRILLIC SMALL LETTER I WITH DIAERESIS*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0004e6: CYRILLIC CAPITAL LETTER O WITH DIAERESIS*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0004e7: CYRILLIC SMALL LETTER O WITH DIAERESIS*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0004e8: CYRILLIC CAPITAL LETTER BARRED O*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0004e9: CYRILLIC SMALL LETTER BARRED O*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0004ea: CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0004eb: CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0004ec: CYRILLIC CAPITAL LETTER E WITH DIAERESIS*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0004ed: CYRILLIC SMALL LETTER E WITH DIAERESIS*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0004ee: CYRILLIC CAPITAL LETTER U WITH MACRON*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0004ef: CYRILLIC SMALL LETTER U WITH MACRON*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0004f0: CYRILLIC CAPITAL LETTER U WITH DIAERESIS*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0004f1: CYRILLIC SMALL LETTER U WITH DIAERESIS*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0004f2: CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0004f3: CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0004f4: CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0004f5: CYRILLIC SMALL LETTER CHE WITH DIAERESIS*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0004f6: CYRILLIC CAPITAL LETTER GHE WITH DESCENDER*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0004f7: CYRILLIC SMALL LETTER GHE WITH DESCENDER*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0004f8: CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0004f9: CYRILLIC SMALL LETTER YERU WITH DIAERESIS*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0004fa: CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0004fb: CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0004fc: CYRILLIC CAPITAL LETTER HA WITH HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0004fd: CYRILLIC SMALL LETTER HA WITH HOOK*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0004fe: CYRILLIC CAPITAL LETTER HA WITH STROKE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0004ff: CYRILLIC SMALL LETTER HA WITH STROKE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000500: CYRILLIC CAPITAL LETTER KOMI DE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000501: CYRILLIC SMALL LETTER KOMI DE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000502: CYRILLIC CAPITAL LETTER KOMI DJE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000503: CYRILLIC SMALL LETTER KOMI DJE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000504: CYRILLIC CAPITAL LETTER KOMI ZJE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000505: CYRILLIC SMALL LETTER KOMI ZJE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000506: CYRILLIC CAPITAL LETTER KOMI DZJE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000507: CYRILLIC SMALL LETTER KOMI DZJE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000508: CYRILLIC CAPITAL LETTER KOMI LJE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000509: CYRILLIC SMALL LETTER KOMI LJE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00050a: CYRILLIC CAPITAL LETTER KOMI NJE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00050b: CYRILLIC SMALL LETTER KOMI NJE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00050c: CYRILLIC CAPITAL LETTER KOMI SJE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00050d: CYRILLIC SMALL LETTER KOMI SJE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00050e: CYRILLIC CAPITAL LETTER KOMI TJE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00050f: CYRILLIC SMALL LETTER KOMI TJE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000510: CYRILLIC CAPITAL LETTER REVERSED ZE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000511: CYRILLIC SMALL LETTER REVERSED ZE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000512: CYRILLIC CAPITAL LETTER EL WITH HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000513: CYRILLIC SMALL LETTER EL WITH HOOK*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000514: CYRILLIC CAPITAL LETTER LHA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000515: CYRILLIC SMALL LETTER LHA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000516: CYRILLIC CAPITAL LETTER RHA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000517: CYRILLIC SMALL LETTER RHA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000518: CYRILLIC CAPITAL LETTER YAE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000519: CYRILLIC SMALL LETTER YAE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00051a: CYRILLIC CAPITAL LETTER QA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00051b: CYRILLIC SMALL LETTER QA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00051c: CYRILLIC CAPITAL LETTER WE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00051d: CYRILLIC SMALL LETTER WE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00051e: CYRILLIC CAPITAL LETTER ALEUT KA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00051f: CYRILLIC SMALL LETTER ALEUT KA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000520: CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000521: CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000522: CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000523: CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000524: CYRILLIC CAPITAL LETTER PE WITH DESCENDER*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000525: CYRILLIC SMALL LETTER PE WITH DESCENDER*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000526: CYRILLIC CAPITAL LETTER SHHA WITH DESCENDER*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000527: CYRILLIC SMALL LETTER SHHA WITH DESCENDER*/
+ 0, /* U+000528: */
+ 0, /* U+000529: */
+ 0, /* U+00052a: */
+ 0, /* U+00052b: */
+ 0, /* U+00052c: */
+ 0, /* U+00052d: */
+ 0, /* U+00052e: */
+ 0, /* U+00052f: */
+ 0, /* U+000530: */
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000531: ARMENIAN CAPITAL LETTER AYB*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000532: ARMENIAN CAPITAL LETTER BEN*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000533: ARMENIAN CAPITAL LETTER GIM*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000534: ARMENIAN CAPITAL LETTER DA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000535: ARMENIAN CAPITAL LETTER ECH*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000536: ARMENIAN CAPITAL LETTER ZA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000537: ARMENIAN CAPITAL LETTER EH*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000538: ARMENIAN CAPITAL LETTER ET*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000539: ARMENIAN CAPITAL LETTER TO*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00053a: ARMENIAN CAPITAL LETTER ZHE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00053b: ARMENIAN CAPITAL LETTER INI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00053c: ARMENIAN CAPITAL LETTER LIWN*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00053d: ARMENIAN CAPITAL LETTER XEH*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00053e: ARMENIAN CAPITAL LETTER CA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00053f: ARMENIAN CAPITAL LETTER KEN*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000540: ARMENIAN CAPITAL LETTER HO*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000541: ARMENIAN CAPITAL LETTER JA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000542: ARMENIAN CAPITAL LETTER GHAD*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000543: ARMENIAN CAPITAL LETTER CHEH*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000544: ARMENIAN CAPITAL LETTER MEN*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000545: ARMENIAN CAPITAL LETTER YI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000546: ARMENIAN CAPITAL LETTER NOW*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000547: ARMENIAN CAPITAL LETTER SHA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000548: ARMENIAN CAPITAL LETTER VO*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000549: ARMENIAN CAPITAL LETTER CHA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00054a: ARMENIAN CAPITAL LETTER PEH*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00054b: ARMENIAN CAPITAL LETTER JHEH*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00054c: ARMENIAN CAPITAL LETTER RA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00054d: ARMENIAN CAPITAL LETTER SEH*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00054e: ARMENIAN CAPITAL LETTER VEW*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00054f: ARMENIAN CAPITAL LETTER TIWN*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000550: ARMENIAN CAPITAL LETTER REH*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000551: ARMENIAN CAPITAL LETTER CO*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000552: ARMENIAN CAPITAL LETTER YIWN*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000553: ARMENIAN CAPITAL LETTER PIWR*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000554: ARMENIAN CAPITAL LETTER KEH*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000555: ARMENIAN CAPITAL LETTER OH*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+000556: ARMENIAN CAPITAL LETTER FEH*/
+ 0, /* U+000557: */
+ 0, /* U+000558: */
+ RTUNI_ALPHA, /* U+000559: ARMENIAN MODIFIER LETTER LEFT HALF RING*/
+ 0, /* U+00055a: ARMENIAN APOSTROPHE*/
+ 0, /* U+00055b: ARMENIAN EMPHASIS MARK*/
+ 0, /* U+00055c: ARMENIAN EXCLAMATION MARK*/
+ 0, /* U+00055d: ARMENIAN COMMA*/
+ 0, /* U+00055e: ARMENIAN QUESTION MARK*/
+ 0, /* U+00055f: ARMENIAN ABBREVIATION MARK*/
+ 0, /* U+000560: */
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000561: ARMENIAN SMALL LETTER AYB*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000562: ARMENIAN SMALL LETTER BEN*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000563: ARMENIAN SMALL LETTER GIM*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000564: ARMENIAN SMALL LETTER DA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000565: ARMENIAN SMALL LETTER ECH*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000566: ARMENIAN SMALL LETTER ZA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000567: ARMENIAN SMALL LETTER EH*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000568: ARMENIAN SMALL LETTER ET*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000569: ARMENIAN SMALL LETTER TO*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00056a: ARMENIAN SMALL LETTER ZHE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00056b: ARMENIAN SMALL LETTER INI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00056c: ARMENIAN SMALL LETTER LIWN*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00056d: ARMENIAN SMALL LETTER XEH*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00056e: ARMENIAN SMALL LETTER CA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00056f: ARMENIAN SMALL LETTER KEN*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000570: ARMENIAN SMALL LETTER HO*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000571: ARMENIAN SMALL LETTER JA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000572: ARMENIAN SMALL LETTER GHAD*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000573: ARMENIAN SMALL LETTER CHEH*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000574: ARMENIAN SMALL LETTER MEN*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000575: ARMENIAN SMALL LETTER YI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000576: ARMENIAN SMALL LETTER NOW*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000577: ARMENIAN SMALL LETTER SHA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000578: ARMENIAN SMALL LETTER VO*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000579: ARMENIAN SMALL LETTER CHA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00057a: ARMENIAN SMALL LETTER PEH*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00057b: ARMENIAN SMALL LETTER JHEH*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00057c: ARMENIAN SMALL LETTER RA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00057d: ARMENIAN SMALL LETTER SEH*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00057e: ARMENIAN SMALL LETTER VEW*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00057f: ARMENIAN SMALL LETTER TIWN*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000580: ARMENIAN SMALL LETTER REH*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000581: ARMENIAN SMALL LETTER CO*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000582: ARMENIAN SMALL LETTER YIWN*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000583: ARMENIAN SMALL LETTER PIWR*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000584: ARMENIAN SMALL LETTER KEH*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000585: ARMENIAN SMALL LETTER OH*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000586: ARMENIAN SMALL LETTER FEH*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+000587: ARMENIAN SMALL LIGATURE ECH YIWN*/
+ 0, /* U+000588: */
+ 0, /* U+000589: ARMENIAN FULL STOP*/
+ 0, /* U+00058a: ARMENIAN HYPHEN*/
+ 0, /* U+00058b: */
+ 0, /* U+00058c: */
+ 0, /* U+00058d: */
+ 0, /* U+00058e: */
+ 0, /* U+00058f: ARMENIAN DRAM SIGN*/
+ 0, /* U+000590: */
+ 0, /* U+000591: HEBREW ACCENT ETNAHTA*/
+ 0, /* U+000592: HEBREW ACCENT SEGOL*/
+ 0, /* U+000593: HEBREW ACCENT SHALSHELET*/
+ 0, /* U+000594: HEBREW ACCENT ZAQEF QATAN*/
+ 0, /* U+000595: HEBREW ACCENT ZAQEF GADOL*/
+ 0, /* U+000596: HEBREW ACCENT TIPEHA*/
+ 0, /* U+000597: HEBREW ACCENT REVIA*/
+ 0, /* U+000598: HEBREW ACCENT ZARQA*/
+ 0, /* U+000599: HEBREW ACCENT PASHTA*/
+ 0, /* U+00059a: HEBREW ACCENT YETIV*/
+ 0, /* U+00059b: HEBREW ACCENT TEVIR*/
+ 0, /* U+00059c: HEBREW ACCENT GERESH*/
+ 0, /* U+00059d: HEBREW ACCENT GERESH MUQDAM*/
+ 0, /* U+00059e: HEBREW ACCENT GERSHAYIM*/
+ 0, /* U+00059f: HEBREW ACCENT QARNEY PARA*/
+ 0, /* U+0005a0: HEBREW ACCENT TELISHA GEDOLA*/
+ 0, /* U+0005a1: HEBREW ACCENT PAZER*/
+ 0, /* U+0005a2: HEBREW ACCENT ATNAH HAFUKH*/
+ 0, /* U+0005a3: HEBREW ACCENT MUNAH*/
+ 0, /* U+0005a4: HEBREW ACCENT MAHAPAKH*/
+ 0, /* U+0005a5: HEBREW ACCENT MERKHA*/
+ 0, /* U+0005a6: HEBREW ACCENT MERKHA KEFULA*/
+ 0, /* U+0005a7: HEBREW ACCENT DARGA*/
+ 0, /* U+0005a8: HEBREW ACCENT QADMA*/
+ 0, /* U+0005a9: HEBREW ACCENT TELISHA QETANA*/
+ 0, /* U+0005aa: HEBREW ACCENT YERAH BEN YOMO*/
+ 0, /* U+0005ab: HEBREW ACCENT OLE*/
+ 0, /* U+0005ac: HEBREW ACCENT ILUY*/
+ 0, /* U+0005ad: HEBREW ACCENT DEHI*/
+ 0, /* U+0005ae: HEBREW ACCENT ZINOR*/
+ 0, /* U+0005af: HEBREW MARK MASORA CIRCLE*/
+ RTUNI_ALPHA, /* U+0005b0: HEBREW POINT SHEVA*/
+ RTUNI_ALPHA, /* U+0005b1: HEBREW POINT HATAF SEGOL*/
+ RTUNI_ALPHA, /* U+0005b2: HEBREW POINT HATAF PATAH*/
+ RTUNI_ALPHA, /* U+0005b3: HEBREW POINT HATAF QAMATS*/
+ RTUNI_ALPHA, /* U+0005b4: HEBREW POINT HIRIQ*/
+ RTUNI_ALPHA, /* U+0005b5: HEBREW POINT TSERE*/
+ RTUNI_ALPHA, /* U+0005b6: HEBREW POINT SEGOL*/
+ RTUNI_ALPHA, /* U+0005b7: HEBREW POINT PATAH*/
+ RTUNI_ALPHA, /* U+0005b8: HEBREW POINT QAMATS*/
+ RTUNI_ALPHA, /* U+0005b9: HEBREW POINT HOLAM*/
+ RTUNI_ALPHA, /* U+0005ba: HEBREW POINT HOLAM HASER FOR VAV*/
+ RTUNI_ALPHA, /* U+0005bb: HEBREW POINT QUBUTS*/
+ RTUNI_ALPHA, /* U+0005bc: HEBREW POINT DAGESH OR MAPIQ*/
+ RTUNI_ALPHA, /* U+0005bd: HEBREW POINT METEG*/
+ 0, /* U+0005be: HEBREW PUNCTUATION MAQAF*/
+ RTUNI_ALPHA, /* U+0005bf: HEBREW POINT RAFE*/
+ 0, /* U+0005c0: HEBREW PUNCTUATION PASEQ*/
+ RTUNI_ALPHA, /* U+0005c1: HEBREW POINT SHIN DOT*/
+ RTUNI_ALPHA, /* U+0005c2: HEBREW POINT SIN DOT*/
+ 0, /* U+0005c3: HEBREW PUNCTUATION SOF PASUQ*/
+ RTUNI_ALPHA, /* U+0005c4: HEBREW MARK UPPER DOT*/
+ RTUNI_ALPHA, /* U+0005c5: HEBREW MARK LOWER DOT*/
+ 0, /* U+0005c6: HEBREW PUNCTUATION NUN HAFUKHA*/
+ RTUNI_ALPHA, /* U+0005c7: HEBREW POINT QAMATS QATAN*/
+ 0, /* U+0005c8: */
+ 0, /* U+0005c9: */
+ 0, /* U+0005ca: */
+ 0, /* U+0005cb: */
+ 0, /* U+0005cc: */
+ 0, /* U+0005cd: */
+ 0, /* U+0005ce: */
+ 0, /* U+0005cf: */
+ RTUNI_ALPHA, /* U+0005d0: HEBREW LETTER ALEF*/
+ RTUNI_ALPHA, /* U+0005d1: HEBREW LETTER BET*/
+ RTUNI_ALPHA, /* U+0005d2: HEBREW LETTER GIMEL*/
+ RTUNI_ALPHA, /* U+0005d3: HEBREW LETTER DALET*/
+ RTUNI_ALPHA, /* U+0005d4: HEBREW LETTER HE*/
+ RTUNI_ALPHA, /* U+0005d5: HEBREW LETTER VAV*/
+ RTUNI_ALPHA, /* U+0005d6: HEBREW LETTER ZAYIN*/
+ RTUNI_ALPHA, /* U+0005d7: HEBREW LETTER HET*/
+ RTUNI_ALPHA, /* U+0005d8: HEBREW LETTER TET*/
+ RTUNI_ALPHA, /* U+0005d9: HEBREW LETTER YOD*/
+ RTUNI_ALPHA, /* U+0005da: HEBREW LETTER FINAL KAF*/
+ RTUNI_ALPHA, /* U+0005db: HEBREW LETTER KAF*/
+ RTUNI_ALPHA, /* U+0005dc: HEBREW LETTER LAMED*/
+ RTUNI_ALPHA, /* U+0005dd: HEBREW LETTER FINAL MEM*/
+ RTUNI_ALPHA, /* U+0005de: HEBREW LETTER MEM*/
+ RTUNI_ALPHA, /* U+0005df: HEBREW LETTER FINAL NUN*/
+ RTUNI_ALPHA, /* U+0005e0: HEBREW LETTER NUN*/
+ RTUNI_ALPHA, /* U+0005e1: HEBREW LETTER SAMEKH*/
+ RTUNI_ALPHA, /* U+0005e2: HEBREW LETTER AYIN*/
+ RTUNI_ALPHA, /* U+0005e3: HEBREW LETTER FINAL PE*/
+ RTUNI_ALPHA, /* U+0005e4: HEBREW LETTER PE*/
+ RTUNI_ALPHA, /* U+0005e5: HEBREW LETTER FINAL TSADI*/
+ RTUNI_ALPHA, /* U+0005e6: HEBREW LETTER TSADI*/
+ RTUNI_ALPHA, /* U+0005e7: HEBREW LETTER QOF*/
+ RTUNI_ALPHA, /* U+0005e8: HEBREW LETTER RESH*/
+ RTUNI_ALPHA, /* U+0005e9: HEBREW LETTER SHIN*/
+ RTUNI_ALPHA, /* U+0005ea: HEBREW LETTER TAV*/
+ 0, /* U+0005eb: */
+ 0, /* U+0005ec: */
+ 0, /* U+0005ed: */
+ 0, /* U+0005ee: */
+ 0, /* U+0005ef: */
+ RTUNI_ALPHA, /* U+0005f0: HEBREW LIGATURE YIDDISH DOUBLE VAV*/
+ RTUNI_ALPHA, /* U+0005f1: HEBREW LIGATURE YIDDISH VAV YOD*/
+ RTUNI_ALPHA, /* U+0005f2: HEBREW LIGATURE YIDDISH DOUBLE YOD*/
+ 0, /* U+0005f3: HEBREW PUNCTUATION GERESH*/
+ 0, /* U+0005f4: HEBREW PUNCTUATION GERSHAYIM*/
+ 0, /* U+0005f5: */
+ 0, /* U+0005f6: */
+ 0, /* U+0005f7: */
+ 0, /* U+0005f8: */
+ 0, /* U+0005f9: */
+ 0, /* U+0005fa: */
+ 0, /* U+0005fb: */
+ 0, /* U+0005fc: */
+ 0, /* U+0005fd: */
+ 0, /* U+0005fe: */
+ 0, /* U+0005ff: */
+ 0, /* U+000600: ARABIC NUMBER SIGN*/
+ 0, /* U+000601: ARABIC SIGN SANAH*/
+ 0, /* U+000602: ARABIC FOOTNOTE MARKER*/
+ 0, /* U+000603: ARABIC SIGN SAFHA*/
+ 0, /* U+000604: ARABIC SIGN SAMVAT*/
+ 0, /* U+000605: */
+ 0, /* U+000606: ARABIC-INDIC CUBE ROOT*/
+ 0, /* U+000607: ARABIC-INDIC FOURTH ROOT*/
+ 0, /* U+000608: ARABIC RAY*/
+ 0, /* U+000609: ARABIC-INDIC PER MILLE SIGN*/
+ 0, /* U+00060a: ARABIC-INDIC PER TEN THOUSAND SIGN*/
+ 0, /* U+00060b: AFGHANI SIGN*/
+ 0, /* U+00060c: ARABIC COMMA*/
+ 0, /* U+00060d: ARABIC DATE SEPARATOR*/
+ 0, /* U+00060e: ARABIC POETIC VERSE SIGN*/
+ 0, /* U+00060f: ARABIC SIGN MISRA*/
+ RTUNI_ALPHA, /* U+000610: ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM*/
+ RTUNI_ALPHA, /* U+000611: ARABIC SIGN ALAYHE ASSALLAM*/
+ RTUNI_ALPHA, /* U+000612: ARABIC SIGN RAHMATULLAH ALAYHE*/
+ RTUNI_ALPHA, /* U+000613: ARABIC SIGN RADI ALLAHOU ANHU*/
+ RTUNI_ALPHA, /* U+000614: ARABIC SIGN TAKHALLUS*/
+ RTUNI_ALPHA, /* U+000615: ARABIC SMALL HIGH TAH*/
+ RTUNI_ALPHA, /* U+000616: ARABIC SMALL HIGH LIGATURE ALEF WITH LAM WITH YEH*/
+ RTUNI_ALPHA, /* U+000617: ARABIC SMALL HIGH ZAIN*/
+ RTUNI_ALPHA, /* U+000618: ARABIC SMALL FATHA*/
+ RTUNI_ALPHA, /* U+000619: ARABIC SMALL DAMMA*/
+ RTUNI_ALPHA, /* U+00061a: ARABIC SMALL KASRA*/
+ 0, /* U+00061b: ARABIC SEMICOLON*/
+ 0, /* U+00061c: ARABIC LETTER MARK*/
+ 0, /* U+00061d: */
+ 0, /* U+00061e: ARABIC TRIPLE DOT PUNCTUATION MARK*/
+ 0, /* U+00061f: ARABIC QUESTION MARK*/
+ RTUNI_ALPHA, /* U+000620: ARABIC LETTER KASHMIRI YEH*/
+ RTUNI_ALPHA, /* U+000621: ARABIC LETTER HAMZA*/
+ RTUNI_ALPHA, /* U+000622: ARABIC LETTER ALEF WITH MADDA ABOVE*/
+ RTUNI_ALPHA, /* U+000623: ARABIC LETTER ALEF WITH HAMZA ABOVE*/
+ RTUNI_ALPHA, /* U+000624: ARABIC LETTER WAW WITH HAMZA ABOVE*/
+ RTUNI_ALPHA, /* U+000625: ARABIC LETTER ALEF WITH HAMZA BELOW*/
+ RTUNI_ALPHA, /* U+000626: ARABIC LETTER YEH WITH HAMZA ABOVE*/
+ RTUNI_ALPHA, /* U+000627: ARABIC LETTER ALEF*/
+ RTUNI_ALPHA, /* U+000628: ARABIC LETTER BEH*/
+ RTUNI_ALPHA, /* U+000629: ARABIC LETTER TEH MARBUTA*/
+ RTUNI_ALPHA, /* U+00062a: ARABIC LETTER TEH*/
+ RTUNI_ALPHA, /* U+00062b: ARABIC LETTER THEH*/
+ RTUNI_ALPHA, /* U+00062c: ARABIC LETTER JEEM*/
+ RTUNI_ALPHA, /* U+00062d: ARABIC LETTER HAH*/
+ RTUNI_ALPHA, /* U+00062e: ARABIC LETTER KHAH*/
+ RTUNI_ALPHA, /* U+00062f: ARABIC LETTER DAL*/
+ RTUNI_ALPHA, /* U+000630: ARABIC LETTER THAL*/
+ RTUNI_ALPHA, /* U+000631: ARABIC LETTER REH*/
+ RTUNI_ALPHA, /* U+000632: ARABIC LETTER ZAIN*/
+ RTUNI_ALPHA, /* U+000633: ARABIC LETTER SEEN*/
+ RTUNI_ALPHA, /* U+000634: ARABIC LETTER SHEEN*/
+ RTUNI_ALPHA, /* U+000635: ARABIC LETTER SAD*/
+ RTUNI_ALPHA, /* U+000636: ARABIC LETTER DAD*/
+ RTUNI_ALPHA, /* U+000637: ARABIC LETTER TAH*/
+ RTUNI_ALPHA, /* U+000638: ARABIC LETTER ZAH*/
+ RTUNI_ALPHA, /* U+000639: ARABIC LETTER AIN*/
+ RTUNI_ALPHA, /* U+00063a: ARABIC LETTER GHAIN*/
+ RTUNI_ALPHA, /* U+00063b: ARABIC LETTER KEHEH WITH TWO DOTS ABOVE*/
+ RTUNI_ALPHA, /* U+00063c: ARABIC LETTER KEHEH WITH THREE DOTS BELOW*/
+ RTUNI_ALPHA, /* U+00063d: ARABIC LETTER FARSI YEH WITH INVERTED V*/
+ RTUNI_ALPHA, /* U+00063e: ARABIC LETTER FARSI YEH WITH TWO DOTS ABOVE*/
+ RTUNI_ALPHA, /* U+00063f: ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE*/
+ RTUNI_ALPHA, /* U+000640: ARABIC TATWEEL*/
+ RTUNI_ALPHA, /* U+000641: ARABIC LETTER FEH*/
+ RTUNI_ALPHA, /* U+000642: ARABIC LETTER QAF*/
+ RTUNI_ALPHA, /* U+000643: ARABIC LETTER KAF*/
+ RTUNI_ALPHA, /* U+000644: ARABIC LETTER LAM*/
+ RTUNI_ALPHA, /* U+000645: ARABIC LETTER MEEM*/
+ RTUNI_ALPHA, /* U+000646: ARABIC LETTER NOON*/
+ RTUNI_ALPHA, /* U+000647: ARABIC LETTER HEH*/
+ RTUNI_ALPHA, /* U+000648: ARABIC LETTER WAW*/
+ RTUNI_ALPHA, /* U+000649: ARABIC LETTER ALEF MAKSURA*/
+ RTUNI_ALPHA, /* U+00064a: ARABIC LETTER YEH*/
+ RTUNI_ALPHA, /* U+00064b: ARABIC FATHATAN*/
+ RTUNI_ALPHA, /* U+00064c: ARABIC DAMMATAN*/
+ RTUNI_ALPHA, /* U+00064d: ARABIC KASRATAN*/
+ RTUNI_ALPHA, /* U+00064e: ARABIC FATHA*/
+ RTUNI_ALPHA, /* U+00064f: ARABIC DAMMA*/
+ RTUNI_ALPHA, /* U+000650: ARABIC KASRA*/
+ RTUNI_ALPHA, /* U+000651: ARABIC SHADDA*/
+ RTUNI_ALPHA, /* U+000652: ARABIC SUKUN*/
+ RTUNI_ALPHA, /* U+000653: ARABIC MADDAH ABOVE*/
+ RTUNI_ALPHA, /* U+000654: ARABIC HAMZA ABOVE*/
+ RTUNI_ALPHA, /* U+000655: ARABIC HAMZA BELOW*/
+ RTUNI_ALPHA, /* U+000656: ARABIC SUBSCRIPT ALEF*/
+ RTUNI_ALPHA, /* U+000657: ARABIC INVERTED DAMMA*/
+ 0, /* U+000658: ARABIC MARK NOON GHUNNA*/
+ RTUNI_ALPHA, /* U+000659: ARABIC ZWARAKAY*/
+ RTUNI_ALPHA, /* U+00065a: ARABIC VOWEL SIGN SMALL V ABOVE*/
+ RTUNI_ALPHA, /* U+00065b: ARABIC VOWEL SIGN INVERTED SMALL V ABOVE*/
+ RTUNI_ALPHA, /* U+00065c: ARABIC VOWEL SIGN DOT BELOW*/
+ RTUNI_ALPHA, /* U+00065d: ARABIC REVERSED DAMMA*/
+ RTUNI_ALPHA, /* U+00065e: ARABIC FATHA WITH TWO DOTS*/
+ RTUNI_ALPHA, /* U+00065f: ARABIC WAVY HAMZA BELOW*/
+ RTUNI_DDIGIT, /* U+000660: ARABIC-INDIC DIGIT ZERO*/
+ RTUNI_DDIGIT, /* U+000661: ARABIC-INDIC DIGIT ONE*/
+ RTUNI_DDIGIT, /* U+000662: ARABIC-INDIC DIGIT TWO*/
+ RTUNI_DDIGIT, /* U+000663: ARABIC-INDIC DIGIT THREE*/
+ RTUNI_DDIGIT, /* U+000664: ARABIC-INDIC DIGIT FOUR*/
+ RTUNI_DDIGIT, /* U+000665: ARABIC-INDIC DIGIT FIVE*/
+ RTUNI_DDIGIT, /* U+000666: ARABIC-INDIC DIGIT SIX*/
+ RTUNI_DDIGIT, /* U+000667: ARABIC-INDIC DIGIT SEVEN*/
+ RTUNI_DDIGIT, /* U+000668: ARABIC-INDIC DIGIT EIGHT*/
+ RTUNI_DDIGIT, /* U+000669: ARABIC-INDIC DIGIT NINE*/
+ 0, /* U+00066a: ARABIC PERCENT SIGN*/
+ 0, /* U+00066b: ARABIC DECIMAL SEPARATOR*/
+ 0, /* U+00066c: ARABIC THOUSANDS SEPARATOR*/
+ 0, /* U+00066d: ARABIC FIVE POINTED STAR*/
+ RTUNI_ALPHA, /* U+00066e: ARABIC LETTER DOTLESS BEH*/
+ RTUNI_ALPHA, /* U+00066f: ARABIC LETTER DOTLESS QAF*/
+ RTUNI_ALPHA, /* U+000670: ARABIC LETTER SUPERSCRIPT ALEF*/
+ RTUNI_ALPHA, /* U+000671: ARABIC LETTER ALEF WASLA*/
+ RTUNI_ALPHA, /* U+000672: ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE*/
+ RTUNI_ALPHA, /* U+000673: ARABIC LETTER ALEF WITH WAVY HAMZA BELOW*/
+ RTUNI_ALPHA, /* U+000674: ARABIC LETTER HIGH HAMZA*/
+ RTUNI_ALPHA, /* U+000675: ARABIC LETTER HIGH HAMZA ALEF*/
+ RTUNI_ALPHA, /* U+000676: ARABIC LETTER HIGH HAMZA WAW*/
+ RTUNI_ALPHA, /* U+000677: ARABIC LETTER U WITH HAMZA ABOVE*/
+ RTUNI_ALPHA, /* U+000678: ARABIC LETTER HIGH HAMZA YEH*/
+ RTUNI_ALPHA, /* U+000679: ARABIC LETTER TTEH*/
+ RTUNI_ALPHA, /* U+00067a: ARABIC LETTER TTEHEH*/
+ RTUNI_ALPHA, /* U+00067b: ARABIC LETTER BEEH*/
+ RTUNI_ALPHA, /* U+00067c: ARABIC LETTER TEH WITH RING*/
+ RTUNI_ALPHA, /* U+00067d: ARABIC LETTER TEH WITH THREE DOTS ABOVE DOWNWARDS*/
+ RTUNI_ALPHA, /* U+00067e: ARABIC LETTER PEH*/
+ RTUNI_ALPHA, /* U+00067f: ARABIC LETTER TEHEH*/
+ RTUNI_ALPHA, /* U+000680: ARABIC LETTER BEHEH*/
+ RTUNI_ALPHA, /* U+000681: ARABIC LETTER HAH WITH HAMZA ABOVE*/
+ RTUNI_ALPHA, /* U+000682: ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE*/
+ RTUNI_ALPHA, /* U+000683: ARABIC LETTER NYEH*/
+ RTUNI_ALPHA, /* U+000684: ARABIC LETTER DYEH*/
+ RTUNI_ALPHA, /* U+000685: ARABIC LETTER HAH WITH THREE DOTS ABOVE*/
+ RTUNI_ALPHA, /* U+000686: ARABIC LETTER TCHEH*/
+ RTUNI_ALPHA, /* U+000687: ARABIC LETTER TCHEHEH*/
+ RTUNI_ALPHA, /* U+000688: ARABIC LETTER DDAL*/
+ RTUNI_ALPHA, /* U+000689: ARABIC LETTER DAL WITH RING*/
+ RTUNI_ALPHA, /* U+00068a: ARABIC LETTER DAL WITH DOT BELOW*/
+ RTUNI_ALPHA, /* U+00068b: ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH*/
+ RTUNI_ALPHA, /* U+00068c: ARABIC LETTER DAHAL*/
+ RTUNI_ALPHA, /* U+00068d: ARABIC LETTER DDAHAL*/
+ RTUNI_ALPHA, /* U+00068e: ARABIC LETTER DUL*/
+ RTUNI_ALPHA, /* U+00068f: ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARDS*/
+ RTUNI_ALPHA, /* U+000690: ARABIC LETTER DAL WITH FOUR DOTS ABOVE*/
+ RTUNI_ALPHA, /* U+000691: ARABIC LETTER RREH*/
+ RTUNI_ALPHA, /* U+000692: ARABIC LETTER REH WITH SMALL V*/
+ RTUNI_ALPHA, /* U+000693: ARABIC LETTER REH WITH RING*/
+ RTUNI_ALPHA, /* U+000694: ARABIC LETTER REH WITH DOT BELOW*/
+ RTUNI_ALPHA, /* U+000695: ARABIC LETTER REH WITH SMALL V BELOW*/
+ RTUNI_ALPHA, /* U+000696: ARABIC LETTER REH WITH DOT BELOW AND DOT ABOVE*/
+ RTUNI_ALPHA, /* U+000697: ARABIC LETTER REH WITH TWO DOTS ABOVE*/
+ RTUNI_ALPHA, /* U+000698: ARABIC LETTER JEH*/
+ RTUNI_ALPHA, /* U+000699: ARABIC LETTER REH WITH FOUR DOTS ABOVE*/
+ RTUNI_ALPHA, /* U+00069a: ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE*/
+ RTUNI_ALPHA, /* U+00069b: ARABIC LETTER SEEN WITH THREE DOTS BELOW*/
+ RTUNI_ALPHA, /* U+00069c: ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE*/
+ RTUNI_ALPHA, /* U+00069d: ARABIC LETTER SAD WITH TWO DOTS BELOW*/
+ RTUNI_ALPHA, /* U+00069e: ARABIC LETTER SAD WITH THREE DOTS ABOVE*/
+ RTUNI_ALPHA, /* U+00069f: ARABIC LETTER TAH WITH THREE DOTS ABOVE*/
+ RTUNI_ALPHA, /* U+0006a0: ARABIC LETTER AIN WITH THREE DOTS ABOVE*/
+ RTUNI_ALPHA, /* U+0006a1: ARABIC LETTER DOTLESS FEH*/
+ RTUNI_ALPHA, /* U+0006a2: ARABIC LETTER FEH WITH DOT MOVED BELOW*/
+ RTUNI_ALPHA, /* U+0006a3: ARABIC LETTER FEH WITH DOT BELOW*/
+ RTUNI_ALPHA, /* U+0006a4: ARABIC LETTER VEH*/
+ RTUNI_ALPHA, /* U+0006a5: ARABIC LETTER FEH WITH THREE DOTS BELOW*/
+ RTUNI_ALPHA, /* U+0006a6: ARABIC LETTER PEHEH*/
+ RTUNI_ALPHA, /* U+0006a7: ARABIC LETTER QAF WITH DOT ABOVE*/
+ RTUNI_ALPHA, /* U+0006a8: ARABIC LETTER QAF WITH THREE DOTS ABOVE*/
+ RTUNI_ALPHA, /* U+0006a9: ARABIC LETTER KEHEH*/
+ RTUNI_ALPHA, /* U+0006aa: ARABIC LETTER SWASH KAF*/
+ RTUNI_ALPHA, /* U+0006ab: ARABIC LETTER KAF WITH RING*/
+ RTUNI_ALPHA, /* U+0006ac: ARABIC LETTER KAF WITH DOT ABOVE*/
+ RTUNI_ALPHA, /* U+0006ad: ARABIC LETTER NG*/
+ RTUNI_ALPHA, /* U+0006ae: ARABIC LETTER KAF WITH THREE DOTS BELOW*/
+ RTUNI_ALPHA, /* U+0006af: ARABIC LETTER GAF*/
+ RTUNI_ALPHA, /* U+0006b0: ARABIC LETTER GAF WITH RING*/
+ RTUNI_ALPHA, /* U+0006b1: ARABIC LETTER NGOEH*/
+ RTUNI_ALPHA, /* U+0006b2: ARABIC LETTER GAF WITH TWO DOTS BELOW*/
+ RTUNI_ALPHA, /* U+0006b3: ARABIC LETTER GUEH*/
+ RTUNI_ALPHA, /* U+0006b4: ARABIC LETTER GAF WITH THREE DOTS ABOVE*/
+ RTUNI_ALPHA, /* U+0006b5: ARABIC LETTER LAM WITH SMALL V*/
+ RTUNI_ALPHA, /* U+0006b6: ARABIC LETTER LAM WITH DOT ABOVE*/
+ RTUNI_ALPHA, /* U+0006b7: ARABIC LETTER LAM WITH THREE DOTS ABOVE*/
+ RTUNI_ALPHA, /* U+0006b8: ARABIC LETTER LAM WITH THREE DOTS BELOW*/
+ RTUNI_ALPHA, /* U+0006b9: ARABIC LETTER NOON WITH DOT BELOW*/
+ RTUNI_ALPHA, /* U+0006ba: ARABIC LETTER NOON GHUNNA*/
+ RTUNI_ALPHA, /* U+0006bb: ARABIC LETTER RNOON*/
+ RTUNI_ALPHA, /* U+0006bc: ARABIC LETTER NOON WITH RING*/
+ RTUNI_ALPHA, /* U+0006bd: ARABIC LETTER NOON WITH THREE DOTS ABOVE*/
+ RTUNI_ALPHA, /* U+0006be: ARABIC LETTER HEH DOACHASHMEE*/
+ RTUNI_ALPHA, /* U+0006bf: ARABIC LETTER TCHEH WITH DOT ABOVE*/
+ RTUNI_ALPHA, /* U+0006c0: ARABIC LETTER HEH WITH YEH ABOVE*/
+ RTUNI_ALPHA, /* U+0006c1: ARABIC LETTER HEH GOAL*/
+ RTUNI_ALPHA, /* U+0006c2: ARABIC LETTER HEH GOAL WITH HAMZA ABOVE*/
+ RTUNI_ALPHA, /* U+0006c3: ARABIC LETTER TEH MARBUTA GOAL*/
+ RTUNI_ALPHA, /* U+0006c4: ARABIC LETTER WAW WITH RING*/
+ RTUNI_ALPHA, /* U+0006c5: ARABIC LETTER KIRGHIZ OE*/
+ RTUNI_ALPHA, /* U+0006c6: ARABIC LETTER OE*/
+ RTUNI_ALPHA, /* U+0006c7: ARABIC LETTER U*/
+ RTUNI_ALPHA, /* U+0006c8: ARABIC LETTER YU*/
+ RTUNI_ALPHA, /* U+0006c9: ARABIC LETTER KIRGHIZ YU*/
+ RTUNI_ALPHA, /* U+0006ca: ARABIC LETTER WAW WITH TWO DOTS ABOVE*/
+ RTUNI_ALPHA, /* U+0006cb: ARABIC LETTER VE*/
+ RTUNI_ALPHA, /* U+0006cc: ARABIC LETTER FARSI YEH*/
+ RTUNI_ALPHA, /* U+0006cd: ARABIC LETTER YEH WITH TAIL*/
+ RTUNI_ALPHA, /* U+0006ce: ARABIC LETTER YEH WITH SMALL V*/
+ RTUNI_ALPHA, /* U+0006cf: ARABIC LETTER WAW WITH DOT ABOVE*/
+ RTUNI_ALPHA, /* U+0006d0: ARABIC LETTER E*/
+ RTUNI_ALPHA, /* U+0006d1: ARABIC LETTER YEH WITH THREE DOTS BELOW*/
+ RTUNI_ALPHA, /* U+0006d2: ARABIC LETTER YEH BARREE*/
+ RTUNI_ALPHA, /* U+0006d3: ARABIC LETTER YEH BARREE WITH HAMZA ABOVE*/
+ 0, /* U+0006d4: ARABIC FULL STOP*/
+ RTUNI_ALPHA, /* U+0006d5: ARABIC LETTER AE*/
+ RTUNI_ALPHA, /* U+0006d6: ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA*/
+ RTUNI_ALPHA, /* U+0006d7: ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA*/
+ RTUNI_ALPHA, /* U+0006d8: ARABIC SMALL HIGH MEEM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+0006d9: ARABIC SMALL HIGH LAM ALEF*/
+ RTUNI_ALPHA, /* U+0006da: ARABIC SMALL HIGH JEEM*/
+ RTUNI_ALPHA, /* U+0006db: ARABIC SMALL HIGH THREE DOTS*/
+ RTUNI_ALPHA, /* U+0006dc: ARABIC SMALL HIGH SEEN*/
+ 0, /* U+0006dd: ARABIC END OF AYAH*/
+ 0, /* U+0006de: ARABIC START OF RUB EL HIZB*/
+ 0, /* U+0006df: ARABIC SMALL HIGH ROUNDED ZERO*/
+ 0, /* U+0006e0: ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO*/
+ RTUNI_ALPHA, /* U+0006e1: ARABIC SMALL HIGH DOTLESS HEAD OF KHAH*/
+ RTUNI_ALPHA, /* U+0006e2: ARABIC SMALL HIGH MEEM ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+0006e3: ARABIC SMALL LOW SEEN*/
+ RTUNI_ALPHA, /* U+0006e4: ARABIC SMALL HIGH MADDA*/
+ RTUNI_ALPHA, /* U+0006e5: ARABIC SMALL WAW*/
+ RTUNI_ALPHA, /* U+0006e6: ARABIC SMALL YEH*/
+ RTUNI_ALPHA, /* U+0006e7: ARABIC SMALL HIGH YEH*/
+ RTUNI_ALPHA, /* U+0006e8: ARABIC SMALL HIGH NOON*/
+ 0, /* U+0006e9: ARABIC PLACE OF SAJDAH*/
+ 0, /* U+0006ea: ARABIC EMPTY CENTRE LOW STOP*/
+ 0, /* U+0006eb: ARABIC EMPTY CENTRE HIGH STOP*/
+ 0, /* U+0006ec: ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE*/
+ RTUNI_ALPHA, /* U+0006ed: ARABIC SMALL LOW MEEM*/
+ RTUNI_ALPHA, /* U+0006ee: ARABIC LETTER DAL WITH INVERTED V*/
+ RTUNI_ALPHA, /* U+0006ef: ARABIC LETTER REH WITH INVERTED V*/
+ RTUNI_DDIGIT, /* U+0006f0: EXTENDED ARABIC-INDIC DIGIT ZERO*/
+ RTUNI_DDIGIT, /* U+0006f1: EXTENDED ARABIC-INDIC DIGIT ONE*/
+ RTUNI_DDIGIT, /* U+0006f2: EXTENDED ARABIC-INDIC DIGIT TWO*/
+ RTUNI_DDIGIT, /* U+0006f3: EXTENDED ARABIC-INDIC DIGIT THREE*/
+ RTUNI_DDIGIT, /* U+0006f4: EXTENDED ARABIC-INDIC DIGIT FOUR*/
+ RTUNI_DDIGIT, /* U+0006f5: EXTENDED ARABIC-INDIC DIGIT FIVE*/
+ RTUNI_DDIGIT, /* U+0006f6: EXTENDED ARABIC-INDIC DIGIT SIX*/
+ RTUNI_DDIGIT, /* U+0006f7: EXTENDED ARABIC-INDIC DIGIT SEVEN*/
+ RTUNI_DDIGIT, /* U+0006f8: EXTENDED ARABIC-INDIC DIGIT EIGHT*/
+ RTUNI_DDIGIT, /* U+0006f9: EXTENDED ARABIC-INDIC DIGIT NINE*/
+ RTUNI_ALPHA, /* U+0006fa: ARABIC LETTER SHEEN WITH DOT BELOW*/
+ RTUNI_ALPHA, /* U+0006fb: ARABIC LETTER DAD WITH DOT BELOW*/
+ RTUNI_ALPHA, /* U+0006fc: ARABIC LETTER GHAIN WITH DOT BELOW*/
+ 0, /* U+0006fd: ARABIC SIGN SINDHI AMPERSAND*/
+ 0, /* U+0006fe: ARABIC SIGN SINDHI POSTPOSITION MEN*/
+ RTUNI_ALPHA, /* U+0006ff: ARABIC LETTER HEH WITH INVERTED V*/
+ 0, /* U+000700: SYRIAC END OF PARAGRAPH*/
+ 0, /* U+000701: SYRIAC SUPRALINEAR FULL STOP*/
+ 0, /* U+000702: SYRIAC SUBLINEAR FULL STOP*/
+ 0, /* U+000703: SYRIAC SUPRALINEAR COLON*/
+ 0, /* U+000704: SYRIAC SUBLINEAR COLON*/
+ 0, /* U+000705: SYRIAC HORIZONTAL COLON*/
+ 0, /* U+000706: SYRIAC COLON SKEWED LEFT*/
+ 0, /* U+000707: SYRIAC COLON SKEWED RIGHT*/
+ 0, /* U+000708: SYRIAC SUPRALINEAR COLON SKEWED LEFT*/
+ 0, /* U+000709: SYRIAC SUBLINEAR COLON SKEWED RIGHT*/
+ 0, /* U+00070a: SYRIAC CONTRACTION*/
+ 0, /* U+00070b: SYRIAC HARKLEAN OBELUS*/
+ 0, /* U+00070c: SYRIAC HARKLEAN METOBELUS*/
+ 0, /* U+00070d: SYRIAC HARKLEAN ASTERISCUS*/
+ 0, /* U+00070e: */
+ 0, /* U+00070f: SYRIAC ABBREVIATION MARK*/
+ RTUNI_ALPHA, /* U+000710: SYRIAC LETTER ALAPH*/
+ RTUNI_ALPHA, /* U+000711: SYRIAC LETTER SUPERSCRIPT ALAPH*/
+ RTUNI_ALPHA, /* U+000712: SYRIAC LETTER BETH*/
+ RTUNI_ALPHA, /* U+000713: SYRIAC LETTER GAMAL*/
+ RTUNI_ALPHA, /* U+000714: SYRIAC LETTER GAMAL GARSHUNI*/
+ RTUNI_ALPHA, /* U+000715: SYRIAC LETTER DALATH*/
+ RTUNI_ALPHA, /* U+000716: SYRIAC LETTER DOTLESS DALATH RISH*/
+ RTUNI_ALPHA, /* U+000717: SYRIAC LETTER HE*/
+ RTUNI_ALPHA, /* U+000718: SYRIAC LETTER WAW*/
+ RTUNI_ALPHA, /* U+000719: SYRIAC LETTER ZAIN*/
+ RTUNI_ALPHA, /* U+00071a: SYRIAC LETTER HETH*/
+ RTUNI_ALPHA, /* U+00071b: SYRIAC LETTER TETH*/
+ RTUNI_ALPHA, /* U+00071c: SYRIAC LETTER TETH GARSHUNI*/
+ RTUNI_ALPHA, /* U+00071d: SYRIAC LETTER YUDH*/
+ RTUNI_ALPHA, /* U+00071e: SYRIAC LETTER YUDH HE*/
+ RTUNI_ALPHA, /* U+00071f: SYRIAC LETTER KAPH*/
+ RTUNI_ALPHA, /* U+000720: SYRIAC LETTER LAMADH*/
+ RTUNI_ALPHA, /* U+000721: SYRIAC LETTER MIM*/
+ RTUNI_ALPHA, /* U+000722: SYRIAC LETTER NUN*/
+ RTUNI_ALPHA, /* U+000723: SYRIAC LETTER SEMKATH*/
+ RTUNI_ALPHA, /* U+000724: SYRIAC LETTER FINAL SEMKATH*/
+ RTUNI_ALPHA, /* U+000725: SYRIAC LETTER E*/
+ RTUNI_ALPHA, /* U+000726: SYRIAC LETTER PE*/
+ RTUNI_ALPHA, /* U+000727: SYRIAC LETTER REVERSED PE*/
+ RTUNI_ALPHA, /* U+000728: SYRIAC LETTER SADHE*/
+ RTUNI_ALPHA, /* U+000729: SYRIAC LETTER QAPH*/
+ RTUNI_ALPHA, /* U+00072a: SYRIAC LETTER RISH*/
+ RTUNI_ALPHA, /* U+00072b: SYRIAC LETTER SHIN*/
+ RTUNI_ALPHA, /* U+00072c: SYRIAC LETTER TAW*/
+ RTUNI_ALPHA, /* U+00072d: SYRIAC LETTER PERSIAN BHETH*/
+ RTUNI_ALPHA, /* U+00072e: SYRIAC LETTER PERSIAN GHAMAL*/
+ RTUNI_ALPHA, /* U+00072f: SYRIAC LETTER PERSIAN DHALATH*/
+ RTUNI_ALPHA, /* U+000730: SYRIAC PTHAHA ABOVE*/
+ RTUNI_ALPHA, /* U+000731: SYRIAC PTHAHA BELOW*/
+ RTUNI_ALPHA, /* U+000732: SYRIAC PTHAHA DOTTED*/
+ RTUNI_ALPHA, /* U+000733: SYRIAC ZQAPHA ABOVE*/
+ RTUNI_ALPHA, /* U+000734: SYRIAC ZQAPHA BELOW*/
+ RTUNI_ALPHA, /* U+000735: SYRIAC ZQAPHA DOTTED*/
+ RTUNI_ALPHA, /* U+000736: SYRIAC RBASA ABOVE*/
+ RTUNI_ALPHA, /* U+000737: SYRIAC RBASA BELOW*/
+ RTUNI_ALPHA, /* U+000738: SYRIAC DOTTED ZLAMA HORIZONTAL*/
+ RTUNI_ALPHA, /* U+000739: SYRIAC DOTTED ZLAMA ANGULAR*/
+ RTUNI_ALPHA, /* U+00073a: SYRIAC HBASA ABOVE*/
+ RTUNI_ALPHA, /* U+00073b: SYRIAC HBASA BELOW*/
+ RTUNI_ALPHA, /* U+00073c: SYRIAC HBASA-ESASA DOTTED*/
+ RTUNI_ALPHA, /* U+00073d: SYRIAC ESASA ABOVE*/
+ RTUNI_ALPHA, /* U+00073e: SYRIAC ESASA BELOW*/
+ RTUNI_ALPHA, /* U+00073f: SYRIAC RWAHA*/
+ 0, /* U+000740: SYRIAC FEMININE DOT*/
+ 0, /* U+000741: SYRIAC QUSHSHAYA*/
+ 0, /* U+000742: SYRIAC RUKKAKHA*/
+ 0, /* U+000743: SYRIAC TWO VERTICAL DOTS ABOVE*/
+ 0, /* U+000744: SYRIAC TWO VERTICAL DOTS BELOW*/
+ 0, /* U+000745: SYRIAC THREE DOTS ABOVE*/
+ 0, /* U+000746: SYRIAC THREE DOTS BELOW*/
+ 0, /* U+000747: SYRIAC OBLIQUE LINE ABOVE*/
+ 0, /* U+000748: SYRIAC OBLIQUE LINE BELOW*/
+ 0, /* U+000749: SYRIAC MUSIC*/
+ 0, /* U+00074a: SYRIAC BARREKH*/
+ 0, /* U+00074b: */
+ 0, /* U+00074c: */
+ RTUNI_ALPHA, /* U+00074d: SYRIAC LETTER SOGDIAN ZHAIN*/
+ RTUNI_ALPHA, /* U+00074e: SYRIAC LETTER SOGDIAN KHAPH*/
+ RTUNI_ALPHA, /* U+00074f: SYRIAC LETTER SOGDIAN FE*/
+ RTUNI_ALPHA, /* U+000750: ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW*/
+ RTUNI_ALPHA, /* U+000751: ARABIC LETTER BEH WITH DOT BELOW AND THREE DOTS ABOVE*/
+ RTUNI_ALPHA, /* U+000752: ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW*/
+ RTUNI_ALPHA, /* U+000753: ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW AND TWO DOTS ABOVE*/
+ RTUNI_ALPHA, /* U+000754: ARABIC LETTER BEH WITH TWO DOTS BELOW AND DOT ABOVE*/
+ RTUNI_ALPHA, /* U+000755: ARABIC LETTER BEH WITH INVERTED SMALL V BELOW*/
+ RTUNI_ALPHA, /* U+000756: ARABIC LETTER BEH WITH SMALL V*/
+ RTUNI_ALPHA, /* U+000757: ARABIC LETTER HAH WITH TWO DOTS ABOVE*/
+ RTUNI_ALPHA, /* U+000758: ARABIC LETTER HAH WITH THREE DOTS POINTING UPWARDS BELOW*/
+ RTUNI_ALPHA, /* U+000759: ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW AND SMALL TAH*/
+ RTUNI_ALPHA, /* U+00075a: ARABIC LETTER DAL WITH INVERTED SMALL V BELOW*/
+ RTUNI_ALPHA, /* U+00075b: ARABIC LETTER REH WITH STROKE*/
+ RTUNI_ALPHA, /* U+00075c: ARABIC LETTER SEEN WITH FOUR DOTS ABOVE*/
+ RTUNI_ALPHA, /* U+00075d: ARABIC LETTER AIN WITH TWO DOTS ABOVE*/
+ RTUNI_ALPHA, /* U+00075e: ARABIC LETTER AIN WITH THREE DOTS POINTING DOWNWARDS ABOVE*/
+ RTUNI_ALPHA, /* U+00075f: ARABIC LETTER AIN WITH TWO DOTS VERTICALLY ABOVE*/
+ RTUNI_ALPHA, /* U+000760: ARABIC LETTER FEH WITH TWO DOTS BELOW*/
+ RTUNI_ALPHA, /* U+000761: ARABIC LETTER FEH WITH THREE DOTS POINTING UPWARDS BELOW*/
+ RTUNI_ALPHA, /* U+000762: ARABIC LETTER KEHEH WITH DOT ABOVE*/
+ RTUNI_ALPHA, /* U+000763: ARABIC LETTER KEHEH WITH THREE DOTS ABOVE*/
+ RTUNI_ALPHA, /* U+000764: ARABIC LETTER KEHEH WITH THREE DOTS POINTING UPWARDS BELOW*/
+ RTUNI_ALPHA, /* U+000765: ARABIC LETTER MEEM WITH DOT ABOVE*/
+ RTUNI_ALPHA, /* U+000766: ARABIC LETTER MEEM WITH DOT BELOW*/
+ RTUNI_ALPHA, /* U+000767: ARABIC LETTER NOON WITH TWO DOTS BELOW*/
+ RTUNI_ALPHA, /* U+000768: ARABIC LETTER NOON WITH SMALL TAH*/
+ RTUNI_ALPHA, /* U+000769: ARABIC LETTER NOON WITH SMALL V*/
+ RTUNI_ALPHA, /* U+00076a: ARABIC LETTER LAM WITH BAR*/
+ RTUNI_ALPHA, /* U+00076b: ARABIC LETTER REH WITH TWO DOTS VERTICALLY ABOVE*/
+ RTUNI_ALPHA, /* U+00076c: ARABIC LETTER REH WITH HAMZA ABOVE*/
+ RTUNI_ALPHA, /* U+00076d: ARABIC LETTER SEEN WITH TWO DOTS VERTICALLY ABOVE*/
+ RTUNI_ALPHA, /* U+00076e: ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH BELOW*/
+ RTUNI_ALPHA, /* U+00076f: ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH AND TWO DOTS*/
+ RTUNI_ALPHA, /* U+000770: ARABIC LETTER SEEN WITH SMALL ARABIC LETTER TAH AND TWO DOTS*/
+ RTUNI_ALPHA, /* U+000771: ARABIC LETTER REH WITH SMALL ARABIC LETTER TAH AND TWO DOTS*/
+ RTUNI_ALPHA, /* U+000772: ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH ABOVE*/
+ RTUNI_ALPHA, /* U+000773: ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE*/
+ RTUNI_ALPHA, /* U+000774: ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE*/
+ RTUNI_ALPHA, /* U+000775: ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE*/
+ RTUNI_ALPHA, /* U+000776: ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE*/
+ RTUNI_ALPHA, /* U+000777: ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW*/
+ RTUNI_ALPHA, /* U+000778: ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE*/
+ RTUNI_ALPHA, /* U+000779: ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE*/
+ RTUNI_ALPHA, /* U+00077a: ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE*/
+ RTUNI_ALPHA, /* U+00077b: ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE*/
+ RTUNI_ALPHA, /* U+00077c: ARABIC LETTER HAH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW*/
+ RTUNI_ALPHA, /* U+00077d: ARABIC LETTER SEEN WITH EXTENDED ARABIC-INDIC DIGIT FOUR ABOVE*/
+ RTUNI_ALPHA, /* U+00077e: ARABIC LETTER SEEN WITH INVERTED V*/
+ RTUNI_ALPHA, /* U+00077f: ARABIC LETTER KAF WITH TWO DOTS ABOVE*/
+ RTUNI_ALPHA, /* U+000780: THAANA LETTER HAA*/
+ RTUNI_ALPHA, /* U+000781: THAANA LETTER SHAVIYANI*/
+ RTUNI_ALPHA, /* U+000782: THAANA LETTER NOONU*/
+ RTUNI_ALPHA, /* U+000783: THAANA LETTER RAA*/
+ RTUNI_ALPHA, /* U+000784: THAANA LETTER BAA*/
+ RTUNI_ALPHA, /* U+000785: THAANA LETTER LHAVIYANI*/
+ RTUNI_ALPHA, /* U+000786: THAANA LETTER KAAFU*/
+ RTUNI_ALPHA, /* U+000787: THAANA LETTER ALIFU*/
+ RTUNI_ALPHA, /* U+000788: THAANA LETTER VAAVU*/
+ RTUNI_ALPHA, /* U+000789: THAANA LETTER MEEMU*/
+ RTUNI_ALPHA, /* U+00078a: THAANA LETTER FAAFU*/
+ RTUNI_ALPHA, /* U+00078b: THAANA LETTER DHAALU*/
+ RTUNI_ALPHA, /* U+00078c: THAANA LETTER THAA*/
+ RTUNI_ALPHA, /* U+00078d: THAANA LETTER LAAMU*/
+ RTUNI_ALPHA, /* U+00078e: THAANA LETTER GAAFU*/
+ RTUNI_ALPHA, /* U+00078f: THAANA LETTER GNAVIYANI*/
+ RTUNI_ALPHA, /* U+000790: THAANA LETTER SEENU*/
+ RTUNI_ALPHA, /* U+000791: THAANA LETTER DAVIYANI*/
+ RTUNI_ALPHA, /* U+000792: THAANA LETTER ZAVIYANI*/
+ RTUNI_ALPHA, /* U+000793: THAANA LETTER TAVIYANI*/
+ RTUNI_ALPHA, /* U+000794: THAANA LETTER YAA*/
+ RTUNI_ALPHA, /* U+000795: THAANA LETTER PAVIYANI*/
+ RTUNI_ALPHA, /* U+000796: THAANA LETTER JAVIYANI*/
+ RTUNI_ALPHA, /* U+000797: THAANA LETTER CHAVIYANI*/
+ RTUNI_ALPHA, /* U+000798: THAANA LETTER TTAA*/
+ RTUNI_ALPHA, /* U+000799: THAANA LETTER HHAA*/
+ RTUNI_ALPHA, /* U+00079a: THAANA LETTER KHAA*/
+ RTUNI_ALPHA, /* U+00079b: THAANA LETTER THAALU*/
+ RTUNI_ALPHA, /* U+00079c: THAANA LETTER ZAA*/
+ RTUNI_ALPHA, /* U+00079d: THAANA LETTER SHEENU*/
+ RTUNI_ALPHA, /* U+00079e: THAANA LETTER SAADHU*/
+ RTUNI_ALPHA, /* U+00079f: THAANA LETTER DAADHU*/
+ RTUNI_ALPHA, /* U+0007a0: THAANA LETTER TO*/
+ RTUNI_ALPHA, /* U+0007a1: THAANA LETTER ZO*/
+ RTUNI_ALPHA, /* U+0007a2: THAANA LETTER AINU*/
+ RTUNI_ALPHA, /* U+0007a3: THAANA LETTER GHAINU*/
+ RTUNI_ALPHA, /* U+0007a4: THAANA LETTER QAAFU*/
+ RTUNI_ALPHA, /* U+0007a5: THAANA LETTER WAAVU*/
+ RTUNI_ALPHA, /* U+0007a6: THAANA ABAFILI*/
+ RTUNI_ALPHA, /* U+0007a7: THAANA AABAAFILI*/
+ RTUNI_ALPHA, /* U+0007a8: THAANA IBIFILI*/
+ RTUNI_ALPHA, /* U+0007a9: THAANA EEBEEFILI*/
+ RTUNI_ALPHA, /* U+0007aa: THAANA UBUFILI*/
+ RTUNI_ALPHA, /* U+0007ab: THAANA OOBOOFILI*/
+ RTUNI_ALPHA, /* U+0007ac: THAANA EBEFILI*/
+ RTUNI_ALPHA, /* U+0007ad: THAANA EYBEYFILI*/
+ RTUNI_ALPHA, /* U+0007ae: THAANA OBOFILI*/
+ RTUNI_ALPHA, /* U+0007af: THAANA OABOAFILI*/
+ RTUNI_ALPHA, /* U+0007b0: THAANA SUKUN*/
+ RTUNI_ALPHA, /* U+0007b1: THAANA LETTER NAA*/
+ 0, /* U+0007b2: */
+ 0, /* U+0007b3: */
+ 0, /* U+0007b4: */
+ 0, /* U+0007b5: */
+ 0, /* U+0007b6: */
+ 0, /* U+0007b7: */
+ 0, /* U+0007b8: */
+ 0, /* U+0007b9: */
+ 0, /* U+0007ba: */
+ 0, /* U+0007bb: */
+ 0, /* U+0007bc: */
+ 0, /* U+0007bd: */
+ 0, /* U+0007be: */
+ 0, /* U+0007bf: */
+ RTUNI_DDIGIT, /* U+0007c0: NKO DIGIT ZERO*/
+ RTUNI_DDIGIT, /* U+0007c1: NKO DIGIT ONE*/
+ RTUNI_DDIGIT, /* U+0007c2: NKO DIGIT TWO*/
+ RTUNI_DDIGIT, /* U+0007c3: NKO DIGIT THREE*/
+ RTUNI_DDIGIT, /* U+0007c4: NKO DIGIT FOUR*/
+ RTUNI_DDIGIT, /* U+0007c5: NKO DIGIT FIVE*/
+ RTUNI_DDIGIT, /* U+0007c6: NKO DIGIT SIX*/
+ RTUNI_DDIGIT, /* U+0007c7: NKO DIGIT SEVEN*/
+ RTUNI_DDIGIT, /* U+0007c8: NKO DIGIT EIGHT*/
+ RTUNI_DDIGIT, /* U+0007c9: NKO DIGIT NINE*/
+ RTUNI_ALPHA, /* U+0007ca: NKO LETTER A*/
+ RTUNI_ALPHA, /* U+0007cb: NKO LETTER EE*/
+ RTUNI_ALPHA, /* U+0007cc: NKO LETTER I*/
+ RTUNI_ALPHA, /* U+0007cd: NKO LETTER E*/
+ RTUNI_ALPHA, /* U+0007ce: NKO LETTER U*/
+ RTUNI_ALPHA, /* U+0007cf: NKO LETTER OO*/
+ RTUNI_ALPHA, /* U+0007d0: NKO LETTER O*/
+ RTUNI_ALPHA, /* U+0007d1: NKO LETTER DAGBASINNA*/
+ RTUNI_ALPHA, /* U+0007d2: NKO LETTER N*/
+ RTUNI_ALPHA, /* U+0007d3: NKO LETTER BA*/
+ RTUNI_ALPHA, /* U+0007d4: NKO LETTER PA*/
+ RTUNI_ALPHA, /* U+0007d5: NKO LETTER TA*/
+ RTUNI_ALPHA, /* U+0007d6: NKO LETTER JA*/
+ RTUNI_ALPHA, /* U+0007d7: NKO LETTER CHA*/
+ RTUNI_ALPHA, /* U+0007d8: NKO LETTER DA*/
+ RTUNI_ALPHA, /* U+0007d9: NKO LETTER RA*/
+ RTUNI_ALPHA, /* U+0007da: NKO LETTER RRA*/
+ RTUNI_ALPHA, /* U+0007db: NKO LETTER SA*/
+ RTUNI_ALPHA, /* U+0007dc: NKO LETTER GBA*/
+ RTUNI_ALPHA, /* U+0007dd: NKO LETTER FA*/
+ RTUNI_ALPHA, /* U+0007de: NKO LETTER KA*/
+ RTUNI_ALPHA, /* U+0007df: NKO LETTER LA*/
+ RTUNI_ALPHA, /* U+0007e0: NKO LETTER NA WOLOSO*/
+ RTUNI_ALPHA, /* U+0007e1: NKO LETTER MA*/
+ RTUNI_ALPHA, /* U+0007e2: NKO LETTER NYA*/
+ RTUNI_ALPHA, /* U+0007e3: NKO LETTER NA*/
+ RTUNI_ALPHA, /* U+0007e4: NKO LETTER HA*/
+ RTUNI_ALPHA, /* U+0007e5: NKO LETTER WA*/
+ RTUNI_ALPHA, /* U+0007e6: NKO LETTER YA*/
+ RTUNI_ALPHA, /* U+0007e7: NKO LETTER NYA WOLOSO*/
+ RTUNI_ALPHA, /* U+0007e8: NKO LETTER JONA JA*/
+ RTUNI_ALPHA, /* U+0007e9: NKO LETTER JONA CHA*/
+ RTUNI_ALPHA, /* U+0007ea: NKO LETTER JONA RA*/
+ 0, /* U+0007eb: NKO COMBINING SHORT HIGH TONE*/
+ 0, /* U+0007ec: NKO COMBINING SHORT LOW TONE*/
+ 0, /* U+0007ed: NKO COMBINING SHORT RISING TONE*/
+ 0, /* U+0007ee: NKO COMBINING LONG DESCENDING TONE*/
+ 0, /* U+0007ef: NKO COMBINING LONG HIGH TONE*/
+ 0, /* U+0007f0: NKO COMBINING LONG LOW TONE*/
+ 0, /* U+0007f1: NKO COMBINING LONG RISING TONE*/
+ 0, /* U+0007f2: NKO COMBINING NASALIZATION MARK*/
+ 0, /* U+0007f3: NKO COMBINING DOUBLE DOT ABOVE*/
+ RTUNI_ALPHA, /* U+0007f4: NKO HIGH TONE APOSTROPHE*/
+ RTUNI_ALPHA, /* U+0007f5: NKO LOW TONE APOSTROPHE*/
+ 0, /* U+0007f6: NKO SYMBOL OO DENNEN*/
+ 0, /* U+0007f7: NKO SYMBOL GBAKURUNEN*/
+ 0, /* U+0007f8: NKO COMMA*/
+ 0, /* U+0007f9: NKO EXCLAMATION MARK*/
+ RTUNI_ALPHA, /* U+0007fa: NKO LAJANYALAN*/
+ 0, /* U+0007fb: */
+ 0, /* U+0007fc: */
+ 0, /* U+0007fd: */
+ 0, /* U+0007fe: */
+ 0, /* U+0007ff: */
+ RTUNI_ALPHA, /* U+000800: SAMARITAN LETTER ALAF*/
+ RTUNI_ALPHA, /* U+000801: SAMARITAN LETTER BIT*/
+ RTUNI_ALPHA, /* U+000802: SAMARITAN LETTER GAMAN*/
+ RTUNI_ALPHA, /* U+000803: SAMARITAN LETTER DALAT*/
+ RTUNI_ALPHA, /* U+000804: SAMARITAN LETTER IY*/
+ RTUNI_ALPHA, /* U+000805: SAMARITAN LETTER BAA*/
+ RTUNI_ALPHA, /* U+000806: SAMARITAN LETTER ZEN*/
+ RTUNI_ALPHA, /* U+000807: SAMARITAN LETTER IT*/
+ RTUNI_ALPHA, /* U+000808: SAMARITAN LETTER TIT*/
+ RTUNI_ALPHA, /* U+000809: SAMARITAN LETTER YUT*/
+ RTUNI_ALPHA, /* U+00080a: SAMARITAN LETTER KAAF*/
+ RTUNI_ALPHA, /* U+00080b: SAMARITAN LETTER LABAT*/
+ RTUNI_ALPHA, /* U+00080c: SAMARITAN LETTER MIM*/
+ RTUNI_ALPHA, /* U+00080d: SAMARITAN LETTER NUN*/
+ RTUNI_ALPHA, /* U+00080e: SAMARITAN LETTER SINGAAT*/
+ RTUNI_ALPHA, /* U+00080f: SAMARITAN LETTER IN*/
+ RTUNI_ALPHA, /* U+000810: SAMARITAN LETTER FI*/
+ RTUNI_ALPHA, /* U+000811: SAMARITAN LETTER TSAADIY*/
+ RTUNI_ALPHA, /* U+000812: SAMARITAN LETTER QUF*/
+ RTUNI_ALPHA, /* U+000813: SAMARITAN LETTER RISH*/
+ RTUNI_ALPHA, /* U+000814: SAMARITAN LETTER SHAN*/
+ RTUNI_ALPHA, /* U+000815: SAMARITAN LETTER TAAF*/
+ RTUNI_ALPHA, /* U+000816: SAMARITAN MARK IN*/
+ RTUNI_ALPHA, /* U+000817: SAMARITAN MARK IN-ALAF*/
+ 0, /* U+000818: SAMARITAN MARK OCCLUSION*/
+ 0, /* U+000819: SAMARITAN MARK DAGESH*/
+ RTUNI_ALPHA, /* U+00081a: SAMARITAN MODIFIER LETTER EPENTHETIC YUT*/
+ RTUNI_ALPHA, /* U+00081b: SAMARITAN MARK EPENTHETIC YUT*/
+ RTUNI_ALPHA, /* U+00081c: SAMARITAN VOWEL SIGN LONG E*/
+ RTUNI_ALPHA, /* U+00081d: SAMARITAN VOWEL SIGN E*/
+ RTUNI_ALPHA, /* U+00081e: SAMARITAN VOWEL SIGN OVERLONG AA*/
+ RTUNI_ALPHA, /* U+00081f: SAMARITAN VOWEL SIGN LONG AA*/
+ RTUNI_ALPHA, /* U+000820: SAMARITAN VOWEL SIGN AA*/
+ RTUNI_ALPHA, /* U+000821: SAMARITAN VOWEL SIGN OVERLONG A*/
+ RTUNI_ALPHA, /* U+000822: SAMARITAN VOWEL SIGN LONG A*/
+ RTUNI_ALPHA, /* U+000823: SAMARITAN VOWEL SIGN A*/
+ RTUNI_ALPHA, /* U+000824: SAMARITAN MODIFIER LETTER SHORT A*/
+ RTUNI_ALPHA, /* U+000825: SAMARITAN VOWEL SIGN SHORT A*/
+ RTUNI_ALPHA, /* U+000826: SAMARITAN VOWEL SIGN LONG U*/
+ RTUNI_ALPHA, /* U+000827: SAMARITAN VOWEL SIGN U*/
+ RTUNI_ALPHA, /* U+000828: SAMARITAN MODIFIER LETTER I*/
+ RTUNI_ALPHA, /* U+000829: SAMARITAN VOWEL SIGN LONG I*/
+ RTUNI_ALPHA, /* U+00082a: SAMARITAN VOWEL SIGN I*/
+ RTUNI_ALPHA, /* U+00082b: SAMARITAN VOWEL SIGN O*/
+ RTUNI_ALPHA, /* U+00082c: SAMARITAN VOWEL SIGN SUKUN*/
+ 0, /* U+00082d: SAMARITAN MARK NEQUDAA*/
+ 0, /* U+00082e: */
+ 0, /* U+00082f: */
+ 0, /* U+000830: SAMARITAN PUNCTUATION NEQUDAA*/
+ 0, /* U+000831: SAMARITAN PUNCTUATION AFSAAQ*/
+ 0, /* U+000832: SAMARITAN PUNCTUATION ANGED*/
+ 0, /* U+000833: SAMARITAN PUNCTUATION BAU*/
+ 0, /* U+000834: SAMARITAN PUNCTUATION ATMAAU*/
+ 0, /* U+000835: SAMARITAN PUNCTUATION SHIYYAALAA*/
+ 0, /* U+000836: SAMARITAN ABBREVIATION MARK*/
+ 0, /* U+000837: SAMARITAN PUNCTUATION MELODIC QITSA*/
+ 0, /* U+000838: SAMARITAN PUNCTUATION ZIQAA*/
+ 0, /* U+000839: SAMARITAN PUNCTUATION QITSA*/
+ 0, /* U+00083a: SAMARITAN PUNCTUATION ZAEF*/
+ 0, /* U+00083b: SAMARITAN PUNCTUATION TURU*/
+ 0, /* U+00083c: SAMARITAN PUNCTUATION ARKAANU*/
+ 0, /* U+00083d: SAMARITAN PUNCTUATION SOF MASHFAAT*/
+ 0, /* U+00083e: SAMARITAN PUNCTUATION ANNAAU*/
+ 0, /* U+00083f: */
+ RTUNI_ALPHA, /* U+000840: MANDAIC LETTER HALQA*/
+ RTUNI_ALPHA, /* U+000841: MANDAIC LETTER AB*/
+ RTUNI_ALPHA, /* U+000842: MANDAIC LETTER AG*/
+ RTUNI_ALPHA, /* U+000843: MANDAIC LETTER AD*/
+ RTUNI_ALPHA, /* U+000844: MANDAIC LETTER AH*/
+ RTUNI_ALPHA, /* U+000845: MANDAIC LETTER USHENNA*/
+ RTUNI_ALPHA, /* U+000846: MANDAIC LETTER AZ*/
+ RTUNI_ALPHA, /* U+000847: MANDAIC LETTER IT*/
+ RTUNI_ALPHA, /* U+000848: MANDAIC LETTER ATT*/
+ RTUNI_ALPHA, /* U+000849: MANDAIC LETTER AKSA*/
+ RTUNI_ALPHA, /* U+00084a: MANDAIC LETTER AK*/
+ RTUNI_ALPHA, /* U+00084b: MANDAIC LETTER AL*/
+ RTUNI_ALPHA, /* U+00084c: MANDAIC LETTER AM*/
+ RTUNI_ALPHA, /* U+00084d: MANDAIC LETTER AN*/
+ RTUNI_ALPHA, /* U+00084e: MANDAIC LETTER AS*/
+ RTUNI_ALPHA, /* U+00084f: MANDAIC LETTER IN*/
+ RTUNI_ALPHA, /* U+000850: MANDAIC LETTER AP*/
+ RTUNI_ALPHA, /* U+000851: MANDAIC LETTER ASZ*/
+ RTUNI_ALPHA, /* U+000852: MANDAIC LETTER AQ*/
+ RTUNI_ALPHA, /* U+000853: MANDAIC LETTER AR*/
+ RTUNI_ALPHA, /* U+000854: MANDAIC LETTER ASH*/
+ RTUNI_ALPHA, /* U+000855: MANDAIC LETTER AT*/
+ RTUNI_ALPHA, /* U+000856: MANDAIC LETTER DUSHENNA*/
+ RTUNI_ALPHA, /* U+000857: MANDAIC LETTER KAD*/
+ RTUNI_ALPHA, /* U+000858: MANDAIC LETTER AIN*/
+ 0, /* U+000859: MANDAIC AFFRICATION MARK*/
+ 0, /* U+00085a: MANDAIC VOCALIZATION MARK*/
+ 0, /* U+00085b: MANDAIC GEMINATION MARK*/
+ 0, /* U+00085c: */
+ 0, /* U+00085d: */
+ 0, /* U+00085e: MANDAIC PUNCTUATION*/
+ 0, /* U+00085f: */
+ 0, /* U+000860: */
+ 0, /* U+000861: */
+ 0, /* U+000862: */
+ 0, /* U+000863: */
+ 0, /* U+000864: */
+ 0, /* U+000865: */
+ 0, /* U+000866: */
+ 0, /* U+000867: */
+ 0, /* U+000868: */
+ 0, /* U+000869: */
+ 0, /* U+00086a: */
+ 0, /* U+00086b: */
+ 0, /* U+00086c: */
+ 0, /* U+00086d: */
+ 0, /* U+00086e: */
+ 0, /* U+00086f: */
+ 0, /* U+000870: */
+ 0, /* U+000871: */
+ 0, /* U+000872: */
+ 0, /* U+000873: */
+ 0, /* U+000874: */
+ 0, /* U+000875: */
+ 0, /* U+000876: */
+ 0, /* U+000877: */
+ 0, /* U+000878: */
+ 0, /* U+000879: */
+ 0, /* U+00087a: */
+ 0, /* U+00087b: */
+ 0, /* U+00087c: */
+ 0, /* U+00087d: */
+ 0, /* U+00087e: */
+ 0, /* U+00087f: */
+ 0, /* U+000880: */
+ 0, /* U+000881: */
+ 0, /* U+000882: */
+ 0, /* U+000883: */
+ 0, /* U+000884: */
+ 0, /* U+000885: */
+ 0, /* U+000886: */
+ 0, /* U+000887: */
+ 0, /* U+000888: */
+ 0, /* U+000889: */
+ 0, /* U+00088a: */
+ 0, /* U+00088b: */
+ 0, /* U+00088c: */
+ 0, /* U+00088d: */
+ 0, /* U+00088e: */
+ 0, /* U+00088f: */
+ 0, /* U+000890: */
+ 0, /* U+000891: */
+ 0, /* U+000892: */
+ 0, /* U+000893: */
+ 0, /* U+000894: */
+ 0, /* U+000895: */
+ 0, /* U+000896: */
+ 0, /* U+000897: */
+ 0, /* U+000898: */
+ 0, /* U+000899: */
+ 0, /* U+00089a: */
+ 0, /* U+00089b: */
+ 0, /* U+00089c: */
+ 0, /* U+00089d: */
+ 0, /* U+00089e: */
+ 0, /* U+00089f: */
+ RTUNI_ALPHA, /* U+0008a0: ARABIC LETTER BEH WITH SMALL V BELOW*/
+ 0, /* U+0008a1: */
+ RTUNI_ALPHA, /* U+0008a2: ARABIC LETTER JEEM WITH TWO DOTS ABOVE*/
+ RTUNI_ALPHA, /* U+0008a3: ARABIC LETTER TAH WITH TWO DOTS ABOVE*/
+ RTUNI_ALPHA, /* U+0008a4: ARABIC LETTER FEH WITH DOT BELOW AND THREE DOTS ABOVE*/
+ RTUNI_ALPHA, /* U+0008a5: ARABIC LETTER QAF WITH DOT BELOW*/
+ RTUNI_ALPHA, /* U+0008a6: ARABIC LETTER LAM WITH DOUBLE BAR*/
+ RTUNI_ALPHA, /* U+0008a7: ARABIC LETTER MEEM WITH THREE DOTS ABOVE*/
+ RTUNI_ALPHA, /* U+0008a8: ARABIC LETTER YEH WITH TWO DOTS BELOW AND HAMZA ABOVE*/
+ RTUNI_ALPHA, /* U+0008a9: ARABIC LETTER YEH WITH TWO DOTS BELOW AND DOT ABOVE*/
+ RTUNI_ALPHA, /* U+0008aa: ARABIC LETTER REH WITH LOOP*/
+ RTUNI_ALPHA, /* U+0008ab: ARABIC LETTER WAW WITH DOT WITHIN*/
+ RTUNI_ALPHA, /* U+0008ac: ARABIC LETTER ROHINGYA YEH*/
+ 0, /* U+0008ad: */
+ 0, /* U+0008ae: */
+ 0, /* U+0008af: */
+ 0, /* U+0008b0: */
+ 0, /* U+0008b1: */
+ 0, /* U+0008b2: */
+ 0, /* U+0008b3: */
+ 0, /* U+0008b4: */
+ 0, /* U+0008b5: */
+ 0, /* U+0008b6: */
+ 0, /* U+0008b7: */
+ 0, /* U+0008b8: */
+ 0, /* U+0008b9: */
+ 0, /* U+0008ba: */
+ 0, /* U+0008bb: */
+ 0, /* U+0008bc: */
+ 0, /* U+0008bd: */
+ 0, /* U+0008be: */
+ 0, /* U+0008bf: */
+ 0, /* U+0008c0: */
+ 0, /* U+0008c1: */
+ 0, /* U+0008c2: */
+ 0, /* U+0008c3: */
+ 0, /* U+0008c4: */
+ 0, /* U+0008c5: */
+ 0, /* U+0008c6: */
+ 0, /* U+0008c7: */
+ 0, /* U+0008c8: */
+ 0, /* U+0008c9: */
+ 0, /* U+0008ca: */
+ 0, /* U+0008cb: */
+ 0, /* U+0008cc: */
+ 0, /* U+0008cd: */
+ 0, /* U+0008ce: */
+ 0, /* U+0008cf: */
+ 0, /* U+0008d0: */
+ 0, /* U+0008d1: */
+ 0, /* U+0008d2: */
+ 0, /* U+0008d3: */
+ 0, /* U+0008d4: */
+ 0, /* U+0008d5: */
+ 0, /* U+0008d6: */
+ 0, /* U+0008d7: */
+ 0, /* U+0008d8: */
+ 0, /* U+0008d9: */
+ 0, /* U+0008da: */
+ 0, /* U+0008db: */
+ 0, /* U+0008dc: */
+ 0, /* U+0008dd: */
+ 0, /* U+0008de: */
+ 0, /* U+0008df: */
+ 0, /* U+0008e0: */
+ 0, /* U+0008e1: */
+ 0, /* U+0008e2: */
+ 0, /* U+0008e3: */
+ RTUNI_ALPHA, /* U+0008e4: ARABIC CURLY FATHA*/
+ RTUNI_ALPHA, /* U+0008e5: ARABIC CURLY DAMMA*/
+ RTUNI_ALPHA, /* U+0008e6: ARABIC CURLY KASRA*/
+ RTUNI_ALPHA, /* U+0008e7: ARABIC CURLY FATHATAN*/
+ RTUNI_ALPHA, /* U+0008e8: ARABIC CURLY DAMMATAN*/
+ RTUNI_ALPHA, /* U+0008e9: ARABIC CURLY KASRATAN*/
+ 0, /* U+0008ea: ARABIC TONE ONE DOT ABOVE*/
+ 0, /* U+0008eb: ARABIC TONE TWO DOTS ABOVE*/
+ 0, /* U+0008ec: ARABIC TONE LOOP ABOVE*/
+ 0, /* U+0008ed: ARABIC TONE ONE DOT BELOW*/
+ 0, /* U+0008ee: ARABIC TONE TWO DOTS BELOW*/
+ 0, /* U+0008ef: ARABIC TONE LOOP BELOW*/
+ RTUNI_ALPHA, /* U+0008f0: ARABIC OPEN FATHATAN*/
+ RTUNI_ALPHA, /* U+0008f1: ARABIC OPEN DAMMATAN*/
+ RTUNI_ALPHA, /* U+0008f2: ARABIC OPEN KASRATAN*/
+ RTUNI_ALPHA, /* U+0008f3: ARABIC SMALL HIGH WAW*/
+ RTUNI_ALPHA, /* U+0008f4: ARABIC FATHA WITH RING*/
+ RTUNI_ALPHA, /* U+0008f5: ARABIC FATHA WITH DOT ABOVE*/
+ RTUNI_ALPHA, /* U+0008f6: ARABIC KASRA WITH DOT BELOW*/
+ RTUNI_ALPHA, /* U+0008f7: ARABIC LEFT ARROWHEAD ABOVE*/
+ RTUNI_ALPHA, /* U+0008f8: ARABIC RIGHT ARROWHEAD ABOVE*/
+ RTUNI_ALPHA, /* U+0008f9: ARABIC LEFT ARROWHEAD BELOW*/
+ RTUNI_ALPHA, /* U+0008fa: ARABIC RIGHT ARROWHEAD BELOW*/
+ RTUNI_ALPHA, /* U+0008fb: ARABIC DOUBLE RIGHT ARROWHEAD ABOVE*/
+ RTUNI_ALPHA, /* U+0008fc: ARABIC DOUBLE RIGHT ARROWHEAD ABOVE WITH DOT*/
+ RTUNI_ALPHA, /* U+0008fd: ARABIC RIGHT ARROWHEAD ABOVE WITH DOT*/
+ RTUNI_ALPHA, /* U+0008fe: ARABIC DAMMA WITH DOT*/
+ 0, /* U+0008ff: */
+ RTUNI_ALPHA, /* U+000900: DEVANAGARI SIGN INVERTED CANDRABINDU*/
+ RTUNI_ALPHA, /* U+000901: DEVANAGARI SIGN CANDRABINDU*/
+ RTUNI_ALPHA, /* U+000902: DEVANAGARI SIGN ANUSVARA*/
+ RTUNI_ALPHA, /* U+000903: DEVANAGARI SIGN VISARGA*/
+ RTUNI_ALPHA, /* U+000904: DEVANAGARI LETTER SHORT A*/
+ RTUNI_ALPHA, /* U+000905: DEVANAGARI LETTER A*/
+ RTUNI_ALPHA, /* U+000906: DEVANAGARI LETTER AA*/
+ RTUNI_ALPHA, /* U+000907: DEVANAGARI LETTER I*/
+ RTUNI_ALPHA, /* U+000908: DEVANAGARI LETTER II*/
+ RTUNI_ALPHA, /* U+000909: DEVANAGARI LETTER U*/
+ RTUNI_ALPHA, /* U+00090a: DEVANAGARI LETTER UU*/
+ RTUNI_ALPHA, /* U+00090b: DEVANAGARI LETTER VOCALIC R*/
+ RTUNI_ALPHA, /* U+00090c: DEVANAGARI LETTER VOCALIC L*/
+ RTUNI_ALPHA, /* U+00090d: DEVANAGARI LETTER CANDRA E*/
+ RTUNI_ALPHA, /* U+00090e: DEVANAGARI LETTER SHORT E*/
+ RTUNI_ALPHA, /* U+00090f: DEVANAGARI LETTER E*/
+ RTUNI_ALPHA, /* U+000910: DEVANAGARI LETTER AI*/
+ RTUNI_ALPHA, /* U+000911: DEVANAGARI LETTER CANDRA O*/
+ RTUNI_ALPHA, /* U+000912: DEVANAGARI LETTER SHORT O*/
+ RTUNI_ALPHA, /* U+000913: DEVANAGARI LETTER O*/
+ RTUNI_ALPHA, /* U+000914: DEVANAGARI LETTER AU*/
+ RTUNI_ALPHA, /* U+000915: DEVANAGARI LETTER KA*/
+ RTUNI_ALPHA, /* U+000916: DEVANAGARI LETTER KHA*/
+ RTUNI_ALPHA, /* U+000917: DEVANAGARI LETTER GA*/
+ RTUNI_ALPHA, /* U+000918: DEVANAGARI LETTER GHA*/
+ RTUNI_ALPHA, /* U+000919: DEVANAGARI LETTER NGA*/
+ RTUNI_ALPHA, /* U+00091a: DEVANAGARI LETTER CA*/
+ RTUNI_ALPHA, /* U+00091b: DEVANAGARI LETTER CHA*/
+ RTUNI_ALPHA, /* U+00091c: DEVANAGARI LETTER JA*/
+ RTUNI_ALPHA, /* U+00091d: DEVANAGARI LETTER JHA*/
+ RTUNI_ALPHA, /* U+00091e: DEVANAGARI LETTER NYA*/
+ RTUNI_ALPHA, /* U+00091f: DEVANAGARI LETTER TTA*/
+ RTUNI_ALPHA, /* U+000920: DEVANAGARI LETTER TTHA*/
+ RTUNI_ALPHA, /* U+000921: DEVANAGARI LETTER DDA*/
+ RTUNI_ALPHA, /* U+000922: DEVANAGARI LETTER DDHA*/
+ RTUNI_ALPHA, /* U+000923: DEVANAGARI LETTER NNA*/
+ RTUNI_ALPHA, /* U+000924: DEVANAGARI LETTER TA*/
+ RTUNI_ALPHA, /* U+000925: DEVANAGARI LETTER THA*/
+ RTUNI_ALPHA, /* U+000926: DEVANAGARI LETTER DA*/
+ RTUNI_ALPHA, /* U+000927: DEVANAGARI LETTER DHA*/
+ RTUNI_ALPHA, /* U+000928: DEVANAGARI LETTER NA*/
+ RTUNI_ALPHA, /* U+000929: DEVANAGARI LETTER NNNA*/
+ RTUNI_ALPHA, /* U+00092a: DEVANAGARI LETTER PA*/
+ RTUNI_ALPHA, /* U+00092b: DEVANAGARI LETTER PHA*/
+ RTUNI_ALPHA, /* U+00092c: DEVANAGARI LETTER BA*/
+ RTUNI_ALPHA, /* U+00092d: DEVANAGARI LETTER BHA*/
+ RTUNI_ALPHA, /* U+00092e: DEVANAGARI LETTER MA*/
+ RTUNI_ALPHA, /* U+00092f: DEVANAGARI LETTER YA*/
+ RTUNI_ALPHA, /* U+000930: DEVANAGARI LETTER RA*/
+ RTUNI_ALPHA, /* U+000931: DEVANAGARI LETTER RRA*/
+ RTUNI_ALPHA, /* U+000932: DEVANAGARI LETTER LA*/
+ RTUNI_ALPHA, /* U+000933: DEVANAGARI LETTER LLA*/
+ RTUNI_ALPHA, /* U+000934: DEVANAGARI LETTER LLLA*/
+ RTUNI_ALPHA, /* U+000935: DEVANAGARI LETTER VA*/
+ RTUNI_ALPHA, /* U+000936: DEVANAGARI LETTER SHA*/
+ RTUNI_ALPHA, /* U+000937: DEVANAGARI LETTER SSA*/
+ RTUNI_ALPHA, /* U+000938: DEVANAGARI LETTER SA*/
+ RTUNI_ALPHA, /* U+000939: DEVANAGARI LETTER HA*/
+ RTUNI_ALPHA, /* U+00093a: DEVANAGARI VOWEL SIGN OE*/
+ RTUNI_ALPHA, /* U+00093b: DEVANAGARI VOWEL SIGN OOE*/
+ 0, /* U+00093c: DEVANAGARI SIGN NUKTA*/
+ RTUNI_ALPHA, /* U+00093d: DEVANAGARI SIGN AVAGRAHA*/
+ RTUNI_ALPHA, /* U+00093e: DEVANAGARI VOWEL SIGN AA*/
+ RTUNI_ALPHA, /* U+00093f: DEVANAGARI VOWEL SIGN I*/
+ RTUNI_ALPHA, /* U+000940: DEVANAGARI VOWEL SIGN II*/
+ RTUNI_ALPHA, /* U+000941: DEVANAGARI VOWEL SIGN U*/
+ RTUNI_ALPHA, /* U+000942: DEVANAGARI VOWEL SIGN UU*/
+ RTUNI_ALPHA, /* U+000943: DEVANAGARI VOWEL SIGN VOCALIC R*/
+ RTUNI_ALPHA, /* U+000944: DEVANAGARI VOWEL SIGN VOCALIC RR*/
+ RTUNI_ALPHA, /* U+000945: DEVANAGARI VOWEL SIGN CANDRA E*/
+ RTUNI_ALPHA, /* U+000946: DEVANAGARI VOWEL SIGN SHORT E*/
+ RTUNI_ALPHA, /* U+000947: DEVANAGARI VOWEL SIGN E*/
+ RTUNI_ALPHA, /* U+000948: DEVANAGARI VOWEL SIGN AI*/
+ RTUNI_ALPHA, /* U+000949: DEVANAGARI VOWEL SIGN CANDRA O*/
+ RTUNI_ALPHA, /* U+00094a: DEVANAGARI VOWEL SIGN SHORT O*/
+ RTUNI_ALPHA, /* U+00094b: DEVANAGARI VOWEL SIGN O*/
+ RTUNI_ALPHA, /* U+00094c: DEVANAGARI VOWEL SIGN AU*/
+ 0, /* U+00094d: DEVANAGARI SIGN VIRAMA*/
+ RTUNI_ALPHA, /* U+00094e: DEVANAGARI VOWEL SIGN PRISHTHAMATRA E*/
+ RTUNI_ALPHA, /* U+00094f: DEVANAGARI VOWEL SIGN AW*/
+ RTUNI_ALPHA, /* U+000950: DEVANAGARI OM*/
+ 0, /* U+000951: DEVANAGARI STRESS SIGN UDATTA*/
+ 0, /* U+000952: DEVANAGARI STRESS SIGN ANUDATTA*/
+ 0, /* U+000953: DEVANAGARI GRAVE ACCENT*/
+ 0, /* U+000954: DEVANAGARI ACUTE ACCENT*/
+ RTUNI_ALPHA, /* U+000955: DEVANAGARI VOWEL SIGN CANDRA LONG E*/
+ RTUNI_ALPHA, /* U+000956: DEVANAGARI VOWEL SIGN UE*/
+ RTUNI_ALPHA, /* U+000957: DEVANAGARI VOWEL SIGN UUE*/
+ RTUNI_ALPHA, /* U+000958: DEVANAGARI LETTER QA*/
+ RTUNI_ALPHA, /* U+000959: DEVANAGARI LETTER KHHA*/
+ RTUNI_ALPHA, /* U+00095a: DEVANAGARI LETTER GHHA*/
+ RTUNI_ALPHA, /* U+00095b: DEVANAGARI LETTER ZA*/
+ RTUNI_ALPHA, /* U+00095c: DEVANAGARI LETTER DDDHA*/
+ RTUNI_ALPHA, /* U+00095d: DEVANAGARI LETTER RHA*/
+ RTUNI_ALPHA, /* U+00095e: DEVANAGARI LETTER FA*/
+ RTUNI_ALPHA, /* U+00095f: DEVANAGARI LETTER YYA*/
+ RTUNI_ALPHA, /* U+000960: DEVANAGARI LETTER VOCALIC RR*/
+ RTUNI_ALPHA, /* U+000961: DEVANAGARI LETTER VOCALIC LL*/
+ RTUNI_ALPHA, /* U+000962: DEVANAGARI VOWEL SIGN VOCALIC L*/
+ RTUNI_ALPHA, /* U+000963: DEVANAGARI VOWEL SIGN VOCALIC LL*/
+ 0, /* U+000964: DEVANAGARI DANDA*/
+ 0, /* U+000965: DEVANAGARI DOUBLE DANDA*/
+ RTUNI_DDIGIT, /* U+000966: DEVANAGARI DIGIT ZERO*/
+ RTUNI_DDIGIT, /* U+000967: DEVANAGARI DIGIT ONE*/
+ RTUNI_DDIGIT, /* U+000968: DEVANAGARI DIGIT TWO*/
+ RTUNI_DDIGIT, /* U+000969: DEVANAGARI DIGIT THREE*/
+ RTUNI_DDIGIT, /* U+00096a: DEVANAGARI DIGIT FOUR*/
+ RTUNI_DDIGIT, /* U+00096b: DEVANAGARI DIGIT FIVE*/
+ RTUNI_DDIGIT, /* U+00096c: DEVANAGARI DIGIT SIX*/
+ RTUNI_DDIGIT, /* U+00096d: DEVANAGARI DIGIT SEVEN*/
+ RTUNI_DDIGIT, /* U+00096e: DEVANAGARI DIGIT EIGHT*/
+ RTUNI_DDIGIT, /* U+00096f: DEVANAGARI DIGIT NINE*/
+ 0, /* U+000970: DEVANAGARI ABBREVIATION SIGN*/
+ RTUNI_ALPHA, /* U+000971: DEVANAGARI SIGN HIGH SPACING DOT*/
+ RTUNI_ALPHA, /* U+000972: DEVANAGARI LETTER CANDRA A*/
+ RTUNI_ALPHA, /* U+000973: DEVANAGARI LETTER OE*/
+ RTUNI_ALPHA, /* U+000974: DEVANAGARI LETTER OOE*/
+ RTUNI_ALPHA, /* U+000975: DEVANAGARI LETTER AW*/
+ RTUNI_ALPHA, /* U+000976: DEVANAGARI LETTER UE*/
+ RTUNI_ALPHA, /* U+000977: DEVANAGARI LETTER UUE*/
+ 0, /* U+000978: */
+ RTUNI_ALPHA, /* U+000979: DEVANAGARI LETTER ZHA*/
+ RTUNI_ALPHA, /* U+00097a: DEVANAGARI LETTER HEAVY YA*/
+ RTUNI_ALPHA, /* U+00097b: DEVANAGARI LETTER GGA*/
+ RTUNI_ALPHA, /* U+00097c: DEVANAGARI LETTER JJA*/
+ RTUNI_ALPHA, /* U+00097d: DEVANAGARI LETTER GLOTTAL STOP*/
+ RTUNI_ALPHA, /* U+00097e: DEVANAGARI LETTER DDDA*/
+ RTUNI_ALPHA, /* U+00097f: DEVANAGARI LETTER BBA*/
+ 0, /* U+000980: */
+ RTUNI_ALPHA, /* U+000981: BENGALI SIGN CANDRABINDU*/
+ RTUNI_ALPHA, /* U+000982: BENGALI SIGN ANUSVARA*/
+ RTUNI_ALPHA, /* U+000983: BENGALI SIGN VISARGA*/
+ 0, /* U+000984: */
+ RTUNI_ALPHA, /* U+000985: BENGALI LETTER A*/
+ RTUNI_ALPHA, /* U+000986: BENGALI LETTER AA*/
+ RTUNI_ALPHA, /* U+000987: BENGALI LETTER I*/
+ RTUNI_ALPHA, /* U+000988: BENGALI LETTER II*/
+ RTUNI_ALPHA, /* U+000989: BENGALI LETTER U*/
+ RTUNI_ALPHA, /* U+00098a: BENGALI LETTER UU*/
+ RTUNI_ALPHA, /* U+00098b: BENGALI LETTER VOCALIC R*/
+ RTUNI_ALPHA, /* U+00098c: BENGALI LETTER VOCALIC L*/
+ 0, /* U+00098d: */
+ 0, /* U+00098e: */
+ RTUNI_ALPHA, /* U+00098f: BENGALI LETTER E*/
+ RTUNI_ALPHA, /* U+000990: BENGALI LETTER AI*/
+ 0, /* U+000991: */
+ 0, /* U+000992: */
+ RTUNI_ALPHA, /* U+000993: BENGALI LETTER O*/
+ RTUNI_ALPHA, /* U+000994: BENGALI LETTER AU*/
+ RTUNI_ALPHA, /* U+000995: BENGALI LETTER KA*/
+ RTUNI_ALPHA, /* U+000996: BENGALI LETTER KHA*/
+ RTUNI_ALPHA, /* U+000997: BENGALI LETTER GA*/
+ RTUNI_ALPHA, /* U+000998: BENGALI LETTER GHA*/
+ RTUNI_ALPHA, /* U+000999: BENGALI LETTER NGA*/
+ RTUNI_ALPHA, /* U+00099a: BENGALI LETTER CA*/
+ RTUNI_ALPHA, /* U+00099b: BENGALI LETTER CHA*/
+ RTUNI_ALPHA, /* U+00099c: BENGALI LETTER JA*/
+ RTUNI_ALPHA, /* U+00099d: BENGALI LETTER JHA*/
+ RTUNI_ALPHA, /* U+00099e: BENGALI LETTER NYA*/
+ RTUNI_ALPHA, /* U+00099f: BENGALI LETTER TTA*/
+ RTUNI_ALPHA, /* U+0009a0: BENGALI LETTER TTHA*/
+ RTUNI_ALPHA, /* U+0009a1: BENGALI LETTER DDA*/
+ RTUNI_ALPHA, /* U+0009a2: BENGALI LETTER DDHA*/
+ RTUNI_ALPHA, /* U+0009a3: BENGALI LETTER NNA*/
+ RTUNI_ALPHA, /* U+0009a4: BENGALI LETTER TA*/
+ RTUNI_ALPHA, /* U+0009a5: BENGALI LETTER THA*/
+ RTUNI_ALPHA, /* U+0009a6: BENGALI LETTER DA*/
+ RTUNI_ALPHA, /* U+0009a7: BENGALI LETTER DHA*/
+ RTUNI_ALPHA, /* U+0009a8: BENGALI LETTER NA*/
+ 0, /* U+0009a9: */
+ RTUNI_ALPHA, /* U+0009aa: BENGALI LETTER PA*/
+ RTUNI_ALPHA, /* U+0009ab: BENGALI LETTER PHA*/
+ RTUNI_ALPHA, /* U+0009ac: BENGALI LETTER BA*/
+ RTUNI_ALPHA, /* U+0009ad: BENGALI LETTER BHA*/
+ RTUNI_ALPHA, /* U+0009ae: BENGALI LETTER MA*/
+ RTUNI_ALPHA, /* U+0009af: BENGALI LETTER YA*/
+ RTUNI_ALPHA, /* U+0009b0: BENGALI LETTER RA*/
+ 0, /* U+0009b1: */
+ RTUNI_ALPHA, /* U+0009b2: BENGALI LETTER LA*/
+ 0, /* U+0009b3: */
+ 0, /* U+0009b4: */
+ 0, /* U+0009b5: */
+ RTUNI_ALPHA, /* U+0009b6: BENGALI LETTER SHA*/
+ RTUNI_ALPHA, /* U+0009b7: BENGALI LETTER SSA*/
+ RTUNI_ALPHA, /* U+0009b8: BENGALI LETTER SA*/
+ RTUNI_ALPHA, /* U+0009b9: BENGALI LETTER HA*/
+ 0, /* U+0009ba: */
+ 0, /* U+0009bb: */
+ 0, /* U+0009bc: BENGALI SIGN NUKTA*/
+ RTUNI_ALPHA, /* U+0009bd: BENGALI SIGN AVAGRAHA*/
+ RTUNI_ALPHA, /* U+0009be: BENGALI VOWEL SIGN AA*/
+ RTUNI_ALPHA, /* U+0009bf: BENGALI VOWEL SIGN I*/
+ RTUNI_ALPHA, /* U+0009c0: BENGALI VOWEL SIGN II*/
+ RTUNI_ALPHA, /* U+0009c1: BENGALI VOWEL SIGN U*/
+ RTUNI_ALPHA, /* U+0009c2: BENGALI VOWEL SIGN UU*/
+ RTUNI_ALPHA, /* U+0009c3: BENGALI VOWEL SIGN VOCALIC R*/
+ RTUNI_ALPHA, /* U+0009c4: BENGALI VOWEL SIGN VOCALIC RR*/
+ 0, /* U+0009c5: */
+ 0, /* U+0009c6: */
+ RTUNI_ALPHA, /* U+0009c7: BENGALI VOWEL SIGN E*/
+ RTUNI_ALPHA, /* U+0009c8: BENGALI VOWEL SIGN AI*/
+ 0, /* U+0009c9: */
+ 0, /* U+0009ca: */
+ RTUNI_ALPHA, /* U+0009cb: BENGALI VOWEL SIGN O*/
+ RTUNI_ALPHA, /* U+0009cc: BENGALI VOWEL SIGN AU*/
+ 0, /* U+0009cd: BENGALI SIGN VIRAMA*/
+ RTUNI_ALPHA, /* U+0009ce: BENGALI LETTER KHANDA TA*/
+ 0, /* U+0009cf: */
+ 0, /* U+0009d0: */
+ 0, /* U+0009d1: */
+ 0, /* U+0009d2: */
+ 0, /* U+0009d3: */
+ 0, /* U+0009d4: */
+ 0, /* U+0009d5: */
+ 0, /* U+0009d6: */
+ RTUNI_ALPHA, /* U+0009d7: BENGALI AU LENGTH MARK*/
+ 0, /* U+0009d8: */
+ 0, /* U+0009d9: */
+ 0, /* U+0009da: */
+ 0, /* U+0009db: */
+ RTUNI_ALPHA, /* U+0009dc: BENGALI LETTER RRA*/
+ RTUNI_ALPHA, /* U+0009dd: BENGALI LETTER RHA*/
+ 0, /* U+0009de: */
+ RTUNI_ALPHA, /* U+0009df: BENGALI LETTER YYA*/
+ RTUNI_ALPHA, /* U+0009e0: BENGALI LETTER VOCALIC RR*/
+ RTUNI_ALPHA, /* U+0009e1: BENGALI LETTER VOCALIC LL*/
+ RTUNI_ALPHA, /* U+0009e2: BENGALI VOWEL SIGN VOCALIC L*/
+ RTUNI_ALPHA, /* U+0009e3: BENGALI VOWEL SIGN VOCALIC LL*/
+ 0, /* U+0009e4: */
+ 0, /* U+0009e5: */
+ RTUNI_DDIGIT, /* U+0009e6: BENGALI DIGIT ZERO*/
+ RTUNI_DDIGIT, /* U+0009e7: BENGALI DIGIT ONE*/
+ RTUNI_DDIGIT, /* U+0009e8: BENGALI DIGIT TWO*/
+ RTUNI_DDIGIT, /* U+0009e9: BENGALI DIGIT THREE*/
+ RTUNI_DDIGIT, /* U+0009ea: BENGALI DIGIT FOUR*/
+ RTUNI_DDIGIT, /* U+0009eb: BENGALI DIGIT FIVE*/
+ RTUNI_DDIGIT, /* U+0009ec: BENGALI DIGIT SIX*/
+ RTUNI_DDIGIT, /* U+0009ed: BENGALI DIGIT SEVEN*/
+ RTUNI_DDIGIT, /* U+0009ee: BENGALI DIGIT EIGHT*/
+ RTUNI_DDIGIT, /* U+0009ef: BENGALI DIGIT NINE*/
+ RTUNI_ALPHA, /* U+0009f0: BENGALI LETTER RA WITH MIDDLE DIAGONAL*/
+ RTUNI_ALPHA, /* U+0009f1: BENGALI LETTER RA WITH LOWER DIAGONAL*/
+ 0, /* U+0009f2: BENGALI RUPEE MARK*/
+ 0, /* U+0009f3: BENGALI RUPEE SIGN*/
+ 0, /* U+0009f4: BENGALI CURRENCY NUMERATOR ONE*/
+ 0, /* U+0009f5: BENGALI CURRENCY NUMERATOR TWO*/
+ 0, /* U+0009f6: BENGALI CURRENCY NUMERATOR THREE*/
+ 0, /* U+0009f7: BENGALI CURRENCY NUMERATOR FOUR*/
+ 0, /* U+0009f8: BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR*/
+ 0, /* U+0009f9: BENGALI CURRENCY DENOMINATOR SIXTEEN*/
+ 0, /* U+0009fa: BENGALI ISSHAR*/
+ 0, /* U+0009fb: BENGALI GANDA MARK*/
+ 0, /* U+0009fc: */
+ 0, /* U+0009fd: */
+ 0, /* U+0009fe: */
+ 0, /* U+0009ff: */
+ 0, /* U+000a00: */
+ RTUNI_ALPHA, /* U+000a01: GURMUKHI SIGN ADAK BINDI*/
+ RTUNI_ALPHA, /* U+000a02: GURMUKHI SIGN BINDI*/
+ RTUNI_ALPHA, /* U+000a03: GURMUKHI SIGN VISARGA*/
+ 0, /* U+000a04: */
+ RTUNI_ALPHA, /* U+000a05: GURMUKHI LETTER A*/
+ RTUNI_ALPHA, /* U+000a06: GURMUKHI LETTER AA*/
+ RTUNI_ALPHA, /* U+000a07: GURMUKHI LETTER I*/
+ RTUNI_ALPHA, /* U+000a08: GURMUKHI LETTER II*/
+ RTUNI_ALPHA, /* U+000a09: GURMUKHI LETTER U*/
+ RTUNI_ALPHA, /* U+000a0a: GURMUKHI LETTER UU*/
+ 0, /* U+000a0b: */
+ 0, /* U+000a0c: */
+ 0, /* U+000a0d: */
+ 0, /* U+000a0e: */
+ RTUNI_ALPHA, /* U+000a0f: GURMUKHI LETTER EE*/
+ RTUNI_ALPHA, /* U+000a10: GURMUKHI LETTER AI*/
+ 0, /* U+000a11: */
+ 0, /* U+000a12: */
+ RTUNI_ALPHA, /* U+000a13: GURMUKHI LETTER OO*/
+ RTUNI_ALPHA, /* U+000a14: GURMUKHI LETTER AU*/
+ RTUNI_ALPHA, /* U+000a15: GURMUKHI LETTER KA*/
+ RTUNI_ALPHA, /* U+000a16: GURMUKHI LETTER KHA*/
+ RTUNI_ALPHA, /* U+000a17: GURMUKHI LETTER GA*/
+ RTUNI_ALPHA, /* U+000a18: GURMUKHI LETTER GHA*/
+ RTUNI_ALPHA, /* U+000a19: GURMUKHI LETTER NGA*/
+ RTUNI_ALPHA, /* U+000a1a: GURMUKHI LETTER CA*/
+ RTUNI_ALPHA, /* U+000a1b: GURMUKHI LETTER CHA*/
+ RTUNI_ALPHA, /* U+000a1c: GURMUKHI LETTER JA*/
+ RTUNI_ALPHA, /* U+000a1d: GURMUKHI LETTER JHA*/
+ RTUNI_ALPHA, /* U+000a1e: GURMUKHI LETTER NYA*/
+ RTUNI_ALPHA, /* U+000a1f: GURMUKHI LETTER TTA*/
+ RTUNI_ALPHA, /* U+000a20: GURMUKHI LETTER TTHA*/
+ RTUNI_ALPHA, /* U+000a21: GURMUKHI LETTER DDA*/
+ RTUNI_ALPHA, /* U+000a22: GURMUKHI LETTER DDHA*/
+ RTUNI_ALPHA, /* U+000a23: GURMUKHI LETTER NNA*/
+ RTUNI_ALPHA, /* U+000a24: GURMUKHI LETTER TA*/
+ RTUNI_ALPHA, /* U+000a25: GURMUKHI LETTER THA*/
+ RTUNI_ALPHA, /* U+000a26: GURMUKHI LETTER DA*/
+ RTUNI_ALPHA, /* U+000a27: GURMUKHI LETTER DHA*/
+ RTUNI_ALPHA, /* U+000a28: GURMUKHI LETTER NA*/
+ 0, /* U+000a29: */
+ RTUNI_ALPHA, /* U+000a2a: GURMUKHI LETTER PA*/
+ RTUNI_ALPHA, /* U+000a2b: GURMUKHI LETTER PHA*/
+ RTUNI_ALPHA, /* U+000a2c: GURMUKHI LETTER BA*/
+ RTUNI_ALPHA, /* U+000a2d: GURMUKHI LETTER BHA*/
+ RTUNI_ALPHA, /* U+000a2e: GURMUKHI LETTER MA*/
+ RTUNI_ALPHA, /* U+000a2f: GURMUKHI LETTER YA*/
+ RTUNI_ALPHA, /* U+000a30: GURMUKHI LETTER RA*/
+ 0, /* U+000a31: */
+ RTUNI_ALPHA, /* U+000a32: GURMUKHI LETTER LA*/
+ RTUNI_ALPHA, /* U+000a33: GURMUKHI LETTER LLA*/
+ 0, /* U+000a34: */
+ RTUNI_ALPHA, /* U+000a35: GURMUKHI LETTER VA*/
+ RTUNI_ALPHA, /* U+000a36: GURMUKHI LETTER SHA*/
+ 0, /* U+000a37: */
+ RTUNI_ALPHA, /* U+000a38: GURMUKHI LETTER SA*/
+ RTUNI_ALPHA, /* U+000a39: GURMUKHI LETTER HA*/
+ 0, /* U+000a3a: */
+ 0, /* U+000a3b: */
+ 0, /* U+000a3c: GURMUKHI SIGN NUKTA*/
+ 0, /* U+000a3d: */
+ RTUNI_ALPHA, /* U+000a3e: GURMUKHI VOWEL SIGN AA*/
+ RTUNI_ALPHA, /* U+000a3f: GURMUKHI VOWEL SIGN I*/
+ RTUNI_ALPHA, /* U+000a40: GURMUKHI VOWEL SIGN II*/
+ RTUNI_ALPHA, /* U+000a41: GURMUKHI VOWEL SIGN U*/
+ RTUNI_ALPHA, /* U+000a42: GURMUKHI VOWEL SIGN UU*/
+ 0, /* U+000a43: */
+ 0, /* U+000a44: */
+ 0, /* U+000a45: */
+ 0, /* U+000a46: */
+ RTUNI_ALPHA, /* U+000a47: GURMUKHI VOWEL SIGN EE*/
+ RTUNI_ALPHA, /* U+000a48: GURMUKHI VOWEL SIGN AI*/
+ 0, /* U+000a49: */
+ 0, /* U+000a4a: */
+ RTUNI_ALPHA, /* U+000a4b: GURMUKHI VOWEL SIGN OO*/
+ RTUNI_ALPHA, /* U+000a4c: GURMUKHI VOWEL SIGN AU*/
+ 0, /* U+000a4d: GURMUKHI SIGN VIRAMA*/
+ 0, /* U+000a4e: */
+ 0, /* U+000a4f: */
+ 0, /* U+000a50: */
+ RTUNI_ALPHA, /* U+000a51: GURMUKHI SIGN UDAAT*/
+ 0, /* U+000a52: */
+ 0, /* U+000a53: */
+ 0, /* U+000a54: */
+ 0, /* U+000a55: */
+ 0, /* U+000a56: */
+ 0, /* U+000a57: */
+ 0, /* U+000a58: */
+ RTUNI_ALPHA, /* U+000a59: GURMUKHI LETTER KHHA*/
+ RTUNI_ALPHA, /* U+000a5a: GURMUKHI LETTER GHHA*/
+ RTUNI_ALPHA, /* U+000a5b: GURMUKHI LETTER ZA*/
+ RTUNI_ALPHA, /* U+000a5c: GURMUKHI LETTER RRA*/
+ 0, /* U+000a5d: */
+ RTUNI_ALPHA, /* U+000a5e: GURMUKHI LETTER FA*/
+ 0, /* U+000a5f: */
+ 0, /* U+000a60: */
+ 0, /* U+000a61: */
+ 0, /* U+000a62: */
+ 0, /* U+000a63: */
+ 0, /* U+000a64: */
+ 0, /* U+000a65: */
+ RTUNI_DDIGIT, /* U+000a66: GURMUKHI DIGIT ZERO*/
+ RTUNI_DDIGIT, /* U+000a67: GURMUKHI DIGIT ONE*/
+ RTUNI_DDIGIT, /* U+000a68: GURMUKHI DIGIT TWO*/
+ RTUNI_DDIGIT, /* U+000a69: GURMUKHI DIGIT THREE*/
+ RTUNI_DDIGIT, /* U+000a6a: GURMUKHI DIGIT FOUR*/
+ RTUNI_DDIGIT, /* U+000a6b: GURMUKHI DIGIT FIVE*/
+ RTUNI_DDIGIT, /* U+000a6c: GURMUKHI DIGIT SIX*/
+ RTUNI_DDIGIT, /* U+000a6d: GURMUKHI DIGIT SEVEN*/
+ RTUNI_DDIGIT, /* U+000a6e: GURMUKHI DIGIT EIGHT*/
+ RTUNI_DDIGIT, /* U+000a6f: GURMUKHI DIGIT NINE*/
+ RTUNI_ALPHA, /* U+000a70: GURMUKHI TIPPI*/
+ RTUNI_ALPHA, /* U+000a71: GURMUKHI ADDAK*/
+ RTUNI_ALPHA, /* U+000a72: GURMUKHI IRI*/
+ RTUNI_ALPHA, /* U+000a73: GURMUKHI URA*/
+ RTUNI_ALPHA, /* U+000a74: GURMUKHI EK ONKAR*/
+ RTUNI_ALPHA, /* U+000a75: GURMUKHI SIGN YAKASH*/
+ 0, /* U+000a76: */
+ 0, /* U+000a77: */
+ 0, /* U+000a78: */
+ 0, /* U+000a79: */
+ 0, /* U+000a7a: */
+ 0, /* U+000a7b: */
+ 0, /* U+000a7c: */
+ 0, /* U+000a7d: */
+ 0, /* U+000a7e: */
+ 0, /* U+000a7f: */
+ 0, /* U+000a80: */
+ RTUNI_ALPHA, /* U+000a81: GUJARATI SIGN CANDRABINDU*/
+ RTUNI_ALPHA, /* U+000a82: GUJARATI SIGN ANUSVARA*/
+ RTUNI_ALPHA, /* U+000a83: GUJARATI SIGN VISARGA*/
+ 0, /* U+000a84: */
+ RTUNI_ALPHA, /* U+000a85: GUJARATI LETTER A*/
+ RTUNI_ALPHA, /* U+000a86: GUJARATI LETTER AA*/
+ RTUNI_ALPHA, /* U+000a87: GUJARATI LETTER I*/
+ RTUNI_ALPHA, /* U+000a88: GUJARATI LETTER II*/
+ RTUNI_ALPHA, /* U+000a89: GUJARATI LETTER U*/
+ RTUNI_ALPHA, /* U+000a8a: GUJARATI LETTER UU*/
+ RTUNI_ALPHA, /* U+000a8b: GUJARATI LETTER VOCALIC R*/
+ RTUNI_ALPHA, /* U+000a8c: GUJARATI LETTER VOCALIC L*/
+ RTUNI_ALPHA, /* U+000a8d: GUJARATI VOWEL CANDRA E*/
+ 0, /* U+000a8e: */
+ RTUNI_ALPHA, /* U+000a8f: GUJARATI LETTER E*/
+ RTUNI_ALPHA, /* U+000a90: GUJARATI LETTER AI*/
+ RTUNI_ALPHA, /* U+000a91: GUJARATI VOWEL CANDRA O*/
+ 0, /* U+000a92: */
+ RTUNI_ALPHA, /* U+000a93: GUJARATI LETTER O*/
+ RTUNI_ALPHA, /* U+000a94: GUJARATI LETTER AU*/
+ RTUNI_ALPHA, /* U+000a95: GUJARATI LETTER KA*/
+ RTUNI_ALPHA, /* U+000a96: GUJARATI LETTER KHA*/
+ RTUNI_ALPHA, /* U+000a97: GUJARATI LETTER GA*/
+ RTUNI_ALPHA, /* U+000a98: GUJARATI LETTER GHA*/
+ RTUNI_ALPHA, /* U+000a99: GUJARATI LETTER NGA*/
+ RTUNI_ALPHA, /* U+000a9a: GUJARATI LETTER CA*/
+ RTUNI_ALPHA, /* U+000a9b: GUJARATI LETTER CHA*/
+ RTUNI_ALPHA, /* U+000a9c: GUJARATI LETTER JA*/
+ RTUNI_ALPHA, /* U+000a9d: GUJARATI LETTER JHA*/
+ RTUNI_ALPHA, /* U+000a9e: GUJARATI LETTER NYA*/
+ RTUNI_ALPHA, /* U+000a9f: GUJARATI LETTER TTA*/
+ RTUNI_ALPHA, /* U+000aa0: GUJARATI LETTER TTHA*/
+ RTUNI_ALPHA, /* U+000aa1: GUJARATI LETTER DDA*/
+ RTUNI_ALPHA, /* U+000aa2: GUJARATI LETTER DDHA*/
+ RTUNI_ALPHA, /* U+000aa3: GUJARATI LETTER NNA*/
+ RTUNI_ALPHA, /* U+000aa4: GUJARATI LETTER TA*/
+ RTUNI_ALPHA, /* U+000aa5: GUJARATI LETTER THA*/
+ RTUNI_ALPHA, /* U+000aa6: GUJARATI LETTER DA*/
+ RTUNI_ALPHA, /* U+000aa7: GUJARATI LETTER DHA*/
+ RTUNI_ALPHA, /* U+000aa8: GUJARATI LETTER NA*/
+ 0, /* U+000aa9: */
+ RTUNI_ALPHA, /* U+000aaa: GUJARATI LETTER PA*/
+ RTUNI_ALPHA, /* U+000aab: GUJARATI LETTER PHA*/
+ RTUNI_ALPHA, /* U+000aac: GUJARATI LETTER BA*/
+ RTUNI_ALPHA, /* U+000aad: GUJARATI LETTER BHA*/
+ RTUNI_ALPHA, /* U+000aae: GUJARATI LETTER MA*/
+ RTUNI_ALPHA, /* U+000aaf: GUJARATI LETTER YA*/
+ RTUNI_ALPHA, /* U+000ab0: GUJARATI LETTER RA*/
+ 0, /* U+000ab1: */
+ RTUNI_ALPHA, /* U+000ab2: GUJARATI LETTER LA*/
+ RTUNI_ALPHA, /* U+000ab3: GUJARATI LETTER LLA*/
+ 0, /* U+000ab4: */
+ RTUNI_ALPHA, /* U+000ab5: GUJARATI LETTER VA*/
+ RTUNI_ALPHA, /* U+000ab6: GUJARATI LETTER SHA*/
+ RTUNI_ALPHA, /* U+000ab7: GUJARATI LETTER SSA*/
+ RTUNI_ALPHA, /* U+000ab8: GUJARATI LETTER SA*/
+ RTUNI_ALPHA, /* U+000ab9: GUJARATI LETTER HA*/
+ 0, /* U+000aba: */
+ 0, /* U+000abb: */
+ 0, /* U+000abc: GUJARATI SIGN NUKTA*/
+ RTUNI_ALPHA, /* U+000abd: GUJARATI SIGN AVAGRAHA*/
+ RTUNI_ALPHA, /* U+000abe: GUJARATI VOWEL SIGN AA*/
+ RTUNI_ALPHA, /* U+000abf: GUJARATI VOWEL SIGN I*/
+ RTUNI_ALPHA, /* U+000ac0: GUJARATI VOWEL SIGN II*/
+ RTUNI_ALPHA, /* U+000ac1: GUJARATI VOWEL SIGN U*/
+ RTUNI_ALPHA, /* U+000ac2: GUJARATI VOWEL SIGN UU*/
+ RTUNI_ALPHA, /* U+000ac3: GUJARATI VOWEL SIGN VOCALIC R*/
+ RTUNI_ALPHA, /* U+000ac4: GUJARATI VOWEL SIGN VOCALIC RR*/
+ RTUNI_ALPHA, /* U+000ac5: GUJARATI VOWEL SIGN CANDRA E*/
+ 0, /* U+000ac6: */
+ RTUNI_ALPHA, /* U+000ac7: GUJARATI VOWEL SIGN E*/
+ RTUNI_ALPHA, /* U+000ac8: GUJARATI VOWEL SIGN AI*/
+ RTUNI_ALPHA, /* U+000ac9: GUJARATI VOWEL SIGN CANDRA O*/
+ 0, /* U+000aca: */
+ RTUNI_ALPHA, /* U+000acb: GUJARATI VOWEL SIGN O*/
+ RTUNI_ALPHA, /* U+000acc: GUJARATI VOWEL SIGN AU*/
+ 0, /* U+000acd: GUJARATI SIGN VIRAMA*/
+ 0, /* U+000ace: */
+ 0, /* U+000acf: */
+ RTUNI_ALPHA, /* U+000ad0: GUJARATI OM*/
+ 0, /* U+000ad1: */
+ 0, /* U+000ad2: */
+ 0, /* U+000ad3: */
+ 0, /* U+000ad4: */
+ 0, /* U+000ad5: */
+ 0, /* U+000ad6: */
+ 0, /* U+000ad7: */
+ 0, /* U+000ad8: */
+ 0, /* U+000ad9: */
+ 0, /* U+000ada: */
+ 0, /* U+000adb: */
+ 0, /* U+000adc: */
+ 0, /* U+000add: */
+ 0, /* U+000ade: */
+ 0, /* U+000adf: */
+ RTUNI_ALPHA, /* U+000ae0: GUJARATI LETTER VOCALIC RR*/
+ RTUNI_ALPHA, /* U+000ae1: GUJARATI LETTER VOCALIC LL*/
+ RTUNI_ALPHA, /* U+000ae2: GUJARATI VOWEL SIGN VOCALIC L*/
+ RTUNI_ALPHA, /* U+000ae3: GUJARATI VOWEL SIGN VOCALIC LL*/
+ 0, /* U+000ae4: */
+ 0, /* U+000ae5: */
+ RTUNI_DDIGIT, /* U+000ae6: GUJARATI DIGIT ZERO*/
+ RTUNI_DDIGIT, /* U+000ae7: GUJARATI DIGIT ONE*/
+ RTUNI_DDIGIT, /* U+000ae8: GUJARATI DIGIT TWO*/
+ RTUNI_DDIGIT, /* U+000ae9: GUJARATI DIGIT THREE*/
+ RTUNI_DDIGIT, /* U+000aea: GUJARATI DIGIT FOUR*/
+ RTUNI_DDIGIT, /* U+000aeb: GUJARATI DIGIT FIVE*/
+ RTUNI_DDIGIT, /* U+000aec: GUJARATI DIGIT SIX*/
+ RTUNI_DDIGIT, /* U+000aed: GUJARATI DIGIT SEVEN*/
+ RTUNI_DDIGIT, /* U+000aee: GUJARATI DIGIT EIGHT*/
+ RTUNI_DDIGIT, /* U+000aef: GUJARATI DIGIT NINE*/
+ 0, /* U+000af0: GUJARATI ABBREVIATION SIGN*/
+ 0, /* U+000af1: GUJARATI RUPEE SIGN*/
+ 0, /* U+000af2: */
+ 0, /* U+000af3: */
+ 0, /* U+000af4: */
+ 0, /* U+000af5: */
+ 0, /* U+000af6: */
+ 0, /* U+000af7: */
+ 0, /* U+000af8: */
+ 0, /* U+000af9: */
+ 0, /* U+000afa: */
+ 0, /* U+000afb: */
+ 0, /* U+000afc: */
+ 0, /* U+000afd: */
+ 0, /* U+000afe: */
+ 0, /* U+000aff: */
+ 0, /* U+000b00: */
+ RTUNI_ALPHA, /* U+000b01: ORIYA SIGN CANDRABINDU*/
+ RTUNI_ALPHA, /* U+000b02: ORIYA SIGN ANUSVARA*/
+ RTUNI_ALPHA, /* U+000b03: ORIYA SIGN VISARGA*/
+ 0, /* U+000b04: */
+ RTUNI_ALPHA, /* U+000b05: ORIYA LETTER A*/
+ RTUNI_ALPHA, /* U+000b06: ORIYA LETTER AA*/
+ RTUNI_ALPHA, /* U+000b07: ORIYA LETTER I*/
+ RTUNI_ALPHA, /* U+000b08: ORIYA LETTER II*/
+ RTUNI_ALPHA, /* U+000b09: ORIYA LETTER U*/
+ RTUNI_ALPHA, /* U+000b0a: ORIYA LETTER UU*/
+ RTUNI_ALPHA, /* U+000b0b: ORIYA LETTER VOCALIC R*/
+ RTUNI_ALPHA, /* U+000b0c: ORIYA LETTER VOCALIC L*/
+ 0, /* U+000b0d: */
+ 0, /* U+000b0e: */
+ RTUNI_ALPHA, /* U+000b0f: ORIYA LETTER E*/
+ RTUNI_ALPHA, /* U+000b10: ORIYA LETTER AI*/
+ 0, /* U+000b11: */
+ 0, /* U+000b12: */
+ RTUNI_ALPHA, /* U+000b13: ORIYA LETTER O*/
+ RTUNI_ALPHA, /* U+000b14: ORIYA LETTER AU*/
+ RTUNI_ALPHA, /* U+000b15: ORIYA LETTER KA*/
+ RTUNI_ALPHA, /* U+000b16: ORIYA LETTER KHA*/
+ RTUNI_ALPHA, /* U+000b17: ORIYA LETTER GA*/
+ RTUNI_ALPHA, /* U+000b18: ORIYA LETTER GHA*/
+ RTUNI_ALPHA, /* U+000b19: ORIYA LETTER NGA*/
+ RTUNI_ALPHA, /* U+000b1a: ORIYA LETTER CA*/
+ RTUNI_ALPHA, /* U+000b1b: ORIYA LETTER CHA*/
+ RTUNI_ALPHA, /* U+000b1c: ORIYA LETTER JA*/
+ RTUNI_ALPHA, /* U+000b1d: ORIYA LETTER JHA*/
+ RTUNI_ALPHA, /* U+000b1e: ORIYA LETTER NYA*/
+ RTUNI_ALPHA, /* U+000b1f: ORIYA LETTER TTA*/
+ RTUNI_ALPHA, /* U+000b20: ORIYA LETTER TTHA*/
+ RTUNI_ALPHA, /* U+000b21: ORIYA LETTER DDA*/
+ RTUNI_ALPHA, /* U+000b22: ORIYA LETTER DDHA*/
+ RTUNI_ALPHA, /* U+000b23: ORIYA LETTER NNA*/
+ RTUNI_ALPHA, /* U+000b24: ORIYA LETTER TA*/
+ RTUNI_ALPHA, /* U+000b25: ORIYA LETTER THA*/
+ RTUNI_ALPHA, /* U+000b26: ORIYA LETTER DA*/
+ RTUNI_ALPHA, /* U+000b27: ORIYA LETTER DHA*/
+ RTUNI_ALPHA, /* U+000b28: ORIYA LETTER NA*/
+ 0, /* U+000b29: */
+ RTUNI_ALPHA, /* U+000b2a: ORIYA LETTER PA*/
+ RTUNI_ALPHA, /* U+000b2b: ORIYA LETTER PHA*/
+ RTUNI_ALPHA, /* U+000b2c: ORIYA LETTER BA*/
+ RTUNI_ALPHA, /* U+000b2d: ORIYA LETTER BHA*/
+ RTUNI_ALPHA, /* U+000b2e: ORIYA LETTER MA*/
+ RTUNI_ALPHA, /* U+000b2f: ORIYA LETTER YA*/
+ RTUNI_ALPHA, /* U+000b30: ORIYA LETTER RA*/
+ 0, /* U+000b31: */
+ RTUNI_ALPHA, /* U+000b32: ORIYA LETTER LA*/
+ RTUNI_ALPHA, /* U+000b33: ORIYA LETTER LLA*/
+ 0, /* U+000b34: */
+ RTUNI_ALPHA, /* U+000b35: ORIYA LETTER VA*/
+ RTUNI_ALPHA, /* U+000b36: ORIYA LETTER SHA*/
+ RTUNI_ALPHA, /* U+000b37: ORIYA LETTER SSA*/
+ RTUNI_ALPHA, /* U+000b38: ORIYA LETTER SA*/
+ RTUNI_ALPHA, /* U+000b39: ORIYA LETTER HA*/
+ 0, /* U+000b3a: */
+ 0, /* U+000b3b: */
+ 0, /* U+000b3c: ORIYA SIGN NUKTA*/
+ RTUNI_ALPHA, /* U+000b3d: ORIYA SIGN AVAGRAHA*/
+ RTUNI_ALPHA, /* U+000b3e: ORIYA VOWEL SIGN AA*/
+ RTUNI_ALPHA, /* U+000b3f: ORIYA VOWEL SIGN I*/
+ RTUNI_ALPHA, /* U+000b40: ORIYA VOWEL SIGN II*/
+ RTUNI_ALPHA, /* U+000b41: ORIYA VOWEL SIGN U*/
+ RTUNI_ALPHA, /* U+000b42: ORIYA VOWEL SIGN UU*/
+ RTUNI_ALPHA, /* U+000b43: ORIYA VOWEL SIGN VOCALIC R*/
+ RTUNI_ALPHA, /* U+000b44: ORIYA VOWEL SIGN VOCALIC RR*/
+ 0, /* U+000b45: */
+ 0, /* U+000b46: */
+ RTUNI_ALPHA, /* U+000b47: ORIYA VOWEL SIGN E*/
+ RTUNI_ALPHA, /* U+000b48: ORIYA VOWEL SIGN AI*/
+ 0, /* U+000b49: */
+ 0, /* U+000b4a: */
+ RTUNI_ALPHA, /* U+000b4b: ORIYA VOWEL SIGN O*/
+ RTUNI_ALPHA, /* U+000b4c: ORIYA VOWEL SIGN AU*/
+ 0, /* U+000b4d: ORIYA SIGN VIRAMA*/
+ 0, /* U+000b4e: */
+ 0, /* U+000b4f: */
+ 0, /* U+000b50: */
+ 0, /* U+000b51: */
+ 0, /* U+000b52: */
+ 0, /* U+000b53: */
+ 0, /* U+000b54: */
+ 0, /* U+000b55: */
+ RTUNI_ALPHA, /* U+000b56: ORIYA AI LENGTH MARK*/
+ RTUNI_ALPHA, /* U+000b57: ORIYA AU LENGTH MARK*/
+ 0, /* U+000b58: */
+ 0, /* U+000b59: */
+ 0, /* U+000b5a: */
+ 0, /* U+000b5b: */
+ RTUNI_ALPHA, /* U+000b5c: ORIYA LETTER RRA*/
+ RTUNI_ALPHA, /* U+000b5d: ORIYA LETTER RHA*/
+ 0, /* U+000b5e: */
+ RTUNI_ALPHA, /* U+000b5f: ORIYA LETTER YYA*/
+ RTUNI_ALPHA, /* U+000b60: ORIYA LETTER VOCALIC RR*/
+ RTUNI_ALPHA, /* U+000b61: ORIYA LETTER VOCALIC LL*/
+ RTUNI_ALPHA, /* U+000b62: ORIYA VOWEL SIGN VOCALIC L*/
+ RTUNI_ALPHA, /* U+000b63: ORIYA VOWEL SIGN VOCALIC LL*/
+ 0, /* U+000b64: */
+ 0, /* U+000b65: */
+ RTUNI_DDIGIT, /* U+000b66: ORIYA DIGIT ZERO*/
+ RTUNI_DDIGIT, /* U+000b67: ORIYA DIGIT ONE*/
+ RTUNI_DDIGIT, /* U+000b68: ORIYA DIGIT TWO*/
+ RTUNI_DDIGIT, /* U+000b69: ORIYA DIGIT THREE*/
+ RTUNI_DDIGIT, /* U+000b6a: ORIYA DIGIT FOUR*/
+ RTUNI_DDIGIT, /* U+000b6b: ORIYA DIGIT FIVE*/
+ RTUNI_DDIGIT, /* U+000b6c: ORIYA DIGIT SIX*/
+ RTUNI_DDIGIT, /* U+000b6d: ORIYA DIGIT SEVEN*/
+ RTUNI_DDIGIT, /* U+000b6e: ORIYA DIGIT EIGHT*/
+ RTUNI_DDIGIT, /* U+000b6f: ORIYA DIGIT NINE*/
+ 0, /* U+000b70: ORIYA ISSHAR*/
+ RTUNI_ALPHA, /* U+000b71: ORIYA LETTER WA*/
+ 0, /* U+000b72: ORIYA FRACTION ONE QUARTER*/
+ 0, /* U+000b73: ORIYA FRACTION ONE HALF*/
+ 0, /* U+000b74: ORIYA FRACTION THREE QUARTERS*/
+ 0, /* U+000b75: ORIYA FRACTION ONE SIXTEENTH*/
+ 0, /* U+000b76: ORIYA FRACTION ONE EIGHTH*/
+ 0, /* U+000b77: ORIYA FRACTION THREE SIXTEENTHS*/
+ 0, /* U+000b78: */
+ 0, /* U+000b79: */
+ 0, /* U+000b7a: */
+ 0, /* U+000b7b: */
+ 0, /* U+000b7c: */
+ 0, /* U+000b7d: */
+ 0, /* U+000b7e: */
+ 0, /* U+000b7f: */
+ 0, /* U+000b80: */
+ 0, /* U+000b81: */
+ RTUNI_ALPHA, /* U+000b82: TAMIL SIGN ANUSVARA*/
+ RTUNI_ALPHA, /* U+000b83: TAMIL SIGN VISARGA*/
+ 0, /* U+000b84: */
+ RTUNI_ALPHA, /* U+000b85: TAMIL LETTER A*/
+ RTUNI_ALPHA, /* U+000b86: TAMIL LETTER AA*/
+ RTUNI_ALPHA, /* U+000b87: TAMIL LETTER I*/
+ RTUNI_ALPHA, /* U+000b88: TAMIL LETTER II*/
+ RTUNI_ALPHA, /* U+000b89: TAMIL LETTER U*/
+ RTUNI_ALPHA, /* U+000b8a: TAMIL LETTER UU*/
+ 0, /* U+000b8b: */
+ 0, /* U+000b8c: */
+ 0, /* U+000b8d: */
+ RTUNI_ALPHA, /* U+000b8e: TAMIL LETTER E*/
+ RTUNI_ALPHA, /* U+000b8f: TAMIL LETTER EE*/
+ RTUNI_ALPHA, /* U+000b90: TAMIL LETTER AI*/
+ 0, /* U+000b91: */
+ RTUNI_ALPHA, /* U+000b92: TAMIL LETTER O*/
+ RTUNI_ALPHA, /* U+000b93: TAMIL LETTER OO*/
+ RTUNI_ALPHA, /* U+000b94: TAMIL LETTER AU*/
+ RTUNI_ALPHA, /* U+000b95: TAMIL LETTER KA*/
+ 0, /* U+000b96: */
+ 0, /* U+000b97: */
+ 0, /* U+000b98: */
+ RTUNI_ALPHA, /* U+000b99: TAMIL LETTER NGA*/
+ RTUNI_ALPHA, /* U+000b9a: TAMIL LETTER CA*/
+ 0, /* U+000b9b: */
+ RTUNI_ALPHA, /* U+000b9c: TAMIL LETTER JA*/
+ 0, /* U+000b9d: */
+ RTUNI_ALPHA, /* U+000b9e: TAMIL LETTER NYA*/
+ RTUNI_ALPHA, /* U+000b9f: TAMIL LETTER TTA*/
+ 0, /* U+000ba0: */
+ 0, /* U+000ba1: */
+ 0, /* U+000ba2: */
+ RTUNI_ALPHA, /* U+000ba3: TAMIL LETTER NNA*/
+ RTUNI_ALPHA, /* U+000ba4: TAMIL LETTER TA*/
+ 0, /* U+000ba5: */
+ 0, /* U+000ba6: */
+ 0, /* U+000ba7: */
+ RTUNI_ALPHA, /* U+000ba8: TAMIL LETTER NA*/
+ RTUNI_ALPHA, /* U+000ba9: TAMIL LETTER NNNA*/
+ RTUNI_ALPHA, /* U+000baa: TAMIL LETTER PA*/
+ 0, /* U+000bab: */
+ 0, /* U+000bac: */
+ 0, /* U+000bad: */
+ RTUNI_ALPHA, /* U+000bae: TAMIL LETTER MA*/
+ RTUNI_ALPHA, /* U+000baf: TAMIL LETTER YA*/
+ RTUNI_ALPHA, /* U+000bb0: TAMIL LETTER RA*/
+ RTUNI_ALPHA, /* U+000bb1: TAMIL LETTER RRA*/
+ RTUNI_ALPHA, /* U+000bb2: TAMIL LETTER LA*/
+ RTUNI_ALPHA, /* U+000bb3: TAMIL LETTER LLA*/
+ RTUNI_ALPHA, /* U+000bb4: TAMIL LETTER LLLA*/
+ RTUNI_ALPHA, /* U+000bb5: TAMIL LETTER VA*/
+ RTUNI_ALPHA, /* U+000bb6: TAMIL LETTER SHA*/
+ RTUNI_ALPHA, /* U+000bb7: TAMIL LETTER SSA*/
+ RTUNI_ALPHA, /* U+000bb8: TAMIL LETTER SA*/
+ RTUNI_ALPHA, /* U+000bb9: TAMIL LETTER HA*/
+ 0, /* U+000bba: */
+ 0, /* U+000bbb: */
+ 0, /* U+000bbc: */
+ 0, /* U+000bbd: */
+ RTUNI_ALPHA, /* U+000bbe: TAMIL VOWEL SIGN AA*/
+ RTUNI_ALPHA, /* U+000bbf: TAMIL VOWEL SIGN I*/
+ RTUNI_ALPHA, /* U+000bc0: TAMIL VOWEL SIGN II*/
+ RTUNI_ALPHA, /* U+000bc1: TAMIL VOWEL SIGN U*/
+ RTUNI_ALPHA, /* U+000bc2: TAMIL VOWEL SIGN UU*/
+ 0, /* U+000bc3: */
+ 0, /* U+000bc4: */
+ 0, /* U+000bc5: */
+ RTUNI_ALPHA, /* U+000bc6: TAMIL VOWEL SIGN E*/
+ RTUNI_ALPHA, /* U+000bc7: TAMIL VOWEL SIGN EE*/
+ RTUNI_ALPHA, /* U+000bc8: TAMIL VOWEL SIGN AI*/
+ 0, /* U+000bc9: */
+ RTUNI_ALPHA, /* U+000bca: TAMIL VOWEL SIGN O*/
+ RTUNI_ALPHA, /* U+000bcb: TAMIL VOWEL SIGN OO*/
+ RTUNI_ALPHA, /* U+000bcc: TAMIL VOWEL SIGN AU*/
+ 0, /* U+000bcd: TAMIL SIGN VIRAMA*/
+ 0, /* U+000bce: */
+ 0, /* U+000bcf: */
+ RTUNI_ALPHA, /* U+000bd0: TAMIL OM*/
+ 0, /* U+000bd1: */
+ 0, /* U+000bd2: */
+ 0, /* U+000bd3: */
+ 0, /* U+000bd4: */
+ 0, /* U+000bd5: */
+ 0, /* U+000bd6: */
+ RTUNI_ALPHA, /* U+000bd7: TAMIL AU LENGTH MARK*/
+ 0, /* U+000bd8: */
+ 0, /* U+000bd9: */
+ 0, /* U+000bda: */
+ 0, /* U+000bdb: */
+ 0, /* U+000bdc: */
+ 0, /* U+000bdd: */
+ 0, /* U+000bde: */
+ 0, /* U+000bdf: */
+ 0, /* U+000be0: */
+ 0, /* U+000be1: */
+ 0, /* U+000be2: */
+ 0, /* U+000be3: */
+ 0, /* U+000be4: */
+ 0, /* U+000be5: */
+ RTUNI_DDIGIT, /* U+000be6: TAMIL DIGIT ZERO*/
+ RTUNI_DDIGIT, /* U+000be7: TAMIL DIGIT ONE*/
+ RTUNI_DDIGIT, /* U+000be8: TAMIL DIGIT TWO*/
+ RTUNI_DDIGIT, /* U+000be9: TAMIL DIGIT THREE*/
+ RTUNI_DDIGIT, /* U+000bea: TAMIL DIGIT FOUR*/
+ RTUNI_DDIGIT, /* U+000beb: TAMIL DIGIT FIVE*/
+ RTUNI_DDIGIT, /* U+000bec: TAMIL DIGIT SIX*/
+ RTUNI_DDIGIT, /* U+000bed: TAMIL DIGIT SEVEN*/
+ RTUNI_DDIGIT, /* U+000bee: TAMIL DIGIT EIGHT*/
+ RTUNI_DDIGIT, /* U+000bef: TAMIL DIGIT NINE*/
+ 0, /* U+000bf0: TAMIL NUMBER TEN*/
+ 0, /* U+000bf1: TAMIL NUMBER ONE HUNDRED*/
+ 0, /* U+000bf2: TAMIL NUMBER ONE THOUSAND*/
+ 0, /* U+000bf3: TAMIL DAY SIGN*/
+ 0, /* U+000bf4: TAMIL MONTH SIGN*/
+ 0, /* U+000bf5: TAMIL YEAR SIGN*/
+ 0, /* U+000bf6: TAMIL DEBIT SIGN*/
+ 0, /* U+000bf7: TAMIL CREDIT SIGN*/
+ 0, /* U+000bf8: TAMIL AS ABOVE SIGN*/
+ 0, /* U+000bf9: TAMIL RUPEE SIGN*/
+ 0, /* U+000bfa: TAMIL NUMBER SIGN*/
+ 0, /* U+000bfb: */
+ 0, /* U+000bfc: */
+ 0, /* U+000bfd: */
+ 0, /* U+000bfe: */
+ 0, /* U+000bff: */
+ 0, /* U+000c00: */
+ RTUNI_ALPHA, /* U+000c01: TELUGU SIGN CANDRABINDU*/
+ RTUNI_ALPHA, /* U+000c02: TELUGU SIGN ANUSVARA*/
+ RTUNI_ALPHA, /* U+000c03: TELUGU SIGN VISARGA*/
+ 0, /* U+000c04: */
+ RTUNI_ALPHA, /* U+000c05: TELUGU LETTER A*/
+ RTUNI_ALPHA, /* U+000c06: TELUGU LETTER AA*/
+ RTUNI_ALPHA, /* U+000c07: TELUGU LETTER I*/
+ RTUNI_ALPHA, /* U+000c08: TELUGU LETTER II*/
+ RTUNI_ALPHA, /* U+000c09: TELUGU LETTER U*/
+ RTUNI_ALPHA, /* U+000c0a: TELUGU LETTER UU*/
+ RTUNI_ALPHA, /* U+000c0b: TELUGU LETTER VOCALIC R*/
+ RTUNI_ALPHA, /* U+000c0c: TELUGU LETTER VOCALIC L*/
+ 0, /* U+000c0d: */
+ RTUNI_ALPHA, /* U+000c0e: TELUGU LETTER E*/
+ RTUNI_ALPHA, /* U+000c0f: TELUGU LETTER EE*/
+ RTUNI_ALPHA, /* U+000c10: TELUGU LETTER AI*/
+ 0, /* U+000c11: */
+ RTUNI_ALPHA, /* U+000c12: TELUGU LETTER O*/
+ RTUNI_ALPHA, /* U+000c13: TELUGU LETTER OO*/
+ RTUNI_ALPHA, /* U+000c14: TELUGU LETTER AU*/
+ RTUNI_ALPHA, /* U+000c15: TELUGU LETTER KA*/
+ RTUNI_ALPHA, /* U+000c16: TELUGU LETTER KHA*/
+ RTUNI_ALPHA, /* U+000c17: TELUGU LETTER GA*/
+ RTUNI_ALPHA, /* U+000c18: TELUGU LETTER GHA*/
+ RTUNI_ALPHA, /* U+000c19: TELUGU LETTER NGA*/
+ RTUNI_ALPHA, /* U+000c1a: TELUGU LETTER CA*/
+ RTUNI_ALPHA, /* U+000c1b: TELUGU LETTER CHA*/
+ RTUNI_ALPHA, /* U+000c1c: TELUGU LETTER JA*/
+ RTUNI_ALPHA, /* U+000c1d: TELUGU LETTER JHA*/
+ RTUNI_ALPHA, /* U+000c1e: TELUGU LETTER NYA*/
+ RTUNI_ALPHA, /* U+000c1f: TELUGU LETTER TTA*/
+ RTUNI_ALPHA, /* U+000c20: TELUGU LETTER TTHA*/
+ RTUNI_ALPHA, /* U+000c21: TELUGU LETTER DDA*/
+ RTUNI_ALPHA, /* U+000c22: TELUGU LETTER DDHA*/
+ RTUNI_ALPHA, /* U+000c23: TELUGU LETTER NNA*/
+ RTUNI_ALPHA, /* U+000c24: TELUGU LETTER TA*/
+ RTUNI_ALPHA, /* U+000c25: TELUGU LETTER THA*/
+ RTUNI_ALPHA, /* U+000c26: TELUGU LETTER DA*/
+ RTUNI_ALPHA, /* U+000c27: TELUGU LETTER DHA*/
+ RTUNI_ALPHA, /* U+000c28: TELUGU LETTER NA*/
+ 0, /* U+000c29: */
+ RTUNI_ALPHA, /* U+000c2a: TELUGU LETTER PA*/
+ RTUNI_ALPHA, /* U+000c2b: TELUGU LETTER PHA*/
+ RTUNI_ALPHA, /* U+000c2c: TELUGU LETTER BA*/
+ RTUNI_ALPHA, /* U+000c2d: TELUGU LETTER BHA*/
+ RTUNI_ALPHA, /* U+000c2e: TELUGU LETTER MA*/
+ RTUNI_ALPHA, /* U+000c2f: TELUGU LETTER YA*/
+ RTUNI_ALPHA, /* U+000c30: TELUGU LETTER RA*/
+ RTUNI_ALPHA, /* U+000c31: TELUGU LETTER RRA*/
+ RTUNI_ALPHA, /* U+000c32: TELUGU LETTER LA*/
+ RTUNI_ALPHA, /* U+000c33: TELUGU LETTER LLA*/
+ 0, /* U+000c34: */
+ RTUNI_ALPHA, /* U+000c35: TELUGU LETTER VA*/
+ RTUNI_ALPHA, /* U+000c36: TELUGU LETTER SHA*/
+ RTUNI_ALPHA, /* U+000c37: TELUGU LETTER SSA*/
+ RTUNI_ALPHA, /* U+000c38: TELUGU LETTER SA*/
+ RTUNI_ALPHA, /* U+000c39: TELUGU LETTER HA*/
+ 0, /* U+000c3a: */
+ 0, /* U+000c3b: */
+ 0, /* U+000c3c: */
+ RTUNI_ALPHA, /* U+000c3d: TELUGU SIGN AVAGRAHA*/
+ RTUNI_ALPHA, /* U+000c3e: TELUGU VOWEL SIGN AA*/
+ RTUNI_ALPHA, /* U+000c3f: TELUGU VOWEL SIGN I*/
+ RTUNI_ALPHA, /* U+000c40: TELUGU VOWEL SIGN II*/
+ RTUNI_ALPHA, /* U+000c41: TELUGU VOWEL SIGN U*/
+ RTUNI_ALPHA, /* U+000c42: TELUGU VOWEL SIGN UU*/
+ RTUNI_ALPHA, /* U+000c43: TELUGU VOWEL SIGN VOCALIC R*/
+ RTUNI_ALPHA, /* U+000c44: TELUGU VOWEL SIGN VOCALIC RR*/
+ 0, /* U+000c45: */
+ RTUNI_ALPHA, /* U+000c46: TELUGU VOWEL SIGN E*/
+ RTUNI_ALPHA, /* U+000c47: TELUGU VOWEL SIGN EE*/
+ RTUNI_ALPHA, /* U+000c48: TELUGU VOWEL SIGN AI*/
+ 0, /* U+000c49: */
+ RTUNI_ALPHA, /* U+000c4a: TELUGU VOWEL SIGN O*/
+ RTUNI_ALPHA, /* U+000c4b: TELUGU VOWEL SIGN OO*/
+ RTUNI_ALPHA, /* U+000c4c: TELUGU VOWEL SIGN AU*/
+ 0, /* U+000c4d: TELUGU SIGN VIRAMA*/
+ 0, /* U+000c4e: */
+ 0, /* U+000c4f: */
+ 0, /* U+000c50: */
+ 0, /* U+000c51: */
+ 0, /* U+000c52: */
+ 0, /* U+000c53: */
+ 0, /* U+000c54: */
+ RTUNI_ALPHA, /* U+000c55: TELUGU LENGTH MARK*/
+ RTUNI_ALPHA, /* U+000c56: TELUGU AI LENGTH MARK*/
+ 0, /* U+000c57: */
+ RTUNI_ALPHA, /* U+000c58: TELUGU LETTER TSA*/
+ RTUNI_ALPHA, /* U+000c59: TELUGU LETTER DZA*/
+ 0, /* U+000c5a: */
+ 0, /* U+000c5b: */
+ 0, /* U+000c5c: */
+ 0, /* U+000c5d: */
+ 0, /* U+000c5e: */
+ 0, /* U+000c5f: */
+ RTUNI_ALPHA, /* U+000c60: TELUGU LETTER VOCALIC RR*/
+ RTUNI_ALPHA, /* U+000c61: TELUGU LETTER VOCALIC LL*/
+ RTUNI_ALPHA, /* U+000c62: TELUGU VOWEL SIGN VOCALIC L*/
+ RTUNI_ALPHA, /* U+000c63: TELUGU VOWEL SIGN VOCALIC LL*/
+ 0, /* U+000c64: */
+ 0, /* U+000c65: */
+ RTUNI_DDIGIT, /* U+000c66: TELUGU DIGIT ZERO*/
+ RTUNI_DDIGIT, /* U+000c67: TELUGU DIGIT ONE*/
+ RTUNI_DDIGIT, /* U+000c68: TELUGU DIGIT TWO*/
+ RTUNI_DDIGIT, /* U+000c69: TELUGU DIGIT THREE*/
+ RTUNI_DDIGIT, /* U+000c6a: TELUGU DIGIT FOUR*/
+ RTUNI_DDIGIT, /* U+000c6b: TELUGU DIGIT FIVE*/
+ RTUNI_DDIGIT, /* U+000c6c: TELUGU DIGIT SIX*/
+ RTUNI_DDIGIT, /* U+000c6d: TELUGU DIGIT SEVEN*/
+ RTUNI_DDIGIT, /* U+000c6e: TELUGU DIGIT EIGHT*/
+ RTUNI_DDIGIT, /* U+000c6f: TELUGU DIGIT NINE*/
+ 0, /* U+000c70: */
+ 0, /* U+000c71: */
+ 0, /* U+000c72: */
+ 0, /* U+000c73: */
+ 0, /* U+000c74: */
+ 0, /* U+000c75: */
+ 0, /* U+000c76: */
+ 0, /* U+000c77: */
+ 0, /* U+000c78: TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR*/
+ 0, /* U+000c79: TELUGU FRACTION DIGIT ONE FOR ODD POWERS OF FOUR*/
+ 0, /* U+000c7a: TELUGU FRACTION DIGIT TWO FOR ODD POWERS OF FOUR*/
+ 0, /* U+000c7b: TELUGU FRACTION DIGIT THREE FOR ODD POWERS OF FOUR*/
+ 0, /* U+000c7c: TELUGU FRACTION DIGIT ONE FOR EVEN POWERS OF FOUR*/
+ 0, /* U+000c7d: TELUGU FRACTION DIGIT TWO FOR EVEN POWERS OF FOUR*/
+ 0, /* U+000c7e: TELUGU FRACTION DIGIT THREE FOR EVEN POWERS OF FOUR*/
+ 0, /* U+000c7f: TELUGU SIGN TUUMU*/
+ 0, /* U+000c80: */
+ 0, /* U+000c81: */
+ RTUNI_ALPHA, /* U+000c82: KANNADA SIGN ANUSVARA*/
+ RTUNI_ALPHA, /* U+000c83: KANNADA SIGN VISARGA*/
+ 0, /* U+000c84: */
+ RTUNI_ALPHA, /* U+000c85: KANNADA LETTER A*/
+ RTUNI_ALPHA, /* U+000c86: KANNADA LETTER AA*/
+ RTUNI_ALPHA, /* U+000c87: KANNADA LETTER I*/
+ RTUNI_ALPHA, /* U+000c88: KANNADA LETTER II*/
+ RTUNI_ALPHA, /* U+000c89: KANNADA LETTER U*/
+ RTUNI_ALPHA, /* U+000c8a: KANNADA LETTER UU*/
+ RTUNI_ALPHA, /* U+000c8b: KANNADA LETTER VOCALIC R*/
+ RTUNI_ALPHA, /* U+000c8c: KANNADA LETTER VOCALIC L*/
+ 0, /* U+000c8d: */
+ RTUNI_ALPHA, /* U+000c8e: KANNADA LETTER E*/
+ RTUNI_ALPHA, /* U+000c8f: KANNADA LETTER EE*/
+ RTUNI_ALPHA, /* U+000c90: KANNADA LETTER AI*/
+ 0, /* U+000c91: */
+ RTUNI_ALPHA, /* U+000c92: KANNADA LETTER O*/
+ RTUNI_ALPHA, /* U+000c93: KANNADA LETTER OO*/
+ RTUNI_ALPHA, /* U+000c94: KANNADA LETTER AU*/
+ RTUNI_ALPHA, /* U+000c95: KANNADA LETTER KA*/
+ RTUNI_ALPHA, /* U+000c96: KANNADA LETTER KHA*/
+ RTUNI_ALPHA, /* U+000c97: KANNADA LETTER GA*/
+ RTUNI_ALPHA, /* U+000c98: KANNADA LETTER GHA*/
+ RTUNI_ALPHA, /* U+000c99: KANNADA LETTER NGA*/
+ RTUNI_ALPHA, /* U+000c9a: KANNADA LETTER CA*/
+ RTUNI_ALPHA, /* U+000c9b: KANNADA LETTER CHA*/
+ RTUNI_ALPHA, /* U+000c9c: KANNADA LETTER JA*/
+ RTUNI_ALPHA, /* U+000c9d: KANNADA LETTER JHA*/
+ RTUNI_ALPHA, /* U+000c9e: KANNADA LETTER NYA*/
+ RTUNI_ALPHA, /* U+000c9f: KANNADA LETTER TTA*/
+ RTUNI_ALPHA, /* U+000ca0: KANNADA LETTER TTHA*/
+ RTUNI_ALPHA, /* U+000ca1: KANNADA LETTER DDA*/
+ RTUNI_ALPHA, /* U+000ca2: KANNADA LETTER DDHA*/
+ RTUNI_ALPHA, /* U+000ca3: KANNADA LETTER NNA*/
+ RTUNI_ALPHA, /* U+000ca4: KANNADA LETTER TA*/
+ RTUNI_ALPHA, /* U+000ca5: KANNADA LETTER THA*/
+ RTUNI_ALPHA, /* U+000ca6: KANNADA LETTER DA*/
+ RTUNI_ALPHA, /* U+000ca7: KANNADA LETTER DHA*/
+ RTUNI_ALPHA, /* U+000ca8: KANNADA LETTER NA*/
+ 0, /* U+000ca9: */
+ RTUNI_ALPHA, /* U+000caa: KANNADA LETTER PA*/
+ RTUNI_ALPHA, /* U+000cab: KANNADA LETTER PHA*/
+ RTUNI_ALPHA, /* U+000cac: KANNADA LETTER BA*/
+ RTUNI_ALPHA, /* U+000cad: KANNADA LETTER BHA*/
+ RTUNI_ALPHA, /* U+000cae: KANNADA LETTER MA*/
+ RTUNI_ALPHA, /* U+000caf: KANNADA LETTER YA*/
+ RTUNI_ALPHA, /* U+000cb0: KANNADA LETTER RA*/
+ RTUNI_ALPHA, /* U+000cb1: KANNADA LETTER RRA*/
+ RTUNI_ALPHA, /* U+000cb2: KANNADA LETTER LA*/
+ RTUNI_ALPHA, /* U+000cb3: KANNADA LETTER LLA*/
+ 0, /* U+000cb4: */
+ RTUNI_ALPHA, /* U+000cb5: KANNADA LETTER VA*/
+ RTUNI_ALPHA, /* U+000cb6: KANNADA LETTER SHA*/
+ RTUNI_ALPHA, /* U+000cb7: KANNADA LETTER SSA*/
+ RTUNI_ALPHA, /* U+000cb8: KANNADA LETTER SA*/
+ RTUNI_ALPHA, /* U+000cb9: KANNADA LETTER HA*/
+ 0, /* U+000cba: */
+ 0, /* U+000cbb: */
+ 0, /* U+000cbc: KANNADA SIGN NUKTA*/
+ RTUNI_ALPHA, /* U+000cbd: KANNADA SIGN AVAGRAHA*/
+ RTUNI_ALPHA, /* U+000cbe: KANNADA VOWEL SIGN AA*/
+ RTUNI_ALPHA, /* U+000cbf: KANNADA VOWEL SIGN I*/
+ RTUNI_ALPHA, /* U+000cc0: KANNADA VOWEL SIGN II*/
+ RTUNI_ALPHA, /* U+000cc1: KANNADA VOWEL SIGN U*/
+ RTUNI_ALPHA, /* U+000cc2: KANNADA VOWEL SIGN UU*/
+ RTUNI_ALPHA, /* U+000cc3: KANNADA VOWEL SIGN VOCALIC R*/
+ RTUNI_ALPHA, /* U+000cc4: KANNADA VOWEL SIGN VOCALIC RR*/
+ 0, /* U+000cc5: */
+ RTUNI_ALPHA, /* U+000cc6: KANNADA VOWEL SIGN E*/
+ RTUNI_ALPHA, /* U+000cc7: KANNADA VOWEL SIGN EE*/
+ RTUNI_ALPHA, /* U+000cc8: KANNADA VOWEL SIGN AI*/
+ 0, /* U+000cc9: */
+ RTUNI_ALPHA, /* U+000cca: KANNADA VOWEL SIGN O*/
+ RTUNI_ALPHA, /* U+000ccb: KANNADA VOWEL SIGN OO*/
+ RTUNI_ALPHA, /* U+000ccc: KANNADA VOWEL SIGN AU*/
+ 0, /* U+000ccd: KANNADA SIGN VIRAMA*/
+ 0, /* U+000cce: */
+ 0, /* U+000ccf: */
+ 0, /* U+000cd0: */
+ 0, /* U+000cd1: */
+ 0, /* U+000cd2: */
+ 0, /* U+000cd3: */
+ 0, /* U+000cd4: */
+ RTUNI_ALPHA, /* U+000cd5: KANNADA LENGTH MARK*/
+ RTUNI_ALPHA, /* U+000cd6: KANNADA AI LENGTH MARK*/
+ 0, /* U+000cd7: */
+ 0, /* U+000cd8: */
+ 0, /* U+000cd9: */
+ 0, /* U+000cda: */
+ 0, /* U+000cdb: */
+ 0, /* U+000cdc: */
+ 0, /* U+000cdd: */
+ RTUNI_ALPHA, /* U+000cde: KANNADA LETTER FA*/
+ 0, /* U+000cdf: */
+ RTUNI_ALPHA, /* U+000ce0: KANNADA LETTER VOCALIC RR*/
+ RTUNI_ALPHA, /* U+000ce1: KANNADA LETTER VOCALIC LL*/
+ RTUNI_ALPHA, /* U+000ce2: KANNADA VOWEL SIGN VOCALIC L*/
+ RTUNI_ALPHA, /* U+000ce3: KANNADA VOWEL SIGN VOCALIC LL*/
+ 0, /* U+000ce4: */
+ 0, /* U+000ce5: */
+ RTUNI_DDIGIT, /* U+000ce6: KANNADA DIGIT ZERO*/
+ RTUNI_DDIGIT, /* U+000ce7: KANNADA DIGIT ONE*/
+ RTUNI_DDIGIT, /* U+000ce8: KANNADA DIGIT TWO*/
+ RTUNI_DDIGIT, /* U+000ce9: KANNADA DIGIT THREE*/
+ RTUNI_DDIGIT, /* U+000cea: KANNADA DIGIT FOUR*/
+ RTUNI_DDIGIT, /* U+000ceb: KANNADA DIGIT FIVE*/
+ RTUNI_DDIGIT, /* U+000cec: KANNADA DIGIT SIX*/
+ RTUNI_DDIGIT, /* U+000ced: KANNADA DIGIT SEVEN*/
+ RTUNI_DDIGIT, /* U+000cee: KANNADA DIGIT EIGHT*/
+ RTUNI_DDIGIT, /* U+000cef: KANNADA DIGIT NINE*/
+ 0, /* U+000cf0: */
+ RTUNI_ALPHA, /* U+000cf1: KANNADA SIGN JIHVAMULIYA*/
+ RTUNI_ALPHA, /* U+000cf2: KANNADA SIGN UPADHMANIYA*/
+ 0, /* U+000cf3: */
+ 0, /* U+000cf4: */
+ 0, /* U+000cf5: */
+ 0, /* U+000cf6: */
+ 0, /* U+000cf7: */
+ 0, /* U+000cf8: */
+ 0, /* U+000cf9: */
+ 0, /* U+000cfa: */
+ 0, /* U+000cfb: */
+ 0, /* U+000cfc: */
+ 0, /* U+000cfd: */
+ 0, /* U+000cfe: */
+ 0, /* U+000cff: */
+ 0, /* U+000d00: */
+ 0, /* U+000d01: */
+ RTUNI_ALPHA, /* U+000d02: MALAYALAM SIGN ANUSVARA*/
+ RTUNI_ALPHA, /* U+000d03: MALAYALAM SIGN VISARGA*/
+ 0, /* U+000d04: */
+ RTUNI_ALPHA, /* U+000d05: MALAYALAM LETTER A*/
+ RTUNI_ALPHA, /* U+000d06: MALAYALAM LETTER AA*/
+ RTUNI_ALPHA, /* U+000d07: MALAYALAM LETTER I*/
+ RTUNI_ALPHA, /* U+000d08: MALAYALAM LETTER II*/
+ RTUNI_ALPHA, /* U+000d09: MALAYALAM LETTER U*/
+ RTUNI_ALPHA, /* U+000d0a: MALAYALAM LETTER UU*/
+ RTUNI_ALPHA, /* U+000d0b: MALAYALAM LETTER VOCALIC R*/
+ RTUNI_ALPHA, /* U+000d0c: MALAYALAM LETTER VOCALIC L*/
+ 0, /* U+000d0d: */
+ RTUNI_ALPHA, /* U+000d0e: MALAYALAM LETTER E*/
+ RTUNI_ALPHA, /* U+000d0f: MALAYALAM LETTER EE*/
+ RTUNI_ALPHA, /* U+000d10: MALAYALAM LETTER AI*/
+ 0, /* U+000d11: */
+ RTUNI_ALPHA, /* U+000d12: MALAYALAM LETTER O*/
+ RTUNI_ALPHA, /* U+000d13: MALAYALAM LETTER OO*/
+ RTUNI_ALPHA, /* U+000d14: MALAYALAM LETTER AU*/
+ RTUNI_ALPHA, /* U+000d15: MALAYALAM LETTER KA*/
+ RTUNI_ALPHA, /* U+000d16: MALAYALAM LETTER KHA*/
+ RTUNI_ALPHA, /* U+000d17: MALAYALAM LETTER GA*/
+ RTUNI_ALPHA, /* U+000d18: MALAYALAM LETTER GHA*/
+ RTUNI_ALPHA, /* U+000d19: MALAYALAM LETTER NGA*/
+ RTUNI_ALPHA, /* U+000d1a: MALAYALAM LETTER CA*/
+ RTUNI_ALPHA, /* U+000d1b: MALAYALAM LETTER CHA*/
+ RTUNI_ALPHA, /* U+000d1c: MALAYALAM LETTER JA*/
+ RTUNI_ALPHA, /* U+000d1d: MALAYALAM LETTER JHA*/
+ RTUNI_ALPHA, /* U+000d1e: MALAYALAM LETTER NYA*/
+ RTUNI_ALPHA, /* U+000d1f: MALAYALAM LETTER TTA*/
+ RTUNI_ALPHA, /* U+000d20: MALAYALAM LETTER TTHA*/
+ RTUNI_ALPHA, /* U+000d21: MALAYALAM LETTER DDA*/
+ RTUNI_ALPHA, /* U+000d22: MALAYALAM LETTER DDHA*/
+ RTUNI_ALPHA, /* U+000d23: MALAYALAM LETTER NNA*/
+ RTUNI_ALPHA, /* U+000d24: MALAYALAM LETTER TA*/
+ RTUNI_ALPHA, /* U+000d25: MALAYALAM LETTER THA*/
+ RTUNI_ALPHA, /* U+000d26: MALAYALAM LETTER DA*/
+ RTUNI_ALPHA, /* U+000d27: MALAYALAM LETTER DHA*/
+ RTUNI_ALPHA, /* U+000d28: MALAYALAM LETTER NA*/
+ RTUNI_ALPHA, /* U+000d29: MALAYALAM LETTER NNNA*/
+ RTUNI_ALPHA, /* U+000d2a: MALAYALAM LETTER PA*/
+ RTUNI_ALPHA, /* U+000d2b: MALAYALAM LETTER PHA*/
+ RTUNI_ALPHA, /* U+000d2c: MALAYALAM LETTER BA*/
+ RTUNI_ALPHA, /* U+000d2d: MALAYALAM LETTER BHA*/
+ RTUNI_ALPHA, /* U+000d2e: MALAYALAM LETTER MA*/
+ RTUNI_ALPHA, /* U+000d2f: MALAYALAM LETTER YA*/
+ RTUNI_ALPHA, /* U+000d30: MALAYALAM LETTER RA*/
+ RTUNI_ALPHA, /* U+000d31: MALAYALAM LETTER RRA*/
+ RTUNI_ALPHA, /* U+000d32: MALAYALAM LETTER LA*/
+ RTUNI_ALPHA, /* U+000d33: MALAYALAM LETTER LLA*/
+ RTUNI_ALPHA, /* U+000d34: MALAYALAM LETTER LLLA*/
+ RTUNI_ALPHA, /* U+000d35: MALAYALAM LETTER VA*/
+ RTUNI_ALPHA, /* U+000d36: MALAYALAM LETTER SHA*/
+ RTUNI_ALPHA, /* U+000d37: MALAYALAM LETTER SSA*/
+ RTUNI_ALPHA, /* U+000d38: MALAYALAM LETTER SA*/
+ RTUNI_ALPHA, /* U+000d39: MALAYALAM LETTER HA*/
+ RTUNI_ALPHA, /* U+000d3a: MALAYALAM LETTER TTTA*/
+ 0, /* U+000d3b: */
+ 0, /* U+000d3c: */
+ RTUNI_ALPHA, /* U+000d3d: MALAYALAM SIGN AVAGRAHA*/
+ RTUNI_ALPHA, /* U+000d3e: MALAYALAM VOWEL SIGN AA*/
+ RTUNI_ALPHA, /* U+000d3f: MALAYALAM VOWEL SIGN I*/
+ RTUNI_ALPHA, /* U+000d40: MALAYALAM VOWEL SIGN II*/
+ RTUNI_ALPHA, /* U+000d41: MALAYALAM VOWEL SIGN U*/
+ RTUNI_ALPHA, /* U+000d42: MALAYALAM VOWEL SIGN UU*/
+ RTUNI_ALPHA, /* U+000d43: MALAYALAM VOWEL SIGN VOCALIC R*/
+ RTUNI_ALPHA, /* U+000d44: MALAYALAM VOWEL SIGN VOCALIC RR*/
+ 0, /* U+000d45: */
+ RTUNI_ALPHA, /* U+000d46: MALAYALAM VOWEL SIGN E*/
+ RTUNI_ALPHA, /* U+000d47: MALAYALAM VOWEL SIGN EE*/
+ RTUNI_ALPHA, /* U+000d48: MALAYALAM VOWEL SIGN AI*/
+ 0, /* U+000d49: */
+ RTUNI_ALPHA, /* U+000d4a: MALAYALAM VOWEL SIGN O*/
+ RTUNI_ALPHA, /* U+000d4b: MALAYALAM VOWEL SIGN OO*/
+ RTUNI_ALPHA, /* U+000d4c: MALAYALAM VOWEL SIGN AU*/
+ 0, /* U+000d4d: MALAYALAM SIGN VIRAMA*/
+ RTUNI_ALPHA, /* U+000d4e: MALAYALAM LETTER DOT REPH*/
+ 0, /* U+000d4f: */
+ 0, /* U+000d50: */
+ 0, /* U+000d51: */
+ 0, /* U+000d52: */
+ 0, /* U+000d53: */
+ 0, /* U+000d54: */
+ 0, /* U+000d55: */
+ 0, /* U+000d56: */
+ RTUNI_ALPHA, /* U+000d57: MALAYALAM AU LENGTH MARK*/
+ 0, /* U+000d58: */
+ 0, /* U+000d59: */
+ 0, /* U+000d5a: */
+ 0, /* U+000d5b: */
+ 0, /* U+000d5c: */
+ 0, /* U+000d5d: */
+ 0, /* U+000d5e: */
+ 0, /* U+000d5f: */
+ RTUNI_ALPHA, /* U+000d60: MALAYALAM LETTER VOCALIC RR*/
+ RTUNI_ALPHA, /* U+000d61: MALAYALAM LETTER VOCALIC LL*/
+ RTUNI_ALPHA, /* U+000d62: MALAYALAM VOWEL SIGN VOCALIC L*/
+ RTUNI_ALPHA, /* U+000d63: MALAYALAM VOWEL SIGN VOCALIC LL*/
+ 0, /* U+000d64: */
+ 0, /* U+000d65: */
+ RTUNI_DDIGIT, /* U+000d66: MALAYALAM DIGIT ZERO*/
+ RTUNI_DDIGIT, /* U+000d67: MALAYALAM DIGIT ONE*/
+ RTUNI_DDIGIT, /* U+000d68: MALAYALAM DIGIT TWO*/
+ RTUNI_DDIGIT, /* U+000d69: MALAYALAM DIGIT THREE*/
+ RTUNI_DDIGIT, /* U+000d6a: MALAYALAM DIGIT FOUR*/
+ RTUNI_DDIGIT, /* U+000d6b: MALAYALAM DIGIT FIVE*/
+ RTUNI_DDIGIT, /* U+000d6c: MALAYALAM DIGIT SIX*/
+ RTUNI_DDIGIT, /* U+000d6d: MALAYALAM DIGIT SEVEN*/
+ RTUNI_DDIGIT, /* U+000d6e: MALAYALAM DIGIT EIGHT*/
+ RTUNI_DDIGIT, /* U+000d6f: MALAYALAM DIGIT NINE*/
+ 0, /* U+000d70: MALAYALAM NUMBER TEN*/
+ 0, /* U+000d71: MALAYALAM NUMBER ONE HUNDRED*/
+ 0, /* U+000d72: MALAYALAM NUMBER ONE THOUSAND*/
+ 0, /* U+000d73: MALAYALAM FRACTION ONE QUARTER*/
+ 0, /* U+000d74: MALAYALAM FRACTION ONE HALF*/
+ 0, /* U+000d75: MALAYALAM FRACTION THREE QUARTERS*/
+ 0, /* U+000d76: */
+ 0, /* U+000d77: */
+ 0, /* U+000d78: */
+ 0, /* U+000d79: MALAYALAM DATE MARK*/
+ RTUNI_ALPHA, /* U+000d7a: MALAYALAM LETTER CHILLU NN*/
+ RTUNI_ALPHA, /* U+000d7b: MALAYALAM LETTER CHILLU N*/
+ RTUNI_ALPHA, /* U+000d7c: MALAYALAM LETTER CHILLU RR*/
+ RTUNI_ALPHA, /* U+000d7d: MALAYALAM LETTER CHILLU L*/
+ RTUNI_ALPHA, /* U+000d7e: MALAYALAM LETTER CHILLU LL*/
+ RTUNI_ALPHA, /* U+000d7f: MALAYALAM LETTER CHILLU K*/
+ 0, /* U+000d80: */
+ 0, /* U+000d81: */
+ RTUNI_ALPHA, /* U+000d82: SINHALA SIGN ANUSVARAYA*/
+ RTUNI_ALPHA, /* U+000d83: SINHALA SIGN VISARGAYA*/
+ 0, /* U+000d84: */
+ RTUNI_ALPHA, /* U+000d85: SINHALA LETTER AYANNA*/
+ RTUNI_ALPHA, /* U+000d86: SINHALA LETTER AAYANNA*/
+ RTUNI_ALPHA, /* U+000d87: SINHALA LETTER AEYANNA*/
+ RTUNI_ALPHA, /* U+000d88: SINHALA LETTER AEEYANNA*/
+ RTUNI_ALPHA, /* U+000d89: SINHALA LETTER IYANNA*/
+ RTUNI_ALPHA, /* U+000d8a: SINHALA LETTER IIYANNA*/
+ RTUNI_ALPHA, /* U+000d8b: SINHALA LETTER UYANNA*/
+ RTUNI_ALPHA, /* U+000d8c: SINHALA LETTER UUYANNA*/
+ RTUNI_ALPHA, /* U+000d8d: SINHALA LETTER IRUYANNA*/
+ RTUNI_ALPHA, /* U+000d8e: SINHALA LETTER IRUUYANNA*/
+ RTUNI_ALPHA, /* U+000d8f: SINHALA LETTER ILUYANNA*/
+ RTUNI_ALPHA, /* U+000d90: SINHALA LETTER ILUUYANNA*/
+ RTUNI_ALPHA, /* U+000d91: SINHALA LETTER EYANNA*/
+ RTUNI_ALPHA, /* U+000d92: SINHALA LETTER EEYANNA*/
+ RTUNI_ALPHA, /* U+000d93: SINHALA LETTER AIYANNA*/
+ RTUNI_ALPHA, /* U+000d94: SINHALA LETTER OYANNA*/
+ RTUNI_ALPHA, /* U+000d95: SINHALA LETTER OOYANNA*/
+ RTUNI_ALPHA, /* U+000d96: SINHALA LETTER AUYANNA*/
+ 0, /* U+000d97: */
+ 0, /* U+000d98: */
+ 0, /* U+000d99: */
+ RTUNI_ALPHA, /* U+000d9a: SINHALA LETTER ALPAPRAANA KAYANNA*/
+ RTUNI_ALPHA, /* U+000d9b: SINHALA LETTER MAHAAPRAANA KAYANNA*/
+ RTUNI_ALPHA, /* U+000d9c: SINHALA LETTER ALPAPRAANA GAYANNA*/
+ RTUNI_ALPHA, /* U+000d9d: SINHALA LETTER MAHAAPRAANA GAYANNA*/
+ RTUNI_ALPHA, /* U+000d9e: SINHALA LETTER KANTAJA NAASIKYAYA*/
+ RTUNI_ALPHA, /* U+000d9f: SINHALA LETTER SANYAKA GAYANNA*/
+ RTUNI_ALPHA, /* U+000da0: SINHALA LETTER ALPAPRAANA CAYANNA*/
+ RTUNI_ALPHA, /* U+000da1: SINHALA LETTER MAHAAPRAANA CAYANNA*/
+ RTUNI_ALPHA, /* U+000da2: SINHALA LETTER ALPAPRAANA JAYANNA*/
+ RTUNI_ALPHA, /* U+000da3: SINHALA LETTER MAHAAPRAANA JAYANNA*/
+ RTUNI_ALPHA, /* U+000da4: SINHALA LETTER TAALUJA NAASIKYAYA*/
+ RTUNI_ALPHA, /* U+000da5: SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA*/
+ RTUNI_ALPHA, /* U+000da6: SINHALA LETTER SANYAKA JAYANNA*/
+ RTUNI_ALPHA, /* U+000da7: SINHALA LETTER ALPAPRAANA TTAYANNA*/
+ RTUNI_ALPHA, /* U+000da8: SINHALA LETTER MAHAAPRAANA TTAYANNA*/
+ RTUNI_ALPHA, /* U+000da9: SINHALA LETTER ALPAPRAANA DDAYANNA*/
+ RTUNI_ALPHA, /* U+000daa: SINHALA LETTER MAHAAPRAANA DDAYANNA*/
+ RTUNI_ALPHA, /* U+000dab: SINHALA LETTER MUURDHAJA NAYANNA*/
+ RTUNI_ALPHA, /* U+000dac: SINHALA LETTER SANYAKA DDAYANNA*/
+ RTUNI_ALPHA, /* U+000dad: SINHALA LETTER ALPAPRAANA TAYANNA*/
+ RTUNI_ALPHA, /* U+000dae: SINHALA LETTER MAHAAPRAANA TAYANNA*/
+ RTUNI_ALPHA, /* U+000daf: SINHALA LETTER ALPAPRAANA DAYANNA*/
+ RTUNI_ALPHA, /* U+000db0: SINHALA LETTER MAHAAPRAANA DAYANNA*/
+ RTUNI_ALPHA, /* U+000db1: SINHALA LETTER DANTAJA NAYANNA*/
+ 0, /* U+000db2: */
+ RTUNI_ALPHA, /* U+000db3: SINHALA LETTER SANYAKA DAYANNA*/
+ RTUNI_ALPHA, /* U+000db4: SINHALA LETTER ALPAPRAANA PAYANNA*/
+ RTUNI_ALPHA, /* U+000db5: SINHALA LETTER MAHAAPRAANA PAYANNA*/
+ RTUNI_ALPHA, /* U+000db6: SINHALA LETTER ALPAPRAANA BAYANNA*/
+ RTUNI_ALPHA, /* U+000db7: SINHALA LETTER MAHAAPRAANA BAYANNA*/
+ RTUNI_ALPHA, /* U+000db8: SINHALA LETTER MAYANNA*/
+ RTUNI_ALPHA, /* U+000db9: SINHALA LETTER AMBA BAYANNA*/
+ RTUNI_ALPHA, /* U+000dba: SINHALA LETTER YAYANNA*/
+ RTUNI_ALPHA, /* U+000dbb: SINHALA LETTER RAYANNA*/
+ 0, /* U+000dbc: */
+ RTUNI_ALPHA, /* U+000dbd: SINHALA LETTER DANTAJA LAYANNA*/
+ 0, /* U+000dbe: */
+ 0, /* U+000dbf: */
+ RTUNI_ALPHA, /* U+000dc0: SINHALA LETTER VAYANNA*/
+ RTUNI_ALPHA, /* U+000dc1: SINHALA LETTER TAALUJA SAYANNA*/
+ RTUNI_ALPHA, /* U+000dc2: SINHALA LETTER MUURDHAJA SAYANNA*/
+ RTUNI_ALPHA, /* U+000dc3: SINHALA LETTER DANTAJA SAYANNA*/
+ RTUNI_ALPHA, /* U+000dc4: SINHALA LETTER HAYANNA*/
+ RTUNI_ALPHA, /* U+000dc5: SINHALA LETTER MUURDHAJA LAYANNA*/
+ RTUNI_ALPHA, /* U+000dc6: SINHALA LETTER FAYANNA*/
+ 0, /* U+000dc7: */
+ 0, /* U+000dc8: */
+ 0, /* U+000dc9: */
+ 0, /* U+000dca: SINHALA SIGN AL-LAKUNA*/
+ 0, /* U+000dcb: */
+ 0, /* U+000dcc: */
+ 0, /* U+000dcd: */
+ 0, /* U+000dce: */
+ RTUNI_ALPHA, /* U+000dcf: SINHALA VOWEL SIGN AELA-PILLA*/
+ RTUNI_ALPHA, /* U+000dd0: SINHALA VOWEL SIGN KETTI AEDA-PILLA*/
+ RTUNI_ALPHA, /* U+000dd1: SINHALA VOWEL SIGN DIGA AEDA-PILLA*/
+ RTUNI_ALPHA, /* U+000dd2: SINHALA VOWEL SIGN KETTI IS-PILLA*/
+ RTUNI_ALPHA, /* U+000dd3: SINHALA VOWEL SIGN DIGA IS-PILLA*/
+ RTUNI_ALPHA, /* U+000dd4: SINHALA VOWEL SIGN KETTI PAA-PILLA*/
+ 0, /* U+000dd5: */
+ RTUNI_ALPHA, /* U+000dd6: SINHALA VOWEL SIGN DIGA PAA-PILLA*/
+ 0, /* U+000dd7: */
+ RTUNI_ALPHA, /* U+000dd8: SINHALA VOWEL SIGN GAETTA-PILLA*/
+ RTUNI_ALPHA, /* U+000dd9: SINHALA VOWEL SIGN KOMBUVA*/
+ RTUNI_ALPHA, /* U+000dda: SINHALA VOWEL SIGN DIGA KOMBUVA*/
+ RTUNI_ALPHA, /* U+000ddb: SINHALA VOWEL SIGN KOMBU DEKA*/
+ RTUNI_ALPHA, /* U+000ddc: SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA*/
+ RTUNI_ALPHA, /* U+000ddd: SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA*/
+ RTUNI_ALPHA, /* U+000dde: SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA*/
+ RTUNI_ALPHA, /* U+000ddf: SINHALA VOWEL SIGN GAYANUKITTA*/
+ 0, /* U+000de0: */
+ 0, /* U+000de1: */
+ 0, /* U+000de2: */
+ 0, /* U+000de3: */
+ 0, /* U+000de4: */
+ 0, /* U+000de5: */
+ 0, /* U+000de6: */
+ 0, /* U+000de7: */
+ 0, /* U+000de8: */
+ 0, /* U+000de9: */
+ 0, /* U+000dea: */
+ 0, /* U+000deb: */
+ 0, /* U+000dec: */
+ 0, /* U+000ded: */
+ 0, /* U+000dee: */
+ 0, /* U+000def: */
+ 0, /* U+000df0: */
+ 0, /* U+000df1: */
+ RTUNI_ALPHA, /* U+000df2: SINHALA VOWEL SIGN DIGA GAETTA-PILLA*/
+ RTUNI_ALPHA, /* U+000df3: SINHALA VOWEL SIGN DIGA GAYANUKITTA*/
+ 0, /* U+000df4: SINHALA PUNCTUATION KUNDDALIYA*/
+ 0, /* U+000df5: */
+ 0, /* U+000df6: */
+ 0, /* U+000df7: */
+ 0, /* U+000df8: */
+ 0, /* U+000df9: */
+ 0, /* U+000dfa: */
+ 0, /* U+000dfb: */
+ 0, /* U+000dfc: */
+ 0, /* U+000dfd: */
+ 0, /* U+000dfe: */
+ 0, /* U+000dff: */
+ 0, /* U+000e00: */
+ RTUNI_ALPHA, /* U+000e01: THAI CHARACTER KO KAI*/
+ RTUNI_ALPHA, /* U+000e02: THAI CHARACTER KHO KHAI*/
+ RTUNI_ALPHA, /* U+000e03: THAI CHARACTER KHO KHUAT*/
+ RTUNI_ALPHA, /* U+000e04: THAI CHARACTER KHO KHWAI*/
+ RTUNI_ALPHA, /* U+000e05: THAI CHARACTER KHO KHON*/
+ RTUNI_ALPHA, /* U+000e06: THAI CHARACTER KHO RAKHANG*/
+ RTUNI_ALPHA, /* U+000e07: THAI CHARACTER NGO NGU*/
+ RTUNI_ALPHA, /* U+000e08: THAI CHARACTER CHO CHAN*/
+ RTUNI_ALPHA, /* U+000e09: THAI CHARACTER CHO CHING*/
+ RTUNI_ALPHA, /* U+000e0a: THAI CHARACTER CHO CHANG*/
+ RTUNI_ALPHA, /* U+000e0b: THAI CHARACTER SO SO*/
+ RTUNI_ALPHA, /* U+000e0c: THAI CHARACTER CHO CHOE*/
+ RTUNI_ALPHA, /* U+000e0d: THAI CHARACTER YO YING*/
+ RTUNI_ALPHA, /* U+000e0e: THAI CHARACTER DO CHADA*/
+ RTUNI_ALPHA, /* U+000e0f: THAI CHARACTER TO PATAK*/
+ RTUNI_ALPHA, /* U+000e10: THAI CHARACTER THO THAN*/
+ RTUNI_ALPHA, /* U+000e11: THAI CHARACTER THO NANGMONTHO*/
+ RTUNI_ALPHA, /* U+000e12: THAI CHARACTER THO PHUTHAO*/
+ RTUNI_ALPHA, /* U+000e13: THAI CHARACTER NO NEN*/
+ RTUNI_ALPHA, /* U+000e14: THAI CHARACTER DO DEK*/
+ RTUNI_ALPHA, /* U+000e15: THAI CHARACTER TO TAO*/
+ RTUNI_ALPHA, /* U+000e16: THAI CHARACTER THO THUNG*/
+ RTUNI_ALPHA, /* U+000e17: THAI CHARACTER THO THAHAN*/
+ RTUNI_ALPHA, /* U+000e18: THAI CHARACTER THO THONG*/
+ RTUNI_ALPHA, /* U+000e19: THAI CHARACTER NO NU*/
+ RTUNI_ALPHA, /* U+000e1a: THAI CHARACTER BO BAIMAI*/
+ RTUNI_ALPHA, /* U+000e1b: THAI CHARACTER PO PLA*/
+ RTUNI_ALPHA, /* U+000e1c: THAI CHARACTER PHO PHUNG*/
+ RTUNI_ALPHA, /* U+000e1d: THAI CHARACTER FO FA*/
+ RTUNI_ALPHA, /* U+000e1e: THAI CHARACTER PHO PHAN*/
+ RTUNI_ALPHA, /* U+000e1f: THAI CHARACTER FO FAN*/
+ RTUNI_ALPHA, /* U+000e20: THAI CHARACTER PHO SAMPHAO*/
+ RTUNI_ALPHA, /* U+000e21: THAI CHARACTER MO MA*/
+ RTUNI_ALPHA, /* U+000e22: THAI CHARACTER YO YAK*/
+ RTUNI_ALPHA, /* U+000e23: THAI CHARACTER RO RUA*/
+ RTUNI_ALPHA, /* U+000e24: THAI CHARACTER RU*/
+ RTUNI_ALPHA, /* U+000e25: THAI CHARACTER LO LING*/
+ RTUNI_ALPHA, /* U+000e26: THAI CHARACTER LU*/
+ RTUNI_ALPHA, /* U+000e27: THAI CHARACTER WO WAEN*/
+ RTUNI_ALPHA, /* U+000e28: THAI CHARACTER SO SALA*/
+ RTUNI_ALPHA, /* U+000e29: THAI CHARACTER SO RUSI*/
+ RTUNI_ALPHA, /* U+000e2a: THAI CHARACTER SO SUA*/
+ RTUNI_ALPHA, /* U+000e2b: THAI CHARACTER HO HIP*/
+ RTUNI_ALPHA, /* U+000e2c: THAI CHARACTER LO CHULA*/
+ RTUNI_ALPHA, /* U+000e2d: THAI CHARACTER O ANG*/
+ RTUNI_ALPHA, /* U+000e2e: THAI CHARACTER HO NOKHUK*/
+ RTUNI_ALPHA, /* U+000e2f: THAI CHARACTER PAIYANNOI*/
+ RTUNI_ALPHA, /* U+000e30: THAI CHARACTER SARA A*/
+ RTUNI_ALPHA, /* U+000e31: THAI CHARACTER MAI HAN-AKAT*/
+ RTUNI_ALPHA, /* U+000e32: THAI CHARACTER SARA AA*/
+ RTUNI_ALPHA, /* U+000e33: THAI CHARACTER SARA AM*/
+ RTUNI_ALPHA, /* U+000e34: THAI CHARACTER SARA I*/
+ RTUNI_ALPHA, /* U+000e35: THAI CHARACTER SARA II*/
+ RTUNI_ALPHA, /* U+000e36: THAI CHARACTER SARA UE*/
+ RTUNI_ALPHA, /* U+000e37: THAI CHARACTER SARA UEE*/
+ RTUNI_ALPHA, /* U+000e38: THAI CHARACTER SARA U*/
+ RTUNI_ALPHA, /* U+000e39: THAI CHARACTER SARA UU*/
+ RTUNI_ALPHA, /* U+000e3a: THAI CHARACTER PHINTHU*/
+ 0, /* U+000e3b: */
+ 0, /* U+000e3c: */
+ 0, /* U+000e3d: */
+ 0, /* U+000e3e: */
+ 0, /* U+000e3f: THAI CURRENCY SYMBOL BAHT*/
+ RTUNI_ALPHA, /* U+000e40: THAI CHARACTER SARA E*/
+ RTUNI_ALPHA, /* U+000e41: THAI CHARACTER SARA AE*/
+ RTUNI_ALPHA, /* U+000e42: THAI CHARACTER SARA O*/
+ RTUNI_ALPHA, /* U+000e43: THAI CHARACTER SARA AI MAIMUAN*/
+ RTUNI_ALPHA, /* U+000e44: THAI CHARACTER SARA AI MAIMALAI*/
+ RTUNI_ALPHA, /* U+000e45: THAI CHARACTER LAKKHANGYAO*/
+ RTUNI_ALPHA, /* U+000e46: THAI CHARACTER MAIYAMOK*/
+ 0, /* U+000e47: THAI CHARACTER MAITAIKHU*/
+ 0, /* U+000e48: THAI CHARACTER MAI EK*/
+ 0, /* U+000e49: THAI CHARACTER MAI THO*/
+ 0, /* U+000e4a: THAI CHARACTER MAI TRI*/
+ 0, /* U+000e4b: THAI CHARACTER MAI CHATTAWA*/
+ 0, /* U+000e4c: THAI CHARACTER THANTHAKHAT*/
+ RTUNI_ALPHA, /* U+000e4d: THAI CHARACTER NIKHAHIT*/
+ 0, /* U+000e4e: THAI CHARACTER YAMAKKAN*/
+ 0, /* U+000e4f: THAI CHARACTER FONGMAN*/
+ RTUNI_DDIGIT, /* U+000e50: THAI DIGIT ZERO*/
+ RTUNI_DDIGIT, /* U+000e51: THAI DIGIT ONE*/
+ RTUNI_DDIGIT, /* U+000e52: THAI DIGIT TWO*/
+ RTUNI_DDIGIT, /* U+000e53: THAI DIGIT THREE*/
+ RTUNI_DDIGIT, /* U+000e54: THAI DIGIT FOUR*/
+ RTUNI_DDIGIT, /* U+000e55: THAI DIGIT FIVE*/
+ RTUNI_DDIGIT, /* U+000e56: THAI DIGIT SIX*/
+ RTUNI_DDIGIT, /* U+000e57: THAI DIGIT SEVEN*/
+ RTUNI_DDIGIT, /* U+000e58: THAI DIGIT EIGHT*/
+ RTUNI_DDIGIT, /* U+000e59: THAI DIGIT NINE*/
+ 0, /* U+000e5a: THAI CHARACTER ANGKHANKHU*/
+ 0, /* U+000e5b: THAI CHARACTER KHOMUT*/
+ 0, /* U+000e5c: */
+ 0, /* U+000e5d: */
+ 0, /* U+000e5e: */
+ 0, /* U+000e5f: */
+ 0, /* U+000e60: */
+ 0, /* U+000e61: */
+ 0, /* U+000e62: */
+ 0, /* U+000e63: */
+ 0, /* U+000e64: */
+ 0, /* U+000e65: */
+ 0, /* U+000e66: */
+ 0, /* U+000e67: */
+ 0, /* U+000e68: */
+ 0, /* U+000e69: */
+ 0, /* U+000e6a: */
+ 0, /* U+000e6b: */
+ 0, /* U+000e6c: */
+ 0, /* U+000e6d: */
+ 0, /* U+000e6e: */
+ 0, /* U+000e6f: */
+ 0, /* U+000e70: */
+ 0, /* U+000e71: */
+ 0, /* U+000e72: */
+ 0, /* U+000e73: */
+ 0, /* U+000e74: */
+ 0, /* U+000e75: */
+ 0, /* U+000e76: */
+ 0, /* U+000e77: */
+ 0, /* U+000e78: */
+ 0, /* U+000e79: */
+ 0, /* U+000e7a: */
+ 0, /* U+000e7b: */
+ 0, /* U+000e7c: */
+ 0, /* U+000e7d: */
+ 0, /* U+000e7e: */
+ 0, /* U+000e7f: */
+ 0, /* U+000e80: */
+ RTUNI_ALPHA, /* U+000e81: LAO LETTER KO*/
+ RTUNI_ALPHA, /* U+000e82: LAO LETTER KHO SUNG*/
+ 0, /* U+000e83: */
+ RTUNI_ALPHA, /* U+000e84: LAO LETTER KHO TAM*/
+ 0, /* U+000e85: */
+ 0, /* U+000e86: */
+ RTUNI_ALPHA, /* U+000e87: LAO LETTER NGO*/
+ RTUNI_ALPHA, /* U+000e88: LAO LETTER CO*/
+ 0, /* U+000e89: */
+ RTUNI_ALPHA, /* U+000e8a: LAO LETTER SO TAM*/
+ 0, /* U+000e8b: */
+ 0, /* U+000e8c: */
+ RTUNI_ALPHA, /* U+000e8d: LAO LETTER NYO*/
+ 0, /* U+000e8e: */
+ 0, /* U+000e8f: */
+ 0, /* U+000e90: */
+ 0, /* U+000e91: */
+ 0, /* U+000e92: */
+ 0, /* U+000e93: */
+ RTUNI_ALPHA, /* U+000e94: LAO LETTER DO*/
+ RTUNI_ALPHA, /* U+000e95: LAO LETTER TO*/
+ RTUNI_ALPHA, /* U+000e96: LAO LETTER THO SUNG*/
+ RTUNI_ALPHA, /* U+000e97: LAO LETTER THO TAM*/
+ 0, /* U+000e98: */
+ RTUNI_ALPHA, /* U+000e99: LAO LETTER NO*/
+ RTUNI_ALPHA, /* U+000e9a: LAO LETTER BO*/
+ RTUNI_ALPHA, /* U+000e9b: LAO LETTER PO*/
+ RTUNI_ALPHA, /* U+000e9c: LAO LETTER PHO SUNG*/
+ RTUNI_ALPHA, /* U+000e9d: LAO LETTER FO TAM*/
+ RTUNI_ALPHA, /* U+000e9e: LAO LETTER PHO TAM*/
+ RTUNI_ALPHA, /* U+000e9f: LAO LETTER FO SUNG*/
+ 0, /* U+000ea0: */
+ RTUNI_ALPHA, /* U+000ea1: LAO LETTER MO*/
+ RTUNI_ALPHA, /* U+000ea2: LAO LETTER YO*/
+ RTUNI_ALPHA, /* U+000ea3: LAO LETTER LO LING*/
+ 0, /* U+000ea4: */
+ RTUNI_ALPHA, /* U+000ea5: LAO LETTER LO LOOT*/
+ 0, /* U+000ea6: */
+ RTUNI_ALPHA, /* U+000ea7: LAO LETTER WO*/
+ 0, /* U+000ea8: */
+ 0, /* U+000ea9: */
+ RTUNI_ALPHA, /* U+000eaa: LAO LETTER SO SUNG*/
+ RTUNI_ALPHA, /* U+000eab: LAO LETTER HO SUNG*/
+ 0, /* U+000eac: */
+ RTUNI_ALPHA, /* U+000ead: LAO LETTER O*/
+ RTUNI_ALPHA, /* U+000eae: LAO LETTER HO TAM*/
+ RTUNI_ALPHA, /* U+000eaf: LAO ELLIPSIS*/
+ RTUNI_ALPHA, /* U+000eb0: LAO VOWEL SIGN A*/
+ RTUNI_ALPHA, /* U+000eb1: LAO VOWEL SIGN MAI KAN*/
+ RTUNI_ALPHA, /* U+000eb2: LAO VOWEL SIGN AA*/
+ RTUNI_ALPHA, /* U+000eb3: LAO VOWEL SIGN AM*/
+ RTUNI_ALPHA, /* U+000eb4: LAO VOWEL SIGN I*/
+ RTUNI_ALPHA, /* U+000eb5: LAO VOWEL SIGN II*/
+ RTUNI_ALPHA, /* U+000eb6: LAO VOWEL SIGN Y*/
+ RTUNI_ALPHA, /* U+000eb7: LAO VOWEL SIGN YY*/
+ RTUNI_ALPHA, /* U+000eb8: LAO VOWEL SIGN U*/
+ RTUNI_ALPHA, /* U+000eb9: LAO VOWEL SIGN UU*/
+ 0, /* U+000eba: */
+ RTUNI_ALPHA, /* U+000ebb: LAO VOWEL SIGN MAI KON*/
+ RTUNI_ALPHA, /* U+000ebc: LAO SEMIVOWEL SIGN LO*/
+ RTUNI_ALPHA, /* U+000ebd: LAO SEMIVOWEL SIGN NYO*/
+ 0, /* U+000ebe: */
+ 0, /* U+000ebf: */
+ RTUNI_ALPHA, /* U+000ec0: LAO VOWEL SIGN E*/
+ RTUNI_ALPHA, /* U+000ec1: LAO VOWEL SIGN EI*/
+ RTUNI_ALPHA, /* U+000ec2: LAO VOWEL SIGN O*/
+ RTUNI_ALPHA, /* U+000ec3: LAO VOWEL SIGN AY*/
+ RTUNI_ALPHA, /* U+000ec4: LAO VOWEL SIGN AI*/
+ 0, /* U+000ec5: */
+ RTUNI_ALPHA, /* U+000ec6: LAO KO LA*/
+ 0, /* U+000ec7: */
+ 0, /* U+000ec8: LAO TONE MAI EK*/
+ 0, /* U+000ec9: LAO TONE MAI THO*/
+ 0, /* U+000eca: LAO TONE MAI TI*/
+ 0, /* U+000ecb: LAO TONE MAI CATAWA*/
+ 0, /* U+000ecc: LAO CANCELLATION MARK*/
+ RTUNI_ALPHA, /* U+000ecd: LAO NIGGAHITA*/
+ 0, /* U+000ece: */
+ 0, /* U+000ecf: */
+ RTUNI_DDIGIT, /* U+000ed0: LAO DIGIT ZERO*/
+ RTUNI_DDIGIT, /* U+000ed1: LAO DIGIT ONE*/
+ RTUNI_DDIGIT, /* U+000ed2: LAO DIGIT TWO*/
+ RTUNI_DDIGIT, /* U+000ed3: LAO DIGIT THREE*/
+ RTUNI_DDIGIT, /* U+000ed4: LAO DIGIT FOUR*/
+ RTUNI_DDIGIT, /* U+000ed5: LAO DIGIT FIVE*/
+ RTUNI_DDIGIT, /* U+000ed6: LAO DIGIT SIX*/
+ RTUNI_DDIGIT, /* U+000ed7: LAO DIGIT SEVEN*/
+ RTUNI_DDIGIT, /* U+000ed8: LAO DIGIT EIGHT*/
+ RTUNI_DDIGIT, /* U+000ed9: LAO DIGIT NINE*/
+ 0, /* U+000eda: */
+ 0, /* U+000edb: */
+ RTUNI_ALPHA, /* U+000edc: LAO HO NO*/
+ RTUNI_ALPHA, /* U+000edd: LAO HO MO*/
+ RTUNI_ALPHA, /* U+000ede: LAO LETTER KHMU GO*/
+ RTUNI_ALPHA, /* U+000edf: LAO LETTER KHMU NYO*/
+ 0, /* U+000ee0: */
+ 0, /* U+000ee1: */
+ 0, /* U+000ee2: */
+ 0, /* U+000ee3: */
+ 0, /* U+000ee4: */
+ 0, /* U+000ee5: */
+ 0, /* U+000ee6: */
+ 0, /* U+000ee7: */
+ 0, /* U+000ee8: */
+ 0, /* U+000ee9: */
+ 0, /* U+000eea: */
+ 0, /* U+000eeb: */
+ 0, /* U+000eec: */
+ 0, /* U+000eed: */
+ 0, /* U+000eee: */
+ 0, /* U+000eef: */
+ 0, /* U+000ef0: */
+ 0, /* U+000ef1: */
+ 0, /* U+000ef2: */
+ 0, /* U+000ef3: */
+ 0, /* U+000ef4: */
+ 0, /* U+000ef5: */
+ 0, /* U+000ef6: */
+ 0, /* U+000ef7: */
+ 0, /* U+000ef8: */
+ 0, /* U+000ef9: */
+ 0, /* U+000efa: */
+ 0, /* U+000efb: */
+ 0, /* U+000efc: */
+ 0, /* U+000efd: */
+ 0, /* U+000efe: */
+ 0, /* U+000eff: */
+ RTUNI_ALPHA, /* U+000f00: TIBETAN SYLLABLE OM*/
+ 0, /* U+000f01: TIBETAN MARK GTER YIG MGO TRUNCATED A*/
+ 0, /* U+000f02: TIBETAN MARK GTER YIG MGO -UM RNAM BCAD MA*/
+ 0, /* U+000f03: TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA*/
+ 0, /* U+000f04: TIBETAN MARK INITIAL YIG MGO MDUN MA*/
+ 0, /* U+000f05: TIBETAN MARK CLOSING YIG MGO SGAB MA*/
+ 0, /* U+000f06: TIBETAN MARK CARET YIG MGO PHUR SHAD MA*/
+ 0, /* U+000f07: TIBETAN MARK YIG MGO TSHEG SHAD MA*/
+ 0, /* U+000f08: TIBETAN MARK SBRUL SHAD*/
+ 0, /* U+000f09: TIBETAN MARK BSKUR YIG MGO*/
+ 0, /* U+000f0a: TIBETAN MARK BKA- SHOG YIG MGO*/
+ 0, /* U+000f0b: TIBETAN MARK INTERSYLLABIC TSHEG*/
+ 0, /* U+000f0c: TIBETAN MARK DELIMITER TSHEG BSTAR*/
+ 0, /* U+000f0d: TIBETAN MARK SHAD*/
+ 0, /* U+000f0e: TIBETAN MARK NYIS SHAD*/
+ 0, /* U+000f0f: TIBETAN MARK TSHEG SHAD*/
+ 0, /* U+000f10: TIBETAN MARK NYIS TSHEG SHAD*/
+ 0, /* U+000f11: TIBETAN MARK RIN CHEN SPUNGS SHAD*/
+ 0, /* U+000f12: TIBETAN MARK RGYA GRAM SHAD*/
+ 0, /* U+000f13: TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN*/
+ 0, /* U+000f14: TIBETAN MARK GTER TSHEG*/
+ 0, /* U+000f15: TIBETAN LOGOTYPE SIGN CHAD RTAGS*/
+ 0, /* U+000f16: TIBETAN LOGOTYPE SIGN LHAG RTAGS*/
+ 0, /* U+000f17: TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS*/
+ 0, /* U+000f18: TIBETAN ASTROLOGICAL SIGN -KHYUD PA*/
+ 0, /* U+000f19: TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS*/
+ 0, /* U+000f1a: TIBETAN SIGN RDEL DKAR GCIG*/
+ 0, /* U+000f1b: TIBETAN SIGN RDEL DKAR GNYIS*/
+ 0, /* U+000f1c: TIBETAN SIGN RDEL DKAR GSUM*/
+ 0, /* U+000f1d: TIBETAN SIGN RDEL NAG GCIG*/
+ 0, /* U+000f1e: TIBETAN SIGN RDEL NAG GNYIS*/
+ 0, /* U+000f1f: TIBETAN SIGN RDEL DKAR RDEL NAG*/
+ RTUNI_DDIGIT, /* U+000f20: TIBETAN DIGIT ZERO*/
+ RTUNI_DDIGIT, /* U+000f21: TIBETAN DIGIT ONE*/
+ RTUNI_DDIGIT, /* U+000f22: TIBETAN DIGIT TWO*/
+ RTUNI_DDIGIT, /* U+000f23: TIBETAN DIGIT THREE*/
+ RTUNI_DDIGIT, /* U+000f24: TIBETAN DIGIT FOUR*/
+ RTUNI_DDIGIT, /* U+000f25: TIBETAN DIGIT FIVE*/
+ RTUNI_DDIGIT, /* U+000f26: TIBETAN DIGIT SIX*/
+ RTUNI_DDIGIT, /* U+000f27: TIBETAN DIGIT SEVEN*/
+ RTUNI_DDIGIT, /* U+000f28: TIBETAN DIGIT EIGHT*/
+ RTUNI_DDIGIT, /* U+000f29: TIBETAN DIGIT NINE*/
+ 0, /* U+000f2a: TIBETAN DIGIT HALF ONE*/
+ 0, /* U+000f2b: TIBETAN DIGIT HALF TWO*/
+ 0, /* U+000f2c: TIBETAN DIGIT HALF THREE*/
+ 0, /* U+000f2d: TIBETAN DIGIT HALF FOUR*/
+ 0, /* U+000f2e: TIBETAN DIGIT HALF FIVE*/
+ 0, /* U+000f2f: TIBETAN DIGIT HALF SIX*/
+ 0, /* U+000f30: TIBETAN DIGIT HALF SEVEN*/
+ 0, /* U+000f31: TIBETAN DIGIT HALF EIGHT*/
+ 0, /* U+000f32: TIBETAN DIGIT HALF NINE*/
+ 0, /* U+000f33: TIBETAN DIGIT HALF ZERO*/
+ 0, /* U+000f34: TIBETAN MARK BSDUS RTAGS*/
+ 0, /* U+000f35: TIBETAN MARK NGAS BZUNG NYI ZLA*/
+ 0, /* U+000f36: TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN*/
+ 0, /* U+000f37: TIBETAN MARK NGAS BZUNG SGOR RTAGS*/
+ 0, /* U+000f38: TIBETAN MARK CHE MGO*/
+ 0, /* U+000f39: TIBETAN MARK TSA -PHRU*/
+ 0, /* U+000f3a: TIBETAN MARK GUG RTAGS GYON*/
+ 0, /* U+000f3b: TIBETAN MARK GUG RTAGS GYAS*/
+ 0, /* U+000f3c: TIBETAN MARK ANG KHANG GYON*/
+ 0, /* U+000f3d: TIBETAN MARK ANG KHANG GYAS*/
+ 0, /* U+000f3e: TIBETAN SIGN YAR TSHES*/
+ 0, /* U+000f3f: TIBETAN SIGN MAR TSHES*/
+ RTUNI_ALPHA, /* U+000f40: TIBETAN LETTER KA*/
+ RTUNI_ALPHA, /* U+000f41: TIBETAN LETTER KHA*/
+ RTUNI_ALPHA, /* U+000f42: TIBETAN LETTER GA*/
+ RTUNI_ALPHA, /* U+000f43: TIBETAN LETTER GHA*/
+ RTUNI_ALPHA, /* U+000f44: TIBETAN LETTER NGA*/
+ RTUNI_ALPHA, /* U+000f45: TIBETAN LETTER CA*/
+ RTUNI_ALPHA, /* U+000f46: TIBETAN LETTER CHA*/
+ RTUNI_ALPHA, /* U+000f47: TIBETAN LETTER JA*/
+ 0, /* U+000f48: */
+ RTUNI_ALPHA, /* U+000f49: TIBETAN LETTER NYA*/
+ RTUNI_ALPHA, /* U+000f4a: TIBETAN LETTER TTA*/
+ RTUNI_ALPHA, /* U+000f4b: TIBETAN LETTER TTHA*/
+ RTUNI_ALPHA, /* U+000f4c: TIBETAN LETTER DDA*/
+ RTUNI_ALPHA, /* U+000f4d: TIBETAN LETTER DDHA*/
+ RTUNI_ALPHA, /* U+000f4e: TIBETAN LETTER NNA*/
+ RTUNI_ALPHA, /* U+000f4f: TIBETAN LETTER TA*/
+ RTUNI_ALPHA, /* U+000f50: TIBETAN LETTER THA*/
+ RTUNI_ALPHA, /* U+000f51: TIBETAN LETTER DA*/
+ RTUNI_ALPHA, /* U+000f52: TIBETAN LETTER DHA*/
+ RTUNI_ALPHA, /* U+000f53: TIBETAN LETTER NA*/
+ RTUNI_ALPHA, /* U+000f54: TIBETAN LETTER PA*/
+ RTUNI_ALPHA, /* U+000f55: TIBETAN LETTER PHA*/
+ RTUNI_ALPHA, /* U+000f56: TIBETAN LETTER BA*/
+ RTUNI_ALPHA, /* U+000f57: TIBETAN LETTER BHA*/
+ RTUNI_ALPHA, /* U+000f58: TIBETAN LETTER MA*/
+ RTUNI_ALPHA, /* U+000f59: TIBETAN LETTER TSA*/
+ RTUNI_ALPHA, /* U+000f5a: TIBETAN LETTER TSHA*/
+ RTUNI_ALPHA, /* U+000f5b: TIBETAN LETTER DZA*/
+ RTUNI_ALPHA, /* U+000f5c: TIBETAN LETTER DZHA*/
+ RTUNI_ALPHA, /* U+000f5d: TIBETAN LETTER WA*/
+ RTUNI_ALPHA, /* U+000f5e: TIBETAN LETTER ZHA*/
+ RTUNI_ALPHA, /* U+000f5f: TIBETAN LETTER ZA*/
+ RTUNI_ALPHA, /* U+000f60: TIBETAN LETTER -A*/
+ RTUNI_ALPHA, /* U+000f61: TIBETAN LETTER YA*/
+ RTUNI_ALPHA, /* U+000f62: TIBETAN LETTER RA*/
+ RTUNI_ALPHA, /* U+000f63: TIBETAN LETTER LA*/
+ RTUNI_ALPHA, /* U+000f64: TIBETAN LETTER SHA*/
+ RTUNI_ALPHA, /* U+000f65: TIBETAN LETTER SSA*/
+ RTUNI_ALPHA, /* U+000f66: TIBETAN LETTER SA*/
+ RTUNI_ALPHA, /* U+000f67: TIBETAN LETTER HA*/
+ RTUNI_ALPHA, /* U+000f68: TIBETAN LETTER A*/
+ RTUNI_ALPHA, /* U+000f69: TIBETAN LETTER KSSA*/
+ RTUNI_ALPHA, /* U+000f6a: TIBETAN LETTER FIXED-FORM RA*/
+ RTUNI_ALPHA, /* U+000f6b: TIBETAN LETTER KKA*/
+ RTUNI_ALPHA, /* U+000f6c: TIBETAN LETTER RRA*/
+ 0, /* U+000f6d: */
+ 0, /* U+000f6e: */
+ 0, /* U+000f6f: */
+ 0, /* U+000f70: */
+ RTUNI_ALPHA, /* U+000f71: TIBETAN VOWEL SIGN AA*/
+ RTUNI_ALPHA, /* U+000f72: TIBETAN VOWEL SIGN I*/
+ RTUNI_ALPHA, /* U+000f73: TIBETAN VOWEL SIGN II*/
+ RTUNI_ALPHA, /* U+000f74: TIBETAN VOWEL SIGN U*/
+ RTUNI_ALPHA, /* U+000f75: TIBETAN VOWEL SIGN UU*/
+ RTUNI_ALPHA, /* U+000f76: TIBETAN VOWEL SIGN VOCALIC R*/
+ RTUNI_ALPHA, /* U+000f77: TIBETAN VOWEL SIGN VOCALIC RR*/
+ RTUNI_ALPHA, /* U+000f78: TIBETAN VOWEL SIGN VOCALIC L*/
+ RTUNI_ALPHA, /* U+000f79: TIBETAN VOWEL SIGN VOCALIC LL*/
+ RTUNI_ALPHA, /* U+000f7a: TIBETAN VOWEL SIGN E*/
+ RTUNI_ALPHA, /* U+000f7b: TIBETAN VOWEL SIGN EE*/
+ RTUNI_ALPHA, /* U+000f7c: TIBETAN VOWEL SIGN O*/
+ RTUNI_ALPHA, /* U+000f7d: TIBETAN VOWEL SIGN OO*/
+ RTUNI_ALPHA, /* U+000f7e: TIBETAN SIGN RJES SU NGA RO*/
+ RTUNI_ALPHA, /* U+000f7f: TIBETAN SIGN RNAM BCAD*/
+ RTUNI_ALPHA, /* U+000f80: TIBETAN VOWEL SIGN REVERSED I*/
+ RTUNI_ALPHA, /* U+000f81: TIBETAN VOWEL SIGN REVERSED II*/
+ 0, /* U+000f82: TIBETAN SIGN NYI ZLA NAA DA*/
+ 0, /* U+000f83: TIBETAN SIGN SNA LDAN*/
+ 0, /* U+000f84: TIBETAN MARK HALANTA*/
+ 0, /* U+000f85: TIBETAN MARK PALUTA*/
+ 0, /* U+000f86: TIBETAN SIGN LCI RTAGS*/
+ 0, /* U+000f87: TIBETAN SIGN YANG RTAGS*/
+ RTUNI_ALPHA, /* U+000f88: TIBETAN SIGN LCE TSA CAN*/
+ RTUNI_ALPHA, /* U+000f89: TIBETAN SIGN MCHU CAN*/
+ RTUNI_ALPHA, /* U+000f8a: TIBETAN SIGN GRU CAN RGYINGS*/
+ RTUNI_ALPHA, /* U+000f8b: TIBETAN SIGN GRU MED RGYINGS*/
+ RTUNI_ALPHA, /* U+000f8c: TIBETAN SIGN INVERTED MCHU CAN*/
+ RTUNI_ALPHA, /* U+000f8d: TIBETAN SUBJOINED SIGN LCE TSA CAN*/
+ RTUNI_ALPHA, /* U+000f8e: TIBETAN SUBJOINED SIGN MCHU CAN*/
+ RTUNI_ALPHA, /* U+000f8f: TIBETAN SUBJOINED SIGN INVERTED MCHU CAN*/
+ RTUNI_ALPHA, /* U+000f90: TIBETAN SUBJOINED LETTER KA*/
+ RTUNI_ALPHA, /* U+000f91: TIBETAN SUBJOINED LETTER KHA*/
+ RTUNI_ALPHA, /* U+000f92: TIBETAN SUBJOINED LETTER GA*/
+ RTUNI_ALPHA, /* U+000f93: TIBETAN SUBJOINED LETTER GHA*/
+ RTUNI_ALPHA, /* U+000f94: TIBETAN SUBJOINED LETTER NGA*/
+ RTUNI_ALPHA, /* U+000f95: TIBETAN SUBJOINED LETTER CA*/
+ RTUNI_ALPHA, /* U+000f96: TIBETAN SUBJOINED LETTER CHA*/
+ RTUNI_ALPHA, /* U+000f97: TIBETAN SUBJOINED LETTER JA*/
+ 0, /* U+000f98: */
+ RTUNI_ALPHA, /* U+000f99: TIBETAN SUBJOINED LETTER NYA*/
+ RTUNI_ALPHA, /* U+000f9a: TIBETAN SUBJOINED LETTER TTA*/
+ RTUNI_ALPHA, /* U+000f9b: TIBETAN SUBJOINED LETTER TTHA*/
+ RTUNI_ALPHA, /* U+000f9c: TIBETAN SUBJOINED LETTER DDA*/
+ RTUNI_ALPHA, /* U+000f9d: TIBETAN SUBJOINED LETTER DDHA*/
+ RTUNI_ALPHA, /* U+000f9e: TIBETAN SUBJOINED LETTER NNA*/
+ RTUNI_ALPHA, /* U+000f9f: TIBETAN SUBJOINED LETTER TA*/
+ RTUNI_ALPHA, /* U+000fa0: TIBETAN SUBJOINED LETTER THA*/
+ RTUNI_ALPHA, /* U+000fa1: TIBETAN SUBJOINED LETTER DA*/
+ RTUNI_ALPHA, /* U+000fa2: TIBETAN SUBJOINED LETTER DHA*/
+ RTUNI_ALPHA, /* U+000fa3: TIBETAN SUBJOINED LETTER NA*/
+ RTUNI_ALPHA, /* U+000fa4: TIBETAN SUBJOINED LETTER PA*/
+ RTUNI_ALPHA, /* U+000fa5: TIBETAN SUBJOINED LETTER PHA*/
+ RTUNI_ALPHA, /* U+000fa6: TIBETAN SUBJOINED LETTER BA*/
+ RTUNI_ALPHA, /* U+000fa7: TIBETAN SUBJOINED LETTER BHA*/
+ RTUNI_ALPHA, /* U+000fa8: TIBETAN SUBJOINED LETTER MA*/
+ RTUNI_ALPHA, /* U+000fa9: TIBETAN SUBJOINED LETTER TSA*/
+ RTUNI_ALPHA, /* U+000faa: TIBETAN SUBJOINED LETTER TSHA*/
+ RTUNI_ALPHA, /* U+000fab: TIBETAN SUBJOINED LETTER DZA*/
+ RTUNI_ALPHA, /* U+000fac: TIBETAN SUBJOINED LETTER DZHA*/
+ RTUNI_ALPHA, /* U+000fad: TIBETAN SUBJOINED LETTER WA*/
+ RTUNI_ALPHA, /* U+000fae: TIBETAN SUBJOINED LETTER ZHA*/
+ RTUNI_ALPHA, /* U+000faf: TIBETAN SUBJOINED LETTER ZA*/
+ RTUNI_ALPHA, /* U+000fb0: TIBETAN SUBJOINED LETTER -A*/
+ RTUNI_ALPHA, /* U+000fb1: TIBETAN SUBJOINED LETTER YA*/
+ RTUNI_ALPHA, /* U+000fb2: TIBETAN SUBJOINED LETTER RA*/
+ RTUNI_ALPHA, /* U+000fb3: TIBETAN SUBJOINED LETTER LA*/
+ RTUNI_ALPHA, /* U+000fb4: TIBETAN SUBJOINED LETTER SHA*/
+ RTUNI_ALPHA, /* U+000fb5: TIBETAN SUBJOINED LETTER SSA*/
+ RTUNI_ALPHA, /* U+000fb6: TIBETAN SUBJOINED LETTER SA*/
+ RTUNI_ALPHA, /* U+000fb7: TIBETAN SUBJOINED LETTER HA*/
+ RTUNI_ALPHA, /* U+000fb8: TIBETAN SUBJOINED LETTER A*/
+ RTUNI_ALPHA, /* U+000fb9: TIBETAN SUBJOINED LETTER KSSA*/
+ RTUNI_ALPHA, /* U+000fba: TIBETAN SUBJOINED LETTER FIXED-FORM WA*/
+ RTUNI_ALPHA, /* U+000fbb: TIBETAN SUBJOINED LETTER FIXED-FORM YA*/
+ RTUNI_ALPHA, /* U+000fbc: TIBETAN SUBJOINED LETTER FIXED-FORM RA*/
+ 0, /* U+000fbd: */
+ 0, /* U+000fbe: TIBETAN KU RU KHA*/
+ 0, /* U+000fbf: TIBETAN KU RU KHA BZHI MIG CAN*/
+ 0, /* U+000fc0: TIBETAN CANTILLATION SIGN HEAVY BEAT*/
+ 0, /* U+000fc1: TIBETAN CANTILLATION SIGN LIGHT BEAT*/
+ 0, /* U+000fc2: TIBETAN CANTILLATION SIGN CANG TE-U*/
+ 0, /* U+000fc3: TIBETAN CANTILLATION SIGN SBUB -CHAL*/
+ 0, /* U+000fc4: TIBETAN SYMBOL DRIL BU*/
+ 0, /* U+000fc5: TIBETAN SYMBOL RDO RJE*/
+ 0, /* U+000fc6: TIBETAN SYMBOL PADMA GDAN*/
+ 0, /* U+000fc7: TIBETAN SYMBOL RDO RJE RGYA GRAM*/
+ 0, /* U+000fc8: TIBETAN SYMBOL PHUR PA*/
+ 0, /* U+000fc9: TIBETAN SYMBOL NOR BU*/
+ 0, /* U+000fca: TIBETAN SYMBOL NOR BU NYIS -KHYIL*/
+ 0, /* U+000fcb: TIBETAN SYMBOL NOR BU GSUM -KHYIL*/
+ 0, /* U+000fcc: TIBETAN SYMBOL NOR BU BZHI -KHYIL*/
+ 0, /* U+000fcd: */
+ 0, /* U+000fce: TIBETAN SIGN RDEL NAG RDEL DKAR*/
+ 0, /* U+000fcf: TIBETAN SIGN RDEL NAG GSUM*/
+ 0, /* U+000fd0: TIBETAN MARK BSKA- SHOG GI MGO RGYAN*/
+ 0, /* U+000fd1: TIBETAN MARK MNYAM YIG GI MGO RGYAN*/
+ 0, /* U+000fd2: TIBETAN MARK NYIS TSHEG*/
+ 0, /* U+000fd3: TIBETAN MARK INITIAL BRDA RNYING YIG MGO MDUN MA*/
+ 0, /* U+000fd4: TIBETAN MARK CLOSING BRDA RNYING YIG MGO SGAB MA*/
+ 0, /* U+000fd5: RIGHT-FACING SVASTI SIGN*/
+ 0, /* U+000fd6: LEFT-FACING SVASTI SIGN*/
+ 0, /* U+000fd7: RIGHT-FACING SVASTI SIGN WITH DOTS*/
+ 0, /* U+000fd8: LEFT-FACING SVASTI SIGN WITH DOTS*/
+ 0, /* U+000fd9: TIBETAN MARK LEADING MCHAN RTAGS*/
+ 0, /* U+000fda: TIBETAN MARK TRAILING MCHAN RTAGS*/
+ 0, /* U+000fdb: */
+ 0, /* U+000fdc: */
+ 0, /* U+000fdd: */
+ 0, /* U+000fde: */
+ 0, /* U+000fdf: */
+ 0, /* U+000fe0: */
+ 0, /* U+000fe1: */
+ 0, /* U+000fe2: */
+ 0, /* U+000fe3: */
+ 0, /* U+000fe4: */
+ 0, /* U+000fe5: */
+ 0, /* U+000fe6: */
+ 0, /* U+000fe7: */
+ 0, /* U+000fe8: */
+ 0, /* U+000fe9: */
+ 0, /* U+000fea: */
+ 0, /* U+000feb: */
+ 0, /* U+000fec: */
+ 0, /* U+000fed: */
+ 0, /* U+000fee: */
+ 0, /* U+000fef: */
+ 0, /* U+000ff0: */
+ 0, /* U+000ff1: */
+ 0, /* U+000ff2: */
+ 0, /* U+000ff3: */
+ 0, /* U+000ff4: */
+ 0, /* U+000ff5: */
+ 0, /* U+000ff6: */
+ 0, /* U+000ff7: */
+ 0, /* U+000ff8: */
+ 0, /* U+000ff9: */
+ 0, /* U+000ffa: */
+ 0, /* U+000ffb: */
+ 0, /* U+000ffc: */
+ 0, /* U+000ffd: */
+ 0, /* U+000ffe: */
+ 0, /* U+000fff: */
+ RTUNI_ALPHA, /* U+001000: MYANMAR LETTER KA*/
+ RTUNI_ALPHA, /* U+001001: MYANMAR LETTER KHA*/
+ RTUNI_ALPHA, /* U+001002: MYANMAR LETTER GA*/
+ RTUNI_ALPHA, /* U+001003: MYANMAR LETTER GHA*/
+ RTUNI_ALPHA, /* U+001004: MYANMAR LETTER NGA*/
+ RTUNI_ALPHA, /* U+001005: MYANMAR LETTER CA*/
+ RTUNI_ALPHA, /* U+001006: MYANMAR LETTER CHA*/
+ RTUNI_ALPHA, /* U+001007: MYANMAR LETTER JA*/
+ RTUNI_ALPHA, /* U+001008: MYANMAR LETTER JHA*/
+ RTUNI_ALPHA, /* U+001009: MYANMAR LETTER NYA*/
+ RTUNI_ALPHA, /* U+00100a: MYANMAR LETTER NNYA*/
+ RTUNI_ALPHA, /* U+00100b: MYANMAR LETTER TTA*/
+ RTUNI_ALPHA, /* U+00100c: MYANMAR LETTER TTHA*/
+ RTUNI_ALPHA, /* U+00100d: MYANMAR LETTER DDA*/
+ RTUNI_ALPHA, /* U+00100e: MYANMAR LETTER DDHA*/
+ RTUNI_ALPHA, /* U+00100f: MYANMAR LETTER NNA*/
+ RTUNI_ALPHA, /* U+001010: MYANMAR LETTER TA*/
+ RTUNI_ALPHA, /* U+001011: MYANMAR LETTER THA*/
+ RTUNI_ALPHA, /* U+001012: MYANMAR LETTER DA*/
+ RTUNI_ALPHA, /* U+001013: MYANMAR LETTER DHA*/
+ RTUNI_ALPHA, /* U+001014: MYANMAR LETTER NA*/
+ RTUNI_ALPHA, /* U+001015: MYANMAR LETTER PA*/
+ RTUNI_ALPHA, /* U+001016: MYANMAR LETTER PHA*/
+ RTUNI_ALPHA, /* U+001017: MYANMAR LETTER BA*/
+ RTUNI_ALPHA, /* U+001018: MYANMAR LETTER BHA*/
+ RTUNI_ALPHA, /* U+001019: MYANMAR LETTER MA*/
+ RTUNI_ALPHA, /* U+00101a: MYANMAR LETTER YA*/
+ RTUNI_ALPHA, /* U+00101b: MYANMAR LETTER RA*/
+ RTUNI_ALPHA, /* U+00101c: MYANMAR LETTER LA*/
+ RTUNI_ALPHA, /* U+00101d: MYANMAR LETTER WA*/
+ RTUNI_ALPHA, /* U+00101e: MYANMAR LETTER SA*/
+ RTUNI_ALPHA, /* U+00101f: MYANMAR LETTER HA*/
+ RTUNI_ALPHA, /* U+001020: MYANMAR LETTER LLA*/
+ RTUNI_ALPHA, /* U+001021: MYANMAR LETTER A*/
+ RTUNI_ALPHA, /* U+001022: MYANMAR LETTER SHAN A*/
+ RTUNI_ALPHA, /* U+001023: MYANMAR LETTER I*/
+ RTUNI_ALPHA, /* U+001024: MYANMAR LETTER II*/
+ RTUNI_ALPHA, /* U+001025: MYANMAR LETTER U*/
+ RTUNI_ALPHA, /* U+001026: MYANMAR LETTER UU*/
+ RTUNI_ALPHA, /* U+001027: MYANMAR LETTER E*/
+ RTUNI_ALPHA, /* U+001028: MYANMAR LETTER MON E*/
+ RTUNI_ALPHA, /* U+001029: MYANMAR LETTER O*/
+ RTUNI_ALPHA, /* U+00102a: MYANMAR LETTER AU*/
+ RTUNI_ALPHA, /* U+00102b: MYANMAR VOWEL SIGN TALL AA*/
+ RTUNI_ALPHA, /* U+00102c: MYANMAR VOWEL SIGN AA*/
+ RTUNI_ALPHA, /* U+00102d: MYANMAR VOWEL SIGN I*/
+ RTUNI_ALPHA, /* U+00102e: MYANMAR VOWEL SIGN II*/
+ RTUNI_ALPHA, /* U+00102f: MYANMAR VOWEL SIGN U*/
+ RTUNI_ALPHA, /* U+001030: MYANMAR VOWEL SIGN UU*/
+ RTUNI_ALPHA, /* U+001031: MYANMAR VOWEL SIGN E*/
+ RTUNI_ALPHA, /* U+001032: MYANMAR VOWEL SIGN AI*/
+ RTUNI_ALPHA, /* U+001033: MYANMAR VOWEL SIGN MON II*/
+ RTUNI_ALPHA, /* U+001034: MYANMAR VOWEL SIGN MON O*/
+ RTUNI_ALPHA, /* U+001035: MYANMAR VOWEL SIGN E ABOVE*/
+ RTUNI_ALPHA, /* U+001036: MYANMAR SIGN ANUSVARA*/
+ 0, /* U+001037: MYANMAR SIGN DOT BELOW*/
+ RTUNI_ALPHA, /* U+001038: MYANMAR SIGN VISARGA*/
+ 0, /* U+001039: MYANMAR SIGN VIRAMA*/
+ 0, /* U+00103a: MYANMAR SIGN ASAT*/
+ RTUNI_ALPHA, /* U+00103b: MYANMAR CONSONANT SIGN MEDIAL YA*/
+ RTUNI_ALPHA, /* U+00103c: MYANMAR CONSONANT SIGN MEDIAL RA*/
+ RTUNI_ALPHA, /* U+00103d: MYANMAR CONSONANT SIGN MEDIAL WA*/
+ RTUNI_ALPHA, /* U+00103e: MYANMAR CONSONANT SIGN MEDIAL HA*/
+ RTUNI_ALPHA, /* U+00103f: MYANMAR LETTER GREAT SA*/
+ RTUNI_DDIGIT, /* U+001040: MYANMAR DIGIT ZERO*/
+ RTUNI_DDIGIT, /* U+001041: MYANMAR DIGIT ONE*/
+ RTUNI_DDIGIT, /* U+001042: MYANMAR DIGIT TWO*/
+ RTUNI_DDIGIT, /* U+001043: MYANMAR DIGIT THREE*/
+ RTUNI_DDIGIT, /* U+001044: MYANMAR DIGIT FOUR*/
+ RTUNI_DDIGIT, /* U+001045: MYANMAR DIGIT FIVE*/
+ RTUNI_DDIGIT, /* U+001046: MYANMAR DIGIT SIX*/
+ RTUNI_DDIGIT, /* U+001047: MYANMAR DIGIT SEVEN*/
+ RTUNI_DDIGIT, /* U+001048: MYANMAR DIGIT EIGHT*/
+ RTUNI_DDIGIT, /* U+001049: MYANMAR DIGIT NINE*/
+ 0, /* U+00104a: MYANMAR SIGN LITTLE SECTION*/
+ 0, /* U+00104b: MYANMAR SIGN SECTION*/
+ 0, /* U+00104c: MYANMAR SYMBOL LOCATIVE*/
+ 0, /* U+00104d: MYANMAR SYMBOL COMPLETED*/
+ 0, /* U+00104e: MYANMAR SYMBOL AFOREMENTIONED*/
+ 0, /* U+00104f: MYANMAR SYMBOL GENITIVE*/
+ RTUNI_ALPHA, /* U+001050: MYANMAR LETTER SHA*/
+ RTUNI_ALPHA, /* U+001051: MYANMAR LETTER SSA*/
+ RTUNI_ALPHA, /* U+001052: MYANMAR LETTER VOCALIC R*/
+ RTUNI_ALPHA, /* U+001053: MYANMAR LETTER VOCALIC RR*/
+ RTUNI_ALPHA, /* U+001054: MYANMAR LETTER VOCALIC L*/
+ RTUNI_ALPHA, /* U+001055: MYANMAR LETTER VOCALIC LL*/
+ RTUNI_ALPHA, /* U+001056: MYANMAR VOWEL SIGN VOCALIC R*/
+ RTUNI_ALPHA, /* U+001057: MYANMAR VOWEL SIGN VOCALIC RR*/
+ RTUNI_ALPHA, /* U+001058: MYANMAR VOWEL SIGN VOCALIC L*/
+ RTUNI_ALPHA, /* U+001059: MYANMAR VOWEL SIGN VOCALIC LL*/
+ RTUNI_ALPHA, /* U+00105a: MYANMAR LETTER MON NGA*/
+ RTUNI_ALPHA, /* U+00105b: MYANMAR LETTER MON JHA*/
+ RTUNI_ALPHA, /* U+00105c: MYANMAR LETTER MON BBA*/
+ RTUNI_ALPHA, /* U+00105d: MYANMAR LETTER MON BBE*/
+ RTUNI_ALPHA, /* U+00105e: MYANMAR CONSONANT SIGN MON MEDIAL NA*/
+ RTUNI_ALPHA, /* U+00105f: MYANMAR CONSONANT SIGN MON MEDIAL MA*/
+ RTUNI_ALPHA, /* U+001060: MYANMAR CONSONANT SIGN MON MEDIAL LA*/
+ RTUNI_ALPHA, /* U+001061: MYANMAR LETTER SGAW KAREN SHA*/
+ RTUNI_ALPHA, /* U+001062: MYANMAR VOWEL SIGN SGAW KAREN EU*/
+ 0, /* U+001063: MYANMAR TONE MARK SGAW KAREN HATHI*/
+ 0, /* U+001064: MYANMAR TONE MARK SGAW KAREN KE PHO*/
+ RTUNI_ALPHA, /* U+001065: MYANMAR LETTER WESTERN PWO KAREN THA*/
+ RTUNI_ALPHA, /* U+001066: MYANMAR LETTER WESTERN PWO KAREN PWA*/
+ RTUNI_ALPHA, /* U+001067: MYANMAR VOWEL SIGN WESTERN PWO KAREN EU*/
+ RTUNI_ALPHA, /* U+001068: MYANMAR VOWEL SIGN WESTERN PWO KAREN UE*/
+ 0, /* U+001069: MYANMAR SIGN WESTERN PWO KAREN TONE-1*/
+ 0, /* U+00106a: MYANMAR SIGN WESTERN PWO KAREN TONE-2*/
+ 0, /* U+00106b: MYANMAR SIGN WESTERN PWO KAREN TONE-3*/
+ 0, /* U+00106c: MYANMAR SIGN WESTERN PWO KAREN TONE-4*/
+ 0, /* U+00106d: MYANMAR SIGN WESTERN PWO KAREN TONE-5*/
+ RTUNI_ALPHA, /* U+00106e: MYANMAR LETTER EASTERN PWO KAREN NNA*/
+ RTUNI_ALPHA, /* U+00106f: MYANMAR LETTER EASTERN PWO KAREN YWA*/
+ RTUNI_ALPHA, /* U+001070: MYANMAR LETTER EASTERN PWO KAREN GHWA*/
+ RTUNI_ALPHA, /* U+001071: MYANMAR VOWEL SIGN GEBA KAREN I*/
+ RTUNI_ALPHA, /* U+001072: MYANMAR VOWEL SIGN KAYAH OE*/
+ RTUNI_ALPHA, /* U+001073: MYANMAR VOWEL SIGN KAYAH U*/
+ RTUNI_ALPHA, /* U+001074: MYANMAR VOWEL SIGN KAYAH EE*/
+ RTUNI_ALPHA, /* U+001075: MYANMAR LETTER SHAN KA*/
+ RTUNI_ALPHA, /* U+001076: MYANMAR LETTER SHAN KHA*/
+ RTUNI_ALPHA, /* U+001077: MYANMAR LETTER SHAN GA*/
+ RTUNI_ALPHA, /* U+001078: MYANMAR LETTER SHAN CA*/
+ RTUNI_ALPHA, /* U+001079: MYANMAR LETTER SHAN ZA*/
+ RTUNI_ALPHA, /* U+00107a: MYANMAR LETTER SHAN NYA*/
+ RTUNI_ALPHA, /* U+00107b: MYANMAR LETTER SHAN DA*/
+ RTUNI_ALPHA, /* U+00107c: MYANMAR LETTER SHAN NA*/
+ RTUNI_ALPHA, /* U+00107d: MYANMAR LETTER SHAN PHA*/
+ RTUNI_ALPHA, /* U+00107e: MYANMAR LETTER SHAN FA*/
+ RTUNI_ALPHA, /* U+00107f: MYANMAR LETTER SHAN BA*/
+ RTUNI_ALPHA, /* U+001080: MYANMAR LETTER SHAN THA*/
+ RTUNI_ALPHA, /* U+001081: MYANMAR LETTER SHAN HA*/
+ RTUNI_ALPHA, /* U+001082: MYANMAR CONSONANT SIGN SHAN MEDIAL WA*/
+ RTUNI_ALPHA, /* U+001083: MYANMAR VOWEL SIGN SHAN AA*/
+ RTUNI_ALPHA, /* U+001084: MYANMAR VOWEL SIGN SHAN E*/
+ RTUNI_ALPHA, /* U+001085: MYANMAR VOWEL SIGN SHAN E ABOVE*/
+ RTUNI_ALPHA, /* U+001086: MYANMAR VOWEL SIGN SHAN FINAL Y*/
+ 0, /* U+001087: MYANMAR SIGN SHAN TONE-2*/
+ 0, /* U+001088: MYANMAR SIGN SHAN TONE-3*/
+ 0, /* U+001089: MYANMAR SIGN SHAN TONE-5*/
+ 0, /* U+00108a: MYANMAR SIGN SHAN TONE-6*/
+ 0, /* U+00108b: MYANMAR SIGN SHAN COUNCIL TONE-2*/
+ 0, /* U+00108c: MYANMAR SIGN SHAN COUNCIL TONE-3*/
+ 0, /* U+00108d: MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE*/
+ RTUNI_ALPHA, /* U+00108e: MYANMAR LETTER RUMAI PALAUNG FA*/
+ 0, /* U+00108f: MYANMAR SIGN RUMAI PALAUNG TONE-5*/
+ RTUNI_DDIGIT, /* U+001090: MYANMAR SHAN DIGIT ZERO*/
+ RTUNI_DDIGIT, /* U+001091: MYANMAR SHAN DIGIT ONE*/
+ RTUNI_DDIGIT, /* U+001092: MYANMAR SHAN DIGIT TWO*/
+ RTUNI_DDIGIT, /* U+001093: MYANMAR SHAN DIGIT THREE*/
+ RTUNI_DDIGIT, /* U+001094: MYANMAR SHAN DIGIT FOUR*/
+ RTUNI_DDIGIT, /* U+001095: MYANMAR SHAN DIGIT FIVE*/
+ RTUNI_DDIGIT, /* U+001096: MYANMAR SHAN DIGIT SIX*/
+ RTUNI_DDIGIT, /* U+001097: MYANMAR SHAN DIGIT SEVEN*/
+ RTUNI_DDIGIT, /* U+001098: MYANMAR SHAN DIGIT EIGHT*/
+ RTUNI_DDIGIT, /* U+001099: MYANMAR SHAN DIGIT NINE*/
+ 0, /* U+00109a: MYANMAR SIGN KHAMTI TONE-1*/
+ 0, /* U+00109b: MYANMAR SIGN KHAMTI TONE-3*/
+ RTUNI_ALPHA, /* U+00109c: MYANMAR VOWEL SIGN AITON A*/
+ RTUNI_ALPHA, /* U+00109d: MYANMAR VOWEL SIGN AITON AI*/
+ 0, /* U+00109e: MYANMAR SYMBOL SHAN ONE*/
+ 0, /* U+00109f: MYANMAR SYMBOL SHAN EXCLAMATION*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0010a0: GEORGIAN CAPITAL LETTER AN*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0010a1: GEORGIAN CAPITAL LETTER BAN*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0010a2: GEORGIAN CAPITAL LETTER GAN*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0010a3: GEORGIAN CAPITAL LETTER DON*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0010a4: GEORGIAN CAPITAL LETTER EN*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0010a5: GEORGIAN CAPITAL LETTER VIN*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0010a6: GEORGIAN CAPITAL LETTER ZEN*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0010a7: GEORGIAN CAPITAL LETTER TAN*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0010a8: GEORGIAN CAPITAL LETTER IN*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0010a9: GEORGIAN CAPITAL LETTER KAN*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0010aa: GEORGIAN CAPITAL LETTER LAS*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0010ab: GEORGIAN CAPITAL LETTER MAN*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0010ac: GEORGIAN CAPITAL LETTER NAR*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0010ad: GEORGIAN CAPITAL LETTER ON*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0010ae: GEORGIAN CAPITAL LETTER PAR*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0010af: GEORGIAN CAPITAL LETTER ZHAR*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0010b0: GEORGIAN CAPITAL LETTER RAE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0010b1: GEORGIAN CAPITAL LETTER SAN*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0010b2: GEORGIAN CAPITAL LETTER TAR*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0010b3: GEORGIAN CAPITAL LETTER UN*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0010b4: GEORGIAN CAPITAL LETTER PHAR*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0010b5: GEORGIAN CAPITAL LETTER KHAR*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0010b6: GEORGIAN CAPITAL LETTER GHAN*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0010b7: GEORGIAN CAPITAL LETTER QAR*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0010b8: GEORGIAN CAPITAL LETTER SHIN*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0010b9: GEORGIAN CAPITAL LETTER CHIN*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0010ba: GEORGIAN CAPITAL LETTER CAN*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0010bb: GEORGIAN CAPITAL LETTER JIL*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0010bc: GEORGIAN CAPITAL LETTER CIL*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0010bd: GEORGIAN CAPITAL LETTER CHAR*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0010be: GEORGIAN CAPITAL LETTER XAN*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0010bf: GEORGIAN CAPITAL LETTER JHAN*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0010c0: GEORGIAN CAPITAL LETTER HAE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0010c1: GEORGIAN CAPITAL LETTER HE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0010c2: GEORGIAN CAPITAL LETTER HIE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0010c3: GEORGIAN CAPITAL LETTER WE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0010c4: GEORGIAN CAPITAL LETTER HAR*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0010c5: GEORGIAN CAPITAL LETTER HOE*/
+ 0, /* U+0010c6: */
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0010c7: GEORGIAN CAPITAL LETTER YN*/
+ 0, /* U+0010c8: */
+ 0, /* U+0010c9: */
+ 0, /* U+0010ca: */
+ 0, /* U+0010cb: */
+ 0, /* U+0010cc: */
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0010cd: GEORGIAN CAPITAL LETTER AEN*/
+ 0, /* U+0010ce: */
+ 0, /* U+0010cf: */
+ RTUNI_ALPHA, /* U+0010d0: GEORGIAN LETTER AN*/
+ RTUNI_ALPHA, /* U+0010d1: GEORGIAN LETTER BAN*/
+ RTUNI_ALPHA, /* U+0010d2: GEORGIAN LETTER GAN*/
+ RTUNI_ALPHA, /* U+0010d3: GEORGIAN LETTER DON*/
+ RTUNI_ALPHA, /* U+0010d4: GEORGIAN LETTER EN*/
+ RTUNI_ALPHA, /* U+0010d5: GEORGIAN LETTER VIN*/
+ RTUNI_ALPHA, /* U+0010d6: GEORGIAN LETTER ZEN*/
+ RTUNI_ALPHA, /* U+0010d7: GEORGIAN LETTER TAN*/
+ RTUNI_ALPHA, /* U+0010d8: GEORGIAN LETTER IN*/
+ RTUNI_ALPHA, /* U+0010d9: GEORGIAN LETTER KAN*/
+ RTUNI_ALPHA, /* U+0010da: GEORGIAN LETTER LAS*/
+ RTUNI_ALPHA, /* U+0010db: GEORGIAN LETTER MAN*/
+ RTUNI_ALPHA, /* U+0010dc: GEORGIAN LETTER NAR*/
+ RTUNI_ALPHA, /* U+0010dd: GEORGIAN LETTER ON*/
+ RTUNI_ALPHA, /* U+0010de: GEORGIAN LETTER PAR*/
+ RTUNI_ALPHA, /* U+0010df: GEORGIAN LETTER ZHAR*/
+ RTUNI_ALPHA, /* U+0010e0: GEORGIAN LETTER RAE*/
+ RTUNI_ALPHA, /* U+0010e1: GEORGIAN LETTER SAN*/
+ RTUNI_ALPHA, /* U+0010e2: GEORGIAN LETTER TAR*/
+ RTUNI_ALPHA, /* U+0010e3: GEORGIAN LETTER UN*/
+ RTUNI_ALPHA, /* U+0010e4: GEORGIAN LETTER PHAR*/
+ RTUNI_ALPHA, /* U+0010e5: GEORGIAN LETTER KHAR*/
+ RTUNI_ALPHA, /* U+0010e6: GEORGIAN LETTER GHAN*/
+ RTUNI_ALPHA, /* U+0010e7: GEORGIAN LETTER QAR*/
+ RTUNI_ALPHA, /* U+0010e8: GEORGIAN LETTER SHIN*/
+ RTUNI_ALPHA, /* U+0010e9: GEORGIAN LETTER CHIN*/
+ RTUNI_ALPHA, /* U+0010ea: GEORGIAN LETTER CAN*/
+ RTUNI_ALPHA, /* U+0010eb: GEORGIAN LETTER JIL*/
+ RTUNI_ALPHA, /* U+0010ec: GEORGIAN LETTER CIL*/
+ RTUNI_ALPHA, /* U+0010ed: GEORGIAN LETTER CHAR*/
+ RTUNI_ALPHA, /* U+0010ee: GEORGIAN LETTER XAN*/
+ RTUNI_ALPHA, /* U+0010ef: GEORGIAN LETTER JHAN*/
+ RTUNI_ALPHA, /* U+0010f0: GEORGIAN LETTER HAE*/
+ RTUNI_ALPHA, /* U+0010f1: GEORGIAN LETTER HE*/
+ RTUNI_ALPHA, /* U+0010f2: GEORGIAN LETTER HIE*/
+ RTUNI_ALPHA, /* U+0010f3: GEORGIAN LETTER WE*/
+ RTUNI_ALPHA, /* U+0010f4: GEORGIAN LETTER HAR*/
+ RTUNI_ALPHA, /* U+0010f5: GEORGIAN LETTER HOE*/
+ RTUNI_ALPHA, /* U+0010f6: GEORGIAN LETTER FI*/
+ RTUNI_ALPHA, /* U+0010f7: GEORGIAN LETTER YN*/
+ RTUNI_ALPHA, /* U+0010f8: GEORGIAN LETTER ELIFI*/
+ RTUNI_ALPHA, /* U+0010f9: GEORGIAN LETTER TURNED GAN*/
+ RTUNI_ALPHA, /* U+0010fa: GEORGIAN LETTER AIN*/
+ 0, /* U+0010fb: GEORGIAN PARAGRAPH SEPARATOR*/
+ RTUNI_ALPHA, /* U+0010fc: MODIFIER LETTER GEORGIAN NAR*/
+ RTUNI_ALPHA, /* U+0010fd: GEORGIAN LETTER AEN*/
+ RTUNI_ALPHA, /* U+0010fe: GEORGIAN LETTER HARD SIGN*/
+ RTUNI_ALPHA, /* U+0010ff: GEORGIAN LETTER LABIAL SIGN*/
+ RTUNI_ALPHA, /* U+001100: HANGUL CHOSEONG KIYEOK*/
+ RTUNI_ALPHA, /* U+001101: HANGUL CHOSEONG SSANGKIYEOK*/
+ RTUNI_ALPHA, /* U+001102: HANGUL CHOSEONG NIEUN*/
+ RTUNI_ALPHA, /* U+001103: HANGUL CHOSEONG TIKEUT*/
+ RTUNI_ALPHA, /* U+001104: HANGUL CHOSEONG SSANGTIKEUT*/
+ RTUNI_ALPHA, /* U+001105: HANGUL CHOSEONG RIEUL*/
+ RTUNI_ALPHA, /* U+001106: HANGUL CHOSEONG MIEUM*/
+ RTUNI_ALPHA, /* U+001107: HANGUL CHOSEONG PIEUP*/
+ RTUNI_ALPHA, /* U+001108: HANGUL CHOSEONG SSANGPIEUP*/
+ RTUNI_ALPHA, /* U+001109: HANGUL CHOSEONG SIOS*/
+ RTUNI_ALPHA, /* U+00110a: HANGUL CHOSEONG SSANGSIOS*/
+ RTUNI_ALPHA, /* U+00110b: HANGUL CHOSEONG IEUNG*/
+ RTUNI_ALPHA, /* U+00110c: HANGUL CHOSEONG CIEUC*/
+ RTUNI_ALPHA, /* U+00110d: HANGUL CHOSEONG SSANGCIEUC*/
+ RTUNI_ALPHA, /* U+00110e: HANGUL CHOSEONG CHIEUCH*/
+ RTUNI_ALPHA, /* U+00110f: HANGUL CHOSEONG KHIEUKH*/
+ RTUNI_ALPHA, /* U+001110: HANGUL CHOSEONG THIEUTH*/
+ RTUNI_ALPHA, /* U+001111: HANGUL CHOSEONG PHIEUPH*/
+ RTUNI_ALPHA, /* U+001112: HANGUL CHOSEONG HIEUH*/
+ RTUNI_ALPHA, /* U+001113: HANGUL CHOSEONG NIEUN-KIYEOK*/
+ RTUNI_ALPHA, /* U+001114: HANGUL CHOSEONG SSANGNIEUN*/
+ RTUNI_ALPHA, /* U+001115: HANGUL CHOSEONG NIEUN-TIKEUT*/
+ RTUNI_ALPHA, /* U+001116: HANGUL CHOSEONG NIEUN-PIEUP*/
+ RTUNI_ALPHA, /* U+001117: HANGUL CHOSEONG TIKEUT-KIYEOK*/
+ RTUNI_ALPHA, /* U+001118: HANGUL CHOSEONG RIEUL-NIEUN*/
+ RTUNI_ALPHA, /* U+001119: HANGUL CHOSEONG SSANGRIEUL*/
+ RTUNI_ALPHA, /* U+00111a: HANGUL CHOSEONG RIEUL-HIEUH*/
+ RTUNI_ALPHA, /* U+00111b: HANGUL CHOSEONG KAPYEOUNRIEUL*/
+ RTUNI_ALPHA, /* U+00111c: HANGUL CHOSEONG MIEUM-PIEUP*/
+ RTUNI_ALPHA, /* U+00111d: HANGUL CHOSEONG KAPYEOUNMIEUM*/
+ RTUNI_ALPHA, /* U+00111e: HANGUL CHOSEONG PIEUP-KIYEOK*/
+ RTUNI_ALPHA, /* U+00111f: HANGUL CHOSEONG PIEUP-NIEUN*/
+ RTUNI_ALPHA, /* U+001120: HANGUL CHOSEONG PIEUP-TIKEUT*/
+ RTUNI_ALPHA, /* U+001121: HANGUL CHOSEONG PIEUP-SIOS*/
+ RTUNI_ALPHA, /* U+001122: HANGUL CHOSEONG PIEUP-SIOS-KIYEOK*/
+ RTUNI_ALPHA, /* U+001123: HANGUL CHOSEONG PIEUP-SIOS-TIKEUT*/
+ RTUNI_ALPHA, /* U+001124: HANGUL CHOSEONG PIEUP-SIOS-PIEUP*/
+ RTUNI_ALPHA, /* U+001125: HANGUL CHOSEONG PIEUP-SSANGSIOS*/
+ RTUNI_ALPHA, /* U+001126: HANGUL CHOSEONG PIEUP-SIOS-CIEUC*/
+ RTUNI_ALPHA, /* U+001127: HANGUL CHOSEONG PIEUP-CIEUC*/
+ RTUNI_ALPHA, /* U+001128: HANGUL CHOSEONG PIEUP-CHIEUCH*/
+ RTUNI_ALPHA, /* U+001129: HANGUL CHOSEONG PIEUP-THIEUTH*/
+ RTUNI_ALPHA, /* U+00112a: HANGUL CHOSEONG PIEUP-PHIEUPH*/
+ RTUNI_ALPHA, /* U+00112b: HANGUL CHOSEONG KAPYEOUNPIEUP*/
+ RTUNI_ALPHA, /* U+00112c: HANGUL CHOSEONG KAPYEOUNSSANGPIEUP*/
+ RTUNI_ALPHA, /* U+00112d: HANGUL CHOSEONG SIOS-KIYEOK*/
+ RTUNI_ALPHA, /* U+00112e: HANGUL CHOSEONG SIOS-NIEUN*/
+ RTUNI_ALPHA, /* U+00112f: HANGUL CHOSEONG SIOS-TIKEUT*/
+ RTUNI_ALPHA, /* U+001130: HANGUL CHOSEONG SIOS-RIEUL*/
+ RTUNI_ALPHA, /* U+001131: HANGUL CHOSEONG SIOS-MIEUM*/
+ RTUNI_ALPHA, /* U+001132: HANGUL CHOSEONG SIOS-PIEUP*/
+ RTUNI_ALPHA, /* U+001133: HANGUL CHOSEONG SIOS-PIEUP-KIYEOK*/
+ RTUNI_ALPHA, /* U+001134: HANGUL CHOSEONG SIOS-SSANGSIOS*/
+ RTUNI_ALPHA, /* U+001135: HANGUL CHOSEONG SIOS-IEUNG*/
+ RTUNI_ALPHA, /* U+001136: HANGUL CHOSEONG SIOS-CIEUC*/
+ RTUNI_ALPHA, /* U+001137: HANGUL CHOSEONG SIOS-CHIEUCH*/
+ RTUNI_ALPHA, /* U+001138: HANGUL CHOSEONG SIOS-KHIEUKH*/
+ RTUNI_ALPHA, /* U+001139: HANGUL CHOSEONG SIOS-THIEUTH*/
+ RTUNI_ALPHA, /* U+00113a: HANGUL CHOSEONG SIOS-PHIEUPH*/
+ RTUNI_ALPHA, /* U+00113b: HANGUL CHOSEONG SIOS-HIEUH*/
+ RTUNI_ALPHA, /* U+00113c: HANGUL CHOSEONG CHITUEUMSIOS*/
+ RTUNI_ALPHA, /* U+00113d: HANGUL CHOSEONG CHITUEUMSSANGSIOS*/
+ RTUNI_ALPHA, /* U+00113e: HANGUL CHOSEONG CEONGCHIEUMSIOS*/
+ RTUNI_ALPHA, /* U+00113f: HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS*/
+ RTUNI_ALPHA, /* U+001140: HANGUL CHOSEONG PANSIOS*/
+ RTUNI_ALPHA, /* U+001141: HANGUL CHOSEONG IEUNG-KIYEOK*/
+ RTUNI_ALPHA, /* U+001142: HANGUL CHOSEONG IEUNG-TIKEUT*/
+ RTUNI_ALPHA, /* U+001143: HANGUL CHOSEONG IEUNG-MIEUM*/
+ RTUNI_ALPHA, /* U+001144: HANGUL CHOSEONG IEUNG-PIEUP*/
+ RTUNI_ALPHA, /* U+001145: HANGUL CHOSEONG IEUNG-SIOS*/
+ RTUNI_ALPHA, /* U+001146: HANGUL CHOSEONG IEUNG-PANSIOS*/
+ RTUNI_ALPHA, /* U+001147: HANGUL CHOSEONG SSANGIEUNG*/
+ RTUNI_ALPHA, /* U+001148: HANGUL CHOSEONG IEUNG-CIEUC*/
+ RTUNI_ALPHA, /* U+001149: HANGUL CHOSEONG IEUNG-CHIEUCH*/
+ RTUNI_ALPHA, /* U+00114a: HANGUL CHOSEONG IEUNG-THIEUTH*/
+ RTUNI_ALPHA, /* U+00114b: HANGUL CHOSEONG IEUNG-PHIEUPH*/
+ RTUNI_ALPHA, /* U+00114c: HANGUL CHOSEONG YESIEUNG*/
+ RTUNI_ALPHA, /* U+00114d: HANGUL CHOSEONG CIEUC-IEUNG*/
+ RTUNI_ALPHA, /* U+00114e: HANGUL CHOSEONG CHITUEUMCIEUC*/
+ RTUNI_ALPHA, /* U+00114f: HANGUL CHOSEONG CHITUEUMSSANGCIEUC*/
+ RTUNI_ALPHA, /* U+001150: HANGUL CHOSEONG CEONGCHIEUMCIEUC*/
+ RTUNI_ALPHA, /* U+001151: HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC*/
+ RTUNI_ALPHA, /* U+001152: HANGUL CHOSEONG CHIEUCH-KHIEUKH*/
+ RTUNI_ALPHA, /* U+001153: HANGUL CHOSEONG CHIEUCH-HIEUH*/
+ RTUNI_ALPHA, /* U+001154: HANGUL CHOSEONG CHITUEUMCHIEUCH*/
+ RTUNI_ALPHA, /* U+001155: HANGUL CHOSEONG CEONGCHIEUMCHIEUCH*/
+ RTUNI_ALPHA, /* U+001156: HANGUL CHOSEONG PHIEUPH-PIEUP*/
+ RTUNI_ALPHA, /* U+001157: HANGUL CHOSEONG KAPYEOUNPHIEUPH*/
+ RTUNI_ALPHA, /* U+001158: HANGUL CHOSEONG SSANGHIEUH*/
+ RTUNI_ALPHA, /* U+001159: HANGUL CHOSEONG YEORINHIEUH*/
+ RTUNI_ALPHA, /* U+00115a: HANGUL CHOSEONG KIYEOK-TIKEUT*/
+ RTUNI_ALPHA, /* U+00115b: HANGUL CHOSEONG NIEUN-SIOS*/
+ RTUNI_ALPHA, /* U+00115c: HANGUL CHOSEONG NIEUN-CIEUC*/
+ RTUNI_ALPHA, /* U+00115d: HANGUL CHOSEONG NIEUN-HIEUH*/
+ RTUNI_ALPHA, /* U+00115e: HANGUL CHOSEONG TIKEUT-RIEUL*/
+ RTUNI_ALPHA, /* U+00115f: HANGUL CHOSEONG FILLER*/
+ RTUNI_ALPHA, /* U+001160: HANGUL JUNGSEONG FILLER*/
+ RTUNI_ALPHA, /* U+001161: HANGUL JUNGSEONG A*/
+ RTUNI_ALPHA, /* U+001162: HANGUL JUNGSEONG AE*/
+ RTUNI_ALPHA, /* U+001163: HANGUL JUNGSEONG YA*/
+ RTUNI_ALPHA, /* U+001164: HANGUL JUNGSEONG YAE*/
+ RTUNI_ALPHA, /* U+001165: HANGUL JUNGSEONG EO*/
+ RTUNI_ALPHA, /* U+001166: HANGUL JUNGSEONG E*/
+ RTUNI_ALPHA, /* U+001167: HANGUL JUNGSEONG YEO*/
+ RTUNI_ALPHA, /* U+001168: HANGUL JUNGSEONG YE*/
+ RTUNI_ALPHA, /* U+001169: HANGUL JUNGSEONG O*/
+ RTUNI_ALPHA, /* U+00116a: HANGUL JUNGSEONG WA*/
+ RTUNI_ALPHA, /* U+00116b: HANGUL JUNGSEONG WAE*/
+ RTUNI_ALPHA, /* U+00116c: HANGUL JUNGSEONG OE*/
+ RTUNI_ALPHA, /* U+00116d: HANGUL JUNGSEONG YO*/
+ RTUNI_ALPHA, /* U+00116e: HANGUL JUNGSEONG U*/
+ RTUNI_ALPHA, /* U+00116f: HANGUL JUNGSEONG WEO*/
+ RTUNI_ALPHA, /* U+001170: HANGUL JUNGSEONG WE*/
+ RTUNI_ALPHA, /* U+001171: HANGUL JUNGSEONG WI*/
+ RTUNI_ALPHA, /* U+001172: HANGUL JUNGSEONG YU*/
+ RTUNI_ALPHA, /* U+001173: HANGUL JUNGSEONG EU*/
+ RTUNI_ALPHA, /* U+001174: HANGUL JUNGSEONG YI*/
+ RTUNI_ALPHA, /* U+001175: HANGUL JUNGSEONG I*/
+ RTUNI_ALPHA, /* U+001176: HANGUL JUNGSEONG A-O*/
+ RTUNI_ALPHA, /* U+001177: HANGUL JUNGSEONG A-U*/
+ RTUNI_ALPHA, /* U+001178: HANGUL JUNGSEONG YA-O*/
+ RTUNI_ALPHA, /* U+001179: HANGUL JUNGSEONG YA-YO*/
+ RTUNI_ALPHA, /* U+00117a: HANGUL JUNGSEONG EO-O*/
+ RTUNI_ALPHA, /* U+00117b: HANGUL JUNGSEONG EO-U*/
+ RTUNI_ALPHA, /* U+00117c: HANGUL JUNGSEONG EO-EU*/
+ RTUNI_ALPHA, /* U+00117d: HANGUL JUNGSEONG YEO-O*/
+ RTUNI_ALPHA, /* U+00117e: HANGUL JUNGSEONG YEO-U*/
+ RTUNI_ALPHA, /* U+00117f: HANGUL JUNGSEONG O-EO*/
+ RTUNI_ALPHA, /* U+001180: HANGUL JUNGSEONG O-E*/
+ RTUNI_ALPHA, /* U+001181: HANGUL JUNGSEONG O-YE*/
+ RTUNI_ALPHA, /* U+001182: HANGUL JUNGSEONG O-O*/
+ RTUNI_ALPHA, /* U+001183: HANGUL JUNGSEONG O-U*/
+ RTUNI_ALPHA, /* U+001184: HANGUL JUNGSEONG YO-YA*/
+ RTUNI_ALPHA, /* U+001185: HANGUL JUNGSEONG YO-YAE*/
+ RTUNI_ALPHA, /* U+001186: HANGUL JUNGSEONG YO-YEO*/
+ RTUNI_ALPHA, /* U+001187: HANGUL JUNGSEONG YO-O*/
+ RTUNI_ALPHA, /* U+001188: HANGUL JUNGSEONG YO-I*/
+ RTUNI_ALPHA, /* U+001189: HANGUL JUNGSEONG U-A*/
+ RTUNI_ALPHA, /* U+00118a: HANGUL JUNGSEONG U-AE*/
+ RTUNI_ALPHA, /* U+00118b: HANGUL JUNGSEONG U-EO-EU*/
+ RTUNI_ALPHA, /* U+00118c: HANGUL JUNGSEONG U-YE*/
+ RTUNI_ALPHA, /* U+00118d: HANGUL JUNGSEONG U-U*/
+ RTUNI_ALPHA, /* U+00118e: HANGUL JUNGSEONG YU-A*/
+ RTUNI_ALPHA, /* U+00118f: HANGUL JUNGSEONG YU-EO*/
+ RTUNI_ALPHA, /* U+001190: HANGUL JUNGSEONG YU-E*/
+ RTUNI_ALPHA, /* U+001191: HANGUL JUNGSEONG YU-YEO*/
+ RTUNI_ALPHA, /* U+001192: HANGUL JUNGSEONG YU-YE*/
+ RTUNI_ALPHA, /* U+001193: HANGUL JUNGSEONG YU-U*/
+ RTUNI_ALPHA, /* U+001194: HANGUL JUNGSEONG YU-I*/
+ RTUNI_ALPHA, /* U+001195: HANGUL JUNGSEONG EU-U*/
+ RTUNI_ALPHA, /* U+001196: HANGUL JUNGSEONG EU-EU*/
+ RTUNI_ALPHA, /* U+001197: HANGUL JUNGSEONG YI-U*/
+ RTUNI_ALPHA, /* U+001198: HANGUL JUNGSEONG I-A*/
+ RTUNI_ALPHA, /* U+001199: HANGUL JUNGSEONG I-YA*/
+ RTUNI_ALPHA, /* U+00119a: HANGUL JUNGSEONG I-O*/
+ RTUNI_ALPHA, /* U+00119b: HANGUL JUNGSEONG I-U*/
+ RTUNI_ALPHA, /* U+00119c: HANGUL JUNGSEONG I-EU*/
+ RTUNI_ALPHA, /* U+00119d: HANGUL JUNGSEONG I-ARAEA*/
+ RTUNI_ALPHA, /* U+00119e: HANGUL JUNGSEONG ARAEA*/
+ RTUNI_ALPHA, /* U+00119f: HANGUL JUNGSEONG ARAEA-EO*/
+ RTUNI_ALPHA, /* U+0011a0: HANGUL JUNGSEONG ARAEA-U*/
+ RTUNI_ALPHA, /* U+0011a1: HANGUL JUNGSEONG ARAEA-I*/
+ RTUNI_ALPHA, /* U+0011a2: HANGUL JUNGSEONG SSANGARAEA*/
+ RTUNI_ALPHA, /* U+0011a3: HANGUL JUNGSEONG A-EU*/
+ RTUNI_ALPHA, /* U+0011a4: HANGUL JUNGSEONG YA-U*/
+ RTUNI_ALPHA, /* U+0011a5: HANGUL JUNGSEONG YEO-YA*/
+ RTUNI_ALPHA, /* U+0011a6: HANGUL JUNGSEONG O-YA*/
+ RTUNI_ALPHA, /* U+0011a7: HANGUL JUNGSEONG O-YAE*/
+ RTUNI_ALPHA, /* U+0011a8: HANGUL JONGSEONG KIYEOK*/
+ RTUNI_ALPHA, /* U+0011a9: HANGUL JONGSEONG SSANGKIYEOK*/
+ RTUNI_ALPHA, /* U+0011aa: HANGUL JONGSEONG KIYEOK-SIOS*/
+ RTUNI_ALPHA, /* U+0011ab: HANGUL JONGSEONG NIEUN*/
+ RTUNI_ALPHA, /* U+0011ac: HANGUL JONGSEONG NIEUN-CIEUC*/
+ RTUNI_ALPHA, /* U+0011ad: HANGUL JONGSEONG NIEUN-HIEUH*/
+ RTUNI_ALPHA, /* U+0011ae: HANGUL JONGSEONG TIKEUT*/
+ RTUNI_ALPHA, /* U+0011af: HANGUL JONGSEONG RIEUL*/
+ RTUNI_ALPHA, /* U+0011b0: HANGUL JONGSEONG RIEUL-KIYEOK*/
+ RTUNI_ALPHA, /* U+0011b1: HANGUL JONGSEONG RIEUL-MIEUM*/
+ RTUNI_ALPHA, /* U+0011b2: HANGUL JONGSEONG RIEUL-PIEUP*/
+ RTUNI_ALPHA, /* U+0011b3: HANGUL JONGSEONG RIEUL-SIOS*/
+ RTUNI_ALPHA, /* U+0011b4: HANGUL JONGSEONG RIEUL-THIEUTH*/
+ RTUNI_ALPHA, /* U+0011b5: HANGUL JONGSEONG RIEUL-PHIEUPH*/
+ RTUNI_ALPHA, /* U+0011b6: HANGUL JONGSEONG RIEUL-HIEUH*/
+ RTUNI_ALPHA, /* U+0011b7: HANGUL JONGSEONG MIEUM*/
+ RTUNI_ALPHA, /* U+0011b8: HANGUL JONGSEONG PIEUP*/
+ RTUNI_ALPHA, /* U+0011b9: HANGUL JONGSEONG PIEUP-SIOS*/
+ RTUNI_ALPHA, /* U+0011ba: HANGUL JONGSEONG SIOS*/
+ RTUNI_ALPHA, /* U+0011bb: HANGUL JONGSEONG SSANGSIOS*/
+ RTUNI_ALPHA, /* U+0011bc: HANGUL JONGSEONG IEUNG*/
+ RTUNI_ALPHA, /* U+0011bd: HANGUL JONGSEONG CIEUC*/
+ RTUNI_ALPHA, /* U+0011be: HANGUL JONGSEONG CHIEUCH*/
+ RTUNI_ALPHA, /* U+0011bf: HANGUL JONGSEONG KHIEUKH*/
+ RTUNI_ALPHA, /* U+0011c0: HANGUL JONGSEONG THIEUTH*/
+ RTUNI_ALPHA, /* U+0011c1: HANGUL JONGSEONG PHIEUPH*/
+ RTUNI_ALPHA, /* U+0011c2: HANGUL JONGSEONG HIEUH*/
+ RTUNI_ALPHA, /* U+0011c3: HANGUL JONGSEONG KIYEOK-RIEUL*/
+ RTUNI_ALPHA, /* U+0011c4: HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK*/
+ RTUNI_ALPHA, /* U+0011c5: HANGUL JONGSEONG NIEUN-KIYEOK*/
+ RTUNI_ALPHA, /* U+0011c6: HANGUL JONGSEONG NIEUN-TIKEUT*/
+ RTUNI_ALPHA, /* U+0011c7: HANGUL JONGSEONG NIEUN-SIOS*/
+ RTUNI_ALPHA, /* U+0011c8: HANGUL JONGSEONG NIEUN-PANSIOS*/
+ RTUNI_ALPHA, /* U+0011c9: HANGUL JONGSEONG NIEUN-THIEUTH*/
+ RTUNI_ALPHA, /* U+0011ca: HANGUL JONGSEONG TIKEUT-KIYEOK*/
+ RTUNI_ALPHA, /* U+0011cb: HANGUL JONGSEONG TIKEUT-RIEUL*/
+ RTUNI_ALPHA, /* U+0011cc: HANGUL JONGSEONG RIEUL-KIYEOK-SIOS*/
+ RTUNI_ALPHA, /* U+0011cd: HANGUL JONGSEONG RIEUL-NIEUN*/
+ RTUNI_ALPHA, /* U+0011ce: HANGUL JONGSEONG RIEUL-TIKEUT*/
+ RTUNI_ALPHA, /* U+0011cf: HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH*/
+ RTUNI_ALPHA, /* U+0011d0: HANGUL JONGSEONG SSANGRIEUL*/
+ RTUNI_ALPHA, /* U+0011d1: HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK*/
+ RTUNI_ALPHA, /* U+0011d2: HANGUL JONGSEONG RIEUL-MIEUM-SIOS*/
+ RTUNI_ALPHA, /* U+0011d3: HANGUL JONGSEONG RIEUL-PIEUP-SIOS*/
+ RTUNI_ALPHA, /* U+0011d4: HANGUL JONGSEONG RIEUL-PIEUP-HIEUH*/
+ RTUNI_ALPHA, /* U+0011d5: HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP*/
+ RTUNI_ALPHA, /* U+0011d6: HANGUL JONGSEONG RIEUL-SSANGSIOS*/
+ RTUNI_ALPHA, /* U+0011d7: HANGUL JONGSEONG RIEUL-PANSIOS*/
+ RTUNI_ALPHA, /* U+0011d8: HANGUL JONGSEONG RIEUL-KHIEUKH*/
+ RTUNI_ALPHA, /* U+0011d9: HANGUL JONGSEONG RIEUL-YEORINHIEUH*/
+ RTUNI_ALPHA, /* U+0011da: HANGUL JONGSEONG MIEUM-KIYEOK*/
+ RTUNI_ALPHA, /* U+0011db: HANGUL JONGSEONG MIEUM-RIEUL*/
+ RTUNI_ALPHA, /* U+0011dc: HANGUL JONGSEONG MIEUM-PIEUP*/
+ RTUNI_ALPHA, /* U+0011dd: HANGUL JONGSEONG MIEUM-SIOS*/
+ RTUNI_ALPHA, /* U+0011de: HANGUL JONGSEONG MIEUM-SSANGSIOS*/
+ RTUNI_ALPHA, /* U+0011df: HANGUL JONGSEONG MIEUM-PANSIOS*/
+ RTUNI_ALPHA, /* U+0011e0: HANGUL JONGSEONG MIEUM-CHIEUCH*/
+ RTUNI_ALPHA, /* U+0011e1: HANGUL JONGSEONG MIEUM-HIEUH*/
+ RTUNI_ALPHA, /* U+0011e2: HANGUL JONGSEONG KAPYEOUNMIEUM*/
+ RTUNI_ALPHA, /* U+0011e3: HANGUL JONGSEONG PIEUP-RIEUL*/
+ RTUNI_ALPHA, /* U+0011e4: HANGUL JONGSEONG PIEUP-PHIEUPH*/
+ RTUNI_ALPHA, /* U+0011e5: HANGUL JONGSEONG PIEUP-HIEUH*/
+ RTUNI_ALPHA, /* U+0011e6: HANGUL JONGSEONG KAPYEOUNPIEUP*/
+ RTUNI_ALPHA, /* U+0011e7: HANGUL JONGSEONG SIOS-KIYEOK*/
+ RTUNI_ALPHA, /* U+0011e8: HANGUL JONGSEONG SIOS-TIKEUT*/
+ RTUNI_ALPHA, /* U+0011e9: HANGUL JONGSEONG SIOS-RIEUL*/
+ RTUNI_ALPHA, /* U+0011ea: HANGUL JONGSEONG SIOS-PIEUP*/
+ RTUNI_ALPHA, /* U+0011eb: HANGUL JONGSEONG PANSIOS*/
+ RTUNI_ALPHA, /* U+0011ec: HANGUL JONGSEONG IEUNG-KIYEOK*/
+ RTUNI_ALPHA, /* U+0011ed: HANGUL JONGSEONG IEUNG-SSANGKIYEOK*/
+ RTUNI_ALPHA, /* U+0011ee: HANGUL JONGSEONG SSANGIEUNG*/
+ RTUNI_ALPHA, /* U+0011ef: HANGUL JONGSEONG IEUNG-KHIEUKH*/
+ RTUNI_ALPHA, /* U+0011f0: HANGUL JONGSEONG YESIEUNG*/
+ RTUNI_ALPHA, /* U+0011f1: HANGUL JONGSEONG YESIEUNG-SIOS*/
+ RTUNI_ALPHA, /* U+0011f2: HANGUL JONGSEONG YESIEUNG-PANSIOS*/
+ RTUNI_ALPHA, /* U+0011f3: HANGUL JONGSEONG PHIEUPH-PIEUP*/
+ RTUNI_ALPHA, /* U+0011f4: HANGUL JONGSEONG KAPYEOUNPHIEUPH*/
+ RTUNI_ALPHA, /* U+0011f5: HANGUL JONGSEONG HIEUH-NIEUN*/
+ RTUNI_ALPHA, /* U+0011f6: HANGUL JONGSEONG HIEUH-RIEUL*/
+ RTUNI_ALPHA, /* U+0011f7: HANGUL JONGSEONG HIEUH-MIEUM*/
+ RTUNI_ALPHA, /* U+0011f8: HANGUL JONGSEONG HIEUH-PIEUP*/
+ RTUNI_ALPHA, /* U+0011f9: HANGUL JONGSEONG YEORINHIEUH*/
+ RTUNI_ALPHA, /* U+0011fa: HANGUL JONGSEONG KIYEOK-NIEUN*/
+ RTUNI_ALPHA, /* U+0011fb: HANGUL JONGSEONG KIYEOK-PIEUP*/
+ RTUNI_ALPHA, /* U+0011fc: HANGUL JONGSEONG KIYEOK-CHIEUCH*/
+ RTUNI_ALPHA, /* U+0011fd: HANGUL JONGSEONG KIYEOK-KHIEUKH*/
+ RTUNI_ALPHA, /* U+0011fe: HANGUL JONGSEONG KIYEOK-HIEUH*/
+ RTUNI_ALPHA, /* U+0011ff: HANGUL JONGSEONG SSANGNIEUN*/
+ RTUNI_ALPHA, /* U+001200: ETHIOPIC SYLLABLE HA*/
+ RTUNI_ALPHA, /* U+001201: ETHIOPIC SYLLABLE HU*/
+ RTUNI_ALPHA, /* U+001202: ETHIOPIC SYLLABLE HI*/
+ RTUNI_ALPHA, /* U+001203: ETHIOPIC SYLLABLE HAA*/
+ RTUNI_ALPHA, /* U+001204: ETHIOPIC SYLLABLE HEE*/
+ RTUNI_ALPHA, /* U+001205: ETHIOPIC SYLLABLE HE*/
+ RTUNI_ALPHA, /* U+001206: ETHIOPIC SYLLABLE HO*/
+ RTUNI_ALPHA, /* U+001207: ETHIOPIC SYLLABLE HOA*/
+ RTUNI_ALPHA, /* U+001208: ETHIOPIC SYLLABLE LA*/
+ RTUNI_ALPHA, /* U+001209: ETHIOPIC SYLLABLE LU*/
+ RTUNI_ALPHA, /* U+00120a: ETHIOPIC SYLLABLE LI*/
+ RTUNI_ALPHA, /* U+00120b: ETHIOPIC SYLLABLE LAA*/
+ RTUNI_ALPHA, /* U+00120c: ETHIOPIC SYLLABLE LEE*/
+ RTUNI_ALPHA, /* U+00120d: ETHIOPIC SYLLABLE LE*/
+ RTUNI_ALPHA, /* U+00120e: ETHIOPIC SYLLABLE LO*/
+ RTUNI_ALPHA, /* U+00120f: ETHIOPIC SYLLABLE LWA*/
+ RTUNI_ALPHA, /* U+001210: ETHIOPIC SYLLABLE HHA*/
+ RTUNI_ALPHA, /* U+001211: ETHIOPIC SYLLABLE HHU*/
+ RTUNI_ALPHA, /* U+001212: ETHIOPIC SYLLABLE HHI*/
+ RTUNI_ALPHA, /* U+001213: ETHIOPIC SYLLABLE HHAA*/
+ RTUNI_ALPHA, /* U+001214: ETHIOPIC SYLLABLE HHEE*/
+ RTUNI_ALPHA, /* U+001215: ETHIOPIC SYLLABLE HHE*/
+ RTUNI_ALPHA, /* U+001216: ETHIOPIC SYLLABLE HHO*/
+ RTUNI_ALPHA, /* U+001217: ETHIOPIC SYLLABLE HHWA*/
+ RTUNI_ALPHA, /* U+001218: ETHIOPIC SYLLABLE MA*/
+ RTUNI_ALPHA, /* U+001219: ETHIOPIC SYLLABLE MU*/
+ RTUNI_ALPHA, /* U+00121a: ETHIOPIC SYLLABLE MI*/
+ RTUNI_ALPHA, /* U+00121b: ETHIOPIC SYLLABLE MAA*/
+ RTUNI_ALPHA, /* U+00121c: ETHIOPIC SYLLABLE MEE*/
+ RTUNI_ALPHA, /* U+00121d: ETHIOPIC SYLLABLE ME*/
+ RTUNI_ALPHA, /* U+00121e: ETHIOPIC SYLLABLE MO*/
+ RTUNI_ALPHA, /* U+00121f: ETHIOPIC SYLLABLE MWA*/
+ RTUNI_ALPHA, /* U+001220: ETHIOPIC SYLLABLE SZA*/
+ RTUNI_ALPHA, /* U+001221: ETHIOPIC SYLLABLE SZU*/
+ RTUNI_ALPHA, /* U+001222: ETHIOPIC SYLLABLE SZI*/
+ RTUNI_ALPHA, /* U+001223: ETHIOPIC SYLLABLE SZAA*/
+ RTUNI_ALPHA, /* U+001224: ETHIOPIC SYLLABLE SZEE*/
+ RTUNI_ALPHA, /* U+001225: ETHIOPIC SYLLABLE SZE*/
+ RTUNI_ALPHA, /* U+001226: ETHIOPIC SYLLABLE SZO*/
+ RTUNI_ALPHA, /* U+001227: ETHIOPIC SYLLABLE SZWA*/
+ RTUNI_ALPHA, /* U+001228: ETHIOPIC SYLLABLE RA*/
+ RTUNI_ALPHA, /* U+001229: ETHIOPIC SYLLABLE RU*/
+ RTUNI_ALPHA, /* U+00122a: ETHIOPIC SYLLABLE RI*/
+ RTUNI_ALPHA, /* U+00122b: ETHIOPIC SYLLABLE RAA*/
+ RTUNI_ALPHA, /* U+00122c: ETHIOPIC SYLLABLE REE*/
+ RTUNI_ALPHA, /* U+00122d: ETHIOPIC SYLLABLE RE*/
+ RTUNI_ALPHA, /* U+00122e: ETHIOPIC SYLLABLE RO*/
+ RTUNI_ALPHA, /* U+00122f: ETHIOPIC SYLLABLE RWA*/
+ RTUNI_ALPHA, /* U+001230: ETHIOPIC SYLLABLE SA*/
+ RTUNI_ALPHA, /* U+001231: ETHIOPIC SYLLABLE SU*/
+ RTUNI_ALPHA, /* U+001232: ETHIOPIC SYLLABLE SI*/
+ RTUNI_ALPHA, /* U+001233: ETHIOPIC SYLLABLE SAA*/
+ RTUNI_ALPHA, /* U+001234: ETHIOPIC SYLLABLE SEE*/
+ RTUNI_ALPHA, /* U+001235: ETHIOPIC SYLLABLE SE*/
+ RTUNI_ALPHA, /* U+001236: ETHIOPIC SYLLABLE SO*/
+ RTUNI_ALPHA, /* U+001237: ETHIOPIC SYLLABLE SWA*/
+ RTUNI_ALPHA, /* U+001238: ETHIOPIC SYLLABLE SHA*/
+ RTUNI_ALPHA, /* U+001239: ETHIOPIC SYLLABLE SHU*/
+ RTUNI_ALPHA, /* U+00123a: ETHIOPIC SYLLABLE SHI*/
+ RTUNI_ALPHA, /* U+00123b: ETHIOPIC SYLLABLE SHAA*/
+ RTUNI_ALPHA, /* U+00123c: ETHIOPIC SYLLABLE SHEE*/
+ RTUNI_ALPHA, /* U+00123d: ETHIOPIC SYLLABLE SHE*/
+ RTUNI_ALPHA, /* U+00123e: ETHIOPIC SYLLABLE SHO*/
+ RTUNI_ALPHA, /* U+00123f: ETHIOPIC SYLLABLE SHWA*/
+ RTUNI_ALPHA, /* U+001240: ETHIOPIC SYLLABLE QA*/
+ RTUNI_ALPHA, /* U+001241: ETHIOPIC SYLLABLE QU*/
+ RTUNI_ALPHA, /* U+001242: ETHIOPIC SYLLABLE QI*/
+ RTUNI_ALPHA, /* U+001243: ETHIOPIC SYLLABLE QAA*/
+ RTUNI_ALPHA, /* U+001244: ETHIOPIC SYLLABLE QEE*/
+ RTUNI_ALPHA, /* U+001245: ETHIOPIC SYLLABLE QE*/
+ RTUNI_ALPHA, /* U+001246: ETHIOPIC SYLLABLE QO*/
+ RTUNI_ALPHA, /* U+001247: ETHIOPIC SYLLABLE QOA*/
+ RTUNI_ALPHA, /* U+001248: ETHIOPIC SYLLABLE QWA*/
+ 0, /* U+001249: */
+ RTUNI_ALPHA, /* U+00124a: ETHIOPIC SYLLABLE QWI*/
+ RTUNI_ALPHA, /* U+00124b: ETHIOPIC SYLLABLE QWAA*/
+ RTUNI_ALPHA, /* U+00124c: ETHIOPIC SYLLABLE QWEE*/
+ RTUNI_ALPHA, /* U+00124d: ETHIOPIC SYLLABLE QWE*/
+ 0, /* U+00124e: */
+ 0, /* U+00124f: */
+ RTUNI_ALPHA, /* U+001250: ETHIOPIC SYLLABLE QHA*/
+ RTUNI_ALPHA, /* U+001251: ETHIOPIC SYLLABLE QHU*/
+ RTUNI_ALPHA, /* U+001252: ETHIOPIC SYLLABLE QHI*/
+ RTUNI_ALPHA, /* U+001253: ETHIOPIC SYLLABLE QHAA*/
+ RTUNI_ALPHA, /* U+001254: ETHIOPIC SYLLABLE QHEE*/
+ RTUNI_ALPHA, /* U+001255: ETHIOPIC SYLLABLE QHE*/
+ RTUNI_ALPHA, /* U+001256: ETHIOPIC SYLLABLE QHO*/
+ 0, /* U+001257: */
+ RTUNI_ALPHA, /* U+001258: ETHIOPIC SYLLABLE QHWA*/
+ 0, /* U+001259: */
+ RTUNI_ALPHA, /* U+00125a: ETHIOPIC SYLLABLE QHWI*/
+ RTUNI_ALPHA, /* U+00125b: ETHIOPIC SYLLABLE QHWAA*/
+ RTUNI_ALPHA, /* U+00125c: ETHIOPIC SYLLABLE QHWEE*/
+ RTUNI_ALPHA, /* U+00125d: ETHIOPIC SYLLABLE QHWE*/
+ 0, /* U+00125e: */
+ 0, /* U+00125f: */
+ RTUNI_ALPHA, /* U+001260: ETHIOPIC SYLLABLE BA*/
+ RTUNI_ALPHA, /* U+001261: ETHIOPIC SYLLABLE BU*/
+ RTUNI_ALPHA, /* U+001262: ETHIOPIC SYLLABLE BI*/
+ RTUNI_ALPHA, /* U+001263: ETHIOPIC SYLLABLE BAA*/
+ RTUNI_ALPHA, /* U+001264: ETHIOPIC SYLLABLE BEE*/
+ RTUNI_ALPHA, /* U+001265: ETHIOPIC SYLLABLE BE*/
+ RTUNI_ALPHA, /* U+001266: ETHIOPIC SYLLABLE BO*/
+ RTUNI_ALPHA, /* U+001267: ETHIOPIC SYLLABLE BWA*/
+ RTUNI_ALPHA, /* U+001268: ETHIOPIC SYLLABLE VA*/
+ RTUNI_ALPHA, /* U+001269: ETHIOPIC SYLLABLE VU*/
+ RTUNI_ALPHA, /* U+00126a: ETHIOPIC SYLLABLE VI*/
+ RTUNI_ALPHA, /* U+00126b: ETHIOPIC SYLLABLE VAA*/
+ RTUNI_ALPHA, /* U+00126c: ETHIOPIC SYLLABLE VEE*/
+ RTUNI_ALPHA, /* U+00126d: ETHIOPIC SYLLABLE VE*/
+ RTUNI_ALPHA, /* U+00126e: ETHIOPIC SYLLABLE VO*/
+ RTUNI_ALPHA, /* U+00126f: ETHIOPIC SYLLABLE VWA*/
+ RTUNI_ALPHA, /* U+001270: ETHIOPIC SYLLABLE TA*/
+ RTUNI_ALPHA, /* U+001271: ETHIOPIC SYLLABLE TU*/
+ RTUNI_ALPHA, /* U+001272: ETHIOPIC SYLLABLE TI*/
+ RTUNI_ALPHA, /* U+001273: ETHIOPIC SYLLABLE TAA*/
+ RTUNI_ALPHA, /* U+001274: ETHIOPIC SYLLABLE TEE*/
+ RTUNI_ALPHA, /* U+001275: ETHIOPIC SYLLABLE TE*/
+ RTUNI_ALPHA, /* U+001276: ETHIOPIC SYLLABLE TO*/
+ RTUNI_ALPHA, /* U+001277: ETHIOPIC SYLLABLE TWA*/
+ RTUNI_ALPHA, /* U+001278: ETHIOPIC SYLLABLE CA*/
+ RTUNI_ALPHA, /* U+001279: ETHIOPIC SYLLABLE CU*/
+ RTUNI_ALPHA, /* U+00127a: ETHIOPIC SYLLABLE CI*/
+ RTUNI_ALPHA, /* U+00127b: ETHIOPIC SYLLABLE CAA*/
+ RTUNI_ALPHA, /* U+00127c: ETHIOPIC SYLLABLE CEE*/
+ RTUNI_ALPHA, /* U+00127d: ETHIOPIC SYLLABLE CE*/
+ RTUNI_ALPHA, /* U+00127e: ETHIOPIC SYLLABLE CO*/
+ RTUNI_ALPHA, /* U+00127f: ETHIOPIC SYLLABLE CWA*/
+ RTUNI_ALPHA, /* U+001280: ETHIOPIC SYLLABLE XA*/
+ RTUNI_ALPHA, /* U+001281: ETHIOPIC SYLLABLE XU*/
+ RTUNI_ALPHA, /* U+001282: ETHIOPIC SYLLABLE XI*/
+ RTUNI_ALPHA, /* U+001283: ETHIOPIC SYLLABLE XAA*/
+ RTUNI_ALPHA, /* U+001284: ETHIOPIC SYLLABLE XEE*/
+ RTUNI_ALPHA, /* U+001285: ETHIOPIC SYLLABLE XE*/
+ RTUNI_ALPHA, /* U+001286: ETHIOPIC SYLLABLE XO*/
+ RTUNI_ALPHA, /* U+001287: ETHIOPIC SYLLABLE XOA*/
+ RTUNI_ALPHA, /* U+001288: ETHIOPIC SYLLABLE XWA*/
+ 0, /* U+001289: */
+ RTUNI_ALPHA, /* U+00128a: ETHIOPIC SYLLABLE XWI*/
+ RTUNI_ALPHA, /* U+00128b: ETHIOPIC SYLLABLE XWAA*/
+ RTUNI_ALPHA, /* U+00128c: ETHIOPIC SYLLABLE XWEE*/
+ RTUNI_ALPHA, /* U+00128d: ETHIOPIC SYLLABLE XWE*/
+ 0, /* U+00128e: */
+ 0, /* U+00128f: */
+ RTUNI_ALPHA, /* U+001290: ETHIOPIC SYLLABLE NA*/
+ RTUNI_ALPHA, /* U+001291: ETHIOPIC SYLLABLE NU*/
+ RTUNI_ALPHA, /* U+001292: ETHIOPIC SYLLABLE NI*/
+ RTUNI_ALPHA, /* U+001293: ETHIOPIC SYLLABLE NAA*/
+ RTUNI_ALPHA, /* U+001294: ETHIOPIC SYLLABLE NEE*/
+ RTUNI_ALPHA, /* U+001295: ETHIOPIC SYLLABLE NE*/
+ RTUNI_ALPHA, /* U+001296: ETHIOPIC SYLLABLE NO*/
+ RTUNI_ALPHA, /* U+001297: ETHIOPIC SYLLABLE NWA*/
+ RTUNI_ALPHA, /* U+001298: ETHIOPIC SYLLABLE NYA*/
+ RTUNI_ALPHA, /* U+001299: ETHIOPIC SYLLABLE NYU*/
+ RTUNI_ALPHA, /* U+00129a: ETHIOPIC SYLLABLE NYI*/
+ RTUNI_ALPHA, /* U+00129b: ETHIOPIC SYLLABLE NYAA*/
+ RTUNI_ALPHA, /* U+00129c: ETHIOPIC SYLLABLE NYEE*/
+ RTUNI_ALPHA, /* U+00129d: ETHIOPIC SYLLABLE NYE*/
+ RTUNI_ALPHA, /* U+00129e: ETHIOPIC SYLLABLE NYO*/
+ RTUNI_ALPHA, /* U+00129f: ETHIOPIC SYLLABLE NYWA*/
+ RTUNI_ALPHA, /* U+0012a0: ETHIOPIC SYLLABLE GLOTTAL A*/
+ RTUNI_ALPHA, /* U+0012a1: ETHIOPIC SYLLABLE GLOTTAL U*/
+ RTUNI_ALPHA, /* U+0012a2: ETHIOPIC SYLLABLE GLOTTAL I*/
+ RTUNI_ALPHA, /* U+0012a3: ETHIOPIC SYLLABLE GLOTTAL AA*/
+ RTUNI_ALPHA, /* U+0012a4: ETHIOPIC SYLLABLE GLOTTAL EE*/
+ RTUNI_ALPHA, /* U+0012a5: ETHIOPIC SYLLABLE GLOTTAL E*/
+ RTUNI_ALPHA, /* U+0012a6: ETHIOPIC SYLLABLE GLOTTAL O*/
+ RTUNI_ALPHA, /* U+0012a7: ETHIOPIC SYLLABLE GLOTTAL WA*/
+ RTUNI_ALPHA, /* U+0012a8: ETHIOPIC SYLLABLE KA*/
+ RTUNI_ALPHA, /* U+0012a9: ETHIOPIC SYLLABLE KU*/
+ RTUNI_ALPHA, /* U+0012aa: ETHIOPIC SYLLABLE KI*/
+ RTUNI_ALPHA, /* U+0012ab: ETHIOPIC SYLLABLE KAA*/
+ RTUNI_ALPHA, /* U+0012ac: ETHIOPIC SYLLABLE KEE*/
+ RTUNI_ALPHA, /* U+0012ad: ETHIOPIC SYLLABLE KE*/
+ RTUNI_ALPHA, /* U+0012ae: ETHIOPIC SYLLABLE KO*/
+ RTUNI_ALPHA, /* U+0012af: ETHIOPIC SYLLABLE KOA*/
+ RTUNI_ALPHA, /* U+0012b0: ETHIOPIC SYLLABLE KWA*/
+ 0, /* U+0012b1: */
+ RTUNI_ALPHA, /* U+0012b2: ETHIOPIC SYLLABLE KWI*/
+ RTUNI_ALPHA, /* U+0012b3: ETHIOPIC SYLLABLE KWAA*/
+ RTUNI_ALPHA, /* U+0012b4: ETHIOPIC SYLLABLE KWEE*/
+ RTUNI_ALPHA, /* U+0012b5: ETHIOPIC SYLLABLE KWE*/
+ 0, /* U+0012b6: */
+ 0, /* U+0012b7: */
+ RTUNI_ALPHA, /* U+0012b8: ETHIOPIC SYLLABLE KXA*/
+ RTUNI_ALPHA, /* U+0012b9: ETHIOPIC SYLLABLE KXU*/
+ RTUNI_ALPHA, /* U+0012ba: ETHIOPIC SYLLABLE KXI*/
+ RTUNI_ALPHA, /* U+0012bb: ETHIOPIC SYLLABLE KXAA*/
+ RTUNI_ALPHA, /* U+0012bc: ETHIOPIC SYLLABLE KXEE*/
+ RTUNI_ALPHA, /* U+0012bd: ETHIOPIC SYLLABLE KXE*/
+ RTUNI_ALPHA, /* U+0012be: ETHIOPIC SYLLABLE KXO*/
+ 0, /* U+0012bf: */
+ RTUNI_ALPHA, /* U+0012c0: ETHIOPIC SYLLABLE KXWA*/
+ 0, /* U+0012c1: */
+ RTUNI_ALPHA, /* U+0012c2: ETHIOPIC SYLLABLE KXWI*/
+ RTUNI_ALPHA, /* U+0012c3: ETHIOPIC SYLLABLE KXWAA*/
+ RTUNI_ALPHA, /* U+0012c4: ETHIOPIC SYLLABLE KXWEE*/
+ RTUNI_ALPHA, /* U+0012c5: ETHIOPIC SYLLABLE KXWE*/
+ 0, /* U+0012c6: */
+ 0, /* U+0012c7: */
+ RTUNI_ALPHA, /* U+0012c8: ETHIOPIC SYLLABLE WA*/
+ RTUNI_ALPHA, /* U+0012c9: ETHIOPIC SYLLABLE WU*/
+ RTUNI_ALPHA, /* U+0012ca: ETHIOPIC SYLLABLE WI*/
+ RTUNI_ALPHA, /* U+0012cb: ETHIOPIC SYLLABLE WAA*/
+ RTUNI_ALPHA, /* U+0012cc: ETHIOPIC SYLLABLE WEE*/
+ RTUNI_ALPHA, /* U+0012cd: ETHIOPIC SYLLABLE WE*/
+ RTUNI_ALPHA, /* U+0012ce: ETHIOPIC SYLLABLE WO*/
+ RTUNI_ALPHA, /* U+0012cf: ETHIOPIC SYLLABLE WOA*/
+ RTUNI_ALPHA, /* U+0012d0: ETHIOPIC SYLLABLE PHARYNGEAL A*/
+ RTUNI_ALPHA, /* U+0012d1: ETHIOPIC SYLLABLE PHARYNGEAL U*/
+ RTUNI_ALPHA, /* U+0012d2: ETHIOPIC SYLLABLE PHARYNGEAL I*/
+ RTUNI_ALPHA, /* U+0012d3: ETHIOPIC SYLLABLE PHARYNGEAL AA*/
+ RTUNI_ALPHA, /* U+0012d4: ETHIOPIC SYLLABLE PHARYNGEAL EE*/
+ RTUNI_ALPHA, /* U+0012d5: ETHIOPIC SYLLABLE PHARYNGEAL E*/
+ RTUNI_ALPHA, /* U+0012d6: ETHIOPIC SYLLABLE PHARYNGEAL O*/
+ 0, /* U+0012d7: */
+ RTUNI_ALPHA, /* U+0012d8: ETHIOPIC SYLLABLE ZA*/
+ RTUNI_ALPHA, /* U+0012d9: ETHIOPIC SYLLABLE ZU*/
+ RTUNI_ALPHA, /* U+0012da: ETHIOPIC SYLLABLE ZI*/
+ RTUNI_ALPHA, /* U+0012db: ETHIOPIC SYLLABLE ZAA*/
+ RTUNI_ALPHA, /* U+0012dc: ETHIOPIC SYLLABLE ZEE*/
+ RTUNI_ALPHA, /* U+0012dd: ETHIOPIC SYLLABLE ZE*/
+ RTUNI_ALPHA, /* U+0012de: ETHIOPIC SYLLABLE ZO*/
+ RTUNI_ALPHA, /* U+0012df: ETHIOPIC SYLLABLE ZWA*/
+ RTUNI_ALPHA, /* U+0012e0: ETHIOPIC SYLLABLE ZHA*/
+ RTUNI_ALPHA, /* U+0012e1: ETHIOPIC SYLLABLE ZHU*/
+ RTUNI_ALPHA, /* U+0012e2: ETHIOPIC SYLLABLE ZHI*/
+ RTUNI_ALPHA, /* U+0012e3: ETHIOPIC SYLLABLE ZHAA*/
+ RTUNI_ALPHA, /* U+0012e4: ETHIOPIC SYLLABLE ZHEE*/
+ RTUNI_ALPHA, /* U+0012e5: ETHIOPIC SYLLABLE ZHE*/
+ RTUNI_ALPHA, /* U+0012e6: ETHIOPIC SYLLABLE ZHO*/
+ RTUNI_ALPHA, /* U+0012e7: ETHIOPIC SYLLABLE ZHWA*/
+ RTUNI_ALPHA, /* U+0012e8: ETHIOPIC SYLLABLE YA*/
+ RTUNI_ALPHA, /* U+0012e9: ETHIOPIC SYLLABLE YU*/
+ RTUNI_ALPHA, /* U+0012ea: ETHIOPIC SYLLABLE YI*/
+ RTUNI_ALPHA, /* U+0012eb: ETHIOPIC SYLLABLE YAA*/
+ RTUNI_ALPHA, /* U+0012ec: ETHIOPIC SYLLABLE YEE*/
+ RTUNI_ALPHA, /* U+0012ed: ETHIOPIC SYLLABLE YE*/
+ RTUNI_ALPHA, /* U+0012ee: ETHIOPIC SYLLABLE YO*/
+ RTUNI_ALPHA, /* U+0012ef: ETHIOPIC SYLLABLE YOA*/
+ RTUNI_ALPHA, /* U+0012f0: ETHIOPIC SYLLABLE DA*/
+ RTUNI_ALPHA, /* U+0012f1: ETHIOPIC SYLLABLE DU*/
+ RTUNI_ALPHA, /* U+0012f2: ETHIOPIC SYLLABLE DI*/
+ RTUNI_ALPHA, /* U+0012f3: ETHIOPIC SYLLABLE DAA*/
+ RTUNI_ALPHA, /* U+0012f4: ETHIOPIC SYLLABLE DEE*/
+ RTUNI_ALPHA, /* U+0012f5: ETHIOPIC SYLLABLE DE*/
+ RTUNI_ALPHA, /* U+0012f6: ETHIOPIC SYLLABLE DO*/
+ RTUNI_ALPHA, /* U+0012f7: ETHIOPIC SYLLABLE DWA*/
+ RTUNI_ALPHA, /* U+0012f8: ETHIOPIC SYLLABLE DDA*/
+ RTUNI_ALPHA, /* U+0012f9: ETHIOPIC SYLLABLE DDU*/
+ RTUNI_ALPHA, /* U+0012fa: ETHIOPIC SYLLABLE DDI*/
+ RTUNI_ALPHA, /* U+0012fb: ETHIOPIC SYLLABLE DDAA*/
+ RTUNI_ALPHA, /* U+0012fc: ETHIOPIC SYLLABLE DDEE*/
+ RTUNI_ALPHA, /* U+0012fd: ETHIOPIC SYLLABLE DDE*/
+ RTUNI_ALPHA, /* U+0012fe: ETHIOPIC SYLLABLE DDO*/
+ RTUNI_ALPHA, /* U+0012ff: ETHIOPIC SYLLABLE DDWA*/
+ RTUNI_ALPHA, /* U+001300: ETHIOPIC SYLLABLE JA*/
+ RTUNI_ALPHA, /* U+001301: ETHIOPIC SYLLABLE JU*/
+ RTUNI_ALPHA, /* U+001302: ETHIOPIC SYLLABLE JI*/
+ RTUNI_ALPHA, /* U+001303: ETHIOPIC SYLLABLE JAA*/
+ RTUNI_ALPHA, /* U+001304: ETHIOPIC SYLLABLE JEE*/
+ RTUNI_ALPHA, /* U+001305: ETHIOPIC SYLLABLE JE*/
+ RTUNI_ALPHA, /* U+001306: ETHIOPIC SYLLABLE JO*/
+ RTUNI_ALPHA, /* U+001307: ETHIOPIC SYLLABLE JWA*/
+ RTUNI_ALPHA, /* U+001308: ETHIOPIC SYLLABLE GA*/
+ RTUNI_ALPHA, /* U+001309: ETHIOPIC SYLLABLE GU*/
+ RTUNI_ALPHA, /* U+00130a: ETHIOPIC SYLLABLE GI*/
+ RTUNI_ALPHA, /* U+00130b: ETHIOPIC SYLLABLE GAA*/
+ RTUNI_ALPHA, /* U+00130c: ETHIOPIC SYLLABLE GEE*/
+ RTUNI_ALPHA, /* U+00130d: ETHIOPIC SYLLABLE GE*/
+ RTUNI_ALPHA, /* U+00130e: ETHIOPIC SYLLABLE GO*/
+ RTUNI_ALPHA, /* U+00130f: ETHIOPIC SYLLABLE GOA*/
+ RTUNI_ALPHA, /* U+001310: ETHIOPIC SYLLABLE GWA*/
+ 0, /* U+001311: */
+ RTUNI_ALPHA, /* U+001312: ETHIOPIC SYLLABLE GWI*/
+ RTUNI_ALPHA, /* U+001313: ETHIOPIC SYLLABLE GWAA*/
+ RTUNI_ALPHA, /* U+001314: ETHIOPIC SYLLABLE GWEE*/
+ RTUNI_ALPHA, /* U+001315: ETHIOPIC SYLLABLE GWE*/
+ 0, /* U+001316: */
+ 0, /* U+001317: */
+ RTUNI_ALPHA, /* U+001318: ETHIOPIC SYLLABLE GGA*/
+ RTUNI_ALPHA, /* U+001319: ETHIOPIC SYLLABLE GGU*/
+ RTUNI_ALPHA, /* U+00131a: ETHIOPIC SYLLABLE GGI*/
+ RTUNI_ALPHA, /* U+00131b: ETHIOPIC SYLLABLE GGAA*/
+ RTUNI_ALPHA, /* U+00131c: ETHIOPIC SYLLABLE GGEE*/
+ RTUNI_ALPHA, /* U+00131d: ETHIOPIC SYLLABLE GGE*/
+ RTUNI_ALPHA, /* U+00131e: ETHIOPIC SYLLABLE GGO*/
+ RTUNI_ALPHA, /* U+00131f: ETHIOPIC SYLLABLE GGWAA*/
+ RTUNI_ALPHA, /* U+001320: ETHIOPIC SYLLABLE THA*/
+ RTUNI_ALPHA, /* U+001321: ETHIOPIC SYLLABLE THU*/
+ RTUNI_ALPHA, /* U+001322: ETHIOPIC SYLLABLE THI*/
+ RTUNI_ALPHA, /* U+001323: ETHIOPIC SYLLABLE THAA*/
+ RTUNI_ALPHA, /* U+001324: ETHIOPIC SYLLABLE THEE*/
+ RTUNI_ALPHA, /* U+001325: ETHIOPIC SYLLABLE THE*/
+ RTUNI_ALPHA, /* U+001326: ETHIOPIC SYLLABLE THO*/
+ RTUNI_ALPHA, /* U+001327: ETHIOPIC SYLLABLE THWA*/
+ RTUNI_ALPHA, /* U+001328: ETHIOPIC SYLLABLE CHA*/
+ RTUNI_ALPHA, /* U+001329: ETHIOPIC SYLLABLE CHU*/
+ RTUNI_ALPHA, /* U+00132a: ETHIOPIC SYLLABLE CHI*/
+ RTUNI_ALPHA, /* U+00132b: ETHIOPIC SYLLABLE CHAA*/
+ RTUNI_ALPHA, /* U+00132c: ETHIOPIC SYLLABLE CHEE*/
+ RTUNI_ALPHA, /* U+00132d: ETHIOPIC SYLLABLE CHE*/
+ RTUNI_ALPHA, /* U+00132e: ETHIOPIC SYLLABLE CHO*/
+ RTUNI_ALPHA, /* U+00132f: ETHIOPIC SYLLABLE CHWA*/
+ RTUNI_ALPHA, /* U+001330: ETHIOPIC SYLLABLE PHA*/
+ RTUNI_ALPHA, /* U+001331: ETHIOPIC SYLLABLE PHU*/
+ RTUNI_ALPHA, /* U+001332: ETHIOPIC SYLLABLE PHI*/
+ RTUNI_ALPHA, /* U+001333: ETHIOPIC SYLLABLE PHAA*/
+ RTUNI_ALPHA, /* U+001334: ETHIOPIC SYLLABLE PHEE*/
+ RTUNI_ALPHA, /* U+001335: ETHIOPIC SYLLABLE PHE*/
+ RTUNI_ALPHA, /* U+001336: ETHIOPIC SYLLABLE PHO*/
+ RTUNI_ALPHA, /* U+001337: ETHIOPIC SYLLABLE PHWA*/
+ RTUNI_ALPHA, /* U+001338: ETHIOPIC SYLLABLE TSA*/
+ RTUNI_ALPHA, /* U+001339: ETHIOPIC SYLLABLE TSU*/
+ RTUNI_ALPHA, /* U+00133a: ETHIOPIC SYLLABLE TSI*/
+ RTUNI_ALPHA, /* U+00133b: ETHIOPIC SYLLABLE TSAA*/
+ RTUNI_ALPHA, /* U+00133c: ETHIOPIC SYLLABLE TSEE*/
+ RTUNI_ALPHA, /* U+00133d: ETHIOPIC SYLLABLE TSE*/
+ RTUNI_ALPHA, /* U+00133e: ETHIOPIC SYLLABLE TSO*/
+ RTUNI_ALPHA, /* U+00133f: ETHIOPIC SYLLABLE TSWA*/
+ RTUNI_ALPHA, /* U+001340: ETHIOPIC SYLLABLE TZA*/
+ RTUNI_ALPHA, /* U+001341: ETHIOPIC SYLLABLE TZU*/
+ RTUNI_ALPHA, /* U+001342: ETHIOPIC SYLLABLE TZI*/
+ RTUNI_ALPHA, /* U+001343: ETHIOPIC SYLLABLE TZAA*/
+ RTUNI_ALPHA, /* U+001344: ETHIOPIC SYLLABLE TZEE*/
+ RTUNI_ALPHA, /* U+001345: ETHIOPIC SYLLABLE TZE*/
+ RTUNI_ALPHA, /* U+001346: ETHIOPIC SYLLABLE TZO*/
+ RTUNI_ALPHA, /* U+001347: ETHIOPIC SYLLABLE TZOA*/
+ RTUNI_ALPHA, /* U+001348: ETHIOPIC SYLLABLE FA*/
+ RTUNI_ALPHA, /* U+001349: ETHIOPIC SYLLABLE FU*/
+ RTUNI_ALPHA, /* U+00134a: ETHIOPIC SYLLABLE FI*/
+ RTUNI_ALPHA, /* U+00134b: ETHIOPIC SYLLABLE FAA*/
+ RTUNI_ALPHA, /* U+00134c: ETHIOPIC SYLLABLE FEE*/
+ RTUNI_ALPHA, /* U+00134d: ETHIOPIC SYLLABLE FE*/
+ RTUNI_ALPHA, /* U+00134e: ETHIOPIC SYLLABLE FO*/
+ RTUNI_ALPHA, /* U+00134f: ETHIOPIC SYLLABLE FWA*/
+ RTUNI_ALPHA, /* U+001350: ETHIOPIC SYLLABLE PA*/
+ RTUNI_ALPHA, /* U+001351: ETHIOPIC SYLLABLE PU*/
+ RTUNI_ALPHA, /* U+001352: ETHIOPIC SYLLABLE PI*/
+ RTUNI_ALPHA, /* U+001353: ETHIOPIC SYLLABLE PAA*/
+ RTUNI_ALPHA, /* U+001354: ETHIOPIC SYLLABLE PEE*/
+ RTUNI_ALPHA, /* U+001355: ETHIOPIC SYLLABLE PE*/
+ RTUNI_ALPHA, /* U+001356: ETHIOPIC SYLLABLE PO*/
+ RTUNI_ALPHA, /* U+001357: ETHIOPIC SYLLABLE PWA*/
+ RTUNI_ALPHA, /* U+001358: ETHIOPIC SYLLABLE RYA*/
+ RTUNI_ALPHA, /* U+001359: ETHIOPIC SYLLABLE MYA*/
+ RTUNI_ALPHA, /* U+00135a: ETHIOPIC SYLLABLE FYA*/
+ 0, /* U+00135b: */
+ 0, /* U+00135c: */
+ 0, /* U+00135d: ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK*/
+ 0, /* U+00135e: ETHIOPIC COMBINING VOWEL LENGTH MARK*/
+ RTUNI_ALPHA, /* U+00135f: ETHIOPIC COMBINING GEMINATION MARK*/
+ 0, /* U+001360: ETHIOPIC SECTION MARK*/
+ 0, /* U+001361: ETHIOPIC WORDSPACE*/
+ 0, /* U+001362: ETHIOPIC FULL STOP*/
+ 0, /* U+001363: ETHIOPIC COMMA*/
+ 0, /* U+001364: ETHIOPIC SEMICOLON*/
+ 0, /* U+001365: ETHIOPIC COLON*/
+ 0, /* U+001366: ETHIOPIC PREFACE COLON*/
+ 0, /* U+001367: ETHIOPIC QUESTION MARK*/
+ 0, /* U+001368: ETHIOPIC PARAGRAPH SEPARATOR*/
+ 0, /* U+001369: ETHIOPIC DIGIT ONE*/
+ 0, /* U+00136a: ETHIOPIC DIGIT TWO*/
+ 0, /* U+00136b: ETHIOPIC DIGIT THREE*/
+ 0, /* U+00136c: ETHIOPIC DIGIT FOUR*/
+ 0, /* U+00136d: ETHIOPIC DIGIT FIVE*/
+ 0, /* U+00136e: ETHIOPIC DIGIT SIX*/
+ 0, /* U+00136f: ETHIOPIC DIGIT SEVEN*/
+ 0, /* U+001370: ETHIOPIC DIGIT EIGHT*/
+ 0, /* U+001371: ETHIOPIC DIGIT NINE*/
+ 0, /* U+001372: ETHIOPIC NUMBER TEN*/
+ 0, /* U+001373: ETHIOPIC NUMBER TWENTY*/
+ 0, /* U+001374: ETHIOPIC NUMBER THIRTY*/
+ 0, /* U+001375: ETHIOPIC NUMBER FORTY*/
+ 0, /* U+001376: ETHIOPIC NUMBER FIFTY*/
+ 0, /* U+001377: ETHIOPIC NUMBER SIXTY*/
+ 0, /* U+001378: ETHIOPIC NUMBER SEVENTY*/
+ 0, /* U+001379: ETHIOPIC NUMBER EIGHTY*/
+ 0, /* U+00137a: ETHIOPIC NUMBER NINETY*/
+ 0, /* U+00137b: ETHIOPIC NUMBER HUNDRED*/
+ 0, /* U+00137c: ETHIOPIC NUMBER TEN THOUSAND*/
+ 0, /* U+00137d: */
+ 0, /* U+00137e: */
+ 0, /* U+00137f: */
+ RTUNI_ALPHA, /* U+001380: ETHIOPIC SYLLABLE SEBATBEIT MWA*/
+ RTUNI_ALPHA, /* U+001381: ETHIOPIC SYLLABLE MWI*/
+ RTUNI_ALPHA, /* U+001382: ETHIOPIC SYLLABLE MWEE*/
+ RTUNI_ALPHA, /* U+001383: ETHIOPIC SYLLABLE MWE*/
+ RTUNI_ALPHA, /* U+001384: ETHIOPIC SYLLABLE SEBATBEIT BWA*/
+ RTUNI_ALPHA, /* U+001385: ETHIOPIC SYLLABLE BWI*/
+ RTUNI_ALPHA, /* U+001386: ETHIOPIC SYLLABLE BWEE*/
+ RTUNI_ALPHA, /* U+001387: ETHIOPIC SYLLABLE BWE*/
+ RTUNI_ALPHA, /* U+001388: ETHIOPIC SYLLABLE SEBATBEIT FWA*/
+ RTUNI_ALPHA, /* U+001389: ETHIOPIC SYLLABLE FWI*/
+ RTUNI_ALPHA, /* U+00138a: ETHIOPIC SYLLABLE FWEE*/
+ RTUNI_ALPHA, /* U+00138b: ETHIOPIC SYLLABLE FWE*/
+ RTUNI_ALPHA, /* U+00138c: ETHIOPIC SYLLABLE SEBATBEIT PWA*/
+ RTUNI_ALPHA, /* U+00138d: ETHIOPIC SYLLABLE PWI*/
+ RTUNI_ALPHA, /* U+00138e: ETHIOPIC SYLLABLE PWEE*/
+ RTUNI_ALPHA, /* U+00138f: ETHIOPIC SYLLABLE PWE*/
+ 0, /* U+001390: ETHIOPIC TONAL MARK YIZET*/
+ 0, /* U+001391: ETHIOPIC TONAL MARK DERET*/
+ 0, /* U+001392: ETHIOPIC TONAL MARK RIKRIK*/
+ 0, /* U+001393: ETHIOPIC TONAL MARK SHORT RIKRIK*/
+ 0, /* U+001394: ETHIOPIC TONAL MARK DIFAT*/
+ 0, /* U+001395: ETHIOPIC TONAL MARK KENAT*/
+ 0, /* U+001396: ETHIOPIC TONAL MARK CHIRET*/
+ 0, /* U+001397: ETHIOPIC TONAL MARK HIDET*/
+ 0, /* U+001398: ETHIOPIC TONAL MARK DERET-HIDET*/
+ 0, /* U+001399: ETHIOPIC TONAL MARK KURT*/
+ 0, /* U+00139a: */
+ 0, /* U+00139b: */
+ 0, /* U+00139c: */
+ 0, /* U+00139d: */
+ 0, /* U+00139e: */
+ 0, /* U+00139f: */
+ RTUNI_ALPHA, /* U+0013a0: CHEROKEE LETTER A*/
+ RTUNI_ALPHA, /* U+0013a1: CHEROKEE LETTER E*/
+ RTUNI_ALPHA, /* U+0013a2: CHEROKEE LETTER I*/
+ RTUNI_ALPHA, /* U+0013a3: CHEROKEE LETTER O*/
+ RTUNI_ALPHA, /* U+0013a4: CHEROKEE LETTER U*/
+ RTUNI_ALPHA, /* U+0013a5: CHEROKEE LETTER V*/
+ RTUNI_ALPHA, /* U+0013a6: CHEROKEE LETTER GA*/
+ RTUNI_ALPHA, /* U+0013a7: CHEROKEE LETTER KA*/
+ RTUNI_ALPHA, /* U+0013a8: CHEROKEE LETTER GE*/
+ RTUNI_ALPHA, /* U+0013a9: CHEROKEE LETTER GI*/
+ RTUNI_ALPHA, /* U+0013aa: CHEROKEE LETTER GO*/
+ RTUNI_ALPHA, /* U+0013ab: CHEROKEE LETTER GU*/
+ RTUNI_ALPHA, /* U+0013ac: CHEROKEE LETTER GV*/
+ RTUNI_ALPHA, /* U+0013ad: CHEROKEE LETTER HA*/
+ RTUNI_ALPHA, /* U+0013ae: CHEROKEE LETTER HE*/
+ RTUNI_ALPHA, /* U+0013af: CHEROKEE LETTER HI*/
+ RTUNI_ALPHA, /* U+0013b0: CHEROKEE LETTER HO*/
+ RTUNI_ALPHA, /* U+0013b1: CHEROKEE LETTER HU*/
+ RTUNI_ALPHA, /* U+0013b2: CHEROKEE LETTER HV*/
+ RTUNI_ALPHA, /* U+0013b3: CHEROKEE LETTER LA*/
+ RTUNI_ALPHA, /* U+0013b4: CHEROKEE LETTER LE*/
+ RTUNI_ALPHA, /* U+0013b5: CHEROKEE LETTER LI*/
+ RTUNI_ALPHA, /* U+0013b6: CHEROKEE LETTER LO*/
+ RTUNI_ALPHA, /* U+0013b7: CHEROKEE LETTER LU*/
+ RTUNI_ALPHA, /* U+0013b8: CHEROKEE LETTER LV*/
+ RTUNI_ALPHA, /* U+0013b9: CHEROKEE LETTER MA*/
+ RTUNI_ALPHA, /* U+0013ba: CHEROKEE LETTER ME*/
+ RTUNI_ALPHA, /* U+0013bb: CHEROKEE LETTER MI*/
+ RTUNI_ALPHA, /* U+0013bc: CHEROKEE LETTER MO*/
+ RTUNI_ALPHA, /* U+0013bd: CHEROKEE LETTER MU*/
+ RTUNI_ALPHA, /* U+0013be: CHEROKEE LETTER NA*/
+ RTUNI_ALPHA, /* U+0013bf: CHEROKEE LETTER HNA*/
+ RTUNI_ALPHA, /* U+0013c0: CHEROKEE LETTER NAH*/
+ RTUNI_ALPHA, /* U+0013c1: CHEROKEE LETTER NE*/
+ RTUNI_ALPHA, /* U+0013c2: CHEROKEE LETTER NI*/
+ RTUNI_ALPHA, /* U+0013c3: CHEROKEE LETTER NO*/
+ RTUNI_ALPHA, /* U+0013c4: CHEROKEE LETTER NU*/
+ RTUNI_ALPHA, /* U+0013c5: CHEROKEE LETTER NV*/
+ RTUNI_ALPHA, /* U+0013c6: CHEROKEE LETTER QUA*/
+ RTUNI_ALPHA, /* U+0013c7: CHEROKEE LETTER QUE*/
+ RTUNI_ALPHA, /* U+0013c8: CHEROKEE LETTER QUI*/
+ RTUNI_ALPHA, /* U+0013c9: CHEROKEE LETTER QUO*/
+ RTUNI_ALPHA, /* U+0013ca: CHEROKEE LETTER QUU*/
+ RTUNI_ALPHA, /* U+0013cb: CHEROKEE LETTER QUV*/
+ RTUNI_ALPHA, /* U+0013cc: CHEROKEE LETTER SA*/
+ RTUNI_ALPHA, /* U+0013cd: CHEROKEE LETTER S*/
+ RTUNI_ALPHA, /* U+0013ce: CHEROKEE LETTER SE*/
+ RTUNI_ALPHA, /* U+0013cf: CHEROKEE LETTER SI*/
+ RTUNI_ALPHA, /* U+0013d0: CHEROKEE LETTER SO*/
+ RTUNI_ALPHA, /* U+0013d1: CHEROKEE LETTER SU*/
+ RTUNI_ALPHA, /* U+0013d2: CHEROKEE LETTER SV*/
+ RTUNI_ALPHA, /* U+0013d3: CHEROKEE LETTER DA*/
+ RTUNI_ALPHA, /* U+0013d4: CHEROKEE LETTER TA*/
+ RTUNI_ALPHA, /* U+0013d5: CHEROKEE LETTER DE*/
+ RTUNI_ALPHA, /* U+0013d6: CHEROKEE LETTER TE*/
+ RTUNI_ALPHA, /* U+0013d7: CHEROKEE LETTER DI*/
+ RTUNI_ALPHA, /* U+0013d8: CHEROKEE LETTER TI*/
+ RTUNI_ALPHA, /* U+0013d9: CHEROKEE LETTER DO*/
+ RTUNI_ALPHA, /* U+0013da: CHEROKEE LETTER DU*/
+ RTUNI_ALPHA, /* U+0013db: CHEROKEE LETTER DV*/
+ RTUNI_ALPHA, /* U+0013dc: CHEROKEE LETTER DLA*/
+ RTUNI_ALPHA, /* U+0013dd: CHEROKEE LETTER TLA*/
+ RTUNI_ALPHA, /* U+0013de: CHEROKEE LETTER TLE*/
+ RTUNI_ALPHA, /* U+0013df: CHEROKEE LETTER TLI*/
+ RTUNI_ALPHA, /* U+0013e0: CHEROKEE LETTER TLO*/
+ RTUNI_ALPHA, /* U+0013e1: CHEROKEE LETTER TLU*/
+ RTUNI_ALPHA, /* U+0013e2: CHEROKEE LETTER TLV*/
+ RTUNI_ALPHA, /* U+0013e3: CHEROKEE LETTER TSA*/
+ RTUNI_ALPHA, /* U+0013e4: CHEROKEE LETTER TSE*/
+ RTUNI_ALPHA, /* U+0013e5: CHEROKEE LETTER TSI*/
+ RTUNI_ALPHA, /* U+0013e6: CHEROKEE LETTER TSO*/
+ RTUNI_ALPHA, /* U+0013e7: CHEROKEE LETTER TSU*/
+ RTUNI_ALPHA, /* U+0013e8: CHEROKEE LETTER TSV*/
+ RTUNI_ALPHA, /* U+0013e9: CHEROKEE LETTER WA*/
+ RTUNI_ALPHA, /* U+0013ea: CHEROKEE LETTER WE*/
+ RTUNI_ALPHA, /* U+0013eb: CHEROKEE LETTER WI*/
+ RTUNI_ALPHA, /* U+0013ec: CHEROKEE LETTER WO*/
+ RTUNI_ALPHA, /* U+0013ed: CHEROKEE LETTER WU*/
+ RTUNI_ALPHA, /* U+0013ee: CHEROKEE LETTER WV*/
+ RTUNI_ALPHA, /* U+0013ef: CHEROKEE LETTER YA*/
+ RTUNI_ALPHA, /* U+0013f0: CHEROKEE LETTER YE*/
+ RTUNI_ALPHA, /* U+0013f1: CHEROKEE LETTER YI*/
+ RTUNI_ALPHA, /* U+0013f2: CHEROKEE LETTER YO*/
+ RTUNI_ALPHA, /* U+0013f3: CHEROKEE LETTER YU*/
+ RTUNI_ALPHA, /* U+0013f4: CHEROKEE LETTER YV*/
+ 0, /* U+0013f5: */
+ 0, /* U+0013f6: */
+ 0, /* U+0013f7: */
+ 0, /* U+0013f8: */
+ 0, /* U+0013f9: */
+ 0, /* U+0013fa: */
+ 0, /* U+0013fb: */
+ 0, /* U+0013fc: */
+ 0, /* U+0013fd: */
+ 0, /* U+0013fe: */
+ 0, /* U+0013ff: */
+ 0, /* U+001400: CANADIAN SYLLABICS HYPHEN*/
+ RTUNI_ALPHA, /* U+001401: CANADIAN SYLLABICS E*/
+ RTUNI_ALPHA, /* U+001402: CANADIAN SYLLABICS AAI*/
+ RTUNI_ALPHA, /* U+001403: CANADIAN SYLLABICS I*/
+ RTUNI_ALPHA, /* U+001404: CANADIAN SYLLABICS II*/
+ RTUNI_ALPHA, /* U+001405: CANADIAN SYLLABICS O*/
+ RTUNI_ALPHA, /* U+001406: CANADIAN SYLLABICS OO*/
+ RTUNI_ALPHA, /* U+001407: CANADIAN SYLLABICS Y-CREE OO*/
+ RTUNI_ALPHA, /* U+001408: CANADIAN SYLLABICS CARRIER EE*/
+ RTUNI_ALPHA, /* U+001409: CANADIAN SYLLABICS CARRIER I*/
+ RTUNI_ALPHA, /* U+00140a: CANADIAN SYLLABICS A*/
+ RTUNI_ALPHA, /* U+00140b: CANADIAN SYLLABICS AA*/
+ RTUNI_ALPHA, /* U+00140c: CANADIAN SYLLABICS WE*/
+ RTUNI_ALPHA, /* U+00140d: CANADIAN SYLLABICS WEST-CREE WE*/
+ RTUNI_ALPHA, /* U+00140e: CANADIAN SYLLABICS WI*/
+ RTUNI_ALPHA, /* U+00140f: CANADIAN SYLLABICS WEST-CREE WI*/
+ RTUNI_ALPHA, /* U+001410: CANADIAN SYLLABICS WII*/
+ RTUNI_ALPHA, /* U+001411: CANADIAN SYLLABICS WEST-CREE WII*/
+ RTUNI_ALPHA, /* U+001412: CANADIAN SYLLABICS WO*/
+ RTUNI_ALPHA, /* U+001413: CANADIAN SYLLABICS WEST-CREE WO*/
+ RTUNI_ALPHA, /* U+001414: CANADIAN SYLLABICS WOO*/
+ RTUNI_ALPHA, /* U+001415: CANADIAN SYLLABICS WEST-CREE WOO*/
+ RTUNI_ALPHA, /* U+001416: CANADIAN SYLLABICS NASKAPI WOO*/
+ RTUNI_ALPHA, /* U+001417: CANADIAN SYLLABICS WA*/
+ RTUNI_ALPHA, /* U+001418: CANADIAN SYLLABICS WEST-CREE WA*/
+ RTUNI_ALPHA, /* U+001419: CANADIAN SYLLABICS WAA*/
+ RTUNI_ALPHA, /* U+00141a: CANADIAN SYLLABICS WEST-CREE WAA*/
+ RTUNI_ALPHA, /* U+00141b: CANADIAN SYLLABICS NASKAPI WAA*/
+ RTUNI_ALPHA, /* U+00141c: CANADIAN SYLLABICS AI*/
+ RTUNI_ALPHA, /* U+00141d: CANADIAN SYLLABICS Y-CREE W*/
+ RTUNI_ALPHA, /* U+00141e: CANADIAN SYLLABICS GLOTTAL STOP*/
+ RTUNI_ALPHA, /* U+00141f: CANADIAN SYLLABICS FINAL ACUTE*/
+ RTUNI_ALPHA, /* U+001420: CANADIAN SYLLABICS FINAL GRAVE*/
+ RTUNI_ALPHA, /* U+001421: CANADIAN SYLLABICS FINAL BOTTOM HALF RING*/
+ RTUNI_ALPHA, /* U+001422: CANADIAN SYLLABICS FINAL TOP HALF RING*/
+ RTUNI_ALPHA, /* U+001423: CANADIAN SYLLABICS FINAL RIGHT HALF RING*/
+ RTUNI_ALPHA, /* U+001424: CANADIAN SYLLABICS FINAL RING*/
+ RTUNI_ALPHA, /* U+001425: CANADIAN SYLLABICS FINAL DOUBLE ACUTE*/
+ RTUNI_ALPHA, /* U+001426: CANADIAN SYLLABICS FINAL DOUBLE SHORT VERTICAL STROKES*/
+ RTUNI_ALPHA, /* U+001427: CANADIAN SYLLABICS FINAL MIDDLE DOT*/
+ RTUNI_ALPHA, /* U+001428: CANADIAN SYLLABICS FINAL SHORT HORIZONTAL STROKE*/
+ RTUNI_ALPHA, /* U+001429: CANADIAN SYLLABICS FINAL PLUS*/
+ RTUNI_ALPHA, /* U+00142a: CANADIAN SYLLABICS FINAL DOWN TACK*/
+ RTUNI_ALPHA, /* U+00142b: CANADIAN SYLLABICS EN*/
+ RTUNI_ALPHA, /* U+00142c: CANADIAN SYLLABICS IN*/
+ RTUNI_ALPHA, /* U+00142d: CANADIAN SYLLABICS ON*/
+ RTUNI_ALPHA, /* U+00142e: CANADIAN SYLLABICS AN*/
+ RTUNI_ALPHA, /* U+00142f: CANADIAN SYLLABICS PE*/
+ RTUNI_ALPHA, /* U+001430: CANADIAN SYLLABICS PAAI*/
+ RTUNI_ALPHA, /* U+001431: CANADIAN SYLLABICS PI*/
+ RTUNI_ALPHA, /* U+001432: CANADIAN SYLLABICS PII*/
+ RTUNI_ALPHA, /* U+001433: CANADIAN SYLLABICS PO*/
+ RTUNI_ALPHA, /* U+001434: CANADIAN SYLLABICS POO*/
+ RTUNI_ALPHA, /* U+001435: CANADIAN SYLLABICS Y-CREE POO*/
+ RTUNI_ALPHA, /* U+001436: CANADIAN SYLLABICS CARRIER HEE*/
+ RTUNI_ALPHA, /* U+001437: CANADIAN SYLLABICS CARRIER HI*/
+ RTUNI_ALPHA, /* U+001438: CANADIAN SYLLABICS PA*/
+ RTUNI_ALPHA, /* U+001439: CANADIAN SYLLABICS PAA*/
+ RTUNI_ALPHA, /* U+00143a: CANADIAN SYLLABICS PWE*/
+ RTUNI_ALPHA, /* U+00143b: CANADIAN SYLLABICS WEST-CREE PWE*/
+ RTUNI_ALPHA, /* U+00143c: CANADIAN SYLLABICS PWI*/
+ RTUNI_ALPHA, /* U+00143d: CANADIAN SYLLABICS WEST-CREE PWI*/
+ RTUNI_ALPHA, /* U+00143e: CANADIAN SYLLABICS PWII*/
+ RTUNI_ALPHA, /* U+00143f: CANADIAN SYLLABICS WEST-CREE PWII*/
+ RTUNI_ALPHA, /* U+001440: CANADIAN SYLLABICS PWO*/
+ RTUNI_ALPHA, /* U+001441: CANADIAN SYLLABICS WEST-CREE PWO*/
+ RTUNI_ALPHA, /* U+001442: CANADIAN SYLLABICS PWOO*/
+ RTUNI_ALPHA, /* U+001443: CANADIAN SYLLABICS WEST-CREE PWOO*/
+ RTUNI_ALPHA, /* U+001444: CANADIAN SYLLABICS PWA*/
+ RTUNI_ALPHA, /* U+001445: CANADIAN SYLLABICS WEST-CREE PWA*/
+ RTUNI_ALPHA, /* U+001446: CANADIAN SYLLABICS PWAA*/
+ RTUNI_ALPHA, /* U+001447: CANADIAN SYLLABICS WEST-CREE PWAA*/
+ RTUNI_ALPHA, /* U+001448: CANADIAN SYLLABICS Y-CREE PWAA*/
+ RTUNI_ALPHA, /* U+001449: CANADIAN SYLLABICS P*/
+ RTUNI_ALPHA, /* U+00144a: CANADIAN SYLLABICS WEST-CREE P*/
+ RTUNI_ALPHA, /* U+00144b: CANADIAN SYLLABICS CARRIER H*/
+ RTUNI_ALPHA, /* U+00144c: CANADIAN SYLLABICS TE*/
+ RTUNI_ALPHA, /* U+00144d: CANADIAN SYLLABICS TAAI*/
+ RTUNI_ALPHA, /* U+00144e: CANADIAN SYLLABICS TI*/
+ RTUNI_ALPHA, /* U+00144f: CANADIAN SYLLABICS TII*/
+ RTUNI_ALPHA, /* U+001450: CANADIAN SYLLABICS TO*/
+ RTUNI_ALPHA, /* U+001451: CANADIAN SYLLABICS TOO*/
+ RTUNI_ALPHA, /* U+001452: CANADIAN SYLLABICS Y-CREE TOO*/
+ RTUNI_ALPHA, /* U+001453: CANADIAN SYLLABICS CARRIER DEE*/
+ RTUNI_ALPHA, /* U+001454: CANADIAN SYLLABICS CARRIER DI*/
+ RTUNI_ALPHA, /* U+001455: CANADIAN SYLLABICS TA*/
+ RTUNI_ALPHA, /* U+001456: CANADIAN SYLLABICS TAA*/
+ RTUNI_ALPHA, /* U+001457: CANADIAN SYLLABICS TWE*/
+ RTUNI_ALPHA, /* U+001458: CANADIAN SYLLABICS WEST-CREE TWE*/
+ RTUNI_ALPHA, /* U+001459: CANADIAN SYLLABICS TWI*/
+ RTUNI_ALPHA, /* U+00145a: CANADIAN SYLLABICS WEST-CREE TWI*/
+ RTUNI_ALPHA, /* U+00145b: CANADIAN SYLLABICS TWII*/
+ RTUNI_ALPHA, /* U+00145c: CANADIAN SYLLABICS WEST-CREE TWII*/
+ RTUNI_ALPHA, /* U+00145d: CANADIAN SYLLABICS TWO*/
+ RTUNI_ALPHA, /* U+00145e: CANADIAN SYLLABICS WEST-CREE TWO*/
+ RTUNI_ALPHA, /* U+00145f: CANADIAN SYLLABICS TWOO*/
+ RTUNI_ALPHA, /* U+001460: CANADIAN SYLLABICS WEST-CREE TWOO*/
+ RTUNI_ALPHA, /* U+001461: CANADIAN SYLLABICS TWA*/
+ RTUNI_ALPHA, /* U+001462: CANADIAN SYLLABICS WEST-CREE TWA*/
+ RTUNI_ALPHA, /* U+001463: CANADIAN SYLLABICS TWAA*/
+ RTUNI_ALPHA, /* U+001464: CANADIAN SYLLABICS WEST-CREE TWAA*/
+ RTUNI_ALPHA, /* U+001465: CANADIAN SYLLABICS NASKAPI TWAA*/
+ RTUNI_ALPHA, /* U+001466: CANADIAN SYLLABICS T*/
+ RTUNI_ALPHA, /* U+001467: CANADIAN SYLLABICS TTE*/
+ RTUNI_ALPHA, /* U+001468: CANADIAN SYLLABICS TTI*/
+ RTUNI_ALPHA, /* U+001469: CANADIAN SYLLABICS TTO*/
+ RTUNI_ALPHA, /* U+00146a: CANADIAN SYLLABICS TTA*/
+ RTUNI_ALPHA, /* U+00146b: CANADIAN SYLLABICS KE*/
+ RTUNI_ALPHA, /* U+00146c: CANADIAN SYLLABICS KAAI*/
+ RTUNI_ALPHA, /* U+00146d: CANADIAN SYLLABICS KI*/
+ RTUNI_ALPHA, /* U+00146e: CANADIAN SYLLABICS KII*/
+ RTUNI_ALPHA, /* U+00146f: CANADIAN SYLLABICS KO*/
+ RTUNI_ALPHA, /* U+001470: CANADIAN SYLLABICS KOO*/
+ RTUNI_ALPHA, /* U+001471: CANADIAN SYLLABICS Y-CREE KOO*/
+ RTUNI_ALPHA, /* U+001472: CANADIAN SYLLABICS KA*/
+ RTUNI_ALPHA, /* U+001473: CANADIAN SYLLABICS KAA*/
+ RTUNI_ALPHA, /* U+001474: CANADIAN SYLLABICS KWE*/
+ RTUNI_ALPHA, /* U+001475: CANADIAN SYLLABICS WEST-CREE KWE*/
+ RTUNI_ALPHA, /* U+001476: CANADIAN SYLLABICS KWI*/
+ RTUNI_ALPHA, /* U+001477: CANADIAN SYLLABICS WEST-CREE KWI*/
+ RTUNI_ALPHA, /* U+001478: CANADIAN SYLLABICS KWII*/
+ RTUNI_ALPHA, /* U+001479: CANADIAN SYLLABICS WEST-CREE KWII*/
+ RTUNI_ALPHA, /* U+00147a: CANADIAN SYLLABICS KWO*/
+ RTUNI_ALPHA, /* U+00147b: CANADIAN SYLLABICS WEST-CREE KWO*/
+ RTUNI_ALPHA, /* U+00147c: CANADIAN SYLLABICS KWOO*/
+ RTUNI_ALPHA, /* U+00147d: CANADIAN SYLLABICS WEST-CREE KWOO*/
+ RTUNI_ALPHA, /* U+00147e: CANADIAN SYLLABICS KWA*/
+ RTUNI_ALPHA, /* U+00147f: CANADIAN SYLLABICS WEST-CREE KWA*/
+ RTUNI_ALPHA, /* U+001480: CANADIAN SYLLABICS KWAA*/
+ RTUNI_ALPHA, /* U+001481: CANADIAN SYLLABICS WEST-CREE KWAA*/
+ RTUNI_ALPHA, /* U+001482: CANADIAN SYLLABICS NASKAPI KWAA*/
+ RTUNI_ALPHA, /* U+001483: CANADIAN SYLLABICS K*/
+ RTUNI_ALPHA, /* U+001484: CANADIAN SYLLABICS KW*/
+ RTUNI_ALPHA, /* U+001485: CANADIAN SYLLABICS SOUTH-SLAVEY KEH*/
+ RTUNI_ALPHA, /* U+001486: CANADIAN SYLLABICS SOUTH-SLAVEY KIH*/
+ RTUNI_ALPHA, /* U+001487: CANADIAN SYLLABICS SOUTH-SLAVEY KOH*/
+ RTUNI_ALPHA, /* U+001488: CANADIAN SYLLABICS SOUTH-SLAVEY KAH*/
+ RTUNI_ALPHA, /* U+001489: CANADIAN SYLLABICS CE*/
+ RTUNI_ALPHA, /* U+00148a: CANADIAN SYLLABICS CAAI*/
+ RTUNI_ALPHA, /* U+00148b: CANADIAN SYLLABICS CI*/
+ RTUNI_ALPHA, /* U+00148c: CANADIAN SYLLABICS CII*/
+ RTUNI_ALPHA, /* U+00148d: CANADIAN SYLLABICS CO*/
+ RTUNI_ALPHA, /* U+00148e: CANADIAN SYLLABICS COO*/
+ RTUNI_ALPHA, /* U+00148f: CANADIAN SYLLABICS Y-CREE COO*/
+ RTUNI_ALPHA, /* U+001490: CANADIAN SYLLABICS CA*/
+ RTUNI_ALPHA, /* U+001491: CANADIAN SYLLABICS CAA*/
+ RTUNI_ALPHA, /* U+001492: CANADIAN SYLLABICS CWE*/
+ RTUNI_ALPHA, /* U+001493: CANADIAN SYLLABICS WEST-CREE CWE*/
+ RTUNI_ALPHA, /* U+001494: CANADIAN SYLLABICS CWI*/
+ RTUNI_ALPHA, /* U+001495: CANADIAN SYLLABICS WEST-CREE CWI*/
+ RTUNI_ALPHA, /* U+001496: CANADIAN SYLLABICS CWII*/
+ RTUNI_ALPHA, /* U+001497: CANADIAN SYLLABICS WEST-CREE CWII*/
+ RTUNI_ALPHA, /* U+001498: CANADIAN SYLLABICS CWO*/
+ RTUNI_ALPHA, /* U+001499: CANADIAN SYLLABICS WEST-CREE CWO*/
+ RTUNI_ALPHA, /* U+00149a: CANADIAN SYLLABICS CWOO*/
+ RTUNI_ALPHA, /* U+00149b: CANADIAN SYLLABICS WEST-CREE CWOO*/
+ RTUNI_ALPHA, /* U+00149c: CANADIAN SYLLABICS CWA*/
+ RTUNI_ALPHA, /* U+00149d: CANADIAN SYLLABICS WEST-CREE CWA*/
+ RTUNI_ALPHA, /* U+00149e: CANADIAN SYLLABICS CWAA*/
+ RTUNI_ALPHA, /* U+00149f: CANADIAN SYLLABICS WEST-CREE CWAA*/
+ RTUNI_ALPHA, /* U+0014a0: CANADIAN SYLLABICS NASKAPI CWAA*/
+ RTUNI_ALPHA, /* U+0014a1: CANADIAN SYLLABICS C*/
+ RTUNI_ALPHA, /* U+0014a2: CANADIAN SYLLABICS SAYISI TH*/
+ RTUNI_ALPHA, /* U+0014a3: CANADIAN SYLLABICS ME*/
+ RTUNI_ALPHA, /* U+0014a4: CANADIAN SYLLABICS MAAI*/
+ RTUNI_ALPHA, /* U+0014a5: CANADIAN SYLLABICS MI*/
+ RTUNI_ALPHA, /* U+0014a6: CANADIAN SYLLABICS MII*/
+ RTUNI_ALPHA, /* U+0014a7: CANADIAN SYLLABICS MO*/
+ RTUNI_ALPHA, /* U+0014a8: CANADIAN SYLLABICS MOO*/
+ RTUNI_ALPHA, /* U+0014a9: CANADIAN SYLLABICS Y-CREE MOO*/
+ RTUNI_ALPHA, /* U+0014aa: CANADIAN SYLLABICS MA*/
+ RTUNI_ALPHA, /* U+0014ab: CANADIAN SYLLABICS MAA*/
+ RTUNI_ALPHA, /* U+0014ac: CANADIAN SYLLABICS MWE*/
+ RTUNI_ALPHA, /* U+0014ad: CANADIAN SYLLABICS WEST-CREE MWE*/
+ RTUNI_ALPHA, /* U+0014ae: CANADIAN SYLLABICS MWI*/
+ RTUNI_ALPHA, /* U+0014af: CANADIAN SYLLABICS WEST-CREE MWI*/
+ RTUNI_ALPHA, /* U+0014b0: CANADIAN SYLLABICS MWII*/
+ RTUNI_ALPHA, /* U+0014b1: CANADIAN SYLLABICS WEST-CREE MWII*/
+ RTUNI_ALPHA, /* U+0014b2: CANADIAN SYLLABICS MWO*/
+ RTUNI_ALPHA, /* U+0014b3: CANADIAN SYLLABICS WEST-CREE MWO*/
+ RTUNI_ALPHA, /* U+0014b4: CANADIAN SYLLABICS MWOO*/
+ RTUNI_ALPHA, /* U+0014b5: CANADIAN SYLLABICS WEST-CREE MWOO*/
+ RTUNI_ALPHA, /* U+0014b6: CANADIAN SYLLABICS MWA*/
+ RTUNI_ALPHA, /* U+0014b7: CANADIAN SYLLABICS WEST-CREE MWA*/
+ RTUNI_ALPHA, /* U+0014b8: CANADIAN SYLLABICS MWAA*/
+ RTUNI_ALPHA, /* U+0014b9: CANADIAN SYLLABICS WEST-CREE MWAA*/
+ RTUNI_ALPHA, /* U+0014ba: CANADIAN SYLLABICS NASKAPI MWAA*/
+ RTUNI_ALPHA, /* U+0014bb: CANADIAN SYLLABICS M*/
+ RTUNI_ALPHA, /* U+0014bc: CANADIAN SYLLABICS WEST-CREE M*/
+ RTUNI_ALPHA, /* U+0014bd: CANADIAN SYLLABICS MH*/
+ RTUNI_ALPHA, /* U+0014be: CANADIAN SYLLABICS ATHAPASCAN M*/
+ RTUNI_ALPHA, /* U+0014bf: CANADIAN SYLLABICS SAYISI M*/
+ RTUNI_ALPHA, /* U+0014c0: CANADIAN SYLLABICS NE*/
+ RTUNI_ALPHA, /* U+0014c1: CANADIAN SYLLABICS NAAI*/
+ RTUNI_ALPHA, /* U+0014c2: CANADIAN SYLLABICS NI*/
+ RTUNI_ALPHA, /* U+0014c3: CANADIAN SYLLABICS NII*/
+ RTUNI_ALPHA, /* U+0014c4: CANADIAN SYLLABICS NO*/
+ RTUNI_ALPHA, /* U+0014c5: CANADIAN SYLLABICS NOO*/
+ RTUNI_ALPHA, /* U+0014c6: CANADIAN SYLLABICS Y-CREE NOO*/
+ RTUNI_ALPHA, /* U+0014c7: CANADIAN SYLLABICS NA*/
+ RTUNI_ALPHA, /* U+0014c8: CANADIAN SYLLABICS NAA*/
+ RTUNI_ALPHA, /* U+0014c9: CANADIAN SYLLABICS NWE*/
+ RTUNI_ALPHA, /* U+0014ca: CANADIAN SYLLABICS WEST-CREE NWE*/
+ RTUNI_ALPHA, /* U+0014cb: CANADIAN SYLLABICS NWA*/
+ RTUNI_ALPHA, /* U+0014cc: CANADIAN SYLLABICS WEST-CREE NWA*/
+ RTUNI_ALPHA, /* U+0014cd: CANADIAN SYLLABICS NWAA*/
+ RTUNI_ALPHA, /* U+0014ce: CANADIAN SYLLABICS WEST-CREE NWAA*/
+ RTUNI_ALPHA, /* U+0014cf: CANADIAN SYLLABICS NASKAPI NWAA*/
+ RTUNI_ALPHA, /* U+0014d0: CANADIAN SYLLABICS N*/
+ RTUNI_ALPHA, /* U+0014d1: CANADIAN SYLLABICS CARRIER NG*/
+ RTUNI_ALPHA, /* U+0014d2: CANADIAN SYLLABICS NH*/
+ RTUNI_ALPHA, /* U+0014d3: CANADIAN SYLLABICS LE*/
+ RTUNI_ALPHA, /* U+0014d4: CANADIAN SYLLABICS LAAI*/
+ RTUNI_ALPHA, /* U+0014d5: CANADIAN SYLLABICS LI*/
+ RTUNI_ALPHA, /* U+0014d6: CANADIAN SYLLABICS LII*/
+ RTUNI_ALPHA, /* U+0014d7: CANADIAN SYLLABICS LO*/
+ RTUNI_ALPHA, /* U+0014d8: CANADIAN SYLLABICS LOO*/
+ RTUNI_ALPHA, /* U+0014d9: CANADIAN SYLLABICS Y-CREE LOO*/
+ RTUNI_ALPHA, /* U+0014da: CANADIAN SYLLABICS LA*/
+ RTUNI_ALPHA, /* U+0014db: CANADIAN SYLLABICS LAA*/
+ RTUNI_ALPHA, /* U+0014dc: CANADIAN SYLLABICS LWE*/
+ RTUNI_ALPHA, /* U+0014dd: CANADIAN SYLLABICS WEST-CREE LWE*/
+ RTUNI_ALPHA, /* U+0014de: CANADIAN SYLLABICS LWI*/
+ RTUNI_ALPHA, /* U+0014df: CANADIAN SYLLABICS WEST-CREE LWI*/
+ RTUNI_ALPHA, /* U+0014e0: CANADIAN SYLLABICS LWII*/
+ RTUNI_ALPHA, /* U+0014e1: CANADIAN SYLLABICS WEST-CREE LWII*/
+ RTUNI_ALPHA, /* U+0014e2: CANADIAN SYLLABICS LWO*/
+ RTUNI_ALPHA, /* U+0014e3: CANADIAN SYLLABICS WEST-CREE LWO*/
+ RTUNI_ALPHA, /* U+0014e4: CANADIAN SYLLABICS LWOO*/
+ RTUNI_ALPHA, /* U+0014e5: CANADIAN SYLLABICS WEST-CREE LWOO*/
+ RTUNI_ALPHA, /* U+0014e6: CANADIAN SYLLABICS LWA*/
+ RTUNI_ALPHA, /* U+0014e7: CANADIAN SYLLABICS WEST-CREE LWA*/
+ RTUNI_ALPHA, /* U+0014e8: CANADIAN SYLLABICS LWAA*/
+ RTUNI_ALPHA, /* U+0014e9: CANADIAN SYLLABICS WEST-CREE LWAA*/
+ RTUNI_ALPHA, /* U+0014ea: CANADIAN SYLLABICS L*/
+ RTUNI_ALPHA, /* U+0014eb: CANADIAN SYLLABICS WEST-CREE L*/
+ RTUNI_ALPHA, /* U+0014ec: CANADIAN SYLLABICS MEDIAL L*/
+ RTUNI_ALPHA, /* U+0014ed: CANADIAN SYLLABICS SE*/
+ RTUNI_ALPHA, /* U+0014ee: CANADIAN SYLLABICS SAAI*/
+ RTUNI_ALPHA, /* U+0014ef: CANADIAN SYLLABICS SI*/
+ RTUNI_ALPHA, /* U+0014f0: CANADIAN SYLLABICS SII*/
+ RTUNI_ALPHA, /* U+0014f1: CANADIAN SYLLABICS SO*/
+ RTUNI_ALPHA, /* U+0014f2: CANADIAN SYLLABICS SOO*/
+ RTUNI_ALPHA, /* U+0014f3: CANADIAN SYLLABICS Y-CREE SOO*/
+ RTUNI_ALPHA, /* U+0014f4: CANADIAN SYLLABICS SA*/
+ RTUNI_ALPHA, /* U+0014f5: CANADIAN SYLLABICS SAA*/
+ RTUNI_ALPHA, /* U+0014f6: CANADIAN SYLLABICS SWE*/
+ RTUNI_ALPHA, /* U+0014f7: CANADIAN SYLLABICS WEST-CREE SWE*/
+ RTUNI_ALPHA, /* U+0014f8: CANADIAN SYLLABICS SWI*/
+ RTUNI_ALPHA, /* U+0014f9: CANADIAN SYLLABICS WEST-CREE SWI*/
+ RTUNI_ALPHA, /* U+0014fa: CANADIAN SYLLABICS SWII*/
+ RTUNI_ALPHA, /* U+0014fb: CANADIAN SYLLABICS WEST-CREE SWII*/
+ RTUNI_ALPHA, /* U+0014fc: CANADIAN SYLLABICS SWO*/
+ RTUNI_ALPHA, /* U+0014fd: CANADIAN SYLLABICS WEST-CREE SWO*/
+ RTUNI_ALPHA, /* U+0014fe: CANADIAN SYLLABICS SWOO*/
+ RTUNI_ALPHA, /* U+0014ff: CANADIAN SYLLABICS WEST-CREE SWOO*/
+ RTUNI_ALPHA, /* U+001500: CANADIAN SYLLABICS SWA*/
+ RTUNI_ALPHA, /* U+001501: CANADIAN SYLLABICS WEST-CREE SWA*/
+ RTUNI_ALPHA, /* U+001502: CANADIAN SYLLABICS SWAA*/
+ RTUNI_ALPHA, /* U+001503: CANADIAN SYLLABICS WEST-CREE SWAA*/
+ RTUNI_ALPHA, /* U+001504: CANADIAN SYLLABICS NASKAPI SWAA*/
+ RTUNI_ALPHA, /* U+001505: CANADIAN SYLLABICS S*/
+ RTUNI_ALPHA, /* U+001506: CANADIAN SYLLABICS ATHAPASCAN S*/
+ RTUNI_ALPHA, /* U+001507: CANADIAN SYLLABICS SW*/
+ RTUNI_ALPHA, /* U+001508: CANADIAN SYLLABICS BLACKFOOT S*/
+ RTUNI_ALPHA, /* U+001509: CANADIAN SYLLABICS MOOSE-CREE SK*/
+ RTUNI_ALPHA, /* U+00150a: CANADIAN SYLLABICS NASKAPI SKW*/
+ RTUNI_ALPHA, /* U+00150b: CANADIAN SYLLABICS NASKAPI S-W*/
+ RTUNI_ALPHA, /* U+00150c: CANADIAN SYLLABICS NASKAPI SPWA*/
+ RTUNI_ALPHA, /* U+00150d: CANADIAN SYLLABICS NASKAPI STWA*/
+ RTUNI_ALPHA, /* U+00150e: CANADIAN SYLLABICS NASKAPI SKWA*/
+ RTUNI_ALPHA, /* U+00150f: CANADIAN SYLLABICS NASKAPI SCWA*/
+ RTUNI_ALPHA, /* U+001510: CANADIAN SYLLABICS SHE*/
+ RTUNI_ALPHA, /* U+001511: CANADIAN SYLLABICS SHI*/
+ RTUNI_ALPHA, /* U+001512: CANADIAN SYLLABICS SHII*/
+ RTUNI_ALPHA, /* U+001513: CANADIAN SYLLABICS SHO*/
+ RTUNI_ALPHA, /* U+001514: CANADIAN SYLLABICS SHOO*/
+ RTUNI_ALPHA, /* U+001515: CANADIAN SYLLABICS SHA*/
+ RTUNI_ALPHA, /* U+001516: CANADIAN SYLLABICS SHAA*/
+ RTUNI_ALPHA, /* U+001517: CANADIAN SYLLABICS SHWE*/
+ RTUNI_ALPHA, /* U+001518: CANADIAN SYLLABICS WEST-CREE SHWE*/
+ RTUNI_ALPHA, /* U+001519: CANADIAN SYLLABICS SHWI*/
+ RTUNI_ALPHA, /* U+00151a: CANADIAN SYLLABICS WEST-CREE SHWI*/
+ RTUNI_ALPHA, /* U+00151b: CANADIAN SYLLABICS SHWII*/
+ RTUNI_ALPHA, /* U+00151c: CANADIAN SYLLABICS WEST-CREE SHWII*/
+ RTUNI_ALPHA, /* U+00151d: CANADIAN SYLLABICS SHWO*/
+ RTUNI_ALPHA, /* U+00151e: CANADIAN SYLLABICS WEST-CREE SHWO*/
+ RTUNI_ALPHA, /* U+00151f: CANADIAN SYLLABICS SHWOO*/
+ RTUNI_ALPHA, /* U+001520: CANADIAN SYLLABICS WEST-CREE SHWOO*/
+ RTUNI_ALPHA, /* U+001521: CANADIAN SYLLABICS SHWA*/
+ RTUNI_ALPHA, /* U+001522: CANADIAN SYLLABICS WEST-CREE SHWA*/
+ RTUNI_ALPHA, /* U+001523: CANADIAN SYLLABICS SHWAA*/
+ RTUNI_ALPHA, /* U+001524: CANADIAN SYLLABICS WEST-CREE SHWAA*/
+ RTUNI_ALPHA, /* U+001525: CANADIAN SYLLABICS SH*/
+ RTUNI_ALPHA, /* U+001526: CANADIAN SYLLABICS YE*/
+ RTUNI_ALPHA, /* U+001527: CANADIAN SYLLABICS YAAI*/
+ RTUNI_ALPHA, /* U+001528: CANADIAN SYLLABICS YI*/
+ RTUNI_ALPHA, /* U+001529: CANADIAN SYLLABICS YII*/
+ RTUNI_ALPHA, /* U+00152a: CANADIAN SYLLABICS YO*/
+ RTUNI_ALPHA, /* U+00152b: CANADIAN SYLLABICS YOO*/
+ RTUNI_ALPHA, /* U+00152c: CANADIAN SYLLABICS Y-CREE YOO*/
+ RTUNI_ALPHA, /* U+00152d: CANADIAN SYLLABICS YA*/
+ RTUNI_ALPHA, /* U+00152e: CANADIAN SYLLABICS YAA*/
+ RTUNI_ALPHA, /* U+00152f: CANADIAN SYLLABICS YWE*/
+ RTUNI_ALPHA, /* U+001530: CANADIAN SYLLABICS WEST-CREE YWE*/
+ RTUNI_ALPHA, /* U+001531: CANADIAN SYLLABICS YWI*/
+ RTUNI_ALPHA, /* U+001532: CANADIAN SYLLABICS WEST-CREE YWI*/
+ RTUNI_ALPHA, /* U+001533: CANADIAN SYLLABICS YWII*/
+ RTUNI_ALPHA, /* U+001534: CANADIAN SYLLABICS WEST-CREE YWII*/
+ RTUNI_ALPHA, /* U+001535: CANADIAN SYLLABICS YWO*/
+ RTUNI_ALPHA, /* U+001536: CANADIAN SYLLABICS WEST-CREE YWO*/
+ RTUNI_ALPHA, /* U+001537: CANADIAN SYLLABICS YWOO*/
+ RTUNI_ALPHA, /* U+001538: CANADIAN SYLLABICS WEST-CREE YWOO*/
+ RTUNI_ALPHA, /* U+001539: CANADIAN SYLLABICS YWA*/
+ RTUNI_ALPHA, /* U+00153a: CANADIAN SYLLABICS WEST-CREE YWA*/
+ RTUNI_ALPHA, /* U+00153b: CANADIAN SYLLABICS YWAA*/
+ RTUNI_ALPHA, /* U+00153c: CANADIAN SYLLABICS WEST-CREE YWAA*/
+ RTUNI_ALPHA, /* U+00153d: CANADIAN SYLLABICS NASKAPI YWAA*/
+ RTUNI_ALPHA, /* U+00153e: CANADIAN SYLLABICS Y*/
+ RTUNI_ALPHA, /* U+00153f: CANADIAN SYLLABICS BIBLE-CREE Y*/
+ RTUNI_ALPHA, /* U+001540: CANADIAN SYLLABICS WEST-CREE Y*/
+ RTUNI_ALPHA, /* U+001541: CANADIAN SYLLABICS SAYISI YI*/
+ RTUNI_ALPHA, /* U+001542: CANADIAN SYLLABICS RE*/
+ RTUNI_ALPHA, /* U+001543: CANADIAN SYLLABICS R-CREE RE*/
+ RTUNI_ALPHA, /* U+001544: CANADIAN SYLLABICS WEST-CREE LE*/
+ RTUNI_ALPHA, /* U+001545: CANADIAN SYLLABICS RAAI*/
+ RTUNI_ALPHA, /* U+001546: CANADIAN SYLLABICS RI*/
+ RTUNI_ALPHA, /* U+001547: CANADIAN SYLLABICS RII*/
+ RTUNI_ALPHA, /* U+001548: CANADIAN SYLLABICS RO*/
+ RTUNI_ALPHA, /* U+001549: CANADIAN SYLLABICS ROO*/
+ RTUNI_ALPHA, /* U+00154a: CANADIAN SYLLABICS WEST-CREE LO*/
+ RTUNI_ALPHA, /* U+00154b: CANADIAN SYLLABICS RA*/
+ RTUNI_ALPHA, /* U+00154c: CANADIAN SYLLABICS RAA*/
+ RTUNI_ALPHA, /* U+00154d: CANADIAN SYLLABICS WEST-CREE LA*/
+ RTUNI_ALPHA, /* U+00154e: CANADIAN SYLLABICS RWAA*/
+ RTUNI_ALPHA, /* U+00154f: CANADIAN SYLLABICS WEST-CREE RWAA*/
+ RTUNI_ALPHA, /* U+001550: CANADIAN SYLLABICS R*/
+ RTUNI_ALPHA, /* U+001551: CANADIAN SYLLABICS WEST-CREE R*/
+ RTUNI_ALPHA, /* U+001552: CANADIAN SYLLABICS MEDIAL R*/
+ RTUNI_ALPHA, /* U+001553: CANADIAN SYLLABICS FE*/
+ RTUNI_ALPHA, /* U+001554: CANADIAN SYLLABICS FAAI*/
+ RTUNI_ALPHA, /* U+001555: CANADIAN SYLLABICS FI*/
+ RTUNI_ALPHA, /* U+001556: CANADIAN SYLLABICS FII*/
+ RTUNI_ALPHA, /* U+001557: CANADIAN SYLLABICS FO*/
+ RTUNI_ALPHA, /* U+001558: CANADIAN SYLLABICS FOO*/
+ RTUNI_ALPHA, /* U+001559: CANADIAN SYLLABICS FA*/
+ RTUNI_ALPHA, /* U+00155a: CANADIAN SYLLABICS FAA*/
+ RTUNI_ALPHA, /* U+00155b: CANADIAN SYLLABICS FWAA*/
+ RTUNI_ALPHA, /* U+00155c: CANADIAN SYLLABICS WEST-CREE FWAA*/
+ RTUNI_ALPHA, /* U+00155d: CANADIAN SYLLABICS F*/
+ RTUNI_ALPHA, /* U+00155e: CANADIAN SYLLABICS THE*/
+ RTUNI_ALPHA, /* U+00155f: CANADIAN SYLLABICS N-CREE THE*/
+ RTUNI_ALPHA, /* U+001560: CANADIAN SYLLABICS THI*/
+ RTUNI_ALPHA, /* U+001561: CANADIAN SYLLABICS N-CREE THI*/
+ RTUNI_ALPHA, /* U+001562: CANADIAN SYLLABICS THII*/
+ RTUNI_ALPHA, /* U+001563: CANADIAN SYLLABICS N-CREE THII*/
+ RTUNI_ALPHA, /* U+001564: CANADIAN SYLLABICS THO*/
+ RTUNI_ALPHA, /* U+001565: CANADIAN SYLLABICS THOO*/
+ RTUNI_ALPHA, /* U+001566: CANADIAN SYLLABICS THA*/
+ RTUNI_ALPHA, /* U+001567: CANADIAN SYLLABICS THAA*/
+ RTUNI_ALPHA, /* U+001568: CANADIAN SYLLABICS THWAA*/
+ RTUNI_ALPHA, /* U+001569: CANADIAN SYLLABICS WEST-CREE THWAA*/
+ RTUNI_ALPHA, /* U+00156a: CANADIAN SYLLABICS TH*/
+ RTUNI_ALPHA, /* U+00156b: CANADIAN SYLLABICS TTHE*/
+ RTUNI_ALPHA, /* U+00156c: CANADIAN SYLLABICS TTHI*/
+ RTUNI_ALPHA, /* U+00156d: CANADIAN SYLLABICS TTHO*/
+ RTUNI_ALPHA, /* U+00156e: CANADIAN SYLLABICS TTHA*/
+ RTUNI_ALPHA, /* U+00156f: CANADIAN SYLLABICS TTH*/
+ RTUNI_ALPHA, /* U+001570: CANADIAN SYLLABICS TYE*/
+ RTUNI_ALPHA, /* U+001571: CANADIAN SYLLABICS TYI*/
+ RTUNI_ALPHA, /* U+001572: CANADIAN SYLLABICS TYO*/
+ RTUNI_ALPHA, /* U+001573: CANADIAN SYLLABICS TYA*/
+ RTUNI_ALPHA, /* U+001574: CANADIAN SYLLABICS NUNAVIK HE*/
+ RTUNI_ALPHA, /* U+001575: CANADIAN SYLLABICS NUNAVIK HI*/
+ RTUNI_ALPHA, /* U+001576: CANADIAN SYLLABICS NUNAVIK HII*/
+ RTUNI_ALPHA, /* U+001577: CANADIAN SYLLABICS NUNAVIK HO*/
+ RTUNI_ALPHA, /* U+001578: CANADIAN SYLLABICS NUNAVIK HOO*/
+ RTUNI_ALPHA, /* U+001579: CANADIAN SYLLABICS NUNAVIK HA*/
+ RTUNI_ALPHA, /* U+00157a: CANADIAN SYLLABICS NUNAVIK HAA*/
+ RTUNI_ALPHA, /* U+00157b: CANADIAN SYLLABICS NUNAVIK H*/
+ RTUNI_ALPHA, /* U+00157c: CANADIAN SYLLABICS NUNAVUT H*/
+ RTUNI_ALPHA, /* U+00157d: CANADIAN SYLLABICS HK*/
+ RTUNI_ALPHA, /* U+00157e: CANADIAN SYLLABICS QAAI*/
+ RTUNI_ALPHA, /* U+00157f: CANADIAN SYLLABICS QI*/
+ RTUNI_ALPHA, /* U+001580: CANADIAN SYLLABICS QII*/
+ RTUNI_ALPHA, /* U+001581: CANADIAN SYLLABICS QO*/
+ RTUNI_ALPHA, /* U+001582: CANADIAN SYLLABICS QOO*/
+ RTUNI_ALPHA, /* U+001583: CANADIAN SYLLABICS QA*/
+ RTUNI_ALPHA, /* U+001584: CANADIAN SYLLABICS QAA*/
+ RTUNI_ALPHA, /* U+001585: CANADIAN SYLLABICS Q*/
+ RTUNI_ALPHA, /* U+001586: CANADIAN SYLLABICS TLHE*/
+ RTUNI_ALPHA, /* U+001587: CANADIAN SYLLABICS TLHI*/
+ RTUNI_ALPHA, /* U+001588: CANADIAN SYLLABICS TLHO*/
+ RTUNI_ALPHA, /* U+001589: CANADIAN SYLLABICS TLHA*/
+ RTUNI_ALPHA, /* U+00158a: CANADIAN SYLLABICS WEST-CREE RE*/
+ RTUNI_ALPHA, /* U+00158b: CANADIAN SYLLABICS WEST-CREE RI*/
+ RTUNI_ALPHA, /* U+00158c: CANADIAN SYLLABICS WEST-CREE RO*/
+ RTUNI_ALPHA, /* U+00158d: CANADIAN SYLLABICS WEST-CREE RA*/
+ RTUNI_ALPHA, /* U+00158e: CANADIAN SYLLABICS NGAAI*/
+ RTUNI_ALPHA, /* U+00158f: CANADIAN SYLLABICS NGI*/
+ RTUNI_ALPHA, /* U+001590: CANADIAN SYLLABICS NGII*/
+ RTUNI_ALPHA, /* U+001591: CANADIAN SYLLABICS NGO*/
+ RTUNI_ALPHA, /* U+001592: CANADIAN SYLLABICS NGOO*/
+ RTUNI_ALPHA, /* U+001593: CANADIAN SYLLABICS NGA*/
+ RTUNI_ALPHA, /* U+001594: CANADIAN SYLLABICS NGAA*/
+ RTUNI_ALPHA, /* U+001595: CANADIAN SYLLABICS NG*/
+ RTUNI_ALPHA, /* U+001596: CANADIAN SYLLABICS NNG*/
+ RTUNI_ALPHA, /* U+001597: CANADIAN SYLLABICS SAYISI SHE*/
+ RTUNI_ALPHA, /* U+001598: CANADIAN SYLLABICS SAYISI SHI*/
+ RTUNI_ALPHA, /* U+001599: CANADIAN SYLLABICS SAYISI SHO*/
+ RTUNI_ALPHA, /* U+00159a: CANADIAN SYLLABICS SAYISI SHA*/
+ RTUNI_ALPHA, /* U+00159b: CANADIAN SYLLABICS WOODS-CREE THE*/
+ RTUNI_ALPHA, /* U+00159c: CANADIAN SYLLABICS WOODS-CREE THI*/
+ RTUNI_ALPHA, /* U+00159d: CANADIAN SYLLABICS WOODS-CREE THO*/
+ RTUNI_ALPHA, /* U+00159e: CANADIAN SYLLABICS WOODS-CREE THA*/
+ RTUNI_ALPHA, /* U+00159f: CANADIAN SYLLABICS WOODS-CREE TH*/
+ RTUNI_ALPHA, /* U+0015a0: CANADIAN SYLLABICS LHI*/
+ RTUNI_ALPHA, /* U+0015a1: CANADIAN SYLLABICS LHII*/
+ RTUNI_ALPHA, /* U+0015a2: CANADIAN SYLLABICS LHO*/
+ RTUNI_ALPHA, /* U+0015a3: CANADIAN SYLLABICS LHOO*/
+ RTUNI_ALPHA, /* U+0015a4: CANADIAN SYLLABICS LHA*/
+ RTUNI_ALPHA, /* U+0015a5: CANADIAN SYLLABICS LHAA*/
+ RTUNI_ALPHA, /* U+0015a6: CANADIAN SYLLABICS LH*/
+ RTUNI_ALPHA, /* U+0015a7: CANADIAN SYLLABICS TH-CREE THE*/
+ RTUNI_ALPHA, /* U+0015a8: CANADIAN SYLLABICS TH-CREE THI*/
+ RTUNI_ALPHA, /* U+0015a9: CANADIAN SYLLABICS TH-CREE THII*/
+ RTUNI_ALPHA, /* U+0015aa: CANADIAN SYLLABICS TH-CREE THO*/
+ RTUNI_ALPHA, /* U+0015ab: CANADIAN SYLLABICS TH-CREE THOO*/
+ RTUNI_ALPHA, /* U+0015ac: CANADIAN SYLLABICS TH-CREE THA*/
+ RTUNI_ALPHA, /* U+0015ad: CANADIAN SYLLABICS TH-CREE THAA*/
+ RTUNI_ALPHA, /* U+0015ae: CANADIAN SYLLABICS TH-CREE TH*/
+ RTUNI_ALPHA, /* U+0015af: CANADIAN SYLLABICS AIVILIK B*/
+ RTUNI_ALPHA, /* U+0015b0: CANADIAN SYLLABICS BLACKFOOT E*/
+ RTUNI_ALPHA, /* U+0015b1: CANADIAN SYLLABICS BLACKFOOT I*/
+ RTUNI_ALPHA, /* U+0015b2: CANADIAN SYLLABICS BLACKFOOT O*/
+ RTUNI_ALPHA, /* U+0015b3: CANADIAN SYLLABICS BLACKFOOT A*/
+ RTUNI_ALPHA, /* U+0015b4: CANADIAN SYLLABICS BLACKFOOT WE*/
+ RTUNI_ALPHA, /* U+0015b5: CANADIAN SYLLABICS BLACKFOOT WI*/
+ RTUNI_ALPHA, /* U+0015b6: CANADIAN SYLLABICS BLACKFOOT WO*/
+ RTUNI_ALPHA, /* U+0015b7: CANADIAN SYLLABICS BLACKFOOT WA*/
+ RTUNI_ALPHA, /* U+0015b8: CANADIAN SYLLABICS BLACKFOOT NE*/
+ RTUNI_ALPHA, /* U+0015b9: CANADIAN SYLLABICS BLACKFOOT NI*/
+ RTUNI_ALPHA, /* U+0015ba: CANADIAN SYLLABICS BLACKFOOT NO*/
+ RTUNI_ALPHA, /* U+0015bb: CANADIAN SYLLABICS BLACKFOOT NA*/
+ RTUNI_ALPHA, /* U+0015bc: CANADIAN SYLLABICS BLACKFOOT KE*/
+ RTUNI_ALPHA, /* U+0015bd: CANADIAN SYLLABICS BLACKFOOT KI*/
+ RTUNI_ALPHA, /* U+0015be: CANADIAN SYLLABICS BLACKFOOT KO*/
+ RTUNI_ALPHA, /* U+0015bf: CANADIAN SYLLABICS BLACKFOOT KA*/
+ RTUNI_ALPHA, /* U+0015c0: CANADIAN SYLLABICS SAYISI HE*/
+ RTUNI_ALPHA, /* U+0015c1: CANADIAN SYLLABICS SAYISI HI*/
+ RTUNI_ALPHA, /* U+0015c2: CANADIAN SYLLABICS SAYISI HO*/
+ RTUNI_ALPHA, /* U+0015c3: CANADIAN SYLLABICS SAYISI HA*/
+ RTUNI_ALPHA, /* U+0015c4: CANADIAN SYLLABICS CARRIER GHU*/
+ RTUNI_ALPHA, /* U+0015c5: CANADIAN SYLLABICS CARRIER GHO*/
+ RTUNI_ALPHA, /* U+0015c6: CANADIAN SYLLABICS CARRIER GHE*/
+ RTUNI_ALPHA, /* U+0015c7: CANADIAN SYLLABICS CARRIER GHEE*/
+ RTUNI_ALPHA, /* U+0015c8: CANADIAN SYLLABICS CARRIER GHI*/
+ RTUNI_ALPHA, /* U+0015c9: CANADIAN SYLLABICS CARRIER GHA*/
+ RTUNI_ALPHA, /* U+0015ca: CANADIAN SYLLABICS CARRIER RU*/
+ RTUNI_ALPHA, /* U+0015cb: CANADIAN SYLLABICS CARRIER RO*/
+ RTUNI_ALPHA, /* U+0015cc: CANADIAN SYLLABICS CARRIER RE*/
+ RTUNI_ALPHA, /* U+0015cd: CANADIAN SYLLABICS CARRIER REE*/
+ RTUNI_ALPHA, /* U+0015ce: CANADIAN SYLLABICS CARRIER RI*/
+ RTUNI_ALPHA, /* U+0015cf: CANADIAN SYLLABICS CARRIER RA*/
+ RTUNI_ALPHA, /* U+0015d0: CANADIAN SYLLABICS CARRIER WU*/
+ RTUNI_ALPHA, /* U+0015d1: CANADIAN SYLLABICS CARRIER WO*/
+ RTUNI_ALPHA, /* U+0015d2: CANADIAN SYLLABICS CARRIER WE*/
+ RTUNI_ALPHA, /* U+0015d3: CANADIAN SYLLABICS CARRIER WEE*/
+ RTUNI_ALPHA, /* U+0015d4: CANADIAN SYLLABICS CARRIER WI*/
+ RTUNI_ALPHA, /* U+0015d5: CANADIAN SYLLABICS CARRIER WA*/
+ RTUNI_ALPHA, /* U+0015d6: CANADIAN SYLLABICS CARRIER HWU*/
+ RTUNI_ALPHA, /* U+0015d7: CANADIAN SYLLABICS CARRIER HWO*/
+ RTUNI_ALPHA, /* U+0015d8: CANADIAN SYLLABICS CARRIER HWE*/
+ RTUNI_ALPHA, /* U+0015d9: CANADIAN SYLLABICS CARRIER HWEE*/
+ RTUNI_ALPHA, /* U+0015da: CANADIAN SYLLABICS CARRIER HWI*/
+ RTUNI_ALPHA, /* U+0015db: CANADIAN SYLLABICS CARRIER HWA*/
+ RTUNI_ALPHA, /* U+0015dc: CANADIAN SYLLABICS CARRIER THU*/
+ RTUNI_ALPHA, /* U+0015dd: CANADIAN SYLLABICS CARRIER THO*/
+ RTUNI_ALPHA, /* U+0015de: CANADIAN SYLLABICS CARRIER THE*/
+ RTUNI_ALPHA, /* U+0015df: CANADIAN SYLLABICS CARRIER THEE*/
+ RTUNI_ALPHA, /* U+0015e0: CANADIAN SYLLABICS CARRIER THI*/
+ RTUNI_ALPHA, /* U+0015e1: CANADIAN SYLLABICS CARRIER THA*/
+ RTUNI_ALPHA, /* U+0015e2: CANADIAN SYLLABICS CARRIER TTU*/
+ RTUNI_ALPHA, /* U+0015e3: CANADIAN SYLLABICS CARRIER TTO*/
+ RTUNI_ALPHA, /* U+0015e4: CANADIAN SYLLABICS CARRIER TTE*/
+ RTUNI_ALPHA, /* U+0015e5: CANADIAN SYLLABICS CARRIER TTEE*/
+ RTUNI_ALPHA, /* U+0015e6: CANADIAN SYLLABICS CARRIER TTI*/
+ RTUNI_ALPHA, /* U+0015e7: CANADIAN SYLLABICS CARRIER TTA*/
+ RTUNI_ALPHA, /* U+0015e8: CANADIAN SYLLABICS CARRIER PU*/
+ RTUNI_ALPHA, /* U+0015e9: CANADIAN SYLLABICS CARRIER PO*/
+ RTUNI_ALPHA, /* U+0015ea: CANADIAN SYLLABICS CARRIER PE*/
+ RTUNI_ALPHA, /* U+0015eb: CANADIAN SYLLABICS CARRIER PEE*/
+ RTUNI_ALPHA, /* U+0015ec: CANADIAN SYLLABICS CARRIER PI*/
+ RTUNI_ALPHA, /* U+0015ed: CANADIAN SYLLABICS CARRIER PA*/
+ RTUNI_ALPHA, /* U+0015ee: CANADIAN SYLLABICS CARRIER P*/
+ RTUNI_ALPHA, /* U+0015ef: CANADIAN SYLLABICS CARRIER GU*/
+ RTUNI_ALPHA, /* U+0015f0: CANADIAN SYLLABICS CARRIER GO*/
+ RTUNI_ALPHA, /* U+0015f1: CANADIAN SYLLABICS CARRIER GE*/
+ RTUNI_ALPHA, /* U+0015f2: CANADIAN SYLLABICS CARRIER GEE*/
+ RTUNI_ALPHA, /* U+0015f3: CANADIAN SYLLABICS CARRIER GI*/
+ RTUNI_ALPHA, /* U+0015f4: CANADIAN SYLLABICS CARRIER GA*/
+ RTUNI_ALPHA, /* U+0015f5: CANADIAN SYLLABICS CARRIER KHU*/
+ RTUNI_ALPHA, /* U+0015f6: CANADIAN SYLLABICS CARRIER KHO*/
+ RTUNI_ALPHA, /* U+0015f7: CANADIAN SYLLABICS CARRIER KHE*/
+ RTUNI_ALPHA, /* U+0015f8: CANADIAN SYLLABICS CARRIER KHEE*/
+ RTUNI_ALPHA, /* U+0015f9: CANADIAN SYLLABICS CARRIER KHI*/
+ RTUNI_ALPHA, /* U+0015fa: CANADIAN SYLLABICS CARRIER KHA*/
+ RTUNI_ALPHA, /* U+0015fb: CANADIAN SYLLABICS CARRIER KKU*/
+ RTUNI_ALPHA, /* U+0015fc: CANADIAN SYLLABICS CARRIER KKO*/
+ RTUNI_ALPHA, /* U+0015fd: CANADIAN SYLLABICS CARRIER KKE*/
+ RTUNI_ALPHA, /* U+0015fe: CANADIAN SYLLABICS CARRIER KKEE*/
+ RTUNI_ALPHA, /* U+0015ff: CANADIAN SYLLABICS CARRIER KKI*/
+ RTUNI_ALPHA, /* U+001600: CANADIAN SYLLABICS CARRIER KKA*/
+ RTUNI_ALPHA, /* U+001601: CANADIAN SYLLABICS CARRIER KK*/
+ RTUNI_ALPHA, /* U+001602: CANADIAN SYLLABICS CARRIER NU*/
+ RTUNI_ALPHA, /* U+001603: CANADIAN SYLLABICS CARRIER NO*/
+ RTUNI_ALPHA, /* U+001604: CANADIAN SYLLABICS CARRIER NE*/
+ RTUNI_ALPHA, /* U+001605: CANADIAN SYLLABICS CARRIER NEE*/
+ RTUNI_ALPHA, /* U+001606: CANADIAN SYLLABICS CARRIER NI*/
+ RTUNI_ALPHA, /* U+001607: CANADIAN SYLLABICS CARRIER NA*/
+ RTUNI_ALPHA, /* U+001608: CANADIAN SYLLABICS CARRIER MU*/
+ RTUNI_ALPHA, /* U+001609: CANADIAN SYLLABICS CARRIER MO*/
+ RTUNI_ALPHA, /* U+00160a: CANADIAN SYLLABICS CARRIER ME*/
+ RTUNI_ALPHA, /* U+00160b: CANADIAN SYLLABICS CARRIER MEE*/
+ RTUNI_ALPHA, /* U+00160c: CANADIAN SYLLABICS CARRIER MI*/
+ RTUNI_ALPHA, /* U+00160d: CANADIAN SYLLABICS CARRIER MA*/
+ RTUNI_ALPHA, /* U+00160e: CANADIAN SYLLABICS CARRIER YU*/
+ RTUNI_ALPHA, /* U+00160f: CANADIAN SYLLABICS CARRIER YO*/
+ RTUNI_ALPHA, /* U+001610: CANADIAN SYLLABICS CARRIER YE*/
+ RTUNI_ALPHA, /* U+001611: CANADIAN SYLLABICS CARRIER YEE*/
+ RTUNI_ALPHA, /* U+001612: CANADIAN SYLLABICS CARRIER YI*/
+ RTUNI_ALPHA, /* U+001613: CANADIAN SYLLABICS CARRIER YA*/
+ RTUNI_ALPHA, /* U+001614: CANADIAN SYLLABICS CARRIER JU*/
+ RTUNI_ALPHA, /* U+001615: CANADIAN SYLLABICS SAYISI JU*/
+ RTUNI_ALPHA, /* U+001616: CANADIAN SYLLABICS CARRIER JO*/
+ RTUNI_ALPHA, /* U+001617: CANADIAN SYLLABICS CARRIER JE*/
+ RTUNI_ALPHA, /* U+001618: CANADIAN SYLLABICS CARRIER JEE*/
+ RTUNI_ALPHA, /* U+001619: CANADIAN SYLLABICS CARRIER JI*/
+ RTUNI_ALPHA, /* U+00161a: CANADIAN SYLLABICS SAYISI JI*/
+ RTUNI_ALPHA, /* U+00161b: CANADIAN SYLLABICS CARRIER JA*/
+ RTUNI_ALPHA, /* U+00161c: CANADIAN SYLLABICS CARRIER JJU*/
+ RTUNI_ALPHA, /* U+00161d: CANADIAN SYLLABICS CARRIER JJO*/
+ RTUNI_ALPHA, /* U+00161e: CANADIAN SYLLABICS CARRIER JJE*/
+ RTUNI_ALPHA, /* U+00161f: CANADIAN SYLLABICS CARRIER JJEE*/
+ RTUNI_ALPHA, /* U+001620: CANADIAN SYLLABICS CARRIER JJI*/
+ RTUNI_ALPHA, /* U+001621: CANADIAN SYLLABICS CARRIER JJA*/
+ RTUNI_ALPHA, /* U+001622: CANADIAN SYLLABICS CARRIER LU*/
+ RTUNI_ALPHA, /* U+001623: CANADIAN SYLLABICS CARRIER LO*/
+ RTUNI_ALPHA, /* U+001624: CANADIAN SYLLABICS CARRIER LE*/
+ RTUNI_ALPHA, /* U+001625: CANADIAN SYLLABICS CARRIER LEE*/
+ RTUNI_ALPHA, /* U+001626: CANADIAN SYLLABICS CARRIER LI*/
+ RTUNI_ALPHA, /* U+001627: CANADIAN SYLLABICS CARRIER LA*/
+ RTUNI_ALPHA, /* U+001628: CANADIAN SYLLABICS CARRIER DLU*/
+ RTUNI_ALPHA, /* U+001629: CANADIAN SYLLABICS CARRIER DLO*/
+ RTUNI_ALPHA, /* U+00162a: CANADIAN SYLLABICS CARRIER DLE*/
+ RTUNI_ALPHA, /* U+00162b: CANADIAN SYLLABICS CARRIER DLEE*/
+ RTUNI_ALPHA, /* U+00162c: CANADIAN SYLLABICS CARRIER DLI*/
+ RTUNI_ALPHA, /* U+00162d: CANADIAN SYLLABICS CARRIER DLA*/
+ RTUNI_ALPHA, /* U+00162e: CANADIAN SYLLABICS CARRIER LHU*/
+ RTUNI_ALPHA, /* U+00162f: CANADIAN SYLLABICS CARRIER LHO*/
+ RTUNI_ALPHA, /* U+001630: CANADIAN SYLLABICS CARRIER LHE*/
+ RTUNI_ALPHA, /* U+001631: CANADIAN SYLLABICS CARRIER LHEE*/
+ RTUNI_ALPHA, /* U+001632: CANADIAN SYLLABICS CARRIER LHI*/
+ RTUNI_ALPHA, /* U+001633: CANADIAN SYLLABICS CARRIER LHA*/
+ RTUNI_ALPHA, /* U+001634: CANADIAN SYLLABICS CARRIER TLHU*/
+ RTUNI_ALPHA, /* U+001635: CANADIAN SYLLABICS CARRIER TLHO*/
+ RTUNI_ALPHA, /* U+001636: CANADIAN SYLLABICS CARRIER TLHE*/
+ RTUNI_ALPHA, /* U+001637: CANADIAN SYLLABICS CARRIER TLHEE*/
+ RTUNI_ALPHA, /* U+001638: CANADIAN SYLLABICS CARRIER TLHI*/
+ RTUNI_ALPHA, /* U+001639: CANADIAN SYLLABICS CARRIER TLHA*/
+ RTUNI_ALPHA, /* U+00163a: CANADIAN SYLLABICS CARRIER TLU*/
+ RTUNI_ALPHA, /* U+00163b: CANADIAN SYLLABICS CARRIER TLO*/
+ RTUNI_ALPHA, /* U+00163c: CANADIAN SYLLABICS CARRIER TLE*/
+ RTUNI_ALPHA, /* U+00163d: CANADIAN SYLLABICS CARRIER TLEE*/
+ RTUNI_ALPHA, /* U+00163e: CANADIAN SYLLABICS CARRIER TLI*/
+ RTUNI_ALPHA, /* U+00163f: CANADIAN SYLLABICS CARRIER TLA*/
+ RTUNI_ALPHA, /* U+001640: CANADIAN SYLLABICS CARRIER ZU*/
+ RTUNI_ALPHA, /* U+001641: CANADIAN SYLLABICS CARRIER ZO*/
+ RTUNI_ALPHA, /* U+001642: CANADIAN SYLLABICS CARRIER ZE*/
+ RTUNI_ALPHA, /* U+001643: CANADIAN SYLLABICS CARRIER ZEE*/
+ RTUNI_ALPHA, /* U+001644: CANADIAN SYLLABICS CARRIER ZI*/
+ RTUNI_ALPHA, /* U+001645: CANADIAN SYLLABICS CARRIER ZA*/
+ RTUNI_ALPHA, /* U+001646: CANADIAN SYLLABICS CARRIER Z*/
+ RTUNI_ALPHA, /* U+001647: CANADIAN SYLLABICS CARRIER INITIAL Z*/
+ RTUNI_ALPHA, /* U+001648: CANADIAN SYLLABICS CARRIER DZU*/
+ RTUNI_ALPHA, /* U+001649: CANADIAN SYLLABICS CARRIER DZO*/
+ RTUNI_ALPHA, /* U+00164a: CANADIAN SYLLABICS CARRIER DZE*/
+ RTUNI_ALPHA, /* U+00164b: CANADIAN SYLLABICS CARRIER DZEE*/
+ RTUNI_ALPHA, /* U+00164c: CANADIAN SYLLABICS CARRIER DZI*/
+ RTUNI_ALPHA, /* U+00164d: CANADIAN SYLLABICS CARRIER DZA*/
+ RTUNI_ALPHA, /* U+00164e: CANADIAN SYLLABICS CARRIER SU*/
+ RTUNI_ALPHA, /* U+00164f: CANADIAN SYLLABICS CARRIER SO*/
+ RTUNI_ALPHA, /* U+001650: CANADIAN SYLLABICS CARRIER SE*/
+ RTUNI_ALPHA, /* U+001651: CANADIAN SYLLABICS CARRIER SEE*/
+ RTUNI_ALPHA, /* U+001652: CANADIAN SYLLABICS CARRIER SI*/
+ RTUNI_ALPHA, /* U+001653: CANADIAN SYLLABICS CARRIER SA*/
+ RTUNI_ALPHA, /* U+001654: CANADIAN SYLLABICS CARRIER SHU*/
+ RTUNI_ALPHA, /* U+001655: CANADIAN SYLLABICS CARRIER SHO*/
+ RTUNI_ALPHA, /* U+001656: CANADIAN SYLLABICS CARRIER SHE*/
+ RTUNI_ALPHA, /* U+001657: CANADIAN SYLLABICS CARRIER SHEE*/
+ RTUNI_ALPHA, /* U+001658: CANADIAN SYLLABICS CARRIER SHI*/
+ RTUNI_ALPHA, /* U+001659: CANADIAN SYLLABICS CARRIER SHA*/
+ RTUNI_ALPHA, /* U+00165a: CANADIAN SYLLABICS CARRIER SH*/
+ RTUNI_ALPHA, /* U+00165b: CANADIAN SYLLABICS CARRIER TSU*/
+ RTUNI_ALPHA, /* U+00165c: CANADIAN SYLLABICS CARRIER TSO*/
+ RTUNI_ALPHA, /* U+00165d: CANADIAN SYLLABICS CARRIER TSE*/
+ RTUNI_ALPHA, /* U+00165e: CANADIAN SYLLABICS CARRIER TSEE*/
+ RTUNI_ALPHA, /* U+00165f: CANADIAN SYLLABICS CARRIER TSI*/
+ RTUNI_ALPHA, /* U+001660: CANADIAN SYLLABICS CARRIER TSA*/
+ RTUNI_ALPHA, /* U+001661: CANADIAN SYLLABICS CARRIER CHU*/
+ RTUNI_ALPHA, /* U+001662: CANADIAN SYLLABICS CARRIER CHO*/
+ RTUNI_ALPHA, /* U+001663: CANADIAN SYLLABICS CARRIER CHE*/
+ RTUNI_ALPHA, /* U+001664: CANADIAN SYLLABICS CARRIER CHEE*/
+ RTUNI_ALPHA, /* U+001665: CANADIAN SYLLABICS CARRIER CHI*/
+ RTUNI_ALPHA, /* U+001666: CANADIAN SYLLABICS CARRIER CHA*/
+ RTUNI_ALPHA, /* U+001667: CANADIAN SYLLABICS CARRIER TTSU*/
+ RTUNI_ALPHA, /* U+001668: CANADIAN SYLLABICS CARRIER TTSO*/
+ RTUNI_ALPHA, /* U+001669: CANADIAN SYLLABICS CARRIER TTSE*/
+ RTUNI_ALPHA, /* U+00166a: CANADIAN SYLLABICS CARRIER TTSEE*/
+ RTUNI_ALPHA, /* U+00166b: CANADIAN SYLLABICS CARRIER TTSI*/
+ RTUNI_ALPHA, /* U+00166c: CANADIAN SYLLABICS CARRIER TTSA*/
+ 0, /* U+00166d: CANADIAN SYLLABICS CHI SIGN*/
+ 0, /* U+00166e: CANADIAN SYLLABICS FULL STOP*/
+ RTUNI_ALPHA, /* U+00166f: CANADIAN SYLLABICS QAI*/
+ RTUNI_ALPHA, /* U+001670: CANADIAN SYLLABICS NGAI*/
+ RTUNI_ALPHA, /* U+001671: CANADIAN SYLLABICS NNGI*/
+ RTUNI_ALPHA, /* U+001672: CANADIAN SYLLABICS NNGII*/
+ RTUNI_ALPHA, /* U+001673: CANADIAN SYLLABICS NNGO*/
+ RTUNI_ALPHA, /* U+001674: CANADIAN SYLLABICS NNGOO*/
+ RTUNI_ALPHA, /* U+001675: CANADIAN SYLLABICS NNGA*/
+ RTUNI_ALPHA, /* U+001676: CANADIAN SYLLABICS NNGAA*/
+ RTUNI_ALPHA, /* U+001677: CANADIAN SYLLABICS WOODS-CREE THWEE*/
+ RTUNI_ALPHA, /* U+001678: CANADIAN SYLLABICS WOODS-CREE THWI*/
+ RTUNI_ALPHA, /* U+001679: CANADIAN SYLLABICS WOODS-CREE THWII*/
+ RTUNI_ALPHA, /* U+00167a: CANADIAN SYLLABICS WOODS-CREE THWO*/
+ RTUNI_ALPHA, /* U+00167b: CANADIAN SYLLABICS WOODS-CREE THWOO*/
+ RTUNI_ALPHA, /* U+00167c: CANADIAN SYLLABICS WOODS-CREE THWA*/
+ RTUNI_ALPHA, /* U+00167d: CANADIAN SYLLABICS WOODS-CREE THWAA*/
+ RTUNI_ALPHA, /* U+00167e: CANADIAN SYLLABICS WOODS-CREE FINAL TH*/
+ RTUNI_ALPHA, /* U+00167f: CANADIAN SYLLABICS BLACKFOOT W*/
+ RTUNI_WSPACE, /* U+001680: OGHAM SPACE MARK*/
+ RTUNI_ALPHA, /* U+001681: OGHAM LETTER BEITH*/
+ RTUNI_ALPHA, /* U+001682: OGHAM LETTER LUIS*/
+ RTUNI_ALPHA, /* U+001683: OGHAM LETTER FEARN*/
+ RTUNI_ALPHA, /* U+001684: OGHAM LETTER SAIL*/
+ RTUNI_ALPHA, /* U+001685: OGHAM LETTER NION*/
+ RTUNI_ALPHA, /* U+001686: OGHAM LETTER UATH*/
+ RTUNI_ALPHA, /* U+001687: OGHAM LETTER DAIR*/
+ RTUNI_ALPHA, /* U+001688: OGHAM LETTER TINNE*/
+ RTUNI_ALPHA, /* U+001689: OGHAM LETTER COLL*/
+ RTUNI_ALPHA, /* U+00168a: OGHAM LETTER CEIRT*/
+ RTUNI_ALPHA, /* U+00168b: OGHAM LETTER MUIN*/
+ RTUNI_ALPHA, /* U+00168c: OGHAM LETTER GORT*/
+ RTUNI_ALPHA, /* U+00168d: OGHAM LETTER NGEADAL*/
+ RTUNI_ALPHA, /* U+00168e: OGHAM LETTER STRAIF*/
+ RTUNI_ALPHA, /* U+00168f: OGHAM LETTER RUIS*/
+ RTUNI_ALPHA, /* U+001690: OGHAM LETTER AILM*/
+ RTUNI_ALPHA, /* U+001691: OGHAM LETTER ONN*/
+ RTUNI_ALPHA, /* U+001692: OGHAM LETTER UR*/
+ RTUNI_ALPHA, /* U+001693: OGHAM LETTER EADHADH*/
+ RTUNI_ALPHA, /* U+001694: OGHAM LETTER IODHADH*/
+ RTUNI_ALPHA, /* U+001695: OGHAM LETTER EABHADH*/
+ RTUNI_ALPHA, /* U+001696: OGHAM LETTER OR*/
+ RTUNI_ALPHA, /* U+001697: OGHAM LETTER UILLEANN*/
+ RTUNI_ALPHA, /* U+001698: OGHAM LETTER IFIN*/
+ RTUNI_ALPHA, /* U+001699: OGHAM LETTER EAMHANCHOLL*/
+ RTUNI_ALPHA, /* U+00169a: OGHAM LETTER PEITH*/
+ 0, /* U+00169b: OGHAM FEATHER MARK*/
+ 0, /* U+00169c: OGHAM REVERSED FEATHER MARK*/
+ 0, /* U+00169d: */
+ 0, /* U+00169e: */
+ 0, /* U+00169f: */
+ RTUNI_ALPHA, /* U+0016a0: RUNIC LETTER FEHU FEOH FE F*/
+ RTUNI_ALPHA, /* U+0016a1: RUNIC LETTER V*/
+ RTUNI_ALPHA, /* U+0016a2: RUNIC LETTER URUZ UR U*/
+ RTUNI_ALPHA, /* U+0016a3: RUNIC LETTER YR*/
+ RTUNI_ALPHA, /* U+0016a4: RUNIC LETTER Y*/
+ RTUNI_ALPHA, /* U+0016a5: RUNIC LETTER W*/
+ RTUNI_ALPHA, /* U+0016a6: RUNIC LETTER THURISAZ THURS THORN*/
+ RTUNI_ALPHA, /* U+0016a7: RUNIC LETTER ETH*/
+ RTUNI_ALPHA, /* U+0016a8: RUNIC LETTER ANSUZ A*/
+ RTUNI_ALPHA, /* U+0016a9: RUNIC LETTER OS O*/
+ RTUNI_ALPHA, /* U+0016aa: RUNIC LETTER AC A*/
+ RTUNI_ALPHA, /* U+0016ab: RUNIC LETTER AESC*/
+ RTUNI_ALPHA, /* U+0016ac: RUNIC LETTER LONG-BRANCH-OSS O*/
+ RTUNI_ALPHA, /* U+0016ad: RUNIC LETTER SHORT-TWIG-OSS O*/
+ RTUNI_ALPHA, /* U+0016ae: RUNIC LETTER O*/
+ RTUNI_ALPHA, /* U+0016af: RUNIC LETTER OE*/
+ RTUNI_ALPHA, /* U+0016b0: RUNIC LETTER ON*/
+ RTUNI_ALPHA, /* U+0016b1: RUNIC LETTER RAIDO RAD REID R*/
+ RTUNI_ALPHA, /* U+0016b2: RUNIC LETTER KAUNA*/
+ RTUNI_ALPHA, /* U+0016b3: RUNIC LETTER CEN*/
+ RTUNI_ALPHA, /* U+0016b4: RUNIC LETTER KAUN K*/
+ RTUNI_ALPHA, /* U+0016b5: RUNIC LETTER G*/
+ RTUNI_ALPHA, /* U+0016b6: RUNIC LETTER ENG*/
+ RTUNI_ALPHA, /* U+0016b7: RUNIC LETTER GEBO GYFU G*/
+ RTUNI_ALPHA, /* U+0016b8: RUNIC LETTER GAR*/
+ RTUNI_ALPHA, /* U+0016b9: RUNIC LETTER WUNJO WYNN W*/
+ RTUNI_ALPHA, /* U+0016ba: RUNIC LETTER HAGLAZ H*/
+ RTUNI_ALPHA, /* U+0016bb: RUNIC LETTER HAEGL H*/
+ RTUNI_ALPHA, /* U+0016bc: RUNIC LETTER LONG-BRANCH-HAGALL H*/
+ RTUNI_ALPHA, /* U+0016bd: RUNIC LETTER SHORT-TWIG-HAGALL H*/
+ RTUNI_ALPHA, /* U+0016be: RUNIC LETTER NAUDIZ NYD NAUD N*/
+ RTUNI_ALPHA, /* U+0016bf: RUNIC LETTER SHORT-TWIG-NAUD N*/
+ RTUNI_ALPHA, /* U+0016c0: RUNIC LETTER DOTTED-N*/
+ RTUNI_ALPHA, /* U+0016c1: RUNIC LETTER ISAZ IS ISS I*/
+ RTUNI_ALPHA, /* U+0016c2: RUNIC LETTER E*/
+ RTUNI_ALPHA, /* U+0016c3: RUNIC LETTER JERAN J*/
+ RTUNI_ALPHA, /* U+0016c4: RUNIC LETTER GER*/
+ RTUNI_ALPHA, /* U+0016c5: RUNIC LETTER LONG-BRANCH-AR AE*/
+ RTUNI_ALPHA, /* U+0016c6: RUNIC LETTER SHORT-TWIG-AR A*/
+ RTUNI_ALPHA, /* U+0016c7: RUNIC LETTER IWAZ EOH*/
+ RTUNI_ALPHA, /* U+0016c8: RUNIC LETTER PERTHO PEORTH P*/
+ RTUNI_ALPHA, /* U+0016c9: RUNIC LETTER ALGIZ EOLHX*/
+ RTUNI_ALPHA, /* U+0016ca: RUNIC LETTER SOWILO S*/
+ RTUNI_ALPHA, /* U+0016cb: RUNIC LETTER SIGEL LONG-BRANCH-SOL S*/
+ RTUNI_ALPHA, /* U+0016cc: RUNIC LETTER SHORT-TWIG-SOL S*/
+ RTUNI_ALPHA, /* U+0016cd: RUNIC LETTER C*/
+ RTUNI_ALPHA, /* U+0016ce: RUNIC LETTER Z*/
+ RTUNI_ALPHA, /* U+0016cf: RUNIC LETTER TIWAZ TIR TYR T*/
+ RTUNI_ALPHA, /* U+0016d0: RUNIC LETTER SHORT-TWIG-TYR T*/
+ RTUNI_ALPHA, /* U+0016d1: RUNIC LETTER D*/
+ RTUNI_ALPHA, /* U+0016d2: RUNIC LETTER BERKANAN BEORC BJARKAN B*/
+ RTUNI_ALPHA, /* U+0016d3: RUNIC LETTER SHORT-TWIG-BJARKAN B*/
+ RTUNI_ALPHA, /* U+0016d4: RUNIC LETTER DOTTED-P*/
+ RTUNI_ALPHA, /* U+0016d5: RUNIC LETTER OPEN-P*/
+ RTUNI_ALPHA, /* U+0016d6: RUNIC LETTER EHWAZ EH E*/
+ RTUNI_ALPHA, /* U+0016d7: RUNIC LETTER MANNAZ MAN M*/
+ RTUNI_ALPHA, /* U+0016d8: RUNIC LETTER LONG-BRANCH-MADR M*/
+ RTUNI_ALPHA, /* U+0016d9: RUNIC LETTER SHORT-TWIG-MADR M*/
+ RTUNI_ALPHA, /* U+0016da: RUNIC LETTER LAUKAZ LAGU LOGR L*/
+ RTUNI_ALPHA, /* U+0016db: RUNIC LETTER DOTTED-L*/
+ RTUNI_ALPHA, /* U+0016dc: RUNIC LETTER INGWAZ*/
+ RTUNI_ALPHA, /* U+0016dd: RUNIC LETTER ING*/
+ RTUNI_ALPHA, /* U+0016de: RUNIC LETTER DAGAZ DAEG D*/
+ RTUNI_ALPHA, /* U+0016df: RUNIC LETTER OTHALAN ETHEL O*/
+ RTUNI_ALPHA, /* U+0016e0: RUNIC LETTER EAR*/
+ RTUNI_ALPHA, /* U+0016e1: RUNIC LETTER IOR*/
+ RTUNI_ALPHA, /* U+0016e2: RUNIC LETTER CWEORTH*/
+ RTUNI_ALPHA, /* U+0016e3: RUNIC LETTER CALC*/
+ RTUNI_ALPHA, /* U+0016e4: RUNIC LETTER CEALC*/
+ RTUNI_ALPHA, /* U+0016e5: RUNIC LETTER STAN*/
+ RTUNI_ALPHA, /* U+0016e6: RUNIC LETTER LONG-BRANCH-YR*/
+ RTUNI_ALPHA, /* U+0016e7: RUNIC LETTER SHORT-TWIG-YR*/
+ RTUNI_ALPHA, /* U+0016e8: RUNIC LETTER ICELANDIC-YR*/
+ RTUNI_ALPHA, /* U+0016e9: RUNIC LETTER Q*/
+ RTUNI_ALPHA, /* U+0016ea: RUNIC LETTER X*/
+ 0, /* U+0016eb: RUNIC SINGLE PUNCTUATION*/
+ 0, /* U+0016ec: RUNIC MULTIPLE PUNCTUATION*/
+ 0, /* U+0016ed: RUNIC CROSS PUNCTUATION*/
+ RTUNI_ALPHA, /* U+0016ee: RUNIC ARLAUG SYMBOL*/
+ RTUNI_ALPHA, /* U+0016ef: RUNIC TVIMADUR SYMBOL*/
+ RTUNI_ALPHA, /* U+0016f0: RUNIC BELGTHOR SYMBOL*/
+ 0, /* U+0016f1: */
+ 0, /* U+0016f2: */
+ 0, /* U+0016f3: */
+ 0, /* U+0016f4: */
+ 0, /* U+0016f5: */
+ 0, /* U+0016f6: */
+ 0, /* U+0016f7: */
+ 0, /* U+0016f8: */
+ 0, /* U+0016f9: */
+ 0, /* U+0016fa: */
+ 0, /* U+0016fb: */
+ 0, /* U+0016fc: */
+ 0, /* U+0016fd: */
+ 0, /* U+0016fe: */
+ 0, /* U+0016ff: */
+ RTUNI_ALPHA, /* U+001700: TAGALOG LETTER A*/
+ RTUNI_ALPHA, /* U+001701: TAGALOG LETTER I*/
+ RTUNI_ALPHA, /* U+001702: TAGALOG LETTER U*/
+ RTUNI_ALPHA, /* U+001703: TAGALOG LETTER KA*/
+ RTUNI_ALPHA, /* U+001704: TAGALOG LETTER GA*/
+ RTUNI_ALPHA, /* U+001705: TAGALOG LETTER NGA*/
+ RTUNI_ALPHA, /* U+001706: TAGALOG LETTER TA*/
+ RTUNI_ALPHA, /* U+001707: TAGALOG LETTER DA*/
+ RTUNI_ALPHA, /* U+001708: TAGALOG LETTER NA*/
+ RTUNI_ALPHA, /* U+001709: TAGALOG LETTER PA*/
+ RTUNI_ALPHA, /* U+00170a: TAGALOG LETTER BA*/
+ RTUNI_ALPHA, /* U+00170b: TAGALOG LETTER MA*/
+ RTUNI_ALPHA, /* U+00170c: TAGALOG LETTER YA*/
+ 0, /* U+00170d: */
+ RTUNI_ALPHA, /* U+00170e: TAGALOG LETTER LA*/
+ RTUNI_ALPHA, /* U+00170f: TAGALOG LETTER WA*/
+ RTUNI_ALPHA, /* U+001710: TAGALOG LETTER SA*/
+ RTUNI_ALPHA, /* U+001711: TAGALOG LETTER HA*/
+ RTUNI_ALPHA, /* U+001712: TAGALOG VOWEL SIGN I*/
+ RTUNI_ALPHA, /* U+001713: TAGALOG VOWEL SIGN U*/
+ 0, /* U+001714: TAGALOG SIGN VIRAMA*/
+ 0, /* U+001715: */
+ 0, /* U+001716: */
+ 0, /* U+001717: */
+ 0, /* U+001718: */
+ 0, /* U+001719: */
+ 0, /* U+00171a: */
+ 0, /* U+00171b: */
+ 0, /* U+00171c: */
+ 0, /* U+00171d: */
+ 0, /* U+00171e: */
+ 0, /* U+00171f: */
+ RTUNI_ALPHA, /* U+001720: HANUNOO LETTER A*/
+ RTUNI_ALPHA, /* U+001721: HANUNOO LETTER I*/
+ RTUNI_ALPHA, /* U+001722: HANUNOO LETTER U*/
+ RTUNI_ALPHA, /* U+001723: HANUNOO LETTER KA*/
+ RTUNI_ALPHA, /* U+001724: HANUNOO LETTER GA*/
+ RTUNI_ALPHA, /* U+001725: HANUNOO LETTER NGA*/
+ RTUNI_ALPHA, /* U+001726: HANUNOO LETTER TA*/
+ RTUNI_ALPHA, /* U+001727: HANUNOO LETTER DA*/
+ RTUNI_ALPHA, /* U+001728: HANUNOO LETTER NA*/
+ RTUNI_ALPHA, /* U+001729: HANUNOO LETTER PA*/
+ RTUNI_ALPHA, /* U+00172a: HANUNOO LETTER BA*/
+ RTUNI_ALPHA, /* U+00172b: HANUNOO LETTER MA*/
+ RTUNI_ALPHA, /* U+00172c: HANUNOO LETTER YA*/
+ RTUNI_ALPHA, /* U+00172d: HANUNOO LETTER RA*/
+ RTUNI_ALPHA, /* U+00172e: HANUNOO LETTER LA*/
+ RTUNI_ALPHA, /* U+00172f: HANUNOO LETTER WA*/
+ RTUNI_ALPHA, /* U+001730: HANUNOO LETTER SA*/
+ RTUNI_ALPHA, /* U+001731: HANUNOO LETTER HA*/
+ RTUNI_ALPHA, /* U+001732: HANUNOO VOWEL SIGN I*/
+ RTUNI_ALPHA, /* U+001733: HANUNOO VOWEL SIGN U*/
+ 0, /* U+001734: HANUNOO SIGN PAMUDPOD*/
+ 0, /* U+001735: PHILIPPINE SINGLE PUNCTUATION*/
+ 0, /* U+001736: PHILIPPINE DOUBLE PUNCTUATION*/
+ 0, /* U+001737: */
+ 0, /* U+001738: */
+ 0, /* U+001739: */
+ 0, /* U+00173a: */
+ 0, /* U+00173b: */
+ 0, /* U+00173c: */
+ 0, /* U+00173d: */
+ 0, /* U+00173e: */
+ 0, /* U+00173f: */
+ RTUNI_ALPHA, /* U+001740: BUHID LETTER A*/
+ RTUNI_ALPHA, /* U+001741: BUHID LETTER I*/
+ RTUNI_ALPHA, /* U+001742: BUHID LETTER U*/
+ RTUNI_ALPHA, /* U+001743: BUHID LETTER KA*/
+ RTUNI_ALPHA, /* U+001744: BUHID LETTER GA*/
+ RTUNI_ALPHA, /* U+001745: BUHID LETTER NGA*/
+ RTUNI_ALPHA, /* U+001746: BUHID LETTER TA*/
+ RTUNI_ALPHA, /* U+001747: BUHID LETTER DA*/
+ RTUNI_ALPHA, /* U+001748: BUHID LETTER NA*/
+ RTUNI_ALPHA, /* U+001749: BUHID LETTER PA*/
+ RTUNI_ALPHA, /* U+00174a: BUHID LETTER BA*/
+ RTUNI_ALPHA, /* U+00174b: BUHID LETTER MA*/
+ RTUNI_ALPHA, /* U+00174c: BUHID LETTER YA*/
+ RTUNI_ALPHA, /* U+00174d: BUHID LETTER RA*/
+ RTUNI_ALPHA, /* U+00174e: BUHID LETTER LA*/
+ RTUNI_ALPHA, /* U+00174f: BUHID LETTER WA*/
+ RTUNI_ALPHA, /* U+001750: BUHID LETTER SA*/
+ RTUNI_ALPHA, /* U+001751: BUHID LETTER HA*/
+ RTUNI_ALPHA, /* U+001752: BUHID VOWEL SIGN I*/
+ RTUNI_ALPHA, /* U+001753: BUHID VOWEL SIGN U*/
+ 0, /* U+001754: */
+ 0, /* U+001755: */
+ 0, /* U+001756: */
+ 0, /* U+001757: */
+ 0, /* U+001758: */
+ 0, /* U+001759: */
+ 0, /* U+00175a: */
+ 0, /* U+00175b: */
+ 0, /* U+00175c: */
+ 0, /* U+00175d: */
+ 0, /* U+00175e: */
+ 0, /* U+00175f: */
+ RTUNI_ALPHA, /* U+001760: TAGBANWA LETTER A*/
+ RTUNI_ALPHA, /* U+001761: TAGBANWA LETTER I*/
+ RTUNI_ALPHA, /* U+001762: TAGBANWA LETTER U*/
+ RTUNI_ALPHA, /* U+001763: TAGBANWA LETTER KA*/
+ RTUNI_ALPHA, /* U+001764: TAGBANWA LETTER GA*/
+ RTUNI_ALPHA, /* U+001765: TAGBANWA LETTER NGA*/
+ RTUNI_ALPHA, /* U+001766: TAGBANWA LETTER TA*/
+ RTUNI_ALPHA, /* U+001767: TAGBANWA LETTER DA*/
+ RTUNI_ALPHA, /* U+001768: TAGBANWA LETTER NA*/
+ RTUNI_ALPHA, /* U+001769: TAGBANWA LETTER PA*/
+ RTUNI_ALPHA, /* U+00176a: TAGBANWA LETTER BA*/
+ RTUNI_ALPHA, /* U+00176b: TAGBANWA LETTER MA*/
+ RTUNI_ALPHA, /* U+00176c: TAGBANWA LETTER YA*/
+ 0, /* U+00176d: */
+ RTUNI_ALPHA, /* U+00176e: TAGBANWA LETTER LA*/
+ RTUNI_ALPHA, /* U+00176f: TAGBANWA LETTER WA*/
+ RTUNI_ALPHA, /* U+001770: TAGBANWA LETTER SA*/
+ 0, /* U+001771: */
+ RTUNI_ALPHA, /* U+001772: TAGBANWA VOWEL SIGN I*/
+ RTUNI_ALPHA, /* U+001773: TAGBANWA VOWEL SIGN U*/
+ 0, /* U+001774: */
+ 0, /* U+001775: */
+ 0, /* U+001776: */
+ 0, /* U+001777: */
+ 0, /* U+001778: */
+ 0, /* U+001779: */
+ 0, /* U+00177a: */
+ 0, /* U+00177b: */
+ 0, /* U+00177c: */
+ 0, /* U+00177d: */
+ 0, /* U+00177e: */
+ 0, /* U+00177f: */
+ RTUNI_ALPHA, /* U+001780: KHMER LETTER KA*/
+ RTUNI_ALPHA, /* U+001781: KHMER LETTER KHA*/
+ RTUNI_ALPHA, /* U+001782: KHMER LETTER KO*/
+ RTUNI_ALPHA, /* U+001783: KHMER LETTER KHO*/
+ RTUNI_ALPHA, /* U+001784: KHMER LETTER NGO*/
+ RTUNI_ALPHA, /* U+001785: KHMER LETTER CA*/
+ RTUNI_ALPHA, /* U+001786: KHMER LETTER CHA*/
+ RTUNI_ALPHA, /* U+001787: KHMER LETTER CO*/
+ RTUNI_ALPHA, /* U+001788: KHMER LETTER CHO*/
+ RTUNI_ALPHA, /* U+001789: KHMER LETTER NYO*/
+ RTUNI_ALPHA, /* U+00178a: KHMER LETTER DA*/
+ RTUNI_ALPHA, /* U+00178b: KHMER LETTER TTHA*/
+ RTUNI_ALPHA, /* U+00178c: KHMER LETTER DO*/
+ RTUNI_ALPHA, /* U+00178d: KHMER LETTER TTHO*/
+ RTUNI_ALPHA, /* U+00178e: KHMER LETTER NNO*/
+ RTUNI_ALPHA, /* U+00178f: KHMER LETTER TA*/
+ RTUNI_ALPHA, /* U+001790: KHMER LETTER THA*/
+ RTUNI_ALPHA, /* U+001791: KHMER LETTER TO*/
+ RTUNI_ALPHA, /* U+001792: KHMER LETTER THO*/
+ RTUNI_ALPHA, /* U+001793: KHMER LETTER NO*/
+ RTUNI_ALPHA, /* U+001794: KHMER LETTER BA*/
+ RTUNI_ALPHA, /* U+001795: KHMER LETTER PHA*/
+ RTUNI_ALPHA, /* U+001796: KHMER LETTER PO*/
+ RTUNI_ALPHA, /* U+001797: KHMER LETTER PHO*/
+ RTUNI_ALPHA, /* U+001798: KHMER LETTER MO*/
+ RTUNI_ALPHA, /* U+001799: KHMER LETTER YO*/
+ RTUNI_ALPHA, /* U+00179a: KHMER LETTER RO*/
+ RTUNI_ALPHA, /* U+00179b: KHMER LETTER LO*/
+ RTUNI_ALPHA, /* U+00179c: KHMER LETTER VO*/
+ RTUNI_ALPHA, /* U+00179d: KHMER LETTER SHA*/
+ RTUNI_ALPHA, /* U+00179e: KHMER LETTER SSO*/
+ RTUNI_ALPHA, /* U+00179f: KHMER LETTER SA*/
+ RTUNI_ALPHA, /* U+0017a0: KHMER LETTER HA*/
+ RTUNI_ALPHA, /* U+0017a1: KHMER LETTER LA*/
+ RTUNI_ALPHA, /* U+0017a2: KHMER LETTER QA*/
+ RTUNI_ALPHA, /* U+0017a3: KHMER INDEPENDENT VOWEL QAQ*/
+ RTUNI_ALPHA, /* U+0017a4: KHMER INDEPENDENT VOWEL QAA*/
+ RTUNI_ALPHA, /* U+0017a5: KHMER INDEPENDENT VOWEL QI*/
+ RTUNI_ALPHA, /* U+0017a6: KHMER INDEPENDENT VOWEL QII*/
+ RTUNI_ALPHA, /* U+0017a7: KHMER INDEPENDENT VOWEL QU*/
+ RTUNI_ALPHA, /* U+0017a8: KHMER INDEPENDENT VOWEL QUK*/
+ RTUNI_ALPHA, /* U+0017a9: KHMER INDEPENDENT VOWEL QUU*/
+ RTUNI_ALPHA, /* U+0017aa: KHMER INDEPENDENT VOWEL QUUV*/
+ RTUNI_ALPHA, /* U+0017ab: KHMER INDEPENDENT VOWEL RY*/
+ RTUNI_ALPHA, /* U+0017ac: KHMER INDEPENDENT VOWEL RYY*/
+ RTUNI_ALPHA, /* U+0017ad: KHMER INDEPENDENT VOWEL LY*/
+ RTUNI_ALPHA, /* U+0017ae: KHMER INDEPENDENT VOWEL LYY*/
+ RTUNI_ALPHA, /* U+0017af: KHMER INDEPENDENT VOWEL QE*/
+ RTUNI_ALPHA, /* U+0017b0: KHMER INDEPENDENT VOWEL QAI*/
+ RTUNI_ALPHA, /* U+0017b1: KHMER INDEPENDENT VOWEL QOO TYPE ONE*/
+ RTUNI_ALPHA, /* U+0017b2: KHMER INDEPENDENT VOWEL QOO TYPE TWO*/
+ RTUNI_ALPHA, /* U+0017b3: KHMER INDEPENDENT VOWEL QAU*/
+ 0, /* U+0017b4: KHMER VOWEL INHERENT AQ*/
+ 0, /* U+0017b5: KHMER VOWEL INHERENT AA*/
+ RTUNI_ALPHA, /* U+0017b6: KHMER VOWEL SIGN AA*/
+ RTUNI_ALPHA, /* U+0017b7: KHMER VOWEL SIGN I*/
+ RTUNI_ALPHA, /* U+0017b8: KHMER VOWEL SIGN II*/
+ RTUNI_ALPHA, /* U+0017b9: KHMER VOWEL SIGN Y*/
+ RTUNI_ALPHA, /* U+0017ba: KHMER VOWEL SIGN YY*/
+ RTUNI_ALPHA, /* U+0017bb: KHMER VOWEL SIGN U*/
+ RTUNI_ALPHA, /* U+0017bc: KHMER VOWEL SIGN UU*/
+ RTUNI_ALPHA, /* U+0017bd: KHMER VOWEL SIGN UA*/
+ RTUNI_ALPHA, /* U+0017be: KHMER VOWEL SIGN OE*/
+ RTUNI_ALPHA, /* U+0017bf: KHMER VOWEL SIGN YA*/
+ RTUNI_ALPHA, /* U+0017c0: KHMER VOWEL SIGN IE*/
+ RTUNI_ALPHA, /* U+0017c1: KHMER VOWEL SIGN E*/
+ RTUNI_ALPHA, /* U+0017c2: KHMER VOWEL SIGN AE*/
+ RTUNI_ALPHA, /* U+0017c3: KHMER VOWEL SIGN AI*/
+ RTUNI_ALPHA, /* U+0017c4: KHMER VOWEL SIGN OO*/
+ RTUNI_ALPHA, /* U+0017c5: KHMER VOWEL SIGN AU*/
+ RTUNI_ALPHA, /* U+0017c6: KHMER SIGN NIKAHIT*/
+ RTUNI_ALPHA, /* U+0017c7: KHMER SIGN REAHMUK*/
+ RTUNI_ALPHA, /* U+0017c8: KHMER SIGN YUUKALEAPINTU*/
+ 0, /* U+0017c9: KHMER SIGN MUUSIKATOAN*/
+ 0, /* U+0017ca: KHMER SIGN TRIISAP*/
+ 0, /* U+0017cb: KHMER SIGN BANTOC*/
+ 0, /* U+0017cc: KHMER SIGN ROBAT*/
+ 0, /* U+0017cd: KHMER SIGN TOANDAKHIAT*/
+ 0, /* U+0017ce: KHMER SIGN KAKABAT*/
+ 0, /* U+0017cf: KHMER SIGN AHSDA*/
+ 0, /* U+0017d0: KHMER SIGN SAMYOK SANNYA*/
+ 0, /* U+0017d1: KHMER SIGN VIRIAM*/
+ 0, /* U+0017d2: KHMER SIGN COENG*/
+ 0, /* U+0017d3: KHMER SIGN BATHAMASAT*/
+ 0, /* U+0017d4: KHMER SIGN KHAN*/
+ 0, /* U+0017d5: KHMER SIGN BARIYOOSAN*/
+ 0, /* U+0017d6: KHMER SIGN CAMNUC PII KUUH*/
+ RTUNI_ALPHA, /* U+0017d7: KHMER SIGN LEK TOO*/
+ 0, /* U+0017d8: KHMER SIGN BEYYAL*/
+ 0, /* U+0017d9: KHMER SIGN PHNAEK MUAN*/
+ 0, /* U+0017da: KHMER SIGN KOOMUUT*/
+ 0, /* U+0017db: KHMER CURRENCY SYMBOL RIEL*/
+ RTUNI_ALPHA, /* U+0017dc: KHMER SIGN AVAKRAHASANYA*/
+ 0, /* U+0017dd: KHMER SIGN ATTHACAN*/
+ 0, /* U+0017de: */
+ 0, /* U+0017df: */
+ RTUNI_DDIGIT, /* U+0017e0: KHMER DIGIT ZERO*/
+ RTUNI_DDIGIT, /* U+0017e1: KHMER DIGIT ONE*/
+ RTUNI_DDIGIT, /* U+0017e2: KHMER DIGIT TWO*/
+ RTUNI_DDIGIT, /* U+0017e3: KHMER DIGIT THREE*/
+ RTUNI_DDIGIT, /* U+0017e4: KHMER DIGIT FOUR*/
+ RTUNI_DDIGIT, /* U+0017e5: KHMER DIGIT FIVE*/
+ RTUNI_DDIGIT, /* U+0017e6: KHMER DIGIT SIX*/
+ RTUNI_DDIGIT, /* U+0017e7: KHMER DIGIT SEVEN*/
+ RTUNI_DDIGIT, /* U+0017e8: KHMER DIGIT EIGHT*/
+ RTUNI_DDIGIT, /* U+0017e9: KHMER DIGIT NINE*/
+ 0, /* U+0017ea: */
+ 0, /* U+0017eb: */
+ 0, /* U+0017ec: */
+ 0, /* U+0017ed: */
+ 0, /* U+0017ee: */
+ 0, /* U+0017ef: */
+ 0, /* U+0017f0: KHMER SYMBOL LEK ATTAK SON*/
+ 0, /* U+0017f1: KHMER SYMBOL LEK ATTAK MUOY*/
+ 0, /* U+0017f2: KHMER SYMBOL LEK ATTAK PII*/
+ 0, /* U+0017f3: KHMER SYMBOL LEK ATTAK BEI*/
+ 0, /* U+0017f4: KHMER SYMBOL LEK ATTAK BUON*/
+ 0, /* U+0017f5: KHMER SYMBOL LEK ATTAK PRAM*/
+ 0, /* U+0017f6: KHMER SYMBOL LEK ATTAK PRAM-MUOY*/
+ 0, /* U+0017f7: KHMER SYMBOL LEK ATTAK PRAM-PII*/
+ 0, /* U+0017f8: KHMER SYMBOL LEK ATTAK PRAM-BEI*/
+ 0, /* U+0017f9: KHMER SYMBOL LEK ATTAK PRAM-BUON*/
+ 0, /* U+0017fa: */
+ 0, /* U+0017fb: */
+ 0, /* U+0017fc: */
+ 0, /* U+0017fd: */
+ 0, /* U+0017fe: */
+ 0, /* U+0017ff: */
+ 0, /* U+001800: MONGOLIAN BIRGA*/
+ 0, /* U+001801: MONGOLIAN ELLIPSIS*/
+ 0, /* U+001802: MONGOLIAN COMMA*/
+ 0, /* U+001803: MONGOLIAN FULL STOP*/
+ 0, /* U+001804: MONGOLIAN COLON*/
+ 0, /* U+001805: MONGOLIAN FOUR DOTS*/
+ 0, /* U+001806: MONGOLIAN TODO SOFT HYPHEN*/
+ 0, /* U+001807: MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER*/
+ 0, /* U+001808: MONGOLIAN MANCHU COMMA*/
+ 0, /* U+001809: MONGOLIAN MANCHU FULL STOP*/
+ 0, /* U+00180a: MONGOLIAN NIRUGU*/
+ 0, /* U+00180b: MONGOLIAN FREE VARIATION SELECTOR ONE*/
+ 0, /* U+00180c: MONGOLIAN FREE VARIATION SELECTOR TWO*/
+ 0, /* U+00180d: MONGOLIAN FREE VARIATION SELECTOR THREE*/
+ 0, /* U+00180e: MONGOLIAN VOWEL SEPARATOR*/
+ 0, /* U+00180f: */
+ RTUNI_DDIGIT, /* U+001810: MONGOLIAN DIGIT ZERO*/
+ RTUNI_DDIGIT, /* U+001811: MONGOLIAN DIGIT ONE*/
+ RTUNI_DDIGIT, /* U+001812: MONGOLIAN DIGIT TWO*/
+ RTUNI_DDIGIT, /* U+001813: MONGOLIAN DIGIT THREE*/
+ RTUNI_DDIGIT, /* U+001814: MONGOLIAN DIGIT FOUR*/
+ RTUNI_DDIGIT, /* U+001815: MONGOLIAN DIGIT FIVE*/
+ RTUNI_DDIGIT, /* U+001816: MONGOLIAN DIGIT SIX*/
+ RTUNI_DDIGIT, /* U+001817: MONGOLIAN DIGIT SEVEN*/
+ RTUNI_DDIGIT, /* U+001818: MONGOLIAN DIGIT EIGHT*/
+ RTUNI_DDIGIT, /* U+001819: MONGOLIAN DIGIT NINE*/
+ 0, /* U+00181a: */
+ 0, /* U+00181b: */
+ 0, /* U+00181c: */
+ 0, /* U+00181d: */
+ 0, /* U+00181e: */
+ 0, /* U+00181f: */
+ RTUNI_ALPHA, /* U+001820: MONGOLIAN LETTER A*/
+ RTUNI_ALPHA, /* U+001821: MONGOLIAN LETTER E*/
+ RTUNI_ALPHA, /* U+001822: MONGOLIAN LETTER I*/
+ RTUNI_ALPHA, /* U+001823: MONGOLIAN LETTER O*/
+ RTUNI_ALPHA, /* U+001824: MONGOLIAN LETTER U*/
+ RTUNI_ALPHA, /* U+001825: MONGOLIAN LETTER OE*/
+ RTUNI_ALPHA, /* U+001826: MONGOLIAN LETTER UE*/
+ RTUNI_ALPHA, /* U+001827: MONGOLIAN LETTER EE*/
+ RTUNI_ALPHA, /* U+001828: MONGOLIAN LETTER NA*/
+ RTUNI_ALPHA, /* U+001829: MONGOLIAN LETTER ANG*/
+ RTUNI_ALPHA, /* U+00182a: MONGOLIAN LETTER BA*/
+ RTUNI_ALPHA, /* U+00182b: MONGOLIAN LETTER PA*/
+ RTUNI_ALPHA, /* U+00182c: MONGOLIAN LETTER QA*/
+ RTUNI_ALPHA, /* U+00182d: MONGOLIAN LETTER GA*/
+ RTUNI_ALPHA, /* U+00182e: MONGOLIAN LETTER MA*/
+ RTUNI_ALPHA, /* U+00182f: MONGOLIAN LETTER LA*/
+ RTUNI_ALPHA, /* U+001830: MONGOLIAN LETTER SA*/
+ RTUNI_ALPHA, /* U+001831: MONGOLIAN LETTER SHA*/
+ RTUNI_ALPHA, /* U+001832: MONGOLIAN LETTER TA*/
+ RTUNI_ALPHA, /* U+001833: MONGOLIAN LETTER DA*/
+ RTUNI_ALPHA, /* U+001834: MONGOLIAN LETTER CHA*/
+ RTUNI_ALPHA, /* U+001835: MONGOLIAN LETTER JA*/
+ RTUNI_ALPHA, /* U+001836: MONGOLIAN LETTER YA*/
+ RTUNI_ALPHA, /* U+001837: MONGOLIAN LETTER RA*/
+ RTUNI_ALPHA, /* U+001838: MONGOLIAN LETTER WA*/
+ RTUNI_ALPHA, /* U+001839: MONGOLIAN LETTER FA*/
+ RTUNI_ALPHA, /* U+00183a: MONGOLIAN LETTER KA*/
+ RTUNI_ALPHA, /* U+00183b: MONGOLIAN LETTER KHA*/
+ RTUNI_ALPHA, /* U+00183c: MONGOLIAN LETTER TSA*/
+ RTUNI_ALPHA, /* U+00183d: MONGOLIAN LETTER ZA*/
+ RTUNI_ALPHA, /* U+00183e: MONGOLIAN LETTER HAA*/
+ RTUNI_ALPHA, /* U+00183f: MONGOLIAN LETTER ZRA*/
+ RTUNI_ALPHA, /* U+001840: MONGOLIAN LETTER LHA*/
+ RTUNI_ALPHA, /* U+001841: MONGOLIAN LETTER ZHI*/
+ RTUNI_ALPHA, /* U+001842: MONGOLIAN LETTER CHI*/
+ RTUNI_ALPHA, /* U+001843: MONGOLIAN LETTER TODO LONG VOWEL SIGN*/
+ RTUNI_ALPHA, /* U+001844: MONGOLIAN LETTER TODO E*/
+ RTUNI_ALPHA, /* U+001845: MONGOLIAN LETTER TODO I*/
+ RTUNI_ALPHA, /* U+001846: MONGOLIAN LETTER TODO O*/
+ RTUNI_ALPHA, /* U+001847: MONGOLIAN LETTER TODO U*/
+ RTUNI_ALPHA, /* U+001848: MONGOLIAN LETTER TODO OE*/
+ RTUNI_ALPHA, /* U+001849: MONGOLIAN LETTER TODO UE*/
+ RTUNI_ALPHA, /* U+00184a: MONGOLIAN LETTER TODO ANG*/
+ RTUNI_ALPHA, /* U+00184b: MONGOLIAN LETTER TODO BA*/
+ RTUNI_ALPHA, /* U+00184c: MONGOLIAN LETTER TODO PA*/
+ RTUNI_ALPHA, /* U+00184d: MONGOLIAN LETTER TODO QA*/
+ RTUNI_ALPHA, /* U+00184e: MONGOLIAN LETTER TODO GA*/
+ RTUNI_ALPHA, /* U+00184f: MONGOLIAN LETTER TODO MA*/
+ RTUNI_ALPHA, /* U+001850: MONGOLIAN LETTER TODO TA*/
+ RTUNI_ALPHA, /* U+001851: MONGOLIAN LETTER TODO DA*/
+ RTUNI_ALPHA, /* U+001852: MONGOLIAN LETTER TODO CHA*/
+ RTUNI_ALPHA, /* U+001853: MONGOLIAN LETTER TODO JA*/
+ RTUNI_ALPHA, /* U+001854: MONGOLIAN LETTER TODO TSA*/
+ RTUNI_ALPHA, /* U+001855: MONGOLIAN LETTER TODO YA*/
+ RTUNI_ALPHA, /* U+001856: MONGOLIAN LETTER TODO WA*/
+ RTUNI_ALPHA, /* U+001857: MONGOLIAN LETTER TODO KA*/
+ RTUNI_ALPHA, /* U+001858: MONGOLIAN LETTER TODO GAA*/
+ RTUNI_ALPHA, /* U+001859: MONGOLIAN LETTER TODO HAA*/
+ RTUNI_ALPHA, /* U+00185a: MONGOLIAN LETTER TODO JIA*/
+ RTUNI_ALPHA, /* U+00185b: MONGOLIAN LETTER TODO NIA*/
+ RTUNI_ALPHA, /* U+00185c: MONGOLIAN LETTER TODO DZA*/
+ RTUNI_ALPHA, /* U+00185d: MONGOLIAN LETTER SIBE E*/
+ RTUNI_ALPHA, /* U+00185e: MONGOLIAN LETTER SIBE I*/
+ RTUNI_ALPHA, /* U+00185f: MONGOLIAN LETTER SIBE IY*/
+ RTUNI_ALPHA, /* U+001860: MONGOLIAN LETTER SIBE UE*/
+ RTUNI_ALPHA, /* U+001861: MONGOLIAN LETTER SIBE U*/
+ RTUNI_ALPHA, /* U+001862: MONGOLIAN LETTER SIBE ANG*/
+ RTUNI_ALPHA, /* U+001863: MONGOLIAN LETTER SIBE KA*/
+ RTUNI_ALPHA, /* U+001864: MONGOLIAN LETTER SIBE GA*/
+ RTUNI_ALPHA, /* U+001865: MONGOLIAN LETTER SIBE HA*/
+ RTUNI_ALPHA, /* U+001866: MONGOLIAN LETTER SIBE PA*/
+ RTUNI_ALPHA, /* U+001867: MONGOLIAN LETTER SIBE SHA*/
+ RTUNI_ALPHA, /* U+001868: MONGOLIAN LETTER SIBE TA*/
+ RTUNI_ALPHA, /* U+001869: MONGOLIAN LETTER SIBE DA*/
+ RTUNI_ALPHA, /* U+00186a: MONGOLIAN LETTER SIBE JA*/
+ RTUNI_ALPHA, /* U+00186b: MONGOLIAN LETTER SIBE FA*/
+ RTUNI_ALPHA, /* U+00186c: MONGOLIAN LETTER SIBE GAA*/
+ RTUNI_ALPHA, /* U+00186d: MONGOLIAN LETTER SIBE HAA*/
+ RTUNI_ALPHA, /* U+00186e: MONGOLIAN LETTER SIBE TSA*/
+ RTUNI_ALPHA, /* U+00186f: MONGOLIAN LETTER SIBE ZA*/
+ RTUNI_ALPHA, /* U+001870: MONGOLIAN LETTER SIBE RAA*/
+ RTUNI_ALPHA, /* U+001871: MONGOLIAN LETTER SIBE CHA*/
+ RTUNI_ALPHA, /* U+001872: MONGOLIAN LETTER SIBE ZHA*/
+ RTUNI_ALPHA, /* U+001873: MONGOLIAN LETTER MANCHU I*/
+ RTUNI_ALPHA, /* U+001874: MONGOLIAN LETTER MANCHU KA*/
+ RTUNI_ALPHA, /* U+001875: MONGOLIAN LETTER MANCHU RA*/
+ RTUNI_ALPHA, /* U+001876: MONGOLIAN LETTER MANCHU FA*/
+ RTUNI_ALPHA, /* U+001877: MONGOLIAN LETTER MANCHU ZHA*/
+ 0, /* U+001878: */
+ 0, /* U+001879: */
+ 0, /* U+00187a: */
+ 0, /* U+00187b: */
+ 0, /* U+00187c: */
+ 0, /* U+00187d: */
+ 0, /* U+00187e: */
+ 0, /* U+00187f: */
+ RTUNI_ALPHA, /* U+001880: MONGOLIAN LETTER ALI GALI ANUSVARA ONE*/
+ RTUNI_ALPHA, /* U+001881: MONGOLIAN LETTER ALI GALI VISARGA ONE*/
+ RTUNI_ALPHA, /* U+001882: MONGOLIAN LETTER ALI GALI DAMARU*/
+ RTUNI_ALPHA, /* U+001883: MONGOLIAN LETTER ALI GALI UBADAMA*/
+ RTUNI_ALPHA, /* U+001884: MONGOLIAN LETTER ALI GALI INVERTED UBADAMA*/
+ RTUNI_ALPHA, /* U+001885: MONGOLIAN LETTER ALI GALI BALUDA*/
+ RTUNI_ALPHA, /* U+001886: MONGOLIAN LETTER ALI GALI THREE BALUDA*/
+ RTUNI_ALPHA, /* U+001887: MONGOLIAN LETTER ALI GALI A*/
+ RTUNI_ALPHA, /* U+001888: MONGOLIAN LETTER ALI GALI I*/
+ RTUNI_ALPHA, /* U+001889: MONGOLIAN LETTER ALI GALI KA*/
+ RTUNI_ALPHA, /* U+00188a: MONGOLIAN LETTER ALI GALI NGA*/
+ RTUNI_ALPHA, /* U+00188b: MONGOLIAN LETTER ALI GALI CA*/
+ RTUNI_ALPHA, /* U+00188c: MONGOLIAN LETTER ALI GALI TTA*/
+ RTUNI_ALPHA, /* U+00188d: MONGOLIAN LETTER ALI GALI TTHA*/
+ RTUNI_ALPHA, /* U+00188e: MONGOLIAN LETTER ALI GALI DDA*/
+ RTUNI_ALPHA, /* U+00188f: MONGOLIAN LETTER ALI GALI NNA*/
+ RTUNI_ALPHA, /* U+001890: MONGOLIAN LETTER ALI GALI TA*/
+ RTUNI_ALPHA, /* U+001891: MONGOLIAN LETTER ALI GALI DA*/
+ RTUNI_ALPHA, /* U+001892: MONGOLIAN LETTER ALI GALI PA*/
+ RTUNI_ALPHA, /* U+001893: MONGOLIAN LETTER ALI GALI PHA*/
+ RTUNI_ALPHA, /* U+001894: MONGOLIAN LETTER ALI GALI SSA*/
+ RTUNI_ALPHA, /* U+001895: MONGOLIAN LETTER ALI GALI ZHA*/
+ RTUNI_ALPHA, /* U+001896: MONGOLIAN LETTER ALI GALI ZA*/
+ RTUNI_ALPHA, /* U+001897: MONGOLIAN LETTER ALI GALI AH*/
+ RTUNI_ALPHA, /* U+001898: MONGOLIAN LETTER TODO ALI GALI TA*/
+ RTUNI_ALPHA, /* U+001899: MONGOLIAN LETTER TODO ALI GALI ZHA*/
+ RTUNI_ALPHA, /* U+00189a: MONGOLIAN LETTER MANCHU ALI GALI GHA*/
+ RTUNI_ALPHA, /* U+00189b: MONGOLIAN LETTER MANCHU ALI GALI NGA*/
+ RTUNI_ALPHA, /* U+00189c: MONGOLIAN LETTER MANCHU ALI GALI CA*/
+ RTUNI_ALPHA, /* U+00189d: MONGOLIAN LETTER MANCHU ALI GALI JHA*/
+ RTUNI_ALPHA, /* U+00189e: MONGOLIAN LETTER MANCHU ALI GALI TTA*/
+ RTUNI_ALPHA, /* U+00189f: MONGOLIAN LETTER MANCHU ALI GALI DDHA*/
+ RTUNI_ALPHA, /* U+0018a0: MONGOLIAN LETTER MANCHU ALI GALI TA*/
+ RTUNI_ALPHA, /* U+0018a1: MONGOLIAN LETTER MANCHU ALI GALI DHA*/
+ RTUNI_ALPHA, /* U+0018a2: MONGOLIAN LETTER MANCHU ALI GALI SSA*/
+ RTUNI_ALPHA, /* U+0018a3: MONGOLIAN LETTER MANCHU ALI GALI CYA*/
+ RTUNI_ALPHA, /* U+0018a4: MONGOLIAN LETTER MANCHU ALI GALI ZHA*/
+ RTUNI_ALPHA, /* U+0018a5: MONGOLIAN LETTER MANCHU ALI GALI ZA*/
+ RTUNI_ALPHA, /* U+0018a6: MONGOLIAN LETTER ALI GALI HALF U*/
+ RTUNI_ALPHA, /* U+0018a7: MONGOLIAN LETTER ALI GALI HALF YA*/
+ RTUNI_ALPHA, /* U+0018a8: MONGOLIAN LETTER MANCHU ALI GALI BHA*/
+ RTUNI_ALPHA, /* U+0018a9: MONGOLIAN LETTER ALI GALI DAGALGA*/
+ RTUNI_ALPHA, /* U+0018aa: MONGOLIAN LETTER MANCHU ALI GALI LHA*/
+ 0, /* U+0018ab: */
+ 0, /* U+0018ac: */
+ 0, /* U+0018ad: */
+ 0, /* U+0018ae: */
+ 0, /* U+0018af: */
+ RTUNI_ALPHA, /* U+0018b0: CANADIAN SYLLABICS OY*/
+ RTUNI_ALPHA, /* U+0018b1: CANADIAN SYLLABICS AY*/
+ RTUNI_ALPHA, /* U+0018b2: CANADIAN SYLLABICS AAY*/
+ RTUNI_ALPHA, /* U+0018b3: CANADIAN SYLLABICS WAY*/
+ RTUNI_ALPHA, /* U+0018b4: CANADIAN SYLLABICS POY*/
+ RTUNI_ALPHA, /* U+0018b5: CANADIAN SYLLABICS PAY*/
+ RTUNI_ALPHA, /* U+0018b6: CANADIAN SYLLABICS PWOY*/
+ RTUNI_ALPHA, /* U+0018b7: CANADIAN SYLLABICS TAY*/
+ RTUNI_ALPHA, /* U+0018b8: CANADIAN SYLLABICS KAY*/
+ RTUNI_ALPHA, /* U+0018b9: CANADIAN SYLLABICS KWAY*/
+ RTUNI_ALPHA, /* U+0018ba: CANADIAN SYLLABICS MAY*/
+ RTUNI_ALPHA, /* U+0018bb: CANADIAN SYLLABICS NOY*/
+ RTUNI_ALPHA, /* U+0018bc: CANADIAN SYLLABICS NAY*/
+ RTUNI_ALPHA, /* U+0018bd: CANADIAN SYLLABICS LAY*/
+ RTUNI_ALPHA, /* U+0018be: CANADIAN SYLLABICS SOY*/
+ RTUNI_ALPHA, /* U+0018bf: CANADIAN SYLLABICS SAY*/
+ RTUNI_ALPHA, /* U+0018c0: CANADIAN SYLLABICS SHOY*/
+ RTUNI_ALPHA, /* U+0018c1: CANADIAN SYLLABICS SHAY*/
+ RTUNI_ALPHA, /* U+0018c2: CANADIAN SYLLABICS SHWOY*/
+ RTUNI_ALPHA, /* U+0018c3: CANADIAN SYLLABICS YOY*/
+ RTUNI_ALPHA, /* U+0018c4: CANADIAN SYLLABICS YAY*/
+ RTUNI_ALPHA, /* U+0018c5: CANADIAN SYLLABICS RAY*/
+ RTUNI_ALPHA, /* U+0018c6: CANADIAN SYLLABICS NWI*/
+ RTUNI_ALPHA, /* U+0018c7: CANADIAN SYLLABICS OJIBWAY NWI*/
+ RTUNI_ALPHA, /* U+0018c8: CANADIAN SYLLABICS NWII*/
+ RTUNI_ALPHA, /* U+0018c9: CANADIAN SYLLABICS OJIBWAY NWII*/
+ RTUNI_ALPHA, /* U+0018ca: CANADIAN SYLLABICS NWO*/
+ RTUNI_ALPHA, /* U+0018cb: CANADIAN SYLLABICS OJIBWAY NWO*/
+ RTUNI_ALPHA, /* U+0018cc: CANADIAN SYLLABICS NWOO*/
+ RTUNI_ALPHA, /* U+0018cd: CANADIAN SYLLABICS OJIBWAY NWOO*/
+ RTUNI_ALPHA, /* U+0018ce: CANADIAN SYLLABICS RWEE*/
+ RTUNI_ALPHA, /* U+0018cf: CANADIAN SYLLABICS RWI*/
+ RTUNI_ALPHA, /* U+0018d0: CANADIAN SYLLABICS RWII*/
+ RTUNI_ALPHA, /* U+0018d1: CANADIAN SYLLABICS RWO*/
+ RTUNI_ALPHA, /* U+0018d2: CANADIAN SYLLABICS RWOO*/
+ RTUNI_ALPHA, /* U+0018d3: CANADIAN SYLLABICS RWA*/
+ RTUNI_ALPHA, /* U+0018d4: CANADIAN SYLLABICS OJIBWAY P*/
+ RTUNI_ALPHA, /* U+0018d5: CANADIAN SYLLABICS OJIBWAY T*/
+ RTUNI_ALPHA, /* U+0018d6: CANADIAN SYLLABICS OJIBWAY K*/
+ RTUNI_ALPHA, /* U+0018d7: CANADIAN SYLLABICS OJIBWAY C*/
+ RTUNI_ALPHA, /* U+0018d8: CANADIAN SYLLABICS OJIBWAY M*/
+ RTUNI_ALPHA, /* U+0018d9: CANADIAN SYLLABICS OJIBWAY N*/
+ RTUNI_ALPHA, /* U+0018da: CANADIAN SYLLABICS OJIBWAY S*/
+ RTUNI_ALPHA, /* U+0018db: CANADIAN SYLLABICS OJIBWAY SH*/
+ RTUNI_ALPHA, /* U+0018dc: CANADIAN SYLLABICS EASTERN W*/
+ RTUNI_ALPHA, /* U+0018dd: CANADIAN SYLLABICS WESTERN W*/
+ RTUNI_ALPHA, /* U+0018de: CANADIAN SYLLABICS FINAL SMALL RING*/
+ RTUNI_ALPHA, /* U+0018df: CANADIAN SYLLABICS FINAL RAISED DOT*/
+ RTUNI_ALPHA, /* U+0018e0: CANADIAN SYLLABICS R-CREE RWE*/
+ RTUNI_ALPHA, /* U+0018e1: CANADIAN SYLLABICS WEST-CREE LOO*/
+ RTUNI_ALPHA, /* U+0018e2: CANADIAN SYLLABICS WEST-CREE LAA*/
+ RTUNI_ALPHA, /* U+0018e3: CANADIAN SYLLABICS THWE*/
+ RTUNI_ALPHA, /* U+0018e4: CANADIAN SYLLABICS THWA*/
+ RTUNI_ALPHA, /* U+0018e5: CANADIAN SYLLABICS TTHWE*/
+ RTUNI_ALPHA, /* U+0018e6: CANADIAN SYLLABICS TTHOO*/
+ RTUNI_ALPHA, /* U+0018e7: CANADIAN SYLLABICS TTHAA*/
+ RTUNI_ALPHA, /* U+0018e8: CANADIAN SYLLABICS TLHWE*/
+ RTUNI_ALPHA, /* U+0018e9: CANADIAN SYLLABICS TLHOO*/
+ RTUNI_ALPHA, /* U+0018ea: CANADIAN SYLLABICS SAYISI SHWE*/
+ RTUNI_ALPHA, /* U+0018eb: CANADIAN SYLLABICS SAYISI SHOO*/
+ RTUNI_ALPHA, /* U+0018ec: CANADIAN SYLLABICS SAYISI HOO*/
+ RTUNI_ALPHA, /* U+0018ed: CANADIAN SYLLABICS CARRIER GWU*/
+ RTUNI_ALPHA, /* U+0018ee: CANADIAN SYLLABICS CARRIER DENE GEE*/
+ RTUNI_ALPHA, /* U+0018ef: CANADIAN SYLLABICS CARRIER GAA*/
+ RTUNI_ALPHA, /* U+0018f0: CANADIAN SYLLABICS CARRIER GWA*/
+ RTUNI_ALPHA, /* U+0018f1: CANADIAN SYLLABICS SAYISI JUU*/
+ RTUNI_ALPHA, /* U+0018f2: CANADIAN SYLLABICS CARRIER JWA*/
+ RTUNI_ALPHA, /* U+0018f3: CANADIAN SYLLABICS BEAVER DENE L*/
+ RTUNI_ALPHA, /* U+0018f4: CANADIAN SYLLABICS BEAVER DENE R*/
+ RTUNI_ALPHA, /* U+0018f5: CANADIAN SYLLABICS CARRIER DENTAL S*/
+ 0, /* U+0018f6: */
+ 0, /* U+0018f7: */
+ 0, /* U+0018f8: */
+ 0, /* U+0018f9: */
+ 0, /* U+0018fa: */
+ 0, /* U+0018fb: */
+ 0, /* U+0018fc: */
+ 0, /* U+0018fd: */
+ 0, /* U+0018fe: */
+ 0, /* U+0018ff: */
+ RTUNI_ALPHA, /* U+001900: LIMBU VOWEL-CARRIER LETTER*/
+ RTUNI_ALPHA, /* U+001901: LIMBU LETTER KA*/
+ RTUNI_ALPHA, /* U+001902: LIMBU LETTER KHA*/
+ RTUNI_ALPHA, /* U+001903: LIMBU LETTER GA*/
+ RTUNI_ALPHA, /* U+001904: LIMBU LETTER GHA*/
+ RTUNI_ALPHA, /* U+001905: LIMBU LETTER NGA*/
+ RTUNI_ALPHA, /* U+001906: LIMBU LETTER CA*/
+ RTUNI_ALPHA, /* U+001907: LIMBU LETTER CHA*/
+ RTUNI_ALPHA, /* U+001908: LIMBU LETTER JA*/
+ RTUNI_ALPHA, /* U+001909: LIMBU LETTER JHA*/
+ RTUNI_ALPHA, /* U+00190a: LIMBU LETTER YAN*/
+ RTUNI_ALPHA, /* U+00190b: LIMBU LETTER TA*/
+ RTUNI_ALPHA, /* U+00190c: LIMBU LETTER THA*/
+ RTUNI_ALPHA, /* U+00190d: LIMBU LETTER DA*/
+ RTUNI_ALPHA, /* U+00190e: LIMBU LETTER DHA*/
+ RTUNI_ALPHA, /* U+00190f: LIMBU LETTER NA*/
+ RTUNI_ALPHA, /* U+001910: LIMBU LETTER PA*/
+ RTUNI_ALPHA, /* U+001911: LIMBU LETTER PHA*/
+ RTUNI_ALPHA, /* U+001912: LIMBU LETTER BA*/
+ RTUNI_ALPHA, /* U+001913: LIMBU LETTER BHA*/
+ RTUNI_ALPHA, /* U+001914: LIMBU LETTER MA*/
+ RTUNI_ALPHA, /* U+001915: LIMBU LETTER YA*/
+ RTUNI_ALPHA, /* U+001916: LIMBU LETTER RA*/
+ RTUNI_ALPHA, /* U+001917: LIMBU LETTER LA*/
+ RTUNI_ALPHA, /* U+001918: LIMBU LETTER WA*/
+ RTUNI_ALPHA, /* U+001919: LIMBU LETTER SHA*/
+ RTUNI_ALPHA, /* U+00191a: LIMBU LETTER SSA*/
+ RTUNI_ALPHA, /* U+00191b: LIMBU LETTER SA*/
+ RTUNI_ALPHA, /* U+00191c: LIMBU LETTER HA*/
+ 0, /* U+00191d: */
+ 0, /* U+00191e: */
+ 0, /* U+00191f: */
+ RTUNI_ALPHA, /* U+001920: LIMBU VOWEL SIGN A*/
+ RTUNI_ALPHA, /* U+001921: LIMBU VOWEL SIGN I*/
+ RTUNI_ALPHA, /* U+001922: LIMBU VOWEL SIGN U*/
+ RTUNI_ALPHA, /* U+001923: LIMBU VOWEL SIGN EE*/
+ RTUNI_ALPHA, /* U+001924: LIMBU VOWEL SIGN AI*/
+ RTUNI_ALPHA, /* U+001925: LIMBU VOWEL SIGN OO*/
+ RTUNI_ALPHA, /* U+001926: LIMBU VOWEL SIGN AU*/
+ RTUNI_ALPHA, /* U+001927: LIMBU VOWEL SIGN E*/
+ RTUNI_ALPHA, /* U+001928: LIMBU VOWEL SIGN O*/
+ RTUNI_ALPHA, /* U+001929: LIMBU SUBJOINED LETTER YA*/
+ RTUNI_ALPHA, /* U+00192a: LIMBU SUBJOINED LETTER RA*/
+ RTUNI_ALPHA, /* U+00192b: LIMBU SUBJOINED LETTER WA*/
+ 0, /* U+00192c: */
+ 0, /* U+00192d: */
+ 0, /* U+00192e: */
+ 0, /* U+00192f: */
+ RTUNI_ALPHA, /* U+001930: LIMBU SMALL LETTER KA*/
+ RTUNI_ALPHA, /* U+001931: LIMBU SMALL LETTER NGA*/
+ RTUNI_ALPHA, /* U+001932: LIMBU SMALL LETTER ANUSVARA*/
+ RTUNI_ALPHA, /* U+001933: LIMBU SMALL LETTER TA*/
+ RTUNI_ALPHA, /* U+001934: LIMBU SMALL LETTER NA*/
+ RTUNI_ALPHA, /* U+001935: LIMBU SMALL LETTER PA*/
+ RTUNI_ALPHA, /* U+001936: LIMBU SMALL LETTER MA*/
+ RTUNI_ALPHA, /* U+001937: LIMBU SMALL LETTER RA*/
+ RTUNI_ALPHA, /* U+001938: LIMBU SMALL LETTER LA*/
+ 0, /* U+001939: LIMBU SIGN MUKPHRENG*/
+ 0, /* U+00193a: LIMBU SIGN KEMPHRENG*/
+ 0, /* U+00193b: LIMBU SIGN SA-I*/
+ 0, /* U+00193c: */
+ 0, /* U+00193d: */
+ 0, /* U+00193e: */
+ 0, /* U+00193f: */
+ 0, /* U+001940: LIMBU SIGN LOO*/
+ 0, /* U+001941: */
+ 0, /* U+001942: */
+ 0, /* U+001943: */
+ 0, /* U+001944: LIMBU EXCLAMATION MARK*/
+ 0, /* U+001945: LIMBU QUESTION MARK*/
+ RTUNI_DDIGIT, /* U+001946: LIMBU DIGIT ZERO*/
+ RTUNI_DDIGIT, /* U+001947: LIMBU DIGIT ONE*/
+ RTUNI_DDIGIT, /* U+001948: LIMBU DIGIT TWO*/
+ RTUNI_DDIGIT, /* U+001949: LIMBU DIGIT THREE*/
+ RTUNI_DDIGIT, /* U+00194a: LIMBU DIGIT FOUR*/
+ RTUNI_DDIGIT, /* U+00194b: LIMBU DIGIT FIVE*/
+ RTUNI_DDIGIT, /* U+00194c: LIMBU DIGIT SIX*/
+ RTUNI_DDIGIT, /* U+00194d: LIMBU DIGIT SEVEN*/
+ RTUNI_DDIGIT, /* U+00194e: LIMBU DIGIT EIGHT*/
+ RTUNI_DDIGIT, /* U+00194f: LIMBU DIGIT NINE*/
+ RTUNI_ALPHA, /* U+001950: TAI LE LETTER KA*/
+ RTUNI_ALPHA, /* U+001951: TAI LE LETTER XA*/
+ RTUNI_ALPHA, /* U+001952: TAI LE LETTER NGA*/
+ RTUNI_ALPHA, /* U+001953: TAI LE LETTER TSA*/
+ RTUNI_ALPHA, /* U+001954: TAI LE LETTER SA*/
+ RTUNI_ALPHA, /* U+001955: TAI LE LETTER YA*/
+ RTUNI_ALPHA, /* U+001956: TAI LE LETTER TA*/
+ RTUNI_ALPHA, /* U+001957: TAI LE LETTER THA*/
+ RTUNI_ALPHA, /* U+001958: TAI LE LETTER LA*/
+ RTUNI_ALPHA, /* U+001959: TAI LE LETTER PA*/
+ RTUNI_ALPHA, /* U+00195a: TAI LE LETTER PHA*/
+ RTUNI_ALPHA, /* U+00195b: TAI LE LETTER MA*/
+ RTUNI_ALPHA, /* U+00195c: TAI LE LETTER FA*/
+ RTUNI_ALPHA, /* U+00195d: TAI LE LETTER VA*/
+ RTUNI_ALPHA, /* U+00195e: TAI LE LETTER HA*/
+ RTUNI_ALPHA, /* U+00195f: TAI LE LETTER QA*/
+ RTUNI_ALPHA, /* U+001960: TAI LE LETTER KHA*/
+ RTUNI_ALPHA, /* U+001961: TAI LE LETTER TSHA*/
+ RTUNI_ALPHA, /* U+001962: TAI LE LETTER NA*/
+ RTUNI_ALPHA, /* U+001963: TAI LE LETTER A*/
+ RTUNI_ALPHA, /* U+001964: TAI LE LETTER I*/
+ RTUNI_ALPHA, /* U+001965: TAI LE LETTER EE*/
+ RTUNI_ALPHA, /* U+001966: TAI LE LETTER EH*/
+ RTUNI_ALPHA, /* U+001967: TAI LE LETTER U*/
+ RTUNI_ALPHA, /* U+001968: TAI LE LETTER OO*/
+ RTUNI_ALPHA, /* U+001969: TAI LE LETTER O*/
+ RTUNI_ALPHA, /* U+00196a: TAI LE LETTER UE*/
+ RTUNI_ALPHA, /* U+00196b: TAI LE LETTER E*/
+ RTUNI_ALPHA, /* U+00196c: TAI LE LETTER AUE*/
+ RTUNI_ALPHA, /* U+00196d: TAI LE LETTER AI*/
+ 0, /* U+00196e: */
+ 0, /* U+00196f: */
+ RTUNI_ALPHA, /* U+001970: TAI LE LETTER TONE-2*/
+ RTUNI_ALPHA, /* U+001971: TAI LE LETTER TONE-3*/
+ RTUNI_ALPHA, /* U+001972: TAI LE LETTER TONE-4*/
+ RTUNI_ALPHA, /* U+001973: TAI LE LETTER TONE-5*/
+ RTUNI_ALPHA, /* U+001974: TAI LE LETTER TONE-6*/
+ 0, /* U+001975: */
+ 0, /* U+001976: */
+ 0, /* U+001977: */
+ 0, /* U+001978: */
+ 0, /* U+001979: */
+ 0, /* U+00197a: */
+ 0, /* U+00197b: */
+ 0, /* U+00197c: */
+ 0, /* U+00197d: */
+ 0, /* U+00197e: */
+ 0, /* U+00197f: */
+ RTUNI_ALPHA, /* U+001980: NEW TAI LUE LETTER HIGH QA*/
+ RTUNI_ALPHA, /* U+001981: NEW TAI LUE LETTER LOW QA*/
+ RTUNI_ALPHA, /* U+001982: NEW TAI LUE LETTER HIGH KA*/
+ RTUNI_ALPHA, /* U+001983: NEW TAI LUE LETTER HIGH XA*/
+ RTUNI_ALPHA, /* U+001984: NEW TAI LUE LETTER HIGH NGA*/
+ RTUNI_ALPHA, /* U+001985: NEW TAI LUE LETTER LOW KA*/
+ RTUNI_ALPHA, /* U+001986: NEW TAI LUE LETTER LOW XA*/
+ RTUNI_ALPHA, /* U+001987: NEW TAI LUE LETTER LOW NGA*/
+ RTUNI_ALPHA, /* U+001988: NEW TAI LUE LETTER HIGH TSA*/
+ RTUNI_ALPHA, /* U+001989: NEW TAI LUE LETTER HIGH SA*/
+ RTUNI_ALPHA, /* U+00198a: NEW TAI LUE LETTER HIGH YA*/
+ RTUNI_ALPHA, /* U+00198b: NEW TAI LUE LETTER LOW TSA*/
+ RTUNI_ALPHA, /* U+00198c: NEW TAI LUE LETTER LOW SA*/
+ RTUNI_ALPHA, /* U+00198d: NEW TAI LUE LETTER LOW YA*/
+ RTUNI_ALPHA, /* U+00198e: NEW TAI LUE LETTER HIGH TA*/
+ RTUNI_ALPHA, /* U+00198f: NEW TAI LUE LETTER HIGH THA*/
+ RTUNI_ALPHA, /* U+001990: NEW TAI LUE LETTER HIGH NA*/
+ RTUNI_ALPHA, /* U+001991: NEW TAI LUE LETTER LOW TA*/
+ RTUNI_ALPHA, /* U+001992: NEW TAI LUE LETTER LOW THA*/
+ RTUNI_ALPHA, /* U+001993: NEW TAI LUE LETTER LOW NA*/
+ RTUNI_ALPHA, /* U+001994: NEW TAI LUE LETTER HIGH PA*/
+ RTUNI_ALPHA, /* U+001995: NEW TAI LUE LETTER HIGH PHA*/
+ RTUNI_ALPHA, /* U+001996: NEW TAI LUE LETTER HIGH MA*/
+ RTUNI_ALPHA, /* U+001997: NEW TAI LUE LETTER LOW PA*/
+ RTUNI_ALPHA, /* U+001998: NEW TAI LUE LETTER LOW PHA*/
+ RTUNI_ALPHA, /* U+001999: NEW TAI LUE LETTER LOW MA*/
+ RTUNI_ALPHA, /* U+00199a: NEW TAI LUE LETTER HIGH FA*/
+ RTUNI_ALPHA, /* U+00199b: NEW TAI LUE LETTER HIGH VA*/
+ RTUNI_ALPHA, /* U+00199c: NEW TAI LUE LETTER HIGH LA*/
+ RTUNI_ALPHA, /* U+00199d: NEW TAI LUE LETTER LOW FA*/
+ RTUNI_ALPHA, /* U+00199e: NEW TAI LUE LETTER LOW VA*/
+ RTUNI_ALPHA, /* U+00199f: NEW TAI LUE LETTER LOW LA*/
+ RTUNI_ALPHA, /* U+0019a0: NEW TAI LUE LETTER HIGH HA*/
+ RTUNI_ALPHA, /* U+0019a1: NEW TAI LUE LETTER HIGH DA*/
+ RTUNI_ALPHA, /* U+0019a2: NEW TAI LUE LETTER HIGH BA*/
+ RTUNI_ALPHA, /* U+0019a3: NEW TAI LUE LETTER LOW HA*/
+ RTUNI_ALPHA, /* U+0019a4: NEW TAI LUE LETTER LOW DA*/
+ RTUNI_ALPHA, /* U+0019a5: NEW TAI LUE LETTER LOW BA*/
+ RTUNI_ALPHA, /* U+0019a6: NEW TAI LUE LETTER HIGH KVA*/
+ RTUNI_ALPHA, /* U+0019a7: NEW TAI LUE LETTER HIGH XVA*/
+ RTUNI_ALPHA, /* U+0019a8: NEW TAI LUE LETTER LOW KVA*/
+ RTUNI_ALPHA, /* U+0019a9: NEW TAI LUE LETTER LOW XVA*/
+ RTUNI_ALPHA, /* U+0019aa: NEW TAI LUE LETTER HIGH SUA*/
+ RTUNI_ALPHA, /* U+0019ab: NEW TAI LUE LETTER LOW SUA*/
+ 0, /* U+0019ac: */
+ 0, /* U+0019ad: */
+ 0, /* U+0019ae: */
+ 0, /* U+0019af: */
+ RTUNI_ALPHA, /* U+0019b0: NEW TAI LUE VOWEL SIGN VOWEL SHORTENER*/
+ RTUNI_ALPHA, /* U+0019b1: NEW TAI LUE VOWEL SIGN AA*/
+ RTUNI_ALPHA, /* U+0019b2: NEW TAI LUE VOWEL SIGN II*/
+ RTUNI_ALPHA, /* U+0019b3: NEW TAI LUE VOWEL SIGN U*/
+ RTUNI_ALPHA, /* U+0019b4: NEW TAI LUE VOWEL SIGN UU*/
+ RTUNI_ALPHA, /* U+0019b5: NEW TAI LUE VOWEL SIGN E*/
+ RTUNI_ALPHA, /* U+0019b6: NEW TAI LUE VOWEL SIGN AE*/
+ RTUNI_ALPHA, /* U+0019b7: NEW TAI LUE VOWEL SIGN O*/
+ RTUNI_ALPHA, /* U+0019b8: NEW TAI LUE VOWEL SIGN OA*/
+ RTUNI_ALPHA, /* U+0019b9: NEW TAI LUE VOWEL SIGN UE*/
+ RTUNI_ALPHA, /* U+0019ba: NEW TAI LUE VOWEL SIGN AY*/
+ RTUNI_ALPHA, /* U+0019bb: NEW TAI LUE VOWEL SIGN AAY*/
+ RTUNI_ALPHA, /* U+0019bc: NEW TAI LUE VOWEL SIGN UY*/
+ RTUNI_ALPHA, /* U+0019bd: NEW TAI LUE VOWEL SIGN OY*/
+ RTUNI_ALPHA, /* U+0019be: NEW TAI LUE VOWEL SIGN OAY*/
+ RTUNI_ALPHA, /* U+0019bf: NEW TAI LUE VOWEL SIGN UEY*/
+ RTUNI_ALPHA, /* U+0019c0: NEW TAI LUE VOWEL SIGN IY*/
+ RTUNI_ALPHA, /* U+0019c1: NEW TAI LUE LETTER FINAL V*/
+ RTUNI_ALPHA, /* U+0019c2: NEW TAI LUE LETTER FINAL NG*/
+ RTUNI_ALPHA, /* U+0019c3: NEW TAI LUE LETTER FINAL N*/
+ RTUNI_ALPHA, /* U+0019c4: NEW TAI LUE LETTER FINAL M*/
+ RTUNI_ALPHA, /* U+0019c5: NEW TAI LUE LETTER FINAL K*/
+ RTUNI_ALPHA, /* U+0019c6: NEW TAI LUE LETTER FINAL D*/
+ RTUNI_ALPHA, /* U+0019c7: NEW TAI LUE LETTER FINAL B*/
+ RTUNI_ALPHA, /* U+0019c8: NEW TAI LUE TONE MARK-1*/
+ RTUNI_ALPHA, /* U+0019c9: NEW TAI LUE TONE MARK-2*/
+ 0, /* U+0019ca: */
+ 0, /* U+0019cb: */
+ 0, /* U+0019cc: */
+ 0, /* U+0019cd: */
+ 0, /* U+0019ce: */
+ 0, /* U+0019cf: */
+ RTUNI_DDIGIT, /* U+0019d0: NEW TAI LUE DIGIT ZERO*/
+ RTUNI_DDIGIT, /* U+0019d1: NEW TAI LUE DIGIT ONE*/
+ RTUNI_DDIGIT, /* U+0019d2: NEW TAI LUE DIGIT TWO*/
+ RTUNI_DDIGIT, /* U+0019d3: NEW TAI LUE DIGIT THREE*/
+ RTUNI_DDIGIT, /* U+0019d4: NEW TAI LUE DIGIT FOUR*/
+ RTUNI_DDIGIT, /* U+0019d5: NEW TAI LUE DIGIT FIVE*/
+ RTUNI_DDIGIT, /* U+0019d6: NEW TAI LUE DIGIT SIX*/
+ RTUNI_DDIGIT, /* U+0019d7: NEW TAI LUE DIGIT SEVEN*/
+ RTUNI_DDIGIT, /* U+0019d8: NEW TAI LUE DIGIT EIGHT*/
+ RTUNI_DDIGIT, /* U+0019d9: NEW TAI LUE DIGIT NINE*/
+ 0, /* U+0019da: NEW TAI LUE THAM DIGIT ONE*/
+ 0, /* U+0019db: */
+ 0, /* U+0019dc: */
+ 0, /* U+0019dd: */
+ 0, /* U+0019de: NEW TAI LUE SIGN LAE*/
+ 0, /* U+0019df: NEW TAI LUE SIGN LAEV*/
+ 0, /* U+0019e0: KHMER SYMBOL PATHAMASAT*/
+ 0, /* U+0019e1: KHMER SYMBOL MUOY KOET*/
+ 0, /* U+0019e2: KHMER SYMBOL PII KOET*/
+ 0, /* U+0019e3: KHMER SYMBOL BEI KOET*/
+ 0, /* U+0019e4: KHMER SYMBOL BUON KOET*/
+ 0, /* U+0019e5: KHMER SYMBOL PRAM KOET*/
+ 0, /* U+0019e6: KHMER SYMBOL PRAM-MUOY KOET*/
+ 0, /* U+0019e7: KHMER SYMBOL PRAM-PII KOET*/
+ 0, /* U+0019e8: KHMER SYMBOL PRAM-BEI KOET*/
+ 0, /* U+0019e9: KHMER SYMBOL PRAM-BUON KOET*/
+ 0, /* U+0019ea: KHMER SYMBOL DAP KOET*/
+ 0, /* U+0019eb: KHMER SYMBOL DAP-MUOY KOET*/
+ 0, /* U+0019ec: KHMER SYMBOL DAP-PII KOET*/
+ 0, /* U+0019ed: KHMER SYMBOL DAP-BEI KOET*/
+ 0, /* U+0019ee: KHMER SYMBOL DAP-BUON KOET*/
+ 0, /* U+0019ef: KHMER SYMBOL DAP-PRAM KOET*/
+ 0, /* U+0019f0: KHMER SYMBOL TUTEYASAT*/
+ 0, /* U+0019f1: KHMER SYMBOL MUOY ROC*/
+ 0, /* U+0019f2: KHMER SYMBOL PII ROC*/
+ 0, /* U+0019f3: KHMER SYMBOL BEI ROC*/
+ 0, /* U+0019f4: KHMER SYMBOL BUON ROC*/
+ 0, /* U+0019f5: KHMER SYMBOL PRAM ROC*/
+ 0, /* U+0019f6: KHMER SYMBOL PRAM-MUOY ROC*/
+ 0, /* U+0019f7: KHMER SYMBOL PRAM-PII ROC*/
+ 0, /* U+0019f8: KHMER SYMBOL PRAM-BEI ROC*/
+ 0, /* U+0019f9: KHMER SYMBOL PRAM-BUON ROC*/
+ 0, /* U+0019fa: KHMER SYMBOL DAP ROC*/
+ 0, /* U+0019fb: KHMER SYMBOL DAP-MUOY ROC*/
+ 0, /* U+0019fc: KHMER SYMBOL DAP-PII ROC*/
+ 0, /* U+0019fd: KHMER SYMBOL DAP-BEI ROC*/
+ 0, /* U+0019fe: KHMER SYMBOL DAP-BUON ROC*/
+ 0, /* U+0019ff: KHMER SYMBOL DAP-PRAM ROC*/
+ RTUNI_ALPHA, /* U+001a00: BUGINESE LETTER KA*/
+ RTUNI_ALPHA, /* U+001a01: BUGINESE LETTER GA*/
+ RTUNI_ALPHA, /* U+001a02: BUGINESE LETTER NGA*/
+ RTUNI_ALPHA, /* U+001a03: BUGINESE LETTER NGKA*/
+ RTUNI_ALPHA, /* U+001a04: BUGINESE LETTER PA*/
+ RTUNI_ALPHA, /* U+001a05: BUGINESE LETTER BA*/
+ RTUNI_ALPHA, /* U+001a06: BUGINESE LETTER MA*/
+ RTUNI_ALPHA, /* U+001a07: BUGINESE LETTER MPA*/
+ RTUNI_ALPHA, /* U+001a08: BUGINESE LETTER TA*/
+ RTUNI_ALPHA, /* U+001a09: BUGINESE LETTER DA*/
+ RTUNI_ALPHA, /* U+001a0a: BUGINESE LETTER NA*/
+ RTUNI_ALPHA, /* U+001a0b: BUGINESE LETTER NRA*/
+ RTUNI_ALPHA, /* U+001a0c: BUGINESE LETTER CA*/
+ RTUNI_ALPHA, /* U+001a0d: BUGINESE LETTER JA*/
+ RTUNI_ALPHA, /* U+001a0e: BUGINESE LETTER NYA*/
+ RTUNI_ALPHA, /* U+001a0f: BUGINESE LETTER NYCA*/
+ RTUNI_ALPHA, /* U+001a10: BUGINESE LETTER YA*/
+ RTUNI_ALPHA, /* U+001a11: BUGINESE LETTER RA*/
+ RTUNI_ALPHA, /* U+001a12: BUGINESE LETTER LA*/
+ RTUNI_ALPHA, /* U+001a13: BUGINESE LETTER VA*/
+ RTUNI_ALPHA, /* U+001a14: BUGINESE LETTER SA*/
+ RTUNI_ALPHA, /* U+001a15: BUGINESE LETTER A*/
+ RTUNI_ALPHA, /* U+001a16: BUGINESE LETTER HA*/
+ RTUNI_ALPHA, /* U+001a17: BUGINESE VOWEL SIGN I*/
+ RTUNI_ALPHA, /* U+001a18: BUGINESE VOWEL SIGN U*/
+ RTUNI_ALPHA, /* U+001a19: BUGINESE VOWEL SIGN E*/
+ RTUNI_ALPHA, /* U+001a1a: BUGINESE VOWEL SIGN O*/
+ RTUNI_ALPHA, /* U+001a1b: BUGINESE VOWEL SIGN AE*/
+ 0, /* U+001a1c: */
+ 0, /* U+001a1d: */
+ 0, /* U+001a1e: BUGINESE PALLAWA*/
+ 0, /* U+001a1f: BUGINESE END OF SECTION*/
+ RTUNI_ALPHA, /* U+001a20: TAI THAM LETTER HIGH KA*/
+ RTUNI_ALPHA, /* U+001a21: TAI THAM LETTER HIGH KHA*/
+ RTUNI_ALPHA, /* U+001a22: TAI THAM LETTER HIGH KXA*/
+ RTUNI_ALPHA, /* U+001a23: TAI THAM LETTER LOW KA*/
+ RTUNI_ALPHA, /* U+001a24: TAI THAM LETTER LOW KXA*/
+ RTUNI_ALPHA, /* U+001a25: TAI THAM LETTER LOW KHA*/
+ RTUNI_ALPHA, /* U+001a26: TAI THAM LETTER NGA*/
+ RTUNI_ALPHA, /* U+001a27: TAI THAM LETTER HIGH CA*/
+ RTUNI_ALPHA, /* U+001a28: TAI THAM LETTER HIGH CHA*/
+ RTUNI_ALPHA, /* U+001a29: TAI THAM LETTER LOW CA*/
+ RTUNI_ALPHA, /* U+001a2a: TAI THAM LETTER LOW SA*/
+ RTUNI_ALPHA, /* U+001a2b: TAI THAM LETTER LOW CHA*/
+ RTUNI_ALPHA, /* U+001a2c: TAI THAM LETTER NYA*/
+ RTUNI_ALPHA, /* U+001a2d: TAI THAM LETTER RATA*/
+ RTUNI_ALPHA, /* U+001a2e: TAI THAM LETTER HIGH RATHA*/
+ RTUNI_ALPHA, /* U+001a2f: TAI THAM LETTER DA*/
+ RTUNI_ALPHA, /* U+001a30: TAI THAM LETTER LOW RATHA*/
+ RTUNI_ALPHA, /* U+001a31: TAI THAM LETTER RANA*/
+ RTUNI_ALPHA, /* U+001a32: TAI THAM LETTER HIGH TA*/
+ RTUNI_ALPHA, /* U+001a33: TAI THAM LETTER HIGH THA*/
+ RTUNI_ALPHA, /* U+001a34: TAI THAM LETTER LOW TA*/
+ RTUNI_ALPHA, /* U+001a35: TAI THAM LETTER LOW THA*/
+ RTUNI_ALPHA, /* U+001a36: TAI THAM LETTER NA*/
+ RTUNI_ALPHA, /* U+001a37: TAI THAM LETTER BA*/
+ RTUNI_ALPHA, /* U+001a38: TAI THAM LETTER HIGH PA*/
+ RTUNI_ALPHA, /* U+001a39: TAI THAM LETTER HIGH PHA*/
+ RTUNI_ALPHA, /* U+001a3a: TAI THAM LETTER HIGH FA*/
+ RTUNI_ALPHA, /* U+001a3b: TAI THAM LETTER LOW PA*/
+ RTUNI_ALPHA, /* U+001a3c: TAI THAM LETTER LOW FA*/
+ RTUNI_ALPHA, /* U+001a3d: TAI THAM LETTER LOW PHA*/
+ RTUNI_ALPHA, /* U+001a3e: TAI THAM LETTER MA*/
+ RTUNI_ALPHA, /* U+001a3f: TAI THAM LETTER LOW YA*/
+ RTUNI_ALPHA, /* U+001a40: TAI THAM LETTER HIGH YA*/
+ RTUNI_ALPHA, /* U+001a41: TAI THAM LETTER RA*/
+ RTUNI_ALPHA, /* U+001a42: TAI THAM LETTER RUE*/
+ RTUNI_ALPHA, /* U+001a43: TAI THAM LETTER LA*/
+ RTUNI_ALPHA, /* U+001a44: TAI THAM LETTER LUE*/
+ RTUNI_ALPHA, /* U+001a45: TAI THAM LETTER WA*/
+ RTUNI_ALPHA, /* U+001a46: TAI THAM LETTER HIGH SHA*/
+ RTUNI_ALPHA, /* U+001a47: TAI THAM LETTER HIGH SSA*/
+ RTUNI_ALPHA, /* U+001a48: TAI THAM LETTER HIGH SA*/
+ RTUNI_ALPHA, /* U+001a49: TAI THAM LETTER HIGH HA*/
+ RTUNI_ALPHA, /* U+001a4a: TAI THAM LETTER LLA*/
+ RTUNI_ALPHA, /* U+001a4b: TAI THAM LETTER A*/
+ RTUNI_ALPHA, /* U+001a4c: TAI THAM LETTER LOW HA*/
+ RTUNI_ALPHA, /* U+001a4d: TAI THAM LETTER I*/
+ RTUNI_ALPHA, /* U+001a4e: TAI THAM LETTER II*/
+ RTUNI_ALPHA, /* U+001a4f: TAI THAM LETTER U*/
+ RTUNI_ALPHA, /* U+001a50: TAI THAM LETTER UU*/
+ RTUNI_ALPHA, /* U+001a51: TAI THAM LETTER EE*/
+ RTUNI_ALPHA, /* U+001a52: TAI THAM LETTER OO*/
+ RTUNI_ALPHA, /* U+001a53: TAI THAM LETTER LAE*/
+ RTUNI_ALPHA, /* U+001a54: TAI THAM LETTER GREAT SA*/
+ RTUNI_ALPHA, /* U+001a55: TAI THAM CONSONANT SIGN MEDIAL RA*/
+ RTUNI_ALPHA, /* U+001a56: TAI THAM CONSONANT SIGN MEDIAL LA*/
+ RTUNI_ALPHA, /* U+001a57: TAI THAM CONSONANT SIGN LA TANG LAI*/
+ RTUNI_ALPHA, /* U+001a58: TAI THAM SIGN MAI KANG LAI*/
+ RTUNI_ALPHA, /* U+001a59: TAI THAM CONSONANT SIGN FINAL NGA*/
+ RTUNI_ALPHA, /* U+001a5a: TAI THAM CONSONANT SIGN LOW PA*/
+ RTUNI_ALPHA, /* U+001a5b: TAI THAM CONSONANT SIGN HIGH RATHA OR LOW PA*/
+ RTUNI_ALPHA, /* U+001a5c: TAI THAM CONSONANT SIGN MA*/
+ RTUNI_ALPHA, /* U+001a5d: TAI THAM CONSONANT SIGN BA*/
+ RTUNI_ALPHA, /* U+001a5e: TAI THAM CONSONANT SIGN SA*/
+ 0, /* U+001a5f: */
+ 0, /* U+001a60: TAI THAM SIGN SAKOT*/
+ RTUNI_ALPHA, /* U+001a61: TAI THAM VOWEL SIGN A*/
+ RTUNI_ALPHA, /* U+001a62: TAI THAM VOWEL SIGN MAI SAT*/
+ RTUNI_ALPHA, /* U+001a63: TAI THAM VOWEL SIGN AA*/
+ RTUNI_ALPHA, /* U+001a64: TAI THAM VOWEL SIGN TALL AA*/
+ RTUNI_ALPHA, /* U+001a65: TAI THAM VOWEL SIGN I*/
+ RTUNI_ALPHA, /* U+001a66: TAI THAM VOWEL SIGN II*/
+ RTUNI_ALPHA, /* U+001a67: TAI THAM VOWEL SIGN UE*/
+ RTUNI_ALPHA, /* U+001a68: TAI THAM VOWEL SIGN UUE*/
+ RTUNI_ALPHA, /* U+001a69: TAI THAM VOWEL SIGN U*/
+ RTUNI_ALPHA, /* U+001a6a: TAI THAM VOWEL SIGN UU*/
+ RTUNI_ALPHA, /* U+001a6b: TAI THAM VOWEL SIGN O*/
+ RTUNI_ALPHA, /* U+001a6c: TAI THAM VOWEL SIGN OA BELOW*/
+ RTUNI_ALPHA, /* U+001a6d: TAI THAM VOWEL SIGN OY*/
+ RTUNI_ALPHA, /* U+001a6e: TAI THAM VOWEL SIGN E*/
+ RTUNI_ALPHA, /* U+001a6f: TAI THAM VOWEL SIGN AE*/
+ RTUNI_ALPHA, /* U+001a70: TAI THAM VOWEL SIGN OO*/
+ RTUNI_ALPHA, /* U+001a71: TAI THAM VOWEL SIGN AI*/
+ RTUNI_ALPHA, /* U+001a72: TAI THAM VOWEL SIGN THAM AI*/
+ RTUNI_ALPHA, /* U+001a73: TAI THAM VOWEL SIGN OA ABOVE*/
+ RTUNI_ALPHA, /* U+001a74: TAI THAM SIGN MAI KANG*/
+ 0, /* U+001a75: TAI THAM SIGN TONE-1*/
+ 0, /* U+001a76: TAI THAM SIGN TONE-2*/
+ 0, /* U+001a77: TAI THAM SIGN KHUEN TONE-3*/
+ 0, /* U+001a78: TAI THAM SIGN KHUEN TONE-4*/
+ 0, /* U+001a79: TAI THAM SIGN KHUEN TONE-5*/
+ 0, /* U+001a7a: TAI THAM SIGN RA HAAM*/
+ 0, /* U+001a7b: TAI THAM SIGN MAI SAM*/
+ 0, /* U+001a7c: TAI THAM SIGN KHUEN-LUE KARAN*/
+ 0, /* U+001a7d: */
+ 0, /* U+001a7e: */
+ 0, /* U+001a7f: TAI THAM COMBINING CRYPTOGRAMMIC DOT*/
+ RTUNI_DDIGIT, /* U+001a80: TAI THAM HORA DIGIT ZERO*/
+ RTUNI_DDIGIT, /* U+001a81: TAI THAM HORA DIGIT ONE*/
+ RTUNI_DDIGIT, /* U+001a82: TAI THAM HORA DIGIT TWO*/
+ RTUNI_DDIGIT, /* U+001a83: TAI THAM HORA DIGIT THREE*/
+ RTUNI_DDIGIT, /* U+001a84: TAI THAM HORA DIGIT FOUR*/
+ RTUNI_DDIGIT, /* U+001a85: TAI THAM HORA DIGIT FIVE*/
+ RTUNI_DDIGIT, /* U+001a86: TAI THAM HORA DIGIT SIX*/
+ RTUNI_DDIGIT, /* U+001a87: TAI THAM HORA DIGIT SEVEN*/
+ RTUNI_DDIGIT, /* U+001a88: TAI THAM HORA DIGIT EIGHT*/
+ RTUNI_DDIGIT, /* U+001a89: TAI THAM HORA DIGIT NINE*/
+ 0, /* U+001a8a: */
+ 0, /* U+001a8b: */
+ 0, /* U+001a8c: */
+ 0, /* U+001a8d: */
+ 0, /* U+001a8e: */
+ 0, /* U+001a8f: */
+ RTUNI_DDIGIT, /* U+001a90: TAI THAM THAM DIGIT ZERO*/
+ RTUNI_DDIGIT, /* U+001a91: TAI THAM THAM DIGIT ONE*/
+ RTUNI_DDIGIT, /* U+001a92: TAI THAM THAM DIGIT TWO*/
+ RTUNI_DDIGIT, /* U+001a93: TAI THAM THAM DIGIT THREE*/
+ RTUNI_DDIGIT, /* U+001a94: TAI THAM THAM DIGIT FOUR*/
+ RTUNI_DDIGIT, /* U+001a95: TAI THAM THAM DIGIT FIVE*/
+ RTUNI_DDIGIT, /* U+001a96: TAI THAM THAM DIGIT SIX*/
+ RTUNI_DDIGIT, /* U+001a97: TAI THAM THAM DIGIT SEVEN*/
+ RTUNI_DDIGIT, /* U+001a98: TAI THAM THAM DIGIT EIGHT*/
+ RTUNI_DDIGIT, /* U+001a99: TAI THAM THAM DIGIT NINE*/
+ 0, /* U+001a9a: */
+ 0, /* U+001a9b: */
+ 0, /* U+001a9c: */
+ 0, /* U+001a9d: */
+ 0, /* U+001a9e: */
+ 0, /* U+001a9f: */
+ 0, /* U+001aa0: TAI THAM SIGN WIANG*/
+ 0, /* U+001aa1: TAI THAM SIGN WIANGWAAK*/
+ 0, /* U+001aa2: TAI THAM SIGN SAWAN*/
+ 0, /* U+001aa3: TAI THAM SIGN KEOW*/
+ 0, /* U+001aa4: TAI THAM SIGN HOY*/
+ 0, /* U+001aa5: TAI THAM SIGN DOKMAI*/
+ 0, /* U+001aa6: TAI THAM SIGN REVERSED ROTATED RANA*/
+ RTUNI_ALPHA, /* U+001aa7: TAI THAM SIGN MAI YAMOK*/
+ 0, /* U+001aa8: TAI THAM SIGN KAAN*/
+ 0, /* U+001aa9: TAI THAM SIGN KAANKUU*/
+ 0, /* U+001aaa: TAI THAM SIGN SATKAAN*/
+ 0, /* U+001aab: TAI THAM SIGN SATKAANKUU*/
+ 0, /* U+001aac: TAI THAM SIGN HANG*/
+ 0, /* U+001aad: TAI THAM SIGN CAANG*/
+ 0, /* U+001aae: */
+ 0, /* U+001aaf: */
+ 0, /* U+001ab0: */
+ 0, /* U+001ab1: */
+ 0, /* U+001ab2: */
+ 0, /* U+001ab3: */
+ 0, /* U+001ab4: */
+ 0, /* U+001ab5: */
+ 0, /* U+001ab6: */
+ 0, /* U+001ab7: */
+ 0, /* U+001ab8: */
+ 0, /* U+001ab9: */
+ 0, /* U+001aba: */
+ 0, /* U+001abb: */
+ 0, /* U+001abc: */
+ 0, /* U+001abd: */
+ 0, /* U+001abe: */
+ 0, /* U+001abf: */
+ 0, /* U+001ac0: */
+ 0, /* U+001ac1: */
+ 0, /* U+001ac2: */
+ 0, /* U+001ac3: */
+ 0, /* U+001ac4: */
+ 0, /* U+001ac5: */
+ 0, /* U+001ac6: */
+ 0, /* U+001ac7: */
+ 0, /* U+001ac8: */
+ 0, /* U+001ac9: */
+ 0, /* U+001aca: */
+ 0, /* U+001acb: */
+ 0, /* U+001acc: */
+ 0, /* U+001acd: */
+ 0, /* U+001ace: */
+ 0, /* U+001acf: */
+ 0, /* U+001ad0: */
+ 0, /* U+001ad1: */
+ 0, /* U+001ad2: */
+ 0, /* U+001ad3: */
+ 0, /* U+001ad4: */
+ 0, /* U+001ad5: */
+ 0, /* U+001ad6: */
+ 0, /* U+001ad7: */
+ 0, /* U+001ad8: */
+ 0, /* U+001ad9: */
+ 0, /* U+001ada: */
+ 0, /* U+001adb: */
+ 0, /* U+001adc: */
+ 0, /* U+001add: */
+ 0, /* U+001ade: */
+ 0, /* U+001adf: */
+ 0, /* U+001ae0: */
+ 0, /* U+001ae1: */
+ 0, /* U+001ae2: */
+ 0, /* U+001ae3: */
+ 0, /* U+001ae4: */
+ 0, /* U+001ae5: */
+ 0, /* U+001ae6: */
+ 0, /* U+001ae7: */
+ 0, /* U+001ae8: */
+ 0, /* U+001ae9: */
+ 0, /* U+001aea: */
+ 0, /* U+001aeb: */
+ 0, /* U+001aec: */
+ 0, /* U+001aed: */
+ 0, /* U+001aee: */
+ 0, /* U+001aef: */
+ 0, /* U+001af0: */
+ 0, /* U+001af1: */
+ 0, /* U+001af2: */
+ 0, /* U+001af3: */
+ 0, /* U+001af4: */
+ 0, /* U+001af5: */
+ 0, /* U+001af6: */
+ 0, /* U+001af7: */
+ 0, /* U+001af8: */
+ 0, /* U+001af9: */
+ 0, /* U+001afa: */
+ 0, /* U+001afb: */
+ 0, /* U+001afc: */
+ 0, /* U+001afd: */
+ 0, /* U+001afe: */
+ 0, /* U+001aff: */
+ RTUNI_ALPHA, /* U+001b00: BALINESE SIGN ULU RICEM*/
+ RTUNI_ALPHA, /* U+001b01: BALINESE SIGN ULU CANDRA*/
+ RTUNI_ALPHA, /* U+001b02: BALINESE SIGN CECEK*/
+ RTUNI_ALPHA, /* U+001b03: BALINESE SIGN SURANG*/
+ RTUNI_ALPHA, /* U+001b04: BALINESE SIGN BISAH*/
+ RTUNI_ALPHA, /* U+001b05: BALINESE LETTER AKARA*/
+ RTUNI_ALPHA, /* U+001b06: BALINESE LETTER AKARA TEDUNG*/
+ RTUNI_ALPHA, /* U+001b07: BALINESE LETTER IKARA*/
+ RTUNI_ALPHA, /* U+001b08: BALINESE LETTER IKARA TEDUNG*/
+ RTUNI_ALPHA, /* U+001b09: BALINESE LETTER UKARA*/
+ RTUNI_ALPHA, /* U+001b0a: BALINESE LETTER UKARA TEDUNG*/
+ RTUNI_ALPHA, /* U+001b0b: BALINESE LETTER RA REPA*/
+ RTUNI_ALPHA, /* U+001b0c: BALINESE LETTER RA REPA TEDUNG*/
+ RTUNI_ALPHA, /* U+001b0d: BALINESE LETTER LA LENGA*/
+ RTUNI_ALPHA, /* U+001b0e: BALINESE LETTER LA LENGA TEDUNG*/
+ RTUNI_ALPHA, /* U+001b0f: BALINESE LETTER EKARA*/
+ RTUNI_ALPHA, /* U+001b10: BALINESE LETTER AIKARA*/
+ RTUNI_ALPHA, /* U+001b11: BALINESE LETTER OKARA*/
+ RTUNI_ALPHA, /* U+001b12: BALINESE LETTER OKARA TEDUNG*/
+ RTUNI_ALPHA, /* U+001b13: BALINESE LETTER KA*/
+ RTUNI_ALPHA, /* U+001b14: BALINESE LETTER KA MAHAPRANA*/
+ RTUNI_ALPHA, /* U+001b15: BALINESE LETTER GA*/
+ RTUNI_ALPHA, /* U+001b16: BALINESE LETTER GA GORA*/
+ RTUNI_ALPHA, /* U+001b17: BALINESE LETTER NGA*/
+ RTUNI_ALPHA, /* U+001b18: BALINESE LETTER CA*/
+ RTUNI_ALPHA, /* U+001b19: BALINESE LETTER CA LACA*/
+ RTUNI_ALPHA, /* U+001b1a: BALINESE LETTER JA*/
+ RTUNI_ALPHA, /* U+001b1b: BALINESE LETTER JA JERA*/
+ RTUNI_ALPHA, /* U+001b1c: BALINESE LETTER NYA*/
+ RTUNI_ALPHA, /* U+001b1d: BALINESE LETTER TA LATIK*/
+ RTUNI_ALPHA, /* U+001b1e: BALINESE LETTER TA MURDA MAHAPRANA*/
+ RTUNI_ALPHA, /* U+001b1f: BALINESE LETTER DA MURDA ALPAPRANA*/
+ RTUNI_ALPHA, /* U+001b20: BALINESE LETTER DA MURDA MAHAPRANA*/
+ RTUNI_ALPHA, /* U+001b21: BALINESE LETTER NA RAMBAT*/
+ RTUNI_ALPHA, /* U+001b22: BALINESE LETTER TA*/
+ RTUNI_ALPHA, /* U+001b23: BALINESE LETTER TA TAWA*/
+ RTUNI_ALPHA, /* U+001b24: BALINESE LETTER DA*/
+ RTUNI_ALPHA, /* U+001b25: BALINESE LETTER DA MADU*/
+ RTUNI_ALPHA, /* U+001b26: BALINESE LETTER NA*/
+ RTUNI_ALPHA, /* U+001b27: BALINESE LETTER PA*/
+ RTUNI_ALPHA, /* U+001b28: BALINESE LETTER PA KAPAL*/
+ RTUNI_ALPHA, /* U+001b29: BALINESE LETTER BA*/
+ RTUNI_ALPHA, /* U+001b2a: BALINESE LETTER BA KEMBANG*/
+ RTUNI_ALPHA, /* U+001b2b: BALINESE LETTER MA*/
+ RTUNI_ALPHA, /* U+001b2c: BALINESE LETTER YA*/
+ RTUNI_ALPHA, /* U+001b2d: BALINESE LETTER RA*/
+ RTUNI_ALPHA, /* U+001b2e: BALINESE LETTER LA*/
+ RTUNI_ALPHA, /* U+001b2f: BALINESE LETTER WA*/
+ RTUNI_ALPHA, /* U+001b30: BALINESE LETTER SA SAGA*/
+ RTUNI_ALPHA, /* U+001b31: BALINESE LETTER SA SAPA*/
+ RTUNI_ALPHA, /* U+001b32: BALINESE LETTER SA*/
+ RTUNI_ALPHA, /* U+001b33: BALINESE LETTER HA*/
+ 0, /* U+001b34: BALINESE SIGN REREKAN*/
+ RTUNI_ALPHA, /* U+001b35: BALINESE VOWEL SIGN TEDUNG*/
+ RTUNI_ALPHA, /* U+001b36: BALINESE VOWEL SIGN ULU*/
+ RTUNI_ALPHA, /* U+001b37: BALINESE VOWEL SIGN ULU SARI*/
+ RTUNI_ALPHA, /* U+001b38: BALINESE VOWEL SIGN SUKU*/
+ RTUNI_ALPHA, /* U+001b39: BALINESE VOWEL SIGN SUKU ILUT*/
+ RTUNI_ALPHA, /* U+001b3a: BALINESE VOWEL SIGN RA REPA*/
+ RTUNI_ALPHA, /* U+001b3b: BALINESE VOWEL SIGN RA REPA TEDUNG*/
+ RTUNI_ALPHA, /* U+001b3c: BALINESE VOWEL SIGN LA LENGA*/
+ RTUNI_ALPHA, /* U+001b3d: BALINESE VOWEL SIGN LA LENGA TEDUNG*/
+ RTUNI_ALPHA, /* U+001b3e: BALINESE VOWEL SIGN TALING*/
+ RTUNI_ALPHA, /* U+001b3f: BALINESE VOWEL SIGN TALING REPA*/
+ RTUNI_ALPHA, /* U+001b40: BALINESE VOWEL SIGN TALING TEDUNG*/
+ RTUNI_ALPHA, /* U+001b41: BALINESE VOWEL SIGN TALING REPA TEDUNG*/
+ RTUNI_ALPHA, /* U+001b42: BALINESE VOWEL SIGN PEPET*/
+ RTUNI_ALPHA, /* U+001b43: BALINESE VOWEL SIGN PEPET TEDUNG*/
+ 0, /* U+001b44: BALINESE ADEG ADEG*/
+ RTUNI_ALPHA, /* U+001b45: BALINESE LETTER KAF SASAK*/
+ RTUNI_ALPHA, /* U+001b46: BALINESE LETTER KHOT SASAK*/
+ RTUNI_ALPHA, /* U+001b47: BALINESE LETTER TZIR SASAK*/
+ RTUNI_ALPHA, /* U+001b48: BALINESE LETTER EF SASAK*/
+ RTUNI_ALPHA, /* U+001b49: BALINESE LETTER VE SASAK*/
+ RTUNI_ALPHA, /* U+001b4a: BALINESE LETTER ZAL SASAK*/
+ RTUNI_ALPHA, /* U+001b4b: BALINESE LETTER ASYURA SASAK*/
+ 0, /* U+001b4c: */
+ 0, /* U+001b4d: */
+ 0, /* U+001b4e: */
+ 0, /* U+001b4f: */
+ RTUNI_DDIGIT, /* U+001b50: BALINESE DIGIT ZERO*/
+ RTUNI_DDIGIT, /* U+001b51: BALINESE DIGIT ONE*/
+ RTUNI_DDIGIT, /* U+001b52: BALINESE DIGIT TWO*/
+ RTUNI_DDIGIT, /* U+001b53: BALINESE DIGIT THREE*/
+ RTUNI_DDIGIT, /* U+001b54: BALINESE DIGIT FOUR*/
+ RTUNI_DDIGIT, /* U+001b55: BALINESE DIGIT FIVE*/
+ RTUNI_DDIGIT, /* U+001b56: BALINESE DIGIT SIX*/
+ RTUNI_DDIGIT, /* U+001b57: BALINESE DIGIT SEVEN*/
+ RTUNI_DDIGIT, /* U+001b58: BALINESE DIGIT EIGHT*/
+ RTUNI_DDIGIT, /* U+001b59: BALINESE DIGIT NINE*/
+ 0, /* U+001b5a: BALINESE PANTI*/
+ 0, /* U+001b5b: BALINESE PAMADA*/
+ 0, /* U+001b5c: BALINESE WINDU*/
+ 0, /* U+001b5d: BALINESE CARIK PAMUNGKAH*/
+ 0, /* U+001b5e: BALINESE CARIK SIKI*/
+ 0, /* U+001b5f: BALINESE CARIK PAREREN*/
+ 0, /* U+001b60: BALINESE PAMENENG*/
+ 0, /* U+001b61: BALINESE MUSICAL SYMBOL DONG*/
+ 0, /* U+001b62: BALINESE MUSICAL SYMBOL DENG*/
+ 0, /* U+001b63: BALINESE MUSICAL SYMBOL DUNG*/
+ 0, /* U+001b64: BALINESE MUSICAL SYMBOL DANG*/
+ 0, /* U+001b65: BALINESE MUSICAL SYMBOL DANG SURANG*/
+ 0, /* U+001b66: BALINESE MUSICAL SYMBOL DING*/
+ 0, /* U+001b67: BALINESE MUSICAL SYMBOL DAENG*/
+ 0, /* U+001b68: BALINESE MUSICAL SYMBOL DEUNG*/
+ 0, /* U+001b69: BALINESE MUSICAL SYMBOL DAING*/
+ 0, /* U+001b6a: BALINESE MUSICAL SYMBOL DANG GEDE*/
+ 0, /* U+001b6b: BALINESE MUSICAL SYMBOL COMBINING TEGEH*/
+ 0, /* U+001b6c: BALINESE MUSICAL SYMBOL COMBINING ENDEP*/
+ 0, /* U+001b6d: BALINESE MUSICAL SYMBOL COMBINING KEMPUL*/
+ 0, /* U+001b6e: BALINESE MUSICAL SYMBOL COMBINING KEMPLI*/
+ 0, /* U+001b6f: BALINESE MUSICAL SYMBOL COMBINING JEGOGAN*/
+ 0, /* U+001b70: BALINESE MUSICAL SYMBOL COMBINING KEMPUL WITH JEGOGAN*/
+ 0, /* U+001b71: BALINESE MUSICAL SYMBOL COMBINING KEMPLI WITH JEGOGAN*/
+ 0, /* U+001b72: BALINESE MUSICAL SYMBOL COMBINING BENDE*/
+ 0, /* U+001b73: BALINESE MUSICAL SYMBOL COMBINING GONG*/
+ 0, /* U+001b74: BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG*/
+ 0, /* U+001b75: BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DAG*/
+ 0, /* U+001b76: BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TUK*/
+ 0, /* U+001b77: BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TAK*/
+ 0, /* U+001b78: BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PANG*/
+ 0, /* U+001b79: BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PUNG*/
+ 0, /* U+001b7a: BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLAK*/
+ 0, /* U+001b7b: BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLUK*/
+ 0, /* U+001b7c: BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING*/
+ 0, /* U+001b7d: */
+ 0, /* U+001b7e: */
+ 0, /* U+001b7f: */
+ RTUNI_ALPHA, /* U+001b80: SUNDANESE SIGN PANYECEK*/
+ RTUNI_ALPHA, /* U+001b81: SUNDANESE SIGN PANGLAYAR*/
+ RTUNI_ALPHA, /* U+001b82: SUNDANESE SIGN PANGWISAD*/
+ RTUNI_ALPHA, /* U+001b83: SUNDANESE LETTER A*/
+ RTUNI_ALPHA, /* U+001b84: SUNDANESE LETTER I*/
+ RTUNI_ALPHA, /* U+001b85: SUNDANESE LETTER U*/
+ RTUNI_ALPHA, /* U+001b86: SUNDANESE LETTER AE*/
+ RTUNI_ALPHA, /* U+001b87: SUNDANESE LETTER O*/
+ RTUNI_ALPHA, /* U+001b88: SUNDANESE LETTER E*/
+ RTUNI_ALPHA, /* U+001b89: SUNDANESE LETTER EU*/
+ RTUNI_ALPHA, /* U+001b8a: SUNDANESE LETTER KA*/
+ RTUNI_ALPHA, /* U+001b8b: SUNDANESE LETTER QA*/
+ RTUNI_ALPHA, /* U+001b8c: SUNDANESE LETTER GA*/
+ RTUNI_ALPHA, /* U+001b8d: SUNDANESE LETTER NGA*/
+ RTUNI_ALPHA, /* U+001b8e: SUNDANESE LETTER CA*/
+ RTUNI_ALPHA, /* U+001b8f: SUNDANESE LETTER JA*/
+ RTUNI_ALPHA, /* U+001b90: SUNDANESE LETTER ZA*/
+ RTUNI_ALPHA, /* U+001b91: SUNDANESE LETTER NYA*/
+ RTUNI_ALPHA, /* U+001b92: SUNDANESE LETTER TA*/
+ RTUNI_ALPHA, /* U+001b93: SUNDANESE LETTER DA*/
+ RTUNI_ALPHA, /* U+001b94: SUNDANESE LETTER NA*/
+ RTUNI_ALPHA, /* U+001b95: SUNDANESE LETTER PA*/
+ RTUNI_ALPHA, /* U+001b96: SUNDANESE LETTER FA*/
+ RTUNI_ALPHA, /* U+001b97: SUNDANESE LETTER VA*/
+ RTUNI_ALPHA, /* U+001b98: SUNDANESE LETTER BA*/
+ RTUNI_ALPHA, /* U+001b99: SUNDANESE LETTER MA*/
+ RTUNI_ALPHA, /* U+001b9a: SUNDANESE LETTER YA*/
+ RTUNI_ALPHA, /* U+001b9b: SUNDANESE LETTER RA*/
+ RTUNI_ALPHA, /* U+001b9c: SUNDANESE LETTER LA*/
+ RTUNI_ALPHA, /* U+001b9d: SUNDANESE LETTER WA*/
+ RTUNI_ALPHA, /* U+001b9e: SUNDANESE LETTER SA*/
+ RTUNI_ALPHA, /* U+001b9f: SUNDANESE LETTER XA*/
+ RTUNI_ALPHA, /* U+001ba0: SUNDANESE LETTER HA*/
+ RTUNI_ALPHA, /* U+001ba1: SUNDANESE CONSONANT SIGN PAMINGKAL*/
+ RTUNI_ALPHA, /* U+001ba2: SUNDANESE CONSONANT SIGN PANYAKRA*/
+ RTUNI_ALPHA, /* U+001ba3: SUNDANESE CONSONANT SIGN PANYIKU*/
+ RTUNI_ALPHA, /* U+001ba4: SUNDANESE VOWEL SIGN PANGHULU*/
+ RTUNI_ALPHA, /* U+001ba5: SUNDANESE VOWEL SIGN PANYUKU*/
+ RTUNI_ALPHA, /* U+001ba6: SUNDANESE VOWEL SIGN PANAELAENG*/
+ RTUNI_ALPHA, /* U+001ba7: SUNDANESE VOWEL SIGN PANOLONG*/
+ RTUNI_ALPHA, /* U+001ba8: SUNDANESE VOWEL SIGN PAMEPET*/
+ RTUNI_ALPHA, /* U+001ba9: SUNDANESE VOWEL SIGN PANEULEUNG*/
+ 0, /* U+001baa: SUNDANESE SIGN PAMAAEH*/
+ 0, /* U+001bab: SUNDANESE SIGN VIRAMA*/
+ RTUNI_ALPHA, /* U+001bac: SUNDANESE CONSONANT SIGN PASANGAN MA*/
+ RTUNI_ALPHA, /* U+001bad: SUNDANESE CONSONANT SIGN PASANGAN WA*/
+ RTUNI_ALPHA, /* U+001bae: SUNDANESE LETTER KHA*/
+ RTUNI_ALPHA, /* U+001baf: SUNDANESE LETTER SYA*/
+ RTUNI_DDIGIT, /* U+001bb0: SUNDANESE DIGIT ZERO*/
+ RTUNI_DDIGIT, /* U+001bb1: SUNDANESE DIGIT ONE*/
+ RTUNI_DDIGIT, /* U+001bb2: SUNDANESE DIGIT TWO*/
+ RTUNI_DDIGIT, /* U+001bb3: SUNDANESE DIGIT THREE*/
+ RTUNI_DDIGIT, /* U+001bb4: SUNDANESE DIGIT FOUR*/
+ RTUNI_DDIGIT, /* U+001bb5: SUNDANESE DIGIT FIVE*/
+ RTUNI_DDIGIT, /* U+001bb6: SUNDANESE DIGIT SIX*/
+ RTUNI_DDIGIT, /* U+001bb7: SUNDANESE DIGIT SEVEN*/
+ RTUNI_DDIGIT, /* U+001bb8: SUNDANESE DIGIT EIGHT*/
+ RTUNI_DDIGIT, /* U+001bb9: SUNDANESE DIGIT NINE*/
+ RTUNI_ALPHA, /* U+001bba: SUNDANESE AVAGRAHA*/
+ RTUNI_ALPHA, /* U+001bbb: SUNDANESE LETTER REU*/
+ RTUNI_ALPHA, /* U+001bbc: SUNDANESE LETTER LEU*/
+ RTUNI_ALPHA, /* U+001bbd: SUNDANESE LETTER BHA*/
+ RTUNI_ALPHA, /* U+001bbe: SUNDANESE LETTER FINAL K*/
+ RTUNI_ALPHA, /* U+001bbf: SUNDANESE LETTER FINAL M*/
+ RTUNI_ALPHA, /* U+001bc0: BATAK LETTER A*/
+ RTUNI_ALPHA, /* U+001bc1: BATAK LETTER SIMALUNGUN A*/
+ RTUNI_ALPHA, /* U+001bc2: BATAK LETTER HA*/
+ RTUNI_ALPHA, /* U+001bc3: BATAK LETTER SIMALUNGUN HA*/
+ RTUNI_ALPHA, /* U+001bc4: BATAK LETTER MANDAILING HA*/
+ RTUNI_ALPHA, /* U+001bc5: BATAK LETTER BA*/
+ RTUNI_ALPHA, /* U+001bc6: BATAK LETTER KARO BA*/
+ RTUNI_ALPHA, /* U+001bc7: BATAK LETTER PA*/
+ RTUNI_ALPHA, /* U+001bc8: BATAK LETTER SIMALUNGUN PA*/
+ RTUNI_ALPHA, /* U+001bc9: BATAK LETTER NA*/
+ RTUNI_ALPHA, /* U+001bca: BATAK LETTER MANDAILING NA*/
+ RTUNI_ALPHA, /* U+001bcb: BATAK LETTER WA*/
+ RTUNI_ALPHA, /* U+001bcc: BATAK LETTER SIMALUNGUN WA*/
+ RTUNI_ALPHA, /* U+001bcd: BATAK LETTER PAKPAK WA*/
+ RTUNI_ALPHA, /* U+001bce: BATAK LETTER GA*/
+ RTUNI_ALPHA, /* U+001bcf: BATAK LETTER SIMALUNGUN GA*/
+ RTUNI_ALPHA, /* U+001bd0: BATAK LETTER JA*/
+ RTUNI_ALPHA, /* U+001bd1: BATAK LETTER DA*/
+ RTUNI_ALPHA, /* U+001bd2: BATAK LETTER RA*/
+ RTUNI_ALPHA, /* U+001bd3: BATAK LETTER SIMALUNGUN RA*/
+ RTUNI_ALPHA, /* U+001bd4: BATAK LETTER MA*/
+ RTUNI_ALPHA, /* U+001bd5: BATAK LETTER SIMALUNGUN MA*/
+ RTUNI_ALPHA, /* U+001bd6: BATAK LETTER SOUTHERN TA*/
+ RTUNI_ALPHA, /* U+001bd7: BATAK LETTER NORTHERN TA*/
+ RTUNI_ALPHA, /* U+001bd8: BATAK LETTER SA*/
+ RTUNI_ALPHA, /* U+001bd9: BATAK LETTER SIMALUNGUN SA*/
+ RTUNI_ALPHA, /* U+001bda: BATAK LETTER MANDAILING SA*/
+ RTUNI_ALPHA, /* U+001bdb: BATAK LETTER YA*/
+ RTUNI_ALPHA, /* U+001bdc: BATAK LETTER SIMALUNGUN YA*/
+ RTUNI_ALPHA, /* U+001bdd: BATAK LETTER NGA*/
+ RTUNI_ALPHA, /* U+001bde: BATAK LETTER LA*/
+ RTUNI_ALPHA, /* U+001bdf: BATAK LETTER SIMALUNGUN LA*/
+ RTUNI_ALPHA, /* U+001be0: BATAK LETTER NYA*/
+ RTUNI_ALPHA, /* U+001be1: BATAK LETTER CA*/
+ RTUNI_ALPHA, /* U+001be2: BATAK LETTER NDA*/
+ RTUNI_ALPHA, /* U+001be3: BATAK LETTER MBA*/
+ RTUNI_ALPHA, /* U+001be4: BATAK LETTER I*/
+ RTUNI_ALPHA, /* U+001be5: BATAK LETTER U*/
+ 0, /* U+001be6: BATAK SIGN TOMPI*/
+ RTUNI_ALPHA, /* U+001be7: BATAK VOWEL SIGN E*/
+ RTUNI_ALPHA, /* U+001be8: BATAK VOWEL SIGN PAKPAK E*/
+ RTUNI_ALPHA, /* U+001be9: BATAK VOWEL SIGN EE*/
+ RTUNI_ALPHA, /* U+001bea: BATAK VOWEL SIGN I*/
+ RTUNI_ALPHA, /* U+001beb: BATAK VOWEL SIGN KARO I*/
+ RTUNI_ALPHA, /* U+001bec: BATAK VOWEL SIGN O*/
+ RTUNI_ALPHA, /* U+001bed: BATAK VOWEL SIGN KARO O*/
+ RTUNI_ALPHA, /* U+001bee: BATAK VOWEL SIGN U*/
+ RTUNI_ALPHA, /* U+001bef: BATAK VOWEL SIGN U FOR SIMALUNGUN SA*/
+ RTUNI_ALPHA, /* U+001bf0: BATAK CONSONANT SIGN NG*/
+ RTUNI_ALPHA, /* U+001bf1: BATAK CONSONANT SIGN H*/
+ 0, /* U+001bf2: BATAK PANGOLAT*/
+ 0, /* U+001bf3: BATAK PANONGONAN*/
+ 0, /* U+001bf4: */
+ 0, /* U+001bf5: */
+ 0, /* U+001bf6: */
+ 0, /* U+001bf7: */
+ 0, /* U+001bf8: */
+ 0, /* U+001bf9: */
+ 0, /* U+001bfa: */
+ 0, /* U+001bfb: */
+ 0, /* U+001bfc: BATAK SYMBOL BINDU NA METEK*/
+ 0, /* U+001bfd: BATAK SYMBOL BINDU PINARBORAS*/
+ 0, /* U+001bfe: BATAK SYMBOL BINDU JUDUL*/
+ 0, /* U+001bff: BATAK SYMBOL BINDU PANGOLAT*/
+ RTUNI_ALPHA, /* U+001c00: LEPCHA LETTER KA*/
+ RTUNI_ALPHA, /* U+001c01: LEPCHA LETTER KLA*/
+ RTUNI_ALPHA, /* U+001c02: LEPCHA LETTER KHA*/
+ RTUNI_ALPHA, /* U+001c03: LEPCHA LETTER GA*/
+ RTUNI_ALPHA, /* U+001c04: LEPCHA LETTER GLA*/
+ RTUNI_ALPHA, /* U+001c05: LEPCHA LETTER NGA*/
+ RTUNI_ALPHA, /* U+001c06: LEPCHA LETTER CA*/
+ RTUNI_ALPHA, /* U+001c07: LEPCHA LETTER CHA*/
+ RTUNI_ALPHA, /* U+001c08: LEPCHA LETTER JA*/
+ RTUNI_ALPHA, /* U+001c09: LEPCHA LETTER NYA*/
+ RTUNI_ALPHA, /* U+001c0a: LEPCHA LETTER TA*/
+ RTUNI_ALPHA, /* U+001c0b: LEPCHA LETTER THA*/
+ RTUNI_ALPHA, /* U+001c0c: LEPCHA LETTER DA*/
+ RTUNI_ALPHA, /* U+001c0d: LEPCHA LETTER NA*/
+ RTUNI_ALPHA, /* U+001c0e: LEPCHA LETTER PA*/
+ RTUNI_ALPHA, /* U+001c0f: LEPCHA LETTER PLA*/
+ RTUNI_ALPHA, /* U+001c10: LEPCHA LETTER PHA*/
+ RTUNI_ALPHA, /* U+001c11: LEPCHA LETTER FA*/
+ RTUNI_ALPHA, /* U+001c12: LEPCHA LETTER FLA*/
+ RTUNI_ALPHA, /* U+001c13: LEPCHA LETTER BA*/
+ RTUNI_ALPHA, /* U+001c14: LEPCHA LETTER BLA*/
+ RTUNI_ALPHA, /* U+001c15: LEPCHA LETTER MA*/
+ RTUNI_ALPHA, /* U+001c16: LEPCHA LETTER MLA*/
+ RTUNI_ALPHA, /* U+001c17: LEPCHA LETTER TSA*/
+ RTUNI_ALPHA, /* U+001c18: LEPCHA LETTER TSHA*/
+ RTUNI_ALPHA, /* U+001c19: LEPCHA LETTER DZA*/
+ RTUNI_ALPHA, /* U+001c1a: LEPCHA LETTER YA*/
+ RTUNI_ALPHA, /* U+001c1b: LEPCHA LETTER RA*/
+ RTUNI_ALPHA, /* U+001c1c: LEPCHA LETTER LA*/
+ RTUNI_ALPHA, /* U+001c1d: LEPCHA LETTER HA*/
+ RTUNI_ALPHA, /* U+001c1e: LEPCHA LETTER HLA*/
+ RTUNI_ALPHA, /* U+001c1f: LEPCHA LETTER VA*/
+ RTUNI_ALPHA, /* U+001c20: LEPCHA LETTER SA*/
+ RTUNI_ALPHA, /* U+001c21: LEPCHA LETTER SHA*/
+ RTUNI_ALPHA, /* U+001c22: LEPCHA LETTER WA*/
+ RTUNI_ALPHA, /* U+001c23: LEPCHA LETTER A*/
+ RTUNI_ALPHA, /* U+001c24: LEPCHA SUBJOINED LETTER YA*/
+ RTUNI_ALPHA, /* U+001c25: LEPCHA SUBJOINED LETTER RA*/
+ RTUNI_ALPHA, /* U+001c26: LEPCHA VOWEL SIGN AA*/
+ RTUNI_ALPHA, /* U+001c27: LEPCHA VOWEL SIGN I*/
+ RTUNI_ALPHA, /* U+001c28: LEPCHA VOWEL SIGN O*/
+ RTUNI_ALPHA, /* U+001c29: LEPCHA VOWEL SIGN OO*/
+ RTUNI_ALPHA, /* U+001c2a: LEPCHA VOWEL SIGN U*/
+ RTUNI_ALPHA, /* U+001c2b: LEPCHA VOWEL SIGN UU*/
+ RTUNI_ALPHA, /* U+001c2c: LEPCHA VOWEL SIGN E*/
+ RTUNI_ALPHA, /* U+001c2d: LEPCHA CONSONANT SIGN K*/
+ RTUNI_ALPHA, /* U+001c2e: LEPCHA CONSONANT SIGN M*/
+ RTUNI_ALPHA, /* U+001c2f: LEPCHA CONSONANT SIGN L*/
+ RTUNI_ALPHA, /* U+001c30: LEPCHA CONSONANT SIGN N*/
+ RTUNI_ALPHA, /* U+001c31: LEPCHA CONSONANT SIGN P*/
+ RTUNI_ALPHA, /* U+001c32: LEPCHA CONSONANT SIGN R*/
+ RTUNI_ALPHA, /* U+001c33: LEPCHA CONSONANT SIGN T*/
+ RTUNI_ALPHA, /* U+001c34: LEPCHA CONSONANT SIGN NYIN-DO*/
+ RTUNI_ALPHA, /* U+001c35: LEPCHA CONSONANT SIGN KANG*/
+ 0, /* U+001c36: LEPCHA SIGN RAN*/
+ 0, /* U+001c37: LEPCHA SIGN NUKTA*/
+ 0, /* U+001c38: */
+ 0, /* U+001c39: */
+ 0, /* U+001c3a: */
+ 0, /* U+001c3b: LEPCHA PUNCTUATION TA-ROL*/
+ 0, /* U+001c3c: LEPCHA PUNCTUATION NYET THYOOM TA-ROL*/
+ 0, /* U+001c3d: LEPCHA PUNCTUATION CER-WA*/
+ 0, /* U+001c3e: LEPCHA PUNCTUATION TSHOOK CER-WA*/
+ 0, /* U+001c3f: LEPCHA PUNCTUATION TSHOOK*/
+ RTUNI_DDIGIT, /* U+001c40: LEPCHA DIGIT ZERO*/
+ RTUNI_DDIGIT, /* U+001c41: LEPCHA DIGIT ONE*/
+ RTUNI_DDIGIT, /* U+001c42: LEPCHA DIGIT TWO*/
+ RTUNI_DDIGIT, /* U+001c43: LEPCHA DIGIT THREE*/
+ RTUNI_DDIGIT, /* U+001c44: LEPCHA DIGIT FOUR*/
+ RTUNI_DDIGIT, /* U+001c45: LEPCHA DIGIT FIVE*/
+ RTUNI_DDIGIT, /* U+001c46: LEPCHA DIGIT SIX*/
+ RTUNI_DDIGIT, /* U+001c47: LEPCHA DIGIT SEVEN*/
+ RTUNI_DDIGIT, /* U+001c48: LEPCHA DIGIT EIGHT*/
+ RTUNI_DDIGIT, /* U+001c49: LEPCHA DIGIT NINE*/
+ 0, /* U+001c4a: */
+ 0, /* U+001c4b: */
+ 0, /* U+001c4c: */
+ RTUNI_ALPHA, /* U+001c4d: LEPCHA LETTER TTA*/
+ RTUNI_ALPHA, /* U+001c4e: LEPCHA LETTER TTHA*/
+ RTUNI_ALPHA, /* U+001c4f: LEPCHA LETTER DDA*/
+ RTUNI_DDIGIT, /* U+001c50: OL CHIKI DIGIT ZERO*/
+ RTUNI_DDIGIT, /* U+001c51: OL CHIKI DIGIT ONE*/
+ RTUNI_DDIGIT, /* U+001c52: OL CHIKI DIGIT TWO*/
+ RTUNI_DDIGIT, /* U+001c53: OL CHIKI DIGIT THREE*/
+ RTUNI_DDIGIT, /* U+001c54: OL CHIKI DIGIT FOUR*/
+ RTUNI_DDIGIT, /* U+001c55: OL CHIKI DIGIT FIVE*/
+ RTUNI_DDIGIT, /* U+001c56: OL CHIKI DIGIT SIX*/
+ RTUNI_DDIGIT, /* U+001c57: OL CHIKI DIGIT SEVEN*/
+ RTUNI_DDIGIT, /* U+001c58: OL CHIKI DIGIT EIGHT*/
+ RTUNI_DDIGIT, /* U+001c59: OL CHIKI DIGIT NINE*/
+ RTUNI_ALPHA, /* U+001c5a: OL CHIKI LETTER LA*/
+ RTUNI_ALPHA, /* U+001c5b: OL CHIKI LETTER AT*/
+ RTUNI_ALPHA, /* U+001c5c: OL CHIKI LETTER AG*/
+ RTUNI_ALPHA, /* U+001c5d: OL CHIKI LETTER ANG*/
+ RTUNI_ALPHA, /* U+001c5e: OL CHIKI LETTER AL*/
+ RTUNI_ALPHA, /* U+001c5f: OL CHIKI LETTER LAA*/
+ RTUNI_ALPHA, /* U+001c60: OL CHIKI LETTER AAK*/
+ RTUNI_ALPHA, /* U+001c61: OL CHIKI LETTER AAJ*/
+ RTUNI_ALPHA, /* U+001c62: OL CHIKI LETTER AAM*/
+ RTUNI_ALPHA, /* U+001c63: OL CHIKI LETTER AAW*/
+ RTUNI_ALPHA, /* U+001c64: OL CHIKI LETTER LI*/
+ RTUNI_ALPHA, /* U+001c65: OL CHIKI LETTER IS*/
+ RTUNI_ALPHA, /* U+001c66: OL CHIKI LETTER IH*/
+ RTUNI_ALPHA, /* U+001c67: OL CHIKI LETTER INY*/
+ RTUNI_ALPHA, /* U+001c68: OL CHIKI LETTER IR*/
+ RTUNI_ALPHA, /* U+001c69: OL CHIKI LETTER LU*/
+ RTUNI_ALPHA, /* U+001c6a: OL CHIKI LETTER UC*/
+ RTUNI_ALPHA, /* U+001c6b: OL CHIKI LETTER UD*/
+ RTUNI_ALPHA, /* U+001c6c: OL CHIKI LETTER UNN*/
+ RTUNI_ALPHA, /* U+001c6d: OL CHIKI LETTER UY*/
+ RTUNI_ALPHA, /* U+001c6e: OL CHIKI LETTER LE*/
+ RTUNI_ALPHA, /* U+001c6f: OL CHIKI LETTER EP*/
+ RTUNI_ALPHA, /* U+001c70: OL CHIKI LETTER EDD*/
+ RTUNI_ALPHA, /* U+001c71: OL CHIKI LETTER EN*/
+ RTUNI_ALPHA, /* U+001c72: OL CHIKI LETTER ERR*/
+ RTUNI_ALPHA, /* U+001c73: OL CHIKI LETTER LO*/
+ RTUNI_ALPHA, /* U+001c74: OL CHIKI LETTER OTT*/
+ RTUNI_ALPHA, /* U+001c75: OL CHIKI LETTER OB*/
+ RTUNI_ALPHA, /* U+001c76: OL CHIKI LETTER OV*/
+ RTUNI_ALPHA, /* U+001c77: OL CHIKI LETTER OH*/
+ RTUNI_ALPHA, /* U+001c78: OL CHIKI MU TTUDDAG*/
+ RTUNI_ALPHA, /* U+001c79: OL CHIKI GAAHLAA TTUDDAAG*/
+ RTUNI_ALPHA, /* U+001c7a: OL CHIKI MU-GAAHLAA TTUDDAAG*/
+ RTUNI_ALPHA, /* U+001c7b: OL CHIKI RELAA*/
+ RTUNI_ALPHA, /* U+001c7c: OL CHIKI PHAARKAA*/
+ RTUNI_ALPHA, /* U+001c7d: OL CHIKI AHAD*/
+ 0, /* U+001c7e: OL CHIKI PUNCTUATION MUCAAD*/
+ 0, /* U+001c7f: OL CHIKI PUNCTUATION DOUBLE MUCAAD*/
+ 0, /* U+001c80: */
+ 0, /* U+001c81: */
+ 0, /* U+001c82: */
+ 0, /* U+001c83: */
+ 0, /* U+001c84: */
+ 0, /* U+001c85: */
+ 0, /* U+001c86: */
+ 0, /* U+001c87: */
+ 0, /* U+001c88: */
+ 0, /* U+001c89: */
+ 0, /* U+001c8a: */
+ 0, /* U+001c8b: */
+ 0, /* U+001c8c: */
+ 0, /* U+001c8d: */
+ 0, /* U+001c8e: */
+ 0, /* U+001c8f: */
+ 0, /* U+001c90: */
+ 0, /* U+001c91: */
+ 0, /* U+001c92: */
+ 0, /* U+001c93: */
+ 0, /* U+001c94: */
+ 0, /* U+001c95: */
+ 0, /* U+001c96: */
+ 0, /* U+001c97: */
+ 0, /* U+001c98: */
+ 0, /* U+001c99: */
+ 0, /* U+001c9a: */
+ 0, /* U+001c9b: */
+ 0, /* U+001c9c: */
+ 0, /* U+001c9d: */
+ 0, /* U+001c9e: */
+ 0, /* U+001c9f: */
+ 0, /* U+001ca0: */
+ 0, /* U+001ca1: */
+ 0, /* U+001ca2: */
+ 0, /* U+001ca3: */
+ 0, /* U+001ca4: */
+ 0, /* U+001ca5: */
+ 0, /* U+001ca6: */
+ 0, /* U+001ca7: */
+ 0, /* U+001ca8: */
+ 0, /* U+001ca9: */
+ 0, /* U+001caa: */
+ 0, /* U+001cab: */
+ 0, /* U+001cac: */
+ 0, /* U+001cad: */
+ 0, /* U+001cae: */
+ 0, /* U+001caf: */
+ 0, /* U+001cb0: */
+ 0, /* U+001cb1: */
+ 0, /* U+001cb2: */
+ 0, /* U+001cb3: */
+ 0, /* U+001cb4: */
+ 0, /* U+001cb5: */
+ 0, /* U+001cb6: */
+ 0, /* U+001cb7: */
+ 0, /* U+001cb8: */
+ 0, /* U+001cb9: */
+ 0, /* U+001cba: */
+ 0, /* U+001cbb: */
+ 0, /* U+001cbc: */
+ 0, /* U+001cbd: */
+ 0, /* U+001cbe: */
+ 0, /* U+001cbf: */
+ 0, /* U+001cc0: SUNDANESE PUNCTUATION BINDU SURYA*/
+ 0, /* U+001cc1: SUNDANESE PUNCTUATION BINDU PANGLONG*/
+ 0, /* U+001cc2: SUNDANESE PUNCTUATION BINDU PURNAMA*/
+ 0, /* U+001cc3: SUNDANESE PUNCTUATION BINDU CAKRA*/
+ 0, /* U+001cc4: SUNDANESE PUNCTUATION BINDU LEU SATANGA*/
+ 0, /* U+001cc5: SUNDANESE PUNCTUATION BINDU KA SATANGA*/
+ 0, /* U+001cc6: SUNDANESE PUNCTUATION BINDU DA SATANGA*/
+ 0, /* U+001cc7: SUNDANESE PUNCTUATION BINDU BA SATANGA*/
+ 0, /* U+001cc8: */
+ 0, /* U+001cc9: */
+ 0, /* U+001cca: */
+ 0, /* U+001ccb: */
+ 0, /* U+001ccc: */
+ 0, /* U+001ccd: */
+ 0, /* U+001cce: */
+ 0, /* U+001ccf: */
+ 0, /* U+001cd0: VEDIC TONE KARSHANA*/
+ 0, /* U+001cd1: VEDIC TONE SHARA*/
+ 0, /* U+001cd2: VEDIC TONE PRENKHA*/
+ 0, /* U+001cd3: VEDIC SIGN NIHSHVASA*/
+ 0, /* U+001cd4: VEDIC SIGN YAJURVEDIC MIDLINE SVARITA*/
+ 0, /* U+001cd5: VEDIC TONE YAJURVEDIC AGGRAVATED INDEPENDENT SVARITA*/
+ 0, /* U+001cd6: VEDIC TONE YAJURVEDIC INDEPENDENT SVARITA*/
+ 0, /* U+001cd7: VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA*/
+ 0, /* U+001cd8: VEDIC TONE CANDRA BELOW*/
+ 0, /* U+001cd9: VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA SCHROEDER*/
+ 0, /* U+001cda: VEDIC TONE DOUBLE SVARITA*/
+ 0, /* U+001cdb: VEDIC TONE TRIPLE SVARITA*/
+ 0, /* U+001cdc: VEDIC TONE KATHAKA ANUDATTA*/
+ 0, /* U+001cdd: VEDIC TONE DOT BELOW*/
+ 0, /* U+001cde: VEDIC TONE TWO DOTS BELOW*/
+ 0, /* U+001cdf: VEDIC TONE THREE DOTS BELOW*/
+ 0, /* U+001ce0: VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA*/
+ 0, /* U+001ce1: VEDIC TONE ATHARVAVEDIC INDEPENDENT SVARITA*/
+ 0, /* U+001ce2: VEDIC SIGN VISARGA SVARITA*/
+ 0, /* U+001ce3: VEDIC SIGN VISARGA UDATTA*/
+ 0, /* U+001ce4: VEDIC SIGN REVERSED VISARGA UDATTA*/
+ 0, /* U+001ce5: VEDIC SIGN VISARGA ANUDATTA*/
+ 0, /* U+001ce6: VEDIC SIGN REVERSED VISARGA ANUDATTA*/
+ 0, /* U+001ce7: VEDIC SIGN VISARGA UDATTA WITH TAIL*/
+ 0, /* U+001ce8: VEDIC SIGN VISARGA ANUDATTA WITH TAIL*/
+ RTUNI_ALPHA, /* U+001ce9: VEDIC SIGN ANUSVARA ANTARGOMUKHA*/
+ RTUNI_ALPHA, /* U+001cea: VEDIC SIGN ANUSVARA BAHIRGOMUKHA*/
+ RTUNI_ALPHA, /* U+001ceb: VEDIC SIGN ANUSVARA VAMAGOMUKHA*/
+ RTUNI_ALPHA, /* U+001cec: VEDIC SIGN ANUSVARA VAMAGOMUKHA WITH TAIL*/
+ 0, /* U+001ced: VEDIC SIGN TIRYAK*/
+ RTUNI_ALPHA, /* U+001cee: VEDIC SIGN HEXIFORM LONG ANUSVARA*/
+ RTUNI_ALPHA, /* U+001cef: VEDIC SIGN LONG ANUSVARA*/
+ RTUNI_ALPHA, /* U+001cf0: VEDIC SIGN RTHANG LONG ANUSVARA*/
+ RTUNI_ALPHA, /* U+001cf1: VEDIC SIGN ANUSVARA UBHAYATO MUKHA*/
+ RTUNI_ALPHA, /* U+001cf2: VEDIC SIGN ARDHAVISARGA*/
+ RTUNI_ALPHA, /* U+001cf3: VEDIC SIGN ROTATED ARDHAVISARGA*/
+ 0, /* U+001cf4: VEDIC TONE CANDRA ABOVE*/
+ RTUNI_ALPHA, /* U+001cf5: VEDIC SIGN JIHVAMULIYA*/
+ RTUNI_ALPHA, /* U+001cf6: VEDIC SIGN UPADHMANIYA*/
+ 0, /* U+001cf7: */
+ 0, /* U+001cf8: */
+ 0, /* U+001cf9: */
+ 0, /* U+001cfa: */
+ 0, /* U+001cfb: */
+ 0, /* U+001cfc: */
+ 0, /* U+001cfd: */
+ 0, /* U+001cfe: */
+ 0, /* U+001cff: */
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d00: LATIN LETTER SMALL CAPITAL A*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d01: LATIN LETTER SMALL CAPITAL AE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d02: LATIN SMALL LETTER TURNED AE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d03: LATIN LETTER SMALL CAPITAL BARRED B*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d04: LATIN LETTER SMALL CAPITAL C*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d05: LATIN LETTER SMALL CAPITAL D*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d06: LATIN LETTER SMALL CAPITAL ETH*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d07: LATIN LETTER SMALL CAPITAL E*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d08: LATIN SMALL LETTER TURNED OPEN E*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d09: LATIN SMALL LETTER TURNED I*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d0a: LATIN LETTER SMALL CAPITAL J*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d0b: LATIN LETTER SMALL CAPITAL K*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d0c: LATIN LETTER SMALL CAPITAL L WITH STROKE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d0d: LATIN LETTER SMALL CAPITAL M*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d0e: LATIN LETTER SMALL CAPITAL REVERSED N*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d0f: LATIN LETTER SMALL CAPITAL O*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d10: LATIN LETTER SMALL CAPITAL OPEN O*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d11: LATIN SMALL LETTER SIDEWAYS O*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d12: LATIN SMALL LETTER SIDEWAYS OPEN O*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d13: LATIN SMALL LETTER SIDEWAYS O WITH STROKE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d14: LATIN SMALL LETTER TURNED OE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d15: LATIN LETTER SMALL CAPITAL OU*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d16: LATIN SMALL LETTER TOP HALF O*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d17: LATIN SMALL LETTER BOTTOM HALF O*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d18: LATIN LETTER SMALL CAPITAL P*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d19: LATIN LETTER SMALL CAPITAL REVERSED R*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d1a: LATIN LETTER SMALL CAPITAL TURNED R*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d1b: LATIN LETTER SMALL CAPITAL T*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d1c: LATIN LETTER SMALL CAPITAL U*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d1d: LATIN SMALL LETTER SIDEWAYS U*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d1e: LATIN SMALL LETTER SIDEWAYS DIAERESIZED U*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d1f: LATIN SMALL LETTER SIDEWAYS TURNED M*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d20: LATIN LETTER SMALL CAPITAL V*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d21: LATIN LETTER SMALL CAPITAL W*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d22: LATIN LETTER SMALL CAPITAL Z*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d23: LATIN LETTER SMALL CAPITAL EZH*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d24: LATIN LETTER VOICED LARYNGEAL SPIRANT*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d25: LATIN LETTER AIN*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d26: GREEK LETTER SMALL CAPITAL GAMMA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d27: GREEK LETTER SMALL CAPITAL LAMDA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d28: GREEK LETTER SMALL CAPITAL PI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d29: GREEK LETTER SMALL CAPITAL RHO*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d2a: GREEK LETTER SMALL CAPITAL PSI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d2b: CYRILLIC LETTER SMALL CAPITAL EL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d2c: MODIFIER LETTER CAPITAL A*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d2d: MODIFIER LETTER CAPITAL AE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d2e: MODIFIER LETTER CAPITAL B*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d2f: MODIFIER LETTER CAPITAL BARRED B*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d30: MODIFIER LETTER CAPITAL D*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d31: MODIFIER LETTER CAPITAL E*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d32: MODIFIER LETTER CAPITAL REVERSED E*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d33: MODIFIER LETTER CAPITAL G*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d34: MODIFIER LETTER CAPITAL H*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d35: MODIFIER LETTER CAPITAL I*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d36: MODIFIER LETTER CAPITAL J*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d37: MODIFIER LETTER CAPITAL K*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d38: MODIFIER LETTER CAPITAL L*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d39: MODIFIER LETTER CAPITAL M*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d3a: MODIFIER LETTER CAPITAL N*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d3b: MODIFIER LETTER CAPITAL REVERSED N*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d3c: MODIFIER LETTER CAPITAL O*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d3d: MODIFIER LETTER CAPITAL OU*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d3e: MODIFIER LETTER CAPITAL P*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d3f: MODIFIER LETTER CAPITAL R*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d40: MODIFIER LETTER CAPITAL T*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d41: MODIFIER LETTER CAPITAL U*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d42: MODIFIER LETTER CAPITAL W*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d43: MODIFIER LETTER SMALL A*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d44: MODIFIER LETTER SMALL TURNED A*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d45: MODIFIER LETTER SMALL ALPHA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d46: MODIFIER LETTER SMALL TURNED AE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d47: MODIFIER LETTER SMALL B*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d48: MODIFIER LETTER SMALL D*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d49: MODIFIER LETTER SMALL E*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d4a: MODIFIER LETTER SMALL SCHWA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d4b: MODIFIER LETTER SMALL OPEN E*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d4c: MODIFIER LETTER SMALL TURNED OPEN E*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d4d: MODIFIER LETTER SMALL G*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d4e: MODIFIER LETTER SMALL TURNED I*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d4f: MODIFIER LETTER SMALL K*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d50: MODIFIER LETTER SMALL M*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d51: MODIFIER LETTER SMALL ENG*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d52: MODIFIER LETTER SMALL O*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d53: MODIFIER LETTER SMALL OPEN O*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d54: MODIFIER LETTER SMALL TOP HALF O*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d55: MODIFIER LETTER SMALL BOTTOM HALF O*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d56: MODIFIER LETTER SMALL P*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d57: MODIFIER LETTER SMALL T*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d58: MODIFIER LETTER SMALL U*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d59: MODIFIER LETTER SMALL SIDEWAYS U*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d5a: MODIFIER LETTER SMALL TURNED M*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d5b: MODIFIER LETTER SMALL V*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d5c: MODIFIER LETTER SMALL AIN*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d5d: MODIFIER LETTER SMALL BETA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d5e: MODIFIER LETTER SMALL GREEK GAMMA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d5f: MODIFIER LETTER SMALL DELTA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d60: MODIFIER LETTER SMALL GREEK PHI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d61: MODIFIER LETTER SMALL CHI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d62: LATIN SUBSCRIPT SMALL LETTER I*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d63: LATIN SUBSCRIPT SMALL LETTER R*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d64: LATIN SUBSCRIPT SMALL LETTER U*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d65: LATIN SUBSCRIPT SMALL LETTER V*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d66: GREEK SUBSCRIPT SMALL LETTER BETA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d67: GREEK SUBSCRIPT SMALL LETTER GAMMA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d68: GREEK SUBSCRIPT SMALL LETTER RHO*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d69: GREEK SUBSCRIPT SMALL LETTER PHI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d6a: GREEK SUBSCRIPT SMALL LETTER CHI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d6b: LATIN SMALL LETTER UE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d6c: LATIN SMALL LETTER B WITH MIDDLE TILDE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d6d: LATIN SMALL LETTER D WITH MIDDLE TILDE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d6e: LATIN SMALL LETTER F WITH MIDDLE TILDE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d6f: LATIN SMALL LETTER M WITH MIDDLE TILDE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d70: LATIN SMALL LETTER N WITH MIDDLE TILDE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d71: LATIN SMALL LETTER P WITH MIDDLE TILDE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d72: LATIN SMALL LETTER R WITH MIDDLE TILDE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d73: LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d74: LATIN SMALL LETTER S WITH MIDDLE TILDE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d75: LATIN SMALL LETTER T WITH MIDDLE TILDE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d76: LATIN SMALL LETTER Z WITH MIDDLE TILDE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d77: LATIN SMALL LETTER TURNED G*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d78: MODIFIER LETTER CYRILLIC EN*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d79: LATIN SMALL LETTER INSULAR G*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d7a: LATIN SMALL LETTER TH WITH STRIKETHROUGH*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d7b: LATIN SMALL CAPITAL LETTER I WITH STROKE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d7c: LATIN SMALL LETTER IOTA WITH STROKE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d7d: LATIN SMALL LETTER P WITH STROKE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d7e: LATIN SMALL CAPITAL LETTER U WITH STROKE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d7f: LATIN SMALL LETTER UPSILON WITH STROKE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d80: LATIN SMALL LETTER B WITH PALATAL HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d81: LATIN SMALL LETTER D WITH PALATAL HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d82: LATIN SMALL LETTER F WITH PALATAL HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d83: LATIN SMALL LETTER G WITH PALATAL HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d84: LATIN SMALL LETTER K WITH PALATAL HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d85: LATIN SMALL LETTER L WITH PALATAL HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d86: LATIN SMALL LETTER M WITH PALATAL HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d87: LATIN SMALL LETTER N WITH PALATAL HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d88: LATIN SMALL LETTER P WITH PALATAL HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d89: LATIN SMALL LETTER R WITH PALATAL HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d8a: LATIN SMALL LETTER S WITH PALATAL HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d8b: LATIN SMALL LETTER ESH WITH PALATAL HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d8c: LATIN SMALL LETTER V WITH PALATAL HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d8d: LATIN SMALL LETTER X WITH PALATAL HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d8e: LATIN SMALL LETTER Z WITH PALATAL HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d8f: LATIN SMALL LETTER A WITH RETROFLEX HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d90: LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d91: LATIN SMALL LETTER D WITH HOOK AND TAIL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d92: LATIN SMALL LETTER E WITH RETROFLEX HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d93: LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d94: LATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d95: LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d96: LATIN SMALL LETTER I WITH RETROFLEX HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d97: LATIN SMALL LETTER OPEN O WITH RETROFLEX HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d98: LATIN SMALL LETTER ESH WITH RETROFLEX HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d99: LATIN SMALL LETTER U WITH RETROFLEX HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d9a: LATIN SMALL LETTER EZH WITH RETROFLEX HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d9b: MODIFIER LETTER SMALL TURNED ALPHA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d9c: MODIFIER LETTER SMALL C*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d9d: MODIFIER LETTER SMALL C WITH CURL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d9e: MODIFIER LETTER SMALL ETH*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001d9f: MODIFIER LETTER SMALL REVERSED OPEN E*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001da0: MODIFIER LETTER SMALL F*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001da1: MODIFIER LETTER SMALL DOTLESS J WITH STROKE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001da2: MODIFIER LETTER SMALL SCRIPT G*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001da3: MODIFIER LETTER SMALL TURNED H*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001da4: MODIFIER LETTER SMALL I WITH STROKE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001da5: MODIFIER LETTER SMALL IOTA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001da6: MODIFIER LETTER SMALL CAPITAL I*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001da7: MODIFIER LETTER SMALL CAPITAL I WITH STROKE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001da8: MODIFIER LETTER SMALL J WITH CROSSED-TAIL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001da9: MODIFIER LETTER SMALL L WITH RETROFLEX HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001daa: MODIFIER LETTER SMALL L WITH PALATAL HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001dab: MODIFIER LETTER SMALL CAPITAL L*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001dac: MODIFIER LETTER SMALL M WITH HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001dad: MODIFIER LETTER SMALL TURNED M WITH LONG LEG*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001dae: MODIFIER LETTER SMALL N WITH LEFT HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001daf: MODIFIER LETTER SMALL N WITH RETROFLEX HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001db0: MODIFIER LETTER SMALL CAPITAL N*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001db1: MODIFIER LETTER SMALL BARRED O*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001db2: MODIFIER LETTER SMALL PHI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001db3: MODIFIER LETTER SMALL S WITH HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001db4: MODIFIER LETTER SMALL ESH*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001db5: MODIFIER LETTER SMALL T WITH PALATAL HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001db6: MODIFIER LETTER SMALL U BAR*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001db7: MODIFIER LETTER SMALL UPSILON*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001db8: MODIFIER LETTER SMALL CAPITAL U*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001db9: MODIFIER LETTER SMALL V WITH HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001dba: MODIFIER LETTER SMALL TURNED V*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001dbb: MODIFIER LETTER SMALL Z*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001dbc: MODIFIER LETTER SMALL Z WITH RETROFLEX HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001dbd: MODIFIER LETTER SMALL Z WITH CURL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001dbe: MODIFIER LETTER SMALL EZH*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001dbf: MODIFIER LETTER SMALL THETA*/
+ 0, /* U+001dc0: COMBINING DOTTED GRAVE ACCENT*/
+ 0, /* U+001dc1: COMBINING DOTTED ACUTE ACCENT*/
+ 0, /* U+001dc2: COMBINING SNAKE BELOW*/
+ 0, /* U+001dc3: COMBINING SUSPENSION MARK*/
+ 0, /* U+001dc4: COMBINING MACRON-ACUTE*/
+ 0, /* U+001dc5: COMBINING GRAVE-MACRON*/
+ 0, /* U+001dc6: COMBINING MACRON-GRAVE*/
+ 0, /* U+001dc7: COMBINING ACUTE-MACRON*/
+ 0, /* U+001dc8: COMBINING GRAVE-ACUTE-GRAVE*/
+ 0, /* U+001dc9: COMBINING ACUTE-GRAVE-ACUTE*/
+ 0, /* U+001dca: COMBINING LATIN SMALL LETTER R BELOW*/
+ 0, /* U+001dcb: COMBINING BREVE-MACRON*/
+ 0, /* U+001dcc: COMBINING MACRON-BREVE*/
+ 0, /* U+001dcd: COMBINING DOUBLE CIRCUMFLEX ABOVE*/
+ 0, /* U+001dce: COMBINING OGONEK ABOVE*/
+ 0, /* U+001dcf: COMBINING ZIGZAG BELOW*/
+ 0, /* U+001dd0: COMBINING IS BELOW*/
+ 0, /* U+001dd1: COMBINING UR ABOVE*/
+ 0, /* U+001dd2: COMBINING US ABOVE*/
+ 0, /* U+001dd3: COMBINING LATIN SMALL LETTER FLATTENED OPEN A ABOVE*/
+ 0, /* U+001dd4: COMBINING LATIN SMALL LETTER AE*/
+ 0, /* U+001dd5: COMBINING LATIN SMALL LETTER AO*/
+ 0, /* U+001dd6: COMBINING LATIN SMALL LETTER AV*/
+ 0, /* U+001dd7: COMBINING LATIN SMALL LETTER C CEDILLA*/
+ 0, /* U+001dd8: COMBINING LATIN SMALL LETTER INSULAR D*/
+ 0, /* U+001dd9: COMBINING LATIN SMALL LETTER ETH*/
+ 0, /* U+001dda: COMBINING LATIN SMALL LETTER G*/
+ 0, /* U+001ddb: COMBINING LATIN LETTER SMALL CAPITAL G*/
+ 0, /* U+001ddc: COMBINING LATIN SMALL LETTER K*/
+ 0, /* U+001ddd: COMBINING LATIN SMALL LETTER L*/
+ 0, /* U+001dde: COMBINING LATIN LETTER SMALL CAPITAL L*/
+ 0, /* U+001ddf: COMBINING LATIN LETTER SMALL CAPITAL M*/
+ 0, /* U+001de0: COMBINING LATIN SMALL LETTER N*/
+ 0, /* U+001de1: COMBINING LATIN LETTER SMALL CAPITAL N*/
+ 0, /* U+001de2: COMBINING LATIN LETTER SMALL CAPITAL R*/
+ 0, /* U+001de3: COMBINING LATIN SMALL LETTER R ROTUNDA*/
+ 0, /* U+001de4: COMBINING LATIN SMALL LETTER S*/
+ 0, /* U+001de5: COMBINING LATIN SMALL LETTER LONG S*/
+ 0, /* U+001de6: COMBINING LATIN SMALL LETTER Z*/
+ 0, /* U+001de7: */
+ 0, /* U+001de8: */
+ 0, /* U+001de9: */
+ 0, /* U+001dea: */
+ 0, /* U+001deb: */
+ 0, /* U+001dec: */
+ 0, /* U+001ded: */
+ 0, /* U+001dee: */
+ 0, /* U+001def: */
+ 0, /* U+001df0: */
+ 0, /* U+001df1: */
+ 0, /* U+001df2: */
+ 0, /* U+001df3: */
+ 0, /* U+001df4: */
+ 0, /* U+001df5: */
+ 0, /* U+001df6: */
+ 0, /* U+001df7: */
+ 0, /* U+001df8: */
+ 0, /* U+001df9: */
+ 0, /* U+001dfa: */
+ 0, /* U+001dfb: */
+ 0, /* U+001dfc: COMBINING DOUBLE INVERTED BREVE BELOW*/
+ 0, /* U+001dfd: COMBINING ALMOST EQUAL TO BELOW*/
+ 0, /* U+001dfe: COMBINING LEFT ARROWHEAD ABOVE*/
+ 0, /* U+001dff: COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e00: LATIN CAPITAL LETTER A WITH RING BELOW*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e01: LATIN SMALL LETTER A WITH RING BELOW*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e02: LATIN CAPITAL LETTER B WITH DOT ABOVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e03: LATIN SMALL LETTER B WITH DOT ABOVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e04: LATIN CAPITAL LETTER B WITH DOT BELOW*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e05: LATIN SMALL LETTER B WITH DOT BELOW*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e06: LATIN CAPITAL LETTER B WITH LINE BELOW*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e07: LATIN SMALL LETTER B WITH LINE BELOW*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e08: LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e09: LATIN SMALL LETTER C WITH CEDILLA AND ACUTE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e0a: LATIN CAPITAL LETTER D WITH DOT ABOVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e0b: LATIN SMALL LETTER D WITH DOT ABOVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e0c: LATIN CAPITAL LETTER D WITH DOT BELOW*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e0d: LATIN SMALL LETTER D WITH DOT BELOW*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e0e: LATIN CAPITAL LETTER D WITH LINE BELOW*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e0f: LATIN SMALL LETTER D WITH LINE BELOW*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e10: LATIN CAPITAL LETTER D WITH CEDILLA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e11: LATIN SMALL LETTER D WITH CEDILLA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e12: LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e13: LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e14: LATIN CAPITAL LETTER E WITH MACRON AND GRAVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e15: LATIN SMALL LETTER E WITH MACRON AND GRAVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e16: LATIN CAPITAL LETTER E WITH MACRON AND ACUTE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e17: LATIN SMALL LETTER E WITH MACRON AND ACUTE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e18: LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e19: LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e1a: LATIN CAPITAL LETTER E WITH TILDE BELOW*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e1b: LATIN SMALL LETTER E WITH TILDE BELOW*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e1c: LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e1d: LATIN SMALL LETTER E WITH CEDILLA AND BREVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e1e: LATIN CAPITAL LETTER F WITH DOT ABOVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e1f: LATIN SMALL LETTER F WITH DOT ABOVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e20: LATIN CAPITAL LETTER G WITH MACRON*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e21: LATIN SMALL LETTER G WITH MACRON*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e22: LATIN CAPITAL LETTER H WITH DOT ABOVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e23: LATIN SMALL LETTER H WITH DOT ABOVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e24: LATIN CAPITAL LETTER H WITH DOT BELOW*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e25: LATIN SMALL LETTER H WITH DOT BELOW*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e26: LATIN CAPITAL LETTER H WITH DIAERESIS*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e27: LATIN SMALL LETTER H WITH DIAERESIS*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e28: LATIN CAPITAL LETTER H WITH CEDILLA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e29: LATIN SMALL LETTER H WITH CEDILLA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e2a: LATIN CAPITAL LETTER H WITH BREVE BELOW*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e2b: LATIN SMALL LETTER H WITH BREVE BELOW*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e2c: LATIN CAPITAL LETTER I WITH TILDE BELOW*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e2d: LATIN SMALL LETTER I WITH TILDE BELOW*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e2e: LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e2f: LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e30: LATIN CAPITAL LETTER K WITH ACUTE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e31: LATIN SMALL LETTER K WITH ACUTE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e32: LATIN CAPITAL LETTER K WITH DOT BELOW*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e33: LATIN SMALL LETTER K WITH DOT BELOW*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e34: LATIN CAPITAL LETTER K WITH LINE BELOW*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e35: LATIN SMALL LETTER K WITH LINE BELOW*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e36: LATIN CAPITAL LETTER L WITH DOT BELOW*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e37: LATIN SMALL LETTER L WITH DOT BELOW*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e38: LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e39: LATIN SMALL LETTER L WITH DOT BELOW AND MACRON*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e3a: LATIN CAPITAL LETTER L WITH LINE BELOW*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e3b: LATIN SMALL LETTER L WITH LINE BELOW*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e3c: LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e3d: LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e3e: LATIN CAPITAL LETTER M WITH ACUTE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e3f: LATIN SMALL LETTER M WITH ACUTE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e40: LATIN CAPITAL LETTER M WITH DOT ABOVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e41: LATIN SMALL LETTER M WITH DOT ABOVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e42: LATIN CAPITAL LETTER M WITH DOT BELOW*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e43: LATIN SMALL LETTER M WITH DOT BELOW*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e44: LATIN CAPITAL LETTER N WITH DOT ABOVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e45: LATIN SMALL LETTER N WITH DOT ABOVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e46: LATIN CAPITAL LETTER N WITH DOT BELOW*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e47: LATIN SMALL LETTER N WITH DOT BELOW*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e48: LATIN CAPITAL LETTER N WITH LINE BELOW*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e49: LATIN SMALL LETTER N WITH LINE BELOW*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e4a: LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e4b: LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e4c: LATIN CAPITAL LETTER O WITH TILDE AND ACUTE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e4d: LATIN SMALL LETTER O WITH TILDE AND ACUTE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e4e: LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e4f: LATIN SMALL LETTER O WITH TILDE AND DIAERESIS*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e50: LATIN CAPITAL LETTER O WITH MACRON AND GRAVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e51: LATIN SMALL LETTER O WITH MACRON AND GRAVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e52: LATIN CAPITAL LETTER O WITH MACRON AND ACUTE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e53: LATIN SMALL LETTER O WITH MACRON AND ACUTE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e54: LATIN CAPITAL LETTER P WITH ACUTE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e55: LATIN SMALL LETTER P WITH ACUTE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e56: LATIN CAPITAL LETTER P WITH DOT ABOVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e57: LATIN SMALL LETTER P WITH DOT ABOVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e58: LATIN CAPITAL LETTER R WITH DOT ABOVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e59: LATIN SMALL LETTER R WITH DOT ABOVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e5a: LATIN CAPITAL LETTER R WITH DOT BELOW*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e5b: LATIN SMALL LETTER R WITH DOT BELOW*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e5c: LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e5d: LATIN SMALL LETTER R WITH DOT BELOW AND MACRON*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e5e: LATIN CAPITAL LETTER R WITH LINE BELOW*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e5f: LATIN SMALL LETTER R WITH LINE BELOW*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e60: LATIN CAPITAL LETTER S WITH DOT ABOVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e61: LATIN SMALL LETTER S WITH DOT ABOVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e62: LATIN CAPITAL LETTER S WITH DOT BELOW*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e63: LATIN SMALL LETTER S WITH DOT BELOW*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e64: LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e65: LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e66: LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e67: LATIN SMALL LETTER S WITH CARON AND DOT ABOVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e68: LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e69: LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e6a: LATIN CAPITAL LETTER T WITH DOT ABOVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e6b: LATIN SMALL LETTER T WITH DOT ABOVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e6c: LATIN CAPITAL LETTER T WITH DOT BELOW*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e6d: LATIN SMALL LETTER T WITH DOT BELOW*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e6e: LATIN CAPITAL LETTER T WITH LINE BELOW*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e6f: LATIN SMALL LETTER T WITH LINE BELOW*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e70: LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e71: LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e72: LATIN CAPITAL LETTER U WITH DIAERESIS BELOW*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e73: LATIN SMALL LETTER U WITH DIAERESIS BELOW*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e74: LATIN CAPITAL LETTER U WITH TILDE BELOW*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e75: LATIN SMALL LETTER U WITH TILDE BELOW*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e76: LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e77: LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e78: LATIN CAPITAL LETTER U WITH TILDE AND ACUTE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e79: LATIN SMALL LETTER U WITH TILDE AND ACUTE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e7a: LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e7b: LATIN SMALL LETTER U WITH MACRON AND DIAERESIS*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e7c: LATIN CAPITAL LETTER V WITH TILDE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e7d: LATIN SMALL LETTER V WITH TILDE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e7e: LATIN CAPITAL LETTER V WITH DOT BELOW*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e7f: LATIN SMALL LETTER V WITH DOT BELOW*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e80: LATIN CAPITAL LETTER W WITH GRAVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e81: LATIN SMALL LETTER W WITH GRAVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e82: LATIN CAPITAL LETTER W WITH ACUTE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e83: LATIN SMALL LETTER W WITH ACUTE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e84: LATIN CAPITAL LETTER W WITH DIAERESIS*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e85: LATIN SMALL LETTER W WITH DIAERESIS*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e86: LATIN CAPITAL LETTER W WITH DOT ABOVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e87: LATIN SMALL LETTER W WITH DOT ABOVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e88: LATIN CAPITAL LETTER W WITH DOT BELOW*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e89: LATIN SMALL LETTER W WITH DOT BELOW*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e8a: LATIN CAPITAL LETTER X WITH DOT ABOVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e8b: LATIN SMALL LETTER X WITH DOT ABOVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e8c: LATIN CAPITAL LETTER X WITH DIAERESIS*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e8d: LATIN SMALL LETTER X WITH DIAERESIS*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e8e: LATIN CAPITAL LETTER Y WITH DOT ABOVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e8f: LATIN SMALL LETTER Y WITH DOT ABOVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e90: LATIN CAPITAL LETTER Z WITH CIRCUMFLEX*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e91: LATIN SMALL LETTER Z WITH CIRCUMFLEX*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e92: LATIN CAPITAL LETTER Z WITH DOT BELOW*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e93: LATIN SMALL LETTER Z WITH DOT BELOW*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e94: LATIN CAPITAL LETTER Z WITH LINE BELOW*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e95: LATIN SMALL LETTER Z WITH LINE BELOW*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e96: LATIN SMALL LETTER H WITH LINE BELOW*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e97: LATIN SMALL LETTER T WITH DIAERESIS*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e98: LATIN SMALL LETTER W WITH RING ABOVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e99: LATIN SMALL LETTER Y WITH RING ABOVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e9a: LATIN SMALL LETTER A WITH RIGHT HALF RING*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e9b: LATIN SMALL LETTER LONG S WITH DOT ABOVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e9c: LATIN SMALL LETTER LONG S WITH DIAGONAL STROKE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e9d: LATIN SMALL LETTER LONG S WITH HIGH STROKE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001e9e: LATIN CAPITAL LETTER SHARP S*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001e9f: LATIN SMALL LETTER DELTA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001ea0: LATIN CAPITAL LETTER A WITH DOT BELOW*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001ea1: LATIN SMALL LETTER A WITH DOT BELOW*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001ea2: LATIN CAPITAL LETTER A WITH HOOK ABOVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001ea3: LATIN SMALL LETTER A WITH HOOK ABOVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001ea4: LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001ea5: LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001ea6: LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001ea7: LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001ea8: LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001ea9: LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001eaa: LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001eab: LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001eac: LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001ead: LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001eae: LATIN CAPITAL LETTER A WITH BREVE AND ACUTE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001eaf: LATIN SMALL LETTER A WITH BREVE AND ACUTE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001eb0: LATIN CAPITAL LETTER A WITH BREVE AND GRAVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001eb1: LATIN SMALL LETTER A WITH BREVE AND GRAVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001eb2: LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001eb3: LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001eb4: LATIN CAPITAL LETTER A WITH BREVE AND TILDE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001eb5: LATIN SMALL LETTER A WITH BREVE AND TILDE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001eb6: LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001eb7: LATIN SMALL LETTER A WITH BREVE AND DOT BELOW*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001eb8: LATIN CAPITAL LETTER E WITH DOT BELOW*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001eb9: LATIN SMALL LETTER E WITH DOT BELOW*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001eba: LATIN CAPITAL LETTER E WITH HOOK ABOVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001ebb: LATIN SMALL LETTER E WITH HOOK ABOVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001ebc: LATIN CAPITAL LETTER E WITH TILDE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001ebd: LATIN SMALL LETTER E WITH TILDE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001ebe: LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001ebf: LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001ec0: LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001ec1: LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001ec2: LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001ec3: LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001ec4: LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001ec5: LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001ec6: LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001ec7: LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001ec8: LATIN CAPITAL LETTER I WITH HOOK ABOVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001ec9: LATIN SMALL LETTER I WITH HOOK ABOVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001eca: LATIN CAPITAL LETTER I WITH DOT BELOW*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001ecb: LATIN SMALL LETTER I WITH DOT BELOW*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001ecc: LATIN CAPITAL LETTER O WITH DOT BELOW*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001ecd: LATIN SMALL LETTER O WITH DOT BELOW*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001ece: LATIN CAPITAL LETTER O WITH HOOK ABOVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001ecf: LATIN SMALL LETTER O WITH HOOK ABOVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001ed0: LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001ed1: LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001ed2: LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001ed3: LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001ed4: LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001ed5: LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001ed6: LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001ed7: LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001ed8: LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001ed9: LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001eda: LATIN CAPITAL LETTER O WITH HORN AND ACUTE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001edb: LATIN SMALL LETTER O WITH HORN AND ACUTE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001edc: LATIN CAPITAL LETTER O WITH HORN AND GRAVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001edd: LATIN SMALL LETTER O WITH HORN AND GRAVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001ede: LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001edf: LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001ee0: LATIN CAPITAL LETTER O WITH HORN AND TILDE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001ee1: LATIN SMALL LETTER O WITH HORN AND TILDE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001ee2: LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001ee3: LATIN SMALL LETTER O WITH HORN AND DOT BELOW*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001ee4: LATIN CAPITAL LETTER U WITH DOT BELOW*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001ee5: LATIN SMALL LETTER U WITH DOT BELOW*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001ee6: LATIN CAPITAL LETTER U WITH HOOK ABOVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001ee7: LATIN SMALL LETTER U WITH HOOK ABOVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001ee8: LATIN CAPITAL LETTER U WITH HORN AND ACUTE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001ee9: LATIN SMALL LETTER U WITH HORN AND ACUTE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001eea: LATIN CAPITAL LETTER U WITH HORN AND GRAVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001eeb: LATIN SMALL LETTER U WITH HORN AND GRAVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001eec: LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001eed: LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001eee: LATIN CAPITAL LETTER U WITH HORN AND TILDE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001eef: LATIN SMALL LETTER U WITH HORN AND TILDE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001ef0: LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001ef1: LATIN SMALL LETTER U WITH HORN AND DOT BELOW*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001ef2: LATIN CAPITAL LETTER Y WITH GRAVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001ef3: LATIN SMALL LETTER Y WITH GRAVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001ef4: LATIN CAPITAL LETTER Y WITH DOT BELOW*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001ef5: LATIN SMALL LETTER Y WITH DOT BELOW*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001ef6: LATIN CAPITAL LETTER Y WITH HOOK ABOVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001ef7: LATIN SMALL LETTER Y WITH HOOK ABOVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001ef8: LATIN CAPITAL LETTER Y WITH TILDE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001ef9: LATIN SMALL LETTER Y WITH TILDE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001efa: LATIN CAPITAL LETTER MIDDLE-WELSH LL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001efb: LATIN SMALL LETTER MIDDLE-WELSH LL*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001efc: LATIN CAPITAL LETTER MIDDLE-WELSH V*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001efd: LATIN SMALL LETTER MIDDLE-WELSH V*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001efe: LATIN CAPITAL LETTER Y WITH LOOP*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001eff: LATIN SMALL LETTER Y WITH LOOP*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f00: GREEK SMALL LETTER ALPHA WITH PSILI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f01: GREEK SMALL LETTER ALPHA WITH DASIA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f02: GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f03: GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f04: GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f05: GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f06: GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f07: GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001f08: GREEK CAPITAL LETTER ALPHA WITH PSILI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001f09: GREEK CAPITAL LETTER ALPHA WITH DASIA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001f0a: GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001f0b: GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001f0c: GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001f0d: GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001f0e: GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001f0f: GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f10: GREEK SMALL LETTER EPSILON WITH PSILI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f11: GREEK SMALL LETTER EPSILON WITH DASIA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f12: GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f13: GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f14: GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f15: GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA*/
+ 0, /* U+001f16: */
+ 0, /* U+001f17: */
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001f18: GREEK CAPITAL LETTER EPSILON WITH PSILI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001f19: GREEK CAPITAL LETTER EPSILON WITH DASIA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001f1a: GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001f1b: GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001f1c: GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001f1d: GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA*/
+ 0, /* U+001f1e: */
+ 0, /* U+001f1f: */
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f20: GREEK SMALL LETTER ETA WITH PSILI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f21: GREEK SMALL LETTER ETA WITH DASIA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f22: GREEK SMALL LETTER ETA WITH PSILI AND VARIA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f23: GREEK SMALL LETTER ETA WITH DASIA AND VARIA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f24: GREEK SMALL LETTER ETA WITH PSILI AND OXIA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f25: GREEK SMALL LETTER ETA WITH DASIA AND OXIA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f26: GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f27: GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001f28: GREEK CAPITAL LETTER ETA WITH PSILI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001f29: GREEK CAPITAL LETTER ETA WITH DASIA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001f2a: GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001f2b: GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001f2c: GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001f2d: GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001f2e: GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001f2f: GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f30: GREEK SMALL LETTER IOTA WITH PSILI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f31: GREEK SMALL LETTER IOTA WITH DASIA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f32: GREEK SMALL LETTER IOTA WITH PSILI AND VARIA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f33: GREEK SMALL LETTER IOTA WITH DASIA AND VARIA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f34: GREEK SMALL LETTER IOTA WITH PSILI AND OXIA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f35: GREEK SMALL LETTER IOTA WITH DASIA AND OXIA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f36: GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f37: GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001f38: GREEK CAPITAL LETTER IOTA WITH PSILI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001f39: GREEK CAPITAL LETTER IOTA WITH DASIA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001f3a: GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001f3b: GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001f3c: GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001f3d: GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001f3e: GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001f3f: GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f40: GREEK SMALL LETTER OMICRON WITH PSILI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f41: GREEK SMALL LETTER OMICRON WITH DASIA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f42: GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f43: GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f44: GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f45: GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA*/
+ 0, /* U+001f46: */
+ 0, /* U+001f47: */
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001f48: GREEK CAPITAL LETTER OMICRON WITH PSILI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001f49: GREEK CAPITAL LETTER OMICRON WITH DASIA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001f4a: GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001f4b: GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001f4c: GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001f4d: GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA*/
+ 0, /* U+001f4e: */
+ 0, /* U+001f4f: */
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f50: GREEK SMALL LETTER UPSILON WITH PSILI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f51: GREEK SMALL LETTER UPSILON WITH DASIA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f52: GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f53: GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f54: GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f55: GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f56: GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f57: GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI*/
+ 0, /* U+001f58: */
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001f59: GREEK CAPITAL LETTER UPSILON WITH DASIA*/
+ 0, /* U+001f5a: */
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001f5b: GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA*/
+ 0, /* U+001f5c: */
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001f5d: GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA*/
+ 0, /* U+001f5e: */
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001f5f: GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f60: GREEK SMALL LETTER OMEGA WITH PSILI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f61: GREEK SMALL LETTER OMEGA WITH DASIA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f62: GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f63: GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f64: GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f65: GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f66: GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f67: GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001f68: GREEK CAPITAL LETTER OMEGA WITH PSILI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001f69: GREEK CAPITAL LETTER OMEGA WITH DASIA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001f6a: GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001f6b: GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001f6c: GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001f6d: GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001f6e: GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001f6f: GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f70: GREEK SMALL LETTER ALPHA WITH VARIA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f71: GREEK SMALL LETTER ALPHA WITH OXIA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f72: GREEK SMALL LETTER EPSILON WITH VARIA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f73: GREEK SMALL LETTER EPSILON WITH OXIA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f74: GREEK SMALL LETTER ETA WITH VARIA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f75: GREEK SMALL LETTER ETA WITH OXIA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f76: GREEK SMALL LETTER IOTA WITH VARIA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f77: GREEK SMALL LETTER IOTA WITH OXIA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f78: GREEK SMALL LETTER OMICRON WITH VARIA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f79: GREEK SMALL LETTER OMICRON WITH OXIA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f7a: GREEK SMALL LETTER UPSILON WITH VARIA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f7b: GREEK SMALL LETTER UPSILON WITH OXIA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f7c: GREEK SMALL LETTER OMEGA WITH VARIA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f7d: GREEK SMALL LETTER OMEGA WITH OXIA*/
+ 0, /* U+001f7e: */
+ 0, /* U+001f7f: */
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f80: GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f81: GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f82: GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f83: GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f84: GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f85: GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f86: GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f87: GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI*/
+ RTUNI_ALPHA, /* U+001f88: GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI*/
+ RTUNI_ALPHA, /* U+001f89: GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI*/
+ RTUNI_ALPHA, /* U+001f8a: GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI*/
+ RTUNI_ALPHA, /* U+001f8b: GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI*/
+ RTUNI_ALPHA, /* U+001f8c: GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI*/
+ RTUNI_ALPHA, /* U+001f8d: GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI*/
+ RTUNI_ALPHA, /* U+001f8e: GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI*/
+ RTUNI_ALPHA, /* U+001f8f: GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f90: GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f91: GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f92: GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f93: GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f94: GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f95: GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f96: GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001f97: GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI*/
+ RTUNI_ALPHA, /* U+001f98: GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI*/
+ RTUNI_ALPHA, /* U+001f99: GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI*/
+ RTUNI_ALPHA, /* U+001f9a: GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI*/
+ RTUNI_ALPHA, /* U+001f9b: GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI*/
+ RTUNI_ALPHA, /* U+001f9c: GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI*/
+ RTUNI_ALPHA, /* U+001f9d: GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI*/
+ RTUNI_ALPHA, /* U+001f9e: GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI*/
+ RTUNI_ALPHA, /* U+001f9f: GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001fa0: GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001fa1: GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001fa2: GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001fa3: GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001fa4: GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001fa5: GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001fa6: GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001fa7: GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI*/
+ RTUNI_ALPHA, /* U+001fa8: GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI*/
+ RTUNI_ALPHA, /* U+001fa9: GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI*/
+ RTUNI_ALPHA, /* U+001faa: GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI*/
+ RTUNI_ALPHA, /* U+001fab: GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI*/
+ RTUNI_ALPHA, /* U+001fac: GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI*/
+ RTUNI_ALPHA, /* U+001fad: GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI*/
+ RTUNI_ALPHA, /* U+001fae: GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI*/
+ RTUNI_ALPHA, /* U+001faf: GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001fb0: GREEK SMALL LETTER ALPHA WITH VRACHY*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001fb1: GREEK SMALL LETTER ALPHA WITH MACRON*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001fb2: GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001fb3: GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001fb4: GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI*/
+ 0, /* U+001fb5: */
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001fb6: GREEK SMALL LETTER ALPHA WITH PERISPOMENI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001fb7: GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001fb8: GREEK CAPITAL LETTER ALPHA WITH VRACHY*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001fb9: GREEK CAPITAL LETTER ALPHA WITH MACRON*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001fba: GREEK CAPITAL LETTER ALPHA WITH VARIA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001fbb: GREEK CAPITAL LETTER ALPHA WITH OXIA*/
+ RTUNI_ALPHA, /* U+001fbc: GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI*/
+ 0, /* U+001fbd: GREEK KORONIS*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001fbe: GREEK PROSGEGRAMMENI*/
+ 0, /* U+001fbf: GREEK PSILI*/
+ 0, /* U+001fc0: GREEK PERISPOMENI*/
+ 0, /* U+001fc1: GREEK DIALYTIKA AND PERISPOMENI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001fc2: GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001fc3: GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001fc4: GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI*/
+ 0, /* U+001fc5: */
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001fc6: GREEK SMALL LETTER ETA WITH PERISPOMENI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001fc7: GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001fc8: GREEK CAPITAL LETTER EPSILON WITH VARIA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001fc9: GREEK CAPITAL LETTER EPSILON WITH OXIA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001fca: GREEK CAPITAL LETTER ETA WITH VARIA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001fcb: GREEK CAPITAL LETTER ETA WITH OXIA*/
+ RTUNI_ALPHA, /* U+001fcc: GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI*/
+ 0, /* U+001fcd: GREEK PSILI AND VARIA*/
+ 0, /* U+001fce: GREEK PSILI AND OXIA*/
+ 0, /* U+001fcf: GREEK PSILI AND PERISPOMENI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001fd0: GREEK SMALL LETTER IOTA WITH VRACHY*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001fd1: GREEK SMALL LETTER IOTA WITH MACRON*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001fd2: GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001fd3: GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA*/
+ 0, /* U+001fd4: */
+ 0, /* U+001fd5: */
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001fd6: GREEK SMALL LETTER IOTA WITH PERISPOMENI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001fd7: GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001fd8: GREEK CAPITAL LETTER IOTA WITH VRACHY*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001fd9: GREEK CAPITAL LETTER IOTA WITH MACRON*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001fda: GREEK CAPITAL LETTER IOTA WITH VARIA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001fdb: GREEK CAPITAL LETTER IOTA WITH OXIA*/
+ 0, /* U+001fdc: */
+ 0, /* U+001fdd: GREEK DASIA AND VARIA*/
+ 0, /* U+001fde: GREEK DASIA AND OXIA*/
+ 0, /* U+001fdf: GREEK DASIA AND PERISPOMENI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001fe0: GREEK SMALL LETTER UPSILON WITH VRACHY*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001fe1: GREEK SMALL LETTER UPSILON WITH MACRON*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001fe2: GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001fe3: GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001fe4: GREEK SMALL LETTER RHO WITH PSILI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001fe5: GREEK SMALL LETTER RHO WITH DASIA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001fe6: GREEK SMALL LETTER UPSILON WITH PERISPOMENI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001fe7: GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001fe8: GREEK CAPITAL LETTER UPSILON WITH VRACHY*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001fe9: GREEK CAPITAL LETTER UPSILON WITH MACRON*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001fea: GREEK CAPITAL LETTER UPSILON WITH VARIA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001feb: GREEK CAPITAL LETTER UPSILON WITH OXIA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001fec: GREEK CAPITAL LETTER RHO WITH DASIA*/
+ 0, /* U+001fed: GREEK DIALYTIKA AND VARIA*/
+ 0, /* U+001fee: GREEK DIALYTIKA AND OXIA*/
+ 0, /* U+001fef: GREEK VARIA*/
+ 0, /* U+001ff0: */
+ 0, /* U+001ff1: */
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001ff2: GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001ff3: GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001ff4: GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI*/
+ 0, /* U+001ff5: */
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001ff6: GREEK SMALL LETTER OMEGA WITH PERISPOMENI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+001ff7: GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001ff8: GREEK CAPITAL LETTER OMICRON WITH VARIA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001ff9: GREEK CAPITAL LETTER OMICRON WITH OXIA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001ffa: GREEK CAPITAL LETTER OMEGA WITH VARIA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+001ffb: GREEK CAPITAL LETTER OMEGA WITH OXIA*/
+ RTUNI_ALPHA, /* U+001ffc: GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI*/
+ 0, /* U+001ffd: GREEK OXIA*/
+ 0, /* U+001ffe: GREEK DASIA*/
+ 0, /* U+001fff: */
+ RTUNI_WSPACE, /* U+002000: EN QUAD*/
+ RTUNI_WSPACE, /* U+002001: EM QUAD*/
+ RTUNI_WSPACE, /* U+002002: EN SPACE*/
+ RTUNI_WSPACE, /* U+002003: EM SPACE*/
+ RTUNI_WSPACE, /* U+002004: THREE-PER-EM SPACE*/
+ RTUNI_WSPACE, /* U+002005: FOUR-PER-EM SPACE*/
+ RTUNI_WSPACE, /* U+002006: SIX-PER-EM SPACE*/
+ RTUNI_WSPACE, /* U+002007: FIGURE SPACE*/
+ RTUNI_WSPACE, /* U+002008: PUNCTUATION SPACE*/
+ RTUNI_WSPACE, /* U+002009: THIN SPACE*/
+ RTUNI_WSPACE, /* U+00200a: HAIR SPACE*/
+ 0, /* U+00200b: ZERO WIDTH SPACE*/
+ 0, /* U+00200c: ZERO WIDTH NON-JOINER*/
+ 0, /* U+00200d: ZERO WIDTH JOINER*/
+ 0, /* U+00200e: LEFT-TO-RIGHT MARK*/
+ 0, /* U+00200f: RIGHT-TO-LEFT MARK*/
+ 0, /* U+002010: HYPHEN*/
+ 0, /* U+002011: NON-BREAKING HYPHEN*/
+ 0, /* U+002012: FIGURE DASH*/
+ 0, /* U+002013: EN DASH*/
+ 0, /* U+002014: EM DASH*/
+ 0, /* U+002015: HORIZONTAL BAR*/
+ 0, /* U+002016: DOUBLE VERTICAL LINE*/
+ 0, /* U+002017: DOUBLE LOW LINE*/
+ 0, /* U+002018: LEFT SINGLE QUOTATION MARK*/
+ 0, /* U+002019: RIGHT SINGLE QUOTATION MARK*/
+ 0, /* U+00201a: SINGLE LOW-9 QUOTATION MARK*/
+ 0, /* U+00201b: SINGLE HIGH-REVERSED-9 QUOTATION MARK*/
+ 0, /* U+00201c: LEFT DOUBLE QUOTATION MARK*/
+ 0, /* U+00201d: RIGHT DOUBLE QUOTATION MARK*/
+ 0, /* U+00201e: DOUBLE LOW-9 QUOTATION MARK*/
+ 0, /* U+00201f: DOUBLE HIGH-REVERSED-9 QUOTATION MARK*/
+ 0, /* U+002020: DAGGER*/
+ 0, /* U+002021: DOUBLE DAGGER*/
+ 0, /* U+002022: BULLET*/
+ 0, /* U+002023: TRIANGULAR BULLET*/
+ 0, /* U+002024: ONE DOT LEADER*/
+ 0, /* U+002025: TWO DOT LEADER*/
+ 0, /* U+002026: HORIZONTAL ELLIPSIS*/
+ 0, /* U+002027: HYPHENATION POINT*/
+ RTUNI_WSPACE, /* U+002028: LINE SEPARATOR*/
+ RTUNI_WSPACE, /* U+002029: PARAGRAPH SEPARATOR*/
+ 0, /* U+00202a: LEFT-TO-RIGHT EMBEDDING*/
+ 0, /* U+00202b: RIGHT-TO-LEFT EMBEDDING*/
+ 0, /* U+00202c: POP DIRECTIONAL FORMATTING*/
+ 0, /* U+00202d: LEFT-TO-RIGHT OVERRIDE*/
+ 0, /* U+00202e: RIGHT-TO-LEFT OVERRIDE*/
+ RTUNI_WSPACE, /* U+00202f: NARROW NO-BREAK SPACE*/
+ 0, /* U+002030: PER MILLE SIGN*/
+ 0, /* U+002031: PER TEN THOUSAND SIGN*/
+ 0, /* U+002032: PRIME*/
+ 0, /* U+002033: DOUBLE PRIME*/
+ 0, /* U+002034: TRIPLE PRIME*/
+ 0, /* U+002035: REVERSED PRIME*/
+ 0, /* U+002036: REVERSED DOUBLE PRIME*/
+ 0, /* U+002037: REVERSED TRIPLE PRIME*/
+ 0, /* U+002038: CARET*/
+ 0, /* U+002039: SINGLE LEFT-POINTING ANGLE QUOTATION MARK*/
+ 0, /* U+00203a: SINGLE RIGHT-POINTING ANGLE QUOTATION MARK*/
+ 0, /* U+00203b: REFERENCE MARK*/
+ 0, /* U+00203c: DOUBLE EXCLAMATION MARK*/
+ 0, /* U+00203d: INTERROBANG*/
+ 0, /* U+00203e: OVERLINE*/
+ 0, /* U+00203f: UNDERTIE*/
+ 0, /* U+002040: CHARACTER TIE*/
+ 0, /* U+002041: CARET INSERTION POINT*/
+ 0, /* U+002042: ASTERISM*/
+ 0, /* U+002043: HYPHEN BULLET*/
+ 0, /* U+002044: FRACTION SLASH*/
+ 0, /* U+002045: LEFT SQUARE BRACKET WITH QUILL*/
+ 0, /* U+002046: RIGHT SQUARE BRACKET WITH QUILL*/
+ 0, /* U+002047: DOUBLE QUESTION MARK*/
+ 0, /* U+002048: QUESTION EXCLAMATION MARK*/
+ 0, /* U+002049: EXCLAMATION QUESTION MARK*/
+ 0, /* U+00204a: TIRONIAN SIGN ET*/
+ 0, /* U+00204b: REVERSED PILCROW SIGN*/
+ 0, /* U+00204c: BLACK LEFTWARDS BULLET*/
+ 0, /* U+00204d: BLACK RIGHTWARDS BULLET*/
+ 0, /* U+00204e: LOW ASTERISK*/
+ 0, /* U+00204f: REVERSED SEMICOLON*/
+ 0, /* U+002050: CLOSE UP*/
+ 0, /* U+002051: TWO ASTERISKS ALIGNED VERTICALLY*/
+ 0, /* U+002052: COMMERCIAL MINUS SIGN*/
+ 0, /* U+002053: SWUNG DASH*/
+ 0, /* U+002054: INVERTED UNDERTIE*/
+ 0, /* U+002055: FLOWER PUNCTUATION MARK*/
+ 0, /* U+002056: THREE DOT PUNCTUATION*/
+ 0, /* U+002057: QUADRUPLE PRIME*/
+ 0, /* U+002058: FOUR DOT PUNCTUATION*/
+ 0, /* U+002059: FIVE DOT PUNCTUATION*/
+ 0, /* U+00205a: TWO DOT PUNCTUATION*/
+ 0, /* U+00205b: FOUR DOT MARK*/
+ 0, /* U+00205c: DOTTED CROSS*/
+ 0, /* U+00205d: TRICOLON*/
+ 0, /* U+00205e: VERTICAL FOUR DOTS*/
+ RTUNI_WSPACE, /* U+00205f: MEDIUM MATHEMATICAL SPACE*/
+ 0, /* U+002060: WORD JOINER*/
+ 0, /* U+002061: FUNCTION APPLICATION*/
+ 0, /* U+002062: INVISIBLE TIMES*/
+ 0, /* U+002063: INVISIBLE SEPARATOR*/
+ 0, /* U+002064: INVISIBLE PLUS*/
+ 0, /* U+002065: */
+ 0, /* U+002066: LEFT-TO-RIGHT ISOLATE*/
+ 0, /* U+002067: RIGHT-TO-LEFT ISOLATE*/
+ 0, /* U+002068: FIRST STRONG ISOLATE*/
+ 0, /* U+002069: POP DIRECTIONAL ISOLATE*/
+ 0, /* U+00206a: INHIBIT SYMMETRIC SWAPPING*/
+ 0, /* U+00206b: ACTIVATE SYMMETRIC SWAPPING*/
+ 0, /* U+00206c: INHIBIT ARABIC FORM SHAPING*/
+ 0, /* U+00206d: ACTIVATE ARABIC FORM SHAPING*/
+ 0, /* U+00206e: NATIONAL DIGIT SHAPES*/
+ 0, /* U+00206f: NOMINAL DIGIT SHAPES*/
+ 0, /* U+002070: SUPERSCRIPT ZERO*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002071: SUPERSCRIPT LATIN SMALL LETTER I*/
+ 0, /* U+002072: */
+ 0, /* U+002073: */
+ 0, /* U+002074: SUPERSCRIPT FOUR*/
+ 0, /* U+002075: SUPERSCRIPT FIVE*/
+ 0, /* U+002076: SUPERSCRIPT SIX*/
+ 0, /* U+002077: SUPERSCRIPT SEVEN*/
+ 0, /* U+002078: SUPERSCRIPT EIGHT*/
+ 0, /* U+002079: SUPERSCRIPT NINE*/
+ 0, /* U+00207a: SUPERSCRIPT PLUS SIGN*/
+ 0, /* U+00207b: SUPERSCRIPT MINUS*/
+ 0, /* U+00207c: SUPERSCRIPT EQUALS SIGN*/
+ 0, /* U+00207d: SUPERSCRIPT LEFT PARENTHESIS*/
+ 0, /* U+00207e: SUPERSCRIPT RIGHT PARENTHESIS*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00207f: SUPERSCRIPT LATIN SMALL LETTER N*/
+ 0, /* U+002080: SUBSCRIPT ZERO*/
+ 0, /* U+002081: SUBSCRIPT ONE*/
+ 0, /* U+002082: SUBSCRIPT TWO*/
+ 0, /* U+002083: SUBSCRIPT THREE*/
+ 0, /* U+002084: SUBSCRIPT FOUR*/
+ 0, /* U+002085: SUBSCRIPT FIVE*/
+ 0, /* U+002086: SUBSCRIPT SIX*/
+ 0, /* U+002087: SUBSCRIPT SEVEN*/
+ 0, /* U+002088: SUBSCRIPT EIGHT*/
+ 0, /* U+002089: SUBSCRIPT NINE*/
+ 0, /* U+00208a: SUBSCRIPT PLUS SIGN*/
+ 0, /* U+00208b: SUBSCRIPT MINUS*/
+ 0, /* U+00208c: SUBSCRIPT EQUALS SIGN*/
+ 0, /* U+00208d: SUBSCRIPT LEFT PARENTHESIS*/
+ 0, /* U+00208e: SUBSCRIPT RIGHT PARENTHESIS*/
+ 0, /* U+00208f: */
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002090: LATIN SUBSCRIPT SMALL LETTER A*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002091: LATIN SUBSCRIPT SMALL LETTER E*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002092: LATIN SUBSCRIPT SMALL LETTER O*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002093: LATIN SUBSCRIPT SMALL LETTER X*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002094: LATIN SUBSCRIPT SMALL LETTER SCHWA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002095: LATIN SUBSCRIPT SMALL LETTER H*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002096: LATIN SUBSCRIPT SMALL LETTER K*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002097: LATIN SUBSCRIPT SMALL LETTER L*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002098: LATIN SUBSCRIPT SMALL LETTER M*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002099: LATIN SUBSCRIPT SMALL LETTER N*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00209a: LATIN SUBSCRIPT SMALL LETTER P*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00209b: LATIN SUBSCRIPT SMALL LETTER S*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00209c: LATIN SUBSCRIPT SMALL LETTER T*/
+ 0, /* U+00209d: */
+ 0, /* U+00209e: */
+ 0, /* U+00209f: */
+ 0, /* U+0020a0: EURO-CURRENCY SIGN*/
+ 0, /* U+0020a1: COLON SIGN*/
+ 0, /* U+0020a2: CRUZEIRO SIGN*/
+ 0, /* U+0020a3: FRENCH FRANC SIGN*/
+ 0, /* U+0020a4: LIRA SIGN*/
+ 0, /* U+0020a5: MILL SIGN*/
+ 0, /* U+0020a6: NAIRA SIGN*/
+ 0, /* U+0020a7: PESETA SIGN*/
+ 0, /* U+0020a8: RUPEE SIGN*/
+ 0, /* U+0020a9: WON SIGN*/
+ 0, /* U+0020aa: NEW SHEQEL SIGN*/
+ 0, /* U+0020ab: DONG SIGN*/
+ 0, /* U+0020ac: EURO SIGN*/
+ 0, /* U+0020ad: KIP SIGN*/
+ 0, /* U+0020ae: TUGRIK SIGN*/
+ 0, /* U+0020af: DRACHMA SIGN*/
+ 0, /* U+0020b0: GERMAN PENNY SIGN*/
+ 0, /* U+0020b1: PESO SIGN*/
+ 0, /* U+0020b2: GUARANI SIGN*/
+ 0, /* U+0020b3: AUSTRAL SIGN*/
+ 0, /* U+0020b4: HRYVNIA SIGN*/
+ 0, /* U+0020b5: CEDI SIGN*/
+ 0, /* U+0020b6: LIVRE TOURNOIS SIGN*/
+ 0, /* U+0020b7: SPESMILO SIGN*/
+ 0, /* U+0020b8: TENGE SIGN*/
+ 0, /* U+0020b9: INDIAN RUPEE SIGN*/
+ 0, /* U+0020ba: TURKISH LIRA SIGN*/
+ 0, /* U+0020bb: */
+ 0, /* U+0020bc: */
+ 0, /* U+0020bd: */
+ 0, /* U+0020be: */
+ 0, /* U+0020bf: */
+ 0, /* U+0020c0: */
+ 0, /* U+0020c1: */
+ 0, /* U+0020c2: */
+ 0, /* U+0020c3: */
+ 0, /* U+0020c4: */
+ 0, /* U+0020c5: */
+ 0, /* U+0020c6: */
+ 0, /* U+0020c7: */
+ 0, /* U+0020c8: */
+ 0, /* U+0020c9: */
+ 0, /* U+0020ca: */
+ 0, /* U+0020cb: */
+ 0, /* U+0020cc: */
+ 0, /* U+0020cd: */
+ 0, /* U+0020ce: */
+ 0, /* U+0020cf: */
+ 0, /* U+0020d0: COMBINING LEFT HARPOON ABOVE*/
+ 0, /* U+0020d1: COMBINING RIGHT HARPOON ABOVE*/
+ 0, /* U+0020d2: COMBINING LONG VERTICAL LINE OVERLAY*/
+ 0, /* U+0020d3: COMBINING SHORT VERTICAL LINE OVERLAY*/
+ 0, /* U+0020d4: COMBINING ANTICLOCKWISE ARROW ABOVE*/
+ 0, /* U+0020d5: COMBINING CLOCKWISE ARROW ABOVE*/
+ 0, /* U+0020d6: COMBINING LEFT ARROW ABOVE*/
+ 0, /* U+0020d7: COMBINING RIGHT ARROW ABOVE*/
+ 0, /* U+0020d8: COMBINING RING OVERLAY*/
+ 0, /* U+0020d9: COMBINING CLOCKWISE RING OVERLAY*/
+ 0, /* U+0020da: COMBINING ANTICLOCKWISE RING OVERLAY*/
+ 0, /* U+0020db: COMBINING THREE DOTS ABOVE*/
+ 0, /* U+0020dc: COMBINING FOUR DOTS ABOVE*/
+ 0, /* U+0020dd: COMBINING ENCLOSING CIRCLE*/
+ 0, /* U+0020de: COMBINING ENCLOSING SQUARE*/
+ 0, /* U+0020df: COMBINING ENCLOSING DIAMOND*/
+ 0, /* U+0020e0: COMBINING ENCLOSING CIRCLE BACKSLASH*/
+ 0, /* U+0020e1: COMBINING LEFT RIGHT ARROW ABOVE*/
+ 0, /* U+0020e2: COMBINING ENCLOSING SCREEN*/
+ 0, /* U+0020e3: COMBINING ENCLOSING KEYCAP*/
+ 0, /* U+0020e4: COMBINING ENCLOSING UPWARD POINTING TRIANGLE*/
+ 0, /* U+0020e5: COMBINING REVERSE SOLIDUS OVERLAY*/
+ 0, /* U+0020e6: COMBINING DOUBLE VERTICAL STROKE OVERLAY*/
+ 0, /* U+0020e7: COMBINING ANNUITY SYMBOL*/
+ 0, /* U+0020e8: COMBINING TRIPLE UNDERDOT*/
+ 0, /* U+0020e9: COMBINING WIDE BRIDGE ABOVE*/
+ 0, /* U+0020ea: COMBINING LEFTWARDS ARROW OVERLAY*/
+ 0, /* U+0020eb: COMBINING LONG DOUBLE SOLIDUS OVERLAY*/
+ 0, /* U+0020ec: COMBINING RIGHTWARDS HARPOON WITH BARB DOWNWARDS*/
+ 0, /* U+0020ed: COMBINING LEFTWARDS HARPOON WITH BARB DOWNWARDS*/
+ 0, /* U+0020ee: COMBINING LEFT ARROW BELOW*/
+ 0, /* U+0020ef: COMBINING RIGHT ARROW BELOW*/
+ 0, /* U+0020f0: COMBINING ASTERISK ABOVE*/
+ 0, /* U+0020f1: */
+ 0, /* U+0020f2: */
+ 0, /* U+0020f3: */
+ 0, /* U+0020f4: */
+ 0, /* U+0020f5: */
+ 0, /* U+0020f6: */
+ 0, /* U+0020f7: */
+ 0, /* U+0020f8: */
+ 0, /* U+0020f9: */
+ 0, /* U+0020fa: */
+ 0, /* U+0020fb: */
+ 0, /* U+0020fc: */
+ 0, /* U+0020fd: */
+ 0, /* U+0020fe: */
+ 0, /* U+0020ff: */
+ 0, /* U+002100: ACCOUNT OF*/
+ 0, /* U+002101: ADDRESSED TO THE SUBJECT*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002102: DOUBLE-STRUCK CAPITAL C*/
+ 0, /* U+002103: DEGREE CELSIUS*/
+ 0, /* U+002104: CENTRE LINE SYMBOL*/
+ 0, /* U+002105: CARE OF*/
+ 0, /* U+002106: CADA UNA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002107: EULER CONSTANT*/
+ 0, /* U+002108: SCRUPLE*/
+ 0, /* U+002109: DEGREE FAHRENHEIT*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00210a: SCRIPT SMALL G*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00210b: SCRIPT CAPITAL H*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00210c: BLACK-LETTER CAPITAL H*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00210d: DOUBLE-STRUCK CAPITAL H*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00210e: PLANCK CONSTANT*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00210f: PLANCK CONSTANT OVER TWO PI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002110: SCRIPT CAPITAL I*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002111: BLACK-LETTER CAPITAL I*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002112: SCRIPT CAPITAL L*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002113: SCRIPT SMALL L*/
+ 0, /* U+002114: L B BAR SYMBOL*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002115: DOUBLE-STRUCK CAPITAL N*/
+ 0, /* U+002116: NUMERO SIGN*/
+ 0, /* U+002117: SOUND RECORDING COPYRIGHT*/
+ 0, /* U+002118: SCRIPT CAPITAL P*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002119: DOUBLE-STRUCK CAPITAL P*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00211a: DOUBLE-STRUCK CAPITAL Q*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00211b: SCRIPT CAPITAL R*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00211c: BLACK-LETTER CAPITAL R*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00211d: DOUBLE-STRUCK CAPITAL R*/
+ 0, /* U+00211e: PRESCRIPTION TAKE*/
+ 0, /* U+00211f: RESPONSE*/
+ 0, /* U+002120: SERVICE MARK*/
+ 0, /* U+002121: TELEPHONE SIGN*/
+ 0, /* U+002122: TRADE MARK SIGN*/
+ 0, /* U+002123: VERSICLE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002124: DOUBLE-STRUCK CAPITAL Z*/
+ 0, /* U+002125: OUNCE SIGN*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002126: OHM SIGN*/
+ 0, /* U+002127: INVERTED OHM SIGN*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002128: BLACK-LETTER CAPITAL Z*/
+ 0, /* U+002129: TURNED GREEK SMALL LETTER IOTA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00212a: KELVIN SIGN*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00212b: ANGSTROM SIGN*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00212c: SCRIPT CAPITAL B*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00212d: BLACK-LETTER CAPITAL C*/
+ 0, /* U+00212e: ESTIMATED SYMBOL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00212f: SCRIPT SMALL E*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002130: SCRIPT CAPITAL E*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002131: SCRIPT CAPITAL F*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002132: TURNED CAPITAL F*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002133: SCRIPT CAPITAL M*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002134: SCRIPT SMALL O*/
+ RTUNI_ALPHA, /* U+002135: ALEF SYMBOL*/
+ RTUNI_ALPHA, /* U+002136: BET SYMBOL*/
+ RTUNI_ALPHA, /* U+002137: GIMEL SYMBOL*/
+ RTUNI_ALPHA, /* U+002138: DALET SYMBOL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002139: INFORMATION SOURCE*/
+ 0, /* U+00213a: ROTATED CAPITAL Q*/
+ 0, /* U+00213b: FACSIMILE SIGN*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00213c: DOUBLE-STRUCK SMALL PI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00213d: DOUBLE-STRUCK SMALL GAMMA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00213e: DOUBLE-STRUCK CAPITAL GAMMA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00213f: DOUBLE-STRUCK CAPITAL PI*/
+ 0, /* U+002140: DOUBLE-STRUCK N-ARY SUMMATION*/
+ 0, /* U+002141: TURNED SANS-SERIF CAPITAL G*/
+ 0, /* U+002142: TURNED SANS-SERIF CAPITAL L*/
+ 0, /* U+002143: REVERSED SANS-SERIF CAPITAL L*/
+ 0, /* U+002144: TURNED SANS-SERIF CAPITAL Y*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002145: DOUBLE-STRUCK ITALIC CAPITAL D*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002146: DOUBLE-STRUCK ITALIC SMALL D*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002147: DOUBLE-STRUCK ITALIC SMALL E*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002148: DOUBLE-STRUCK ITALIC SMALL I*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002149: DOUBLE-STRUCK ITALIC SMALL J*/
+ 0, /* U+00214a: PROPERTY LINE*/
+ 0, /* U+00214b: TURNED AMPERSAND*/
+ 0, /* U+00214c: PER SIGN*/
+ 0, /* U+00214d: AKTIESELSKAB*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00214e: TURNED SMALL F*/
+ 0, /* U+00214f: SYMBOL FOR SAMARITAN SOURCE*/
+ 0, /* U+002150: VULGAR FRACTION ONE SEVENTH*/
+ 0, /* U+002151: VULGAR FRACTION ONE NINTH*/
+ 0, /* U+002152: VULGAR FRACTION ONE TENTH*/
+ 0, /* U+002153: VULGAR FRACTION ONE THIRD*/
+ 0, /* U+002154: VULGAR FRACTION TWO THIRDS*/
+ 0, /* U+002155: VULGAR FRACTION ONE FIFTH*/
+ 0, /* U+002156: VULGAR FRACTION TWO FIFTHS*/
+ 0, /* U+002157: VULGAR FRACTION THREE FIFTHS*/
+ 0, /* U+002158: VULGAR FRACTION FOUR FIFTHS*/
+ 0, /* U+002159: VULGAR FRACTION ONE SIXTH*/
+ 0, /* U+00215a: VULGAR FRACTION FIVE SIXTHS*/
+ 0, /* U+00215b: VULGAR FRACTION ONE EIGHTH*/
+ 0, /* U+00215c: VULGAR FRACTION THREE EIGHTHS*/
+ 0, /* U+00215d: VULGAR FRACTION FIVE EIGHTHS*/
+ 0, /* U+00215e: VULGAR FRACTION SEVEN EIGHTHS*/
+ 0, /* U+00215f: FRACTION NUMERATOR ONE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002160: ROMAN NUMERAL ONE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002161: ROMAN NUMERAL TWO*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002162: ROMAN NUMERAL THREE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002163: ROMAN NUMERAL FOUR*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002164: ROMAN NUMERAL FIVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002165: ROMAN NUMERAL SIX*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002166: ROMAN NUMERAL SEVEN*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002167: ROMAN NUMERAL EIGHT*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002168: ROMAN NUMERAL NINE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002169: ROMAN NUMERAL TEN*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00216a: ROMAN NUMERAL ELEVEN*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00216b: ROMAN NUMERAL TWELVE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00216c: ROMAN NUMERAL FIFTY*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00216d: ROMAN NUMERAL ONE HUNDRED*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00216e: ROMAN NUMERAL FIVE HUNDRED*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00216f: ROMAN NUMERAL ONE THOUSAND*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002170: SMALL ROMAN NUMERAL ONE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002171: SMALL ROMAN NUMERAL TWO*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002172: SMALL ROMAN NUMERAL THREE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002173: SMALL ROMAN NUMERAL FOUR*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002174: SMALL ROMAN NUMERAL FIVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002175: SMALL ROMAN NUMERAL SIX*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002176: SMALL ROMAN NUMERAL SEVEN*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002177: SMALL ROMAN NUMERAL EIGHT*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002178: SMALL ROMAN NUMERAL NINE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002179: SMALL ROMAN NUMERAL TEN*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00217a: SMALL ROMAN NUMERAL ELEVEN*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00217b: SMALL ROMAN NUMERAL TWELVE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00217c: SMALL ROMAN NUMERAL FIFTY*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00217d: SMALL ROMAN NUMERAL ONE HUNDRED*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00217e: SMALL ROMAN NUMERAL FIVE HUNDRED*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00217f: SMALL ROMAN NUMERAL ONE THOUSAND*/
+ RTUNI_ALPHA, /* U+002180: ROMAN NUMERAL ONE THOUSAND C D*/
+ RTUNI_ALPHA, /* U+002181: ROMAN NUMERAL FIVE THOUSAND*/
+ RTUNI_ALPHA, /* U+002182: ROMAN NUMERAL TEN THOUSAND*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002183: ROMAN NUMERAL REVERSED ONE HUNDRED*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002184: LATIN SMALL LETTER REVERSED C*/
+ RTUNI_ALPHA, /* U+002185: ROMAN NUMERAL SIX LATE FORM*/
+ RTUNI_ALPHA, /* U+002186: ROMAN NUMERAL FIFTY EARLY FORM*/
+ RTUNI_ALPHA, /* U+002187: ROMAN NUMERAL FIFTY THOUSAND*/
+ RTUNI_ALPHA, /* U+002188: ROMAN NUMERAL ONE HUNDRED THOUSAND*/
+ 0, /* U+002189: VULGAR FRACTION ZERO THIRDS*/
+ 0, /* U+00218a: */
+ 0, /* U+00218b: */
+ 0, /* U+00218c: */
+ 0, /* U+00218d: */
+ 0, /* U+00218e: */
+ 0, /* U+00218f: */
+ 0, /* U+002190: LEFTWARDS ARROW*/
+ 0, /* U+002191: UPWARDS ARROW*/
+ 0, /* U+002192: RIGHTWARDS ARROW*/
+ 0, /* U+002193: DOWNWARDS ARROW*/
+ 0, /* U+002194: LEFT RIGHT ARROW*/
+ 0, /* U+002195: UP DOWN ARROW*/
+ 0, /* U+002196: NORTH WEST ARROW*/
+ 0, /* U+002197: NORTH EAST ARROW*/
+ 0, /* U+002198: SOUTH EAST ARROW*/
+ 0, /* U+002199: SOUTH WEST ARROW*/
+ 0, /* U+00219a: LEFTWARDS ARROW WITH STROKE*/
+ 0, /* U+00219b: RIGHTWARDS ARROW WITH STROKE*/
+ 0, /* U+00219c: LEFTWARDS WAVE ARROW*/
+ 0, /* U+00219d: RIGHTWARDS WAVE ARROW*/
+ 0, /* U+00219e: LEFTWARDS TWO HEADED ARROW*/
+ 0, /* U+00219f: UPWARDS TWO HEADED ARROW*/
+ 0, /* U+0021a0: RIGHTWARDS TWO HEADED ARROW*/
+ 0, /* U+0021a1: DOWNWARDS TWO HEADED ARROW*/
+ 0, /* U+0021a2: LEFTWARDS ARROW WITH TAIL*/
+ 0, /* U+0021a3: RIGHTWARDS ARROW WITH TAIL*/
+ 0, /* U+0021a4: LEFTWARDS ARROW FROM BAR*/
+ 0, /* U+0021a5: UPWARDS ARROW FROM BAR*/
+ 0, /* U+0021a6: RIGHTWARDS ARROW FROM BAR*/
+ 0, /* U+0021a7: DOWNWARDS ARROW FROM BAR*/
+ 0, /* U+0021a8: UP DOWN ARROW WITH BASE*/
+ 0, /* U+0021a9: LEFTWARDS ARROW WITH HOOK*/
+ 0, /* U+0021aa: RIGHTWARDS ARROW WITH HOOK*/
+ 0, /* U+0021ab: LEFTWARDS ARROW WITH LOOP*/
+ 0, /* U+0021ac: RIGHTWARDS ARROW WITH LOOP*/
+ 0, /* U+0021ad: LEFT RIGHT WAVE ARROW*/
+ 0, /* U+0021ae: LEFT RIGHT ARROW WITH STROKE*/
+ 0, /* U+0021af: DOWNWARDS ZIGZAG ARROW*/
+ 0, /* U+0021b0: UPWARDS ARROW WITH TIP LEFTWARDS*/
+ 0, /* U+0021b1: UPWARDS ARROW WITH TIP RIGHTWARDS*/
+ 0, /* U+0021b2: DOWNWARDS ARROW WITH TIP LEFTWARDS*/
+ 0, /* U+0021b3: DOWNWARDS ARROW WITH TIP RIGHTWARDS*/
+ 0, /* U+0021b4: RIGHTWARDS ARROW WITH CORNER DOWNWARDS*/
+ 0, /* U+0021b5: DOWNWARDS ARROW WITH CORNER LEFTWARDS*/
+ 0, /* U+0021b6: ANTICLOCKWISE TOP SEMICIRCLE ARROW*/
+ 0, /* U+0021b7: CLOCKWISE TOP SEMICIRCLE ARROW*/
+ 0, /* U+0021b8: NORTH WEST ARROW TO LONG BAR*/
+ 0, /* U+0021b9: LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR*/
+ 0, /* U+0021ba: ANTICLOCKWISE OPEN CIRCLE ARROW*/
+ 0, /* U+0021bb: CLOCKWISE OPEN CIRCLE ARROW*/
+ 0, /* U+0021bc: LEFTWARDS HARPOON WITH BARB UPWARDS*/
+ 0, /* U+0021bd: LEFTWARDS HARPOON WITH BARB DOWNWARDS*/
+ 0, /* U+0021be: UPWARDS HARPOON WITH BARB RIGHTWARDS*/
+ 0, /* U+0021bf: UPWARDS HARPOON WITH BARB LEFTWARDS*/
+ 0, /* U+0021c0: RIGHTWARDS HARPOON WITH BARB UPWARDS*/
+ 0, /* U+0021c1: RIGHTWARDS HARPOON WITH BARB DOWNWARDS*/
+ 0, /* U+0021c2: DOWNWARDS HARPOON WITH BARB RIGHTWARDS*/
+ 0, /* U+0021c3: DOWNWARDS HARPOON WITH BARB LEFTWARDS*/
+ 0, /* U+0021c4: RIGHTWARDS ARROW OVER LEFTWARDS ARROW*/
+ 0, /* U+0021c5: UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW*/
+ 0, /* U+0021c6: LEFTWARDS ARROW OVER RIGHTWARDS ARROW*/
+ 0, /* U+0021c7: LEFTWARDS PAIRED ARROWS*/
+ 0, /* U+0021c8: UPWARDS PAIRED ARROWS*/
+ 0, /* U+0021c9: RIGHTWARDS PAIRED ARROWS*/
+ 0, /* U+0021ca: DOWNWARDS PAIRED ARROWS*/
+ 0, /* U+0021cb: LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON*/
+ 0, /* U+0021cc: RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON*/
+ 0, /* U+0021cd: LEFTWARDS DOUBLE ARROW WITH STROKE*/
+ 0, /* U+0021ce: LEFT RIGHT DOUBLE ARROW WITH STROKE*/
+ 0, /* U+0021cf: RIGHTWARDS DOUBLE ARROW WITH STROKE*/
+ 0, /* U+0021d0: LEFTWARDS DOUBLE ARROW*/
+ 0, /* U+0021d1: UPWARDS DOUBLE ARROW*/
+ 0, /* U+0021d2: RIGHTWARDS DOUBLE ARROW*/
+ 0, /* U+0021d3: DOWNWARDS DOUBLE ARROW*/
+ 0, /* U+0021d4: LEFT RIGHT DOUBLE ARROW*/
+ 0, /* U+0021d5: UP DOWN DOUBLE ARROW*/
+ 0, /* U+0021d6: NORTH WEST DOUBLE ARROW*/
+ 0, /* U+0021d7: NORTH EAST DOUBLE ARROW*/
+ 0, /* U+0021d8: SOUTH EAST DOUBLE ARROW*/
+ 0, /* U+0021d9: SOUTH WEST DOUBLE ARROW*/
+ 0, /* U+0021da: LEFTWARDS TRIPLE ARROW*/
+ 0, /* U+0021db: RIGHTWARDS TRIPLE ARROW*/
+ 0, /* U+0021dc: LEFTWARDS SQUIGGLE ARROW*/
+ 0, /* U+0021dd: RIGHTWARDS SQUIGGLE ARROW*/
+ 0, /* U+0021de: UPWARDS ARROW WITH DOUBLE STROKE*/
+ 0, /* U+0021df: DOWNWARDS ARROW WITH DOUBLE STROKE*/
+ 0, /* U+0021e0: LEFTWARDS DASHED ARROW*/
+ 0, /* U+0021e1: UPWARDS DASHED ARROW*/
+ 0, /* U+0021e2: RIGHTWARDS DASHED ARROW*/
+ 0, /* U+0021e3: DOWNWARDS DASHED ARROW*/
+ 0, /* U+0021e4: LEFTWARDS ARROW TO BAR*/
+ 0, /* U+0021e5: RIGHTWARDS ARROW TO BAR*/
+ 0, /* U+0021e6: LEFTWARDS WHITE ARROW*/
+ 0, /* U+0021e7: UPWARDS WHITE ARROW*/
+ 0, /* U+0021e8: RIGHTWARDS WHITE ARROW*/
+ 0, /* U+0021e9: DOWNWARDS WHITE ARROW*/
+ 0, /* U+0021ea: UPWARDS WHITE ARROW FROM BAR*/
+ 0, /* U+0021eb: UPWARDS WHITE ARROW ON PEDESTAL*/
+ 0, /* U+0021ec: UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR*/
+ 0, /* U+0021ed: UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR*/
+ 0, /* U+0021ee: UPWARDS WHITE DOUBLE ARROW*/
+ 0, /* U+0021ef: UPWARDS WHITE DOUBLE ARROW ON PEDESTAL*/
+ 0, /* U+0021f0: RIGHTWARDS WHITE ARROW FROM WALL*/
+ 0, /* U+0021f1: NORTH WEST ARROW TO CORNER*/
+ 0, /* U+0021f2: SOUTH EAST ARROW TO CORNER*/
+ 0, /* U+0021f3: UP DOWN WHITE ARROW*/
+ 0, /* U+0021f4: RIGHT ARROW WITH SMALL CIRCLE*/
+ 0, /* U+0021f5: DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW*/
+ 0, /* U+0021f6: THREE RIGHTWARDS ARROWS*/
+ 0, /* U+0021f7: LEFTWARDS ARROW WITH VERTICAL STROKE*/
+ 0, /* U+0021f8: RIGHTWARDS ARROW WITH VERTICAL STROKE*/
+ 0, /* U+0021f9: LEFT RIGHT ARROW WITH VERTICAL STROKE*/
+ 0, /* U+0021fa: LEFTWARDS ARROW WITH DOUBLE VERTICAL STROKE*/
+ 0, /* U+0021fb: RIGHTWARDS ARROW WITH DOUBLE VERTICAL STROKE*/
+ 0, /* U+0021fc: LEFT RIGHT ARROW WITH DOUBLE VERTICAL STROKE*/
+ 0, /* U+0021fd: LEFTWARDS OPEN-HEADED ARROW*/
+ 0, /* U+0021fe: RIGHTWARDS OPEN-HEADED ARROW*/
+ 0, /* U+0021ff: LEFT RIGHT OPEN-HEADED ARROW*/
+ 0, /* U+002200: FOR ALL*/
+ 0, /* U+002201: COMPLEMENT*/
+ 0, /* U+002202: PARTIAL DIFFERENTIAL*/
+ 0, /* U+002203: THERE EXISTS*/
+ 0, /* U+002204: THERE DOES NOT EXIST*/
+ 0, /* U+002205: EMPTY SET*/
+ 0, /* U+002206: INCREMENT*/
+ 0, /* U+002207: NABLA*/
+ 0, /* U+002208: ELEMENT OF*/
+ 0, /* U+002209: NOT AN ELEMENT OF*/
+ 0, /* U+00220a: SMALL ELEMENT OF*/
+ 0, /* U+00220b: CONTAINS AS MEMBER*/
+ 0, /* U+00220c: DOES NOT CONTAIN AS MEMBER*/
+ 0, /* U+00220d: SMALL CONTAINS AS MEMBER*/
+ 0, /* U+00220e: END OF PROOF*/
+ 0, /* U+00220f: N-ARY PRODUCT*/
+ 0, /* U+002210: N-ARY COPRODUCT*/
+ 0, /* U+002211: N-ARY SUMMATION*/
+ 0, /* U+002212: MINUS SIGN*/
+ 0, /* U+002213: MINUS-OR-PLUS SIGN*/
+ 0, /* U+002214: DOT PLUS*/
+ 0, /* U+002215: DIVISION SLASH*/
+ 0, /* U+002216: SET MINUS*/
+ 0, /* U+002217: ASTERISK OPERATOR*/
+ 0, /* U+002218: RING OPERATOR*/
+ 0, /* U+002219: BULLET OPERATOR*/
+ 0, /* U+00221a: SQUARE ROOT*/
+ 0, /* U+00221b: CUBE ROOT*/
+ 0, /* U+00221c: FOURTH ROOT*/
+ 0, /* U+00221d: PROPORTIONAL TO*/
+ 0, /* U+00221e: INFINITY*/
+ 0, /* U+00221f: RIGHT ANGLE*/
+ 0, /* U+002220: ANGLE*/
+ 0, /* U+002221: MEASURED ANGLE*/
+ 0, /* U+002222: SPHERICAL ANGLE*/
+ 0, /* U+002223: DIVIDES*/
+ 0, /* U+002224: DOES NOT DIVIDE*/
+ 0, /* U+002225: PARALLEL TO*/
+ 0, /* U+002226: NOT PARALLEL TO*/
+ 0, /* U+002227: LOGICAL AND*/
+ 0, /* U+002228: LOGICAL OR*/
+ 0, /* U+002229: INTERSECTION*/
+ 0, /* U+00222a: UNION*/
+ 0, /* U+00222b: INTEGRAL*/
+ 0, /* U+00222c: DOUBLE INTEGRAL*/
+ 0, /* U+00222d: TRIPLE INTEGRAL*/
+ 0, /* U+00222e: CONTOUR INTEGRAL*/
+ 0, /* U+00222f: SURFACE INTEGRAL*/
+ 0, /* U+002230: VOLUME INTEGRAL*/
+ 0, /* U+002231: CLOCKWISE INTEGRAL*/
+ 0, /* U+002232: CLOCKWISE CONTOUR INTEGRAL*/
+ 0, /* U+002233: ANTICLOCKWISE CONTOUR INTEGRAL*/
+ 0, /* U+002234: THEREFORE*/
+ 0, /* U+002235: BECAUSE*/
+ 0, /* U+002236: RATIO*/
+ 0, /* U+002237: PROPORTION*/
+ 0, /* U+002238: DOT MINUS*/
+ 0, /* U+002239: EXCESS*/
+ 0, /* U+00223a: GEOMETRIC PROPORTION*/
+ 0, /* U+00223b: HOMOTHETIC*/
+ 0, /* U+00223c: TILDE OPERATOR*/
+ 0, /* U+00223d: REVERSED TILDE*/
+ 0, /* U+00223e: INVERTED LAZY S*/
+ 0, /* U+00223f: SINE WAVE*/
+ 0, /* U+002240: WREATH PRODUCT*/
+ 0, /* U+002241: NOT TILDE*/
+ 0, /* U+002242: MINUS TILDE*/
+ 0, /* U+002243: ASYMPTOTICALLY EQUAL TO*/
+ 0, /* U+002244: NOT ASYMPTOTICALLY EQUAL TO*/
+ 0, /* U+002245: APPROXIMATELY EQUAL TO*/
+ 0, /* U+002246: APPROXIMATELY BUT NOT ACTUALLY EQUAL TO*/
+ 0, /* U+002247: NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO*/
+ 0, /* U+002248: ALMOST EQUAL TO*/
+ 0, /* U+002249: NOT ALMOST EQUAL TO*/
+ 0, /* U+00224a: ALMOST EQUAL OR EQUAL TO*/
+ 0, /* U+00224b: TRIPLE TILDE*/
+ 0, /* U+00224c: ALL EQUAL TO*/
+ 0, /* U+00224d: EQUIVALENT TO*/
+ 0, /* U+00224e: GEOMETRICALLY EQUIVALENT TO*/
+ 0, /* U+00224f: DIFFERENCE BETWEEN*/
+ 0, /* U+002250: APPROACHES THE LIMIT*/
+ 0, /* U+002251: GEOMETRICALLY EQUAL TO*/
+ 0, /* U+002252: APPROXIMATELY EQUAL TO OR THE IMAGE OF*/
+ 0, /* U+002253: IMAGE OF OR APPROXIMATELY EQUAL TO*/
+ 0, /* U+002254: COLON EQUALS*/
+ 0, /* U+002255: EQUALS COLON*/
+ 0, /* U+002256: RING IN EQUAL TO*/
+ 0, /* U+002257: RING EQUAL TO*/
+ 0, /* U+002258: CORRESPONDS TO*/
+ 0, /* U+002259: ESTIMATES*/
+ 0, /* U+00225a: EQUIANGULAR TO*/
+ 0, /* U+00225b: STAR EQUALS*/
+ 0, /* U+00225c: DELTA EQUAL TO*/
+ 0, /* U+00225d: EQUAL TO BY DEFINITION*/
+ 0, /* U+00225e: MEASURED BY*/
+ 0, /* U+00225f: QUESTIONED EQUAL TO*/
+ 0, /* U+002260: NOT EQUAL TO*/
+ 0, /* U+002261: IDENTICAL TO*/
+ 0, /* U+002262: NOT IDENTICAL TO*/
+ 0, /* U+002263: STRICTLY EQUIVALENT TO*/
+ 0, /* U+002264: LESS-THAN OR EQUAL TO*/
+ 0, /* U+002265: GREATER-THAN OR EQUAL TO*/
+ 0, /* U+002266: LESS-THAN OVER EQUAL TO*/
+ 0, /* U+002267: GREATER-THAN OVER EQUAL TO*/
+ 0, /* U+002268: LESS-THAN BUT NOT EQUAL TO*/
+ 0, /* U+002269: GREATER-THAN BUT NOT EQUAL TO*/
+ 0, /* U+00226a: MUCH LESS-THAN*/
+ 0, /* U+00226b: MUCH GREATER-THAN*/
+ 0, /* U+00226c: BETWEEN*/
+ 0, /* U+00226d: NOT EQUIVALENT TO*/
+ 0, /* U+00226e: NOT LESS-THAN*/
+ 0, /* U+00226f: NOT GREATER-THAN*/
+ 0, /* U+002270: NEITHER LESS-THAN NOR EQUAL TO*/
+ 0, /* U+002271: NEITHER GREATER-THAN NOR EQUAL TO*/
+ 0, /* U+002272: LESS-THAN OR EQUIVALENT TO*/
+ 0, /* U+002273: GREATER-THAN OR EQUIVALENT TO*/
+ 0, /* U+002274: NEITHER LESS-THAN NOR EQUIVALENT TO*/
+ 0, /* U+002275: NEITHER GREATER-THAN NOR EQUIVALENT TO*/
+ 0, /* U+002276: LESS-THAN OR GREATER-THAN*/
+ 0, /* U+002277: GREATER-THAN OR LESS-THAN*/
+ 0, /* U+002278: NEITHER LESS-THAN NOR GREATER-THAN*/
+ 0, /* U+002279: NEITHER GREATER-THAN NOR LESS-THAN*/
+ 0, /* U+00227a: PRECEDES*/
+ 0, /* U+00227b: SUCCEEDS*/
+ 0, /* U+00227c: PRECEDES OR EQUAL TO*/
+ 0, /* U+00227d: SUCCEEDS OR EQUAL TO*/
+ 0, /* U+00227e: PRECEDES OR EQUIVALENT TO*/
+ 0, /* U+00227f: SUCCEEDS OR EQUIVALENT TO*/
+ 0, /* U+002280: DOES NOT PRECEDE*/
+ 0, /* U+002281: DOES NOT SUCCEED*/
+ 0, /* U+002282: SUBSET OF*/
+ 0, /* U+002283: SUPERSET OF*/
+ 0, /* U+002284: NOT A SUBSET OF*/
+ 0, /* U+002285: NOT A SUPERSET OF*/
+ 0, /* U+002286: SUBSET OF OR EQUAL TO*/
+ 0, /* U+002287: SUPERSET OF OR EQUAL TO*/
+ 0, /* U+002288: NEITHER A SUBSET OF NOR EQUAL TO*/
+ 0, /* U+002289: NEITHER A SUPERSET OF NOR EQUAL TO*/
+ 0, /* U+00228a: SUBSET OF WITH NOT EQUAL TO*/
+ 0, /* U+00228b: SUPERSET OF WITH NOT EQUAL TO*/
+ 0, /* U+00228c: MULTISET*/
+ 0, /* U+00228d: MULTISET MULTIPLICATION*/
+ 0, /* U+00228e: MULTISET UNION*/
+ 0, /* U+00228f: SQUARE IMAGE OF*/
+ 0, /* U+002290: SQUARE ORIGINAL OF*/
+ 0, /* U+002291: SQUARE IMAGE OF OR EQUAL TO*/
+ 0, /* U+002292: SQUARE ORIGINAL OF OR EQUAL TO*/
+ 0, /* U+002293: SQUARE CAP*/
+ 0, /* U+002294: SQUARE CUP*/
+ 0, /* U+002295: CIRCLED PLUS*/
+ 0, /* U+002296: CIRCLED MINUS*/
+ 0, /* U+002297: CIRCLED TIMES*/
+ 0, /* U+002298: CIRCLED DIVISION SLASH*/
+ 0, /* U+002299: CIRCLED DOT OPERATOR*/
+ 0, /* U+00229a: CIRCLED RING OPERATOR*/
+ 0, /* U+00229b: CIRCLED ASTERISK OPERATOR*/
+ 0, /* U+00229c: CIRCLED EQUALS*/
+ 0, /* U+00229d: CIRCLED DASH*/
+ 0, /* U+00229e: SQUARED PLUS*/
+ 0, /* U+00229f: SQUARED MINUS*/
+ 0, /* U+0022a0: SQUARED TIMES*/
+ 0, /* U+0022a1: SQUARED DOT OPERATOR*/
+ 0, /* U+0022a2: RIGHT TACK*/
+ 0, /* U+0022a3: LEFT TACK*/
+ 0, /* U+0022a4: DOWN TACK*/
+ 0, /* U+0022a5: UP TACK*/
+ 0, /* U+0022a6: ASSERTION*/
+ 0, /* U+0022a7: MODELS*/
+ 0, /* U+0022a8: TRUE*/
+ 0, /* U+0022a9: FORCES*/
+ 0, /* U+0022aa: TRIPLE VERTICAL BAR RIGHT TURNSTILE*/
+ 0, /* U+0022ab: DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE*/
+ 0, /* U+0022ac: DOES NOT PROVE*/
+ 0, /* U+0022ad: NOT TRUE*/
+ 0, /* U+0022ae: DOES NOT FORCE*/
+ 0, /* U+0022af: NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE*/
+ 0, /* U+0022b0: PRECEDES UNDER RELATION*/
+ 0, /* U+0022b1: SUCCEEDS UNDER RELATION*/
+ 0, /* U+0022b2: NORMAL SUBGROUP OF*/
+ 0, /* U+0022b3: CONTAINS AS NORMAL SUBGROUP*/
+ 0, /* U+0022b4: NORMAL SUBGROUP OF OR EQUAL TO*/
+ 0, /* U+0022b5: CONTAINS AS NORMAL SUBGROUP OR EQUAL TO*/
+ 0, /* U+0022b6: ORIGINAL OF*/
+ 0, /* U+0022b7: IMAGE OF*/
+ 0, /* U+0022b8: MULTIMAP*/
+ 0, /* U+0022b9: HERMITIAN CONJUGATE MATRIX*/
+ 0, /* U+0022ba: INTERCALATE*/
+ 0, /* U+0022bb: XOR*/
+ 0, /* U+0022bc: NAND*/
+ 0, /* U+0022bd: NOR*/
+ 0, /* U+0022be: RIGHT ANGLE WITH ARC*/
+ 0, /* U+0022bf: RIGHT TRIANGLE*/
+ 0, /* U+0022c0: N-ARY LOGICAL AND*/
+ 0, /* U+0022c1: N-ARY LOGICAL OR*/
+ 0, /* U+0022c2: N-ARY INTERSECTION*/
+ 0, /* U+0022c3: N-ARY UNION*/
+ 0, /* U+0022c4: DIAMOND OPERATOR*/
+ 0, /* U+0022c5: DOT OPERATOR*/
+ 0, /* U+0022c6: STAR OPERATOR*/
+ 0, /* U+0022c7: DIVISION TIMES*/
+ 0, /* U+0022c8: BOWTIE*/
+ 0, /* U+0022c9: LEFT NORMAL FACTOR SEMIDIRECT PRODUCT*/
+ 0, /* U+0022ca: RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT*/
+ 0, /* U+0022cb: LEFT SEMIDIRECT PRODUCT*/
+ 0, /* U+0022cc: RIGHT SEMIDIRECT PRODUCT*/
+ 0, /* U+0022cd: REVERSED TILDE EQUALS*/
+ 0, /* U+0022ce: CURLY LOGICAL OR*/
+ 0, /* U+0022cf: CURLY LOGICAL AND*/
+ 0, /* U+0022d0: DOUBLE SUBSET*/
+ 0, /* U+0022d1: DOUBLE SUPERSET*/
+ 0, /* U+0022d2: DOUBLE INTERSECTION*/
+ 0, /* U+0022d3: DOUBLE UNION*/
+ 0, /* U+0022d4: PITCHFORK*/
+ 0, /* U+0022d5: EQUAL AND PARALLEL TO*/
+ 0, /* U+0022d6: LESS-THAN WITH DOT*/
+ 0, /* U+0022d7: GREATER-THAN WITH DOT*/
+ 0, /* U+0022d8: VERY MUCH LESS-THAN*/
+ 0, /* U+0022d9: VERY MUCH GREATER-THAN*/
+ 0, /* U+0022da: LESS-THAN EQUAL TO OR GREATER-THAN*/
+ 0, /* U+0022db: GREATER-THAN EQUAL TO OR LESS-THAN*/
+ 0, /* U+0022dc: EQUAL TO OR LESS-THAN*/
+ 0, /* U+0022dd: EQUAL TO OR GREATER-THAN*/
+ 0, /* U+0022de: EQUAL TO OR PRECEDES*/
+ 0, /* U+0022df: EQUAL TO OR SUCCEEDS*/
+ 0, /* U+0022e0: DOES NOT PRECEDE OR EQUAL*/
+ 0, /* U+0022e1: DOES NOT SUCCEED OR EQUAL*/
+ 0, /* U+0022e2: NOT SQUARE IMAGE OF OR EQUAL TO*/
+ 0, /* U+0022e3: NOT SQUARE ORIGINAL OF OR EQUAL TO*/
+ 0, /* U+0022e4: SQUARE IMAGE OF OR NOT EQUAL TO*/
+ 0, /* U+0022e5: SQUARE ORIGINAL OF OR NOT EQUAL TO*/
+ 0, /* U+0022e6: LESS-THAN BUT NOT EQUIVALENT TO*/
+ 0, /* U+0022e7: GREATER-THAN BUT NOT EQUIVALENT TO*/
+ 0, /* U+0022e8: PRECEDES BUT NOT EQUIVALENT TO*/
+ 0, /* U+0022e9: SUCCEEDS BUT NOT EQUIVALENT TO*/
+ 0, /* U+0022ea: NOT NORMAL SUBGROUP OF*/
+ 0, /* U+0022eb: DOES NOT CONTAIN AS NORMAL SUBGROUP*/
+ 0, /* U+0022ec: NOT NORMAL SUBGROUP OF OR EQUAL TO*/
+ 0, /* U+0022ed: DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL*/
+ 0, /* U+0022ee: VERTICAL ELLIPSIS*/
+ 0, /* U+0022ef: MIDLINE HORIZONTAL ELLIPSIS*/
+ 0, /* U+0022f0: UP RIGHT DIAGONAL ELLIPSIS*/
+ 0, /* U+0022f1: DOWN RIGHT DIAGONAL ELLIPSIS*/
+ 0, /* U+0022f2: ELEMENT OF WITH LONG HORIZONTAL STROKE*/
+ 0, /* U+0022f3: ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE*/
+ 0, /* U+0022f4: SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE*/
+ 0, /* U+0022f5: ELEMENT OF WITH DOT ABOVE*/
+ 0, /* U+0022f6: ELEMENT OF WITH OVERBAR*/
+ 0, /* U+0022f7: SMALL ELEMENT OF WITH OVERBAR*/
+ 0, /* U+0022f8: ELEMENT OF WITH UNDERBAR*/
+ 0, /* U+0022f9: ELEMENT OF WITH TWO HORIZONTAL STROKES*/
+ 0, /* U+0022fa: CONTAINS WITH LONG HORIZONTAL STROKE*/
+ 0, /* U+0022fb: CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE*/
+ 0, /* U+0022fc: SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE*/
+ 0, /* U+0022fd: CONTAINS WITH OVERBAR*/
+ 0, /* U+0022fe: SMALL CONTAINS WITH OVERBAR*/
+ 0, /* U+0022ff: Z NOTATION BAG MEMBERSHIP*/
+ 0, /* U+002300: DIAMETER SIGN*/
+ 0, /* U+002301: ELECTRIC ARROW*/
+ 0, /* U+002302: HOUSE*/
+ 0, /* U+002303: UP ARROWHEAD*/
+ 0, /* U+002304: DOWN ARROWHEAD*/
+ 0, /* U+002305: PROJECTIVE*/
+ 0, /* U+002306: PERSPECTIVE*/
+ 0, /* U+002307: WAVY LINE*/
+ 0, /* U+002308: LEFT CEILING*/
+ 0, /* U+002309: RIGHT CEILING*/
+ 0, /* U+00230a: LEFT FLOOR*/
+ 0, /* U+00230b: RIGHT FLOOR*/
+ 0, /* U+00230c: BOTTOM RIGHT CROP*/
+ 0, /* U+00230d: BOTTOM LEFT CROP*/
+ 0, /* U+00230e: TOP RIGHT CROP*/
+ 0, /* U+00230f: TOP LEFT CROP*/
+ 0, /* U+002310: REVERSED NOT SIGN*/
+ 0, /* U+002311: SQUARE LOZENGE*/
+ 0, /* U+002312: ARC*/
+ 0, /* U+002313: SEGMENT*/
+ 0, /* U+002314: SECTOR*/
+ 0, /* U+002315: TELEPHONE RECORDER*/
+ 0, /* U+002316: POSITION INDICATOR*/
+ 0, /* U+002317: VIEWDATA SQUARE*/
+ 0, /* U+002318: PLACE OF INTEREST SIGN*/
+ 0, /* U+002319: TURNED NOT SIGN*/
+ 0, /* U+00231a: WATCH*/
+ 0, /* U+00231b: HOURGLASS*/
+ 0, /* U+00231c: TOP LEFT CORNER*/
+ 0, /* U+00231d: TOP RIGHT CORNER*/
+ 0, /* U+00231e: BOTTOM LEFT CORNER*/
+ 0, /* U+00231f: BOTTOM RIGHT CORNER*/
+ 0, /* U+002320: TOP HALF INTEGRAL*/
+ 0, /* U+002321: BOTTOM HALF INTEGRAL*/
+ 0, /* U+002322: FROWN*/
+ 0, /* U+002323: SMILE*/
+ 0, /* U+002324: UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS*/
+ 0, /* U+002325: OPTION KEY*/
+ 0, /* U+002326: ERASE TO THE RIGHT*/
+ 0, /* U+002327: X IN A RECTANGLE BOX*/
+ 0, /* U+002328: KEYBOARD*/
+ 0, /* U+002329: LEFT-POINTING ANGLE BRACKET*/
+ 0, /* U+00232a: RIGHT-POINTING ANGLE BRACKET*/
+ 0, /* U+00232b: ERASE TO THE LEFT*/
+ 0, /* U+00232c: BENZENE RING*/
+ 0, /* U+00232d: CYLINDRICITY*/
+ 0, /* U+00232e: ALL AROUND-PROFILE*/
+ 0, /* U+00232f: SYMMETRY*/
+ 0, /* U+002330: TOTAL RUNOUT*/
+ 0, /* U+002331: DIMENSION ORIGIN*/
+ 0, /* U+002332: CONICAL TAPER*/
+ 0, /* U+002333: SLOPE*/
+ 0, /* U+002334: COUNTERBORE*/
+ 0, /* U+002335: COUNTERSINK*/
+ 0, /* U+002336: APL FUNCTIONAL SYMBOL I-BEAM*/
+ 0, /* U+002337: APL FUNCTIONAL SYMBOL SQUISH QUAD*/
+ 0, /* U+002338: APL FUNCTIONAL SYMBOL QUAD EQUAL*/
+ 0, /* U+002339: APL FUNCTIONAL SYMBOL QUAD DIVIDE*/
+ 0, /* U+00233a: APL FUNCTIONAL SYMBOL QUAD DIAMOND*/
+ 0, /* U+00233b: APL FUNCTIONAL SYMBOL QUAD JOT*/
+ 0, /* U+00233c: APL FUNCTIONAL SYMBOL QUAD CIRCLE*/
+ 0, /* U+00233d: APL FUNCTIONAL SYMBOL CIRCLE STILE*/
+ 0, /* U+00233e: APL FUNCTIONAL SYMBOL CIRCLE JOT*/
+ 0, /* U+00233f: APL FUNCTIONAL SYMBOL SLASH BAR*/
+ 0, /* U+002340: APL FUNCTIONAL SYMBOL BACKSLASH BAR*/
+ 0, /* U+002341: APL FUNCTIONAL SYMBOL QUAD SLASH*/
+ 0, /* U+002342: APL FUNCTIONAL SYMBOL QUAD BACKSLASH*/
+ 0, /* U+002343: APL FUNCTIONAL SYMBOL QUAD LESS-THAN*/
+ 0, /* U+002344: APL FUNCTIONAL SYMBOL QUAD GREATER-THAN*/
+ 0, /* U+002345: APL FUNCTIONAL SYMBOL LEFTWARDS VANE*/
+ 0, /* U+002346: APL FUNCTIONAL SYMBOL RIGHTWARDS VANE*/
+ 0, /* U+002347: APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW*/
+ 0, /* U+002348: APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW*/
+ 0, /* U+002349: APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH*/
+ 0, /* U+00234a: APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR*/
+ 0, /* U+00234b: APL FUNCTIONAL SYMBOL DELTA STILE*/
+ 0, /* U+00234c: APL FUNCTIONAL SYMBOL QUAD DOWN CARET*/
+ 0, /* U+00234d: APL FUNCTIONAL SYMBOL QUAD DELTA*/
+ 0, /* U+00234e: APL FUNCTIONAL SYMBOL DOWN TACK JOT*/
+ 0, /* U+00234f: APL FUNCTIONAL SYMBOL UPWARDS VANE*/
+ 0, /* U+002350: APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW*/
+ 0, /* U+002351: APL FUNCTIONAL SYMBOL UP TACK OVERBAR*/
+ 0, /* U+002352: APL FUNCTIONAL SYMBOL DEL STILE*/
+ 0, /* U+002353: APL FUNCTIONAL SYMBOL QUAD UP CARET*/
+ 0, /* U+002354: APL FUNCTIONAL SYMBOL QUAD DEL*/
+ 0, /* U+002355: APL FUNCTIONAL SYMBOL UP TACK JOT*/
+ 0, /* U+002356: APL FUNCTIONAL SYMBOL DOWNWARDS VANE*/
+ 0, /* U+002357: APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW*/
+ 0, /* U+002358: APL FUNCTIONAL SYMBOL QUOTE UNDERBAR*/
+ 0, /* U+002359: APL FUNCTIONAL SYMBOL DELTA UNDERBAR*/
+ 0, /* U+00235a: APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR*/
+ 0, /* U+00235b: APL FUNCTIONAL SYMBOL JOT UNDERBAR*/
+ 0, /* U+00235c: APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR*/
+ 0, /* U+00235d: APL FUNCTIONAL SYMBOL UP SHOE JOT*/
+ 0, /* U+00235e: APL FUNCTIONAL SYMBOL QUOTE QUAD*/
+ 0, /* U+00235f: APL FUNCTIONAL SYMBOL CIRCLE STAR*/
+ 0, /* U+002360: APL FUNCTIONAL SYMBOL QUAD COLON*/
+ 0, /* U+002361: APL FUNCTIONAL SYMBOL UP TACK DIAERESIS*/
+ 0, /* U+002362: APL FUNCTIONAL SYMBOL DEL DIAERESIS*/
+ 0, /* U+002363: APL FUNCTIONAL SYMBOL STAR DIAERESIS*/
+ 0, /* U+002364: APL FUNCTIONAL SYMBOL JOT DIAERESIS*/
+ 0, /* U+002365: APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS*/
+ 0, /* U+002366: APL FUNCTIONAL SYMBOL DOWN SHOE STILE*/
+ 0, /* U+002367: APL FUNCTIONAL SYMBOL LEFT SHOE STILE*/
+ 0, /* U+002368: APL FUNCTIONAL SYMBOL TILDE DIAERESIS*/
+ 0, /* U+002369: APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS*/
+ 0, /* U+00236a: APL FUNCTIONAL SYMBOL COMMA BAR*/
+ 0, /* U+00236b: APL FUNCTIONAL SYMBOL DEL TILDE*/
+ 0, /* U+00236c: APL FUNCTIONAL SYMBOL ZILDE*/
+ 0, /* U+00236d: APL FUNCTIONAL SYMBOL STILE TILDE*/
+ 0, /* U+00236e: APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR*/
+ 0, /* U+00236f: APL FUNCTIONAL SYMBOL QUAD NOT EQUAL*/
+ 0, /* U+002370: APL FUNCTIONAL SYMBOL QUAD QUESTION*/
+ 0, /* U+002371: APL FUNCTIONAL SYMBOL DOWN CARET TILDE*/
+ 0, /* U+002372: APL FUNCTIONAL SYMBOL UP CARET TILDE*/
+ 0, /* U+002373: APL FUNCTIONAL SYMBOL IOTA*/
+ 0, /* U+002374: APL FUNCTIONAL SYMBOL RHO*/
+ 0, /* U+002375: APL FUNCTIONAL SYMBOL OMEGA*/
+ 0, /* U+002376: APL FUNCTIONAL SYMBOL ALPHA UNDERBAR*/
+ 0, /* U+002377: APL FUNCTIONAL SYMBOL EPSILON UNDERBAR*/
+ 0, /* U+002378: APL FUNCTIONAL SYMBOL IOTA UNDERBAR*/
+ 0, /* U+002379: APL FUNCTIONAL SYMBOL OMEGA UNDERBAR*/
+ 0, /* U+00237a: APL FUNCTIONAL SYMBOL ALPHA*/
+ 0, /* U+00237b: NOT CHECK MARK*/
+ 0, /* U+00237c: RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW*/
+ 0, /* U+00237d: SHOULDERED OPEN BOX*/
+ 0, /* U+00237e: BELL SYMBOL*/
+ 0, /* U+00237f: VERTICAL LINE WITH MIDDLE DOT*/
+ 0, /* U+002380: INSERTION SYMBOL*/
+ 0, /* U+002381: CONTINUOUS UNDERLINE SYMBOL*/
+ 0, /* U+002382: DISCONTINUOUS UNDERLINE SYMBOL*/
+ 0, /* U+002383: EMPHASIS SYMBOL*/
+ 0, /* U+002384: COMPOSITION SYMBOL*/
+ 0, /* U+002385: WHITE SQUARE WITH CENTRE VERTICAL LINE*/
+ 0, /* U+002386: ENTER SYMBOL*/
+ 0, /* U+002387: ALTERNATIVE KEY SYMBOL*/
+ 0, /* U+002388: HELM SYMBOL*/
+ 0, /* U+002389: CIRCLED HORIZONTAL BAR WITH NOTCH*/
+ 0, /* U+00238a: CIRCLED TRIANGLE DOWN*/
+ 0, /* U+00238b: BROKEN CIRCLE WITH NORTHWEST ARROW*/
+ 0, /* U+00238c: UNDO SYMBOL*/
+ 0, /* U+00238d: MONOSTABLE SYMBOL*/
+ 0, /* U+00238e: HYSTERESIS SYMBOL*/
+ 0, /* U+00238f: OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL*/
+ 0, /* U+002390: OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL*/
+ 0, /* U+002391: PASSIVE-PULL-DOWN-OUTPUT SYMBOL*/
+ 0, /* U+002392: PASSIVE-PULL-UP-OUTPUT SYMBOL*/
+ 0, /* U+002393: DIRECT CURRENT SYMBOL FORM TWO*/
+ 0, /* U+002394: SOFTWARE-FUNCTION SYMBOL*/
+ 0, /* U+002395: APL FUNCTIONAL SYMBOL QUAD*/
+ 0, /* U+002396: DECIMAL SEPARATOR KEY SYMBOL*/
+ 0, /* U+002397: PREVIOUS PAGE*/
+ 0, /* U+002398: NEXT PAGE*/
+ 0, /* U+002399: PRINT SCREEN SYMBOL*/
+ 0, /* U+00239a: CLEAR SCREEN SYMBOL*/
+ 0, /* U+00239b: LEFT PARENTHESIS UPPER HOOK*/
+ 0, /* U+00239c: LEFT PARENTHESIS EXTENSION*/
+ 0, /* U+00239d: LEFT PARENTHESIS LOWER HOOK*/
+ 0, /* U+00239e: RIGHT PARENTHESIS UPPER HOOK*/
+ 0, /* U+00239f: RIGHT PARENTHESIS EXTENSION*/
+ 0, /* U+0023a0: RIGHT PARENTHESIS LOWER HOOK*/
+ 0, /* U+0023a1: LEFT SQUARE BRACKET UPPER CORNER*/
+ 0, /* U+0023a2: LEFT SQUARE BRACKET EXTENSION*/
+ 0, /* U+0023a3: LEFT SQUARE BRACKET LOWER CORNER*/
+ 0, /* U+0023a4: RIGHT SQUARE BRACKET UPPER CORNER*/
+ 0, /* U+0023a5: RIGHT SQUARE BRACKET EXTENSION*/
+ 0, /* U+0023a6: RIGHT SQUARE BRACKET LOWER CORNER*/
+ 0, /* U+0023a7: LEFT CURLY BRACKET UPPER HOOK*/
+ 0, /* U+0023a8: LEFT CURLY BRACKET MIDDLE PIECE*/
+ 0, /* U+0023a9: LEFT CURLY BRACKET LOWER HOOK*/
+ 0, /* U+0023aa: CURLY BRACKET EXTENSION*/
+ 0, /* U+0023ab: RIGHT CURLY BRACKET UPPER HOOK*/
+ 0, /* U+0023ac: RIGHT CURLY BRACKET MIDDLE PIECE*/
+ 0, /* U+0023ad: RIGHT CURLY BRACKET LOWER HOOK*/
+ 0, /* U+0023ae: INTEGRAL EXTENSION*/
+ 0, /* U+0023af: HORIZONTAL LINE EXTENSION*/
+ 0, /* U+0023b0: UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION*/
+ 0, /* U+0023b1: UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION*/
+ 0, /* U+0023b2: SUMMATION TOP*/
+ 0, /* U+0023b3: SUMMATION BOTTOM*/
+ 0, /* U+0023b4: TOP SQUARE BRACKET*/
+ 0, /* U+0023b5: BOTTOM SQUARE BRACKET*/
+ 0, /* U+0023b6: BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET*/
+ 0, /* U+0023b7: RADICAL SYMBOL BOTTOM*/
+ 0, /* U+0023b8: LEFT VERTICAL BOX LINE*/
+ 0, /* U+0023b9: RIGHT VERTICAL BOX LINE*/
+ 0, /* U+0023ba: HORIZONTAL SCAN LINE-1*/
+ 0, /* U+0023bb: HORIZONTAL SCAN LINE-3*/
+ 0, /* U+0023bc: HORIZONTAL SCAN LINE-7*/
+ 0, /* U+0023bd: HORIZONTAL SCAN LINE-9*/
+ 0, /* U+0023be: DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT*/
+ 0, /* U+0023bf: DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT*/
+ 0, /* U+0023c0: DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE*/
+ 0, /* U+0023c1: DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE*/
+ 0, /* U+0023c2: DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE*/
+ 0, /* U+0023c3: DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE*/
+ 0, /* U+0023c4: DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE*/
+ 0, /* U+0023c5: DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE*/
+ 0, /* U+0023c6: DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE*/
+ 0, /* U+0023c7: DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE*/
+ 0, /* U+0023c8: DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE*/
+ 0, /* U+0023c9: DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL*/
+ 0, /* U+0023ca: DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL*/
+ 0, /* U+0023cb: DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT*/
+ 0, /* U+0023cc: DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT*/
+ 0, /* U+0023cd: SQUARE FOOT*/
+ 0, /* U+0023ce: RETURN SYMBOL*/
+ 0, /* U+0023cf: EJECT SYMBOL*/
+ 0, /* U+0023d0: VERTICAL LINE EXTENSION*/
+ 0, /* U+0023d1: METRICAL BREVE*/
+ 0, /* U+0023d2: METRICAL LONG OVER SHORT*/
+ 0, /* U+0023d3: METRICAL SHORT OVER LONG*/
+ 0, /* U+0023d4: METRICAL LONG OVER TWO SHORTS*/
+ 0, /* U+0023d5: METRICAL TWO SHORTS OVER LONG*/
+ 0, /* U+0023d6: METRICAL TWO SHORTS JOINED*/
+ 0, /* U+0023d7: METRICAL TRISEME*/
+ 0, /* U+0023d8: METRICAL TETRASEME*/
+ 0, /* U+0023d9: METRICAL PENTASEME*/
+ 0, /* U+0023da: EARTH GROUND*/
+ 0, /* U+0023db: FUSE*/
+ 0, /* U+0023dc: TOP PARENTHESIS*/
+ 0, /* U+0023dd: BOTTOM PARENTHESIS*/
+ 0, /* U+0023de: TOP CURLY BRACKET*/
+ 0, /* U+0023df: BOTTOM CURLY BRACKET*/
+ 0, /* U+0023e0: TOP TORTOISE SHELL BRACKET*/
+ 0, /* U+0023e1: BOTTOM TORTOISE SHELL BRACKET*/
+ 0, /* U+0023e2: WHITE TRAPEZIUM*/
+ 0, /* U+0023e3: BENZENE RING WITH CIRCLE*/
+ 0, /* U+0023e4: STRAIGHTNESS*/
+ 0, /* U+0023e5: FLATNESS*/
+ 0, /* U+0023e6: AC CURRENT*/
+ 0, /* U+0023e7: ELECTRICAL INTERSECTION*/
+ 0, /* U+0023e8: DECIMAL EXPONENT SYMBOL*/
+ 0, /* U+0023e9: BLACK RIGHT-POINTING DOUBLE TRIANGLE*/
+ 0, /* U+0023ea: BLACK LEFT-POINTING DOUBLE TRIANGLE*/
+ 0, /* U+0023eb: BLACK UP-POINTING DOUBLE TRIANGLE*/
+ 0, /* U+0023ec: BLACK DOWN-POINTING DOUBLE TRIANGLE*/
+ 0, /* U+0023ed: BLACK RIGHT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR*/
+ 0, /* U+0023ee: BLACK LEFT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR*/
+ 0, /* U+0023ef: BLACK RIGHT-POINTING TRIANGLE WITH DOUBLE VERTICAL BAR*/
+ 0, /* U+0023f0: ALARM CLOCK*/
+ 0, /* U+0023f1: STOPWATCH*/
+ 0, /* U+0023f2: TIMER CLOCK*/
+ 0, /* U+0023f3: HOURGLASS WITH FLOWING SAND*/
+ 0, /* U+0023f4: */
+ 0, /* U+0023f5: */
+ 0, /* U+0023f6: */
+ 0, /* U+0023f7: */
+ 0, /* U+0023f8: */
+ 0, /* U+0023f9: */
+ 0, /* U+0023fa: */
+ 0, /* U+0023fb: */
+ 0, /* U+0023fc: */
+ 0, /* U+0023fd: */
+ 0, /* U+0023fe: */
+ 0, /* U+0023ff: */
+ 0, /* U+002400: SYMBOL FOR NULL*/
+ 0, /* U+002401: SYMBOL FOR START OF HEADING*/
+ 0, /* U+002402: SYMBOL FOR START OF TEXT*/
+ 0, /* U+002403: SYMBOL FOR END OF TEXT*/
+ 0, /* U+002404: SYMBOL FOR END OF TRANSMISSION*/
+ 0, /* U+002405: SYMBOL FOR ENQUIRY*/
+ 0, /* U+002406: SYMBOL FOR ACKNOWLEDGE*/
+ 0, /* U+002407: SYMBOL FOR BELL*/
+ 0, /* U+002408: SYMBOL FOR BACKSPACE*/
+ 0, /* U+002409: SYMBOL FOR HORIZONTAL TABULATION*/
+ 0, /* U+00240a: SYMBOL FOR LINE FEED*/
+ 0, /* U+00240b: SYMBOL FOR VERTICAL TABULATION*/
+ 0, /* U+00240c: SYMBOL FOR FORM FEED*/
+ 0, /* U+00240d: SYMBOL FOR CARRIAGE RETURN*/
+ 0, /* U+00240e: SYMBOL FOR SHIFT OUT*/
+ 0, /* U+00240f: SYMBOL FOR SHIFT IN*/
+ 0, /* U+002410: SYMBOL FOR DATA LINK ESCAPE*/
+ 0, /* U+002411: SYMBOL FOR DEVICE CONTROL ONE*/
+ 0, /* U+002412: SYMBOL FOR DEVICE CONTROL TWO*/
+ 0, /* U+002413: SYMBOL FOR DEVICE CONTROL THREE*/
+ 0, /* U+002414: SYMBOL FOR DEVICE CONTROL FOUR*/
+ 0, /* U+002415: SYMBOL FOR NEGATIVE ACKNOWLEDGE*/
+ 0, /* U+002416: SYMBOL FOR SYNCHRONOUS IDLE*/
+ 0, /* U+002417: SYMBOL FOR END OF TRANSMISSION BLOCK*/
+ 0, /* U+002418: SYMBOL FOR CANCEL*/
+ 0, /* U+002419: SYMBOL FOR END OF MEDIUM*/
+ 0, /* U+00241a: SYMBOL FOR SUBSTITUTE*/
+ 0, /* U+00241b: SYMBOL FOR ESCAPE*/
+ 0, /* U+00241c: SYMBOL FOR FILE SEPARATOR*/
+ 0, /* U+00241d: SYMBOL FOR GROUP SEPARATOR*/
+ 0, /* U+00241e: SYMBOL FOR RECORD SEPARATOR*/
+ 0, /* U+00241f: SYMBOL FOR UNIT SEPARATOR*/
+ 0, /* U+002420: SYMBOL FOR SPACE*/
+ 0, /* U+002421: SYMBOL FOR DELETE*/
+ 0, /* U+002422: BLANK SYMBOL*/
+ 0, /* U+002423: OPEN BOX*/
+ 0, /* U+002424: SYMBOL FOR NEWLINE*/
+ 0, /* U+002425: SYMBOL FOR DELETE FORM TWO*/
+ 0, /* U+002426: SYMBOL FOR SUBSTITUTE FORM TWO*/
+ 0, /* U+002427: */
+ 0, /* U+002428: */
+ 0, /* U+002429: */
+ 0, /* U+00242a: */
+ 0, /* U+00242b: */
+ 0, /* U+00242c: */
+ 0, /* U+00242d: */
+ 0, /* U+00242e: */
+ 0, /* U+00242f: */
+ 0, /* U+002430: */
+ 0, /* U+002431: */
+ 0, /* U+002432: */
+ 0, /* U+002433: */
+ 0, /* U+002434: */
+ 0, /* U+002435: */
+ 0, /* U+002436: */
+ 0, /* U+002437: */
+ 0, /* U+002438: */
+ 0, /* U+002439: */
+ 0, /* U+00243a: */
+ 0, /* U+00243b: */
+ 0, /* U+00243c: */
+ 0, /* U+00243d: */
+ 0, /* U+00243e: */
+ 0, /* U+00243f: */
+ 0, /* U+002440: OCR HOOK*/
+ 0, /* U+002441: OCR CHAIR*/
+ 0, /* U+002442: OCR FORK*/
+ 0, /* U+002443: OCR INVERTED FORK*/
+ 0, /* U+002444: OCR BELT BUCKLE*/
+ 0, /* U+002445: OCR BOW TIE*/
+ 0, /* U+002446: OCR BRANCH BANK IDENTIFICATION*/
+ 0, /* U+002447: OCR AMOUNT OF CHECK*/
+ 0, /* U+002448: OCR DASH*/
+ 0, /* U+002449: OCR CUSTOMER ACCOUNT NUMBER*/
+ 0, /* U+00244a: OCR DOUBLE BACKSLASH*/
+ 0, /* U+00244b: */
+ 0, /* U+00244c: */
+ 0, /* U+00244d: */
+ 0, /* U+00244e: */
+ 0, /* U+00244f: */
+ 0, /* U+002450: */
+ 0, /* U+002451: */
+ 0, /* U+002452: */
+ 0, /* U+002453: */
+ 0, /* U+002454: */
+ 0, /* U+002455: */
+ 0, /* U+002456: */
+ 0, /* U+002457: */
+ 0, /* U+002458: */
+ 0, /* U+002459: */
+ 0, /* U+00245a: */
+ 0, /* U+00245b: */
+ 0, /* U+00245c: */
+ 0, /* U+00245d: */
+ 0, /* U+00245e: */
+ 0, /* U+00245f: */
+ 0, /* U+002460: CIRCLED DIGIT ONE*/
+ 0, /* U+002461: CIRCLED DIGIT TWO*/
+ 0, /* U+002462: CIRCLED DIGIT THREE*/
+ 0, /* U+002463: CIRCLED DIGIT FOUR*/
+ 0, /* U+002464: CIRCLED DIGIT FIVE*/
+ 0, /* U+002465: CIRCLED DIGIT SIX*/
+ 0, /* U+002466: CIRCLED DIGIT SEVEN*/
+ 0, /* U+002467: CIRCLED DIGIT EIGHT*/
+ 0, /* U+002468: CIRCLED DIGIT NINE*/
+ 0, /* U+002469: CIRCLED NUMBER TEN*/
+ 0, /* U+00246a: CIRCLED NUMBER ELEVEN*/
+ 0, /* U+00246b: CIRCLED NUMBER TWELVE*/
+ 0, /* U+00246c: CIRCLED NUMBER THIRTEEN*/
+ 0, /* U+00246d: CIRCLED NUMBER FOURTEEN*/
+ 0, /* U+00246e: CIRCLED NUMBER FIFTEEN*/
+ 0, /* U+00246f: CIRCLED NUMBER SIXTEEN*/
+ 0, /* U+002470: CIRCLED NUMBER SEVENTEEN*/
+ 0, /* U+002471: CIRCLED NUMBER EIGHTEEN*/
+ 0, /* U+002472: CIRCLED NUMBER NINETEEN*/
+ 0, /* U+002473: CIRCLED NUMBER TWENTY*/
+ 0, /* U+002474: PARENTHESIZED DIGIT ONE*/
+ 0, /* U+002475: PARENTHESIZED DIGIT TWO*/
+ 0, /* U+002476: PARENTHESIZED DIGIT THREE*/
+ 0, /* U+002477: PARENTHESIZED DIGIT FOUR*/
+ 0, /* U+002478: PARENTHESIZED DIGIT FIVE*/
+ 0, /* U+002479: PARENTHESIZED DIGIT SIX*/
+ 0, /* U+00247a: PARENTHESIZED DIGIT SEVEN*/
+ 0, /* U+00247b: PARENTHESIZED DIGIT EIGHT*/
+ 0, /* U+00247c: PARENTHESIZED DIGIT NINE*/
+ 0, /* U+00247d: PARENTHESIZED NUMBER TEN*/
+ 0, /* U+00247e: PARENTHESIZED NUMBER ELEVEN*/
+ 0, /* U+00247f: PARENTHESIZED NUMBER TWELVE*/
+ 0, /* U+002480: PARENTHESIZED NUMBER THIRTEEN*/
+ 0, /* U+002481: PARENTHESIZED NUMBER FOURTEEN*/
+ 0, /* U+002482: PARENTHESIZED NUMBER FIFTEEN*/
+ 0, /* U+002483: PARENTHESIZED NUMBER SIXTEEN*/
+ 0, /* U+002484: PARENTHESIZED NUMBER SEVENTEEN*/
+ 0, /* U+002485: PARENTHESIZED NUMBER EIGHTEEN*/
+ 0, /* U+002486: PARENTHESIZED NUMBER NINETEEN*/
+ 0, /* U+002487: PARENTHESIZED NUMBER TWENTY*/
+ 0, /* U+002488: DIGIT ONE FULL STOP*/
+ 0, /* U+002489: DIGIT TWO FULL STOP*/
+ 0, /* U+00248a: DIGIT THREE FULL STOP*/
+ 0, /* U+00248b: DIGIT FOUR FULL STOP*/
+ 0, /* U+00248c: DIGIT FIVE FULL STOP*/
+ 0, /* U+00248d: DIGIT SIX FULL STOP*/
+ 0, /* U+00248e: DIGIT SEVEN FULL STOP*/
+ 0, /* U+00248f: DIGIT EIGHT FULL STOP*/
+ 0, /* U+002490: DIGIT NINE FULL STOP*/
+ 0, /* U+002491: NUMBER TEN FULL STOP*/
+ 0, /* U+002492: NUMBER ELEVEN FULL STOP*/
+ 0, /* U+002493: NUMBER TWELVE FULL STOP*/
+ 0, /* U+002494: NUMBER THIRTEEN FULL STOP*/
+ 0, /* U+002495: NUMBER FOURTEEN FULL STOP*/
+ 0, /* U+002496: NUMBER FIFTEEN FULL STOP*/
+ 0, /* U+002497: NUMBER SIXTEEN FULL STOP*/
+ 0, /* U+002498: NUMBER SEVENTEEN FULL STOP*/
+ 0, /* U+002499: NUMBER EIGHTEEN FULL STOP*/
+ 0, /* U+00249a: NUMBER NINETEEN FULL STOP*/
+ 0, /* U+00249b: NUMBER TWENTY FULL STOP*/
+ 0, /* U+00249c: PARENTHESIZED LATIN SMALL LETTER A*/
+ 0, /* U+00249d: PARENTHESIZED LATIN SMALL LETTER B*/
+ 0, /* U+00249e: PARENTHESIZED LATIN SMALL LETTER C*/
+ 0, /* U+00249f: PARENTHESIZED LATIN SMALL LETTER D*/
+ 0, /* U+0024a0: PARENTHESIZED LATIN SMALL LETTER E*/
+ 0, /* U+0024a1: PARENTHESIZED LATIN SMALL LETTER F*/
+ 0, /* U+0024a2: PARENTHESIZED LATIN SMALL LETTER G*/
+ 0, /* U+0024a3: PARENTHESIZED LATIN SMALL LETTER H*/
+ 0, /* U+0024a4: PARENTHESIZED LATIN SMALL LETTER I*/
+ 0, /* U+0024a5: PARENTHESIZED LATIN SMALL LETTER J*/
+ 0, /* U+0024a6: PARENTHESIZED LATIN SMALL LETTER K*/
+ 0, /* U+0024a7: PARENTHESIZED LATIN SMALL LETTER L*/
+ 0, /* U+0024a8: PARENTHESIZED LATIN SMALL LETTER M*/
+ 0, /* U+0024a9: PARENTHESIZED LATIN SMALL LETTER N*/
+ 0, /* U+0024aa: PARENTHESIZED LATIN SMALL LETTER O*/
+ 0, /* U+0024ab: PARENTHESIZED LATIN SMALL LETTER P*/
+ 0, /* U+0024ac: PARENTHESIZED LATIN SMALL LETTER Q*/
+ 0, /* U+0024ad: PARENTHESIZED LATIN SMALL LETTER R*/
+ 0, /* U+0024ae: PARENTHESIZED LATIN SMALL LETTER S*/
+ 0, /* U+0024af: PARENTHESIZED LATIN SMALL LETTER T*/
+ 0, /* U+0024b0: PARENTHESIZED LATIN SMALL LETTER U*/
+ 0, /* U+0024b1: PARENTHESIZED LATIN SMALL LETTER V*/
+ 0, /* U+0024b2: PARENTHESIZED LATIN SMALL LETTER W*/
+ 0, /* U+0024b3: PARENTHESIZED LATIN SMALL LETTER X*/
+ 0, /* U+0024b4: PARENTHESIZED LATIN SMALL LETTER Y*/
+ 0, /* U+0024b5: PARENTHESIZED LATIN SMALL LETTER Z*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0024b6: CIRCLED LATIN CAPITAL LETTER A*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0024b7: CIRCLED LATIN CAPITAL LETTER B*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0024b8: CIRCLED LATIN CAPITAL LETTER C*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0024b9: CIRCLED LATIN CAPITAL LETTER D*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0024ba: CIRCLED LATIN CAPITAL LETTER E*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0024bb: CIRCLED LATIN CAPITAL LETTER F*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0024bc: CIRCLED LATIN CAPITAL LETTER G*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0024bd: CIRCLED LATIN CAPITAL LETTER H*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0024be: CIRCLED LATIN CAPITAL LETTER I*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0024bf: CIRCLED LATIN CAPITAL LETTER J*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0024c0: CIRCLED LATIN CAPITAL LETTER K*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0024c1: CIRCLED LATIN CAPITAL LETTER L*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0024c2: CIRCLED LATIN CAPITAL LETTER M*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0024c3: CIRCLED LATIN CAPITAL LETTER N*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0024c4: CIRCLED LATIN CAPITAL LETTER O*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0024c5: CIRCLED LATIN CAPITAL LETTER P*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0024c6: CIRCLED LATIN CAPITAL LETTER Q*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0024c7: CIRCLED LATIN CAPITAL LETTER R*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0024c8: CIRCLED LATIN CAPITAL LETTER S*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0024c9: CIRCLED LATIN CAPITAL LETTER T*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0024ca: CIRCLED LATIN CAPITAL LETTER U*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0024cb: CIRCLED LATIN CAPITAL LETTER V*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0024cc: CIRCLED LATIN CAPITAL LETTER W*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0024cd: CIRCLED LATIN CAPITAL LETTER X*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0024ce: CIRCLED LATIN CAPITAL LETTER Y*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+0024cf: CIRCLED LATIN CAPITAL LETTER Z*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0024d0: CIRCLED LATIN SMALL LETTER A*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0024d1: CIRCLED LATIN SMALL LETTER B*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0024d2: CIRCLED LATIN SMALL LETTER C*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0024d3: CIRCLED LATIN SMALL LETTER D*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0024d4: CIRCLED LATIN SMALL LETTER E*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0024d5: CIRCLED LATIN SMALL LETTER F*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0024d6: CIRCLED LATIN SMALL LETTER G*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0024d7: CIRCLED LATIN SMALL LETTER H*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0024d8: CIRCLED LATIN SMALL LETTER I*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0024d9: CIRCLED LATIN SMALL LETTER J*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0024da: CIRCLED LATIN SMALL LETTER K*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0024db: CIRCLED LATIN SMALL LETTER L*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0024dc: CIRCLED LATIN SMALL LETTER M*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0024dd: CIRCLED LATIN SMALL LETTER N*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0024de: CIRCLED LATIN SMALL LETTER O*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0024df: CIRCLED LATIN SMALL LETTER P*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0024e0: CIRCLED LATIN SMALL LETTER Q*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0024e1: CIRCLED LATIN SMALL LETTER R*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0024e2: CIRCLED LATIN SMALL LETTER S*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0024e3: CIRCLED LATIN SMALL LETTER T*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0024e4: CIRCLED LATIN SMALL LETTER U*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0024e5: CIRCLED LATIN SMALL LETTER V*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0024e6: CIRCLED LATIN SMALL LETTER W*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0024e7: CIRCLED LATIN SMALL LETTER X*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0024e8: CIRCLED LATIN SMALL LETTER Y*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+0024e9: CIRCLED LATIN SMALL LETTER Z*/
+ 0, /* U+0024ea: CIRCLED DIGIT ZERO*/
+ 0, /* U+0024eb: NEGATIVE CIRCLED NUMBER ELEVEN*/
+ 0, /* U+0024ec: NEGATIVE CIRCLED NUMBER TWELVE*/
+ 0, /* U+0024ed: NEGATIVE CIRCLED NUMBER THIRTEEN*/
+ 0, /* U+0024ee: NEGATIVE CIRCLED NUMBER FOURTEEN*/
+ 0, /* U+0024ef: NEGATIVE CIRCLED NUMBER FIFTEEN*/
+ 0, /* U+0024f0: NEGATIVE CIRCLED NUMBER SIXTEEN*/
+ 0, /* U+0024f1: NEGATIVE CIRCLED NUMBER SEVENTEEN*/
+ 0, /* U+0024f2: NEGATIVE CIRCLED NUMBER EIGHTEEN*/
+ 0, /* U+0024f3: NEGATIVE CIRCLED NUMBER NINETEEN*/
+ 0, /* U+0024f4: NEGATIVE CIRCLED NUMBER TWENTY*/
+ 0, /* U+0024f5: DOUBLE CIRCLED DIGIT ONE*/
+ 0, /* U+0024f6: DOUBLE CIRCLED DIGIT TWO*/
+ 0, /* U+0024f7: DOUBLE CIRCLED DIGIT THREE*/
+ 0, /* U+0024f8: DOUBLE CIRCLED DIGIT FOUR*/
+ 0, /* U+0024f9: DOUBLE CIRCLED DIGIT FIVE*/
+ 0, /* U+0024fa: DOUBLE CIRCLED DIGIT SIX*/
+ 0, /* U+0024fb: DOUBLE CIRCLED DIGIT SEVEN*/
+ 0, /* U+0024fc: DOUBLE CIRCLED DIGIT EIGHT*/
+ 0, /* U+0024fd: DOUBLE CIRCLED DIGIT NINE*/
+ 0, /* U+0024fe: DOUBLE CIRCLED NUMBER TEN*/
+ 0, /* U+0024ff: NEGATIVE CIRCLED DIGIT ZERO*/
+ 0, /* U+002500: BOX DRAWINGS LIGHT HORIZONTAL*/
+ 0, /* U+002501: BOX DRAWINGS HEAVY HORIZONTAL*/
+ 0, /* U+002502: BOX DRAWINGS LIGHT VERTICAL*/
+ 0, /* U+002503: BOX DRAWINGS HEAVY VERTICAL*/
+ 0, /* U+002504: BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL*/
+ 0, /* U+002505: BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL*/
+ 0, /* U+002506: BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL*/
+ 0, /* U+002507: BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL*/
+ 0, /* U+002508: BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL*/
+ 0, /* U+002509: BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL*/
+ 0, /* U+00250a: BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL*/
+ 0, /* U+00250b: BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL*/
+ 0, /* U+00250c: BOX DRAWINGS LIGHT DOWN AND RIGHT*/
+ 0, /* U+00250d: BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY*/
+ 0, /* U+00250e: BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT*/
+ 0, /* U+00250f: BOX DRAWINGS HEAVY DOWN AND RIGHT*/
+ 0, /* U+002510: BOX DRAWINGS LIGHT DOWN AND LEFT*/
+ 0, /* U+002511: BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY*/
+ 0, /* U+002512: BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT*/
+ 0, /* U+002513: BOX DRAWINGS HEAVY DOWN AND LEFT*/
+ 0, /* U+002514: BOX DRAWINGS LIGHT UP AND RIGHT*/
+ 0, /* U+002515: BOX DRAWINGS UP LIGHT AND RIGHT HEAVY*/
+ 0, /* U+002516: BOX DRAWINGS UP HEAVY AND RIGHT LIGHT*/
+ 0, /* U+002517: BOX DRAWINGS HEAVY UP AND RIGHT*/
+ 0, /* U+002518: BOX DRAWINGS LIGHT UP AND LEFT*/
+ 0, /* U+002519: BOX DRAWINGS UP LIGHT AND LEFT HEAVY*/
+ 0, /* U+00251a: BOX DRAWINGS UP HEAVY AND LEFT LIGHT*/
+ 0, /* U+00251b: BOX DRAWINGS HEAVY UP AND LEFT*/
+ 0, /* U+00251c: BOX DRAWINGS LIGHT VERTICAL AND RIGHT*/
+ 0, /* U+00251d: BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY*/
+ 0, /* U+00251e: BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT*/
+ 0, /* U+00251f: BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT*/
+ 0, /* U+002520: BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT*/
+ 0, /* U+002521: BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY*/
+ 0, /* U+002522: BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY*/
+ 0, /* U+002523: BOX DRAWINGS HEAVY VERTICAL AND RIGHT*/
+ 0, /* U+002524: BOX DRAWINGS LIGHT VERTICAL AND LEFT*/
+ 0, /* U+002525: BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY*/
+ 0, /* U+002526: BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT*/
+ 0, /* U+002527: BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT*/
+ 0, /* U+002528: BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT*/
+ 0, /* U+002529: BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY*/
+ 0, /* U+00252a: BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY*/
+ 0, /* U+00252b: BOX DRAWINGS HEAVY VERTICAL AND LEFT*/
+ 0, /* U+00252c: BOX DRAWINGS LIGHT DOWN AND HORIZONTAL*/
+ 0, /* U+00252d: BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT*/
+ 0, /* U+00252e: BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT*/
+ 0, /* U+00252f: BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY*/
+ 0, /* U+002530: BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT*/
+ 0, /* U+002531: BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY*/
+ 0, /* U+002532: BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY*/
+ 0, /* U+002533: BOX DRAWINGS HEAVY DOWN AND HORIZONTAL*/
+ 0, /* U+002534: BOX DRAWINGS LIGHT UP AND HORIZONTAL*/
+ 0, /* U+002535: BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT*/
+ 0, /* U+002536: BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT*/
+ 0, /* U+002537: BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY*/
+ 0, /* U+002538: BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT*/
+ 0, /* U+002539: BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY*/
+ 0, /* U+00253a: BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY*/
+ 0, /* U+00253b: BOX DRAWINGS HEAVY UP AND HORIZONTAL*/
+ 0, /* U+00253c: BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL*/
+ 0, /* U+00253d: BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT*/
+ 0, /* U+00253e: BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT*/
+ 0, /* U+00253f: BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY*/
+ 0, /* U+002540: BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT*/
+ 0, /* U+002541: BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT*/
+ 0, /* U+002542: BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT*/
+ 0, /* U+002543: BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT*/
+ 0, /* U+002544: BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT*/
+ 0, /* U+002545: BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT*/
+ 0, /* U+002546: BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT*/
+ 0, /* U+002547: BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY*/
+ 0, /* U+002548: BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY*/
+ 0, /* U+002549: BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY*/
+ 0, /* U+00254a: BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY*/
+ 0, /* U+00254b: BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL*/
+ 0, /* U+00254c: BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL*/
+ 0, /* U+00254d: BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL*/
+ 0, /* U+00254e: BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL*/
+ 0, /* U+00254f: BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL*/
+ 0, /* U+002550: BOX DRAWINGS DOUBLE HORIZONTAL*/
+ 0, /* U+002551: BOX DRAWINGS DOUBLE VERTICAL*/
+ 0, /* U+002552: BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE*/
+ 0, /* U+002553: BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE*/
+ 0, /* U+002554: BOX DRAWINGS DOUBLE DOWN AND RIGHT*/
+ 0, /* U+002555: BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE*/
+ 0, /* U+002556: BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE*/
+ 0, /* U+002557: BOX DRAWINGS DOUBLE DOWN AND LEFT*/
+ 0, /* U+002558: BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE*/
+ 0, /* U+002559: BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE*/
+ 0, /* U+00255a: BOX DRAWINGS DOUBLE UP AND RIGHT*/
+ 0, /* U+00255b: BOX DRAWINGS UP SINGLE AND LEFT DOUBLE*/
+ 0, /* U+00255c: BOX DRAWINGS UP DOUBLE AND LEFT SINGLE*/
+ 0, /* U+00255d: BOX DRAWINGS DOUBLE UP AND LEFT*/
+ 0, /* U+00255e: BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE*/
+ 0, /* U+00255f: BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE*/
+ 0, /* U+002560: BOX DRAWINGS DOUBLE VERTICAL AND RIGHT*/
+ 0, /* U+002561: BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE*/
+ 0, /* U+002562: BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE*/
+ 0, /* U+002563: BOX DRAWINGS DOUBLE VERTICAL AND LEFT*/
+ 0, /* U+002564: BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE*/
+ 0, /* U+002565: BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE*/
+ 0, /* U+002566: BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL*/
+ 0, /* U+002567: BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE*/
+ 0, /* U+002568: BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE*/
+ 0, /* U+002569: BOX DRAWINGS DOUBLE UP AND HORIZONTAL*/
+ 0, /* U+00256a: BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE*/
+ 0, /* U+00256b: BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE*/
+ 0, /* U+00256c: BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL*/
+ 0, /* U+00256d: BOX DRAWINGS LIGHT ARC DOWN AND RIGHT*/
+ 0, /* U+00256e: BOX DRAWINGS LIGHT ARC DOWN AND LEFT*/
+ 0, /* U+00256f: BOX DRAWINGS LIGHT ARC UP AND LEFT*/
+ 0, /* U+002570: BOX DRAWINGS LIGHT ARC UP AND RIGHT*/
+ 0, /* U+002571: BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT*/
+ 0, /* U+002572: BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT*/
+ 0, /* U+002573: BOX DRAWINGS LIGHT DIAGONAL CROSS*/
+ 0, /* U+002574: BOX DRAWINGS LIGHT LEFT*/
+ 0, /* U+002575: BOX DRAWINGS LIGHT UP*/
+ 0, /* U+002576: BOX DRAWINGS LIGHT RIGHT*/
+ 0, /* U+002577: BOX DRAWINGS LIGHT DOWN*/
+ 0, /* U+002578: BOX DRAWINGS HEAVY LEFT*/
+ 0, /* U+002579: BOX DRAWINGS HEAVY UP*/
+ 0, /* U+00257a: BOX DRAWINGS HEAVY RIGHT*/
+ 0, /* U+00257b: BOX DRAWINGS HEAVY DOWN*/
+ 0, /* U+00257c: BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT*/
+ 0, /* U+00257d: BOX DRAWINGS LIGHT UP AND HEAVY DOWN*/
+ 0, /* U+00257e: BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT*/
+ 0, /* U+00257f: BOX DRAWINGS HEAVY UP AND LIGHT DOWN*/
+ 0, /* U+002580: UPPER HALF BLOCK*/
+ 0, /* U+002581: LOWER ONE EIGHTH BLOCK*/
+ 0, /* U+002582: LOWER ONE QUARTER BLOCK*/
+ 0, /* U+002583: LOWER THREE EIGHTHS BLOCK*/
+ 0, /* U+002584: LOWER HALF BLOCK*/
+ 0, /* U+002585: LOWER FIVE EIGHTHS BLOCK*/
+ 0, /* U+002586: LOWER THREE QUARTERS BLOCK*/
+ 0, /* U+002587: LOWER SEVEN EIGHTHS BLOCK*/
+ 0, /* U+002588: FULL BLOCK*/
+ 0, /* U+002589: LEFT SEVEN EIGHTHS BLOCK*/
+ 0, /* U+00258a: LEFT THREE QUARTERS BLOCK*/
+ 0, /* U+00258b: LEFT FIVE EIGHTHS BLOCK*/
+ 0, /* U+00258c: LEFT HALF BLOCK*/
+ 0, /* U+00258d: LEFT THREE EIGHTHS BLOCK*/
+ 0, /* U+00258e: LEFT ONE QUARTER BLOCK*/
+ 0, /* U+00258f: LEFT ONE EIGHTH BLOCK*/
+ 0, /* U+002590: RIGHT HALF BLOCK*/
+ 0, /* U+002591: LIGHT SHADE*/
+ 0, /* U+002592: MEDIUM SHADE*/
+ 0, /* U+002593: DARK SHADE*/
+ 0, /* U+002594: UPPER ONE EIGHTH BLOCK*/
+ 0, /* U+002595: RIGHT ONE EIGHTH BLOCK*/
+ 0, /* U+002596: QUADRANT LOWER LEFT*/
+ 0, /* U+002597: QUADRANT LOWER RIGHT*/
+ 0, /* U+002598: QUADRANT UPPER LEFT*/
+ 0, /* U+002599: QUADRANT UPPER LEFT AND LOWER LEFT AND LOWER RIGHT*/
+ 0, /* U+00259a: QUADRANT UPPER LEFT AND LOWER RIGHT*/
+ 0, /* U+00259b: QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER LEFT*/
+ 0, /* U+00259c: QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER RIGHT*/
+ 0, /* U+00259d: QUADRANT UPPER RIGHT*/
+ 0, /* U+00259e: QUADRANT UPPER RIGHT AND LOWER LEFT*/
+ 0, /* U+00259f: QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT*/
+ 0, /* U+0025a0: BLACK SQUARE*/
+ 0, /* U+0025a1: WHITE SQUARE*/
+ 0, /* U+0025a2: WHITE SQUARE WITH ROUNDED CORNERS*/
+ 0, /* U+0025a3: WHITE SQUARE CONTAINING BLACK SMALL SQUARE*/
+ 0, /* U+0025a4: SQUARE WITH HORIZONTAL FILL*/
+ 0, /* U+0025a5: SQUARE WITH VERTICAL FILL*/
+ 0, /* U+0025a6: SQUARE WITH ORTHOGONAL CROSSHATCH FILL*/
+ 0, /* U+0025a7: SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL*/
+ 0, /* U+0025a8: SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL*/
+ 0, /* U+0025a9: SQUARE WITH DIAGONAL CROSSHATCH FILL*/
+ 0, /* U+0025aa: BLACK SMALL SQUARE*/
+ 0, /* U+0025ab: WHITE SMALL SQUARE*/
+ 0, /* U+0025ac: BLACK RECTANGLE*/
+ 0, /* U+0025ad: WHITE RECTANGLE*/
+ 0, /* U+0025ae: BLACK VERTICAL RECTANGLE*/
+ 0, /* U+0025af: WHITE VERTICAL RECTANGLE*/
+ 0, /* U+0025b0: BLACK PARALLELOGRAM*/
+ 0, /* U+0025b1: WHITE PARALLELOGRAM*/
+ 0, /* U+0025b2: BLACK UP-POINTING TRIANGLE*/
+ 0, /* U+0025b3: WHITE UP-POINTING TRIANGLE*/
+ 0, /* U+0025b4: BLACK UP-POINTING SMALL TRIANGLE*/
+ 0, /* U+0025b5: WHITE UP-POINTING SMALL TRIANGLE*/
+ 0, /* U+0025b6: BLACK RIGHT-POINTING TRIANGLE*/
+ 0, /* U+0025b7: WHITE RIGHT-POINTING TRIANGLE*/
+ 0, /* U+0025b8: BLACK RIGHT-POINTING SMALL TRIANGLE*/
+ 0, /* U+0025b9: WHITE RIGHT-POINTING SMALL TRIANGLE*/
+ 0, /* U+0025ba: BLACK RIGHT-POINTING POINTER*/
+ 0, /* U+0025bb: WHITE RIGHT-POINTING POINTER*/
+ 0, /* U+0025bc: BLACK DOWN-POINTING TRIANGLE*/
+ 0, /* U+0025bd: WHITE DOWN-POINTING TRIANGLE*/
+ 0, /* U+0025be: BLACK DOWN-POINTING SMALL TRIANGLE*/
+ 0, /* U+0025bf: WHITE DOWN-POINTING SMALL TRIANGLE*/
+ 0, /* U+0025c0: BLACK LEFT-POINTING TRIANGLE*/
+ 0, /* U+0025c1: WHITE LEFT-POINTING TRIANGLE*/
+ 0, /* U+0025c2: BLACK LEFT-POINTING SMALL TRIANGLE*/
+ 0, /* U+0025c3: WHITE LEFT-POINTING SMALL TRIANGLE*/
+ 0, /* U+0025c4: BLACK LEFT-POINTING POINTER*/
+ 0, /* U+0025c5: WHITE LEFT-POINTING POINTER*/
+ 0, /* U+0025c6: BLACK DIAMOND*/
+ 0, /* U+0025c7: WHITE DIAMOND*/
+ 0, /* U+0025c8: WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND*/
+ 0, /* U+0025c9: FISHEYE*/
+ 0, /* U+0025ca: LOZENGE*/
+ 0, /* U+0025cb: WHITE CIRCLE*/
+ 0, /* U+0025cc: DOTTED CIRCLE*/
+ 0, /* U+0025cd: CIRCLE WITH VERTICAL FILL*/
+ 0, /* U+0025ce: BULLSEYE*/
+ 0, /* U+0025cf: BLACK CIRCLE*/
+ 0, /* U+0025d0: CIRCLE WITH LEFT HALF BLACK*/
+ 0, /* U+0025d1: CIRCLE WITH RIGHT HALF BLACK*/
+ 0, /* U+0025d2: CIRCLE WITH LOWER HALF BLACK*/
+ 0, /* U+0025d3: CIRCLE WITH UPPER HALF BLACK*/
+ 0, /* U+0025d4: CIRCLE WITH UPPER RIGHT QUADRANT BLACK*/
+ 0, /* U+0025d5: CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK*/
+ 0, /* U+0025d6: LEFT HALF BLACK CIRCLE*/
+ 0, /* U+0025d7: RIGHT HALF BLACK CIRCLE*/
+ 0, /* U+0025d8: INVERSE BULLET*/
+ 0, /* U+0025d9: INVERSE WHITE CIRCLE*/
+ 0, /* U+0025da: UPPER HALF INVERSE WHITE CIRCLE*/
+ 0, /* U+0025db: LOWER HALF INVERSE WHITE CIRCLE*/
+ 0, /* U+0025dc: UPPER LEFT QUADRANT CIRCULAR ARC*/
+ 0, /* U+0025dd: UPPER RIGHT QUADRANT CIRCULAR ARC*/
+ 0, /* U+0025de: LOWER RIGHT QUADRANT CIRCULAR ARC*/
+ 0, /* U+0025df: LOWER LEFT QUADRANT CIRCULAR ARC*/
+ 0, /* U+0025e0: UPPER HALF CIRCLE*/
+ 0, /* U+0025e1: LOWER HALF CIRCLE*/
+ 0, /* U+0025e2: BLACK LOWER RIGHT TRIANGLE*/
+ 0, /* U+0025e3: BLACK LOWER LEFT TRIANGLE*/
+ 0, /* U+0025e4: BLACK UPPER LEFT TRIANGLE*/
+ 0, /* U+0025e5: BLACK UPPER RIGHT TRIANGLE*/
+ 0, /* U+0025e6: WHITE BULLET*/
+ 0, /* U+0025e7: SQUARE WITH LEFT HALF BLACK*/
+ 0, /* U+0025e8: SQUARE WITH RIGHT HALF BLACK*/
+ 0, /* U+0025e9: SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK*/
+ 0, /* U+0025ea: SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK*/
+ 0, /* U+0025eb: WHITE SQUARE WITH VERTICAL BISECTING LINE*/
+ 0, /* U+0025ec: WHITE UP-POINTING TRIANGLE WITH DOT*/
+ 0, /* U+0025ed: UP-POINTING TRIANGLE WITH LEFT HALF BLACK*/
+ 0, /* U+0025ee: UP-POINTING TRIANGLE WITH RIGHT HALF BLACK*/
+ 0, /* U+0025ef: LARGE CIRCLE*/
+ 0, /* U+0025f0: WHITE SQUARE WITH UPPER LEFT QUADRANT*/
+ 0, /* U+0025f1: WHITE SQUARE WITH LOWER LEFT QUADRANT*/
+ 0, /* U+0025f2: WHITE SQUARE WITH LOWER RIGHT QUADRANT*/
+ 0, /* U+0025f3: WHITE SQUARE WITH UPPER RIGHT QUADRANT*/
+ 0, /* U+0025f4: WHITE CIRCLE WITH UPPER LEFT QUADRANT*/
+ 0, /* U+0025f5: WHITE CIRCLE WITH LOWER LEFT QUADRANT*/
+ 0, /* U+0025f6: WHITE CIRCLE WITH LOWER RIGHT QUADRANT*/
+ 0, /* U+0025f7: WHITE CIRCLE WITH UPPER RIGHT QUADRANT*/
+ 0, /* U+0025f8: UPPER LEFT TRIANGLE*/
+ 0, /* U+0025f9: UPPER RIGHT TRIANGLE*/
+ 0, /* U+0025fa: LOWER LEFT TRIANGLE*/
+ 0, /* U+0025fb: WHITE MEDIUM SQUARE*/
+ 0, /* U+0025fc: BLACK MEDIUM SQUARE*/
+ 0, /* U+0025fd: WHITE MEDIUM SMALL SQUARE*/
+ 0, /* U+0025fe: BLACK MEDIUM SMALL SQUARE*/
+ 0, /* U+0025ff: LOWER RIGHT TRIANGLE*/
+ 0, /* U+002600: BLACK SUN WITH RAYS*/
+ 0, /* U+002601: CLOUD*/
+ 0, /* U+002602: UMBRELLA*/
+ 0, /* U+002603: SNOWMAN*/
+ 0, /* U+002604: COMET*/
+ 0, /* U+002605: BLACK STAR*/
+ 0, /* U+002606: WHITE STAR*/
+ 0, /* U+002607: LIGHTNING*/
+ 0, /* U+002608: THUNDERSTORM*/
+ 0, /* U+002609: SUN*/
+ 0, /* U+00260a: ASCENDING NODE*/
+ 0, /* U+00260b: DESCENDING NODE*/
+ 0, /* U+00260c: CONJUNCTION*/
+ 0, /* U+00260d: OPPOSITION*/
+ 0, /* U+00260e: BLACK TELEPHONE*/
+ 0, /* U+00260f: WHITE TELEPHONE*/
+ 0, /* U+002610: BALLOT BOX*/
+ 0, /* U+002611: BALLOT BOX WITH CHECK*/
+ 0, /* U+002612: BALLOT BOX WITH X*/
+ 0, /* U+002613: SALTIRE*/
+ 0, /* U+002614: UMBRELLA WITH RAIN DROPS*/
+ 0, /* U+002615: HOT BEVERAGE*/
+ 0, /* U+002616: WHITE SHOGI PIECE*/
+ 0, /* U+002617: BLACK SHOGI PIECE*/
+ 0, /* U+002618: SHAMROCK*/
+ 0, /* U+002619: REVERSED ROTATED FLORAL HEART BULLET*/
+ 0, /* U+00261a: BLACK LEFT POINTING INDEX*/
+ 0, /* U+00261b: BLACK RIGHT POINTING INDEX*/
+ 0, /* U+00261c: WHITE LEFT POINTING INDEX*/
+ 0, /* U+00261d: WHITE UP POINTING INDEX*/
+ 0, /* U+00261e: WHITE RIGHT POINTING INDEX*/
+ 0, /* U+00261f: WHITE DOWN POINTING INDEX*/
+ 0, /* U+002620: SKULL AND CROSSBONES*/
+ 0, /* U+002621: CAUTION SIGN*/
+ 0, /* U+002622: RADIOACTIVE SIGN*/
+ 0, /* U+002623: BIOHAZARD SIGN*/
+ 0, /* U+002624: CADUCEUS*/
+ 0, /* U+002625: ANKH*/
+ 0, /* U+002626: ORTHODOX CROSS*/
+ 0, /* U+002627: CHI RHO*/
+ 0, /* U+002628: CROSS OF LORRAINE*/
+ 0, /* U+002629: CROSS OF JERUSALEM*/
+ 0, /* U+00262a: STAR AND CRESCENT*/
+ 0, /* U+00262b: FARSI SYMBOL*/
+ 0, /* U+00262c: ADI SHAKTI*/
+ 0, /* U+00262d: HAMMER AND SICKLE*/
+ 0, /* U+00262e: PEACE SYMBOL*/
+ 0, /* U+00262f: YIN YANG*/
+ 0, /* U+002630: TRIGRAM FOR HEAVEN*/
+ 0, /* U+002631: TRIGRAM FOR LAKE*/
+ 0, /* U+002632: TRIGRAM FOR FIRE*/
+ 0, /* U+002633: TRIGRAM FOR THUNDER*/
+ 0, /* U+002634: TRIGRAM FOR WIND*/
+ 0, /* U+002635: TRIGRAM FOR WATER*/
+ 0, /* U+002636: TRIGRAM FOR MOUNTAIN*/
+ 0, /* U+002637: TRIGRAM FOR EARTH*/
+ 0, /* U+002638: WHEEL OF DHARMA*/
+ 0, /* U+002639: WHITE FROWNING FACE*/
+ 0, /* U+00263a: WHITE SMILING FACE*/
+ 0, /* U+00263b: BLACK SMILING FACE*/
+ 0, /* U+00263c: WHITE SUN WITH RAYS*/
+ 0, /* U+00263d: FIRST QUARTER MOON*/
+ 0, /* U+00263e: LAST QUARTER MOON*/
+ 0, /* U+00263f: MERCURY*/
+ 0, /* U+002640: FEMALE SIGN*/
+ 0, /* U+002641: EARTH*/
+ 0, /* U+002642: MALE SIGN*/
+ 0, /* U+002643: JUPITER*/
+ 0, /* U+002644: SATURN*/
+ 0, /* U+002645: URANUS*/
+ 0, /* U+002646: NEPTUNE*/
+ 0, /* U+002647: PLUTO*/
+ 0, /* U+002648: ARIES*/
+ 0, /* U+002649: TAURUS*/
+ 0, /* U+00264a: GEMINI*/
+ 0, /* U+00264b: CANCER*/
+ 0, /* U+00264c: LEO*/
+ 0, /* U+00264d: VIRGO*/
+ 0, /* U+00264e: LIBRA*/
+ 0, /* U+00264f: SCORPIUS*/
+ 0, /* U+002650: SAGITTARIUS*/
+ 0, /* U+002651: CAPRICORN*/
+ 0, /* U+002652: AQUARIUS*/
+ 0, /* U+002653: PISCES*/
+ 0, /* U+002654: WHITE CHESS KING*/
+ 0, /* U+002655: WHITE CHESS QUEEN*/
+ 0, /* U+002656: WHITE CHESS ROOK*/
+ 0, /* U+002657: WHITE CHESS BISHOP*/
+ 0, /* U+002658: WHITE CHESS KNIGHT*/
+ 0, /* U+002659: WHITE CHESS PAWN*/
+ 0, /* U+00265a: BLACK CHESS KING*/
+ 0, /* U+00265b: BLACK CHESS QUEEN*/
+ 0, /* U+00265c: BLACK CHESS ROOK*/
+ 0, /* U+00265d: BLACK CHESS BISHOP*/
+ 0, /* U+00265e: BLACK CHESS KNIGHT*/
+ 0, /* U+00265f: BLACK CHESS PAWN*/
+ 0, /* U+002660: BLACK SPADE SUIT*/
+ 0, /* U+002661: WHITE HEART SUIT*/
+ 0, /* U+002662: WHITE DIAMOND SUIT*/
+ 0, /* U+002663: BLACK CLUB SUIT*/
+ 0, /* U+002664: WHITE SPADE SUIT*/
+ 0, /* U+002665: BLACK HEART SUIT*/
+ 0, /* U+002666: BLACK DIAMOND SUIT*/
+ 0, /* U+002667: WHITE CLUB SUIT*/
+ 0, /* U+002668: HOT SPRINGS*/
+ 0, /* U+002669: QUARTER NOTE*/
+ 0, /* U+00266a: EIGHTH NOTE*/
+ 0, /* U+00266b: BEAMED EIGHTH NOTES*/
+ 0, /* U+00266c: BEAMED SIXTEENTH NOTES*/
+ 0, /* U+00266d: MUSIC FLAT SIGN*/
+ 0, /* U+00266e: MUSIC NATURAL SIGN*/
+ 0, /* U+00266f: MUSIC SHARP SIGN*/
+ 0, /* U+002670: WEST SYRIAC CROSS*/
+ 0, /* U+002671: EAST SYRIAC CROSS*/
+ 0, /* U+002672: UNIVERSAL RECYCLING SYMBOL*/
+ 0, /* U+002673: RECYCLING SYMBOL FOR TYPE-1 PLASTICS*/
+ 0, /* U+002674: RECYCLING SYMBOL FOR TYPE-2 PLASTICS*/
+ 0, /* U+002675: RECYCLING SYMBOL FOR TYPE-3 PLASTICS*/
+ 0, /* U+002676: RECYCLING SYMBOL FOR TYPE-4 PLASTICS*/
+ 0, /* U+002677: RECYCLING SYMBOL FOR TYPE-5 PLASTICS*/
+ 0, /* U+002678: RECYCLING SYMBOL FOR TYPE-6 PLASTICS*/
+ 0, /* U+002679: RECYCLING SYMBOL FOR TYPE-7 PLASTICS*/
+ 0, /* U+00267a: RECYCLING SYMBOL FOR GENERIC MATERIALS*/
+ 0, /* U+00267b: BLACK UNIVERSAL RECYCLING SYMBOL*/
+ 0, /* U+00267c: RECYCLED PAPER SYMBOL*/
+ 0, /* U+00267d: PARTIALLY-RECYCLED PAPER SYMBOL*/
+ 0, /* U+00267e: PERMANENT PAPER SIGN*/
+ 0, /* U+00267f: WHEELCHAIR SYMBOL*/
+ 0, /* U+002680: DIE FACE-1*/
+ 0, /* U+002681: DIE FACE-2*/
+ 0, /* U+002682: DIE FACE-3*/
+ 0, /* U+002683: DIE FACE-4*/
+ 0, /* U+002684: DIE FACE-5*/
+ 0, /* U+002685: DIE FACE-6*/
+ 0, /* U+002686: WHITE CIRCLE WITH DOT RIGHT*/
+ 0, /* U+002687: WHITE CIRCLE WITH TWO DOTS*/
+ 0, /* U+002688: BLACK CIRCLE WITH WHITE DOT RIGHT*/
+ 0, /* U+002689: BLACK CIRCLE WITH TWO WHITE DOTS*/
+ 0, /* U+00268a: MONOGRAM FOR YANG*/
+ 0, /* U+00268b: MONOGRAM FOR YIN*/
+ 0, /* U+00268c: DIGRAM FOR GREATER YANG*/
+ 0, /* U+00268d: DIGRAM FOR LESSER YIN*/
+ 0, /* U+00268e: DIGRAM FOR LESSER YANG*/
+ 0, /* U+00268f: DIGRAM FOR GREATER YIN*/
+ 0, /* U+002690: WHITE FLAG*/
+ 0, /* U+002691: BLACK FLAG*/
+ 0, /* U+002692: HAMMER AND PICK*/
+ 0, /* U+002693: ANCHOR*/
+ 0, /* U+002694: CROSSED SWORDS*/
+ 0, /* U+002695: STAFF OF AESCULAPIUS*/
+ 0, /* U+002696: SCALES*/
+ 0, /* U+002697: ALEMBIC*/
+ 0, /* U+002698: FLOWER*/
+ 0, /* U+002699: GEAR*/
+ 0, /* U+00269a: STAFF OF HERMES*/
+ 0, /* U+00269b: ATOM SYMBOL*/
+ 0, /* U+00269c: FLEUR-DE-LIS*/
+ 0, /* U+00269d: OUTLINED WHITE STAR*/
+ 0, /* U+00269e: THREE LINES CONVERGING RIGHT*/
+ 0, /* U+00269f: THREE LINES CONVERGING LEFT*/
+ 0, /* U+0026a0: WARNING SIGN*/
+ 0, /* U+0026a1: HIGH VOLTAGE SIGN*/
+ 0, /* U+0026a2: DOUBLED FEMALE SIGN*/
+ 0, /* U+0026a3: DOUBLED MALE SIGN*/
+ 0, /* U+0026a4: INTERLOCKED FEMALE AND MALE SIGN*/
+ 0, /* U+0026a5: MALE AND FEMALE SIGN*/
+ 0, /* U+0026a6: MALE WITH STROKE SIGN*/
+ 0, /* U+0026a7: MALE WITH STROKE AND MALE AND FEMALE SIGN*/
+ 0, /* U+0026a8: VERTICAL MALE WITH STROKE SIGN*/
+ 0, /* U+0026a9: HORIZONTAL MALE WITH STROKE SIGN*/
+ 0, /* U+0026aa: MEDIUM WHITE CIRCLE*/
+ 0, /* U+0026ab: MEDIUM BLACK CIRCLE*/
+ 0, /* U+0026ac: MEDIUM SMALL WHITE CIRCLE*/
+ 0, /* U+0026ad: MARRIAGE SYMBOL*/
+ 0, /* U+0026ae: DIVORCE SYMBOL*/
+ 0, /* U+0026af: UNMARRIED PARTNERSHIP SYMBOL*/
+ 0, /* U+0026b0: COFFIN*/
+ 0, /* U+0026b1: FUNERAL URN*/
+ 0, /* U+0026b2: NEUTER*/
+ 0, /* U+0026b3: CERES*/
+ 0, /* U+0026b4: PALLAS*/
+ 0, /* U+0026b5: JUNO*/
+ 0, /* U+0026b6: VESTA*/
+ 0, /* U+0026b7: CHIRON*/
+ 0, /* U+0026b8: BLACK MOON LILITH*/
+ 0, /* U+0026b9: SEXTILE*/
+ 0, /* U+0026ba: SEMISEXTILE*/
+ 0, /* U+0026bb: QUINCUNX*/
+ 0, /* U+0026bc: SESQUIQUADRATE*/
+ 0, /* U+0026bd: SOCCER BALL*/
+ 0, /* U+0026be: BASEBALL*/
+ 0, /* U+0026bf: SQUARED KEY*/
+ 0, /* U+0026c0: WHITE DRAUGHTS MAN*/
+ 0, /* U+0026c1: WHITE DRAUGHTS KING*/
+ 0, /* U+0026c2: BLACK DRAUGHTS MAN*/
+ 0, /* U+0026c3: BLACK DRAUGHTS KING*/
+ 0, /* U+0026c4: SNOWMAN WITHOUT SNOW*/
+ 0, /* U+0026c5: SUN BEHIND CLOUD*/
+ 0, /* U+0026c6: RAIN*/
+ 0, /* U+0026c7: BLACK SNOWMAN*/
+ 0, /* U+0026c8: THUNDER CLOUD AND RAIN*/
+ 0, /* U+0026c9: TURNED WHITE SHOGI PIECE*/
+ 0, /* U+0026ca: TURNED BLACK SHOGI PIECE*/
+ 0, /* U+0026cb: WHITE DIAMOND IN SQUARE*/
+ 0, /* U+0026cc: CROSSING LANES*/
+ 0, /* U+0026cd: DISABLED CAR*/
+ 0, /* U+0026ce: OPHIUCHUS*/
+ 0, /* U+0026cf: PICK*/
+ 0, /* U+0026d0: CAR SLIDING*/
+ 0, /* U+0026d1: HELMET WITH WHITE CROSS*/
+ 0, /* U+0026d2: CIRCLED CROSSING LANES*/
+ 0, /* U+0026d3: CHAINS*/
+ 0, /* U+0026d4: NO ENTRY*/
+ 0, /* U+0026d5: ALTERNATE ONE-WAY LEFT WAY TRAFFIC*/
+ 0, /* U+0026d6: BLACK TWO-WAY LEFT WAY TRAFFIC*/
+ 0, /* U+0026d7: WHITE TWO-WAY LEFT WAY TRAFFIC*/
+ 0, /* U+0026d8: BLACK LEFT LANE MERGE*/
+ 0, /* U+0026d9: WHITE LEFT LANE MERGE*/
+ 0, /* U+0026da: DRIVE SLOW SIGN*/
+ 0, /* U+0026db: HEAVY WHITE DOWN-POINTING TRIANGLE*/
+ 0, /* U+0026dc: LEFT CLOSED ENTRY*/
+ 0, /* U+0026dd: SQUARED SALTIRE*/
+ 0, /* U+0026de: FALLING DIAGONAL IN WHITE CIRCLE IN BLACK SQUARE*/
+ 0, /* U+0026df: BLACK TRUCK*/
+ 0, /* U+0026e0: RESTRICTED LEFT ENTRY-1*/
+ 0, /* U+0026e1: RESTRICTED LEFT ENTRY-2*/
+ 0, /* U+0026e2: ASTRONOMICAL SYMBOL FOR URANUS*/
+ 0, /* U+0026e3: HEAVY CIRCLE WITH STROKE AND TWO DOTS ABOVE*/
+ 0, /* U+0026e4: PENTAGRAM*/
+ 0, /* U+0026e5: RIGHT-HANDED INTERLACED PENTAGRAM*/
+ 0, /* U+0026e6: LEFT-HANDED INTERLACED PENTAGRAM*/
+ 0, /* U+0026e7: INVERTED PENTAGRAM*/
+ 0, /* U+0026e8: BLACK CROSS ON SHIELD*/
+ 0, /* U+0026e9: SHINTO SHRINE*/
+ 0, /* U+0026ea: CHURCH*/
+ 0, /* U+0026eb: CASTLE*/
+ 0, /* U+0026ec: HISTORIC SITE*/
+ 0, /* U+0026ed: GEAR WITHOUT HUB*/
+ 0, /* U+0026ee: GEAR WITH HANDLES*/
+ 0, /* U+0026ef: MAP SYMBOL FOR LIGHTHOUSE*/
+ 0, /* U+0026f0: MOUNTAIN*/
+ 0, /* U+0026f1: UMBRELLA ON GROUND*/
+ 0, /* U+0026f2: FOUNTAIN*/
+ 0, /* U+0026f3: FLAG IN HOLE*/
+ 0, /* U+0026f4: FERRY*/
+ 0, /* U+0026f5: SAILBOAT*/
+ 0, /* U+0026f6: SQUARE FOUR CORNERS*/
+ 0, /* U+0026f7: SKIER*/
+ 0, /* U+0026f8: ICE SKATE*/
+ 0, /* U+0026f9: PERSON WITH BALL*/
+ 0, /* U+0026fa: TENT*/
+ 0, /* U+0026fb: JAPANESE BANK SYMBOL*/
+ 0, /* U+0026fc: HEADSTONE GRAVEYARD SYMBOL*/
+ 0, /* U+0026fd: FUEL PUMP*/
+ 0, /* U+0026fe: CUP ON BLACK SQUARE*/
+ 0, /* U+0026ff: WHITE FLAG WITH HORIZONTAL MIDDLE BLACK STRIPE*/
+ 0, /* U+002700: */
+ 0, /* U+002701: UPPER BLADE SCISSORS*/
+ 0, /* U+002702: BLACK SCISSORS*/
+ 0, /* U+002703: LOWER BLADE SCISSORS*/
+ 0, /* U+002704: WHITE SCISSORS*/
+ 0, /* U+002705: WHITE HEAVY CHECK MARK*/
+ 0, /* U+002706: TELEPHONE LOCATION SIGN*/
+ 0, /* U+002707: TAPE DRIVE*/
+ 0, /* U+002708: AIRPLANE*/
+ 0, /* U+002709: ENVELOPE*/
+ 0, /* U+00270a: RAISED FIST*/
+ 0, /* U+00270b: RAISED HAND*/
+ 0, /* U+00270c: VICTORY HAND*/
+ 0, /* U+00270d: WRITING HAND*/
+ 0, /* U+00270e: LOWER RIGHT PENCIL*/
+ 0, /* U+00270f: PENCIL*/
+ 0, /* U+002710: UPPER RIGHT PENCIL*/
+ 0, /* U+002711: WHITE NIB*/
+ 0, /* U+002712: BLACK NIB*/
+ 0, /* U+002713: CHECK MARK*/
+ 0, /* U+002714: HEAVY CHECK MARK*/
+ 0, /* U+002715: MULTIPLICATION X*/
+ 0, /* U+002716: HEAVY MULTIPLICATION X*/
+ 0, /* U+002717: BALLOT X*/
+ 0, /* U+002718: HEAVY BALLOT X*/
+ 0, /* U+002719: OUTLINED GREEK CROSS*/
+ 0, /* U+00271a: HEAVY GREEK CROSS*/
+ 0, /* U+00271b: OPEN CENTRE CROSS*/
+ 0, /* U+00271c: HEAVY OPEN CENTRE CROSS*/
+ 0, /* U+00271d: LATIN CROSS*/
+ 0, /* U+00271e: SHADOWED WHITE LATIN CROSS*/
+ 0, /* U+00271f: OUTLINED LATIN CROSS*/
+ 0, /* U+002720: MALTESE CROSS*/
+ 0, /* U+002721: STAR OF DAVID*/
+ 0, /* U+002722: FOUR TEARDROP-SPOKED ASTERISK*/
+ 0, /* U+002723: FOUR BALLOON-SPOKED ASTERISK*/
+ 0, /* U+002724: HEAVY FOUR BALLOON-SPOKED ASTERISK*/
+ 0, /* U+002725: FOUR CLUB-SPOKED ASTERISK*/
+ 0, /* U+002726: BLACK FOUR POINTED STAR*/
+ 0, /* U+002727: WHITE FOUR POINTED STAR*/
+ 0, /* U+002728: SPARKLES*/
+ 0, /* U+002729: STRESS OUTLINED WHITE STAR*/
+ 0, /* U+00272a: CIRCLED WHITE STAR*/
+ 0, /* U+00272b: OPEN CENTRE BLACK STAR*/
+ 0, /* U+00272c: BLACK CENTRE WHITE STAR*/
+ 0, /* U+00272d: OUTLINED BLACK STAR*/
+ 0, /* U+00272e: HEAVY OUTLINED BLACK STAR*/
+ 0, /* U+00272f: PINWHEEL STAR*/
+ 0, /* U+002730: SHADOWED WHITE STAR*/
+ 0, /* U+002731: HEAVY ASTERISK*/
+ 0, /* U+002732: OPEN CENTRE ASTERISK*/
+ 0, /* U+002733: EIGHT SPOKED ASTERISK*/
+ 0, /* U+002734: EIGHT POINTED BLACK STAR*/
+ 0, /* U+002735: EIGHT POINTED PINWHEEL STAR*/
+ 0, /* U+002736: SIX POINTED BLACK STAR*/
+ 0, /* U+002737: EIGHT POINTED RECTILINEAR BLACK STAR*/
+ 0, /* U+002738: HEAVY EIGHT POINTED RECTILINEAR BLACK STAR*/
+ 0, /* U+002739: TWELVE POINTED BLACK STAR*/
+ 0, /* U+00273a: SIXTEEN POINTED ASTERISK*/
+ 0, /* U+00273b: TEARDROP-SPOKED ASTERISK*/
+ 0, /* U+00273c: OPEN CENTRE TEARDROP-SPOKED ASTERISK*/
+ 0, /* U+00273d: HEAVY TEARDROP-SPOKED ASTERISK*/
+ 0, /* U+00273e: SIX PETALLED BLACK AND WHITE FLORETTE*/
+ 0, /* U+00273f: BLACK FLORETTE*/
+ 0, /* U+002740: WHITE FLORETTE*/
+ 0, /* U+002741: EIGHT PETALLED OUTLINED BLACK FLORETTE*/
+ 0, /* U+002742: CIRCLED OPEN CENTRE EIGHT POINTED STAR*/
+ 0, /* U+002743: HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK*/
+ 0, /* U+002744: SNOWFLAKE*/
+ 0, /* U+002745: TIGHT TRIFOLIATE SNOWFLAKE*/
+ 0, /* U+002746: HEAVY CHEVRON SNOWFLAKE*/
+ 0, /* U+002747: SPARKLE*/
+ 0, /* U+002748: HEAVY SPARKLE*/
+ 0, /* U+002749: BALLOON-SPOKED ASTERISK*/
+ 0, /* U+00274a: EIGHT TEARDROP-SPOKED PROPELLER ASTERISK*/
+ 0, /* U+00274b: HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK*/
+ 0, /* U+00274c: CROSS MARK*/
+ 0, /* U+00274d: SHADOWED WHITE CIRCLE*/
+ 0, /* U+00274e: NEGATIVE SQUARED CROSS MARK*/
+ 0, /* U+00274f: LOWER RIGHT DROP-SHADOWED WHITE SQUARE*/
+ 0, /* U+002750: UPPER RIGHT DROP-SHADOWED WHITE SQUARE*/
+ 0, /* U+002751: LOWER RIGHT SHADOWED WHITE SQUARE*/
+ 0, /* U+002752: UPPER RIGHT SHADOWED WHITE SQUARE*/
+ 0, /* U+002753: BLACK QUESTION MARK ORNAMENT*/
+ 0, /* U+002754: WHITE QUESTION MARK ORNAMENT*/
+ 0, /* U+002755: WHITE EXCLAMATION MARK ORNAMENT*/
+ 0, /* U+002756: BLACK DIAMOND MINUS WHITE X*/
+ 0, /* U+002757: HEAVY EXCLAMATION MARK SYMBOL*/
+ 0, /* U+002758: LIGHT VERTICAL BAR*/
+ 0, /* U+002759: MEDIUM VERTICAL BAR*/
+ 0, /* U+00275a: HEAVY VERTICAL BAR*/
+ 0, /* U+00275b: HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT*/
+ 0, /* U+00275c: HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT*/
+ 0, /* U+00275d: HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT*/
+ 0, /* U+00275e: HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT*/
+ 0, /* U+00275f: HEAVY LOW SINGLE COMMA QUOTATION MARK ORNAMENT*/
+ 0, /* U+002760: HEAVY LOW DOUBLE COMMA QUOTATION MARK ORNAMENT*/
+ 0, /* U+002761: CURVED STEM PARAGRAPH SIGN ORNAMENT*/
+ 0, /* U+002762: HEAVY EXCLAMATION MARK ORNAMENT*/
+ 0, /* U+002763: HEAVY HEART EXCLAMATION MARK ORNAMENT*/
+ 0, /* U+002764: HEAVY BLACK HEART*/
+ 0, /* U+002765: ROTATED HEAVY BLACK HEART BULLET*/
+ 0, /* U+002766: FLORAL HEART*/
+ 0, /* U+002767: ROTATED FLORAL HEART BULLET*/
+ 0, /* U+002768: MEDIUM LEFT PARENTHESIS ORNAMENT*/
+ 0, /* U+002769: MEDIUM RIGHT PARENTHESIS ORNAMENT*/
+ 0, /* U+00276a: MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT*/
+ 0, /* U+00276b: MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT*/
+ 0, /* U+00276c: MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT*/
+ 0, /* U+00276d: MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT*/
+ 0, /* U+00276e: HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT*/
+ 0, /* U+00276f: HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT*/
+ 0, /* U+002770: HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT*/
+ 0, /* U+002771: HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT*/
+ 0, /* U+002772: LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT*/
+ 0, /* U+002773: LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT*/
+ 0, /* U+002774: MEDIUM LEFT CURLY BRACKET ORNAMENT*/
+ 0, /* U+002775: MEDIUM RIGHT CURLY BRACKET ORNAMENT*/
+ 0, /* U+002776: DINGBAT NEGATIVE CIRCLED DIGIT ONE*/
+ 0, /* U+002777: DINGBAT NEGATIVE CIRCLED DIGIT TWO*/
+ 0, /* U+002778: DINGBAT NEGATIVE CIRCLED DIGIT THREE*/
+ 0, /* U+002779: DINGBAT NEGATIVE CIRCLED DIGIT FOUR*/
+ 0, /* U+00277a: DINGBAT NEGATIVE CIRCLED DIGIT FIVE*/
+ 0, /* U+00277b: DINGBAT NEGATIVE CIRCLED DIGIT SIX*/
+ 0, /* U+00277c: DINGBAT NEGATIVE CIRCLED DIGIT SEVEN*/
+ 0, /* U+00277d: DINGBAT NEGATIVE CIRCLED DIGIT EIGHT*/
+ 0, /* U+00277e: DINGBAT NEGATIVE CIRCLED DIGIT NINE*/
+ 0, /* U+00277f: DINGBAT NEGATIVE CIRCLED NUMBER TEN*/
+ 0, /* U+002780: DINGBAT CIRCLED SANS-SERIF DIGIT ONE*/
+ 0, /* U+002781: DINGBAT CIRCLED SANS-SERIF DIGIT TWO*/
+ 0, /* U+002782: DINGBAT CIRCLED SANS-SERIF DIGIT THREE*/
+ 0, /* U+002783: DINGBAT CIRCLED SANS-SERIF DIGIT FOUR*/
+ 0, /* U+002784: DINGBAT CIRCLED SANS-SERIF DIGIT FIVE*/
+ 0, /* U+002785: DINGBAT CIRCLED SANS-SERIF DIGIT SIX*/
+ 0, /* U+002786: DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN*/
+ 0, /* U+002787: DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT*/
+ 0, /* U+002788: DINGBAT CIRCLED SANS-SERIF DIGIT NINE*/
+ 0, /* U+002789: DINGBAT CIRCLED SANS-SERIF NUMBER TEN*/
+ 0, /* U+00278a: DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE*/
+ 0, /* U+00278b: DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO*/
+ 0, /* U+00278c: DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE*/
+ 0, /* U+00278d: DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR*/
+ 0, /* U+00278e: DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE*/
+ 0, /* U+00278f: DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX*/
+ 0, /* U+002790: DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN*/
+ 0, /* U+002791: DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT*/
+ 0, /* U+002792: DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE*/
+ 0, /* U+002793: DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN*/
+ 0, /* U+002794: HEAVY WIDE-HEADED RIGHTWARDS ARROW*/
+ 0, /* U+002795: HEAVY PLUS SIGN*/
+ 0, /* U+002796: HEAVY MINUS SIGN*/
+ 0, /* U+002797: HEAVY DIVISION SIGN*/
+ 0, /* U+002798: HEAVY SOUTH EAST ARROW*/
+ 0, /* U+002799: HEAVY RIGHTWARDS ARROW*/
+ 0, /* U+00279a: HEAVY NORTH EAST ARROW*/
+ 0, /* U+00279b: DRAFTING POINT RIGHTWARDS ARROW*/
+ 0, /* U+00279c: HEAVY ROUND-TIPPED RIGHTWARDS ARROW*/
+ 0, /* U+00279d: TRIANGLE-HEADED RIGHTWARDS ARROW*/
+ 0, /* U+00279e: HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW*/
+ 0, /* U+00279f: DASHED TRIANGLE-HEADED RIGHTWARDS ARROW*/
+ 0, /* U+0027a0: HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW*/
+ 0, /* U+0027a1: BLACK RIGHTWARDS ARROW*/
+ 0, /* U+0027a2: THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD*/
+ 0, /* U+0027a3: THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD*/
+ 0, /* U+0027a4: BLACK RIGHTWARDS ARROWHEAD*/
+ 0, /* U+0027a5: HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW*/
+ 0, /* U+0027a6: HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW*/
+ 0, /* U+0027a7: SQUAT BLACK RIGHTWARDS ARROW*/
+ 0, /* U+0027a8: HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW*/
+ 0, /* U+0027a9: RIGHT-SHADED WHITE RIGHTWARDS ARROW*/
+ 0, /* U+0027aa: LEFT-SHADED WHITE RIGHTWARDS ARROW*/
+ 0, /* U+0027ab: BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW*/
+ 0, /* U+0027ac: FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW*/
+ 0, /* U+0027ad: HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW*/
+ 0, /* U+0027ae: HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW*/
+ 0, /* U+0027af: NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW*/
+ 0, /* U+0027b0: CURLY LOOP*/
+ 0, /* U+0027b1: NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW*/
+ 0, /* U+0027b2: CIRCLED HEAVY WHITE RIGHTWARDS ARROW*/
+ 0, /* U+0027b3: WHITE-FEATHERED RIGHTWARDS ARROW*/
+ 0, /* U+0027b4: BLACK-FEATHERED SOUTH EAST ARROW*/
+ 0, /* U+0027b5: BLACK-FEATHERED RIGHTWARDS ARROW*/
+ 0, /* U+0027b6: BLACK-FEATHERED NORTH EAST ARROW*/
+ 0, /* U+0027b7: HEAVY BLACK-FEATHERED SOUTH EAST ARROW*/
+ 0, /* U+0027b8: HEAVY BLACK-FEATHERED RIGHTWARDS ARROW*/
+ 0, /* U+0027b9: HEAVY BLACK-FEATHERED NORTH EAST ARROW*/
+ 0, /* U+0027ba: TEARDROP-BARBED RIGHTWARDS ARROW*/
+ 0, /* U+0027bb: HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW*/
+ 0, /* U+0027bc: WEDGE-TAILED RIGHTWARDS ARROW*/
+ 0, /* U+0027bd: HEAVY WEDGE-TAILED RIGHTWARDS ARROW*/
+ 0, /* U+0027be: OPEN-OUTLINED RIGHTWARDS ARROW*/
+ 0, /* U+0027bf: DOUBLE CURLY LOOP*/
+ 0, /* U+0027c0: THREE DIMENSIONAL ANGLE*/
+ 0, /* U+0027c1: WHITE TRIANGLE CONTAINING SMALL WHITE TRIANGLE*/
+ 0, /* U+0027c2: PERPENDICULAR*/
+ 0, /* U+0027c3: OPEN SUBSET*/
+ 0, /* U+0027c4: OPEN SUPERSET*/
+ 0, /* U+0027c5: LEFT S-SHAPED BAG DELIMITER*/
+ 0, /* U+0027c6: RIGHT S-SHAPED BAG DELIMITER*/
+ 0, /* U+0027c7: OR WITH DOT INSIDE*/
+ 0, /* U+0027c8: REVERSE SOLIDUS PRECEDING SUBSET*/
+ 0, /* U+0027c9: SUPERSET PRECEDING SOLIDUS*/
+ 0, /* U+0027ca: VERTICAL BAR WITH HORIZONTAL STROKE*/
+ 0, /* U+0027cb: MATHEMATICAL RISING DIAGONAL*/
+ 0, /* U+0027cc: LONG DIVISION*/
+ 0, /* U+0027cd: MATHEMATICAL FALLING DIAGONAL*/
+ 0, /* U+0027ce: SQUARED LOGICAL AND*/
+ 0, /* U+0027cf: SQUARED LOGICAL OR*/
+ 0, /* U+0027d0: WHITE DIAMOND WITH CENTRED DOT*/
+ 0, /* U+0027d1: AND WITH DOT*/
+ 0, /* U+0027d2: ELEMENT OF OPENING UPWARDS*/
+ 0, /* U+0027d3: LOWER RIGHT CORNER WITH DOT*/
+ 0, /* U+0027d4: UPPER LEFT CORNER WITH DOT*/
+ 0, /* U+0027d5: LEFT OUTER JOIN*/
+ 0, /* U+0027d6: RIGHT OUTER JOIN*/
+ 0, /* U+0027d7: FULL OUTER JOIN*/
+ 0, /* U+0027d8: LARGE UP TACK*/
+ 0, /* U+0027d9: LARGE DOWN TACK*/
+ 0, /* U+0027da: LEFT AND RIGHT DOUBLE TURNSTILE*/
+ 0, /* U+0027db: LEFT AND RIGHT TACK*/
+ 0, /* U+0027dc: LEFT MULTIMAP*/
+ 0, /* U+0027dd: LONG RIGHT TACK*/
+ 0, /* U+0027de: LONG LEFT TACK*/
+ 0, /* U+0027df: UP TACK WITH CIRCLE ABOVE*/
+ 0, /* U+0027e0: LOZENGE DIVIDED BY HORIZONTAL RULE*/
+ 0, /* U+0027e1: WHITE CONCAVE-SIDED DIAMOND*/
+ 0, /* U+0027e2: WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK*/
+ 0, /* U+0027e3: WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK*/
+ 0, /* U+0027e4: WHITE SQUARE WITH LEFTWARDS TICK*/
+ 0, /* U+0027e5: WHITE SQUARE WITH RIGHTWARDS TICK*/
+ 0, /* U+0027e6: MATHEMATICAL LEFT WHITE SQUARE BRACKET*/
+ 0, /* U+0027e7: MATHEMATICAL RIGHT WHITE SQUARE BRACKET*/
+ 0, /* U+0027e8: MATHEMATICAL LEFT ANGLE BRACKET*/
+ 0, /* U+0027e9: MATHEMATICAL RIGHT ANGLE BRACKET*/
+ 0, /* U+0027ea: MATHEMATICAL LEFT DOUBLE ANGLE BRACKET*/
+ 0, /* U+0027eb: MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET*/
+ 0, /* U+0027ec: MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET*/
+ 0, /* U+0027ed: MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET*/
+ 0, /* U+0027ee: MATHEMATICAL LEFT FLATTENED PARENTHESIS*/
+ 0, /* U+0027ef: MATHEMATICAL RIGHT FLATTENED PARENTHESIS*/
+ 0, /* U+0027f0: UPWARDS QUADRUPLE ARROW*/
+ 0, /* U+0027f1: DOWNWARDS QUADRUPLE ARROW*/
+ 0, /* U+0027f2: ANTICLOCKWISE GAPPED CIRCLE ARROW*/
+ 0, /* U+0027f3: CLOCKWISE GAPPED CIRCLE ARROW*/
+ 0, /* U+0027f4: RIGHT ARROW WITH CIRCLED PLUS*/
+ 0, /* U+0027f5: LONG LEFTWARDS ARROW*/
+ 0, /* U+0027f6: LONG RIGHTWARDS ARROW*/
+ 0, /* U+0027f7: LONG LEFT RIGHT ARROW*/
+ 0, /* U+0027f8: LONG LEFTWARDS DOUBLE ARROW*/
+ 0, /* U+0027f9: LONG RIGHTWARDS DOUBLE ARROW*/
+ 0, /* U+0027fa: LONG LEFT RIGHT DOUBLE ARROW*/
+ 0, /* U+0027fb: LONG LEFTWARDS ARROW FROM BAR*/
+ 0, /* U+0027fc: LONG RIGHTWARDS ARROW FROM BAR*/
+ 0, /* U+0027fd: LONG LEFTWARDS DOUBLE ARROW FROM BAR*/
+ 0, /* U+0027fe: LONG RIGHTWARDS DOUBLE ARROW FROM BAR*/
+ 0, /* U+0027ff: LONG RIGHTWARDS SQUIGGLE ARROW*/
+ 0, /* U+002800: BRAILLE PATTERN BLANK*/
+ 0, /* U+002801: BRAILLE PATTERN DOTS-1*/
+ 0, /* U+002802: BRAILLE PATTERN DOTS-2*/
+ 0, /* U+002803: BRAILLE PATTERN DOTS-12*/
+ 0, /* U+002804: BRAILLE PATTERN DOTS-3*/
+ 0, /* U+002805: BRAILLE PATTERN DOTS-13*/
+ 0, /* U+002806: BRAILLE PATTERN DOTS-23*/
+ 0, /* U+002807: BRAILLE PATTERN DOTS-123*/
+ 0, /* U+002808: BRAILLE PATTERN DOTS-4*/
+ 0, /* U+002809: BRAILLE PATTERN DOTS-14*/
+ 0, /* U+00280a: BRAILLE PATTERN DOTS-24*/
+ 0, /* U+00280b: BRAILLE PATTERN DOTS-124*/
+ 0, /* U+00280c: BRAILLE PATTERN DOTS-34*/
+ 0, /* U+00280d: BRAILLE PATTERN DOTS-134*/
+ 0, /* U+00280e: BRAILLE PATTERN DOTS-234*/
+ 0, /* U+00280f: BRAILLE PATTERN DOTS-1234*/
+ 0, /* U+002810: BRAILLE PATTERN DOTS-5*/
+ 0, /* U+002811: BRAILLE PATTERN DOTS-15*/
+ 0, /* U+002812: BRAILLE PATTERN DOTS-25*/
+ 0, /* U+002813: BRAILLE PATTERN DOTS-125*/
+ 0, /* U+002814: BRAILLE PATTERN DOTS-35*/
+ 0, /* U+002815: BRAILLE PATTERN DOTS-135*/
+ 0, /* U+002816: BRAILLE PATTERN DOTS-235*/
+ 0, /* U+002817: BRAILLE PATTERN DOTS-1235*/
+ 0, /* U+002818: BRAILLE PATTERN DOTS-45*/
+ 0, /* U+002819: BRAILLE PATTERN DOTS-145*/
+ 0, /* U+00281a: BRAILLE PATTERN DOTS-245*/
+ 0, /* U+00281b: BRAILLE PATTERN DOTS-1245*/
+ 0, /* U+00281c: BRAILLE PATTERN DOTS-345*/
+ 0, /* U+00281d: BRAILLE PATTERN DOTS-1345*/
+ 0, /* U+00281e: BRAILLE PATTERN DOTS-2345*/
+ 0, /* U+00281f: BRAILLE PATTERN DOTS-12345*/
+ 0, /* U+002820: BRAILLE PATTERN DOTS-6*/
+ 0, /* U+002821: BRAILLE PATTERN DOTS-16*/
+ 0, /* U+002822: BRAILLE PATTERN DOTS-26*/
+ 0, /* U+002823: BRAILLE PATTERN DOTS-126*/
+ 0, /* U+002824: BRAILLE PATTERN DOTS-36*/
+ 0, /* U+002825: BRAILLE PATTERN DOTS-136*/
+ 0, /* U+002826: BRAILLE PATTERN DOTS-236*/
+ 0, /* U+002827: BRAILLE PATTERN DOTS-1236*/
+ 0, /* U+002828: BRAILLE PATTERN DOTS-46*/
+ 0, /* U+002829: BRAILLE PATTERN DOTS-146*/
+ 0, /* U+00282a: BRAILLE PATTERN DOTS-246*/
+ 0, /* U+00282b: BRAILLE PATTERN DOTS-1246*/
+ 0, /* U+00282c: BRAILLE PATTERN DOTS-346*/
+ 0, /* U+00282d: BRAILLE PATTERN DOTS-1346*/
+ 0, /* U+00282e: BRAILLE PATTERN DOTS-2346*/
+ 0, /* U+00282f: BRAILLE PATTERN DOTS-12346*/
+ 0, /* U+002830: BRAILLE PATTERN DOTS-56*/
+ 0, /* U+002831: BRAILLE PATTERN DOTS-156*/
+ 0, /* U+002832: BRAILLE PATTERN DOTS-256*/
+ 0, /* U+002833: BRAILLE PATTERN DOTS-1256*/
+ 0, /* U+002834: BRAILLE PATTERN DOTS-356*/
+ 0, /* U+002835: BRAILLE PATTERN DOTS-1356*/
+ 0, /* U+002836: BRAILLE PATTERN DOTS-2356*/
+ 0, /* U+002837: BRAILLE PATTERN DOTS-12356*/
+ 0, /* U+002838: BRAILLE PATTERN DOTS-456*/
+ 0, /* U+002839: BRAILLE PATTERN DOTS-1456*/
+ 0, /* U+00283a: BRAILLE PATTERN DOTS-2456*/
+ 0, /* U+00283b: BRAILLE PATTERN DOTS-12456*/
+ 0, /* U+00283c: BRAILLE PATTERN DOTS-3456*/
+ 0, /* U+00283d: BRAILLE PATTERN DOTS-13456*/
+ 0, /* U+00283e: BRAILLE PATTERN DOTS-23456*/
+ 0, /* U+00283f: BRAILLE PATTERN DOTS-123456*/
+ 0, /* U+002840: BRAILLE PATTERN DOTS-7*/
+ 0, /* U+002841: BRAILLE PATTERN DOTS-17*/
+ 0, /* U+002842: BRAILLE PATTERN DOTS-27*/
+ 0, /* U+002843: BRAILLE PATTERN DOTS-127*/
+ 0, /* U+002844: BRAILLE PATTERN DOTS-37*/
+ 0, /* U+002845: BRAILLE PATTERN DOTS-137*/
+ 0, /* U+002846: BRAILLE PATTERN DOTS-237*/
+ 0, /* U+002847: BRAILLE PATTERN DOTS-1237*/
+ 0, /* U+002848: BRAILLE PATTERN DOTS-47*/
+ 0, /* U+002849: BRAILLE PATTERN DOTS-147*/
+ 0, /* U+00284a: BRAILLE PATTERN DOTS-247*/
+ 0, /* U+00284b: BRAILLE PATTERN DOTS-1247*/
+ 0, /* U+00284c: BRAILLE PATTERN DOTS-347*/
+ 0, /* U+00284d: BRAILLE PATTERN DOTS-1347*/
+ 0, /* U+00284e: BRAILLE PATTERN DOTS-2347*/
+ 0, /* U+00284f: BRAILLE PATTERN DOTS-12347*/
+ 0, /* U+002850: BRAILLE PATTERN DOTS-57*/
+ 0, /* U+002851: BRAILLE PATTERN DOTS-157*/
+ 0, /* U+002852: BRAILLE PATTERN DOTS-257*/
+ 0, /* U+002853: BRAILLE PATTERN DOTS-1257*/
+ 0, /* U+002854: BRAILLE PATTERN DOTS-357*/
+ 0, /* U+002855: BRAILLE PATTERN DOTS-1357*/
+ 0, /* U+002856: BRAILLE PATTERN DOTS-2357*/
+ 0, /* U+002857: BRAILLE PATTERN DOTS-12357*/
+ 0, /* U+002858: BRAILLE PATTERN DOTS-457*/
+ 0, /* U+002859: BRAILLE PATTERN DOTS-1457*/
+ 0, /* U+00285a: BRAILLE PATTERN DOTS-2457*/
+ 0, /* U+00285b: BRAILLE PATTERN DOTS-12457*/
+ 0, /* U+00285c: BRAILLE PATTERN DOTS-3457*/
+ 0, /* U+00285d: BRAILLE PATTERN DOTS-13457*/
+ 0, /* U+00285e: BRAILLE PATTERN DOTS-23457*/
+ 0, /* U+00285f: BRAILLE PATTERN DOTS-123457*/
+ 0, /* U+002860: BRAILLE PATTERN DOTS-67*/
+ 0, /* U+002861: BRAILLE PATTERN DOTS-167*/
+ 0, /* U+002862: BRAILLE PATTERN DOTS-267*/
+ 0, /* U+002863: BRAILLE PATTERN DOTS-1267*/
+ 0, /* U+002864: BRAILLE PATTERN DOTS-367*/
+ 0, /* U+002865: BRAILLE PATTERN DOTS-1367*/
+ 0, /* U+002866: BRAILLE PATTERN DOTS-2367*/
+ 0, /* U+002867: BRAILLE PATTERN DOTS-12367*/
+ 0, /* U+002868: BRAILLE PATTERN DOTS-467*/
+ 0, /* U+002869: BRAILLE PATTERN DOTS-1467*/
+ 0, /* U+00286a: BRAILLE PATTERN DOTS-2467*/
+ 0, /* U+00286b: BRAILLE PATTERN DOTS-12467*/
+ 0, /* U+00286c: BRAILLE PATTERN DOTS-3467*/
+ 0, /* U+00286d: BRAILLE PATTERN DOTS-13467*/
+ 0, /* U+00286e: BRAILLE PATTERN DOTS-23467*/
+ 0, /* U+00286f: BRAILLE PATTERN DOTS-123467*/
+ 0, /* U+002870: BRAILLE PATTERN DOTS-567*/
+ 0, /* U+002871: BRAILLE PATTERN DOTS-1567*/
+ 0, /* U+002872: BRAILLE PATTERN DOTS-2567*/
+ 0, /* U+002873: BRAILLE PATTERN DOTS-12567*/
+ 0, /* U+002874: BRAILLE PATTERN DOTS-3567*/
+ 0, /* U+002875: BRAILLE PATTERN DOTS-13567*/
+ 0, /* U+002876: BRAILLE PATTERN DOTS-23567*/
+ 0, /* U+002877: BRAILLE PATTERN DOTS-123567*/
+ 0, /* U+002878: BRAILLE PATTERN DOTS-4567*/
+ 0, /* U+002879: BRAILLE PATTERN DOTS-14567*/
+ 0, /* U+00287a: BRAILLE PATTERN DOTS-24567*/
+ 0, /* U+00287b: BRAILLE PATTERN DOTS-124567*/
+ 0, /* U+00287c: BRAILLE PATTERN DOTS-34567*/
+ 0, /* U+00287d: BRAILLE PATTERN DOTS-134567*/
+ 0, /* U+00287e: BRAILLE PATTERN DOTS-234567*/
+ 0, /* U+00287f: BRAILLE PATTERN DOTS-1234567*/
+ 0, /* U+002880: BRAILLE PATTERN DOTS-8*/
+ 0, /* U+002881: BRAILLE PATTERN DOTS-18*/
+ 0, /* U+002882: BRAILLE PATTERN DOTS-28*/
+ 0, /* U+002883: BRAILLE PATTERN DOTS-128*/
+ 0, /* U+002884: BRAILLE PATTERN DOTS-38*/
+ 0, /* U+002885: BRAILLE PATTERN DOTS-138*/
+ 0, /* U+002886: BRAILLE PATTERN DOTS-238*/
+ 0, /* U+002887: BRAILLE PATTERN DOTS-1238*/
+ 0, /* U+002888: BRAILLE PATTERN DOTS-48*/
+ 0, /* U+002889: BRAILLE PATTERN DOTS-148*/
+ 0, /* U+00288a: BRAILLE PATTERN DOTS-248*/
+ 0, /* U+00288b: BRAILLE PATTERN DOTS-1248*/
+ 0, /* U+00288c: BRAILLE PATTERN DOTS-348*/
+ 0, /* U+00288d: BRAILLE PATTERN DOTS-1348*/
+ 0, /* U+00288e: BRAILLE PATTERN DOTS-2348*/
+ 0, /* U+00288f: BRAILLE PATTERN DOTS-12348*/
+ 0, /* U+002890: BRAILLE PATTERN DOTS-58*/
+ 0, /* U+002891: BRAILLE PATTERN DOTS-158*/
+ 0, /* U+002892: BRAILLE PATTERN DOTS-258*/
+ 0, /* U+002893: BRAILLE PATTERN DOTS-1258*/
+ 0, /* U+002894: BRAILLE PATTERN DOTS-358*/
+ 0, /* U+002895: BRAILLE PATTERN DOTS-1358*/
+ 0, /* U+002896: BRAILLE PATTERN DOTS-2358*/
+ 0, /* U+002897: BRAILLE PATTERN DOTS-12358*/
+ 0, /* U+002898: BRAILLE PATTERN DOTS-458*/
+ 0, /* U+002899: BRAILLE PATTERN DOTS-1458*/
+ 0, /* U+00289a: BRAILLE PATTERN DOTS-2458*/
+ 0, /* U+00289b: BRAILLE PATTERN DOTS-12458*/
+ 0, /* U+00289c: BRAILLE PATTERN DOTS-3458*/
+ 0, /* U+00289d: BRAILLE PATTERN DOTS-13458*/
+ 0, /* U+00289e: BRAILLE PATTERN DOTS-23458*/
+ 0, /* U+00289f: BRAILLE PATTERN DOTS-123458*/
+ 0, /* U+0028a0: BRAILLE PATTERN DOTS-68*/
+ 0, /* U+0028a1: BRAILLE PATTERN DOTS-168*/
+ 0, /* U+0028a2: BRAILLE PATTERN DOTS-268*/
+ 0, /* U+0028a3: BRAILLE PATTERN DOTS-1268*/
+ 0, /* U+0028a4: BRAILLE PATTERN DOTS-368*/
+ 0, /* U+0028a5: BRAILLE PATTERN DOTS-1368*/
+ 0, /* U+0028a6: BRAILLE PATTERN DOTS-2368*/
+ 0, /* U+0028a7: BRAILLE PATTERN DOTS-12368*/
+ 0, /* U+0028a8: BRAILLE PATTERN DOTS-468*/
+ 0, /* U+0028a9: BRAILLE PATTERN DOTS-1468*/
+ 0, /* U+0028aa: BRAILLE PATTERN DOTS-2468*/
+ 0, /* U+0028ab: BRAILLE PATTERN DOTS-12468*/
+ 0, /* U+0028ac: BRAILLE PATTERN DOTS-3468*/
+ 0, /* U+0028ad: BRAILLE PATTERN DOTS-13468*/
+ 0, /* U+0028ae: BRAILLE PATTERN DOTS-23468*/
+ 0, /* U+0028af: BRAILLE PATTERN DOTS-123468*/
+ 0, /* U+0028b0: BRAILLE PATTERN DOTS-568*/
+ 0, /* U+0028b1: BRAILLE PATTERN DOTS-1568*/
+ 0, /* U+0028b2: BRAILLE PATTERN DOTS-2568*/
+ 0, /* U+0028b3: BRAILLE PATTERN DOTS-12568*/
+ 0, /* U+0028b4: BRAILLE PATTERN DOTS-3568*/
+ 0, /* U+0028b5: BRAILLE PATTERN DOTS-13568*/
+ 0, /* U+0028b6: BRAILLE PATTERN DOTS-23568*/
+ 0, /* U+0028b7: BRAILLE PATTERN DOTS-123568*/
+ 0, /* U+0028b8: BRAILLE PATTERN DOTS-4568*/
+ 0, /* U+0028b9: BRAILLE PATTERN DOTS-14568*/
+ 0, /* U+0028ba: BRAILLE PATTERN DOTS-24568*/
+ 0, /* U+0028bb: BRAILLE PATTERN DOTS-124568*/
+ 0, /* U+0028bc: BRAILLE PATTERN DOTS-34568*/
+ 0, /* U+0028bd: BRAILLE PATTERN DOTS-134568*/
+ 0, /* U+0028be: BRAILLE PATTERN DOTS-234568*/
+ 0, /* U+0028bf: BRAILLE PATTERN DOTS-1234568*/
+ 0, /* U+0028c0: BRAILLE PATTERN DOTS-78*/
+ 0, /* U+0028c1: BRAILLE PATTERN DOTS-178*/
+ 0, /* U+0028c2: BRAILLE PATTERN DOTS-278*/
+ 0, /* U+0028c3: BRAILLE PATTERN DOTS-1278*/
+ 0, /* U+0028c4: BRAILLE PATTERN DOTS-378*/
+ 0, /* U+0028c5: BRAILLE PATTERN DOTS-1378*/
+ 0, /* U+0028c6: BRAILLE PATTERN DOTS-2378*/
+ 0, /* U+0028c7: BRAILLE PATTERN DOTS-12378*/
+ 0, /* U+0028c8: BRAILLE PATTERN DOTS-478*/
+ 0, /* U+0028c9: BRAILLE PATTERN DOTS-1478*/
+ 0, /* U+0028ca: BRAILLE PATTERN DOTS-2478*/
+ 0, /* U+0028cb: BRAILLE PATTERN DOTS-12478*/
+ 0, /* U+0028cc: BRAILLE PATTERN DOTS-3478*/
+ 0, /* U+0028cd: BRAILLE PATTERN DOTS-13478*/
+ 0, /* U+0028ce: BRAILLE PATTERN DOTS-23478*/
+ 0, /* U+0028cf: BRAILLE PATTERN DOTS-123478*/
+ 0, /* U+0028d0: BRAILLE PATTERN DOTS-578*/
+ 0, /* U+0028d1: BRAILLE PATTERN DOTS-1578*/
+ 0, /* U+0028d2: BRAILLE PATTERN DOTS-2578*/
+ 0, /* U+0028d3: BRAILLE PATTERN DOTS-12578*/
+ 0, /* U+0028d4: BRAILLE PATTERN DOTS-3578*/
+ 0, /* U+0028d5: BRAILLE PATTERN DOTS-13578*/
+ 0, /* U+0028d6: BRAILLE PATTERN DOTS-23578*/
+ 0, /* U+0028d7: BRAILLE PATTERN DOTS-123578*/
+ 0, /* U+0028d8: BRAILLE PATTERN DOTS-4578*/
+ 0, /* U+0028d9: BRAILLE PATTERN DOTS-14578*/
+ 0, /* U+0028da: BRAILLE PATTERN DOTS-24578*/
+ 0, /* U+0028db: BRAILLE PATTERN DOTS-124578*/
+ 0, /* U+0028dc: BRAILLE PATTERN DOTS-34578*/
+ 0, /* U+0028dd: BRAILLE PATTERN DOTS-134578*/
+ 0, /* U+0028de: BRAILLE PATTERN DOTS-234578*/
+ 0, /* U+0028df: BRAILLE PATTERN DOTS-1234578*/
+ 0, /* U+0028e0: BRAILLE PATTERN DOTS-678*/
+ 0, /* U+0028e1: BRAILLE PATTERN DOTS-1678*/
+ 0, /* U+0028e2: BRAILLE PATTERN DOTS-2678*/
+ 0, /* U+0028e3: BRAILLE PATTERN DOTS-12678*/
+ 0, /* U+0028e4: BRAILLE PATTERN DOTS-3678*/
+ 0, /* U+0028e5: BRAILLE PATTERN DOTS-13678*/
+ 0, /* U+0028e6: BRAILLE PATTERN DOTS-23678*/
+ 0, /* U+0028e7: BRAILLE PATTERN DOTS-123678*/
+ 0, /* U+0028e8: BRAILLE PATTERN DOTS-4678*/
+ 0, /* U+0028e9: BRAILLE PATTERN DOTS-14678*/
+ 0, /* U+0028ea: BRAILLE PATTERN DOTS-24678*/
+ 0, /* U+0028eb: BRAILLE PATTERN DOTS-124678*/
+ 0, /* U+0028ec: BRAILLE PATTERN DOTS-34678*/
+ 0, /* U+0028ed: BRAILLE PATTERN DOTS-134678*/
+ 0, /* U+0028ee: BRAILLE PATTERN DOTS-234678*/
+ 0, /* U+0028ef: BRAILLE PATTERN DOTS-1234678*/
+ 0, /* U+0028f0: BRAILLE PATTERN DOTS-5678*/
+ 0, /* U+0028f1: BRAILLE PATTERN DOTS-15678*/
+ 0, /* U+0028f2: BRAILLE PATTERN DOTS-25678*/
+ 0, /* U+0028f3: BRAILLE PATTERN DOTS-125678*/
+ 0, /* U+0028f4: BRAILLE PATTERN DOTS-35678*/
+ 0, /* U+0028f5: BRAILLE PATTERN DOTS-135678*/
+ 0, /* U+0028f6: BRAILLE PATTERN DOTS-235678*/
+ 0, /* U+0028f7: BRAILLE PATTERN DOTS-1235678*/
+ 0, /* U+0028f8: BRAILLE PATTERN DOTS-45678*/
+ 0, /* U+0028f9: BRAILLE PATTERN DOTS-145678*/
+ 0, /* U+0028fa: BRAILLE PATTERN DOTS-245678*/
+ 0, /* U+0028fb: BRAILLE PATTERN DOTS-1245678*/
+ 0, /* U+0028fc: BRAILLE PATTERN DOTS-345678*/
+ 0, /* U+0028fd: BRAILLE PATTERN DOTS-1345678*/
+ 0, /* U+0028fe: BRAILLE PATTERN DOTS-2345678*/
+ 0, /* U+0028ff: BRAILLE PATTERN DOTS-12345678*/
+ 0, /* U+002900: RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE*/
+ 0, /* U+002901: RIGHTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE*/
+ 0, /* U+002902: LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE*/
+ 0, /* U+002903: RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE*/
+ 0, /* U+002904: LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE*/
+ 0, /* U+002905: RIGHTWARDS TWO-HEADED ARROW FROM BAR*/
+ 0, /* U+002906: LEFTWARDS DOUBLE ARROW FROM BAR*/
+ 0, /* U+002907: RIGHTWARDS DOUBLE ARROW FROM BAR*/
+ 0, /* U+002908: DOWNWARDS ARROW WITH HORIZONTAL STROKE*/
+ 0, /* U+002909: UPWARDS ARROW WITH HORIZONTAL STROKE*/
+ 0, /* U+00290a: UPWARDS TRIPLE ARROW*/
+ 0, /* U+00290b: DOWNWARDS TRIPLE ARROW*/
+ 0, /* U+00290c: LEFTWARDS DOUBLE DASH ARROW*/
+ 0, /* U+00290d: RIGHTWARDS DOUBLE DASH ARROW*/
+ 0, /* U+00290e: LEFTWARDS TRIPLE DASH ARROW*/
+ 0, /* U+00290f: RIGHTWARDS TRIPLE DASH ARROW*/
+ 0, /* U+002910: RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW*/
+ 0, /* U+002911: RIGHTWARDS ARROW WITH DOTTED STEM*/
+ 0, /* U+002912: UPWARDS ARROW TO BAR*/
+ 0, /* U+002913: DOWNWARDS ARROW TO BAR*/
+ 0, /* U+002914: RIGHTWARDS ARROW WITH TAIL WITH VERTICAL STROKE*/
+ 0, /* U+002915: RIGHTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE*/
+ 0, /* U+002916: RIGHTWARDS TWO-HEADED ARROW WITH TAIL*/
+ 0, /* U+002917: RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE*/
+ 0, /* U+002918: RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE*/
+ 0, /* U+002919: LEFTWARDS ARROW-TAIL*/
+ 0, /* U+00291a: RIGHTWARDS ARROW-TAIL*/
+ 0, /* U+00291b: LEFTWARDS DOUBLE ARROW-TAIL*/
+ 0, /* U+00291c: RIGHTWARDS DOUBLE ARROW-TAIL*/
+ 0, /* U+00291d: LEFTWARDS ARROW TO BLACK DIAMOND*/
+ 0, /* U+00291e: RIGHTWARDS ARROW TO BLACK DIAMOND*/
+ 0, /* U+00291f: LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND*/
+ 0, /* U+002920: RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND*/
+ 0, /* U+002921: NORTH WEST AND SOUTH EAST ARROW*/
+ 0, /* U+002922: NORTH EAST AND SOUTH WEST ARROW*/
+ 0, /* U+002923: NORTH WEST ARROW WITH HOOK*/
+ 0, /* U+002924: NORTH EAST ARROW WITH HOOK*/
+ 0, /* U+002925: SOUTH EAST ARROW WITH HOOK*/
+ 0, /* U+002926: SOUTH WEST ARROW WITH HOOK*/
+ 0, /* U+002927: NORTH WEST ARROW AND NORTH EAST ARROW*/
+ 0, /* U+002928: NORTH EAST ARROW AND SOUTH EAST ARROW*/
+ 0, /* U+002929: SOUTH EAST ARROW AND SOUTH WEST ARROW*/
+ 0, /* U+00292a: SOUTH WEST ARROW AND NORTH WEST ARROW*/
+ 0, /* U+00292b: RISING DIAGONAL CROSSING FALLING DIAGONAL*/
+ 0, /* U+00292c: FALLING DIAGONAL CROSSING RISING DIAGONAL*/
+ 0, /* U+00292d: SOUTH EAST ARROW CROSSING NORTH EAST ARROW*/
+ 0, /* U+00292e: NORTH EAST ARROW CROSSING SOUTH EAST ARROW*/
+ 0, /* U+00292f: FALLING DIAGONAL CROSSING NORTH EAST ARROW*/
+ 0, /* U+002930: RISING DIAGONAL CROSSING SOUTH EAST ARROW*/
+ 0, /* U+002931: NORTH EAST ARROW CROSSING NORTH WEST ARROW*/
+ 0, /* U+002932: NORTH WEST ARROW CROSSING NORTH EAST ARROW*/
+ 0, /* U+002933: WAVE ARROW POINTING DIRECTLY RIGHT*/
+ 0, /* U+002934: ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS*/
+ 0, /* U+002935: ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS*/
+ 0, /* U+002936: ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS*/
+ 0, /* U+002937: ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS*/
+ 0, /* U+002938: RIGHT-SIDE ARC CLOCKWISE ARROW*/
+ 0, /* U+002939: LEFT-SIDE ARC ANTICLOCKWISE ARROW*/
+ 0, /* U+00293a: TOP ARC ANTICLOCKWISE ARROW*/
+ 0, /* U+00293b: BOTTOM ARC ANTICLOCKWISE ARROW*/
+ 0, /* U+00293c: TOP ARC CLOCKWISE ARROW WITH MINUS*/
+ 0, /* U+00293d: TOP ARC ANTICLOCKWISE ARROW WITH PLUS*/
+ 0, /* U+00293e: LOWER RIGHT SEMICIRCULAR CLOCKWISE ARROW*/
+ 0, /* U+00293f: LOWER LEFT SEMICIRCULAR ANTICLOCKWISE ARROW*/
+ 0, /* U+002940: ANTICLOCKWISE CLOSED CIRCLE ARROW*/
+ 0, /* U+002941: CLOCKWISE CLOSED CIRCLE ARROW*/
+ 0, /* U+002942: RIGHTWARDS ARROW ABOVE SHORT LEFTWARDS ARROW*/
+ 0, /* U+002943: LEFTWARDS ARROW ABOVE SHORT RIGHTWARDS ARROW*/
+ 0, /* U+002944: SHORT RIGHTWARDS ARROW ABOVE LEFTWARDS ARROW*/
+ 0, /* U+002945: RIGHTWARDS ARROW WITH PLUS BELOW*/
+ 0, /* U+002946: LEFTWARDS ARROW WITH PLUS BELOW*/
+ 0, /* U+002947: RIGHTWARDS ARROW THROUGH X*/
+ 0, /* U+002948: LEFT RIGHT ARROW THROUGH SMALL CIRCLE*/
+ 0, /* U+002949: UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE*/
+ 0, /* U+00294a: LEFT BARB UP RIGHT BARB DOWN HARPOON*/
+ 0, /* U+00294b: LEFT BARB DOWN RIGHT BARB UP HARPOON*/
+ 0, /* U+00294c: UP BARB RIGHT DOWN BARB LEFT HARPOON*/
+ 0, /* U+00294d: UP BARB LEFT DOWN BARB RIGHT HARPOON*/
+ 0, /* U+00294e: LEFT BARB UP RIGHT BARB UP HARPOON*/
+ 0, /* U+00294f: UP BARB RIGHT DOWN BARB RIGHT HARPOON*/
+ 0, /* U+002950: LEFT BARB DOWN RIGHT BARB DOWN HARPOON*/
+ 0, /* U+002951: UP BARB LEFT DOWN BARB LEFT HARPOON*/
+ 0, /* U+002952: LEFTWARDS HARPOON WITH BARB UP TO BAR*/
+ 0, /* U+002953: RIGHTWARDS HARPOON WITH BARB UP TO BAR*/
+ 0, /* U+002954: UPWARDS HARPOON WITH BARB RIGHT TO BAR*/
+ 0, /* U+002955: DOWNWARDS HARPOON WITH BARB RIGHT TO BAR*/
+ 0, /* U+002956: LEFTWARDS HARPOON WITH BARB DOWN TO BAR*/
+ 0, /* U+002957: RIGHTWARDS HARPOON WITH BARB DOWN TO BAR*/
+ 0, /* U+002958: UPWARDS HARPOON WITH BARB LEFT TO BAR*/
+ 0, /* U+002959: DOWNWARDS HARPOON WITH BARB LEFT TO BAR*/
+ 0, /* U+00295a: LEFTWARDS HARPOON WITH BARB UP FROM BAR*/
+ 0, /* U+00295b: RIGHTWARDS HARPOON WITH BARB UP FROM BAR*/
+ 0, /* U+00295c: UPWARDS HARPOON WITH BARB RIGHT FROM BAR*/
+ 0, /* U+00295d: DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR*/
+ 0, /* U+00295e: LEFTWARDS HARPOON WITH BARB DOWN FROM BAR*/
+ 0, /* U+00295f: RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR*/
+ 0, /* U+002960: UPWARDS HARPOON WITH BARB LEFT FROM BAR*/
+ 0, /* U+002961: DOWNWARDS HARPOON WITH BARB LEFT FROM BAR*/
+ 0, /* U+002962: LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN*/
+ 0, /* U+002963: UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT*/
+ 0, /* U+002964: RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN*/
+ 0, /* U+002965: DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT*/
+ 0, /* U+002966: LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP*/
+ 0, /* U+002967: LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN*/
+ 0, /* U+002968: RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP*/
+ 0, /* U+002969: RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN*/
+ 0, /* U+00296a: LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH*/
+ 0, /* U+00296b: LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH*/
+ 0, /* U+00296c: RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH*/
+ 0, /* U+00296d: RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH*/
+ 0, /* U+00296e: UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT*/
+ 0, /* U+00296f: DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT*/
+ 0, /* U+002970: RIGHT DOUBLE ARROW WITH ROUNDED HEAD*/
+ 0, /* U+002971: EQUALS SIGN ABOVE RIGHTWARDS ARROW*/
+ 0, /* U+002972: TILDE OPERATOR ABOVE RIGHTWARDS ARROW*/
+ 0, /* U+002973: LEFTWARDS ARROW ABOVE TILDE OPERATOR*/
+ 0, /* U+002974: RIGHTWARDS ARROW ABOVE TILDE OPERATOR*/
+ 0, /* U+002975: RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO*/
+ 0, /* U+002976: LESS-THAN ABOVE LEFTWARDS ARROW*/
+ 0, /* U+002977: LEFTWARDS ARROW THROUGH LESS-THAN*/
+ 0, /* U+002978: GREATER-THAN ABOVE RIGHTWARDS ARROW*/
+ 0, /* U+002979: SUBSET ABOVE RIGHTWARDS ARROW*/
+ 0, /* U+00297a: LEFTWARDS ARROW THROUGH SUBSET*/
+ 0, /* U+00297b: SUPERSET ABOVE LEFTWARDS ARROW*/
+ 0, /* U+00297c: LEFT FISH TAIL*/
+ 0, /* U+00297d: RIGHT FISH TAIL*/
+ 0, /* U+00297e: UP FISH TAIL*/
+ 0, /* U+00297f: DOWN FISH TAIL*/
+ 0, /* U+002980: TRIPLE VERTICAL BAR DELIMITER*/
+ 0, /* U+002981: Z NOTATION SPOT*/
+ 0, /* U+002982: Z NOTATION TYPE COLON*/
+ 0, /* U+002983: LEFT WHITE CURLY BRACKET*/
+ 0, /* U+002984: RIGHT WHITE CURLY BRACKET*/
+ 0, /* U+002985: LEFT WHITE PARENTHESIS*/
+ 0, /* U+002986: RIGHT WHITE PARENTHESIS*/
+ 0, /* U+002987: Z NOTATION LEFT IMAGE BRACKET*/
+ 0, /* U+002988: Z NOTATION RIGHT IMAGE BRACKET*/
+ 0, /* U+002989: Z NOTATION LEFT BINDING BRACKET*/
+ 0, /* U+00298a: Z NOTATION RIGHT BINDING BRACKET*/
+ 0, /* U+00298b: LEFT SQUARE BRACKET WITH UNDERBAR*/
+ 0, /* U+00298c: RIGHT SQUARE BRACKET WITH UNDERBAR*/
+ 0, /* U+00298d: LEFT SQUARE BRACKET WITH TICK IN TOP CORNER*/
+ 0, /* U+00298e: RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER*/
+ 0, /* U+00298f: LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER*/
+ 0, /* U+002990: RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER*/
+ 0, /* U+002991: LEFT ANGLE BRACKET WITH DOT*/
+ 0, /* U+002992: RIGHT ANGLE BRACKET WITH DOT*/
+ 0, /* U+002993: LEFT ARC LESS-THAN BRACKET*/
+ 0, /* U+002994: RIGHT ARC GREATER-THAN BRACKET*/
+ 0, /* U+002995: DOUBLE LEFT ARC GREATER-THAN BRACKET*/
+ 0, /* U+002996: DOUBLE RIGHT ARC LESS-THAN BRACKET*/
+ 0, /* U+002997: LEFT BLACK TORTOISE SHELL BRACKET*/
+ 0, /* U+002998: RIGHT BLACK TORTOISE SHELL BRACKET*/
+ 0, /* U+002999: DOTTED FENCE*/
+ 0, /* U+00299a: VERTICAL ZIGZAG LINE*/
+ 0, /* U+00299b: MEASURED ANGLE OPENING LEFT*/
+ 0, /* U+00299c: RIGHT ANGLE VARIANT WITH SQUARE*/
+ 0, /* U+00299d: MEASURED RIGHT ANGLE WITH DOT*/
+ 0, /* U+00299e: ANGLE WITH S INSIDE*/
+ 0, /* U+00299f: ACUTE ANGLE*/
+ 0, /* U+0029a0: SPHERICAL ANGLE OPENING LEFT*/
+ 0, /* U+0029a1: SPHERICAL ANGLE OPENING UP*/
+ 0, /* U+0029a2: TURNED ANGLE*/
+ 0, /* U+0029a3: REVERSED ANGLE*/
+ 0, /* U+0029a4: ANGLE WITH UNDERBAR*/
+ 0, /* U+0029a5: REVERSED ANGLE WITH UNDERBAR*/
+ 0, /* U+0029a6: OBLIQUE ANGLE OPENING UP*/
+ 0, /* U+0029a7: OBLIQUE ANGLE OPENING DOWN*/
+ 0, /* U+0029a8: MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT*/
+ 0, /* U+0029a9: MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT*/
+ 0, /* U+0029aa: MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT*/
+ 0, /* U+0029ab: MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT*/
+ 0, /* U+0029ac: MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP*/
+ 0, /* U+0029ad: MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP*/
+ 0, /* U+0029ae: MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN*/
+ 0, /* U+0029af: MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN*/
+ 0, /* U+0029b0: REVERSED EMPTY SET*/
+ 0, /* U+0029b1: EMPTY SET WITH OVERBAR*/
+ 0, /* U+0029b2: EMPTY SET WITH SMALL CIRCLE ABOVE*/
+ 0, /* U+0029b3: EMPTY SET WITH RIGHT ARROW ABOVE*/
+ 0, /* U+0029b4: EMPTY SET WITH LEFT ARROW ABOVE*/
+ 0, /* U+0029b5: CIRCLE WITH HORIZONTAL BAR*/
+ 0, /* U+0029b6: CIRCLED VERTICAL BAR*/
+ 0, /* U+0029b7: CIRCLED PARALLEL*/
+ 0, /* U+0029b8: CIRCLED REVERSE SOLIDUS*/
+ 0, /* U+0029b9: CIRCLED PERPENDICULAR*/
+ 0, /* U+0029ba: CIRCLE DIVIDED BY HORIZONTAL BAR AND TOP HALF DIVIDED BY VERTICAL BAR*/
+ 0, /* U+0029bb: CIRCLE WITH SUPERIMPOSED X*/
+ 0, /* U+0029bc: CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN*/
+ 0, /* U+0029bd: UP ARROW THROUGH CIRCLE*/
+ 0, /* U+0029be: CIRCLED WHITE BULLET*/
+ 0, /* U+0029bf: CIRCLED BULLET*/
+ 0, /* U+0029c0: CIRCLED LESS-THAN*/
+ 0, /* U+0029c1: CIRCLED GREATER-THAN*/
+ 0, /* U+0029c2: CIRCLE WITH SMALL CIRCLE TO THE RIGHT*/
+ 0, /* U+0029c3: CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT*/
+ 0, /* U+0029c4: SQUARED RISING DIAGONAL SLASH*/
+ 0, /* U+0029c5: SQUARED FALLING DIAGONAL SLASH*/
+ 0, /* U+0029c6: SQUARED ASTERISK*/
+ 0, /* U+0029c7: SQUARED SMALL CIRCLE*/
+ 0, /* U+0029c8: SQUARED SQUARE*/
+ 0, /* U+0029c9: TWO JOINED SQUARES*/
+ 0, /* U+0029ca: TRIANGLE WITH DOT ABOVE*/
+ 0, /* U+0029cb: TRIANGLE WITH UNDERBAR*/
+ 0, /* U+0029cc: S IN TRIANGLE*/
+ 0, /* U+0029cd: TRIANGLE WITH SERIFS AT BOTTOM*/
+ 0, /* U+0029ce: RIGHT TRIANGLE ABOVE LEFT TRIANGLE*/
+ 0, /* U+0029cf: LEFT TRIANGLE BESIDE VERTICAL BAR*/
+ 0, /* U+0029d0: VERTICAL BAR BESIDE RIGHT TRIANGLE*/
+ 0, /* U+0029d1: BOWTIE WITH LEFT HALF BLACK*/
+ 0, /* U+0029d2: BOWTIE WITH RIGHT HALF BLACK*/
+ 0, /* U+0029d3: BLACK BOWTIE*/
+ 0, /* U+0029d4: TIMES WITH LEFT HALF BLACK*/
+ 0, /* U+0029d5: TIMES WITH RIGHT HALF BLACK*/
+ 0, /* U+0029d6: WHITE HOURGLASS*/
+ 0, /* U+0029d7: BLACK HOURGLASS*/
+ 0, /* U+0029d8: LEFT WIGGLY FENCE*/
+ 0, /* U+0029d9: RIGHT WIGGLY FENCE*/
+ 0, /* U+0029da: LEFT DOUBLE WIGGLY FENCE*/
+ 0, /* U+0029db: RIGHT DOUBLE WIGGLY FENCE*/
+ 0, /* U+0029dc: INCOMPLETE INFINITY*/
+ 0, /* U+0029dd: TIE OVER INFINITY*/
+ 0, /* U+0029de: INFINITY NEGATED WITH VERTICAL BAR*/
+ 0, /* U+0029df: DOUBLE-ENDED MULTIMAP*/
+ 0, /* U+0029e0: SQUARE WITH CONTOURED OUTLINE*/
+ 0, /* U+0029e1: INCREASES AS*/
+ 0, /* U+0029e2: SHUFFLE PRODUCT*/
+ 0, /* U+0029e3: EQUALS SIGN AND SLANTED PARALLEL*/
+ 0, /* U+0029e4: EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE*/
+ 0, /* U+0029e5: IDENTICAL TO AND SLANTED PARALLEL*/
+ 0, /* U+0029e6: GLEICH STARK*/
+ 0, /* U+0029e7: THERMODYNAMIC*/
+ 0, /* U+0029e8: DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK*/
+ 0, /* U+0029e9: DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK*/
+ 0, /* U+0029ea: BLACK DIAMOND WITH DOWN ARROW*/
+ 0, /* U+0029eb: BLACK LOZENGE*/
+ 0, /* U+0029ec: WHITE CIRCLE WITH DOWN ARROW*/
+ 0, /* U+0029ed: BLACK CIRCLE WITH DOWN ARROW*/
+ 0, /* U+0029ee: ERROR-BARRED WHITE SQUARE*/
+ 0, /* U+0029ef: ERROR-BARRED BLACK SQUARE*/
+ 0, /* U+0029f0: ERROR-BARRED WHITE DIAMOND*/
+ 0, /* U+0029f1: ERROR-BARRED BLACK DIAMOND*/
+ 0, /* U+0029f2: ERROR-BARRED WHITE CIRCLE*/
+ 0, /* U+0029f3: ERROR-BARRED BLACK CIRCLE*/
+ 0, /* U+0029f4: RULE-DELAYED*/
+ 0, /* U+0029f5: REVERSE SOLIDUS OPERATOR*/
+ 0, /* U+0029f6: SOLIDUS WITH OVERBAR*/
+ 0, /* U+0029f7: REVERSE SOLIDUS WITH HORIZONTAL STROKE*/
+ 0, /* U+0029f8: BIG SOLIDUS*/
+ 0, /* U+0029f9: BIG REVERSE SOLIDUS*/
+ 0, /* U+0029fa: DOUBLE PLUS*/
+ 0, /* U+0029fb: TRIPLE PLUS*/
+ 0, /* U+0029fc: LEFT-POINTING CURVED ANGLE BRACKET*/
+ 0, /* U+0029fd: RIGHT-POINTING CURVED ANGLE BRACKET*/
+ 0, /* U+0029fe: TINY*/
+ 0, /* U+0029ff: MINY*/
+ 0, /* U+002a00: N-ARY CIRCLED DOT OPERATOR*/
+ 0, /* U+002a01: N-ARY CIRCLED PLUS OPERATOR*/
+ 0, /* U+002a02: N-ARY CIRCLED TIMES OPERATOR*/
+ 0, /* U+002a03: N-ARY UNION OPERATOR WITH DOT*/
+ 0, /* U+002a04: N-ARY UNION OPERATOR WITH PLUS*/
+ 0, /* U+002a05: N-ARY SQUARE INTERSECTION OPERATOR*/
+ 0, /* U+002a06: N-ARY SQUARE UNION OPERATOR*/
+ 0, /* U+002a07: TWO LOGICAL AND OPERATOR*/
+ 0, /* U+002a08: TWO LOGICAL OR OPERATOR*/
+ 0, /* U+002a09: N-ARY TIMES OPERATOR*/
+ 0, /* U+002a0a: MODULO TWO SUM*/
+ 0, /* U+002a0b: SUMMATION WITH INTEGRAL*/
+ 0, /* U+002a0c: QUADRUPLE INTEGRAL OPERATOR*/
+ 0, /* U+002a0d: FINITE PART INTEGRAL*/
+ 0, /* U+002a0e: INTEGRAL WITH DOUBLE STROKE*/
+ 0, /* U+002a0f: INTEGRAL AVERAGE WITH SLASH*/
+ 0, /* U+002a10: CIRCULATION FUNCTION*/
+ 0, /* U+002a11: ANTICLOCKWISE INTEGRATION*/
+ 0, /* U+002a12: LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE*/
+ 0, /* U+002a13: LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE*/
+ 0, /* U+002a14: LINE INTEGRATION NOT INCLUDING THE POLE*/
+ 0, /* U+002a15: INTEGRAL AROUND A POINT OPERATOR*/
+ 0, /* U+002a16: QUATERNION INTEGRAL OPERATOR*/
+ 0, /* U+002a17: INTEGRAL WITH LEFTWARDS ARROW WITH HOOK*/
+ 0, /* U+002a18: INTEGRAL WITH TIMES SIGN*/
+ 0, /* U+002a19: INTEGRAL WITH INTERSECTION*/
+ 0, /* U+002a1a: INTEGRAL WITH UNION*/
+ 0, /* U+002a1b: INTEGRAL WITH OVERBAR*/
+ 0, /* U+002a1c: INTEGRAL WITH UNDERBAR*/
+ 0, /* U+002a1d: JOIN*/
+ 0, /* U+002a1e: LARGE LEFT TRIANGLE OPERATOR*/
+ 0, /* U+002a1f: Z NOTATION SCHEMA COMPOSITION*/
+ 0, /* U+002a20: Z NOTATION SCHEMA PIPING*/
+ 0, /* U+002a21: Z NOTATION SCHEMA PROJECTION*/
+ 0, /* U+002a22: PLUS SIGN WITH SMALL CIRCLE ABOVE*/
+ 0, /* U+002a23: PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE*/
+ 0, /* U+002a24: PLUS SIGN WITH TILDE ABOVE*/
+ 0, /* U+002a25: PLUS SIGN WITH DOT BELOW*/
+ 0, /* U+002a26: PLUS SIGN WITH TILDE BELOW*/
+ 0, /* U+002a27: PLUS SIGN WITH SUBSCRIPT TWO*/
+ 0, /* U+002a28: PLUS SIGN WITH BLACK TRIANGLE*/
+ 0, /* U+002a29: MINUS SIGN WITH COMMA ABOVE*/
+ 0, /* U+002a2a: MINUS SIGN WITH DOT BELOW*/
+ 0, /* U+002a2b: MINUS SIGN WITH FALLING DOTS*/
+ 0, /* U+002a2c: MINUS SIGN WITH RISING DOTS*/
+ 0, /* U+002a2d: PLUS SIGN IN LEFT HALF CIRCLE*/
+ 0, /* U+002a2e: PLUS SIGN IN RIGHT HALF CIRCLE*/
+ 0, /* U+002a2f: VECTOR OR CROSS PRODUCT*/
+ 0, /* U+002a30: MULTIPLICATION SIGN WITH DOT ABOVE*/
+ 0, /* U+002a31: MULTIPLICATION SIGN WITH UNDERBAR*/
+ 0, /* U+002a32: SEMIDIRECT PRODUCT WITH BOTTOM CLOSED*/
+ 0, /* U+002a33: SMASH PRODUCT*/
+ 0, /* U+002a34: MULTIPLICATION SIGN IN LEFT HALF CIRCLE*/
+ 0, /* U+002a35: MULTIPLICATION SIGN IN RIGHT HALF CIRCLE*/
+ 0, /* U+002a36: CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT*/
+ 0, /* U+002a37: MULTIPLICATION SIGN IN DOUBLE CIRCLE*/
+ 0, /* U+002a38: CIRCLED DIVISION SIGN*/
+ 0, /* U+002a39: PLUS SIGN IN TRIANGLE*/
+ 0, /* U+002a3a: MINUS SIGN IN TRIANGLE*/
+ 0, /* U+002a3b: MULTIPLICATION SIGN IN TRIANGLE*/
+ 0, /* U+002a3c: INTERIOR PRODUCT*/
+ 0, /* U+002a3d: RIGHTHAND INTERIOR PRODUCT*/
+ 0, /* U+002a3e: Z NOTATION RELATIONAL COMPOSITION*/
+ 0, /* U+002a3f: AMALGAMATION OR COPRODUCT*/
+ 0, /* U+002a40: INTERSECTION WITH DOT*/
+ 0, /* U+002a41: UNION WITH MINUS SIGN*/
+ 0, /* U+002a42: UNION WITH OVERBAR*/
+ 0, /* U+002a43: INTERSECTION WITH OVERBAR*/
+ 0, /* U+002a44: INTERSECTION WITH LOGICAL AND*/
+ 0, /* U+002a45: UNION WITH LOGICAL OR*/
+ 0, /* U+002a46: UNION ABOVE INTERSECTION*/
+ 0, /* U+002a47: INTERSECTION ABOVE UNION*/
+ 0, /* U+002a48: UNION ABOVE BAR ABOVE INTERSECTION*/
+ 0, /* U+002a49: INTERSECTION ABOVE BAR ABOVE UNION*/
+ 0, /* U+002a4a: UNION BESIDE AND JOINED WITH UNION*/
+ 0, /* U+002a4b: INTERSECTION BESIDE AND JOINED WITH INTERSECTION*/
+ 0, /* U+002a4c: CLOSED UNION WITH SERIFS*/
+ 0, /* U+002a4d: CLOSED INTERSECTION WITH SERIFS*/
+ 0, /* U+002a4e: DOUBLE SQUARE INTERSECTION*/
+ 0, /* U+002a4f: DOUBLE SQUARE UNION*/
+ 0, /* U+002a50: CLOSED UNION WITH SERIFS AND SMASH PRODUCT*/
+ 0, /* U+002a51: LOGICAL AND WITH DOT ABOVE*/
+ 0, /* U+002a52: LOGICAL OR WITH DOT ABOVE*/
+ 0, /* U+002a53: DOUBLE LOGICAL AND*/
+ 0, /* U+002a54: DOUBLE LOGICAL OR*/
+ 0, /* U+002a55: TWO INTERSECTING LOGICAL AND*/
+ 0, /* U+002a56: TWO INTERSECTING LOGICAL OR*/
+ 0, /* U+002a57: SLOPING LARGE OR*/
+ 0, /* U+002a58: SLOPING LARGE AND*/
+ 0, /* U+002a59: LOGICAL OR OVERLAPPING LOGICAL AND*/
+ 0, /* U+002a5a: LOGICAL AND WITH MIDDLE STEM*/
+ 0, /* U+002a5b: LOGICAL OR WITH MIDDLE STEM*/
+ 0, /* U+002a5c: LOGICAL AND WITH HORIZONTAL DASH*/
+ 0, /* U+002a5d: LOGICAL OR WITH HORIZONTAL DASH*/
+ 0, /* U+002a5e: LOGICAL AND WITH DOUBLE OVERBAR*/
+ 0, /* U+002a5f: LOGICAL AND WITH UNDERBAR*/
+ 0, /* U+002a60: LOGICAL AND WITH DOUBLE UNDERBAR*/
+ 0, /* U+002a61: SMALL VEE WITH UNDERBAR*/
+ 0, /* U+002a62: LOGICAL OR WITH DOUBLE OVERBAR*/
+ 0, /* U+002a63: LOGICAL OR WITH DOUBLE UNDERBAR*/
+ 0, /* U+002a64: Z NOTATION DOMAIN ANTIRESTRICTION*/
+ 0, /* U+002a65: Z NOTATION RANGE ANTIRESTRICTION*/
+ 0, /* U+002a66: EQUALS SIGN WITH DOT BELOW*/
+ 0, /* U+002a67: IDENTICAL WITH DOT ABOVE*/
+ 0, /* U+002a68: TRIPLE HORIZONTAL BAR WITH DOUBLE VERTICAL STROKE*/
+ 0, /* U+002a69: TRIPLE HORIZONTAL BAR WITH TRIPLE VERTICAL STROKE*/
+ 0, /* U+002a6a: TILDE OPERATOR WITH DOT ABOVE*/
+ 0, /* U+002a6b: TILDE OPERATOR WITH RISING DOTS*/
+ 0, /* U+002a6c: SIMILAR MINUS SIMILAR*/
+ 0, /* U+002a6d: CONGRUENT WITH DOT ABOVE*/
+ 0, /* U+002a6e: EQUALS WITH ASTERISK*/
+ 0, /* U+002a6f: ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT*/
+ 0, /* U+002a70: APPROXIMATELY EQUAL OR EQUAL TO*/
+ 0, /* U+002a71: EQUALS SIGN ABOVE PLUS SIGN*/
+ 0, /* U+002a72: PLUS SIGN ABOVE EQUALS SIGN*/
+ 0, /* U+002a73: EQUALS SIGN ABOVE TILDE OPERATOR*/
+ 0, /* U+002a74: DOUBLE COLON EQUAL*/
+ 0, /* U+002a75: TWO CONSECUTIVE EQUALS SIGNS*/
+ 0, /* U+002a76: THREE CONSECUTIVE EQUALS SIGNS*/
+ 0, /* U+002a77: EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW*/
+ 0, /* U+002a78: EQUIVALENT WITH FOUR DOTS ABOVE*/
+ 0, /* U+002a79: LESS-THAN WITH CIRCLE INSIDE*/
+ 0, /* U+002a7a: GREATER-THAN WITH CIRCLE INSIDE*/
+ 0, /* U+002a7b: LESS-THAN WITH QUESTION MARK ABOVE*/
+ 0, /* U+002a7c: GREATER-THAN WITH QUESTION MARK ABOVE*/
+ 0, /* U+002a7d: LESS-THAN OR SLANTED EQUAL TO*/
+ 0, /* U+002a7e: GREATER-THAN OR SLANTED EQUAL TO*/
+ 0, /* U+002a7f: LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE*/
+ 0, /* U+002a80: GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE*/
+ 0, /* U+002a81: LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE*/
+ 0, /* U+002a82: GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE*/
+ 0, /* U+002a83: LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT*/
+ 0, /* U+002a84: GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT*/
+ 0, /* U+002a85: LESS-THAN OR APPROXIMATE*/
+ 0, /* U+002a86: GREATER-THAN OR APPROXIMATE*/
+ 0, /* U+002a87: LESS-THAN AND SINGLE-LINE NOT EQUAL TO*/
+ 0, /* U+002a88: GREATER-THAN AND SINGLE-LINE NOT EQUAL TO*/
+ 0, /* U+002a89: LESS-THAN AND NOT APPROXIMATE*/
+ 0, /* U+002a8a: GREATER-THAN AND NOT APPROXIMATE*/
+ 0, /* U+002a8b: LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN*/
+ 0, /* U+002a8c: GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN*/
+ 0, /* U+002a8d: LESS-THAN ABOVE SIMILAR OR EQUAL*/
+ 0, /* U+002a8e: GREATER-THAN ABOVE SIMILAR OR EQUAL*/
+ 0, /* U+002a8f: LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN*/
+ 0, /* U+002a90: GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN*/
+ 0, /* U+002a91: LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL*/
+ 0, /* U+002a92: GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL*/
+ 0, /* U+002a93: LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL*/
+ 0, /* U+002a94: GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL*/
+ 0, /* U+002a95: SLANTED EQUAL TO OR LESS-THAN*/
+ 0, /* U+002a96: SLANTED EQUAL TO OR GREATER-THAN*/
+ 0, /* U+002a97: SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE*/
+ 0, /* U+002a98: SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE*/
+ 0, /* U+002a99: DOUBLE-LINE EQUAL TO OR LESS-THAN*/
+ 0, /* U+002a9a: DOUBLE-LINE EQUAL TO OR GREATER-THAN*/
+ 0, /* U+002a9b: DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN*/
+ 0, /* U+002a9c: DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN*/
+ 0, /* U+002a9d: SIMILAR OR LESS-THAN*/
+ 0, /* U+002a9e: SIMILAR OR GREATER-THAN*/
+ 0, /* U+002a9f: SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN*/
+ 0, /* U+002aa0: SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN*/
+ 0, /* U+002aa1: DOUBLE NESTED LESS-THAN*/
+ 0, /* U+002aa2: DOUBLE NESTED GREATER-THAN*/
+ 0, /* U+002aa3: DOUBLE NESTED LESS-THAN WITH UNDERBAR*/
+ 0, /* U+002aa4: GREATER-THAN OVERLAPPING LESS-THAN*/
+ 0, /* U+002aa5: GREATER-THAN BESIDE LESS-THAN*/
+ 0, /* U+002aa6: LESS-THAN CLOSED BY CURVE*/
+ 0, /* U+002aa7: GREATER-THAN CLOSED BY CURVE*/
+ 0, /* U+002aa8: LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL*/
+ 0, /* U+002aa9: GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL*/
+ 0, /* U+002aaa: SMALLER THAN*/
+ 0, /* U+002aab: LARGER THAN*/
+ 0, /* U+002aac: SMALLER THAN OR EQUAL TO*/
+ 0, /* U+002aad: LARGER THAN OR EQUAL TO*/
+ 0, /* U+002aae: EQUALS SIGN WITH BUMPY ABOVE*/
+ 0, /* U+002aaf: PRECEDES ABOVE SINGLE-LINE EQUALS SIGN*/
+ 0, /* U+002ab0: SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN*/
+ 0, /* U+002ab1: PRECEDES ABOVE SINGLE-LINE NOT EQUAL TO*/
+ 0, /* U+002ab2: SUCCEEDS ABOVE SINGLE-LINE NOT EQUAL TO*/
+ 0, /* U+002ab3: PRECEDES ABOVE EQUALS SIGN*/
+ 0, /* U+002ab4: SUCCEEDS ABOVE EQUALS SIGN*/
+ 0, /* U+002ab5: PRECEDES ABOVE NOT EQUAL TO*/
+ 0, /* U+002ab6: SUCCEEDS ABOVE NOT EQUAL TO*/
+ 0, /* U+002ab7: PRECEDES ABOVE ALMOST EQUAL TO*/
+ 0, /* U+002ab8: SUCCEEDS ABOVE ALMOST EQUAL TO*/
+ 0, /* U+002ab9: PRECEDES ABOVE NOT ALMOST EQUAL TO*/
+ 0, /* U+002aba: SUCCEEDS ABOVE NOT ALMOST EQUAL TO*/
+ 0, /* U+002abb: DOUBLE PRECEDES*/
+ 0, /* U+002abc: DOUBLE SUCCEEDS*/
+ 0, /* U+002abd: SUBSET WITH DOT*/
+ 0, /* U+002abe: SUPERSET WITH DOT*/
+ 0, /* U+002abf: SUBSET WITH PLUS SIGN BELOW*/
+ 0, /* U+002ac0: SUPERSET WITH PLUS SIGN BELOW*/
+ 0, /* U+002ac1: SUBSET WITH MULTIPLICATION SIGN BELOW*/
+ 0, /* U+002ac2: SUPERSET WITH MULTIPLICATION SIGN BELOW*/
+ 0, /* U+002ac3: SUBSET OF OR EQUAL TO WITH DOT ABOVE*/
+ 0, /* U+002ac4: SUPERSET OF OR EQUAL TO WITH DOT ABOVE*/
+ 0, /* U+002ac5: SUBSET OF ABOVE EQUALS SIGN*/
+ 0, /* U+002ac6: SUPERSET OF ABOVE EQUALS SIGN*/
+ 0, /* U+002ac7: SUBSET OF ABOVE TILDE OPERATOR*/
+ 0, /* U+002ac8: SUPERSET OF ABOVE TILDE OPERATOR*/
+ 0, /* U+002ac9: SUBSET OF ABOVE ALMOST EQUAL TO*/
+ 0, /* U+002aca: SUPERSET OF ABOVE ALMOST EQUAL TO*/
+ 0, /* U+002acb: SUBSET OF ABOVE NOT EQUAL TO*/
+ 0, /* U+002acc: SUPERSET OF ABOVE NOT EQUAL TO*/
+ 0, /* U+002acd: SQUARE LEFT OPEN BOX OPERATOR*/
+ 0, /* U+002ace: SQUARE RIGHT OPEN BOX OPERATOR*/
+ 0, /* U+002acf: CLOSED SUBSET*/
+ 0, /* U+002ad0: CLOSED SUPERSET*/
+ 0, /* U+002ad1: CLOSED SUBSET OR EQUAL TO*/
+ 0, /* U+002ad2: CLOSED SUPERSET OR EQUAL TO*/
+ 0, /* U+002ad3: SUBSET ABOVE SUPERSET*/
+ 0, /* U+002ad4: SUPERSET ABOVE SUBSET*/
+ 0, /* U+002ad5: SUBSET ABOVE SUBSET*/
+ 0, /* U+002ad6: SUPERSET ABOVE SUPERSET*/
+ 0, /* U+002ad7: SUPERSET BESIDE SUBSET*/
+ 0, /* U+002ad8: SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET*/
+ 0, /* U+002ad9: ELEMENT OF OPENING DOWNWARDS*/
+ 0, /* U+002ada: PITCHFORK WITH TEE TOP*/
+ 0, /* U+002adb: TRANSVERSAL INTERSECTION*/
+ 0, /* U+002adc: FORKING*/
+ 0, /* U+002add: NONFORKING*/
+ 0, /* U+002ade: SHORT LEFT TACK*/
+ 0, /* U+002adf: SHORT DOWN TACK*/
+ 0, /* U+002ae0: SHORT UP TACK*/
+ 0, /* U+002ae1: PERPENDICULAR WITH S*/
+ 0, /* U+002ae2: VERTICAL BAR TRIPLE RIGHT TURNSTILE*/
+ 0, /* U+002ae3: DOUBLE VERTICAL BAR LEFT TURNSTILE*/
+ 0, /* U+002ae4: VERTICAL BAR DOUBLE LEFT TURNSTILE*/
+ 0, /* U+002ae5: DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE*/
+ 0, /* U+002ae6: LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL*/
+ 0, /* U+002ae7: SHORT DOWN TACK WITH OVERBAR*/
+ 0, /* U+002ae8: SHORT UP TACK WITH UNDERBAR*/
+ 0, /* U+002ae9: SHORT UP TACK ABOVE SHORT DOWN TACK*/
+ 0, /* U+002aea: DOUBLE DOWN TACK*/
+ 0, /* U+002aeb: DOUBLE UP TACK*/
+ 0, /* U+002aec: DOUBLE STROKE NOT SIGN*/
+ 0, /* U+002aed: REVERSED DOUBLE STROKE NOT SIGN*/
+ 0, /* U+002aee: DOES NOT DIVIDE WITH REVERSED NEGATION SLASH*/
+ 0, /* U+002aef: VERTICAL LINE WITH CIRCLE ABOVE*/
+ 0, /* U+002af0: VERTICAL LINE WITH CIRCLE BELOW*/
+ 0, /* U+002af1: DOWN TACK WITH CIRCLE BELOW*/
+ 0, /* U+002af2: PARALLEL WITH HORIZONTAL STROKE*/
+ 0, /* U+002af3: PARALLEL WITH TILDE OPERATOR*/
+ 0, /* U+002af4: TRIPLE VERTICAL BAR BINARY RELATION*/
+ 0, /* U+002af5: TRIPLE VERTICAL BAR WITH HORIZONTAL STROKE*/
+ 0, /* U+002af6: TRIPLE COLON OPERATOR*/
+ 0, /* U+002af7: TRIPLE NESTED LESS-THAN*/
+ 0, /* U+002af8: TRIPLE NESTED GREATER-THAN*/
+ 0, /* U+002af9: DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO*/
+ 0, /* U+002afa: DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO*/
+ 0, /* U+002afb: TRIPLE SOLIDUS BINARY RELATION*/
+ 0, /* U+002afc: LARGE TRIPLE VERTICAL BAR OPERATOR*/
+ 0, /* U+002afd: DOUBLE SOLIDUS OPERATOR*/
+ 0, /* U+002afe: WHITE VERTICAL BAR*/
+ 0, /* U+002aff: N-ARY WHITE VERTICAL BAR*/
+ 0, /* U+002b00: NORTH EAST WHITE ARROW*/
+ 0, /* U+002b01: NORTH WEST WHITE ARROW*/
+ 0, /* U+002b02: SOUTH EAST WHITE ARROW*/
+ 0, /* U+002b03: SOUTH WEST WHITE ARROW*/
+ 0, /* U+002b04: LEFT RIGHT WHITE ARROW*/
+ 0, /* U+002b05: LEFTWARDS BLACK ARROW*/
+ 0, /* U+002b06: UPWARDS BLACK ARROW*/
+ 0, /* U+002b07: DOWNWARDS BLACK ARROW*/
+ 0, /* U+002b08: NORTH EAST BLACK ARROW*/
+ 0, /* U+002b09: NORTH WEST BLACK ARROW*/
+ 0, /* U+002b0a: SOUTH EAST BLACK ARROW*/
+ 0, /* U+002b0b: SOUTH WEST BLACK ARROW*/
+ 0, /* U+002b0c: LEFT RIGHT BLACK ARROW*/
+ 0, /* U+002b0d: UP DOWN BLACK ARROW*/
+ 0, /* U+002b0e: RIGHTWARDS ARROW WITH TIP DOWNWARDS*/
+ 0, /* U+002b0f: RIGHTWARDS ARROW WITH TIP UPWARDS*/
+ 0, /* U+002b10: LEFTWARDS ARROW WITH TIP DOWNWARDS*/
+ 0, /* U+002b11: LEFTWARDS ARROW WITH TIP UPWARDS*/
+ 0, /* U+002b12: SQUARE WITH TOP HALF BLACK*/
+ 0, /* U+002b13: SQUARE WITH BOTTOM HALF BLACK*/
+ 0, /* U+002b14: SQUARE WITH UPPER RIGHT DIAGONAL HALF BLACK*/
+ 0, /* U+002b15: SQUARE WITH LOWER LEFT DIAGONAL HALF BLACK*/
+ 0, /* U+002b16: DIAMOND WITH LEFT HALF BLACK*/
+ 0, /* U+002b17: DIAMOND WITH RIGHT HALF BLACK*/
+ 0, /* U+002b18: DIAMOND WITH TOP HALF BLACK*/
+ 0, /* U+002b19: DIAMOND WITH BOTTOM HALF BLACK*/
+ 0, /* U+002b1a: DOTTED SQUARE*/
+ 0, /* U+002b1b: BLACK LARGE SQUARE*/
+ 0, /* U+002b1c: WHITE LARGE SQUARE*/
+ 0, /* U+002b1d: BLACK VERY SMALL SQUARE*/
+ 0, /* U+002b1e: WHITE VERY SMALL SQUARE*/
+ 0, /* U+002b1f: BLACK PENTAGON*/
+ 0, /* U+002b20: WHITE PENTAGON*/
+ 0, /* U+002b21: WHITE HEXAGON*/
+ 0, /* U+002b22: BLACK HEXAGON*/
+ 0, /* U+002b23: HORIZONTAL BLACK HEXAGON*/
+ 0, /* U+002b24: BLACK LARGE CIRCLE*/
+ 0, /* U+002b25: BLACK MEDIUM DIAMOND*/
+ 0, /* U+002b26: WHITE MEDIUM DIAMOND*/
+ 0, /* U+002b27: BLACK MEDIUM LOZENGE*/
+ 0, /* U+002b28: WHITE MEDIUM LOZENGE*/
+ 0, /* U+002b29: BLACK SMALL DIAMOND*/
+ 0, /* U+002b2a: BLACK SMALL LOZENGE*/
+ 0, /* U+002b2b: WHITE SMALL LOZENGE*/
+ 0, /* U+002b2c: BLACK HORIZONTAL ELLIPSE*/
+ 0, /* U+002b2d: WHITE HORIZONTAL ELLIPSE*/
+ 0, /* U+002b2e: BLACK VERTICAL ELLIPSE*/
+ 0, /* U+002b2f: WHITE VERTICAL ELLIPSE*/
+ 0, /* U+002b30: LEFT ARROW WITH SMALL CIRCLE*/
+ 0, /* U+002b31: THREE LEFTWARDS ARROWS*/
+ 0, /* U+002b32: LEFT ARROW WITH CIRCLED PLUS*/
+ 0, /* U+002b33: LONG LEFTWARDS SQUIGGLE ARROW*/
+ 0, /* U+002b34: LEFTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE*/
+ 0, /* U+002b35: LEFTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE*/
+ 0, /* U+002b36: LEFTWARDS TWO-HEADED ARROW FROM BAR*/
+ 0, /* U+002b37: LEFTWARDS TWO-HEADED TRIPLE DASH ARROW*/
+ 0, /* U+002b38: LEFTWARDS ARROW WITH DOTTED STEM*/
+ 0, /* U+002b39: LEFTWARDS ARROW WITH TAIL WITH VERTICAL STROKE*/
+ 0, /* U+002b3a: LEFTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE*/
+ 0, /* U+002b3b: LEFTWARDS TWO-HEADED ARROW WITH TAIL*/
+ 0, /* U+002b3c: LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE*/
+ 0, /* U+002b3d: LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE*/
+ 0, /* U+002b3e: LEFTWARDS ARROW THROUGH X*/
+ 0, /* U+002b3f: WAVE ARROW POINTING DIRECTLY LEFT*/
+ 0, /* U+002b40: EQUALS SIGN ABOVE LEFTWARDS ARROW*/
+ 0, /* U+002b41: REVERSE TILDE OPERATOR ABOVE LEFTWARDS ARROW*/
+ 0, /* U+002b42: LEFTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO*/
+ 0, /* U+002b43: RIGHTWARDS ARROW THROUGH GREATER-THAN*/
+ 0, /* U+002b44: RIGHTWARDS ARROW THROUGH SUPERSET*/
+ 0, /* U+002b45: LEFTWARDS QUADRUPLE ARROW*/
+ 0, /* U+002b46: RIGHTWARDS QUADRUPLE ARROW*/
+ 0, /* U+002b47: REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW*/
+ 0, /* U+002b48: RIGHTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO*/
+ 0, /* U+002b49: TILDE OPERATOR ABOVE LEFTWARDS ARROW*/
+ 0, /* U+002b4a: LEFTWARDS ARROW ABOVE ALMOST EQUAL TO*/
+ 0, /* U+002b4b: LEFTWARDS ARROW ABOVE REVERSE TILDE OPERATOR*/
+ 0, /* U+002b4c: RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR*/
+ 0, /* U+002b4d: */
+ 0, /* U+002b4e: */
+ 0, /* U+002b4f: */
+ 0, /* U+002b50: WHITE MEDIUM STAR*/
+ 0, /* U+002b51: BLACK SMALL STAR*/
+ 0, /* U+002b52: WHITE SMALL STAR*/
+ 0, /* U+002b53: BLACK RIGHT-POINTING PENTAGON*/
+ 0, /* U+002b54: WHITE RIGHT-POINTING PENTAGON*/
+ 0, /* U+002b55: HEAVY LARGE CIRCLE*/
+ 0, /* U+002b56: HEAVY OVAL WITH OVAL INSIDE*/
+ 0, /* U+002b57: HEAVY CIRCLE WITH CIRCLE INSIDE*/
+ 0, /* U+002b58: HEAVY CIRCLE*/
+ 0, /* U+002b59: HEAVY CIRCLED SALTIRE*/
+ 0, /* U+002b5a: */
+ 0, /* U+002b5b: */
+ 0, /* U+002b5c: */
+ 0, /* U+002b5d: */
+ 0, /* U+002b5e: */
+ 0, /* U+002b5f: */
+ 0, /* U+002b60: */
+ 0, /* U+002b61: */
+ 0, /* U+002b62: */
+ 0, /* U+002b63: */
+ 0, /* U+002b64: */
+ 0, /* U+002b65: */
+ 0, /* U+002b66: */
+ 0, /* U+002b67: */
+ 0, /* U+002b68: */
+ 0, /* U+002b69: */
+ 0, /* U+002b6a: */
+ 0, /* U+002b6b: */
+ 0, /* U+002b6c: */
+ 0, /* U+002b6d: */
+ 0, /* U+002b6e: */
+ 0, /* U+002b6f: */
+ 0, /* U+002b70: */
+ 0, /* U+002b71: */
+ 0, /* U+002b72: */
+ 0, /* U+002b73: */
+ 0, /* U+002b74: */
+ 0, /* U+002b75: */
+ 0, /* U+002b76: */
+ 0, /* U+002b77: */
+ 0, /* U+002b78: */
+ 0, /* U+002b79: */
+ 0, /* U+002b7a: */
+ 0, /* U+002b7b: */
+ 0, /* U+002b7c: */
+ 0, /* U+002b7d: */
+ 0, /* U+002b7e: */
+ 0, /* U+002b7f: */
+ 0, /* U+002b80: */
+ 0, /* U+002b81: */
+ 0, /* U+002b82: */
+ 0, /* U+002b83: */
+ 0, /* U+002b84: */
+ 0, /* U+002b85: */
+ 0, /* U+002b86: */
+ 0, /* U+002b87: */
+ 0, /* U+002b88: */
+ 0, /* U+002b89: */
+ 0, /* U+002b8a: */
+ 0, /* U+002b8b: */
+ 0, /* U+002b8c: */
+ 0, /* U+002b8d: */
+ 0, /* U+002b8e: */
+ 0, /* U+002b8f: */
+ 0, /* U+002b90: */
+ 0, /* U+002b91: */
+ 0, /* U+002b92: */
+ 0, /* U+002b93: */
+ 0, /* U+002b94: */
+ 0, /* U+002b95: */
+ 0, /* U+002b96: */
+ 0, /* U+002b97: */
+ 0, /* U+002b98: */
+ 0, /* U+002b99: */
+ 0, /* U+002b9a: */
+ 0, /* U+002b9b: */
+ 0, /* U+002b9c: */
+ 0, /* U+002b9d: */
+ 0, /* U+002b9e: */
+ 0, /* U+002b9f: */
+ 0, /* U+002ba0: */
+ 0, /* U+002ba1: */
+ 0, /* U+002ba2: */
+ 0, /* U+002ba3: */
+ 0, /* U+002ba4: */
+ 0, /* U+002ba5: */
+ 0, /* U+002ba6: */
+ 0, /* U+002ba7: */
+ 0, /* U+002ba8: */
+ 0, /* U+002ba9: */
+ 0, /* U+002baa: */
+ 0, /* U+002bab: */
+ 0, /* U+002bac: */
+ 0, /* U+002bad: */
+ 0, /* U+002bae: */
+ 0, /* U+002baf: */
+ 0, /* U+002bb0: */
+ 0, /* U+002bb1: */
+ 0, /* U+002bb2: */
+ 0, /* U+002bb3: */
+ 0, /* U+002bb4: */
+ 0, /* U+002bb5: */
+ 0, /* U+002bb6: */
+ 0, /* U+002bb7: */
+ 0, /* U+002bb8: */
+ 0, /* U+002bb9: */
+ 0, /* U+002bba: */
+ 0, /* U+002bbb: */
+ 0, /* U+002bbc: */
+ 0, /* U+002bbd: */
+ 0, /* U+002bbe: */
+ 0, /* U+002bbf: */
+ 0, /* U+002bc0: */
+ 0, /* U+002bc1: */
+ 0, /* U+002bc2: */
+ 0, /* U+002bc3: */
+ 0, /* U+002bc4: */
+ 0, /* U+002bc5: */
+ 0, /* U+002bc6: */
+ 0, /* U+002bc7: */
+ 0, /* U+002bc8: */
+ 0, /* U+002bc9: */
+ 0, /* U+002bca: */
+ 0, /* U+002bcb: */
+ 0, /* U+002bcc: */
+ 0, /* U+002bcd: */
+ 0, /* U+002bce: */
+ 0, /* U+002bcf: */
+ 0, /* U+002bd0: */
+ 0, /* U+002bd1: */
+ 0, /* U+002bd2: */
+ 0, /* U+002bd3: */
+ 0, /* U+002bd4: */
+ 0, /* U+002bd5: */
+ 0, /* U+002bd6: */
+ 0, /* U+002bd7: */
+ 0, /* U+002bd8: */
+ 0, /* U+002bd9: */
+ 0, /* U+002bda: */
+ 0, /* U+002bdb: */
+ 0, /* U+002bdc: */
+ 0, /* U+002bdd: */
+ 0, /* U+002bde: */
+ 0, /* U+002bdf: */
+ 0, /* U+002be0: */
+ 0, /* U+002be1: */
+ 0, /* U+002be2: */
+ 0, /* U+002be3: */
+ 0, /* U+002be4: */
+ 0, /* U+002be5: */
+ 0, /* U+002be6: */
+ 0, /* U+002be7: */
+ 0, /* U+002be8: */
+ 0, /* U+002be9: */
+ 0, /* U+002bea: */
+ 0, /* U+002beb: */
+ 0, /* U+002bec: */
+ 0, /* U+002bed: */
+ 0, /* U+002bee: */
+ 0, /* U+002bef: */
+ 0, /* U+002bf0: */
+ 0, /* U+002bf1: */
+ 0, /* U+002bf2: */
+ 0, /* U+002bf3: */
+ 0, /* U+002bf4: */
+ 0, /* U+002bf5: */
+ 0, /* U+002bf6: */
+ 0, /* U+002bf7: */
+ 0, /* U+002bf8: */
+ 0, /* U+002bf9: */
+ 0, /* U+002bfa: */
+ 0, /* U+002bfb: */
+ 0, /* U+002bfc: */
+ 0, /* U+002bfd: */
+ 0, /* U+002bfe: */
+ 0, /* U+002bff: */
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c00: GLAGOLITIC CAPITAL LETTER AZU*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c01: GLAGOLITIC CAPITAL LETTER BUKY*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c02: GLAGOLITIC CAPITAL LETTER VEDE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c03: GLAGOLITIC CAPITAL LETTER GLAGOLI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c04: GLAGOLITIC CAPITAL LETTER DOBRO*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c05: GLAGOLITIC CAPITAL LETTER YESTU*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c06: GLAGOLITIC CAPITAL LETTER ZHIVETE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c07: GLAGOLITIC CAPITAL LETTER DZELO*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c08: GLAGOLITIC CAPITAL LETTER ZEMLJA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c09: GLAGOLITIC CAPITAL LETTER IZHE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c0a: GLAGOLITIC CAPITAL LETTER INITIAL IZHE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c0b: GLAGOLITIC CAPITAL LETTER I*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c0c: GLAGOLITIC CAPITAL LETTER DJERVI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c0d: GLAGOLITIC CAPITAL LETTER KAKO*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c0e: GLAGOLITIC CAPITAL LETTER LJUDIJE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c0f: GLAGOLITIC CAPITAL LETTER MYSLITE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c10: GLAGOLITIC CAPITAL LETTER NASHI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c11: GLAGOLITIC CAPITAL LETTER ONU*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c12: GLAGOLITIC CAPITAL LETTER POKOJI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c13: GLAGOLITIC CAPITAL LETTER RITSI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c14: GLAGOLITIC CAPITAL LETTER SLOVO*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c15: GLAGOLITIC CAPITAL LETTER TVRIDO*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c16: GLAGOLITIC CAPITAL LETTER UKU*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c17: GLAGOLITIC CAPITAL LETTER FRITU*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c18: GLAGOLITIC CAPITAL LETTER HERU*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c19: GLAGOLITIC CAPITAL LETTER OTU*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c1a: GLAGOLITIC CAPITAL LETTER PE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c1b: GLAGOLITIC CAPITAL LETTER SHTA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c1c: GLAGOLITIC CAPITAL LETTER TSI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c1d: GLAGOLITIC CAPITAL LETTER CHRIVI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c1e: GLAGOLITIC CAPITAL LETTER SHA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c1f: GLAGOLITIC CAPITAL LETTER YERU*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c20: GLAGOLITIC CAPITAL LETTER YERI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c21: GLAGOLITIC CAPITAL LETTER YATI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c22: GLAGOLITIC CAPITAL LETTER SPIDERY HA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c23: GLAGOLITIC CAPITAL LETTER YU*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c24: GLAGOLITIC CAPITAL LETTER SMALL YUS*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c25: GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c26: GLAGOLITIC CAPITAL LETTER YO*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c27: GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c28: GLAGOLITIC CAPITAL LETTER BIG YUS*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c29: GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c2a: GLAGOLITIC CAPITAL LETTER FITA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c2b: GLAGOLITIC CAPITAL LETTER IZHITSA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c2c: GLAGOLITIC CAPITAL LETTER SHTAPIC*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c2d: GLAGOLITIC CAPITAL LETTER TROKUTASTI A*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c2e: GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE*/
+ 0, /* U+002c2f: */
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c30: GLAGOLITIC SMALL LETTER AZU*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c31: GLAGOLITIC SMALL LETTER BUKY*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c32: GLAGOLITIC SMALL LETTER VEDE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c33: GLAGOLITIC SMALL LETTER GLAGOLI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c34: GLAGOLITIC SMALL LETTER DOBRO*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c35: GLAGOLITIC SMALL LETTER YESTU*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c36: GLAGOLITIC SMALL LETTER ZHIVETE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c37: GLAGOLITIC SMALL LETTER DZELO*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c38: GLAGOLITIC SMALL LETTER ZEMLJA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c39: GLAGOLITIC SMALL LETTER IZHE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c3a: GLAGOLITIC SMALL LETTER INITIAL IZHE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c3b: GLAGOLITIC SMALL LETTER I*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c3c: GLAGOLITIC SMALL LETTER DJERVI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c3d: GLAGOLITIC SMALL LETTER KAKO*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c3e: GLAGOLITIC SMALL LETTER LJUDIJE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c3f: GLAGOLITIC SMALL LETTER MYSLITE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c40: GLAGOLITIC SMALL LETTER NASHI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c41: GLAGOLITIC SMALL LETTER ONU*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c42: GLAGOLITIC SMALL LETTER POKOJI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c43: GLAGOLITIC SMALL LETTER RITSI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c44: GLAGOLITIC SMALL LETTER SLOVO*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c45: GLAGOLITIC SMALL LETTER TVRIDO*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c46: GLAGOLITIC SMALL LETTER UKU*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c47: GLAGOLITIC SMALL LETTER FRITU*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c48: GLAGOLITIC SMALL LETTER HERU*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c49: GLAGOLITIC SMALL LETTER OTU*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c4a: GLAGOLITIC SMALL LETTER PE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c4b: GLAGOLITIC SMALL LETTER SHTA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c4c: GLAGOLITIC SMALL LETTER TSI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c4d: GLAGOLITIC SMALL LETTER CHRIVI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c4e: GLAGOLITIC SMALL LETTER SHA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c4f: GLAGOLITIC SMALL LETTER YERU*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c50: GLAGOLITIC SMALL LETTER YERI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c51: GLAGOLITIC SMALL LETTER YATI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c52: GLAGOLITIC SMALL LETTER SPIDERY HA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c53: GLAGOLITIC SMALL LETTER YU*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c54: GLAGOLITIC SMALL LETTER SMALL YUS*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c55: GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c56: GLAGOLITIC SMALL LETTER YO*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c57: GLAGOLITIC SMALL LETTER IOTATED SMALL YUS*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c58: GLAGOLITIC SMALL LETTER BIG YUS*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c59: GLAGOLITIC SMALL LETTER IOTATED BIG YUS*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c5a: GLAGOLITIC SMALL LETTER FITA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c5b: GLAGOLITIC SMALL LETTER IZHITSA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c5c: GLAGOLITIC SMALL LETTER SHTAPIC*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c5d: GLAGOLITIC SMALL LETTER TROKUTASTI A*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c5e: GLAGOLITIC SMALL LETTER LATINATE MYSLITE*/
+ 0, /* U+002c5f: */
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c60: LATIN CAPITAL LETTER L WITH DOUBLE BAR*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c61: LATIN SMALL LETTER L WITH DOUBLE BAR*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c62: LATIN CAPITAL LETTER L WITH MIDDLE TILDE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c63: LATIN CAPITAL LETTER P WITH STROKE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c64: LATIN CAPITAL LETTER R WITH TAIL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c65: LATIN SMALL LETTER A WITH STROKE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c66: LATIN SMALL LETTER T WITH DIAGONAL STROKE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c67: LATIN CAPITAL LETTER H WITH DESCENDER*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c68: LATIN SMALL LETTER H WITH DESCENDER*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c69: LATIN CAPITAL LETTER K WITH DESCENDER*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c6a: LATIN SMALL LETTER K WITH DESCENDER*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c6b: LATIN CAPITAL LETTER Z WITH DESCENDER*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c6c: LATIN SMALL LETTER Z WITH DESCENDER*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c6d: LATIN CAPITAL LETTER ALPHA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c6e: LATIN CAPITAL LETTER M WITH HOOK*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c6f: LATIN CAPITAL LETTER TURNED A*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c70: LATIN CAPITAL LETTER TURNED ALPHA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c71: LATIN SMALL LETTER V WITH RIGHT HOOK*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c72: LATIN CAPITAL LETTER W WITH HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c73: LATIN SMALL LETTER W WITH HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c74: LATIN SMALL LETTER V WITH CURL*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c75: LATIN CAPITAL LETTER HALF H*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c76: LATIN SMALL LETTER HALF H*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c77: LATIN SMALL LETTER TAILLESS PHI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c78: LATIN SMALL LETTER E WITH NOTCH*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c79: LATIN SMALL LETTER TURNED R WITH TAIL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c7a: LATIN SMALL LETTER O WITH LOW RING INSIDE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c7b: LATIN LETTER SMALL CAPITAL TURNED E*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c7c: LATIN SUBSCRIPT SMALL LETTER J*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c7d: MODIFIER LETTER CAPITAL V*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c7e: LATIN CAPITAL LETTER S WITH SWASH TAIL*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c7f: LATIN CAPITAL LETTER Z WITH SWASH TAIL*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c80: COPTIC CAPITAL LETTER ALFA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c81: COPTIC SMALL LETTER ALFA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c82: COPTIC CAPITAL LETTER VIDA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c83: COPTIC SMALL LETTER VIDA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c84: COPTIC CAPITAL LETTER GAMMA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c85: COPTIC SMALL LETTER GAMMA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c86: COPTIC CAPITAL LETTER DALDA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c87: COPTIC SMALL LETTER DALDA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c88: COPTIC CAPITAL LETTER EIE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c89: COPTIC SMALL LETTER EIE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c8a: COPTIC CAPITAL LETTER SOU*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c8b: COPTIC SMALL LETTER SOU*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c8c: COPTIC CAPITAL LETTER ZATA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c8d: COPTIC SMALL LETTER ZATA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c8e: COPTIC CAPITAL LETTER HATE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c8f: COPTIC SMALL LETTER HATE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c90: COPTIC CAPITAL LETTER THETHE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c91: COPTIC SMALL LETTER THETHE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c92: COPTIC CAPITAL LETTER IAUDA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c93: COPTIC SMALL LETTER IAUDA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c94: COPTIC CAPITAL LETTER KAPA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c95: COPTIC SMALL LETTER KAPA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c96: COPTIC CAPITAL LETTER LAULA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c97: COPTIC SMALL LETTER LAULA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c98: COPTIC CAPITAL LETTER MI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c99: COPTIC SMALL LETTER MI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c9a: COPTIC CAPITAL LETTER NI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c9b: COPTIC SMALL LETTER NI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c9c: COPTIC CAPITAL LETTER KSI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c9d: COPTIC SMALL LETTER KSI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002c9e: COPTIC CAPITAL LETTER O*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002c9f: COPTIC SMALL LETTER O*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002ca0: COPTIC CAPITAL LETTER PI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002ca1: COPTIC SMALL LETTER PI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002ca2: COPTIC CAPITAL LETTER RO*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002ca3: COPTIC SMALL LETTER RO*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002ca4: COPTIC CAPITAL LETTER SIMA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002ca5: COPTIC SMALL LETTER SIMA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002ca6: COPTIC CAPITAL LETTER TAU*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002ca7: COPTIC SMALL LETTER TAU*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002ca8: COPTIC CAPITAL LETTER UA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002ca9: COPTIC SMALL LETTER UA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002caa: COPTIC CAPITAL LETTER FI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002cab: COPTIC SMALL LETTER FI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002cac: COPTIC CAPITAL LETTER KHI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002cad: COPTIC SMALL LETTER KHI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002cae: COPTIC CAPITAL LETTER PSI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002caf: COPTIC SMALL LETTER PSI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002cb0: COPTIC CAPITAL LETTER OOU*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002cb1: COPTIC SMALL LETTER OOU*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002cb2: COPTIC CAPITAL LETTER DIALECT-P ALEF*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002cb3: COPTIC SMALL LETTER DIALECT-P ALEF*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002cb4: COPTIC CAPITAL LETTER OLD COPTIC AIN*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002cb5: COPTIC SMALL LETTER OLD COPTIC AIN*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002cb6: COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002cb7: COPTIC SMALL LETTER CRYPTOGRAMMIC EIE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002cb8: COPTIC CAPITAL LETTER DIALECT-P KAPA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002cb9: COPTIC SMALL LETTER DIALECT-P KAPA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002cba: COPTIC CAPITAL LETTER DIALECT-P NI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002cbb: COPTIC SMALL LETTER DIALECT-P NI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002cbc: COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002cbd: COPTIC SMALL LETTER CRYPTOGRAMMIC NI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002cbe: COPTIC CAPITAL LETTER OLD COPTIC OOU*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002cbf: COPTIC SMALL LETTER OLD COPTIC OOU*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002cc0: COPTIC CAPITAL LETTER SAMPI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002cc1: COPTIC SMALL LETTER SAMPI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002cc2: COPTIC CAPITAL LETTER CROSSED SHEI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002cc3: COPTIC SMALL LETTER CROSSED SHEI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002cc4: COPTIC CAPITAL LETTER OLD COPTIC SHEI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002cc5: COPTIC SMALL LETTER OLD COPTIC SHEI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002cc6: COPTIC CAPITAL LETTER OLD COPTIC ESH*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002cc7: COPTIC SMALL LETTER OLD COPTIC ESH*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002cc8: COPTIC CAPITAL LETTER AKHMIMIC KHEI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002cc9: COPTIC SMALL LETTER AKHMIMIC KHEI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002cca: COPTIC CAPITAL LETTER DIALECT-P HORI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002ccb: COPTIC SMALL LETTER DIALECT-P HORI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002ccc: COPTIC CAPITAL LETTER OLD COPTIC HORI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002ccd: COPTIC SMALL LETTER OLD COPTIC HORI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002cce: COPTIC CAPITAL LETTER OLD COPTIC HA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002ccf: COPTIC SMALL LETTER OLD COPTIC HA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002cd0: COPTIC CAPITAL LETTER L-SHAPED HA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002cd1: COPTIC SMALL LETTER L-SHAPED HA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002cd2: COPTIC CAPITAL LETTER OLD COPTIC HEI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002cd3: COPTIC SMALL LETTER OLD COPTIC HEI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002cd4: COPTIC CAPITAL LETTER OLD COPTIC HAT*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002cd5: COPTIC SMALL LETTER OLD COPTIC HAT*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002cd6: COPTIC CAPITAL LETTER OLD COPTIC GANGIA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002cd7: COPTIC SMALL LETTER OLD COPTIC GANGIA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002cd8: COPTIC CAPITAL LETTER OLD COPTIC DJA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002cd9: COPTIC SMALL LETTER OLD COPTIC DJA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002cda: COPTIC CAPITAL LETTER OLD COPTIC SHIMA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002cdb: COPTIC SMALL LETTER OLD COPTIC SHIMA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002cdc: COPTIC CAPITAL LETTER OLD NUBIAN SHIMA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002cdd: COPTIC SMALL LETTER OLD NUBIAN SHIMA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002cde: COPTIC CAPITAL LETTER OLD NUBIAN NGI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002cdf: COPTIC SMALL LETTER OLD NUBIAN NGI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002ce0: COPTIC CAPITAL LETTER OLD NUBIAN NYI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002ce1: COPTIC SMALL LETTER OLD NUBIAN NYI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002ce2: COPTIC CAPITAL LETTER OLD NUBIAN WAU*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002ce3: COPTIC SMALL LETTER OLD NUBIAN WAU*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002ce4: COPTIC SYMBOL KAI*/
+ 0, /* U+002ce5: COPTIC SYMBOL MI RO*/
+ 0, /* U+002ce6: COPTIC SYMBOL PI RO*/
+ 0, /* U+002ce7: COPTIC SYMBOL STAUROS*/
+ 0, /* U+002ce8: COPTIC SYMBOL TAU RO*/
+ 0, /* U+002ce9: COPTIC SYMBOL KHI RO*/
+ 0, /* U+002cea: COPTIC SYMBOL SHIMA SIMA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002ceb: COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002cec: COPTIC SMALL LETTER CRYPTOGRAMMIC SHEI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002ced: COPTIC CAPITAL LETTER CRYPTOGRAMMIC GANGIA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002cee: COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA*/
+ 0, /* U+002cef: COPTIC COMBINING NI ABOVE*/
+ 0, /* U+002cf0: COPTIC COMBINING SPIRITUS ASPER*/
+ 0, /* U+002cf1: COPTIC COMBINING SPIRITUS LENIS*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+002cf2: COPTIC CAPITAL LETTER BOHAIRIC KHEI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002cf3: COPTIC SMALL LETTER BOHAIRIC KHEI*/
+ 0, /* U+002cf4: */
+ 0, /* U+002cf5: */
+ 0, /* U+002cf6: */
+ 0, /* U+002cf7: */
+ 0, /* U+002cf8: */
+ 0, /* U+002cf9: COPTIC OLD NUBIAN FULL STOP*/
+ 0, /* U+002cfa: COPTIC OLD NUBIAN DIRECT QUESTION MARK*/
+ 0, /* U+002cfb: COPTIC OLD NUBIAN INDIRECT QUESTION MARK*/
+ 0, /* U+002cfc: COPTIC OLD NUBIAN VERSE DIVIDER*/
+ 0, /* U+002cfd: COPTIC FRACTION ONE HALF*/
+ 0, /* U+002cfe: COPTIC FULL STOP*/
+ 0, /* U+002cff: COPTIC MORPHOLOGICAL DIVIDER*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002d00: GEORGIAN SMALL LETTER AN*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002d01: GEORGIAN SMALL LETTER BAN*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002d02: GEORGIAN SMALL LETTER GAN*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002d03: GEORGIAN SMALL LETTER DON*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002d04: GEORGIAN SMALL LETTER EN*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002d05: GEORGIAN SMALL LETTER VIN*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002d06: GEORGIAN SMALL LETTER ZEN*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002d07: GEORGIAN SMALL LETTER TAN*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002d08: GEORGIAN SMALL LETTER IN*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002d09: GEORGIAN SMALL LETTER KAN*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002d0a: GEORGIAN SMALL LETTER LAS*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002d0b: GEORGIAN SMALL LETTER MAN*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002d0c: GEORGIAN SMALL LETTER NAR*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002d0d: GEORGIAN SMALL LETTER ON*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002d0e: GEORGIAN SMALL LETTER PAR*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002d0f: GEORGIAN SMALL LETTER ZHAR*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002d10: GEORGIAN SMALL LETTER RAE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002d11: GEORGIAN SMALL LETTER SAN*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002d12: GEORGIAN SMALL LETTER TAR*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002d13: GEORGIAN SMALL LETTER UN*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002d14: GEORGIAN SMALL LETTER PHAR*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002d15: GEORGIAN SMALL LETTER KHAR*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002d16: GEORGIAN SMALL LETTER GHAN*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002d17: GEORGIAN SMALL LETTER QAR*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002d18: GEORGIAN SMALL LETTER SHIN*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002d19: GEORGIAN SMALL LETTER CHIN*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002d1a: GEORGIAN SMALL LETTER CAN*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002d1b: GEORGIAN SMALL LETTER JIL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002d1c: GEORGIAN SMALL LETTER CIL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002d1d: GEORGIAN SMALL LETTER CHAR*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002d1e: GEORGIAN SMALL LETTER XAN*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002d1f: GEORGIAN SMALL LETTER JHAN*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002d20: GEORGIAN SMALL LETTER HAE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002d21: GEORGIAN SMALL LETTER HE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002d22: GEORGIAN SMALL LETTER HIE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002d23: GEORGIAN SMALL LETTER WE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002d24: GEORGIAN SMALL LETTER HAR*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002d25: GEORGIAN SMALL LETTER HOE*/
+ 0, /* U+002d26: */
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002d27: GEORGIAN SMALL LETTER YN*/
+ 0, /* U+002d28: */
+ 0, /* U+002d29: */
+ 0, /* U+002d2a: */
+ 0, /* U+002d2b: */
+ 0, /* U+002d2c: */
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+002d2d: GEORGIAN SMALL LETTER AEN*/
+ 0, /* U+002d2e: */
+ 0, /* U+002d2f: */
+ RTUNI_ALPHA, /* U+002d30: TIFINAGH LETTER YA*/
+ RTUNI_ALPHA, /* U+002d31: TIFINAGH LETTER YAB*/
+ RTUNI_ALPHA, /* U+002d32: TIFINAGH LETTER YABH*/
+ RTUNI_ALPHA, /* U+002d33: TIFINAGH LETTER YAG*/
+ RTUNI_ALPHA, /* U+002d34: TIFINAGH LETTER YAGHH*/
+ RTUNI_ALPHA, /* U+002d35: TIFINAGH LETTER BERBER ACADEMY YAJ*/
+ RTUNI_ALPHA, /* U+002d36: TIFINAGH LETTER YAJ*/
+ RTUNI_ALPHA, /* U+002d37: TIFINAGH LETTER YAD*/
+ RTUNI_ALPHA, /* U+002d38: TIFINAGH LETTER YADH*/
+ RTUNI_ALPHA, /* U+002d39: TIFINAGH LETTER YADD*/
+ RTUNI_ALPHA, /* U+002d3a: TIFINAGH LETTER YADDH*/
+ RTUNI_ALPHA, /* U+002d3b: TIFINAGH LETTER YEY*/
+ RTUNI_ALPHA, /* U+002d3c: TIFINAGH LETTER YAF*/
+ RTUNI_ALPHA, /* U+002d3d: TIFINAGH LETTER YAK*/
+ RTUNI_ALPHA, /* U+002d3e: TIFINAGH LETTER TUAREG YAK*/
+ RTUNI_ALPHA, /* U+002d3f: TIFINAGH LETTER YAKHH*/
+ RTUNI_ALPHA, /* U+002d40: TIFINAGH LETTER YAH*/
+ RTUNI_ALPHA, /* U+002d41: TIFINAGH LETTER BERBER ACADEMY YAH*/
+ RTUNI_ALPHA, /* U+002d42: TIFINAGH LETTER TUAREG YAH*/
+ RTUNI_ALPHA, /* U+002d43: TIFINAGH LETTER YAHH*/
+ RTUNI_ALPHA, /* U+002d44: TIFINAGH LETTER YAA*/
+ RTUNI_ALPHA, /* U+002d45: TIFINAGH LETTER YAKH*/
+ RTUNI_ALPHA, /* U+002d46: TIFINAGH LETTER TUAREG YAKH*/
+ RTUNI_ALPHA, /* U+002d47: TIFINAGH LETTER YAQ*/
+ RTUNI_ALPHA, /* U+002d48: TIFINAGH LETTER TUAREG YAQ*/
+ RTUNI_ALPHA, /* U+002d49: TIFINAGH LETTER YI*/
+ RTUNI_ALPHA, /* U+002d4a: TIFINAGH LETTER YAZH*/
+ RTUNI_ALPHA, /* U+002d4b: TIFINAGH LETTER AHAGGAR YAZH*/
+ RTUNI_ALPHA, /* U+002d4c: TIFINAGH LETTER TUAREG YAZH*/
+ RTUNI_ALPHA, /* U+002d4d: TIFINAGH LETTER YAL*/
+ RTUNI_ALPHA, /* U+002d4e: TIFINAGH LETTER YAM*/
+ RTUNI_ALPHA, /* U+002d4f: TIFINAGH LETTER YAN*/
+ RTUNI_ALPHA, /* U+002d50: TIFINAGH LETTER TUAREG YAGN*/
+ RTUNI_ALPHA, /* U+002d51: TIFINAGH LETTER TUAREG YANG*/
+ RTUNI_ALPHA, /* U+002d52: TIFINAGH LETTER YAP*/
+ RTUNI_ALPHA, /* U+002d53: TIFINAGH LETTER YU*/
+ RTUNI_ALPHA, /* U+002d54: TIFINAGH LETTER YAR*/
+ RTUNI_ALPHA, /* U+002d55: TIFINAGH LETTER YARR*/
+ RTUNI_ALPHA, /* U+002d56: TIFINAGH LETTER YAGH*/
+ RTUNI_ALPHA, /* U+002d57: TIFINAGH LETTER TUAREG YAGH*/
+ RTUNI_ALPHA, /* U+002d58: TIFINAGH LETTER AYER YAGH*/
+ RTUNI_ALPHA, /* U+002d59: TIFINAGH LETTER YAS*/
+ RTUNI_ALPHA, /* U+002d5a: TIFINAGH LETTER YASS*/
+ RTUNI_ALPHA, /* U+002d5b: TIFINAGH LETTER YASH*/
+ RTUNI_ALPHA, /* U+002d5c: TIFINAGH LETTER YAT*/
+ RTUNI_ALPHA, /* U+002d5d: TIFINAGH LETTER YATH*/
+ RTUNI_ALPHA, /* U+002d5e: TIFINAGH LETTER YACH*/
+ RTUNI_ALPHA, /* U+002d5f: TIFINAGH LETTER YATT*/
+ RTUNI_ALPHA, /* U+002d60: TIFINAGH LETTER YAV*/
+ RTUNI_ALPHA, /* U+002d61: TIFINAGH LETTER YAW*/
+ RTUNI_ALPHA, /* U+002d62: TIFINAGH LETTER YAY*/
+ RTUNI_ALPHA, /* U+002d63: TIFINAGH LETTER YAZ*/
+ RTUNI_ALPHA, /* U+002d64: TIFINAGH LETTER TAWELLEMET YAZ*/
+ RTUNI_ALPHA, /* U+002d65: TIFINAGH LETTER YAZZ*/
+ RTUNI_ALPHA, /* U+002d66: TIFINAGH LETTER YE*/
+ RTUNI_ALPHA, /* U+002d67: TIFINAGH LETTER YO*/
+ 0, /* U+002d68: */
+ 0, /* U+002d69: */
+ 0, /* U+002d6a: */
+ 0, /* U+002d6b: */
+ 0, /* U+002d6c: */
+ 0, /* U+002d6d: */
+ 0, /* U+002d6e: */
+ RTUNI_ALPHA, /* U+002d6f: TIFINAGH MODIFIER LETTER LABIALIZATION MARK*/
+ 0, /* U+002d70: TIFINAGH SEPARATOR MARK*/
+ 0, /* U+002d71: */
+ 0, /* U+002d72: */
+ 0, /* U+002d73: */
+ 0, /* U+002d74: */
+ 0, /* U+002d75: */
+ 0, /* U+002d76: */
+ 0, /* U+002d77: */
+ 0, /* U+002d78: */
+ 0, /* U+002d79: */
+ 0, /* U+002d7a: */
+ 0, /* U+002d7b: */
+ 0, /* U+002d7c: */
+ 0, /* U+002d7d: */
+ 0, /* U+002d7e: */
+ 0, /* U+002d7f: TIFINAGH CONSONANT JOINER*/
+ RTUNI_ALPHA, /* U+002d80: ETHIOPIC SYLLABLE LOA*/
+ RTUNI_ALPHA, /* U+002d81: ETHIOPIC SYLLABLE MOA*/
+ RTUNI_ALPHA, /* U+002d82: ETHIOPIC SYLLABLE ROA*/
+ RTUNI_ALPHA, /* U+002d83: ETHIOPIC SYLLABLE SOA*/
+ RTUNI_ALPHA, /* U+002d84: ETHIOPIC SYLLABLE SHOA*/
+ RTUNI_ALPHA, /* U+002d85: ETHIOPIC SYLLABLE BOA*/
+ RTUNI_ALPHA, /* U+002d86: ETHIOPIC SYLLABLE TOA*/
+ RTUNI_ALPHA, /* U+002d87: ETHIOPIC SYLLABLE COA*/
+ RTUNI_ALPHA, /* U+002d88: ETHIOPIC SYLLABLE NOA*/
+ RTUNI_ALPHA, /* U+002d89: ETHIOPIC SYLLABLE NYOA*/
+ RTUNI_ALPHA, /* U+002d8a: ETHIOPIC SYLLABLE GLOTTAL OA*/
+ RTUNI_ALPHA, /* U+002d8b: ETHIOPIC SYLLABLE ZOA*/
+ RTUNI_ALPHA, /* U+002d8c: ETHIOPIC SYLLABLE DOA*/
+ RTUNI_ALPHA, /* U+002d8d: ETHIOPIC SYLLABLE DDOA*/
+ RTUNI_ALPHA, /* U+002d8e: ETHIOPIC SYLLABLE JOA*/
+ RTUNI_ALPHA, /* U+002d8f: ETHIOPIC SYLLABLE THOA*/
+ RTUNI_ALPHA, /* U+002d90: ETHIOPIC SYLLABLE CHOA*/
+ RTUNI_ALPHA, /* U+002d91: ETHIOPIC SYLLABLE PHOA*/
+ RTUNI_ALPHA, /* U+002d92: ETHIOPIC SYLLABLE POA*/
+ RTUNI_ALPHA, /* U+002d93: ETHIOPIC SYLLABLE GGWA*/
+ RTUNI_ALPHA, /* U+002d94: ETHIOPIC SYLLABLE GGWI*/
+ RTUNI_ALPHA, /* U+002d95: ETHIOPIC SYLLABLE GGWEE*/
+ RTUNI_ALPHA, /* U+002d96: ETHIOPIC SYLLABLE GGWE*/
+ 0, /* U+002d97: */
+ 0, /* U+002d98: */
+ 0, /* U+002d99: */
+ 0, /* U+002d9a: */
+ 0, /* U+002d9b: */
+ 0, /* U+002d9c: */
+ 0, /* U+002d9d: */
+ 0, /* U+002d9e: */
+ 0, /* U+002d9f: */
+ RTUNI_ALPHA, /* U+002da0: ETHIOPIC SYLLABLE SSA*/
+ RTUNI_ALPHA, /* U+002da1: ETHIOPIC SYLLABLE SSU*/
+ RTUNI_ALPHA, /* U+002da2: ETHIOPIC SYLLABLE SSI*/
+ RTUNI_ALPHA, /* U+002da3: ETHIOPIC SYLLABLE SSAA*/
+ RTUNI_ALPHA, /* U+002da4: ETHIOPIC SYLLABLE SSEE*/
+ RTUNI_ALPHA, /* U+002da5: ETHIOPIC SYLLABLE SSE*/
+ RTUNI_ALPHA, /* U+002da6: ETHIOPIC SYLLABLE SSO*/
+ 0, /* U+002da7: */
+ RTUNI_ALPHA, /* U+002da8: ETHIOPIC SYLLABLE CCA*/
+ RTUNI_ALPHA, /* U+002da9: ETHIOPIC SYLLABLE CCU*/
+ RTUNI_ALPHA, /* U+002daa: ETHIOPIC SYLLABLE CCI*/
+ RTUNI_ALPHA, /* U+002dab: ETHIOPIC SYLLABLE CCAA*/
+ RTUNI_ALPHA, /* U+002dac: ETHIOPIC SYLLABLE CCEE*/
+ RTUNI_ALPHA, /* U+002dad: ETHIOPIC SYLLABLE CCE*/
+ RTUNI_ALPHA, /* U+002dae: ETHIOPIC SYLLABLE CCO*/
+ 0, /* U+002daf: */
+ RTUNI_ALPHA, /* U+002db0: ETHIOPIC SYLLABLE ZZA*/
+ RTUNI_ALPHA, /* U+002db1: ETHIOPIC SYLLABLE ZZU*/
+ RTUNI_ALPHA, /* U+002db2: ETHIOPIC SYLLABLE ZZI*/
+ RTUNI_ALPHA, /* U+002db3: ETHIOPIC SYLLABLE ZZAA*/
+ RTUNI_ALPHA, /* U+002db4: ETHIOPIC SYLLABLE ZZEE*/
+ RTUNI_ALPHA, /* U+002db5: ETHIOPIC SYLLABLE ZZE*/
+ RTUNI_ALPHA, /* U+002db6: ETHIOPIC SYLLABLE ZZO*/
+ 0, /* U+002db7: */
+ RTUNI_ALPHA, /* U+002db8: ETHIOPIC SYLLABLE CCHA*/
+ RTUNI_ALPHA, /* U+002db9: ETHIOPIC SYLLABLE CCHU*/
+ RTUNI_ALPHA, /* U+002dba: ETHIOPIC SYLLABLE CCHI*/
+ RTUNI_ALPHA, /* U+002dbb: ETHIOPIC SYLLABLE CCHAA*/
+ RTUNI_ALPHA, /* U+002dbc: ETHIOPIC SYLLABLE CCHEE*/
+ RTUNI_ALPHA, /* U+002dbd: ETHIOPIC SYLLABLE CCHE*/
+ RTUNI_ALPHA, /* U+002dbe: ETHIOPIC SYLLABLE CCHO*/
+ 0, /* U+002dbf: */
+ RTUNI_ALPHA, /* U+002dc0: ETHIOPIC SYLLABLE QYA*/
+ RTUNI_ALPHA, /* U+002dc1: ETHIOPIC SYLLABLE QYU*/
+ RTUNI_ALPHA, /* U+002dc2: ETHIOPIC SYLLABLE QYI*/
+ RTUNI_ALPHA, /* U+002dc3: ETHIOPIC SYLLABLE QYAA*/
+ RTUNI_ALPHA, /* U+002dc4: ETHIOPIC SYLLABLE QYEE*/
+ RTUNI_ALPHA, /* U+002dc5: ETHIOPIC SYLLABLE QYE*/
+ RTUNI_ALPHA, /* U+002dc6: ETHIOPIC SYLLABLE QYO*/
+ 0, /* U+002dc7: */
+ RTUNI_ALPHA, /* U+002dc8: ETHIOPIC SYLLABLE KYA*/
+ RTUNI_ALPHA, /* U+002dc9: ETHIOPIC SYLLABLE KYU*/
+ RTUNI_ALPHA, /* U+002dca: ETHIOPIC SYLLABLE KYI*/
+ RTUNI_ALPHA, /* U+002dcb: ETHIOPIC SYLLABLE KYAA*/
+ RTUNI_ALPHA, /* U+002dcc: ETHIOPIC SYLLABLE KYEE*/
+ RTUNI_ALPHA, /* U+002dcd: ETHIOPIC SYLLABLE KYE*/
+ RTUNI_ALPHA, /* U+002dce: ETHIOPIC SYLLABLE KYO*/
+ 0, /* U+002dcf: */
+ RTUNI_ALPHA, /* U+002dd0: ETHIOPIC SYLLABLE XYA*/
+ RTUNI_ALPHA, /* U+002dd1: ETHIOPIC SYLLABLE XYU*/
+ RTUNI_ALPHA, /* U+002dd2: ETHIOPIC SYLLABLE XYI*/
+ RTUNI_ALPHA, /* U+002dd3: ETHIOPIC SYLLABLE XYAA*/
+ RTUNI_ALPHA, /* U+002dd4: ETHIOPIC SYLLABLE XYEE*/
+ RTUNI_ALPHA, /* U+002dd5: ETHIOPIC SYLLABLE XYE*/
+ RTUNI_ALPHA, /* U+002dd6: ETHIOPIC SYLLABLE XYO*/
+ 0, /* U+002dd7: */
+ RTUNI_ALPHA, /* U+002dd8: ETHIOPIC SYLLABLE GYA*/
+ RTUNI_ALPHA, /* U+002dd9: ETHIOPIC SYLLABLE GYU*/
+ RTUNI_ALPHA, /* U+002dda: ETHIOPIC SYLLABLE GYI*/
+ RTUNI_ALPHA, /* U+002ddb: ETHIOPIC SYLLABLE GYAA*/
+ RTUNI_ALPHA, /* U+002ddc: ETHIOPIC SYLLABLE GYEE*/
+ RTUNI_ALPHA, /* U+002ddd: ETHIOPIC SYLLABLE GYE*/
+ RTUNI_ALPHA, /* U+002dde: ETHIOPIC SYLLABLE GYO*/
+ 0, /* U+002ddf: */
+ RTUNI_ALPHA, /* U+002de0: COMBINING CYRILLIC LETTER BE*/
+ RTUNI_ALPHA, /* U+002de1: COMBINING CYRILLIC LETTER VE*/
+ RTUNI_ALPHA, /* U+002de2: COMBINING CYRILLIC LETTER GHE*/
+ RTUNI_ALPHA, /* U+002de3: COMBINING CYRILLIC LETTER DE*/
+ RTUNI_ALPHA, /* U+002de4: COMBINING CYRILLIC LETTER ZHE*/
+ RTUNI_ALPHA, /* U+002de5: COMBINING CYRILLIC LETTER ZE*/
+ RTUNI_ALPHA, /* U+002de6: COMBINING CYRILLIC LETTER KA*/
+ RTUNI_ALPHA, /* U+002de7: COMBINING CYRILLIC LETTER EL*/
+ RTUNI_ALPHA, /* U+002de8: COMBINING CYRILLIC LETTER EM*/
+ RTUNI_ALPHA, /* U+002de9: COMBINING CYRILLIC LETTER EN*/
+ RTUNI_ALPHA, /* U+002dea: COMBINING CYRILLIC LETTER O*/
+ RTUNI_ALPHA, /* U+002deb: COMBINING CYRILLIC LETTER PE*/
+ RTUNI_ALPHA, /* U+002dec: COMBINING CYRILLIC LETTER ER*/
+ RTUNI_ALPHA, /* U+002ded: COMBINING CYRILLIC LETTER ES*/
+ RTUNI_ALPHA, /* U+002dee: COMBINING CYRILLIC LETTER TE*/
+ RTUNI_ALPHA, /* U+002def: COMBINING CYRILLIC LETTER HA*/
+ RTUNI_ALPHA, /* U+002df0: COMBINING CYRILLIC LETTER TSE*/
+ RTUNI_ALPHA, /* U+002df1: COMBINING CYRILLIC LETTER CHE*/
+ RTUNI_ALPHA, /* U+002df2: COMBINING CYRILLIC LETTER SHA*/
+ RTUNI_ALPHA, /* U+002df3: COMBINING CYRILLIC LETTER SHCHA*/
+ RTUNI_ALPHA, /* U+002df4: COMBINING CYRILLIC LETTER FITA*/
+ RTUNI_ALPHA, /* U+002df5: COMBINING CYRILLIC LETTER ES-TE*/
+ RTUNI_ALPHA, /* U+002df6: COMBINING CYRILLIC LETTER A*/
+ RTUNI_ALPHA, /* U+002df7: COMBINING CYRILLIC LETTER IE*/
+ RTUNI_ALPHA, /* U+002df8: COMBINING CYRILLIC LETTER DJERV*/
+ RTUNI_ALPHA, /* U+002df9: COMBINING CYRILLIC LETTER MONOGRAPH UK*/
+ RTUNI_ALPHA, /* U+002dfa: COMBINING CYRILLIC LETTER YAT*/
+ RTUNI_ALPHA, /* U+002dfb: COMBINING CYRILLIC LETTER YU*/
+ RTUNI_ALPHA, /* U+002dfc: COMBINING CYRILLIC LETTER IOTIFIED A*/
+ RTUNI_ALPHA, /* U+002dfd: COMBINING CYRILLIC LETTER LITTLE YUS*/
+ RTUNI_ALPHA, /* U+002dfe: COMBINING CYRILLIC LETTER BIG YUS*/
+ RTUNI_ALPHA, /* U+002dff: COMBINING CYRILLIC LETTER IOTIFIED BIG YUS*/
+ 0, /* U+002e00: RIGHT ANGLE SUBSTITUTION MARKER*/
+ 0, /* U+002e01: RIGHT ANGLE DOTTED SUBSTITUTION MARKER*/
+ 0, /* U+002e02: LEFT SUBSTITUTION BRACKET*/
+ 0, /* U+002e03: RIGHT SUBSTITUTION BRACKET*/
+ 0, /* U+002e04: LEFT DOTTED SUBSTITUTION BRACKET*/
+ 0, /* U+002e05: RIGHT DOTTED SUBSTITUTION BRACKET*/
+ 0, /* U+002e06: RAISED INTERPOLATION MARKER*/
+ 0, /* U+002e07: RAISED DOTTED INTERPOLATION MARKER*/
+ 0, /* U+002e08: DOTTED TRANSPOSITION MARKER*/
+ 0, /* U+002e09: LEFT TRANSPOSITION BRACKET*/
+ 0, /* U+002e0a: RIGHT TRANSPOSITION BRACKET*/
+ 0, /* U+002e0b: RAISED SQUARE*/
+ 0, /* U+002e0c: LEFT RAISED OMISSION BRACKET*/
+ 0, /* U+002e0d: RIGHT RAISED OMISSION BRACKET*/
+ 0, /* U+002e0e: EDITORIAL CORONIS*/
+ 0, /* U+002e0f: PARAGRAPHOS*/
+ 0, /* U+002e10: FORKED PARAGRAPHOS*/
+ 0, /* U+002e11: REVERSED FORKED PARAGRAPHOS*/
+ 0, /* U+002e12: HYPODIASTOLE*/
+ 0, /* U+002e13: DOTTED OBELOS*/
+ 0, /* U+002e14: DOWNWARDS ANCORA*/
+ 0, /* U+002e15: UPWARDS ANCORA*/
+ 0, /* U+002e16: DOTTED RIGHT-POINTING ANGLE*/
+ 0, /* U+002e17: DOUBLE OBLIQUE HYPHEN*/
+ 0, /* U+002e18: INVERTED INTERROBANG*/
+ 0, /* U+002e19: PALM BRANCH*/
+ 0, /* U+002e1a: HYPHEN WITH DIAERESIS*/
+ 0, /* U+002e1b: TILDE WITH RING ABOVE*/
+ 0, /* U+002e1c: LEFT LOW PARAPHRASE BRACKET*/
+ 0, /* U+002e1d: RIGHT LOW PARAPHRASE BRACKET*/
+ 0, /* U+002e1e: TILDE WITH DOT ABOVE*/
+ 0, /* U+002e1f: TILDE WITH DOT BELOW*/
+ 0, /* U+002e20: LEFT VERTICAL BAR WITH QUILL*/
+ 0, /* U+002e21: RIGHT VERTICAL BAR WITH QUILL*/
+ 0, /* U+002e22: TOP LEFT HALF BRACKET*/
+ 0, /* U+002e23: TOP RIGHT HALF BRACKET*/
+ 0, /* U+002e24: BOTTOM LEFT HALF BRACKET*/
+ 0, /* U+002e25: BOTTOM RIGHT HALF BRACKET*/
+ 0, /* U+002e26: LEFT SIDEWAYS U BRACKET*/
+ 0, /* U+002e27: RIGHT SIDEWAYS U BRACKET*/
+ 0, /* U+002e28: LEFT DOUBLE PARENTHESIS*/
+ 0, /* U+002e29: RIGHT DOUBLE PARENTHESIS*/
+ 0, /* U+002e2a: TWO DOTS OVER ONE DOT PUNCTUATION*/
+ 0, /* U+002e2b: ONE DOT OVER TWO DOTS PUNCTUATION*/
+ 0, /* U+002e2c: SQUARED FOUR DOT PUNCTUATION*/
+ 0, /* U+002e2d: FIVE DOT MARK*/
+ 0, /* U+002e2e: REVERSED QUESTION MARK*/
+ RTUNI_ALPHA, /* U+002e2f: VERTICAL TILDE*/
+ 0, /* U+002e30: RING POINT*/
+ 0, /* U+002e31: WORD SEPARATOR MIDDLE DOT*/
+ 0, /* U+002e32: TURNED COMMA*/
+ 0, /* U+002e33: RAISED DOT*/
+ 0, /* U+002e34: RAISED COMMA*/
+ 0, /* U+002e35: TURNED SEMICOLON*/
+ 0, /* U+002e36: DAGGER WITH LEFT GUARD*/
+ 0, /* U+002e37: DAGGER WITH RIGHT GUARD*/
+ 0, /* U+002e38: TURNED DAGGER*/
+ 0, /* U+002e39: TOP HALF SECTION SIGN*/
+ 0, /* U+002e3a: TWO-EM DASH*/
+ 0, /* U+002e3b: THREE-EM DASH*/
+ 0, /* U+002e3c: */
+ 0, /* U+002e3d: */
+ 0, /* U+002e3e: */
+ 0, /* U+002e3f: */
+ 0, /* U+002e40: */
+ 0, /* U+002e41: */
+ 0, /* U+002e42: */
+ 0, /* U+002e43: */
+ 0, /* U+002e44: */
+ 0, /* U+002e45: */
+ 0, /* U+002e46: */
+ 0, /* U+002e47: */
+ 0, /* U+002e48: */
+ 0, /* U+002e49: */
+ 0, /* U+002e4a: */
+ 0, /* U+002e4b: */
+ 0, /* U+002e4c: */
+ 0, /* U+002e4d: */
+ 0, /* U+002e4e: */
+ 0, /* U+002e4f: */
+ 0, /* U+002e50: */
+ 0, /* U+002e51: */
+ 0, /* U+002e52: */
+ 0, /* U+002e53: */
+ 0, /* U+002e54: */
+ 0, /* U+002e55: */
+ 0, /* U+002e56: */
+ 0, /* U+002e57: */
+ 0, /* U+002e58: */
+ 0, /* U+002e59: */
+ 0, /* U+002e5a: */
+ 0, /* U+002e5b: */
+ 0, /* U+002e5c: */
+ 0, /* U+002e5d: */
+ 0, /* U+002e5e: */
+ 0, /* U+002e5f: */
+ 0, /* U+002e60: */
+ 0, /* U+002e61: */
+ 0, /* U+002e62: */
+ 0, /* U+002e63: */
+ 0, /* U+002e64: */
+ 0, /* U+002e65: */
+ 0, /* U+002e66: */
+ 0, /* U+002e67: */
+ 0, /* U+002e68: */
+ 0, /* U+002e69: */
+ 0, /* U+002e6a: */
+ 0, /* U+002e6b: */
+ 0, /* U+002e6c: */
+ 0, /* U+002e6d: */
+ 0, /* U+002e6e: */
+ 0, /* U+002e6f: */
+ 0, /* U+002e70: */
+ 0, /* U+002e71: */
+ 0, /* U+002e72: */
+ 0, /* U+002e73: */
+ 0, /* U+002e74: */
+ 0, /* U+002e75: */
+ 0, /* U+002e76: */
+ 0, /* U+002e77: */
+ 0, /* U+002e78: */
+ 0, /* U+002e79: */
+ 0, /* U+002e7a: */
+ 0, /* U+002e7b: */
+ 0, /* U+002e7c: */
+ 0, /* U+002e7d: */
+ 0, /* U+002e7e: */
+ 0, /* U+002e7f: */
+ 0, /* U+002e80: CJK RADICAL REPEAT*/
+ 0, /* U+002e81: CJK RADICAL CLIFF*/
+ 0, /* U+002e82: CJK RADICAL SECOND ONE*/
+ 0, /* U+002e83: CJK RADICAL SECOND TWO*/
+ 0, /* U+002e84: CJK RADICAL SECOND THREE*/
+ 0, /* U+002e85: CJK RADICAL PERSON*/
+ 0, /* U+002e86: CJK RADICAL BOX*/
+ 0, /* U+002e87: CJK RADICAL TABLE*/
+ 0, /* U+002e88: CJK RADICAL KNIFE ONE*/
+ 0, /* U+002e89: CJK RADICAL KNIFE TWO*/
+ 0, /* U+002e8a: CJK RADICAL DIVINATION*/
+ 0, /* U+002e8b: CJK RADICAL SEAL*/
+ 0, /* U+002e8c: CJK RADICAL SMALL ONE*/
+ 0, /* U+002e8d: CJK RADICAL SMALL TWO*/
+ 0, /* U+002e8e: CJK RADICAL LAME ONE*/
+ 0, /* U+002e8f: CJK RADICAL LAME TWO*/
+ 0, /* U+002e90: CJK RADICAL LAME THREE*/
+ 0, /* U+002e91: CJK RADICAL LAME FOUR*/
+ 0, /* U+002e92: CJK RADICAL SNAKE*/
+ 0, /* U+002e93: CJK RADICAL THREAD*/
+ 0, /* U+002e94: CJK RADICAL SNOUT ONE*/
+ 0, /* U+002e95: CJK RADICAL SNOUT TWO*/
+ 0, /* U+002e96: CJK RADICAL HEART ONE*/
+ 0, /* U+002e97: CJK RADICAL HEART TWO*/
+ 0, /* U+002e98: CJK RADICAL HAND*/
+ 0, /* U+002e99: CJK RADICAL RAP*/
+ 0, /* U+002e9a: */
+ 0, /* U+002e9b: CJK RADICAL CHOKE*/
+ 0, /* U+002e9c: CJK RADICAL SUN*/
+ 0, /* U+002e9d: CJK RADICAL MOON*/
+ 0, /* U+002e9e: CJK RADICAL DEATH*/
+ 0, /* U+002e9f: CJK RADICAL MOTHER*/
+ 0, /* U+002ea0: CJK RADICAL CIVILIAN*/
+ 0, /* U+002ea1: CJK RADICAL WATER ONE*/
+ 0, /* U+002ea2: CJK RADICAL WATER TWO*/
+ 0, /* U+002ea3: CJK RADICAL FIRE*/
+ 0, /* U+002ea4: CJK RADICAL PAW ONE*/
+ 0, /* U+002ea5: CJK RADICAL PAW TWO*/
+ 0, /* U+002ea6: CJK RADICAL SIMPLIFIED HALF TREE TRUNK*/
+ 0, /* U+002ea7: CJK RADICAL COW*/
+ 0, /* U+002ea8: CJK RADICAL DOG*/
+ 0, /* U+002ea9: CJK RADICAL JADE*/
+ 0, /* U+002eaa: CJK RADICAL BOLT OF CLOTH*/
+ 0, /* U+002eab: CJK RADICAL EYE*/
+ 0, /* U+002eac: CJK RADICAL SPIRIT ONE*/
+ 0, /* U+002ead: CJK RADICAL SPIRIT TWO*/
+ 0, /* U+002eae: CJK RADICAL BAMBOO*/
+ 0, /* U+002eaf: CJK RADICAL SILK*/
+ 0, /* U+002eb0: CJK RADICAL C-SIMPLIFIED SILK*/
+ 0, /* U+002eb1: CJK RADICAL NET ONE*/
+ 0, /* U+002eb2: CJK RADICAL NET TWO*/
+ 0, /* U+002eb3: CJK RADICAL NET THREE*/
+ 0, /* U+002eb4: CJK RADICAL NET FOUR*/
+ 0, /* U+002eb5: CJK RADICAL MESH*/
+ 0, /* U+002eb6: CJK RADICAL SHEEP*/
+ 0, /* U+002eb7: CJK RADICAL RAM*/
+ 0, /* U+002eb8: CJK RADICAL EWE*/
+ 0, /* U+002eb9: CJK RADICAL OLD*/
+ 0, /* U+002eba: CJK RADICAL BRUSH ONE*/
+ 0, /* U+002ebb: CJK RADICAL BRUSH TWO*/
+ 0, /* U+002ebc: CJK RADICAL MEAT*/
+ 0, /* U+002ebd: CJK RADICAL MORTAR*/
+ 0, /* U+002ebe: CJK RADICAL GRASS ONE*/
+ 0, /* U+002ebf: CJK RADICAL GRASS TWO*/
+ 0, /* U+002ec0: CJK RADICAL GRASS THREE*/
+ 0, /* U+002ec1: CJK RADICAL TIGER*/
+ 0, /* U+002ec2: CJK RADICAL CLOTHES*/
+ 0, /* U+002ec3: CJK RADICAL WEST ONE*/
+ 0, /* U+002ec4: CJK RADICAL WEST TWO*/
+ 0, /* U+002ec5: CJK RADICAL C-SIMPLIFIED SEE*/
+ 0, /* U+002ec6: CJK RADICAL SIMPLIFIED HORN*/
+ 0, /* U+002ec7: CJK RADICAL HORN*/
+ 0, /* U+002ec8: CJK RADICAL C-SIMPLIFIED SPEECH*/
+ 0, /* U+002ec9: CJK RADICAL C-SIMPLIFIED SHELL*/
+ 0, /* U+002eca: CJK RADICAL FOOT*/
+ 0, /* U+002ecb: CJK RADICAL C-SIMPLIFIED CART*/
+ 0, /* U+002ecc: CJK RADICAL SIMPLIFIED WALK*/
+ 0, /* U+002ecd: CJK RADICAL WALK ONE*/
+ 0, /* U+002ece: CJK RADICAL WALK TWO*/
+ 0, /* U+002ecf: CJK RADICAL CITY*/
+ 0, /* U+002ed0: CJK RADICAL C-SIMPLIFIED GOLD*/
+ 0, /* U+002ed1: CJK RADICAL LONG ONE*/
+ 0, /* U+002ed2: CJK RADICAL LONG TWO*/
+ 0, /* U+002ed3: CJK RADICAL C-SIMPLIFIED LONG*/
+ 0, /* U+002ed4: CJK RADICAL C-SIMPLIFIED GATE*/
+ 0, /* U+002ed5: CJK RADICAL MOUND ONE*/
+ 0, /* U+002ed6: CJK RADICAL MOUND TWO*/
+ 0, /* U+002ed7: CJK RADICAL RAIN*/
+ 0, /* U+002ed8: CJK RADICAL BLUE*/
+ 0, /* U+002ed9: CJK RADICAL C-SIMPLIFIED TANNED LEATHER*/
+ 0, /* U+002eda: CJK RADICAL C-SIMPLIFIED LEAF*/
+ 0, /* U+002edb: CJK RADICAL C-SIMPLIFIED WIND*/
+ 0, /* U+002edc: CJK RADICAL C-SIMPLIFIED FLY*/
+ 0, /* U+002edd: CJK RADICAL EAT ONE*/
+ 0, /* U+002ede: CJK RADICAL EAT TWO*/
+ 0, /* U+002edf: CJK RADICAL EAT THREE*/
+ 0, /* U+002ee0: CJK RADICAL C-SIMPLIFIED EAT*/
+ 0, /* U+002ee1: CJK RADICAL HEAD*/
+ 0, /* U+002ee2: CJK RADICAL C-SIMPLIFIED HORSE*/
+ 0, /* U+002ee3: CJK RADICAL BONE*/
+ 0, /* U+002ee4: CJK RADICAL GHOST*/
+ 0, /* U+002ee5: CJK RADICAL C-SIMPLIFIED FISH*/
+ 0, /* U+002ee6: CJK RADICAL C-SIMPLIFIED BIRD*/
+ 0, /* U+002ee7: CJK RADICAL C-SIMPLIFIED SALT*/
+ 0, /* U+002ee8: CJK RADICAL SIMPLIFIED WHEAT*/
+ 0, /* U+002ee9: CJK RADICAL SIMPLIFIED YELLOW*/
+ 0, /* U+002eea: CJK RADICAL C-SIMPLIFIED FROG*/
+ 0, /* U+002eeb: CJK RADICAL J-SIMPLIFIED EVEN*/
+ 0, /* U+002eec: CJK RADICAL C-SIMPLIFIED EVEN*/
+ 0, /* U+002eed: CJK RADICAL J-SIMPLIFIED TOOTH*/
+ 0, /* U+002eee: CJK RADICAL C-SIMPLIFIED TOOTH*/
+ 0, /* U+002eef: CJK RADICAL J-SIMPLIFIED DRAGON*/
+ 0, /* U+002ef0: CJK RADICAL C-SIMPLIFIED DRAGON*/
+ 0, /* U+002ef1: CJK RADICAL TURTLE*/
+ 0, /* U+002ef2: CJK RADICAL J-SIMPLIFIED TURTLE*/
+ 0, /* U+002ef3: CJK RADICAL C-SIMPLIFIED TURTLE*/
+ 0, /* U+002ef4: */
+ 0, /* U+002ef5: */
+ 0, /* U+002ef6: */
+ 0, /* U+002ef7: */
+ 0, /* U+002ef8: */
+ 0, /* U+002ef9: */
+ 0, /* U+002efa: */
+ 0, /* U+002efb: */
+ 0, /* U+002efc: */
+ 0, /* U+002efd: */
+ 0, /* U+002efe: */
+ 0, /* U+002eff: */
+ 0, /* U+002f00: KANGXI RADICAL ONE*/
+ 0, /* U+002f01: KANGXI RADICAL LINE*/
+ 0, /* U+002f02: KANGXI RADICAL DOT*/
+ 0, /* U+002f03: KANGXI RADICAL SLASH*/
+ 0, /* U+002f04: KANGXI RADICAL SECOND*/
+ 0, /* U+002f05: KANGXI RADICAL HOOK*/
+ 0, /* U+002f06: KANGXI RADICAL TWO*/
+ 0, /* U+002f07: KANGXI RADICAL LID*/
+ 0, /* U+002f08: KANGXI RADICAL MAN*/
+ 0, /* U+002f09: KANGXI RADICAL LEGS*/
+ 0, /* U+002f0a: KANGXI RADICAL ENTER*/
+ 0, /* U+002f0b: KANGXI RADICAL EIGHT*/
+ 0, /* U+002f0c: KANGXI RADICAL DOWN BOX*/
+ 0, /* U+002f0d: KANGXI RADICAL COVER*/
+ 0, /* U+002f0e: KANGXI RADICAL ICE*/
+ 0, /* U+002f0f: KANGXI RADICAL TABLE*/
+ 0, /* U+002f10: KANGXI RADICAL OPEN BOX*/
+ 0, /* U+002f11: KANGXI RADICAL KNIFE*/
+ 0, /* U+002f12: KANGXI RADICAL POWER*/
+ 0, /* U+002f13: KANGXI RADICAL WRAP*/
+ 0, /* U+002f14: KANGXI RADICAL SPOON*/
+ 0, /* U+002f15: KANGXI RADICAL RIGHT OPEN BOX*/
+ 0, /* U+002f16: KANGXI RADICAL HIDING ENCLOSURE*/
+ 0, /* U+002f17: KANGXI RADICAL TEN*/
+ 0, /* U+002f18: KANGXI RADICAL DIVINATION*/
+ 0, /* U+002f19: KANGXI RADICAL SEAL*/
+ 0, /* U+002f1a: KANGXI RADICAL CLIFF*/
+ 0, /* U+002f1b: KANGXI RADICAL PRIVATE*/
+ 0, /* U+002f1c: KANGXI RADICAL AGAIN*/
+ 0, /* U+002f1d: KANGXI RADICAL MOUTH*/
+ 0, /* U+002f1e: KANGXI RADICAL ENCLOSURE*/
+ 0, /* U+002f1f: KANGXI RADICAL EARTH*/
+ 0, /* U+002f20: KANGXI RADICAL SCHOLAR*/
+ 0, /* U+002f21: KANGXI RADICAL GO*/
+ 0, /* U+002f22: KANGXI RADICAL GO SLOWLY*/
+ 0, /* U+002f23: KANGXI RADICAL EVENING*/
+ 0, /* U+002f24: KANGXI RADICAL BIG*/
+ 0, /* U+002f25: KANGXI RADICAL WOMAN*/
+ 0, /* U+002f26: KANGXI RADICAL CHILD*/
+ 0, /* U+002f27: KANGXI RADICAL ROOF*/
+ 0, /* U+002f28: KANGXI RADICAL INCH*/
+ 0, /* U+002f29: KANGXI RADICAL SMALL*/
+ 0, /* U+002f2a: KANGXI RADICAL LAME*/
+ 0, /* U+002f2b: KANGXI RADICAL CORPSE*/
+ 0, /* U+002f2c: KANGXI RADICAL SPROUT*/
+ 0, /* U+002f2d: KANGXI RADICAL MOUNTAIN*/
+ 0, /* U+002f2e: KANGXI RADICAL RIVER*/
+ 0, /* U+002f2f: KANGXI RADICAL WORK*/
+ 0, /* U+002f30: KANGXI RADICAL ONESELF*/
+ 0, /* U+002f31: KANGXI RADICAL TURBAN*/
+ 0, /* U+002f32: KANGXI RADICAL DRY*/
+ 0, /* U+002f33: KANGXI RADICAL SHORT THREAD*/
+ 0, /* U+002f34: KANGXI RADICAL DOTTED CLIFF*/
+ 0, /* U+002f35: KANGXI RADICAL LONG STRIDE*/
+ 0, /* U+002f36: KANGXI RADICAL TWO HANDS*/
+ 0, /* U+002f37: KANGXI RADICAL SHOOT*/
+ 0, /* U+002f38: KANGXI RADICAL BOW*/
+ 0, /* U+002f39: KANGXI RADICAL SNOUT*/
+ 0, /* U+002f3a: KANGXI RADICAL BRISTLE*/
+ 0, /* U+002f3b: KANGXI RADICAL STEP*/
+ 0, /* U+002f3c: KANGXI RADICAL HEART*/
+ 0, /* U+002f3d: KANGXI RADICAL HALBERD*/
+ 0, /* U+002f3e: KANGXI RADICAL DOOR*/
+ 0, /* U+002f3f: KANGXI RADICAL HAND*/
+ 0, /* U+002f40: KANGXI RADICAL BRANCH*/
+ 0, /* U+002f41: KANGXI RADICAL RAP*/
+ 0, /* U+002f42: KANGXI RADICAL SCRIPT*/
+ 0, /* U+002f43: KANGXI RADICAL DIPPER*/
+ 0, /* U+002f44: KANGXI RADICAL AXE*/
+ 0, /* U+002f45: KANGXI RADICAL SQUARE*/
+ 0, /* U+002f46: KANGXI RADICAL NOT*/
+ 0, /* U+002f47: KANGXI RADICAL SUN*/
+ 0, /* U+002f48: KANGXI RADICAL SAY*/
+ 0, /* U+002f49: KANGXI RADICAL MOON*/
+ 0, /* U+002f4a: KANGXI RADICAL TREE*/
+ 0, /* U+002f4b: KANGXI RADICAL LACK*/
+ 0, /* U+002f4c: KANGXI RADICAL STOP*/
+ 0, /* U+002f4d: KANGXI RADICAL DEATH*/
+ 0, /* U+002f4e: KANGXI RADICAL WEAPON*/
+ 0, /* U+002f4f: KANGXI RADICAL DO NOT*/
+ 0, /* U+002f50: KANGXI RADICAL COMPARE*/
+ 0, /* U+002f51: KANGXI RADICAL FUR*/
+ 0, /* U+002f52: KANGXI RADICAL CLAN*/
+ 0, /* U+002f53: KANGXI RADICAL STEAM*/
+ 0, /* U+002f54: KANGXI RADICAL WATER*/
+ 0, /* U+002f55: KANGXI RADICAL FIRE*/
+ 0, /* U+002f56: KANGXI RADICAL CLAW*/
+ 0, /* U+002f57: KANGXI RADICAL FATHER*/
+ 0, /* U+002f58: KANGXI RADICAL DOUBLE X*/
+ 0, /* U+002f59: KANGXI RADICAL HALF TREE TRUNK*/
+ 0, /* U+002f5a: KANGXI RADICAL SLICE*/
+ 0, /* U+002f5b: KANGXI RADICAL FANG*/
+ 0, /* U+002f5c: KANGXI RADICAL COW*/
+ 0, /* U+002f5d: KANGXI RADICAL DOG*/
+ 0, /* U+002f5e: KANGXI RADICAL PROFOUND*/
+ 0, /* U+002f5f: KANGXI RADICAL JADE*/
+ 0, /* U+002f60: KANGXI RADICAL MELON*/
+ 0, /* U+002f61: KANGXI RADICAL TILE*/
+ 0, /* U+002f62: KANGXI RADICAL SWEET*/
+ 0, /* U+002f63: KANGXI RADICAL LIFE*/
+ 0, /* U+002f64: KANGXI RADICAL USE*/
+ 0, /* U+002f65: KANGXI RADICAL FIELD*/
+ 0, /* U+002f66: KANGXI RADICAL BOLT OF CLOTH*/
+ 0, /* U+002f67: KANGXI RADICAL SICKNESS*/
+ 0, /* U+002f68: KANGXI RADICAL DOTTED TENT*/
+ 0, /* U+002f69: KANGXI RADICAL WHITE*/
+ 0, /* U+002f6a: KANGXI RADICAL SKIN*/
+ 0, /* U+002f6b: KANGXI RADICAL DISH*/
+ 0, /* U+002f6c: KANGXI RADICAL EYE*/
+ 0, /* U+002f6d: KANGXI RADICAL SPEAR*/
+ 0, /* U+002f6e: KANGXI RADICAL ARROW*/
+ 0, /* U+002f6f: KANGXI RADICAL STONE*/
+ 0, /* U+002f70: KANGXI RADICAL SPIRIT*/
+ 0, /* U+002f71: KANGXI RADICAL TRACK*/
+ 0, /* U+002f72: KANGXI RADICAL GRAIN*/
+ 0, /* U+002f73: KANGXI RADICAL CAVE*/
+ 0, /* U+002f74: KANGXI RADICAL STAND*/
+ 0, /* U+002f75: KANGXI RADICAL BAMBOO*/
+ 0, /* U+002f76: KANGXI RADICAL RICE*/
+ 0, /* U+002f77: KANGXI RADICAL SILK*/
+ 0, /* U+002f78: KANGXI RADICAL JAR*/
+ 0, /* U+002f79: KANGXI RADICAL NET*/
+ 0, /* U+002f7a: KANGXI RADICAL SHEEP*/
+ 0, /* U+002f7b: KANGXI RADICAL FEATHER*/
+ 0, /* U+002f7c: KANGXI RADICAL OLD*/
+ 0, /* U+002f7d: KANGXI RADICAL AND*/
+ 0, /* U+002f7e: KANGXI RADICAL PLOW*/
+ 0, /* U+002f7f: KANGXI RADICAL EAR*/
+ 0, /* U+002f80: KANGXI RADICAL BRUSH*/
+ 0, /* U+002f81: KANGXI RADICAL MEAT*/
+ 0, /* U+002f82: KANGXI RADICAL MINISTER*/
+ 0, /* U+002f83: KANGXI RADICAL SELF*/
+ 0, /* U+002f84: KANGXI RADICAL ARRIVE*/
+ 0, /* U+002f85: KANGXI RADICAL MORTAR*/
+ 0, /* U+002f86: KANGXI RADICAL TONGUE*/
+ 0, /* U+002f87: KANGXI RADICAL OPPOSE*/
+ 0, /* U+002f88: KANGXI RADICAL BOAT*/
+ 0, /* U+002f89: KANGXI RADICAL STOPPING*/
+ 0, /* U+002f8a: KANGXI RADICAL COLOR*/
+ 0, /* U+002f8b: KANGXI RADICAL GRASS*/
+ 0, /* U+002f8c: KANGXI RADICAL TIGER*/
+ 0, /* U+002f8d: KANGXI RADICAL INSECT*/
+ 0, /* U+002f8e: KANGXI RADICAL BLOOD*/
+ 0, /* U+002f8f: KANGXI RADICAL WALK ENCLOSURE*/
+ 0, /* U+002f90: KANGXI RADICAL CLOTHES*/
+ 0, /* U+002f91: KANGXI RADICAL WEST*/
+ 0, /* U+002f92: KANGXI RADICAL SEE*/
+ 0, /* U+002f93: KANGXI RADICAL HORN*/
+ 0, /* U+002f94: KANGXI RADICAL SPEECH*/
+ 0, /* U+002f95: KANGXI RADICAL VALLEY*/
+ 0, /* U+002f96: KANGXI RADICAL BEAN*/
+ 0, /* U+002f97: KANGXI RADICAL PIG*/
+ 0, /* U+002f98: KANGXI RADICAL BADGER*/
+ 0, /* U+002f99: KANGXI RADICAL SHELL*/
+ 0, /* U+002f9a: KANGXI RADICAL RED*/
+ 0, /* U+002f9b: KANGXI RADICAL RUN*/
+ 0, /* U+002f9c: KANGXI RADICAL FOOT*/
+ 0, /* U+002f9d: KANGXI RADICAL BODY*/
+ 0, /* U+002f9e: KANGXI RADICAL CART*/
+ 0, /* U+002f9f: KANGXI RADICAL BITTER*/
+ 0, /* U+002fa0: KANGXI RADICAL MORNING*/
+ 0, /* U+002fa1: KANGXI RADICAL WALK*/
+ 0, /* U+002fa2: KANGXI RADICAL CITY*/
+ 0, /* U+002fa3: KANGXI RADICAL WINE*/
+ 0, /* U+002fa4: KANGXI RADICAL DISTINGUISH*/
+ 0, /* U+002fa5: KANGXI RADICAL VILLAGE*/
+ 0, /* U+002fa6: KANGXI RADICAL GOLD*/
+ 0, /* U+002fa7: KANGXI RADICAL LONG*/
+ 0, /* U+002fa8: KANGXI RADICAL GATE*/
+ 0, /* U+002fa9: KANGXI RADICAL MOUND*/
+ 0, /* U+002faa: KANGXI RADICAL SLAVE*/
+ 0, /* U+002fab: KANGXI RADICAL SHORT TAILED BIRD*/
+ 0, /* U+002fac: KANGXI RADICAL RAIN*/
+ 0, /* U+002fad: KANGXI RADICAL BLUE*/
+ 0, /* U+002fae: KANGXI RADICAL WRONG*/
+ 0, /* U+002faf: KANGXI RADICAL FACE*/
+ 0, /* U+002fb0: KANGXI RADICAL LEATHER*/
+ 0, /* U+002fb1: KANGXI RADICAL TANNED LEATHER*/
+ 0, /* U+002fb2: KANGXI RADICAL LEEK*/
+ 0, /* U+002fb3: KANGXI RADICAL SOUND*/
+ 0, /* U+002fb4: KANGXI RADICAL LEAF*/
+ 0, /* U+002fb5: KANGXI RADICAL WIND*/
+ 0, /* U+002fb6: KANGXI RADICAL FLY*/
+ 0, /* U+002fb7: KANGXI RADICAL EAT*/
+ 0, /* U+002fb8: KANGXI RADICAL HEAD*/
+ 0, /* U+002fb9: KANGXI RADICAL FRAGRANT*/
+ 0, /* U+002fba: KANGXI RADICAL HORSE*/
+ 0, /* U+002fbb: KANGXI RADICAL BONE*/
+ 0, /* U+002fbc: KANGXI RADICAL TALL*/
+ 0, /* U+002fbd: KANGXI RADICAL HAIR*/
+ 0, /* U+002fbe: KANGXI RADICAL FIGHT*/
+ 0, /* U+002fbf: KANGXI RADICAL SACRIFICIAL WINE*/
+ 0, /* U+002fc0: KANGXI RADICAL CAULDRON*/
+ 0, /* U+002fc1: KANGXI RADICAL GHOST*/
+ 0, /* U+002fc2: KANGXI RADICAL FISH*/
+ 0, /* U+002fc3: KANGXI RADICAL BIRD*/
+ 0, /* U+002fc4: KANGXI RADICAL SALT*/
+ 0, /* U+002fc5: KANGXI RADICAL DEER*/
+ 0, /* U+002fc6: KANGXI RADICAL WHEAT*/
+ 0, /* U+002fc7: KANGXI RADICAL HEMP*/
+ 0, /* U+002fc8: KANGXI RADICAL YELLOW*/
+ 0, /* U+002fc9: KANGXI RADICAL MILLET*/
+ 0, /* U+002fca: KANGXI RADICAL BLACK*/
+ 0, /* U+002fcb: KANGXI RADICAL EMBROIDERY*/
+ 0, /* U+002fcc: KANGXI RADICAL FROG*/
+ 0, /* U+002fcd: KANGXI RADICAL TRIPOD*/
+ 0, /* U+002fce: KANGXI RADICAL DRUM*/
+ 0, /* U+002fcf: KANGXI RADICAL RAT*/
+ 0, /* U+002fd0: KANGXI RADICAL NOSE*/
+ 0, /* U+002fd1: KANGXI RADICAL EVEN*/
+ 0, /* U+002fd2: KANGXI RADICAL TOOTH*/
+ 0, /* U+002fd3: KANGXI RADICAL DRAGON*/
+ 0, /* U+002fd4: KANGXI RADICAL TURTLE*/
+ 0, /* U+002fd5: KANGXI RADICAL FLUTE*/
+ 0, /* U+002fd6: */
+ 0, /* U+002fd7: */
+ 0, /* U+002fd8: */
+ 0, /* U+002fd9: */
+ 0, /* U+002fda: */
+ 0, /* U+002fdb: */
+ 0, /* U+002fdc: */
+ 0, /* U+002fdd: */
+ 0, /* U+002fde: */
+ 0, /* U+002fdf: */
+ 0, /* U+002fe0: */
+ 0, /* U+002fe1: */
+ 0, /* U+002fe2: */
+ 0, /* U+002fe3: */
+ 0, /* U+002fe4: */
+ 0, /* U+002fe5: */
+ 0, /* U+002fe6: */
+ 0, /* U+002fe7: */
+ 0, /* U+002fe8: */
+ 0, /* U+002fe9: */
+ 0, /* U+002fea: */
+ 0, /* U+002feb: */
+ 0, /* U+002fec: */
+ 0, /* U+002fed: */
+ 0, /* U+002fee: */
+ 0, /* U+002fef: */
+ 0, /* U+002ff0: IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT*/
+ 0, /* U+002ff1: IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW*/
+ 0, /* U+002ff2: IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT*/
+ 0, /* U+002ff3: IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW*/
+ 0, /* U+002ff4: IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND*/
+ 0, /* U+002ff5: IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM ABOVE*/
+ 0, /* U+002ff6: IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM BELOW*/
+ 0, /* U+002ff7: IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LEFT*/
+ 0, /* U+002ff8: IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER LEFT*/
+ 0, /* U+002ff9: IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER RIGHT*/
+ 0, /* U+002ffa: IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER LEFT*/
+ 0, /* U+002ffb: IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID*/
+ 0, /* U+002ffc: */
+ 0, /* U+002ffd: */
+ 0, /* U+002ffe: */
+ 0, /* U+002fff: */
+ RTUNI_WSPACE, /* U+003000: IDEOGRAPHIC SPACE*/
+ 0, /* U+003001: IDEOGRAPHIC COMMA*/
+ 0, /* U+003002: IDEOGRAPHIC FULL STOP*/
+ 0, /* U+003003: DITTO MARK*/
+ 0, /* U+003004: JAPANESE INDUSTRIAL STANDARD SYMBOL*/
+ RTUNI_ALPHA, /* U+003005: IDEOGRAPHIC ITERATION MARK*/
+ RTUNI_ALPHA, /* U+003006: IDEOGRAPHIC CLOSING MARK*/
+ RTUNI_ALPHA, /* U+003007: IDEOGRAPHIC NUMBER ZERO*/
+ 0, /* U+003008: LEFT ANGLE BRACKET*/
+ 0, /* U+003009: RIGHT ANGLE BRACKET*/
+ 0, /* U+00300a: LEFT DOUBLE ANGLE BRACKET*/
+ 0, /* U+00300b: RIGHT DOUBLE ANGLE BRACKET*/
+ 0, /* U+00300c: LEFT CORNER BRACKET*/
+ 0, /* U+00300d: RIGHT CORNER BRACKET*/
+ 0, /* U+00300e: LEFT WHITE CORNER BRACKET*/
+ 0, /* U+00300f: RIGHT WHITE CORNER BRACKET*/
+ 0, /* U+003010: LEFT BLACK LENTICULAR BRACKET*/
+ 0, /* U+003011: RIGHT BLACK LENTICULAR BRACKET*/
+ 0, /* U+003012: POSTAL MARK*/
+ 0, /* U+003013: GETA MARK*/
+ 0, /* U+003014: LEFT TORTOISE SHELL BRACKET*/
+ 0, /* U+003015: RIGHT TORTOISE SHELL BRACKET*/
+ 0, /* U+003016: LEFT WHITE LENTICULAR BRACKET*/
+ 0, /* U+003017: RIGHT WHITE LENTICULAR BRACKET*/
+ 0, /* U+003018: LEFT WHITE TORTOISE SHELL BRACKET*/
+ 0, /* U+003019: RIGHT WHITE TORTOISE SHELL BRACKET*/
+ 0, /* U+00301a: LEFT WHITE SQUARE BRACKET*/
+ 0, /* U+00301b: RIGHT WHITE SQUARE BRACKET*/
+ 0, /* U+00301c: WAVE DASH*/
+ 0, /* U+00301d: REVERSED DOUBLE PRIME QUOTATION MARK*/
+ 0, /* U+00301e: DOUBLE PRIME QUOTATION MARK*/
+ 0, /* U+00301f: LOW DOUBLE PRIME QUOTATION MARK*/
+ 0, /* U+003020: POSTAL MARK FACE*/
+ RTUNI_ALPHA, /* U+003021: HANGZHOU NUMERAL ONE*/
+ RTUNI_ALPHA, /* U+003022: HANGZHOU NUMERAL TWO*/
+ RTUNI_ALPHA, /* U+003023: HANGZHOU NUMERAL THREE*/
+ RTUNI_ALPHA, /* U+003024: HANGZHOU NUMERAL FOUR*/
+ RTUNI_ALPHA, /* U+003025: HANGZHOU NUMERAL FIVE*/
+ RTUNI_ALPHA, /* U+003026: HANGZHOU NUMERAL SIX*/
+ RTUNI_ALPHA, /* U+003027: HANGZHOU NUMERAL SEVEN*/
+ RTUNI_ALPHA, /* U+003028: HANGZHOU NUMERAL EIGHT*/
+ RTUNI_ALPHA, /* U+003029: HANGZHOU NUMERAL NINE*/
+ 0, /* U+00302a: IDEOGRAPHIC LEVEL TONE MARK*/
+ 0, /* U+00302b: IDEOGRAPHIC RISING TONE MARK*/
+ 0, /* U+00302c: IDEOGRAPHIC DEPARTING TONE MARK*/
+ 0, /* U+00302d: IDEOGRAPHIC ENTERING TONE MARK*/
+ 0, /* U+00302e: HANGUL SINGLE DOT TONE MARK*/
+ 0, /* U+00302f: HANGUL DOUBLE DOT TONE MARK*/
+ 0, /* U+003030: WAVY DASH*/
+ RTUNI_ALPHA, /* U+003031: VERTICAL KANA REPEAT MARK*/
+ RTUNI_ALPHA, /* U+003032: VERTICAL KANA REPEAT WITH VOICED SOUND MARK*/
+ RTUNI_ALPHA, /* U+003033: VERTICAL KANA REPEAT MARK UPPER HALF*/
+ RTUNI_ALPHA, /* U+003034: VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF*/
+ RTUNI_ALPHA, /* U+003035: VERTICAL KANA REPEAT MARK LOWER HALF*/
+ 0, /* U+003036: CIRCLED POSTAL MARK*/
+ 0, /* U+003037: IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL*/
+ RTUNI_ALPHA, /* U+003038: HANGZHOU NUMERAL TEN*/
+ RTUNI_ALPHA, /* U+003039: HANGZHOU NUMERAL TWENTY*/
+ RTUNI_ALPHA, /* U+00303a: HANGZHOU NUMERAL THIRTY*/
+ RTUNI_ALPHA, /* U+00303b: VERTICAL IDEOGRAPHIC ITERATION MARK*/
+ RTUNI_ALPHA, /* U+00303c: MASU MARK*/
+ 0, /* U+00303d: PART ALTERNATION MARK*/
+ 0, /* U+00303e: IDEOGRAPHIC VARIATION INDICATOR*/
+ 0, /* U+00303f: IDEOGRAPHIC HALF FILL SPACE*/
+ 0, /* U+003040: */
+ RTUNI_ALPHA, /* U+003041: HIRAGANA LETTER SMALL A*/
+ RTUNI_ALPHA, /* U+003042: HIRAGANA LETTER A*/
+ RTUNI_ALPHA, /* U+003043: HIRAGANA LETTER SMALL I*/
+ RTUNI_ALPHA, /* U+003044: HIRAGANA LETTER I*/
+ RTUNI_ALPHA, /* U+003045: HIRAGANA LETTER SMALL U*/
+ RTUNI_ALPHA, /* U+003046: HIRAGANA LETTER U*/
+ RTUNI_ALPHA, /* U+003047: HIRAGANA LETTER SMALL E*/
+ RTUNI_ALPHA, /* U+003048: HIRAGANA LETTER E*/
+ RTUNI_ALPHA, /* U+003049: HIRAGANA LETTER SMALL O*/
+ RTUNI_ALPHA, /* U+00304a: HIRAGANA LETTER O*/
+ RTUNI_ALPHA, /* U+00304b: HIRAGANA LETTER KA*/
+ RTUNI_ALPHA, /* U+00304c: HIRAGANA LETTER GA*/
+ RTUNI_ALPHA, /* U+00304d: HIRAGANA LETTER KI*/
+ RTUNI_ALPHA, /* U+00304e: HIRAGANA LETTER GI*/
+ RTUNI_ALPHA, /* U+00304f: HIRAGANA LETTER KU*/
+ RTUNI_ALPHA, /* U+003050: HIRAGANA LETTER GU*/
+ RTUNI_ALPHA, /* U+003051: HIRAGANA LETTER KE*/
+ RTUNI_ALPHA, /* U+003052: HIRAGANA LETTER GE*/
+ RTUNI_ALPHA, /* U+003053: HIRAGANA LETTER KO*/
+ RTUNI_ALPHA, /* U+003054: HIRAGANA LETTER GO*/
+ RTUNI_ALPHA, /* U+003055: HIRAGANA LETTER SA*/
+ RTUNI_ALPHA, /* U+003056: HIRAGANA LETTER ZA*/
+ RTUNI_ALPHA, /* U+003057: HIRAGANA LETTER SI*/
+ RTUNI_ALPHA, /* U+003058: HIRAGANA LETTER ZI*/
+ RTUNI_ALPHA, /* U+003059: HIRAGANA LETTER SU*/
+ RTUNI_ALPHA, /* U+00305a: HIRAGANA LETTER ZU*/
+ RTUNI_ALPHA, /* U+00305b: HIRAGANA LETTER SE*/
+ RTUNI_ALPHA, /* U+00305c: HIRAGANA LETTER ZE*/
+ RTUNI_ALPHA, /* U+00305d: HIRAGANA LETTER SO*/
+ RTUNI_ALPHA, /* U+00305e: HIRAGANA LETTER ZO*/
+ RTUNI_ALPHA, /* U+00305f: HIRAGANA LETTER TA*/
+ RTUNI_ALPHA, /* U+003060: HIRAGANA LETTER DA*/
+ RTUNI_ALPHA, /* U+003061: HIRAGANA LETTER TI*/
+ RTUNI_ALPHA, /* U+003062: HIRAGANA LETTER DI*/
+ RTUNI_ALPHA, /* U+003063: HIRAGANA LETTER SMALL TU*/
+ RTUNI_ALPHA, /* U+003064: HIRAGANA LETTER TU*/
+ RTUNI_ALPHA, /* U+003065: HIRAGANA LETTER DU*/
+ RTUNI_ALPHA, /* U+003066: HIRAGANA LETTER TE*/
+ RTUNI_ALPHA, /* U+003067: HIRAGANA LETTER DE*/
+ RTUNI_ALPHA, /* U+003068: HIRAGANA LETTER TO*/
+ RTUNI_ALPHA, /* U+003069: HIRAGANA LETTER DO*/
+ RTUNI_ALPHA, /* U+00306a: HIRAGANA LETTER NA*/
+ RTUNI_ALPHA, /* U+00306b: HIRAGANA LETTER NI*/
+ RTUNI_ALPHA, /* U+00306c: HIRAGANA LETTER NU*/
+ RTUNI_ALPHA, /* U+00306d: HIRAGANA LETTER NE*/
+ RTUNI_ALPHA, /* U+00306e: HIRAGANA LETTER NO*/
+ RTUNI_ALPHA, /* U+00306f: HIRAGANA LETTER HA*/
+ RTUNI_ALPHA, /* U+003070: HIRAGANA LETTER BA*/
+ RTUNI_ALPHA, /* U+003071: HIRAGANA LETTER PA*/
+ RTUNI_ALPHA, /* U+003072: HIRAGANA LETTER HI*/
+ RTUNI_ALPHA, /* U+003073: HIRAGANA LETTER BI*/
+ RTUNI_ALPHA, /* U+003074: HIRAGANA LETTER PI*/
+ RTUNI_ALPHA, /* U+003075: HIRAGANA LETTER HU*/
+ RTUNI_ALPHA, /* U+003076: HIRAGANA LETTER BU*/
+ RTUNI_ALPHA, /* U+003077: HIRAGANA LETTER PU*/
+ RTUNI_ALPHA, /* U+003078: HIRAGANA LETTER HE*/
+ RTUNI_ALPHA, /* U+003079: HIRAGANA LETTER BE*/
+ RTUNI_ALPHA, /* U+00307a: HIRAGANA LETTER PE*/
+ RTUNI_ALPHA, /* U+00307b: HIRAGANA LETTER HO*/
+ RTUNI_ALPHA, /* U+00307c: HIRAGANA LETTER BO*/
+ RTUNI_ALPHA, /* U+00307d: HIRAGANA LETTER PO*/
+ RTUNI_ALPHA, /* U+00307e: HIRAGANA LETTER MA*/
+ RTUNI_ALPHA, /* U+00307f: HIRAGANA LETTER MI*/
+ RTUNI_ALPHA, /* U+003080: HIRAGANA LETTER MU*/
+ RTUNI_ALPHA, /* U+003081: HIRAGANA LETTER ME*/
+ RTUNI_ALPHA, /* U+003082: HIRAGANA LETTER MO*/
+ RTUNI_ALPHA, /* U+003083: HIRAGANA LETTER SMALL YA*/
+ RTUNI_ALPHA, /* U+003084: HIRAGANA LETTER YA*/
+ RTUNI_ALPHA, /* U+003085: HIRAGANA LETTER SMALL YU*/
+ RTUNI_ALPHA, /* U+003086: HIRAGANA LETTER YU*/
+ RTUNI_ALPHA, /* U+003087: HIRAGANA LETTER SMALL YO*/
+ RTUNI_ALPHA, /* U+003088: HIRAGANA LETTER YO*/
+ RTUNI_ALPHA, /* U+003089: HIRAGANA LETTER RA*/
+ RTUNI_ALPHA, /* U+00308a: HIRAGANA LETTER RI*/
+ RTUNI_ALPHA, /* U+00308b: HIRAGANA LETTER RU*/
+ RTUNI_ALPHA, /* U+00308c: HIRAGANA LETTER RE*/
+ RTUNI_ALPHA, /* U+00308d: HIRAGANA LETTER RO*/
+ RTUNI_ALPHA, /* U+00308e: HIRAGANA LETTER SMALL WA*/
+ RTUNI_ALPHA, /* U+00308f: HIRAGANA LETTER WA*/
+ RTUNI_ALPHA, /* U+003090: HIRAGANA LETTER WI*/
+ RTUNI_ALPHA, /* U+003091: HIRAGANA LETTER WE*/
+ RTUNI_ALPHA, /* U+003092: HIRAGANA LETTER WO*/
+ RTUNI_ALPHA, /* U+003093: HIRAGANA LETTER N*/
+ RTUNI_ALPHA, /* U+003094: HIRAGANA LETTER VU*/
+ RTUNI_ALPHA, /* U+003095: HIRAGANA LETTER SMALL KA*/
+ RTUNI_ALPHA, /* U+003096: HIRAGANA LETTER SMALL KE*/
+ 0, /* U+003097: */
+ 0, /* U+003098: */
+ 0, /* U+003099: COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK*/
+ 0, /* U+00309a: COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK*/
+ 0, /* U+00309b: KATAKANA-HIRAGANA VOICED SOUND MARK*/
+ 0, /* U+00309c: KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK*/
+ RTUNI_ALPHA, /* U+00309d: HIRAGANA ITERATION MARK*/
+ RTUNI_ALPHA, /* U+00309e: HIRAGANA VOICED ITERATION MARK*/
+ RTUNI_ALPHA, /* U+00309f: HIRAGANA DIGRAPH YORI*/
+ 0, /* U+0030a0: KATAKANA-HIRAGANA DOUBLE HYPHEN*/
+ RTUNI_ALPHA, /* U+0030a1: KATAKANA LETTER SMALL A*/
+ RTUNI_ALPHA, /* U+0030a2: KATAKANA LETTER A*/
+ RTUNI_ALPHA, /* U+0030a3: KATAKANA LETTER SMALL I*/
+ RTUNI_ALPHA, /* U+0030a4: KATAKANA LETTER I*/
+ RTUNI_ALPHA, /* U+0030a5: KATAKANA LETTER SMALL U*/
+ RTUNI_ALPHA, /* U+0030a6: KATAKANA LETTER U*/
+ RTUNI_ALPHA, /* U+0030a7: KATAKANA LETTER SMALL E*/
+ RTUNI_ALPHA, /* U+0030a8: KATAKANA LETTER E*/
+ RTUNI_ALPHA, /* U+0030a9: KATAKANA LETTER SMALL O*/
+ RTUNI_ALPHA, /* U+0030aa: KATAKANA LETTER O*/
+ RTUNI_ALPHA, /* U+0030ab: KATAKANA LETTER KA*/
+ RTUNI_ALPHA, /* U+0030ac: KATAKANA LETTER GA*/
+ RTUNI_ALPHA, /* U+0030ad: KATAKANA LETTER KI*/
+ RTUNI_ALPHA, /* U+0030ae: KATAKANA LETTER GI*/
+ RTUNI_ALPHA, /* U+0030af: KATAKANA LETTER KU*/
+ RTUNI_ALPHA, /* U+0030b0: KATAKANA LETTER GU*/
+ RTUNI_ALPHA, /* U+0030b1: KATAKANA LETTER KE*/
+ RTUNI_ALPHA, /* U+0030b2: KATAKANA LETTER GE*/
+ RTUNI_ALPHA, /* U+0030b3: KATAKANA LETTER KO*/
+ RTUNI_ALPHA, /* U+0030b4: KATAKANA LETTER GO*/
+ RTUNI_ALPHA, /* U+0030b5: KATAKANA LETTER SA*/
+ RTUNI_ALPHA, /* U+0030b6: KATAKANA LETTER ZA*/
+ RTUNI_ALPHA, /* U+0030b7: KATAKANA LETTER SI*/
+ RTUNI_ALPHA, /* U+0030b8: KATAKANA LETTER ZI*/
+ RTUNI_ALPHA, /* U+0030b9: KATAKANA LETTER SU*/
+ RTUNI_ALPHA, /* U+0030ba: KATAKANA LETTER ZU*/
+ RTUNI_ALPHA, /* U+0030bb: KATAKANA LETTER SE*/
+ RTUNI_ALPHA, /* U+0030bc: KATAKANA LETTER ZE*/
+ RTUNI_ALPHA, /* U+0030bd: KATAKANA LETTER SO*/
+ RTUNI_ALPHA, /* U+0030be: KATAKANA LETTER ZO*/
+ RTUNI_ALPHA, /* U+0030bf: KATAKANA LETTER TA*/
+ RTUNI_ALPHA, /* U+0030c0: KATAKANA LETTER DA*/
+ RTUNI_ALPHA, /* U+0030c1: KATAKANA LETTER TI*/
+ RTUNI_ALPHA, /* U+0030c2: KATAKANA LETTER DI*/
+ RTUNI_ALPHA, /* U+0030c3: KATAKANA LETTER SMALL TU*/
+ RTUNI_ALPHA, /* U+0030c4: KATAKANA LETTER TU*/
+ RTUNI_ALPHA, /* U+0030c5: KATAKANA LETTER DU*/
+ RTUNI_ALPHA, /* U+0030c6: KATAKANA LETTER TE*/
+ RTUNI_ALPHA, /* U+0030c7: KATAKANA LETTER DE*/
+ RTUNI_ALPHA, /* U+0030c8: KATAKANA LETTER TO*/
+ RTUNI_ALPHA, /* U+0030c9: KATAKANA LETTER DO*/
+ RTUNI_ALPHA, /* U+0030ca: KATAKANA LETTER NA*/
+ RTUNI_ALPHA, /* U+0030cb: KATAKANA LETTER NI*/
+ RTUNI_ALPHA, /* U+0030cc: KATAKANA LETTER NU*/
+ RTUNI_ALPHA, /* U+0030cd: KATAKANA LETTER NE*/
+ RTUNI_ALPHA, /* U+0030ce: KATAKANA LETTER NO*/
+ RTUNI_ALPHA, /* U+0030cf: KATAKANA LETTER HA*/
+ RTUNI_ALPHA, /* U+0030d0: KATAKANA LETTER BA*/
+ RTUNI_ALPHA, /* U+0030d1: KATAKANA LETTER PA*/
+ RTUNI_ALPHA, /* U+0030d2: KATAKANA LETTER HI*/
+ RTUNI_ALPHA, /* U+0030d3: KATAKANA LETTER BI*/
+ RTUNI_ALPHA, /* U+0030d4: KATAKANA LETTER PI*/
+ RTUNI_ALPHA, /* U+0030d5: KATAKANA LETTER HU*/
+ RTUNI_ALPHA, /* U+0030d6: KATAKANA LETTER BU*/
+ RTUNI_ALPHA, /* U+0030d7: KATAKANA LETTER PU*/
+ RTUNI_ALPHA, /* U+0030d8: KATAKANA LETTER HE*/
+ RTUNI_ALPHA, /* U+0030d9: KATAKANA LETTER BE*/
+ RTUNI_ALPHA, /* U+0030da: KATAKANA LETTER PE*/
+ RTUNI_ALPHA, /* U+0030db: KATAKANA LETTER HO*/
+ RTUNI_ALPHA, /* U+0030dc: KATAKANA LETTER BO*/
+ RTUNI_ALPHA, /* U+0030dd: KATAKANA LETTER PO*/
+ RTUNI_ALPHA, /* U+0030de: KATAKANA LETTER MA*/
+ RTUNI_ALPHA, /* U+0030df: KATAKANA LETTER MI*/
+ RTUNI_ALPHA, /* U+0030e0: KATAKANA LETTER MU*/
+ RTUNI_ALPHA, /* U+0030e1: KATAKANA LETTER ME*/
+ RTUNI_ALPHA, /* U+0030e2: KATAKANA LETTER MO*/
+ RTUNI_ALPHA, /* U+0030e3: KATAKANA LETTER SMALL YA*/
+ RTUNI_ALPHA, /* U+0030e4: KATAKANA LETTER YA*/
+ RTUNI_ALPHA, /* U+0030e5: KATAKANA LETTER SMALL YU*/
+ RTUNI_ALPHA, /* U+0030e6: KATAKANA LETTER YU*/
+ RTUNI_ALPHA, /* U+0030e7: KATAKANA LETTER SMALL YO*/
+ RTUNI_ALPHA, /* U+0030e8: KATAKANA LETTER YO*/
+ RTUNI_ALPHA, /* U+0030e9: KATAKANA LETTER RA*/
+ RTUNI_ALPHA, /* U+0030ea: KATAKANA LETTER RI*/
+ RTUNI_ALPHA, /* U+0030eb: KATAKANA LETTER RU*/
+ RTUNI_ALPHA, /* U+0030ec: KATAKANA LETTER RE*/
+ RTUNI_ALPHA, /* U+0030ed: KATAKANA LETTER RO*/
+ RTUNI_ALPHA, /* U+0030ee: KATAKANA LETTER SMALL WA*/
+ RTUNI_ALPHA, /* U+0030ef: KATAKANA LETTER WA*/
+ RTUNI_ALPHA, /* U+0030f0: KATAKANA LETTER WI*/
+ RTUNI_ALPHA, /* U+0030f1: KATAKANA LETTER WE*/
+ RTUNI_ALPHA, /* U+0030f2: KATAKANA LETTER WO*/
+ RTUNI_ALPHA, /* U+0030f3: KATAKANA LETTER N*/
+ RTUNI_ALPHA, /* U+0030f4: KATAKANA LETTER VU*/
+ RTUNI_ALPHA, /* U+0030f5: KATAKANA LETTER SMALL KA*/
+ RTUNI_ALPHA, /* U+0030f6: KATAKANA LETTER SMALL KE*/
+ RTUNI_ALPHA, /* U+0030f7: KATAKANA LETTER VA*/
+ RTUNI_ALPHA, /* U+0030f8: KATAKANA LETTER VI*/
+ RTUNI_ALPHA, /* U+0030f9: KATAKANA LETTER VE*/
+ RTUNI_ALPHA, /* U+0030fa: KATAKANA LETTER VO*/
+ 0, /* U+0030fb: KATAKANA MIDDLE DOT*/
+ RTUNI_ALPHA, /* U+0030fc: KATAKANA-HIRAGANA PROLONGED SOUND MARK*/
+ RTUNI_ALPHA, /* U+0030fd: KATAKANA ITERATION MARK*/
+ RTUNI_ALPHA, /* U+0030fe: KATAKANA VOICED ITERATION MARK*/
+ RTUNI_ALPHA, /* U+0030ff: KATAKANA DIGRAPH KOTO*/
+ 0, /* U+003100: */
+ 0, /* U+003101: */
+ 0, /* U+003102: */
+ 0, /* U+003103: */
+ 0, /* U+003104: */
+ RTUNI_ALPHA, /* U+003105: BOPOMOFO LETTER B*/
+ RTUNI_ALPHA, /* U+003106: BOPOMOFO LETTER P*/
+ RTUNI_ALPHA, /* U+003107: BOPOMOFO LETTER M*/
+ RTUNI_ALPHA, /* U+003108: BOPOMOFO LETTER F*/
+ RTUNI_ALPHA, /* U+003109: BOPOMOFO LETTER D*/
+ RTUNI_ALPHA, /* U+00310a: BOPOMOFO LETTER T*/
+ RTUNI_ALPHA, /* U+00310b: BOPOMOFO LETTER N*/
+ RTUNI_ALPHA, /* U+00310c: BOPOMOFO LETTER L*/
+ RTUNI_ALPHA, /* U+00310d: BOPOMOFO LETTER G*/
+ RTUNI_ALPHA, /* U+00310e: BOPOMOFO LETTER K*/
+ RTUNI_ALPHA, /* U+00310f: BOPOMOFO LETTER H*/
+ RTUNI_ALPHA, /* U+003110: BOPOMOFO LETTER J*/
+ RTUNI_ALPHA, /* U+003111: BOPOMOFO LETTER Q*/
+ RTUNI_ALPHA, /* U+003112: BOPOMOFO LETTER X*/
+ RTUNI_ALPHA, /* U+003113: BOPOMOFO LETTER ZH*/
+ RTUNI_ALPHA, /* U+003114: BOPOMOFO LETTER CH*/
+ RTUNI_ALPHA, /* U+003115: BOPOMOFO LETTER SH*/
+ RTUNI_ALPHA, /* U+003116: BOPOMOFO LETTER R*/
+ RTUNI_ALPHA, /* U+003117: BOPOMOFO LETTER Z*/
+ RTUNI_ALPHA, /* U+003118: BOPOMOFO LETTER C*/
+ RTUNI_ALPHA, /* U+003119: BOPOMOFO LETTER S*/
+ RTUNI_ALPHA, /* U+00311a: BOPOMOFO LETTER A*/
+ RTUNI_ALPHA, /* U+00311b: BOPOMOFO LETTER O*/
+ RTUNI_ALPHA, /* U+00311c: BOPOMOFO LETTER E*/
+ RTUNI_ALPHA, /* U+00311d: BOPOMOFO LETTER EH*/
+ RTUNI_ALPHA, /* U+00311e: BOPOMOFO LETTER AI*/
+ RTUNI_ALPHA, /* U+00311f: BOPOMOFO LETTER EI*/
+ RTUNI_ALPHA, /* U+003120: BOPOMOFO LETTER AU*/
+ RTUNI_ALPHA, /* U+003121: BOPOMOFO LETTER OU*/
+ RTUNI_ALPHA, /* U+003122: BOPOMOFO LETTER AN*/
+ RTUNI_ALPHA, /* U+003123: BOPOMOFO LETTER EN*/
+ RTUNI_ALPHA, /* U+003124: BOPOMOFO LETTER ANG*/
+ RTUNI_ALPHA, /* U+003125: BOPOMOFO LETTER ENG*/
+ RTUNI_ALPHA, /* U+003126: BOPOMOFO LETTER ER*/
+ RTUNI_ALPHA, /* U+003127: BOPOMOFO LETTER I*/
+ RTUNI_ALPHA, /* U+003128: BOPOMOFO LETTER U*/
+ RTUNI_ALPHA, /* U+003129: BOPOMOFO LETTER IU*/
+ RTUNI_ALPHA, /* U+00312a: BOPOMOFO LETTER V*/
+ RTUNI_ALPHA, /* U+00312b: BOPOMOFO LETTER NG*/
+ RTUNI_ALPHA, /* U+00312c: BOPOMOFO LETTER GN*/
+ RTUNI_ALPHA, /* U+00312d: BOPOMOFO LETTER IH*/
+ 0, /* U+00312e: */
+ 0, /* U+00312f: */
+ 0, /* U+003130: */
+ RTUNI_ALPHA, /* U+003131: HANGUL LETTER KIYEOK*/
+ RTUNI_ALPHA, /* U+003132: HANGUL LETTER SSANGKIYEOK*/
+ RTUNI_ALPHA, /* U+003133: HANGUL LETTER KIYEOK-SIOS*/
+ RTUNI_ALPHA, /* U+003134: HANGUL LETTER NIEUN*/
+ RTUNI_ALPHA, /* U+003135: HANGUL LETTER NIEUN-CIEUC*/
+ RTUNI_ALPHA, /* U+003136: HANGUL LETTER NIEUN-HIEUH*/
+ RTUNI_ALPHA, /* U+003137: HANGUL LETTER TIKEUT*/
+ RTUNI_ALPHA, /* U+003138: HANGUL LETTER SSANGTIKEUT*/
+ RTUNI_ALPHA, /* U+003139: HANGUL LETTER RIEUL*/
+ RTUNI_ALPHA, /* U+00313a: HANGUL LETTER RIEUL-KIYEOK*/
+ RTUNI_ALPHA, /* U+00313b: HANGUL LETTER RIEUL-MIEUM*/
+ RTUNI_ALPHA, /* U+00313c: HANGUL LETTER RIEUL-PIEUP*/
+ RTUNI_ALPHA, /* U+00313d: HANGUL LETTER RIEUL-SIOS*/
+ RTUNI_ALPHA, /* U+00313e: HANGUL LETTER RIEUL-THIEUTH*/
+ RTUNI_ALPHA, /* U+00313f: HANGUL LETTER RIEUL-PHIEUPH*/
+ RTUNI_ALPHA, /* U+003140: HANGUL LETTER RIEUL-HIEUH*/
+ RTUNI_ALPHA, /* U+003141: HANGUL LETTER MIEUM*/
+ RTUNI_ALPHA, /* U+003142: HANGUL LETTER PIEUP*/
+ RTUNI_ALPHA, /* U+003143: HANGUL LETTER SSANGPIEUP*/
+ RTUNI_ALPHA, /* U+003144: HANGUL LETTER PIEUP-SIOS*/
+ RTUNI_ALPHA, /* U+003145: HANGUL LETTER SIOS*/
+ RTUNI_ALPHA, /* U+003146: HANGUL LETTER SSANGSIOS*/
+ RTUNI_ALPHA, /* U+003147: HANGUL LETTER IEUNG*/
+ RTUNI_ALPHA, /* U+003148: HANGUL LETTER CIEUC*/
+ RTUNI_ALPHA, /* U+003149: HANGUL LETTER SSANGCIEUC*/
+ RTUNI_ALPHA, /* U+00314a: HANGUL LETTER CHIEUCH*/
+ RTUNI_ALPHA, /* U+00314b: HANGUL LETTER KHIEUKH*/
+ RTUNI_ALPHA, /* U+00314c: HANGUL LETTER THIEUTH*/
+ RTUNI_ALPHA, /* U+00314d: HANGUL LETTER PHIEUPH*/
+ RTUNI_ALPHA, /* U+00314e: HANGUL LETTER HIEUH*/
+ RTUNI_ALPHA, /* U+00314f: HANGUL LETTER A*/
+ RTUNI_ALPHA, /* U+003150: HANGUL LETTER AE*/
+ RTUNI_ALPHA, /* U+003151: HANGUL LETTER YA*/
+ RTUNI_ALPHA, /* U+003152: HANGUL LETTER YAE*/
+ RTUNI_ALPHA, /* U+003153: HANGUL LETTER EO*/
+ RTUNI_ALPHA, /* U+003154: HANGUL LETTER E*/
+ RTUNI_ALPHA, /* U+003155: HANGUL LETTER YEO*/
+ RTUNI_ALPHA, /* U+003156: HANGUL LETTER YE*/
+ RTUNI_ALPHA, /* U+003157: HANGUL LETTER O*/
+ RTUNI_ALPHA, /* U+003158: HANGUL LETTER WA*/
+ RTUNI_ALPHA, /* U+003159: HANGUL LETTER WAE*/
+ RTUNI_ALPHA, /* U+00315a: HANGUL LETTER OE*/
+ RTUNI_ALPHA, /* U+00315b: HANGUL LETTER YO*/
+ RTUNI_ALPHA, /* U+00315c: HANGUL LETTER U*/
+ RTUNI_ALPHA, /* U+00315d: HANGUL LETTER WEO*/
+ RTUNI_ALPHA, /* U+00315e: HANGUL LETTER WE*/
+ RTUNI_ALPHA, /* U+00315f: HANGUL LETTER WI*/
+ RTUNI_ALPHA, /* U+003160: HANGUL LETTER YU*/
+ RTUNI_ALPHA, /* U+003161: HANGUL LETTER EU*/
+ RTUNI_ALPHA, /* U+003162: HANGUL LETTER YI*/
+ RTUNI_ALPHA, /* U+003163: HANGUL LETTER I*/
+ RTUNI_ALPHA, /* U+003164: HANGUL FILLER*/
+ RTUNI_ALPHA, /* U+003165: HANGUL LETTER SSANGNIEUN*/
+ RTUNI_ALPHA, /* U+003166: HANGUL LETTER NIEUN-TIKEUT*/
+ RTUNI_ALPHA, /* U+003167: HANGUL LETTER NIEUN-SIOS*/
+ RTUNI_ALPHA, /* U+003168: HANGUL LETTER NIEUN-PANSIOS*/
+ RTUNI_ALPHA, /* U+003169: HANGUL LETTER RIEUL-KIYEOK-SIOS*/
+ RTUNI_ALPHA, /* U+00316a: HANGUL LETTER RIEUL-TIKEUT*/
+ RTUNI_ALPHA, /* U+00316b: HANGUL LETTER RIEUL-PIEUP-SIOS*/
+ RTUNI_ALPHA, /* U+00316c: HANGUL LETTER RIEUL-PANSIOS*/
+ RTUNI_ALPHA, /* U+00316d: HANGUL LETTER RIEUL-YEORINHIEUH*/
+ RTUNI_ALPHA, /* U+00316e: HANGUL LETTER MIEUM-PIEUP*/
+ RTUNI_ALPHA, /* U+00316f: HANGUL LETTER MIEUM-SIOS*/
+ RTUNI_ALPHA, /* U+003170: HANGUL LETTER MIEUM-PANSIOS*/
+ RTUNI_ALPHA, /* U+003171: HANGUL LETTER KAPYEOUNMIEUM*/
+ RTUNI_ALPHA, /* U+003172: HANGUL LETTER PIEUP-KIYEOK*/
+ RTUNI_ALPHA, /* U+003173: HANGUL LETTER PIEUP-TIKEUT*/
+ RTUNI_ALPHA, /* U+003174: HANGUL LETTER PIEUP-SIOS-KIYEOK*/
+ RTUNI_ALPHA, /* U+003175: HANGUL LETTER PIEUP-SIOS-TIKEUT*/
+ RTUNI_ALPHA, /* U+003176: HANGUL LETTER PIEUP-CIEUC*/
+ RTUNI_ALPHA, /* U+003177: HANGUL LETTER PIEUP-THIEUTH*/
+ RTUNI_ALPHA, /* U+003178: HANGUL LETTER KAPYEOUNPIEUP*/
+ RTUNI_ALPHA, /* U+003179: HANGUL LETTER KAPYEOUNSSANGPIEUP*/
+ RTUNI_ALPHA, /* U+00317a: HANGUL LETTER SIOS-KIYEOK*/
+ RTUNI_ALPHA, /* U+00317b: HANGUL LETTER SIOS-NIEUN*/
+ RTUNI_ALPHA, /* U+00317c: HANGUL LETTER SIOS-TIKEUT*/
+ RTUNI_ALPHA, /* U+00317d: HANGUL LETTER SIOS-PIEUP*/
+ RTUNI_ALPHA, /* U+00317e: HANGUL LETTER SIOS-CIEUC*/
+ RTUNI_ALPHA, /* U+00317f: HANGUL LETTER PANSIOS*/
+ RTUNI_ALPHA, /* U+003180: HANGUL LETTER SSANGIEUNG*/
+ RTUNI_ALPHA, /* U+003181: HANGUL LETTER YESIEUNG*/
+ RTUNI_ALPHA, /* U+003182: HANGUL LETTER YESIEUNG-SIOS*/
+ RTUNI_ALPHA, /* U+003183: HANGUL LETTER YESIEUNG-PANSIOS*/
+ RTUNI_ALPHA, /* U+003184: HANGUL LETTER KAPYEOUNPHIEUPH*/
+ RTUNI_ALPHA, /* U+003185: HANGUL LETTER SSANGHIEUH*/
+ RTUNI_ALPHA, /* U+003186: HANGUL LETTER YEORINHIEUH*/
+ RTUNI_ALPHA, /* U+003187: HANGUL LETTER YO-YA*/
+ RTUNI_ALPHA, /* U+003188: HANGUL LETTER YO-YAE*/
+ RTUNI_ALPHA, /* U+003189: HANGUL LETTER YO-I*/
+ RTUNI_ALPHA, /* U+00318a: HANGUL LETTER YU-YEO*/
+ RTUNI_ALPHA, /* U+00318b: HANGUL LETTER YU-YE*/
+ RTUNI_ALPHA, /* U+00318c: HANGUL LETTER YU-I*/
+ RTUNI_ALPHA, /* U+00318d: HANGUL LETTER ARAEA*/
+ RTUNI_ALPHA, /* U+00318e: HANGUL LETTER ARAEAE*/
+ 0, /* U+00318f: */
+ 0, /* U+003190: IDEOGRAPHIC ANNOTATION LINKING MARK*/
+ 0, /* U+003191: IDEOGRAPHIC ANNOTATION REVERSE MARK*/
+ 0, /* U+003192: IDEOGRAPHIC ANNOTATION ONE MARK*/
+ 0, /* U+003193: IDEOGRAPHIC ANNOTATION TWO MARK*/
+ 0, /* U+003194: IDEOGRAPHIC ANNOTATION THREE MARK*/
+ 0, /* U+003195: IDEOGRAPHIC ANNOTATION FOUR MARK*/
+ 0, /* U+003196: IDEOGRAPHIC ANNOTATION TOP MARK*/
+ 0, /* U+003197: IDEOGRAPHIC ANNOTATION MIDDLE MARK*/
+ 0, /* U+003198: IDEOGRAPHIC ANNOTATION BOTTOM MARK*/
+ 0, /* U+003199: IDEOGRAPHIC ANNOTATION FIRST MARK*/
+ 0, /* U+00319a: IDEOGRAPHIC ANNOTATION SECOND MARK*/
+ 0, /* U+00319b: IDEOGRAPHIC ANNOTATION THIRD MARK*/
+ 0, /* U+00319c: IDEOGRAPHIC ANNOTATION FOURTH MARK*/
+ 0, /* U+00319d: IDEOGRAPHIC ANNOTATION HEAVEN MARK*/
+ 0, /* U+00319e: IDEOGRAPHIC ANNOTATION EARTH MARK*/
+ 0, /* U+00319f: IDEOGRAPHIC ANNOTATION MAN MARK*/
+ RTUNI_ALPHA, /* U+0031a0: BOPOMOFO LETTER BU*/
+ RTUNI_ALPHA, /* U+0031a1: BOPOMOFO LETTER ZI*/
+ RTUNI_ALPHA, /* U+0031a2: BOPOMOFO LETTER JI*/
+ RTUNI_ALPHA, /* U+0031a3: BOPOMOFO LETTER GU*/
+ RTUNI_ALPHA, /* U+0031a4: BOPOMOFO LETTER EE*/
+ RTUNI_ALPHA, /* U+0031a5: BOPOMOFO LETTER ENN*/
+ RTUNI_ALPHA, /* U+0031a6: BOPOMOFO LETTER OO*/
+ RTUNI_ALPHA, /* U+0031a7: BOPOMOFO LETTER ONN*/
+ RTUNI_ALPHA, /* U+0031a8: BOPOMOFO LETTER IR*/
+ RTUNI_ALPHA, /* U+0031a9: BOPOMOFO LETTER ANN*/
+ RTUNI_ALPHA, /* U+0031aa: BOPOMOFO LETTER INN*/
+ RTUNI_ALPHA, /* U+0031ab: BOPOMOFO LETTER UNN*/
+ RTUNI_ALPHA, /* U+0031ac: BOPOMOFO LETTER IM*/
+ RTUNI_ALPHA, /* U+0031ad: BOPOMOFO LETTER NGG*/
+ RTUNI_ALPHA, /* U+0031ae: BOPOMOFO LETTER AINN*/
+ RTUNI_ALPHA, /* U+0031af: BOPOMOFO LETTER AUNN*/
+ RTUNI_ALPHA, /* U+0031b0: BOPOMOFO LETTER AM*/
+ RTUNI_ALPHA, /* U+0031b1: BOPOMOFO LETTER OM*/
+ RTUNI_ALPHA, /* U+0031b2: BOPOMOFO LETTER ONG*/
+ RTUNI_ALPHA, /* U+0031b3: BOPOMOFO LETTER INNN*/
+ RTUNI_ALPHA, /* U+0031b4: BOPOMOFO FINAL LETTER P*/
+ RTUNI_ALPHA, /* U+0031b5: BOPOMOFO FINAL LETTER T*/
+ RTUNI_ALPHA, /* U+0031b6: BOPOMOFO FINAL LETTER K*/
+ RTUNI_ALPHA, /* U+0031b7: BOPOMOFO FINAL LETTER H*/
+ RTUNI_ALPHA, /* U+0031b8: BOPOMOFO LETTER GH*/
+ RTUNI_ALPHA, /* U+0031b9: BOPOMOFO LETTER LH*/
+ RTUNI_ALPHA, /* U+0031ba: BOPOMOFO LETTER ZY*/
+ 0, /* U+0031bb: */
+ 0, /* U+0031bc: */
+ 0, /* U+0031bd: */
+ 0, /* U+0031be: */
+ 0, /* U+0031bf: */
+ 0, /* U+0031c0: CJK STROKE T*/
+ 0, /* U+0031c1: CJK STROKE WG*/
+ 0, /* U+0031c2: CJK STROKE XG*/
+ 0, /* U+0031c3: CJK STROKE BXG*/
+ 0, /* U+0031c4: CJK STROKE SW*/
+ 0, /* U+0031c5: CJK STROKE HZZ*/
+ 0, /* U+0031c6: CJK STROKE HZG*/
+ 0, /* U+0031c7: CJK STROKE HP*/
+ 0, /* U+0031c8: CJK STROKE HZWG*/
+ 0, /* U+0031c9: CJK STROKE SZWG*/
+ 0, /* U+0031ca: CJK STROKE HZT*/
+ 0, /* U+0031cb: CJK STROKE HZZP*/
+ 0, /* U+0031cc: CJK STROKE HPWG*/
+ 0, /* U+0031cd: CJK STROKE HZW*/
+ 0, /* U+0031ce: CJK STROKE HZZZ*/
+ 0, /* U+0031cf: CJK STROKE N*/
+ 0, /* U+0031d0: CJK STROKE H*/
+ 0, /* U+0031d1: CJK STROKE S*/
+ 0, /* U+0031d2: CJK STROKE P*/
+ 0, /* U+0031d3: CJK STROKE SP*/
+ 0, /* U+0031d4: CJK STROKE D*/
+ 0, /* U+0031d5: CJK STROKE HZ*/
+ 0, /* U+0031d6: CJK STROKE HG*/
+ 0, /* U+0031d7: CJK STROKE SZ*/
+ 0, /* U+0031d8: CJK STROKE SWZ*/
+ 0, /* U+0031d9: CJK STROKE ST*/
+ 0, /* U+0031da: CJK STROKE SG*/
+ 0, /* U+0031db: CJK STROKE PD*/
+ 0, /* U+0031dc: CJK STROKE PZ*/
+ 0, /* U+0031dd: CJK STROKE TN*/
+ 0, /* U+0031de: CJK STROKE SZZ*/
+ 0, /* U+0031df: CJK STROKE SWG*/
+ 0, /* U+0031e0: CJK STROKE HXWG*/
+ 0, /* U+0031e1: CJK STROKE HZZZG*/
+ 0, /* U+0031e2: CJK STROKE PG*/
+ 0, /* U+0031e3: CJK STROKE Q*/
+ 0, /* U+0031e4: */
+ 0, /* U+0031e5: */
+ 0, /* U+0031e6: */
+ 0, /* U+0031e7: */
+ 0, /* U+0031e8: */
+ 0, /* U+0031e9: */
+ 0, /* U+0031ea: */
+ 0, /* U+0031eb: */
+ 0, /* U+0031ec: */
+ 0, /* U+0031ed: */
+ 0, /* U+0031ee: */
+ 0, /* U+0031ef: */
+ RTUNI_ALPHA, /* U+0031f0: KATAKANA LETTER SMALL KU*/
+ RTUNI_ALPHA, /* U+0031f1: KATAKANA LETTER SMALL SI*/
+ RTUNI_ALPHA, /* U+0031f2: KATAKANA LETTER SMALL SU*/
+ RTUNI_ALPHA, /* U+0031f3: KATAKANA LETTER SMALL TO*/
+ RTUNI_ALPHA, /* U+0031f4: KATAKANA LETTER SMALL NU*/
+ RTUNI_ALPHA, /* U+0031f5: KATAKANA LETTER SMALL HA*/
+ RTUNI_ALPHA, /* U+0031f6: KATAKANA LETTER SMALL HI*/
+ RTUNI_ALPHA, /* U+0031f7: KATAKANA LETTER SMALL HU*/
+ RTUNI_ALPHA, /* U+0031f8: KATAKANA LETTER SMALL HE*/
+ RTUNI_ALPHA, /* U+0031f9: KATAKANA LETTER SMALL HO*/
+ RTUNI_ALPHA, /* U+0031fa: KATAKANA LETTER SMALL MU*/
+ RTUNI_ALPHA, /* U+0031fb: KATAKANA LETTER SMALL RA*/
+ RTUNI_ALPHA, /* U+0031fc: KATAKANA LETTER SMALL RI*/
+ RTUNI_ALPHA, /* U+0031fd: KATAKANA LETTER SMALL RU*/
+ RTUNI_ALPHA, /* U+0031fe: KATAKANA LETTER SMALL RE*/
+ RTUNI_ALPHA, /* U+0031ff: KATAKANA LETTER SMALL RO*/
+ 0, /* U+003200: PARENTHESIZED HANGUL KIYEOK*/
+ 0, /* U+003201: PARENTHESIZED HANGUL NIEUN*/
+ 0, /* U+003202: PARENTHESIZED HANGUL TIKEUT*/
+ 0, /* U+003203: PARENTHESIZED HANGUL RIEUL*/
+ 0, /* U+003204: PARENTHESIZED HANGUL MIEUM*/
+ 0, /* U+003205: PARENTHESIZED HANGUL PIEUP*/
+ 0, /* U+003206: PARENTHESIZED HANGUL SIOS*/
+ 0, /* U+003207: PARENTHESIZED HANGUL IEUNG*/
+ 0, /* U+003208: PARENTHESIZED HANGUL CIEUC*/
+ 0, /* U+003209: PARENTHESIZED HANGUL CHIEUCH*/
+ 0, /* U+00320a: PARENTHESIZED HANGUL KHIEUKH*/
+ 0, /* U+00320b: PARENTHESIZED HANGUL THIEUTH*/
+ 0, /* U+00320c: PARENTHESIZED HANGUL PHIEUPH*/
+ 0, /* U+00320d: PARENTHESIZED HANGUL HIEUH*/
+ 0, /* U+00320e: PARENTHESIZED HANGUL KIYEOK A*/
+ 0, /* U+00320f: PARENTHESIZED HANGUL NIEUN A*/
+ 0, /* U+003210: PARENTHESIZED HANGUL TIKEUT A*/
+ 0, /* U+003211: PARENTHESIZED HANGUL RIEUL A*/
+ 0, /* U+003212: PARENTHESIZED HANGUL MIEUM A*/
+ 0, /* U+003213: PARENTHESIZED HANGUL PIEUP A*/
+ 0, /* U+003214: PARENTHESIZED HANGUL SIOS A*/
+ 0, /* U+003215: PARENTHESIZED HANGUL IEUNG A*/
+ 0, /* U+003216: PARENTHESIZED HANGUL CIEUC A*/
+ 0, /* U+003217: PARENTHESIZED HANGUL CHIEUCH A*/
+ 0, /* U+003218: PARENTHESIZED HANGUL KHIEUKH A*/
+ 0, /* U+003219: PARENTHESIZED HANGUL THIEUTH A*/
+ 0, /* U+00321a: PARENTHESIZED HANGUL PHIEUPH A*/
+ 0, /* U+00321b: PARENTHESIZED HANGUL HIEUH A*/
+ 0, /* U+00321c: PARENTHESIZED HANGUL CIEUC U*/
+ 0, /* U+00321d: PARENTHESIZED KOREAN CHARACTER OJEON*/
+ 0, /* U+00321e: PARENTHESIZED KOREAN CHARACTER O HU*/
+ 0, /* U+00321f: */
+ 0, /* U+003220: PARENTHESIZED IDEOGRAPH ONE*/
+ 0, /* U+003221: PARENTHESIZED IDEOGRAPH TWO*/
+ 0, /* U+003222: PARENTHESIZED IDEOGRAPH THREE*/
+ 0, /* U+003223: PARENTHESIZED IDEOGRAPH FOUR*/
+ 0, /* U+003224: PARENTHESIZED IDEOGRAPH FIVE*/
+ 0, /* U+003225: PARENTHESIZED IDEOGRAPH SIX*/
+ 0, /* U+003226: PARENTHESIZED IDEOGRAPH SEVEN*/
+ 0, /* U+003227: PARENTHESIZED IDEOGRAPH EIGHT*/
+ 0, /* U+003228: PARENTHESIZED IDEOGRAPH NINE*/
+ 0, /* U+003229: PARENTHESIZED IDEOGRAPH TEN*/
+ 0, /* U+00322a: PARENTHESIZED IDEOGRAPH MOON*/
+ 0, /* U+00322b: PARENTHESIZED IDEOGRAPH FIRE*/
+ 0, /* U+00322c: PARENTHESIZED IDEOGRAPH WATER*/
+ 0, /* U+00322d: PARENTHESIZED IDEOGRAPH WOOD*/
+ 0, /* U+00322e: PARENTHESIZED IDEOGRAPH METAL*/
+ 0, /* U+00322f: PARENTHESIZED IDEOGRAPH EARTH*/
+ 0, /* U+003230: PARENTHESIZED IDEOGRAPH SUN*/
+ 0, /* U+003231: PARENTHESIZED IDEOGRAPH STOCK*/
+ 0, /* U+003232: PARENTHESIZED IDEOGRAPH HAVE*/
+ 0, /* U+003233: PARENTHESIZED IDEOGRAPH SOCIETY*/
+ 0, /* U+003234: PARENTHESIZED IDEOGRAPH NAME*/
+ 0, /* U+003235: PARENTHESIZED IDEOGRAPH SPECIAL*/
+ 0, /* U+003236: PARENTHESIZED IDEOGRAPH FINANCIAL*/
+ 0, /* U+003237: PARENTHESIZED IDEOGRAPH CONGRATULATION*/
+ 0, /* U+003238: PARENTHESIZED IDEOGRAPH LABOR*/
+ 0, /* U+003239: PARENTHESIZED IDEOGRAPH REPRESENT*/
+ 0, /* U+00323a: PARENTHESIZED IDEOGRAPH CALL*/
+ 0, /* U+00323b: PARENTHESIZED IDEOGRAPH STUDY*/
+ 0, /* U+00323c: PARENTHESIZED IDEOGRAPH SUPERVISE*/
+ 0, /* U+00323d: PARENTHESIZED IDEOGRAPH ENTERPRISE*/
+ 0, /* U+00323e: PARENTHESIZED IDEOGRAPH RESOURCE*/
+ 0, /* U+00323f: PARENTHESIZED IDEOGRAPH ALLIANCE*/
+ 0, /* U+003240: PARENTHESIZED IDEOGRAPH FESTIVAL*/
+ 0, /* U+003241: PARENTHESIZED IDEOGRAPH REST*/
+ 0, /* U+003242: PARENTHESIZED IDEOGRAPH SELF*/
+ 0, /* U+003243: PARENTHESIZED IDEOGRAPH REACH*/
+ 0, /* U+003244: CIRCLED IDEOGRAPH QUESTION*/
+ 0, /* U+003245: CIRCLED IDEOGRAPH KINDERGARTEN*/
+ 0, /* U+003246: CIRCLED IDEOGRAPH SCHOOL*/
+ 0, /* U+003247: CIRCLED IDEOGRAPH KOTO*/
+ 0, /* U+003248: CIRCLED NUMBER TEN ON BLACK SQUARE*/
+ 0, /* U+003249: CIRCLED NUMBER TWENTY ON BLACK SQUARE*/
+ 0, /* U+00324a: CIRCLED NUMBER THIRTY ON BLACK SQUARE*/
+ 0, /* U+00324b: CIRCLED NUMBER FORTY ON BLACK SQUARE*/
+ 0, /* U+00324c: CIRCLED NUMBER FIFTY ON BLACK SQUARE*/
+ 0, /* U+00324d: CIRCLED NUMBER SIXTY ON BLACK SQUARE*/
+ 0, /* U+00324e: CIRCLED NUMBER SEVENTY ON BLACK SQUARE*/
+ 0, /* U+00324f: CIRCLED NUMBER EIGHTY ON BLACK SQUARE*/
+ 0, /* U+003250: PARTNERSHIP SIGN*/
+ 0, /* U+003251: CIRCLED NUMBER TWENTY ONE*/
+ 0, /* U+003252: CIRCLED NUMBER TWENTY TWO*/
+ 0, /* U+003253: CIRCLED NUMBER TWENTY THREE*/
+ 0, /* U+003254: CIRCLED NUMBER TWENTY FOUR*/
+ 0, /* U+003255: CIRCLED NUMBER TWENTY FIVE*/
+ 0, /* U+003256: CIRCLED NUMBER TWENTY SIX*/
+ 0, /* U+003257: CIRCLED NUMBER TWENTY SEVEN*/
+ 0, /* U+003258: CIRCLED NUMBER TWENTY EIGHT*/
+ 0, /* U+003259: CIRCLED NUMBER TWENTY NINE*/
+ 0, /* U+00325a: CIRCLED NUMBER THIRTY*/
+ 0, /* U+00325b: CIRCLED NUMBER THIRTY ONE*/
+ 0, /* U+00325c: CIRCLED NUMBER THIRTY TWO*/
+ 0, /* U+00325d: CIRCLED NUMBER THIRTY THREE*/
+ 0, /* U+00325e: CIRCLED NUMBER THIRTY FOUR*/
+ 0, /* U+00325f: CIRCLED NUMBER THIRTY FIVE*/
+ 0, /* U+003260: CIRCLED HANGUL KIYEOK*/
+ 0, /* U+003261: CIRCLED HANGUL NIEUN*/
+ 0, /* U+003262: CIRCLED HANGUL TIKEUT*/
+ 0, /* U+003263: CIRCLED HANGUL RIEUL*/
+ 0, /* U+003264: CIRCLED HANGUL MIEUM*/
+ 0, /* U+003265: CIRCLED HANGUL PIEUP*/
+ 0, /* U+003266: CIRCLED HANGUL SIOS*/
+ 0, /* U+003267: CIRCLED HANGUL IEUNG*/
+ 0, /* U+003268: CIRCLED HANGUL CIEUC*/
+ 0, /* U+003269: CIRCLED HANGUL CHIEUCH*/
+ 0, /* U+00326a: CIRCLED HANGUL KHIEUKH*/
+ 0, /* U+00326b: CIRCLED HANGUL THIEUTH*/
+ 0, /* U+00326c: CIRCLED HANGUL PHIEUPH*/
+ 0, /* U+00326d: CIRCLED HANGUL HIEUH*/
+ 0, /* U+00326e: CIRCLED HANGUL KIYEOK A*/
+ 0, /* U+00326f: CIRCLED HANGUL NIEUN A*/
+ 0, /* U+003270: CIRCLED HANGUL TIKEUT A*/
+ 0, /* U+003271: CIRCLED HANGUL RIEUL A*/
+ 0, /* U+003272: CIRCLED HANGUL MIEUM A*/
+ 0, /* U+003273: CIRCLED HANGUL PIEUP A*/
+ 0, /* U+003274: CIRCLED HANGUL SIOS A*/
+ 0, /* U+003275: CIRCLED HANGUL IEUNG A*/
+ 0, /* U+003276: CIRCLED HANGUL CIEUC A*/
+ 0, /* U+003277: CIRCLED HANGUL CHIEUCH A*/
+ 0, /* U+003278: CIRCLED HANGUL KHIEUKH A*/
+ 0, /* U+003279: CIRCLED HANGUL THIEUTH A*/
+ 0, /* U+00327a: CIRCLED HANGUL PHIEUPH A*/
+ 0, /* U+00327b: CIRCLED HANGUL HIEUH A*/
+ 0, /* U+00327c: CIRCLED KOREAN CHARACTER CHAMKO*/
+ 0, /* U+00327d: CIRCLED KOREAN CHARACTER JUEUI*/
+ 0, /* U+00327e: CIRCLED HANGUL IEUNG U*/
+ 0, /* U+00327f: KOREAN STANDARD SYMBOL*/
+ 0, /* U+003280: CIRCLED IDEOGRAPH ONE*/
+ 0, /* U+003281: CIRCLED IDEOGRAPH TWO*/
+ 0, /* U+003282: CIRCLED IDEOGRAPH THREE*/
+ 0, /* U+003283: CIRCLED IDEOGRAPH FOUR*/
+ 0, /* U+003284: CIRCLED IDEOGRAPH FIVE*/
+ 0, /* U+003285: CIRCLED IDEOGRAPH SIX*/
+ 0, /* U+003286: CIRCLED IDEOGRAPH SEVEN*/
+ 0, /* U+003287: CIRCLED IDEOGRAPH EIGHT*/
+ 0, /* U+003288: CIRCLED IDEOGRAPH NINE*/
+ 0, /* U+003289: CIRCLED IDEOGRAPH TEN*/
+ 0, /* U+00328a: CIRCLED IDEOGRAPH MOON*/
+ 0, /* U+00328b: CIRCLED IDEOGRAPH FIRE*/
+ 0, /* U+00328c: CIRCLED IDEOGRAPH WATER*/
+ 0, /* U+00328d: CIRCLED IDEOGRAPH WOOD*/
+ 0, /* U+00328e: CIRCLED IDEOGRAPH METAL*/
+ 0, /* U+00328f: CIRCLED IDEOGRAPH EARTH*/
+ 0, /* U+003290: CIRCLED IDEOGRAPH SUN*/
+ 0, /* U+003291: CIRCLED IDEOGRAPH STOCK*/
+ 0, /* U+003292: CIRCLED IDEOGRAPH HAVE*/
+ 0, /* U+003293: CIRCLED IDEOGRAPH SOCIETY*/
+ 0, /* U+003294: CIRCLED IDEOGRAPH NAME*/
+ 0, /* U+003295: CIRCLED IDEOGRAPH SPECIAL*/
+ 0, /* U+003296: CIRCLED IDEOGRAPH FINANCIAL*/
+ 0, /* U+003297: CIRCLED IDEOGRAPH CONGRATULATION*/
+ 0, /* U+003298: CIRCLED IDEOGRAPH LABOR*/
+ 0, /* U+003299: CIRCLED IDEOGRAPH SECRET*/
+ 0, /* U+00329a: CIRCLED IDEOGRAPH MALE*/
+ 0, /* U+00329b: CIRCLED IDEOGRAPH FEMALE*/
+ 0, /* U+00329c: CIRCLED IDEOGRAPH SUITABLE*/
+ 0, /* U+00329d: CIRCLED IDEOGRAPH EXCELLENT*/
+ 0, /* U+00329e: CIRCLED IDEOGRAPH PRINT*/
+ 0, /* U+00329f: CIRCLED IDEOGRAPH ATTENTION*/
+ 0, /* U+0032a0: CIRCLED IDEOGRAPH ITEM*/
+ 0, /* U+0032a1: CIRCLED IDEOGRAPH REST*/
+ 0, /* U+0032a2: CIRCLED IDEOGRAPH COPY*/
+ 0, /* U+0032a3: CIRCLED IDEOGRAPH CORRECT*/
+ 0, /* U+0032a4: CIRCLED IDEOGRAPH HIGH*/
+ 0, /* U+0032a5: CIRCLED IDEOGRAPH CENTRE*/
+ 0, /* U+0032a6: CIRCLED IDEOGRAPH LOW*/
+ 0, /* U+0032a7: CIRCLED IDEOGRAPH LEFT*/
+ 0, /* U+0032a8: CIRCLED IDEOGRAPH RIGHT*/
+ 0, /* U+0032a9: CIRCLED IDEOGRAPH MEDICINE*/
+ 0, /* U+0032aa: CIRCLED IDEOGRAPH RELIGION*/
+ 0, /* U+0032ab: CIRCLED IDEOGRAPH STUDY*/
+ 0, /* U+0032ac: CIRCLED IDEOGRAPH SUPERVISE*/
+ 0, /* U+0032ad: CIRCLED IDEOGRAPH ENTERPRISE*/
+ 0, /* U+0032ae: CIRCLED IDEOGRAPH RESOURCE*/
+ 0, /* U+0032af: CIRCLED IDEOGRAPH ALLIANCE*/
+ 0, /* U+0032b0: CIRCLED IDEOGRAPH NIGHT*/
+ 0, /* U+0032b1: CIRCLED NUMBER THIRTY SIX*/
+ 0, /* U+0032b2: CIRCLED NUMBER THIRTY SEVEN*/
+ 0, /* U+0032b3: CIRCLED NUMBER THIRTY EIGHT*/
+ 0, /* U+0032b4: CIRCLED NUMBER THIRTY NINE*/
+ 0, /* U+0032b5: CIRCLED NUMBER FORTY*/
+ 0, /* U+0032b6: CIRCLED NUMBER FORTY ONE*/
+ 0, /* U+0032b7: CIRCLED NUMBER FORTY TWO*/
+ 0, /* U+0032b8: CIRCLED NUMBER FORTY THREE*/
+ 0, /* U+0032b9: CIRCLED NUMBER FORTY FOUR*/
+ 0, /* U+0032ba: CIRCLED NUMBER FORTY FIVE*/
+ 0, /* U+0032bb: CIRCLED NUMBER FORTY SIX*/
+ 0, /* U+0032bc: CIRCLED NUMBER FORTY SEVEN*/
+ 0, /* U+0032bd: CIRCLED NUMBER FORTY EIGHT*/
+ 0, /* U+0032be: CIRCLED NUMBER FORTY NINE*/
+ 0, /* U+0032bf: CIRCLED NUMBER FIFTY*/
+ 0, /* U+0032c0: IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY*/
+ 0, /* U+0032c1: IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY*/
+ 0, /* U+0032c2: IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH*/
+ 0, /* U+0032c3: IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL*/
+ 0, /* U+0032c4: IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY*/
+ 0, /* U+0032c5: IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE*/
+ 0, /* U+0032c6: IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY*/
+ 0, /* U+0032c7: IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST*/
+ 0, /* U+0032c8: IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER*/
+ 0, /* U+0032c9: IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER*/
+ 0, /* U+0032ca: IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER*/
+ 0, /* U+0032cb: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER*/
+ 0, /* U+0032cc: SQUARE HG*/
+ 0, /* U+0032cd: SQUARE ERG*/
+ 0, /* U+0032ce: SQUARE EV*/
+ 0, /* U+0032cf: LIMITED LIABILITY SIGN*/
+ 0, /* U+0032d0: CIRCLED KATAKANA A*/
+ 0, /* U+0032d1: CIRCLED KATAKANA I*/
+ 0, /* U+0032d2: CIRCLED KATAKANA U*/
+ 0, /* U+0032d3: CIRCLED KATAKANA E*/
+ 0, /* U+0032d4: CIRCLED KATAKANA O*/
+ 0, /* U+0032d5: CIRCLED KATAKANA KA*/
+ 0, /* U+0032d6: CIRCLED KATAKANA KI*/
+ 0, /* U+0032d7: CIRCLED KATAKANA KU*/
+ 0, /* U+0032d8: CIRCLED KATAKANA KE*/
+ 0, /* U+0032d9: CIRCLED KATAKANA KO*/
+ 0, /* U+0032da: CIRCLED KATAKANA SA*/
+ 0, /* U+0032db: CIRCLED KATAKANA SI*/
+ 0, /* U+0032dc: CIRCLED KATAKANA SU*/
+ 0, /* U+0032dd: CIRCLED KATAKANA SE*/
+ 0, /* U+0032de: CIRCLED KATAKANA SO*/
+ 0, /* U+0032df: CIRCLED KATAKANA TA*/
+ 0, /* U+0032e0: CIRCLED KATAKANA TI*/
+ 0, /* U+0032e1: CIRCLED KATAKANA TU*/
+ 0, /* U+0032e2: CIRCLED KATAKANA TE*/
+ 0, /* U+0032e3: CIRCLED KATAKANA TO*/
+ 0, /* U+0032e4: CIRCLED KATAKANA NA*/
+ 0, /* U+0032e5: CIRCLED KATAKANA NI*/
+ 0, /* U+0032e6: CIRCLED KATAKANA NU*/
+ 0, /* U+0032e7: CIRCLED KATAKANA NE*/
+ 0, /* U+0032e8: CIRCLED KATAKANA NO*/
+ 0, /* U+0032e9: CIRCLED KATAKANA HA*/
+ 0, /* U+0032ea: CIRCLED KATAKANA HI*/
+ 0, /* U+0032eb: CIRCLED KATAKANA HU*/
+ 0, /* U+0032ec: CIRCLED KATAKANA HE*/
+ 0, /* U+0032ed: CIRCLED KATAKANA HO*/
+ 0, /* U+0032ee: CIRCLED KATAKANA MA*/
+ 0, /* U+0032ef: CIRCLED KATAKANA MI*/
+ 0, /* U+0032f0: CIRCLED KATAKANA MU*/
+ 0, /* U+0032f1: CIRCLED KATAKANA ME*/
+ 0, /* U+0032f2: CIRCLED KATAKANA MO*/
+ 0, /* U+0032f3: CIRCLED KATAKANA YA*/
+ 0, /* U+0032f4: CIRCLED KATAKANA YU*/
+ 0, /* U+0032f5: CIRCLED KATAKANA YO*/
+ 0, /* U+0032f6: CIRCLED KATAKANA RA*/
+ 0, /* U+0032f7: CIRCLED KATAKANA RI*/
+ 0, /* U+0032f8: CIRCLED KATAKANA RU*/
+ 0, /* U+0032f9: CIRCLED KATAKANA RE*/
+ 0, /* U+0032fa: CIRCLED KATAKANA RO*/
+ 0, /* U+0032fb: CIRCLED KATAKANA WA*/
+ 0, /* U+0032fc: CIRCLED KATAKANA WI*/
+ 0, /* U+0032fd: CIRCLED KATAKANA WE*/
+ 0, /* U+0032fe: CIRCLED KATAKANA WO*/
+ 0, /* U+0032ff: */
+ 0, /* U+003300: SQUARE APAATO*/
+ 0, /* U+003301: SQUARE ARUHUA*/
+ 0, /* U+003302: SQUARE ANPEA*/
+ 0, /* U+003303: SQUARE AARU*/
+ 0, /* U+003304: SQUARE ININGU*/
+ 0, /* U+003305: SQUARE INTI*/
+ 0, /* U+003306: SQUARE UON*/
+ 0, /* U+003307: SQUARE ESUKUUDO*/
+ 0, /* U+003308: SQUARE EEKAA*/
+ 0, /* U+003309: SQUARE ONSU*/
+ 0, /* U+00330a: SQUARE OOMU*/
+ 0, /* U+00330b: SQUARE KAIRI*/
+ 0, /* U+00330c: SQUARE KARATTO*/
+ 0, /* U+00330d: SQUARE KARORII*/
+ 0, /* U+00330e: SQUARE GARON*/
+ 0, /* U+00330f: SQUARE GANMA*/
+ 0, /* U+003310: SQUARE GIGA*/
+ 0, /* U+003311: SQUARE GINII*/
+ 0, /* U+003312: SQUARE KYURII*/
+ 0, /* U+003313: SQUARE GIRUDAA*/
+ 0, /* U+003314: SQUARE KIRO*/
+ 0, /* U+003315: SQUARE KIROGURAMU*/
+ 0, /* U+003316: SQUARE KIROMEETORU*/
+ 0, /* U+003317: SQUARE KIROWATTO*/
+ 0, /* U+003318: SQUARE GURAMU*/
+ 0, /* U+003319: SQUARE GURAMUTON*/
+ 0, /* U+00331a: SQUARE KURUZEIRO*/
+ 0, /* U+00331b: SQUARE KUROONE*/
+ 0, /* U+00331c: SQUARE KEESU*/
+ 0, /* U+00331d: SQUARE KORUNA*/
+ 0, /* U+00331e: SQUARE KOOPO*/
+ 0, /* U+00331f: SQUARE SAIKURU*/
+ 0, /* U+003320: SQUARE SANTIIMU*/
+ 0, /* U+003321: SQUARE SIRINGU*/
+ 0, /* U+003322: SQUARE SENTI*/
+ 0, /* U+003323: SQUARE SENTO*/
+ 0, /* U+003324: SQUARE DAASU*/
+ 0, /* U+003325: SQUARE DESI*/
+ 0, /* U+003326: SQUARE DORU*/
+ 0, /* U+003327: SQUARE TON*/
+ 0, /* U+003328: SQUARE NANO*/
+ 0, /* U+003329: SQUARE NOTTO*/
+ 0, /* U+00332a: SQUARE HAITU*/
+ 0, /* U+00332b: SQUARE PAASENTO*/
+ 0, /* U+00332c: SQUARE PAATU*/
+ 0, /* U+00332d: SQUARE BAARERU*/
+ 0, /* U+00332e: SQUARE PIASUTORU*/
+ 0, /* U+00332f: SQUARE PIKURU*/
+ 0, /* U+003330: SQUARE PIKO*/
+ 0, /* U+003331: SQUARE BIRU*/
+ 0, /* U+003332: SQUARE HUARADDO*/
+ 0, /* U+003333: SQUARE HUIITO*/
+ 0, /* U+003334: SQUARE BUSSYERU*/
+ 0, /* U+003335: SQUARE HURAN*/
+ 0, /* U+003336: SQUARE HEKUTAARU*/
+ 0, /* U+003337: SQUARE PESO*/
+ 0, /* U+003338: SQUARE PENIHI*/
+ 0, /* U+003339: SQUARE HERUTU*/
+ 0, /* U+00333a: SQUARE PENSU*/
+ 0, /* U+00333b: SQUARE PEEZI*/
+ 0, /* U+00333c: SQUARE BEETA*/
+ 0, /* U+00333d: SQUARE POINTO*/
+ 0, /* U+00333e: SQUARE BORUTO*/
+ 0, /* U+00333f: SQUARE HON*/
+ 0, /* U+003340: SQUARE PONDO*/
+ 0, /* U+003341: SQUARE HOORU*/
+ 0, /* U+003342: SQUARE HOON*/
+ 0, /* U+003343: SQUARE MAIKURO*/
+ 0, /* U+003344: SQUARE MAIRU*/
+ 0, /* U+003345: SQUARE MAHHA*/
+ 0, /* U+003346: SQUARE MARUKU*/
+ 0, /* U+003347: SQUARE MANSYON*/
+ 0, /* U+003348: SQUARE MIKURON*/
+ 0, /* U+003349: SQUARE MIRI*/
+ 0, /* U+00334a: SQUARE MIRIBAARU*/
+ 0, /* U+00334b: SQUARE MEGA*/
+ 0, /* U+00334c: SQUARE MEGATON*/
+ 0, /* U+00334d: SQUARE MEETORU*/
+ 0, /* U+00334e: SQUARE YAADO*/
+ 0, /* U+00334f: SQUARE YAARU*/
+ 0, /* U+003350: SQUARE YUAN*/
+ 0, /* U+003351: SQUARE RITTORU*/
+ 0, /* U+003352: SQUARE RIRA*/
+ 0, /* U+003353: SQUARE RUPII*/
+ 0, /* U+003354: SQUARE RUUBURU*/
+ 0, /* U+003355: SQUARE REMU*/
+ 0, /* U+003356: SQUARE RENTOGEN*/
+ 0, /* U+003357: SQUARE WATTO*/
+ 0, /* U+003358: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO*/
+ 0, /* U+003359: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE*/
+ 0, /* U+00335a: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO*/
+ 0, /* U+00335b: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE*/
+ 0, /* U+00335c: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR*/
+ 0, /* U+00335d: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE*/
+ 0, /* U+00335e: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX*/
+ 0, /* U+00335f: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN*/
+ 0, /* U+003360: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT*/
+ 0, /* U+003361: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE*/
+ 0, /* U+003362: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN*/
+ 0, /* U+003363: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN*/
+ 0, /* U+003364: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE*/
+ 0, /* U+003365: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN*/
+ 0, /* U+003366: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN*/
+ 0, /* U+003367: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN*/
+ 0, /* U+003368: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN*/
+ 0, /* U+003369: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN*/
+ 0, /* U+00336a: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN*/
+ 0, /* U+00336b: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN*/
+ 0, /* U+00336c: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY*/
+ 0, /* U+00336d: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE*/
+ 0, /* U+00336e: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO*/
+ 0, /* U+00336f: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE*/
+ 0, /* U+003370: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR*/
+ 0, /* U+003371: SQUARE HPA*/
+ 0, /* U+003372: SQUARE DA*/
+ 0, /* U+003373: SQUARE AU*/
+ 0, /* U+003374: SQUARE BAR*/
+ 0, /* U+003375: SQUARE OV*/
+ 0, /* U+003376: SQUARE PC*/
+ 0, /* U+003377: SQUARE DM*/
+ 0, /* U+003378: SQUARE DM SQUARED*/
+ 0, /* U+003379: SQUARE DM CUBED*/
+ 0, /* U+00337a: SQUARE IU*/
+ 0, /* U+00337b: SQUARE ERA NAME HEISEI*/
+ 0, /* U+00337c: SQUARE ERA NAME SYOUWA*/
+ 0, /* U+00337d: SQUARE ERA NAME TAISYOU*/
+ 0, /* U+00337e: SQUARE ERA NAME MEIZI*/
+ 0, /* U+00337f: SQUARE CORPORATION*/
+ 0, /* U+003380: SQUARE PA AMPS*/
+ 0, /* U+003381: SQUARE NA*/
+ 0, /* U+003382: SQUARE MU A*/
+ 0, /* U+003383: SQUARE MA*/
+ 0, /* U+003384: SQUARE KA*/
+ 0, /* U+003385: SQUARE KB*/
+ 0, /* U+003386: SQUARE MB*/
+ 0, /* U+003387: SQUARE GB*/
+ 0, /* U+003388: SQUARE CAL*/
+ 0, /* U+003389: SQUARE KCAL*/
+ 0, /* U+00338a: SQUARE PF*/
+ 0, /* U+00338b: SQUARE NF*/
+ 0, /* U+00338c: SQUARE MU F*/
+ 0, /* U+00338d: SQUARE MU G*/
+ 0, /* U+00338e: SQUARE MG*/
+ 0, /* U+00338f: SQUARE KG*/
+ 0, /* U+003390: SQUARE HZ*/
+ 0, /* U+003391: SQUARE KHZ*/
+ 0, /* U+003392: SQUARE MHZ*/
+ 0, /* U+003393: SQUARE GHZ*/
+ 0, /* U+003394: SQUARE THZ*/
+ 0, /* U+003395: SQUARE MU L*/
+ 0, /* U+003396: SQUARE ML*/
+ 0, /* U+003397: SQUARE DL*/
+ 0, /* U+003398: SQUARE KL*/
+ 0, /* U+003399: SQUARE FM*/
+ 0, /* U+00339a: SQUARE NM*/
+ 0, /* U+00339b: SQUARE MU M*/
+ 0, /* U+00339c: SQUARE MM*/
+ 0, /* U+00339d: SQUARE CM*/
+ 0, /* U+00339e: SQUARE KM*/
+ 0, /* U+00339f: SQUARE MM SQUARED*/
+ 0, /* U+0033a0: SQUARE CM SQUARED*/
+ 0, /* U+0033a1: SQUARE M SQUARED*/
+ 0, /* U+0033a2: SQUARE KM SQUARED*/
+ 0, /* U+0033a3: SQUARE MM CUBED*/
+ 0, /* U+0033a4: SQUARE CM CUBED*/
+ 0, /* U+0033a5: SQUARE M CUBED*/
+ 0, /* U+0033a6: SQUARE KM CUBED*/
+ 0, /* U+0033a7: SQUARE M OVER S*/
+ 0, /* U+0033a8: SQUARE M OVER S SQUARED*/
+ 0, /* U+0033a9: SQUARE PA*/
+ 0, /* U+0033aa: SQUARE KPA*/
+ 0, /* U+0033ab: SQUARE MPA*/
+ 0, /* U+0033ac: SQUARE GPA*/
+ 0, /* U+0033ad: SQUARE RAD*/
+ 0, /* U+0033ae: SQUARE RAD OVER S*/
+ 0, /* U+0033af: SQUARE RAD OVER S SQUARED*/
+ 0, /* U+0033b0: SQUARE PS*/
+ 0, /* U+0033b1: SQUARE NS*/
+ 0, /* U+0033b2: SQUARE MU S*/
+ 0, /* U+0033b3: SQUARE MS*/
+ 0, /* U+0033b4: SQUARE PV*/
+ 0, /* U+0033b5: SQUARE NV*/
+ 0, /* U+0033b6: SQUARE MU V*/
+ 0, /* U+0033b7: SQUARE MV*/
+ 0, /* U+0033b8: SQUARE KV*/
+ 0, /* U+0033b9: SQUARE MV MEGA*/
+ 0, /* U+0033ba: SQUARE PW*/
+ 0, /* U+0033bb: SQUARE NW*/
+ 0, /* U+0033bc: SQUARE MU W*/
+ 0, /* U+0033bd: SQUARE MW*/
+ 0, /* U+0033be: SQUARE KW*/
+ 0, /* U+0033bf: SQUARE MW MEGA*/
+ 0, /* U+0033c0: SQUARE K OHM*/
+ 0, /* U+0033c1: SQUARE M OHM*/
+ 0, /* U+0033c2: SQUARE AM*/
+ 0, /* U+0033c3: SQUARE BQ*/
+ 0, /* U+0033c4: SQUARE CC*/
+ 0, /* U+0033c5: SQUARE CD*/
+ 0, /* U+0033c6: SQUARE C OVER KG*/
+ 0, /* U+0033c7: SQUARE CO*/
+ 0, /* U+0033c8: SQUARE DB*/
+ 0, /* U+0033c9: SQUARE GY*/
+ 0, /* U+0033ca: SQUARE HA*/
+ 0, /* U+0033cb: SQUARE HP*/
+ 0, /* U+0033cc: SQUARE IN*/
+ 0, /* U+0033cd: SQUARE KK*/
+ 0, /* U+0033ce: SQUARE KM CAPITAL*/
+ 0, /* U+0033cf: SQUARE KT*/
+ 0, /* U+0033d0: SQUARE LM*/
+ 0, /* U+0033d1: SQUARE LN*/
+ 0, /* U+0033d2: SQUARE LOG*/
+ 0, /* U+0033d3: SQUARE LX*/
+ 0, /* U+0033d4: SQUARE MB SMALL*/
+ 0, /* U+0033d5: SQUARE MIL*/
+ 0, /* U+0033d6: SQUARE MOL*/
+ 0, /* U+0033d7: SQUARE PH*/
+ 0, /* U+0033d8: SQUARE PM*/
+ 0, /* U+0033d9: SQUARE PPM*/
+ 0, /* U+0033da: SQUARE PR*/
+ 0, /* U+0033db: SQUARE SR*/
+ 0, /* U+0033dc: SQUARE SV*/
+ 0, /* U+0033dd: SQUARE WB*/
+ 0, /* U+0033de: SQUARE V OVER M*/
+ 0, /* U+0033df: SQUARE A OVER M*/
+ 0, /* U+0033e0: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE*/
+ 0, /* U+0033e1: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO*/
+ 0, /* U+0033e2: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE*/
+ 0, /* U+0033e3: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR*/
+ 0, /* U+0033e4: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE*/
+ 0, /* U+0033e5: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX*/
+ 0, /* U+0033e6: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN*/
+ 0, /* U+0033e7: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT*/
+ 0, /* U+0033e8: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE*/
+ 0, /* U+0033e9: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN*/
+ 0, /* U+0033ea: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN*/
+ 0, /* U+0033eb: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE*/
+ 0, /* U+0033ec: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN*/
+ 0, /* U+0033ed: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN*/
+ 0, /* U+0033ee: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN*/
+ 0, /* U+0033ef: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN*/
+ 0, /* U+0033f0: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN*/
+ 0, /* U+0033f1: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN*/
+ 0, /* U+0033f2: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN*/
+ 0, /* U+0033f3: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY*/
+ 0, /* U+0033f4: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE*/
+ 0, /* U+0033f5: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO*/
+ 0, /* U+0033f6: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE*/
+ 0, /* U+0033f7: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR*/
+ 0, /* U+0033f8: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE*/
+ 0, /* U+0033f9: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX*/
+ 0, /* U+0033fa: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN*/
+ 0, /* U+0033fb: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT*/
+ 0, /* U+0033fc: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE*/
+ 0, /* U+0033fd: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY*/
+ 0, /* U+0033fe: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE*/
+ 0, /* U+0033ff: SQUARE GAL*/
+ RTUNI_ALPHA, /* U+003400: <CJK Ideograph Extension A, First>*/
+};
+
+static const uint8_t g_afRTUniFlags0x004db5[] =
+{
+ RTUNI_ALPHA, /* U+004db5: <CJK Ideograph Extension A, Last>*/
+ 0, /* U+004db6: */
+ 0, /* U+004db7: */
+ 0, /* U+004db8: */
+ 0, /* U+004db9: */
+ 0, /* U+004dba: */
+ 0, /* U+004dbb: */
+ 0, /* U+004dbc: */
+ 0, /* U+004dbd: */
+ 0, /* U+004dbe: */
+ 0, /* U+004dbf: */
+ 0, /* U+004dc0: HEXAGRAM FOR THE CREATIVE HEAVEN*/
+ 0, /* U+004dc1: HEXAGRAM FOR THE RECEPTIVE EARTH*/
+ 0, /* U+004dc2: HEXAGRAM FOR DIFFICULTY AT THE BEGINNING*/
+ 0, /* U+004dc3: HEXAGRAM FOR YOUTHFUL FOLLY*/
+ 0, /* U+004dc4: HEXAGRAM FOR WAITING*/
+ 0, /* U+004dc5: HEXAGRAM FOR CONFLICT*/
+ 0, /* U+004dc6: HEXAGRAM FOR THE ARMY*/
+ 0, /* U+004dc7: HEXAGRAM FOR HOLDING TOGETHER*/
+ 0, /* U+004dc8: HEXAGRAM FOR SMALL TAMING*/
+ 0, /* U+004dc9: HEXAGRAM FOR TREADING*/
+ 0, /* U+004dca: HEXAGRAM FOR PEACE*/
+ 0, /* U+004dcb: HEXAGRAM FOR STANDSTILL*/
+ 0, /* U+004dcc: HEXAGRAM FOR FELLOWSHIP*/
+ 0, /* U+004dcd: HEXAGRAM FOR GREAT POSSESSION*/
+ 0, /* U+004dce: HEXAGRAM FOR MODESTY*/
+ 0, /* U+004dcf: HEXAGRAM FOR ENTHUSIASM*/
+ 0, /* U+004dd0: HEXAGRAM FOR FOLLOWING*/
+ 0, /* U+004dd1: HEXAGRAM FOR WORK ON THE DECAYED*/
+ 0, /* U+004dd2: HEXAGRAM FOR APPROACH*/
+ 0, /* U+004dd3: HEXAGRAM FOR CONTEMPLATION*/
+ 0, /* U+004dd4: HEXAGRAM FOR BITING THROUGH*/
+ 0, /* U+004dd5: HEXAGRAM FOR GRACE*/
+ 0, /* U+004dd6: HEXAGRAM FOR SPLITTING APART*/
+ 0, /* U+004dd7: HEXAGRAM FOR RETURN*/
+ 0, /* U+004dd8: HEXAGRAM FOR INNOCENCE*/
+ 0, /* U+004dd9: HEXAGRAM FOR GREAT TAMING*/
+ 0, /* U+004dda: HEXAGRAM FOR MOUTH CORNERS*/
+ 0, /* U+004ddb: HEXAGRAM FOR GREAT PREPONDERANCE*/
+ 0, /* U+004ddc: HEXAGRAM FOR THE ABYSMAL WATER*/
+ 0, /* U+004ddd: HEXAGRAM FOR THE CLINGING FIRE*/
+ 0, /* U+004dde: HEXAGRAM FOR INFLUENCE*/
+ 0, /* U+004ddf: HEXAGRAM FOR DURATION*/
+ 0, /* U+004de0: HEXAGRAM FOR RETREAT*/
+ 0, /* U+004de1: HEXAGRAM FOR GREAT POWER*/
+ 0, /* U+004de2: HEXAGRAM FOR PROGRESS*/
+ 0, /* U+004de3: HEXAGRAM FOR DARKENING OF THE LIGHT*/
+ 0, /* U+004de4: HEXAGRAM FOR THE FAMILY*/
+ 0, /* U+004de5: HEXAGRAM FOR OPPOSITION*/
+ 0, /* U+004de6: HEXAGRAM FOR OBSTRUCTION*/
+ 0, /* U+004de7: HEXAGRAM FOR DELIVERANCE*/
+ 0, /* U+004de8: HEXAGRAM FOR DECREASE*/
+ 0, /* U+004de9: HEXAGRAM FOR INCREASE*/
+ 0, /* U+004dea: HEXAGRAM FOR BREAKTHROUGH*/
+ 0, /* U+004deb: HEXAGRAM FOR COMING TO MEET*/
+ 0, /* U+004dec: HEXAGRAM FOR GATHERING TOGETHER*/
+ 0, /* U+004ded: HEXAGRAM FOR PUSHING UPWARD*/
+ 0, /* U+004dee: HEXAGRAM FOR OPPRESSION*/
+ 0, /* U+004def: HEXAGRAM FOR THE WELL*/
+ 0, /* U+004df0: HEXAGRAM FOR REVOLUTION*/
+ 0, /* U+004df1: HEXAGRAM FOR THE CAULDRON*/
+ 0, /* U+004df2: HEXAGRAM FOR THE AROUSING THUNDER*/
+ 0, /* U+004df3: HEXAGRAM FOR THE KEEPING STILL MOUNTAIN*/
+ 0, /* U+004df4: HEXAGRAM FOR DEVELOPMENT*/
+ 0, /* U+004df5: HEXAGRAM FOR THE MARRYING MAIDEN*/
+ 0, /* U+004df6: HEXAGRAM FOR ABUNDANCE*/
+ 0, /* U+004df7: HEXAGRAM FOR THE WANDERER*/
+ 0, /* U+004df8: HEXAGRAM FOR THE GENTLE WIND*/
+ 0, /* U+004df9: HEXAGRAM FOR THE JOYOUS LAKE*/
+ 0, /* U+004dfa: HEXAGRAM FOR DISPERSION*/
+ 0, /* U+004dfb: HEXAGRAM FOR LIMITATION*/
+ 0, /* U+004dfc: HEXAGRAM FOR INNER TRUTH*/
+ 0, /* U+004dfd: HEXAGRAM FOR SMALL PREPONDERANCE*/
+ 0, /* U+004dfe: HEXAGRAM FOR AFTER COMPLETION*/
+ 0, /* U+004dff: HEXAGRAM FOR BEFORE COMPLETION*/
+ RTUNI_ALPHA, /* U+004e00: <CJK Ideograph, First>*/
+};
+
+static const uint8_t g_afRTUniFlags0x009fcc[] =
+{
+ RTUNI_ALPHA, /* U+009fcc: <CJK Ideograph, Last>*/
+ 0, /* U+009fcd: */
+ 0, /* U+009fce: */
+ 0, /* U+009fcf: */
+ 0, /* U+009fd0: */
+ 0, /* U+009fd1: */
+ 0, /* U+009fd2: */
+ 0, /* U+009fd3: */
+ 0, /* U+009fd4: */
+ 0, /* U+009fd5: */
+ 0, /* U+009fd6: */
+ 0, /* U+009fd7: */
+ 0, /* U+009fd8: */
+ 0, /* U+009fd9: */
+ 0, /* U+009fda: */
+ 0, /* U+009fdb: */
+ 0, /* U+009fdc: */
+ 0, /* U+009fdd: */
+ 0, /* U+009fde: */
+ 0, /* U+009fdf: */
+ 0, /* U+009fe0: */
+ 0, /* U+009fe1: */
+ 0, /* U+009fe2: */
+ 0, /* U+009fe3: */
+ 0, /* U+009fe4: */
+ 0, /* U+009fe5: */
+ 0, /* U+009fe6: */
+ 0, /* U+009fe7: */
+ 0, /* U+009fe8: */
+ 0, /* U+009fe9: */
+ 0, /* U+009fea: */
+ 0, /* U+009feb: */
+ 0, /* U+009fec: */
+ 0, /* U+009fed: */
+ 0, /* U+009fee: */
+ 0, /* U+009fef: */
+ 0, /* U+009ff0: */
+ 0, /* U+009ff1: */
+ 0, /* U+009ff2: */
+ 0, /* U+009ff3: */
+ 0, /* U+009ff4: */
+ 0, /* U+009ff5: */
+ 0, /* U+009ff6: */
+ 0, /* U+009ff7: */
+ 0, /* U+009ff8: */
+ 0, /* U+009ff9: */
+ 0, /* U+009ffa: */
+ 0, /* U+009ffb: */
+ 0, /* U+009ffc: */
+ 0, /* U+009ffd: */
+ 0, /* U+009ffe: */
+ 0, /* U+009fff: */
+ RTUNI_ALPHA, /* U+00a000: YI SYLLABLE IT*/
+ RTUNI_ALPHA, /* U+00a001: YI SYLLABLE IX*/
+ RTUNI_ALPHA, /* U+00a002: YI SYLLABLE I*/
+ RTUNI_ALPHA, /* U+00a003: YI SYLLABLE IP*/
+ RTUNI_ALPHA, /* U+00a004: YI SYLLABLE IET*/
+ RTUNI_ALPHA, /* U+00a005: YI SYLLABLE IEX*/
+ RTUNI_ALPHA, /* U+00a006: YI SYLLABLE IE*/
+ RTUNI_ALPHA, /* U+00a007: YI SYLLABLE IEP*/
+ RTUNI_ALPHA, /* U+00a008: YI SYLLABLE AT*/
+ RTUNI_ALPHA, /* U+00a009: YI SYLLABLE AX*/
+ RTUNI_ALPHA, /* U+00a00a: YI SYLLABLE A*/
+ RTUNI_ALPHA, /* U+00a00b: YI SYLLABLE AP*/
+ RTUNI_ALPHA, /* U+00a00c: YI SYLLABLE UOX*/
+ RTUNI_ALPHA, /* U+00a00d: YI SYLLABLE UO*/
+ RTUNI_ALPHA, /* U+00a00e: YI SYLLABLE UOP*/
+ RTUNI_ALPHA, /* U+00a00f: YI SYLLABLE OT*/
+ RTUNI_ALPHA, /* U+00a010: YI SYLLABLE OX*/
+ RTUNI_ALPHA, /* U+00a011: YI SYLLABLE O*/
+ RTUNI_ALPHA, /* U+00a012: YI SYLLABLE OP*/
+ RTUNI_ALPHA, /* U+00a013: YI SYLLABLE EX*/
+ RTUNI_ALPHA, /* U+00a014: YI SYLLABLE E*/
+ RTUNI_ALPHA, /* U+00a015: YI SYLLABLE WU*/
+ RTUNI_ALPHA, /* U+00a016: YI SYLLABLE BIT*/
+ RTUNI_ALPHA, /* U+00a017: YI SYLLABLE BIX*/
+ RTUNI_ALPHA, /* U+00a018: YI SYLLABLE BI*/
+ RTUNI_ALPHA, /* U+00a019: YI SYLLABLE BIP*/
+ RTUNI_ALPHA, /* U+00a01a: YI SYLLABLE BIET*/
+ RTUNI_ALPHA, /* U+00a01b: YI SYLLABLE BIEX*/
+ RTUNI_ALPHA, /* U+00a01c: YI SYLLABLE BIE*/
+ RTUNI_ALPHA, /* U+00a01d: YI SYLLABLE BIEP*/
+ RTUNI_ALPHA, /* U+00a01e: YI SYLLABLE BAT*/
+ RTUNI_ALPHA, /* U+00a01f: YI SYLLABLE BAX*/
+ RTUNI_ALPHA, /* U+00a020: YI SYLLABLE BA*/
+ RTUNI_ALPHA, /* U+00a021: YI SYLLABLE BAP*/
+ RTUNI_ALPHA, /* U+00a022: YI SYLLABLE BUOX*/
+ RTUNI_ALPHA, /* U+00a023: YI SYLLABLE BUO*/
+ RTUNI_ALPHA, /* U+00a024: YI SYLLABLE BUOP*/
+ RTUNI_ALPHA, /* U+00a025: YI SYLLABLE BOT*/
+ RTUNI_ALPHA, /* U+00a026: YI SYLLABLE BOX*/
+ RTUNI_ALPHA, /* U+00a027: YI SYLLABLE BO*/
+ RTUNI_ALPHA, /* U+00a028: YI SYLLABLE BOP*/
+ RTUNI_ALPHA, /* U+00a029: YI SYLLABLE BEX*/
+ RTUNI_ALPHA, /* U+00a02a: YI SYLLABLE BE*/
+ RTUNI_ALPHA, /* U+00a02b: YI SYLLABLE BEP*/
+ RTUNI_ALPHA, /* U+00a02c: YI SYLLABLE BUT*/
+ RTUNI_ALPHA, /* U+00a02d: YI SYLLABLE BUX*/
+ RTUNI_ALPHA, /* U+00a02e: YI SYLLABLE BU*/
+ RTUNI_ALPHA, /* U+00a02f: YI SYLLABLE BUP*/
+ RTUNI_ALPHA, /* U+00a030: YI SYLLABLE BURX*/
+ RTUNI_ALPHA, /* U+00a031: YI SYLLABLE BUR*/
+ RTUNI_ALPHA, /* U+00a032: YI SYLLABLE BYT*/
+ RTUNI_ALPHA, /* U+00a033: YI SYLLABLE BYX*/
+ RTUNI_ALPHA, /* U+00a034: YI SYLLABLE BY*/
+ RTUNI_ALPHA, /* U+00a035: YI SYLLABLE BYP*/
+ RTUNI_ALPHA, /* U+00a036: YI SYLLABLE BYRX*/
+ RTUNI_ALPHA, /* U+00a037: YI SYLLABLE BYR*/
+ RTUNI_ALPHA, /* U+00a038: YI SYLLABLE PIT*/
+ RTUNI_ALPHA, /* U+00a039: YI SYLLABLE PIX*/
+ RTUNI_ALPHA, /* U+00a03a: YI SYLLABLE PI*/
+ RTUNI_ALPHA, /* U+00a03b: YI SYLLABLE PIP*/
+ RTUNI_ALPHA, /* U+00a03c: YI SYLLABLE PIEX*/
+ RTUNI_ALPHA, /* U+00a03d: YI SYLLABLE PIE*/
+ RTUNI_ALPHA, /* U+00a03e: YI SYLLABLE PIEP*/
+ RTUNI_ALPHA, /* U+00a03f: YI SYLLABLE PAT*/
+ RTUNI_ALPHA, /* U+00a040: YI SYLLABLE PAX*/
+ RTUNI_ALPHA, /* U+00a041: YI SYLLABLE PA*/
+ RTUNI_ALPHA, /* U+00a042: YI SYLLABLE PAP*/
+ RTUNI_ALPHA, /* U+00a043: YI SYLLABLE PUOX*/
+ RTUNI_ALPHA, /* U+00a044: YI SYLLABLE PUO*/
+ RTUNI_ALPHA, /* U+00a045: YI SYLLABLE PUOP*/
+ RTUNI_ALPHA, /* U+00a046: YI SYLLABLE POT*/
+ RTUNI_ALPHA, /* U+00a047: YI SYLLABLE POX*/
+ RTUNI_ALPHA, /* U+00a048: YI SYLLABLE PO*/
+ RTUNI_ALPHA, /* U+00a049: YI SYLLABLE POP*/
+ RTUNI_ALPHA, /* U+00a04a: YI SYLLABLE PUT*/
+ RTUNI_ALPHA, /* U+00a04b: YI SYLLABLE PUX*/
+ RTUNI_ALPHA, /* U+00a04c: YI SYLLABLE PU*/
+ RTUNI_ALPHA, /* U+00a04d: YI SYLLABLE PUP*/
+ RTUNI_ALPHA, /* U+00a04e: YI SYLLABLE PURX*/
+ RTUNI_ALPHA, /* U+00a04f: YI SYLLABLE PUR*/
+ RTUNI_ALPHA, /* U+00a050: YI SYLLABLE PYT*/
+ RTUNI_ALPHA, /* U+00a051: YI SYLLABLE PYX*/
+ RTUNI_ALPHA, /* U+00a052: YI SYLLABLE PY*/
+ RTUNI_ALPHA, /* U+00a053: YI SYLLABLE PYP*/
+ RTUNI_ALPHA, /* U+00a054: YI SYLLABLE PYRX*/
+ RTUNI_ALPHA, /* U+00a055: YI SYLLABLE PYR*/
+ RTUNI_ALPHA, /* U+00a056: YI SYLLABLE BBIT*/
+ RTUNI_ALPHA, /* U+00a057: YI SYLLABLE BBIX*/
+ RTUNI_ALPHA, /* U+00a058: YI SYLLABLE BBI*/
+ RTUNI_ALPHA, /* U+00a059: YI SYLLABLE BBIP*/
+ RTUNI_ALPHA, /* U+00a05a: YI SYLLABLE BBIET*/
+ RTUNI_ALPHA, /* U+00a05b: YI SYLLABLE BBIEX*/
+ RTUNI_ALPHA, /* U+00a05c: YI SYLLABLE BBIE*/
+ RTUNI_ALPHA, /* U+00a05d: YI SYLLABLE BBIEP*/
+ RTUNI_ALPHA, /* U+00a05e: YI SYLLABLE BBAT*/
+ RTUNI_ALPHA, /* U+00a05f: YI SYLLABLE BBAX*/
+ RTUNI_ALPHA, /* U+00a060: YI SYLLABLE BBA*/
+ RTUNI_ALPHA, /* U+00a061: YI SYLLABLE BBAP*/
+ RTUNI_ALPHA, /* U+00a062: YI SYLLABLE BBUOX*/
+ RTUNI_ALPHA, /* U+00a063: YI SYLLABLE BBUO*/
+ RTUNI_ALPHA, /* U+00a064: YI SYLLABLE BBUOP*/
+ RTUNI_ALPHA, /* U+00a065: YI SYLLABLE BBOT*/
+ RTUNI_ALPHA, /* U+00a066: YI SYLLABLE BBOX*/
+ RTUNI_ALPHA, /* U+00a067: YI SYLLABLE BBO*/
+ RTUNI_ALPHA, /* U+00a068: YI SYLLABLE BBOP*/
+ RTUNI_ALPHA, /* U+00a069: YI SYLLABLE BBEX*/
+ RTUNI_ALPHA, /* U+00a06a: YI SYLLABLE BBE*/
+ RTUNI_ALPHA, /* U+00a06b: YI SYLLABLE BBEP*/
+ RTUNI_ALPHA, /* U+00a06c: YI SYLLABLE BBUT*/
+ RTUNI_ALPHA, /* U+00a06d: YI SYLLABLE BBUX*/
+ RTUNI_ALPHA, /* U+00a06e: YI SYLLABLE BBU*/
+ RTUNI_ALPHA, /* U+00a06f: YI SYLLABLE BBUP*/
+ RTUNI_ALPHA, /* U+00a070: YI SYLLABLE BBURX*/
+ RTUNI_ALPHA, /* U+00a071: YI SYLLABLE BBUR*/
+ RTUNI_ALPHA, /* U+00a072: YI SYLLABLE BBYT*/
+ RTUNI_ALPHA, /* U+00a073: YI SYLLABLE BBYX*/
+ RTUNI_ALPHA, /* U+00a074: YI SYLLABLE BBY*/
+ RTUNI_ALPHA, /* U+00a075: YI SYLLABLE BBYP*/
+ RTUNI_ALPHA, /* U+00a076: YI SYLLABLE NBIT*/
+ RTUNI_ALPHA, /* U+00a077: YI SYLLABLE NBIX*/
+ RTUNI_ALPHA, /* U+00a078: YI SYLLABLE NBI*/
+ RTUNI_ALPHA, /* U+00a079: YI SYLLABLE NBIP*/
+ RTUNI_ALPHA, /* U+00a07a: YI SYLLABLE NBIEX*/
+ RTUNI_ALPHA, /* U+00a07b: YI SYLLABLE NBIE*/
+ RTUNI_ALPHA, /* U+00a07c: YI SYLLABLE NBIEP*/
+ RTUNI_ALPHA, /* U+00a07d: YI SYLLABLE NBAT*/
+ RTUNI_ALPHA, /* U+00a07e: YI SYLLABLE NBAX*/
+ RTUNI_ALPHA, /* U+00a07f: YI SYLLABLE NBA*/
+ RTUNI_ALPHA, /* U+00a080: YI SYLLABLE NBAP*/
+ RTUNI_ALPHA, /* U+00a081: YI SYLLABLE NBOT*/
+ RTUNI_ALPHA, /* U+00a082: YI SYLLABLE NBOX*/
+ RTUNI_ALPHA, /* U+00a083: YI SYLLABLE NBO*/
+ RTUNI_ALPHA, /* U+00a084: YI SYLLABLE NBOP*/
+ RTUNI_ALPHA, /* U+00a085: YI SYLLABLE NBUT*/
+ RTUNI_ALPHA, /* U+00a086: YI SYLLABLE NBUX*/
+ RTUNI_ALPHA, /* U+00a087: YI SYLLABLE NBU*/
+ RTUNI_ALPHA, /* U+00a088: YI SYLLABLE NBUP*/
+ RTUNI_ALPHA, /* U+00a089: YI SYLLABLE NBURX*/
+ RTUNI_ALPHA, /* U+00a08a: YI SYLLABLE NBUR*/
+ RTUNI_ALPHA, /* U+00a08b: YI SYLLABLE NBYT*/
+ RTUNI_ALPHA, /* U+00a08c: YI SYLLABLE NBYX*/
+ RTUNI_ALPHA, /* U+00a08d: YI SYLLABLE NBY*/
+ RTUNI_ALPHA, /* U+00a08e: YI SYLLABLE NBYP*/
+ RTUNI_ALPHA, /* U+00a08f: YI SYLLABLE NBYRX*/
+ RTUNI_ALPHA, /* U+00a090: YI SYLLABLE NBYR*/
+ RTUNI_ALPHA, /* U+00a091: YI SYLLABLE HMIT*/
+ RTUNI_ALPHA, /* U+00a092: YI SYLLABLE HMIX*/
+ RTUNI_ALPHA, /* U+00a093: YI SYLLABLE HMI*/
+ RTUNI_ALPHA, /* U+00a094: YI SYLLABLE HMIP*/
+ RTUNI_ALPHA, /* U+00a095: YI SYLLABLE HMIEX*/
+ RTUNI_ALPHA, /* U+00a096: YI SYLLABLE HMIE*/
+ RTUNI_ALPHA, /* U+00a097: YI SYLLABLE HMIEP*/
+ RTUNI_ALPHA, /* U+00a098: YI SYLLABLE HMAT*/
+ RTUNI_ALPHA, /* U+00a099: YI SYLLABLE HMAX*/
+ RTUNI_ALPHA, /* U+00a09a: YI SYLLABLE HMA*/
+ RTUNI_ALPHA, /* U+00a09b: YI SYLLABLE HMAP*/
+ RTUNI_ALPHA, /* U+00a09c: YI SYLLABLE HMUOX*/
+ RTUNI_ALPHA, /* U+00a09d: YI SYLLABLE HMUO*/
+ RTUNI_ALPHA, /* U+00a09e: YI SYLLABLE HMUOP*/
+ RTUNI_ALPHA, /* U+00a09f: YI SYLLABLE HMOT*/
+ RTUNI_ALPHA, /* U+00a0a0: YI SYLLABLE HMOX*/
+ RTUNI_ALPHA, /* U+00a0a1: YI SYLLABLE HMO*/
+ RTUNI_ALPHA, /* U+00a0a2: YI SYLLABLE HMOP*/
+ RTUNI_ALPHA, /* U+00a0a3: YI SYLLABLE HMUT*/
+ RTUNI_ALPHA, /* U+00a0a4: YI SYLLABLE HMUX*/
+ RTUNI_ALPHA, /* U+00a0a5: YI SYLLABLE HMU*/
+ RTUNI_ALPHA, /* U+00a0a6: YI SYLLABLE HMUP*/
+ RTUNI_ALPHA, /* U+00a0a7: YI SYLLABLE HMURX*/
+ RTUNI_ALPHA, /* U+00a0a8: YI SYLLABLE HMUR*/
+ RTUNI_ALPHA, /* U+00a0a9: YI SYLLABLE HMYX*/
+ RTUNI_ALPHA, /* U+00a0aa: YI SYLLABLE HMY*/
+ RTUNI_ALPHA, /* U+00a0ab: YI SYLLABLE HMYP*/
+ RTUNI_ALPHA, /* U+00a0ac: YI SYLLABLE HMYRX*/
+ RTUNI_ALPHA, /* U+00a0ad: YI SYLLABLE HMYR*/
+ RTUNI_ALPHA, /* U+00a0ae: YI SYLLABLE MIT*/
+ RTUNI_ALPHA, /* U+00a0af: YI SYLLABLE MIX*/
+ RTUNI_ALPHA, /* U+00a0b0: YI SYLLABLE MI*/
+ RTUNI_ALPHA, /* U+00a0b1: YI SYLLABLE MIP*/
+ RTUNI_ALPHA, /* U+00a0b2: YI SYLLABLE MIEX*/
+ RTUNI_ALPHA, /* U+00a0b3: YI SYLLABLE MIE*/
+ RTUNI_ALPHA, /* U+00a0b4: YI SYLLABLE MIEP*/
+ RTUNI_ALPHA, /* U+00a0b5: YI SYLLABLE MAT*/
+ RTUNI_ALPHA, /* U+00a0b6: YI SYLLABLE MAX*/
+ RTUNI_ALPHA, /* U+00a0b7: YI SYLLABLE MA*/
+ RTUNI_ALPHA, /* U+00a0b8: YI SYLLABLE MAP*/
+ RTUNI_ALPHA, /* U+00a0b9: YI SYLLABLE MUOT*/
+ RTUNI_ALPHA, /* U+00a0ba: YI SYLLABLE MUOX*/
+ RTUNI_ALPHA, /* U+00a0bb: YI SYLLABLE MUO*/
+ RTUNI_ALPHA, /* U+00a0bc: YI SYLLABLE MUOP*/
+ RTUNI_ALPHA, /* U+00a0bd: YI SYLLABLE MOT*/
+ RTUNI_ALPHA, /* U+00a0be: YI SYLLABLE MOX*/
+ RTUNI_ALPHA, /* U+00a0bf: YI SYLLABLE MO*/
+ RTUNI_ALPHA, /* U+00a0c0: YI SYLLABLE MOP*/
+ RTUNI_ALPHA, /* U+00a0c1: YI SYLLABLE MEX*/
+ RTUNI_ALPHA, /* U+00a0c2: YI SYLLABLE ME*/
+ RTUNI_ALPHA, /* U+00a0c3: YI SYLLABLE MUT*/
+ RTUNI_ALPHA, /* U+00a0c4: YI SYLLABLE MUX*/
+ RTUNI_ALPHA, /* U+00a0c5: YI SYLLABLE MU*/
+ RTUNI_ALPHA, /* U+00a0c6: YI SYLLABLE MUP*/
+ RTUNI_ALPHA, /* U+00a0c7: YI SYLLABLE MURX*/
+ RTUNI_ALPHA, /* U+00a0c8: YI SYLLABLE MUR*/
+ RTUNI_ALPHA, /* U+00a0c9: YI SYLLABLE MYT*/
+ RTUNI_ALPHA, /* U+00a0ca: YI SYLLABLE MYX*/
+ RTUNI_ALPHA, /* U+00a0cb: YI SYLLABLE MY*/
+ RTUNI_ALPHA, /* U+00a0cc: YI SYLLABLE MYP*/
+ RTUNI_ALPHA, /* U+00a0cd: YI SYLLABLE FIT*/
+ RTUNI_ALPHA, /* U+00a0ce: YI SYLLABLE FIX*/
+ RTUNI_ALPHA, /* U+00a0cf: YI SYLLABLE FI*/
+ RTUNI_ALPHA, /* U+00a0d0: YI SYLLABLE FIP*/
+ RTUNI_ALPHA, /* U+00a0d1: YI SYLLABLE FAT*/
+ RTUNI_ALPHA, /* U+00a0d2: YI SYLLABLE FAX*/
+ RTUNI_ALPHA, /* U+00a0d3: YI SYLLABLE FA*/
+ RTUNI_ALPHA, /* U+00a0d4: YI SYLLABLE FAP*/
+ RTUNI_ALPHA, /* U+00a0d5: YI SYLLABLE FOX*/
+ RTUNI_ALPHA, /* U+00a0d6: YI SYLLABLE FO*/
+ RTUNI_ALPHA, /* U+00a0d7: YI SYLLABLE FOP*/
+ RTUNI_ALPHA, /* U+00a0d8: YI SYLLABLE FUT*/
+ RTUNI_ALPHA, /* U+00a0d9: YI SYLLABLE FUX*/
+ RTUNI_ALPHA, /* U+00a0da: YI SYLLABLE FU*/
+ RTUNI_ALPHA, /* U+00a0db: YI SYLLABLE FUP*/
+ RTUNI_ALPHA, /* U+00a0dc: YI SYLLABLE FURX*/
+ RTUNI_ALPHA, /* U+00a0dd: YI SYLLABLE FUR*/
+ RTUNI_ALPHA, /* U+00a0de: YI SYLLABLE FYT*/
+ RTUNI_ALPHA, /* U+00a0df: YI SYLLABLE FYX*/
+ RTUNI_ALPHA, /* U+00a0e0: YI SYLLABLE FY*/
+ RTUNI_ALPHA, /* U+00a0e1: YI SYLLABLE FYP*/
+ RTUNI_ALPHA, /* U+00a0e2: YI SYLLABLE VIT*/
+ RTUNI_ALPHA, /* U+00a0e3: YI SYLLABLE VIX*/
+ RTUNI_ALPHA, /* U+00a0e4: YI SYLLABLE VI*/
+ RTUNI_ALPHA, /* U+00a0e5: YI SYLLABLE VIP*/
+ RTUNI_ALPHA, /* U+00a0e6: YI SYLLABLE VIET*/
+ RTUNI_ALPHA, /* U+00a0e7: YI SYLLABLE VIEX*/
+ RTUNI_ALPHA, /* U+00a0e8: YI SYLLABLE VIE*/
+ RTUNI_ALPHA, /* U+00a0e9: YI SYLLABLE VIEP*/
+ RTUNI_ALPHA, /* U+00a0ea: YI SYLLABLE VAT*/
+ RTUNI_ALPHA, /* U+00a0eb: YI SYLLABLE VAX*/
+ RTUNI_ALPHA, /* U+00a0ec: YI SYLLABLE VA*/
+ RTUNI_ALPHA, /* U+00a0ed: YI SYLLABLE VAP*/
+ RTUNI_ALPHA, /* U+00a0ee: YI SYLLABLE VOT*/
+ RTUNI_ALPHA, /* U+00a0ef: YI SYLLABLE VOX*/
+ RTUNI_ALPHA, /* U+00a0f0: YI SYLLABLE VO*/
+ RTUNI_ALPHA, /* U+00a0f1: YI SYLLABLE VOP*/
+ RTUNI_ALPHA, /* U+00a0f2: YI SYLLABLE VEX*/
+ RTUNI_ALPHA, /* U+00a0f3: YI SYLLABLE VEP*/
+ RTUNI_ALPHA, /* U+00a0f4: YI SYLLABLE VUT*/
+ RTUNI_ALPHA, /* U+00a0f5: YI SYLLABLE VUX*/
+ RTUNI_ALPHA, /* U+00a0f6: YI SYLLABLE VU*/
+ RTUNI_ALPHA, /* U+00a0f7: YI SYLLABLE VUP*/
+ RTUNI_ALPHA, /* U+00a0f8: YI SYLLABLE VURX*/
+ RTUNI_ALPHA, /* U+00a0f9: YI SYLLABLE VUR*/
+ RTUNI_ALPHA, /* U+00a0fa: YI SYLLABLE VYT*/
+ RTUNI_ALPHA, /* U+00a0fb: YI SYLLABLE VYX*/
+ RTUNI_ALPHA, /* U+00a0fc: YI SYLLABLE VY*/
+ RTUNI_ALPHA, /* U+00a0fd: YI SYLLABLE VYP*/
+ RTUNI_ALPHA, /* U+00a0fe: YI SYLLABLE VYRX*/
+ RTUNI_ALPHA, /* U+00a0ff: YI SYLLABLE VYR*/
+ RTUNI_ALPHA, /* U+00a100: YI SYLLABLE DIT*/
+ RTUNI_ALPHA, /* U+00a101: YI SYLLABLE DIX*/
+ RTUNI_ALPHA, /* U+00a102: YI SYLLABLE DI*/
+ RTUNI_ALPHA, /* U+00a103: YI SYLLABLE DIP*/
+ RTUNI_ALPHA, /* U+00a104: YI SYLLABLE DIEX*/
+ RTUNI_ALPHA, /* U+00a105: YI SYLLABLE DIE*/
+ RTUNI_ALPHA, /* U+00a106: YI SYLLABLE DIEP*/
+ RTUNI_ALPHA, /* U+00a107: YI SYLLABLE DAT*/
+ RTUNI_ALPHA, /* U+00a108: YI SYLLABLE DAX*/
+ RTUNI_ALPHA, /* U+00a109: YI SYLLABLE DA*/
+ RTUNI_ALPHA, /* U+00a10a: YI SYLLABLE DAP*/
+ RTUNI_ALPHA, /* U+00a10b: YI SYLLABLE DUOX*/
+ RTUNI_ALPHA, /* U+00a10c: YI SYLLABLE DUO*/
+ RTUNI_ALPHA, /* U+00a10d: YI SYLLABLE DOT*/
+ RTUNI_ALPHA, /* U+00a10e: YI SYLLABLE DOX*/
+ RTUNI_ALPHA, /* U+00a10f: YI SYLLABLE DO*/
+ RTUNI_ALPHA, /* U+00a110: YI SYLLABLE DOP*/
+ RTUNI_ALPHA, /* U+00a111: YI SYLLABLE DEX*/
+ RTUNI_ALPHA, /* U+00a112: YI SYLLABLE DE*/
+ RTUNI_ALPHA, /* U+00a113: YI SYLLABLE DEP*/
+ RTUNI_ALPHA, /* U+00a114: YI SYLLABLE DUT*/
+ RTUNI_ALPHA, /* U+00a115: YI SYLLABLE DUX*/
+ RTUNI_ALPHA, /* U+00a116: YI SYLLABLE DU*/
+ RTUNI_ALPHA, /* U+00a117: YI SYLLABLE DUP*/
+ RTUNI_ALPHA, /* U+00a118: YI SYLLABLE DURX*/
+ RTUNI_ALPHA, /* U+00a119: YI SYLLABLE DUR*/
+ RTUNI_ALPHA, /* U+00a11a: YI SYLLABLE TIT*/
+ RTUNI_ALPHA, /* U+00a11b: YI SYLLABLE TIX*/
+ RTUNI_ALPHA, /* U+00a11c: YI SYLLABLE TI*/
+ RTUNI_ALPHA, /* U+00a11d: YI SYLLABLE TIP*/
+ RTUNI_ALPHA, /* U+00a11e: YI SYLLABLE TIEX*/
+ RTUNI_ALPHA, /* U+00a11f: YI SYLLABLE TIE*/
+ RTUNI_ALPHA, /* U+00a120: YI SYLLABLE TIEP*/
+ RTUNI_ALPHA, /* U+00a121: YI SYLLABLE TAT*/
+ RTUNI_ALPHA, /* U+00a122: YI SYLLABLE TAX*/
+ RTUNI_ALPHA, /* U+00a123: YI SYLLABLE TA*/
+ RTUNI_ALPHA, /* U+00a124: YI SYLLABLE TAP*/
+ RTUNI_ALPHA, /* U+00a125: YI SYLLABLE TUOT*/
+ RTUNI_ALPHA, /* U+00a126: YI SYLLABLE TUOX*/
+ RTUNI_ALPHA, /* U+00a127: YI SYLLABLE TUO*/
+ RTUNI_ALPHA, /* U+00a128: YI SYLLABLE TUOP*/
+ RTUNI_ALPHA, /* U+00a129: YI SYLLABLE TOT*/
+ RTUNI_ALPHA, /* U+00a12a: YI SYLLABLE TOX*/
+ RTUNI_ALPHA, /* U+00a12b: YI SYLLABLE TO*/
+ RTUNI_ALPHA, /* U+00a12c: YI SYLLABLE TOP*/
+ RTUNI_ALPHA, /* U+00a12d: YI SYLLABLE TEX*/
+ RTUNI_ALPHA, /* U+00a12e: YI SYLLABLE TE*/
+ RTUNI_ALPHA, /* U+00a12f: YI SYLLABLE TEP*/
+ RTUNI_ALPHA, /* U+00a130: YI SYLLABLE TUT*/
+ RTUNI_ALPHA, /* U+00a131: YI SYLLABLE TUX*/
+ RTUNI_ALPHA, /* U+00a132: YI SYLLABLE TU*/
+ RTUNI_ALPHA, /* U+00a133: YI SYLLABLE TUP*/
+ RTUNI_ALPHA, /* U+00a134: YI SYLLABLE TURX*/
+ RTUNI_ALPHA, /* U+00a135: YI SYLLABLE TUR*/
+ RTUNI_ALPHA, /* U+00a136: YI SYLLABLE DDIT*/
+ RTUNI_ALPHA, /* U+00a137: YI SYLLABLE DDIX*/
+ RTUNI_ALPHA, /* U+00a138: YI SYLLABLE DDI*/
+ RTUNI_ALPHA, /* U+00a139: YI SYLLABLE DDIP*/
+ RTUNI_ALPHA, /* U+00a13a: YI SYLLABLE DDIEX*/
+ RTUNI_ALPHA, /* U+00a13b: YI SYLLABLE DDIE*/
+ RTUNI_ALPHA, /* U+00a13c: YI SYLLABLE DDIEP*/
+ RTUNI_ALPHA, /* U+00a13d: YI SYLLABLE DDAT*/
+ RTUNI_ALPHA, /* U+00a13e: YI SYLLABLE DDAX*/
+ RTUNI_ALPHA, /* U+00a13f: YI SYLLABLE DDA*/
+ RTUNI_ALPHA, /* U+00a140: YI SYLLABLE DDAP*/
+ RTUNI_ALPHA, /* U+00a141: YI SYLLABLE DDUOX*/
+ RTUNI_ALPHA, /* U+00a142: YI SYLLABLE DDUO*/
+ RTUNI_ALPHA, /* U+00a143: YI SYLLABLE DDUOP*/
+ RTUNI_ALPHA, /* U+00a144: YI SYLLABLE DDOT*/
+ RTUNI_ALPHA, /* U+00a145: YI SYLLABLE DDOX*/
+ RTUNI_ALPHA, /* U+00a146: YI SYLLABLE DDO*/
+ RTUNI_ALPHA, /* U+00a147: YI SYLLABLE DDOP*/
+ RTUNI_ALPHA, /* U+00a148: YI SYLLABLE DDEX*/
+ RTUNI_ALPHA, /* U+00a149: YI SYLLABLE DDE*/
+ RTUNI_ALPHA, /* U+00a14a: YI SYLLABLE DDEP*/
+ RTUNI_ALPHA, /* U+00a14b: YI SYLLABLE DDUT*/
+ RTUNI_ALPHA, /* U+00a14c: YI SYLLABLE DDUX*/
+ RTUNI_ALPHA, /* U+00a14d: YI SYLLABLE DDU*/
+ RTUNI_ALPHA, /* U+00a14e: YI SYLLABLE DDUP*/
+ RTUNI_ALPHA, /* U+00a14f: YI SYLLABLE DDURX*/
+ RTUNI_ALPHA, /* U+00a150: YI SYLLABLE DDUR*/
+ RTUNI_ALPHA, /* U+00a151: YI SYLLABLE NDIT*/
+ RTUNI_ALPHA, /* U+00a152: YI SYLLABLE NDIX*/
+ RTUNI_ALPHA, /* U+00a153: YI SYLLABLE NDI*/
+ RTUNI_ALPHA, /* U+00a154: YI SYLLABLE NDIP*/
+ RTUNI_ALPHA, /* U+00a155: YI SYLLABLE NDIEX*/
+ RTUNI_ALPHA, /* U+00a156: YI SYLLABLE NDIE*/
+ RTUNI_ALPHA, /* U+00a157: YI SYLLABLE NDAT*/
+ RTUNI_ALPHA, /* U+00a158: YI SYLLABLE NDAX*/
+ RTUNI_ALPHA, /* U+00a159: YI SYLLABLE NDA*/
+ RTUNI_ALPHA, /* U+00a15a: YI SYLLABLE NDAP*/
+ RTUNI_ALPHA, /* U+00a15b: YI SYLLABLE NDOT*/
+ RTUNI_ALPHA, /* U+00a15c: YI SYLLABLE NDOX*/
+ RTUNI_ALPHA, /* U+00a15d: YI SYLLABLE NDO*/
+ RTUNI_ALPHA, /* U+00a15e: YI SYLLABLE NDOP*/
+ RTUNI_ALPHA, /* U+00a15f: YI SYLLABLE NDEX*/
+ RTUNI_ALPHA, /* U+00a160: YI SYLLABLE NDE*/
+ RTUNI_ALPHA, /* U+00a161: YI SYLLABLE NDEP*/
+ RTUNI_ALPHA, /* U+00a162: YI SYLLABLE NDUT*/
+ RTUNI_ALPHA, /* U+00a163: YI SYLLABLE NDUX*/
+ RTUNI_ALPHA, /* U+00a164: YI SYLLABLE NDU*/
+ RTUNI_ALPHA, /* U+00a165: YI SYLLABLE NDUP*/
+ RTUNI_ALPHA, /* U+00a166: YI SYLLABLE NDURX*/
+ RTUNI_ALPHA, /* U+00a167: YI SYLLABLE NDUR*/
+ RTUNI_ALPHA, /* U+00a168: YI SYLLABLE HNIT*/
+ RTUNI_ALPHA, /* U+00a169: YI SYLLABLE HNIX*/
+ RTUNI_ALPHA, /* U+00a16a: YI SYLLABLE HNI*/
+ RTUNI_ALPHA, /* U+00a16b: YI SYLLABLE HNIP*/
+ RTUNI_ALPHA, /* U+00a16c: YI SYLLABLE HNIET*/
+ RTUNI_ALPHA, /* U+00a16d: YI SYLLABLE HNIEX*/
+ RTUNI_ALPHA, /* U+00a16e: YI SYLLABLE HNIE*/
+ RTUNI_ALPHA, /* U+00a16f: YI SYLLABLE HNIEP*/
+ RTUNI_ALPHA, /* U+00a170: YI SYLLABLE HNAT*/
+ RTUNI_ALPHA, /* U+00a171: YI SYLLABLE HNAX*/
+ RTUNI_ALPHA, /* U+00a172: YI SYLLABLE HNA*/
+ RTUNI_ALPHA, /* U+00a173: YI SYLLABLE HNAP*/
+ RTUNI_ALPHA, /* U+00a174: YI SYLLABLE HNUOX*/
+ RTUNI_ALPHA, /* U+00a175: YI SYLLABLE HNUO*/
+ RTUNI_ALPHA, /* U+00a176: YI SYLLABLE HNOT*/
+ RTUNI_ALPHA, /* U+00a177: YI SYLLABLE HNOX*/
+ RTUNI_ALPHA, /* U+00a178: YI SYLLABLE HNOP*/
+ RTUNI_ALPHA, /* U+00a179: YI SYLLABLE HNEX*/
+ RTUNI_ALPHA, /* U+00a17a: YI SYLLABLE HNE*/
+ RTUNI_ALPHA, /* U+00a17b: YI SYLLABLE HNEP*/
+ RTUNI_ALPHA, /* U+00a17c: YI SYLLABLE HNUT*/
+ RTUNI_ALPHA, /* U+00a17d: YI SYLLABLE NIT*/
+ RTUNI_ALPHA, /* U+00a17e: YI SYLLABLE NIX*/
+ RTUNI_ALPHA, /* U+00a17f: YI SYLLABLE NI*/
+ RTUNI_ALPHA, /* U+00a180: YI SYLLABLE NIP*/
+ RTUNI_ALPHA, /* U+00a181: YI SYLLABLE NIEX*/
+ RTUNI_ALPHA, /* U+00a182: YI SYLLABLE NIE*/
+ RTUNI_ALPHA, /* U+00a183: YI SYLLABLE NIEP*/
+ RTUNI_ALPHA, /* U+00a184: YI SYLLABLE NAX*/
+ RTUNI_ALPHA, /* U+00a185: YI SYLLABLE NA*/
+ RTUNI_ALPHA, /* U+00a186: YI SYLLABLE NAP*/
+ RTUNI_ALPHA, /* U+00a187: YI SYLLABLE NUOX*/
+ RTUNI_ALPHA, /* U+00a188: YI SYLLABLE NUO*/
+ RTUNI_ALPHA, /* U+00a189: YI SYLLABLE NUOP*/
+ RTUNI_ALPHA, /* U+00a18a: YI SYLLABLE NOT*/
+ RTUNI_ALPHA, /* U+00a18b: YI SYLLABLE NOX*/
+ RTUNI_ALPHA, /* U+00a18c: YI SYLLABLE NO*/
+ RTUNI_ALPHA, /* U+00a18d: YI SYLLABLE NOP*/
+ RTUNI_ALPHA, /* U+00a18e: YI SYLLABLE NEX*/
+ RTUNI_ALPHA, /* U+00a18f: YI SYLLABLE NE*/
+ RTUNI_ALPHA, /* U+00a190: YI SYLLABLE NEP*/
+ RTUNI_ALPHA, /* U+00a191: YI SYLLABLE NUT*/
+ RTUNI_ALPHA, /* U+00a192: YI SYLLABLE NUX*/
+ RTUNI_ALPHA, /* U+00a193: YI SYLLABLE NU*/
+ RTUNI_ALPHA, /* U+00a194: YI SYLLABLE NUP*/
+ RTUNI_ALPHA, /* U+00a195: YI SYLLABLE NURX*/
+ RTUNI_ALPHA, /* U+00a196: YI SYLLABLE NUR*/
+ RTUNI_ALPHA, /* U+00a197: YI SYLLABLE HLIT*/
+ RTUNI_ALPHA, /* U+00a198: YI SYLLABLE HLIX*/
+ RTUNI_ALPHA, /* U+00a199: YI SYLLABLE HLI*/
+ RTUNI_ALPHA, /* U+00a19a: YI SYLLABLE HLIP*/
+ RTUNI_ALPHA, /* U+00a19b: YI SYLLABLE HLIEX*/
+ RTUNI_ALPHA, /* U+00a19c: YI SYLLABLE HLIE*/
+ RTUNI_ALPHA, /* U+00a19d: YI SYLLABLE HLIEP*/
+ RTUNI_ALPHA, /* U+00a19e: YI SYLLABLE HLAT*/
+ RTUNI_ALPHA, /* U+00a19f: YI SYLLABLE HLAX*/
+ RTUNI_ALPHA, /* U+00a1a0: YI SYLLABLE HLA*/
+ RTUNI_ALPHA, /* U+00a1a1: YI SYLLABLE HLAP*/
+ RTUNI_ALPHA, /* U+00a1a2: YI SYLLABLE HLUOX*/
+ RTUNI_ALPHA, /* U+00a1a3: YI SYLLABLE HLUO*/
+ RTUNI_ALPHA, /* U+00a1a4: YI SYLLABLE HLUOP*/
+ RTUNI_ALPHA, /* U+00a1a5: YI SYLLABLE HLOX*/
+ RTUNI_ALPHA, /* U+00a1a6: YI SYLLABLE HLO*/
+ RTUNI_ALPHA, /* U+00a1a7: YI SYLLABLE HLOP*/
+ RTUNI_ALPHA, /* U+00a1a8: YI SYLLABLE HLEX*/
+ RTUNI_ALPHA, /* U+00a1a9: YI SYLLABLE HLE*/
+ RTUNI_ALPHA, /* U+00a1aa: YI SYLLABLE HLEP*/
+ RTUNI_ALPHA, /* U+00a1ab: YI SYLLABLE HLUT*/
+ RTUNI_ALPHA, /* U+00a1ac: YI SYLLABLE HLUX*/
+ RTUNI_ALPHA, /* U+00a1ad: YI SYLLABLE HLU*/
+ RTUNI_ALPHA, /* U+00a1ae: YI SYLLABLE HLUP*/
+ RTUNI_ALPHA, /* U+00a1af: YI SYLLABLE HLURX*/
+ RTUNI_ALPHA, /* U+00a1b0: YI SYLLABLE HLUR*/
+ RTUNI_ALPHA, /* U+00a1b1: YI SYLLABLE HLYT*/
+ RTUNI_ALPHA, /* U+00a1b2: YI SYLLABLE HLYX*/
+ RTUNI_ALPHA, /* U+00a1b3: YI SYLLABLE HLY*/
+ RTUNI_ALPHA, /* U+00a1b4: YI SYLLABLE HLYP*/
+ RTUNI_ALPHA, /* U+00a1b5: YI SYLLABLE HLYRX*/
+ RTUNI_ALPHA, /* U+00a1b6: YI SYLLABLE HLYR*/
+ RTUNI_ALPHA, /* U+00a1b7: YI SYLLABLE LIT*/
+ RTUNI_ALPHA, /* U+00a1b8: YI SYLLABLE LIX*/
+ RTUNI_ALPHA, /* U+00a1b9: YI SYLLABLE LI*/
+ RTUNI_ALPHA, /* U+00a1ba: YI SYLLABLE LIP*/
+ RTUNI_ALPHA, /* U+00a1bb: YI SYLLABLE LIET*/
+ RTUNI_ALPHA, /* U+00a1bc: YI SYLLABLE LIEX*/
+ RTUNI_ALPHA, /* U+00a1bd: YI SYLLABLE LIE*/
+ RTUNI_ALPHA, /* U+00a1be: YI SYLLABLE LIEP*/
+ RTUNI_ALPHA, /* U+00a1bf: YI SYLLABLE LAT*/
+ RTUNI_ALPHA, /* U+00a1c0: YI SYLLABLE LAX*/
+ RTUNI_ALPHA, /* U+00a1c1: YI SYLLABLE LA*/
+ RTUNI_ALPHA, /* U+00a1c2: YI SYLLABLE LAP*/
+ RTUNI_ALPHA, /* U+00a1c3: YI SYLLABLE LUOT*/
+ RTUNI_ALPHA, /* U+00a1c4: YI SYLLABLE LUOX*/
+ RTUNI_ALPHA, /* U+00a1c5: YI SYLLABLE LUO*/
+ RTUNI_ALPHA, /* U+00a1c6: YI SYLLABLE LUOP*/
+ RTUNI_ALPHA, /* U+00a1c7: YI SYLLABLE LOT*/
+ RTUNI_ALPHA, /* U+00a1c8: YI SYLLABLE LOX*/
+ RTUNI_ALPHA, /* U+00a1c9: YI SYLLABLE LO*/
+ RTUNI_ALPHA, /* U+00a1ca: YI SYLLABLE LOP*/
+ RTUNI_ALPHA, /* U+00a1cb: YI SYLLABLE LEX*/
+ RTUNI_ALPHA, /* U+00a1cc: YI SYLLABLE LE*/
+ RTUNI_ALPHA, /* U+00a1cd: YI SYLLABLE LEP*/
+ RTUNI_ALPHA, /* U+00a1ce: YI SYLLABLE LUT*/
+ RTUNI_ALPHA, /* U+00a1cf: YI SYLLABLE LUX*/
+ RTUNI_ALPHA, /* U+00a1d0: YI SYLLABLE LU*/
+ RTUNI_ALPHA, /* U+00a1d1: YI SYLLABLE LUP*/
+ RTUNI_ALPHA, /* U+00a1d2: YI SYLLABLE LURX*/
+ RTUNI_ALPHA, /* U+00a1d3: YI SYLLABLE LUR*/
+ RTUNI_ALPHA, /* U+00a1d4: YI SYLLABLE LYT*/
+ RTUNI_ALPHA, /* U+00a1d5: YI SYLLABLE LYX*/
+ RTUNI_ALPHA, /* U+00a1d6: YI SYLLABLE LY*/
+ RTUNI_ALPHA, /* U+00a1d7: YI SYLLABLE LYP*/
+ RTUNI_ALPHA, /* U+00a1d8: YI SYLLABLE LYRX*/
+ RTUNI_ALPHA, /* U+00a1d9: YI SYLLABLE LYR*/
+ RTUNI_ALPHA, /* U+00a1da: YI SYLLABLE GIT*/
+ RTUNI_ALPHA, /* U+00a1db: YI SYLLABLE GIX*/
+ RTUNI_ALPHA, /* U+00a1dc: YI SYLLABLE GI*/
+ RTUNI_ALPHA, /* U+00a1dd: YI SYLLABLE GIP*/
+ RTUNI_ALPHA, /* U+00a1de: YI SYLLABLE GIET*/
+ RTUNI_ALPHA, /* U+00a1df: YI SYLLABLE GIEX*/
+ RTUNI_ALPHA, /* U+00a1e0: YI SYLLABLE GIE*/
+ RTUNI_ALPHA, /* U+00a1e1: YI SYLLABLE GIEP*/
+ RTUNI_ALPHA, /* U+00a1e2: YI SYLLABLE GAT*/
+ RTUNI_ALPHA, /* U+00a1e3: YI SYLLABLE GAX*/
+ RTUNI_ALPHA, /* U+00a1e4: YI SYLLABLE GA*/
+ RTUNI_ALPHA, /* U+00a1e5: YI SYLLABLE GAP*/
+ RTUNI_ALPHA, /* U+00a1e6: YI SYLLABLE GUOT*/
+ RTUNI_ALPHA, /* U+00a1e7: YI SYLLABLE GUOX*/
+ RTUNI_ALPHA, /* U+00a1e8: YI SYLLABLE GUO*/
+ RTUNI_ALPHA, /* U+00a1e9: YI SYLLABLE GUOP*/
+ RTUNI_ALPHA, /* U+00a1ea: YI SYLLABLE GOT*/
+ RTUNI_ALPHA, /* U+00a1eb: YI SYLLABLE GOX*/
+ RTUNI_ALPHA, /* U+00a1ec: YI SYLLABLE GO*/
+ RTUNI_ALPHA, /* U+00a1ed: YI SYLLABLE GOP*/
+ RTUNI_ALPHA, /* U+00a1ee: YI SYLLABLE GET*/
+ RTUNI_ALPHA, /* U+00a1ef: YI SYLLABLE GEX*/
+ RTUNI_ALPHA, /* U+00a1f0: YI SYLLABLE GE*/
+ RTUNI_ALPHA, /* U+00a1f1: YI SYLLABLE GEP*/
+ RTUNI_ALPHA, /* U+00a1f2: YI SYLLABLE GUT*/
+ RTUNI_ALPHA, /* U+00a1f3: YI SYLLABLE GUX*/
+ RTUNI_ALPHA, /* U+00a1f4: YI SYLLABLE GU*/
+ RTUNI_ALPHA, /* U+00a1f5: YI SYLLABLE GUP*/
+ RTUNI_ALPHA, /* U+00a1f6: YI SYLLABLE GURX*/
+ RTUNI_ALPHA, /* U+00a1f7: YI SYLLABLE GUR*/
+ RTUNI_ALPHA, /* U+00a1f8: YI SYLLABLE KIT*/
+ RTUNI_ALPHA, /* U+00a1f9: YI SYLLABLE KIX*/
+ RTUNI_ALPHA, /* U+00a1fa: YI SYLLABLE KI*/
+ RTUNI_ALPHA, /* U+00a1fb: YI SYLLABLE KIP*/
+ RTUNI_ALPHA, /* U+00a1fc: YI SYLLABLE KIEX*/
+ RTUNI_ALPHA, /* U+00a1fd: YI SYLLABLE KIE*/
+ RTUNI_ALPHA, /* U+00a1fe: YI SYLLABLE KIEP*/
+ RTUNI_ALPHA, /* U+00a1ff: YI SYLLABLE KAT*/
+ RTUNI_ALPHA, /* U+00a200: YI SYLLABLE KAX*/
+ RTUNI_ALPHA, /* U+00a201: YI SYLLABLE KA*/
+ RTUNI_ALPHA, /* U+00a202: YI SYLLABLE KAP*/
+ RTUNI_ALPHA, /* U+00a203: YI SYLLABLE KUOX*/
+ RTUNI_ALPHA, /* U+00a204: YI SYLLABLE KUO*/
+ RTUNI_ALPHA, /* U+00a205: YI SYLLABLE KUOP*/
+ RTUNI_ALPHA, /* U+00a206: YI SYLLABLE KOT*/
+ RTUNI_ALPHA, /* U+00a207: YI SYLLABLE KOX*/
+ RTUNI_ALPHA, /* U+00a208: YI SYLLABLE KO*/
+ RTUNI_ALPHA, /* U+00a209: YI SYLLABLE KOP*/
+ RTUNI_ALPHA, /* U+00a20a: YI SYLLABLE KET*/
+ RTUNI_ALPHA, /* U+00a20b: YI SYLLABLE KEX*/
+ RTUNI_ALPHA, /* U+00a20c: YI SYLLABLE KE*/
+ RTUNI_ALPHA, /* U+00a20d: YI SYLLABLE KEP*/
+ RTUNI_ALPHA, /* U+00a20e: YI SYLLABLE KUT*/
+ RTUNI_ALPHA, /* U+00a20f: YI SYLLABLE KUX*/
+ RTUNI_ALPHA, /* U+00a210: YI SYLLABLE KU*/
+ RTUNI_ALPHA, /* U+00a211: YI SYLLABLE KUP*/
+ RTUNI_ALPHA, /* U+00a212: YI SYLLABLE KURX*/
+ RTUNI_ALPHA, /* U+00a213: YI SYLLABLE KUR*/
+ RTUNI_ALPHA, /* U+00a214: YI SYLLABLE GGIT*/
+ RTUNI_ALPHA, /* U+00a215: YI SYLLABLE GGIX*/
+ RTUNI_ALPHA, /* U+00a216: YI SYLLABLE GGI*/
+ RTUNI_ALPHA, /* U+00a217: YI SYLLABLE GGIEX*/
+ RTUNI_ALPHA, /* U+00a218: YI SYLLABLE GGIE*/
+ RTUNI_ALPHA, /* U+00a219: YI SYLLABLE GGIEP*/
+ RTUNI_ALPHA, /* U+00a21a: YI SYLLABLE GGAT*/
+ RTUNI_ALPHA, /* U+00a21b: YI SYLLABLE GGAX*/
+ RTUNI_ALPHA, /* U+00a21c: YI SYLLABLE GGA*/
+ RTUNI_ALPHA, /* U+00a21d: YI SYLLABLE GGAP*/
+ RTUNI_ALPHA, /* U+00a21e: YI SYLLABLE GGUOT*/
+ RTUNI_ALPHA, /* U+00a21f: YI SYLLABLE GGUOX*/
+ RTUNI_ALPHA, /* U+00a220: YI SYLLABLE GGUO*/
+ RTUNI_ALPHA, /* U+00a221: YI SYLLABLE GGUOP*/
+ RTUNI_ALPHA, /* U+00a222: YI SYLLABLE GGOT*/
+ RTUNI_ALPHA, /* U+00a223: YI SYLLABLE GGOX*/
+ RTUNI_ALPHA, /* U+00a224: YI SYLLABLE GGO*/
+ RTUNI_ALPHA, /* U+00a225: YI SYLLABLE GGOP*/
+ RTUNI_ALPHA, /* U+00a226: YI SYLLABLE GGET*/
+ RTUNI_ALPHA, /* U+00a227: YI SYLLABLE GGEX*/
+ RTUNI_ALPHA, /* U+00a228: YI SYLLABLE GGE*/
+ RTUNI_ALPHA, /* U+00a229: YI SYLLABLE GGEP*/
+ RTUNI_ALPHA, /* U+00a22a: YI SYLLABLE GGUT*/
+ RTUNI_ALPHA, /* U+00a22b: YI SYLLABLE GGUX*/
+ RTUNI_ALPHA, /* U+00a22c: YI SYLLABLE GGU*/
+ RTUNI_ALPHA, /* U+00a22d: YI SYLLABLE GGUP*/
+ RTUNI_ALPHA, /* U+00a22e: YI SYLLABLE GGURX*/
+ RTUNI_ALPHA, /* U+00a22f: YI SYLLABLE GGUR*/
+ RTUNI_ALPHA, /* U+00a230: YI SYLLABLE MGIEX*/
+ RTUNI_ALPHA, /* U+00a231: YI SYLLABLE MGIE*/
+ RTUNI_ALPHA, /* U+00a232: YI SYLLABLE MGAT*/
+ RTUNI_ALPHA, /* U+00a233: YI SYLLABLE MGAX*/
+ RTUNI_ALPHA, /* U+00a234: YI SYLLABLE MGA*/
+ RTUNI_ALPHA, /* U+00a235: YI SYLLABLE MGAP*/
+ RTUNI_ALPHA, /* U+00a236: YI SYLLABLE MGUOX*/
+ RTUNI_ALPHA, /* U+00a237: YI SYLLABLE MGUO*/
+ RTUNI_ALPHA, /* U+00a238: YI SYLLABLE MGUOP*/
+ RTUNI_ALPHA, /* U+00a239: YI SYLLABLE MGOT*/
+ RTUNI_ALPHA, /* U+00a23a: YI SYLLABLE MGOX*/
+ RTUNI_ALPHA, /* U+00a23b: YI SYLLABLE MGO*/
+ RTUNI_ALPHA, /* U+00a23c: YI SYLLABLE MGOP*/
+ RTUNI_ALPHA, /* U+00a23d: YI SYLLABLE MGEX*/
+ RTUNI_ALPHA, /* U+00a23e: YI SYLLABLE MGE*/
+ RTUNI_ALPHA, /* U+00a23f: YI SYLLABLE MGEP*/
+ RTUNI_ALPHA, /* U+00a240: YI SYLLABLE MGUT*/
+ RTUNI_ALPHA, /* U+00a241: YI SYLLABLE MGUX*/
+ RTUNI_ALPHA, /* U+00a242: YI SYLLABLE MGU*/
+ RTUNI_ALPHA, /* U+00a243: YI SYLLABLE MGUP*/
+ RTUNI_ALPHA, /* U+00a244: YI SYLLABLE MGURX*/
+ RTUNI_ALPHA, /* U+00a245: YI SYLLABLE MGUR*/
+ RTUNI_ALPHA, /* U+00a246: YI SYLLABLE HXIT*/
+ RTUNI_ALPHA, /* U+00a247: YI SYLLABLE HXIX*/
+ RTUNI_ALPHA, /* U+00a248: YI SYLLABLE HXI*/
+ RTUNI_ALPHA, /* U+00a249: YI SYLLABLE HXIP*/
+ RTUNI_ALPHA, /* U+00a24a: YI SYLLABLE HXIET*/
+ RTUNI_ALPHA, /* U+00a24b: YI SYLLABLE HXIEX*/
+ RTUNI_ALPHA, /* U+00a24c: YI SYLLABLE HXIE*/
+ RTUNI_ALPHA, /* U+00a24d: YI SYLLABLE HXIEP*/
+ RTUNI_ALPHA, /* U+00a24e: YI SYLLABLE HXAT*/
+ RTUNI_ALPHA, /* U+00a24f: YI SYLLABLE HXAX*/
+ RTUNI_ALPHA, /* U+00a250: YI SYLLABLE HXA*/
+ RTUNI_ALPHA, /* U+00a251: YI SYLLABLE HXAP*/
+ RTUNI_ALPHA, /* U+00a252: YI SYLLABLE HXUOT*/
+ RTUNI_ALPHA, /* U+00a253: YI SYLLABLE HXUOX*/
+ RTUNI_ALPHA, /* U+00a254: YI SYLLABLE HXUO*/
+ RTUNI_ALPHA, /* U+00a255: YI SYLLABLE HXUOP*/
+ RTUNI_ALPHA, /* U+00a256: YI SYLLABLE HXOT*/
+ RTUNI_ALPHA, /* U+00a257: YI SYLLABLE HXOX*/
+ RTUNI_ALPHA, /* U+00a258: YI SYLLABLE HXO*/
+ RTUNI_ALPHA, /* U+00a259: YI SYLLABLE HXOP*/
+ RTUNI_ALPHA, /* U+00a25a: YI SYLLABLE HXEX*/
+ RTUNI_ALPHA, /* U+00a25b: YI SYLLABLE HXE*/
+ RTUNI_ALPHA, /* U+00a25c: YI SYLLABLE HXEP*/
+ RTUNI_ALPHA, /* U+00a25d: YI SYLLABLE NGIEX*/
+ RTUNI_ALPHA, /* U+00a25e: YI SYLLABLE NGIE*/
+ RTUNI_ALPHA, /* U+00a25f: YI SYLLABLE NGIEP*/
+ RTUNI_ALPHA, /* U+00a260: YI SYLLABLE NGAT*/
+ RTUNI_ALPHA, /* U+00a261: YI SYLLABLE NGAX*/
+ RTUNI_ALPHA, /* U+00a262: YI SYLLABLE NGA*/
+ RTUNI_ALPHA, /* U+00a263: YI SYLLABLE NGAP*/
+ RTUNI_ALPHA, /* U+00a264: YI SYLLABLE NGUOT*/
+ RTUNI_ALPHA, /* U+00a265: YI SYLLABLE NGUOX*/
+ RTUNI_ALPHA, /* U+00a266: YI SYLLABLE NGUO*/
+ RTUNI_ALPHA, /* U+00a267: YI SYLLABLE NGOT*/
+ RTUNI_ALPHA, /* U+00a268: YI SYLLABLE NGOX*/
+ RTUNI_ALPHA, /* U+00a269: YI SYLLABLE NGO*/
+ RTUNI_ALPHA, /* U+00a26a: YI SYLLABLE NGOP*/
+ RTUNI_ALPHA, /* U+00a26b: YI SYLLABLE NGEX*/
+ RTUNI_ALPHA, /* U+00a26c: YI SYLLABLE NGE*/
+ RTUNI_ALPHA, /* U+00a26d: YI SYLLABLE NGEP*/
+ RTUNI_ALPHA, /* U+00a26e: YI SYLLABLE HIT*/
+ RTUNI_ALPHA, /* U+00a26f: YI SYLLABLE HIEX*/
+ RTUNI_ALPHA, /* U+00a270: YI SYLLABLE HIE*/
+ RTUNI_ALPHA, /* U+00a271: YI SYLLABLE HAT*/
+ RTUNI_ALPHA, /* U+00a272: YI SYLLABLE HAX*/
+ RTUNI_ALPHA, /* U+00a273: YI SYLLABLE HA*/
+ RTUNI_ALPHA, /* U+00a274: YI SYLLABLE HAP*/
+ RTUNI_ALPHA, /* U+00a275: YI SYLLABLE HUOT*/
+ RTUNI_ALPHA, /* U+00a276: YI SYLLABLE HUOX*/
+ RTUNI_ALPHA, /* U+00a277: YI SYLLABLE HUO*/
+ RTUNI_ALPHA, /* U+00a278: YI SYLLABLE HUOP*/
+ RTUNI_ALPHA, /* U+00a279: YI SYLLABLE HOT*/
+ RTUNI_ALPHA, /* U+00a27a: YI SYLLABLE HOX*/
+ RTUNI_ALPHA, /* U+00a27b: YI SYLLABLE HO*/
+ RTUNI_ALPHA, /* U+00a27c: YI SYLLABLE HOP*/
+ RTUNI_ALPHA, /* U+00a27d: YI SYLLABLE HEX*/
+ RTUNI_ALPHA, /* U+00a27e: YI SYLLABLE HE*/
+ RTUNI_ALPHA, /* U+00a27f: YI SYLLABLE HEP*/
+ RTUNI_ALPHA, /* U+00a280: YI SYLLABLE WAT*/
+ RTUNI_ALPHA, /* U+00a281: YI SYLLABLE WAX*/
+ RTUNI_ALPHA, /* U+00a282: YI SYLLABLE WA*/
+ RTUNI_ALPHA, /* U+00a283: YI SYLLABLE WAP*/
+ RTUNI_ALPHA, /* U+00a284: YI SYLLABLE WUOX*/
+ RTUNI_ALPHA, /* U+00a285: YI SYLLABLE WUO*/
+ RTUNI_ALPHA, /* U+00a286: YI SYLLABLE WUOP*/
+ RTUNI_ALPHA, /* U+00a287: YI SYLLABLE WOX*/
+ RTUNI_ALPHA, /* U+00a288: YI SYLLABLE WO*/
+ RTUNI_ALPHA, /* U+00a289: YI SYLLABLE WOP*/
+ RTUNI_ALPHA, /* U+00a28a: YI SYLLABLE WEX*/
+ RTUNI_ALPHA, /* U+00a28b: YI SYLLABLE WE*/
+ RTUNI_ALPHA, /* U+00a28c: YI SYLLABLE WEP*/
+ RTUNI_ALPHA, /* U+00a28d: YI SYLLABLE ZIT*/
+ RTUNI_ALPHA, /* U+00a28e: YI SYLLABLE ZIX*/
+ RTUNI_ALPHA, /* U+00a28f: YI SYLLABLE ZI*/
+ RTUNI_ALPHA, /* U+00a290: YI SYLLABLE ZIP*/
+ RTUNI_ALPHA, /* U+00a291: YI SYLLABLE ZIEX*/
+ RTUNI_ALPHA, /* U+00a292: YI SYLLABLE ZIE*/
+ RTUNI_ALPHA, /* U+00a293: YI SYLLABLE ZIEP*/
+ RTUNI_ALPHA, /* U+00a294: YI SYLLABLE ZAT*/
+ RTUNI_ALPHA, /* U+00a295: YI SYLLABLE ZAX*/
+ RTUNI_ALPHA, /* U+00a296: YI SYLLABLE ZA*/
+ RTUNI_ALPHA, /* U+00a297: YI SYLLABLE ZAP*/
+ RTUNI_ALPHA, /* U+00a298: YI SYLLABLE ZUOX*/
+ RTUNI_ALPHA, /* U+00a299: YI SYLLABLE ZUO*/
+ RTUNI_ALPHA, /* U+00a29a: YI SYLLABLE ZUOP*/
+ RTUNI_ALPHA, /* U+00a29b: YI SYLLABLE ZOT*/
+ RTUNI_ALPHA, /* U+00a29c: YI SYLLABLE ZOX*/
+ RTUNI_ALPHA, /* U+00a29d: YI SYLLABLE ZO*/
+ RTUNI_ALPHA, /* U+00a29e: YI SYLLABLE ZOP*/
+ RTUNI_ALPHA, /* U+00a29f: YI SYLLABLE ZEX*/
+ RTUNI_ALPHA, /* U+00a2a0: YI SYLLABLE ZE*/
+ RTUNI_ALPHA, /* U+00a2a1: YI SYLLABLE ZEP*/
+ RTUNI_ALPHA, /* U+00a2a2: YI SYLLABLE ZUT*/
+ RTUNI_ALPHA, /* U+00a2a3: YI SYLLABLE ZUX*/
+ RTUNI_ALPHA, /* U+00a2a4: YI SYLLABLE ZU*/
+ RTUNI_ALPHA, /* U+00a2a5: YI SYLLABLE ZUP*/
+ RTUNI_ALPHA, /* U+00a2a6: YI SYLLABLE ZURX*/
+ RTUNI_ALPHA, /* U+00a2a7: YI SYLLABLE ZUR*/
+ RTUNI_ALPHA, /* U+00a2a8: YI SYLLABLE ZYT*/
+ RTUNI_ALPHA, /* U+00a2a9: YI SYLLABLE ZYX*/
+ RTUNI_ALPHA, /* U+00a2aa: YI SYLLABLE ZY*/
+ RTUNI_ALPHA, /* U+00a2ab: YI SYLLABLE ZYP*/
+ RTUNI_ALPHA, /* U+00a2ac: YI SYLLABLE ZYRX*/
+ RTUNI_ALPHA, /* U+00a2ad: YI SYLLABLE ZYR*/
+ RTUNI_ALPHA, /* U+00a2ae: YI SYLLABLE CIT*/
+ RTUNI_ALPHA, /* U+00a2af: YI SYLLABLE CIX*/
+ RTUNI_ALPHA, /* U+00a2b0: YI SYLLABLE CI*/
+ RTUNI_ALPHA, /* U+00a2b1: YI SYLLABLE CIP*/
+ RTUNI_ALPHA, /* U+00a2b2: YI SYLLABLE CIET*/
+ RTUNI_ALPHA, /* U+00a2b3: YI SYLLABLE CIEX*/
+ RTUNI_ALPHA, /* U+00a2b4: YI SYLLABLE CIE*/
+ RTUNI_ALPHA, /* U+00a2b5: YI SYLLABLE CIEP*/
+ RTUNI_ALPHA, /* U+00a2b6: YI SYLLABLE CAT*/
+ RTUNI_ALPHA, /* U+00a2b7: YI SYLLABLE CAX*/
+ RTUNI_ALPHA, /* U+00a2b8: YI SYLLABLE CA*/
+ RTUNI_ALPHA, /* U+00a2b9: YI SYLLABLE CAP*/
+ RTUNI_ALPHA, /* U+00a2ba: YI SYLLABLE CUOX*/
+ RTUNI_ALPHA, /* U+00a2bb: YI SYLLABLE CUO*/
+ RTUNI_ALPHA, /* U+00a2bc: YI SYLLABLE CUOP*/
+ RTUNI_ALPHA, /* U+00a2bd: YI SYLLABLE COT*/
+ RTUNI_ALPHA, /* U+00a2be: YI SYLLABLE COX*/
+ RTUNI_ALPHA, /* U+00a2bf: YI SYLLABLE CO*/
+ RTUNI_ALPHA, /* U+00a2c0: YI SYLLABLE COP*/
+ RTUNI_ALPHA, /* U+00a2c1: YI SYLLABLE CEX*/
+ RTUNI_ALPHA, /* U+00a2c2: YI SYLLABLE CE*/
+ RTUNI_ALPHA, /* U+00a2c3: YI SYLLABLE CEP*/
+ RTUNI_ALPHA, /* U+00a2c4: YI SYLLABLE CUT*/
+ RTUNI_ALPHA, /* U+00a2c5: YI SYLLABLE CUX*/
+ RTUNI_ALPHA, /* U+00a2c6: YI SYLLABLE CU*/
+ RTUNI_ALPHA, /* U+00a2c7: YI SYLLABLE CUP*/
+ RTUNI_ALPHA, /* U+00a2c8: YI SYLLABLE CURX*/
+ RTUNI_ALPHA, /* U+00a2c9: YI SYLLABLE CUR*/
+ RTUNI_ALPHA, /* U+00a2ca: YI SYLLABLE CYT*/
+ RTUNI_ALPHA, /* U+00a2cb: YI SYLLABLE CYX*/
+ RTUNI_ALPHA, /* U+00a2cc: YI SYLLABLE CY*/
+ RTUNI_ALPHA, /* U+00a2cd: YI SYLLABLE CYP*/
+ RTUNI_ALPHA, /* U+00a2ce: YI SYLLABLE CYRX*/
+ RTUNI_ALPHA, /* U+00a2cf: YI SYLLABLE CYR*/
+ RTUNI_ALPHA, /* U+00a2d0: YI SYLLABLE ZZIT*/
+ RTUNI_ALPHA, /* U+00a2d1: YI SYLLABLE ZZIX*/
+ RTUNI_ALPHA, /* U+00a2d2: YI SYLLABLE ZZI*/
+ RTUNI_ALPHA, /* U+00a2d3: YI SYLLABLE ZZIP*/
+ RTUNI_ALPHA, /* U+00a2d4: YI SYLLABLE ZZIET*/
+ RTUNI_ALPHA, /* U+00a2d5: YI SYLLABLE ZZIEX*/
+ RTUNI_ALPHA, /* U+00a2d6: YI SYLLABLE ZZIE*/
+ RTUNI_ALPHA, /* U+00a2d7: YI SYLLABLE ZZIEP*/
+ RTUNI_ALPHA, /* U+00a2d8: YI SYLLABLE ZZAT*/
+ RTUNI_ALPHA, /* U+00a2d9: YI SYLLABLE ZZAX*/
+ RTUNI_ALPHA, /* U+00a2da: YI SYLLABLE ZZA*/
+ RTUNI_ALPHA, /* U+00a2db: YI SYLLABLE ZZAP*/
+ RTUNI_ALPHA, /* U+00a2dc: YI SYLLABLE ZZOX*/
+ RTUNI_ALPHA, /* U+00a2dd: YI SYLLABLE ZZO*/
+ RTUNI_ALPHA, /* U+00a2de: YI SYLLABLE ZZOP*/
+ RTUNI_ALPHA, /* U+00a2df: YI SYLLABLE ZZEX*/
+ RTUNI_ALPHA, /* U+00a2e0: YI SYLLABLE ZZE*/
+ RTUNI_ALPHA, /* U+00a2e1: YI SYLLABLE ZZEP*/
+ RTUNI_ALPHA, /* U+00a2e2: YI SYLLABLE ZZUX*/
+ RTUNI_ALPHA, /* U+00a2e3: YI SYLLABLE ZZU*/
+ RTUNI_ALPHA, /* U+00a2e4: YI SYLLABLE ZZUP*/
+ RTUNI_ALPHA, /* U+00a2e5: YI SYLLABLE ZZURX*/
+ RTUNI_ALPHA, /* U+00a2e6: YI SYLLABLE ZZUR*/
+ RTUNI_ALPHA, /* U+00a2e7: YI SYLLABLE ZZYT*/
+ RTUNI_ALPHA, /* U+00a2e8: YI SYLLABLE ZZYX*/
+ RTUNI_ALPHA, /* U+00a2e9: YI SYLLABLE ZZY*/
+ RTUNI_ALPHA, /* U+00a2ea: YI SYLLABLE ZZYP*/
+ RTUNI_ALPHA, /* U+00a2eb: YI SYLLABLE ZZYRX*/
+ RTUNI_ALPHA, /* U+00a2ec: YI SYLLABLE ZZYR*/
+ RTUNI_ALPHA, /* U+00a2ed: YI SYLLABLE NZIT*/
+ RTUNI_ALPHA, /* U+00a2ee: YI SYLLABLE NZIX*/
+ RTUNI_ALPHA, /* U+00a2ef: YI SYLLABLE NZI*/
+ RTUNI_ALPHA, /* U+00a2f0: YI SYLLABLE NZIP*/
+ RTUNI_ALPHA, /* U+00a2f1: YI SYLLABLE NZIEX*/
+ RTUNI_ALPHA, /* U+00a2f2: YI SYLLABLE NZIE*/
+ RTUNI_ALPHA, /* U+00a2f3: YI SYLLABLE NZIEP*/
+ RTUNI_ALPHA, /* U+00a2f4: YI SYLLABLE NZAT*/
+ RTUNI_ALPHA, /* U+00a2f5: YI SYLLABLE NZAX*/
+ RTUNI_ALPHA, /* U+00a2f6: YI SYLLABLE NZA*/
+ RTUNI_ALPHA, /* U+00a2f7: YI SYLLABLE NZAP*/
+ RTUNI_ALPHA, /* U+00a2f8: YI SYLLABLE NZUOX*/
+ RTUNI_ALPHA, /* U+00a2f9: YI SYLLABLE NZUO*/
+ RTUNI_ALPHA, /* U+00a2fa: YI SYLLABLE NZOX*/
+ RTUNI_ALPHA, /* U+00a2fb: YI SYLLABLE NZOP*/
+ RTUNI_ALPHA, /* U+00a2fc: YI SYLLABLE NZEX*/
+ RTUNI_ALPHA, /* U+00a2fd: YI SYLLABLE NZE*/
+ RTUNI_ALPHA, /* U+00a2fe: YI SYLLABLE NZUX*/
+ RTUNI_ALPHA, /* U+00a2ff: YI SYLLABLE NZU*/
+ RTUNI_ALPHA, /* U+00a300: YI SYLLABLE NZUP*/
+ RTUNI_ALPHA, /* U+00a301: YI SYLLABLE NZURX*/
+ RTUNI_ALPHA, /* U+00a302: YI SYLLABLE NZUR*/
+ RTUNI_ALPHA, /* U+00a303: YI SYLLABLE NZYT*/
+ RTUNI_ALPHA, /* U+00a304: YI SYLLABLE NZYX*/
+ RTUNI_ALPHA, /* U+00a305: YI SYLLABLE NZY*/
+ RTUNI_ALPHA, /* U+00a306: YI SYLLABLE NZYP*/
+ RTUNI_ALPHA, /* U+00a307: YI SYLLABLE NZYRX*/
+ RTUNI_ALPHA, /* U+00a308: YI SYLLABLE NZYR*/
+ RTUNI_ALPHA, /* U+00a309: YI SYLLABLE SIT*/
+ RTUNI_ALPHA, /* U+00a30a: YI SYLLABLE SIX*/
+ RTUNI_ALPHA, /* U+00a30b: YI SYLLABLE SI*/
+ RTUNI_ALPHA, /* U+00a30c: YI SYLLABLE SIP*/
+ RTUNI_ALPHA, /* U+00a30d: YI SYLLABLE SIEX*/
+ RTUNI_ALPHA, /* U+00a30e: YI SYLLABLE SIE*/
+ RTUNI_ALPHA, /* U+00a30f: YI SYLLABLE SIEP*/
+ RTUNI_ALPHA, /* U+00a310: YI SYLLABLE SAT*/
+ RTUNI_ALPHA, /* U+00a311: YI SYLLABLE SAX*/
+ RTUNI_ALPHA, /* U+00a312: YI SYLLABLE SA*/
+ RTUNI_ALPHA, /* U+00a313: YI SYLLABLE SAP*/
+ RTUNI_ALPHA, /* U+00a314: YI SYLLABLE SUOX*/
+ RTUNI_ALPHA, /* U+00a315: YI SYLLABLE SUO*/
+ RTUNI_ALPHA, /* U+00a316: YI SYLLABLE SUOP*/
+ RTUNI_ALPHA, /* U+00a317: YI SYLLABLE SOT*/
+ RTUNI_ALPHA, /* U+00a318: YI SYLLABLE SOX*/
+ RTUNI_ALPHA, /* U+00a319: YI SYLLABLE SO*/
+ RTUNI_ALPHA, /* U+00a31a: YI SYLLABLE SOP*/
+ RTUNI_ALPHA, /* U+00a31b: YI SYLLABLE SEX*/
+ RTUNI_ALPHA, /* U+00a31c: YI SYLLABLE SE*/
+ RTUNI_ALPHA, /* U+00a31d: YI SYLLABLE SEP*/
+ RTUNI_ALPHA, /* U+00a31e: YI SYLLABLE SUT*/
+ RTUNI_ALPHA, /* U+00a31f: YI SYLLABLE SUX*/
+ RTUNI_ALPHA, /* U+00a320: YI SYLLABLE SU*/
+ RTUNI_ALPHA, /* U+00a321: YI SYLLABLE SUP*/
+ RTUNI_ALPHA, /* U+00a322: YI SYLLABLE SURX*/
+ RTUNI_ALPHA, /* U+00a323: YI SYLLABLE SUR*/
+ RTUNI_ALPHA, /* U+00a324: YI SYLLABLE SYT*/
+ RTUNI_ALPHA, /* U+00a325: YI SYLLABLE SYX*/
+ RTUNI_ALPHA, /* U+00a326: YI SYLLABLE SY*/
+ RTUNI_ALPHA, /* U+00a327: YI SYLLABLE SYP*/
+ RTUNI_ALPHA, /* U+00a328: YI SYLLABLE SYRX*/
+ RTUNI_ALPHA, /* U+00a329: YI SYLLABLE SYR*/
+ RTUNI_ALPHA, /* U+00a32a: YI SYLLABLE SSIT*/
+ RTUNI_ALPHA, /* U+00a32b: YI SYLLABLE SSIX*/
+ RTUNI_ALPHA, /* U+00a32c: YI SYLLABLE SSI*/
+ RTUNI_ALPHA, /* U+00a32d: YI SYLLABLE SSIP*/
+ RTUNI_ALPHA, /* U+00a32e: YI SYLLABLE SSIEX*/
+ RTUNI_ALPHA, /* U+00a32f: YI SYLLABLE SSIE*/
+ RTUNI_ALPHA, /* U+00a330: YI SYLLABLE SSIEP*/
+ RTUNI_ALPHA, /* U+00a331: YI SYLLABLE SSAT*/
+ RTUNI_ALPHA, /* U+00a332: YI SYLLABLE SSAX*/
+ RTUNI_ALPHA, /* U+00a333: YI SYLLABLE SSA*/
+ RTUNI_ALPHA, /* U+00a334: YI SYLLABLE SSAP*/
+ RTUNI_ALPHA, /* U+00a335: YI SYLLABLE SSOT*/
+ RTUNI_ALPHA, /* U+00a336: YI SYLLABLE SSOX*/
+ RTUNI_ALPHA, /* U+00a337: YI SYLLABLE SSO*/
+ RTUNI_ALPHA, /* U+00a338: YI SYLLABLE SSOP*/
+ RTUNI_ALPHA, /* U+00a339: YI SYLLABLE SSEX*/
+ RTUNI_ALPHA, /* U+00a33a: YI SYLLABLE SSE*/
+ RTUNI_ALPHA, /* U+00a33b: YI SYLLABLE SSEP*/
+ RTUNI_ALPHA, /* U+00a33c: YI SYLLABLE SSUT*/
+ RTUNI_ALPHA, /* U+00a33d: YI SYLLABLE SSUX*/
+ RTUNI_ALPHA, /* U+00a33e: YI SYLLABLE SSU*/
+ RTUNI_ALPHA, /* U+00a33f: YI SYLLABLE SSUP*/
+ RTUNI_ALPHA, /* U+00a340: YI SYLLABLE SSYT*/
+ RTUNI_ALPHA, /* U+00a341: YI SYLLABLE SSYX*/
+ RTUNI_ALPHA, /* U+00a342: YI SYLLABLE SSY*/
+ RTUNI_ALPHA, /* U+00a343: YI SYLLABLE SSYP*/
+ RTUNI_ALPHA, /* U+00a344: YI SYLLABLE SSYRX*/
+ RTUNI_ALPHA, /* U+00a345: YI SYLLABLE SSYR*/
+ RTUNI_ALPHA, /* U+00a346: YI SYLLABLE ZHAT*/
+ RTUNI_ALPHA, /* U+00a347: YI SYLLABLE ZHAX*/
+ RTUNI_ALPHA, /* U+00a348: YI SYLLABLE ZHA*/
+ RTUNI_ALPHA, /* U+00a349: YI SYLLABLE ZHAP*/
+ RTUNI_ALPHA, /* U+00a34a: YI SYLLABLE ZHUOX*/
+ RTUNI_ALPHA, /* U+00a34b: YI SYLLABLE ZHUO*/
+ RTUNI_ALPHA, /* U+00a34c: YI SYLLABLE ZHUOP*/
+ RTUNI_ALPHA, /* U+00a34d: YI SYLLABLE ZHOT*/
+ RTUNI_ALPHA, /* U+00a34e: YI SYLLABLE ZHOX*/
+ RTUNI_ALPHA, /* U+00a34f: YI SYLLABLE ZHO*/
+ RTUNI_ALPHA, /* U+00a350: YI SYLLABLE ZHOP*/
+ RTUNI_ALPHA, /* U+00a351: YI SYLLABLE ZHET*/
+ RTUNI_ALPHA, /* U+00a352: YI SYLLABLE ZHEX*/
+ RTUNI_ALPHA, /* U+00a353: YI SYLLABLE ZHE*/
+ RTUNI_ALPHA, /* U+00a354: YI SYLLABLE ZHEP*/
+ RTUNI_ALPHA, /* U+00a355: YI SYLLABLE ZHUT*/
+ RTUNI_ALPHA, /* U+00a356: YI SYLLABLE ZHUX*/
+ RTUNI_ALPHA, /* U+00a357: YI SYLLABLE ZHU*/
+ RTUNI_ALPHA, /* U+00a358: YI SYLLABLE ZHUP*/
+ RTUNI_ALPHA, /* U+00a359: YI SYLLABLE ZHURX*/
+ RTUNI_ALPHA, /* U+00a35a: YI SYLLABLE ZHUR*/
+ RTUNI_ALPHA, /* U+00a35b: YI SYLLABLE ZHYT*/
+ RTUNI_ALPHA, /* U+00a35c: YI SYLLABLE ZHYX*/
+ RTUNI_ALPHA, /* U+00a35d: YI SYLLABLE ZHY*/
+ RTUNI_ALPHA, /* U+00a35e: YI SYLLABLE ZHYP*/
+ RTUNI_ALPHA, /* U+00a35f: YI SYLLABLE ZHYRX*/
+ RTUNI_ALPHA, /* U+00a360: YI SYLLABLE ZHYR*/
+ RTUNI_ALPHA, /* U+00a361: YI SYLLABLE CHAT*/
+ RTUNI_ALPHA, /* U+00a362: YI SYLLABLE CHAX*/
+ RTUNI_ALPHA, /* U+00a363: YI SYLLABLE CHA*/
+ RTUNI_ALPHA, /* U+00a364: YI SYLLABLE CHAP*/
+ RTUNI_ALPHA, /* U+00a365: YI SYLLABLE CHUOT*/
+ RTUNI_ALPHA, /* U+00a366: YI SYLLABLE CHUOX*/
+ RTUNI_ALPHA, /* U+00a367: YI SYLLABLE CHUO*/
+ RTUNI_ALPHA, /* U+00a368: YI SYLLABLE CHUOP*/
+ RTUNI_ALPHA, /* U+00a369: YI SYLLABLE CHOT*/
+ RTUNI_ALPHA, /* U+00a36a: YI SYLLABLE CHOX*/
+ RTUNI_ALPHA, /* U+00a36b: YI SYLLABLE CHO*/
+ RTUNI_ALPHA, /* U+00a36c: YI SYLLABLE CHOP*/
+ RTUNI_ALPHA, /* U+00a36d: YI SYLLABLE CHET*/
+ RTUNI_ALPHA, /* U+00a36e: YI SYLLABLE CHEX*/
+ RTUNI_ALPHA, /* U+00a36f: YI SYLLABLE CHE*/
+ RTUNI_ALPHA, /* U+00a370: YI SYLLABLE CHEP*/
+ RTUNI_ALPHA, /* U+00a371: YI SYLLABLE CHUX*/
+ RTUNI_ALPHA, /* U+00a372: YI SYLLABLE CHU*/
+ RTUNI_ALPHA, /* U+00a373: YI SYLLABLE CHUP*/
+ RTUNI_ALPHA, /* U+00a374: YI SYLLABLE CHURX*/
+ RTUNI_ALPHA, /* U+00a375: YI SYLLABLE CHUR*/
+ RTUNI_ALPHA, /* U+00a376: YI SYLLABLE CHYT*/
+ RTUNI_ALPHA, /* U+00a377: YI SYLLABLE CHYX*/
+ RTUNI_ALPHA, /* U+00a378: YI SYLLABLE CHY*/
+ RTUNI_ALPHA, /* U+00a379: YI SYLLABLE CHYP*/
+ RTUNI_ALPHA, /* U+00a37a: YI SYLLABLE CHYRX*/
+ RTUNI_ALPHA, /* U+00a37b: YI SYLLABLE CHYR*/
+ RTUNI_ALPHA, /* U+00a37c: YI SYLLABLE RRAX*/
+ RTUNI_ALPHA, /* U+00a37d: YI SYLLABLE RRA*/
+ RTUNI_ALPHA, /* U+00a37e: YI SYLLABLE RRUOX*/
+ RTUNI_ALPHA, /* U+00a37f: YI SYLLABLE RRUO*/
+ RTUNI_ALPHA, /* U+00a380: YI SYLLABLE RROT*/
+ RTUNI_ALPHA, /* U+00a381: YI SYLLABLE RROX*/
+ RTUNI_ALPHA, /* U+00a382: YI SYLLABLE RRO*/
+ RTUNI_ALPHA, /* U+00a383: YI SYLLABLE RROP*/
+ RTUNI_ALPHA, /* U+00a384: YI SYLLABLE RRET*/
+ RTUNI_ALPHA, /* U+00a385: YI SYLLABLE RREX*/
+ RTUNI_ALPHA, /* U+00a386: YI SYLLABLE RRE*/
+ RTUNI_ALPHA, /* U+00a387: YI SYLLABLE RREP*/
+ RTUNI_ALPHA, /* U+00a388: YI SYLLABLE RRUT*/
+ RTUNI_ALPHA, /* U+00a389: YI SYLLABLE RRUX*/
+ RTUNI_ALPHA, /* U+00a38a: YI SYLLABLE RRU*/
+ RTUNI_ALPHA, /* U+00a38b: YI SYLLABLE RRUP*/
+ RTUNI_ALPHA, /* U+00a38c: YI SYLLABLE RRURX*/
+ RTUNI_ALPHA, /* U+00a38d: YI SYLLABLE RRUR*/
+ RTUNI_ALPHA, /* U+00a38e: YI SYLLABLE RRYT*/
+ RTUNI_ALPHA, /* U+00a38f: YI SYLLABLE RRYX*/
+ RTUNI_ALPHA, /* U+00a390: YI SYLLABLE RRY*/
+ RTUNI_ALPHA, /* U+00a391: YI SYLLABLE RRYP*/
+ RTUNI_ALPHA, /* U+00a392: YI SYLLABLE RRYRX*/
+ RTUNI_ALPHA, /* U+00a393: YI SYLLABLE RRYR*/
+ RTUNI_ALPHA, /* U+00a394: YI SYLLABLE NRAT*/
+ RTUNI_ALPHA, /* U+00a395: YI SYLLABLE NRAX*/
+ RTUNI_ALPHA, /* U+00a396: YI SYLLABLE NRA*/
+ RTUNI_ALPHA, /* U+00a397: YI SYLLABLE NRAP*/
+ RTUNI_ALPHA, /* U+00a398: YI SYLLABLE NROX*/
+ RTUNI_ALPHA, /* U+00a399: YI SYLLABLE NRO*/
+ RTUNI_ALPHA, /* U+00a39a: YI SYLLABLE NROP*/
+ RTUNI_ALPHA, /* U+00a39b: YI SYLLABLE NRET*/
+ RTUNI_ALPHA, /* U+00a39c: YI SYLLABLE NREX*/
+ RTUNI_ALPHA, /* U+00a39d: YI SYLLABLE NRE*/
+ RTUNI_ALPHA, /* U+00a39e: YI SYLLABLE NREP*/
+ RTUNI_ALPHA, /* U+00a39f: YI SYLLABLE NRUT*/
+ RTUNI_ALPHA, /* U+00a3a0: YI SYLLABLE NRUX*/
+ RTUNI_ALPHA, /* U+00a3a1: YI SYLLABLE NRU*/
+ RTUNI_ALPHA, /* U+00a3a2: YI SYLLABLE NRUP*/
+ RTUNI_ALPHA, /* U+00a3a3: YI SYLLABLE NRURX*/
+ RTUNI_ALPHA, /* U+00a3a4: YI SYLLABLE NRUR*/
+ RTUNI_ALPHA, /* U+00a3a5: YI SYLLABLE NRYT*/
+ RTUNI_ALPHA, /* U+00a3a6: YI SYLLABLE NRYX*/
+ RTUNI_ALPHA, /* U+00a3a7: YI SYLLABLE NRY*/
+ RTUNI_ALPHA, /* U+00a3a8: YI SYLLABLE NRYP*/
+ RTUNI_ALPHA, /* U+00a3a9: YI SYLLABLE NRYRX*/
+ RTUNI_ALPHA, /* U+00a3aa: YI SYLLABLE NRYR*/
+ RTUNI_ALPHA, /* U+00a3ab: YI SYLLABLE SHAT*/
+ RTUNI_ALPHA, /* U+00a3ac: YI SYLLABLE SHAX*/
+ RTUNI_ALPHA, /* U+00a3ad: YI SYLLABLE SHA*/
+ RTUNI_ALPHA, /* U+00a3ae: YI SYLLABLE SHAP*/
+ RTUNI_ALPHA, /* U+00a3af: YI SYLLABLE SHUOX*/
+ RTUNI_ALPHA, /* U+00a3b0: YI SYLLABLE SHUO*/
+ RTUNI_ALPHA, /* U+00a3b1: YI SYLLABLE SHUOP*/
+ RTUNI_ALPHA, /* U+00a3b2: YI SYLLABLE SHOT*/
+ RTUNI_ALPHA, /* U+00a3b3: YI SYLLABLE SHOX*/
+ RTUNI_ALPHA, /* U+00a3b4: YI SYLLABLE SHO*/
+ RTUNI_ALPHA, /* U+00a3b5: YI SYLLABLE SHOP*/
+ RTUNI_ALPHA, /* U+00a3b6: YI SYLLABLE SHET*/
+ RTUNI_ALPHA, /* U+00a3b7: YI SYLLABLE SHEX*/
+ RTUNI_ALPHA, /* U+00a3b8: YI SYLLABLE SHE*/
+ RTUNI_ALPHA, /* U+00a3b9: YI SYLLABLE SHEP*/
+ RTUNI_ALPHA, /* U+00a3ba: YI SYLLABLE SHUT*/
+ RTUNI_ALPHA, /* U+00a3bb: YI SYLLABLE SHUX*/
+ RTUNI_ALPHA, /* U+00a3bc: YI SYLLABLE SHU*/
+ RTUNI_ALPHA, /* U+00a3bd: YI SYLLABLE SHUP*/
+ RTUNI_ALPHA, /* U+00a3be: YI SYLLABLE SHURX*/
+ RTUNI_ALPHA, /* U+00a3bf: YI SYLLABLE SHUR*/
+ RTUNI_ALPHA, /* U+00a3c0: YI SYLLABLE SHYT*/
+ RTUNI_ALPHA, /* U+00a3c1: YI SYLLABLE SHYX*/
+ RTUNI_ALPHA, /* U+00a3c2: YI SYLLABLE SHY*/
+ RTUNI_ALPHA, /* U+00a3c3: YI SYLLABLE SHYP*/
+ RTUNI_ALPHA, /* U+00a3c4: YI SYLLABLE SHYRX*/
+ RTUNI_ALPHA, /* U+00a3c5: YI SYLLABLE SHYR*/
+ RTUNI_ALPHA, /* U+00a3c6: YI SYLLABLE RAT*/
+ RTUNI_ALPHA, /* U+00a3c7: YI SYLLABLE RAX*/
+ RTUNI_ALPHA, /* U+00a3c8: YI SYLLABLE RA*/
+ RTUNI_ALPHA, /* U+00a3c9: YI SYLLABLE RAP*/
+ RTUNI_ALPHA, /* U+00a3ca: YI SYLLABLE RUOX*/
+ RTUNI_ALPHA, /* U+00a3cb: YI SYLLABLE RUO*/
+ RTUNI_ALPHA, /* U+00a3cc: YI SYLLABLE RUOP*/
+ RTUNI_ALPHA, /* U+00a3cd: YI SYLLABLE ROT*/
+ RTUNI_ALPHA, /* U+00a3ce: YI SYLLABLE ROX*/
+ RTUNI_ALPHA, /* U+00a3cf: YI SYLLABLE RO*/
+ RTUNI_ALPHA, /* U+00a3d0: YI SYLLABLE ROP*/
+ RTUNI_ALPHA, /* U+00a3d1: YI SYLLABLE REX*/
+ RTUNI_ALPHA, /* U+00a3d2: YI SYLLABLE RE*/
+ RTUNI_ALPHA, /* U+00a3d3: YI SYLLABLE REP*/
+ RTUNI_ALPHA, /* U+00a3d4: YI SYLLABLE RUT*/
+ RTUNI_ALPHA, /* U+00a3d5: YI SYLLABLE RUX*/
+ RTUNI_ALPHA, /* U+00a3d6: YI SYLLABLE RU*/
+ RTUNI_ALPHA, /* U+00a3d7: YI SYLLABLE RUP*/
+ RTUNI_ALPHA, /* U+00a3d8: YI SYLLABLE RURX*/
+ RTUNI_ALPHA, /* U+00a3d9: YI SYLLABLE RUR*/
+ RTUNI_ALPHA, /* U+00a3da: YI SYLLABLE RYT*/
+ RTUNI_ALPHA, /* U+00a3db: YI SYLLABLE RYX*/
+ RTUNI_ALPHA, /* U+00a3dc: YI SYLLABLE RY*/
+ RTUNI_ALPHA, /* U+00a3dd: YI SYLLABLE RYP*/
+ RTUNI_ALPHA, /* U+00a3de: YI SYLLABLE RYRX*/
+ RTUNI_ALPHA, /* U+00a3df: YI SYLLABLE RYR*/
+ RTUNI_ALPHA, /* U+00a3e0: YI SYLLABLE JIT*/
+ RTUNI_ALPHA, /* U+00a3e1: YI SYLLABLE JIX*/
+ RTUNI_ALPHA, /* U+00a3e2: YI SYLLABLE JI*/
+ RTUNI_ALPHA, /* U+00a3e3: YI SYLLABLE JIP*/
+ RTUNI_ALPHA, /* U+00a3e4: YI SYLLABLE JIET*/
+ RTUNI_ALPHA, /* U+00a3e5: YI SYLLABLE JIEX*/
+ RTUNI_ALPHA, /* U+00a3e6: YI SYLLABLE JIE*/
+ RTUNI_ALPHA, /* U+00a3e7: YI SYLLABLE JIEP*/
+ RTUNI_ALPHA, /* U+00a3e8: YI SYLLABLE JUOT*/
+ RTUNI_ALPHA, /* U+00a3e9: YI SYLLABLE JUOX*/
+ RTUNI_ALPHA, /* U+00a3ea: YI SYLLABLE JUO*/
+ RTUNI_ALPHA, /* U+00a3eb: YI SYLLABLE JUOP*/
+ RTUNI_ALPHA, /* U+00a3ec: YI SYLLABLE JOT*/
+ RTUNI_ALPHA, /* U+00a3ed: YI SYLLABLE JOX*/
+ RTUNI_ALPHA, /* U+00a3ee: YI SYLLABLE JO*/
+ RTUNI_ALPHA, /* U+00a3ef: YI SYLLABLE JOP*/
+ RTUNI_ALPHA, /* U+00a3f0: YI SYLLABLE JUT*/
+ RTUNI_ALPHA, /* U+00a3f1: YI SYLLABLE JUX*/
+ RTUNI_ALPHA, /* U+00a3f2: YI SYLLABLE JU*/
+ RTUNI_ALPHA, /* U+00a3f3: YI SYLLABLE JUP*/
+ RTUNI_ALPHA, /* U+00a3f4: YI SYLLABLE JURX*/
+ RTUNI_ALPHA, /* U+00a3f5: YI SYLLABLE JUR*/
+ RTUNI_ALPHA, /* U+00a3f6: YI SYLLABLE JYT*/
+ RTUNI_ALPHA, /* U+00a3f7: YI SYLLABLE JYX*/
+ RTUNI_ALPHA, /* U+00a3f8: YI SYLLABLE JY*/
+ RTUNI_ALPHA, /* U+00a3f9: YI SYLLABLE JYP*/
+ RTUNI_ALPHA, /* U+00a3fa: YI SYLLABLE JYRX*/
+ RTUNI_ALPHA, /* U+00a3fb: YI SYLLABLE JYR*/
+ RTUNI_ALPHA, /* U+00a3fc: YI SYLLABLE QIT*/
+ RTUNI_ALPHA, /* U+00a3fd: YI SYLLABLE QIX*/
+ RTUNI_ALPHA, /* U+00a3fe: YI SYLLABLE QI*/
+ RTUNI_ALPHA, /* U+00a3ff: YI SYLLABLE QIP*/
+ RTUNI_ALPHA, /* U+00a400: YI SYLLABLE QIET*/
+ RTUNI_ALPHA, /* U+00a401: YI SYLLABLE QIEX*/
+ RTUNI_ALPHA, /* U+00a402: YI SYLLABLE QIE*/
+ RTUNI_ALPHA, /* U+00a403: YI SYLLABLE QIEP*/
+ RTUNI_ALPHA, /* U+00a404: YI SYLLABLE QUOT*/
+ RTUNI_ALPHA, /* U+00a405: YI SYLLABLE QUOX*/
+ RTUNI_ALPHA, /* U+00a406: YI SYLLABLE QUO*/
+ RTUNI_ALPHA, /* U+00a407: YI SYLLABLE QUOP*/
+ RTUNI_ALPHA, /* U+00a408: YI SYLLABLE QOT*/
+ RTUNI_ALPHA, /* U+00a409: YI SYLLABLE QOX*/
+ RTUNI_ALPHA, /* U+00a40a: YI SYLLABLE QO*/
+ RTUNI_ALPHA, /* U+00a40b: YI SYLLABLE QOP*/
+ RTUNI_ALPHA, /* U+00a40c: YI SYLLABLE QUT*/
+ RTUNI_ALPHA, /* U+00a40d: YI SYLLABLE QUX*/
+ RTUNI_ALPHA, /* U+00a40e: YI SYLLABLE QU*/
+ RTUNI_ALPHA, /* U+00a40f: YI SYLLABLE QUP*/
+ RTUNI_ALPHA, /* U+00a410: YI SYLLABLE QURX*/
+ RTUNI_ALPHA, /* U+00a411: YI SYLLABLE QUR*/
+ RTUNI_ALPHA, /* U+00a412: YI SYLLABLE QYT*/
+ RTUNI_ALPHA, /* U+00a413: YI SYLLABLE QYX*/
+ RTUNI_ALPHA, /* U+00a414: YI SYLLABLE QY*/
+ RTUNI_ALPHA, /* U+00a415: YI SYLLABLE QYP*/
+ RTUNI_ALPHA, /* U+00a416: YI SYLLABLE QYRX*/
+ RTUNI_ALPHA, /* U+00a417: YI SYLLABLE QYR*/
+ RTUNI_ALPHA, /* U+00a418: YI SYLLABLE JJIT*/
+ RTUNI_ALPHA, /* U+00a419: YI SYLLABLE JJIX*/
+ RTUNI_ALPHA, /* U+00a41a: YI SYLLABLE JJI*/
+ RTUNI_ALPHA, /* U+00a41b: YI SYLLABLE JJIP*/
+ RTUNI_ALPHA, /* U+00a41c: YI SYLLABLE JJIET*/
+ RTUNI_ALPHA, /* U+00a41d: YI SYLLABLE JJIEX*/
+ RTUNI_ALPHA, /* U+00a41e: YI SYLLABLE JJIE*/
+ RTUNI_ALPHA, /* U+00a41f: YI SYLLABLE JJIEP*/
+ RTUNI_ALPHA, /* U+00a420: YI SYLLABLE JJUOX*/
+ RTUNI_ALPHA, /* U+00a421: YI SYLLABLE JJUO*/
+ RTUNI_ALPHA, /* U+00a422: YI SYLLABLE JJUOP*/
+ RTUNI_ALPHA, /* U+00a423: YI SYLLABLE JJOT*/
+ RTUNI_ALPHA, /* U+00a424: YI SYLLABLE JJOX*/
+ RTUNI_ALPHA, /* U+00a425: YI SYLLABLE JJO*/
+ RTUNI_ALPHA, /* U+00a426: YI SYLLABLE JJOP*/
+ RTUNI_ALPHA, /* U+00a427: YI SYLLABLE JJUT*/
+ RTUNI_ALPHA, /* U+00a428: YI SYLLABLE JJUX*/
+ RTUNI_ALPHA, /* U+00a429: YI SYLLABLE JJU*/
+ RTUNI_ALPHA, /* U+00a42a: YI SYLLABLE JJUP*/
+ RTUNI_ALPHA, /* U+00a42b: YI SYLLABLE JJURX*/
+ RTUNI_ALPHA, /* U+00a42c: YI SYLLABLE JJUR*/
+ RTUNI_ALPHA, /* U+00a42d: YI SYLLABLE JJYT*/
+ RTUNI_ALPHA, /* U+00a42e: YI SYLLABLE JJYX*/
+ RTUNI_ALPHA, /* U+00a42f: YI SYLLABLE JJY*/
+ RTUNI_ALPHA, /* U+00a430: YI SYLLABLE JJYP*/
+ RTUNI_ALPHA, /* U+00a431: YI SYLLABLE NJIT*/
+ RTUNI_ALPHA, /* U+00a432: YI SYLLABLE NJIX*/
+ RTUNI_ALPHA, /* U+00a433: YI SYLLABLE NJI*/
+ RTUNI_ALPHA, /* U+00a434: YI SYLLABLE NJIP*/
+ RTUNI_ALPHA, /* U+00a435: YI SYLLABLE NJIET*/
+ RTUNI_ALPHA, /* U+00a436: YI SYLLABLE NJIEX*/
+ RTUNI_ALPHA, /* U+00a437: YI SYLLABLE NJIE*/
+ RTUNI_ALPHA, /* U+00a438: YI SYLLABLE NJIEP*/
+ RTUNI_ALPHA, /* U+00a439: YI SYLLABLE NJUOX*/
+ RTUNI_ALPHA, /* U+00a43a: YI SYLLABLE NJUO*/
+ RTUNI_ALPHA, /* U+00a43b: YI SYLLABLE NJOT*/
+ RTUNI_ALPHA, /* U+00a43c: YI SYLLABLE NJOX*/
+ RTUNI_ALPHA, /* U+00a43d: YI SYLLABLE NJO*/
+ RTUNI_ALPHA, /* U+00a43e: YI SYLLABLE NJOP*/
+ RTUNI_ALPHA, /* U+00a43f: YI SYLLABLE NJUX*/
+ RTUNI_ALPHA, /* U+00a440: YI SYLLABLE NJU*/
+ RTUNI_ALPHA, /* U+00a441: YI SYLLABLE NJUP*/
+ RTUNI_ALPHA, /* U+00a442: YI SYLLABLE NJURX*/
+ RTUNI_ALPHA, /* U+00a443: YI SYLLABLE NJUR*/
+ RTUNI_ALPHA, /* U+00a444: YI SYLLABLE NJYT*/
+ RTUNI_ALPHA, /* U+00a445: YI SYLLABLE NJYX*/
+ RTUNI_ALPHA, /* U+00a446: YI SYLLABLE NJY*/
+ RTUNI_ALPHA, /* U+00a447: YI SYLLABLE NJYP*/
+ RTUNI_ALPHA, /* U+00a448: YI SYLLABLE NJYRX*/
+ RTUNI_ALPHA, /* U+00a449: YI SYLLABLE NJYR*/
+ RTUNI_ALPHA, /* U+00a44a: YI SYLLABLE NYIT*/
+ RTUNI_ALPHA, /* U+00a44b: YI SYLLABLE NYIX*/
+ RTUNI_ALPHA, /* U+00a44c: YI SYLLABLE NYI*/
+ RTUNI_ALPHA, /* U+00a44d: YI SYLLABLE NYIP*/
+ RTUNI_ALPHA, /* U+00a44e: YI SYLLABLE NYIET*/
+ RTUNI_ALPHA, /* U+00a44f: YI SYLLABLE NYIEX*/
+ RTUNI_ALPHA, /* U+00a450: YI SYLLABLE NYIE*/
+ RTUNI_ALPHA, /* U+00a451: YI SYLLABLE NYIEP*/
+ RTUNI_ALPHA, /* U+00a452: YI SYLLABLE NYUOX*/
+ RTUNI_ALPHA, /* U+00a453: YI SYLLABLE NYUO*/
+ RTUNI_ALPHA, /* U+00a454: YI SYLLABLE NYUOP*/
+ RTUNI_ALPHA, /* U+00a455: YI SYLLABLE NYOT*/
+ RTUNI_ALPHA, /* U+00a456: YI SYLLABLE NYOX*/
+ RTUNI_ALPHA, /* U+00a457: YI SYLLABLE NYO*/
+ RTUNI_ALPHA, /* U+00a458: YI SYLLABLE NYOP*/
+ RTUNI_ALPHA, /* U+00a459: YI SYLLABLE NYUT*/
+ RTUNI_ALPHA, /* U+00a45a: YI SYLLABLE NYUX*/
+ RTUNI_ALPHA, /* U+00a45b: YI SYLLABLE NYU*/
+ RTUNI_ALPHA, /* U+00a45c: YI SYLLABLE NYUP*/
+ RTUNI_ALPHA, /* U+00a45d: YI SYLLABLE XIT*/
+ RTUNI_ALPHA, /* U+00a45e: YI SYLLABLE XIX*/
+ RTUNI_ALPHA, /* U+00a45f: YI SYLLABLE XI*/
+ RTUNI_ALPHA, /* U+00a460: YI SYLLABLE XIP*/
+ RTUNI_ALPHA, /* U+00a461: YI SYLLABLE XIET*/
+ RTUNI_ALPHA, /* U+00a462: YI SYLLABLE XIEX*/
+ RTUNI_ALPHA, /* U+00a463: YI SYLLABLE XIE*/
+ RTUNI_ALPHA, /* U+00a464: YI SYLLABLE XIEP*/
+ RTUNI_ALPHA, /* U+00a465: YI SYLLABLE XUOX*/
+ RTUNI_ALPHA, /* U+00a466: YI SYLLABLE XUO*/
+ RTUNI_ALPHA, /* U+00a467: YI SYLLABLE XOT*/
+ RTUNI_ALPHA, /* U+00a468: YI SYLLABLE XOX*/
+ RTUNI_ALPHA, /* U+00a469: YI SYLLABLE XO*/
+ RTUNI_ALPHA, /* U+00a46a: YI SYLLABLE XOP*/
+ RTUNI_ALPHA, /* U+00a46b: YI SYLLABLE XYT*/
+ RTUNI_ALPHA, /* U+00a46c: YI SYLLABLE XYX*/
+ RTUNI_ALPHA, /* U+00a46d: YI SYLLABLE XY*/
+ RTUNI_ALPHA, /* U+00a46e: YI SYLLABLE XYP*/
+ RTUNI_ALPHA, /* U+00a46f: YI SYLLABLE XYRX*/
+ RTUNI_ALPHA, /* U+00a470: YI SYLLABLE XYR*/
+ RTUNI_ALPHA, /* U+00a471: YI SYLLABLE YIT*/
+ RTUNI_ALPHA, /* U+00a472: YI SYLLABLE YIX*/
+ RTUNI_ALPHA, /* U+00a473: YI SYLLABLE YI*/
+ RTUNI_ALPHA, /* U+00a474: YI SYLLABLE YIP*/
+ RTUNI_ALPHA, /* U+00a475: YI SYLLABLE YIET*/
+ RTUNI_ALPHA, /* U+00a476: YI SYLLABLE YIEX*/
+ RTUNI_ALPHA, /* U+00a477: YI SYLLABLE YIE*/
+ RTUNI_ALPHA, /* U+00a478: YI SYLLABLE YIEP*/
+ RTUNI_ALPHA, /* U+00a479: YI SYLLABLE YUOT*/
+ RTUNI_ALPHA, /* U+00a47a: YI SYLLABLE YUOX*/
+ RTUNI_ALPHA, /* U+00a47b: YI SYLLABLE YUO*/
+ RTUNI_ALPHA, /* U+00a47c: YI SYLLABLE YUOP*/
+ RTUNI_ALPHA, /* U+00a47d: YI SYLLABLE YOT*/
+ RTUNI_ALPHA, /* U+00a47e: YI SYLLABLE YOX*/
+ RTUNI_ALPHA, /* U+00a47f: YI SYLLABLE YO*/
+ RTUNI_ALPHA, /* U+00a480: YI SYLLABLE YOP*/
+ RTUNI_ALPHA, /* U+00a481: YI SYLLABLE YUT*/
+ RTUNI_ALPHA, /* U+00a482: YI SYLLABLE YUX*/
+ RTUNI_ALPHA, /* U+00a483: YI SYLLABLE YU*/
+ RTUNI_ALPHA, /* U+00a484: YI SYLLABLE YUP*/
+ RTUNI_ALPHA, /* U+00a485: YI SYLLABLE YURX*/
+ RTUNI_ALPHA, /* U+00a486: YI SYLLABLE YUR*/
+ RTUNI_ALPHA, /* U+00a487: YI SYLLABLE YYT*/
+ RTUNI_ALPHA, /* U+00a488: YI SYLLABLE YYX*/
+ RTUNI_ALPHA, /* U+00a489: YI SYLLABLE YY*/
+ RTUNI_ALPHA, /* U+00a48a: YI SYLLABLE YYP*/
+ RTUNI_ALPHA, /* U+00a48b: YI SYLLABLE YYRX*/
+ RTUNI_ALPHA, /* U+00a48c: YI SYLLABLE YYR*/
+ 0, /* U+00a48d: */
+ 0, /* U+00a48e: */
+ 0, /* U+00a48f: */
+ 0, /* U+00a490: YI RADICAL QOT*/
+ 0, /* U+00a491: YI RADICAL LI*/
+ 0, /* U+00a492: YI RADICAL KIT*/
+ 0, /* U+00a493: YI RADICAL NYIP*/
+ 0, /* U+00a494: YI RADICAL CYP*/
+ 0, /* U+00a495: YI RADICAL SSI*/
+ 0, /* U+00a496: YI RADICAL GGOP*/
+ 0, /* U+00a497: YI RADICAL GEP*/
+ 0, /* U+00a498: YI RADICAL MI*/
+ 0, /* U+00a499: YI RADICAL HXIT*/
+ 0, /* U+00a49a: YI RADICAL LYR*/
+ 0, /* U+00a49b: YI RADICAL BBUT*/
+ 0, /* U+00a49c: YI RADICAL MOP*/
+ 0, /* U+00a49d: YI RADICAL YO*/
+ 0, /* U+00a49e: YI RADICAL PUT*/
+ 0, /* U+00a49f: YI RADICAL HXUO*/
+ 0, /* U+00a4a0: YI RADICAL TAT*/
+ 0, /* U+00a4a1: YI RADICAL GA*/
+ 0, /* U+00a4a2: YI RADICAL ZUP*/
+ 0, /* U+00a4a3: YI RADICAL CYT*/
+ 0, /* U+00a4a4: YI RADICAL DDUR*/
+ 0, /* U+00a4a5: YI RADICAL BUR*/
+ 0, /* U+00a4a6: YI RADICAL GGUO*/
+ 0, /* U+00a4a7: YI RADICAL NYOP*/
+ 0, /* U+00a4a8: YI RADICAL TU*/
+ 0, /* U+00a4a9: YI RADICAL OP*/
+ 0, /* U+00a4aa: YI RADICAL JJUT*/
+ 0, /* U+00a4ab: YI RADICAL ZOT*/
+ 0, /* U+00a4ac: YI RADICAL PYT*/
+ 0, /* U+00a4ad: YI RADICAL HMO*/
+ 0, /* U+00a4ae: YI RADICAL YIT*/
+ 0, /* U+00a4af: YI RADICAL VUR*/
+ 0, /* U+00a4b0: YI RADICAL SHY*/
+ 0, /* U+00a4b1: YI RADICAL VEP*/
+ 0, /* U+00a4b2: YI RADICAL ZA*/
+ 0, /* U+00a4b3: YI RADICAL JO*/
+ 0, /* U+00a4b4: YI RADICAL NZUP*/
+ 0, /* U+00a4b5: YI RADICAL JJY*/
+ 0, /* U+00a4b6: YI RADICAL GOT*/
+ 0, /* U+00a4b7: YI RADICAL JJIE*/
+ 0, /* U+00a4b8: YI RADICAL WO*/
+ 0, /* U+00a4b9: YI RADICAL DU*/
+ 0, /* U+00a4ba: YI RADICAL SHUR*/
+ 0, /* U+00a4bb: YI RADICAL LIE*/
+ 0, /* U+00a4bc: YI RADICAL CY*/
+ 0, /* U+00a4bd: YI RADICAL CUOP*/
+ 0, /* U+00a4be: YI RADICAL CIP*/
+ 0, /* U+00a4bf: YI RADICAL HXOP*/
+ 0, /* U+00a4c0: YI RADICAL SHAT*/
+ 0, /* U+00a4c1: YI RADICAL ZUR*/
+ 0, /* U+00a4c2: YI RADICAL SHOP*/
+ 0, /* U+00a4c3: YI RADICAL CHE*/
+ 0, /* U+00a4c4: YI RADICAL ZZIET*/
+ 0, /* U+00a4c5: YI RADICAL NBIE*/
+ 0, /* U+00a4c6: YI RADICAL KE*/
+ 0, /* U+00a4c7: */
+ 0, /* U+00a4c8: */
+ 0, /* U+00a4c9: */
+ 0, /* U+00a4ca: */
+ 0, /* U+00a4cb: */
+ 0, /* U+00a4cc: */
+ 0, /* U+00a4cd: */
+ 0, /* U+00a4ce: */
+ 0, /* U+00a4cf: */
+ RTUNI_ALPHA, /* U+00a4d0: LISU LETTER BA*/
+ RTUNI_ALPHA, /* U+00a4d1: LISU LETTER PA*/
+ RTUNI_ALPHA, /* U+00a4d2: LISU LETTER PHA*/
+ RTUNI_ALPHA, /* U+00a4d3: LISU LETTER DA*/
+ RTUNI_ALPHA, /* U+00a4d4: LISU LETTER TA*/
+ RTUNI_ALPHA, /* U+00a4d5: LISU LETTER THA*/
+ RTUNI_ALPHA, /* U+00a4d6: LISU LETTER GA*/
+ RTUNI_ALPHA, /* U+00a4d7: LISU LETTER KA*/
+ RTUNI_ALPHA, /* U+00a4d8: LISU LETTER KHA*/
+ RTUNI_ALPHA, /* U+00a4d9: LISU LETTER JA*/
+ RTUNI_ALPHA, /* U+00a4da: LISU LETTER CA*/
+ RTUNI_ALPHA, /* U+00a4db: LISU LETTER CHA*/
+ RTUNI_ALPHA, /* U+00a4dc: LISU LETTER DZA*/
+ RTUNI_ALPHA, /* U+00a4dd: LISU LETTER TSA*/
+ RTUNI_ALPHA, /* U+00a4de: LISU LETTER TSHA*/
+ RTUNI_ALPHA, /* U+00a4df: LISU LETTER MA*/
+ RTUNI_ALPHA, /* U+00a4e0: LISU LETTER NA*/
+ RTUNI_ALPHA, /* U+00a4e1: LISU LETTER LA*/
+ RTUNI_ALPHA, /* U+00a4e2: LISU LETTER SA*/
+ RTUNI_ALPHA, /* U+00a4e3: LISU LETTER ZHA*/
+ RTUNI_ALPHA, /* U+00a4e4: LISU LETTER ZA*/
+ RTUNI_ALPHA, /* U+00a4e5: LISU LETTER NGA*/
+ RTUNI_ALPHA, /* U+00a4e6: LISU LETTER HA*/
+ RTUNI_ALPHA, /* U+00a4e7: LISU LETTER XA*/
+ RTUNI_ALPHA, /* U+00a4e8: LISU LETTER HHA*/
+ RTUNI_ALPHA, /* U+00a4e9: LISU LETTER FA*/
+ RTUNI_ALPHA, /* U+00a4ea: LISU LETTER WA*/
+ RTUNI_ALPHA, /* U+00a4eb: LISU LETTER SHA*/
+ RTUNI_ALPHA, /* U+00a4ec: LISU LETTER YA*/
+ RTUNI_ALPHA, /* U+00a4ed: LISU LETTER GHA*/
+ RTUNI_ALPHA, /* U+00a4ee: LISU LETTER A*/
+ RTUNI_ALPHA, /* U+00a4ef: LISU LETTER AE*/
+ RTUNI_ALPHA, /* U+00a4f0: LISU LETTER E*/
+ RTUNI_ALPHA, /* U+00a4f1: LISU LETTER EU*/
+ RTUNI_ALPHA, /* U+00a4f2: LISU LETTER I*/
+ RTUNI_ALPHA, /* U+00a4f3: LISU LETTER O*/
+ RTUNI_ALPHA, /* U+00a4f4: LISU LETTER U*/
+ RTUNI_ALPHA, /* U+00a4f5: LISU LETTER UE*/
+ RTUNI_ALPHA, /* U+00a4f6: LISU LETTER UH*/
+ RTUNI_ALPHA, /* U+00a4f7: LISU LETTER OE*/
+ RTUNI_ALPHA, /* U+00a4f8: LISU LETTER TONE MYA TI*/
+ RTUNI_ALPHA, /* U+00a4f9: LISU LETTER TONE NA PO*/
+ RTUNI_ALPHA, /* U+00a4fa: LISU LETTER TONE MYA CYA*/
+ RTUNI_ALPHA, /* U+00a4fb: LISU LETTER TONE MYA BO*/
+ RTUNI_ALPHA, /* U+00a4fc: LISU LETTER TONE MYA NA*/
+ RTUNI_ALPHA, /* U+00a4fd: LISU LETTER TONE MYA JEU*/
+ 0, /* U+00a4fe: LISU PUNCTUATION COMMA*/
+ 0, /* U+00a4ff: LISU PUNCTUATION FULL STOP*/
+ RTUNI_ALPHA, /* U+00a500: VAI SYLLABLE EE*/
+ RTUNI_ALPHA, /* U+00a501: VAI SYLLABLE EEN*/
+ RTUNI_ALPHA, /* U+00a502: VAI SYLLABLE HEE*/
+ RTUNI_ALPHA, /* U+00a503: VAI SYLLABLE WEE*/
+ RTUNI_ALPHA, /* U+00a504: VAI SYLLABLE WEEN*/
+ RTUNI_ALPHA, /* U+00a505: VAI SYLLABLE PEE*/
+ RTUNI_ALPHA, /* U+00a506: VAI SYLLABLE BHEE*/
+ RTUNI_ALPHA, /* U+00a507: VAI SYLLABLE BEE*/
+ RTUNI_ALPHA, /* U+00a508: VAI SYLLABLE MBEE*/
+ RTUNI_ALPHA, /* U+00a509: VAI SYLLABLE KPEE*/
+ RTUNI_ALPHA, /* U+00a50a: VAI SYLLABLE MGBEE*/
+ RTUNI_ALPHA, /* U+00a50b: VAI SYLLABLE GBEE*/
+ RTUNI_ALPHA, /* U+00a50c: VAI SYLLABLE FEE*/
+ RTUNI_ALPHA, /* U+00a50d: VAI SYLLABLE VEE*/
+ RTUNI_ALPHA, /* U+00a50e: VAI SYLLABLE TEE*/
+ RTUNI_ALPHA, /* U+00a50f: VAI SYLLABLE THEE*/
+ RTUNI_ALPHA, /* U+00a510: VAI SYLLABLE DHEE*/
+ RTUNI_ALPHA, /* U+00a511: VAI SYLLABLE DHHEE*/
+ RTUNI_ALPHA, /* U+00a512: VAI SYLLABLE LEE*/
+ RTUNI_ALPHA, /* U+00a513: VAI SYLLABLE REE*/
+ RTUNI_ALPHA, /* U+00a514: VAI SYLLABLE DEE*/
+ RTUNI_ALPHA, /* U+00a515: VAI SYLLABLE NDEE*/
+ RTUNI_ALPHA, /* U+00a516: VAI SYLLABLE SEE*/
+ RTUNI_ALPHA, /* U+00a517: VAI SYLLABLE SHEE*/
+ RTUNI_ALPHA, /* U+00a518: VAI SYLLABLE ZEE*/
+ RTUNI_ALPHA, /* U+00a519: VAI SYLLABLE ZHEE*/
+ RTUNI_ALPHA, /* U+00a51a: VAI SYLLABLE CEE*/
+ RTUNI_ALPHA, /* U+00a51b: VAI SYLLABLE JEE*/
+ RTUNI_ALPHA, /* U+00a51c: VAI SYLLABLE NJEE*/
+ RTUNI_ALPHA, /* U+00a51d: VAI SYLLABLE YEE*/
+ RTUNI_ALPHA, /* U+00a51e: VAI SYLLABLE KEE*/
+ RTUNI_ALPHA, /* U+00a51f: VAI SYLLABLE NGGEE*/
+ RTUNI_ALPHA, /* U+00a520: VAI SYLLABLE GEE*/
+ RTUNI_ALPHA, /* U+00a521: VAI SYLLABLE MEE*/
+ RTUNI_ALPHA, /* U+00a522: VAI SYLLABLE NEE*/
+ RTUNI_ALPHA, /* U+00a523: VAI SYLLABLE NYEE*/
+ RTUNI_ALPHA, /* U+00a524: VAI SYLLABLE I*/
+ RTUNI_ALPHA, /* U+00a525: VAI SYLLABLE IN*/
+ RTUNI_ALPHA, /* U+00a526: VAI SYLLABLE HI*/
+ RTUNI_ALPHA, /* U+00a527: VAI SYLLABLE HIN*/
+ RTUNI_ALPHA, /* U+00a528: VAI SYLLABLE WI*/
+ RTUNI_ALPHA, /* U+00a529: VAI SYLLABLE WIN*/
+ RTUNI_ALPHA, /* U+00a52a: VAI SYLLABLE PI*/
+ RTUNI_ALPHA, /* U+00a52b: VAI SYLLABLE BHI*/
+ RTUNI_ALPHA, /* U+00a52c: VAI SYLLABLE BI*/
+ RTUNI_ALPHA, /* U+00a52d: VAI SYLLABLE MBI*/
+ RTUNI_ALPHA, /* U+00a52e: VAI SYLLABLE KPI*/
+ RTUNI_ALPHA, /* U+00a52f: VAI SYLLABLE MGBI*/
+ RTUNI_ALPHA, /* U+00a530: VAI SYLLABLE GBI*/
+ RTUNI_ALPHA, /* U+00a531: VAI SYLLABLE FI*/
+ RTUNI_ALPHA, /* U+00a532: VAI SYLLABLE VI*/
+ RTUNI_ALPHA, /* U+00a533: VAI SYLLABLE TI*/
+ RTUNI_ALPHA, /* U+00a534: VAI SYLLABLE THI*/
+ RTUNI_ALPHA, /* U+00a535: VAI SYLLABLE DHI*/
+ RTUNI_ALPHA, /* U+00a536: VAI SYLLABLE DHHI*/
+ RTUNI_ALPHA, /* U+00a537: VAI SYLLABLE LI*/
+ RTUNI_ALPHA, /* U+00a538: VAI SYLLABLE RI*/
+ RTUNI_ALPHA, /* U+00a539: VAI SYLLABLE DI*/
+ RTUNI_ALPHA, /* U+00a53a: VAI SYLLABLE NDI*/
+ RTUNI_ALPHA, /* U+00a53b: VAI SYLLABLE SI*/
+ RTUNI_ALPHA, /* U+00a53c: VAI SYLLABLE SHI*/
+ RTUNI_ALPHA, /* U+00a53d: VAI SYLLABLE ZI*/
+ RTUNI_ALPHA, /* U+00a53e: VAI SYLLABLE ZHI*/
+ RTUNI_ALPHA, /* U+00a53f: VAI SYLLABLE CI*/
+ RTUNI_ALPHA, /* U+00a540: VAI SYLLABLE JI*/
+ RTUNI_ALPHA, /* U+00a541: VAI SYLLABLE NJI*/
+ RTUNI_ALPHA, /* U+00a542: VAI SYLLABLE YI*/
+ RTUNI_ALPHA, /* U+00a543: VAI SYLLABLE KI*/
+ RTUNI_ALPHA, /* U+00a544: VAI SYLLABLE NGGI*/
+ RTUNI_ALPHA, /* U+00a545: VAI SYLLABLE GI*/
+ RTUNI_ALPHA, /* U+00a546: VAI SYLLABLE MI*/
+ RTUNI_ALPHA, /* U+00a547: VAI SYLLABLE NI*/
+ RTUNI_ALPHA, /* U+00a548: VAI SYLLABLE NYI*/
+ RTUNI_ALPHA, /* U+00a549: VAI SYLLABLE A*/
+ RTUNI_ALPHA, /* U+00a54a: VAI SYLLABLE AN*/
+ RTUNI_ALPHA, /* U+00a54b: VAI SYLLABLE NGAN*/
+ RTUNI_ALPHA, /* U+00a54c: VAI SYLLABLE HA*/
+ RTUNI_ALPHA, /* U+00a54d: VAI SYLLABLE HAN*/
+ RTUNI_ALPHA, /* U+00a54e: VAI SYLLABLE WA*/
+ RTUNI_ALPHA, /* U+00a54f: VAI SYLLABLE WAN*/
+ RTUNI_ALPHA, /* U+00a550: VAI SYLLABLE PA*/
+ RTUNI_ALPHA, /* U+00a551: VAI SYLLABLE BHA*/
+ RTUNI_ALPHA, /* U+00a552: VAI SYLLABLE BA*/
+ RTUNI_ALPHA, /* U+00a553: VAI SYLLABLE MBA*/
+ RTUNI_ALPHA, /* U+00a554: VAI SYLLABLE KPA*/
+ RTUNI_ALPHA, /* U+00a555: VAI SYLLABLE KPAN*/
+ RTUNI_ALPHA, /* U+00a556: VAI SYLLABLE MGBA*/
+ RTUNI_ALPHA, /* U+00a557: VAI SYLLABLE GBA*/
+ RTUNI_ALPHA, /* U+00a558: VAI SYLLABLE FA*/
+ RTUNI_ALPHA, /* U+00a559: VAI SYLLABLE VA*/
+ RTUNI_ALPHA, /* U+00a55a: VAI SYLLABLE TA*/
+ RTUNI_ALPHA, /* U+00a55b: VAI SYLLABLE THA*/
+ RTUNI_ALPHA, /* U+00a55c: VAI SYLLABLE DHA*/
+ RTUNI_ALPHA, /* U+00a55d: VAI SYLLABLE DHHA*/
+ RTUNI_ALPHA, /* U+00a55e: VAI SYLLABLE LA*/
+ RTUNI_ALPHA, /* U+00a55f: VAI SYLLABLE RA*/
+ RTUNI_ALPHA, /* U+00a560: VAI SYLLABLE DA*/
+ RTUNI_ALPHA, /* U+00a561: VAI SYLLABLE NDA*/
+ RTUNI_ALPHA, /* U+00a562: VAI SYLLABLE SA*/
+ RTUNI_ALPHA, /* U+00a563: VAI SYLLABLE SHA*/
+ RTUNI_ALPHA, /* U+00a564: VAI SYLLABLE ZA*/
+ RTUNI_ALPHA, /* U+00a565: VAI SYLLABLE ZHA*/
+ RTUNI_ALPHA, /* U+00a566: VAI SYLLABLE CA*/
+ RTUNI_ALPHA, /* U+00a567: VAI SYLLABLE JA*/
+ RTUNI_ALPHA, /* U+00a568: VAI SYLLABLE NJA*/
+ RTUNI_ALPHA, /* U+00a569: VAI SYLLABLE YA*/
+ RTUNI_ALPHA, /* U+00a56a: VAI SYLLABLE KA*/
+ RTUNI_ALPHA, /* U+00a56b: VAI SYLLABLE KAN*/
+ RTUNI_ALPHA, /* U+00a56c: VAI SYLLABLE NGGA*/
+ RTUNI_ALPHA, /* U+00a56d: VAI SYLLABLE GA*/
+ RTUNI_ALPHA, /* U+00a56e: VAI SYLLABLE MA*/
+ RTUNI_ALPHA, /* U+00a56f: VAI SYLLABLE NA*/
+ RTUNI_ALPHA, /* U+00a570: VAI SYLLABLE NYA*/
+ RTUNI_ALPHA, /* U+00a571: VAI SYLLABLE OO*/
+ RTUNI_ALPHA, /* U+00a572: VAI SYLLABLE OON*/
+ RTUNI_ALPHA, /* U+00a573: VAI SYLLABLE HOO*/
+ RTUNI_ALPHA, /* U+00a574: VAI SYLLABLE WOO*/
+ RTUNI_ALPHA, /* U+00a575: VAI SYLLABLE WOON*/
+ RTUNI_ALPHA, /* U+00a576: VAI SYLLABLE POO*/
+ RTUNI_ALPHA, /* U+00a577: VAI SYLLABLE BHOO*/
+ RTUNI_ALPHA, /* U+00a578: VAI SYLLABLE BOO*/
+ RTUNI_ALPHA, /* U+00a579: VAI SYLLABLE MBOO*/
+ RTUNI_ALPHA, /* U+00a57a: VAI SYLLABLE KPOO*/
+ RTUNI_ALPHA, /* U+00a57b: VAI SYLLABLE MGBOO*/
+ RTUNI_ALPHA, /* U+00a57c: VAI SYLLABLE GBOO*/
+ RTUNI_ALPHA, /* U+00a57d: VAI SYLLABLE FOO*/
+ RTUNI_ALPHA, /* U+00a57e: VAI SYLLABLE VOO*/
+ RTUNI_ALPHA, /* U+00a57f: VAI SYLLABLE TOO*/
+ RTUNI_ALPHA, /* U+00a580: VAI SYLLABLE THOO*/
+ RTUNI_ALPHA, /* U+00a581: VAI SYLLABLE DHOO*/
+ RTUNI_ALPHA, /* U+00a582: VAI SYLLABLE DHHOO*/
+ RTUNI_ALPHA, /* U+00a583: VAI SYLLABLE LOO*/
+ RTUNI_ALPHA, /* U+00a584: VAI SYLLABLE ROO*/
+ RTUNI_ALPHA, /* U+00a585: VAI SYLLABLE DOO*/
+ RTUNI_ALPHA, /* U+00a586: VAI SYLLABLE NDOO*/
+ RTUNI_ALPHA, /* U+00a587: VAI SYLLABLE SOO*/
+ RTUNI_ALPHA, /* U+00a588: VAI SYLLABLE SHOO*/
+ RTUNI_ALPHA, /* U+00a589: VAI SYLLABLE ZOO*/
+ RTUNI_ALPHA, /* U+00a58a: VAI SYLLABLE ZHOO*/
+ RTUNI_ALPHA, /* U+00a58b: VAI SYLLABLE COO*/
+ RTUNI_ALPHA, /* U+00a58c: VAI SYLLABLE JOO*/
+ RTUNI_ALPHA, /* U+00a58d: VAI SYLLABLE NJOO*/
+ RTUNI_ALPHA, /* U+00a58e: VAI SYLLABLE YOO*/
+ RTUNI_ALPHA, /* U+00a58f: VAI SYLLABLE KOO*/
+ RTUNI_ALPHA, /* U+00a590: VAI SYLLABLE NGGOO*/
+ RTUNI_ALPHA, /* U+00a591: VAI SYLLABLE GOO*/
+ RTUNI_ALPHA, /* U+00a592: VAI SYLLABLE MOO*/
+ RTUNI_ALPHA, /* U+00a593: VAI SYLLABLE NOO*/
+ RTUNI_ALPHA, /* U+00a594: VAI SYLLABLE NYOO*/
+ RTUNI_ALPHA, /* U+00a595: VAI SYLLABLE U*/
+ RTUNI_ALPHA, /* U+00a596: VAI SYLLABLE UN*/
+ RTUNI_ALPHA, /* U+00a597: VAI SYLLABLE HU*/
+ RTUNI_ALPHA, /* U+00a598: VAI SYLLABLE HUN*/
+ RTUNI_ALPHA, /* U+00a599: VAI SYLLABLE WU*/
+ RTUNI_ALPHA, /* U+00a59a: VAI SYLLABLE WUN*/
+ RTUNI_ALPHA, /* U+00a59b: VAI SYLLABLE PU*/
+ RTUNI_ALPHA, /* U+00a59c: VAI SYLLABLE BHU*/
+ RTUNI_ALPHA, /* U+00a59d: VAI SYLLABLE BU*/
+ RTUNI_ALPHA, /* U+00a59e: VAI SYLLABLE MBU*/
+ RTUNI_ALPHA, /* U+00a59f: VAI SYLLABLE KPU*/
+ RTUNI_ALPHA, /* U+00a5a0: VAI SYLLABLE MGBU*/
+ RTUNI_ALPHA, /* U+00a5a1: VAI SYLLABLE GBU*/
+ RTUNI_ALPHA, /* U+00a5a2: VAI SYLLABLE FU*/
+ RTUNI_ALPHA, /* U+00a5a3: VAI SYLLABLE VU*/
+ RTUNI_ALPHA, /* U+00a5a4: VAI SYLLABLE TU*/
+ RTUNI_ALPHA, /* U+00a5a5: VAI SYLLABLE THU*/
+ RTUNI_ALPHA, /* U+00a5a6: VAI SYLLABLE DHU*/
+ RTUNI_ALPHA, /* U+00a5a7: VAI SYLLABLE DHHU*/
+ RTUNI_ALPHA, /* U+00a5a8: VAI SYLLABLE LU*/
+ RTUNI_ALPHA, /* U+00a5a9: VAI SYLLABLE RU*/
+ RTUNI_ALPHA, /* U+00a5aa: VAI SYLLABLE DU*/
+ RTUNI_ALPHA, /* U+00a5ab: VAI SYLLABLE NDU*/
+ RTUNI_ALPHA, /* U+00a5ac: VAI SYLLABLE SU*/
+ RTUNI_ALPHA, /* U+00a5ad: VAI SYLLABLE SHU*/
+ RTUNI_ALPHA, /* U+00a5ae: VAI SYLLABLE ZU*/
+ RTUNI_ALPHA, /* U+00a5af: VAI SYLLABLE ZHU*/
+ RTUNI_ALPHA, /* U+00a5b0: VAI SYLLABLE CU*/
+ RTUNI_ALPHA, /* U+00a5b1: VAI SYLLABLE JU*/
+ RTUNI_ALPHA, /* U+00a5b2: VAI SYLLABLE NJU*/
+ RTUNI_ALPHA, /* U+00a5b3: VAI SYLLABLE YU*/
+ RTUNI_ALPHA, /* U+00a5b4: VAI SYLLABLE KU*/
+ RTUNI_ALPHA, /* U+00a5b5: VAI SYLLABLE NGGU*/
+ RTUNI_ALPHA, /* U+00a5b6: VAI SYLLABLE GU*/
+ RTUNI_ALPHA, /* U+00a5b7: VAI SYLLABLE MU*/
+ RTUNI_ALPHA, /* U+00a5b8: VAI SYLLABLE NU*/
+ RTUNI_ALPHA, /* U+00a5b9: VAI SYLLABLE NYU*/
+ RTUNI_ALPHA, /* U+00a5ba: VAI SYLLABLE O*/
+ RTUNI_ALPHA, /* U+00a5bb: VAI SYLLABLE ON*/
+ RTUNI_ALPHA, /* U+00a5bc: VAI SYLLABLE NGON*/
+ RTUNI_ALPHA, /* U+00a5bd: VAI SYLLABLE HO*/
+ RTUNI_ALPHA, /* U+00a5be: VAI SYLLABLE HON*/
+ RTUNI_ALPHA, /* U+00a5bf: VAI SYLLABLE WO*/
+ RTUNI_ALPHA, /* U+00a5c0: VAI SYLLABLE WON*/
+ RTUNI_ALPHA, /* U+00a5c1: VAI SYLLABLE PO*/
+ RTUNI_ALPHA, /* U+00a5c2: VAI SYLLABLE BHO*/
+ RTUNI_ALPHA, /* U+00a5c3: VAI SYLLABLE BO*/
+ RTUNI_ALPHA, /* U+00a5c4: VAI SYLLABLE MBO*/
+ RTUNI_ALPHA, /* U+00a5c5: VAI SYLLABLE KPO*/
+ RTUNI_ALPHA, /* U+00a5c6: VAI SYLLABLE MGBO*/
+ RTUNI_ALPHA, /* U+00a5c7: VAI SYLLABLE GBO*/
+ RTUNI_ALPHA, /* U+00a5c8: VAI SYLLABLE GBON*/
+ RTUNI_ALPHA, /* U+00a5c9: VAI SYLLABLE FO*/
+ RTUNI_ALPHA, /* U+00a5ca: VAI SYLLABLE VO*/
+ RTUNI_ALPHA, /* U+00a5cb: VAI SYLLABLE TO*/
+ RTUNI_ALPHA, /* U+00a5cc: VAI SYLLABLE THO*/
+ RTUNI_ALPHA, /* U+00a5cd: VAI SYLLABLE DHO*/
+ RTUNI_ALPHA, /* U+00a5ce: VAI SYLLABLE DHHO*/
+ RTUNI_ALPHA, /* U+00a5cf: VAI SYLLABLE LO*/
+ RTUNI_ALPHA, /* U+00a5d0: VAI SYLLABLE RO*/
+ RTUNI_ALPHA, /* U+00a5d1: VAI SYLLABLE DO*/
+ RTUNI_ALPHA, /* U+00a5d2: VAI SYLLABLE NDO*/
+ RTUNI_ALPHA, /* U+00a5d3: VAI SYLLABLE SO*/
+ RTUNI_ALPHA, /* U+00a5d4: VAI SYLLABLE SHO*/
+ RTUNI_ALPHA, /* U+00a5d5: VAI SYLLABLE ZO*/
+ RTUNI_ALPHA, /* U+00a5d6: VAI SYLLABLE ZHO*/
+ RTUNI_ALPHA, /* U+00a5d7: VAI SYLLABLE CO*/
+ RTUNI_ALPHA, /* U+00a5d8: VAI SYLLABLE JO*/
+ RTUNI_ALPHA, /* U+00a5d9: VAI SYLLABLE NJO*/
+ RTUNI_ALPHA, /* U+00a5da: VAI SYLLABLE YO*/
+ RTUNI_ALPHA, /* U+00a5db: VAI SYLLABLE KO*/
+ RTUNI_ALPHA, /* U+00a5dc: VAI SYLLABLE NGGO*/
+ RTUNI_ALPHA, /* U+00a5dd: VAI SYLLABLE GO*/
+ RTUNI_ALPHA, /* U+00a5de: VAI SYLLABLE MO*/
+ RTUNI_ALPHA, /* U+00a5df: VAI SYLLABLE NO*/
+ RTUNI_ALPHA, /* U+00a5e0: VAI SYLLABLE NYO*/
+ RTUNI_ALPHA, /* U+00a5e1: VAI SYLLABLE E*/
+ RTUNI_ALPHA, /* U+00a5e2: VAI SYLLABLE EN*/
+ RTUNI_ALPHA, /* U+00a5e3: VAI SYLLABLE NGEN*/
+ RTUNI_ALPHA, /* U+00a5e4: VAI SYLLABLE HE*/
+ RTUNI_ALPHA, /* U+00a5e5: VAI SYLLABLE HEN*/
+ RTUNI_ALPHA, /* U+00a5e6: VAI SYLLABLE WE*/
+ RTUNI_ALPHA, /* U+00a5e7: VAI SYLLABLE WEN*/
+ RTUNI_ALPHA, /* U+00a5e8: VAI SYLLABLE PE*/
+ RTUNI_ALPHA, /* U+00a5e9: VAI SYLLABLE BHE*/
+ RTUNI_ALPHA, /* U+00a5ea: VAI SYLLABLE BE*/
+ RTUNI_ALPHA, /* U+00a5eb: VAI SYLLABLE MBE*/
+ RTUNI_ALPHA, /* U+00a5ec: VAI SYLLABLE KPE*/
+ RTUNI_ALPHA, /* U+00a5ed: VAI SYLLABLE KPEN*/
+ RTUNI_ALPHA, /* U+00a5ee: VAI SYLLABLE MGBE*/
+ RTUNI_ALPHA, /* U+00a5ef: VAI SYLLABLE GBE*/
+ RTUNI_ALPHA, /* U+00a5f0: VAI SYLLABLE GBEN*/
+ RTUNI_ALPHA, /* U+00a5f1: VAI SYLLABLE FE*/
+ RTUNI_ALPHA, /* U+00a5f2: VAI SYLLABLE VE*/
+ RTUNI_ALPHA, /* U+00a5f3: VAI SYLLABLE TE*/
+ RTUNI_ALPHA, /* U+00a5f4: VAI SYLLABLE THE*/
+ RTUNI_ALPHA, /* U+00a5f5: VAI SYLLABLE DHE*/
+ RTUNI_ALPHA, /* U+00a5f6: VAI SYLLABLE DHHE*/
+ RTUNI_ALPHA, /* U+00a5f7: VAI SYLLABLE LE*/
+ RTUNI_ALPHA, /* U+00a5f8: VAI SYLLABLE RE*/
+ RTUNI_ALPHA, /* U+00a5f9: VAI SYLLABLE DE*/
+ RTUNI_ALPHA, /* U+00a5fa: VAI SYLLABLE NDE*/
+ RTUNI_ALPHA, /* U+00a5fb: VAI SYLLABLE SE*/
+ RTUNI_ALPHA, /* U+00a5fc: VAI SYLLABLE SHE*/
+ RTUNI_ALPHA, /* U+00a5fd: VAI SYLLABLE ZE*/
+ RTUNI_ALPHA, /* U+00a5fe: VAI SYLLABLE ZHE*/
+ RTUNI_ALPHA, /* U+00a5ff: VAI SYLLABLE CE*/
+ RTUNI_ALPHA, /* U+00a600: VAI SYLLABLE JE*/
+ RTUNI_ALPHA, /* U+00a601: VAI SYLLABLE NJE*/
+ RTUNI_ALPHA, /* U+00a602: VAI SYLLABLE YE*/
+ RTUNI_ALPHA, /* U+00a603: VAI SYLLABLE KE*/
+ RTUNI_ALPHA, /* U+00a604: VAI SYLLABLE NGGE*/
+ RTUNI_ALPHA, /* U+00a605: VAI SYLLABLE NGGEN*/
+ RTUNI_ALPHA, /* U+00a606: VAI SYLLABLE GE*/
+ RTUNI_ALPHA, /* U+00a607: VAI SYLLABLE GEN*/
+ RTUNI_ALPHA, /* U+00a608: VAI SYLLABLE ME*/
+ RTUNI_ALPHA, /* U+00a609: VAI SYLLABLE NE*/
+ RTUNI_ALPHA, /* U+00a60a: VAI SYLLABLE NYE*/
+ RTUNI_ALPHA, /* U+00a60b: VAI SYLLABLE NG*/
+ RTUNI_ALPHA, /* U+00a60c: VAI SYLLABLE LENGTHENER*/
+ 0, /* U+00a60d: VAI COMMA*/
+ 0, /* U+00a60e: VAI FULL STOP*/
+ 0, /* U+00a60f: VAI QUESTION MARK*/
+ RTUNI_ALPHA, /* U+00a610: VAI SYLLABLE NDOLE FA*/
+ RTUNI_ALPHA, /* U+00a611: VAI SYLLABLE NDOLE KA*/
+ RTUNI_ALPHA, /* U+00a612: VAI SYLLABLE NDOLE SOO*/
+ RTUNI_ALPHA, /* U+00a613: VAI SYMBOL FEENG*/
+ RTUNI_ALPHA, /* U+00a614: VAI SYMBOL KEENG*/
+ RTUNI_ALPHA, /* U+00a615: VAI SYMBOL TING*/
+ RTUNI_ALPHA, /* U+00a616: VAI SYMBOL NII*/
+ RTUNI_ALPHA, /* U+00a617: VAI SYMBOL BANG*/
+ RTUNI_ALPHA, /* U+00a618: VAI SYMBOL FAA*/
+ RTUNI_ALPHA, /* U+00a619: VAI SYMBOL TAA*/
+ RTUNI_ALPHA, /* U+00a61a: VAI SYMBOL DANG*/
+ RTUNI_ALPHA, /* U+00a61b: VAI SYMBOL DOONG*/
+ RTUNI_ALPHA, /* U+00a61c: VAI SYMBOL KUNG*/
+ RTUNI_ALPHA, /* U+00a61d: VAI SYMBOL TONG*/
+ RTUNI_ALPHA, /* U+00a61e: VAI SYMBOL DO-O*/
+ RTUNI_ALPHA, /* U+00a61f: VAI SYMBOL JONG*/
+ RTUNI_DDIGIT, /* U+00a620: VAI DIGIT ZERO*/
+ RTUNI_DDIGIT, /* U+00a621: VAI DIGIT ONE*/
+ RTUNI_DDIGIT, /* U+00a622: VAI DIGIT TWO*/
+ RTUNI_DDIGIT, /* U+00a623: VAI DIGIT THREE*/
+ RTUNI_DDIGIT, /* U+00a624: VAI DIGIT FOUR*/
+ RTUNI_DDIGIT, /* U+00a625: VAI DIGIT FIVE*/
+ RTUNI_DDIGIT, /* U+00a626: VAI DIGIT SIX*/
+ RTUNI_DDIGIT, /* U+00a627: VAI DIGIT SEVEN*/
+ RTUNI_DDIGIT, /* U+00a628: VAI DIGIT EIGHT*/
+ RTUNI_DDIGIT, /* U+00a629: VAI DIGIT NINE*/
+ RTUNI_ALPHA, /* U+00a62a: VAI SYLLABLE NDOLE MA*/
+ RTUNI_ALPHA, /* U+00a62b: VAI SYLLABLE NDOLE DO*/
+ 0, /* U+00a62c: */
+ 0, /* U+00a62d: */
+ 0, /* U+00a62e: */
+ 0, /* U+00a62f: */
+ 0, /* U+00a630: */
+ 0, /* U+00a631: */
+ 0, /* U+00a632: */
+ 0, /* U+00a633: */
+ 0, /* U+00a634: */
+ 0, /* U+00a635: */
+ 0, /* U+00a636: */
+ 0, /* U+00a637: */
+ 0, /* U+00a638: */
+ 0, /* U+00a639: */
+ 0, /* U+00a63a: */
+ 0, /* U+00a63b: */
+ 0, /* U+00a63c: */
+ 0, /* U+00a63d: */
+ 0, /* U+00a63e: */
+ 0, /* U+00a63f: */
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a640: CYRILLIC CAPITAL LETTER ZEMLYA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a641: CYRILLIC SMALL LETTER ZEMLYA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a642: CYRILLIC CAPITAL LETTER DZELO*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a643: CYRILLIC SMALL LETTER DZELO*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a644: CYRILLIC CAPITAL LETTER REVERSED DZE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a645: CYRILLIC SMALL LETTER REVERSED DZE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a646: CYRILLIC CAPITAL LETTER IOTA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a647: CYRILLIC SMALL LETTER IOTA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a648: CYRILLIC CAPITAL LETTER DJERV*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a649: CYRILLIC SMALL LETTER DJERV*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a64a: CYRILLIC CAPITAL LETTER MONOGRAPH UK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a64b: CYRILLIC SMALL LETTER MONOGRAPH UK*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a64c: CYRILLIC CAPITAL LETTER BROAD OMEGA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a64d: CYRILLIC SMALL LETTER BROAD OMEGA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a64e: CYRILLIC CAPITAL LETTER NEUTRAL YER*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a64f: CYRILLIC SMALL LETTER NEUTRAL YER*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a650: CYRILLIC CAPITAL LETTER YERU WITH BACK YER*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a651: CYRILLIC SMALL LETTER YERU WITH BACK YER*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a652: CYRILLIC CAPITAL LETTER IOTIFIED YAT*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a653: CYRILLIC SMALL LETTER IOTIFIED YAT*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a654: CYRILLIC CAPITAL LETTER REVERSED YU*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a655: CYRILLIC SMALL LETTER REVERSED YU*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a656: CYRILLIC CAPITAL LETTER IOTIFIED A*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a657: CYRILLIC SMALL LETTER IOTIFIED A*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a658: CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a659: CYRILLIC SMALL LETTER CLOSED LITTLE YUS*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a65a: CYRILLIC CAPITAL LETTER BLENDED YUS*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a65b: CYRILLIC SMALL LETTER BLENDED YUS*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a65c: CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a65d: CYRILLIC SMALL LETTER IOTIFIED CLOSED LITTLE YUS*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a65e: CYRILLIC CAPITAL LETTER YN*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a65f: CYRILLIC SMALL LETTER YN*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a660: CYRILLIC CAPITAL LETTER REVERSED TSE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a661: CYRILLIC SMALL LETTER REVERSED TSE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a662: CYRILLIC CAPITAL LETTER SOFT DE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a663: CYRILLIC SMALL LETTER SOFT DE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a664: CYRILLIC CAPITAL LETTER SOFT EL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a665: CYRILLIC SMALL LETTER SOFT EL*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a666: CYRILLIC CAPITAL LETTER SOFT EM*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a667: CYRILLIC SMALL LETTER SOFT EM*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a668: CYRILLIC CAPITAL LETTER MONOCULAR O*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a669: CYRILLIC SMALL LETTER MONOCULAR O*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a66a: CYRILLIC CAPITAL LETTER BINOCULAR O*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a66b: CYRILLIC SMALL LETTER BINOCULAR O*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a66c: CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a66d: CYRILLIC SMALL LETTER DOUBLE MONOCULAR O*/
+ RTUNI_ALPHA, /* U+00a66e: CYRILLIC LETTER MULTIOCULAR O*/
+ 0, /* U+00a66f: COMBINING CYRILLIC VZMET*/
+ 0, /* U+00a670: COMBINING CYRILLIC TEN MILLIONS SIGN*/
+ 0, /* U+00a671: COMBINING CYRILLIC HUNDRED MILLIONS SIGN*/
+ 0, /* U+00a672: COMBINING CYRILLIC THOUSAND MILLIONS SIGN*/
+ 0, /* U+00a673: SLAVONIC ASTERISK*/
+ RTUNI_ALPHA, /* U+00a674: COMBINING CYRILLIC LETTER UKRAINIAN IE*/
+ RTUNI_ALPHA, /* U+00a675: COMBINING CYRILLIC LETTER I*/
+ RTUNI_ALPHA, /* U+00a676: COMBINING CYRILLIC LETTER YI*/
+ RTUNI_ALPHA, /* U+00a677: COMBINING CYRILLIC LETTER U*/
+ RTUNI_ALPHA, /* U+00a678: COMBINING CYRILLIC LETTER HARD SIGN*/
+ RTUNI_ALPHA, /* U+00a679: COMBINING CYRILLIC LETTER YERU*/
+ RTUNI_ALPHA, /* U+00a67a: COMBINING CYRILLIC LETTER SOFT SIGN*/
+ RTUNI_ALPHA, /* U+00a67b: COMBINING CYRILLIC LETTER OMEGA*/
+ 0, /* U+00a67c: COMBINING CYRILLIC KAVYKA*/
+ 0, /* U+00a67d: COMBINING CYRILLIC PAYEROK*/
+ 0, /* U+00a67e: CYRILLIC KAVYKA*/
+ RTUNI_ALPHA, /* U+00a67f: CYRILLIC PAYEROK*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a680: CYRILLIC CAPITAL LETTER DWE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a681: CYRILLIC SMALL LETTER DWE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a682: CYRILLIC CAPITAL LETTER DZWE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a683: CYRILLIC SMALL LETTER DZWE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a684: CYRILLIC CAPITAL LETTER ZHWE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a685: CYRILLIC SMALL LETTER ZHWE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a686: CYRILLIC CAPITAL LETTER CCHE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a687: CYRILLIC SMALL LETTER CCHE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a688: CYRILLIC CAPITAL LETTER DZZE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a689: CYRILLIC SMALL LETTER DZZE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a68a: CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a68b: CYRILLIC SMALL LETTER TE WITH MIDDLE HOOK*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a68c: CYRILLIC CAPITAL LETTER TWE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a68d: CYRILLIC SMALL LETTER TWE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a68e: CYRILLIC CAPITAL LETTER TSWE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a68f: CYRILLIC SMALL LETTER TSWE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a690: CYRILLIC CAPITAL LETTER TSSE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a691: CYRILLIC SMALL LETTER TSSE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a692: CYRILLIC CAPITAL LETTER TCHE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a693: CYRILLIC SMALL LETTER TCHE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a694: CYRILLIC CAPITAL LETTER HWE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a695: CYRILLIC SMALL LETTER HWE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a696: CYRILLIC CAPITAL LETTER SHWE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a697: CYRILLIC SMALL LETTER SHWE*/
+ 0, /* U+00a698: */
+ 0, /* U+00a699: */
+ 0, /* U+00a69a: */
+ 0, /* U+00a69b: */
+ 0, /* U+00a69c: */
+ 0, /* U+00a69d: */
+ 0, /* U+00a69e: */
+ RTUNI_ALPHA, /* U+00a69f: COMBINING CYRILLIC LETTER IOTIFIED E*/
+ RTUNI_ALPHA, /* U+00a6a0: BAMUM LETTER A*/
+ RTUNI_ALPHA, /* U+00a6a1: BAMUM LETTER KA*/
+ RTUNI_ALPHA, /* U+00a6a2: BAMUM LETTER U*/
+ RTUNI_ALPHA, /* U+00a6a3: BAMUM LETTER KU*/
+ RTUNI_ALPHA, /* U+00a6a4: BAMUM LETTER EE*/
+ RTUNI_ALPHA, /* U+00a6a5: BAMUM LETTER REE*/
+ RTUNI_ALPHA, /* U+00a6a6: BAMUM LETTER TAE*/
+ RTUNI_ALPHA, /* U+00a6a7: BAMUM LETTER O*/
+ RTUNI_ALPHA, /* U+00a6a8: BAMUM LETTER NYI*/
+ RTUNI_ALPHA, /* U+00a6a9: BAMUM LETTER I*/
+ RTUNI_ALPHA, /* U+00a6aa: BAMUM LETTER LA*/
+ RTUNI_ALPHA, /* U+00a6ab: BAMUM LETTER PA*/
+ RTUNI_ALPHA, /* U+00a6ac: BAMUM LETTER RII*/
+ RTUNI_ALPHA, /* U+00a6ad: BAMUM LETTER RIEE*/
+ RTUNI_ALPHA, /* U+00a6ae: BAMUM LETTER LEEEE*/
+ RTUNI_ALPHA, /* U+00a6af: BAMUM LETTER MEEEE*/
+ RTUNI_ALPHA, /* U+00a6b0: BAMUM LETTER TAA*/
+ RTUNI_ALPHA, /* U+00a6b1: BAMUM LETTER NDAA*/
+ RTUNI_ALPHA, /* U+00a6b2: BAMUM LETTER NJAEM*/
+ RTUNI_ALPHA, /* U+00a6b3: BAMUM LETTER M*/
+ RTUNI_ALPHA, /* U+00a6b4: BAMUM LETTER SUU*/
+ RTUNI_ALPHA, /* U+00a6b5: BAMUM LETTER MU*/
+ RTUNI_ALPHA, /* U+00a6b6: BAMUM LETTER SHII*/
+ RTUNI_ALPHA, /* U+00a6b7: BAMUM LETTER SI*/
+ RTUNI_ALPHA, /* U+00a6b8: BAMUM LETTER SHEUX*/
+ RTUNI_ALPHA, /* U+00a6b9: BAMUM LETTER SEUX*/
+ RTUNI_ALPHA, /* U+00a6ba: BAMUM LETTER KYEE*/
+ RTUNI_ALPHA, /* U+00a6bb: BAMUM LETTER KET*/
+ RTUNI_ALPHA, /* U+00a6bc: BAMUM LETTER NUAE*/
+ RTUNI_ALPHA, /* U+00a6bd: BAMUM LETTER NU*/
+ RTUNI_ALPHA, /* U+00a6be: BAMUM LETTER NJUAE*/
+ RTUNI_ALPHA, /* U+00a6bf: BAMUM LETTER YOQ*/
+ RTUNI_ALPHA, /* U+00a6c0: BAMUM LETTER SHU*/
+ RTUNI_ALPHA, /* U+00a6c1: BAMUM LETTER YUQ*/
+ RTUNI_ALPHA, /* U+00a6c2: BAMUM LETTER YA*/
+ RTUNI_ALPHA, /* U+00a6c3: BAMUM LETTER NSHA*/
+ RTUNI_ALPHA, /* U+00a6c4: BAMUM LETTER KEUX*/
+ RTUNI_ALPHA, /* U+00a6c5: BAMUM LETTER PEUX*/
+ RTUNI_ALPHA, /* U+00a6c6: BAMUM LETTER NJEE*/
+ RTUNI_ALPHA, /* U+00a6c7: BAMUM LETTER NTEE*/
+ RTUNI_ALPHA, /* U+00a6c8: BAMUM LETTER PUE*/
+ RTUNI_ALPHA, /* U+00a6c9: BAMUM LETTER WUE*/
+ RTUNI_ALPHA, /* U+00a6ca: BAMUM LETTER PEE*/
+ RTUNI_ALPHA, /* U+00a6cb: BAMUM LETTER FEE*/
+ RTUNI_ALPHA, /* U+00a6cc: BAMUM LETTER RU*/
+ RTUNI_ALPHA, /* U+00a6cd: BAMUM LETTER LU*/
+ RTUNI_ALPHA, /* U+00a6ce: BAMUM LETTER MI*/
+ RTUNI_ALPHA, /* U+00a6cf: BAMUM LETTER NI*/
+ RTUNI_ALPHA, /* U+00a6d0: BAMUM LETTER REUX*/
+ RTUNI_ALPHA, /* U+00a6d1: BAMUM LETTER RAE*/
+ RTUNI_ALPHA, /* U+00a6d2: BAMUM LETTER KEN*/
+ RTUNI_ALPHA, /* U+00a6d3: BAMUM LETTER NGKWAEN*/
+ RTUNI_ALPHA, /* U+00a6d4: BAMUM LETTER NGGA*/
+ RTUNI_ALPHA, /* U+00a6d5: BAMUM LETTER NGA*/
+ RTUNI_ALPHA, /* U+00a6d6: BAMUM LETTER SHO*/
+ RTUNI_ALPHA, /* U+00a6d7: BAMUM LETTER PUAE*/
+ RTUNI_ALPHA, /* U+00a6d8: BAMUM LETTER FU*/
+ RTUNI_ALPHA, /* U+00a6d9: BAMUM LETTER FOM*/
+ RTUNI_ALPHA, /* U+00a6da: BAMUM LETTER WA*/
+ RTUNI_ALPHA, /* U+00a6db: BAMUM LETTER NA*/
+ RTUNI_ALPHA, /* U+00a6dc: BAMUM LETTER LI*/
+ RTUNI_ALPHA, /* U+00a6dd: BAMUM LETTER PI*/
+ RTUNI_ALPHA, /* U+00a6de: BAMUM LETTER LOQ*/
+ RTUNI_ALPHA, /* U+00a6df: BAMUM LETTER KO*/
+ RTUNI_ALPHA, /* U+00a6e0: BAMUM LETTER MBEN*/
+ RTUNI_ALPHA, /* U+00a6e1: BAMUM LETTER REN*/
+ RTUNI_ALPHA, /* U+00a6e2: BAMUM LETTER MEN*/
+ RTUNI_ALPHA, /* U+00a6e3: BAMUM LETTER MA*/
+ RTUNI_ALPHA, /* U+00a6e4: BAMUM LETTER TI*/
+ RTUNI_ALPHA, /* U+00a6e5: BAMUM LETTER KI*/
+ RTUNI_ALPHA, /* U+00a6e6: BAMUM LETTER MO*/
+ RTUNI_ALPHA, /* U+00a6e7: BAMUM LETTER MBAA*/
+ RTUNI_ALPHA, /* U+00a6e8: BAMUM LETTER TET*/
+ RTUNI_ALPHA, /* U+00a6e9: BAMUM LETTER KPA*/
+ RTUNI_ALPHA, /* U+00a6ea: BAMUM LETTER TEN*/
+ RTUNI_ALPHA, /* U+00a6eb: BAMUM LETTER NTUU*/
+ RTUNI_ALPHA, /* U+00a6ec: BAMUM LETTER SAMBA*/
+ RTUNI_ALPHA, /* U+00a6ed: BAMUM LETTER FAAMAE*/
+ RTUNI_ALPHA, /* U+00a6ee: BAMUM LETTER KOVUU*/
+ RTUNI_ALPHA, /* U+00a6ef: BAMUM LETTER KOGHOM*/
+ 0, /* U+00a6f0: BAMUM COMBINING MARK KOQNDON*/
+ 0, /* U+00a6f1: BAMUM COMBINING MARK TUKWENTIS*/
+ 0, /* U+00a6f2: BAMUM NJAEMLI*/
+ 0, /* U+00a6f3: BAMUM FULL STOP*/
+ 0, /* U+00a6f4: BAMUM COLON*/
+ 0, /* U+00a6f5: BAMUM COMMA*/
+ 0, /* U+00a6f6: BAMUM SEMICOLON*/
+ 0, /* U+00a6f7: BAMUM QUESTION MARK*/
+ 0, /* U+00a6f8: */
+ 0, /* U+00a6f9: */
+ 0, /* U+00a6fa: */
+ 0, /* U+00a6fb: */
+ 0, /* U+00a6fc: */
+ 0, /* U+00a6fd: */
+ 0, /* U+00a6fe: */
+ 0, /* U+00a6ff: */
+ 0, /* U+00a700: MODIFIER LETTER CHINESE TONE YIN PING*/
+ 0, /* U+00a701: MODIFIER LETTER CHINESE TONE YANG PING*/
+ 0, /* U+00a702: MODIFIER LETTER CHINESE TONE YIN SHANG*/
+ 0, /* U+00a703: MODIFIER LETTER CHINESE TONE YANG SHANG*/
+ 0, /* U+00a704: MODIFIER LETTER CHINESE TONE YIN QU*/
+ 0, /* U+00a705: MODIFIER LETTER CHINESE TONE YANG QU*/
+ 0, /* U+00a706: MODIFIER LETTER CHINESE TONE YIN RU*/
+ 0, /* U+00a707: MODIFIER LETTER CHINESE TONE YANG RU*/
+ 0, /* U+00a708: MODIFIER LETTER EXTRA-HIGH DOTTED TONE BAR*/
+ 0, /* U+00a709: MODIFIER LETTER HIGH DOTTED TONE BAR*/
+ 0, /* U+00a70a: MODIFIER LETTER MID DOTTED TONE BAR*/
+ 0, /* U+00a70b: MODIFIER LETTER LOW DOTTED TONE BAR*/
+ 0, /* U+00a70c: MODIFIER LETTER EXTRA-LOW DOTTED TONE BAR*/
+ 0, /* U+00a70d: MODIFIER LETTER EXTRA-HIGH DOTTED LEFT-STEM TONE BAR*/
+ 0, /* U+00a70e: MODIFIER LETTER HIGH DOTTED LEFT-STEM TONE BAR*/
+ 0, /* U+00a70f: MODIFIER LETTER MID DOTTED LEFT-STEM TONE BAR*/
+ 0, /* U+00a710: MODIFIER LETTER LOW DOTTED LEFT-STEM TONE BAR*/
+ 0, /* U+00a711: MODIFIER LETTER EXTRA-LOW DOTTED LEFT-STEM TONE BAR*/
+ 0, /* U+00a712: MODIFIER LETTER EXTRA-HIGH LEFT-STEM TONE BAR*/
+ 0, /* U+00a713: MODIFIER LETTER HIGH LEFT-STEM TONE BAR*/
+ 0, /* U+00a714: MODIFIER LETTER MID LEFT-STEM TONE BAR*/
+ 0, /* U+00a715: MODIFIER LETTER LOW LEFT-STEM TONE BAR*/
+ 0, /* U+00a716: MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR*/
+ RTUNI_ALPHA, /* U+00a717: MODIFIER LETTER DOT VERTICAL BAR*/
+ RTUNI_ALPHA, /* U+00a718: MODIFIER LETTER DOT SLASH*/
+ RTUNI_ALPHA, /* U+00a719: MODIFIER LETTER DOT HORIZONTAL BAR*/
+ RTUNI_ALPHA, /* U+00a71a: MODIFIER LETTER LOWER RIGHT CORNER ANGLE*/
+ RTUNI_ALPHA, /* U+00a71b: MODIFIER LETTER RAISED UP ARROW*/
+ RTUNI_ALPHA, /* U+00a71c: MODIFIER LETTER RAISED DOWN ARROW*/
+ RTUNI_ALPHA, /* U+00a71d: MODIFIER LETTER RAISED EXCLAMATION MARK*/
+ RTUNI_ALPHA, /* U+00a71e: MODIFIER LETTER RAISED INVERTED EXCLAMATION MARK*/
+ RTUNI_ALPHA, /* U+00a71f: MODIFIER LETTER LOW INVERTED EXCLAMATION MARK*/
+ 0, /* U+00a720: MODIFIER LETTER STRESS AND HIGH TONE*/
+ 0, /* U+00a721: MODIFIER LETTER STRESS AND LOW TONE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a722: LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a723: LATIN SMALL LETTER EGYPTOLOGICAL ALEF*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a724: LATIN CAPITAL LETTER EGYPTOLOGICAL AIN*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a725: LATIN SMALL LETTER EGYPTOLOGICAL AIN*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a726: LATIN CAPITAL LETTER HENG*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a727: LATIN SMALL LETTER HENG*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a728: LATIN CAPITAL LETTER TZ*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a729: LATIN SMALL LETTER TZ*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a72a: LATIN CAPITAL LETTER TRESILLO*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a72b: LATIN SMALL LETTER TRESILLO*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a72c: LATIN CAPITAL LETTER CUATRILLO*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a72d: LATIN SMALL LETTER CUATRILLO*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a72e: LATIN CAPITAL LETTER CUATRILLO WITH COMMA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a72f: LATIN SMALL LETTER CUATRILLO WITH COMMA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a730: LATIN LETTER SMALL CAPITAL F*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a731: LATIN LETTER SMALL CAPITAL S*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a732: LATIN CAPITAL LETTER AA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a733: LATIN SMALL LETTER AA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a734: LATIN CAPITAL LETTER AO*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a735: LATIN SMALL LETTER AO*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a736: LATIN CAPITAL LETTER AU*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a737: LATIN SMALL LETTER AU*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a738: LATIN CAPITAL LETTER AV*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a739: LATIN SMALL LETTER AV*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a73a: LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a73b: LATIN SMALL LETTER AV WITH HORIZONTAL BAR*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a73c: LATIN CAPITAL LETTER AY*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a73d: LATIN SMALL LETTER AY*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a73e: LATIN CAPITAL LETTER REVERSED C WITH DOT*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a73f: LATIN SMALL LETTER REVERSED C WITH DOT*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a740: LATIN CAPITAL LETTER K WITH STROKE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a741: LATIN SMALL LETTER K WITH STROKE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a742: LATIN CAPITAL LETTER K WITH DIAGONAL STROKE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a743: LATIN SMALL LETTER K WITH DIAGONAL STROKE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a744: LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a745: LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a746: LATIN CAPITAL LETTER BROKEN L*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a747: LATIN SMALL LETTER BROKEN L*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a748: LATIN CAPITAL LETTER L WITH HIGH STROKE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a749: LATIN SMALL LETTER L WITH HIGH STROKE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a74a: LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a74b: LATIN SMALL LETTER O WITH LONG STROKE OVERLAY*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a74c: LATIN CAPITAL LETTER O WITH LOOP*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a74d: LATIN SMALL LETTER O WITH LOOP*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a74e: LATIN CAPITAL LETTER OO*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a74f: LATIN SMALL LETTER OO*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a750: LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a751: LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a752: LATIN CAPITAL LETTER P WITH FLOURISH*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a753: LATIN SMALL LETTER P WITH FLOURISH*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a754: LATIN CAPITAL LETTER P WITH SQUIRREL TAIL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a755: LATIN SMALL LETTER P WITH SQUIRREL TAIL*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a756: LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a757: LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a758: LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a759: LATIN SMALL LETTER Q WITH DIAGONAL STROKE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a75a: LATIN CAPITAL LETTER R ROTUNDA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a75b: LATIN SMALL LETTER R ROTUNDA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a75c: LATIN CAPITAL LETTER RUM ROTUNDA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a75d: LATIN SMALL LETTER RUM ROTUNDA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a75e: LATIN CAPITAL LETTER V WITH DIAGONAL STROKE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a75f: LATIN SMALL LETTER V WITH DIAGONAL STROKE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a760: LATIN CAPITAL LETTER VY*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a761: LATIN SMALL LETTER VY*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a762: LATIN CAPITAL LETTER VISIGOTHIC Z*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a763: LATIN SMALL LETTER VISIGOTHIC Z*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a764: LATIN CAPITAL LETTER THORN WITH STROKE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a765: LATIN SMALL LETTER THORN WITH STROKE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a766: LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a767: LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a768: LATIN CAPITAL LETTER VEND*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a769: LATIN SMALL LETTER VEND*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a76a: LATIN CAPITAL LETTER ET*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a76b: LATIN SMALL LETTER ET*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a76c: LATIN CAPITAL LETTER IS*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a76d: LATIN SMALL LETTER IS*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a76e: LATIN CAPITAL LETTER CON*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a76f: LATIN SMALL LETTER CON*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a770: MODIFIER LETTER US*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a771: LATIN SMALL LETTER DUM*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a772: LATIN SMALL LETTER LUM*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a773: LATIN SMALL LETTER MUM*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a774: LATIN SMALL LETTER NUM*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a775: LATIN SMALL LETTER RUM*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a776: LATIN LETTER SMALL CAPITAL RUM*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a777: LATIN SMALL LETTER TUM*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a778: LATIN SMALL LETTER UM*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a779: LATIN CAPITAL LETTER INSULAR D*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a77a: LATIN SMALL LETTER INSULAR D*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a77b: LATIN CAPITAL LETTER INSULAR F*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a77c: LATIN SMALL LETTER INSULAR F*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a77d: LATIN CAPITAL LETTER INSULAR G*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a77e: LATIN CAPITAL LETTER TURNED INSULAR G*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a77f: LATIN SMALL LETTER TURNED INSULAR G*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a780: LATIN CAPITAL LETTER TURNED L*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a781: LATIN SMALL LETTER TURNED L*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a782: LATIN CAPITAL LETTER INSULAR R*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a783: LATIN SMALL LETTER INSULAR R*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a784: LATIN CAPITAL LETTER INSULAR S*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a785: LATIN SMALL LETTER INSULAR S*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a786: LATIN CAPITAL LETTER INSULAR T*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a787: LATIN SMALL LETTER INSULAR T*/
+ RTUNI_ALPHA, /* U+00a788: MODIFIER LETTER LOW CIRCUMFLEX ACCENT*/
+ 0, /* U+00a789: MODIFIER LETTER COLON*/
+ 0, /* U+00a78a: MODIFIER LETTER SHORT EQUALS SIGN*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a78b: LATIN CAPITAL LETTER SALTILLO*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a78c: LATIN SMALL LETTER SALTILLO*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a78d: LATIN CAPITAL LETTER TURNED H*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a78e: LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT*/
+ 0, /* U+00a78f: */
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a790: LATIN CAPITAL LETTER N WITH DESCENDER*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a791: LATIN SMALL LETTER N WITH DESCENDER*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a792: LATIN CAPITAL LETTER C WITH BAR*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a793: LATIN SMALL LETTER C WITH BAR*/
+ 0, /* U+00a794: */
+ 0, /* U+00a795: */
+ 0, /* U+00a796: */
+ 0, /* U+00a797: */
+ 0, /* U+00a798: */
+ 0, /* U+00a799: */
+ 0, /* U+00a79a: */
+ 0, /* U+00a79b: */
+ 0, /* U+00a79c: */
+ 0, /* U+00a79d: */
+ 0, /* U+00a79e: */
+ 0, /* U+00a79f: */
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a7a0: LATIN CAPITAL LETTER G WITH OBLIQUE STROKE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a7a1: LATIN SMALL LETTER G WITH OBLIQUE STROKE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a7a2: LATIN CAPITAL LETTER K WITH OBLIQUE STROKE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a7a3: LATIN SMALL LETTER K WITH OBLIQUE STROKE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a7a4: LATIN CAPITAL LETTER N WITH OBLIQUE STROKE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a7a5: LATIN SMALL LETTER N WITH OBLIQUE STROKE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a7a6: LATIN CAPITAL LETTER R WITH OBLIQUE STROKE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a7a7: LATIN SMALL LETTER R WITH OBLIQUE STROKE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a7a8: LATIN CAPITAL LETTER S WITH OBLIQUE STROKE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a7a9: LATIN SMALL LETTER S WITH OBLIQUE STROKE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00a7aa: LATIN CAPITAL LETTER H WITH HOOK*/
+ 0, /* U+00a7ab: */
+ 0, /* U+00a7ac: */
+ 0, /* U+00a7ad: */
+ 0, /* U+00a7ae: */
+ 0, /* U+00a7af: */
+ 0, /* U+00a7b0: */
+ 0, /* U+00a7b1: */
+ 0, /* U+00a7b2: */
+ 0, /* U+00a7b3: */
+ 0, /* U+00a7b4: */
+ 0, /* U+00a7b5: */
+ 0, /* U+00a7b6: */
+ 0, /* U+00a7b7: */
+ 0, /* U+00a7b8: */
+ 0, /* U+00a7b9: */
+ 0, /* U+00a7ba: */
+ 0, /* U+00a7bb: */
+ 0, /* U+00a7bc: */
+ 0, /* U+00a7bd: */
+ 0, /* U+00a7be: */
+ 0, /* U+00a7bf: */
+ 0, /* U+00a7c0: */
+ 0, /* U+00a7c1: */
+ 0, /* U+00a7c2: */
+ 0, /* U+00a7c3: */
+ 0, /* U+00a7c4: */
+ 0, /* U+00a7c5: */
+ 0, /* U+00a7c6: */
+ 0, /* U+00a7c7: */
+ 0, /* U+00a7c8: */
+ 0, /* U+00a7c9: */
+ 0, /* U+00a7ca: */
+ 0, /* U+00a7cb: */
+ 0, /* U+00a7cc: */
+ 0, /* U+00a7cd: */
+ 0, /* U+00a7ce: */
+ 0, /* U+00a7cf: */
+ 0, /* U+00a7d0: */
+ 0, /* U+00a7d1: */
+ 0, /* U+00a7d2: */
+ 0, /* U+00a7d3: */
+ 0, /* U+00a7d4: */
+ 0, /* U+00a7d5: */
+ 0, /* U+00a7d6: */
+ 0, /* U+00a7d7: */
+ 0, /* U+00a7d8: */
+ 0, /* U+00a7d9: */
+ 0, /* U+00a7da: */
+ 0, /* U+00a7db: */
+ 0, /* U+00a7dc: */
+ 0, /* U+00a7dd: */
+ 0, /* U+00a7de: */
+ 0, /* U+00a7df: */
+ 0, /* U+00a7e0: */
+ 0, /* U+00a7e1: */
+ 0, /* U+00a7e2: */
+ 0, /* U+00a7e3: */
+ 0, /* U+00a7e4: */
+ 0, /* U+00a7e5: */
+ 0, /* U+00a7e6: */
+ 0, /* U+00a7e7: */
+ 0, /* U+00a7e8: */
+ 0, /* U+00a7e9: */
+ 0, /* U+00a7ea: */
+ 0, /* U+00a7eb: */
+ 0, /* U+00a7ec: */
+ 0, /* U+00a7ed: */
+ 0, /* U+00a7ee: */
+ 0, /* U+00a7ef: */
+ 0, /* U+00a7f0: */
+ 0, /* U+00a7f1: */
+ 0, /* U+00a7f2: */
+ 0, /* U+00a7f3: */
+ 0, /* U+00a7f4: */
+ 0, /* U+00a7f5: */
+ 0, /* U+00a7f6: */
+ 0, /* U+00a7f7: */
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a7f8: MODIFIER LETTER CAPITAL H WITH STROKE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a7f9: MODIFIER LETTER SMALL LIGATURE OE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00a7fa: LATIN LETTER SMALL CAPITAL TURNED M*/
+ RTUNI_ALPHA, /* U+00a7fb: LATIN EPIGRAPHIC LETTER REVERSED F*/
+ RTUNI_ALPHA, /* U+00a7fc: LATIN EPIGRAPHIC LETTER REVERSED P*/
+ RTUNI_ALPHA, /* U+00a7fd: LATIN EPIGRAPHIC LETTER INVERTED M*/
+ RTUNI_ALPHA, /* U+00a7fe: LATIN EPIGRAPHIC LETTER I LONGA*/
+ RTUNI_ALPHA, /* U+00a7ff: LATIN EPIGRAPHIC LETTER ARCHAIC M*/
+ RTUNI_ALPHA, /* U+00a800: SYLOTI NAGRI LETTER A*/
+ RTUNI_ALPHA, /* U+00a801: SYLOTI NAGRI LETTER I*/
+ 0, /* U+00a802: SYLOTI NAGRI SIGN DVISVARA*/
+ RTUNI_ALPHA, /* U+00a803: SYLOTI NAGRI LETTER U*/
+ RTUNI_ALPHA, /* U+00a804: SYLOTI NAGRI LETTER E*/
+ RTUNI_ALPHA, /* U+00a805: SYLOTI NAGRI LETTER O*/
+ 0, /* U+00a806: SYLOTI NAGRI SIGN HASANTA*/
+ RTUNI_ALPHA, /* U+00a807: SYLOTI NAGRI LETTER KO*/
+ RTUNI_ALPHA, /* U+00a808: SYLOTI NAGRI LETTER KHO*/
+ RTUNI_ALPHA, /* U+00a809: SYLOTI NAGRI LETTER GO*/
+ RTUNI_ALPHA, /* U+00a80a: SYLOTI NAGRI LETTER GHO*/
+ 0, /* U+00a80b: SYLOTI NAGRI SIGN ANUSVARA*/
+ RTUNI_ALPHA, /* U+00a80c: SYLOTI NAGRI LETTER CO*/
+ RTUNI_ALPHA, /* U+00a80d: SYLOTI NAGRI LETTER CHO*/
+ RTUNI_ALPHA, /* U+00a80e: SYLOTI NAGRI LETTER JO*/
+ RTUNI_ALPHA, /* U+00a80f: SYLOTI NAGRI LETTER JHO*/
+ RTUNI_ALPHA, /* U+00a810: SYLOTI NAGRI LETTER TTO*/
+ RTUNI_ALPHA, /* U+00a811: SYLOTI NAGRI LETTER TTHO*/
+ RTUNI_ALPHA, /* U+00a812: SYLOTI NAGRI LETTER DDO*/
+ RTUNI_ALPHA, /* U+00a813: SYLOTI NAGRI LETTER DDHO*/
+ RTUNI_ALPHA, /* U+00a814: SYLOTI NAGRI LETTER TO*/
+ RTUNI_ALPHA, /* U+00a815: SYLOTI NAGRI LETTER THO*/
+ RTUNI_ALPHA, /* U+00a816: SYLOTI NAGRI LETTER DO*/
+ RTUNI_ALPHA, /* U+00a817: SYLOTI NAGRI LETTER DHO*/
+ RTUNI_ALPHA, /* U+00a818: SYLOTI NAGRI LETTER NO*/
+ RTUNI_ALPHA, /* U+00a819: SYLOTI NAGRI LETTER PO*/
+ RTUNI_ALPHA, /* U+00a81a: SYLOTI NAGRI LETTER PHO*/
+ RTUNI_ALPHA, /* U+00a81b: SYLOTI NAGRI LETTER BO*/
+ RTUNI_ALPHA, /* U+00a81c: SYLOTI NAGRI LETTER BHO*/
+ RTUNI_ALPHA, /* U+00a81d: SYLOTI NAGRI LETTER MO*/
+ RTUNI_ALPHA, /* U+00a81e: SYLOTI NAGRI LETTER RO*/
+ RTUNI_ALPHA, /* U+00a81f: SYLOTI NAGRI LETTER LO*/
+ RTUNI_ALPHA, /* U+00a820: SYLOTI NAGRI LETTER RRO*/
+ RTUNI_ALPHA, /* U+00a821: SYLOTI NAGRI LETTER SO*/
+ RTUNI_ALPHA, /* U+00a822: SYLOTI NAGRI LETTER HO*/
+ RTUNI_ALPHA, /* U+00a823: SYLOTI NAGRI VOWEL SIGN A*/
+ RTUNI_ALPHA, /* U+00a824: SYLOTI NAGRI VOWEL SIGN I*/
+ RTUNI_ALPHA, /* U+00a825: SYLOTI NAGRI VOWEL SIGN U*/
+ RTUNI_ALPHA, /* U+00a826: SYLOTI NAGRI VOWEL SIGN E*/
+ RTUNI_ALPHA, /* U+00a827: SYLOTI NAGRI VOWEL SIGN OO*/
+ 0, /* U+00a828: SYLOTI NAGRI POETRY MARK-1*/
+ 0, /* U+00a829: SYLOTI NAGRI POETRY MARK-2*/
+ 0, /* U+00a82a: SYLOTI NAGRI POETRY MARK-3*/
+ 0, /* U+00a82b: SYLOTI NAGRI POETRY MARK-4*/
+ 0, /* U+00a82c: */
+ 0, /* U+00a82d: */
+ 0, /* U+00a82e: */
+ 0, /* U+00a82f: */
+ 0, /* U+00a830: NORTH INDIC FRACTION ONE QUARTER*/
+ 0, /* U+00a831: NORTH INDIC FRACTION ONE HALF*/
+ 0, /* U+00a832: NORTH INDIC FRACTION THREE QUARTERS*/
+ 0, /* U+00a833: NORTH INDIC FRACTION ONE SIXTEENTH*/
+ 0, /* U+00a834: NORTH INDIC FRACTION ONE EIGHTH*/
+ 0, /* U+00a835: NORTH INDIC FRACTION THREE SIXTEENTHS*/
+ 0, /* U+00a836: NORTH INDIC QUARTER MARK*/
+ 0, /* U+00a837: NORTH INDIC PLACEHOLDER MARK*/
+ 0, /* U+00a838: NORTH INDIC RUPEE MARK*/
+ 0, /* U+00a839: NORTH INDIC QUANTITY MARK*/
+ 0, /* U+00a83a: */
+ 0, /* U+00a83b: */
+ 0, /* U+00a83c: */
+ 0, /* U+00a83d: */
+ 0, /* U+00a83e: */
+ 0, /* U+00a83f: */
+ RTUNI_ALPHA, /* U+00a840: PHAGS-PA LETTER KA*/
+ RTUNI_ALPHA, /* U+00a841: PHAGS-PA LETTER KHA*/
+ RTUNI_ALPHA, /* U+00a842: PHAGS-PA LETTER GA*/
+ RTUNI_ALPHA, /* U+00a843: PHAGS-PA LETTER NGA*/
+ RTUNI_ALPHA, /* U+00a844: PHAGS-PA LETTER CA*/
+ RTUNI_ALPHA, /* U+00a845: PHAGS-PA LETTER CHA*/
+ RTUNI_ALPHA, /* U+00a846: PHAGS-PA LETTER JA*/
+ RTUNI_ALPHA, /* U+00a847: PHAGS-PA LETTER NYA*/
+ RTUNI_ALPHA, /* U+00a848: PHAGS-PA LETTER TA*/
+ RTUNI_ALPHA, /* U+00a849: PHAGS-PA LETTER THA*/
+ RTUNI_ALPHA, /* U+00a84a: PHAGS-PA LETTER DA*/
+ RTUNI_ALPHA, /* U+00a84b: PHAGS-PA LETTER NA*/
+ RTUNI_ALPHA, /* U+00a84c: PHAGS-PA LETTER PA*/
+ RTUNI_ALPHA, /* U+00a84d: PHAGS-PA LETTER PHA*/
+ RTUNI_ALPHA, /* U+00a84e: PHAGS-PA LETTER BA*/
+ RTUNI_ALPHA, /* U+00a84f: PHAGS-PA LETTER MA*/
+ RTUNI_ALPHA, /* U+00a850: PHAGS-PA LETTER TSA*/
+ RTUNI_ALPHA, /* U+00a851: PHAGS-PA LETTER TSHA*/
+ RTUNI_ALPHA, /* U+00a852: PHAGS-PA LETTER DZA*/
+ RTUNI_ALPHA, /* U+00a853: PHAGS-PA LETTER WA*/
+ RTUNI_ALPHA, /* U+00a854: PHAGS-PA LETTER ZHA*/
+ RTUNI_ALPHA, /* U+00a855: PHAGS-PA LETTER ZA*/
+ RTUNI_ALPHA, /* U+00a856: PHAGS-PA LETTER SMALL A*/
+ RTUNI_ALPHA, /* U+00a857: PHAGS-PA LETTER YA*/
+ RTUNI_ALPHA, /* U+00a858: PHAGS-PA LETTER RA*/
+ RTUNI_ALPHA, /* U+00a859: PHAGS-PA LETTER LA*/
+ RTUNI_ALPHA, /* U+00a85a: PHAGS-PA LETTER SHA*/
+ RTUNI_ALPHA, /* U+00a85b: PHAGS-PA LETTER SA*/
+ RTUNI_ALPHA, /* U+00a85c: PHAGS-PA LETTER HA*/
+ RTUNI_ALPHA, /* U+00a85d: PHAGS-PA LETTER A*/
+ RTUNI_ALPHA, /* U+00a85e: PHAGS-PA LETTER I*/
+ RTUNI_ALPHA, /* U+00a85f: PHAGS-PA LETTER U*/
+ RTUNI_ALPHA, /* U+00a860: PHAGS-PA LETTER E*/
+ RTUNI_ALPHA, /* U+00a861: PHAGS-PA LETTER O*/
+ RTUNI_ALPHA, /* U+00a862: PHAGS-PA LETTER QA*/
+ RTUNI_ALPHA, /* U+00a863: PHAGS-PA LETTER XA*/
+ RTUNI_ALPHA, /* U+00a864: PHAGS-PA LETTER FA*/
+ RTUNI_ALPHA, /* U+00a865: PHAGS-PA LETTER GGA*/
+ RTUNI_ALPHA, /* U+00a866: PHAGS-PA LETTER EE*/
+ RTUNI_ALPHA, /* U+00a867: PHAGS-PA SUBJOINED LETTER WA*/
+ RTUNI_ALPHA, /* U+00a868: PHAGS-PA SUBJOINED LETTER YA*/
+ RTUNI_ALPHA, /* U+00a869: PHAGS-PA LETTER TTA*/
+ RTUNI_ALPHA, /* U+00a86a: PHAGS-PA LETTER TTHA*/
+ RTUNI_ALPHA, /* U+00a86b: PHAGS-PA LETTER DDA*/
+ RTUNI_ALPHA, /* U+00a86c: PHAGS-PA LETTER NNA*/
+ RTUNI_ALPHA, /* U+00a86d: PHAGS-PA LETTER ALTERNATE YA*/
+ RTUNI_ALPHA, /* U+00a86e: PHAGS-PA LETTER VOICELESS SHA*/
+ RTUNI_ALPHA, /* U+00a86f: PHAGS-PA LETTER VOICED HA*/
+ RTUNI_ALPHA, /* U+00a870: PHAGS-PA LETTER ASPIRATED FA*/
+ RTUNI_ALPHA, /* U+00a871: PHAGS-PA SUBJOINED LETTER RA*/
+ RTUNI_ALPHA, /* U+00a872: PHAGS-PA SUPERFIXED LETTER RA*/
+ RTUNI_ALPHA, /* U+00a873: PHAGS-PA LETTER CANDRABINDU*/
+ 0, /* U+00a874: PHAGS-PA SINGLE HEAD MARK*/
+ 0, /* U+00a875: PHAGS-PA DOUBLE HEAD MARK*/
+ 0, /* U+00a876: PHAGS-PA MARK SHAD*/
+ 0, /* U+00a877: PHAGS-PA MARK DOUBLE SHAD*/
+ 0, /* U+00a878: */
+ 0, /* U+00a879: */
+ 0, /* U+00a87a: */
+ 0, /* U+00a87b: */
+ 0, /* U+00a87c: */
+ 0, /* U+00a87d: */
+ 0, /* U+00a87e: */
+ 0, /* U+00a87f: */
+ RTUNI_ALPHA, /* U+00a880: SAURASHTRA SIGN ANUSVARA*/
+ RTUNI_ALPHA, /* U+00a881: SAURASHTRA SIGN VISARGA*/
+ RTUNI_ALPHA, /* U+00a882: SAURASHTRA LETTER A*/
+ RTUNI_ALPHA, /* U+00a883: SAURASHTRA LETTER AA*/
+ RTUNI_ALPHA, /* U+00a884: SAURASHTRA LETTER I*/
+ RTUNI_ALPHA, /* U+00a885: SAURASHTRA LETTER II*/
+ RTUNI_ALPHA, /* U+00a886: SAURASHTRA LETTER U*/
+ RTUNI_ALPHA, /* U+00a887: SAURASHTRA LETTER UU*/
+ RTUNI_ALPHA, /* U+00a888: SAURASHTRA LETTER VOCALIC R*/
+ RTUNI_ALPHA, /* U+00a889: SAURASHTRA LETTER VOCALIC RR*/
+ RTUNI_ALPHA, /* U+00a88a: SAURASHTRA LETTER VOCALIC L*/
+ RTUNI_ALPHA, /* U+00a88b: SAURASHTRA LETTER VOCALIC LL*/
+ RTUNI_ALPHA, /* U+00a88c: SAURASHTRA LETTER E*/
+ RTUNI_ALPHA, /* U+00a88d: SAURASHTRA LETTER EE*/
+ RTUNI_ALPHA, /* U+00a88e: SAURASHTRA LETTER AI*/
+ RTUNI_ALPHA, /* U+00a88f: SAURASHTRA LETTER O*/
+ RTUNI_ALPHA, /* U+00a890: SAURASHTRA LETTER OO*/
+ RTUNI_ALPHA, /* U+00a891: SAURASHTRA LETTER AU*/
+ RTUNI_ALPHA, /* U+00a892: SAURASHTRA LETTER KA*/
+ RTUNI_ALPHA, /* U+00a893: SAURASHTRA LETTER KHA*/
+ RTUNI_ALPHA, /* U+00a894: SAURASHTRA LETTER GA*/
+ RTUNI_ALPHA, /* U+00a895: SAURASHTRA LETTER GHA*/
+ RTUNI_ALPHA, /* U+00a896: SAURASHTRA LETTER NGA*/
+ RTUNI_ALPHA, /* U+00a897: SAURASHTRA LETTER CA*/
+ RTUNI_ALPHA, /* U+00a898: SAURASHTRA LETTER CHA*/
+ RTUNI_ALPHA, /* U+00a899: SAURASHTRA LETTER JA*/
+ RTUNI_ALPHA, /* U+00a89a: SAURASHTRA LETTER JHA*/
+ RTUNI_ALPHA, /* U+00a89b: SAURASHTRA LETTER NYA*/
+ RTUNI_ALPHA, /* U+00a89c: SAURASHTRA LETTER TTA*/
+ RTUNI_ALPHA, /* U+00a89d: SAURASHTRA LETTER TTHA*/
+ RTUNI_ALPHA, /* U+00a89e: SAURASHTRA LETTER DDA*/
+ RTUNI_ALPHA, /* U+00a89f: SAURASHTRA LETTER DDHA*/
+ RTUNI_ALPHA, /* U+00a8a0: SAURASHTRA LETTER NNA*/
+ RTUNI_ALPHA, /* U+00a8a1: SAURASHTRA LETTER TA*/
+ RTUNI_ALPHA, /* U+00a8a2: SAURASHTRA LETTER THA*/
+ RTUNI_ALPHA, /* U+00a8a3: SAURASHTRA LETTER DA*/
+ RTUNI_ALPHA, /* U+00a8a4: SAURASHTRA LETTER DHA*/
+ RTUNI_ALPHA, /* U+00a8a5: SAURASHTRA LETTER NA*/
+ RTUNI_ALPHA, /* U+00a8a6: SAURASHTRA LETTER PA*/
+ RTUNI_ALPHA, /* U+00a8a7: SAURASHTRA LETTER PHA*/
+ RTUNI_ALPHA, /* U+00a8a8: SAURASHTRA LETTER BA*/
+ RTUNI_ALPHA, /* U+00a8a9: SAURASHTRA LETTER BHA*/
+ RTUNI_ALPHA, /* U+00a8aa: SAURASHTRA LETTER MA*/
+ RTUNI_ALPHA, /* U+00a8ab: SAURASHTRA LETTER YA*/
+ RTUNI_ALPHA, /* U+00a8ac: SAURASHTRA LETTER RA*/
+ RTUNI_ALPHA, /* U+00a8ad: SAURASHTRA LETTER LA*/
+ RTUNI_ALPHA, /* U+00a8ae: SAURASHTRA LETTER VA*/
+ RTUNI_ALPHA, /* U+00a8af: SAURASHTRA LETTER SHA*/
+ RTUNI_ALPHA, /* U+00a8b0: SAURASHTRA LETTER SSA*/
+ RTUNI_ALPHA, /* U+00a8b1: SAURASHTRA LETTER SA*/
+ RTUNI_ALPHA, /* U+00a8b2: SAURASHTRA LETTER HA*/
+ RTUNI_ALPHA, /* U+00a8b3: SAURASHTRA LETTER LLA*/
+ RTUNI_ALPHA, /* U+00a8b4: SAURASHTRA CONSONANT SIGN HAARU*/
+ RTUNI_ALPHA, /* U+00a8b5: SAURASHTRA VOWEL SIGN AA*/
+ RTUNI_ALPHA, /* U+00a8b6: SAURASHTRA VOWEL SIGN I*/
+ RTUNI_ALPHA, /* U+00a8b7: SAURASHTRA VOWEL SIGN II*/
+ RTUNI_ALPHA, /* U+00a8b8: SAURASHTRA VOWEL SIGN U*/
+ RTUNI_ALPHA, /* U+00a8b9: SAURASHTRA VOWEL SIGN UU*/
+ RTUNI_ALPHA, /* U+00a8ba: SAURASHTRA VOWEL SIGN VOCALIC R*/
+ RTUNI_ALPHA, /* U+00a8bb: SAURASHTRA VOWEL SIGN VOCALIC RR*/
+ RTUNI_ALPHA, /* U+00a8bc: SAURASHTRA VOWEL SIGN VOCALIC L*/
+ RTUNI_ALPHA, /* U+00a8bd: SAURASHTRA VOWEL SIGN VOCALIC LL*/
+ RTUNI_ALPHA, /* U+00a8be: SAURASHTRA VOWEL SIGN E*/
+ RTUNI_ALPHA, /* U+00a8bf: SAURASHTRA VOWEL SIGN EE*/
+ RTUNI_ALPHA, /* U+00a8c0: SAURASHTRA VOWEL SIGN AI*/
+ RTUNI_ALPHA, /* U+00a8c1: SAURASHTRA VOWEL SIGN O*/
+ RTUNI_ALPHA, /* U+00a8c2: SAURASHTRA VOWEL SIGN OO*/
+ RTUNI_ALPHA, /* U+00a8c3: SAURASHTRA VOWEL SIGN AU*/
+ 0, /* U+00a8c4: SAURASHTRA SIGN VIRAMA*/
+ 0, /* U+00a8c5: */
+ 0, /* U+00a8c6: */
+ 0, /* U+00a8c7: */
+ 0, /* U+00a8c8: */
+ 0, /* U+00a8c9: */
+ 0, /* U+00a8ca: */
+ 0, /* U+00a8cb: */
+ 0, /* U+00a8cc: */
+ 0, /* U+00a8cd: */
+ 0, /* U+00a8ce: SAURASHTRA DANDA*/
+ 0, /* U+00a8cf: SAURASHTRA DOUBLE DANDA*/
+ RTUNI_DDIGIT, /* U+00a8d0: SAURASHTRA DIGIT ZERO*/
+ RTUNI_DDIGIT, /* U+00a8d1: SAURASHTRA DIGIT ONE*/
+ RTUNI_DDIGIT, /* U+00a8d2: SAURASHTRA DIGIT TWO*/
+ RTUNI_DDIGIT, /* U+00a8d3: SAURASHTRA DIGIT THREE*/
+ RTUNI_DDIGIT, /* U+00a8d4: SAURASHTRA DIGIT FOUR*/
+ RTUNI_DDIGIT, /* U+00a8d5: SAURASHTRA DIGIT FIVE*/
+ RTUNI_DDIGIT, /* U+00a8d6: SAURASHTRA DIGIT SIX*/
+ RTUNI_DDIGIT, /* U+00a8d7: SAURASHTRA DIGIT SEVEN*/
+ RTUNI_DDIGIT, /* U+00a8d8: SAURASHTRA DIGIT EIGHT*/
+ RTUNI_DDIGIT, /* U+00a8d9: SAURASHTRA DIGIT NINE*/
+ 0, /* U+00a8da: */
+ 0, /* U+00a8db: */
+ 0, /* U+00a8dc: */
+ 0, /* U+00a8dd: */
+ 0, /* U+00a8de: */
+ 0, /* U+00a8df: */
+ 0, /* U+00a8e0: COMBINING DEVANAGARI DIGIT ZERO*/
+ 0, /* U+00a8e1: COMBINING DEVANAGARI DIGIT ONE*/
+ 0, /* U+00a8e2: COMBINING DEVANAGARI DIGIT TWO*/
+ 0, /* U+00a8e3: COMBINING DEVANAGARI DIGIT THREE*/
+ 0, /* U+00a8e4: COMBINING DEVANAGARI DIGIT FOUR*/
+ 0, /* U+00a8e5: COMBINING DEVANAGARI DIGIT FIVE*/
+ 0, /* U+00a8e6: COMBINING DEVANAGARI DIGIT SIX*/
+ 0, /* U+00a8e7: COMBINING DEVANAGARI DIGIT SEVEN*/
+ 0, /* U+00a8e8: COMBINING DEVANAGARI DIGIT EIGHT*/
+ 0, /* U+00a8e9: COMBINING DEVANAGARI DIGIT NINE*/
+ 0, /* U+00a8ea: COMBINING DEVANAGARI LETTER A*/
+ 0, /* U+00a8eb: COMBINING DEVANAGARI LETTER U*/
+ 0, /* U+00a8ec: COMBINING DEVANAGARI LETTER KA*/
+ 0, /* U+00a8ed: COMBINING DEVANAGARI LETTER NA*/
+ 0, /* U+00a8ee: COMBINING DEVANAGARI LETTER PA*/
+ 0, /* U+00a8ef: COMBINING DEVANAGARI LETTER RA*/
+ 0, /* U+00a8f0: COMBINING DEVANAGARI LETTER VI*/
+ 0, /* U+00a8f1: COMBINING DEVANAGARI SIGN AVAGRAHA*/
+ RTUNI_ALPHA, /* U+00a8f2: DEVANAGARI SIGN SPACING CANDRABINDU*/
+ RTUNI_ALPHA, /* U+00a8f3: DEVANAGARI SIGN CANDRABINDU VIRAMA*/
+ RTUNI_ALPHA, /* U+00a8f4: DEVANAGARI SIGN DOUBLE CANDRABINDU VIRAMA*/
+ RTUNI_ALPHA, /* U+00a8f5: DEVANAGARI SIGN CANDRABINDU TWO*/
+ RTUNI_ALPHA, /* U+00a8f6: DEVANAGARI SIGN CANDRABINDU THREE*/
+ RTUNI_ALPHA, /* U+00a8f7: DEVANAGARI SIGN CANDRABINDU AVAGRAHA*/
+ 0, /* U+00a8f8: DEVANAGARI SIGN PUSHPIKA*/
+ 0, /* U+00a8f9: DEVANAGARI GAP FILLER*/
+ 0, /* U+00a8fa: DEVANAGARI CARET*/
+ RTUNI_ALPHA, /* U+00a8fb: DEVANAGARI HEADSTROKE*/
+ 0, /* U+00a8fc: */
+ 0, /* U+00a8fd: */
+ 0, /* U+00a8fe: */
+ 0, /* U+00a8ff: */
+ RTUNI_DDIGIT, /* U+00a900: KAYAH LI DIGIT ZERO*/
+ RTUNI_DDIGIT, /* U+00a901: KAYAH LI DIGIT ONE*/
+ RTUNI_DDIGIT, /* U+00a902: KAYAH LI DIGIT TWO*/
+ RTUNI_DDIGIT, /* U+00a903: KAYAH LI DIGIT THREE*/
+ RTUNI_DDIGIT, /* U+00a904: KAYAH LI DIGIT FOUR*/
+ RTUNI_DDIGIT, /* U+00a905: KAYAH LI DIGIT FIVE*/
+ RTUNI_DDIGIT, /* U+00a906: KAYAH LI DIGIT SIX*/
+ RTUNI_DDIGIT, /* U+00a907: KAYAH LI DIGIT SEVEN*/
+ RTUNI_DDIGIT, /* U+00a908: KAYAH LI DIGIT EIGHT*/
+ RTUNI_DDIGIT, /* U+00a909: KAYAH LI DIGIT NINE*/
+ RTUNI_ALPHA, /* U+00a90a: KAYAH LI LETTER KA*/
+ RTUNI_ALPHA, /* U+00a90b: KAYAH LI LETTER KHA*/
+ RTUNI_ALPHA, /* U+00a90c: KAYAH LI LETTER GA*/
+ RTUNI_ALPHA, /* U+00a90d: KAYAH LI LETTER NGA*/
+ RTUNI_ALPHA, /* U+00a90e: KAYAH LI LETTER SA*/
+ RTUNI_ALPHA, /* U+00a90f: KAYAH LI LETTER SHA*/
+ RTUNI_ALPHA, /* U+00a910: KAYAH LI LETTER ZA*/
+ RTUNI_ALPHA, /* U+00a911: KAYAH LI LETTER NYA*/
+ RTUNI_ALPHA, /* U+00a912: KAYAH LI LETTER TA*/
+ RTUNI_ALPHA, /* U+00a913: KAYAH LI LETTER HTA*/
+ RTUNI_ALPHA, /* U+00a914: KAYAH LI LETTER NA*/
+ RTUNI_ALPHA, /* U+00a915: KAYAH LI LETTER PA*/
+ RTUNI_ALPHA, /* U+00a916: KAYAH LI LETTER PHA*/
+ RTUNI_ALPHA, /* U+00a917: KAYAH LI LETTER MA*/
+ RTUNI_ALPHA, /* U+00a918: KAYAH LI LETTER DA*/
+ RTUNI_ALPHA, /* U+00a919: KAYAH LI LETTER BA*/
+ RTUNI_ALPHA, /* U+00a91a: KAYAH LI LETTER RA*/
+ RTUNI_ALPHA, /* U+00a91b: KAYAH LI LETTER YA*/
+ RTUNI_ALPHA, /* U+00a91c: KAYAH LI LETTER LA*/
+ RTUNI_ALPHA, /* U+00a91d: KAYAH LI LETTER WA*/
+ RTUNI_ALPHA, /* U+00a91e: KAYAH LI LETTER THA*/
+ RTUNI_ALPHA, /* U+00a91f: KAYAH LI LETTER HA*/
+ RTUNI_ALPHA, /* U+00a920: KAYAH LI LETTER VA*/
+ RTUNI_ALPHA, /* U+00a921: KAYAH LI LETTER CA*/
+ RTUNI_ALPHA, /* U+00a922: KAYAH LI LETTER A*/
+ RTUNI_ALPHA, /* U+00a923: KAYAH LI LETTER OE*/
+ RTUNI_ALPHA, /* U+00a924: KAYAH LI LETTER I*/
+ RTUNI_ALPHA, /* U+00a925: KAYAH LI LETTER OO*/
+ RTUNI_ALPHA, /* U+00a926: KAYAH LI VOWEL UE*/
+ RTUNI_ALPHA, /* U+00a927: KAYAH LI VOWEL E*/
+ RTUNI_ALPHA, /* U+00a928: KAYAH LI VOWEL U*/
+ RTUNI_ALPHA, /* U+00a929: KAYAH LI VOWEL EE*/
+ RTUNI_ALPHA, /* U+00a92a: KAYAH LI VOWEL O*/
+ 0, /* U+00a92b: KAYAH LI TONE PLOPHU*/
+ 0, /* U+00a92c: KAYAH LI TONE CALYA*/
+ 0, /* U+00a92d: KAYAH LI TONE CALYA PLOPHU*/
+ 0, /* U+00a92e: KAYAH LI SIGN CWI*/
+ 0, /* U+00a92f: KAYAH LI SIGN SHYA*/
+ RTUNI_ALPHA, /* U+00a930: REJANG LETTER KA*/
+ RTUNI_ALPHA, /* U+00a931: REJANG LETTER GA*/
+ RTUNI_ALPHA, /* U+00a932: REJANG LETTER NGA*/
+ RTUNI_ALPHA, /* U+00a933: REJANG LETTER TA*/
+ RTUNI_ALPHA, /* U+00a934: REJANG LETTER DA*/
+ RTUNI_ALPHA, /* U+00a935: REJANG LETTER NA*/
+ RTUNI_ALPHA, /* U+00a936: REJANG LETTER PA*/
+ RTUNI_ALPHA, /* U+00a937: REJANG LETTER BA*/
+ RTUNI_ALPHA, /* U+00a938: REJANG LETTER MA*/
+ RTUNI_ALPHA, /* U+00a939: REJANG LETTER CA*/
+ RTUNI_ALPHA, /* U+00a93a: REJANG LETTER JA*/
+ RTUNI_ALPHA, /* U+00a93b: REJANG LETTER NYA*/
+ RTUNI_ALPHA, /* U+00a93c: REJANG LETTER SA*/
+ RTUNI_ALPHA, /* U+00a93d: REJANG LETTER RA*/
+ RTUNI_ALPHA, /* U+00a93e: REJANG LETTER LA*/
+ RTUNI_ALPHA, /* U+00a93f: REJANG LETTER YA*/
+ RTUNI_ALPHA, /* U+00a940: REJANG LETTER WA*/
+ RTUNI_ALPHA, /* U+00a941: REJANG LETTER HA*/
+ RTUNI_ALPHA, /* U+00a942: REJANG LETTER MBA*/
+ RTUNI_ALPHA, /* U+00a943: REJANG LETTER NGGA*/
+ RTUNI_ALPHA, /* U+00a944: REJANG LETTER NDA*/
+ RTUNI_ALPHA, /* U+00a945: REJANG LETTER NYJA*/
+ RTUNI_ALPHA, /* U+00a946: REJANG LETTER A*/
+ RTUNI_ALPHA, /* U+00a947: REJANG VOWEL SIGN I*/
+ RTUNI_ALPHA, /* U+00a948: REJANG VOWEL SIGN U*/
+ RTUNI_ALPHA, /* U+00a949: REJANG VOWEL SIGN E*/
+ RTUNI_ALPHA, /* U+00a94a: REJANG VOWEL SIGN AI*/
+ RTUNI_ALPHA, /* U+00a94b: REJANG VOWEL SIGN O*/
+ RTUNI_ALPHA, /* U+00a94c: REJANG VOWEL SIGN AU*/
+ RTUNI_ALPHA, /* U+00a94d: REJANG VOWEL SIGN EU*/
+ RTUNI_ALPHA, /* U+00a94e: REJANG VOWEL SIGN EA*/
+ RTUNI_ALPHA, /* U+00a94f: REJANG CONSONANT SIGN NG*/
+ RTUNI_ALPHA, /* U+00a950: REJANG CONSONANT SIGN N*/
+ RTUNI_ALPHA, /* U+00a951: REJANG CONSONANT SIGN R*/
+ RTUNI_ALPHA, /* U+00a952: REJANG CONSONANT SIGN H*/
+ 0, /* U+00a953: REJANG VIRAMA*/
+ 0, /* U+00a954: */
+ 0, /* U+00a955: */
+ 0, /* U+00a956: */
+ 0, /* U+00a957: */
+ 0, /* U+00a958: */
+ 0, /* U+00a959: */
+ 0, /* U+00a95a: */
+ 0, /* U+00a95b: */
+ 0, /* U+00a95c: */
+ 0, /* U+00a95d: */
+ 0, /* U+00a95e: */
+ 0, /* U+00a95f: REJANG SECTION MARK*/
+ RTUNI_ALPHA, /* U+00a960: HANGUL CHOSEONG TIKEUT-MIEUM*/
+ RTUNI_ALPHA, /* U+00a961: HANGUL CHOSEONG TIKEUT-PIEUP*/
+ RTUNI_ALPHA, /* U+00a962: HANGUL CHOSEONG TIKEUT-SIOS*/
+ RTUNI_ALPHA, /* U+00a963: HANGUL CHOSEONG TIKEUT-CIEUC*/
+ RTUNI_ALPHA, /* U+00a964: HANGUL CHOSEONG RIEUL-KIYEOK*/
+ RTUNI_ALPHA, /* U+00a965: HANGUL CHOSEONG RIEUL-SSANGKIYEOK*/
+ RTUNI_ALPHA, /* U+00a966: HANGUL CHOSEONG RIEUL-TIKEUT*/
+ RTUNI_ALPHA, /* U+00a967: HANGUL CHOSEONG RIEUL-SSANGTIKEUT*/
+ RTUNI_ALPHA, /* U+00a968: HANGUL CHOSEONG RIEUL-MIEUM*/
+ RTUNI_ALPHA, /* U+00a969: HANGUL CHOSEONG RIEUL-PIEUP*/
+ RTUNI_ALPHA, /* U+00a96a: HANGUL CHOSEONG RIEUL-SSANGPIEUP*/
+ RTUNI_ALPHA, /* U+00a96b: HANGUL CHOSEONG RIEUL-KAPYEOUNPIEUP*/
+ RTUNI_ALPHA, /* U+00a96c: HANGUL CHOSEONG RIEUL-SIOS*/
+ RTUNI_ALPHA, /* U+00a96d: HANGUL CHOSEONG RIEUL-CIEUC*/
+ RTUNI_ALPHA, /* U+00a96e: HANGUL CHOSEONG RIEUL-KHIEUKH*/
+ RTUNI_ALPHA, /* U+00a96f: HANGUL CHOSEONG MIEUM-KIYEOK*/
+ RTUNI_ALPHA, /* U+00a970: HANGUL CHOSEONG MIEUM-TIKEUT*/
+ RTUNI_ALPHA, /* U+00a971: HANGUL CHOSEONG MIEUM-SIOS*/
+ RTUNI_ALPHA, /* U+00a972: HANGUL CHOSEONG PIEUP-SIOS-THIEUTH*/
+ RTUNI_ALPHA, /* U+00a973: HANGUL CHOSEONG PIEUP-KHIEUKH*/
+ RTUNI_ALPHA, /* U+00a974: HANGUL CHOSEONG PIEUP-HIEUH*/
+ RTUNI_ALPHA, /* U+00a975: HANGUL CHOSEONG SSANGSIOS-PIEUP*/
+ RTUNI_ALPHA, /* U+00a976: HANGUL CHOSEONG IEUNG-RIEUL*/
+ RTUNI_ALPHA, /* U+00a977: HANGUL CHOSEONG IEUNG-HIEUH*/
+ RTUNI_ALPHA, /* U+00a978: HANGUL CHOSEONG SSANGCIEUC-HIEUH*/
+ RTUNI_ALPHA, /* U+00a979: HANGUL CHOSEONG SSANGTHIEUTH*/
+ RTUNI_ALPHA, /* U+00a97a: HANGUL CHOSEONG PHIEUPH-HIEUH*/
+ RTUNI_ALPHA, /* U+00a97b: HANGUL CHOSEONG HIEUH-SIOS*/
+ RTUNI_ALPHA, /* U+00a97c: HANGUL CHOSEONG SSANGYEORINHIEUH*/
+ 0, /* U+00a97d: */
+ 0, /* U+00a97e: */
+ 0, /* U+00a97f: */
+ RTUNI_ALPHA, /* U+00a980: JAVANESE SIGN PANYANGGA*/
+ RTUNI_ALPHA, /* U+00a981: JAVANESE SIGN CECAK*/
+ RTUNI_ALPHA, /* U+00a982: JAVANESE SIGN LAYAR*/
+ RTUNI_ALPHA, /* U+00a983: JAVANESE SIGN WIGNYAN*/
+ RTUNI_ALPHA, /* U+00a984: JAVANESE LETTER A*/
+ RTUNI_ALPHA, /* U+00a985: JAVANESE LETTER I KAWI*/
+ RTUNI_ALPHA, /* U+00a986: JAVANESE LETTER I*/
+ RTUNI_ALPHA, /* U+00a987: JAVANESE LETTER II*/
+ RTUNI_ALPHA, /* U+00a988: JAVANESE LETTER U*/
+ RTUNI_ALPHA, /* U+00a989: JAVANESE LETTER PA CEREK*/
+ RTUNI_ALPHA, /* U+00a98a: JAVANESE LETTER NGA LELET*/
+ RTUNI_ALPHA, /* U+00a98b: JAVANESE LETTER NGA LELET RASWADI*/
+ RTUNI_ALPHA, /* U+00a98c: JAVANESE LETTER E*/
+ RTUNI_ALPHA, /* U+00a98d: JAVANESE LETTER AI*/
+ RTUNI_ALPHA, /* U+00a98e: JAVANESE LETTER O*/
+ RTUNI_ALPHA, /* U+00a98f: JAVANESE LETTER KA*/
+ RTUNI_ALPHA, /* U+00a990: JAVANESE LETTER KA SASAK*/
+ RTUNI_ALPHA, /* U+00a991: JAVANESE LETTER KA MURDA*/
+ RTUNI_ALPHA, /* U+00a992: JAVANESE LETTER GA*/
+ RTUNI_ALPHA, /* U+00a993: JAVANESE LETTER GA MURDA*/
+ RTUNI_ALPHA, /* U+00a994: JAVANESE LETTER NGA*/
+ RTUNI_ALPHA, /* U+00a995: JAVANESE LETTER CA*/
+ RTUNI_ALPHA, /* U+00a996: JAVANESE LETTER CA MURDA*/
+ RTUNI_ALPHA, /* U+00a997: JAVANESE LETTER JA*/
+ RTUNI_ALPHA, /* U+00a998: JAVANESE LETTER NYA MURDA*/
+ RTUNI_ALPHA, /* U+00a999: JAVANESE LETTER JA MAHAPRANA*/
+ RTUNI_ALPHA, /* U+00a99a: JAVANESE LETTER NYA*/
+ RTUNI_ALPHA, /* U+00a99b: JAVANESE LETTER TTA*/
+ RTUNI_ALPHA, /* U+00a99c: JAVANESE LETTER TTA MAHAPRANA*/
+ RTUNI_ALPHA, /* U+00a99d: JAVANESE LETTER DDA*/
+ RTUNI_ALPHA, /* U+00a99e: JAVANESE LETTER DDA MAHAPRANA*/
+ RTUNI_ALPHA, /* U+00a99f: JAVANESE LETTER NA MURDA*/
+ RTUNI_ALPHA, /* U+00a9a0: JAVANESE LETTER TA*/
+ RTUNI_ALPHA, /* U+00a9a1: JAVANESE LETTER TA MURDA*/
+ RTUNI_ALPHA, /* U+00a9a2: JAVANESE LETTER DA*/
+ RTUNI_ALPHA, /* U+00a9a3: JAVANESE LETTER DA MAHAPRANA*/
+ RTUNI_ALPHA, /* U+00a9a4: JAVANESE LETTER NA*/
+ RTUNI_ALPHA, /* U+00a9a5: JAVANESE LETTER PA*/
+ RTUNI_ALPHA, /* U+00a9a6: JAVANESE LETTER PA MURDA*/
+ RTUNI_ALPHA, /* U+00a9a7: JAVANESE LETTER BA*/
+ RTUNI_ALPHA, /* U+00a9a8: JAVANESE LETTER BA MURDA*/
+ RTUNI_ALPHA, /* U+00a9a9: JAVANESE LETTER MA*/
+ RTUNI_ALPHA, /* U+00a9aa: JAVANESE LETTER YA*/
+ RTUNI_ALPHA, /* U+00a9ab: JAVANESE LETTER RA*/
+ RTUNI_ALPHA, /* U+00a9ac: JAVANESE LETTER RA AGUNG*/
+ RTUNI_ALPHA, /* U+00a9ad: JAVANESE LETTER LA*/
+ RTUNI_ALPHA, /* U+00a9ae: JAVANESE LETTER WA*/
+ RTUNI_ALPHA, /* U+00a9af: JAVANESE LETTER SA MURDA*/
+ RTUNI_ALPHA, /* U+00a9b0: JAVANESE LETTER SA MAHAPRANA*/
+ RTUNI_ALPHA, /* U+00a9b1: JAVANESE LETTER SA*/
+ RTUNI_ALPHA, /* U+00a9b2: JAVANESE LETTER HA*/
+ 0, /* U+00a9b3: JAVANESE SIGN CECAK TELU*/
+ RTUNI_ALPHA, /* U+00a9b4: JAVANESE VOWEL SIGN TARUNG*/
+ RTUNI_ALPHA, /* U+00a9b5: JAVANESE VOWEL SIGN TOLONG*/
+ RTUNI_ALPHA, /* U+00a9b6: JAVANESE VOWEL SIGN WULU*/
+ RTUNI_ALPHA, /* U+00a9b7: JAVANESE VOWEL SIGN WULU MELIK*/
+ RTUNI_ALPHA, /* U+00a9b8: JAVANESE VOWEL SIGN SUKU*/
+ RTUNI_ALPHA, /* U+00a9b9: JAVANESE VOWEL SIGN SUKU MENDUT*/
+ RTUNI_ALPHA, /* U+00a9ba: JAVANESE VOWEL SIGN TALING*/
+ RTUNI_ALPHA, /* U+00a9bb: JAVANESE VOWEL SIGN DIRGA MURE*/
+ RTUNI_ALPHA, /* U+00a9bc: JAVANESE VOWEL SIGN PEPET*/
+ RTUNI_ALPHA, /* U+00a9bd: JAVANESE CONSONANT SIGN KERET*/
+ RTUNI_ALPHA, /* U+00a9be: JAVANESE CONSONANT SIGN PENGKAL*/
+ RTUNI_ALPHA, /* U+00a9bf: JAVANESE CONSONANT SIGN CAKRA*/
+ 0, /* U+00a9c0: JAVANESE PANGKON*/
+ 0, /* U+00a9c1: JAVANESE LEFT RERENGGAN*/
+ 0, /* U+00a9c2: JAVANESE RIGHT RERENGGAN*/
+ 0, /* U+00a9c3: JAVANESE PADA ANDAP*/
+ 0, /* U+00a9c4: JAVANESE PADA MADYA*/
+ 0, /* U+00a9c5: JAVANESE PADA LUHUR*/
+ 0, /* U+00a9c6: JAVANESE PADA WINDU*/
+ 0, /* U+00a9c7: JAVANESE PADA PANGKAT*/
+ 0, /* U+00a9c8: JAVANESE PADA LINGSA*/
+ 0, /* U+00a9c9: JAVANESE PADA LUNGSI*/
+ 0, /* U+00a9ca: JAVANESE PADA ADEG*/
+ 0, /* U+00a9cb: JAVANESE PADA ADEG ADEG*/
+ 0, /* U+00a9cc: JAVANESE PADA PISELEH*/
+ 0, /* U+00a9cd: JAVANESE TURNED PADA PISELEH*/
+ 0, /* U+00a9ce: */
+ RTUNI_ALPHA, /* U+00a9cf: JAVANESE PANGRANGKEP*/
+ RTUNI_DDIGIT, /* U+00a9d0: JAVANESE DIGIT ZERO*/
+ RTUNI_DDIGIT, /* U+00a9d1: JAVANESE DIGIT ONE*/
+ RTUNI_DDIGIT, /* U+00a9d2: JAVANESE DIGIT TWO*/
+ RTUNI_DDIGIT, /* U+00a9d3: JAVANESE DIGIT THREE*/
+ RTUNI_DDIGIT, /* U+00a9d4: JAVANESE DIGIT FOUR*/
+ RTUNI_DDIGIT, /* U+00a9d5: JAVANESE DIGIT FIVE*/
+ RTUNI_DDIGIT, /* U+00a9d6: JAVANESE DIGIT SIX*/
+ RTUNI_DDIGIT, /* U+00a9d7: JAVANESE DIGIT SEVEN*/
+ RTUNI_DDIGIT, /* U+00a9d8: JAVANESE DIGIT EIGHT*/
+ RTUNI_DDIGIT, /* U+00a9d9: JAVANESE DIGIT NINE*/
+ 0, /* U+00a9da: */
+ 0, /* U+00a9db: */
+ 0, /* U+00a9dc: */
+ 0, /* U+00a9dd: */
+ 0, /* U+00a9de: JAVANESE PADA TIRTA TUMETES*/
+ 0, /* U+00a9df: JAVANESE PADA ISEN-ISEN*/
+ 0, /* U+00a9e0: */
+ 0, /* U+00a9e1: */
+ 0, /* U+00a9e2: */
+ 0, /* U+00a9e3: */
+ 0, /* U+00a9e4: */
+ 0, /* U+00a9e5: */
+ 0, /* U+00a9e6: */
+ 0, /* U+00a9e7: */
+ 0, /* U+00a9e8: */
+ 0, /* U+00a9e9: */
+ 0, /* U+00a9ea: */
+ 0, /* U+00a9eb: */
+ 0, /* U+00a9ec: */
+ 0, /* U+00a9ed: */
+ 0, /* U+00a9ee: */
+ 0, /* U+00a9ef: */
+ 0, /* U+00a9f0: */
+ 0, /* U+00a9f1: */
+ 0, /* U+00a9f2: */
+ 0, /* U+00a9f3: */
+ 0, /* U+00a9f4: */
+ 0, /* U+00a9f5: */
+ 0, /* U+00a9f6: */
+ 0, /* U+00a9f7: */
+ 0, /* U+00a9f8: */
+ 0, /* U+00a9f9: */
+ 0, /* U+00a9fa: */
+ 0, /* U+00a9fb: */
+ 0, /* U+00a9fc: */
+ 0, /* U+00a9fd: */
+ 0, /* U+00a9fe: */
+ 0, /* U+00a9ff: */
+ RTUNI_ALPHA, /* U+00aa00: CHAM LETTER A*/
+ RTUNI_ALPHA, /* U+00aa01: CHAM LETTER I*/
+ RTUNI_ALPHA, /* U+00aa02: CHAM LETTER U*/
+ RTUNI_ALPHA, /* U+00aa03: CHAM LETTER E*/
+ RTUNI_ALPHA, /* U+00aa04: CHAM LETTER AI*/
+ RTUNI_ALPHA, /* U+00aa05: CHAM LETTER O*/
+ RTUNI_ALPHA, /* U+00aa06: CHAM LETTER KA*/
+ RTUNI_ALPHA, /* U+00aa07: CHAM LETTER KHA*/
+ RTUNI_ALPHA, /* U+00aa08: CHAM LETTER GA*/
+ RTUNI_ALPHA, /* U+00aa09: CHAM LETTER GHA*/
+ RTUNI_ALPHA, /* U+00aa0a: CHAM LETTER NGUE*/
+ RTUNI_ALPHA, /* U+00aa0b: CHAM LETTER NGA*/
+ RTUNI_ALPHA, /* U+00aa0c: CHAM LETTER CHA*/
+ RTUNI_ALPHA, /* U+00aa0d: CHAM LETTER CHHA*/
+ RTUNI_ALPHA, /* U+00aa0e: CHAM LETTER JA*/
+ RTUNI_ALPHA, /* U+00aa0f: CHAM LETTER JHA*/
+ RTUNI_ALPHA, /* U+00aa10: CHAM LETTER NHUE*/
+ RTUNI_ALPHA, /* U+00aa11: CHAM LETTER NHA*/
+ RTUNI_ALPHA, /* U+00aa12: CHAM LETTER NHJA*/
+ RTUNI_ALPHA, /* U+00aa13: CHAM LETTER TA*/
+ RTUNI_ALPHA, /* U+00aa14: CHAM LETTER THA*/
+ RTUNI_ALPHA, /* U+00aa15: CHAM LETTER DA*/
+ RTUNI_ALPHA, /* U+00aa16: CHAM LETTER DHA*/
+ RTUNI_ALPHA, /* U+00aa17: CHAM LETTER NUE*/
+ RTUNI_ALPHA, /* U+00aa18: CHAM LETTER NA*/
+ RTUNI_ALPHA, /* U+00aa19: CHAM LETTER DDA*/
+ RTUNI_ALPHA, /* U+00aa1a: CHAM LETTER PA*/
+ RTUNI_ALPHA, /* U+00aa1b: CHAM LETTER PPA*/
+ RTUNI_ALPHA, /* U+00aa1c: CHAM LETTER PHA*/
+ RTUNI_ALPHA, /* U+00aa1d: CHAM LETTER BA*/
+ RTUNI_ALPHA, /* U+00aa1e: CHAM LETTER BHA*/
+ RTUNI_ALPHA, /* U+00aa1f: CHAM LETTER MUE*/
+ RTUNI_ALPHA, /* U+00aa20: CHAM LETTER MA*/
+ RTUNI_ALPHA, /* U+00aa21: CHAM LETTER BBA*/
+ RTUNI_ALPHA, /* U+00aa22: CHAM LETTER YA*/
+ RTUNI_ALPHA, /* U+00aa23: CHAM LETTER RA*/
+ RTUNI_ALPHA, /* U+00aa24: CHAM LETTER LA*/
+ RTUNI_ALPHA, /* U+00aa25: CHAM LETTER VA*/
+ RTUNI_ALPHA, /* U+00aa26: CHAM LETTER SSA*/
+ RTUNI_ALPHA, /* U+00aa27: CHAM LETTER SA*/
+ RTUNI_ALPHA, /* U+00aa28: CHAM LETTER HA*/
+ RTUNI_ALPHA, /* U+00aa29: CHAM VOWEL SIGN AA*/
+ RTUNI_ALPHA, /* U+00aa2a: CHAM VOWEL SIGN I*/
+ RTUNI_ALPHA, /* U+00aa2b: CHAM VOWEL SIGN II*/
+ RTUNI_ALPHA, /* U+00aa2c: CHAM VOWEL SIGN EI*/
+ RTUNI_ALPHA, /* U+00aa2d: CHAM VOWEL SIGN U*/
+ RTUNI_ALPHA, /* U+00aa2e: CHAM VOWEL SIGN OE*/
+ RTUNI_ALPHA, /* U+00aa2f: CHAM VOWEL SIGN O*/
+ RTUNI_ALPHA, /* U+00aa30: CHAM VOWEL SIGN AI*/
+ RTUNI_ALPHA, /* U+00aa31: CHAM VOWEL SIGN AU*/
+ RTUNI_ALPHA, /* U+00aa32: CHAM VOWEL SIGN UE*/
+ RTUNI_ALPHA, /* U+00aa33: CHAM CONSONANT SIGN YA*/
+ RTUNI_ALPHA, /* U+00aa34: CHAM CONSONANT SIGN RA*/
+ RTUNI_ALPHA, /* U+00aa35: CHAM CONSONANT SIGN LA*/
+ RTUNI_ALPHA, /* U+00aa36: CHAM CONSONANT SIGN WA*/
+ 0, /* U+00aa37: */
+ 0, /* U+00aa38: */
+ 0, /* U+00aa39: */
+ 0, /* U+00aa3a: */
+ 0, /* U+00aa3b: */
+ 0, /* U+00aa3c: */
+ 0, /* U+00aa3d: */
+ 0, /* U+00aa3e: */
+ 0, /* U+00aa3f: */
+ RTUNI_ALPHA, /* U+00aa40: CHAM LETTER FINAL K*/
+ RTUNI_ALPHA, /* U+00aa41: CHAM LETTER FINAL G*/
+ RTUNI_ALPHA, /* U+00aa42: CHAM LETTER FINAL NG*/
+ RTUNI_ALPHA, /* U+00aa43: CHAM CONSONANT SIGN FINAL NG*/
+ RTUNI_ALPHA, /* U+00aa44: CHAM LETTER FINAL CH*/
+ RTUNI_ALPHA, /* U+00aa45: CHAM LETTER FINAL T*/
+ RTUNI_ALPHA, /* U+00aa46: CHAM LETTER FINAL N*/
+ RTUNI_ALPHA, /* U+00aa47: CHAM LETTER FINAL P*/
+ RTUNI_ALPHA, /* U+00aa48: CHAM LETTER FINAL Y*/
+ RTUNI_ALPHA, /* U+00aa49: CHAM LETTER FINAL R*/
+ RTUNI_ALPHA, /* U+00aa4a: CHAM LETTER FINAL L*/
+ RTUNI_ALPHA, /* U+00aa4b: CHAM LETTER FINAL SS*/
+ RTUNI_ALPHA, /* U+00aa4c: CHAM CONSONANT SIGN FINAL M*/
+ RTUNI_ALPHA, /* U+00aa4d: CHAM CONSONANT SIGN FINAL H*/
+ 0, /* U+00aa4e: */
+ 0, /* U+00aa4f: */
+ RTUNI_DDIGIT, /* U+00aa50: CHAM DIGIT ZERO*/
+ RTUNI_DDIGIT, /* U+00aa51: CHAM DIGIT ONE*/
+ RTUNI_DDIGIT, /* U+00aa52: CHAM DIGIT TWO*/
+ RTUNI_DDIGIT, /* U+00aa53: CHAM DIGIT THREE*/
+ RTUNI_DDIGIT, /* U+00aa54: CHAM DIGIT FOUR*/
+ RTUNI_DDIGIT, /* U+00aa55: CHAM DIGIT FIVE*/
+ RTUNI_DDIGIT, /* U+00aa56: CHAM DIGIT SIX*/
+ RTUNI_DDIGIT, /* U+00aa57: CHAM DIGIT SEVEN*/
+ RTUNI_DDIGIT, /* U+00aa58: CHAM DIGIT EIGHT*/
+ RTUNI_DDIGIT, /* U+00aa59: CHAM DIGIT NINE*/
+ 0, /* U+00aa5a: */
+ 0, /* U+00aa5b: */
+ 0, /* U+00aa5c: CHAM PUNCTUATION SPIRAL*/
+ 0, /* U+00aa5d: CHAM PUNCTUATION DANDA*/
+ 0, /* U+00aa5e: CHAM PUNCTUATION DOUBLE DANDA*/
+ 0, /* U+00aa5f: CHAM PUNCTUATION TRIPLE DANDA*/
+ RTUNI_ALPHA, /* U+00aa60: MYANMAR LETTER KHAMTI GA*/
+ RTUNI_ALPHA, /* U+00aa61: MYANMAR LETTER KHAMTI CA*/
+ RTUNI_ALPHA, /* U+00aa62: MYANMAR LETTER KHAMTI CHA*/
+ RTUNI_ALPHA, /* U+00aa63: MYANMAR LETTER KHAMTI JA*/
+ RTUNI_ALPHA, /* U+00aa64: MYANMAR LETTER KHAMTI JHA*/
+ RTUNI_ALPHA, /* U+00aa65: MYANMAR LETTER KHAMTI NYA*/
+ RTUNI_ALPHA, /* U+00aa66: MYANMAR LETTER KHAMTI TTA*/
+ RTUNI_ALPHA, /* U+00aa67: MYANMAR LETTER KHAMTI TTHA*/
+ RTUNI_ALPHA, /* U+00aa68: MYANMAR LETTER KHAMTI DDA*/
+ RTUNI_ALPHA, /* U+00aa69: MYANMAR LETTER KHAMTI DDHA*/
+ RTUNI_ALPHA, /* U+00aa6a: MYANMAR LETTER KHAMTI DHA*/
+ RTUNI_ALPHA, /* U+00aa6b: MYANMAR LETTER KHAMTI NA*/
+ RTUNI_ALPHA, /* U+00aa6c: MYANMAR LETTER KHAMTI SA*/
+ RTUNI_ALPHA, /* U+00aa6d: MYANMAR LETTER KHAMTI HA*/
+ RTUNI_ALPHA, /* U+00aa6e: MYANMAR LETTER KHAMTI HHA*/
+ RTUNI_ALPHA, /* U+00aa6f: MYANMAR LETTER KHAMTI FA*/
+ RTUNI_ALPHA, /* U+00aa70: MYANMAR MODIFIER LETTER KHAMTI REDUPLICATION*/
+ RTUNI_ALPHA, /* U+00aa71: MYANMAR LETTER KHAMTI XA*/
+ RTUNI_ALPHA, /* U+00aa72: MYANMAR LETTER KHAMTI ZA*/
+ RTUNI_ALPHA, /* U+00aa73: MYANMAR LETTER KHAMTI RA*/
+ RTUNI_ALPHA, /* U+00aa74: MYANMAR LOGOGRAM KHAMTI OAY*/
+ RTUNI_ALPHA, /* U+00aa75: MYANMAR LOGOGRAM KHAMTI QN*/
+ RTUNI_ALPHA, /* U+00aa76: MYANMAR LOGOGRAM KHAMTI HM*/
+ 0, /* U+00aa77: MYANMAR SYMBOL AITON EXCLAMATION*/
+ 0, /* U+00aa78: MYANMAR SYMBOL AITON ONE*/
+ 0, /* U+00aa79: MYANMAR SYMBOL AITON TWO*/
+ RTUNI_ALPHA, /* U+00aa7a: MYANMAR LETTER AITON RA*/
+ 0, /* U+00aa7b: MYANMAR SIGN PAO KAREN TONE*/
+ 0, /* U+00aa7c: */
+ 0, /* U+00aa7d: */
+ 0, /* U+00aa7e: */
+ 0, /* U+00aa7f: */
+ RTUNI_ALPHA, /* U+00aa80: TAI VIET LETTER LOW KO*/
+ RTUNI_ALPHA, /* U+00aa81: TAI VIET LETTER HIGH KO*/
+ RTUNI_ALPHA, /* U+00aa82: TAI VIET LETTER LOW KHO*/
+ RTUNI_ALPHA, /* U+00aa83: TAI VIET LETTER HIGH KHO*/
+ RTUNI_ALPHA, /* U+00aa84: TAI VIET LETTER LOW KHHO*/
+ RTUNI_ALPHA, /* U+00aa85: TAI VIET LETTER HIGH KHHO*/
+ RTUNI_ALPHA, /* U+00aa86: TAI VIET LETTER LOW GO*/
+ RTUNI_ALPHA, /* U+00aa87: TAI VIET LETTER HIGH GO*/
+ RTUNI_ALPHA, /* U+00aa88: TAI VIET LETTER LOW NGO*/
+ RTUNI_ALPHA, /* U+00aa89: TAI VIET LETTER HIGH NGO*/
+ RTUNI_ALPHA, /* U+00aa8a: TAI VIET LETTER LOW CO*/
+ RTUNI_ALPHA, /* U+00aa8b: TAI VIET LETTER HIGH CO*/
+ RTUNI_ALPHA, /* U+00aa8c: TAI VIET LETTER LOW CHO*/
+ RTUNI_ALPHA, /* U+00aa8d: TAI VIET LETTER HIGH CHO*/
+ RTUNI_ALPHA, /* U+00aa8e: TAI VIET LETTER LOW SO*/
+ RTUNI_ALPHA, /* U+00aa8f: TAI VIET LETTER HIGH SO*/
+ RTUNI_ALPHA, /* U+00aa90: TAI VIET LETTER LOW NYO*/
+ RTUNI_ALPHA, /* U+00aa91: TAI VIET LETTER HIGH NYO*/
+ RTUNI_ALPHA, /* U+00aa92: TAI VIET LETTER LOW DO*/
+ RTUNI_ALPHA, /* U+00aa93: TAI VIET LETTER HIGH DO*/
+ RTUNI_ALPHA, /* U+00aa94: TAI VIET LETTER LOW TO*/
+ RTUNI_ALPHA, /* U+00aa95: TAI VIET LETTER HIGH TO*/
+ RTUNI_ALPHA, /* U+00aa96: TAI VIET LETTER LOW THO*/
+ RTUNI_ALPHA, /* U+00aa97: TAI VIET LETTER HIGH THO*/
+ RTUNI_ALPHA, /* U+00aa98: TAI VIET LETTER LOW NO*/
+ RTUNI_ALPHA, /* U+00aa99: TAI VIET LETTER HIGH NO*/
+ RTUNI_ALPHA, /* U+00aa9a: TAI VIET LETTER LOW BO*/
+ RTUNI_ALPHA, /* U+00aa9b: TAI VIET LETTER HIGH BO*/
+ RTUNI_ALPHA, /* U+00aa9c: TAI VIET LETTER LOW PO*/
+ RTUNI_ALPHA, /* U+00aa9d: TAI VIET LETTER HIGH PO*/
+ RTUNI_ALPHA, /* U+00aa9e: TAI VIET LETTER LOW PHO*/
+ RTUNI_ALPHA, /* U+00aa9f: TAI VIET LETTER HIGH PHO*/
+ RTUNI_ALPHA, /* U+00aaa0: TAI VIET LETTER LOW FO*/
+ RTUNI_ALPHA, /* U+00aaa1: TAI VIET LETTER HIGH FO*/
+ RTUNI_ALPHA, /* U+00aaa2: TAI VIET LETTER LOW MO*/
+ RTUNI_ALPHA, /* U+00aaa3: TAI VIET LETTER HIGH MO*/
+ RTUNI_ALPHA, /* U+00aaa4: TAI VIET LETTER LOW YO*/
+ RTUNI_ALPHA, /* U+00aaa5: TAI VIET LETTER HIGH YO*/
+ RTUNI_ALPHA, /* U+00aaa6: TAI VIET LETTER LOW RO*/
+ RTUNI_ALPHA, /* U+00aaa7: TAI VIET LETTER HIGH RO*/
+ RTUNI_ALPHA, /* U+00aaa8: TAI VIET LETTER LOW LO*/
+ RTUNI_ALPHA, /* U+00aaa9: TAI VIET LETTER HIGH LO*/
+ RTUNI_ALPHA, /* U+00aaaa: TAI VIET LETTER LOW VO*/
+ RTUNI_ALPHA, /* U+00aaab: TAI VIET LETTER HIGH VO*/
+ RTUNI_ALPHA, /* U+00aaac: TAI VIET LETTER LOW HO*/
+ RTUNI_ALPHA, /* U+00aaad: TAI VIET LETTER HIGH HO*/
+ RTUNI_ALPHA, /* U+00aaae: TAI VIET LETTER LOW O*/
+ RTUNI_ALPHA, /* U+00aaaf: TAI VIET LETTER HIGH O*/
+ RTUNI_ALPHA, /* U+00aab0: TAI VIET MAI KANG*/
+ RTUNI_ALPHA, /* U+00aab1: TAI VIET VOWEL AA*/
+ RTUNI_ALPHA, /* U+00aab2: TAI VIET VOWEL I*/
+ RTUNI_ALPHA, /* U+00aab3: TAI VIET VOWEL UE*/
+ RTUNI_ALPHA, /* U+00aab4: TAI VIET VOWEL U*/
+ RTUNI_ALPHA, /* U+00aab5: TAI VIET VOWEL E*/
+ RTUNI_ALPHA, /* U+00aab6: TAI VIET VOWEL O*/
+ RTUNI_ALPHA, /* U+00aab7: TAI VIET MAI KHIT*/
+ RTUNI_ALPHA, /* U+00aab8: TAI VIET VOWEL IA*/
+ RTUNI_ALPHA, /* U+00aab9: TAI VIET VOWEL UEA*/
+ RTUNI_ALPHA, /* U+00aaba: TAI VIET VOWEL UA*/
+ RTUNI_ALPHA, /* U+00aabb: TAI VIET VOWEL AUE*/
+ RTUNI_ALPHA, /* U+00aabc: TAI VIET VOWEL AY*/
+ RTUNI_ALPHA, /* U+00aabd: TAI VIET VOWEL AN*/
+ RTUNI_ALPHA, /* U+00aabe: TAI VIET VOWEL AM*/
+ 0, /* U+00aabf: TAI VIET TONE MAI EK*/
+ RTUNI_ALPHA, /* U+00aac0: TAI VIET TONE MAI NUENG*/
+ 0, /* U+00aac1: TAI VIET TONE MAI THO*/
+ RTUNI_ALPHA, /* U+00aac2: TAI VIET TONE MAI SONG*/
+ 0, /* U+00aac3: */
+ 0, /* U+00aac4: */
+ 0, /* U+00aac5: */
+ 0, /* U+00aac6: */
+ 0, /* U+00aac7: */
+ 0, /* U+00aac8: */
+ 0, /* U+00aac9: */
+ 0, /* U+00aaca: */
+ 0, /* U+00aacb: */
+ 0, /* U+00aacc: */
+ 0, /* U+00aacd: */
+ 0, /* U+00aace: */
+ 0, /* U+00aacf: */
+ 0, /* U+00aad0: */
+ 0, /* U+00aad1: */
+ 0, /* U+00aad2: */
+ 0, /* U+00aad3: */
+ 0, /* U+00aad4: */
+ 0, /* U+00aad5: */
+ 0, /* U+00aad6: */
+ 0, /* U+00aad7: */
+ 0, /* U+00aad8: */
+ 0, /* U+00aad9: */
+ 0, /* U+00aada: */
+ RTUNI_ALPHA, /* U+00aadb: TAI VIET SYMBOL KON*/
+ RTUNI_ALPHA, /* U+00aadc: TAI VIET SYMBOL NUENG*/
+ RTUNI_ALPHA, /* U+00aadd: TAI VIET SYMBOL SAM*/
+ 0, /* U+00aade: TAI VIET SYMBOL HO HOI*/
+ 0, /* U+00aadf: TAI VIET SYMBOL KOI KOI*/
+ RTUNI_ALPHA, /* U+00aae0: MEETEI MAYEK LETTER E*/
+ RTUNI_ALPHA, /* U+00aae1: MEETEI MAYEK LETTER O*/
+ RTUNI_ALPHA, /* U+00aae2: MEETEI MAYEK LETTER CHA*/
+ RTUNI_ALPHA, /* U+00aae3: MEETEI MAYEK LETTER NYA*/
+ RTUNI_ALPHA, /* U+00aae4: MEETEI MAYEK LETTER TTA*/
+ RTUNI_ALPHA, /* U+00aae5: MEETEI MAYEK LETTER TTHA*/
+ RTUNI_ALPHA, /* U+00aae6: MEETEI MAYEK LETTER DDA*/
+ RTUNI_ALPHA, /* U+00aae7: MEETEI MAYEK LETTER DDHA*/
+ RTUNI_ALPHA, /* U+00aae8: MEETEI MAYEK LETTER NNA*/
+ RTUNI_ALPHA, /* U+00aae9: MEETEI MAYEK LETTER SHA*/
+ RTUNI_ALPHA, /* U+00aaea: MEETEI MAYEK LETTER SSA*/
+ RTUNI_ALPHA, /* U+00aaeb: MEETEI MAYEK VOWEL SIGN II*/
+ RTUNI_ALPHA, /* U+00aaec: MEETEI MAYEK VOWEL SIGN UU*/
+ RTUNI_ALPHA, /* U+00aaed: MEETEI MAYEK VOWEL SIGN AAI*/
+ RTUNI_ALPHA, /* U+00aaee: MEETEI MAYEK VOWEL SIGN AU*/
+ RTUNI_ALPHA, /* U+00aaef: MEETEI MAYEK VOWEL SIGN AAU*/
+ 0, /* U+00aaf0: MEETEI MAYEK CHEIKHAN*/
+ 0, /* U+00aaf1: MEETEI MAYEK AHANG KHUDAM*/
+ RTUNI_ALPHA, /* U+00aaf2: MEETEI MAYEK ANJI*/
+ RTUNI_ALPHA, /* U+00aaf3: MEETEI MAYEK SYLLABLE REPETITION MARK*/
+ RTUNI_ALPHA, /* U+00aaf4: MEETEI MAYEK WORD REPETITION MARK*/
+ RTUNI_ALPHA, /* U+00aaf5: MEETEI MAYEK VOWEL SIGN VISARGA*/
+ 0, /* U+00aaf6: MEETEI MAYEK VIRAMA*/
+ 0, /* U+00aaf7: */
+ 0, /* U+00aaf8: */
+ 0, /* U+00aaf9: */
+ 0, /* U+00aafa: */
+ 0, /* U+00aafb: */
+ 0, /* U+00aafc: */
+ 0, /* U+00aafd: */
+ 0, /* U+00aafe: */
+ 0, /* U+00aaff: */
+ 0, /* U+00ab00: */
+ RTUNI_ALPHA, /* U+00ab01: ETHIOPIC SYLLABLE TTHU*/
+ RTUNI_ALPHA, /* U+00ab02: ETHIOPIC SYLLABLE TTHI*/
+ RTUNI_ALPHA, /* U+00ab03: ETHIOPIC SYLLABLE TTHAA*/
+ RTUNI_ALPHA, /* U+00ab04: ETHIOPIC SYLLABLE TTHEE*/
+ RTUNI_ALPHA, /* U+00ab05: ETHIOPIC SYLLABLE TTHE*/
+ RTUNI_ALPHA, /* U+00ab06: ETHIOPIC SYLLABLE TTHO*/
+ 0, /* U+00ab07: */
+ 0, /* U+00ab08: */
+ RTUNI_ALPHA, /* U+00ab09: ETHIOPIC SYLLABLE DDHU*/
+ RTUNI_ALPHA, /* U+00ab0a: ETHIOPIC SYLLABLE DDHI*/
+ RTUNI_ALPHA, /* U+00ab0b: ETHIOPIC SYLLABLE DDHAA*/
+ RTUNI_ALPHA, /* U+00ab0c: ETHIOPIC SYLLABLE DDHEE*/
+ RTUNI_ALPHA, /* U+00ab0d: ETHIOPIC SYLLABLE DDHE*/
+ RTUNI_ALPHA, /* U+00ab0e: ETHIOPIC SYLLABLE DDHO*/
+ 0, /* U+00ab0f: */
+ 0, /* U+00ab10: */
+ RTUNI_ALPHA, /* U+00ab11: ETHIOPIC SYLLABLE DZU*/
+ RTUNI_ALPHA, /* U+00ab12: ETHIOPIC SYLLABLE DZI*/
+ RTUNI_ALPHA, /* U+00ab13: ETHIOPIC SYLLABLE DZAA*/
+ RTUNI_ALPHA, /* U+00ab14: ETHIOPIC SYLLABLE DZEE*/
+ RTUNI_ALPHA, /* U+00ab15: ETHIOPIC SYLLABLE DZE*/
+ RTUNI_ALPHA, /* U+00ab16: ETHIOPIC SYLLABLE DZO*/
+ 0, /* U+00ab17: */
+ 0, /* U+00ab18: */
+ 0, /* U+00ab19: */
+ 0, /* U+00ab1a: */
+ 0, /* U+00ab1b: */
+ 0, /* U+00ab1c: */
+ 0, /* U+00ab1d: */
+ 0, /* U+00ab1e: */
+ 0, /* U+00ab1f: */
+ RTUNI_ALPHA, /* U+00ab20: ETHIOPIC SYLLABLE CCHHA*/
+ RTUNI_ALPHA, /* U+00ab21: ETHIOPIC SYLLABLE CCHHU*/
+ RTUNI_ALPHA, /* U+00ab22: ETHIOPIC SYLLABLE CCHHI*/
+ RTUNI_ALPHA, /* U+00ab23: ETHIOPIC SYLLABLE CCHHAA*/
+ RTUNI_ALPHA, /* U+00ab24: ETHIOPIC SYLLABLE CCHHEE*/
+ RTUNI_ALPHA, /* U+00ab25: ETHIOPIC SYLLABLE CCHHE*/
+ RTUNI_ALPHA, /* U+00ab26: ETHIOPIC SYLLABLE CCHHO*/
+ 0, /* U+00ab27: */
+ RTUNI_ALPHA, /* U+00ab28: ETHIOPIC SYLLABLE BBA*/
+ RTUNI_ALPHA, /* U+00ab29: ETHIOPIC SYLLABLE BBU*/
+ RTUNI_ALPHA, /* U+00ab2a: ETHIOPIC SYLLABLE BBI*/
+ RTUNI_ALPHA, /* U+00ab2b: ETHIOPIC SYLLABLE BBAA*/
+ RTUNI_ALPHA, /* U+00ab2c: ETHIOPIC SYLLABLE BBEE*/
+ RTUNI_ALPHA, /* U+00ab2d: ETHIOPIC SYLLABLE BBE*/
+ RTUNI_ALPHA, /* U+00ab2e: ETHIOPIC SYLLABLE BBO*/
+ 0, /* U+00ab2f: */
+ 0, /* U+00ab30: */
+ 0, /* U+00ab31: */
+ 0, /* U+00ab32: */
+ 0, /* U+00ab33: */
+ 0, /* U+00ab34: */
+ 0, /* U+00ab35: */
+ 0, /* U+00ab36: */
+ 0, /* U+00ab37: */
+ 0, /* U+00ab38: */
+ 0, /* U+00ab39: */
+ 0, /* U+00ab3a: */
+ 0, /* U+00ab3b: */
+ 0, /* U+00ab3c: */
+ 0, /* U+00ab3d: */
+ 0, /* U+00ab3e: */
+ 0, /* U+00ab3f: */
+ 0, /* U+00ab40: */
+ 0, /* U+00ab41: */
+ 0, /* U+00ab42: */
+ 0, /* U+00ab43: */
+ 0, /* U+00ab44: */
+ 0, /* U+00ab45: */
+ 0, /* U+00ab46: */
+ 0, /* U+00ab47: */
+ 0, /* U+00ab48: */
+ 0, /* U+00ab49: */
+ 0, /* U+00ab4a: */
+ 0, /* U+00ab4b: */
+ 0, /* U+00ab4c: */
+ 0, /* U+00ab4d: */
+ 0, /* U+00ab4e: */
+ 0, /* U+00ab4f: */
+ 0, /* U+00ab50: */
+ 0, /* U+00ab51: */
+ 0, /* U+00ab52: */
+ 0, /* U+00ab53: */
+ 0, /* U+00ab54: */
+ 0, /* U+00ab55: */
+ 0, /* U+00ab56: */
+ 0, /* U+00ab57: */
+ 0, /* U+00ab58: */
+ 0, /* U+00ab59: */
+ 0, /* U+00ab5a: */
+ 0, /* U+00ab5b: */
+ 0, /* U+00ab5c: */
+ 0, /* U+00ab5d: */
+ 0, /* U+00ab5e: */
+ 0, /* U+00ab5f: */
+ 0, /* U+00ab60: */
+ 0, /* U+00ab61: */
+ 0, /* U+00ab62: */
+ 0, /* U+00ab63: */
+ 0, /* U+00ab64: */
+ 0, /* U+00ab65: */
+ 0, /* U+00ab66: */
+ 0, /* U+00ab67: */
+ 0, /* U+00ab68: */
+ 0, /* U+00ab69: */
+ 0, /* U+00ab6a: */
+ 0, /* U+00ab6b: */
+ 0, /* U+00ab6c: */
+ 0, /* U+00ab6d: */
+ 0, /* U+00ab6e: */
+ 0, /* U+00ab6f: */
+ 0, /* U+00ab70: */
+ 0, /* U+00ab71: */
+ 0, /* U+00ab72: */
+ 0, /* U+00ab73: */
+ 0, /* U+00ab74: */
+ 0, /* U+00ab75: */
+ 0, /* U+00ab76: */
+ 0, /* U+00ab77: */
+ 0, /* U+00ab78: */
+ 0, /* U+00ab79: */
+ 0, /* U+00ab7a: */
+ 0, /* U+00ab7b: */
+ 0, /* U+00ab7c: */
+ 0, /* U+00ab7d: */
+ 0, /* U+00ab7e: */
+ 0, /* U+00ab7f: */
+ 0, /* U+00ab80: */
+ 0, /* U+00ab81: */
+ 0, /* U+00ab82: */
+ 0, /* U+00ab83: */
+ 0, /* U+00ab84: */
+ 0, /* U+00ab85: */
+ 0, /* U+00ab86: */
+ 0, /* U+00ab87: */
+ 0, /* U+00ab88: */
+ 0, /* U+00ab89: */
+ 0, /* U+00ab8a: */
+ 0, /* U+00ab8b: */
+ 0, /* U+00ab8c: */
+ 0, /* U+00ab8d: */
+ 0, /* U+00ab8e: */
+ 0, /* U+00ab8f: */
+ 0, /* U+00ab90: */
+ 0, /* U+00ab91: */
+ 0, /* U+00ab92: */
+ 0, /* U+00ab93: */
+ 0, /* U+00ab94: */
+ 0, /* U+00ab95: */
+ 0, /* U+00ab96: */
+ 0, /* U+00ab97: */
+ 0, /* U+00ab98: */
+ 0, /* U+00ab99: */
+ 0, /* U+00ab9a: */
+ 0, /* U+00ab9b: */
+ 0, /* U+00ab9c: */
+ 0, /* U+00ab9d: */
+ 0, /* U+00ab9e: */
+ 0, /* U+00ab9f: */
+ 0, /* U+00aba0: */
+ 0, /* U+00aba1: */
+ 0, /* U+00aba2: */
+ 0, /* U+00aba3: */
+ 0, /* U+00aba4: */
+ 0, /* U+00aba5: */
+ 0, /* U+00aba6: */
+ 0, /* U+00aba7: */
+ 0, /* U+00aba8: */
+ 0, /* U+00aba9: */
+ 0, /* U+00abaa: */
+ 0, /* U+00abab: */
+ 0, /* U+00abac: */
+ 0, /* U+00abad: */
+ 0, /* U+00abae: */
+ 0, /* U+00abaf: */
+ 0, /* U+00abb0: */
+ 0, /* U+00abb1: */
+ 0, /* U+00abb2: */
+ 0, /* U+00abb3: */
+ 0, /* U+00abb4: */
+ 0, /* U+00abb5: */
+ 0, /* U+00abb6: */
+ 0, /* U+00abb7: */
+ 0, /* U+00abb8: */
+ 0, /* U+00abb9: */
+ 0, /* U+00abba: */
+ 0, /* U+00abbb: */
+ 0, /* U+00abbc: */
+ 0, /* U+00abbd: */
+ 0, /* U+00abbe: */
+ 0, /* U+00abbf: */
+ RTUNI_ALPHA, /* U+00abc0: MEETEI MAYEK LETTER KOK*/
+ RTUNI_ALPHA, /* U+00abc1: MEETEI MAYEK LETTER SAM*/
+ RTUNI_ALPHA, /* U+00abc2: MEETEI MAYEK LETTER LAI*/
+ RTUNI_ALPHA, /* U+00abc3: MEETEI MAYEK LETTER MIT*/
+ RTUNI_ALPHA, /* U+00abc4: MEETEI MAYEK LETTER PA*/
+ RTUNI_ALPHA, /* U+00abc5: MEETEI MAYEK LETTER NA*/
+ RTUNI_ALPHA, /* U+00abc6: MEETEI MAYEK LETTER CHIL*/
+ RTUNI_ALPHA, /* U+00abc7: MEETEI MAYEK LETTER TIL*/
+ RTUNI_ALPHA, /* U+00abc8: MEETEI MAYEK LETTER KHOU*/
+ RTUNI_ALPHA, /* U+00abc9: MEETEI MAYEK LETTER NGOU*/
+ RTUNI_ALPHA, /* U+00abca: MEETEI MAYEK LETTER THOU*/
+ RTUNI_ALPHA, /* U+00abcb: MEETEI MAYEK LETTER WAI*/
+ RTUNI_ALPHA, /* U+00abcc: MEETEI MAYEK LETTER YANG*/
+ RTUNI_ALPHA, /* U+00abcd: MEETEI MAYEK LETTER HUK*/
+ RTUNI_ALPHA, /* U+00abce: MEETEI MAYEK LETTER UN*/
+ RTUNI_ALPHA, /* U+00abcf: MEETEI MAYEK LETTER I*/
+ RTUNI_ALPHA, /* U+00abd0: MEETEI MAYEK LETTER PHAM*/
+ RTUNI_ALPHA, /* U+00abd1: MEETEI MAYEK LETTER ATIYA*/
+ RTUNI_ALPHA, /* U+00abd2: MEETEI MAYEK LETTER GOK*/
+ RTUNI_ALPHA, /* U+00abd3: MEETEI MAYEK LETTER JHAM*/
+ RTUNI_ALPHA, /* U+00abd4: MEETEI MAYEK LETTER RAI*/
+ RTUNI_ALPHA, /* U+00abd5: MEETEI MAYEK LETTER BA*/
+ RTUNI_ALPHA, /* U+00abd6: MEETEI MAYEK LETTER JIL*/
+ RTUNI_ALPHA, /* U+00abd7: MEETEI MAYEK LETTER DIL*/
+ RTUNI_ALPHA, /* U+00abd8: MEETEI MAYEK LETTER GHOU*/
+ RTUNI_ALPHA, /* U+00abd9: MEETEI MAYEK LETTER DHOU*/
+ RTUNI_ALPHA, /* U+00abda: MEETEI MAYEK LETTER BHAM*/
+ RTUNI_ALPHA, /* U+00abdb: MEETEI MAYEK LETTER KOK LONSUM*/
+ RTUNI_ALPHA, /* U+00abdc: MEETEI MAYEK LETTER LAI LONSUM*/
+ RTUNI_ALPHA, /* U+00abdd: MEETEI MAYEK LETTER MIT LONSUM*/
+ RTUNI_ALPHA, /* U+00abde: MEETEI MAYEK LETTER PA LONSUM*/
+ RTUNI_ALPHA, /* U+00abdf: MEETEI MAYEK LETTER NA LONSUM*/
+ RTUNI_ALPHA, /* U+00abe0: MEETEI MAYEK LETTER TIL LONSUM*/
+ RTUNI_ALPHA, /* U+00abe1: MEETEI MAYEK LETTER NGOU LONSUM*/
+ RTUNI_ALPHA, /* U+00abe2: MEETEI MAYEK LETTER I LONSUM*/
+ RTUNI_ALPHA, /* U+00abe3: MEETEI MAYEK VOWEL SIGN ONAP*/
+ RTUNI_ALPHA, /* U+00abe4: MEETEI MAYEK VOWEL SIGN INAP*/
+ RTUNI_ALPHA, /* U+00abe5: MEETEI MAYEK VOWEL SIGN ANAP*/
+ RTUNI_ALPHA, /* U+00abe6: MEETEI MAYEK VOWEL SIGN YENAP*/
+ RTUNI_ALPHA, /* U+00abe7: MEETEI MAYEK VOWEL SIGN SOUNAP*/
+ RTUNI_ALPHA, /* U+00abe8: MEETEI MAYEK VOWEL SIGN UNAP*/
+ RTUNI_ALPHA, /* U+00abe9: MEETEI MAYEK VOWEL SIGN CHEINAP*/
+ RTUNI_ALPHA, /* U+00abea: MEETEI MAYEK VOWEL SIGN NUNG*/
+ 0, /* U+00abeb: MEETEI MAYEK CHEIKHEI*/
+ 0, /* U+00abec: MEETEI MAYEK LUM IYEK*/
+ 0, /* U+00abed: MEETEI MAYEK APUN IYEK*/
+ 0, /* U+00abee: */
+ 0, /* U+00abef: */
+ RTUNI_DDIGIT, /* U+00abf0: MEETEI MAYEK DIGIT ZERO*/
+ RTUNI_DDIGIT, /* U+00abf1: MEETEI MAYEK DIGIT ONE*/
+ RTUNI_DDIGIT, /* U+00abf2: MEETEI MAYEK DIGIT TWO*/
+ RTUNI_DDIGIT, /* U+00abf3: MEETEI MAYEK DIGIT THREE*/
+ RTUNI_DDIGIT, /* U+00abf4: MEETEI MAYEK DIGIT FOUR*/
+ RTUNI_DDIGIT, /* U+00abf5: MEETEI MAYEK DIGIT FIVE*/
+ RTUNI_DDIGIT, /* U+00abf6: MEETEI MAYEK DIGIT SIX*/
+ RTUNI_DDIGIT, /* U+00abf7: MEETEI MAYEK DIGIT SEVEN*/
+ RTUNI_DDIGIT, /* U+00abf8: MEETEI MAYEK DIGIT EIGHT*/
+ RTUNI_DDIGIT, /* U+00abf9: MEETEI MAYEK DIGIT NINE*/
+ 0, /* U+00abfa: */
+ 0, /* U+00abfb: */
+ 0, /* U+00abfc: */
+ 0, /* U+00abfd: */
+ 0, /* U+00abfe: */
+ 0, /* U+00abff: */
+ RTUNI_ALPHA, /* U+00ac00: <Hangul Syllable, First>*/
+ RTUNI_ALPHA, /* U+00ac01: */
+ RTUNI_ALPHA, /* U+00ac02: */
+ RTUNI_ALPHA, /* U+00ac03: */
+ RTUNI_ALPHA, /* U+00ac04: */
+ RTUNI_ALPHA, /* U+00ac05: */
+ RTUNI_ALPHA, /* U+00ac06: */
+ RTUNI_ALPHA, /* U+00ac07: */
+ RTUNI_ALPHA, /* U+00ac08: */
+ RTUNI_ALPHA, /* U+00ac09: */
+ RTUNI_ALPHA, /* U+00ac0a: */
+ RTUNI_ALPHA, /* U+00ac0b: */
+ RTUNI_ALPHA, /* U+00ac0c: */
+ RTUNI_ALPHA, /* U+00ac0d: */
+ RTUNI_ALPHA, /* U+00ac0e: */
+ RTUNI_ALPHA, /* U+00ac0f: */
+ RTUNI_ALPHA, /* U+00ac10: */
+ RTUNI_ALPHA, /* U+00ac11: */
+ RTUNI_ALPHA, /* U+00ac12: */
+ RTUNI_ALPHA, /* U+00ac13: */
+ RTUNI_ALPHA, /* U+00ac14: */
+ RTUNI_ALPHA, /* U+00ac15: */
+ RTUNI_ALPHA, /* U+00ac16: */
+ RTUNI_ALPHA, /* U+00ac17: */
+ RTUNI_ALPHA, /* U+00ac18: */
+ RTUNI_ALPHA, /* U+00ac19: */
+ RTUNI_ALPHA, /* U+00ac1a: */
+ RTUNI_ALPHA, /* U+00ac1b: */
+ RTUNI_ALPHA, /* U+00ac1c: */
+ RTUNI_ALPHA, /* U+00ac1d: */
+ RTUNI_ALPHA, /* U+00ac1e: */
+ RTUNI_ALPHA, /* U+00ac1f: */
+ RTUNI_ALPHA, /* U+00ac20: */
+ RTUNI_ALPHA, /* U+00ac21: */
+ RTUNI_ALPHA, /* U+00ac22: */
+ RTUNI_ALPHA, /* U+00ac23: */
+ RTUNI_ALPHA, /* U+00ac24: */
+ RTUNI_ALPHA, /* U+00ac25: */
+ RTUNI_ALPHA, /* U+00ac26: */
+ RTUNI_ALPHA, /* U+00ac27: */
+ RTUNI_ALPHA, /* U+00ac28: */
+ RTUNI_ALPHA, /* U+00ac29: */
+ RTUNI_ALPHA, /* U+00ac2a: */
+ RTUNI_ALPHA, /* U+00ac2b: */
+ RTUNI_ALPHA, /* U+00ac2c: */
+ RTUNI_ALPHA, /* U+00ac2d: */
+ RTUNI_ALPHA, /* U+00ac2e: */
+ RTUNI_ALPHA, /* U+00ac2f: */
+ RTUNI_ALPHA, /* U+00ac30: */
+ RTUNI_ALPHA, /* U+00ac31: */
+ RTUNI_ALPHA, /* U+00ac32: */
+ RTUNI_ALPHA, /* U+00ac33: */
+ RTUNI_ALPHA, /* U+00ac34: */
+ RTUNI_ALPHA, /* U+00ac35: */
+ RTUNI_ALPHA, /* U+00ac36: */
+ RTUNI_ALPHA, /* U+00ac37: */
+ RTUNI_ALPHA, /* U+00ac38: */
+ RTUNI_ALPHA, /* U+00ac39: */
+ RTUNI_ALPHA, /* U+00ac3a: */
+ RTUNI_ALPHA, /* U+00ac3b: */
+ RTUNI_ALPHA, /* U+00ac3c: */
+ RTUNI_ALPHA, /* U+00ac3d: */
+ RTUNI_ALPHA, /* U+00ac3e: */
+ RTUNI_ALPHA, /* U+00ac3f: */
+ RTUNI_ALPHA, /* U+00ac40: */
+ RTUNI_ALPHA, /* U+00ac41: */
+ RTUNI_ALPHA, /* U+00ac42: */
+ RTUNI_ALPHA, /* U+00ac43: */
+ RTUNI_ALPHA, /* U+00ac44: */
+ RTUNI_ALPHA, /* U+00ac45: */
+ RTUNI_ALPHA, /* U+00ac46: */
+ RTUNI_ALPHA, /* U+00ac47: */
+ RTUNI_ALPHA, /* U+00ac48: */
+ RTUNI_ALPHA, /* U+00ac49: */
+ RTUNI_ALPHA, /* U+00ac4a: */
+ RTUNI_ALPHA, /* U+00ac4b: */
+ RTUNI_ALPHA, /* U+00ac4c: */
+ RTUNI_ALPHA, /* U+00ac4d: */
+ RTUNI_ALPHA, /* U+00ac4e: */
+ RTUNI_ALPHA, /* U+00ac4f: */
+ RTUNI_ALPHA, /* U+00ac50: */
+ RTUNI_ALPHA, /* U+00ac51: */
+ RTUNI_ALPHA, /* U+00ac52: */
+ RTUNI_ALPHA, /* U+00ac53: */
+ RTUNI_ALPHA, /* U+00ac54: */
+ RTUNI_ALPHA, /* U+00ac55: */
+ RTUNI_ALPHA, /* U+00ac56: */
+ RTUNI_ALPHA, /* U+00ac57: */
+ RTUNI_ALPHA, /* U+00ac58: */
+ RTUNI_ALPHA, /* U+00ac59: */
+ RTUNI_ALPHA, /* U+00ac5a: */
+ RTUNI_ALPHA, /* U+00ac5b: */
+ RTUNI_ALPHA, /* U+00ac5c: */
+ RTUNI_ALPHA, /* U+00ac5d: */
+ RTUNI_ALPHA, /* U+00ac5e: */
+ RTUNI_ALPHA, /* U+00ac5f: */
+ RTUNI_ALPHA, /* U+00ac60: */
+ RTUNI_ALPHA, /* U+00ac61: */
+ RTUNI_ALPHA, /* U+00ac62: */
+ RTUNI_ALPHA, /* U+00ac63: */
+ RTUNI_ALPHA, /* U+00ac64: */
+ RTUNI_ALPHA, /* U+00ac65: */
+ RTUNI_ALPHA, /* U+00ac66: */
+ RTUNI_ALPHA, /* U+00ac67: */
+ RTUNI_ALPHA, /* U+00ac68: */
+ RTUNI_ALPHA, /* U+00ac69: */
+ RTUNI_ALPHA, /* U+00ac6a: */
+ RTUNI_ALPHA, /* U+00ac6b: */
+ RTUNI_ALPHA, /* U+00ac6c: */
+ RTUNI_ALPHA, /* U+00ac6d: */
+ RTUNI_ALPHA, /* U+00ac6e: */
+ RTUNI_ALPHA, /* U+00ac6f: */
+ RTUNI_ALPHA, /* U+00ac70: */
+ RTUNI_ALPHA, /* U+00ac71: */
+ RTUNI_ALPHA, /* U+00ac72: */
+ RTUNI_ALPHA, /* U+00ac73: */
+ RTUNI_ALPHA, /* U+00ac74: */
+ RTUNI_ALPHA, /* U+00ac75: */
+ RTUNI_ALPHA, /* U+00ac76: */
+ RTUNI_ALPHA, /* U+00ac77: */
+ RTUNI_ALPHA, /* U+00ac78: */
+ RTUNI_ALPHA, /* U+00ac79: */
+ RTUNI_ALPHA, /* U+00ac7a: */
+ RTUNI_ALPHA, /* U+00ac7b: */
+ RTUNI_ALPHA, /* U+00ac7c: */
+ RTUNI_ALPHA, /* U+00ac7d: */
+ RTUNI_ALPHA, /* U+00ac7e: */
+ RTUNI_ALPHA, /* U+00ac7f: */
+ RTUNI_ALPHA, /* U+00ac80: */
+ RTUNI_ALPHA, /* U+00ac81: */
+ RTUNI_ALPHA, /* U+00ac82: */
+ RTUNI_ALPHA, /* U+00ac83: */
+ RTUNI_ALPHA, /* U+00ac84: */
+ RTUNI_ALPHA, /* U+00ac85: */
+ RTUNI_ALPHA, /* U+00ac86: */
+ RTUNI_ALPHA, /* U+00ac87: */
+ RTUNI_ALPHA, /* U+00ac88: */
+ RTUNI_ALPHA, /* U+00ac89: */
+ RTUNI_ALPHA, /* U+00ac8a: */
+ RTUNI_ALPHA, /* U+00ac8b: */
+ RTUNI_ALPHA, /* U+00ac8c: */
+ RTUNI_ALPHA, /* U+00ac8d: */
+ RTUNI_ALPHA, /* U+00ac8e: */
+ RTUNI_ALPHA, /* U+00ac8f: */
+ RTUNI_ALPHA, /* U+00ac90: */
+ RTUNI_ALPHA, /* U+00ac91: */
+ RTUNI_ALPHA, /* U+00ac92: */
+ RTUNI_ALPHA, /* U+00ac93: */
+ RTUNI_ALPHA, /* U+00ac94: */
+ RTUNI_ALPHA, /* U+00ac95: */
+ RTUNI_ALPHA, /* U+00ac96: */
+ RTUNI_ALPHA, /* U+00ac97: */
+ RTUNI_ALPHA, /* U+00ac98: */
+ RTUNI_ALPHA, /* U+00ac99: */
+ RTUNI_ALPHA, /* U+00ac9a: */
+ RTUNI_ALPHA, /* U+00ac9b: */
+ RTUNI_ALPHA, /* U+00ac9c: */
+ RTUNI_ALPHA, /* U+00ac9d: */
+ RTUNI_ALPHA, /* U+00ac9e: */
+ RTUNI_ALPHA, /* U+00ac9f: */
+ RTUNI_ALPHA, /* U+00aca0: */
+ RTUNI_ALPHA, /* U+00aca1: */
+ RTUNI_ALPHA, /* U+00aca2: */
+ RTUNI_ALPHA, /* U+00aca3: */
+ RTUNI_ALPHA, /* U+00aca4: */
+ RTUNI_ALPHA, /* U+00aca5: */
+ RTUNI_ALPHA, /* U+00aca6: */
+ RTUNI_ALPHA, /* U+00aca7: */
+ RTUNI_ALPHA, /* U+00aca8: */
+ RTUNI_ALPHA, /* U+00aca9: */
+ RTUNI_ALPHA, /* U+00acaa: */
+ RTUNI_ALPHA, /* U+00acab: */
+ RTUNI_ALPHA, /* U+00acac: */
+ RTUNI_ALPHA, /* U+00acad: */
+ RTUNI_ALPHA, /* U+00acae: */
+ RTUNI_ALPHA, /* U+00acaf: */
+ RTUNI_ALPHA, /* U+00acb0: */
+ RTUNI_ALPHA, /* U+00acb1: */
+ RTUNI_ALPHA, /* U+00acb2: */
+ RTUNI_ALPHA, /* U+00acb3: */
+ RTUNI_ALPHA, /* U+00acb4: */
+ RTUNI_ALPHA, /* U+00acb5: */
+ RTUNI_ALPHA, /* U+00acb6: */
+ RTUNI_ALPHA, /* U+00acb7: */
+ RTUNI_ALPHA, /* U+00acb8: */
+ RTUNI_ALPHA, /* U+00acb9: */
+ RTUNI_ALPHA, /* U+00acba: */
+ RTUNI_ALPHA, /* U+00acbb: */
+ RTUNI_ALPHA, /* U+00acbc: */
+ RTUNI_ALPHA, /* U+00acbd: */
+ RTUNI_ALPHA, /* U+00acbe: */
+ RTUNI_ALPHA, /* U+00acbf: */
+ RTUNI_ALPHA, /* U+00acc0: */
+ RTUNI_ALPHA, /* U+00acc1: */
+ RTUNI_ALPHA, /* U+00acc2: */
+ RTUNI_ALPHA, /* U+00acc3: */
+ RTUNI_ALPHA, /* U+00acc4: */
+ RTUNI_ALPHA, /* U+00acc5: */
+ RTUNI_ALPHA, /* U+00acc6: */
+ RTUNI_ALPHA, /* U+00acc7: */
+ RTUNI_ALPHA, /* U+00acc8: */
+ RTUNI_ALPHA, /* U+00acc9: */
+ RTUNI_ALPHA, /* U+00acca: */
+ RTUNI_ALPHA, /* U+00accb: */
+ RTUNI_ALPHA, /* U+00accc: */
+ RTUNI_ALPHA, /* U+00accd: */
+ RTUNI_ALPHA, /* U+00acce: */
+ RTUNI_ALPHA, /* U+00accf: */
+ RTUNI_ALPHA, /* U+00acd0: */
+ RTUNI_ALPHA, /* U+00acd1: */
+ RTUNI_ALPHA, /* U+00acd2: */
+ RTUNI_ALPHA, /* U+00acd3: */
+ RTUNI_ALPHA, /* U+00acd4: */
+ RTUNI_ALPHA, /* U+00acd5: */
+ RTUNI_ALPHA, /* U+00acd6: */
+ RTUNI_ALPHA, /* U+00acd7: */
+ RTUNI_ALPHA, /* U+00acd8: */
+ RTUNI_ALPHA, /* U+00acd9: */
+ RTUNI_ALPHA, /* U+00acda: */
+ RTUNI_ALPHA, /* U+00acdb: */
+ RTUNI_ALPHA, /* U+00acdc: */
+ RTUNI_ALPHA, /* U+00acdd: */
+ RTUNI_ALPHA, /* U+00acde: */
+ RTUNI_ALPHA, /* U+00acdf: */
+ RTUNI_ALPHA, /* U+00ace0: */
+ RTUNI_ALPHA, /* U+00ace1: */
+ RTUNI_ALPHA, /* U+00ace2: */
+ RTUNI_ALPHA, /* U+00ace3: */
+ RTUNI_ALPHA, /* U+00ace4: */
+ RTUNI_ALPHA, /* U+00ace5: */
+ RTUNI_ALPHA, /* U+00ace6: */
+ RTUNI_ALPHA, /* U+00ace7: */
+ RTUNI_ALPHA, /* U+00ace8: */
+ RTUNI_ALPHA, /* U+00ace9: */
+ RTUNI_ALPHA, /* U+00acea: */
+ RTUNI_ALPHA, /* U+00aceb: */
+ RTUNI_ALPHA, /* U+00acec: */
+ RTUNI_ALPHA, /* U+00aced: */
+ RTUNI_ALPHA, /* U+00acee: */
+ RTUNI_ALPHA, /* U+00acef: */
+ RTUNI_ALPHA, /* U+00acf0: */
+ RTUNI_ALPHA, /* U+00acf1: */
+ RTUNI_ALPHA, /* U+00acf2: */
+ RTUNI_ALPHA, /* U+00acf3: */
+ RTUNI_ALPHA, /* U+00acf4: */
+ RTUNI_ALPHA, /* U+00acf5: */
+ RTUNI_ALPHA, /* U+00acf6: */
+ RTUNI_ALPHA, /* U+00acf7: */
+ RTUNI_ALPHA, /* U+00acf8: */
+ RTUNI_ALPHA, /* U+00acf9: */
+ RTUNI_ALPHA, /* U+00acfa: */
+ RTUNI_ALPHA, /* U+00acfb: */
+ RTUNI_ALPHA, /* U+00acfc: */
+ RTUNI_ALPHA, /* U+00acfd: */
+ RTUNI_ALPHA, /* U+00acfe: */
+ RTUNI_ALPHA, /* U+00acff: */
+ RTUNI_ALPHA, /* U+00ad00: */
+ RTUNI_ALPHA, /* U+00ad01: */
+ RTUNI_ALPHA, /* U+00ad02: */
+ RTUNI_ALPHA, /* U+00ad03: */
+ RTUNI_ALPHA, /* U+00ad04: */
+ RTUNI_ALPHA, /* U+00ad05: */
+ RTUNI_ALPHA, /* U+00ad06: */
+ RTUNI_ALPHA, /* U+00ad07: */
+ RTUNI_ALPHA, /* U+00ad08: */
+ RTUNI_ALPHA, /* U+00ad09: */
+ RTUNI_ALPHA, /* U+00ad0a: */
+ RTUNI_ALPHA, /* U+00ad0b: */
+ RTUNI_ALPHA, /* U+00ad0c: */
+ RTUNI_ALPHA, /* U+00ad0d: */
+ RTUNI_ALPHA, /* U+00ad0e: */
+ RTUNI_ALPHA, /* U+00ad0f: */
+ RTUNI_ALPHA, /* U+00ad10: */
+ RTUNI_ALPHA, /* U+00ad11: */
+ RTUNI_ALPHA, /* U+00ad12: */
+ RTUNI_ALPHA, /* U+00ad13: */
+ RTUNI_ALPHA, /* U+00ad14: */
+ RTUNI_ALPHA, /* U+00ad15: */
+ RTUNI_ALPHA, /* U+00ad16: */
+ RTUNI_ALPHA, /* U+00ad17: */
+ RTUNI_ALPHA, /* U+00ad18: */
+ RTUNI_ALPHA, /* U+00ad19: */
+ RTUNI_ALPHA, /* U+00ad1a: */
+ RTUNI_ALPHA, /* U+00ad1b: */
+ RTUNI_ALPHA, /* U+00ad1c: */
+ RTUNI_ALPHA, /* U+00ad1d: */
+ RTUNI_ALPHA, /* U+00ad1e: */
+ RTUNI_ALPHA, /* U+00ad1f: */
+ RTUNI_ALPHA, /* U+00ad20: */
+ RTUNI_ALPHA, /* U+00ad21: */
+ RTUNI_ALPHA, /* U+00ad22: */
+ RTUNI_ALPHA, /* U+00ad23: */
+ RTUNI_ALPHA, /* U+00ad24: */
+ RTUNI_ALPHA, /* U+00ad25: */
+ RTUNI_ALPHA, /* U+00ad26: */
+ RTUNI_ALPHA, /* U+00ad27: */
+ RTUNI_ALPHA, /* U+00ad28: */
+ RTUNI_ALPHA, /* U+00ad29: */
+ RTUNI_ALPHA, /* U+00ad2a: */
+ RTUNI_ALPHA, /* U+00ad2b: */
+ RTUNI_ALPHA, /* U+00ad2c: */
+ RTUNI_ALPHA, /* U+00ad2d: */
+ RTUNI_ALPHA, /* U+00ad2e: */
+ RTUNI_ALPHA, /* U+00ad2f: */
+ RTUNI_ALPHA, /* U+00ad30: */
+ RTUNI_ALPHA, /* U+00ad31: */
+ RTUNI_ALPHA, /* U+00ad32: */
+ RTUNI_ALPHA, /* U+00ad33: */
+ RTUNI_ALPHA, /* U+00ad34: */
+ RTUNI_ALPHA, /* U+00ad35: */
+ RTUNI_ALPHA, /* U+00ad36: */
+ RTUNI_ALPHA, /* U+00ad37: */
+ RTUNI_ALPHA, /* U+00ad38: */
+ RTUNI_ALPHA, /* U+00ad39: */
+ RTUNI_ALPHA, /* U+00ad3a: */
+ RTUNI_ALPHA, /* U+00ad3b: */
+ RTUNI_ALPHA, /* U+00ad3c: */
+ RTUNI_ALPHA, /* U+00ad3d: */
+ RTUNI_ALPHA, /* U+00ad3e: */
+ RTUNI_ALPHA, /* U+00ad3f: */
+ RTUNI_ALPHA, /* U+00ad40: */
+ RTUNI_ALPHA, /* U+00ad41: */
+ RTUNI_ALPHA, /* U+00ad42: */
+ RTUNI_ALPHA, /* U+00ad43: */
+ RTUNI_ALPHA, /* U+00ad44: */
+ RTUNI_ALPHA, /* U+00ad45: */
+ RTUNI_ALPHA, /* U+00ad46: */
+ RTUNI_ALPHA, /* U+00ad47: */
+ RTUNI_ALPHA, /* U+00ad48: */
+ RTUNI_ALPHA, /* U+00ad49: */
+ RTUNI_ALPHA, /* U+00ad4a: */
+ RTUNI_ALPHA, /* U+00ad4b: */
+ RTUNI_ALPHA, /* U+00ad4c: */
+ RTUNI_ALPHA, /* U+00ad4d: */
+ RTUNI_ALPHA, /* U+00ad4e: */
+ RTUNI_ALPHA, /* U+00ad4f: */
+ RTUNI_ALPHA, /* U+00ad50: */
+ RTUNI_ALPHA, /* U+00ad51: */
+ RTUNI_ALPHA, /* U+00ad52: */
+ RTUNI_ALPHA, /* U+00ad53: */
+ RTUNI_ALPHA, /* U+00ad54: */
+ RTUNI_ALPHA, /* U+00ad55: */
+ RTUNI_ALPHA, /* U+00ad56: */
+ RTUNI_ALPHA, /* U+00ad57: */
+ RTUNI_ALPHA, /* U+00ad58: */
+ RTUNI_ALPHA, /* U+00ad59: */
+ RTUNI_ALPHA, /* U+00ad5a: */
+ RTUNI_ALPHA, /* U+00ad5b: */
+ RTUNI_ALPHA, /* U+00ad5c: */
+ RTUNI_ALPHA, /* U+00ad5d: */
+ RTUNI_ALPHA, /* U+00ad5e: */
+ RTUNI_ALPHA, /* U+00ad5f: */
+ RTUNI_ALPHA, /* U+00ad60: */
+ RTUNI_ALPHA, /* U+00ad61: */
+ RTUNI_ALPHA, /* U+00ad62: */
+ RTUNI_ALPHA, /* U+00ad63: */
+ RTUNI_ALPHA, /* U+00ad64: */
+ RTUNI_ALPHA, /* U+00ad65: */
+ RTUNI_ALPHA, /* U+00ad66: */
+ RTUNI_ALPHA, /* U+00ad67: */
+ RTUNI_ALPHA, /* U+00ad68: */
+ RTUNI_ALPHA, /* U+00ad69: */
+ RTUNI_ALPHA, /* U+00ad6a: */
+ RTUNI_ALPHA, /* U+00ad6b: */
+ RTUNI_ALPHA, /* U+00ad6c: */
+ RTUNI_ALPHA, /* U+00ad6d: */
+ RTUNI_ALPHA, /* U+00ad6e: */
+ RTUNI_ALPHA, /* U+00ad6f: */
+ RTUNI_ALPHA, /* U+00ad70: */
+ RTUNI_ALPHA, /* U+00ad71: */
+ RTUNI_ALPHA, /* U+00ad72: */
+ RTUNI_ALPHA, /* U+00ad73: */
+ RTUNI_ALPHA, /* U+00ad74: */
+ RTUNI_ALPHA, /* U+00ad75: */
+ RTUNI_ALPHA, /* U+00ad76: */
+ RTUNI_ALPHA, /* U+00ad77: */
+ RTUNI_ALPHA, /* U+00ad78: */
+ RTUNI_ALPHA, /* U+00ad79: */
+ RTUNI_ALPHA, /* U+00ad7a: */
+ RTUNI_ALPHA, /* U+00ad7b: */
+ RTUNI_ALPHA, /* U+00ad7c: */
+ RTUNI_ALPHA, /* U+00ad7d: */
+ RTUNI_ALPHA, /* U+00ad7e: */
+ RTUNI_ALPHA, /* U+00ad7f: */
+ RTUNI_ALPHA, /* U+00ad80: */
+ RTUNI_ALPHA, /* U+00ad81: */
+ RTUNI_ALPHA, /* U+00ad82: */
+ RTUNI_ALPHA, /* U+00ad83: */
+ RTUNI_ALPHA, /* U+00ad84: */
+ RTUNI_ALPHA, /* U+00ad85: */
+ RTUNI_ALPHA, /* U+00ad86: */
+ RTUNI_ALPHA, /* U+00ad87: */
+ RTUNI_ALPHA, /* U+00ad88: */
+ RTUNI_ALPHA, /* U+00ad89: */
+ RTUNI_ALPHA, /* U+00ad8a: */
+ RTUNI_ALPHA, /* U+00ad8b: */
+ RTUNI_ALPHA, /* U+00ad8c: */
+ RTUNI_ALPHA, /* U+00ad8d: */
+ RTUNI_ALPHA, /* U+00ad8e: */
+ RTUNI_ALPHA, /* U+00ad8f: */
+ RTUNI_ALPHA, /* U+00ad90: */
+ RTUNI_ALPHA, /* U+00ad91: */
+ RTUNI_ALPHA, /* U+00ad92: */
+ RTUNI_ALPHA, /* U+00ad93: */
+ RTUNI_ALPHA, /* U+00ad94: */
+ RTUNI_ALPHA, /* U+00ad95: */
+ RTUNI_ALPHA, /* U+00ad96: */
+ RTUNI_ALPHA, /* U+00ad97: */
+ RTUNI_ALPHA, /* U+00ad98: */
+ RTUNI_ALPHA, /* U+00ad99: */
+ RTUNI_ALPHA, /* U+00ad9a: */
+ RTUNI_ALPHA, /* U+00ad9b: */
+ RTUNI_ALPHA, /* U+00ad9c: */
+ RTUNI_ALPHA, /* U+00ad9d: */
+ RTUNI_ALPHA, /* U+00ad9e: */
+ RTUNI_ALPHA, /* U+00ad9f: */
+ RTUNI_ALPHA, /* U+00ada0: */
+ RTUNI_ALPHA, /* U+00ada1: */
+ RTUNI_ALPHA, /* U+00ada2: */
+ RTUNI_ALPHA, /* U+00ada3: */
+ RTUNI_ALPHA, /* U+00ada4: */
+ RTUNI_ALPHA, /* U+00ada5: */
+ RTUNI_ALPHA, /* U+00ada6: */
+ RTUNI_ALPHA, /* U+00ada7: */
+ RTUNI_ALPHA, /* U+00ada8: */
+ RTUNI_ALPHA, /* U+00ada9: */
+ RTUNI_ALPHA, /* U+00adaa: */
+ RTUNI_ALPHA, /* U+00adab: */
+ RTUNI_ALPHA, /* U+00adac: */
+ RTUNI_ALPHA, /* U+00adad: */
+ RTUNI_ALPHA, /* U+00adae: */
+ RTUNI_ALPHA, /* U+00adaf: */
+ RTUNI_ALPHA, /* U+00adb0: */
+ RTUNI_ALPHA, /* U+00adb1: */
+ RTUNI_ALPHA, /* U+00adb2: */
+ RTUNI_ALPHA, /* U+00adb3: */
+ RTUNI_ALPHA, /* U+00adb4: */
+ RTUNI_ALPHA, /* U+00adb5: */
+ RTUNI_ALPHA, /* U+00adb6: */
+ RTUNI_ALPHA, /* U+00adb7: */
+ RTUNI_ALPHA, /* U+00adb8: */
+ RTUNI_ALPHA, /* U+00adb9: */
+ RTUNI_ALPHA, /* U+00adba: */
+ RTUNI_ALPHA, /* U+00adbb: */
+ RTUNI_ALPHA, /* U+00adbc: */
+ RTUNI_ALPHA, /* U+00adbd: */
+ RTUNI_ALPHA, /* U+00adbe: */
+ RTUNI_ALPHA, /* U+00adbf: */
+ RTUNI_ALPHA, /* U+00adc0: */
+ RTUNI_ALPHA, /* U+00adc1: */
+ RTUNI_ALPHA, /* U+00adc2: */
+ RTUNI_ALPHA, /* U+00adc3: */
+ RTUNI_ALPHA, /* U+00adc4: */
+ RTUNI_ALPHA, /* U+00adc5: */
+ RTUNI_ALPHA, /* U+00adc6: */
+ RTUNI_ALPHA, /* U+00adc7: */
+ RTUNI_ALPHA, /* U+00adc8: */
+ RTUNI_ALPHA, /* U+00adc9: */
+ RTUNI_ALPHA, /* U+00adca: */
+ RTUNI_ALPHA, /* U+00adcb: */
+ RTUNI_ALPHA, /* U+00adcc: */
+ RTUNI_ALPHA, /* U+00adcd: */
+ RTUNI_ALPHA, /* U+00adce: */
+ RTUNI_ALPHA, /* U+00adcf: */
+ RTUNI_ALPHA, /* U+00add0: */
+ RTUNI_ALPHA, /* U+00add1: */
+ RTUNI_ALPHA, /* U+00add2: */
+ RTUNI_ALPHA, /* U+00add3: */
+ RTUNI_ALPHA, /* U+00add4: */
+ RTUNI_ALPHA, /* U+00add5: */
+ RTUNI_ALPHA, /* U+00add6: */
+ RTUNI_ALPHA, /* U+00add7: */
+ RTUNI_ALPHA, /* U+00add8: */
+ RTUNI_ALPHA, /* U+00add9: */
+ RTUNI_ALPHA, /* U+00adda: */
+ RTUNI_ALPHA, /* U+00addb: */
+ RTUNI_ALPHA, /* U+00addc: */
+ RTUNI_ALPHA, /* U+00addd: */
+ RTUNI_ALPHA, /* U+00adde: */
+ RTUNI_ALPHA, /* U+00addf: */
+ RTUNI_ALPHA, /* U+00ade0: */
+ RTUNI_ALPHA, /* U+00ade1: */
+ RTUNI_ALPHA, /* U+00ade2: */
+ RTUNI_ALPHA, /* U+00ade3: */
+ RTUNI_ALPHA, /* U+00ade4: */
+ RTUNI_ALPHA, /* U+00ade5: */
+ RTUNI_ALPHA, /* U+00ade6: */
+ RTUNI_ALPHA, /* U+00ade7: */
+ RTUNI_ALPHA, /* U+00ade8: */
+ RTUNI_ALPHA, /* U+00ade9: */
+ RTUNI_ALPHA, /* U+00adea: */
+ RTUNI_ALPHA, /* U+00adeb: */
+ RTUNI_ALPHA, /* U+00adec: */
+ RTUNI_ALPHA, /* U+00aded: */
+ RTUNI_ALPHA, /* U+00adee: */
+ RTUNI_ALPHA, /* U+00adef: */
+ RTUNI_ALPHA, /* U+00adf0: */
+ RTUNI_ALPHA, /* U+00adf1: */
+ RTUNI_ALPHA, /* U+00adf2: */
+ RTUNI_ALPHA, /* U+00adf3: */
+ RTUNI_ALPHA, /* U+00adf4: */
+ RTUNI_ALPHA, /* U+00adf5: */
+ RTUNI_ALPHA, /* U+00adf6: */
+ RTUNI_ALPHA, /* U+00adf7: */
+ RTUNI_ALPHA, /* U+00adf8: */
+ RTUNI_ALPHA, /* U+00adf9: */
+ RTUNI_ALPHA, /* U+00adfa: */
+ RTUNI_ALPHA, /* U+00adfb: */
+ RTUNI_ALPHA, /* U+00adfc: */
+ RTUNI_ALPHA, /* U+00adfd: */
+ RTUNI_ALPHA, /* U+00adfe: */
+ RTUNI_ALPHA, /* U+00adff: */
+ RTUNI_ALPHA, /* U+00ae00: */
+ RTUNI_ALPHA, /* U+00ae01: */
+ RTUNI_ALPHA, /* U+00ae02: */
+ RTUNI_ALPHA, /* U+00ae03: */
+ RTUNI_ALPHA, /* U+00ae04: */
+ RTUNI_ALPHA, /* U+00ae05: */
+ RTUNI_ALPHA, /* U+00ae06: */
+ RTUNI_ALPHA, /* U+00ae07: */
+ RTUNI_ALPHA, /* U+00ae08: */
+ RTUNI_ALPHA, /* U+00ae09: */
+ RTUNI_ALPHA, /* U+00ae0a: */
+ RTUNI_ALPHA, /* U+00ae0b: */
+ RTUNI_ALPHA, /* U+00ae0c: */
+ RTUNI_ALPHA, /* U+00ae0d: */
+ RTUNI_ALPHA, /* U+00ae0e: */
+ RTUNI_ALPHA, /* U+00ae0f: */
+ RTUNI_ALPHA, /* U+00ae10: */
+ RTUNI_ALPHA, /* U+00ae11: */
+ RTUNI_ALPHA, /* U+00ae12: */
+ RTUNI_ALPHA, /* U+00ae13: */
+ RTUNI_ALPHA, /* U+00ae14: */
+ RTUNI_ALPHA, /* U+00ae15: */
+ RTUNI_ALPHA, /* U+00ae16: */
+ RTUNI_ALPHA, /* U+00ae17: */
+ RTUNI_ALPHA, /* U+00ae18: */
+ RTUNI_ALPHA, /* U+00ae19: */
+ RTUNI_ALPHA, /* U+00ae1a: */
+ RTUNI_ALPHA, /* U+00ae1b: */
+ RTUNI_ALPHA, /* U+00ae1c: */
+ RTUNI_ALPHA, /* U+00ae1d: */
+ RTUNI_ALPHA, /* U+00ae1e: */
+ RTUNI_ALPHA, /* U+00ae1f: */
+ RTUNI_ALPHA, /* U+00ae20: */
+ RTUNI_ALPHA, /* U+00ae21: */
+ RTUNI_ALPHA, /* U+00ae22: */
+ RTUNI_ALPHA, /* U+00ae23: */
+ RTUNI_ALPHA, /* U+00ae24: */
+ RTUNI_ALPHA, /* U+00ae25: */
+ RTUNI_ALPHA, /* U+00ae26: */
+ RTUNI_ALPHA, /* U+00ae27: */
+ RTUNI_ALPHA, /* U+00ae28: */
+ RTUNI_ALPHA, /* U+00ae29: */
+ RTUNI_ALPHA, /* U+00ae2a: */
+ RTUNI_ALPHA, /* U+00ae2b: */
+ RTUNI_ALPHA, /* U+00ae2c: */
+ RTUNI_ALPHA, /* U+00ae2d: */
+ RTUNI_ALPHA, /* U+00ae2e: */
+ RTUNI_ALPHA, /* U+00ae2f: */
+ RTUNI_ALPHA, /* U+00ae30: */
+ RTUNI_ALPHA, /* U+00ae31: */
+ RTUNI_ALPHA, /* U+00ae32: */
+ RTUNI_ALPHA, /* U+00ae33: */
+ RTUNI_ALPHA, /* U+00ae34: */
+ RTUNI_ALPHA, /* U+00ae35: */
+ RTUNI_ALPHA, /* U+00ae36: */
+ RTUNI_ALPHA, /* U+00ae37: */
+ RTUNI_ALPHA, /* U+00ae38: */
+ RTUNI_ALPHA, /* U+00ae39: */
+ RTUNI_ALPHA, /* U+00ae3a: */
+ RTUNI_ALPHA, /* U+00ae3b: */
+ RTUNI_ALPHA, /* U+00ae3c: */
+ RTUNI_ALPHA, /* U+00ae3d: */
+ RTUNI_ALPHA, /* U+00ae3e: */
+ RTUNI_ALPHA, /* U+00ae3f: */
+ RTUNI_ALPHA, /* U+00ae40: */
+ RTUNI_ALPHA, /* U+00ae41: */
+ RTUNI_ALPHA, /* U+00ae42: */
+ RTUNI_ALPHA, /* U+00ae43: */
+ RTUNI_ALPHA, /* U+00ae44: */
+ RTUNI_ALPHA, /* U+00ae45: */
+ RTUNI_ALPHA, /* U+00ae46: */
+ RTUNI_ALPHA, /* U+00ae47: */
+ RTUNI_ALPHA, /* U+00ae48: */
+ RTUNI_ALPHA, /* U+00ae49: */
+ RTUNI_ALPHA, /* U+00ae4a: */
+ RTUNI_ALPHA, /* U+00ae4b: */
+ RTUNI_ALPHA, /* U+00ae4c: */
+ RTUNI_ALPHA, /* U+00ae4d: */
+ RTUNI_ALPHA, /* U+00ae4e: */
+ RTUNI_ALPHA, /* U+00ae4f: */
+ RTUNI_ALPHA, /* U+00ae50: */
+ RTUNI_ALPHA, /* U+00ae51: */
+ RTUNI_ALPHA, /* U+00ae52: */
+ RTUNI_ALPHA, /* U+00ae53: */
+ RTUNI_ALPHA, /* U+00ae54: */
+ RTUNI_ALPHA, /* U+00ae55: */
+ RTUNI_ALPHA, /* U+00ae56: */
+ RTUNI_ALPHA, /* U+00ae57: */
+ RTUNI_ALPHA, /* U+00ae58: */
+ RTUNI_ALPHA, /* U+00ae59: */
+ RTUNI_ALPHA, /* U+00ae5a: */
+ RTUNI_ALPHA, /* U+00ae5b: */
+ RTUNI_ALPHA, /* U+00ae5c: */
+ RTUNI_ALPHA, /* U+00ae5d: */
+ RTUNI_ALPHA, /* U+00ae5e: */
+ RTUNI_ALPHA, /* U+00ae5f: */
+ RTUNI_ALPHA, /* U+00ae60: */
+ RTUNI_ALPHA, /* U+00ae61: */
+ RTUNI_ALPHA, /* U+00ae62: */
+ RTUNI_ALPHA, /* U+00ae63: */
+ RTUNI_ALPHA, /* U+00ae64: */
+ RTUNI_ALPHA, /* U+00ae65: */
+ RTUNI_ALPHA, /* U+00ae66: */
+ RTUNI_ALPHA, /* U+00ae67: */
+ RTUNI_ALPHA, /* U+00ae68: */
+ RTUNI_ALPHA, /* U+00ae69: */
+ RTUNI_ALPHA, /* U+00ae6a: */
+ RTUNI_ALPHA, /* U+00ae6b: */
+ RTUNI_ALPHA, /* U+00ae6c: */
+ RTUNI_ALPHA, /* U+00ae6d: */
+ RTUNI_ALPHA, /* U+00ae6e: */
+ RTUNI_ALPHA, /* U+00ae6f: */
+ RTUNI_ALPHA, /* U+00ae70: */
+ RTUNI_ALPHA, /* U+00ae71: */
+ RTUNI_ALPHA, /* U+00ae72: */
+ RTUNI_ALPHA, /* U+00ae73: */
+ RTUNI_ALPHA, /* U+00ae74: */
+ RTUNI_ALPHA, /* U+00ae75: */
+ RTUNI_ALPHA, /* U+00ae76: */
+ RTUNI_ALPHA, /* U+00ae77: */
+ RTUNI_ALPHA, /* U+00ae78: */
+ RTUNI_ALPHA, /* U+00ae79: */
+ RTUNI_ALPHA, /* U+00ae7a: */
+ RTUNI_ALPHA, /* U+00ae7b: */
+ RTUNI_ALPHA, /* U+00ae7c: */
+ RTUNI_ALPHA, /* U+00ae7d: */
+ RTUNI_ALPHA, /* U+00ae7e: */
+ RTUNI_ALPHA, /* U+00ae7f: */
+ RTUNI_ALPHA, /* U+00ae80: */
+ RTUNI_ALPHA, /* U+00ae81: */
+ RTUNI_ALPHA, /* U+00ae82: */
+ RTUNI_ALPHA, /* U+00ae83: */
+ RTUNI_ALPHA, /* U+00ae84: */
+ RTUNI_ALPHA, /* U+00ae85: */
+ RTUNI_ALPHA, /* U+00ae86: */
+ RTUNI_ALPHA, /* U+00ae87: */
+ RTUNI_ALPHA, /* U+00ae88: */
+ RTUNI_ALPHA, /* U+00ae89: */
+ RTUNI_ALPHA, /* U+00ae8a: */
+ RTUNI_ALPHA, /* U+00ae8b: */
+ RTUNI_ALPHA, /* U+00ae8c: */
+ RTUNI_ALPHA, /* U+00ae8d: */
+ RTUNI_ALPHA, /* U+00ae8e: */
+ RTUNI_ALPHA, /* U+00ae8f: */
+ RTUNI_ALPHA, /* U+00ae90: */
+ RTUNI_ALPHA, /* U+00ae91: */
+ RTUNI_ALPHA, /* U+00ae92: */
+ RTUNI_ALPHA, /* U+00ae93: */
+ RTUNI_ALPHA, /* U+00ae94: */
+ RTUNI_ALPHA, /* U+00ae95: */
+ RTUNI_ALPHA, /* U+00ae96: */
+ RTUNI_ALPHA, /* U+00ae97: */
+ RTUNI_ALPHA, /* U+00ae98: */
+ RTUNI_ALPHA, /* U+00ae99: */
+ RTUNI_ALPHA, /* U+00ae9a: */
+ RTUNI_ALPHA, /* U+00ae9b: */
+ RTUNI_ALPHA, /* U+00ae9c: */
+ RTUNI_ALPHA, /* U+00ae9d: */
+ RTUNI_ALPHA, /* U+00ae9e: */
+ RTUNI_ALPHA, /* U+00ae9f: */
+ RTUNI_ALPHA, /* U+00aea0: */
+ RTUNI_ALPHA, /* U+00aea1: */
+ RTUNI_ALPHA, /* U+00aea2: */
+ RTUNI_ALPHA, /* U+00aea3: */
+ RTUNI_ALPHA, /* U+00aea4: */
+ RTUNI_ALPHA, /* U+00aea5: */
+ RTUNI_ALPHA, /* U+00aea6: */
+ RTUNI_ALPHA, /* U+00aea7: */
+ RTUNI_ALPHA, /* U+00aea8: */
+ RTUNI_ALPHA, /* U+00aea9: */
+ RTUNI_ALPHA, /* U+00aeaa: */
+ RTUNI_ALPHA, /* U+00aeab: */
+ RTUNI_ALPHA, /* U+00aeac: */
+ RTUNI_ALPHA, /* U+00aead: */
+ RTUNI_ALPHA, /* U+00aeae: */
+ RTUNI_ALPHA, /* U+00aeaf: */
+ RTUNI_ALPHA, /* U+00aeb0: */
+ RTUNI_ALPHA, /* U+00aeb1: */
+ RTUNI_ALPHA, /* U+00aeb2: */
+ RTUNI_ALPHA, /* U+00aeb3: */
+ RTUNI_ALPHA, /* U+00aeb4: */
+ RTUNI_ALPHA, /* U+00aeb5: */
+ RTUNI_ALPHA, /* U+00aeb6: */
+ RTUNI_ALPHA, /* U+00aeb7: */
+ RTUNI_ALPHA, /* U+00aeb8: */
+ RTUNI_ALPHA, /* U+00aeb9: */
+ RTUNI_ALPHA, /* U+00aeba: */
+ RTUNI_ALPHA, /* U+00aebb: */
+ RTUNI_ALPHA, /* U+00aebc: */
+ RTUNI_ALPHA, /* U+00aebd: */
+ RTUNI_ALPHA, /* U+00aebe: */
+ RTUNI_ALPHA, /* U+00aebf: */
+ RTUNI_ALPHA, /* U+00aec0: */
+ RTUNI_ALPHA, /* U+00aec1: */
+ RTUNI_ALPHA, /* U+00aec2: */
+ RTUNI_ALPHA, /* U+00aec3: */
+ RTUNI_ALPHA, /* U+00aec4: */
+ RTUNI_ALPHA, /* U+00aec5: */
+ RTUNI_ALPHA, /* U+00aec6: */
+ RTUNI_ALPHA, /* U+00aec7: */
+ RTUNI_ALPHA, /* U+00aec8: */
+ RTUNI_ALPHA, /* U+00aec9: */
+ RTUNI_ALPHA, /* U+00aeca: */
+ RTUNI_ALPHA, /* U+00aecb: */
+ RTUNI_ALPHA, /* U+00aecc: */
+ RTUNI_ALPHA, /* U+00aecd: */
+ RTUNI_ALPHA, /* U+00aece: */
+ RTUNI_ALPHA, /* U+00aecf: */
+ RTUNI_ALPHA, /* U+00aed0: */
+ RTUNI_ALPHA, /* U+00aed1: */
+ RTUNI_ALPHA, /* U+00aed2: */
+ RTUNI_ALPHA, /* U+00aed3: */
+ RTUNI_ALPHA, /* U+00aed4: */
+ RTUNI_ALPHA, /* U+00aed5: */
+ RTUNI_ALPHA, /* U+00aed6: */
+ RTUNI_ALPHA, /* U+00aed7: */
+ RTUNI_ALPHA, /* U+00aed8: */
+ RTUNI_ALPHA, /* U+00aed9: */
+ RTUNI_ALPHA, /* U+00aeda: */
+ RTUNI_ALPHA, /* U+00aedb: */
+ RTUNI_ALPHA, /* U+00aedc: */
+ RTUNI_ALPHA, /* U+00aedd: */
+ RTUNI_ALPHA, /* U+00aede: */
+ RTUNI_ALPHA, /* U+00aedf: */
+ RTUNI_ALPHA, /* U+00aee0: */
+ RTUNI_ALPHA, /* U+00aee1: */
+ RTUNI_ALPHA, /* U+00aee2: */
+ RTUNI_ALPHA, /* U+00aee3: */
+ RTUNI_ALPHA, /* U+00aee4: */
+ RTUNI_ALPHA, /* U+00aee5: */
+ RTUNI_ALPHA, /* U+00aee6: */
+ RTUNI_ALPHA, /* U+00aee7: */
+ RTUNI_ALPHA, /* U+00aee8: */
+ RTUNI_ALPHA, /* U+00aee9: */
+ RTUNI_ALPHA, /* U+00aeea: */
+ RTUNI_ALPHA, /* U+00aeeb: */
+ RTUNI_ALPHA, /* U+00aeec: */
+ RTUNI_ALPHA, /* U+00aeed: */
+ RTUNI_ALPHA, /* U+00aeee: */
+ RTUNI_ALPHA, /* U+00aeef: */
+ RTUNI_ALPHA, /* U+00aef0: */
+ RTUNI_ALPHA, /* U+00aef1: */
+ RTUNI_ALPHA, /* U+00aef2: */
+ RTUNI_ALPHA, /* U+00aef3: */
+ RTUNI_ALPHA, /* U+00aef4: */
+ RTUNI_ALPHA, /* U+00aef5: */
+ RTUNI_ALPHA, /* U+00aef6: */
+ RTUNI_ALPHA, /* U+00aef7: */
+ RTUNI_ALPHA, /* U+00aef8: */
+ RTUNI_ALPHA, /* U+00aef9: */
+ RTUNI_ALPHA, /* U+00aefa: */
+ RTUNI_ALPHA, /* U+00aefb: */
+ RTUNI_ALPHA, /* U+00aefc: */
+ RTUNI_ALPHA, /* U+00aefd: */
+ RTUNI_ALPHA, /* U+00aefe: */
+ RTUNI_ALPHA, /* U+00aeff: */
+ RTUNI_ALPHA, /* U+00af00: */
+ RTUNI_ALPHA, /* U+00af01: */
+ RTUNI_ALPHA, /* U+00af02: */
+ RTUNI_ALPHA, /* U+00af03: */
+ RTUNI_ALPHA, /* U+00af04: */
+ RTUNI_ALPHA, /* U+00af05: */
+ RTUNI_ALPHA, /* U+00af06: */
+ RTUNI_ALPHA, /* U+00af07: */
+ RTUNI_ALPHA, /* U+00af08: */
+ RTUNI_ALPHA, /* U+00af09: */
+ RTUNI_ALPHA, /* U+00af0a: */
+ RTUNI_ALPHA, /* U+00af0b: */
+ RTUNI_ALPHA, /* U+00af0c: */
+ RTUNI_ALPHA, /* U+00af0d: */
+ RTUNI_ALPHA, /* U+00af0e: */
+ RTUNI_ALPHA, /* U+00af0f: */
+ RTUNI_ALPHA, /* U+00af10: */
+ RTUNI_ALPHA, /* U+00af11: */
+ RTUNI_ALPHA, /* U+00af12: */
+ RTUNI_ALPHA, /* U+00af13: */
+ RTUNI_ALPHA, /* U+00af14: */
+ RTUNI_ALPHA, /* U+00af15: */
+ RTUNI_ALPHA, /* U+00af16: */
+ RTUNI_ALPHA, /* U+00af17: */
+ RTUNI_ALPHA, /* U+00af18: */
+ RTUNI_ALPHA, /* U+00af19: */
+ RTUNI_ALPHA, /* U+00af1a: */
+ RTUNI_ALPHA, /* U+00af1b: */
+ RTUNI_ALPHA, /* U+00af1c: */
+ RTUNI_ALPHA, /* U+00af1d: */
+ RTUNI_ALPHA, /* U+00af1e: */
+ RTUNI_ALPHA, /* U+00af1f: */
+ RTUNI_ALPHA, /* U+00af20: */
+ RTUNI_ALPHA, /* U+00af21: */
+ RTUNI_ALPHA, /* U+00af22: */
+ RTUNI_ALPHA, /* U+00af23: */
+ RTUNI_ALPHA, /* U+00af24: */
+ RTUNI_ALPHA, /* U+00af25: */
+ RTUNI_ALPHA, /* U+00af26: */
+ RTUNI_ALPHA, /* U+00af27: */
+ RTUNI_ALPHA, /* U+00af28: */
+ RTUNI_ALPHA, /* U+00af29: */
+ RTUNI_ALPHA, /* U+00af2a: */
+ RTUNI_ALPHA, /* U+00af2b: */
+ RTUNI_ALPHA, /* U+00af2c: */
+ RTUNI_ALPHA, /* U+00af2d: */
+ RTUNI_ALPHA, /* U+00af2e: */
+ RTUNI_ALPHA, /* U+00af2f: */
+ RTUNI_ALPHA, /* U+00af30: */
+ RTUNI_ALPHA, /* U+00af31: */
+ RTUNI_ALPHA, /* U+00af32: */
+ RTUNI_ALPHA, /* U+00af33: */
+ RTUNI_ALPHA, /* U+00af34: */
+ RTUNI_ALPHA, /* U+00af35: */
+ RTUNI_ALPHA, /* U+00af36: */
+ RTUNI_ALPHA, /* U+00af37: */
+ RTUNI_ALPHA, /* U+00af38: */
+ RTUNI_ALPHA, /* U+00af39: */
+ RTUNI_ALPHA, /* U+00af3a: */
+ RTUNI_ALPHA, /* U+00af3b: */
+ RTUNI_ALPHA, /* U+00af3c: */
+ RTUNI_ALPHA, /* U+00af3d: */
+ RTUNI_ALPHA, /* U+00af3e: */
+ RTUNI_ALPHA, /* U+00af3f: */
+ RTUNI_ALPHA, /* U+00af40: */
+ RTUNI_ALPHA, /* U+00af41: */
+ RTUNI_ALPHA, /* U+00af42: */
+ RTUNI_ALPHA, /* U+00af43: */
+ RTUNI_ALPHA, /* U+00af44: */
+ RTUNI_ALPHA, /* U+00af45: */
+ RTUNI_ALPHA, /* U+00af46: */
+ RTUNI_ALPHA, /* U+00af47: */
+ RTUNI_ALPHA, /* U+00af48: */
+ RTUNI_ALPHA, /* U+00af49: */
+ RTUNI_ALPHA, /* U+00af4a: */
+ RTUNI_ALPHA, /* U+00af4b: */
+ RTUNI_ALPHA, /* U+00af4c: */
+ RTUNI_ALPHA, /* U+00af4d: */
+ RTUNI_ALPHA, /* U+00af4e: */
+ RTUNI_ALPHA, /* U+00af4f: */
+ RTUNI_ALPHA, /* U+00af50: */
+ RTUNI_ALPHA, /* U+00af51: */
+ RTUNI_ALPHA, /* U+00af52: */
+ RTUNI_ALPHA, /* U+00af53: */
+ RTUNI_ALPHA, /* U+00af54: */
+ RTUNI_ALPHA, /* U+00af55: */
+ RTUNI_ALPHA, /* U+00af56: */
+ RTUNI_ALPHA, /* U+00af57: */
+ RTUNI_ALPHA, /* U+00af58: */
+ RTUNI_ALPHA, /* U+00af59: */
+ RTUNI_ALPHA, /* U+00af5a: */
+ RTUNI_ALPHA, /* U+00af5b: */
+ RTUNI_ALPHA, /* U+00af5c: */
+ RTUNI_ALPHA, /* U+00af5d: */
+ RTUNI_ALPHA, /* U+00af5e: */
+ RTUNI_ALPHA, /* U+00af5f: */
+ RTUNI_ALPHA, /* U+00af60: */
+ RTUNI_ALPHA, /* U+00af61: */
+ RTUNI_ALPHA, /* U+00af62: */
+ RTUNI_ALPHA, /* U+00af63: */
+ RTUNI_ALPHA, /* U+00af64: */
+ RTUNI_ALPHA, /* U+00af65: */
+ RTUNI_ALPHA, /* U+00af66: */
+ RTUNI_ALPHA, /* U+00af67: */
+ RTUNI_ALPHA, /* U+00af68: */
+ RTUNI_ALPHA, /* U+00af69: */
+ RTUNI_ALPHA, /* U+00af6a: */
+ RTUNI_ALPHA, /* U+00af6b: */
+ RTUNI_ALPHA, /* U+00af6c: */
+ RTUNI_ALPHA, /* U+00af6d: */
+ RTUNI_ALPHA, /* U+00af6e: */
+ RTUNI_ALPHA, /* U+00af6f: */
+ RTUNI_ALPHA, /* U+00af70: */
+ RTUNI_ALPHA, /* U+00af71: */
+ RTUNI_ALPHA, /* U+00af72: */
+ RTUNI_ALPHA, /* U+00af73: */
+ RTUNI_ALPHA, /* U+00af74: */
+ RTUNI_ALPHA, /* U+00af75: */
+ RTUNI_ALPHA, /* U+00af76: */
+ RTUNI_ALPHA, /* U+00af77: */
+ RTUNI_ALPHA, /* U+00af78: */
+ RTUNI_ALPHA, /* U+00af79: */
+ RTUNI_ALPHA, /* U+00af7a: */
+ RTUNI_ALPHA, /* U+00af7b: */
+ RTUNI_ALPHA, /* U+00af7c: */
+ RTUNI_ALPHA, /* U+00af7d: */
+ RTUNI_ALPHA, /* U+00af7e: */
+ RTUNI_ALPHA, /* U+00af7f: */
+ RTUNI_ALPHA, /* U+00af80: */
+ RTUNI_ALPHA, /* U+00af81: */
+ RTUNI_ALPHA, /* U+00af82: */
+ RTUNI_ALPHA, /* U+00af83: */
+ RTUNI_ALPHA, /* U+00af84: */
+ RTUNI_ALPHA, /* U+00af85: */
+ RTUNI_ALPHA, /* U+00af86: */
+ RTUNI_ALPHA, /* U+00af87: */
+ RTUNI_ALPHA, /* U+00af88: */
+ RTUNI_ALPHA, /* U+00af89: */
+ RTUNI_ALPHA, /* U+00af8a: */
+ RTUNI_ALPHA, /* U+00af8b: */
+ RTUNI_ALPHA, /* U+00af8c: */
+ RTUNI_ALPHA, /* U+00af8d: */
+ RTUNI_ALPHA, /* U+00af8e: */
+ RTUNI_ALPHA, /* U+00af8f: */
+ RTUNI_ALPHA, /* U+00af90: */
+ RTUNI_ALPHA, /* U+00af91: */
+ RTUNI_ALPHA, /* U+00af92: */
+ RTUNI_ALPHA, /* U+00af93: */
+ RTUNI_ALPHA, /* U+00af94: */
+ RTUNI_ALPHA, /* U+00af95: */
+ RTUNI_ALPHA, /* U+00af96: */
+ RTUNI_ALPHA, /* U+00af97: */
+ RTUNI_ALPHA, /* U+00af98: */
+ RTUNI_ALPHA, /* U+00af99: */
+ RTUNI_ALPHA, /* U+00af9a: */
+ RTUNI_ALPHA, /* U+00af9b: */
+ RTUNI_ALPHA, /* U+00af9c: */
+ RTUNI_ALPHA, /* U+00af9d: */
+ RTUNI_ALPHA, /* U+00af9e: */
+ RTUNI_ALPHA, /* U+00af9f: */
+ RTUNI_ALPHA, /* U+00afa0: */
+ RTUNI_ALPHA, /* U+00afa1: */
+ RTUNI_ALPHA, /* U+00afa2: */
+ RTUNI_ALPHA, /* U+00afa3: */
+ RTUNI_ALPHA, /* U+00afa4: */
+ RTUNI_ALPHA, /* U+00afa5: */
+ RTUNI_ALPHA, /* U+00afa6: */
+ RTUNI_ALPHA, /* U+00afa7: */
+ RTUNI_ALPHA, /* U+00afa8: */
+ RTUNI_ALPHA, /* U+00afa9: */
+ RTUNI_ALPHA, /* U+00afaa: */
+ RTUNI_ALPHA, /* U+00afab: */
+ RTUNI_ALPHA, /* U+00afac: */
+ RTUNI_ALPHA, /* U+00afad: */
+ RTUNI_ALPHA, /* U+00afae: */
+ RTUNI_ALPHA, /* U+00afaf: */
+ RTUNI_ALPHA, /* U+00afb0: */
+ RTUNI_ALPHA, /* U+00afb1: */
+ RTUNI_ALPHA, /* U+00afb2: */
+ RTUNI_ALPHA, /* U+00afb3: */
+ RTUNI_ALPHA, /* U+00afb4: */
+ RTUNI_ALPHA, /* U+00afb5: */
+ RTUNI_ALPHA, /* U+00afb6: */
+ RTUNI_ALPHA, /* U+00afb7: */
+ RTUNI_ALPHA, /* U+00afb8: */
+ RTUNI_ALPHA, /* U+00afb9: */
+ RTUNI_ALPHA, /* U+00afba: */
+ RTUNI_ALPHA, /* U+00afbb: */
+ RTUNI_ALPHA, /* U+00afbc: */
+ RTUNI_ALPHA, /* U+00afbd: */
+ RTUNI_ALPHA, /* U+00afbe: */
+ RTUNI_ALPHA, /* U+00afbf: */
+ RTUNI_ALPHA, /* U+00afc0: */
+ RTUNI_ALPHA, /* U+00afc1: */
+ RTUNI_ALPHA, /* U+00afc2: */
+ RTUNI_ALPHA, /* U+00afc3: */
+ RTUNI_ALPHA, /* U+00afc4: */
+ RTUNI_ALPHA, /* U+00afc5: */
+ RTUNI_ALPHA, /* U+00afc6: */
+ RTUNI_ALPHA, /* U+00afc7: */
+ RTUNI_ALPHA, /* U+00afc8: */
+ RTUNI_ALPHA, /* U+00afc9: */
+ RTUNI_ALPHA, /* U+00afca: */
+ RTUNI_ALPHA, /* U+00afcb: */
+ RTUNI_ALPHA, /* U+00afcc: */
+ RTUNI_ALPHA, /* U+00afcd: */
+ RTUNI_ALPHA, /* U+00afce: */
+ RTUNI_ALPHA, /* U+00afcf: */
+ RTUNI_ALPHA, /* U+00afd0: */
+ RTUNI_ALPHA, /* U+00afd1: */
+ RTUNI_ALPHA, /* U+00afd2: */
+ RTUNI_ALPHA, /* U+00afd3: */
+ RTUNI_ALPHA, /* U+00afd4: */
+ RTUNI_ALPHA, /* U+00afd5: */
+ RTUNI_ALPHA, /* U+00afd6: */
+ RTUNI_ALPHA, /* U+00afd7: */
+ RTUNI_ALPHA, /* U+00afd8: */
+ RTUNI_ALPHA, /* U+00afd9: */
+ RTUNI_ALPHA, /* U+00afda: */
+ RTUNI_ALPHA, /* U+00afdb: */
+ RTUNI_ALPHA, /* U+00afdc: */
+ RTUNI_ALPHA, /* U+00afdd: */
+ RTUNI_ALPHA, /* U+00afde: */
+ RTUNI_ALPHA, /* U+00afdf: */
+ RTUNI_ALPHA, /* U+00afe0: */
+ RTUNI_ALPHA, /* U+00afe1: */
+ RTUNI_ALPHA, /* U+00afe2: */
+ RTUNI_ALPHA, /* U+00afe3: */
+ RTUNI_ALPHA, /* U+00afe4: */
+ RTUNI_ALPHA, /* U+00afe5: */
+ RTUNI_ALPHA, /* U+00afe6: */
+ RTUNI_ALPHA, /* U+00afe7: */
+ RTUNI_ALPHA, /* U+00afe8: */
+ RTUNI_ALPHA, /* U+00afe9: */
+ RTUNI_ALPHA, /* U+00afea: */
+ RTUNI_ALPHA, /* U+00afeb: */
+ RTUNI_ALPHA, /* U+00afec: */
+ RTUNI_ALPHA, /* U+00afed: */
+ RTUNI_ALPHA, /* U+00afee: */
+ RTUNI_ALPHA, /* U+00afef: */
+ RTUNI_ALPHA, /* U+00aff0: */
+ RTUNI_ALPHA, /* U+00aff1: */
+ RTUNI_ALPHA, /* U+00aff2: */
+ RTUNI_ALPHA, /* U+00aff3: */
+ RTUNI_ALPHA, /* U+00aff4: */
+ RTUNI_ALPHA, /* U+00aff5: */
+ RTUNI_ALPHA, /* U+00aff6: */
+ RTUNI_ALPHA, /* U+00aff7: */
+ RTUNI_ALPHA, /* U+00aff8: */
+ RTUNI_ALPHA, /* U+00aff9: */
+ RTUNI_ALPHA, /* U+00affa: */
+ RTUNI_ALPHA, /* U+00affb: */
+ RTUNI_ALPHA, /* U+00affc: */
+ RTUNI_ALPHA, /* U+00affd: */
+ RTUNI_ALPHA, /* U+00affe: */
+ RTUNI_ALPHA, /* U+00afff: */
+ RTUNI_ALPHA, /* U+00b000: */
+ RTUNI_ALPHA, /* U+00b001: */
+ RTUNI_ALPHA, /* U+00b002: */
+ RTUNI_ALPHA, /* U+00b003: */
+ RTUNI_ALPHA, /* U+00b004: */
+ RTUNI_ALPHA, /* U+00b005: */
+ RTUNI_ALPHA, /* U+00b006: */
+ RTUNI_ALPHA, /* U+00b007: */
+ RTUNI_ALPHA, /* U+00b008: */
+ RTUNI_ALPHA, /* U+00b009: */
+ RTUNI_ALPHA, /* U+00b00a: */
+ RTUNI_ALPHA, /* U+00b00b: */
+ RTUNI_ALPHA, /* U+00b00c: */
+ RTUNI_ALPHA, /* U+00b00d: */
+ RTUNI_ALPHA, /* U+00b00e: */
+ RTUNI_ALPHA, /* U+00b00f: */
+ RTUNI_ALPHA, /* U+00b010: */
+ RTUNI_ALPHA, /* U+00b011: */
+ RTUNI_ALPHA, /* U+00b012: */
+ RTUNI_ALPHA, /* U+00b013: */
+ RTUNI_ALPHA, /* U+00b014: */
+ RTUNI_ALPHA, /* U+00b015: */
+ RTUNI_ALPHA, /* U+00b016: */
+ RTUNI_ALPHA, /* U+00b017: */
+ RTUNI_ALPHA, /* U+00b018: */
+ RTUNI_ALPHA, /* U+00b019: */
+ RTUNI_ALPHA, /* U+00b01a: */
+ RTUNI_ALPHA, /* U+00b01b: */
+ RTUNI_ALPHA, /* U+00b01c: */
+ RTUNI_ALPHA, /* U+00b01d: */
+ RTUNI_ALPHA, /* U+00b01e: */
+ RTUNI_ALPHA, /* U+00b01f: */
+ RTUNI_ALPHA, /* U+00b020: */
+ RTUNI_ALPHA, /* U+00b021: */
+ RTUNI_ALPHA, /* U+00b022: */
+ RTUNI_ALPHA, /* U+00b023: */
+ RTUNI_ALPHA, /* U+00b024: */
+ RTUNI_ALPHA, /* U+00b025: */
+ RTUNI_ALPHA, /* U+00b026: */
+ RTUNI_ALPHA, /* U+00b027: */
+ RTUNI_ALPHA, /* U+00b028: */
+ RTUNI_ALPHA, /* U+00b029: */
+ RTUNI_ALPHA, /* U+00b02a: */
+ RTUNI_ALPHA, /* U+00b02b: */
+ RTUNI_ALPHA, /* U+00b02c: */
+ RTUNI_ALPHA, /* U+00b02d: */
+ RTUNI_ALPHA, /* U+00b02e: */
+ RTUNI_ALPHA, /* U+00b02f: */
+ RTUNI_ALPHA, /* U+00b030: */
+ RTUNI_ALPHA, /* U+00b031: */
+ RTUNI_ALPHA, /* U+00b032: */
+ RTUNI_ALPHA, /* U+00b033: */
+ RTUNI_ALPHA, /* U+00b034: */
+ RTUNI_ALPHA, /* U+00b035: */
+ RTUNI_ALPHA, /* U+00b036: */
+ RTUNI_ALPHA, /* U+00b037: */
+ RTUNI_ALPHA, /* U+00b038: */
+ RTUNI_ALPHA, /* U+00b039: */
+ RTUNI_ALPHA, /* U+00b03a: */
+ RTUNI_ALPHA, /* U+00b03b: */
+ RTUNI_ALPHA, /* U+00b03c: */
+ RTUNI_ALPHA, /* U+00b03d: */
+ RTUNI_ALPHA, /* U+00b03e: */
+ RTUNI_ALPHA, /* U+00b03f: */
+ RTUNI_ALPHA, /* U+00b040: */
+ RTUNI_ALPHA, /* U+00b041: */
+ RTUNI_ALPHA, /* U+00b042: */
+ RTUNI_ALPHA, /* U+00b043: */
+ RTUNI_ALPHA, /* U+00b044: */
+ RTUNI_ALPHA, /* U+00b045: */
+ RTUNI_ALPHA, /* U+00b046: */
+ RTUNI_ALPHA, /* U+00b047: */
+ RTUNI_ALPHA, /* U+00b048: */
+ RTUNI_ALPHA, /* U+00b049: */
+ RTUNI_ALPHA, /* U+00b04a: */
+ RTUNI_ALPHA, /* U+00b04b: */
+ RTUNI_ALPHA, /* U+00b04c: */
+ RTUNI_ALPHA, /* U+00b04d: */
+ RTUNI_ALPHA, /* U+00b04e: */
+ RTUNI_ALPHA, /* U+00b04f: */
+ RTUNI_ALPHA, /* U+00b050: */
+ RTUNI_ALPHA, /* U+00b051: */
+ RTUNI_ALPHA, /* U+00b052: */
+ RTUNI_ALPHA, /* U+00b053: */
+ RTUNI_ALPHA, /* U+00b054: */
+ RTUNI_ALPHA, /* U+00b055: */
+ RTUNI_ALPHA, /* U+00b056: */
+ RTUNI_ALPHA, /* U+00b057: */
+ RTUNI_ALPHA, /* U+00b058: */
+ RTUNI_ALPHA, /* U+00b059: */
+ RTUNI_ALPHA, /* U+00b05a: */
+ RTUNI_ALPHA, /* U+00b05b: */
+ RTUNI_ALPHA, /* U+00b05c: */
+ RTUNI_ALPHA, /* U+00b05d: */
+ RTUNI_ALPHA, /* U+00b05e: */
+ RTUNI_ALPHA, /* U+00b05f: */
+ RTUNI_ALPHA, /* U+00b060: */
+ RTUNI_ALPHA, /* U+00b061: */
+ RTUNI_ALPHA, /* U+00b062: */
+ RTUNI_ALPHA, /* U+00b063: */
+ RTUNI_ALPHA, /* U+00b064: */
+ RTUNI_ALPHA, /* U+00b065: */
+ RTUNI_ALPHA, /* U+00b066: */
+ RTUNI_ALPHA, /* U+00b067: */
+ RTUNI_ALPHA, /* U+00b068: */
+ RTUNI_ALPHA, /* U+00b069: */
+ RTUNI_ALPHA, /* U+00b06a: */
+ RTUNI_ALPHA, /* U+00b06b: */
+ RTUNI_ALPHA, /* U+00b06c: */
+ RTUNI_ALPHA, /* U+00b06d: */
+ RTUNI_ALPHA, /* U+00b06e: */
+ RTUNI_ALPHA, /* U+00b06f: */
+ RTUNI_ALPHA, /* U+00b070: */
+ RTUNI_ALPHA, /* U+00b071: */
+ RTUNI_ALPHA, /* U+00b072: */
+ RTUNI_ALPHA, /* U+00b073: */
+ RTUNI_ALPHA, /* U+00b074: */
+ RTUNI_ALPHA, /* U+00b075: */
+ RTUNI_ALPHA, /* U+00b076: */
+ RTUNI_ALPHA, /* U+00b077: */
+ RTUNI_ALPHA, /* U+00b078: */
+ RTUNI_ALPHA, /* U+00b079: */
+ RTUNI_ALPHA, /* U+00b07a: */
+ RTUNI_ALPHA, /* U+00b07b: */
+ RTUNI_ALPHA, /* U+00b07c: */
+ RTUNI_ALPHA, /* U+00b07d: */
+ RTUNI_ALPHA, /* U+00b07e: */
+ RTUNI_ALPHA, /* U+00b07f: */
+ RTUNI_ALPHA, /* U+00b080: */
+ RTUNI_ALPHA, /* U+00b081: */
+ RTUNI_ALPHA, /* U+00b082: */
+ RTUNI_ALPHA, /* U+00b083: */
+ RTUNI_ALPHA, /* U+00b084: */
+ RTUNI_ALPHA, /* U+00b085: */
+ RTUNI_ALPHA, /* U+00b086: */
+ RTUNI_ALPHA, /* U+00b087: */
+ RTUNI_ALPHA, /* U+00b088: */
+ RTUNI_ALPHA, /* U+00b089: */
+ RTUNI_ALPHA, /* U+00b08a: */
+ RTUNI_ALPHA, /* U+00b08b: */
+ RTUNI_ALPHA, /* U+00b08c: */
+ RTUNI_ALPHA, /* U+00b08d: */
+ RTUNI_ALPHA, /* U+00b08e: */
+ RTUNI_ALPHA, /* U+00b08f: */
+ RTUNI_ALPHA, /* U+00b090: */
+ RTUNI_ALPHA, /* U+00b091: */
+ RTUNI_ALPHA, /* U+00b092: */
+ RTUNI_ALPHA, /* U+00b093: */
+ RTUNI_ALPHA, /* U+00b094: */
+ RTUNI_ALPHA, /* U+00b095: */
+ RTUNI_ALPHA, /* U+00b096: */
+ RTUNI_ALPHA, /* U+00b097: */
+ RTUNI_ALPHA, /* U+00b098: */
+ RTUNI_ALPHA, /* U+00b099: */
+ RTUNI_ALPHA, /* U+00b09a: */
+ RTUNI_ALPHA, /* U+00b09b: */
+ RTUNI_ALPHA, /* U+00b09c: */
+ RTUNI_ALPHA, /* U+00b09d: */
+ RTUNI_ALPHA, /* U+00b09e: */
+ RTUNI_ALPHA, /* U+00b09f: */
+ RTUNI_ALPHA, /* U+00b0a0: */
+ RTUNI_ALPHA, /* U+00b0a1: */
+ RTUNI_ALPHA, /* U+00b0a2: */
+ RTUNI_ALPHA, /* U+00b0a3: */
+ RTUNI_ALPHA, /* U+00b0a4: */
+ RTUNI_ALPHA, /* U+00b0a5: */
+ RTUNI_ALPHA, /* U+00b0a6: */
+ RTUNI_ALPHA, /* U+00b0a7: */
+ RTUNI_ALPHA, /* U+00b0a8: */
+ RTUNI_ALPHA, /* U+00b0a9: */
+ RTUNI_ALPHA, /* U+00b0aa: */
+ RTUNI_ALPHA, /* U+00b0ab: */
+ RTUNI_ALPHA, /* U+00b0ac: */
+ RTUNI_ALPHA, /* U+00b0ad: */
+ RTUNI_ALPHA, /* U+00b0ae: */
+ RTUNI_ALPHA, /* U+00b0af: */
+ RTUNI_ALPHA, /* U+00b0b0: */
+ RTUNI_ALPHA, /* U+00b0b1: */
+ RTUNI_ALPHA, /* U+00b0b2: */
+ RTUNI_ALPHA, /* U+00b0b3: */
+ RTUNI_ALPHA, /* U+00b0b4: */
+ RTUNI_ALPHA, /* U+00b0b5: */
+ RTUNI_ALPHA, /* U+00b0b6: */
+ RTUNI_ALPHA, /* U+00b0b7: */
+ RTUNI_ALPHA, /* U+00b0b8: */
+ RTUNI_ALPHA, /* U+00b0b9: */
+ RTUNI_ALPHA, /* U+00b0ba: */
+ RTUNI_ALPHA, /* U+00b0bb: */
+ RTUNI_ALPHA, /* U+00b0bc: */
+ RTUNI_ALPHA, /* U+00b0bd: */
+ RTUNI_ALPHA, /* U+00b0be: */
+ RTUNI_ALPHA, /* U+00b0bf: */
+ RTUNI_ALPHA, /* U+00b0c0: */
+ RTUNI_ALPHA, /* U+00b0c1: */
+ RTUNI_ALPHA, /* U+00b0c2: */
+ RTUNI_ALPHA, /* U+00b0c3: */
+ RTUNI_ALPHA, /* U+00b0c4: */
+ RTUNI_ALPHA, /* U+00b0c5: */
+ RTUNI_ALPHA, /* U+00b0c6: */
+ RTUNI_ALPHA, /* U+00b0c7: */
+ RTUNI_ALPHA, /* U+00b0c8: */
+ RTUNI_ALPHA, /* U+00b0c9: */
+ RTUNI_ALPHA, /* U+00b0ca: */
+ RTUNI_ALPHA, /* U+00b0cb: */
+ RTUNI_ALPHA, /* U+00b0cc: */
+ RTUNI_ALPHA, /* U+00b0cd: */
+ RTUNI_ALPHA, /* U+00b0ce: */
+ RTUNI_ALPHA, /* U+00b0cf: */
+ RTUNI_ALPHA, /* U+00b0d0: */
+ RTUNI_ALPHA, /* U+00b0d1: */
+ RTUNI_ALPHA, /* U+00b0d2: */
+ RTUNI_ALPHA, /* U+00b0d3: */
+ RTUNI_ALPHA, /* U+00b0d4: */
+ RTUNI_ALPHA, /* U+00b0d5: */
+ RTUNI_ALPHA, /* U+00b0d6: */
+ RTUNI_ALPHA, /* U+00b0d7: */
+ RTUNI_ALPHA, /* U+00b0d8: */
+ RTUNI_ALPHA, /* U+00b0d9: */
+ RTUNI_ALPHA, /* U+00b0da: */
+ RTUNI_ALPHA, /* U+00b0db: */
+ RTUNI_ALPHA, /* U+00b0dc: */
+ RTUNI_ALPHA, /* U+00b0dd: */
+ RTUNI_ALPHA, /* U+00b0de: */
+ RTUNI_ALPHA, /* U+00b0df: */
+ RTUNI_ALPHA, /* U+00b0e0: */
+ RTUNI_ALPHA, /* U+00b0e1: */
+ RTUNI_ALPHA, /* U+00b0e2: */
+ RTUNI_ALPHA, /* U+00b0e3: */
+ RTUNI_ALPHA, /* U+00b0e4: */
+ RTUNI_ALPHA, /* U+00b0e5: */
+ RTUNI_ALPHA, /* U+00b0e6: */
+ RTUNI_ALPHA, /* U+00b0e7: */
+ RTUNI_ALPHA, /* U+00b0e8: */
+ RTUNI_ALPHA, /* U+00b0e9: */
+ RTUNI_ALPHA, /* U+00b0ea: */
+ RTUNI_ALPHA, /* U+00b0eb: */
+ RTUNI_ALPHA, /* U+00b0ec: */
+ RTUNI_ALPHA, /* U+00b0ed: */
+ RTUNI_ALPHA, /* U+00b0ee: */
+ RTUNI_ALPHA, /* U+00b0ef: */
+ RTUNI_ALPHA, /* U+00b0f0: */
+ RTUNI_ALPHA, /* U+00b0f1: */
+ RTUNI_ALPHA, /* U+00b0f2: */
+ RTUNI_ALPHA, /* U+00b0f3: */
+ RTUNI_ALPHA, /* U+00b0f4: */
+ RTUNI_ALPHA, /* U+00b0f5: */
+ RTUNI_ALPHA, /* U+00b0f6: */
+ RTUNI_ALPHA, /* U+00b0f7: */
+ RTUNI_ALPHA, /* U+00b0f8: */
+ RTUNI_ALPHA, /* U+00b0f9: */
+ RTUNI_ALPHA, /* U+00b0fa: */
+ RTUNI_ALPHA, /* U+00b0fb: */
+ RTUNI_ALPHA, /* U+00b0fc: */
+ RTUNI_ALPHA, /* U+00b0fd: */
+ RTUNI_ALPHA, /* U+00b0fe: */
+ RTUNI_ALPHA, /* U+00b0ff: */
+ RTUNI_ALPHA, /* U+00b100: */
+ RTUNI_ALPHA, /* U+00b101: */
+ RTUNI_ALPHA, /* U+00b102: */
+ RTUNI_ALPHA, /* U+00b103: */
+ RTUNI_ALPHA, /* U+00b104: */
+ RTUNI_ALPHA, /* U+00b105: */
+ RTUNI_ALPHA, /* U+00b106: */
+ RTUNI_ALPHA, /* U+00b107: */
+ RTUNI_ALPHA, /* U+00b108: */
+ RTUNI_ALPHA, /* U+00b109: */
+ RTUNI_ALPHA, /* U+00b10a: */
+ RTUNI_ALPHA, /* U+00b10b: */
+ RTUNI_ALPHA, /* U+00b10c: */
+ RTUNI_ALPHA, /* U+00b10d: */
+ RTUNI_ALPHA, /* U+00b10e: */
+ RTUNI_ALPHA, /* U+00b10f: */
+ RTUNI_ALPHA, /* U+00b110: */
+ RTUNI_ALPHA, /* U+00b111: */
+ RTUNI_ALPHA, /* U+00b112: */
+ RTUNI_ALPHA, /* U+00b113: */
+ RTUNI_ALPHA, /* U+00b114: */
+ RTUNI_ALPHA, /* U+00b115: */
+ RTUNI_ALPHA, /* U+00b116: */
+ RTUNI_ALPHA, /* U+00b117: */
+ RTUNI_ALPHA, /* U+00b118: */
+ RTUNI_ALPHA, /* U+00b119: */
+ RTUNI_ALPHA, /* U+00b11a: */
+ RTUNI_ALPHA, /* U+00b11b: */
+ RTUNI_ALPHA, /* U+00b11c: */
+ RTUNI_ALPHA, /* U+00b11d: */
+ RTUNI_ALPHA, /* U+00b11e: */
+ RTUNI_ALPHA, /* U+00b11f: */
+ RTUNI_ALPHA, /* U+00b120: */
+ RTUNI_ALPHA, /* U+00b121: */
+ RTUNI_ALPHA, /* U+00b122: */
+ RTUNI_ALPHA, /* U+00b123: */
+ RTUNI_ALPHA, /* U+00b124: */
+ RTUNI_ALPHA, /* U+00b125: */
+ RTUNI_ALPHA, /* U+00b126: */
+ RTUNI_ALPHA, /* U+00b127: */
+ RTUNI_ALPHA, /* U+00b128: */
+ RTUNI_ALPHA, /* U+00b129: */
+ RTUNI_ALPHA, /* U+00b12a: */
+ RTUNI_ALPHA, /* U+00b12b: */
+ RTUNI_ALPHA, /* U+00b12c: */
+ RTUNI_ALPHA, /* U+00b12d: */
+ RTUNI_ALPHA, /* U+00b12e: */
+ RTUNI_ALPHA, /* U+00b12f: */
+ RTUNI_ALPHA, /* U+00b130: */
+ RTUNI_ALPHA, /* U+00b131: */
+ RTUNI_ALPHA, /* U+00b132: */
+ RTUNI_ALPHA, /* U+00b133: */
+ RTUNI_ALPHA, /* U+00b134: */
+ RTUNI_ALPHA, /* U+00b135: */
+ RTUNI_ALPHA, /* U+00b136: */
+ RTUNI_ALPHA, /* U+00b137: */
+ RTUNI_ALPHA, /* U+00b138: */
+ RTUNI_ALPHA, /* U+00b139: */
+ RTUNI_ALPHA, /* U+00b13a: */
+ RTUNI_ALPHA, /* U+00b13b: */
+ RTUNI_ALPHA, /* U+00b13c: */
+ RTUNI_ALPHA, /* U+00b13d: */
+ RTUNI_ALPHA, /* U+00b13e: */
+ RTUNI_ALPHA, /* U+00b13f: */
+ RTUNI_ALPHA, /* U+00b140: */
+ RTUNI_ALPHA, /* U+00b141: */
+ RTUNI_ALPHA, /* U+00b142: */
+ RTUNI_ALPHA, /* U+00b143: */
+ RTUNI_ALPHA, /* U+00b144: */
+ RTUNI_ALPHA, /* U+00b145: */
+ RTUNI_ALPHA, /* U+00b146: */
+ RTUNI_ALPHA, /* U+00b147: */
+ RTUNI_ALPHA, /* U+00b148: */
+ RTUNI_ALPHA, /* U+00b149: */
+ RTUNI_ALPHA, /* U+00b14a: */
+ RTUNI_ALPHA, /* U+00b14b: */
+ RTUNI_ALPHA, /* U+00b14c: */
+ RTUNI_ALPHA, /* U+00b14d: */
+ RTUNI_ALPHA, /* U+00b14e: */
+ RTUNI_ALPHA, /* U+00b14f: */
+ RTUNI_ALPHA, /* U+00b150: */
+ RTUNI_ALPHA, /* U+00b151: */
+ RTUNI_ALPHA, /* U+00b152: */
+ RTUNI_ALPHA, /* U+00b153: */
+ RTUNI_ALPHA, /* U+00b154: */
+ RTUNI_ALPHA, /* U+00b155: */
+ RTUNI_ALPHA, /* U+00b156: */
+ RTUNI_ALPHA, /* U+00b157: */
+ RTUNI_ALPHA, /* U+00b158: */
+ RTUNI_ALPHA, /* U+00b159: */
+ RTUNI_ALPHA, /* U+00b15a: */
+ RTUNI_ALPHA, /* U+00b15b: */
+ RTUNI_ALPHA, /* U+00b15c: */
+ RTUNI_ALPHA, /* U+00b15d: */
+ RTUNI_ALPHA, /* U+00b15e: */
+ RTUNI_ALPHA, /* U+00b15f: */
+ RTUNI_ALPHA, /* U+00b160: */
+ RTUNI_ALPHA, /* U+00b161: */
+ RTUNI_ALPHA, /* U+00b162: */
+ RTUNI_ALPHA, /* U+00b163: */
+ RTUNI_ALPHA, /* U+00b164: */
+ RTUNI_ALPHA, /* U+00b165: */
+ RTUNI_ALPHA, /* U+00b166: */
+ RTUNI_ALPHA, /* U+00b167: */
+ RTUNI_ALPHA, /* U+00b168: */
+ RTUNI_ALPHA, /* U+00b169: */
+ RTUNI_ALPHA, /* U+00b16a: */
+ RTUNI_ALPHA, /* U+00b16b: */
+ RTUNI_ALPHA, /* U+00b16c: */
+ RTUNI_ALPHA, /* U+00b16d: */
+ RTUNI_ALPHA, /* U+00b16e: */
+ RTUNI_ALPHA, /* U+00b16f: */
+ RTUNI_ALPHA, /* U+00b170: */
+ RTUNI_ALPHA, /* U+00b171: */
+ RTUNI_ALPHA, /* U+00b172: */
+ RTUNI_ALPHA, /* U+00b173: */
+ RTUNI_ALPHA, /* U+00b174: */
+ RTUNI_ALPHA, /* U+00b175: */
+ RTUNI_ALPHA, /* U+00b176: */
+ RTUNI_ALPHA, /* U+00b177: */
+ RTUNI_ALPHA, /* U+00b178: */
+ RTUNI_ALPHA, /* U+00b179: */
+ RTUNI_ALPHA, /* U+00b17a: */
+ RTUNI_ALPHA, /* U+00b17b: */
+ RTUNI_ALPHA, /* U+00b17c: */
+ RTUNI_ALPHA, /* U+00b17d: */
+ RTUNI_ALPHA, /* U+00b17e: */
+ RTUNI_ALPHA, /* U+00b17f: */
+ RTUNI_ALPHA, /* U+00b180: */
+ RTUNI_ALPHA, /* U+00b181: */
+ RTUNI_ALPHA, /* U+00b182: */
+ RTUNI_ALPHA, /* U+00b183: */
+ RTUNI_ALPHA, /* U+00b184: */
+ RTUNI_ALPHA, /* U+00b185: */
+ RTUNI_ALPHA, /* U+00b186: */
+ RTUNI_ALPHA, /* U+00b187: */
+ RTUNI_ALPHA, /* U+00b188: */
+ RTUNI_ALPHA, /* U+00b189: */
+ RTUNI_ALPHA, /* U+00b18a: */
+ RTUNI_ALPHA, /* U+00b18b: */
+ RTUNI_ALPHA, /* U+00b18c: */
+ RTUNI_ALPHA, /* U+00b18d: */
+ RTUNI_ALPHA, /* U+00b18e: */
+ RTUNI_ALPHA, /* U+00b18f: */
+ RTUNI_ALPHA, /* U+00b190: */
+ RTUNI_ALPHA, /* U+00b191: */
+ RTUNI_ALPHA, /* U+00b192: */
+ RTUNI_ALPHA, /* U+00b193: */
+ RTUNI_ALPHA, /* U+00b194: */
+ RTUNI_ALPHA, /* U+00b195: */
+ RTUNI_ALPHA, /* U+00b196: */
+ RTUNI_ALPHA, /* U+00b197: */
+ RTUNI_ALPHA, /* U+00b198: */
+ RTUNI_ALPHA, /* U+00b199: */
+ RTUNI_ALPHA, /* U+00b19a: */
+ RTUNI_ALPHA, /* U+00b19b: */
+ RTUNI_ALPHA, /* U+00b19c: */
+ RTUNI_ALPHA, /* U+00b19d: */
+ RTUNI_ALPHA, /* U+00b19e: */
+ RTUNI_ALPHA, /* U+00b19f: */
+ RTUNI_ALPHA, /* U+00b1a0: */
+ RTUNI_ALPHA, /* U+00b1a1: */
+ RTUNI_ALPHA, /* U+00b1a2: */
+ RTUNI_ALPHA, /* U+00b1a3: */
+ RTUNI_ALPHA, /* U+00b1a4: */
+ RTUNI_ALPHA, /* U+00b1a5: */
+ RTUNI_ALPHA, /* U+00b1a6: */
+ RTUNI_ALPHA, /* U+00b1a7: */
+ RTUNI_ALPHA, /* U+00b1a8: */
+ RTUNI_ALPHA, /* U+00b1a9: */
+ RTUNI_ALPHA, /* U+00b1aa: */
+ RTUNI_ALPHA, /* U+00b1ab: */
+ RTUNI_ALPHA, /* U+00b1ac: */
+ RTUNI_ALPHA, /* U+00b1ad: */
+ RTUNI_ALPHA, /* U+00b1ae: */
+ RTUNI_ALPHA, /* U+00b1af: */
+ RTUNI_ALPHA, /* U+00b1b0: */
+ RTUNI_ALPHA, /* U+00b1b1: */
+ RTUNI_ALPHA, /* U+00b1b2: */
+ RTUNI_ALPHA, /* U+00b1b3: */
+ RTUNI_ALPHA, /* U+00b1b4: */
+ RTUNI_ALPHA, /* U+00b1b5: */
+ RTUNI_ALPHA, /* U+00b1b6: */
+ RTUNI_ALPHA, /* U+00b1b7: */
+ RTUNI_ALPHA, /* U+00b1b8: */
+ RTUNI_ALPHA, /* U+00b1b9: */
+ RTUNI_ALPHA, /* U+00b1ba: */
+ RTUNI_ALPHA, /* U+00b1bb: */
+ RTUNI_ALPHA, /* U+00b1bc: */
+ RTUNI_ALPHA, /* U+00b1bd: */
+ RTUNI_ALPHA, /* U+00b1be: */
+ RTUNI_ALPHA, /* U+00b1bf: */
+ RTUNI_ALPHA, /* U+00b1c0: */
+ RTUNI_ALPHA, /* U+00b1c1: */
+ RTUNI_ALPHA, /* U+00b1c2: */
+ RTUNI_ALPHA, /* U+00b1c3: */
+ RTUNI_ALPHA, /* U+00b1c4: */
+ RTUNI_ALPHA, /* U+00b1c5: */
+ RTUNI_ALPHA, /* U+00b1c6: */
+ RTUNI_ALPHA, /* U+00b1c7: */
+ RTUNI_ALPHA, /* U+00b1c8: */
+ RTUNI_ALPHA, /* U+00b1c9: */
+ RTUNI_ALPHA, /* U+00b1ca: */
+ RTUNI_ALPHA, /* U+00b1cb: */
+ RTUNI_ALPHA, /* U+00b1cc: */
+ RTUNI_ALPHA, /* U+00b1cd: */
+ RTUNI_ALPHA, /* U+00b1ce: */
+ RTUNI_ALPHA, /* U+00b1cf: */
+ RTUNI_ALPHA, /* U+00b1d0: */
+ RTUNI_ALPHA, /* U+00b1d1: */
+ RTUNI_ALPHA, /* U+00b1d2: */
+ RTUNI_ALPHA, /* U+00b1d3: */
+ RTUNI_ALPHA, /* U+00b1d4: */
+ RTUNI_ALPHA, /* U+00b1d5: */
+ RTUNI_ALPHA, /* U+00b1d6: */
+ RTUNI_ALPHA, /* U+00b1d7: */
+ RTUNI_ALPHA, /* U+00b1d8: */
+ RTUNI_ALPHA, /* U+00b1d9: */
+ RTUNI_ALPHA, /* U+00b1da: */
+ RTUNI_ALPHA, /* U+00b1db: */
+ RTUNI_ALPHA, /* U+00b1dc: */
+ RTUNI_ALPHA, /* U+00b1dd: */
+ RTUNI_ALPHA, /* U+00b1de: */
+ RTUNI_ALPHA, /* U+00b1df: */
+ RTUNI_ALPHA, /* U+00b1e0: */
+ RTUNI_ALPHA, /* U+00b1e1: */
+ RTUNI_ALPHA, /* U+00b1e2: */
+ RTUNI_ALPHA, /* U+00b1e3: */
+ RTUNI_ALPHA, /* U+00b1e4: */
+ RTUNI_ALPHA, /* U+00b1e5: */
+ RTUNI_ALPHA, /* U+00b1e6: */
+ RTUNI_ALPHA, /* U+00b1e7: */
+ RTUNI_ALPHA, /* U+00b1e8: */
+ RTUNI_ALPHA, /* U+00b1e9: */
+ RTUNI_ALPHA, /* U+00b1ea: */
+ RTUNI_ALPHA, /* U+00b1eb: */
+ RTUNI_ALPHA, /* U+00b1ec: */
+ RTUNI_ALPHA, /* U+00b1ed: */
+ RTUNI_ALPHA, /* U+00b1ee: */
+ RTUNI_ALPHA, /* U+00b1ef: */
+ RTUNI_ALPHA, /* U+00b1f0: */
+ RTUNI_ALPHA, /* U+00b1f1: */
+ RTUNI_ALPHA, /* U+00b1f2: */
+ RTUNI_ALPHA, /* U+00b1f3: */
+ RTUNI_ALPHA, /* U+00b1f4: */
+ RTUNI_ALPHA, /* U+00b1f5: */
+ RTUNI_ALPHA, /* U+00b1f6: */
+ RTUNI_ALPHA, /* U+00b1f7: */
+ RTUNI_ALPHA, /* U+00b1f8: */
+ RTUNI_ALPHA, /* U+00b1f9: */
+ RTUNI_ALPHA, /* U+00b1fa: */
+ RTUNI_ALPHA, /* U+00b1fb: */
+ RTUNI_ALPHA, /* U+00b1fc: */
+ RTUNI_ALPHA, /* U+00b1fd: */
+ RTUNI_ALPHA, /* U+00b1fe: */
+ RTUNI_ALPHA, /* U+00b1ff: */
+ RTUNI_ALPHA, /* U+00b200: */
+ RTUNI_ALPHA, /* U+00b201: */
+ RTUNI_ALPHA, /* U+00b202: */
+ RTUNI_ALPHA, /* U+00b203: */
+ RTUNI_ALPHA, /* U+00b204: */
+ RTUNI_ALPHA, /* U+00b205: */
+ RTUNI_ALPHA, /* U+00b206: */
+ RTUNI_ALPHA, /* U+00b207: */
+ RTUNI_ALPHA, /* U+00b208: */
+ RTUNI_ALPHA, /* U+00b209: */
+ RTUNI_ALPHA, /* U+00b20a: */
+ RTUNI_ALPHA, /* U+00b20b: */
+ RTUNI_ALPHA, /* U+00b20c: */
+ RTUNI_ALPHA, /* U+00b20d: */
+ RTUNI_ALPHA, /* U+00b20e: */
+ RTUNI_ALPHA, /* U+00b20f: */
+ RTUNI_ALPHA, /* U+00b210: */
+ RTUNI_ALPHA, /* U+00b211: */
+ RTUNI_ALPHA, /* U+00b212: */
+ RTUNI_ALPHA, /* U+00b213: */
+ RTUNI_ALPHA, /* U+00b214: */
+ RTUNI_ALPHA, /* U+00b215: */
+ RTUNI_ALPHA, /* U+00b216: */
+ RTUNI_ALPHA, /* U+00b217: */
+ RTUNI_ALPHA, /* U+00b218: */
+ RTUNI_ALPHA, /* U+00b219: */
+ RTUNI_ALPHA, /* U+00b21a: */
+ RTUNI_ALPHA, /* U+00b21b: */
+ RTUNI_ALPHA, /* U+00b21c: */
+ RTUNI_ALPHA, /* U+00b21d: */
+ RTUNI_ALPHA, /* U+00b21e: */
+ RTUNI_ALPHA, /* U+00b21f: */
+ RTUNI_ALPHA, /* U+00b220: */
+ RTUNI_ALPHA, /* U+00b221: */
+ RTUNI_ALPHA, /* U+00b222: */
+ RTUNI_ALPHA, /* U+00b223: */
+ RTUNI_ALPHA, /* U+00b224: */
+ RTUNI_ALPHA, /* U+00b225: */
+ RTUNI_ALPHA, /* U+00b226: */
+ RTUNI_ALPHA, /* U+00b227: */
+ RTUNI_ALPHA, /* U+00b228: */
+ RTUNI_ALPHA, /* U+00b229: */
+ RTUNI_ALPHA, /* U+00b22a: */
+ RTUNI_ALPHA, /* U+00b22b: */
+ RTUNI_ALPHA, /* U+00b22c: */
+ RTUNI_ALPHA, /* U+00b22d: */
+ RTUNI_ALPHA, /* U+00b22e: */
+ RTUNI_ALPHA, /* U+00b22f: */
+ RTUNI_ALPHA, /* U+00b230: */
+ RTUNI_ALPHA, /* U+00b231: */
+ RTUNI_ALPHA, /* U+00b232: */
+ RTUNI_ALPHA, /* U+00b233: */
+ RTUNI_ALPHA, /* U+00b234: */
+ RTUNI_ALPHA, /* U+00b235: */
+ RTUNI_ALPHA, /* U+00b236: */
+ RTUNI_ALPHA, /* U+00b237: */
+ RTUNI_ALPHA, /* U+00b238: */
+ RTUNI_ALPHA, /* U+00b239: */
+ RTUNI_ALPHA, /* U+00b23a: */
+ RTUNI_ALPHA, /* U+00b23b: */
+ RTUNI_ALPHA, /* U+00b23c: */
+ RTUNI_ALPHA, /* U+00b23d: */
+ RTUNI_ALPHA, /* U+00b23e: */
+ RTUNI_ALPHA, /* U+00b23f: */
+ RTUNI_ALPHA, /* U+00b240: */
+ RTUNI_ALPHA, /* U+00b241: */
+ RTUNI_ALPHA, /* U+00b242: */
+ RTUNI_ALPHA, /* U+00b243: */
+ RTUNI_ALPHA, /* U+00b244: */
+ RTUNI_ALPHA, /* U+00b245: */
+ RTUNI_ALPHA, /* U+00b246: */
+ RTUNI_ALPHA, /* U+00b247: */
+ RTUNI_ALPHA, /* U+00b248: */
+ RTUNI_ALPHA, /* U+00b249: */
+ RTUNI_ALPHA, /* U+00b24a: */
+ RTUNI_ALPHA, /* U+00b24b: */
+ RTUNI_ALPHA, /* U+00b24c: */
+ RTUNI_ALPHA, /* U+00b24d: */
+ RTUNI_ALPHA, /* U+00b24e: */
+ RTUNI_ALPHA, /* U+00b24f: */
+ RTUNI_ALPHA, /* U+00b250: */
+ RTUNI_ALPHA, /* U+00b251: */
+ RTUNI_ALPHA, /* U+00b252: */
+ RTUNI_ALPHA, /* U+00b253: */
+ RTUNI_ALPHA, /* U+00b254: */
+ RTUNI_ALPHA, /* U+00b255: */
+ RTUNI_ALPHA, /* U+00b256: */
+ RTUNI_ALPHA, /* U+00b257: */
+ RTUNI_ALPHA, /* U+00b258: */
+ RTUNI_ALPHA, /* U+00b259: */
+ RTUNI_ALPHA, /* U+00b25a: */
+ RTUNI_ALPHA, /* U+00b25b: */
+ RTUNI_ALPHA, /* U+00b25c: */
+ RTUNI_ALPHA, /* U+00b25d: */
+ RTUNI_ALPHA, /* U+00b25e: */
+ RTUNI_ALPHA, /* U+00b25f: */
+ RTUNI_ALPHA, /* U+00b260: */
+ RTUNI_ALPHA, /* U+00b261: */
+ RTUNI_ALPHA, /* U+00b262: */
+ RTUNI_ALPHA, /* U+00b263: */
+ RTUNI_ALPHA, /* U+00b264: */
+ RTUNI_ALPHA, /* U+00b265: */
+ RTUNI_ALPHA, /* U+00b266: */
+ RTUNI_ALPHA, /* U+00b267: */
+ RTUNI_ALPHA, /* U+00b268: */
+ RTUNI_ALPHA, /* U+00b269: */
+ RTUNI_ALPHA, /* U+00b26a: */
+ RTUNI_ALPHA, /* U+00b26b: */
+ RTUNI_ALPHA, /* U+00b26c: */
+ RTUNI_ALPHA, /* U+00b26d: */
+ RTUNI_ALPHA, /* U+00b26e: */
+ RTUNI_ALPHA, /* U+00b26f: */
+ RTUNI_ALPHA, /* U+00b270: */
+ RTUNI_ALPHA, /* U+00b271: */
+ RTUNI_ALPHA, /* U+00b272: */
+ RTUNI_ALPHA, /* U+00b273: */
+ RTUNI_ALPHA, /* U+00b274: */
+ RTUNI_ALPHA, /* U+00b275: */
+ RTUNI_ALPHA, /* U+00b276: */
+ RTUNI_ALPHA, /* U+00b277: */
+ RTUNI_ALPHA, /* U+00b278: */
+ RTUNI_ALPHA, /* U+00b279: */
+ RTUNI_ALPHA, /* U+00b27a: */
+ RTUNI_ALPHA, /* U+00b27b: */
+ RTUNI_ALPHA, /* U+00b27c: */
+ RTUNI_ALPHA, /* U+00b27d: */
+ RTUNI_ALPHA, /* U+00b27e: */
+ RTUNI_ALPHA, /* U+00b27f: */
+ RTUNI_ALPHA, /* U+00b280: */
+ RTUNI_ALPHA, /* U+00b281: */
+ RTUNI_ALPHA, /* U+00b282: */
+ RTUNI_ALPHA, /* U+00b283: */
+ RTUNI_ALPHA, /* U+00b284: */
+ RTUNI_ALPHA, /* U+00b285: */
+ RTUNI_ALPHA, /* U+00b286: */
+ RTUNI_ALPHA, /* U+00b287: */
+ RTUNI_ALPHA, /* U+00b288: */
+ RTUNI_ALPHA, /* U+00b289: */
+ RTUNI_ALPHA, /* U+00b28a: */
+ RTUNI_ALPHA, /* U+00b28b: */
+ RTUNI_ALPHA, /* U+00b28c: */
+ RTUNI_ALPHA, /* U+00b28d: */
+ RTUNI_ALPHA, /* U+00b28e: */
+ RTUNI_ALPHA, /* U+00b28f: */
+ RTUNI_ALPHA, /* U+00b290: */
+ RTUNI_ALPHA, /* U+00b291: */
+ RTUNI_ALPHA, /* U+00b292: */
+ RTUNI_ALPHA, /* U+00b293: */
+ RTUNI_ALPHA, /* U+00b294: */
+ RTUNI_ALPHA, /* U+00b295: */
+ RTUNI_ALPHA, /* U+00b296: */
+ RTUNI_ALPHA, /* U+00b297: */
+ RTUNI_ALPHA, /* U+00b298: */
+ RTUNI_ALPHA, /* U+00b299: */
+ RTUNI_ALPHA, /* U+00b29a: */
+ RTUNI_ALPHA, /* U+00b29b: */
+ RTUNI_ALPHA, /* U+00b29c: */
+ RTUNI_ALPHA, /* U+00b29d: */
+ RTUNI_ALPHA, /* U+00b29e: */
+ RTUNI_ALPHA, /* U+00b29f: */
+ RTUNI_ALPHA, /* U+00b2a0: */
+ RTUNI_ALPHA, /* U+00b2a1: */
+ RTUNI_ALPHA, /* U+00b2a2: */
+ RTUNI_ALPHA, /* U+00b2a3: */
+ RTUNI_ALPHA, /* U+00b2a4: */
+ RTUNI_ALPHA, /* U+00b2a5: */
+ RTUNI_ALPHA, /* U+00b2a6: */
+ RTUNI_ALPHA, /* U+00b2a7: */
+ RTUNI_ALPHA, /* U+00b2a8: */
+ RTUNI_ALPHA, /* U+00b2a9: */
+ RTUNI_ALPHA, /* U+00b2aa: */
+ RTUNI_ALPHA, /* U+00b2ab: */
+ RTUNI_ALPHA, /* U+00b2ac: */
+ RTUNI_ALPHA, /* U+00b2ad: */
+ RTUNI_ALPHA, /* U+00b2ae: */
+ RTUNI_ALPHA, /* U+00b2af: */
+ RTUNI_ALPHA, /* U+00b2b0: */
+ RTUNI_ALPHA, /* U+00b2b1: */
+ RTUNI_ALPHA, /* U+00b2b2: */
+ RTUNI_ALPHA, /* U+00b2b3: */
+ RTUNI_ALPHA, /* U+00b2b4: */
+ RTUNI_ALPHA, /* U+00b2b5: */
+ RTUNI_ALPHA, /* U+00b2b6: */
+ RTUNI_ALPHA, /* U+00b2b7: */
+ RTUNI_ALPHA, /* U+00b2b8: */
+ RTUNI_ALPHA, /* U+00b2b9: */
+ RTUNI_ALPHA, /* U+00b2ba: */
+ RTUNI_ALPHA, /* U+00b2bb: */
+ RTUNI_ALPHA, /* U+00b2bc: */
+ RTUNI_ALPHA, /* U+00b2bd: */
+ RTUNI_ALPHA, /* U+00b2be: */
+ RTUNI_ALPHA, /* U+00b2bf: */
+ RTUNI_ALPHA, /* U+00b2c0: */
+ RTUNI_ALPHA, /* U+00b2c1: */
+ RTUNI_ALPHA, /* U+00b2c2: */
+ RTUNI_ALPHA, /* U+00b2c3: */
+ RTUNI_ALPHA, /* U+00b2c4: */
+ RTUNI_ALPHA, /* U+00b2c5: */
+ RTUNI_ALPHA, /* U+00b2c6: */
+ RTUNI_ALPHA, /* U+00b2c7: */
+ RTUNI_ALPHA, /* U+00b2c8: */
+ RTUNI_ALPHA, /* U+00b2c9: */
+ RTUNI_ALPHA, /* U+00b2ca: */
+ RTUNI_ALPHA, /* U+00b2cb: */
+ RTUNI_ALPHA, /* U+00b2cc: */
+ RTUNI_ALPHA, /* U+00b2cd: */
+ RTUNI_ALPHA, /* U+00b2ce: */
+ RTUNI_ALPHA, /* U+00b2cf: */
+ RTUNI_ALPHA, /* U+00b2d0: */
+ RTUNI_ALPHA, /* U+00b2d1: */
+ RTUNI_ALPHA, /* U+00b2d2: */
+ RTUNI_ALPHA, /* U+00b2d3: */
+ RTUNI_ALPHA, /* U+00b2d4: */
+ RTUNI_ALPHA, /* U+00b2d5: */
+ RTUNI_ALPHA, /* U+00b2d6: */
+ RTUNI_ALPHA, /* U+00b2d7: */
+ RTUNI_ALPHA, /* U+00b2d8: */
+ RTUNI_ALPHA, /* U+00b2d9: */
+ RTUNI_ALPHA, /* U+00b2da: */
+ RTUNI_ALPHA, /* U+00b2db: */
+ RTUNI_ALPHA, /* U+00b2dc: */
+ RTUNI_ALPHA, /* U+00b2dd: */
+ RTUNI_ALPHA, /* U+00b2de: */
+ RTUNI_ALPHA, /* U+00b2df: */
+ RTUNI_ALPHA, /* U+00b2e0: */
+ RTUNI_ALPHA, /* U+00b2e1: */
+ RTUNI_ALPHA, /* U+00b2e2: */
+ RTUNI_ALPHA, /* U+00b2e3: */
+ RTUNI_ALPHA, /* U+00b2e4: */
+ RTUNI_ALPHA, /* U+00b2e5: */
+ RTUNI_ALPHA, /* U+00b2e6: */
+ RTUNI_ALPHA, /* U+00b2e7: */
+ RTUNI_ALPHA, /* U+00b2e8: */
+ RTUNI_ALPHA, /* U+00b2e9: */
+ RTUNI_ALPHA, /* U+00b2ea: */
+ RTUNI_ALPHA, /* U+00b2eb: */
+ RTUNI_ALPHA, /* U+00b2ec: */
+ RTUNI_ALPHA, /* U+00b2ed: */
+ RTUNI_ALPHA, /* U+00b2ee: */
+ RTUNI_ALPHA, /* U+00b2ef: */
+ RTUNI_ALPHA, /* U+00b2f0: */
+ RTUNI_ALPHA, /* U+00b2f1: */
+ RTUNI_ALPHA, /* U+00b2f2: */
+ RTUNI_ALPHA, /* U+00b2f3: */
+ RTUNI_ALPHA, /* U+00b2f4: */
+ RTUNI_ALPHA, /* U+00b2f5: */
+ RTUNI_ALPHA, /* U+00b2f6: */
+ RTUNI_ALPHA, /* U+00b2f7: */
+ RTUNI_ALPHA, /* U+00b2f8: */
+ RTUNI_ALPHA, /* U+00b2f9: */
+ RTUNI_ALPHA, /* U+00b2fa: */
+ RTUNI_ALPHA, /* U+00b2fb: */
+ RTUNI_ALPHA, /* U+00b2fc: */
+ RTUNI_ALPHA, /* U+00b2fd: */
+ RTUNI_ALPHA, /* U+00b2fe: */
+ RTUNI_ALPHA, /* U+00b2ff: */
+ RTUNI_ALPHA, /* U+00b300: */
+ RTUNI_ALPHA, /* U+00b301: */
+ RTUNI_ALPHA, /* U+00b302: */
+ RTUNI_ALPHA, /* U+00b303: */
+ RTUNI_ALPHA, /* U+00b304: */
+ RTUNI_ALPHA, /* U+00b305: */
+ RTUNI_ALPHA, /* U+00b306: */
+ RTUNI_ALPHA, /* U+00b307: */
+ RTUNI_ALPHA, /* U+00b308: */
+ RTUNI_ALPHA, /* U+00b309: */
+ RTUNI_ALPHA, /* U+00b30a: */
+ RTUNI_ALPHA, /* U+00b30b: */
+ RTUNI_ALPHA, /* U+00b30c: */
+ RTUNI_ALPHA, /* U+00b30d: */
+ RTUNI_ALPHA, /* U+00b30e: */
+ RTUNI_ALPHA, /* U+00b30f: */
+ RTUNI_ALPHA, /* U+00b310: */
+ RTUNI_ALPHA, /* U+00b311: */
+ RTUNI_ALPHA, /* U+00b312: */
+ RTUNI_ALPHA, /* U+00b313: */
+ RTUNI_ALPHA, /* U+00b314: */
+ RTUNI_ALPHA, /* U+00b315: */
+ RTUNI_ALPHA, /* U+00b316: */
+ RTUNI_ALPHA, /* U+00b317: */
+ RTUNI_ALPHA, /* U+00b318: */
+ RTUNI_ALPHA, /* U+00b319: */
+ RTUNI_ALPHA, /* U+00b31a: */
+ RTUNI_ALPHA, /* U+00b31b: */
+ RTUNI_ALPHA, /* U+00b31c: */
+ RTUNI_ALPHA, /* U+00b31d: */
+ RTUNI_ALPHA, /* U+00b31e: */
+ RTUNI_ALPHA, /* U+00b31f: */
+ RTUNI_ALPHA, /* U+00b320: */
+ RTUNI_ALPHA, /* U+00b321: */
+ RTUNI_ALPHA, /* U+00b322: */
+ RTUNI_ALPHA, /* U+00b323: */
+ RTUNI_ALPHA, /* U+00b324: */
+ RTUNI_ALPHA, /* U+00b325: */
+ RTUNI_ALPHA, /* U+00b326: */
+ RTUNI_ALPHA, /* U+00b327: */
+ RTUNI_ALPHA, /* U+00b328: */
+ RTUNI_ALPHA, /* U+00b329: */
+ RTUNI_ALPHA, /* U+00b32a: */
+ RTUNI_ALPHA, /* U+00b32b: */
+ RTUNI_ALPHA, /* U+00b32c: */
+ RTUNI_ALPHA, /* U+00b32d: */
+ RTUNI_ALPHA, /* U+00b32e: */
+ RTUNI_ALPHA, /* U+00b32f: */
+ RTUNI_ALPHA, /* U+00b330: */
+ RTUNI_ALPHA, /* U+00b331: */
+ RTUNI_ALPHA, /* U+00b332: */
+ RTUNI_ALPHA, /* U+00b333: */
+ RTUNI_ALPHA, /* U+00b334: */
+ RTUNI_ALPHA, /* U+00b335: */
+ RTUNI_ALPHA, /* U+00b336: */
+ RTUNI_ALPHA, /* U+00b337: */
+ RTUNI_ALPHA, /* U+00b338: */
+ RTUNI_ALPHA, /* U+00b339: */
+ RTUNI_ALPHA, /* U+00b33a: */
+ RTUNI_ALPHA, /* U+00b33b: */
+ RTUNI_ALPHA, /* U+00b33c: */
+ RTUNI_ALPHA, /* U+00b33d: */
+ RTUNI_ALPHA, /* U+00b33e: */
+ RTUNI_ALPHA, /* U+00b33f: */
+ RTUNI_ALPHA, /* U+00b340: */
+ RTUNI_ALPHA, /* U+00b341: */
+ RTUNI_ALPHA, /* U+00b342: */
+ RTUNI_ALPHA, /* U+00b343: */
+ RTUNI_ALPHA, /* U+00b344: */
+ RTUNI_ALPHA, /* U+00b345: */
+ RTUNI_ALPHA, /* U+00b346: */
+ RTUNI_ALPHA, /* U+00b347: */
+ RTUNI_ALPHA, /* U+00b348: */
+ RTUNI_ALPHA, /* U+00b349: */
+ RTUNI_ALPHA, /* U+00b34a: */
+ RTUNI_ALPHA, /* U+00b34b: */
+ RTUNI_ALPHA, /* U+00b34c: */
+ RTUNI_ALPHA, /* U+00b34d: */
+ RTUNI_ALPHA, /* U+00b34e: */
+ RTUNI_ALPHA, /* U+00b34f: */
+ RTUNI_ALPHA, /* U+00b350: */
+ RTUNI_ALPHA, /* U+00b351: */
+ RTUNI_ALPHA, /* U+00b352: */
+ RTUNI_ALPHA, /* U+00b353: */
+ RTUNI_ALPHA, /* U+00b354: */
+ RTUNI_ALPHA, /* U+00b355: */
+ RTUNI_ALPHA, /* U+00b356: */
+ RTUNI_ALPHA, /* U+00b357: */
+ RTUNI_ALPHA, /* U+00b358: */
+ RTUNI_ALPHA, /* U+00b359: */
+ RTUNI_ALPHA, /* U+00b35a: */
+ RTUNI_ALPHA, /* U+00b35b: */
+ RTUNI_ALPHA, /* U+00b35c: */
+ RTUNI_ALPHA, /* U+00b35d: */
+ RTUNI_ALPHA, /* U+00b35e: */
+ RTUNI_ALPHA, /* U+00b35f: */
+ RTUNI_ALPHA, /* U+00b360: */
+ RTUNI_ALPHA, /* U+00b361: */
+ RTUNI_ALPHA, /* U+00b362: */
+ RTUNI_ALPHA, /* U+00b363: */
+ RTUNI_ALPHA, /* U+00b364: */
+ RTUNI_ALPHA, /* U+00b365: */
+ RTUNI_ALPHA, /* U+00b366: */
+ RTUNI_ALPHA, /* U+00b367: */
+ RTUNI_ALPHA, /* U+00b368: */
+ RTUNI_ALPHA, /* U+00b369: */
+ RTUNI_ALPHA, /* U+00b36a: */
+ RTUNI_ALPHA, /* U+00b36b: */
+ RTUNI_ALPHA, /* U+00b36c: */
+ RTUNI_ALPHA, /* U+00b36d: */
+ RTUNI_ALPHA, /* U+00b36e: */
+ RTUNI_ALPHA, /* U+00b36f: */
+ RTUNI_ALPHA, /* U+00b370: */
+ RTUNI_ALPHA, /* U+00b371: */
+ RTUNI_ALPHA, /* U+00b372: */
+ RTUNI_ALPHA, /* U+00b373: */
+ RTUNI_ALPHA, /* U+00b374: */
+ RTUNI_ALPHA, /* U+00b375: */
+ RTUNI_ALPHA, /* U+00b376: */
+ RTUNI_ALPHA, /* U+00b377: */
+ RTUNI_ALPHA, /* U+00b378: */
+ RTUNI_ALPHA, /* U+00b379: */
+ RTUNI_ALPHA, /* U+00b37a: */
+ RTUNI_ALPHA, /* U+00b37b: */
+ RTUNI_ALPHA, /* U+00b37c: */
+ RTUNI_ALPHA, /* U+00b37d: */
+ RTUNI_ALPHA, /* U+00b37e: */
+ RTUNI_ALPHA, /* U+00b37f: */
+ RTUNI_ALPHA, /* U+00b380: */
+ RTUNI_ALPHA, /* U+00b381: */
+ RTUNI_ALPHA, /* U+00b382: */
+ RTUNI_ALPHA, /* U+00b383: */
+ RTUNI_ALPHA, /* U+00b384: */
+ RTUNI_ALPHA, /* U+00b385: */
+ RTUNI_ALPHA, /* U+00b386: */
+ RTUNI_ALPHA, /* U+00b387: */
+ RTUNI_ALPHA, /* U+00b388: */
+ RTUNI_ALPHA, /* U+00b389: */
+ RTUNI_ALPHA, /* U+00b38a: */
+ RTUNI_ALPHA, /* U+00b38b: */
+ RTUNI_ALPHA, /* U+00b38c: */
+ RTUNI_ALPHA, /* U+00b38d: */
+ RTUNI_ALPHA, /* U+00b38e: */
+ RTUNI_ALPHA, /* U+00b38f: */
+ RTUNI_ALPHA, /* U+00b390: */
+ RTUNI_ALPHA, /* U+00b391: */
+ RTUNI_ALPHA, /* U+00b392: */
+ RTUNI_ALPHA, /* U+00b393: */
+ RTUNI_ALPHA, /* U+00b394: */
+ RTUNI_ALPHA, /* U+00b395: */
+ RTUNI_ALPHA, /* U+00b396: */
+ RTUNI_ALPHA, /* U+00b397: */
+ RTUNI_ALPHA, /* U+00b398: */
+ RTUNI_ALPHA, /* U+00b399: */
+ RTUNI_ALPHA, /* U+00b39a: */
+ RTUNI_ALPHA, /* U+00b39b: */
+ RTUNI_ALPHA, /* U+00b39c: */
+ RTUNI_ALPHA, /* U+00b39d: */
+ RTUNI_ALPHA, /* U+00b39e: */
+ RTUNI_ALPHA, /* U+00b39f: */
+ RTUNI_ALPHA, /* U+00b3a0: */
+ RTUNI_ALPHA, /* U+00b3a1: */
+ RTUNI_ALPHA, /* U+00b3a2: */
+ RTUNI_ALPHA, /* U+00b3a3: */
+ RTUNI_ALPHA, /* U+00b3a4: */
+ RTUNI_ALPHA, /* U+00b3a5: */
+ RTUNI_ALPHA, /* U+00b3a6: */
+ RTUNI_ALPHA, /* U+00b3a7: */
+ RTUNI_ALPHA, /* U+00b3a8: */
+ RTUNI_ALPHA, /* U+00b3a9: */
+ RTUNI_ALPHA, /* U+00b3aa: */
+ RTUNI_ALPHA, /* U+00b3ab: */
+ RTUNI_ALPHA, /* U+00b3ac: */
+ RTUNI_ALPHA, /* U+00b3ad: */
+ RTUNI_ALPHA, /* U+00b3ae: */
+ RTUNI_ALPHA, /* U+00b3af: */
+ RTUNI_ALPHA, /* U+00b3b0: */
+ RTUNI_ALPHA, /* U+00b3b1: */
+ RTUNI_ALPHA, /* U+00b3b2: */
+ RTUNI_ALPHA, /* U+00b3b3: */
+ RTUNI_ALPHA, /* U+00b3b4: */
+ RTUNI_ALPHA, /* U+00b3b5: */
+ RTUNI_ALPHA, /* U+00b3b6: */
+ RTUNI_ALPHA, /* U+00b3b7: */
+ RTUNI_ALPHA, /* U+00b3b8: */
+ RTUNI_ALPHA, /* U+00b3b9: */
+ RTUNI_ALPHA, /* U+00b3ba: */
+ RTUNI_ALPHA, /* U+00b3bb: */
+ RTUNI_ALPHA, /* U+00b3bc: */
+ RTUNI_ALPHA, /* U+00b3bd: */
+ RTUNI_ALPHA, /* U+00b3be: */
+ RTUNI_ALPHA, /* U+00b3bf: */
+ RTUNI_ALPHA, /* U+00b3c0: */
+ RTUNI_ALPHA, /* U+00b3c1: */
+ RTUNI_ALPHA, /* U+00b3c2: */
+ RTUNI_ALPHA, /* U+00b3c3: */
+ RTUNI_ALPHA, /* U+00b3c4: */
+ RTUNI_ALPHA, /* U+00b3c5: */
+ RTUNI_ALPHA, /* U+00b3c6: */
+ RTUNI_ALPHA, /* U+00b3c7: */
+ RTUNI_ALPHA, /* U+00b3c8: */
+ RTUNI_ALPHA, /* U+00b3c9: */
+ RTUNI_ALPHA, /* U+00b3ca: */
+ RTUNI_ALPHA, /* U+00b3cb: */
+ RTUNI_ALPHA, /* U+00b3cc: */
+ RTUNI_ALPHA, /* U+00b3cd: */
+ RTUNI_ALPHA, /* U+00b3ce: */
+ RTUNI_ALPHA, /* U+00b3cf: */
+ RTUNI_ALPHA, /* U+00b3d0: */
+ RTUNI_ALPHA, /* U+00b3d1: */
+ RTUNI_ALPHA, /* U+00b3d2: */
+ RTUNI_ALPHA, /* U+00b3d3: */
+ RTUNI_ALPHA, /* U+00b3d4: */
+ RTUNI_ALPHA, /* U+00b3d5: */
+ RTUNI_ALPHA, /* U+00b3d6: */
+ RTUNI_ALPHA, /* U+00b3d7: */
+ RTUNI_ALPHA, /* U+00b3d8: */
+ RTUNI_ALPHA, /* U+00b3d9: */
+ RTUNI_ALPHA, /* U+00b3da: */
+ RTUNI_ALPHA, /* U+00b3db: */
+ RTUNI_ALPHA, /* U+00b3dc: */
+ RTUNI_ALPHA, /* U+00b3dd: */
+ RTUNI_ALPHA, /* U+00b3de: */
+ RTUNI_ALPHA, /* U+00b3df: */
+ RTUNI_ALPHA, /* U+00b3e0: */
+ RTUNI_ALPHA, /* U+00b3e1: */
+ RTUNI_ALPHA, /* U+00b3e2: */
+ RTUNI_ALPHA, /* U+00b3e3: */
+ RTUNI_ALPHA, /* U+00b3e4: */
+ RTUNI_ALPHA, /* U+00b3e5: */
+ RTUNI_ALPHA, /* U+00b3e6: */
+ RTUNI_ALPHA, /* U+00b3e7: */
+ RTUNI_ALPHA, /* U+00b3e8: */
+ RTUNI_ALPHA, /* U+00b3e9: */
+ RTUNI_ALPHA, /* U+00b3ea: */
+ RTUNI_ALPHA, /* U+00b3eb: */
+ RTUNI_ALPHA, /* U+00b3ec: */
+ RTUNI_ALPHA, /* U+00b3ed: */
+ RTUNI_ALPHA, /* U+00b3ee: */
+ RTUNI_ALPHA, /* U+00b3ef: */
+ RTUNI_ALPHA, /* U+00b3f0: */
+ RTUNI_ALPHA, /* U+00b3f1: */
+ RTUNI_ALPHA, /* U+00b3f2: */
+ RTUNI_ALPHA, /* U+00b3f3: */
+ RTUNI_ALPHA, /* U+00b3f4: */
+ RTUNI_ALPHA, /* U+00b3f5: */
+ RTUNI_ALPHA, /* U+00b3f6: */
+ RTUNI_ALPHA, /* U+00b3f7: */
+ RTUNI_ALPHA, /* U+00b3f8: */
+ RTUNI_ALPHA, /* U+00b3f9: */
+ RTUNI_ALPHA, /* U+00b3fa: */
+ RTUNI_ALPHA, /* U+00b3fb: */
+ RTUNI_ALPHA, /* U+00b3fc: */
+ RTUNI_ALPHA, /* U+00b3fd: */
+ RTUNI_ALPHA, /* U+00b3fe: */
+ RTUNI_ALPHA, /* U+00b3ff: */
+ RTUNI_ALPHA, /* U+00b400: */
+ RTUNI_ALPHA, /* U+00b401: */
+ RTUNI_ALPHA, /* U+00b402: */
+ RTUNI_ALPHA, /* U+00b403: */
+ RTUNI_ALPHA, /* U+00b404: */
+ RTUNI_ALPHA, /* U+00b405: */
+ RTUNI_ALPHA, /* U+00b406: */
+ RTUNI_ALPHA, /* U+00b407: */
+ RTUNI_ALPHA, /* U+00b408: */
+ RTUNI_ALPHA, /* U+00b409: */
+ RTUNI_ALPHA, /* U+00b40a: */
+ RTUNI_ALPHA, /* U+00b40b: */
+ RTUNI_ALPHA, /* U+00b40c: */
+ RTUNI_ALPHA, /* U+00b40d: */
+ RTUNI_ALPHA, /* U+00b40e: */
+ RTUNI_ALPHA, /* U+00b40f: */
+ RTUNI_ALPHA, /* U+00b410: */
+ RTUNI_ALPHA, /* U+00b411: */
+ RTUNI_ALPHA, /* U+00b412: */
+ RTUNI_ALPHA, /* U+00b413: */
+ RTUNI_ALPHA, /* U+00b414: */
+ RTUNI_ALPHA, /* U+00b415: */
+ RTUNI_ALPHA, /* U+00b416: */
+ RTUNI_ALPHA, /* U+00b417: */
+ RTUNI_ALPHA, /* U+00b418: */
+ RTUNI_ALPHA, /* U+00b419: */
+ RTUNI_ALPHA, /* U+00b41a: */
+ RTUNI_ALPHA, /* U+00b41b: */
+ RTUNI_ALPHA, /* U+00b41c: */
+ RTUNI_ALPHA, /* U+00b41d: */
+ RTUNI_ALPHA, /* U+00b41e: */
+ RTUNI_ALPHA, /* U+00b41f: */
+ RTUNI_ALPHA, /* U+00b420: */
+ RTUNI_ALPHA, /* U+00b421: */
+ RTUNI_ALPHA, /* U+00b422: */
+ RTUNI_ALPHA, /* U+00b423: */
+ RTUNI_ALPHA, /* U+00b424: */
+ RTUNI_ALPHA, /* U+00b425: */
+ RTUNI_ALPHA, /* U+00b426: */
+ RTUNI_ALPHA, /* U+00b427: */
+ RTUNI_ALPHA, /* U+00b428: */
+ RTUNI_ALPHA, /* U+00b429: */
+ RTUNI_ALPHA, /* U+00b42a: */
+ RTUNI_ALPHA, /* U+00b42b: */
+ RTUNI_ALPHA, /* U+00b42c: */
+ RTUNI_ALPHA, /* U+00b42d: */
+ RTUNI_ALPHA, /* U+00b42e: */
+ RTUNI_ALPHA, /* U+00b42f: */
+ RTUNI_ALPHA, /* U+00b430: */
+ RTUNI_ALPHA, /* U+00b431: */
+ RTUNI_ALPHA, /* U+00b432: */
+ RTUNI_ALPHA, /* U+00b433: */
+ RTUNI_ALPHA, /* U+00b434: */
+ RTUNI_ALPHA, /* U+00b435: */
+ RTUNI_ALPHA, /* U+00b436: */
+ RTUNI_ALPHA, /* U+00b437: */
+ RTUNI_ALPHA, /* U+00b438: */
+ RTUNI_ALPHA, /* U+00b439: */
+ RTUNI_ALPHA, /* U+00b43a: */
+ RTUNI_ALPHA, /* U+00b43b: */
+ RTUNI_ALPHA, /* U+00b43c: */
+ RTUNI_ALPHA, /* U+00b43d: */
+ RTUNI_ALPHA, /* U+00b43e: */
+ RTUNI_ALPHA, /* U+00b43f: */
+ RTUNI_ALPHA, /* U+00b440: */
+ RTUNI_ALPHA, /* U+00b441: */
+ RTUNI_ALPHA, /* U+00b442: */
+ RTUNI_ALPHA, /* U+00b443: */
+ RTUNI_ALPHA, /* U+00b444: */
+ RTUNI_ALPHA, /* U+00b445: */
+ RTUNI_ALPHA, /* U+00b446: */
+ RTUNI_ALPHA, /* U+00b447: */
+ RTUNI_ALPHA, /* U+00b448: */
+ RTUNI_ALPHA, /* U+00b449: */
+ RTUNI_ALPHA, /* U+00b44a: */
+ RTUNI_ALPHA, /* U+00b44b: */
+ RTUNI_ALPHA, /* U+00b44c: */
+ RTUNI_ALPHA, /* U+00b44d: */
+ RTUNI_ALPHA, /* U+00b44e: */
+ RTUNI_ALPHA, /* U+00b44f: */
+ RTUNI_ALPHA, /* U+00b450: */
+ RTUNI_ALPHA, /* U+00b451: */
+ RTUNI_ALPHA, /* U+00b452: */
+ RTUNI_ALPHA, /* U+00b453: */
+ RTUNI_ALPHA, /* U+00b454: */
+ RTUNI_ALPHA, /* U+00b455: */
+ RTUNI_ALPHA, /* U+00b456: */
+ RTUNI_ALPHA, /* U+00b457: */
+ RTUNI_ALPHA, /* U+00b458: */
+ RTUNI_ALPHA, /* U+00b459: */
+ RTUNI_ALPHA, /* U+00b45a: */
+ RTUNI_ALPHA, /* U+00b45b: */
+ RTUNI_ALPHA, /* U+00b45c: */
+ RTUNI_ALPHA, /* U+00b45d: */
+ RTUNI_ALPHA, /* U+00b45e: */
+ RTUNI_ALPHA, /* U+00b45f: */
+ RTUNI_ALPHA, /* U+00b460: */
+ RTUNI_ALPHA, /* U+00b461: */
+ RTUNI_ALPHA, /* U+00b462: */
+ RTUNI_ALPHA, /* U+00b463: */
+ RTUNI_ALPHA, /* U+00b464: */
+ RTUNI_ALPHA, /* U+00b465: */
+ RTUNI_ALPHA, /* U+00b466: */
+ RTUNI_ALPHA, /* U+00b467: */
+ RTUNI_ALPHA, /* U+00b468: */
+ RTUNI_ALPHA, /* U+00b469: */
+ RTUNI_ALPHA, /* U+00b46a: */
+ RTUNI_ALPHA, /* U+00b46b: */
+ RTUNI_ALPHA, /* U+00b46c: */
+ RTUNI_ALPHA, /* U+00b46d: */
+ RTUNI_ALPHA, /* U+00b46e: */
+ RTUNI_ALPHA, /* U+00b46f: */
+ RTUNI_ALPHA, /* U+00b470: */
+ RTUNI_ALPHA, /* U+00b471: */
+ RTUNI_ALPHA, /* U+00b472: */
+ RTUNI_ALPHA, /* U+00b473: */
+ RTUNI_ALPHA, /* U+00b474: */
+ RTUNI_ALPHA, /* U+00b475: */
+ RTUNI_ALPHA, /* U+00b476: */
+ RTUNI_ALPHA, /* U+00b477: */
+ RTUNI_ALPHA, /* U+00b478: */
+ RTUNI_ALPHA, /* U+00b479: */
+ RTUNI_ALPHA, /* U+00b47a: */
+ RTUNI_ALPHA, /* U+00b47b: */
+ RTUNI_ALPHA, /* U+00b47c: */
+ RTUNI_ALPHA, /* U+00b47d: */
+ RTUNI_ALPHA, /* U+00b47e: */
+ RTUNI_ALPHA, /* U+00b47f: */
+ RTUNI_ALPHA, /* U+00b480: */
+ RTUNI_ALPHA, /* U+00b481: */
+ RTUNI_ALPHA, /* U+00b482: */
+ RTUNI_ALPHA, /* U+00b483: */
+ RTUNI_ALPHA, /* U+00b484: */
+ RTUNI_ALPHA, /* U+00b485: */
+ RTUNI_ALPHA, /* U+00b486: */
+ RTUNI_ALPHA, /* U+00b487: */
+ RTUNI_ALPHA, /* U+00b488: */
+ RTUNI_ALPHA, /* U+00b489: */
+ RTUNI_ALPHA, /* U+00b48a: */
+ RTUNI_ALPHA, /* U+00b48b: */
+ RTUNI_ALPHA, /* U+00b48c: */
+ RTUNI_ALPHA, /* U+00b48d: */
+ RTUNI_ALPHA, /* U+00b48e: */
+ RTUNI_ALPHA, /* U+00b48f: */
+ RTUNI_ALPHA, /* U+00b490: */
+ RTUNI_ALPHA, /* U+00b491: */
+ RTUNI_ALPHA, /* U+00b492: */
+ RTUNI_ALPHA, /* U+00b493: */
+ RTUNI_ALPHA, /* U+00b494: */
+ RTUNI_ALPHA, /* U+00b495: */
+ RTUNI_ALPHA, /* U+00b496: */
+ RTUNI_ALPHA, /* U+00b497: */
+ RTUNI_ALPHA, /* U+00b498: */
+ RTUNI_ALPHA, /* U+00b499: */
+ RTUNI_ALPHA, /* U+00b49a: */
+ RTUNI_ALPHA, /* U+00b49b: */
+ RTUNI_ALPHA, /* U+00b49c: */
+ RTUNI_ALPHA, /* U+00b49d: */
+ RTUNI_ALPHA, /* U+00b49e: */
+ RTUNI_ALPHA, /* U+00b49f: */
+ RTUNI_ALPHA, /* U+00b4a0: */
+ RTUNI_ALPHA, /* U+00b4a1: */
+ RTUNI_ALPHA, /* U+00b4a2: */
+ RTUNI_ALPHA, /* U+00b4a3: */
+ RTUNI_ALPHA, /* U+00b4a4: */
+ RTUNI_ALPHA, /* U+00b4a5: */
+ RTUNI_ALPHA, /* U+00b4a6: */
+ RTUNI_ALPHA, /* U+00b4a7: */
+ RTUNI_ALPHA, /* U+00b4a8: */
+ RTUNI_ALPHA, /* U+00b4a9: */
+ RTUNI_ALPHA, /* U+00b4aa: */
+ RTUNI_ALPHA, /* U+00b4ab: */
+ RTUNI_ALPHA, /* U+00b4ac: */
+ RTUNI_ALPHA, /* U+00b4ad: */
+ RTUNI_ALPHA, /* U+00b4ae: */
+ RTUNI_ALPHA, /* U+00b4af: */
+ RTUNI_ALPHA, /* U+00b4b0: */
+ RTUNI_ALPHA, /* U+00b4b1: */
+ RTUNI_ALPHA, /* U+00b4b2: */
+ RTUNI_ALPHA, /* U+00b4b3: */
+ RTUNI_ALPHA, /* U+00b4b4: */
+ RTUNI_ALPHA, /* U+00b4b5: */
+ RTUNI_ALPHA, /* U+00b4b6: */
+ RTUNI_ALPHA, /* U+00b4b7: */
+ RTUNI_ALPHA, /* U+00b4b8: */
+ RTUNI_ALPHA, /* U+00b4b9: */
+ RTUNI_ALPHA, /* U+00b4ba: */
+ RTUNI_ALPHA, /* U+00b4bb: */
+ RTUNI_ALPHA, /* U+00b4bc: */
+ RTUNI_ALPHA, /* U+00b4bd: */
+ RTUNI_ALPHA, /* U+00b4be: */
+ RTUNI_ALPHA, /* U+00b4bf: */
+ RTUNI_ALPHA, /* U+00b4c0: */
+ RTUNI_ALPHA, /* U+00b4c1: */
+ RTUNI_ALPHA, /* U+00b4c2: */
+ RTUNI_ALPHA, /* U+00b4c3: */
+ RTUNI_ALPHA, /* U+00b4c4: */
+ RTUNI_ALPHA, /* U+00b4c5: */
+ RTUNI_ALPHA, /* U+00b4c6: */
+ RTUNI_ALPHA, /* U+00b4c7: */
+ RTUNI_ALPHA, /* U+00b4c8: */
+ RTUNI_ALPHA, /* U+00b4c9: */
+ RTUNI_ALPHA, /* U+00b4ca: */
+ RTUNI_ALPHA, /* U+00b4cb: */
+ RTUNI_ALPHA, /* U+00b4cc: */
+ RTUNI_ALPHA, /* U+00b4cd: */
+ RTUNI_ALPHA, /* U+00b4ce: */
+ RTUNI_ALPHA, /* U+00b4cf: */
+ RTUNI_ALPHA, /* U+00b4d0: */
+ RTUNI_ALPHA, /* U+00b4d1: */
+ RTUNI_ALPHA, /* U+00b4d2: */
+ RTUNI_ALPHA, /* U+00b4d3: */
+ RTUNI_ALPHA, /* U+00b4d4: */
+ RTUNI_ALPHA, /* U+00b4d5: */
+ RTUNI_ALPHA, /* U+00b4d6: */
+ RTUNI_ALPHA, /* U+00b4d7: */
+ RTUNI_ALPHA, /* U+00b4d8: */
+ RTUNI_ALPHA, /* U+00b4d9: */
+ RTUNI_ALPHA, /* U+00b4da: */
+ RTUNI_ALPHA, /* U+00b4db: */
+ RTUNI_ALPHA, /* U+00b4dc: */
+ RTUNI_ALPHA, /* U+00b4dd: */
+ RTUNI_ALPHA, /* U+00b4de: */
+ RTUNI_ALPHA, /* U+00b4df: */
+ RTUNI_ALPHA, /* U+00b4e0: */
+ RTUNI_ALPHA, /* U+00b4e1: */
+ RTUNI_ALPHA, /* U+00b4e2: */
+ RTUNI_ALPHA, /* U+00b4e3: */
+ RTUNI_ALPHA, /* U+00b4e4: */
+ RTUNI_ALPHA, /* U+00b4e5: */
+ RTUNI_ALPHA, /* U+00b4e6: */
+ RTUNI_ALPHA, /* U+00b4e7: */
+ RTUNI_ALPHA, /* U+00b4e8: */
+ RTUNI_ALPHA, /* U+00b4e9: */
+ RTUNI_ALPHA, /* U+00b4ea: */
+ RTUNI_ALPHA, /* U+00b4eb: */
+ RTUNI_ALPHA, /* U+00b4ec: */
+ RTUNI_ALPHA, /* U+00b4ed: */
+ RTUNI_ALPHA, /* U+00b4ee: */
+ RTUNI_ALPHA, /* U+00b4ef: */
+ RTUNI_ALPHA, /* U+00b4f0: */
+ RTUNI_ALPHA, /* U+00b4f1: */
+ RTUNI_ALPHA, /* U+00b4f2: */
+ RTUNI_ALPHA, /* U+00b4f3: */
+ RTUNI_ALPHA, /* U+00b4f4: */
+ RTUNI_ALPHA, /* U+00b4f5: */
+ RTUNI_ALPHA, /* U+00b4f6: */
+ RTUNI_ALPHA, /* U+00b4f7: */
+ RTUNI_ALPHA, /* U+00b4f8: */
+ RTUNI_ALPHA, /* U+00b4f9: */
+ RTUNI_ALPHA, /* U+00b4fa: */
+ RTUNI_ALPHA, /* U+00b4fb: */
+ RTUNI_ALPHA, /* U+00b4fc: */
+ RTUNI_ALPHA, /* U+00b4fd: */
+ RTUNI_ALPHA, /* U+00b4fe: */
+ RTUNI_ALPHA, /* U+00b4ff: */
+ RTUNI_ALPHA, /* U+00b500: */
+ RTUNI_ALPHA, /* U+00b501: */
+ RTUNI_ALPHA, /* U+00b502: */
+ RTUNI_ALPHA, /* U+00b503: */
+ RTUNI_ALPHA, /* U+00b504: */
+ RTUNI_ALPHA, /* U+00b505: */
+ RTUNI_ALPHA, /* U+00b506: */
+ RTUNI_ALPHA, /* U+00b507: */
+ RTUNI_ALPHA, /* U+00b508: */
+ RTUNI_ALPHA, /* U+00b509: */
+ RTUNI_ALPHA, /* U+00b50a: */
+ RTUNI_ALPHA, /* U+00b50b: */
+ RTUNI_ALPHA, /* U+00b50c: */
+ RTUNI_ALPHA, /* U+00b50d: */
+ RTUNI_ALPHA, /* U+00b50e: */
+ RTUNI_ALPHA, /* U+00b50f: */
+ RTUNI_ALPHA, /* U+00b510: */
+ RTUNI_ALPHA, /* U+00b511: */
+ RTUNI_ALPHA, /* U+00b512: */
+ RTUNI_ALPHA, /* U+00b513: */
+ RTUNI_ALPHA, /* U+00b514: */
+ RTUNI_ALPHA, /* U+00b515: */
+ RTUNI_ALPHA, /* U+00b516: */
+ RTUNI_ALPHA, /* U+00b517: */
+ RTUNI_ALPHA, /* U+00b518: */
+ RTUNI_ALPHA, /* U+00b519: */
+ RTUNI_ALPHA, /* U+00b51a: */
+ RTUNI_ALPHA, /* U+00b51b: */
+ RTUNI_ALPHA, /* U+00b51c: */
+ RTUNI_ALPHA, /* U+00b51d: */
+ RTUNI_ALPHA, /* U+00b51e: */
+ RTUNI_ALPHA, /* U+00b51f: */
+ RTUNI_ALPHA, /* U+00b520: */
+ RTUNI_ALPHA, /* U+00b521: */
+ RTUNI_ALPHA, /* U+00b522: */
+ RTUNI_ALPHA, /* U+00b523: */
+ RTUNI_ALPHA, /* U+00b524: */
+ RTUNI_ALPHA, /* U+00b525: */
+ RTUNI_ALPHA, /* U+00b526: */
+ RTUNI_ALPHA, /* U+00b527: */
+ RTUNI_ALPHA, /* U+00b528: */
+ RTUNI_ALPHA, /* U+00b529: */
+ RTUNI_ALPHA, /* U+00b52a: */
+ RTUNI_ALPHA, /* U+00b52b: */
+ RTUNI_ALPHA, /* U+00b52c: */
+ RTUNI_ALPHA, /* U+00b52d: */
+ RTUNI_ALPHA, /* U+00b52e: */
+ RTUNI_ALPHA, /* U+00b52f: */
+ RTUNI_ALPHA, /* U+00b530: */
+ RTUNI_ALPHA, /* U+00b531: */
+ RTUNI_ALPHA, /* U+00b532: */
+ RTUNI_ALPHA, /* U+00b533: */
+ RTUNI_ALPHA, /* U+00b534: */
+ RTUNI_ALPHA, /* U+00b535: */
+ RTUNI_ALPHA, /* U+00b536: */
+ RTUNI_ALPHA, /* U+00b537: */
+ RTUNI_ALPHA, /* U+00b538: */
+ RTUNI_ALPHA, /* U+00b539: */
+ RTUNI_ALPHA, /* U+00b53a: */
+ RTUNI_ALPHA, /* U+00b53b: */
+ RTUNI_ALPHA, /* U+00b53c: */
+ RTUNI_ALPHA, /* U+00b53d: */
+ RTUNI_ALPHA, /* U+00b53e: */
+ RTUNI_ALPHA, /* U+00b53f: */
+ RTUNI_ALPHA, /* U+00b540: */
+ RTUNI_ALPHA, /* U+00b541: */
+ RTUNI_ALPHA, /* U+00b542: */
+ RTUNI_ALPHA, /* U+00b543: */
+ RTUNI_ALPHA, /* U+00b544: */
+ RTUNI_ALPHA, /* U+00b545: */
+ RTUNI_ALPHA, /* U+00b546: */
+ RTUNI_ALPHA, /* U+00b547: */
+ RTUNI_ALPHA, /* U+00b548: */
+ RTUNI_ALPHA, /* U+00b549: */
+ RTUNI_ALPHA, /* U+00b54a: */
+ RTUNI_ALPHA, /* U+00b54b: */
+ RTUNI_ALPHA, /* U+00b54c: */
+ RTUNI_ALPHA, /* U+00b54d: */
+ RTUNI_ALPHA, /* U+00b54e: */
+ RTUNI_ALPHA, /* U+00b54f: */
+ RTUNI_ALPHA, /* U+00b550: */
+ RTUNI_ALPHA, /* U+00b551: */
+ RTUNI_ALPHA, /* U+00b552: */
+ RTUNI_ALPHA, /* U+00b553: */
+ RTUNI_ALPHA, /* U+00b554: */
+ RTUNI_ALPHA, /* U+00b555: */
+ RTUNI_ALPHA, /* U+00b556: */
+ RTUNI_ALPHA, /* U+00b557: */
+ RTUNI_ALPHA, /* U+00b558: */
+ RTUNI_ALPHA, /* U+00b559: */
+ RTUNI_ALPHA, /* U+00b55a: */
+ RTUNI_ALPHA, /* U+00b55b: */
+ RTUNI_ALPHA, /* U+00b55c: */
+ RTUNI_ALPHA, /* U+00b55d: */
+ RTUNI_ALPHA, /* U+00b55e: */
+ RTUNI_ALPHA, /* U+00b55f: */
+ RTUNI_ALPHA, /* U+00b560: */
+ RTUNI_ALPHA, /* U+00b561: */
+ RTUNI_ALPHA, /* U+00b562: */
+ RTUNI_ALPHA, /* U+00b563: */
+ RTUNI_ALPHA, /* U+00b564: */
+ RTUNI_ALPHA, /* U+00b565: */
+ RTUNI_ALPHA, /* U+00b566: */
+ RTUNI_ALPHA, /* U+00b567: */
+ RTUNI_ALPHA, /* U+00b568: */
+ RTUNI_ALPHA, /* U+00b569: */
+ RTUNI_ALPHA, /* U+00b56a: */
+ RTUNI_ALPHA, /* U+00b56b: */
+ RTUNI_ALPHA, /* U+00b56c: */
+ RTUNI_ALPHA, /* U+00b56d: */
+ RTUNI_ALPHA, /* U+00b56e: */
+ RTUNI_ALPHA, /* U+00b56f: */
+ RTUNI_ALPHA, /* U+00b570: */
+ RTUNI_ALPHA, /* U+00b571: */
+ RTUNI_ALPHA, /* U+00b572: */
+ RTUNI_ALPHA, /* U+00b573: */
+ RTUNI_ALPHA, /* U+00b574: */
+ RTUNI_ALPHA, /* U+00b575: */
+ RTUNI_ALPHA, /* U+00b576: */
+ RTUNI_ALPHA, /* U+00b577: */
+ RTUNI_ALPHA, /* U+00b578: */
+ RTUNI_ALPHA, /* U+00b579: */
+ RTUNI_ALPHA, /* U+00b57a: */
+ RTUNI_ALPHA, /* U+00b57b: */
+ RTUNI_ALPHA, /* U+00b57c: */
+ RTUNI_ALPHA, /* U+00b57d: */
+ RTUNI_ALPHA, /* U+00b57e: */
+ RTUNI_ALPHA, /* U+00b57f: */
+ RTUNI_ALPHA, /* U+00b580: */
+ RTUNI_ALPHA, /* U+00b581: */
+ RTUNI_ALPHA, /* U+00b582: */
+ RTUNI_ALPHA, /* U+00b583: */
+ RTUNI_ALPHA, /* U+00b584: */
+ RTUNI_ALPHA, /* U+00b585: */
+ RTUNI_ALPHA, /* U+00b586: */
+ RTUNI_ALPHA, /* U+00b587: */
+ RTUNI_ALPHA, /* U+00b588: */
+ RTUNI_ALPHA, /* U+00b589: */
+ RTUNI_ALPHA, /* U+00b58a: */
+ RTUNI_ALPHA, /* U+00b58b: */
+ RTUNI_ALPHA, /* U+00b58c: */
+ RTUNI_ALPHA, /* U+00b58d: */
+ RTUNI_ALPHA, /* U+00b58e: */
+ RTUNI_ALPHA, /* U+00b58f: */
+ RTUNI_ALPHA, /* U+00b590: */
+ RTUNI_ALPHA, /* U+00b591: */
+ RTUNI_ALPHA, /* U+00b592: */
+ RTUNI_ALPHA, /* U+00b593: */
+ RTUNI_ALPHA, /* U+00b594: */
+ RTUNI_ALPHA, /* U+00b595: */
+ RTUNI_ALPHA, /* U+00b596: */
+ RTUNI_ALPHA, /* U+00b597: */
+ RTUNI_ALPHA, /* U+00b598: */
+ RTUNI_ALPHA, /* U+00b599: */
+ RTUNI_ALPHA, /* U+00b59a: */
+ RTUNI_ALPHA, /* U+00b59b: */
+ RTUNI_ALPHA, /* U+00b59c: */
+ RTUNI_ALPHA, /* U+00b59d: */
+ RTUNI_ALPHA, /* U+00b59e: */
+ RTUNI_ALPHA, /* U+00b59f: */
+ RTUNI_ALPHA, /* U+00b5a0: */
+ RTUNI_ALPHA, /* U+00b5a1: */
+ RTUNI_ALPHA, /* U+00b5a2: */
+ RTUNI_ALPHA, /* U+00b5a3: */
+ RTUNI_ALPHA, /* U+00b5a4: */
+ RTUNI_ALPHA, /* U+00b5a5: */
+ RTUNI_ALPHA, /* U+00b5a6: */
+ RTUNI_ALPHA, /* U+00b5a7: */
+ RTUNI_ALPHA, /* U+00b5a8: */
+ RTUNI_ALPHA, /* U+00b5a9: */
+ RTUNI_ALPHA, /* U+00b5aa: */
+ RTUNI_ALPHA, /* U+00b5ab: */
+ RTUNI_ALPHA, /* U+00b5ac: */
+ RTUNI_ALPHA, /* U+00b5ad: */
+ RTUNI_ALPHA, /* U+00b5ae: */
+ RTUNI_ALPHA, /* U+00b5af: */
+ RTUNI_ALPHA, /* U+00b5b0: */
+ RTUNI_ALPHA, /* U+00b5b1: */
+ RTUNI_ALPHA, /* U+00b5b2: */
+ RTUNI_ALPHA, /* U+00b5b3: */
+ RTUNI_ALPHA, /* U+00b5b4: */
+ RTUNI_ALPHA, /* U+00b5b5: */
+ RTUNI_ALPHA, /* U+00b5b6: */
+ RTUNI_ALPHA, /* U+00b5b7: */
+ RTUNI_ALPHA, /* U+00b5b8: */
+ RTUNI_ALPHA, /* U+00b5b9: */
+ RTUNI_ALPHA, /* U+00b5ba: */
+ RTUNI_ALPHA, /* U+00b5bb: */
+ RTUNI_ALPHA, /* U+00b5bc: */
+ RTUNI_ALPHA, /* U+00b5bd: */
+ RTUNI_ALPHA, /* U+00b5be: */
+ RTUNI_ALPHA, /* U+00b5bf: */
+ RTUNI_ALPHA, /* U+00b5c0: */
+ RTUNI_ALPHA, /* U+00b5c1: */
+ RTUNI_ALPHA, /* U+00b5c2: */
+ RTUNI_ALPHA, /* U+00b5c3: */
+ RTUNI_ALPHA, /* U+00b5c4: */
+ RTUNI_ALPHA, /* U+00b5c5: */
+ RTUNI_ALPHA, /* U+00b5c6: */
+ RTUNI_ALPHA, /* U+00b5c7: */
+ RTUNI_ALPHA, /* U+00b5c8: */
+ RTUNI_ALPHA, /* U+00b5c9: */
+ RTUNI_ALPHA, /* U+00b5ca: */
+ RTUNI_ALPHA, /* U+00b5cb: */
+ RTUNI_ALPHA, /* U+00b5cc: */
+ RTUNI_ALPHA, /* U+00b5cd: */
+ RTUNI_ALPHA, /* U+00b5ce: */
+ RTUNI_ALPHA, /* U+00b5cf: */
+ RTUNI_ALPHA, /* U+00b5d0: */
+ RTUNI_ALPHA, /* U+00b5d1: */
+ RTUNI_ALPHA, /* U+00b5d2: */
+ RTUNI_ALPHA, /* U+00b5d3: */
+ RTUNI_ALPHA, /* U+00b5d4: */
+ RTUNI_ALPHA, /* U+00b5d5: */
+ RTUNI_ALPHA, /* U+00b5d6: */
+ RTUNI_ALPHA, /* U+00b5d7: */
+ RTUNI_ALPHA, /* U+00b5d8: */
+ RTUNI_ALPHA, /* U+00b5d9: */
+ RTUNI_ALPHA, /* U+00b5da: */
+ RTUNI_ALPHA, /* U+00b5db: */
+ RTUNI_ALPHA, /* U+00b5dc: */
+ RTUNI_ALPHA, /* U+00b5dd: */
+ RTUNI_ALPHA, /* U+00b5de: */
+ RTUNI_ALPHA, /* U+00b5df: */
+ RTUNI_ALPHA, /* U+00b5e0: */
+ RTUNI_ALPHA, /* U+00b5e1: */
+ RTUNI_ALPHA, /* U+00b5e2: */
+ RTUNI_ALPHA, /* U+00b5e3: */
+ RTUNI_ALPHA, /* U+00b5e4: */
+ RTUNI_ALPHA, /* U+00b5e5: */
+ RTUNI_ALPHA, /* U+00b5e6: */
+ RTUNI_ALPHA, /* U+00b5e7: */
+ RTUNI_ALPHA, /* U+00b5e8: */
+ RTUNI_ALPHA, /* U+00b5e9: */
+ RTUNI_ALPHA, /* U+00b5ea: */
+ RTUNI_ALPHA, /* U+00b5eb: */
+ RTUNI_ALPHA, /* U+00b5ec: */
+ RTUNI_ALPHA, /* U+00b5ed: */
+ RTUNI_ALPHA, /* U+00b5ee: */
+ RTUNI_ALPHA, /* U+00b5ef: */
+ RTUNI_ALPHA, /* U+00b5f0: */
+ RTUNI_ALPHA, /* U+00b5f1: */
+ RTUNI_ALPHA, /* U+00b5f2: */
+ RTUNI_ALPHA, /* U+00b5f3: */
+ RTUNI_ALPHA, /* U+00b5f4: */
+ RTUNI_ALPHA, /* U+00b5f5: */
+ RTUNI_ALPHA, /* U+00b5f6: */
+ RTUNI_ALPHA, /* U+00b5f7: */
+ RTUNI_ALPHA, /* U+00b5f8: */
+ RTUNI_ALPHA, /* U+00b5f9: */
+ RTUNI_ALPHA, /* U+00b5fa: */
+ RTUNI_ALPHA, /* U+00b5fb: */
+ RTUNI_ALPHA, /* U+00b5fc: */
+ RTUNI_ALPHA, /* U+00b5fd: */
+ RTUNI_ALPHA, /* U+00b5fe: */
+ RTUNI_ALPHA, /* U+00b5ff: */
+ RTUNI_ALPHA, /* U+00b600: */
+ RTUNI_ALPHA, /* U+00b601: */
+ RTUNI_ALPHA, /* U+00b602: */
+ RTUNI_ALPHA, /* U+00b603: */
+ RTUNI_ALPHA, /* U+00b604: */
+ RTUNI_ALPHA, /* U+00b605: */
+ RTUNI_ALPHA, /* U+00b606: */
+ RTUNI_ALPHA, /* U+00b607: */
+ RTUNI_ALPHA, /* U+00b608: */
+ RTUNI_ALPHA, /* U+00b609: */
+ RTUNI_ALPHA, /* U+00b60a: */
+ RTUNI_ALPHA, /* U+00b60b: */
+ RTUNI_ALPHA, /* U+00b60c: */
+ RTUNI_ALPHA, /* U+00b60d: */
+ RTUNI_ALPHA, /* U+00b60e: */
+ RTUNI_ALPHA, /* U+00b60f: */
+ RTUNI_ALPHA, /* U+00b610: */
+ RTUNI_ALPHA, /* U+00b611: */
+ RTUNI_ALPHA, /* U+00b612: */
+ RTUNI_ALPHA, /* U+00b613: */
+ RTUNI_ALPHA, /* U+00b614: */
+ RTUNI_ALPHA, /* U+00b615: */
+ RTUNI_ALPHA, /* U+00b616: */
+ RTUNI_ALPHA, /* U+00b617: */
+ RTUNI_ALPHA, /* U+00b618: */
+ RTUNI_ALPHA, /* U+00b619: */
+ RTUNI_ALPHA, /* U+00b61a: */
+ RTUNI_ALPHA, /* U+00b61b: */
+ RTUNI_ALPHA, /* U+00b61c: */
+ RTUNI_ALPHA, /* U+00b61d: */
+ RTUNI_ALPHA, /* U+00b61e: */
+ RTUNI_ALPHA, /* U+00b61f: */
+ RTUNI_ALPHA, /* U+00b620: */
+ RTUNI_ALPHA, /* U+00b621: */
+ RTUNI_ALPHA, /* U+00b622: */
+ RTUNI_ALPHA, /* U+00b623: */
+ RTUNI_ALPHA, /* U+00b624: */
+ RTUNI_ALPHA, /* U+00b625: */
+ RTUNI_ALPHA, /* U+00b626: */
+ RTUNI_ALPHA, /* U+00b627: */
+ RTUNI_ALPHA, /* U+00b628: */
+ RTUNI_ALPHA, /* U+00b629: */
+ RTUNI_ALPHA, /* U+00b62a: */
+ RTUNI_ALPHA, /* U+00b62b: */
+ RTUNI_ALPHA, /* U+00b62c: */
+ RTUNI_ALPHA, /* U+00b62d: */
+ RTUNI_ALPHA, /* U+00b62e: */
+ RTUNI_ALPHA, /* U+00b62f: */
+ RTUNI_ALPHA, /* U+00b630: */
+ RTUNI_ALPHA, /* U+00b631: */
+ RTUNI_ALPHA, /* U+00b632: */
+ RTUNI_ALPHA, /* U+00b633: */
+ RTUNI_ALPHA, /* U+00b634: */
+ RTUNI_ALPHA, /* U+00b635: */
+ RTUNI_ALPHA, /* U+00b636: */
+ RTUNI_ALPHA, /* U+00b637: */
+ RTUNI_ALPHA, /* U+00b638: */
+ RTUNI_ALPHA, /* U+00b639: */
+ RTUNI_ALPHA, /* U+00b63a: */
+ RTUNI_ALPHA, /* U+00b63b: */
+ RTUNI_ALPHA, /* U+00b63c: */
+ RTUNI_ALPHA, /* U+00b63d: */
+ RTUNI_ALPHA, /* U+00b63e: */
+ RTUNI_ALPHA, /* U+00b63f: */
+ RTUNI_ALPHA, /* U+00b640: */
+ RTUNI_ALPHA, /* U+00b641: */
+ RTUNI_ALPHA, /* U+00b642: */
+ RTUNI_ALPHA, /* U+00b643: */
+ RTUNI_ALPHA, /* U+00b644: */
+ RTUNI_ALPHA, /* U+00b645: */
+ RTUNI_ALPHA, /* U+00b646: */
+ RTUNI_ALPHA, /* U+00b647: */
+ RTUNI_ALPHA, /* U+00b648: */
+ RTUNI_ALPHA, /* U+00b649: */
+ RTUNI_ALPHA, /* U+00b64a: */
+ RTUNI_ALPHA, /* U+00b64b: */
+ RTUNI_ALPHA, /* U+00b64c: */
+ RTUNI_ALPHA, /* U+00b64d: */
+ RTUNI_ALPHA, /* U+00b64e: */
+ RTUNI_ALPHA, /* U+00b64f: */
+ RTUNI_ALPHA, /* U+00b650: */
+ RTUNI_ALPHA, /* U+00b651: */
+ RTUNI_ALPHA, /* U+00b652: */
+ RTUNI_ALPHA, /* U+00b653: */
+ RTUNI_ALPHA, /* U+00b654: */
+ RTUNI_ALPHA, /* U+00b655: */
+ RTUNI_ALPHA, /* U+00b656: */
+ RTUNI_ALPHA, /* U+00b657: */
+ RTUNI_ALPHA, /* U+00b658: */
+ RTUNI_ALPHA, /* U+00b659: */
+ RTUNI_ALPHA, /* U+00b65a: */
+ RTUNI_ALPHA, /* U+00b65b: */
+ RTUNI_ALPHA, /* U+00b65c: */
+ RTUNI_ALPHA, /* U+00b65d: */
+ RTUNI_ALPHA, /* U+00b65e: */
+ RTUNI_ALPHA, /* U+00b65f: */
+ RTUNI_ALPHA, /* U+00b660: */
+ RTUNI_ALPHA, /* U+00b661: */
+ RTUNI_ALPHA, /* U+00b662: */
+ RTUNI_ALPHA, /* U+00b663: */
+ RTUNI_ALPHA, /* U+00b664: */
+ RTUNI_ALPHA, /* U+00b665: */
+ RTUNI_ALPHA, /* U+00b666: */
+ RTUNI_ALPHA, /* U+00b667: */
+ RTUNI_ALPHA, /* U+00b668: */
+ RTUNI_ALPHA, /* U+00b669: */
+ RTUNI_ALPHA, /* U+00b66a: */
+ RTUNI_ALPHA, /* U+00b66b: */
+ RTUNI_ALPHA, /* U+00b66c: */
+ RTUNI_ALPHA, /* U+00b66d: */
+ RTUNI_ALPHA, /* U+00b66e: */
+ RTUNI_ALPHA, /* U+00b66f: */
+ RTUNI_ALPHA, /* U+00b670: */
+ RTUNI_ALPHA, /* U+00b671: */
+ RTUNI_ALPHA, /* U+00b672: */
+ RTUNI_ALPHA, /* U+00b673: */
+ RTUNI_ALPHA, /* U+00b674: */
+ RTUNI_ALPHA, /* U+00b675: */
+ RTUNI_ALPHA, /* U+00b676: */
+ RTUNI_ALPHA, /* U+00b677: */
+ RTUNI_ALPHA, /* U+00b678: */
+ RTUNI_ALPHA, /* U+00b679: */
+ RTUNI_ALPHA, /* U+00b67a: */
+ RTUNI_ALPHA, /* U+00b67b: */
+ RTUNI_ALPHA, /* U+00b67c: */
+ RTUNI_ALPHA, /* U+00b67d: */
+ RTUNI_ALPHA, /* U+00b67e: */
+ RTUNI_ALPHA, /* U+00b67f: */
+ RTUNI_ALPHA, /* U+00b680: */
+ RTUNI_ALPHA, /* U+00b681: */
+ RTUNI_ALPHA, /* U+00b682: */
+ RTUNI_ALPHA, /* U+00b683: */
+ RTUNI_ALPHA, /* U+00b684: */
+ RTUNI_ALPHA, /* U+00b685: */
+ RTUNI_ALPHA, /* U+00b686: */
+ RTUNI_ALPHA, /* U+00b687: */
+ RTUNI_ALPHA, /* U+00b688: */
+ RTUNI_ALPHA, /* U+00b689: */
+ RTUNI_ALPHA, /* U+00b68a: */
+ RTUNI_ALPHA, /* U+00b68b: */
+ RTUNI_ALPHA, /* U+00b68c: */
+ RTUNI_ALPHA, /* U+00b68d: */
+ RTUNI_ALPHA, /* U+00b68e: */
+ RTUNI_ALPHA, /* U+00b68f: */
+ RTUNI_ALPHA, /* U+00b690: */
+ RTUNI_ALPHA, /* U+00b691: */
+ RTUNI_ALPHA, /* U+00b692: */
+ RTUNI_ALPHA, /* U+00b693: */
+ RTUNI_ALPHA, /* U+00b694: */
+ RTUNI_ALPHA, /* U+00b695: */
+ RTUNI_ALPHA, /* U+00b696: */
+ RTUNI_ALPHA, /* U+00b697: */
+ RTUNI_ALPHA, /* U+00b698: */
+ RTUNI_ALPHA, /* U+00b699: */
+ RTUNI_ALPHA, /* U+00b69a: */
+ RTUNI_ALPHA, /* U+00b69b: */
+ RTUNI_ALPHA, /* U+00b69c: */
+ RTUNI_ALPHA, /* U+00b69d: */
+ RTUNI_ALPHA, /* U+00b69e: */
+ RTUNI_ALPHA, /* U+00b69f: */
+ RTUNI_ALPHA, /* U+00b6a0: */
+ RTUNI_ALPHA, /* U+00b6a1: */
+ RTUNI_ALPHA, /* U+00b6a2: */
+ RTUNI_ALPHA, /* U+00b6a3: */
+ RTUNI_ALPHA, /* U+00b6a4: */
+ RTUNI_ALPHA, /* U+00b6a5: */
+ RTUNI_ALPHA, /* U+00b6a6: */
+ RTUNI_ALPHA, /* U+00b6a7: */
+ RTUNI_ALPHA, /* U+00b6a8: */
+ RTUNI_ALPHA, /* U+00b6a9: */
+ RTUNI_ALPHA, /* U+00b6aa: */
+ RTUNI_ALPHA, /* U+00b6ab: */
+ RTUNI_ALPHA, /* U+00b6ac: */
+ RTUNI_ALPHA, /* U+00b6ad: */
+ RTUNI_ALPHA, /* U+00b6ae: */
+ RTUNI_ALPHA, /* U+00b6af: */
+ RTUNI_ALPHA, /* U+00b6b0: */
+ RTUNI_ALPHA, /* U+00b6b1: */
+ RTUNI_ALPHA, /* U+00b6b2: */
+ RTUNI_ALPHA, /* U+00b6b3: */
+ RTUNI_ALPHA, /* U+00b6b4: */
+ RTUNI_ALPHA, /* U+00b6b5: */
+ RTUNI_ALPHA, /* U+00b6b6: */
+ RTUNI_ALPHA, /* U+00b6b7: */
+ RTUNI_ALPHA, /* U+00b6b8: */
+ RTUNI_ALPHA, /* U+00b6b9: */
+ RTUNI_ALPHA, /* U+00b6ba: */
+ RTUNI_ALPHA, /* U+00b6bb: */
+ RTUNI_ALPHA, /* U+00b6bc: */
+ RTUNI_ALPHA, /* U+00b6bd: */
+ RTUNI_ALPHA, /* U+00b6be: */
+ RTUNI_ALPHA, /* U+00b6bf: */
+ RTUNI_ALPHA, /* U+00b6c0: */
+ RTUNI_ALPHA, /* U+00b6c1: */
+ RTUNI_ALPHA, /* U+00b6c2: */
+ RTUNI_ALPHA, /* U+00b6c3: */
+ RTUNI_ALPHA, /* U+00b6c4: */
+ RTUNI_ALPHA, /* U+00b6c5: */
+ RTUNI_ALPHA, /* U+00b6c6: */
+ RTUNI_ALPHA, /* U+00b6c7: */
+ RTUNI_ALPHA, /* U+00b6c8: */
+ RTUNI_ALPHA, /* U+00b6c9: */
+ RTUNI_ALPHA, /* U+00b6ca: */
+ RTUNI_ALPHA, /* U+00b6cb: */
+ RTUNI_ALPHA, /* U+00b6cc: */
+ RTUNI_ALPHA, /* U+00b6cd: */
+ RTUNI_ALPHA, /* U+00b6ce: */
+ RTUNI_ALPHA, /* U+00b6cf: */
+ RTUNI_ALPHA, /* U+00b6d0: */
+ RTUNI_ALPHA, /* U+00b6d1: */
+ RTUNI_ALPHA, /* U+00b6d2: */
+ RTUNI_ALPHA, /* U+00b6d3: */
+ RTUNI_ALPHA, /* U+00b6d4: */
+ RTUNI_ALPHA, /* U+00b6d5: */
+ RTUNI_ALPHA, /* U+00b6d6: */
+ RTUNI_ALPHA, /* U+00b6d7: */
+ RTUNI_ALPHA, /* U+00b6d8: */
+ RTUNI_ALPHA, /* U+00b6d9: */
+ RTUNI_ALPHA, /* U+00b6da: */
+ RTUNI_ALPHA, /* U+00b6db: */
+ RTUNI_ALPHA, /* U+00b6dc: */
+ RTUNI_ALPHA, /* U+00b6dd: */
+ RTUNI_ALPHA, /* U+00b6de: */
+ RTUNI_ALPHA, /* U+00b6df: */
+ RTUNI_ALPHA, /* U+00b6e0: */
+ RTUNI_ALPHA, /* U+00b6e1: */
+ RTUNI_ALPHA, /* U+00b6e2: */
+ RTUNI_ALPHA, /* U+00b6e3: */
+ RTUNI_ALPHA, /* U+00b6e4: */
+ RTUNI_ALPHA, /* U+00b6e5: */
+ RTUNI_ALPHA, /* U+00b6e6: */
+ RTUNI_ALPHA, /* U+00b6e7: */
+ RTUNI_ALPHA, /* U+00b6e8: */
+ RTUNI_ALPHA, /* U+00b6e9: */
+ RTUNI_ALPHA, /* U+00b6ea: */
+ RTUNI_ALPHA, /* U+00b6eb: */
+ RTUNI_ALPHA, /* U+00b6ec: */
+ RTUNI_ALPHA, /* U+00b6ed: */
+ RTUNI_ALPHA, /* U+00b6ee: */
+ RTUNI_ALPHA, /* U+00b6ef: */
+ RTUNI_ALPHA, /* U+00b6f0: */
+ RTUNI_ALPHA, /* U+00b6f1: */
+ RTUNI_ALPHA, /* U+00b6f2: */
+ RTUNI_ALPHA, /* U+00b6f3: */
+ RTUNI_ALPHA, /* U+00b6f4: */
+ RTUNI_ALPHA, /* U+00b6f5: */
+ RTUNI_ALPHA, /* U+00b6f6: */
+ RTUNI_ALPHA, /* U+00b6f7: */
+ RTUNI_ALPHA, /* U+00b6f8: */
+ RTUNI_ALPHA, /* U+00b6f9: */
+ RTUNI_ALPHA, /* U+00b6fa: */
+ RTUNI_ALPHA, /* U+00b6fb: */
+ RTUNI_ALPHA, /* U+00b6fc: */
+ RTUNI_ALPHA, /* U+00b6fd: */
+ RTUNI_ALPHA, /* U+00b6fe: */
+ RTUNI_ALPHA, /* U+00b6ff: */
+ RTUNI_ALPHA, /* U+00b700: */
+ RTUNI_ALPHA, /* U+00b701: */
+ RTUNI_ALPHA, /* U+00b702: */
+ RTUNI_ALPHA, /* U+00b703: */
+ RTUNI_ALPHA, /* U+00b704: */
+ RTUNI_ALPHA, /* U+00b705: */
+ RTUNI_ALPHA, /* U+00b706: */
+ RTUNI_ALPHA, /* U+00b707: */
+ RTUNI_ALPHA, /* U+00b708: */
+ RTUNI_ALPHA, /* U+00b709: */
+ RTUNI_ALPHA, /* U+00b70a: */
+ RTUNI_ALPHA, /* U+00b70b: */
+ RTUNI_ALPHA, /* U+00b70c: */
+ RTUNI_ALPHA, /* U+00b70d: */
+ RTUNI_ALPHA, /* U+00b70e: */
+ RTUNI_ALPHA, /* U+00b70f: */
+ RTUNI_ALPHA, /* U+00b710: */
+ RTUNI_ALPHA, /* U+00b711: */
+ RTUNI_ALPHA, /* U+00b712: */
+ RTUNI_ALPHA, /* U+00b713: */
+ RTUNI_ALPHA, /* U+00b714: */
+ RTUNI_ALPHA, /* U+00b715: */
+ RTUNI_ALPHA, /* U+00b716: */
+ RTUNI_ALPHA, /* U+00b717: */
+ RTUNI_ALPHA, /* U+00b718: */
+ RTUNI_ALPHA, /* U+00b719: */
+ RTUNI_ALPHA, /* U+00b71a: */
+ RTUNI_ALPHA, /* U+00b71b: */
+ RTUNI_ALPHA, /* U+00b71c: */
+ RTUNI_ALPHA, /* U+00b71d: */
+ RTUNI_ALPHA, /* U+00b71e: */
+ RTUNI_ALPHA, /* U+00b71f: */
+ RTUNI_ALPHA, /* U+00b720: */
+ RTUNI_ALPHA, /* U+00b721: */
+ RTUNI_ALPHA, /* U+00b722: */
+ RTUNI_ALPHA, /* U+00b723: */
+ RTUNI_ALPHA, /* U+00b724: */
+ RTUNI_ALPHA, /* U+00b725: */
+ RTUNI_ALPHA, /* U+00b726: */
+ RTUNI_ALPHA, /* U+00b727: */
+ RTUNI_ALPHA, /* U+00b728: */
+ RTUNI_ALPHA, /* U+00b729: */
+ RTUNI_ALPHA, /* U+00b72a: */
+ RTUNI_ALPHA, /* U+00b72b: */
+ RTUNI_ALPHA, /* U+00b72c: */
+ RTUNI_ALPHA, /* U+00b72d: */
+ RTUNI_ALPHA, /* U+00b72e: */
+ RTUNI_ALPHA, /* U+00b72f: */
+ RTUNI_ALPHA, /* U+00b730: */
+ RTUNI_ALPHA, /* U+00b731: */
+ RTUNI_ALPHA, /* U+00b732: */
+ RTUNI_ALPHA, /* U+00b733: */
+ RTUNI_ALPHA, /* U+00b734: */
+ RTUNI_ALPHA, /* U+00b735: */
+ RTUNI_ALPHA, /* U+00b736: */
+ RTUNI_ALPHA, /* U+00b737: */
+ RTUNI_ALPHA, /* U+00b738: */
+ RTUNI_ALPHA, /* U+00b739: */
+ RTUNI_ALPHA, /* U+00b73a: */
+ RTUNI_ALPHA, /* U+00b73b: */
+ RTUNI_ALPHA, /* U+00b73c: */
+ RTUNI_ALPHA, /* U+00b73d: */
+ RTUNI_ALPHA, /* U+00b73e: */
+ RTUNI_ALPHA, /* U+00b73f: */
+ RTUNI_ALPHA, /* U+00b740: */
+ RTUNI_ALPHA, /* U+00b741: */
+ RTUNI_ALPHA, /* U+00b742: */
+ RTUNI_ALPHA, /* U+00b743: */
+ RTUNI_ALPHA, /* U+00b744: */
+ RTUNI_ALPHA, /* U+00b745: */
+ RTUNI_ALPHA, /* U+00b746: */
+ RTUNI_ALPHA, /* U+00b747: */
+ RTUNI_ALPHA, /* U+00b748: */
+ RTUNI_ALPHA, /* U+00b749: */
+ RTUNI_ALPHA, /* U+00b74a: */
+ RTUNI_ALPHA, /* U+00b74b: */
+ RTUNI_ALPHA, /* U+00b74c: */
+ RTUNI_ALPHA, /* U+00b74d: */
+ RTUNI_ALPHA, /* U+00b74e: */
+ RTUNI_ALPHA, /* U+00b74f: */
+ RTUNI_ALPHA, /* U+00b750: */
+ RTUNI_ALPHA, /* U+00b751: */
+ RTUNI_ALPHA, /* U+00b752: */
+ RTUNI_ALPHA, /* U+00b753: */
+ RTUNI_ALPHA, /* U+00b754: */
+ RTUNI_ALPHA, /* U+00b755: */
+ RTUNI_ALPHA, /* U+00b756: */
+ RTUNI_ALPHA, /* U+00b757: */
+ RTUNI_ALPHA, /* U+00b758: */
+ RTUNI_ALPHA, /* U+00b759: */
+ RTUNI_ALPHA, /* U+00b75a: */
+ RTUNI_ALPHA, /* U+00b75b: */
+ RTUNI_ALPHA, /* U+00b75c: */
+ RTUNI_ALPHA, /* U+00b75d: */
+ RTUNI_ALPHA, /* U+00b75e: */
+ RTUNI_ALPHA, /* U+00b75f: */
+ RTUNI_ALPHA, /* U+00b760: */
+ RTUNI_ALPHA, /* U+00b761: */
+ RTUNI_ALPHA, /* U+00b762: */
+ RTUNI_ALPHA, /* U+00b763: */
+ RTUNI_ALPHA, /* U+00b764: */
+ RTUNI_ALPHA, /* U+00b765: */
+ RTUNI_ALPHA, /* U+00b766: */
+ RTUNI_ALPHA, /* U+00b767: */
+ RTUNI_ALPHA, /* U+00b768: */
+ RTUNI_ALPHA, /* U+00b769: */
+ RTUNI_ALPHA, /* U+00b76a: */
+ RTUNI_ALPHA, /* U+00b76b: */
+ RTUNI_ALPHA, /* U+00b76c: */
+ RTUNI_ALPHA, /* U+00b76d: */
+ RTUNI_ALPHA, /* U+00b76e: */
+ RTUNI_ALPHA, /* U+00b76f: */
+ RTUNI_ALPHA, /* U+00b770: */
+ RTUNI_ALPHA, /* U+00b771: */
+ RTUNI_ALPHA, /* U+00b772: */
+ RTUNI_ALPHA, /* U+00b773: */
+ RTUNI_ALPHA, /* U+00b774: */
+ RTUNI_ALPHA, /* U+00b775: */
+ RTUNI_ALPHA, /* U+00b776: */
+ RTUNI_ALPHA, /* U+00b777: */
+ RTUNI_ALPHA, /* U+00b778: */
+ RTUNI_ALPHA, /* U+00b779: */
+ RTUNI_ALPHA, /* U+00b77a: */
+ RTUNI_ALPHA, /* U+00b77b: */
+ RTUNI_ALPHA, /* U+00b77c: */
+ RTUNI_ALPHA, /* U+00b77d: */
+ RTUNI_ALPHA, /* U+00b77e: */
+ RTUNI_ALPHA, /* U+00b77f: */
+ RTUNI_ALPHA, /* U+00b780: */
+ RTUNI_ALPHA, /* U+00b781: */
+ RTUNI_ALPHA, /* U+00b782: */
+ RTUNI_ALPHA, /* U+00b783: */
+ RTUNI_ALPHA, /* U+00b784: */
+ RTUNI_ALPHA, /* U+00b785: */
+ RTUNI_ALPHA, /* U+00b786: */
+ RTUNI_ALPHA, /* U+00b787: */
+ RTUNI_ALPHA, /* U+00b788: */
+ RTUNI_ALPHA, /* U+00b789: */
+ RTUNI_ALPHA, /* U+00b78a: */
+ RTUNI_ALPHA, /* U+00b78b: */
+ RTUNI_ALPHA, /* U+00b78c: */
+ RTUNI_ALPHA, /* U+00b78d: */
+ RTUNI_ALPHA, /* U+00b78e: */
+ RTUNI_ALPHA, /* U+00b78f: */
+ RTUNI_ALPHA, /* U+00b790: */
+ RTUNI_ALPHA, /* U+00b791: */
+ RTUNI_ALPHA, /* U+00b792: */
+ RTUNI_ALPHA, /* U+00b793: */
+ RTUNI_ALPHA, /* U+00b794: */
+ RTUNI_ALPHA, /* U+00b795: */
+ RTUNI_ALPHA, /* U+00b796: */
+ RTUNI_ALPHA, /* U+00b797: */
+ RTUNI_ALPHA, /* U+00b798: */
+ RTUNI_ALPHA, /* U+00b799: */
+ RTUNI_ALPHA, /* U+00b79a: */
+ RTUNI_ALPHA, /* U+00b79b: */
+ RTUNI_ALPHA, /* U+00b79c: */
+ RTUNI_ALPHA, /* U+00b79d: */
+ RTUNI_ALPHA, /* U+00b79e: */
+ RTUNI_ALPHA, /* U+00b79f: */
+ RTUNI_ALPHA, /* U+00b7a0: */
+ RTUNI_ALPHA, /* U+00b7a1: */
+ RTUNI_ALPHA, /* U+00b7a2: */
+ RTUNI_ALPHA, /* U+00b7a3: */
+ RTUNI_ALPHA, /* U+00b7a4: */
+ RTUNI_ALPHA, /* U+00b7a5: */
+ RTUNI_ALPHA, /* U+00b7a6: */
+ RTUNI_ALPHA, /* U+00b7a7: */
+ RTUNI_ALPHA, /* U+00b7a8: */
+ RTUNI_ALPHA, /* U+00b7a9: */
+ RTUNI_ALPHA, /* U+00b7aa: */
+ RTUNI_ALPHA, /* U+00b7ab: */
+ RTUNI_ALPHA, /* U+00b7ac: */
+ RTUNI_ALPHA, /* U+00b7ad: */
+ RTUNI_ALPHA, /* U+00b7ae: */
+ RTUNI_ALPHA, /* U+00b7af: */
+ RTUNI_ALPHA, /* U+00b7b0: */
+ RTUNI_ALPHA, /* U+00b7b1: */
+ RTUNI_ALPHA, /* U+00b7b2: */
+ RTUNI_ALPHA, /* U+00b7b3: */
+ RTUNI_ALPHA, /* U+00b7b4: */
+ RTUNI_ALPHA, /* U+00b7b5: */
+ RTUNI_ALPHA, /* U+00b7b6: */
+ RTUNI_ALPHA, /* U+00b7b7: */
+ RTUNI_ALPHA, /* U+00b7b8: */
+ RTUNI_ALPHA, /* U+00b7b9: */
+ RTUNI_ALPHA, /* U+00b7ba: */
+ RTUNI_ALPHA, /* U+00b7bb: */
+ RTUNI_ALPHA, /* U+00b7bc: */
+ RTUNI_ALPHA, /* U+00b7bd: */
+ RTUNI_ALPHA, /* U+00b7be: */
+ RTUNI_ALPHA, /* U+00b7bf: */
+ RTUNI_ALPHA, /* U+00b7c0: */
+ RTUNI_ALPHA, /* U+00b7c1: */
+ RTUNI_ALPHA, /* U+00b7c2: */
+ RTUNI_ALPHA, /* U+00b7c3: */
+ RTUNI_ALPHA, /* U+00b7c4: */
+ RTUNI_ALPHA, /* U+00b7c5: */
+ RTUNI_ALPHA, /* U+00b7c6: */
+ RTUNI_ALPHA, /* U+00b7c7: */
+ RTUNI_ALPHA, /* U+00b7c8: */
+ RTUNI_ALPHA, /* U+00b7c9: */
+ RTUNI_ALPHA, /* U+00b7ca: */
+ RTUNI_ALPHA, /* U+00b7cb: */
+ RTUNI_ALPHA, /* U+00b7cc: */
+ RTUNI_ALPHA, /* U+00b7cd: */
+ RTUNI_ALPHA, /* U+00b7ce: */
+ RTUNI_ALPHA, /* U+00b7cf: */
+ RTUNI_ALPHA, /* U+00b7d0: */
+ RTUNI_ALPHA, /* U+00b7d1: */
+ RTUNI_ALPHA, /* U+00b7d2: */
+ RTUNI_ALPHA, /* U+00b7d3: */
+ RTUNI_ALPHA, /* U+00b7d4: */
+ RTUNI_ALPHA, /* U+00b7d5: */
+ RTUNI_ALPHA, /* U+00b7d6: */
+ RTUNI_ALPHA, /* U+00b7d7: */
+ RTUNI_ALPHA, /* U+00b7d8: */
+ RTUNI_ALPHA, /* U+00b7d9: */
+ RTUNI_ALPHA, /* U+00b7da: */
+ RTUNI_ALPHA, /* U+00b7db: */
+ RTUNI_ALPHA, /* U+00b7dc: */
+ RTUNI_ALPHA, /* U+00b7dd: */
+ RTUNI_ALPHA, /* U+00b7de: */
+ RTUNI_ALPHA, /* U+00b7df: */
+ RTUNI_ALPHA, /* U+00b7e0: */
+ RTUNI_ALPHA, /* U+00b7e1: */
+ RTUNI_ALPHA, /* U+00b7e2: */
+ RTUNI_ALPHA, /* U+00b7e3: */
+ RTUNI_ALPHA, /* U+00b7e4: */
+ RTUNI_ALPHA, /* U+00b7e5: */
+ RTUNI_ALPHA, /* U+00b7e6: */
+ RTUNI_ALPHA, /* U+00b7e7: */
+ RTUNI_ALPHA, /* U+00b7e8: */
+ RTUNI_ALPHA, /* U+00b7e9: */
+ RTUNI_ALPHA, /* U+00b7ea: */
+ RTUNI_ALPHA, /* U+00b7eb: */
+ RTUNI_ALPHA, /* U+00b7ec: */
+ RTUNI_ALPHA, /* U+00b7ed: */
+ RTUNI_ALPHA, /* U+00b7ee: */
+ RTUNI_ALPHA, /* U+00b7ef: */
+ RTUNI_ALPHA, /* U+00b7f0: */
+ RTUNI_ALPHA, /* U+00b7f1: */
+ RTUNI_ALPHA, /* U+00b7f2: */
+ RTUNI_ALPHA, /* U+00b7f3: */
+ RTUNI_ALPHA, /* U+00b7f4: */
+ RTUNI_ALPHA, /* U+00b7f5: */
+ RTUNI_ALPHA, /* U+00b7f6: */
+ RTUNI_ALPHA, /* U+00b7f7: */
+ RTUNI_ALPHA, /* U+00b7f8: */
+ RTUNI_ALPHA, /* U+00b7f9: */
+ RTUNI_ALPHA, /* U+00b7fa: */
+ RTUNI_ALPHA, /* U+00b7fb: */
+ RTUNI_ALPHA, /* U+00b7fc: */
+ RTUNI_ALPHA, /* U+00b7fd: */
+ RTUNI_ALPHA, /* U+00b7fe: */
+ RTUNI_ALPHA, /* U+00b7ff: */
+ RTUNI_ALPHA, /* U+00b800: */
+ RTUNI_ALPHA, /* U+00b801: */
+ RTUNI_ALPHA, /* U+00b802: */
+ RTUNI_ALPHA, /* U+00b803: */
+ RTUNI_ALPHA, /* U+00b804: */
+ RTUNI_ALPHA, /* U+00b805: */
+ RTUNI_ALPHA, /* U+00b806: */
+ RTUNI_ALPHA, /* U+00b807: */
+ RTUNI_ALPHA, /* U+00b808: */
+ RTUNI_ALPHA, /* U+00b809: */
+ RTUNI_ALPHA, /* U+00b80a: */
+ RTUNI_ALPHA, /* U+00b80b: */
+ RTUNI_ALPHA, /* U+00b80c: */
+ RTUNI_ALPHA, /* U+00b80d: */
+ RTUNI_ALPHA, /* U+00b80e: */
+ RTUNI_ALPHA, /* U+00b80f: */
+ RTUNI_ALPHA, /* U+00b810: */
+ RTUNI_ALPHA, /* U+00b811: */
+ RTUNI_ALPHA, /* U+00b812: */
+ RTUNI_ALPHA, /* U+00b813: */
+ RTUNI_ALPHA, /* U+00b814: */
+ RTUNI_ALPHA, /* U+00b815: */
+ RTUNI_ALPHA, /* U+00b816: */
+ RTUNI_ALPHA, /* U+00b817: */
+ RTUNI_ALPHA, /* U+00b818: */
+ RTUNI_ALPHA, /* U+00b819: */
+ RTUNI_ALPHA, /* U+00b81a: */
+ RTUNI_ALPHA, /* U+00b81b: */
+ RTUNI_ALPHA, /* U+00b81c: */
+ RTUNI_ALPHA, /* U+00b81d: */
+ RTUNI_ALPHA, /* U+00b81e: */
+ RTUNI_ALPHA, /* U+00b81f: */
+ RTUNI_ALPHA, /* U+00b820: */
+ RTUNI_ALPHA, /* U+00b821: */
+ RTUNI_ALPHA, /* U+00b822: */
+ RTUNI_ALPHA, /* U+00b823: */
+ RTUNI_ALPHA, /* U+00b824: */
+ RTUNI_ALPHA, /* U+00b825: */
+ RTUNI_ALPHA, /* U+00b826: */
+ RTUNI_ALPHA, /* U+00b827: */
+ RTUNI_ALPHA, /* U+00b828: */
+ RTUNI_ALPHA, /* U+00b829: */
+ RTUNI_ALPHA, /* U+00b82a: */
+ RTUNI_ALPHA, /* U+00b82b: */
+ RTUNI_ALPHA, /* U+00b82c: */
+ RTUNI_ALPHA, /* U+00b82d: */
+ RTUNI_ALPHA, /* U+00b82e: */
+ RTUNI_ALPHA, /* U+00b82f: */
+ RTUNI_ALPHA, /* U+00b830: */
+ RTUNI_ALPHA, /* U+00b831: */
+ RTUNI_ALPHA, /* U+00b832: */
+ RTUNI_ALPHA, /* U+00b833: */
+ RTUNI_ALPHA, /* U+00b834: */
+ RTUNI_ALPHA, /* U+00b835: */
+ RTUNI_ALPHA, /* U+00b836: */
+ RTUNI_ALPHA, /* U+00b837: */
+ RTUNI_ALPHA, /* U+00b838: */
+ RTUNI_ALPHA, /* U+00b839: */
+ RTUNI_ALPHA, /* U+00b83a: */
+ RTUNI_ALPHA, /* U+00b83b: */
+ RTUNI_ALPHA, /* U+00b83c: */
+ RTUNI_ALPHA, /* U+00b83d: */
+ RTUNI_ALPHA, /* U+00b83e: */
+ RTUNI_ALPHA, /* U+00b83f: */
+ RTUNI_ALPHA, /* U+00b840: */
+ RTUNI_ALPHA, /* U+00b841: */
+ RTUNI_ALPHA, /* U+00b842: */
+ RTUNI_ALPHA, /* U+00b843: */
+ RTUNI_ALPHA, /* U+00b844: */
+ RTUNI_ALPHA, /* U+00b845: */
+ RTUNI_ALPHA, /* U+00b846: */
+ RTUNI_ALPHA, /* U+00b847: */
+ RTUNI_ALPHA, /* U+00b848: */
+ RTUNI_ALPHA, /* U+00b849: */
+ RTUNI_ALPHA, /* U+00b84a: */
+ RTUNI_ALPHA, /* U+00b84b: */
+ RTUNI_ALPHA, /* U+00b84c: */
+ RTUNI_ALPHA, /* U+00b84d: */
+ RTUNI_ALPHA, /* U+00b84e: */
+ RTUNI_ALPHA, /* U+00b84f: */
+ RTUNI_ALPHA, /* U+00b850: */
+ RTUNI_ALPHA, /* U+00b851: */
+ RTUNI_ALPHA, /* U+00b852: */
+ RTUNI_ALPHA, /* U+00b853: */
+ RTUNI_ALPHA, /* U+00b854: */
+ RTUNI_ALPHA, /* U+00b855: */
+ RTUNI_ALPHA, /* U+00b856: */
+ RTUNI_ALPHA, /* U+00b857: */
+ RTUNI_ALPHA, /* U+00b858: */
+ RTUNI_ALPHA, /* U+00b859: */
+ RTUNI_ALPHA, /* U+00b85a: */
+ RTUNI_ALPHA, /* U+00b85b: */
+ RTUNI_ALPHA, /* U+00b85c: */
+ RTUNI_ALPHA, /* U+00b85d: */
+ RTUNI_ALPHA, /* U+00b85e: */
+ RTUNI_ALPHA, /* U+00b85f: */
+ RTUNI_ALPHA, /* U+00b860: */
+ RTUNI_ALPHA, /* U+00b861: */
+ RTUNI_ALPHA, /* U+00b862: */
+ RTUNI_ALPHA, /* U+00b863: */
+ RTUNI_ALPHA, /* U+00b864: */
+ RTUNI_ALPHA, /* U+00b865: */
+ RTUNI_ALPHA, /* U+00b866: */
+ RTUNI_ALPHA, /* U+00b867: */
+ RTUNI_ALPHA, /* U+00b868: */
+ RTUNI_ALPHA, /* U+00b869: */
+ RTUNI_ALPHA, /* U+00b86a: */
+ RTUNI_ALPHA, /* U+00b86b: */
+ RTUNI_ALPHA, /* U+00b86c: */
+ RTUNI_ALPHA, /* U+00b86d: */
+ RTUNI_ALPHA, /* U+00b86e: */
+ RTUNI_ALPHA, /* U+00b86f: */
+ RTUNI_ALPHA, /* U+00b870: */
+ RTUNI_ALPHA, /* U+00b871: */
+ RTUNI_ALPHA, /* U+00b872: */
+ RTUNI_ALPHA, /* U+00b873: */
+ RTUNI_ALPHA, /* U+00b874: */
+ RTUNI_ALPHA, /* U+00b875: */
+ RTUNI_ALPHA, /* U+00b876: */
+ RTUNI_ALPHA, /* U+00b877: */
+ RTUNI_ALPHA, /* U+00b878: */
+ RTUNI_ALPHA, /* U+00b879: */
+ RTUNI_ALPHA, /* U+00b87a: */
+ RTUNI_ALPHA, /* U+00b87b: */
+ RTUNI_ALPHA, /* U+00b87c: */
+ RTUNI_ALPHA, /* U+00b87d: */
+ RTUNI_ALPHA, /* U+00b87e: */
+ RTUNI_ALPHA, /* U+00b87f: */
+ RTUNI_ALPHA, /* U+00b880: */
+ RTUNI_ALPHA, /* U+00b881: */
+ RTUNI_ALPHA, /* U+00b882: */
+ RTUNI_ALPHA, /* U+00b883: */
+ RTUNI_ALPHA, /* U+00b884: */
+ RTUNI_ALPHA, /* U+00b885: */
+ RTUNI_ALPHA, /* U+00b886: */
+ RTUNI_ALPHA, /* U+00b887: */
+ RTUNI_ALPHA, /* U+00b888: */
+ RTUNI_ALPHA, /* U+00b889: */
+ RTUNI_ALPHA, /* U+00b88a: */
+ RTUNI_ALPHA, /* U+00b88b: */
+ RTUNI_ALPHA, /* U+00b88c: */
+ RTUNI_ALPHA, /* U+00b88d: */
+ RTUNI_ALPHA, /* U+00b88e: */
+ RTUNI_ALPHA, /* U+00b88f: */
+ RTUNI_ALPHA, /* U+00b890: */
+ RTUNI_ALPHA, /* U+00b891: */
+ RTUNI_ALPHA, /* U+00b892: */
+ RTUNI_ALPHA, /* U+00b893: */
+ RTUNI_ALPHA, /* U+00b894: */
+ RTUNI_ALPHA, /* U+00b895: */
+ RTUNI_ALPHA, /* U+00b896: */
+ RTUNI_ALPHA, /* U+00b897: */
+ RTUNI_ALPHA, /* U+00b898: */
+ RTUNI_ALPHA, /* U+00b899: */
+ RTUNI_ALPHA, /* U+00b89a: */
+ RTUNI_ALPHA, /* U+00b89b: */
+ RTUNI_ALPHA, /* U+00b89c: */
+ RTUNI_ALPHA, /* U+00b89d: */
+ RTUNI_ALPHA, /* U+00b89e: */
+ RTUNI_ALPHA, /* U+00b89f: */
+ RTUNI_ALPHA, /* U+00b8a0: */
+ RTUNI_ALPHA, /* U+00b8a1: */
+ RTUNI_ALPHA, /* U+00b8a2: */
+ RTUNI_ALPHA, /* U+00b8a3: */
+ RTUNI_ALPHA, /* U+00b8a4: */
+ RTUNI_ALPHA, /* U+00b8a5: */
+ RTUNI_ALPHA, /* U+00b8a6: */
+ RTUNI_ALPHA, /* U+00b8a7: */
+ RTUNI_ALPHA, /* U+00b8a8: */
+ RTUNI_ALPHA, /* U+00b8a9: */
+ RTUNI_ALPHA, /* U+00b8aa: */
+ RTUNI_ALPHA, /* U+00b8ab: */
+ RTUNI_ALPHA, /* U+00b8ac: */
+ RTUNI_ALPHA, /* U+00b8ad: */
+ RTUNI_ALPHA, /* U+00b8ae: */
+ RTUNI_ALPHA, /* U+00b8af: */
+ RTUNI_ALPHA, /* U+00b8b0: */
+ RTUNI_ALPHA, /* U+00b8b1: */
+ RTUNI_ALPHA, /* U+00b8b2: */
+ RTUNI_ALPHA, /* U+00b8b3: */
+ RTUNI_ALPHA, /* U+00b8b4: */
+ RTUNI_ALPHA, /* U+00b8b5: */
+ RTUNI_ALPHA, /* U+00b8b6: */
+ RTUNI_ALPHA, /* U+00b8b7: */
+ RTUNI_ALPHA, /* U+00b8b8: */
+ RTUNI_ALPHA, /* U+00b8b9: */
+ RTUNI_ALPHA, /* U+00b8ba: */
+ RTUNI_ALPHA, /* U+00b8bb: */
+ RTUNI_ALPHA, /* U+00b8bc: */
+ RTUNI_ALPHA, /* U+00b8bd: */
+ RTUNI_ALPHA, /* U+00b8be: */
+ RTUNI_ALPHA, /* U+00b8bf: */
+ RTUNI_ALPHA, /* U+00b8c0: */
+ RTUNI_ALPHA, /* U+00b8c1: */
+ RTUNI_ALPHA, /* U+00b8c2: */
+ RTUNI_ALPHA, /* U+00b8c3: */
+ RTUNI_ALPHA, /* U+00b8c4: */
+ RTUNI_ALPHA, /* U+00b8c5: */
+ RTUNI_ALPHA, /* U+00b8c6: */
+ RTUNI_ALPHA, /* U+00b8c7: */
+ RTUNI_ALPHA, /* U+00b8c8: */
+ RTUNI_ALPHA, /* U+00b8c9: */
+ RTUNI_ALPHA, /* U+00b8ca: */
+ RTUNI_ALPHA, /* U+00b8cb: */
+ RTUNI_ALPHA, /* U+00b8cc: */
+ RTUNI_ALPHA, /* U+00b8cd: */
+ RTUNI_ALPHA, /* U+00b8ce: */
+ RTUNI_ALPHA, /* U+00b8cf: */
+ RTUNI_ALPHA, /* U+00b8d0: */
+ RTUNI_ALPHA, /* U+00b8d1: */
+ RTUNI_ALPHA, /* U+00b8d2: */
+ RTUNI_ALPHA, /* U+00b8d3: */
+ RTUNI_ALPHA, /* U+00b8d4: */
+ RTUNI_ALPHA, /* U+00b8d5: */
+ RTUNI_ALPHA, /* U+00b8d6: */
+ RTUNI_ALPHA, /* U+00b8d7: */
+ RTUNI_ALPHA, /* U+00b8d8: */
+ RTUNI_ALPHA, /* U+00b8d9: */
+ RTUNI_ALPHA, /* U+00b8da: */
+ RTUNI_ALPHA, /* U+00b8db: */
+ RTUNI_ALPHA, /* U+00b8dc: */
+ RTUNI_ALPHA, /* U+00b8dd: */
+ RTUNI_ALPHA, /* U+00b8de: */
+ RTUNI_ALPHA, /* U+00b8df: */
+ RTUNI_ALPHA, /* U+00b8e0: */
+ RTUNI_ALPHA, /* U+00b8e1: */
+ RTUNI_ALPHA, /* U+00b8e2: */
+ RTUNI_ALPHA, /* U+00b8e3: */
+ RTUNI_ALPHA, /* U+00b8e4: */
+ RTUNI_ALPHA, /* U+00b8e5: */
+ RTUNI_ALPHA, /* U+00b8e6: */
+ RTUNI_ALPHA, /* U+00b8e7: */
+ RTUNI_ALPHA, /* U+00b8e8: */
+ RTUNI_ALPHA, /* U+00b8e9: */
+ RTUNI_ALPHA, /* U+00b8ea: */
+ RTUNI_ALPHA, /* U+00b8eb: */
+ RTUNI_ALPHA, /* U+00b8ec: */
+ RTUNI_ALPHA, /* U+00b8ed: */
+ RTUNI_ALPHA, /* U+00b8ee: */
+ RTUNI_ALPHA, /* U+00b8ef: */
+ RTUNI_ALPHA, /* U+00b8f0: */
+ RTUNI_ALPHA, /* U+00b8f1: */
+ RTUNI_ALPHA, /* U+00b8f2: */
+ RTUNI_ALPHA, /* U+00b8f3: */
+ RTUNI_ALPHA, /* U+00b8f4: */
+ RTUNI_ALPHA, /* U+00b8f5: */
+ RTUNI_ALPHA, /* U+00b8f6: */
+ RTUNI_ALPHA, /* U+00b8f7: */
+ RTUNI_ALPHA, /* U+00b8f8: */
+ RTUNI_ALPHA, /* U+00b8f9: */
+ RTUNI_ALPHA, /* U+00b8fa: */
+ RTUNI_ALPHA, /* U+00b8fb: */
+ RTUNI_ALPHA, /* U+00b8fc: */
+ RTUNI_ALPHA, /* U+00b8fd: */
+ RTUNI_ALPHA, /* U+00b8fe: */
+ RTUNI_ALPHA, /* U+00b8ff: */
+ RTUNI_ALPHA, /* U+00b900: */
+ RTUNI_ALPHA, /* U+00b901: */
+ RTUNI_ALPHA, /* U+00b902: */
+ RTUNI_ALPHA, /* U+00b903: */
+ RTUNI_ALPHA, /* U+00b904: */
+ RTUNI_ALPHA, /* U+00b905: */
+ RTUNI_ALPHA, /* U+00b906: */
+ RTUNI_ALPHA, /* U+00b907: */
+ RTUNI_ALPHA, /* U+00b908: */
+ RTUNI_ALPHA, /* U+00b909: */
+ RTUNI_ALPHA, /* U+00b90a: */
+ RTUNI_ALPHA, /* U+00b90b: */
+ RTUNI_ALPHA, /* U+00b90c: */
+ RTUNI_ALPHA, /* U+00b90d: */
+ RTUNI_ALPHA, /* U+00b90e: */
+ RTUNI_ALPHA, /* U+00b90f: */
+ RTUNI_ALPHA, /* U+00b910: */
+ RTUNI_ALPHA, /* U+00b911: */
+ RTUNI_ALPHA, /* U+00b912: */
+ RTUNI_ALPHA, /* U+00b913: */
+ RTUNI_ALPHA, /* U+00b914: */
+ RTUNI_ALPHA, /* U+00b915: */
+ RTUNI_ALPHA, /* U+00b916: */
+ RTUNI_ALPHA, /* U+00b917: */
+ RTUNI_ALPHA, /* U+00b918: */
+ RTUNI_ALPHA, /* U+00b919: */
+ RTUNI_ALPHA, /* U+00b91a: */
+ RTUNI_ALPHA, /* U+00b91b: */
+ RTUNI_ALPHA, /* U+00b91c: */
+ RTUNI_ALPHA, /* U+00b91d: */
+ RTUNI_ALPHA, /* U+00b91e: */
+ RTUNI_ALPHA, /* U+00b91f: */
+ RTUNI_ALPHA, /* U+00b920: */
+ RTUNI_ALPHA, /* U+00b921: */
+ RTUNI_ALPHA, /* U+00b922: */
+ RTUNI_ALPHA, /* U+00b923: */
+ RTUNI_ALPHA, /* U+00b924: */
+ RTUNI_ALPHA, /* U+00b925: */
+ RTUNI_ALPHA, /* U+00b926: */
+ RTUNI_ALPHA, /* U+00b927: */
+ RTUNI_ALPHA, /* U+00b928: */
+ RTUNI_ALPHA, /* U+00b929: */
+ RTUNI_ALPHA, /* U+00b92a: */
+ RTUNI_ALPHA, /* U+00b92b: */
+ RTUNI_ALPHA, /* U+00b92c: */
+ RTUNI_ALPHA, /* U+00b92d: */
+ RTUNI_ALPHA, /* U+00b92e: */
+ RTUNI_ALPHA, /* U+00b92f: */
+ RTUNI_ALPHA, /* U+00b930: */
+ RTUNI_ALPHA, /* U+00b931: */
+ RTUNI_ALPHA, /* U+00b932: */
+ RTUNI_ALPHA, /* U+00b933: */
+ RTUNI_ALPHA, /* U+00b934: */
+ RTUNI_ALPHA, /* U+00b935: */
+ RTUNI_ALPHA, /* U+00b936: */
+ RTUNI_ALPHA, /* U+00b937: */
+ RTUNI_ALPHA, /* U+00b938: */
+ RTUNI_ALPHA, /* U+00b939: */
+ RTUNI_ALPHA, /* U+00b93a: */
+ RTUNI_ALPHA, /* U+00b93b: */
+ RTUNI_ALPHA, /* U+00b93c: */
+ RTUNI_ALPHA, /* U+00b93d: */
+ RTUNI_ALPHA, /* U+00b93e: */
+ RTUNI_ALPHA, /* U+00b93f: */
+ RTUNI_ALPHA, /* U+00b940: */
+ RTUNI_ALPHA, /* U+00b941: */
+ RTUNI_ALPHA, /* U+00b942: */
+ RTUNI_ALPHA, /* U+00b943: */
+ RTUNI_ALPHA, /* U+00b944: */
+ RTUNI_ALPHA, /* U+00b945: */
+ RTUNI_ALPHA, /* U+00b946: */
+ RTUNI_ALPHA, /* U+00b947: */
+ RTUNI_ALPHA, /* U+00b948: */
+ RTUNI_ALPHA, /* U+00b949: */
+ RTUNI_ALPHA, /* U+00b94a: */
+ RTUNI_ALPHA, /* U+00b94b: */
+ RTUNI_ALPHA, /* U+00b94c: */
+ RTUNI_ALPHA, /* U+00b94d: */
+ RTUNI_ALPHA, /* U+00b94e: */
+ RTUNI_ALPHA, /* U+00b94f: */
+ RTUNI_ALPHA, /* U+00b950: */
+ RTUNI_ALPHA, /* U+00b951: */
+ RTUNI_ALPHA, /* U+00b952: */
+ RTUNI_ALPHA, /* U+00b953: */
+ RTUNI_ALPHA, /* U+00b954: */
+ RTUNI_ALPHA, /* U+00b955: */
+ RTUNI_ALPHA, /* U+00b956: */
+ RTUNI_ALPHA, /* U+00b957: */
+ RTUNI_ALPHA, /* U+00b958: */
+ RTUNI_ALPHA, /* U+00b959: */
+ RTUNI_ALPHA, /* U+00b95a: */
+ RTUNI_ALPHA, /* U+00b95b: */
+ RTUNI_ALPHA, /* U+00b95c: */
+ RTUNI_ALPHA, /* U+00b95d: */
+ RTUNI_ALPHA, /* U+00b95e: */
+ RTUNI_ALPHA, /* U+00b95f: */
+ RTUNI_ALPHA, /* U+00b960: */
+ RTUNI_ALPHA, /* U+00b961: */
+ RTUNI_ALPHA, /* U+00b962: */
+ RTUNI_ALPHA, /* U+00b963: */
+ RTUNI_ALPHA, /* U+00b964: */
+ RTUNI_ALPHA, /* U+00b965: */
+ RTUNI_ALPHA, /* U+00b966: */
+ RTUNI_ALPHA, /* U+00b967: */
+ RTUNI_ALPHA, /* U+00b968: */
+ RTUNI_ALPHA, /* U+00b969: */
+ RTUNI_ALPHA, /* U+00b96a: */
+ RTUNI_ALPHA, /* U+00b96b: */
+ RTUNI_ALPHA, /* U+00b96c: */
+ RTUNI_ALPHA, /* U+00b96d: */
+ RTUNI_ALPHA, /* U+00b96e: */
+ RTUNI_ALPHA, /* U+00b96f: */
+ RTUNI_ALPHA, /* U+00b970: */
+ RTUNI_ALPHA, /* U+00b971: */
+ RTUNI_ALPHA, /* U+00b972: */
+ RTUNI_ALPHA, /* U+00b973: */
+ RTUNI_ALPHA, /* U+00b974: */
+ RTUNI_ALPHA, /* U+00b975: */
+ RTUNI_ALPHA, /* U+00b976: */
+ RTUNI_ALPHA, /* U+00b977: */
+ RTUNI_ALPHA, /* U+00b978: */
+ RTUNI_ALPHA, /* U+00b979: */
+ RTUNI_ALPHA, /* U+00b97a: */
+ RTUNI_ALPHA, /* U+00b97b: */
+ RTUNI_ALPHA, /* U+00b97c: */
+ RTUNI_ALPHA, /* U+00b97d: */
+ RTUNI_ALPHA, /* U+00b97e: */
+ RTUNI_ALPHA, /* U+00b97f: */
+ RTUNI_ALPHA, /* U+00b980: */
+ RTUNI_ALPHA, /* U+00b981: */
+ RTUNI_ALPHA, /* U+00b982: */
+ RTUNI_ALPHA, /* U+00b983: */
+ RTUNI_ALPHA, /* U+00b984: */
+ RTUNI_ALPHA, /* U+00b985: */
+ RTUNI_ALPHA, /* U+00b986: */
+ RTUNI_ALPHA, /* U+00b987: */
+ RTUNI_ALPHA, /* U+00b988: */
+ RTUNI_ALPHA, /* U+00b989: */
+ RTUNI_ALPHA, /* U+00b98a: */
+ RTUNI_ALPHA, /* U+00b98b: */
+ RTUNI_ALPHA, /* U+00b98c: */
+ RTUNI_ALPHA, /* U+00b98d: */
+ RTUNI_ALPHA, /* U+00b98e: */
+ RTUNI_ALPHA, /* U+00b98f: */
+ RTUNI_ALPHA, /* U+00b990: */
+ RTUNI_ALPHA, /* U+00b991: */
+ RTUNI_ALPHA, /* U+00b992: */
+ RTUNI_ALPHA, /* U+00b993: */
+ RTUNI_ALPHA, /* U+00b994: */
+ RTUNI_ALPHA, /* U+00b995: */
+ RTUNI_ALPHA, /* U+00b996: */
+ RTUNI_ALPHA, /* U+00b997: */
+ RTUNI_ALPHA, /* U+00b998: */
+ RTUNI_ALPHA, /* U+00b999: */
+ RTUNI_ALPHA, /* U+00b99a: */
+ RTUNI_ALPHA, /* U+00b99b: */
+ RTUNI_ALPHA, /* U+00b99c: */
+ RTUNI_ALPHA, /* U+00b99d: */
+ RTUNI_ALPHA, /* U+00b99e: */
+ RTUNI_ALPHA, /* U+00b99f: */
+ RTUNI_ALPHA, /* U+00b9a0: */
+ RTUNI_ALPHA, /* U+00b9a1: */
+ RTUNI_ALPHA, /* U+00b9a2: */
+ RTUNI_ALPHA, /* U+00b9a3: */
+ RTUNI_ALPHA, /* U+00b9a4: */
+ RTUNI_ALPHA, /* U+00b9a5: */
+ RTUNI_ALPHA, /* U+00b9a6: */
+ RTUNI_ALPHA, /* U+00b9a7: */
+ RTUNI_ALPHA, /* U+00b9a8: */
+ RTUNI_ALPHA, /* U+00b9a9: */
+ RTUNI_ALPHA, /* U+00b9aa: */
+ RTUNI_ALPHA, /* U+00b9ab: */
+ RTUNI_ALPHA, /* U+00b9ac: */
+ RTUNI_ALPHA, /* U+00b9ad: */
+ RTUNI_ALPHA, /* U+00b9ae: */
+ RTUNI_ALPHA, /* U+00b9af: */
+ RTUNI_ALPHA, /* U+00b9b0: */
+ RTUNI_ALPHA, /* U+00b9b1: */
+ RTUNI_ALPHA, /* U+00b9b2: */
+ RTUNI_ALPHA, /* U+00b9b3: */
+ RTUNI_ALPHA, /* U+00b9b4: */
+ RTUNI_ALPHA, /* U+00b9b5: */
+ RTUNI_ALPHA, /* U+00b9b6: */
+ RTUNI_ALPHA, /* U+00b9b7: */
+ RTUNI_ALPHA, /* U+00b9b8: */
+ RTUNI_ALPHA, /* U+00b9b9: */
+ RTUNI_ALPHA, /* U+00b9ba: */
+ RTUNI_ALPHA, /* U+00b9bb: */
+ RTUNI_ALPHA, /* U+00b9bc: */
+ RTUNI_ALPHA, /* U+00b9bd: */
+ RTUNI_ALPHA, /* U+00b9be: */
+ RTUNI_ALPHA, /* U+00b9bf: */
+ RTUNI_ALPHA, /* U+00b9c0: */
+ RTUNI_ALPHA, /* U+00b9c1: */
+ RTUNI_ALPHA, /* U+00b9c2: */
+ RTUNI_ALPHA, /* U+00b9c3: */
+ RTUNI_ALPHA, /* U+00b9c4: */
+ RTUNI_ALPHA, /* U+00b9c5: */
+ RTUNI_ALPHA, /* U+00b9c6: */
+ RTUNI_ALPHA, /* U+00b9c7: */
+ RTUNI_ALPHA, /* U+00b9c8: */
+ RTUNI_ALPHA, /* U+00b9c9: */
+ RTUNI_ALPHA, /* U+00b9ca: */
+ RTUNI_ALPHA, /* U+00b9cb: */
+ RTUNI_ALPHA, /* U+00b9cc: */
+ RTUNI_ALPHA, /* U+00b9cd: */
+ RTUNI_ALPHA, /* U+00b9ce: */
+ RTUNI_ALPHA, /* U+00b9cf: */
+ RTUNI_ALPHA, /* U+00b9d0: */
+ RTUNI_ALPHA, /* U+00b9d1: */
+ RTUNI_ALPHA, /* U+00b9d2: */
+ RTUNI_ALPHA, /* U+00b9d3: */
+ RTUNI_ALPHA, /* U+00b9d4: */
+ RTUNI_ALPHA, /* U+00b9d5: */
+ RTUNI_ALPHA, /* U+00b9d6: */
+ RTUNI_ALPHA, /* U+00b9d7: */
+ RTUNI_ALPHA, /* U+00b9d8: */
+ RTUNI_ALPHA, /* U+00b9d9: */
+ RTUNI_ALPHA, /* U+00b9da: */
+ RTUNI_ALPHA, /* U+00b9db: */
+ RTUNI_ALPHA, /* U+00b9dc: */
+ RTUNI_ALPHA, /* U+00b9dd: */
+ RTUNI_ALPHA, /* U+00b9de: */
+ RTUNI_ALPHA, /* U+00b9df: */
+ RTUNI_ALPHA, /* U+00b9e0: */
+ RTUNI_ALPHA, /* U+00b9e1: */
+ RTUNI_ALPHA, /* U+00b9e2: */
+ RTUNI_ALPHA, /* U+00b9e3: */
+ RTUNI_ALPHA, /* U+00b9e4: */
+ RTUNI_ALPHA, /* U+00b9e5: */
+ RTUNI_ALPHA, /* U+00b9e6: */
+ RTUNI_ALPHA, /* U+00b9e7: */
+ RTUNI_ALPHA, /* U+00b9e8: */
+ RTUNI_ALPHA, /* U+00b9e9: */
+ RTUNI_ALPHA, /* U+00b9ea: */
+ RTUNI_ALPHA, /* U+00b9eb: */
+ RTUNI_ALPHA, /* U+00b9ec: */
+ RTUNI_ALPHA, /* U+00b9ed: */
+ RTUNI_ALPHA, /* U+00b9ee: */
+ RTUNI_ALPHA, /* U+00b9ef: */
+ RTUNI_ALPHA, /* U+00b9f0: */
+ RTUNI_ALPHA, /* U+00b9f1: */
+ RTUNI_ALPHA, /* U+00b9f2: */
+ RTUNI_ALPHA, /* U+00b9f3: */
+ RTUNI_ALPHA, /* U+00b9f4: */
+ RTUNI_ALPHA, /* U+00b9f5: */
+ RTUNI_ALPHA, /* U+00b9f6: */
+ RTUNI_ALPHA, /* U+00b9f7: */
+ RTUNI_ALPHA, /* U+00b9f8: */
+ RTUNI_ALPHA, /* U+00b9f9: */
+ RTUNI_ALPHA, /* U+00b9fa: */
+ RTUNI_ALPHA, /* U+00b9fb: */
+ RTUNI_ALPHA, /* U+00b9fc: */
+ RTUNI_ALPHA, /* U+00b9fd: */
+ RTUNI_ALPHA, /* U+00b9fe: */
+ RTUNI_ALPHA, /* U+00b9ff: */
+ RTUNI_ALPHA, /* U+00ba00: */
+ RTUNI_ALPHA, /* U+00ba01: */
+ RTUNI_ALPHA, /* U+00ba02: */
+ RTUNI_ALPHA, /* U+00ba03: */
+ RTUNI_ALPHA, /* U+00ba04: */
+ RTUNI_ALPHA, /* U+00ba05: */
+ RTUNI_ALPHA, /* U+00ba06: */
+ RTUNI_ALPHA, /* U+00ba07: */
+ RTUNI_ALPHA, /* U+00ba08: */
+ RTUNI_ALPHA, /* U+00ba09: */
+ RTUNI_ALPHA, /* U+00ba0a: */
+ RTUNI_ALPHA, /* U+00ba0b: */
+ RTUNI_ALPHA, /* U+00ba0c: */
+ RTUNI_ALPHA, /* U+00ba0d: */
+ RTUNI_ALPHA, /* U+00ba0e: */
+ RTUNI_ALPHA, /* U+00ba0f: */
+ RTUNI_ALPHA, /* U+00ba10: */
+ RTUNI_ALPHA, /* U+00ba11: */
+ RTUNI_ALPHA, /* U+00ba12: */
+ RTUNI_ALPHA, /* U+00ba13: */
+ RTUNI_ALPHA, /* U+00ba14: */
+ RTUNI_ALPHA, /* U+00ba15: */
+ RTUNI_ALPHA, /* U+00ba16: */
+ RTUNI_ALPHA, /* U+00ba17: */
+ RTUNI_ALPHA, /* U+00ba18: */
+ RTUNI_ALPHA, /* U+00ba19: */
+ RTUNI_ALPHA, /* U+00ba1a: */
+ RTUNI_ALPHA, /* U+00ba1b: */
+ RTUNI_ALPHA, /* U+00ba1c: */
+ RTUNI_ALPHA, /* U+00ba1d: */
+ RTUNI_ALPHA, /* U+00ba1e: */
+ RTUNI_ALPHA, /* U+00ba1f: */
+ RTUNI_ALPHA, /* U+00ba20: */
+ RTUNI_ALPHA, /* U+00ba21: */
+ RTUNI_ALPHA, /* U+00ba22: */
+ RTUNI_ALPHA, /* U+00ba23: */
+ RTUNI_ALPHA, /* U+00ba24: */
+ RTUNI_ALPHA, /* U+00ba25: */
+ RTUNI_ALPHA, /* U+00ba26: */
+ RTUNI_ALPHA, /* U+00ba27: */
+ RTUNI_ALPHA, /* U+00ba28: */
+ RTUNI_ALPHA, /* U+00ba29: */
+ RTUNI_ALPHA, /* U+00ba2a: */
+ RTUNI_ALPHA, /* U+00ba2b: */
+ RTUNI_ALPHA, /* U+00ba2c: */
+ RTUNI_ALPHA, /* U+00ba2d: */
+ RTUNI_ALPHA, /* U+00ba2e: */
+ RTUNI_ALPHA, /* U+00ba2f: */
+ RTUNI_ALPHA, /* U+00ba30: */
+ RTUNI_ALPHA, /* U+00ba31: */
+ RTUNI_ALPHA, /* U+00ba32: */
+ RTUNI_ALPHA, /* U+00ba33: */
+ RTUNI_ALPHA, /* U+00ba34: */
+ RTUNI_ALPHA, /* U+00ba35: */
+ RTUNI_ALPHA, /* U+00ba36: */
+ RTUNI_ALPHA, /* U+00ba37: */
+ RTUNI_ALPHA, /* U+00ba38: */
+ RTUNI_ALPHA, /* U+00ba39: */
+ RTUNI_ALPHA, /* U+00ba3a: */
+ RTUNI_ALPHA, /* U+00ba3b: */
+ RTUNI_ALPHA, /* U+00ba3c: */
+ RTUNI_ALPHA, /* U+00ba3d: */
+ RTUNI_ALPHA, /* U+00ba3e: */
+ RTUNI_ALPHA, /* U+00ba3f: */
+ RTUNI_ALPHA, /* U+00ba40: */
+ RTUNI_ALPHA, /* U+00ba41: */
+ RTUNI_ALPHA, /* U+00ba42: */
+ RTUNI_ALPHA, /* U+00ba43: */
+ RTUNI_ALPHA, /* U+00ba44: */
+ RTUNI_ALPHA, /* U+00ba45: */
+ RTUNI_ALPHA, /* U+00ba46: */
+ RTUNI_ALPHA, /* U+00ba47: */
+ RTUNI_ALPHA, /* U+00ba48: */
+ RTUNI_ALPHA, /* U+00ba49: */
+ RTUNI_ALPHA, /* U+00ba4a: */
+ RTUNI_ALPHA, /* U+00ba4b: */
+ RTUNI_ALPHA, /* U+00ba4c: */
+ RTUNI_ALPHA, /* U+00ba4d: */
+ RTUNI_ALPHA, /* U+00ba4e: */
+ RTUNI_ALPHA, /* U+00ba4f: */
+ RTUNI_ALPHA, /* U+00ba50: */
+ RTUNI_ALPHA, /* U+00ba51: */
+ RTUNI_ALPHA, /* U+00ba52: */
+ RTUNI_ALPHA, /* U+00ba53: */
+ RTUNI_ALPHA, /* U+00ba54: */
+ RTUNI_ALPHA, /* U+00ba55: */
+ RTUNI_ALPHA, /* U+00ba56: */
+ RTUNI_ALPHA, /* U+00ba57: */
+ RTUNI_ALPHA, /* U+00ba58: */
+ RTUNI_ALPHA, /* U+00ba59: */
+ RTUNI_ALPHA, /* U+00ba5a: */
+ RTUNI_ALPHA, /* U+00ba5b: */
+ RTUNI_ALPHA, /* U+00ba5c: */
+ RTUNI_ALPHA, /* U+00ba5d: */
+ RTUNI_ALPHA, /* U+00ba5e: */
+ RTUNI_ALPHA, /* U+00ba5f: */
+ RTUNI_ALPHA, /* U+00ba60: */
+ RTUNI_ALPHA, /* U+00ba61: */
+ RTUNI_ALPHA, /* U+00ba62: */
+ RTUNI_ALPHA, /* U+00ba63: */
+ RTUNI_ALPHA, /* U+00ba64: */
+ RTUNI_ALPHA, /* U+00ba65: */
+ RTUNI_ALPHA, /* U+00ba66: */
+ RTUNI_ALPHA, /* U+00ba67: */
+ RTUNI_ALPHA, /* U+00ba68: */
+ RTUNI_ALPHA, /* U+00ba69: */
+ RTUNI_ALPHA, /* U+00ba6a: */
+ RTUNI_ALPHA, /* U+00ba6b: */
+ RTUNI_ALPHA, /* U+00ba6c: */
+ RTUNI_ALPHA, /* U+00ba6d: */
+ RTUNI_ALPHA, /* U+00ba6e: */
+ RTUNI_ALPHA, /* U+00ba6f: */
+ RTUNI_ALPHA, /* U+00ba70: */
+ RTUNI_ALPHA, /* U+00ba71: */
+ RTUNI_ALPHA, /* U+00ba72: */
+ RTUNI_ALPHA, /* U+00ba73: */
+ RTUNI_ALPHA, /* U+00ba74: */
+ RTUNI_ALPHA, /* U+00ba75: */
+ RTUNI_ALPHA, /* U+00ba76: */
+ RTUNI_ALPHA, /* U+00ba77: */
+ RTUNI_ALPHA, /* U+00ba78: */
+ RTUNI_ALPHA, /* U+00ba79: */
+ RTUNI_ALPHA, /* U+00ba7a: */
+ RTUNI_ALPHA, /* U+00ba7b: */
+ RTUNI_ALPHA, /* U+00ba7c: */
+ RTUNI_ALPHA, /* U+00ba7d: */
+ RTUNI_ALPHA, /* U+00ba7e: */
+ RTUNI_ALPHA, /* U+00ba7f: */
+ RTUNI_ALPHA, /* U+00ba80: */
+ RTUNI_ALPHA, /* U+00ba81: */
+ RTUNI_ALPHA, /* U+00ba82: */
+ RTUNI_ALPHA, /* U+00ba83: */
+ RTUNI_ALPHA, /* U+00ba84: */
+ RTUNI_ALPHA, /* U+00ba85: */
+ RTUNI_ALPHA, /* U+00ba86: */
+ RTUNI_ALPHA, /* U+00ba87: */
+ RTUNI_ALPHA, /* U+00ba88: */
+ RTUNI_ALPHA, /* U+00ba89: */
+ RTUNI_ALPHA, /* U+00ba8a: */
+ RTUNI_ALPHA, /* U+00ba8b: */
+ RTUNI_ALPHA, /* U+00ba8c: */
+ RTUNI_ALPHA, /* U+00ba8d: */
+ RTUNI_ALPHA, /* U+00ba8e: */
+ RTUNI_ALPHA, /* U+00ba8f: */
+ RTUNI_ALPHA, /* U+00ba90: */
+ RTUNI_ALPHA, /* U+00ba91: */
+ RTUNI_ALPHA, /* U+00ba92: */
+ RTUNI_ALPHA, /* U+00ba93: */
+ RTUNI_ALPHA, /* U+00ba94: */
+ RTUNI_ALPHA, /* U+00ba95: */
+ RTUNI_ALPHA, /* U+00ba96: */
+ RTUNI_ALPHA, /* U+00ba97: */
+ RTUNI_ALPHA, /* U+00ba98: */
+ RTUNI_ALPHA, /* U+00ba99: */
+ RTUNI_ALPHA, /* U+00ba9a: */
+ RTUNI_ALPHA, /* U+00ba9b: */
+ RTUNI_ALPHA, /* U+00ba9c: */
+ RTUNI_ALPHA, /* U+00ba9d: */
+ RTUNI_ALPHA, /* U+00ba9e: */
+ RTUNI_ALPHA, /* U+00ba9f: */
+ RTUNI_ALPHA, /* U+00baa0: */
+ RTUNI_ALPHA, /* U+00baa1: */
+ RTUNI_ALPHA, /* U+00baa2: */
+ RTUNI_ALPHA, /* U+00baa3: */
+ RTUNI_ALPHA, /* U+00baa4: */
+ RTUNI_ALPHA, /* U+00baa5: */
+ RTUNI_ALPHA, /* U+00baa6: */
+ RTUNI_ALPHA, /* U+00baa7: */
+ RTUNI_ALPHA, /* U+00baa8: */
+ RTUNI_ALPHA, /* U+00baa9: */
+ RTUNI_ALPHA, /* U+00baaa: */
+ RTUNI_ALPHA, /* U+00baab: */
+ RTUNI_ALPHA, /* U+00baac: */
+ RTUNI_ALPHA, /* U+00baad: */
+ RTUNI_ALPHA, /* U+00baae: */
+ RTUNI_ALPHA, /* U+00baaf: */
+ RTUNI_ALPHA, /* U+00bab0: */
+ RTUNI_ALPHA, /* U+00bab1: */
+ RTUNI_ALPHA, /* U+00bab2: */
+ RTUNI_ALPHA, /* U+00bab3: */
+ RTUNI_ALPHA, /* U+00bab4: */
+ RTUNI_ALPHA, /* U+00bab5: */
+ RTUNI_ALPHA, /* U+00bab6: */
+ RTUNI_ALPHA, /* U+00bab7: */
+ RTUNI_ALPHA, /* U+00bab8: */
+ RTUNI_ALPHA, /* U+00bab9: */
+ RTUNI_ALPHA, /* U+00baba: */
+ RTUNI_ALPHA, /* U+00babb: */
+ RTUNI_ALPHA, /* U+00babc: */
+ RTUNI_ALPHA, /* U+00babd: */
+ RTUNI_ALPHA, /* U+00babe: */
+ RTUNI_ALPHA, /* U+00babf: */
+ RTUNI_ALPHA, /* U+00bac0: */
+ RTUNI_ALPHA, /* U+00bac1: */
+ RTUNI_ALPHA, /* U+00bac2: */
+ RTUNI_ALPHA, /* U+00bac3: */
+ RTUNI_ALPHA, /* U+00bac4: */
+ RTUNI_ALPHA, /* U+00bac5: */
+ RTUNI_ALPHA, /* U+00bac6: */
+ RTUNI_ALPHA, /* U+00bac7: */
+ RTUNI_ALPHA, /* U+00bac8: */
+ RTUNI_ALPHA, /* U+00bac9: */
+ RTUNI_ALPHA, /* U+00baca: */
+ RTUNI_ALPHA, /* U+00bacb: */
+ RTUNI_ALPHA, /* U+00bacc: */
+ RTUNI_ALPHA, /* U+00bacd: */
+ RTUNI_ALPHA, /* U+00bace: */
+ RTUNI_ALPHA, /* U+00bacf: */
+ RTUNI_ALPHA, /* U+00bad0: */
+ RTUNI_ALPHA, /* U+00bad1: */
+ RTUNI_ALPHA, /* U+00bad2: */
+ RTUNI_ALPHA, /* U+00bad3: */
+ RTUNI_ALPHA, /* U+00bad4: */
+ RTUNI_ALPHA, /* U+00bad5: */
+ RTUNI_ALPHA, /* U+00bad6: */
+ RTUNI_ALPHA, /* U+00bad7: */
+ RTUNI_ALPHA, /* U+00bad8: */
+ RTUNI_ALPHA, /* U+00bad9: */
+ RTUNI_ALPHA, /* U+00bada: */
+ RTUNI_ALPHA, /* U+00badb: */
+ RTUNI_ALPHA, /* U+00badc: */
+ RTUNI_ALPHA, /* U+00badd: */
+ RTUNI_ALPHA, /* U+00bade: */
+ RTUNI_ALPHA, /* U+00badf: */
+ RTUNI_ALPHA, /* U+00bae0: */
+ RTUNI_ALPHA, /* U+00bae1: */
+ RTUNI_ALPHA, /* U+00bae2: */
+ RTUNI_ALPHA, /* U+00bae3: */
+ RTUNI_ALPHA, /* U+00bae4: */
+ RTUNI_ALPHA, /* U+00bae5: */
+ RTUNI_ALPHA, /* U+00bae6: */
+ RTUNI_ALPHA, /* U+00bae7: */
+ RTUNI_ALPHA, /* U+00bae8: */
+ RTUNI_ALPHA, /* U+00bae9: */
+ RTUNI_ALPHA, /* U+00baea: */
+ RTUNI_ALPHA, /* U+00baeb: */
+ RTUNI_ALPHA, /* U+00baec: */
+ RTUNI_ALPHA, /* U+00baed: */
+ RTUNI_ALPHA, /* U+00baee: */
+ RTUNI_ALPHA, /* U+00baef: */
+ RTUNI_ALPHA, /* U+00baf0: */
+ RTUNI_ALPHA, /* U+00baf1: */
+ RTUNI_ALPHA, /* U+00baf2: */
+ RTUNI_ALPHA, /* U+00baf3: */
+ RTUNI_ALPHA, /* U+00baf4: */
+ RTUNI_ALPHA, /* U+00baf5: */
+ RTUNI_ALPHA, /* U+00baf6: */
+ RTUNI_ALPHA, /* U+00baf7: */
+ RTUNI_ALPHA, /* U+00baf8: */
+ RTUNI_ALPHA, /* U+00baf9: */
+ RTUNI_ALPHA, /* U+00bafa: */
+ RTUNI_ALPHA, /* U+00bafb: */
+ RTUNI_ALPHA, /* U+00bafc: */
+ RTUNI_ALPHA, /* U+00bafd: */
+ RTUNI_ALPHA, /* U+00bafe: */
+ RTUNI_ALPHA, /* U+00baff: */
+ RTUNI_ALPHA, /* U+00bb00: */
+ RTUNI_ALPHA, /* U+00bb01: */
+ RTUNI_ALPHA, /* U+00bb02: */
+ RTUNI_ALPHA, /* U+00bb03: */
+ RTUNI_ALPHA, /* U+00bb04: */
+ RTUNI_ALPHA, /* U+00bb05: */
+ RTUNI_ALPHA, /* U+00bb06: */
+ RTUNI_ALPHA, /* U+00bb07: */
+ RTUNI_ALPHA, /* U+00bb08: */
+ RTUNI_ALPHA, /* U+00bb09: */
+ RTUNI_ALPHA, /* U+00bb0a: */
+ RTUNI_ALPHA, /* U+00bb0b: */
+ RTUNI_ALPHA, /* U+00bb0c: */
+ RTUNI_ALPHA, /* U+00bb0d: */
+ RTUNI_ALPHA, /* U+00bb0e: */
+ RTUNI_ALPHA, /* U+00bb0f: */
+ RTUNI_ALPHA, /* U+00bb10: */
+ RTUNI_ALPHA, /* U+00bb11: */
+ RTUNI_ALPHA, /* U+00bb12: */
+ RTUNI_ALPHA, /* U+00bb13: */
+ RTUNI_ALPHA, /* U+00bb14: */
+ RTUNI_ALPHA, /* U+00bb15: */
+ RTUNI_ALPHA, /* U+00bb16: */
+ RTUNI_ALPHA, /* U+00bb17: */
+ RTUNI_ALPHA, /* U+00bb18: */
+ RTUNI_ALPHA, /* U+00bb19: */
+ RTUNI_ALPHA, /* U+00bb1a: */
+ RTUNI_ALPHA, /* U+00bb1b: */
+ RTUNI_ALPHA, /* U+00bb1c: */
+ RTUNI_ALPHA, /* U+00bb1d: */
+ RTUNI_ALPHA, /* U+00bb1e: */
+ RTUNI_ALPHA, /* U+00bb1f: */
+ RTUNI_ALPHA, /* U+00bb20: */
+ RTUNI_ALPHA, /* U+00bb21: */
+ RTUNI_ALPHA, /* U+00bb22: */
+ RTUNI_ALPHA, /* U+00bb23: */
+ RTUNI_ALPHA, /* U+00bb24: */
+ RTUNI_ALPHA, /* U+00bb25: */
+ RTUNI_ALPHA, /* U+00bb26: */
+ RTUNI_ALPHA, /* U+00bb27: */
+ RTUNI_ALPHA, /* U+00bb28: */
+ RTUNI_ALPHA, /* U+00bb29: */
+ RTUNI_ALPHA, /* U+00bb2a: */
+ RTUNI_ALPHA, /* U+00bb2b: */
+ RTUNI_ALPHA, /* U+00bb2c: */
+ RTUNI_ALPHA, /* U+00bb2d: */
+ RTUNI_ALPHA, /* U+00bb2e: */
+ RTUNI_ALPHA, /* U+00bb2f: */
+ RTUNI_ALPHA, /* U+00bb30: */
+ RTUNI_ALPHA, /* U+00bb31: */
+ RTUNI_ALPHA, /* U+00bb32: */
+ RTUNI_ALPHA, /* U+00bb33: */
+ RTUNI_ALPHA, /* U+00bb34: */
+ RTUNI_ALPHA, /* U+00bb35: */
+ RTUNI_ALPHA, /* U+00bb36: */
+ RTUNI_ALPHA, /* U+00bb37: */
+ RTUNI_ALPHA, /* U+00bb38: */
+ RTUNI_ALPHA, /* U+00bb39: */
+ RTUNI_ALPHA, /* U+00bb3a: */
+ RTUNI_ALPHA, /* U+00bb3b: */
+ RTUNI_ALPHA, /* U+00bb3c: */
+ RTUNI_ALPHA, /* U+00bb3d: */
+ RTUNI_ALPHA, /* U+00bb3e: */
+ RTUNI_ALPHA, /* U+00bb3f: */
+ RTUNI_ALPHA, /* U+00bb40: */
+ RTUNI_ALPHA, /* U+00bb41: */
+ RTUNI_ALPHA, /* U+00bb42: */
+ RTUNI_ALPHA, /* U+00bb43: */
+ RTUNI_ALPHA, /* U+00bb44: */
+ RTUNI_ALPHA, /* U+00bb45: */
+ RTUNI_ALPHA, /* U+00bb46: */
+ RTUNI_ALPHA, /* U+00bb47: */
+ RTUNI_ALPHA, /* U+00bb48: */
+ RTUNI_ALPHA, /* U+00bb49: */
+ RTUNI_ALPHA, /* U+00bb4a: */
+ RTUNI_ALPHA, /* U+00bb4b: */
+ RTUNI_ALPHA, /* U+00bb4c: */
+ RTUNI_ALPHA, /* U+00bb4d: */
+ RTUNI_ALPHA, /* U+00bb4e: */
+ RTUNI_ALPHA, /* U+00bb4f: */
+ RTUNI_ALPHA, /* U+00bb50: */
+ RTUNI_ALPHA, /* U+00bb51: */
+ RTUNI_ALPHA, /* U+00bb52: */
+ RTUNI_ALPHA, /* U+00bb53: */
+ RTUNI_ALPHA, /* U+00bb54: */
+ RTUNI_ALPHA, /* U+00bb55: */
+ RTUNI_ALPHA, /* U+00bb56: */
+ RTUNI_ALPHA, /* U+00bb57: */
+ RTUNI_ALPHA, /* U+00bb58: */
+ RTUNI_ALPHA, /* U+00bb59: */
+ RTUNI_ALPHA, /* U+00bb5a: */
+ RTUNI_ALPHA, /* U+00bb5b: */
+ RTUNI_ALPHA, /* U+00bb5c: */
+ RTUNI_ALPHA, /* U+00bb5d: */
+ RTUNI_ALPHA, /* U+00bb5e: */
+ RTUNI_ALPHA, /* U+00bb5f: */
+ RTUNI_ALPHA, /* U+00bb60: */
+ RTUNI_ALPHA, /* U+00bb61: */
+ RTUNI_ALPHA, /* U+00bb62: */
+ RTUNI_ALPHA, /* U+00bb63: */
+ RTUNI_ALPHA, /* U+00bb64: */
+ RTUNI_ALPHA, /* U+00bb65: */
+ RTUNI_ALPHA, /* U+00bb66: */
+ RTUNI_ALPHA, /* U+00bb67: */
+ RTUNI_ALPHA, /* U+00bb68: */
+ RTUNI_ALPHA, /* U+00bb69: */
+ RTUNI_ALPHA, /* U+00bb6a: */
+ RTUNI_ALPHA, /* U+00bb6b: */
+ RTUNI_ALPHA, /* U+00bb6c: */
+ RTUNI_ALPHA, /* U+00bb6d: */
+ RTUNI_ALPHA, /* U+00bb6e: */
+ RTUNI_ALPHA, /* U+00bb6f: */
+ RTUNI_ALPHA, /* U+00bb70: */
+ RTUNI_ALPHA, /* U+00bb71: */
+ RTUNI_ALPHA, /* U+00bb72: */
+ RTUNI_ALPHA, /* U+00bb73: */
+ RTUNI_ALPHA, /* U+00bb74: */
+ RTUNI_ALPHA, /* U+00bb75: */
+ RTUNI_ALPHA, /* U+00bb76: */
+ RTUNI_ALPHA, /* U+00bb77: */
+ RTUNI_ALPHA, /* U+00bb78: */
+ RTUNI_ALPHA, /* U+00bb79: */
+ RTUNI_ALPHA, /* U+00bb7a: */
+ RTUNI_ALPHA, /* U+00bb7b: */
+ RTUNI_ALPHA, /* U+00bb7c: */
+ RTUNI_ALPHA, /* U+00bb7d: */
+ RTUNI_ALPHA, /* U+00bb7e: */
+ RTUNI_ALPHA, /* U+00bb7f: */
+ RTUNI_ALPHA, /* U+00bb80: */
+ RTUNI_ALPHA, /* U+00bb81: */
+ RTUNI_ALPHA, /* U+00bb82: */
+ RTUNI_ALPHA, /* U+00bb83: */
+ RTUNI_ALPHA, /* U+00bb84: */
+ RTUNI_ALPHA, /* U+00bb85: */
+ RTUNI_ALPHA, /* U+00bb86: */
+ RTUNI_ALPHA, /* U+00bb87: */
+ RTUNI_ALPHA, /* U+00bb88: */
+ RTUNI_ALPHA, /* U+00bb89: */
+ RTUNI_ALPHA, /* U+00bb8a: */
+ RTUNI_ALPHA, /* U+00bb8b: */
+ RTUNI_ALPHA, /* U+00bb8c: */
+ RTUNI_ALPHA, /* U+00bb8d: */
+ RTUNI_ALPHA, /* U+00bb8e: */
+ RTUNI_ALPHA, /* U+00bb8f: */
+ RTUNI_ALPHA, /* U+00bb90: */
+ RTUNI_ALPHA, /* U+00bb91: */
+ RTUNI_ALPHA, /* U+00bb92: */
+ RTUNI_ALPHA, /* U+00bb93: */
+ RTUNI_ALPHA, /* U+00bb94: */
+ RTUNI_ALPHA, /* U+00bb95: */
+ RTUNI_ALPHA, /* U+00bb96: */
+ RTUNI_ALPHA, /* U+00bb97: */
+ RTUNI_ALPHA, /* U+00bb98: */
+ RTUNI_ALPHA, /* U+00bb99: */
+ RTUNI_ALPHA, /* U+00bb9a: */
+ RTUNI_ALPHA, /* U+00bb9b: */
+ RTUNI_ALPHA, /* U+00bb9c: */
+ RTUNI_ALPHA, /* U+00bb9d: */
+ RTUNI_ALPHA, /* U+00bb9e: */
+ RTUNI_ALPHA, /* U+00bb9f: */
+ RTUNI_ALPHA, /* U+00bba0: */
+ RTUNI_ALPHA, /* U+00bba1: */
+ RTUNI_ALPHA, /* U+00bba2: */
+ RTUNI_ALPHA, /* U+00bba3: */
+ RTUNI_ALPHA, /* U+00bba4: */
+ RTUNI_ALPHA, /* U+00bba5: */
+ RTUNI_ALPHA, /* U+00bba6: */
+ RTUNI_ALPHA, /* U+00bba7: */
+ RTUNI_ALPHA, /* U+00bba8: */
+ RTUNI_ALPHA, /* U+00bba9: */
+ RTUNI_ALPHA, /* U+00bbaa: */
+ RTUNI_ALPHA, /* U+00bbab: */
+ RTUNI_ALPHA, /* U+00bbac: */
+ RTUNI_ALPHA, /* U+00bbad: */
+ RTUNI_ALPHA, /* U+00bbae: */
+ RTUNI_ALPHA, /* U+00bbaf: */
+ RTUNI_ALPHA, /* U+00bbb0: */
+ RTUNI_ALPHA, /* U+00bbb1: */
+ RTUNI_ALPHA, /* U+00bbb2: */
+ RTUNI_ALPHA, /* U+00bbb3: */
+ RTUNI_ALPHA, /* U+00bbb4: */
+ RTUNI_ALPHA, /* U+00bbb5: */
+ RTUNI_ALPHA, /* U+00bbb6: */
+ RTUNI_ALPHA, /* U+00bbb7: */
+ RTUNI_ALPHA, /* U+00bbb8: */
+ RTUNI_ALPHA, /* U+00bbb9: */
+ RTUNI_ALPHA, /* U+00bbba: */
+ RTUNI_ALPHA, /* U+00bbbb: */
+ RTUNI_ALPHA, /* U+00bbbc: */
+ RTUNI_ALPHA, /* U+00bbbd: */
+ RTUNI_ALPHA, /* U+00bbbe: */
+ RTUNI_ALPHA, /* U+00bbbf: */
+ RTUNI_ALPHA, /* U+00bbc0: */
+ RTUNI_ALPHA, /* U+00bbc1: */
+ RTUNI_ALPHA, /* U+00bbc2: */
+ RTUNI_ALPHA, /* U+00bbc3: */
+ RTUNI_ALPHA, /* U+00bbc4: */
+ RTUNI_ALPHA, /* U+00bbc5: */
+ RTUNI_ALPHA, /* U+00bbc6: */
+ RTUNI_ALPHA, /* U+00bbc7: */
+ RTUNI_ALPHA, /* U+00bbc8: */
+ RTUNI_ALPHA, /* U+00bbc9: */
+ RTUNI_ALPHA, /* U+00bbca: */
+ RTUNI_ALPHA, /* U+00bbcb: */
+ RTUNI_ALPHA, /* U+00bbcc: */
+ RTUNI_ALPHA, /* U+00bbcd: */
+ RTUNI_ALPHA, /* U+00bbce: */
+ RTUNI_ALPHA, /* U+00bbcf: */
+ RTUNI_ALPHA, /* U+00bbd0: */
+ RTUNI_ALPHA, /* U+00bbd1: */
+ RTUNI_ALPHA, /* U+00bbd2: */
+ RTUNI_ALPHA, /* U+00bbd3: */
+ RTUNI_ALPHA, /* U+00bbd4: */
+ RTUNI_ALPHA, /* U+00bbd5: */
+ RTUNI_ALPHA, /* U+00bbd6: */
+ RTUNI_ALPHA, /* U+00bbd7: */
+ RTUNI_ALPHA, /* U+00bbd8: */
+ RTUNI_ALPHA, /* U+00bbd9: */
+ RTUNI_ALPHA, /* U+00bbda: */
+ RTUNI_ALPHA, /* U+00bbdb: */
+ RTUNI_ALPHA, /* U+00bbdc: */
+ RTUNI_ALPHA, /* U+00bbdd: */
+ RTUNI_ALPHA, /* U+00bbde: */
+ RTUNI_ALPHA, /* U+00bbdf: */
+ RTUNI_ALPHA, /* U+00bbe0: */
+ RTUNI_ALPHA, /* U+00bbe1: */
+ RTUNI_ALPHA, /* U+00bbe2: */
+ RTUNI_ALPHA, /* U+00bbe3: */
+ RTUNI_ALPHA, /* U+00bbe4: */
+ RTUNI_ALPHA, /* U+00bbe5: */
+ RTUNI_ALPHA, /* U+00bbe6: */
+ RTUNI_ALPHA, /* U+00bbe7: */
+ RTUNI_ALPHA, /* U+00bbe8: */
+ RTUNI_ALPHA, /* U+00bbe9: */
+ RTUNI_ALPHA, /* U+00bbea: */
+ RTUNI_ALPHA, /* U+00bbeb: */
+ RTUNI_ALPHA, /* U+00bbec: */
+ RTUNI_ALPHA, /* U+00bbed: */
+ RTUNI_ALPHA, /* U+00bbee: */
+ RTUNI_ALPHA, /* U+00bbef: */
+ RTUNI_ALPHA, /* U+00bbf0: */
+ RTUNI_ALPHA, /* U+00bbf1: */
+ RTUNI_ALPHA, /* U+00bbf2: */
+ RTUNI_ALPHA, /* U+00bbf3: */
+ RTUNI_ALPHA, /* U+00bbf4: */
+ RTUNI_ALPHA, /* U+00bbf5: */
+ RTUNI_ALPHA, /* U+00bbf6: */
+ RTUNI_ALPHA, /* U+00bbf7: */
+ RTUNI_ALPHA, /* U+00bbf8: */
+ RTUNI_ALPHA, /* U+00bbf9: */
+ RTUNI_ALPHA, /* U+00bbfa: */
+ RTUNI_ALPHA, /* U+00bbfb: */
+ RTUNI_ALPHA, /* U+00bbfc: */
+ RTUNI_ALPHA, /* U+00bbfd: */
+ RTUNI_ALPHA, /* U+00bbfe: */
+ RTUNI_ALPHA, /* U+00bbff: */
+ RTUNI_ALPHA, /* U+00bc00: */
+ RTUNI_ALPHA, /* U+00bc01: */
+ RTUNI_ALPHA, /* U+00bc02: */
+ RTUNI_ALPHA, /* U+00bc03: */
+ RTUNI_ALPHA, /* U+00bc04: */
+ RTUNI_ALPHA, /* U+00bc05: */
+ RTUNI_ALPHA, /* U+00bc06: */
+ RTUNI_ALPHA, /* U+00bc07: */
+ RTUNI_ALPHA, /* U+00bc08: */
+ RTUNI_ALPHA, /* U+00bc09: */
+ RTUNI_ALPHA, /* U+00bc0a: */
+ RTUNI_ALPHA, /* U+00bc0b: */
+ RTUNI_ALPHA, /* U+00bc0c: */
+ RTUNI_ALPHA, /* U+00bc0d: */
+ RTUNI_ALPHA, /* U+00bc0e: */
+ RTUNI_ALPHA, /* U+00bc0f: */
+ RTUNI_ALPHA, /* U+00bc10: */
+ RTUNI_ALPHA, /* U+00bc11: */
+ RTUNI_ALPHA, /* U+00bc12: */
+ RTUNI_ALPHA, /* U+00bc13: */
+ RTUNI_ALPHA, /* U+00bc14: */
+ RTUNI_ALPHA, /* U+00bc15: */
+ RTUNI_ALPHA, /* U+00bc16: */
+ RTUNI_ALPHA, /* U+00bc17: */
+ RTUNI_ALPHA, /* U+00bc18: */
+ RTUNI_ALPHA, /* U+00bc19: */
+ RTUNI_ALPHA, /* U+00bc1a: */
+ RTUNI_ALPHA, /* U+00bc1b: */
+ RTUNI_ALPHA, /* U+00bc1c: */
+ RTUNI_ALPHA, /* U+00bc1d: */
+ RTUNI_ALPHA, /* U+00bc1e: */
+ RTUNI_ALPHA, /* U+00bc1f: */
+ RTUNI_ALPHA, /* U+00bc20: */
+ RTUNI_ALPHA, /* U+00bc21: */
+ RTUNI_ALPHA, /* U+00bc22: */
+ RTUNI_ALPHA, /* U+00bc23: */
+ RTUNI_ALPHA, /* U+00bc24: */
+ RTUNI_ALPHA, /* U+00bc25: */
+ RTUNI_ALPHA, /* U+00bc26: */
+ RTUNI_ALPHA, /* U+00bc27: */
+ RTUNI_ALPHA, /* U+00bc28: */
+ RTUNI_ALPHA, /* U+00bc29: */
+ RTUNI_ALPHA, /* U+00bc2a: */
+ RTUNI_ALPHA, /* U+00bc2b: */
+ RTUNI_ALPHA, /* U+00bc2c: */
+ RTUNI_ALPHA, /* U+00bc2d: */
+ RTUNI_ALPHA, /* U+00bc2e: */
+ RTUNI_ALPHA, /* U+00bc2f: */
+ RTUNI_ALPHA, /* U+00bc30: */
+ RTUNI_ALPHA, /* U+00bc31: */
+ RTUNI_ALPHA, /* U+00bc32: */
+ RTUNI_ALPHA, /* U+00bc33: */
+ RTUNI_ALPHA, /* U+00bc34: */
+ RTUNI_ALPHA, /* U+00bc35: */
+ RTUNI_ALPHA, /* U+00bc36: */
+ RTUNI_ALPHA, /* U+00bc37: */
+ RTUNI_ALPHA, /* U+00bc38: */
+ RTUNI_ALPHA, /* U+00bc39: */
+ RTUNI_ALPHA, /* U+00bc3a: */
+ RTUNI_ALPHA, /* U+00bc3b: */
+ RTUNI_ALPHA, /* U+00bc3c: */
+ RTUNI_ALPHA, /* U+00bc3d: */
+ RTUNI_ALPHA, /* U+00bc3e: */
+ RTUNI_ALPHA, /* U+00bc3f: */
+ RTUNI_ALPHA, /* U+00bc40: */
+ RTUNI_ALPHA, /* U+00bc41: */
+ RTUNI_ALPHA, /* U+00bc42: */
+ RTUNI_ALPHA, /* U+00bc43: */
+ RTUNI_ALPHA, /* U+00bc44: */
+ RTUNI_ALPHA, /* U+00bc45: */
+ RTUNI_ALPHA, /* U+00bc46: */
+ RTUNI_ALPHA, /* U+00bc47: */
+ RTUNI_ALPHA, /* U+00bc48: */
+ RTUNI_ALPHA, /* U+00bc49: */
+ RTUNI_ALPHA, /* U+00bc4a: */
+ RTUNI_ALPHA, /* U+00bc4b: */
+ RTUNI_ALPHA, /* U+00bc4c: */
+ RTUNI_ALPHA, /* U+00bc4d: */
+ RTUNI_ALPHA, /* U+00bc4e: */
+ RTUNI_ALPHA, /* U+00bc4f: */
+ RTUNI_ALPHA, /* U+00bc50: */
+ RTUNI_ALPHA, /* U+00bc51: */
+ RTUNI_ALPHA, /* U+00bc52: */
+ RTUNI_ALPHA, /* U+00bc53: */
+ RTUNI_ALPHA, /* U+00bc54: */
+ RTUNI_ALPHA, /* U+00bc55: */
+ RTUNI_ALPHA, /* U+00bc56: */
+ RTUNI_ALPHA, /* U+00bc57: */
+ RTUNI_ALPHA, /* U+00bc58: */
+ RTUNI_ALPHA, /* U+00bc59: */
+ RTUNI_ALPHA, /* U+00bc5a: */
+ RTUNI_ALPHA, /* U+00bc5b: */
+ RTUNI_ALPHA, /* U+00bc5c: */
+ RTUNI_ALPHA, /* U+00bc5d: */
+ RTUNI_ALPHA, /* U+00bc5e: */
+ RTUNI_ALPHA, /* U+00bc5f: */
+ RTUNI_ALPHA, /* U+00bc60: */
+ RTUNI_ALPHA, /* U+00bc61: */
+ RTUNI_ALPHA, /* U+00bc62: */
+ RTUNI_ALPHA, /* U+00bc63: */
+ RTUNI_ALPHA, /* U+00bc64: */
+ RTUNI_ALPHA, /* U+00bc65: */
+ RTUNI_ALPHA, /* U+00bc66: */
+ RTUNI_ALPHA, /* U+00bc67: */
+ RTUNI_ALPHA, /* U+00bc68: */
+ RTUNI_ALPHA, /* U+00bc69: */
+ RTUNI_ALPHA, /* U+00bc6a: */
+ RTUNI_ALPHA, /* U+00bc6b: */
+ RTUNI_ALPHA, /* U+00bc6c: */
+ RTUNI_ALPHA, /* U+00bc6d: */
+ RTUNI_ALPHA, /* U+00bc6e: */
+ RTUNI_ALPHA, /* U+00bc6f: */
+ RTUNI_ALPHA, /* U+00bc70: */
+ RTUNI_ALPHA, /* U+00bc71: */
+ RTUNI_ALPHA, /* U+00bc72: */
+ RTUNI_ALPHA, /* U+00bc73: */
+ RTUNI_ALPHA, /* U+00bc74: */
+ RTUNI_ALPHA, /* U+00bc75: */
+ RTUNI_ALPHA, /* U+00bc76: */
+ RTUNI_ALPHA, /* U+00bc77: */
+ RTUNI_ALPHA, /* U+00bc78: */
+ RTUNI_ALPHA, /* U+00bc79: */
+ RTUNI_ALPHA, /* U+00bc7a: */
+ RTUNI_ALPHA, /* U+00bc7b: */
+ RTUNI_ALPHA, /* U+00bc7c: */
+ RTUNI_ALPHA, /* U+00bc7d: */
+ RTUNI_ALPHA, /* U+00bc7e: */
+ RTUNI_ALPHA, /* U+00bc7f: */
+ RTUNI_ALPHA, /* U+00bc80: */
+ RTUNI_ALPHA, /* U+00bc81: */
+ RTUNI_ALPHA, /* U+00bc82: */
+ RTUNI_ALPHA, /* U+00bc83: */
+ RTUNI_ALPHA, /* U+00bc84: */
+ RTUNI_ALPHA, /* U+00bc85: */
+ RTUNI_ALPHA, /* U+00bc86: */
+ RTUNI_ALPHA, /* U+00bc87: */
+ RTUNI_ALPHA, /* U+00bc88: */
+ RTUNI_ALPHA, /* U+00bc89: */
+ RTUNI_ALPHA, /* U+00bc8a: */
+ RTUNI_ALPHA, /* U+00bc8b: */
+ RTUNI_ALPHA, /* U+00bc8c: */
+ RTUNI_ALPHA, /* U+00bc8d: */
+ RTUNI_ALPHA, /* U+00bc8e: */
+ RTUNI_ALPHA, /* U+00bc8f: */
+ RTUNI_ALPHA, /* U+00bc90: */
+ RTUNI_ALPHA, /* U+00bc91: */
+ RTUNI_ALPHA, /* U+00bc92: */
+ RTUNI_ALPHA, /* U+00bc93: */
+ RTUNI_ALPHA, /* U+00bc94: */
+ RTUNI_ALPHA, /* U+00bc95: */
+ RTUNI_ALPHA, /* U+00bc96: */
+ RTUNI_ALPHA, /* U+00bc97: */
+ RTUNI_ALPHA, /* U+00bc98: */
+ RTUNI_ALPHA, /* U+00bc99: */
+ RTUNI_ALPHA, /* U+00bc9a: */
+ RTUNI_ALPHA, /* U+00bc9b: */
+ RTUNI_ALPHA, /* U+00bc9c: */
+ RTUNI_ALPHA, /* U+00bc9d: */
+ RTUNI_ALPHA, /* U+00bc9e: */
+ RTUNI_ALPHA, /* U+00bc9f: */
+ RTUNI_ALPHA, /* U+00bca0: */
+ RTUNI_ALPHA, /* U+00bca1: */
+ RTUNI_ALPHA, /* U+00bca2: */
+ RTUNI_ALPHA, /* U+00bca3: */
+ RTUNI_ALPHA, /* U+00bca4: */
+ RTUNI_ALPHA, /* U+00bca5: */
+ RTUNI_ALPHA, /* U+00bca6: */
+ RTUNI_ALPHA, /* U+00bca7: */
+ RTUNI_ALPHA, /* U+00bca8: */
+ RTUNI_ALPHA, /* U+00bca9: */
+ RTUNI_ALPHA, /* U+00bcaa: */
+ RTUNI_ALPHA, /* U+00bcab: */
+ RTUNI_ALPHA, /* U+00bcac: */
+ RTUNI_ALPHA, /* U+00bcad: */
+ RTUNI_ALPHA, /* U+00bcae: */
+ RTUNI_ALPHA, /* U+00bcaf: */
+ RTUNI_ALPHA, /* U+00bcb0: */
+ RTUNI_ALPHA, /* U+00bcb1: */
+ RTUNI_ALPHA, /* U+00bcb2: */
+ RTUNI_ALPHA, /* U+00bcb3: */
+ RTUNI_ALPHA, /* U+00bcb4: */
+ RTUNI_ALPHA, /* U+00bcb5: */
+ RTUNI_ALPHA, /* U+00bcb6: */
+ RTUNI_ALPHA, /* U+00bcb7: */
+ RTUNI_ALPHA, /* U+00bcb8: */
+ RTUNI_ALPHA, /* U+00bcb9: */
+ RTUNI_ALPHA, /* U+00bcba: */
+ RTUNI_ALPHA, /* U+00bcbb: */
+ RTUNI_ALPHA, /* U+00bcbc: */
+ RTUNI_ALPHA, /* U+00bcbd: */
+ RTUNI_ALPHA, /* U+00bcbe: */
+ RTUNI_ALPHA, /* U+00bcbf: */
+ RTUNI_ALPHA, /* U+00bcc0: */
+ RTUNI_ALPHA, /* U+00bcc1: */
+ RTUNI_ALPHA, /* U+00bcc2: */
+ RTUNI_ALPHA, /* U+00bcc3: */
+ RTUNI_ALPHA, /* U+00bcc4: */
+ RTUNI_ALPHA, /* U+00bcc5: */
+ RTUNI_ALPHA, /* U+00bcc6: */
+ RTUNI_ALPHA, /* U+00bcc7: */
+ RTUNI_ALPHA, /* U+00bcc8: */
+ RTUNI_ALPHA, /* U+00bcc9: */
+ RTUNI_ALPHA, /* U+00bcca: */
+ RTUNI_ALPHA, /* U+00bccb: */
+ RTUNI_ALPHA, /* U+00bccc: */
+ RTUNI_ALPHA, /* U+00bccd: */
+ RTUNI_ALPHA, /* U+00bcce: */
+ RTUNI_ALPHA, /* U+00bccf: */
+ RTUNI_ALPHA, /* U+00bcd0: */
+ RTUNI_ALPHA, /* U+00bcd1: */
+ RTUNI_ALPHA, /* U+00bcd2: */
+ RTUNI_ALPHA, /* U+00bcd3: */
+ RTUNI_ALPHA, /* U+00bcd4: */
+ RTUNI_ALPHA, /* U+00bcd5: */
+ RTUNI_ALPHA, /* U+00bcd6: */
+ RTUNI_ALPHA, /* U+00bcd7: */
+ RTUNI_ALPHA, /* U+00bcd8: */
+ RTUNI_ALPHA, /* U+00bcd9: */
+ RTUNI_ALPHA, /* U+00bcda: */
+ RTUNI_ALPHA, /* U+00bcdb: */
+ RTUNI_ALPHA, /* U+00bcdc: */
+ RTUNI_ALPHA, /* U+00bcdd: */
+ RTUNI_ALPHA, /* U+00bcde: */
+ RTUNI_ALPHA, /* U+00bcdf: */
+ RTUNI_ALPHA, /* U+00bce0: */
+ RTUNI_ALPHA, /* U+00bce1: */
+ RTUNI_ALPHA, /* U+00bce2: */
+ RTUNI_ALPHA, /* U+00bce3: */
+ RTUNI_ALPHA, /* U+00bce4: */
+ RTUNI_ALPHA, /* U+00bce5: */
+ RTUNI_ALPHA, /* U+00bce6: */
+ RTUNI_ALPHA, /* U+00bce7: */
+ RTUNI_ALPHA, /* U+00bce8: */
+ RTUNI_ALPHA, /* U+00bce9: */
+ RTUNI_ALPHA, /* U+00bcea: */
+ RTUNI_ALPHA, /* U+00bceb: */
+ RTUNI_ALPHA, /* U+00bcec: */
+ RTUNI_ALPHA, /* U+00bced: */
+ RTUNI_ALPHA, /* U+00bcee: */
+ RTUNI_ALPHA, /* U+00bcef: */
+ RTUNI_ALPHA, /* U+00bcf0: */
+ RTUNI_ALPHA, /* U+00bcf1: */
+ RTUNI_ALPHA, /* U+00bcf2: */
+ RTUNI_ALPHA, /* U+00bcf3: */
+ RTUNI_ALPHA, /* U+00bcf4: */
+ RTUNI_ALPHA, /* U+00bcf5: */
+ RTUNI_ALPHA, /* U+00bcf6: */
+ RTUNI_ALPHA, /* U+00bcf7: */
+ RTUNI_ALPHA, /* U+00bcf8: */
+ RTUNI_ALPHA, /* U+00bcf9: */
+ RTUNI_ALPHA, /* U+00bcfa: */
+ RTUNI_ALPHA, /* U+00bcfb: */
+ RTUNI_ALPHA, /* U+00bcfc: */
+ RTUNI_ALPHA, /* U+00bcfd: */
+ RTUNI_ALPHA, /* U+00bcfe: */
+ RTUNI_ALPHA, /* U+00bcff: */
+ RTUNI_ALPHA, /* U+00bd00: */
+ RTUNI_ALPHA, /* U+00bd01: */
+ RTUNI_ALPHA, /* U+00bd02: */
+ RTUNI_ALPHA, /* U+00bd03: */
+ RTUNI_ALPHA, /* U+00bd04: */
+ RTUNI_ALPHA, /* U+00bd05: */
+ RTUNI_ALPHA, /* U+00bd06: */
+ RTUNI_ALPHA, /* U+00bd07: */
+ RTUNI_ALPHA, /* U+00bd08: */
+ RTUNI_ALPHA, /* U+00bd09: */
+ RTUNI_ALPHA, /* U+00bd0a: */
+ RTUNI_ALPHA, /* U+00bd0b: */
+ RTUNI_ALPHA, /* U+00bd0c: */
+ RTUNI_ALPHA, /* U+00bd0d: */
+ RTUNI_ALPHA, /* U+00bd0e: */
+ RTUNI_ALPHA, /* U+00bd0f: */
+ RTUNI_ALPHA, /* U+00bd10: */
+ RTUNI_ALPHA, /* U+00bd11: */
+ RTUNI_ALPHA, /* U+00bd12: */
+ RTUNI_ALPHA, /* U+00bd13: */
+ RTUNI_ALPHA, /* U+00bd14: */
+ RTUNI_ALPHA, /* U+00bd15: */
+ RTUNI_ALPHA, /* U+00bd16: */
+ RTUNI_ALPHA, /* U+00bd17: */
+ RTUNI_ALPHA, /* U+00bd18: */
+ RTUNI_ALPHA, /* U+00bd19: */
+ RTUNI_ALPHA, /* U+00bd1a: */
+ RTUNI_ALPHA, /* U+00bd1b: */
+ RTUNI_ALPHA, /* U+00bd1c: */
+ RTUNI_ALPHA, /* U+00bd1d: */
+ RTUNI_ALPHA, /* U+00bd1e: */
+ RTUNI_ALPHA, /* U+00bd1f: */
+ RTUNI_ALPHA, /* U+00bd20: */
+ RTUNI_ALPHA, /* U+00bd21: */
+ RTUNI_ALPHA, /* U+00bd22: */
+ RTUNI_ALPHA, /* U+00bd23: */
+ RTUNI_ALPHA, /* U+00bd24: */
+ RTUNI_ALPHA, /* U+00bd25: */
+ RTUNI_ALPHA, /* U+00bd26: */
+ RTUNI_ALPHA, /* U+00bd27: */
+ RTUNI_ALPHA, /* U+00bd28: */
+ RTUNI_ALPHA, /* U+00bd29: */
+ RTUNI_ALPHA, /* U+00bd2a: */
+ RTUNI_ALPHA, /* U+00bd2b: */
+ RTUNI_ALPHA, /* U+00bd2c: */
+ RTUNI_ALPHA, /* U+00bd2d: */
+ RTUNI_ALPHA, /* U+00bd2e: */
+ RTUNI_ALPHA, /* U+00bd2f: */
+ RTUNI_ALPHA, /* U+00bd30: */
+ RTUNI_ALPHA, /* U+00bd31: */
+ RTUNI_ALPHA, /* U+00bd32: */
+ RTUNI_ALPHA, /* U+00bd33: */
+ RTUNI_ALPHA, /* U+00bd34: */
+ RTUNI_ALPHA, /* U+00bd35: */
+ RTUNI_ALPHA, /* U+00bd36: */
+ RTUNI_ALPHA, /* U+00bd37: */
+ RTUNI_ALPHA, /* U+00bd38: */
+ RTUNI_ALPHA, /* U+00bd39: */
+ RTUNI_ALPHA, /* U+00bd3a: */
+ RTUNI_ALPHA, /* U+00bd3b: */
+ RTUNI_ALPHA, /* U+00bd3c: */
+ RTUNI_ALPHA, /* U+00bd3d: */
+ RTUNI_ALPHA, /* U+00bd3e: */
+ RTUNI_ALPHA, /* U+00bd3f: */
+ RTUNI_ALPHA, /* U+00bd40: */
+ RTUNI_ALPHA, /* U+00bd41: */
+ RTUNI_ALPHA, /* U+00bd42: */
+ RTUNI_ALPHA, /* U+00bd43: */
+ RTUNI_ALPHA, /* U+00bd44: */
+ RTUNI_ALPHA, /* U+00bd45: */
+ RTUNI_ALPHA, /* U+00bd46: */
+ RTUNI_ALPHA, /* U+00bd47: */
+ RTUNI_ALPHA, /* U+00bd48: */
+ RTUNI_ALPHA, /* U+00bd49: */
+ RTUNI_ALPHA, /* U+00bd4a: */
+ RTUNI_ALPHA, /* U+00bd4b: */
+ RTUNI_ALPHA, /* U+00bd4c: */
+ RTUNI_ALPHA, /* U+00bd4d: */
+ RTUNI_ALPHA, /* U+00bd4e: */
+ RTUNI_ALPHA, /* U+00bd4f: */
+ RTUNI_ALPHA, /* U+00bd50: */
+ RTUNI_ALPHA, /* U+00bd51: */
+ RTUNI_ALPHA, /* U+00bd52: */
+ RTUNI_ALPHA, /* U+00bd53: */
+ RTUNI_ALPHA, /* U+00bd54: */
+ RTUNI_ALPHA, /* U+00bd55: */
+ RTUNI_ALPHA, /* U+00bd56: */
+ RTUNI_ALPHA, /* U+00bd57: */
+ RTUNI_ALPHA, /* U+00bd58: */
+ RTUNI_ALPHA, /* U+00bd59: */
+ RTUNI_ALPHA, /* U+00bd5a: */
+ RTUNI_ALPHA, /* U+00bd5b: */
+ RTUNI_ALPHA, /* U+00bd5c: */
+ RTUNI_ALPHA, /* U+00bd5d: */
+ RTUNI_ALPHA, /* U+00bd5e: */
+ RTUNI_ALPHA, /* U+00bd5f: */
+ RTUNI_ALPHA, /* U+00bd60: */
+ RTUNI_ALPHA, /* U+00bd61: */
+ RTUNI_ALPHA, /* U+00bd62: */
+ RTUNI_ALPHA, /* U+00bd63: */
+ RTUNI_ALPHA, /* U+00bd64: */
+ RTUNI_ALPHA, /* U+00bd65: */
+ RTUNI_ALPHA, /* U+00bd66: */
+ RTUNI_ALPHA, /* U+00bd67: */
+ RTUNI_ALPHA, /* U+00bd68: */
+ RTUNI_ALPHA, /* U+00bd69: */
+ RTUNI_ALPHA, /* U+00bd6a: */
+ RTUNI_ALPHA, /* U+00bd6b: */
+ RTUNI_ALPHA, /* U+00bd6c: */
+ RTUNI_ALPHA, /* U+00bd6d: */
+ RTUNI_ALPHA, /* U+00bd6e: */
+ RTUNI_ALPHA, /* U+00bd6f: */
+ RTUNI_ALPHA, /* U+00bd70: */
+ RTUNI_ALPHA, /* U+00bd71: */
+ RTUNI_ALPHA, /* U+00bd72: */
+ RTUNI_ALPHA, /* U+00bd73: */
+ RTUNI_ALPHA, /* U+00bd74: */
+ RTUNI_ALPHA, /* U+00bd75: */
+ RTUNI_ALPHA, /* U+00bd76: */
+ RTUNI_ALPHA, /* U+00bd77: */
+ RTUNI_ALPHA, /* U+00bd78: */
+ RTUNI_ALPHA, /* U+00bd79: */
+ RTUNI_ALPHA, /* U+00bd7a: */
+ RTUNI_ALPHA, /* U+00bd7b: */
+ RTUNI_ALPHA, /* U+00bd7c: */
+ RTUNI_ALPHA, /* U+00bd7d: */
+ RTUNI_ALPHA, /* U+00bd7e: */
+ RTUNI_ALPHA, /* U+00bd7f: */
+ RTUNI_ALPHA, /* U+00bd80: */
+ RTUNI_ALPHA, /* U+00bd81: */
+ RTUNI_ALPHA, /* U+00bd82: */
+ RTUNI_ALPHA, /* U+00bd83: */
+ RTUNI_ALPHA, /* U+00bd84: */
+ RTUNI_ALPHA, /* U+00bd85: */
+ RTUNI_ALPHA, /* U+00bd86: */
+ RTUNI_ALPHA, /* U+00bd87: */
+ RTUNI_ALPHA, /* U+00bd88: */
+ RTUNI_ALPHA, /* U+00bd89: */
+ RTUNI_ALPHA, /* U+00bd8a: */
+ RTUNI_ALPHA, /* U+00bd8b: */
+ RTUNI_ALPHA, /* U+00bd8c: */
+ RTUNI_ALPHA, /* U+00bd8d: */
+ RTUNI_ALPHA, /* U+00bd8e: */
+ RTUNI_ALPHA, /* U+00bd8f: */
+ RTUNI_ALPHA, /* U+00bd90: */
+ RTUNI_ALPHA, /* U+00bd91: */
+ RTUNI_ALPHA, /* U+00bd92: */
+ RTUNI_ALPHA, /* U+00bd93: */
+ RTUNI_ALPHA, /* U+00bd94: */
+ RTUNI_ALPHA, /* U+00bd95: */
+ RTUNI_ALPHA, /* U+00bd96: */
+ RTUNI_ALPHA, /* U+00bd97: */
+ RTUNI_ALPHA, /* U+00bd98: */
+ RTUNI_ALPHA, /* U+00bd99: */
+ RTUNI_ALPHA, /* U+00bd9a: */
+ RTUNI_ALPHA, /* U+00bd9b: */
+ RTUNI_ALPHA, /* U+00bd9c: */
+ RTUNI_ALPHA, /* U+00bd9d: */
+ RTUNI_ALPHA, /* U+00bd9e: */
+ RTUNI_ALPHA, /* U+00bd9f: */
+ RTUNI_ALPHA, /* U+00bda0: */
+ RTUNI_ALPHA, /* U+00bda1: */
+ RTUNI_ALPHA, /* U+00bda2: */
+ RTUNI_ALPHA, /* U+00bda3: */
+ RTUNI_ALPHA, /* U+00bda4: */
+ RTUNI_ALPHA, /* U+00bda5: */
+ RTUNI_ALPHA, /* U+00bda6: */
+ RTUNI_ALPHA, /* U+00bda7: */
+ RTUNI_ALPHA, /* U+00bda8: */
+ RTUNI_ALPHA, /* U+00bda9: */
+ RTUNI_ALPHA, /* U+00bdaa: */
+ RTUNI_ALPHA, /* U+00bdab: */
+ RTUNI_ALPHA, /* U+00bdac: */
+ RTUNI_ALPHA, /* U+00bdad: */
+ RTUNI_ALPHA, /* U+00bdae: */
+ RTUNI_ALPHA, /* U+00bdaf: */
+ RTUNI_ALPHA, /* U+00bdb0: */
+ RTUNI_ALPHA, /* U+00bdb1: */
+ RTUNI_ALPHA, /* U+00bdb2: */
+ RTUNI_ALPHA, /* U+00bdb3: */
+ RTUNI_ALPHA, /* U+00bdb4: */
+ RTUNI_ALPHA, /* U+00bdb5: */
+ RTUNI_ALPHA, /* U+00bdb6: */
+ RTUNI_ALPHA, /* U+00bdb7: */
+ RTUNI_ALPHA, /* U+00bdb8: */
+ RTUNI_ALPHA, /* U+00bdb9: */
+ RTUNI_ALPHA, /* U+00bdba: */
+ RTUNI_ALPHA, /* U+00bdbb: */
+ RTUNI_ALPHA, /* U+00bdbc: */
+ RTUNI_ALPHA, /* U+00bdbd: */
+ RTUNI_ALPHA, /* U+00bdbe: */
+ RTUNI_ALPHA, /* U+00bdbf: */
+ RTUNI_ALPHA, /* U+00bdc0: */
+ RTUNI_ALPHA, /* U+00bdc1: */
+ RTUNI_ALPHA, /* U+00bdc2: */
+ RTUNI_ALPHA, /* U+00bdc3: */
+ RTUNI_ALPHA, /* U+00bdc4: */
+ RTUNI_ALPHA, /* U+00bdc5: */
+ RTUNI_ALPHA, /* U+00bdc6: */
+ RTUNI_ALPHA, /* U+00bdc7: */
+ RTUNI_ALPHA, /* U+00bdc8: */
+ RTUNI_ALPHA, /* U+00bdc9: */
+ RTUNI_ALPHA, /* U+00bdca: */
+ RTUNI_ALPHA, /* U+00bdcb: */
+ RTUNI_ALPHA, /* U+00bdcc: */
+ RTUNI_ALPHA, /* U+00bdcd: */
+ RTUNI_ALPHA, /* U+00bdce: */
+ RTUNI_ALPHA, /* U+00bdcf: */
+ RTUNI_ALPHA, /* U+00bdd0: */
+ RTUNI_ALPHA, /* U+00bdd1: */
+ RTUNI_ALPHA, /* U+00bdd2: */
+ RTUNI_ALPHA, /* U+00bdd3: */
+ RTUNI_ALPHA, /* U+00bdd4: */
+ RTUNI_ALPHA, /* U+00bdd5: */
+ RTUNI_ALPHA, /* U+00bdd6: */
+ RTUNI_ALPHA, /* U+00bdd7: */
+ RTUNI_ALPHA, /* U+00bdd8: */
+ RTUNI_ALPHA, /* U+00bdd9: */
+ RTUNI_ALPHA, /* U+00bdda: */
+ RTUNI_ALPHA, /* U+00bddb: */
+ RTUNI_ALPHA, /* U+00bddc: */
+ RTUNI_ALPHA, /* U+00bddd: */
+ RTUNI_ALPHA, /* U+00bdde: */
+ RTUNI_ALPHA, /* U+00bddf: */
+ RTUNI_ALPHA, /* U+00bde0: */
+ RTUNI_ALPHA, /* U+00bde1: */
+ RTUNI_ALPHA, /* U+00bde2: */
+ RTUNI_ALPHA, /* U+00bde3: */
+ RTUNI_ALPHA, /* U+00bde4: */
+ RTUNI_ALPHA, /* U+00bde5: */
+ RTUNI_ALPHA, /* U+00bde6: */
+ RTUNI_ALPHA, /* U+00bde7: */
+ RTUNI_ALPHA, /* U+00bde8: */
+ RTUNI_ALPHA, /* U+00bde9: */
+ RTUNI_ALPHA, /* U+00bdea: */
+ RTUNI_ALPHA, /* U+00bdeb: */
+ RTUNI_ALPHA, /* U+00bdec: */
+ RTUNI_ALPHA, /* U+00bded: */
+ RTUNI_ALPHA, /* U+00bdee: */
+ RTUNI_ALPHA, /* U+00bdef: */
+ RTUNI_ALPHA, /* U+00bdf0: */
+ RTUNI_ALPHA, /* U+00bdf1: */
+ RTUNI_ALPHA, /* U+00bdf2: */
+ RTUNI_ALPHA, /* U+00bdf3: */
+ RTUNI_ALPHA, /* U+00bdf4: */
+ RTUNI_ALPHA, /* U+00bdf5: */
+ RTUNI_ALPHA, /* U+00bdf6: */
+ RTUNI_ALPHA, /* U+00bdf7: */
+ RTUNI_ALPHA, /* U+00bdf8: */
+ RTUNI_ALPHA, /* U+00bdf9: */
+ RTUNI_ALPHA, /* U+00bdfa: */
+ RTUNI_ALPHA, /* U+00bdfb: */
+ RTUNI_ALPHA, /* U+00bdfc: */
+ RTUNI_ALPHA, /* U+00bdfd: */
+ RTUNI_ALPHA, /* U+00bdfe: */
+ RTUNI_ALPHA, /* U+00bdff: */
+ RTUNI_ALPHA, /* U+00be00: */
+ RTUNI_ALPHA, /* U+00be01: */
+ RTUNI_ALPHA, /* U+00be02: */
+ RTUNI_ALPHA, /* U+00be03: */
+ RTUNI_ALPHA, /* U+00be04: */
+ RTUNI_ALPHA, /* U+00be05: */
+ RTUNI_ALPHA, /* U+00be06: */
+ RTUNI_ALPHA, /* U+00be07: */
+ RTUNI_ALPHA, /* U+00be08: */
+ RTUNI_ALPHA, /* U+00be09: */
+ RTUNI_ALPHA, /* U+00be0a: */
+ RTUNI_ALPHA, /* U+00be0b: */
+ RTUNI_ALPHA, /* U+00be0c: */
+ RTUNI_ALPHA, /* U+00be0d: */
+ RTUNI_ALPHA, /* U+00be0e: */
+ RTUNI_ALPHA, /* U+00be0f: */
+ RTUNI_ALPHA, /* U+00be10: */
+ RTUNI_ALPHA, /* U+00be11: */
+ RTUNI_ALPHA, /* U+00be12: */
+ RTUNI_ALPHA, /* U+00be13: */
+ RTUNI_ALPHA, /* U+00be14: */
+ RTUNI_ALPHA, /* U+00be15: */
+ RTUNI_ALPHA, /* U+00be16: */
+ RTUNI_ALPHA, /* U+00be17: */
+ RTUNI_ALPHA, /* U+00be18: */
+ RTUNI_ALPHA, /* U+00be19: */
+ RTUNI_ALPHA, /* U+00be1a: */
+ RTUNI_ALPHA, /* U+00be1b: */
+ RTUNI_ALPHA, /* U+00be1c: */
+ RTUNI_ALPHA, /* U+00be1d: */
+ RTUNI_ALPHA, /* U+00be1e: */
+ RTUNI_ALPHA, /* U+00be1f: */
+ RTUNI_ALPHA, /* U+00be20: */
+ RTUNI_ALPHA, /* U+00be21: */
+ RTUNI_ALPHA, /* U+00be22: */
+ RTUNI_ALPHA, /* U+00be23: */
+ RTUNI_ALPHA, /* U+00be24: */
+ RTUNI_ALPHA, /* U+00be25: */
+ RTUNI_ALPHA, /* U+00be26: */
+ RTUNI_ALPHA, /* U+00be27: */
+ RTUNI_ALPHA, /* U+00be28: */
+ RTUNI_ALPHA, /* U+00be29: */
+ RTUNI_ALPHA, /* U+00be2a: */
+ RTUNI_ALPHA, /* U+00be2b: */
+ RTUNI_ALPHA, /* U+00be2c: */
+ RTUNI_ALPHA, /* U+00be2d: */
+ RTUNI_ALPHA, /* U+00be2e: */
+ RTUNI_ALPHA, /* U+00be2f: */
+ RTUNI_ALPHA, /* U+00be30: */
+ RTUNI_ALPHA, /* U+00be31: */
+ RTUNI_ALPHA, /* U+00be32: */
+ RTUNI_ALPHA, /* U+00be33: */
+ RTUNI_ALPHA, /* U+00be34: */
+ RTUNI_ALPHA, /* U+00be35: */
+ RTUNI_ALPHA, /* U+00be36: */
+ RTUNI_ALPHA, /* U+00be37: */
+ RTUNI_ALPHA, /* U+00be38: */
+ RTUNI_ALPHA, /* U+00be39: */
+ RTUNI_ALPHA, /* U+00be3a: */
+ RTUNI_ALPHA, /* U+00be3b: */
+ RTUNI_ALPHA, /* U+00be3c: */
+ RTUNI_ALPHA, /* U+00be3d: */
+ RTUNI_ALPHA, /* U+00be3e: */
+ RTUNI_ALPHA, /* U+00be3f: */
+ RTUNI_ALPHA, /* U+00be40: */
+ RTUNI_ALPHA, /* U+00be41: */
+ RTUNI_ALPHA, /* U+00be42: */
+ RTUNI_ALPHA, /* U+00be43: */
+ RTUNI_ALPHA, /* U+00be44: */
+ RTUNI_ALPHA, /* U+00be45: */
+ RTUNI_ALPHA, /* U+00be46: */
+ RTUNI_ALPHA, /* U+00be47: */
+ RTUNI_ALPHA, /* U+00be48: */
+ RTUNI_ALPHA, /* U+00be49: */
+ RTUNI_ALPHA, /* U+00be4a: */
+ RTUNI_ALPHA, /* U+00be4b: */
+ RTUNI_ALPHA, /* U+00be4c: */
+ RTUNI_ALPHA, /* U+00be4d: */
+ RTUNI_ALPHA, /* U+00be4e: */
+ RTUNI_ALPHA, /* U+00be4f: */
+ RTUNI_ALPHA, /* U+00be50: */
+ RTUNI_ALPHA, /* U+00be51: */
+ RTUNI_ALPHA, /* U+00be52: */
+ RTUNI_ALPHA, /* U+00be53: */
+ RTUNI_ALPHA, /* U+00be54: */
+ RTUNI_ALPHA, /* U+00be55: */
+ RTUNI_ALPHA, /* U+00be56: */
+ RTUNI_ALPHA, /* U+00be57: */
+ RTUNI_ALPHA, /* U+00be58: */
+ RTUNI_ALPHA, /* U+00be59: */
+ RTUNI_ALPHA, /* U+00be5a: */
+ RTUNI_ALPHA, /* U+00be5b: */
+ RTUNI_ALPHA, /* U+00be5c: */
+ RTUNI_ALPHA, /* U+00be5d: */
+ RTUNI_ALPHA, /* U+00be5e: */
+ RTUNI_ALPHA, /* U+00be5f: */
+ RTUNI_ALPHA, /* U+00be60: */
+ RTUNI_ALPHA, /* U+00be61: */
+ RTUNI_ALPHA, /* U+00be62: */
+ RTUNI_ALPHA, /* U+00be63: */
+ RTUNI_ALPHA, /* U+00be64: */
+ RTUNI_ALPHA, /* U+00be65: */
+ RTUNI_ALPHA, /* U+00be66: */
+ RTUNI_ALPHA, /* U+00be67: */
+ RTUNI_ALPHA, /* U+00be68: */
+ RTUNI_ALPHA, /* U+00be69: */
+ RTUNI_ALPHA, /* U+00be6a: */
+ RTUNI_ALPHA, /* U+00be6b: */
+ RTUNI_ALPHA, /* U+00be6c: */
+ RTUNI_ALPHA, /* U+00be6d: */
+ RTUNI_ALPHA, /* U+00be6e: */
+ RTUNI_ALPHA, /* U+00be6f: */
+ RTUNI_ALPHA, /* U+00be70: */
+ RTUNI_ALPHA, /* U+00be71: */
+ RTUNI_ALPHA, /* U+00be72: */
+ RTUNI_ALPHA, /* U+00be73: */
+ RTUNI_ALPHA, /* U+00be74: */
+ RTUNI_ALPHA, /* U+00be75: */
+ RTUNI_ALPHA, /* U+00be76: */
+ RTUNI_ALPHA, /* U+00be77: */
+ RTUNI_ALPHA, /* U+00be78: */
+ RTUNI_ALPHA, /* U+00be79: */
+ RTUNI_ALPHA, /* U+00be7a: */
+ RTUNI_ALPHA, /* U+00be7b: */
+ RTUNI_ALPHA, /* U+00be7c: */
+ RTUNI_ALPHA, /* U+00be7d: */
+ RTUNI_ALPHA, /* U+00be7e: */
+ RTUNI_ALPHA, /* U+00be7f: */
+ RTUNI_ALPHA, /* U+00be80: */
+ RTUNI_ALPHA, /* U+00be81: */
+ RTUNI_ALPHA, /* U+00be82: */
+ RTUNI_ALPHA, /* U+00be83: */
+ RTUNI_ALPHA, /* U+00be84: */
+ RTUNI_ALPHA, /* U+00be85: */
+ RTUNI_ALPHA, /* U+00be86: */
+ RTUNI_ALPHA, /* U+00be87: */
+ RTUNI_ALPHA, /* U+00be88: */
+ RTUNI_ALPHA, /* U+00be89: */
+ RTUNI_ALPHA, /* U+00be8a: */
+ RTUNI_ALPHA, /* U+00be8b: */
+ RTUNI_ALPHA, /* U+00be8c: */
+ RTUNI_ALPHA, /* U+00be8d: */
+ RTUNI_ALPHA, /* U+00be8e: */
+ RTUNI_ALPHA, /* U+00be8f: */
+ RTUNI_ALPHA, /* U+00be90: */
+ RTUNI_ALPHA, /* U+00be91: */
+ RTUNI_ALPHA, /* U+00be92: */
+ RTUNI_ALPHA, /* U+00be93: */
+ RTUNI_ALPHA, /* U+00be94: */
+ RTUNI_ALPHA, /* U+00be95: */
+ RTUNI_ALPHA, /* U+00be96: */
+ RTUNI_ALPHA, /* U+00be97: */
+ RTUNI_ALPHA, /* U+00be98: */
+ RTUNI_ALPHA, /* U+00be99: */
+ RTUNI_ALPHA, /* U+00be9a: */
+ RTUNI_ALPHA, /* U+00be9b: */
+ RTUNI_ALPHA, /* U+00be9c: */
+ RTUNI_ALPHA, /* U+00be9d: */
+ RTUNI_ALPHA, /* U+00be9e: */
+ RTUNI_ALPHA, /* U+00be9f: */
+ RTUNI_ALPHA, /* U+00bea0: */
+ RTUNI_ALPHA, /* U+00bea1: */
+ RTUNI_ALPHA, /* U+00bea2: */
+ RTUNI_ALPHA, /* U+00bea3: */
+ RTUNI_ALPHA, /* U+00bea4: */
+ RTUNI_ALPHA, /* U+00bea5: */
+ RTUNI_ALPHA, /* U+00bea6: */
+ RTUNI_ALPHA, /* U+00bea7: */
+ RTUNI_ALPHA, /* U+00bea8: */
+ RTUNI_ALPHA, /* U+00bea9: */
+ RTUNI_ALPHA, /* U+00beaa: */
+ RTUNI_ALPHA, /* U+00beab: */
+ RTUNI_ALPHA, /* U+00beac: */
+ RTUNI_ALPHA, /* U+00bead: */
+ RTUNI_ALPHA, /* U+00beae: */
+ RTUNI_ALPHA, /* U+00beaf: */
+ RTUNI_ALPHA, /* U+00beb0: */
+ RTUNI_ALPHA, /* U+00beb1: */
+ RTUNI_ALPHA, /* U+00beb2: */
+ RTUNI_ALPHA, /* U+00beb3: */
+ RTUNI_ALPHA, /* U+00beb4: */
+ RTUNI_ALPHA, /* U+00beb5: */
+ RTUNI_ALPHA, /* U+00beb6: */
+ RTUNI_ALPHA, /* U+00beb7: */
+ RTUNI_ALPHA, /* U+00beb8: */
+ RTUNI_ALPHA, /* U+00beb9: */
+ RTUNI_ALPHA, /* U+00beba: */
+ RTUNI_ALPHA, /* U+00bebb: */
+ RTUNI_ALPHA, /* U+00bebc: */
+ RTUNI_ALPHA, /* U+00bebd: */
+ RTUNI_ALPHA, /* U+00bebe: */
+ RTUNI_ALPHA, /* U+00bebf: */
+ RTUNI_ALPHA, /* U+00bec0: */
+ RTUNI_ALPHA, /* U+00bec1: */
+ RTUNI_ALPHA, /* U+00bec2: */
+ RTUNI_ALPHA, /* U+00bec3: */
+ RTUNI_ALPHA, /* U+00bec4: */
+ RTUNI_ALPHA, /* U+00bec5: */
+ RTUNI_ALPHA, /* U+00bec6: */
+ RTUNI_ALPHA, /* U+00bec7: */
+ RTUNI_ALPHA, /* U+00bec8: */
+ RTUNI_ALPHA, /* U+00bec9: */
+ RTUNI_ALPHA, /* U+00beca: */
+ RTUNI_ALPHA, /* U+00becb: */
+ RTUNI_ALPHA, /* U+00becc: */
+ RTUNI_ALPHA, /* U+00becd: */
+ RTUNI_ALPHA, /* U+00bece: */
+ RTUNI_ALPHA, /* U+00becf: */
+ RTUNI_ALPHA, /* U+00bed0: */
+ RTUNI_ALPHA, /* U+00bed1: */
+ RTUNI_ALPHA, /* U+00bed2: */
+ RTUNI_ALPHA, /* U+00bed3: */
+ RTUNI_ALPHA, /* U+00bed4: */
+ RTUNI_ALPHA, /* U+00bed5: */
+ RTUNI_ALPHA, /* U+00bed6: */
+ RTUNI_ALPHA, /* U+00bed7: */
+ RTUNI_ALPHA, /* U+00bed8: */
+ RTUNI_ALPHA, /* U+00bed9: */
+ RTUNI_ALPHA, /* U+00beda: */
+ RTUNI_ALPHA, /* U+00bedb: */
+ RTUNI_ALPHA, /* U+00bedc: */
+ RTUNI_ALPHA, /* U+00bedd: */
+ RTUNI_ALPHA, /* U+00bede: */
+ RTUNI_ALPHA, /* U+00bedf: */
+ RTUNI_ALPHA, /* U+00bee0: */
+ RTUNI_ALPHA, /* U+00bee1: */
+ RTUNI_ALPHA, /* U+00bee2: */
+ RTUNI_ALPHA, /* U+00bee3: */
+ RTUNI_ALPHA, /* U+00bee4: */
+ RTUNI_ALPHA, /* U+00bee5: */
+ RTUNI_ALPHA, /* U+00bee6: */
+ RTUNI_ALPHA, /* U+00bee7: */
+ RTUNI_ALPHA, /* U+00bee8: */
+ RTUNI_ALPHA, /* U+00bee9: */
+ RTUNI_ALPHA, /* U+00beea: */
+ RTUNI_ALPHA, /* U+00beeb: */
+ RTUNI_ALPHA, /* U+00beec: */
+ RTUNI_ALPHA, /* U+00beed: */
+ RTUNI_ALPHA, /* U+00beee: */
+ RTUNI_ALPHA, /* U+00beef: */
+ RTUNI_ALPHA, /* U+00bef0: */
+ RTUNI_ALPHA, /* U+00bef1: */
+ RTUNI_ALPHA, /* U+00bef2: */
+ RTUNI_ALPHA, /* U+00bef3: */
+ RTUNI_ALPHA, /* U+00bef4: */
+ RTUNI_ALPHA, /* U+00bef5: */
+ RTUNI_ALPHA, /* U+00bef6: */
+ RTUNI_ALPHA, /* U+00bef7: */
+ RTUNI_ALPHA, /* U+00bef8: */
+ RTUNI_ALPHA, /* U+00bef9: */
+ RTUNI_ALPHA, /* U+00befa: */
+ RTUNI_ALPHA, /* U+00befb: */
+ RTUNI_ALPHA, /* U+00befc: */
+ RTUNI_ALPHA, /* U+00befd: */
+ RTUNI_ALPHA, /* U+00befe: */
+ RTUNI_ALPHA, /* U+00beff: */
+ RTUNI_ALPHA, /* U+00bf00: */
+ RTUNI_ALPHA, /* U+00bf01: */
+ RTUNI_ALPHA, /* U+00bf02: */
+ RTUNI_ALPHA, /* U+00bf03: */
+ RTUNI_ALPHA, /* U+00bf04: */
+ RTUNI_ALPHA, /* U+00bf05: */
+ RTUNI_ALPHA, /* U+00bf06: */
+ RTUNI_ALPHA, /* U+00bf07: */
+ RTUNI_ALPHA, /* U+00bf08: */
+ RTUNI_ALPHA, /* U+00bf09: */
+ RTUNI_ALPHA, /* U+00bf0a: */
+ RTUNI_ALPHA, /* U+00bf0b: */
+ RTUNI_ALPHA, /* U+00bf0c: */
+ RTUNI_ALPHA, /* U+00bf0d: */
+ RTUNI_ALPHA, /* U+00bf0e: */
+ RTUNI_ALPHA, /* U+00bf0f: */
+ RTUNI_ALPHA, /* U+00bf10: */
+ RTUNI_ALPHA, /* U+00bf11: */
+ RTUNI_ALPHA, /* U+00bf12: */
+ RTUNI_ALPHA, /* U+00bf13: */
+ RTUNI_ALPHA, /* U+00bf14: */
+ RTUNI_ALPHA, /* U+00bf15: */
+ RTUNI_ALPHA, /* U+00bf16: */
+ RTUNI_ALPHA, /* U+00bf17: */
+ RTUNI_ALPHA, /* U+00bf18: */
+ RTUNI_ALPHA, /* U+00bf19: */
+ RTUNI_ALPHA, /* U+00bf1a: */
+ RTUNI_ALPHA, /* U+00bf1b: */
+ RTUNI_ALPHA, /* U+00bf1c: */
+ RTUNI_ALPHA, /* U+00bf1d: */
+ RTUNI_ALPHA, /* U+00bf1e: */
+ RTUNI_ALPHA, /* U+00bf1f: */
+ RTUNI_ALPHA, /* U+00bf20: */
+ RTUNI_ALPHA, /* U+00bf21: */
+ RTUNI_ALPHA, /* U+00bf22: */
+ RTUNI_ALPHA, /* U+00bf23: */
+ RTUNI_ALPHA, /* U+00bf24: */
+ RTUNI_ALPHA, /* U+00bf25: */
+ RTUNI_ALPHA, /* U+00bf26: */
+ RTUNI_ALPHA, /* U+00bf27: */
+ RTUNI_ALPHA, /* U+00bf28: */
+ RTUNI_ALPHA, /* U+00bf29: */
+ RTUNI_ALPHA, /* U+00bf2a: */
+ RTUNI_ALPHA, /* U+00bf2b: */
+ RTUNI_ALPHA, /* U+00bf2c: */
+ RTUNI_ALPHA, /* U+00bf2d: */
+ RTUNI_ALPHA, /* U+00bf2e: */
+ RTUNI_ALPHA, /* U+00bf2f: */
+ RTUNI_ALPHA, /* U+00bf30: */
+ RTUNI_ALPHA, /* U+00bf31: */
+ RTUNI_ALPHA, /* U+00bf32: */
+ RTUNI_ALPHA, /* U+00bf33: */
+ RTUNI_ALPHA, /* U+00bf34: */
+ RTUNI_ALPHA, /* U+00bf35: */
+ RTUNI_ALPHA, /* U+00bf36: */
+ RTUNI_ALPHA, /* U+00bf37: */
+ RTUNI_ALPHA, /* U+00bf38: */
+ RTUNI_ALPHA, /* U+00bf39: */
+ RTUNI_ALPHA, /* U+00bf3a: */
+ RTUNI_ALPHA, /* U+00bf3b: */
+ RTUNI_ALPHA, /* U+00bf3c: */
+ RTUNI_ALPHA, /* U+00bf3d: */
+ RTUNI_ALPHA, /* U+00bf3e: */
+ RTUNI_ALPHA, /* U+00bf3f: */
+ RTUNI_ALPHA, /* U+00bf40: */
+ RTUNI_ALPHA, /* U+00bf41: */
+ RTUNI_ALPHA, /* U+00bf42: */
+ RTUNI_ALPHA, /* U+00bf43: */
+ RTUNI_ALPHA, /* U+00bf44: */
+ RTUNI_ALPHA, /* U+00bf45: */
+ RTUNI_ALPHA, /* U+00bf46: */
+ RTUNI_ALPHA, /* U+00bf47: */
+ RTUNI_ALPHA, /* U+00bf48: */
+ RTUNI_ALPHA, /* U+00bf49: */
+ RTUNI_ALPHA, /* U+00bf4a: */
+ RTUNI_ALPHA, /* U+00bf4b: */
+ RTUNI_ALPHA, /* U+00bf4c: */
+ RTUNI_ALPHA, /* U+00bf4d: */
+ RTUNI_ALPHA, /* U+00bf4e: */
+ RTUNI_ALPHA, /* U+00bf4f: */
+ RTUNI_ALPHA, /* U+00bf50: */
+ RTUNI_ALPHA, /* U+00bf51: */
+ RTUNI_ALPHA, /* U+00bf52: */
+ RTUNI_ALPHA, /* U+00bf53: */
+ RTUNI_ALPHA, /* U+00bf54: */
+ RTUNI_ALPHA, /* U+00bf55: */
+ RTUNI_ALPHA, /* U+00bf56: */
+ RTUNI_ALPHA, /* U+00bf57: */
+ RTUNI_ALPHA, /* U+00bf58: */
+ RTUNI_ALPHA, /* U+00bf59: */
+ RTUNI_ALPHA, /* U+00bf5a: */
+ RTUNI_ALPHA, /* U+00bf5b: */
+ RTUNI_ALPHA, /* U+00bf5c: */
+ RTUNI_ALPHA, /* U+00bf5d: */
+ RTUNI_ALPHA, /* U+00bf5e: */
+ RTUNI_ALPHA, /* U+00bf5f: */
+ RTUNI_ALPHA, /* U+00bf60: */
+ RTUNI_ALPHA, /* U+00bf61: */
+ RTUNI_ALPHA, /* U+00bf62: */
+ RTUNI_ALPHA, /* U+00bf63: */
+ RTUNI_ALPHA, /* U+00bf64: */
+ RTUNI_ALPHA, /* U+00bf65: */
+ RTUNI_ALPHA, /* U+00bf66: */
+ RTUNI_ALPHA, /* U+00bf67: */
+ RTUNI_ALPHA, /* U+00bf68: */
+ RTUNI_ALPHA, /* U+00bf69: */
+ RTUNI_ALPHA, /* U+00bf6a: */
+ RTUNI_ALPHA, /* U+00bf6b: */
+ RTUNI_ALPHA, /* U+00bf6c: */
+ RTUNI_ALPHA, /* U+00bf6d: */
+ RTUNI_ALPHA, /* U+00bf6e: */
+ RTUNI_ALPHA, /* U+00bf6f: */
+ RTUNI_ALPHA, /* U+00bf70: */
+ RTUNI_ALPHA, /* U+00bf71: */
+ RTUNI_ALPHA, /* U+00bf72: */
+ RTUNI_ALPHA, /* U+00bf73: */
+ RTUNI_ALPHA, /* U+00bf74: */
+ RTUNI_ALPHA, /* U+00bf75: */
+ RTUNI_ALPHA, /* U+00bf76: */
+ RTUNI_ALPHA, /* U+00bf77: */
+ RTUNI_ALPHA, /* U+00bf78: */
+ RTUNI_ALPHA, /* U+00bf79: */
+ RTUNI_ALPHA, /* U+00bf7a: */
+ RTUNI_ALPHA, /* U+00bf7b: */
+ RTUNI_ALPHA, /* U+00bf7c: */
+ RTUNI_ALPHA, /* U+00bf7d: */
+ RTUNI_ALPHA, /* U+00bf7e: */
+ RTUNI_ALPHA, /* U+00bf7f: */
+ RTUNI_ALPHA, /* U+00bf80: */
+ RTUNI_ALPHA, /* U+00bf81: */
+ RTUNI_ALPHA, /* U+00bf82: */
+ RTUNI_ALPHA, /* U+00bf83: */
+ RTUNI_ALPHA, /* U+00bf84: */
+ RTUNI_ALPHA, /* U+00bf85: */
+ RTUNI_ALPHA, /* U+00bf86: */
+ RTUNI_ALPHA, /* U+00bf87: */
+ RTUNI_ALPHA, /* U+00bf88: */
+ RTUNI_ALPHA, /* U+00bf89: */
+ RTUNI_ALPHA, /* U+00bf8a: */
+ RTUNI_ALPHA, /* U+00bf8b: */
+ RTUNI_ALPHA, /* U+00bf8c: */
+ RTUNI_ALPHA, /* U+00bf8d: */
+ RTUNI_ALPHA, /* U+00bf8e: */
+ RTUNI_ALPHA, /* U+00bf8f: */
+ RTUNI_ALPHA, /* U+00bf90: */
+ RTUNI_ALPHA, /* U+00bf91: */
+ RTUNI_ALPHA, /* U+00bf92: */
+ RTUNI_ALPHA, /* U+00bf93: */
+ RTUNI_ALPHA, /* U+00bf94: */
+ RTUNI_ALPHA, /* U+00bf95: */
+ RTUNI_ALPHA, /* U+00bf96: */
+ RTUNI_ALPHA, /* U+00bf97: */
+ RTUNI_ALPHA, /* U+00bf98: */
+ RTUNI_ALPHA, /* U+00bf99: */
+ RTUNI_ALPHA, /* U+00bf9a: */
+ RTUNI_ALPHA, /* U+00bf9b: */
+ RTUNI_ALPHA, /* U+00bf9c: */
+ RTUNI_ALPHA, /* U+00bf9d: */
+ RTUNI_ALPHA, /* U+00bf9e: */
+ RTUNI_ALPHA, /* U+00bf9f: */
+ RTUNI_ALPHA, /* U+00bfa0: */
+ RTUNI_ALPHA, /* U+00bfa1: */
+ RTUNI_ALPHA, /* U+00bfa2: */
+ RTUNI_ALPHA, /* U+00bfa3: */
+ RTUNI_ALPHA, /* U+00bfa4: */
+ RTUNI_ALPHA, /* U+00bfa5: */
+ RTUNI_ALPHA, /* U+00bfa6: */
+ RTUNI_ALPHA, /* U+00bfa7: */
+ RTUNI_ALPHA, /* U+00bfa8: */
+ RTUNI_ALPHA, /* U+00bfa9: */
+ RTUNI_ALPHA, /* U+00bfaa: */
+ RTUNI_ALPHA, /* U+00bfab: */
+ RTUNI_ALPHA, /* U+00bfac: */
+ RTUNI_ALPHA, /* U+00bfad: */
+ RTUNI_ALPHA, /* U+00bfae: */
+ RTUNI_ALPHA, /* U+00bfaf: */
+ RTUNI_ALPHA, /* U+00bfb0: */
+ RTUNI_ALPHA, /* U+00bfb1: */
+ RTUNI_ALPHA, /* U+00bfb2: */
+ RTUNI_ALPHA, /* U+00bfb3: */
+ RTUNI_ALPHA, /* U+00bfb4: */
+ RTUNI_ALPHA, /* U+00bfb5: */
+ RTUNI_ALPHA, /* U+00bfb6: */
+ RTUNI_ALPHA, /* U+00bfb7: */
+ RTUNI_ALPHA, /* U+00bfb8: */
+ RTUNI_ALPHA, /* U+00bfb9: */
+ RTUNI_ALPHA, /* U+00bfba: */
+ RTUNI_ALPHA, /* U+00bfbb: */
+ RTUNI_ALPHA, /* U+00bfbc: */
+ RTUNI_ALPHA, /* U+00bfbd: */
+ RTUNI_ALPHA, /* U+00bfbe: */
+ RTUNI_ALPHA, /* U+00bfbf: */
+ RTUNI_ALPHA, /* U+00bfc0: */
+ RTUNI_ALPHA, /* U+00bfc1: */
+ RTUNI_ALPHA, /* U+00bfc2: */
+ RTUNI_ALPHA, /* U+00bfc3: */
+ RTUNI_ALPHA, /* U+00bfc4: */
+ RTUNI_ALPHA, /* U+00bfc5: */
+ RTUNI_ALPHA, /* U+00bfc6: */
+ RTUNI_ALPHA, /* U+00bfc7: */
+ RTUNI_ALPHA, /* U+00bfc8: */
+ RTUNI_ALPHA, /* U+00bfc9: */
+ RTUNI_ALPHA, /* U+00bfca: */
+ RTUNI_ALPHA, /* U+00bfcb: */
+ RTUNI_ALPHA, /* U+00bfcc: */
+ RTUNI_ALPHA, /* U+00bfcd: */
+ RTUNI_ALPHA, /* U+00bfce: */
+ RTUNI_ALPHA, /* U+00bfcf: */
+ RTUNI_ALPHA, /* U+00bfd0: */
+ RTUNI_ALPHA, /* U+00bfd1: */
+ RTUNI_ALPHA, /* U+00bfd2: */
+ RTUNI_ALPHA, /* U+00bfd3: */
+ RTUNI_ALPHA, /* U+00bfd4: */
+ RTUNI_ALPHA, /* U+00bfd5: */
+ RTUNI_ALPHA, /* U+00bfd6: */
+ RTUNI_ALPHA, /* U+00bfd7: */
+ RTUNI_ALPHA, /* U+00bfd8: */
+ RTUNI_ALPHA, /* U+00bfd9: */
+ RTUNI_ALPHA, /* U+00bfda: */
+ RTUNI_ALPHA, /* U+00bfdb: */
+ RTUNI_ALPHA, /* U+00bfdc: */
+ RTUNI_ALPHA, /* U+00bfdd: */
+ RTUNI_ALPHA, /* U+00bfde: */
+ RTUNI_ALPHA, /* U+00bfdf: */
+ RTUNI_ALPHA, /* U+00bfe0: */
+ RTUNI_ALPHA, /* U+00bfe1: */
+ RTUNI_ALPHA, /* U+00bfe2: */
+ RTUNI_ALPHA, /* U+00bfe3: */
+ RTUNI_ALPHA, /* U+00bfe4: */
+ RTUNI_ALPHA, /* U+00bfe5: */
+ RTUNI_ALPHA, /* U+00bfe6: */
+ RTUNI_ALPHA, /* U+00bfe7: */
+ RTUNI_ALPHA, /* U+00bfe8: */
+ RTUNI_ALPHA, /* U+00bfe9: */
+ RTUNI_ALPHA, /* U+00bfea: */
+ RTUNI_ALPHA, /* U+00bfeb: */
+ RTUNI_ALPHA, /* U+00bfec: */
+ RTUNI_ALPHA, /* U+00bfed: */
+ RTUNI_ALPHA, /* U+00bfee: */
+ RTUNI_ALPHA, /* U+00bfef: */
+ RTUNI_ALPHA, /* U+00bff0: */
+ RTUNI_ALPHA, /* U+00bff1: */
+ RTUNI_ALPHA, /* U+00bff2: */
+ RTUNI_ALPHA, /* U+00bff3: */
+ RTUNI_ALPHA, /* U+00bff4: */
+ RTUNI_ALPHA, /* U+00bff5: */
+ RTUNI_ALPHA, /* U+00bff6: */
+ RTUNI_ALPHA, /* U+00bff7: */
+ RTUNI_ALPHA, /* U+00bff8: */
+ RTUNI_ALPHA, /* U+00bff9: */
+ RTUNI_ALPHA, /* U+00bffa: */
+ RTUNI_ALPHA, /* U+00bffb: */
+ RTUNI_ALPHA, /* U+00bffc: */
+ RTUNI_ALPHA, /* U+00bffd: */
+ RTUNI_ALPHA, /* U+00bffe: */
+ RTUNI_ALPHA, /* U+00bfff: */
+ RTUNI_ALPHA, /* U+00c000: */
+ RTUNI_ALPHA, /* U+00c001: */
+ RTUNI_ALPHA, /* U+00c002: */
+ RTUNI_ALPHA, /* U+00c003: */
+ RTUNI_ALPHA, /* U+00c004: */
+ RTUNI_ALPHA, /* U+00c005: */
+ RTUNI_ALPHA, /* U+00c006: */
+ RTUNI_ALPHA, /* U+00c007: */
+ RTUNI_ALPHA, /* U+00c008: */
+ RTUNI_ALPHA, /* U+00c009: */
+ RTUNI_ALPHA, /* U+00c00a: */
+ RTUNI_ALPHA, /* U+00c00b: */
+ RTUNI_ALPHA, /* U+00c00c: */
+ RTUNI_ALPHA, /* U+00c00d: */
+ RTUNI_ALPHA, /* U+00c00e: */
+ RTUNI_ALPHA, /* U+00c00f: */
+ RTUNI_ALPHA, /* U+00c010: */
+ RTUNI_ALPHA, /* U+00c011: */
+ RTUNI_ALPHA, /* U+00c012: */
+ RTUNI_ALPHA, /* U+00c013: */
+ RTUNI_ALPHA, /* U+00c014: */
+ RTUNI_ALPHA, /* U+00c015: */
+ RTUNI_ALPHA, /* U+00c016: */
+ RTUNI_ALPHA, /* U+00c017: */
+ RTUNI_ALPHA, /* U+00c018: */
+ RTUNI_ALPHA, /* U+00c019: */
+ RTUNI_ALPHA, /* U+00c01a: */
+ RTUNI_ALPHA, /* U+00c01b: */
+ RTUNI_ALPHA, /* U+00c01c: */
+ RTUNI_ALPHA, /* U+00c01d: */
+ RTUNI_ALPHA, /* U+00c01e: */
+ RTUNI_ALPHA, /* U+00c01f: */
+ RTUNI_ALPHA, /* U+00c020: */
+ RTUNI_ALPHA, /* U+00c021: */
+ RTUNI_ALPHA, /* U+00c022: */
+ RTUNI_ALPHA, /* U+00c023: */
+ RTUNI_ALPHA, /* U+00c024: */
+ RTUNI_ALPHA, /* U+00c025: */
+ RTUNI_ALPHA, /* U+00c026: */
+ RTUNI_ALPHA, /* U+00c027: */
+ RTUNI_ALPHA, /* U+00c028: */
+ RTUNI_ALPHA, /* U+00c029: */
+ RTUNI_ALPHA, /* U+00c02a: */
+ RTUNI_ALPHA, /* U+00c02b: */
+ RTUNI_ALPHA, /* U+00c02c: */
+ RTUNI_ALPHA, /* U+00c02d: */
+ RTUNI_ALPHA, /* U+00c02e: */
+ RTUNI_ALPHA, /* U+00c02f: */
+ RTUNI_ALPHA, /* U+00c030: */
+ RTUNI_ALPHA, /* U+00c031: */
+ RTUNI_ALPHA, /* U+00c032: */
+ RTUNI_ALPHA, /* U+00c033: */
+ RTUNI_ALPHA, /* U+00c034: */
+ RTUNI_ALPHA, /* U+00c035: */
+ RTUNI_ALPHA, /* U+00c036: */
+ RTUNI_ALPHA, /* U+00c037: */
+ RTUNI_ALPHA, /* U+00c038: */
+ RTUNI_ALPHA, /* U+00c039: */
+ RTUNI_ALPHA, /* U+00c03a: */
+ RTUNI_ALPHA, /* U+00c03b: */
+ RTUNI_ALPHA, /* U+00c03c: */
+ RTUNI_ALPHA, /* U+00c03d: */
+ RTUNI_ALPHA, /* U+00c03e: */
+ RTUNI_ALPHA, /* U+00c03f: */
+ RTUNI_ALPHA, /* U+00c040: */
+ RTUNI_ALPHA, /* U+00c041: */
+ RTUNI_ALPHA, /* U+00c042: */
+ RTUNI_ALPHA, /* U+00c043: */
+ RTUNI_ALPHA, /* U+00c044: */
+ RTUNI_ALPHA, /* U+00c045: */
+ RTUNI_ALPHA, /* U+00c046: */
+ RTUNI_ALPHA, /* U+00c047: */
+ RTUNI_ALPHA, /* U+00c048: */
+ RTUNI_ALPHA, /* U+00c049: */
+ RTUNI_ALPHA, /* U+00c04a: */
+ RTUNI_ALPHA, /* U+00c04b: */
+ RTUNI_ALPHA, /* U+00c04c: */
+ RTUNI_ALPHA, /* U+00c04d: */
+ RTUNI_ALPHA, /* U+00c04e: */
+ RTUNI_ALPHA, /* U+00c04f: */
+ RTUNI_ALPHA, /* U+00c050: */
+ RTUNI_ALPHA, /* U+00c051: */
+ RTUNI_ALPHA, /* U+00c052: */
+ RTUNI_ALPHA, /* U+00c053: */
+ RTUNI_ALPHA, /* U+00c054: */
+ RTUNI_ALPHA, /* U+00c055: */
+ RTUNI_ALPHA, /* U+00c056: */
+ RTUNI_ALPHA, /* U+00c057: */
+ RTUNI_ALPHA, /* U+00c058: */
+ RTUNI_ALPHA, /* U+00c059: */
+ RTUNI_ALPHA, /* U+00c05a: */
+ RTUNI_ALPHA, /* U+00c05b: */
+ RTUNI_ALPHA, /* U+00c05c: */
+ RTUNI_ALPHA, /* U+00c05d: */
+ RTUNI_ALPHA, /* U+00c05e: */
+ RTUNI_ALPHA, /* U+00c05f: */
+ RTUNI_ALPHA, /* U+00c060: */
+ RTUNI_ALPHA, /* U+00c061: */
+ RTUNI_ALPHA, /* U+00c062: */
+ RTUNI_ALPHA, /* U+00c063: */
+ RTUNI_ALPHA, /* U+00c064: */
+ RTUNI_ALPHA, /* U+00c065: */
+ RTUNI_ALPHA, /* U+00c066: */
+ RTUNI_ALPHA, /* U+00c067: */
+ RTUNI_ALPHA, /* U+00c068: */
+ RTUNI_ALPHA, /* U+00c069: */
+ RTUNI_ALPHA, /* U+00c06a: */
+ RTUNI_ALPHA, /* U+00c06b: */
+ RTUNI_ALPHA, /* U+00c06c: */
+ RTUNI_ALPHA, /* U+00c06d: */
+ RTUNI_ALPHA, /* U+00c06e: */
+ RTUNI_ALPHA, /* U+00c06f: */
+ RTUNI_ALPHA, /* U+00c070: */
+ RTUNI_ALPHA, /* U+00c071: */
+ RTUNI_ALPHA, /* U+00c072: */
+ RTUNI_ALPHA, /* U+00c073: */
+ RTUNI_ALPHA, /* U+00c074: */
+ RTUNI_ALPHA, /* U+00c075: */
+ RTUNI_ALPHA, /* U+00c076: */
+ RTUNI_ALPHA, /* U+00c077: */
+ RTUNI_ALPHA, /* U+00c078: */
+ RTUNI_ALPHA, /* U+00c079: */
+ RTUNI_ALPHA, /* U+00c07a: */
+ RTUNI_ALPHA, /* U+00c07b: */
+ RTUNI_ALPHA, /* U+00c07c: */
+ RTUNI_ALPHA, /* U+00c07d: */
+ RTUNI_ALPHA, /* U+00c07e: */
+ RTUNI_ALPHA, /* U+00c07f: */
+ RTUNI_ALPHA, /* U+00c080: */
+ RTUNI_ALPHA, /* U+00c081: */
+ RTUNI_ALPHA, /* U+00c082: */
+ RTUNI_ALPHA, /* U+00c083: */
+ RTUNI_ALPHA, /* U+00c084: */
+ RTUNI_ALPHA, /* U+00c085: */
+ RTUNI_ALPHA, /* U+00c086: */
+ RTUNI_ALPHA, /* U+00c087: */
+ RTUNI_ALPHA, /* U+00c088: */
+ RTUNI_ALPHA, /* U+00c089: */
+ RTUNI_ALPHA, /* U+00c08a: */
+ RTUNI_ALPHA, /* U+00c08b: */
+ RTUNI_ALPHA, /* U+00c08c: */
+ RTUNI_ALPHA, /* U+00c08d: */
+ RTUNI_ALPHA, /* U+00c08e: */
+ RTUNI_ALPHA, /* U+00c08f: */
+ RTUNI_ALPHA, /* U+00c090: */
+ RTUNI_ALPHA, /* U+00c091: */
+ RTUNI_ALPHA, /* U+00c092: */
+ RTUNI_ALPHA, /* U+00c093: */
+ RTUNI_ALPHA, /* U+00c094: */
+ RTUNI_ALPHA, /* U+00c095: */
+ RTUNI_ALPHA, /* U+00c096: */
+ RTUNI_ALPHA, /* U+00c097: */
+ RTUNI_ALPHA, /* U+00c098: */
+ RTUNI_ALPHA, /* U+00c099: */
+ RTUNI_ALPHA, /* U+00c09a: */
+ RTUNI_ALPHA, /* U+00c09b: */
+ RTUNI_ALPHA, /* U+00c09c: */
+ RTUNI_ALPHA, /* U+00c09d: */
+ RTUNI_ALPHA, /* U+00c09e: */
+ RTUNI_ALPHA, /* U+00c09f: */
+ RTUNI_ALPHA, /* U+00c0a0: */
+ RTUNI_ALPHA, /* U+00c0a1: */
+ RTUNI_ALPHA, /* U+00c0a2: */
+ RTUNI_ALPHA, /* U+00c0a3: */
+ RTUNI_ALPHA, /* U+00c0a4: */
+ RTUNI_ALPHA, /* U+00c0a5: */
+ RTUNI_ALPHA, /* U+00c0a6: */
+ RTUNI_ALPHA, /* U+00c0a7: */
+ RTUNI_ALPHA, /* U+00c0a8: */
+ RTUNI_ALPHA, /* U+00c0a9: */
+ RTUNI_ALPHA, /* U+00c0aa: */
+ RTUNI_ALPHA, /* U+00c0ab: */
+ RTUNI_ALPHA, /* U+00c0ac: */
+ RTUNI_ALPHA, /* U+00c0ad: */
+ RTUNI_ALPHA, /* U+00c0ae: */
+ RTUNI_ALPHA, /* U+00c0af: */
+ RTUNI_ALPHA, /* U+00c0b0: */
+ RTUNI_ALPHA, /* U+00c0b1: */
+ RTUNI_ALPHA, /* U+00c0b2: */
+ RTUNI_ALPHA, /* U+00c0b3: */
+ RTUNI_ALPHA, /* U+00c0b4: */
+ RTUNI_ALPHA, /* U+00c0b5: */
+ RTUNI_ALPHA, /* U+00c0b6: */
+ RTUNI_ALPHA, /* U+00c0b7: */
+ RTUNI_ALPHA, /* U+00c0b8: */
+ RTUNI_ALPHA, /* U+00c0b9: */
+ RTUNI_ALPHA, /* U+00c0ba: */
+ RTUNI_ALPHA, /* U+00c0bb: */
+ RTUNI_ALPHA, /* U+00c0bc: */
+ RTUNI_ALPHA, /* U+00c0bd: */
+ RTUNI_ALPHA, /* U+00c0be: */
+ RTUNI_ALPHA, /* U+00c0bf: */
+ RTUNI_ALPHA, /* U+00c0c0: */
+ RTUNI_ALPHA, /* U+00c0c1: */
+ RTUNI_ALPHA, /* U+00c0c2: */
+ RTUNI_ALPHA, /* U+00c0c3: */
+ RTUNI_ALPHA, /* U+00c0c4: */
+ RTUNI_ALPHA, /* U+00c0c5: */
+ RTUNI_ALPHA, /* U+00c0c6: */
+ RTUNI_ALPHA, /* U+00c0c7: */
+ RTUNI_ALPHA, /* U+00c0c8: */
+ RTUNI_ALPHA, /* U+00c0c9: */
+ RTUNI_ALPHA, /* U+00c0ca: */
+ RTUNI_ALPHA, /* U+00c0cb: */
+ RTUNI_ALPHA, /* U+00c0cc: */
+ RTUNI_ALPHA, /* U+00c0cd: */
+ RTUNI_ALPHA, /* U+00c0ce: */
+ RTUNI_ALPHA, /* U+00c0cf: */
+ RTUNI_ALPHA, /* U+00c0d0: */
+ RTUNI_ALPHA, /* U+00c0d1: */
+ RTUNI_ALPHA, /* U+00c0d2: */
+ RTUNI_ALPHA, /* U+00c0d3: */
+ RTUNI_ALPHA, /* U+00c0d4: */
+ RTUNI_ALPHA, /* U+00c0d5: */
+ RTUNI_ALPHA, /* U+00c0d6: */
+ RTUNI_ALPHA, /* U+00c0d7: */
+ RTUNI_ALPHA, /* U+00c0d8: */
+ RTUNI_ALPHA, /* U+00c0d9: */
+ RTUNI_ALPHA, /* U+00c0da: */
+ RTUNI_ALPHA, /* U+00c0db: */
+ RTUNI_ALPHA, /* U+00c0dc: */
+ RTUNI_ALPHA, /* U+00c0dd: */
+ RTUNI_ALPHA, /* U+00c0de: */
+ RTUNI_ALPHA, /* U+00c0df: */
+ RTUNI_ALPHA, /* U+00c0e0: */
+ RTUNI_ALPHA, /* U+00c0e1: */
+ RTUNI_ALPHA, /* U+00c0e2: */
+ RTUNI_ALPHA, /* U+00c0e3: */
+ RTUNI_ALPHA, /* U+00c0e4: */
+ RTUNI_ALPHA, /* U+00c0e5: */
+ RTUNI_ALPHA, /* U+00c0e6: */
+ RTUNI_ALPHA, /* U+00c0e7: */
+ RTUNI_ALPHA, /* U+00c0e8: */
+ RTUNI_ALPHA, /* U+00c0e9: */
+ RTUNI_ALPHA, /* U+00c0ea: */
+ RTUNI_ALPHA, /* U+00c0eb: */
+ RTUNI_ALPHA, /* U+00c0ec: */
+ RTUNI_ALPHA, /* U+00c0ed: */
+ RTUNI_ALPHA, /* U+00c0ee: */
+ RTUNI_ALPHA, /* U+00c0ef: */
+ RTUNI_ALPHA, /* U+00c0f0: */
+ RTUNI_ALPHA, /* U+00c0f1: */
+ RTUNI_ALPHA, /* U+00c0f2: */
+ RTUNI_ALPHA, /* U+00c0f3: */
+ RTUNI_ALPHA, /* U+00c0f4: */
+ RTUNI_ALPHA, /* U+00c0f5: */
+ RTUNI_ALPHA, /* U+00c0f6: */
+ RTUNI_ALPHA, /* U+00c0f7: */
+ RTUNI_ALPHA, /* U+00c0f8: */
+ RTUNI_ALPHA, /* U+00c0f9: */
+ RTUNI_ALPHA, /* U+00c0fa: */
+ RTUNI_ALPHA, /* U+00c0fb: */
+ RTUNI_ALPHA, /* U+00c0fc: */
+ RTUNI_ALPHA, /* U+00c0fd: */
+ RTUNI_ALPHA, /* U+00c0fe: */
+ RTUNI_ALPHA, /* U+00c0ff: */
+ RTUNI_ALPHA, /* U+00c100: */
+ RTUNI_ALPHA, /* U+00c101: */
+ RTUNI_ALPHA, /* U+00c102: */
+ RTUNI_ALPHA, /* U+00c103: */
+ RTUNI_ALPHA, /* U+00c104: */
+ RTUNI_ALPHA, /* U+00c105: */
+ RTUNI_ALPHA, /* U+00c106: */
+ RTUNI_ALPHA, /* U+00c107: */
+ RTUNI_ALPHA, /* U+00c108: */
+ RTUNI_ALPHA, /* U+00c109: */
+ RTUNI_ALPHA, /* U+00c10a: */
+ RTUNI_ALPHA, /* U+00c10b: */
+ RTUNI_ALPHA, /* U+00c10c: */
+ RTUNI_ALPHA, /* U+00c10d: */
+ RTUNI_ALPHA, /* U+00c10e: */
+ RTUNI_ALPHA, /* U+00c10f: */
+ RTUNI_ALPHA, /* U+00c110: */
+ RTUNI_ALPHA, /* U+00c111: */
+ RTUNI_ALPHA, /* U+00c112: */
+ RTUNI_ALPHA, /* U+00c113: */
+ RTUNI_ALPHA, /* U+00c114: */
+ RTUNI_ALPHA, /* U+00c115: */
+ RTUNI_ALPHA, /* U+00c116: */
+ RTUNI_ALPHA, /* U+00c117: */
+ RTUNI_ALPHA, /* U+00c118: */
+ RTUNI_ALPHA, /* U+00c119: */
+ RTUNI_ALPHA, /* U+00c11a: */
+ RTUNI_ALPHA, /* U+00c11b: */
+ RTUNI_ALPHA, /* U+00c11c: */
+ RTUNI_ALPHA, /* U+00c11d: */
+ RTUNI_ALPHA, /* U+00c11e: */
+ RTUNI_ALPHA, /* U+00c11f: */
+ RTUNI_ALPHA, /* U+00c120: */
+ RTUNI_ALPHA, /* U+00c121: */
+ RTUNI_ALPHA, /* U+00c122: */
+ RTUNI_ALPHA, /* U+00c123: */
+ RTUNI_ALPHA, /* U+00c124: */
+ RTUNI_ALPHA, /* U+00c125: */
+ RTUNI_ALPHA, /* U+00c126: */
+ RTUNI_ALPHA, /* U+00c127: */
+ RTUNI_ALPHA, /* U+00c128: */
+ RTUNI_ALPHA, /* U+00c129: */
+ RTUNI_ALPHA, /* U+00c12a: */
+ RTUNI_ALPHA, /* U+00c12b: */
+ RTUNI_ALPHA, /* U+00c12c: */
+ RTUNI_ALPHA, /* U+00c12d: */
+ RTUNI_ALPHA, /* U+00c12e: */
+ RTUNI_ALPHA, /* U+00c12f: */
+ RTUNI_ALPHA, /* U+00c130: */
+ RTUNI_ALPHA, /* U+00c131: */
+ RTUNI_ALPHA, /* U+00c132: */
+ RTUNI_ALPHA, /* U+00c133: */
+ RTUNI_ALPHA, /* U+00c134: */
+ RTUNI_ALPHA, /* U+00c135: */
+ RTUNI_ALPHA, /* U+00c136: */
+ RTUNI_ALPHA, /* U+00c137: */
+ RTUNI_ALPHA, /* U+00c138: */
+ RTUNI_ALPHA, /* U+00c139: */
+ RTUNI_ALPHA, /* U+00c13a: */
+ RTUNI_ALPHA, /* U+00c13b: */
+ RTUNI_ALPHA, /* U+00c13c: */
+ RTUNI_ALPHA, /* U+00c13d: */
+ RTUNI_ALPHA, /* U+00c13e: */
+ RTUNI_ALPHA, /* U+00c13f: */
+ RTUNI_ALPHA, /* U+00c140: */
+ RTUNI_ALPHA, /* U+00c141: */
+ RTUNI_ALPHA, /* U+00c142: */
+ RTUNI_ALPHA, /* U+00c143: */
+ RTUNI_ALPHA, /* U+00c144: */
+ RTUNI_ALPHA, /* U+00c145: */
+ RTUNI_ALPHA, /* U+00c146: */
+ RTUNI_ALPHA, /* U+00c147: */
+ RTUNI_ALPHA, /* U+00c148: */
+ RTUNI_ALPHA, /* U+00c149: */
+ RTUNI_ALPHA, /* U+00c14a: */
+ RTUNI_ALPHA, /* U+00c14b: */
+ RTUNI_ALPHA, /* U+00c14c: */
+ RTUNI_ALPHA, /* U+00c14d: */
+ RTUNI_ALPHA, /* U+00c14e: */
+ RTUNI_ALPHA, /* U+00c14f: */
+ RTUNI_ALPHA, /* U+00c150: */
+ RTUNI_ALPHA, /* U+00c151: */
+ RTUNI_ALPHA, /* U+00c152: */
+ RTUNI_ALPHA, /* U+00c153: */
+ RTUNI_ALPHA, /* U+00c154: */
+ RTUNI_ALPHA, /* U+00c155: */
+ RTUNI_ALPHA, /* U+00c156: */
+ RTUNI_ALPHA, /* U+00c157: */
+ RTUNI_ALPHA, /* U+00c158: */
+ RTUNI_ALPHA, /* U+00c159: */
+ RTUNI_ALPHA, /* U+00c15a: */
+ RTUNI_ALPHA, /* U+00c15b: */
+ RTUNI_ALPHA, /* U+00c15c: */
+ RTUNI_ALPHA, /* U+00c15d: */
+ RTUNI_ALPHA, /* U+00c15e: */
+ RTUNI_ALPHA, /* U+00c15f: */
+ RTUNI_ALPHA, /* U+00c160: */
+ RTUNI_ALPHA, /* U+00c161: */
+ RTUNI_ALPHA, /* U+00c162: */
+ RTUNI_ALPHA, /* U+00c163: */
+ RTUNI_ALPHA, /* U+00c164: */
+ RTUNI_ALPHA, /* U+00c165: */
+ RTUNI_ALPHA, /* U+00c166: */
+ RTUNI_ALPHA, /* U+00c167: */
+ RTUNI_ALPHA, /* U+00c168: */
+ RTUNI_ALPHA, /* U+00c169: */
+ RTUNI_ALPHA, /* U+00c16a: */
+ RTUNI_ALPHA, /* U+00c16b: */
+ RTUNI_ALPHA, /* U+00c16c: */
+ RTUNI_ALPHA, /* U+00c16d: */
+ RTUNI_ALPHA, /* U+00c16e: */
+ RTUNI_ALPHA, /* U+00c16f: */
+ RTUNI_ALPHA, /* U+00c170: */
+ RTUNI_ALPHA, /* U+00c171: */
+ RTUNI_ALPHA, /* U+00c172: */
+ RTUNI_ALPHA, /* U+00c173: */
+ RTUNI_ALPHA, /* U+00c174: */
+ RTUNI_ALPHA, /* U+00c175: */
+ RTUNI_ALPHA, /* U+00c176: */
+ RTUNI_ALPHA, /* U+00c177: */
+ RTUNI_ALPHA, /* U+00c178: */
+ RTUNI_ALPHA, /* U+00c179: */
+ RTUNI_ALPHA, /* U+00c17a: */
+ RTUNI_ALPHA, /* U+00c17b: */
+ RTUNI_ALPHA, /* U+00c17c: */
+ RTUNI_ALPHA, /* U+00c17d: */
+ RTUNI_ALPHA, /* U+00c17e: */
+ RTUNI_ALPHA, /* U+00c17f: */
+ RTUNI_ALPHA, /* U+00c180: */
+ RTUNI_ALPHA, /* U+00c181: */
+ RTUNI_ALPHA, /* U+00c182: */
+ RTUNI_ALPHA, /* U+00c183: */
+ RTUNI_ALPHA, /* U+00c184: */
+ RTUNI_ALPHA, /* U+00c185: */
+ RTUNI_ALPHA, /* U+00c186: */
+ RTUNI_ALPHA, /* U+00c187: */
+ RTUNI_ALPHA, /* U+00c188: */
+ RTUNI_ALPHA, /* U+00c189: */
+ RTUNI_ALPHA, /* U+00c18a: */
+ RTUNI_ALPHA, /* U+00c18b: */
+ RTUNI_ALPHA, /* U+00c18c: */
+ RTUNI_ALPHA, /* U+00c18d: */
+ RTUNI_ALPHA, /* U+00c18e: */
+ RTUNI_ALPHA, /* U+00c18f: */
+ RTUNI_ALPHA, /* U+00c190: */
+ RTUNI_ALPHA, /* U+00c191: */
+ RTUNI_ALPHA, /* U+00c192: */
+ RTUNI_ALPHA, /* U+00c193: */
+ RTUNI_ALPHA, /* U+00c194: */
+ RTUNI_ALPHA, /* U+00c195: */
+ RTUNI_ALPHA, /* U+00c196: */
+ RTUNI_ALPHA, /* U+00c197: */
+ RTUNI_ALPHA, /* U+00c198: */
+ RTUNI_ALPHA, /* U+00c199: */
+ RTUNI_ALPHA, /* U+00c19a: */
+ RTUNI_ALPHA, /* U+00c19b: */
+ RTUNI_ALPHA, /* U+00c19c: */
+ RTUNI_ALPHA, /* U+00c19d: */
+ RTUNI_ALPHA, /* U+00c19e: */
+ RTUNI_ALPHA, /* U+00c19f: */
+ RTUNI_ALPHA, /* U+00c1a0: */
+ RTUNI_ALPHA, /* U+00c1a1: */
+ RTUNI_ALPHA, /* U+00c1a2: */
+ RTUNI_ALPHA, /* U+00c1a3: */
+ RTUNI_ALPHA, /* U+00c1a4: */
+ RTUNI_ALPHA, /* U+00c1a5: */
+ RTUNI_ALPHA, /* U+00c1a6: */
+ RTUNI_ALPHA, /* U+00c1a7: */
+ RTUNI_ALPHA, /* U+00c1a8: */
+ RTUNI_ALPHA, /* U+00c1a9: */
+ RTUNI_ALPHA, /* U+00c1aa: */
+ RTUNI_ALPHA, /* U+00c1ab: */
+ RTUNI_ALPHA, /* U+00c1ac: */
+ RTUNI_ALPHA, /* U+00c1ad: */
+ RTUNI_ALPHA, /* U+00c1ae: */
+ RTUNI_ALPHA, /* U+00c1af: */
+ RTUNI_ALPHA, /* U+00c1b0: */
+ RTUNI_ALPHA, /* U+00c1b1: */
+ RTUNI_ALPHA, /* U+00c1b2: */
+ RTUNI_ALPHA, /* U+00c1b3: */
+ RTUNI_ALPHA, /* U+00c1b4: */
+ RTUNI_ALPHA, /* U+00c1b5: */
+ RTUNI_ALPHA, /* U+00c1b6: */
+ RTUNI_ALPHA, /* U+00c1b7: */
+ RTUNI_ALPHA, /* U+00c1b8: */
+ RTUNI_ALPHA, /* U+00c1b9: */
+ RTUNI_ALPHA, /* U+00c1ba: */
+ RTUNI_ALPHA, /* U+00c1bb: */
+ RTUNI_ALPHA, /* U+00c1bc: */
+ RTUNI_ALPHA, /* U+00c1bd: */
+ RTUNI_ALPHA, /* U+00c1be: */
+ RTUNI_ALPHA, /* U+00c1bf: */
+ RTUNI_ALPHA, /* U+00c1c0: */
+ RTUNI_ALPHA, /* U+00c1c1: */
+ RTUNI_ALPHA, /* U+00c1c2: */
+ RTUNI_ALPHA, /* U+00c1c3: */
+ RTUNI_ALPHA, /* U+00c1c4: */
+ RTUNI_ALPHA, /* U+00c1c5: */
+ RTUNI_ALPHA, /* U+00c1c6: */
+ RTUNI_ALPHA, /* U+00c1c7: */
+ RTUNI_ALPHA, /* U+00c1c8: */
+ RTUNI_ALPHA, /* U+00c1c9: */
+ RTUNI_ALPHA, /* U+00c1ca: */
+ RTUNI_ALPHA, /* U+00c1cb: */
+ RTUNI_ALPHA, /* U+00c1cc: */
+ RTUNI_ALPHA, /* U+00c1cd: */
+ RTUNI_ALPHA, /* U+00c1ce: */
+ RTUNI_ALPHA, /* U+00c1cf: */
+ RTUNI_ALPHA, /* U+00c1d0: */
+ RTUNI_ALPHA, /* U+00c1d1: */
+ RTUNI_ALPHA, /* U+00c1d2: */
+ RTUNI_ALPHA, /* U+00c1d3: */
+ RTUNI_ALPHA, /* U+00c1d4: */
+ RTUNI_ALPHA, /* U+00c1d5: */
+ RTUNI_ALPHA, /* U+00c1d6: */
+ RTUNI_ALPHA, /* U+00c1d7: */
+ RTUNI_ALPHA, /* U+00c1d8: */
+ RTUNI_ALPHA, /* U+00c1d9: */
+ RTUNI_ALPHA, /* U+00c1da: */
+ RTUNI_ALPHA, /* U+00c1db: */
+ RTUNI_ALPHA, /* U+00c1dc: */
+ RTUNI_ALPHA, /* U+00c1dd: */
+ RTUNI_ALPHA, /* U+00c1de: */
+ RTUNI_ALPHA, /* U+00c1df: */
+ RTUNI_ALPHA, /* U+00c1e0: */
+ RTUNI_ALPHA, /* U+00c1e1: */
+ RTUNI_ALPHA, /* U+00c1e2: */
+ RTUNI_ALPHA, /* U+00c1e3: */
+ RTUNI_ALPHA, /* U+00c1e4: */
+ RTUNI_ALPHA, /* U+00c1e5: */
+ RTUNI_ALPHA, /* U+00c1e6: */
+ RTUNI_ALPHA, /* U+00c1e7: */
+ RTUNI_ALPHA, /* U+00c1e8: */
+ RTUNI_ALPHA, /* U+00c1e9: */
+ RTUNI_ALPHA, /* U+00c1ea: */
+ RTUNI_ALPHA, /* U+00c1eb: */
+ RTUNI_ALPHA, /* U+00c1ec: */
+ RTUNI_ALPHA, /* U+00c1ed: */
+ RTUNI_ALPHA, /* U+00c1ee: */
+ RTUNI_ALPHA, /* U+00c1ef: */
+ RTUNI_ALPHA, /* U+00c1f0: */
+ RTUNI_ALPHA, /* U+00c1f1: */
+ RTUNI_ALPHA, /* U+00c1f2: */
+ RTUNI_ALPHA, /* U+00c1f3: */
+ RTUNI_ALPHA, /* U+00c1f4: */
+ RTUNI_ALPHA, /* U+00c1f5: */
+ RTUNI_ALPHA, /* U+00c1f6: */
+ RTUNI_ALPHA, /* U+00c1f7: */
+ RTUNI_ALPHA, /* U+00c1f8: */
+ RTUNI_ALPHA, /* U+00c1f9: */
+ RTUNI_ALPHA, /* U+00c1fa: */
+ RTUNI_ALPHA, /* U+00c1fb: */
+ RTUNI_ALPHA, /* U+00c1fc: */
+ RTUNI_ALPHA, /* U+00c1fd: */
+ RTUNI_ALPHA, /* U+00c1fe: */
+ RTUNI_ALPHA, /* U+00c1ff: */
+ RTUNI_ALPHA, /* U+00c200: */
+ RTUNI_ALPHA, /* U+00c201: */
+ RTUNI_ALPHA, /* U+00c202: */
+ RTUNI_ALPHA, /* U+00c203: */
+ RTUNI_ALPHA, /* U+00c204: */
+ RTUNI_ALPHA, /* U+00c205: */
+ RTUNI_ALPHA, /* U+00c206: */
+ RTUNI_ALPHA, /* U+00c207: */
+ RTUNI_ALPHA, /* U+00c208: */
+ RTUNI_ALPHA, /* U+00c209: */
+ RTUNI_ALPHA, /* U+00c20a: */
+ RTUNI_ALPHA, /* U+00c20b: */
+ RTUNI_ALPHA, /* U+00c20c: */
+ RTUNI_ALPHA, /* U+00c20d: */
+ RTUNI_ALPHA, /* U+00c20e: */
+ RTUNI_ALPHA, /* U+00c20f: */
+ RTUNI_ALPHA, /* U+00c210: */
+ RTUNI_ALPHA, /* U+00c211: */
+ RTUNI_ALPHA, /* U+00c212: */
+ RTUNI_ALPHA, /* U+00c213: */
+ RTUNI_ALPHA, /* U+00c214: */
+ RTUNI_ALPHA, /* U+00c215: */
+ RTUNI_ALPHA, /* U+00c216: */
+ RTUNI_ALPHA, /* U+00c217: */
+ RTUNI_ALPHA, /* U+00c218: */
+ RTUNI_ALPHA, /* U+00c219: */
+ RTUNI_ALPHA, /* U+00c21a: */
+ RTUNI_ALPHA, /* U+00c21b: */
+ RTUNI_ALPHA, /* U+00c21c: */
+ RTUNI_ALPHA, /* U+00c21d: */
+ RTUNI_ALPHA, /* U+00c21e: */
+ RTUNI_ALPHA, /* U+00c21f: */
+ RTUNI_ALPHA, /* U+00c220: */
+ RTUNI_ALPHA, /* U+00c221: */
+ RTUNI_ALPHA, /* U+00c222: */
+ RTUNI_ALPHA, /* U+00c223: */
+ RTUNI_ALPHA, /* U+00c224: */
+ RTUNI_ALPHA, /* U+00c225: */
+ RTUNI_ALPHA, /* U+00c226: */
+ RTUNI_ALPHA, /* U+00c227: */
+ RTUNI_ALPHA, /* U+00c228: */
+ RTUNI_ALPHA, /* U+00c229: */
+ RTUNI_ALPHA, /* U+00c22a: */
+ RTUNI_ALPHA, /* U+00c22b: */
+ RTUNI_ALPHA, /* U+00c22c: */
+ RTUNI_ALPHA, /* U+00c22d: */
+ RTUNI_ALPHA, /* U+00c22e: */
+ RTUNI_ALPHA, /* U+00c22f: */
+ RTUNI_ALPHA, /* U+00c230: */
+ RTUNI_ALPHA, /* U+00c231: */
+ RTUNI_ALPHA, /* U+00c232: */
+ RTUNI_ALPHA, /* U+00c233: */
+ RTUNI_ALPHA, /* U+00c234: */
+ RTUNI_ALPHA, /* U+00c235: */
+ RTUNI_ALPHA, /* U+00c236: */
+ RTUNI_ALPHA, /* U+00c237: */
+ RTUNI_ALPHA, /* U+00c238: */
+ RTUNI_ALPHA, /* U+00c239: */
+ RTUNI_ALPHA, /* U+00c23a: */
+ RTUNI_ALPHA, /* U+00c23b: */
+ RTUNI_ALPHA, /* U+00c23c: */
+ RTUNI_ALPHA, /* U+00c23d: */
+ RTUNI_ALPHA, /* U+00c23e: */
+ RTUNI_ALPHA, /* U+00c23f: */
+ RTUNI_ALPHA, /* U+00c240: */
+ RTUNI_ALPHA, /* U+00c241: */
+ RTUNI_ALPHA, /* U+00c242: */
+ RTUNI_ALPHA, /* U+00c243: */
+ RTUNI_ALPHA, /* U+00c244: */
+ RTUNI_ALPHA, /* U+00c245: */
+ RTUNI_ALPHA, /* U+00c246: */
+ RTUNI_ALPHA, /* U+00c247: */
+ RTUNI_ALPHA, /* U+00c248: */
+ RTUNI_ALPHA, /* U+00c249: */
+ RTUNI_ALPHA, /* U+00c24a: */
+ RTUNI_ALPHA, /* U+00c24b: */
+ RTUNI_ALPHA, /* U+00c24c: */
+ RTUNI_ALPHA, /* U+00c24d: */
+ RTUNI_ALPHA, /* U+00c24e: */
+ RTUNI_ALPHA, /* U+00c24f: */
+ RTUNI_ALPHA, /* U+00c250: */
+ RTUNI_ALPHA, /* U+00c251: */
+ RTUNI_ALPHA, /* U+00c252: */
+ RTUNI_ALPHA, /* U+00c253: */
+ RTUNI_ALPHA, /* U+00c254: */
+ RTUNI_ALPHA, /* U+00c255: */
+ RTUNI_ALPHA, /* U+00c256: */
+ RTUNI_ALPHA, /* U+00c257: */
+ RTUNI_ALPHA, /* U+00c258: */
+ RTUNI_ALPHA, /* U+00c259: */
+ RTUNI_ALPHA, /* U+00c25a: */
+ RTUNI_ALPHA, /* U+00c25b: */
+ RTUNI_ALPHA, /* U+00c25c: */
+ RTUNI_ALPHA, /* U+00c25d: */
+ RTUNI_ALPHA, /* U+00c25e: */
+ RTUNI_ALPHA, /* U+00c25f: */
+ RTUNI_ALPHA, /* U+00c260: */
+ RTUNI_ALPHA, /* U+00c261: */
+ RTUNI_ALPHA, /* U+00c262: */
+ RTUNI_ALPHA, /* U+00c263: */
+ RTUNI_ALPHA, /* U+00c264: */
+ RTUNI_ALPHA, /* U+00c265: */
+ RTUNI_ALPHA, /* U+00c266: */
+ RTUNI_ALPHA, /* U+00c267: */
+ RTUNI_ALPHA, /* U+00c268: */
+ RTUNI_ALPHA, /* U+00c269: */
+ RTUNI_ALPHA, /* U+00c26a: */
+ RTUNI_ALPHA, /* U+00c26b: */
+ RTUNI_ALPHA, /* U+00c26c: */
+ RTUNI_ALPHA, /* U+00c26d: */
+ RTUNI_ALPHA, /* U+00c26e: */
+ RTUNI_ALPHA, /* U+00c26f: */
+ RTUNI_ALPHA, /* U+00c270: */
+ RTUNI_ALPHA, /* U+00c271: */
+ RTUNI_ALPHA, /* U+00c272: */
+ RTUNI_ALPHA, /* U+00c273: */
+ RTUNI_ALPHA, /* U+00c274: */
+ RTUNI_ALPHA, /* U+00c275: */
+ RTUNI_ALPHA, /* U+00c276: */
+ RTUNI_ALPHA, /* U+00c277: */
+ RTUNI_ALPHA, /* U+00c278: */
+ RTUNI_ALPHA, /* U+00c279: */
+ RTUNI_ALPHA, /* U+00c27a: */
+ RTUNI_ALPHA, /* U+00c27b: */
+ RTUNI_ALPHA, /* U+00c27c: */
+ RTUNI_ALPHA, /* U+00c27d: */
+ RTUNI_ALPHA, /* U+00c27e: */
+ RTUNI_ALPHA, /* U+00c27f: */
+ RTUNI_ALPHA, /* U+00c280: */
+ RTUNI_ALPHA, /* U+00c281: */
+ RTUNI_ALPHA, /* U+00c282: */
+ RTUNI_ALPHA, /* U+00c283: */
+ RTUNI_ALPHA, /* U+00c284: */
+ RTUNI_ALPHA, /* U+00c285: */
+ RTUNI_ALPHA, /* U+00c286: */
+ RTUNI_ALPHA, /* U+00c287: */
+ RTUNI_ALPHA, /* U+00c288: */
+ RTUNI_ALPHA, /* U+00c289: */
+ RTUNI_ALPHA, /* U+00c28a: */
+ RTUNI_ALPHA, /* U+00c28b: */
+ RTUNI_ALPHA, /* U+00c28c: */
+ RTUNI_ALPHA, /* U+00c28d: */
+ RTUNI_ALPHA, /* U+00c28e: */
+ RTUNI_ALPHA, /* U+00c28f: */
+ RTUNI_ALPHA, /* U+00c290: */
+ RTUNI_ALPHA, /* U+00c291: */
+ RTUNI_ALPHA, /* U+00c292: */
+ RTUNI_ALPHA, /* U+00c293: */
+ RTUNI_ALPHA, /* U+00c294: */
+ RTUNI_ALPHA, /* U+00c295: */
+ RTUNI_ALPHA, /* U+00c296: */
+ RTUNI_ALPHA, /* U+00c297: */
+ RTUNI_ALPHA, /* U+00c298: */
+ RTUNI_ALPHA, /* U+00c299: */
+ RTUNI_ALPHA, /* U+00c29a: */
+ RTUNI_ALPHA, /* U+00c29b: */
+ RTUNI_ALPHA, /* U+00c29c: */
+ RTUNI_ALPHA, /* U+00c29d: */
+ RTUNI_ALPHA, /* U+00c29e: */
+ RTUNI_ALPHA, /* U+00c29f: */
+ RTUNI_ALPHA, /* U+00c2a0: */
+ RTUNI_ALPHA, /* U+00c2a1: */
+ RTUNI_ALPHA, /* U+00c2a2: */
+ RTUNI_ALPHA, /* U+00c2a3: */
+ RTUNI_ALPHA, /* U+00c2a4: */
+ RTUNI_ALPHA, /* U+00c2a5: */
+ RTUNI_ALPHA, /* U+00c2a6: */
+ RTUNI_ALPHA, /* U+00c2a7: */
+ RTUNI_ALPHA, /* U+00c2a8: */
+ RTUNI_ALPHA, /* U+00c2a9: */
+ RTUNI_ALPHA, /* U+00c2aa: */
+ RTUNI_ALPHA, /* U+00c2ab: */
+ RTUNI_ALPHA, /* U+00c2ac: */
+ RTUNI_ALPHA, /* U+00c2ad: */
+ RTUNI_ALPHA, /* U+00c2ae: */
+ RTUNI_ALPHA, /* U+00c2af: */
+ RTUNI_ALPHA, /* U+00c2b0: */
+ RTUNI_ALPHA, /* U+00c2b1: */
+ RTUNI_ALPHA, /* U+00c2b2: */
+ RTUNI_ALPHA, /* U+00c2b3: */
+ RTUNI_ALPHA, /* U+00c2b4: */
+ RTUNI_ALPHA, /* U+00c2b5: */
+ RTUNI_ALPHA, /* U+00c2b6: */
+ RTUNI_ALPHA, /* U+00c2b7: */
+ RTUNI_ALPHA, /* U+00c2b8: */
+ RTUNI_ALPHA, /* U+00c2b9: */
+ RTUNI_ALPHA, /* U+00c2ba: */
+ RTUNI_ALPHA, /* U+00c2bb: */
+ RTUNI_ALPHA, /* U+00c2bc: */
+ RTUNI_ALPHA, /* U+00c2bd: */
+ RTUNI_ALPHA, /* U+00c2be: */
+ RTUNI_ALPHA, /* U+00c2bf: */
+ RTUNI_ALPHA, /* U+00c2c0: */
+ RTUNI_ALPHA, /* U+00c2c1: */
+ RTUNI_ALPHA, /* U+00c2c2: */
+ RTUNI_ALPHA, /* U+00c2c3: */
+ RTUNI_ALPHA, /* U+00c2c4: */
+ RTUNI_ALPHA, /* U+00c2c5: */
+ RTUNI_ALPHA, /* U+00c2c6: */
+ RTUNI_ALPHA, /* U+00c2c7: */
+ RTUNI_ALPHA, /* U+00c2c8: */
+ RTUNI_ALPHA, /* U+00c2c9: */
+ RTUNI_ALPHA, /* U+00c2ca: */
+ RTUNI_ALPHA, /* U+00c2cb: */
+ RTUNI_ALPHA, /* U+00c2cc: */
+ RTUNI_ALPHA, /* U+00c2cd: */
+ RTUNI_ALPHA, /* U+00c2ce: */
+ RTUNI_ALPHA, /* U+00c2cf: */
+ RTUNI_ALPHA, /* U+00c2d0: */
+ RTUNI_ALPHA, /* U+00c2d1: */
+ RTUNI_ALPHA, /* U+00c2d2: */
+ RTUNI_ALPHA, /* U+00c2d3: */
+ RTUNI_ALPHA, /* U+00c2d4: */
+ RTUNI_ALPHA, /* U+00c2d5: */
+ RTUNI_ALPHA, /* U+00c2d6: */
+ RTUNI_ALPHA, /* U+00c2d7: */
+ RTUNI_ALPHA, /* U+00c2d8: */
+ RTUNI_ALPHA, /* U+00c2d9: */
+ RTUNI_ALPHA, /* U+00c2da: */
+ RTUNI_ALPHA, /* U+00c2db: */
+ RTUNI_ALPHA, /* U+00c2dc: */
+ RTUNI_ALPHA, /* U+00c2dd: */
+ RTUNI_ALPHA, /* U+00c2de: */
+ RTUNI_ALPHA, /* U+00c2df: */
+ RTUNI_ALPHA, /* U+00c2e0: */
+ RTUNI_ALPHA, /* U+00c2e1: */
+ RTUNI_ALPHA, /* U+00c2e2: */
+ RTUNI_ALPHA, /* U+00c2e3: */
+ RTUNI_ALPHA, /* U+00c2e4: */
+ RTUNI_ALPHA, /* U+00c2e5: */
+ RTUNI_ALPHA, /* U+00c2e6: */
+ RTUNI_ALPHA, /* U+00c2e7: */
+ RTUNI_ALPHA, /* U+00c2e8: */
+ RTUNI_ALPHA, /* U+00c2e9: */
+ RTUNI_ALPHA, /* U+00c2ea: */
+ RTUNI_ALPHA, /* U+00c2eb: */
+ RTUNI_ALPHA, /* U+00c2ec: */
+ RTUNI_ALPHA, /* U+00c2ed: */
+ RTUNI_ALPHA, /* U+00c2ee: */
+ RTUNI_ALPHA, /* U+00c2ef: */
+ RTUNI_ALPHA, /* U+00c2f0: */
+ RTUNI_ALPHA, /* U+00c2f1: */
+ RTUNI_ALPHA, /* U+00c2f2: */
+ RTUNI_ALPHA, /* U+00c2f3: */
+ RTUNI_ALPHA, /* U+00c2f4: */
+ RTUNI_ALPHA, /* U+00c2f5: */
+ RTUNI_ALPHA, /* U+00c2f6: */
+ RTUNI_ALPHA, /* U+00c2f7: */
+ RTUNI_ALPHA, /* U+00c2f8: */
+ RTUNI_ALPHA, /* U+00c2f9: */
+ RTUNI_ALPHA, /* U+00c2fa: */
+ RTUNI_ALPHA, /* U+00c2fb: */
+ RTUNI_ALPHA, /* U+00c2fc: */
+ RTUNI_ALPHA, /* U+00c2fd: */
+ RTUNI_ALPHA, /* U+00c2fe: */
+ RTUNI_ALPHA, /* U+00c2ff: */
+ RTUNI_ALPHA, /* U+00c300: */
+ RTUNI_ALPHA, /* U+00c301: */
+ RTUNI_ALPHA, /* U+00c302: */
+ RTUNI_ALPHA, /* U+00c303: */
+ RTUNI_ALPHA, /* U+00c304: */
+ RTUNI_ALPHA, /* U+00c305: */
+ RTUNI_ALPHA, /* U+00c306: */
+ RTUNI_ALPHA, /* U+00c307: */
+ RTUNI_ALPHA, /* U+00c308: */
+ RTUNI_ALPHA, /* U+00c309: */
+ RTUNI_ALPHA, /* U+00c30a: */
+ RTUNI_ALPHA, /* U+00c30b: */
+ RTUNI_ALPHA, /* U+00c30c: */
+ RTUNI_ALPHA, /* U+00c30d: */
+ RTUNI_ALPHA, /* U+00c30e: */
+ RTUNI_ALPHA, /* U+00c30f: */
+ RTUNI_ALPHA, /* U+00c310: */
+ RTUNI_ALPHA, /* U+00c311: */
+ RTUNI_ALPHA, /* U+00c312: */
+ RTUNI_ALPHA, /* U+00c313: */
+ RTUNI_ALPHA, /* U+00c314: */
+ RTUNI_ALPHA, /* U+00c315: */
+ RTUNI_ALPHA, /* U+00c316: */
+ RTUNI_ALPHA, /* U+00c317: */
+ RTUNI_ALPHA, /* U+00c318: */
+ RTUNI_ALPHA, /* U+00c319: */
+ RTUNI_ALPHA, /* U+00c31a: */
+ RTUNI_ALPHA, /* U+00c31b: */
+ RTUNI_ALPHA, /* U+00c31c: */
+ RTUNI_ALPHA, /* U+00c31d: */
+ RTUNI_ALPHA, /* U+00c31e: */
+ RTUNI_ALPHA, /* U+00c31f: */
+ RTUNI_ALPHA, /* U+00c320: */
+ RTUNI_ALPHA, /* U+00c321: */
+ RTUNI_ALPHA, /* U+00c322: */
+ RTUNI_ALPHA, /* U+00c323: */
+ RTUNI_ALPHA, /* U+00c324: */
+ RTUNI_ALPHA, /* U+00c325: */
+ RTUNI_ALPHA, /* U+00c326: */
+ RTUNI_ALPHA, /* U+00c327: */
+ RTUNI_ALPHA, /* U+00c328: */
+ RTUNI_ALPHA, /* U+00c329: */
+ RTUNI_ALPHA, /* U+00c32a: */
+ RTUNI_ALPHA, /* U+00c32b: */
+ RTUNI_ALPHA, /* U+00c32c: */
+ RTUNI_ALPHA, /* U+00c32d: */
+ RTUNI_ALPHA, /* U+00c32e: */
+ RTUNI_ALPHA, /* U+00c32f: */
+ RTUNI_ALPHA, /* U+00c330: */
+ RTUNI_ALPHA, /* U+00c331: */
+ RTUNI_ALPHA, /* U+00c332: */
+ RTUNI_ALPHA, /* U+00c333: */
+ RTUNI_ALPHA, /* U+00c334: */
+ RTUNI_ALPHA, /* U+00c335: */
+ RTUNI_ALPHA, /* U+00c336: */
+ RTUNI_ALPHA, /* U+00c337: */
+ RTUNI_ALPHA, /* U+00c338: */
+ RTUNI_ALPHA, /* U+00c339: */
+ RTUNI_ALPHA, /* U+00c33a: */
+ RTUNI_ALPHA, /* U+00c33b: */
+ RTUNI_ALPHA, /* U+00c33c: */
+ RTUNI_ALPHA, /* U+00c33d: */
+ RTUNI_ALPHA, /* U+00c33e: */
+ RTUNI_ALPHA, /* U+00c33f: */
+ RTUNI_ALPHA, /* U+00c340: */
+ RTUNI_ALPHA, /* U+00c341: */
+ RTUNI_ALPHA, /* U+00c342: */
+ RTUNI_ALPHA, /* U+00c343: */
+ RTUNI_ALPHA, /* U+00c344: */
+ RTUNI_ALPHA, /* U+00c345: */
+ RTUNI_ALPHA, /* U+00c346: */
+ RTUNI_ALPHA, /* U+00c347: */
+ RTUNI_ALPHA, /* U+00c348: */
+ RTUNI_ALPHA, /* U+00c349: */
+ RTUNI_ALPHA, /* U+00c34a: */
+ RTUNI_ALPHA, /* U+00c34b: */
+ RTUNI_ALPHA, /* U+00c34c: */
+ RTUNI_ALPHA, /* U+00c34d: */
+ RTUNI_ALPHA, /* U+00c34e: */
+ RTUNI_ALPHA, /* U+00c34f: */
+ RTUNI_ALPHA, /* U+00c350: */
+ RTUNI_ALPHA, /* U+00c351: */
+ RTUNI_ALPHA, /* U+00c352: */
+ RTUNI_ALPHA, /* U+00c353: */
+ RTUNI_ALPHA, /* U+00c354: */
+ RTUNI_ALPHA, /* U+00c355: */
+ RTUNI_ALPHA, /* U+00c356: */
+ RTUNI_ALPHA, /* U+00c357: */
+ RTUNI_ALPHA, /* U+00c358: */
+ RTUNI_ALPHA, /* U+00c359: */
+ RTUNI_ALPHA, /* U+00c35a: */
+ RTUNI_ALPHA, /* U+00c35b: */
+ RTUNI_ALPHA, /* U+00c35c: */
+ RTUNI_ALPHA, /* U+00c35d: */
+ RTUNI_ALPHA, /* U+00c35e: */
+ RTUNI_ALPHA, /* U+00c35f: */
+ RTUNI_ALPHA, /* U+00c360: */
+ RTUNI_ALPHA, /* U+00c361: */
+ RTUNI_ALPHA, /* U+00c362: */
+ RTUNI_ALPHA, /* U+00c363: */
+ RTUNI_ALPHA, /* U+00c364: */
+ RTUNI_ALPHA, /* U+00c365: */
+ RTUNI_ALPHA, /* U+00c366: */
+ RTUNI_ALPHA, /* U+00c367: */
+ RTUNI_ALPHA, /* U+00c368: */
+ RTUNI_ALPHA, /* U+00c369: */
+ RTUNI_ALPHA, /* U+00c36a: */
+ RTUNI_ALPHA, /* U+00c36b: */
+ RTUNI_ALPHA, /* U+00c36c: */
+ RTUNI_ALPHA, /* U+00c36d: */
+ RTUNI_ALPHA, /* U+00c36e: */
+ RTUNI_ALPHA, /* U+00c36f: */
+ RTUNI_ALPHA, /* U+00c370: */
+ RTUNI_ALPHA, /* U+00c371: */
+ RTUNI_ALPHA, /* U+00c372: */
+ RTUNI_ALPHA, /* U+00c373: */
+ RTUNI_ALPHA, /* U+00c374: */
+ RTUNI_ALPHA, /* U+00c375: */
+ RTUNI_ALPHA, /* U+00c376: */
+ RTUNI_ALPHA, /* U+00c377: */
+ RTUNI_ALPHA, /* U+00c378: */
+ RTUNI_ALPHA, /* U+00c379: */
+ RTUNI_ALPHA, /* U+00c37a: */
+ RTUNI_ALPHA, /* U+00c37b: */
+ RTUNI_ALPHA, /* U+00c37c: */
+ RTUNI_ALPHA, /* U+00c37d: */
+ RTUNI_ALPHA, /* U+00c37e: */
+ RTUNI_ALPHA, /* U+00c37f: */
+ RTUNI_ALPHA, /* U+00c380: */
+ RTUNI_ALPHA, /* U+00c381: */
+ RTUNI_ALPHA, /* U+00c382: */
+ RTUNI_ALPHA, /* U+00c383: */
+ RTUNI_ALPHA, /* U+00c384: */
+ RTUNI_ALPHA, /* U+00c385: */
+ RTUNI_ALPHA, /* U+00c386: */
+ RTUNI_ALPHA, /* U+00c387: */
+ RTUNI_ALPHA, /* U+00c388: */
+ RTUNI_ALPHA, /* U+00c389: */
+ RTUNI_ALPHA, /* U+00c38a: */
+ RTUNI_ALPHA, /* U+00c38b: */
+ RTUNI_ALPHA, /* U+00c38c: */
+ RTUNI_ALPHA, /* U+00c38d: */
+ RTUNI_ALPHA, /* U+00c38e: */
+ RTUNI_ALPHA, /* U+00c38f: */
+ RTUNI_ALPHA, /* U+00c390: */
+ RTUNI_ALPHA, /* U+00c391: */
+ RTUNI_ALPHA, /* U+00c392: */
+ RTUNI_ALPHA, /* U+00c393: */
+ RTUNI_ALPHA, /* U+00c394: */
+ RTUNI_ALPHA, /* U+00c395: */
+ RTUNI_ALPHA, /* U+00c396: */
+ RTUNI_ALPHA, /* U+00c397: */
+ RTUNI_ALPHA, /* U+00c398: */
+ RTUNI_ALPHA, /* U+00c399: */
+ RTUNI_ALPHA, /* U+00c39a: */
+ RTUNI_ALPHA, /* U+00c39b: */
+ RTUNI_ALPHA, /* U+00c39c: */
+ RTUNI_ALPHA, /* U+00c39d: */
+ RTUNI_ALPHA, /* U+00c39e: */
+ RTUNI_ALPHA, /* U+00c39f: */
+ RTUNI_ALPHA, /* U+00c3a0: */
+ RTUNI_ALPHA, /* U+00c3a1: */
+ RTUNI_ALPHA, /* U+00c3a2: */
+ RTUNI_ALPHA, /* U+00c3a3: */
+ RTUNI_ALPHA, /* U+00c3a4: */
+ RTUNI_ALPHA, /* U+00c3a5: */
+ RTUNI_ALPHA, /* U+00c3a6: */
+ RTUNI_ALPHA, /* U+00c3a7: */
+ RTUNI_ALPHA, /* U+00c3a8: */
+ RTUNI_ALPHA, /* U+00c3a9: */
+ RTUNI_ALPHA, /* U+00c3aa: */
+ RTUNI_ALPHA, /* U+00c3ab: */
+ RTUNI_ALPHA, /* U+00c3ac: */
+ RTUNI_ALPHA, /* U+00c3ad: */
+ RTUNI_ALPHA, /* U+00c3ae: */
+ RTUNI_ALPHA, /* U+00c3af: */
+ RTUNI_ALPHA, /* U+00c3b0: */
+ RTUNI_ALPHA, /* U+00c3b1: */
+ RTUNI_ALPHA, /* U+00c3b2: */
+ RTUNI_ALPHA, /* U+00c3b3: */
+ RTUNI_ALPHA, /* U+00c3b4: */
+ RTUNI_ALPHA, /* U+00c3b5: */
+ RTUNI_ALPHA, /* U+00c3b6: */
+ RTUNI_ALPHA, /* U+00c3b7: */
+ RTUNI_ALPHA, /* U+00c3b8: */
+ RTUNI_ALPHA, /* U+00c3b9: */
+ RTUNI_ALPHA, /* U+00c3ba: */
+ RTUNI_ALPHA, /* U+00c3bb: */
+ RTUNI_ALPHA, /* U+00c3bc: */
+ RTUNI_ALPHA, /* U+00c3bd: */
+ RTUNI_ALPHA, /* U+00c3be: */
+ RTUNI_ALPHA, /* U+00c3bf: */
+ RTUNI_ALPHA, /* U+00c3c0: */
+ RTUNI_ALPHA, /* U+00c3c1: */
+ RTUNI_ALPHA, /* U+00c3c2: */
+ RTUNI_ALPHA, /* U+00c3c3: */
+ RTUNI_ALPHA, /* U+00c3c4: */
+ RTUNI_ALPHA, /* U+00c3c5: */
+ RTUNI_ALPHA, /* U+00c3c6: */
+ RTUNI_ALPHA, /* U+00c3c7: */
+ RTUNI_ALPHA, /* U+00c3c8: */
+ RTUNI_ALPHA, /* U+00c3c9: */
+ RTUNI_ALPHA, /* U+00c3ca: */
+ RTUNI_ALPHA, /* U+00c3cb: */
+ RTUNI_ALPHA, /* U+00c3cc: */
+ RTUNI_ALPHA, /* U+00c3cd: */
+ RTUNI_ALPHA, /* U+00c3ce: */
+ RTUNI_ALPHA, /* U+00c3cf: */
+ RTUNI_ALPHA, /* U+00c3d0: */
+ RTUNI_ALPHA, /* U+00c3d1: */
+ RTUNI_ALPHA, /* U+00c3d2: */
+ RTUNI_ALPHA, /* U+00c3d3: */
+ RTUNI_ALPHA, /* U+00c3d4: */
+ RTUNI_ALPHA, /* U+00c3d5: */
+ RTUNI_ALPHA, /* U+00c3d6: */
+ RTUNI_ALPHA, /* U+00c3d7: */
+ RTUNI_ALPHA, /* U+00c3d8: */
+ RTUNI_ALPHA, /* U+00c3d9: */
+ RTUNI_ALPHA, /* U+00c3da: */
+ RTUNI_ALPHA, /* U+00c3db: */
+ RTUNI_ALPHA, /* U+00c3dc: */
+ RTUNI_ALPHA, /* U+00c3dd: */
+ RTUNI_ALPHA, /* U+00c3de: */
+ RTUNI_ALPHA, /* U+00c3df: */
+ RTUNI_ALPHA, /* U+00c3e0: */
+ RTUNI_ALPHA, /* U+00c3e1: */
+ RTUNI_ALPHA, /* U+00c3e2: */
+ RTUNI_ALPHA, /* U+00c3e3: */
+ RTUNI_ALPHA, /* U+00c3e4: */
+ RTUNI_ALPHA, /* U+00c3e5: */
+ RTUNI_ALPHA, /* U+00c3e6: */
+ RTUNI_ALPHA, /* U+00c3e7: */
+ RTUNI_ALPHA, /* U+00c3e8: */
+ RTUNI_ALPHA, /* U+00c3e9: */
+ RTUNI_ALPHA, /* U+00c3ea: */
+ RTUNI_ALPHA, /* U+00c3eb: */
+ RTUNI_ALPHA, /* U+00c3ec: */
+ RTUNI_ALPHA, /* U+00c3ed: */
+ RTUNI_ALPHA, /* U+00c3ee: */
+ RTUNI_ALPHA, /* U+00c3ef: */
+ RTUNI_ALPHA, /* U+00c3f0: */
+ RTUNI_ALPHA, /* U+00c3f1: */
+ RTUNI_ALPHA, /* U+00c3f2: */
+ RTUNI_ALPHA, /* U+00c3f3: */
+ RTUNI_ALPHA, /* U+00c3f4: */
+ RTUNI_ALPHA, /* U+00c3f5: */
+ RTUNI_ALPHA, /* U+00c3f6: */
+ RTUNI_ALPHA, /* U+00c3f7: */
+ RTUNI_ALPHA, /* U+00c3f8: */
+ RTUNI_ALPHA, /* U+00c3f9: */
+ RTUNI_ALPHA, /* U+00c3fa: */
+ RTUNI_ALPHA, /* U+00c3fb: */
+ RTUNI_ALPHA, /* U+00c3fc: */
+ RTUNI_ALPHA, /* U+00c3fd: */
+ RTUNI_ALPHA, /* U+00c3fe: */
+ RTUNI_ALPHA, /* U+00c3ff: */
+ RTUNI_ALPHA, /* U+00c400: */
+ RTUNI_ALPHA, /* U+00c401: */
+ RTUNI_ALPHA, /* U+00c402: */
+ RTUNI_ALPHA, /* U+00c403: */
+ RTUNI_ALPHA, /* U+00c404: */
+ RTUNI_ALPHA, /* U+00c405: */
+ RTUNI_ALPHA, /* U+00c406: */
+ RTUNI_ALPHA, /* U+00c407: */
+ RTUNI_ALPHA, /* U+00c408: */
+ RTUNI_ALPHA, /* U+00c409: */
+ RTUNI_ALPHA, /* U+00c40a: */
+ RTUNI_ALPHA, /* U+00c40b: */
+ RTUNI_ALPHA, /* U+00c40c: */
+ RTUNI_ALPHA, /* U+00c40d: */
+ RTUNI_ALPHA, /* U+00c40e: */
+ RTUNI_ALPHA, /* U+00c40f: */
+ RTUNI_ALPHA, /* U+00c410: */
+ RTUNI_ALPHA, /* U+00c411: */
+ RTUNI_ALPHA, /* U+00c412: */
+ RTUNI_ALPHA, /* U+00c413: */
+ RTUNI_ALPHA, /* U+00c414: */
+ RTUNI_ALPHA, /* U+00c415: */
+ RTUNI_ALPHA, /* U+00c416: */
+ RTUNI_ALPHA, /* U+00c417: */
+ RTUNI_ALPHA, /* U+00c418: */
+ RTUNI_ALPHA, /* U+00c419: */
+ RTUNI_ALPHA, /* U+00c41a: */
+ RTUNI_ALPHA, /* U+00c41b: */
+ RTUNI_ALPHA, /* U+00c41c: */
+ RTUNI_ALPHA, /* U+00c41d: */
+ RTUNI_ALPHA, /* U+00c41e: */
+ RTUNI_ALPHA, /* U+00c41f: */
+ RTUNI_ALPHA, /* U+00c420: */
+ RTUNI_ALPHA, /* U+00c421: */
+ RTUNI_ALPHA, /* U+00c422: */
+ RTUNI_ALPHA, /* U+00c423: */
+ RTUNI_ALPHA, /* U+00c424: */
+ RTUNI_ALPHA, /* U+00c425: */
+ RTUNI_ALPHA, /* U+00c426: */
+ RTUNI_ALPHA, /* U+00c427: */
+ RTUNI_ALPHA, /* U+00c428: */
+ RTUNI_ALPHA, /* U+00c429: */
+ RTUNI_ALPHA, /* U+00c42a: */
+ RTUNI_ALPHA, /* U+00c42b: */
+ RTUNI_ALPHA, /* U+00c42c: */
+ RTUNI_ALPHA, /* U+00c42d: */
+ RTUNI_ALPHA, /* U+00c42e: */
+ RTUNI_ALPHA, /* U+00c42f: */
+ RTUNI_ALPHA, /* U+00c430: */
+ RTUNI_ALPHA, /* U+00c431: */
+ RTUNI_ALPHA, /* U+00c432: */
+ RTUNI_ALPHA, /* U+00c433: */
+ RTUNI_ALPHA, /* U+00c434: */
+ RTUNI_ALPHA, /* U+00c435: */
+ RTUNI_ALPHA, /* U+00c436: */
+ RTUNI_ALPHA, /* U+00c437: */
+ RTUNI_ALPHA, /* U+00c438: */
+ RTUNI_ALPHA, /* U+00c439: */
+ RTUNI_ALPHA, /* U+00c43a: */
+ RTUNI_ALPHA, /* U+00c43b: */
+ RTUNI_ALPHA, /* U+00c43c: */
+ RTUNI_ALPHA, /* U+00c43d: */
+ RTUNI_ALPHA, /* U+00c43e: */
+ RTUNI_ALPHA, /* U+00c43f: */
+ RTUNI_ALPHA, /* U+00c440: */
+ RTUNI_ALPHA, /* U+00c441: */
+ RTUNI_ALPHA, /* U+00c442: */
+ RTUNI_ALPHA, /* U+00c443: */
+ RTUNI_ALPHA, /* U+00c444: */
+ RTUNI_ALPHA, /* U+00c445: */
+ RTUNI_ALPHA, /* U+00c446: */
+ RTUNI_ALPHA, /* U+00c447: */
+ RTUNI_ALPHA, /* U+00c448: */
+ RTUNI_ALPHA, /* U+00c449: */
+ RTUNI_ALPHA, /* U+00c44a: */
+ RTUNI_ALPHA, /* U+00c44b: */
+ RTUNI_ALPHA, /* U+00c44c: */
+ RTUNI_ALPHA, /* U+00c44d: */
+ RTUNI_ALPHA, /* U+00c44e: */
+ RTUNI_ALPHA, /* U+00c44f: */
+ RTUNI_ALPHA, /* U+00c450: */
+ RTUNI_ALPHA, /* U+00c451: */
+ RTUNI_ALPHA, /* U+00c452: */
+ RTUNI_ALPHA, /* U+00c453: */
+ RTUNI_ALPHA, /* U+00c454: */
+ RTUNI_ALPHA, /* U+00c455: */
+ RTUNI_ALPHA, /* U+00c456: */
+ RTUNI_ALPHA, /* U+00c457: */
+ RTUNI_ALPHA, /* U+00c458: */
+ RTUNI_ALPHA, /* U+00c459: */
+ RTUNI_ALPHA, /* U+00c45a: */
+ RTUNI_ALPHA, /* U+00c45b: */
+ RTUNI_ALPHA, /* U+00c45c: */
+ RTUNI_ALPHA, /* U+00c45d: */
+ RTUNI_ALPHA, /* U+00c45e: */
+ RTUNI_ALPHA, /* U+00c45f: */
+ RTUNI_ALPHA, /* U+00c460: */
+ RTUNI_ALPHA, /* U+00c461: */
+ RTUNI_ALPHA, /* U+00c462: */
+ RTUNI_ALPHA, /* U+00c463: */
+ RTUNI_ALPHA, /* U+00c464: */
+ RTUNI_ALPHA, /* U+00c465: */
+ RTUNI_ALPHA, /* U+00c466: */
+ RTUNI_ALPHA, /* U+00c467: */
+ RTUNI_ALPHA, /* U+00c468: */
+ RTUNI_ALPHA, /* U+00c469: */
+ RTUNI_ALPHA, /* U+00c46a: */
+ RTUNI_ALPHA, /* U+00c46b: */
+ RTUNI_ALPHA, /* U+00c46c: */
+ RTUNI_ALPHA, /* U+00c46d: */
+ RTUNI_ALPHA, /* U+00c46e: */
+ RTUNI_ALPHA, /* U+00c46f: */
+ RTUNI_ALPHA, /* U+00c470: */
+ RTUNI_ALPHA, /* U+00c471: */
+ RTUNI_ALPHA, /* U+00c472: */
+ RTUNI_ALPHA, /* U+00c473: */
+ RTUNI_ALPHA, /* U+00c474: */
+ RTUNI_ALPHA, /* U+00c475: */
+ RTUNI_ALPHA, /* U+00c476: */
+ RTUNI_ALPHA, /* U+00c477: */
+ RTUNI_ALPHA, /* U+00c478: */
+ RTUNI_ALPHA, /* U+00c479: */
+ RTUNI_ALPHA, /* U+00c47a: */
+ RTUNI_ALPHA, /* U+00c47b: */
+ RTUNI_ALPHA, /* U+00c47c: */
+ RTUNI_ALPHA, /* U+00c47d: */
+ RTUNI_ALPHA, /* U+00c47e: */
+ RTUNI_ALPHA, /* U+00c47f: */
+ RTUNI_ALPHA, /* U+00c480: */
+ RTUNI_ALPHA, /* U+00c481: */
+ RTUNI_ALPHA, /* U+00c482: */
+ RTUNI_ALPHA, /* U+00c483: */
+ RTUNI_ALPHA, /* U+00c484: */
+ RTUNI_ALPHA, /* U+00c485: */
+ RTUNI_ALPHA, /* U+00c486: */
+ RTUNI_ALPHA, /* U+00c487: */
+ RTUNI_ALPHA, /* U+00c488: */
+ RTUNI_ALPHA, /* U+00c489: */
+ RTUNI_ALPHA, /* U+00c48a: */
+ RTUNI_ALPHA, /* U+00c48b: */
+ RTUNI_ALPHA, /* U+00c48c: */
+ RTUNI_ALPHA, /* U+00c48d: */
+ RTUNI_ALPHA, /* U+00c48e: */
+ RTUNI_ALPHA, /* U+00c48f: */
+ RTUNI_ALPHA, /* U+00c490: */
+ RTUNI_ALPHA, /* U+00c491: */
+ RTUNI_ALPHA, /* U+00c492: */
+ RTUNI_ALPHA, /* U+00c493: */
+ RTUNI_ALPHA, /* U+00c494: */
+ RTUNI_ALPHA, /* U+00c495: */
+ RTUNI_ALPHA, /* U+00c496: */
+ RTUNI_ALPHA, /* U+00c497: */
+ RTUNI_ALPHA, /* U+00c498: */
+ RTUNI_ALPHA, /* U+00c499: */
+ RTUNI_ALPHA, /* U+00c49a: */
+ RTUNI_ALPHA, /* U+00c49b: */
+ RTUNI_ALPHA, /* U+00c49c: */
+ RTUNI_ALPHA, /* U+00c49d: */
+ RTUNI_ALPHA, /* U+00c49e: */
+ RTUNI_ALPHA, /* U+00c49f: */
+ RTUNI_ALPHA, /* U+00c4a0: */
+ RTUNI_ALPHA, /* U+00c4a1: */
+ RTUNI_ALPHA, /* U+00c4a2: */
+ RTUNI_ALPHA, /* U+00c4a3: */
+ RTUNI_ALPHA, /* U+00c4a4: */
+ RTUNI_ALPHA, /* U+00c4a5: */
+ RTUNI_ALPHA, /* U+00c4a6: */
+ RTUNI_ALPHA, /* U+00c4a7: */
+ RTUNI_ALPHA, /* U+00c4a8: */
+ RTUNI_ALPHA, /* U+00c4a9: */
+ RTUNI_ALPHA, /* U+00c4aa: */
+ RTUNI_ALPHA, /* U+00c4ab: */
+ RTUNI_ALPHA, /* U+00c4ac: */
+ RTUNI_ALPHA, /* U+00c4ad: */
+ RTUNI_ALPHA, /* U+00c4ae: */
+ RTUNI_ALPHA, /* U+00c4af: */
+ RTUNI_ALPHA, /* U+00c4b0: */
+ RTUNI_ALPHA, /* U+00c4b1: */
+ RTUNI_ALPHA, /* U+00c4b2: */
+ RTUNI_ALPHA, /* U+00c4b3: */
+ RTUNI_ALPHA, /* U+00c4b4: */
+ RTUNI_ALPHA, /* U+00c4b5: */
+ RTUNI_ALPHA, /* U+00c4b6: */
+ RTUNI_ALPHA, /* U+00c4b7: */
+ RTUNI_ALPHA, /* U+00c4b8: */
+ RTUNI_ALPHA, /* U+00c4b9: */
+ RTUNI_ALPHA, /* U+00c4ba: */
+ RTUNI_ALPHA, /* U+00c4bb: */
+ RTUNI_ALPHA, /* U+00c4bc: */
+ RTUNI_ALPHA, /* U+00c4bd: */
+ RTUNI_ALPHA, /* U+00c4be: */
+ RTUNI_ALPHA, /* U+00c4bf: */
+ RTUNI_ALPHA, /* U+00c4c0: */
+ RTUNI_ALPHA, /* U+00c4c1: */
+ RTUNI_ALPHA, /* U+00c4c2: */
+ RTUNI_ALPHA, /* U+00c4c3: */
+ RTUNI_ALPHA, /* U+00c4c4: */
+ RTUNI_ALPHA, /* U+00c4c5: */
+ RTUNI_ALPHA, /* U+00c4c6: */
+ RTUNI_ALPHA, /* U+00c4c7: */
+ RTUNI_ALPHA, /* U+00c4c8: */
+ RTUNI_ALPHA, /* U+00c4c9: */
+ RTUNI_ALPHA, /* U+00c4ca: */
+ RTUNI_ALPHA, /* U+00c4cb: */
+ RTUNI_ALPHA, /* U+00c4cc: */
+ RTUNI_ALPHA, /* U+00c4cd: */
+ RTUNI_ALPHA, /* U+00c4ce: */
+ RTUNI_ALPHA, /* U+00c4cf: */
+ RTUNI_ALPHA, /* U+00c4d0: */
+ RTUNI_ALPHA, /* U+00c4d1: */
+ RTUNI_ALPHA, /* U+00c4d2: */
+ RTUNI_ALPHA, /* U+00c4d3: */
+ RTUNI_ALPHA, /* U+00c4d4: */
+ RTUNI_ALPHA, /* U+00c4d5: */
+ RTUNI_ALPHA, /* U+00c4d6: */
+ RTUNI_ALPHA, /* U+00c4d7: */
+ RTUNI_ALPHA, /* U+00c4d8: */
+ RTUNI_ALPHA, /* U+00c4d9: */
+ RTUNI_ALPHA, /* U+00c4da: */
+ RTUNI_ALPHA, /* U+00c4db: */
+ RTUNI_ALPHA, /* U+00c4dc: */
+ RTUNI_ALPHA, /* U+00c4dd: */
+ RTUNI_ALPHA, /* U+00c4de: */
+ RTUNI_ALPHA, /* U+00c4df: */
+ RTUNI_ALPHA, /* U+00c4e0: */
+ RTUNI_ALPHA, /* U+00c4e1: */
+ RTUNI_ALPHA, /* U+00c4e2: */
+ RTUNI_ALPHA, /* U+00c4e3: */
+ RTUNI_ALPHA, /* U+00c4e4: */
+ RTUNI_ALPHA, /* U+00c4e5: */
+ RTUNI_ALPHA, /* U+00c4e6: */
+ RTUNI_ALPHA, /* U+00c4e7: */
+ RTUNI_ALPHA, /* U+00c4e8: */
+ RTUNI_ALPHA, /* U+00c4e9: */
+ RTUNI_ALPHA, /* U+00c4ea: */
+ RTUNI_ALPHA, /* U+00c4eb: */
+ RTUNI_ALPHA, /* U+00c4ec: */
+ RTUNI_ALPHA, /* U+00c4ed: */
+ RTUNI_ALPHA, /* U+00c4ee: */
+ RTUNI_ALPHA, /* U+00c4ef: */
+ RTUNI_ALPHA, /* U+00c4f0: */
+ RTUNI_ALPHA, /* U+00c4f1: */
+ RTUNI_ALPHA, /* U+00c4f2: */
+ RTUNI_ALPHA, /* U+00c4f3: */
+ RTUNI_ALPHA, /* U+00c4f4: */
+ RTUNI_ALPHA, /* U+00c4f5: */
+ RTUNI_ALPHA, /* U+00c4f6: */
+ RTUNI_ALPHA, /* U+00c4f7: */
+ RTUNI_ALPHA, /* U+00c4f8: */
+ RTUNI_ALPHA, /* U+00c4f9: */
+ RTUNI_ALPHA, /* U+00c4fa: */
+ RTUNI_ALPHA, /* U+00c4fb: */
+ RTUNI_ALPHA, /* U+00c4fc: */
+ RTUNI_ALPHA, /* U+00c4fd: */
+ RTUNI_ALPHA, /* U+00c4fe: */
+ RTUNI_ALPHA, /* U+00c4ff: */
+ RTUNI_ALPHA, /* U+00c500: */
+ RTUNI_ALPHA, /* U+00c501: */
+ RTUNI_ALPHA, /* U+00c502: */
+ RTUNI_ALPHA, /* U+00c503: */
+ RTUNI_ALPHA, /* U+00c504: */
+ RTUNI_ALPHA, /* U+00c505: */
+ RTUNI_ALPHA, /* U+00c506: */
+ RTUNI_ALPHA, /* U+00c507: */
+ RTUNI_ALPHA, /* U+00c508: */
+ RTUNI_ALPHA, /* U+00c509: */
+ RTUNI_ALPHA, /* U+00c50a: */
+ RTUNI_ALPHA, /* U+00c50b: */
+ RTUNI_ALPHA, /* U+00c50c: */
+ RTUNI_ALPHA, /* U+00c50d: */
+ RTUNI_ALPHA, /* U+00c50e: */
+ RTUNI_ALPHA, /* U+00c50f: */
+ RTUNI_ALPHA, /* U+00c510: */
+ RTUNI_ALPHA, /* U+00c511: */
+ RTUNI_ALPHA, /* U+00c512: */
+ RTUNI_ALPHA, /* U+00c513: */
+ RTUNI_ALPHA, /* U+00c514: */
+ RTUNI_ALPHA, /* U+00c515: */
+ RTUNI_ALPHA, /* U+00c516: */
+ RTUNI_ALPHA, /* U+00c517: */
+ RTUNI_ALPHA, /* U+00c518: */
+ RTUNI_ALPHA, /* U+00c519: */
+ RTUNI_ALPHA, /* U+00c51a: */
+ RTUNI_ALPHA, /* U+00c51b: */
+ RTUNI_ALPHA, /* U+00c51c: */
+ RTUNI_ALPHA, /* U+00c51d: */
+ RTUNI_ALPHA, /* U+00c51e: */
+ RTUNI_ALPHA, /* U+00c51f: */
+ RTUNI_ALPHA, /* U+00c520: */
+ RTUNI_ALPHA, /* U+00c521: */
+ RTUNI_ALPHA, /* U+00c522: */
+ RTUNI_ALPHA, /* U+00c523: */
+ RTUNI_ALPHA, /* U+00c524: */
+ RTUNI_ALPHA, /* U+00c525: */
+ RTUNI_ALPHA, /* U+00c526: */
+ RTUNI_ALPHA, /* U+00c527: */
+ RTUNI_ALPHA, /* U+00c528: */
+ RTUNI_ALPHA, /* U+00c529: */
+ RTUNI_ALPHA, /* U+00c52a: */
+ RTUNI_ALPHA, /* U+00c52b: */
+ RTUNI_ALPHA, /* U+00c52c: */
+ RTUNI_ALPHA, /* U+00c52d: */
+ RTUNI_ALPHA, /* U+00c52e: */
+ RTUNI_ALPHA, /* U+00c52f: */
+ RTUNI_ALPHA, /* U+00c530: */
+ RTUNI_ALPHA, /* U+00c531: */
+ RTUNI_ALPHA, /* U+00c532: */
+ RTUNI_ALPHA, /* U+00c533: */
+ RTUNI_ALPHA, /* U+00c534: */
+ RTUNI_ALPHA, /* U+00c535: */
+ RTUNI_ALPHA, /* U+00c536: */
+ RTUNI_ALPHA, /* U+00c537: */
+ RTUNI_ALPHA, /* U+00c538: */
+ RTUNI_ALPHA, /* U+00c539: */
+ RTUNI_ALPHA, /* U+00c53a: */
+ RTUNI_ALPHA, /* U+00c53b: */
+ RTUNI_ALPHA, /* U+00c53c: */
+ RTUNI_ALPHA, /* U+00c53d: */
+ RTUNI_ALPHA, /* U+00c53e: */
+ RTUNI_ALPHA, /* U+00c53f: */
+ RTUNI_ALPHA, /* U+00c540: */
+ RTUNI_ALPHA, /* U+00c541: */
+ RTUNI_ALPHA, /* U+00c542: */
+ RTUNI_ALPHA, /* U+00c543: */
+ RTUNI_ALPHA, /* U+00c544: */
+ RTUNI_ALPHA, /* U+00c545: */
+ RTUNI_ALPHA, /* U+00c546: */
+ RTUNI_ALPHA, /* U+00c547: */
+ RTUNI_ALPHA, /* U+00c548: */
+ RTUNI_ALPHA, /* U+00c549: */
+ RTUNI_ALPHA, /* U+00c54a: */
+ RTUNI_ALPHA, /* U+00c54b: */
+ RTUNI_ALPHA, /* U+00c54c: */
+ RTUNI_ALPHA, /* U+00c54d: */
+ RTUNI_ALPHA, /* U+00c54e: */
+ RTUNI_ALPHA, /* U+00c54f: */
+ RTUNI_ALPHA, /* U+00c550: */
+ RTUNI_ALPHA, /* U+00c551: */
+ RTUNI_ALPHA, /* U+00c552: */
+ RTUNI_ALPHA, /* U+00c553: */
+ RTUNI_ALPHA, /* U+00c554: */
+ RTUNI_ALPHA, /* U+00c555: */
+ RTUNI_ALPHA, /* U+00c556: */
+ RTUNI_ALPHA, /* U+00c557: */
+ RTUNI_ALPHA, /* U+00c558: */
+ RTUNI_ALPHA, /* U+00c559: */
+ RTUNI_ALPHA, /* U+00c55a: */
+ RTUNI_ALPHA, /* U+00c55b: */
+ RTUNI_ALPHA, /* U+00c55c: */
+ RTUNI_ALPHA, /* U+00c55d: */
+ RTUNI_ALPHA, /* U+00c55e: */
+ RTUNI_ALPHA, /* U+00c55f: */
+ RTUNI_ALPHA, /* U+00c560: */
+ RTUNI_ALPHA, /* U+00c561: */
+ RTUNI_ALPHA, /* U+00c562: */
+ RTUNI_ALPHA, /* U+00c563: */
+ RTUNI_ALPHA, /* U+00c564: */
+ RTUNI_ALPHA, /* U+00c565: */
+ RTUNI_ALPHA, /* U+00c566: */
+ RTUNI_ALPHA, /* U+00c567: */
+ RTUNI_ALPHA, /* U+00c568: */
+ RTUNI_ALPHA, /* U+00c569: */
+ RTUNI_ALPHA, /* U+00c56a: */
+ RTUNI_ALPHA, /* U+00c56b: */
+ RTUNI_ALPHA, /* U+00c56c: */
+ RTUNI_ALPHA, /* U+00c56d: */
+ RTUNI_ALPHA, /* U+00c56e: */
+ RTUNI_ALPHA, /* U+00c56f: */
+ RTUNI_ALPHA, /* U+00c570: */
+ RTUNI_ALPHA, /* U+00c571: */
+ RTUNI_ALPHA, /* U+00c572: */
+ RTUNI_ALPHA, /* U+00c573: */
+ RTUNI_ALPHA, /* U+00c574: */
+ RTUNI_ALPHA, /* U+00c575: */
+ RTUNI_ALPHA, /* U+00c576: */
+ RTUNI_ALPHA, /* U+00c577: */
+ RTUNI_ALPHA, /* U+00c578: */
+ RTUNI_ALPHA, /* U+00c579: */
+ RTUNI_ALPHA, /* U+00c57a: */
+ RTUNI_ALPHA, /* U+00c57b: */
+ RTUNI_ALPHA, /* U+00c57c: */
+ RTUNI_ALPHA, /* U+00c57d: */
+ RTUNI_ALPHA, /* U+00c57e: */
+ RTUNI_ALPHA, /* U+00c57f: */
+ RTUNI_ALPHA, /* U+00c580: */
+ RTUNI_ALPHA, /* U+00c581: */
+ RTUNI_ALPHA, /* U+00c582: */
+ RTUNI_ALPHA, /* U+00c583: */
+ RTUNI_ALPHA, /* U+00c584: */
+ RTUNI_ALPHA, /* U+00c585: */
+ RTUNI_ALPHA, /* U+00c586: */
+ RTUNI_ALPHA, /* U+00c587: */
+ RTUNI_ALPHA, /* U+00c588: */
+ RTUNI_ALPHA, /* U+00c589: */
+ RTUNI_ALPHA, /* U+00c58a: */
+ RTUNI_ALPHA, /* U+00c58b: */
+ RTUNI_ALPHA, /* U+00c58c: */
+ RTUNI_ALPHA, /* U+00c58d: */
+ RTUNI_ALPHA, /* U+00c58e: */
+ RTUNI_ALPHA, /* U+00c58f: */
+ RTUNI_ALPHA, /* U+00c590: */
+ RTUNI_ALPHA, /* U+00c591: */
+ RTUNI_ALPHA, /* U+00c592: */
+ RTUNI_ALPHA, /* U+00c593: */
+ RTUNI_ALPHA, /* U+00c594: */
+ RTUNI_ALPHA, /* U+00c595: */
+ RTUNI_ALPHA, /* U+00c596: */
+ RTUNI_ALPHA, /* U+00c597: */
+ RTUNI_ALPHA, /* U+00c598: */
+ RTUNI_ALPHA, /* U+00c599: */
+ RTUNI_ALPHA, /* U+00c59a: */
+ RTUNI_ALPHA, /* U+00c59b: */
+ RTUNI_ALPHA, /* U+00c59c: */
+ RTUNI_ALPHA, /* U+00c59d: */
+ RTUNI_ALPHA, /* U+00c59e: */
+ RTUNI_ALPHA, /* U+00c59f: */
+ RTUNI_ALPHA, /* U+00c5a0: */
+ RTUNI_ALPHA, /* U+00c5a1: */
+ RTUNI_ALPHA, /* U+00c5a2: */
+ RTUNI_ALPHA, /* U+00c5a3: */
+ RTUNI_ALPHA, /* U+00c5a4: */
+ RTUNI_ALPHA, /* U+00c5a5: */
+ RTUNI_ALPHA, /* U+00c5a6: */
+ RTUNI_ALPHA, /* U+00c5a7: */
+ RTUNI_ALPHA, /* U+00c5a8: */
+ RTUNI_ALPHA, /* U+00c5a9: */
+ RTUNI_ALPHA, /* U+00c5aa: */
+ RTUNI_ALPHA, /* U+00c5ab: */
+ RTUNI_ALPHA, /* U+00c5ac: */
+ RTUNI_ALPHA, /* U+00c5ad: */
+ RTUNI_ALPHA, /* U+00c5ae: */
+ RTUNI_ALPHA, /* U+00c5af: */
+ RTUNI_ALPHA, /* U+00c5b0: */
+ RTUNI_ALPHA, /* U+00c5b1: */
+ RTUNI_ALPHA, /* U+00c5b2: */
+ RTUNI_ALPHA, /* U+00c5b3: */
+ RTUNI_ALPHA, /* U+00c5b4: */
+ RTUNI_ALPHA, /* U+00c5b5: */
+ RTUNI_ALPHA, /* U+00c5b6: */
+ RTUNI_ALPHA, /* U+00c5b7: */
+ RTUNI_ALPHA, /* U+00c5b8: */
+ RTUNI_ALPHA, /* U+00c5b9: */
+ RTUNI_ALPHA, /* U+00c5ba: */
+ RTUNI_ALPHA, /* U+00c5bb: */
+ RTUNI_ALPHA, /* U+00c5bc: */
+ RTUNI_ALPHA, /* U+00c5bd: */
+ RTUNI_ALPHA, /* U+00c5be: */
+ RTUNI_ALPHA, /* U+00c5bf: */
+ RTUNI_ALPHA, /* U+00c5c0: */
+ RTUNI_ALPHA, /* U+00c5c1: */
+ RTUNI_ALPHA, /* U+00c5c2: */
+ RTUNI_ALPHA, /* U+00c5c3: */
+ RTUNI_ALPHA, /* U+00c5c4: */
+ RTUNI_ALPHA, /* U+00c5c5: */
+ RTUNI_ALPHA, /* U+00c5c6: */
+ RTUNI_ALPHA, /* U+00c5c7: */
+ RTUNI_ALPHA, /* U+00c5c8: */
+ RTUNI_ALPHA, /* U+00c5c9: */
+ RTUNI_ALPHA, /* U+00c5ca: */
+ RTUNI_ALPHA, /* U+00c5cb: */
+ RTUNI_ALPHA, /* U+00c5cc: */
+ RTUNI_ALPHA, /* U+00c5cd: */
+ RTUNI_ALPHA, /* U+00c5ce: */
+ RTUNI_ALPHA, /* U+00c5cf: */
+ RTUNI_ALPHA, /* U+00c5d0: */
+ RTUNI_ALPHA, /* U+00c5d1: */
+ RTUNI_ALPHA, /* U+00c5d2: */
+ RTUNI_ALPHA, /* U+00c5d3: */
+ RTUNI_ALPHA, /* U+00c5d4: */
+ RTUNI_ALPHA, /* U+00c5d5: */
+ RTUNI_ALPHA, /* U+00c5d6: */
+ RTUNI_ALPHA, /* U+00c5d7: */
+ RTUNI_ALPHA, /* U+00c5d8: */
+ RTUNI_ALPHA, /* U+00c5d9: */
+ RTUNI_ALPHA, /* U+00c5da: */
+ RTUNI_ALPHA, /* U+00c5db: */
+ RTUNI_ALPHA, /* U+00c5dc: */
+ RTUNI_ALPHA, /* U+00c5dd: */
+ RTUNI_ALPHA, /* U+00c5de: */
+ RTUNI_ALPHA, /* U+00c5df: */
+ RTUNI_ALPHA, /* U+00c5e0: */
+ RTUNI_ALPHA, /* U+00c5e1: */
+ RTUNI_ALPHA, /* U+00c5e2: */
+ RTUNI_ALPHA, /* U+00c5e3: */
+ RTUNI_ALPHA, /* U+00c5e4: */
+ RTUNI_ALPHA, /* U+00c5e5: */
+ RTUNI_ALPHA, /* U+00c5e6: */
+ RTUNI_ALPHA, /* U+00c5e7: */
+ RTUNI_ALPHA, /* U+00c5e8: */
+ RTUNI_ALPHA, /* U+00c5e9: */
+ RTUNI_ALPHA, /* U+00c5ea: */
+ RTUNI_ALPHA, /* U+00c5eb: */
+ RTUNI_ALPHA, /* U+00c5ec: */
+ RTUNI_ALPHA, /* U+00c5ed: */
+ RTUNI_ALPHA, /* U+00c5ee: */
+ RTUNI_ALPHA, /* U+00c5ef: */
+ RTUNI_ALPHA, /* U+00c5f0: */
+ RTUNI_ALPHA, /* U+00c5f1: */
+ RTUNI_ALPHA, /* U+00c5f2: */
+ RTUNI_ALPHA, /* U+00c5f3: */
+ RTUNI_ALPHA, /* U+00c5f4: */
+ RTUNI_ALPHA, /* U+00c5f5: */
+ RTUNI_ALPHA, /* U+00c5f6: */
+ RTUNI_ALPHA, /* U+00c5f7: */
+ RTUNI_ALPHA, /* U+00c5f8: */
+ RTUNI_ALPHA, /* U+00c5f9: */
+ RTUNI_ALPHA, /* U+00c5fa: */
+ RTUNI_ALPHA, /* U+00c5fb: */
+ RTUNI_ALPHA, /* U+00c5fc: */
+ RTUNI_ALPHA, /* U+00c5fd: */
+ RTUNI_ALPHA, /* U+00c5fe: */
+ RTUNI_ALPHA, /* U+00c5ff: */
+ RTUNI_ALPHA, /* U+00c600: */
+ RTUNI_ALPHA, /* U+00c601: */
+ RTUNI_ALPHA, /* U+00c602: */
+ RTUNI_ALPHA, /* U+00c603: */
+ RTUNI_ALPHA, /* U+00c604: */
+ RTUNI_ALPHA, /* U+00c605: */
+ RTUNI_ALPHA, /* U+00c606: */
+ RTUNI_ALPHA, /* U+00c607: */
+ RTUNI_ALPHA, /* U+00c608: */
+ RTUNI_ALPHA, /* U+00c609: */
+ RTUNI_ALPHA, /* U+00c60a: */
+ RTUNI_ALPHA, /* U+00c60b: */
+ RTUNI_ALPHA, /* U+00c60c: */
+ RTUNI_ALPHA, /* U+00c60d: */
+ RTUNI_ALPHA, /* U+00c60e: */
+ RTUNI_ALPHA, /* U+00c60f: */
+ RTUNI_ALPHA, /* U+00c610: */
+ RTUNI_ALPHA, /* U+00c611: */
+ RTUNI_ALPHA, /* U+00c612: */
+ RTUNI_ALPHA, /* U+00c613: */
+ RTUNI_ALPHA, /* U+00c614: */
+ RTUNI_ALPHA, /* U+00c615: */
+ RTUNI_ALPHA, /* U+00c616: */
+ RTUNI_ALPHA, /* U+00c617: */
+ RTUNI_ALPHA, /* U+00c618: */
+ RTUNI_ALPHA, /* U+00c619: */
+ RTUNI_ALPHA, /* U+00c61a: */
+ RTUNI_ALPHA, /* U+00c61b: */
+ RTUNI_ALPHA, /* U+00c61c: */
+ RTUNI_ALPHA, /* U+00c61d: */
+ RTUNI_ALPHA, /* U+00c61e: */
+ RTUNI_ALPHA, /* U+00c61f: */
+ RTUNI_ALPHA, /* U+00c620: */
+ RTUNI_ALPHA, /* U+00c621: */
+ RTUNI_ALPHA, /* U+00c622: */
+ RTUNI_ALPHA, /* U+00c623: */
+ RTUNI_ALPHA, /* U+00c624: */
+ RTUNI_ALPHA, /* U+00c625: */
+ RTUNI_ALPHA, /* U+00c626: */
+ RTUNI_ALPHA, /* U+00c627: */
+ RTUNI_ALPHA, /* U+00c628: */
+ RTUNI_ALPHA, /* U+00c629: */
+ RTUNI_ALPHA, /* U+00c62a: */
+ RTUNI_ALPHA, /* U+00c62b: */
+ RTUNI_ALPHA, /* U+00c62c: */
+ RTUNI_ALPHA, /* U+00c62d: */
+ RTUNI_ALPHA, /* U+00c62e: */
+ RTUNI_ALPHA, /* U+00c62f: */
+ RTUNI_ALPHA, /* U+00c630: */
+ RTUNI_ALPHA, /* U+00c631: */
+ RTUNI_ALPHA, /* U+00c632: */
+ RTUNI_ALPHA, /* U+00c633: */
+ RTUNI_ALPHA, /* U+00c634: */
+ RTUNI_ALPHA, /* U+00c635: */
+ RTUNI_ALPHA, /* U+00c636: */
+ RTUNI_ALPHA, /* U+00c637: */
+ RTUNI_ALPHA, /* U+00c638: */
+ RTUNI_ALPHA, /* U+00c639: */
+ RTUNI_ALPHA, /* U+00c63a: */
+ RTUNI_ALPHA, /* U+00c63b: */
+ RTUNI_ALPHA, /* U+00c63c: */
+ RTUNI_ALPHA, /* U+00c63d: */
+ RTUNI_ALPHA, /* U+00c63e: */
+ RTUNI_ALPHA, /* U+00c63f: */
+ RTUNI_ALPHA, /* U+00c640: */
+ RTUNI_ALPHA, /* U+00c641: */
+ RTUNI_ALPHA, /* U+00c642: */
+ RTUNI_ALPHA, /* U+00c643: */
+ RTUNI_ALPHA, /* U+00c644: */
+ RTUNI_ALPHA, /* U+00c645: */
+ RTUNI_ALPHA, /* U+00c646: */
+ RTUNI_ALPHA, /* U+00c647: */
+ RTUNI_ALPHA, /* U+00c648: */
+ RTUNI_ALPHA, /* U+00c649: */
+ RTUNI_ALPHA, /* U+00c64a: */
+ RTUNI_ALPHA, /* U+00c64b: */
+ RTUNI_ALPHA, /* U+00c64c: */
+ RTUNI_ALPHA, /* U+00c64d: */
+ RTUNI_ALPHA, /* U+00c64e: */
+ RTUNI_ALPHA, /* U+00c64f: */
+ RTUNI_ALPHA, /* U+00c650: */
+ RTUNI_ALPHA, /* U+00c651: */
+ RTUNI_ALPHA, /* U+00c652: */
+ RTUNI_ALPHA, /* U+00c653: */
+ RTUNI_ALPHA, /* U+00c654: */
+ RTUNI_ALPHA, /* U+00c655: */
+ RTUNI_ALPHA, /* U+00c656: */
+ RTUNI_ALPHA, /* U+00c657: */
+ RTUNI_ALPHA, /* U+00c658: */
+ RTUNI_ALPHA, /* U+00c659: */
+ RTUNI_ALPHA, /* U+00c65a: */
+ RTUNI_ALPHA, /* U+00c65b: */
+ RTUNI_ALPHA, /* U+00c65c: */
+ RTUNI_ALPHA, /* U+00c65d: */
+ RTUNI_ALPHA, /* U+00c65e: */
+ RTUNI_ALPHA, /* U+00c65f: */
+ RTUNI_ALPHA, /* U+00c660: */
+ RTUNI_ALPHA, /* U+00c661: */
+ RTUNI_ALPHA, /* U+00c662: */
+ RTUNI_ALPHA, /* U+00c663: */
+ RTUNI_ALPHA, /* U+00c664: */
+ RTUNI_ALPHA, /* U+00c665: */
+ RTUNI_ALPHA, /* U+00c666: */
+ RTUNI_ALPHA, /* U+00c667: */
+ RTUNI_ALPHA, /* U+00c668: */
+ RTUNI_ALPHA, /* U+00c669: */
+ RTUNI_ALPHA, /* U+00c66a: */
+ RTUNI_ALPHA, /* U+00c66b: */
+ RTUNI_ALPHA, /* U+00c66c: */
+ RTUNI_ALPHA, /* U+00c66d: */
+ RTUNI_ALPHA, /* U+00c66e: */
+ RTUNI_ALPHA, /* U+00c66f: */
+ RTUNI_ALPHA, /* U+00c670: */
+ RTUNI_ALPHA, /* U+00c671: */
+ RTUNI_ALPHA, /* U+00c672: */
+ RTUNI_ALPHA, /* U+00c673: */
+ RTUNI_ALPHA, /* U+00c674: */
+ RTUNI_ALPHA, /* U+00c675: */
+ RTUNI_ALPHA, /* U+00c676: */
+ RTUNI_ALPHA, /* U+00c677: */
+ RTUNI_ALPHA, /* U+00c678: */
+ RTUNI_ALPHA, /* U+00c679: */
+ RTUNI_ALPHA, /* U+00c67a: */
+ RTUNI_ALPHA, /* U+00c67b: */
+ RTUNI_ALPHA, /* U+00c67c: */
+ RTUNI_ALPHA, /* U+00c67d: */
+ RTUNI_ALPHA, /* U+00c67e: */
+ RTUNI_ALPHA, /* U+00c67f: */
+ RTUNI_ALPHA, /* U+00c680: */
+ RTUNI_ALPHA, /* U+00c681: */
+ RTUNI_ALPHA, /* U+00c682: */
+ RTUNI_ALPHA, /* U+00c683: */
+ RTUNI_ALPHA, /* U+00c684: */
+ RTUNI_ALPHA, /* U+00c685: */
+ RTUNI_ALPHA, /* U+00c686: */
+ RTUNI_ALPHA, /* U+00c687: */
+ RTUNI_ALPHA, /* U+00c688: */
+ RTUNI_ALPHA, /* U+00c689: */
+ RTUNI_ALPHA, /* U+00c68a: */
+ RTUNI_ALPHA, /* U+00c68b: */
+ RTUNI_ALPHA, /* U+00c68c: */
+ RTUNI_ALPHA, /* U+00c68d: */
+ RTUNI_ALPHA, /* U+00c68e: */
+ RTUNI_ALPHA, /* U+00c68f: */
+ RTUNI_ALPHA, /* U+00c690: */
+ RTUNI_ALPHA, /* U+00c691: */
+ RTUNI_ALPHA, /* U+00c692: */
+ RTUNI_ALPHA, /* U+00c693: */
+ RTUNI_ALPHA, /* U+00c694: */
+ RTUNI_ALPHA, /* U+00c695: */
+ RTUNI_ALPHA, /* U+00c696: */
+ RTUNI_ALPHA, /* U+00c697: */
+ RTUNI_ALPHA, /* U+00c698: */
+ RTUNI_ALPHA, /* U+00c699: */
+ RTUNI_ALPHA, /* U+00c69a: */
+ RTUNI_ALPHA, /* U+00c69b: */
+ RTUNI_ALPHA, /* U+00c69c: */
+ RTUNI_ALPHA, /* U+00c69d: */
+ RTUNI_ALPHA, /* U+00c69e: */
+ RTUNI_ALPHA, /* U+00c69f: */
+ RTUNI_ALPHA, /* U+00c6a0: */
+ RTUNI_ALPHA, /* U+00c6a1: */
+ RTUNI_ALPHA, /* U+00c6a2: */
+ RTUNI_ALPHA, /* U+00c6a3: */
+ RTUNI_ALPHA, /* U+00c6a4: */
+ RTUNI_ALPHA, /* U+00c6a5: */
+ RTUNI_ALPHA, /* U+00c6a6: */
+ RTUNI_ALPHA, /* U+00c6a7: */
+ RTUNI_ALPHA, /* U+00c6a8: */
+ RTUNI_ALPHA, /* U+00c6a9: */
+ RTUNI_ALPHA, /* U+00c6aa: */
+ RTUNI_ALPHA, /* U+00c6ab: */
+ RTUNI_ALPHA, /* U+00c6ac: */
+ RTUNI_ALPHA, /* U+00c6ad: */
+ RTUNI_ALPHA, /* U+00c6ae: */
+ RTUNI_ALPHA, /* U+00c6af: */
+ RTUNI_ALPHA, /* U+00c6b0: */
+ RTUNI_ALPHA, /* U+00c6b1: */
+ RTUNI_ALPHA, /* U+00c6b2: */
+ RTUNI_ALPHA, /* U+00c6b3: */
+ RTUNI_ALPHA, /* U+00c6b4: */
+ RTUNI_ALPHA, /* U+00c6b5: */
+ RTUNI_ALPHA, /* U+00c6b6: */
+ RTUNI_ALPHA, /* U+00c6b7: */
+ RTUNI_ALPHA, /* U+00c6b8: */
+ RTUNI_ALPHA, /* U+00c6b9: */
+ RTUNI_ALPHA, /* U+00c6ba: */
+ RTUNI_ALPHA, /* U+00c6bb: */
+ RTUNI_ALPHA, /* U+00c6bc: */
+ RTUNI_ALPHA, /* U+00c6bd: */
+ RTUNI_ALPHA, /* U+00c6be: */
+ RTUNI_ALPHA, /* U+00c6bf: */
+ RTUNI_ALPHA, /* U+00c6c0: */
+ RTUNI_ALPHA, /* U+00c6c1: */
+ RTUNI_ALPHA, /* U+00c6c2: */
+ RTUNI_ALPHA, /* U+00c6c3: */
+ RTUNI_ALPHA, /* U+00c6c4: */
+ RTUNI_ALPHA, /* U+00c6c5: */
+ RTUNI_ALPHA, /* U+00c6c6: */
+ RTUNI_ALPHA, /* U+00c6c7: */
+ RTUNI_ALPHA, /* U+00c6c8: */
+ RTUNI_ALPHA, /* U+00c6c9: */
+ RTUNI_ALPHA, /* U+00c6ca: */
+ RTUNI_ALPHA, /* U+00c6cb: */
+ RTUNI_ALPHA, /* U+00c6cc: */
+ RTUNI_ALPHA, /* U+00c6cd: */
+ RTUNI_ALPHA, /* U+00c6ce: */
+ RTUNI_ALPHA, /* U+00c6cf: */
+ RTUNI_ALPHA, /* U+00c6d0: */
+ RTUNI_ALPHA, /* U+00c6d1: */
+ RTUNI_ALPHA, /* U+00c6d2: */
+ RTUNI_ALPHA, /* U+00c6d3: */
+ RTUNI_ALPHA, /* U+00c6d4: */
+ RTUNI_ALPHA, /* U+00c6d5: */
+ RTUNI_ALPHA, /* U+00c6d6: */
+ RTUNI_ALPHA, /* U+00c6d7: */
+ RTUNI_ALPHA, /* U+00c6d8: */
+ RTUNI_ALPHA, /* U+00c6d9: */
+ RTUNI_ALPHA, /* U+00c6da: */
+ RTUNI_ALPHA, /* U+00c6db: */
+ RTUNI_ALPHA, /* U+00c6dc: */
+ RTUNI_ALPHA, /* U+00c6dd: */
+ RTUNI_ALPHA, /* U+00c6de: */
+ RTUNI_ALPHA, /* U+00c6df: */
+ RTUNI_ALPHA, /* U+00c6e0: */
+ RTUNI_ALPHA, /* U+00c6e1: */
+ RTUNI_ALPHA, /* U+00c6e2: */
+ RTUNI_ALPHA, /* U+00c6e3: */
+ RTUNI_ALPHA, /* U+00c6e4: */
+ RTUNI_ALPHA, /* U+00c6e5: */
+ RTUNI_ALPHA, /* U+00c6e6: */
+ RTUNI_ALPHA, /* U+00c6e7: */
+ RTUNI_ALPHA, /* U+00c6e8: */
+ RTUNI_ALPHA, /* U+00c6e9: */
+ RTUNI_ALPHA, /* U+00c6ea: */
+ RTUNI_ALPHA, /* U+00c6eb: */
+ RTUNI_ALPHA, /* U+00c6ec: */
+ RTUNI_ALPHA, /* U+00c6ed: */
+ RTUNI_ALPHA, /* U+00c6ee: */
+ RTUNI_ALPHA, /* U+00c6ef: */
+ RTUNI_ALPHA, /* U+00c6f0: */
+ RTUNI_ALPHA, /* U+00c6f1: */
+ RTUNI_ALPHA, /* U+00c6f2: */
+ RTUNI_ALPHA, /* U+00c6f3: */
+ RTUNI_ALPHA, /* U+00c6f4: */
+ RTUNI_ALPHA, /* U+00c6f5: */
+ RTUNI_ALPHA, /* U+00c6f6: */
+ RTUNI_ALPHA, /* U+00c6f7: */
+ RTUNI_ALPHA, /* U+00c6f8: */
+ RTUNI_ALPHA, /* U+00c6f9: */
+ RTUNI_ALPHA, /* U+00c6fa: */
+ RTUNI_ALPHA, /* U+00c6fb: */
+ RTUNI_ALPHA, /* U+00c6fc: */
+ RTUNI_ALPHA, /* U+00c6fd: */
+ RTUNI_ALPHA, /* U+00c6fe: */
+ RTUNI_ALPHA, /* U+00c6ff: */
+ RTUNI_ALPHA, /* U+00c700: */
+ RTUNI_ALPHA, /* U+00c701: */
+ RTUNI_ALPHA, /* U+00c702: */
+ RTUNI_ALPHA, /* U+00c703: */
+ RTUNI_ALPHA, /* U+00c704: */
+ RTUNI_ALPHA, /* U+00c705: */
+ RTUNI_ALPHA, /* U+00c706: */
+ RTUNI_ALPHA, /* U+00c707: */
+ RTUNI_ALPHA, /* U+00c708: */
+ RTUNI_ALPHA, /* U+00c709: */
+ RTUNI_ALPHA, /* U+00c70a: */
+ RTUNI_ALPHA, /* U+00c70b: */
+ RTUNI_ALPHA, /* U+00c70c: */
+ RTUNI_ALPHA, /* U+00c70d: */
+ RTUNI_ALPHA, /* U+00c70e: */
+ RTUNI_ALPHA, /* U+00c70f: */
+ RTUNI_ALPHA, /* U+00c710: */
+ RTUNI_ALPHA, /* U+00c711: */
+ RTUNI_ALPHA, /* U+00c712: */
+ RTUNI_ALPHA, /* U+00c713: */
+ RTUNI_ALPHA, /* U+00c714: */
+ RTUNI_ALPHA, /* U+00c715: */
+ RTUNI_ALPHA, /* U+00c716: */
+ RTUNI_ALPHA, /* U+00c717: */
+ RTUNI_ALPHA, /* U+00c718: */
+ RTUNI_ALPHA, /* U+00c719: */
+ RTUNI_ALPHA, /* U+00c71a: */
+ RTUNI_ALPHA, /* U+00c71b: */
+ RTUNI_ALPHA, /* U+00c71c: */
+ RTUNI_ALPHA, /* U+00c71d: */
+ RTUNI_ALPHA, /* U+00c71e: */
+ RTUNI_ALPHA, /* U+00c71f: */
+ RTUNI_ALPHA, /* U+00c720: */
+ RTUNI_ALPHA, /* U+00c721: */
+ RTUNI_ALPHA, /* U+00c722: */
+ RTUNI_ALPHA, /* U+00c723: */
+ RTUNI_ALPHA, /* U+00c724: */
+ RTUNI_ALPHA, /* U+00c725: */
+ RTUNI_ALPHA, /* U+00c726: */
+ RTUNI_ALPHA, /* U+00c727: */
+ RTUNI_ALPHA, /* U+00c728: */
+ RTUNI_ALPHA, /* U+00c729: */
+ RTUNI_ALPHA, /* U+00c72a: */
+ RTUNI_ALPHA, /* U+00c72b: */
+ RTUNI_ALPHA, /* U+00c72c: */
+ RTUNI_ALPHA, /* U+00c72d: */
+ RTUNI_ALPHA, /* U+00c72e: */
+ RTUNI_ALPHA, /* U+00c72f: */
+ RTUNI_ALPHA, /* U+00c730: */
+ RTUNI_ALPHA, /* U+00c731: */
+ RTUNI_ALPHA, /* U+00c732: */
+ RTUNI_ALPHA, /* U+00c733: */
+ RTUNI_ALPHA, /* U+00c734: */
+ RTUNI_ALPHA, /* U+00c735: */
+ RTUNI_ALPHA, /* U+00c736: */
+ RTUNI_ALPHA, /* U+00c737: */
+ RTUNI_ALPHA, /* U+00c738: */
+ RTUNI_ALPHA, /* U+00c739: */
+ RTUNI_ALPHA, /* U+00c73a: */
+ RTUNI_ALPHA, /* U+00c73b: */
+ RTUNI_ALPHA, /* U+00c73c: */
+ RTUNI_ALPHA, /* U+00c73d: */
+ RTUNI_ALPHA, /* U+00c73e: */
+ RTUNI_ALPHA, /* U+00c73f: */
+ RTUNI_ALPHA, /* U+00c740: */
+ RTUNI_ALPHA, /* U+00c741: */
+ RTUNI_ALPHA, /* U+00c742: */
+ RTUNI_ALPHA, /* U+00c743: */
+ RTUNI_ALPHA, /* U+00c744: */
+ RTUNI_ALPHA, /* U+00c745: */
+ RTUNI_ALPHA, /* U+00c746: */
+ RTUNI_ALPHA, /* U+00c747: */
+ RTUNI_ALPHA, /* U+00c748: */
+ RTUNI_ALPHA, /* U+00c749: */
+ RTUNI_ALPHA, /* U+00c74a: */
+ RTUNI_ALPHA, /* U+00c74b: */
+ RTUNI_ALPHA, /* U+00c74c: */
+ RTUNI_ALPHA, /* U+00c74d: */
+ RTUNI_ALPHA, /* U+00c74e: */
+ RTUNI_ALPHA, /* U+00c74f: */
+ RTUNI_ALPHA, /* U+00c750: */
+ RTUNI_ALPHA, /* U+00c751: */
+ RTUNI_ALPHA, /* U+00c752: */
+ RTUNI_ALPHA, /* U+00c753: */
+ RTUNI_ALPHA, /* U+00c754: */
+ RTUNI_ALPHA, /* U+00c755: */
+ RTUNI_ALPHA, /* U+00c756: */
+ RTUNI_ALPHA, /* U+00c757: */
+ RTUNI_ALPHA, /* U+00c758: */
+ RTUNI_ALPHA, /* U+00c759: */
+ RTUNI_ALPHA, /* U+00c75a: */
+ RTUNI_ALPHA, /* U+00c75b: */
+ RTUNI_ALPHA, /* U+00c75c: */
+ RTUNI_ALPHA, /* U+00c75d: */
+ RTUNI_ALPHA, /* U+00c75e: */
+ RTUNI_ALPHA, /* U+00c75f: */
+ RTUNI_ALPHA, /* U+00c760: */
+ RTUNI_ALPHA, /* U+00c761: */
+ RTUNI_ALPHA, /* U+00c762: */
+ RTUNI_ALPHA, /* U+00c763: */
+ RTUNI_ALPHA, /* U+00c764: */
+ RTUNI_ALPHA, /* U+00c765: */
+ RTUNI_ALPHA, /* U+00c766: */
+ RTUNI_ALPHA, /* U+00c767: */
+ RTUNI_ALPHA, /* U+00c768: */
+ RTUNI_ALPHA, /* U+00c769: */
+ RTUNI_ALPHA, /* U+00c76a: */
+ RTUNI_ALPHA, /* U+00c76b: */
+ RTUNI_ALPHA, /* U+00c76c: */
+ RTUNI_ALPHA, /* U+00c76d: */
+ RTUNI_ALPHA, /* U+00c76e: */
+ RTUNI_ALPHA, /* U+00c76f: */
+ RTUNI_ALPHA, /* U+00c770: */
+ RTUNI_ALPHA, /* U+00c771: */
+ RTUNI_ALPHA, /* U+00c772: */
+ RTUNI_ALPHA, /* U+00c773: */
+ RTUNI_ALPHA, /* U+00c774: */
+ RTUNI_ALPHA, /* U+00c775: */
+ RTUNI_ALPHA, /* U+00c776: */
+ RTUNI_ALPHA, /* U+00c777: */
+ RTUNI_ALPHA, /* U+00c778: */
+ RTUNI_ALPHA, /* U+00c779: */
+ RTUNI_ALPHA, /* U+00c77a: */
+ RTUNI_ALPHA, /* U+00c77b: */
+ RTUNI_ALPHA, /* U+00c77c: */
+ RTUNI_ALPHA, /* U+00c77d: */
+ RTUNI_ALPHA, /* U+00c77e: */
+ RTUNI_ALPHA, /* U+00c77f: */
+ RTUNI_ALPHA, /* U+00c780: */
+ RTUNI_ALPHA, /* U+00c781: */
+ RTUNI_ALPHA, /* U+00c782: */
+ RTUNI_ALPHA, /* U+00c783: */
+ RTUNI_ALPHA, /* U+00c784: */
+ RTUNI_ALPHA, /* U+00c785: */
+ RTUNI_ALPHA, /* U+00c786: */
+ RTUNI_ALPHA, /* U+00c787: */
+ RTUNI_ALPHA, /* U+00c788: */
+ RTUNI_ALPHA, /* U+00c789: */
+ RTUNI_ALPHA, /* U+00c78a: */
+ RTUNI_ALPHA, /* U+00c78b: */
+ RTUNI_ALPHA, /* U+00c78c: */
+ RTUNI_ALPHA, /* U+00c78d: */
+ RTUNI_ALPHA, /* U+00c78e: */
+ RTUNI_ALPHA, /* U+00c78f: */
+ RTUNI_ALPHA, /* U+00c790: */
+ RTUNI_ALPHA, /* U+00c791: */
+ RTUNI_ALPHA, /* U+00c792: */
+ RTUNI_ALPHA, /* U+00c793: */
+ RTUNI_ALPHA, /* U+00c794: */
+ RTUNI_ALPHA, /* U+00c795: */
+ RTUNI_ALPHA, /* U+00c796: */
+ RTUNI_ALPHA, /* U+00c797: */
+ RTUNI_ALPHA, /* U+00c798: */
+ RTUNI_ALPHA, /* U+00c799: */
+ RTUNI_ALPHA, /* U+00c79a: */
+ RTUNI_ALPHA, /* U+00c79b: */
+ RTUNI_ALPHA, /* U+00c79c: */
+ RTUNI_ALPHA, /* U+00c79d: */
+ RTUNI_ALPHA, /* U+00c79e: */
+ RTUNI_ALPHA, /* U+00c79f: */
+ RTUNI_ALPHA, /* U+00c7a0: */
+ RTUNI_ALPHA, /* U+00c7a1: */
+ RTUNI_ALPHA, /* U+00c7a2: */
+ RTUNI_ALPHA, /* U+00c7a3: */
+ RTUNI_ALPHA, /* U+00c7a4: */
+ RTUNI_ALPHA, /* U+00c7a5: */
+ RTUNI_ALPHA, /* U+00c7a6: */
+ RTUNI_ALPHA, /* U+00c7a7: */
+ RTUNI_ALPHA, /* U+00c7a8: */
+ RTUNI_ALPHA, /* U+00c7a9: */
+ RTUNI_ALPHA, /* U+00c7aa: */
+ RTUNI_ALPHA, /* U+00c7ab: */
+ RTUNI_ALPHA, /* U+00c7ac: */
+ RTUNI_ALPHA, /* U+00c7ad: */
+ RTUNI_ALPHA, /* U+00c7ae: */
+ RTUNI_ALPHA, /* U+00c7af: */
+ RTUNI_ALPHA, /* U+00c7b0: */
+ RTUNI_ALPHA, /* U+00c7b1: */
+ RTUNI_ALPHA, /* U+00c7b2: */
+ RTUNI_ALPHA, /* U+00c7b3: */
+ RTUNI_ALPHA, /* U+00c7b4: */
+ RTUNI_ALPHA, /* U+00c7b5: */
+ RTUNI_ALPHA, /* U+00c7b6: */
+ RTUNI_ALPHA, /* U+00c7b7: */
+ RTUNI_ALPHA, /* U+00c7b8: */
+ RTUNI_ALPHA, /* U+00c7b9: */
+ RTUNI_ALPHA, /* U+00c7ba: */
+ RTUNI_ALPHA, /* U+00c7bb: */
+ RTUNI_ALPHA, /* U+00c7bc: */
+ RTUNI_ALPHA, /* U+00c7bd: */
+ RTUNI_ALPHA, /* U+00c7be: */
+ RTUNI_ALPHA, /* U+00c7bf: */
+ RTUNI_ALPHA, /* U+00c7c0: */
+ RTUNI_ALPHA, /* U+00c7c1: */
+ RTUNI_ALPHA, /* U+00c7c2: */
+ RTUNI_ALPHA, /* U+00c7c3: */
+ RTUNI_ALPHA, /* U+00c7c4: */
+ RTUNI_ALPHA, /* U+00c7c5: */
+ RTUNI_ALPHA, /* U+00c7c6: */
+ RTUNI_ALPHA, /* U+00c7c7: */
+ RTUNI_ALPHA, /* U+00c7c8: */
+ RTUNI_ALPHA, /* U+00c7c9: */
+ RTUNI_ALPHA, /* U+00c7ca: */
+ RTUNI_ALPHA, /* U+00c7cb: */
+ RTUNI_ALPHA, /* U+00c7cc: */
+ RTUNI_ALPHA, /* U+00c7cd: */
+ RTUNI_ALPHA, /* U+00c7ce: */
+ RTUNI_ALPHA, /* U+00c7cf: */
+ RTUNI_ALPHA, /* U+00c7d0: */
+ RTUNI_ALPHA, /* U+00c7d1: */
+ RTUNI_ALPHA, /* U+00c7d2: */
+ RTUNI_ALPHA, /* U+00c7d3: */
+ RTUNI_ALPHA, /* U+00c7d4: */
+ RTUNI_ALPHA, /* U+00c7d5: */
+ RTUNI_ALPHA, /* U+00c7d6: */
+ RTUNI_ALPHA, /* U+00c7d7: */
+ RTUNI_ALPHA, /* U+00c7d8: */
+ RTUNI_ALPHA, /* U+00c7d9: */
+ RTUNI_ALPHA, /* U+00c7da: */
+ RTUNI_ALPHA, /* U+00c7db: */
+ RTUNI_ALPHA, /* U+00c7dc: */
+ RTUNI_ALPHA, /* U+00c7dd: */
+ RTUNI_ALPHA, /* U+00c7de: */
+ RTUNI_ALPHA, /* U+00c7df: */
+ RTUNI_ALPHA, /* U+00c7e0: */
+ RTUNI_ALPHA, /* U+00c7e1: */
+ RTUNI_ALPHA, /* U+00c7e2: */
+ RTUNI_ALPHA, /* U+00c7e3: */
+ RTUNI_ALPHA, /* U+00c7e4: */
+ RTUNI_ALPHA, /* U+00c7e5: */
+ RTUNI_ALPHA, /* U+00c7e6: */
+ RTUNI_ALPHA, /* U+00c7e7: */
+ RTUNI_ALPHA, /* U+00c7e8: */
+ RTUNI_ALPHA, /* U+00c7e9: */
+ RTUNI_ALPHA, /* U+00c7ea: */
+ RTUNI_ALPHA, /* U+00c7eb: */
+ RTUNI_ALPHA, /* U+00c7ec: */
+ RTUNI_ALPHA, /* U+00c7ed: */
+ RTUNI_ALPHA, /* U+00c7ee: */
+ RTUNI_ALPHA, /* U+00c7ef: */
+ RTUNI_ALPHA, /* U+00c7f0: */
+ RTUNI_ALPHA, /* U+00c7f1: */
+ RTUNI_ALPHA, /* U+00c7f2: */
+ RTUNI_ALPHA, /* U+00c7f3: */
+ RTUNI_ALPHA, /* U+00c7f4: */
+ RTUNI_ALPHA, /* U+00c7f5: */
+ RTUNI_ALPHA, /* U+00c7f6: */
+ RTUNI_ALPHA, /* U+00c7f7: */
+ RTUNI_ALPHA, /* U+00c7f8: */
+ RTUNI_ALPHA, /* U+00c7f9: */
+ RTUNI_ALPHA, /* U+00c7fa: */
+ RTUNI_ALPHA, /* U+00c7fb: */
+ RTUNI_ALPHA, /* U+00c7fc: */
+ RTUNI_ALPHA, /* U+00c7fd: */
+ RTUNI_ALPHA, /* U+00c7fe: */
+ RTUNI_ALPHA, /* U+00c7ff: */
+ RTUNI_ALPHA, /* U+00c800: */
+ RTUNI_ALPHA, /* U+00c801: */
+ RTUNI_ALPHA, /* U+00c802: */
+ RTUNI_ALPHA, /* U+00c803: */
+ RTUNI_ALPHA, /* U+00c804: */
+ RTUNI_ALPHA, /* U+00c805: */
+ RTUNI_ALPHA, /* U+00c806: */
+ RTUNI_ALPHA, /* U+00c807: */
+ RTUNI_ALPHA, /* U+00c808: */
+ RTUNI_ALPHA, /* U+00c809: */
+ RTUNI_ALPHA, /* U+00c80a: */
+ RTUNI_ALPHA, /* U+00c80b: */
+ RTUNI_ALPHA, /* U+00c80c: */
+ RTUNI_ALPHA, /* U+00c80d: */
+ RTUNI_ALPHA, /* U+00c80e: */
+ RTUNI_ALPHA, /* U+00c80f: */
+ RTUNI_ALPHA, /* U+00c810: */
+ RTUNI_ALPHA, /* U+00c811: */
+ RTUNI_ALPHA, /* U+00c812: */
+ RTUNI_ALPHA, /* U+00c813: */
+ RTUNI_ALPHA, /* U+00c814: */
+ RTUNI_ALPHA, /* U+00c815: */
+ RTUNI_ALPHA, /* U+00c816: */
+ RTUNI_ALPHA, /* U+00c817: */
+ RTUNI_ALPHA, /* U+00c818: */
+ RTUNI_ALPHA, /* U+00c819: */
+ RTUNI_ALPHA, /* U+00c81a: */
+ RTUNI_ALPHA, /* U+00c81b: */
+ RTUNI_ALPHA, /* U+00c81c: */
+ RTUNI_ALPHA, /* U+00c81d: */
+ RTUNI_ALPHA, /* U+00c81e: */
+ RTUNI_ALPHA, /* U+00c81f: */
+ RTUNI_ALPHA, /* U+00c820: */
+ RTUNI_ALPHA, /* U+00c821: */
+ RTUNI_ALPHA, /* U+00c822: */
+ RTUNI_ALPHA, /* U+00c823: */
+ RTUNI_ALPHA, /* U+00c824: */
+ RTUNI_ALPHA, /* U+00c825: */
+ RTUNI_ALPHA, /* U+00c826: */
+ RTUNI_ALPHA, /* U+00c827: */
+ RTUNI_ALPHA, /* U+00c828: */
+ RTUNI_ALPHA, /* U+00c829: */
+ RTUNI_ALPHA, /* U+00c82a: */
+ RTUNI_ALPHA, /* U+00c82b: */
+ RTUNI_ALPHA, /* U+00c82c: */
+ RTUNI_ALPHA, /* U+00c82d: */
+ RTUNI_ALPHA, /* U+00c82e: */
+ RTUNI_ALPHA, /* U+00c82f: */
+ RTUNI_ALPHA, /* U+00c830: */
+ RTUNI_ALPHA, /* U+00c831: */
+ RTUNI_ALPHA, /* U+00c832: */
+ RTUNI_ALPHA, /* U+00c833: */
+ RTUNI_ALPHA, /* U+00c834: */
+ RTUNI_ALPHA, /* U+00c835: */
+ RTUNI_ALPHA, /* U+00c836: */
+ RTUNI_ALPHA, /* U+00c837: */
+ RTUNI_ALPHA, /* U+00c838: */
+ RTUNI_ALPHA, /* U+00c839: */
+ RTUNI_ALPHA, /* U+00c83a: */
+ RTUNI_ALPHA, /* U+00c83b: */
+ RTUNI_ALPHA, /* U+00c83c: */
+ RTUNI_ALPHA, /* U+00c83d: */
+ RTUNI_ALPHA, /* U+00c83e: */
+ RTUNI_ALPHA, /* U+00c83f: */
+ RTUNI_ALPHA, /* U+00c840: */
+ RTUNI_ALPHA, /* U+00c841: */
+ RTUNI_ALPHA, /* U+00c842: */
+ RTUNI_ALPHA, /* U+00c843: */
+ RTUNI_ALPHA, /* U+00c844: */
+ RTUNI_ALPHA, /* U+00c845: */
+ RTUNI_ALPHA, /* U+00c846: */
+ RTUNI_ALPHA, /* U+00c847: */
+ RTUNI_ALPHA, /* U+00c848: */
+ RTUNI_ALPHA, /* U+00c849: */
+ RTUNI_ALPHA, /* U+00c84a: */
+ RTUNI_ALPHA, /* U+00c84b: */
+ RTUNI_ALPHA, /* U+00c84c: */
+ RTUNI_ALPHA, /* U+00c84d: */
+ RTUNI_ALPHA, /* U+00c84e: */
+ RTUNI_ALPHA, /* U+00c84f: */
+ RTUNI_ALPHA, /* U+00c850: */
+ RTUNI_ALPHA, /* U+00c851: */
+ RTUNI_ALPHA, /* U+00c852: */
+ RTUNI_ALPHA, /* U+00c853: */
+ RTUNI_ALPHA, /* U+00c854: */
+ RTUNI_ALPHA, /* U+00c855: */
+ RTUNI_ALPHA, /* U+00c856: */
+ RTUNI_ALPHA, /* U+00c857: */
+ RTUNI_ALPHA, /* U+00c858: */
+ RTUNI_ALPHA, /* U+00c859: */
+ RTUNI_ALPHA, /* U+00c85a: */
+ RTUNI_ALPHA, /* U+00c85b: */
+ RTUNI_ALPHA, /* U+00c85c: */
+ RTUNI_ALPHA, /* U+00c85d: */
+ RTUNI_ALPHA, /* U+00c85e: */
+ RTUNI_ALPHA, /* U+00c85f: */
+ RTUNI_ALPHA, /* U+00c860: */
+ RTUNI_ALPHA, /* U+00c861: */
+ RTUNI_ALPHA, /* U+00c862: */
+ RTUNI_ALPHA, /* U+00c863: */
+ RTUNI_ALPHA, /* U+00c864: */
+ RTUNI_ALPHA, /* U+00c865: */
+ RTUNI_ALPHA, /* U+00c866: */
+ RTUNI_ALPHA, /* U+00c867: */
+ RTUNI_ALPHA, /* U+00c868: */
+ RTUNI_ALPHA, /* U+00c869: */
+ RTUNI_ALPHA, /* U+00c86a: */
+ RTUNI_ALPHA, /* U+00c86b: */
+ RTUNI_ALPHA, /* U+00c86c: */
+ RTUNI_ALPHA, /* U+00c86d: */
+ RTUNI_ALPHA, /* U+00c86e: */
+ RTUNI_ALPHA, /* U+00c86f: */
+ RTUNI_ALPHA, /* U+00c870: */
+ RTUNI_ALPHA, /* U+00c871: */
+ RTUNI_ALPHA, /* U+00c872: */
+ RTUNI_ALPHA, /* U+00c873: */
+ RTUNI_ALPHA, /* U+00c874: */
+ RTUNI_ALPHA, /* U+00c875: */
+ RTUNI_ALPHA, /* U+00c876: */
+ RTUNI_ALPHA, /* U+00c877: */
+ RTUNI_ALPHA, /* U+00c878: */
+ RTUNI_ALPHA, /* U+00c879: */
+ RTUNI_ALPHA, /* U+00c87a: */
+ RTUNI_ALPHA, /* U+00c87b: */
+ RTUNI_ALPHA, /* U+00c87c: */
+ RTUNI_ALPHA, /* U+00c87d: */
+ RTUNI_ALPHA, /* U+00c87e: */
+ RTUNI_ALPHA, /* U+00c87f: */
+ RTUNI_ALPHA, /* U+00c880: */
+ RTUNI_ALPHA, /* U+00c881: */
+ RTUNI_ALPHA, /* U+00c882: */
+ RTUNI_ALPHA, /* U+00c883: */
+ RTUNI_ALPHA, /* U+00c884: */
+ RTUNI_ALPHA, /* U+00c885: */
+ RTUNI_ALPHA, /* U+00c886: */
+ RTUNI_ALPHA, /* U+00c887: */
+ RTUNI_ALPHA, /* U+00c888: */
+ RTUNI_ALPHA, /* U+00c889: */
+ RTUNI_ALPHA, /* U+00c88a: */
+ RTUNI_ALPHA, /* U+00c88b: */
+ RTUNI_ALPHA, /* U+00c88c: */
+ RTUNI_ALPHA, /* U+00c88d: */
+ RTUNI_ALPHA, /* U+00c88e: */
+ RTUNI_ALPHA, /* U+00c88f: */
+ RTUNI_ALPHA, /* U+00c890: */
+ RTUNI_ALPHA, /* U+00c891: */
+ RTUNI_ALPHA, /* U+00c892: */
+ RTUNI_ALPHA, /* U+00c893: */
+ RTUNI_ALPHA, /* U+00c894: */
+ RTUNI_ALPHA, /* U+00c895: */
+ RTUNI_ALPHA, /* U+00c896: */
+ RTUNI_ALPHA, /* U+00c897: */
+ RTUNI_ALPHA, /* U+00c898: */
+ RTUNI_ALPHA, /* U+00c899: */
+ RTUNI_ALPHA, /* U+00c89a: */
+ RTUNI_ALPHA, /* U+00c89b: */
+ RTUNI_ALPHA, /* U+00c89c: */
+ RTUNI_ALPHA, /* U+00c89d: */
+ RTUNI_ALPHA, /* U+00c89e: */
+ RTUNI_ALPHA, /* U+00c89f: */
+ RTUNI_ALPHA, /* U+00c8a0: */
+ RTUNI_ALPHA, /* U+00c8a1: */
+ RTUNI_ALPHA, /* U+00c8a2: */
+ RTUNI_ALPHA, /* U+00c8a3: */
+ RTUNI_ALPHA, /* U+00c8a4: */
+ RTUNI_ALPHA, /* U+00c8a5: */
+ RTUNI_ALPHA, /* U+00c8a6: */
+ RTUNI_ALPHA, /* U+00c8a7: */
+ RTUNI_ALPHA, /* U+00c8a8: */
+ RTUNI_ALPHA, /* U+00c8a9: */
+ RTUNI_ALPHA, /* U+00c8aa: */
+ RTUNI_ALPHA, /* U+00c8ab: */
+ RTUNI_ALPHA, /* U+00c8ac: */
+ RTUNI_ALPHA, /* U+00c8ad: */
+ RTUNI_ALPHA, /* U+00c8ae: */
+ RTUNI_ALPHA, /* U+00c8af: */
+ RTUNI_ALPHA, /* U+00c8b0: */
+ RTUNI_ALPHA, /* U+00c8b1: */
+ RTUNI_ALPHA, /* U+00c8b2: */
+ RTUNI_ALPHA, /* U+00c8b3: */
+ RTUNI_ALPHA, /* U+00c8b4: */
+ RTUNI_ALPHA, /* U+00c8b5: */
+ RTUNI_ALPHA, /* U+00c8b6: */
+ RTUNI_ALPHA, /* U+00c8b7: */
+ RTUNI_ALPHA, /* U+00c8b8: */
+ RTUNI_ALPHA, /* U+00c8b9: */
+ RTUNI_ALPHA, /* U+00c8ba: */
+ RTUNI_ALPHA, /* U+00c8bb: */
+ RTUNI_ALPHA, /* U+00c8bc: */
+ RTUNI_ALPHA, /* U+00c8bd: */
+ RTUNI_ALPHA, /* U+00c8be: */
+ RTUNI_ALPHA, /* U+00c8bf: */
+ RTUNI_ALPHA, /* U+00c8c0: */
+ RTUNI_ALPHA, /* U+00c8c1: */
+ RTUNI_ALPHA, /* U+00c8c2: */
+ RTUNI_ALPHA, /* U+00c8c3: */
+ RTUNI_ALPHA, /* U+00c8c4: */
+ RTUNI_ALPHA, /* U+00c8c5: */
+ RTUNI_ALPHA, /* U+00c8c6: */
+ RTUNI_ALPHA, /* U+00c8c7: */
+ RTUNI_ALPHA, /* U+00c8c8: */
+ RTUNI_ALPHA, /* U+00c8c9: */
+ RTUNI_ALPHA, /* U+00c8ca: */
+ RTUNI_ALPHA, /* U+00c8cb: */
+ RTUNI_ALPHA, /* U+00c8cc: */
+ RTUNI_ALPHA, /* U+00c8cd: */
+ RTUNI_ALPHA, /* U+00c8ce: */
+ RTUNI_ALPHA, /* U+00c8cf: */
+ RTUNI_ALPHA, /* U+00c8d0: */
+ RTUNI_ALPHA, /* U+00c8d1: */
+ RTUNI_ALPHA, /* U+00c8d2: */
+ RTUNI_ALPHA, /* U+00c8d3: */
+ RTUNI_ALPHA, /* U+00c8d4: */
+ RTUNI_ALPHA, /* U+00c8d5: */
+ RTUNI_ALPHA, /* U+00c8d6: */
+ RTUNI_ALPHA, /* U+00c8d7: */
+ RTUNI_ALPHA, /* U+00c8d8: */
+ RTUNI_ALPHA, /* U+00c8d9: */
+ RTUNI_ALPHA, /* U+00c8da: */
+ RTUNI_ALPHA, /* U+00c8db: */
+ RTUNI_ALPHA, /* U+00c8dc: */
+ RTUNI_ALPHA, /* U+00c8dd: */
+ RTUNI_ALPHA, /* U+00c8de: */
+ RTUNI_ALPHA, /* U+00c8df: */
+ RTUNI_ALPHA, /* U+00c8e0: */
+ RTUNI_ALPHA, /* U+00c8e1: */
+ RTUNI_ALPHA, /* U+00c8e2: */
+ RTUNI_ALPHA, /* U+00c8e3: */
+ RTUNI_ALPHA, /* U+00c8e4: */
+ RTUNI_ALPHA, /* U+00c8e5: */
+ RTUNI_ALPHA, /* U+00c8e6: */
+ RTUNI_ALPHA, /* U+00c8e7: */
+ RTUNI_ALPHA, /* U+00c8e8: */
+ RTUNI_ALPHA, /* U+00c8e9: */
+ RTUNI_ALPHA, /* U+00c8ea: */
+ RTUNI_ALPHA, /* U+00c8eb: */
+ RTUNI_ALPHA, /* U+00c8ec: */
+ RTUNI_ALPHA, /* U+00c8ed: */
+ RTUNI_ALPHA, /* U+00c8ee: */
+ RTUNI_ALPHA, /* U+00c8ef: */
+ RTUNI_ALPHA, /* U+00c8f0: */
+ RTUNI_ALPHA, /* U+00c8f1: */
+ RTUNI_ALPHA, /* U+00c8f2: */
+ RTUNI_ALPHA, /* U+00c8f3: */
+ RTUNI_ALPHA, /* U+00c8f4: */
+ RTUNI_ALPHA, /* U+00c8f5: */
+ RTUNI_ALPHA, /* U+00c8f6: */
+ RTUNI_ALPHA, /* U+00c8f7: */
+ RTUNI_ALPHA, /* U+00c8f8: */
+ RTUNI_ALPHA, /* U+00c8f9: */
+ RTUNI_ALPHA, /* U+00c8fa: */
+ RTUNI_ALPHA, /* U+00c8fb: */
+ RTUNI_ALPHA, /* U+00c8fc: */
+ RTUNI_ALPHA, /* U+00c8fd: */
+ RTUNI_ALPHA, /* U+00c8fe: */
+ RTUNI_ALPHA, /* U+00c8ff: */
+ RTUNI_ALPHA, /* U+00c900: */
+ RTUNI_ALPHA, /* U+00c901: */
+ RTUNI_ALPHA, /* U+00c902: */
+ RTUNI_ALPHA, /* U+00c903: */
+ RTUNI_ALPHA, /* U+00c904: */
+ RTUNI_ALPHA, /* U+00c905: */
+ RTUNI_ALPHA, /* U+00c906: */
+ RTUNI_ALPHA, /* U+00c907: */
+ RTUNI_ALPHA, /* U+00c908: */
+ RTUNI_ALPHA, /* U+00c909: */
+ RTUNI_ALPHA, /* U+00c90a: */
+ RTUNI_ALPHA, /* U+00c90b: */
+ RTUNI_ALPHA, /* U+00c90c: */
+ RTUNI_ALPHA, /* U+00c90d: */
+ RTUNI_ALPHA, /* U+00c90e: */
+ RTUNI_ALPHA, /* U+00c90f: */
+ RTUNI_ALPHA, /* U+00c910: */
+ RTUNI_ALPHA, /* U+00c911: */
+ RTUNI_ALPHA, /* U+00c912: */
+ RTUNI_ALPHA, /* U+00c913: */
+ RTUNI_ALPHA, /* U+00c914: */
+ RTUNI_ALPHA, /* U+00c915: */
+ RTUNI_ALPHA, /* U+00c916: */
+ RTUNI_ALPHA, /* U+00c917: */
+ RTUNI_ALPHA, /* U+00c918: */
+ RTUNI_ALPHA, /* U+00c919: */
+ RTUNI_ALPHA, /* U+00c91a: */
+ RTUNI_ALPHA, /* U+00c91b: */
+ RTUNI_ALPHA, /* U+00c91c: */
+ RTUNI_ALPHA, /* U+00c91d: */
+ RTUNI_ALPHA, /* U+00c91e: */
+ RTUNI_ALPHA, /* U+00c91f: */
+ RTUNI_ALPHA, /* U+00c920: */
+ RTUNI_ALPHA, /* U+00c921: */
+ RTUNI_ALPHA, /* U+00c922: */
+ RTUNI_ALPHA, /* U+00c923: */
+ RTUNI_ALPHA, /* U+00c924: */
+ RTUNI_ALPHA, /* U+00c925: */
+ RTUNI_ALPHA, /* U+00c926: */
+ RTUNI_ALPHA, /* U+00c927: */
+ RTUNI_ALPHA, /* U+00c928: */
+ RTUNI_ALPHA, /* U+00c929: */
+ RTUNI_ALPHA, /* U+00c92a: */
+ RTUNI_ALPHA, /* U+00c92b: */
+ RTUNI_ALPHA, /* U+00c92c: */
+ RTUNI_ALPHA, /* U+00c92d: */
+ RTUNI_ALPHA, /* U+00c92e: */
+ RTUNI_ALPHA, /* U+00c92f: */
+ RTUNI_ALPHA, /* U+00c930: */
+ RTUNI_ALPHA, /* U+00c931: */
+ RTUNI_ALPHA, /* U+00c932: */
+ RTUNI_ALPHA, /* U+00c933: */
+ RTUNI_ALPHA, /* U+00c934: */
+ RTUNI_ALPHA, /* U+00c935: */
+ RTUNI_ALPHA, /* U+00c936: */
+ RTUNI_ALPHA, /* U+00c937: */
+ RTUNI_ALPHA, /* U+00c938: */
+ RTUNI_ALPHA, /* U+00c939: */
+ RTUNI_ALPHA, /* U+00c93a: */
+ RTUNI_ALPHA, /* U+00c93b: */
+ RTUNI_ALPHA, /* U+00c93c: */
+ RTUNI_ALPHA, /* U+00c93d: */
+ RTUNI_ALPHA, /* U+00c93e: */
+ RTUNI_ALPHA, /* U+00c93f: */
+ RTUNI_ALPHA, /* U+00c940: */
+ RTUNI_ALPHA, /* U+00c941: */
+ RTUNI_ALPHA, /* U+00c942: */
+ RTUNI_ALPHA, /* U+00c943: */
+ RTUNI_ALPHA, /* U+00c944: */
+ RTUNI_ALPHA, /* U+00c945: */
+ RTUNI_ALPHA, /* U+00c946: */
+ RTUNI_ALPHA, /* U+00c947: */
+ RTUNI_ALPHA, /* U+00c948: */
+ RTUNI_ALPHA, /* U+00c949: */
+ RTUNI_ALPHA, /* U+00c94a: */
+ RTUNI_ALPHA, /* U+00c94b: */
+ RTUNI_ALPHA, /* U+00c94c: */
+ RTUNI_ALPHA, /* U+00c94d: */
+ RTUNI_ALPHA, /* U+00c94e: */
+ RTUNI_ALPHA, /* U+00c94f: */
+ RTUNI_ALPHA, /* U+00c950: */
+ RTUNI_ALPHA, /* U+00c951: */
+ RTUNI_ALPHA, /* U+00c952: */
+ RTUNI_ALPHA, /* U+00c953: */
+ RTUNI_ALPHA, /* U+00c954: */
+ RTUNI_ALPHA, /* U+00c955: */
+ RTUNI_ALPHA, /* U+00c956: */
+ RTUNI_ALPHA, /* U+00c957: */
+ RTUNI_ALPHA, /* U+00c958: */
+ RTUNI_ALPHA, /* U+00c959: */
+ RTUNI_ALPHA, /* U+00c95a: */
+ RTUNI_ALPHA, /* U+00c95b: */
+ RTUNI_ALPHA, /* U+00c95c: */
+ RTUNI_ALPHA, /* U+00c95d: */
+ RTUNI_ALPHA, /* U+00c95e: */
+ RTUNI_ALPHA, /* U+00c95f: */
+ RTUNI_ALPHA, /* U+00c960: */
+ RTUNI_ALPHA, /* U+00c961: */
+ RTUNI_ALPHA, /* U+00c962: */
+ RTUNI_ALPHA, /* U+00c963: */
+ RTUNI_ALPHA, /* U+00c964: */
+ RTUNI_ALPHA, /* U+00c965: */
+ RTUNI_ALPHA, /* U+00c966: */
+ RTUNI_ALPHA, /* U+00c967: */
+ RTUNI_ALPHA, /* U+00c968: */
+ RTUNI_ALPHA, /* U+00c969: */
+ RTUNI_ALPHA, /* U+00c96a: */
+ RTUNI_ALPHA, /* U+00c96b: */
+ RTUNI_ALPHA, /* U+00c96c: */
+ RTUNI_ALPHA, /* U+00c96d: */
+ RTUNI_ALPHA, /* U+00c96e: */
+ RTUNI_ALPHA, /* U+00c96f: */
+ RTUNI_ALPHA, /* U+00c970: */
+ RTUNI_ALPHA, /* U+00c971: */
+ RTUNI_ALPHA, /* U+00c972: */
+ RTUNI_ALPHA, /* U+00c973: */
+ RTUNI_ALPHA, /* U+00c974: */
+ RTUNI_ALPHA, /* U+00c975: */
+ RTUNI_ALPHA, /* U+00c976: */
+ RTUNI_ALPHA, /* U+00c977: */
+ RTUNI_ALPHA, /* U+00c978: */
+ RTUNI_ALPHA, /* U+00c979: */
+ RTUNI_ALPHA, /* U+00c97a: */
+ RTUNI_ALPHA, /* U+00c97b: */
+ RTUNI_ALPHA, /* U+00c97c: */
+ RTUNI_ALPHA, /* U+00c97d: */
+ RTUNI_ALPHA, /* U+00c97e: */
+ RTUNI_ALPHA, /* U+00c97f: */
+ RTUNI_ALPHA, /* U+00c980: */
+ RTUNI_ALPHA, /* U+00c981: */
+ RTUNI_ALPHA, /* U+00c982: */
+ RTUNI_ALPHA, /* U+00c983: */
+ RTUNI_ALPHA, /* U+00c984: */
+ RTUNI_ALPHA, /* U+00c985: */
+ RTUNI_ALPHA, /* U+00c986: */
+ RTUNI_ALPHA, /* U+00c987: */
+ RTUNI_ALPHA, /* U+00c988: */
+ RTUNI_ALPHA, /* U+00c989: */
+ RTUNI_ALPHA, /* U+00c98a: */
+ RTUNI_ALPHA, /* U+00c98b: */
+ RTUNI_ALPHA, /* U+00c98c: */
+ RTUNI_ALPHA, /* U+00c98d: */
+ RTUNI_ALPHA, /* U+00c98e: */
+ RTUNI_ALPHA, /* U+00c98f: */
+ RTUNI_ALPHA, /* U+00c990: */
+ RTUNI_ALPHA, /* U+00c991: */
+ RTUNI_ALPHA, /* U+00c992: */
+ RTUNI_ALPHA, /* U+00c993: */
+ RTUNI_ALPHA, /* U+00c994: */
+ RTUNI_ALPHA, /* U+00c995: */
+ RTUNI_ALPHA, /* U+00c996: */
+ RTUNI_ALPHA, /* U+00c997: */
+ RTUNI_ALPHA, /* U+00c998: */
+ RTUNI_ALPHA, /* U+00c999: */
+ RTUNI_ALPHA, /* U+00c99a: */
+ RTUNI_ALPHA, /* U+00c99b: */
+ RTUNI_ALPHA, /* U+00c99c: */
+ RTUNI_ALPHA, /* U+00c99d: */
+ RTUNI_ALPHA, /* U+00c99e: */
+ RTUNI_ALPHA, /* U+00c99f: */
+ RTUNI_ALPHA, /* U+00c9a0: */
+ RTUNI_ALPHA, /* U+00c9a1: */
+ RTUNI_ALPHA, /* U+00c9a2: */
+ RTUNI_ALPHA, /* U+00c9a3: */
+ RTUNI_ALPHA, /* U+00c9a4: */
+ RTUNI_ALPHA, /* U+00c9a5: */
+ RTUNI_ALPHA, /* U+00c9a6: */
+ RTUNI_ALPHA, /* U+00c9a7: */
+ RTUNI_ALPHA, /* U+00c9a8: */
+ RTUNI_ALPHA, /* U+00c9a9: */
+ RTUNI_ALPHA, /* U+00c9aa: */
+ RTUNI_ALPHA, /* U+00c9ab: */
+ RTUNI_ALPHA, /* U+00c9ac: */
+ RTUNI_ALPHA, /* U+00c9ad: */
+ RTUNI_ALPHA, /* U+00c9ae: */
+ RTUNI_ALPHA, /* U+00c9af: */
+ RTUNI_ALPHA, /* U+00c9b0: */
+ RTUNI_ALPHA, /* U+00c9b1: */
+ RTUNI_ALPHA, /* U+00c9b2: */
+ RTUNI_ALPHA, /* U+00c9b3: */
+ RTUNI_ALPHA, /* U+00c9b4: */
+ RTUNI_ALPHA, /* U+00c9b5: */
+ RTUNI_ALPHA, /* U+00c9b6: */
+ RTUNI_ALPHA, /* U+00c9b7: */
+ RTUNI_ALPHA, /* U+00c9b8: */
+ RTUNI_ALPHA, /* U+00c9b9: */
+ RTUNI_ALPHA, /* U+00c9ba: */
+ RTUNI_ALPHA, /* U+00c9bb: */
+ RTUNI_ALPHA, /* U+00c9bc: */
+ RTUNI_ALPHA, /* U+00c9bd: */
+ RTUNI_ALPHA, /* U+00c9be: */
+ RTUNI_ALPHA, /* U+00c9bf: */
+ RTUNI_ALPHA, /* U+00c9c0: */
+ RTUNI_ALPHA, /* U+00c9c1: */
+ RTUNI_ALPHA, /* U+00c9c2: */
+ RTUNI_ALPHA, /* U+00c9c3: */
+ RTUNI_ALPHA, /* U+00c9c4: */
+ RTUNI_ALPHA, /* U+00c9c5: */
+ RTUNI_ALPHA, /* U+00c9c6: */
+ RTUNI_ALPHA, /* U+00c9c7: */
+ RTUNI_ALPHA, /* U+00c9c8: */
+ RTUNI_ALPHA, /* U+00c9c9: */
+ RTUNI_ALPHA, /* U+00c9ca: */
+ RTUNI_ALPHA, /* U+00c9cb: */
+ RTUNI_ALPHA, /* U+00c9cc: */
+ RTUNI_ALPHA, /* U+00c9cd: */
+ RTUNI_ALPHA, /* U+00c9ce: */
+ RTUNI_ALPHA, /* U+00c9cf: */
+ RTUNI_ALPHA, /* U+00c9d0: */
+ RTUNI_ALPHA, /* U+00c9d1: */
+ RTUNI_ALPHA, /* U+00c9d2: */
+ RTUNI_ALPHA, /* U+00c9d3: */
+ RTUNI_ALPHA, /* U+00c9d4: */
+ RTUNI_ALPHA, /* U+00c9d5: */
+ RTUNI_ALPHA, /* U+00c9d6: */
+ RTUNI_ALPHA, /* U+00c9d7: */
+ RTUNI_ALPHA, /* U+00c9d8: */
+ RTUNI_ALPHA, /* U+00c9d9: */
+ RTUNI_ALPHA, /* U+00c9da: */
+ RTUNI_ALPHA, /* U+00c9db: */
+ RTUNI_ALPHA, /* U+00c9dc: */
+ RTUNI_ALPHA, /* U+00c9dd: */
+ RTUNI_ALPHA, /* U+00c9de: */
+ RTUNI_ALPHA, /* U+00c9df: */
+ RTUNI_ALPHA, /* U+00c9e0: */
+ RTUNI_ALPHA, /* U+00c9e1: */
+ RTUNI_ALPHA, /* U+00c9e2: */
+ RTUNI_ALPHA, /* U+00c9e3: */
+ RTUNI_ALPHA, /* U+00c9e4: */
+ RTUNI_ALPHA, /* U+00c9e5: */
+ RTUNI_ALPHA, /* U+00c9e6: */
+ RTUNI_ALPHA, /* U+00c9e7: */
+ RTUNI_ALPHA, /* U+00c9e8: */
+ RTUNI_ALPHA, /* U+00c9e9: */
+ RTUNI_ALPHA, /* U+00c9ea: */
+ RTUNI_ALPHA, /* U+00c9eb: */
+ RTUNI_ALPHA, /* U+00c9ec: */
+ RTUNI_ALPHA, /* U+00c9ed: */
+ RTUNI_ALPHA, /* U+00c9ee: */
+ RTUNI_ALPHA, /* U+00c9ef: */
+ RTUNI_ALPHA, /* U+00c9f0: */
+ RTUNI_ALPHA, /* U+00c9f1: */
+ RTUNI_ALPHA, /* U+00c9f2: */
+ RTUNI_ALPHA, /* U+00c9f3: */
+ RTUNI_ALPHA, /* U+00c9f4: */
+ RTUNI_ALPHA, /* U+00c9f5: */
+ RTUNI_ALPHA, /* U+00c9f6: */
+ RTUNI_ALPHA, /* U+00c9f7: */
+ RTUNI_ALPHA, /* U+00c9f8: */
+ RTUNI_ALPHA, /* U+00c9f9: */
+ RTUNI_ALPHA, /* U+00c9fa: */
+ RTUNI_ALPHA, /* U+00c9fb: */
+ RTUNI_ALPHA, /* U+00c9fc: */
+ RTUNI_ALPHA, /* U+00c9fd: */
+ RTUNI_ALPHA, /* U+00c9fe: */
+ RTUNI_ALPHA, /* U+00c9ff: */
+ RTUNI_ALPHA, /* U+00ca00: */
+ RTUNI_ALPHA, /* U+00ca01: */
+ RTUNI_ALPHA, /* U+00ca02: */
+ RTUNI_ALPHA, /* U+00ca03: */
+ RTUNI_ALPHA, /* U+00ca04: */
+ RTUNI_ALPHA, /* U+00ca05: */
+ RTUNI_ALPHA, /* U+00ca06: */
+ RTUNI_ALPHA, /* U+00ca07: */
+ RTUNI_ALPHA, /* U+00ca08: */
+ RTUNI_ALPHA, /* U+00ca09: */
+ RTUNI_ALPHA, /* U+00ca0a: */
+ RTUNI_ALPHA, /* U+00ca0b: */
+ RTUNI_ALPHA, /* U+00ca0c: */
+ RTUNI_ALPHA, /* U+00ca0d: */
+ RTUNI_ALPHA, /* U+00ca0e: */
+ RTUNI_ALPHA, /* U+00ca0f: */
+ RTUNI_ALPHA, /* U+00ca10: */
+ RTUNI_ALPHA, /* U+00ca11: */
+ RTUNI_ALPHA, /* U+00ca12: */
+ RTUNI_ALPHA, /* U+00ca13: */
+ RTUNI_ALPHA, /* U+00ca14: */
+ RTUNI_ALPHA, /* U+00ca15: */
+ RTUNI_ALPHA, /* U+00ca16: */
+ RTUNI_ALPHA, /* U+00ca17: */
+ RTUNI_ALPHA, /* U+00ca18: */
+ RTUNI_ALPHA, /* U+00ca19: */
+ RTUNI_ALPHA, /* U+00ca1a: */
+ RTUNI_ALPHA, /* U+00ca1b: */
+ RTUNI_ALPHA, /* U+00ca1c: */
+ RTUNI_ALPHA, /* U+00ca1d: */
+ RTUNI_ALPHA, /* U+00ca1e: */
+ RTUNI_ALPHA, /* U+00ca1f: */
+ RTUNI_ALPHA, /* U+00ca20: */
+ RTUNI_ALPHA, /* U+00ca21: */
+ RTUNI_ALPHA, /* U+00ca22: */
+ RTUNI_ALPHA, /* U+00ca23: */
+ RTUNI_ALPHA, /* U+00ca24: */
+ RTUNI_ALPHA, /* U+00ca25: */
+ RTUNI_ALPHA, /* U+00ca26: */
+ RTUNI_ALPHA, /* U+00ca27: */
+ RTUNI_ALPHA, /* U+00ca28: */
+ RTUNI_ALPHA, /* U+00ca29: */
+ RTUNI_ALPHA, /* U+00ca2a: */
+ RTUNI_ALPHA, /* U+00ca2b: */
+ RTUNI_ALPHA, /* U+00ca2c: */
+ RTUNI_ALPHA, /* U+00ca2d: */
+ RTUNI_ALPHA, /* U+00ca2e: */
+ RTUNI_ALPHA, /* U+00ca2f: */
+ RTUNI_ALPHA, /* U+00ca30: */
+ RTUNI_ALPHA, /* U+00ca31: */
+ RTUNI_ALPHA, /* U+00ca32: */
+ RTUNI_ALPHA, /* U+00ca33: */
+ RTUNI_ALPHA, /* U+00ca34: */
+ RTUNI_ALPHA, /* U+00ca35: */
+ RTUNI_ALPHA, /* U+00ca36: */
+ RTUNI_ALPHA, /* U+00ca37: */
+ RTUNI_ALPHA, /* U+00ca38: */
+ RTUNI_ALPHA, /* U+00ca39: */
+ RTUNI_ALPHA, /* U+00ca3a: */
+ RTUNI_ALPHA, /* U+00ca3b: */
+ RTUNI_ALPHA, /* U+00ca3c: */
+ RTUNI_ALPHA, /* U+00ca3d: */
+ RTUNI_ALPHA, /* U+00ca3e: */
+ RTUNI_ALPHA, /* U+00ca3f: */
+ RTUNI_ALPHA, /* U+00ca40: */
+ RTUNI_ALPHA, /* U+00ca41: */
+ RTUNI_ALPHA, /* U+00ca42: */
+ RTUNI_ALPHA, /* U+00ca43: */
+ RTUNI_ALPHA, /* U+00ca44: */
+ RTUNI_ALPHA, /* U+00ca45: */
+ RTUNI_ALPHA, /* U+00ca46: */
+ RTUNI_ALPHA, /* U+00ca47: */
+ RTUNI_ALPHA, /* U+00ca48: */
+ RTUNI_ALPHA, /* U+00ca49: */
+ RTUNI_ALPHA, /* U+00ca4a: */
+ RTUNI_ALPHA, /* U+00ca4b: */
+ RTUNI_ALPHA, /* U+00ca4c: */
+ RTUNI_ALPHA, /* U+00ca4d: */
+ RTUNI_ALPHA, /* U+00ca4e: */
+ RTUNI_ALPHA, /* U+00ca4f: */
+ RTUNI_ALPHA, /* U+00ca50: */
+ RTUNI_ALPHA, /* U+00ca51: */
+ RTUNI_ALPHA, /* U+00ca52: */
+ RTUNI_ALPHA, /* U+00ca53: */
+ RTUNI_ALPHA, /* U+00ca54: */
+ RTUNI_ALPHA, /* U+00ca55: */
+ RTUNI_ALPHA, /* U+00ca56: */
+ RTUNI_ALPHA, /* U+00ca57: */
+ RTUNI_ALPHA, /* U+00ca58: */
+ RTUNI_ALPHA, /* U+00ca59: */
+ RTUNI_ALPHA, /* U+00ca5a: */
+ RTUNI_ALPHA, /* U+00ca5b: */
+ RTUNI_ALPHA, /* U+00ca5c: */
+ RTUNI_ALPHA, /* U+00ca5d: */
+ RTUNI_ALPHA, /* U+00ca5e: */
+ RTUNI_ALPHA, /* U+00ca5f: */
+ RTUNI_ALPHA, /* U+00ca60: */
+ RTUNI_ALPHA, /* U+00ca61: */
+ RTUNI_ALPHA, /* U+00ca62: */
+ RTUNI_ALPHA, /* U+00ca63: */
+ RTUNI_ALPHA, /* U+00ca64: */
+ RTUNI_ALPHA, /* U+00ca65: */
+ RTUNI_ALPHA, /* U+00ca66: */
+ RTUNI_ALPHA, /* U+00ca67: */
+ RTUNI_ALPHA, /* U+00ca68: */
+ RTUNI_ALPHA, /* U+00ca69: */
+ RTUNI_ALPHA, /* U+00ca6a: */
+ RTUNI_ALPHA, /* U+00ca6b: */
+ RTUNI_ALPHA, /* U+00ca6c: */
+ RTUNI_ALPHA, /* U+00ca6d: */
+ RTUNI_ALPHA, /* U+00ca6e: */
+ RTUNI_ALPHA, /* U+00ca6f: */
+ RTUNI_ALPHA, /* U+00ca70: */
+ RTUNI_ALPHA, /* U+00ca71: */
+ RTUNI_ALPHA, /* U+00ca72: */
+ RTUNI_ALPHA, /* U+00ca73: */
+ RTUNI_ALPHA, /* U+00ca74: */
+ RTUNI_ALPHA, /* U+00ca75: */
+ RTUNI_ALPHA, /* U+00ca76: */
+ RTUNI_ALPHA, /* U+00ca77: */
+ RTUNI_ALPHA, /* U+00ca78: */
+ RTUNI_ALPHA, /* U+00ca79: */
+ RTUNI_ALPHA, /* U+00ca7a: */
+ RTUNI_ALPHA, /* U+00ca7b: */
+ RTUNI_ALPHA, /* U+00ca7c: */
+ RTUNI_ALPHA, /* U+00ca7d: */
+ RTUNI_ALPHA, /* U+00ca7e: */
+ RTUNI_ALPHA, /* U+00ca7f: */
+ RTUNI_ALPHA, /* U+00ca80: */
+ RTUNI_ALPHA, /* U+00ca81: */
+ RTUNI_ALPHA, /* U+00ca82: */
+ RTUNI_ALPHA, /* U+00ca83: */
+ RTUNI_ALPHA, /* U+00ca84: */
+ RTUNI_ALPHA, /* U+00ca85: */
+ RTUNI_ALPHA, /* U+00ca86: */
+ RTUNI_ALPHA, /* U+00ca87: */
+ RTUNI_ALPHA, /* U+00ca88: */
+ RTUNI_ALPHA, /* U+00ca89: */
+ RTUNI_ALPHA, /* U+00ca8a: */
+ RTUNI_ALPHA, /* U+00ca8b: */
+ RTUNI_ALPHA, /* U+00ca8c: */
+ RTUNI_ALPHA, /* U+00ca8d: */
+ RTUNI_ALPHA, /* U+00ca8e: */
+ RTUNI_ALPHA, /* U+00ca8f: */
+ RTUNI_ALPHA, /* U+00ca90: */
+ RTUNI_ALPHA, /* U+00ca91: */
+ RTUNI_ALPHA, /* U+00ca92: */
+ RTUNI_ALPHA, /* U+00ca93: */
+ RTUNI_ALPHA, /* U+00ca94: */
+ RTUNI_ALPHA, /* U+00ca95: */
+ RTUNI_ALPHA, /* U+00ca96: */
+ RTUNI_ALPHA, /* U+00ca97: */
+ RTUNI_ALPHA, /* U+00ca98: */
+ RTUNI_ALPHA, /* U+00ca99: */
+ RTUNI_ALPHA, /* U+00ca9a: */
+ RTUNI_ALPHA, /* U+00ca9b: */
+ RTUNI_ALPHA, /* U+00ca9c: */
+ RTUNI_ALPHA, /* U+00ca9d: */
+ RTUNI_ALPHA, /* U+00ca9e: */
+ RTUNI_ALPHA, /* U+00ca9f: */
+ RTUNI_ALPHA, /* U+00caa0: */
+ RTUNI_ALPHA, /* U+00caa1: */
+ RTUNI_ALPHA, /* U+00caa2: */
+ RTUNI_ALPHA, /* U+00caa3: */
+ RTUNI_ALPHA, /* U+00caa4: */
+ RTUNI_ALPHA, /* U+00caa5: */
+ RTUNI_ALPHA, /* U+00caa6: */
+ RTUNI_ALPHA, /* U+00caa7: */
+ RTUNI_ALPHA, /* U+00caa8: */
+ RTUNI_ALPHA, /* U+00caa9: */
+ RTUNI_ALPHA, /* U+00caaa: */
+ RTUNI_ALPHA, /* U+00caab: */
+ RTUNI_ALPHA, /* U+00caac: */
+ RTUNI_ALPHA, /* U+00caad: */
+ RTUNI_ALPHA, /* U+00caae: */
+ RTUNI_ALPHA, /* U+00caaf: */
+ RTUNI_ALPHA, /* U+00cab0: */
+ RTUNI_ALPHA, /* U+00cab1: */
+ RTUNI_ALPHA, /* U+00cab2: */
+ RTUNI_ALPHA, /* U+00cab3: */
+ RTUNI_ALPHA, /* U+00cab4: */
+ RTUNI_ALPHA, /* U+00cab5: */
+ RTUNI_ALPHA, /* U+00cab6: */
+ RTUNI_ALPHA, /* U+00cab7: */
+ RTUNI_ALPHA, /* U+00cab8: */
+ RTUNI_ALPHA, /* U+00cab9: */
+ RTUNI_ALPHA, /* U+00caba: */
+ RTUNI_ALPHA, /* U+00cabb: */
+ RTUNI_ALPHA, /* U+00cabc: */
+ RTUNI_ALPHA, /* U+00cabd: */
+ RTUNI_ALPHA, /* U+00cabe: */
+ RTUNI_ALPHA, /* U+00cabf: */
+ RTUNI_ALPHA, /* U+00cac0: */
+ RTUNI_ALPHA, /* U+00cac1: */
+ RTUNI_ALPHA, /* U+00cac2: */
+ RTUNI_ALPHA, /* U+00cac3: */
+ RTUNI_ALPHA, /* U+00cac4: */
+ RTUNI_ALPHA, /* U+00cac5: */
+ RTUNI_ALPHA, /* U+00cac6: */
+ RTUNI_ALPHA, /* U+00cac7: */
+ RTUNI_ALPHA, /* U+00cac8: */
+ RTUNI_ALPHA, /* U+00cac9: */
+ RTUNI_ALPHA, /* U+00caca: */
+ RTUNI_ALPHA, /* U+00cacb: */
+ RTUNI_ALPHA, /* U+00cacc: */
+ RTUNI_ALPHA, /* U+00cacd: */
+ RTUNI_ALPHA, /* U+00cace: */
+ RTUNI_ALPHA, /* U+00cacf: */
+ RTUNI_ALPHA, /* U+00cad0: */
+ RTUNI_ALPHA, /* U+00cad1: */
+ RTUNI_ALPHA, /* U+00cad2: */
+ RTUNI_ALPHA, /* U+00cad3: */
+ RTUNI_ALPHA, /* U+00cad4: */
+ RTUNI_ALPHA, /* U+00cad5: */
+ RTUNI_ALPHA, /* U+00cad6: */
+ RTUNI_ALPHA, /* U+00cad7: */
+ RTUNI_ALPHA, /* U+00cad8: */
+ RTUNI_ALPHA, /* U+00cad9: */
+ RTUNI_ALPHA, /* U+00cada: */
+ RTUNI_ALPHA, /* U+00cadb: */
+ RTUNI_ALPHA, /* U+00cadc: */
+ RTUNI_ALPHA, /* U+00cadd: */
+ RTUNI_ALPHA, /* U+00cade: */
+ RTUNI_ALPHA, /* U+00cadf: */
+ RTUNI_ALPHA, /* U+00cae0: */
+ RTUNI_ALPHA, /* U+00cae1: */
+ RTUNI_ALPHA, /* U+00cae2: */
+ RTUNI_ALPHA, /* U+00cae3: */
+ RTUNI_ALPHA, /* U+00cae4: */
+ RTUNI_ALPHA, /* U+00cae5: */
+ RTUNI_ALPHA, /* U+00cae6: */
+ RTUNI_ALPHA, /* U+00cae7: */
+ RTUNI_ALPHA, /* U+00cae8: */
+ RTUNI_ALPHA, /* U+00cae9: */
+ RTUNI_ALPHA, /* U+00caea: */
+ RTUNI_ALPHA, /* U+00caeb: */
+ RTUNI_ALPHA, /* U+00caec: */
+ RTUNI_ALPHA, /* U+00caed: */
+ RTUNI_ALPHA, /* U+00caee: */
+ RTUNI_ALPHA, /* U+00caef: */
+ RTUNI_ALPHA, /* U+00caf0: */
+ RTUNI_ALPHA, /* U+00caf1: */
+ RTUNI_ALPHA, /* U+00caf2: */
+ RTUNI_ALPHA, /* U+00caf3: */
+ RTUNI_ALPHA, /* U+00caf4: */
+ RTUNI_ALPHA, /* U+00caf5: */
+ RTUNI_ALPHA, /* U+00caf6: */
+ RTUNI_ALPHA, /* U+00caf7: */
+ RTUNI_ALPHA, /* U+00caf8: */
+ RTUNI_ALPHA, /* U+00caf9: */
+ RTUNI_ALPHA, /* U+00cafa: */
+ RTUNI_ALPHA, /* U+00cafb: */
+ RTUNI_ALPHA, /* U+00cafc: */
+ RTUNI_ALPHA, /* U+00cafd: */
+ RTUNI_ALPHA, /* U+00cafe: */
+ RTUNI_ALPHA, /* U+00caff: */
+ RTUNI_ALPHA, /* U+00cb00: */
+ RTUNI_ALPHA, /* U+00cb01: */
+ RTUNI_ALPHA, /* U+00cb02: */
+ RTUNI_ALPHA, /* U+00cb03: */
+ RTUNI_ALPHA, /* U+00cb04: */
+ RTUNI_ALPHA, /* U+00cb05: */
+ RTUNI_ALPHA, /* U+00cb06: */
+ RTUNI_ALPHA, /* U+00cb07: */
+ RTUNI_ALPHA, /* U+00cb08: */
+ RTUNI_ALPHA, /* U+00cb09: */
+ RTUNI_ALPHA, /* U+00cb0a: */
+ RTUNI_ALPHA, /* U+00cb0b: */
+ RTUNI_ALPHA, /* U+00cb0c: */
+ RTUNI_ALPHA, /* U+00cb0d: */
+ RTUNI_ALPHA, /* U+00cb0e: */
+ RTUNI_ALPHA, /* U+00cb0f: */
+ RTUNI_ALPHA, /* U+00cb10: */
+ RTUNI_ALPHA, /* U+00cb11: */
+ RTUNI_ALPHA, /* U+00cb12: */
+ RTUNI_ALPHA, /* U+00cb13: */
+ RTUNI_ALPHA, /* U+00cb14: */
+ RTUNI_ALPHA, /* U+00cb15: */
+ RTUNI_ALPHA, /* U+00cb16: */
+ RTUNI_ALPHA, /* U+00cb17: */
+ RTUNI_ALPHA, /* U+00cb18: */
+ RTUNI_ALPHA, /* U+00cb19: */
+ RTUNI_ALPHA, /* U+00cb1a: */
+ RTUNI_ALPHA, /* U+00cb1b: */
+ RTUNI_ALPHA, /* U+00cb1c: */
+ RTUNI_ALPHA, /* U+00cb1d: */
+ RTUNI_ALPHA, /* U+00cb1e: */
+ RTUNI_ALPHA, /* U+00cb1f: */
+ RTUNI_ALPHA, /* U+00cb20: */
+ RTUNI_ALPHA, /* U+00cb21: */
+ RTUNI_ALPHA, /* U+00cb22: */
+ RTUNI_ALPHA, /* U+00cb23: */
+ RTUNI_ALPHA, /* U+00cb24: */
+ RTUNI_ALPHA, /* U+00cb25: */
+ RTUNI_ALPHA, /* U+00cb26: */
+ RTUNI_ALPHA, /* U+00cb27: */
+ RTUNI_ALPHA, /* U+00cb28: */
+ RTUNI_ALPHA, /* U+00cb29: */
+ RTUNI_ALPHA, /* U+00cb2a: */
+ RTUNI_ALPHA, /* U+00cb2b: */
+ RTUNI_ALPHA, /* U+00cb2c: */
+ RTUNI_ALPHA, /* U+00cb2d: */
+ RTUNI_ALPHA, /* U+00cb2e: */
+ RTUNI_ALPHA, /* U+00cb2f: */
+ RTUNI_ALPHA, /* U+00cb30: */
+ RTUNI_ALPHA, /* U+00cb31: */
+ RTUNI_ALPHA, /* U+00cb32: */
+ RTUNI_ALPHA, /* U+00cb33: */
+ RTUNI_ALPHA, /* U+00cb34: */
+ RTUNI_ALPHA, /* U+00cb35: */
+ RTUNI_ALPHA, /* U+00cb36: */
+ RTUNI_ALPHA, /* U+00cb37: */
+ RTUNI_ALPHA, /* U+00cb38: */
+ RTUNI_ALPHA, /* U+00cb39: */
+ RTUNI_ALPHA, /* U+00cb3a: */
+ RTUNI_ALPHA, /* U+00cb3b: */
+ RTUNI_ALPHA, /* U+00cb3c: */
+ RTUNI_ALPHA, /* U+00cb3d: */
+ RTUNI_ALPHA, /* U+00cb3e: */
+ RTUNI_ALPHA, /* U+00cb3f: */
+ RTUNI_ALPHA, /* U+00cb40: */
+ RTUNI_ALPHA, /* U+00cb41: */
+ RTUNI_ALPHA, /* U+00cb42: */
+ RTUNI_ALPHA, /* U+00cb43: */
+ RTUNI_ALPHA, /* U+00cb44: */
+ RTUNI_ALPHA, /* U+00cb45: */
+ RTUNI_ALPHA, /* U+00cb46: */
+ RTUNI_ALPHA, /* U+00cb47: */
+ RTUNI_ALPHA, /* U+00cb48: */
+ RTUNI_ALPHA, /* U+00cb49: */
+ RTUNI_ALPHA, /* U+00cb4a: */
+ RTUNI_ALPHA, /* U+00cb4b: */
+ RTUNI_ALPHA, /* U+00cb4c: */
+ RTUNI_ALPHA, /* U+00cb4d: */
+ RTUNI_ALPHA, /* U+00cb4e: */
+ RTUNI_ALPHA, /* U+00cb4f: */
+ RTUNI_ALPHA, /* U+00cb50: */
+ RTUNI_ALPHA, /* U+00cb51: */
+ RTUNI_ALPHA, /* U+00cb52: */
+ RTUNI_ALPHA, /* U+00cb53: */
+ RTUNI_ALPHA, /* U+00cb54: */
+ RTUNI_ALPHA, /* U+00cb55: */
+ RTUNI_ALPHA, /* U+00cb56: */
+ RTUNI_ALPHA, /* U+00cb57: */
+ RTUNI_ALPHA, /* U+00cb58: */
+ RTUNI_ALPHA, /* U+00cb59: */
+ RTUNI_ALPHA, /* U+00cb5a: */
+ RTUNI_ALPHA, /* U+00cb5b: */
+ RTUNI_ALPHA, /* U+00cb5c: */
+ RTUNI_ALPHA, /* U+00cb5d: */
+ RTUNI_ALPHA, /* U+00cb5e: */
+ RTUNI_ALPHA, /* U+00cb5f: */
+ RTUNI_ALPHA, /* U+00cb60: */
+ RTUNI_ALPHA, /* U+00cb61: */
+ RTUNI_ALPHA, /* U+00cb62: */
+ RTUNI_ALPHA, /* U+00cb63: */
+ RTUNI_ALPHA, /* U+00cb64: */
+ RTUNI_ALPHA, /* U+00cb65: */
+ RTUNI_ALPHA, /* U+00cb66: */
+ RTUNI_ALPHA, /* U+00cb67: */
+ RTUNI_ALPHA, /* U+00cb68: */
+ RTUNI_ALPHA, /* U+00cb69: */
+ RTUNI_ALPHA, /* U+00cb6a: */
+ RTUNI_ALPHA, /* U+00cb6b: */
+ RTUNI_ALPHA, /* U+00cb6c: */
+ RTUNI_ALPHA, /* U+00cb6d: */
+ RTUNI_ALPHA, /* U+00cb6e: */
+ RTUNI_ALPHA, /* U+00cb6f: */
+ RTUNI_ALPHA, /* U+00cb70: */
+ RTUNI_ALPHA, /* U+00cb71: */
+ RTUNI_ALPHA, /* U+00cb72: */
+ RTUNI_ALPHA, /* U+00cb73: */
+ RTUNI_ALPHA, /* U+00cb74: */
+ RTUNI_ALPHA, /* U+00cb75: */
+ RTUNI_ALPHA, /* U+00cb76: */
+ RTUNI_ALPHA, /* U+00cb77: */
+ RTUNI_ALPHA, /* U+00cb78: */
+ RTUNI_ALPHA, /* U+00cb79: */
+ RTUNI_ALPHA, /* U+00cb7a: */
+ RTUNI_ALPHA, /* U+00cb7b: */
+ RTUNI_ALPHA, /* U+00cb7c: */
+ RTUNI_ALPHA, /* U+00cb7d: */
+ RTUNI_ALPHA, /* U+00cb7e: */
+ RTUNI_ALPHA, /* U+00cb7f: */
+ RTUNI_ALPHA, /* U+00cb80: */
+ RTUNI_ALPHA, /* U+00cb81: */
+ RTUNI_ALPHA, /* U+00cb82: */
+ RTUNI_ALPHA, /* U+00cb83: */
+ RTUNI_ALPHA, /* U+00cb84: */
+ RTUNI_ALPHA, /* U+00cb85: */
+ RTUNI_ALPHA, /* U+00cb86: */
+ RTUNI_ALPHA, /* U+00cb87: */
+ RTUNI_ALPHA, /* U+00cb88: */
+ RTUNI_ALPHA, /* U+00cb89: */
+ RTUNI_ALPHA, /* U+00cb8a: */
+ RTUNI_ALPHA, /* U+00cb8b: */
+ RTUNI_ALPHA, /* U+00cb8c: */
+ RTUNI_ALPHA, /* U+00cb8d: */
+ RTUNI_ALPHA, /* U+00cb8e: */
+ RTUNI_ALPHA, /* U+00cb8f: */
+ RTUNI_ALPHA, /* U+00cb90: */
+ RTUNI_ALPHA, /* U+00cb91: */
+ RTUNI_ALPHA, /* U+00cb92: */
+ RTUNI_ALPHA, /* U+00cb93: */
+ RTUNI_ALPHA, /* U+00cb94: */
+ RTUNI_ALPHA, /* U+00cb95: */
+ RTUNI_ALPHA, /* U+00cb96: */
+ RTUNI_ALPHA, /* U+00cb97: */
+ RTUNI_ALPHA, /* U+00cb98: */
+ RTUNI_ALPHA, /* U+00cb99: */
+ RTUNI_ALPHA, /* U+00cb9a: */
+ RTUNI_ALPHA, /* U+00cb9b: */
+ RTUNI_ALPHA, /* U+00cb9c: */
+ RTUNI_ALPHA, /* U+00cb9d: */
+ RTUNI_ALPHA, /* U+00cb9e: */
+ RTUNI_ALPHA, /* U+00cb9f: */
+ RTUNI_ALPHA, /* U+00cba0: */
+ RTUNI_ALPHA, /* U+00cba1: */
+ RTUNI_ALPHA, /* U+00cba2: */
+ RTUNI_ALPHA, /* U+00cba3: */
+ RTUNI_ALPHA, /* U+00cba4: */
+ RTUNI_ALPHA, /* U+00cba5: */
+ RTUNI_ALPHA, /* U+00cba6: */
+ RTUNI_ALPHA, /* U+00cba7: */
+ RTUNI_ALPHA, /* U+00cba8: */
+ RTUNI_ALPHA, /* U+00cba9: */
+ RTUNI_ALPHA, /* U+00cbaa: */
+ RTUNI_ALPHA, /* U+00cbab: */
+ RTUNI_ALPHA, /* U+00cbac: */
+ RTUNI_ALPHA, /* U+00cbad: */
+ RTUNI_ALPHA, /* U+00cbae: */
+ RTUNI_ALPHA, /* U+00cbaf: */
+ RTUNI_ALPHA, /* U+00cbb0: */
+ RTUNI_ALPHA, /* U+00cbb1: */
+ RTUNI_ALPHA, /* U+00cbb2: */
+ RTUNI_ALPHA, /* U+00cbb3: */
+ RTUNI_ALPHA, /* U+00cbb4: */
+ RTUNI_ALPHA, /* U+00cbb5: */
+ RTUNI_ALPHA, /* U+00cbb6: */
+ RTUNI_ALPHA, /* U+00cbb7: */
+ RTUNI_ALPHA, /* U+00cbb8: */
+ RTUNI_ALPHA, /* U+00cbb9: */
+ RTUNI_ALPHA, /* U+00cbba: */
+ RTUNI_ALPHA, /* U+00cbbb: */
+ RTUNI_ALPHA, /* U+00cbbc: */
+ RTUNI_ALPHA, /* U+00cbbd: */
+ RTUNI_ALPHA, /* U+00cbbe: */
+ RTUNI_ALPHA, /* U+00cbbf: */
+ RTUNI_ALPHA, /* U+00cbc0: */
+ RTUNI_ALPHA, /* U+00cbc1: */
+ RTUNI_ALPHA, /* U+00cbc2: */
+ RTUNI_ALPHA, /* U+00cbc3: */
+ RTUNI_ALPHA, /* U+00cbc4: */
+ RTUNI_ALPHA, /* U+00cbc5: */
+ RTUNI_ALPHA, /* U+00cbc6: */
+ RTUNI_ALPHA, /* U+00cbc7: */
+ RTUNI_ALPHA, /* U+00cbc8: */
+ RTUNI_ALPHA, /* U+00cbc9: */
+ RTUNI_ALPHA, /* U+00cbca: */
+ RTUNI_ALPHA, /* U+00cbcb: */
+ RTUNI_ALPHA, /* U+00cbcc: */
+ RTUNI_ALPHA, /* U+00cbcd: */
+ RTUNI_ALPHA, /* U+00cbce: */
+ RTUNI_ALPHA, /* U+00cbcf: */
+ RTUNI_ALPHA, /* U+00cbd0: */
+ RTUNI_ALPHA, /* U+00cbd1: */
+ RTUNI_ALPHA, /* U+00cbd2: */
+ RTUNI_ALPHA, /* U+00cbd3: */
+ RTUNI_ALPHA, /* U+00cbd4: */
+ RTUNI_ALPHA, /* U+00cbd5: */
+ RTUNI_ALPHA, /* U+00cbd6: */
+ RTUNI_ALPHA, /* U+00cbd7: */
+ RTUNI_ALPHA, /* U+00cbd8: */
+ RTUNI_ALPHA, /* U+00cbd9: */
+ RTUNI_ALPHA, /* U+00cbda: */
+ RTUNI_ALPHA, /* U+00cbdb: */
+ RTUNI_ALPHA, /* U+00cbdc: */
+ RTUNI_ALPHA, /* U+00cbdd: */
+ RTUNI_ALPHA, /* U+00cbde: */
+ RTUNI_ALPHA, /* U+00cbdf: */
+ RTUNI_ALPHA, /* U+00cbe0: */
+ RTUNI_ALPHA, /* U+00cbe1: */
+ RTUNI_ALPHA, /* U+00cbe2: */
+ RTUNI_ALPHA, /* U+00cbe3: */
+ RTUNI_ALPHA, /* U+00cbe4: */
+ RTUNI_ALPHA, /* U+00cbe5: */
+ RTUNI_ALPHA, /* U+00cbe6: */
+ RTUNI_ALPHA, /* U+00cbe7: */
+ RTUNI_ALPHA, /* U+00cbe8: */
+ RTUNI_ALPHA, /* U+00cbe9: */
+ RTUNI_ALPHA, /* U+00cbea: */
+ RTUNI_ALPHA, /* U+00cbeb: */
+ RTUNI_ALPHA, /* U+00cbec: */
+ RTUNI_ALPHA, /* U+00cbed: */
+ RTUNI_ALPHA, /* U+00cbee: */
+ RTUNI_ALPHA, /* U+00cbef: */
+ RTUNI_ALPHA, /* U+00cbf0: */
+ RTUNI_ALPHA, /* U+00cbf1: */
+ RTUNI_ALPHA, /* U+00cbf2: */
+ RTUNI_ALPHA, /* U+00cbf3: */
+ RTUNI_ALPHA, /* U+00cbf4: */
+ RTUNI_ALPHA, /* U+00cbf5: */
+ RTUNI_ALPHA, /* U+00cbf6: */
+ RTUNI_ALPHA, /* U+00cbf7: */
+ RTUNI_ALPHA, /* U+00cbf8: */
+ RTUNI_ALPHA, /* U+00cbf9: */
+ RTUNI_ALPHA, /* U+00cbfa: */
+ RTUNI_ALPHA, /* U+00cbfb: */
+ RTUNI_ALPHA, /* U+00cbfc: */
+ RTUNI_ALPHA, /* U+00cbfd: */
+ RTUNI_ALPHA, /* U+00cbfe: */
+ RTUNI_ALPHA, /* U+00cbff: */
+ RTUNI_ALPHA, /* U+00cc00: */
+ RTUNI_ALPHA, /* U+00cc01: */
+ RTUNI_ALPHA, /* U+00cc02: */
+ RTUNI_ALPHA, /* U+00cc03: */
+ RTUNI_ALPHA, /* U+00cc04: */
+ RTUNI_ALPHA, /* U+00cc05: */
+ RTUNI_ALPHA, /* U+00cc06: */
+ RTUNI_ALPHA, /* U+00cc07: */
+ RTUNI_ALPHA, /* U+00cc08: */
+ RTUNI_ALPHA, /* U+00cc09: */
+ RTUNI_ALPHA, /* U+00cc0a: */
+ RTUNI_ALPHA, /* U+00cc0b: */
+ RTUNI_ALPHA, /* U+00cc0c: */
+ RTUNI_ALPHA, /* U+00cc0d: */
+ RTUNI_ALPHA, /* U+00cc0e: */
+ RTUNI_ALPHA, /* U+00cc0f: */
+ RTUNI_ALPHA, /* U+00cc10: */
+ RTUNI_ALPHA, /* U+00cc11: */
+ RTUNI_ALPHA, /* U+00cc12: */
+ RTUNI_ALPHA, /* U+00cc13: */
+ RTUNI_ALPHA, /* U+00cc14: */
+ RTUNI_ALPHA, /* U+00cc15: */
+ RTUNI_ALPHA, /* U+00cc16: */
+ RTUNI_ALPHA, /* U+00cc17: */
+ RTUNI_ALPHA, /* U+00cc18: */
+ RTUNI_ALPHA, /* U+00cc19: */
+ RTUNI_ALPHA, /* U+00cc1a: */
+ RTUNI_ALPHA, /* U+00cc1b: */
+ RTUNI_ALPHA, /* U+00cc1c: */
+ RTUNI_ALPHA, /* U+00cc1d: */
+ RTUNI_ALPHA, /* U+00cc1e: */
+ RTUNI_ALPHA, /* U+00cc1f: */
+ RTUNI_ALPHA, /* U+00cc20: */
+ RTUNI_ALPHA, /* U+00cc21: */
+ RTUNI_ALPHA, /* U+00cc22: */
+ RTUNI_ALPHA, /* U+00cc23: */
+ RTUNI_ALPHA, /* U+00cc24: */
+ RTUNI_ALPHA, /* U+00cc25: */
+ RTUNI_ALPHA, /* U+00cc26: */
+ RTUNI_ALPHA, /* U+00cc27: */
+ RTUNI_ALPHA, /* U+00cc28: */
+ RTUNI_ALPHA, /* U+00cc29: */
+ RTUNI_ALPHA, /* U+00cc2a: */
+ RTUNI_ALPHA, /* U+00cc2b: */
+ RTUNI_ALPHA, /* U+00cc2c: */
+ RTUNI_ALPHA, /* U+00cc2d: */
+ RTUNI_ALPHA, /* U+00cc2e: */
+ RTUNI_ALPHA, /* U+00cc2f: */
+ RTUNI_ALPHA, /* U+00cc30: */
+ RTUNI_ALPHA, /* U+00cc31: */
+ RTUNI_ALPHA, /* U+00cc32: */
+ RTUNI_ALPHA, /* U+00cc33: */
+ RTUNI_ALPHA, /* U+00cc34: */
+ RTUNI_ALPHA, /* U+00cc35: */
+ RTUNI_ALPHA, /* U+00cc36: */
+ RTUNI_ALPHA, /* U+00cc37: */
+ RTUNI_ALPHA, /* U+00cc38: */
+ RTUNI_ALPHA, /* U+00cc39: */
+ RTUNI_ALPHA, /* U+00cc3a: */
+ RTUNI_ALPHA, /* U+00cc3b: */
+ RTUNI_ALPHA, /* U+00cc3c: */
+ RTUNI_ALPHA, /* U+00cc3d: */
+ RTUNI_ALPHA, /* U+00cc3e: */
+ RTUNI_ALPHA, /* U+00cc3f: */
+ RTUNI_ALPHA, /* U+00cc40: */
+ RTUNI_ALPHA, /* U+00cc41: */
+ RTUNI_ALPHA, /* U+00cc42: */
+ RTUNI_ALPHA, /* U+00cc43: */
+ RTUNI_ALPHA, /* U+00cc44: */
+ RTUNI_ALPHA, /* U+00cc45: */
+ RTUNI_ALPHA, /* U+00cc46: */
+ RTUNI_ALPHA, /* U+00cc47: */
+ RTUNI_ALPHA, /* U+00cc48: */
+ RTUNI_ALPHA, /* U+00cc49: */
+ RTUNI_ALPHA, /* U+00cc4a: */
+ RTUNI_ALPHA, /* U+00cc4b: */
+ RTUNI_ALPHA, /* U+00cc4c: */
+ RTUNI_ALPHA, /* U+00cc4d: */
+ RTUNI_ALPHA, /* U+00cc4e: */
+ RTUNI_ALPHA, /* U+00cc4f: */
+ RTUNI_ALPHA, /* U+00cc50: */
+ RTUNI_ALPHA, /* U+00cc51: */
+ RTUNI_ALPHA, /* U+00cc52: */
+ RTUNI_ALPHA, /* U+00cc53: */
+ RTUNI_ALPHA, /* U+00cc54: */
+ RTUNI_ALPHA, /* U+00cc55: */
+ RTUNI_ALPHA, /* U+00cc56: */
+ RTUNI_ALPHA, /* U+00cc57: */
+ RTUNI_ALPHA, /* U+00cc58: */
+ RTUNI_ALPHA, /* U+00cc59: */
+ RTUNI_ALPHA, /* U+00cc5a: */
+ RTUNI_ALPHA, /* U+00cc5b: */
+ RTUNI_ALPHA, /* U+00cc5c: */
+ RTUNI_ALPHA, /* U+00cc5d: */
+ RTUNI_ALPHA, /* U+00cc5e: */
+ RTUNI_ALPHA, /* U+00cc5f: */
+ RTUNI_ALPHA, /* U+00cc60: */
+ RTUNI_ALPHA, /* U+00cc61: */
+ RTUNI_ALPHA, /* U+00cc62: */
+ RTUNI_ALPHA, /* U+00cc63: */
+ RTUNI_ALPHA, /* U+00cc64: */
+ RTUNI_ALPHA, /* U+00cc65: */
+ RTUNI_ALPHA, /* U+00cc66: */
+ RTUNI_ALPHA, /* U+00cc67: */
+ RTUNI_ALPHA, /* U+00cc68: */
+ RTUNI_ALPHA, /* U+00cc69: */
+ RTUNI_ALPHA, /* U+00cc6a: */
+ RTUNI_ALPHA, /* U+00cc6b: */
+ RTUNI_ALPHA, /* U+00cc6c: */
+ RTUNI_ALPHA, /* U+00cc6d: */
+ RTUNI_ALPHA, /* U+00cc6e: */
+ RTUNI_ALPHA, /* U+00cc6f: */
+ RTUNI_ALPHA, /* U+00cc70: */
+ RTUNI_ALPHA, /* U+00cc71: */
+ RTUNI_ALPHA, /* U+00cc72: */
+ RTUNI_ALPHA, /* U+00cc73: */
+ RTUNI_ALPHA, /* U+00cc74: */
+ RTUNI_ALPHA, /* U+00cc75: */
+ RTUNI_ALPHA, /* U+00cc76: */
+ RTUNI_ALPHA, /* U+00cc77: */
+ RTUNI_ALPHA, /* U+00cc78: */
+ RTUNI_ALPHA, /* U+00cc79: */
+ RTUNI_ALPHA, /* U+00cc7a: */
+ RTUNI_ALPHA, /* U+00cc7b: */
+ RTUNI_ALPHA, /* U+00cc7c: */
+ RTUNI_ALPHA, /* U+00cc7d: */
+ RTUNI_ALPHA, /* U+00cc7e: */
+ RTUNI_ALPHA, /* U+00cc7f: */
+ RTUNI_ALPHA, /* U+00cc80: */
+ RTUNI_ALPHA, /* U+00cc81: */
+ RTUNI_ALPHA, /* U+00cc82: */
+ RTUNI_ALPHA, /* U+00cc83: */
+ RTUNI_ALPHA, /* U+00cc84: */
+ RTUNI_ALPHA, /* U+00cc85: */
+ RTUNI_ALPHA, /* U+00cc86: */
+ RTUNI_ALPHA, /* U+00cc87: */
+ RTUNI_ALPHA, /* U+00cc88: */
+ RTUNI_ALPHA, /* U+00cc89: */
+ RTUNI_ALPHA, /* U+00cc8a: */
+ RTUNI_ALPHA, /* U+00cc8b: */
+ RTUNI_ALPHA, /* U+00cc8c: */
+ RTUNI_ALPHA, /* U+00cc8d: */
+ RTUNI_ALPHA, /* U+00cc8e: */
+ RTUNI_ALPHA, /* U+00cc8f: */
+ RTUNI_ALPHA, /* U+00cc90: */
+ RTUNI_ALPHA, /* U+00cc91: */
+ RTUNI_ALPHA, /* U+00cc92: */
+ RTUNI_ALPHA, /* U+00cc93: */
+ RTUNI_ALPHA, /* U+00cc94: */
+ RTUNI_ALPHA, /* U+00cc95: */
+ RTUNI_ALPHA, /* U+00cc96: */
+ RTUNI_ALPHA, /* U+00cc97: */
+ RTUNI_ALPHA, /* U+00cc98: */
+ RTUNI_ALPHA, /* U+00cc99: */
+ RTUNI_ALPHA, /* U+00cc9a: */
+ RTUNI_ALPHA, /* U+00cc9b: */
+ RTUNI_ALPHA, /* U+00cc9c: */
+ RTUNI_ALPHA, /* U+00cc9d: */
+ RTUNI_ALPHA, /* U+00cc9e: */
+ RTUNI_ALPHA, /* U+00cc9f: */
+ RTUNI_ALPHA, /* U+00cca0: */
+ RTUNI_ALPHA, /* U+00cca1: */
+ RTUNI_ALPHA, /* U+00cca2: */
+ RTUNI_ALPHA, /* U+00cca3: */
+ RTUNI_ALPHA, /* U+00cca4: */
+ RTUNI_ALPHA, /* U+00cca5: */
+ RTUNI_ALPHA, /* U+00cca6: */
+ RTUNI_ALPHA, /* U+00cca7: */
+ RTUNI_ALPHA, /* U+00cca8: */
+ RTUNI_ALPHA, /* U+00cca9: */
+ RTUNI_ALPHA, /* U+00ccaa: */
+ RTUNI_ALPHA, /* U+00ccab: */
+ RTUNI_ALPHA, /* U+00ccac: */
+ RTUNI_ALPHA, /* U+00ccad: */
+ RTUNI_ALPHA, /* U+00ccae: */
+ RTUNI_ALPHA, /* U+00ccaf: */
+ RTUNI_ALPHA, /* U+00ccb0: */
+ RTUNI_ALPHA, /* U+00ccb1: */
+ RTUNI_ALPHA, /* U+00ccb2: */
+ RTUNI_ALPHA, /* U+00ccb3: */
+ RTUNI_ALPHA, /* U+00ccb4: */
+ RTUNI_ALPHA, /* U+00ccb5: */
+ RTUNI_ALPHA, /* U+00ccb6: */
+ RTUNI_ALPHA, /* U+00ccb7: */
+ RTUNI_ALPHA, /* U+00ccb8: */
+ RTUNI_ALPHA, /* U+00ccb9: */
+ RTUNI_ALPHA, /* U+00ccba: */
+ RTUNI_ALPHA, /* U+00ccbb: */
+ RTUNI_ALPHA, /* U+00ccbc: */
+ RTUNI_ALPHA, /* U+00ccbd: */
+ RTUNI_ALPHA, /* U+00ccbe: */
+ RTUNI_ALPHA, /* U+00ccbf: */
+ RTUNI_ALPHA, /* U+00ccc0: */
+ RTUNI_ALPHA, /* U+00ccc1: */
+ RTUNI_ALPHA, /* U+00ccc2: */
+ RTUNI_ALPHA, /* U+00ccc3: */
+ RTUNI_ALPHA, /* U+00ccc4: */
+ RTUNI_ALPHA, /* U+00ccc5: */
+ RTUNI_ALPHA, /* U+00ccc6: */
+ RTUNI_ALPHA, /* U+00ccc7: */
+ RTUNI_ALPHA, /* U+00ccc8: */
+ RTUNI_ALPHA, /* U+00ccc9: */
+ RTUNI_ALPHA, /* U+00ccca: */
+ RTUNI_ALPHA, /* U+00cccb: */
+ RTUNI_ALPHA, /* U+00cccc: */
+ RTUNI_ALPHA, /* U+00cccd: */
+ RTUNI_ALPHA, /* U+00ccce: */
+ RTUNI_ALPHA, /* U+00cccf: */
+ RTUNI_ALPHA, /* U+00ccd0: */
+ RTUNI_ALPHA, /* U+00ccd1: */
+ RTUNI_ALPHA, /* U+00ccd2: */
+ RTUNI_ALPHA, /* U+00ccd3: */
+ RTUNI_ALPHA, /* U+00ccd4: */
+ RTUNI_ALPHA, /* U+00ccd5: */
+ RTUNI_ALPHA, /* U+00ccd6: */
+ RTUNI_ALPHA, /* U+00ccd7: */
+ RTUNI_ALPHA, /* U+00ccd8: */
+ RTUNI_ALPHA, /* U+00ccd9: */
+ RTUNI_ALPHA, /* U+00ccda: */
+ RTUNI_ALPHA, /* U+00ccdb: */
+ RTUNI_ALPHA, /* U+00ccdc: */
+ RTUNI_ALPHA, /* U+00ccdd: */
+ RTUNI_ALPHA, /* U+00ccde: */
+ RTUNI_ALPHA, /* U+00ccdf: */
+ RTUNI_ALPHA, /* U+00cce0: */
+ RTUNI_ALPHA, /* U+00cce1: */
+ RTUNI_ALPHA, /* U+00cce2: */
+ RTUNI_ALPHA, /* U+00cce3: */
+ RTUNI_ALPHA, /* U+00cce4: */
+ RTUNI_ALPHA, /* U+00cce5: */
+ RTUNI_ALPHA, /* U+00cce6: */
+ RTUNI_ALPHA, /* U+00cce7: */
+ RTUNI_ALPHA, /* U+00cce8: */
+ RTUNI_ALPHA, /* U+00cce9: */
+ RTUNI_ALPHA, /* U+00ccea: */
+ RTUNI_ALPHA, /* U+00cceb: */
+ RTUNI_ALPHA, /* U+00ccec: */
+ RTUNI_ALPHA, /* U+00cced: */
+ RTUNI_ALPHA, /* U+00ccee: */
+ RTUNI_ALPHA, /* U+00ccef: */
+ RTUNI_ALPHA, /* U+00ccf0: */
+ RTUNI_ALPHA, /* U+00ccf1: */
+ RTUNI_ALPHA, /* U+00ccf2: */
+ RTUNI_ALPHA, /* U+00ccf3: */
+ RTUNI_ALPHA, /* U+00ccf4: */
+ RTUNI_ALPHA, /* U+00ccf5: */
+ RTUNI_ALPHA, /* U+00ccf6: */
+ RTUNI_ALPHA, /* U+00ccf7: */
+ RTUNI_ALPHA, /* U+00ccf8: */
+ RTUNI_ALPHA, /* U+00ccf9: */
+ RTUNI_ALPHA, /* U+00ccfa: */
+ RTUNI_ALPHA, /* U+00ccfb: */
+ RTUNI_ALPHA, /* U+00ccfc: */
+ RTUNI_ALPHA, /* U+00ccfd: */
+ RTUNI_ALPHA, /* U+00ccfe: */
+ RTUNI_ALPHA, /* U+00ccff: */
+ RTUNI_ALPHA, /* U+00cd00: */
+ RTUNI_ALPHA, /* U+00cd01: */
+ RTUNI_ALPHA, /* U+00cd02: */
+ RTUNI_ALPHA, /* U+00cd03: */
+ RTUNI_ALPHA, /* U+00cd04: */
+ RTUNI_ALPHA, /* U+00cd05: */
+ RTUNI_ALPHA, /* U+00cd06: */
+ RTUNI_ALPHA, /* U+00cd07: */
+ RTUNI_ALPHA, /* U+00cd08: */
+ RTUNI_ALPHA, /* U+00cd09: */
+ RTUNI_ALPHA, /* U+00cd0a: */
+ RTUNI_ALPHA, /* U+00cd0b: */
+ RTUNI_ALPHA, /* U+00cd0c: */
+ RTUNI_ALPHA, /* U+00cd0d: */
+ RTUNI_ALPHA, /* U+00cd0e: */
+ RTUNI_ALPHA, /* U+00cd0f: */
+ RTUNI_ALPHA, /* U+00cd10: */
+ RTUNI_ALPHA, /* U+00cd11: */
+ RTUNI_ALPHA, /* U+00cd12: */
+ RTUNI_ALPHA, /* U+00cd13: */
+ RTUNI_ALPHA, /* U+00cd14: */
+ RTUNI_ALPHA, /* U+00cd15: */
+ RTUNI_ALPHA, /* U+00cd16: */
+ RTUNI_ALPHA, /* U+00cd17: */
+ RTUNI_ALPHA, /* U+00cd18: */
+ RTUNI_ALPHA, /* U+00cd19: */
+ RTUNI_ALPHA, /* U+00cd1a: */
+ RTUNI_ALPHA, /* U+00cd1b: */
+ RTUNI_ALPHA, /* U+00cd1c: */
+ RTUNI_ALPHA, /* U+00cd1d: */
+ RTUNI_ALPHA, /* U+00cd1e: */
+ RTUNI_ALPHA, /* U+00cd1f: */
+ RTUNI_ALPHA, /* U+00cd20: */
+ RTUNI_ALPHA, /* U+00cd21: */
+ RTUNI_ALPHA, /* U+00cd22: */
+ RTUNI_ALPHA, /* U+00cd23: */
+ RTUNI_ALPHA, /* U+00cd24: */
+ RTUNI_ALPHA, /* U+00cd25: */
+ RTUNI_ALPHA, /* U+00cd26: */
+ RTUNI_ALPHA, /* U+00cd27: */
+ RTUNI_ALPHA, /* U+00cd28: */
+ RTUNI_ALPHA, /* U+00cd29: */
+ RTUNI_ALPHA, /* U+00cd2a: */
+ RTUNI_ALPHA, /* U+00cd2b: */
+ RTUNI_ALPHA, /* U+00cd2c: */
+ RTUNI_ALPHA, /* U+00cd2d: */
+ RTUNI_ALPHA, /* U+00cd2e: */
+ RTUNI_ALPHA, /* U+00cd2f: */
+ RTUNI_ALPHA, /* U+00cd30: */
+ RTUNI_ALPHA, /* U+00cd31: */
+ RTUNI_ALPHA, /* U+00cd32: */
+ RTUNI_ALPHA, /* U+00cd33: */
+ RTUNI_ALPHA, /* U+00cd34: */
+ RTUNI_ALPHA, /* U+00cd35: */
+ RTUNI_ALPHA, /* U+00cd36: */
+ RTUNI_ALPHA, /* U+00cd37: */
+ RTUNI_ALPHA, /* U+00cd38: */
+ RTUNI_ALPHA, /* U+00cd39: */
+ RTUNI_ALPHA, /* U+00cd3a: */
+ RTUNI_ALPHA, /* U+00cd3b: */
+ RTUNI_ALPHA, /* U+00cd3c: */
+ RTUNI_ALPHA, /* U+00cd3d: */
+ RTUNI_ALPHA, /* U+00cd3e: */
+ RTUNI_ALPHA, /* U+00cd3f: */
+ RTUNI_ALPHA, /* U+00cd40: */
+ RTUNI_ALPHA, /* U+00cd41: */
+ RTUNI_ALPHA, /* U+00cd42: */
+ RTUNI_ALPHA, /* U+00cd43: */
+ RTUNI_ALPHA, /* U+00cd44: */
+ RTUNI_ALPHA, /* U+00cd45: */
+ RTUNI_ALPHA, /* U+00cd46: */
+ RTUNI_ALPHA, /* U+00cd47: */
+ RTUNI_ALPHA, /* U+00cd48: */
+ RTUNI_ALPHA, /* U+00cd49: */
+ RTUNI_ALPHA, /* U+00cd4a: */
+ RTUNI_ALPHA, /* U+00cd4b: */
+ RTUNI_ALPHA, /* U+00cd4c: */
+ RTUNI_ALPHA, /* U+00cd4d: */
+ RTUNI_ALPHA, /* U+00cd4e: */
+ RTUNI_ALPHA, /* U+00cd4f: */
+ RTUNI_ALPHA, /* U+00cd50: */
+ RTUNI_ALPHA, /* U+00cd51: */
+ RTUNI_ALPHA, /* U+00cd52: */
+ RTUNI_ALPHA, /* U+00cd53: */
+ RTUNI_ALPHA, /* U+00cd54: */
+ RTUNI_ALPHA, /* U+00cd55: */
+ RTUNI_ALPHA, /* U+00cd56: */
+ RTUNI_ALPHA, /* U+00cd57: */
+ RTUNI_ALPHA, /* U+00cd58: */
+ RTUNI_ALPHA, /* U+00cd59: */
+ RTUNI_ALPHA, /* U+00cd5a: */
+ RTUNI_ALPHA, /* U+00cd5b: */
+ RTUNI_ALPHA, /* U+00cd5c: */
+ RTUNI_ALPHA, /* U+00cd5d: */
+ RTUNI_ALPHA, /* U+00cd5e: */
+ RTUNI_ALPHA, /* U+00cd5f: */
+ RTUNI_ALPHA, /* U+00cd60: */
+ RTUNI_ALPHA, /* U+00cd61: */
+ RTUNI_ALPHA, /* U+00cd62: */
+ RTUNI_ALPHA, /* U+00cd63: */
+ RTUNI_ALPHA, /* U+00cd64: */
+ RTUNI_ALPHA, /* U+00cd65: */
+ RTUNI_ALPHA, /* U+00cd66: */
+ RTUNI_ALPHA, /* U+00cd67: */
+ RTUNI_ALPHA, /* U+00cd68: */
+ RTUNI_ALPHA, /* U+00cd69: */
+ RTUNI_ALPHA, /* U+00cd6a: */
+ RTUNI_ALPHA, /* U+00cd6b: */
+ RTUNI_ALPHA, /* U+00cd6c: */
+ RTUNI_ALPHA, /* U+00cd6d: */
+ RTUNI_ALPHA, /* U+00cd6e: */
+ RTUNI_ALPHA, /* U+00cd6f: */
+ RTUNI_ALPHA, /* U+00cd70: */
+ RTUNI_ALPHA, /* U+00cd71: */
+ RTUNI_ALPHA, /* U+00cd72: */
+ RTUNI_ALPHA, /* U+00cd73: */
+ RTUNI_ALPHA, /* U+00cd74: */
+ RTUNI_ALPHA, /* U+00cd75: */
+ RTUNI_ALPHA, /* U+00cd76: */
+ RTUNI_ALPHA, /* U+00cd77: */
+ RTUNI_ALPHA, /* U+00cd78: */
+ RTUNI_ALPHA, /* U+00cd79: */
+ RTUNI_ALPHA, /* U+00cd7a: */
+ RTUNI_ALPHA, /* U+00cd7b: */
+ RTUNI_ALPHA, /* U+00cd7c: */
+ RTUNI_ALPHA, /* U+00cd7d: */
+ RTUNI_ALPHA, /* U+00cd7e: */
+ RTUNI_ALPHA, /* U+00cd7f: */
+ RTUNI_ALPHA, /* U+00cd80: */
+ RTUNI_ALPHA, /* U+00cd81: */
+ RTUNI_ALPHA, /* U+00cd82: */
+ RTUNI_ALPHA, /* U+00cd83: */
+ RTUNI_ALPHA, /* U+00cd84: */
+ RTUNI_ALPHA, /* U+00cd85: */
+ RTUNI_ALPHA, /* U+00cd86: */
+ RTUNI_ALPHA, /* U+00cd87: */
+ RTUNI_ALPHA, /* U+00cd88: */
+ RTUNI_ALPHA, /* U+00cd89: */
+ RTUNI_ALPHA, /* U+00cd8a: */
+ RTUNI_ALPHA, /* U+00cd8b: */
+ RTUNI_ALPHA, /* U+00cd8c: */
+ RTUNI_ALPHA, /* U+00cd8d: */
+ RTUNI_ALPHA, /* U+00cd8e: */
+ RTUNI_ALPHA, /* U+00cd8f: */
+ RTUNI_ALPHA, /* U+00cd90: */
+ RTUNI_ALPHA, /* U+00cd91: */
+ RTUNI_ALPHA, /* U+00cd92: */
+ RTUNI_ALPHA, /* U+00cd93: */
+ RTUNI_ALPHA, /* U+00cd94: */
+ RTUNI_ALPHA, /* U+00cd95: */
+ RTUNI_ALPHA, /* U+00cd96: */
+ RTUNI_ALPHA, /* U+00cd97: */
+ RTUNI_ALPHA, /* U+00cd98: */
+ RTUNI_ALPHA, /* U+00cd99: */
+ RTUNI_ALPHA, /* U+00cd9a: */
+ RTUNI_ALPHA, /* U+00cd9b: */
+ RTUNI_ALPHA, /* U+00cd9c: */
+ RTUNI_ALPHA, /* U+00cd9d: */
+ RTUNI_ALPHA, /* U+00cd9e: */
+ RTUNI_ALPHA, /* U+00cd9f: */
+ RTUNI_ALPHA, /* U+00cda0: */
+ RTUNI_ALPHA, /* U+00cda1: */
+ RTUNI_ALPHA, /* U+00cda2: */
+ RTUNI_ALPHA, /* U+00cda3: */
+ RTUNI_ALPHA, /* U+00cda4: */
+ RTUNI_ALPHA, /* U+00cda5: */
+ RTUNI_ALPHA, /* U+00cda6: */
+ RTUNI_ALPHA, /* U+00cda7: */
+ RTUNI_ALPHA, /* U+00cda8: */
+ RTUNI_ALPHA, /* U+00cda9: */
+ RTUNI_ALPHA, /* U+00cdaa: */
+ RTUNI_ALPHA, /* U+00cdab: */
+ RTUNI_ALPHA, /* U+00cdac: */
+ RTUNI_ALPHA, /* U+00cdad: */
+ RTUNI_ALPHA, /* U+00cdae: */
+ RTUNI_ALPHA, /* U+00cdaf: */
+ RTUNI_ALPHA, /* U+00cdb0: */
+ RTUNI_ALPHA, /* U+00cdb1: */
+ RTUNI_ALPHA, /* U+00cdb2: */
+ RTUNI_ALPHA, /* U+00cdb3: */
+ RTUNI_ALPHA, /* U+00cdb4: */
+ RTUNI_ALPHA, /* U+00cdb5: */
+ RTUNI_ALPHA, /* U+00cdb6: */
+ RTUNI_ALPHA, /* U+00cdb7: */
+ RTUNI_ALPHA, /* U+00cdb8: */
+ RTUNI_ALPHA, /* U+00cdb9: */
+ RTUNI_ALPHA, /* U+00cdba: */
+ RTUNI_ALPHA, /* U+00cdbb: */
+ RTUNI_ALPHA, /* U+00cdbc: */
+ RTUNI_ALPHA, /* U+00cdbd: */
+ RTUNI_ALPHA, /* U+00cdbe: */
+ RTUNI_ALPHA, /* U+00cdbf: */
+ RTUNI_ALPHA, /* U+00cdc0: */
+ RTUNI_ALPHA, /* U+00cdc1: */
+ RTUNI_ALPHA, /* U+00cdc2: */
+ RTUNI_ALPHA, /* U+00cdc3: */
+ RTUNI_ALPHA, /* U+00cdc4: */
+ RTUNI_ALPHA, /* U+00cdc5: */
+ RTUNI_ALPHA, /* U+00cdc6: */
+ RTUNI_ALPHA, /* U+00cdc7: */
+ RTUNI_ALPHA, /* U+00cdc8: */
+ RTUNI_ALPHA, /* U+00cdc9: */
+ RTUNI_ALPHA, /* U+00cdca: */
+ RTUNI_ALPHA, /* U+00cdcb: */
+ RTUNI_ALPHA, /* U+00cdcc: */
+ RTUNI_ALPHA, /* U+00cdcd: */
+ RTUNI_ALPHA, /* U+00cdce: */
+ RTUNI_ALPHA, /* U+00cdcf: */
+ RTUNI_ALPHA, /* U+00cdd0: */
+ RTUNI_ALPHA, /* U+00cdd1: */
+ RTUNI_ALPHA, /* U+00cdd2: */
+ RTUNI_ALPHA, /* U+00cdd3: */
+ RTUNI_ALPHA, /* U+00cdd4: */
+ RTUNI_ALPHA, /* U+00cdd5: */
+ RTUNI_ALPHA, /* U+00cdd6: */
+ RTUNI_ALPHA, /* U+00cdd7: */
+ RTUNI_ALPHA, /* U+00cdd8: */
+ RTUNI_ALPHA, /* U+00cdd9: */
+ RTUNI_ALPHA, /* U+00cdda: */
+ RTUNI_ALPHA, /* U+00cddb: */
+ RTUNI_ALPHA, /* U+00cddc: */
+ RTUNI_ALPHA, /* U+00cddd: */
+ RTUNI_ALPHA, /* U+00cdde: */
+ RTUNI_ALPHA, /* U+00cddf: */
+ RTUNI_ALPHA, /* U+00cde0: */
+ RTUNI_ALPHA, /* U+00cde1: */
+ RTUNI_ALPHA, /* U+00cde2: */
+ RTUNI_ALPHA, /* U+00cde3: */
+ RTUNI_ALPHA, /* U+00cde4: */
+ RTUNI_ALPHA, /* U+00cde5: */
+ RTUNI_ALPHA, /* U+00cde6: */
+ RTUNI_ALPHA, /* U+00cde7: */
+ RTUNI_ALPHA, /* U+00cde8: */
+ RTUNI_ALPHA, /* U+00cde9: */
+ RTUNI_ALPHA, /* U+00cdea: */
+ RTUNI_ALPHA, /* U+00cdeb: */
+ RTUNI_ALPHA, /* U+00cdec: */
+ RTUNI_ALPHA, /* U+00cded: */
+ RTUNI_ALPHA, /* U+00cdee: */
+ RTUNI_ALPHA, /* U+00cdef: */
+ RTUNI_ALPHA, /* U+00cdf0: */
+ RTUNI_ALPHA, /* U+00cdf1: */
+ RTUNI_ALPHA, /* U+00cdf2: */
+ RTUNI_ALPHA, /* U+00cdf3: */
+ RTUNI_ALPHA, /* U+00cdf4: */
+ RTUNI_ALPHA, /* U+00cdf5: */
+ RTUNI_ALPHA, /* U+00cdf6: */
+ RTUNI_ALPHA, /* U+00cdf7: */
+ RTUNI_ALPHA, /* U+00cdf8: */
+ RTUNI_ALPHA, /* U+00cdf9: */
+ RTUNI_ALPHA, /* U+00cdfa: */
+ RTUNI_ALPHA, /* U+00cdfb: */
+ RTUNI_ALPHA, /* U+00cdfc: */
+ RTUNI_ALPHA, /* U+00cdfd: */
+ RTUNI_ALPHA, /* U+00cdfe: */
+ RTUNI_ALPHA, /* U+00cdff: */
+ RTUNI_ALPHA, /* U+00ce00: */
+ RTUNI_ALPHA, /* U+00ce01: */
+ RTUNI_ALPHA, /* U+00ce02: */
+ RTUNI_ALPHA, /* U+00ce03: */
+ RTUNI_ALPHA, /* U+00ce04: */
+ RTUNI_ALPHA, /* U+00ce05: */
+ RTUNI_ALPHA, /* U+00ce06: */
+ RTUNI_ALPHA, /* U+00ce07: */
+ RTUNI_ALPHA, /* U+00ce08: */
+ RTUNI_ALPHA, /* U+00ce09: */
+ RTUNI_ALPHA, /* U+00ce0a: */
+ RTUNI_ALPHA, /* U+00ce0b: */
+ RTUNI_ALPHA, /* U+00ce0c: */
+ RTUNI_ALPHA, /* U+00ce0d: */
+ RTUNI_ALPHA, /* U+00ce0e: */
+ RTUNI_ALPHA, /* U+00ce0f: */
+ RTUNI_ALPHA, /* U+00ce10: */
+ RTUNI_ALPHA, /* U+00ce11: */
+ RTUNI_ALPHA, /* U+00ce12: */
+ RTUNI_ALPHA, /* U+00ce13: */
+ RTUNI_ALPHA, /* U+00ce14: */
+ RTUNI_ALPHA, /* U+00ce15: */
+ RTUNI_ALPHA, /* U+00ce16: */
+ RTUNI_ALPHA, /* U+00ce17: */
+ RTUNI_ALPHA, /* U+00ce18: */
+ RTUNI_ALPHA, /* U+00ce19: */
+ RTUNI_ALPHA, /* U+00ce1a: */
+ RTUNI_ALPHA, /* U+00ce1b: */
+ RTUNI_ALPHA, /* U+00ce1c: */
+ RTUNI_ALPHA, /* U+00ce1d: */
+ RTUNI_ALPHA, /* U+00ce1e: */
+ RTUNI_ALPHA, /* U+00ce1f: */
+ RTUNI_ALPHA, /* U+00ce20: */
+ RTUNI_ALPHA, /* U+00ce21: */
+ RTUNI_ALPHA, /* U+00ce22: */
+ RTUNI_ALPHA, /* U+00ce23: */
+ RTUNI_ALPHA, /* U+00ce24: */
+ RTUNI_ALPHA, /* U+00ce25: */
+ RTUNI_ALPHA, /* U+00ce26: */
+ RTUNI_ALPHA, /* U+00ce27: */
+ RTUNI_ALPHA, /* U+00ce28: */
+ RTUNI_ALPHA, /* U+00ce29: */
+ RTUNI_ALPHA, /* U+00ce2a: */
+ RTUNI_ALPHA, /* U+00ce2b: */
+ RTUNI_ALPHA, /* U+00ce2c: */
+ RTUNI_ALPHA, /* U+00ce2d: */
+ RTUNI_ALPHA, /* U+00ce2e: */
+ RTUNI_ALPHA, /* U+00ce2f: */
+ RTUNI_ALPHA, /* U+00ce30: */
+ RTUNI_ALPHA, /* U+00ce31: */
+ RTUNI_ALPHA, /* U+00ce32: */
+ RTUNI_ALPHA, /* U+00ce33: */
+ RTUNI_ALPHA, /* U+00ce34: */
+ RTUNI_ALPHA, /* U+00ce35: */
+ RTUNI_ALPHA, /* U+00ce36: */
+ RTUNI_ALPHA, /* U+00ce37: */
+ RTUNI_ALPHA, /* U+00ce38: */
+ RTUNI_ALPHA, /* U+00ce39: */
+ RTUNI_ALPHA, /* U+00ce3a: */
+ RTUNI_ALPHA, /* U+00ce3b: */
+ RTUNI_ALPHA, /* U+00ce3c: */
+ RTUNI_ALPHA, /* U+00ce3d: */
+ RTUNI_ALPHA, /* U+00ce3e: */
+ RTUNI_ALPHA, /* U+00ce3f: */
+ RTUNI_ALPHA, /* U+00ce40: */
+ RTUNI_ALPHA, /* U+00ce41: */
+ RTUNI_ALPHA, /* U+00ce42: */
+ RTUNI_ALPHA, /* U+00ce43: */
+ RTUNI_ALPHA, /* U+00ce44: */
+ RTUNI_ALPHA, /* U+00ce45: */
+ RTUNI_ALPHA, /* U+00ce46: */
+ RTUNI_ALPHA, /* U+00ce47: */
+ RTUNI_ALPHA, /* U+00ce48: */
+ RTUNI_ALPHA, /* U+00ce49: */
+ RTUNI_ALPHA, /* U+00ce4a: */
+ RTUNI_ALPHA, /* U+00ce4b: */
+ RTUNI_ALPHA, /* U+00ce4c: */
+ RTUNI_ALPHA, /* U+00ce4d: */
+ RTUNI_ALPHA, /* U+00ce4e: */
+ RTUNI_ALPHA, /* U+00ce4f: */
+ RTUNI_ALPHA, /* U+00ce50: */
+ RTUNI_ALPHA, /* U+00ce51: */
+ RTUNI_ALPHA, /* U+00ce52: */
+ RTUNI_ALPHA, /* U+00ce53: */
+ RTUNI_ALPHA, /* U+00ce54: */
+ RTUNI_ALPHA, /* U+00ce55: */
+ RTUNI_ALPHA, /* U+00ce56: */
+ RTUNI_ALPHA, /* U+00ce57: */
+ RTUNI_ALPHA, /* U+00ce58: */
+ RTUNI_ALPHA, /* U+00ce59: */
+ RTUNI_ALPHA, /* U+00ce5a: */
+ RTUNI_ALPHA, /* U+00ce5b: */
+ RTUNI_ALPHA, /* U+00ce5c: */
+ RTUNI_ALPHA, /* U+00ce5d: */
+ RTUNI_ALPHA, /* U+00ce5e: */
+ RTUNI_ALPHA, /* U+00ce5f: */
+ RTUNI_ALPHA, /* U+00ce60: */
+ RTUNI_ALPHA, /* U+00ce61: */
+ RTUNI_ALPHA, /* U+00ce62: */
+ RTUNI_ALPHA, /* U+00ce63: */
+ RTUNI_ALPHA, /* U+00ce64: */
+ RTUNI_ALPHA, /* U+00ce65: */
+ RTUNI_ALPHA, /* U+00ce66: */
+ RTUNI_ALPHA, /* U+00ce67: */
+ RTUNI_ALPHA, /* U+00ce68: */
+ RTUNI_ALPHA, /* U+00ce69: */
+ RTUNI_ALPHA, /* U+00ce6a: */
+ RTUNI_ALPHA, /* U+00ce6b: */
+ RTUNI_ALPHA, /* U+00ce6c: */
+ RTUNI_ALPHA, /* U+00ce6d: */
+ RTUNI_ALPHA, /* U+00ce6e: */
+ RTUNI_ALPHA, /* U+00ce6f: */
+ RTUNI_ALPHA, /* U+00ce70: */
+ RTUNI_ALPHA, /* U+00ce71: */
+ RTUNI_ALPHA, /* U+00ce72: */
+ RTUNI_ALPHA, /* U+00ce73: */
+ RTUNI_ALPHA, /* U+00ce74: */
+ RTUNI_ALPHA, /* U+00ce75: */
+ RTUNI_ALPHA, /* U+00ce76: */
+ RTUNI_ALPHA, /* U+00ce77: */
+ RTUNI_ALPHA, /* U+00ce78: */
+ RTUNI_ALPHA, /* U+00ce79: */
+ RTUNI_ALPHA, /* U+00ce7a: */
+ RTUNI_ALPHA, /* U+00ce7b: */
+ RTUNI_ALPHA, /* U+00ce7c: */
+ RTUNI_ALPHA, /* U+00ce7d: */
+ RTUNI_ALPHA, /* U+00ce7e: */
+ RTUNI_ALPHA, /* U+00ce7f: */
+ RTUNI_ALPHA, /* U+00ce80: */
+ RTUNI_ALPHA, /* U+00ce81: */
+ RTUNI_ALPHA, /* U+00ce82: */
+ RTUNI_ALPHA, /* U+00ce83: */
+ RTUNI_ALPHA, /* U+00ce84: */
+ RTUNI_ALPHA, /* U+00ce85: */
+ RTUNI_ALPHA, /* U+00ce86: */
+ RTUNI_ALPHA, /* U+00ce87: */
+ RTUNI_ALPHA, /* U+00ce88: */
+ RTUNI_ALPHA, /* U+00ce89: */
+ RTUNI_ALPHA, /* U+00ce8a: */
+ RTUNI_ALPHA, /* U+00ce8b: */
+ RTUNI_ALPHA, /* U+00ce8c: */
+ RTUNI_ALPHA, /* U+00ce8d: */
+ RTUNI_ALPHA, /* U+00ce8e: */
+ RTUNI_ALPHA, /* U+00ce8f: */
+ RTUNI_ALPHA, /* U+00ce90: */
+ RTUNI_ALPHA, /* U+00ce91: */
+ RTUNI_ALPHA, /* U+00ce92: */
+ RTUNI_ALPHA, /* U+00ce93: */
+ RTUNI_ALPHA, /* U+00ce94: */
+ RTUNI_ALPHA, /* U+00ce95: */
+ RTUNI_ALPHA, /* U+00ce96: */
+ RTUNI_ALPHA, /* U+00ce97: */
+ RTUNI_ALPHA, /* U+00ce98: */
+ RTUNI_ALPHA, /* U+00ce99: */
+ RTUNI_ALPHA, /* U+00ce9a: */
+ RTUNI_ALPHA, /* U+00ce9b: */
+ RTUNI_ALPHA, /* U+00ce9c: */
+ RTUNI_ALPHA, /* U+00ce9d: */
+ RTUNI_ALPHA, /* U+00ce9e: */
+ RTUNI_ALPHA, /* U+00ce9f: */
+ RTUNI_ALPHA, /* U+00cea0: */
+ RTUNI_ALPHA, /* U+00cea1: */
+ RTUNI_ALPHA, /* U+00cea2: */
+ RTUNI_ALPHA, /* U+00cea3: */
+ RTUNI_ALPHA, /* U+00cea4: */
+ RTUNI_ALPHA, /* U+00cea5: */
+ RTUNI_ALPHA, /* U+00cea6: */
+ RTUNI_ALPHA, /* U+00cea7: */
+ RTUNI_ALPHA, /* U+00cea8: */
+ RTUNI_ALPHA, /* U+00cea9: */
+ RTUNI_ALPHA, /* U+00ceaa: */
+ RTUNI_ALPHA, /* U+00ceab: */
+ RTUNI_ALPHA, /* U+00ceac: */
+ RTUNI_ALPHA, /* U+00cead: */
+ RTUNI_ALPHA, /* U+00ceae: */
+ RTUNI_ALPHA, /* U+00ceaf: */
+ RTUNI_ALPHA, /* U+00ceb0: */
+ RTUNI_ALPHA, /* U+00ceb1: */
+ RTUNI_ALPHA, /* U+00ceb2: */
+ RTUNI_ALPHA, /* U+00ceb3: */
+ RTUNI_ALPHA, /* U+00ceb4: */
+ RTUNI_ALPHA, /* U+00ceb5: */
+ RTUNI_ALPHA, /* U+00ceb6: */
+ RTUNI_ALPHA, /* U+00ceb7: */
+ RTUNI_ALPHA, /* U+00ceb8: */
+ RTUNI_ALPHA, /* U+00ceb9: */
+ RTUNI_ALPHA, /* U+00ceba: */
+ RTUNI_ALPHA, /* U+00cebb: */
+ RTUNI_ALPHA, /* U+00cebc: */
+ RTUNI_ALPHA, /* U+00cebd: */
+ RTUNI_ALPHA, /* U+00cebe: */
+ RTUNI_ALPHA, /* U+00cebf: */
+ RTUNI_ALPHA, /* U+00cec0: */
+ RTUNI_ALPHA, /* U+00cec1: */
+ RTUNI_ALPHA, /* U+00cec2: */
+ RTUNI_ALPHA, /* U+00cec3: */
+ RTUNI_ALPHA, /* U+00cec4: */
+ RTUNI_ALPHA, /* U+00cec5: */
+ RTUNI_ALPHA, /* U+00cec6: */
+ RTUNI_ALPHA, /* U+00cec7: */
+ RTUNI_ALPHA, /* U+00cec8: */
+ RTUNI_ALPHA, /* U+00cec9: */
+ RTUNI_ALPHA, /* U+00ceca: */
+ RTUNI_ALPHA, /* U+00cecb: */
+ RTUNI_ALPHA, /* U+00cecc: */
+ RTUNI_ALPHA, /* U+00cecd: */
+ RTUNI_ALPHA, /* U+00cece: */
+ RTUNI_ALPHA, /* U+00cecf: */
+ RTUNI_ALPHA, /* U+00ced0: */
+ RTUNI_ALPHA, /* U+00ced1: */
+ RTUNI_ALPHA, /* U+00ced2: */
+ RTUNI_ALPHA, /* U+00ced3: */
+ RTUNI_ALPHA, /* U+00ced4: */
+ RTUNI_ALPHA, /* U+00ced5: */
+ RTUNI_ALPHA, /* U+00ced6: */
+ RTUNI_ALPHA, /* U+00ced7: */
+ RTUNI_ALPHA, /* U+00ced8: */
+ RTUNI_ALPHA, /* U+00ced9: */
+ RTUNI_ALPHA, /* U+00ceda: */
+ RTUNI_ALPHA, /* U+00cedb: */
+ RTUNI_ALPHA, /* U+00cedc: */
+ RTUNI_ALPHA, /* U+00cedd: */
+ RTUNI_ALPHA, /* U+00cede: */
+ RTUNI_ALPHA, /* U+00cedf: */
+ RTUNI_ALPHA, /* U+00cee0: */
+ RTUNI_ALPHA, /* U+00cee1: */
+ RTUNI_ALPHA, /* U+00cee2: */
+ RTUNI_ALPHA, /* U+00cee3: */
+ RTUNI_ALPHA, /* U+00cee4: */
+ RTUNI_ALPHA, /* U+00cee5: */
+ RTUNI_ALPHA, /* U+00cee6: */
+ RTUNI_ALPHA, /* U+00cee7: */
+ RTUNI_ALPHA, /* U+00cee8: */
+ RTUNI_ALPHA, /* U+00cee9: */
+ RTUNI_ALPHA, /* U+00ceea: */
+ RTUNI_ALPHA, /* U+00ceeb: */
+ RTUNI_ALPHA, /* U+00ceec: */
+ RTUNI_ALPHA, /* U+00ceed: */
+ RTUNI_ALPHA, /* U+00ceee: */
+ RTUNI_ALPHA, /* U+00ceef: */
+ RTUNI_ALPHA, /* U+00cef0: */
+ RTUNI_ALPHA, /* U+00cef1: */
+ RTUNI_ALPHA, /* U+00cef2: */
+ RTUNI_ALPHA, /* U+00cef3: */
+ RTUNI_ALPHA, /* U+00cef4: */
+ RTUNI_ALPHA, /* U+00cef5: */
+ RTUNI_ALPHA, /* U+00cef6: */
+ RTUNI_ALPHA, /* U+00cef7: */
+ RTUNI_ALPHA, /* U+00cef8: */
+ RTUNI_ALPHA, /* U+00cef9: */
+ RTUNI_ALPHA, /* U+00cefa: */
+ RTUNI_ALPHA, /* U+00cefb: */
+ RTUNI_ALPHA, /* U+00cefc: */
+ RTUNI_ALPHA, /* U+00cefd: */
+ RTUNI_ALPHA, /* U+00cefe: */
+ RTUNI_ALPHA, /* U+00ceff: */
+ RTUNI_ALPHA, /* U+00cf00: */
+ RTUNI_ALPHA, /* U+00cf01: */
+ RTUNI_ALPHA, /* U+00cf02: */
+ RTUNI_ALPHA, /* U+00cf03: */
+ RTUNI_ALPHA, /* U+00cf04: */
+ RTUNI_ALPHA, /* U+00cf05: */
+ RTUNI_ALPHA, /* U+00cf06: */
+ RTUNI_ALPHA, /* U+00cf07: */
+ RTUNI_ALPHA, /* U+00cf08: */
+ RTUNI_ALPHA, /* U+00cf09: */
+ RTUNI_ALPHA, /* U+00cf0a: */
+ RTUNI_ALPHA, /* U+00cf0b: */
+ RTUNI_ALPHA, /* U+00cf0c: */
+ RTUNI_ALPHA, /* U+00cf0d: */
+ RTUNI_ALPHA, /* U+00cf0e: */
+ RTUNI_ALPHA, /* U+00cf0f: */
+ RTUNI_ALPHA, /* U+00cf10: */
+ RTUNI_ALPHA, /* U+00cf11: */
+ RTUNI_ALPHA, /* U+00cf12: */
+ RTUNI_ALPHA, /* U+00cf13: */
+ RTUNI_ALPHA, /* U+00cf14: */
+ RTUNI_ALPHA, /* U+00cf15: */
+ RTUNI_ALPHA, /* U+00cf16: */
+ RTUNI_ALPHA, /* U+00cf17: */
+ RTUNI_ALPHA, /* U+00cf18: */
+ RTUNI_ALPHA, /* U+00cf19: */
+ RTUNI_ALPHA, /* U+00cf1a: */
+ RTUNI_ALPHA, /* U+00cf1b: */
+ RTUNI_ALPHA, /* U+00cf1c: */
+ RTUNI_ALPHA, /* U+00cf1d: */
+ RTUNI_ALPHA, /* U+00cf1e: */
+ RTUNI_ALPHA, /* U+00cf1f: */
+ RTUNI_ALPHA, /* U+00cf20: */
+ RTUNI_ALPHA, /* U+00cf21: */
+ RTUNI_ALPHA, /* U+00cf22: */
+ RTUNI_ALPHA, /* U+00cf23: */
+ RTUNI_ALPHA, /* U+00cf24: */
+ RTUNI_ALPHA, /* U+00cf25: */
+ RTUNI_ALPHA, /* U+00cf26: */
+ RTUNI_ALPHA, /* U+00cf27: */
+ RTUNI_ALPHA, /* U+00cf28: */
+ RTUNI_ALPHA, /* U+00cf29: */
+ RTUNI_ALPHA, /* U+00cf2a: */
+ RTUNI_ALPHA, /* U+00cf2b: */
+ RTUNI_ALPHA, /* U+00cf2c: */
+ RTUNI_ALPHA, /* U+00cf2d: */
+ RTUNI_ALPHA, /* U+00cf2e: */
+ RTUNI_ALPHA, /* U+00cf2f: */
+ RTUNI_ALPHA, /* U+00cf30: */
+ RTUNI_ALPHA, /* U+00cf31: */
+ RTUNI_ALPHA, /* U+00cf32: */
+ RTUNI_ALPHA, /* U+00cf33: */
+ RTUNI_ALPHA, /* U+00cf34: */
+ RTUNI_ALPHA, /* U+00cf35: */
+ RTUNI_ALPHA, /* U+00cf36: */
+ RTUNI_ALPHA, /* U+00cf37: */
+ RTUNI_ALPHA, /* U+00cf38: */
+ RTUNI_ALPHA, /* U+00cf39: */
+ RTUNI_ALPHA, /* U+00cf3a: */
+ RTUNI_ALPHA, /* U+00cf3b: */
+ RTUNI_ALPHA, /* U+00cf3c: */
+ RTUNI_ALPHA, /* U+00cf3d: */
+ RTUNI_ALPHA, /* U+00cf3e: */
+ RTUNI_ALPHA, /* U+00cf3f: */
+ RTUNI_ALPHA, /* U+00cf40: */
+ RTUNI_ALPHA, /* U+00cf41: */
+ RTUNI_ALPHA, /* U+00cf42: */
+ RTUNI_ALPHA, /* U+00cf43: */
+ RTUNI_ALPHA, /* U+00cf44: */
+ RTUNI_ALPHA, /* U+00cf45: */
+ RTUNI_ALPHA, /* U+00cf46: */
+ RTUNI_ALPHA, /* U+00cf47: */
+ RTUNI_ALPHA, /* U+00cf48: */
+ RTUNI_ALPHA, /* U+00cf49: */
+ RTUNI_ALPHA, /* U+00cf4a: */
+ RTUNI_ALPHA, /* U+00cf4b: */
+ RTUNI_ALPHA, /* U+00cf4c: */
+ RTUNI_ALPHA, /* U+00cf4d: */
+ RTUNI_ALPHA, /* U+00cf4e: */
+ RTUNI_ALPHA, /* U+00cf4f: */
+ RTUNI_ALPHA, /* U+00cf50: */
+ RTUNI_ALPHA, /* U+00cf51: */
+ RTUNI_ALPHA, /* U+00cf52: */
+ RTUNI_ALPHA, /* U+00cf53: */
+ RTUNI_ALPHA, /* U+00cf54: */
+ RTUNI_ALPHA, /* U+00cf55: */
+ RTUNI_ALPHA, /* U+00cf56: */
+ RTUNI_ALPHA, /* U+00cf57: */
+ RTUNI_ALPHA, /* U+00cf58: */
+ RTUNI_ALPHA, /* U+00cf59: */
+ RTUNI_ALPHA, /* U+00cf5a: */
+ RTUNI_ALPHA, /* U+00cf5b: */
+ RTUNI_ALPHA, /* U+00cf5c: */
+ RTUNI_ALPHA, /* U+00cf5d: */
+ RTUNI_ALPHA, /* U+00cf5e: */
+ RTUNI_ALPHA, /* U+00cf5f: */
+ RTUNI_ALPHA, /* U+00cf60: */
+ RTUNI_ALPHA, /* U+00cf61: */
+ RTUNI_ALPHA, /* U+00cf62: */
+ RTUNI_ALPHA, /* U+00cf63: */
+ RTUNI_ALPHA, /* U+00cf64: */
+ RTUNI_ALPHA, /* U+00cf65: */
+ RTUNI_ALPHA, /* U+00cf66: */
+ RTUNI_ALPHA, /* U+00cf67: */
+ RTUNI_ALPHA, /* U+00cf68: */
+ RTUNI_ALPHA, /* U+00cf69: */
+ RTUNI_ALPHA, /* U+00cf6a: */
+ RTUNI_ALPHA, /* U+00cf6b: */
+ RTUNI_ALPHA, /* U+00cf6c: */
+ RTUNI_ALPHA, /* U+00cf6d: */
+ RTUNI_ALPHA, /* U+00cf6e: */
+ RTUNI_ALPHA, /* U+00cf6f: */
+ RTUNI_ALPHA, /* U+00cf70: */
+ RTUNI_ALPHA, /* U+00cf71: */
+ RTUNI_ALPHA, /* U+00cf72: */
+ RTUNI_ALPHA, /* U+00cf73: */
+ RTUNI_ALPHA, /* U+00cf74: */
+ RTUNI_ALPHA, /* U+00cf75: */
+ RTUNI_ALPHA, /* U+00cf76: */
+ RTUNI_ALPHA, /* U+00cf77: */
+ RTUNI_ALPHA, /* U+00cf78: */
+ RTUNI_ALPHA, /* U+00cf79: */
+ RTUNI_ALPHA, /* U+00cf7a: */
+ RTUNI_ALPHA, /* U+00cf7b: */
+ RTUNI_ALPHA, /* U+00cf7c: */
+ RTUNI_ALPHA, /* U+00cf7d: */
+ RTUNI_ALPHA, /* U+00cf7e: */
+ RTUNI_ALPHA, /* U+00cf7f: */
+ RTUNI_ALPHA, /* U+00cf80: */
+ RTUNI_ALPHA, /* U+00cf81: */
+ RTUNI_ALPHA, /* U+00cf82: */
+ RTUNI_ALPHA, /* U+00cf83: */
+ RTUNI_ALPHA, /* U+00cf84: */
+ RTUNI_ALPHA, /* U+00cf85: */
+ RTUNI_ALPHA, /* U+00cf86: */
+ RTUNI_ALPHA, /* U+00cf87: */
+ RTUNI_ALPHA, /* U+00cf88: */
+ RTUNI_ALPHA, /* U+00cf89: */
+ RTUNI_ALPHA, /* U+00cf8a: */
+ RTUNI_ALPHA, /* U+00cf8b: */
+ RTUNI_ALPHA, /* U+00cf8c: */
+ RTUNI_ALPHA, /* U+00cf8d: */
+ RTUNI_ALPHA, /* U+00cf8e: */
+ RTUNI_ALPHA, /* U+00cf8f: */
+ RTUNI_ALPHA, /* U+00cf90: */
+ RTUNI_ALPHA, /* U+00cf91: */
+ RTUNI_ALPHA, /* U+00cf92: */
+ RTUNI_ALPHA, /* U+00cf93: */
+ RTUNI_ALPHA, /* U+00cf94: */
+ RTUNI_ALPHA, /* U+00cf95: */
+ RTUNI_ALPHA, /* U+00cf96: */
+ RTUNI_ALPHA, /* U+00cf97: */
+ RTUNI_ALPHA, /* U+00cf98: */
+ RTUNI_ALPHA, /* U+00cf99: */
+ RTUNI_ALPHA, /* U+00cf9a: */
+ RTUNI_ALPHA, /* U+00cf9b: */
+ RTUNI_ALPHA, /* U+00cf9c: */
+ RTUNI_ALPHA, /* U+00cf9d: */
+ RTUNI_ALPHA, /* U+00cf9e: */
+ RTUNI_ALPHA, /* U+00cf9f: */
+ RTUNI_ALPHA, /* U+00cfa0: */
+ RTUNI_ALPHA, /* U+00cfa1: */
+ RTUNI_ALPHA, /* U+00cfa2: */
+ RTUNI_ALPHA, /* U+00cfa3: */
+ RTUNI_ALPHA, /* U+00cfa4: */
+ RTUNI_ALPHA, /* U+00cfa5: */
+ RTUNI_ALPHA, /* U+00cfa6: */
+ RTUNI_ALPHA, /* U+00cfa7: */
+ RTUNI_ALPHA, /* U+00cfa8: */
+ RTUNI_ALPHA, /* U+00cfa9: */
+ RTUNI_ALPHA, /* U+00cfaa: */
+ RTUNI_ALPHA, /* U+00cfab: */
+ RTUNI_ALPHA, /* U+00cfac: */
+ RTUNI_ALPHA, /* U+00cfad: */
+ RTUNI_ALPHA, /* U+00cfae: */
+ RTUNI_ALPHA, /* U+00cfaf: */
+ RTUNI_ALPHA, /* U+00cfb0: */
+ RTUNI_ALPHA, /* U+00cfb1: */
+ RTUNI_ALPHA, /* U+00cfb2: */
+ RTUNI_ALPHA, /* U+00cfb3: */
+ RTUNI_ALPHA, /* U+00cfb4: */
+ RTUNI_ALPHA, /* U+00cfb5: */
+ RTUNI_ALPHA, /* U+00cfb6: */
+ RTUNI_ALPHA, /* U+00cfb7: */
+ RTUNI_ALPHA, /* U+00cfb8: */
+ RTUNI_ALPHA, /* U+00cfb9: */
+ RTUNI_ALPHA, /* U+00cfba: */
+ RTUNI_ALPHA, /* U+00cfbb: */
+ RTUNI_ALPHA, /* U+00cfbc: */
+ RTUNI_ALPHA, /* U+00cfbd: */
+ RTUNI_ALPHA, /* U+00cfbe: */
+ RTUNI_ALPHA, /* U+00cfbf: */
+ RTUNI_ALPHA, /* U+00cfc0: */
+ RTUNI_ALPHA, /* U+00cfc1: */
+ RTUNI_ALPHA, /* U+00cfc2: */
+ RTUNI_ALPHA, /* U+00cfc3: */
+ RTUNI_ALPHA, /* U+00cfc4: */
+ RTUNI_ALPHA, /* U+00cfc5: */
+ RTUNI_ALPHA, /* U+00cfc6: */
+ RTUNI_ALPHA, /* U+00cfc7: */
+ RTUNI_ALPHA, /* U+00cfc8: */
+ RTUNI_ALPHA, /* U+00cfc9: */
+ RTUNI_ALPHA, /* U+00cfca: */
+ RTUNI_ALPHA, /* U+00cfcb: */
+ RTUNI_ALPHA, /* U+00cfcc: */
+ RTUNI_ALPHA, /* U+00cfcd: */
+ RTUNI_ALPHA, /* U+00cfce: */
+ RTUNI_ALPHA, /* U+00cfcf: */
+ RTUNI_ALPHA, /* U+00cfd0: */
+ RTUNI_ALPHA, /* U+00cfd1: */
+ RTUNI_ALPHA, /* U+00cfd2: */
+ RTUNI_ALPHA, /* U+00cfd3: */
+ RTUNI_ALPHA, /* U+00cfd4: */
+ RTUNI_ALPHA, /* U+00cfd5: */
+ RTUNI_ALPHA, /* U+00cfd6: */
+ RTUNI_ALPHA, /* U+00cfd7: */
+ RTUNI_ALPHA, /* U+00cfd8: */
+ RTUNI_ALPHA, /* U+00cfd9: */
+ RTUNI_ALPHA, /* U+00cfda: */
+ RTUNI_ALPHA, /* U+00cfdb: */
+ RTUNI_ALPHA, /* U+00cfdc: */
+ RTUNI_ALPHA, /* U+00cfdd: */
+ RTUNI_ALPHA, /* U+00cfde: */
+ RTUNI_ALPHA, /* U+00cfdf: */
+ RTUNI_ALPHA, /* U+00cfe0: */
+ RTUNI_ALPHA, /* U+00cfe1: */
+ RTUNI_ALPHA, /* U+00cfe2: */
+ RTUNI_ALPHA, /* U+00cfe3: */
+ RTUNI_ALPHA, /* U+00cfe4: */
+ RTUNI_ALPHA, /* U+00cfe5: */
+ RTUNI_ALPHA, /* U+00cfe6: */
+ RTUNI_ALPHA, /* U+00cfe7: */
+ RTUNI_ALPHA, /* U+00cfe8: */
+ RTUNI_ALPHA, /* U+00cfe9: */
+ RTUNI_ALPHA, /* U+00cfea: */
+ RTUNI_ALPHA, /* U+00cfeb: */
+ RTUNI_ALPHA, /* U+00cfec: */
+ RTUNI_ALPHA, /* U+00cfed: */
+ RTUNI_ALPHA, /* U+00cfee: */
+ RTUNI_ALPHA, /* U+00cfef: */
+ RTUNI_ALPHA, /* U+00cff0: */
+ RTUNI_ALPHA, /* U+00cff1: */
+ RTUNI_ALPHA, /* U+00cff2: */
+ RTUNI_ALPHA, /* U+00cff3: */
+ RTUNI_ALPHA, /* U+00cff4: */
+ RTUNI_ALPHA, /* U+00cff5: */
+ RTUNI_ALPHA, /* U+00cff6: */
+ RTUNI_ALPHA, /* U+00cff7: */
+ RTUNI_ALPHA, /* U+00cff8: */
+ RTUNI_ALPHA, /* U+00cff9: */
+ RTUNI_ALPHA, /* U+00cffa: */
+ RTUNI_ALPHA, /* U+00cffb: */
+ RTUNI_ALPHA, /* U+00cffc: */
+ RTUNI_ALPHA, /* U+00cffd: */
+ RTUNI_ALPHA, /* U+00cffe: */
+ RTUNI_ALPHA, /* U+00cfff: */
+ RTUNI_ALPHA, /* U+00d000: */
+ RTUNI_ALPHA, /* U+00d001: */
+ RTUNI_ALPHA, /* U+00d002: */
+ RTUNI_ALPHA, /* U+00d003: */
+ RTUNI_ALPHA, /* U+00d004: */
+ RTUNI_ALPHA, /* U+00d005: */
+ RTUNI_ALPHA, /* U+00d006: */
+ RTUNI_ALPHA, /* U+00d007: */
+ RTUNI_ALPHA, /* U+00d008: */
+ RTUNI_ALPHA, /* U+00d009: */
+ RTUNI_ALPHA, /* U+00d00a: */
+ RTUNI_ALPHA, /* U+00d00b: */
+ RTUNI_ALPHA, /* U+00d00c: */
+ RTUNI_ALPHA, /* U+00d00d: */
+ RTUNI_ALPHA, /* U+00d00e: */
+ RTUNI_ALPHA, /* U+00d00f: */
+ RTUNI_ALPHA, /* U+00d010: */
+ RTUNI_ALPHA, /* U+00d011: */
+ RTUNI_ALPHA, /* U+00d012: */
+ RTUNI_ALPHA, /* U+00d013: */
+ RTUNI_ALPHA, /* U+00d014: */
+ RTUNI_ALPHA, /* U+00d015: */
+ RTUNI_ALPHA, /* U+00d016: */
+ RTUNI_ALPHA, /* U+00d017: */
+ RTUNI_ALPHA, /* U+00d018: */
+ RTUNI_ALPHA, /* U+00d019: */
+ RTUNI_ALPHA, /* U+00d01a: */
+ RTUNI_ALPHA, /* U+00d01b: */
+ RTUNI_ALPHA, /* U+00d01c: */
+ RTUNI_ALPHA, /* U+00d01d: */
+ RTUNI_ALPHA, /* U+00d01e: */
+ RTUNI_ALPHA, /* U+00d01f: */
+ RTUNI_ALPHA, /* U+00d020: */
+ RTUNI_ALPHA, /* U+00d021: */
+ RTUNI_ALPHA, /* U+00d022: */
+ RTUNI_ALPHA, /* U+00d023: */
+ RTUNI_ALPHA, /* U+00d024: */
+ RTUNI_ALPHA, /* U+00d025: */
+ RTUNI_ALPHA, /* U+00d026: */
+ RTUNI_ALPHA, /* U+00d027: */
+ RTUNI_ALPHA, /* U+00d028: */
+ RTUNI_ALPHA, /* U+00d029: */
+ RTUNI_ALPHA, /* U+00d02a: */
+ RTUNI_ALPHA, /* U+00d02b: */
+ RTUNI_ALPHA, /* U+00d02c: */
+ RTUNI_ALPHA, /* U+00d02d: */
+ RTUNI_ALPHA, /* U+00d02e: */
+ RTUNI_ALPHA, /* U+00d02f: */
+ RTUNI_ALPHA, /* U+00d030: */
+ RTUNI_ALPHA, /* U+00d031: */
+ RTUNI_ALPHA, /* U+00d032: */
+ RTUNI_ALPHA, /* U+00d033: */
+ RTUNI_ALPHA, /* U+00d034: */
+ RTUNI_ALPHA, /* U+00d035: */
+ RTUNI_ALPHA, /* U+00d036: */
+ RTUNI_ALPHA, /* U+00d037: */
+ RTUNI_ALPHA, /* U+00d038: */
+ RTUNI_ALPHA, /* U+00d039: */
+ RTUNI_ALPHA, /* U+00d03a: */
+ RTUNI_ALPHA, /* U+00d03b: */
+ RTUNI_ALPHA, /* U+00d03c: */
+ RTUNI_ALPHA, /* U+00d03d: */
+ RTUNI_ALPHA, /* U+00d03e: */
+ RTUNI_ALPHA, /* U+00d03f: */
+ RTUNI_ALPHA, /* U+00d040: */
+ RTUNI_ALPHA, /* U+00d041: */
+ RTUNI_ALPHA, /* U+00d042: */
+ RTUNI_ALPHA, /* U+00d043: */
+ RTUNI_ALPHA, /* U+00d044: */
+ RTUNI_ALPHA, /* U+00d045: */
+ RTUNI_ALPHA, /* U+00d046: */
+ RTUNI_ALPHA, /* U+00d047: */
+ RTUNI_ALPHA, /* U+00d048: */
+ RTUNI_ALPHA, /* U+00d049: */
+ RTUNI_ALPHA, /* U+00d04a: */
+ RTUNI_ALPHA, /* U+00d04b: */
+ RTUNI_ALPHA, /* U+00d04c: */
+ RTUNI_ALPHA, /* U+00d04d: */
+ RTUNI_ALPHA, /* U+00d04e: */
+ RTUNI_ALPHA, /* U+00d04f: */
+ RTUNI_ALPHA, /* U+00d050: */
+ RTUNI_ALPHA, /* U+00d051: */
+ RTUNI_ALPHA, /* U+00d052: */
+ RTUNI_ALPHA, /* U+00d053: */
+ RTUNI_ALPHA, /* U+00d054: */
+ RTUNI_ALPHA, /* U+00d055: */
+ RTUNI_ALPHA, /* U+00d056: */
+ RTUNI_ALPHA, /* U+00d057: */
+ RTUNI_ALPHA, /* U+00d058: */
+ RTUNI_ALPHA, /* U+00d059: */
+ RTUNI_ALPHA, /* U+00d05a: */
+ RTUNI_ALPHA, /* U+00d05b: */
+ RTUNI_ALPHA, /* U+00d05c: */
+ RTUNI_ALPHA, /* U+00d05d: */
+ RTUNI_ALPHA, /* U+00d05e: */
+ RTUNI_ALPHA, /* U+00d05f: */
+ RTUNI_ALPHA, /* U+00d060: */
+ RTUNI_ALPHA, /* U+00d061: */
+ RTUNI_ALPHA, /* U+00d062: */
+ RTUNI_ALPHA, /* U+00d063: */
+ RTUNI_ALPHA, /* U+00d064: */
+ RTUNI_ALPHA, /* U+00d065: */
+ RTUNI_ALPHA, /* U+00d066: */
+ RTUNI_ALPHA, /* U+00d067: */
+ RTUNI_ALPHA, /* U+00d068: */
+ RTUNI_ALPHA, /* U+00d069: */
+ RTUNI_ALPHA, /* U+00d06a: */
+ RTUNI_ALPHA, /* U+00d06b: */
+ RTUNI_ALPHA, /* U+00d06c: */
+ RTUNI_ALPHA, /* U+00d06d: */
+ RTUNI_ALPHA, /* U+00d06e: */
+ RTUNI_ALPHA, /* U+00d06f: */
+ RTUNI_ALPHA, /* U+00d070: */
+ RTUNI_ALPHA, /* U+00d071: */
+ RTUNI_ALPHA, /* U+00d072: */
+ RTUNI_ALPHA, /* U+00d073: */
+ RTUNI_ALPHA, /* U+00d074: */
+ RTUNI_ALPHA, /* U+00d075: */
+ RTUNI_ALPHA, /* U+00d076: */
+ RTUNI_ALPHA, /* U+00d077: */
+ RTUNI_ALPHA, /* U+00d078: */
+ RTUNI_ALPHA, /* U+00d079: */
+ RTUNI_ALPHA, /* U+00d07a: */
+ RTUNI_ALPHA, /* U+00d07b: */
+ RTUNI_ALPHA, /* U+00d07c: */
+ RTUNI_ALPHA, /* U+00d07d: */
+ RTUNI_ALPHA, /* U+00d07e: */
+ RTUNI_ALPHA, /* U+00d07f: */
+ RTUNI_ALPHA, /* U+00d080: */
+ RTUNI_ALPHA, /* U+00d081: */
+ RTUNI_ALPHA, /* U+00d082: */
+ RTUNI_ALPHA, /* U+00d083: */
+ RTUNI_ALPHA, /* U+00d084: */
+ RTUNI_ALPHA, /* U+00d085: */
+ RTUNI_ALPHA, /* U+00d086: */
+ RTUNI_ALPHA, /* U+00d087: */
+ RTUNI_ALPHA, /* U+00d088: */
+ RTUNI_ALPHA, /* U+00d089: */
+ RTUNI_ALPHA, /* U+00d08a: */
+ RTUNI_ALPHA, /* U+00d08b: */
+ RTUNI_ALPHA, /* U+00d08c: */
+ RTUNI_ALPHA, /* U+00d08d: */
+ RTUNI_ALPHA, /* U+00d08e: */
+ RTUNI_ALPHA, /* U+00d08f: */
+ RTUNI_ALPHA, /* U+00d090: */
+ RTUNI_ALPHA, /* U+00d091: */
+ RTUNI_ALPHA, /* U+00d092: */
+ RTUNI_ALPHA, /* U+00d093: */
+ RTUNI_ALPHA, /* U+00d094: */
+ RTUNI_ALPHA, /* U+00d095: */
+ RTUNI_ALPHA, /* U+00d096: */
+ RTUNI_ALPHA, /* U+00d097: */
+ RTUNI_ALPHA, /* U+00d098: */
+ RTUNI_ALPHA, /* U+00d099: */
+ RTUNI_ALPHA, /* U+00d09a: */
+ RTUNI_ALPHA, /* U+00d09b: */
+ RTUNI_ALPHA, /* U+00d09c: */
+ RTUNI_ALPHA, /* U+00d09d: */
+ RTUNI_ALPHA, /* U+00d09e: */
+ RTUNI_ALPHA, /* U+00d09f: */
+ RTUNI_ALPHA, /* U+00d0a0: */
+ RTUNI_ALPHA, /* U+00d0a1: */
+ RTUNI_ALPHA, /* U+00d0a2: */
+ RTUNI_ALPHA, /* U+00d0a3: */
+ RTUNI_ALPHA, /* U+00d0a4: */
+ RTUNI_ALPHA, /* U+00d0a5: */
+ RTUNI_ALPHA, /* U+00d0a6: */
+ RTUNI_ALPHA, /* U+00d0a7: */
+ RTUNI_ALPHA, /* U+00d0a8: */
+ RTUNI_ALPHA, /* U+00d0a9: */
+ RTUNI_ALPHA, /* U+00d0aa: */
+ RTUNI_ALPHA, /* U+00d0ab: */
+ RTUNI_ALPHA, /* U+00d0ac: */
+ RTUNI_ALPHA, /* U+00d0ad: */
+ RTUNI_ALPHA, /* U+00d0ae: */
+ RTUNI_ALPHA, /* U+00d0af: */
+ RTUNI_ALPHA, /* U+00d0b0: */
+ RTUNI_ALPHA, /* U+00d0b1: */
+ RTUNI_ALPHA, /* U+00d0b2: */
+ RTUNI_ALPHA, /* U+00d0b3: */
+ RTUNI_ALPHA, /* U+00d0b4: */
+ RTUNI_ALPHA, /* U+00d0b5: */
+ RTUNI_ALPHA, /* U+00d0b6: */
+ RTUNI_ALPHA, /* U+00d0b7: */
+ RTUNI_ALPHA, /* U+00d0b8: */
+ RTUNI_ALPHA, /* U+00d0b9: */
+ RTUNI_ALPHA, /* U+00d0ba: */
+ RTUNI_ALPHA, /* U+00d0bb: */
+ RTUNI_ALPHA, /* U+00d0bc: */
+ RTUNI_ALPHA, /* U+00d0bd: */
+ RTUNI_ALPHA, /* U+00d0be: */
+ RTUNI_ALPHA, /* U+00d0bf: */
+ RTUNI_ALPHA, /* U+00d0c0: */
+ RTUNI_ALPHA, /* U+00d0c1: */
+ RTUNI_ALPHA, /* U+00d0c2: */
+ RTUNI_ALPHA, /* U+00d0c3: */
+ RTUNI_ALPHA, /* U+00d0c4: */
+ RTUNI_ALPHA, /* U+00d0c5: */
+ RTUNI_ALPHA, /* U+00d0c6: */
+ RTUNI_ALPHA, /* U+00d0c7: */
+ RTUNI_ALPHA, /* U+00d0c8: */
+ RTUNI_ALPHA, /* U+00d0c9: */
+ RTUNI_ALPHA, /* U+00d0ca: */
+ RTUNI_ALPHA, /* U+00d0cb: */
+ RTUNI_ALPHA, /* U+00d0cc: */
+ RTUNI_ALPHA, /* U+00d0cd: */
+ RTUNI_ALPHA, /* U+00d0ce: */
+ RTUNI_ALPHA, /* U+00d0cf: */
+ RTUNI_ALPHA, /* U+00d0d0: */
+ RTUNI_ALPHA, /* U+00d0d1: */
+ RTUNI_ALPHA, /* U+00d0d2: */
+ RTUNI_ALPHA, /* U+00d0d3: */
+ RTUNI_ALPHA, /* U+00d0d4: */
+ RTUNI_ALPHA, /* U+00d0d5: */
+ RTUNI_ALPHA, /* U+00d0d6: */
+ RTUNI_ALPHA, /* U+00d0d7: */
+ RTUNI_ALPHA, /* U+00d0d8: */
+ RTUNI_ALPHA, /* U+00d0d9: */
+ RTUNI_ALPHA, /* U+00d0da: */
+ RTUNI_ALPHA, /* U+00d0db: */
+ RTUNI_ALPHA, /* U+00d0dc: */
+ RTUNI_ALPHA, /* U+00d0dd: */
+ RTUNI_ALPHA, /* U+00d0de: */
+ RTUNI_ALPHA, /* U+00d0df: */
+ RTUNI_ALPHA, /* U+00d0e0: */
+ RTUNI_ALPHA, /* U+00d0e1: */
+ RTUNI_ALPHA, /* U+00d0e2: */
+ RTUNI_ALPHA, /* U+00d0e3: */
+ RTUNI_ALPHA, /* U+00d0e4: */
+ RTUNI_ALPHA, /* U+00d0e5: */
+ RTUNI_ALPHA, /* U+00d0e6: */
+ RTUNI_ALPHA, /* U+00d0e7: */
+ RTUNI_ALPHA, /* U+00d0e8: */
+ RTUNI_ALPHA, /* U+00d0e9: */
+ RTUNI_ALPHA, /* U+00d0ea: */
+ RTUNI_ALPHA, /* U+00d0eb: */
+ RTUNI_ALPHA, /* U+00d0ec: */
+ RTUNI_ALPHA, /* U+00d0ed: */
+ RTUNI_ALPHA, /* U+00d0ee: */
+ RTUNI_ALPHA, /* U+00d0ef: */
+ RTUNI_ALPHA, /* U+00d0f0: */
+ RTUNI_ALPHA, /* U+00d0f1: */
+ RTUNI_ALPHA, /* U+00d0f2: */
+ RTUNI_ALPHA, /* U+00d0f3: */
+ RTUNI_ALPHA, /* U+00d0f4: */
+ RTUNI_ALPHA, /* U+00d0f5: */
+ RTUNI_ALPHA, /* U+00d0f6: */
+ RTUNI_ALPHA, /* U+00d0f7: */
+ RTUNI_ALPHA, /* U+00d0f8: */
+ RTUNI_ALPHA, /* U+00d0f9: */
+ RTUNI_ALPHA, /* U+00d0fa: */
+ RTUNI_ALPHA, /* U+00d0fb: */
+ RTUNI_ALPHA, /* U+00d0fc: */
+ RTUNI_ALPHA, /* U+00d0fd: */
+ RTUNI_ALPHA, /* U+00d0fe: */
+ RTUNI_ALPHA, /* U+00d0ff: */
+ RTUNI_ALPHA, /* U+00d100: */
+ RTUNI_ALPHA, /* U+00d101: */
+ RTUNI_ALPHA, /* U+00d102: */
+ RTUNI_ALPHA, /* U+00d103: */
+ RTUNI_ALPHA, /* U+00d104: */
+ RTUNI_ALPHA, /* U+00d105: */
+ RTUNI_ALPHA, /* U+00d106: */
+ RTUNI_ALPHA, /* U+00d107: */
+ RTUNI_ALPHA, /* U+00d108: */
+ RTUNI_ALPHA, /* U+00d109: */
+ RTUNI_ALPHA, /* U+00d10a: */
+ RTUNI_ALPHA, /* U+00d10b: */
+ RTUNI_ALPHA, /* U+00d10c: */
+ RTUNI_ALPHA, /* U+00d10d: */
+ RTUNI_ALPHA, /* U+00d10e: */
+ RTUNI_ALPHA, /* U+00d10f: */
+ RTUNI_ALPHA, /* U+00d110: */
+ RTUNI_ALPHA, /* U+00d111: */
+ RTUNI_ALPHA, /* U+00d112: */
+ RTUNI_ALPHA, /* U+00d113: */
+ RTUNI_ALPHA, /* U+00d114: */
+ RTUNI_ALPHA, /* U+00d115: */
+ RTUNI_ALPHA, /* U+00d116: */
+ RTUNI_ALPHA, /* U+00d117: */
+ RTUNI_ALPHA, /* U+00d118: */
+ RTUNI_ALPHA, /* U+00d119: */
+ RTUNI_ALPHA, /* U+00d11a: */
+ RTUNI_ALPHA, /* U+00d11b: */
+ RTUNI_ALPHA, /* U+00d11c: */
+ RTUNI_ALPHA, /* U+00d11d: */
+ RTUNI_ALPHA, /* U+00d11e: */
+ RTUNI_ALPHA, /* U+00d11f: */
+ RTUNI_ALPHA, /* U+00d120: */
+ RTUNI_ALPHA, /* U+00d121: */
+ RTUNI_ALPHA, /* U+00d122: */
+ RTUNI_ALPHA, /* U+00d123: */
+ RTUNI_ALPHA, /* U+00d124: */
+ RTUNI_ALPHA, /* U+00d125: */
+ RTUNI_ALPHA, /* U+00d126: */
+ RTUNI_ALPHA, /* U+00d127: */
+ RTUNI_ALPHA, /* U+00d128: */
+ RTUNI_ALPHA, /* U+00d129: */
+ RTUNI_ALPHA, /* U+00d12a: */
+ RTUNI_ALPHA, /* U+00d12b: */
+ RTUNI_ALPHA, /* U+00d12c: */
+ RTUNI_ALPHA, /* U+00d12d: */
+ RTUNI_ALPHA, /* U+00d12e: */
+ RTUNI_ALPHA, /* U+00d12f: */
+ RTUNI_ALPHA, /* U+00d130: */
+ RTUNI_ALPHA, /* U+00d131: */
+ RTUNI_ALPHA, /* U+00d132: */
+ RTUNI_ALPHA, /* U+00d133: */
+ RTUNI_ALPHA, /* U+00d134: */
+ RTUNI_ALPHA, /* U+00d135: */
+ RTUNI_ALPHA, /* U+00d136: */
+ RTUNI_ALPHA, /* U+00d137: */
+ RTUNI_ALPHA, /* U+00d138: */
+ RTUNI_ALPHA, /* U+00d139: */
+ RTUNI_ALPHA, /* U+00d13a: */
+ RTUNI_ALPHA, /* U+00d13b: */
+ RTUNI_ALPHA, /* U+00d13c: */
+ RTUNI_ALPHA, /* U+00d13d: */
+ RTUNI_ALPHA, /* U+00d13e: */
+ RTUNI_ALPHA, /* U+00d13f: */
+ RTUNI_ALPHA, /* U+00d140: */
+ RTUNI_ALPHA, /* U+00d141: */
+ RTUNI_ALPHA, /* U+00d142: */
+ RTUNI_ALPHA, /* U+00d143: */
+ RTUNI_ALPHA, /* U+00d144: */
+ RTUNI_ALPHA, /* U+00d145: */
+ RTUNI_ALPHA, /* U+00d146: */
+ RTUNI_ALPHA, /* U+00d147: */
+ RTUNI_ALPHA, /* U+00d148: */
+ RTUNI_ALPHA, /* U+00d149: */
+ RTUNI_ALPHA, /* U+00d14a: */
+ RTUNI_ALPHA, /* U+00d14b: */
+ RTUNI_ALPHA, /* U+00d14c: */
+ RTUNI_ALPHA, /* U+00d14d: */
+ RTUNI_ALPHA, /* U+00d14e: */
+ RTUNI_ALPHA, /* U+00d14f: */
+ RTUNI_ALPHA, /* U+00d150: */
+ RTUNI_ALPHA, /* U+00d151: */
+ RTUNI_ALPHA, /* U+00d152: */
+ RTUNI_ALPHA, /* U+00d153: */
+ RTUNI_ALPHA, /* U+00d154: */
+ RTUNI_ALPHA, /* U+00d155: */
+ RTUNI_ALPHA, /* U+00d156: */
+ RTUNI_ALPHA, /* U+00d157: */
+ RTUNI_ALPHA, /* U+00d158: */
+ RTUNI_ALPHA, /* U+00d159: */
+ RTUNI_ALPHA, /* U+00d15a: */
+ RTUNI_ALPHA, /* U+00d15b: */
+ RTUNI_ALPHA, /* U+00d15c: */
+ RTUNI_ALPHA, /* U+00d15d: */
+ RTUNI_ALPHA, /* U+00d15e: */
+ RTUNI_ALPHA, /* U+00d15f: */
+ RTUNI_ALPHA, /* U+00d160: */
+ RTUNI_ALPHA, /* U+00d161: */
+ RTUNI_ALPHA, /* U+00d162: */
+ RTUNI_ALPHA, /* U+00d163: */
+ RTUNI_ALPHA, /* U+00d164: */
+ RTUNI_ALPHA, /* U+00d165: */
+ RTUNI_ALPHA, /* U+00d166: */
+ RTUNI_ALPHA, /* U+00d167: */
+ RTUNI_ALPHA, /* U+00d168: */
+ RTUNI_ALPHA, /* U+00d169: */
+ RTUNI_ALPHA, /* U+00d16a: */
+ RTUNI_ALPHA, /* U+00d16b: */
+ RTUNI_ALPHA, /* U+00d16c: */
+ RTUNI_ALPHA, /* U+00d16d: */
+ RTUNI_ALPHA, /* U+00d16e: */
+ RTUNI_ALPHA, /* U+00d16f: */
+ RTUNI_ALPHA, /* U+00d170: */
+ RTUNI_ALPHA, /* U+00d171: */
+ RTUNI_ALPHA, /* U+00d172: */
+ RTUNI_ALPHA, /* U+00d173: */
+ RTUNI_ALPHA, /* U+00d174: */
+ RTUNI_ALPHA, /* U+00d175: */
+ RTUNI_ALPHA, /* U+00d176: */
+ RTUNI_ALPHA, /* U+00d177: */
+ RTUNI_ALPHA, /* U+00d178: */
+ RTUNI_ALPHA, /* U+00d179: */
+ RTUNI_ALPHA, /* U+00d17a: */
+ RTUNI_ALPHA, /* U+00d17b: */
+ RTUNI_ALPHA, /* U+00d17c: */
+ RTUNI_ALPHA, /* U+00d17d: */
+ RTUNI_ALPHA, /* U+00d17e: */
+ RTUNI_ALPHA, /* U+00d17f: */
+ RTUNI_ALPHA, /* U+00d180: */
+ RTUNI_ALPHA, /* U+00d181: */
+ RTUNI_ALPHA, /* U+00d182: */
+ RTUNI_ALPHA, /* U+00d183: */
+ RTUNI_ALPHA, /* U+00d184: */
+ RTUNI_ALPHA, /* U+00d185: */
+ RTUNI_ALPHA, /* U+00d186: */
+ RTUNI_ALPHA, /* U+00d187: */
+ RTUNI_ALPHA, /* U+00d188: */
+ RTUNI_ALPHA, /* U+00d189: */
+ RTUNI_ALPHA, /* U+00d18a: */
+ RTUNI_ALPHA, /* U+00d18b: */
+ RTUNI_ALPHA, /* U+00d18c: */
+ RTUNI_ALPHA, /* U+00d18d: */
+ RTUNI_ALPHA, /* U+00d18e: */
+ RTUNI_ALPHA, /* U+00d18f: */
+ RTUNI_ALPHA, /* U+00d190: */
+ RTUNI_ALPHA, /* U+00d191: */
+ RTUNI_ALPHA, /* U+00d192: */
+ RTUNI_ALPHA, /* U+00d193: */
+ RTUNI_ALPHA, /* U+00d194: */
+ RTUNI_ALPHA, /* U+00d195: */
+ RTUNI_ALPHA, /* U+00d196: */
+ RTUNI_ALPHA, /* U+00d197: */
+ RTUNI_ALPHA, /* U+00d198: */
+ RTUNI_ALPHA, /* U+00d199: */
+ RTUNI_ALPHA, /* U+00d19a: */
+ RTUNI_ALPHA, /* U+00d19b: */
+ RTUNI_ALPHA, /* U+00d19c: */
+ RTUNI_ALPHA, /* U+00d19d: */
+ RTUNI_ALPHA, /* U+00d19e: */
+ RTUNI_ALPHA, /* U+00d19f: */
+ RTUNI_ALPHA, /* U+00d1a0: */
+ RTUNI_ALPHA, /* U+00d1a1: */
+ RTUNI_ALPHA, /* U+00d1a2: */
+ RTUNI_ALPHA, /* U+00d1a3: */
+ RTUNI_ALPHA, /* U+00d1a4: */
+ RTUNI_ALPHA, /* U+00d1a5: */
+ RTUNI_ALPHA, /* U+00d1a6: */
+ RTUNI_ALPHA, /* U+00d1a7: */
+ RTUNI_ALPHA, /* U+00d1a8: */
+ RTUNI_ALPHA, /* U+00d1a9: */
+ RTUNI_ALPHA, /* U+00d1aa: */
+ RTUNI_ALPHA, /* U+00d1ab: */
+ RTUNI_ALPHA, /* U+00d1ac: */
+ RTUNI_ALPHA, /* U+00d1ad: */
+ RTUNI_ALPHA, /* U+00d1ae: */
+ RTUNI_ALPHA, /* U+00d1af: */
+ RTUNI_ALPHA, /* U+00d1b0: */
+ RTUNI_ALPHA, /* U+00d1b1: */
+ RTUNI_ALPHA, /* U+00d1b2: */
+ RTUNI_ALPHA, /* U+00d1b3: */
+ RTUNI_ALPHA, /* U+00d1b4: */
+ RTUNI_ALPHA, /* U+00d1b5: */
+ RTUNI_ALPHA, /* U+00d1b6: */
+ RTUNI_ALPHA, /* U+00d1b7: */
+ RTUNI_ALPHA, /* U+00d1b8: */
+ RTUNI_ALPHA, /* U+00d1b9: */
+ RTUNI_ALPHA, /* U+00d1ba: */
+ RTUNI_ALPHA, /* U+00d1bb: */
+ RTUNI_ALPHA, /* U+00d1bc: */
+ RTUNI_ALPHA, /* U+00d1bd: */
+ RTUNI_ALPHA, /* U+00d1be: */
+ RTUNI_ALPHA, /* U+00d1bf: */
+ RTUNI_ALPHA, /* U+00d1c0: */
+ RTUNI_ALPHA, /* U+00d1c1: */
+ RTUNI_ALPHA, /* U+00d1c2: */
+ RTUNI_ALPHA, /* U+00d1c3: */
+ RTUNI_ALPHA, /* U+00d1c4: */
+ RTUNI_ALPHA, /* U+00d1c5: */
+ RTUNI_ALPHA, /* U+00d1c6: */
+ RTUNI_ALPHA, /* U+00d1c7: */
+ RTUNI_ALPHA, /* U+00d1c8: */
+ RTUNI_ALPHA, /* U+00d1c9: */
+ RTUNI_ALPHA, /* U+00d1ca: */
+ RTUNI_ALPHA, /* U+00d1cb: */
+ RTUNI_ALPHA, /* U+00d1cc: */
+ RTUNI_ALPHA, /* U+00d1cd: */
+ RTUNI_ALPHA, /* U+00d1ce: */
+ RTUNI_ALPHA, /* U+00d1cf: */
+ RTUNI_ALPHA, /* U+00d1d0: */
+ RTUNI_ALPHA, /* U+00d1d1: */
+ RTUNI_ALPHA, /* U+00d1d2: */
+ RTUNI_ALPHA, /* U+00d1d3: */
+ RTUNI_ALPHA, /* U+00d1d4: */
+ RTUNI_ALPHA, /* U+00d1d5: */
+ RTUNI_ALPHA, /* U+00d1d6: */
+ RTUNI_ALPHA, /* U+00d1d7: */
+ RTUNI_ALPHA, /* U+00d1d8: */
+ RTUNI_ALPHA, /* U+00d1d9: */
+ RTUNI_ALPHA, /* U+00d1da: */
+ RTUNI_ALPHA, /* U+00d1db: */
+ RTUNI_ALPHA, /* U+00d1dc: */
+ RTUNI_ALPHA, /* U+00d1dd: */
+ RTUNI_ALPHA, /* U+00d1de: */
+ RTUNI_ALPHA, /* U+00d1df: */
+ RTUNI_ALPHA, /* U+00d1e0: */
+ RTUNI_ALPHA, /* U+00d1e1: */
+ RTUNI_ALPHA, /* U+00d1e2: */
+ RTUNI_ALPHA, /* U+00d1e3: */
+ RTUNI_ALPHA, /* U+00d1e4: */
+ RTUNI_ALPHA, /* U+00d1e5: */
+ RTUNI_ALPHA, /* U+00d1e6: */
+ RTUNI_ALPHA, /* U+00d1e7: */
+ RTUNI_ALPHA, /* U+00d1e8: */
+ RTUNI_ALPHA, /* U+00d1e9: */
+ RTUNI_ALPHA, /* U+00d1ea: */
+ RTUNI_ALPHA, /* U+00d1eb: */
+ RTUNI_ALPHA, /* U+00d1ec: */
+ RTUNI_ALPHA, /* U+00d1ed: */
+ RTUNI_ALPHA, /* U+00d1ee: */
+ RTUNI_ALPHA, /* U+00d1ef: */
+ RTUNI_ALPHA, /* U+00d1f0: */
+ RTUNI_ALPHA, /* U+00d1f1: */
+ RTUNI_ALPHA, /* U+00d1f2: */
+ RTUNI_ALPHA, /* U+00d1f3: */
+ RTUNI_ALPHA, /* U+00d1f4: */
+ RTUNI_ALPHA, /* U+00d1f5: */
+ RTUNI_ALPHA, /* U+00d1f6: */
+ RTUNI_ALPHA, /* U+00d1f7: */
+ RTUNI_ALPHA, /* U+00d1f8: */
+ RTUNI_ALPHA, /* U+00d1f9: */
+ RTUNI_ALPHA, /* U+00d1fa: */
+ RTUNI_ALPHA, /* U+00d1fb: */
+ RTUNI_ALPHA, /* U+00d1fc: */
+ RTUNI_ALPHA, /* U+00d1fd: */
+ RTUNI_ALPHA, /* U+00d1fe: */
+ RTUNI_ALPHA, /* U+00d1ff: */
+ RTUNI_ALPHA, /* U+00d200: */
+ RTUNI_ALPHA, /* U+00d201: */
+ RTUNI_ALPHA, /* U+00d202: */
+ RTUNI_ALPHA, /* U+00d203: */
+ RTUNI_ALPHA, /* U+00d204: */
+ RTUNI_ALPHA, /* U+00d205: */
+ RTUNI_ALPHA, /* U+00d206: */
+ RTUNI_ALPHA, /* U+00d207: */
+ RTUNI_ALPHA, /* U+00d208: */
+ RTUNI_ALPHA, /* U+00d209: */
+ RTUNI_ALPHA, /* U+00d20a: */
+ RTUNI_ALPHA, /* U+00d20b: */
+ RTUNI_ALPHA, /* U+00d20c: */
+ RTUNI_ALPHA, /* U+00d20d: */
+ RTUNI_ALPHA, /* U+00d20e: */
+ RTUNI_ALPHA, /* U+00d20f: */
+ RTUNI_ALPHA, /* U+00d210: */
+ RTUNI_ALPHA, /* U+00d211: */
+ RTUNI_ALPHA, /* U+00d212: */
+ RTUNI_ALPHA, /* U+00d213: */
+ RTUNI_ALPHA, /* U+00d214: */
+ RTUNI_ALPHA, /* U+00d215: */
+ RTUNI_ALPHA, /* U+00d216: */
+ RTUNI_ALPHA, /* U+00d217: */
+ RTUNI_ALPHA, /* U+00d218: */
+ RTUNI_ALPHA, /* U+00d219: */
+ RTUNI_ALPHA, /* U+00d21a: */
+ RTUNI_ALPHA, /* U+00d21b: */
+ RTUNI_ALPHA, /* U+00d21c: */
+ RTUNI_ALPHA, /* U+00d21d: */
+ RTUNI_ALPHA, /* U+00d21e: */
+ RTUNI_ALPHA, /* U+00d21f: */
+ RTUNI_ALPHA, /* U+00d220: */
+ RTUNI_ALPHA, /* U+00d221: */
+ RTUNI_ALPHA, /* U+00d222: */
+ RTUNI_ALPHA, /* U+00d223: */
+ RTUNI_ALPHA, /* U+00d224: */
+ RTUNI_ALPHA, /* U+00d225: */
+ RTUNI_ALPHA, /* U+00d226: */
+ RTUNI_ALPHA, /* U+00d227: */
+ RTUNI_ALPHA, /* U+00d228: */
+ RTUNI_ALPHA, /* U+00d229: */
+ RTUNI_ALPHA, /* U+00d22a: */
+ RTUNI_ALPHA, /* U+00d22b: */
+ RTUNI_ALPHA, /* U+00d22c: */
+ RTUNI_ALPHA, /* U+00d22d: */
+ RTUNI_ALPHA, /* U+00d22e: */
+ RTUNI_ALPHA, /* U+00d22f: */
+ RTUNI_ALPHA, /* U+00d230: */
+ RTUNI_ALPHA, /* U+00d231: */
+ RTUNI_ALPHA, /* U+00d232: */
+ RTUNI_ALPHA, /* U+00d233: */
+ RTUNI_ALPHA, /* U+00d234: */
+ RTUNI_ALPHA, /* U+00d235: */
+ RTUNI_ALPHA, /* U+00d236: */
+ RTUNI_ALPHA, /* U+00d237: */
+ RTUNI_ALPHA, /* U+00d238: */
+ RTUNI_ALPHA, /* U+00d239: */
+ RTUNI_ALPHA, /* U+00d23a: */
+ RTUNI_ALPHA, /* U+00d23b: */
+ RTUNI_ALPHA, /* U+00d23c: */
+ RTUNI_ALPHA, /* U+00d23d: */
+ RTUNI_ALPHA, /* U+00d23e: */
+ RTUNI_ALPHA, /* U+00d23f: */
+ RTUNI_ALPHA, /* U+00d240: */
+ RTUNI_ALPHA, /* U+00d241: */
+ RTUNI_ALPHA, /* U+00d242: */
+ RTUNI_ALPHA, /* U+00d243: */
+ RTUNI_ALPHA, /* U+00d244: */
+ RTUNI_ALPHA, /* U+00d245: */
+ RTUNI_ALPHA, /* U+00d246: */
+ RTUNI_ALPHA, /* U+00d247: */
+ RTUNI_ALPHA, /* U+00d248: */
+ RTUNI_ALPHA, /* U+00d249: */
+ RTUNI_ALPHA, /* U+00d24a: */
+ RTUNI_ALPHA, /* U+00d24b: */
+ RTUNI_ALPHA, /* U+00d24c: */
+ RTUNI_ALPHA, /* U+00d24d: */
+ RTUNI_ALPHA, /* U+00d24e: */
+ RTUNI_ALPHA, /* U+00d24f: */
+ RTUNI_ALPHA, /* U+00d250: */
+ RTUNI_ALPHA, /* U+00d251: */
+ RTUNI_ALPHA, /* U+00d252: */
+ RTUNI_ALPHA, /* U+00d253: */
+ RTUNI_ALPHA, /* U+00d254: */
+ RTUNI_ALPHA, /* U+00d255: */
+ RTUNI_ALPHA, /* U+00d256: */
+ RTUNI_ALPHA, /* U+00d257: */
+ RTUNI_ALPHA, /* U+00d258: */
+ RTUNI_ALPHA, /* U+00d259: */
+ RTUNI_ALPHA, /* U+00d25a: */
+ RTUNI_ALPHA, /* U+00d25b: */
+ RTUNI_ALPHA, /* U+00d25c: */
+ RTUNI_ALPHA, /* U+00d25d: */
+ RTUNI_ALPHA, /* U+00d25e: */
+ RTUNI_ALPHA, /* U+00d25f: */
+ RTUNI_ALPHA, /* U+00d260: */
+ RTUNI_ALPHA, /* U+00d261: */
+ RTUNI_ALPHA, /* U+00d262: */
+ RTUNI_ALPHA, /* U+00d263: */
+ RTUNI_ALPHA, /* U+00d264: */
+ RTUNI_ALPHA, /* U+00d265: */
+ RTUNI_ALPHA, /* U+00d266: */
+ RTUNI_ALPHA, /* U+00d267: */
+ RTUNI_ALPHA, /* U+00d268: */
+ RTUNI_ALPHA, /* U+00d269: */
+ RTUNI_ALPHA, /* U+00d26a: */
+ RTUNI_ALPHA, /* U+00d26b: */
+ RTUNI_ALPHA, /* U+00d26c: */
+ RTUNI_ALPHA, /* U+00d26d: */
+ RTUNI_ALPHA, /* U+00d26e: */
+ RTUNI_ALPHA, /* U+00d26f: */
+ RTUNI_ALPHA, /* U+00d270: */
+ RTUNI_ALPHA, /* U+00d271: */
+ RTUNI_ALPHA, /* U+00d272: */
+ RTUNI_ALPHA, /* U+00d273: */
+ RTUNI_ALPHA, /* U+00d274: */
+ RTUNI_ALPHA, /* U+00d275: */
+ RTUNI_ALPHA, /* U+00d276: */
+ RTUNI_ALPHA, /* U+00d277: */
+ RTUNI_ALPHA, /* U+00d278: */
+ RTUNI_ALPHA, /* U+00d279: */
+ RTUNI_ALPHA, /* U+00d27a: */
+ RTUNI_ALPHA, /* U+00d27b: */
+ RTUNI_ALPHA, /* U+00d27c: */
+ RTUNI_ALPHA, /* U+00d27d: */
+ RTUNI_ALPHA, /* U+00d27e: */
+ RTUNI_ALPHA, /* U+00d27f: */
+ RTUNI_ALPHA, /* U+00d280: */
+ RTUNI_ALPHA, /* U+00d281: */
+ RTUNI_ALPHA, /* U+00d282: */
+ RTUNI_ALPHA, /* U+00d283: */
+ RTUNI_ALPHA, /* U+00d284: */
+ RTUNI_ALPHA, /* U+00d285: */
+ RTUNI_ALPHA, /* U+00d286: */
+ RTUNI_ALPHA, /* U+00d287: */
+ RTUNI_ALPHA, /* U+00d288: */
+ RTUNI_ALPHA, /* U+00d289: */
+ RTUNI_ALPHA, /* U+00d28a: */
+ RTUNI_ALPHA, /* U+00d28b: */
+ RTUNI_ALPHA, /* U+00d28c: */
+ RTUNI_ALPHA, /* U+00d28d: */
+ RTUNI_ALPHA, /* U+00d28e: */
+ RTUNI_ALPHA, /* U+00d28f: */
+ RTUNI_ALPHA, /* U+00d290: */
+ RTUNI_ALPHA, /* U+00d291: */
+ RTUNI_ALPHA, /* U+00d292: */
+ RTUNI_ALPHA, /* U+00d293: */
+ RTUNI_ALPHA, /* U+00d294: */
+ RTUNI_ALPHA, /* U+00d295: */
+ RTUNI_ALPHA, /* U+00d296: */
+ RTUNI_ALPHA, /* U+00d297: */
+ RTUNI_ALPHA, /* U+00d298: */
+ RTUNI_ALPHA, /* U+00d299: */
+ RTUNI_ALPHA, /* U+00d29a: */
+ RTUNI_ALPHA, /* U+00d29b: */
+ RTUNI_ALPHA, /* U+00d29c: */
+ RTUNI_ALPHA, /* U+00d29d: */
+ RTUNI_ALPHA, /* U+00d29e: */
+ RTUNI_ALPHA, /* U+00d29f: */
+ RTUNI_ALPHA, /* U+00d2a0: */
+ RTUNI_ALPHA, /* U+00d2a1: */
+ RTUNI_ALPHA, /* U+00d2a2: */
+ RTUNI_ALPHA, /* U+00d2a3: */
+ RTUNI_ALPHA, /* U+00d2a4: */
+ RTUNI_ALPHA, /* U+00d2a5: */
+ RTUNI_ALPHA, /* U+00d2a6: */
+ RTUNI_ALPHA, /* U+00d2a7: */
+ RTUNI_ALPHA, /* U+00d2a8: */
+ RTUNI_ALPHA, /* U+00d2a9: */
+ RTUNI_ALPHA, /* U+00d2aa: */
+ RTUNI_ALPHA, /* U+00d2ab: */
+ RTUNI_ALPHA, /* U+00d2ac: */
+ RTUNI_ALPHA, /* U+00d2ad: */
+ RTUNI_ALPHA, /* U+00d2ae: */
+ RTUNI_ALPHA, /* U+00d2af: */
+ RTUNI_ALPHA, /* U+00d2b0: */
+ RTUNI_ALPHA, /* U+00d2b1: */
+ RTUNI_ALPHA, /* U+00d2b2: */
+ RTUNI_ALPHA, /* U+00d2b3: */
+ RTUNI_ALPHA, /* U+00d2b4: */
+ RTUNI_ALPHA, /* U+00d2b5: */
+ RTUNI_ALPHA, /* U+00d2b6: */
+ RTUNI_ALPHA, /* U+00d2b7: */
+ RTUNI_ALPHA, /* U+00d2b8: */
+ RTUNI_ALPHA, /* U+00d2b9: */
+ RTUNI_ALPHA, /* U+00d2ba: */
+ RTUNI_ALPHA, /* U+00d2bb: */
+ RTUNI_ALPHA, /* U+00d2bc: */
+ RTUNI_ALPHA, /* U+00d2bd: */
+ RTUNI_ALPHA, /* U+00d2be: */
+ RTUNI_ALPHA, /* U+00d2bf: */
+ RTUNI_ALPHA, /* U+00d2c0: */
+ RTUNI_ALPHA, /* U+00d2c1: */
+ RTUNI_ALPHA, /* U+00d2c2: */
+ RTUNI_ALPHA, /* U+00d2c3: */
+ RTUNI_ALPHA, /* U+00d2c4: */
+ RTUNI_ALPHA, /* U+00d2c5: */
+ RTUNI_ALPHA, /* U+00d2c6: */
+ RTUNI_ALPHA, /* U+00d2c7: */
+ RTUNI_ALPHA, /* U+00d2c8: */
+ RTUNI_ALPHA, /* U+00d2c9: */
+ RTUNI_ALPHA, /* U+00d2ca: */
+ RTUNI_ALPHA, /* U+00d2cb: */
+ RTUNI_ALPHA, /* U+00d2cc: */
+ RTUNI_ALPHA, /* U+00d2cd: */
+ RTUNI_ALPHA, /* U+00d2ce: */
+ RTUNI_ALPHA, /* U+00d2cf: */
+ RTUNI_ALPHA, /* U+00d2d0: */
+ RTUNI_ALPHA, /* U+00d2d1: */
+ RTUNI_ALPHA, /* U+00d2d2: */
+ RTUNI_ALPHA, /* U+00d2d3: */
+ RTUNI_ALPHA, /* U+00d2d4: */
+ RTUNI_ALPHA, /* U+00d2d5: */
+ RTUNI_ALPHA, /* U+00d2d6: */
+ RTUNI_ALPHA, /* U+00d2d7: */
+ RTUNI_ALPHA, /* U+00d2d8: */
+ RTUNI_ALPHA, /* U+00d2d9: */
+ RTUNI_ALPHA, /* U+00d2da: */
+ RTUNI_ALPHA, /* U+00d2db: */
+ RTUNI_ALPHA, /* U+00d2dc: */
+ RTUNI_ALPHA, /* U+00d2dd: */
+ RTUNI_ALPHA, /* U+00d2de: */
+ RTUNI_ALPHA, /* U+00d2df: */
+ RTUNI_ALPHA, /* U+00d2e0: */
+ RTUNI_ALPHA, /* U+00d2e1: */
+ RTUNI_ALPHA, /* U+00d2e2: */
+ RTUNI_ALPHA, /* U+00d2e3: */
+ RTUNI_ALPHA, /* U+00d2e4: */
+ RTUNI_ALPHA, /* U+00d2e5: */
+ RTUNI_ALPHA, /* U+00d2e6: */
+ RTUNI_ALPHA, /* U+00d2e7: */
+ RTUNI_ALPHA, /* U+00d2e8: */
+ RTUNI_ALPHA, /* U+00d2e9: */
+ RTUNI_ALPHA, /* U+00d2ea: */
+ RTUNI_ALPHA, /* U+00d2eb: */
+ RTUNI_ALPHA, /* U+00d2ec: */
+ RTUNI_ALPHA, /* U+00d2ed: */
+ RTUNI_ALPHA, /* U+00d2ee: */
+ RTUNI_ALPHA, /* U+00d2ef: */
+ RTUNI_ALPHA, /* U+00d2f0: */
+ RTUNI_ALPHA, /* U+00d2f1: */
+ RTUNI_ALPHA, /* U+00d2f2: */
+ RTUNI_ALPHA, /* U+00d2f3: */
+ RTUNI_ALPHA, /* U+00d2f4: */
+ RTUNI_ALPHA, /* U+00d2f5: */
+ RTUNI_ALPHA, /* U+00d2f6: */
+ RTUNI_ALPHA, /* U+00d2f7: */
+ RTUNI_ALPHA, /* U+00d2f8: */
+ RTUNI_ALPHA, /* U+00d2f9: */
+ RTUNI_ALPHA, /* U+00d2fa: */
+ RTUNI_ALPHA, /* U+00d2fb: */
+ RTUNI_ALPHA, /* U+00d2fc: */
+ RTUNI_ALPHA, /* U+00d2fd: */
+ RTUNI_ALPHA, /* U+00d2fe: */
+ RTUNI_ALPHA, /* U+00d2ff: */
+ RTUNI_ALPHA, /* U+00d300: */
+ RTUNI_ALPHA, /* U+00d301: */
+ RTUNI_ALPHA, /* U+00d302: */
+ RTUNI_ALPHA, /* U+00d303: */
+ RTUNI_ALPHA, /* U+00d304: */
+ RTUNI_ALPHA, /* U+00d305: */
+ RTUNI_ALPHA, /* U+00d306: */
+ RTUNI_ALPHA, /* U+00d307: */
+ RTUNI_ALPHA, /* U+00d308: */
+ RTUNI_ALPHA, /* U+00d309: */
+ RTUNI_ALPHA, /* U+00d30a: */
+ RTUNI_ALPHA, /* U+00d30b: */
+ RTUNI_ALPHA, /* U+00d30c: */
+ RTUNI_ALPHA, /* U+00d30d: */
+ RTUNI_ALPHA, /* U+00d30e: */
+ RTUNI_ALPHA, /* U+00d30f: */
+ RTUNI_ALPHA, /* U+00d310: */
+ RTUNI_ALPHA, /* U+00d311: */
+ RTUNI_ALPHA, /* U+00d312: */
+ RTUNI_ALPHA, /* U+00d313: */
+ RTUNI_ALPHA, /* U+00d314: */
+ RTUNI_ALPHA, /* U+00d315: */
+ RTUNI_ALPHA, /* U+00d316: */
+ RTUNI_ALPHA, /* U+00d317: */
+ RTUNI_ALPHA, /* U+00d318: */
+ RTUNI_ALPHA, /* U+00d319: */
+ RTUNI_ALPHA, /* U+00d31a: */
+ RTUNI_ALPHA, /* U+00d31b: */
+ RTUNI_ALPHA, /* U+00d31c: */
+ RTUNI_ALPHA, /* U+00d31d: */
+ RTUNI_ALPHA, /* U+00d31e: */
+ RTUNI_ALPHA, /* U+00d31f: */
+ RTUNI_ALPHA, /* U+00d320: */
+ RTUNI_ALPHA, /* U+00d321: */
+ RTUNI_ALPHA, /* U+00d322: */
+ RTUNI_ALPHA, /* U+00d323: */
+ RTUNI_ALPHA, /* U+00d324: */
+ RTUNI_ALPHA, /* U+00d325: */
+ RTUNI_ALPHA, /* U+00d326: */
+ RTUNI_ALPHA, /* U+00d327: */
+ RTUNI_ALPHA, /* U+00d328: */
+ RTUNI_ALPHA, /* U+00d329: */
+ RTUNI_ALPHA, /* U+00d32a: */
+ RTUNI_ALPHA, /* U+00d32b: */
+ RTUNI_ALPHA, /* U+00d32c: */
+ RTUNI_ALPHA, /* U+00d32d: */
+ RTUNI_ALPHA, /* U+00d32e: */
+ RTUNI_ALPHA, /* U+00d32f: */
+ RTUNI_ALPHA, /* U+00d330: */
+ RTUNI_ALPHA, /* U+00d331: */
+ RTUNI_ALPHA, /* U+00d332: */
+ RTUNI_ALPHA, /* U+00d333: */
+ RTUNI_ALPHA, /* U+00d334: */
+ RTUNI_ALPHA, /* U+00d335: */
+ RTUNI_ALPHA, /* U+00d336: */
+ RTUNI_ALPHA, /* U+00d337: */
+ RTUNI_ALPHA, /* U+00d338: */
+ RTUNI_ALPHA, /* U+00d339: */
+ RTUNI_ALPHA, /* U+00d33a: */
+ RTUNI_ALPHA, /* U+00d33b: */
+ RTUNI_ALPHA, /* U+00d33c: */
+ RTUNI_ALPHA, /* U+00d33d: */
+ RTUNI_ALPHA, /* U+00d33e: */
+ RTUNI_ALPHA, /* U+00d33f: */
+ RTUNI_ALPHA, /* U+00d340: */
+ RTUNI_ALPHA, /* U+00d341: */
+ RTUNI_ALPHA, /* U+00d342: */
+ RTUNI_ALPHA, /* U+00d343: */
+ RTUNI_ALPHA, /* U+00d344: */
+ RTUNI_ALPHA, /* U+00d345: */
+ RTUNI_ALPHA, /* U+00d346: */
+ RTUNI_ALPHA, /* U+00d347: */
+ RTUNI_ALPHA, /* U+00d348: */
+ RTUNI_ALPHA, /* U+00d349: */
+ RTUNI_ALPHA, /* U+00d34a: */
+ RTUNI_ALPHA, /* U+00d34b: */
+ RTUNI_ALPHA, /* U+00d34c: */
+ RTUNI_ALPHA, /* U+00d34d: */
+ RTUNI_ALPHA, /* U+00d34e: */
+ RTUNI_ALPHA, /* U+00d34f: */
+ RTUNI_ALPHA, /* U+00d350: */
+ RTUNI_ALPHA, /* U+00d351: */
+ RTUNI_ALPHA, /* U+00d352: */
+ RTUNI_ALPHA, /* U+00d353: */
+ RTUNI_ALPHA, /* U+00d354: */
+ RTUNI_ALPHA, /* U+00d355: */
+ RTUNI_ALPHA, /* U+00d356: */
+ RTUNI_ALPHA, /* U+00d357: */
+ RTUNI_ALPHA, /* U+00d358: */
+ RTUNI_ALPHA, /* U+00d359: */
+ RTUNI_ALPHA, /* U+00d35a: */
+ RTUNI_ALPHA, /* U+00d35b: */
+ RTUNI_ALPHA, /* U+00d35c: */
+ RTUNI_ALPHA, /* U+00d35d: */
+ RTUNI_ALPHA, /* U+00d35e: */
+ RTUNI_ALPHA, /* U+00d35f: */
+ RTUNI_ALPHA, /* U+00d360: */
+ RTUNI_ALPHA, /* U+00d361: */
+ RTUNI_ALPHA, /* U+00d362: */
+ RTUNI_ALPHA, /* U+00d363: */
+ RTUNI_ALPHA, /* U+00d364: */
+ RTUNI_ALPHA, /* U+00d365: */
+ RTUNI_ALPHA, /* U+00d366: */
+ RTUNI_ALPHA, /* U+00d367: */
+ RTUNI_ALPHA, /* U+00d368: */
+ RTUNI_ALPHA, /* U+00d369: */
+ RTUNI_ALPHA, /* U+00d36a: */
+ RTUNI_ALPHA, /* U+00d36b: */
+ RTUNI_ALPHA, /* U+00d36c: */
+ RTUNI_ALPHA, /* U+00d36d: */
+ RTUNI_ALPHA, /* U+00d36e: */
+ RTUNI_ALPHA, /* U+00d36f: */
+ RTUNI_ALPHA, /* U+00d370: */
+ RTUNI_ALPHA, /* U+00d371: */
+ RTUNI_ALPHA, /* U+00d372: */
+ RTUNI_ALPHA, /* U+00d373: */
+ RTUNI_ALPHA, /* U+00d374: */
+ RTUNI_ALPHA, /* U+00d375: */
+ RTUNI_ALPHA, /* U+00d376: */
+ RTUNI_ALPHA, /* U+00d377: */
+ RTUNI_ALPHA, /* U+00d378: */
+ RTUNI_ALPHA, /* U+00d379: */
+ RTUNI_ALPHA, /* U+00d37a: */
+ RTUNI_ALPHA, /* U+00d37b: */
+ RTUNI_ALPHA, /* U+00d37c: */
+ RTUNI_ALPHA, /* U+00d37d: */
+ RTUNI_ALPHA, /* U+00d37e: */
+ RTUNI_ALPHA, /* U+00d37f: */
+ RTUNI_ALPHA, /* U+00d380: */
+ RTUNI_ALPHA, /* U+00d381: */
+ RTUNI_ALPHA, /* U+00d382: */
+ RTUNI_ALPHA, /* U+00d383: */
+ RTUNI_ALPHA, /* U+00d384: */
+ RTUNI_ALPHA, /* U+00d385: */
+ RTUNI_ALPHA, /* U+00d386: */
+ RTUNI_ALPHA, /* U+00d387: */
+ RTUNI_ALPHA, /* U+00d388: */
+ RTUNI_ALPHA, /* U+00d389: */
+ RTUNI_ALPHA, /* U+00d38a: */
+ RTUNI_ALPHA, /* U+00d38b: */
+ RTUNI_ALPHA, /* U+00d38c: */
+ RTUNI_ALPHA, /* U+00d38d: */
+ RTUNI_ALPHA, /* U+00d38e: */
+ RTUNI_ALPHA, /* U+00d38f: */
+ RTUNI_ALPHA, /* U+00d390: */
+ RTUNI_ALPHA, /* U+00d391: */
+ RTUNI_ALPHA, /* U+00d392: */
+ RTUNI_ALPHA, /* U+00d393: */
+ RTUNI_ALPHA, /* U+00d394: */
+ RTUNI_ALPHA, /* U+00d395: */
+ RTUNI_ALPHA, /* U+00d396: */
+ RTUNI_ALPHA, /* U+00d397: */
+ RTUNI_ALPHA, /* U+00d398: */
+ RTUNI_ALPHA, /* U+00d399: */
+ RTUNI_ALPHA, /* U+00d39a: */
+ RTUNI_ALPHA, /* U+00d39b: */
+ RTUNI_ALPHA, /* U+00d39c: */
+ RTUNI_ALPHA, /* U+00d39d: */
+ RTUNI_ALPHA, /* U+00d39e: */
+ RTUNI_ALPHA, /* U+00d39f: */
+ RTUNI_ALPHA, /* U+00d3a0: */
+ RTUNI_ALPHA, /* U+00d3a1: */
+ RTUNI_ALPHA, /* U+00d3a2: */
+ RTUNI_ALPHA, /* U+00d3a3: */
+ RTUNI_ALPHA, /* U+00d3a4: */
+ RTUNI_ALPHA, /* U+00d3a5: */
+ RTUNI_ALPHA, /* U+00d3a6: */
+ RTUNI_ALPHA, /* U+00d3a7: */
+ RTUNI_ALPHA, /* U+00d3a8: */
+ RTUNI_ALPHA, /* U+00d3a9: */
+ RTUNI_ALPHA, /* U+00d3aa: */
+ RTUNI_ALPHA, /* U+00d3ab: */
+ RTUNI_ALPHA, /* U+00d3ac: */
+ RTUNI_ALPHA, /* U+00d3ad: */
+ RTUNI_ALPHA, /* U+00d3ae: */
+ RTUNI_ALPHA, /* U+00d3af: */
+ RTUNI_ALPHA, /* U+00d3b0: */
+ RTUNI_ALPHA, /* U+00d3b1: */
+ RTUNI_ALPHA, /* U+00d3b2: */
+ RTUNI_ALPHA, /* U+00d3b3: */
+ RTUNI_ALPHA, /* U+00d3b4: */
+ RTUNI_ALPHA, /* U+00d3b5: */
+ RTUNI_ALPHA, /* U+00d3b6: */
+ RTUNI_ALPHA, /* U+00d3b7: */
+ RTUNI_ALPHA, /* U+00d3b8: */
+ RTUNI_ALPHA, /* U+00d3b9: */
+ RTUNI_ALPHA, /* U+00d3ba: */
+ RTUNI_ALPHA, /* U+00d3bb: */
+ RTUNI_ALPHA, /* U+00d3bc: */
+ RTUNI_ALPHA, /* U+00d3bd: */
+ RTUNI_ALPHA, /* U+00d3be: */
+ RTUNI_ALPHA, /* U+00d3bf: */
+ RTUNI_ALPHA, /* U+00d3c0: */
+ RTUNI_ALPHA, /* U+00d3c1: */
+ RTUNI_ALPHA, /* U+00d3c2: */
+ RTUNI_ALPHA, /* U+00d3c3: */
+ RTUNI_ALPHA, /* U+00d3c4: */
+ RTUNI_ALPHA, /* U+00d3c5: */
+ RTUNI_ALPHA, /* U+00d3c6: */
+ RTUNI_ALPHA, /* U+00d3c7: */
+ RTUNI_ALPHA, /* U+00d3c8: */
+ RTUNI_ALPHA, /* U+00d3c9: */
+ RTUNI_ALPHA, /* U+00d3ca: */
+ RTUNI_ALPHA, /* U+00d3cb: */
+ RTUNI_ALPHA, /* U+00d3cc: */
+ RTUNI_ALPHA, /* U+00d3cd: */
+ RTUNI_ALPHA, /* U+00d3ce: */
+ RTUNI_ALPHA, /* U+00d3cf: */
+ RTUNI_ALPHA, /* U+00d3d0: */
+ RTUNI_ALPHA, /* U+00d3d1: */
+ RTUNI_ALPHA, /* U+00d3d2: */
+ RTUNI_ALPHA, /* U+00d3d3: */
+ RTUNI_ALPHA, /* U+00d3d4: */
+ RTUNI_ALPHA, /* U+00d3d5: */
+ RTUNI_ALPHA, /* U+00d3d6: */
+ RTUNI_ALPHA, /* U+00d3d7: */
+ RTUNI_ALPHA, /* U+00d3d8: */
+ RTUNI_ALPHA, /* U+00d3d9: */
+ RTUNI_ALPHA, /* U+00d3da: */
+ RTUNI_ALPHA, /* U+00d3db: */
+ RTUNI_ALPHA, /* U+00d3dc: */
+ RTUNI_ALPHA, /* U+00d3dd: */
+ RTUNI_ALPHA, /* U+00d3de: */
+ RTUNI_ALPHA, /* U+00d3df: */
+ RTUNI_ALPHA, /* U+00d3e0: */
+ RTUNI_ALPHA, /* U+00d3e1: */
+ RTUNI_ALPHA, /* U+00d3e2: */
+ RTUNI_ALPHA, /* U+00d3e3: */
+ RTUNI_ALPHA, /* U+00d3e4: */
+ RTUNI_ALPHA, /* U+00d3e5: */
+ RTUNI_ALPHA, /* U+00d3e6: */
+ RTUNI_ALPHA, /* U+00d3e7: */
+ RTUNI_ALPHA, /* U+00d3e8: */
+ RTUNI_ALPHA, /* U+00d3e9: */
+ RTUNI_ALPHA, /* U+00d3ea: */
+ RTUNI_ALPHA, /* U+00d3eb: */
+ RTUNI_ALPHA, /* U+00d3ec: */
+ RTUNI_ALPHA, /* U+00d3ed: */
+ RTUNI_ALPHA, /* U+00d3ee: */
+ RTUNI_ALPHA, /* U+00d3ef: */
+ RTUNI_ALPHA, /* U+00d3f0: */
+ RTUNI_ALPHA, /* U+00d3f1: */
+ RTUNI_ALPHA, /* U+00d3f2: */
+ RTUNI_ALPHA, /* U+00d3f3: */
+ RTUNI_ALPHA, /* U+00d3f4: */
+ RTUNI_ALPHA, /* U+00d3f5: */
+ RTUNI_ALPHA, /* U+00d3f6: */
+ RTUNI_ALPHA, /* U+00d3f7: */
+ RTUNI_ALPHA, /* U+00d3f8: */
+ RTUNI_ALPHA, /* U+00d3f9: */
+ RTUNI_ALPHA, /* U+00d3fa: */
+ RTUNI_ALPHA, /* U+00d3fb: */
+ RTUNI_ALPHA, /* U+00d3fc: */
+ RTUNI_ALPHA, /* U+00d3fd: */
+ RTUNI_ALPHA, /* U+00d3fe: */
+ RTUNI_ALPHA, /* U+00d3ff: */
+ RTUNI_ALPHA, /* U+00d400: */
+ RTUNI_ALPHA, /* U+00d401: */
+ RTUNI_ALPHA, /* U+00d402: */
+ RTUNI_ALPHA, /* U+00d403: */
+ RTUNI_ALPHA, /* U+00d404: */
+ RTUNI_ALPHA, /* U+00d405: */
+ RTUNI_ALPHA, /* U+00d406: */
+ RTUNI_ALPHA, /* U+00d407: */
+ RTUNI_ALPHA, /* U+00d408: */
+ RTUNI_ALPHA, /* U+00d409: */
+ RTUNI_ALPHA, /* U+00d40a: */
+ RTUNI_ALPHA, /* U+00d40b: */
+ RTUNI_ALPHA, /* U+00d40c: */
+ RTUNI_ALPHA, /* U+00d40d: */
+ RTUNI_ALPHA, /* U+00d40e: */
+ RTUNI_ALPHA, /* U+00d40f: */
+ RTUNI_ALPHA, /* U+00d410: */
+ RTUNI_ALPHA, /* U+00d411: */
+ RTUNI_ALPHA, /* U+00d412: */
+ RTUNI_ALPHA, /* U+00d413: */
+ RTUNI_ALPHA, /* U+00d414: */
+ RTUNI_ALPHA, /* U+00d415: */
+ RTUNI_ALPHA, /* U+00d416: */
+ RTUNI_ALPHA, /* U+00d417: */
+ RTUNI_ALPHA, /* U+00d418: */
+ RTUNI_ALPHA, /* U+00d419: */
+ RTUNI_ALPHA, /* U+00d41a: */
+ RTUNI_ALPHA, /* U+00d41b: */
+ RTUNI_ALPHA, /* U+00d41c: */
+ RTUNI_ALPHA, /* U+00d41d: */
+ RTUNI_ALPHA, /* U+00d41e: */
+ RTUNI_ALPHA, /* U+00d41f: */
+ RTUNI_ALPHA, /* U+00d420: */
+ RTUNI_ALPHA, /* U+00d421: */
+ RTUNI_ALPHA, /* U+00d422: */
+ RTUNI_ALPHA, /* U+00d423: */
+ RTUNI_ALPHA, /* U+00d424: */
+ RTUNI_ALPHA, /* U+00d425: */
+ RTUNI_ALPHA, /* U+00d426: */
+ RTUNI_ALPHA, /* U+00d427: */
+ RTUNI_ALPHA, /* U+00d428: */
+ RTUNI_ALPHA, /* U+00d429: */
+ RTUNI_ALPHA, /* U+00d42a: */
+ RTUNI_ALPHA, /* U+00d42b: */
+ RTUNI_ALPHA, /* U+00d42c: */
+ RTUNI_ALPHA, /* U+00d42d: */
+ RTUNI_ALPHA, /* U+00d42e: */
+ RTUNI_ALPHA, /* U+00d42f: */
+ RTUNI_ALPHA, /* U+00d430: */
+ RTUNI_ALPHA, /* U+00d431: */
+ RTUNI_ALPHA, /* U+00d432: */
+ RTUNI_ALPHA, /* U+00d433: */
+ RTUNI_ALPHA, /* U+00d434: */
+ RTUNI_ALPHA, /* U+00d435: */
+ RTUNI_ALPHA, /* U+00d436: */
+ RTUNI_ALPHA, /* U+00d437: */
+ RTUNI_ALPHA, /* U+00d438: */
+ RTUNI_ALPHA, /* U+00d439: */
+ RTUNI_ALPHA, /* U+00d43a: */
+ RTUNI_ALPHA, /* U+00d43b: */
+ RTUNI_ALPHA, /* U+00d43c: */
+ RTUNI_ALPHA, /* U+00d43d: */
+ RTUNI_ALPHA, /* U+00d43e: */
+ RTUNI_ALPHA, /* U+00d43f: */
+ RTUNI_ALPHA, /* U+00d440: */
+ RTUNI_ALPHA, /* U+00d441: */
+ RTUNI_ALPHA, /* U+00d442: */
+ RTUNI_ALPHA, /* U+00d443: */
+ RTUNI_ALPHA, /* U+00d444: */
+ RTUNI_ALPHA, /* U+00d445: */
+ RTUNI_ALPHA, /* U+00d446: */
+ RTUNI_ALPHA, /* U+00d447: */
+ RTUNI_ALPHA, /* U+00d448: */
+ RTUNI_ALPHA, /* U+00d449: */
+ RTUNI_ALPHA, /* U+00d44a: */
+ RTUNI_ALPHA, /* U+00d44b: */
+ RTUNI_ALPHA, /* U+00d44c: */
+ RTUNI_ALPHA, /* U+00d44d: */
+ RTUNI_ALPHA, /* U+00d44e: */
+ RTUNI_ALPHA, /* U+00d44f: */
+ RTUNI_ALPHA, /* U+00d450: */
+ RTUNI_ALPHA, /* U+00d451: */
+ RTUNI_ALPHA, /* U+00d452: */
+ RTUNI_ALPHA, /* U+00d453: */
+ RTUNI_ALPHA, /* U+00d454: */
+ RTUNI_ALPHA, /* U+00d455: */
+ RTUNI_ALPHA, /* U+00d456: */
+ RTUNI_ALPHA, /* U+00d457: */
+ RTUNI_ALPHA, /* U+00d458: */
+ RTUNI_ALPHA, /* U+00d459: */
+ RTUNI_ALPHA, /* U+00d45a: */
+ RTUNI_ALPHA, /* U+00d45b: */
+ RTUNI_ALPHA, /* U+00d45c: */
+ RTUNI_ALPHA, /* U+00d45d: */
+ RTUNI_ALPHA, /* U+00d45e: */
+ RTUNI_ALPHA, /* U+00d45f: */
+ RTUNI_ALPHA, /* U+00d460: */
+ RTUNI_ALPHA, /* U+00d461: */
+ RTUNI_ALPHA, /* U+00d462: */
+ RTUNI_ALPHA, /* U+00d463: */
+ RTUNI_ALPHA, /* U+00d464: */
+ RTUNI_ALPHA, /* U+00d465: */
+ RTUNI_ALPHA, /* U+00d466: */
+ RTUNI_ALPHA, /* U+00d467: */
+ RTUNI_ALPHA, /* U+00d468: */
+ RTUNI_ALPHA, /* U+00d469: */
+ RTUNI_ALPHA, /* U+00d46a: */
+ RTUNI_ALPHA, /* U+00d46b: */
+ RTUNI_ALPHA, /* U+00d46c: */
+ RTUNI_ALPHA, /* U+00d46d: */
+ RTUNI_ALPHA, /* U+00d46e: */
+ RTUNI_ALPHA, /* U+00d46f: */
+ RTUNI_ALPHA, /* U+00d470: */
+ RTUNI_ALPHA, /* U+00d471: */
+ RTUNI_ALPHA, /* U+00d472: */
+ RTUNI_ALPHA, /* U+00d473: */
+ RTUNI_ALPHA, /* U+00d474: */
+ RTUNI_ALPHA, /* U+00d475: */
+ RTUNI_ALPHA, /* U+00d476: */
+ RTUNI_ALPHA, /* U+00d477: */
+ RTUNI_ALPHA, /* U+00d478: */
+ RTUNI_ALPHA, /* U+00d479: */
+ RTUNI_ALPHA, /* U+00d47a: */
+ RTUNI_ALPHA, /* U+00d47b: */
+ RTUNI_ALPHA, /* U+00d47c: */
+ RTUNI_ALPHA, /* U+00d47d: */
+ RTUNI_ALPHA, /* U+00d47e: */
+ RTUNI_ALPHA, /* U+00d47f: */
+ RTUNI_ALPHA, /* U+00d480: */
+ RTUNI_ALPHA, /* U+00d481: */
+ RTUNI_ALPHA, /* U+00d482: */
+ RTUNI_ALPHA, /* U+00d483: */
+ RTUNI_ALPHA, /* U+00d484: */
+ RTUNI_ALPHA, /* U+00d485: */
+ RTUNI_ALPHA, /* U+00d486: */
+ RTUNI_ALPHA, /* U+00d487: */
+ RTUNI_ALPHA, /* U+00d488: */
+ RTUNI_ALPHA, /* U+00d489: */
+ RTUNI_ALPHA, /* U+00d48a: */
+ RTUNI_ALPHA, /* U+00d48b: */
+ RTUNI_ALPHA, /* U+00d48c: */
+ RTUNI_ALPHA, /* U+00d48d: */
+ RTUNI_ALPHA, /* U+00d48e: */
+ RTUNI_ALPHA, /* U+00d48f: */
+ RTUNI_ALPHA, /* U+00d490: */
+ RTUNI_ALPHA, /* U+00d491: */
+ RTUNI_ALPHA, /* U+00d492: */
+ RTUNI_ALPHA, /* U+00d493: */
+ RTUNI_ALPHA, /* U+00d494: */
+ RTUNI_ALPHA, /* U+00d495: */
+ RTUNI_ALPHA, /* U+00d496: */
+ RTUNI_ALPHA, /* U+00d497: */
+ RTUNI_ALPHA, /* U+00d498: */
+ RTUNI_ALPHA, /* U+00d499: */
+ RTUNI_ALPHA, /* U+00d49a: */
+ RTUNI_ALPHA, /* U+00d49b: */
+ RTUNI_ALPHA, /* U+00d49c: */
+ RTUNI_ALPHA, /* U+00d49d: */
+ RTUNI_ALPHA, /* U+00d49e: */
+ RTUNI_ALPHA, /* U+00d49f: */
+ RTUNI_ALPHA, /* U+00d4a0: */
+ RTUNI_ALPHA, /* U+00d4a1: */
+ RTUNI_ALPHA, /* U+00d4a2: */
+ RTUNI_ALPHA, /* U+00d4a3: */
+ RTUNI_ALPHA, /* U+00d4a4: */
+ RTUNI_ALPHA, /* U+00d4a5: */
+ RTUNI_ALPHA, /* U+00d4a6: */
+ RTUNI_ALPHA, /* U+00d4a7: */
+ RTUNI_ALPHA, /* U+00d4a8: */
+ RTUNI_ALPHA, /* U+00d4a9: */
+ RTUNI_ALPHA, /* U+00d4aa: */
+ RTUNI_ALPHA, /* U+00d4ab: */
+ RTUNI_ALPHA, /* U+00d4ac: */
+ RTUNI_ALPHA, /* U+00d4ad: */
+ RTUNI_ALPHA, /* U+00d4ae: */
+ RTUNI_ALPHA, /* U+00d4af: */
+ RTUNI_ALPHA, /* U+00d4b0: */
+ RTUNI_ALPHA, /* U+00d4b1: */
+ RTUNI_ALPHA, /* U+00d4b2: */
+ RTUNI_ALPHA, /* U+00d4b3: */
+ RTUNI_ALPHA, /* U+00d4b4: */
+ RTUNI_ALPHA, /* U+00d4b5: */
+ RTUNI_ALPHA, /* U+00d4b6: */
+ RTUNI_ALPHA, /* U+00d4b7: */
+ RTUNI_ALPHA, /* U+00d4b8: */
+ RTUNI_ALPHA, /* U+00d4b9: */
+ RTUNI_ALPHA, /* U+00d4ba: */
+ RTUNI_ALPHA, /* U+00d4bb: */
+ RTUNI_ALPHA, /* U+00d4bc: */
+ RTUNI_ALPHA, /* U+00d4bd: */
+ RTUNI_ALPHA, /* U+00d4be: */
+ RTUNI_ALPHA, /* U+00d4bf: */
+ RTUNI_ALPHA, /* U+00d4c0: */
+ RTUNI_ALPHA, /* U+00d4c1: */
+ RTUNI_ALPHA, /* U+00d4c2: */
+ RTUNI_ALPHA, /* U+00d4c3: */
+ RTUNI_ALPHA, /* U+00d4c4: */
+ RTUNI_ALPHA, /* U+00d4c5: */
+ RTUNI_ALPHA, /* U+00d4c6: */
+ RTUNI_ALPHA, /* U+00d4c7: */
+ RTUNI_ALPHA, /* U+00d4c8: */
+ RTUNI_ALPHA, /* U+00d4c9: */
+ RTUNI_ALPHA, /* U+00d4ca: */
+ RTUNI_ALPHA, /* U+00d4cb: */
+ RTUNI_ALPHA, /* U+00d4cc: */
+ RTUNI_ALPHA, /* U+00d4cd: */
+ RTUNI_ALPHA, /* U+00d4ce: */
+ RTUNI_ALPHA, /* U+00d4cf: */
+ RTUNI_ALPHA, /* U+00d4d0: */
+ RTUNI_ALPHA, /* U+00d4d1: */
+ RTUNI_ALPHA, /* U+00d4d2: */
+ RTUNI_ALPHA, /* U+00d4d3: */
+ RTUNI_ALPHA, /* U+00d4d4: */
+ RTUNI_ALPHA, /* U+00d4d5: */
+ RTUNI_ALPHA, /* U+00d4d6: */
+ RTUNI_ALPHA, /* U+00d4d7: */
+ RTUNI_ALPHA, /* U+00d4d8: */
+ RTUNI_ALPHA, /* U+00d4d9: */
+ RTUNI_ALPHA, /* U+00d4da: */
+ RTUNI_ALPHA, /* U+00d4db: */
+ RTUNI_ALPHA, /* U+00d4dc: */
+ RTUNI_ALPHA, /* U+00d4dd: */
+ RTUNI_ALPHA, /* U+00d4de: */
+ RTUNI_ALPHA, /* U+00d4df: */
+ RTUNI_ALPHA, /* U+00d4e0: */
+ RTUNI_ALPHA, /* U+00d4e1: */
+ RTUNI_ALPHA, /* U+00d4e2: */
+ RTUNI_ALPHA, /* U+00d4e3: */
+ RTUNI_ALPHA, /* U+00d4e4: */
+ RTUNI_ALPHA, /* U+00d4e5: */
+ RTUNI_ALPHA, /* U+00d4e6: */
+ RTUNI_ALPHA, /* U+00d4e7: */
+ RTUNI_ALPHA, /* U+00d4e8: */
+ RTUNI_ALPHA, /* U+00d4e9: */
+ RTUNI_ALPHA, /* U+00d4ea: */
+ RTUNI_ALPHA, /* U+00d4eb: */
+ RTUNI_ALPHA, /* U+00d4ec: */
+ RTUNI_ALPHA, /* U+00d4ed: */
+ RTUNI_ALPHA, /* U+00d4ee: */
+ RTUNI_ALPHA, /* U+00d4ef: */
+ RTUNI_ALPHA, /* U+00d4f0: */
+ RTUNI_ALPHA, /* U+00d4f1: */
+ RTUNI_ALPHA, /* U+00d4f2: */
+ RTUNI_ALPHA, /* U+00d4f3: */
+ RTUNI_ALPHA, /* U+00d4f4: */
+ RTUNI_ALPHA, /* U+00d4f5: */
+ RTUNI_ALPHA, /* U+00d4f6: */
+ RTUNI_ALPHA, /* U+00d4f7: */
+ RTUNI_ALPHA, /* U+00d4f8: */
+ RTUNI_ALPHA, /* U+00d4f9: */
+ RTUNI_ALPHA, /* U+00d4fa: */
+ RTUNI_ALPHA, /* U+00d4fb: */
+ RTUNI_ALPHA, /* U+00d4fc: */
+ RTUNI_ALPHA, /* U+00d4fd: */
+ RTUNI_ALPHA, /* U+00d4fe: */
+ RTUNI_ALPHA, /* U+00d4ff: */
+ RTUNI_ALPHA, /* U+00d500: */
+ RTUNI_ALPHA, /* U+00d501: */
+ RTUNI_ALPHA, /* U+00d502: */
+ RTUNI_ALPHA, /* U+00d503: */
+ RTUNI_ALPHA, /* U+00d504: */
+ RTUNI_ALPHA, /* U+00d505: */
+ RTUNI_ALPHA, /* U+00d506: */
+ RTUNI_ALPHA, /* U+00d507: */
+ RTUNI_ALPHA, /* U+00d508: */
+ RTUNI_ALPHA, /* U+00d509: */
+ RTUNI_ALPHA, /* U+00d50a: */
+ RTUNI_ALPHA, /* U+00d50b: */
+ RTUNI_ALPHA, /* U+00d50c: */
+ RTUNI_ALPHA, /* U+00d50d: */
+ RTUNI_ALPHA, /* U+00d50e: */
+ RTUNI_ALPHA, /* U+00d50f: */
+ RTUNI_ALPHA, /* U+00d510: */
+ RTUNI_ALPHA, /* U+00d511: */
+ RTUNI_ALPHA, /* U+00d512: */
+ RTUNI_ALPHA, /* U+00d513: */
+ RTUNI_ALPHA, /* U+00d514: */
+ RTUNI_ALPHA, /* U+00d515: */
+ RTUNI_ALPHA, /* U+00d516: */
+ RTUNI_ALPHA, /* U+00d517: */
+ RTUNI_ALPHA, /* U+00d518: */
+ RTUNI_ALPHA, /* U+00d519: */
+ RTUNI_ALPHA, /* U+00d51a: */
+ RTUNI_ALPHA, /* U+00d51b: */
+ RTUNI_ALPHA, /* U+00d51c: */
+ RTUNI_ALPHA, /* U+00d51d: */
+ RTUNI_ALPHA, /* U+00d51e: */
+ RTUNI_ALPHA, /* U+00d51f: */
+ RTUNI_ALPHA, /* U+00d520: */
+ RTUNI_ALPHA, /* U+00d521: */
+ RTUNI_ALPHA, /* U+00d522: */
+ RTUNI_ALPHA, /* U+00d523: */
+ RTUNI_ALPHA, /* U+00d524: */
+ RTUNI_ALPHA, /* U+00d525: */
+ RTUNI_ALPHA, /* U+00d526: */
+ RTUNI_ALPHA, /* U+00d527: */
+ RTUNI_ALPHA, /* U+00d528: */
+ RTUNI_ALPHA, /* U+00d529: */
+ RTUNI_ALPHA, /* U+00d52a: */
+ RTUNI_ALPHA, /* U+00d52b: */
+ RTUNI_ALPHA, /* U+00d52c: */
+ RTUNI_ALPHA, /* U+00d52d: */
+ RTUNI_ALPHA, /* U+00d52e: */
+ RTUNI_ALPHA, /* U+00d52f: */
+ RTUNI_ALPHA, /* U+00d530: */
+ RTUNI_ALPHA, /* U+00d531: */
+ RTUNI_ALPHA, /* U+00d532: */
+ RTUNI_ALPHA, /* U+00d533: */
+ RTUNI_ALPHA, /* U+00d534: */
+ RTUNI_ALPHA, /* U+00d535: */
+ RTUNI_ALPHA, /* U+00d536: */
+ RTUNI_ALPHA, /* U+00d537: */
+ RTUNI_ALPHA, /* U+00d538: */
+ RTUNI_ALPHA, /* U+00d539: */
+ RTUNI_ALPHA, /* U+00d53a: */
+ RTUNI_ALPHA, /* U+00d53b: */
+ RTUNI_ALPHA, /* U+00d53c: */
+ RTUNI_ALPHA, /* U+00d53d: */
+ RTUNI_ALPHA, /* U+00d53e: */
+ RTUNI_ALPHA, /* U+00d53f: */
+ RTUNI_ALPHA, /* U+00d540: */
+ RTUNI_ALPHA, /* U+00d541: */
+ RTUNI_ALPHA, /* U+00d542: */
+ RTUNI_ALPHA, /* U+00d543: */
+ RTUNI_ALPHA, /* U+00d544: */
+ RTUNI_ALPHA, /* U+00d545: */
+ RTUNI_ALPHA, /* U+00d546: */
+ RTUNI_ALPHA, /* U+00d547: */
+ RTUNI_ALPHA, /* U+00d548: */
+ RTUNI_ALPHA, /* U+00d549: */
+ RTUNI_ALPHA, /* U+00d54a: */
+ RTUNI_ALPHA, /* U+00d54b: */
+ RTUNI_ALPHA, /* U+00d54c: */
+ RTUNI_ALPHA, /* U+00d54d: */
+ RTUNI_ALPHA, /* U+00d54e: */
+ RTUNI_ALPHA, /* U+00d54f: */
+ RTUNI_ALPHA, /* U+00d550: */
+ RTUNI_ALPHA, /* U+00d551: */
+ RTUNI_ALPHA, /* U+00d552: */
+ RTUNI_ALPHA, /* U+00d553: */
+ RTUNI_ALPHA, /* U+00d554: */
+ RTUNI_ALPHA, /* U+00d555: */
+ RTUNI_ALPHA, /* U+00d556: */
+ RTUNI_ALPHA, /* U+00d557: */
+ RTUNI_ALPHA, /* U+00d558: */
+ RTUNI_ALPHA, /* U+00d559: */
+ RTUNI_ALPHA, /* U+00d55a: */
+ RTUNI_ALPHA, /* U+00d55b: */
+ RTUNI_ALPHA, /* U+00d55c: */
+ RTUNI_ALPHA, /* U+00d55d: */
+ RTUNI_ALPHA, /* U+00d55e: */
+ RTUNI_ALPHA, /* U+00d55f: */
+ RTUNI_ALPHA, /* U+00d560: */
+ RTUNI_ALPHA, /* U+00d561: */
+ RTUNI_ALPHA, /* U+00d562: */
+ RTUNI_ALPHA, /* U+00d563: */
+ RTUNI_ALPHA, /* U+00d564: */
+ RTUNI_ALPHA, /* U+00d565: */
+ RTUNI_ALPHA, /* U+00d566: */
+ RTUNI_ALPHA, /* U+00d567: */
+ RTUNI_ALPHA, /* U+00d568: */
+ RTUNI_ALPHA, /* U+00d569: */
+ RTUNI_ALPHA, /* U+00d56a: */
+ RTUNI_ALPHA, /* U+00d56b: */
+ RTUNI_ALPHA, /* U+00d56c: */
+ RTUNI_ALPHA, /* U+00d56d: */
+ RTUNI_ALPHA, /* U+00d56e: */
+ RTUNI_ALPHA, /* U+00d56f: */
+ RTUNI_ALPHA, /* U+00d570: */
+ RTUNI_ALPHA, /* U+00d571: */
+ RTUNI_ALPHA, /* U+00d572: */
+ RTUNI_ALPHA, /* U+00d573: */
+ RTUNI_ALPHA, /* U+00d574: */
+ RTUNI_ALPHA, /* U+00d575: */
+ RTUNI_ALPHA, /* U+00d576: */
+ RTUNI_ALPHA, /* U+00d577: */
+ RTUNI_ALPHA, /* U+00d578: */
+ RTUNI_ALPHA, /* U+00d579: */
+ RTUNI_ALPHA, /* U+00d57a: */
+ RTUNI_ALPHA, /* U+00d57b: */
+ RTUNI_ALPHA, /* U+00d57c: */
+ RTUNI_ALPHA, /* U+00d57d: */
+ RTUNI_ALPHA, /* U+00d57e: */
+ RTUNI_ALPHA, /* U+00d57f: */
+ RTUNI_ALPHA, /* U+00d580: */
+ RTUNI_ALPHA, /* U+00d581: */
+ RTUNI_ALPHA, /* U+00d582: */
+ RTUNI_ALPHA, /* U+00d583: */
+ RTUNI_ALPHA, /* U+00d584: */
+ RTUNI_ALPHA, /* U+00d585: */
+ RTUNI_ALPHA, /* U+00d586: */
+ RTUNI_ALPHA, /* U+00d587: */
+ RTUNI_ALPHA, /* U+00d588: */
+ RTUNI_ALPHA, /* U+00d589: */
+ RTUNI_ALPHA, /* U+00d58a: */
+ RTUNI_ALPHA, /* U+00d58b: */
+ RTUNI_ALPHA, /* U+00d58c: */
+ RTUNI_ALPHA, /* U+00d58d: */
+ RTUNI_ALPHA, /* U+00d58e: */
+ RTUNI_ALPHA, /* U+00d58f: */
+ RTUNI_ALPHA, /* U+00d590: */
+ RTUNI_ALPHA, /* U+00d591: */
+ RTUNI_ALPHA, /* U+00d592: */
+ RTUNI_ALPHA, /* U+00d593: */
+ RTUNI_ALPHA, /* U+00d594: */
+ RTUNI_ALPHA, /* U+00d595: */
+ RTUNI_ALPHA, /* U+00d596: */
+ RTUNI_ALPHA, /* U+00d597: */
+ RTUNI_ALPHA, /* U+00d598: */
+ RTUNI_ALPHA, /* U+00d599: */
+ RTUNI_ALPHA, /* U+00d59a: */
+ RTUNI_ALPHA, /* U+00d59b: */
+ RTUNI_ALPHA, /* U+00d59c: */
+ RTUNI_ALPHA, /* U+00d59d: */
+ RTUNI_ALPHA, /* U+00d59e: */
+ RTUNI_ALPHA, /* U+00d59f: */
+ RTUNI_ALPHA, /* U+00d5a0: */
+ RTUNI_ALPHA, /* U+00d5a1: */
+ RTUNI_ALPHA, /* U+00d5a2: */
+ RTUNI_ALPHA, /* U+00d5a3: */
+ RTUNI_ALPHA, /* U+00d5a4: */
+ RTUNI_ALPHA, /* U+00d5a5: */
+ RTUNI_ALPHA, /* U+00d5a6: */
+ RTUNI_ALPHA, /* U+00d5a7: */
+ RTUNI_ALPHA, /* U+00d5a8: */
+ RTUNI_ALPHA, /* U+00d5a9: */
+ RTUNI_ALPHA, /* U+00d5aa: */
+ RTUNI_ALPHA, /* U+00d5ab: */
+ RTUNI_ALPHA, /* U+00d5ac: */
+ RTUNI_ALPHA, /* U+00d5ad: */
+ RTUNI_ALPHA, /* U+00d5ae: */
+ RTUNI_ALPHA, /* U+00d5af: */
+ RTUNI_ALPHA, /* U+00d5b0: */
+ RTUNI_ALPHA, /* U+00d5b1: */
+ RTUNI_ALPHA, /* U+00d5b2: */
+ RTUNI_ALPHA, /* U+00d5b3: */
+ RTUNI_ALPHA, /* U+00d5b4: */
+ RTUNI_ALPHA, /* U+00d5b5: */
+ RTUNI_ALPHA, /* U+00d5b6: */
+ RTUNI_ALPHA, /* U+00d5b7: */
+ RTUNI_ALPHA, /* U+00d5b8: */
+ RTUNI_ALPHA, /* U+00d5b9: */
+ RTUNI_ALPHA, /* U+00d5ba: */
+ RTUNI_ALPHA, /* U+00d5bb: */
+ RTUNI_ALPHA, /* U+00d5bc: */
+ RTUNI_ALPHA, /* U+00d5bd: */
+ RTUNI_ALPHA, /* U+00d5be: */
+ RTUNI_ALPHA, /* U+00d5bf: */
+ RTUNI_ALPHA, /* U+00d5c0: */
+ RTUNI_ALPHA, /* U+00d5c1: */
+ RTUNI_ALPHA, /* U+00d5c2: */
+ RTUNI_ALPHA, /* U+00d5c3: */
+ RTUNI_ALPHA, /* U+00d5c4: */
+ RTUNI_ALPHA, /* U+00d5c5: */
+ RTUNI_ALPHA, /* U+00d5c6: */
+ RTUNI_ALPHA, /* U+00d5c7: */
+ RTUNI_ALPHA, /* U+00d5c8: */
+ RTUNI_ALPHA, /* U+00d5c9: */
+ RTUNI_ALPHA, /* U+00d5ca: */
+ RTUNI_ALPHA, /* U+00d5cb: */
+ RTUNI_ALPHA, /* U+00d5cc: */
+ RTUNI_ALPHA, /* U+00d5cd: */
+ RTUNI_ALPHA, /* U+00d5ce: */
+ RTUNI_ALPHA, /* U+00d5cf: */
+ RTUNI_ALPHA, /* U+00d5d0: */
+ RTUNI_ALPHA, /* U+00d5d1: */
+ RTUNI_ALPHA, /* U+00d5d2: */
+ RTUNI_ALPHA, /* U+00d5d3: */
+ RTUNI_ALPHA, /* U+00d5d4: */
+ RTUNI_ALPHA, /* U+00d5d5: */
+ RTUNI_ALPHA, /* U+00d5d6: */
+ RTUNI_ALPHA, /* U+00d5d7: */
+ RTUNI_ALPHA, /* U+00d5d8: */
+ RTUNI_ALPHA, /* U+00d5d9: */
+ RTUNI_ALPHA, /* U+00d5da: */
+ RTUNI_ALPHA, /* U+00d5db: */
+ RTUNI_ALPHA, /* U+00d5dc: */
+ RTUNI_ALPHA, /* U+00d5dd: */
+ RTUNI_ALPHA, /* U+00d5de: */
+ RTUNI_ALPHA, /* U+00d5df: */
+ RTUNI_ALPHA, /* U+00d5e0: */
+ RTUNI_ALPHA, /* U+00d5e1: */
+ RTUNI_ALPHA, /* U+00d5e2: */
+ RTUNI_ALPHA, /* U+00d5e3: */
+ RTUNI_ALPHA, /* U+00d5e4: */
+ RTUNI_ALPHA, /* U+00d5e5: */
+ RTUNI_ALPHA, /* U+00d5e6: */
+ RTUNI_ALPHA, /* U+00d5e7: */
+ RTUNI_ALPHA, /* U+00d5e8: */
+ RTUNI_ALPHA, /* U+00d5e9: */
+ RTUNI_ALPHA, /* U+00d5ea: */
+ RTUNI_ALPHA, /* U+00d5eb: */
+ RTUNI_ALPHA, /* U+00d5ec: */
+ RTUNI_ALPHA, /* U+00d5ed: */
+ RTUNI_ALPHA, /* U+00d5ee: */
+ RTUNI_ALPHA, /* U+00d5ef: */
+ RTUNI_ALPHA, /* U+00d5f0: */
+ RTUNI_ALPHA, /* U+00d5f1: */
+ RTUNI_ALPHA, /* U+00d5f2: */
+ RTUNI_ALPHA, /* U+00d5f3: */
+ RTUNI_ALPHA, /* U+00d5f4: */
+ RTUNI_ALPHA, /* U+00d5f5: */
+ RTUNI_ALPHA, /* U+00d5f6: */
+ RTUNI_ALPHA, /* U+00d5f7: */
+ RTUNI_ALPHA, /* U+00d5f8: */
+ RTUNI_ALPHA, /* U+00d5f9: */
+ RTUNI_ALPHA, /* U+00d5fa: */
+ RTUNI_ALPHA, /* U+00d5fb: */
+ RTUNI_ALPHA, /* U+00d5fc: */
+ RTUNI_ALPHA, /* U+00d5fd: */
+ RTUNI_ALPHA, /* U+00d5fe: */
+ RTUNI_ALPHA, /* U+00d5ff: */
+ RTUNI_ALPHA, /* U+00d600: */
+ RTUNI_ALPHA, /* U+00d601: */
+ RTUNI_ALPHA, /* U+00d602: */
+ RTUNI_ALPHA, /* U+00d603: */
+ RTUNI_ALPHA, /* U+00d604: */
+ RTUNI_ALPHA, /* U+00d605: */
+ RTUNI_ALPHA, /* U+00d606: */
+ RTUNI_ALPHA, /* U+00d607: */
+ RTUNI_ALPHA, /* U+00d608: */
+ RTUNI_ALPHA, /* U+00d609: */
+ RTUNI_ALPHA, /* U+00d60a: */
+ RTUNI_ALPHA, /* U+00d60b: */
+ RTUNI_ALPHA, /* U+00d60c: */
+ RTUNI_ALPHA, /* U+00d60d: */
+ RTUNI_ALPHA, /* U+00d60e: */
+ RTUNI_ALPHA, /* U+00d60f: */
+ RTUNI_ALPHA, /* U+00d610: */
+ RTUNI_ALPHA, /* U+00d611: */
+ RTUNI_ALPHA, /* U+00d612: */
+ RTUNI_ALPHA, /* U+00d613: */
+ RTUNI_ALPHA, /* U+00d614: */
+ RTUNI_ALPHA, /* U+00d615: */
+ RTUNI_ALPHA, /* U+00d616: */
+ RTUNI_ALPHA, /* U+00d617: */
+ RTUNI_ALPHA, /* U+00d618: */
+ RTUNI_ALPHA, /* U+00d619: */
+ RTUNI_ALPHA, /* U+00d61a: */
+ RTUNI_ALPHA, /* U+00d61b: */
+ RTUNI_ALPHA, /* U+00d61c: */
+ RTUNI_ALPHA, /* U+00d61d: */
+ RTUNI_ALPHA, /* U+00d61e: */
+ RTUNI_ALPHA, /* U+00d61f: */
+ RTUNI_ALPHA, /* U+00d620: */
+ RTUNI_ALPHA, /* U+00d621: */
+ RTUNI_ALPHA, /* U+00d622: */
+ RTUNI_ALPHA, /* U+00d623: */
+ RTUNI_ALPHA, /* U+00d624: */
+ RTUNI_ALPHA, /* U+00d625: */
+ RTUNI_ALPHA, /* U+00d626: */
+ RTUNI_ALPHA, /* U+00d627: */
+ RTUNI_ALPHA, /* U+00d628: */
+ RTUNI_ALPHA, /* U+00d629: */
+ RTUNI_ALPHA, /* U+00d62a: */
+ RTUNI_ALPHA, /* U+00d62b: */
+ RTUNI_ALPHA, /* U+00d62c: */
+ RTUNI_ALPHA, /* U+00d62d: */
+ RTUNI_ALPHA, /* U+00d62e: */
+ RTUNI_ALPHA, /* U+00d62f: */
+ RTUNI_ALPHA, /* U+00d630: */
+ RTUNI_ALPHA, /* U+00d631: */
+ RTUNI_ALPHA, /* U+00d632: */
+ RTUNI_ALPHA, /* U+00d633: */
+ RTUNI_ALPHA, /* U+00d634: */
+ RTUNI_ALPHA, /* U+00d635: */
+ RTUNI_ALPHA, /* U+00d636: */
+ RTUNI_ALPHA, /* U+00d637: */
+ RTUNI_ALPHA, /* U+00d638: */
+ RTUNI_ALPHA, /* U+00d639: */
+ RTUNI_ALPHA, /* U+00d63a: */
+ RTUNI_ALPHA, /* U+00d63b: */
+ RTUNI_ALPHA, /* U+00d63c: */
+ RTUNI_ALPHA, /* U+00d63d: */
+ RTUNI_ALPHA, /* U+00d63e: */
+ RTUNI_ALPHA, /* U+00d63f: */
+ RTUNI_ALPHA, /* U+00d640: */
+ RTUNI_ALPHA, /* U+00d641: */
+ RTUNI_ALPHA, /* U+00d642: */
+ RTUNI_ALPHA, /* U+00d643: */
+ RTUNI_ALPHA, /* U+00d644: */
+ RTUNI_ALPHA, /* U+00d645: */
+ RTUNI_ALPHA, /* U+00d646: */
+ RTUNI_ALPHA, /* U+00d647: */
+ RTUNI_ALPHA, /* U+00d648: */
+ RTUNI_ALPHA, /* U+00d649: */
+ RTUNI_ALPHA, /* U+00d64a: */
+ RTUNI_ALPHA, /* U+00d64b: */
+ RTUNI_ALPHA, /* U+00d64c: */
+ RTUNI_ALPHA, /* U+00d64d: */
+ RTUNI_ALPHA, /* U+00d64e: */
+ RTUNI_ALPHA, /* U+00d64f: */
+ RTUNI_ALPHA, /* U+00d650: */
+ RTUNI_ALPHA, /* U+00d651: */
+ RTUNI_ALPHA, /* U+00d652: */
+ RTUNI_ALPHA, /* U+00d653: */
+ RTUNI_ALPHA, /* U+00d654: */
+ RTUNI_ALPHA, /* U+00d655: */
+ RTUNI_ALPHA, /* U+00d656: */
+ RTUNI_ALPHA, /* U+00d657: */
+ RTUNI_ALPHA, /* U+00d658: */
+ RTUNI_ALPHA, /* U+00d659: */
+ RTUNI_ALPHA, /* U+00d65a: */
+ RTUNI_ALPHA, /* U+00d65b: */
+ RTUNI_ALPHA, /* U+00d65c: */
+ RTUNI_ALPHA, /* U+00d65d: */
+ RTUNI_ALPHA, /* U+00d65e: */
+ RTUNI_ALPHA, /* U+00d65f: */
+ RTUNI_ALPHA, /* U+00d660: */
+ RTUNI_ALPHA, /* U+00d661: */
+ RTUNI_ALPHA, /* U+00d662: */
+ RTUNI_ALPHA, /* U+00d663: */
+ RTUNI_ALPHA, /* U+00d664: */
+ RTUNI_ALPHA, /* U+00d665: */
+ RTUNI_ALPHA, /* U+00d666: */
+ RTUNI_ALPHA, /* U+00d667: */
+ RTUNI_ALPHA, /* U+00d668: */
+ RTUNI_ALPHA, /* U+00d669: */
+ RTUNI_ALPHA, /* U+00d66a: */
+ RTUNI_ALPHA, /* U+00d66b: */
+ RTUNI_ALPHA, /* U+00d66c: */
+ RTUNI_ALPHA, /* U+00d66d: */
+ RTUNI_ALPHA, /* U+00d66e: */
+ RTUNI_ALPHA, /* U+00d66f: */
+ RTUNI_ALPHA, /* U+00d670: */
+ RTUNI_ALPHA, /* U+00d671: */
+ RTUNI_ALPHA, /* U+00d672: */
+ RTUNI_ALPHA, /* U+00d673: */
+ RTUNI_ALPHA, /* U+00d674: */
+ RTUNI_ALPHA, /* U+00d675: */
+ RTUNI_ALPHA, /* U+00d676: */
+ RTUNI_ALPHA, /* U+00d677: */
+ RTUNI_ALPHA, /* U+00d678: */
+ RTUNI_ALPHA, /* U+00d679: */
+ RTUNI_ALPHA, /* U+00d67a: */
+ RTUNI_ALPHA, /* U+00d67b: */
+ RTUNI_ALPHA, /* U+00d67c: */
+ RTUNI_ALPHA, /* U+00d67d: */
+ RTUNI_ALPHA, /* U+00d67e: */
+ RTUNI_ALPHA, /* U+00d67f: */
+ RTUNI_ALPHA, /* U+00d680: */
+ RTUNI_ALPHA, /* U+00d681: */
+ RTUNI_ALPHA, /* U+00d682: */
+ RTUNI_ALPHA, /* U+00d683: */
+ RTUNI_ALPHA, /* U+00d684: */
+ RTUNI_ALPHA, /* U+00d685: */
+ RTUNI_ALPHA, /* U+00d686: */
+ RTUNI_ALPHA, /* U+00d687: */
+ RTUNI_ALPHA, /* U+00d688: */
+ RTUNI_ALPHA, /* U+00d689: */
+ RTUNI_ALPHA, /* U+00d68a: */
+ RTUNI_ALPHA, /* U+00d68b: */
+ RTUNI_ALPHA, /* U+00d68c: */
+ RTUNI_ALPHA, /* U+00d68d: */
+ RTUNI_ALPHA, /* U+00d68e: */
+ RTUNI_ALPHA, /* U+00d68f: */
+ RTUNI_ALPHA, /* U+00d690: */
+ RTUNI_ALPHA, /* U+00d691: */
+ RTUNI_ALPHA, /* U+00d692: */
+ RTUNI_ALPHA, /* U+00d693: */
+ RTUNI_ALPHA, /* U+00d694: */
+ RTUNI_ALPHA, /* U+00d695: */
+ RTUNI_ALPHA, /* U+00d696: */
+ RTUNI_ALPHA, /* U+00d697: */
+ RTUNI_ALPHA, /* U+00d698: */
+ RTUNI_ALPHA, /* U+00d699: */
+ RTUNI_ALPHA, /* U+00d69a: */
+ RTUNI_ALPHA, /* U+00d69b: */
+ RTUNI_ALPHA, /* U+00d69c: */
+ RTUNI_ALPHA, /* U+00d69d: */
+ RTUNI_ALPHA, /* U+00d69e: */
+ RTUNI_ALPHA, /* U+00d69f: */
+ RTUNI_ALPHA, /* U+00d6a0: */
+ RTUNI_ALPHA, /* U+00d6a1: */
+ RTUNI_ALPHA, /* U+00d6a2: */
+ RTUNI_ALPHA, /* U+00d6a3: */
+ RTUNI_ALPHA, /* U+00d6a4: */
+ RTUNI_ALPHA, /* U+00d6a5: */
+ RTUNI_ALPHA, /* U+00d6a6: */
+ RTUNI_ALPHA, /* U+00d6a7: */
+ RTUNI_ALPHA, /* U+00d6a8: */
+ RTUNI_ALPHA, /* U+00d6a9: */
+ RTUNI_ALPHA, /* U+00d6aa: */
+ RTUNI_ALPHA, /* U+00d6ab: */
+ RTUNI_ALPHA, /* U+00d6ac: */
+ RTUNI_ALPHA, /* U+00d6ad: */
+ RTUNI_ALPHA, /* U+00d6ae: */
+ RTUNI_ALPHA, /* U+00d6af: */
+ RTUNI_ALPHA, /* U+00d6b0: */
+ RTUNI_ALPHA, /* U+00d6b1: */
+ RTUNI_ALPHA, /* U+00d6b2: */
+ RTUNI_ALPHA, /* U+00d6b3: */
+ RTUNI_ALPHA, /* U+00d6b4: */
+ RTUNI_ALPHA, /* U+00d6b5: */
+ RTUNI_ALPHA, /* U+00d6b6: */
+ RTUNI_ALPHA, /* U+00d6b7: */
+ RTUNI_ALPHA, /* U+00d6b8: */
+ RTUNI_ALPHA, /* U+00d6b9: */
+ RTUNI_ALPHA, /* U+00d6ba: */
+ RTUNI_ALPHA, /* U+00d6bb: */
+ RTUNI_ALPHA, /* U+00d6bc: */
+ RTUNI_ALPHA, /* U+00d6bd: */
+ RTUNI_ALPHA, /* U+00d6be: */
+ RTUNI_ALPHA, /* U+00d6bf: */
+ RTUNI_ALPHA, /* U+00d6c0: */
+ RTUNI_ALPHA, /* U+00d6c1: */
+ RTUNI_ALPHA, /* U+00d6c2: */
+ RTUNI_ALPHA, /* U+00d6c3: */
+ RTUNI_ALPHA, /* U+00d6c4: */
+ RTUNI_ALPHA, /* U+00d6c5: */
+ RTUNI_ALPHA, /* U+00d6c6: */
+ RTUNI_ALPHA, /* U+00d6c7: */
+ RTUNI_ALPHA, /* U+00d6c8: */
+ RTUNI_ALPHA, /* U+00d6c9: */
+ RTUNI_ALPHA, /* U+00d6ca: */
+ RTUNI_ALPHA, /* U+00d6cb: */
+ RTUNI_ALPHA, /* U+00d6cc: */
+ RTUNI_ALPHA, /* U+00d6cd: */
+ RTUNI_ALPHA, /* U+00d6ce: */
+ RTUNI_ALPHA, /* U+00d6cf: */
+ RTUNI_ALPHA, /* U+00d6d0: */
+ RTUNI_ALPHA, /* U+00d6d1: */
+ RTUNI_ALPHA, /* U+00d6d2: */
+ RTUNI_ALPHA, /* U+00d6d3: */
+ RTUNI_ALPHA, /* U+00d6d4: */
+ RTUNI_ALPHA, /* U+00d6d5: */
+ RTUNI_ALPHA, /* U+00d6d6: */
+ RTUNI_ALPHA, /* U+00d6d7: */
+ RTUNI_ALPHA, /* U+00d6d8: */
+ RTUNI_ALPHA, /* U+00d6d9: */
+ RTUNI_ALPHA, /* U+00d6da: */
+ RTUNI_ALPHA, /* U+00d6db: */
+ RTUNI_ALPHA, /* U+00d6dc: */
+ RTUNI_ALPHA, /* U+00d6dd: */
+ RTUNI_ALPHA, /* U+00d6de: */
+ RTUNI_ALPHA, /* U+00d6df: */
+ RTUNI_ALPHA, /* U+00d6e0: */
+ RTUNI_ALPHA, /* U+00d6e1: */
+ RTUNI_ALPHA, /* U+00d6e2: */
+ RTUNI_ALPHA, /* U+00d6e3: */
+ RTUNI_ALPHA, /* U+00d6e4: */
+ RTUNI_ALPHA, /* U+00d6e5: */
+ RTUNI_ALPHA, /* U+00d6e6: */
+ RTUNI_ALPHA, /* U+00d6e7: */
+ RTUNI_ALPHA, /* U+00d6e8: */
+ RTUNI_ALPHA, /* U+00d6e9: */
+ RTUNI_ALPHA, /* U+00d6ea: */
+ RTUNI_ALPHA, /* U+00d6eb: */
+ RTUNI_ALPHA, /* U+00d6ec: */
+ RTUNI_ALPHA, /* U+00d6ed: */
+ RTUNI_ALPHA, /* U+00d6ee: */
+ RTUNI_ALPHA, /* U+00d6ef: */
+ RTUNI_ALPHA, /* U+00d6f0: */
+ RTUNI_ALPHA, /* U+00d6f1: */
+ RTUNI_ALPHA, /* U+00d6f2: */
+ RTUNI_ALPHA, /* U+00d6f3: */
+ RTUNI_ALPHA, /* U+00d6f4: */
+ RTUNI_ALPHA, /* U+00d6f5: */
+ RTUNI_ALPHA, /* U+00d6f6: */
+ RTUNI_ALPHA, /* U+00d6f7: */
+ RTUNI_ALPHA, /* U+00d6f8: */
+ RTUNI_ALPHA, /* U+00d6f9: */
+ RTUNI_ALPHA, /* U+00d6fa: */
+ RTUNI_ALPHA, /* U+00d6fb: */
+ RTUNI_ALPHA, /* U+00d6fc: */
+ RTUNI_ALPHA, /* U+00d6fd: */
+ RTUNI_ALPHA, /* U+00d6fe: */
+ RTUNI_ALPHA, /* U+00d6ff: */
+ RTUNI_ALPHA, /* U+00d700: */
+ RTUNI_ALPHA, /* U+00d701: */
+ RTUNI_ALPHA, /* U+00d702: */
+ RTUNI_ALPHA, /* U+00d703: */
+ RTUNI_ALPHA, /* U+00d704: */
+ RTUNI_ALPHA, /* U+00d705: */
+ RTUNI_ALPHA, /* U+00d706: */
+ RTUNI_ALPHA, /* U+00d707: */
+ RTUNI_ALPHA, /* U+00d708: */
+ RTUNI_ALPHA, /* U+00d709: */
+ RTUNI_ALPHA, /* U+00d70a: */
+ RTUNI_ALPHA, /* U+00d70b: */
+ RTUNI_ALPHA, /* U+00d70c: */
+ RTUNI_ALPHA, /* U+00d70d: */
+ RTUNI_ALPHA, /* U+00d70e: */
+ RTUNI_ALPHA, /* U+00d70f: */
+ RTUNI_ALPHA, /* U+00d710: */
+ RTUNI_ALPHA, /* U+00d711: */
+ RTUNI_ALPHA, /* U+00d712: */
+ RTUNI_ALPHA, /* U+00d713: */
+ RTUNI_ALPHA, /* U+00d714: */
+ RTUNI_ALPHA, /* U+00d715: */
+ RTUNI_ALPHA, /* U+00d716: */
+ RTUNI_ALPHA, /* U+00d717: */
+ RTUNI_ALPHA, /* U+00d718: */
+ RTUNI_ALPHA, /* U+00d719: */
+ RTUNI_ALPHA, /* U+00d71a: */
+ RTUNI_ALPHA, /* U+00d71b: */
+ RTUNI_ALPHA, /* U+00d71c: */
+ RTUNI_ALPHA, /* U+00d71d: */
+ RTUNI_ALPHA, /* U+00d71e: */
+ RTUNI_ALPHA, /* U+00d71f: */
+ RTUNI_ALPHA, /* U+00d720: */
+ RTUNI_ALPHA, /* U+00d721: */
+ RTUNI_ALPHA, /* U+00d722: */
+ RTUNI_ALPHA, /* U+00d723: */
+ RTUNI_ALPHA, /* U+00d724: */
+ RTUNI_ALPHA, /* U+00d725: */
+ RTUNI_ALPHA, /* U+00d726: */
+ RTUNI_ALPHA, /* U+00d727: */
+ RTUNI_ALPHA, /* U+00d728: */
+ RTUNI_ALPHA, /* U+00d729: */
+ RTUNI_ALPHA, /* U+00d72a: */
+ RTUNI_ALPHA, /* U+00d72b: */
+ RTUNI_ALPHA, /* U+00d72c: */
+ RTUNI_ALPHA, /* U+00d72d: */
+ RTUNI_ALPHA, /* U+00d72e: */
+ RTUNI_ALPHA, /* U+00d72f: */
+ RTUNI_ALPHA, /* U+00d730: */
+ RTUNI_ALPHA, /* U+00d731: */
+ RTUNI_ALPHA, /* U+00d732: */
+ RTUNI_ALPHA, /* U+00d733: */
+ RTUNI_ALPHA, /* U+00d734: */
+ RTUNI_ALPHA, /* U+00d735: */
+ RTUNI_ALPHA, /* U+00d736: */
+ RTUNI_ALPHA, /* U+00d737: */
+ RTUNI_ALPHA, /* U+00d738: */
+ RTUNI_ALPHA, /* U+00d739: */
+ RTUNI_ALPHA, /* U+00d73a: */
+ RTUNI_ALPHA, /* U+00d73b: */
+ RTUNI_ALPHA, /* U+00d73c: */
+ RTUNI_ALPHA, /* U+00d73d: */
+ RTUNI_ALPHA, /* U+00d73e: */
+ RTUNI_ALPHA, /* U+00d73f: */
+ RTUNI_ALPHA, /* U+00d740: */
+ RTUNI_ALPHA, /* U+00d741: */
+ RTUNI_ALPHA, /* U+00d742: */
+ RTUNI_ALPHA, /* U+00d743: */
+ RTUNI_ALPHA, /* U+00d744: */
+ RTUNI_ALPHA, /* U+00d745: */
+ RTUNI_ALPHA, /* U+00d746: */
+ RTUNI_ALPHA, /* U+00d747: */
+ RTUNI_ALPHA, /* U+00d748: */
+ RTUNI_ALPHA, /* U+00d749: */
+ RTUNI_ALPHA, /* U+00d74a: */
+ RTUNI_ALPHA, /* U+00d74b: */
+ RTUNI_ALPHA, /* U+00d74c: */
+ RTUNI_ALPHA, /* U+00d74d: */
+ RTUNI_ALPHA, /* U+00d74e: */
+ RTUNI_ALPHA, /* U+00d74f: */
+ RTUNI_ALPHA, /* U+00d750: */
+ RTUNI_ALPHA, /* U+00d751: */
+ RTUNI_ALPHA, /* U+00d752: */
+ RTUNI_ALPHA, /* U+00d753: */
+ RTUNI_ALPHA, /* U+00d754: */
+ RTUNI_ALPHA, /* U+00d755: */
+ RTUNI_ALPHA, /* U+00d756: */
+ RTUNI_ALPHA, /* U+00d757: */
+ RTUNI_ALPHA, /* U+00d758: */
+ RTUNI_ALPHA, /* U+00d759: */
+ RTUNI_ALPHA, /* U+00d75a: */
+ RTUNI_ALPHA, /* U+00d75b: */
+ RTUNI_ALPHA, /* U+00d75c: */
+ RTUNI_ALPHA, /* U+00d75d: */
+ RTUNI_ALPHA, /* U+00d75e: */
+ RTUNI_ALPHA, /* U+00d75f: */
+ RTUNI_ALPHA, /* U+00d760: */
+ RTUNI_ALPHA, /* U+00d761: */
+ RTUNI_ALPHA, /* U+00d762: */
+ RTUNI_ALPHA, /* U+00d763: */
+ RTUNI_ALPHA, /* U+00d764: */
+ RTUNI_ALPHA, /* U+00d765: */
+ RTUNI_ALPHA, /* U+00d766: */
+ RTUNI_ALPHA, /* U+00d767: */
+ RTUNI_ALPHA, /* U+00d768: */
+ RTUNI_ALPHA, /* U+00d769: */
+ RTUNI_ALPHA, /* U+00d76a: */
+ RTUNI_ALPHA, /* U+00d76b: */
+ RTUNI_ALPHA, /* U+00d76c: */
+ RTUNI_ALPHA, /* U+00d76d: */
+ RTUNI_ALPHA, /* U+00d76e: */
+ RTUNI_ALPHA, /* U+00d76f: */
+ RTUNI_ALPHA, /* U+00d770: */
+ RTUNI_ALPHA, /* U+00d771: */
+ RTUNI_ALPHA, /* U+00d772: */
+ RTUNI_ALPHA, /* U+00d773: */
+ RTUNI_ALPHA, /* U+00d774: */
+ RTUNI_ALPHA, /* U+00d775: */
+ RTUNI_ALPHA, /* U+00d776: */
+ RTUNI_ALPHA, /* U+00d777: */
+ RTUNI_ALPHA, /* U+00d778: */
+ RTUNI_ALPHA, /* U+00d779: */
+ RTUNI_ALPHA, /* U+00d77a: */
+ RTUNI_ALPHA, /* U+00d77b: */
+ RTUNI_ALPHA, /* U+00d77c: */
+ RTUNI_ALPHA, /* U+00d77d: */
+ RTUNI_ALPHA, /* U+00d77e: */
+ RTUNI_ALPHA, /* U+00d77f: */
+ RTUNI_ALPHA, /* U+00d780: */
+ RTUNI_ALPHA, /* U+00d781: */
+ RTUNI_ALPHA, /* U+00d782: */
+ RTUNI_ALPHA, /* U+00d783: */
+ RTUNI_ALPHA, /* U+00d784: */
+ RTUNI_ALPHA, /* U+00d785: */
+ RTUNI_ALPHA, /* U+00d786: */
+ RTUNI_ALPHA, /* U+00d787: */
+ RTUNI_ALPHA, /* U+00d788: */
+ RTUNI_ALPHA, /* U+00d789: */
+ RTUNI_ALPHA, /* U+00d78a: */
+ RTUNI_ALPHA, /* U+00d78b: */
+ RTUNI_ALPHA, /* U+00d78c: */
+ RTUNI_ALPHA, /* U+00d78d: */
+ RTUNI_ALPHA, /* U+00d78e: */
+ RTUNI_ALPHA, /* U+00d78f: */
+ RTUNI_ALPHA, /* U+00d790: */
+ RTUNI_ALPHA, /* U+00d791: */
+ RTUNI_ALPHA, /* U+00d792: */
+ RTUNI_ALPHA, /* U+00d793: */
+ RTUNI_ALPHA, /* U+00d794: */
+ RTUNI_ALPHA, /* U+00d795: */
+ RTUNI_ALPHA, /* U+00d796: */
+ RTUNI_ALPHA, /* U+00d797: */
+ RTUNI_ALPHA, /* U+00d798: */
+ RTUNI_ALPHA, /* U+00d799: */
+ RTUNI_ALPHA, /* U+00d79a: */
+ RTUNI_ALPHA, /* U+00d79b: */
+ RTUNI_ALPHA, /* U+00d79c: */
+ RTUNI_ALPHA, /* U+00d79d: */
+ RTUNI_ALPHA, /* U+00d79e: */
+ RTUNI_ALPHA, /* U+00d79f: */
+ RTUNI_ALPHA, /* U+00d7a0: */
+ RTUNI_ALPHA, /* U+00d7a1: */
+ RTUNI_ALPHA, /* U+00d7a2: */
+ RTUNI_ALPHA, /* U+00d7a3: <Hangul Syllable, Last>*/
+ 0, /* U+00d7a4: */
+ 0, /* U+00d7a5: */
+ 0, /* U+00d7a6: */
+ 0, /* U+00d7a7: */
+ 0, /* U+00d7a8: */
+ 0, /* U+00d7a9: */
+ 0, /* U+00d7aa: */
+ 0, /* U+00d7ab: */
+ 0, /* U+00d7ac: */
+ 0, /* U+00d7ad: */
+ 0, /* U+00d7ae: */
+ 0, /* U+00d7af: */
+ RTUNI_ALPHA, /* U+00d7b0: HANGUL JUNGSEONG O-YEO*/
+ RTUNI_ALPHA, /* U+00d7b1: HANGUL JUNGSEONG O-O-I*/
+ RTUNI_ALPHA, /* U+00d7b2: HANGUL JUNGSEONG YO-A*/
+ RTUNI_ALPHA, /* U+00d7b3: HANGUL JUNGSEONG YO-AE*/
+ RTUNI_ALPHA, /* U+00d7b4: HANGUL JUNGSEONG YO-EO*/
+ RTUNI_ALPHA, /* U+00d7b5: HANGUL JUNGSEONG U-YEO*/
+ RTUNI_ALPHA, /* U+00d7b6: HANGUL JUNGSEONG U-I-I*/
+ RTUNI_ALPHA, /* U+00d7b7: HANGUL JUNGSEONG YU-AE*/
+ RTUNI_ALPHA, /* U+00d7b8: HANGUL JUNGSEONG YU-O*/
+ RTUNI_ALPHA, /* U+00d7b9: HANGUL JUNGSEONG EU-A*/
+ RTUNI_ALPHA, /* U+00d7ba: HANGUL JUNGSEONG EU-EO*/
+ RTUNI_ALPHA, /* U+00d7bb: HANGUL JUNGSEONG EU-E*/
+ RTUNI_ALPHA, /* U+00d7bc: HANGUL JUNGSEONG EU-O*/
+ RTUNI_ALPHA, /* U+00d7bd: HANGUL JUNGSEONG I-YA-O*/
+ RTUNI_ALPHA, /* U+00d7be: HANGUL JUNGSEONG I-YAE*/
+ RTUNI_ALPHA, /* U+00d7bf: HANGUL JUNGSEONG I-YEO*/
+ RTUNI_ALPHA, /* U+00d7c0: HANGUL JUNGSEONG I-YE*/
+ RTUNI_ALPHA, /* U+00d7c1: HANGUL JUNGSEONG I-O-I*/
+ RTUNI_ALPHA, /* U+00d7c2: HANGUL JUNGSEONG I-YO*/
+ RTUNI_ALPHA, /* U+00d7c3: HANGUL JUNGSEONG I-YU*/
+ RTUNI_ALPHA, /* U+00d7c4: HANGUL JUNGSEONG I-I*/
+ RTUNI_ALPHA, /* U+00d7c5: HANGUL JUNGSEONG ARAEA-A*/
+ RTUNI_ALPHA, /* U+00d7c6: HANGUL JUNGSEONG ARAEA-E*/
+ 0, /* U+00d7c7: */
+ 0, /* U+00d7c8: */
+ 0, /* U+00d7c9: */
+ 0, /* U+00d7ca: */
+ RTUNI_ALPHA, /* U+00d7cb: HANGUL JONGSEONG NIEUN-RIEUL*/
+ RTUNI_ALPHA, /* U+00d7cc: HANGUL JONGSEONG NIEUN-CHIEUCH*/
+ RTUNI_ALPHA, /* U+00d7cd: HANGUL JONGSEONG SSANGTIKEUT*/
+ RTUNI_ALPHA, /* U+00d7ce: HANGUL JONGSEONG SSANGTIKEUT-PIEUP*/
+ RTUNI_ALPHA, /* U+00d7cf: HANGUL JONGSEONG TIKEUT-PIEUP*/
+ RTUNI_ALPHA, /* U+00d7d0: HANGUL JONGSEONG TIKEUT-SIOS*/
+ RTUNI_ALPHA, /* U+00d7d1: HANGUL JONGSEONG TIKEUT-SIOS-KIYEOK*/
+ RTUNI_ALPHA, /* U+00d7d2: HANGUL JONGSEONG TIKEUT-CIEUC*/
+ RTUNI_ALPHA, /* U+00d7d3: HANGUL JONGSEONG TIKEUT-CHIEUCH*/
+ RTUNI_ALPHA, /* U+00d7d4: HANGUL JONGSEONG TIKEUT-THIEUTH*/
+ RTUNI_ALPHA, /* U+00d7d5: HANGUL JONGSEONG RIEUL-SSANGKIYEOK*/
+ RTUNI_ALPHA, /* U+00d7d6: HANGUL JONGSEONG RIEUL-KIYEOK-HIEUH*/
+ RTUNI_ALPHA, /* U+00d7d7: HANGUL JONGSEONG SSANGRIEUL-KHIEUKH*/
+ RTUNI_ALPHA, /* U+00d7d8: HANGUL JONGSEONG RIEUL-MIEUM-HIEUH*/
+ RTUNI_ALPHA, /* U+00d7d9: HANGUL JONGSEONG RIEUL-PIEUP-TIKEUT*/
+ RTUNI_ALPHA, /* U+00d7da: HANGUL JONGSEONG RIEUL-PIEUP-PHIEUPH*/
+ RTUNI_ALPHA, /* U+00d7db: HANGUL JONGSEONG RIEUL-YESIEUNG*/
+ RTUNI_ALPHA, /* U+00d7dc: HANGUL JONGSEONG RIEUL-YEORINHIEUH-HIEUH*/
+ RTUNI_ALPHA, /* U+00d7dd: HANGUL JONGSEONG KAPYEOUNRIEUL*/
+ RTUNI_ALPHA, /* U+00d7de: HANGUL JONGSEONG MIEUM-NIEUN*/
+ RTUNI_ALPHA, /* U+00d7df: HANGUL JONGSEONG MIEUM-SSANGNIEUN*/
+ RTUNI_ALPHA, /* U+00d7e0: HANGUL JONGSEONG SSANGMIEUM*/
+ RTUNI_ALPHA, /* U+00d7e1: HANGUL JONGSEONG MIEUM-PIEUP-SIOS*/
+ RTUNI_ALPHA, /* U+00d7e2: HANGUL JONGSEONG MIEUM-CIEUC*/
+ RTUNI_ALPHA, /* U+00d7e3: HANGUL JONGSEONG PIEUP-TIKEUT*/
+ RTUNI_ALPHA, /* U+00d7e4: HANGUL JONGSEONG PIEUP-RIEUL-PHIEUPH*/
+ RTUNI_ALPHA, /* U+00d7e5: HANGUL JONGSEONG PIEUP-MIEUM*/
+ RTUNI_ALPHA, /* U+00d7e6: HANGUL JONGSEONG SSANGPIEUP*/
+ RTUNI_ALPHA, /* U+00d7e7: HANGUL JONGSEONG PIEUP-SIOS-TIKEUT*/
+ RTUNI_ALPHA, /* U+00d7e8: HANGUL JONGSEONG PIEUP-CIEUC*/
+ RTUNI_ALPHA, /* U+00d7e9: HANGUL JONGSEONG PIEUP-CHIEUCH*/
+ RTUNI_ALPHA, /* U+00d7ea: HANGUL JONGSEONG SIOS-MIEUM*/
+ RTUNI_ALPHA, /* U+00d7eb: HANGUL JONGSEONG SIOS-KAPYEOUNPIEUP*/
+ RTUNI_ALPHA, /* U+00d7ec: HANGUL JONGSEONG SSANGSIOS-KIYEOK*/
+ RTUNI_ALPHA, /* U+00d7ed: HANGUL JONGSEONG SSANGSIOS-TIKEUT*/
+ RTUNI_ALPHA, /* U+00d7ee: HANGUL JONGSEONG SIOS-PANSIOS*/
+ RTUNI_ALPHA, /* U+00d7ef: HANGUL JONGSEONG SIOS-CIEUC*/
+ RTUNI_ALPHA, /* U+00d7f0: HANGUL JONGSEONG SIOS-CHIEUCH*/
+ RTUNI_ALPHA, /* U+00d7f1: HANGUL JONGSEONG SIOS-THIEUTH*/
+ RTUNI_ALPHA, /* U+00d7f2: HANGUL JONGSEONG SIOS-HIEUH*/
+ RTUNI_ALPHA, /* U+00d7f3: HANGUL JONGSEONG PANSIOS-PIEUP*/
+ RTUNI_ALPHA, /* U+00d7f4: HANGUL JONGSEONG PANSIOS-KAPYEOUNPIEUP*/
+ RTUNI_ALPHA, /* U+00d7f5: HANGUL JONGSEONG YESIEUNG-MIEUM*/
+ RTUNI_ALPHA, /* U+00d7f6: HANGUL JONGSEONG YESIEUNG-HIEUH*/
+ RTUNI_ALPHA, /* U+00d7f7: HANGUL JONGSEONG CIEUC-PIEUP*/
+ RTUNI_ALPHA, /* U+00d7f8: HANGUL JONGSEONG CIEUC-SSANGPIEUP*/
+ RTUNI_ALPHA, /* U+00d7f9: HANGUL JONGSEONG SSANGCIEUC*/
+ RTUNI_ALPHA, /* U+00d7fa: HANGUL JONGSEONG PHIEUPH-SIOS*/
+ RTUNI_ALPHA, /* U+00d7fb: HANGUL JONGSEONG PHIEUPH-THIEUTH*/
+};
+
+static const uint8_t g_afRTUniFlags0x00f900[] =
+{
+ RTUNI_ALPHA, /* U+00f900: CJK COMPATIBILITY IDEOGRAPH-F900*/
+ RTUNI_ALPHA, /* U+00f901: CJK COMPATIBILITY IDEOGRAPH-F901*/
+ RTUNI_ALPHA, /* U+00f902: CJK COMPATIBILITY IDEOGRAPH-F902*/
+ RTUNI_ALPHA, /* U+00f903: CJK COMPATIBILITY IDEOGRAPH-F903*/
+ RTUNI_ALPHA, /* U+00f904: CJK COMPATIBILITY IDEOGRAPH-F904*/
+ RTUNI_ALPHA, /* U+00f905: CJK COMPATIBILITY IDEOGRAPH-F905*/
+ RTUNI_ALPHA, /* U+00f906: CJK COMPATIBILITY IDEOGRAPH-F906*/
+ RTUNI_ALPHA, /* U+00f907: CJK COMPATIBILITY IDEOGRAPH-F907*/
+ RTUNI_ALPHA, /* U+00f908: CJK COMPATIBILITY IDEOGRAPH-F908*/
+ RTUNI_ALPHA, /* U+00f909: CJK COMPATIBILITY IDEOGRAPH-F909*/
+ RTUNI_ALPHA, /* U+00f90a: CJK COMPATIBILITY IDEOGRAPH-F90A*/
+ RTUNI_ALPHA, /* U+00f90b: CJK COMPATIBILITY IDEOGRAPH-F90B*/
+ RTUNI_ALPHA, /* U+00f90c: CJK COMPATIBILITY IDEOGRAPH-F90C*/
+ RTUNI_ALPHA, /* U+00f90d: CJK COMPATIBILITY IDEOGRAPH-F90D*/
+ RTUNI_ALPHA, /* U+00f90e: CJK COMPATIBILITY IDEOGRAPH-F90E*/
+ RTUNI_ALPHA, /* U+00f90f: CJK COMPATIBILITY IDEOGRAPH-F90F*/
+ RTUNI_ALPHA, /* U+00f910: CJK COMPATIBILITY IDEOGRAPH-F910*/
+ RTUNI_ALPHA, /* U+00f911: CJK COMPATIBILITY IDEOGRAPH-F911*/
+ RTUNI_ALPHA, /* U+00f912: CJK COMPATIBILITY IDEOGRAPH-F912*/
+ RTUNI_ALPHA, /* U+00f913: CJK COMPATIBILITY IDEOGRAPH-F913*/
+ RTUNI_ALPHA, /* U+00f914: CJK COMPATIBILITY IDEOGRAPH-F914*/
+ RTUNI_ALPHA, /* U+00f915: CJK COMPATIBILITY IDEOGRAPH-F915*/
+ RTUNI_ALPHA, /* U+00f916: CJK COMPATIBILITY IDEOGRAPH-F916*/
+ RTUNI_ALPHA, /* U+00f917: CJK COMPATIBILITY IDEOGRAPH-F917*/
+ RTUNI_ALPHA, /* U+00f918: CJK COMPATIBILITY IDEOGRAPH-F918*/
+ RTUNI_ALPHA, /* U+00f919: CJK COMPATIBILITY IDEOGRAPH-F919*/
+ RTUNI_ALPHA, /* U+00f91a: CJK COMPATIBILITY IDEOGRAPH-F91A*/
+ RTUNI_ALPHA, /* U+00f91b: CJK COMPATIBILITY IDEOGRAPH-F91B*/
+ RTUNI_ALPHA, /* U+00f91c: CJK COMPATIBILITY IDEOGRAPH-F91C*/
+ RTUNI_ALPHA, /* U+00f91d: CJK COMPATIBILITY IDEOGRAPH-F91D*/
+ RTUNI_ALPHA, /* U+00f91e: CJK COMPATIBILITY IDEOGRAPH-F91E*/
+ RTUNI_ALPHA, /* U+00f91f: CJK COMPATIBILITY IDEOGRAPH-F91F*/
+ RTUNI_ALPHA, /* U+00f920: CJK COMPATIBILITY IDEOGRAPH-F920*/
+ RTUNI_ALPHA, /* U+00f921: CJK COMPATIBILITY IDEOGRAPH-F921*/
+ RTUNI_ALPHA, /* U+00f922: CJK COMPATIBILITY IDEOGRAPH-F922*/
+ RTUNI_ALPHA, /* U+00f923: CJK COMPATIBILITY IDEOGRAPH-F923*/
+ RTUNI_ALPHA, /* U+00f924: CJK COMPATIBILITY IDEOGRAPH-F924*/
+ RTUNI_ALPHA, /* U+00f925: CJK COMPATIBILITY IDEOGRAPH-F925*/
+ RTUNI_ALPHA, /* U+00f926: CJK COMPATIBILITY IDEOGRAPH-F926*/
+ RTUNI_ALPHA, /* U+00f927: CJK COMPATIBILITY IDEOGRAPH-F927*/
+ RTUNI_ALPHA, /* U+00f928: CJK COMPATIBILITY IDEOGRAPH-F928*/
+ RTUNI_ALPHA, /* U+00f929: CJK COMPATIBILITY IDEOGRAPH-F929*/
+ RTUNI_ALPHA, /* U+00f92a: CJK COMPATIBILITY IDEOGRAPH-F92A*/
+ RTUNI_ALPHA, /* U+00f92b: CJK COMPATIBILITY IDEOGRAPH-F92B*/
+ RTUNI_ALPHA, /* U+00f92c: CJK COMPATIBILITY IDEOGRAPH-F92C*/
+ RTUNI_ALPHA, /* U+00f92d: CJK COMPATIBILITY IDEOGRAPH-F92D*/
+ RTUNI_ALPHA, /* U+00f92e: CJK COMPATIBILITY IDEOGRAPH-F92E*/
+ RTUNI_ALPHA, /* U+00f92f: CJK COMPATIBILITY IDEOGRAPH-F92F*/
+ RTUNI_ALPHA, /* U+00f930: CJK COMPATIBILITY IDEOGRAPH-F930*/
+ RTUNI_ALPHA, /* U+00f931: CJK COMPATIBILITY IDEOGRAPH-F931*/
+ RTUNI_ALPHA, /* U+00f932: CJK COMPATIBILITY IDEOGRAPH-F932*/
+ RTUNI_ALPHA, /* U+00f933: CJK COMPATIBILITY IDEOGRAPH-F933*/
+ RTUNI_ALPHA, /* U+00f934: CJK COMPATIBILITY IDEOGRAPH-F934*/
+ RTUNI_ALPHA, /* U+00f935: CJK COMPATIBILITY IDEOGRAPH-F935*/
+ RTUNI_ALPHA, /* U+00f936: CJK COMPATIBILITY IDEOGRAPH-F936*/
+ RTUNI_ALPHA, /* U+00f937: CJK COMPATIBILITY IDEOGRAPH-F937*/
+ RTUNI_ALPHA, /* U+00f938: CJK COMPATIBILITY IDEOGRAPH-F938*/
+ RTUNI_ALPHA, /* U+00f939: CJK COMPATIBILITY IDEOGRAPH-F939*/
+ RTUNI_ALPHA, /* U+00f93a: CJK COMPATIBILITY IDEOGRAPH-F93A*/
+ RTUNI_ALPHA, /* U+00f93b: CJK COMPATIBILITY IDEOGRAPH-F93B*/
+ RTUNI_ALPHA, /* U+00f93c: CJK COMPATIBILITY IDEOGRAPH-F93C*/
+ RTUNI_ALPHA, /* U+00f93d: CJK COMPATIBILITY IDEOGRAPH-F93D*/
+ RTUNI_ALPHA, /* U+00f93e: CJK COMPATIBILITY IDEOGRAPH-F93E*/
+ RTUNI_ALPHA, /* U+00f93f: CJK COMPATIBILITY IDEOGRAPH-F93F*/
+ RTUNI_ALPHA, /* U+00f940: CJK COMPATIBILITY IDEOGRAPH-F940*/
+ RTUNI_ALPHA, /* U+00f941: CJK COMPATIBILITY IDEOGRAPH-F941*/
+ RTUNI_ALPHA, /* U+00f942: CJK COMPATIBILITY IDEOGRAPH-F942*/
+ RTUNI_ALPHA, /* U+00f943: CJK COMPATIBILITY IDEOGRAPH-F943*/
+ RTUNI_ALPHA, /* U+00f944: CJK COMPATIBILITY IDEOGRAPH-F944*/
+ RTUNI_ALPHA, /* U+00f945: CJK COMPATIBILITY IDEOGRAPH-F945*/
+ RTUNI_ALPHA, /* U+00f946: CJK COMPATIBILITY IDEOGRAPH-F946*/
+ RTUNI_ALPHA, /* U+00f947: CJK COMPATIBILITY IDEOGRAPH-F947*/
+ RTUNI_ALPHA, /* U+00f948: CJK COMPATIBILITY IDEOGRAPH-F948*/
+ RTUNI_ALPHA, /* U+00f949: CJK COMPATIBILITY IDEOGRAPH-F949*/
+ RTUNI_ALPHA, /* U+00f94a: CJK COMPATIBILITY IDEOGRAPH-F94A*/
+ RTUNI_ALPHA, /* U+00f94b: CJK COMPATIBILITY IDEOGRAPH-F94B*/
+ RTUNI_ALPHA, /* U+00f94c: CJK COMPATIBILITY IDEOGRAPH-F94C*/
+ RTUNI_ALPHA, /* U+00f94d: CJK COMPATIBILITY IDEOGRAPH-F94D*/
+ RTUNI_ALPHA, /* U+00f94e: CJK COMPATIBILITY IDEOGRAPH-F94E*/
+ RTUNI_ALPHA, /* U+00f94f: CJK COMPATIBILITY IDEOGRAPH-F94F*/
+ RTUNI_ALPHA, /* U+00f950: CJK COMPATIBILITY IDEOGRAPH-F950*/
+ RTUNI_ALPHA, /* U+00f951: CJK COMPATIBILITY IDEOGRAPH-F951*/
+ RTUNI_ALPHA, /* U+00f952: CJK COMPATIBILITY IDEOGRAPH-F952*/
+ RTUNI_ALPHA, /* U+00f953: CJK COMPATIBILITY IDEOGRAPH-F953*/
+ RTUNI_ALPHA, /* U+00f954: CJK COMPATIBILITY IDEOGRAPH-F954*/
+ RTUNI_ALPHA, /* U+00f955: CJK COMPATIBILITY IDEOGRAPH-F955*/
+ RTUNI_ALPHA, /* U+00f956: CJK COMPATIBILITY IDEOGRAPH-F956*/
+ RTUNI_ALPHA, /* U+00f957: CJK COMPATIBILITY IDEOGRAPH-F957*/
+ RTUNI_ALPHA, /* U+00f958: CJK COMPATIBILITY IDEOGRAPH-F958*/
+ RTUNI_ALPHA, /* U+00f959: CJK COMPATIBILITY IDEOGRAPH-F959*/
+ RTUNI_ALPHA, /* U+00f95a: CJK COMPATIBILITY IDEOGRAPH-F95A*/
+ RTUNI_ALPHA, /* U+00f95b: CJK COMPATIBILITY IDEOGRAPH-F95B*/
+ RTUNI_ALPHA, /* U+00f95c: CJK COMPATIBILITY IDEOGRAPH-F95C*/
+ RTUNI_ALPHA, /* U+00f95d: CJK COMPATIBILITY IDEOGRAPH-F95D*/
+ RTUNI_ALPHA, /* U+00f95e: CJK COMPATIBILITY IDEOGRAPH-F95E*/
+ RTUNI_ALPHA, /* U+00f95f: CJK COMPATIBILITY IDEOGRAPH-F95F*/
+ RTUNI_ALPHA, /* U+00f960: CJK COMPATIBILITY IDEOGRAPH-F960*/
+ RTUNI_ALPHA, /* U+00f961: CJK COMPATIBILITY IDEOGRAPH-F961*/
+ RTUNI_ALPHA, /* U+00f962: CJK COMPATIBILITY IDEOGRAPH-F962*/
+ RTUNI_ALPHA, /* U+00f963: CJK COMPATIBILITY IDEOGRAPH-F963*/
+ RTUNI_ALPHA, /* U+00f964: CJK COMPATIBILITY IDEOGRAPH-F964*/
+ RTUNI_ALPHA, /* U+00f965: CJK COMPATIBILITY IDEOGRAPH-F965*/
+ RTUNI_ALPHA, /* U+00f966: CJK COMPATIBILITY IDEOGRAPH-F966*/
+ RTUNI_ALPHA, /* U+00f967: CJK COMPATIBILITY IDEOGRAPH-F967*/
+ RTUNI_ALPHA, /* U+00f968: CJK COMPATIBILITY IDEOGRAPH-F968*/
+ RTUNI_ALPHA, /* U+00f969: CJK COMPATIBILITY IDEOGRAPH-F969*/
+ RTUNI_ALPHA, /* U+00f96a: CJK COMPATIBILITY IDEOGRAPH-F96A*/
+ RTUNI_ALPHA, /* U+00f96b: CJK COMPATIBILITY IDEOGRAPH-F96B*/
+ RTUNI_ALPHA, /* U+00f96c: CJK COMPATIBILITY IDEOGRAPH-F96C*/
+ RTUNI_ALPHA, /* U+00f96d: CJK COMPATIBILITY IDEOGRAPH-F96D*/
+ RTUNI_ALPHA, /* U+00f96e: CJK COMPATIBILITY IDEOGRAPH-F96E*/
+ RTUNI_ALPHA, /* U+00f96f: CJK COMPATIBILITY IDEOGRAPH-F96F*/
+ RTUNI_ALPHA, /* U+00f970: CJK COMPATIBILITY IDEOGRAPH-F970*/
+ RTUNI_ALPHA, /* U+00f971: CJK COMPATIBILITY IDEOGRAPH-F971*/
+ RTUNI_ALPHA, /* U+00f972: CJK COMPATIBILITY IDEOGRAPH-F972*/
+ RTUNI_ALPHA, /* U+00f973: CJK COMPATIBILITY IDEOGRAPH-F973*/
+ RTUNI_ALPHA, /* U+00f974: CJK COMPATIBILITY IDEOGRAPH-F974*/
+ RTUNI_ALPHA, /* U+00f975: CJK COMPATIBILITY IDEOGRAPH-F975*/
+ RTUNI_ALPHA, /* U+00f976: CJK COMPATIBILITY IDEOGRAPH-F976*/
+ RTUNI_ALPHA, /* U+00f977: CJK COMPATIBILITY IDEOGRAPH-F977*/
+ RTUNI_ALPHA, /* U+00f978: CJK COMPATIBILITY IDEOGRAPH-F978*/
+ RTUNI_ALPHA, /* U+00f979: CJK COMPATIBILITY IDEOGRAPH-F979*/
+ RTUNI_ALPHA, /* U+00f97a: CJK COMPATIBILITY IDEOGRAPH-F97A*/
+ RTUNI_ALPHA, /* U+00f97b: CJK COMPATIBILITY IDEOGRAPH-F97B*/
+ RTUNI_ALPHA, /* U+00f97c: CJK COMPATIBILITY IDEOGRAPH-F97C*/
+ RTUNI_ALPHA, /* U+00f97d: CJK COMPATIBILITY IDEOGRAPH-F97D*/
+ RTUNI_ALPHA, /* U+00f97e: CJK COMPATIBILITY IDEOGRAPH-F97E*/
+ RTUNI_ALPHA, /* U+00f97f: CJK COMPATIBILITY IDEOGRAPH-F97F*/
+ RTUNI_ALPHA, /* U+00f980: CJK COMPATIBILITY IDEOGRAPH-F980*/
+ RTUNI_ALPHA, /* U+00f981: CJK COMPATIBILITY IDEOGRAPH-F981*/
+ RTUNI_ALPHA, /* U+00f982: CJK COMPATIBILITY IDEOGRAPH-F982*/
+ RTUNI_ALPHA, /* U+00f983: CJK COMPATIBILITY IDEOGRAPH-F983*/
+ RTUNI_ALPHA, /* U+00f984: CJK COMPATIBILITY IDEOGRAPH-F984*/
+ RTUNI_ALPHA, /* U+00f985: CJK COMPATIBILITY IDEOGRAPH-F985*/
+ RTUNI_ALPHA, /* U+00f986: CJK COMPATIBILITY IDEOGRAPH-F986*/
+ RTUNI_ALPHA, /* U+00f987: CJK COMPATIBILITY IDEOGRAPH-F987*/
+ RTUNI_ALPHA, /* U+00f988: CJK COMPATIBILITY IDEOGRAPH-F988*/
+ RTUNI_ALPHA, /* U+00f989: CJK COMPATIBILITY IDEOGRAPH-F989*/
+ RTUNI_ALPHA, /* U+00f98a: CJK COMPATIBILITY IDEOGRAPH-F98A*/
+ RTUNI_ALPHA, /* U+00f98b: CJK COMPATIBILITY IDEOGRAPH-F98B*/
+ RTUNI_ALPHA, /* U+00f98c: CJK COMPATIBILITY IDEOGRAPH-F98C*/
+ RTUNI_ALPHA, /* U+00f98d: CJK COMPATIBILITY IDEOGRAPH-F98D*/
+ RTUNI_ALPHA, /* U+00f98e: CJK COMPATIBILITY IDEOGRAPH-F98E*/
+ RTUNI_ALPHA, /* U+00f98f: CJK COMPATIBILITY IDEOGRAPH-F98F*/
+ RTUNI_ALPHA, /* U+00f990: CJK COMPATIBILITY IDEOGRAPH-F990*/
+ RTUNI_ALPHA, /* U+00f991: CJK COMPATIBILITY IDEOGRAPH-F991*/
+ RTUNI_ALPHA, /* U+00f992: CJK COMPATIBILITY IDEOGRAPH-F992*/
+ RTUNI_ALPHA, /* U+00f993: CJK COMPATIBILITY IDEOGRAPH-F993*/
+ RTUNI_ALPHA, /* U+00f994: CJK COMPATIBILITY IDEOGRAPH-F994*/
+ RTUNI_ALPHA, /* U+00f995: CJK COMPATIBILITY IDEOGRAPH-F995*/
+ RTUNI_ALPHA, /* U+00f996: CJK COMPATIBILITY IDEOGRAPH-F996*/
+ RTUNI_ALPHA, /* U+00f997: CJK COMPATIBILITY IDEOGRAPH-F997*/
+ RTUNI_ALPHA, /* U+00f998: CJK COMPATIBILITY IDEOGRAPH-F998*/
+ RTUNI_ALPHA, /* U+00f999: CJK COMPATIBILITY IDEOGRAPH-F999*/
+ RTUNI_ALPHA, /* U+00f99a: CJK COMPATIBILITY IDEOGRAPH-F99A*/
+ RTUNI_ALPHA, /* U+00f99b: CJK COMPATIBILITY IDEOGRAPH-F99B*/
+ RTUNI_ALPHA, /* U+00f99c: CJK COMPATIBILITY IDEOGRAPH-F99C*/
+ RTUNI_ALPHA, /* U+00f99d: CJK COMPATIBILITY IDEOGRAPH-F99D*/
+ RTUNI_ALPHA, /* U+00f99e: CJK COMPATIBILITY IDEOGRAPH-F99E*/
+ RTUNI_ALPHA, /* U+00f99f: CJK COMPATIBILITY IDEOGRAPH-F99F*/
+ RTUNI_ALPHA, /* U+00f9a0: CJK COMPATIBILITY IDEOGRAPH-F9A0*/
+ RTUNI_ALPHA, /* U+00f9a1: CJK COMPATIBILITY IDEOGRAPH-F9A1*/
+ RTUNI_ALPHA, /* U+00f9a2: CJK COMPATIBILITY IDEOGRAPH-F9A2*/
+ RTUNI_ALPHA, /* U+00f9a3: CJK COMPATIBILITY IDEOGRAPH-F9A3*/
+ RTUNI_ALPHA, /* U+00f9a4: CJK COMPATIBILITY IDEOGRAPH-F9A4*/
+ RTUNI_ALPHA, /* U+00f9a5: CJK COMPATIBILITY IDEOGRAPH-F9A5*/
+ RTUNI_ALPHA, /* U+00f9a6: CJK COMPATIBILITY IDEOGRAPH-F9A6*/
+ RTUNI_ALPHA, /* U+00f9a7: CJK COMPATIBILITY IDEOGRAPH-F9A7*/
+ RTUNI_ALPHA, /* U+00f9a8: CJK COMPATIBILITY IDEOGRAPH-F9A8*/
+ RTUNI_ALPHA, /* U+00f9a9: CJK COMPATIBILITY IDEOGRAPH-F9A9*/
+ RTUNI_ALPHA, /* U+00f9aa: CJK COMPATIBILITY IDEOGRAPH-F9AA*/
+ RTUNI_ALPHA, /* U+00f9ab: CJK COMPATIBILITY IDEOGRAPH-F9AB*/
+ RTUNI_ALPHA, /* U+00f9ac: CJK COMPATIBILITY IDEOGRAPH-F9AC*/
+ RTUNI_ALPHA, /* U+00f9ad: CJK COMPATIBILITY IDEOGRAPH-F9AD*/
+ RTUNI_ALPHA, /* U+00f9ae: CJK COMPATIBILITY IDEOGRAPH-F9AE*/
+ RTUNI_ALPHA, /* U+00f9af: CJK COMPATIBILITY IDEOGRAPH-F9AF*/
+ RTUNI_ALPHA, /* U+00f9b0: CJK COMPATIBILITY IDEOGRAPH-F9B0*/
+ RTUNI_ALPHA, /* U+00f9b1: CJK COMPATIBILITY IDEOGRAPH-F9B1*/
+ RTUNI_ALPHA, /* U+00f9b2: CJK COMPATIBILITY IDEOGRAPH-F9B2*/
+ RTUNI_ALPHA, /* U+00f9b3: CJK COMPATIBILITY IDEOGRAPH-F9B3*/
+ RTUNI_ALPHA, /* U+00f9b4: CJK COMPATIBILITY IDEOGRAPH-F9B4*/
+ RTUNI_ALPHA, /* U+00f9b5: CJK COMPATIBILITY IDEOGRAPH-F9B5*/
+ RTUNI_ALPHA, /* U+00f9b6: CJK COMPATIBILITY IDEOGRAPH-F9B6*/
+ RTUNI_ALPHA, /* U+00f9b7: CJK COMPATIBILITY IDEOGRAPH-F9B7*/
+ RTUNI_ALPHA, /* U+00f9b8: CJK COMPATIBILITY IDEOGRAPH-F9B8*/
+ RTUNI_ALPHA, /* U+00f9b9: CJK COMPATIBILITY IDEOGRAPH-F9B9*/
+ RTUNI_ALPHA, /* U+00f9ba: CJK COMPATIBILITY IDEOGRAPH-F9BA*/
+ RTUNI_ALPHA, /* U+00f9bb: CJK COMPATIBILITY IDEOGRAPH-F9BB*/
+ RTUNI_ALPHA, /* U+00f9bc: CJK COMPATIBILITY IDEOGRAPH-F9BC*/
+ RTUNI_ALPHA, /* U+00f9bd: CJK COMPATIBILITY IDEOGRAPH-F9BD*/
+ RTUNI_ALPHA, /* U+00f9be: CJK COMPATIBILITY IDEOGRAPH-F9BE*/
+ RTUNI_ALPHA, /* U+00f9bf: CJK COMPATIBILITY IDEOGRAPH-F9BF*/
+ RTUNI_ALPHA, /* U+00f9c0: CJK COMPATIBILITY IDEOGRAPH-F9C0*/
+ RTUNI_ALPHA, /* U+00f9c1: CJK COMPATIBILITY IDEOGRAPH-F9C1*/
+ RTUNI_ALPHA, /* U+00f9c2: CJK COMPATIBILITY IDEOGRAPH-F9C2*/
+ RTUNI_ALPHA, /* U+00f9c3: CJK COMPATIBILITY IDEOGRAPH-F9C3*/
+ RTUNI_ALPHA, /* U+00f9c4: CJK COMPATIBILITY IDEOGRAPH-F9C4*/
+ RTUNI_ALPHA, /* U+00f9c5: CJK COMPATIBILITY IDEOGRAPH-F9C5*/
+ RTUNI_ALPHA, /* U+00f9c6: CJK COMPATIBILITY IDEOGRAPH-F9C6*/
+ RTUNI_ALPHA, /* U+00f9c7: CJK COMPATIBILITY IDEOGRAPH-F9C7*/
+ RTUNI_ALPHA, /* U+00f9c8: CJK COMPATIBILITY IDEOGRAPH-F9C8*/
+ RTUNI_ALPHA, /* U+00f9c9: CJK COMPATIBILITY IDEOGRAPH-F9C9*/
+ RTUNI_ALPHA, /* U+00f9ca: CJK COMPATIBILITY IDEOGRAPH-F9CA*/
+ RTUNI_ALPHA, /* U+00f9cb: CJK COMPATIBILITY IDEOGRAPH-F9CB*/
+ RTUNI_ALPHA, /* U+00f9cc: CJK COMPATIBILITY IDEOGRAPH-F9CC*/
+ RTUNI_ALPHA, /* U+00f9cd: CJK COMPATIBILITY IDEOGRAPH-F9CD*/
+ RTUNI_ALPHA, /* U+00f9ce: CJK COMPATIBILITY IDEOGRAPH-F9CE*/
+ RTUNI_ALPHA, /* U+00f9cf: CJK COMPATIBILITY IDEOGRAPH-F9CF*/
+ RTUNI_ALPHA, /* U+00f9d0: CJK COMPATIBILITY IDEOGRAPH-F9D0*/
+ RTUNI_ALPHA, /* U+00f9d1: CJK COMPATIBILITY IDEOGRAPH-F9D1*/
+ RTUNI_ALPHA, /* U+00f9d2: CJK COMPATIBILITY IDEOGRAPH-F9D2*/
+ RTUNI_ALPHA, /* U+00f9d3: CJK COMPATIBILITY IDEOGRAPH-F9D3*/
+ RTUNI_ALPHA, /* U+00f9d4: CJK COMPATIBILITY IDEOGRAPH-F9D4*/
+ RTUNI_ALPHA, /* U+00f9d5: CJK COMPATIBILITY IDEOGRAPH-F9D5*/
+ RTUNI_ALPHA, /* U+00f9d6: CJK COMPATIBILITY IDEOGRAPH-F9D6*/
+ RTUNI_ALPHA, /* U+00f9d7: CJK COMPATIBILITY IDEOGRAPH-F9D7*/
+ RTUNI_ALPHA, /* U+00f9d8: CJK COMPATIBILITY IDEOGRAPH-F9D8*/
+ RTUNI_ALPHA, /* U+00f9d9: CJK COMPATIBILITY IDEOGRAPH-F9D9*/
+ RTUNI_ALPHA, /* U+00f9da: CJK COMPATIBILITY IDEOGRAPH-F9DA*/
+ RTUNI_ALPHA, /* U+00f9db: CJK COMPATIBILITY IDEOGRAPH-F9DB*/
+ RTUNI_ALPHA, /* U+00f9dc: CJK COMPATIBILITY IDEOGRAPH-F9DC*/
+ RTUNI_ALPHA, /* U+00f9dd: CJK COMPATIBILITY IDEOGRAPH-F9DD*/
+ RTUNI_ALPHA, /* U+00f9de: CJK COMPATIBILITY IDEOGRAPH-F9DE*/
+ RTUNI_ALPHA, /* U+00f9df: CJK COMPATIBILITY IDEOGRAPH-F9DF*/
+ RTUNI_ALPHA, /* U+00f9e0: CJK COMPATIBILITY IDEOGRAPH-F9E0*/
+ RTUNI_ALPHA, /* U+00f9e1: CJK COMPATIBILITY IDEOGRAPH-F9E1*/
+ RTUNI_ALPHA, /* U+00f9e2: CJK COMPATIBILITY IDEOGRAPH-F9E2*/
+ RTUNI_ALPHA, /* U+00f9e3: CJK COMPATIBILITY IDEOGRAPH-F9E3*/
+ RTUNI_ALPHA, /* U+00f9e4: CJK COMPATIBILITY IDEOGRAPH-F9E4*/
+ RTUNI_ALPHA, /* U+00f9e5: CJK COMPATIBILITY IDEOGRAPH-F9E5*/
+ RTUNI_ALPHA, /* U+00f9e6: CJK COMPATIBILITY IDEOGRAPH-F9E6*/
+ RTUNI_ALPHA, /* U+00f9e7: CJK COMPATIBILITY IDEOGRAPH-F9E7*/
+ RTUNI_ALPHA, /* U+00f9e8: CJK COMPATIBILITY IDEOGRAPH-F9E8*/
+ RTUNI_ALPHA, /* U+00f9e9: CJK COMPATIBILITY IDEOGRAPH-F9E9*/
+ RTUNI_ALPHA, /* U+00f9ea: CJK COMPATIBILITY IDEOGRAPH-F9EA*/
+ RTUNI_ALPHA, /* U+00f9eb: CJK COMPATIBILITY IDEOGRAPH-F9EB*/
+ RTUNI_ALPHA, /* U+00f9ec: CJK COMPATIBILITY IDEOGRAPH-F9EC*/
+ RTUNI_ALPHA, /* U+00f9ed: CJK COMPATIBILITY IDEOGRAPH-F9ED*/
+ RTUNI_ALPHA, /* U+00f9ee: CJK COMPATIBILITY IDEOGRAPH-F9EE*/
+ RTUNI_ALPHA, /* U+00f9ef: CJK COMPATIBILITY IDEOGRAPH-F9EF*/
+ RTUNI_ALPHA, /* U+00f9f0: CJK COMPATIBILITY IDEOGRAPH-F9F0*/
+ RTUNI_ALPHA, /* U+00f9f1: CJK COMPATIBILITY IDEOGRAPH-F9F1*/
+ RTUNI_ALPHA, /* U+00f9f2: CJK COMPATIBILITY IDEOGRAPH-F9F2*/
+ RTUNI_ALPHA, /* U+00f9f3: CJK COMPATIBILITY IDEOGRAPH-F9F3*/
+ RTUNI_ALPHA, /* U+00f9f4: CJK COMPATIBILITY IDEOGRAPH-F9F4*/
+ RTUNI_ALPHA, /* U+00f9f5: CJK COMPATIBILITY IDEOGRAPH-F9F5*/
+ RTUNI_ALPHA, /* U+00f9f6: CJK COMPATIBILITY IDEOGRAPH-F9F6*/
+ RTUNI_ALPHA, /* U+00f9f7: CJK COMPATIBILITY IDEOGRAPH-F9F7*/
+ RTUNI_ALPHA, /* U+00f9f8: CJK COMPATIBILITY IDEOGRAPH-F9F8*/
+ RTUNI_ALPHA, /* U+00f9f9: CJK COMPATIBILITY IDEOGRAPH-F9F9*/
+ RTUNI_ALPHA, /* U+00f9fa: CJK COMPATIBILITY IDEOGRAPH-F9FA*/
+ RTUNI_ALPHA, /* U+00f9fb: CJK COMPATIBILITY IDEOGRAPH-F9FB*/
+ RTUNI_ALPHA, /* U+00f9fc: CJK COMPATIBILITY IDEOGRAPH-F9FC*/
+ RTUNI_ALPHA, /* U+00f9fd: CJK COMPATIBILITY IDEOGRAPH-F9FD*/
+ RTUNI_ALPHA, /* U+00f9fe: CJK COMPATIBILITY IDEOGRAPH-F9FE*/
+ RTUNI_ALPHA, /* U+00f9ff: CJK COMPATIBILITY IDEOGRAPH-F9FF*/
+ RTUNI_ALPHA, /* U+00fa00: CJK COMPATIBILITY IDEOGRAPH-FA00*/
+ RTUNI_ALPHA, /* U+00fa01: CJK COMPATIBILITY IDEOGRAPH-FA01*/
+ RTUNI_ALPHA, /* U+00fa02: CJK COMPATIBILITY IDEOGRAPH-FA02*/
+ RTUNI_ALPHA, /* U+00fa03: CJK COMPATIBILITY IDEOGRAPH-FA03*/
+ RTUNI_ALPHA, /* U+00fa04: CJK COMPATIBILITY IDEOGRAPH-FA04*/
+ RTUNI_ALPHA, /* U+00fa05: CJK COMPATIBILITY IDEOGRAPH-FA05*/
+ RTUNI_ALPHA, /* U+00fa06: CJK COMPATIBILITY IDEOGRAPH-FA06*/
+ RTUNI_ALPHA, /* U+00fa07: CJK COMPATIBILITY IDEOGRAPH-FA07*/
+ RTUNI_ALPHA, /* U+00fa08: CJK COMPATIBILITY IDEOGRAPH-FA08*/
+ RTUNI_ALPHA, /* U+00fa09: CJK COMPATIBILITY IDEOGRAPH-FA09*/
+ RTUNI_ALPHA, /* U+00fa0a: CJK COMPATIBILITY IDEOGRAPH-FA0A*/
+ RTUNI_ALPHA, /* U+00fa0b: CJK COMPATIBILITY IDEOGRAPH-FA0B*/
+ RTUNI_ALPHA, /* U+00fa0c: CJK COMPATIBILITY IDEOGRAPH-FA0C*/
+ RTUNI_ALPHA, /* U+00fa0d: CJK COMPATIBILITY IDEOGRAPH-FA0D*/
+ RTUNI_ALPHA, /* U+00fa0e: CJK COMPATIBILITY IDEOGRAPH-FA0E*/
+ RTUNI_ALPHA, /* U+00fa0f: CJK COMPATIBILITY IDEOGRAPH-FA0F*/
+ RTUNI_ALPHA, /* U+00fa10: CJK COMPATIBILITY IDEOGRAPH-FA10*/
+ RTUNI_ALPHA, /* U+00fa11: CJK COMPATIBILITY IDEOGRAPH-FA11*/
+ RTUNI_ALPHA, /* U+00fa12: CJK COMPATIBILITY IDEOGRAPH-FA12*/
+ RTUNI_ALPHA, /* U+00fa13: CJK COMPATIBILITY IDEOGRAPH-FA13*/
+ RTUNI_ALPHA, /* U+00fa14: CJK COMPATIBILITY IDEOGRAPH-FA14*/
+ RTUNI_ALPHA, /* U+00fa15: CJK COMPATIBILITY IDEOGRAPH-FA15*/
+ RTUNI_ALPHA, /* U+00fa16: CJK COMPATIBILITY IDEOGRAPH-FA16*/
+ RTUNI_ALPHA, /* U+00fa17: CJK COMPATIBILITY IDEOGRAPH-FA17*/
+ RTUNI_ALPHA, /* U+00fa18: CJK COMPATIBILITY IDEOGRAPH-FA18*/
+ RTUNI_ALPHA, /* U+00fa19: CJK COMPATIBILITY IDEOGRAPH-FA19*/
+ RTUNI_ALPHA, /* U+00fa1a: CJK COMPATIBILITY IDEOGRAPH-FA1A*/
+ RTUNI_ALPHA, /* U+00fa1b: CJK COMPATIBILITY IDEOGRAPH-FA1B*/
+ RTUNI_ALPHA, /* U+00fa1c: CJK COMPATIBILITY IDEOGRAPH-FA1C*/
+ RTUNI_ALPHA, /* U+00fa1d: CJK COMPATIBILITY IDEOGRAPH-FA1D*/
+ RTUNI_ALPHA, /* U+00fa1e: CJK COMPATIBILITY IDEOGRAPH-FA1E*/
+ RTUNI_ALPHA, /* U+00fa1f: CJK COMPATIBILITY IDEOGRAPH-FA1F*/
+ RTUNI_ALPHA, /* U+00fa20: CJK COMPATIBILITY IDEOGRAPH-FA20*/
+ RTUNI_ALPHA, /* U+00fa21: CJK COMPATIBILITY IDEOGRAPH-FA21*/
+ RTUNI_ALPHA, /* U+00fa22: CJK COMPATIBILITY IDEOGRAPH-FA22*/
+ RTUNI_ALPHA, /* U+00fa23: CJK COMPATIBILITY IDEOGRAPH-FA23*/
+ RTUNI_ALPHA, /* U+00fa24: CJK COMPATIBILITY IDEOGRAPH-FA24*/
+ RTUNI_ALPHA, /* U+00fa25: CJK COMPATIBILITY IDEOGRAPH-FA25*/
+ RTUNI_ALPHA, /* U+00fa26: CJK COMPATIBILITY IDEOGRAPH-FA26*/
+ RTUNI_ALPHA, /* U+00fa27: CJK COMPATIBILITY IDEOGRAPH-FA27*/
+ RTUNI_ALPHA, /* U+00fa28: CJK COMPATIBILITY IDEOGRAPH-FA28*/
+ RTUNI_ALPHA, /* U+00fa29: CJK COMPATIBILITY IDEOGRAPH-FA29*/
+ RTUNI_ALPHA, /* U+00fa2a: CJK COMPATIBILITY IDEOGRAPH-FA2A*/
+ RTUNI_ALPHA, /* U+00fa2b: CJK COMPATIBILITY IDEOGRAPH-FA2B*/
+ RTUNI_ALPHA, /* U+00fa2c: CJK COMPATIBILITY IDEOGRAPH-FA2C*/
+ RTUNI_ALPHA, /* U+00fa2d: CJK COMPATIBILITY IDEOGRAPH-FA2D*/
+ RTUNI_ALPHA, /* U+00fa2e: CJK COMPATIBILITY IDEOGRAPH-FA2E*/
+ RTUNI_ALPHA, /* U+00fa2f: CJK COMPATIBILITY IDEOGRAPH-FA2F*/
+ RTUNI_ALPHA, /* U+00fa30: CJK COMPATIBILITY IDEOGRAPH-FA30*/
+ RTUNI_ALPHA, /* U+00fa31: CJK COMPATIBILITY IDEOGRAPH-FA31*/
+ RTUNI_ALPHA, /* U+00fa32: CJK COMPATIBILITY IDEOGRAPH-FA32*/
+ RTUNI_ALPHA, /* U+00fa33: CJK COMPATIBILITY IDEOGRAPH-FA33*/
+ RTUNI_ALPHA, /* U+00fa34: CJK COMPATIBILITY IDEOGRAPH-FA34*/
+ RTUNI_ALPHA, /* U+00fa35: CJK COMPATIBILITY IDEOGRAPH-FA35*/
+ RTUNI_ALPHA, /* U+00fa36: CJK COMPATIBILITY IDEOGRAPH-FA36*/
+ RTUNI_ALPHA, /* U+00fa37: CJK COMPATIBILITY IDEOGRAPH-FA37*/
+ RTUNI_ALPHA, /* U+00fa38: CJK COMPATIBILITY IDEOGRAPH-FA38*/
+ RTUNI_ALPHA, /* U+00fa39: CJK COMPATIBILITY IDEOGRAPH-FA39*/
+ RTUNI_ALPHA, /* U+00fa3a: CJK COMPATIBILITY IDEOGRAPH-FA3A*/
+ RTUNI_ALPHA, /* U+00fa3b: CJK COMPATIBILITY IDEOGRAPH-FA3B*/
+ RTUNI_ALPHA, /* U+00fa3c: CJK COMPATIBILITY IDEOGRAPH-FA3C*/
+ RTUNI_ALPHA, /* U+00fa3d: CJK COMPATIBILITY IDEOGRAPH-FA3D*/
+ RTUNI_ALPHA, /* U+00fa3e: CJK COMPATIBILITY IDEOGRAPH-FA3E*/
+ RTUNI_ALPHA, /* U+00fa3f: CJK COMPATIBILITY IDEOGRAPH-FA3F*/
+ RTUNI_ALPHA, /* U+00fa40: CJK COMPATIBILITY IDEOGRAPH-FA40*/
+ RTUNI_ALPHA, /* U+00fa41: CJK COMPATIBILITY IDEOGRAPH-FA41*/
+ RTUNI_ALPHA, /* U+00fa42: CJK COMPATIBILITY IDEOGRAPH-FA42*/
+ RTUNI_ALPHA, /* U+00fa43: CJK COMPATIBILITY IDEOGRAPH-FA43*/
+ RTUNI_ALPHA, /* U+00fa44: CJK COMPATIBILITY IDEOGRAPH-FA44*/
+ RTUNI_ALPHA, /* U+00fa45: CJK COMPATIBILITY IDEOGRAPH-FA45*/
+ RTUNI_ALPHA, /* U+00fa46: CJK COMPATIBILITY IDEOGRAPH-FA46*/
+ RTUNI_ALPHA, /* U+00fa47: CJK COMPATIBILITY IDEOGRAPH-FA47*/
+ RTUNI_ALPHA, /* U+00fa48: CJK COMPATIBILITY IDEOGRAPH-FA48*/
+ RTUNI_ALPHA, /* U+00fa49: CJK COMPATIBILITY IDEOGRAPH-FA49*/
+ RTUNI_ALPHA, /* U+00fa4a: CJK COMPATIBILITY IDEOGRAPH-FA4A*/
+ RTUNI_ALPHA, /* U+00fa4b: CJK COMPATIBILITY IDEOGRAPH-FA4B*/
+ RTUNI_ALPHA, /* U+00fa4c: CJK COMPATIBILITY IDEOGRAPH-FA4C*/
+ RTUNI_ALPHA, /* U+00fa4d: CJK COMPATIBILITY IDEOGRAPH-FA4D*/
+ RTUNI_ALPHA, /* U+00fa4e: CJK COMPATIBILITY IDEOGRAPH-FA4E*/
+ RTUNI_ALPHA, /* U+00fa4f: CJK COMPATIBILITY IDEOGRAPH-FA4F*/
+ RTUNI_ALPHA, /* U+00fa50: CJK COMPATIBILITY IDEOGRAPH-FA50*/
+ RTUNI_ALPHA, /* U+00fa51: CJK COMPATIBILITY IDEOGRAPH-FA51*/
+ RTUNI_ALPHA, /* U+00fa52: CJK COMPATIBILITY IDEOGRAPH-FA52*/
+ RTUNI_ALPHA, /* U+00fa53: CJK COMPATIBILITY IDEOGRAPH-FA53*/
+ RTUNI_ALPHA, /* U+00fa54: CJK COMPATIBILITY IDEOGRAPH-FA54*/
+ RTUNI_ALPHA, /* U+00fa55: CJK COMPATIBILITY IDEOGRAPH-FA55*/
+ RTUNI_ALPHA, /* U+00fa56: CJK COMPATIBILITY IDEOGRAPH-FA56*/
+ RTUNI_ALPHA, /* U+00fa57: CJK COMPATIBILITY IDEOGRAPH-FA57*/
+ RTUNI_ALPHA, /* U+00fa58: CJK COMPATIBILITY IDEOGRAPH-FA58*/
+ RTUNI_ALPHA, /* U+00fa59: CJK COMPATIBILITY IDEOGRAPH-FA59*/
+ RTUNI_ALPHA, /* U+00fa5a: CJK COMPATIBILITY IDEOGRAPH-FA5A*/
+ RTUNI_ALPHA, /* U+00fa5b: CJK COMPATIBILITY IDEOGRAPH-FA5B*/
+ RTUNI_ALPHA, /* U+00fa5c: CJK COMPATIBILITY IDEOGRAPH-FA5C*/
+ RTUNI_ALPHA, /* U+00fa5d: CJK COMPATIBILITY IDEOGRAPH-FA5D*/
+ RTUNI_ALPHA, /* U+00fa5e: CJK COMPATIBILITY IDEOGRAPH-FA5E*/
+ RTUNI_ALPHA, /* U+00fa5f: CJK COMPATIBILITY IDEOGRAPH-FA5F*/
+ RTUNI_ALPHA, /* U+00fa60: CJK COMPATIBILITY IDEOGRAPH-FA60*/
+ RTUNI_ALPHA, /* U+00fa61: CJK COMPATIBILITY IDEOGRAPH-FA61*/
+ RTUNI_ALPHA, /* U+00fa62: CJK COMPATIBILITY IDEOGRAPH-FA62*/
+ RTUNI_ALPHA, /* U+00fa63: CJK COMPATIBILITY IDEOGRAPH-FA63*/
+ RTUNI_ALPHA, /* U+00fa64: CJK COMPATIBILITY IDEOGRAPH-FA64*/
+ RTUNI_ALPHA, /* U+00fa65: CJK COMPATIBILITY IDEOGRAPH-FA65*/
+ RTUNI_ALPHA, /* U+00fa66: CJK COMPATIBILITY IDEOGRAPH-FA66*/
+ RTUNI_ALPHA, /* U+00fa67: CJK COMPATIBILITY IDEOGRAPH-FA67*/
+ RTUNI_ALPHA, /* U+00fa68: CJK COMPATIBILITY IDEOGRAPH-FA68*/
+ RTUNI_ALPHA, /* U+00fa69: CJK COMPATIBILITY IDEOGRAPH-FA69*/
+ RTUNI_ALPHA, /* U+00fa6a: CJK COMPATIBILITY IDEOGRAPH-FA6A*/
+ RTUNI_ALPHA, /* U+00fa6b: CJK COMPATIBILITY IDEOGRAPH-FA6B*/
+ RTUNI_ALPHA, /* U+00fa6c: CJK COMPATIBILITY IDEOGRAPH-FA6C*/
+ RTUNI_ALPHA, /* U+00fa6d: CJK COMPATIBILITY IDEOGRAPH-FA6D*/
+ 0, /* U+00fa6e: */
+ 0, /* U+00fa6f: */
+ RTUNI_ALPHA, /* U+00fa70: CJK COMPATIBILITY IDEOGRAPH-FA70*/
+ RTUNI_ALPHA, /* U+00fa71: CJK COMPATIBILITY IDEOGRAPH-FA71*/
+ RTUNI_ALPHA, /* U+00fa72: CJK COMPATIBILITY IDEOGRAPH-FA72*/
+ RTUNI_ALPHA, /* U+00fa73: CJK COMPATIBILITY IDEOGRAPH-FA73*/
+ RTUNI_ALPHA, /* U+00fa74: CJK COMPATIBILITY IDEOGRAPH-FA74*/
+ RTUNI_ALPHA, /* U+00fa75: CJK COMPATIBILITY IDEOGRAPH-FA75*/
+ RTUNI_ALPHA, /* U+00fa76: CJK COMPATIBILITY IDEOGRAPH-FA76*/
+ RTUNI_ALPHA, /* U+00fa77: CJK COMPATIBILITY IDEOGRAPH-FA77*/
+ RTUNI_ALPHA, /* U+00fa78: CJK COMPATIBILITY IDEOGRAPH-FA78*/
+ RTUNI_ALPHA, /* U+00fa79: CJK COMPATIBILITY IDEOGRAPH-FA79*/
+ RTUNI_ALPHA, /* U+00fa7a: CJK COMPATIBILITY IDEOGRAPH-FA7A*/
+ RTUNI_ALPHA, /* U+00fa7b: CJK COMPATIBILITY IDEOGRAPH-FA7B*/
+ RTUNI_ALPHA, /* U+00fa7c: CJK COMPATIBILITY IDEOGRAPH-FA7C*/
+ RTUNI_ALPHA, /* U+00fa7d: CJK COMPATIBILITY IDEOGRAPH-FA7D*/
+ RTUNI_ALPHA, /* U+00fa7e: CJK COMPATIBILITY IDEOGRAPH-FA7E*/
+ RTUNI_ALPHA, /* U+00fa7f: CJK COMPATIBILITY IDEOGRAPH-FA7F*/
+ RTUNI_ALPHA, /* U+00fa80: CJK COMPATIBILITY IDEOGRAPH-FA80*/
+ RTUNI_ALPHA, /* U+00fa81: CJK COMPATIBILITY IDEOGRAPH-FA81*/
+ RTUNI_ALPHA, /* U+00fa82: CJK COMPATIBILITY IDEOGRAPH-FA82*/
+ RTUNI_ALPHA, /* U+00fa83: CJK COMPATIBILITY IDEOGRAPH-FA83*/
+ RTUNI_ALPHA, /* U+00fa84: CJK COMPATIBILITY IDEOGRAPH-FA84*/
+ RTUNI_ALPHA, /* U+00fa85: CJK COMPATIBILITY IDEOGRAPH-FA85*/
+ RTUNI_ALPHA, /* U+00fa86: CJK COMPATIBILITY IDEOGRAPH-FA86*/
+ RTUNI_ALPHA, /* U+00fa87: CJK COMPATIBILITY IDEOGRAPH-FA87*/
+ RTUNI_ALPHA, /* U+00fa88: CJK COMPATIBILITY IDEOGRAPH-FA88*/
+ RTUNI_ALPHA, /* U+00fa89: CJK COMPATIBILITY IDEOGRAPH-FA89*/
+ RTUNI_ALPHA, /* U+00fa8a: CJK COMPATIBILITY IDEOGRAPH-FA8A*/
+ RTUNI_ALPHA, /* U+00fa8b: CJK COMPATIBILITY IDEOGRAPH-FA8B*/
+ RTUNI_ALPHA, /* U+00fa8c: CJK COMPATIBILITY IDEOGRAPH-FA8C*/
+ RTUNI_ALPHA, /* U+00fa8d: CJK COMPATIBILITY IDEOGRAPH-FA8D*/
+ RTUNI_ALPHA, /* U+00fa8e: CJK COMPATIBILITY IDEOGRAPH-FA8E*/
+ RTUNI_ALPHA, /* U+00fa8f: CJK COMPATIBILITY IDEOGRAPH-FA8F*/
+ RTUNI_ALPHA, /* U+00fa90: CJK COMPATIBILITY IDEOGRAPH-FA90*/
+ RTUNI_ALPHA, /* U+00fa91: CJK COMPATIBILITY IDEOGRAPH-FA91*/
+ RTUNI_ALPHA, /* U+00fa92: CJK COMPATIBILITY IDEOGRAPH-FA92*/
+ RTUNI_ALPHA, /* U+00fa93: CJK COMPATIBILITY IDEOGRAPH-FA93*/
+ RTUNI_ALPHA, /* U+00fa94: CJK COMPATIBILITY IDEOGRAPH-FA94*/
+ RTUNI_ALPHA, /* U+00fa95: CJK COMPATIBILITY IDEOGRAPH-FA95*/
+ RTUNI_ALPHA, /* U+00fa96: CJK COMPATIBILITY IDEOGRAPH-FA96*/
+ RTUNI_ALPHA, /* U+00fa97: CJK COMPATIBILITY IDEOGRAPH-FA97*/
+ RTUNI_ALPHA, /* U+00fa98: CJK COMPATIBILITY IDEOGRAPH-FA98*/
+ RTUNI_ALPHA, /* U+00fa99: CJK COMPATIBILITY IDEOGRAPH-FA99*/
+ RTUNI_ALPHA, /* U+00fa9a: CJK COMPATIBILITY IDEOGRAPH-FA9A*/
+ RTUNI_ALPHA, /* U+00fa9b: CJK COMPATIBILITY IDEOGRAPH-FA9B*/
+ RTUNI_ALPHA, /* U+00fa9c: CJK COMPATIBILITY IDEOGRAPH-FA9C*/
+ RTUNI_ALPHA, /* U+00fa9d: CJK COMPATIBILITY IDEOGRAPH-FA9D*/
+ RTUNI_ALPHA, /* U+00fa9e: CJK COMPATIBILITY IDEOGRAPH-FA9E*/
+ RTUNI_ALPHA, /* U+00fa9f: CJK COMPATIBILITY IDEOGRAPH-FA9F*/
+ RTUNI_ALPHA, /* U+00faa0: CJK COMPATIBILITY IDEOGRAPH-FAA0*/
+ RTUNI_ALPHA, /* U+00faa1: CJK COMPATIBILITY IDEOGRAPH-FAA1*/
+ RTUNI_ALPHA, /* U+00faa2: CJK COMPATIBILITY IDEOGRAPH-FAA2*/
+ RTUNI_ALPHA, /* U+00faa3: CJK COMPATIBILITY IDEOGRAPH-FAA3*/
+ RTUNI_ALPHA, /* U+00faa4: CJK COMPATIBILITY IDEOGRAPH-FAA4*/
+ RTUNI_ALPHA, /* U+00faa5: CJK COMPATIBILITY IDEOGRAPH-FAA5*/
+ RTUNI_ALPHA, /* U+00faa6: CJK COMPATIBILITY IDEOGRAPH-FAA6*/
+ RTUNI_ALPHA, /* U+00faa7: CJK COMPATIBILITY IDEOGRAPH-FAA7*/
+ RTUNI_ALPHA, /* U+00faa8: CJK COMPATIBILITY IDEOGRAPH-FAA8*/
+ RTUNI_ALPHA, /* U+00faa9: CJK COMPATIBILITY IDEOGRAPH-FAA9*/
+ RTUNI_ALPHA, /* U+00faaa: CJK COMPATIBILITY IDEOGRAPH-FAAA*/
+ RTUNI_ALPHA, /* U+00faab: CJK COMPATIBILITY IDEOGRAPH-FAAB*/
+ RTUNI_ALPHA, /* U+00faac: CJK COMPATIBILITY IDEOGRAPH-FAAC*/
+ RTUNI_ALPHA, /* U+00faad: CJK COMPATIBILITY IDEOGRAPH-FAAD*/
+ RTUNI_ALPHA, /* U+00faae: CJK COMPATIBILITY IDEOGRAPH-FAAE*/
+ RTUNI_ALPHA, /* U+00faaf: CJK COMPATIBILITY IDEOGRAPH-FAAF*/
+ RTUNI_ALPHA, /* U+00fab0: CJK COMPATIBILITY IDEOGRAPH-FAB0*/
+ RTUNI_ALPHA, /* U+00fab1: CJK COMPATIBILITY IDEOGRAPH-FAB1*/
+ RTUNI_ALPHA, /* U+00fab2: CJK COMPATIBILITY IDEOGRAPH-FAB2*/
+ RTUNI_ALPHA, /* U+00fab3: CJK COMPATIBILITY IDEOGRAPH-FAB3*/
+ RTUNI_ALPHA, /* U+00fab4: CJK COMPATIBILITY IDEOGRAPH-FAB4*/
+ RTUNI_ALPHA, /* U+00fab5: CJK COMPATIBILITY IDEOGRAPH-FAB5*/
+ RTUNI_ALPHA, /* U+00fab6: CJK COMPATIBILITY IDEOGRAPH-FAB6*/
+ RTUNI_ALPHA, /* U+00fab7: CJK COMPATIBILITY IDEOGRAPH-FAB7*/
+ RTUNI_ALPHA, /* U+00fab8: CJK COMPATIBILITY IDEOGRAPH-FAB8*/
+ RTUNI_ALPHA, /* U+00fab9: CJK COMPATIBILITY IDEOGRAPH-FAB9*/
+ RTUNI_ALPHA, /* U+00faba: CJK COMPATIBILITY IDEOGRAPH-FABA*/
+ RTUNI_ALPHA, /* U+00fabb: CJK COMPATIBILITY IDEOGRAPH-FABB*/
+ RTUNI_ALPHA, /* U+00fabc: CJK COMPATIBILITY IDEOGRAPH-FABC*/
+ RTUNI_ALPHA, /* U+00fabd: CJK COMPATIBILITY IDEOGRAPH-FABD*/
+ RTUNI_ALPHA, /* U+00fabe: CJK COMPATIBILITY IDEOGRAPH-FABE*/
+ RTUNI_ALPHA, /* U+00fabf: CJK COMPATIBILITY IDEOGRAPH-FABF*/
+ RTUNI_ALPHA, /* U+00fac0: CJK COMPATIBILITY IDEOGRAPH-FAC0*/
+ RTUNI_ALPHA, /* U+00fac1: CJK COMPATIBILITY IDEOGRAPH-FAC1*/
+ RTUNI_ALPHA, /* U+00fac2: CJK COMPATIBILITY IDEOGRAPH-FAC2*/
+ RTUNI_ALPHA, /* U+00fac3: CJK COMPATIBILITY IDEOGRAPH-FAC3*/
+ RTUNI_ALPHA, /* U+00fac4: CJK COMPATIBILITY IDEOGRAPH-FAC4*/
+ RTUNI_ALPHA, /* U+00fac5: CJK COMPATIBILITY IDEOGRAPH-FAC5*/
+ RTUNI_ALPHA, /* U+00fac6: CJK COMPATIBILITY IDEOGRAPH-FAC6*/
+ RTUNI_ALPHA, /* U+00fac7: CJK COMPATIBILITY IDEOGRAPH-FAC7*/
+ RTUNI_ALPHA, /* U+00fac8: CJK COMPATIBILITY IDEOGRAPH-FAC8*/
+ RTUNI_ALPHA, /* U+00fac9: CJK COMPATIBILITY IDEOGRAPH-FAC9*/
+ RTUNI_ALPHA, /* U+00faca: CJK COMPATIBILITY IDEOGRAPH-FACA*/
+ RTUNI_ALPHA, /* U+00facb: CJK COMPATIBILITY IDEOGRAPH-FACB*/
+ RTUNI_ALPHA, /* U+00facc: CJK COMPATIBILITY IDEOGRAPH-FACC*/
+ RTUNI_ALPHA, /* U+00facd: CJK COMPATIBILITY IDEOGRAPH-FACD*/
+ RTUNI_ALPHA, /* U+00face: CJK COMPATIBILITY IDEOGRAPH-FACE*/
+ RTUNI_ALPHA, /* U+00facf: CJK COMPATIBILITY IDEOGRAPH-FACF*/
+ RTUNI_ALPHA, /* U+00fad0: CJK COMPATIBILITY IDEOGRAPH-FAD0*/
+ RTUNI_ALPHA, /* U+00fad1: CJK COMPATIBILITY IDEOGRAPH-FAD1*/
+ RTUNI_ALPHA, /* U+00fad2: CJK COMPATIBILITY IDEOGRAPH-FAD2*/
+ RTUNI_ALPHA, /* U+00fad3: CJK COMPATIBILITY IDEOGRAPH-FAD3*/
+ RTUNI_ALPHA, /* U+00fad4: CJK COMPATIBILITY IDEOGRAPH-FAD4*/
+ RTUNI_ALPHA, /* U+00fad5: CJK COMPATIBILITY IDEOGRAPH-FAD5*/
+ RTUNI_ALPHA, /* U+00fad6: CJK COMPATIBILITY IDEOGRAPH-FAD6*/
+ RTUNI_ALPHA, /* U+00fad7: CJK COMPATIBILITY IDEOGRAPH-FAD7*/
+ RTUNI_ALPHA, /* U+00fad8: CJK COMPATIBILITY IDEOGRAPH-FAD8*/
+ RTUNI_ALPHA, /* U+00fad9: CJK COMPATIBILITY IDEOGRAPH-FAD9*/
+ 0, /* U+00fada: */
+ 0, /* U+00fadb: */
+ 0, /* U+00fadc: */
+ 0, /* U+00fadd: */
+ 0, /* U+00fade: */
+ 0, /* U+00fadf: */
+ 0, /* U+00fae0: */
+ 0, /* U+00fae1: */
+ 0, /* U+00fae2: */
+ 0, /* U+00fae3: */
+ 0, /* U+00fae4: */
+ 0, /* U+00fae5: */
+ 0, /* U+00fae6: */
+ 0, /* U+00fae7: */
+ 0, /* U+00fae8: */
+ 0, /* U+00fae9: */
+ 0, /* U+00faea: */
+ 0, /* U+00faeb: */
+ 0, /* U+00faec: */
+ 0, /* U+00faed: */
+ 0, /* U+00faee: */
+ 0, /* U+00faef: */
+ 0, /* U+00faf0: */
+ 0, /* U+00faf1: */
+ 0, /* U+00faf2: */
+ 0, /* U+00faf3: */
+ 0, /* U+00faf4: */
+ 0, /* U+00faf5: */
+ 0, /* U+00faf6: */
+ 0, /* U+00faf7: */
+ 0, /* U+00faf8: */
+ 0, /* U+00faf9: */
+ 0, /* U+00fafa: */
+ 0, /* U+00fafb: */
+ 0, /* U+00fafc: */
+ 0, /* U+00fafd: */
+ 0, /* U+00fafe: */
+ 0, /* U+00faff: */
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00fb00: LATIN SMALL LIGATURE FF*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00fb01: LATIN SMALL LIGATURE FI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00fb02: LATIN SMALL LIGATURE FL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00fb03: LATIN SMALL LIGATURE FFI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00fb04: LATIN SMALL LIGATURE FFL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00fb05: LATIN SMALL LIGATURE LONG S T*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00fb06: LATIN SMALL LIGATURE ST*/
+ 0, /* U+00fb07: */
+ 0, /* U+00fb08: */
+ 0, /* U+00fb09: */
+ 0, /* U+00fb0a: */
+ 0, /* U+00fb0b: */
+ 0, /* U+00fb0c: */
+ 0, /* U+00fb0d: */
+ 0, /* U+00fb0e: */
+ 0, /* U+00fb0f: */
+ 0, /* U+00fb10: */
+ 0, /* U+00fb11: */
+ 0, /* U+00fb12: */
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00fb13: ARMENIAN SMALL LIGATURE MEN NOW*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00fb14: ARMENIAN SMALL LIGATURE MEN ECH*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00fb15: ARMENIAN SMALL LIGATURE MEN INI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00fb16: ARMENIAN SMALL LIGATURE VEW NOW*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00fb17: ARMENIAN SMALL LIGATURE MEN XEH*/
+ 0, /* U+00fb18: */
+ 0, /* U+00fb19: */
+ 0, /* U+00fb1a: */
+ 0, /* U+00fb1b: */
+ 0, /* U+00fb1c: */
+ RTUNI_ALPHA, /* U+00fb1d: HEBREW LETTER YOD WITH HIRIQ*/
+ RTUNI_ALPHA, /* U+00fb1e: HEBREW POINT JUDEO-SPANISH VARIKA*/
+ RTUNI_ALPHA, /* U+00fb1f: HEBREW LIGATURE YIDDISH YOD YOD PATAH*/
+ RTUNI_ALPHA, /* U+00fb20: HEBREW LETTER ALTERNATIVE AYIN*/
+ RTUNI_ALPHA, /* U+00fb21: HEBREW LETTER WIDE ALEF*/
+ RTUNI_ALPHA, /* U+00fb22: HEBREW LETTER WIDE DALET*/
+ RTUNI_ALPHA, /* U+00fb23: HEBREW LETTER WIDE HE*/
+ RTUNI_ALPHA, /* U+00fb24: HEBREW LETTER WIDE KAF*/
+ RTUNI_ALPHA, /* U+00fb25: HEBREW LETTER WIDE LAMED*/
+ RTUNI_ALPHA, /* U+00fb26: HEBREW LETTER WIDE FINAL MEM*/
+ RTUNI_ALPHA, /* U+00fb27: HEBREW LETTER WIDE RESH*/
+ RTUNI_ALPHA, /* U+00fb28: HEBREW LETTER WIDE TAV*/
+ 0, /* U+00fb29: HEBREW LETTER ALTERNATIVE PLUS SIGN*/
+ RTUNI_ALPHA, /* U+00fb2a: HEBREW LETTER SHIN WITH SHIN DOT*/
+ RTUNI_ALPHA, /* U+00fb2b: HEBREW LETTER SHIN WITH SIN DOT*/
+ RTUNI_ALPHA, /* U+00fb2c: HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT*/
+ RTUNI_ALPHA, /* U+00fb2d: HEBREW LETTER SHIN WITH DAGESH AND SIN DOT*/
+ RTUNI_ALPHA, /* U+00fb2e: HEBREW LETTER ALEF WITH PATAH*/
+ RTUNI_ALPHA, /* U+00fb2f: HEBREW LETTER ALEF WITH QAMATS*/
+ RTUNI_ALPHA, /* U+00fb30: HEBREW LETTER ALEF WITH MAPIQ*/
+ RTUNI_ALPHA, /* U+00fb31: HEBREW LETTER BET WITH DAGESH*/
+ RTUNI_ALPHA, /* U+00fb32: HEBREW LETTER GIMEL WITH DAGESH*/
+ RTUNI_ALPHA, /* U+00fb33: HEBREW LETTER DALET WITH DAGESH*/
+ RTUNI_ALPHA, /* U+00fb34: HEBREW LETTER HE WITH MAPIQ*/
+ RTUNI_ALPHA, /* U+00fb35: HEBREW LETTER VAV WITH DAGESH*/
+ RTUNI_ALPHA, /* U+00fb36: HEBREW LETTER ZAYIN WITH DAGESH*/
+ 0, /* U+00fb37: */
+ RTUNI_ALPHA, /* U+00fb38: HEBREW LETTER TET WITH DAGESH*/
+ RTUNI_ALPHA, /* U+00fb39: HEBREW LETTER YOD WITH DAGESH*/
+ RTUNI_ALPHA, /* U+00fb3a: HEBREW LETTER FINAL KAF WITH DAGESH*/
+ RTUNI_ALPHA, /* U+00fb3b: HEBREW LETTER KAF WITH DAGESH*/
+ RTUNI_ALPHA, /* U+00fb3c: HEBREW LETTER LAMED WITH DAGESH*/
+ 0, /* U+00fb3d: */
+ RTUNI_ALPHA, /* U+00fb3e: HEBREW LETTER MEM WITH DAGESH*/
+ 0, /* U+00fb3f: */
+ RTUNI_ALPHA, /* U+00fb40: HEBREW LETTER NUN WITH DAGESH*/
+ RTUNI_ALPHA, /* U+00fb41: HEBREW LETTER SAMEKH WITH DAGESH*/
+ 0, /* U+00fb42: */
+ RTUNI_ALPHA, /* U+00fb43: HEBREW LETTER FINAL PE WITH DAGESH*/
+ RTUNI_ALPHA, /* U+00fb44: HEBREW LETTER PE WITH DAGESH*/
+ 0, /* U+00fb45: */
+ RTUNI_ALPHA, /* U+00fb46: HEBREW LETTER TSADI WITH DAGESH*/
+ RTUNI_ALPHA, /* U+00fb47: HEBREW LETTER QOF WITH DAGESH*/
+ RTUNI_ALPHA, /* U+00fb48: HEBREW LETTER RESH WITH DAGESH*/
+ RTUNI_ALPHA, /* U+00fb49: HEBREW LETTER SHIN WITH DAGESH*/
+ RTUNI_ALPHA, /* U+00fb4a: HEBREW LETTER TAV WITH DAGESH*/
+ RTUNI_ALPHA, /* U+00fb4b: HEBREW LETTER VAV WITH HOLAM*/
+ RTUNI_ALPHA, /* U+00fb4c: HEBREW LETTER BET WITH RAFE*/
+ RTUNI_ALPHA, /* U+00fb4d: HEBREW LETTER KAF WITH RAFE*/
+ RTUNI_ALPHA, /* U+00fb4e: HEBREW LETTER PE WITH RAFE*/
+ RTUNI_ALPHA, /* U+00fb4f: HEBREW LIGATURE ALEF LAMED*/
+ RTUNI_ALPHA, /* U+00fb50: ARABIC LETTER ALEF WASLA ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fb51: ARABIC LETTER ALEF WASLA FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fb52: ARABIC LETTER BEEH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fb53: ARABIC LETTER BEEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fb54: ARABIC LETTER BEEH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fb55: ARABIC LETTER BEEH MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fb56: ARABIC LETTER PEH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fb57: ARABIC LETTER PEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fb58: ARABIC LETTER PEH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fb59: ARABIC LETTER PEH MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fb5a: ARABIC LETTER BEHEH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fb5b: ARABIC LETTER BEHEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fb5c: ARABIC LETTER BEHEH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fb5d: ARABIC LETTER BEHEH MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fb5e: ARABIC LETTER TTEHEH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fb5f: ARABIC LETTER TTEHEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fb60: ARABIC LETTER TTEHEH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fb61: ARABIC LETTER TTEHEH MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fb62: ARABIC LETTER TEHEH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fb63: ARABIC LETTER TEHEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fb64: ARABIC LETTER TEHEH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fb65: ARABIC LETTER TEHEH MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fb66: ARABIC LETTER TTEH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fb67: ARABIC LETTER TTEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fb68: ARABIC LETTER TTEH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fb69: ARABIC LETTER TTEH MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fb6a: ARABIC LETTER VEH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fb6b: ARABIC LETTER VEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fb6c: ARABIC LETTER VEH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fb6d: ARABIC LETTER VEH MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fb6e: ARABIC LETTER PEHEH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fb6f: ARABIC LETTER PEHEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fb70: ARABIC LETTER PEHEH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fb71: ARABIC LETTER PEHEH MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fb72: ARABIC LETTER DYEH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fb73: ARABIC LETTER DYEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fb74: ARABIC LETTER DYEH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fb75: ARABIC LETTER DYEH MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fb76: ARABIC LETTER NYEH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fb77: ARABIC LETTER NYEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fb78: ARABIC LETTER NYEH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fb79: ARABIC LETTER NYEH MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fb7a: ARABIC LETTER TCHEH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fb7b: ARABIC LETTER TCHEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fb7c: ARABIC LETTER TCHEH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fb7d: ARABIC LETTER TCHEH MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fb7e: ARABIC LETTER TCHEHEH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fb7f: ARABIC LETTER TCHEHEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fb80: ARABIC LETTER TCHEHEH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fb81: ARABIC LETTER TCHEHEH MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fb82: ARABIC LETTER DDAHAL ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fb83: ARABIC LETTER DDAHAL FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fb84: ARABIC LETTER DAHAL ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fb85: ARABIC LETTER DAHAL FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fb86: ARABIC LETTER DUL ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fb87: ARABIC LETTER DUL FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fb88: ARABIC LETTER DDAL ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fb89: ARABIC LETTER DDAL FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fb8a: ARABIC LETTER JEH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fb8b: ARABIC LETTER JEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fb8c: ARABIC LETTER RREH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fb8d: ARABIC LETTER RREH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fb8e: ARABIC LETTER KEHEH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fb8f: ARABIC LETTER KEHEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fb90: ARABIC LETTER KEHEH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fb91: ARABIC LETTER KEHEH MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fb92: ARABIC LETTER GAF ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fb93: ARABIC LETTER GAF FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fb94: ARABIC LETTER GAF INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fb95: ARABIC LETTER GAF MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fb96: ARABIC LETTER GUEH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fb97: ARABIC LETTER GUEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fb98: ARABIC LETTER GUEH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fb99: ARABIC LETTER GUEH MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fb9a: ARABIC LETTER NGOEH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fb9b: ARABIC LETTER NGOEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fb9c: ARABIC LETTER NGOEH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fb9d: ARABIC LETTER NGOEH MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fb9e: ARABIC LETTER NOON GHUNNA ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fb9f: ARABIC LETTER NOON GHUNNA FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fba0: ARABIC LETTER RNOON ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fba1: ARABIC LETTER RNOON FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fba2: ARABIC LETTER RNOON INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fba3: ARABIC LETTER RNOON MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fba4: ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fba5: ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fba6: ARABIC LETTER HEH GOAL ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fba7: ARABIC LETTER HEH GOAL FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fba8: ARABIC LETTER HEH GOAL INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fba9: ARABIC LETTER HEH GOAL MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fbaa: ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fbab: ARABIC LETTER HEH DOACHASHMEE FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fbac: ARABIC LETTER HEH DOACHASHMEE INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fbad: ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fbae: ARABIC LETTER YEH BARREE ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fbaf: ARABIC LETTER YEH BARREE FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fbb0: ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fbb1: ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM*/
+ 0, /* U+00fbb2: ARABIC SYMBOL DOT ABOVE*/
+ 0, /* U+00fbb3: ARABIC SYMBOL DOT BELOW*/
+ 0, /* U+00fbb4: ARABIC SYMBOL TWO DOTS ABOVE*/
+ 0, /* U+00fbb5: ARABIC SYMBOL TWO DOTS BELOW*/
+ 0, /* U+00fbb6: ARABIC SYMBOL THREE DOTS ABOVE*/
+ 0, /* U+00fbb7: ARABIC SYMBOL THREE DOTS BELOW*/
+ 0, /* U+00fbb8: ARABIC SYMBOL THREE DOTS POINTING DOWNWARDS ABOVE*/
+ 0, /* U+00fbb9: ARABIC SYMBOL THREE DOTS POINTING DOWNWARDS BELOW*/
+ 0, /* U+00fbba: ARABIC SYMBOL FOUR DOTS ABOVE*/
+ 0, /* U+00fbbb: ARABIC SYMBOL FOUR DOTS BELOW*/
+ 0, /* U+00fbbc: ARABIC SYMBOL DOUBLE VERTICAL BAR BELOW*/
+ 0, /* U+00fbbd: ARABIC SYMBOL TWO DOTS VERTICALLY ABOVE*/
+ 0, /* U+00fbbe: ARABIC SYMBOL TWO DOTS VERTICALLY BELOW*/
+ 0, /* U+00fbbf: ARABIC SYMBOL RING*/
+ 0, /* U+00fbc0: ARABIC SYMBOL SMALL TAH ABOVE*/
+ 0, /* U+00fbc1: ARABIC SYMBOL SMALL TAH BELOW*/
+ 0, /* U+00fbc2: */
+ 0, /* U+00fbc3: */
+ 0, /* U+00fbc4: */
+ 0, /* U+00fbc5: */
+ 0, /* U+00fbc6: */
+ 0, /* U+00fbc7: */
+ 0, /* U+00fbc8: */
+ 0, /* U+00fbc9: */
+ 0, /* U+00fbca: */
+ 0, /* U+00fbcb: */
+ 0, /* U+00fbcc: */
+ 0, /* U+00fbcd: */
+ 0, /* U+00fbce: */
+ 0, /* U+00fbcf: */
+ 0, /* U+00fbd0: */
+ 0, /* U+00fbd1: */
+ 0, /* U+00fbd2: */
+ RTUNI_ALPHA, /* U+00fbd3: ARABIC LETTER NG ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fbd4: ARABIC LETTER NG FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fbd5: ARABIC LETTER NG INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fbd6: ARABIC LETTER NG MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fbd7: ARABIC LETTER U ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fbd8: ARABIC LETTER U FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fbd9: ARABIC LETTER OE ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fbda: ARABIC LETTER OE FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fbdb: ARABIC LETTER YU ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fbdc: ARABIC LETTER YU FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fbdd: ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fbde: ARABIC LETTER VE ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fbdf: ARABIC LETTER VE FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fbe0: ARABIC LETTER KIRGHIZ OE ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fbe1: ARABIC LETTER KIRGHIZ OE FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fbe2: ARABIC LETTER KIRGHIZ YU ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fbe3: ARABIC LETTER KIRGHIZ YU FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fbe4: ARABIC LETTER E ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fbe5: ARABIC LETTER E FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fbe6: ARABIC LETTER E INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fbe7: ARABIC LETTER E MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fbe8: ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fbe9: ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fbea: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fbeb: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fbec: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fbed: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fbee: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fbef: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fbf0: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fbf1: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fbf2: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fbf3: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fbf4: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fbf5: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fbf6: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fbf7: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fbf8: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fbf9: ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fbfa: ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fbfb: ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fbfc: ARABIC LETTER FARSI YEH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fbfd: ARABIC LETTER FARSI YEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fbfe: ARABIC LETTER FARSI YEH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fbff: ARABIC LETTER FARSI YEH MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fc00: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc01: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc02: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc03: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc04: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc05: ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc06: ARABIC LIGATURE BEH WITH HAH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc07: ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc08: ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc09: ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc0a: ARABIC LIGATURE BEH WITH YEH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc0b: ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc0c: ARABIC LIGATURE TEH WITH HAH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc0d: ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc0e: ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc0f: ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc10: ARABIC LIGATURE TEH WITH YEH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc11: ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc12: ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc13: ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc14: ARABIC LIGATURE THEH WITH YEH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc15: ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc16: ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc17: ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc18: ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc19: ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc1a: ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc1b: ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc1c: ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc1d: ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc1e: ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc1f: ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc20: ARABIC LIGATURE SAD WITH HAH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc21: ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc22: ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc23: ARABIC LIGATURE DAD WITH HAH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc24: ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc25: ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc26: ARABIC LIGATURE TAH WITH HAH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc27: ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc28: ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc29: ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc2a: ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc2b: ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc2c: ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc2d: ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc2e: ARABIC LIGATURE FEH WITH HAH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc2f: ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc30: ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc31: ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc32: ARABIC LIGATURE FEH WITH YEH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc33: ARABIC LIGATURE QAF WITH HAH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc34: ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc35: ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc36: ARABIC LIGATURE QAF WITH YEH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc37: ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc38: ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc39: ARABIC LIGATURE KAF WITH HAH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc3a: ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc3b: ARABIC LIGATURE KAF WITH LAM ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc3c: ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc3d: ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc3e: ARABIC LIGATURE KAF WITH YEH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc3f: ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc40: ARABIC LIGATURE LAM WITH HAH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc41: ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc42: ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc43: ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc44: ARABIC LIGATURE LAM WITH YEH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc45: ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc46: ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc47: ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc48: ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc49: ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc4a: ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc4b: ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc4c: ARABIC LIGATURE NOON WITH HAH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc4d: ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc4e: ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc4f: ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc50: ARABIC LIGATURE NOON WITH YEH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc51: ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc52: ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc53: ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc54: ARABIC LIGATURE HEH WITH YEH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc55: ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc56: ARABIC LIGATURE YEH WITH HAH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc57: ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc58: ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc59: ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc5a: ARABIC LIGATURE YEH WITH YEH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc5b: ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc5c: ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc5d: ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc5e: ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc5f: ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc60: ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc61: ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc62: ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc63: ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fc64: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fc65: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fc66: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fc67: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fc68: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fc69: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fc6a: ARABIC LIGATURE BEH WITH REH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fc6b: ARABIC LIGATURE BEH WITH ZAIN FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fc6c: ARABIC LIGATURE BEH WITH MEEM FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fc6d: ARABIC LIGATURE BEH WITH NOON FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fc6e: ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fc6f: ARABIC LIGATURE BEH WITH YEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fc70: ARABIC LIGATURE TEH WITH REH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fc71: ARABIC LIGATURE TEH WITH ZAIN FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fc72: ARABIC LIGATURE TEH WITH MEEM FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fc73: ARABIC LIGATURE TEH WITH NOON FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fc74: ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fc75: ARABIC LIGATURE TEH WITH YEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fc76: ARABIC LIGATURE THEH WITH REH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fc77: ARABIC LIGATURE THEH WITH ZAIN FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fc78: ARABIC LIGATURE THEH WITH MEEM FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fc79: ARABIC LIGATURE THEH WITH NOON FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fc7a: ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fc7b: ARABIC LIGATURE THEH WITH YEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fc7c: ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fc7d: ARABIC LIGATURE FEH WITH YEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fc7e: ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fc7f: ARABIC LIGATURE QAF WITH YEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fc80: ARABIC LIGATURE KAF WITH ALEF FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fc81: ARABIC LIGATURE KAF WITH LAM FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fc82: ARABIC LIGATURE KAF WITH MEEM FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fc83: ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fc84: ARABIC LIGATURE KAF WITH YEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fc85: ARABIC LIGATURE LAM WITH MEEM FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fc86: ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fc87: ARABIC LIGATURE LAM WITH YEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fc88: ARABIC LIGATURE MEEM WITH ALEF FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fc89: ARABIC LIGATURE MEEM WITH MEEM FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fc8a: ARABIC LIGATURE NOON WITH REH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fc8b: ARABIC LIGATURE NOON WITH ZAIN FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fc8c: ARABIC LIGATURE NOON WITH MEEM FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fc8d: ARABIC LIGATURE NOON WITH NOON FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fc8e: ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fc8f: ARABIC LIGATURE NOON WITH YEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fc90: ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fc91: ARABIC LIGATURE YEH WITH REH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fc92: ARABIC LIGATURE YEH WITH ZAIN FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fc93: ARABIC LIGATURE YEH WITH MEEM FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fc94: ARABIC LIGATURE YEH WITH NOON FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fc95: ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fc96: ARABIC LIGATURE YEH WITH YEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fc97: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fc98: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fc99: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fc9a: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fc9b: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fc9c: ARABIC LIGATURE BEH WITH JEEM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fc9d: ARABIC LIGATURE BEH WITH HAH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fc9e: ARABIC LIGATURE BEH WITH KHAH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fc9f: ARABIC LIGATURE BEH WITH MEEM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fca0: ARABIC LIGATURE BEH WITH HEH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fca1: ARABIC LIGATURE TEH WITH JEEM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fca2: ARABIC LIGATURE TEH WITH HAH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fca3: ARABIC LIGATURE TEH WITH KHAH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fca4: ARABIC LIGATURE TEH WITH MEEM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fca5: ARABIC LIGATURE TEH WITH HEH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fca6: ARABIC LIGATURE THEH WITH MEEM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fca7: ARABIC LIGATURE JEEM WITH HAH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fca8: ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fca9: ARABIC LIGATURE HAH WITH JEEM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fcaa: ARABIC LIGATURE HAH WITH MEEM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fcab: ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fcac: ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fcad: ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fcae: ARABIC LIGATURE SEEN WITH HAH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fcaf: ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fcb0: ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fcb1: ARABIC LIGATURE SAD WITH HAH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fcb2: ARABIC LIGATURE SAD WITH KHAH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fcb3: ARABIC LIGATURE SAD WITH MEEM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fcb4: ARABIC LIGATURE DAD WITH JEEM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fcb5: ARABIC LIGATURE DAD WITH HAH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fcb6: ARABIC LIGATURE DAD WITH KHAH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fcb7: ARABIC LIGATURE DAD WITH MEEM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fcb8: ARABIC LIGATURE TAH WITH HAH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fcb9: ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fcba: ARABIC LIGATURE AIN WITH JEEM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fcbb: ARABIC LIGATURE AIN WITH MEEM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fcbc: ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fcbd: ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fcbe: ARABIC LIGATURE FEH WITH JEEM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fcbf: ARABIC LIGATURE FEH WITH HAH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fcc0: ARABIC LIGATURE FEH WITH KHAH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fcc1: ARABIC LIGATURE FEH WITH MEEM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fcc2: ARABIC LIGATURE QAF WITH HAH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fcc3: ARABIC LIGATURE QAF WITH MEEM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fcc4: ARABIC LIGATURE KAF WITH JEEM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fcc5: ARABIC LIGATURE KAF WITH HAH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fcc6: ARABIC LIGATURE KAF WITH KHAH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fcc7: ARABIC LIGATURE KAF WITH LAM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fcc8: ARABIC LIGATURE KAF WITH MEEM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fcc9: ARABIC LIGATURE LAM WITH JEEM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fcca: ARABIC LIGATURE LAM WITH HAH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fccb: ARABIC LIGATURE LAM WITH KHAH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fccc: ARABIC LIGATURE LAM WITH MEEM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fccd: ARABIC LIGATURE LAM WITH HEH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fcce: ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fccf: ARABIC LIGATURE MEEM WITH HAH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fcd0: ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fcd1: ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fcd2: ARABIC LIGATURE NOON WITH JEEM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fcd3: ARABIC LIGATURE NOON WITH HAH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fcd4: ARABIC LIGATURE NOON WITH KHAH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fcd5: ARABIC LIGATURE NOON WITH MEEM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fcd6: ARABIC LIGATURE NOON WITH HEH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fcd7: ARABIC LIGATURE HEH WITH JEEM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fcd8: ARABIC LIGATURE HEH WITH MEEM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fcd9: ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fcda: ARABIC LIGATURE YEH WITH JEEM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fcdb: ARABIC LIGATURE YEH WITH HAH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fcdc: ARABIC LIGATURE YEH WITH KHAH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fcdd: ARABIC LIGATURE YEH WITH MEEM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fcde: ARABIC LIGATURE YEH WITH HEH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fcdf: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fce0: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fce1: ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fce2: ARABIC LIGATURE BEH WITH HEH MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fce3: ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fce4: ARABIC LIGATURE TEH WITH HEH MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fce5: ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fce6: ARABIC LIGATURE THEH WITH HEH MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fce7: ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fce8: ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fce9: ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fcea: ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fceb: ARABIC LIGATURE KAF WITH LAM MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fcec: ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fced: ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fcee: ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fcef: ARABIC LIGATURE NOON WITH HEH MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fcf0: ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fcf1: ARABIC LIGATURE YEH WITH HEH MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fcf2: ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fcf3: ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fcf4: ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fcf5: ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fcf6: ARABIC LIGATURE TAH WITH YEH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fcf7: ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fcf8: ARABIC LIGATURE AIN WITH YEH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fcf9: ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fcfa: ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fcfb: ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fcfc: ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fcfd: ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fcfe: ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fcff: ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fd00: ARABIC LIGATURE HAH WITH YEH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fd01: ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fd02: ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fd03: ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fd04: ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fd05: ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fd06: ARABIC LIGATURE SAD WITH YEH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fd07: ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fd08: ARABIC LIGATURE DAD WITH YEH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fd09: ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fd0a: ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fd0b: ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fd0c: ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fd0d: ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fd0e: ARABIC LIGATURE SEEN WITH REH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fd0f: ARABIC LIGATURE SAD WITH REH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fd10: ARABIC LIGATURE DAD WITH REH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fd11: ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fd12: ARABIC LIGATURE TAH WITH YEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fd13: ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fd14: ARABIC LIGATURE AIN WITH YEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fd15: ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fd16: ARABIC LIGATURE GHAIN WITH YEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fd17: ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fd18: ARABIC LIGATURE SEEN WITH YEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fd19: ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fd1a: ARABIC LIGATURE SHEEN WITH YEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fd1b: ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fd1c: ARABIC LIGATURE HAH WITH YEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fd1d: ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fd1e: ARABIC LIGATURE JEEM WITH YEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fd1f: ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fd20: ARABIC LIGATURE KHAH WITH YEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fd21: ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fd22: ARABIC LIGATURE SAD WITH YEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fd23: ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fd24: ARABIC LIGATURE DAD WITH YEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fd25: ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fd26: ARABIC LIGATURE SHEEN WITH HAH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fd27: ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fd28: ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fd29: ARABIC LIGATURE SHEEN WITH REH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fd2a: ARABIC LIGATURE SEEN WITH REH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fd2b: ARABIC LIGATURE SAD WITH REH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fd2c: ARABIC LIGATURE DAD WITH REH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fd2d: ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fd2e: ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fd2f: ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fd30: ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fd31: ARABIC LIGATURE SEEN WITH HEH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fd32: ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fd33: ARABIC LIGATURE TAH WITH MEEM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fd34: ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fd35: ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fd36: ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fd37: ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fd38: ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fd39: ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fd3a: ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fd3b: ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fd3c: ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fd3d: ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM*/
+ 0, /* U+00fd3e: ORNATE LEFT PARENTHESIS*/
+ 0, /* U+00fd3f: ORNATE RIGHT PARENTHESIS*/
+ 0, /* U+00fd40: */
+ 0, /* U+00fd41: */
+ 0, /* U+00fd42: */
+ 0, /* U+00fd43: */
+ 0, /* U+00fd44: */
+ 0, /* U+00fd45: */
+ 0, /* U+00fd46: */
+ 0, /* U+00fd47: */
+ 0, /* U+00fd48: */
+ 0, /* U+00fd49: */
+ 0, /* U+00fd4a: */
+ 0, /* U+00fd4b: */
+ 0, /* U+00fd4c: */
+ 0, /* U+00fd4d: */
+ 0, /* U+00fd4e: */
+ 0, /* U+00fd4f: */
+ RTUNI_ALPHA, /* U+00fd50: ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fd51: ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fd52: ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fd53: ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fd54: ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fd55: ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fd56: ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fd57: ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fd58: ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fd59: ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fd5a: ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fd5b: ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fd5c: ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fd5d: ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fd5e: ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fd5f: ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fd60: ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fd61: ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fd62: ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fd63: ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fd64: ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fd65: ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fd66: ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fd67: ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fd68: ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fd69: ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fd6a: ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fd6b: ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fd6c: ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fd6d: ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fd6e: ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fd6f: ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fd70: ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fd71: ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fd72: ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fd73: ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fd74: ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fd75: ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fd76: ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fd77: ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fd78: ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fd79: ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fd7a: ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fd7b: ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fd7c: ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fd7d: ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fd7e: ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fd7f: ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fd80: ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fd81: ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fd82: ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fd83: ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fd84: ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fd85: ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fd86: ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fd87: ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fd88: ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fd89: ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fd8a: ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fd8b: ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fd8c: ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fd8d: ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fd8e: ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fd8f: ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM*/
+ 0, /* U+00fd90: */
+ 0, /* U+00fd91: */
+ RTUNI_ALPHA, /* U+00fd92: ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fd93: ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fd94: ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fd95: ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fd96: ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fd97: ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fd98: ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fd99: ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fd9a: ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fd9b: ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fd9c: ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fd9d: ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fd9e: ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fd9f: ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fda0: ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fda1: ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fda2: ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fda3: ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fda4: ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fda5: ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fda6: ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fda7: ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fda8: ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fda9: ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fdaa: ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fdab: ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fdac: ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fdad: ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fdae: ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fdaf: ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fdb0: ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fdb1: ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fdb2: ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fdb3: ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fdb4: ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fdb5: ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fdb6: ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fdb7: ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fdb8: ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fdb9: ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fdba: ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fdbb: ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fdbc: ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fdbd: ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fdbe: ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fdbf: ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fdc0: ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fdc1: ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fdc2: ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fdc3: ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fdc4: ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fdc5: ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fdc6: ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fdc7: ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM*/
+ 0, /* U+00fdc8: */
+ 0, /* U+00fdc9: */
+ 0, /* U+00fdca: */
+ 0, /* U+00fdcb: */
+ 0, /* U+00fdcc: */
+ 0, /* U+00fdcd: */
+ 0, /* U+00fdce: */
+ 0, /* U+00fdcf: */
+ 0, /* U+00fdd0: */
+ 0, /* U+00fdd1: */
+ 0, /* U+00fdd2: */
+ 0, /* U+00fdd3: */
+ 0, /* U+00fdd4: */
+ 0, /* U+00fdd5: */
+ 0, /* U+00fdd6: */
+ 0, /* U+00fdd7: */
+ 0, /* U+00fdd8: */
+ 0, /* U+00fdd9: */
+ 0, /* U+00fdda: */
+ 0, /* U+00fddb: */
+ 0, /* U+00fddc: */
+ 0, /* U+00fddd: */
+ 0, /* U+00fdde: */
+ 0, /* U+00fddf: */
+ 0, /* U+00fde0: */
+ 0, /* U+00fde1: */
+ 0, /* U+00fde2: */
+ 0, /* U+00fde3: */
+ 0, /* U+00fde4: */
+ 0, /* U+00fde5: */
+ 0, /* U+00fde6: */
+ 0, /* U+00fde7: */
+ 0, /* U+00fde8: */
+ 0, /* U+00fde9: */
+ 0, /* U+00fdea: */
+ 0, /* U+00fdeb: */
+ 0, /* U+00fdec: */
+ 0, /* U+00fded: */
+ 0, /* U+00fdee: */
+ 0, /* U+00fdef: */
+ RTUNI_ALPHA, /* U+00fdf0: ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fdf1: ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fdf2: ARABIC LIGATURE ALLAH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fdf3: ARABIC LIGATURE AKBAR ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fdf4: ARABIC LIGATURE MOHAMMAD ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fdf5: ARABIC LIGATURE SALAM ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fdf6: ARABIC LIGATURE RASOUL ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fdf7: ARABIC LIGATURE ALAYHE ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fdf8: ARABIC LIGATURE WASALLAM ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fdf9: ARABIC LIGATURE SALLA ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fdfa: ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM*/
+ RTUNI_ALPHA, /* U+00fdfb: ARABIC LIGATURE JALLAJALALOUHOU*/
+ 0, /* U+00fdfc: RIAL SIGN*/
+ 0, /* U+00fdfd: ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM*/
+ 0, /* U+00fdfe: */
+ 0, /* U+00fdff: */
+ 0, /* U+00fe00: VARIATION SELECTOR-1*/
+ 0, /* U+00fe01: VARIATION SELECTOR-2*/
+ 0, /* U+00fe02: VARIATION SELECTOR-3*/
+ 0, /* U+00fe03: VARIATION SELECTOR-4*/
+ 0, /* U+00fe04: VARIATION SELECTOR-5*/
+ 0, /* U+00fe05: VARIATION SELECTOR-6*/
+ 0, /* U+00fe06: VARIATION SELECTOR-7*/
+ 0, /* U+00fe07: VARIATION SELECTOR-8*/
+ 0, /* U+00fe08: VARIATION SELECTOR-9*/
+ 0, /* U+00fe09: VARIATION SELECTOR-10*/
+ 0, /* U+00fe0a: VARIATION SELECTOR-11*/
+ 0, /* U+00fe0b: VARIATION SELECTOR-12*/
+ 0, /* U+00fe0c: VARIATION SELECTOR-13*/
+ 0, /* U+00fe0d: VARIATION SELECTOR-14*/
+ 0, /* U+00fe0e: VARIATION SELECTOR-15*/
+ 0, /* U+00fe0f: VARIATION SELECTOR-16*/
+ 0, /* U+00fe10: PRESENTATION FORM FOR VERTICAL COMMA*/
+ 0, /* U+00fe11: PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA*/
+ 0, /* U+00fe12: PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP*/
+ 0, /* U+00fe13: PRESENTATION FORM FOR VERTICAL COLON*/
+ 0, /* U+00fe14: PRESENTATION FORM FOR VERTICAL SEMICOLON*/
+ 0, /* U+00fe15: PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK*/
+ 0, /* U+00fe16: PRESENTATION FORM FOR VERTICAL QUESTION MARK*/
+ 0, /* U+00fe17: PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET*/
+ 0, /* U+00fe18: PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET*/
+ 0, /* U+00fe19: PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS*/
+ 0, /* U+00fe1a: */
+ 0, /* U+00fe1b: */
+ 0, /* U+00fe1c: */
+ 0, /* U+00fe1d: */
+ 0, /* U+00fe1e: */
+ 0, /* U+00fe1f: */
+ 0, /* U+00fe20: COMBINING LIGATURE LEFT HALF*/
+ 0, /* U+00fe21: COMBINING LIGATURE RIGHT HALF*/
+ 0, /* U+00fe22: COMBINING DOUBLE TILDE LEFT HALF*/
+ 0, /* U+00fe23: COMBINING DOUBLE TILDE RIGHT HALF*/
+ 0, /* U+00fe24: COMBINING MACRON LEFT HALF*/
+ 0, /* U+00fe25: COMBINING MACRON RIGHT HALF*/
+ 0, /* U+00fe26: COMBINING CONJOINING MACRON*/
+ 0, /* U+00fe27: */
+ 0, /* U+00fe28: */
+ 0, /* U+00fe29: */
+ 0, /* U+00fe2a: */
+ 0, /* U+00fe2b: */
+ 0, /* U+00fe2c: */
+ 0, /* U+00fe2d: */
+ 0, /* U+00fe2e: */
+ 0, /* U+00fe2f: */
+ 0, /* U+00fe30: PRESENTATION FORM FOR VERTICAL TWO DOT LEADER*/
+ 0, /* U+00fe31: PRESENTATION FORM FOR VERTICAL EM DASH*/
+ 0, /* U+00fe32: PRESENTATION FORM FOR VERTICAL EN DASH*/
+ 0, /* U+00fe33: PRESENTATION FORM FOR VERTICAL LOW LINE*/
+ 0, /* U+00fe34: PRESENTATION FORM FOR VERTICAL WAVY LOW LINE*/
+ 0, /* U+00fe35: PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS*/
+ 0, /* U+00fe36: PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS*/
+ 0, /* U+00fe37: PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET*/
+ 0, /* U+00fe38: PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET*/
+ 0, /* U+00fe39: PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET*/
+ 0, /* U+00fe3a: PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET*/
+ 0, /* U+00fe3b: PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET*/
+ 0, /* U+00fe3c: PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET*/
+ 0, /* U+00fe3d: PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET*/
+ 0, /* U+00fe3e: PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET*/
+ 0, /* U+00fe3f: PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET*/
+ 0, /* U+00fe40: PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET*/
+ 0, /* U+00fe41: PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET*/
+ 0, /* U+00fe42: PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET*/
+ 0, /* U+00fe43: PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET*/
+ 0, /* U+00fe44: PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET*/
+ 0, /* U+00fe45: SESAME DOT*/
+ 0, /* U+00fe46: WHITE SESAME DOT*/
+ 0, /* U+00fe47: PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET*/
+ 0, /* U+00fe48: PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET*/
+ 0, /* U+00fe49: DASHED OVERLINE*/
+ 0, /* U+00fe4a: CENTRELINE OVERLINE*/
+ 0, /* U+00fe4b: WAVY OVERLINE*/
+ 0, /* U+00fe4c: DOUBLE WAVY OVERLINE*/
+ 0, /* U+00fe4d: DASHED LOW LINE*/
+ 0, /* U+00fe4e: CENTRELINE LOW LINE*/
+ 0, /* U+00fe4f: WAVY LOW LINE*/
+ 0, /* U+00fe50: SMALL COMMA*/
+ 0, /* U+00fe51: SMALL IDEOGRAPHIC COMMA*/
+ 0, /* U+00fe52: SMALL FULL STOP*/
+ 0, /* U+00fe53: */
+ 0, /* U+00fe54: SMALL SEMICOLON*/
+ 0, /* U+00fe55: SMALL COLON*/
+ 0, /* U+00fe56: SMALL QUESTION MARK*/
+ 0, /* U+00fe57: SMALL EXCLAMATION MARK*/
+ 0, /* U+00fe58: SMALL EM DASH*/
+ 0, /* U+00fe59: SMALL LEFT PARENTHESIS*/
+ 0, /* U+00fe5a: SMALL RIGHT PARENTHESIS*/
+ 0, /* U+00fe5b: SMALL LEFT CURLY BRACKET*/
+ 0, /* U+00fe5c: SMALL RIGHT CURLY BRACKET*/
+ 0, /* U+00fe5d: SMALL LEFT TORTOISE SHELL BRACKET*/
+ 0, /* U+00fe5e: SMALL RIGHT TORTOISE SHELL BRACKET*/
+ 0, /* U+00fe5f: SMALL NUMBER SIGN*/
+ 0, /* U+00fe60: SMALL AMPERSAND*/
+ 0, /* U+00fe61: SMALL ASTERISK*/
+ 0, /* U+00fe62: SMALL PLUS SIGN*/
+ 0, /* U+00fe63: SMALL HYPHEN-MINUS*/
+ 0, /* U+00fe64: SMALL LESS-THAN SIGN*/
+ 0, /* U+00fe65: SMALL GREATER-THAN SIGN*/
+ 0, /* U+00fe66: SMALL EQUALS SIGN*/
+ 0, /* U+00fe67: */
+ 0, /* U+00fe68: SMALL REVERSE SOLIDUS*/
+ 0, /* U+00fe69: SMALL DOLLAR SIGN*/
+ 0, /* U+00fe6a: SMALL PERCENT SIGN*/
+ 0, /* U+00fe6b: SMALL COMMERCIAL AT*/
+ 0, /* U+00fe6c: */
+ 0, /* U+00fe6d: */
+ 0, /* U+00fe6e: */
+ 0, /* U+00fe6f: */
+ RTUNI_ALPHA, /* U+00fe70: ARABIC FATHATAN ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fe71: ARABIC TATWEEL WITH FATHATAN ABOVE*/
+ RTUNI_ALPHA, /* U+00fe72: ARABIC DAMMATAN ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fe73: ARABIC TAIL FRAGMENT*/
+ RTUNI_ALPHA, /* U+00fe74: ARABIC KASRATAN ISOLATED FORM*/
+ 0, /* U+00fe75: */
+ RTUNI_ALPHA, /* U+00fe76: ARABIC FATHA ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fe77: ARABIC FATHA MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fe78: ARABIC DAMMA ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fe79: ARABIC DAMMA MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fe7a: ARABIC KASRA ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fe7b: ARABIC KASRA MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fe7c: ARABIC SHADDA ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fe7d: ARABIC SHADDA MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fe7e: ARABIC SUKUN ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fe7f: ARABIC SUKUN MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fe80: ARABIC LETTER HAMZA ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fe81: ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fe82: ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fe83: ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fe84: ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fe85: ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fe86: ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fe87: ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fe88: ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fe89: ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fe8a: ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fe8b: ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fe8c: ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fe8d: ARABIC LETTER ALEF ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fe8e: ARABIC LETTER ALEF FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fe8f: ARABIC LETTER BEH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fe90: ARABIC LETTER BEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fe91: ARABIC LETTER BEH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fe92: ARABIC LETTER BEH MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fe93: ARABIC LETTER TEH MARBUTA ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fe94: ARABIC LETTER TEH MARBUTA FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fe95: ARABIC LETTER TEH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fe96: ARABIC LETTER TEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fe97: ARABIC LETTER TEH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fe98: ARABIC LETTER TEH MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fe99: ARABIC LETTER THEH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fe9a: ARABIC LETTER THEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fe9b: ARABIC LETTER THEH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fe9c: ARABIC LETTER THEH MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fe9d: ARABIC LETTER JEEM ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fe9e: ARABIC LETTER JEEM FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fe9f: ARABIC LETTER JEEM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fea0: ARABIC LETTER JEEM MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fea1: ARABIC LETTER HAH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fea2: ARABIC LETTER HAH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fea3: ARABIC LETTER HAH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fea4: ARABIC LETTER HAH MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fea5: ARABIC LETTER KHAH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fea6: ARABIC LETTER KHAH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fea7: ARABIC LETTER KHAH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fea8: ARABIC LETTER KHAH MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fea9: ARABIC LETTER DAL ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00feaa: ARABIC LETTER DAL FINAL FORM*/
+ RTUNI_ALPHA, /* U+00feab: ARABIC LETTER THAL ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00feac: ARABIC LETTER THAL FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fead: ARABIC LETTER REH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00feae: ARABIC LETTER REH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00feaf: ARABIC LETTER ZAIN ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00feb0: ARABIC LETTER ZAIN FINAL FORM*/
+ RTUNI_ALPHA, /* U+00feb1: ARABIC LETTER SEEN ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00feb2: ARABIC LETTER SEEN FINAL FORM*/
+ RTUNI_ALPHA, /* U+00feb3: ARABIC LETTER SEEN INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00feb4: ARABIC LETTER SEEN MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00feb5: ARABIC LETTER SHEEN ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00feb6: ARABIC LETTER SHEEN FINAL FORM*/
+ RTUNI_ALPHA, /* U+00feb7: ARABIC LETTER SHEEN INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00feb8: ARABIC LETTER SHEEN MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00feb9: ARABIC LETTER SAD ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00feba: ARABIC LETTER SAD FINAL FORM*/
+ RTUNI_ALPHA, /* U+00febb: ARABIC LETTER SAD INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00febc: ARABIC LETTER SAD MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00febd: ARABIC LETTER DAD ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00febe: ARABIC LETTER DAD FINAL FORM*/
+ RTUNI_ALPHA, /* U+00febf: ARABIC LETTER DAD INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fec0: ARABIC LETTER DAD MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fec1: ARABIC LETTER TAH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fec2: ARABIC LETTER TAH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fec3: ARABIC LETTER TAH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fec4: ARABIC LETTER TAH MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fec5: ARABIC LETTER ZAH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fec6: ARABIC LETTER ZAH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fec7: ARABIC LETTER ZAH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fec8: ARABIC LETTER ZAH MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fec9: ARABIC LETTER AIN ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00feca: ARABIC LETTER AIN FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fecb: ARABIC LETTER AIN INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fecc: ARABIC LETTER AIN MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fecd: ARABIC LETTER GHAIN ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fece: ARABIC LETTER GHAIN FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fecf: ARABIC LETTER GHAIN INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fed0: ARABIC LETTER GHAIN MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fed1: ARABIC LETTER FEH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fed2: ARABIC LETTER FEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fed3: ARABIC LETTER FEH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fed4: ARABIC LETTER FEH MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fed5: ARABIC LETTER QAF ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fed6: ARABIC LETTER QAF FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fed7: ARABIC LETTER QAF INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fed8: ARABIC LETTER QAF MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fed9: ARABIC LETTER KAF ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00feda: ARABIC LETTER KAF FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fedb: ARABIC LETTER KAF INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fedc: ARABIC LETTER KAF MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fedd: ARABIC LETTER LAM ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fede: ARABIC LETTER LAM FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fedf: ARABIC LETTER LAM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fee0: ARABIC LETTER LAM MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fee1: ARABIC LETTER MEEM ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fee2: ARABIC LETTER MEEM FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fee3: ARABIC LETTER MEEM INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fee4: ARABIC LETTER MEEM MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fee5: ARABIC LETTER NOON ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fee6: ARABIC LETTER NOON FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fee7: ARABIC LETTER NOON INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fee8: ARABIC LETTER NOON MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fee9: ARABIC LETTER HEH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00feea: ARABIC LETTER HEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00feeb: ARABIC LETTER HEH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00feec: ARABIC LETTER HEH MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00feed: ARABIC LETTER WAW ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00feee: ARABIC LETTER WAW FINAL FORM*/
+ RTUNI_ALPHA, /* U+00feef: ARABIC LETTER ALEF MAKSURA ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fef0: ARABIC LETTER ALEF MAKSURA FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fef1: ARABIC LETTER YEH ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fef2: ARABIC LETTER YEH FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fef3: ARABIC LETTER YEH INITIAL FORM*/
+ RTUNI_ALPHA, /* U+00fef4: ARABIC LETTER YEH MEDIAL FORM*/
+ RTUNI_ALPHA, /* U+00fef5: ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fef6: ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fef7: ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fef8: ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fef9: ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fefa: ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM*/
+ RTUNI_ALPHA, /* U+00fefb: ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM*/
+ RTUNI_ALPHA, /* U+00fefc: ARABIC LIGATURE LAM WITH ALEF FINAL FORM*/
+ 0, /* U+00fefd: */
+ 0, /* U+00fefe: */
+ 0, /* U+00feff: ZERO WIDTH NO-BREAK SPACE*/
+ 0, /* U+00ff00: */
+ 0, /* U+00ff01: FULLWIDTH EXCLAMATION MARK*/
+ 0, /* U+00ff02: FULLWIDTH QUOTATION MARK*/
+ 0, /* U+00ff03: FULLWIDTH NUMBER SIGN*/
+ 0, /* U+00ff04: FULLWIDTH DOLLAR SIGN*/
+ 0, /* U+00ff05: FULLWIDTH PERCENT SIGN*/
+ 0, /* U+00ff06: FULLWIDTH AMPERSAND*/
+ 0, /* U+00ff07: FULLWIDTH APOSTROPHE*/
+ 0, /* U+00ff08: FULLWIDTH LEFT PARENTHESIS*/
+ 0, /* U+00ff09: FULLWIDTH RIGHT PARENTHESIS*/
+ 0, /* U+00ff0a: FULLWIDTH ASTERISK*/
+ 0, /* U+00ff0b: FULLWIDTH PLUS SIGN*/
+ 0, /* U+00ff0c: FULLWIDTH COMMA*/
+ 0, /* U+00ff0d: FULLWIDTH HYPHEN-MINUS*/
+ 0, /* U+00ff0e: FULLWIDTH FULL STOP*/
+ 0, /* U+00ff0f: FULLWIDTH SOLIDUS*/
+ RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+00ff10: FULLWIDTH DIGIT ZERO*/
+ RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+00ff11: FULLWIDTH DIGIT ONE*/
+ RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+00ff12: FULLWIDTH DIGIT TWO*/
+ RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+00ff13: FULLWIDTH DIGIT THREE*/
+ RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+00ff14: FULLWIDTH DIGIT FOUR*/
+ RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+00ff15: FULLWIDTH DIGIT FIVE*/
+ RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+00ff16: FULLWIDTH DIGIT SIX*/
+ RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+00ff17: FULLWIDTH DIGIT SEVEN*/
+ RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+00ff18: FULLWIDTH DIGIT EIGHT*/
+ RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+00ff19: FULLWIDTH DIGIT NINE*/
+ 0, /* U+00ff1a: FULLWIDTH COLON*/
+ 0, /* U+00ff1b: FULLWIDTH SEMICOLON*/
+ 0, /* U+00ff1c: FULLWIDTH LESS-THAN SIGN*/
+ 0, /* U+00ff1d: FULLWIDTH EQUALS SIGN*/
+ 0, /* U+00ff1e: FULLWIDTH GREATER-THAN SIGN*/
+ 0, /* U+00ff1f: FULLWIDTH QUESTION MARK*/
+ 0, /* U+00ff20: FULLWIDTH COMMERCIAL AT*/
+ RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_UPPER, /* U+00ff21: FULLWIDTH LATIN CAPITAL LETTER A*/
+ RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_UPPER, /* U+00ff22: FULLWIDTH LATIN CAPITAL LETTER B*/
+ RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_UPPER, /* U+00ff23: FULLWIDTH LATIN CAPITAL LETTER C*/
+ RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_UPPER, /* U+00ff24: FULLWIDTH LATIN CAPITAL LETTER D*/
+ RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_UPPER, /* U+00ff25: FULLWIDTH LATIN CAPITAL LETTER E*/
+ RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_UPPER, /* U+00ff26: FULLWIDTH LATIN CAPITAL LETTER F*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff27: FULLWIDTH LATIN CAPITAL LETTER G*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff28: FULLWIDTH LATIN CAPITAL LETTER H*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff29: FULLWIDTH LATIN CAPITAL LETTER I*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff2a: FULLWIDTH LATIN CAPITAL LETTER J*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff2b: FULLWIDTH LATIN CAPITAL LETTER K*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff2c: FULLWIDTH LATIN CAPITAL LETTER L*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff2d: FULLWIDTH LATIN CAPITAL LETTER M*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff2e: FULLWIDTH LATIN CAPITAL LETTER N*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff2f: FULLWIDTH LATIN CAPITAL LETTER O*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff30: FULLWIDTH LATIN CAPITAL LETTER P*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff31: FULLWIDTH LATIN CAPITAL LETTER Q*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff32: FULLWIDTH LATIN CAPITAL LETTER R*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff33: FULLWIDTH LATIN CAPITAL LETTER S*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff34: FULLWIDTH LATIN CAPITAL LETTER T*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff35: FULLWIDTH LATIN CAPITAL LETTER U*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff36: FULLWIDTH LATIN CAPITAL LETTER V*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff37: FULLWIDTH LATIN CAPITAL LETTER W*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff38: FULLWIDTH LATIN CAPITAL LETTER X*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff39: FULLWIDTH LATIN CAPITAL LETTER Y*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff3a: FULLWIDTH LATIN CAPITAL LETTER Z*/
+ 0, /* U+00ff3b: FULLWIDTH LEFT SQUARE BRACKET*/
+ 0, /* U+00ff3c: FULLWIDTH REVERSE SOLIDUS*/
+ 0, /* U+00ff3d: FULLWIDTH RIGHT SQUARE BRACKET*/
+ 0, /* U+00ff3e: FULLWIDTH CIRCUMFLEX ACCENT*/
+ 0, /* U+00ff3f: FULLWIDTH LOW LINE*/
+ 0, /* U+00ff40: FULLWIDTH GRAVE ACCENT*/
+ RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_LOWER, /* U+00ff41: FULLWIDTH LATIN SMALL LETTER A*/
+ RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_LOWER, /* U+00ff42: FULLWIDTH LATIN SMALL LETTER B*/
+ RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_LOWER, /* U+00ff43: FULLWIDTH LATIN SMALL LETTER C*/
+ RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_LOWER, /* U+00ff44: FULLWIDTH LATIN SMALL LETTER D*/
+ RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_LOWER, /* U+00ff45: FULLWIDTH LATIN SMALL LETTER E*/
+ RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_LOWER, /* U+00ff46: FULLWIDTH LATIN SMALL LETTER F*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff47: FULLWIDTH LATIN SMALL LETTER G*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff48: FULLWIDTH LATIN SMALL LETTER H*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff49: FULLWIDTH LATIN SMALL LETTER I*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff4a: FULLWIDTH LATIN SMALL LETTER J*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff4b: FULLWIDTH LATIN SMALL LETTER K*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff4c: FULLWIDTH LATIN SMALL LETTER L*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff4d: FULLWIDTH LATIN SMALL LETTER M*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff4e: FULLWIDTH LATIN SMALL LETTER N*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff4f: FULLWIDTH LATIN SMALL LETTER O*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff50: FULLWIDTH LATIN SMALL LETTER P*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff51: FULLWIDTH LATIN SMALL LETTER Q*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff52: FULLWIDTH LATIN SMALL LETTER R*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff53: FULLWIDTH LATIN SMALL LETTER S*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff54: FULLWIDTH LATIN SMALL LETTER T*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff55: FULLWIDTH LATIN SMALL LETTER U*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff56: FULLWIDTH LATIN SMALL LETTER V*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff57: FULLWIDTH LATIN SMALL LETTER W*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff58: FULLWIDTH LATIN SMALL LETTER X*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff59: FULLWIDTH LATIN SMALL LETTER Y*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff5a: FULLWIDTH LATIN SMALL LETTER Z*/
+ 0, /* U+00ff5b: FULLWIDTH LEFT CURLY BRACKET*/
+ 0, /* U+00ff5c: FULLWIDTH VERTICAL LINE*/
+ 0, /* U+00ff5d: FULLWIDTH RIGHT CURLY BRACKET*/
+ 0, /* U+00ff5e: FULLWIDTH TILDE*/
+ 0, /* U+00ff5f: FULLWIDTH LEFT WHITE PARENTHESIS*/
+ 0, /* U+00ff60: FULLWIDTH RIGHT WHITE PARENTHESIS*/
+ 0, /* U+00ff61: HALFWIDTH IDEOGRAPHIC FULL STOP*/
+ 0, /* U+00ff62: HALFWIDTH LEFT CORNER BRACKET*/
+ 0, /* U+00ff63: HALFWIDTH RIGHT CORNER BRACKET*/
+ 0, /* U+00ff64: HALFWIDTH IDEOGRAPHIC COMMA*/
+ 0, /* U+00ff65: HALFWIDTH KATAKANA MIDDLE DOT*/
+ RTUNI_ALPHA, /* U+00ff66: HALFWIDTH KATAKANA LETTER WO*/
+ RTUNI_ALPHA, /* U+00ff67: HALFWIDTH KATAKANA LETTER SMALL A*/
+ RTUNI_ALPHA, /* U+00ff68: HALFWIDTH KATAKANA LETTER SMALL I*/
+ RTUNI_ALPHA, /* U+00ff69: HALFWIDTH KATAKANA LETTER SMALL U*/
+ RTUNI_ALPHA, /* U+00ff6a: HALFWIDTH KATAKANA LETTER SMALL E*/
+ RTUNI_ALPHA, /* U+00ff6b: HALFWIDTH KATAKANA LETTER SMALL O*/
+ RTUNI_ALPHA, /* U+00ff6c: HALFWIDTH KATAKANA LETTER SMALL YA*/
+ RTUNI_ALPHA, /* U+00ff6d: HALFWIDTH KATAKANA LETTER SMALL YU*/
+ RTUNI_ALPHA, /* U+00ff6e: HALFWIDTH KATAKANA LETTER SMALL YO*/
+ RTUNI_ALPHA, /* U+00ff6f: HALFWIDTH KATAKANA LETTER SMALL TU*/
+ RTUNI_ALPHA, /* U+00ff70: HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK*/
+ RTUNI_ALPHA, /* U+00ff71: HALFWIDTH KATAKANA LETTER A*/
+ RTUNI_ALPHA, /* U+00ff72: HALFWIDTH KATAKANA LETTER I*/
+ RTUNI_ALPHA, /* U+00ff73: HALFWIDTH KATAKANA LETTER U*/
+ RTUNI_ALPHA, /* U+00ff74: HALFWIDTH KATAKANA LETTER E*/
+ RTUNI_ALPHA, /* U+00ff75: HALFWIDTH KATAKANA LETTER O*/
+ RTUNI_ALPHA, /* U+00ff76: HALFWIDTH KATAKANA LETTER KA*/
+ RTUNI_ALPHA, /* U+00ff77: HALFWIDTH KATAKANA LETTER KI*/
+ RTUNI_ALPHA, /* U+00ff78: HALFWIDTH KATAKANA LETTER KU*/
+ RTUNI_ALPHA, /* U+00ff79: HALFWIDTH KATAKANA LETTER KE*/
+ RTUNI_ALPHA, /* U+00ff7a: HALFWIDTH KATAKANA LETTER KO*/
+ RTUNI_ALPHA, /* U+00ff7b: HALFWIDTH KATAKANA LETTER SA*/
+ RTUNI_ALPHA, /* U+00ff7c: HALFWIDTH KATAKANA LETTER SI*/
+ RTUNI_ALPHA, /* U+00ff7d: HALFWIDTH KATAKANA LETTER SU*/
+ RTUNI_ALPHA, /* U+00ff7e: HALFWIDTH KATAKANA LETTER SE*/
+ RTUNI_ALPHA, /* U+00ff7f: HALFWIDTH KATAKANA LETTER SO*/
+ RTUNI_ALPHA, /* U+00ff80: HALFWIDTH KATAKANA LETTER TA*/
+ RTUNI_ALPHA, /* U+00ff81: HALFWIDTH KATAKANA LETTER TI*/
+ RTUNI_ALPHA, /* U+00ff82: HALFWIDTH KATAKANA LETTER TU*/
+ RTUNI_ALPHA, /* U+00ff83: HALFWIDTH KATAKANA LETTER TE*/
+ RTUNI_ALPHA, /* U+00ff84: HALFWIDTH KATAKANA LETTER TO*/
+ RTUNI_ALPHA, /* U+00ff85: HALFWIDTH KATAKANA LETTER NA*/
+ RTUNI_ALPHA, /* U+00ff86: HALFWIDTH KATAKANA LETTER NI*/
+ RTUNI_ALPHA, /* U+00ff87: HALFWIDTH KATAKANA LETTER NU*/
+ RTUNI_ALPHA, /* U+00ff88: HALFWIDTH KATAKANA LETTER NE*/
+ RTUNI_ALPHA, /* U+00ff89: HALFWIDTH KATAKANA LETTER NO*/
+ RTUNI_ALPHA, /* U+00ff8a: HALFWIDTH KATAKANA LETTER HA*/
+ RTUNI_ALPHA, /* U+00ff8b: HALFWIDTH KATAKANA LETTER HI*/
+ RTUNI_ALPHA, /* U+00ff8c: HALFWIDTH KATAKANA LETTER HU*/
+ RTUNI_ALPHA, /* U+00ff8d: HALFWIDTH KATAKANA LETTER HE*/
+ RTUNI_ALPHA, /* U+00ff8e: HALFWIDTH KATAKANA LETTER HO*/
+ RTUNI_ALPHA, /* U+00ff8f: HALFWIDTH KATAKANA LETTER MA*/
+ RTUNI_ALPHA, /* U+00ff90: HALFWIDTH KATAKANA LETTER MI*/
+ RTUNI_ALPHA, /* U+00ff91: HALFWIDTH KATAKANA LETTER MU*/
+ RTUNI_ALPHA, /* U+00ff92: HALFWIDTH KATAKANA LETTER ME*/
+ RTUNI_ALPHA, /* U+00ff93: HALFWIDTH KATAKANA LETTER MO*/
+ RTUNI_ALPHA, /* U+00ff94: HALFWIDTH KATAKANA LETTER YA*/
+ RTUNI_ALPHA, /* U+00ff95: HALFWIDTH KATAKANA LETTER YU*/
+ RTUNI_ALPHA, /* U+00ff96: HALFWIDTH KATAKANA LETTER YO*/
+ RTUNI_ALPHA, /* U+00ff97: HALFWIDTH KATAKANA LETTER RA*/
+ RTUNI_ALPHA, /* U+00ff98: HALFWIDTH KATAKANA LETTER RI*/
+ RTUNI_ALPHA, /* U+00ff99: HALFWIDTH KATAKANA LETTER RU*/
+ RTUNI_ALPHA, /* U+00ff9a: HALFWIDTH KATAKANA LETTER RE*/
+ RTUNI_ALPHA, /* U+00ff9b: HALFWIDTH KATAKANA LETTER RO*/
+ RTUNI_ALPHA, /* U+00ff9c: HALFWIDTH KATAKANA LETTER WA*/
+ RTUNI_ALPHA, /* U+00ff9d: HALFWIDTH KATAKANA LETTER N*/
+ RTUNI_ALPHA, /* U+00ff9e: HALFWIDTH KATAKANA VOICED SOUND MARK*/
+ RTUNI_ALPHA, /* U+00ff9f: HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK*/
+ RTUNI_ALPHA, /* U+00ffa0: HALFWIDTH HANGUL FILLER*/
+ RTUNI_ALPHA, /* U+00ffa1: HALFWIDTH HANGUL LETTER KIYEOK*/
+ RTUNI_ALPHA, /* U+00ffa2: HALFWIDTH HANGUL LETTER SSANGKIYEOK*/
+ RTUNI_ALPHA, /* U+00ffa3: HALFWIDTH HANGUL LETTER KIYEOK-SIOS*/
+ RTUNI_ALPHA, /* U+00ffa4: HALFWIDTH HANGUL LETTER NIEUN*/
+ RTUNI_ALPHA, /* U+00ffa5: HALFWIDTH HANGUL LETTER NIEUN-CIEUC*/
+ RTUNI_ALPHA, /* U+00ffa6: HALFWIDTH HANGUL LETTER NIEUN-HIEUH*/
+ RTUNI_ALPHA, /* U+00ffa7: HALFWIDTH HANGUL LETTER TIKEUT*/
+ RTUNI_ALPHA, /* U+00ffa8: HALFWIDTH HANGUL LETTER SSANGTIKEUT*/
+ RTUNI_ALPHA, /* U+00ffa9: HALFWIDTH HANGUL LETTER RIEUL*/
+ RTUNI_ALPHA, /* U+00ffaa: HALFWIDTH HANGUL LETTER RIEUL-KIYEOK*/
+ RTUNI_ALPHA, /* U+00ffab: HALFWIDTH HANGUL LETTER RIEUL-MIEUM*/
+ RTUNI_ALPHA, /* U+00ffac: HALFWIDTH HANGUL LETTER RIEUL-PIEUP*/
+ RTUNI_ALPHA, /* U+00ffad: HALFWIDTH HANGUL LETTER RIEUL-SIOS*/
+ RTUNI_ALPHA, /* U+00ffae: HALFWIDTH HANGUL LETTER RIEUL-THIEUTH*/
+ RTUNI_ALPHA, /* U+00ffaf: HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH*/
+ RTUNI_ALPHA, /* U+00ffb0: HALFWIDTH HANGUL LETTER RIEUL-HIEUH*/
+ RTUNI_ALPHA, /* U+00ffb1: HALFWIDTH HANGUL LETTER MIEUM*/
+ RTUNI_ALPHA, /* U+00ffb2: HALFWIDTH HANGUL LETTER PIEUP*/
+ RTUNI_ALPHA, /* U+00ffb3: HALFWIDTH HANGUL LETTER SSANGPIEUP*/
+ RTUNI_ALPHA, /* U+00ffb4: HALFWIDTH HANGUL LETTER PIEUP-SIOS*/
+ RTUNI_ALPHA, /* U+00ffb5: HALFWIDTH HANGUL LETTER SIOS*/
+ RTUNI_ALPHA, /* U+00ffb6: HALFWIDTH HANGUL LETTER SSANGSIOS*/
+ RTUNI_ALPHA, /* U+00ffb7: HALFWIDTH HANGUL LETTER IEUNG*/
+ RTUNI_ALPHA, /* U+00ffb8: HALFWIDTH HANGUL LETTER CIEUC*/
+ RTUNI_ALPHA, /* U+00ffb9: HALFWIDTH HANGUL LETTER SSANGCIEUC*/
+ RTUNI_ALPHA, /* U+00ffba: HALFWIDTH HANGUL LETTER CHIEUCH*/
+ RTUNI_ALPHA, /* U+00ffbb: HALFWIDTH HANGUL LETTER KHIEUKH*/
+ RTUNI_ALPHA, /* U+00ffbc: HALFWIDTH HANGUL LETTER THIEUTH*/
+ RTUNI_ALPHA, /* U+00ffbd: HALFWIDTH HANGUL LETTER PHIEUPH*/
+ RTUNI_ALPHA, /* U+00ffbe: HALFWIDTH HANGUL LETTER HIEUH*/
+ 0, /* U+00ffbf: */
+ 0, /* U+00ffc0: */
+ 0, /* U+00ffc1: */
+ RTUNI_ALPHA, /* U+00ffc2: HALFWIDTH HANGUL LETTER A*/
+ RTUNI_ALPHA, /* U+00ffc3: HALFWIDTH HANGUL LETTER AE*/
+ RTUNI_ALPHA, /* U+00ffc4: HALFWIDTH HANGUL LETTER YA*/
+ RTUNI_ALPHA, /* U+00ffc5: HALFWIDTH HANGUL LETTER YAE*/
+ RTUNI_ALPHA, /* U+00ffc6: HALFWIDTH HANGUL LETTER EO*/
+ RTUNI_ALPHA, /* U+00ffc7: HALFWIDTH HANGUL LETTER E*/
+ 0, /* U+00ffc8: */
+ 0, /* U+00ffc9: */
+ RTUNI_ALPHA, /* U+00ffca: HALFWIDTH HANGUL LETTER YEO*/
+ RTUNI_ALPHA, /* U+00ffcb: HALFWIDTH HANGUL LETTER YE*/
+ RTUNI_ALPHA, /* U+00ffcc: HALFWIDTH HANGUL LETTER O*/
+ RTUNI_ALPHA, /* U+00ffcd: HALFWIDTH HANGUL LETTER WA*/
+ RTUNI_ALPHA, /* U+00ffce: HALFWIDTH HANGUL LETTER WAE*/
+ RTUNI_ALPHA, /* U+00ffcf: HALFWIDTH HANGUL LETTER OE*/
+ 0, /* U+00ffd0: */
+ 0, /* U+00ffd1: */
+ RTUNI_ALPHA, /* U+00ffd2: HALFWIDTH HANGUL LETTER YO*/
+ RTUNI_ALPHA, /* U+00ffd3: HALFWIDTH HANGUL LETTER U*/
+ RTUNI_ALPHA, /* U+00ffd4: HALFWIDTH HANGUL LETTER WEO*/
+ RTUNI_ALPHA, /* U+00ffd5: HALFWIDTH HANGUL LETTER WE*/
+ RTUNI_ALPHA, /* U+00ffd6: HALFWIDTH HANGUL LETTER WI*/
+ RTUNI_ALPHA, /* U+00ffd7: HALFWIDTH HANGUL LETTER YU*/
+ 0, /* U+00ffd8: */
+ 0, /* U+00ffd9: */
+ RTUNI_ALPHA, /* U+00ffda: HALFWIDTH HANGUL LETTER EU*/
+ RTUNI_ALPHA, /* U+00ffdb: HALFWIDTH HANGUL LETTER YI*/
+ RTUNI_ALPHA, /* U+00ffdc: HALFWIDTH HANGUL LETTER I*/
+ 0, /* U+00ffdd: */
+ 0, /* U+00ffde: */
+ 0, /* U+00ffdf: */
+ 0, /* U+00ffe0: FULLWIDTH CENT SIGN*/
+ 0, /* U+00ffe1: FULLWIDTH POUND SIGN*/
+ 0, /* U+00ffe2: FULLWIDTH NOT SIGN*/
+ 0, /* U+00ffe3: FULLWIDTH MACRON*/
+ 0, /* U+00ffe4: FULLWIDTH BROKEN BAR*/
+ 0, /* U+00ffe5: FULLWIDTH YEN SIGN*/
+ 0, /* U+00ffe6: FULLWIDTH WON SIGN*/
+ 0, /* U+00ffe7: */
+ 0, /* U+00ffe8: HALFWIDTH FORMS LIGHT VERTICAL*/
+ 0, /* U+00ffe9: HALFWIDTH LEFTWARDS ARROW*/
+ 0, /* U+00ffea: HALFWIDTH UPWARDS ARROW*/
+ 0, /* U+00ffeb: HALFWIDTH RIGHTWARDS ARROW*/
+ 0, /* U+00ffec: HALFWIDTH DOWNWARDS ARROW*/
+ 0, /* U+00ffed: HALFWIDTH BLACK SQUARE*/
+ 0, /* U+00ffee: HALFWIDTH WHITE CIRCLE*/
+ 0, /* U+00ffef: */
+ 0, /* U+00fff0: */
+ 0, /* U+00fff1: */
+ 0, /* U+00fff2: */
+ 0, /* U+00fff3: */
+ 0, /* U+00fff4: */
+ 0, /* U+00fff5: */
+ 0, /* U+00fff6: */
+ 0, /* U+00fff7: */
+ 0, /* U+00fff8: */
+ 0, /* U+00fff9: INTERLINEAR ANNOTATION ANCHOR*/
+ 0, /* U+00fffa: INTERLINEAR ANNOTATION SEPARATOR*/
+ 0, /* U+00fffb: INTERLINEAR ANNOTATION TERMINATOR*/
+ 0, /* U+00fffc: OBJECT REPLACEMENT CHARACTER*/
+ 0, /* U+00fffd: REPLACEMENT CHARACTER*/
+ 0, /* U+00fffe: */
+ 0, /* U+00ffff: */
+ RTUNI_ALPHA, /* U+010000: LINEAR B SYLLABLE B008 A*/
+ RTUNI_ALPHA, /* U+010001: LINEAR B SYLLABLE B038 E*/
+ RTUNI_ALPHA, /* U+010002: LINEAR B SYLLABLE B028 I*/
+ RTUNI_ALPHA, /* U+010003: LINEAR B SYLLABLE B061 O*/
+ RTUNI_ALPHA, /* U+010004: LINEAR B SYLLABLE B010 U*/
+ RTUNI_ALPHA, /* U+010005: LINEAR B SYLLABLE B001 DA*/
+ RTUNI_ALPHA, /* U+010006: LINEAR B SYLLABLE B045 DE*/
+ RTUNI_ALPHA, /* U+010007: LINEAR B SYLLABLE B007 DI*/
+ RTUNI_ALPHA, /* U+010008: LINEAR B SYLLABLE B014 DO*/
+ RTUNI_ALPHA, /* U+010009: LINEAR B SYLLABLE B051 DU*/
+ RTUNI_ALPHA, /* U+01000a: LINEAR B SYLLABLE B057 JA*/
+ RTUNI_ALPHA, /* U+01000b: LINEAR B SYLLABLE B046 JE*/
+ 0, /* U+01000c: */
+ RTUNI_ALPHA, /* U+01000d: LINEAR B SYLLABLE B036 JO*/
+ RTUNI_ALPHA, /* U+01000e: LINEAR B SYLLABLE B065 JU*/
+ RTUNI_ALPHA, /* U+01000f: LINEAR B SYLLABLE B077 KA*/
+ RTUNI_ALPHA, /* U+010010: LINEAR B SYLLABLE B044 KE*/
+ RTUNI_ALPHA, /* U+010011: LINEAR B SYLLABLE B067 KI*/
+ RTUNI_ALPHA, /* U+010012: LINEAR B SYLLABLE B070 KO*/
+ RTUNI_ALPHA, /* U+010013: LINEAR B SYLLABLE B081 KU*/
+ RTUNI_ALPHA, /* U+010014: LINEAR B SYLLABLE B080 MA*/
+ RTUNI_ALPHA, /* U+010015: LINEAR B SYLLABLE B013 ME*/
+ RTUNI_ALPHA, /* U+010016: LINEAR B SYLLABLE B073 MI*/
+ RTUNI_ALPHA, /* U+010017: LINEAR B SYLLABLE B015 MO*/
+ RTUNI_ALPHA, /* U+010018: LINEAR B SYLLABLE B023 MU*/
+ RTUNI_ALPHA, /* U+010019: LINEAR B SYLLABLE B006 NA*/
+ RTUNI_ALPHA, /* U+01001a: LINEAR B SYLLABLE B024 NE*/
+ RTUNI_ALPHA, /* U+01001b: LINEAR B SYLLABLE B030 NI*/
+ RTUNI_ALPHA, /* U+01001c: LINEAR B SYLLABLE B052 NO*/
+ RTUNI_ALPHA, /* U+01001d: LINEAR B SYLLABLE B055 NU*/
+ RTUNI_ALPHA, /* U+01001e: LINEAR B SYLLABLE B003 PA*/
+ RTUNI_ALPHA, /* U+01001f: LINEAR B SYLLABLE B072 PE*/
+ RTUNI_ALPHA, /* U+010020: LINEAR B SYLLABLE B039 PI*/
+ RTUNI_ALPHA, /* U+010021: LINEAR B SYLLABLE B011 PO*/
+ RTUNI_ALPHA, /* U+010022: LINEAR B SYLLABLE B050 PU*/
+ RTUNI_ALPHA, /* U+010023: LINEAR B SYLLABLE B016 QA*/
+ RTUNI_ALPHA, /* U+010024: LINEAR B SYLLABLE B078 QE*/
+ RTUNI_ALPHA, /* U+010025: LINEAR B SYLLABLE B021 QI*/
+ RTUNI_ALPHA, /* U+010026: LINEAR B SYLLABLE B032 QO*/
+ 0, /* U+010027: */
+ RTUNI_ALPHA, /* U+010028: LINEAR B SYLLABLE B060 RA*/
+ RTUNI_ALPHA, /* U+010029: LINEAR B SYLLABLE B027 RE*/
+ RTUNI_ALPHA, /* U+01002a: LINEAR B SYLLABLE B053 RI*/
+ RTUNI_ALPHA, /* U+01002b: LINEAR B SYLLABLE B002 RO*/
+ RTUNI_ALPHA, /* U+01002c: LINEAR B SYLLABLE B026 RU*/
+ RTUNI_ALPHA, /* U+01002d: LINEAR B SYLLABLE B031 SA*/
+ RTUNI_ALPHA, /* U+01002e: LINEAR B SYLLABLE B009 SE*/
+ RTUNI_ALPHA, /* U+01002f: LINEAR B SYLLABLE B041 SI*/
+ RTUNI_ALPHA, /* U+010030: LINEAR B SYLLABLE B012 SO*/
+ RTUNI_ALPHA, /* U+010031: LINEAR B SYLLABLE B058 SU*/
+ RTUNI_ALPHA, /* U+010032: LINEAR B SYLLABLE B059 TA*/
+ RTUNI_ALPHA, /* U+010033: LINEAR B SYLLABLE B004 TE*/
+ RTUNI_ALPHA, /* U+010034: LINEAR B SYLLABLE B037 TI*/
+ RTUNI_ALPHA, /* U+010035: LINEAR B SYLLABLE B005 TO*/
+ RTUNI_ALPHA, /* U+010036: LINEAR B SYLLABLE B069 TU*/
+ RTUNI_ALPHA, /* U+010037: LINEAR B SYLLABLE B054 WA*/
+ RTUNI_ALPHA, /* U+010038: LINEAR B SYLLABLE B075 WE*/
+ RTUNI_ALPHA, /* U+010039: LINEAR B SYLLABLE B040 WI*/
+ RTUNI_ALPHA, /* U+01003a: LINEAR B SYLLABLE B042 WO*/
+ 0, /* U+01003b: */
+ RTUNI_ALPHA, /* U+01003c: LINEAR B SYLLABLE B017 ZA*/
+ RTUNI_ALPHA, /* U+01003d: LINEAR B SYLLABLE B074 ZE*/
+ 0, /* U+01003e: */
+ RTUNI_ALPHA, /* U+01003f: LINEAR B SYLLABLE B020 ZO*/
+ RTUNI_ALPHA, /* U+010040: LINEAR B SYLLABLE B025 A2*/
+ RTUNI_ALPHA, /* U+010041: LINEAR B SYLLABLE B043 A3*/
+ RTUNI_ALPHA, /* U+010042: LINEAR B SYLLABLE B085 AU*/
+ RTUNI_ALPHA, /* U+010043: LINEAR B SYLLABLE B071 DWE*/
+ RTUNI_ALPHA, /* U+010044: LINEAR B SYLLABLE B090 DWO*/
+ RTUNI_ALPHA, /* U+010045: LINEAR B SYLLABLE B048 NWA*/
+ RTUNI_ALPHA, /* U+010046: LINEAR B SYLLABLE B029 PU2*/
+ RTUNI_ALPHA, /* U+010047: LINEAR B SYLLABLE B062 PTE*/
+ RTUNI_ALPHA, /* U+010048: LINEAR B SYLLABLE B076 RA2*/
+ RTUNI_ALPHA, /* U+010049: LINEAR B SYLLABLE B033 RA3*/
+ RTUNI_ALPHA, /* U+01004a: LINEAR B SYLLABLE B068 RO2*/
+ RTUNI_ALPHA, /* U+01004b: LINEAR B SYLLABLE B066 TA2*/
+ RTUNI_ALPHA, /* U+01004c: LINEAR B SYLLABLE B087 TWE*/
+ RTUNI_ALPHA, /* U+01004d: LINEAR B SYLLABLE B091 TWO*/
+ 0, /* U+01004e: */
+ 0, /* U+01004f: */
+ RTUNI_ALPHA, /* U+010050: LINEAR B SYMBOL B018*/
+ RTUNI_ALPHA, /* U+010051: LINEAR B SYMBOL B019*/
+ RTUNI_ALPHA, /* U+010052: LINEAR B SYMBOL B022*/
+ RTUNI_ALPHA, /* U+010053: LINEAR B SYMBOL B034*/
+ RTUNI_ALPHA, /* U+010054: LINEAR B SYMBOL B047*/
+ RTUNI_ALPHA, /* U+010055: LINEAR B SYMBOL B049*/
+ RTUNI_ALPHA, /* U+010056: LINEAR B SYMBOL B056*/
+ RTUNI_ALPHA, /* U+010057: LINEAR B SYMBOL B063*/
+ RTUNI_ALPHA, /* U+010058: LINEAR B SYMBOL B064*/
+ RTUNI_ALPHA, /* U+010059: LINEAR B SYMBOL B079*/
+ RTUNI_ALPHA, /* U+01005a: LINEAR B SYMBOL B082*/
+ RTUNI_ALPHA, /* U+01005b: LINEAR B SYMBOL B083*/
+ RTUNI_ALPHA, /* U+01005c: LINEAR B SYMBOL B086*/
+ RTUNI_ALPHA, /* U+01005d: LINEAR B SYMBOL B089*/
+ 0, /* U+01005e: */
+ 0, /* U+01005f: */
+ 0, /* U+010060: */
+ 0, /* U+010061: */
+ 0, /* U+010062: */
+ 0, /* U+010063: */
+ 0, /* U+010064: */
+ 0, /* U+010065: */
+ 0, /* U+010066: */
+ 0, /* U+010067: */
+ 0, /* U+010068: */
+ 0, /* U+010069: */
+ 0, /* U+01006a: */
+ 0, /* U+01006b: */
+ 0, /* U+01006c: */
+ 0, /* U+01006d: */
+ 0, /* U+01006e: */
+ 0, /* U+01006f: */
+ 0, /* U+010070: */
+ 0, /* U+010071: */
+ 0, /* U+010072: */
+ 0, /* U+010073: */
+ 0, /* U+010074: */
+ 0, /* U+010075: */
+ 0, /* U+010076: */
+ 0, /* U+010077: */
+ 0, /* U+010078: */
+ 0, /* U+010079: */
+ 0, /* U+01007a: */
+ 0, /* U+01007b: */
+ 0, /* U+01007c: */
+ 0, /* U+01007d: */
+ 0, /* U+01007e: */
+ 0, /* U+01007f: */
+ RTUNI_ALPHA, /* U+010080: LINEAR B IDEOGRAM B100 MAN*/
+ RTUNI_ALPHA, /* U+010081: LINEAR B IDEOGRAM B102 WOMAN*/
+ RTUNI_ALPHA, /* U+010082: LINEAR B IDEOGRAM B104 DEER*/
+ RTUNI_ALPHA, /* U+010083: LINEAR B IDEOGRAM B105 EQUID*/
+ RTUNI_ALPHA, /* U+010084: LINEAR B IDEOGRAM B105F MARE*/
+ RTUNI_ALPHA, /* U+010085: LINEAR B IDEOGRAM B105M STALLION*/
+ RTUNI_ALPHA, /* U+010086: LINEAR B IDEOGRAM B106F EWE*/
+ RTUNI_ALPHA, /* U+010087: LINEAR B IDEOGRAM B106M RAM*/
+ RTUNI_ALPHA, /* U+010088: LINEAR B IDEOGRAM B107F SHE-GOAT*/
+ RTUNI_ALPHA, /* U+010089: LINEAR B IDEOGRAM B107M HE-GOAT*/
+ RTUNI_ALPHA, /* U+01008a: LINEAR B IDEOGRAM B108F SOW*/
+ RTUNI_ALPHA, /* U+01008b: LINEAR B IDEOGRAM B108M BOAR*/
+ RTUNI_ALPHA, /* U+01008c: LINEAR B IDEOGRAM B109F COW*/
+ RTUNI_ALPHA, /* U+01008d: LINEAR B IDEOGRAM B109M BULL*/
+ RTUNI_ALPHA, /* U+01008e: LINEAR B IDEOGRAM B120 WHEAT*/
+ RTUNI_ALPHA, /* U+01008f: LINEAR B IDEOGRAM B121 BARLEY*/
+ RTUNI_ALPHA, /* U+010090: LINEAR B IDEOGRAM B122 OLIVE*/
+ RTUNI_ALPHA, /* U+010091: LINEAR B IDEOGRAM B123 SPICE*/
+ RTUNI_ALPHA, /* U+010092: LINEAR B IDEOGRAM B125 CYPERUS*/
+ RTUNI_ALPHA, /* U+010093: LINEAR B MONOGRAM B127 KAPO*/
+ RTUNI_ALPHA, /* U+010094: LINEAR B MONOGRAM B128 KANAKO*/
+ RTUNI_ALPHA, /* U+010095: LINEAR B IDEOGRAM B130 OIL*/
+ RTUNI_ALPHA, /* U+010096: LINEAR B IDEOGRAM B131 WINE*/
+ RTUNI_ALPHA, /* U+010097: LINEAR B IDEOGRAM B132*/
+ RTUNI_ALPHA, /* U+010098: LINEAR B MONOGRAM B133 AREPA*/
+ RTUNI_ALPHA, /* U+010099: LINEAR B MONOGRAM B135 MERI*/
+ RTUNI_ALPHA, /* U+01009a: LINEAR B IDEOGRAM B140 BRONZE*/
+ RTUNI_ALPHA, /* U+01009b: LINEAR B IDEOGRAM B141 GOLD*/
+ RTUNI_ALPHA, /* U+01009c: LINEAR B IDEOGRAM B142*/
+ RTUNI_ALPHA, /* U+01009d: LINEAR B IDEOGRAM B145 WOOL*/
+ RTUNI_ALPHA, /* U+01009e: LINEAR B IDEOGRAM B146*/
+ RTUNI_ALPHA, /* U+01009f: LINEAR B IDEOGRAM B150*/
+ RTUNI_ALPHA, /* U+0100a0: LINEAR B IDEOGRAM B151 HORN*/
+ RTUNI_ALPHA, /* U+0100a1: LINEAR B IDEOGRAM B152*/
+ RTUNI_ALPHA, /* U+0100a2: LINEAR B IDEOGRAM B153*/
+ RTUNI_ALPHA, /* U+0100a3: LINEAR B IDEOGRAM B154*/
+ RTUNI_ALPHA, /* U+0100a4: LINEAR B MONOGRAM B156 TURO2*/
+ RTUNI_ALPHA, /* U+0100a5: LINEAR B IDEOGRAM B157*/
+ RTUNI_ALPHA, /* U+0100a6: LINEAR B IDEOGRAM B158*/
+ RTUNI_ALPHA, /* U+0100a7: LINEAR B IDEOGRAM B159 CLOTH*/
+ RTUNI_ALPHA, /* U+0100a8: LINEAR B IDEOGRAM B160*/
+ RTUNI_ALPHA, /* U+0100a9: LINEAR B IDEOGRAM B161*/
+ RTUNI_ALPHA, /* U+0100aa: LINEAR B IDEOGRAM B162 GARMENT*/
+ RTUNI_ALPHA, /* U+0100ab: LINEAR B IDEOGRAM B163 ARMOUR*/
+ RTUNI_ALPHA, /* U+0100ac: LINEAR B IDEOGRAM B164*/
+ RTUNI_ALPHA, /* U+0100ad: LINEAR B IDEOGRAM B165*/
+ RTUNI_ALPHA, /* U+0100ae: LINEAR B IDEOGRAM B166*/
+ RTUNI_ALPHA, /* U+0100af: LINEAR B IDEOGRAM B167*/
+ RTUNI_ALPHA, /* U+0100b0: LINEAR B IDEOGRAM B168*/
+ RTUNI_ALPHA, /* U+0100b1: LINEAR B IDEOGRAM B169*/
+ RTUNI_ALPHA, /* U+0100b2: LINEAR B IDEOGRAM B170*/
+ RTUNI_ALPHA, /* U+0100b3: LINEAR B IDEOGRAM B171*/
+ RTUNI_ALPHA, /* U+0100b4: LINEAR B IDEOGRAM B172*/
+ RTUNI_ALPHA, /* U+0100b5: LINEAR B IDEOGRAM B173 MONTH*/
+ RTUNI_ALPHA, /* U+0100b6: LINEAR B IDEOGRAM B174*/
+ RTUNI_ALPHA, /* U+0100b7: LINEAR B IDEOGRAM B176 TREE*/
+ RTUNI_ALPHA, /* U+0100b8: LINEAR B IDEOGRAM B177*/
+ RTUNI_ALPHA, /* U+0100b9: LINEAR B IDEOGRAM B178*/
+ RTUNI_ALPHA, /* U+0100ba: LINEAR B IDEOGRAM B179*/
+ RTUNI_ALPHA, /* U+0100bb: LINEAR B IDEOGRAM B180*/
+ RTUNI_ALPHA, /* U+0100bc: LINEAR B IDEOGRAM B181*/
+ RTUNI_ALPHA, /* U+0100bd: LINEAR B IDEOGRAM B182*/
+ RTUNI_ALPHA, /* U+0100be: LINEAR B IDEOGRAM B183*/
+ RTUNI_ALPHA, /* U+0100bf: LINEAR B IDEOGRAM B184*/
+ RTUNI_ALPHA, /* U+0100c0: LINEAR B IDEOGRAM B185*/
+ RTUNI_ALPHA, /* U+0100c1: LINEAR B IDEOGRAM B189*/
+ RTUNI_ALPHA, /* U+0100c2: LINEAR B IDEOGRAM B190*/
+ RTUNI_ALPHA, /* U+0100c3: LINEAR B IDEOGRAM B191 HELMET*/
+ RTUNI_ALPHA, /* U+0100c4: LINEAR B IDEOGRAM B220 FOOTSTOOL*/
+ RTUNI_ALPHA, /* U+0100c5: LINEAR B IDEOGRAM B225 BATHTUB*/
+ RTUNI_ALPHA, /* U+0100c6: LINEAR B IDEOGRAM B230 SPEAR*/
+ RTUNI_ALPHA, /* U+0100c7: LINEAR B IDEOGRAM B231 ARROW*/
+ RTUNI_ALPHA, /* U+0100c8: LINEAR B IDEOGRAM B232*/
+ RTUNI_ALPHA, /* U+0100c9: LINEAR B IDEOGRAM B233 SWORD*/
+ RTUNI_ALPHA, /* U+0100ca: LINEAR B IDEOGRAM B234*/
+ RTUNI_ALPHA, /* U+0100cb: LINEAR B IDEOGRAM B236*/
+ RTUNI_ALPHA, /* U+0100cc: LINEAR B IDEOGRAM B240 WHEELED CHARIOT*/
+ RTUNI_ALPHA, /* U+0100cd: LINEAR B IDEOGRAM B241 CHARIOT*/
+ RTUNI_ALPHA, /* U+0100ce: LINEAR B IDEOGRAM B242 CHARIOT FRAME*/
+ RTUNI_ALPHA, /* U+0100cf: LINEAR B IDEOGRAM B243 WHEEL*/
+ RTUNI_ALPHA, /* U+0100d0: LINEAR B IDEOGRAM B245*/
+ RTUNI_ALPHA, /* U+0100d1: LINEAR B IDEOGRAM B246*/
+ RTUNI_ALPHA, /* U+0100d2: LINEAR B MONOGRAM B247 DIPTE*/
+ RTUNI_ALPHA, /* U+0100d3: LINEAR B IDEOGRAM B248*/
+ RTUNI_ALPHA, /* U+0100d4: LINEAR B IDEOGRAM B249*/
+ RTUNI_ALPHA, /* U+0100d5: LINEAR B IDEOGRAM B251*/
+ RTUNI_ALPHA, /* U+0100d6: LINEAR B IDEOGRAM B252*/
+ RTUNI_ALPHA, /* U+0100d7: LINEAR B IDEOGRAM B253*/
+ RTUNI_ALPHA, /* U+0100d8: LINEAR B IDEOGRAM B254 DART*/
+ RTUNI_ALPHA, /* U+0100d9: LINEAR B IDEOGRAM B255*/
+ RTUNI_ALPHA, /* U+0100da: LINEAR B IDEOGRAM B256*/
+ RTUNI_ALPHA, /* U+0100db: LINEAR B IDEOGRAM B257*/
+ RTUNI_ALPHA, /* U+0100dc: LINEAR B IDEOGRAM B258*/
+ RTUNI_ALPHA, /* U+0100dd: LINEAR B IDEOGRAM B259*/
+ RTUNI_ALPHA, /* U+0100de: LINEAR B IDEOGRAM VESSEL B155*/
+ RTUNI_ALPHA, /* U+0100df: LINEAR B IDEOGRAM VESSEL B200*/
+ RTUNI_ALPHA, /* U+0100e0: LINEAR B IDEOGRAM VESSEL B201*/
+ RTUNI_ALPHA, /* U+0100e1: LINEAR B IDEOGRAM VESSEL B202*/
+ RTUNI_ALPHA, /* U+0100e2: LINEAR B IDEOGRAM VESSEL B203*/
+ RTUNI_ALPHA, /* U+0100e3: LINEAR B IDEOGRAM VESSEL B204*/
+ RTUNI_ALPHA, /* U+0100e4: LINEAR B IDEOGRAM VESSEL B205*/
+ RTUNI_ALPHA, /* U+0100e5: LINEAR B IDEOGRAM VESSEL B206*/
+ RTUNI_ALPHA, /* U+0100e6: LINEAR B IDEOGRAM VESSEL B207*/
+ RTUNI_ALPHA, /* U+0100e7: LINEAR B IDEOGRAM VESSEL B208*/
+ RTUNI_ALPHA, /* U+0100e8: LINEAR B IDEOGRAM VESSEL B209*/
+ RTUNI_ALPHA, /* U+0100e9: LINEAR B IDEOGRAM VESSEL B210*/
+ RTUNI_ALPHA, /* U+0100ea: LINEAR B IDEOGRAM VESSEL B211*/
+ RTUNI_ALPHA, /* U+0100eb: LINEAR B IDEOGRAM VESSEL B212*/
+ RTUNI_ALPHA, /* U+0100ec: LINEAR B IDEOGRAM VESSEL B213*/
+ RTUNI_ALPHA, /* U+0100ed: LINEAR B IDEOGRAM VESSEL B214*/
+ RTUNI_ALPHA, /* U+0100ee: LINEAR B IDEOGRAM VESSEL B215*/
+ RTUNI_ALPHA, /* U+0100ef: LINEAR B IDEOGRAM VESSEL B216*/
+ RTUNI_ALPHA, /* U+0100f0: LINEAR B IDEOGRAM VESSEL B217*/
+ RTUNI_ALPHA, /* U+0100f1: LINEAR B IDEOGRAM VESSEL B218*/
+ RTUNI_ALPHA, /* U+0100f2: LINEAR B IDEOGRAM VESSEL B219*/
+ RTUNI_ALPHA, /* U+0100f3: LINEAR B IDEOGRAM VESSEL B221*/
+ RTUNI_ALPHA, /* U+0100f4: LINEAR B IDEOGRAM VESSEL B222*/
+ RTUNI_ALPHA, /* U+0100f5: LINEAR B IDEOGRAM VESSEL B226*/
+ RTUNI_ALPHA, /* U+0100f6: LINEAR B IDEOGRAM VESSEL B227*/
+ RTUNI_ALPHA, /* U+0100f7: LINEAR B IDEOGRAM VESSEL B228*/
+ RTUNI_ALPHA, /* U+0100f8: LINEAR B IDEOGRAM VESSEL B229*/
+ RTUNI_ALPHA, /* U+0100f9: LINEAR B IDEOGRAM VESSEL B250*/
+ RTUNI_ALPHA, /* U+0100fa: LINEAR B IDEOGRAM VESSEL B305*/
+ 0, /* U+0100fb: */
+ 0, /* U+0100fc: */
+ 0, /* U+0100fd: */
+ 0, /* U+0100fe: */
+ 0, /* U+0100ff: */
+ 0, /* U+010100: AEGEAN WORD SEPARATOR LINE*/
+ 0, /* U+010101: AEGEAN WORD SEPARATOR DOT*/
+ 0, /* U+010102: AEGEAN CHECK MARK*/
+ 0, /* U+010103: */
+ 0, /* U+010104: */
+ 0, /* U+010105: */
+ 0, /* U+010106: */
+ 0, /* U+010107: AEGEAN NUMBER ONE*/
+ 0, /* U+010108: AEGEAN NUMBER TWO*/
+ 0, /* U+010109: AEGEAN NUMBER THREE*/
+ 0, /* U+01010a: AEGEAN NUMBER FOUR*/
+ 0, /* U+01010b: AEGEAN NUMBER FIVE*/
+ 0, /* U+01010c: AEGEAN NUMBER SIX*/
+ 0, /* U+01010d: AEGEAN NUMBER SEVEN*/
+ 0, /* U+01010e: AEGEAN NUMBER EIGHT*/
+ 0, /* U+01010f: AEGEAN NUMBER NINE*/
+ 0, /* U+010110: AEGEAN NUMBER TEN*/
+ 0, /* U+010111: AEGEAN NUMBER TWENTY*/
+ 0, /* U+010112: AEGEAN NUMBER THIRTY*/
+ 0, /* U+010113: AEGEAN NUMBER FORTY*/
+ 0, /* U+010114: AEGEAN NUMBER FIFTY*/
+ 0, /* U+010115: AEGEAN NUMBER SIXTY*/
+ 0, /* U+010116: AEGEAN NUMBER SEVENTY*/
+ 0, /* U+010117: AEGEAN NUMBER EIGHTY*/
+ 0, /* U+010118: AEGEAN NUMBER NINETY*/
+ 0, /* U+010119: AEGEAN NUMBER ONE HUNDRED*/
+ 0, /* U+01011a: AEGEAN NUMBER TWO HUNDRED*/
+ 0, /* U+01011b: AEGEAN NUMBER THREE HUNDRED*/
+ 0, /* U+01011c: AEGEAN NUMBER FOUR HUNDRED*/
+ 0, /* U+01011d: AEGEAN NUMBER FIVE HUNDRED*/
+ 0, /* U+01011e: AEGEAN NUMBER SIX HUNDRED*/
+ 0, /* U+01011f: AEGEAN NUMBER SEVEN HUNDRED*/
+ 0, /* U+010120: AEGEAN NUMBER EIGHT HUNDRED*/
+ 0, /* U+010121: AEGEAN NUMBER NINE HUNDRED*/
+ 0, /* U+010122: AEGEAN NUMBER ONE THOUSAND*/
+ 0, /* U+010123: AEGEAN NUMBER TWO THOUSAND*/
+ 0, /* U+010124: AEGEAN NUMBER THREE THOUSAND*/
+ 0, /* U+010125: AEGEAN NUMBER FOUR THOUSAND*/
+ 0, /* U+010126: AEGEAN NUMBER FIVE THOUSAND*/
+ 0, /* U+010127: AEGEAN NUMBER SIX THOUSAND*/
+ 0, /* U+010128: AEGEAN NUMBER SEVEN THOUSAND*/
+ 0, /* U+010129: AEGEAN NUMBER EIGHT THOUSAND*/
+ 0, /* U+01012a: AEGEAN NUMBER NINE THOUSAND*/
+ 0, /* U+01012b: AEGEAN NUMBER TEN THOUSAND*/
+ 0, /* U+01012c: AEGEAN NUMBER TWENTY THOUSAND*/
+ 0, /* U+01012d: AEGEAN NUMBER THIRTY THOUSAND*/
+ 0, /* U+01012e: AEGEAN NUMBER FORTY THOUSAND*/
+ 0, /* U+01012f: AEGEAN NUMBER FIFTY THOUSAND*/
+ 0, /* U+010130: AEGEAN NUMBER SIXTY THOUSAND*/
+ 0, /* U+010131: AEGEAN NUMBER SEVENTY THOUSAND*/
+ 0, /* U+010132: AEGEAN NUMBER EIGHTY THOUSAND*/
+ 0, /* U+010133: AEGEAN NUMBER NINETY THOUSAND*/
+ 0, /* U+010134: */
+ 0, /* U+010135: */
+ 0, /* U+010136: */
+ 0, /* U+010137: AEGEAN WEIGHT BASE UNIT*/
+ 0, /* U+010138: AEGEAN WEIGHT FIRST SUBUNIT*/
+ 0, /* U+010139: AEGEAN WEIGHT SECOND SUBUNIT*/
+ 0, /* U+01013a: AEGEAN WEIGHT THIRD SUBUNIT*/
+ 0, /* U+01013b: AEGEAN WEIGHT FOURTH SUBUNIT*/
+ 0, /* U+01013c: AEGEAN DRY MEASURE FIRST SUBUNIT*/
+ 0, /* U+01013d: AEGEAN LIQUID MEASURE FIRST SUBUNIT*/
+ 0, /* U+01013e: AEGEAN MEASURE SECOND SUBUNIT*/
+ 0, /* U+01013f: AEGEAN MEASURE THIRD SUBUNIT*/
+ RTUNI_ALPHA, /* U+010140: GREEK ACROPHONIC ATTIC ONE QUARTER*/
+ RTUNI_ALPHA, /* U+010141: GREEK ACROPHONIC ATTIC ONE HALF*/
+ RTUNI_ALPHA, /* U+010142: GREEK ACROPHONIC ATTIC ONE DRACHMA*/
+ RTUNI_ALPHA, /* U+010143: GREEK ACROPHONIC ATTIC FIVE*/
+ RTUNI_ALPHA, /* U+010144: GREEK ACROPHONIC ATTIC FIFTY*/
+ RTUNI_ALPHA, /* U+010145: GREEK ACROPHONIC ATTIC FIVE HUNDRED*/
+ RTUNI_ALPHA, /* U+010146: GREEK ACROPHONIC ATTIC FIVE THOUSAND*/
+ RTUNI_ALPHA, /* U+010147: GREEK ACROPHONIC ATTIC FIFTY THOUSAND*/
+ RTUNI_ALPHA, /* U+010148: GREEK ACROPHONIC ATTIC FIVE TALENTS*/
+ RTUNI_ALPHA, /* U+010149: GREEK ACROPHONIC ATTIC TEN TALENTS*/
+ RTUNI_ALPHA, /* U+01014a: GREEK ACROPHONIC ATTIC FIFTY TALENTS*/
+ RTUNI_ALPHA, /* U+01014b: GREEK ACROPHONIC ATTIC ONE HUNDRED TALENTS*/
+ RTUNI_ALPHA, /* U+01014c: GREEK ACROPHONIC ATTIC FIVE HUNDRED TALENTS*/
+ RTUNI_ALPHA, /* U+01014d: GREEK ACROPHONIC ATTIC ONE THOUSAND TALENTS*/
+ RTUNI_ALPHA, /* U+01014e: GREEK ACROPHONIC ATTIC FIVE THOUSAND TALENTS*/
+ RTUNI_ALPHA, /* U+01014f: GREEK ACROPHONIC ATTIC FIVE STATERS*/
+ RTUNI_ALPHA, /* U+010150: GREEK ACROPHONIC ATTIC TEN STATERS*/
+ RTUNI_ALPHA, /* U+010151: GREEK ACROPHONIC ATTIC FIFTY STATERS*/
+ RTUNI_ALPHA, /* U+010152: GREEK ACROPHONIC ATTIC ONE HUNDRED STATERS*/
+ RTUNI_ALPHA, /* U+010153: GREEK ACROPHONIC ATTIC FIVE HUNDRED STATERS*/
+ RTUNI_ALPHA, /* U+010154: GREEK ACROPHONIC ATTIC ONE THOUSAND STATERS*/
+ RTUNI_ALPHA, /* U+010155: GREEK ACROPHONIC ATTIC TEN THOUSAND STATERS*/
+ RTUNI_ALPHA, /* U+010156: GREEK ACROPHONIC ATTIC FIFTY THOUSAND STATERS*/
+ RTUNI_ALPHA, /* U+010157: GREEK ACROPHONIC ATTIC TEN MNAS*/
+ RTUNI_ALPHA, /* U+010158: GREEK ACROPHONIC HERAEUM ONE PLETHRON*/
+ RTUNI_ALPHA, /* U+010159: GREEK ACROPHONIC THESPIAN ONE*/
+ RTUNI_ALPHA, /* U+01015a: GREEK ACROPHONIC HERMIONIAN ONE*/
+ RTUNI_ALPHA, /* U+01015b: GREEK ACROPHONIC EPIDAUREAN TWO*/
+ RTUNI_ALPHA, /* U+01015c: GREEK ACROPHONIC THESPIAN TWO*/
+ RTUNI_ALPHA, /* U+01015d: GREEK ACROPHONIC CYRENAIC TWO DRACHMAS*/
+ RTUNI_ALPHA, /* U+01015e: GREEK ACROPHONIC EPIDAUREAN TWO DRACHMAS*/
+ RTUNI_ALPHA, /* U+01015f: GREEK ACROPHONIC TROEZENIAN FIVE*/
+ RTUNI_ALPHA, /* U+010160: GREEK ACROPHONIC TROEZENIAN TEN*/
+ RTUNI_ALPHA, /* U+010161: GREEK ACROPHONIC TROEZENIAN TEN ALTERNATE FORM*/
+ RTUNI_ALPHA, /* U+010162: GREEK ACROPHONIC HERMIONIAN TEN*/
+ RTUNI_ALPHA, /* U+010163: GREEK ACROPHONIC MESSENIAN TEN*/
+ RTUNI_ALPHA, /* U+010164: GREEK ACROPHONIC THESPIAN TEN*/
+ RTUNI_ALPHA, /* U+010165: GREEK ACROPHONIC THESPIAN THIRTY*/
+ RTUNI_ALPHA, /* U+010166: GREEK ACROPHONIC TROEZENIAN FIFTY*/
+ RTUNI_ALPHA, /* U+010167: GREEK ACROPHONIC TROEZENIAN FIFTY ALTERNATE FORM*/
+ RTUNI_ALPHA, /* U+010168: GREEK ACROPHONIC HERMIONIAN FIFTY*/
+ RTUNI_ALPHA, /* U+010169: GREEK ACROPHONIC THESPIAN FIFTY*/
+ RTUNI_ALPHA, /* U+01016a: GREEK ACROPHONIC THESPIAN ONE HUNDRED*/
+ RTUNI_ALPHA, /* U+01016b: GREEK ACROPHONIC THESPIAN THREE HUNDRED*/
+ RTUNI_ALPHA, /* U+01016c: GREEK ACROPHONIC EPIDAUREAN FIVE HUNDRED*/
+ RTUNI_ALPHA, /* U+01016d: GREEK ACROPHONIC TROEZENIAN FIVE HUNDRED*/
+ RTUNI_ALPHA, /* U+01016e: GREEK ACROPHONIC THESPIAN FIVE HUNDRED*/
+ RTUNI_ALPHA, /* U+01016f: GREEK ACROPHONIC CARYSTIAN FIVE HUNDRED*/
+ RTUNI_ALPHA, /* U+010170: GREEK ACROPHONIC NAXIAN FIVE HUNDRED*/
+ RTUNI_ALPHA, /* U+010171: GREEK ACROPHONIC THESPIAN ONE THOUSAND*/
+ RTUNI_ALPHA, /* U+010172: GREEK ACROPHONIC THESPIAN FIVE THOUSAND*/
+ RTUNI_ALPHA, /* U+010173: GREEK ACROPHONIC DELPHIC FIVE MNAS*/
+ RTUNI_ALPHA, /* U+010174: GREEK ACROPHONIC STRATIAN FIFTY MNAS*/
+ 0, /* U+010175: GREEK ONE HALF SIGN*/
+ 0, /* U+010176: GREEK ONE HALF SIGN ALTERNATE FORM*/
+ 0, /* U+010177: GREEK TWO THIRDS SIGN*/
+ 0, /* U+010178: GREEK THREE QUARTERS SIGN*/
+ 0, /* U+010179: GREEK YEAR SIGN*/
+ 0, /* U+01017a: GREEK TALENT SIGN*/
+ 0, /* U+01017b: GREEK DRACHMA SIGN*/
+ 0, /* U+01017c: GREEK OBOL SIGN*/
+ 0, /* U+01017d: GREEK TWO OBOLS SIGN*/
+ 0, /* U+01017e: GREEK THREE OBOLS SIGN*/
+ 0, /* U+01017f: GREEK FOUR OBOLS SIGN*/
+ 0, /* U+010180: GREEK FIVE OBOLS SIGN*/
+ 0, /* U+010181: GREEK METRETES SIGN*/
+ 0, /* U+010182: GREEK KYATHOS BASE SIGN*/
+ 0, /* U+010183: GREEK LITRA SIGN*/
+ 0, /* U+010184: GREEK OUNKIA SIGN*/
+ 0, /* U+010185: GREEK XESTES SIGN*/
+ 0, /* U+010186: GREEK ARTABE SIGN*/
+ 0, /* U+010187: GREEK AROURA SIGN*/
+ 0, /* U+010188: GREEK GRAMMA SIGN*/
+ 0, /* U+010189: GREEK TRYBLION BASE SIGN*/
+ 0, /* U+01018a: GREEK ZERO SIGN*/
+ 0, /* U+01018b: */
+ 0, /* U+01018c: */
+ 0, /* U+01018d: */
+ 0, /* U+01018e: */
+ 0, /* U+01018f: */
+ 0, /* U+010190: ROMAN SEXTANS SIGN*/
+ 0, /* U+010191: ROMAN UNCIA SIGN*/
+ 0, /* U+010192: ROMAN SEMUNCIA SIGN*/
+ 0, /* U+010193: ROMAN SEXTULA SIGN*/
+ 0, /* U+010194: ROMAN DIMIDIA SEXTULA SIGN*/
+ 0, /* U+010195: ROMAN SILIQUA SIGN*/
+ 0, /* U+010196: ROMAN DENARIUS SIGN*/
+ 0, /* U+010197: ROMAN QUINARIUS SIGN*/
+ 0, /* U+010198: ROMAN SESTERTIUS SIGN*/
+ 0, /* U+010199: ROMAN DUPONDIUS SIGN*/
+ 0, /* U+01019a: ROMAN AS SIGN*/
+ 0, /* U+01019b: ROMAN CENTURIAL SIGN*/
+ 0, /* U+01019c: */
+ 0, /* U+01019d: */
+ 0, /* U+01019e: */
+ 0, /* U+01019f: */
+ 0, /* U+0101a0: */
+ 0, /* U+0101a1: */
+ 0, /* U+0101a2: */
+ 0, /* U+0101a3: */
+ 0, /* U+0101a4: */
+ 0, /* U+0101a5: */
+ 0, /* U+0101a6: */
+ 0, /* U+0101a7: */
+ 0, /* U+0101a8: */
+ 0, /* U+0101a9: */
+ 0, /* U+0101aa: */
+ 0, /* U+0101ab: */
+ 0, /* U+0101ac: */
+ 0, /* U+0101ad: */
+ 0, /* U+0101ae: */
+ 0, /* U+0101af: */
+ 0, /* U+0101b0: */
+ 0, /* U+0101b1: */
+ 0, /* U+0101b2: */
+ 0, /* U+0101b3: */
+ 0, /* U+0101b4: */
+ 0, /* U+0101b5: */
+ 0, /* U+0101b6: */
+ 0, /* U+0101b7: */
+ 0, /* U+0101b8: */
+ 0, /* U+0101b9: */
+ 0, /* U+0101ba: */
+ 0, /* U+0101bb: */
+ 0, /* U+0101bc: */
+ 0, /* U+0101bd: */
+ 0, /* U+0101be: */
+ 0, /* U+0101bf: */
+ 0, /* U+0101c0: */
+ 0, /* U+0101c1: */
+ 0, /* U+0101c2: */
+ 0, /* U+0101c3: */
+ 0, /* U+0101c4: */
+ 0, /* U+0101c5: */
+ 0, /* U+0101c6: */
+ 0, /* U+0101c7: */
+ 0, /* U+0101c8: */
+ 0, /* U+0101c9: */
+ 0, /* U+0101ca: */
+ 0, /* U+0101cb: */
+ 0, /* U+0101cc: */
+ 0, /* U+0101cd: */
+ 0, /* U+0101ce: */
+ 0, /* U+0101cf: */
+ 0, /* U+0101d0: PHAISTOS DISC SIGN PEDESTRIAN*/
+ 0, /* U+0101d1: PHAISTOS DISC SIGN PLUMED HEAD*/
+ 0, /* U+0101d2: PHAISTOS DISC SIGN TATTOOED HEAD*/
+ 0, /* U+0101d3: PHAISTOS DISC SIGN CAPTIVE*/
+ 0, /* U+0101d4: PHAISTOS DISC SIGN CHILD*/
+ 0, /* U+0101d5: PHAISTOS DISC SIGN WOMAN*/
+ 0, /* U+0101d6: PHAISTOS DISC SIGN HELMET*/
+ 0, /* U+0101d7: PHAISTOS DISC SIGN GAUNTLET*/
+ 0, /* U+0101d8: PHAISTOS DISC SIGN TIARA*/
+ 0, /* U+0101d9: PHAISTOS DISC SIGN ARROW*/
+ 0, /* U+0101da: PHAISTOS DISC SIGN BOW*/
+ 0, /* U+0101db: PHAISTOS DISC SIGN SHIELD*/
+ 0, /* U+0101dc: PHAISTOS DISC SIGN CLUB*/
+ 0, /* U+0101dd: PHAISTOS DISC SIGN MANACLES*/
+ 0, /* U+0101de: PHAISTOS DISC SIGN MATTOCK*/
+ 0, /* U+0101df: PHAISTOS DISC SIGN SAW*/
+ 0, /* U+0101e0: PHAISTOS DISC SIGN LID*/
+ 0, /* U+0101e1: PHAISTOS DISC SIGN BOOMERANG*/
+ 0, /* U+0101e2: PHAISTOS DISC SIGN CARPENTRY PLANE*/
+ 0, /* U+0101e3: PHAISTOS DISC SIGN DOLIUM*/
+ 0, /* U+0101e4: PHAISTOS DISC SIGN COMB*/
+ 0, /* U+0101e5: PHAISTOS DISC SIGN SLING*/
+ 0, /* U+0101e6: PHAISTOS DISC SIGN COLUMN*/
+ 0, /* U+0101e7: PHAISTOS DISC SIGN BEEHIVE*/
+ 0, /* U+0101e8: PHAISTOS DISC SIGN SHIP*/
+ 0, /* U+0101e9: PHAISTOS DISC SIGN HORN*/
+ 0, /* U+0101ea: PHAISTOS DISC SIGN HIDE*/
+ 0, /* U+0101eb: PHAISTOS DISC SIGN BULLS LEG*/
+ 0, /* U+0101ec: PHAISTOS DISC SIGN CAT*/
+ 0, /* U+0101ed: PHAISTOS DISC SIGN RAM*/
+ 0, /* U+0101ee: PHAISTOS DISC SIGN EAGLE*/
+ 0, /* U+0101ef: PHAISTOS DISC SIGN DOVE*/
+ 0, /* U+0101f0: PHAISTOS DISC SIGN TUNNY*/
+ 0, /* U+0101f1: PHAISTOS DISC SIGN BEE*/
+ 0, /* U+0101f2: PHAISTOS DISC SIGN PLANE TREE*/
+ 0, /* U+0101f3: PHAISTOS DISC SIGN VINE*/
+ 0, /* U+0101f4: PHAISTOS DISC SIGN PAPYRUS*/
+ 0, /* U+0101f5: PHAISTOS DISC SIGN ROSETTE*/
+ 0, /* U+0101f6: PHAISTOS DISC SIGN LILY*/
+ 0, /* U+0101f7: PHAISTOS DISC SIGN OX BACK*/
+ 0, /* U+0101f8: PHAISTOS DISC SIGN FLUTE*/
+ 0, /* U+0101f9: PHAISTOS DISC SIGN GRATER*/
+ 0, /* U+0101fa: PHAISTOS DISC SIGN STRAINER*/
+ 0, /* U+0101fb: PHAISTOS DISC SIGN SMALL AXE*/
+ 0, /* U+0101fc: PHAISTOS DISC SIGN WAVY BAND*/
+ 0, /* U+0101fd: PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE*/
+ 0, /* U+0101fe: */
+ 0, /* U+0101ff: */
+ 0, /* U+010200: */
+ 0, /* U+010201: */
+ 0, /* U+010202: */
+ 0, /* U+010203: */
+ 0, /* U+010204: */
+ 0, /* U+010205: */
+ 0, /* U+010206: */
+ 0, /* U+010207: */
+ 0, /* U+010208: */
+ 0, /* U+010209: */
+ 0, /* U+01020a: */
+ 0, /* U+01020b: */
+ 0, /* U+01020c: */
+ 0, /* U+01020d: */
+ 0, /* U+01020e: */
+ 0, /* U+01020f: */
+ 0, /* U+010210: */
+ 0, /* U+010211: */
+ 0, /* U+010212: */
+ 0, /* U+010213: */
+ 0, /* U+010214: */
+ 0, /* U+010215: */
+ 0, /* U+010216: */
+ 0, /* U+010217: */
+ 0, /* U+010218: */
+ 0, /* U+010219: */
+ 0, /* U+01021a: */
+ 0, /* U+01021b: */
+ 0, /* U+01021c: */
+ 0, /* U+01021d: */
+ 0, /* U+01021e: */
+ 0, /* U+01021f: */
+ 0, /* U+010220: */
+ 0, /* U+010221: */
+ 0, /* U+010222: */
+ 0, /* U+010223: */
+ 0, /* U+010224: */
+ 0, /* U+010225: */
+ 0, /* U+010226: */
+ 0, /* U+010227: */
+ 0, /* U+010228: */
+ 0, /* U+010229: */
+ 0, /* U+01022a: */
+ 0, /* U+01022b: */
+ 0, /* U+01022c: */
+ 0, /* U+01022d: */
+ 0, /* U+01022e: */
+ 0, /* U+01022f: */
+ 0, /* U+010230: */
+ 0, /* U+010231: */
+ 0, /* U+010232: */
+ 0, /* U+010233: */
+ 0, /* U+010234: */
+ 0, /* U+010235: */
+ 0, /* U+010236: */
+ 0, /* U+010237: */
+ 0, /* U+010238: */
+ 0, /* U+010239: */
+ 0, /* U+01023a: */
+ 0, /* U+01023b: */
+ 0, /* U+01023c: */
+ 0, /* U+01023d: */
+ 0, /* U+01023e: */
+ 0, /* U+01023f: */
+ 0, /* U+010240: */
+ 0, /* U+010241: */
+ 0, /* U+010242: */
+ 0, /* U+010243: */
+ 0, /* U+010244: */
+ 0, /* U+010245: */
+ 0, /* U+010246: */
+ 0, /* U+010247: */
+ 0, /* U+010248: */
+ 0, /* U+010249: */
+ 0, /* U+01024a: */
+ 0, /* U+01024b: */
+ 0, /* U+01024c: */
+ 0, /* U+01024d: */
+ 0, /* U+01024e: */
+ 0, /* U+01024f: */
+ 0, /* U+010250: */
+ 0, /* U+010251: */
+ 0, /* U+010252: */
+ 0, /* U+010253: */
+ 0, /* U+010254: */
+ 0, /* U+010255: */
+ 0, /* U+010256: */
+ 0, /* U+010257: */
+ 0, /* U+010258: */
+ 0, /* U+010259: */
+ 0, /* U+01025a: */
+ 0, /* U+01025b: */
+ 0, /* U+01025c: */
+ 0, /* U+01025d: */
+ 0, /* U+01025e: */
+ 0, /* U+01025f: */
+ 0, /* U+010260: */
+ 0, /* U+010261: */
+ 0, /* U+010262: */
+ 0, /* U+010263: */
+ 0, /* U+010264: */
+ 0, /* U+010265: */
+ 0, /* U+010266: */
+ 0, /* U+010267: */
+ 0, /* U+010268: */
+ 0, /* U+010269: */
+ 0, /* U+01026a: */
+ 0, /* U+01026b: */
+ 0, /* U+01026c: */
+ 0, /* U+01026d: */
+ 0, /* U+01026e: */
+ 0, /* U+01026f: */
+ 0, /* U+010270: */
+ 0, /* U+010271: */
+ 0, /* U+010272: */
+ 0, /* U+010273: */
+ 0, /* U+010274: */
+ 0, /* U+010275: */
+ 0, /* U+010276: */
+ 0, /* U+010277: */
+ 0, /* U+010278: */
+ 0, /* U+010279: */
+ 0, /* U+01027a: */
+ 0, /* U+01027b: */
+ 0, /* U+01027c: */
+ 0, /* U+01027d: */
+ 0, /* U+01027e: */
+ 0, /* U+01027f: */
+ RTUNI_ALPHA, /* U+010280: LYCIAN LETTER A*/
+ RTUNI_ALPHA, /* U+010281: LYCIAN LETTER E*/
+ RTUNI_ALPHA, /* U+010282: LYCIAN LETTER B*/
+ RTUNI_ALPHA, /* U+010283: LYCIAN LETTER BH*/
+ RTUNI_ALPHA, /* U+010284: LYCIAN LETTER G*/
+ RTUNI_ALPHA, /* U+010285: LYCIAN LETTER D*/
+ RTUNI_ALPHA, /* U+010286: LYCIAN LETTER I*/
+ RTUNI_ALPHA, /* U+010287: LYCIAN LETTER W*/
+ RTUNI_ALPHA, /* U+010288: LYCIAN LETTER Z*/
+ RTUNI_ALPHA, /* U+010289: LYCIAN LETTER TH*/
+ RTUNI_ALPHA, /* U+01028a: LYCIAN LETTER J*/
+ RTUNI_ALPHA, /* U+01028b: LYCIAN LETTER K*/
+ RTUNI_ALPHA, /* U+01028c: LYCIAN LETTER Q*/
+ RTUNI_ALPHA, /* U+01028d: LYCIAN LETTER L*/
+ RTUNI_ALPHA, /* U+01028e: LYCIAN LETTER M*/
+ RTUNI_ALPHA, /* U+01028f: LYCIAN LETTER N*/
+ RTUNI_ALPHA, /* U+010290: LYCIAN LETTER MM*/
+ RTUNI_ALPHA, /* U+010291: LYCIAN LETTER NN*/
+ RTUNI_ALPHA, /* U+010292: LYCIAN LETTER U*/
+ RTUNI_ALPHA, /* U+010293: LYCIAN LETTER P*/
+ RTUNI_ALPHA, /* U+010294: LYCIAN LETTER KK*/
+ RTUNI_ALPHA, /* U+010295: LYCIAN LETTER R*/
+ RTUNI_ALPHA, /* U+010296: LYCIAN LETTER S*/
+ RTUNI_ALPHA, /* U+010297: LYCIAN LETTER T*/
+ RTUNI_ALPHA, /* U+010298: LYCIAN LETTER TT*/
+ RTUNI_ALPHA, /* U+010299: LYCIAN LETTER AN*/
+ RTUNI_ALPHA, /* U+01029a: LYCIAN LETTER EN*/
+ RTUNI_ALPHA, /* U+01029b: LYCIAN LETTER H*/
+ RTUNI_ALPHA, /* U+01029c: LYCIAN LETTER X*/
+ 0, /* U+01029d: */
+ 0, /* U+01029e: */
+ 0, /* U+01029f: */
+ RTUNI_ALPHA, /* U+0102a0: CARIAN LETTER A*/
+ RTUNI_ALPHA, /* U+0102a1: CARIAN LETTER P2*/
+ RTUNI_ALPHA, /* U+0102a2: CARIAN LETTER D*/
+ RTUNI_ALPHA, /* U+0102a3: CARIAN LETTER L*/
+ RTUNI_ALPHA, /* U+0102a4: CARIAN LETTER UUU*/
+ RTUNI_ALPHA, /* U+0102a5: CARIAN LETTER R*/
+ RTUNI_ALPHA, /* U+0102a6: CARIAN LETTER LD*/
+ RTUNI_ALPHA, /* U+0102a7: CARIAN LETTER A2*/
+ RTUNI_ALPHA, /* U+0102a8: CARIAN LETTER Q*/
+ RTUNI_ALPHA, /* U+0102a9: CARIAN LETTER B*/
+ RTUNI_ALPHA, /* U+0102aa: CARIAN LETTER M*/
+ RTUNI_ALPHA, /* U+0102ab: CARIAN LETTER O*/
+ RTUNI_ALPHA, /* U+0102ac: CARIAN LETTER D2*/
+ RTUNI_ALPHA, /* U+0102ad: CARIAN LETTER T*/
+ RTUNI_ALPHA, /* U+0102ae: CARIAN LETTER SH*/
+ RTUNI_ALPHA, /* U+0102af: CARIAN LETTER SH2*/
+ RTUNI_ALPHA, /* U+0102b0: CARIAN LETTER S*/
+ RTUNI_ALPHA, /* U+0102b1: CARIAN LETTER C-18*/
+ RTUNI_ALPHA, /* U+0102b2: CARIAN LETTER U*/
+ RTUNI_ALPHA, /* U+0102b3: CARIAN LETTER NN*/
+ RTUNI_ALPHA, /* U+0102b4: CARIAN LETTER X*/
+ RTUNI_ALPHA, /* U+0102b5: CARIAN LETTER N*/
+ RTUNI_ALPHA, /* U+0102b6: CARIAN LETTER TT2*/
+ RTUNI_ALPHA, /* U+0102b7: CARIAN LETTER P*/
+ RTUNI_ALPHA, /* U+0102b8: CARIAN LETTER SS*/
+ RTUNI_ALPHA, /* U+0102b9: CARIAN LETTER I*/
+ RTUNI_ALPHA, /* U+0102ba: CARIAN LETTER E*/
+ RTUNI_ALPHA, /* U+0102bb: CARIAN LETTER UUUU*/
+ RTUNI_ALPHA, /* U+0102bc: CARIAN LETTER K*/
+ RTUNI_ALPHA, /* U+0102bd: CARIAN LETTER K2*/
+ RTUNI_ALPHA, /* U+0102be: CARIAN LETTER ND*/
+ RTUNI_ALPHA, /* U+0102bf: CARIAN LETTER UU*/
+ RTUNI_ALPHA, /* U+0102c0: CARIAN LETTER G*/
+ RTUNI_ALPHA, /* U+0102c1: CARIAN LETTER G2*/
+ RTUNI_ALPHA, /* U+0102c2: CARIAN LETTER ST*/
+ RTUNI_ALPHA, /* U+0102c3: CARIAN LETTER ST2*/
+ RTUNI_ALPHA, /* U+0102c4: CARIAN LETTER NG*/
+ RTUNI_ALPHA, /* U+0102c5: CARIAN LETTER II*/
+ RTUNI_ALPHA, /* U+0102c6: CARIAN LETTER C-39*/
+ RTUNI_ALPHA, /* U+0102c7: CARIAN LETTER TT*/
+ RTUNI_ALPHA, /* U+0102c8: CARIAN LETTER UUU2*/
+ RTUNI_ALPHA, /* U+0102c9: CARIAN LETTER RR*/
+ RTUNI_ALPHA, /* U+0102ca: CARIAN LETTER MB*/
+ RTUNI_ALPHA, /* U+0102cb: CARIAN LETTER MB2*/
+ RTUNI_ALPHA, /* U+0102cc: CARIAN LETTER MB3*/
+ RTUNI_ALPHA, /* U+0102cd: CARIAN LETTER MB4*/
+ RTUNI_ALPHA, /* U+0102ce: CARIAN LETTER LD2*/
+ RTUNI_ALPHA, /* U+0102cf: CARIAN LETTER E2*/
+ RTUNI_ALPHA, /* U+0102d0: CARIAN LETTER UUU3*/
+ 0, /* U+0102d1: */
+ 0, /* U+0102d2: */
+ 0, /* U+0102d3: */
+ 0, /* U+0102d4: */
+ 0, /* U+0102d5: */
+ 0, /* U+0102d6: */
+ 0, /* U+0102d7: */
+ 0, /* U+0102d8: */
+ 0, /* U+0102d9: */
+ 0, /* U+0102da: */
+ 0, /* U+0102db: */
+ 0, /* U+0102dc: */
+ 0, /* U+0102dd: */
+ 0, /* U+0102de: */
+ 0, /* U+0102df: */
+ 0, /* U+0102e0: */
+ 0, /* U+0102e1: */
+ 0, /* U+0102e2: */
+ 0, /* U+0102e3: */
+ 0, /* U+0102e4: */
+ 0, /* U+0102e5: */
+ 0, /* U+0102e6: */
+ 0, /* U+0102e7: */
+ 0, /* U+0102e8: */
+ 0, /* U+0102e9: */
+ 0, /* U+0102ea: */
+ 0, /* U+0102eb: */
+ 0, /* U+0102ec: */
+ 0, /* U+0102ed: */
+ 0, /* U+0102ee: */
+ 0, /* U+0102ef: */
+ 0, /* U+0102f0: */
+ 0, /* U+0102f1: */
+ 0, /* U+0102f2: */
+ 0, /* U+0102f3: */
+ 0, /* U+0102f4: */
+ 0, /* U+0102f5: */
+ 0, /* U+0102f6: */
+ 0, /* U+0102f7: */
+ 0, /* U+0102f8: */
+ 0, /* U+0102f9: */
+ 0, /* U+0102fa: */
+ 0, /* U+0102fb: */
+ 0, /* U+0102fc: */
+ 0, /* U+0102fd: */
+ 0, /* U+0102fe: */
+ 0, /* U+0102ff: */
+ RTUNI_ALPHA, /* U+010300: OLD ITALIC LETTER A*/
+ RTUNI_ALPHA, /* U+010301: OLD ITALIC LETTER BE*/
+ RTUNI_ALPHA, /* U+010302: OLD ITALIC LETTER KE*/
+ RTUNI_ALPHA, /* U+010303: OLD ITALIC LETTER DE*/
+ RTUNI_ALPHA, /* U+010304: OLD ITALIC LETTER E*/
+ RTUNI_ALPHA, /* U+010305: OLD ITALIC LETTER VE*/
+ RTUNI_ALPHA, /* U+010306: OLD ITALIC LETTER ZE*/
+ RTUNI_ALPHA, /* U+010307: OLD ITALIC LETTER HE*/
+ RTUNI_ALPHA, /* U+010308: OLD ITALIC LETTER THE*/
+ RTUNI_ALPHA, /* U+010309: OLD ITALIC LETTER I*/
+ RTUNI_ALPHA, /* U+01030a: OLD ITALIC LETTER KA*/
+ RTUNI_ALPHA, /* U+01030b: OLD ITALIC LETTER EL*/
+ RTUNI_ALPHA, /* U+01030c: OLD ITALIC LETTER EM*/
+ RTUNI_ALPHA, /* U+01030d: OLD ITALIC LETTER EN*/
+ RTUNI_ALPHA, /* U+01030e: OLD ITALIC LETTER ESH*/
+ RTUNI_ALPHA, /* U+01030f: OLD ITALIC LETTER O*/
+ RTUNI_ALPHA, /* U+010310: OLD ITALIC LETTER PE*/
+ RTUNI_ALPHA, /* U+010311: OLD ITALIC LETTER SHE*/
+ RTUNI_ALPHA, /* U+010312: OLD ITALIC LETTER KU*/
+ RTUNI_ALPHA, /* U+010313: OLD ITALIC LETTER ER*/
+ RTUNI_ALPHA, /* U+010314: OLD ITALIC LETTER ES*/
+ RTUNI_ALPHA, /* U+010315: OLD ITALIC LETTER TE*/
+ RTUNI_ALPHA, /* U+010316: OLD ITALIC LETTER U*/
+ RTUNI_ALPHA, /* U+010317: OLD ITALIC LETTER EKS*/
+ RTUNI_ALPHA, /* U+010318: OLD ITALIC LETTER PHE*/
+ RTUNI_ALPHA, /* U+010319: OLD ITALIC LETTER KHE*/
+ RTUNI_ALPHA, /* U+01031a: OLD ITALIC LETTER EF*/
+ RTUNI_ALPHA, /* U+01031b: OLD ITALIC LETTER ERS*/
+ RTUNI_ALPHA, /* U+01031c: OLD ITALIC LETTER CHE*/
+ RTUNI_ALPHA, /* U+01031d: OLD ITALIC LETTER II*/
+ RTUNI_ALPHA, /* U+01031e: OLD ITALIC LETTER UU*/
+ 0, /* U+01031f: */
+ 0, /* U+010320: OLD ITALIC NUMERAL ONE*/
+ 0, /* U+010321: OLD ITALIC NUMERAL FIVE*/
+ 0, /* U+010322: OLD ITALIC NUMERAL TEN*/
+ 0, /* U+010323: OLD ITALIC NUMERAL FIFTY*/
+ 0, /* U+010324: */
+ 0, /* U+010325: */
+ 0, /* U+010326: */
+ 0, /* U+010327: */
+ 0, /* U+010328: */
+ 0, /* U+010329: */
+ 0, /* U+01032a: */
+ 0, /* U+01032b: */
+ 0, /* U+01032c: */
+ 0, /* U+01032d: */
+ 0, /* U+01032e: */
+ 0, /* U+01032f: */
+ RTUNI_ALPHA, /* U+010330: GOTHIC LETTER AHSA*/
+ RTUNI_ALPHA, /* U+010331: GOTHIC LETTER BAIRKAN*/
+ RTUNI_ALPHA, /* U+010332: GOTHIC LETTER GIBA*/
+ RTUNI_ALPHA, /* U+010333: GOTHIC LETTER DAGS*/
+ RTUNI_ALPHA, /* U+010334: GOTHIC LETTER AIHVUS*/
+ RTUNI_ALPHA, /* U+010335: GOTHIC LETTER QAIRTHRA*/
+ RTUNI_ALPHA, /* U+010336: GOTHIC LETTER IUJA*/
+ RTUNI_ALPHA, /* U+010337: GOTHIC LETTER HAGL*/
+ RTUNI_ALPHA, /* U+010338: GOTHIC LETTER THIUTH*/
+ RTUNI_ALPHA, /* U+010339: GOTHIC LETTER EIS*/
+ RTUNI_ALPHA, /* U+01033a: GOTHIC LETTER KUSMA*/
+ RTUNI_ALPHA, /* U+01033b: GOTHIC LETTER LAGUS*/
+ RTUNI_ALPHA, /* U+01033c: GOTHIC LETTER MANNA*/
+ RTUNI_ALPHA, /* U+01033d: GOTHIC LETTER NAUTHS*/
+ RTUNI_ALPHA, /* U+01033e: GOTHIC LETTER JER*/
+ RTUNI_ALPHA, /* U+01033f: GOTHIC LETTER URUS*/
+ RTUNI_ALPHA, /* U+010340: GOTHIC LETTER PAIRTHRA*/
+ RTUNI_ALPHA, /* U+010341: GOTHIC LETTER NINETY*/
+ RTUNI_ALPHA, /* U+010342: GOTHIC LETTER RAIDA*/
+ RTUNI_ALPHA, /* U+010343: GOTHIC LETTER SAUIL*/
+ RTUNI_ALPHA, /* U+010344: GOTHIC LETTER TEIWS*/
+ RTUNI_ALPHA, /* U+010345: GOTHIC LETTER WINJA*/
+ RTUNI_ALPHA, /* U+010346: GOTHIC LETTER FAIHU*/
+ RTUNI_ALPHA, /* U+010347: GOTHIC LETTER IGGWS*/
+ RTUNI_ALPHA, /* U+010348: GOTHIC LETTER HWAIR*/
+ RTUNI_ALPHA, /* U+010349: GOTHIC LETTER OTHAL*/
+ RTUNI_ALPHA, /* U+01034a: GOTHIC LETTER NINE HUNDRED*/
+ 0, /* U+01034b: */
+ 0, /* U+01034c: */
+ 0, /* U+01034d: */
+ 0, /* U+01034e: */
+ 0, /* U+01034f: */
+ 0, /* U+010350: */
+ 0, /* U+010351: */
+ 0, /* U+010352: */
+ 0, /* U+010353: */
+ 0, /* U+010354: */
+ 0, /* U+010355: */
+ 0, /* U+010356: */
+ 0, /* U+010357: */
+ 0, /* U+010358: */
+ 0, /* U+010359: */
+ 0, /* U+01035a: */
+ 0, /* U+01035b: */
+ 0, /* U+01035c: */
+ 0, /* U+01035d: */
+ 0, /* U+01035e: */
+ 0, /* U+01035f: */
+ 0, /* U+010360: */
+ 0, /* U+010361: */
+ 0, /* U+010362: */
+ 0, /* U+010363: */
+ 0, /* U+010364: */
+ 0, /* U+010365: */
+ 0, /* U+010366: */
+ 0, /* U+010367: */
+ 0, /* U+010368: */
+ 0, /* U+010369: */
+ 0, /* U+01036a: */
+ 0, /* U+01036b: */
+ 0, /* U+01036c: */
+ 0, /* U+01036d: */
+ 0, /* U+01036e: */
+ 0, /* U+01036f: */
+ 0, /* U+010370: */
+ 0, /* U+010371: */
+ 0, /* U+010372: */
+ 0, /* U+010373: */
+ 0, /* U+010374: */
+ 0, /* U+010375: */
+ 0, /* U+010376: */
+ 0, /* U+010377: */
+ 0, /* U+010378: */
+ 0, /* U+010379: */
+ 0, /* U+01037a: */
+ 0, /* U+01037b: */
+ 0, /* U+01037c: */
+ 0, /* U+01037d: */
+ 0, /* U+01037e: */
+ 0, /* U+01037f: */
+ RTUNI_ALPHA, /* U+010380: UGARITIC LETTER ALPA*/
+ RTUNI_ALPHA, /* U+010381: UGARITIC LETTER BETA*/
+ RTUNI_ALPHA, /* U+010382: UGARITIC LETTER GAMLA*/
+ RTUNI_ALPHA, /* U+010383: UGARITIC LETTER KHA*/
+ RTUNI_ALPHA, /* U+010384: UGARITIC LETTER DELTA*/
+ RTUNI_ALPHA, /* U+010385: UGARITIC LETTER HO*/
+ RTUNI_ALPHA, /* U+010386: UGARITIC LETTER WO*/
+ RTUNI_ALPHA, /* U+010387: UGARITIC LETTER ZETA*/
+ RTUNI_ALPHA, /* U+010388: UGARITIC LETTER HOTA*/
+ RTUNI_ALPHA, /* U+010389: UGARITIC LETTER TET*/
+ RTUNI_ALPHA, /* U+01038a: UGARITIC LETTER YOD*/
+ RTUNI_ALPHA, /* U+01038b: UGARITIC LETTER KAF*/
+ RTUNI_ALPHA, /* U+01038c: UGARITIC LETTER SHIN*/
+ RTUNI_ALPHA, /* U+01038d: UGARITIC LETTER LAMDA*/
+ RTUNI_ALPHA, /* U+01038e: UGARITIC LETTER MEM*/
+ RTUNI_ALPHA, /* U+01038f: UGARITIC LETTER DHAL*/
+ RTUNI_ALPHA, /* U+010390: UGARITIC LETTER NUN*/
+ RTUNI_ALPHA, /* U+010391: UGARITIC LETTER ZU*/
+ RTUNI_ALPHA, /* U+010392: UGARITIC LETTER SAMKA*/
+ RTUNI_ALPHA, /* U+010393: UGARITIC LETTER AIN*/
+ RTUNI_ALPHA, /* U+010394: UGARITIC LETTER PU*/
+ RTUNI_ALPHA, /* U+010395: UGARITIC LETTER SADE*/
+ RTUNI_ALPHA, /* U+010396: UGARITIC LETTER QOPA*/
+ RTUNI_ALPHA, /* U+010397: UGARITIC LETTER RASHA*/
+ RTUNI_ALPHA, /* U+010398: UGARITIC LETTER THANNA*/
+ RTUNI_ALPHA, /* U+010399: UGARITIC LETTER GHAIN*/
+ RTUNI_ALPHA, /* U+01039a: UGARITIC LETTER TO*/
+ RTUNI_ALPHA, /* U+01039b: UGARITIC LETTER I*/
+ RTUNI_ALPHA, /* U+01039c: UGARITIC LETTER U*/
+ RTUNI_ALPHA, /* U+01039d: UGARITIC LETTER SSU*/
+ 0, /* U+01039e: */
+ 0, /* U+01039f: UGARITIC WORD DIVIDER*/
+ RTUNI_ALPHA, /* U+0103a0: OLD PERSIAN SIGN A*/
+ RTUNI_ALPHA, /* U+0103a1: OLD PERSIAN SIGN I*/
+ RTUNI_ALPHA, /* U+0103a2: OLD PERSIAN SIGN U*/
+ RTUNI_ALPHA, /* U+0103a3: OLD PERSIAN SIGN KA*/
+ RTUNI_ALPHA, /* U+0103a4: OLD PERSIAN SIGN KU*/
+ RTUNI_ALPHA, /* U+0103a5: OLD PERSIAN SIGN GA*/
+ RTUNI_ALPHA, /* U+0103a6: OLD PERSIAN SIGN GU*/
+ RTUNI_ALPHA, /* U+0103a7: OLD PERSIAN SIGN XA*/
+ RTUNI_ALPHA, /* U+0103a8: OLD PERSIAN SIGN CA*/
+ RTUNI_ALPHA, /* U+0103a9: OLD PERSIAN SIGN JA*/
+ RTUNI_ALPHA, /* U+0103aa: OLD PERSIAN SIGN JI*/
+ RTUNI_ALPHA, /* U+0103ab: OLD PERSIAN SIGN TA*/
+ RTUNI_ALPHA, /* U+0103ac: OLD PERSIAN SIGN TU*/
+ RTUNI_ALPHA, /* U+0103ad: OLD PERSIAN SIGN DA*/
+ RTUNI_ALPHA, /* U+0103ae: OLD PERSIAN SIGN DI*/
+ RTUNI_ALPHA, /* U+0103af: OLD PERSIAN SIGN DU*/
+ RTUNI_ALPHA, /* U+0103b0: OLD PERSIAN SIGN THA*/
+ RTUNI_ALPHA, /* U+0103b1: OLD PERSIAN SIGN PA*/
+ RTUNI_ALPHA, /* U+0103b2: OLD PERSIAN SIGN BA*/
+ RTUNI_ALPHA, /* U+0103b3: OLD PERSIAN SIGN FA*/
+ RTUNI_ALPHA, /* U+0103b4: OLD PERSIAN SIGN NA*/
+ RTUNI_ALPHA, /* U+0103b5: OLD PERSIAN SIGN NU*/
+ RTUNI_ALPHA, /* U+0103b6: OLD PERSIAN SIGN MA*/
+ RTUNI_ALPHA, /* U+0103b7: OLD PERSIAN SIGN MI*/
+ RTUNI_ALPHA, /* U+0103b8: OLD PERSIAN SIGN MU*/
+ RTUNI_ALPHA, /* U+0103b9: OLD PERSIAN SIGN YA*/
+ RTUNI_ALPHA, /* U+0103ba: OLD PERSIAN SIGN VA*/
+ RTUNI_ALPHA, /* U+0103bb: OLD PERSIAN SIGN VI*/
+ RTUNI_ALPHA, /* U+0103bc: OLD PERSIAN SIGN RA*/
+ RTUNI_ALPHA, /* U+0103bd: OLD PERSIAN SIGN RU*/
+ RTUNI_ALPHA, /* U+0103be: OLD PERSIAN SIGN LA*/
+ RTUNI_ALPHA, /* U+0103bf: OLD PERSIAN SIGN SA*/
+ RTUNI_ALPHA, /* U+0103c0: OLD PERSIAN SIGN ZA*/
+ RTUNI_ALPHA, /* U+0103c1: OLD PERSIAN SIGN SHA*/
+ RTUNI_ALPHA, /* U+0103c2: OLD PERSIAN SIGN SSA*/
+ RTUNI_ALPHA, /* U+0103c3: OLD PERSIAN SIGN HA*/
+ 0, /* U+0103c4: */
+ 0, /* U+0103c5: */
+ 0, /* U+0103c6: */
+ 0, /* U+0103c7: */
+ RTUNI_ALPHA, /* U+0103c8: OLD PERSIAN SIGN AURAMAZDAA*/
+ RTUNI_ALPHA, /* U+0103c9: OLD PERSIAN SIGN AURAMAZDAA-2*/
+ RTUNI_ALPHA, /* U+0103ca: OLD PERSIAN SIGN AURAMAZDAAHA*/
+ RTUNI_ALPHA, /* U+0103cb: OLD PERSIAN SIGN XSHAAYATHIYA*/
+ RTUNI_ALPHA, /* U+0103cc: OLD PERSIAN SIGN DAHYAAUSH*/
+ RTUNI_ALPHA, /* U+0103cd: OLD PERSIAN SIGN DAHYAAUSH-2*/
+ RTUNI_ALPHA, /* U+0103ce: OLD PERSIAN SIGN BAGA*/
+ RTUNI_ALPHA, /* U+0103cf: OLD PERSIAN SIGN BUUMISH*/
+ 0, /* U+0103d0: OLD PERSIAN WORD DIVIDER*/
+ RTUNI_ALPHA, /* U+0103d1: OLD PERSIAN NUMBER ONE*/
+ RTUNI_ALPHA, /* U+0103d2: OLD PERSIAN NUMBER TWO*/
+ RTUNI_ALPHA, /* U+0103d3: OLD PERSIAN NUMBER TEN*/
+ RTUNI_ALPHA, /* U+0103d4: OLD PERSIAN NUMBER TWENTY*/
+ RTUNI_ALPHA, /* U+0103d5: OLD PERSIAN NUMBER HUNDRED*/
+ 0, /* U+0103d6: */
+ 0, /* U+0103d7: */
+ 0, /* U+0103d8: */
+ 0, /* U+0103d9: */
+ 0, /* U+0103da: */
+ 0, /* U+0103db: */
+ 0, /* U+0103dc: */
+ 0, /* U+0103dd: */
+ 0, /* U+0103de: */
+ 0, /* U+0103df: */
+ 0, /* U+0103e0: */
+ 0, /* U+0103e1: */
+ 0, /* U+0103e2: */
+ 0, /* U+0103e3: */
+ 0, /* U+0103e4: */
+ 0, /* U+0103e5: */
+ 0, /* U+0103e6: */
+ 0, /* U+0103e7: */
+ 0, /* U+0103e8: */
+ 0, /* U+0103e9: */
+ 0, /* U+0103ea: */
+ 0, /* U+0103eb: */
+ 0, /* U+0103ec: */
+ 0, /* U+0103ed: */
+ 0, /* U+0103ee: */
+ 0, /* U+0103ef: */
+ 0, /* U+0103f0: */
+ 0, /* U+0103f1: */
+ 0, /* U+0103f2: */
+ 0, /* U+0103f3: */
+ 0, /* U+0103f4: */
+ 0, /* U+0103f5: */
+ 0, /* U+0103f6: */
+ 0, /* U+0103f7: */
+ 0, /* U+0103f8: */
+ 0, /* U+0103f9: */
+ 0, /* U+0103fa: */
+ 0, /* U+0103fb: */
+ 0, /* U+0103fc: */
+ 0, /* U+0103fd: */
+ 0, /* U+0103fe: */
+ 0, /* U+0103ff: */
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+010400: DESERET CAPITAL LETTER LONG I*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+010401: DESERET CAPITAL LETTER LONG E*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+010402: DESERET CAPITAL LETTER LONG A*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+010403: DESERET CAPITAL LETTER LONG AH*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+010404: DESERET CAPITAL LETTER LONG O*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+010405: DESERET CAPITAL LETTER LONG OO*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+010406: DESERET CAPITAL LETTER SHORT I*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+010407: DESERET CAPITAL LETTER SHORT E*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+010408: DESERET CAPITAL LETTER SHORT A*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+010409: DESERET CAPITAL LETTER SHORT AH*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01040a: DESERET CAPITAL LETTER SHORT O*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01040b: DESERET CAPITAL LETTER SHORT OO*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01040c: DESERET CAPITAL LETTER AY*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01040d: DESERET CAPITAL LETTER OW*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01040e: DESERET CAPITAL LETTER WU*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01040f: DESERET CAPITAL LETTER YEE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+010410: DESERET CAPITAL LETTER H*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+010411: DESERET CAPITAL LETTER PEE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+010412: DESERET CAPITAL LETTER BEE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+010413: DESERET CAPITAL LETTER TEE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+010414: DESERET CAPITAL LETTER DEE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+010415: DESERET CAPITAL LETTER CHEE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+010416: DESERET CAPITAL LETTER JEE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+010417: DESERET CAPITAL LETTER KAY*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+010418: DESERET CAPITAL LETTER GAY*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+010419: DESERET CAPITAL LETTER EF*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01041a: DESERET CAPITAL LETTER VEE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01041b: DESERET CAPITAL LETTER ETH*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01041c: DESERET CAPITAL LETTER THEE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01041d: DESERET CAPITAL LETTER ES*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01041e: DESERET CAPITAL LETTER ZEE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01041f: DESERET CAPITAL LETTER ESH*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+010420: DESERET CAPITAL LETTER ZHEE*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+010421: DESERET CAPITAL LETTER ER*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+010422: DESERET CAPITAL LETTER EL*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+010423: DESERET CAPITAL LETTER EM*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+010424: DESERET CAPITAL LETTER EN*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+010425: DESERET CAPITAL LETTER ENG*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+010426: DESERET CAPITAL LETTER OI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+010427: DESERET CAPITAL LETTER EW*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+010428: DESERET SMALL LETTER LONG I*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+010429: DESERET SMALL LETTER LONG E*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01042a: DESERET SMALL LETTER LONG A*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01042b: DESERET SMALL LETTER LONG AH*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01042c: DESERET SMALL LETTER LONG O*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01042d: DESERET SMALL LETTER LONG OO*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01042e: DESERET SMALL LETTER SHORT I*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01042f: DESERET SMALL LETTER SHORT E*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+010430: DESERET SMALL LETTER SHORT A*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+010431: DESERET SMALL LETTER SHORT AH*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+010432: DESERET SMALL LETTER SHORT O*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+010433: DESERET SMALL LETTER SHORT OO*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+010434: DESERET SMALL LETTER AY*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+010435: DESERET SMALL LETTER OW*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+010436: DESERET SMALL LETTER WU*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+010437: DESERET SMALL LETTER YEE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+010438: DESERET SMALL LETTER H*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+010439: DESERET SMALL LETTER PEE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01043a: DESERET SMALL LETTER BEE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01043b: DESERET SMALL LETTER TEE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01043c: DESERET SMALL LETTER DEE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01043d: DESERET SMALL LETTER CHEE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01043e: DESERET SMALL LETTER JEE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01043f: DESERET SMALL LETTER KAY*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+010440: DESERET SMALL LETTER GAY*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+010441: DESERET SMALL LETTER EF*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+010442: DESERET SMALL LETTER VEE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+010443: DESERET SMALL LETTER ETH*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+010444: DESERET SMALL LETTER THEE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+010445: DESERET SMALL LETTER ES*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+010446: DESERET SMALL LETTER ZEE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+010447: DESERET SMALL LETTER ESH*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+010448: DESERET SMALL LETTER ZHEE*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+010449: DESERET SMALL LETTER ER*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01044a: DESERET SMALL LETTER EL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01044b: DESERET SMALL LETTER EM*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01044c: DESERET SMALL LETTER EN*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01044d: DESERET SMALL LETTER ENG*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01044e: DESERET SMALL LETTER OI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01044f: DESERET SMALL LETTER EW*/
+ RTUNI_ALPHA, /* U+010450: SHAVIAN LETTER PEEP*/
+ RTUNI_ALPHA, /* U+010451: SHAVIAN LETTER TOT*/
+ RTUNI_ALPHA, /* U+010452: SHAVIAN LETTER KICK*/
+ RTUNI_ALPHA, /* U+010453: SHAVIAN LETTER FEE*/
+ RTUNI_ALPHA, /* U+010454: SHAVIAN LETTER THIGH*/
+ RTUNI_ALPHA, /* U+010455: SHAVIAN LETTER SO*/
+ RTUNI_ALPHA, /* U+010456: SHAVIAN LETTER SURE*/
+ RTUNI_ALPHA, /* U+010457: SHAVIAN LETTER CHURCH*/
+ RTUNI_ALPHA, /* U+010458: SHAVIAN LETTER YEA*/
+ RTUNI_ALPHA, /* U+010459: SHAVIAN LETTER HUNG*/
+ RTUNI_ALPHA, /* U+01045a: SHAVIAN LETTER BIB*/
+ RTUNI_ALPHA, /* U+01045b: SHAVIAN LETTER DEAD*/
+ RTUNI_ALPHA, /* U+01045c: SHAVIAN LETTER GAG*/
+ RTUNI_ALPHA, /* U+01045d: SHAVIAN LETTER VOW*/
+ RTUNI_ALPHA, /* U+01045e: SHAVIAN LETTER THEY*/
+ RTUNI_ALPHA, /* U+01045f: SHAVIAN LETTER ZOO*/
+ RTUNI_ALPHA, /* U+010460: SHAVIAN LETTER MEASURE*/
+ RTUNI_ALPHA, /* U+010461: SHAVIAN LETTER JUDGE*/
+ RTUNI_ALPHA, /* U+010462: SHAVIAN LETTER WOE*/
+ RTUNI_ALPHA, /* U+010463: SHAVIAN LETTER HA-HA*/
+ RTUNI_ALPHA, /* U+010464: SHAVIAN LETTER LOLL*/
+ RTUNI_ALPHA, /* U+010465: SHAVIAN LETTER MIME*/
+ RTUNI_ALPHA, /* U+010466: SHAVIAN LETTER IF*/
+ RTUNI_ALPHA, /* U+010467: SHAVIAN LETTER EGG*/
+ RTUNI_ALPHA, /* U+010468: SHAVIAN LETTER ASH*/
+ RTUNI_ALPHA, /* U+010469: SHAVIAN LETTER ADO*/
+ RTUNI_ALPHA, /* U+01046a: SHAVIAN LETTER ON*/
+ RTUNI_ALPHA, /* U+01046b: SHAVIAN LETTER WOOL*/
+ RTUNI_ALPHA, /* U+01046c: SHAVIAN LETTER OUT*/
+ RTUNI_ALPHA, /* U+01046d: SHAVIAN LETTER AH*/
+ RTUNI_ALPHA, /* U+01046e: SHAVIAN LETTER ROAR*/
+ RTUNI_ALPHA, /* U+01046f: SHAVIAN LETTER NUN*/
+ RTUNI_ALPHA, /* U+010470: SHAVIAN LETTER EAT*/
+ RTUNI_ALPHA, /* U+010471: SHAVIAN LETTER AGE*/
+ RTUNI_ALPHA, /* U+010472: SHAVIAN LETTER ICE*/
+ RTUNI_ALPHA, /* U+010473: SHAVIAN LETTER UP*/
+ RTUNI_ALPHA, /* U+010474: SHAVIAN LETTER OAK*/
+ RTUNI_ALPHA, /* U+010475: SHAVIAN LETTER OOZE*/
+ RTUNI_ALPHA, /* U+010476: SHAVIAN LETTER OIL*/
+ RTUNI_ALPHA, /* U+010477: SHAVIAN LETTER AWE*/
+ RTUNI_ALPHA, /* U+010478: SHAVIAN LETTER ARE*/
+ RTUNI_ALPHA, /* U+010479: SHAVIAN LETTER OR*/
+ RTUNI_ALPHA, /* U+01047a: SHAVIAN LETTER AIR*/
+ RTUNI_ALPHA, /* U+01047b: SHAVIAN LETTER ERR*/
+ RTUNI_ALPHA, /* U+01047c: SHAVIAN LETTER ARRAY*/
+ RTUNI_ALPHA, /* U+01047d: SHAVIAN LETTER EAR*/
+ RTUNI_ALPHA, /* U+01047e: SHAVIAN LETTER IAN*/
+ RTUNI_ALPHA, /* U+01047f: SHAVIAN LETTER YEW*/
+ RTUNI_ALPHA, /* U+010480: OSMANYA LETTER ALEF*/
+ RTUNI_ALPHA, /* U+010481: OSMANYA LETTER BA*/
+ RTUNI_ALPHA, /* U+010482: OSMANYA LETTER TA*/
+ RTUNI_ALPHA, /* U+010483: OSMANYA LETTER JA*/
+ RTUNI_ALPHA, /* U+010484: OSMANYA LETTER XA*/
+ RTUNI_ALPHA, /* U+010485: OSMANYA LETTER KHA*/
+ RTUNI_ALPHA, /* U+010486: OSMANYA LETTER DEEL*/
+ RTUNI_ALPHA, /* U+010487: OSMANYA LETTER RA*/
+ RTUNI_ALPHA, /* U+010488: OSMANYA LETTER SA*/
+ RTUNI_ALPHA, /* U+010489: OSMANYA LETTER SHIIN*/
+ RTUNI_ALPHA, /* U+01048a: OSMANYA LETTER DHA*/
+ RTUNI_ALPHA, /* U+01048b: OSMANYA LETTER CAYN*/
+ RTUNI_ALPHA, /* U+01048c: OSMANYA LETTER GA*/
+ RTUNI_ALPHA, /* U+01048d: OSMANYA LETTER FA*/
+ RTUNI_ALPHA, /* U+01048e: OSMANYA LETTER QAAF*/
+ RTUNI_ALPHA, /* U+01048f: OSMANYA LETTER KAAF*/
+ RTUNI_ALPHA, /* U+010490: OSMANYA LETTER LAAN*/
+ RTUNI_ALPHA, /* U+010491: OSMANYA LETTER MIIN*/
+ RTUNI_ALPHA, /* U+010492: OSMANYA LETTER NUUN*/
+ RTUNI_ALPHA, /* U+010493: OSMANYA LETTER WAW*/
+ RTUNI_ALPHA, /* U+010494: OSMANYA LETTER HA*/
+ RTUNI_ALPHA, /* U+010495: OSMANYA LETTER YA*/
+ RTUNI_ALPHA, /* U+010496: OSMANYA LETTER A*/
+ RTUNI_ALPHA, /* U+010497: OSMANYA LETTER E*/
+ RTUNI_ALPHA, /* U+010498: OSMANYA LETTER I*/
+ RTUNI_ALPHA, /* U+010499: OSMANYA LETTER O*/
+ RTUNI_ALPHA, /* U+01049a: OSMANYA LETTER U*/
+ RTUNI_ALPHA, /* U+01049b: OSMANYA LETTER AA*/
+ RTUNI_ALPHA, /* U+01049c: OSMANYA LETTER EE*/
+ RTUNI_ALPHA, /* U+01049d: OSMANYA LETTER OO*/
+ 0, /* U+01049e: */
+ 0, /* U+01049f: */
+ RTUNI_DDIGIT, /* U+0104a0: OSMANYA DIGIT ZERO*/
+ RTUNI_DDIGIT, /* U+0104a1: OSMANYA DIGIT ONE*/
+ RTUNI_DDIGIT, /* U+0104a2: OSMANYA DIGIT TWO*/
+ RTUNI_DDIGIT, /* U+0104a3: OSMANYA DIGIT THREE*/
+ RTUNI_DDIGIT, /* U+0104a4: OSMANYA DIGIT FOUR*/
+ RTUNI_DDIGIT, /* U+0104a5: OSMANYA DIGIT FIVE*/
+ RTUNI_DDIGIT, /* U+0104a6: OSMANYA DIGIT SIX*/
+ RTUNI_DDIGIT, /* U+0104a7: OSMANYA DIGIT SEVEN*/
+ RTUNI_DDIGIT, /* U+0104a8: OSMANYA DIGIT EIGHT*/
+ RTUNI_DDIGIT, /* U+0104a9: OSMANYA DIGIT NINE*/
+ 0, /* U+0104aa: */
+ 0, /* U+0104ab: */
+ 0, /* U+0104ac: */
+ 0, /* U+0104ad: */
+ 0, /* U+0104ae: */
+ 0, /* U+0104af: */
+ 0, /* U+0104b0: */
+ 0, /* U+0104b1: */
+ 0, /* U+0104b2: */
+ 0, /* U+0104b3: */
+ 0, /* U+0104b4: */
+ 0, /* U+0104b5: */
+ 0, /* U+0104b6: */
+ 0, /* U+0104b7: */
+ 0, /* U+0104b8: */
+ 0, /* U+0104b9: */
+ 0, /* U+0104ba: */
+ 0, /* U+0104bb: */
+ 0, /* U+0104bc: */
+ 0, /* U+0104bd: */
+ 0, /* U+0104be: */
+ 0, /* U+0104bf: */
+ 0, /* U+0104c0: */
+ 0, /* U+0104c1: */
+ 0, /* U+0104c2: */
+ 0, /* U+0104c3: */
+ 0, /* U+0104c4: */
+ 0, /* U+0104c5: */
+ 0, /* U+0104c6: */
+ 0, /* U+0104c7: */
+ 0, /* U+0104c8: */
+ 0, /* U+0104c9: */
+ 0, /* U+0104ca: */
+ 0, /* U+0104cb: */
+ 0, /* U+0104cc: */
+ 0, /* U+0104cd: */
+ 0, /* U+0104ce: */
+ 0, /* U+0104cf: */
+ 0, /* U+0104d0: */
+ 0, /* U+0104d1: */
+ 0, /* U+0104d2: */
+ 0, /* U+0104d3: */
+ 0, /* U+0104d4: */
+ 0, /* U+0104d5: */
+ 0, /* U+0104d6: */
+ 0, /* U+0104d7: */
+ 0, /* U+0104d8: */
+ 0, /* U+0104d9: */
+ 0, /* U+0104da: */
+ 0, /* U+0104db: */
+ 0, /* U+0104dc: */
+ 0, /* U+0104dd: */
+ 0, /* U+0104de: */
+ 0, /* U+0104df: */
+ 0, /* U+0104e0: */
+ 0, /* U+0104e1: */
+ 0, /* U+0104e2: */
+ 0, /* U+0104e3: */
+ 0, /* U+0104e4: */
+ 0, /* U+0104e5: */
+ 0, /* U+0104e6: */
+ 0, /* U+0104e7: */
+ 0, /* U+0104e8: */
+ 0, /* U+0104e9: */
+ 0, /* U+0104ea: */
+ 0, /* U+0104eb: */
+ 0, /* U+0104ec: */
+ 0, /* U+0104ed: */
+ 0, /* U+0104ee: */
+ 0, /* U+0104ef: */
+ 0, /* U+0104f0: */
+ 0, /* U+0104f1: */
+ 0, /* U+0104f2: */
+ 0, /* U+0104f3: */
+ 0, /* U+0104f4: */
+ 0, /* U+0104f5: */
+ 0, /* U+0104f6: */
+ 0, /* U+0104f7: */
+ 0, /* U+0104f8: */
+ 0, /* U+0104f9: */
+ 0, /* U+0104fa: */
+ 0, /* U+0104fb: */
+ 0, /* U+0104fc: */
+ 0, /* U+0104fd: */
+ 0, /* U+0104fe: */
+ 0, /* U+0104ff: */
+ 0, /* U+010500: */
+ 0, /* U+010501: */
+ 0, /* U+010502: */
+ 0, /* U+010503: */
+ 0, /* U+010504: */
+ 0, /* U+010505: */
+ 0, /* U+010506: */
+ 0, /* U+010507: */
+ 0, /* U+010508: */
+ 0, /* U+010509: */
+ 0, /* U+01050a: */
+ 0, /* U+01050b: */
+ 0, /* U+01050c: */
+ 0, /* U+01050d: */
+ 0, /* U+01050e: */
+ 0, /* U+01050f: */
+ 0, /* U+010510: */
+ 0, /* U+010511: */
+ 0, /* U+010512: */
+ 0, /* U+010513: */
+ 0, /* U+010514: */
+ 0, /* U+010515: */
+ 0, /* U+010516: */
+ 0, /* U+010517: */
+ 0, /* U+010518: */
+ 0, /* U+010519: */
+ 0, /* U+01051a: */
+ 0, /* U+01051b: */
+ 0, /* U+01051c: */
+ 0, /* U+01051d: */
+ 0, /* U+01051e: */
+ 0, /* U+01051f: */
+ 0, /* U+010520: */
+ 0, /* U+010521: */
+ 0, /* U+010522: */
+ 0, /* U+010523: */
+ 0, /* U+010524: */
+ 0, /* U+010525: */
+ 0, /* U+010526: */
+ 0, /* U+010527: */
+ 0, /* U+010528: */
+ 0, /* U+010529: */
+ 0, /* U+01052a: */
+ 0, /* U+01052b: */
+ 0, /* U+01052c: */
+ 0, /* U+01052d: */
+ 0, /* U+01052e: */
+ 0, /* U+01052f: */
+ 0, /* U+010530: */
+ 0, /* U+010531: */
+ 0, /* U+010532: */
+ 0, /* U+010533: */
+ 0, /* U+010534: */
+ 0, /* U+010535: */
+ 0, /* U+010536: */
+ 0, /* U+010537: */
+ 0, /* U+010538: */
+ 0, /* U+010539: */
+ 0, /* U+01053a: */
+ 0, /* U+01053b: */
+ 0, /* U+01053c: */
+ 0, /* U+01053d: */
+ 0, /* U+01053e: */
+ 0, /* U+01053f: */
+ 0, /* U+010540: */
+ 0, /* U+010541: */
+ 0, /* U+010542: */
+ 0, /* U+010543: */
+ 0, /* U+010544: */
+ 0, /* U+010545: */
+ 0, /* U+010546: */
+ 0, /* U+010547: */
+ 0, /* U+010548: */
+ 0, /* U+010549: */
+ 0, /* U+01054a: */
+ 0, /* U+01054b: */
+ 0, /* U+01054c: */
+ 0, /* U+01054d: */
+ 0, /* U+01054e: */
+ 0, /* U+01054f: */
+ 0, /* U+010550: */
+ 0, /* U+010551: */
+ 0, /* U+010552: */
+ 0, /* U+010553: */
+ 0, /* U+010554: */
+ 0, /* U+010555: */
+ 0, /* U+010556: */
+ 0, /* U+010557: */
+ 0, /* U+010558: */
+ 0, /* U+010559: */
+ 0, /* U+01055a: */
+ 0, /* U+01055b: */
+ 0, /* U+01055c: */
+ 0, /* U+01055d: */
+ 0, /* U+01055e: */
+ 0, /* U+01055f: */
+ 0, /* U+010560: */
+ 0, /* U+010561: */
+ 0, /* U+010562: */
+ 0, /* U+010563: */
+ 0, /* U+010564: */
+ 0, /* U+010565: */
+ 0, /* U+010566: */
+ 0, /* U+010567: */
+ 0, /* U+010568: */
+ 0, /* U+010569: */
+ 0, /* U+01056a: */
+ 0, /* U+01056b: */
+ 0, /* U+01056c: */
+ 0, /* U+01056d: */
+ 0, /* U+01056e: */
+ 0, /* U+01056f: */
+ 0, /* U+010570: */
+ 0, /* U+010571: */
+ 0, /* U+010572: */
+ 0, /* U+010573: */
+ 0, /* U+010574: */
+ 0, /* U+010575: */
+ 0, /* U+010576: */
+ 0, /* U+010577: */
+ 0, /* U+010578: */
+ 0, /* U+010579: */
+ 0, /* U+01057a: */
+ 0, /* U+01057b: */
+ 0, /* U+01057c: */
+ 0, /* U+01057d: */
+ 0, /* U+01057e: */
+ 0, /* U+01057f: */
+ 0, /* U+010580: */
+ 0, /* U+010581: */
+ 0, /* U+010582: */
+ 0, /* U+010583: */
+ 0, /* U+010584: */
+ 0, /* U+010585: */
+ 0, /* U+010586: */
+ 0, /* U+010587: */
+ 0, /* U+010588: */
+ 0, /* U+010589: */
+ 0, /* U+01058a: */
+ 0, /* U+01058b: */
+ 0, /* U+01058c: */
+ 0, /* U+01058d: */
+ 0, /* U+01058e: */
+ 0, /* U+01058f: */
+ 0, /* U+010590: */
+ 0, /* U+010591: */
+ 0, /* U+010592: */
+ 0, /* U+010593: */
+ 0, /* U+010594: */
+ 0, /* U+010595: */
+ 0, /* U+010596: */
+ 0, /* U+010597: */
+ 0, /* U+010598: */
+ 0, /* U+010599: */
+ 0, /* U+01059a: */
+ 0, /* U+01059b: */
+ 0, /* U+01059c: */
+ 0, /* U+01059d: */
+ 0, /* U+01059e: */
+ 0, /* U+01059f: */
+ 0, /* U+0105a0: */
+ 0, /* U+0105a1: */
+ 0, /* U+0105a2: */
+ 0, /* U+0105a3: */
+ 0, /* U+0105a4: */
+ 0, /* U+0105a5: */
+ 0, /* U+0105a6: */
+ 0, /* U+0105a7: */
+ 0, /* U+0105a8: */
+ 0, /* U+0105a9: */
+ 0, /* U+0105aa: */
+ 0, /* U+0105ab: */
+ 0, /* U+0105ac: */
+ 0, /* U+0105ad: */
+ 0, /* U+0105ae: */
+ 0, /* U+0105af: */
+ 0, /* U+0105b0: */
+ 0, /* U+0105b1: */
+ 0, /* U+0105b2: */
+ 0, /* U+0105b3: */
+ 0, /* U+0105b4: */
+ 0, /* U+0105b5: */
+ 0, /* U+0105b6: */
+ 0, /* U+0105b7: */
+ 0, /* U+0105b8: */
+ 0, /* U+0105b9: */
+ 0, /* U+0105ba: */
+ 0, /* U+0105bb: */
+ 0, /* U+0105bc: */
+ 0, /* U+0105bd: */
+ 0, /* U+0105be: */
+ 0, /* U+0105bf: */
+ 0, /* U+0105c0: */
+ 0, /* U+0105c1: */
+ 0, /* U+0105c2: */
+ 0, /* U+0105c3: */
+ 0, /* U+0105c4: */
+ 0, /* U+0105c5: */
+ 0, /* U+0105c6: */
+ 0, /* U+0105c7: */
+ 0, /* U+0105c8: */
+ 0, /* U+0105c9: */
+ 0, /* U+0105ca: */
+ 0, /* U+0105cb: */
+ 0, /* U+0105cc: */
+ 0, /* U+0105cd: */
+ 0, /* U+0105ce: */
+ 0, /* U+0105cf: */
+ 0, /* U+0105d0: */
+ 0, /* U+0105d1: */
+ 0, /* U+0105d2: */
+ 0, /* U+0105d3: */
+ 0, /* U+0105d4: */
+ 0, /* U+0105d5: */
+ 0, /* U+0105d6: */
+ 0, /* U+0105d7: */
+ 0, /* U+0105d8: */
+ 0, /* U+0105d9: */
+ 0, /* U+0105da: */
+ 0, /* U+0105db: */
+ 0, /* U+0105dc: */
+ 0, /* U+0105dd: */
+ 0, /* U+0105de: */
+ 0, /* U+0105df: */
+ 0, /* U+0105e0: */
+ 0, /* U+0105e1: */
+ 0, /* U+0105e2: */
+ 0, /* U+0105e3: */
+ 0, /* U+0105e4: */
+ 0, /* U+0105e5: */
+ 0, /* U+0105e6: */
+ 0, /* U+0105e7: */
+ 0, /* U+0105e8: */
+ 0, /* U+0105e9: */
+ 0, /* U+0105ea: */
+ 0, /* U+0105eb: */
+ 0, /* U+0105ec: */
+ 0, /* U+0105ed: */
+ 0, /* U+0105ee: */
+ 0, /* U+0105ef: */
+ 0, /* U+0105f0: */
+ 0, /* U+0105f1: */
+ 0, /* U+0105f2: */
+ 0, /* U+0105f3: */
+ 0, /* U+0105f4: */
+ 0, /* U+0105f5: */
+ 0, /* U+0105f6: */
+ 0, /* U+0105f7: */
+ 0, /* U+0105f8: */
+ 0, /* U+0105f9: */
+ 0, /* U+0105fa: */
+ 0, /* U+0105fb: */
+ 0, /* U+0105fc: */
+ 0, /* U+0105fd: */
+ 0, /* U+0105fe: */
+ 0, /* U+0105ff: */
+ 0, /* U+010600: */
+ 0, /* U+010601: */
+ 0, /* U+010602: */
+ 0, /* U+010603: */
+ 0, /* U+010604: */
+ 0, /* U+010605: */
+ 0, /* U+010606: */
+ 0, /* U+010607: */
+ 0, /* U+010608: */
+ 0, /* U+010609: */
+ 0, /* U+01060a: */
+ 0, /* U+01060b: */
+ 0, /* U+01060c: */
+ 0, /* U+01060d: */
+ 0, /* U+01060e: */
+ 0, /* U+01060f: */
+ 0, /* U+010610: */
+ 0, /* U+010611: */
+ 0, /* U+010612: */
+ 0, /* U+010613: */
+ 0, /* U+010614: */
+ 0, /* U+010615: */
+ 0, /* U+010616: */
+ 0, /* U+010617: */
+ 0, /* U+010618: */
+ 0, /* U+010619: */
+ 0, /* U+01061a: */
+ 0, /* U+01061b: */
+ 0, /* U+01061c: */
+ 0, /* U+01061d: */
+ 0, /* U+01061e: */
+ 0, /* U+01061f: */
+ 0, /* U+010620: */
+ 0, /* U+010621: */
+ 0, /* U+010622: */
+ 0, /* U+010623: */
+ 0, /* U+010624: */
+ 0, /* U+010625: */
+ 0, /* U+010626: */
+ 0, /* U+010627: */
+ 0, /* U+010628: */
+ 0, /* U+010629: */
+ 0, /* U+01062a: */
+ 0, /* U+01062b: */
+ 0, /* U+01062c: */
+ 0, /* U+01062d: */
+ 0, /* U+01062e: */
+ 0, /* U+01062f: */
+ 0, /* U+010630: */
+ 0, /* U+010631: */
+ 0, /* U+010632: */
+ 0, /* U+010633: */
+ 0, /* U+010634: */
+ 0, /* U+010635: */
+ 0, /* U+010636: */
+ 0, /* U+010637: */
+ 0, /* U+010638: */
+ 0, /* U+010639: */
+ 0, /* U+01063a: */
+ 0, /* U+01063b: */
+ 0, /* U+01063c: */
+ 0, /* U+01063d: */
+ 0, /* U+01063e: */
+ 0, /* U+01063f: */
+ 0, /* U+010640: */
+ 0, /* U+010641: */
+ 0, /* U+010642: */
+ 0, /* U+010643: */
+ 0, /* U+010644: */
+ 0, /* U+010645: */
+ 0, /* U+010646: */
+ 0, /* U+010647: */
+ 0, /* U+010648: */
+ 0, /* U+010649: */
+ 0, /* U+01064a: */
+ 0, /* U+01064b: */
+ 0, /* U+01064c: */
+ 0, /* U+01064d: */
+ 0, /* U+01064e: */
+ 0, /* U+01064f: */
+ 0, /* U+010650: */
+ 0, /* U+010651: */
+ 0, /* U+010652: */
+ 0, /* U+010653: */
+ 0, /* U+010654: */
+ 0, /* U+010655: */
+ 0, /* U+010656: */
+ 0, /* U+010657: */
+ 0, /* U+010658: */
+ 0, /* U+010659: */
+ 0, /* U+01065a: */
+ 0, /* U+01065b: */
+ 0, /* U+01065c: */
+ 0, /* U+01065d: */
+ 0, /* U+01065e: */
+ 0, /* U+01065f: */
+ 0, /* U+010660: */
+ 0, /* U+010661: */
+ 0, /* U+010662: */
+ 0, /* U+010663: */
+ 0, /* U+010664: */
+ 0, /* U+010665: */
+ 0, /* U+010666: */
+ 0, /* U+010667: */
+ 0, /* U+010668: */
+ 0, /* U+010669: */
+ 0, /* U+01066a: */
+ 0, /* U+01066b: */
+ 0, /* U+01066c: */
+ 0, /* U+01066d: */
+ 0, /* U+01066e: */
+ 0, /* U+01066f: */
+ 0, /* U+010670: */
+ 0, /* U+010671: */
+ 0, /* U+010672: */
+ 0, /* U+010673: */
+ 0, /* U+010674: */
+ 0, /* U+010675: */
+ 0, /* U+010676: */
+ 0, /* U+010677: */
+ 0, /* U+010678: */
+ 0, /* U+010679: */
+ 0, /* U+01067a: */
+ 0, /* U+01067b: */
+ 0, /* U+01067c: */
+ 0, /* U+01067d: */
+ 0, /* U+01067e: */
+ 0, /* U+01067f: */
+ 0, /* U+010680: */
+ 0, /* U+010681: */
+ 0, /* U+010682: */
+ 0, /* U+010683: */
+ 0, /* U+010684: */
+ 0, /* U+010685: */
+ 0, /* U+010686: */
+ 0, /* U+010687: */
+ 0, /* U+010688: */
+ 0, /* U+010689: */
+ 0, /* U+01068a: */
+ 0, /* U+01068b: */
+ 0, /* U+01068c: */
+ 0, /* U+01068d: */
+ 0, /* U+01068e: */
+ 0, /* U+01068f: */
+ 0, /* U+010690: */
+ 0, /* U+010691: */
+ 0, /* U+010692: */
+ 0, /* U+010693: */
+ 0, /* U+010694: */
+ 0, /* U+010695: */
+ 0, /* U+010696: */
+ 0, /* U+010697: */
+ 0, /* U+010698: */
+ 0, /* U+010699: */
+ 0, /* U+01069a: */
+ 0, /* U+01069b: */
+ 0, /* U+01069c: */
+ 0, /* U+01069d: */
+ 0, /* U+01069e: */
+ 0, /* U+01069f: */
+ 0, /* U+0106a0: */
+ 0, /* U+0106a1: */
+ 0, /* U+0106a2: */
+ 0, /* U+0106a3: */
+ 0, /* U+0106a4: */
+ 0, /* U+0106a5: */
+ 0, /* U+0106a6: */
+ 0, /* U+0106a7: */
+ 0, /* U+0106a8: */
+ 0, /* U+0106a9: */
+ 0, /* U+0106aa: */
+ 0, /* U+0106ab: */
+ 0, /* U+0106ac: */
+ 0, /* U+0106ad: */
+ 0, /* U+0106ae: */
+ 0, /* U+0106af: */
+ 0, /* U+0106b0: */
+ 0, /* U+0106b1: */
+ 0, /* U+0106b2: */
+ 0, /* U+0106b3: */
+ 0, /* U+0106b4: */
+ 0, /* U+0106b5: */
+ 0, /* U+0106b6: */
+ 0, /* U+0106b7: */
+ 0, /* U+0106b8: */
+ 0, /* U+0106b9: */
+ 0, /* U+0106ba: */
+ 0, /* U+0106bb: */
+ 0, /* U+0106bc: */
+ 0, /* U+0106bd: */
+ 0, /* U+0106be: */
+ 0, /* U+0106bf: */
+ 0, /* U+0106c0: */
+ 0, /* U+0106c1: */
+ 0, /* U+0106c2: */
+ 0, /* U+0106c3: */
+ 0, /* U+0106c4: */
+ 0, /* U+0106c5: */
+ 0, /* U+0106c6: */
+ 0, /* U+0106c7: */
+ 0, /* U+0106c8: */
+ 0, /* U+0106c9: */
+ 0, /* U+0106ca: */
+ 0, /* U+0106cb: */
+ 0, /* U+0106cc: */
+ 0, /* U+0106cd: */
+ 0, /* U+0106ce: */
+ 0, /* U+0106cf: */
+ 0, /* U+0106d0: */
+ 0, /* U+0106d1: */
+ 0, /* U+0106d2: */
+ 0, /* U+0106d3: */
+ 0, /* U+0106d4: */
+ 0, /* U+0106d5: */
+ 0, /* U+0106d6: */
+ 0, /* U+0106d7: */
+ 0, /* U+0106d8: */
+ 0, /* U+0106d9: */
+ 0, /* U+0106da: */
+ 0, /* U+0106db: */
+ 0, /* U+0106dc: */
+ 0, /* U+0106dd: */
+ 0, /* U+0106de: */
+ 0, /* U+0106df: */
+ 0, /* U+0106e0: */
+ 0, /* U+0106e1: */
+ 0, /* U+0106e2: */
+ 0, /* U+0106e3: */
+ 0, /* U+0106e4: */
+ 0, /* U+0106e5: */
+ 0, /* U+0106e6: */
+ 0, /* U+0106e7: */
+ 0, /* U+0106e8: */
+ 0, /* U+0106e9: */
+ 0, /* U+0106ea: */
+ 0, /* U+0106eb: */
+ 0, /* U+0106ec: */
+ 0, /* U+0106ed: */
+ 0, /* U+0106ee: */
+ 0, /* U+0106ef: */
+ 0, /* U+0106f0: */
+ 0, /* U+0106f1: */
+ 0, /* U+0106f2: */
+ 0, /* U+0106f3: */
+ 0, /* U+0106f4: */
+ 0, /* U+0106f5: */
+ 0, /* U+0106f6: */
+ 0, /* U+0106f7: */
+ 0, /* U+0106f8: */
+ 0, /* U+0106f9: */
+ 0, /* U+0106fa: */
+ 0, /* U+0106fb: */
+ 0, /* U+0106fc: */
+ 0, /* U+0106fd: */
+ 0, /* U+0106fe: */
+ 0, /* U+0106ff: */
+ 0, /* U+010700: */
+ 0, /* U+010701: */
+ 0, /* U+010702: */
+ 0, /* U+010703: */
+ 0, /* U+010704: */
+ 0, /* U+010705: */
+ 0, /* U+010706: */
+ 0, /* U+010707: */
+ 0, /* U+010708: */
+ 0, /* U+010709: */
+ 0, /* U+01070a: */
+ 0, /* U+01070b: */
+ 0, /* U+01070c: */
+ 0, /* U+01070d: */
+ 0, /* U+01070e: */
+ 0, /* U+01070f: */
+ 0, /* U+010710: */
+ 0, /* U+010711: */
+ 0, /* U+010712: */
+ 0, /* U+010713: */
+ 0, /* U+010714: */
+ 0, /* U+010715: */
+ 0, /* U+010716: */
+ 0, /* U+010717: */
+ 0, /* U+010718: */
+ 0, /* U+010719: */
+ 0, /* U+01071a: */
+ 0, /* U+01071b: */
+ 0, /* U+01071c: */
+ 0, /* U+01071d: */
+ 0, /* U+01071e: */
+ 0, /* U+01071f: */
+ 0, /* U+010720: */
+ 0, /* U+010721: */
+ 0, /* U+010722: */
+ 0, /* U+010723: */
+ 0, /* U+010724: */
+ 0, /* U+010725: */
+ 0, /* U+010726: */
+ 0, /* U+010727: */
+ 0, /* U+010728: */
+ 0, /* U+010729: */
+ 0, /* U+01072a: */
+ 0, /* U+01072b: */
+ 0, /* U+01072c: */
+ 0, /* U+01072d: */
+ 0, /* U+01072e: */
+ 0, /* U+01072f: */
+ 0, /* U+010730: */
+ 0, /* U+010731: */
+ 0, /* U+010732: */
+ 0, /* U+010733: */
+ 0, /* U+010734: */
+ 0, /* U+010735: */
+ 0, /* U+010736: */
+ 0, /* U+010737: */
+ 0, /* U+010738: */
+ 0, /* U+010739: */
+ 0, /* U+01073a: */
+ 0, /* U+01073b: */
+ 0, /* U+01073c: */
+ 0, /* U+01073d: */
+ 0, /* U+01073e: */
+ 0, /* U+01073f: */
+ 0, /* U+010740: */
+ 0, /* U+010741: */
+ 0, /* U+010742: */
+ 0, /* U+010743: */
+ 0, /* U+010744: */
+ 0, /* U+010745: */
+ 0, /* U+010746: */
+ 0, /* U+010747: */
+ 0, /* U+010748: */
+ 0, /* U+010749: */
+ 0, /* U+01074a: */
+ 0, /* U+01074b: */
+ 0, /* U+01074c: */
+ 0, /* U+01074d: */
+ 0, /* U+01074e: */
+ 0, /* U+01074f: */
+ 0, /* U+010750: */
+ 0, /* U+010751: */
+ 0, /* U+010752: */
+ 0, /* U+010753: */
+ 0, /* U+010754: */
+ 0, /* U+010755: */
+ 0, /* U+010756: */
+ 0, /* U+010757: */
+ 0, /* U+010758: */
+ 0, /* U+010759: */
+ 0, /* U+01075a: */
+ 0, /* U+01075b: */
+ 0, /* U+01075c: */
+ 0, /* U+01075d: */
+ 0, /* U+01075e: */
+ 0, /* U+01075f: */
+ 0, /* U+010760: */
+ 0, /* U+010761: */
+ 0, /* U+010762: */
+ 0, /* U+010763: */
+ 0, /* U+010764: */
+ 0, /* U+010765: */
+ 0, /* U+010766: */
+ 0, /* U+010767: */
+ 0, /* U+010768: */
+ 0, /* U+010769: */
+ 0, /* U+01076a: */
+ 0, /* U+01076b: */
+ 0, /* U+01076c: */
+ 0, /* U+01076d: */
+ 0, /* U+01076e: */
+ 0, /* U+01076f: */
+ 0, /* U+010770: */
+ 0, /* U+010771: */
+ 0, /* U+010772: */
+ 0, /* U+010773: */
+ 0, /* U+010774: */
+ 0, /* U+010775: */
+ 0, /* U+010776: */
+ 0, /* U+010777: */
+ 0, /* U+010778: */
+ 0, /* U+010779: */
+ 0, /* U+01077a: */
+ 0, /* U+01077b: */
+ 0, /* U+01077c: */
+ 0, /* U+01077d: */
+ 0, /* U+01077e: */
+ 0, /* U+01077f: */
+ 0, /* U+010780: */
+ 0, /* U+010781: */
+ 0, /* U+010782: */
+ 0, /* U+010783: */
+ 0, /* U+010784: */
+ 0, /* U+010785: */
+ 0, /* U+010786: */
+ 0, /* U+010787: */
+ 0, /* U+010788: */
+ 0, /* U+010789: */
+ 0, /* U+01078a: */
+ 0, /* U+01078b: */
+ 0, /* U+01078c: */
+ 0, /* U+01078d: */
+ 0, /* U+01078e: */
+ 0, /* U+01078f: */
+ 0, /* U+010790: */
+ 0, /* U+010791: */
+ 0, /* U+010792: */
+ 0, /* U+010793: */
+ 0, /* U+010794: */
+ 0, /* U+010795: */
+ 0, /* U+010796: */
+ 0, /* U+010797: */
+ 0, /* U+010798: */
+ 0, /* U+010799: */
+ 0, /* U+01079a: */
+ 0, /* U+01079b: */
+ 0, /* U+01079c: */
+ 0, /* U+01079d: */
+ 0, /* U+01079e: */
+ 0, /* U+01079f: */
+ 0, /* U+0107a0: */
+ 0, /* U+0107a1: */
+ 0, /* U+0107a2: */
+ 0, /* U+0107a3: */
+ 0, /* U+0107a4: */
+ 0, /* U+0107a5: */
+ 0, /* U+0107a6: */
+ 0, /* U+0107a7: */
+ 0, /* U+0107a8: */
+ 0, /* U+0107a9: */
+ 0, /* U+0107aa: */
+ 0, /* U+0107ab: */
+ 0, /* U+0107ac: */
+ 0, /* U+0107ad: */
+ 0, /* U+0107ae: */
+ 0, /* U+0107af: */
+ 0, /* U+0107b0: */
+ 0, /* U+0107b1: */
+ 0, /* U+0107b2: */
+ 0, /* U+0107b3: */
+ 0, /* U+0107b4: */
+ 0, /* U+0107b5: */
+ 0, /* U+0107b6: */
+ 0, /* U+0107b7: */
+ 0, /* U+0107b8: */
+ 0, /* U+0107b9: */
+ 0, /* U+0107ba: */
+ 0, /* U+0107bb: */
+ 0, /* U+0107bc: */
+ 0, /* U+0107bd: */
+ 0, /* U+0107be: */
+ 0, /* U+0107bf: */
+ 0, /* U+0107c0: */
+ 0, /* U+0107c1: */
+ 0, /* U+0107c2: */
+ 0, /* U+0107c3: */
+ 0, /* U+0107c4: */
+ 0, /* U+0107c5: */
+ 0, /* U+0107c6: */
+ 0, /* U+0107c7: */
+ 0, /* U+0107c8: */
+ 0, /* U+0107c9: */
+ 0, /* U+0107ca: */
+ 0, /* U+0107cb: */
+ 0, /* U+0107cc: */
+ 0, /* U+0107cd: */
+ 0, /* U+0107ce: */
+ 0, /* U+0107cf: */
+ 0, /* U+0107d0: */
+ 0, /* U+0107d1: */
+ 0, /* U+0107d2: */
+ 0, /* U+0107d3: */
+ 0, /* U+0107d4: */
+ 0, /* U+0107d5: */
+ 0, /* U+0107d6: */
+ 0, /* U+0107d7: */
+ 0, /* U+0107d8: */
+ 0, /* U+0107d9: */
+ 0, /* U+0107da: */
+ 0, /* U+0107db: */
+ 0, /* U+0107dc: */
+ 0, /* U+0107dd: */
+ 0, /* U+0107de: */
+ 0, /* U+0107df: */
+ 0, /* U+0107e0: */
+ 0, /* U+0107e1: */
+ 0, /* U+0107e2: */
+ 0, /* U+0107e3: */
+ 0, /* U+0107e4: */
+ 0, /* U+0107e5: */
+ 0, /* U+0107e6: */
+ 0, /* U+0107e7: */
+ 0, /* U+0107e8: */
+ 0, /* U+0107e9: */
+ 0, /* U+0107ea: */
+ 0, /* U+0107eb: */
+ 0, /* U+0107ec: */
+ 0, /* U+0107ed: */
+ 0, /* U+0107ee: */
+ 0, /* U+0107ef: */
+ 0, /* U+0107f0: */
+ 0, /* U+0107f1: */
+ 0, /* U+0107f2: */
+ 0, /* U+0107f3: */
+ 0, /* U+0107f4: */
+ 0, /* U+0107f5: */
+ 0, /* U+0107f6: */
+ 0, /* U+0107f7: */
+ 0, /* U+0107f8: */
+ 0, /* U+0107f9: */
+ 0, /* U+0107fa: */
+ 0, /* U+0107fb: */
+ 0, /* U+0107fc: */
+ 0, /* U+0107fd: */
+ 0, /* U+0107fe: */
+ 0, /* U+0107ff: */
+ RTUNI_ALPHA, /* U+010800: CYPRIOT SYLLABLE A*/
+ RTUNI_ALPHA, /* U+010801: CYPRIOT SYLLABLE E*/
+ RTUNI_ALPHA, /* U+010802: CYPRIOT SYLLABLE I*/
+ RTUNI_ALPHA, /* U+010803: CYPRIOT SYLLABLE O*/
+ RTUNI_ALPHA, /* U+010804: CYPRIOT SYLLABLE U*/
+ RTUNI_ALPHA, /* U+010805: CYPRIOT SYLLABLE JA*/
+ 0, /* U+010806: */
+ 0, /* U+010807: */
+ RTUNI_ALPHA, /* U+010808: CYPRIOT SYLLABLE JO*/
+ 0, /* U+010809: */
+ RTUNI_ALPHA, /* U+01080a: CYPRIOT SYLLABLE KA*/
+ RTUNI_ALPHA, /* U+01080b: CYPRIOT SYLLABLE KE*/
+ RTUNI_ALPHA, /* U+01080c: CYPRIOT SYLLABLE KI*/
+ RTUNI_ALPHA, /* U+01080d: CYPRIOT SYLLABLE KO*/
+ RTUNI_ALPHA, /* U+01080e: CYPRIOT SYLLABLE KU*/
+ RTUNI_ALPHA, /* U+01080f: CYPRIOT SYLLABLE LA*/
+ RTUNI_ALPHA, /* U+010810: CYPRIOT SYLLABLE LE*/
+ RTUNI_ALPHA, /* U+010811: CYPRIOT SYLLABLE LI*/
+ RTUNI_ALPHA, /* U+010812: CYPRIOT SYLLABLE LO*/
+ RTUNI_ALPHA, /* U+010813: CYPRIOT SYLLABLE LU*/
+ RTUNI_ALPHA, /* U+010814: CYPRIOT SYLLABLE MA*/
+ RTUNI_ALPHA, /* U+010815: CYPRIOT SYLLABLE ME*/
+ RTUNI_ALPHA, /* U+010816: CYPRIOT SYLLABLE MI*/
+ RTUNI_ALPHA, /* U+010817: CYPRIOT SYLLABLE MO*/
+ RTUNI_ALPHA, /* U+010818: CYPRIOT SYLLABLE MU*/
+ RTUNI_ALPHA, /* U+010819: CYPRIOT SYLLABLE NA*/
+ RTUNI_ALPHA, /* U+01081a: CYPRIOT SYLLABLE NE*/
+ RTUNI_ALPHA, /* U+01081b: CYPRIOT SYLLABLE NI*/
+ RTUNI_ALPHA, /* U+01081c: CYPRIOT SYLLABLE NO*/
+ RTUNI_ALPHA, /* U+01081d: CYPRIOT SYLLABLE NU*/
+ RTUNI_ALPHA, /* U+01081e: CYPRIOT SYLLABLE PA*/
+ RTUNI_ALPHA, /* U+01081f: CYPRIOT SYLLABLE PE*/
+ RTUNI_ALPHA, /* U+010820: CYPRIOT SYLLABLE PI*/
+ RTUNI_ALPHA, /* U+010821: CYPRIOT SYLLABLE PO*/
+ RTUNI_ALPHA, /* U+010822: CYPRIOT SYLLABLE PU*/
+ RTUNI_ALPHA, /* U+010823: CYPRIOT SYLLABLE RA*/
+ RTUNI_ALPHA, /* U+010824: CYPRIOT SYLLABLE RE*/
+ RTUNI_ALPHA, /* U+010825: CYPRIOT SYLLABLE RI*/
+ RTUNI_ALPHA, /* U+010826: CYPRIOT SYLLABLE RO*/
+ RTUNI_ALPHA, /* U+010827: CYPRIOT SYLLABLE RU*/
+ RTUNI_ALPHA, /* U+010828: CYPRIOT SYLLABLE SA*/
+ RTUNI_ALPHA, /* U+010829: CYPRIOT SYLLABLE SE*/
+ RTUNI_ALPHA, /* U+01082a: CYPRIOT SYLLABLE SI*/
+ RTUNI_ALPHA, /* U+01082b: CYPRIOT SYLLABLE SO*/
+ RTUNI_ALPHA, /* U+01082c: CYPRIOT SYLLABLE SU*/
+ RTUNI_ALPHA, /* U+01082d: CYPRIOT SYLLABLE TA*/
+ RTUNI_ALPHA, /* U+01082e: CYPRIOT SYLLABLE TE*/
+ RTUNI_ALPHA, /* U+01082f: CYPRIOT SYLLABLE TI*/
+ RTUNI_ALPHA, /* U+010830: CYPRIOT SYLLABLE TO*/
+ RTUNI_ALPHA, /* U+010831: CYPRIOT SYLLABLE TU*/
+ RTUNI_ALPHA, /* U+010832: CYPRIOT SYLLABLE WA*/
+ RTUNI_ALPHA, /* U+010833: CYPRIOT SYLLABLE WE*/
+ RTUNI_ALPHA, /* U+010834: CYPRIOT SYLLABLE WI*/
+ RTUNI_ALPHA, /* U+010835: CYPRIOT SYLLABLE WO*/
+ 0, /* U+010836: */
+ RTUNI_ALPHA, /* U+010837: CYPRIOT SYLLABLE XA*/
+ RTUNI_ALPHA, /* U+010838: CYPRIOT SYLLABLE XE*/
+ 0, /* U+010839: */
+ 0, /* U+01083a: */
+ 0, /* U+01083b: */
+ RTUNI_ALPHA, /* U+01083c: CYPRIOT SYLLABLE ZA*/
+ 0, /* U+01083d: */
+ 0, /* U+01083e: */
+ RTUNI_ALPHA, /* U+01083f: CYPRIOT SYLLABLE ZO*/
+ RTUNI_ALPHA, /* U+010840: IMPERIAL ARAMAIC LETTER ALEPH*/
+ RTUNI_ALPHA, /* U+010841: IMPERIAL ARAMAIC LETTER BETH*/
+ RTUNI_ALPHA, /* U+010842: IMPERIAL ARAMAIC LETTER GIMEL*/
+ RTUNI_ALPHA, /* U+010843: IMPERIAL ARAMAIC LETTER DALETH*/
+ RTUNI_ALPHA, /* U+010844: IMPERIAL ARAMAIC LETTER HE*/
+ RTUNI_ALPHA, /* U+010845: IMPERIAL ARAMAIC LETTER WAW*/
+ RTUNI_ALPHA, /* U+010846: IMPERIAL ARAMAIC LETTER ZAYIN*/
+ RTUNI_ALPHA, /* U+010847: IMPERIAL ARAMAIC LETTER HETH*/
+ RTUNI_ALPHA, /* U+010848: IMPERIAL ARAMAIC LETTER TETH*/
+ RTUNI_ALPHA, /* U+010849: IMPERIAL ARAMAIC LETTER YODH*/
+ RTUNI_ALPHA, /* U+01084a: IMPERIAL ARAMAIC LETTER KAPH*/
+ RTUNI_ALPHA, /* U+01084b: IMPERIAL ARAMAIC LETTER LAMEDH*/
+ RTUNI_ALPHA, /* U+01084c: IMPERIAL ARAMAIC LETTER MEM*/
+ RTUNI_ALPHA, /* U+01084d: IMPERIAL ARAMAIC LETTER NUN*/
+ RTUNI_ALPHA, /* U+01084e: IMPERIAL ARAMAIC LETTER SAMEKH*/
+ RTUNI_ALPHA, /* U+01084f: IMPERIAL ARAMAIC LETTER AYIN*/
+ RTUNI_ALPHA, /* U+010850: IMPERIAL ARAMAIC LETTER PE*/
+ RTUNI_ALPHA, /* U+010851: IMPERIAL ARAMAIC LETTER SADHE*/
+ RTUNI_ALPHA, /* U+010852: IMPERIAL ARAMAIC LETTER QOPH*/
+ RTUNI_ALPHA, /* U+010853: IMPERIAL ARAMAIC LETTER RESH*/
+ RTUNI_ALPHA, /* U+010854: IMPERIAL ARAMAIC LETTER SHIN*/
+ RTUNI_ALPHA, /* U+010855: IMPERIAL ARAMAIC LETTER TAW*/
+ 0, /* U+010856: */
+ 0, /* U+010857: IMPERIAL ARAMAIC SECTION SIGN*/
+ 0, /* U+010858: IMPERIAL ARAMAIC NUMBER ONE*/
+ 0, /* U+010859: IMPERIAL ARAMAIC NUMBER TWO*/
+ 0, /* U+01085a: IMPERIAL ARAMAIC NUMBER THREE*/
+ 0, /* U+01085b: IMPERIAL ARAMAIC NUMBER TEN*/
+ 0, /* U+01085c: IMPERIAL ARAMAIC NUMBER TWENTY*/
+ 0, /* U+01085d: IMPERIAL ARAMAIC NUMBER ONE HUNDRED*/
+ 0, /* U+01085e: IMPERIAL ARAMAIC NUMBER ONE THOUSAND*/
+ 0, /* U+01085f: IMPERIAL ARAMAIC NUMBER TEN THOUSAND*/
+ 0, /* U+010860: */
+ 0, /* U+010861: */
+ 0, /* U+010862: */
+ 0, /* U+010863: */
+ 0, /* U+010864: */
+ 0, /* U+010865: */
+ 0, /* U+010866: */
+ 0, /* U+010867: */
+ 0, /* U+010868: */
+ 0, /* U+010869: */
+ 0, /* U+01086a: */
+ 0, /* U+01086b: */
+ 0, /* U+01086c: */
+ 0, /* U+01086d: */
+ 0, /* U+01086e: */
+ 0, /* U+01086f: */
+ 0, /* U+010870: */
+ 0, /* U+010871: */
+ 0, /* U+010872: */
+ 0, /* U+010873: */
+ 0, /* U+010874: */
+ 0, /* U+010875: */
+ 0, /* U+010876: */
+ 0, /* U+010877: */
+ 0, /* U+010878: */
+ 0, /* U+010879: */
+ 0, /* U+01087a: */
+ 0, /* U+01087b: */
+ 0, /* U+01087c: */
+ 0, /* U+01087d: */
+ 0, /* U+01087e: */
+ 0, /* U+01087f: */
+ 0, /* U+010880: */
+ 0, /* U+010881: */
+ 0, /* U+010882: */
+ 0, /* U+010883: */
+ 0, /* U+010884: */
+ 0, /* U+010885: */
+ 0, /* U+010886: */
+ 0, /* U+010887: */
+ 0, /* U+010888: */
+ 0, /* U+010889: */
+ 0, /* U+01088a: */
+ 0, /* U+01088b: */
+ 0, /* U+01088c: */
+ 0, /* U+01088d: */
+ 0, /* U+01088e: */
+ 0, /* U+01088f: */
+ 0, /* U+010890: */
+ 0, /* U+010891: */
+ 0, /* U+010892: */
+ 0, /* U+010893: */
+ 0, /* U+010894: */
+ 0, /* U+010895: */
+ 0, /* U+010896: */
+ 0, /* U+010897: */
+ 0, /* U+010898: */
+ 0, /* U+010899: */
+ 0, /* U+01089a: */
+ 0, /* U+01089b: */
+ 0, /* U+01089c: */
+ 0, /* U+01089d: */
+ 0, /* U+01089e: */
+ 0, /* U+01089f: */
+ 0, /* U+0108a0: */
+ 0, /* U+0108a1: */
+ 0, /* U+0108a2: */
+ 0, /* U+0108a3: */
+ 0, /* U+0108a4: */
+ 0, /* U+0108a5: */
+ 0, /* U+0108a6: */
+ 0, /* U+0108a7: */
+ 0, /* U+0108a8: */
+ 0, /* U+0108a9: */
+ 0, /* U+0108aa: */
+ 0, /* U+0108ab: */
+ 0, /* U+0108ac: */
+ 0, /* U+0108ad: */
+ 0, /* U+0108ae: */
+ 0, /* U+0108af: */
+ 0, /* U+0108b0: */
+ 0, /* U+0108b1: */
+ 0, /* U+0108b2: */
+ 0, /* U+0108b3: */
+ 0, /* U+0108b4: */
+ 0, /* U+0108b5: */
+ 0, /* U+0108b6: */
+ 0, /* U+0108b7: */
+ 0, /* U+0108b8: */
+ 0, /* U+0108b9: */
+ 0, /* U+0108ba: */
+ 0, /* U+0108bb: */
+ 0, /* U+0108bc: */
+ 0, /* U+0108bd: */
+ 0, /* U+0108be: */
+ 0, /* U+0108bf: */
+ 0, /* U+0108c0: */
+ 0, /* U+0108c1: */
+ 0, /* U+0108c2: */
+ 0, /* U+0108c3: */
+ 0, /* U+0108c4: */
+ 0, /* U+0108c5: */
+ 0, /* U+0108c6: */
+ 0, /* U+0108c7: */
+ 0, /* U+0108c8: */
+ 0, /* U+0108c9: */
+ 0, /* U+0108ca: */
+ 0, /* U+0108cb: */
+ 0, /* U+0108cc: */
+ 0, /* U+0108cd: */
+ 0, /* U+0108ce: */
+ 0, /* U+0108cf: */
+ 0, /* U+0108d0: */
+ 0, /* U+0108d1: */
+ 0, /* U+0108d2: */
+ 0, /* U+0108d3: */
+ 0, /* U+0108d4: */
+ 0, /* U+0108d5: */
+ 0, /* U+0108d6: */
+ 0, /* U+0108d7: */
+ 0, /* U+0108d8: */
+ 0, /* U+0108d9: */
+ 0, /* U+0108da: */
+ 0, /* U+0108db: */
+ 0, /* U+0108dc: */
+ 0, /* U+0108dd: */
+ 0, /* U+0108de: */
+ 0, /* U+0108df: */
+ 0, /* U+0108e0: */
+ 0, /* U+0108e1: */
+ 0, /* U+0108e2: */
+ 0, /* U+0108e3: */
+ 0, /* U+0108e4: */
+ 0, /* U+0108e5: */
+ 0, /* U+0108e6: */
+ 0, /* U+0108e7: */
+ 0, /* U+0108e8: */
+ 0, /* U+0108e9: */
+ 0, /* U+0108ea: */
+ 0, /* U+0108eb: */
+ 0, /* U+0108ec: */
+ 0, /* U+0108ed: */
+ 0, /* U+0108ee: */
+ 0, /* U+0108ef: */
+ 0, /* U+0108f0: */
+ 0, /* U+0108f1: */
+ 0, /* U+0108f2: */
+ 0, /* U+0108f3: */
+ 0, /* U+0108f4: */
+ 0, /* U+0108f5: */
+ 0, /* U+0108f6: */
+ 0, /* U+0108f7: */
+ 0, /* U+0108f8: */
+ 0, /* U+0108f9: */
+ 0, /* U+0108fa: */
+ 0, /* U+0108fb: */
+ 0, /* U+0108fc: */
+ 0, /* U+0108fd: */
+ 0, /* U+0108fe: */
+ 0, /* U+0108ff: */
+ RTUNI_ALPHA, /* U+010900: PHOENICIAN LETTER ALF*/
+ RTUNI_ALPHA, /* U+010901: PHOENICIAN LETTER BET*/
+ RTUNI_ALPHA, /* U+010902: PHOENICIAN LETTER GAML*/
+ RTUNI_ALPHA, /* U+010903: PHOENICIAN LETTER DELT*/
+ RTUNI_ALPHA, /* U+010904: PHOENICIAN LETTER HE*/
+ RTUNI_ALPHA, /* U+010905: PHOENICIAN LETTER WAU*/
+ RTUNI_ALPHA, /* U+010906: PHOENICIAN LETTER ZAI*/
+ RTUNI_ALPHA, /* U+010907: PHOENICIAN LETTER HET*/
+ RTUNI_ALPHA, /* U+010908: PHOENICIAN LETTER TET*/
+ RTUNI_ALPHA, /* U+010909: PHOENICIAN LETTER YOD*/
+ RTUNI_ALPHA, /* U+01090a: PHOENICIAN LETTER KAF*/
+ RTUNI_ALPHA, /* U+01090b: PHOENICIAN LETTER LAMD*/
+ RTUNI_ALPHA, /* U+01090c: PHOENICIAN LETTER MEM*/
+ RTUNI_ALPHA, /* U+01090d: PHOENICIAN LETTER NUN*/
+ RTUNI_ALPHA, /* U+01090e: PHOENICIAN LETTER SEMK*/
+ RTUNI_ALPHA, /* U+01090f: PHOENICIAN LETTER AIN*/
+ RTUNI_ALPHA, /* U+010910: PHOENICIAN LETTER PE*/
+ RTUNI_ALPHA, /* U+010911: PHOENICIAN LETTER SADE*/
+ RTUNI_ALPHA, /* U+010912: PHOENICIAN LETTER QOF*/
+ RTUNI_ALPHA, /* U+010913: PHOENICIAN LETTER ROSH*/
+ RTUNI_ALPHA, /* U+010914: PHOENICIAN LETTER SHIN*/
+ RTUNI_ALPHA, /* U+010915: PHOENICIAN LETTER TAU*/
+ 0, /* U+010916: PHOENICIAN NUMBER ONE*/
+ 0, /* U+010917: PHOENICIAN NUMBER TEN*/
+ 0, /* U+010918: PHOENICIAN NUMBER TWENTY*/
+ 0, /* U+010919: PHOENICIAN NUMBER ONE HUNDRED*/
+ 0, /* U+01091a: PHOENICIAN NUMBER TWO*/
+ 0, /* U+01091b: PHOENICIAN NUMBER THREE*/
+ 0, /* U+01091c: */
+ 0, /* U+01091d: */
+ 0, /* U+01091e: */
+ 0, /* U+01091f: PHOENICIAN WORD SEPARATOR*/
+ RTUNI_ALPHA, /* U+010920: LYDIAN LETTER A*/
+ RTUNI_ALPHA, /* U+010921: LYDIAN LETTER B*/
+ RTUNI_ALPHA, /* U+010922: LYDIAN LETTER G*/
+ RTUNI_ALPHA, /* U+010923: LYDIAN LETTER D*/
+ RTUNI_ALPHA, /* U+010924: LYDIAN LETTER E*/
+ RTUNI_ALPHA, /* U+010925: LYDIAN LETTER V*/
+ RTUNI_ALPHA, /* U+010926: LYDIAN LETTER I*/
+ RTUNI_ALPHA, /* U+010927: LYDIAN LETTER Y*/
+ RTUNI_ALPHA, /* U+010928: LYDIAN LETTER K*/
+ RTUNI_ALPHA, /* U+010929: LYDIAN LETTER L*/
+ RTUNI_ALPHA, /* U+01092a: LYDIAN LETTER M*/
+ RTUNI_ALPHA, /* U+01092b: LYDIAN LETTER N*/
+ RTUNI_ALPHA, /* U+01092c: LYDIAN LETTER O*/
+ RTUNI_ALPHA, /* U+01092d: LYDIAN LETTER R*/
+ RTUNI_ALPHA, /* U+01092e: LYDIAN LETTER SS*/
+ RTUNI_ALPHA, /* U+01092f: LYDIAN LETTER T*/
+ RTUNI_ALPHA, /* U+010930: LYDIAN LETTER U*/
+ RTUNI_ALPHA, /* U+010931: LYDIAN LETTER F*/
+ RTUNI_ALPHA, /* U+010932: LYDIAN LETTER Q*/
+ RTUNI_ALPHA, /* U+010933: LYDIAN LETTER S*/
+ RTUNI_ALPHA, /* U+010934: LYDIAN LETTER TT*/
+ RTUNI_ALPHA, /* U+010935: LYDIAN LETTER AN*/
+ RTUNI_ALPHA, /* U+010936: LYDIAN LETTER EN*/
+ RTUNI_ALPHA, /* U+010937: LYDIAN LETTER LY*/
+ RTUNI_ALPHA, /* U+010938: LYDIAN LETTER NN*/
+ RTUNI_ALPHA, /* U+010939: LYDIAN LETTER C*/
+ 0, /* U+01093a: */
+ 0, /* U+01093b: */
+ 0, /* U+01093c: */
+ 0, /* U+01093d: */
+ 0, /* U+01093e: */
+ 0, /* U+01093f: LYDIAN TRIANGULAR MARK*/
+ 0, /* U+010940: */
+ 0, /* U+010941: */
+ 0, /* U+010942: */
+ 0, /* U+010943: */
+ 0, /* U+010944: */
+ 0, /* U+010945: */
+ 0, /* U+010946: */
+ 0, /* U+010947: */
+ 0, /* U+010948: */
+ 0, /* U+010949: */
+ 0, /* U+01094a: */
+ 0, /* U+01094b: */
+ 0, /* U+01094c: */
+ 0, /* U+01094d: */
+ 0, /* U+01094e: */
+ 0, /* U+01094f: */
+ 0, /* U+010950: */
+ 0, /* U+010951: */
+ 0, /* U+010952: */
+ 0, /* U+010953: */
+ 0, /* U+010954: */
+ 0, /* U+010955: */
+ 0, /* U+010956: */
+ 0, /* U+010957: */
+ 0, /* U+010958: */
+ 0, /* U+010959: */
+ 0, /* U+01095a: */
+ 0, /* U+01095b: */
+ 0, /* U+01095c: */
+ 0, /* U+01095d: */
+ 0, /* U+01095e: */
+ 0, /* U+01095f: */
+ 0, /* U+010960: */
+ 0, /* U+010961: */
+ 0, /* U+010962: */
+ 0, /* U+010963: */
+ 0, /* U+010964: */
+ 0, /* U+010965: */
+ 0, /* U+010966: */
+ 0, /* U+010967: */
+ 0, /* U+010968: */
+ 0, /* U+010969: */
+ 0, /* U+01096a: */
+ 0, /* U+01096b: */
+ 0, /* U+01096c: */
+ 0, /* U+01096d: */
+ 0, /* U+01096e: */
+ 0, /* U+01096f: */
+ 0, /* U+010970: */
+ 0, /* U+010971: */
+ 0, /* U+010972: */
+ 0, /* U+010973: */
+ 0, /* U+010974: */
+ 0, /* U+010975: */
+ 0, /* U+010976: */
+ 0, /* U+010977: */
+ 0, /* U+010978: */
+ 0, /* U+010979: */
+ 0, /* U+01097a: */
+ 0, /* U+01097b: */
+ 0, /* U+01097c: */
+ 0, /* U+01097d: */
+ 0, /* U+01097e: */
+ 0, /* U+01097f: */
+ RTUNI_ALPHA, /* U+010980: MEROITIC HIEROGLYPHIC LETTER A*/
+ RTUNI_ALPHA, /* U+010981: MEROITIC HIEROGLYPHIC LETTER E*/
+ RTUNI_ALPHA, /* U+010982: MEROITIC HIEROGLYPHIC LETTER I*/
+ RTUNI_ALPHA, /* U+010983: MEROITIC HIEROGLYPHIC LETTER O*/
+ RTUNI_ALPHA, /* U+010984: MEROITIC HIEROGLYPHIC LETTER YA*/
+ RTUNI_ALPHA, /* U+010985: MEROITIC HIEROGLYPHIC LETTER WA*/
+ RTUNI_ALPHA, /* U+010986: MEROITIC HIEROGLYPHIC LETTER BA*/
+ RTUNI_ALPHA, /* U+010987: MEROITIC HIEROGLYPHIC LETTER BA-2*/
+ RTUNI_ALPHA, /* U+010988: MEROITIC HIEROGLYPHIC LETTER PA*/
+ RTUNI_ALPHA, /* U+010989: MEROITIC HIEROGLYPHIC LETTER MA*/
+ RTUNI_ALPHA, /* U+01098a: MEROITIC HIEROGLYPHIC LETTER NA*/
+ RTUNI_ALPHA, /* U+01098b: MEROITIC HIEROGLYPHIC LETTER NA-2*/
+ RTUNI_ALPHA, /* U+01098c: MEROITIC HIEROGLYPHIC LETTER NE*/
+ RTUNI_ALPHA, /* U+01098d: MEROITIC HIEROGLYPHIC LETTER NE-2*/
+ RTUNI_ALPHA, /* U+01098e: MEROITIC HIEROGLYPHIC LETTER RA*/
+ RTUNI_ALPHA, /* U+01098f: MEROITIC HIEROGLYPHIC LETTER RA-2*/
+ RTUNI_ALPHA, /* U+010990: MEROITIC HIEROGLYPHIC LETTER LA*/
+ RTUNI_ALPHA, /* U+010991: MEROITIC HIEROGLYPHIC LETTER KHA*/
+ RTUNI_ALPHA, /* U+010992: MEROITIC HIEROGLYPHIC LETTER HHA*/
+ RTUNI_ALPHA, /* U+010993: MEROITIC HIEROGLYPHIC LETTER SA*/
+ RTUNI_ALPHA, /* U+010994: MEROITIC HIEROGLYPHIC LETTER SA-2*/
+ RTUNI_ALPHA, /* U+010995: MEROITIC HIEROGLYPHIC LETTER SE*/
+ RTUNI_ALPHA, /* U+010996: MEROITIC HIEROGLYPHIC LETTER KA*/
+ RTUNI_ALPHA, /* U+010997: MEROITIC HIEROGLYPHIC LETTER QA*/
+ RTUNI_ALPHA, /* U+010998: MEROITIC HIEROGLYPHIC LETTER TA*/
+ RTUNI_ALPHA, /* U+010999: MEROITIC HIEROGLYPHIC LETTER TA-2*/
+ RTUNI_ALPHA, /* U+01099a: MEROITIC HIEROGLYPHIC LETTER TE*/
+ RTUNI_ALPHA, /* U+01099b: MEROITIC HIEROGLYPHIC LETTER TE-2*/
+ RTUNI_ALPHA, /* U+01099c: MEROITIC HIEROGLYPHIC LETTER TO*/
+ RTUNI_ALPHA, /* U+01099d: MEROITIC HIEROGLYPHIC LETTER DA*/
+ RTUNI_ALPHA, /* U+01099e: MEROITIC HIEROGLYPHIC SYMBOL VIDJ*/
+ RTUNI_ALPHA, /* U+01099f: MEROITIC HIEROGLYPHIC SYMBOL VIDJ-2*/
+ RTUNI_ALPHA, /* U+0109a0: MEROITIC CURSIVE LETTER A*/
+ RTUNI_ALPHA, /* U+0109a1: MEROITIC CURSIVE LETTER E*/
+ RTUNI_ALPHA, /* U+0109a2: MEROITIC CURSIVE LETTER I*/
+ RTUNI_ALPHA, /* U+0109a3: MEROITIC CURSIVE LETTER O*/
+ RTUNI_ALPHA, /* U+0109a4: MEROITIC CURSIVE LETTER YA*/
+ RTUNI_ALPHA, /* U+0109a5: MEROITIC CURSIVE LETTER WA*/
+ RTUNI_ALPHA, /* U+0109a6: MEROITIC CURSIVE LETTER BA*/
+ RTUNI_ALPHA, /* U+0109a7: MEROITIC CURSIVE LETTER PA*/
+ RTUNI_ALPHA, /* U+0109a8: MEROITIC CURSIVE LETTER MA*/
+ RTUNI_ALPHA, /* U+0109a9: MEROITIC CURSIVE LETTER NA*/
+ RTUNI_ALPHA, /* U+0109aa: MEROITIC CURSIVE LETTER NE*/
+ RTUNI_ALPHA, /* U+0109ab: MEROITIC CURSIVE LETTER RA*/
+ RTUNI_ALPHA, /* U+0109ac: MEROITIC CURSIVE LETTER LA*/
+ RTUNI_ALPHA, /* U+0109ad: MEROITIC CURSIVE LETTER KHA*/
+ RTUNI_ALPHA, /* U+0109ae: MEROITIC CURSIVE LETTER HHA*/
+ RTUNI_ALPHA, /* U+0109af: MEROITIC CURSIVE LETTER SA*/
+ RTUNI_ALPHA, /* U+0109b0: MEROITIC CURSIVE LETTER ARCHAIC SA*/
+ RTUNI_ALPHA, /* U+0109b1: MEROITIC CURSIVE LETTER SE*/
+ RTUNI_ALPHA, /* U+0109b2: MEROITIC CURSIVE LETTER KA*/
+ RTUNI_ALPHA, /* U+0109b3: MEROITIC CURSIVE LETTER QA*/
+ RTUNI_ALPHA, /* U+0109b4: MEROITIC CURSIVE LETTER TA*/
+ RTUNI_ALPHA, /* U+0109b5: MEROITIC CURSIVE LETTER TE*/
+ RTUNI_ALPHA, /* U+0109b6: MEROITIC CURSIVE LETTER TO*/
+ RTUNI_ALPHA, /* U+0109b7: MEROITIC CURSIVE LETTER DA*/
+ 0, /* U+0109b8: */
+ 0, /* U+0109b9: */
+ 0, /* U+0109ba: */
+ 0, /* U+0109bb: */
+ 0, /* U+0109bc: */
+ 0, /* U+0109bd: */
+ RTUNI_ALPHA, /* U+0109be: MEROITIC CURSIVE LOGOGRAM RMT*/
+ RTUNI_ALPHA, /* U+0109bf: MEROITIC CURSIVE LOGOGRAM IMN*/
+ 0, /* U+0109c0: */
+ 0, /* U+0109c1: */
+ 0, /* U+0109c2: */
+ 0, /* U+0109c3: */
+ 0, /* U+0109c4: */
+ 0, /* U+0109c5: */
+ 0, /* U+0109c6: */
+ 0, /* U+0109c7: */
+ 0, /* U+0109c8: */
+ 0, /* U+0109c9: */
+ 0, /* U+0109ca: */
+ 0, /* U+0109cb: */
+ 0, /* U+0109cc: */
+ 0, /* U+0109cd: */
+ 0, /* U+0109ce: */
+ 0, /* U+0109cf: */
+ 0, /* U+0109d0: */
+ 0, /* U+0109d1: */
+ 0, /* U+0109d2: */
+ 0, /* U+0109d3: */
+ 0, /* U+0109d4: */
+ 0, /* U+0109d5: */
+ 0, /* U+0109d6: */
+ 0, /* U+0109d7: */
+ 0, /* U+0109d8: */
+ 0, /* U+0109d9: */
+ 0, /* U+0109da: */
+ 0, /* U+0109db: */
+ 0, /* U+0109dc: */
+ 0, /* U+0109dd: */
+ 0, /* U+0109de: */
+ 0, /* U+0109df: */
+ 0, /* U+0109e0: */
+ 0, /* U+0109e1: */
+ 0, /* U+0109e2: */
+ 0, /* U+0109e3: */
+ 0, /* U+0109e4: */
+ 0, /* U+0109e5: */
+ 0, /* U+0109e6: */
+ 0, /* U+0109e7: */
+ 0, /* U+0109e8: */
+ 0, /* U+0109e9: */
+ 0, /* U+0109ea: */
+ 0, /* U+0109eb: */
+ 0, /* U+0109ec: */
+ 0, /* U+0109ed: */
+ 0, /* U+0109ee: */
+ 0, /* U+0109ef: */
+ 0, /* U+0109f0: */
+ 0, /* U+0109f1: */
+ 0, /* U+0109f2: */
+ 0, /* U+0109f3: */
+ 0, /* U+0109f4: */
+ 0, /* U+0109f5: */
+ 0, /* U+0109f6: */
+ 0, /* U+0109f7: */
+ 0, /* U+0109f8: */
+ 0, /* U+0109f9: */
+ 0, /* U+0109fa: */
+ 0, /* U+0109fb: */
+ 0, /* U+0109fc: */
+ 0, /* U+0109fd: */
+ 0, /* U+0109fe: */
+ 0, /* U+0109ff: */
+ RTUNI_ALPHA, /* U+010a00: KHAROSHTHI LETTER A*/
+ RTUNI_ALPHA, /* U+010a01: KHAROSHTHI VOWEL SIGN I*/
+ RTUNI_ALPHA, /* U+010a02: KHAROSHTHI VOWEL SIGN U*/
+ RTUNI_ALPHA, /* U+010a03: KHAROSHTHI VOWEL SIGN VOCALIC R*/
+ 0, /* U+010a04: */
+ RTUNI_ALPHA, /* U+010a05: KHAROSHTHI VOWEL SIGN E*/
+ RTUNI_ALPHA, /* U+010a06: KHAROSHTHI VOWEL SIGN O*/
+ 0, /* U+010a07: */
+ 0, /* U+010a08: */
+ 0, /* U+010a09: */
+ 0, /* U+010a0a: */
+ 0, /* U+010a0b: */
+ RTUNI_ALPHA, /* U+010a0c: KHAROSHTHI VOWEL LENGTH MARK*/
+ RTUNI_ALPHA, /* U+010a0d: KHAROSHTHI SIGN DOUBLE RING BELOW*/
+ RTUNI_ALPHA, /* U+010a0e: KHAROSHTHI SIGN ANUSVARA*/
+ RTUNI_ALPHA, /* U+010a0f: KHAROSHTHI SIGN VISARGA*/
+ RTUNI_ALPHA, /* U+010a10: KHAROSHTHI LETTER KA*/
+ RTUNI_ALPHA, /* U+010a11: KHAROSHTHI LETTER KHA*/
+ RTUNI_ALPHA, /* U+010a12: KHAROSHTHI LETTER GA*/
+ RTUNI_ALPHA, /* U+010a13: KHAROSHTHI LETTER GHA*/
+ 0, /* U+010a14: */
+ RTUNI_ALPHA, /* U+010a15: KHAROSHTHI LETTER CA*/
+ RTUNI_ALPHA, /* U+010a16: KHAROSHTHI LETTER CHA*/
+ RTUNI_ALPHA, /* U+010a17: KHAROSHTHI LETTER JA*/
+ 0, /* U+010a18: */
+ RTUNI_ALPHA, /* U+010a19: KHAROSHTHI LETTER NYA*/
+ RTUNI_ALPHA, /* U+010a1a: KHAROSHTHI LETTER TTA*/
+ RTUNI_ALPHA, /* U+010a1b: KHAROSHTHI LETTER TTHA*/
+ RTUNI_ALPHA, /* U+010a1c: KHAROSHTHI LETTER DDA*/
+ RTUNI_ALPHA, /* U+010a1d: KHAROSHTHI LETTER DDHA*/
+ RTUNI_ALPHA, /* U+010a1e: KHAROSHTHI LETTER NNA*/
+ RTUNI_ALPHA, /* U+010a1f: KHAROSHTHI LETTER TA*/
+ RTUNI_ALPHA, /* U+010a20: KHAROSHTHI LETTER THA*/
+ RTUNI_ALPHA, /* U+010a21: KHAROSHTHI LETTER DA*/
+ RTUNI_ALPHA, /* U+010a22: KHAROSHTHI LETTER DHA*/
+ RTUNI_ALPHA, /* U+010a23: KHAROSHTHI LETTER NA*/
+ RTUNI_ALPHA, /* U+010a24: KHAROSHTHI LETTER PA*/
+ RTUNI_ALPHA, /* U+010a25: KHAROSHTHI LETTER PHA*/
+ RTUNI_ALPHA, /* U+010a26: KHAROSHTHI LETTER BA*/
+ RTUNI_ALPHA, /* U+010a27: KHAROSHTHI LETTER BHA*/
+ RTUNI_ALPHA, /* U+010a28: KHAROSHTHI LETTER MA*/
+ RTUNI_ALPHA, /* U+010a29: KHAROSHTHI LETTER YA*/
+ RTUNI_ALPHA, /* U+010a2a: KHAROSHTHI LETTER RA*/
+ RTUNI_ALPHA, /* U+010a2b: KHAROSHTHI LETTER LA*/
+ RTUNI_ALPHA, /* U+010a2c: KHAROSHTHI LETTER VA*/
+ RTUNI_ALPHA, /* U+010a2d: KHAROSHTHI LETTER SHA*/
+ RTUNI_ALPHA, /* U+010a2e: KHAROSHTHI LETTER SSA*/
+ RTUNI_ALPHA, /* U+010a2f: KHAROSHTHI LETTER SA*/
+ RTUNI_ALPHA, /* U+010a30: KHAROSHTHI LETTER ZA*/
+ RTUNI_ALPHA, /* U+010a31: KHAROSHTHI LETTER HA*/
+ RTUNI_ALPHA, /* U+010a32: KHAROSHTHI LETTER KKA*/
+ RTUNI_ALPHA, /* U+010a33: KHAROSHTHI LETTER TTTHA*/
+ 0, /* U+010a34: */
+ 0, /* U+010a35: */
+ 0, /* U+010a36: */
+ 0, /* U+010a37: */
+ 0, /* U+010a38: KHAROSHTHI SIGN BAR ABOVE*/
+ 0, /* U+010a39: KHAROSHTHI SIGN CAUDA*/
+ 0, /* U+010a3a: KHAROSHTHI SIGN DOT BELOW*/
+ 0, /* U+010a3b: */
+ 0, /* U+010a3c: */
+ 0, /* U+010a3d: */
+ 0, /* U+010a3e: */
+ 0, /* U+010a3f: KHAROSHTHI VIRAMA*/
+ 0, /* U+010a40: KHAROSHTHI DIGIT ONE*/
+ 0, /* U+010a41: KHAROSHTHI DIGIT TWO*/
+ 0, /* U+010a42: KHAROSHTHI DIGIT THREE*/
+ 0, /* U+010a43: KHAROSHTHI DIGIT FOUR*/
+ 0, /* U+010a44: KHAROSHTHI NUMBER TEN*/
+ 0, /* U+010a45: KHAROSHTHI NUMBER TWENTY*/
+ 0, /* U+010a46: KHAROSHTHI NUMBER ONE HUNDRED*/
+ 0, /* U+010a47: KHAROSHTHI NUMBER ONE THOUSAND*/
+ 0, /* U+010a48: */
+ 0, /* U+010a49: */
+ 0, /* U+010a4a: */
+ 0, /* U+010a4b: */
+ 0, /* U+010a4c: */
+ 0, /* U+010a4d: */
+ 0, /* U+010a4e: */
+ 0, /* U+010a4f: */
+ 0, /* U+010a50: KHAROSHTHI PUNCTUATION DOT*/
+ 0, /* U+010a51: KHAROSHTHI PUNCTUATION SMALL CIRCLE*/
+ 0, /* U+010a52: KHAROSHTHI PUNCTUATION CIRCLE*/
+ 0, /* U+010a53: KHAROSHTHI PUNCTUATION CRESCENT BAR*/
+ 0, /* U+010a54: KHAROSHTHI PUNCTUATION MANGALAM*/
+ 0, /* U+010a55: KHAROSHTHI PUNCTUATION LOTUS*/
+ 0, /* U+010a56: KHAROSHTHI PUNCTUATION DANDA*/
+ 0, /* U+010a57: KHAROSHTHI PUNCTUATION DOUBLE DANDA*/
+ 0, /* U+010a58: KHAROSHTHI PUNCTUATION LINES*/
+ 0, /* U+010a59: */
+ 0, /* U+010a5a: */
+ 0, /* U+010a5b: */
+ 0, /* U+010a5c: */
+ 0, /* U+010a5d: */
+ 0, /* U+010a5e: */
+ 0, /* U+010a5f: */
+ RTUNI_ALPHA, /* U+010a60: OLD SOUTH ARABIAN LETTER HE*/
+ RTUNI_ALPHA, /* U+010a61: OLD SOUTH ARABIAN LETTER LAMEDH*/
+ RTUNI_ALPHA, /* U+010a62: OLD SOUTH ARABIAN LETTER HETH*/
+ RTUNI_ALPHA, /* U+010a63: OLD SOUTH ARABIAN LETTER MEM*/
+ RTUNI_ALPHA, /* U+010a64: OLD SOUTH ARABIAN LETTER QOPH*/
+ RTUNI_ALPHA, /* U+010a65: OLD SOUTH ARABIAN LETTER WAW*/
+ RTUNI_ALPHA, /* U+010a66: OLD SOUTH ARABIAN LETTER SHIN*/
+ RTUNI_ALPHA, /* U+010a67: OLD SOUTH ARABIAN LETTER RESH*/
+ RTUNI_ALPHA, /* U+010a68: OLD SOUTH ARABIAN LETTER BETH*/
+ RTUNI_ALPHA, /* U+010a69: OLD SOUTH ARABIAN LETTER TAW*/
+ RTUNI_ALPHA, /* U+010a6a: OLD SOUTH ARABIAN LETTER SAT*/
+ RTUNI_ALPHA, /* U+010a6b: OLD SOUTH ARABIAN LETTER KAPH*/
+ RTUNI_ALPHA, /* U+010a6c: OLD SOUTH ARABIAN LETTER NUN*/
+ RTUNI_ALPHA, /* U+010a6d: OLD SOUTH ARABIAN LETTER KHETH*/
+ RTUNI_ALPHA, /* U+010a6e: OLD SOUTH ARABIAN LETTER SADHE*/
+ RTUNI_ALPHA, /* U+010a6f: OLD SOUTH ARABIAN LETTER SAMEKH*/
+ RTUNI_ALPHA, /* U+010a70: OLD SOUTH ARABIAN LETTER FE*/
+ RTUNI_ALPHA, /* U+010a71: OLD SOUTH ARABIAN LETTER ALEF*/
+ RTUNI_ALPHA, /* U+010a72: OLD SOUTH ARABIAN LETTER AYN*/
+ RTUNI_ALPHA, /* U+010a73: OLD SOUTH ARABIAN LETTER DHADHE*/
+ RTUNI_ALPHA, /* U+010a74: OLD SOUTH ARABIAN LETTER GIMEL*/
+ RTUNI_ALPHA, /* U+010a75: OLD SOUTH ARABIAN LETTER DALETH*/
+ RTUNI_ALPHA, /* U+010a76: OLD SOUTH ARABIAN LETTER GHAYN*/
+ RTUNI_ALPHA, /* U+010a77: OLD SOUTH ARABIAN LETTER TETH*/
+ RTUNI_ALPHA, /* U+010a78: OLD SOUTH ARABIAN LETTER ZAYN*/
+ RTUNI_ALPHA, /* U+010a79: OLD SOUTH ARABIAN LETTER DHALETH*/
+ RTUNI_ALPHA, /* U+010a7a: OLD SOUTH ARABIAN LETTER YODH*/
+ RTUNI_ALPHA, /* U+010a7b: OLD SOUTH ARABIAN LETTER THAW*/
+ RTUNI_ALPHA, /* U+010a7c: OLD SOUTH ARABIAN LETTER THETH*/
+ 0, /* U+010a7d: OLD SOUTH ARABIAN NUMBER ONE*/
+ 0, /* U+010a7e: OLD SOUTH ARABIAN NUMBER FIFTY*/
+ 0, /* U+010a7f: OLD SOUTH ARABIAN NUMERIC INDICATOR*/
+ 0, /* U+010a80: */
+ 0, /* U+010a81: */
+ 0, /* U+010a82: */
+ 0, /* U+010a83: */
+ 0, /* U+010a84: */
+ 0, /* U+010a85: */
+ 0, /* U+010a86: */
+ 0, /* U+010a87: */
+ 0, /* U+010a88: */
+ 0, /* U+010a89: */
+ 0, /* U+010a8a: */
+ 0, /* U+010a8b: */
+ 0, /* U+010a8c: */
+ 0, /* U+010a8d: */
+ 0, /* U+010a8e: */
+ 0, /* U+010a8f: */
+ 0, /* U+010a90: */
+ 0, /* U+010a91: */
+ 0, /* U+010a92: */
+ 0, /* U+010a93: */
+ 0, /* U+010a94: */
+ 0, /* U+010a95: */
+ 0, /* U+010a96: */
+ 0, /* U+010a97: */
+ 0, /* U+010a98: */
+ 0, /* U+010a99: */
+ 0, /* U+010a9a: */
+ 0, /* U+010a9b: */
+ 0, /* U+010a9c: */
+ 0, /* U+010a9d: */
+ 0, /* U+010a9e: */
+ 0, /* U+010a9f: */
+ 0, /* U+010aa0: */
+ 0, /* U+010aa1: */
+ 0, /* U+010aa2: */
+ 0, /* U+010aa3: */
+ 0, /* U+010aa4: */
+ 0, /* U+010aa5: */
+ 0, /* U+010aa6: */
+ 0, /* U+010aa7: */
+ 0, /* U+010aa8: */
+ 0, /* U+010aa9: */
+ 0, /* U+010aaa: */
+ 0, /* U+010aab: */
+ 0, /* U+010aac: */
+ 0, /* U+010aad: */
+ 0, /* U+010aae: */
+ 0, /* U+010aaf: */
+ 0, /* U+010ab0: */
+ 0, /* U+010ab1: */
+ 0, /* U+010ab2: */
+ 0, /* U+010ab3: */
+ 0, /* U+010ab4: */
+ 0, /* U+010ab5: */
+ 0, /* U+010ab6: */
+ 0, /* U+010ab7: */
+ 0, /* U+010ab8: */
+ 0, /* U+010ab9: */
+ 0, /* U+010aba: */
+ 0, /* U+010abb: */
+ 0, /* U+010abc: */
+ 0, /* U+010abd: */
+ 0, /* U+010abe: */
+ 0, /* U+010abf: */
+ 0, /* U+010ac0: */
+ 0, /* U+010ac1: */
+ 0, /* U+010ac2: */
+ 0, /* U+010ac3: */
+ 0, /* U+010ac4: */
+ 0, /* U+010ac5: */
+ 0, /* U+010ac6: */
+ 0, /* U+010ac7: */
+ 0, /* U+010ac8: */
+ 0, /* U+010ac9: */
+ 0, /* U+010aca: */
+ 0, /* U+010acb: */
+ 0, /* U+010acc: */
+ 0, /* U+010acd: */
+ 0, /* U+010ace: */
+ 0, /* U+010acf: */
+ 0, /* U+010ad0: */
+ 0, /* U+010ad1: */
+ 0, /* U+010ad2: */
+ 0, /* U+010ad3: */
+ 0, /* U+010ad4: */
+ 0, /* U+010ad5: */
+ 0, /* U+010ad6: */
+ 0, /* U+010ad7: */
+ 0, /* U+010ad8: */
+ 0, /* U+010ad9: */
+ 0, /* U+010ada: */
+ 0, /* U+010adb: */
+ 0, /* U+010adc: */
+ 0, /* U+010add: */
+ 0, /* U+010ade: */
+ 0, /* U+010adf: */
+ 0, /* U+010ae0: */
+ 0, /* U+010ae1: */
+ 0, /* U+010ae2: */
+ 0, /* U+010ae3: */
+ 0, /* U+010ae4: */
+ 0, /* U+010ae5: */
+ 0, /* U+010ae6: */
+ 0, /* U+010ae7: */
+ 0, /* U+010ae8: */
+ 0, /* U+010ae9: */
+ 0, /* U+010aea: */
+ 0, /* U+010aeb: */
+ 0, /* U+010aec: */
+ 0, /* U+010aed: */
+ 0, /* U+010aee: */
+ 0, /* U+010aef: */
+ 0, /* U+010af0: */
+ 0, /* U+010af1: */
+ 0, /* U+010af2: */
+ 0, /* U+010af3: */
+ 0, /* U+010af4: */
+ 0, /* U+010af5: */
+ 0, /* U+010af6: */
+ 0, /* U+010af7: */
+ 0, /* U+010af8: */
+ 0, /* U+010af9: */
+ 0, /* U+010afa: */
+ 0, /* U+010afb: */
+ 0, /* U+010afc: */
+ 0, /* U+010afd: */
+ 0, /* U+010afe: */
+ 0, /* U+010aff: */
+ RTUNI_ALPHA, /* U+010b00: AVESTAN LETTER A*/
+ RTUNI_ALPHA, /* U+010b01: AVESTAN LETTER AA*/
+ RTUNI_ALPHA, /* U+010b02: AVESTAN LETTER AO*/
+ RTUNI_ALPHA, /* U+010b03: AVESTAN LETTER AAO*/
+ RTUNI_ALPHA, /* U+010b04: AVESTAN LETTER AN*/
+ RTUNI_ALPHA, /* U+010b05: AVESTAN LETTER AAN*/
+ RTUNI_ALPHA, /* U+010b06: AVESTAN LETTER AE*/
+ RTUNI_ALPHA, /* U+010b07: AVESTAN LETTER AEE*/
+ RTUNI_ALPHA, /* U+010b08: AVESTAN LETTER E*/
+ RTUNI_ALPHA, /* U+010b09: AVESTAN LETTER EE*/
+ RTUNI_ALPHA, /* U+010b0a: AVESTAN LETTER O*/
+ RTUNI_ALPHA, /* U+010b0b: AVESTAN LETTER OO*/
+ RTUNI_ALPHA, /* U+010b0c: AVESTAN LETTER I*/
+ RTUNI_ALPHA, /* U+010b0d: AVESTAN LETTER II*/
+ RTUNI_ALPHA, /* U+010b0e: AVESTAN LETTER U*/
+ RTUNI_ALPHA, /* U+010b0f: AVESTAN LETTER UU*/
+ RTUNI_ALPHA, /* U+010b10: AVESTAN LETTER KE*/
+ RTUNI_ALPHA, /* U+010b11: AVESTAN LETTER XE*/
+ RTUNI_ALPHA, /* U+010b12: AVESTAN LETTER XYE*/
+ RTUNI_ALPHA, /* U+010b13: AVESTAN LETTER XVE*/
+ RTUNI_ALPHA, /* U+010b14: AVESTAN LETTER GE*/
+ RTUNI_ALPHA, /* U+010b15: AVESTAN LETTER GGE*/
+ RTUNI_ALPHA, /* U+010b16: AVESTAN LETTER GHE*/
+ RTUNI_ALPHA, /* U+010b17: AVESTAN LETTER CE*/
+ RTUNI_ALPHA, /* U+010b18: AVESTAN LETTER JE*/
+ RTUNI_ALPHA, /* U+010b19: AVESTAN LETTER TE*/
+ RTUNI_ALPHA, /* U+010b1a: AVESTAN LETTER THE*/
+ RTUNI_ALPHA, /* U+010b1b: AVESTAN LETTER DE*/
+ RTUNI_ALPHA, /* U+010b1c: AVESTAN LETTER DHE*/
+ RTUNI_ALPHA, /* U+010b1d: AVESTAN LETTER TTE*/
+ RTUNI_ALPHA, /* U+010b1e: AVESTAN LETTER PE*/
+ RTUNI_ALPHA, /* U+010b1f: AVESTAN LETTER FE*/
+ RTUNI_ALPHA, /* U+010b20: AVESTAN LETTER BE*/
+ RTUNI_ALPHA, /* U+010b21: AVESTAN LETTER BHE*/
+ RTUNI_ALPHA, /* U+010b22: AVESTAN LETTER NGE*/
+ RTUNI_ALPHA, /* U+010b23: AVESTAN LETTER NGYE*/
+ RTUNI_ALPHA, /* U+010b24: AVESTAN LETTER NGVE*/
+ RTUNI_ALPHA, /* U+010b25: AVESTAN LETTER NE*/
+ RTUNI_ALPHA, /* U+010b26: AVESTAN LETTER NYE*/
+ RTUNI_ALPHA, /* U+010b27: AVESTAN LETTER NNE*/
+ RTUNI_ALPHA, /* U+010b28: AVESTAN LETTER ME*/
+ RTUNI_ALPHA, /* U+010b29: AVESTAN LETTER HME*/
+ RTUNI_ALPHA, /* U+010b2a: AVESTAN LETTER YYE*/
+ RTUNI_ALPHA, /* U+010b2b: AVESTAN LETTER YE*/
+ RTUNI_ALPHA, /* U+010b2c: AVESTAN LETTER VE*/
+ RTUNI_ALPHA, /* U+010b2d: AVESTAN LETTER RE*/
+ RTUNI_ALPHA, /* U+010b2e: AVESTAN LETTER LE*/
+ RTUNI_ALPHA, /* U+010b2f: AVESTAN LETTER SE*/
+ RTUNI_ALPHA, /* U+010b30: AVESTAN LETTER ZE*/
+ RTUNI_ALPHA, /* U+010b31: AVESTAN LETTER SHE*/
+ RTUNI_ALPHA, /* U+010b32: AVESTAN LETTER ZHE*/
+ RTUNI_ALPHA, /* U+010b33: AVESTAN LETTER SHYE*/
+ RTUNI_ALPHA, /* U+010b34: AVESTAN LETTER SSHE*/
+ RTUNI_ALPHA, /* U+010b35: AVESTAN LETTER HE*/
+ 0, /* U+010b36: */
+ 0, /* U+010b37: */
+ 0, /* U+010b38: */
+ 0, /* U+010b39: AVESTAN ABBREVIATION MARK*/
+ 0, /* U+010b3a: TINY TWO DOTS OVER ONE DOT PUNCTUATION*/
+ 0, /* U+010b3b: SMALL TWO DOTS OVER ONE DOT PUNCTUATION*/
+ 0, /* U+010b3c: LARGE TWO DOTS OVER ONE DOT PUNCTUATION*/
+ 0, /* U+010b3d: LARGE ONE DOT OVER TWO DOTS PUNCTUATION*/
+ 0, /* U+010b3e: LARGE TWO RINGS OVER ONE RING PUNCTUATION*/
+ 0, /* U+010b3f: LARGE ONE RING OVER TWO RINGS PUNCTUATION*/
+ RTUNI_ALPHA, /* U+010b40: INSCRIPTIONAL PARTHIAN LETTER ALEPH*/
+ RTUNI_ALPHA, /* U+010b41: INSCRIPTIONAL PARTHIAN LETTER BETH*/
+ RTUNI_ALPHA, /* U+010b42: INSCRIPTIONAL PARTHIAN LETTER GIMEL*/
+ RTUNI_ALPHA, /* U+010b43: INSCRIPTIONAL PARTHIAN LETTER DALETH*/
+ RTUNI_ALPHA, /* U+010b44: INSCRIPTIONAL PARTHIAN LETTER HE*/
+ RTUNI_ALPHA, /* U+010b45: INSCRIPTIONAL PARTHIAN LETTER WAW*/
+ RTUNI_ALPHA, /* U+010b46: INSCRIPTIONAL PARTHIAN LETTER ZAYIN*/
+ RTUNI_ALPHA, /* U+010b47: INSCRIPTIONAL PARTHIAN LETTER HETH*/
+ RTUNI_ALPHA, /* U+010b48: INSCRIPTIONAL PARTHIAN LETTER TETH*/
+ RTUNI_ALPHA, /* U+010b49: INSCRIPTIONAL PARTHIAN LETTER YODH*/
+ RTUNI_ALPHA, /* U+010b4a: INSCRIPTIONAL PARTHIAN LETTER KAPH*/
+ RTUNI_ALPHA, /* U+010b4b: INSCRIPTIONAL PARTHIAN LETTER LAMEDH*/
+ RTUNI_ALPHA, /* U+010b4c: INSCRIPTIONAL PARTHIAN LETTER MEM*/
+ RTUNI_ALPHA, /* U+010b4d: INSCRIPTIONAL PARTHIAN LETTER NUN*/
+ RTUNI_ALPHA, /* U+010b4e: INSCRIPTIONAL PARTHIAN LETTER SAMEKH*/
+ RTUNI_ALPHA, /* U+010b4f: INSCRIPTIONAL PARTHIAN LETTER AYIN*/
+ RTUNI_ALPHA, /* U+010b50: INSCRIPTIONAL PARTHIAN LETTER PE*/
+ RTUNI_ALPHA, /* U+010b51: INSCRIPTIONAL PARTHIAN LETTER SADHE*/
+ RTUNI_ALPHA, /* U+010b52: INSCRIPTIONAL PARTHIAN LETTER QOPH*/
+ RTUNI_ALPHA, /* U+010b53: INSCRIPTIONAL PARTHIAN LETTER RESH*/
+ RTUNI_ALPHA, /* U+010b54: INSCRIPTIONAL PARTHIAN LETTER SHIN*/
+ RTUNI_ALPHA, /* U+010b55: INSCRIPTIONAL PARTHIAN LETTER TAW*/
+ 0, /* U+010b56: */
+ 0, /* U+010b57: */
+ 0, /* U+010b58: INSCRIPTIONAL PARTHIAN NUMBER ONE*/
+ 0, /* U+010b59: INSCRIPTIONAL PARTHIAN NUMBER TWO*/
+ 0, /* U+010b5a: INSCRIPTIONAL PARTHIAN NUMBER THREE*/
+ 0, /* U+010b5b: INSCRIPTIONAL PARTHIAN NUMBER FOUR*/
+ 0, /* U+010b5c: INSCRIPTIONAL PARTHIAN NUMBER TEN*/
+ 0, /* U+010b5d: INSCRIPTIONAL PARTHIAN NUMBER TWENTY*/
+ 0, /* U+010b5e: INSCRIPTIONAL PARTHIAN NUMBER ONE HUNDRED*/
+ 0, /* U+010b5f: INSCRIPTIONAL PARTHIAN NUMBER ONE THOUSAND*/
+ RTUNI_ALPHA, /* U+010b60: INSCRIPTIONAL PAHLAVI LETTER ALEPH*/
+ RTUNI_ALPHA, /* U+010b61: INSCRIPTIONAL PAHLAVI LETTER BETH*/
+ RTUNI_ALPHA, /* U+010b62: INSCRIPTIONAL PAHLAVI LETTER GIMEL*/
+ RTUNI_ALPHA, /* U+010b63: INSCRIPTIONAL PAHLAVI LETTER DALETH*/
+ RTUNI_ALPHA, /* U+010b64: INSCRIPTIONAL PAHLAVI LETTER HE*/
+ RTUNI_ALPHA, /* U+010b65: INSCRIPTIONAL PAHLAVI LETTER WAW-AYIN-RESH*/
+ RTUNI_ALPHA, /* U+010b66: INSCRIPTIONAL PAHLAVI LETTER ZAYIN*/
+ RTUNI_ALPHA, /* U+010b67: INSCRIPTIONAL PAHLAVI LETTER HETH*/
+ RTUNI_ALPHA, /* U+010b68: INSCRIPTIONAL PAHLAVI LETTER TETH*/
+ RTUNI_ALPHA, /* U+010b69: INSCRIPTIONAL PAHLAVI LETTER YODH*/
+ RTUNI_ALPHA, /* U+010b6a: INSCRIPTIONAL PAHLAVI LETTER KAPH*/
+ RTUNI_ALPHA, /* U+010b6b: INSCRIPTIONAL PAHLAVI LETTER LAMEDH*/
+ RTUNI_ALPHA, /* U+010b6c: INSCRIPTIONAL PAHLAVI LETTER MEM-QOPH*/
+ RTUNI_ALPHA, /* U+010b6d: INSCRIPTIONAL PAHLAVI LETTER NUN*/
+ RTUNI_ALPHA, /* U+010b6e: INSCRIPTIONAL PAHLAVI LETTER SAMEKH*/
+ RTUNI_ALPHA, /* U+010b6f: INSCRIPTIONAL PAHLAVI LETTER PE*/
+ RTUNI_ALPHA, /* U+010b70: INSCRIPTIONAL PAHLAVI LETTER SADHE*/
+ RTUNI_ALPHA, /* U+010b71: INSCRIPTIONAL PAHLAVI LETTER SHIN*/
+ RTUNI_ALPHA, /* U+010b72: INSCRIPTIONAL PAHLAVI LETTER TAW*/
+ 0, /* U+010b73: */
+ 0, /* U+010b74: */
+ 0, /* U+010b75: */
+ 0, /* U+010b76: */
+ 0, /* U+010b77: */
+ 0, /* U+010b78: INSCRIPTIONAL PAHLAVI NUMBER ONE*/
+ 0, /* U+010b79: INSCRIPTIONAL PAHLAVI NUMBER TWO*/
+ 0, /* U+010b7a: INSCRIPTIONAL PAHLAVI NUMBER THREE*/
+ 0, /* U+010b7b: INSCRIPTIONAL PAHLAVI NUMBER FOUR*/
+ 0, /* U+010b7c: INSCRIPTIONAL PAHLAVI NUMBER TEN*/
+ 0, /* U+010b7d: INSCRIPTIONAL PAHLAVI NUMBER TWENTY*/
+ 0, /* U+010b7e: INSCRIPTIONAL PAHLAVI NUMBER ONE HUNDRED*/
+ 0, /* U+010b7f: INSCRIPTIONAL PAHLAVI NUMBER ONE THOUSAND*/
+ 0, /* U+010b80: */
+ 0, /* U+010b81: */
+ 0, /* U+010b82: */
+ 0, /* U+010b83: */
+ 0, /* U+010b84: */
+ 0, /* U+010b85: */
+ 0, /* U+010b86: */
+ 0, /* U+010b87: */
+ 0, /* U+010b88: */
+ 0, /* U+010b89: */
+ 0, /* U+010b8a: */
+ 0, /* U+010b8b: */
+ 0, /* U+010b8c: */
+ 0, /* U+010b8d: */
+ 0, /* U+010b8e: */
+ 0, /* U+010b8f: */
+ 0, /* U+010b90: */
+ 0, /* U+010b91: */
+ 0, /* U+010b92: */
+ 0, /* U+010b93: */
+ 0, /* U+010b94: */
+ 0, /* U+010b95: */
+ 0, /* U+010b96: */
+ 0, /* U+010b97: */
+ 0, /* U+010b98: */
+ 0, /* U+010b99: */
+ 0, /* U+010b9a: */
+ 0, /* U+010b9b: */
+ 0, /* U+010b9c: */
+ 0, /* U+010b9d: */
+ 0, /* U+010b9e: */
+ 0, /* U+010b9f: */
+ 0, /* U+010ba0: */
+ 0, /* U+010ba1: */
+ 0, /* U+010ba2: */
+ 0, /* U+010ba3: */
+ 0, /* U+010ba4: */
+ 0, /* U+010ba5: */
+ 0, /* U+010ba6: */
+ 0, /* U+010ba7: */
+ 0, /* U+010ba8: */
+ 0, /* U+010ba9: */
+ 0, /* U+010baa: */
+ 0, /* U+010bab: */
+ 0, /* U+010bac: */
+ 0, /* U+010bad: */
+ 0, /* U+010bae: */
+ 0, /* U+010baf: */
+ 0, /* U+010bb0: */
+ 0, /* U+010bb1: */
+ 0, /* U+010bb2: */
+ 0, /* U+010bb3: */
+ 0, /* U+010bb4: */
+ 0, /* U+010bb5: */
+ 0, /* U+010bb6: */
+ 0, /* U+010bb7: */
+ 0, /* U+010bb8: */
+ 0, /* U+010bb9: */
+ 0, /* U+010bba: */
+ 0, /* U+010bbb: */
+ 0, /* U+010bbc: */
+ 0, /* U+010bbd: */
+ 0, /* U+010bbe: */
+ 0, /* U+010bbf: */
+ 0, /* U+010bc0: */
+ 0, /* U+010bc1: */
+ 0, /* U+010bc2: */
+ 0, /* U+010bc3: */
+ 0, /* U+010bc4: */
+ 0, /* U+010bc5: */
+ 0, /* U+010bc6: */
+ 0, /* U+010bc7: */
+ 0, /* U+010bc8: */
+ 0, /* U+010bc9: */
+ 0, /* U+010bca: */
+ 0, /* U+010bcb: */
+ 0, /* U+010bcc: */
+ 0, /* U+010bcd: */
+ 0, /* U+010bce: */
+ 0, /* U+010bcf: */
+ 0, /* U+010bd0: */
+ 0, /* U+010bd1: */
+ 0, /* U+010bd2: */
+ 0, /* U+010bd3: */
+ 0, /* U+010bd4: */
+ 0, /* U+010bd5: */
+ 0, /* U+010bd6: */
+ 0, /* U+010bd7: */
+ 0, /* U+010bd8: */
+ 0, /* U+010bd9: */
+ 0, /* U+010bda: */
+ 0, /* U+010bdb: */
+ 0, /* U+010bdc: */
+ 0, /* U+010bdd: */
+ 0, /* U+010bde: */
+ 0, /* U+010bdf: */
+ 0, /* U+010be0: */
+ 0, /* U+010be1: */
+ 0, /* U+010be2: */
+ 0, /* U+010be3: */
+ 0, /* U+010be4: */
+ 0, /* U+010be5: */
+ 0, /* U+010be6: */
+ 0, /* U+010be7: */
+ 0, /* U+010be8: */
+ 0, /* U+010be9: */
+ 0, /* U+010bea: */
+ 0, /* U+010beb: */
+ 0, /* U+010bec: */
+ 0, /* U+010bed: */
+ 0, /* U+010bee: */
+ 0, /* U+010bef: */
+ 0, /* U+010bf0: */
+ 0, /* U+010bf1: */
+ 0, /* U+010bf2: */
+ 0, /* U+010bf3: */
+ 0, /* U+010bf4: */
+ 0, /* U+010bf5: */
+ 0, /* U+010bf6: */
+ 0, /* U+010bf7: */
+ 0, /* U+010bf8: */
+ 0, /* U+010bf9: */
+ 0, /* U+010bfa: */
+ 0, /* U+010bfb: */
+ 0, /* U+010bfc: */
+ 0, /* U+010bfd: */
+ 0, /* U+010bfe: */
+ 0, /* U+010bff: */
+ RTUNI_ALPHA, /* U+010c00: OLD TURKIC LETTER ORKHON A*/
+ RTUNI_ALPHA, /* U+010c01: OLD TURKIC LETTER YENISEI A*/
+ RTUNI_ALPHA, /* U+010c02: OLD TURKIC LETTER YENISEI AE*/
+ RTUNI_ALPHA, /* U+010c03: OLD TURKIC LETTER ORKHON I*/
+ RTUNI_ALPHA, /* U+010c04: OLD TURKIC LETTER YENISEI I*/
+ RTUNI_ALPHA, /* U+010c05: OLD TURKIC LETTER YENISEI E*/
+ RTUNI_ALPHA, /* U+010c06: OLD TURKIC LETTER ORKHON O*/
+ RTUNI_ALPHA, /* U+010c07: OLD TURKIC LETTER ORKHON OE*/
+ RTUNI_ALPHA, /* U+010c08: OLD TURKIC LETTER YENISEI OE*/
+ RTUNI_ALPHA, /* U+010c09: OLD TURKIC LETTER ORKHON AB*/
+ RTUNI_ALPHA, /* U+010c0a: OLD TURKIC LETTER YENISEI AB*/
+ RTUNI_ALPHA, /* U+010c0b: OLD TURKIC LETTER ORKHON AEB*/
+ RTUNI_ALPHA, /* U+010c0c: OLD TURKIC LETTER YENISEI AEB*/
+ RTUNI_ALPHA, /* U+010c0d: OLD TURKIC LETTER ORKHON AG*/
+ RTUNI_ALPHA, /* U+010c0e: OLD TURKIC LETTER YENISEI AG*/
+ RTUNI_ALPHA, /* U+010c0f: OLD TURKIC LETTER ORKHON AEG*/
+ RTUNI_ALPHA, /* U+010c10: OLD TURKIC LETTER YENISEI AEG*/
+ RTUNI_ALPHA, /* U+010c11: OLD TURKIC LETTER ORKHON AD*/
+ RTUNI_ALPHA, /* U+010c12: OLD TURKIC LETTER YENISEI AD*/
+ RTUNI_ALPHA, /* U+010c13: OLD TURKIC LETTER ORKHON AED*/
+ RTUNI_ALPHA, /* U+010c14: OLD TURKIC LETTER ORKHON EZ*/
+ RTUNI_ALPHA, /* U+010c15: OLD TURKIC LETTER YENISEI EZ*/
+ RTUNI_ALPHA, /* U+010c16: OLD TURKIC LETTER ORKHON AY*/
+ RTUNI_ALPHA, /* U+010c17: OLD TURKIC LETTER YENISEI AY*/
+ RTUNI_ALPHA, /* U+010c18: OLD TURKIC LETTER ORKHON AEY*/
+ RTUNI_ALPHA, /* U+010c19: OLD TURKIC LETTER YENISEI AEY*/
+ RTUNI_ALPHA, /* U+010c1a: OLD TURKIC LETTER ORKHON AEK*/
+ RTUNI_ALPHA, /* U+010c1b: OLD TURKIC LETTER YENISEI AEK*/
+ RTUNI_ALPHA, /* U+010c1c: OLD TURKIC LETTER ORKHON OEK*/
+ RTUNI_ALPHA, /* U+010c1d: OLD TURKIC LETTER YENISEI OEK*/
+ RTUNI_ALPHA, /* U+010c1e: OLD TURKIC LETTER ORKHON AL*/
+ RTUNI_ALPHA, /* U+010c1f: OLD TURKIC LETTER YENISEI AL*/
+ RTUNI_ALPHA, /* U+010c20: OLD TURKIC LETTER ORKHON AEL*/
+ RTUNI_ALPHA, /* U+010c21: OLD TURKIC LETTER ORKHON ELT*/
+ RTUNI_ALPHA, /* U+010c22: OLD TURKIC LETTER ORKHON EM*/
+ RTUNI_ALPHA, /* U+010c23: OLD TURKIC LETTER ORKHON AN*/
+ RTUNI_ALPHA, /* U+010c24: OLD TURKIC LETTER ORKHON AEN*/
+ RTUNI_ALPHA, /* U+010c25: OLD TURKIC LETTER YENISEI AEN*/
+ RTUNI_ALPHA, /* U+010c26: OLD TURKIC LETTER ORKHON ENT*/
+ RTUNI_ALPHA, /* U+010c27: OLD TURKIC LETTER YENISEI ENT*/
+ RTUNI_ALPHA, /* U+010c28: OLD TURKIC LETTER ORKHON ENC*/
+ RTUNI_ALPHA, /* U+010c29: OLD TURKIC LETTER YENISEI ENC*/
+ RTUNI_ALPHA, /* U+010c2a: OLD TURKIC LETTER ORKHON ENY*/
+ RTUNI_ALPHA, /* U+010c2b: OLD TURKIC LETTER YENISEI ENY*/
+ RTUNI_ALPHA, /* U+010c2c: OLD TURKIC LETTER YENISEI ANG*/
+ RTUNI_ALPHA, /* U+010c2d: OLD TURKIC LETTER ORKHON ENG*/
+ RTUNI_ALPHA, /* U+010c2e: OLD TURKIC LETTER YENISEI AENG*/
+ RTUNI_ALPHA, /* U+010c2f: OLD TURKIC LETTER ORKHON EP*/
+ RTUNI_ALPHA, /* U+010c30: OLD TURKIC LETTER ORKHON OP*/
+ RTUNI_ALPHA, /* U+010c31: OLD TURKIC LETTER ORKHON IC*/
+ RTUNI_ALPHA, /* U+010c32: OLD TURKIC LETTER ORKHON EC*/
+ RTUNI_ALPHA, /* U+010c33: OLD TURKIC LETTER YENISEI EC*/
+ RTUNI_ALPHA, /* U+010c34: OLD TURKIC LETTER ORKHON AQ*/
+ RTUNI_ALPHA, /* U+010c35: OLD TURKIC LETTER YENISEI AQ*/
+ RTUNI_ALPHA, /* U+010c36: OLD TURKIC LETTER ORKHON IQ*/
+ RTUNI_ALPHA, /* U+010c37: OLD TURKIC LETTER YENISEI IQ*/
+ RTUNI_ALPHA, /* U+010c38: OLD TURKIC LETTER ORKHON OQ*/
+ RTUNI_ALPHA, /* U+010c39: OLD TURKIC LETTER YENISEI OQ*/
+ RTUNI_ALPHA, /* U+010c3a: OLD TURKIC LETTER ORKHON AR*/
+ RTUNI_ALPHA, /* U+010c3b: OLD TURKIC LETTER YENISEI AR*/
+ RTUNI_ALPHA, /* U+010c3c: OLD TURKIC LETTER ORKHON AER*/
+ RTUNI_ALPHA, /* U+010c3d: OLD TURKIC LETTER ORKHON AS*/
+ RTUNI_ALPHA, /* U+010c3e: OLD TURKIC LETTER ORKHON AES*/
+ RTUNI_ALPHA, /* U+010c3f: OLD TURKIC LETTER ORKHON ASH*/
+ RTUNI_ALPHA, /* U+010c40: OLD TURKIC LETTER YENISEI ASH*/
+ RTUNI_ALPHA, /* U+010c41: OLD TURKIC LETTER ORKHON ESH*/
+ RTUNI_ALPHA, /* U+010c42: OLD TURKIC LETTER YENISEI ESH*/
+ RTUNI_ALPHA, /* U+010c43: OLD TURKIC LETTER ORKHON AT*/
+ RTUNI_ALPHA, /* U+010c44: OLD TURKIC LETTER YENISEI AT*/
+ RTUNI_ALPHA, /* U+010c45: OLD TURKIC LETTER ORKHON AET*/
+ RTUNI_ALPHA, /* U+010c46: OLD TURKIC LETTER YENISEI AET*/
+ RTUNI_ALPHA, /* U+010c47: OLD TURKIC LETTER ORKHON OT*/
+ RTUNI_ALPHA, /* U+010c48: OLD TURKIC LETTER ORKHON BASH*/
+ 0, /* U+010c49: */
+ 0, /* U+010c4a: */
+ 0, /* U+010c4b: */
+ 0, /* U+010c4c: */
+ 0, /* U+010c4d: */
+ 0, /* U+010c4e: */
+ 0, /* U+010c4f: */
+ 0, /* U+010c50: */
+ 0, /* U+010c51: */
+ 0, /* U+010c52: */
+ 0, /* U+010c53: */
+ 0, /* U+010c54: */
+ 0, /* U+010c55: */
+ 0, /* U+010c56: */
+ 0, /* U+010c57: */
+ 0, /* U+010c58: */
+ 0, /* U+010c59: */
+ 0, /* U+010c5a: */
+ 0, /* U+010c5b: */
+ 0, /* U+010c5c: */
+ 0, /* U+010c5d: */
+ 0, /* U+010c5e: */
+ 0, /* U+010c5f: */
+ 0, /* U+010c60: */
+ 0, /* U+010c61: */
+ 0, /* U+010c62: */
+ 0, /* U+010c63: */
+ 0, /* U+010c64: */
+ 0, /* U+010c65: */
+ 0, /* U+010c66: */
+ 0, /* U+010c67: */
+ 0, /* U+010c68: */
+ 0, /* U+010c69: */
+ 0, /* U+010c6a: */
+ 0, /* U+010c6b: */
+ 0, /* U+010c6c: */
+ 0, /* U+010c6d: */
+ 0, /* U+010c6e: */
+ 0, /* U+010c6f: */
+ 0, /* U+010c70: */
+ 0, /* U+010c71: */
+ 0, /* U+010c72: */
+ 0, /* U+010c73: */
+ 0, /* U+010c74: */
+ 0, /* U+010c75: */
+ 0, /* U+010c76: */
+ 0, /* U+010c77: */
+ 0, /* U+010c78: */
+ 0, /* U+010c79: */
+ 0, /* U+010c7a: */
+ 0, /* U+010c7b: */
+ 0, /* U+010c7c: */
+ 0, /* U+010c7d: */
+ 0, /* U+010c7e: */
+ 0, /* U+010c7f: */
+ 0, /* U+010c80: */
+ 0, /* U+010c81: */
+ 0, /* U+010c82: */
+ 0, /* U+010c83: */
+ 0, /* U+010c84: */
+ 0, /* U+010c85: */
+ 0, /* U+010c86: */
+ 0, /* U+010c87: */
+ 0, /* U+010c88: */
+ 0, /* U+010c89: */
+ 0, /* U+010c8a: */
+ 0, /* U+010c8b: */
+ 0, /* U+010c8c: */
+ 0, /* U+010c8d: */
+ 0, /* U+010c8e: */
+ 0, /* U+010c8f: */
+ 0, /* U+010c90: */
+ 0, /* U+010c91: */
+ 0, /* U+010c92: */
+ 0, /* U+010c93: */
+ 0, /* U+010c94: */
+ 0, /* U+010c95: */
+ 0, /* U+010c96: */
+ 0, /* U+010c97: */
+ 0, /* U+010c98: */
+ 0, /* U+010c99: */
+ 0, /* U+010c9a: */
+ 0, /* U+010c9b: */
+ 0, /* U+010c9c: */
+ 0, /* U+010c9d: */
+ 0, /* U+010c9e: */
+ 0, /* U+010c9f: */
+ 0, /* U+010ca0: */
+ 0, /* U+010ca1: */
+ 0, /* U+010ca2: */
+ 0, /* U+010ca3: */
+ 0, /* U+010ca4: */
+ 0, /* U+010ca5: */
+ 0, /* U+010ca6: */
+ 0, /* U+010ca7: */
+ 0, /* U+010ca8: */
+ 0, /* U+010ca9: */
+ 0, /* U+010caa: */
+ 0, /* U+010cab: */
+ 0, /* U+010cac: */
+ 0, /* U+010cad: */
+ 0, /* U+010cae: */
+ 0, /* U+010caf: */
+ 0, /* U+010cb0: */
+ 0, /* U+010cb1: */
+ 0, /* U+010cb2: */
+ 0, /* U+010cb3: */
+ 0, /* U+010cb4: */
+ 0, /* U+010cb5: */
+ 0, /* U+010cb6: */
+ 0, /* U+010cb7: */
+ 0, /* U+010cb8: */
+ 0, /* U+010cb9: */
+ 0, /* U+010cba: */
+ 0, /* U+010cbb: */
+ 0, /* U+010cbc: */
+ 0, /* U+010cbd: */
+ 0, /* U+010cbe: */
+ 0, /* U+010cbf: */
+ 0, /* U+010cc0: */
+ 0, /* U+010cc1: */
+ 0, /* U+010cc2: */
+ 0, /* U+010cc3: */
+ 0, /* U+010cc4: */
+ 0, /* U+010cc5: */
+ 0, /* U+010cc6: */
+ 0, /* U+010cc7: */
+ 0, /* U+010cc8: */
+ 0, /* U+010cc9: */
+ 0, /* U+010cca: */
+ 0, /* U+010ccb: */
+ 0, /* U+010ccc: */
+ 0, /* U+010ccd: */
+ 0, /* U+010cce: */
+ 0, /* U+010ccf: */
+ 0, /* U+010cd0: */
+ 0, /* U+010cd1: */
+ 0, /* U+010cd2: */
+ 0, /* U+010cd3: */
+ 0, /* U+010cd4: */
+ 0, /* U+010cd5: */
+ 0, /* U+010cd6: */
+ 0, /* U+010cd7: */
+ 0, /* U+010cd8: */
+ 0, /* U+010cd9: */
+ 0, /* U+010cda: */
+ 0, /* U+010cdb: */
+ 0, /* U+010cdc: */
+ 0, /* U+010cdd: */
+ 0, /* U+010cde: */
+ 0, /* U+010cdf: */
+ 0, /* U+010ce0: */
+ 0, /* U+010ce1: */
+ 0, /* U+010ce2: */
+ 0, /* U+010ce3: */
+ 0, /* U+010ce4: */
+ 0, /* U+010ce5: */
+ 0, /* U+010ce6: */
+ 0, /* U+010ce7: */
+ 0, /* U+010ce8: */
+ 0, /* U+010ce9: */
+ 0, /* U+010cea: */
+ 0, /* U+010ceb: */
+ 0, /* U+010cec: */
+ 0, /* U+010ced: */
+ 0, /* U+010cee: */
+ 0, /* U+010cef: */
+ 0, /* U+010cf0: */
+ 0, /* U+010cf1: */
+ 0, /* U+010cf2: */
+ 0, /* U+010cf3: */
+ 0, /* U+010cf4: */
+ 0, /* U+010cf5: */
+ 0, /* U+010cf6: */
+ 0, /* U+010cf7: */
+ 0, /* U+010cf8: */
+ 0, /* U+010cf9: */
+ 0, /* U+010cfa: */
+ 0, /* U+010cfb: */
+ 0, /* U+010cfc: */
+ 0, /* U+010cfd: */
+ 0, /* U+010cfe: */
+ 0, /* U+010cff: */
+ 0, /* U+010d00: */
+ 0, /* U+010d01: */
+ 0, /* U+010d02: */
+ 0, /* U+010d03: */
+ 0, /* U+010d04: */
+ 0, /* U+010d05: */
+ 0, /* U+010d06: */
+ 0, /* U+010d07: */
+ 0, /* U+010d08: */
+ 0, /* U+010d09: */
+ 0, /* U+010d0a: */
+ 0, /* U+010d0b: */
+ 0, /* U+010d0c: */
+ 0, /* U+010d0d: */
+ 0, /* U+010d0e: */
+ 0, /* U+010d0f: */
+ 0, /* U+010d10: */
+ 0, /* U+010d11: */
+ 0, /* U+010d12: */
+ 0, /* U+010d13: */
+ 0, /* U+010d14: */
+ 0, /* U+010d15: */
+ 0, /* U+010d16: */
+ 0, /* U+010d17: */
+ 0, /* U+010d18: */
+ 0, /* U+010d19: */
+ 0, /* U+010d1a: */
+ 0, /* U+010d1b: */
+ 0, /* U+010d1c: */
+ 0, /* U+010d1d: */
+ 0, /* U+010d1e: */
+ 0, /* U+010d1f: */
+ 0, /* U+010d20: */
+ 0, /* U+010d21: */
+ 0, /* U+010d22: */
+ 0, /* U+010d23: */
+ 0, /* U+010d24: */
+ 0, /* U+010d25: */
+ 0, /* U+010d26: */
+ 0, /* U+010d27: */
+ 0, /* U+010d28: */
+ 0, /* U+010d29: */
+ 0, /* U+010d2a: */
+ 0, /* U+010d2b: */
+ 0, /* U+010d2c: */
+ 0, /* U+010d2d: */
+ 0, /* U+010d2e: */
+ 0, /* U+010d2f: */
+ 0, /* U+010d30: */
+ 0, /* U+010d31: */
+ 0, /* U+010d32: */
+ 0, /* U+010d33: */
+ 0, /* U+010d34: */
+ 0, /* U+010d35: */
+ 0, /* U+010d36: */
+ 0, /* U+010d37: */
+ 0, /* U+010d38: */
+ 0, /* U+010d39: */
+ 0, /* U+010d3a: */
+ 0, /* U+010d3b: */
+ 0, /* U+010d3c: */
+ 0, /* U+010d3d: */
+ 0, /* U+010d3e: */
+ 0, /* U+010d3f: */
+ 0, /* U+010d40: */
+ 0, /* U+010d41: */
+ 0, /* U+010d42: */
+ 0, /* U+010d43: */
+ 0, /* U+010d44: */
+ 0, /* U+010d45: */
+ 0, /* U+010d46: */
+ 0, /* U+010d47: */
+ 0, /* U+010d48: */
+ 0, /* U+010d49: */
+ 0, /* U+010d4a: */
+ 0, /* U+010d4b: */
+ 0, /* U+010d4c: */
+ 0, /* U+010d4d: */
+ 0, /* U+010d4e: */
+ 0, /* U+010d4f: */
+ 0, /* U+010d50: */
+ 0, /* U+010d51: */
+ 0, /* U+010d52: */
+ 0, /* U+010d53: */
+ 0, /* U+010d54: */
+ 0, /* U+010d55: */
+ 0, /* U+010d56: */
+ 0, /* U+010d57: */
+ 0, /* U+010d58: */
+ 0, /* U+010d59: */
+ 0, /* U+010d5a: */
+ 0, /* U+010d5b: */
+ 0, /* U+010d5c: */
+ 0, /* U+010d5d: */
+ 0, /* U+010d5e: */
+ 0, /* U+010d5f: */
+ 0, /* U+010d60: */
+ 0, /* U+010d61: */
+ 0, /* U+010d62: */
+ 0, /* U+010d63: */
+ 0, /* U+010d64: */
+ 0, /* U+010d65: */
+ 0, /* U+010d66: */
+ 0, /* U+010d67: */
+ 0, /* U+010d68: */
+ 0, /* U+010d69: */
+ 0, /* U+010d6a: */
+ 0, /* U+010d6b: */
+ 0, /* U+010d6c: */
+ 0, /* U+010d6d: */
+ 0, /* U+010d6e: */
+ 0, /* U+010d6f: */
+ 0, /* U+010d70: */
+ 0, /* U+010d71: */
+ 0, /* U+010d72: */
+ 0, /* U+010d73: */
+ 0, /* U+010d74: */
+ 0, /* U+010d75: */
+ 0, /* U+010d76: */
+ 0, /* U+010d77: */
+ 0, /* U+010d78: */
+ 0, /* U+010d79: */
+ 0, /* U+010d7a: */
+ 0, /* U+010d7b: */
+ 0, /* U+010d7c: */
+ 0, /* U+010d7d: */
+ 0, /* U+010d7e: */
+ 0, /* U+010d7f: */
+ 0, /* U+010d80: */
+ 0, /* U+010d81: */
+ 0, /* U+010d82: */
+ 0, /* U+010d83: */
+ 0, /* U+010d84: */
+ 0, /* U+010d85: */
+ 0, /* U+010d86: */
+ 0, /* U+010d87: */
+ 0, /* U+010d88: */
+ 0, /* U+010d89: */
+ 0, /* U+010d8a: */
+ 0, /* U+010d8b: */
+ 0, /* U+010d8c: */
+ 0, /* U+010d8d: */
+ 0, /* U+010d8e: */
+ 0, /* U+010d8f: */
+ 0, /* U+010d90: */
+ 0, /* U+010d91: */
+ 0, /* U+010d92: */
+ 0, /* U+010d93: */
+ 0, /* U+010d94: */
+ 0, /* U+010d95: */
+ 0, /* U+010d96: */
+ 0, /* U+010d97: */
+ 0, /* U+010d98: */
+ 0, /* U+010d99: */
+ 0, /* U+010d9a: */
+ 0, /* U+010d9b: */
+ 0, /* U+010d9c: */
+ 0, /* U+010d9d: */
+ 0, /* U+010d9e: */
+ 0, /* U+010d9f: */
+ 0, /* U+010da0: */
+ 0, /* U+010da1: */
+ 0, /* U+010da2: */
+ 0, /* U+010da3: */
+ 0, /* U+010da4: */
+ 0, /* U+010da5: */
+ 0, /* U+010da6: */
+ 0, /* U+010da7: */
+ 0, /* U+010da8: */
+ 0, /* U+010da9: */
+ 0, /* U+010daa: */
+ 0, /* U+010dab: */
+ 0, /* U+010dac: */
+ 0, /* U+010dad: */
+ 0, /* U+010dae: */
+ 0, /* U+010daf: */
+ 0, /* U+010db0: */
+ 0, /* U+010db1: */
+ 0, /* U+010db2: */
+ 0, /* U+010db3: */
+ 0, /* U+010db4: */
+ 0, /* U+010db5: */
+ 0, /* U+010db6: */
+ 0, /* U+010db7: */
+ 0, /* U+010db8: */
+ 0, /* U+010db9: */
+ 0, /* U+010dba: */
+ 0, /* U+010dbb: */
+ 0, /* U+010dbc: */
+ 0, /* U+010dbd: */
+ 0, /* U+010dbe: */
+ 0, /* U+010dbf: */
+ 0, /* U+010dc0: */
+ 0, /* U+010dc1: */
+ 0, /* U+010dc2: */
+ 0, /* U+010dc3: */
+ 0, /* U+010dc4: */
+ 0, /* U+010dc5: */
+ 0, /* U+010dc6: */
+ 0, /* U+010dc7: */
+ 0, /* U+010dc8: */
+ 0, /* U+010dc9: */
+ 0, /* U+010dca: */
+ 0, /* U+010dcb: */
+ 0, /* U+010dcc: */
+ 0, /* U+010dcd: */
+ 0, /* U+010dce: */
+ 0, /* U+010dcf: */
+ 0, /* U+010dd0: */
+ 0, /* U+010dd1: */
+ 0, /* U+010dd2: */
+ 0, /* U+010dd3: */
+ 0, /* U+010dd4: */
+ 0, /* U+010dd5: */
+ 0, /* U+010dd6: */
+ 0, /* U+010dd7: */
+ 0, /* U+010dd8: */
+ 0, /* U+010dd9: */
+ 0, /* U+010dda: */
+ 0, /* U+010ddb: */
+ 0, /* U+010ddc: */
+ 0, /* U+010ddd: */
+ 0, /* U+010dde: */
+ 0, /* U+010ddf: */
+ 0, /* U+010de0: */
+ 0, /* U+010de1: */
+ 0, /* U+010de2: */
+ 0, /* U+010de3: */
+ 0, /* U+010de4: */
+ 0, /* U+010de5: */
+ 0, /* U+010de6: */
+ 0, /* U+010de7: */
+ 0, /* U+010de8: */
+ 0, /* U+010de9: */
+ 0, /* U+010dea: */
+ 0, /* U+010deb: */
+ 0, /* U+010dec: */
+ 0, /* U+010ded: */
+ 0, /* U+010dee: */
+ 0, /* U+010def: */
+ 0, /* U+010df0: */
+ 0, /* U+010df1: */
+ 0, /* U+010df2: */
+ 0, /* U+010df3: */
+ 0, /* U+010df4: */
+ 0, /* U+010df5: */
+ 0, /* U+010df6: */
+ 0, /* U+010df7: */
+ 0, /* U+010df8: */
+ 0, /* U+010df9: */
+ 0, /* U+010dfa: */
+ 0, /* U+010dfb: */
+ 0, /* U+010dfc: */
+ 0, /* U+010dfd: */
+ 0, /* U+010dfe: */
+ 0, /* U+010dff: */
+ 0, /* U+010e00: */
+ 0, /* U+010e01: */
+ 0, /* U+010e02: */
+ 0, /* U+010e03: */
+ 0, /* U+010e04: */
+ 0, /* U+010e05: */
+ 0, /* U+010e06: */
+ 0, /* U+010e07: */
+ 0, /* U+010e08: */
+ 0, /* U+010e09: */
+ 0, /* U+010e0a: */
+ 0, /* U+010e0b: */
+ 0, /* U+010e0c: */
+ 0, /* U+010e0d: */
+ 0, /* U+010e0e: */
+ 0, /* U+010e0f: */
+ 0, /* U+010e10: */
+ 0, /* U+010e11: */
+ 0, /* U+010e12: */
+ 0, /* U+010e13: */
+ 0, /* U+010e14: */
+ 0, /* U+010e15: */
+ 0, /* U+010e16: */
+ 0, /* U+010e17: */
+ 0, /* U+010e18: */
+ 0, /* U+010e19: */
+ 0, /* U+010e1a: */
+ 0, /* U+010e1b: */
+ 0, /* U+010e1c: */
+ 0, /* U+010e1d: */
+ 0, /* U+010e1e: */
+ 0, /* U+010e1f: */
+ 0, /* U+010e20: */
+ 0, /* U+010e21: */
+ 0, /* U+010e22: */
+ 0, /* U+010e23: */
+ 0, /* U+010e24: */
+ 0, /* U+010e25: */
+ 0, /* U+010e26: */
+ 0, /* U+010e27: */
+ 0, /* U+010e28: */
+ 0, /* U+010e29: */
+ 0, /* U+010e2a: */
+ 0, /* U+010e2b: */
+ 0, /* U+010e2c: */
+ 0, /* U+010e2d: */
+ 0, /* U+010e2e: */
+ 0, /* U+010e2f: */
+ 0, /* U+010e30: */
+ 0, /* U+010e31: */
+ 0, /* U+010e32: */
+ 0, /* U+010e33: */
+ 0, /* U+010e34: */
+ 0, /* U+010e35: */
+ 0, /* U+010e36: */
+ 0, /* U+010e37: */
+ 0, /* U+010e38: */
+ 0, /* U+010e39: */
+ 0, /* U+010e3a: */
+ 0, /* U+010e3b: */
+ 0, /* U+010e3c: */
+ 0, /* U+010e3d: */
+ 0, /* U+010e3e: */
+ 0, /* U+010e3f: */
+ 0, /* U+010e40: */
+ 0, /* U+010e41: */
+ 0, /* U+010e42: */
+ 0, /* U+010e43: */
+ 0, /* U+010e44: */
+ 0, /* U+010e45: */
+ 0, /* U+010e46: */
+ 0, /* U+010e47: */
+ 0, /* U+010e48: */
+ 0, /* U+010e49: */
+ 0, /* U+010e4a: */
+ 0, /* U+010e4b: */
+ 0, /* U+010e4c: */
+ 0, /* U+010e4d: */
+ 0, /* U+010e4e: */
+ 0, /* U+010e4f: */
+ 0, /* U+010e50: */
+ 0, /* U+010e51: */
+ 0, /* U+010e52: */
+ 0, /* U+010e53: */
+ 0, /* U+010e54: */
+ 0, /* U+010e55: */
+ 0, /* U+010e56: */
+ 0, /* U+010e57: */
+ 0, /* U+010e58: */
+ 0, /* U+010e59: */
+ 0, /* U+010e5a: */
+ 0, /* U+010e5b: */
+ 0, /* U+010e5c: */
+ 0, /* U+010e5d: */
+ 0, /* U+010e5e: */
+ 0, /* U+010e5f: */
+ 0, /* U+010e60: RUMI DIGIT ONE*/
+ 0, /* U+010e61: RUMI DIGIT TWO*/
+ 0, /* U+010e62: RUMI DIGIT THREE*/
+ 0, /* U+010e63: RUMI DIGIT FOUR*/
+ 0, /* U+010e64: RUMI DIGIT FIVE*/
+ 0, /* U+010e65: RUMI DIGIT SIX*/
+ 0, /* U+010e66: RUMI DIGIT SEVEN*/
+ 0, /* U+010e67: RUMI DIGIT EIGHT*/
+ 0, /* U+010e68: RUMI DIGIT NINE*/
+ 0, /* U+010e69: RUMI NUMBER TEN*/
+ 0, /* U+010e6a: RUMI NUMBER TWENTY*/
+ 0, /* U+010e6b: RUMI NUMBER THIRTY*/
+ 0, /* U+010e6c: RUMI NUMBER FORTY*/
+ 0, /* U+010e6d: RUMI NUMBER FIFTY*/
+ 0, /* U+010e6e: RUMI NUMBER SIXTY*/
+ 0, /* U+010e6f: RUMI NUMBER SEVENTY*/
+ 0, /* U+010e70: RUMI NUMBER EIGHTY*/
+ 0, /* U+010e71: RUMI NUMBER NINETY*/
+ 0, /* U+010e72: RUMI NUMBER ONE HUNDRED*/
+ 0, /* U+010e73: RUMI NUMBER TWO HUNDRED*/
+ 0, /* U+010e74: RUMI NUMBER THREE HUNDRED*/
+ 0, /* U+010e75: RUMI NUMBER FOUR HUNDRED*/
+ 0, /* U+010e76: RUMI NUMBER FIVE HUNDRED*/
+ 0, /* U+010e77: RUMI NUMBER SIX HUNDRED*/
+ 0, /* U+010e78: RUMI NUMBER SEVEN HUNDRED*/
+ 0, /* U+010e79: RUMI NUMBER EIGHT HUNDRED*/
+ 0, /* U+010e7a: RUMI NUMBER NINE HUNDRED*/
+ 0, /* U+010e7b: RUMI FRACTION ONE HALF*/
+ 0, /* U+010e7c: RUMI FRACTION ONE QUARTER*/
+ 0, /* U+010e7d: RUMI FRACTION ONE THIRD*/
+ 0, /* U+010e7e: RUMI FRACTION TWO THIRDS*/
+ 0, /* U+010e7f: */
+ 0, /* U+010e80: */
+ 0, /* U+010e81: */
+ 0, /* U+010e82: */
+ 0, /* U+010e83: */
+ 0, /* U+010e84: */
+ 0, /* U+010e85: */
+ 0, /* U+010e86: */
+ 0, /* U+010e87: */
+ 0, /* U+010e88: */
+ 0, /* U+010e89: */
+ 0, /* U+010e8a: */
+ 0, /* U+010e8b: */
+ 0, /* U+010e8c: */
+ 0, /* U+010e8d: */
+ 0, /* U+010e8e: */
+ 0, /* U+010e8f: */
+ 0, /* U+010e90: */
+ 0, /* U+010e91: */
+ 0, /* U+010e92: */
+ 0, /* U+010e93: */
+ 0, /* U+010e94: */
+ 0, /* U+010e95: */
+ 0, /* U+010e96: */
+ 0, /* U+010e97: */
+ 0, /* U+010e98: */
+ 0, /* U+010e99: */
+ 0, /* U+010e9a: */
+ 0, /* U+010e9b: */
+ 0, /* U+010e9c: */
+ 0, /* U+010e9d: */
+ 0, /* U+010e9e: */
+ 0, /* U+010e9f: */
+ 0, /* U+010ea0: */
+ 0, /* U+010ea1: */
+ 0, /* U+010ea2: */
+ 0, /* U+010ea3: */
+ 0, /* U+010ea4: */
+ 0, /* U+010ea5: */
+ 0, /* U+010ea6: */
+ 0, /* U+010ea7: */
+ 0, /* U+010ea8: */
+ 0, /* U+010ea9: */
+ 0, /* U+010eaa: */
+ 0, /* U+010eab: */
+ 0, /* U+010eac: */
+ 0, /* U+010ead: */
+ 0, /* U+010eae: */
+ 0, /* U+010eaf: */
+ 0, /* U+010eb0: */
+ 0, /* U+010eb1: */
+ 0, /* U+010eb2: */
+ 0, /* U+010eb3: */
+ 0, /* U+010eb4: */
+ 0, /* U+010eb5: */
+ 0, /* U+010eb6: */
+ 0, /* U+010eb7: */
+ 0, /* U+010eb8: */
+ 0, /* U+010eb9: */
+ 0, /* U+010eba: */
+ 0, /* U+010ebb: */
+ 0, /* U+010ebc: */
+ 0, /* U+010ebd: */
+ 0, /* U+010ebe: */
+ 0, /* U+010ebf: */
+ 0, /* U+010ec0: */
+ 0, /* U+010ec1: */
+ 0, /* U+010ec2: */
+ 0, /* U+010ec3: */
+ 0, /* U+010ec4: */
+ 0, /* U+010ec5: */
+ 0, /* U+010ec6: */
+ 0, /* U+010ec7: */
+ 0, /* U+010ec8: */
+ 0, /* U+010ec9: */
+ 0, /* U+010eca: */
+ 0, /* U+010ecb: */
+ 0, /* U+010ecc: */
+ 0, /* U+010ecd: */
+ 0, /* U+010ece: */
+ 0, /* U+010ecf: */
+ 0, /* U+010ed0: */
+ 0, /* U+010ed1: */
+ 0, /* U+010ed2: */
+ 0, /* U+010ed3: */
+ 0, /* U+010ed4: */
+ 0, /* U+010ed5: */
+ 0, /* U+010ed6: */
+ 0, /* U+010ed7: */
+ 0, /* U+010ed8: */
+ 0, /* U+010ed9: */
+ 0, /* U+010eda: */
+ 0, /* U+010edb: */
+ 0, /* U+010edc: */
+ 0, /* U+010edd: */
+ 0, /* U+010ede: */
+ 0, /* U+010edf: */
+ 0, /* U+010ee0: */
+ 0, /* U+010ee1: */
+ 0, /* U+010ee2: */
+ 0, /* U+010ee3: */
+ 0, /* U+010ee4: */
+ 0, /* U+010ee5: */
+ 0, /* U+010ee6: */
+ 0, /* U+010ee7: */
+ 0, /* U+010ee8: */
+ 0, /* U+010ee9: */
+ 0, /* U+010eea: */
+ 0, /* U+010eeb: */
+ 0, /* U+010eec: */
+ 0, /* U+010eed: */
+ 0, /* U+010eee: */
+ 0, /* U+010eef: */
+ 0, /* U+010ef0: */
+ 0, /* U+010ef1: */
+ 0, /* U+010ef2: */
+ 0, /* U+010ef3: */
+ 0, /* U+010ef4: */
+ 0, /* U+010ef5: */
+ 0, /* U+010ef6: */
+ 0, /* U+010ef7: */
+ 0, /* U+010ef8: */
+ 0, /* U+010ef9: */
+ 0, /* U+010efa: */
+ 0, /* U+010efb: */
+ 0, /* U+010efc: */
+ 0, /* U+010efd: */
+ 0, /* U+010efe: */
+ 0, /* U+010eff: */
+ 0, /* U+010f00: */
+ 0, /* U+010f01: */
+ 0, /* U+010f02: */
+ 0, /* U+010f03: */
+ 0, /* U+010f04: */
+ 0, /* U+010f05: */
+ 0, /* U+010f06: */
+ 0, /* U+010f07: */
+ 0, /* U+010f08: */
+ 0, /* U+010f09: */
+ 0, /* U+010f0a: */
+ 0, /* U+010f0b: */
+ 0, /* U+010f0c: */
+ 0, /* U+010f0d: */
+ 0, /* U+010f0e: */
+ 0, /* U+010f0f: */
+ 0, /* U+010f10: */
+ 0, /* U+010f11: */
+ 0, /* U+010f12: */
+ 0, /* U+010f13: */
+ 0, /* U+010f14: */
+ 0, /* U+010f15: */
+ 0, /* U+010f16: */
+ 0, /* U+010f17: */
+ 0, /* U+010f18: */
+ 0, /* U+010f19: */
+ 0, /* U+010f1a: */
+ 0, /* U+010f1b: */
+ 0, /* U+010f1c: */
+ 0, /* U+010f1d: */
+ 0, /* U+010f1e: */
+ 0, /* U+010f1f: */
+ 0, /* U+010f20: */
+ 0, /* U+010f21: */
+ 0, /* U+010f22: */
+ 0, /* U+010f23: */
+ 0, /* U+010f24: */
+ 0, /* U+010f25: */
+ 0, /* U+010f26: */
+ 0, /* U+010f27: */
+ 0, /* U+010f28: */
+ 0, /* U+010f29: */
+ 0, /* U+010f2a: */
+ 0, /* U+010f2b: */
+ 0, /* U+010f2c: */
+ 0, /* U+010f2d: */
+ 0, /* U+010f2e: */
+ 0, /* U+010f2f: */
+ 0, /* U+010f30: */
+ 0, /* U+010f31: */
+ 0, /* U+010f32: */
+ 0, /* U+010f33: */
+ 0, /* U+010f34: */
+ 0, /* U+010f35: */
+ 0, /* U+010f36: */
+ 0, /* U+010f37: */
+ 0, /* U+010f38: */
+ 0, /* U+010f39: */
+ 0, /* U+010f3a: */
+ 0, /* U+010f3b: */
+ 0, /* U+010f3c: */
+ 0, /* U+010f3d: */
+ 0, /* U+010f3e: */
+ 0, /* U+010f3f: */
+ 0, /* U+010f40: */
+ 0, /* U+010f41: */
+ 0, /* U+010f42: */
+ 0, /* U+010f43: */
+ 0, /* U+010f44: */
+ 0, /* U+010f45: */
+ 0, /* U+010f46: */
+ 0, /* U+010f47: */
+ 0, /* U+010f48: */
+ 0, /* U+010f49: */
+ 0, /* U+010f4a: */
+ 0, /* U+010f4b: */
+ 0, /* U+010f4c: */
+ 0, /* U+010f4d: */
+ 0, /* U+010f4e: */
+ 0, /* U+010f4f: */
+ 0, /* U+010f50: */
+ 0, /* U+010f51: */
+ 0, /* U+010f52: */
+ 0, /* U+010f53: */
+ 0, /* U+010f54: */
+ 0, /* U+010f55: */
+ 0, /* U+010f56: */
+ 0, /* U+010f57: */
+ 0, /* U+010f58: */
+ 0, /* U+010f59: */
+ 0, /* U+010f5a: */
+ 0, /* U+010f5b: */
+ 0, /* U+010f5c: */
+ 0, /* U+010f5d: */
+ 0, /* U+010f5e: */
+ 0, /* U+010f5f: */
+ 0, /* U+010f60: */
+ 0, /* U+010f61: */
+ 0, /* U+010f62: */
+ 0, /* U+010f63: */
+ 0, /* U+010f64: */
+ 0, /* U+010f65: */
+ 0, /* U+010f66: */
+ 0, /* U+010f67: */
+ 0, /* U+010f68: */
+ 0, /* U+010f69: */
+ 0, /* U+010f6a: */
+ 0, /* U+010f6b: */
+ 0, /* U+010f6c: */
+ 0, /* U+010f6d: */
+ 0, /* U+010f6e: */
+ 0, /* U+010f6f: */
+ 0, /* U+010f70: */
+ 0, /* U+010f71: */
+ 0, /* U+010f72: */
+ 0, /* U+010f73: */
+ 0, /* U+010f74: */
+ 0, /* U+010f75: */
+ 0, /* U+010f76: */
+ 0, /* U+010f77: */
+ 0, /* U+010f78: */
+ 0, /* U+010f79: */
+ 0, /* U+010f7a: */
+ 0, /* U+010f7b: */
+ 0, /* U+010f7c: */
+ 0, /* U+010f7d: */
+ 0, /* U+010f7e: */
+ 0, /* U+010f7f: */
+ 0, /* U+010f80: */
+ 0, /* U+010f81: */
+ 0, /* U+010f82: */
+ 0, /* U+010f83: */
+ 0, /* U+010f84: */
+ 0, /* U+010f85: */
+ 0, /* U+010f86: */
+ 0, /* U+010f87: */
+ 0, /* U+010f88: */
+ 0, /* U+010f89: */
+ 0, /* U+010f8a: */
+ 0, /* U+010f8b: */
+ 0, /* U+010f8c: */
+ 0, /* U+010f8d: */
+ 0, /* U+010f8e: */
+ 0, /* U+010f8f: */
+ 0, /* U+010f90: */
+ 0, /* U+010f91: */
+ 0, /* U+010f92: */
+ 0, /* U+010f93: */
+ 0, /* U+010f94: */
+ 0, /* U+010f95: */
+ 0, /* U+010f96: */
+ 0, /* U+010f97: */
+ 0, /* U+010f98: */
+ 0, /* U+010f99: */
+ 0, /* U+010f9a: */
+ 0, /* U+010f9b: */
+ 0, /* U+010f9c: */
+ 0, /* U+010f9d: */
+ 0, /* U+010f9e: */
+ 0, /* U+010f9f: */
+ 0, /* U+010fa0: */
+ 0, /* U+010fa1: */
+ 0, /* U+010fa2: */
+ 0, /* U+010fa3: */
+ 0, /* U+010fa4: */
+ 0, /* U+010fa5: */
+ 0, /* U+010fa6: */
+ 0, /* U+010fa7: */
+ 0, /* U+010fa8: */
+ 0, /* U+010fa9: */
+ 0, /* U+010faa: */
+ 0, /* U+010fab: */
+ 0, /* U+010fac: */
+ 0, /* U+010fad: */
+ 0, /* U+010fae: */
+ 0, /* U+010faf: */
+ 0, /* U+010fb0: */
+ 0, /* U+010fb1: */
+ 0, /* U+010fb2: */
+ 0, /* U+010fb3: */
+ 0, /* U+010fb4: */
+ 0, /* U+010fb5: */
+ 0, /* U+010fb6: */
+ 0, /* U+010fb7: */
+ 0, /* U+010fb8: */
+ 0, /* U+010fb9: */
+ 0, /* U+010fba: */
+ 0, /* U+010fbb: */
+ 0, /* U+010fbc: */
+ 0, /* U+010fbd: */
+ 0, /* U+010fbe: */
+ 0, /* U+010fbf: */
+ 0, /* U+010fc0: */
+ 0, /* U+010fc1: */
+ 0, /* U+010fc2: */
+ 0, /* U+010fc3: */
+ 0, /* U+010fc4: */
+ 0, /* U+010fc5: */
+ 0, /* U+010fc6: */
+ 0, /* U+010fc7: */
+ 0, /* U+010fc8: */
+ 0, /* U+010fc9: */
+ 0, /* U+010fca: */
+ 0, /* U+010fcb: */
+ 0, /* U+010fcc: */
+ 0, /* U+010fcd: */
+ 0, /* U+010fce: */
+ 0, /* U+010fcf: */
+ 0, /* U+010fd0: */
+ 0, /* U+010fd1: */
+ 0, /* U+010fd2: */
+ 0, /* U+010fd3: */
+ 0, /* U+010fd4: */
+ 0, /* U+010fd5: */
+ 0, /* U+010fd6: */
+ 0, /* U+010fd7: */
+ 0, /* U+010fd8: */
+ 0, /* U+010fd9: */
+ 0, /* U+010fda: */
+ 0, /* U+010fdb: */
+ 0, /* U+010fdc: */
+ 0, /* U+010fdd: */
+ 0, /* U+010fde: */
+ 0, /* U+010fdf: */
+ 0, /* U+010fe0: */
+ 0, /* U+010fe1: */
+ 0, /* U+010fe2: */
+ 0, /* U+010fe3: */
+ 0, /* U+010fe4: */
+ 0, /* U+010fe5: */
+ 0, /* U+010fe6: */
+ 0, /* U+010fe7: */
+ 0, /* U+010fe8: */
+ 0, /* U+010fe9: */
+ 0, /* U+010fea: */
+ 0, /* U+010feb: */
+ 0, /* U+010fec: */
+ 0, /* U+010fed: */
+ 0, /* U+010fee: */
+ 0, /* U+010fef: */
+ 0, /* U+010ff0: */
+ 0, /* U+010ff1: */
+ 0, /* U+010ff2: */
+ 0, /* U+010ff3: */
+ 0, /* U+010ff4: */
+ 0, /* U+010ff5: */
+ 0, /* U+010ff6: */
+ 0, /* U+010ff7: */
+ 0, /* U+010ff8: */
+ 0, /* U+010ff9: */
+ 0, /* U+010ffa: */
+ 0, /* U+010ffb: */
+ 0, /* U+010ffc: */
+ 0, /* U+010ffd: */
+ 0, /* U+010ffe: */
+ 0, /* U+010fff: */
+ RTUNI_ALPHA, /* U+011000: BRAHMI SIGN CANDRABINDU*/
+ RTUNI_ALPHA, /* U+011001: BRAHMI SIGN ANUSVARA*/
+ RTUNI_ALPHA, /* U+011002: BRAHMI SIGN VISARGA*/
+ RTUNI_ALPHA, /* U+011003: BRAHMI SIGN JIHVAMULIYA*/
+ RTUNI_ALPHA, /* U+011004: BRAHMI SIGN UPADHMANIYA*/
+ RTUNI_ALPHA, /* U+011005: BRAHMI LETTER A*/
+ RTUNI_ALPHA, /* U+011006: BRAHMI LETTER AA*/
+ RTUNI_ALPHA, /* U+011007: BRAHMI LETTER I*/
+ RTUNI_ALPHA, /* U+011008: BRAHMI LETTER II*/
+ RTUNI_ALPHA, /* U+011009: BRAHMI LETTER U*/
+ RTUNI_ALPHA, /* U+01100a: BRAHMI LETTER UU*/
+ RTUNI_ALPHA, /* U+01100b: BRAHMI LETTER VOCALIC R*/
+ RTUNI_ALPHA, /* U+01100c: BRAHMI LETTER VOCALIC RR*/
+ RTUNI_ALPHA, /* U+01100d: BRAHMI LETTER VOCALIC L*/
+ RTUNI_ALPHA, /* U+01100e: BRAHMI LETTER VOCALIC LL*/
+ RTUNI_ALPHA, /* U+01100f: BRAHMI LETTER E*/
+ RTUNI_ALPHA, /* U+011010: BRAHMI LETTER AI*/
+ RTUNI_ALPHA, /* U+011011: BRAHMI LETTER O*/
+ RTUNI_ALPHA, /* U+011012: BRAHMI LETTER AU*/
+ RTUNI_ALPHA, /* U+011013: BRAHMI LETTER KA*/
+ RTUNI_ALPHA, /* U+011014: BRAHMI LETTER KHA*/
+ RTUNI_ALPHA, /* U+011015: BRAHMI LETTER GA*/
+ RTUNI_ALPHA, /* U+011016: BRAHMI LETTER GHA*/
+ RTUNI_ALPHA, /* U+011017: BRAHMI LETTER NGA*/
+ RTUNI_ALPHA, /* U+011018: BRAHMI LETTER CA*/
+ RTUNI_ALPHA, /* U+011019: BRAHMI LETTER CHA*/
+ RTUNI_ALPHA, /* U+01101a: BRAHMI LETTER JA*/
+ RTUNI_ALPHA, /* U+01101b: BRAHMI LETTER JHA*/
+ RTUNI_ALPHA, /* U+01101c: BRAHMI LETTER NYA*/
+ RTUNI_ALPHA, /* U+01101d: BRAHMI LETTER TTA*/
+ RTUNI_ALPHA, /* U+01101e: BRAHMI LETTER TTHA*/
+ RTUNI_ALPHA, /* U+01101f: BRAHMI LETTER DDA*/
+ RTUNI_ALPHA, /* U+011020: BRAHMI LETTER DDHA*/
+ RTUNI_ALPHA, /* U+011021: BRAHMI LETTER NNA*/
+ RTUNI_ALPHA, /* U+011022: BRAHMI LETTER TA*/
+ RTUNI_ALPHA, /* U+011023: BRAHMI LETTER THA*/
+ RTUNI_ALPHA, /* U+011024: BRAHMI LETTER DA*/
+ RTUNI_ALPHA, /* U+011025: BRAHMI LETTER DHA*/
+ RTUNI_ALPHA, /* U+011026: BRAHMI LETTER NA*/
+ RTUNI_ALPHA, /* U+011027: BRAHMI LETTER PA*/
+ RTUNI_ALPHA, /* U+011028: BRAHMI LETTER PHA*/
+ RTUNI_ALPHA, /* U+011029: BRAHMI LETTER BA*/
+ RTUNI_ALPHA, /* U+01102a: BRAHMI LETTER BHA*/
+ RTUNI_ALPHA, /* U+01102b: BRAHMI LETTER MA*/
+ RTUNI_ALPHA, /* U+01102c: BRAHMI LETTER YA*/
+ RTUNI_ALPHA, /* U+01102d: BRAHMI LETTER RA*/
+ RTUNI_ALPHA, /* U+01102e: BRAHMI LETTER LA*/
+ RTUNI_ALPHA, /* U+01102f: BRAHMI LETTER VA*/
+ RTUNI_ALPHA, /* U+011030: BRAHMI LETTER SHA*/
+ RTUNI_ALPHA, /* U+011031: BRAHMI LETTER SSA*/
+ RTUNI_ALPHA, /* U+011032: BRAHMI LETTER SA*/
+ RTUNI_ALPHA, /* U+011033: BRAHMI LETTER HA*/
+ RTUNI_ALPHA, /* U+011034: BRAHMI LETTER LLA*/
+ RTUNI_ALPHA, /* U+011035: BRAHMI LETTER OLD TAMIL LLLA*/
+ RTUNI_ALPHA, /* U+011036: BRAHMI LETTER OLD TAMIL RRA*/
+ RTUNI_ALPHA, /* U+011037: BRAHMI LETTER OLD TAMIL NNNA*/
+ RTUNI_ALPHA, /* U+011038: BRAHMI VOWEL SIGN AA*/
+ RTUNI_ALPHA, /* U+011039: BRAHMI VOWEL SIGN BHATTIPROLU AA*/
+ RTUNI_ALPHA, /* U+01103a: BRAHMI VOWEL SIGN I*/
+ RTUNI_ALPHA, /* U+01103b: BRAHMI VOWEL SIGN II*/
+ RTUNI_ALPHA, /* U+01103c: BRAHMI VOWEL SIGN U*/
+ RTUNI_ALPHA, /* U+01103d: BRAHMI VOWEL SIGN UU*/
+ RTUNI_ALPHA, /* U+01103e: BRAHMI VOWEL SIGN VOCALIC R*/
+ RTUNI_ALPHA, /* U+01103f: BRAHMI VOWEL SIGN VOCALIC RR*/
+ RTUNI_ALPHA, /* U+011040: BRAHMI VOWEL SIGN VOCALIC L*/
+ RTUNI_ALPHA, /* U+011041: BRAHMI VOWEL SIGN VOCALIC LL*/
+ RTUNI_ALPHA, /* U+011042: BRAHMI VOWEL SIGN E*/
+ RTUNI_ALPHA, /* U+011043: BRAHMI VOWEL SIGN AI*/
+ RTUNI_ALPHA, /* U+011044: BRAHMI VOWEL SIGN O*/
+ RTUNI_ALPHA, /* U+011045: BRAHMI VOWEL SIGN AU*/
+ 0, /* U+011046: BRAHMI VIRAMA*/
+ 0, /* U+011047: BRAHMI DANDA*/
+ 0, /* U+011048: BRAHMI DOUBLE DANDA*/
+ 0, /* U+011049: BRAHMI PUNCTUATION DOT*/
+ 0, /* U+01104a: BRAHMI PUNCTUATION DOUBLE DOT*/
+ 0, /* U+01104b: BRAHMI PUNCTUATION LINE*/
+ 0, /* U+01104c: BRAHMI PUNCTUATION CRESCENT BAR*/
+ 0, /* U+01104d: BRAHMI PUNCTUATION LOTUS*/
+ 0, /* U+01104e: */
+ 0, /* U+01104f: */
+ 0, /* U+011050: */
+ 0, /* U+011051: */
+ 0, /* U+011052: BRAHMI NUMBER ONE*/
+ 0, /* U+011053: BRAHMI NUMBER TWO*/
+ 0, /* U+011054: BRAHMI NUMBER THREE*/
+ 0, /* U+011055: BRAHMI NUMBER FOUR*/
+ 0, /* U+011056: BRAHMI NUMBER FIVE*/
+ 0, /* U+011057: BRAHMI NUMBER SIX*/
+ 0, /* U+011058: BRAHMI NUMBER SEVEN*/
+ 0, /* U+011059: BRAHMI NUMBER EIGHT*/
+ 0, /* U+01105a: BRAHMI NUMBER NINE*/
+ 0, /* U+01105b: BRAHMI NUMBER TEN*/
+ 0, /* U+01105c: BRAHMI NUMBER TWENTY*/
+ 0, /* U+01105d: BRAHMI NUMBER THIRTY*/
+ 0, /* U+01105e: BRAHMI NUMBER FORTY*/
+ 0, /* U+01105f: BRAHMI NUMBER FIFTY*/
+ 0, /* U+011060: BRAHMI NUMBER SIXTY*/
+ 0, /* U+011061: BRAHMI NUMBER SEVENTY*/
+ 0, /* U+011062: BRAHMI NUMBER EIGHTY*/
+ 0, /* U+011063: BRAHMI NUMBER NINETY*/
+ 0, /* U+011064: BRAHMI NUMBER ONE HUNDRED*/
+ 0, /* U+011065: BRAHMI NUMBER ONE THOUSAND*/
+ RTUNI_DDIGIT, /* U+011066: BRAHMI DIGIT ZERO*/
+ RTUNI_DDIGIT, /* U+011067: BRAHMI DIGIT ONE*/
+ RTUNI_DDIGIT, /* U+011068: BRAHMI DIGIT TWO*/
+ RTUNI_DDIGIT, /* U+011069: BRAHMI DIGIT THREE*/
+ RTUNI_DDIGIT, /* U+01106a: BRAHMI DIGIT FOUR*/
+ RTUNI_DDIGIT, /* U+01106b: BRAHMI DIGIT FIVE*/
+ RTUNI_DDIGIT, /* U+01106c: BRAHMI DIGIT SIX*/
+ RTUNI_DDIGIT, /* U+01106d: BRAHMI DIGIT SEVEN*/
+ RTUNI_DDIGIT, /* U+01106e: BRAHMI DIGIT EIGHT*/
+ RTUNI_DDIGIT, /* U+01106f: BRAHMI DIGIT NINE*/
+ 0, /* U+011070: */
+ 0, /* U+011071: */
+ 0, /* U+011072: */
+ 0, /* U+011073: */
+ 0, /* U+011074: */
+ 0, /* U+011075: */
+ 0, /* U+011076: */
+ 0, /* U+011077: */
+ 0, /* U+011078: */
+ 0, /* U+011079: */
+ 0, /* U+01107a: */
+ 0, /* U+01107b: */
+ 0, /* U+01107c: */
+ 0, /* U+01107d: */
+ 0, /* U+01107e: */
+ 0, /* U+01107f: */
+ 0, /* U+011080: KAITHI SIGN CANDRABINDU*/
+ 0, /* U+011081: KAITHI SIGN ANUSVARA*/
+ RTUNI_ALPHA, /* U+011082: KAITHI SIGN VISARGA*/
+ RTUNI_ALPHA, /* U+011083: KAITHI LETTER A*/
+ RTUNI_ALPHA, /* U+011084: KAITHI LETTER AA*/
+ RTUNI_ALPHA, /* U+011085: KAITHI LETTER I*/
+ RTUNI_ALPHA, /* U+011086: KAITHI LETTER II*/
+ RTUNI_ALPHA, /* U+011087: KAITHI LETTER U*/
+ RTUNI_ALPHA, /* U+011088: KAITHI LETTER UU*/
+ RTUNI_ALPHA, /* U+011089: KAITHI LETTER E*/
+ RTUNI_ALPHA, /* U+01108a: KAITHI LETTER AI*/
+ RTUNI_ALPHA, /* U+01108b: KAITHI LETTER O*/
+ RTUNI_ALPHA, /* U+01108c: KAITHI LETTER AU*/
+ RTUNI_ALPHA, /* U+01108d: KAITHI LETTER KA*/
+ RTUNI_ALPHA, /* U+01108e: KAITHI LETTER KHA*/
+ RTUNI_ALPHA, /* U+01108f: KAITHI LETTER GA*/
+ RTUNI_ALPHA, /* U+011090: KAITHI LETTER GHA*/
+ RTUNI_ALPHA, /* U+011091: KAITHI LETTER NGA*/
+ RTUNI_ALPHA, /* U+011092: KAITHI LETTER CA*/
+ RTUNI_ALPHA, /* U+011093: KAITHI LETTER CHA*/
+ RTUNI_ALPHA, /* U+011094: KAITHI LETTER JA*/
+ RTUNI_ALPHA, /* U+011095: KAITHI LETTER JHA*/
+ RTUNI_ALPHA, /* U+011096: KAITHI LETTER NYA*/
+ RTUNI_ALPHA, /* U+011097: KAITHI LETTER TTA*/
+ RTUNI_ALPHA, /* U+011098: KAITHI LETTER TTHA*/
+ RTUNI_ALPHA, /* U+011099: KAITHI LETTER DDA*/
+ RTUNI_ALPHA, /* U+01109a: KAITHI LETTER DDDHA*/
+ RTUNI_ALPHA, /* U+01109b: KAITHI LETTER DDHA*/
+ RTUNI_ALPHA, /* U+01109c: KAITHI LETTER RHA*/
+ RTUNI_ALPHA, /* U+01109d: KAITHI LETTER NNA*/
+ RTUNI_ALPHA, /* U+01109e: KAITHI LETTER TA*/
+ RTUNI_ALPHA, /* U+01109f: KAITHI LETTER THA*/
+ RTUNI_ALPHA, /* U+0110a0: KAITHI LETTER DA*/
+ RTUNI_ALPHA, /* U+0110a1: KAITHI LETTER DHA*/
+ RTUNI_ALPHA, /* U+0110a2: KAITHI LETTER NA*/
+ RTUNI_ALPHA, /* U+0110a3: KAITHI LETTER PA*/
+ RTUNI_ALPHA, /* U+0110a4: KAITHI LETTER PHA*/
+ RTUNI_ALPHA, /* U+0110a5: KAITHI LETTER BA*/
+ RTUNI_ALPHA, /* U+0110a6: KAITHI LETTER BHA*/
+ RTUNI_ALPHA, /* U+0110a7: KAITHI LETTER MA*/
+ RTUNI_ALPHA, /* U+0110a8: KAITHI LETTER YA*/
+ RTUNI_ALPHA, /* U+0110a9: KAITHI LETTER RA*/
+ RTUNI_ALPHA, /* U+0110aa: KAITHI LETTER LA*/
+ RTUNI_ALPHA, /* U+0110ab: KAITHI LETTER VA*/
+ RTUNI_ALPHA, /* U+0110ac: KAITHI LETTER SHA*/
+ RTUNI_ALPHA, /* U+0110ad: KAITHI LETTER SSA*/
+ RTUNI_ALPHA, /* U+0110ae: KAITHI LETTER SA*/
+ RTUNI_ALPHA, /* U+0110af: KAITHI LETTER HA*/
+ RTUNI_ALPHA, /* U+0110b0: KAITHI VOWEL SIGN AA*/
+ RTUNI_ALPHA, /* U+0110b1: KAITHI VOWEL SIGN I*/
+ RTUNI_ALPHA, /* U+0110b2: KAITHI VOWEL SIGN II*/
+ RTUNI_ALPHA, /* U+0110b3: KAITHI VOWEL SIGN U*/
+ RTUNI_ALPHA, /* U+0110b4: KAITHI VOWEL SIGN UU*/
+ RTUNI_ALPHA, /* U+0110b5: KAITHI VOWEL SIGN E*/
+ RTUNI_ALPHA, /* U+0110b6: KAITHI VOWEL SIGN AI*/
+ RTUNI_ALPHA, /* U+0110b7: KAITHI VOWEL SIGN O*/
+ RTUNI_ALPHA, /* U+0110b8: KAITHI VOWEL SIGN AU*/
+ 0, /* U+0110b9: KAITHI SIGN VIRAMA*/
+ 0, /* U+0110ba: KAITHI SIGN NUKTA*/
+ 0, /* U+0110bb: KAITHI ABBREVIATION SIGN*/
+ 0, /* U+0110bc: KAITHI ENUMERATION SIGN*/
+ 0, /* U+0110bd: KAITHI NUMBER SIGN*/
+ 0, /* U+0110be: KAITHI SECTION MARK*/
+ 0, /* U+0110bf: KAITHI DOUBLE SECTION MARK*/
+ 0, /* U+0110c0: KAITHI DANDA*/
+ 0, /* U+0110c1: KAITHI DOUBLE DANDA*/
+ 0, /* U+0110c2: */
+ 0, /* U+0110c3: */
+ 0, /* U+0110c4: */
+ 0, /* U+0110c5: */
+ 0, /* U+0110c6: */
+ 0, /* U+0110c7: */
+ 0, /* U+0110c8: */
+ 0, /* U+0110c9: */
+ 0, /* U+0110ca: */
+ 0, /* U+0110cb: */
+ 0, /* U+0110cc: */
+ 0, /* U+0110cd: */
+ 0, /* U+0110ce: */
+ 0, /* U+0110cf: */
+ RTUNI_ALPHA, /* U+0110d0: SORA SOMPENG LETTER SAH*/
+ RTUNI_ALPHA, /* U+0110d1: SORA SOMPENG LETTER TAH*/
+ RTUNI_ALPHA, /* U+0110d2: SORA SOMPENG LETTER BAH*/
+ RTUNI_ALPHA, /* U+0110d3: SORA SOMPENG LETTER CAH*/
+ RTUNI_ALPHA, /* U+0110d4: SORA SOMPENG LETTER DAH*/
+ RTUNI_ALPHA, /* U+0110d5: SORA SOMPENG LETTER GAH*/
+ RTUNI_ALPHA, /* U+0110d6: SORA SOMPENG LETTER MAH*/
+ RTUNI_ALPHA, /* U+0110d7: SORA SOMPENG LETTER NGAH*/
+ RTUNI_ALPHA, /* U+0110d8: SORA SOMPENG LETTER LAH*/
+ RTUNI_ALPHA, /* U+0110d9: SORA SOMPENG LETTER NAH*/
+ RTUNI_ALPHA, /* U+0110da: SORA SOMPENG LETTER VAH*/
+ RTUNI_ALPHA, /* U+0110db: SORA SOMPENG LETTER PAH*/
+ RTUNI_ALPHA, /* U+0110dc: SORA SOMPENG LETTER YAH*/
+ RTUNI_ALPHA, /* U+0110dd: SORA SOMPENG LETTER RAH*/
+ RTUNI_ALPHA, /* U+0110de: SORA SOMPENG LETTER HAH*/
+ RTUNI_ALPHA, /* U+0110df: SORA SOMPENG LETTER KAH*/
+ RTUNI_ALPHA, /* U+0110e0: SORA SOMPENG LETTER JAH*/
+ RTUNI_ALPHA, /* U+0110e1: SORA SOMPENG LETTER NYAH*/
+ RTUNI_ALPHA, /* U+0110e2: SORA SOMPENG LETTER AH*/
+ RTUNI_ALPHA, /* U+0110e3: SORA SOMPENG LETTER EEH*/
+ RTUNI_ALPHA, /* U+0110e4: SORA SOMPENG LETTER IH*/
+ RTUNI_ALPHA, /* U+0110e5: SORA SOMPENG LETTER UH*/
+ RTUNI_ALPHA, /* U+0110e6: SORA SOMPENG LETTER OH*/
+ RTUNI_ALPHA, /* U+0110e7: SORA SOMPENG LETTER EH*/
+ RTUNI_ALPHA, /* U+0110e8: SORA SOMPENG LETTER MAE*/
+ 0, /* U+0110e9: */
+ 0, /* U+0110ea: */
+ 0, /* U+0110eb: */
+ 0, /* U+0110ec: */
+ 0, /* U+0110ed: */
+ 0, /* U+0110ee: */
+ 0, /* U+0110ef: */
+ RTUNI_DDIGIT, /* U+0110f0: SORA SOMPENG DIGIT ZERO*/
+ RTUNI_DDIGIT, /* U+0110f1: SORA SOMPENG DIGIT ONE*/
+ RTUNI_DDIGIT, /* U+0110f2: SORA SOMPENG DIGIT TWO*/
+ RTUNI_DDIGIT, /* U+0110f3: SORA SOMPENG DIGIT THREE*/
+ RTUNI_DDIGIT, /* U+0110f4: SORA SOMPENG DIGIT FOUR*/
+ RTUNI_DDIGIT, /* U+0110f5: SORA SOMPENG DIGIT FIVE*/
+ RTUNI_DDIGIT, /* U+0110f6: SORA SOMPENG DIGIT SIX*/
+ RTUNI_DDIGIT, /* U+0110f7: SORA SOMPENG DIGIT SEVEN*/
+ RTUNI_DDIGIT, /* U+0110f8: SORA SOMPENG DIGIT EIGHT*/
+ RTUNI_DDIGIT, /* U+0110f9: SORA SOMPENG DIGIT NINE*/
+ 0, /* U+0110fa: */
+ 0, /* U+0110fb: */
+ 0, /* U+0110fc: */
+ 0, /* U+0110fd: */
+ 0, /* U+0110fe: */
+ 0, /* U+0110ff: */
+ RTUNI_ALPHA, /* U+011100: CHAKMA SIGN CANDRABINDU*/
+ RTUNI_ALPHA, /* U+011101: CHAKMA SIGN ANUSVARA*/
+ RTUNI_ALPHA, /* U+011102: CHAKMA SIGN VISARGA*/
+ RTUNI_ALPHA, /* U+011103: CHAKMA LETTER AA*/
+ RTUNI_ALPHA, /* U+011104: CHAKMA LETTER I*/
+ RTUNI_ALPHA, /* U+011105: CHAKMA LETTER U*/
+ RTUNI_ALPHA, /* U+011106: CHAKMA LETTER E*/
+ RTUNI_ALPHA, /* U+011107: CHAKMA LETTER KAA*/
+ RTUNI_ALPHA, /* U+011108: CHAKMA LETTER KHAA*/
+ RTUNI_ALPHA, /* U+011109: CHAKMA LETTER GAA*/
+ RTUNI_ALPHA, /* U+01110a: CHAKMA LETTER GHAA*/
+ RTUNI_ALPHA, /* U+01110b: CHAKMA LETTER NGAA*/
+ RTUNI_ALPHA, /* U+01110c: CHAKMA LETTER CAA*/
+ RTUNI_ALPHA, /* U+01110d: CHAKMA LETTER CHAA*/
+ RTUNI_ALPHA, /* U+01110e: CHAKMA LETTER JAA*/
+ RTUNI_ALPHA, /* U+01110f: CHAKMA LETTER JHAA*/
+ RTUNI_ALPHA, /* U+011110: CHAKMA LETTER NYAA*/
+ RTUNI_ALPHA, /* U+011111: CHAKMA LETTER TTAA*/
+ RTUNI_ALPHA, /* U+011112: CHAKMA LETTER TTHAA*/
+ RTUNI_ALPHA, /* U+011113: CHAKMA LETTER DDAA*/
+ RTUNI_ALPHA, /* U+011114: CHAKMA LETTER DDHAA*/
+ RTUNI_ALPHA, /* U+011115: CHAKMA LETTER NNAA*/
+ RTUNI_ALPHA, /* U+011116: CHAKMA LETTER TAA*/
+ RTUNI_ALPHA, /* U+011117: CHAKMA LETTER THAA*/
+ RTUNI_ALPHA, /* U+011118: CHAKMA LETTER DAA*/
+ RTUNI_ALPHA, /* U+011119: CHAKMA LETTER DHAA*/
+ RTUNI_ALPHA, /* U+01111a: CHAKMA LETTER NAA*/
+ RTUNI_ALPHA, /* U+01111b: CHAKMA LETTER PAA*/
+ RTUNI_ALPHA, /* U+01111c: CHAKMA LETTER PHAA*/
+ RTUNI_ALPHA, /* U+01111d: CHAKMA LETTER BAA*/
+ RTUNI_ALPHA, /* U+01111e: CHAKMA LETTER BHAA*/
+ RTUNI_ALPHA, /* U+01111f: CHAKMA LETTER MAA*/
+ RTUNI_ALPHA, /* U+011120: CHAKMA LETTER YYAA*/
+ RTUNI_ALPHA, /* U+011121: CHAKMA LETTER YAA*/
+ RTUNI_ALPHA, /* U+011122: CHAKMA LETTER RAA*/
+ RTUNI_ALPHA, /* U+011123: CHAKMA LETTER LAA*/
+ RTUNI_ALPHA, /* U+011124: CHAKMA LETTER WAA*/
+ RTUNI_ALPHA, /* U+011125: CHAKMA LETTER SAA*/
+ RTUNI_ALPHA, /* U+011126: CHAKMA LETTER HAA*/
+ RTUNI_ALPHA, /* U+011127: CHAKMA VOWEL SIGN A*/
+ RTUNI_ALPHA, /* U+011128: CHAKMA VOWEL SIGN I*/
+ RTUNI_ALPHA, /* U+011129: CHAKMA VOWEL SIGN II*/
+ RTUNI_ALPHA, /* U+01112a: CHAKMA VOWEL SIGN U*/
+ RTUNI_ALPHA, /* U+01112b: CHAKMA VOWEL SIGN UU*/
+ RTUNI_ALPHA, /* U+01112c: CHAKMA VOWEL SIGN E*/
+ RTUNI_ALPHA, /* U+01112d: CHAKMA VOWEL SIGN AI*/
+ RTUNI_ALPHA, /* U+01112e: CHAKMA VOWEL SIGN O*/
+ RTUNI_ALPHA, /* U+01112f: CHAKMA VOWEL SIGN AU*/
+ RTUNI_ALPHA, /* U+011130: CHAKMA VOWEL SIGN OI*/
+ RTUNI_ALPHA, /* U+011131: CHAKMA O MARK*/
+ RTUNI_ALPHA, /* U+011132: CHAKMA AU MARK*/
+ 0, /* U+011133: CHAKMA VIRAMA*/
+ 0, /* U+011134: CHAKMA MAAYYAA*/
+ 0, /* U+011135: */
+ RTUNI_DDIGIT, /* U+011136: CHAKMA DIGIT ZERO*/
+ RTUNI_DDIGIT, /* U+011137: CHAKMA DIGIT ONE*/
+ RTUNI_DDIGIT, /* U+011138: CHAKMA DIGIT TWO*/
+ RTUNI_DDIGIT, /* U+011139: CHAKMA DIGIT THREE*/
+ RTUNI_DDIGIT, /* U+01113a: CHAKMA DIGIT FOUR*/
+ RTUNI_DDIGIT, /* U+01113b: CHAKMA DIGIT FIVE*/
+ RTUNI_DDIGIT, /* U+01113c: CHAKMA DIGIT SIX*/
+ RTUNI_DDIGIT, /* U+01113d: CHAKMA DIGIT SEVEN*/
+ RTUNI_DDIGIT, /* U+01113e: CHAKMA DIGIT EIGHT*/
+ RTUNI_DDIGIT, /* U+01113f: CHAKMA DIGIT NINE*/
+ 0, /* U+011140: CHAKMA SECTION MARK*/
+ 0, /* U+011141: CHAKMA DANDA*/
+ 0, /* U+011142: CHAKMA DOUBLE DANDA*/
+ 0, /* U+011143: CHAKMA QUESTION MARK*/
+ 0, /* U+011144: */
+ 0, /* U+011145: */
+ 0, /* U+011146: */
+ 0, /* U+011147: */
+ 0, /* U+011148: */
+ 0, /* U+011149: */
+ 0, /* U+01114a: */
+ 0, /* U+01114b: */
+ 0, /* U+01114c: */
+ 0, /* U+01114d: */
+ 0, /* U+01114e: */
+ 0, /* U+01114f: */
+ 0, /* U+011150: */
+ 0, /* U+011151: */
+ 0, /* U+011152: */
+ 0, /* U+011153: */
+ 0, /* U+011154: */
+ 0, /* U+011155: */
+ 0, /* U+011156: */
+ 0, /* U+011157: */
+ 0, /* U+011158: */
+ 0, /* U+011159: */
+ 0, /* U+01115a: */
+ 0, /* U+01115b: */
+ 0, /* U+01115c: */
+ 0, /* U+01115d: */
+ 0, /* U+01115e: */
+ 0, /* U+01115f: */
+ 0, /* U+011160: */
+ 0, /* U+011161: */
+ 0, /* U+011162: */
+ 0, /* U+011163: */
+ 0, /* U+011164: */
+ 0, /* U+011165: */
+ 0, /* U+011166: */
+ 0, /* U+011167: */
+ 0, /* U+011168: */
+ 0, /* U+011169: */
+ 0, /* U+01116a: */
+ 0, /* U+01116b: */
+ 0, /* U+01116c: */
+ 0, /* U+01116d: */
+ 0, /* U+01116e: */
+ 0, /* U+01116f: */
+ 0, /* U+011170: */
+ 0, /* U+011171: */
+ 0, /* U+011172: */
+ 0, /* U+011173: */
+ 0, /* U+011174: */
+ 0, /* U+011175: */
+ 0, /* U+011176: */
+ 0, /* U+011177: */
+ 0, /* U+011178: */
+ 0, /* U+011179: */
+ 0, /* U+01117a: */
+ 0, /* U+01117b: */
+ 0, /* U+01117c: */
+ 0, /* U+01117d: */
+ 0, /* U+01117e: */
+ 0, /* U+01117f: */
+ RTUNI_ALPHA, /* U+011180: SHARADA SIGN CANDRABINDU*/
+ RTUNI_ALPHA, /* U+011181: SHARADA SIGN ANUSVARA*/
+ RTUNI_ALPHA, /* U+011182: SHARADA SIGN VISARGA*/
+ RTUNI_ALPHA, /* U+011183: SHARADA LETTER A*/
+ RTUNI_ALPHA, /* U+011184: SHARADA LETTER AA*/
+ RTUNI_ALPHA, /* U+011185: SHARADA LETTER I*/
+ RTUNI_ALPHA, /* U+011186: SHARADA LETTER II*/
+ RTUNI_ALPHA, /* U+011187: SHARADA LETTER U*/
+ RTUNI_ALPHA, /* U+011188: SHARADA LETTER UU*/
+ RTUNI_ALPHA, /* U+011189: SHARADA LETTER VOCALIC R*/
+ RTUNI_ALPHA, /* U+01118a: SHARADA LETTER VOCALIC RR*/
+ RTUNI_ALPHA, /* U+01118b: SHARADA LETTER VOCALIC L*/
+ RTUNI_ALPHA, /* U+01118c: SHARADA LETTER VOCALIC LL*/
+ RTUNI_ALPHA, /* U+01118d: SHARADA LETTER E*/
+ RTUNI_ALPHA, /* U+01118e: SHARADA LETTER AI*/
+ RTUNI_ALPHA, /* U+01118f: SHARADA LETTER O*/
+ RTUNI_ALPHA, /* U+011190: SHARADA LETTER AU*/
+ RTUNI_ALPHA, /* U+011191: SHARADA LETTER KA*/
+ RTUNI_ALPHA, /* U+011192: SHARADA LETTER KHA*/
+ RTUNI_ALPHA, /* U+011193: SHARADA LETTER GA*/
+ RTUNI_ALPHA, /* U+011194: SHARADA LETTER GHA*/
+ RTUNI_ALPHA, /* U+011195: SHARADA LETTER NGA*/
+ RTUNI_ALPHA, /* U+011196: SHARADA LETTER CA*/
+ RTUNI_ALPHA, /* U+011197: SHARADA LETTER CHA*/
+ RTUNI_ALPHA, /* U+011198: SHARADA LETTER JA*/
+ RTUNI_ALPHA, /* U+011199: SHARADA LETTER JHA*/
+ RTUNI_ALPHA, /* U+01119a: SHARADA LETTER NYA*/
+ RTUNI_ALPHA, /* U+01119b: SHARADA LETTER TTA*/
+ RTUNI_ALPHA, /* U+01119c: SHARADA LETTER TTHA*/
+ RTUNI_ALPHA, /* U+01119d: SHARADA LETTER DDA*/
+ RTUNI_ALPHA, /* U+01119e: SHARADA LETTER DDHA*/
+ RTUNI_ALPHA, /* U+01119f: SHARADA LETTER NNA*/
+ RTUNI_ALPHA, /* U+0111a0: SHARADA LETTER TA*/
+ RTUNI_ALPHA, /* U+0111a1: SHARADA LETTER THA*/
+ RTUNI_ALPHA, /* U+0111a2: SHARADA LETTER DA*/
+ RTUNI_ALPHA, /* U+0111a3: SHARADA LETTER DHA*/
+ RTUNI_ALPHA, /* U+0111a4: SHARADA LETTER NA*/
+ RTUNI_ALPHA, /* U+0111a5: SHARADA LETTER PA*/
+ RTUNI_ALPHA, /* U+0111a6: SHARADA LETTER PHA*/
+ RTUNI_ALPHA, /* U+0111a7: SHARADA LETTER BA*/
+ RTUNI_ALPHA, /* U+0111a8: SHARADA LETTER BHA*/
+ RTUNI_ALPHA, /* U+0111a9: SHARADA LETTER MA*/
+ RTUNI_ALPHA, /* U+0111aa: SHARADA LETTER YA*/
+ RTUNI_ALPHA, /* U+0111ab: SHARADA LETTER RA*/
+ RTUNI_ALPHA, /* U+0111ac: SHARADA LETTER LA*/
+ RTUNI_ALPHA, /* U+0111ad: SHARADA LETTER LLA*/
+ RTUNI_ALPHA, /* U+0111ae: SHARADA LETTER VA*/
+ RTUNI_ALPHA, /* U+0111af: SHARADA LETTER SHA*/
+ RTUNI_ALPHA, /* U+0111b0: SHARADA LETTER SSA*/
+ RTUNI_ALPHA, /* U+0111b1: SHARADA LETTER SA*/
+ RTUNI_ALPHA, /* U+0111b2: SHARADA LETTER HA*/
+ RTUNI_ALPHA, /* U+0111b3: SHARADA VOWEL SIGN AA*/
+ RTUNI_ALPHA, /* U+0111b4: SHARADA VOWEL SIGN I*/
+ RTUNI_ALPHA, /* U+0111b5: SHARADA VOWEL SIGN II*/
+ RTUNI_ALPHA, /* U+0111b6: SHARADA VOWEL SIGN U*/
+ RTUNI_ALPHA, /* U+0111b7: SHARADA VOWEL SIGN UU*/
+ RTUNI_ALPHA, /* U+0111b8: SHARADA VOWEL SIGN VOCALIC R*/
+ RTUNI_ALPHA, /* U+0111b9: SHARADA VOWEL SIGN VOCALIC RR*/
+ RTUNI_ALPHA, /* U+0111ba: SHARADA VOWEL SIGN VOCALIC L*/
+ RTUNI_ALPHA, /* U+0111bb: SHARADA VOWEL SIGN VOCALIC LL*/
+ RTUNI_ALPHA, /* U+0111bc: SHARADA VOWEL SIGN E*/
+ RTUNI_ALPHA, /* U+0111bd: SHARADA VOWEL SIGN AI*/
+ RTUNI_ALPHA, /* U+0111be: SHARADA VOWEL SIGN O*/
+ RTUNI_ALPHA, /* U+0111bf: SHARADA VOWEL SIGN AU*/
+ 0, /* U+0111c0: SHARADA SIGN VIRAMA*/
+ RTUNI_ALPHA, /* U+0111c1: SHARADA SIGN AVAGRAHA*/
+ RTUNI_ALPHA, /* U+0111c2: SHARADA SIGN JIHVAMULIYA*/
+ RTUNI_ALPHA, /* U+0111c3: SHARADA SIGN UPADHMANIYA*/
+ RTUNI_ALPHA, /* U+0111c4: SHARADA OM*/
+ 0, /* U+0111c5: SHARADA DANDA*/
+ 0, /* U+0111c6: SHARADA DOUBLE DANDA*/
+ 0, /* U+0111c7: SHARADA ABBREVIATION SIGN*/
+ 0, /* U+0111c8: SHARADA SEPARATOR*/
+ 0, /* U+0111c9: */
+ 0, /* U+0111ca: */
+ 0, /* U+0111cb: */
+ 0, /* U+0111cc: */
+ 0, /* U+0111cd: */
+ 0, /* U+0111ce: */
+ 0, /* U+0111cf: */
+ RTUNI_DDIGIT, /* U+0111d0: SHARADA DIGIT ZERO*/
+ RTUNI_DDIGIT, /* U+0111d1: SHARADA DIGIT ONE*/
+ RTUNI_DDIGIT, /* U+0111d2: SHARADA DIGIT TWO*/
+ RTUNI_DDIGIT, /* U+0111d3: SHARADA DIGIT THREE*/
+ RTUNI_DDIGIT, /* U+0111d4: SHARADA DIGIT FOUR*/
+ RTUNI_DDIGIT, /* U+0111d5: SHARADA DIGIT FIVE*/
+ RTUNI_DDIGIT, /* U+0111d6: SHARADA DIGIT SIX*/
+ RTUNI_DDIGIT, /* U+0111d7: SHARADA DIGIT SEVEN*/
+ RTUNI_DDIGIT, /* U+0111d8: SHARADA DIGIT EIGHT*/
+ RTUNI_DDIGIT, /* U+0111d9: SHARADA DIGIT NINE*/
+ 0, /* U+0111da: */
+ 0, /* U+0111db: */
+ 0, /* U+0111dc: */
+ 0, /* U+0111dd: */
+ 0, /* U+0111de: */
+ 0, /* U+0111df: */
+ 0, /* U+0111e0: */
+ 0, /* U+0111e1: */
+ 0, /* U+0111e2: */
+ 0, /* U+0111e3: */
+ 0, /* U+0111e4: */
+ 0, /* U+0111e5: */
+ 0, /* U+0111e6: */
+ 0, /* U+0111e7: */
+ 0, /* U+0111e8: */
+ 0, /* U+0111e9: */
+ 0, /* U+0111ea: */
+ 0, /* U+0111eb: */
+ 0, /* U+0111ec: */
+ 0, /* U+0111ed: */
+ 0, /* U+0111ee: */
+ 0, /* U+0111ef: */
+ 0, /* U+0111f0: */
+ 0, /* U+0111f1: */
+ 0, /* U+0111f2: */
+ 0, /* U+0111f3: */
+ 0, /* U+0111f4: */
+ 0, /* U+0111f5: */
+ 0, /* U+0111f6: */
+ 0, /* U+0111f7: */
+ 0, /* U+0111f8: */
+ 0, /* U+0111f9: */
+ 0, /* U+0111fa: */
+ 0, /* U+0111fb: */
+ 0, /* U+0111fc: */
+ 0, /* U+0111fd: */
+ 0, /* U+0111fe: */
+ 0, /* U+0111ff: */
+ 0, /* U+011200: */
+ 0, /* U+011201: */
+ 0, /* U+011202: */
+ 0, /* U+011203: */
+ 0, /* U+011204: */
+ 0, /* U+011205: */
+ 0, /* U+011206: */
+ 0, /* U+011207: */
+ 0, /* U+011208: */
+ 0, /* U+011209: */
+ 0, /* U+01120a: */
+ 0, /* U+01120b: */
+ 0, /* U+01120c: */
+ 0, /* U+01120d: */
+ 0, /* U+01120e: */
+ 0, /* U+01120f: */
+ 0, /* U+011210: */
+ 0, /* U+011211: */
+ 0, /* U+011212: */
+ 0, /* U+011213: */
+ 0, /* U+011214: */
+ 0, /* U+011215: */
+ 0, /* U+011216: */
+ 0, /* U+011217: */
+ 0, /* U+011218: */
+ 0, /* U+011219: */
+ 0, /* U+01121a: */
+ 0, /* U+01121b: */
+ 0, /* U+01121c: */
+ 0, /* U+01121d: */
+ 0, /* U+01121e: */
+ 0, /* U+01121f: */
+ 0, /* U+011220: */
+ 0, /* U+011221: */
+ 0, /* U+011222: */
+ 0, /* U+011223: */
+ 0, /* U+011224: */
+ 0, /* U+011225: */
+ 0, /* U+011226: */
+ 0, /* U+011227: */
+ 0, /* U+011228: */
+ 0, /* U+011229: */
+ 0, /* U+01122a: */
+ 0, /* U+01122b: */
+ 0, /* U+01122c: */
+ 0, /* U+01122d: */
+ 0, /* U+01122e: */
+ 0, /* U+01122f: */
+ 0, /* U+011230: */
+ 0, /* U+011231: */
+ 0, /* U+011232: */
+ 0, /* U+011233: */
+ 0, /* U+011234: */
+ 0, /* U+011235: */
+ 0, /* U+011236: */
+ 0, /* U+011237: */
+ 0, /* U+011238: */
+ 0, /* U+011239: */
+ 0, /* U+01123a: */
+ 0, /* U+01123b: */
+ 0, /* U+01123c: */
+ 0, /* U+01123d: */
+ 0, /* U+01123e: */
+ 0, /* U+01123f: */
+ 0, /* U+011240: */
+ 0, /* U+011241: */
+ 0, /* U+011242: */
+ 0, /* U+011243: */
+ 0, /* U+011244: */
+ 0, /* U+011245: */
+ 0, /* U+011246: */
+ 0, /* U+011247: */
+ 0, /* U+011248: */
+ 0, /* U+011249: */
+ 0, /* U+01124a: */
+ 0, /* U+01124b: */
+ 0, /* U+01124c: */
+ 0, /* U+01124d: */
+ 0, /* U+01124e: */
+ 0, /* U+01124f: */
+ 0, /* U+011250: */
+ 0, /* U+011251: */
+ 0, /* U+011252: */
+ 0, /* U+011253: */
+ 0, /* U+011254: */
+ 0, /* U+011255: */
+ 0, /* U+011256: */
+ 0, /* U+011257: */
+ 0, /* U+011258: */
+ 0, /* U+011259: */
+ 0, /* U+01125a: */
+ 0, /* U+01125b: */
+ 0, /* U+01125c: */
+ 0, /* U+01125d: */
+ 0, /* U+01125e: */
+ 0, /* U+01125f: */
+ 0, /* U+011260: */
+ 0, /* U+011261: */
+ 0, /* U+011262: */
+ 0, /* U+011263: */
+ 0, /* U+011264: */
+ 0, /* U+011265: */
+ 0, /* U+011266: */
+ 0, /* U+011267: */
+ 0, /* U+011268: */
+ 0, /* U+011269: */
+ 0, /* U+01126a: */
+ 0, /* U+01126b: */
+ 0, /* U+01126c: */
+ 0, /* U+01126d: */
+ 0, /* U+01126e: */
+ 0, /* U+01126f: */
+ 0, /* U+011270: */
+ 0, /* U+011271: */
+ 0, /* U+011272: */
+ 0, /* U+011273: */
+ 0, /* U+011274: */
+ 0, /* U+011275: */
+ 0, /* U+011276: */
+ 0, /* U+011277: */
+ 0, /* U+011278: */
+ 0, /* U+011279: */
+ 0, /* U+01127a: */
+ 0, /* U+01127b: */
+ 0, /* U+01127c: */
+ 0, /* U+01127d: */
+ 0, /* U+01127e: */
+ 0, /* U+01127f: */
+ 0, /* U+011280: */
+ 0, /* U+011281: */
+ 0, /* U+011282: */
+ 0, /* U+011283: */
+ 0, /* U+011284: */
+ 0, /* U+011285: */
+ 0, /* U+011286: */
+ 0, /* U+011287: */
+ 0, /* U+011288: */
+ 0, /* U+011289: */
+ 0, /* U+01128a: */
+ 0, /* U+01128b: */
+ 0, /* U+01128c: */
+ 0, /* U+01128d: */
+ 0, /* U+01128e: */
+ 0, /* U+01128f: */
+ 0, /* U+011290: */
+ 0, /* U+011291: */
+ 0, /* U+011292: */
+ 0, /* U+011293: */
+ 0, /* U+011294: */
+ 0, /* U+011295: */
+ 0, /* U+011296: */
+ 0, /* U+011297: */
+ 0, /* U+011298: */
+ 0, /* U+011299: */
+ 0, /* U+01129a: */
+ 0, /* U+01129b: */
+ 0, /* U+01129c: */
+ 0, /* U+01129d: */
+ 0, /* U+01129e: */
+ 0, /* U+01129f: */
+ 0, /* U+0112a0: */
+ 0, /* U+0112a1: */
+ 0, /* U+0112a2: */
+ 0, /* U+0112a3: */
+ 0, /* U+0112a4: */
+ 0, /* U+0112a5: */
+ 0, /* U+0112a6: */
+ 0, /* U+0112a7: */
+ 0, /* U+0112a8: */
+ 0, /* U+0112a9: */
+ 0, /* U+0112aa: */
+ 0, /* U+0112ab: */
+ 0, /* U+0112ac: */
+ 0, /* U+0112ad: */
+ 0, /* U+0112ae: */
+ 0, /* U+0112af: */
+ 0, /* U+0112b0: */
+ 0, /* U+0112b1: */
+ 0, /* U+0112b2: */
+ 0, /* U+0112b3: */
+ 0, /* U+0112b4: */
+ 0, /* U+0112b5: */
+ 0, /* U+0112b6: */
+ 0, /* U+0112b7: */
+ 0, /* U+0112b8: */
+ 0, /* U+0112b9: */
+ 0, /* U+0112ba: */
+ 0, /* U+0112bb: */
+ 0, /* U+0112bc: */
+ 0, /* U+0112bd: */
+ 0, /* U+0112be: */
+ 0, /* U+0112bf: */
+ 0, /* U+0112c0: */
+ 0, /* U+0112c1: */
+ 0, /* U+0112c2: */
+ 0, /* U+0112c3: */
+ 0, /* U+0112c4: */
+ 0, /* U+0112c5: */
+ 0, /* U+0112c6: */
+ 0, /* U+0112c7: */
+ 0, /* U+0112c8: */
+ 0, /* U+0112c9: */
+ 0, /* U+0112ca: */
+ 0, /* U+0112cb: */
+ 0, /* U+0112cc: */
+ 0, /* U+0112cd: */
+ 0, /* U+0112ce: */
+ 0, /* U+0112cf: */
+ 0, /* U+0112d0: */
+ 0, /* U+0112d1: */
+ 0, /* U+0112d2: */
+ 0, /* U+0112d3: */
+ 0, /* U+0112d4: */
+ 0, /* U+0112d5: */
+ 0, /* U+0112d6: */
+ 0, /* U+0112d7: */
+ 0, /* U+0112d8: */
+ 0, /* U+0112d9: */
+ 0, /* U+0112da: */
+ 0, /* U+0112db: */
+ 0, /* U+0112dc: */
+ 0, /* U+0112dd: */
+ 0, /* U+0112de: */
+ 0, /* U+0112df: */
+ 0, /* U+0112e0: */
+ 0, /* U+0112e1: */
+ 0, /* U+0112e2: */
+ 0, /* U+0112e3: */
+ 0, /* U+0112e4: */
+ 0, /* U+0112e5: */
+ 0, /* U+0112e6: */
+ 0, /* U+0112e7: */
+ 0, /* U+0112e8: */
+ 0, /* U+0112e9: */
+ 0, /* U+0112ea: */
+ 0, /* U+0112eb: */
+ 0, /* U+0112ec: */
+ 0, /* U+0112ed: */
+ 0, /* U+0112ee: */
+ 0, /* U+0112ef: */
+ 0, /* U+0112f0: */
+ 0, /* U+0112f1: */
+ 0, /* U+0112f2: */
+ 0, /* U+0112f3: */
+ 0, /* U+0112f4: */
+ 0, /* U+0112f5: */
+ 0, /* U+0112f6: */
+ 0, /* U+0112f7: */
+ 0, /* U+0112f8: */
+ 0, /* U+0112f9: */
+ 0, /* U+0112fa: */
+ 0, /* U+0112fb: */
+ 0, /* U+0112fc: */
+ 0, /* U+0112fd: */
+ 0, /* U+0112fe: */
+ 0, /* U+0112ff: */
+ 0, /* U+011300: */
+ 0, /* U+011301: */
+ 0, /* U+011302: */
+ 0, /* U+011303: */
+ 0, /* U+011304: */
+ 0, /* U+011305: */
+ 0, /* U+011306: */
+ 0, /* U+011307: */
+ 0, /* U+011308: */
+ 0, /* U+011309: */
+ 0, /* U+01130a: */
+ 0, /* U+01130b: */
+ 0, /* U+01130c: */
+ 0, /* U+01130d: */
+ 0, /* U+01130e: */
+ 0, /* U+01130f: */
+ 0, /* U+011310: */
+ 0, /* U+011311: */
+ 0, /* U+011312: */
+ 0, /* U+011313: */
+ 0, /* U+011314: */
+ 0, /* U+011315: */
+ 0, /* U+011316: */
+ 0, /* U+011317: */
+ 0, /* U+011318: */
+ 0, /* U+011319: */
+ 0, /* U+01131a: */
+ 0, /* U+01131b: */
+ 0, /* U+01131c: */
+ 0, /* U+01131d: */
+ 0, /* U+01131e: */
+ 0, /* U+01131f: */
+ 0, /* U+011320: */
+ 0, /* U+011321: */
+ 0, /* U+011322: */
+ 0, /* U+011323: */
+ 0, /* U+011324: */
+ 0, /* U+011325: */
+ 0, /* U+011326: */
+ 0, /* U+011327: */
+ 0, /* U+011328: */
+ 0, /* U+011329: */
+ 0, /* U+01132a: */
+ 0, /* U+01132b: */
+ 0, /* U+01132c: */
+ 0, /* U+01132d: */
+ 0, /* U+01132e: */
+ 0, /* U+01132f: */
+ 0, /* U+011330: */
+ 0, /* U+011331: */
+ 0, /* U+011332: */
+ 0, /* U+011333: */
+ 0, /* U+011334: */
+ 0, /* U+011335: */
+ 0, /* U+011336: */
+ 0, /* U+011337: */
+ 0, /* U+011338: */
+ 0, /* U+011339: */
+ 0, /* U+01133a: */
+ 0, /* U+01133b: */
+ 0, /* U+01133c: */
+ 0, /* U+01133d: */
+ 0, /* U+01133e: */
+ 0, /* U+01133f: */
+ 0, /* U+011340: */
+ 0, /* U+011341: */
+ 0, /* U+011342: */
+ 0, /* U+011343: */
+ 0, /* U+011344: */
+ 0, /* U+011345: */
+ 0, /* U+011346: */
+ 0, /* U+011347: */
+ 0, /* U+011348: */
+ 0, /* U+011349: */
+ 0, /* U+01134a: */
+ 0, /* U+01134b: */
+ 0, /* U+01134c: */
+ 0, /* U+01134d: */
+ 0, /* U+01134e: */
+ 0, /* U+01134f: */
+ 0, /* U+011350: */
+ 0, /* U+011351: */
+ 0, /* U+011352: */
+ 0, /* U+011353: */
+ 0, /* U+011354: */
+ 0, /* U+011355: */
+ 0, /* U+011356: */
+ 0, /* U+011357: */
+ 0, /* U+011358: */
+ 0, /* U+011359: */
+ 0, /* U+01135a: */
+ 0, /* U+01135b: */
+ 0, /* U+01135c: */
+ 0, /* U+01135d: */
+ 0, /* U+01135e: */
+ 0, /* U+01135f: */
+ 0, /* U+011360: */
+ 0, /* U+011361: */
+ 0, /* U+011362: */
+ 0, /* U+011363: */
+ 0, /* U+011364: */
+ 0, /* U+011365: */
+ 0, /* U+011366: */
+ 0, /* U+011367: */
+ 0, /* U+011368: */
+ 0, /* U+011369: */
+ 0, /* U+01136a: */
+ 0, /* U+01136b: */
+ 0, /* U+01136c: */
+ 0, /* U+01136d: */
+ 0, /* U+01136e: */
+ 0, /* U+01136f: */
+ 0, /* U+011370: */
+ 0, /* U+011371: */
+ 0, /* U+011372: */
+ 0, /* U+011373: */
+ 0, /* U+011374: */
+ 0, /* U+011375: */
+ 0, /* U+011376: */
+ 0, /* U+011377: */
+ 0, /* U+011378: */
+ 0, /* U+011379: */
+ 0, /* U+01137a: */
+ 0, /* U+01137b: */
+ 0, /* U+01137c: */
+ 0, /* U+01137d: */
+ 0, /* U+01137e: */
+ 0, /* U+01137f: */
+ 0, /* U+011380: */
+ 0, /* U+011381: */
+ 0, /* U+011382: */
+ 0, /* U+011383: */
+ 0, /* U+011384: */
+ 0, /* U+011385: */
+ 0, /* U+011386: */
+ 0, /* U+011387: */
+ 0, /* U+011388: */
+ 0, /* U+011389: */
+ 0, /* U+01138a: */
+ 0, /* U+01138b: */
+ 0, /* U+01138c: */
+ 0, /* U+01138d: */
+ 0, /* U+01138e: */
+ 0, /* U+01138f: */
+ 0, /* U+011390: */
+ 0, /* U+011391: */
+ 0, /* U+011392: */
+ 0, /* U+011393: */
+ 0, /* U+011394: */
+ 0, /* U+011395: */
+ 0, /* U+011396: */
+ 0, /* U+011397: */
+ 0, /* U+011398: */
+ 0, /* U+011399: */
+ 0, /* U+01139a: */
+ 0, /* U+01139b: */
+ 0, /* U+01139c: */
+ 0, /* U+01139d: */
+ 0, /* U+01139e: */
+ 0, /* U+01139f: */
+ 0, /* U+0113a0: */
+ 0, /* U+0113a1: */
+ 0, /* U+0113a2: */
+ 0, /* U+0113a3: */
+ 0, /* U+0113a4: */
+ 0, /* U+0113a5: */
+ 0, /* U+0113a6: */
+ 0, /* U+0113a7: */
+ 0, /* U+0113a8: */
+ 0, /* U+0113a9: */
+ 0, /* U+0113aa: */
+ 0, /* U+0113ab: */
+ 0, /* U+0113ac: */
+ 0, /* U+0113ad: */
+ 0, /* U+0113ae: */
+ 0, /* U+0113af: */
+ 0, /* U+0113b0: */
+ 0, /* U+0113b1: */
+ 0, /* U+0113b2: */
+ 0, /* U+0113b3: */
+ 0, /* U+0113b4: */
+ 0, /* U+0113b5: */
+ 0, /* U+0113b6: */
+ 0, /* U+0113b7: */
+ 0, /* U+0113b8: */
+ 0, /* U+0113b9: */
+ 0, /* U+0113ba: */
+ 0, /* U+0113bb: */
+ 0, /* U+0113bc: */
+ 0, /* U+0113bd: */
+ 0, /* U+0113be: */
+ 0, /* U+0113bf: */
+ 0, /* U+0113c0: */
+ 0, /* U+0113c1: */
+ 0, /* U+0113c2: */
+ 0, /* U+0113c3: */
+ 0, /* U+0113c4: */
+ 0, /* U+0113c5: */
+ 0, /* U+0113c6: */
+ 0, /* U+0113c7: */
+ 0, /* U+0113c8: */
+ 0, /* U+0113c9: */
+ 0, /* U+0113ca: */
+ 0, /* U+0113cb: */
+ 0, /* U+0113cc: */
+ 0, /* U+0113cd: */
+ 0, /* U+0113ce: */
+ 0, /* U+0113cf: */
+ 0, /* U+0113d0: */
+ 0, /* U+0113d1: */
+ 0, /* U+0113d2: */
+ 0, /* U+0113d3: */
+ 0, /* U+0113d4: */
+ 0, /* U+0113d5: */
+ 0, /* U+0113d6: */
+ 0, /* U+0113d7: */
+ 0, /* U+0113d8: */
+ 0, /* U+0113d9: */
+ 0, /* U+0113da: */
+ 0, /* U+0113db: */
+ 0, /* U+0113dc: */
+ 0, /* U+0113dd: */
+ 0, /* U+0113de: */
+ 0, /* U+0113df: */
+ 0, /* U+0113e0: */
+ 0, /* U+0113e1: */
+ 0, /* U+0113e2: */
+ 0, /* U+0113e3: */
+ 0, /* U+0113e4: */
+ 0, /* U+0113e5: */
+ 0, /* U+0113e6: */
+ 0, /* U+0113e7: */
+ 0, /* U+0113e8: */
+ 0, /* U+0113e9: */
+ 0, /* U+0113ea: */
+ 0, /* U+0113eb: */
+ 0, /* U+0113ec: */
+ 0, /* U+0113ed: */
+ 0, /* U+0113ee: */
+ 0, /* U+0113ef: */
+ 0, /* U+0113f0: */
+ 0, /* U+0113f1: */
+ 0, /* U+0113f2: */
+ 0, /* U+0113f3: */
+ 0, /* U+0113f4: */
+ 0, /* U+0113f5: */
+ 0, /* U+0113f6: */
+ 0, /* U+0113f7: */
+ 0, /* U+0113f8: */
+ 0, /* U+0113f9: */
+ 0, /* U+0113fa: */
+ 0, /* U+0113fb: */
+ 0, /* U+0113fc: */
+ 0, /* U+0113fd: */
+ 0, /* U+0113fe: */
+ 0, /* U+0113ff: */
+ 0, /* U+011400: */
+ 0, /* U+011401: */
+ 0, /* U+011402: */
+ 0, /* U+011403: */
+ 0, /* U+011404: */
+ 0, /* U+011405: */
+ 0, /* U+011406: */
+ 0, /* U+011407: */
+ 0, /* U+011408: */
+ 0, /* U+011409: */
+ 0, /* U+01140a: */
+ 0, /* U+01140b: */
+ 0, /* U+01140c: */
+ 0, /* U+01140d: */
+ 0, /* U+01140e: */
+ 0, /* U+01140f: */
+ 0, /* U+011410: */
+ 0, /* U+011411: */
+ 0, /* U+011412: */
+ 0, /* U+011413: */
+ 0, /* U+011414: */
+ 0, /* U+011415: */
+ 0, /* U+011416: */
+ 0, /* U+011417: */
+ 0, /* U+011418: */
+ 0, /* U+011419: */
+ 0, /* U+01141a: */
+ 0, /* U+01141b: */
+ 0, /* U+01141c: */
+ 0, /* U+01141d: */
+ 0, /* U+01141e: */
+ 0, /* U+01141f: */
+ 0, /* U+011420: */
+ 0, /* U+011421: */
+ 0, /* U+011422: */
+ 0, /* U+011423: */
+ 0, /* U+011424: */
+ 0, /* U+011425: */
+ 0, /* U+011426: */
+ 0, /* U+011427: */
+ 0, /* U+011428: */
+ 0, /* U+011429: */
+ 0, /* U+01142a: */
+ 0, /* U+01142b: */
+ 0, /* U+01142c: */
+ 0, /* U+01142d: */
+ 0, /* U+01142e: */
+ 0, /* U+01142f: */
+ 0, /* U+011430: */
+ 0, /* U+011431: */
+ 0, /* U+011432: */
+ 0, /* U+011433: */
+ 0, /* U+011434: */
+ 0, /* U+011435: */
+ 0, /* U+011436: */
+ 0, /* U+011437: */
+ 0, /* U+011438: */
+ 0, /* U+011439: */
+ 0, /* U+01143a: */
+ 0, /* U+01143b: */
+ 0, /* U+01143c: */
+ 0, /* U+01143d: */
+ 0, /* U+01143e: */
+ 0, /* U+01143f: */
+ 0, /* U+011440: */
+ 0, /* U+011441: */
+ 0, /* U+011442: */
+ 0, /* U+011443: */
+ 0, /* U+011444: */
+ 0, /* U+011445: */
+ 0, /* U+011446: */
+ 0, /* U+011447: */
+ 0, /* U+011448: */
+ 0, /* U+011449: */
+ 0, /* U+01144a: */
+ 0, /* U+01144b: */
+ 0, /* U+01144c: */
+ 0, /* U+01144d: */
+ 0, /* U+01144e: */
+ 0, /* U+01144f: */
+ 0, /* U+011450: */
+ 0, /* U+011451: */
+ 0, /* U+011452: */
+ 0, /* U+011453: */
+ 0, /* U+011454: */
+ 0, /* U+011455: */
+ 0, /* U+011456: */
+ 0, /* U+011457: */
+ 0, /* U+011458: */
+ 0, /* U+011459: */
+ 0, /* U+01145a: */
+ 0, /* U+01145b: */
+ 0, /* U+01145c: */
+ 0, /* U+01145d: */
+ 0, /* U+01145e: */
+ 0, /* U+01145f: */
+ 0, /* U+011460: */
+ 0, /* U+011461: */
+ 0, /* U+011462: */
+ 0, /* U+011463: */
+ 0, /* U+011464: */
+ 0, /* U+011465: */
+ 0, /* U+011466: */
+ 0, /* U+011467: */
+ 0, /* U+011468: */
+ 0, /* U+011469: */
+ 0, /* U+01146a: */
+ 0, /* U+01146b: */
+ 0, /* U+01146c: */
+ 0, /* U+01146d: */
+ 0, /* U+01146e: */
+ 0, /* U+01146f: */
+ 0, /* U+011470: */
+ 0, /* U+011471: */
+ 0, /* U+011472: */
+ 0, /* U+011473: */
+ 0, /* U+011474: */
+ 0, /* U+011475: */
+ 0, /* U+011476: */
+ 0, /* U+011477: */
+ 0, /* U+011478: */
+ 0, /* U+011479: */
+ 0, /* U+01147a: */
+ 0, /* U+01147b: */
+ 0, /* U+01147c: */
+ 0, /* U+01147d: */
+ 0, /* U+01147e: */
+ 0, /* U+01147f: */
+ 0, /* U+011480: */
+ 0, /* U+011481: */
+ 0, /* U+011482: */
+ 0, /* U+011483: */
+ 0, /* U+011484: */
+ 0, /* U+011485: */
+ 0, /* U+011486: */
+ 0, /* U+011487: */
+ 0, /* U+011488: */
+ 0, /* U+011489: */
+ 0, /* U+01148a: */
+ 0, /* U+01148b: */
+ 0, /* U+01148c: */
+ 0, /* U+01148d: */
+ 0, /* U+01148e: */
+ 0, /* U+01148f: */
+ 0, /* U+011490: */
+ 0, /* U+011491: */
+ 0, /* U+011492: */
+ 0, /* U+011493: */
+ 0, /* U+011494: */
+ 0, /* U+011495: */
+ 0, /* U+011496: */
+ 0, /* U+011497: */
+ 0, /* U+011498: */
+ 0, /* U+011499: */
+ 0, /* U+01149a: */
+ 0, /* U+01149b: */
+ 0, /* U+01149c: */
+ 0, /* U+01149d: */
+ 0, /* U+01149e: */
+ 0, /* U+01149f: */
+ 0, /* U+0114a0: */
+ 0, /* U+0114a1: */
+ 0, /* U+0114a2: */
+ 0, /* U+0114a3: */
+ 0, /* U+0114a4: */
+ 0, /* U+0114a5: */
+ 0, /* U+0114a6: */
+ 0, /* U+0114a7: */
+ 0, /* U+0114a8: */
+ 0, /* U+0114a9: */
+ 0, /* U+0114aa: */
+ 0, /* U+0114ab: */
+ 0, /* U+0114ac: */
+ 0, /* U+0114ad: */
+ 0, /* U+0114ae: */
+ 0, /* U+0114af: */
+ 0, /* U+0114b0: */
+ 0, /* U+0114b1: */
+ 0, /* U+0114b2: */
+ 0, /* U+0114b3: */
+ 0, /* U+0114b4: */
+ 0, /* U+0114b5: */
+ 0, /* U+0114b6: */
+ 0, /* U+0114b7: */
+ 0, /* U+0114b8: */
+ 0, /* U+0114b9: */
+ 0, /* U+0114ba: */
+ 0, /* U+0114bb: */
+ 0, /* U+0114bc: */
+ 0, /* U+0114bd: */
+ 0, /* U+0114be: */
+ 0, /* U+0114bf: */
+ 0, /* U+0114c0: */
+ 0, /* U+0114c1: */
+ 0, /* U+0114c2: */
+ 0, /* U+0114c3: */
+ 0, /* U+0114c4: */
+ 0, /* U+0114c5: */
+ 0, /* U+0114c6: */
+ 0, /* U+0114c7: */
+ 0, /* U+0114c8: */
+ 0, /* U+0114c9: */
+ 0, /* U+0114ca: */
+ 0, /* U+0114cb: */
+ 0, /* U+0114cc: */
+ 0, /* U+0114cd: */
+ 0, /* U+0114ce: */
+ 0, /* U+0114cf: */
+ 0, /* U+0114d0: */
+ 0, /* U+0114d1: */
+ 0, /* U+0114d2: */
+ 0, /* U+0114d3: */
+ 0, /* U+0114d4: */
+ 0, /* U+0114d5: */
+ 0, /* U+0114d6: */
+ 0, /* U+0114d7: */
+ 0, /* U+0114d8: */
+ 0, /* U+0114d9: */
+ 0, /* U+0114da: */
+ 0, /* U+0114db: */
+ 0, /* U+0114dc: */
+ 0, /* U+0114dd: */
+ 0, /* U+0114de: */
+ 0, /* U+0114df: */
+ 0, /* U+0114e0: */
+ 0, /* U+0114e1: */
+ 0, /* U+0114e2: */
+ 0, /* U+0114e3: */
+ 0, /* U+0114e4: */
+ 0, /* U+0114e5: */
+ 0, /* U+0114e6: */
+ 0, /* U+0114e7: */
+ 0, /* U+0114e8: */
+ 0, /* U+0114e9: */
+ 0, /* U+0114ea: */
+ 0, /* U+0114eb: */
+ 0, /* U+0114ec: */
+ 0, /* U+0114ed: */
+ 0, /* U+0114ee: */
+ 0, /* U+0114ef: */
+ 0, /* U+0114f0: */
+ 0, /* U+0114f1: */
+ 0, /* U+0114f2: */
+ 0, /* U+0114f3: */
+ 0, /* U+0114f4: */
+ 0, /* U+0114f5: */
+ 0, /* U+0114f6: */
+ 0, /* U+0114f7: */
+ 0, /* U+0114f8: */
+ 0, /* U+0114f9: */
+ 0, /* U+0114fa: */
+ 0, /* U+0114fb: */
+ 0, /* U+0114fc: */
+ 0, /* U+0114fd: */
+ 0, /* U+0114fe: */
+ 0, /* U+0114ff: */
+ 0, /* U+011500: */
+ 0, /* U+011501: */
+ 0, /* U+011502: */
+ 0, /* U+011503: */
+ 0, /* U+011504: */
+ 0, /* U+011505: */
+ 0, /* U+011506: */
+ 0, /* U+011507: */
+ 0, /* U+011508: */
+ 0, /* U+011509: */
+ 0, /* U+01150a: */
+ 0, /* U+01150b: */
+ 0, /* U+01150c: */
+ 0, /* U+01150d: */
+ 0, /* U+01150e: */
+ 0, /* U+01150f: */
+ 0, /* U+011510: */
+ 0, /* U+011511: */
+ 0, /* U+011512: */
+ 0, /* U+011513: */
+ 0, /* U+011514: */
+ 0, /* U+011515: */
+ 0, /* U+011516: */
+ 0, /* U+011517: */
+ 0, /* U+011518: */
+ 0, /* U+011519: */
+ 0, /* U+01151a: */
+ 0, /* U+01151b: */
+ 0, /* U+01151c: */
+ 0, /* U+01151d: */
+ 0, /* U+01151e: */
+ 0, /* U+01151f: */
+ 0, /* U+011520: */
+ 0, /* U+011521: */
+ 0, /* U+011522: */
+ 0, /* U+011523: */
+ 0, /* U+011524: */
+ 0, /* U+011525: */
+ 0, /* U+011526: */
+ 0, /* U+011527: */
+ 0, /* U+011528: */
+ 0, /* U+011529: */
+ 0, /* U+01152a: */
+ 0, /* U+01152b: */
+ 0, /* U+01152c: */
+ 0, /* U+01152d: */
+ 0, /* U+01152e: */
+ 0, /* U+01152f: */
+ 0, /* U+011530: */
+ 0, /* U+011531: */
+ 0, /* U+011532: */
+ 0, /* U+011533: */
+ 0, /* U+011534: */
+ 0, /* U+011535: */
+ 0, /* U+011536: */
+ 0, /* U+011537: */
+ 0, /* U+011538: */
+ 0, /* U+011539: */
+ 0, /* U+01153a: */
+ 0, /* U+01153b: */
+ 0, /* U+01153c: */
+ 0, /* U+01153d: */
+ 0, /* U+01153e: */
+ 0, /* U+01153f: */
+ 0, /* U+011540: */
+ 0, /* U+011541: */
+ 0, /* U+011542: */
+ 0, /* U+011543: */
+ 0, /* U+011544: */
+ 0, /* U+011545: */
+ 0, /* U+011546: */
+ 0, /* U+011547: */
+ 0, /* U+011548: */
+ 0, /* U+011549: */
+ 0, /* U+01154a: */
+ 0, /* U+01154b: */
+ 0, /* U+01154c: */
+ 0, /* U+01154d: */
+ 0, /* U+01154e: */
+ 0, /* U+01154f: */
+ 0, /* U+011550: */
+ 0, /* U+011551: */
+ 0, /* U+011552: */
+ 0, /* U+011553: */
+ 0, /* U+011554: */
+ 0, /* U+011555: */
+ 0, /* U+011556: */
+ 0, /* U+011557: */
+ 0, /* U+011558: */
+ 0, /* U+011559: */
+ 0, /* U+01155a: */
+ 0, /* U+01155b: */
+ 0, /* U+01155c: */
+ 0, /* U+01155d: */
+ 0, /* U+01155e: */
+ 0, /* U+01155f: */
+ 0, /* U+011560: */
+ 0, /* U+011561: */
+ 0, /* U+011562: */
+ 0, /* U+011563: */
+ 0, /* U+011564: */
+ 0, /* U+011565: */
+ 0, /* U+011566: */
+ 0, /* U+011567: */
+ 0, /* U+011568: */
+ 0, /* U+011569: */
+ 0, /* U+01156a: */
+ 0, /* U+01156b: */
+ 0, /* U+01156c: */
+ 0, /* U+01156d: */
+ 0, /* U+01156e: */
+ 0, /* U+01156f: */
+ 0, /* U+011570: */
+ 0, /* U+011571: */
+ 0, /* U+011572: */
+ 0, /* U+011573: */
+ 0, /* U+011574: */
+ 0, /* U+011575: */
+ 0, /* U+011576: */
+ 0, /* U+011577: */
+ 0, /* U+011578: */
+ 0, /* U+011579: */
+ 0, /* U+01157a: */
+ 0, /* U+01157b: */
+ 0, /* U+01157c: */
+ 0, /* U+01157d: */
+ 0, /* U+01157e: */
+ 0, /* U+01157f: */
+ 0, /* U+011580: */
+ 0, /* U+011581: */
+ 0, /* U+011582: */
+ 0, /* U+011583: */
+ 0, /* U+011584: */
+ 0, /* U+011585: */
+ 0, /* U+011586: */
+ 0, /* U+011587: */
+ 0, /* U+011588: */
+ 0, /* U+011589: */
+ 0, /* U+01158a: */
+ 0, /* U+01158b: */
+ 0, /* U+01158c: */
+ 0, /* U+01158d: */
+ 0, /* U+01158e: */
+ 0, /* U+01158f: */
+ 0, /* U+011590: */
+ 0, /* U+011591: */
+ 0, /* U+011592: */
+ 0, /* U+011593: */
+ 0, /* U+011594: */
+ 0, /* U+011595: */
+ 0, /* U+011596: */
+ 0, /* U+011597: */
+ 0, /* U+011598: */
+ 0, /* U+011599: */
+ 0, /* U+01159a: */
+ 0, /* U+01159b: */
+ 0, /* U+01159c: */
+ 0, /* U+01159d: */
+ 0, /* U+01159e: */
+ 0, /* U+01159f: */
+ 0, /* U+0115a0: */
+ 0, /* U+0115a1: */
+ 0, /* U+0115a2: */
+ 0, /* U+0115a3: */
+ 0, /* U+0115a4: */
+ 0, /* U+0115a5: */
+ 0, /* U+0115a6: */
+ 0, /* U+0115a7: */
+ 0, /* U+0115a8: */
+ 0, /* U+0115a9: */
+ 0, /* U+0115aa: */
+ 0, /* U+0115ab: */
+ 0, /* U+0115ac: */
+ 0, /* U+0115ad: */
+ 0, /* U+0115ae: */
+ 0, /* U+0115af: */
+ 0, /* U+0115b0: */
+ 0, /* U+0115b1: */
+ 0, /* U+0115b2: */
+ 0, /* U+0115b3: */
+ 0, /* U+0115b4: */
+ 0, /* U+0115b5: */
+ 0, /* U+0115b6: */
+ 0, /* U+0115b7: */
+ 0, /* U+0115b8: */
+ 0, /* U+0115b9: */
+ 0, /* U+0115ba: */
+ 0, /* U+0115bb: */
+ 0, /* U+0115bc: */
+ 0, /* U+0115bd: */
+ 0, /* U+0115be: */
+ 0, /* U+0115bf: */
+ 0, /* U+0115c0: */
+ 0, /* U+0115c1: */
+ 0, /* U+0115c2: */
+ 0, /* U+0115c3: */
+ 0, /* U+0115c4: */
+ 0, /* U+0115c5: */
+ 0, /* U+0115c6: */
+ 0, /* U+0115c7: */
+ 0, /* U+0115c8: */
+ 0, /* U+0115c9: */
+ 0, /* U+0115ca: */
+ 0, /* U+0115cb: */
+ 0, /* U+0115cc: */
+ 0, /* U+0115cd: */
+ 0, /* U+0115ce: */
+ 0, /* U+0115cf: */
+ 0, /* U+0115d0: */
+ 0, /* U+0115d1: */
+ 0, /* U+0115d2: */
+ 0, /* U+0115d3: */
+ 0, /* U+0115d4: */
+ 0, /* U+0115d5: */
+ 0, /* U+0115d6: */
+ 0, /* U+0115d7: */
+ 0, /* U+0115d8: */
+ 0, /* U+0115d9: */
+ 0, /* U+0115da: */
+ 0, /* U+0115db: */
+ 0, /* U+0115dc: */
+ 0, /* U+0115dd: */
+ 0, /* U+0115de: */
+ 0, /* U+0115df: */
+ 0, /* U+0115e0: */
+ 0, /* U+0115e1: */
+ 0, /* U+0115e2: */
+ 0, /* U+0115e3: */
+ 0, /* U+0115e4: */
+ 0, /* U+0115e5: */
+ 0, /* U+0115e6: */
+ 0, /* U+0115e7: */
+ 0, /* U+0115e8: */
+ 0, /* U+0115e9: */
+ 0, /* U+0115ea: */
+ 0, /* U+0115eb: */
+ 0, /* U+0115ec: */
+ 0, /* U+0115ed: */
+ 0, /* U+0115ee: */
+ 0, /* U+0115ef: */
+ 0, /* U+0115f0: */
+ 0, /* U+0115f1: */
+ 0, /* U+0115f2: */
+ 0, /* U+0115f3: */
+ 0, /* U+0115f4: */
+ 0, /* U+0115f5: */
+ 0, /* U+0115f6: */
+ 0, /* U+0115f7: */
+ 0, /* U+0115f8: */
+ 0, /* U+0115f9: */
+ 0, /* U+0115fa: */
+ 0, /* U+0115fb: */
+ 0, /* U+0115fc: */
+ 0, /* U+0115fd: */
+ 0, /* U+0115fe: */
+ 0, /* U+0115ff: */
+ 0, /* U+011600: */
+ 0, /* U+011601: */
+ 0, /* U+011602: */
+ 0, /* U+011603: */
+ 0, /* U+011604: */
+ 0, /* U+011605: */
+ 0, /* U+011606: */
+ 0, /* U+011607: */
+ 0, /* U+011608: */
+ 0, /* U+011609: */
+ 0, /* U+01160a: */
+ 0, /* U+01160b: */
+ 0, /* U+01160c: */
+ 0, /* U+01160d: */
+ 0, /* U+01160e: */
+ 0, /* U+01160f: */
+ 0, /* U+011610: */
+ 0, /* U+011611: */
+ 0, /* U+011612: */
+ 0, /* U+011613: */
+ 0, /* U+011614: */
+ 0, /* U+011615: */
+ 0, /* U+011616: */
+ 0, /* U+011617: */
+ 0, /* U+011618: */
+ 0, /* U+011619: */
+ 0, /* U+01161a: */
+ 0, /* U+01161b: */
+ 0, /* U+01161c: */
+ 0, /* U+01161d: */
+ 0, /* U+01161e: */
+ 0, /* U+01161f: */
+ 0, /* U+011620: */
+ 0, /* U+011621: */
+ 0, /* U+011622: */
+ 0, /* U+011623: */
+ 0, /* U+011624: */
+ 0, /* U+011625: */
+ 0, /* U+011626: */
+ 0, /* U+011627: */
+ 0, /* U+011628: */
+ 0, /* U+011629: */
+ 0, /* U+01162a: */
+ 0, /* U+01162b: */
+ 0, /* U+01162c: */
+ 0, /* U+01162d: */
+ 0, /* U+01162e: */
+ 0, /* U+01162f: */
+ 0, /* U+011630: */
+ 0, /* U+011631: */
+ 0, /* U+011632: */
+ 0, /* U+011633: */
+ 0, /* U+011634: */
+ 0, /* U+011635: */
+ 0, /* U+011636: */
+ 0, /* U+011637: */
+ 0, /* U+011638: */
+ 0, /* U+011639: */
+ 0, /* U+01163a: */
+ 0, /* U+01163b: */
+ 0, /* U+01163c: */
+ 0, /* U+01163d: */
+ 0, /* U+01163e: */
+ 0, /* U+01163f: */
+ 0, /* U+011640: */
+ 0, /* U+011641: */
+ 0, /* U+011642: */
+ 0, /* U+011643: */
+ 0, /* U+011644: */
+ 0, /* U+011645: */
+ 0, /* U+011646: */
+ 0, /* U+011647: */
+ 0, /* U+011648: */
+ 0, /* U+011649: */
+ 0, /* U+01164a: */
+ 0, /* U+01164b: */
+ 0, /* U+01164c: */
+ 0, /* U+01164d: */
+ 0, /* U+01164e: */
+ 0, /* U+01164f: */
+ 0, /* U+011650: */
+ 0, /* U+011651: */
+ 0, /* U+011652: */
+ 0, /* U+011653: */
+ 0, /* U+011654: */
+ 0, /* U+011655: */
+ 0, /* U+011656: */
+ 0, /* U+011657: */
+ 0, /* U+011658: */
+ 0, /* U+011659: */
+ 0, /* U+01165a: */
+ 0, /* U+01165b: */
+ 0, /* U+01165c: */
+ 0, /* U+01165d: */
+ 0, /* U+01165e: */
+ 0, /* U+01165f: */
+ 0, /* U+011660: */
+ 0, /* U+011661: */
+ 0, /* U+011662: */
+ 0, /* U+011663: */
+ 0, /* U+011664: */
+ 0, /* U+011665: */
+ 0, /* U+011666: */
+ 0, /* U+011667: */
+ 0, /* U+011668: */
+ 0, /* U+011669: */
+ 0, /* U+01166a: */
+ 0, /* U+01166b: */
+ 0, /* U+01166c: */
+ 0, /* U+01166d: */
+ 0, /* U+01166e: */
+ 0, /* U+01166f: */
+ 0, /* U+011670: */
+ 0, /* U+011671: */
+ 0, /* U+011672: */
+ 0, /* U+011673: */
+ 0, /* U+011674: */
+ 0, /* U+011675: */
+ 0, /* U+011676: */
+ 0, /* U+011677: */
+ 0, /* U+011678: */
+ 0, /* U+011679: */
+ 0, /* U+01167a: */
+ 0, /* U+01167b: */
+ 0, /* U+01167c: */
+ 0, /* U+01167d: */
+ 0, /* U+01167e: */
+ 0, /* U+01167f: */
+ RTUNI_ALPHA, /* U+011680: TAKRI LETTER A*/
+ RTUNI_ALPHA, /* U+011681: TAKRI LETTER AA*/
+ RTUNI_ALPHA, /* U+011682: TAKRI LETTER I*/
+ RTUNI_ALPHA, /* U+011683: TAKRI LETTER II*/
+ RTUNI_ALPHA, /* U+011684: TAKRI LETTER U*/
+ RTUNI_ALPHA, /* U+011685: TAKRI LETTER UU*/
+ RTUNI_ALPHA, /* U+011686: TAKRI LETTER E*/
+ RTUNI_ALPHA, /* U+011687: TAKRI LETTER AI*/
+ RTUNI_ALPHA, /* U+011688: TAKRI LETTER O*/
+ RTUNI_ALPHA, /* U+011689: TAKRI LETTER AU*/
+ RTUNI_ALPHA, /* U+01168a: TAKRI LETTER KA*/
+ RTUNI_ALPHA, /* U+01168b: TAKRI LETTER KHA*/
+ RTUNI_ALPHA, /* U+01168c: TAKRI LETTER GA*/
+ RTUNI_ALPHA, /* U+01168d: TAKRI LETTER GHA*/
+ RTUNI_ALPHA, /* U+01168e: TAKRI LETTER NGA*/
+ RTUNI_ALPHA, /* U+01168f: TAKRI LETTER CA*/
+ RTUNI_ALPHA, /* U+011690: TAKRI LETTER CHA*/
+ RTUNI_ALPHA, /* U+011691: TAKRI LETTER JA*/
+ RTUNI_ALPHA, /* U+011692: TAKRI LETTER JHA*/
+ RTUNI_ALPHA, /* U+011693: TAKRI LETTER NYA*/
+ RTUNI_ALPHA, /* U+011694: TAKRI LETTER TTA*/
+ RTUNI_ALPHA, /* U+011695: TAKRI LETTER TTHA*/
+ RTUNI_ALPHA, /* U+011696: TAKRI LETTER DDA*/
+ RTUNI_ALPHA, /* U+011697: TAKRI LETTER DDHA*/
+ RTUNI_ALPHA, /* U+011698: TAKRI LETTER NNA*/
+ RTUNI_ALPHA, /* U+011699: TAKRI LETTER TA*/
+ RTUNI_ALPHA, /* U+01169a: TAKRI LETTER THA*/
+ RTUNI_ALPHA, /* U+01169b: TAKRI LETTER DA*/
+ RTUNI_ALPHA, /* U+01169c: TAKRI LETTER DHA*/
+ RTUNI_ALPHA, /* U+01169d: TAKRI LETTER NA*/
+ RTUNI_ALPHA, /* U+01169e: TAKRI LETTER PA*/
+ RTUNI_ALPHA, /* U+01169f: TAKRI LETTER PHA*/
+ RTUNI_ALPHA, /* U+0116a0: TAKRI LETTER BA*/
+ RTUNI_ALPHA, /* U+0116a1: TAKRI LETTER BHA*/
+ RTUNI_ALPHA, /* U+0116a2: TAKRI LETTER MA*/
+ RTUNI_ALPHA, /* U+0116a3: TAKRI LETTER YA*/
+ RTUNI_ALPHA, /* U+0116a4: TAKRI LETTER RA*/
+ RTUNI_ALPHA, /* U+0116a5: TAKRI LETTER LA*/
+ RTUNI_ALPHA, /* U+0116a6: TAKRI LETTER VA*/
+ RTUNI_ALPHA, /* U+0116a7: TAKRI LETTER SHA*/
+ RTUNI_ALPHA, /* U+0116a8: TAKRI LETTER SA*/
+ RTUNI_ALPHA, /* U+0116a9: TAKRI LETTER HA*/
+ RTUNI_ALPHA, /* U+0116aa: TAKRI LETTER RRA*/
+ RTUNI_ALPHA, /* U+0116ab: TAKRI SIGN ANUSVARA*/
+ RTUNI_ALPHA, /* U+0116ac: TAKRI SIGN VISARGA*/
+ RTUNI_ALPHA, /* U+0116ad: TAKRI VOWEL SIGN AA*/
+ RTUNI_ALPHA, /* U+0116ae: TAKRI VOWEL SIGN I*/
+ RTUNI_ALPHA, /* U+0116af: TAKRI VOWEL SIGN II*/
+ RTUNI_ALPHA, /* U+0116b0: TAKRI VOWEL SIGN U*/
+ RTUNI_ALPHA, /* U+0116b1: TAKRI VOWEL SIGN UU*/
+ RTUNI_ALPHA, /* U+0116b2: TAKRI VOWEL SIGN E*/
+ RTUNI_ALPHA, /* U+0116b3: TAKRI VOWEL SIGN AI*/
+ RTUNI_ALPHA, /* U+0116b4: TAKRI VOWEL SIGN O*/
+ RTUNI_ALPHA, /* U+0116b5: TAKRI VOWEL SIGN AU*/
+ 0, /* U+0116b6: TAKRI SIGN VIRAMA*/
+ 0, /* U+0116b7: TAKRI SIGN NUKTA*/
+ 0, /* U+0116b8: */
+ 0, /* U+0116b9: */
+ 0, /* U+0116ba: */
+ 0, /* U+0116bb: */
+ 0, /* U+0116bc: */
+ 0, /* U+0116bd: */
+ 0, /* U+0116be: */
+ 0, /* U+0116bf: */
+ RTUNI_DDIGIT, /* U+0116c0: TAKRI DIGIT ZERO*/
+ RTUNI_DDIGIT, /* U+0116c1: TAKRI DIGIT ONE*/
+ RTUNI_DDIGIT, /* U+0116c2: TAKRI DIGIT TWO*/
+ RTUNI_DDIGIT, /* U+0116c3: TAKRI DIGIT THREE*/
+ RTUNI_DDIGIT, /* U+0116c4: TAKRI DIGIT FOUR*/
+ RTUNI_DDIGIT, /* U+0116c5: TAKRI DIGIT FIVE*/
+ RTUNI_DDIGIT, /* U+0116c6: TAKRI DIGIT SIX*/
+ RTUNI_DDIGIT, /* U+0116c7: TAKRI DIGIT SEVEN*/
+ RTUNI_DDIGIT, /* U+0116c8: TAKRI DIGIT EIGHT*/
+ RTUNI_DDIGIT, /* U+0116c9: TAKRI DIGIT NINE*/
+ 0, /* U+0116ca: */
+ 0, /* U+0116cb: */
+ 0, /* U+0116cc: */
+ 0, /* U+0116cd: */
+ 0, /* U+0116ce: */
+ 0, /* U+0116cf: */
+ 0, /* U+0116d0: */
+ 0, /* U+0116d1: */
+ 0, /* U+0116d2: */
+ 0, /* U+0116d3: */
+ 0, /* U+0116d4: */
+ 0, /* U+0116d5: */
+ 0, /* U+0116d6: */
+ 0, /* U+0116d7: */
+ 0, /* U+0116d8: */
+ 0, /* U+0116d9: */
+ 0, /* U+0116da: */
+ 0, /* U+0116db: */
+ 0, /* U+0116dc: */
+ 0, /* U+0116dd: */
+ 0, /* U+0116de: */
+ 0, /* U+0116df: */
+ 0, /* U+0116e0: */
+ 0, /* U+0116e1: */
+ 0, /* U+0116e2: */
+ 0, /* U+0116e3: */
+ 0, /* U+0116e4: */
+ 0, /* U+0116e5: */
+ 0, /* U+0116e6: */
+ 0, /* U+0116e7: */
+ 0, /* U+0116e8: */
+ 0, /* U+0116e9: */
+ 0, /* U+0116ea: */
+ 0, /* U+0116eb: */
+ 0, /* U+0116ec: */
+ 0, /* U+0116ed: */
+ 0, /* U+0116ee: */
+ 0, /* U+0116ef: */
+ 0, /* U+0116f0: */
+ 0, /* U+0116f1: */
+ 0, /* U+0116f2: */
+ 0, /* U+0116f3: */
+ 0, /* U+0116f4: */
+ 0, /* U+0116f5: */
+ 0, /* U+0116f6: */
+ 0, /* U+0116f7: */
+ 0, /* U+0116f8: */
+ 0, /* U+0116f9: */
+ 0, /* U+0116fa: */
+ 0, /* U+0116fb: */
+ 0, /* U+0116fc: */
+ 0, /* U+0116fd: */
+ 0, /* U+0116fe: */
+ 0, /* U+0116ff: */
+ 0, /* U+011700: */
+ 0, /* U+011701: */
+ 0, /* U+011702: */
+ 0, /* U+011703: */
+ 0, /* U+011704: */
+ 0, /* U+011705: */
+ 0, /* U+011706: */
+ 0, /* U+011707: */
+ 0, /* U+011708: */
+ 0, /* U+011709: */
+ 0, /* U+01170a: */
+ 0, /* U+01170b: */
+ 0, /* U+01170c: */
+ 0, /* U+01170d: */
+ 0, /* U+01170e: */
+ 0, /* U+01170f: */
+ 0, /* U+011710: */
+ 0, /* U+011711: */
+ 0, /* U+011712: */
+ 0, /* U+011713: */
+ 0, /* U+011714: */
+ 0, /* U+011715: */
+ 0, /* U+011716: */
+ 0, /* U+011717: */
+ 0, /* U+011718: */
+ 0, /* U+011719: */
+ 0, /* U+01171a: */
+ 0, /* U+01171b: */
+ 0, /* U+01171c: */
+ 0, /* U+01171d: */
+ 0, /* U+01171e: */
+ 0, /* U+01171f: */
+ 0, /* U+011720: */
+ 0, /* U+011721: */
+ 0, /* U+011722: */
+ 0, /* U+011723: */
+ 0, /* U+011724: */
+ 0, /* U+011725: */
+ 0, /* U+011726: */
+ 0, /* U+011727: */
+ 0, /* U+011728: */
+ 0, /* U+011729: */
+ 0, /* U+01172a: */
+ 0, /* U+01172b: */
+ 0, /* U+01172c: */
+ 0, /* U+01172d: */
+ 0, /* U+01172e: */
+ 0, /* U+01172f: */
+ 0, /* U+011730: */
+ 0, /* U+011731: */
+ 0, /* U+011732: */
+ 0, /* U+011733: */
+ 0, /* U+011734: */
+ 0, /* U+011735: */
+ 0, /* U+011736: */
+ 0, /* U+011737: */
+ 0, /* U+011738: */
+ 0, /* U+011739: */
+ 0, /* U+01173a: */
+ 0, /* U+01173b: */
+ 0, /* U+01173c: */
+ 0, /* U+01173d: */
+ 0, /* U+01173e: */
+ 0, /* U+01173f: */
+ 0, /* U+011740: */
+ 0, /* U+011741: */
+ 0, /* U+011742: */
+ 0, /* U+011743: */
+ 0, /* U+011744: */
+ 0, /* U+011745: */
+ 0, /* U+011746: */
+ 0, /* U+011747: */
+ 0, /* U+011748: */
+ 0, /* U+011749: */
+ 0, /* U+01174a: */
+ 0, /* U+01174b: */
+ 0, /* U+01174c: */
+ 0, /* U+01174d: */
+ 0, /* U+01174e: */
+ 0, /* U+01174f: */
+ 0, /* U+011750: */
+ 0, /* U+011751: */
+ 0, /* U+011752: */
+ 0, /* U+011753: */
+ 0, /* U+011754: */
+ 0, /* U+011755: */
+ 0, /* U+011756: */
+ 0, /* U+011757: */
+ 0, /* U+011758: */
+ 0, /* U+011759: */
+ 0, /* U+01175a: */
+ 0, /* U+01175b: */
+ 0, /* U+01175c: */
+ 0, /* U+01175d: */
+ 0, /* U+01175e: */
+ 0, /* U+01175f: */
+ 0, /* U+011760: */
+ 0, /* U+011761: */
+ 0, /* U+011762: */
+ 0, /* U+011763: */
+ 0, /* U+011764: */
+ 0, /* U+011765: */
+ 0, /* U+011766: */
+ 0, /* U+011767: */
+ 0, /* U+011768: */
+ 0, /* U+011769: */
+ 0, /* U+01176a: */
+ 0, /* U+01176b: */
+ 0, /* U+01176c: */
+ 0, /* U+01176d: */
+ 0, /* U+01176e: */
+ 0, /* U+01176f: */
+ 0, /* U+011770: */
+ 0, /* U+011771: */
+ 0, /* U+011772: */
+ 0, /* U+011773: */
+ 0, /* U+011774: */
+ 0, /* U+011775: */
+ 0, /* U+011776: */
+ 0, /* U+011777: */
+ 0, /* U+011778: */
+ 0, /* U+011779: */
+ 0, /* U+01177a: */
+ 0, /* U+01177b: */
+ 0, /* U+01177c: */
+ 0, /* U+01177d: */
+ 0, /* U+01177e: */
+ 0, /* U+01177f: */
+ 0, /* U+011780: */
+ 0, /* U+011781: */
+ 0, /* U+011782: */
+ 0, /* U+011783: */
+ 0, /* U+011784: */
+ 0, /* U+011785: */
+ 0, /* U+011786: */
+ 0, /* U+011787: */
+ 0, /* U+011788: */
+ 0, /* U+011789: */
+ 0, /* U+01178a: */
+ 0, /* U+01178b: */
+ 0, /* U+01178c: */
+ 0, /* U+01178d: */
+ 0, /* U+01178e: */
+ 0, /* U+01178f: */
+ 0, /* U+011790: */
+ 0, /* U+011791: */
+ 0, /* U+011792: */
+ 0, /* U+011793: */
+ 0, /* U+011794: */
+ 0, /* U+011795: */
+ 0, /* U+011796: */
+ 0, /* U+011797: */
+ 0, /* U+011798: */
+ 0, /* U+011799: */
+ 0, /* U+01179a: */
+ 0, /* U+01179b: */
+ 0, /* U+01179c: */
+ 0, /* U+01179d: */
+ 0, /* U+01179e: */
+ 0, /* U+01179f: */
+ 0, /* U+0117a0: */
+ 0, /* U+0117a1: */
+ 0, /* U+0117a2: */
+ 0, /* U+0117a3: */
+ 0, /* U+0117a4: */
+ 0, /* U+0117a5: */
+ 0, /* U+0117a6: */
+ 0, /* U+0117a7: */
+ 0, /* U+0117a8: */
+ 0, /* U+0117a9: */
+ 0, /* U+0117aa: */
+ 0, /* U+0117ab: */
+ 0, /* U+0117ac: */
+ 0, /* U+0117ad: */
+ 0, /* U+0117ae: */
+ 0, /* U+0117af: */
+ 0, /* U+0117b0: */
+ 0, /* U+0117b1: */
+ 0, /* U+0117b2: */
+ 0, /* U+0117b3: */
+ 0, /* U+0117b4: */
+ 0, /* U+0117b5: */
+ 0, /* U+0117b6: */
+ 0, /* U+0117b7: */
+ 0, /* U+0117b8: */
+ 0, /* U+0117b9: */
+ 0, /* U+0117ba: */
+ 0, /* U+0117bb: */
+ 0, /* U+0117bc: */
+ 0, /* U+0117bd: */
+ 0, /* U+0117be: */
+ 0, /* U+0117bf: */
+ 0, /* U+0117c0: */
+ 0, /* U+0117c1: */
+ 0, /* U+0117c2: */
+ 0, /* U+0117c3: */
+ 0, /* U+0117c4: */
+ 0, /* U+0117c5: */
+ 0, /* U+0117c6: */
+ 0, /* U+0117c7: */
+ 0, /* U+0117c8: */
+ 0, /* U+0117c9: */
+ 0, /* U+0117ca: */
+ 0, /* U+0117cb: */
+ 0, /* U+0117cc: */
+ 0, /* U+0117cd: */
+ 0, /* U+0117ce: */
+ 0, /* U+0117cf: */
+ 0, /* U+0117d0: */
+ 0, /* U+0117d1: */
+ 0, /* U+0117d2: */
+ 0, /* U+0117d3: */
+ 0, /* U+0117d4: */
+ 0, /* U+0117d5: */
+ 0, /* U+0117d6: */
+ 0, /* U+0117d7: */
+ 0, /* U+0117d8: */
+ 0, /* U+0117d9: */
+ 0, /* U+0117da: */
+ 0, /* U+0117db: */
+ 0, /* U+0117dc: */
+ 0, /* U+0117dd: */
+ 0, /* U+0117de: */
+ 0, /* U+0117df: */
+ 0, /* U+0117e0: */
+ 0, /* U+0117e1: */
+ 0, /* U+0117e2: */
+ 0, /* U+0117e3: */
+ 0, /* U+0117e4: */
+ 0, /* U+0117e5: */
+ 0, /* U+0117e6: */
+ 0, /* U+0117e7: */
+ 0, /* U+0117e8: */
+ 0, /* U+0117e9: */
+ 0, /* U+0117ea: */
+ 0, /* U+0117eb: */
+ 0, /* U+0117ec: */
+ 0, /* U+0117ed: */
+ 0, /* U+0117ee: */
+ 0, /* U+0117ef: */
+ 0, /* U+0117f0: */
+ 0, /* U+0117f1: */
+ 0, /* U+0117f2: */
+ 0, /* U+0117f3: */
+ 0, /* U+0117f4: */
+ 0, /* U+0117f5: */
+ 0, /* U+0117f6: */
+ 0, /* U+0117f7: */
+ 0, /* U+0117f8: */
+ 0, /* U+0117f9: */
+ 0, /* U+0117fa: */
+ 0, /* U+0117fb: */
+ 0, /* U+0117fc: */
+ 0, /* U+0117fd: */
+ 0, /* U+0117fe: */
+ 0, /* U+0117ff: */
+ 0, /* U+011800: */
+ 0, /* U+011801: */
+ 0, /* U+011802: */
+ 0, /* U+011803: */
+ 0, /* U+011804: */
+ 0, /* U+011805: */
+ 0, /* U+011806: */
+ 0, /* U+011807: */
+ 0, /* U+011808: */
+ 0, /* U+011809: */
+ 0, /* U+01180a: */
+ 0, /* U+01180b: */
+ 0, /* U+01180c: */
+ 0, /* U+01180d: */
+ 0, /* U+01180e: */
+ 0, /* U+01180f: */
+ 0, /* U+011810: */
+ 0, /* U+011811: */
+ 0, /* U+011812: */
+ 0, /* U+011813: */
+ 0, /* U+011814: */
+ 0, /* U+011815: */
+ 0, /* U+011816: */
+ 0, /* U+011817: */
+ 0, /* U+011818: */
+ 0, /* U+011819: */
+ 0, /* U+01181a: */
+ 0, /* U+01181b: */
+ 0, /* U+01181c: */
+ 0, /* U+01181d: */
+ 0, /* U+01181e: */
+ 0, /* U+01181f: */
+ 0, /* U+011820: */
+ 0, /* U+011821: */
+ 0, /* U+011822: */
+ 0, /* U+011823: */
+ 0, /* U+011824: */
+ 0, /* U+011825: */
+ 0, /* U+011826: */
+ 0, /* U+011827: */
+ 0, /* U+011828: */
+ 0, /* U+011829: */
+ 0, /* U+01182a: */
+ 0, /* U+01182b: */
+ 0, /* U+01182c: */
+ 0, /* U+01182d: */
+ 0, /* U+01182e: */
+ 0, /* U+01182f: */
+ 0, /* U+011830: */
+ 0, /* U+011831: */
+ 0, /* U+011832: */
+ 0, /* U+011833: */
+ 0, /* U+011834: */
+ 0, /* U+011835: */
+ 0, /* U+011836: */
+ 0, /* U+011837: */
+ 0, /* U+011838: */
+ 0, /* U+011839: */
+ 0, /* U+01183a: */
+ 0, /* U+01183b: */
+ 0, /* U+01183c: */
+ 0, /* U+01183d: */
+ 0, /* U+01183e: */
+ 0, /* U+01183f: */
+ 0, /* U+011840: */
+ 0, /* U+011841: */
+ 0, /* U+011842: */
+ 0, /* U+011843: */
+ 0, /* U+011844: */
+ 0, /* U+011845: */
+ 0, /* U+011846: */
+ 0, /* U+011847: */
+ 0, /* U+011848: */
+ 0, /* U+011849: */
+ 0, /* U+01184a: */
+ 0, /* U+01184b: */
+ 0, /* U+01184c: */
+ 0, /* U+01184d: */
+ 0, /* U+01184e: */
+ 0, /* U+01184f: */
+ 0, /* U+011850: */
+ 0, /* U+011851: */
+ 0, /* U+011852: */
+ 0, /* U+011853: */
+ 0, /* U+011854: */
+ 0, /* U+011855: */
+ 0, /* U+011856: */
+ 0, /* U+011857: */
+ 0, /* U+011858: */
+ 0, /* U+011859: */
+ 0, /* U+01185a: */
+ 0, /* U+01185b: */
+ 0, /* U+01185c: */
+ 0, /* U+01185d: */
+ 0, /* U+01185e: */
+ 0, /* U+01185f: */
+ 0, /* U+011860: */
+ 0, /* U+011861: */
+ 0, /* U+011862: */
+ 0, /* U+011863: */
+ 0, /* U+011864: */
+ 0, /* U+011865: */
+ 0, /* U+011866: */
+ 0, /* U+011867: */
+ 0, /* U+011868: */
+ 0, /* U+011869: */
+ 0, /* U+01186a: */
+ 0, /* U+01186b: */
+ 0, /* U+01186c: */
+ 0, /* U+01186d: */
+ 0, /* U+01186e: */
+ 0, /* U+01186f: */
+ 0, /* U+011870: */
+ 0, /* U+011871: */
+ 0, /* U+011872: */
+ 0, /* U+011873: */
+ 0, /* U+011874: */
+ 0, /* U+011875: */
+ 0, /* U+011876: */
+ 0, /* U+011877: */
+ 0, /* U+011878: */
+ 0, /* U+011879: */
+ 0, /* U+01187a: */
+ 0, /* U+01187b: */
+ 0, /* U+01187c: */
+ 0, /* U+01187d: */
+ 0, /* U+01187e: */
+ 0, /* U+01187f: */
+ 0, /* U+011880: */
+ 0, /* U+011881: */
+ 0, /* U+011882: */
+ 0, /* U+011883: */
+ 0, /* U+011884: */
+ 0, /* U+011885: */
+ 0, /* U+011886: */
+ 0, /* U+011887: */
+ 0, /* U+011888: */
+ 0, /* U+011889: */
+ 0, /* U+01188a: */
+ 0, /* U+01188b: */
+ 0, /* U+01188c: */
+ 0, /* U+01188d: */
+ 0, /* U+01188e: */
+ 0, /* U+01188f: */
+ 0, /* U+011890: */
+ 0, /* U+011891: */
+ 0, /* U+011892: */
+ 0, /* U+011893: */
+ 0, /* U+011894: */
+ 0, /* U+011895: */
+ 0, /* U+011896: */
+ 0, /* U+011897: */
+ 0, /* U+011898: */
+ 0, /* U+011899: */
+ 0, /* U+01189a: */
+ 0, /* U+01189b: */
+ 0, /* U+01189c: */
+ 0, /* U+01189d: */
+ 0, /* U+01189e: */
+ 0, /* U+01189f: */
+ 0, /* U+0118a0: */
+ 0, /* U+0118a1: */
+ 0, /* U+0118a2: */
+ 0, /* U+0118a3: */
+ 0, /* U+0118a4: */
+ 0, /* U+0118a5: */
+ 0, /* U+0118a6: */
+ 0, /* U+0118a7: */
+ 0, /* U+0118a8: */
+ 0, /* U+0118a9: */
+ 0, /* U+0118aa: */
+ 0, /* U+0118ab: */
+ 0, /* U+0118ac: */
+ 0, /* U+0118ad: */
+ 0, /* U+0118ae: */
+ 0, /* U+0118af: */
+ 0, /* U+0118b0: */
+ 0, /* U+0118b1: */
+ 0, /* U+0118b2: */
+ 0, /* U+0118b3: */
+ 0, /* U+0118b4: */
+ 0, /* U+0118b5: */
+ 0, /* U+0118b6: */
+ 0, /* U+0118b7: */
+ 0, /* U+0118b8: */
+ 0, /* U+0118b9: */
+ 0, /* U+0118ba: */
+ 0, /* U+0118bb: */
+ 0, /* U+0118bc: */
+ 0, /* U+0118bd: */
+ 0, /* U+0118be: */
+ 0, /* U+0118bf: */
+ 0, /* U+0118c0: */
+ 0, /* U+0118c1: */
+ 0, /* U+0118c2: */
+ 0, /* U+0118c3: */
+ 0, /* U+0118c4: */
+ 0, /* U+0118c5: */
+ 0, /* U+0118c6: */
+ 0, /* U+0118c7: */
+ 0, /* U+0118c8: */
+ 0, /* U+0118c9: */
+ 0, /* U+0118ca: */
+ 0, /* U+0118cb: */
+ 0, /* U+0118cc: */
+ 0, /* U+0118cd: */
+ 0, /* U+0118ce: */
+ 0, /* U+0118cf: */
+ 0, /* U+0118d0: */
+ 0, /* U+0118d1: */
+ 0, /* U+0118d2: */
+ 0, /* U+0118d3: */
+ 0, /* U+0118d4: */
+ 0, /* U+0118d5: */
+ 0, /* U+0118d6: */
+ 0, /* U+0118d7: */
+ 0, /* U+0118d8: */
+ 0, /* U+0118d9: */
+ 0, /* U+0118da: */
+ 0, /* U+0118db: */
+ 0, /* U+0118dc: */
+ 0, /* U+0118dd: */
+ 0, /* U+0118de: */
+ 0, /* U+0118df: */
+ 0, /* U+0118e0: */
+ 0, /* U+0118e1: */
+ 0, /* U+0118e2: */
+ 0, /* U+0118e3: */
+ 0, /* U+0118e4: */
+ 0, /* U+0118e5: */
+ 0, /* U+0118e6: */
+ 0, /* U+0118e7: */
+ 0, /* U+0118e8: */
+ 0, /* U+0118e9: */
+ 0, /* U+0118ea: */
+ 0, /* U+0118eb: */
+ 0, /* U+0118ec: */
+ 0, /* U+0118ed: */
+ 0, /* U+0118ee: */
+ 0, /* U+0118ef: */
+ 0, /* U+0118f0: */
+ 0, /* U+0118f1: */
+ 0, /* U+0118f2: */
+ 0, /* U+0118f3: */
+ 0, /* U+0118f4: */
+ 0, /* U+0118f5: */
+ 0, /* U+0118f6: */
+ 0, /* U+0118f7: */
+ 0, /* U+0118f8: */
+ 0, /* U+0118f9: */
+ 0, /* U+0118fa: */
+ 0, /* U+0118fb: */
+ 0, /* U+0118fc: */
+ 0, /* U+0118fd: */
+ 0, /* U+0118fe: */
+ 0, /* U+0118ff: */
+ 0, /* U+011900: */
+ 0, /* U+011901: */
+ 0, /* U+011902: */
+ 0, /* U+011903: */
+ 0, /* U+011904: */
+ 0, /* U+011905: */
+ 0, /* U+011906: */
+ 0, /* U+011907: */
+ 0, /* U+011908: */
+ 0, /* U+011909: */
+ 0, /* U+01190a: */
+ 0, /* U+01190b: */
+ 0, /* U+01190c: */
+ 0, /* U+01190d: */
+ 0, /* U+01190e: */
+ 0, /* U+01190f: */
+ 0, /* U+011910: */
+ 0, /* U+011911: */
+ 0, /* U+011912: */
+ 0, /* U+011913: */
+ 0, /* U+011914: */
+ 0, /* U+011915: */
+ 0, /* U+011916: */
+ 0, /* U+011917: */
+ 0, /* U+011918: */
+ 0, /* U+011919: */
+ 0, /* U+01191a: */
+ 0, /* U+01191b: */
+ 0, /* U+01191c: */
+ 0, /* U+01191d: */
+ 0, /* U+01191e: */
+ 0, /* U+01191f: */
+ 0, /* U+011920: */
+ 0, /* U+011921: */
+ 0, /* U+011922: */
+ 0, /* U+011923: */
+ 0, /* U+011924: */
+ 0, /* U+011925: */
+ 0, /* U+011926: */
+ 0, /* U+011927: */
+ 0, /* U+011928: */
+ 0, /* U+011929: */
+ 0, /* U+01192a: */
+ 0, /* U+01192b: */
+ 0, /* U+01192c: */
+ 0, /* U+01192d: */
+ 0, /* U+01192e: */
+ 0, /* U+01192f: */
+ 0, /* U+011930: */
+ 0, /* U+011931: */
+ 0, /* U+011932: */
+ 0, /* U+011933: */
+ 0, /* U+011934: */
+ 0, /* U+011935: */
+ 0, /* U+011936: */
+ 0, /* U+011937: */
+ 0, /* U+011938: */
+ 0, /* U+011939: */
+ 0, /* U+01193a: */
+ 0, /* U+01193b: */
+ 0, /* U+01193c: */
+ 0, /* U+01193d: */
+ 0, /* U+01193e: */
+ 0, /* U+01193f: */
+ 0, /* U+011940: */
+ 0, /* U+011941: */
+ 0, /* U+011942: */
+ 0, /* U+011943: */
+ 0, /* U+011944: */
+ 0, /* U+011945: */
+ 0, /* U+011946: */
+ 0, /* U+011947: */
+ 0, /* U+011948: */
+ 0, /* U+011949: */
+ 0, /* U+01194a: */
+ 0, /* U+01194b: */
+ 0, /* U+01194c: */
+ 0, /* U+01194d: */
+ 0, /* U+01194e: */
+ 0, /* U+01194f: */
+ 0, /* U+011950: */
+ 0, /* U+011951: */
+ 0, /* U+011952: */
+ 0, /* U+011953: */
+ 0, /* U+011954: */
+ 0, /* U+011955: */
+ 0, /* U+011956: */
+ 0, /* U+011957: */
+ 0, /* U+011958: */
+ 0, /* U+011959: */
+ 0, /* U+01195a: */
+ 0, /* U+01195b: */
+ 0, /* U+01195c: */
+ 0, /* U+01195d: */
+ 0, /* U+01195e: */
+ 0, /* U+01195f: */
+ 0, /* U+011960: */
+ 0, /* U+011961: */
+ 0, /* U+011962: */
+ 0, /* U+011963: */
+ 0, /* U+011964: */
+ 0, /* U+011965: */
+ 0, /* U+011966: */
+ 0, /* U+011967: */
+ 0, /* U+011968: */
+ 0, /* U+011969: */
+ 0, /* U+01196a: */
+ 0, /* U+01196b: */
+ 0, /* U+01196c: */
+ 0, /* U+01196d: */
+ 0, /* U+01196e: */
+ 0, /* U+01196f: */
+ 0, /* U+011970: */
+ 0, /* U+011971: */
+ 0, /* U+011972: */
+ 0, /* U+011973: */
+ 0, /* U+011974: */
+ 0, /* U+011975: */
+ 0, /* U+011976: */
+ 0, /* U+011977: */
+ 0, /* U+011978: */
+ 0, /* U+011979: */
+ 0, /* U+01197a: */
+ 0, /* U+01197b: */
+ 0, /* U+01197c: */
+ 0, /* U+01197d: */
+ 0, /* U+01197e: */
+ 0, /* U+01197f: */
+ 0, /* U+011980: */
+ 0, /* U+011981: */
+ 0, /* U+011982: */
+ 0, /* U+011983: */
+ 0, /* U+011984: */
+ 0, /* U+011985: */
+ 0, /* U+011986: */
+ 0, /* U+011987: */
+ 0, /* U+011988: */
+ 0, /* U+011989: */
+ 0, /* U+01198a: */
+ 0, /* U+01198b: */
+ 0, /* U+01198c: */
+ 0, /* U+01198d: */
+ 0, /* U+01198e: */
+ 0, /* U+01198f: */
+ 0, /* U+011990: */
+ 0, /* U+011991: */
+ 0, /* U+011992: */
+ 0, /* U+011993: */
+ 0, /* U+011994: */
+ 0, /* U+011995: */
+ 0, /* U+011996: */
+ 0, /* U+011997: */
+ 0, /* U+011998: */
+ 0, /* U+011999: */
+ 0, /* U+01199a: */
+ 0, /* U+01199b: */
+ 0, /* U+01199c: */
+ 0, /* U+01199d: */
+ 0, /* U+01199e: */
+ 0, /* U+01199f: */
+ 0, /* U+0119a0: */
+ 0, /* U+0119a1: */
+ 0, /* U+0119a2: */
+ 0, /* U+0119a3: */
+ 0, /* U+0119a4: */
+ 0, /* U+0119a5: */
+ 0, /* U+0119a6: */
+ 0, /* U+0119a7: */
+ 0, /* U+0119a8: */
+ 0, /* U+0119a9: */
+ 0, /* U+0119aa: */
+ 0, /* U+0119ab: */
+ 0, /* U+0119ac: */
+ 0, /* U+0119ad: */
+ 0, /* U+0119ae: */
+ 0, /* U+0119af: */
+ 0, /* U+0119b0: */
+ 0, /* U+0119b1: */
+ 0, /* U+0119b2: */
+ 0, /* U+0119b3: */
+ 0, /* U+0119b4: */
+ 0, /* U+0119b5: */
+ 0, /* U+0119b6: */
+ 0, /* U+0119b7: */
+ 0, /* U+0119b8: */
+ 0, /* U+0119b9: */
+ 0, /* U+0119ba: */
+ 0, /* U+0119bb: */
+ 0, /* U+0119bc: */
+ 0, /* U+0119bd: */
+ 0, /* U+0119be: */
+ 0, /* U+0119bf: */
+ 0, /* U+0119c0: */
+ 0, /* U+0119c1: */
+ 0, /* U+0119c2: */
+ 0, /* U+0119c3: */
+ 0, /* U+0119c4: */
+ 0, /* U+0119c5: */
+ 0, /* U+0119c6: */
+ 0, /* U+0119c7: */
+ 0, /* U+0119c8: */
+ 0, /* U+0119c9: */
+ 0, /* U+0119ca: */
+ 0, /* U+0119cb: */
+ 0, /* U+0119cc: */
+ 0, /* U+0119cd: */
+ 0, /* U+0119ce: */
+ 0, /* U+0119cf: */
+ 0, /* U+0119d0: */
+ 0, /* U+0119d1: */
+ 0, /* U+0119d2: */
+ 0, /* U+0119d3: */
+ 0, /* U+0119d4: */
+ 0, /* U+0119d5: */
+ 0, /* U+0119d6: */
+ 0, /* U+0119d7: */
+ 0, /* U+0119d8: */
+ 0, /* U+0119d9: */
+ 0, /* U+0119da: */
+ 0, /* U+0119db: */
+ 0, /* U+0119dc: */
+ 0, /* U+0119dd: */
+ 0, /* U+0119de: */
+ 0, /* U+0119df: */
+ 0, /* U+0119e0: */
+ 0, /* U+0119e1: */
+ 0, /* U+0119e2: */
+ 0, /* U+0119e3: */
+ 0, /* U+0119e4: */
+ 0, /* U+0119e5: */
+ 0, /* U+0119e6: */
+ 0, /* U+0119e7: */
+ 0, /* U+0119e8: */
+ 0, /* U+0119e9: */
+ 0, /* U+0119ea: */
+ 0, /* U+0119eb: */
+ 0, /* U+0119ec: */
+ 0, /* U+0119ed: */
+ 0, /* U+0119ee: */
+ 0, /* U+0119ef: */
+ 0, /* U+0119f0: */
+ 0, /* U+0119f1: */
+ 0, /* U+0119f2: */
+ 0, /* U+0119f3: */
+ 0, /* U+0119f4: */
+ 0, /* U+0119f5: */
+ 0, /* U+0119f6: */
+ 0, /* U+0119f7: */
+ 0, /* U+0119f8: */
+ 0, /* U+0119f9: */
+ 0, /* U+0119fa: */
+ 0, /* U+0119fb: */
+ 0, /* U+0119fc: */
+ 0, /* U+0119fd: */
+ 0, /* U+0119fe: */
+ 0, /* U+0119ff: */
+ 0, /* U+011a00: */
+ 0, /* U+011a01: */
+ 0, /* U+011a02: */
+ 0, /* U+011a03: */
+ 0, /* U+011a04: */
+ 0, /* U+011a05: */
+ 0, /* U+011a06: */
+ 0, /* U+011a07: */
+ 0, /* U+011a08: */
+ 0, /* U+011a09: */
+ 0, /* U+011a0a: */
+ 0, /* U+011a0b: */
+ 0, /* U+011a0c: */
+ 0, /* U+011a0d: */
+ 0, /* U+011a0e: */
+ 0, /* U+011a0f: */
+ 0, /* U+011a10: */
+ 0, /* U+011a11: */
+ 0, /* U+011a12: */
+ 0, /* U+011a13: */
+ 0, /* U+011a14: */
+ 0, /* U+011a15: */
+ 0, /* U+011a16: */
+ 0, /* U+011a17: */
+ 0, /* U+011a18: */
+ 0, /* U+011a19: */
+ 0, /* U+011a1a: */
+ 0, /* U+011a1b: */
+ 0, /* U+011a1c: */
+ 0, /* U+011a1d: */
+ 0, /* U+011a1e: */
+ 0, /* U+011a1f: */
+ 0, /* U+011a20: */
+ 0, /* U+011a21: */
+ 0, /* U+011a22: */
+ 0, /* U+011a23: */
+ 0, /* U+011a24: */
+ 0, /* U+011a25: */
+ 0, /* U+011a26: */
+ 0, /* U+011a27: */
+ 0, /* U+011a28: */
+ 0, /* U+011a29: */
+ 0, /* U+011a2a: */
+ 0, /* U+011a2b: */
+ 0, /* U+011a2c: */
+ 0, /* U+011a2d: */
+ 0, /* U+011a2e: */
+ 0, /* U+011a2f: */
+ 0, /* U+011a30: */
+ 0, /* U+011a31: */
+ 0, /* U+011a32: */
+ 0, /* U+011a33: */
+ 0, /* U+011a34: */
+ 0, /* U+011a35: */
+ 0, /* U+011a36: */
+ 0, /* U+011a37: */
+ 0, /* U+011a38: */
+ 0, /* U+011a39: */
+ 0, /* U+011a3a: */
+ 0, /* U+011a3b: */
+ 0, /* U+011a3c: */
+ 0, /* U+011a3d: */
+ 0, /* U+011a3e: */
+ 0, /* U+011a3f: */
+ 0, /* U+011a40: */
+ 0, /* U+011a41: */
+ 0, /* U+011a42: */
+ 0, /* U+011a43: */
+ 0, /* U+011a44: */
+ 0, /* U+011a45: */
+ 0, /* U+011a46: */
+ 0, /* U+011a47: */
+ 0, /* U+011a48: */
+ 0, /* U+011a49: */
+ 0, /* U+011a4a: */
+ 0, /* U+011a4b: */
+ 0, /* U+011a4c: */
+ 0, /* U+011a4d: */
+ 0, /* U+011a4e: */
+ 0, /* U+011a4f: */
+ 0, /* U+011a50: */
+ 0, /* U+011a51: */
+ 0, /* U+011a52: */
+ 0, /* U+011a53: */
+ 0, /* U+011a54: */
+ 0, /* U+011a55: */
+ 0, /* U+011a56: */
+ 0, /* U+011a57: */
+ 0, /* U+011a58: */
+ 0, /* U+011a59: */
+ 0, /* U+011a5a: */
+ 0, /* U+011a5b: */
+ 0, /* U+011a5c: */
+ 0, /* U+011a5d: */
+ 0, /* U+011a5e: */
+ 0, /* U+011a5f: */
+ 0, /* U+011a60: */
+ 0, /* U+011a61: */
+ 0, /* U+011a62: */
+ 0, /* U+011a63: */
+ 0, /* U+011a64: */
+ 0, /* U+011a65: */
+ 0, /* U+011a66: */
+ 0, /* U+011a67: */
+ 0, /* U+011a68: */
+ 0, /* U+011a69: */
+ 0, /* U+011a6a: */
+ 0, /* U+011a6b: */
+ 0, /* U+011a6c: */
+ 0, /* U+011a6d: */
+ 0, /* U+011a6e: */
+ 0, /* U+011a6f: */
+ 0, /* U+011a70: */
+ 0, /* U+011a71: */
+ 0, /* U+011a72: */
+ 0, /* U+011a73: */
+ 0, /* U+011a74: */
+ 0, /* U+011a75: */
+ 0, /* U+011a76: */
+ 0, /* U+011a77: */
+ 0, /* U+011a78: */
+ 0, /* U+011a79: */
+ 0, /* U+011a7a: */
+ 0, /* U+011a7b: */
+ 0, /* U+011a7c: */
+ 0, /* U+011a7d: */
+ 0, /* U+011a7e: */
+ 0, /* U+011a7f: */
+ 0, /* U+011a80: */
+ 0, /* U+011a81: */
+ 0, /* U+011a82: */
+ 0, /* U+011a83: */
+ 0, /* U+011a84: */
+ 0, /* U+011a85: */
+ 0, /* U+011a86: */
+ 0, /* U+011a87: */
+ 0, /* U+011a88: */
+ 0, /* U+011a89: */
+ 0, /* U+011a8a: */
+ 0, /* U+011a8b: */
+ 0, /* U+011a8c: */
+ 0, /* U+011a8d: */
+ 0, /* U+011a8e: */
+ 0, /* U+011a8f: */
+ 0, /* U+011a90: */
+ 0, /* U+011a91: */
+ 0, /* U+011a92: */
+ 0, /* U+011a93: */
+ 0, /* U+011a94: */
+ 0, /* U+011a95: */
+ 0, /* U+011a96: */
+ 0, /* U+011a97: */
+ 0, /* U+011a98: */
+ 0, /* U+011a99: */
+ 0, /* U+011a9a: */
+ 0, /* U+011a9b: */
+ 0, /* U+011a9c: */
+ 0, /* U+011a9d: */
+ 0, /* U+011a9e: */
+ 0, /* U+011a9f: */
+ 0, /* U+011aa0: */
+ 0, /* U+011aa1: */
+ 0, /* U+011aa2: */
+ 0, /* U+011aa3: */
+ 0, /* U+011aa4: */
+ 0, /* U+011aa5: */
+ 0, /* U+011aa6: */
+ 0, /* U+011aa7: */
+ 0, /* U+011aa8: */
+ 0, /* U+011aa9: */
+ 0, /* U+011aaa: */
+ 0, /* U+011aab: */
+ 0, /* U+011aac: */
+ 0, /* U+011aad: */
+ 0, /* U+011aae: */
+ 0, /* U+011aaf: */
+ 0, /* U+011ab0: */
+ 0, /* U+011ab1: */
+ 0, /* U+011ab2: */
+ 0, /* U+011ab3: */
+ 0, /* U+011ab4: */
+ 0, /* U+011ab5: */
+ 0, /* U+011ab6: */
+ 0, /* U+011ab7: */
+ 0, /* U+011ab8: */
+ 0, /* U+011ab9: */
+ 0, /* U+011aba: */
+ 0, /* U+011abb: */
+ 0, /* U+011abc: */
+ 0, /* U+011abd: */
+ 0, /* U+011abe: */
+ 0, /* U+011abf: */
+ 0, /* U+011ac0: */
+ 0, /* U+011ac1: */
+ 0, /* U+011ac2: */
+ 0, /* U+011ac3: */
+ 0, /* U+011ac4: */
+ 0, /* U+011ac5: */
+ 0, /* U+011ac6: */
+ 0, /* U+011ac7: */
+ 0, /* U+011ac8: */
+ 0, /* U+011ac9: */
+ 0, /* U+011aca: */
+ 0, /* U+011acb: */
+ 0, /* U+011acc: */
+ 0, /* U+011acd: */
+ 0, /* U+011ace: */
+ 0, /* U+011acf: */
+ 0, /* U+011ad0: */
+ 0, /* U+011ad1: */
+ 0, /* U+011ad2: */
+ 0, /* U+011ad3: */
+ 0, /* U+011ad4: */
+ 0, /* U+011ad5: */
+ 0, /* U+011ad6: */
+ 0, /* U+011ad7: */
+ 0, /* U+011ad8: */
+ 0, /* U+011ad9: */
+ 0, /* U+011ada: */
+ 0, /* U+011adb: */
+ 0, /* U+011adc: */
+ 0, /* U+011add: */
+ 0, /* U+011ade: */
+ 0, /* U+011adf: */
+ 0, /* U+011ae0: */
+ 0, /* U+011ae1: */
+ 0, /* U+011ae2: */
+ 0, /* U+011ae3: */
+ 0, /* U+011ae4: */
+ 0, /* U+011ae5: */
+ 0, /* U+011ae6: */
+ 0, /* U+011ae7: */
+ 0, /* U+011ae8: */
+ 0, /* U+011ae9: */
+ 0, /* U+011aea: */
+ 0, /* U+011aeb: */
+ 0, /* U+011aec: */
+ 0, /* U+011aed: */
+ 0, /* U+011aee: */
+ 0, /* U+011aef: */
+ 0, /* U+011af0: */
+ 0, /* U+011af1: */
+ 0, /* U+011af2: */
+ 0, /* U+011af3: */
+ 0, /* U+011af4: */
+ 0, /* U+011af5: */
+ 0, /* U+011af6: */
+ 0, /* U+011af7: */
+ 0, /* U+011af8: */
+ 0, /* U+011af9: */
+ 0, /* U+011afa: */
+ 0, /* U+011afb: */
+ 0, /* U+011afc: */
+ 0, /* U+011afd: */
+ 0, /* U+011afe: */
+ 0, /* U+011aff: */
+ 0, /* U+011b00: */
+ 0, /* U+011b01: */
+ 0, /* U+011b02: */
+ 0, /* U+011b03: */
+ 0, /* U+011b04: */
+ 0, /* U+011b05: */
+ 0, /* U+011b06: */
+ 0, /* U+011b07: */
+ 0, /* U+011b08: */
+ 0, /* U+011b09: */
+ 0, /* U+011b0a: */
+ 0, /* U+011b0b: */
+ 0, /* U+011b0c: */
+ 0, /* U+011b0d: */
+ 0, /* U+011b0e: */
+ 0, /* U+011b0f: */
+ 0, /* U+011b10: */
+ 0, /* U+011b11: */
+ 0, /* U+011b12: */
+ 0, /* U+011b13: */
+ 0, /* U+011b14: */
+ 0, /* U+011b15: */
+ 0, /* U+011b16: */
+ 0, /* U+011b17: */
+ 0, /* U+011b18: */
+ 0, /* U+011b19: */
+ 0, /* U+011b1a: */
+ 0, /* U+011b1b: */
+ 0, /* U+011b1c: */
+ 0, /* U+011b1d: */
+ 0, /* U+011b1e: */
+ 0, /* U+011b1f: */
+ 0, /* U+011b20: */
+ 0, /* U+011b21: */
+ 0, /* U+011b22: */
+ 0, /* U+011b23: */
+ 0, /* U+011b24: */
+ 0, /* U+011b25: */
+ 0, /* U+011b26: */
+ 0, /* U+011b27: */
+ 0, /* U+011b28: */
+ 0, /* U+011b29: */
+ 0, /* U+011b2a: */
+ 0, /* U+011b2b: */
+ 0, /* U+011b2c: */
+ 0, /* U+011b2d: */
+ 0, /* U+011b2e: */
+ 0, /* U+011b2f: */
+ 0, /* U+011b30: */
+ 0, /* U+011b31: */
+ 0, /* U+011b32: */
+ 0, /* U+011b33: */
+ 0, /* U+011b34: */
+ 0, /* U+011b35: */
+ 0, /* U+011b36: */
+ 0, /* U+011b37: */
+ 0, /* U+011b38: */
+ 0, /* U+011b39: */
+ 0, /* U+011b3a: */
+ 0, /* U+011b3b: */
+ 0, /* U+011b3c: */
+ 0, /* U+011b3d: */
+ 0, /* U+011b3e: */
+ 0, /* U+011b3f: */
+ 0, /* U+011b40: */
+ 0, /* U+011b41: */
+ 0, /* U+011b42: */
+ 0, /* U+011b43: */
+ 0, /* U+011b44: */
+ 0, /* U+011b45: */
+ 0, /* U+011b46: */
+ 0, /* U+011b47: */
+ 0, /* U+011b48: */
+ 0, /* U+011b49: */
+ 0, /* U+011b4a: */
+ 0, /* U+011b4b: */
+ 0, /* U+011b4c: */
+ 0, /* U+011b4d: */
+ 0, /* U+011b4e: */
+ 0, /* U+011b4f: */
+ 0, /* U+011b50: */
+ 0, /* U+011b51: */
+ 0, /* U+011b52: */
+ 0, /* U+011b53: */
+ 0, /* U+011b54: */
+ 0, /* U+011b55: */
+ 0, /* U+011b56: */
+ 0, /* U+011b57: */
+ 0, /* U+011b58: */
+ 0, /* U+011b59: */
+ 0, /* U+011b5a: */
+ 0, /* U+011b5b: */
+ 0, /* U+011b5c: */
+ 0, /* U+011b5d: */
+ 0, /* U+011b5e: */
+ 0, /* U+011b5f: */
+ 0, /* U+011b60: */
+ 0, /* U+011b61: */
+ 0, /* U+011b62: */
+ 0, /* U+011b63: */
+ 0, /* U+011b64: */
+ 0, /* U+011b65: */
+ 0, /* U+011b66: */
+ 0, /* U+011b67: */
+ 0, /* U+011b68: */
+ 0, /* U+011b69: */
+ 0, /* U+011b6a: */
+ 0, /* U+011b6b: */
+ 0, /* U+011b6c: */
+ 0, /* U+011b6d: */
+ 0, /* U+011b6e: */
+ 0, /* U+011b6f: */
+ 0, /* U+011b70: */
+ 0, /* U+011b71: */
+ 0, /* U+011b72: */
+ 0, /* U+011b73: */
+ 0, /* U+011b74: */
+ 0, /* U+011b75: */
+ 0, /* U+011b76: */
+ 0, /* U+011b77: */
+ 0, /* U+011b78: */
+ 0, /* U+011b79: */
+ 0, /* U+011b7a: */
+ 0, /* U+011b7b: */
+ 0, /* U+011b7c: */
+ 0, /* U+011b7d: */
+ 0, /* U+011b7e: */
+ 0, /* U+011b7f: */
+ 0, /* U+011b80: */
+ 0, /* U+011b81: */
+ 0, /* U+011b82: */
+ 0, /* U+011b83: */
+ 0, /* U+011b84: */
+ 0, /* U+011b85: */
+ 0, /* U+011b86: */
+ 0, /* U+011b87: */
+ 0, /* U+011b88: */
+ 0, /* U+011b89: */
+ 0, /* U+011b8a: */
+ 0, /* U+011b8b: */
+ 0, /* U+011b8c: */
+ 0, /* U+011b8d: */
+ 0, /* U+011b8e: */
+ 0, /* U+011b8f: */
+ 0, /* U+011b90: */
+ 0, /* U+011b91: */
+ 0, /* U+011b92: */
+ 0, /* U+011b93: */
+ 0, /* U+011b94: */
+ 0, /* U+011b95: */
+ 0, /* U+011b96: */
+ 0, /* U+011b97: */
+ 0, /* U+011b98: */
+ 0, /* U+011b99: */
+ 0, /* U+011b9a: */
+ 0, /* U+011b9b: */
+ 0, /* U+011b9c: */
+ 0, /* U+011b9d: */
+ 0, /* U+011b9e: */
+ 0, /* U+011b9f: */
+ 0, /* U+011ba0: */
+ 0, /* U+011ba1: */
+ 0, /* U+011ba2: */
+ 0, /* U+011ba3: */
+ 0, /* U+011ba4: */
+ 0, /* U+011ba5: */
+ 0, /* U+011ba6: */
+ 0, /* U+011ba7: */
+ 0, /* U+011ba8: */
+ 0, /* U+011ba9: */
+ 0, /* U+011baa: */
+ 0, /* U+011bab: */
+ 0, /* U+011bac: */
+ 0, /* U+011bad: */
+ 0, /* U+011bae: */
+ 0, /* U+011baf: */
+ 0, /* U+011bb0: */
+ 0, /* U+011bb1: */
+ 0, /* U+011bb2: */
+ 0, /* U+011bb3: */
+ 0, /* U+011bb4: */
+ 0, /* U+011bb5: */
+ 0, /* U+011bb6: */
+ 0, /* U+011bb7: */
+ 0, /* U+011bb8: */
+ 0, /* U+011bb9: */
+ 0, /* U+011bba: */
+ 0, /* U+011bbb: */
+ 0, /* U+011bbc: */
+ 0, /* U+011bbd: */
+ 0, /* U+011bbe: */
+ 0, /* U+011bbf: */
+ 0, /* U+011bc0: */
+ 0, /* U+011bc1: */
+ 0, /* U+011bc2: */
+ 0, /* U+011bc3: */
+ 0, /* U+011bc4: */
+ 0, /* U+011bc5: */
+ 0, /* U+011bc6: */
+ 0, /* U+011bc7: */
+ 0, /* U+011bc8: */
+ 0, /* U+011bc9: */
+ 0, /* U+011bca: */
+ 0, /* U+011bcb: */
+ 0, /* U+011bcc: */
+ 0, /* U+011bcd: */
+ 0, /* U+011bce: */
+ 0, /* U+011bcf: */
+ 0, /* U+011bd0: */
+ 0, /* U+011bd1: */
+ 0, /* U+011bd2: */
+ 0, /* U+011bd3: */
+ 0, /* U+011bd4: */
+ 0, /* U+011bd5: */
+ 0, /* U+011bd6: */
+ 0, /* U+011bd7: */
+ 0, /* U+011bd8: */
+ 0, /* U+011bd9: */
+ 0, /* U+011bda: */
+ 0, /* U+011bdb: */
+ 0, /* U+011bdc: */
+ 0, /* U+011bdd: */
+ 0, /* U+011bde: */
+ 0, /* U+011bdf: */
+ 0, /* U+011be0: */
+ 0, /* U+011be1: */
+ 0, /* U+011be2: */
+ 0, /* U+011be3: */
+ 0, /* U+011be4: */
+ 0, /* U+011be5: */
+ 0, /* U+011be6: */
+ 0, /* U+011be7: */
+ 0, /* U+011be8: */
+ 0, /* U+011be9: */
+ 0, /* U+011bea: */
+ 0, /* U+011beb: */
+ 0, /* U+011bec: */
+ 0, /* U+011bed: */
+ 0, /* U+011bee: */
+ 0, /* U+011bef: */
+ 0, /* U+011bf0: */
+ 0, /* U+011bf1: */
+ 0, /* U+011bf2: */
+ 0, /* U+011bf3: */
+ 0, /* U+011bf4: */
+ 0, /* U+011bf5: */
+ 0, /* U+011bf6: */
+ 0, /* U+011bf7: */
+ 0, /* U+011bf8: */
+ 0, /* U+011bf9: */
+ 0, /* U+011bfa: */
+ 0, /* U+011bfb: */
+ 0, /* U+011bfc: */
+ 0, /* U+011bfd: */
+ 0, /* U+011bfe: */
+ 0, /* U+011bff: */
+ 0, /* U+011c00: */
+ 0, /* U+011c01: */
+ 0, /* U+011c02: */
+ 0, /* U+011c03: */
+ 0, /* U+011c04: */
+ 0, /* U+011c05: */
+ 0, /* U+011c06: */
+ 0, /* U+011c07: */
+ 0, /* U+011c08: */
+ 0, /* U+011c09: */
+ 0, /* U+011c0a: */
+ 0, /* U+011c0b: */
+ 0, /* U+011c0c: */
+ 0, /* U+011c0d: */
+ 0, /* U+011c0e: */
+ 0, /* U+011c0f: */
+ 0, /* U+011c10: */
+ 0, /* U+011c11: */
+ 0, /* U+011c12: */
+ 0, /* U+011c13: */
+ 0, /* U+011c14: */
+ 0, /* U+011c15: */
+ 0, /* U+011c16: */
+ 0, /* U+011c17: */
+ 0, /* U+011c18: */
+ 0, /* U+011c19: */
+ 0, /* U+011c1a: */
+ 0, /* U+011c1b: */
+ 0, /* U+011c1c: */
+ 0, /* U+011c1d: */
+ 0, /* U+011c1e: */
+ 0, /* U+011c1f: */
+ 0, /* U+011c20: */
+ 0, /* U+011c21: */
+ 0, /* U+011c22: */
+ 0, /* U+011c23: */
+ 0, /* U+011c24: */
+ 0, /* U+011c25: */
+ 0, /* U+011c26: */
+ 0, /* U+011c27: */
+ 0, /* U+011c28: */
+ 0, /* U+011c29: */
+ 0, /* U+011c2a: */
+ 0, /* U+011c2b: */
+ 0, /* U+011c2c: */
+ 0, /* U+011c2d: */
+ 0, /* U+011c2e: */
+ 0, /* U+011c2f: */
+ 0, /* U+011c30: */
+ 0, /* U+011c31: */
+ 0, /* U+011c32: */
+ 0, /* U+011c33: */
+ 0, /* U+011c34: */
+ 0, /* U+011c35: */
+ 0, /* U+011c36: */
+ 0, /* U+011c37: */
+ 0, /* U+011c38: */
+ 0, /* U+011c39: */
+ 0, /* U+011c3a: */
+ 0, /* U+011c3b: */
+ 0, /* U+011c3c: */
+ 0, /* U+011c3d: */
+ 0, /* U+011c3e: */
+ 0, /* U+011c3f: */
+ 0, /* U+011c40: */
+ 0, /* U+011c41: */
+ 0, /* U+011c42: */
+ 0, /* U+011c43: */
+ 0, /* U+011c44: */
+ 0, /* U+011c45: */
+ 0, /* U+011c46: */
+ 0, /* U+011c47: */
+ 0, /* U+011c48: */
+ 0, /* U+011c49: */
+ 0, /* U+011c4a: */
+ 0, /* U+011c4b: */
+ 0, /* U+011c4c: */
+ 0, /* U+011c4d: */
+ 0, /* U+011c4e: */
+ 0, /* U+011c4f: */
+ 0, /* U+011c50: */
+ 0, /* U+011c51: */
+ 0, /* U+011c52: */
+ 0, /* U+011c53: */
+ 0, /* U+011c54: */
+ 0, /* U+011c55: */
+ 0, /* U+011c56: */
+ 0, /* U+011c57: */
+ 0, /* U+011c58: */
+ 0, /* U+011c59: */
+ 0, /* U+011c5a: */
+ 0, /* U+011c5b: */
+ 0, /* U+011c5c: */
+ 0, /* U+011c5d: */
+ 0, /* U+011c5e: */
+ 0, /* U+011c5f: */
+ 0, /* U+011c60: */
+ 0, /* U+011c61: */
+ 0, /* U+011c62: */
+ 0, /* U+011c63: */
+ 0, /* U+011c64: */
+ 0, /* U+011c65: */
+ 0, /* U+011c66: */
+ 0, /* U+011c67: */
+ 0, /* U+011c68: */
+ 0, /* U+011c69: */
+ 0, /* U+011c6a: */
+ 0, /* U+011c6b: */
+ 0, /* U+011c6c: */
+ 0, /* U+011c6d: */
+ 0, /* U+011c6e: */
+ 0, /* U+011c6f: */
+ 0, /* U+011c70: */
+ 0, /* U+011c71: */
+ 0, /* U+011c72: */
+ 0, /* U+011c73: */
+ 0, /* U+011c74: */
+ 0, /* U+011c75: */
+ 0, /* U+011c76: */
+ 0, /* U+011c77: */
+ 0, /* U+011c78: */
+ 0, /* U+011c79: */
+ 0, /* U+011c7a: */
+ 0, /* U+011c7b: */
+ 0, /* U+011c7c: */
+ 0, /* U+011c7d: */
+ 0, /* U+011c7e: */
+ 0, /* U+011c7f: */
+ 0, /* U+011c80: */
+ 0, /* U+011c81: */
+ 0, /* U+011c82: */
+ 0, /* U+011c83: */
+ 0, /* U+011c84: */
+ 0, /* U+011c85: */
+ 0, /* U+011c86: */
+ 0, /* U+011c87: */
+ 0, /* U+011c88: */
+ 0, /* U+011c89: */
+ 0, /* U+011c8a: */
+ 0, /* U+011c8b: */
+ 0, /* U+011c8c: */
+ 0, /* U+011c8d: */
+ 0, /* U+011c8e: */
+ 0, /* U+011c8f: */
+ 0, /* U+011c90: */
+ 0, /* U+011c91: */
+ 0, /* U+011c92: */
+ 0, /* U+011c93: */
+ 0, /* U+011c94: */
+ 0, /* U+011c95: */
+ 0, /* U+011c96: */
+ 0, /* U+011c97: */
+ 0, /* U+011c98: */
+ 0, /* U+011c99: */
+ 0, /* U+011c9a: */
+ 0, /* U+011c9b: */
+ 0, /* U+011c9c: */
+ 0, /* U+011c9d: */
+ 0, /* U+011c9e: */
+ 0, /* U+011c9f: */
+ 0, /* U+011ca0: */
+ 0, /* U+011ca1: */
+ 0, /* U+011ca2: */
+ 0, /* U+011ca3: */
+ 0, /* U+011ca4: */
+ 0, /* U+011ca5: */
+ 0, /* U+011ca6: */
+ 0, /* U+011ca7: */
+ 0, /* U+011ca8: */
+ 0, /* U+011ca9: */
+ 0, /* U+011caa: */
+ 0, /* U+011cab: */
+ 0, /* U+011cac: */
+ 0, /* U+011cad: */
+ 0, /* U+011cae: */
+ 0, /* U+011caf: */
+ 0, /* U+011cb0: */
+ 0, /* U+011cb1: */
+ 0, /* U+011cb2: */
+ 0, /* U+011cb3: */
+ 0, /* U+011cb4: */
+ 0, /* U+011cb5: */
+ 0, /* U+011cb6: */
+ 0, /* U+011cb7: */
+ 0, /* U+011cb8: */
+ 0, /* U+011cb9: */
+ 0, /* U+011cba: */
+ 0, /* U+011cbb: */
+ 0, /* U+011cbc: */
+ 0, /* U+011cbd: */
+ 0, /* U+011cbe: */
+ 0, /* U+011cbf: */
+ 0, /* U+011cc0: */
+ 0, /* U+011cc1: */
+ 0, /* U+011cc2: */
+ 0, /* U+011cc3: */
+ 0, /* U+011cc4: */
+ 0, /* U+011cc5: */
+ 0, /* U+011cc6: */
+ 0, /* U+011cc7: */
+ 0, /* U+011cc8: */
+ 0, /* U+011cc9: */
+ 0, /* U+011cca: */
+ 0, /* U+011ccb: */
+ 0, /* U+011ccc: */
+ 0, /* U+011ccd: */
+ 0, /* U+011cce: */
+ 0, /* U+011ccf: */
+ 0, /* U+011cd0: */
+ 0, /* U+011cd1: */
+ 0, /* U+011cd2: */
+ 0, /* U+011cd3: */
+ 0, /* U+011cd4: */
+ 0, /* U+011cd5: */
+ 0, /* U+011cd6: */
+ 0, /* U+011cd7: */
+ 0, /* U+011cd8: */
+ 0, /* U+011cd9: */
+ 0, /* U+011cda: */
+ 0, /* U+011cdb: */
+ 0, /* U+011cdc: */
+ 0, /* U+011cdd: */
+ 0, /* U+011cde: */
+ 0, /* U+011cdf: */
+ 0, /* U+011ce0: */
+ 0, /* U+011ce1: */
+ 0, /* U+011ce2: */
+ 0, /* U+011ce3: */
+ 0, /* U+011ce4: */
+ 0, /* U+011ce5: */
+ 0, /* U+011ce6: */
+ 0, /* U+011ce7: */
+ 0, /* U+011ce8: */
+ 0, /* U+011ce9: */
+ 0, /* U+011cea: */
+ 0, /* U+011ceb: */
+ 0, /* U+011cec: */
+ 0, /* U+011ced: */
+ 0, /* U+011cee: */
+ 0, /* U+011cef: */
+ 0, /* U+011cf0: */
+ 0, /* U+011cf1: */
+ 0, /* U+011cf2: */
+ 0, /* U+011cf3: */
+ 0, /* U+011cf4: */
+ 0, /* U+011cf5: */
+ 0, /* U+011cf6: */
+ 0, /* U+011cf7: */
+ 0, /* U+011cf8: */
+ 0, /* U+011cf9: */
+ 0, /* U+011cfa: */
+ 0, /* U+011cfb: */
+ 0, /* U+011cfc: */
+ 0, /* U+011cfd: */
+ 0, /* U+011cfe: */
+ 0, /* U+011cff: */
+ 0, /* U+011d00: */
+ 0, /* U+011d01: */
+ 0, /* U+011d02: */
+ 0, /* U+011d03: */
+ 0, /* U+011d04: */
+ 0, /* U+011d05: */
+ 0, /* U+011d06: */
+ 0, /* U+011d07: */
+ 0, /* U+011d08: */
+ 0, /* U+011d09: */
+ 0, /* U+011d0a: */
+ 0, /* U+011d0b: */
+ 0, /* U+011d0c: */
+ 0, /* U+011d0d: */
+ 0, /* U+011d0e: */
+ 0, /* U+011d0f: */
+ 0, /* U+011d10: */
+ 0, /* U+011d11: */
+ 0, /* U+011d12: */
+ 0, /* U+011d13: */
+ 0, /* U+011d14: */
+ 0, /* U+011d15: */
+ 0, /* U+011d16: */
+ 0, /* U+011d17: */
+ 0, /* U+011d18: */
+ 0, /* U+011d19: */
+ 0, /* U+011d1a: */
+ 0, /* U+011d1b: */
+ 0, /* U+011d1c: */
+ 0, /* U+011d1d: */
+ 0, /* U+011d1e: */
+ 0, /* U+011d1f: */
+ 0, /* U+011d20: */
+ 0, /* U+011d21: */
+ 0, /* U+011d22: */
+ 0, /* U+011d23: */
+ 0, /* U+011d24: */
+ 0, /* U+011d25: */
+ 0, /* U+011d26: */
+ 0, /* U+011d27: */
+ 0, /* U+011d28: */
+ 0, /* U+011d29: */
+ 0, /* U+011d2a: */
+ 0, /* U+011d2b: */
+ 0, /* U+011d2c: */
+ 0, /* U+011d2d: */
+ 0, /* U+011d2e: */
+ 0, /* U+011d2f: */
+ 0, /* U+011d30: */
+ 0, /* U+011d31: */
+ 0, /* U+011d32: */
+ 0, /* U+011d33: */
+ 0, /* U+011d34: */
+ 0, /* U+011d35: */
+ 0, /* U+011d36: */
+ 0, /* U+011d37: */
+ 0, /* U+011d38: */
+ 0, /* U+011d39: */
+ 0, /* U+011d3a: */
+ 0, /* U+011d3b: */
+ 0, /* U+011d3c: */
+ 0, /* U+011d3d: */
+ 0, /* U+011d3e: */
+ 0, /* U+011d3f: */
+ 0, /* U+011d40: */
+ 0, /* U+011d41: */
+ 0, /* U+011d42: */
+ 0, /* U+011d43: */
+ 0, /* U+011d44: */
+ 0, /* U+011d45: */
+ 0, /* U+011d46: */
+ 0, /* U+011d47: */
+ 0, /* U+011d48: */
+ 0, /* U+011d49: */
+ 0, /* U+011d4a: */
+ 0, /* U+011d4b: */
+ 0, /* U+011d4c: */
+ 0, /* U+011d4d: */
+ 0, /* U+011d4e: */
+ 0, /* U+011d4f: */
+ 0, /* U+011d50: */
+ 0, /* U+011d51: */
+ 0, /* U+011d52: */
+ 0, /* U+011d53: */
+ 0, /* U+011d54: */
+ 0, /* U+011d55: */
+ 0, /* U+011d56: */
+ 0, /* U+011d57: */
+ 0, /* U+011d58: */
+ 0, /* U+011d59: */
+ 0, /* U+011d5a: */
+ 0, /* U+011d5b: */
+ 0, /* U+011d5c: */
+ 0, /* U+011d5d: */
+ 0, /* U+011d5e: */
+ 0, /* U+011d5f: */
+ 0, /* U+011d60: */
+ 0, /* U+011d61: */
+ 0, /* U+011d62: */
+ 0, /* U+011d63: */
+ 0, /* U+011d64: */
+ 0, /* U+011d65: */
+ 0, /* U+011d66: */
+ 0, /* U+011d67: */
+ 0, /* U+011d68: */
+ 0, /* U+011d69: */
+ 0, /* U+011d6a: */
+ 0, /* U+011d6b: */
+ 0, /* U+011d6c: */
+ 0, /* U+011d6d: */
+ 0, /* U+011d6e: */
+ 0, /* U+011d6f: */
+ 0, /* U+011d70: */
+ 0, /* U+011d71: */
+ 0, /* U+011d72: */
+ 0, /* U+011d73: */
+ 0, /* U+011d74: */
+ 0, /* U+011d75: */
+ 0, /* U+011d76: */
+ 0, /* U+011d77: */
+ 0, /* U+011d78: */
+ 0, /* U+011d79: */
+ 0, /* U+011d7a: */
+ 0, /* U+011d7b: */
+ 0, /* U+011d7c: */
+ 0, /* U+011d7d: */
+ 0, /* U+011d7e: */
+ 0, /* U+011d7f: */
+ 0, /* U+011d80: */
+ 0, /* U+011d81: */
+ 0, /* U+011d82: */
+ 0, /* U+011d83: */
+ 0, /* U+011d84: */
+ 0, /* U+011d85: */
+ 0, /* U+011d86: */
+ 0, /* U+011d87: */
+ 0, /* U+011d88: */
+ 0, /* U+011d89: */
+ 0, /* U+011d8a: */
+ 0, /* U+011d8b: */
+ 0, /* U+011d8c: */
+ 0, /* U+011d8d: */
+ 0, /* U+011d8e: */
+ 0, /* U+011d8f: */
+ 0, /* U+011d90: */
+ 0, /* U+011d91: */
+ 0, /* U+011d92: */
+ 0, /* U+011d93: */
+ 0, /* U+011d94: */
+ 0, /* U+011d95: */
+ 0, /* U+011d96: */
+ 0, /* U+011d97: */
+ 0, /* U+011d98: */
+ 0, /* U+011d99: */
+ 0, /* U+011d9a: */
+ 0, /* U+011d9b: */
+ 0, /* U+011d9c: */
+ 0, /* U+011d9d: */
+ 0, /* U+011d9e: */
+ 0, /* U+011d9f: */
+ 0, /* U+011da0: */
+ 0, /* U+011da1: */
+ 0, /* U+011da2: */
+ 0, /* U+011da3: */
+ 0, /* U+011da4: */
+ 0, /* U+011da5: */
+ 0, /* U+011da6: */
+ 0, /* U+011da7: */
+ 0, /* U+011da8: */
+ 0, /* U+011da9: */
+ 0, /* U+011daa: */
+ 0, /* U+011dab: */
+ 0, /* U+011dac: */
+ 0, /* U+011dad: */
+ 0, /* U+011dae: */
+ 0, /* U+011daf: */
+ 0, /* U+011db0: */
+ 0, /* U+011db1: */
+ 0, /* U+011db2: */
+ 0, /* U+011db3: */
+ 0, /* U+011db4: */
+ 0, /* U+011db5: */
+ 0, /* U+011db6: */
+ 0, /* U+011db7: */
+ 0, /* U+011db8: */
+ 0, /* U+011db9: */
+ 0, /* U+011dba: */
+ 0, /* U+011dbb: */
+ 0, /* U+011dbc: */
+ 0, /* U+011dbd: */
+ 0, /* U+011dbe: */
+ 0, /* U+011dbf: */
+ 0, /* U+011dc0: */
+ 0, /* U+011dc1: */
+ 0, /* U+011dc2: */
+ 0, /* U+011dc3: */
+ 0, /* U+011dc4: */
+ 0, /* U+011dc5: */
+ 0, /* U+011dc6: */
+ 0, /* U+011dc7: */
+ 0, /* U+011dc8: */
+ 0, /* U+011dc9: */
+ 0, /* U+011dca: */
+ 0, /* U+011dcb: */
+ 0, /* U+011dcc: */
+ 0, /* U+011dcd: */
+ 0, /* U+011dce: */
+ 0, /* U+011dcf: */
+ 0, /* U+011dd0: */
+ 0, /* U+011dd1: */
+ 0, /* U+011dd2: */
+ 0, /* U+011dd3: */
+ 0, /* U+011dd4: */
+ 0, /* U+011dd5: */
+ 0, /* U+011dd6: */
+ 0, /* U+011dd7: */
+ 0, /* U+011dd8: */
+ 0, /* U+011dd9: */
+ 0, /* U+011dda: */
+ 0, /* U+011ddb: */
+ 0, /* U+011ddc: */
+ 0, /* U+011ddd: */
+ 0, /* U+011dde: */
+ 0, /* U+011ddf: */
+ 0, /* U+011de0: */
+ 0, /* U+011de1: */
+ 0, /* U+011de2: */
+ 0, /* U+011de3: */
+ 0, /* U+011de4: */
+ 0, /* U+011de5: */
+ 0, /* U+011de6: */
+ 0, /* U+011de7: */
+ 0, /* U+011de8: */
+ 0, /* U+011de9: */
+ 0, /* U+011dea: */
+ 0, /* U+011deb: */
+ 0, /* U+011dec: */
+ 0, /* U+011ded: */
+ 0, /* U+011dee: */
+ 0, /* U+011def: */
+ 0, /* U+011df0: */
+ 0, /* U+011df1: */
+ 0, /* U+011df2: */
+ 0, /* U+011df3: */
+ 0, /* U+011df4: */
+ 0, /* U+011df5: */
+ 0, /* U+011df6: */
+ 0, /* U+011df7: */
+ 0, /* U+011df8: */
+ 0, /* U+011df9: */
+ 0, /* U+011dfa: */
+ 0, /* U+011dfb: */
+ 0, /* U+011dfc: */
+ 0, /* U+011dfd: */
+ 0, /* U+011dfe: */
+ 0, /* U+011dff: */
+ 0, /* U+011e00: */
+ 0, /* U+011e01: */
+ 0, /* U+011e02: */
+ 0, /* U+011e03: */
+ 0, /* U+011e04: */
+ 0, /* U+011e05: */
+ 0, /* U+011e06: */
+ 0, /* U+011e07: */
+ 0, /* U+011e08: */
+ 0, /* U+011e09: */
+ 0, /* U+011e0a: */
+ 0, /* U+011e0b: */
+ 0, /* U+011e0c: */
+ 0, /* U+011e0d: */
+ 0, /* U+011e0e: */
+ 0, /* U+011e0f: */
+ 0, /* U+011e10: */
+ 0, /* U+011e11: */
+ 0, /* U+011e12: */
+ 0, /* U+011e13: */
+ 0, /* U+011e14: */
+ 0, /* U+011e15: */
+ 0, /* U+011e16: */
+ 0, /* U+011e17: */
+ 0, /* U+011e18: */
+ 0, /* U+011e19: */
+ 0, /* U+011e1a: */
+ 0, /* U+011e1b: */
+ 0, /* U+011e1c: */
+ 0, /* U+011e1d: */
+ 0, /* U+011e1e: */
+ 0, /* U+011e1f: */
+ 0, /* U+011e20: */
+ 0, /* U+011e21: */
+ 0, /* U+011e22: */
+ 0, /* U+011e23: */
+ 0, /* U+011e24: */
+ 0, /* U+011e25: */
+ 0, /* U+011e26: */
+ 0, /* U+011e27: */
+ 0, /* U+011e28: */
+ 0, /* U+011e29: */
+ 0, /* U+011e2a: */
+ 0, /* U+011e2b: */
+ 0, /* U+011e2c: */
+ 0, /* U+011e2d: */
+ 0, /* U+011e2e: */
+ 0, /* U+011e2f: */
+ 0, /* U+011e30: */
+ 0, /* U+011e31: */
+ 0, /* U+011e32: */
+ 0, /* U+011e33: */
+ 0, /* U+011e34: */
+ 0, /* U+011e35: */
+ 0, /* U+011e36: */
+ 0, /* U+011e37: */
+ 0, /* U+011e38: */
+ 0, /* U+011e39: */
+ 0, /* U+011e3a: */
+ 0, /* U+011e3b: */
+ 0, /* U+011e3c: */
+ 0, /* U+011e3d: */
+ 0, /* U+011e3e: */
+ 0, /* U+011e3f: */
+ 0, /* U+011e40: */
+ 0, /* U+011e41: */
+ 0, /* U+011e42: */
+ 0, /* U+011e43: */
+ 0, /* U+011e44: */
+ 0, /* U+011e45: */
+ 0, /* U+011e46: */
+ 0, /* U+011e47: */
+ 0, /* U+011e48: */
+ 0, /* U+011e49: */
+ 0, /* U+011e4a: */
+ 0, /* U+011e4b: */
+ 0, /* U+011e4c: */
+ 0, /* U+011e4d: */
+ 0, /* U+011e4e: */
+ 0, /* U+011e4f: */
+ 0, /* U+011e50: */
+ 0, /* U+011e51: */
+ 0, /* U+011e52: */
+ 0, /* U+011e53: */
+ 0, /* U+011e54: */
+ 0, /* U+011e55: */
+ 0, /* U+011e56: */
+ 0, /* U+011e57: */
+ 0, /* U+011e58: */
+ 0, /* U+011e59: */
+ 0, /* U+011e5a: */
+ 0, /* U+011e5b: */
+ 0, /* U+011e5c: */
+ 0, /* U+011e5d: */
+ 0, /* U+011e5e: */
+ 0, /* U+011e5f: */
+ 0, /* U+011e60: */
+ 0, /* U+011e61: */
+ 0, /* U+011e62: */
+ 0, /* U+011e63: */
+ 0, /* U+011e64: */
+ 0, /* U+011e65: */
+ 0, /* U+011e66: */
+ 0, /* U+011e67: */
+ 0, /* U+011e68: */
+ 0, /* U+011e69: */
+ 0, /* U+011e6a: */
+ 0, /* U+011e6b: */
+ 0, /* U+011e6c: */
+ 0, /* U+011e6d: */
+ 0, /* U+011e6e: */
+ 0, /* U+011e6f: */
+ 0, /* U+011e70: */
+ 0, /* U+011e71: */
+ 0, /* U+011e72: */
+ 0, /* U+011e73: */
+ 0, /* U+011e74: */
+ 0, /* U+011e75: */
+ 0, /* U+011e76: */
+ 0, /* U+011e77: */
+ 0, /* U+011e78: */
+ 0, /* U+011e79: */
+ 0, /* U+011e7a: */
+ 0, /* U+011e7b: */
+ 0, /* U+011e7c: */
+ 0, /* U+011e7d: */
+ 0, /* U+011e7e: */
+ 0, /* U+011e7f: */
+ 0, /* U+011e80: */
+ 0, /* U+011e81: */
+ 0, /* U+011e82: */
+ 0, /* U+011e83: */
+ 0, /* U+011e84: */
+ 0, /* U+011e85: */
+ 0, /* U+011e86: */
+ 0, /* U+011e87: */
+ 0, /* U+011e88: */
+ 0, /* U+011e89: */
+ 0, /* U+011e8a: */
+ 0, /* U+011e8b: */
+ 0, /* U+011e8c: */
+ 0, /* U+011e8d: */
+ 0, /* U+011e8e: */
+ 0, /* U+011e8f: */
+ 0, /* U+011e90: */
+ 0, /* U+011e91: */
+ 0, /* U+011e92: */
+ 0, /* U+011e93: */
+ 0, /* U+011e94: */
+ 0, /* U+011e95: */
+ 0, /* U+011e96: */
+ 0, /* U+011e97: */
+ 0, /* U+011e98: */
+ 0, /* U+011e99: */
+ 0, /* U+011e9a: */
+ 0, /* U+011e9b: */
+ 0, /* U+011e9c: */
+ 0, /* U+011e9d: */
+ 0, /* U+011e9e: */
+ 0, /* U+011e9f: */
+ 0, /* U+011ea0: */
+ 0, /* U+011ea1: */
+ 0, /* U+011ea2: */
+ 0, /* U+011ea3: */
+ 0, /* U+011ea4: */
+ 0, /* U+011ea5: */
+ 0, /* U+011ea6: */
+ 0, /* U+011ea7: */
+ 0, /* U+011ea8: */
+ 0, /* U+011ea9: */
+ 0, /* U+011eaa: */
+ 0, /* U+011eab: */
+ 0, /* U+011eac: */
+ 0, /* U+011ead: */
+ 0, /* U+011eae: */
+ 0, /* U+011eaf: */
+ 0, /* U+011eb0: */
+ 0, /* U+011eb1: */
+ 0, /* U+011eb2: */
+ 0, /* U+011eb3: */
+ 0, /* U+011eb4: */
+ 0, /* U+011eb5: */
+ 0, /* U+011eb6: */
+ 0, /* U+011eb7: */
+ 0, /* U+011eb8: */
+ 0, /* U+011eb9: */
+ 0, /* U+011eba: */
+ 0, /* U+011ebb: */
+ 0, /* U+011ebc: */
+ 0, /* U+011ebd: */
+ 0, /* U+011ebe: */
+ 0, /* U+011ebf: */
+ 0, /* U+011ec0: */
+ 0, /* U+011ec1: */
+ 0, /* U+011ec2: */
+ 0, /* U+011ec3: */
+ 0, /* U+011ec4: */
+ 0, /* U+011ec5: */
+ 0, /* U+011ec6: */
+ 0, /* U+011ec7: */
+ 0, /* U+011ec8: */
+ 0, /* U+011ec9: */
+ 0, /* U+011eca: */
+ 0, /* U+011ecb: */
+ 0, /* U+011ecc: */
+ 0, /* U+011ecd: */
+ 0, /* U+011ece: */
+ 0, /* U+011ecf: */
+ 0, /* U+011ed0: */
+ 0, /* U+011ed1: */
+ 0, /* U+011ed2: */
+ 0, /* U+011ed3: */
+ 0, /* U+011ed4: */
+ 0, /* U+011ed5: */
+ 0, /* U+011ed6: */
+ 0, /* U+011ed7: */
+ 0, /* U+011ed8: */
+ 0, /* U+011ed9: */
+ 0, /* U+011eda: */
+ 0, /* U+011edb: */
+ 0, /* U+011edc: */
+ 0, /* U+011edd: */
+ 0, /* U+011ede: */
+ 0, /* U+011edf: */
+ 0, /* U+011ee0: */
+ 0, /* U+011ee1: */
+ 0, /* U+011ee2: */
+ 0, /* U+011ee3: */
+ 0, /* U+011ee4: */
+ 0, /* U+011ee5: */
+ 0, /* U+011ee6: */
+ 0, /* U+011ee7: */
+ 0, /* U+011ee8: */
+ 0, /* U+011ee9: */
+ 0, /* U+011eea: */
+ 0, /* U+011eeb: */
+ 0, /* U+011eec: */
+ 0, /* U+011eed: */
+ 0, /* U+011eee: */
+ 0, /* U+011eef: */
+ 0, /* U+011ef0: */
+ 0, /* U+011ef1: */
+ 0, /* U+011ef2: */
+ 0, /* U+011ef3: */
+ 0, /* U+011ef4: */
+ 0, /* U+011ef5: */
+ 0, /* U+011ef6: */
+ 0, /* U+011ef7: */
+ 0, /* U+011ef8: */
+ 0, /* U+011ef9: */
+ 0, /* U+011efa: */
+ 0, /* U+011efb: */
+ 0, /* U+011efc: */
+ 0, /* U+011efd: */
+ 0, /* U+011efe: */
+ 0, /* U+011eff: */
+ 0, /* U+011f00: */
+ 0, /* U+011f01: */
+ 0, /* U+011f02: */
+ 0, /* U+011f03: */
+ 0, /* U+011f04: */
+ 0, /* U+011f05: */
+ 0, /* U+011f06: */
+ 0, /* U+011f07: */
+ 0, /* U+011f08: */
+ 0, /* U+011f09: */
+ 0, /* U+011f0a: */
+ 0, /* U+011f0b: */
+ 0, /* U+011f0c: */
+ 0, /* U+011f0d: */
+ 0, /* U+011f0e: */
+ 0, /* U+011f0f: */
+ 0, /* U+011f10: */
+ 0, /* U+011f11: */
+ 0, /* U+011f12: */
+ 0, /* U+011f13: */
+ 0, /* U+011f14: */
+ 0, /* U+011f15: */
+ 0, /* U+011f16: */
+ 0, /* U+011f17: */
+ 0, /* U+011f18: */
+ 0, /* U+011f19: */
+ 0, /* U+011f1a: */
+ 0, /* U+011f1b: */
+ 0, /* U+011f1c: */
+ 0, /* U+011f1d: */
+ 0, /* U+011f1e: */
+ 0, /* U+011f1f: */
+ 0, /* U+011f20: */
+ 0, /* U+011f21: */
+ 0, /* U+011f22: */
+ 0, /* U+011f23: */
+ 0, /* U+011f24: */
+ 0, /* U+011f25: */
+ 0, /* U+011f26: */
+ 0, /* U+011f27: */
+ 0, /* U+011f28: */
+ 0, /* U+011f29: */
+ 0, /* U+011f2a: */
+ 0, /* U+011f2b: */
+ 0, /* U+011f2c: */
+ 0, /* U+011f2d: */
+ 0, /* U+011f2e: */
+ 0, /* U+011f2f: */
+ 0, /* U+011f30: */
+ 0, /* U+011f31: */
+ 0, /* U+011f32: */
+ 0, /* U+011f33: */
+ 0, /* U+011f34: */
+ 0, /* U+011f35: */
+ 0, /* U+011f36: */
+ 0, /* U+011f37: */
+ 0, /* U+011f38: */
+ 0, /* U+011f39: */
+ 0, /* U+011f3a: */
+ 0, /* U+011f3b: */
+ 0, /* U+011f3c: */
+ 0, /* U+011f3d: */
+ 0, /* U+011f3e: */
+ 0, /* U+011f3f: */
+ 0, /* U+011f40: */
+ 0, /* U+011f41: */
+ 0, /* U+011f42: */
+ 0, /* U+011f43: */
+ 0, /* U+011f44: */
+ 0, /* U+011f45: */
+ 0, /* U+011f46: */
+ 0, /* U+011f47: */
+ 0, /* U+011f48: */
+ 0, /* U+011f49: */
+ 0, /* U+011f4a: */
+ 0, /* U+011f4b: */
+ 0, /* U+011f4c: */
+ 0, /* U+011f4d: */
+ 0, /* U+011f4e: */
+ 0, /* U+011f4f: */
+ 0, /* U+011f50: */
+ 0, /* U+011f51: */
+ 0, /* U+011f52: */
+ 0, /* U+011f53: */
+ 0, /* U+011f54: */
+ 0, /* U+011f55: */
+ 0, /* U+011f56: */
+ 0, /* U+011f57: */
+ 0, /* U+011f58: */
+ 0, /* U+011f59: */
+ 0, /* U+011f5a: */
+ 0, /* U+011f5b: */
+ 0, /* U+011f5c: */
+ 0, /* U+011f5d: */
+ 0, /* U+011f5e: */
+ 0, /* U+011f5f: */
+ 0, /* U+011f60: */
+ 0, /* U+011f61: */
+ 0, /* U+011f62: */
+ 0, /* U+011f63: */
+ 0, /* U+011f64: */
+ 0, /* U+011f65: */
+ 0, /* U+011f66: */
+ 0, /* U+011f67: */
+ 0, /* U+011f68: */
+ 0, /* U+011f69: */
+ 0, /* U+011f6a: */
+ 0, /* U+011f6b: */
+ 0, /* U+011f6c: */
+ 0, /* U+011f6d: */
+ 0, /* U+011f6e: */
+ 0, /* U+011f6f: */
+ 0, /* U+011f70: */
+ 0, /* U+011f71: */
+ 0, /* U+011f72: */
+ 0, /* U+011f73: */
+ 0, /* U+011f74: */
+ 0, /* U+011f75: */
+ 0, /* U+011f76: */
+ 0, /* U+011f77: */
+ 0, /* U+011f78: */
+ 0, /* U+011f79: */
+ 0, /* U+011f7a: */
+ 0, /* U+011f7b: */
+ 0, /* U+011f7c: */
+ 0, /* U+011f7d: */
+ 0, /* U+011f7e: */
+ 0, /* U+011f7f: */
+ 0, /* U+011f80: */
+ 0, /* U+011f81: */
+ 0, /* U+011f82: */
+ 0, /* U+011f83: */
+ 0, /* U+011f84: */
+ 0, /* U+011f85: */
+ 0, /* U+011f86: */
+ 0, /* U+011f87: */
+ 0, /* U+011f88: */
+ 0, /* U+011f89: */
+ 0, /* U+011f8a: */
+ 0, /* U+011f8b: */
+ 0, /* U+011f8c: */
+ 0, /* U+011f8d: */
+ 0, /* U+011f8e: */
+ 0, /* U+011f8f: */
+ 0, /* U+011f90: */
+ 0, /* U+011f91: */
+ 0, /* U+011f92: */
+ 0, /* U+011f93: */
+ 0, /* U+011f94: */
+ 0, /* U+011f95: */
+ 0, /* U+011f96: */
+ 0, /* U+011f97: */
+ 0, /* U+011f98: */
+ 0, /* U+011f99: */
+ 0, /* U+011f9a: */
+ 0, /* U+011f9b: */
+ 0, /* U+011f9c: */
+ 0, /* U+011f9d: */
+ 0, /* U+011f9e: */
+ 0, /* U+011f9f: */
+ 0, /* U+011fa0: */
+ 0, /* U+011fa1: */
+ 0, /* U+011fa2: */
+ 0, /* U+011fa3: */
+ 0, /* U+011fa4: */
+ 0, /* U+011fa5: */
+ 0, /* U+011fa6: */
+ 0, /* U+011fa7: */
+ 0, /* U+011fa8: */
+ 0, /* U+011fa9: */
+ 0, /* U+011faa: */
+ 0, /* U+011fab: */
+ 0, /* U+011fac: */
+ 0, /* U+011fad: */
+ 0, /* U+011fae: */
+ 0, /* U+011faf: */
+ 0, /* U+011fb0: */
+ 0, /* U+011fb1: */
+ 0, /* U+011fb2: */
+ 0, /* U+011fb3: */
+ 0, /* U+011fb4: */
+ 0, /* U+011fb5: */
+ 0, /* U+011fb6: */
+ 0, /* U+011fb7: */
+ 0, /* U+011fb8: */
+ 0, /* U+011fb9: */
+ 0, /* U+011fba: */
+ 0, /* U+011fbb: */
+ 0, /* U+011fbc: */
+ 0, /* U+011fbd: */
+ 0, /* U+011fbe: */
+ 0, /* U+011fbf: */
+ 0, /* U+011fc0: */
+ 0, /* U+011fc1: */
+ 0, /* U+011fc2: */
+ 0, /* U+011fc3: */
+ 0, /* U+011fc4: */
+ 0, /* U+011fc5: */
+ 0, /* U+011fc6: */
+ 0, /* U+011fc7: */
+ 0, /* U+011fc8: */
+ 0, /* U+011fc9: */
+ 0, /* U+011fca: */
+ 0, /* U+011fcb: */
+ 0, /* U+011fcc: */
+ 0, /* U+011fcd: */
+ 0, /* U+011fce: */
+ 0, /* U+011fcf: */
+ 0, /* U+011fd0: */
+ 0, /* U+011fd1: */
+ 0, /* U+011fd2: */
+ 0, /* U+011fd3: */
+ 0, /* U+011fd4: */
+ 0, /* U+011fd5: */
+ 0, /* U+011fd6: */
+ 0, /* U+011fd7: */
+ 0, /* U+011fd8: */
+ 0, /* U+011fd9: */
+ 0, /* U+011fda: */
+ 0, /* U+011fdb: */
+ 0, /* U+011fdc: */
+ 0, /* U+011fdd: */
+ 0, /* U+011fde: */
+ 0, /* U+011fdf: */
+ 0, /* U+011fe0: */
+ 0, /* U+011fe1: */
+ 0, /* U+011fe2: */
+ 0, /* U+011fe3: */
+ 0, /* U+011fe4: */
+ 0, /* U+011fe5: */
+ 0, /* U+011fe6: */
+ 0, /* U+011fe7: */
+ 0, /* U+011fe8: */
+ 0, /* U+011fe9: */
+ 0, /* U+011fea: */
+ 0, /* U+011feb: */
+ 0, /* U+011fec: */
+ 0, /* U+011fed: */
+ 0, /* U+011fee: */
+ 0, /* U+011fef: */
+ 0, /* U+011ff0: */
+ 0, /* U+011ff1: */
+ 0, /* U+011ff2: */
+ 0, /* U+011ff3: */
+ 0, /* U+011ff4: */
+ 0, /* U+011ff5: */
+ 0, /* U+011ff6: */
+ 0, /* U+011ff7: */
+ 0, /* U+011ff8: */
+ 0, /* U+011ff9: */
+ 0, /* U+011ffa: */
+ 0, /* U+011ffb: */
+ 0, /* U+011ffc: */
+ 0, /* U+011ffd: */
+ 0, /* U+011ffe: */
+ 0, /* U+011fff: */
+ RTUNI_ALPHA, /* U+012000: CUNEIFORM SIGN A*/
+ RTUNI_ALPHA, /* U+012001: CUNEIFORM SIGN A TIMES A*/
+ RTUNI_ALPHA, /* U+012002: CUNEIFORM SIGN A TIMES BAD*/
+ RTUNI_ALPHA, /* U+012003: CUNEIFORM SIGN A TIMES GAN2 TENU*/
+ RTUNI_ALPHA, /* U+012004: CUNEIFORM SIGN A TIMES HA*/
+ RTUNI_ALPHA, /* U+012005: CUNEIFORM SIGN A TIMES IGI*/
+ RTUNI_ALPHA, /* U+012006: CUNEIFORM SIGN A TIMES LAGAR GUNU*/
+ RTUNI_ALPHA, /* U+012007: CUNEIFORM SIGN A TIMES MUSH*/
+ RTUNI_ALPHA, /* U+012008: CUNEIFORM SIGN A TIMES SAG*/
+ RTUNI_ALPHA, /* U+012009: CUNEIFORM SIGN A2*/
+ RTUNI_ALPHA, /* U+01200a: CUNEIFORM SIGN AB*/
+ RTUNI_ALPHA, /* U+01200b: CUNEIFORM SIGN AB TIMES ASH2*/
+ RTUNI_ALPHA, /* U+01200c: CUNEIFORM SIGN AB TIMES DUN3 GUNU*/
+ RTUNI_ALPHA, /* U+01200d: CUNEIFORM SIGN AB TIMES GAL*/
+ RTUNI_ALPHA, /* U+01200e: CUNEIFORM SIGN AB TIMES GAN2 TENU*/
+ RTUNI_ALPHA, /* U+01200f: CUNEIFORM SIGN AB TIMES HA*/
+ RTUNI_ALPHA, /* U+012010: CUNEIFORM SIGN AB TIMES IGI GUNU*/
+ RTUNI_ALPHA, /* U+012011: CUNEIFORM SIGN AB TIMES IMIN*/
+ RTUNI_ALPHA, /* U+012012: CUNEIFORM SIGN AB TIMES LAGAB*/
+ RTUNI_ALPHA, /* U+012013: CUNEIFORM SIGN AB TIMES SHESH*/
+ RTUNI_ALPHA, /* U+012014: CUNEIFORM SIGN AB TIMES U PLUS U PLUS U*/
+ RTUNI_ALPHA, /* U+012015: CUNEIFORM SIGN AB GUNU*/
+ RTUNI_ALPHA, /* U+012016: CUNEIFORM SIGN AB2*/
+ RTUNI_ALPHA, /* U+012017: CUNEIFORM SIGN AB2 TIMES BALAG*/
+ RTUNI_ALPHA, /* U+012018: CUNEIFORM SIGN AB2 TIMES GAN2 TENU*/
+ RTUNI_ALPHA, /* U+012019: CUNEIFORM SIGN AB2 TIMES ME PLUS EN*/
+ RTUNI_ALPHA, /* U+01201a: CUNEIFORM SIGN AB2 TIMES SHA3*/
+ RTUNI_ALPHA, /* U+01201b: CUNEIFORM SIGN AB2 TIMES TAK4*/
+ RTUNI_ALPHA, /* U+01201c: CUNEIFORM SIGN AD*/
+ RTUNI_ALPHA, /* U+01201d: CUNEIFORM SIGN AK*/
+ RTUNI_ALPHA, /* U+01201e: CUNEIFORM SIGN AK TIMES ERIN2*/
+ RTUNI_ALPHA, /* U+01201f: CUNEIFORM SIGN AK TIMES SHITA PLUS GISH*/
+ RTUNI_ALPHA, /* U+012020: CUNEIFORM SIGN AL*/
+ RTUNI_ALPHA, /* U+012021: CUNEIFORM SIGN AL TIMES AL*/
+ RTUNI_ALPHA, /* U+012022: CUNEIFORM SIGN AL TIMES DIM2*/
+ RTUNI_ALPHA, /* U+012023: CUNEIFORM SIGN AL TIMES GISH*/
+ RTUNI_ALPHA, /* U+012024: CUNEIFORM SIGN AL TIMES HA*/
+ RTUNI_ALPHA, /* U+012025: CUNEIFORM SIGN AL TIMES KAD3*/
+ RTUNI_ALPHA, /* U+012026: CUNEIFORM SIGN AL TIMES KI*/
+ RTUNI_ALPHA, /* U+012027: CUNEIFORM SIGN AL TIMES SHE*/
+ RTUNI_ALPHA, /* U+012028: CUNEIFORM SIGN AL TIMES USH*/
+ RTUNI_ALPHA, /* U+012029: CUNEIFORM SIGN ALAN*/
+ RTUNI_ALPHA, /* U+01202a: CUNEIFORM SIGN ALEPH*/
+ RTUNI_ALPHA, /* U+01202b: CUNEIFORM SIGN AMAR*/
+ RTUNI_ALPHA, /* U+01202c: CUNEIFORM SIGN AMAR TIMES SHE*/
+ RTUNI_ALPHA, /* U+01202d: CUNEIFORM SIGN AN*/
+ RTUNI_ALPHA, /* U+01202e: CUNEIFORM SIGN AN OVER AN*/
+ RTUNI_ALPHA, /* U+01202f: CUNEIFORM SIGN AN THREE TIMES*/
+ RTUNI_ALPHA, /* U+012030: CUNEIFORM SIGN AN PLUS NAGA OPPOSING AN PLUS NAGA*/
+ RTUNI_ALPHA, /* U+012031: CUNEIFORM SIGN AN PLUS NAGA SQUARED*/
+ RTUNI_ALPHA, /* U+012032: CUNEIFORM SIGN ANSHE*/
+ RTUNI_ALPHA, /* U+012033: CUNEIFORM SIGN APIN*/
+ RTUNI_ALPHA, /* U+012034: CUNEIFORM SIGN ARAD*/
+ RTUNI_ALPHA, /* U+012035: CUNEIFORM SIGN ARAD TIMES KUR*/
+ RTUNI_ALPHA, /* U+012036: CUNEIFORM SIGN ARKAB*/
+ RTUNI_ALPHA, /* U+012037: CUNEIFORM SIGN ASAL2*/
+ RTUNI_ALPHA, /* U+012038: CUNEIFORM SIGN ASH*/
+ RTUNI_ALPHA, /* U+012039: CUNEIFORM SIGN ASH ZIDA TENU*/
+ RTUNI_ALPHA, /* U+01203a: CUNEIFORM SIGN ASH KABA TENU*/
+ RTUNI_ALPHA, /* U+01203b: CUNEIFORM SIGN ASH OVER ASH TUG2 OVER TUG2 TUG2 OVER TUG2 PAP*/
+ RTUNI_ALPHA, /* U+01203c: CUNEIFORM SIGN ASH OVER ASH OVER ASH*/
+ RTUNI_ALPHA, /* U+01203d: CUNEIFORM SIGN ASH OVER ASH OVER ASH CROSSING ASH OVER ASH OVER ASH*/
+ RTUNI_ALPHA, /* U+01203e: CUNEIFORM SIGN ASH2*/
+ RTUNI_ALPHA, /* U+01203f: CUNEIFORM SIGN ASHGAB*/
+ RTUNI_ALPHA, /* U+012040: CUNEIFORM SIGN BA*/
+ RTUNI_ALPHA, /* U+012041: CUNEIFORM SIGN BAD*/
+ RTUNI_ALPHA, /* U+012042: CUNEIFORM SIGN BAG3*/
+ RTUNI_ALPHA, /* U+012043: CUNEIFORM SIGN BAHAR2*/
+ RTUNI_ALPHA, /* U+012044: CUNEIFORM SIGN BAL*/
+ RTUNI_ALPHA, /* U+012045: CUNEIFORM SIGN BAL OVER BAL*/
+ RTUNI_ALPHA, /* U+012046: CUNEIFORM SIGN BALAG*/
+ RTUNI_ALPHA, /* U+012047: CUNEIFORM SIGN BAR*/
+ RTUNI_ALPHA, /* U+012048: CUNEIFORM SIGN BARA2*/
+ RTUNI_ALPHA, /* U+012049: CUNEIFORM SIGN BI*/
+ RTUNI_ALPHA, /* U+01204a: CUNEIFORM SIGN BI TIMES A*/
+ RTUNI_ALPHA, /* U+01204b: CUNEIFORM SIGN BI TIMES GAR*/
+ RTUNI_ALPHA, /* U+01204c: CUNEIFORM SIGN BI TIMES IGI GUNU*/
+ RTUNI_ALPHA, /* U+01204d: CUNEIFORM SIGN BU*/
+ RTUNI_ALPHA, /* U+01204e: CUNEIFORM SIGN BU OVER BU AB*/
+ RTUNI_ALPHA, /* U+01204f: CUNEIFORM SIGN BU OVER BU UN*/
+ RTUNI_ALPHA, /* U+012050: CUNEIFORM SIGN BU CROSSING BU*/
+ RTUNI_ALPHA, /* U+012051: CUNEIFORM SIGN BULUG*/
+ RTUNI_ALPHA, /* U+012052: CUNEIFORM SIGN BULUG OVER BULUG*/
+ RTUNI_ALPHA, /* U+012053: CUNEIFORM SIGN BUR*/
+ RTUNI_ALPHA, /* U+012054: CUNEIFORM SIGN BUR2*/
+ RTUNI_ALPHA, /* U+012055: CUNEIFORM SIGN DA*/
+ RTUNI_ALPHA, /* U+012056: CUNEIFORM SIGN DAG*/
+ RTUNI_ALPHA, /* U+012057: CUNEIFORM SIGN DAG KISIM5 TIMES A PLUS MASH*/
+ RTUNI_ALPHA, /* U+012058: CUNEIFORM SIGN DAG KISIM5 TIMES AMAR*/
+ RTUNI_ALPHA, /* U+012059: CUNEIFORM SIGN DAG KISIM5 TIMES BALAG*/
+ RTUNI_ALPHA, /* U+01205a: CUNEIFORM SIGN DAG KISIM5 TIMES BI*/
+ RTUNI_ALPHA, /* U+01205b: CUNEIFORM SIGN DAG KISIM5 TIMES GA*/
+ RTUNI_ALPHA, /* U+01205c: CUNEIFORM SIGN DAG KISIM5 TIMES GA PLUS MASH*/
+ RTUNI_ALPHA, /* U+01205d: CUNEIFORM SIGN DAG KISIM5 TIMES GI*/
+ RTUNI_ALPHA, /* U+01205e: CUNEIFORM SIGN DAG KISIM5 TIMES GIR2*/
+ RTUNI_ALPHA, /* U+01205f: CUNEIFORM SIGN DAG KISIM5 TIMES GUD*/
+ RTUNI_ALPHA, /* U+012060: CUNEIFORM SIGN DAG KISIM5 TIMES HA*/
+ RTUNI_ALPHA, /* U+012061: CUNEIFORM SIGN DAG KISIM5 TIMES IR*/
+ RTUNI_ALPHA, /* U+012062: CUNEIFORM SIGN DAG KISIM5 TIMES IR PLUS LU*/
+ RTUNI_ALPHA, /* U+012063: CUNEIFORM SIGN DAG KISIM5 TIMES KAK*/
+ RTUNI_ALPHA, /* U+012064: CUNEIFORM SIGN DAG KISIM5 TIMES LA*/
+ RTUNI_ALPHA, /* U+012065: CUNEIFORM SIGN DAG KISIM5 TIMES LU*/
+ RTUNI_ALPHA, /* U+012066: CUNEIFORM SIGN DAG KISIM5 TIMES LU PLUS MASH2*/
+ RTUNI_ALPHA, /* U+012067: CUNEIFORM SIGN DAG KISIM5 TIMES LUM*/
+ RTUNI_ALPHA, /* U+012068: CUNEIFORM SIGN DAG KISIM5 TIMES NE*/
+ RTUNI_ALPHA, /* U+012069: CUNEIFORM SIGN DAG KISIM5 TIMES PAP PLUS PAP*/
+ RTUNI_ALPHA, /* U+01206a: CUNEIFORM SIGN DAG KISIM5 TIMES SI*/
+ RTUNI_ALPHA, /* U+01206b: CUNEIFORM SIGN DAG KISIM5 TIMES TAK4*/
+ RTUNI_ALPHA, /* U+01206c: CUNEIFORM SIGN DAG KISIM5 TIMES U2 PLUS GIR2*/
+ RTUNI_ALPHA, /* U+01206d: CUNEIFORM SIGN DAG KISIM5 TIMES USH*/
+ RTUNI_ALPHA, /* U+01206e: CUNEIFORM SIGN DAM*/
+ RTUNI_ALPHA, /* U+01206f: CUNEIFORM SIGN DAR*/
+ RTUNI_ALPHA, /* U+012070: CUNEIFORM SIGN DARA3*/
+ RTUNI_ALPHA, /* U+012071: CUNEIFORM SIGN DARA4*/
+ RTUNI_ALPHA, /* U+012072: CUNEIFORM SIGN DI*/
+ RTUNI_ALPHA, /* U+012073: CUNEIFORM SIGN DIB*/
+ RTUNI_ALPHA, /* U+012074: CUNEIFORM SIGN DIM*/
+ RTUNI_ALPHA, /* U+012075: CUNEIFORM SIGN DIM TIMES SHE*/
+ RTUNI_ALPHA, /* U+012076: CUNEIFORM SIGN DIM2*/
+ RTUNI_ALPHA, /* U+012077: CUNEIFORM SIGN DIN*/
+ RTUNI_ALPHA, /* U+012078: CUNEIFORM SIGN DIN KASKAL U GUNU DISH*/
+ RTUNI_ALPHA, /* U+012079: CUNEIFORM SIGN DISH*/
+ RTUNI_ALPHA, /* U+01207a: CUNEIFORM SIGN DU*/
+ RTUNI_ALPHA, /* U+01207b: CUNEIFORM SIGN DU OVER DU*/
+ RTUNI_ALPHA, /* U+01207c: CUNEIFORM SIGN DU GUNU*/
+ RTUNI_ALPHA, /* U+01207d: CUNEIFORM SIGN DU SHESHIG*/
+ RTUNI_ALPHA, /* U+01207e: CUNEIFORM SIGN DUB*/
+ RTUNI_ALPHA, /* U+01207f: CUNEIFORM SIGN DUB TIMES ESH2*/
+ RTUNI_ALPHA, /* U+012080: CUNEIFORM SIGN DUB2*/
+ RTUNI_ALPHA, /* U+012081: CUNEIFORM SIGN DUG*/
+ RTUNI_ALPHA, /* U+012082: CUNEIFORM SIGN DUGUD*/
+ RTUNI_ALPHA, /* U+012083: CUNEIFORM SIGN DUH*/
+ RTUNI_ALPHA, /* U+012084: CUNEIFORM SIGN DUN*/
+ RTUNI_ALPHA, /* U+012085: CUNEIFORM SIGN DUN3*/
+ RTUNI_ALPHA, /* U+012086: CUNEIFORM SIGN DUN3 GUNU*/
+ RTUNI_ALPHA, /* U+012087: CUNEIFORM SIGN DUN3 GUNU GUNU*/
+ RTUNI_ALPHA, /* U+012088: CUNEIFORM SIGN DUN4*/
+ RTUNI_ALPHA, /* U+012089: CUNEIFORM SIGN DUR2*/
+ RTUNI_ALPHA, /* U+01208a: CUNEIFORM SIGN E*/
+ RTUNI_ALPHA, /* U+01208b: CUNEIFORM SIGN E TIMES PAP*/
+ RTUNI_ALPHA, /* U+01208c: CUNEIFORM SIGN E OVER E NUN OVER NUN*/
+ RTUNI_ALPHA, /* U+01208d: CUNEIFORM SIGN E2*/
+ RTUNI_ALPHA, /* U+01208e: CUNEIFORM SIGN E2 TIMES A PLUS HA PLUS DA*/
+ RTUNI_ALPHA, /* U+01208f: CUNEIFORM SIGN E2 TIMES GAR*/
+ RTUNI_ALPHA, /* U+012090: CUNEIFORM SIGN E2 TIMES MI*/
+ RTUNI_ALPHA, /* U+012091: CUNEIFORM SIGN E2 TIMES SAL*/
+ RTUNI_ALPHA, /* U+012092: CUNEIFORM SIGN E2 TIMES SHE*/
+ RTUNI_ALPHA, /* U+012093: CUNEIFORM SIGN E2 TIMES U*/
+ RTUNI_ALPHA, /* U+012094: CUNEIFORM SIGN EDIN*/
+ RTUNI_ALPHA, /* U+012095: CUNEIFORM SIGN EGIR*/
+ RTUNI_ALPHA, /* U+012096: CUNEIFORM SIGN EL*/
+ RTUNI_ALPHA, /* U+012097: CUNEIFORM SIGN EN*/
+ RTUNI_ALPHA, /* U+012098: CUNEIFORM SIGN EN TIMES GAN2*/
+ RTUNI_ALPHA, /* U+012099: CUNEIFORM SIGN EN TIMES GAN2 TENU*/
+ RTUNI_ALPHA, /* U+01209a: CUNEIFORM SIGN EN TIMES ME*/
+ RTUNI_ALPHA, /* U+01209b: CUNEIFORM SIGN EN CROSSING EN*/
+ RTUNI_ALPHA, /* U+01209c: CUNEIFORM SIGN EN OPPOSING EN*/
+ RTUNI_ALPHA, /* U+01209d: CUNEIFORM SIGN EN SQUARED*/
+ RTUNI_ALPHA, /* U+01209e: CUNEIFORM SIGN EREN*/
+ RTUNI_ALPHA, /* U+01209f: CUNEIFORM SIGN ERIN2*/
+ RTUNI_ALPHA, /* U+0120a0: CUNEIFORM SIGN ESH2*/
+ RTUNI_ALPHA, /* U+0120a1: CUNEIFORM SIGN EZEN*/
+ RTUNI_ALPHA, /* U+0120a2: CUNEIFORM SIGN EZEN TIMES A*/
+ RTUNI_ALPHA, /* U+0120a3: CUNEIFORM SIGN EZEN TIMES A PLUS LAL*/
+ RTUNI_ALPHA, /* U+0120a4: CUNEIFORM SIGN EZEN TIMES A PLUS LAL TIMES LAL*/
+ RTUNI_ALPHA, /* U+0120a5: CUNEIFORM SIGN EZEN TIMES AN*/
+ RTUNI_ALPHA, /* U+0120a6: CUNEIFORM SIGN EZEN TIMES BAD*/
+ RTUNI_ALPHA, /* U+0120a7: CUNEIFORM SIGN EZEN TIMES DUN3 GUNU*/
+ RTUNI_ALPHA, /* U+0120a8: CUNEIFORM SIGN EZEN TIMES DUN3 GUNU GUNU*/
+ RTUNI_ALPHA, /* U+0120a9: CUNEIFORM SIGN EZEN TIMES HA*/
+ RTUNI_ALPHA, /* U+0120aa: CUNEIFORM SIGN EZEN TIMES HA GUNU*/
+ RTUNI_ALPHA, /* U+0120ab: CUNEIFORM SIGN EZEN TIMES IGI GUNU*/
+ RTUNI_ALPHA, /* U+0120ac: CUNEIFORM SIGN EZEN TIMES KASKAL*/
+ RTUNI_ALPHA, /* U+0120ad: CUNEIFORM SIGN EZEN TIMES KASKAL SQUARED*/
+ RTUNI_ALPHA, /* U+0120ae: CUNEIFORM SIGN EZEN TIMES KU3*/
+ RTUNI_ALPHA, /* U+0120af: CUNEIFORM SIGN EZEN TIMES LA*/
+ RTUNI_ALPHA, /* U+0120b0: CUNEIFORM SIGN EZEN TIMES LAL TIMES LAL*/
+ RTUNI_ALPHA, /* U+0120b1: CUNEIFORM SIGN EZEN TIMES LI*/
+ RTUNI_ALPHA, /* U+0120b2: CUNEIFORM SIGN EZEN TIMES LU*/
+ RTUNI_ALPHA, /* U+0120b3: CUNEIFORM SIGN EZEN TIMES U2*/
+ RTUNI_ALPHA, /* U+0120b4: CUNEIFORM SIGN EZEN TIMES UD*/
+ RTUNI_ALPHA, /* U+0120b5: CUNEIFORM SIGN GA*/
+ RTUNI_ALPHA, /* U+0120b6: CUNEIFORM SIGN GA GUNU*/
+ RTUNI_ALPHA, /* U+0120b7: CUNEIFORM SIGN GA2*/
+ RTUNI_ALPHA, /* U+0120b8: CUNEIFORM SIGN GA2 TIMES A PLUS DA PLUS HA*/
+ RTUNI_ALPHA, /* U+0120b9: CUNEIFORM SIGN GA2 TIMES A PLUS HA*/
+ RTUNI_ALPHA, /* U+0120ba: CUNEIFORM SIGN GA2 TIMES A PLUS IGI*/
+ RTUNI_ALPHA, /* U+0120bb: CUNEIFORM SIGN GA2 TIMES AB2 TENU PLUS TAB*/
+ RTUNI_ALPHA, /* U+0120bc: CUNEIFORM SIGN GA2 TIMES AN*/
+ RTUNI_ALPHA, /* U+0120bd: CUNEIFORM SIGN GA2 TIMES ASH*/
+ RTUNI_ALPHA, /* U+0120be: CUNEIFORM SIGN GA2 TIMES ASH2 PLUS GAL*/
+ RTUNI_ALPHA, /* U+0120bf: CUNEIFORM SIGN GA2 TIMES BAD*/
+ RTUNI_ALPHA, /* U+0120c0: CUNEIFORM SIGN GA2 TIMES BAR PLUS RA*/
+ RTUNI_ALPHA, /* U+0120c1: CUNEIFORM SIGN GA2 TIMES BUR*/
+ RTUNI_ALPHA, /* U+0120c2: CUNEIFORM SIGN GA2 TIMES BUR PLUS RA*/
+ RTUNI_ALPHA, /* U+0120c3: CUNEIFORM SIGN GA2 TIMES DA*/
+ RTUNI_ALPHA, /* U+0120c4: CUNEIFORM SIGN GA2 TIMES DI*/
+ RTUNI_ALPHA, /* U+0120c5: CUNEIFORM SIGN GA2 TIMES DIM TIMES SHE*/
+ RTUNI_ALPHA, /* U+0120c6: CUNEIFORM SIGN GA2 TIMES DUB*/
+ RTUNI_ALPHA, /* U+0120c7: CUNEIFORM SIGN GA2 TIMES EL*/
+ RTUNI_ALPHA, /* U+0120c8: CUNEIFORM SIGN GA2 TIMES EL PLUS LA*/
+ RTUNI_ALPHA, /* U+0120c9: CUNEIFORM SIGN GA2 TIMES EN*/
+ RTUNI_ALPHA, /* U+0120ca: CUNEIFORM SIGN GA2 TIMES EN TIMES GAN2 TENU*/
+ RTUNI_ALPHA, /* U+0120cb: CUNEIFORM SIGN GA2 TIMES GAN2 TENU*/
+ RTUNI_ALPHA, /* U+0120cc: CUNEIFORM SIGN GA2 TIMES GAR*/
+ RTUNI_ALPHA, /* U+0120cd: CUNEIFORM SIGN GA2 TIMES GI*/
+ RTUNI_ALPHA, /* U+0120ce: CUNEIFORM SIGN GA2 TIMES GI4*/
+ RTUNI_ALPHA, /* U+0120cf: CUNEIFORM SIGN GA2 TIMES GI4 PLUS A*/
+ RTUNI_ALPHA, /* U+0120d0: CUNEIFORM SIGN GA2 TIMES GIR2 PLUS SU*/
+ RTUNI_ALPHA, /* U+0120d1: CUNEIFORM SIGN GA2 TIMES HA PLUS LU PLUS ESH2*/
+ RTUNI_ALPHA, /* U+0120d2: CUNEIFORM SIGN GA2 TIMES HAL*/
+ RTUNI_ALPHA, /* U+0120d3: CUNEIFORM SIGN GA2 TIMES HAL PLUS LA*/
+ RTUNI_ALPHA, /* U+0120d4: CUNEIFORM SIGN GA2 TIMES HI PLUS LI*/
+ RTUNI_ALPHA, /* U+0120d5: CUNEIFORM SIGN GA2 TIMES HUB2*/
+ RTUNI_ALPHA, /* U+0120d6: CUNEIFORM SIGN GA2 TIMES IGI GUNU*/
+ RTUNI_ALPHA, /* U+0120d7: CUNEIFORM SIGN GA2 TIMES ISH PLUS HU PLUS ASH*/
+ RTUNI_ALPHA, /* U+0120d8: CUNEIFORM SIGN GA2 TIMES KAK*/
+ RTUNI_ALPHA, /* U+0120d9: CUNEIFORM SIGN GA2 TIMES KASKAL*/
+ RTUNI_ALPHA, /* U+0120da: CUNEIFORM SIGN GA2 TIMES KID*/
+ RTUNI_ALPHA, /* U+0120db: CUNEIFORM SIGN GA2 TIMES KID PLUS LAL*/
+ RTUNI_ALPHA, /* U+0120dc: CUNEIFORM SIGN GA2 TIMES KU3 PLUS AN*/
+ RTUNI_ALPHA, /* U+0120dd: CUNEIFORM SIGN GA2 TIMES LA*/
+ RTUNI_ALPHA, /* U+0120de: CUNEIFORM SIGN GA2 TIMES ME PLUS EN*/
+ RTUNI_ALPHA, /* U+0120df: CUNEIFORM SIGN GA2 TIMES MI*/
+ RTUNI_ALPHA, /* U+0120e0: CUNEIFORM SIGN GA2 TIMES NUN*/
+ RTUNI_ALPHA, /* U+0120e1: CUNEIFORM SIGN GA2 TIMES NUN OVER NUN*/
+ RTUNI_ALPHA, /* U+0120e2: CUNEIFORM SIGN GA2 TIMES PA*/
+ RTUNI_ALPHA, /* U+0120e3: CUNEIFORM SIGN GA2 TIMES SAL*/
+ RTUNI_ALPHA, /* U+0120e4: CUNEIFORM SIGN GA2 TIMES SAR*/
+ RTUNI_ALPHA, /* U+0120e5: CUNEIFORM SIGN GA2 TIMES SHE*/
+ RTUNI_ALPHA, /* U+0120e6: CUNEIFORM SIGN GA2 TIMES SHE PLUS TUR*/
+ RTUNI_ALPHA, /* U+0120e7: CUNEIFORM SIGN GA2 TIMES SHID*/
+ RTUNI_ALPHA, /* U+0120e8: CUNEIFORM SIGN GA2 TIMES SUM*/
+ RTUNI_ALPHA, /* U+0120e9: CUNEIFORM SIGN GA2 TIMES TAK4*/
+ RTUNI_ALPHA, /* U+0120ea: CUNEIFORM SIGN GA2 TIMES U*/
+ RTUNI_ALPHA, /* U+0120eb: CUNEIFORM SIGN GA2 TIMES UD*/
+ RTUNI_ALPHA, /* U+0120ec: CUNEIFORM SIGN GA2 TIMES UD PLUS DU*/
+ RTUNI_ALPHA, /* U+0120ed: CUNEIFORM SIGN GA2 OVER GA2*/
+ RTUNI_ALPHA, /* U+0120ee: CUNEIFORM SIGN GABA*/
+ RTUNI_ALPHA, /* U+0120ef: CUNEIFORM SIGN GABA CROSSING GABA*/
+ RTUNI_ALPHA, /* U+0120f0: CUNEIFORM SIGN GAD*/
+ RTUNI_ALPHA, /* U+0120f1: CUNEIFORM SIGN GAD OVER GAD GAR OVER GAR*/
+ RTUNI_ALPHA, /* U+0120f2: CUNEIFORM SIGN GAL*/
+ RTUNI_ALPHA, /* U+0120f3: CUNEIFORM SIGN GAL GAD OVER GAD GAR OVER GAR*/
+ RTUNI_ALPHA, /* U+0120f4: CUNEIFORM SIGN GALAM*/
+ RTUNI_ALPHA, /* U+0120f5: CUNEIFORM SIGN GAM*/
+ RTUNI_ALPHA, /* U+0120f6: CUNEIFORM SIGN GAN*/
+ RTUNI_ALPHA, /* U+0120f7: CUNEIFORM SIGN GAN2*/
+ RTUNI_ALPHA, /* U+0120f8: CUNEIFORM SIGN GAN2 TENU*/
+ RTUNI_ALPHA, /* U+0120f9: CUNEIFORM SIGN GAN2 OVER GAN2*/
+ RTUNI_ALPHA, /* U+0120fa: CUNEIFORM SIGN GAN2 CROSSING GAN2*/
+ RTUNI_ALPHA, /* U+0120fb: CUNEIFORM SIGN GAR*/
+ RTUNI_ALPHA, /* U+0120fc: CUNEIFORM SIGN GAR3*/
+ RTUNI_ALPHA, /* U+0120fd: CUNEIFORM SIGN GASHAN*/
+ RTUNI_ALPHA, /* U+0120fe: CUNEIFORM SIGN GESHTIN*/
+ RTUNI_ALPHA, /* U+0120ff: CUNEIFORM SIGN GESHTIN TIMES KUR*/
+ RTUNI_ALPHA, /* U+012100: CUNEIFORM SIGN GI*/
+ RTUNI_ALPHA, /* U+012101: CUNEIFORM SIGN GI TIMES E*/
+ RTUNI_ALPHA, /* U+012102: CUNEIFORM SIGN GI TIMES U*/
+ RTUNI_ALPHA, /* U+012103: CUNEIFORM SIGN GI CROSSING GI*/
+ RTUNI_ALPHA, /* U+012104: CUNEIFORM SIGN GI4*/
+ RTUNI_ALPHA, /* U+012105: CUNEIFORM SIGN GI4 OVER GI4*/
+ RTUNI_ALPHA, /* U+012106: CUNEIFORM SIGN GI4 CROSSING GI4*/
+ RTUNI_ALPHA, /* U+012107: CUNEIFORM SIGN GIDIM*/
+ RTUNI_ALPHA, /* U+012108: CUNEIFORM SIGN GIR2*/
+ RTUNI_ALPHA, /* U+012109: CUNEIFORM SIGN GIR2 GUNU*/
+ RTUNI_ALPHA, /* U+01210a: CUNEIFORM SIGN GIR3*/
+ RTUNI_ALPHA, /* U+01210b: CUNEIFORM SIGN GIR3 TIMES A PLUS IGI*/
+ RTUNI_ALPHA, /* U+01210c: CUNEIFORM SIGN GIR3 TIMES GAN2 TENU*/
+ RTUNI_ALPHA, /* U+01210d: CUNEIFORM SIGN GIR3 TIMES IGI*/
+ RTUNI_ALPHA, /* U+01210e: CUNEIFORM SIGN GIR3 TIMES LU PLUS IGI*/
+ RTUNI_ALPHA, /* U+01210f: CUNEIFORM SIGN GIR3 TIMES PA*/
+ RTUNI_ALPHA, /* U+012110: CUNEIFORM SIGN GISAL*/
+ RTUNI_ALPHA, /* U+012111: CUNEIFORM SIGN GISH*/
+ RTUNI_ALPHA, /* U+012112: CUNEIFORM SIGN GISH CROSSING GISH*/
+ RTUNI_ALPHA, /* U+012113: CUNEIFORM SIGN GISH TIMES BAD*/
+ RTUNI_ALPHA, /* U+012114: CUNEIFORM SIGN GISH TIMES TAK4*/
+ RTUNI_ALPHA, /* U+012115: CUNEIFORM SIGN GISH TENU*/
+ RTUNI_ALPHA, /* U+012116: CUNEIFORM SIGN GU*/
+ RTUNI_ALPHA, /* U+012117: CUNEIFORM SIGN GU CROSSING GU*/
+ RTUNI_ALPHA, /* U+012118: CUNEIFORM SIGN GU2*/
+ RTUNI_ALPHA, /* U+012119: CUNEIFORM SIGN GU2 TIMES KAK*/
+ RTUNI_ALPHA, /* U+01211a: CUNEIFORM SIGN GU2 TIMES KAK TIMES IGI GUNU*/
+ RTUNI_ALPHA, /* U+01211b: CUNEIFORM SIGN GU2 TIMES NUN*/
+ RTUNI_ALPHA, /* U+01211c: CUNEIFORM SIGN GU2 TIMES SAL PLUS TUG2*/
+ RTUNI_ALPHA, /* U+01211d: CUNEIFORM SIGN GU2 GUNU*/
+ RTUNI_ALPHA, /* U+01211e: CUNEIFORM SIGN GUD*/
+ RTUNI_ALPHA, /* U+01211f: CUNEIFORM SIGN GUD TIMES A PLUS KUR*/
+ RTUNI_ALPHA, /* U+012120: CUNEIFORM SIGN GUD TIMES KUR*/
+ RTUNI_ALPHA, /* U+012121: CUNEIFORM SIGN GUD OVER GUD LUGAL*/
+ RTUNI_ALPHA, /* U+012122: CUNEIFORM SIGN GUL*/
+ RTUNI_ALPHA, /* U+012123: CUNEIFORM SIGN GUM*/
+ RTUNI_ALPHA, /* U+012124: CUNEIFORM SIGN GUM TIMES SHE*/
+ RTUNI_ALPHA, /* U+012125: CUNEIFORM SIGN GUR*/
+ RTUNI_ALPHA, /* U+012126: CUNEIFORM SIGN GUR7*/
+ RTUNI_ALPHA, /* U+012127: CUNEIFORM SIGN GURUN*/
+ RTUNI_ALPHA, /* U+012128: CUNEIFORM SIGN GURUSH*/
+ RTUNI_ALPHA, /* U+012129: CUNEIFORM SIGN HA*/
+ RTUNI_ALPHA, /* U+01212a: CUNEIFORM SIGN HA TENU*/
+ RTUNI_ALPHA, /* U+01212b: CUNEIFORM SIGN HA GUNU*/
+ RTUNI_ALPHA, /* U+01212c: CUNEIFORM SIGN HAL*/
+ RTUNI_ALPHA, /* U+01212d: CUNEIFORM SIGN HI*/
+ RTUNI_ALPHA, /* U+01212e: CUNEIFORM SIGN HI TIMES ASH*/
+ RTUNI_ALPHA, /* U+01212f: CUNEIFORM SIGN HI TIMES ASH2*/
+ RTUNI_ALPHA, /* U+012130: CUNEIFORM SIGN HI TIMES BAD*/
+ RTUNI_ALPHA, /* U+012131: CUNEIFORM SIGN HI TIMES DISH*/
+ RTUNI_ALPHA, /* U+012132: CUNEIFORM SIGN HI TIMES GAD*/
+ RTUNI_ALPHA, /* U+012133: CUNEIFORM SIGN HI TIMES KIN*/
+ RTUNI_ALPHA, /* U+012134: CUNEIFORM SIGN HI TIMES NUN*/
+ RTUNI_ALPHA, /* U+012135: CUNEIFORM SIGN HI TIMES SHE*/
+ RTUNI_ALPHA, /* U+012136: CUNEIFORM SIGN HI TIMES U*/
+ RTUNI_ALPHA, /* U+012137: CUNEIFORM SIGN HU*/
+ RTUNI_ALPHA, /* U+012138: CUNEIFORM SIGN HUB2*/
+ RTUNI_ALPHA, /* U+012139: CUNEIFORM SIGN HUB2 TIMES AN*/
+ RTUNI_ALPHA, /* U+01213a: CUNEIFORM SIGN HUB2 TIMES HAL*/
+ RTUNI_ALPHA, /* U+01213b: CUNEIFORM SIGN HUB2 TIMES KASKAL*/
+ RTUNI_ALPHA, /* U+01213c: CUNEIFORM SIGN HUB2 TIMES LISH*/
+ RTUNI_ALPHA, /* U+01213d: CUNEIFORM SIGN HUB2 TIMES UD*/
+ RTUNI_ALPHA, /* U+01213e: CUNEIFORM SIGN HUL2*/
+ RTUNI_ALPHA, /* U+01213f: CUNEIFORM SIGN I*/
+ RTUNI_ALPHA, /* U+012140: CUNEIFORM SIGN I A*/
+ RTUNI_ALPHA, /* U+012141: CUNEIFORM SIGN IB*/
+ RTUNI_ALPHA, /* U+012142: CUNEIFORM SIGN IDIM*/
+ RTUNI_ALPHA, /* U+012143: CUNEIFORM SIGN IDIM OVER IDIM BUR*/
+ RTUNI_ALPHA, /* U+012144: CUNEIFORM SIGN IDIM OVER IDIM SQUARED*/
+ RTUNI_ALPHA, /* U+012145: CUNEIFORM SIGN IG*/
+ RTUNI_ALPHA, /* U+012146: CUNEIFORM SIGN IGI*/
+ RTUNI_ALPHA, /* U+012147: CUNEIFORM SIGN IGI DIB*/
+ RTUNI_ALPHA, /* U+012148: CUNEIFORM SIGN IGI RI*/
+ RTUNI_ALPHA, /* U+012149: CUNEIFORM SIGN IGI OVER IGI SHIR OVER SHIR UD OVER UD*/
+ RTUNI_ALPHA, /* U+01214a: CUNEIFORM SIGN IGI GUNU*/
+ RTUNI_ALPHA, /* U+01214b: CUNEIFORM SIGN IL*/
+ RTUNI_ALPHA, /* U+01214c: CUNEIFORM SIGN IL TIMES GAN2 TENU*/
+ RTUNI_ALPHA, /* U+01214d: CUNEIFORM SIGN IL2*/
+ RTUNI_ALPHA, /* U+01214e: CUNEIFORM SIGN IM*/
+ RTUNI_ALPHA, /* U+01214f: CUNEIFORM SIGN IM TIMES TAK4*/
+ RTUNI_ALPHA, /* U+012150: CUNEIFORM SIGN IM CROSSING IM*/
+ RTUNI_ALPHA, /* U+012151: CUNEIFORM SIGN IM OPPOSING IM*/
+ RTUNI_ALPHA, /* U+012152: CUNEIFORM SIGN IM SQUARED*/
+ RTUNI_ALPHA, /* U+012153: CUNEIFORM SIGN IMIN*/
+ RTUNI_ALPHA, /* U+012154: CUNEIFORM SIGN IN*/
+ RTUNI_ALPHA, /* U+012155: CUNEIFORM SIGN IR*/
+ RTUNI_ALPHA, /* U+012156: CUNEIFORM SIGN ISH*/
+ RTUNI_ALPHA, /* U+012157: CUNEIFORM SIGN KA*/
+ RTUNI_ALPHA, /* U+012158: CUNEIFORM SIGN KA TIMES A*/
+ RTUNI_ALPHA, /* U+012159: CUNEIFORM SIGN KA TIMES AD*/
+ RTUNI_ALPHA, /* U+01215a: CUNEIFORM SIGN KA TIMES AD PLUS KU3*/
+ RTUNI_ALPHA, /* U+01215b: CUNEIFORM SIGN KA TIMES ASH2*/
+ RTUNI_ALPHA, /* U+01215c: CUNEIFORM SIGN KA TIMES BAD*/
+ RTUNI_ALPHA, /* U+01215d: CUNEIFORM SIGN KA TIMES BALAG*/
+ RTUNI_ALPHA, /* U+01215e: CUNEIFORM SIGN KA TIMES BAR*/
+ RTUNI_ALPHA, /* U+01215f: CUNEIFORM SIGN KA TIMES BI*/
+ RTUNI_ALPHA, /* U+012160: CUNEIFORM SIGN KA TIMES ERIN2*/
+ RTUNI_ALPHA, /* U+012161: CUNEIFORM SIGN KA TIMES ESH2*/
+ RTUNI_ALPHA, /* U+012162: CUNEIFORM SIGN KA TIMES GA*/
+ RTUNI_ALPHA, /* U+012163: CUNEIFORM SIGN KA TIMES GAL*/
+ RTUNI_ALPHA, /* U+012164: CUNEIFORM SIGN KA TIMES GAN2 TENU*/
+ RTUNI_ALPHA, /* U+012165: CUNEIFORM SIGN KA TIMES GAR*/
+ RTUNI_ALPHA, /* U+012166: CUNEIFORM SIGN KA TIMES GAR PLUS SHA3 PLUS A*/
+ RTUNI_ALPHA, /* U+012167: CUNEIFORM SIGN KA TIMES GI*/
+ RTUNI_ALPHA, /* U+012168: CUNEIFORM SIGN KA TIMES GIR2*/
+ RTUNI_ALPHA, /* U+012169: CUNEIFORM SIGN KA TIMES GISH PLUS SAR*/
+ RTUNI_ALPHA, /* U+01216a: CUNEIFORM SIGN KA TIMES GISH CROSSING GISH*/
+ RTUNI_ALPHA, /* U+01216b: CUNEIFORM SIGN KA TIMES GU*/
+ RTUNI_ALPHA, /* U+01216c: CUNEIFORM SIGN KA TIMES GUR7*/
+ RTUNI_ALPHA, /* U+01216d: CUNEIFORM SIGN KA TIMES IGI*/
+ RTUNI_ALPHA, /* U+01216e: CUNEIFORM SIGN KA TIMES IM*/
+ RTUNI_ALPHA, /* U+01216f: CUNEIFORM SIGN KA TIMES KAK*/
+ RTUNI_ALPHA, /* U+012170: CUNEIFORM SIGN KA TIMES KI*/
+ RTUNI_ALPHA, /* U+012171: CUNEIFORM SIGN KA TIMES KID*/
+ RTUNI_ALPHA, /* U+012172: CUNEIFORM SIGN KA TIMES LI*/
+ RTUNI_ALPHA, /* U+012173: CUNEIFORM SIGN KA TIMES LU*/
+ RTUNI_ALPHA, /* U+012174: CUNEIFORM SIGN KA TIMES ME*/
+ RTUNI_ALPHA, /* U+012175: CUNEIFORM SIGN KA TIMES ME PLUS DU*/
+ RTUNI_ALPHA, /* U+012176: CUNEIFORM SIGN KA TIMES ME PLUS GI*/
+ RTUNI_ALPHA, /* U+012177: CUNEIFORM SIGN KA TIMES ME PLUS TE*/
+ RTUNI_ALPHA, /* U+012178: CUNEIFORM SIGN KA TIMES MI*/
+ RTUNI_ALPHA, /* U+012179: CUNEIFORM SIGN KA TIMES MI PLUS NUNUZ*/
+ RTUNI_ALPHA, /* U+01217a: CUNEIFORM SIGN KA TIMES NE*/
+ RTUNI_ALPHA, /* U+01217b: CUNEIFORM SIGN KA TIMES NUN*/
+ RTUNI_ALPHA, /* U+01217c: CUNEIFORM SIGN KA TIMES PI*/
+ RTUNI_ALPHA, /* U+01217d: CUNEIFORM SIGN KA TIMES RU*/
+ RTUNI_ALPHA, /* U+01217e: CUNEIFORM SIGN KA TIMES SA*/
+ RTUNI_ALPHA, /* U+01217f: CUNEIFORM SIGN KA TIMES SAR*/
+ RTUNI_ALPHA, /* U+012180: CUNEIFORM SIGN KA TIMES SHA*/
+ RTUNI_ALPHA, /* U+012181: CUNEIFORM SIGN KA TIMES SHE*/
+ RTUNI_ALPHA, /* U+012182: CUNEIFORM SIGN KA TIMES SHID*/
+ RTUNI_ALPHA, /* U+012183: CUNEIFORM SIGN KA TIMES SHU*/
+ RTUNI_ALPHA, /* U+012184: CUNEIFORM SIGN KA TIMES SIG*/
+ RTUNI_ALPHA, /* U+012185: CUNEIFORM SIGN KA TIMES SUHUR*/
+ RTUNI_ALPHA, /* U+012186: CUNEIFORM SIGN KA TIMES TAR*/
+ RTUNI_ALPHA, /* U+012187: CUNEIFORM SIGN KA TIMES U*/
+ RTUNI_ALPHA, /* U+012188: CUNEIFORM SIGN KA TIMES U2*/
+ RTUNI_ALPHA, /* U+012189: CUNEIFORM SIGN KA TIMES UD*/
+ RTUNI_ALPHA, /* U+01218a: CUNEIFORM SIGN KA TIMES UMUM TIMES PA*/
+ RTUNI_ALPHA, /* U+01218b: CUNEIFORM SIGN KA TIMES USH*/
+ RTUNI_ALPHA, /* U+01218c: CUNEIFORM SIGN KA TIMES ZI*/
+ RTUNI_ALPHA, /* U+01218d: CUNEIFORM SIGN KA2*/
+ RTUNI_ALPHA, /* U+01218e: CUNEIFORM SIGN KA2 CROSSING KA2*/
+ RTUNI_ALPHA, /* U+01218f: CUNEIFORM SIGN KAB*/
+ RTUNI_ALPHA, /* U+012190: CUNEIFORM SIGN KAD2*/
+ RTUNI_ALPHA, /* U+012191: CUNEIFORM SIGN KAD3*/
+ RTUNI_ALPHA, /* U+012192: CUNEIFORM SIGN KAD4*/
+ RTUNI_ALPHA, /* U+012193: CUNEIFORM SIGN KAD5*/
+ RTUNI_ALPHA, /* U+012194: CUNEIFORM SIGN KAD5 OVER KAD5*/
+ RTUNI_ALPHA, /* U+012195: CUNEIFORM SIGN KAK*/
+ RTUNI_ALPHA, /* U+012196: CUNEIFORM SIGN KAK TIMES IGI GUNU*/
+ RTUNI_ALPHA, /* U+012197: CUNEIFORM SIGN KAL*/
+ RTUNI_ALPHA, /* U+012198: CUNEIFORM SIGN KAL TIMES BAD*/
+ RTUNI_ALPHA, /* U+012199: CUNEIFORM SIGN KAL CROSSING KAL*/
+ RTUNI_ALPHA, /* U+01219a: CUNEIFORM SIGN KAM2*/
+ RTUNI_ALPHA, /* U+01219b: CUNEIFORM SIGN KAM4*/
+ RTUNI_ALPHA, /* U+01219c: CUNEIFORM SIGN KASKAL*/
+ RTUNI_ALPHA, /* U+01219d: CUNEIFORM SIGN KASKAL LAGAB TIMES U OVER LAGAB TIMES U*/
+ RTUNI_ALPHA, /* U+01219e: CUNEIFORM SIGN KASKAL OVER KASKAL LAGAB TIMES U OVER LAGAB TIMES U*/
+ RTUNI_ALPHA, /* U+01219f: CUNEIFORM SIGN KESH2*/
+ RTUNI_ALPHA, /* U+0121a0: CUNEIFORM SIGN KI*/
+ RTUNI_ALPHA, /* U+0121a1: CUNEIFORM SIGN KI TIMES BAD*/
+ RTUNI_ALPHA, /* U+0121a2: CUNEIFORM SIGN KI TIMES U*/
+ RTUNI_ALPHA, /* U+0121a3: CUNEIFORM SIGN KI TIMES UD*/
+ RTUNI_ALPHA, /* U+0121a4: CUNEIFORM SIGN KID*/
+ RTUNI_ALPHA, /* U+0121a5: CUNEIFORM SIGN KIN*/
+ RTUNI_ALPHA, /* U+0121a6: CUNEIFORM SIGN KISAL*/
+ RTUNI_ALPHA, /* U+0121a7: CUNEIFORM SIGN KISH*/
+ RTUNI_ALPHA, /* U+0121a8: CUNEIFORM SIGN KISIM5*/
+ RTUNI_ALPHA, /* U+0121a9: CUNEIFORM SIGN KISIM5 OVER KISIM5*/
+ RTUNI_ALPHA, /* U+0121aa: CUNEIFORM SIGN KU*/
+ RTUNI_ALPHA, /* U+0121ab: CUNEIFORM SIGN KU OVER HI TIMES ASH2 KU OVER HI TIMES ASH2*/
+ RTUNI_ALPHA, /* U+0121ac: CUNEIFORM SIGN KU3*/
+ RTUNI_ALPHA, /* U+0121ad: CUNEIFORM SIGN KU4*/
+ RTUNI_ALPHA, /* U+0121ae: CUNEIFORM SIGN KU4 VARIANT FORM*/
+ RTUNI_ALPHA, /* U+0121af: CUNEIFORM SIGN KU7*/
+ RTUNI_ALPHA, /* U+0121b0: CUNEIFORM SIGN KUL*/
+ RTUNI_ALPHA, /* U+0121b1: CUNEIFORM SIGN KUL GUNU*/
+ RTUNI_ALPHA, /* U+0121b2: CUNEIFORM SIGN KUN*/
+ RTUNI_ALPHA, /* U+0121b3: CUNEIFORM SIGN KUR*/
+ RTUNI_ALPHA, /* U+0121b4: CUNEIFORM SIGN KUR OPPOSING KUR*/
+ RTUNI_ALPHA, /* U+0121b5: CUNEIFORM SIGN KUSHU2*/
+ RTUNI_ALPHA, /* U+0121b6: CUNEIFORM SIGN KWU318*/
+ RTUNI_ALPHA, /* U+0121b7: CUNEIFORM SIGN LA*/
+ RTUNI_ALPHA, /* U+0121b8: CUNEIFORM SIGN LAGAB*/
+ RTUNI_ALPHA, /* U+0121b9: CUNEIFORM SIGN LAGAB TIMES A*/
+ RTUNI_ALPHA, /* U+0121ba: CUNEIFORM SIGN LAGAB TIMES A PLUS DA PLUS HA*/
+ RTUNI_ALPHA, /* U+0121bb: CUNEIFORM SIGN LAGAB TIMES A PLUS GAR*/
+ RTUNI_ALPHA, /* U+0121bc: CUNEIFORM SIGN LAGAB TIMES A PLUS LAL*/
+ RTUNI_ALPHA, /* U+0121bd: CUNEIFORM SIGN LAGAB TIMES AL*/
+ RTUNI_ALPHA, /* U+0121be: CUNEIFORM SIGN LAGAB TIMES AN*/
+ RTUNI_ALPHA, /* U+0121bf: CUNEIFORM SIGN LAGAB TIMES ASH ZIDA TENU*/
+ RTUNI_ALPHA, /* U+0121c0: CUNEIFORM SIGN LAGAB TIMES BAD*/
+ RTUNI_ALPHA, /* U+0121c1: CUNEIFORM SIGN LAGAB TIMES BI*/
+ RTUNI_ALPHA, /* U+0121c2: CUNEIFORM SIGN LAGAB TIMES DAR*/
+ RTUNI_ALPHA, /* U+0121c3: CUNEIFORM SIGN LAGAB TIMES EN*/
+ RTUNI_ALPHA, /* U+0121c4: CUNEIFORM SIGN LAGAB TIMES GA*/
+ RTUNI_ALPHA, /* U+0121c5: CUNEIFORM SIGN LAGAB TIMES GAR*/
+ RTUNI_ALPHA, /* U+0121c6: CUNEIFORM SIGN LAGAB TIMES GUD*/
+ RTUNI_ALPHA, /* U+0121c7: CUNEIFORM SIGN LAGAB TIMES GUD PLUS GUD*/
+ RTUNI_ALPHA, /* U+0121c8: CUNEIFORM SIGN LAGAB TIMES HA*/
+ RTUNI_ALPHA, /* U+0121c9: CUNEIFORM SIGN LAGAB TIMES HAL*/
+ RTUNI_ALPHA, /* U+0121ca: CUNEIFORM SIGN LAGAB TIMES HI TIMES NUN*/
+ RTUNI_ALPHA, /* U+0121cb: CUNEIFORM SIGN LAGAB TIMES IGI GUNU*/
+ RTUNI_ALPHA, /* U+0121cc: CUNEIFORM SIGN LAGAB TIMES IM*/
+ RTUNI_ALPHA, /* U+0121cd: CUNEIFORM SIGN LAGAB TIMES IM PLUS HA*/
+ RTUNI_ALPHA, /* U+0121ce: CUNEIFORM SIGN LAGAB TIMES IM PLUS LU*/
+ RTUNI_ALPHA, /* U+0121cf: CUNEIFORM SIGN LAGAB TIMES KI*/
+ RTUNI_ALPHA, /* U+0121d0: CUNEIFORM SIGN LAGAB TIMES KIN*/
+ RTUNI_ALPHA, /* U+0121d1: CUNEIFORM SIGN LAGAB TIMES KU3*/
+ RTUNI_ALPHA, /* U+0121d2: CUNEIFORM SIGN LAGAB TIMES KUL*/
+ RTUNI_ALPHA, /* U+0121d3: CUNEIFORM SIGN LAGAB TIMES KUL PLUS HI PLUS A*/
+ RTUNI_ALPHA, /* U+0121d4: CUNEIFORM SIGN LAGAB TIMES LAGAB*/
+ RTUNI_ALPHA, /* U+0121d5: CUNEIFORM SIGN LAGAB TIMES LISH*/
+ RTUNI_ALPHA, /* U+0121d6: CUNEIFORM SIGN LAGAB TIMES LU*/
+ RTUNI_ALPHA, /* U+0121d7: CUNEIFORM SIGN LAGAB TIMES LUL*/
+ RTUNI_ALPHA, /* U+0121d8: CUNEIFORM SIGN LAGAB TIMES ME*/
+ RTUNI_ALPHA, /* U+0121d9: CUNEIFORM SIGN LAGAB TIMES ME PLUS EN*/
+ RTUNI_ALPHA, /* U+0121da: CUNEIFORM SIGN LAGAB TIMES MUSH*/
+ RTUNI_ALPHA, /* U+0121db: CUNEIFORM SIGN LAGAB TIMES NE*/
+ RTUNI_ALPHA, /* U+0121dc: CUNEIFORM SIGN LAGAB TIMES SHE PLUS SUM*/
+ RTUNI_ALPHA, /* U+0121dd: CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH PLUS ERIN2*/
+ RTUNI_ALPHA, /* U+0121de: CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH TENU*/
+ RTUNI_ALPHA, /* U+0121df: CUNEIFORM SIGN LAGAB TIMES SHU2*/
+ RTUNI_ALPHA, /* U+0121e0: CUNEIFORM SIGN LAGAB TIMES SHU2 PLUS SHU2*/
+ RTUNI_ALPHA, /* U+0121e1: CUNEIFORM SIGN LAGAB TIMES SUM*/
+ RTUNI_ALPHA, /* U+0121e2: CUNEIFORM SIGN LAGAB TIMES TAG*/
+ RTUNI_ALPHA, /* U+0121e3: CUNEIFORM SIGN LAGAB TIMES TAK4*/
+ RTUNI_ALPHA, /* U+0121e4: CUNEIFORM SIGN LAGAB TIMES TE PLUS A PLUS SU PLUS NA*/
+ RTUNI_ALPHA, /* U+0121e5: CUNEIFORM SIGN LAGAB TIMES U*/
+ RTUNI_ALPHA, /* U+0121e6: CUNEIFORM SIGN LAGAB TIMES U PLUS A*/
+ RTUNI_ALPHA, /* U+0121e7: CUNEIFORM SIGN LAGAB TIMES U PLUS U PLUS U*/
+ RTUNI_ALPHA, /* U+0121e8: CUNEIFORM SIGN LAGAB TIMES U2 PLUS ASH*/
+ RTUNI_ALPHA, /* U+0121e9: CUNEIFORM SIGN LAGAB TIMES UD*/
+ RTUNI_ALPHA, /* U+0121ea: CUNEIFORM SIGN LAGAB TIMES USH*/
+ RTUNI_ALPHA, /* U+0121eb: CUNEIFORM SIGN LAGAB SQUARED*/
+ RTUNI_ALPHA, /* U+0121ec: CUNEIFORM SIGN LAGAR*/
+ RTUNI_ALPHA, /* U+0121ed: CUNEIFORM SIGN LAGAR TIMES SHE*/
+ RTUNI_ALPHA, /* U+0121ee: CUNEIFORM SIGN LAGAR TIMES SHE PLUS SUM*/
+ RTUNI_ALPHA, /* U+0121ef: CUNEIFORM SIGN LAGAR GUNU*/
+ RTUNI_ALPHA, /* U+0121f0: CUNEIFORM SIGN LAGAR GUNU OVER LAGAR GUNU SHE*/
+ RTUNI_ALPHA, /* U+0121f1: CUNEIFORM SIGN LAHSHU*/
+ RTUNI_ALPHA, /* U+0121f2: CUNEIFORM SIGN LAL*/
+ RTUNI_ALPHA, /* U+0121f3: CUNEIFORM SIGN LAL TIMES LAL*/
+ RTUNI_ALPHA, /* U+0121f4: CUNEIFORM SIGN LAM*/
+ RTUNI_ALPHA, /* U+0121f5: CUNEIFORM SIGN LAM TIMES KUR*/
+ RTUNI_ALPHA, /* U+0121f6: CUNEIFORM SIGN LAM TIMES KUR PLUS RU*/
+ RTUNI_ALPHA, /* U+0121f7: CUNEIFORM SIGN LI*/
+ RTUNI_ALPHA, /* U+0121f8: CUNEIFORM SIGN LIL*/
+ RTUNI_ALPHA, /* U+0121f9: CUNEIFORM SIGN LIMMU2*/
+ RTUNI_ALPHA, /* U+0121fa: CUNEIFORM SIGN LISH*/
+ RTUNI_ALPHA, /* U+0121fb: CUNEIFORM SIGN LU*/
+ RTUNI_ALPHA, /* U+0121fc: CUNEIFORM SIGN LU TIMES BAD*/
+ RTUNI_ALPHA, /* U+0121fd: CUNEIFORM SIGN LU2*/
+ RTUNI_ALPHA, /* U+0121fe: CUNEIFORM SIGN LU2 TIMES AL*/
+ RTUNI_ALPHA, /* U+0121ff: CUNEIFORM SIGN LU2 TIMES BAD*/
+ RTUNI_ALPHA, /* U+012200: CUNEIFORM SIGN LU2 TIMES ESH2*/
+ RTUNI_ALPHA, /* U+012201: CUNEIFORM SIGN LU2 TIMES ESH2 TENU*/
+ RTUNI_ALPHA, /* U+012202: CUNEIFORM SIGN LU2 TIMES GAN2 TENU*/
+ RTUNI_ALPHA, /* U+012203: CUNEIFORM SIGN LU2 TIMES HI TIMES BAD*/
+ RTUNI_ALPHA, /* U+012204: CUNEIFORM SIGN LU2 TIMES IM*/
+ RTUNI_ALPHA, /* U+012205: CUNEIFORM SIGN LU2 TIMES KAD2*/
+ RTUNI_ALPHA, /* U+012206: CUNEIFORM SIGN LU2 TIMES KAD3*/
+ RTUNI_ALPHA, /* U+012207: CUNEIFORM SIGN LU2 TIMES KAD3 PLUS ASH*/
+ RTUNI_ALPHA, /* U+012208: CUNEIFORM SIGN LU2 TIMES KI*/
+ RTUNI_ALPHA, /* U+012209: CUNEIFORM SIGN LU2 TIMES LA PLUS ASH*/
+ RTUNI_ALPHA, /* U+01220a: CUNEIFORM SIGN LU2 TIMES LAGAB*/
+ RTUNI_ALPHA, /* U+01220b: CUNEIFORM SIGN LU2 TIMES ME PLUS EN*/
+ RTUNI_ALPHA, /* U+01220c: CUNEIFORM SIGN LU2 TIMES NE*/
+ RTUNI_ALPHA, /* U+01220d: CUNEIFORM SIGN LU2 TIMES NU*/
+ RTUNI_ALPHA, /* U+01220e: CUNEIFORM SIGN LU2 TIMES SI PLUS ASH*/
+ RTUNI_ALPHA, /* U+01220f: CUNEIFORM SIGN LU2 TIMES SIK2 PLUS BU*/
+ RTUNI_ALPHA, /* U+012210: CUNEIFORM SIGN LU2 TIMES TUG2*/
+ RTUNI_ALPHA, /* U+012211: CUNEIFORM SIGN LU2 TENU*/
+ RTUNI_ALPHA, /* U+012212: CUNEIFORM SIGN LU2 CROSSING LU2*/
+ RTUNI_ALPHA, /* U+012213: CUNEIFORM SIGN LU2 OPPOSING LU2*/
+ RTUNI_ALPHA, /* U+012214: CUNEIFORM SIGN LU2 SQUARED*/
+ RTUNI_ALPHA, /* U+012215: CUNEIFORM SIGN LU2 SHESHIG*/
+ RTUNI_ALPHA, /* U+012216: CUNEIFORM SIGN LU3*/
+ RTUNI_ALPHA, /* U+012217: CUNEIFORM SIGN LUGAL*/
+ RTUNI_ALPHA, /* U+012218: CUNEIFORM SIGN LUGAL OVER LUGAL*/
+ RTUNI_ALPHA, /* U+012219: CUNEIFORM SIGN LUGAL OPPOSING LUGAL*/
+ RTUNI_ALPHA, /* U+01221a: CUNEIFORM SIGN LUGAL SHESHIG*/
+ RTUNI_ALPHA, /* U+01221b: CUNEIFORM SIGN LUH*/
+ RTUNI_ALPHA, /* U+01221c: CUNEIFORM SIGN LUL*/
+ RTUNI_ALPHA, /* U+01221d: CUNEIFORM SIGN LUM*/
+ RTUNI_ALPHA, /* U+01221e: CUNEIFORM SIGN LUM OVER LUM*/
+ RTUNI_ALPHA, /* U+01221f: CUNEIFORM SIGN LUM OVER LUM GAR OVER GAR*/
+ RTUNI_ALPHA, /* U+012220: CUNEIFORM SIGN MA*/
+ RTUNI_ALPHA, /* U+012221: CUNEIFORM SIGN MA TIMES TAK4*/
+ RTUNI_ALPHA, /* U+012222: CUNEIFORM SIGN MA GUNU*/
+ RTUNI_ALPHA, /* U+012223: CUNEIFORM SIGN MA2*/
+ RTUNI_ALPHA, /* U+012224: CUNEIFORM SIGN MAH*/
+ RTUNI_ALPHA, /* U+012225: CUNEIFORM SIGN MAR*/
+ RTUNI_ALPHA, /* U+012226: CUNEIFORM SIGN MASH*/
+ RTUNI_ALPHA, /* U+012227: CUNEIFORM SIGN MASH2*/
+ RTUNI_ALPHA, /* U+012228: CUNEIFORM SIGN ME*/
+ RTUNI_ALPHA, /* U+012229: CUNEIFORM SIGN MES*/
+ RTUNI_ALPHA, /* U+01222a: CUNEIFORM SIGN MI*/
+ RTUNI_ALPHA, /* U+01222b: CUNEIFORM SIGN MIN*/
+ RTUNI_ALPHA, /* U+01222c: CUNEIFORM SIGN MU*/
+ RTUNI_ALPHA, /* U+01222d: CUNEIFORM SIGN MU OVER MU*/
+ RTUNI_ALPHA, /* U+01222e: CUNEIFORM SIGN MUG*/
+ RTUNI_ALPHA, /* U+01222f: CUNEIFORM SIGN MUG GUNU*/
+ RTUNI_ALPHA, /* U+012230: CUNEIFORM SIGN MUNSUB*/
+ RTUNI_ALPHA, /* U+012231: CUNEIFORM SIGN MURGU2*/
+ RTUNI_ALPHA, /* U+012232: CUNEIFORM SIGN MUSH*/
+ RTUNI_ALPHA, /* U+012233: CUNEIFORM SIGN MUSH TIMES A*/
+ RTUNI_ALPHA, /* U+012234: CUNEIFORM SIGN MUSH TIMES KUR*/
+ RTUNI_ALPHA, /* U+012235: CUNEIFORM SIGN MUSH TIMES ZA*/
+ RTUNI_ALPHA, /* U+012236: CUNEIFORM SIGN MUSH OVER MUSH*/
+ RTUNI_ALPHA, /* U+012237: CUNEIFORM SIGN MUSH OVER MUSH TIMES A PLUS NA*/
+ RTUNI_ALPHA, /* U+012238: CUNEIFORM SIGN MUSH CROSSING MUSH*/
+ RTUNI_ALPHA, /* U+012239: CUNEIFORM SIGN MUSH3*/
+ RTUNI_ALPHA, /* U+01223a: CUNEIFORM SIGN MUSH3 TIMES A*/
+ RTUNI_ALPHA, /* U+01223b: CUNEIFORM SIGN MUSH3 TIMES A PLUS DI*/
+ RTUNI_ALPHA, /* U+01223c: CUNEIFORM SIGN MUSH3 TIMES DI*/
+ RTUNI_ALPHA, /* U+01223d: CUNEIFORM SIGN MUSH3 GUNU*/
+ RTUNI_ALPHA, /* U+01223e: CUNEIFORM SIGN NA*/
+ RTUNI_ALPHA, /* U+01223f: CUNEIFORM SIGN NA2*/
+ RTUNI_ALPHA, /* U+012240: CUNEIFORM SIGN NAGA*/
+ RTUNI_ALPHA, /* U+012241: CUNEIFORM SIGN NAGA INVERTED*/
+ RTUNI_ALPHA, /* U+012242: CUNEIFORM SIGN NAGA TIMES SHU TENU*/
+ RTUNI_ALPHA, /* U+012243: CUNEIFORM SIGN NAGA OPPOSING NAGA*/
+ RTUNI_ALPHA, /* U+012244: CUNEIFORM SIGN NAGAR*/
+ RTUNI_ALPHA, /* U+012245: CUNEIFORM SIGN NAM NUTILLU*/
+ RTUNI_ALPHA, /* U+012246: CUNEIFORM SIGN NAM*/
+ RTUNI_ALPHA, /* U+012247: CUNEIFORM SIGN NAM2*/
+ RTUNI_ALPHA, /* U+012248: CUNEIFORM SIGN NE*/
+ RTUNI_ALPHA, /* U+012249: CUNEIFORM SIGN NE TIMES A*/
+ RTUNI_ALPHA, /* U+01224a: CUNEIFORM SIGN NE TIMES UD*/
+ RTUNI_ALPHA, /* U+01224b: CUNEIFORM SIGN NE SHESHIG*/
+ RTUNI_ALPHA, /* U+01224c: CUNEIFORM SIGN NI*/
+ RTUNI_ALPHA, /* U+01224d: CUNEIFORM SIGN NI TIMES E*/
+ RTUNI_ALPHA, /* U+01224e: CUNEIFORM SIGN NI2*/
+ RTUNI_ALPHA, /* U+01224f: CUNEIFORM SIGN NIM*/
+ RTUNI_ALPHA, /* U+012250: CUNEIFORM SIGN NIM TIMES GAN2 TENU*/
+ RTUNI_ALPHA, /* U+012251: CUNEIFORM SIGN NIM TIMES GAR PLUS GAN2 TENU*/
+ RTUNI_ALPHA, /* U+012252: CUNEIFORM SIGN NINDA2*/
+ RTUNI_ALPHA, /* U+012253: CUNEIFORM SIGN NINDA2 TIMES AN*/
+ RTUNI_ALPHA, /* U+012254: CUNEIFORM SIGN NINDA2 TIMES ASH*/
+ RTUNI_ALPHA, /* U+012255: CUNEIFORM SIGN NINDA2 TIMES ASH PLUS ASH*/
+ RTUNI_ALPHA, /* U+012256: CUNEIFORM SIGN NINDA2 TIMES GUD*/
+ RTUNI_ALPHA, /* U+012257: CUNEIFORM SIGN NINDA2 TIMES ME PLUS GAN2 TENU*/
+ RTUNI_ALPHA, /* U+012258: CUNEIFORM SIGN NINDA2 TIMES NE*/
+ RTUNI_ALPHA, /* U+012259: CUNEIFORM SIGN NINDA2 TIMES NUN*/
+ RTUNI_ALPHA, /* U+01225a: CUNEIFORM SIGN NINDA2 TIMES SHE*/
+ RTUNI_ALPHA, /* U+01225b: CUNEIFORM SIGN NINDA2 TIMES SHE PLUS A AN*/
+ RTUNI_ALPHA, /* U+01225c: CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH*/
+ RTUNI_ALPHA, /* U+01225d: CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH PLUS ASH*/
+ RTUNI_ALPHA, /* U+01225e: CUNEIFORM SIGN NINDA2 TIMES U2 PLUS ASH*/
+ RTUNI_ALPHA, /* U+01225f: CUNEIFORM SIGN NINDA2 TIMES USH*/
+ RTUNI_ALPHA, /* U+012260: CUNEIFORM SIGN NISAG*/
+ RTUNI_ALPHA, /* U+012261: CUNEIFORM SIGN NU*/
+ RTUNI_ALPHA, /* U+012262: CUNEIFORM SIGN NU11*/
+ RTUNI_ALPHA, /* U+012263: CUNEIFORM SIGN NUN*/
+ RTUNI_ALPHA, /* U+012264: CUNEIFORM SIGN NUN LAGAR TIMES GAR*/
+ RTUNI_ALPHA, /* U+012265: CUNEIFORM SIGN NUN LAGAR TIMES MASH*/
+ RTUNI_ALPHA, /* U+012266: CUNEIFORM SIGN NUN LAGAR TIMES SAL*/
+ RTUNI_ALPHA, /* U+012267: CUNEIFORM SIGN NUN LAGAR TIMES SAL OVER NUN LAGAR TIMES SAL*/
+ RTUNI_ALPHA, /* U+012268: CUNEIFORM SIGN NUN LAGAR TIMES USH*/
+ RTUNI_ALPHA, /* U+012269: CUNEIFORM SIGN NUN TENU*/
+ RTUNI_ALPHA, /* U+01226a: CUNEIFORM SIGN NUN OVER NUN*/
+ RTUNI_ALPHA, /* U+01226b: CUNEIFORM SIGN NUN CROSSING NUN*/
+ RTUNI_ALPHA, /* U+01226c: CUNEIFORM SIGN NUN CROSSING NUN LAGAR OVER LAGAR*/
+ RTUNI_ALPHA, /* U+01226d: CUNEIFORM SIGN NUNUZ*/
+ RTUNI_ALPHA, /* U+01226e: CUNEIFORM SIGN NUNUZ AB2 TIMES ASHGAB*/
+ RTUNI_ALPHA, /* U+01226f: CUNEIFORM SIGN NUNUZ AB2 TIMES BI*/
+ RTUNI_ALPHA, /* U+012270: CUNEIFORM SIGN NUNUZ AB2 TIMES DUG*/
+ RTUNI_ALPHA, /* U+012271: CUNEIFORM SIGN NUNUZ AB2 TIMES GUD*/
+ RTUNI_ALPHA, /* U+012272: CUNEIFORM SIGN NUNUZ AB2 TIMES IGI GUNU*/
+ RTUNI_ALPHA, /* U+012273: CUNEIFORM SIGN NUNUZ AB2 TIMES KAD3*/
+ RTUNI_ALPHA, /* U+012274: CUNEIFORM SIGN NUNUZ AB2 TIMES LA*/
+ RTUNI_ALPHA, /* U+012275: CUNEIFORM SIGN NUNUZ AB2 TIMES NE*/
+ RTUNI_ALPHA, /* U+012276: CUNEIFORM SIGN NUNUZ AB2 TIMES SILA3*/
+ RTUNI_ALPHA, /* U+012277: CUNEIFORM SIGN NUNUZ AB2 TIMES U2*/
+ RTUNI_ALPHA, /* U+012278: CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI*/
+ RTUNI_ALPHA, /* U+012279: CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI U*/
+ RTUNI_ALPHA, /* U+01227a: CUNEIFORM SIGN PA*/
+ RTUNI_ALPHA, /* U+01227b: CUNEIFORM SIGN PAD*/
+ RTUNI_ALPHA, /* U+01227c: CUNEIFORM SIGN PAN*/
+ RTUNI_ALPHA, /* U+01227d: CUNEIFORM SIGN PAP*/
+ RTUNI_ALPHA, /* U+01227e: CUNEIFORM SIGN PESH2*/
+ RTUNI_ALPHA, /* U+01227f: CUNEIFORM SIGN PI*/
+ RTUNI_ALPHA, /* U+012280: CUNEIFORM SIGN PI TIMES A*/
+ RTUNI_ALPHA, /* U+012281: CUNEIFORM SIGN PI TIMES AB*/
+ RTUNI_ALPHA, /* U+012282: CUNEIFORM SIGN PI TIMES BI*/
+ RTUNI_ALPHA, /* U+012283: CUNEIFORM SIGN PI TIMES BU*/
+ RTUNI_ALPHA, /* U+012284: CUNEIFORM SIGN PI TIMES E*/
+ RTUNI_ALPHA, /* U+012285: CUNEIFORM SIGN PI TIMES I*/
+ RTUNI_ALPHA, /* U+012286: CUNEIFORM SIGN PI TIMES IB*/
+ RTUNI_ALPHA, /* U+012287: CUNEIFORM SIGN PI TIMES U*/
+ RTUNI_ALPHA, /* U+012288: CUNEIFORM SIGN PI TIMES U2*/
+ RTUNI_ALPHA, /* U+012289: CUNEIFORM SIGN PI CROSSING PI*/
+ RTUNI_ALPHA, /* U+01228a: CUNEIFORM SIGN PIRIG*/
+ RTUNI_ALPHA, /* U+01228b: CUNEIFORM SIGN PIRIG TIMES KAL*/
+ RTUNI_ALPHA, /* U+01228c: CUNEIFORM SIGN PIRIG TIMES UD*/
+ RTUNI_ALPHA, /* U+01228d: CUNEIFORM SIGN PIRIG TIMES ZA*/
+ RTUNI_ALPHA, /* U+01228e: CUNEIFORM SIGN PIRIG OPPOSING PIRIG*/
+ RTUNI_ALPHA, /* U+01228f: CUNEIFORM SIGN RA*/
+ RTUNI_ALPHA, /* U+012290: CUNEIFORM SIGN RAB*/
+ RTUNI_ALPHA, /* U+012291: CUNEIFORM SIGN RI*/
+ RTUNI_ALPHA, /* U+012292: CUNEIFORM SIGN RU*/
+ RTUNI_ALPHA, /* U+012293: CUNEIFORM SIGN SA*/
+ RTUNI_ALPHA, /* U+012294: CUNEIFORM SIGN SAG NUTILLU*/
+ RTUNI_ALPHA, /* U+012295: CUNEIFORM SIGN SAG*/
+ RTUNI_ALPHA, /* U+012296: CUNEIFORM SIGN SAG TIMES A*/
+ RTUNI_ALPHA, /* U+012297: CUNEIFORM SIGN SAG TIMES DU*/
+ RTUNI_ALPHA, /* U+012298: CUNEIFORM SIGN SAG TIMES DUB*/
+ RTUNI_ALPHA, /* U+012299: CUNEIFORM SIGN SAG TIMES HA*/
+ RTUNI_ALPHA, /* U+01229a: CUNEIFORM SIGN SAG TIMES KAK*/
+ RTUNI_ALPHA, /* U+01229b: CUNEIFORM SIGN SAG TIMES KUR*/
+ RTUNI_ALPHA, /* U+01229c: CUNEIFORM SIGN SAG TIMES LUM*/
+ RTUNI_ALPHA, /* U+01229d: CUNEIFORM SIGN SAG TIMES MI*/
+ RTUNI_ALPHA, /* U+01229e: CUNEIFORM SIGN SAG TIMES NUN*/
+ RTUNI_ALPHA, /* U+01229f: CUNEIFORM SIGN SAG TIMES SAL*/
+ RTUNI_ALPHA, /* U+0122a0: CUNEIFORM SIGN SAG TIMES SHID*/
+ RTUNI_ALPHA, /* U+0122a1: CUNEIFORM SIGN SAG TIMES TAB*/
+ RTUNI_ALPHA, /* U+0122a2: CUNEIFORM SIGN SAG TIMES U2*/
+ RTUNI_ALPHA, /* U+0122a3: CUNEIFORM SIGN SAG TIMES UB*/
+ RTUNI_ALPHA, /* U+0122a4: CUNEIFORM SIGN SAG TIMES UM*/
+ RTUNI_ALPHA, /* U+0122a5: CUNEIFORM SIGN SAG TIMES UR*/
+ RTUNI_ALPHA, /* U+0122a6: CUNEIFORM SIGN SAG TIMES USH*/
+ RTUNI_ALPHA, /* U+0122a7: CUNEIFORM SIGN SAG OVER SAG*/
+ RTUNI_ALPHA, /* U+0122a8: CUNEIFORM SIGN SAG GUNU*/
+ RTUNI_ALPHA, /* U+0122a9: CUNEIFORM SIGN SAL*/
+ RTUNI_ALPHA, /* U+0122aa: CUNEIFORM SIGN SAL LAGAB TIMES ASH2*/
+ RTUNI_ALPHA, /* U+0122ab: CUNEIFORM SIGN SANGA2*/
+ RTUNI_ALPHA, /* U+0122ac: CUNEIFORM SIGN SAR*/
+ RTUNI_ALPHA, /* U+0122ad: CUNEIFORM SIGN SHA*/
+ RTUNI_ALPHA, /* U+0122ae: CUNEIFORM SIGN SHA3*/
+ RTUNI_ALPHA, /* U+0122af: CUNEIFORM SIGN SHA3 TIMES A*/
+ RTUNI_ALPHA, /* U+0122b0: CUNEIFORM SIGN SHA3 TIMES BAD*/
+ RTUNI_ALPHA, /* U+0122b1: CUNEIFORM SIGN SHA3 TIMES GISH*/
+ RTUNI_ALPHA, /* U+0122b2: CUNEIFORM SIGN SHA3 TIMES NE*/
+ RTUNI_ALPHA, /* U+0122b3: CUNEIFORM SIGN SHA3 TIMES SHU2*/
+ RTUNI_ALPHA, /* U+0122b4: CUNEIFORM SIGN SHA3 TIMES TUR*/
+ RTUNI_ALPHA, /* U+0122b5: CUNEIFORM SIGN SHA3 TIMES U*/
+ RTUNI_ALPHA, /* U+0122b6: CUNEIFORM SIGN SHA3 TIMES U PLUS A*/
+ RTUNI_ALPHA, /* U+0122b7: CUNEIFORM SIGN SHA6*/
+ RTUNI_ALPHA, /* U+0122b8: CUNEIFORM SIGN SHAB6*/
+ RTUNI_ALPHA, /* U+0122b9: CUNEIFORM SIGN SHAR2*/
+ RTUNI_ALPHA, /* U+0122ba: CUNEIFORM SIGN SHE*/
+ RTUNI_ALPHA, /* U+0122bb: CUNEIFORM SIGN SHE HU*/
+ RTUNI_ALPHA, /* U+0122bc: CUNEIFORM SIGN SHE OVER SHE GAD OVER GAD GAR OVER GAR*/
+ RTUNI_ALPHA, /* U+0122bd: CUNEIFORM SIGN SHE OVER SHE TAB OVER TAB GAR OVER GAR*/
+ RTUNI_ALPHA, /* U+0122be: CUNEIFORM SIGN SHEG9*/
+ RTUNI_ALPHA, /* U+0122bf: CUNEIFORM SIGN SHEN*/
+ RTUNI_ALPHA, /* U+0122c0: CUNEIFORM SIGN SHESH*/
+ RTUNI_ALPHA, /* U+0122c1: CUNEIFORM SIGN SHESH2*/
+ RTUNI_ALPHA, /* U+0122c2: CUNEIFORM SIGN SHESHLAM*/
+ RTUNI_ALPHA, /* U+0122c3: CUNEIFORM SIGN SHID*/
+ RTUNI_ALPHA, /* U+0122c4: CUNEIFORM SIGN SHID TIMES A*/
+ RTUNI_ALPHA, /* U+0122c5: CUNEIFORM SIGN SHID TIMES IM*/
+ RTUNI_ALPHA, /* U+0122c6: CUNEIFORM SIGN SHIM*/
+ RTUNI_ALPHA, /* U+0122c7: CUNEIFORM SIGN SHIM TIMES A*/
+ RTUNI_ALPHA, /* U+0122c8: CUNEIFORM SIGN SHIM TIMES BAL*/
+ RTUNI_ALPHA, /* U+0122c9: CUNEIFORM SIGN SHIM TIMES BULUG*/
+ RTUNI_ALPHA, /* U+0122ca: CUNEIFORM SIGN SHIM TIMES DIN*/
+ RTUNI_ALPHA, /* U+0122cb: CUNEIFORM SIGN SHIM TIMES GAR*/
+ RTUNI_ALPHA, /* U+0122cc: CUNEIFORM SIGN SHIM TIMES IGI*/
+ RTUNI_ALPHA, /* U+0122cd: CUNEIFORM SIGN SHIM TIMES IGI GUNU*/
+ RTUNI_ALPHA, /* U+0122ce: CUNEIFORM SIGN SHIM TIMES KUSHU2*/
+ RTUNI_ALPHA, /* U+0122cf: CUNEIFORM SIGN SHIM TIMES LUL*/
+ RTUNI_ALPHA, /* U+0122d0: CUNEIFORM SIGN SHIM TIMES MUG*/
+ RTUNI_ALPHA, /* U+0122d1: CUNEIFORM SIGN SHIM TIMES SAL*/
+ RTUNI_ALPHA, /* U+0122d2: CUNEIFORM SIGN SHINIG*/
+ RTUNI_ALPHA, /* U+0122d3: CUNEIFORM SIGN SHIR*/
+ RTUNI_ALPHA, /* U+0122d4: CUNEIFORM SIGN SHIR TENU*/
+ RTUNI_ALPHA, /* U+0122d5: CUNEIFORM SIGN SHIR OVER SHIR BUR OVER BUR*/
+ RTUNI_ALPHA, /* U+0122d6: CUNEIFORM SIGN SHITA*/
+ RTUNI_ALPHA, /* U+0122d7: CUNEIFORM SIGN SHU*/
+ RTUNI_ALPHA, /* U+0122d8: CUNEIFORM SIGN SHU OVER INVERTED SHU*/
+ RTUNI_ALPHA, /* U+0122d9: CUNEIFORM SIGN SHU2*/
+ RTUNI_ALPHA, /* U+0122da: CUNEIFORM SIGN SHUBUR*/
+ RTUNI_ALPHA, /* U+0122db: CUNEIFORM SIGN SI*/
+ RTUNI_ALPHA, /* U+0122dc: CUNEIFORM SIGN SI GUNU*/
+ RTUNI_ALPHA, /* U+0122dd: CUNEIFORM SIGN SIG*/
+ RTUNI_ALPHA, /* U+0122de: CUNEIFORM SIGN SIG4*/
+ RTUNI_ALPHA, /* U+0122df: CUNEIFORM SIGN SIG4 OVER SIG4 SHU2*/
+ RTUNI_ALPHA, /* U+0122e0: CUNEIFORM SIGN SIK2*/
+ RTUNI_ALPHA, /* U+0122e1: CUNEIFORM SIGN SILA3*/
+ RTUNI_ALPHA, /* U+0122e2: CUNEIFORM SIGN SU*/
+ RTUNI_ALPHA, /* U+0122e3: CUNEIFORM SIGN SU OVER SU*/
+ RTUNI_ALPHA, /* U+0122e4: CUNEIFORM SIGN SUD*/
+ RTUNI_ALPHA, /* U+0122e5: CUNEIFORM SIGN SUD2*/
+ RTUNI_ALPHA, /* U+0122e6: CUNEIFORM SIGN SUHUR*/
+ RTUNI_ALPHA, /* U+0122e7: CUNEIFORM SIGN SUM*/
+ RTUNI_ALPHA, /* U+0122e8: CUNEIFORM SIGN SUMASH*/
+ RTUNI_ALPHA, /* U+0122e9: CUNEIFORM SIGN SUR*/
+ RTUNI_ALPHA, /* U+0122ea: CUNEIFORM SIGN SUR9*/
+ RTUNI_ALPHA, /* U+0122eb: CUNEIFORM SIGN TA*/
+ RTUNI_ALPHA, /* U+0122ec: CUNEIFORM SIGN TA ASTERISK*/
+ RTUNI_ALPHA, /* U+0122ed: CUNEIFORM SIGN TA TIMES HI*/
+ RTUNI_ALPHA, /* U+0122ee: CUNEIFORM SIGN TA TIMES MI*/
+ RTUNI_ALPHA, /* U+0122ef: CUNEIFORM SIGN TA GUNU*/
+ RTUNI_ALPHA, /* U+0122f0: CUNEIFORM SIGN TAB*/
+ RTUNI_ALPHA, /* U+0122f1: CUNEIFORM SIGN TAB OVER TAB NI OVER NI DISH OVER DISH*/
+ RTUNI_ALPHA, /* U+0122f2: CUNEIFORM SIGN TAB SQUARED*/
+ RTUNI_ALPHA, /* U+0122f3: CUNEIFORM SIGN TAG*/
+ RTUNI_ALPHA, /* U+0122f4: CUNEIFORM SIGN TAG TIMES BI*/
+ RTUNI_ALPHA, /* U+0122f5: CUNEIFORM SIGN TAG TIMES GUD*/
+ RTUNI_ALPHA, /* U+0122f6: CUNEIFORM SIGN TAG TIMES SHE*/
+ RTUNI_ALPHA, /* U+0122f7: CUNEIFORM SIGN TAG TIMES SHU*/
+ RTUNI_ALPHA, /* U+0122f8: CUNEIFORM SIGN TAG TIMES TUG2*/
+ RTUNI_ALPHA, /* U+0122f9: CUNEIFORM SIGN TAG TIMES UD*/
+ RTUNI_ALPHA, /* U+0122fa: CUNEIFORM SIGN TAK4*/
+ RTUNI_ALPHA, /* U+0122fb: CUNEIFORM SIGN TAR*/
+ RTUNI_ALPHA, /* U+0122fc: CUNEIFORM SIGN TE*/
+ RTUNI_ALPHA, /* U+0122fd: CUNEIFORM SIGN TE GUNU*/
+ RTUNI_ALPHA, /* U+0122fe: CUNEIFORM SIGN TI*/
+ RTUNI_ALPHA, /* U+0122ff: CUNEIFORM SIGN TI TENU*/
+ RTUNI_ALPHA, /* U+012300: CUNEIFORM SIGN TIL*/
+ RTUNI_ALPHA, /* U+012301: CUNEIFORM SIGN TIR*/
+ RTUNI_ALPHA, /* U+012302: CUNEIFORM SIGN TIR TIMES TAK4*/
+ RTUNI_ALPHA, /* U+012303: CUNEIFORM SIGN TIR OVER TIR*/
+ RTUNI_ALPHA, /* U+012304: CUNEIFORM SIGN TIR OVER TIR GAD OVER GAD GAR OVER GAR*/
+ RTUNI_ALPHA, /* U+012305: CUNEIFORM SIGN TU*/
+ RTUNI_ALPHA, /* U+012306: CUNEIFORM SIGN TUG2*/
+ RTUNI_ALPHA, /* U+012307: CUNEIFORM SIGN TUK*/
+ RTUNI_ALPHA, /* U+012308: CUNEIFORM SIGN TUM*/
+ RTUNI_ALPHA, /* U+012309: CUNEIFORM SIGN TUR*/
+ RTUNI_ALPHA, /* U+01230a: CUNEIFORM SIGN TUR OVER TUR ZA OVER ZA*/
+ RTUNI_ALPHA, /* U+01230b: CUNEIFORM SIGN U*/
+ RTUNI_ALPHA, /* U+01230c: CUNEIFORM SIGN U GUD*/
+ RTUNI_ALPHA, /* U+01230d: CUNEIFORM SIGN U U U*/
+ RTUNI_ALPHA, /* U+01230e: CUNEIFORM SIGN U OVER U PA OVER PA GAR OVER GAR*/
+ RTUNI_ALPHA, /* U+01230f: CUNEIFORM SIGN U OVER U SUR OVER SUR*/
+ RTUNI_ALPHA, /* U+012310: CUNEIFORM SIGN U OVER U U REVERSED OVER U REVERSED*/
+ RTUNI_ALPHA, /* U+012311: CUNEIFORM SIGN U2*/
+ RTUNI_ALPHA, /* U+012312: CUNEIFORM SIGN UB*/
+ RTUNI_ALPHA, /* U+012313: CUNEIFORM SIGN UD*/
+ RTUNI_ALPHA, /* U+012314: CUNEIFORM SIGN UD KUSHU2*/
+ RTUNI_ALPHA, /* U+012315: CUNEIFORM SIGN UD TIMES BAD*/
+ RTUNI_ALPHA, /* U+012316: CUNEIFORM SIGN UD TIMES MI*/
+ RTUNI_ALPHA, /* U+012317: CUNEIFORM SIGN UD TIMES U PLUS U PLUS U*/
+ RTUNI_ALPHA, /* U+012318: CUNEIFORM SIGN UD TIMES U PLUS U PLUS U GUNU*/
+ RTUNI_ALPHA, /* U+012319: CUNEIFORM SIGN UD GUNU*/
+ RTUNI_ALPHA, /* U+01231a: CUNEIFORM SIGN UD SHESHIG*/
+ RTUNI_ALPHA, /* U+01231b: CUNEIFORM SIGN UD SHESHIG TIMES BAD*/
+ RTUNI_ALPHA, /* U+01231c: CUNEIFORM SIGN UDUG*/
+ RTUNI_ALPHA, /* U+01231d: CUNEIFORM SIGN UM*/
+ RTUNI_ALPHA, /* U+01231e: CUNEIFORM SIGN UM TIMES LAGAB*/
+ RTUNI_ALPHA, /* U+01231f: CUNEIFORM SIGN UM TIMES ME PLUS DA*/
+ RTUNI_ALPHA, /* U+012320: CUNEIFORM SIGN UM TIMES SHA3*/
+ RTUNI_ALPHA, /* U+012321: CUNEIFORM SIGN UM TIMES U*/
+ RTUNI_ALPHA, /* U+012322: CUNEIFORM SIGN UMBIN*/
+ RTUNI_ALPHA, /* U+012323: CUNEIFORM SIGN UMUM*/
+ RTUNI_ALPHA, /* U+012324: CUNEIFORM SIGN UMUM TIMES KASKAL*/
+ RTUNI_ALPHA, /* U+012325: CUNEIFORM SIGN UMUM TIMES PA*/
+ RTUNI_ALPHA, /* U+012326: CUNEIFORM SIGN UN*/
+ RTUNI_ALPHA, /* U+012327: CUNEIFORM SIGN UN GUNU*/
+ RTUNI_ALPHA, /* U+012328: CUNEIFORM SIGN UR*/
+ RTUNI_ALPHA, /* U+012329: CUNEIFORM SIGN UR CROSSING UR*/
+ RTUNI_ALPHA, /* U+01232a: CUNEIFORM SIGN UR SHESHIG*/
+ RTUNI_ALPHA, /* U+01232b: CUNEIFORM SIGN UR2*/
+ RTUNI_ALPHA, /* U+01232c: CUNEIFORM SIGN UR2 TIMES A PLUS HA*/
+ RTUNI_ALPHA, /* U+01232d: CUNEIFORM SIGN UR2 TIMES A PLUS NA*/
+ RTUNI_ALPHA, /* U+01232e: CUNEIFORM SIGN UR2 TIMES AL*/
+ RTUNI_ALPHA, /* U+01232f: CUNEIFORM SIGN UR2 TIMES HA*/
+ RTUNI_ALPHA, /* U+012330: CUNEIFORM SIGN UR2 TIMES NUN*/
+ RTUNI_ALPHA, /* U+012331: CUNEIFORM SIGN UR2 TIMES U2*/
+ RTUNI_ALPHA, /* U+012332: CUNEIFORM SIGN UR2 TIMES U2 PLUS ASH*/
+ RTUNI_ALPHA, /* U+012333: CUNEIFORM SIGN UR2 TIMES U2 PLUS BI*/
+ RTUNI_ALPHA, /* U+012334: CUNEIFORM SIGN UR4*/
+ RTUNI_ALPHA, /* U+012335: CUNEIFORM SIGN URI*/
+ RTUNI_ALPHA, /* U+012336: CUNEIFORM SIGN URI3*/
+ RTUNI_ALPHA, /* U+012337: CUNEIFORM SIGN URU*/
+ RTUNI_ALPHA, /* U+012338: CUNEIFORM SIGN URU TIMES A*/
+ RTUNI_ALPHA, /* U+012339: CUNEIFORM SIGN URU TIMES ASHGAB*/
+ RTUNI_ALPHA, /* U+01233a: CUNEIFORM SIGN URU TIMES BAR*/
+ RTUNI_ALPHA, /* U+01233b: CUNEIFORM SIGN URU TIMES DUN*/
+ RTUNI_ALPHA, /* U+01233c: CUNEIFORM SIGN URU TIMES GA*/
+ RTUNI_ALPHA, /* U+01233d: CUNEIFORM SIGN URU TIMES GAL*/
+ RTUNI_ALPHA, /* U+01233e: CUNEIFORM SIGN URU TIMES GAN2 TENU*/
+ RTUNI_ALPHA, /* U+01233f: CUNEIFORM SIGN URU TIMES GAR*/
+ RTUNI_ALPHA, /* U+012340: CUNEIFORM SIGN URU TIMES GU*/
+ RTUNI_ALPHA, /* U+012341: CUNEIFORM SIGN URU TIMES HA*/
+ RTUNI_ALPHA, /* U+012342: CUNEIFORM SIGN URU TIMES IGI*/
+ RTUNI_ALPHA, /* U+012343: CUNEIFORM SIGN URU TIMES IM*/
+ RTUNI_ALPHA, /* U+012344: CUNEIFORM SIGN URU TIMES ISH*/
+ RTUNI_ALPHA, /* U+012345: CUNEIFORM SIGN URU TIMES KI*/
+ RTUNI_ALPHA, /* U+012346: CUNEIFORM SIGN URU TIMES LUM*/
+ RTUNI_ALPHA, /* U+012347: CUNEIFORM SIGN URU TIMES MIN*/
+ RTUNI_ALPHA, /* U+012348: CUNEIFORM SIGN URU TIMES PA*/
+ RTUNI_ALPHA, /* U+012349: CUNEIFORM SIGN URU TIMES SHE*/
+ RTUNI_ALPHA, /* U+01234a: CUNEIFORM SIGN URU TIMES SIG4*/
+ RTUNI_ALPHA, /* U+01234b: CUNEIFORM SIGN URU TIMES TU*/
+ RTUNI_ALPHA, /* U+01234c: CUNEIFORM SIGN URU TIMES U PLUS GUD*/
+ RTUNI_ALPHA, /* U+01234d: CUNEIFORM SIGN URU TIMES UD*/
+ RTUNI_ALPHA, /* U+01234e: CUNEIFORM SIGN URU TIMES URUDA*/
+ RTUNI_ALPHA, /* U+01234f: CUNEIFORM SIGN URUDA*/
+ RTUNI_ALPHA, /* U+012350: CUNEIFORM SIGN URUDA TIMES U*/
+ RTUNI_ALPHA, /* U+012351: CUNEIFORM SIGN USH*/
+ RTUNI_ALPHA, /* U+012352: CUNEIFORM SIGN USH TIMES A*/
+ RTUNI_ALPHA, /* U+012353: CUNEIFORM SIGN USH TIMES KU*/
+ RTUNI_ALPHA, /* U+012354: CUNEIFORM SIGN USH TIMES KUR*/
+ RTUNI_ALPHA, /* U+012355: CUNEIFORM SIGN USH TIMES TAK4*/
+ RTUNI_ALPHA, /* U+012356: CUNEIFORM SIGN USHX*/
+ RTUNI_ALPHA, /* U+012357: CUNEIFORM SIGN USH2*/
+ RTUNI_ALPHA, /* U+012358: CUNEIFORM SIGN USHUMX*/
+ RTUNI_ALPHA, /* U+012359: CUNEIFORM SIGN UTUKI*/
+ RTUNI_ALPHA, /* U+01235a: CUNEIFORM SIGN UZ3*/
+ RTUNI_ALPHA, /* U+01235b: CUNEIFORM SIGN UZ3 TIMES KASKAL*/
+ RTUNI_ALPHA, /* U+01235c: CUNEIFORM SIGN UZU*/
+ RTUNI_ALPHA, /* U+01235d: CUNEIFORM SIGN ZA*/
+ RTUNI_ALPHA, /* U+01235e: CUNEIFORM SIGN ZA TENU*/
+ RTUNI_ALPHA, /* U+01235f: CUNEIFORM SIGN ZA SQUARED TIMES KUR*/
+ RTUNI_ALPHA, /* U+012360: CUNEIFORM SIGN ZAG*/
+ RTUNI_ALPHA, /* U+012361: CUNEIFORM SIGN ZAMX*/
+ RTUNI_ALPHA, /* U+012362: CUNEIFORM SIGN ZE2*/
+ RTUNI_ALPHA, /* U+012363: CUNEIFORM SIGN ZI*/
+ RTUNI_ALPHA, /* U+012364: CUNEIFORM SIGN ZI OVER ZI*/
+ RTUNI_ALPHA, /* U+012365: CUNEIFORM SIGN ZI3*/
+ RTUNI_ALPHA, /* U+012366: CUNEIFORM SIGN ZIB*/
+ RTUNI_ALPHA, /* U+012367: CUNEIFORM SIGN ZIB KABA TENU*/
+ RTUNI_ALPHA, /* U+012368: CUNEIFORM SIGN ZIG*/
+ RTUNI_ALPHA, /* U+012369: CUNEIFORM SIGN ZIZ2*/
+ RTUNI_ALPHA, /* U+01236a: CUNEIFORM SIGN ZU*/
+ RTUNI_ALPHA, /* U+01236b: CUNEIFORM SIGN ZU5*/
+ RTUNI_ALPHA, /* U+01236c: CUNEIFORM SIGN ZU5 TIMES A*/
+ RTUNI_ALPHA, /* U+01236d: CUNEIFORM SIGN ZUBUR*/
+ RTUNI_ALPHA, /* U+01236e: CUNEIFORM SIGN ZUM*/
+ 0, /* U+01236f: */
+ 0, /* U+012370: */
+ 0, /* U+012371: */
+ 0, /* U+012372: */
+ 0, /* U+012373: */
+ 0, /* U+012374: */
+ 0, /* U+012375: */
+ 0, /* U+012376: */
+ 0, /* U+012377: */
+ 0, /* U+012378: */
+ 0, /* U+012379: */
+ 0, /* U+01237a: */
+ 0, /* U+01237b: */
+ 0, /* U+01237c: */
+ 0, /* U+01237d: */
+ 0, /* U+01237e: */
+ 0, /* U+01237f: */
+ 0, /* U+012380: */
+ 0, /* U+012381: */
+ 0, /* U+012382: */
+ 0, /* U+012383: */
+ 0, /* U+012384: */
+ 0, /* U+012385: */
+ 0, /* U+012386: */
+ 0, /* U+012387: */
+ 0, /* U+012388: */
+ 0, /* U+012389: */
+ 0, /* U+01238a: */
+ 0, /* U+01238b: */
+ 0, /* U+01238c: */
+ 0, /* U+01238d: */
+ 0, /* U+01238e: */
+ 0, /* U+01238f: */
+ 0, /* U+012390: */
+ 0, /* U+012391: */
+ 0, /* U+012392: */
+ 0, /* U+012393: */
+ 0, /* U+012394: */
+ 0, /* U+012395: */
+ 0, /* U+012396: */
+ 0, /* U+012397: */
+ 0, /* U+012398: */
+ 0, /* U+012399: */
+ 0, /* U+01239a: */
+ 0, /* U+01239b: */
+ 0, /* U+01239c: */
+ 0, /* U+01239d: */
+ 0, /* U+01239e: */
+ 0, /* U+01239f: */
+ 0, /* U+0123a0: */
+ 0, /* U+0123a1: */
+ 0, /* U+0123a2: */
+ 0, /* U+0123a3: */
+ 0, /* U+0123a4: */
+ 0, /* U+0123a5: */
+ 0, /* U+0123a6: */
+ 0, /* U+0123a7: */
+ 0, /* U+0123a8: */
+ 0, /* U+0123a9: */
+ 0, /* U+0123aa: */
+ 0, /* U+0123ab: */
+ 0, /* U+0123ac: */
+ 0, /* U+0123ad: */
+ 0, /* U+0123ae: */
+ 0, /* U+0123af: */
+ 0, /* U+0123b0: */
+ 0, /* U+0123b1: */
+ 0, /* U+0123b2: */
+ 0, /* U+0123b3: */
+ 0, /* U+0123b4: */
+ 0, /* U+0123b5: */
+ 0, /* U+0123b6: */
+ 0, /* U+0123b7: */
+ 0, /* U+0123b8: */
+ 0, /* U+0123b9: */
+ 0, /* U+0123ba: */
+ 0, /* U+0123bb: */
+ 0, /* U+0123bc: */
+ 0, /* U+0123bd: */
+ 0, /* U+0123be: */
+ 0, /* U+0123bf: */
+ 0, /* U+0123c0: */
+ 0, /* U+0123c1: */
+ 0, /* U+0123c2: */
+ 0, /* U+0123c3: */
+ 0, /* U+0123c4: */
+ 0, /* U+0123c5: */
+ 0, /* U+0123c6: */
+ 0, /* U+0123c7: */
+ 0, /* U+0123c8: */
+ 0, /* U+0123c9: */
+ 0, /* U+0123ca: */
+ 0, /* U+0123cb: */
+ 0, /* U+0123cc: */
+ 0, /* U+0123cd: */
+ 0, /* U+0123ce: */
+ 0, /* U+0123cf: */
+ 0, /* U+0123d0: */
+ 0, /* U+0123d1: */
+ 0, /* U+0123d2: */
+ 0, /* U+0123d3: */
+ 0, /* U+0123d4: */
+ 0, /* U+0123d5: */
+ 0, /* U+0123d6: */
+ 0, /* U+0123d7: */
+ 0, /* U+0123d8: */
+ 0, /* U+0123d9: */
+ 0, /* U+0123da: */
+ 0, /* U+0123db: */
+ 0, /* U+0123dc: */
+ 0, /* U+0123dd: */
+ 0, /* U+0123de: */
+ 0, /* U+0123df: */
+ 0, /* U+0123e0: */
+ 0, /* U+0123e1: */
+ 0, /* U+0123e2: */
+ 0, /* U+0123e3: */
+ 0, /* U+0123e4: */
+ 0, /* U+0123e5: */
+ 0, /* U+0123e6: */
+ 0, /* U+0123e7: */
+ 0, /* U+0123e8: */
+ 0, /* U+0123e9: */
+ 0, /* U+0123ea: */
+ 0, /* U+0123eb: */
+ 0, /* U+0123ec: */
+ 0, /* U+0123ed: */
+ 0, /* U+0123ee: */
+ 0, /* U+0123ef: */
+ 0, /* U+0123f0: */
+ 0, /* U+0123f1: */
+ 0, /* U+0123f2: */
+ 0, /* U+0123f3: */
+ 0, /* U+0123f4: */
+ 0, /* U+0123f5: */
+ 0, /* U+0123f6: */
+ 0, /* U+0123f7: */
+ 0, /* U+0123f8: */
+ 0, /* U+0123f9: */
+ 0, /* U+0123fa: */
+ 0, /* U+0123fb: */
+ 0, /* U+0123fc: */
+ 0, /* U+0123fd: */
+ 0, /* U+0123fe: */
+ 0, /* U+0123ff: */
+ RTUNI_ALPHA, /* U+012400: CUNEIFORM NUMERIC SIGN TWO ASH*/
+ RTUNI_ALPHA, /* U+012401: CUNEIFORM NUMERIC SIGN THREE ASH*/
+ RTUNI_ALPHA, /* U+012402: CUNEIFORM NUMERIC SIGN FOUR ASH*/
+ RTUNI_ALPHA, /* U+012403: CUNEIFORM NUMERIC SIGN FIVE ASH*/
+ RTUNI_ALPHA, /* U+012404: CUNEIFORM NUMERIC SIGN SIX ASH*/
+ RTUNI_ALPHA, /* U+012405: CUNEIFORM NUMERIC SIGN SEVEN ASH*/
+ RTUNI_ALPHA, /* U+012406: CUNEIFORM NUMERIC SIGN EIGHT ASH*/
+ RTUNI_ALPHA, /* U+012407: CUNEIFORM NUMERIC SIGN NINE ASH*/
+ RTUNI_ALPHA, /* U+012408: CUNEIFORM NUMERIC SIGN THREE DISH*/
+ RTUNI_ALPHA, /* U+012409: CUNEIFORM NUMERIC SIGN FOUR DISH*/
+ RTUNI_ALPHA, /* U+01240a: CUNEIFORM NUMERIC SIGN FIVE DISH*/
+ RTUNI_ALPHA, /* U+01240b: CUNEIFORM NUMERIC SIGN SIX DISH*/
+ RTUNI_ALPHA, /* U+01240c: CUNEIFORM NUMERIC SIGN SEVEN DISH*/
+ RTUNI_ALPHA, /* U+01240d: CUNEIFORM NUMERIC SIGN EIGHT DISH*/
+ RTUNI_ALPHA, /* U+01240e: CUNEIFORM NUMERIC SIGN NINE DISH*/
+ RTUNI_ALPHA, /* U+01240f: CUNEIFORM NUMERIC SIGN FOUR U*/
+ RTUNI_ALPHA, /* U+012410: CUNEIFORM NUMERIC SIGN FIVE U*/
+ RTUNI_ALPHA, /* U+012411: CUNEIFORM NUMERIC SIGN SIX U*/
+ RTUNI_ALPHA, /* U+012412: CUNEIFORM NUMERIC SIGN SEVEN U*/
+ RTUNI_ALPHA, /* U+012413: CUNEIFORM NUMERIC SIGN EIGHT U*/
+ RTUNI_ALPHA, /* U+012414: CUNEIFORM NUMERIC SIGN NINE U*/
+ RTUNI_ALPHA, /* U+012415: CUNEIFORM NUMERIC SIGN ONE GESH2*/
+ RTUNI_ALPHA, /* U+012416: CUNEIFORM NUMERIC SIGN TWO GESH2*/
+ RTUNI_ALPHA, /* U+012417: CUNEIFORM NUMERIC SIGN THREE GESH2*/
+ RTUNI_ALPHA, /* U+012418: CUNEIFORM NUMERIC SIGN FOUR GESH2*/
+ RTUNI_ALPHA, /* U+012419: CUNEIFORM NUMERIC SIGN FIVE GESH2*/
+ RTUNI_ALPHA, /* U+01241a: CUNEIFORM NUMERIC SIGN SIX GESH2*/
+ RTUNI_ALPHA, /* U+01241b: CUNEIFORM NUMERIC SIGN SEVEN GESH2*/
+ RTUNI_ALPHA, /* U+01241c: CUNEIFORM NUMERIC SIGN EIGHT GESH2*/
+ RTUNI_ALPHA, /* U+01241d: CUNEIFORM NUMERIC SIGN NINE GESH2*/
+ RTUNI_ALPHA, /* U+01241e: CUNEIFORM NUMERIC SIGN ONE GESHU*/
+ RTUNI_ALPHA, /* U+01241f: CUNEIFORM NUMERIC SIGN TWO GESHU*/
+ RTUNI_ALPHA, /* U+012420: CUNEIFORM NUMERIC SIGN THREE GESHU*/
+ RTUNI_ALPHA, /* U+012421: CUNEIFORM NUMERIC SIGN FOUR GESHU*/
+ RTUNI_ALPHA, /* U+012422: CUNEIFORM NUMERIC SIGN FIVE GESHU*/
+ RTUNI_ALPHA, /* U+012423: CUNEIFORM NUMERIC SIGN TWO SHAR2*/
+ RTUNI_ALPHA, /* U+012424: CUNEIFORM NUMERIC SIGN THREE SHAR2*/
+ RTUNI_ALPHA, /* U+012425: CUNEIFORM NUMERIC SIGN THREE SHAR2 VARIANT FORM*/
+ RTUNI_ALPHA, /* U+012426: CUNEIFORM NUMERIC SIGN FOUR SHAR2*/
+ RTUNI_ALPHA, /* U+012427: CUNEIFORM NUMERIC SIGN FIVE SHAR2*/
+ RTUNI_ALPHA, /* U+012428: CUNEIFORM NUMERIC SIGN SIX SHAR2*/
+ RTUNI_ALPHA, /* U+012429: CUNEIFORM NUMERIC SIGN SEVEN SHAR2*/
+ RTUNI_ALPHA, /* U+01242a: CUNEIFORM NUMERIC SIGN EIGHT SHAR2*/
+ RTUNI_ALPHA, /* U+01242b: CUNEIFORM NUMERIC SIGN NINE SHAR2*/
+ RTUNI_ALPHA, /* U+01242c: CUNEIFORM NUMERIC SIGN ONE SHARU*/
+ RTUNI_ALPHA, /* U+01242d: CUNEIFORM NUMERIC SIGN TWO SHARU*/
+ RTUNI_ALPHA, /* U+01242e: CUNEIFORM NUMERIC SIGN THREE SHARU*/
+ RTUNI_ALPHA, /* U+01242f: CUNEIFORM NUMERIC SIGN THREE SHARU VARIANT FORM*/
+ RTUNI_ALPHA, /* U+012430: CUNEIFORM NUMERIC SIGN FOUR SHARU*/
+ RTUNI_ALPHA, /* U+012431: CUNEIFORM NUMERIC SIGN FIVE SHARU*/
+ RTUNI_ALPHA, /* U+012432: CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS DISH*/
+ RTUNI_ALPHA, /* U+012433: CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS MIN*/
+ RTUNI_ALPHA, /* U+012434: CUNEIFORM NUMERIC SIGN ONE BURU*/
+ RTUNI_ALPHA, /* U+012435: CUNEIFORM NUMERIC SIGN TWO BURU*/
+ RTUNI_ALPHA, /* U+012436: CUNEIFORM NUMERIC SIGN THREE BURU*/
+ RTUNI_ALPHA, /* U+012437: CUNEIFORM NUMERIC SIGN THREE BURU VARIANT FORM*/
+ RTUNI_ALPHA, /* U+012438: CUNEIFORM NUMERIC SIGN FOUR BURU*/
+ RTUNI_ALPHA, /* U+012439: CUNEIFORM NUMERIC SIGN FIVE BURU*/
+ RTUNI_ALPHA, /* U+01243a: CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH16*/
+ RTUNI_ALPHA, /* U+01243b: CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH21*/
+ RTUNI_ALPHA, /* U+01243c: CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU*/
+ RTUNI_ALPHA, /* U+01243d: CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU4*/
+ RTUNI_ALPHA, /* U+01243e: CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU A*/
+ RTUNI_ALPHA, /* U+01243f: CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU B*/
+ RTUNI_ALPHA, /* U+012440: CUNEIFORM NUMERIC SIGN SIX VARIANT FORM ASH9*/
+ RTUNI_ALPHA, /* U+012441: CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN3*/
+ RTUNI_ALPHA, /* U+012442: CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN A*/
+ RTUNI_ALPHA, /* U+012443: CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN B*/
+ RTUNI_ALPHA, /* U+012444: CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU*/
+ RTUNI_ALPHA, /* U+012445: CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU3*/
+ RTUNI_ALPHA, /* U+012446: CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU*/
+ RTUNI_ALPHA, /* U+012447: CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU3*/
+ RTUNI_ALPHA, /* U+012448: CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU4*/
+ RTUNI_ALPHA, /* U+012449: CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU A*/
+ RTUNI_ALPHA, /* U+01244a: CUNEIFORM NUMERIC SIGN TWO ASH TENU*/
+ RTUNI_ALPHA, /* U+01244b: CUNEIFORM NUMERIC SIGN THREE ASH TENU*/
+ RTUNI_ALPHA, /* U+01244c: CUNEIFORM NUMERIC SIGN FOUR ASH TENU*/
+ RTUNI_ALPHA, /* U+01244d: CUNEIFORM NUMERIC SIGN FIVE ASH TENU*/
+ RTUNI_ALPHA, /* U+01244e: CUNEIFORM NUMERIC SIGN SIX ASH TENU*/
+ RTUNI_ALPHA, /* U+01244f: CUNEIFORM NUMERIC SIGN ONE BAN2*/
+ RTUNI_ALPHA, /* U+012450: CUNEIFORM NUMERIC SIGN TWO BAN2*/
+ RTUNI_ALPHA, /* U+012451: CUNEIFORM NUMERIC SIGN THREE BAN2*/
+ RTUNI_ALPHA, /* U+012452: CUNEIFORM NUMERIC SIGN FOUR BAN2*/
+ RTUNI_ALPHA, /* U+012453: CUNEIFORM NUMERIC SIGN FOUR BAN2 VARIANT FORM*/
+ RTUNI_ALPHA, /* U+012454: CUNEIFORM NUMERIC SIGN FIVE BAN2*/
+ RTUNI_ALPHA, /* U+012455: CUNEIFORM NUMERIC SIGN FIVE BAN2 VARIANT FORM*/
+ RTUNI_ALPHA, /* U+012456: CUNEIFORM NUMERIC SIGN NIGIDAMIN*/
+ RTUNI_ALPHA, /* U+012457: CUNEIFORM NUMERIC SIGN NIGIDAESH*/
+ RTUNI_ALPHA, /* U+012458: CUNEIFORM NUMERIC SIGN ONE ESHE3*/
+ RTUNI_ALPHA, /* U+012459: CUNEIFORM NUMERIC SIGN TWO ESHE3*/
+ RTUNI_ALPHA, /* U+01245a: CUNEIFORM NUMERIC SIGN ONE THIRD DISH*/
+ RTUNI_ALPHA, /* U+01245b: CUNEIFORM NUMERIC SIGN TWO THIRDS DISH*/
+ RTUNI_ALPHA, /* U+01245c: CUNEIFORM NUMERIC SIGN FIVE SIXTHS DISH*/
+ RTUNI_ALPHA, /* U+01245d: CUNEIFORM NUMERIC SIGN ONE THIRD VARIANT FORM A*/
+ RTUNI_ALPHA, /* U+01245e: CUNEIFORM NUMERIC SIGN TWO THIRDS VARIANT FORM A*/
+ RTUNI_ALPHA, /* U+01245f: CUNEIFORM NUMERIC SIGN ONE EIGHTH ASH*/
+ RTUNI_ALPHA, /* U+012460: CUNEIFORM NUMERIC SIGN ONE QUARTER ASH*/
+ RTUNI_ALPHA, /* U+012461: CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE SIXTH*/
+ RTUNI_ALPHA, /* U+012462: CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE QUARTER*/
+ 0, /* U+012463: */
+ 0, /* U+012464: */
+ 0, /* U+012465: */
+ 0, /* U+012466: */
+ 0, /* U+012467: */
+ 0, /* U+012468: */
+ 0, /* U+012469: */
+ 0, /* U+01246a: */
+ 0, /* U+01246b: */
+ 0, /* U+01246c: */
+ 0, /* U+01246d: */
+ 0, /* U+01246e: */
+ 0, /* U+01246f: */
+ 0, /* U+012470: CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER*/
+ 0, /* U+012471: CUNEIFORM PUNCTUATION SIGN VERTICAL COLON*/
+ 0, /* U+012472: CUNEIFORM PUNCTUATION SIGN DIAGONAL COLON*/
+ 0, /* U+012473: CUNEIFORM PUNCTUATION SIGN DIAGONAL TRICOLON*/
+ 0, /* U+012474: */
+ 0, /* U+012475: */
+ 0, /* U+012476: */
+ 0, /* U+012477: */
+ 0, /* U+012478: */
+ 0, /* U+012479: */
+ 0, /* U+01247a: */
+ 0, /* U+01247b: */
+ 0, /* U+01247c: */
+ 0, /* U+01247d: */
+ 0, /* U+01247e: */
+ 0, /* U+01247f: */
+ 0, /* U+012480: */
+ 0, /* U+012481: */
+ 0, /* U+012482: */
+ 0, /* U+012483: */
+ 0, /* U+012484: */
+ 0, /* U+012485: */
+ 0, /* U+012486: */
+ 0, /* U+012487: */
+ 0, /* U+012488: */
+ 0, /* U+012489: */
+ 0, /* U+01248a: */
+ 0, /* U+01248b: */
+ 0, /* U+01248c: */
+ 0, /* U+01248d: */
+ 0, /* U+01248e: */
+ 0, /* U+01248f: */
+ 0, /* U+012490: */
+ 0, /* U+012491: */
+ 0, /* U+012492: */
+ 0, /* U+012493: */
+ 0, /* U+012494: */
+ 0, /* U+012495: */
+ 0, /* U+012496: */
+ 0, /* U+012497: */
+ 0, /* U+012498: */
+ 0, /* U+012499: */
+ 0, /* U+01249a: */
+ 0, /* U+01249b: */
+ 0, /* U+01249c: */
+ 0, /* U+01249d: */
+ 0, /* U+01249e: */
+ 0, /* U+01249f: */
+ 0, /* U+0124a0: */
+ 0, /* U+0124a1: */
+ 0, /* U+0124a2: */
+ 0, /* U+0124a3: */
+ 0, /* U+0124a4: */
+ 0, /* U+0124a5: */
+ 0, /* U+0124a6: */
+ 0, /* U+0124a7: */
+ 0, /* U+0124a8: */
+ 0, /* U+0124a9: */
+ 0, /* U+0124aa: */
+ 0, /* U+0124ab: */
+ 0, /* U+0124ac: */
+ 0, /* U+0124ad: */
+ 0, /* U+0124ae: */
+ 0, /* U+0124af: */
+ 0, /* U+0124b0: */
+ 0, /* U+0124b1: */
+ 0, /* U+0124b2: */
+ 0, /* U+0124b3: */
+ 0, /* U+0124b4: */
+ 0, /* U+0124b5: */
+ 0, /* U+0124b6: */
+ 0, /* U+0124b7: */
+ 0, /* U+0124b8: */
+ 0, /* U+0124b9: */
+ 0, /* U+0124ba: */
+ 0, /* U+0124bb: */
+ 0, /* U+0124bc: */
+ 0, /* U+0124bd: */
+ 0, /* U+0124be: */
+ 0, /* U+0124bf: */
+ 0, /* U+0124c0: */
+ 0, /* U+0124c1: */
+ 0, /* U+0124c2: */
+ 0, /* U+0124c3: */
+ 0, /* U+0124c4: */
+ 0, /* U+0124c5: */
+ 0, /* U+0124c6: */
+ 0, /* U+0124c7: */
+ 0, /* U+0124c8: */
+ 0, /* U+0124c9: */
+ 0, /* U+0124ca: */
+ 0, /* U+0124cb: */
+ 0, /* U+0124cc: */
+ 0, /* U+0124cd: */
+ 0, /* U+0124ce: */
+ 0, /* U+0124cf: */
+ 0, /* U+0124d0: */
+ 0, /* U+0124d1: */
+ 0, /* U+0124d2: */
+ 0, /* U+0124d3: */
+ 0, /* U+0124d4: */
+ 0, /* U+0124d5: */
+ 0, /* U+0124d6: */
+ 0, /* U+0124d7: */
+ 0, /* U+0124d8: */
+ 0, /* U+0124d9: */
+ 0, /* U+0124da: */
+ 0, /* U+0124db: */
+ 0, /* U+0124dc: */
+ 0, /* U+0124dd: */
+ 0, /* U+0124de: */
+ 0, /* U+0124df: */
+ 0, /* U+0124e0: */
+ 0, /* U+0124e1: */
+ 0, /* U+0124e2: */
+ 0, /* U+0124e3: */
+ 0, /* U+0124e4: */
+ 0, /* U+0124e5: */
+ 0, /* U+0124e6: */
+ 0, /* U+0124e7: */
+ 0, /* U+0124e8: */
+ 0, /* U+0124e9: */
+ 0, /* U+0124ea: */
+ 0, /* U+0124eb: */
+ 0, /* U+0124ec: */
+ 0, /* U+0124ed: */
+ 0, /* U+0124ee: */
+ 0, /* U+0124ef: */
+ 0, /* U+0124f0: */
+ 0, /* U+0124f1: */
+ 0, /* U+0124f2: */
+ 0, /* U+0124f3: */
+ 0, /* U+0124f4: */
+ 0, /* U+0124f5: */
+ 0, /* U+0124f6: */
+ 0, /* U+0124f7: */
+ 0, /* U+0124f8: */
+ 0, /* U+0124f9: */
+ 0, /* U+0124fa: */
+ 0, /* U+0124fb: */
+ 0, /* U+0124fc: */
+ 0, /* U+0124fd: */
+ 0, /* U+0124fe: */
+ 0, /* U+0124ff: */
+ 0, /* U+012500: */
+ 0, /* U+012501: */
+ 0, /* U+012502: */
+ 0, /* U+012503: */
+ 0, /* U+012504: */
+ 0, /* U+012505: */
+ 0, /* U+012506: */
+ 0, /* U+012507: */
+ 0, /* U+012508: */
+ 0, /* U+012509: */
+ 0, /* U+01250a: */
+ 0, /* U+01250b: */
+ 0, /* U+01250c: */
+ 0, /* U+01250d: */
+ 0, /* U+01250e: */
+ 0, /* U+01250f: */
+ 0, /* U+012510: */
+ 0, /* U+012511: */
+ 0, /* U+012512: */
+ 0, /* U+012513: */
+ 0, /* U+012514: */
+ 0, /* U+012515: */
+ 0, /* U+012516: */
+ 0, /* U+012517: */
+ 0, /* U+012518: */
+ 0, /* U+012519: */
+ 0, /* U+01251a: */
+ 0, /* U+01251b: */
+ 0, /* U+01251c: */
+ 0, /* U+01251d: */
+ 0, /* U+01251e: */
+ 0, /* U+01251f: */
+ 0, /* U+012520: */
+ 0, /* U+012521: */
+ 0, /* U+012522: */
+ 0, /* U+012523: */
+ 0, /* U+012524: */
+ 0, /* U+012525: */
+ 0, /* U+012526: */
+ 0, /* U+012527: */
+ 0, /* U+012528: */
+ 0, /* U+012529: */
+ 0, /* U+01252a: */
+ 0, /* U+01252b: */
+ 0, /* U+01252c: */
+ 0, /* U+01252d: */
+ 0, /* U+01252e: */
+ 0, /* U+01252f: */
+ 0, /* U+012530: */
+ 0, /* U+012531: */
+ 0, /* U+012532: */
+ 0, /* U+012533: */
+ 0, /* U+012534: */
+ 0, /* U+012535: */
+ 0, /* U+012536: */
+ 0, /* U+012537: */
+ 0, /* U+012538: */
+ 0, /* U+012539: */
+ 0, /* U+01253a: */
+ 0, /* U+01253b: */
+ 0, /* U+01253c: */
+ 0, /* U+01253d: */
+ 0, /* U+01253e: */
+ 0, /* U+01253f: */
+ 0, /* U+012540: */
+ 0, /* U+012541: */
+ 0, /* U+012542: */
+ 0, /* U+012543: */
+ 0, /* U+012544: */
+ 0, /* U+012545: */
+ 0, /* U+012546: */
+ 0, /* U+012547: */
+ 0, /* U+012548: */
+ 0, /* U+012549: */
+ 0, /* U+01254a: */
+ 0, /* U+01254b: */
+ 0, /* U+01254c: */
+ 0, /* U+01254d: */
+ 0, /* U+01254e: */
+ 0, /* U+01254f: */
+ 0, /* U+012550: */
+ 0, /* U+012551: */
+ 0, /* U+012552: */
+ 0, /* U+012553: */
+ 0, /* U+012554: */
+ 0, /* U+012555: */
+ 0, /* U+012556: */
+ 0, /* U+012557: */
+ 0, /* U+012558: */
+ 0, /* U+012559: */
+ 0, /* U+01255a: */
+ 0, /* U+01255b: */
+ 0, /* U+01255c: */
+ 0, /* U+01255d: */
+ 0, /* U+01255e: */
+ 0, /* U+01255f: */
+ 0, /* U+012560: */
+ 0, /* U+012561: */
+ 0, /* U+012562: */
+ 0, /* U+012563: */
+ 0, /* U+012564: */
+ 0, /* U+012565: */
+ 0, /* U+012566: */
+ 0, /* U+012567: */
+ 0, /* U+012568: */
+ 0, /* U+012569: */
+ 0, /* U+01256a: */
+ 0, /* U+01256b: */
+ 0, /* U+01256c: */
+ 0, /* U+01256d: */
+ 0, /* U+01256e: */
+ 0, /* U+01256f: */
+ 0, /* U+012570: */
+ 0, /* U+012571: */
+ 0, /* U+012572: */
+ 0, /* U+012573: */
+ 0, /* U+012574: */
+ 0, /* U+012575: */
+ 0, /* U+012576: */
+ 0, /* U+012577: */
+ 0, /* U+012578: */
+ 0, /* U+012579: */
+ 0, /* U+01257a: */
+ 0, /* U+01257b: */
+ 0, /* U+01257c: */
+ 0, /* U+01257d: */
+ 0, /* U+01257e: */
+ 0, /* U+01257f: */
+ 0, /* U+012580: */
+ 0, /* U+012581: */
+ 0, /* U+012582: */
+ 0, /* U+012583: */
+ 0, /* U+012584: */
+ 0, /* U+012585: */
+ 0, /* U+012586: */
+ 0, /* U+012587: */
+ 0, /* U+012588: */
+ 0, /* U+012589: */
+ 0, /* U+01258a: */
+ 0, /* U+01258b: */
+ 0, /* U+01258c: */
+ 0, /* U+01258d: */
+ 0, /* U+01258e: */
+ 0, /* U+01258f: */
+ 0, /* U+012590: */
+ 0, /* U+012591: */
+ 0, /* U+012592: */
+ 0, /* U+012593: */
+ 0, /* U+012594: */
+ 0, /* U+012595: */
+ 0, /* U+012596: */
+ 0, /* U+012597: */
+ 0, /* U+012598: */
+ 0, /* U+012599: */
+ 0, /* U+01259a: */
+ 0, /* U+01259b: */
+ 0, /* U+01259c: */
+ 0, /* U+01259d: */
+ 0, /* U+01259e: */
+ 0, /* U+01259f: */
+ 0, /* U+0125a0: */
+ 0, /* U+0125a1: */
+ 0, /* U+0125a2: */
+ 0, /* U+0125a3: */
+ 0, /* U+0125a4: */
+ 0, /* U+0125a5: */
+ 0, /* U+0125a6: */
+ 0, /* U+0125a7: */
+ 0, /* U+0125a8: */
+ 0, /* U+0125a9: */
+ 0, /* U+0125aa: */
+ 0, /* U+0125ab: */
+ 0, /* U+0125ac: */
+ 0, /* U+0125ad: */
+ 0, /* U+0125ae: */
+ 0, /* U+0125af: */
+ 0, /* U+0125b0: */
+ 0, /* U+0125b1: */
+ 0, /* U+0125b2: */
+ 0, /* U+0125b3: */
+ 0, /* U+0125b4: */
+ 0, /* U+0125b5: */
+ 0, /* U+0125b6: */
+ 0, /* U+0125b7: */
+ 0, /* U+0125b8: */
+ 0, /* U+0125b9: */
+ 0, /* U+0125ba: */
+ 0, /* U+0125bb: */
+ 0, /* U+0125bc: */
+ 0, /* U+0125bd: */
+ 0, /* U+0125be: */
+ 0, /* U+0125bf: */
+ 0, /* U+0125c0: */
+ 0, /* U+0125c1: */
+ 0, /* U+0125c2: */
+ 0, /* U+0125c3: */
+ 0, /* U+0125c4: */
+ 0, /* U+0125c5: */
+ 0, /* U+0125c6: */
+ 0, /* U+0125c7: */
+ 0, /* U+0125c8: */
+ 0, /* U+0125c9: */
+ 0, /* U+0125ca: */
+ 0, /* U+0125cb: */
+ 0, /* U+0125cc: */
+ 0, /* U+0125cd: */
+ 0, /* U+0125ce: */
+ 0, /* U+0125cf: */
+ 0, /* U+0125d0: */
+ 0, /* U+0125d1: */
+ 0, /* U+0125d2: */
+ 0, /* U+0125d3: */
+ 0, /* U+0125d4: */
+ 0, /* U+0125d5: */
+ 0, /* U+0125d6: */
+ 0, /* U+0125d7: */
+ 0, /* U+0125d8: */
+ 0, /* U+0125d9: */
+ 0, /* U+0125da: */
+ 0, /* U+0125db: */
+ 0, /* U+0125dc: */
+ 0, /* U+0125dd: */
+ 0, /* U+0125de: */
+ 0, /* U+0125df: */
+ 0, /* U+0125e0: */
+ 0, /* U+0125e1: */
+ 0, /* U+0125e2: */
+ 0, /* U+0125e3: */
+ 0, /* U+0125e4: */
+ 0, /* U+0125e5: */
+ 0, /* U+0125e6: */
+ 0, /* U+0125e7: */
+ 0, /* U+0125e8: */
+ 0, /* U+0125e9: */
+ 0, /* U+0125ea: */
+ 0, /* U+0125eb: */
+ 0, /* U+0125ec: */
+ 0, /* U+0125ed: */
+ 0, /* U+0125ee: */
+ 0, /* U+0125ef: */
+ 0, /* U+0125f0: */
+ 0, /* U+0125f1: */
+ 0, /* U+0125f2: */
+ 0, /* U+0125f3: */
+ 0, /* U+0125f4: */
+ 0, /* U+0125f5: */
+ 0, /* U+0125f6: */
+ 0, /* U+0125f7: */
+ 0, /* U+0125f8: */
+ 0, /* U+0125f9: */
+ 0, /* U+0125fa: */
+ 0, /* U+0125fb: */
+ 0, /* U+0125fc: */
+ 0, /* U+0125fd: */
+ 0, /* U+0125fe: */
+ 0, /* U+0125ff: */
+ 0, /* U+012600: */
+ 0, /* U+012601: */
+ 0, /* U+012602: */
+ 0, /* U+012603: */
+ 0, /* U+012604: */
+ 0, /* U+012605: */
+ 0, /* U+012606: */
+ 0, /* U+012607: */
+ 0, /* U+012608: */
+ 0, /* U+012609: */
+ 0, /* U+01260a: */
+ 0, /* U+01260b: */
+ 0, /* U+01260c: */
+ 0, /* U+01260d: */
+ 0, /* U+01260e: */
+ 0, /* U+01260f: */
+ 0, /* U+012610: */
+ 0, /* U+012611: */
+ 0, /* U+012612: */
+ 0, /* U+012613: */
+ 0, /* U+012614: */
+ 0, /* U+012615: */
+ 0, /* U+012616: */
+ 0, /* U+012617: */
+ 0, /* U+012618: */
+ 0, /* U+012619: */
+ 0, /* U+01261a: */
+ 0, /* U+01261b: */
+ 0, /* U+01261c: */
+ 0, /* U+01261d: */
+ 0, /* U+01261e: */
+ 0, /* U+01261f: */
+ 0, /* U+012620: */
+ 0, /* U+012621: */
+ 0, /* U+012622: */
+ 0, /* U+012623: */
+ 0, /* U+012624: */
+ 0, /* U+012625: */
+ 0, /* U+012626: */
+ 0, /* U+012627: */
+ 0, /* U+012628: */
+ 0, /* U+012629: */
+ 0, /* U+01262a: */
+ 0, /* U+01262b: */
+ 0, /* U+01262c: */
+ 0, /* U+01262d: */
+ 0, /* U+01262e: */
+ 0, /* U+01262f: */
+ 0, /* U+012630: */
+ 0, /* U+012631: */
+ 0, /* U+012632: */
+ 0, /* U+012633: */
+ 0, /* U+012634: */
+ 0, /* U+012635: */
+ 0, /* U+012636: */
+ 0, /* U+012637: */
+ 0, /* U+012638: */
+ 0, /* U+012639: */
+ 0, /* U+01263a: */
+ 0, /* U+01263b: */
+ 0, /* U+01263c: */
+ 0, /* U+01263d: */
+ 0, /* U+01263e: */
+ 0, /* U+01263f: */
+ 0, /* U+012640: */
+ 0, /* U+012641: */
+ 0, /* U+012642: */
+ 0, /* U+012643: */
+ 0, /* U+012644: */
+ 0, /* U+012645: */
+ 0, /* U+012646: */
+ 0, /* U+012647: */
+ 0, /* U+012648: */
+ 0, /* U+012649: */
+ 0, /* U+01264a: */
+ 0, /* U+01264b: */
+ 0, /* U+01264c: */
+ 0, /* U+01264d: */
+ 0, /* U+01264e: */
+ 0, /* U+01264f: */
+ 0, /* U+012650: */
+ 0, /* U+012651: */
+ 0, /* U+012652: */
+ 0, /* U+012653: */
+ 0, /* U+012654: */
+ 0, /* U+012655: */
+ 0, /* U+012656: */
+ 0, /* U+012657: */
+ 0, /* U+012658: */
+ 0, /* U+012659: */
+ 0, /* U+01265a: */
+ 0, /* U+01265b: */
+ 0, /* U+01265c: */
+ 0, /* U+01265d: */
+ 0, /* U+01265e: */
+ 0, /* U+01265f: */
+ 0, /* U+012660: */
+ 0, /* U+012661: */
+ 0, /* U+012662: */
+ 0, /* U+012663: */
+ 0, /* U+012664: */
+ 0, /* U+012665: */
+ 0, /* U+012666: */
+ 0, /* U+012667: */
+ 0, /* U+012668: */
+ 0, /* U+012669: */
+ 0, /* U+01266a: */
+ 0, /* U+01266b: */
+ 0, /* U+01266c: */
+ 0, /* U+01266d: */
+ 0, /* U+01266e: */
+ 0, /* U+01266f: */
+ 0, /* U+012670: */
+ 0, /* U+012671: */
+ 0, /* U+012672: */
+ 0, /* U+012673: */
+ 0, /* U+012674: */
+ 0, /* U+012675: */
+ 0, /* U+012676: */
+ 0, /* U+012677: */
+ 0, /* U+012678: */
+ 0, /* U+012679: */
+ 0, /* U+01267a: */
+ 0, /* U+01267b: */
+ 0, /* U+01267c: */
+ 0, /* U+01267d: */
+ 0, /* U+01267e: */
+ 0, /* U+01267f: */
+ 0, /* U+012680: */
+ 0, /* U+012681: */
+ 0, /* U+012682: */
+ 0, /* U+012683: */
+ 0, /* U+012684: */
+ 0, /* U+012685: */
+ 0, /* U+012686: */
+ 0, /* U+012687: */
+ 0, /* U+012688: */
+ 0, /* U+012689: */
+ 0, /* U+01268a: */
+ 0, /* U+01268b: */
+ 0, /* U+01268c: */
+ 0, /* U+01268d: */
+ 0, /* U+01268e: */
+ 0, /* U+01268f: */
+ 0, /* U+012690: */
+ 0, /* U+012691: */
+ 0, /* U+012692: */
+ 0, /* U+012693: */
+ 0, /* U+012694: */
+ 0, /* U+012695: */
+ 0, /* U+012696: */
+ 0, /* U+012697: */
+ 0, /* U+012698: */
+ 0, /* U+012699: */
+ 0, /* U+01269a: */
+ 0, /* U+01269b: */
+ 0, /* U+01269c: */
+ 0, /* U+01269d: */
+ 0, /* U+01269e: */
+ 0, /* U+01269f: */
+ 0, /* U+0126a0: */
+ 0, /* U+0126a1: */
+ 0, /* U+0126a2: */
+ 0, /* U+0126a3: */
+ 0, /* U+0126a4: */
+ 0, /* U+0126a5: */
+ 0, /* U+0126a6: */
+ 0, /* U+0126a7: */
+ 0, /* U+0126a8: */
+ 0, /* U+0126a9: */
+ 0, /* U+0126aa: */
+ 0, /* U+0126ab: */
+ 0, /* U+0126ac: */
+ 0, /* U+0126ad: */
+ 0, /* U+0126ae: */
+ 0, /* U+0126af: */
+ 0, /* U+0126b0: */
+ 0, /* U+0126b1: */
+ 0, /* U+0126b2: */
+ 0, /* U+0126b3: */
+ 0, /* U+0126b4: */
+ 0, /* U+0126b5: */
+ 0, /* U+0126b6: */
+ 0, /* U+0126b7: */
+ 0, /* U+0126b8: */
+ 0, /* U+0126b9: */
+ 0, /* U+0126ba: */
+ 0, /* U+0126bb: */
+ 0, /* U+0126bc: */
+ 0, /* U+0126bd: */
+ 0, /* U+0126be: */
+ 0, /* U+0126bf: */
+ 0, /* U+0126c0: */
+ 0, /* U+0126c1: */
+ 0, /* U+0126c2: */
+ 0, /* U+0126c3: */
+ 0, /* U+0126c4: */
+ 0, /* U+0126c5: */
+ 0, /* U+0126c6: */
+ 0, /* U+0126c7: */
+ 0, /* U+0126c8: */
+ 0, /* U+0126c9: */
+ 0, /* U+0126ca: */
+ 0, /* U+0126cb: */
+ 0, /* U+0126cc: */
+ 0, /* U+0126cd: */
+ 0, /* U+0126ce: */
+ 0, /* U+0126cf: */
+ 0, /* U+0126d0: */
+ 0, /* U+0126d1: */
+ 0, /* U+0126d2: */
+ 0, /* U+0126d3: */
+ 0, /* U+0126d4: */
+ 0, /* U+0126d5: */
+ 0, /* U+0126d6: */
+ 0, /* U+0126d7: */
+ 0, /* U+0126d8: */
+ 0, /* U+0126d9: */
+ 0, /* U+0126da: */
+ 0, /* U+0126db: */
+ 0, /* U+0126dc: */
+ 0, /* U+0126dd: */
+ 0, /* U+0126de: */
+ 0, /* U+0126df: */
+ 0, /* U+0126e0: */
+ 0, /* U+0126e1: */
+ 0, /* U+0126e2: */
+ 0, /* U+0126e3: */
+ 0, /* U+0126e4: */
+ 0, /* U+0126e5: */
+ 0, /* U+0126e6: */
+ 0, /* U+0126e7: */
+ 0, /* U+0126e8: */
+ 0, /* U+0126e9: */
+ 0, /* U+0126ea: */
+ 0, /* U+0126eb: */
+ 0, /* U+0126ec: */
+ 0, /* U+0126ed: */
+ 0, /* U+0126ee: */
+ 0, /* U+0126ef: */
+ 0, /* U+0126f0: */
+ 0, /* U+0126f1: */
+ 0, /* U+0126f2: */
+ 0, /* U+0126f3: */
+ 0, /* U+0126f4: */
+ 0, /* U+0126f5: */
+ 0, /* U+0126f6: */
+ 0, /* U+0126f7: */
+ 0, /* U+0126f8: */
+ 0, /* U+0126f9: */
+ 0, /* U+0126fa: */
+ 0, /* U+0126fb: */
+ 0, /* U+0126fc: */
+ 0, /* U+0126fd: */
+ 0, /* U+0126fe: */
+ 0, /* U+0126ff: */
+ 0, /* U+012700: */
+ 0, /* U+012701: */
+ 0, /* U+012702: */
+ 0, /* U+012703: */
+ 0, /* U+012704: */
+ 0, /* U+012705: */
+ 0, /* U+012706: */
+ 0, /* U+012707: */
+ 0, /* U+012708: */
+ 0, /* U+012709: */
+ 0, /* U+01270a: */
+ 0, /* U+01270b: */
+ 0, /* U+01270c: */
+ 0, /* U+01270d: */
+ 0, /* U+01270e: */
+ 0, /* U+01270f: */
+ 0, /* U+012710: */
+ 0, /* U+012711: */
+ 0, /* U+012712: */
+ 0, /* U+012713: */
+ 0, /* U+012714: */
+ 0, /* U+012715: */
+ 0, /* U+012716: */
+ 0, /* U+012717: */
+ 0, /* U+012718: */
+ 0, /* U+012719: */
+ 0, /* U+01271a: */
+ 0, /* U+01271b: */
+ 0, /* U+01271c: */
+ 0, /* U+01271d: */
+ 0, /* U+01271e: */
+ 0, /* U+01271f: */
+ 0, /* U+012720: */
+ 0, /* U+012721: */
+ 0, /* U+012722: */
+ 0, /* U+012723: */
+ 0, /* U+012724: */
+ 0, /* U+012725: */
+ 0, /* U+012726: */
+ 0, /* U+012727: */
+ 0, /* U+012728: */
+ 0, /* U+012729: */
+ 0, /* U+01272a: */
+ 0, /* U+01272b: */
+ 0, /* U+01272c: */
+ 0, /* U+01272d: */
+ 0, /* U+01272e: */
+ 0, /* U+01272f: */
+ 0, /* U+012730: */
+ 0, /* U+012731: */
+ 0, /* U+012732: */
+ 0, /* U+012733: */
+ 0, /* U+012734: */
+ 0, /* U+012735: */
+ 0, /* U+012736: */
+ 0, /* U+012737: */
+ 0, /* U+012738: */
+ 0, /* U+012739: */
+ 0, /* U+01273a: */
+ 0, /* U+01273b: */
+ 0, /* U+01273c: */
+ 0, /* U+01273d: */
+ 0, /* U+01273e: */
+ 0, /* U+01273f: */
+ 0, /* U+012740: */
+ 0, /* U+012741: */
+ 0, /* U+012742: */
+ 0, /* U+012743: */
+ 0, /* U+012744: */
+ 0, /* U+012745: */
+ 0, /* U+012746: */
+ 0, /* U+012747: */
+ 0, /* U+012748: */
+ 0, /* U+012749: */
+ 0, /* U+01274a: */
+ 0, /* U+01274b: */
+ 0, /* U+01274c: */
+ 0, /* U+01274d: */
+ 0, /* U+01274e: */
+ 0, /* U+01274f: */
+ 0, /* U+012750: */
+ 0, /* U+012751: */
+ 0, /* U+012752: */
+ 0, /* U+012753: */
+ 0, /* U+012754: */
+ 0, /* U+012755: */
+ 0, /* U+012756: */
+ 0, /* U+012757: */
+ 0, /* U+012758: */
+ 0, /* U+012759: */
+ 0, /* U+01275a: */
+ 0, /* U+01275b: */
+ 0, /* U+01275c: */
+ 0, /* U+01275d: */
+ 0, /* U+01275e: */
+ 0, /* U+01275f: */
+ 0, /* U+012760: */
+ 0, /* U+012761: */
+ 0, /* U+012762: */
+ 0, /* U+012763: */
+ 0, /* U+012764: */
+ 0, /* U+012765: */
+ 0, /* U+012766: */
+ 0, /* U+012767: */
+ 0, /* U+012768: */
+ 0, /* U+012769: */
+ 0, /* U+01276a: */
+ 0, /* U+01276b: */
+ 0, /* U+01276c: */
+ 0, /* U+01276d: */
+ 0, /* U+01276e: */
+ 0, /* U+01276f: */
+ 0, /* U+012770: */
+ 0, /* U+012771: */
+ 0, /* U+012772: */
+ 0, /* U+012773: */
+ 0, /* U+012774: */
+ 0, /* U+012775: */
+ 0, /* U+012776: */
+ 0, /* U+012777: */
+ 0, /* U+012778: */
+ 0, /* U+012779: */
+ 0, /* U+01277a: */
+ 0, /* U+01277b: */
+ 0, /* U+01277c: */
+ 0, /* U+01277d: */
+ 0, /* U+01277e: */
+ 0, /* U+01277f: */
+ 0, /* U+012780: */
+ 0, /* U+012781: */
+ 0, /* U+012782: */
+ 0, /* U+012783: */
+ 0, /* U+012784: */
+ 0, /* U+012785: */
+ 0, /* U+012786: */
+ 0, /* U+012787: */
+ 0, /* U+012788: */
+ 0, /* U+012789: */
+ 0, /* U+01278a: */
+ 0, /* U+01278b: */
+ 0, /* U+01278c: */
+ 0, /* U+01278d: */
+ 0, /* U+01278e: */
+ 0, /* U+01278f: */
+ 0, /* U+012790: */
+ 0, /* U+012791: */
+ 0, /* U+012792: */
+ 0, /* U+012793: */
+ 0, /* U+012794: */
+ 0, /* U+012795: */
+ 0, /* U+012796: */
+ 0, /* U+012797: */
+ 0, /* U+012798: */
+ 0, /* U+012799: */
+ 0, /* U+01279a: */
+ 0, /* U+01279b: */
+ 0, /* U+01279c: */
+ 0, /* U+01279d: */
+ 0, /* U+01279e: */
+ 0, /* U+01279f: */
+ 0, /* U+0127a0: */
+ 0, /* U+0127a1: */
+ 0, /* U+0127a2: */
+ 0, /* U+0127a3: */
+ 0, /* U+0127a4: */
+ 0, /* U+0127a5: */
+ 0, /* U+0127a6: */
+ 0, /* U+0127a7: */
+ 0, /* U+0127a8: */
+ 0, /* U+0127a9: */
+ 0, /* U+0127aa: */
+ 0, /* U+0127ab: */
+ 0, /* U+0127ac: */
+ 0, /* U+0127ad: */
+ 0, /* U+0127ae: */
+ 0, /* U+0127af: */
+ 0, /* U+0127b0: */
+ 0, /* U+0127b1: */
+ 0, /* U+0127b2: */
+ 0, /* U+0127b3: */
+ 0, /* U+0127b4: */
+ 0, /* U+0127b5: */
+ 0, /* U+0127b6: */
+ 0, /* U+0127b7: */
+ 0, /* U+0127b8: */
+ 0, /* U+0127b9: */
+ 0, /* U+0127ba: */
+ 0, /* U+0127bb: */
+ 0, /* U+0127bc: */
+ 0, /* U+0127bd: */
+ 0, /* U+0127be: */
+ 0, /* U+0127bf: */
+ 0, /* U+0127c0: */
+ 0, /* U+0127c1: */
+ 0, /* U+0127c2: */
+ 0, /* U+0127c3: */
+ 0, /* U+0127c4: */
+ 0, /* U+0127c5: */
+ 0, /* U+0127c6: */
+ 0, /* U+0127c7: */
+ 0, /* U+0127c8: */
+ 0, /* U+0127c9: */
+ 0, /* U+0127ca: */
+ 0, /* U+0127cb: */
+ 0, /* U+0127cc: */
+ 0, /* U+0127cd: */
+ 0, /* U+0127ce: */
+ 0, /* U+0127cf: */
+ 0, /* U+0127d0: */
+ 0, /* U+0127d1: */
+ 0, /* U+0127d2: */
+ 0, /* U+0127d3: */
+ 0, /* U+0127d4: */
+ 0, /* U+0127d5: */
+ 0, /* U+0127d6: */
+ 0, /* U+0127d7: */
+ 0, /* U+0127d8: */
+ 0, /* U+0127d9: */
+ 0, /* U+0127da: */
+ 0, /* U+0127db: */
+ 0, /* U+0127dc: */
+ 0, /* U+0127dd: */
+ 0, /* U+0127de: */
+ 0, /* U+0127df: */
+ 0, /* U+0127e0: */
+ 0, /* U+0127e1: */
+ 0, /* U+0127e2: */
+ 0, /* U+0127e3: */
+ 0, /* U+0127e4: */
+ 0, /* U+0127e5: */
+ 0, /* U+0127e6: */
+ 0, /* U+0127e7: */
+ 0, /* U+0127e8: */
+ 0, /* U+0127e9: */
+ 0, /* U+0127ea: */
+ 0, /* U+0127eb: */
+ 0, /* U+0127ec: */
+ 0, /* U+0127ed: */
+ 0, /* U+0127ee: */
+ 0, /* U+0127ef: */
+ 0, /* U+0127f0: */
+ 0, /* U+0127f1: */
+ 0, /* U+0127f2: */
+ 0, /* U+0127f3: */
+ 0, /* U+0127f4: */
+ 0, /* U+0127f5: */
+ 0, /* U+0127f6: */
+ 0, /* U+0127f7: */
+ 0, /* U+0127f8: */
+ 0, /* U+0127f9: */
+ 0, /* U+0127fa: */
+ 0, /* U+0127fb: */
+ 0, /* U+0127fc: */
+ 0, /* U+0127fd: */
+ 0, /* U+0127fe: */
+ 0, /* U+0127ff: */
+ 0, /* U+012800: */
+ 0, /* U+012801: */
+ 0, /* U+012802: */
+ 0, /* U+012803: */
+ 0, /* U+012804: */
+ 0, /* U+012805: */
+ 0, /* U+012806: */
+ 0, /* U+012807: */
+ 0, /* U+012808: */
+ 0, /* U+012809: */
+ 0, /* U+01280a: */
+ 0, /* U+01280b: */
+ 0, /* U+01280c: */
+ 0, /* U+01280d: */
+ 0, /* U+01280e: */
+ 0, /* U+01280f: */
+ 0, /* U+012810: */
+ 0, /* U+012811: */
+ 0, /* U+012812: */
+ 0, /* U+012813: */
+ 0, /* U+012814: */
+ 0, /* U+012815: */
+ 0, /* U+012816: */
+ 0, /* U+012817: */
+ 0, /* U+012818: */
+ 0, /* U+012819: */
+ 0, /* U+01281a: */
+ 0, /* U+01281b: */
+ 0, /* U+01281c: */
+ 0, /* U+01281d: */
+ 0, /* U+01281e: */
+ 0, /* U+01281f: */
+ 0, /* U+012820: */
+ 0, /* U+012821: */
+ 0, /* U+012822: */
+ 0, /* U+012823: */
+ 0, /* U+012824: */
+ 0, /* U+012825: */
+ 0, /* U+012826: */
+ 0, /* U+012827: */
+ 0, /* U+012828: */
+ 0, /* U+012829: */
+ 0, /* U+01282a: */
+ 0, /* U+01282b: */
+ 0, /* U+01282c: */
+ 0, /* U+01282d: */
+ 0, /* U+01282e: */
+ 0, /* U+01282f: */
+ 0, /* U+012830: */
+ 0, /* U+012831: */
+ 0, /* U+012832: */
+ 0, /* U+012833: */
+ 0, /* U+012834: */
+ 0, /* U+012835: */
+ 0, /* U+012836: */
+ 0, /* U+012837: */
+ 0, /* U+012838: */
+ 0, /* U+012839: */
+ 0, /* U+01283a: */
+ 0, /* U+01283b: */
+ 0, /* U+01283c: */
+ 0, /* U+01283d: */
+ 0, /* U+01283e: */
+ 0, /* U+01283f: */
+ 0, /* U+012840: */
+ 0, /* U+012841: */
+ 0, /* U+012842: */
+ 0, /* U+012843: */
+ 0, /* U+012844: */
+ 0, /* U+012845: */
+ 0, /* U+012846: */
+ 0, /* U+012847: */
+ 0, /* U+012848: */
+ 0, /* U+012849: */
+ 0, /* U+01284a: */
+ 0, /* U+01284b: */
+ 0, /* U+01284c: */
+ 0, /* U+01284d: */
+ 0, /* U+01284e: */
+ 0, /* U+01284f: */
+ 0, /* U+012850: */
+ 0, /* U+012851: */
+ 0, /* U+012852: */
+ 0, /* U+012853: */
+ 0, /* U+012854: */
+ 0, /* U+012855: */
+ 0, /* U+012856: */
+ 0, /* U+012857: */
+ 0, /* U+012858: */
+ 0, /* U+012859: */
+ 0, /* U+01285a: */
+ 0, /* U+01285b: */
+ 0, /* U+01285c: */
+ 0, /* U+01285d: */
+ 0, /* U+01285e: */
+ 0, /* U+01285f: */
+ 0, /* U+012860: */
+ 0, /* U+012861: */
+ 0, /* U+012862: */
+ 0, /* U+012863: */
+ 0, /* U+012864: */
+ 0, /* U+012865: */
+ 0, /* U+012866: */
+ 0, /* U+012867: */
+ 0, /* U+012868: */
+ 0, /* U+012869: */
+ 0, /* U+01286a: */
+ 0, /* U+01286b: */
+ 0, /* U+01286c: */
+ 0, /* U+01286d: */
+ 0, /* U+01286e: */
+ 0, /* U+01286f: */
+ 0, /* U+012870: */
+ 0, /* U+012871: */
+ 0, /* U+012872: */
+ 0, /* U+012873: */
+ 0, /* U+012874: */
+ 0, /* U+012875: */
+ 0, /* U+012876: */
+ 0, /* U+012877: */
+ 0, /* U+012878: */
+ 0, /* U+012879: */
+ 0, /* U+01287a: */
+ 0, /* U+01287b: */
+ 0, /* U+01287c: */
+ 0, /* U+01287d: */
+ 0, /* U+01287e: */
+ 0, /* U+01287f: */
+ 0, /* U+012880: */
+ 0, /* U+012881: */
+ 0, /* U+012882: */
+ 0, /* U+012883: */
+ 0, /* U+012884: */
+ 0, /* U+012885: */
+ 0, /* U+012886: */
+ 0, /* U+012887: */
+ 0, /* U+012888: */
+ 0, /* U+012889: */
+ 0, /* U+01288a: */
+ 0, /* U+01288b: */
+ 0, /* U+01288c: */
+ 0, /* U+01288d: */
+ 0, /* U+01288e: */
+ 0, /* U+01288f: */
+ 0, /* U+012890: */
+ 0, /* U+012891: */
+ 0, /* U+012892: */
+ 0, /* U+012893: */
+ 0, /* U+012894: */
+ 0, /* U+012895: */
+ 0, /* U+012896: */
+ 0, /* U+012897: */
+ 0, /* U+012898: */
+ 0, /* U+012899: */
+ 0, /* U+01289a: */
+ 0, /* U+01289b: */
+ 0, /* U+01289c: */
+ 0, /* U+01289d: */
+ 0, /* U+01289e: */
+ 0, /* U+01289f: */
+ 0, /* U+0128a0: */
+ 0, /* U+0128a1: */
+ 0, /* U+0128a2: */
+ 0, /* U+0128a3: */
+ 0, /* U+0128a4: */
+ 0, /* U+0128a5: */
+ 0, /* U+0128a6: */
+ 0, /* U+0128a7: */
+ 0, /* U+0128a8: */
+ 0, /* U+0128a9: */
+ 0, /* U+0128aa: */
+ 0, /* U+0128ab: */
+ 0, /* U+0128ac: */
+ 0, /* U+0128ad: */
+ 0, /* U+0128ae: */
+ 0, /* U+0128af: */
+ 0, /* U+0128b0: */
+ 0, /* U+0128b1: */
+ 0, /* U+0128b2: */
+ 0, /* U+0128b3: */
+ 0, /* U+0128b4: */
+ 0, /* U+0128b5: */
+ 0, /* U+0128b6: */
+ 0, /* U+0128b7: */
+ 0, /* U+0128b8: */
+ 0, /* U+0128b9: */
+ 0, /* U+0128ba: */
+ 0, /* U+0128bb: */
+ 0, /* U+0128bc: */
+ 0, /* U+0128bd: */
+ 0, /* U+0128be: */
+ 0, /* U+0128bf: */
+ 0, /* U+0128c0: */
+ 0, /* U+0128c1: */
+ 0, /* U+0128c2: */
+ 0, /* U+0128c3: */
+ 0, /* U+0128c4: */
+ 0, /* U+0128c5: */
+ 0, /* U+0128c6: */
+ 0, /* U+0128c7: */
+ 0, /* U+0128c8: */
+ 0, /* U+0128c9: */
+ 0, /* U+0128ca: */
+ 0, /* U+0128cb: */
+ 0, /* U+0128cc: */
+ 0, /* U+0128cd: */
+ 0, /* U+0128ce: */
+ 0, /* U+0128cf: */
+ 0, /* U+0128d0: */
+ 0, /* U+0128d1: */
+ 0, /* U+0128d2: */
+ 0, /* U+0128d3: */
+ 0, /* U+0128d4: */
+ 0, /* U+0128d5: */
+ 0, /* U+0128d6: */
+ 0, /* U+0128d7: */
+ 0, /* U+0128d8: */
+ 0, /* U+0128d9: */
+ 0, /* U+0128da: */
+ 0, /* U+0128db: */
+ 0, /* U+0128dc: */
+ 0, /* U+0128dd: */
+ 0, /* U+0128de: */
+ 0, /* U+0128df: */
+ 0, /* U+0128e0: */
+ 0, /* U+0128e1: */
+ 0, /* U+0128e2: */
+ 0, /* U+0128e3: */
+ 0, /* U+0128e4: */
+ 0, /* U+0128e5: */
+ 0, /* U+0128e6: */
+ 0, /* U+0128e7: */
+ 0, /* U+0128e8: */
+ 0, /* U+0128e9: */
+ 0, /* U+0128ea: */
+ 0, /* U+0128eb: */
+ 0, /* U+0128ec: */
+ 0, /* U+0128ed: */
+ 0, /* U+0128ee: */
+ 0, /* U+0128ef: */
+ 0, /* U+0128f0: */
+ 0, /* U+0128f1: */
+ 0, /* U+0128f2: */
+ 0, /* U+0128f3: */
+ 0, /* U+0128f4: */
+ 0, /* U+0128f5: */
+ 0, /* U+0128f6: */
+ 0, /* U+0128f7: */
+ 0, /* U+0128f8: */
+ 0, /* U+0128f9: */
+ 0, /* U+0128fa: */
+ 0, /* U+0128fb: */
+ 0, /* U+0128fc: */
+ 0, /* U+0128fd: */
+ 0, /* U+0128fe: */
+ 0, /* U+0128ff: */
+ 0, /* U+012900: */
+ 0, /* U+012901: */
+ 0, /* U+012902: */
+ 0, /* U+012903: */
+ 0, /* U+012904: */
+ 0, /* U+012905: */
+ 0, /* U+012906: */
+ 0, /* U+012907: */
+ 0, /* U+012908: */
+ 0, /* U+012909: */
+ 0, /* U+01290a: */
+ 0, /* U+01290b: */
+ 0, /* U+01290c: */
+ 0, /* U+01290d: */
+ 0, /* U+01290e: */
+ 0, /* U+01290f: */
+ 0, /* U+012910: */
+ 0, /* U+012911: */
+ 0, /* U+012912: */
+ 0, /* U+012913: */
+ 0, /* U+012914: */
+ 0, /* U+012915: */
+ 0, /* U+012916: */
+ 0, /* U+012917: */
+ 0, /* U+012918: */
+ 0, /* U+012919: */
+ 0, /* U+01291a: */
+ 0, /* U+01291b: */
+ 0, /* U+01291c: */
+ 0, /* U+01291d: */
+ 0, /* U+01291e: */
+ 0, /* U+01291f: */
+ 0, /* U+012920: */
+ 0, /* U+012921: */
+ 0, /* U+012922: */
+ 0, /* U+012923: */
+ 0, /* U+012924: */
+ 0, /* U+012925: */
+ 0, /* U+012926: */
+ 0, /* U+012927: */
+ 0, /* U+012928: */
+ 0, /* U+012929: */
+ 0, /* U+01292a: */
+ 0, /* U+01292b: */
+ 0, /* U+01292c: */
+ 0, /* U+01292d: */
+ 0, /* U+01292e: */
+ 0, /* U+01292f: */
+ 0, /* U+012930: */
+ 0, /* U+012931: */
+ 0, /* U+012932: */
+ 0, /* U+012933: */
+ 0, /* U+012934: */
+ 0, /* U+012935: */
+ 0, /* U+012936: */
+ 0, /* U+012937: */
+ 0, /* U+012938: */
+ 0, /* U+012939: */
+ 0, /* U+01293a: */
+ 0, /* U+01293b: */
+ 0, /* U+01293c: */
+ 0, /* U+01293d: */
+ 0, /* U+01293e: */
+ 0, /* U+01293f: */
+ 0, /* U+012940: */
+ 0, /* U+012941: */
+ 0, /* U+012942: */
+ 0, /* U+012943: */
+ 0, /* U+012944: */
+ 0, /* U+012945: */
+ 0, /* U+012946: */
+ 0, /* U+012947: */
+ 0, /* U+012948: */
+ 0, /* U+012949: */
+ 0, /* U+01294a: */
+ 0, /* U+01294b: */
+ 0, /* U+01294c: */
+ 0, /* U+01294d: */
+ 0, /* U+01294e: */
+ 0, /* U+01294f: */
+ 0, /* U+012950: */
+ 0, /* U+012951: */
+ 0, /* U+012952: */
+ 0, /* U+012953: */
+ 0, /* U+012954: */
+ 0, /* U+012955: */
+ 0, /* U+012956: */
+ 0, /* U+012957: */
+ 0, /* U+012958: */
+ 0, /* U+012959: */
+ 0, /* U+01295a: */
+ 0, /* U+01295b: */
+ 0, /* U+01295c: */
+ 0, /* U+01295d: */
+ 0, /* U+01295e: */
+ 0, /* U+01295f: */
+ 0, /* U+012960: */
+ 0, /* U+012961: */
+ 0, /* U+012962: */
+ 0, /* U+012963: */
+ 0, /* U+012964: */
+ 0, /* U+012965: */
+ 0, /* U+012966: */
+ 0, /* U+012967: */
+ 0, /* U+012968: */
+ 0, /* U+012969: */
+ 0, /* U+01296a: */
+ 0, /* U+01296b: */
+ 0, /* U+01296c: */
+ 0, /* U+01296d: */
+ 0, /* U+01296e: */
+ 0, /* U+01296f: */
+ 0, /* U+012970: */
+ 0, /* U+012971: */
+ 0, /* U+012972: */
+ 0, /* U+012973: */
+ 0, /* U+012974: */
+ 0, /* U+012975: */
+ 0, /* U+012976: */
+ 0, /* U+012977: */
+ 0, /* U+012978: */
+ 0, /* U+012979: */
+ 0, /* U+01297a: */
+ 0, /* U+01297b: */
+ 0, /* U+01297c: */
+ 0, /* U+01297d: */
+ 0, /* U+01297e: */
+ 0, /* U+01297f: */
+ 0, /* U+012980: */
+ 0, /* U+012981: */
+ 0, /* U+012982: */
+ 0, /* U+012983: */
+ 0, /* U+012984: */
+ 0, /* U+012985: */
+ 0, /* U+012986: */
+ 0, /* U+012987: */
+ 0, /* U+012988: */
+ 0, /* U+012989: */
+ 0, /* U+01298a: */
+ 0, /* U+01298b: */
+ 0, /* U+01298c: */
+ 0, /* U+01298d: */
+ 0, /* U+01298e: */
+ 0, /* U+01298f: */
+ 0, /* U+012990: */
+ 0, /* U+012991: */
+ 0, /* U+012992: */
+ 0, /* U+012993: */
+ 0, /* U+012994: */
+ 0, /* U+012995: */
+ 0, /* U+012996: */
+ 0, /* U+012997: */
+ 0, /* U+012998: */
+ 0, /* U+012999: */
+ 0, /* U+01299a: */
+ 0, /* U+01299b: */
+ 0, /* U+01299c: */
+ 0, /* U+01299d: */
+ 0, /* U+01299e: */
+ 0, /* U+01299f: */
+ 0, /* U+0129a0: */
+ 0, /* U+0129a1: */
+ 0, /* U+0129a2: */
+ 0, /* U+0129a3: */
+ 0, /* U+0129a4: */
+ 0, /* U+0129a5: */
+ 0, /* U+0129a6: */
+ 0, /* U+0129a7: */
+ 0, /* U+0129a8: */
+ 0, /* U+0129a9: */
+ 0, /* U+0129aa: */
+ 0, /* U+0129ab: */
+ 0, /* U+0129ac: */
+ 0, /* U+0129ad: */
+ 0, /* U+0129ae: */
+ 0, /* U+0129af: */
+ 0, /* U+0129b0: */
+ 0, /* U+0129b1: */
+ 0, /* U+0129b2: */
+ 0, /* U+0129b3: */
+ 0, /* U+0129b4: */
+ 0, /* U+0129b5: */
+ 0, /* U+0129b6: */
+ 0, /* U+0129b7: */
+ 0, /* U+0129b8: */
+ 0, /* U+0129b9: */
+ 0, /* U+0129ba: */
+ 0, /* U+0129bb: */
+ 0, /* U+0129bc: */
+ 0, /* U+0129bd: */
+ 0, /* U+0129be: */
+ 0, /* U+0129bf: */
+ 0, /* U+0129c0: */
+ 0, /* U+0129c1: */
+ 0, /* U+0129c2: */
+ 0, /* U+0129c3: */
+ 0, /* U+0129c4: */
+ 0, /* U+0129c5: */
+ 0, /* U+0129c6: */
+ 0, /* U+0129c7: */
+ 0, /* U+0129c8: */
+ 0, /* U+0129c9: */
+ 0, /* U+0129ca: */
+ 0, /* U+0129cb: */
+ 0, /* U+0129cc: */
+ 0, /* U+0129cd: */
+ 0, /* U+0129ce: */
+ 0, /* U+0129cf: */
+ 0, /* U+0129d0: */
+ 0, /* U+0129d1: */
+ 0, /* U+0129d2: */
+ 0, /* U+0129d3: */
+ 0, /* U+0129d4: */
+ 0, /* U+0129d5: */
+ 0, /* U+0129d6: */
+ 0, /* U+0129d7: */
+ 0, /* U+0129d8: */
+ 0, /* U+0129d9: */
+ 0, /* U+0129da: */
+ 0, /* U+0129db: */
+ 0, /* U+0129dc: */
+ 0, /* U+0129dd: */
+ 0, /* U+0129de: */
+ 0, /* U+0129df: */
+ 0, /* U+0129e0: */
+ 0, /* U+0129e1: */
+ 0, /* U+0129e2: */
+ 0, /* U+0129e3: */
+ 0, /* U+0129e4: */
+ 0, /* U+0129e5: */
+ 0, /* U+0129e6: */
+ 0, /* U+0129e7: */
+ 0, /* U+0129e8: */
+ 0, /* U+0129e9: */
+ 0, /* U+0129ea: */
+ 0, /* U+0129eb: */
+ 0, /* U+0129ec: */
+ 0, /* U+0129ed: */
+ 0, /* U+0129ee: */
+ 0, /* U+0129ef: */
+ 0, /* U+0129f0: */
+ 0, /* U+0129f1: */
+ 0, /* U+0129f2: */
+ 0, /* U+0129f3: */
+ 0, /* U+0129f4: */
+ 0, /* U+0129f5: */
+ 0, /* U+0129f6: */
+ 0, /* U+0129f7: */
+ 0, /* U+0129f8: */
+ 0, /* U+0129f9: */
+ 0, /* U+0129fa: */
+ 0, /* U+0129fb: */
+ 0, /* U+0129fc: */
+ 0, /* U+0129fd: */
+ 0, /* U+0129fe: */
+ 0, /* U+0129ff: */
+ 0, /* U+012a00: */
+ 0, /* U+012a01: */
+ 0, /* U+012a02: */
+ 0, /* U+012a03: */
+ 0, /* U+012a04: */
+ 0, /* U+012a05: */
+ 0, /* U+012a06: */
+ 0, /* U+012a07: */
+ 0, /* U+012a08: */
+ 0, /* U+012a09: */
+ 0, /* U+012a0a: */
+ 0, /* U+012a0b: */
+ 0, /* U+012a0c: */
+ 0, /* U+012a0d: */
+ 0, /* U+012a0e: */
+ 0, /* U+012a0f: */
+ 0, /* U+012a10: */
+ 0, /* U+012a11: */
+ 0, /* U+012a12: */
+ 0, /* U+012a13: */
+ 0, /* U+012a14: */
+ 0, /* U+012a15: */
+ 0, /* U+012a16: */
+ 0, /* U+012a17: */
+ 0, /* U+012a18: */
+ 0, /* U+012a19: */
+ 0, /* U+012a1a: */
+ 0, /* U+012a1b: */
+ 0, /* U+012a1c: */
+ 0, /* U+012a1d: */
+ 0, /* U+012a1e: */
+ 0, /* U+012a1f: */
+ 0, /* U+012a20: */
+ 0, /* U+012a21: */
+ 0, /* U+012a22: */
+ 0, /* U+012a23: */
+ 0, /* U+012a24: */
+ 0, /* U+012a25: */
+ 0, /* U+012a26: */
+ 0, /* U+012a27: */
+ 0, /* U+012a28: */
+ 0, /* U+012a29: */
+ 0, /* U+012a2a: */
+ 0, /* U+012a2b: */
+ 0, /* U+012a2c: */
+ 0, /* U+012a2d: */
+ 0, /* U+012a2e: */
+ 0, /* U+012a2f: */
+ 0, /* U+012a30: */
+ 0, /* U+012a31: */
+ 0, /* U+012a32: */
+ 0, /* U+012a33: */
+ 0, /* U+012a34: */
+ 0, /* U+012a35: */
+ 0, /* U+012a36: */
+ 0, /* U+012a37: */
+ 0, /* U+012a38: */
+ 0, /* U+012a39: */
+ 0, /* U+012a3a: */
+ 0, /* U+012a3b: */
+ 0, /* U+012a3c: */
+ 0, /* U+012a3d: */
+ 0, /* U+012a3e: */
+ 0, /* U+012a3f: */
+ 0, /* U+012a40: */
+ 0, /* U+012a41: */
+ 0, /* U+012a42: */
+ 0, /* U+012a43: */
+ 0, /* U+012a44: */
+ 0, /* U+012a45: */
+ 0, /* U+012a46: */
+ 0, /* U+012a47: */
+ 0, /* U+012a48: */
+ 0, /* U+012a49: */
+ 0, /* U+012a4a: */
+ 0, /* U+012a4b: */
+ 0, /* U+012a4c: */
+ 0, /* U+012a4d: */
+ 0, /* U+012a4e: */
+ 0, /* U+012a4f: */
+ 0, /* U+012a50: */
+ 0, /* U+012a51: */
+ 0, /* U+012a52: */
+ 0, /* U+012a53: */
+ 0, /* U+012a54: */
+ 0, /* U+012a55: */
+ 0, /* U+012a56: */
+ 0, /* U+012a57: */
+ 0, /* U+012a58: */
+ 0, /* U+012a59: */
+ 0, /* U+012a5a: */
+ 0, /* U+012a5b: */
+ 0, /* U+012a5c: */
+ 0, /* U+012a5d: */
+ 0, /* U+012a5e: */
+ 0, /* U+012a5f: */
+ 0, /* U+012a60: */
+ 0, /* U+012a61: */
+ 0, /* U+012a62: */
+ 0, /* U+012a63: */
+ 0, /* U+012a64: */
+ 0, /* U+012a65: */
+ 0, /* U+012a66: */
+ 0, /* U+012a67: */
+ 0, /* U+012a68: */
+ 0, /* U+012a69: */
+ 0, /* U+012a6a: */
+ 0, /* U+012a6b: */
+ 0, /* U+012a6c: */
+ 0, /* U+012a6d: */
+ 0, /* U+012a6e: */
+ 0, /* U+012a6f: */
+ 0, /* U+012a70: */
+ 0, /* U+012a71: */
+ 0, /* U+012a72: */
+ 0, /* U+012a73: */
+ 0, /* U+012a74: */
+ 0, /* U+012a75: */
+ 0, /* U+012a76: */
+ 0, /* U+012a77: */
+ 0, /* U+012a78: */
+ 0, /* U+012a79: */
+ 0, /* U+012a7a: */
+ 0, /* U+012a7b: */
+ 0, /* U+012a7c: */
+ 0, /* U+012a7d: */
+ 0, /* U+012a7e: */
+ 0, /* U+012a7f: */
+ 0, /* U+012a80: */
+ 0, /* U+012a81: */
+ 0, /* U+012a82: */
+ 0, /* U+012a83: */
+ 0, /* U+012a84: */
+ 0, /* U+012a85: */
+ 0, /* U+012a86: */
+ 0, /* U+012a87: */
+ 0, /* U+012a88: */
+ 0, /* U+012a89: */
+ 0, /* U+012a8a: */
+ 0, /* U+012a8b: */
+ 0, /* U+012a8c: */
+ 0, /* U+012a8d: */
+ 0, /* U+012a8e: */
+ 0, /* U+012a8f: */
+ 0, /* U+012a90: */
+ 0, /* U+012a91: */
+ 0, /* U+012a92: */
+ 0, /* U+012a93: */
+ 0, /* U+012a94: */
+ 0, /* U+012a95: */
+ 0, /* U+012a96: */
+ 0, /* U+012a97: */
+ 0, /* U+012a98: */
+ 0, /* U+012a99: */
+ 0, /* U+012a9a: */
+ 0, /* U+012a9b: */
+ 0, /* U+012a9c: */
+ 0, /* U+012a9d: */
+ 0, /* U+012a9e: */
+ 0, /* U+012a9f: */
+ 0, /* U+012aa0: */
+ 0, /* U+012aa1: */
+ 0, /* U+012aa2: */
+ 0, /* U+012aa3: */
+ 0, /* U+012aa4: */
+ 0, /* U+012aa5: */
+ 0, /* U+012aa6: */
+ 0, /* U+012aa7: */
+ 0, /* U+012aa8: */
+ 0, /* U+012aa9: */
+ 0, /* U+012aaa: */
+ 0, /* U+012aab: */
+ 0, /* U+012aac: */
+ 0, /* U+012aad: */
+ 0, /* U+012aae: */
+ 0, /* U+012aaf: */
+ 0, /* U+012ab0: */
+ 0, /* U+012ab1: */
+ 0, /* U+012ab2: */
+ 0, /* U+012ab3: */
+ 0, /* U+012ab4: */
+ 0, /* U+012ab5: */
+ 0, /* U+012ab6: */
+ 0, /* U+012ab7: */
+ 0, /* U+012ab8: */
+ 0, /* U+012ab9: */
+ 0, /* U+012aba: */
+ 0, /* U+012abb: */
+ 0, /* U+012abc: */
+ 0, /* U+012abd: */
+ 0, /* U+012abe: */
+ 0, /* U+012abf: */
+ 0, /* U+012ac0: */
+ 0, /* U+012ac1: */
+ 0, /* U+012ac2: */
+ 0, /* U+012ac3: */
+ 0, /* U+012ac4: */
+ 0, /* U+012ac5: */
+ 0, /* U+012ac6: */
+ 0, /* U+012ac7: */
+ 0, /* U+012ac8: */
+ 0, /* U+012ac9: */
+ 0, /* U+012aca: */
+ 0, /* U+012acb: */
+ 0, /* U+012acc: */
+ 0, /* U+012acd: */
+ 0, /* U+012ace: */
+ 0, /* U+012acf: */
+ 0, /* U+012ad0: */
+ 0, /* U+012ad1: */
+ 0, /* U+012ad2: */
+ 0, /* U+012ad3: */
+ 0, /* U+012ad4: */
+ 0, /* U+012ad5: */
+ 0, /* U+012ad6: */
+ 0, /* U+012ad7: */
+ 0, /* U+012ad8: */
+ 0, /* U+012ad9: */
+ 0, /* U+012ada: */
+ 0, /* U+012adb: */
+ 0, /* U+012adc: */
+ 0, /* U+012add: */
+ 0, /* U+012ade: */
+ 0, /* U+012adf: */
+ 0, /* U+012ae0: */
+ 0, /* U+012ae1: */
+ 0, /* U+012ae2: */
+ 0, /* U+012ae3: */
+ 0, /* U+012ae4: */
+ 0, /* U+012ae5: */
+ 0, /* U+012ae6: */
+ 0, /* U+012ae7: */
+ 0, /* U+012ae8: */
+ 0, /* U+012ae9: */
+ 0, /* U+012aea: */
+ 0, /* U+012aeb: */
+ 0, /* U+012aec: */
+ 0, /* U+012aed: */
+ 0, /* U+012aee: */
+ 0, /* U+012aef: */
+ 0, /* U+012af0: */
+ 0, /* U+012af1: */
+ 0, /* U+012af2: */
+ 0, /* U+012af3: */
+ 0, /* U+012af4: */
+ 0, /* U+012af5: */
+ 0, /* U+012af6: */
+ 0, /* U+012af7: */
+ 0, /* U+012af8: */
+ 0, /* U+012af9: */
+ 0, /* U+012afa: */
+ 0, /* U+012afb: */
+ 0, /* U+012afc: */
+ 0, /* U+012afd: */
+ 0, /* U+012afe: */
+ 0, /* U+012aff: */
+ 0, /* U+012b00: */
+ 0, /* U+012b01: */
+ 0, /* U+012b02: */
+ 0, /* U+012b03: */
+ 0, /* U+012b04: */
+ 0, /* U+012b05: */
+ 0, /* U+012b06: */
+ 0, /* U+012b07: */
+ 0, /* U+012b08: */
+ 0, /* U+012b09: */
+ 0, /* U+012b0a: */
+ 0, /* U+012b0b: */
+ 0, /* U+012b0c: */
+ 0, /* U+012b0d: */
+ 0, /* U+012b0e: */
+ 0, /* U+012b0f: */
+ 0, /* U+012b10: */
+ 0, /* U+012b11: */
+ 0, /* U+012b12: */
+ 0, /* U+012b13: */
+ 0, /* U+012b14: */
+ 0, /* U+012b15: */
+ 0, /* U+012b16: */
+ 0, /* U+012b17: */
+ 0, /* U+012b18: */
+ 0, /* U+012b19: */
+ 0, /* U+012b1a: */
+ 0, /* U+012b1b: */
+ 0, /* U+012b1c: */
+ 0, /* U+012b1d: */
+ 0, /* U+012b1e: */
+ 0, /* U+012b1f: */
+ 0, /* U+012b20: */
+ 0, /* U+012b21: */
+ 0, /* U+012b22: */
+ 0, /* U+012b23: */
+ 0, /* U+012b24: */
+ 0, /* U+012b25: */
+ 0, /* U+012b26: */
+ 0, /* U+012b27: */
+ 0, /* U+012b28: */
+ 0, /* U+012b29: */
+ 0, /* U+012b2a: */
+ 0, /* U+012b2b: */
+ 0, /* U+012b2c: */
+ 0, /* U+012b2d: */
+ 0, /* U+012b2e: */
+ 0, /* U+012b2f: */
+ 0, /* U+012b30: */
+ 0, /* U+012b31: */
+ 0, /* U+012b32: */
+ 0, /* U+012b33: */
+ 0, /* U+012b34: */
+ 0, /* U+012b35: */
+ 0, /* U+012b36: */
+ 0, /* U+012b37: */
+ 0, /* U+012b38: */
+ 0, /* U+012b39: */
+ 0, /* U+012b3a: */
+ 0, /* U+012b3b: */
+ 0, /* U+012b3c: */
+ 0, /* U+012b3d: */
+ 0, /* U+012b3e: */
+ 0, /* U+012b3f: */
+ 0, /* U+012b40: */
+ 0, /* U+012b41: */
+ 0, /* U+012b42: */
+ 0, /* U+012b43: */
+ 0, /* U+012b44: */
+ 0, /* U+012b45: */
+ 0, /* U+012b46: */
+ 0, /* U+012b47: */
+ 0, /* U+012b48: */
+ 0, /* U+012b49: */
+ 0, /* U+012b4a: */
+ 0, /* U+012b4b: */
+ 0, /* U+012b4c: */
+ 0, /* U+012b4d: */
+ 0, /* U+012b4e: */
+ 0, /* U+012b4f: */
+ 0, /* U+012b50: */
+ 0, /* U+012b51: */
+ 0, /* U+012b52: */
+ 0, /* U+012b53: */
+ 0, /* U+012b54: */
+ 0, /* U+012b55: */
+ 0, /* U+012b56: */
+ 0, /* U+012b57: */
+ 0, /* U+012b58: */
+ 0, /* U+012b59: */
+ 0, /* U+012b5a: */
+ 0, /* U+012b5b: */
+ 0, /* U+012b5c: */
+ 0, /* U+012b5d: */
+ 0, /* U+012b5e: */
+ 0, /* U+012b5f: */
+ 0, /* U+012b60: */
+ 0, /* U+012b61: */
+ 0, /* U+012b62: */
+ 0, /* U+012b63: */
+ 0, /* U+012b64: */
+ 0, /* U+012b65: */
+ 0, /* U+012b66: */
+ 0, /* U+012b67: */
+ 0, /* U+012b68: */
+ 0, /* U+012b69: */
+ 0, /* U+012b6a: */
+ 0, /* U+012b6b: */
+ 0, /* U+012b6c: */
+ 0, /* U+012b6d: */
+ 0, /* U+012b6e: */
+ 0, /* U+012b6f: */
+ 0, /* U+012b70: */
+ 0, /* U+012b71: */
+ 0, /* U+012b72: */
+ 0, /* U+012b73: */
+ 0, /* U+012b74: */
+ 0, /* U+012b75: */
+ 0, /* U+012b76: */
+ 0, /* U+012b77: */
+ 0, /* U+012b78: */
+ 0, /* U+012b79: */
+ 0, /* U+012b7a: */
+ 0, /* U+012b7b: */
+ 0, /* U+012b7c: */
+ 0, /* U+012b7d: */
+ 0, /* U+012b7e: */
+ 0, /* U+012b7f: */
+ 0, /* U+012b80: */
+ 0, /* U+012b81: */
+ 0, /* U+012b82: */
+ 0, /* U+012b83: */
+ 0, /* U+012b84: */
+ 0, /* U+012b85: */
+ 0, /* U+012b86: */
+ 0, /* U+012b87: */
+ 0, /* U+012b88: */
+ 0, /* U+012b89: */
+ 0, /* U+012b8a: */
+ 0, /* U+012b8b: */
+ 0, /* U+012b8c: */
+ 0, /* U+012b8d: */
+ 0, /* U+012b8e: */
+ 0, /* U+012b8f: */
+ 0, /* U+012b90: */
+ 0, /* U+012b91: */
+ 0, /* U+012b92: */
+ 0, /* U+012b93: */
+ 0, /* U+012b94: */
+ 0, /* U+012b95: */
+ 0, /* U+012b96: */
+ 0, /* U+012b97: */
+ 0, /* U+012b98: */
+ 0, /* U+012b99: */
+ 0, /* U+012b9a: */
+ 0, /* U+012b9b: */
+ 0, /* U+012b9c: */
+ 0, /* U+012b9d: */
+ 0, /* U+012b9e: */
+ 0, /* U+012b9f: */
+ 0, /* U+012ba0: */
+ 0, /* U+012ba1: */
+ 0, /* U+012ba2: */
+ 0, /* U+012ba3: */
+ 0, /* U+012ba4: */
+ 0, /* U+012ba5: */
+ 0, /* U+012ba6: */
+ 0, /* U+012ba7: */
+ 0, /* U+012ba8: */
+ 0, /* U+012ba9: */
+ 0, /* U+012baa: */
+ 0, /* U+012bab: */
+ 0, /* U+012bac: */
+ 0, /* U+012bad: */
+ 0, /* U+012bae: */
+ 0, /* U+012baf: */
+ 0, /* U+012bb0: */
+ 0, /* U+012bb1: */
+ 0, /* U+012bb2: */
+ 0, /* U+012bb3: */
+ 0, /* U+012bb4: */
+ 0, /* U+012bb5: */
+ 0, /* U+012bb6: */
+ 0, /* U+012bb7: */
+ 0, /* U+012bb8: */
+ 0, /* U+012bb9: */
+ 0, /* U+012bba: */
+ 0, /* U+012bbb: */
+ 0, /* U+012bbc: */
+ 0, /* U+012bbd: */
+ 0, /* U+012bbe: */
+ 0, /* U+012bbf: */
+ 0, /* U+012bc0: */
+ 0, /* U+012bc1: */
+ 0, /* U+012bc2: */
+ 0, /* U+012bc3: */
+ 0, /* U+012bc4: */
+ 0, /* U+012bc5: */
+ 0, /* U+012bc6: */
+ 0, /* U+012bc7: */
+ 0, /* U+012bc8: */
+ 0, /* U+012bc9: */
+ 0, /* U+012bca: */
+ 0, /* U+012bcb: */
+ 0, /* U+012bcc: */
+ 0, /* U+012bcd: */
+ 0, /* U+012bce: */
+ 0, /* U+012bcf: */
+ 0, /* U+012bd0: */
+ 0, /* U+012bd1: */
+ 0, /* U+012bd2: */
+ 0, /* U+012bd3: */
+ 0, /* U+012bd4: */
+ 0, /* U+012bd5: */
+ 0, /* U+012bd6: */
+ 0, /* U+012bd7: */
+ 0, /* U+012bd8: */
+ 0, /* U+012bd9: */
+ 0, /* U+012bda: */
+ 0, /* U+012bdb: */
+ 0, /* U+012bdc: */
+ 0, /* U+012bdd: */
+ 0, /* U+012bde: */
+ 0, /* U+012bdf: */
+ 0, /* U+012be0: */
+ 0, /* U+012be1: */
+ 0, /* U+012be2: */
+ 0, /* U+012be3: */
+ 0, /* U+012be4: */
+ 0, /* U+012be5: */
+ 0, /* U+012be6: */
+ 0, /* U+012be7: */
+ 0, /* U+012be8: */
+ 0, /* U+012be9: */
+ 0, /* U+012bea: */
+ 0, /* U+012beb: */
+ 0, /* U+012bec: */
+ 0, /* U+012bed: */
+ 0, /* U+012bee: */
+ 0, /* U+012bef: */
+ 0, /* U+012bf0: */
+ 0, /* U+012bf1: */
+ 0, /* U+012bf2: */
+ 0, /* U+012bf3: */
+ 0, /* U+012bf4: */
+ 0, /* U+012bf5: */
+ 0, /* U+012bf6: */
+ 0, /* U+012bf7: */
+ 0, /* U+012bf8: */
+ 0, /* U+012bf9: */
+ 0, /* U+012bfa: */
+ 0, /* U+012bfb: */
+ 0, /* U+012bfc: */
+ 0, /* U+012bfd: */
+ 0, /* U+012bfe: */
+ 0, /* U+012bff: */
+ 0, /* U+012c00: */
+ 0, /* U+012c01: */
+ 0, /* U+012c02: */
+ 0, /* U+012c03: */
+ 0, /* U+012c04: */
+ 0, /* U+012c05: */
+ 0, /* U+012c06: */
+ 0, /* U+012c07: */
+ 0, /* U+012c08: */
+ 0, /* U+012c09: */
+ 0, /* U+012c0a: */
+ 0, /* U+012c0b: */
+ 0, /* U+012c0c: */
+ 0, /* U+012c0d: */
+ 0, /* U+012c0e: */
+ 0, /* U+012c0f: */
+ 0, /* U+012c10: */
+ 0, /* U+012c11: */
+ 0, /* U+012c12: */
+ 0, /* U+012c13: */
+ 0, /* U+012c14: */
+ 0, /* U+012c15: */
+ 0, /* U+012c16: */
+ 0, /* U+012c17: */
+ 0, /* U+012c18: */
+ 0, /* U+012c19: */
+ 0, /* U+012c1a: */
+ 0, /* U+012c1b: */
+ 0, /* U+012c1c: */
+ 0, /* U+012c1d: */
+ 0, /* U+012c1e: */
+ 0, /* U+012c1f: */
+ 0, /* U+012c20: */
+ 0, /* U+012c21: */
+ 0, /* U+012c22: */
+ 0, /* U+012c23: */
+ 0, /* U+012c24: */
+ 0, /* U+012c25: */
+ 0, /* U+012c26: */
+ 0, /* U+012c27: */
+ 0, /* U+012c28: */
+ 0, /* U+012c29: */
+ 0, /* U+012c2a: */
+ 0, /* U+012c2b: */
+ 0, /* U+012c2c: */
+ 0, /* U+012c2d: */
+ 0, /* U+012c2e: */
+ 0, /* U+012c2f: */
+ 0, /* U+012c30: */
+ 0, /* U+012c31: */
+ 0, /* U+012c32: */
+ 0, /* U+012c33: */
+ 0, /* U+012c34: */
+ 0, /* U+012c35: */
+ 0, /* U+012c36: */
+ 0, /* U+012c37: */
+ 0, /* U+012c38: */
+ 0, /* U+012c39: */
+ 0, /* U+012c3a: */
+ 0, /* U+012c3b: */
+ 0, /* U+012c3c: */
+ 0, /* U+012c3d: */
+ 0, /* U+012c3e: */
+ 0, /* U+012c3f: */
+ 0, /* U+012c40: */
+ 0, /* U+012c41: */
+ 0, /* U+012c42: */
+ 0, /* U+012c43: */
+ 0, /* U+012c44: */
+ 0, /* U+012c45: */
+ 0, /* U+012c46: */
+ 0, /* U+012c47: */
+ 0, /* U+012c48: */
+ 0, /* U+012c49: */
+ 0, /* U+012c4a: */
+ 0, /* U+012c4b: */
+ 0, /* U+012c4c: */
+ 0, /* U+012c4d: */
+ 0, /* U+012c4e: */
+ 0, /* U+012c4f: */
+ 0, /* U+012c50: */
+ 0, /* U+012c51: */
+ 0, /* U+012c52: */
+ 0, /* U+012c53: */
+ 0, /* U+012c54: */
+ 0, /* U+012c55: */
+ 0, /* U+012c56: */
+ 0, /* U+012c57: */
+ 0, /* U+012c58: */
+ 0, /* U+012c59: */
+ 0, /* U+012c5a: */
+ 0, /* U+012c5b: */
+ 0, /* U+012c5c: */
+ 0, /* U+012c5d: */
+ 0, /* U+012c5e: */
+ 0, /* U+012c5f: */
+ 0, /* U+012c60: */
+ 0, /* U+012c61: */
+ 0, /* U+012c62: */
+ 0, /* U+012c63: */
+ 0, /* U+012c64: */
+ 0, /* U+012c65: */
+ 0, /* U+012c66: */
+ 0, /* U+012c67: */
+ 0, /* U+012c68: */
+ 0, /* U+012c69: */
+ 0, /* U+012c6a: */
+ 0, /* U+012c6b: */
+ 0, /* U+012c6c: */
+ 0, /* U+012c6d: */
+ 0, /* U+012c6e: */
+ 0, /* U+012c6f: */
+ 0, /* U+012c70: */
+ 0, /* U+012c71: */
+ 0, /* U+012c72: */
+ 0, /* U+012c73: */
+ 0, /* U+012c74: */
+ 0, /* U+012c75: */
+ 0, /* U+012c76: */
+ 0, /* U+012c77: */
+ 0, /* U+012c78: */
+ 0, /* U+012c79: */
+ 0, /* U+012c7a: */
+ 0, /* U+012c7b: */
+ 0, /* U+012c7c: */
+ 0, /* U+012c7d: */
+ 0, /* U+012c7e: */
+ 0, /* U+012c7f: */
+ 0, /* U+012c80: */
+ 0, /* U+012c81: */
+ 0, /* U+012c82: */
+ 0, /* U+012c83: */
+ 0, /* U+012c84: */
+ 0, /* U+012c85: */
+ 0, /* U+012c86: */
+ 0, /* U+012c87: */
+ 0, /* U+012c88: */
+ 0, /* U+012c89: */
+ 0, /* U+012c8a: */
+ 0, /* U+012c8b: */
+ 0, /* U+012c8c: */
+ 0, /* U+012c8d: */
+ 0, /* U+012c8e: */
+ 0, /* U+012c8f: */
+ 0, /* U+012c90: */
+ 0, /* U+012c91: */
+ 0, /* U+012c92: */
+ 0, /* U+012c93: */
+ 0, /* U+012c94: */
+ 0, /* U+012c95: */
+ 0, /* U+012c96: */
+ 0, /* U+012c97: */
+ 0, /* U+012c98: */
+ 0, /* U+012c99: */
+ 0, /* U+012c9a: */
+ 0, /* U+012c9b: */
+ 0, /* U+012c9c: */
+ 0, /* U+012c9d: */
+ 0, /* U+012c9e: */
+ 0, /* U+012c9f: */
+ 0, /* U+012ca0: */
+ 0, /* U+012ca1: */
+ 0, /* U+012ca2: */
+ 0, /* U+012ca3: */
+ 0, /* U+012ca4: */
+ 0, /* U+012ca5: */
+ 0, /* U+012ca6: */
+ 0, /* U+012ca7: */
+ 0, /* U+012ca8: */
+ 0, /* U+012ca9: */
+ 0, /* U+012caa: */
+ 0, /* U+012cab: */
+ 0, /* U+012cac: */
+ 0, /* U+012cad: */
+ 0, /* U+012cae: */
+ 0, /* U+012caf: */
+ 0, /* U+012cb0: */
+ 0, /* U+012cb1: */
+ 0, /* U+012cb2: */
+ 0, /* U+012cb3: */
+ 0, /* U+012cb4: */
+ 0, /* U+012cb5: */
+ 0, /* U+012cb6: */
+ 0, /* U+012cb7: */
+ 0, /* U+012cb8: */
+ 0, /* U+012cb9: */
+ 0, /* U+012cba: */
+ 0, /* U+012cbb: */
+ 0, /* U+012cbc: */
+ 0, /* U+012cbd: */
+ 0, /* U+012cbe: */
+ 0, /* U+012cbf: */
+ 0, /* U+012cc0: */
+ 0, /* U+012cc1: */
+ 0, /* U+012cc2: */
+ 0, /* U+012cc3: */
+ 0, /* U+012cc4: */
+ 0, /* U+012cc5: */
+ 0, /* U+012cc6: */
+ 0, /* U+012cc7: */
+ 0, /* U+012cc8: */
+ 0, /* U+012cc9: */
+ 0, /* U+012cca: */
+ 0, /* U+012ccb: */
+ 0, /* U+012ccc: */
+ 0, /* U+012ccd: */
+ 0, /* U+012cce: */
+ 0, /* U+012ccf: */
+ 0, /* U+012cd0: */
+ 0, /* U+012cd1: */
+ 0, /* U+012cd2: */
+ 0, /* U+012cd3: */
+ 0, /* U+012cd4: */
+ 0, /* U+012cd5: */
+ 0, /* U+012cd6: */
+ 0, /* U+012cd7: */
+ 0, /* U+012cd8: */
+ 0, /* U+012cd9: */
+ 0, /* U+012cda: */
+ 0, /* U+012cdb: */
+ 0, /* U+012cdc: */
+ 0, /* U+012cdd: */
+ 0, /* U+012cde: */
+ 0, /* U+012cdf: */
+ 0, /* U+012ce0: */
+ 0, /* U+012ce1: */
+ 0, /* U+012ce2: */
+ 0, /* U+012ce3: */
+ 0, /* U+012ce4: */
+ 0, /* U+012ce5: */
+ 0, /* U+012ce6: */
+ 0, /* U+012ce7: */
+ 0, /* U+012ce8: */
+ 0, /* U+012ce9: */
+ 0, /* U+012cea: */
+ 0, /* U+012ceb: */
+ 0, /* U+012cec: */
+ 0, /* U+012ced: */
+ 0, /* U+012cee: */
+ 0, /* U+012cef: */
+ 0, /* U+012cf0: */
+ 0, /* U+012cf1: */
+ 0, /* U+012cf2: */
+ 0, /* U+012cf3: */
+ 0, /* U+012cf4: */
+ 0, /* U+012cf5: */
+ 0, /* U+012cf6: */
+ 0, /* U+012cf7: */
+ 0, /* U+012cf8: */
+ 0, /* U+012cf9: */
+ 0, /* U+012cfa: */
+ 0, /* U+012cfb: */
+ 0, /* U+012cfc: */
+ 0, /* U+012cfd: */
+ 0, /* U+012cfe: */
+ 0, /* U+012cff: */
+ 0, /* U+012d00: */
+ 0, /* U+012d01: */
+ 0, /* U+012d02: */
+ 0, /* U+012d03: */
+ 0, /* U+012d04: */
+ 0, /* U+012d05: */
+ 0, /* U+012d06: */
+ 0, /* U+012d07: */
+ 0, /* U+012d08: */
+ 0, /* U+012d09: */
+ 0, /* U+012d0a: */
+ 0, /* U+012d0b: */
+ 0, /* U+012d0c: */
+ 0, /* U+012d0d: */
+ 0, /* U+012d0e: */
+ 0, /* U+012d0f: */
+ 0, /* U+012d10: */
+ 0, /* U+012d11: */
+ 0, /* U+012d12: */
+ 0, /* U+012d13: */
+ 0, /* U+012d14: */
+ 0, /* U+012d15: */
+ 0, /* U+012d16: */
+ 0, /* U+012d17: */
+ 0, /* U+012d18: */
+ 0, /* U+012d19: */
+ 0, /* U+012d1a: */
+ 0, /* U+012d1b: */
+ 0, /* U+012d1c: */
+ 0, /* U+012d1d: */
+ 0, /* U+012d1e: */
+ 0, /* U+012d1f: */
+ 0, /* U+012d20: */
+ 0, /* U+012d21: */
+ 0, /* U+012d22: */
+ 0, /* U+012d23: */
+ 0, /* U+012d24: */
+ 0, /* U+012d25: */
+ 0, /* U+012d26: */
+ 0, /* U+012d27: */
+ 0, /* U+012d28: */
+ 0, /* U+012d29: */
+ 0, /* U+012d2a: */
+ 0, /* U+012d2b: */
+ 0, /* U+012d2c: */
+ 0, /* U+012d2d: */
+ 0, /* U+012d2e: */
+ 0, /* U+012d2f: */
+ 0, /* U+012d30: */
+ 0, /* U+012d31: */
+ 0, /* U+012d32: */
+ 0, /* U+012d33: */
+ 0, /* U+012d34: */
+ 0, /* U+012d35: */
+ 0, /* U+012d36: */
+ 0, /* U+012d37: */
+ 0, /* U+012d38: */
+ 0, /* U+012d39: */
+ 0, /* U+012d3a: */
+ 0, /* U+012d3b: */
+ 0, /* U+012d3c: */
+ 0, /* U+012d3d: */
+ 0, /* U+012d3e: */
+ 0, /* U+012d3f: */
+ 0, /* U+012d40: */
+ 0, /* U+012d41: */
+ 0, /* U+012d42: */
+ 0, /* U+012d43: */
+ 0, /* U+012d44: */
+ 0, /* U+012d45: */
+ 0, /* U+012d46: */
+ 0, /* U+012d47: */
+ 0, /* U+012d48: */
+ 0, /* U+012d49: */
+ 0, /* U+012d4a: */
+ 0, /* U+012d4b: */
+ 0, /* U+012d4c: */
+ 0, /* U+012d4d: */
+ 0, /* U+012d4e: */
+ 0, /* U+012d4f: */
+ 0, /* U+012d50: */
+ 0, /* U+012d51: */
+ 0, /* U+012d52: */
+ 0, /* U+012d53: */
+ 0, /* U+012d54: */
+ 0, /* U+012d55: */
+ 0, /* U+012d56: */
+ 0, /* U+012d57: */
+ 0, /* U+012d58: */
+ 0, /* U+012d59: */
+ 0, /* U+012d5a: */
+ 0, /* U+012d5b: */
+ 0, /* U+012d5c: */
+ 0, /* U+012d5d: */
+ 0, /* U+012d5e: */
+ 0, /* U+012d5f: */
+ 0, /* U+012d60: */
+ 0, /* U+012d61: */
+ 0, /* U+012d62: */
+ 0, /* U+012d63: */
+ 0, /* U+012d64: */
+ 0, /* U+012d65: */
+ 0, /* U+012d66: */
+ 0, /* U+012d67: */
+ 0, /* U+012d68: */
+ 0, /* U+012d69: */
+ 0, /* U+012d6a: */
+ 0, /* U+012d6b: */
+ 0, /* U+012d6c: */
+ 0, /* U+012d6d: */
+ 0, /* U+012d6e: */
+ 0, /* U+012d6f: */
+ 0, /* U+012d70: */
+ 0, /* U+012d71: */
+ 0, /* U+012d72: */
+ 0, /* U+012d73: */
+ 0, /* U+012d74: */
+ 0, /* U+012d75: */
+ 0, /* U+012d76: */
+ 0, /* U+012d77: */
+ 0, /* U+012d78: */
+ 0, /* U+012d79: */
+ 0, /* U+012d7a: */
+ 0, /* U+012d7b: */
+ 0, /* U+012d7c: */
+ 0, /* U+012d7d: */
+ 0, /* U+012d7e: */
+ 0, /* U+012d7f: */
+ 0, /* U+012d80: */
+ 0, /* U+012d81: */
+ 0, /* U+012d82: */
+ 0, /* U+012d83: */
+ 0, /* U+012d84: */
+ 0, /* U+012d85: */
+ 0, /* U+012d86: */
+ 0, /* U+012d87: */
+ 0, /* U+012d88: */
+ 0, /* U+012d89: */
+ 0, /* U+012d8a: */
+ 0, /* U+012d8b: */
+ 0, /* U+012d8c: */
+ 0, /* U+012d8d: */
+ 0, /* U+012d8e: */
+ 0, /* U+012d8f: */
+ 0, /* U+012d90: */
+ 0, /* U+012d91: */
+ 0, /* U+012d92: */
+ 0, /* U+012d93: */
+ 0, /* U+012d94: */
+ 0, /* U+012d95: */
+ 0, /* U+012d96: */
+ 0, /* U+012d97: */
+ 0, /* U+012d98: */
+ 0, /* U+012d99: */
+ 0, /* U+012d9a: */
+ 0, /* U+012d9b: */
+ 0, /* U+012d9c: */
+ 0, /* U+012d9d: */
+ 0, /* U+012d9e: */
+ 0, /* U+012d9f: */
+ 0, /* U+012da0: */
+ 0, /* U+012da1: */
+ 0, /* U+012da2: */
+ 0, /* U+012da3: */
+ 0, /* U+012da4: */
+ 0, /* U+012da5: */
+ 0, /* U+012da6: */
+ 0, /* U+012da7: */
+ 0, /* U+012da8: */
+ 0, /* U+012da9: */
+ 0, /* U+012daa: */
+ 0, /* U+012dab: */
+ 0, /* U+012dac: */
+ 0, /* U+012dad: */
+ 0, /* U+012dae: */
+ 0, /* U+012daf: */
+ 0, /* U+012db0: */
+ 0, /* U+012db1: */
+ 0, /* U+012db2: */
+ 0, /* U+012db3: */
+ 0, /* U+012db4: */
+ 0, /* U+012db5: */
+ 0, /* U+012db6: */
+ 0, /* U+012db7: */
+ 0, /* U+012db8: */
+ 0, /* U+012db9: */
+ 0, /* U+012dba: */
+ 0, /* U+012dbb: */
+ 0, /* U+012dbc: */
+ 0, /* U+012dbd: */
+ 0, /* U+012dbe: */
+ 0, /* U+012dbf: */
+ 0, /* U+012dc0: */
+ 0, /* U+012dc1: */
+ 0, /* U+012dc2: */
+ 0, /* U+012dc3: */
+ 0, /* U+012dc4: */
+ 0, /* U+012dc5: */
+ 0, /* U+012dc6: */
+ 0, /* U+012dc7: */
+ 0, /* U+012dc8: */
+ 0, /* U+012dc9: */
+ 0, /* U+012dca: */
+ 0, /* U+012dcb: */
+ 0, /* U+012dcc: */
+ 0, /* U+012dcd: */
+ 0, /* U+012dce: */
+ 0, /* U+012dcf: */
+ 0, /* U+012dd0: */
+ 0, /* U+012dd1: */
+ 0, /* U+012dd2: */
+ 0, /* U+012dd3: */
+ 0, /* U+012dd4: */
+ 0, /* U+012dd5: */
+ 0, /* U+012dd6: */
+ 0, /* U+012dd7: */
+ 0, /* U+012dd8: */
+ 0, /* U+012dd9: */
+ 0, /* U+012dda: */
+ 0, /* U+012ddb: */
+ 0, /* U+012ddc: */
+ 0, /* U+012ddd: */
+ 0, /* U+012dde: */
+ 0, /* U+012ddf: */
+ 0, /* U+012de0: */
+ 0, /* U+012de1: */
+ 0, /* U+012de2: */
+ 0, /* U+012de3: */
+ 0, /* U+012de4: */
+ 0, /* U+012de5: */
+ 0, /* U+012de6: */
+ 0, /* U+012de7: */
+ 0, /* U+012de8: */
+ 0, /* U+012de9: */
+ 0, /* U+012dea: */
+ 0, /* U+012deb: */
+ 0, /* U+012dec: */
+ 0, /* U+012ded: */
+ 0, /* U+012dee: */
+ 0, /* U+012def: */
+ 0, /* U+012df0: */
+ 0, /* U+012df1: */
+ 0, /* U+012df2: */
+ 0, /* U+012df3: */
+ 0, /* U+012df4: */
+ 0, /* U+012df5: */
+ 0, /* U+012df6: */
+ 0, /* U+012df7: */
+ 0, /* U+012df8: */
+ 0, /* U+012df9: */
+ 0, /* U+012dfa: */
+ 0, /* U+012dfb: */
+ 0, /* U+012dfc: */
+ 0, /* U+012dfd: */
+ 0, /* U+012dfe: */
+ 0, /* U+012dff: */
+ 0, /* U+012e00: */
+ 0, /* U+012e01: */
+ 0, /* U+012e02: */
+ 0, /* U+012e03: */
+ 0, /* U+012e04: */
+ 0, /* U+012e05: */
+ 0, /* U+012e06: */
+ 0, /* U+012e07: */
+ 0, /* U+012e08: */
+ 0, /* U+012e09: */
+ 0, /* U+012e0a: */
+ 0, /* U+012e0b: */
+ 0, /* U+012e0c: */
+ 0, /* U+012e0d: */
+ 0, /* U+012e0e: */
+ 0, /* U+012e0f: */
+ 0, /* U+012e10: */
+ 0, /* U+012e11: */
+ 0, /* U+012e12: */
+ 0, /* U+012e13: */
+ 0, /* U+012e14: */
+ 0, /* U+012e15: */
+ 0, /* U+012e16: */
+ 0, /* U+012e17: */
+ 0, /* U+012e18: */
+ 0, /* U+012e19: */
+ 0, /* U+012e1a: */
+ 0, /* U+012e1b: */
+ 0, /* U+012e1c: */
+ 0, /* U+012e1d: */
+ 0, /* U+012e1e: */
+ 0, /* U+012e1f: */
+ 0, /* U+012e20: */
+ 0, /* U+012e21: */
+ 0, /* U+012e22: */
+ 0, /* U+012e23: */
+ 0, /* U+012e24: */
+ 0, /* U+012e25: */
+ 0, /* U+012e26: */
+ 0, /* U+012e27: */
+ 0, /* U+012e28: */
+ 0, /* U+012e29: */
+ 0, /* U+012e2a: */
+ 0, /* U+012e2b: */
+ 0, /* U+012e2c: */
+ 0, /* U+012e2d: */
+ 0, /* U+012e2e: */
+ 0, /* U+012e2f: */
+ 0, /* U+012e30: */
+ 0, /* U+012e31: */
+ 0, /* U+012e32: */
+ 0, /* U+012e33: */
+ 0, /* U+012e34: */
+ 0, /* U+012e35: */
+ 0, /* U+012e36: */
+ 0, /* U+012e37: */
+ 0, /* U+012e38: */
+ 0, /* U+012e39: */
+ 0, /* U+012e3a: */
+ 0, /* U+012e3b: */
+ 0, /* U+012e3c: */
+ 0, /* U+012e3d: */
+ 0, /* U+012e3e: */
+ 0, /* U+012e3f: */
+ 0, /* U+012e40: */
+ 0, /* U+012e41: */
+ 0, /* U+012e42: */
+ 0, /* U+012e43: */
+ 0, /* U+012e44: */
+ 0, /* U+012e45: */
+ 0, /* U+012e46: */
+ 0, /* U+012e47: */
+ 0, /* U+012e48: */
+ 0, /* U+012e49: */
+ 0, /* U+012e4a: */
+ 0, /* U+012e4b: */
+ 0, /* U+012e4c: */
+ 0, /* U+012e4d: */
+ 0, /* U+012e4e: */
+ 0, /* U+012e4f: */
+ 0, /* U+012e50: */
+ 0, /* U+012e51: */
+ 0, /* U+012e52: */
+ 0, /* U+012e53: */
+ 0, /* U+012e54: */
+ 0, /* U+012e55: */
+ 0, /* U+012e56: */
+ 0, /* U+012e57: */
+ 0, /* U+012e58: */
+ 0, /* U+012e59: */
+ 0, /* U+012e5a: */
+ 0, /* U+012e5b: */
+ 0, /* U+012e5c: */
+ 0, /* U+012e5d: */
+ 0, /* U+012e5e: */
+ 0, /* U+012e5f: */
+ 0, /* U+012e60: */
+ 0, /* U+012e61: */
+ 0, /* U+012e62: */
+ 0, /* U+012e63: */
+ 0, /* U+012e64: */
+ 0, /* U+012e65: */
+ 0, /* U+012e66: */
+ 0, /* U+012e67: */
+ 0, /* U+012e68: */
+ 0, /* U+012e69: */
+ 0, /* U+012e6a: */
+ 0, /* U+012e6b: */
+ 0, /* U+012e6c: */
+ 0, /* U+012e6d: */
+ 0, /* U+012e6e: */
+ 0, /* U+012e6f: */
+ 0, /* U+012e70: */
+ 0, /* U+012e71: */
+ 0, /* U+012e72: */
+ 0, /* U+012e73: */
+ 0, /* U+012e74: */
+ 0, /* U+012e75: */
+ 0, /* U+012e76: */
+ 0, /* U+012e77: */
+ 0, /* U+012e78: */
+ 0, /* U+012e79: */
+ 0, /* U+012e7a: */
+ 0, /* U+012e7b: */
+ 0, /* U+012e7c: */
+ 0, /* U+012e7d: */
+ 0, /* U+012e7e: */
+ 0, /* U+012e7f: */
+ 0, /* U+012e80: */
+ 0, /* U+012e81: */
+ 0, /* U+012e82: */
+ 0, /* U+012e83: */
+ 0, /* U+012e84: */
+ 0, /* U+012e85: */
+ 0, /* U+012e86: */
+ 0, /* U+012e87: */
+ 0, /* U+012e88: */
+ 0, /* U+012e89: */
+ 0, /* U+012e8a: */
+ 0, /* U+012e8b: */
+ 0, /* U+012e8c: */
+ 0, /* U+012e8d: */
+ 0, /* U+012e8e: */
+ 0, /* U+012e8f: */
+ 0, /* U+012e90: */
+ 0, /* U+012e91: */
+ 0, /* U+012e92: */
+ 0, /* U+012e93: */
+ 0, /* U+012e94: */
+ 0, /* U+012e95: */
+ 0, /* U+012e96: */
+ 0, /* U+012e97: */
+ 0, /* U+012e98: */
+ 0, /* U+012e99: */
+ 0, /* U+012e9a: */
+ 0, /* U+012e9b: */
+ 0, /* U+012e9c: */
+ 0, /* U+012e9d: */
+ 0, /* U+012e9e: */
+ 0, /* U+012e9f: */
+ 0, /* U+012ea0: */
+ 0, /* U+012ea1: */
+ 0, /* U+012ea2: */
+ 0, /* U+012ea3: */
+ 0, /* U+012ea4: */
+ 0, /* U+012ea5: */
+ 0, /* U+012ea6: */
+ 0, /* U+012ea7: */
+ 0, /* U+012ea8: */
+ 0, /* U+012ea9: */
+ 0, /* U+012eaa: */
+ 0, /* U+012eab: */
+ 0, /* U+012eac: */
+ 0, /* U+012ead: */
+ 0, /* U+012eae: */
+ 0, /* U+012eaf: */
+ 0, /* U+012eb0: */
+ 0, /* U+012eb1: */
+ 0, /* U+012eb2: */
+ 0, /* U+012eb3: */
+ 0, /* U+012eb4: */
+ 0, /* U+012eb5: */
+ 0, /* U+012eb6: */
+ 0, /* U+012eb7: */
+ 0, /* U+012eb8: */
+ 0, /* U+012eb9: */
+ 0, /* U+012eba: */
+ 0, /* U+012ebb: */
+ 0, /* U+012ebc: */
+ 0, /* U+012ebd: */
+ 0, /* U+012ebe: */
+ 0, /* U+012ebf: */
+ 0, /* U+012ec0: */
+ 0, /* U+012ec1: */
+ 0, /* U+012ec2: */
+ 0, /* U+012ec3: */
+ 0, /* U+012ec4: */
+ 0, /* U+012ec5: */
+ 0, /* U+012ec6: */
+ 0, /* U+012ec7: */
+ 0, /* U+012ec8: */
+ 0, /* U+012ec9: */
+ 0, /* U+012eca: */
+ 0, /* U+012ecb: */
+ 0, /* U+012ecc: */
+ 0, /* U+012ecd: */
+ 0, /* U+012ece: */
+ 0, /* U+012ecf: */
+ 0, /* U+012ed0: */
+ 0, /* U+012ed1: */
+ 0, /* U+012ed2: */
+ 0, /* U+012ed3: */
+ 0, /* U+012ed4: */
+ 0, /* U+012ed5: */
+ 0, /* U+012ed6: */
+ 0, /* U+012ed7: */
+ 0, /* U+012ed8: */
+ 0, /* U+012ed9: */
+ 0, /* U+012eda: */
+ 0, /* U+012edb: */
+ 0, /* U+012edc: */
+ 0, /* U+012edd: */
+ 0, /* U+012ede: */
+ 0, /* U+012edf: */
+ 0, /* U+012ee0: */
+ 0, /* U+012ee1: */
+ 0, /* U+012ee2: */
+ 0, /* U+012ee3: */
+ 0, /* U+012ee4: */
+ 0, /* U+012ee5: */
+ 0, /* U+012ee6: */
+ 0, /* U+012ee7: */
+ 0, /* U+012ee8: */
+ 0, /* U+012ee9: */
+ 0, /* U+012eea: */
+ 0, /* U+012eeb: */
+ 0, /* U+012eec: */
+ 0, /* U+012eed: */
+ 0, /* U+012eee: */
+ 0, /* U+012eef: */
+ 0, /* U+012ef0: */
+ 0, /* U+012ef1: */
+ 0, /* U+012ef2: */
+ 0, /* U+012ef3: */
+ 0, /* U+012ef4: */
+ 0, /* U+012ef5: */
+ 0, /* U+012ef6: */
+ 0, /* U+012ef7: */
+ 0, /* U+012ef8: */
+ 0, /* U+012ef9: */
+ 0, /* U+012efa: */
+ 0, /* U+012efb: */
+ 0, /* U+012efc: */
+ 0, /* U+012efd: */
+ 0, /* U+012efe: */
+ 0, /* U+012eff: */
+ 0, /* U+012f00: */
+ 0, /* U+012f01: */
+ 0, /* U+012f02: */
+ 0, /* U+012f03: */
+ 0, /* U+012f04: */
+ 0, /* U+012f05: */
+ 0, /* U+012f06: */
+ 0, /* U+012f07: */
+ 0, /* U+012f08: */
+ 0, /* U+012f09: */
+ 0, /* U+012f0a: */
+ 0, /* U+012f0b: */
+ 0, /* U+012f0c: */
+ 0, /* U+012f0d: */
+ 0, /* U+012f0e: */
+ 0, /* U+012f0f: */
+ 0, /* U+012f10: */
+ 0, /* U+012f11: */
+ 0, /* U+012f12: */
+ 0, /* U+012f13: */
+ 0, /* U+012f14: */
+ 0, /* U+012f15: */
+ 0, /* U+012f16: */
+ 0, /* U+012f17: */
+ 0, /* U+012f18: */
+ 0, /* U+012f19: */
+ 0, /* U+012f1a: */
+ 0, /* U+012f1b: */
+ 0, /* U+012f1c: */
+ 0, /* U+012f1d: */
+ 0, /* U+012f1e: */
+ 0, /* U+012f1f: */
+ 0, /* U+012f20: */
+ 0, /* U+012f21: */
+ 0, /* U+012f22: */
+ 0, /* U+012f23: */
+ 0, /* U+012f24: */
+ 0, /* U+012f25: */
+ 0, /* U+012f26: */
+ 0, /* U+012f27: */
+ 0, /* U+012f28: */
+ 0, /* U+012f29: */
+ 0, /* U+012f2a: */
+ 0, /* U+012f2b: */
+ 0, /* U+012f2c: */
+ 0, /* U+012f2d: */
+ 0, /* U+012f2e: */
+ 0, /* U+012f2f: */
+ 0, /* U+012f30: */
+ 0, /* U+012f31: */
+ 0, /* U+012f32: */
+ 0, /* U+012f33: */
+ 0, /* U+012f34: */
+ 0, /* U+012f35: */
+ 0, /* U+012f36: */
+ 0, /* U+012f37: */
+ 0, /* U+012f38: */
+ 0, /* U+012f39: */
+ 0, /* U+012f3a: */
+ 0, /* U+012f3b: */
+ 0, /* U+012f3c: */
+ 0, /* U+012f3d: */
+ 0, /* U+012f3e: */
+ 0, /* U+012f3f: */
+ 0, /* U+012f40: */
+ 0, /* U+012f41: */
+ 0, /* U+012f42: */
+ 0, /* U+012f43: */
+ 0, /* U+012f44: */
+ 0, /* U+012f45: */
+ 0, /* U+012f46: */
+ 0, /* U+012f47: */
+ 0, /* U+012f48: */
+ 0, /* U+012f49: */
+ 0, /* U+012f4a: */
+ 0, /* U+012f4b: */
+ 0, /* U+012f4c: */
+ 0, /* U+012f4d: */
+ 0, /* U+012f4e: */
+ 0, /* U+012f4f: */
+ 0, /* U+012f50: */
+ 0, /* U+012f51: */
+ 0, /* U+012f52: */
+ 0, /* U+012f53: */
+ 0, /* U+012f54: */
+ 0, /* U+012f55: */
+ 0, /* U+012f56: */
+ 0, /* U+012f57: */
+ 0, /* U+012f58: */
+ 0, /* U+012f59: */
+ 0, /* U+012f5a: */
+ 0, /* U+012f5b: */
+ 0, /* U+012f5c: */
+ 0, /* U+012f5d: */
+ 0, /* U+012f5e: */
+ 0, /* U+012f5f: */
+ 0, /* U+012f60: */
+ 0, /* U+012f61: */
+ 0, /* U+012f62: */
+ 0, /* U+012f63: */
+ 0, /* U+012f64: */
+ 0, /* U+012f65: */
+ 0, /* U+012f66: */
+ 0, /* U+012f67: */
+ 0, /* U+012f68: */
+ 0, /* U+012f69: */
+ 0, /* U+012f6a: */
+ 0, /* U+012f6b: */
+ 0, /* U+012f6c: */
+ 0, /* U+012f6d: */
+ 0, /* U+012f6e: */
+ 0, /* U+012f6f: */
+ 0, /* U+012f70: */
+ 0, /* U+012f71: */
+ 0, /* U+012f72: */
+ 0, /* U+012f73: */
+ 0, /* U+012f74: */
+ 0, /* U+012f75: */
+ 0, /* U+012f76: */
+ 0, /* U+012f77: */
+ 0, /* U+012f78: */
+ 0, /* U+012f79: */
+ 0, /* U+012f7a: */
+ 0, /* U+012f7b: */
+ 0, /* U+012f7c: */
+ 0, /* U+012f7d: */
+ 0, /* U+012f7e: */
+ 0, /* U+012f7f: */
+ 0, /* U+012f80: */
+ 0, /* U+012f81: */
+ 0, /* U+012f82: */
+ 0, /* U+012f83: */
+ 0, /* U+012f84: */
+ 0, /* U+012f85: */
+ 0, /* U+012f86: */
+ 0, /* U+012f87: */
+ 0, /* U+012f88: */
+ 0, /* U+012f89: */
+ 0, /* U+012f8a: */
+ 0, /* U+012f8b: */
+ 0, /* U+012f8c: */
+ 0, /* U+012f8d: */
+ 0, /* U+012f8e: */
+ 0, /* U+012f8f: */
+ 0, /* U+012f90: */
+ 0, /* U+012f91: */
+ 0, /* U+012f92: */
+ 0, /* U+012f93: */
+ 0, /* U+012f94: */
+ 0, /* U+012f95: */
+ 0, /* U+012f96: */
+ 0, /* U+012f97: */
+ 0, /* U+012f98: */
+ 0, /* U+012f99: */
+ 0, /* U+012f9a: */
+ 0, /* U+012f9b: */
+ 0, /* U+012f9c: */
+ 0, /* U+012f9d: */
+ 0, /* U+012f9e: */
+ 0, /* U+012f9f: */
+ 0, /* U+012fa0: */
+ 0, /* U+012fa1: */
+ 0, /* U+012fa2: */
+ 0, /* U+012fa3: */
+ 0, /* U+012fa4: */
+ 0, /* U+012fa5: */
+ 0, /* U+012fa6: */
+ 0, /* U+012fa7: */
+ 0, /* U+012fa8: */
+ 0, /* U+012fa9: */
+ 0, /* U+012faa: */
+ 0, /* U+012fab: */
+ 0, /* U+012fac: */
+ 0, /* U+012fad: */
+ 0, /* U+012fae: */
+ 0, /* U+012faf: */
+ 0, /* U+012fb0: */
+ 0, /* U+012fb1: */
+ 0, /* U+012fb2: */
+ 0, /* U+012fb3: */
+ 0, /* U+012fb4: */
+ 0, /* U+012fb5: */
+ 0, /* U+012fb6: */
+ 0, /* U+012fb7: */
+ 0, /* U+012fb8: */
+ 0, /* U+012fb9: */
+ 0, /* U+012fba: */
+ 0, /* U+012fbb: */
+ 0, /* U+012fbc: */
+ 0, /* U+012fbd: */
+ 0, /* U+012fbe: */
+ 0, /* U+012fbf: */
+ 0, /* U+012fc0: */
+ 0, /* U+012fc1: */
+ 0, /* U+012fc2: */
+ 0, /* U+012fc3: */
+ 0, /* U+012fc4: */
+ 0, /* U+012fc5: */
+ 0, /* U+012fc6: */
+ 0, /* U+012fc7: */
+ 0, /* U+012fc8: */
+ 0, /* U+012fc9: */
+ 0, /* U+012fca: */
+ 0, /* U+012fcb: */
+ 0, /* U+012fcc: */
+ 0, /* U+012fcd: */
+ 0, /* U+012fce: */
+ 0, /* U+012fcf: */
+ 0, /* U+012fd0: */
+ 0, /* U+012fd1: */
+ 0, /* U+012fd2: */
+ 0, /* U+012fd3: */
+ 0, /* U+012fd4: */
+ 0, /* U+012fd5: */
+ 0, /* U+012fd6: */
+ 0, /* U+012fd7: */
+ 0, /* U+012fd8: */
+ 0, /* U+012fd9: */
+ 0, /* U+012fda: */
+ 0, /* U+012fdb: */
+ 0, /* U+012fdc: */
+ 0, /* U+012fdd: */
+ 0, /* U+012fde: */
+ 0, /* U+012fdf: */
+ 0, /* U+012fe0: */
+ 0, /* U+012fe1: */
+ 0, /* U+012fe2: */
+ 0, /* U+012fe3: */
+ 0, /* U+012fe4: */
+ 0, /* U+012fe5: */
+ 0, /* U+012fe6: */
+ 0, /* U+012fe7: */
+ 0, /* U+012fe8: */
+ 0, /* U+012fe9: */
+ 0, /* U+012fea: */
+ 0, /* U+012feb: */
+ 0, /* U+012fec: */
+ 0, /* U+012fed: */
+ 0, /* U+012fee: */
+ 0, /* U+012fef: */
+ 0, /* U+012ff0: */
+ 0, /* U+012ff1: */
+ 0, /* U+012ff2: */
+ 0, /* U+012ff3: */
+ 0, /* U+012ff4: */
+ 0, /* U+012ff5: */
+ 0, /* U+012ff6: */
+ 0, /* U+012ff7: */
+ 0, /* U+012ff8: */
+ 0, /* U+012ff9: */
+ 0, /* U+012ffa: */
+ 0, /* U+012ffb: */
+ 0, /* U+012ffc: */
+ 0, /* U+012ffd: */
+ 0, /* U+012ffe: */
+ 0, /* U+012fff: */
+ RTUNI_ALPHA, /* U+013000: EGYPTIAN HIEROGLYPH A001*/
+ RTUNI_ALPHA, /* U+013001: EGYPTIAN HIEROGLYPH A002*/
+ RTUNI_ALPHA, /* U+013002: EGYPTIAN HIEROGLYPH A003*/
+ RTUNI_ALPHA, /* U+013003: EGYPTIAN HIEROGLYPH A004*/
+ RTUNI_ALPHA, /* U+013004: EGYPTIAN HIEROGLYPH A005*/
+ RTUNI_ALPHA, /* U+013005: EGYPTIAN HIEROGLYPH A005A*/
+ RTUNI_ALPHA, /* U+013006: EGYPTIAN HIEROGLYPH A006*/
+ RTUNI_ALPHA, /* U+013007: EGYPTIAN HIEROGLYPH A006A*/
+ RTUNI_ALPHA, /* U+013008: EGYPTIAN HIEROGLYPH A006B*/
+ RTUNI_ALPHA, /* U+013009: EGYPTIAN HIEROGLYPH A007*/
+ RTUNI_ALPHA, /* U+01300a: EGYPTIAN HIEROGLYPH A008*/
+ RTUNI_ALPHA, /* U+01300b: EGYPTIAN HIEROGLYPH A009*/
+ RTUNI_ALPHA, /* U+01300c: EGYPTIAN HIEROGLYPH A010*/
+ RTUNI_ALPHA, /* U+01300d: EGYPTIAN HIEROGLYPH A011*/
+ RTUNI_ALPHA, /* U+01300e: EGYPTIAN HIEROGLYPH A012*/
+ RTUNI_ALPHA, /* U+01300f: EGYPTIAN HIEROGLYPH A013*/
+ RTUNI_ALPHA, /* U+013010: EGYPTIAN HIEROGLYPH A014*/
+ RTUNI_ALPHA, /* U+013011: EGYPTIAN HIEROGLYPH A014A*/
+ RTUNI_ALPHA, /* U+013012: EGYPTIAN HIEROGLYPH A015*/
+ RTUNI_ALPHA, /* U+013013: EGYPTIAN HIEROGLYPH A016*/
+ RTUNI_ALPHA, /* U+013014: EGYPTIAN HIEROGLYPH A017*/
+ RTUNI_ALPHA, /* U+013015: EGYPTIAN HIEROGLYPH A017A*/
+ RTUNI_ALPHA, /* U+013016: EGYPTIAN HIEROGLYPH A018*/
+ RTUNI_ALPHA, /* U+013017: EGYPTIAN HIEROGLYPH A019*/
+ RTUNI_ALPHA, /* U+013018: EGYPTIAN HIEROGLYPH A020*/
+ RTUNI_ALPHA, /* U+013019: EGYPTIAN HIEROGLYPH A021*/
+ RTUNI_ALPHA, /* U+01301a: EGYPTIAN HIEROGLYPH A022*/
+ RTUNI_ALPHA, /* U+01301b: EGYPTIAN HIEROGLYPH A023*/
+ RTUNI_ALPHA, /* U+01301c: EGYPTIAN HIEROGLYPH A024*/
+ RTUNI_ALPHA, /* U+01301d: EGYPTIAN HIEROGLYPH A025*/
+ RTUNI_ALPHA, /* U+01301e: EGYPTIAN HIEROGLYPH A026*/
+ RTUNI_ALPHA, /* U+01301f: EGYPTIAN HIEROGLYPH A027*/
+ RTUNI_ALPHA, /* U+013020: EGYPTIAN HIEROGLYPH A028*/
+ RTUNI_ALPHA, /* U+013021: EGYPTIAN HIEROGLYPH A029*/
+ RTUNI_ALPHA, /* U+013022: EGYPTIAN HIEROGLYPH A030*/
+ RTUNI_ALPHA, /* U+013023: EGYPTIAN HIEROGLYPH A031*/
+ RTUNI_ALPHA, /* U+013024: EGYPTIAN HIEROGLYPH A032*/
+ RTUNI_ALPHA, /* U+013025: EGYPTIAN HIEROGLYPH A032A*/
+ RTUNI_ALPHA, /* U+013026: EGYPTIAN HIEROGLYPH A033*/
+ RTUNI_ALPHA, /* U+013027: EGYPTIAN HIEROGLYPH A034*/
+ RTUNI_ALPHA, /* U+013028: EGYPTIAN HIEROGLYPH A035*/
+ RTUNI_ALPHA, /* U+013029: EGYPTIAN HIEROGLYPH A036*/
+ RTUNI_ALPHA, /* U+01302a: EGYPTIAN HIEROGLYPH A037*/
+ RTUNI_ALPHA, /* U+01302b: EGYPTIAN HIEROGLYPH A038*/
+ RTUNI_ALPHA, /* U+01302c: EGYPTIAN HIEROGLYPH A039*/
+ RTUNI_ALPHA, /* U+01302d: EGYPTIAN HIEROGLYPH A040*/
+ RTUNI_ALPHA, /* U+01302e: EGYPTIAN HIEROGLYPH A040A*/
+ RTUNI_ALPHA, /* U+01302f: EGYPTIAN HIEROGLYPH A041*/
+ RTUNI_ALPHA, /* U+013030: EGYPTIAN HIEROGLYPH A042*/
+ RTUNI_ALPHA, /* U+013031: EGYPTIAN HIEROGLYPH A042A*/
+ RTUNI_ALPHA, /* U+013032: EGYPTIAN HIEROGLYPH A043*/
+ RTUNI_ALPHA, /* U+013033: EGYPTIAN HIEROGLYPH A043A*/
+ RTUNI_ALPHA, /* U+013034: EGYPTIAN HIEROGLYPH A044*/
+ RTUNI_ALPHA, /* U+013035: EGYPTIAN HIEROGLYPH A045*/
+ RTUNI_ALPHA, /* U+013036: EGYPTIAN HIEROGLYPH A045A*/
+ RTUNI_ALPHA, /* U+013037: EGYPTIAN HIEROGLYPH A046*/
+ RTUNI_ALPHA, /* U+013038: EGYPTIAN HIEROGLYPH A047*/
+ RTUNI_ALPHA, /* U+013039: EGYPTIAN HIEROGLYPH A048*/
+ RTUNI_ALPHA, /* U+01303a: EGYPTIAN HIEROGLYPH A049*/
+ RTUNI_ALPHA, /* U+01303b: EGYPTIAN HIEROGLYPH A050*/
+ RTUNI_ALPHA, /* U+01303c: EGYPTIAN HIEROGLYPH A051*/
+ RTUNI_ALPHA, /* U+01303d: EGYPTIAN HIEROGLYPH A052*/
+ RTUNI_ALPHA, /* U+01303e: EGYPTIAN HIEROGLYPH A053*/
+ RTUNI_ALPHA, /* U+01303f: EGYPTIAN HIEROGLYPH A054*/
+ RTUNI_ALPHA, /* U+013040: EGYPTIAN HIEROGLYPH A055*/
+ RTUNI_ALPHA, /* U+013041: EGYPTIAN HIEROGLYPH A056*/
+ RTUNI_ALPHA, /* U+013042: EGYPTIAN HIEROGLYPH A057*/
+ RTUNI_ALPHA, /* U+013043: EGYPTIAN HIEROGLYPH A058*/
+ RTUNI_ALPHA, /* U+013044: EGYPTIAN HIEROGLYPH A059*/
+ RTUNI_ALPHA, /* U+013045: EGYPTIAN HIEROGLYPH A060*/
+ RTUNI_ALPHA, /* U+013046: EGYPTIAN HIEROGLYPH A061*/
+ RTUNI_ALPHA, /* U+013047: EGYPTIAN HIEROGLYPH A062*/
+ RTUNI_ALPHA, /* U+013048: EGYPTIAN HIEROGLYPH A063*/
+ RTUNI_ALPHA, /* U+013049: EGYPTIAN HIEROGLYPH A064*/
+ RTUNI_ALPHA, /* U+01304a: EGYPTIAN HIEROGLYPH A065*/
+ RTUNI_ALPHA, /* U+01304b: EGYPTIAN HIEROGLYPH A066*/
+ RTUNI_ALPHA, /* U+01304c: EGYPTIAN HIEROGLYPH A067*/
+ RTUNI_ALPHA, /* U+01304d: EGYPTIAN HIEROGLYPH A068*/
+ RTUNI_ALPHA, /* U+01304e: EGYPTIAN HIEROGLYPH A069*/
+ RTUNI_ALPHA, /* U+01304f: EGYPTIAN HIEROGLYPH A070*/
+ RTUNI_ALPHA, /* U+013050: EGYPTIAN HIEROGLYPH B001*/
+ RTUNI_ALPHA, /* U+013051: EGYPTIAN HIEROGLYPH B002*/
+ RTUNI_ALPHA, /* U+013052: EGYPTIAN HIEROGLYPH B003*/
+ RTUNI_ALPHA, /* U+013053: EGYPTIAN HIEROGLYPH B004*/
+ RTUNI_ALPHA, /* U+013054: EGYPTIAN HIEROGLYPH B005*/
+ RTUNI_ALPHA, /* U+013055: EGYPTIAN HIEROGLYPH B005A*/
+ RTUNI_ALPHA, /* U+013056: EGYPTIAN HIEROGLYPH B006*/
+ RTUNI_ALPHA, /* U+013057: EGYPTIAN HIEROGLYPH B007*/
+ RTUNI_ALPHA, /* U+013058: EGYPTIAN HIEROGLYPH B008*/
+ RTUNI_ALPHA, /* U+013059: EGYPTIAN HIEROGLYPH B009*/
+ RTUNI_ALPHA, /* U+01305a: EGYPTIAN HIEROGLYPH C001*/
+ RTUNI_ALPHA, /* U+01305b: EGYPTIAN HIEROGLYPH C002*/
+ RTUNI_ALPHA, /* U+01305c: EGYPTIAN HIEROGLYPH C002A*/
+ RTUNI_ALPHA, /* U+01305d: EGYPTIAN HIEROGLYPH C002B*/
+ RTUNI_ALPHA, /* U+01305e: EGYPTIAN HIEROGLYPH C002C*/
+ RTUNI_ALPHA, /* U+01305f: EGYPTIAN HIEROGLYPH C003*/
+ RTUNI_ALPHA, /* U+013060: EGYPTIAN HIEROGLYPH C004*/
+ RTUNI_ALPHA, /* U+013061: EGYPTIAN HIEROGLYPH C005*/
+ RTUNI_ALPHA, /* U+013062: EGYPTIAN HIEROGLYPH C006*/
+ RTUNI_ALPHA, /* U+013063: EGYPTIAN HIEROGLYPH C007*/
+ RTUNI_ALPHA, /* U+013064: EGYPTIAN HIEROGLYPH C008*/
+ RTUNI_ALPHA, /* U+013065: EGYPTIAN HIEROGLYPH C009*/
+ RTUNI_ALPHA, /* U+013066: EGYPTIAN HIEROGLYPH C010*/
+ RTUNI_ALPHA, /* U+013067: EGYPTIAN HIEROGLYPH C010A*/
+ RTUNI_ALPHA, /* U+013068: EGYPTIAN HIEROGLYPH C011*/
+ RTUNI_ALPHA, /* U+013069: EGYPTIAN HIEROGLYPH C012*/
+ RTUNI_ALPHA, /* U+01306a: EGYPTIAN HIEROGLYPH C013*/
+ RTUNI_ALPHA, /* U+01306b: EGYPTIAN HIEROGLYPH C014*/
+ RTUNI_ALPHA, /* U+01306c: EGYPTIAN HIEROGLYPH C015*/
+ RTUNI_ALPHA, /* U+01306d: EGYPTIAN HIEROGLYPH C016*/
+ RTUNI_ALPHA, /* U+01306e: EGYPTIAN HIEROGLYPH C017*/
+ RTUNI_ALPHA, /* U+01306f: EGYPTIAN HIEROGLYPH C018*/
+ RTUNI_ALPHA, /* U+013070: EGYPTIAN HIEROGLYPH C019*/
+ RTUNI_ALPHA, /* U+013071: EGYPTIAN HIEROGLYPH C020*/
+ RTUNI_ALPHA, /* U+013072: EGYPTIAN HIEROGLYPH C021*/
+ RTUNI_ALPHA, /* U+013073: EGYPTIAN HIEROGLYPH C022*/
+ RTUNI_ALPHA, /* U+013074: EGYPTIAN HIEROGLYPH C023*/
+ RTUNI_ALPHA, /* U+013075: EGYPTIAN HIEROGLYPH C024*/
+ RTUNI_ALPHA, /* U+013076: EGYPTIAN HIEROGLYPH D001*/
+ RTUNI_ALPHA, /* U+013077: EGYPTIAN HIEROGLYPH D002*/
+ RTUNI_ALPHA, /* U+013078: EGYPTIAN HIEROGLYPH D003*/
+ RTUNI_ALPHA, /* U+013079: EGYPTIAN HIEROGLYPH D004*/
+ RTUNI_ALPHA, /* U+01307a: EGYPTIAN HIEROGLYPH D005*/
+ RTUNI_ALPHA, /* U+01307b: EGYPTIAN HIEROGLYPH D006*/
+ RTUNI_ALPHA, /* U+01307c: EGYPTIAN HIEROGLYPH D007*/
+ RTUNI_ALPHA, /* U+01307d: EGYPTIAN HIEROGLYPH D008*/
+ RTUNI_ALPHA, /* U+01307e: EGYPTIAN HIEROGLYPH D008A*/
+ RTUNI_ALPHA, /* U+01307f: EGYPTIAN HIEROGLYPH D009*/
+ RTUNI_ALPHA, /* U+013080: EGYPTIAN HIEROGLYPH D010*/
+ RTUNI_ALPHA, /* U+013081: EGYPTIAN HIEROGLYPH D011*/
+ RTUNI_ALPHA, /* U+013082: EGYPTIAN HIEROGLYPH D012*/
+ RTUNI_ALPHA, /* U+013083: EGYPTIAN HIEROGLYPH D013*/
+ RTUNI_ALPHA, /* U+013084: EGYPTIAN HIEROGLYPH D014*/
+ RTUNI_ALPHA, /* U+013085: EGYPTIAN HIEROGLYPH D015*/
+ RTUNI_ALPHA, /* U+013086: EGYPTIAN HIEROGLYPH D016*/
+ RTUNI_ALPHA, /* U+013087: EGYPTIAN HIEROGLYPH D017*/
+ RTUNI_ALPHA, /* U+013088: EGYPTIAN HIEROGLYPH D018*/
+ RTUNI_ALPHA, /* U+013089: EGYPTIAN HIEROGLYPH D019*/
+ RTUNI_ALPHA, /* U+01308a: EGYPTIAN HIEROGLYPH D020*/
+ RTUNI_ALPHA, /* U+01308b: EGYPTIAN HIEROGLYPH D021*/
+ RTUNI_ALPHA, /* U+01308c: EGYPTIAN HIEROGLYPH D022*/
+ RTUNI_ALPHA, /* U+01308d: EGYPTIAN HIEROGLYPH D023*/
+ RTUNI_ALPHA, /* U+01308e: EGYPTIAN HIEROGLYPH D024*/
+ RTUNI_ALPHA, /* U+01308f: EGYPTIAN HIEROGLYPH D025*/
+ RTUNI_ALPHA, /* U+013090: EGYPTIAN HIEROGLYPH D026*/
+ RTUNI_ALPHA, /* U+013091: EGYPTIAN HIEROGLYPH D027*/
+ RTUNI_ALPHA, /* U+013092: EGYPTIAN HIEROGLYPH D027A*/
+ RTUNI_ALPHA, /* U+013093: EGYPTIAN HIEROGLYPH D028*/
+ RTUNI_ALPHA, /* U+013094: EGYPTIAN HIEROGLYPH D029*/
+ RTUNI_ALPHA, /* U+013095: EGYPTIAN HIEROGLYPH D030*/
+ RTUNI_ALPHA, /* U+013096: EGYPTIAN HIEROGLYPH D031*/
+ RTUNI_ALPHA, /* U+013097: EGYPTIAN HIEROGLYPH D031A*/
+ RTUNI_ALPHA, /* U+013098: EGYPTIAN HIEROGLYPH D032*/
+ RTUNI_ALPHA, /* U+013099: EGYPTIAN HIEROGLYPH D033*/
+ RTUNI_ALPHA, /* U+01309a: EGYPTIAN HIEROGLYPH D034*/
+ RTUNI_ALPHA, /* U+01309b: EGYPTIAN HIEROGLYPH D034A*/
+ RTUNI_ALPHA, /* U+01309c: EGYPTIAN HIEROGLYPH D035*/
+ RTUNI_ALPHA, /* U+01309d: EGYPTIAN HIEROGLYPH D036*/
+ RTUNI_ALPHA, /* U+01309e: EGYPTIAN HIEROGLYPH D037*/
+ RTUNI_ALPHA, /* U+01309f: EGYPTIAN HIEROGLYPH D038*/
+ RTUNI_ALPHA, /* U+0130a0: EGYPTIAN HIEROGLYPH D039*/
+ RTUNI_ALPHA, /* U+0130a1: EGYPTIAN HIEROGLYPH D040*/
+ RTUNI_ALPHA, /* U+0130a2: EGYPTIAN HIEROGLYPH D041*/
+ RTUNI_ALPHA, /* U+0130a3: EGYPTIAN HIEROGLYPH D042*/
+ RTUNI_ALPHA, /* U+0130a4: EGYPTIAN HIEROGLYPH D043*/
+ RTUNI_ALPHA, /* U+0130a5: EGYPTIAN HIEROGLYPH D044*/
+ RTUNI_ALPHA, /* U+0130a6: EGYPTIAN HIEROGLYPH D045*/
+ RTUNI_ALPHA, /* U+0130a7: EGYPTIAN HIEROGLYPH D046*/
+ RTUNI_ALPHA, /* U+0130a8: EGYPTIAN HIEROGLYPH D046A*/
+ RTUNI_ALPHA, /* U+0130a9: EGYPTIAN HIEROGLYPH D047*/
+ RTUNI_ALPHA, /* U+0130aa: EGYPTIAN HIEROGLYPH D048*/
+ RTUNI_ALPHA, /* U+0130ab: EGYPTIAN HIEROGLYPH D048A*/
+ RTUNI_ALPHA, /* U+0130ac: EGYPTIAN HIEROGLYPH D049*/
+ RTUNI_ALPHA, /* U+0130ad: EGYPTIAN HIEROGLYPH D050*/
+ RTUNI_ALPHA, /* U+0130ae: EGYPTIAN HIEROGLYPH D050A*/
+ RTUNI_ALPHA, /* U+0130af: EGYPTIAN HIEROGLYPH D050B*/
+ RTUNI_ALPHA, /* U+0130b0: EGYPTIAN HIEROGLYPH D050C*/
+ RTUNI_ALPHA, /* U+0130b1: EGYPTIAN HIEROGLYPH D050D*/
+ RTUNI_ALPHA, /* U+0130b2: EGYPTIAN HIEROGLYPH D050E*/
+ RTUNI_ALPHA, /* U+0130b3: EGYPTIAN HIEROGLYPH D050F*/
+ RTUNI_ALPHA, /* U+0130b4: EGYPTIAN HIEROGLYPH D050G*/
+ RTUNI_ALPHA, /* U+0130b5: EGYPTIAN HIEROGLYPH D050H*/
+ RTUNI_ALPHA, /* U+0130b6: EGYPTIAN HIEROGLYPH D050I*/
+ RTUNI_ALPHA, /* U+0130b7: EGYPTIAN HIEROGLYPH D051*/
+ RTUNI_ALPHA, /* U+0130b8: EGYPTIAN HIEROGLYPH D052*/
+ RTUNI_ALPHA, /* U+0130b9: EGYPTIAN HIEROGLYPH D052A*/
+ RTUNI_ALPHA, /* U+0130ba: EGYPTIAN HIEROGLYPH D053*/
+ RTUNI_ALPHA, /* U+0130bb: EGYPTIAN HIEROGLYPH D054*/
+ RTUNI_ALPHA, /* U+0130bc: EGYPTIAN HIEROGLYPH D054A*/
+ RTUNI_ALPHA, /* U+0130bd: EGYPTIAN HIEROGLYPH D055*/
+ RTUNI_ALPHA, /* U+0130be: EGYPTIAN HIEROGLYPH D056*/
+ RTUNI_ALPHA, /* U+0130bf: EGYPTIAN HIEROGLYPH D057*/
+ RTUNI_ALPHA, /* U+0130c0: EGYPTIAN HIEROGLYPH D058*/
+ RTUNI_ALPHA, /* U+0130c1: EGYPTIAN HIEROGLYPH D059*/
+ RTUNI_ALPHA, /* U+0130c2: EGYPTIAN HIEROGLYPH D060*/
+ RTUNI_ALPHA, /* U+0130c3: EGYPTIAN HIEROGLYPH D061*/
+ RTUNI_ALPHA, /* U+0130c4: EGYPTIAN HIEROGLYPH D062*/
+ RTUNI_ALPHA, /* U+0130c5: EGYPTIAN HIEROGLYPH D063*/
+ RTUNI_ALPHA, /* U+0130c6: EGYPTIAN HIEROGLYPH D064*/
+ RTUNI_ALPHA, /* U+0130c7: EGYPTIAN HIEROGLYPH D065*/
+ RTUNI_ALPHA, /* U+0130c8: EGYPTIAN HIEROGLYPH D066*/
+ RTUNI_ALPHA, /* U+0130c9: EGYPTIAN HIEROGLYPH D067*/
+ RTUNI_ALPHA, /* U+0130ca: EGYPTIAN HIEROGLYPH D067A*/
+ RTUNI_ALPHA, /* U+0130cb: EGYPTIAN HIEROGLYPH D067B*/
+ RTUNI_ALPHA, /* U+0130cc: EGYPTIAN HIEROGLYPH D067C*/
+ RTUNI_ALPHA, /* U+0130cd: EGYPTIAN HIEROGLYPH D067D*/
+ RTUNI_ALPHA, /* U+0130ce: EGYPTIAN HIEROGLYPH D067E*/
+ RTUNI_ALPHA, /* U+0130cf: EGYPTIAN HIEROGLYPH D067F*/
+ RTUNI_ALPHA, /* U+0130d0: EGYPTIAN HIEROGLYPH D067G*/
+ RTUNI_ALPHA, /* U+0130d1: EGYPTIAN HIEROGLYPH D067H*/
+ RTUNI_ALPHA, /* U+0130d2: EGYPTIAN HIEROGLYPH E001*/
+ RTUNI_ALPHA, /* U+0130d3: EGYPTIAN HIEROGLYPH E002*/
+ RTUNI_ALPHA, /* U+0130d4: EGYPTIAN HIEROGLYPH E003*/
+ RTUNI_ALPHA, /* U+0130d5: EGYPTIAN HIEROGLYPH E004*/
+ RTUNI_ALPHA, /* U+0130d6: EGYPTIAN HIEROGLYPH E005*/
+ RTUNI_ALPHA, /* U+0130d7: EGYPTIAN HIEROGLYPH E006*/
+ RTUNI_ALPHA, /* U+0130d8: EGYPTIAN HIEROGLYPH E007*/
+ RTUNI_ALPHA, /* U+0130d9: EGYPTIAN HIEROGLYPH E008*/
+ RTUNI_ALPHA, /* U+0130da: EGYPTIAN HIEROGLYPH E008A*/
+ RTUNI_ALPHA, /* U+0130db: EGYPTIAN HIEROGLYPH E009*/
+ RTUNI_ALPHA, /* U+0130dc: EGYPTIAN HIEROGLYPH E009A*/
+ RTUNI_ALPHA, /* U+0130dd: EGYPTIAN HIEROGLYPH E010*/
+ RTUNI_ALPHA, /* U+0130de: EGYPTIAN HIEROGLYPH E011*/
+ RTUNI_ALPHA, /* U+0130df: EGYPTIAN HIEROGLYPH E012*/
+ RTUNI_ALPHA, /* U+0130e0: EGYPTIAN HIEROGLYPH E013*/
+ RTUNI_ALPHA, /* U+0130e1: EGYPTIAN HIEROGLYPH E014*/
+ RTUNI_ALPHA, /* U+0130e2: EGYPTIAN HIEROGLYPH E015*/
+ RTUNI_ALPHA, /* U+0130e3: EGYPTIAN HIEROGLYPH E016*/
+ RTUNI_ALPHA, /* U+0130e4: EGYPTIAN HIEROGLYPH E016A*/
+ RTUNI_ALPHA, /* U+0130e5: EGYPTIAN HIEROGLYPH E017*/
+ RTUNI_ALPHA, /* U+0130e6: EGYPTIAN HIEROGLYPH E017A*/
+ RTUNI_ALPHA, /* U+0130e7: EGYPTIAN HIEROGLYPH E018*/
+ RTUNI_ALPHA, /* U+0130e8: EGYPTIAN HIEROGLYPH E019*/
+ RTUNI_ALPHA, /* U+0130e9: EGYPTIAN HIEROGLYPH E020*/
+ RTUNI_ALPHA, /* U+0130ea: EGYPTIAN HIEROGLYPH E020A*/
+ RTUNI_ALPHA, /* U+0130eb: EGYPTIAN HIEROGLYPH E021*/
+ RTUNI_ALPHA, /* U+0130ec: EGYPTIAN HIEROGLYPH E022*/
+ RTUNI_ALPHA, /* U+0130ed: EGYPTIAN HIEROGLYPH E023*/
+ RTUNI_ALPHA, /* U+0130ee: EGYPTIAN HIEROGLYPH E024*/
+ RTUNI_ALPHA, /* U+0130ef: EGYPTIAN HIEROGLYPH E025*/
+ RTUNI_ALPHA, /* U+0130f0: EGYPTIAN HIEROGLYPH E026*/
+ RTUNI_ALPHA, /* U+0130f1: EGYPTIAN HIEROGLYPH E027*/
+ RTUNI_ALPHA, /* U+0130f2: EGYPTIAN HIEROGLYPH E028*/
+ RTUNI_ALPHA, /* U+0130f3: EGYPTIAN HIEROGLYPH E028A*/
+ RTUNI_ALPHA, /* U+0130f4: EGYPTIAN HIEROGLYPH E029*/
+ RTUNI_ALPHA, /* U+0130f5: EGYPTIAN HIEROGLYPH E030*/
+ RTUNI_ALPHA, /* U+0130f6: EGYPTIAN HIEROGLYPH E031*/
+ RTUNI_ALPHA, /* U+0130f7: EGYPTIAN HIEROGLYPH E032*/
+ RTUNI_ALPHA, /* U+0130f8: EGYPTIAN HIEROGLYPH E033*/
+ RTUNI_ALPHA, /* U+0130f9: EGYPTIAN HIEROGLYPH E034*/
+ RTUNI_ALPHA, /* U+0130fa: EGYPTIAN HIEROGLYPH E034A*/
+ RTUNI_ALPHA, /* U+0130fb: EGYPTIAN HIEROGLYPH E036*/
+ RTUNI_ALPHA, /* U+0130fc: EGYPTIAN HIEROGLYPH E037*/
+ RTUNI_ALPHA, /* U+0130fd: EGYPTIAN HIEROGLYPH E038*/
+ RTUNI_ALPHA, /* U+0130fe: EGYPTIAN HIEROGLYPH F001*/
+ RTUNI_ALPHA, /* U+0130ff: EGYPTIAN HIEROGLYPH F001A*/
+ RTUNI_ALPHA, /* U+013100: EGYPTIAN HIEROGLYPH F002*/
+ RTUNI_ALPHA, /* U+013101: EGYPTIAN HIEROGLYPH F003*/
+ RTUNI_ALPHA, /* U+013102: EGYPTIAN HIEROGLYPH F004*/
+ RTUNI_ALPHA, /* U+013103: EGYPTIAN HIEROGLYPH F005*/
+ RTUNI_ALPHA, /* U+013104: EGYPTIAN HIEROGLYPH F006*/
+ RTUNI_ALPHA, /* U+013105: EGYPTIAN HIEROGLYPH F007*/
+ RTUNI_ALPHA, /* U+013106: EGYPTIAN HIEROGLYPH F008*/
+ RTUNI_ALPHA, /* U+013107: EGYPTIAN HIEROGLYPH F009*/
+ RTUNI_ALPHA, /* U+013108: EGYPTIAN HIEROGLYPH F010*/
+ RTUNI_ALPHA, /* U+013109: EGYPTIAN HIEROGLYPH F011*/
+ RTUNI_ALPHA, /* U+01310a: EGYPTIAN HIEROGLYPH F012*/
+ RTUNI_ALPHA, /* U+01310b: EGYPTIAN HIEROGLYPH F013*/
+ RTUNI_ALPHA, /* U+01310c: EGYPTIAN HIEROGLYPH F013A*/
+ RTUNI_ALPHA, /* U+01310d: EGYPTIAN HIEROGLYPH F014*/
+ RTUNI_ALPHA, /* U+01310e: EGYPTIAN HIEROGLYPH F015*/
+ RTUNI_ALPHA, /* U+01310f: EGYPTIAN HIEROGLYPH F016*/
+ RTUNI_ALPHA, /* U+013110: EGYPTIAN HIEROGLYPH F017*/
+ RTUNI_ALPHA, /* U+013111: EGYPTIAN HIEROGLYPH F018*/
+ RTUNI_ALPHA, /* U+013112: EGYPTIAN HIEROGLYPH F019*/
+ RTUNI_ALPHA, /* U+013113: EGYPTIAN HIEROGLYPH F020*/
+ RTUNI_ALPHA, /* U+013114: EGYPTIAN HIEROGLYPH F021*/
+ RTUNI_ALPHA, /* U+013115: EGYPTIAN HIEROGLYPH F021A*/
+ RTUNI_ALPHA, /* U+013116: EGYPTIAN HIEROGLYPH F022*/
+ RTUNI_ALPHA, /* U+013117: EGYPTIAN HIEROGLYPH F023*/
+ RTUNI_ALPHA, /* U+013118: EGYPTIAN HIEROGLYPH F024*/
+ RTUNI_ALPHA, /* U+013119: EGYPTIAN HIEROGLYPH F025*/
+ RTUNI_ALPHA, /* U+01311a: EGYPTIAN HIEROGLYPH F026*/
+ RTUNI_ALPHA, /* U+01311b: EGYPTIAN HIEROGLYPH F027*/
+ RTUNI_ALPHA, /* U+01311c: EGYPTIAN HIEROGLYPH F028*/
+ RTUNI_ALPHA, /* U+01311d: EGYPTIAN HIEROGLYPH F029*/
+ RTUNI_ALPHA, /* U+01311e: EGYPTIAN HIEROGLYPH F030*/
+ RTUNI_ALPHA, /* U+01311f: EGYPTIAN HIEROGLYPH F031*/
+ RTUNI_ALPHA, /* U+013120: EGYPTIAN HIEROGLYPH F031A*/
+ RTUNI_ALPHA, /* U+013121: EGYPTIAN HIEROGLYPH F032*/
+ RTUNI_ALPHA, /* U+013122: EGYPTIAN HIEROGLYPH F033*/
+ RTUNI_ALPHA, /* U+013123: EGYPTIAN HIEROGLYPH F034*/
+ RTUNI_ALPHA, /* U+013124: EGYPTIAN HIEROGLYPH F035*/
+ RTUNI_ALPHA, /* U+013125: EGYPTIAN HIEROGLYPH F036*/
+ RTUNI_ALPHA, /* U+013126: EGYPTIAN HIEROGLYPH F037*/
+ RTUNI_ALPHA, /* U+013127: EGYPTIAN HIEROGLYPH F037A*/
+ RTUNI_ALPHA, /* U+013128: EGYPTIAN HIEROGLYPH F038*/
+ RTUNI_ALPHA, /* U+013129: EGYPTIAN HIEROGLYPH F038A*/
+ RTUNI_ALPHA, /* U+01312a: EGYPTIAN HIEROGLYPH F039*/
+ RTUNI_ALPHA, /* U+01312b: EGYPTIAN HIEROGLYPH F040*/
+ RTUNI_ALPHA, /* U+01312c: EGYPTIAN HIEROGLYPH F041*/
+ RTUNI_ALPHA, /* U+01312d: EGYPTIAN HIEROGLYPH F042*/
+ RTUNI_ALPHA, /* U+01312e: EGYPTIAN HIEROGLYPH F043*/
+ RTUNI_ALPHA, /* U+01312f: EGYPTIAN HIEROGLYPH F044*/
+ RTUNI_ALPHA, /* U+013130: EGYPTIAN HIEROGLYPH F045*/
+ RTUNI_ALPHA, /* U+013131: EGYPTIAN HIEROGLYPH F045A*/
+ RTUNI_ALPHA, /* U+013132: EGYPTIAN HIEROGLYPH F046*/
+ RTUNI_ALPHA, /* U+013133: EGYPTIAN HIEROGLYPH F046A*/
+ RTUNI_ALPHA, /* U+013134: EGYPTIAN HIEROGLYPH F047*/
+ RTUNI_ALPHA, /* U+013135: EGYPTIAN HIEROGLYPH F047A*/
+ RTUNI_ALPHA, /* U+013136: EGYPTIAN HIEROGLYPH F048*/
+ RTUNI_ALPHA, /* U+013137: EGYPTIAN HIEROGLYPH F049*/
+ RTUNI_ALPHA, /* U+013138: EGYPTIAN HIEROGLYPH F050*/
+ RTUNI_ALPHA, /* U+013139: EGYPTIAN HIEROGLYPH F051*/
+ RTUNI_ALPHA, /* U+01313a: EGYPTIAN HIEROGLYPH F051A*/
+ RTUNI_ALPHA, /* U+01313b: EGYPTIAN HIEROGLYPH F051B*/
+ RTUNI_ALPHA, /* U+01313c: EGYPTIAN HIEROGLYPH F051C*/
+ RTUNI_ALPHA, /* U+01313d: EGYPTIAN HIEROGLYPH F052*/
+ RTUNI_ALPHA, /* U+01313e: EGYPTIAN HIEROGLYPH F053*/
+ RTUNI_ALPHA, /* U+01313f: EGYPTIAN HIEROGLYPH G001*/
+ RTUNI_ALPHA, /* U+013140: EGYPTIAN HIEROGLYPH G002*/
+ RTUNI_ALPHA, /* U+013141: EGYPTIAN HIEROGLYPH G003*/
+ RTUNI_ALPHA, /* U+013142: EGYPTIAN HIEROGLYPH G004*/
+ RTUNI_ALPHA, /* U+013143: EGYPTIAN HIEROGLYPH G005*/
+ RTUNI_ALPHA, /* U+013144: EGYPTIAN HIEROGLYPH G006*/
+ RTUNI_ALPHA, /* U+013145: EGYPTIAN HIEROGLYPH G006A*/
+ RTUNI_ALPHA, /* U+013146: EGYPTIAN HIEROGLYPH G007*/
+ RTUNI_ALPHA, /* U+013147: EGYPTIAN HIEROGLYPH G007A*/
+ RTUNI_ALPHA, /* U+013148: EGYPTIAN HIEROGLYPH G007B*/
+ RTUNI_ALPHA, /* U+013149: EGYPTIAN HIEROGLYPH G008*/
+ RTUNI_ALPHA, /* U+01314a: EGYPTIAN HIEROGLYPH G009*/
+ RTUNI_ALPHA, /* U+01314b: EGYPTIAN HIEROGLYPH G010*/
+ RTUNI_ALPHA, /* U+01314c: EGYPTIAN HIEROGLYPH G011*/
+ RTUNI_ALPHA, /* U+01314d: EGYPTIAN HIEROGLYPH G011A*/
+ RTUNI_ALPHA, /* U+01314e: EGYPTIAN HIEROGLYPH G012*/
+ RTUNI_ALPHA, /* U+01314f: EGYPTIAN HIEROGLYPH G013*/
+ RTUNI_ALPHA, /* U+013150: EGYPTIAN HIEROGLYPH G014*/
+ RTUNI_ALPHA, /* U+013151: EGYPTIAN HIEROGLYPH G015*/
+ RTUNI_ALPHA, /* U+013152: EGYPTIAN HIEROGLYPH G016*/
+ RTUNI_ALPHA, /* U+013153: EGYPTIAN HIEROGLYPH G017*/
+ RTUNI_ALPHA, /* U+013154: EGYPTIAN HIEROGLYPH G018*/
+ RTUNI_ALPHA, /* U+013155: EGYPTIAN HIEROGLYPH G019*/
+ RTUNI_ALPHA, /* U+013156: EGYPTIAN HIEROGLYPH G020*/
+ RTUNI_ALPHA, /* U+013157: EGYPTIAN HIEROGLYPH G020A*/
+ RTUNI_ALPHA, /* U+013158: EGYPTIAN HIEROGLYPH G021*/
+ RTUNI_ALPHA, /* U+013159: EGYPTIAN HIEROGLYPH G022*/
+ RTUNI_ALPHA, /* U+01315a: EGYPTIAN HIEROGLYPH G023*/
+ RTUNI_ALPHA, /* U+01315b: EGYPTIAN HIEROGLYPH G024*/
+ RTUNI_ALPHA, /* U+01315c: EGYPTIAN HIEROGLYPH G025*/
+ RTUNI_ALPHA, /* U+01315d: EGYPTIAN HIEROGLYPH G026*/
+ RTUNI_ALPHA, /* U+01315e: EGYPTIAN HIEROGLYPH G026A*/
+ RTUNI_ALPHA, /* U+01315f: EGYPTIAN HIEROGLYPH G027*/
+ RTUNI_ALPHA, /* U+013160: EGYPTIAN HIEROGLYPH G028*/
+ RTUNI_ALPHA, /* U+013161: EGYPTIAN HIEROGLYPH G029*/
+ RTUNI_ALPHA, /* U+013162: EGYPTIAN HIEROGLYPH G030*/
+ RTUNI_ALPHA, /* U+013163: EGYPTIAN HIEROGLYPH G031*/
+ RTUNI_ALPHA, /* U+013164: EGYPTIAN HIEROGLYPH G032*/
+ RTUNI_ALPHA, /* U+013165: EGYPTIAN HIEROGLYPH G033*/
+ RTUNI_ALPHA, /* U+013166: EGYPTIAN HIEROGLYPH G034*/
+ RTUNI_ALPHA, /* U+013167: EGYPTIAN HIEROGLYPH G035*/
+ RTUNI_ALPHA, /* U+013168: EGYPTIAN HIEROGLYPH G036*/
+ RTUNI_ALPHA, /* U+013169: EGYPTIAN HIEROGLYPH G036A*/
+ RTUNI_ALPHA, /* U+01316a: EGYPTIAN HIEROGLYPH G037*/
+ RTUNI_ALPHA, /* U+01316b: EGYPTIAN HIEROGLYPH G037A*/
+ RTUNI_ALPHA, /* U+01316c: EGYPTIAN HIEROGLYPH G038*/
+ RTUNI_ALPHA, /* U+01316d: EGYPTIAN HIEROGLYPH G039*/
+ RTUNI_ALPHA, /* U+01316e: EGYPTIAN HIEROGLYPH G040*/
+ RTUNI_ALPHA, /* U+01316f: EGYPTIAN HIEROGLYPH G041*/
+ RTUNI_ALPHA, /* U+013170: EGYPTIAN HIEROGLYPH G042*/
+ RTUNI_ALPHA, /* U+013171: EGYPTIAN HIEROGLYPH G043*/
+ RTUNI_ALPHA, /* U+013172: EGYPTIAN HIEROGLYPH G043A*/
+ RTUNI_ALPHA, /* U+013173: EGYPTIAN HIEROGLYPH G044*/
+ RTUNI_ALPHA, /* U+013174: EGYPTIAN HIEROGLYPH G045*/
+ RTUNI_ALPHA, /* U+013175: EGYPTIAN HIEROGLYPH G045A*/
+ RTUNI_ALPHA, /* U+013176: EGYPTIAN HIEROGLYPH G046*/
+ RTUNI_ALPHA, /* U+013177: EGYPTIAN HIEROGLYPH G047*/
+ RTUNI_ALPHA, /* U+013178: EGYPTIAN HIEROGLYPH G048*/
+ RTUNI_ALPHA, /* U+013179: EGYPTIAN HIEROGLYPH G049*/
+ RTUNI_ALPHA, /* U+01317a: EGYPTIAN HIEROGLYPH G050*/
+ RTUNI_ALPHA, /* U+01317b: EGYPTIAN HIEROGLYPH G051*/
+ RTUNI_ALPHA, /* U+01317c: EGYPTIAN HIEROGLYPH G052*/
+ RTUNI_ALPHA, /* U+01317d: EGYPTIAN HIEROGLYPH G053*/
+ RTUNI_ALPHA, /* U+01317e: EGYPTIAN HIEROGLYPH G054*/
+ RTUNI_ALPHA, /* U+01317f: EGYPTIAN HIEROGLYPH H001*/
+ RTUNI_ALPHA, /* U+013180: EGYPTIAN HIEROGLYPH H002*/
+ RTUNI_ALPHA, /* U+013181: EGYPTIAN HIEROGLYPH H003*/
+ RTUNI_ALPHA, /* U+013182: EGYPTIAN HIEROGLYPH H004*/
+ RTUNI_ALPHA, /* U+013183: EGYPTIAN HIEROGLYPH H005*/
+ RTUNI_ALPHA, /* U+013184: EGYPTIAN HIEROGLYPH H006*/
+ RTUNI_ALPHA, /* U+013185: EGYPTIAN HIEROGLYPH H006A*/
+ RTUNI_ALPHA, /* U+013186: EGYPTIAN HIEROGLYPH H007*/
+ RTUNI_ALPHA, /* U+013187: EGYPTIAN HIEROGLYPH H008*/
+ RTUNI_ALPHA, /* U+013188: EGYPTIAN HIEROGLYPH I001*/
+ RTUNI_ALPHA, /* U+013189: EGYPTIAN HIEROGLYPH I002*/
+ RTUNI_ALPHA, /* U+01318a: EGYPTIAN HIEROGLYPH I003*/
+ RTUNI_ALPHA, /* U+01318b: EGYPTIAN HIEROGLYPH I004*/
+ RTUNI_ALPHA, /* U+01318c: EGYPTIAN HIEROGLYPH I005*/
+ RTUNI_ALPHA, /* U+01318d: EGYPTIAN HIEROGLYPH I005A*/
+ RTUNI_ALPHA, /* U+01318e: EGYPTIAN HIEROGLYPH I006*/
+ RTUNI_ALPHA, /* U+01318f: EGYPTIAN HIEROGLYPH I007*/
+ RTUNI_ALPHA, /* U+013190: EGYPTIAN HIEROGLYPH I008*/
+ RTUNI_ALPHA, /* U+013191: EGYPTIAN HIEROGLYPH I009*/
+ RTUNI_ALPHA, /* U+013192: EGYPTIAN HIEROGLYPH I009A*/
+ RTUNI_ALPHA, /* U+013193: EGYPTIAN HIEROGLYPH I010*/
+ RTUNI_ALPHA, /* U+013194: EGYPTIAN HIEROGLYPH I010A*/
+ RTUNI_ALPHA, /* U+013195: EGYPTIAN HIEROGLYPH I011*/
+ RTUNI_ALPHA, /* U+013196: EGYPTIAN HIEROGLYPH I011A*/
+ RTUNI_ALPHA, /* U+013197: EGYPTIAN HIEROGLYPH I012*/
+ RTUNI_ALPHA, /* U+013198: EGYPTIAN HIEROGLYPH I013*/
+ RTUNI_ALPHA, /* U+013199: EGYPTIAN HIEROGLYPH I014*/
+ RTUNI_ALPHA, /* U+01319a: EGYPTIAN HIEROGLYPH I015*/
+ RTUNI_ALPHA, /* U+01319b: EGYPTIAN HIEROGLYPH K001*/
+ RTUNI_ALPHA, /* U+01319c: EGYPTIAN HIEROGLYPH K002*/
+ RTUNI_ALPHA, /* U+01319d: EGYPTIAN HIEROGLYPH K003*/
+ RTUNI_ALPHA, /* U+01319e: EGYPTIAN HIEROGLYPH K004*/
+ RTUNI_ALPHA, /* U+01319f: EGYPTIAN HIEROGLYPH K005*/
+ RTUNI_ALPHA, /* U+0131a0: EGYPTIAN HIEROGLYPH K006*/
+ RTUNI_ALPHA, /* U+0131a1: EGYPTIAN HIEROGLYPH K007*/
+ RTUNI_ALPHA, /* U+0131a2: EGYPTIAN HIEROGLYPH K008*/
+ RTUNI_ALPHA, /* U+0131a3: EGYPTIAN HIEROGLYPH L001*/
+ RTUNI_ALPHA, /* U+0131a4: EGYPTIAN HIEROGLYPH L002*/
+ RTUNI_ALPHA, /* U+0131a5: EGYPTIAN HIEROGLYPH L002A*/
+ RTUNI_ALPHA, /* U+0131a6: EGYPTIAN HIEROGLYPH L003*/
+ RTUNI_ALPHA, /* U+0131a7: EGYPTIAN HIEROGLYPH L004*/
+ RTUNI_ALPHA, /* U+0131a8: EGYPTIAN HIEROGLYPH L005*/
+ RTUNI_ALPHA, /* U+0131a9: EGYPTIAN HIEROGLYPH L006*/
+ RTUNI_ALPHA, /* U+0131aa: EGYPTIAN HIEROGLYPH L006A*/
+ RTUNI_ALPHA, /* U+0131ab: EGYPTIAN HIEROGLYPH L007*/
+ RTUNI_ALPHA, /* U+0131ac: EGYPTIAN HIEROGLYPH L008*/
+ RTUNI_ALPHA, /* U+0131ad: EGYPTIAN HIEROGLYPH M001*/
+ RTUNI_ALPHA, /* U+0131ae: EGYPTIAN HIEROGLYPH M001A*/
+ RTUNI_ALPHA, /* U+0131af: EGYPTIAN HIEROGLYPH M001B*/
+ RTUNI_ALPHA, /* U+0131b0: EGYPTIAN HIEROGLYPH M002*/
+ RTUNI_ALPHA, /* U+0131b1: EGYPTIAN HIEROGLYPH M003*/
+ RTUNI_ALPHA, /* U+0131b2: EGYPTIAN HIEROGLYPH M003A*/
+ RTUNI_ALPHA, /* U+0131b3: EGYPTIAN HIEROGLYPH M004*/
+ RTUNI_ALPHA, /* U+0131b4: EGYPTIAN HIEROGLYPH M005*/
+ RTUNI_ALPHA, /* U+0131b5: EGYPTIAN HIEROGLYPH M006*/
+ RTUNI_ALPHA, /* U+0131b6: EGYPTIAN HIEROGLYPH M007*/
+ RTUNI_ALPHA, /* U+0131b7: EGYPTIAN HIEROGLYPH M008*/
+ RTUNI_ALPHA, /* U+0131b8: EGYPTIAN HIEROGLYPH M009*/
+ RTUNI_ALPHA, /* U+0131b9: EGYPTIAN HIEROGLYPH M010*/
+ RTUNI_ALPHA, /* U+0131ba: EGYPTIAN HIEROGLYPH M010A*/
+ RTUNI_ALPHA, /* U+0131bb: EGYPTIAN HIEROGLYPH M011*/
+ RTUNI_ALPHA, /* U+0131bc: EGYPTIAN HIEROGLYPH M012*/
+ RTUNI_ALPHA, /* U+0131bd: EGYPTIAN HIEROGLYPH M012A*/
+ RTUNI_ALPHA, /* U+0131be: EGYPTIAN HIEROGLYPH M012B*/
+ RTUNI_ALPHA, /* U+0131bf: EGYPTIAN HIEROGLYPH M012C*/
+ RTUNI_ALPHA, /* U+0131c0: EGYPTIAN HIEROGLYPH M012D*/
+ RTUNI_ALPHA, /* U+0131c1: EGYPTIAN HIEROGLYPH M012E*/
+ RTUNI_ALPHA, /* U+0131c2: EGYPTIAN HIEROGLYPH M012F*/
+ RTUNI_ALPHA, /* U+0131c3: EGYPTIAN HIEROGLYPH M012G*/
+ RTUNI_ALPHA, /* U+0131c4: EGYPTIAN HIEROGLYPH M012H*/
+ RTUNI_ALPHA, /* U+0131c5: EGYPTIAN HIEROGLYPH M013*/
+ RTUNI_ALPHA, /* U+0131c6: EGYPTIAN HIEROGLYPH M014*/
+ RTUNI_ALPHA, /* U+0131c7: EGYPTIAN HIEROGLYPH M015*/
+ RTUNI_ALPHA, /* U+0131c8: EGYPTIAN HIEROGLYPH M015A*/
+ RTUNI_ALPHA, /* U+0131c9: EGYPTIAN HIEROGLYPH M016*/
+ RTUNI_ALPHA, /* U+0131ca: EGYPTIAN HIEROGLYPH M016A*/
+ RTUNI_ALPHA, /* U+0131cb: EGYPTIAN HIEROGLYPH M017*/
+ RTUNI_ALPHA, /* U+0131cc: EGYPTIAN HIEROGLYPH M017A*/
+ RTUNI_ALPHA, /* U+0131cd: EGYPTIAN HIEROGLYPH M018*/
+ RTUNI_ALPHA, /* U+0131ce: EGYPTIAN HIEROGLYPH M019*/
+ RTUNI_ALPHA, /* U+0131cf: EGYPTIAN HIEROGLYPH M020*/
+ RTUNI_ALPHA, /* U+0131d0: EGYPTIAN HIEROGLYPH M021*/
+ RTUNI_ALPHA, /* U+0131d1: EGYPTIAN HIEROGLYPH M022*/
+ RTUNI_ALPHA, /* U+0131d2: EGYPTIAN HIEROGLYPH M022A*/
+ RTUNI_ALPHA, /* U+0131d3: EGYPTIAN HIEROGLYPH M023*/
+ RTUNI_ALPHA, /* U+0131d4: EGYPTIAN HIEROGLYPH M024*/
+ RTUNI_ALPHA, /* U+0131d5: EGYPTIAN HIEROGLYPH M024A*/
+ RTUNI_ALPHA, /* U+0131d6: EGYPTIAN HIEROGLYPH M025*/
+ RTUNI_ALPHA, /* U+0131d7: EGYPTIAN HIEROGLYPH M026*/
+ RTUNI_ALPHA, /* U+0131d8: EGYPTIAN HIEROGLYPH M027*/
+ RTUNI_ALPHA, /* U+0131d9: EGYPTIAN HIEROGLYPH M028*/
+ RTUNI_ALPHA, /* U+0131da: EGYPTIAN HIEROGLYPH M028A*/
+ RTUNI_ALPHA, /* U+0131db: EGYPTIAN HIEROGLYPH M029*/
+ RTUNI_ALPHA, /* U+0131dc: EGYPTIAN HIEROGLYPH M030*/
+ RTUNI_ALPHA, /* U+0131dd: EGYPTIAN HIEROGLYPH M031*/
+ RTUNI_ALPHA, /* U+0131de: EGYPTIAN HIEROGLYPH M031A*/
+ RTUNI_ALPHA, /* U+0131df: EGYPTIAN HIEROGLYPH M032*/
+ RTUNI_ALPHA, /* U+0131e0: EGYPTIAN HIEROGLYPH M033*/
+ RTUNI_ALPHA, /* U+0131e1: EGYPTIAN HIEROGLYPH M033A*/
+ RTUNI_ALPHA, /* U+0131e2: EGYPTIAN HIEROGLYPH M033B*/
+ RTUNI_ALPHA, /* U+0131e3: EGYPTIAN HIEROGLYPH M034*/
+ RTUNI_ALPHA, /* U+0131e4: EGYPTIAN HIEROGLYPH M035*/
+ RTUNI_ALPHA, /* U+0131e5: EGYPTIAN HIEROGLYPH M036*/
+ RTUNI_ALPHA, /* U+0131e6: EGYPTIAN HIEROGLYPH M037*/
+ RTUNI_ALPHA, /* U+0131e7: EGYPTIAN HIEROGLYPH M038*/
+ RTUNI_ALPHA, /* U+0131e8: EGYPTIAN HIEROGLYPH M039*/
+ RTUNI_ALPHA, /* U+0131e9: EGYPTIAN HIEROGLYPH M040*/
+ RTUNI_ALPHA, /* U+0131ea: EGYPTIAN HIEROGLYPH M040A*/
+ RTUNI_ALPHA, /* U+0131eb: EGYPTIAN HIEROGLYPH M041*/
+ RTUNI_ALPHA, /* U+0131ec: EGYPTIAN HIEROGLYPH M042*/
+ RTUNI_ALPHA, /* U+0131ed: EGYPTIAN HIEROGLYPH M043*/
+ RTUNI_ALPHA, /* U+0131ee: EGYPTIAN HIEROGLYPH M044*/
+ RTUNI_ALPHA, /* U+0131ef: EGYPTIAN HIEROGLYPH N001*/
+ RTUNI_ALPHA, /* U+0131f0: EGYPTIAN HIEROGLYPH N002*/
+ RTUNI_ALPHA, /* U+0131f1: EGYPTIAN HIEROGLYPH N003*/
+ RTUNI_ALPHA, /* U+0131f2: EGYPTIAN HIEROGLYPH N004*/
+ RTUNI_ALPHA, /* U+0131f3: EGYPTIAN HIEROGLYPH N005*/
+ RTUNI_ALPHA, /* U+0131f4: EGYPTIAN HIEROGLYPH N006*/
+ RTUNI_ALPHA, /* U+0131f5: EGYPTIAN HIEROGLYPH N007*/
+ RTUNI_ALPHA, /* U+0131f6: EGYPTIAN HIEROGLYPH N008*/
+ RTUNI_ALPHA, /* U+0131f7: EGYPTIAN HIEROGLYPH N009*/
+ RTUNI_ALPHA, /* U+0131f8: EGYPTIAN HIEROGLYPH N010*/
+ RTUNI_ALPHA, /* U+0131f9: EGYPTIAN HIEROGLYPH N011*/
+ RTUNI_ALPHA, /* U+0131fa: EGYPTIAN HIEROGLYPH N012*/
+ RTUNI_ALPHA, /* U+0131fb: EGYPTIAN HIEROGLYPH N013*/
+ RTUNI_ALPHA, /* U+0131fc: EGYPTIAN HIEROGLYPH N014*/
+ RTUNI_ALPHA, /* U+0131fd: EGYPTIAN HIEROGLYPH N015*/
+ RTUNI_ALPHA, /* U+0131fe: EGYPTIAN HIEROGLYPH N016*/
+ RTUNI_ALPHA, /* U+0131ff: EGYPTIAN HIEROGLYPH N017*/
+ RTUNI_ALPHA, /* U+013200: EGYPTIAN HIEROGLYPH N018*/
+ RTUNI_ALPHA, /* U+013201: EGYPTIAN HIEROGLYPH N018A*/
+ RTUNI_ALPHA, /* U+013202: EGYPTIAN HIEROGLYPH N018B*/
+ RTUNI_ALPHA, /* U+013203: EGYPTIAN HIEROGLYPH N019*/
+ RTUNI_ALPHA, /* U+013204: EGYPTIAN HIEROGLYPH N020*/
+ RTUNI_ALPHA, /* U+013205: EGYPTIAN HIEROGLYPH N021*/
+ RTUNI_ALPHA, /* U+013206: EGYPTIAN HIEROGLYPH N022*/
+ RTUNI_ALPHA, /* U+013207: EGYPTIAN HIEROGLYPH N023*/
+ RTUNI_ALPHA, /* U+013208: EGYPTIAN HIEROGLYPH N024*/
+ RTUNI_ALPHA, /* U+013209: EGYPTIAN HIEROGLYPH N025*/
+ RTUNI_ALPHA, /* U+01320a: EGYPTIAN HIEROGLYPH N025A*/
+ RTUNI_ALPHA, /* U+01320b: EGYPTIAN HIEROGLYPH N026*/
+ RTUNI_ALPHA, /* U+01320c: EGYPTIAN HIEROGLYPH N027*/
+ RTUNI_ALPHA, /* U+01320d: EGYPTIAN HIEROGLYPH N028*/
+ RTUNI_ALPHA, /* U+01320e: EGYPTIAN HIEROGLYPH N029*/
+ RTUNI_ALPHA, /* U+01320f: EGYPTIAN HIEROGLYPH N030*/
+ RTUNI_ALPHA, /* U+013210: EGYPTIAN HIEROGLYPH N031*/
+ RTUNI_ALPHA, /* U+013211: EGYPTIAN HIEROGLYPH N032*/
+ RTUNI_ALPHA, /* U+013212: EGYPTIAN HIEROGLYPH N033*/
+ RTUNI_ALPHA, /* U+013213: EGYPTIAN HIEROGLYPH N033A*/
+ RTUNI_ALPHA, /* U+013214: EGYPTIAN HIEROGLYPH N034*/
+ RTUNI_ALPHA, /* U+013215: EGYPTIAN HIEROGLYPH N034A*/
+ RTUNI_ALPHA, /* U+013216: EGYPTIAN HIEROGLYPH N035*/
+ RTUNI_ALPHA, /* U+013217: EGYPTIAN HIEROGLYPH N035A*/
+ RTUNI_ALPHA, /* U+013218: EGYPTIAN HIEROGLYPH N036*/
+ RTUNI_ALPHA, /* U+013219: EGYPTIAN HIEROGLYPH N037*/
+ RTUNI_ALPHA, /* U+01321a: EGYPTIAN HIEROGLYPH N037A*/
+ RTUNI_ALPHA, /* U+01321b: EGYPTIAN HIEROGLYPH N038*/
+ RTUNI_ALPHA, /* U+01321c: EGYPTIAN HIEROGLYPH N039*/
+ RTUNI_ALPHA, /* U+01321d: EGYPTIAN HIEROGLYPH N040*/
+ RTUNI_ALPHA, /* U+01321e: EGYPTIAN HIEROGLYPH N041*/
+ RTUNI_ALPHA, /* U+01321f: EGYPTIAN HIEROGLYPH N042*/
+ RTUNI_ALPHA, /* U+013220: EGYPTIAN HIEROGLYPH NL001*/
+ RTUNI_ALPHA, /* U+013221: EGYPTIAN HIEROGLYPH NL002*/
+ RTUNI_ALPHA, /* U+013222: EGYPTIAN HIEROGLYPH NL003*/
+ RTUNI_ALPHA, /* U+013223: EGYPTIAN HIEROGLYPH NL004*/
+ RTUNI_ALPHA, /* U+013224: EGYPTIAN HIEROGLYPH NL005*/
+ RTUNI_ALPHA, /* U+013225: EGYPTIAN HIEROGLYPH NL005A*/
+ RTUNI_ALPHA, /* U+013226: EGYPTIAN HIEROGLYPH NL006*/
+ RTUNI_ALPHA, /* U+013227: EGYPTIAN HIEROGLYPH NL007*/
+ RTUNI_ALPHA, /* U+013228: EGYPTIAN HIEROGLYPH NL008*/
+ RTUNI_ALPHA, /* U+013229: EGYPTIAN HIEROGLYPH NL009*/
+ RTUNI_ALPHA, /* U+01322a: EGYPTIAN HIEROGLYPH NL010*/
+ RTUNI_ALPHA, /* U+01322b: EGYPTIAN HIEROGLYPH NL011*/
+ RTUNI_ALPHA, /* U+01322c: EGYPTIAN HIEROGLYPH NL012*/
+ RTUNI_ALPHA, /* U+01322d: EGYPTIAN HIEROGLYPH NL013*/
+ RTUNI_ALPHA, /* U+01322e: EGYPTIAN HIEROGLYPH NL014*/
+ RTUNI_ALPHA, /* U+01322f: EGYPTIAN HIEROGLYPH NL015*/
+ RTUNI_ALPHA, /* U+013230: EGYPTIAN HIEROGLYPH NL016*/
+ RTUNI_ALPHA, /* U+013231: EGYPTIAN HIEROGLYPH NL017*/
+ RTUNI_ALPHA, /* U+013232: EGYPTIAN HIEROGLYPH NL017A*/
+ RTUNI_ALPHA, /* U+013233: EGYPTIAN HIEROGLYPH NL018*/
+ RTUNI_ALPHA, /* U+013234: EGYPTIAN HIEROGLYPH NL019*/
+ RTUNI_ALPHA, /* U+013235: EGYPTIAN HIEROGLYPH NL020*/
+ RTUNI_ALPHA, /* U+013236: EGYPTIAN HIEROGLYPH NU001*/
+ RTUNI_ALPHA, /* U+013237: EGYPTIAN HIEROGLYPH NU002*/
+ RTUNI_ALPHA, /* U+013238: EGYPTIAN HIEROGLYPH NU003*/
+ RTUNI_ALPHA, /* U+013239: EGYPTIAN HIEROGLYPH NU004*/
+ RTUNI_ALPHA, /* U+01323a: EGYPTIAN HIEROGLYPH NU005*/
+ RTUNI_ALPHA, /* U+01323b: EGYPTIAN HIEROGLYPH NU006*/
+ RTUNI_ALPHA, /* U+01323c: EGYPTIAN HIEROGLYPH NU007*/
+ RTUNI_ALPHA, /* U+01323d: EGYPTIAN HIEROGLYPH NU008*/
+ RTUNI_ALPHA, /* U+01323e: EGYPTIAN HIEROGLYPH NU009*/
+ RTUNI_ALPHA, /* U+01323f: EGYPTIAN HIEROGLYPH NU010*/
+ RTUNI_ALPHA, /* U+013240: EGYPTIAN HIEROGLYPH NU010A*/
+ RTUNI_ALPHA, /* U+013241: EGYPTIAN HIEROGLYPH NU011*/
+ RTUNI_ALPHA, /* U+013242: EGYPTIAN HIEROGLYPH NU011A*/
+ RTUNI_ALPHA, /* U+013243: EGYPTIAN HIEROGLYPH NU012*/
+ RTUNI_ALPHA, /* U+013244: EGYPTIAN HIEROGLYPH NU013*/
+ RTUNI_ALPHA, /* U+013245: EGYPTIAN HIEROGLYPH NU014*/
+ RTUNI_ALPHA, /* U+013246: EGYPTIAN HIEROGLYPH NU015*/
+ RTUNI_ALPHA, /* U+013247: EGYPTIAN HIEROGLYPH NU016*/
+ RTUNI_ALPHA, /* U+013248: EGYPTIAN HIEROGLYPH NU017*/
+ RTUNI_ALPHA, /* U+013249: EGYPTIAN HIEROGLYPH NU018*/
+ RTUNI_ALPHA, /* U+01324a: EGYPTIAN HIEROGLYPH NU018A*/
+ RTUNI_ALPHA, /* U+01324b: EGYPTIAN HIEROGLYPH NU019*/
+ RTUNI_ALPHA, /* U+01324c: EGYPTIAN HIEROGLYPH NU020*/
+ RTUNI_ALPHA, /* U+01324d: EGYPTIAN HIEROGLYPH NU021*/
+ RTUNI_ALPHA, /* U+01324e: EGYPTIAN HIEROGLYPH NU022*/
+ RTUNI_ALPHA, /* U+01324f: EGYPTIAN HIEROGLYPH NU022A*/
+ RTUNI_ALPHA, /* U+013250: EGYPTIAN HIEROGLYPH O001*/
+ RTUNI_ALPHA, /* U+013251: EGYPTIAN HIEROGLYPH O001A*/
+ RTUNI_ALPHA, /* U+013252: EGYPTIAN HIEROGLYPH O002*/
+ RTUNI_ALPHA, /* U+013253: EGYPTIAN HIEROGLYPH O003*/
+ RTUNI_ALPHA, /* U+013254: EGYPTIAN HIEROGLYPH O004*/
+ RTUNI_ALPHA, /* U+013255: EGYPTIAN HIEROGLYPH O005*/
+ RTUNI_ALPHA, /* U+013256: EGYPTIAN HIEROGLYPH O005A*/
+ RTUNI_ALPHA, /* U+013257: EGYPTIAN HIEROGLYPH O006*/
+ RTUNI_ALPHA, /* U+013258: EGYPTIAN HIEROGLYPH O006A*/
+ RTUNI_ALPHA, /* U+013259: EGYPTIAN HIEROGLYPH O006B*/
+ RTUNI_ALPHA, /* U+01325a: EGYPTIAN HIEROGLYPH O006C*/
+ RTUNI_ALPHA, /* U+01325b: EGYPTIAN HIEROGLYPH O006D*/
+ RTUNI_ALPHA, /* U+01325c: EGYPTIAN HIEROGLYPH O006E*/
+ RTUNI_ALPHA, /* U+01325d: EGYPTIAN HIEROGLYPH O006F*/
+ RTUNI_ALPHA, /* U+01325e: EGYPTIAN HIEROGLYPH O007*/
+ RTUNI_ALPHA, /* U+01325f: EGYPTIAN HIEROGLYPH O008*/
+ RTUNI_ALPHA, /* U+013260: EGYPTIAN HIEROGLYPH O009*/
+ RTUNI_ALPHA, /* U+013261: EGYPTIAN HIEROGLYPH O010*/
+ RTUNI_ALPHA, /* U+013262: EGYPTIAN HIEROGLYPH O010A*/
+ RTUNI_ALPHA, /* U+013263: EGYPTIAN HIEROGLYPH O010B*/
+ RTUNI_ALPHA, /* U+013264: EGYPTIAN HIEROGLYPH O010C*/
+ RTUNI_ALPHA, /* U+013265: EGYPTIAN HIEROGLYPH O011*/
+ RTUNI_ALPHA, /* U+013266: EGYPTIAN HIEROGLYPH O012*/
+ RTUNI_ALPHA, /* U+013267: EGYPTIAN HIEROGLYPH O013*/
+ RTUNI_ALPHA, /* U+013268: EGYPTIAN HIEROGLYPH O014*/
+ RTUNI_ALPHA, /* U+013269: EGYPTIAN HIEROGLYPH O015*/
+ RTUNI_ALPHA, /* U+01326a: EGYPTIAN HIEROGLYPH O016*/
+ RTUNI_ALPHA, /* U+01326b: EGYPTIAN HIEROGLYPH O017*/
+ RTUNI_ALPHA, /* U+01326c: EGYPTIAN HIEROGLYPH O018*/
+ RTUNI_ALPHA, /* U+01326d: EGYPTIAN HIEROGLYPH O019*/
+ RTUNI_ALPHA, /* U+01326e: EGYPTIAN HIEROGLYPH O019A*/
+ RTUNI_ALPHA, /* U+01326f: EGYPTIAN HIEROGLYPH O020*/
+ RTUNI_ALPHA, /* U+013270: EGYPTIAN HIEROGLYPH O020A*/
+ RTUNI_ALPHA, /* U+013271: EGYPTIAN HIEROGLYPH O021*/
+ RTUNI_ALPHA, /* U+013272: EGYPTIAN HIEROGLYPH O022*/
+ RTUNI_ALPHA, /* U+013273: EGYPTIAN HIEROGLYPH O023*/
+ RTUNI_ALPHA, /* U+013274: EGYPTIAN HIEROGLYPH O024*/
+ RTUNI_ALPHA, /* U+013275: EGYPTIAN HIEROGLYPH O024A*/
+ RTUNI_ALPHA, /* U+013276: EGYPTIAN HIEROGLYPH O025*/
+ RTUNI_ALPHA, /* U+013277: EGYPTIAN HIEROGLYPH O025A*/
+ RTUNI_ALPHA, /* U+013278: EGYPTIAN HIEROGLYPH O026*/
+ RTUNI_ALPHA, /* U+013279: EGYPTIAN HIEROGLYPH O027*/
+ RTUNI_ALPHA, /* U+01327a: EGYPTIAN HIEROGLYPH O028*/
+ RTUNI_ALPHA, /* U+01327b: EGYPTIAN HIEROGLYPH O029*/
+ RTUNI_ALPHA, /* U+01327c: EGYPTIAN HIEROGLYPH O029A*/
+ RTUNI_ALPHA, /* U+01327d: EGYPTIAN HIEROGLYPH O030*/
+ RTUNI_ALPHA, /* U+01327e: EGYPTIAN HIEROGLYPH O030A*/
+ RTUNI_ALPHA, /* U+01327f: EGYPTIAN HIEROGLYPH O031*/
+ RTUNI_ALPHA, /* U+013280: EGYPTIAN HIEROGLYPH O032*/
+ RTUNI_ALPHA, /* U+013281: EGYPTIAN HIEROGLYPH O033*/
+ RTUNI_ALPHA, /* U+013282: EGYPTIAN HIEROGLYPH O033A*/
+ RTUNI_ALPHA, /* U+013283: EGYPTIAN HIEROGLYPH O034*/
+ RTUNI_ALPHA, /* U+013284: EGYPTIAN HIEROGLYPH O035*/
+ RTUNI_ALPHA, /* U+013285: EGYPTIAN HIEROGLYPH O036*/
+ RTUNI_ALPHA, /* U+013286: EGYPTIAN HIEROGLYPH O036A*/
+ RTUNI_ALPHA, /* U+013287: EGYPTIAN HIEROGLYPH O036B*/
+ RTUNI_ALPHA, /* U+013288: EGYPTIAN HIEROGLYPH O036C*/
+ RTUNI_ALPHA, /* U+013289: EGYPTIAN HIEROGLYPH O036D*/
+ RTUNI_ALPHA, /* U+01328a: EGYPTIAN HIEROGLYPH O037*/
+ RTUNI_ALPHA, /* U+01328b: EGYPTIAN HIEROGLYPH O038*/
+ RTUNI_ALPHA, /* U+01328c: EGYPTIAN HIEROGLYPH O039*/
+ RTUNI_ALPHA, /* U+01328d: EGYPTIAN HIEROGLYPH O040*/
+ RTUNI_ALPHA, /* U+01328e: EGYPTIAN HIEROGLYPH O041*/
+ RTUNI_ALPHA, /* U+01328f: EGYPTIAN HIEROGLYPH O042*/
+ RTUNI_ALPHA, /* U+013290: EGYPTIAN HIEROGLYPH O043*/
+ RTUNI_ALPHA, /* U+013291: EGYPTIAN HIEROGLYPH O044*/
+ RTUNI_ALPHA, /* U+013292: EGYPTIAN HIEROGLYPH O045*/
+ RTUNI_ALPHA, /* U+013293: EGYPTIAN HIEROGLYPH O046*/
+ RTUNI_ALPHA, /* U+013294: EGYPTIAN HIEROGLYPH O047*/
+ RTUNI_ALPHA, /* U+013295: EGYPTIAN HIEROGLYPH O048*/
+ RTUNI_ALPHA, /* U+013296: EGYPTIAN HIEROGLYPH O049*/
+ RTUNI_ALPHA, /* U+013297: EGYPTIAN HIEROGLYPH O050*/
+ RTUNI_ALPHA, /* U+013298: EGYPTIAN HIEROGLYPH O050A*/
+ RTUNI_ALPHA, /* U+013299: EGYPTIAN HIEROGLYPH O050B*/
+ RTUNI_ALPHA, /* U+01329a: EGYPTIAN HIEROGLYPH O051*/
+ RTUNI_ALPHA, /* U+01329b: EGYPTIAN HIEROGLYPH P001*/
+ RTUNI_ALPHA, /* U+01329c: EGYPTIAN HIEROGLYPH P001A*/
+ RTUNI_ALPHA, /* U+01329d: EGYPTIAN HIEROGLYPH P002*/
+ RTUNI_ALPHA, /* U+01329e: EGYPTIAN HIEROGLYPH P003*/
+ RTUNI_ALPHA, /* U+01329f: EGYPTIAN HIEROGLYPH P003A*/
+ RTUNI_ALPHA, /* U+0132a0: EGYPTIAN HIEROGLYPH P004*/
+ RTUNI_ALPHA, /* U+0132a1: EGYPTIAN HIEROGLYPH P005*/
+ RTUNI_ALPHA, /* U+0132a2: EGYPTIAN HIEROGLYPH P006*/
+ RTUNI_ALPHA, /* U+0132a3: EGYPTIAN HIEROGLYPH P007*/
+ RTUNI_ALPHA, /* U+0132a4: EGYPTIAN HIEROGLYPH P008*/
+ RTUNI_ALPHA, /* U+0132a5: EGYPTIAN HIEROGLYPH P009*/
+ RTUNI_ALPHA, /* U+0132a6: EGYPTIAN HIEROGLYPH P010*/
+ RTUNI_ALPHA, /* U+0132a7: EGYPTIAN HIEROGLYPH P011*/
+ RTUNI_ALPHA, /* U+0132a8: EGYPTIAN HIEROGLYPH Q001*/
+ RTUNI_ALPHA, /* U+0132a9: EGYPTIAN HIEROGLYPH Q002*/
+ RTUNI_ALPHA, /* U+0132aa: EGYPTIAN HIEROGLYPH Q003*/
+ RTUNI_ALPHA, /* U+0132ab: EGYPTIAN HIEROGLYPH Q004*/
+ RTUNI_ALPHA, /* U+0132ac: EGYPTIAN HIEROGLYPH Q005*/
+ RTUNI_ALPHA, /* U+0132ad: EGYPTIAN HIEROGLYPH Q006*/
+ RTUNI_ALPHA, /* U+0132ae: EGYPTIAN HIEROGLYPH Q007*/
+ RTUNI_ALPHA, /* U+0132af: EGYPTIAN HIEROGLYPH R001*/
+ RTUNI_ALPHA, /* U+0132b0: EGYPTIAN HIEROGLYPH R002*/
+ RTUNI_ALPHA, /* U+0132b1: EGYPTIAN HIEROGLYPH R002A*/
+ RTUNI_ALPHA, /* U+0132b2: EGYPTIAN HIEROGLYPH R003*/
+ RTUNI_ALPHA, /* U+0132b3: EGYPTIAN HIEROGLYPH R003A*/
+ RTUNI_ALPHA, /* U+0132b4: EGYPTIAN HIEROGLYPH R003B*/
+ RTUNI_ALPHA, /* U+0132b5: EGYPTIAN HIEROGLYPH R004*/
+ RTUNI_ALPHA, /* U+0132b6: EGYPTIAN HIEROGLYPH R005*/
+ RTUNI_ALPHA, /* U+0132b7: EGYPTIAN HIEROGLYPH R006*/
+ RTUNI_ALPHA, /* U+0132b8: EGYPTIAN HIEROGLYPH R007*/
+ RTUNI_ALPHA, /* U+0132b9: EGYPTIAN HIEROGLYPH R008*/
+ RTUNI_ALPHA, /* U+0132ba: EGYPTIAN HIEROGLYPH R009*/
+ RTUNI_ALPHA, /* U+0132bb: EGYPTIAN HIEROGLYPH R010*/
+ RTUNI_ALPHA, /* U+0132bc: EGYPTIAN HIEROGLYPH R010A*/
+ RTUNI_ALPHA, /* U+0132bd: EGYPTIAN HIEROGLYPH R011*/
+ RTUNI_ALPHA, /* U+0132be: EGYPTIAN HIEROGLYPH R012*/
+ RTUNI_ALPHA, /* U+0132bf: EGYPTIAN HIEROGLYPH R013*/
+ RTUNI_ALPHA, /* U+0132c0: EGYPTIAN HIEROGLYPH R014*/
+ RTUNI_ALPHA, /* U+0132c1: EGYPTIAN HIEROGLYPH R015*/
+ RTUNI_ALPHA, /* U+0132c2: EGYPTIAN HIEROGLYPH R016*/
+ RTUNI_ALPHA, /* U+0132c3: EGYPTIAN HIEROGLYPH R016A*/
+ RTUNI_ALPHA, /* U+0132c4: EGYPTIAN HIEROGLYPH R017*/
+ RTUNI_ALPHA, /* U+0132c5: EGYPTIAN HIEROGLYPH R018*/
+ RTUNI_ALPHA, /* U+0132c6: EGYPTIAN HIEROGLYPH R019*/
+ RTUNI_ALPHA, /* U+0132c7: EGYPTIAN HIEROGLYPH R020*/
+ RTUNI_ALPHA, /* U+0132c8: EGYPTIAN HIEROGLYPH R021*/
+ RTUNI_ALPHA, /* U+0132c9: EGYPTIAN HIEROGLYPH R022*/
+ RTUNI_ALPHA, /* U+0132ca: EGYPTIAN HIEROGLYPH R023*/
+ RTUNI_ALPHA, /* U+0132cb: EGYPTIAN HIEROGLYPH R024*/
+ RTUNI_ALPHA, /* U+0132cc: EGYPTIAN HIEROGLYPH R025*/
+ RTUNI_ALPHA, /* U+0132cd: EGYPTIAN HIEROGLYPH R026*/
+ RTUNI_ALPHA, /* U+0132ce: EGYPTIAN HIEROGLYPH R027*/
+ RTUNI_ALPHA, /* U+0132cf: EGYPTIAN HIEROGLYPH R028*/
+ RTUNI_ALPHA, /* U+0132d0: EGYPTIAN HIEROGLYPH R029*/
+ RTUNI_ALPHA, /* U+0132d1: EGYPTIAN HIEROGLYPH S001*/
+ RTUNI_ALPHA, /* U+0132d2: EGYPTIAN HIEROGLYPH S002*/
+ RTUNI_ALPHA, /* U+0132d3: EGYPTIAN HIEROGLYPH S002A*/
+ RTUNI_ALPHA, /* U+0132d4: EGYPTIAN HIEROGLYPH S003*/
+ RTUNI_ALPHA, /* U+0132d5: EGYPTIAN HIEROGLYPH S004*/
+ RTUNI_ALPHA, /* U+0132d6: EGYPTIAN HIEROGLYPH S005*/
+ RTUNI_ALPHA, /* U+0132d7: EGYPTIAN HIEROGLYPH S006*/
+ RTUNI_ALPHA, /* U+0132d8: EGYPTIAN HIEROGLYPH S006A*/
+ RTUNI_ALPHA, /* U+0132d9: EGYPTIAN HIEROGLYPH S007*/
+ RTUNI_ALPHA, /* U+0132da: EGYPTIAN HIEROGLYPH S008*/
+ RTUNI_ALPHA, /* U+0132db: EGYPTIAN HIEROGLYPH S009*/
+ RTUNI_ALPHA, /* U+0132dc: EGYPTIAN HIEROGLYPH S010*/
+ RTUNI_ALPHA, /* U+0132dd: EGYPTIAN HIEROGLYPH S011*/
+ RTUNI_ALPHA, /* U+0132de: EGYPTIAN HIEROGLYPH S012*/
+ RTUNI_ALPHA, /* U+0132df: EGYPTIAN HIEROGLYPH S013*/
+ RTUNI_ALPHA, /* U+0132e0: EGYPTIAN HIEROGLYPH S014*/
+ RTUNI_ALPHA, /* U+0132e1: EGYPTIAN HIEROGLYPH S014A*/
+ RTUNI_ALPHA, /* U+0132e2: EGYPTIAN HIEROGLYPH S014B*/
+ RTUNI_ALPHA, /* U+0132e3: EGYPTIAN HIEROGLYPH S015*/
+ RTUNI_ALPHA, /* U+0132e4: EGYPTIAN HIEROGLYPH S016*/
+ RTUNI_ALPHA, /* U+0132e5: EGYPTIAN HIEROGLYPH S017*/
+ RTUNI_ALPHA, /* U+0132e6: EGYPTIAN HIEROGLYPH S017A*/
+ RTUNI_ALPHA, /* U+0132e7: EGYPTIAN HIEROGLYPH S018*/
+ RTUNI_ALPHA, /* U+0132e8: EGYPTIAN HIEROGLYPH S019*/
+ RTUNI_ALPHA, /* U+0132e9: EGYPTIAN HIEROGLYPH S020*/
+ RTUNI_ALPHA, /* U+0132ea: EGYPTIAN HIEROGLYPH S021*/
+ RTUNI_ALPHA, /* U+0132eb: EGYPTIAN HIEROGLYPH S022*/
+ RTUNI_ALPHA, /* U+0132ec: EGYPTIAN HIEROGLYPH S023*/
+ RTUNI_ALPHA, /* U+0132ed: EGYPTIAN HIEROGLYPH S024*/
+ RTUNI_ALPHA, /* U+0132ee: EGYPTIAN HIEROGLYPH S025*/
+ RTUNI_ALPHA, /* U+0132ef: EGYPTIAN HIEROGLYPH S026*/
+ RTUNI_ALPHA, /* U+0132f0: EGYPTIAN HIEROGLYPH S026A*/
+ RTUNI_ALPHA, /* U+0132f1: EGYPTIAN HIEROGLYPH S026B*/
+ RTUNI_ALPHA, /* U+0132f2: EGYPTIAN HIEROGLYPH S027*/
+ RTUNI_ALPHA, /* U+0132f3: EGYPTIAN HIEROGLYPH S028*/
+ RTUNI_ALPHA, /* U+0132f4: EGYPTIAN HIEROGLYPH S029*/
+ RTUNI_ALPHA, /* U+0132f5: EGYPTIAN HIEROGLYPH S030*/
+ RTUNI_ALPHA, /* U+0132f6: EGYPTIAN HIEROGLYPH S031*/
+ RTUNI_ALPHA, /* U+0132f7: EGYPTIAN HIEROGLYPH S032*/
+ RTUNI_ALPHA, /* U+0132f8: EGYPTIAN HIEROGLYPH S033*/
+ RTUNI_ALPHA, /* U+0132f9: EGYPTIAN HIEROGLYPH S034*/
+ RTUNI_ALPHA, /* U+0132fa: EGYPTIAN HIEROGLYPH S035*/
+ RTUNI_ALPHA, /* U+0132fb: EGYPTIAN HIEROGLYPH S035A*/
+ RTUNI_ALPHA, /* U+0132fc: EGYPTIAN HIEROGLYPH S036*/
+ RTUNI_ALPHA, /* U+0132fd: EGYPTIAN HIEROGLYPH S037*/
+ RTUNI_ALPHA, /* U+0132fe: EGYPTIAN HIEROGLYPH S038*/
+ RTUNI_ALPHA, /* U+0132ff: EGYPTIAN HIEROGLYPH S039*/
+ RTUNI_ALPHA, /* U+013300: EGYPTIAN HIEROGLYPH S040*/
+ RTUNI_ALPHA, /* U+013301: EGYPTIAN HIEROGLYPH S041*/
+ RTUNI_ALPHA, /* U+013302: EGYPTIAN HIEROGLYPH S042*/
+ RTUNI_ALPHA, /* U+013303: EGYPTIAN HIEROGLYPH S043*/
+ RTUNI_ALPHA, /* U+013304: EGYPTIAN HIEROGLYPH S044*/
+ RTUNI_ALPHA, /* U+013305: EGYPTIAN HIEROGLYPH S045*/
+ RTUNI_ALPHA, /* U+013306: EGYPTIAN HIEROGLYPH S046*/
+ RTUNI_ALPHA, /* U+013307: EGYPTIAN HIEROGLYPH T001*/
+ RTUNI_ALPHA, /* U+013308: EGYPTIAN HIEROGLYPH T002*/
+ RTUNI_ALPHA, /* U+013309: EGYPTIAN HIEROGLYPH T003*/
+ RTUNI_ALPHA, /* U+01330a: EGYPTIAN HIEROGLYPH T003A*/
+ RTUNI_ALPHA, /* U+01330b: EGYPTIAN HIEROGLYPH T004*/
+ RTUNI_ALPHA, /* U+01330c: EGYPTIAN HIEROGLYPH T005*/
+ RTUNI_ALPHA, /* U+01330d: EGYPTIAN HIEROGLYPH T006*/
+ RTUNI_ALPHA, /* U+01330e: EGYPTIAN HIEROGLYPH T007*/
+ RTUNI_ALPHA, /* U+01330f: EGYPTIAN HIEROGLYPH T007A*/
+ RTUNI_ALPHA, /* U+013310: EGYPTIAN HIEROGLYPH T008*/
+ RTUNI_ALPHA, /* U+013311: EGYPTIAN HIEROGLYPH T008A*/
+ RTUNI_ALPHA, /* U+013312: EGYPTIAN HIEROGLYPH T009*/
+ RTUNI_ALPHA, /* U+013313: EGYPTIAN HIEROGLYPH T009A*/
+ RTUNI_ALPHA, /* U+013314: EGYPTIAN HIEROGLYPH T010*/
+ RTUNI_ALPHA, /* U+013315: EGYPTIAN HIEROGLYPH T011*/
+ RTUNI_ALPHA, /* U+013316: EGYPTIAN HIEROGLYPH T011A*/
+ RTUNI_ALPHA, /* U+013317: EGYPTIAN HIEROGLYPH T012*/
+ RTUNI_ALPHA, /* U+013318: EGYPTIAN HIEROGLYPH T013*/
+ RTUNI_ALPHA, /* U+013319: EGYPTIAN HIEROGLYPH T014*/
+ RTUNI_ALPHA, /* U+01331a: EGYPTIAN HIEROGLYPH T015*/
+ RTUNI_ALPHA, /* U+01331b: EGYPTIAN HIEROGLYPH T016*/
+ RTUNI_ALPHA, /* U+01331c: EGYPTIAN HIEROGLYPH T016A*/
+ RTUNI_ALPHA, /* U+01331d: EGYPTIAN HIEROGLYPH T017*/
+ RTUNI_ALPHA, /* U+01331e: EGYPTIAN HIEROGLYPH T018*/
+ RTUNI_ALPHA, /* U+01331f: EGYPTIAN HIEROGLYPH T019*/
+ RTUNI_ALPHA, /* U+013320: EGYPTIAN HIEROGLYPH T020*/
+ RTUNI_ALPHA, /* U+013321: EGYPTIAN HIEROGLYPH T021*/
+ RTUNI_ALPHA, /* U+013322: EGYPTIAN HIEROGLYPH T022*/
+ RTUNI_ALPHA, /* U+013323: EGYPTIAN HIEROGLYPH T023*/
+ RTUNI_ALPHA, /* U+013324: EGYPTIAN HIEROGLYPH T024*/
+ RTUNI_ALPHA, /* U+013325: EGYPTIAN HIEROGLYPH T025*/
+ RTUNI_ALPHA, /* U+013326: EGYPTIAN HIEROGLYPH T026*/
+ RTUNI_ALPHA, /* U+013327: EGYPTIAN HIEROGLYPH T027*/
+ RTUNI_ALPHA, /* U+013328: EGYPTIAN HIEROGLYPH T028*/
+ RTUNI_ALPHA, /* U+013329: EGYPTIAN HIEROGLYPH T029*/
+ RTUNI_ALPHA, /* U+01332a: EGYPTIAN HIEROGLYPH T030*/
+ RTUNI_ALPHA, /* U+01332b: EGYPTIAN HIEROGLYPH T031*/
+ RTUNI_ALPHA, /* U+01332c: EGYPTIAN HIEROGLYPH T032*/
+ RTUNI_ALPHA, /* U+01332d: EGYPTIAN HIEROGLYPH T032A*/
+ RTUNI_ALPHA, /* U+01332e: EGYPTIAN HIEROGLYPH T033*/
+ RTUNI_ALPHA, /* U+01332f: EGYPTIAN HIEROGLYPH T033A*/
+ RTUNI_ALPHA, /* U+013330: EGYPTIAN HIEROGLYPH T034*/
+ RTUNI_ALPHA, /* U+013331: EGYPTIAN HIEROGLYPH T035*/
+ RTUNI_ALPHA, /* U+013332: EGYPTIAN HIEROGLYPH T036*/
+ RTUNI_ALPHA, /* U+013333: EGYPTIAN HIEROGLYPH U001*/
+ RTUNI_ALPHA, /* U+013334: EGYPTIAN HIEROGLYPH U002*/
+ RTUNI_ALPHA, /* U+013335: EGYPTIAN HIEROGLYPH U003*/
+ RTUNI_ALPHA, /* U+013336: EGYPTIAN HIEROGLYPH U004*/
+ RTUNI_ALPHA, /* U+013337: EGYPTIAN HIEROGLYPH U005*/
+ RTUNI_ALPHA, /* U+013338: EGYPTIAN HIEROGLYPH U006*/
+ RTUNI_ALPHA, /* U+013339: EGYPTIAN HIEROGLYPH U006A*/
+ RTUNI_ALPHA, /* U+01333a: EGYPTIAN HIEROGLYPH U006B*/
+ RTUNI_ALPHA, /* U+01333b: EGYPTIAN HIEROGLYPH U007*/
+ RTUNI_ALPHA, /* U+01333c: EGYPTIAN HIEROGLYPH U008*/
+ RTUNI_ALPHA, /* U+01333d: EGYPTIAN HIEROGLYPH U009*/
+ RTUNI_ALPHA, /* U+01333e: EGYPTIAN HIEROGLYPH U010*/
+ RTUNI_ALPHA, /* U+01333f: EGYPTIAN HIEROGLYPH U011*/
+ RTUNI_ALPHA, /* U+013340: EGYPTIAN HIEROGLYPH U012*/
+ RTUNI_ALPHA, /* U+013341: EGYPTIAN HIEROGLYPH U013*/
+ RTUNI_ALPHA, /* U+013342: EGYPTIAN HIEROGLYPH U014*/
+ RTUNI_ALPHA, /* U+013343: EGYPTIAN HIEROGLYPH U015*/
+ RTUNI_ALPHA, /* U+013344: EGYPTIAN HIEROGLYPH U016*/
+ RTUNI_ALPHA, /* U+013345: EGYPTIAN HIEROGLYPH U017*/
+ RTUNI_ALPHA, /* U+013346: EGYPTIAN HIEROGLYPH U018*/
+ RTUNI_ALPHA, /* U+013347: EGYPTIAN HIEROGLYPH U019*/
+ RTUNI_ALPHA, /* U+013348: EGYPTIAN HIEROGLYPH U020*/
+ RTUNI_ALPHA, /* U+013349: EGYPTIAN HIEROGLYPH U021*/
+ RTUNI_ALPHA, /* U+01334a: EGYPTIAN HIEROGLYPH U022*/
+ RTUNI_ALPHA, /* U+01334b: EGYPTIAN HIEROGLYPH U023*/
+ RTUNI_ALPHA, /* U+01334c: EGYPTIAN HIEROGLYPH U023A*/
+ RTUNI_ALPHA, /* U+01334d: EGYPTIAN HIEROGLYPH U024*/
+ RTUNI_ALPHA, /* U+01334e: EGYPTIAN HIEROGLYPH U025*/
+ RTUNI_ALPHA, /* U+01334f: EGYPTIAN HIEROGLYPH U026*/
+ RTUNI_ALPHA, /* U+013350: EGYPTIAN HIEROGLYPH U027*/
+ RTUNI_ALPHA, /* U+013351: EGYPTIAN HIEROGLYPH U028*/
+ RTUNI_ALPHA, /* U+013352: EGYPTIAN HIEROGLYPH U029*/
+ RTUNI_ALPHA, /* U+013353: EGYPTIAN HIEROGLYPH U029A*/
+ RTUNI_ALPHA, /* U+013354: EGYPTIAN HIEROGLYPH U030*/
+ RTUNI_ALPHA, /* U+013355: EGYPTIAN HIEROGLYPH U031*/
+ RTUNI_ALPHA, /* U+013356: EGYPTIAN HIEROGLYPH U032*/
+ RTUNI_ALPHA, /* U+013357: EGYPTIAN HIEROGLYPH U032A*/
+ RTUNI_ALPHA, /* U+013358: EGYPTIAN HIEROGLYPH U033*/
+ RTUNI_ALPHA, /* U+013359: EGYPTIAN HIEROGLYPH U034*/
+ RTUNI_ALPHA, /* U+01335a: EGYPTIAN HIEROGLYPH U035*/
+ RTUNI_ALPHA, /* U+01335b: EGYPTIAN HIEROGLYPH U036*/
+ RTUNI_ALPHA, /* U+01335c: EGYPTIAN HIEROGLYPH U037*/
+ RTUNI_ALPHA, /* U+01335d: EGYPTIAN HIEROGLYPH U038*/
+ RTUNI_ALPHA, /* U+01335e: EGYPTIAN HIEROGLYPH U039*/
+ RTUNI_ALPHA, /* U+01335f: EGYPTIAN HIEROGLYPH U040*/
+ RTUNI_ALPHA, /* U+013360: EGYPTIAN HIEROGLYPH U041*/
+ RTUNI_ALPHA, /* U+013361: EGYPTIAN HIEROGLYPH U042*/
+ RTUNI_ALPHA, /* U+013362: EGYPTIAN HIEROGLYPH V001*/
+ RTUNI_ALPHA, /* U+013363: EGYPTIAN HIEROGLYPH V001A*/
+ RTUNI_ALPHA, /* U+013364: EGYPTIAN HIEROGLYPH V001B*/
+ RTUNI_ALPHA, /* U+013365: EGYPTIAN HIEROGLYPH V001C*/
+ RTUNI_ALPHA, /* U+013366: EGYPTIAN HIEROGLYPH V001D*/
+ RTUNI_ALPHA, /* U+013367: EGYPTIAN HIEROGLYPH V001E*/
+ RTUNI_ALPHA, /* U+013368: EGYPTIAN HIEROGLYPH V001F*/
+ RTUNI_ALPHA, /* U+013369: EGYPTIAN HIEROGLYPH V001G*/
+ RTUNI_ALPHA, /* U+01336a: EGYPTIAN HIEROGLYPH V001H*/
+ RTUNI_ALPHA, /* U+01336b: EGYPTIAN HIEROGLYPH V001I*/
+ RTUNI_ALPHA, /* U+01336c: EGYPTIAN HIEROGLYPH V002*/
+ RTUNI_ALPHA, /* U+01336d: EGYPTIAN HIEROGLYPH V002A*/
+ RTUNI_ALPHA, /* U+01336e: EGYPTIAN HIEROGLYPH V003*/
+ RTUNI_ALPHA, /* U+01336f: EGYPTIAN HIEROGLYPH V004*/
+ RTUNI_ALPHA, /* U+013370: EGYPTIAN HIEROGLYPH V005*/
+ RTUNI_ALPHA, /* U+013371: EGYPTIAN HIEROGLYPH V006*/
+ RTUNI_ALPHA, /* U+013372: EGYPTIAN HIEROGLYPH V007*/
+ RTUNI_ALPHA, /* U+013373: EGYPTIAN HIEROGLYPH V007A*/
+ RTUNI_ALPHA, /* U+013374: EGYPTIAN HIEROGLYPH V007B*/
+ RTUNI_ALPHA, /* U+013375: EGYPTIAN HIEROGLYPH V008*/
+ RTUNI_ALPHA, /* U+013376: EGYPTIAN HIEROGLYPH V009*/
+ RTUNI_ALPHA, /* U+013377: EGYPTIAN HIEROGLYPH V010*/
+ RTUNI_ALPHA, /* U+013378: EGYPTIAN HIEROGLYPH V011*/
+ RTUNI_ALPHA, /* U+013379: EGYPTIAN HIEROGLYPH V011A*/
+ RTUNI_ALPHA, /* U+01337a: EGYPTIAN HIEROGLYPH V011B*/
+ RTUNI_ALPHA, /* U+01337b: EGYPTIAN HIEROGLYPH V011C*/
+ RTUNI_ALPHA, /* U+01337c: EGYPTIAN HIEROGLYPH V012*/
+ RTUNI_ALPHA, /* U+01337d: EGYPTIAN HIEROGLYPH V012A*/
+ RTUNI_ALPHA, /* U+01337e: EGYPTIAN HIEROGLYPH V012B*/
+ RTUNI_ALPHA, /* U+01337f: EGYPTIAN HIEROGLYPH V013*/
+ RTUNI_ALPHA, /* U+013380: EGYPTIAN HIEROGLYPH V014*/
+ RTUNI_ALPHA, /* U+013381: EGYPTIAN HIEROGLYPH V015*/
+ RTUNI_ALPHA, /* U+013382: EGYPTIAN HIEROGLYPH V016*/
+ RTUNI_ALPHA, /* U+013383: EGYPTIAN HIEROGLYPH V017*/
+ RTUNI_ALPHA, /* U+013384: EGYPTIAN HIEROGLYPH V018*/
+ RTUNI_ALPHA, /* U+013385: EGYPTIAN HIEROGLYPH V019*/
+ RTUNI_ALPHA, /* U+013386: EGYPTIAN HIEROGLYPH V020*/
+ RTUNI_ALPHA, /* U+013387: EGYPTIAN HIEROGLYPH V020A*/
+ RTUNI_ALPHA, /* U+013388: EGYPTIAN HIEROGLYPH V020B*/
+ RTUNI_ALPHA, /* U+013389: EGYPTIAN HIEROGLYPH V020C*/
+ RTUNI_ALPHA, /* U+01338a: EGYPTIAN HIEROGLYPH V020D*/
+ RTUNI_ALPHA, /* U+01338b: EGYPTIAN HIEROGLYPH V020E*/
+ RTUNI_ALPHA, /* U+01338c: EGYPTIAN HIEROGLYPH V020F*/
+ RTUNI_ALPHA, /* U+01338d: EGYPTIAN HIEROGLYPH V020G*/
+ RTUNI_ALPHA, /* U+01338e: EGYPTIAN HIEROGLYPH V020H*/
+ RTUNI_ALPHA, /* U+01338f: EGYPTIAN HIEROGLYPH V020I*/
+ RTUNI_ALPHA, /* U+013390: EGYPTIAN HIEROGLYPH V020J*/
+ RTUNI_ALPHA, /* U+013391: EGYPTIAN HIEROGLYPH V020K*/
+ RTUNI_ALPHA, /* U+013392: EGYPTIAN HIEROGLYPH V020L*/
+ RTUNI_ALPHA, /* U+013393: EGYPTIAN HIEROGLYPH V021*/
+ RTUNI_ALPHA, /* U+013394: EGYPTIAN HIEROGLYPH V022*/
+ RTUNI_ALPHA, /* U+013395: EGYPTIAN HIEROGLYPH V023*/
+ RTUNI_ALPHA, /* U+013396: EGYPTIAN HIEROGLYPH V023A*/
+ RTUNI_ALPHA, /* U+013397: EGYPTIAN HIEROGLYPH V024*/
+ RTUNI_ALPHA, /* U+013398: EGYPTIAN HIEROGLYPH V025*/
+ RTUNI_ALPHA, /* U+013399: EGYPTIAN HIEROGLYPH V026*/
+ RTUNI_ALPHA, /* U+01339a: EGYPTIAN HIEROGLYPH V027*/
+ RTUNI_ALPHA, /* U+01339b: EGYPTIAN HIEROGLYPH V028*/
+ RTUNI_ALPHA, /* U+01339c: EGYPTIAN HIEROGLYPH V028A*/
+ RTUNI_ALPHA, /* U+01339d: EGYPTIAN HIEROGLYPH V029*/
+ RTUNI_ALPHA, /* U+01339e: EGYPTIAN HIEROGLYPH V029A*/
+ RTUNI_ALPHA, /* U+01339f: EGYPTIAN HIEROGLYPH V030*/
+ RTUNI_ALPHA, /* U+0133a0: EGYPTIAN HIEROGLYPH V030A*/
+ RTUNI_ALPHA, /* U+0133a1: EGYPTIAN HIEROGLYPH V031*/
+ RTUNI_ALPHA, /* U+0133a2: EGYPTIAN HIEROGLYPH V031A*/
+ RTUNI_ALPHA, /* U+0133a3: EGYPTIAN HIEROGLYPH V032*/
+ RTUNI_ALPHA, /* U+0133a4: EGYPTIAN HIEROGLYPH V033*/
+ RTUNI_ALPHA, /* U+0133a5: EGYPTIAN HIEROGLYPH V033A*/
+ RTUNI_ALPHA, /* U+0133a6: EGYPTIAN HIEROGLYPH V034*/
+ RTUNI_ALPHA, /* U+0133a7: EGYPTIAN HIEROGLYPH V035*/
+ RTUNI_ALPHA, /* U+0133a8: EGYPTIAN HIEROGLYPH V036*/
+ RTUNI_ALPHA, /* U+0133a9: EGYPTIAN HIEROGLYPH V037*/
+ RTUNI_ALPHA, /* U+0133aa: EGYPTIAN HIEROGLYPH V037A*/
+ RTUNI_ALPHA, /* U+0133ab: EGYPTIAN HIEROGLYPH V038*/
+ RTUNI_ALPHA, /* U+0133ac: EGYPTIAN HIEROGLYPH V039*/
+ RTUNI_ALPHA, /* U+0133ad: EGYPTIAN HIEROGLYPH V040*/
+ RTUNI_ALPHA, /* U+0133ae: EGYPTIAN HIEROGLYPH V040A*/
+ RTUNI_ALPHA, /* U+0133af: EGYPTIAN HIEROGLYPH W001*/
+ RTUNI_ALPHA, /* U+0133b0: EGYPTIAN HIEROGLYPH W002*/
+ RTUNI_ALPHA, /* U+0133b1: EGYPTIAN HIEROGLYPH W003*/
+ RTUNI_ALPHA, /* U+0133b2: EGYPTIAN HIEROGLYPH W003A*/
+ RTUNI_ALPHA, /* U+0133b3: EGYPTIAN HIEROGLYPH W004*/
+ RTUNI_ALPHA, /* U+0133b4: EGYPTIAN HIEROGLYPH W005*/
+ RTUNI_ALPHA, /* U+0133b5: EGYPTIAN HIEROGLYPH W006*/
+ RTUNI_ALPHA, /* U+0133b6: EGYPTIAN HIEROGLYPH W007*/
+ RTUNI_ALPHA, /* U+0133b7: EGYPTIAN HIEROGLYPH W008*/
+ RTUNI_ALPHA, /* U+0133b8: EGYPTIAN HIEROGLYPH W009*/
+ RTUNI_ALPHA, /* U+0133b9: EGYPTIAN HIEROGLYPH W009A*/
+ RTUNI_ALPHA, /* U+0133ba: EGYPTIAN HIEROGLYPH W010*/
+ RTUNI_ALPHA, /* U+0133bb: EGYPTIAN HIEROGLYPH W010A*/
+ RTUNI_ALPHA, /* U+0133bc: EGYPTIAN HIEROGLYPH W011*/
+ RTUNI_ALPHA, /* U+0133bd: EGYPTIAN HIEROGLYPH W012*/
+ RTUNI_ALPHA, /* U+0133be: EGYPTIAN HIEROGLYPH W013*/
+ RTUNI_ALPHA, /* U+0133bf: EGYPTIAN HIEROGLYPH W014*/
+ RTUNI_ALPHA, /* U+0133c0: EGYPTIAN HIEROGLYPH W014A*/
+ RTUNI_ALPHA, /* U+0133c1: EGYPTIAN HIEROGLYPH W015*/
+ RTUNI_ALPHA, /* U+0133c2: EGYPTIAN HIEROGLYPH W016*/
+ RTUNI_ALPHA, /* U+0133c3: EGYPTIAN HIEROGLYPH W017*/
+ RTUNI_ALPHA, /* U+0133c4: EGYPTIAN HIEROGLYPH W017A*/
+ RTUNI_ALPHA, /* U+0133c5: EGYPTIAN HIEROGLYPH W018*/
+ RTUNI_ALPHA, /* U+0133c6: EGYPTIAN HIEROGLYPH W018A*/
+ RTUNI_ALPHA, /* U+0133c7: EGYPTIAN HIEROGLYPH W019*/
+ RTUNI_ALPHA, /* U+0133c8: EGYPTIAN HIEROGLYPH W020*/
+ RTUNI_ALPHA, /* U+0133c9: EGYPTIAN HIEROGLYPH W021*/
+ RTUNI_ALPHA, /* U+0133ca: EGYPTIAN HIEROGLYPH W022*/
+ RTUNI_ALPHA, /* U+0133cb: EGYPTIAN HIEROGLYPH W023*/
+ RTUNI_ALPHA, /* U+0133cc: EGYPTIAN HIEROGLYPH W024*/
+ RTUNI_ALPHA, /* U+0133cd: EGYPTIAN HIEROGLYPH W024A*/
+ RTUNI_ALPHA, /* U+0133ce: EGYPTIAN HIEROGLYPH W025*/
+ RTUNI_ALPHA, /* U+0133cf: EGYPTIAN HIEROGLYPH X001*/
+ RTUNI_ALPHA, /* U+0133d0: EGYPTIAN HIEROGLYPH X002*/
+ RTUNI_ALPHA, /* U+0133d1: EGYPTIAN HIEROGLYPH X003*/
+ RTUNI_ALPHA, /* U+0133d2: EGYPTIAN HIEROGLYPH X004*/
+ RTUNI_ALPHA, /* U+0133d3: EGYPTIAN HIEROGLYPH X004A*/
+ RTUNI_ALPHA, /* U+0133d4: EGYPTIAN HIEROGLYPH X004B*/
+ RTUNI_ALPHA, /* U+0133d5: EGYPTIAN HIEROGLYPH X005*/
+ RTUNI_ALPHA, /* U+0133d6: EGYPTIAN HIEROGLYPH X006*/
+ RTUNI_ALPHA, /* U+0133d7: EGYPTIAN HIEROGLYPH X006A*/
+ RTUNI_ALPHA, /* U+0133d8: EGYPTIAN HIEROGLYPH X007*/
+ RTUNI_ALPHA, /* U+0133d9: EGYPTIAN HIEROGLYPH X008*/
+ RTUNI_ALPHA, /* U+0133da: EGYPTIAN HIEROGLYPH X008A*/
+ RTUNI_ALPHA, /* U+0133db: EGYPTIAN HIEROGLYPH Y001*/
+ RTUNI_ALPHA, /* U+0133dc: EGYPTIAN HIEROGLYPH Y001A*/
+ RTUNI_ALPHA, /* U+0133dd: EGYPTIAN HIEROGLYPH Y002*/
+ RTUNI_ALPHA, /* U+0133de: EGYPTIAN HIEROGLYPH Y003*/
+ RTUNI_ALPHA, /* U+0133df: EGYPTIAN HIEROGLYPH Y004*/
+ RTUNI_ALPHA, /* U+0133e0: EGYPTIAN HIEROGLYPH Y005*/
+ RTUNI_ALPHA, /* U+0133e1: EGYPTIAN HIEROGLYPH Y006*/
+ RTUNI_ALPHA, /* U+0133e2: EGYPTIAN HIEROGLYPH Y007*/
+ RTUNI_ALPHA, /* U+0133e3: EGYPTIAN HIEROGLYPH Y008*/
+ RTUNI_ALPHA, /* U+0133e4: EGYPTIAN HIEROGLYPH Z001*/
+ RTUNI_ALPHA, /* U+0133e5: EGYPTIAN HIEROGLYPH Z002*/
+ RTUNI_ALPHA, /* U+0133e6: EGYPTIAN HIEROGLYPH Z002A*/
+ RTUNI_ALPHA, /* U+0133e7: EGYPTIAN HIEROGLYPH Z002B*/
+ RTUNI_ALPHA, /* U+0133e8: EGYPTIAN HIEROGLYPH Z002C*/
+ RTUNI_ALPHA, /* U+0133e9: EGYPTIAN HIEROGLYPH Z002D*/
+ RTUNI_ALPHA, /* U+0133ea: EGYPTIAN HIEROGLYPH Z003*/
+ RTUNI_ALPHA, /* U+0133eb: EGYPTIAN HIEROGLYPH Z003A*/
+ RTUNI_ALPHA, /* U+0133ec: EGYPTIAN HIEROGLYPH Z003B*/
+ RTUNI_ALPHA, /* U+0133ed: EGYPTIAN HIEROGLYPH Z004*/
+ RTUNI_ALPHA, /* U+0133ee: EGYPTIAN HIEROGLYPH Z004A*/
+ RTUNI_ALPHA, /* U+0133ef: EGYPTIAN HIEROGLYPH Z005*/
+ RTUNI_ALPHA, /* U+0133f0: EGYPTIAN HIEROGLYPH Z005A*/
+ RTUNI_ALPHA, /* U+0133f1: EGYPTIAN HIEROGLYPH Z006*/
+ RTUNI_ALPHA, /* U+0133f2: EGYPTIAN HIEROGLYPH Z007*/
+ RTUNI_ALPHA, /* U+0133f3: EGYPTIAN HIEROGLYPH Z008*/
+ RTUNI_ALPHA, /* U+0133f4: EGYPTIAN HIEROGLYPH Z009*/
+ RTUNI_ALPHA, /* U+0133f5: EGYPTIAN HIEROGLYPH Z010*/
+ RTUNI_ALPHA, /* U+0133f6: EGYPTIAN HIEROGLYPH Z011*/
+ RTUNI_ALPHA, /* U+0133f7: EGYPTIAN HIEROGLYPH Z012*/
+ RTUNI_ALPHA, /* U+0133f8: EGYPTIAN HIEROGLYPH Z013*/
+ RTUNI_ALPHA, /* U+0133f9: EGYPTIAN HIEROGLYPH Z014*/
+ RTUNI_ALPHA, /* U+0133fa: EGYPTIAN HIEROGLYPH Z015*/
+ RTUNI_ALPHA, /* U+0133fb: EGYPTIAN HIEROGLYPH Z015A*/
+ RTUNI_ALPHA, /* U+0133fc: EGYPTIAN HIEROGLYPH Z015B*/
+ RTUNI_ALPHA, /* U+0133fd: EGYPTIAN HIEROGLYPH Z015C*/
+ RTUNI_ALPHA, /* U+0133fe: EGYPTIAN HIEROGLYPH Z015D*/
+ RTUNI_ALPHA, /* U+0133ff: EGYPTIAN HIEROGLYPH Z015E*/
+ RTUNI_ALPHA, /* U+013400: EGYPTIAN HIEROGLYPH Z015F*/
+ RTUNI_ALPHA, /* U+013401: EGYPTIAN HIEROGLYPH Z015G*/
+ RTUNI_ALPHA, /* U+013402: EGYPTIAN HIEROGLYPH Z015H*/
+ RTUNI_ALPHA, /* U+013403: EGYPTIAN HIEROGLYPH Z015I*/
+ RTUNI_ALPHA, /* U+013404: EGYPTIAN HIEROGLYPH Z016*/
+ RTUNI_ALPHA, /* U+013405: EGYPTIAN HIEROGLYPH Z016A*/
+ RTUNI_ALPHA, /* U+013406: EGYPTIAN HIEROGLYPH Z016B*/
+ RTUNI_ALPHA, /* U+013407: EGYPTIAN HIEROGLYPH Z016C*/
+ RTUNI_ALPHA, /* U+013408: EGYPTIAN HIEROGLYPH Z016D*/
+ RTUNI_ALPHA, /* U+013409: EGYPTIAN HIEROGLYPH Z016E*/
+ RTUNI_ALPHA, /* U+01340a: EGYPTIAN HIEROGLYPH Z016F*/
+ RTUNI_ALPHA, /* U+01340b: EGYPTIAN HIEROGLYPH Z016G*/
+ RTUNI_ALPHA, /* U+01340c: EGYPTIAN HIEROGLYPH Z016H*/
+ RTUNI_ALPHA, /* U+01340d: EGYPTIAN HIEROGLYPH AA001*/
+ RTUNI_ALPHA, /* U+01340e: EGYPTIAN HIEROGLYPH AA002*/
+ RTUNI_ALPHA, /* U+01340f: EGYPTIAN HIEROGLYPH AA003*/
+ RTUNI_ALPHA, /* U+013410: EGYPTIAN HIEROGLYPH AA004*/
+ RTUNI_ALPHA, /* U+013411: EGYPTIAN HIEROGLYPH AA005*/
+ RTUNI_ALPHA, /* U+013412: EGYPTIAN HIEROGLYPH AA006*/
+ RTUNI_ALPHA, /* U+013413: EGYPTIAN HIEROGLYPH AA007*/
+ RTUNI_ALPHA, /* U+013414: EGYPTIAN HIEROGLYPH AA007A*/
+ RTUNI_ALPHA, /* U+013415: EGYPTIAN HIEROGLYPH AA007B*/
+ RTUNI_ALPHA, /* U+013416: EGYPTIAN HIEROGLYPH AA008*/
+ RTUNI_ALPHA, /* U+013417: EGYPTIAN HIEROGLYPH AA009*/
+ RTUNI_ALPHA, /* U+013418: EGYPTIAN HIEROGLYPH AA010*/
+ RTUNI_ALPHA, /* U+013419: EGYPTIAN HIEROGLYPH AA011*/
+ RTUNI_ALPHA, /* U+01341a: EGYPTIAN HIEROGLYPH AA012*/
+ RTUNI_ALPHA, /* U+01341b: EGYPTIAN HIEROGLYPH AA013*/
+ RTUNI_ALPHA, /* U+01341c: EGYPTIAN HIEROGLYPH AA014*/
+ RTUNI_ALPHA, /* U+01341d: EGYPTIAN HIEROGLYPH AA015*/
+ RTUNI_ALPHA, /* U+01341e: EGYPTIAN HIEROGLYPH AA016*/
+ RTUNI_ALPHA, /* U+01341f: EGYPTIAN HIEROGLYPH AA017*/
+ RTUNI_ALPHA, /* U+013420: EGYPTIAN HIEROGLYPH AA018*/
+ RTUNI_ALPHA, /* U+013421: EGYPTIAN HIEROGLYPH AA019*/
+ RTUNI_ALPHA, /* U+013422: EGYPTIAN HIEROGLYPH AA020*/
+ RTUNI_ALPHA, /* U+013423: EGYPTIAN HIEROGLYPH AA021*/
+ RTUNI_ALPHA, /* U+013424: EGYPTIAN HIEROGLYPH AA022*/
+ RTUNI_ALPHA, /* U+013425: EGYPTIAN HIEROGLYPH AA023*/
+ RTUNI_ALPHA, /* U+013426: EGYPTIAN HIEROGLYPH AA024*/
+ RTUNI_ALPHA, /* U+013427: EGYPTIAN HIEROGLYPH AA025*/
+ RTUNI_ALPHA, /* U+013428: EGYPTIAN HIEROGLYPH AA026*/
+ RTUNI_ALPHA, /* U+013429: EGYPTIAN HIEROGLYPH AA027*/
+ RTUNI_ALPHA, /* U+01342a: EGYPTIAN HIEROGLYPH AA028*/
+ RTUNI_ALPHA, /* U+01342b: EGYPTIAN HIEROGLYPH AA029*/
+ RTUNI_ALPHA, /* U+01342c: EGYPTIAN HIEROGLYPH AA030*/
+ RTUNI_ALPHA, /* U+01342d: EGYPTIAN HIEROGLYPH AA031*/
+ RTUNI_ALPHA, /* U+01342e: EGYPTIAN HIEROGLYPH AA032*/
+};
+
+static const uint8_t g_afRTUniFlags0x016800[] =
+{
+ RTUNI_ALPHA, /* U+016800: BAMUM LETTER PHASE-A NGKUE MFON*/
+ RTUNI_ALPHA, /* U+016801: BAMUM LETTER PHASE-A GBIEE FON*/
+ RTUNI_ALPHA, /* U+016802: BAMUM LETTER PHASE-A PON MFON PIPAEMGBIEE*/
+ RTUNI_ALPHA, /* U+016803: BAMUM LETTER PHASE-A PON MFON PIPAEMBA*/
+ RTUNI_ALPHA, /* U+016804: BAMUM LETTER PHASE-A NAA MFON*/
+ RTUNI_ALPHA, /* U+016805: BAMUM LETTER PHASE-A SHUENSHUET*/
+ RTUNI_ALPHA, /* U+016806: BAMUM LETTER PHASE-A TITA MFON*/
+ RTUNI_ALPHA, /* U+016807: BAMUM LETTER PHASE-A NZA MFON*/
+ RTUNI_ALPHA, /* U+016808: BAMUM LETTER PHASE-A SHINDA PA NJI*/
+ RTUNI_ALPHA, /* U+016809: BAMUM LETTER PHASE-A PON PA NJI PIPAEMGBIEE*/
+ RTUNI_ALPHA, /* U+01680a: BAMUM LETTER PHASE-A PON PA NJI PIPAEMBA*/
+ RTUNI_ALPHA, /* U+01680b: BAMUM LETTER PHASE-A MAEMBGBIEE*/
+ RTUNI_ALPHA, /* U+01680c: BAMUM LETTER PHASE-A TU MAEMBA*/
+ RTUNI_ALPHA, /* U+01680d: BAMUM LETTER PHASE-A NGANGU*/
+ RTUNI_ALPHA, /* U+01680e: BAMUM LETTER PHASE-A MAEMVEUX*/
+ RTUNI_ALPHA, /* U+01680f: BAMUM LETTER PHASE-A MANSUAE*/
+ RTUNI_ALPHA, /* U+016810: BAMUM LETTER PHASE-A MVEUAENGAM*/
+ RTUNI_ALPHA, /* U+016811: BAMUM LETTER PHASE-A SEUNYAM*/
+ RTUNI_ALPHA, /* U+016812: BAMUM LETTER PHASE-A NTOQPEN*/
+ RTUNI_ALPHA, /* U+016813: BAMUM LETTER PHASE-A KEUKEUTNDA*/
+ RTUNI_ALPHA, /* U+016814: BAMUM LETTER PHASE-A NKINDI*/
+ RTUNI_ALPHA, /* U+016815: BAMUM LETTER PHASE-A SUU*/
+ RTUNI_ALPHA, /* U+016816: BAMUM LETTER PHASE-A NGKUENZEUM*/
+ RTUNI_ALPHA, /* U+016817: BAMUM LETTER PHASE-A LAPAQ*/
+ RTUNI_ALPHA, /* U+016818: BAMUM LETTER PHASE-A LET KUT*/
+ RTUNI_ALPHA, /* U+016819: BAMUM LETTER PHASE-A NTAP MFAA*/
+ RTUNI_ALPHA, /* U+01681a: BAMUM LETTER PHASE-A MAEKEUP*/
+ RTUNI_ALPHA, /* U+01681b: BAMUM LETTER PHASE-A PASHAE*/
+ RTUNI_ALPHA, /* U+01681c: BAMUM LETTER PHASE-A GHEUAERAE*/
+ RTUNI_ALPHA, /* U+01681d: BAMUM LETTER PHASE-A PAMSHAE*/
+ RTUNI_ALPHA, /* U+01681e: BAMUM LETTER PHASE-A MON NGGEUAET*/
+ RTUNI_ALPHA, /* U+01681f: BAMUM LETTER PHASE-A NZUN MEUT*/
+ RTUNI_ALPHA, /* U+016820: BAMUM LETTER PHASE-A U YUQ NAE*/
+ RTUNI_ALPHA, /* U+016821: BAMUM LETTER PHASE-A GHEUAEGHEUAE*/
+ RTUNI_ALPHA, /* U+016822: BAMUM LETTER PHASE-A NTAP NTAA*/
+ RTUNI_ALPHA, /* U+016823: BAMUM LETTER PHASE-A SISA*/
+ RTUNI_ALPHA, /* U+016824: BAMUM LETTER PHASE-A MGBASA*/
+ RTUNI_ALPHA, /* U+016825: BAMUM LETTER PHASE-A MEUNJOMNDEUQ*/
+ RTUNI_ALPHA, /* U+016826: BAMUM LETTER PHASE-A MOOMPUQ*/
+ RTUNI_ALPHA, /* U+016827: BAMUM LETTER PHASE-A KAFA*/
+ RTUNI_ALPHA, /* U+016828: BAMUM LETTER PHASE-A PA LEERAEWA*/
+ RTUNI_ALPHA, /* U+016829: BAMUM LETTER PHASE-A NDA LEERAEWA*/
+ RTUNI_ALPHA, /* U+01682a: BAMUM LETTER PHASE-A PET*/
+ RTUNI_ALPHA, /* U+01682b: BAMUM LETTER PHASE-A MAEMKPEN*/
+ RTUNI_ALPHA, /* U+01682c: BAMUM LETTER PHASE-A NIKA*/
+ RTUNI_ALPHA, /* U+01682d: BAMUM LETTER PHASE-A PUP*/
+ RTUNI_ALPHA, /* U+01682e: BAMUM LETTER PHASE-A TUAEP*/
+ RTUNI_ALPHA, /* U+01682f: BAMUM LETTER PHASE-A LUAEP*/
+ RTUNI_ALPHA, /* U+016830: BAMUM LETTER PHASE-A SONJAM*/
+ RTUNI_ALPHA, /* U+016831: BAMUM LETTER PHASE-A TEUTEUWEN*/
+ RTUNI_ALPHA, /* U+016832: BAMUM LETTER PHASE-A MAENYI*/
+ RTUNI_ALPHA, /* U+016833: BAMUM LETTER PHASE-A KET*/
+ RTUNI_ALPHA, /* U+016834: BAMUM LETTER PHASE-A NDAANGGEUAET*/
+ RTUNI_ALPHA, /* U+016835: BAMUM LETTER PHASE-A KUOQ*/
+ RTUNI_ALPHA, /* U+016836: BAMUM LETTER PHASE-A MOOMEUT*/
+ RTUNI_ALPHA, /* U+016837: BAMUM LETTER PHASE-A SHUM*/
+ RTUNI_ALPHA, /* U+016838: BAMUM LETTER PHASE-A LOMMAE*/
+ RTUNI_ALPHA, /* U+016839: BAMUM LETTER PHASE-A FIRI*/
+ RTUNI_ALPHA, /* U+01683a: BAMUM LETTER PHASE-A ROM*/
+ RTUNI_ALPHA, /* U+01683b: BAMUM LETTER PHASE-A KPOQ*/
+ RTUNI_ALPHA, /* U+01683c: BAMUM LETTER PHASE-A SOQ*/
+ RTUNI_ALPHA, /* U+01683d: BAMUM LETTER PHASE-A MAP PIEET*/
+ RTUNI_ALPHA, /* U+01683e: BAMUM LETTER PHASE-A SHIRAE*/
+ RTUNI_ALPHA, /* U+01683f: BAMUM LETTER PHASE-A NTAP*/
+ RTUNI_ALPHA, /* U+016840: BAMUM LETTER PHASE-A SHOQ NSHUT YUM*/
+ RTUNI_ALPHA, /* U+016841: BAMUM LETTER PHASE-A NYIT MONGKEUAEQ*/
+ RTUNI_ALPHA, /* U+016842: BAMUM LETTER PHASE-A PAARAE*/
+ RTUNI_ALPHA, /* U+016843: BAMUM LETTER PHASE-A NKAARAE*/
+ RTUNI_ALPHA, /* U+016844: BAMUM LETTER PHASE-A UNKNOWN*/
+ RTUNI_ALPHA, /* U+016845: BAMUM LETTER PHASE-A NGGEN*/
+ RTUNI_ALPHA, /* U+016846: BAMUM LETTER PHASE-A MAESI*/
+ RTUNI_ALPHA, /* U+016847: BAMUM LETTER PHASE-A NJAM*/
+ RTUNI_ALPHA, /* U+016848: BAMUM LETTER PHASE-A MBANYI*/
+ RTUNI_ALPHA, /* U+016849: BAMUM LETTER PHASE-A NYET*/
+ RTUNI_ALPHA, /* U+01684a: BAMUM LETTER PHASE-A TEUAEN*/
+ RTUNI_ALPHA, /* U+01684b: BAMUM LETTER PHASE-A SOT*/
+ RTUNI_ALPHA, /* U+01684c: BAMUM LETTER PHASE-A PAAM*/
+ RTUNI_ALPHA, /* U+01684d: BAMUM LETTER PHASE-A NSHIEE*/
+ RTUNI_ALPHA, /* U+01684e: BAMUM LETTER PHASE-A MAEM*/
+ RTUNI_ALPHA, /* U+01684f: BAMUM LETTER PHASE-A NYI*/
+ RTUNI_ALPHA, /* U+016850: BAMUM LETTER PHASE-A KAQ*/
+ RTUNI_ALPHA, /* U+016851: BAMUM LETTER PHASE-A NSHA*/
+ RTUNI_ALPHA, /* U+016852: BAMUM LETTER PHASE-A VEE*/
+ RTUNI_ALPHA, /* U+016853: BAMUM LETTER PHASE-A LU*/
+ RTUNI_ALPHA, /* U+016854: BAMUM LETTER PHASE-A NEN*/
+ RTUNI_ALPHA, /* U+016855: BAMUM LETTER PHASE-A NAQ*/
+ RTUNI_ALPHA, /* U+016856: BAMUM LETTER PHASE-A MBAQ*/
+ RTUNI_ALPHA, /* U+016857: BAMUM LETTER PHASE-B NSHUET*/
+ RTUNI_ALPHA, /* U+016858: BAMUM LETTER PHASE-B TU MAEMGBIEE*/
+ RTUNI_ALPHA, /* U+016859: BAMUM LETTER PHASE-B SIEE*/
+ RTUNI_ALPHA, /* U+01685a: BAMUM LETTER PHASE-B SET TU*/
+ RTUNI_ALPHA, /* U+01685b: BAMUM LETTER PHASE-B LOM NTEUM*/
+ RTUNI_ALPHA, /* U+01685c: BAMUM LETTER PHASE-B MBA MAELEE*/
+ RTUNI_ALPHA, /* U+01685d: BAMUM LETTER PHASE-B KIEEM*/
+ RTUNI_ALPHA, /* U+01685e: BAMUM LETTER PHASE-B YEURAE*/
+ RTUNI_ALPHA, /* U+01685f: BAMUM LETTER PHASE-B MBAARAE*/
+ RTUNI_ALPHA, /* U+016860: BAMUM LETTER PHASE-B KAM*/
+ RTUNI_ALPHA, /* U+016861: BAMUM LETTER PHASE-B PEESHI*/
+ RTUNI_ALPHA, /* U+016862: BAMUM LETTER PHASE-B YAFU LEERAEWA*/
+ RTUNI_ALPHA, /* U+016863: BAMUM LETTER PHASE-B LAM NSHUT NYAM*/
+ RTUNI_ALPHA, /* U+016864: BAMUM LETTER PHASE-B NTIEE SHEUOQ*/
+ RTUNI_ALPHA, /* U+016865: BAMUM LETTER PHASE-B NDU NJAA*/
+ RTUNI_ALPHA, /* U+016866: BAMUM LETTER PHASE-B GHEUGHEUAEM*/
+ RTUNI_ALPHA, /* U+016867: BAMUM LETTER PHASE-B PIT*/
+ RTUNI_ALPHA, /* U+016868: BAMUM LETTER PHASE-B TU NSIEE*/
+ RTUNI_ALPHA, /* U+016869: BAMUM LETTER PHASE-B SHET NJAQ*/
+ RTUNI_ALPHA, /* U+01686a: BAMUM LETTER PHASE-B SHEUAEQTU*/
+ RTUNI_ALPHA, /* U+01686b: BAMUM LETTER PHASE-B MFON TEUAEQ*/
+ RTUNI_ALPHA, /* U+01686c: BAMUM LETTER PHASE-B MBIT MBAAKET*/
+ RTUNI_ALPHA, /* U+01686d: BAMUM LETTER PHASE-B NYI NTEUM*/
+ RTUNI_ALPHA, /* U+01686e: BAMUM LETTER PHASE-B KEUPUQ*/
+ RTUNI_ALPHA, /* U+01686f: BAMUM LETTER PHASE-B GHEUGHEN*/
+ RTUNI_ALPHA, /* U+016870: BAMUM LETTER PHASE-B KEUYEUX*/
+ RTUNI_ALPHA, /* U+016871: BAMUM LETTER PHASE-B LAANAE*/
+ RTUNI_ALPHA, /* U+016872: BAMUM LETTER PHASE-B PARUM*/
+ RTUNI_ALPHA, /* U+016873: BAMUM LETTER PHASE-B VEUM*/
+ RTUNI_ALPHA, /* U+016874: BAMUM LETTER PHASE-B NGKINDI MVOP*/
+ RTUNI_ALPHA, /* U+016875: BAMUM LETTER PHASE-B NGGEU MBU*/
+ RTUNI_ALPHA, /* U+016876: BAMUM LETTER PHASE-B WUAET*/
+ RTUNI_ALPHA, /* U+016877: BAMUM LETTER PHASE-B SAKEUAE*/
+ RTUNI_ALPHA, /* U+016878: BAMUM LETTER PHASE-B TAAM*/
+ RTUNI_ALPHA, /* U+016879: BAMUM LETTER PHASE-B MEUQ*/
+ RTUNI_ALPHA, /* U+01687a: BAMUM LETTER PHASE-B NGGUOQ*/
+ RTUNI_ALPHA, /* U+01687b: BAMUM LETTER PHASE-B NGGUOQ LARGE*/
+ RTUNI_ALPHA, /* U+01687c: BAMUM LETTER PHASE-B MFIYAQ*/
+ RTUNI_ALPHA, /* U+01687d: BAMUM LETTER PHASE-B SUE*/
+ RTUNI_ALPHA, /* U+01687e: BAMUM LETTER PHASE-B MBEURI*/
+ RTUNI_ALPHA, /* U+01687f: BAMUM LETTER PHASE-B MONTIEEN*/
+ RTUNI_ALPHA, /* U+016880: BAMUM LETTER PHASE-B NYAEMAE*/
+ RTUNI_ALPHA, /* U+016881: BAMUM LETTER PHASE-B PUNGAAM*/
+ RTUNI_ALPHA, /* U+016882: BAMUM LETTER PHASE-B MEUT NGGEET*/
+ RTUNI_ALPHA, /* U+016883: BAMUM LETTER PHASE-B FEUX*/
+ RTUNI_ALPHA, /* U+016884: BAMUM LETTER PHASE-B MBUOQ*/
+ RTUNI_ALPHA, /* U+016885: BAMUM LETTER PHASE-B FEE*/
+ RTUNI_ALPHA, /* U+016886: BAMUM LETTER PHASE-B KEUAEM*/
+ RTUNI_ALPHA, /* U+016887: BAMUM LETTER PHASE-B MA NJEUAENA*/
+ RTUNI_ALPHA, /* U+016888: BAMUM LETTER PHASE-B MA NJUQA*/
+ RTUNI_ALPHA, /* U+016889: BAMUM LETTER PHASE-B LET*/
+ RTUNI_ALPHA, /* U+01688a: BAMUM LETTER PHASE-B NGGAAM*/
+ RTUNI_ALPHA, /* U+01688b: BAMUM LETTER PHASE-B NSEN*/
+ RTUNI_ALPHA, /* U+01688c: BAMUM LETTER PHASE-B MA*/
+ RTUNI_ALPHA, /* U+01688d: BAMUM LETTER PHASE-B KIQ*/
+ RTUNI_ALPHA, /* U+01688e: BAMUM LETTER PHASE-B NGOM*/
+ RTUNI_ALPHA, /* U+01688f: BAMUM LETTER PHASE-C NGKUE MAEMBA*/
+ RTUNI_ALPHA, /* U+016890: BAMUM LETTER PHASE-C NZA*/
+ RTUNI_ALPHA, /* U+016891: BAMUM LETTER PHASE-C YUM*/
+ RTUNI_ALPHA, /* U+016892: BAMUM LETTER PHASE-C WANGKUOQ*/
+ RTUNI_ALPHA, /* U+016893: BAMUM LETTER PHASE-C NGGEN*/
+ RTUNI_ALPHA, /* U+016894: BAMUM LETTER PHASE-C NDEUAEREE*/
+ RTUNI_ALPHA, /* U+016895: BAMUM LETTER PHASE-C NGKAQ*/
+ RTUNI_ALPHA, /* U+016896: BAMUM LETTER PHASE-C GHARAE*/
+ RTUNI_ALPHA, /* U+016897: BAMUM LETTER PHASE-C MBEEKEET*/
+ RTUNI_ALPHA, /* U+016898: BAMUM LETTER PHASE-C GBAYI*/
+ RTUNI_ALPHA, /* U+016899: BAMUM LETTER PHASE-C NYIR MKPARAQ MEUN*/
+ RTUNI_ALPHA, /* U+01689a: BAMUM LETTER PHASE-C NTU MBIT*/
+ RTUNI_ALPHA, /* U+01689b: BAMUM LETTER PHASE-C MBEUM*/
+ RTUNI_ALPHA, /* U+01689c: BAMUM LETTER PHASE-C PIRIEEN*/
+ RTUNI_ALPHA, /* U+01689d: BAMUM LETTER PHASE-C NDOMBU*/
+ RTUNI_ALPHA, /* U+01689e: BAMUM LETTER PHASE-C MBAA CABBAGE-TREE*/
+ RTUNI_ALPHA, /* U+01689f: BAMUM LETTER PHASE-C KEUSHEUAEP*/
+ RTUNI_ALPHA, /* U+0168a0: BAMUM LETTER PHASE-C GHAP*/
+ RTUNI_ALPHA, /* U+0168a1: BAMUM LETTER PHASE-C KEUKAQ*/
+ RTUNI_ALPHA, /* U+0168a2: BAMUM LETTER PHASE-C YU MUOMAE*/
+ RTUNI_ALPHA, /* U+0168a3: BAMUM LETTER PHASE-C NZEUM*/
+ RTUNI_ALPHA, /* U+0168a4: BAMUM LETTER PHASE-C MBUE*/
+ RTUNI_ALPHA, /* U+0168a5: BAMUM LETTER PHASE-C NSEUAEN*/
+ RTUNI_ALPHA, /* U+0168a6: BAMUM LETTER PHASE-C MBIT*/
+ RTUNI_ALPHA, /* U+0168a7: BAMUM LETTER PHASE-C YEUQ*/
+ RTUNI_ALPHA, /* U+0168a8: BAMUM LETTER PHASE-C KPARAQ*/
+ RTUNI_ALPHA, /* U+0168a9: BAMUM LETTER PHASE-C KAA*/
+ RTUNI_ALPHA, /* U+0168aa: BAMUM LETTER PHASE-C SEUX*/
+ RTUNI_ALPHA, /* U+0168ab: BAMUM LETTER PHASE-C NDIDA*/
+ RTUNI_ALPHA, /* U+0168ac: BAMUM LETTER PHASE-C TAASHAE*/
+ RTUNI_ALPHA, /* U+0168ad: BAMUM LETTER PHASE-C NJUEQ*/
+ RTUNI_ALPHA, /* U+0168ae: BAMUM LETTER PHASE-C TITA YUE*/
+ RTUNI_ALPHA, /* U+0168af: BAMUM LETTER PHASE-C SUAET*/
+ RTUNI_ALPHA, /* U+0168b0: BAMUM LETTER PHASE-C NGGUAEN NYAM*/
+ RTUNI_ALPHA, /* U+0168b1: BAMUM LETTER PHASE-C VEUX*/
+ RTUNI_ALPHA, /* U+0168b2: BAMUM LETTER PHASE-C NANSANAQ*/
+ RTUNI_ALPHA, /* U+0168b3: BAMUM LETTER PHASE-C MA KEUAERI*/
+ RTUNI_ALPHA, /* U+0168b4: BAMUM LETTER PHASE-C NTAA*/
+ RTUNI_ALPHA, /* U+0168b5: BAMUM LETTER PHASE-C NGGUON*/
+ RTUNI_ALPHA, /* U+0168b6: BAMUM LETTER PHASE-C LAP*/
+ RTUNI_ALPHA, /* U+0168b7: BAMUM LETTER PHASE-C MBIRIEEN*/
+ RTUNI_ALPHA, /* U+0168b8: BAMUM LETTER PHASE-C MGBASAQ*/
+ RTUNI_ALPHA, /* U+0168b9: BAMUM LETTER PHASE-C NTEUNGBA*/
+ RTUNI_ALPHA, /* U+0168ba: BAMUM LETTER PHASE-C TEUTEUX*/
+ RTUNI_ALPHA, /* U+0168bb: BAMUM LETTER PHASE-C NGGUM*/
+ RTUNI_ALPHA, /* U+0168bc: BAMUM LETTER PHASE-C FUE*/
+ RTUNI_ALPHA, /* U+0168bd: BAMUM LETTER PHASE-C NDEUT*/
+ RTUNI_ALPHA, /* U+0168be: BAMUM LETTER PHASE-C NSA*/
+ RTUNI_ALPHA, /* U+0168bf: BAMUM LETTER PHASE-C NSHAQ*/
+ RTUNI_ALPHA, /* U+0168c0: BAMUM LETTER PHASE-C BUNG*/
+ RTUNI_ALPHA, /* U+0168c1: BAMUM LETTER PHASE-C VEUAEPEN*/
+ RTUNI_ALPHA, /* U+0168c2: BAMUM LETTER PHASE-C MBERAE*/
+ RTUNI_ALPHA, /* U+0168c3: BAMUM LETTER PHASE-C RU*/
+ RTUNI_ALPHA, /* U+0168c4: BAMUM LETTER PHASE-C NJAEM*/
+ RTUNI_ALPHA, /* U+0168c5: BAMUM LETTER PHASE-C LAM*/
+ RTUNI_ALPHA, /* U+0168c6: BAMUM LETTER PHASE-C TITUAEP*/
+ RTUNI_ALPHA, /* U+0168c7: BAMUM LETTER PHASE-C NSUOT NGOM*/
+ RTUNI_ALPHA, /* U+0168c8: BAMUM LETTER PHASE-C NJEEEE*/
+ RTUNI_ALPHA, /* U+0168c9: BAMUM LETTER PHASE-C KET*/
+ RTUNI_ALPHA, /* U+0168ca: BAMUM LETTER PHASE-C NGGU*/
+ RTUNI_ALPHA, /* U+0168cb: BAMUM LETTER PHASE-C MAESI*/
+ RTUNI_ALPHA, /* U+0168cc: BAMUM LETTER PHASE-C MBUAEM*/
+ RTUNI_ALPHA, /* U+0168cd: BAMUM LETTER PHASE-C LU*/
+ RTUNI_ALPHA, /* U+0168ce: BAMUM LETTER PHASE-C KUT*/
+ RTUNI_ALPHA, /* U+0168cf: BAMUM LETTER PHASE-C NJAM*/
+ RTUNI_ALPHA, /* U+0168d0: BAMUM LETTER PHASE-C NGOM*/
+ RTUNI_ALPHA, /* U+0168d1: BAMUM LETTER PHASE-C WUP*/
+ RTUNI_ALPHA, /* U+0168d2: BAMUM LETTER PHASE-C NGGUEET*/
+ RTUNI_ALPHA, /* U+0168d3: BAMUM LETTER PHASE-C NSOM*/
+ RTUNI_ALPHA, /* U+0168d4: BAMUM LETTER PHASE-C NTEN*/
+ RTUNI_ALPHA, /* U+0168d5: BAMUM LETTER PHASE-C KUOP NKAARAE*/
+ RTUNI_ALPHA, /* U+0168d6: BAMUM LETTER PHASE-C NSUN*/
+ RTUNI_ALPHA, /* U+0168d7: BAMUM LETTER PHASE-C NDAM*/
+ RTUNI_ALPHA, /* U+0168d8: BAMUM LETTER PHASE-C MA NSIEE*/
+ RTUNI_ALPHA, /* U+0168d9: BAMUM LETTER PHASE-C YAA*/
+ RTUNI_ALPHA, /* U+0168da: BAMUM LETTER PHASE-C NDAP*/
+ RTUNI_ALPHA, /* U+0168db: BAMUM LETTER PHASE-C SHUEQ*/
+ RTUNI_ALPHA, /* U+0168dc: BAMUM LETTER PHASE-C SETFON*/
+ RTUNI_ALPHA, /* U+0168dd: BAMUM LETTER PHASE-C MBI*/
+ RTUNI_ALPHA, /* U+0168de: BAMUM LETTER PHASE-C MAEMBA*/
+ RTUNI_ALPHA, /* U+0168df: BAMUM LETTER PHASE-C MBANYI*/
+ RTUNI_ALPHA, /* U+0168e0: BAMUM LETTER PHASE-C KEUSEUX*/
+ RTUNI_ALPHA, /* U+0168e1: BAMUM LETTER PHASE-C MBEUX*/
+ RTUNI_ALPHA, /* U+0168e2: BAMUM LETTER PHASE-C KEUM*/
+ RTUNI_ALPHA, /* U+0168e3: BAMUM LETTER PHASE-C MBAA PICKET*/
+ RTUNI_ALPHA, /* U+0168e4: BAMUM LETTER PHASE-C YUWOQ*/
+ RTUNI_ALPHA, /* U+0168e5: BAMUM LETTER PHASE-C NJEUX*/
+ RTUNI_ALPHA, /* U+0168e6: BAMUM LETTER PHASE-C MIEE*/
+ RTUNI_ALPHA, /* U+0168e7: BAMUM LETTER PHASE-C MUAE*/
+ RTUNI_ALPHA, /* U+0168e8: BAMUM LETTER PHASE-C SHIQ*/
+ RTUNI_ALPHA, /* U+0168e9: BAMUM LETTER PHASE-C KEN LAW*/
+ RTUNI_ALPHA, /* U+0168ea: BAMUM LETTER PHASE-C KEN FATIGUE*/
+ RTUNI_ALPHA, /* U+0168eb: BAMUM LETTER PHASE-C NGAQ*/
+ RTUNI_ALPHA, /* U+0168ec: BAMUM LETTER PHASE-C NAQ*/
+ RTUNI_ALPHA, /* U+0168ed: BAMUM LETTER PHASE-C LIQ*/
+ RTUNI_ALPHA, /* U+0168ee: BAMUM LETTER PHASE-C PIN*/
+ RTUNI_ALPHA, /* U+0168ef: BAMUM LETTER PHASE-C PEN*/
+ RTUNI_ALPHA, /* U+0168f0: BAMUM LETTER PHASE-C TET*/
+ RTUNI_ALPHA, /* U+0168f1: BAMUM LETTER PHASE-D MBUO*/
+ RTUNI_ALPHA, /* U+0168f2: BAMUM LETTER PHASE-D WAP*/
+ RTUNI_ALPHA, /* U+0168f3: BAMUM LETTER PHASE-D NJI*/
+ RTUNI_ALPHA, /* U+0168f4: BAMUM LETTER PHASE-D MFON*/
+ RTUNI_ALPHA, /* U+0168f5: BAMUM LETTER PHASE-D NJIEE*/
+ RTUNI_ALPHA, /* U+0168f6: BAMUM LETTER PHASE-D LIEE*/
+ RTUNI_ALPHA, /* U+0168f7: BAMUM LETTER PHASE-D NJEUT*/
+ RTUNI_ALPHA, /* U+0168f8: BAMUM LETTER PHASE-D NSHEE*/
+ RTUNI_ALPHA, /* U+0168f9: BAMUM LETTER PHASE-D NGGAAMAE*/
+ RTUNI_ALPHA, /* U+0168fa: BAMUM LETTER PHASE-D NYAM*/
+ RTUNI_ALPHA, /* U+0168fb: BAMUM LETTER PHASE-D WUAEN*/
+ RTUNI_ALPHA, /* U+0168fc: BAMUM LETTER PHASE-D NGKUN*/
+ RTUNI_ALPHA, /* U+0168fd: BAMUM LETTER PHASE-D SHEE*/
+ RTUNI_ALPHA, /* U+0168fe: BAMUM LETTER PHASE-D NGKAP*/
+ RTUNI_ALPHA, /* U+0168ff: BAMUM LETTER PHASE-D KEUAETMEUN*/
+ RTUNI_ALPHA, /* U+016900: BAMUM LETTER PHASE-D TEUT*/
+ RTUNI_ALPHA, /* U+016901: BAMUM LETTER PHASE-D SHEUAE*/
+ RTUNI_ALPHA, /* U+016902: BAMUM LETTER PHASE-D NJAP*/
+ RTUNI_ALPHA, /* U+016903: BAMUM LETTER PHASE-D SUE*/
+ RTUNI_ALPHA, /* U+016904: BAMUM LETTER PHASE-D KET*/
+ RTUNI_ALPHA, /* U+016905: BAMUM LETTER PHASE-D YAEMMAE*/
+ RTUNI_ALPHA, /* U+016906: BAMUM LETTER PHASE-D KUOM*/
+ RTUNI_ALPHA, /* U+016907: BAMUM LETTER PHASE-D SAP*/
+ RTUNI_ALPHA, /* U+016908: BAMUM LETTER PHASE-D MFEUT*/
+ RTUNI_ALPHA, /* U+016909: BAMUM LETTER PHASE-D NDEUX*/
+ RTUNI_ALPHA, /* U+01690a: BAMUM LETTER PHASE-D MALEERI*/
+ RTUNI_ALPHA, /* U+01690b: BAMUM LETTER PHASE-D MEUT*/
+ RTUNI_ALPHA, /* U+01690c: BAMUM LETTER PHASE-D SEUAEQ*/
+ RTUNI_ALPHA, /* U+01690d: BAMUM LETTER PHASE-D YEN*/
+ RTUNI_ALPHA, /* U+01690e: BAMUM LETTER PHASE-D NJEUAEM*/
+ RTUNI_ALPHA, /* U+01690f: BAMUM LETTER PHASE-D KEUOT MBUAE*/
+ RTUNI_ALPHA, /* U+016910: BAMUM LETTER PHASE-D NGKEURI*/
+ RTUNI_ALPHA, /* U+016911: BAMUM LETTER PHASE-D TU*/
+ RTUNI_ALPHA, /* U+016912: BAMUM LETTER PHASE-D GHAA*/
+ RTUNI_ALPHA, /* U+016913: BAMUM LETTER PHASE-D NGKYEE*/
+ RTUNI_ALPHA, /* U+016914: BAMUM LETTER PHASE-D FEUFEUAET*/
+ RTUNI_ALPHA, /* U+016915: BAMUM LETTER PHASE-D NDEE*/
+ RTUNI_ALPHA, /* U+016916: BAMUM LETTER PHASE-D MGBOFUM*/
+ RTUNI_ALPHA, /* U+016917: BAMUM LETTER PHASE-D LEUAEP*/
+ RTUNI_ALPHA, /* U+016918: BAMUM LETTER PHASE-D NDON*/
+ RTUNI_ALPHA, /* U+016919: BAMUM LETTER PHASE-D MONI*/
+ RTUNI_ALPHA, /* U+01691a: BAMUM LETTER PHASE-D MGBEUN*/
+ RTUNI_ALPHA, /* U+01691b: BAMUM LETTER PHASE-D PUUT*/
+ RTUNI_ALPHA, /* U+01691c: BAMUM LETTER PHASE-D MGBIEE*/
+ RTUNI_ALPHA, /* U+01691d: BAMUM LETTER PHASE-D MFO*/
+ RTUNI_ALPHA, /* U+01691e: BAMUM LETTER PHASE-D LUM*/
+ RTUNI_ALPHA, /* U+01691f: BAMUM LETTER PHASE-D NSIEEP*/
+ RTUNI_ALPHA, /* U+016920: BAMUM LETTER PHASE-D MBAA*/
+ RTUNI_ALPHA, /* U+016921: BAMUM LETTER PHASE-D KWAET*/
+ RTUNI_ALPHA, /* U+016922: BAMUM LETTER PHASE-D NYET*/
+ RTUNI_ALPHA, /* U+016923: BAMUM LETTER PHASE-D TEUAEN*/
+ RTUNI_ALPHA, /* U+016924: BAMUM LETTER PHASE-D SOT*/
+ RTUNI_ALPHA, /* U+016925: BAMUM LETTER PHASE-D YUWOQ*/
+ RTUNI_ALPHA, /* U+016926: BAMUM LETTER PHASE-D KEUM*/
+ RTUNI_ALPHA, /* U+016927: BAMUM LETTER PHASE-D RAEM*/
+ RTUNI_ALPHA, /* U+016928: BAMUM LETTER PHASE-D TEEEE*/
+ RTUNI_ALPHA, /* U+016929: BAMUM LETTER PHASE-D NGKEUAEQ*/
+ RTUNI_ALPHA, /* U+01692a: BAMUM LETTER PHASE-D MFEUAE*/
+ RTUNI_ALPHA, /* U+01692b: BAMUM LETTER PHASE-D NSIEET*/
+ RTUNI_ALPHA, /* U+01692c: BAMUM LETTER PHASE-D KEUP*/
+ RTUNI_ALPHA, /* U+01692d: BAMUM LETTER PHASE-D PIP*/
+ RTUNI_ALPHA, /* U+01692e: BAMUM LETTER PHASE-D PEUTAE*/
+ RTUNI_ALPHA, /* U+01692f: BAMUM LETTER PHASE-D NYUE*/
+ RTUNI_ALPHA, /* U+016930: BAMUM LETTER PHASE-D LET*/
+ RTUNI_ALPHA, /* U+016931: BAMUM LETTER PHASE-D NGGAAM*/
+ RTUNI_ALPHA, /* U+016932: BAMUM LETTER PHASE-D MFIEE*/
+ RTUNI_ALPHA, /* U+016933: BAMUM LETTER PHASE-D NGGWAEN*/
+ RTUNI_ALPHA, /* U+016934: BAMUM LETTER PHASE-D YUOM*/
+ RTUNI_ALPHA, /* U+016935: BAMUM LETTER PHASE-D PAP*/
+ RTUNI_ALPHA, /* U+016936: BAMUM LETTER PHASE-D YUOP*/
+ RTUNI_ALPHA, /* U+016937: BAMUM LETTER PHASE-D NDAM*/
+ RTUNI_ALPHA, /* U+016938: BAMUM LETTER PHASE-D NTEUM*/
+ RTUNI_ALPHA, /* U+016939: BAMUM LETTER PHASE-D SUAE*/
+ RTUNI_ALPHA, /* U+01693a: BAMUM LETTER PHASE-D KUN*/
+ RTUNI_ALPHA, /* U+01693b: BAMUM LETTER PHASE-D NGGEUX*/
+ RTUNI_ALPHA, /* U+01693c: BAMUM LETTER PHASE-D NGKIEE*/
+ RTUNI_ALPHA, /* U+01693d: BAMUM LETTER PHASE-D TUOT*/
+ RTUNI_ALPHA, /* U+01693e: BAMUM LETTER PHASE-D MEUN*/
+ RTUNI_ALPHA, /* U+01693f: BAMUM LETTER PHASE-D KUQ*/
+ RTUNI_ALPHA, /* U+016940: BAMUM LETTER PHASE-D NSUM*/
+ RTUNI_ALPHA, /* U+016941: BAMUM LETTER PHASE-D TEUN*/
+ RTUNI_ALPHA, /* U+016942: BAMUM LETTER PHASE-D MAENJET*/
+ RTUNI_ALPHA, /* U+016943: BAMUM LETTER PHASE-D NGGAP*/
+ RTUNI_ALPHA, /* U+016944: BAMUM LETTER PHASE-D LEUM*/
+ RTUNI_ALPHA, /* U+016945: BAMUM LETTER PHASE-D NGGUOM*/
+ RTUNI_ALPHA, /* U+016946: BAMUM LETTER PHASE-D NSHUT*/
+ RTUNI_ALPHA, /* U+016947: BAMUM LETTER PHASE-D NJUEQ*/
+ RTUNI_ALPHA, /* U+016948: BAMUM LETTER PHASE-D GHEUAE*/
+ RTUNI_ALPHA, /* U+016949: BAMUM LETTER PHASE-D KU*/
+ RTUNI_ALPHA, /* U+01694a: BAMUM LETTER PHASE-D REN OLD*/
+ RTUNI_ALPHA, /* U+01694b: BAMUM LETTER PHASE-D TAE*/
+ RTUNI_ALPHA, /* U+01694c: BAMUM LETTER PHASE-D TOQ*/
+ RTUNI_ALPHA, /* U+01694d: BAMUM LETTER PHASE-D NYI*/
+ RTUNI_ALPHA, /* U+01694e: BAMUM LETTER PHASE-D RII*/
+ RTUNI_ALPHA, /* U+01694f: BAMUM LETTER PHASE-D LEEEE*/
+ RTUNI_ALPHA, /* U+016950: BAMUM LETTER PHASE-D MEEEE*/
+ RTUNI_ALPHA, /* U+016951: BAMUM LETTER PHASE-D M*/
+ RTUNI_ALPHA, /* U+016952: BAMUM LETTER PHASE-D SUU*/
+ RTUNI_ALPHA, /* U+016953: BAMUM LETTER PHASE-D MU*/
+ RTUNI_ALPHA, /* U+016954: BAMUM LETTER PHASE-D SHII*/
+ RTUNI_ALPHA, /* U+016955: BAMUM LETTER PHASE-D SHEUX*/
+ RTUNI_ALPHA, /* U+016956: BAMUM LETTER PHASE-D KYEE*/
+ RTUNI_ALPHA, /* U+016957: BAMUM LETTER PHASE-D NU*/
+ RTUNI_ALPHA, /* U+016958: BAMUM LETTER PHASE-D SHU*/
+ RTUNI_ALPHA, /* U+016959: BAMUM LETTER PHASE-D NTEE*/
+ RTUNI_ALPHA, /* U+01695a: BAMUM LETTER PHASE-D PEE*/
+ RTUNI_ALPHA, /* U+01695b: BAMUM LETTER PHASE-D NI*/
+ RTUNI_ALPHA, /* U+01695c: BAMUM LETTER PHASE-D SHOQ*/
+ RTUNI_ALPHA, /* U+01695d: BAMUM LETTER PHASE-D PUQ*/
+ RTUNI_ALPHA, /* U+01695e: BAMUM LETTER PHASE-D MVOP*/
+ RTUNI_ALPHA, /* U+01695f: BAMUM LETTER PHASE-D LOQ*/
+ RTUNI_ALPHA, /* U+016960: BAMUM LETTER PHASE-D REN MUCH*/
+ RTUNI_ALPHA, /* U+016961: BAMUM LETTER PHASE-D TI*/
+ RTUNI_ALPHA, /* U+016962: BAMUM LETTER PHASE-D NTUU*/
+ RTUNI_ALPHA, /* U+016963: BAMUM LETTER PHASE-D MBAA SEVEN*/
+ RTUNI_ALPHA, /* U+016964: BAMUM LETTER PHASE-D SAQ*/
+ RTUNI_ALPHA, /* U+016965: BAMUM LETTER PHASE-D FAA*/
+ RTUNI_ALPHA, /* U+016966: BAMUM LETTER PHASE-E NDAP*/
+ RTUNI_ALPHA, /* U+016967: BAMUM LETTER PHASE-E TOON*/
+ RTUNI_ALPHA, /* U+016968: BAMUM LETTER PHASE-E MBEUM*/
+ RTUNI_ALPHA, /* U+016969: BAMUM LETTER PHASE-E LAP*/
+ RTUNI_ALPHA, /* U+01696a: BAMUM LETTER PHASE-E VOM*/
+ RTUNI_ALPHA, /* U+01696b: BAMUM LETTER PHASE-E LOON*/
+ RTUNI_ALPHA, /* U+01696c: BAMUM LETTER PHASE-E PAA*/
+ RTUNI_ALPHA, /* U+01696d: BAMUM LETTER PHASE-E SOM*/
+ RTUNI_ALPHA, /* U+01696e: BAMUM LETTER PHASE-E RAQ*/
+ RTUNI_ALPHA, /* U+01696f: BAMUM LETTER PHASE-E NSHUOP*/
+ RTUNI_ALPHA, /* U+016970: BAMUM LETTER PHASE-E NDUN*/
+ RTUNI_ALPHA, /* U+016971: BAMUM LETTER PHASE-E PUAE*/
+ RTUNI_ALPHA, /* U+016972: BAMUM LETTER PHASE-E TAM*/
+ RTUNI_ALPHA, /* U+016973: BAMUM LETTER PHASE-E NGKA*/
+ RTUNI_ALPHA, /* U+016974: BAMUM LETTER PHASE-E KPEUX*/
+ RTUNI_ALPHA, /* U+016975: BAMUM LETTER PHASE-E WUO*/
+ RTUNI_ALPHA, /* U+016976: BAMUM LETTER PHASE-E SEE*/
+ RTUNI_ALPHA, /* U+016977: BAMUM LETTER PHASE-E NGGEUAET*/
+ RTUNI_ALPHA, /* U+016978: BAMUM LETTER PHASE-E PAAM*/
+ RTUNI_ALPHA, /* U+016979: BAMUM LETTER PHASE-E TOO*/
+ RTUNI_ALPHA, /* U+01697a: BAMUM LETTER PHASE-E KUOP*/
+ RTUNI_ALPHA, /* U+01697b: BAMUM LETTER PHASE-E LOM*/
+ RTUNI_ALPHA, /* U+01697c: BAMUM LETTER PHASE-E NSHIEE*/
+ RTUNI_ALPHA, /* U+01697d: BAMUM LETTER PHASE-E NGOP*/
+ RTUNI_ALPHA, /* U+01697e: BAMUM LETTER PHASE-E MAEM*/
+ RTUNI_ALPHA, /* U+01697f: BAMUM LETTER PHASE-E NGKEUX*/
+ RTUNI_ALPHA, /* U+016980: BAMUM LETTER PHASE-E NGOQ*/
+ RTUNI_ALPHA, /* U+016981: BAMUM LETTER PHASE-E NSHUE*/
+ RTUNI_ALPHA, /* U+016982: BAMUM LETTER PHASE-E RIMGBA*/
+ RTUNI_ALPHA, /* U+016983: BAMUM LETTER PHASE-E NJEUX*/
+ RTUNI_ALPHA, /* U+016984: BAMUM LETTER PHASE-E PEEM*/
+ RTUNI_ALPHA, /* U+016985: BAMUM LETTER PHASE-E SAA*/
+ RTUNI_ALPHA, /* U+016986: BAMUM LETTER PHASE-E NGGURAE*/
+ RTUNI_ALPHA, /* U+016987: BAMUM LETTER PHASE-E MGBA*/
+ RTUNI_ALPHA, /* U+016988: BAMUM LETTER PHASE-E GHEUX*/
+ RTUNI_ALPHA, /* U+016989: BAMUM LETTER PHASE-E NGKEUAEM*/
+ RTUNI_ALPHA, /* U+01698a: BAMUM LETTER PHASE-E NJAEMLI*/
+ RTUNI_ALPHA, /* U+01698b: BAMUM LETTER PHASE-E MAP*/
+ RTUNI_ALPHA, /* U+01698c: BAMUM LETTER PHASE-E LOOT*/
+ RTUNI_ALPHA, /* U+01698d: BAMUM LETTER PHASE-E NGGEEEE*/
+ RTUNI_ALPHA, /* U+01698e: BAMUM LETTER PHASE-E NDIQ*/
+ RTUNI_ALPHA, /* U+01698f: BAMUM LETTER PHASE-E TAEN NTEUM*/
+ RTUNI_ALPHA, /* U+016990: BAMUM LETTER PHASE-E SET*/
+ RTUNI_ALPHA, /* U+016991: BAMUM LETTER PHASE-E PUM*/
+ RTUNI_ALPHA, /* U+016992: BAMUM LETTER PHASE-E NDAA SOFTNESS*/
+ RTUNI_ALPHA, /* U+016993: BAMUM LETTER PHASE-E NGGUAESHAE NYAM*/
+ RTUNI_ALPHA, /* U+016994: BAMUM LETTER PHASE-E YIEE*/
+ RTUNI_ALPHA, /* U+016995: BAMUM LETTER PHASE-E GHEUN*/
+ RTUNI_ALPHA, /* U+016996: BAMUM LETTER PHASE-E TUAE*/
+ RTUNI_ALPHA, /* U+016997: BAMUM LETTER PHASE-E YEUAE*/
+ RTUNI_ALPHA, /* U+016998: BAMUM LETTER PHASE-E PO*/
+ RTUNI_ALPHA, /* U+016999: BAMUM LETTER PHASE-E TUMAE*/
+ RTUNI_ALPHA, /* U+01699a: BAMUM LETTER PHASE-E KEUAE*/
+ RTUNI_ALPHA, /* U+01699b: BAMUM LETTER PHASE-E SUAEN*/
+ RTUNI_ALPHA, /* U+01699c: BAMUM LETTER PHASE-E TEUAEQ*/
+ RTUNI_ALPHA, /* U+01699d: BAMUM LETTER PHASE-E VEUAE*/
+ RTUNI_ALPHA, /* U+01699e: BAMUM LETTER PHASE-E WEUX*/
+ RTUNI_ALPHA, /* U+01699f: BAMUM LETTER PHASE-E LAAM*/
+ RTUNI_ALPHA, /* U+0169a0: BAMUM LETTER PHASE-E PU*/
+ RTUNI_ALPHA, /* U+0169a1: BAMUM LETTER PHASE-E TAAQ*/
+ RTUNI_ALPHA, /* U+0169a2: BAMUM LETTER PHASE-E GHAAMAE*/
+ RTUNI_ALPHA, /* U+0169a3: BAMUM LETTER PHASE-E NGEUREUT*/
+ RTUNI_ALPHA, /* U+0169a4: BAMUM LETTER PHASE-E SHEUAEQ*/
+ RTUNI_ALPHA, /* U+0169a5: BAMUM LETTER PHASE-E MGBEN*/
+ RTUNI_ALPHA, /* U+0169a6: BAMUM LETTER PHASE-E MBEE*/
+ RTUNI_ALPHA, /* U+0169a7: BAMUM LETTER PHASE-E NZAQ*/
+ RTUNI_ALPHA, /* U+0169a8: BAMUM LETTER PHASE-E NKOM*/
+ RTUNI_ALPHA, /* U+0169a9: BAMUM LETTER PHASE-E GBET*/
+ RTUNI_ALPHA, /* U+0169aa: BAMUM LETTER PHASE-E TUM*/
+ RTUNI_ALPHA, /* U+0169ab: BAMUM LETTER PHASE-E KUET*/
+ RTUNI_ALPHA, /* U+0169ac: BAMUM LETTER PHASE-E YAP*/
+ RTUNI_ALPHA, /* U+0169ad: BAMUM LETTER PHASE-E NYI CLEAVER*/
+ RTUNI_ALPHA, /* U+0169ae: BAMUM LETTER PHASE-E YIT*/
+ RTUNI_ALPHA, /* U+0169af: BAMUM LETTER PHASE-E MFEUQ*/
+ RTUNI_ALPHA, /* U+0169b0: BAMUM LETTER PHASE-E NDIAQ*/
+ RTUNI_ALPHA, /* U+0169b1: BAMUM LETTER PHASE-E PIEEQ*/
+ RTUNI_ALPHA, /* U+0169b2: BAMUM LETTER PHASE-E YUEQ*/
+ RTUNI_ALPHA, /* U+0169b3: BAMUM LETTER PHASE-E LEUAEM*/
+ RTUNI_ALPHA, /* U+0169b4: BAMUM LETTER PHASE-E FUE*/
+ RTUNI_ALPHA, /* U+0169b5: BAMUM LETTER PHASE-E GBEUX*/
+ RTUNI_ALPHA, /* U+0169b6: BAMUM LETTER PHASE-E NGKUP*/
+ RTUNI_ALPHA, /* U+0169b7: BAMUM LETTER PHASE-E KET*/
+ RTUNI_ALPHA, /* U+0169b8: BAMUM LETTER PHASE-E MAE*/
+ RTUNI_ALPHA, /* U+0169b9: BAMUM LETTER PHASE-E NGKAAMI*/
+ RTUNI_ALPHA, /* U+0169ba: BAMUM LETTER PHASE-E GHET*/
+ RTUNI_ALPHA, /* U+0169bb: BAMUM LETTER PHASE-E FA*/
+ RTUNI_ALPHA, /* U+0169bc: BAMUM LETTER PHASE-E NTUM*/
+ RTUNI_ALPHA, /* U+0169bd: BAMUM LETTER PHASE-E PEUT*/
+ RTUNI_ALPHA, /* U+0169be: BAMUM LETTER PHASE-E YEUM*/
+ RTUNI_ALPHA, /* U+0169bf: BAMUM LETTER PHASE-E NGGEUAE*/
+ RTUNI_ALPHA, /* U+0169c0: BAMUM LETTER PHASE-E NYI BETWEEN*/
+ RTUNI_ALPHA, /* U+0169c1: BAMUM LETTER PHASE-E NZUQ*/
+ RTUNI_ALPHA, /* U+0169c2: BAMUM LETTER PHASE-E POON*/
+ RTUNI_ALPHA, /* U+0169c3: BAMUM LETTER PHASE-E MIEE*/
+ RTUNI_ALPHA, /* U+0169c4: BAMUM LETTER PHASE-E FUET*/
+ RTUNI_ALPHA, /* U+0169c5: BAMUM LETTER PHASE-E NAE*/
+ RTUNI_ALPHA, /* U+0169c6: BAMUM LETTER PHASE-E MUAE*/
+ RTUNI_ALPHA, /* U+0169c7: BAMUM LETTER PHASE-E GHEUAE*/
+ RTUNI_ALPHA, /* U+0169c8: BAMUM LETTER PHASE-E FU I*/
+ RTUNI_ALPHA, /* U+0169c9: BAMUM LETTER PHASE-E MVI*/
+ RTUNI_ALPHA, /* U+0169ca: BAMUM LETTER PHASE-E PUAQ*/
+ RTUNI_ALPHA, /* U+0169cb: BAMUM LETTER PHASE-E NGKUM*/
+ RTUNI_ALPHA, /* U+0169cc: BAMUM LETTER PHASE-E KUT*/
+ RTUNI_ALPHA, /* U+0169cd: BAMUM LETTER PHASE-E PIET*/
+ RTUNI_ALPHA, /* U+0169ce: BAMUM LETTER PHASE-E NTAP*/
+ RTUNI_ALPHA, /* U+0169cf: BAMUM LETTER PHASE-E YEUAET*/
+ RTUNI_ALPHA, /* U+0169d0: BAMUM LETTER PHASE-E NGGUP*/
+ RTUNI_ALPHA, /* U+0169d1: BAMUM LETTER PHASE-E PA PEOPLE*/
+ RTUNI_ALPHA, /* U+0169d2: BAMUM LETTER PHASE-E FU CALL*/
+ RTUNI_ALPHA, /* U+0169d3: BAMUM LETTER PHASE-E FOM*/
+ RTUNI_ALPHA, /* U+0169d4: BAMUM LETTER PHASE-E NJEE*/
+ RTUNI_ALPHA, /* U+0169d5: BAMUM LETTER PHASE-E A*/
+ RTUNI_ALPHA, /* U+0169d6: BAMUM LETTER PHASE-E TOQ*/
+ RTUNI_ALPHA, /* U+0169d7: BAMUM LETTER PHASE-E O*/
+ RTUNI_ALPHA, /* U+0169d8: BAMUM LETTER PHASE-E I*/
+ RTUNI_ALPHA, /* U+0169d9: BAMUM LETTER PHASE-E LAQ*/
+ RTUNI_ALPHA, /* U+0169da: BAMUM LETTER PHASE-E PA PLURAL*/
+ RTUNI_ALPHA, /* U+0169db: BAMUM LETTER PHASE-E TAA*/
+ RTUNI_ALPHA, /* U+0169dc: BAMUM LETTER PHASE-E TAQ*/
+ RTUNI_ALPHA, /* U+0169dd: BAMUM LETTER PHASE-E NDAA MY HOUSE*/
+ RTUNI_ALPHA, /* U+0169de: BAMUM LETTER PHASE-E SHIQ*/
+ RTUNI_ALPHA, /* U+0169df: BAMUM LETTER PHASE-E YEUX*/
+ RTUNI_ALPHA, /* U+0169e0: BAMUM LETTER PHASE-E NGUAE*/
+ RTUNI_ALPHA, /* U+0169e1: BAMUM LETTER PHASE-E YUAEN*/
+ RTUNI_ALPHA, /* U+0169e2: BAMUM LETTER PHASE-E YOQ SWIMMING*/
+ RTUNI_ALPHA, /* U+0169e3: BAMUM LETTER PHASE-E YOQ COVER*/
+ RTUNI_ALPHA, /* U+0169e4: BAMUM LETTER PHASE-E YUQ*/
+ RTUNI_ALPHA, /* U+0169e5: BAMUM LETTER PHASE-E YUN*/
+ RTUNI_ALPHA, /* U+0169e6: BAMUM LETTER PHASE-E KEUX*/
+ RTUNI_ALPHA, /* U+0169e7: BAMUM LETTER PHASE-E PEUX*/
+ RTUNI_ALPHA, /* U+0169e8: BAMUM LETTER PHASE-E NJEE EPOCH*/
+ RTUNI_ALPHA, /* U+0169e9: BAMUM LETTER PHASE-E PUE*/
+ RTUNI_ALPHA, /* U+0169ea: BAMUM LETTER PHASE-E WUE*/
+ RTUNI_ALPHA, /* U+0169eb: BAMUM LETTER PHASE-E FEE*/
+ RTUNI_ALPHA, /* U+0169ec: BAMUM LETTER PHASE-E VEE*/
+ RTUNI_ALPHA, /* U+0169ed: BAMUM LETTER PHASE-E LU*/
+ RTUNI_ALPHA, /* U+0169ee: BAMUM LETTER PHASE-E MI*/
+ RTUNI_ALPHA, /* U+0169ef: BAMUM LETTER PHASE-E REUX*/
+ RTUNI_ALPHA, /* U+0169f0: BAMUM LETTER PHASE-E RAE*/
+ RTUNI_ALPHA, /* U+0169f1: BAMUM LETTER PHASE-E NGUAET*/
+ RTUNI_ALPHA, /* U+0169f2: BAMUM LETTER PHASE-E NGA*/
+ RTUNI_ALPHA, /* U+0169f3: BAMUM LETTER PHASE-E SHO*/
+ RTUNI_ALPHA, /* U+0169f4: BAMUM LETTER PHASE-E SHOQ*/
+ RTUNI_ALPHA, /* U+0169f5: BAMUM LETTER PHASE-E FU REMEDY*/
+ RTUNI_ALPHA, /* U+0169f6: BAMUM LETTER PHASE-E NA*/
+ RTUNI_ALPHA, /* U+0169f7: BAMUM LETTER PHASE-E PI*/
+ RTUNI_ALPHA, /* U+0169f8: BAMUM LETTER PHASE-E LOQ*/
+ RTUNI_ALPHA, /* U+0169f9: BAMUM LETTER PHASE-E KO*/
+ RTUNI_ALPHA, /* U+0169fa: BAMUM LETTER PHASE-E MEN*/
+ RTUNI_ALPHA, /* U+0169fb: BAMUM LETTER PHASE-E MA*/
+ RTUNI_ALPHA, /* U+0169fc: BAMUM LETTER PHASE-E MAQ*/
+ RTUNI_ALPHA, /* U+0169fd: BAMUM LETTER PHASE-E TEU*/
+ RTUNI_ALPHA, /* U+0169fe: BAMUM LETTER PHASE-E KI*/
+ RTUNI_ALPHA, /* U+0169ff: BAMUM LETTER PHASE-E MON*/
+ RTUNI_ALPHA, /* U+016a00: BAMUM LETTER PHASE-E TEN*/
+ RTUNI_ALPHA, /* U+016a01: BAMUM LETTER PHASE-E FAQ*/
+ RTUNI_ALPHA, /* U+016a02: BAMUM LETTER PHASE-E GHOM*/
+ RTUNI_ALPHA, /* U+016a03: BAMUM LETTER PHASE-F KA*/
+ RTUNI_ALPHA, /* U+016a04: BAMUM LETTER PHASE-F U*/
+ RTUNI_ALPHA, /* U+016a05: BAMUM LETTER PHASE-F KU*/
+ RTUNI_ALPHA, /* U+016a06: BAMUM LETTER PHASE-F EE*/
+ RTUNI_ALPHA, /* U+016a07: BAMUM LETTER PHASE-F REE*/
+ RTUNI_ALPHA, /* U+016a08: BAMUM LETTER PHASE-F TAE*/
+ RTUNI_ALPHA, /* U+016a09: BAMUM LETTER PHASE-F NYI*/
+ RTUNI_ALPHA, /* U+016a0a: BAMUM LETTER PHASE-F LA*/
+ RTUNI_ALPHA, /* U+016a0b: BAMUM LETTER PHASE-F RII*/
+ RTUNI_ALPHA, /* U+016a0c: BAMUM LETTER PHASE-F RIEE*/
+ RTUNI_ALPHA, /* U+016a0d: BAMUM LETTER PHASE-F MEEEE*/
+ RTUNI_ALPHA, /* U+016a0e: BAMUM LETTER PHASE-F TAA*/
+ RTUNI_ALPHA, /* U+016a0f: BAMUM LETTER PHASE-F NDAA*/
+ RTUNI_ALPHA, /* U+016a10: BAMUM LETTER PHASE-F NJAEM*/
+ RTUNI_ALPHA, /* U+016a11: BAMUM LETTER PHASE-F M*/
+ RTUNI_ALPHA, /* U+016a12: BAMUM LETTER PHASE-F SUU*/
+ RTUNI_ALPHA, /* U+016a13: BAMUM LETTER PHASE-F SHII*/
+ RTUNI_ALPHA, /* U+016a14: BAMUM LETTER PHASE-F SI*/
+ RTUNI_ALPHA, /* U+016a15: BAMUM LETTER PHASE-F SEUX*/
+ RTUNI_ALPHA, /* U+016a16: BAMUM LETTER PHASE-F KYEE*/
+ RTUNI_ALPHA, /* U+016a17: BAMUM LETTER PHASE-F KET*/
+ RTUNI_ALPHA, /* U+016a18: BAMUM LETTER PHASE-F NUAE*/
+ RTUNI_ALPHA, /* U+016a19: BAMUM LETTER PHASE-F NU*/
+ RTUNI_ALPHA, /* U+016a1a: BAMUM LETTER PHASE-F NJUAE*/
+ RTUNI_ALPHA, /* U+016a1b: BAMUM LETTER PHASE-F YOQ*/
+ RTUNI_ALPHA, /* U+016a1c: BAMUM LETTER PHASE-F SHU*/
+ RTUNI_ALPHA, /* U+016a1d: BAMUM LETTER PHASE-F YA*/
+ RTUNI_ALPHA, /* U+016a1e: BAMUM LETTER PHASE-F NSHA*/
+ RTUNI_ALPHA, /* U+016a1f: BAMUM LETTER PHASE-F PEUX*/
+ RTUNI_ALPHA, /* U+016a20: BAMUM LETTER PHASE-F NTEE*/
+ RTUNI_ALPHA, /* U+016a21: BAMUM LETTER PHASE-F WUE*/
+ RTUNI_ALPHA, /* U+016a22: BAMUM LETTER PHASE-F PEE*/
+ RTUNI_ALPHA, /* U+016a23: BAMUM LETTER PHASE-F RU*/
+ RTUNI_ALPHA, /* U+016a24: BAMUM LETTER PHASE-F NI*/
+ RTUNI_ALPHA, /* U+016a25: BAMUM LETTER PHASE-F REUX*/
+ RTUNI_ALPHA, /* U+016a26: BAMUM LETTER PHASE-F KEN*/
+ RTUNI_ALPHA, /* U+016a27: BAMUM LETTER PHASE-F NGKWAEN*/
+ RTUNI_ALPHA, /* U+016a28: BAMUM LETTER PHASE-F NGGA*/
+ RTUNI_ALPHA, /* U+016a29: BAMUM LETTER PHASE-F SHO*/
+ RTUNI_ALPHA, /* U+016a2a: BAMUM LETTER PHASE-F PUAE*/
+ RTUNI_ALPHA, /* U+016a2b: BAMUM LETTER PHASE-F FOM*/
+ RTUNI_ALPHA, /* U+016a2c: BAMUM LETTER PHASE-F WA*/
+ RTUNI_ALPHA, /* U+016a2d: BAMUM LETTER PHASE-F LI*/
+ RTUNI_ALPHA, /* U+016a2e: BAMUM LETTER PHASE-F LOQ*/
+ RTUNI_ALPHA, /* U+016a2f: BAMUM LETTER PHASE-F KO*/
+ RTUNI_ALPHA, /* U+016a30: BAMUM LETTER PHASE-F MBEN*/
+ RTUNI_ALPHA, /* U+016a31: BAMUM LETTER PHASE-F REN*/
+ RTUNI_ALPHA, /* U+016a32: BAMUM LETTER PHASE-F MA*/
+ RTUNI_ALPHA, /* U+016a33: BAMUM LETTER PHASE-F MO*/
+ RTUNI_ALPHA, /* U+016a34: BAMUM LETTER PHASE-F MBAA*/
+ RTUNI_ALPHA, /* U+016a35: BAMUM LETTER PHASE-F TET*/
+ RTUNI_ALPHA, /* U+016a36: BAMUM LETTER PHASE-F KPA*/
+ RTUNI_ALPHA, /* U+016a37: BAMUM LETTER PHASE-F SAMBA*/
+ RTUNI_ALPHA, /* U+016a38: BAMUM LETTER PHASE-F VUEQ*/
+ 0, /* U+016a39: */
+ 0, /* U+016a3a: */
+ 0, /* U+016a3b: */
+ 0, /* U+016a3c: */
+ 0, /* U+016a3d: */
+ 0, /* U+016a3e: */
+ 0, /* U+016a3f: */
+ 0, /* U+016a40: */
+ 0, /* U+016a41: */
+ 0, /* U+016a42: */
+ 0, /* U+016a43: */
+ 0, /* U+016a44: */
+ 0, /* U+016a45: */
+ 0, /* U+016a46: */
+ 0, /* U+016a47: */
+ 0, /* U+016a48: */
+ 0, /* U+016a49: */
+ 0, /* U+016a4a: */
+ 0, /* U+016a4b: */
+ 0, /* U+016a4c: */
+ 0, /* U+016a4d: */
+ 0, /* U+016a4e: */
+ 0, /* U+016a4f: */
+ 0, /* U+016a50: */
+ 0, /* U+016a51: */
+ 0, /* U+016a52: */
+ 0, /* U+016a53: */
+ 0, /* U+016a54: */
+ 0, /* U+016a55: */
+ 0, /* U+016a56: */
+ 0, /* U+016a57: */
+ 0, /* U+016a58: */
+ 0, /* U+016a59: */
+ 0, /* U+016a5a: */
+ 0, /* U+016a5b: */
+ 0, /* U+016a5c: */
+ 0, /* U+016a5d: */
+ 0, /* U+016a5e: */
+ 0, /* U+016a5f: */
+ 0, /* U+016a60: */
+ 0, /* U+016a61: */
+ 0, /* U+016a62: */
+ 0, /* U+016a63: */
+ 0, /* U+016a64: */
+ 0, /* U+016a65: */
+ 0, /* U+016a66: */
+ 0, /* U+016a67: */
+ 0, /* U+016a68: */
+ 0, /* U+016a69: */
+ 0, /* U+016a6a: */
+ 0, /* U+016a6b: */
+ 0, /* U+016a6c: */
+ 0, /* U+016a6d: */
+ 0, /* U+016a6e: */
+ 0, /* U+016a6f: */
+ 0, /* U+016a70: */
+ 0, /* U+016a71: */
+ 0, /* U+016a72: */
+ 0, /* U+016a73: */
+ 0, /* U+016a74: */
+ 0, /* U+016a75: */
+ 0, /* U+016a76: */
+ 0, /* U+016a77: */
+ 0, /* U+016a78: */
+ 0, /* U+016a79: */
+ 0, /* U+016a7a: */
+ 0, /* U+016a7b: */
+ 0, /* U+016a7c: */
+ 0, /* U+016a7d: */
+ 0, /* U+016a7e: */
+ 0, /* U+016a7f: */
+ 0, /* U+016a80: */
+ 0, /* U+016a81: */
+ 0, /* U+016a82: */
+ 0, /* U+016a83: */
+ 0, /* U+016a84: */
+ 0, /* U+016a85: */
+ 0, /* U+016a86: */
+ 0, /* U+016a87: */
+ 0, /* U+016a88: */
+ 0, /* U+016a89: */
+ 0, /* U+016a8a: */
+ 0, /* U+016a8b: */
+ 0, /* U+016a8c: */
+ 0, /* U+016a8d: */
+ 0, /* U+016a8e: */
+ 0, /* U+016a8f: */
+ 0, /* U+016a90: */
+ 0, /* U+016a91: */
+ 0, /* U+016a92: */
+ 0, /* U+016a93: */
+ 0, /* U+016a94: */
+ 0, /* U+016a95: */
+ 0, /* U+016a96: */
+ 0, /* U+016a97: */
+ 0, /* U+016a98: */
+ 0, /* U+016a99: */
+ 0, /* U+016a9a: */
+ 0, /* U+016a9b: */
+ 0, /* U+016a9c: */
+ 0, /* U+016a9d: */
+ 0, /* U+016a9e: */
+ 0, /* U+016a9f: */
+ 0, /* U+016aa0: */
+ 0, /* U+016aa1: */
+ 0, /* U+016aa2: */
+ 0, /* U+016aa3: */
+ 0, /* U+016aa4: */
+ 0, /* U+016aa5: */
+ 0, /* U+016aa6: */
+ 0, /* U+016aa7: */
+ 0, /* U+016aa8: */
+ 0, /* U+016aa9: */
+ 0, /* U+016aaa: */
+ 0, /* U+016aab: */
+ 0, /* U+016aac: */
+ 0, /* U+016aad: */
+ 0, /* U+016aae: */
+ 0, /* U+016aaf: */
+ 0, /* U+016ab0: */
+ 0, /* U+016ab1: */
+ 0, /* U+016ab2: */
+ 0, /* U+016ab3: */
+ 0, /* U+016ab4: */
+ 0, /* U+016ab5: */
+ 0, /* U+016ab6: */
+ 0, /* U+016ab7: */
+ 0, /* U+016ab8: */
+ 0, /* U+016ab9: */
+ 0, /* U+016aba: */
+ 0, /* U+016abb: */
+ 0, /* U+016abc: */
+ 0, /* U+016abd: */
+ 0, /* U+016abe: */
+ 0, /* U+016abf: */
+ 0, /* U+016ac0: */
+ 0, /* U+016ac1: */
+ 0, /* U+016ac2: */
+ 0, /* U+016ac3: */
+ 0, /* U+016ac4: */
+ 0, /* U+016ac5: */
+ 0, /* U+016ac6: */
+ 0, /* U+016ac7: */
+ 0, /* U+016ac8: */
+ 0, /* U+016ac9: */
+ 0, /* U+016aca: */
+ 0, /* U+016acb: */
+ 0, /* U+016acc: */
+ 0, /* U+016acd: */
+ 0, /* U+016ace: */
+ 0, /* U+016acf: */
+ 0, /* U+016ad0: */
+ 0, /* U+016ad1: */
+ 0, /* U+016ad2: */
+ 0, /* U+016ad3: */
+ 0, /* U+016ad4: */
+ 0, /* U+016ad5: */
+ 0, /* U+016ad6: */
+ 0, /* U+016ad7: */
+ 0, /* U+016ad8: */
+ 0, /* U+016ad9: */
+ 0, /* U+016ada: */
+ 0, /* U+016adb: */
+ 0, /* U+016adc: */
+ 0, /* U+016add: */
+ 0, /* U+016ade: */
+ 0, /* U+016adf: */
+ 0, /* U+016ae0: */
+ 0, /* U+016ae1: */
+ 0, /* U+016ae2: */
+ 0, /* U+016ae3: */
+ 0, /* U+016ae4: */
+ 0, /* U+016ae5: */
+ 0, /* U+016ae6: */
+ 0, /* U+016ae7: */
+ 0, /* U+016ae8: */
+ 0, /* U+016ae9: */
+ 0, /* U+016aea: */
+ 0, /* U+016aeb: */
+ 0, /* U+016aec: */
+ 0, /* U+016aed: */
+ 0, /* U+016aee: */
+ 0, /* U+016aef: */
+ 0, /* U+016af0: */
+ 0, /* U+016af1: */
+ 0, /* U+016af2: */
+ 0, /* U+016af3: */
+ 0, /* U+016af4: */
+ 0, /* U+016af5: */
+ 0, /* U+016af6: */
+ 0, /* U+016af7: */
+ 0, /* U+016af8: */
+ 0, /* U+016af9: */
+ 0, /* U+016afa: */
+ 0, /* U+016afb: */
+ 0, /* U+016afc: */
+ 0, /* U+016afd: */
+ 0, /* U+016afe: */
+ 0, /* U+016aff: */
+ 0, /* U+016b00: */
+ 0, /* U+016b01: */
+ 0, /* U+016b02: */
+ 0, /* U+016b03: */
+ 0, /* U+016b04: */
+ 0, /* U+016b05: */
+ 0, /* U+016b06: */
+ 0, /* U+016b07: */
+ 0, /* U+016b08: */
+ 0, /* U+016b09: */
+ 0, /* U+016b0a: */
+ 0, /* U+016b0b: */
+ 0, /* U+016b0c: */
+ 0, /* U+016b0d: */
+ 0, /* U+016b0e: */
+ 0, /* U+016b0f: */
+ 0, /* U+016b10: */
+ 0, /* U+016b11: */
+ 0, /* U+016b12: */
+ 0, /* U+016b13: */
+ 0, /* U+016b14: */
+ 0, /* U+016b15: */
+ 0, /* U+016b16: */
+ 0, /* U+016b17: */
+ 0, /* U+016b18: */
+ 0, /* U+016b19: */
+ 0, /* U+016b1a: */
+ 0, /* U+016b1b: */
+ 0, /* U+016b1c: */
+ 0, /* U+016b1d: */
+ 0, /* U+016b1e: */
+ 0, /* U+016b1f: */
+ 0, /* U+016b20: */
+ 0, /* U+016b21: */
+ 0, /* U+016b22: */
+ 0, /* U+016b23: */
+ 0, /* U+016b24: */
+ 0, /* U+016b25: */
+ 0, /* U+016b26: */
+ 0, /* U+016b27: */
+ 0, /* U+016b28: */
+ 0, /* U+016b29: */
+ 0, /* U+016b2a: */
+ 0, /* U+016b2b: */
+ 0, /* U+016b2c: */
+ 0, /* U+016b2d: */
+ 0, /* U+016b2e: */
+ 0, /* U+016b2f: */
+ 0, /* U+016b30: */
+ 0, /* U+016b31: */
+ 0, /* U+016b32: */
+ 0, /* U+016b33: */
+ 0, /* U+016b34: */
+ 0, /* U+016b35: */
+ 0, /* U+016b36: */
+ 0, /* U+016b37: */
+ 0, /* U+016b38: */
+ 0, /* U+016b39: */
+ 0, /* U+016b3a: */
+ 0, /* U+016b3b: */
+ 0, /* U+016b3c: */
+ 0, /* U+016b3d: */
+ 0, /* U+016b3e: */
+ 0, /* U+016b3f: */
+ 0, /* U+016b40: */
+ 0, /* U+016b41: */
+ 0, /* U+016b42: */
+ 0, /* U+016b43: */
+ 0, /* U+016b44: */
+ 0, /* U+016b45: */
+ 0, /* U+016b46: */
+ 0, /* U+016b47: */
+ 0, /* U+016b48: */
+ 0, /* U+016b49: */
+ 0, /* U+016b4a: */
+ 0, /* U+016b4b: */
+ 0, /* U+016b4c: */
+ 0, /* U+016b4d: */
+ 0, /* U+016b4e: */
+ 0, /* U+016b4f: */
+ 0, /* U+016b50: */
+ 0, /* U+016b51: */
+ 0, /* U+016b52: */
+ 0, /* U+016b53: */
+ 0, /* U+016b54: */
+ 0, /* U+016b55: */
+ 0, /* U+016b56: */
+ 0, /* U+016b57: */
+ 0, /* U+016b58: */
+ 0, /* U+016b59: */
+ 0, /* U+016b5a: */
+ 0, /* U+016b5b: */
+ 0, /* U+016b5c: */
+ 0, /* U+016b5d: */
+ 0, /* U+016b5e: */
+ 0, /* U+016b5f: */
+ 0, /* U+016b60: */
+ 0, /* U+016b61: */
+ 0, /* U+016b62: */
+ 0, /* U+016b63: */
+ 0, /* U+016b64: */
+ 0, /* U+016b65: */
+ 0, /* U+016b66: */
+ 0, /* U+016b67: */
+ 0, /* U+016b68: */
+ 0, /* U+016b69: */
+ 0, /* U+016b6a: */
+ 0, /* U+016b6b: */
+ 0, /* U+016b6c: */
+ 0, /* U+016b6d: */
+ 0, /* U+016b6e: */
+ 0, /* U+016b6f: */
+ 0, /* U+016b70: */
+ 0, /* U+016b71: */
+ 0, /* U+016b72: */
+ 0, /* U+016b73: */
+ 0, /* U+016b74: */
+ 0, /* U+016b75: */
+ 0, /* U+016b76: */
+ 0, /* U+016b77: */
+ 0, /* U+016b78: */
+ 0, /* U+016b79: */
+ 0, /* U+016b7a: */
+ 0, /* U+016b7b: */
+ 0, /* U+016b7c: */
+ 0, /* U+016b7d: */
+ 0, /* U+016b7e: */
+ 0, /* U+016b7f: */
+ 0, /* U+016b80: */
+ 0, /* U+016b81: */
+ 0, /* U+016b82: */
+ 0, /* U+016b83: */
+ 0, /* U+016b84: */
+ 0, /* U+016b85: */
+ 0, /* U+016b86: */
+ 0, /* U+016b87: */
+ 0, /* U+016b88: */
+ 0, /* U+016b89: */
+ 0, /* U+016b8a: */
+ 0, /* U+016b8b: */
+ 0, /* U+016b8c: */
+ 0, /* U+016b8d: */
+ 0, /* U+016b8e: */
+ 0, /* U+016b8f: */
+ 0, /* U+016b90: */
+ 0, /* U+016b91: */
+ 0, /* U+016b92: */
+ 0, /* U+016b93: */
+ 0, /* U+016b94: */
+ 0, /* U+016b95: */
+ 0, /* U+016b96: */
+ 0, /* U+016b97: */
+ 0, /* U+016b98: */
+ 0, /* U+016b99: */
+ 0, /* U+016b9a: */
+ 0, /* U+016b9b: */
+ 0, /* U+016b9c: */
+ 0, /* U+016b9d: */
+ 0, /* U+016b9e: */
+ 0, /* U+016b9f: */
+ 0, /* U+016ba0: */
+ 0, /* U+016ba1: */
+ 0, /* U+016ba2: */
+ 0, /* U+016ba3: */
+ 0, /* U+016ba4: */
+ 0, /* U+016ba5: */
+ 0, /* U+016ba6: */
+ 0, /* U+016ba7: */
+ 0, /* U+016ba8: */
+ 0, /* U+016ba9: */
+ 0, /* U+016baa: */
+ 0, /* U+016bab: */
+ 0, /* U+016bac: */
+ 0, /* U+016bad: */
+ 0, /* U+016bae: */
+ 0, /* U+016baf: */
+ 0, /* U+016bb0: */
+ 0, /* U+016bb1: */
+ 0, /* U+016bb2: */
+ 0, /* U+016bb3: */
+ 0, /* U+016bb4: */
+ 0, /* U+016bb5: */
+ 0, /* U+016bb6: */
+ 0, /* U+016bb7: */
+ 0, /* U+016bb8: */
+ 0, /* U+016bb9: */
+ 0, /* U+016bba: */
+ 0, /* U+016bbb: */
+ 0, /* U+016bbc: */
+ 0, /* U+016bbd: */
+ 0, /* U+016bbe: */
+ 0, /* U+016bbf: */
+ 0, /* U+016bc0: */
+ 0, /* U+016bc1: */
+ 0, /* U+016bc2: */
+ 0, /* U+016bc3: */
+ 0, /* U+016bc4: */
+ 0, /* U+016bc5: */
+ 0, /* U+016bc6: */
+ 0, /* U+016bc7: */
+ 0, /* U+016bc8: */
+ 0, /* U+016bc9: */
+ 0, /* U+016bca: */
+ 0, /* U+016bcb: */
+ 0, /* U+016bcc: */
+ 0, /* U+016bcd: */
+ 0, /* U+016bce: */
+ 0, /* U+016bcf: */
+ 0, /* U+016bd0: */
+ 0, /* U+016bd1: */
+ 0, /* U+016bd2: */
+ 0, /* U+016bd3: */
+ 0, /* U+016bd4: */
+ 0, /* U+016bd5: */
+ 0, /* U+016bd6: */
+ 0, /* U+016bd7: */
+ 0, /* U+016bd8: */
+ 0, /* U+016bd9: */
+ 0, /* U+016bda: */
+ 0, /* U+016bdb: */
+ 0, /* U+016bdc: */
+ 0, /* U+016bdd: */
+ 0, /* U+016bde: */
+ 0, /* U+016bdf: */
+ 0, /* U+016be0: */
+ 0, /* U+016be1: */
+ 0, /* U+016be2: */
+ 0, /* U+016be3: */
+ 0, /* U+016be4: */
+ 0, /* U+016be5: */
+ 0, /* U+016be6: */
+ 0, /* U+016be7: */
+ 0, /* U+016be8: */
+ 0, /* U+016be9: */
+ 0, /* U+016bea: */
+ 0, /* U+016beb: */
+ 0, /* U+016bec: */
+ 0, /* U+016bed: */
+ 0, /* U+016bee: */
+ 0, /* U+016bef: */
+ 0, /* U+016bf0: */
+ 0, /* U+016bf1: */
+ 0, /* U+016bf2: */
+ 0, /* U+016bf3: */
+ 0, /* U+016bf4: */
+ 0, /* U+016bf5: */
+ 0, /* U+016bf6: */
+ 0, /* U+016bf7: */
+ 0, /* U+016bf8: */
+ 0, /* U+016bf9: */
+ 0, /* U+016bfa: */
+ 0, /* U+016bfb: */
+ 0, /* U+016bfc: */
+ 0, /* U+016bfd: */
+ 0, /* U+016bfe: */
+ 0, /* U+016bff: */
+ 0, /* U+016c00: */
+ 0, /* U+016c01: */
+ 0, /* U+016c02: */
+ 0, /* U+016c03: */
+ 0, /* U+016c04: */
+ 0, /* U+016c05: */
+ 0, /* U+016c06: */
+ 0, /* U+016c07: */
+ 0, /* U+016c08: */
+ 0, /* U+016c09: */
+ 0, /* U+016c0a: */
+ 0, /* U+016c0b: */
+ 0, /* U+016c0c: */
+ 0, /* U+016c0d: */
+ 0, /* U+016c0e: */
+ 0, /* U+016c0f: */
+ 0, /* U+016c10: */
+ 0, /* U+016c11: */
+ 0, /* U+016c12: */
+ 0, /* U+016c13: */
+ 0, /* U+016c14: */
+ 0, /* U+016c15: */
+ 0, /* U+016c16: */
+ 0, /* U+016c17: */
+ 0, /* U+016c18: */
+ 0, /* U+016c19: */
+ 0, /* U+016c1a: */
+ 0, /* U+016c1b: */
+ 0, /* U+016c1c: */
+ 0, /* U+016c1d: */
+ 0, /* U+016c1e: */
+ 0, /* U+016c1f: */
+ 0, /* U+016c20: */
+ 0, /* U+016c21: */
+ 0, /* U+016c22: */
+ 0, /* U+016c23: */
+ 0, /* U+016c24: */
+ 0, /* U+016c25: */
+ 0, /* U+016c26: */
+ 0, /* U+016c27: */
+ 0, /* U+016c28: */
+ 0, /* U+016c29: */
+ 0, /* U+016c2a: */
+ 0, /* U+016c2b: */
+ 0, /* U+016c2c: */
+ 0, /* U+016c2d: */
+ 0, /* U+016c2e: */
+ 0, /* U+016c2f: */
+ 0, /* U+016c30: */
+ 0, /* U+016c31: */
+ 0, /* U+016c32: */
+ 0, /* U+016c33: */
+ 0, /* U+016c34: */
+ 0, /* U+016c35: */
+ 0, /* U+016c36: */
+ 0, /* U+016c37: */
+ 0, /* U+016c38: */
+ 0, /* U+016c39: */
+ 0, /* U+016c3a: */
+ 0, /* U+016c3b: */
+ 0, /* U+016c3c: */
+ 0, /* U+016c3d: */
+ 0, /* U+016c3e: */
+ 0, /* U+016c3f: */
+ 0, /* U+016c40: */
+ 0, /* U+016c41: */
+ 0, /* U+016c42: */
+ 0, /* U+016c43: */
+ 0, /* U+016c44: */
+ 0, /* U+016c45: */
+ 0, /* U+016c46: */
+ 0, /* U+016c47: */
+ 0, /* U+016c48: */
+ 0, /* U+016c49: */
+ 0, /* U+016c4a: */
+ 0, /* U+016c4b: */
+ 0, /* U+016c4c: */
+ 0, /* U+016c4d: */
+ 0, /* U+016c4e: */
+ 0, /* U+016c4f: */
+ 0, /* U+016c50: */
+ 0, /* U+016c51: */
+ 0, /* U+016c52: */
+ 0, /* U+016c53: */
+ 0, /* U+016c54: */
+ 0, /* U+016c55: */
+ 0, /* U+016c56: */
+ 0, /* U+016c57: */
+ 0, /* U+016c58: */
+ 0, /* U+016c59: */
+ 0, /* U+016c5a: */
+ 0, /* U+016c5b: */
+ 0, /* U+016c5c: */
+ 0, /* U+016c5d: */
+ 0, /* U+016c5e: */
+ 0, /* U+016c5f: */
+ 0, /* U+016c60: */
+ 0, /* U+016c61: */
+ 0, /* U+016c62: */
+ 0, /* U+016c63: */
+ 0, /* U+016c64: */
+ 0, /* U+016c65: */
+ 0, /* U+016c66: */
+ 0, /* U+016c67: */
+ 0, /* U+016c68: */
+ 0, /* U+016c69: */
+ 0, /* U+016c6a: */
+ 0, /* U+016c6b: */
+ 0, /* U+016c6c: */
+ 0, /* U+016c6d: */
+ 0, /* U+016c6e: */
+ 0, /* U+016c6f: */
+ 0, /* U+016c70: */
+ 0, /* U+016c71: */
+ 0, /* U+016c72: */
+ 0, /* U+016c73: */
+ 0, /* U+016c74: */
+ 0, /* U+016c75: */
+ 0, /* U+016c76: */
+ 0, /* U+016c77: */
+ 0, /* U+016c78: */
+ 0, /* U+016c79: */
+ 0, /* U+016c7a: */
+ 0, /* U+016c7b: */
+ 0, /* U+016c7c: */
+ 0, /* U+016c7d: */
+ 0, /* U+016c7e: */
+ 0, /* U+016c7f: */
+ 0, /* U+016c80: */
+ 0, /* U+016c81: */
+ 0, /* U+016c82: */
+ 0, /* U+016c83: */
+ 0, /* U+016c84: */
+ 0, /* U+016c85: */
+ 0, /* U+016c86: */
+ 0, /* U+016c87: */
+ 0, /* U+016c88: */
+ 0, /* U+016c89: */
+ 0, /* U+016c8a: */
+ 0, /* U+016c8b: */
+ 0, /* U+016c8c: */
+ 0, /* U+016c8d: */
+ 0, /* U+016c8e: */
+ 0, /* U+016c8f: */
+ 0, /* U+016c90: */
+ 0, /* U+016c91: */
+ 0, /* U+016c92: */
+ 0, /* U+016c93: */
+ 0, /* U+016c94: */
+ 0, /* U+016c95: */
+ 0, /* U+016c96: */
+ 0, /* U+016c97: */
+ 0, /* U+016c98: */
+ 0, /* U+016c99: */
+ 0, /* U+016c9a: */
+ 0, /* U+016c9b: */
+ 0, /* U+016c9c: */
+ 0, /* U+016c9d: */
+ 0, /* U+016c9e: */
+ 0, /* U+016c9f: */
+ 0, /* U+016ca0: */
+ 0, /* U+016ca1: */
+ 0, /* U+016ca2: */
+ 0, /* U+016ca3: */
+ 0, /* U+016ca4: */
+ 0, /* U+016ca5: */
+ 0, /* U+016ca6: */
+ 0, /* U+016ca7: */
+ 0, /* U+016ca8: */
+ 0, /* U+016ca9: */
+ 0, /* U+016caa: */
+ 0, /* U+016cab: */
+ 0, /* U+016cac: */
+ 0, /* U+016cad: */
+ 0, /* U+016cae: */
+ 0, /* U+016caf: */
+ 0, /* U+016cb0: */
+ 0, /* U+016cb1: */
+ 0, /* U+016cb2: */
+ 0, /* U+016cb3: */
+ 0, /* U+016cb4: */
+ 0, /* U+016cb5: */
+ 0, /* U+016cb6: */
+ 0, /* U+016cb7: */
+ 0, /* U+016cb8: */
+ 0, /* U+016cb9: */
+ 0, /* U+016cba: */
+ 0, /* U+016cbb: */
+ 0, /* U+016cbc: */
+ 0, /* U+016cbd: */
+ 0, /* U+016cbe: */
+ 0, /* U+016cbf: */
+ 0, /* U+016cc0: */
+ 0, /* U+016cc1: */
+ 0, /* U+016cc2: */
+ 0, /* U+016cc3: */
+ 0, /* U+016cc4: */
+ 0, /* U+016cc5: */
+ 0, /* U+016cc6: */
+ 0, /* U+016cc7: */
+ 0, /* U+016cc8: */
+ 0, /* U+016cc9: */
+ 0, /* U+016cca: */
+ 0, /* U+016ccb: */
+ 0, /* U+016ccc: */
+ 0, /* U+016ccd: */
+ 0, /* U+016cce: */
+ 0, /* U+016ccf: */
+ 0, /* U+016cd0: */
+ 0, /* U+016cd1: */
+ 0, /* U+016cd2: */
+ 0, /* U+016cd3: */
+ 0, /* U+016cd4: */
+ 0, /* U+016cd5: */
+ 0, /* U+016cd6: */
+ 0, /* U+016cd7: */
+ 0, /* U+016cd8: */
+ 0, /* U+016cd9: */
+ 0, /* U+016cda: */
+ 0, /* U+016cdb: */
+ 0, /* U+016cdc: */
+ 0, /* U+016cdd: */
+ 0, /* U+016cde: */
+ 0, /* U+016cdf: */
+ 0, /* U+016ce0: */
+ 0, /* U+016ce1: */
+ 0, /* U+016ce2: */
+ 0, /* U+016ce3: */
+ 0, /* U+016ce4: */
+ 0, /* U+016ce5: */
+ 0, /* U+016ce6: */
+ 0, /* U+016ce7: */
+ 0, /* U+016ce8: */
+ 0, /* U+016ce9: */
+ 0, /* U+016cea: */
+ 0, /* U+016ceb: */
+ 0, /* U+016cec: */
+ 0, /* U+016ced: */
+ 0, /* U+016cee: */
+ 0, /* U+016cef: */
+ 0, /* U+016cf0: */
+ 0, /* U+016cf1: */
+ 0, /* U+016cf2: */
+ 0, /* U+016cf3: */
+ 0, /* U+016cf4: */
+ 0, /* U+016cf5: */
+ 0, /* U+016cf6: */
+ 0, /* U+016cf7: */
+ 0, /* U+016cf8: */
+ 0, /* U+016cf9: */
+ 0, /* U+016cfa: */
+ 0, /* U+016cfb: */
+ 0, /* U+016cfc: */
+ 0, /* U+016cfd: */
+ 0, /* U+016cfe: */
+ 0, /* U+016cff: */
+ 0, /* U+016d00: */
+ 0, /* U+016d01: */
+ 0, /* U+016d02: */
+ 0, /* U+016d03: */
+ 0, /* U+016d04: */
+ 0, /* U+016d05: */
+ 0, /* U+016d06: */
+ 0, /* U+016d07: */
+ 0, /* U+016d08: */
+ 0, /* U+016d09: */
+ 0, /* U+016d0a: */
+ 0, /* U+016d0b: */
+ 0, /* U+016d0c: */
+ 0, /* U+016d0d: */
+ 0, /* U+016d0e: */
+ 0, /* U+016d0f: */
+ 0, /* U+016d10: */
+ 0, /* U+016d11: */
+ 0, /* U+016d12: */
+ 0, /* U+016d13: */
+ 0, /* U+016d14: */
+ 0, /* U+016d15: */
+ 0, /* U+016d16: */
+ 0, /* U+016d17: */
+ 0, /* U+016d18: */
+ 0, /* U+016d19: */
+ 0, /* U+016d1a: */
+ 0, /* U+016d1b: */
+ 0, /* U+016d1c: */
+ 0, /* U+016d1d: */
+ 0, /* U+016d1e: */
+ 0, /* U+016d1f: */
+ 0, /* U+016d20: */
+ 0, /* U+016d21: */
+ 0, /* U+016d22: */
+ 0, /* U+016d23: */
+ 0, /* U+016d24: */
+ 0, /* U+016d25: */
+ 0, /* U+016d26: */
+ 0, /* U+016d27: */
+ 0, /* U+016d28: */
+ 0, /* U+016d29: */
+ 0, /* U+016d2a: */
+ 0, /* U+016d2b: */
+ 0, /* U+016d2c: */
+ 0, /* U+016d2d: */
+ 0, /* U+016d2e: */
+ 0, /* U+016d2f: */
+ 0, /* U+016d30: */
+ 0, /* U+016d31: */
+ 0, /* U+016d32: */
+ 0, /* U+016d33: */
+ 0, /* U+016d34: */
+ 0, /* U+016d35: */
+ 0, /* U+016d36: */
+ 0, /* U+016d37: */
+ 0, /* U+016d38: */
+ 0, /* U+016d39: */
+ 0, /* U+016d3a: */
+ 0, /* U+016d3b: */
+ 0, /* U+016d3c: */
+ 0, /* U+016d3d: */
+ 0, /* U+016d3e: */
+ 0, /* U+016d3f: */
+ 0, /* U+016d40: */
+ 0, /* U+016d41: */
+ 0, /* U+016d42: */
+ 0, /* U+016d43: */
+ 0, /* U+016d44: */
+ 0, /* U+016d45: */
+ 0, /* U+016d46: */
+ 0, /* U+016d47: */
+ 0, /* U+016d48: */
+ 0, /* U+016d49: */
+ 0, /* U+016d4a: */
+ 0, /* U+016d4b: */
+ 0, /* U+016d4c: */
+ 0, /* U+016d4d: */
+ 0, /* U+016d4e: */
+ 0, /* U+016d4f: */
+ 0, /* U+016d50: */
+ 0, /* U+016d51: */
+ 0, /* U+016d52: */
+ 0, /* U+016d53: */
+ 0, /* U+016d54: */
+ 0, /* U+016d55: */
+ 0, /* U+016d56: */
+ 0, /* U+016d57: */
+ 0, /* U+016d58: */
+ 0, /* U+016d59: */
+ 0, /* U+016d5a: */
+ 0, /* U+016d5b: */
+ 0, /* U+016d5c: */
+ 0, /* U+016d5d: */
+ 0, /* U+016d5e: */
+ 0, /* U+016d5f: */
+ 0, /* U+016d60: */
+ 0, /* U+016d61: */
+ 0, /* U+016d62: */
+ 0, /* U+016d63: */
+ 0, /* U+016d64: */
+ 0, /* U+016d65: */
+ 0, /* U+016d66: */
+ 0, /* U+016d67: */
+ 0, /* U+016d68: */
+ 0, /* U+016d69: */
+ 0, /* U+016d6a: */
+ 0, /* U+016d6b: */
+ 0, /* U+016d6c: */
+ 0, /* U+016d6d: */
+ 0, /* U+016d6e: */
+ 0, /* U+016d6f: */
+ 0, /* U+016d70: */
+ 0, /* U+016d71: */
+ 0, /* U+016d72: */
+ 0, /* U+016d73: */
+ 0, /* U+016d74: */
+ 0, /* U+016d75: */
+ 0, /* U+016d76: */
+ 0, /* U+016d77: */
+ 0, /* U+016d78: */
+ 0, /* U+016d79: */
+ 0, /* U+016d7a: */
+ 0, /* U+016d7b: */
+ 0, /* U+016d7c: */
+ 0, /* U+016d7d: */
+ 0, /* U+016d7e: */
+ 0, /* U+016d7f: */
+ 0, /* U+016d80: */
+ 0, /* U+016d81: */
+ 0, /* U+016d82: */
+ 0, /* U+016d83: */
+ 0, /* U+016d84: */
+ 0, /* U+016d85: */
+ 0, /* U+016d86: */
+ 0, /* U+016d87: */
+ 0, /* U+016d88: */
+ 0, /* U+016d89: */
+ 0, /* U+016d8a: */
+ 0, /* U+016d8b: */
+ 0, /* U+016d8c: */
+ 0, /* U+016d8d: */
+ 0, /* U+016d8e: */
+ 0, /* U+016d8f: */
+ 0, /* U+016d90: */
+ 0, /* U+016d91: */
+ 0, /* U+016d92: */
+ 0, /* U+016d93: */
+ 0, /* U+016d94: */
+ 0, /* U+016d95: */
+ 0, /* U+016d96: */
+ 0, /* U+016d97: */
+ 0, /* U+016d98: */
+ 0, /* U+016d99: */
+ 0, /* U+016d9a: */
+ 0, /* U+016d9b: */
+ 0, /* U+016d9c: */
+ 0, /* U+016d9d: */
+ 0, /* U+016d9e: */
+ 0, /* U+016d9f: */
+ 0, /* U+016da0: */
+ 0, /* U+016da1: */
+ 0, /* U+016da2: */
+ 0, /* U+016da3: */
+ 0, /* U+016da4: */
+ 0, /* U+016da5: */
+ 0, /* U+016da6: */
+ 0, /* U+016da7: */
+ 0, /* U+016da8: */
+ 0, /* U+016da9: */
+ 0, /* U+016daa: */
+ 0, /* U+016dab: */
+ 0, /* U+016dac: */
+ 0, /* U+016dad: */
+ 0, /* U+016dae: */
+ 0, /* U+016daf: */
+ 0, /* U+016db0: */
+ 0, /* U+016db1: */
+ 0, /* U+016db2: */
+ 0, /* U+016db3: */
+ 0, /* U+016db4: */
+ 0, /* U+016db5: */
+ 0, /* U+016db6: */
+ 0, /* U+016db7: */
+ 0, /* U+016db8: */
+ 0, /* U+016db9: */
+ 0, /* U+016dba: */
+ 0, /* U+016dbb: */
+ 0, /* U+016dbc: */
+ 0, /* U+016dbd: */
+ 0, /* U+016dbe: */
+ 0, /* U+016dbf: */
+ 0, /* U+016dc0: */
+ 0, /* U+016dc1: */
+ 0, /* U+016dc2: */
+ 0, /* U+016dc3: */
+ 0, /* U+016dc4: */
+ 0, /* U+016dc5: */
+ 0, /* U+016dc6: */
+ 0, /* U+016dc7: */
+ 0, /* U+016dc8: */
+ 0, /* U+016dc9: */
+ 0, /* U+016dca: */
+ 0, /* U+016dcb: */
+ 0, /* U+016dcc: */
+ 0, /* U+016dcd: */
+ 0, /* U+016dce: */
+ 0, /* U+016dcf: */
+ 0, /* U+016dd0: */
+ 0, /* U+016dd1: */
+ 0, /* U+016dd2: */
+ 0, /* U+016dd3: */
+ 0, /* U+016dd4: */
+ 0, /* U+016dd5: */
+ 0, /* U+016dd6: */
+ 0, /* U+016dd7: */
+ 0, /* U+016dd8: */
+ 0, /* U+016dd9: */
+ 0, /* U+016dda: */
+ 0, /* U+016ddb: */
+ 0, /* U+016ddc: */
+ 0, /* U+016ddd: */
+ 0, /* U+016dde: */
+ 0, /* U+016ddf: */
+ 0, /* U+016de0: */
+ 0, /* U+016de1: */
+ 0, /* U+016de2: */
+ 0, /* U+016de3: */
+ 0, /* U+016de4: */
+ 0, /* U+016de5: */
+ 0, /* U+016de6: */
+ 0, /* U+016de7: */
+ 0, /* U+016de8: */
+ 0, /* U+016de9: */
+ 0, /* U+016dea: */
+ 0, /* U+016deb: */
+ 0, /* U+016dec: */
+ 0, /* U+016ded: */
+ 0, /* U+016dee: */
+ 0, /* U+016def: */
+ 0, /* U+016df0: */
+ 0, /* U+016df1: */
+ 0, /* U+016df2: */
+ 0, /* U+016df3: */
+ 0, /* U+016df4: */
+ 0, /* U+016df5: */
+ 0, /* U+016df6: */
+ 0, /* U+016df7: */
+ 0, /* U+016df8: */
+ 0, /* U+016df9: */
+ 0, /* U+016dfa: */
+ 0, /* U+016dfb: */
+ 0, /* U+016dfc: */
+ 0, /* U+016dfd: */
+ 0, /* U+016dfe: */
+ 0, /* U+016dff: */
+ 0, /* U+016e00: */
+ 0, /* U+016e01: */
+ 0, /* U+016e02: */
+ 0, /* U+016e03: */
+ 0, /* U+016e04: */
+ 0, /* U+016e05: */
+ 0, /* U+016e06: */
+ 0, /* U+016e07: */
+ 0, /* U+016e08: */
+ 0, /* U+016e09: */
+ 0, /* U+016e0a: */
+ 0, /* U+016e0b: */
+ 0, /* U+016e0c: */
+ 0, /* U+016e0d: */
+ 0, /* U+016e0e: */
+ 0, /* U+016e0f: */
+ 0, /* U+016e10: */
+ 0, /* U+016e11: */
+ 0, /* U+016e12: */
+ 0, /* U+016e13: */
+ 0, /* U+016e14: */
+ 0, /* U+016e15: */
+ 0, /* U+016e16: */
+ 0, /* U+016e17: */
+ 0, /* U+016e18: */
+ 0, /* U+016e19: */
+ 0, /* U+016e1a: */
+ 0, /* U+016e1b: */
+ 0, /* U+016e1c: */
+ 0, /* U+016e1d: */
+ 0, /* U+016e1e: */
+ 0, /* U+016e1f: */
+ 0, /* U+016e20: */
+ 0, /* U+016e21: */
+ 0, /* U+016e22: */
+ 0, /* U+016e23: */
+ 0, /* U+016e24: */
+ 0, /* U+016e25: */
+ 0, /* U+016e26: */
+ 0, /* U+016e27: */
+ 0, /* U+016e28: */
+ 0, /* U+016e29: */
+ 0, /* U+016e2a: */
+ 0, /* U+016e2b: */
+ 0, /* U+016e2c: */
+ 0, /* U+016e2d: */
+ 0, /* U+016e2e: */
+ 0, /* U+016e2f: */
+ 0, /* U+016e30: */
+ 0, /* U+016e31: */
+ 0, /* U+016e32: */
+ 0, /* U+016e33: */
+ 0, /* U+016e34: */
+ 0, /* U+016e35: */
+ 0, /* U+016e36: */
+ 0, /* U+016e37: */
+ 0, /* U+016e38: */
+ 0, /* U+016e39: */
+ 0, /* U+016e3a: */
+ 0, /* U+016e3b: */
+ 0, /* U+016e3c: */
+ 0, /* U+016e3d: */
+ 0, /* U+016e3e: */
+ 0, /* U+016e3f: */
+ 0, /* U+016e40: */
+ 0, /* U+016e41: */
+ 0, /* U+016e42: */
+ 0, /* U+016e43: */
+ 0, /* U+016e44: */
+ 0, /* U+016e45: */
+ 0, /* U+016e46: */
+ 0, /* U+016e47: */
+ 0, /* U+016e48: */
+ 0, /* U+016e49: */
+ 0, /* U+016e4a: */
+ 0, /* U+016e4b: */
+ 0, /* U+016e4c: */
+ 0, /* U+016e4d: */
+ 0, /* U+016e4e: */
+ 0, /* U+016e4f: */
+ 0, /* U+016e50: */
+ 0, /* U+016e51: */
+ 0, /* U+016e52: */
+ 0, /* U+016e53: */
+ 0, /* U+016e54: */
+ 0, /* U+016e55: */
+ 0, /* U+016e56: */
+ 0, /* U+016e57: */
+ 0, /* U+016e58: */
+ 0, /* U+016e59: */
+ 0, /* U+016e5a: */
+ 0, /* U+016e5b: */
+ 0, /* U+016e5c: */
+ 0, /* U+016e5d: */
+ 0, /* U+016e5e: */
+ 0, /* U+016e5f: */
+ 0, /* U+016e60: */
+ 0, /* U+016e61: */
+ 0, /* U+016e62: */
+ 0, /* U+016e63: */
+ 0, /* U+016e64: */
+ 0, /* U+016e65: */
+ 0, /* U+016e66: */
+ 0, /* U+016e67: */
+ 0, /* U+016e68: */
+ 0, /* U+016e69: */
+ 0, /* U+016e6a: */
+ 0, /* U+016e6b: */
+ 0, /* U+016e6c: */
+ 0, /* U+016e6d: */
+ 0, /* U+016e6e: */
+ 0, /* U+016e6f: */
+ 0, /* U+016e70: */
+ 0, /* U+016e71: */
+ 0, /* U+016e72: */
+ 0, /* U+016e73: */
+ 0, /* U+016e74: */
+ 0, /* U+016e75: */
+ 0, /* U+016e76: */
+ 0, /* U+016e77: */
+ 0, /* U+016e78: */
+ 0, /* U+016e79: */
+ 0, /* U+016e7a: */
+ 0, /* U+016e7b: */
+ 0, /* U+016e7c: */
+ 0, /* U+016e7d: */
+ 0, /* U+016e7e: */
+ 0, /* U+016e7f: */
+ 0, /* U+016e80: */
+ 0, /* U+016e81: */
+ 0, /* U+016e82: */
+ 0, /* U+016e83: */
+ 0, /* U+016e84: */
+ 0, /* U+016e85: */
+ 0, /* U+016e86: */
+ 0, /* U+016e87: */
+ 0, /* U+016e88: */
+ 0, /* U+016e89: */
+ 0, /* U+016e8a: */
+ 0, /* U+016e8b: */
+ 0, /* U+016e8c: */
+ 0, /* U+016e8d: */
+ 0, /* U+016e8e: */
+ 0, /* U+016e8f: */
+ 0, /* U+016e90: */
+ 0, /* U+016e91: */
+ 0, /* U+016e92: */
+ 0, /* U+016e93: */
+ 0, /* U+016e94: */
+ 0, /* U+016e95: */
+ 0, /* U+016e96: */
+ 0, /* U+016e97: */
+ 0, /* U+016e98: */
+ 0, /* U+016e99: */
+ 0, /* U+016e9a: */
+ 0, /* U+016e9b: */
+ 0, /* U+016e9c: */
+ 0, /* U+016e9d: */
+ 0, /* U+016e9e: */
+ 0, /* U+016e9f: */
+ 0, /* U+016ea0: */
+ 0, /* U+016ea1: */
+ 0, /* U+016ea2: */
+ 0, /* U+016ea3: */
+ 0, /* U+016ea4: */
+ 0, /* U+016ea5: */
+ 0, /* U+016ea6: */
+ 0, /* U+016ea7: */
+ 0, /* U+016ea8: */
+ 0, /* U+016ea9: */
+ 0, /* U+016eaa: */
+ 0, /* U+016eab: */
+ 0, /* U+016eac: */
+ 0, /* U+016ead: */
+ 0, /* U+016eae: */
+ 0, /* U+016eaf: */
+ 0, /* U+016eb0: */
+ 0, /* U+016eb1: */
+ 0, /* U+016eb2: */
+ 0, /* U+016eb3: */
+ 0, /* U+016eb4: */
+ 0, /* U+016eb5: */
+ 0, /* U+016eb6: */
+ 0, /* U+016eb7: */
+ 0, /* U+016eb8: */
+ 0, /* U+016eb9: */
+ 0, /* U+016eba: */
+ 0, /* U+016ebb: */
+ 0, /* U+016ebc: */
+ 0, /* U+016ebd: */
+ 0, /* U+016ebe: */
+ 0, /* U+016ebf: */
+ 0, /* U+016ec0: */
+ 0, /* U+016ec1: */
+ 0, /* U+016ec2: */
+ 0, /* U+016ec3: */
+ 0, /* U+016ec4: */
+ 0, /* U+016ec5: */
+ 0, /* U+016ec6: */
+ 0, /* U+016ec7: */
+ 0, /* U+016ec8: */
+ 0, /* U+016ec9: */
+ 0, /* U+016eca: */
+ 0, /* U+016ecb: */
+ 0, /* U+016ecc: */
+ 0, /* U+016ecd: */
+ 0, /* U+016ece: */
+ 0, /* U+016ecf: */
+ 0, /* U+016ed0: */
+ 0, /* U+016ed1: */
+ 0, /* U+016ed2: */
+ 0, /* U+016ed3: */
+ 0, /* U+016ed4: */
+ 0, /* U+016ed5: */
+ 0, /* U+016ed6: */
+ 0, /* U+016ed7: */
+ 0, /* U+016ed8: */
+ 0, /* U+016ed9: */
+ 0, /* U+016eda: */
+ 0, /* U+016edb: */
+ 0, /* U+016edc: */
+ 0, /* U+016edd: */
+ 0, /* U+016ede: */
+ 0, /* U+016edf: */
+ 0, /* U+016ee0: */
+ 0, /* U+016ee1: */
+ 0, /* U+016ee2: */
+ 0, /* U+016ee3: */
+ 0, /* U+016ee4: */
+ 0, /* U+016ee5: */
+ 0, /* U+016ee6: */
+ 0, /* U+016ee7: */
+ 0, /* U+016ee8: */
+ 0, /* U+016ee9: */
+ 0, /* U+016eea: */
+ 0, /* U+016eeb: */
+ 0, /* U+016eec: */
+ 0, /* U+016eed: */
+ 0, /* U+016eee: */
+ 0, /* U+016eef: */
+ 0, /* U+016ef0: */
+ 0, /* U+016ef1: */
+ 0, /* U+016ef2: */
+ 0, /* U+016ef3: */
+ 0, /* U+016ef4: */
+ 0, /* U+016ef5: */
+ 0, /* U+016ef6: */
+ 0, /* U+016ef7: */
+ 0, /* U+016ef8: */
+ 0, /* U+016ef9: */
+ 0, /* U+016efa: */
+ 0, /* U+016efb: */
+ 0, /* U+016efc: */
+ 0, /* U+016efd: */
+ 0, /* U+016efe: */
+ 0, /* U+016eff: */
+ RTUNI_ALPHA, /* U+016f00: MIAO LETTER PA*/
+ RTUNI_ALPHA, /* U+016f01: MIAO LETTER BA*/
+ RTUNI_ALPHA, /* U+016f02: MIAO LETTER YI PA*/
+ RTUNI_ALPHA, /* U+016f03: MIAO LETTER PLA*/
+ RTUNI_ALPHA, /* U+016f04: MIAO LETTER MA*/
+ RTUNI_ALPHA, /* U+016f05: MIAO LETTER MHA*/
+ RTUNI_ALPHA, /* U+016f06: MIAO LETTER ARCHAIC MA*/
+ RTUNI_ALPHA, /* U+016f07: MIAO LETTER FA*/
+ RTUNI_ALPHA, /* U+016f08: MIAO LETTER VA*/
+ RTUNI_ALPHA, /* U+016f09: MIAO LETTER VFA*/
+ RTUNI_ALPHA, /* U+016f0a: MIAO LETTER TA*/
+ RTUNI_ALPHA, /* U+016f0b: MIAO LETTER DA*/
+ RTUNI_ALPHA, /* U+016f0c: MIAO LETTER YI TTA*/
+ RTUNI_ALPHA, /* U+016f0d: MIAO LETTER YI TA*/
+ RTUNI_ALPHA, /* U+016f0e: MIAO LETTER TTA*/
+ RTUNI_ALPHA, /* U+016f0f: MIAO LETTER DDA*/
+ RTUNI_ALPHA, /* U+016f10: MIAO LETTER NA*/
+ RTUNI_ALPHA, /* U+016f11: MIAO LETTER NHA*/
+ RTUNI_ALPHA, /* U+016f12: MIAO LETTER YI NNA*/
+ RTUNI_ALPHA, /* U+016f13: MIAO LETTER ARCHAIC NA*/
+ RTUNI_ALPHA, /* U+016f14: MIAO LETTER NNA*/
+ RTUNI_ALPHA, /* U+016f15: MIAO LETTER NNHA*/
+ RTUNI_ALPHA, /* U+016f16: MIAO LETTER LA*/
+ RTUNI_ALPHA, /* U+016f17: MIAO LETTER LYA*/
+ RTUNI_ALPHA, /* U+016f18: MIAO LETTER LHA*/
+ RTUNI_ALPHA, /* U+016f19: MIAO LETTER LHYA*/
+ RTUNI_ALPHA, /* U+016f1a: MIAO LETTER TLHA*/
+ RTUNI_ALPHA, /* U+016f1b: MIAO LETTER DLHA*/
+ RTUNI_ALPHA, /* U+016f1c: MIAO LETTER TLHYA*/
+ RTUNI_ALPHA, /* U+016f1d: MIAO LETTER DLHYA*/
+ RTUNI_ALPHA, /* U+016f1e: MIAO LETTER KA*/
+ RTUNI_ALPHA, /* U+016f1f: MIAO LETTER GA*/
+ RTUNI_ALPHA, /* U+016f20: MIAO LETTER YI KA*/
+ RTUNI_ALPHA, /* U+016f21: MIAO LETTER QA*/
+ RTUNI_ALPHA, /* U+016f22: MIAO LETTER QGA*/
+ RTUNI_ALPHA, /* U+016f23: MIAO LETTER NGA*/
+ RTUNI_ALPHA, /* U+016f24: MIAO LETTER NGHA*/
+ RTUNI_ALPHA, /* U+016f25: MIAO LETTER ARCHAIC NGA*/
+ RTUNI_ALPHA, /* U+016f26: MIAO LETTER HA*/
+ RTUNI_ALPHA, /* U+016f27: MIAO LETTER XA*/
+ RTUNI_ALPHA, /* U+016f28: MIAO LETTER GHA*/
+ RTUNI_ALPHA, /* U+016f29: MIAO LETTER GHHA*/
+ RTUNI_ALPHA, /* U+016f2a: MIAO LETTER TSSA*/
+ RTUNI_ALPHA, /* U+016f2b: MIAO LETTER DZZA*/
+ RTUNI_ALPHA, /* U+016f2c: MIAO LETTER NYA*/
+ RTUNI_ALPHA, /* U+016f2d: MIAO LETTER NYHA*/
+ RTUNI_ALPHA, /* U+016f2e: MIAO LETTER TSHA*/
+ RTUNI_ALPHA, /* U+016f2f: MIAO LETTER DZHA*/
+ RTUNI_ALPHA, /* U+016f30: MIAO LETTER YI TSHA*/
+ RTUNI_ALPHA, /* U+016f31: MIAO LETTER YI DZHA*/
+ RTUNI_ALPHA, /* U+016f32: MIAO LETTER REFORMED TSHA*/
+ RTUNI_ALPHA, /* U+016f33: MIAO LETTER SHA*/
+ RTUNI_ALPHA, /* U+016f34: MIAO LETTER SSA*/
+ RTUNI_ALPHA, /* U+016f35: MIAO LETTER ZHA*/
+ RTUNI_ALPHA, /* U+016f36: MIAO LETTER ZSHA*/
+ RTUNI_ALPHA, /* U+016f37: MIAO LETTER TSA*/
+ RTUNI_ALPHA, /* U+016f38: MIAO LETTER DZA*/
+ RTUNI_ALPHA, /* U+016f39: MIAO LETTER YI TSA*/
+ RTUNI_ALPHA, /* U+016f3a: MIAO LETTER SA*/
+ RTUNI_ALPHA, /* U+016f3b: MIAO LETTER ZA*/
+ RTUNI_ALPHA, /* U+016f3c: MIAO LETTER ZSA*/
+ RTUNI_ALPHA, /* U+016f3d: MIAO LETTER ZZA*/
+ RTUNI_ALPHA, /* U+016f3e: MIAO LETTER ZZSA*/
+ RTUNI_ALPHA, /* U+016f3f: MIAO LETTER ARCHAIC ZZA*/
+ RTUNI_ALPHA, /* U+016f40: MIAO LETTER ZZYA*/
+ RTUNI_ALPHA, /* U+016f41: MIAO LETTER ZZSYA*/
+ RTUNI_ALPHA, /* U+016f42: MIAO LETTER WA*/
+ RTUNI_ALPHA, /* U+016f43: MIAO LETTER AH*/
+ RTUNI_ALPHA, /* U+016f44: MIAO LETTER HHA*/
+ 0, /* U+016f45: */
+ 0, /* U+016f46: */
+ 0, /* U+016f47: */
+ 0, /* U+016f48: */
+ 0, /* U+016f49: */
+ 0, /* U+016f4a: */
+ 0, /* U+016f4b: */
+ 0, /* U+016f4c: */
+ 0, /* U+016f4d: */
+ 0, /* U+016f4e: */
+ 0, /* U+016f4f: */
+ RTUNI_ALPHA, /* U+016f50: MIAO LETTER NASALIZATION*/
+ RTUNI_ALPHA, /* U+016f51: MIAO SIGN ASPIRATION*/
+ RTUNI_ALPHA, /* U+016f52: MIAO SIGN REFORMED VOICING*/
+ RTUNI_ALPHA, /* U+016f53: MIAO SIGN REFORMED ASPIRATION*/
+ RTUNI_ALPHA, /* U+016f54: MIAO VOWEL SIGN A*/
+ RTUNI_ALPHA, /* U+016f55: MIAO VOWEL SIGN AA*/
+ RTUNI_ALPHA, /* U+016f56: MIAO VOWEL SIGN AHH*/
+ RTUNI_ALPHA, /* U+016f57: MIAO VOWEL SIGN AN*/
+ RTUNI_ALPHA, /* U+016f58: MIAO VOWEL SIGN ANG*/
+ RTUNI_ALPHA, /* U+016f59: MIAO VOWEL SIGN O*/
+ RTUNI_ALPHA, /* U+016f5a: MIAO VOWEL SIGN OO*/
+ RTUNI_ALPHA, /* U+016f5b: MIAO VOWEL SIGN WO*/
+ RTUNI_ALPHA, /* U+016f5c: MIAO VOWEL SIGN W*/
+ RTUNI_ALPHA, /* U+016f5d: MIAO VOWEL SIGN E*/
+ RTUNI_ALPHA, /* U+016f5e: MIAO VOWEL SIGN EN*/
+ RTUNI_ALPHA, /* U+016f5f: MIAO VOWEL SIGN ENG*/
+ RTUNI_ALPHA, /* U+016f60: MIAO VOWEL SIGN OEY*/
+ RTUNI_ALPHA, /* U+016f61: MIAO VOWEL SIGN I*/
+ RTUNI_ALPHA, /* U+016f62: MIAO VOWEL SIGN IA*/
+ RTUNI_ALPHA, /* U+016f63: MIAO VOWEL SIGN IAN*/
+ RTUNI_ALPHA, /* U+016f64: MIAO VOWEL SIGN IANG*/
+ RTUNI_ALPHA, /* U+016f65: MIAO VOWEL SIGN IO*/
+ RTUNI_ALPHA, /* U+016f66: MIAO VOWEL SIGN IE*/
+ RTUNI_ALPHA, /* U+016f67: MIAO VOWEL SIGN II*/
+ RTUNI_ALPHA, /* U+016f68: MIAO VOWEL SIGN IU*/
+ RTUNI_ALPHA, /* U+016f69: MIAO VOWEL SIGN ING*/
+ RTUNI_ALPHA, /* U+016f6a: MIAO VOWEL SIGN U*/
+ RTUNI_ALPHA, /* U+016f6b: MIAO VOWEL SIGN UA*/
+ RTUNI_ALPHA, /* U+016f6c: MIAO VOWEL SIGN UAN*/
+ RTUNI_ALPHA, /* U+016f6d: MIAO VOWEL SIGN UANG*/
+ RTUNI_ALPHA, /* U+016f6e: MIAO VOWEL SIGN UU*/
+ RTUNI_ALPHA, /* U+016f6f: MIAO VOWEL SIGN UEI*/
+ RTUNI_ALPHA, /* U+016f70: MIAO VOWEL SIGN UNG*/
+ RTUNI_ALPHA, /* U+016f71: MIAO VOWEL SIGN Y*/
+ RTUNI_ALPHA, /* U+016f72: MIAO VOWEL SIGN YI*/
+ RTUNI_ALPHA, /* U+016f73: MIAO VOWEL SIGN AE*/
+ RTUNI_ALPHA, /* U+016f74: MIAO VOWEL SIGN AEE*/
+ RTUNI_ALPHA, /* U+016f75: MIAO VOWEL SIGN ERR*/
+ RTUNI_ALPHA, /* U+016f76: MIAO VOWEL SIGN ROUNDED ERR*/
+ RTUNI_ALPHA, /* U+016f77: MIAO VOWEL SIGN ER*/
+ RTUNI_ALPHA, /* U+016f78: MIAO VOWEL SIGN ROUNDED ER*/
+ RTUNI_ALPHA, /* U+016f79: MIAO VOWEL SIGN AI*/
+ RTUNI_ALPHA, /* U+016f7a: MIAO VOWEL SIGN EI*/
+ RTUNI_ALPHA, /* U+016f7b: MIAO VOWEL SIGN AU*/
+ RTUNI_ALPHA, /* U+016f7c: MIAO VOWEL SIGN OU*/
+ RTUNI_ALPHA, /* U+016f7d: MIAO VOWEL SIGN N*/
+ RTUNI_ALPHA, /* U+016f7e: MIAO VOWEL SIGN NG*/
+ 0, /* U+016f7f: */
+ 0, /* U+016f80: */
+ 0, /* U+016f81: */
+ 0, /* U+016f82: */
+ 0, /* U+016f83: */
+ 0, /* U+016f84: */
+ 0, /* U+016f85: */
+ 0, /* U+016f86: */
+ 0, /* U+016f87: */
+ 0, /* U+016f88: */
+ 0, /* U+016f89: */
+ 0, /* U+016f8a: */
+ 0, /* U+016f8b: */
+ 0, /* U+016f8c: */
+ 0, /* U+016f8d: */
+ 0, /* U+016f8e: */
+ 0, /* U+016f8f: MIAO TONE RIGHT*/
+ 0, /* U+016f90: MIAO TONE TOP RIGHT*/
+ 0, /* U+016f91: MIAO TONE ABOVE*/
+ 0, /* U+016f92: MIAO TONE BELOW*/
+ RTUNI_ALPHA, /* U+016f93: MIAO LETTER TONE-2*/
+ RTUNI_ALPHA, /* U+016f94: MIAO LETTER TONE-3*/
+ RTUNI_ALPHA, /* U+016f95: MIAO LETTER TONE-4*/
+ RTUNI_ALPHA, /* U+016f96: MIAO LETTER TONE-5*/
+ RTUNI_ALPHA, /* U+016f97: MIAO LETTER TONE-6*/
+ RTUNI_ALPHA, /* U+016f98: MIAO LETTER TONE-7*/
+ RTUNI_ALPHA, /* U+016f99: MIAO LETTER TONE-8*/
+ RTUNI_ALPHA, /* U+016f9a: MIAO LETTER REFORMED TONE-1*/
+ RTUNI_ALPHA, /* U+016f9b: MIAO LETTER REFORMED TONE-2*/
+ RTUNI_ALPHA, /* U+016f9c: MIAO LETTER REFORMED TONE-4*/
+ RTUNI_ALPHA, /* U+016f9d: MIAO LETTER REFORMED TONE-5*/
+ RTUNI_ALPHA, /* U+016f9e: MIAO LETTER REFORMED TONE-6*/
+ RTUNI_ALPHA, /* U+016f9f: MIAO LETTER REFORMED TONE-8*/
+};
+
+static const uint8_t g_afRTUniFlags0x01b000[] =
+{
+ RTUNI_ALPHA, /* U+01b000: KATAKANA LETTER ARCHAIC E*/
+ RTUNI_ALPHA, /* U+01b001: HIRAGANA LETTER ARCHAIC YE*/
+};
+
+static const uint8_t g_afRTUniFlags0x01d400[] =
+{
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d400: MATHEMATICAL BOLD CAPITAL A*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d401: MATHEMATICAL BOLD CAPITAL B*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d402: MATHEMATICAL BOLD CAPITAL C*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d403: MATHEMATICAL BOLD CAPITAL D*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d404: MATHEMATICAL BOLD CAPITAL E*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d405: MATHEMATICAL BOLD CAPITAL F*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d406: MATHEMATICAL BOLD CAPITAL G*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d407: MATHEMATICAL BOLD CAPITAL H*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d408: MATHEMATICAL BOLD CAPITAL I*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d409: MATHEMATICAL BOLD CAPITAL J*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d40a: MATHEMATICAL BOLD CAPITAL K*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d40b: MATHEMATICAL BOLD CAPITAL L*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d40c: MATHEMATICAL BOLD CAPITAL M*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d40d: MATHEMATICAL BOLD CAPITAL N*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d40e: MATHEMATICAL BOLD CAPITAL O*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d40f: MATHEMATICAL BOLD CAPITAL P*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d410: MATHEMATICAL BOLD CAPITAL Q*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d411: MATHEMATICAL BOLD CAPITAL R*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d412: MATHEMATICAL BOLD CAPITAL S*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d413: MATHEMATICAL BOLD CAPITAL T*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d414: MATHEMATICAL BOLD CAPITAL U*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d415: MATHEMATICAL BOLD CAPITAL V*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d416: MATHEMATICAL BOLD CAPITAL W*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d417: MATHEMATICAL BOLD CAPITAL X*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d418: MATHEMATICAL BOLD CAPITAL Y*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d419: MATHEMATICAL BOLD CAPITAL Z*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d41a: MATHEMATICAL BOLD SMALL A*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d41b: MATHEMATICAL BOLD SMALL B*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d41c: MATHEMATICAL BOLD SMALL C*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d41d: MATHEMATICAL BOLD SMALL D*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d41e: MATHEMATICAL BOLD SMALL E*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d41f: MATHEMATICAL BOLD SMALL F*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d420: MATHEMATICAL BOLD SMALL G*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d421: MATHEMATICAL BOLD SMALL H*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d422: MATHEMATICAL BOLD SMALL I*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d423: MATHEMATICAL BOLD SMALL J*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d424: MATHEMATICAL BOLD SMALL K*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d425: MATHEMATICAL BOLD SMALL L*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d426: MATHEMATICAL BOLD SMALL M*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d427: MATHEMATICAL BOLD SMALL N*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d428: MATHEMATICAL BOLD SMALL O*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d429: MATHEMATICAL BOLD SMALL P*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d42a: MATHEMATICAL BOLD SMALL Q*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d42b: MATHEMATICAL BOLD SMALL R*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d42c: MATHEMATICAL BOLD SMALL S*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d42d: MATHEMATICAL BOLD SMALL T*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d42e: MATHEMATICAL BOLD SMALL U*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d42f: MATHEMATICAL BOLD SMALL V*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d430: MATHEMATICAL BOLD SMALL W*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d431: MATHEMATICAL BOLD SMALL X*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d432: MATHEMATICAL BOLD SMALL Y*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d433: MATHEMATICAL BOLD SMALL Z*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d434: MATHEMATICAL ITALIC CAPITAL A*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d435: MATHEMATICAL ITALIC CAPITAL B*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d436: MATHEMATICAL ITALIC CAPITAL C*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d437: MATHEMATICAL ITALIC CAPITAL D*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d438: MATHEMATICAL ITALIC CAPITAL E*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d439: MATHEMATICAL ITALIC CAPITAL F*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d43a: MATHEMATICAL ITALIC CAPITAL G*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d43b: MATHEMATICAL ITALIC CAPITAL H*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d43c: MATHEMATICAL ITALIC CAPITAL I*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d43d: MATHEMATICAL ITALIC CAPITAL J*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d43e: MATHEMATICAL ITALIC CAPITAL K*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d43f: MATHEMATICAL ITALIC CAPITAL L*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d440: MATHEMATICAL ITALIC CAPITAL M*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d441: MATHEMATICAL ITALIC CAPITAL N*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d442: MATHEMATICAL ITALIC CAPITAL O*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d443: MATHEMATICAL ITALIC CAPITAL P*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d444: MATHEMATICAL ITALIC CAPITAL Q*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d445: MATHEMATICAL ITALIC CAPITAL R*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d446: MATHEMATICAL ITALIC CAPITAL S*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d447: MATHEMATICAL ITALIC CAPITAL T*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d448: MATHEMATICAL ITALIC CAPITAL U*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d449: MATHEMATICAL ITALIC CAPITAL V*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d44a: MATHEMATICAL ITALIC CAPITAL W*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d44b: MATHEMATICAL ITALIC CAPITAL X*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d44c: MATHEMATICAL ITALIC CAPITAL Y*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d44d: MATHEMATICAL ITALIC CAPITAL Z*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d44e: MATHEMATICAL ITALIC SMALL A*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d44f: MATHEMATICAL ITALIC SMALL B*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d450: MATHEMATICAL ITALIC SMALL C*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d451: MATHEMATICAL ITALIC SMALL D*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d452: MATHEMATICAL ITALIC SMALL E*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d453: MATHEMATICAL ITALIC SMALL F*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d454: MATHEMATICAL ITALIC SMALL G*/
+ 0, /* U+01d455: */
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d456: MATHEMATICAL ITALIC SMALL I*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d457: MATHEMATICAL ITALIC SMALL J*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d458: MATHEMATICAL ITALIC SMALL K*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d459: MATHEMATICAL ITALIC SMALL L*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d45a: MATHEMATICAL ITALIC SMALL M*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d45b: MATHEMATICAL ITALIC SMALL N*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d45c: MATHEMATICAL ITALIC SMALL O*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d45d: MATHEMATICAL ITALIC SMALL P*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d45e: MATHEMATICAL ITALIC SMALL Q*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d45f: MATHEMATICAL ITALIC SMALL R*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d460: MATHEMATICAL ITALIC SMALL S*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d461: MATHEMATICAL ITALIC SMALL T*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d462: MATHEMATICAL ITALIC SMALL U*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d463: MATHEMATICAL ITALIC SMALL V*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d464: MATHEMATICAL ITALIC SMALL W*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d465: MATHEMATICAL ITALIC SMALL X*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d466: MATHEMATICAL ITALIC SMALL Y*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d467: MATHEMATICAL ITALIC SMALL Z*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d468: MATHEMATICAL BOLD ITALIC CAPITAL A*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d469: MATHEMATICAL BOLD ITALIC CAPITAL B*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d46a: MATHEMATICAL BOLD ITALIC CAPITAL C*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d46b: MATHEMATICAL BOLD ITALIC CAPITAL D*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d46c: MATHEMATICAL BOLD ITALIC CAPITAL E*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d46d: MATHEMATICAL BOLD ITALIC CAPITAL F*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d46e: MATHEMATICAL BOLD ITALIC CAPITAL G*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d46f: MATHEMATICAL BOLD ITALIC CAPITAL H*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d470: MATHEMATICAL BOLD ITALIC CAPITAL I*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d471: MATHEMATICAL BOLD ITALIC CAPITAL J*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d472: MATHEMATICAL BOLD ITALIC CAPITAL K*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d473: MATHEMATICAL BOLD ITALIC CAPITAL L*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d474: MATHEMATICAL BOLD ITALIC CAPITAL M*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d475: MATHEMATICAL BOLD ITALIC CAPITAL N*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d476: MATHEMATICAL BOLD ITALIC CAPITAL O*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d477: MATHEMATICAL BOLD ITALIC CAPITAL P*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d478: MATHEMATICAL BOLD ITALIC CAPITAL Q*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d479: MATHEMATICAL BOLD ITALIC CAPITAL R*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d47a: MATHEMATICAL BOLD ITALIC CAPITAL S*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d47b: MATHEMATICAL BOLD ITALIC CAPITAL T*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d47c: MATHEMATICAL BOLD ITALIC CAPITAL U*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d47d: MATHEMATICAL BOLD ITALIC CAPITAL V*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d47e: MATHEMATICAL BOLD ITALIC CAPITAL W*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d47f: MATHEMATICAL BOLD ITALIC CAPITAL X*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d480: MATHEMATICAL BOLD ITALIC CAPITAL Y*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d481: MATHEMATICAL BOLD ITALIC CAPITAL Z*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d482: MATHEMATICAL BOLD ITALIC SMALL A*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d483: MATHEMATICAL BOLD ITALIC SMALL B*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d484: MATHEMATICAL BOLD ITALIC SMALL C*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d485: MATHEMATICAL BOLD ITALIC SMALL D*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d486: MATHEMATICAL BOLD ITALIC SMALL E*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d487: MATHEMATICAL BOLD ITALIC SMALL F*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d488: MATHEMATICAL BOLD ITALIC SMALL G*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d489: MATHEMATICAL BOLD ITALIC SMALL H*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d48a: MATHEMATICAL BOLD ITALIC SMALL I*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d48b: MATHEMATICAL BOLD ITALIC SMALL J*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d48c: MATHEMATICAL BOLD ITALIC SMALL K*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d48d: MATHEMATICAL BOLD ITALIC SMALL L*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d48e: MATHEMATICAL BOLD ITALIC SMALL M*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d48f: MATHEMATICAL BOLD ITALIC SMALL N*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d490: MATHEMATICAL BOLD ITALIC SMALL O*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d491: MATHEMATICAL BOLD ITALIC SMALL P*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d492: MATHEMATICAL BOLD ITALIC SMALL Q*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d493: MATHEMATICAL BOLD ITALIC SMALL R*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d494: MATHEMATICAL BOLD ITALIC SMALL S*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d495: MATHEMATICAL BOLD ITALIC SMALL T*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d496: MATHEMATICAL BOLD ITALIC SMALL U*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d497: MATHEMATICAL BOLD ITALIC SMALL V*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d498: MATHEMATICAL BOLD ITALIC SMALL W*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d499: MATHEMATICAL BOLD ITALIC SMALL X*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d49a: MATHEMATICAL BOLD ITALIC SMALL Y*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d49b: MATHEMATICAL BOLD ITALIC SMALL Z*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d49c: MATHEMATICAL SCRIPT CAPITAL A*/
+ 0, /* U+01d49d: */
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d49e: MATHEMATICAL SCRIPT CAPITAL C*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d49f: MATHEMATICAL SCRIPT CAPITAL D*/
+ 0, /* U+01d4a0: */
+ 0, /* U+01d4a1: */
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4a2: MATHEMATICAL SCRIPT CAPITAL G*/
+ 0, /* U+01d4a3: */
+ 0, /* U+01d4a4: */
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4a5: MATHEMATICAL SCRIPT CAPITAL J*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4a6: MATHEMATICAL SCRIPT CAPITAL K*/
+ 0, /* U+01d4a7: */
+ 0, /* U+01d4a8: */
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4a9: MATHEMATICAL SCRIPT CAPITAL N*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4aa: MATHEMATICAL SCRIPT CAPITAL O*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4ab: MATHEMATICAL SCRIPT CAPITAL P*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4ac: MATHEMATICAL SCRIPT CAPITAL Q*/
+ 0, /* U+01d4ad: */
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4ae: MATHEMATICAL SCRIPT CAPITAL S*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4af: MATHEMATICAL SCRIPT CAPITAL T*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4b0: MATHEMATICAL SCRIPT CAPITAL U*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4b1: MATHEMATICAL SCRIPT CAPITAL V*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4b2: MATHEMATICAL SCRIPT CAPITAL W*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4b3: MATHEMATICAL SCRIPT CAPITAL X*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4b4: MATHEMATICAL SCRIPT CAPITAL Y*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4b5: MATHEMATICAL SCRIPT CAPITAL Z*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4b6: MATHEMATICAL SCRIPT SMALL A*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4b7: MATHEMATICAL SCRIPT SMALL B*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4b8: MATHEMATICAL SCRIPT SMALL C*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4b9: MATHEMATICAL SCRIPT SMALL D*/
+ 0, /* U+01d4ba: */
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4bb: MATHEMATICAL SCRIPT SMALL F*/
+ 0, /* U+01d4bc: */
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4bd: MATHEMATICAL SCRIPT SMALL H*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4be: MATHEMATICAL SCRIPT SMALL I*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4bf: MATHEMATICAL SCRIPT SMALL J*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4c0: MATHEMATICAL SCRIPT SMALL K*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4c1: MATHEMATICAL SCRIPT SMALL L*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4c2: MATHEMATICAL SCRIPT SMALL M*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4c3: MATHEMATICAL SCRIPT SMALL N*/
+ 0, /* U+01d4c4: */
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4c5: MATHEMATICAL SCRIPT SMALL P*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4c6: MATHEMATICAL SCRIPT SMALL Q*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4c7: MATHEMATICAL SCRIPT SMALL R*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4c8: MATHEMATICAL SCRIPT SMALL S*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4c9: MATHEMATICAL SCRIPT SMALL T*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4ca: MATHEMATICAL SCRIPT SMALL U*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4cb: MATHEMATICAL SCRIPT SMALL V*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4cc: MATHEMATICAL SCRIPT SMALL W*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4cd: MATHEMATICAL SCRIPT SMALL X*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4ce: MATHEMATICAL SCRIPT SMALL Y*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4cf: MATHEMATICAL SCRIPT SMALL Z*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4d0: MATHEMATICAL BOLD SCRIPT CAPITAL A*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4d1: MATHEMATICAL BOLD SCRIPT CAPITAL B*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4d2: MATHEMATICAL BOLD SCRIPT CAPITAL C*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4d3: MATHEMATICAL BOLD SCRIPT CAPITAL D*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4d4: MATHEMATICAL BOLD SCRIPT CAPITAL E*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4d5: MATHEMATICAL BOLD SCRIPT CAPITAL F*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4d6: MATHEMATICAL BOLD SCRIPT CAPITAL G*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4d7: MATHEMATICAL BOLD SCRIPT CAPITAL H*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4d8: MATHEMATICAL BOLD SCRIPT CAPITAL I*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4d9: MATHEMATICAL BOLD SCRIPT CAPITAL J*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4da: MATHEMATICAL BOLD SCRIPT CAPITAL K*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4db: MATHEMATICAL BOLD SCRIPT CAPITAL L*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4dc: MATHEMATICAL BOLD SCRIPT CAPITAL M*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4dd: MATHEMATICAL BOLD SCRIPT CAPITAL N*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4de: MATHEMATICAL BOLD SCRIPT CAPITAL O*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4df: MATHEMATICAL BOLD SCRIPT CAPITAL P*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4e0: MATHEMATICAL BOLD SCRIPT CAPITAL Q*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4e1: MATHEMATICAL BOLD SCRIPT CAPITAL R*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4e2: MATHEMATICAL BOLD SCRIPT CAPITAL S*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4e3: MATHEMATICAL BOLD SCRIPT CAPITAL T*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4e4: MATHEMATICAL BOLD SCRIPT CAPITAL U*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4e5: MATHEMATICAL BOLD SCRIPT CAPITAL V*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4e6: MATHEMATICAL BOLD SCRIPT CAPITAL W*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4e7: MATHEMATICAL BOLD SCRIPT CAPITAL X*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4e8: MATHEMATICAL BOLD SCRIPT CAPITAL Y*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4e9: MATHEMATICAL BOLD SCRIPT CAPITAL Z*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4ea: MATHEMATICAL BOLD SCRIPT SMALL A*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4eb: MATHEMATICAL BOLD SCRIPT SMALL B*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4ec: MATHEMATICAL BOLD SCRIPT SMALL C*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4ed: MATHEMATICAL BOLD SCRIPT SMALL D*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4ee: MATHEMATICAL BOLD SCRIPT SMALL E*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4ef: MATHEMATICAL BOLD SCRIPT SMALL F*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4f0: MATHEMATICAL BOLD SCRIPT SMALL G*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4f1: MATHEMATICAL BOLD SCRIPT SMALL H*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4f2: MATHEMATICAL BOLD SCRIPT SMALL I*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4f3: MATHEMATICAL BOLD SCRIPT SMALL J*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4f4: MATHEMATICAL BOLD SCRIPT SMALL K*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4f5: MATHEMATICAL BOLD SCRIPT SMALL L*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4f6: MATHEMATICAL BOLD SCRIPT SMALL M*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4f7: MATHEMATICAL BOLD SCRIPT SMALL N*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4f8: MATHEMATICAL BOLD SCRIPT SMALL O*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4f9: MATHEMATICAL BOLD SCRIPT SMALL P*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4fa: MATHEMATICAL BOLD SCRIPT SMALL Q*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4fb: MATHEMATICAL BOLD SCRIPT SMALL R*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4fc: MATHEMATICAL BOLD SCRIPT SMALL S*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4fd: MATHEMATICAL BOLD SCRIPT SMALL T*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4fe: MATHEMATICAL BOLD SCRIPT SMALL U*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4ff: MATHEMATICAL BOLD SCRIPT SMALL V*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d500: MATHEMATICAL BOLD SCRIPT SMALL W*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d501: MATHEMATICAL BOLD SCRIPT SMALL X*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d502: MATHEMATICAL BOLD SCRIPT SMALL Y*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d503: MATHEMATICAL BOLD SCRIPT SMALL Z*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d504: MATHEMATICAL FRAKTUR CAPITAL A*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d505: MATHEMATICAL FRAKTUR CAPITAL B*/
+ 0, /* U+01d506: */
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d507: MATHEMATICAL FRAKTUR CAPITAL D*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d508: MATHEMATICAL FRAKTUR CAPITAL E*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d509: MATHEMATICAL FRAKTUR CAPITAL F*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d50a: MATHEMATICAL FRAKTUR CAPITAL G*/
+ 0, /* U+01d50b: */
+ 0, /* U+01d50c: */
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d50d: MATHEMATICAL FRAKTUR CAPITAL J*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d50e: MATHEMATICAL FRAKTUR CAPITAL K*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d50f: MATHEMATICAL FRAKTUR CAPITAL L*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d510: MATHEMATICAL FRAKTUR CAPITAL M*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d511: MATHEMATICAL FRAKTUR CAPITAL N*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d512: MATHEMATICAL FRAKTUR CAPITAL O*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d513: MATHEMATICAL FRAKTUR CAPITAL P*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d514: MATHEMATICAL FRAKTUR CAPITAL Q*/
+ 0, /* U+01d515: */
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d516: MATHEMATICAL FRAKTUR CAPITAL S*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d517: MATHEMATICAL FRAKTUR CAPITAL T*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d518: MATHEMATICAL FRAKTUR CAPITAL U*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d519: MATHEMATICAL FRAKTUR CAPITAL V*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d51a: MATHEMATICAL FRAKTUR CAPITAL W*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d51b: MATHEMATICAL FRAKTUR CAPITAL X*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d51c: MATHEMATICAL FRAKTUR CAPITAL Y*/
+ 0, /* U+01d51d: */
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d51e: MATHEMATICAL FRAKTUR SMALL A*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d51f: MATHEMATICAL FRAKTUR SMALL B*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d520: MATHEMATICAL FRAKTUR SMALL C*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d521: MATHEMATICAL FRAKTUR SMALL D*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d522: MATHEMATICAL FRAKTUR SMALL E*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d523: MATHEMATICAL FRAKTUR SMALL F*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d524: MATHEMATICAL FRAKTUR SMALL G*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d525: MATHEMATICAL FRAKTUR SMALL H*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d526: MATHEMATICAL FRAKTUR SMALL I*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d527: MATHEMATICAL FRAKTUR SMALL J*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d528: MATHEMATICAL FRAKTUR SMALL K*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d529: MATHEMATICAL FRAKTUR SMALL L*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d52a: MATHEMATICAL FRAKTUR SMALL M*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d52b: MATHEMATICAL FRAKTUR SMALL N*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d52c: MATHEMATICAL FRAKTUR SMALL O*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d52d: MATHEMATICAL FRAKTUR SMALL P*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d52e: MATHEMATICAL FRAKTUR SMALL Q*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d52f: MATHEMATICAL FRAKTUR SMALL R*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d530: MATHEMATICAL FRAKTUR SMALL S*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d531: MATHEMATICAL FRAKTUR SMALL T*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d532: MATHEMATICAL FRAKTUR SMALL U*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d533: MATHEMATICAL FRAKTUR SMALL V*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d534: MATHEMATICAL FRAKTUR SMALL W*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d535: MATHEMATICAL FRAKTUR SMALL X*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d536: MATHEMATICAL FRAKTUR SMALL Y*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d537: MATHEMATICAL FRAKTUR SMALL Z*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d538: MATHEMATICAL DOUBLE-STRUCK CAPITAL A*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d539: MATHEMATICAL DOUBLE-STRUCK CAPITAL B*/
+ 0, /* U+01d53a: */
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d53b: MATHEMATICAL DOUBLE-STRUCK CAPITAL D*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d53c: MATHEMATICAL DOUBLE-STRUCK CAPITAL E*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d53d: MATHEMATICAL DOUBLE-STRUCK CAPITAL F*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d53e: MATHEMATICAL DOUBLE-STRUCK CAPITAL G*/
+ 0, /* U+01d53f: */
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d540: MATHEMATICAL DOUBLE-STRUCK CAPITAL I*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d541: MATHEMATICAL DOUBLE-STRUCK CAPITAL J*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d542: MATHEMATICAL DOUBLE-STRUCK CAPITAL K*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d543: MATHEMATICAL DOUBLE-STRUCK CAPITAL L*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d544: MATHEMATICAL DOUBLE-STRUCK CAPITAL M*/
+ 0, /* U+01d545: */
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d546: MATHEMATICAL DOUBLE-STRUCK CAPITAL O*/
+ 0, /* U+01d547: */
+ 0, /* U+01d548: */
+ 0, /* U+01d549: */
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d54a: MATHEMATICAL DOUBLE-STRUCK CAPITAL S*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d54b: MATHEMATICAL DOUBLE-STRUCK CAPITAL T*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d54c: MATHEMATICAL DOUBLE-STRUCK CAPITAL U*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d54d: MATHEMATICAL DOUBLE-STRUCK CAPITAL V*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d54e: MATHEMATICAL DOUBLE-STRUCK CAPITAL W*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d54f: MATHEMATICAL DOUBLE-STRUCK CAPITAL X*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d550: MATHEMATICAL DOUBLE-STRUCK CAPITAL Y*/
+ 0, /* U+01d551: */
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d552: MATHEMATICAL DOUBLE-STRUCK SMALL A*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d553: MATHEMATICAL DOUBLE-STRUCK SMALL B*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d554: MATHEMATICAL DOUBLE-STRUCK SMALL C*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d555: MATHEMATICAL DOUBLE-STRUCK SMALL D*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d556: MATHEMATICAL DOUBLE-STRUCK SMALL E*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d557: MATHEMATICAL DOUBLE-STRUCK SMALL F*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d558: MATHEMATICAL DOUBLE-STRUCK SMALL G*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d559: MATHEMATICAL DOUBLE-STRUCK SMALL H*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d55a: MATHEMATICAL DOUBLE-STRUCK SMALL I*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d55b: MATHEMATICAL DOUBLE-STRUCK SMALL J*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d55c: MATHEMATICAL DOUBLE-STRUCK SMALL K*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d55d: MATHEMATICAL DOUBLE-STRUCK SMALL L*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d55e: MATHEMATICAL DOUBLE-STRUCK SMALL M*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d55f: MATHEMATICAL DOUBLE-STRUCK SMALL N*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d560: MATHEMATICAL DOUBLE-STRUCK SMALL O*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d561: MATHEMATICAL DOUBLE-STRUCK SMALL P*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d562: MATHEMATICAL DOUBLE-STRUCK SMALL Q*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d563: MATHEMATICAL DOUBLE-STRUCK SMALL R*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d564: MATHEMATICAL DOUBLE-STRUCK SMALL S*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d565: MATHEMATICAL DOUBLE-STRUCK SMALL T*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d566: MATHEMATICAL DOUBLE-STRUCK SMALL U*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d567: MATHEMATICAL DOUBLE-STRUCK SMALL V*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d568: MATHEMATICAL DOUBLE-STRUCK SMALL W*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d569: MATHEMATICAL DOUBLE-STRUCK SMALL X*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d56a: MATHEMATICAL DOUBLE-STRUCK SMALL Y*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d56b: MATHEMATICAL DOUBLE-STRUCK SMALL Z*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d56c: MATHEMATICAL BOLD FRAKTUR CAPITAL A*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d56d: MATHEMATICAL BOLD FRAKTUR CAPITAL B*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d56e: MATHEMATICAL BOLD FRAKTUR CAPITAL C*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d56f: MATHEMATICAL BOLD FRAKTUR CAPITAL D*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d570: MATHEMATICAL BOLD FRAKTUR CAPITAL E*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d571: MATHEMATICAL BOLD FRAKTUR CAPITAL F*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d572: MATHEMATICAL BOLD FRAKTUR CAPITAL G*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d573: MATHEMATICAL BOLD FRAKTUR CAPITAL H*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d574: MATHEMATICAL BOLD FRAKTUR CAPITAL I*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d575: MATHEMATICAL BOLD FRAKTUR CAPITAL J*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d576: MATHEMATICAL BOLD FRAKTUR CAPITAL K*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d577: MATHEMATICAL BOLD FRAKTUR CAPITAL L*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d578: MATHEMATICAL BOLD FRAKTUR CAPITAL M*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d579: MATHEMATICAL BOLD FRAKTUR CAPITAL N*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d57a: MATHEMATICAL BOLD FRAKTUR CAPITAL O*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d57b: MATHEMATICAL BOLD FRAKTUR CAPITAL P*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d57c: MATHEMATICAL BOLD FRAKTUR CAPITAL Q*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d57d: MATHEMATICAL BOLD FRAKTUR CAPITAL R*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d57e: MATHEMATICAL BOLD FRAKTUR CAPITAL S*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d57f: MATHEMATICAL BOLD FRAKTUR CAPITAL T*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d580: MATHEMATICAL BOLD FRAKTUR CAPITAL U*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d581: MATHEMATICAL BOLD FRAKTUR CAPITAL V*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d582: MATHEMATICAL BOLD FRAKTUR CAPITAL W*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d583: MATHEMATICAL BOLD FRAKTUR CAPITAL X*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d584: MATHEMATICAL BOLD FRAKTUR CAPITAL Y*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d585: MATHEMATICAL BOLD FRAKTUR CAPITAL Z*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d586: MATHEMATICAL BOLD FRAKTUR SMALL A*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d587: MATHEMATICAL BOLD FRAKTUR SMALL B*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d588: MATHEMATICAL BOLD FRAKTUR SMALL C*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d589: MATHEMATICAL BOLD FRAKTUR SMALL D*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d58a: MATHEMATICAL BOLD FRAKTUR SMALL E*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d58b: MATHEMATICAL BOLD FRAKTUR SMALL F*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d58c: MATHEMATICAL BOLD FRAKTUR SMALL G*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d58d: MATHEMATICAL BOLD FRAKTUR SMALL H*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d58e: MATHEMATICAL BOLD FRAKTUR SMALL I*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d58f: MATHEMATICAL BOLD FRAKTUR SMALL J*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d590: MATHEMATICAL BOLD FRAKTUR SMALL K*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d591: MATHEMATICAL BOLD FRAKTUR SMALL L*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d592: MATHEMATICAL BOLD FRAKTUR SMALL M*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d593: MATHEMATICAL BOLD FRAKTUR SMALL N*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d594: MATHEMATICAL BOLD FRAKTUR SMALL O*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d595: MATHEMATICAL BOLD FRAKTUR SMALL P*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d596: MATHEMATICAL BOLD FRAKTUR SMALL Q*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d597: MATHEMATICAL BOLD FRAKTUR SMALL R*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d598: MATHEMATICAL BOLD FRAKTUR SMALL S*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d599: MATHEMATICAL BOLD FRAKTUR SMALL T*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d59a: MATHEMATICAL BOLD FRAKTUR SMALL U*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d59b: MATHEMATICAL BOLD FRAKTUR SMALL V*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d59c: MATHEMATICAL BOLD FRAKTUR SMALL W*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d59d: MATHEMATICAL BOLD FRAKTUR SMALL X*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d59e: MATHEMATICAL BOLD FRAKTUR SMALL Y*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d59f: MATHEMATICAL BOLD FRAKTUR SMALL Z*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5a0: MATHEMATICAL SANS-SERIF CAPITAL A*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5a1: MATHEMATICAL SANS-SERIF CAPITAL B*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5a2: MATHEMATICAL SANS-SERIF CAPITAL C*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5a3: MATHEMATICAL SANS-SERIF CAPITAL D*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5a4: MATHEMATICAL SANS-SERIF CAPITAL E*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5a5: MATHEMATICAL SANS-SERIF CAPITAL F*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5a6: MATHEMATICAL SANS-SERIF CAPITAL G*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5a7: MATHEMATICAL SANS-SERIF CAPITAL H*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5a8: MATHEMATICAL SANS-SERIF CAPITAL I*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5a9: MATHEMATICAL SANS-SERIF CAPITAL J*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5aa: MATHEMATICAL SANS-SERIF CAPITAL K*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5ab: MATHEMATICAL SANS-SERIF CAPITAL L*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5ac: MATHEMATICAL SANS-SERIF CAPITAL M*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5ad: MATHEMATICAL SANS-SERIF CAPITAL N*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5ae: MATHEMATICAL SANS-SERIF CAPITAL O*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5af: MATHEMATICAL SANS-SERIF CAPITAL P*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5b0: MATHEMATICAL SANS-SERIF CAPITAL Q*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5b1: MATHEMATICAL SANS-SERIF CAPITAL R*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5b2: MATHEMATICAL SANS-SERIF CAPITAL S*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5b3: MATHEMATICAL SANS-SERIF CAPITAL T*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5b4: MATHEMATICAL SANS-SERIF CAPITAL U*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5b5: MATHEMATICAL SANS-SERIF CAPITAL V*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5b6: MATHEMATICAL SANS-SERIF CAPITAL W*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5b7: MATHEMATICAL SANS-SERIF CAPITAL X*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5b8: MATHEMATICAL SANS-SERIF CAPITAL Y*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5b9: MATHEMATICAL SANS-SERIF CAPITAL Z*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5ba: MATHEMATICAL SANS-SERIF SMALL A*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5bb: MATHEMATICAL SANS-SERIF SMALL B*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5bc: MATHEMATICAL SANS-SERIF SMALL C*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5bd: MATHEMATICAL SANS-SERIF SMALL D*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5be: MATHEMATICAL SANS-SERIF SMALL E*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5bf: MATHEMATICAL SANS-SERIF SMALL F*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5c0: MATHEMATICAL SANS-SERIF SMALL G*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5c1: MATHEMATICAL SANS-SERIF SMALL H*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5c2: MATHEMATICAL SANS-SERIF SMALL I*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5c3: MATHEMATICAL SANS-SERIF SMALL J*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5c4: MATHEMATICAL SANS-SERIF SMALL K*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5c5: MATHEMATICAL SANS-SERIF SMALL L*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5c6: MATHEMATICAL SANS-SERIF SMALL M*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5c7: MATHEMATICAL SANS-SERIF SMALL N*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5c8: MATHEMATICAL SANS-SERIF SMALL O*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5c9: MATHEMATICAL SANS-SERIF SMALL P*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5ca: MATHEMATICAL SANS-SERIF SMALL Q*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5cb: MATHEMATICAL SANS-SERIF SMALL R*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5cc: MATHEMATICAL SANS-SERIF SMALL S*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5cd: MATHEMATICAL SANS-SERIF SMALL T*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5ce: MATHEMATICAL SANS-SERIF SMALL U*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5cf: MATHEMATICAL SANS-SERIF SMALL V*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5d0: MATHEMATICAL SANS-SERIF SMALL W*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5d1: MATHEMATICAL SANS-SERIF SMALL X*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5d2: MATHEMATICAL SANS-SERIF SMALL Y*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5d3: MATHEMATICAL SANS-SERIF SMALL Z*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5d4: MATHEMATICAL SANS-SERIF BOLD CAPITAL A*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5d5: MATHEMATICAL SANS-SERIF BOLD CAPITAL B*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5d6: MATHEMATICAL SANS-SERIF BOLD CAPITAL C*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5d7: MATHEMATICAL SANS-SERIF BOLD CAPITAL D*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5d8: MATHEMATICAL SANS-SERIF BOLD CAPITAL E*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5d9: MATHEMATICAL SANS-SERIF BOLD CAPITAL F*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5da: MATHEMATICAL SANS-SERIF BOLD CAPITAL G*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5db: MATHEMATICAL SANS-SERIF BOLD CAPITAL H*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5dc: MATHEMATICAL SANS-SERIF BOLD CAPITAL I*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5dd: MATHEMATICAL SANS-SERIF BOLD CAPITAL J*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5de: MATHEMATICAL SANS-SERIF BOLD CAPITAL K*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5df: MATHEMATICAL SANS-SERIF BOLD CAPITAL L*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5e0: MATHEMATICAL SANS-SERIF BOLD CAPITAL M*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5e1: MATHEMATICAL SANS-SERIF BOLD CAPITAL N*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5e2: MATHEMATICAL SANS-SERIF BOLD CAPITAL O*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5e3: MATHEMATICAL SANS-SERIF BOLD CAPITAL P*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5e4: MATHEMATICAL SANS-SERIF BOLD CAPITAL Q*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5e5: MATHEMATICAL SANS-SERIF BOLD CAPITAL R*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5e6: MATHEMATICAL SANS-SERIF BOLD CAPITAL S*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5e7: MATHEMATICAL SANS-SERIF BOLD CAPITAL T*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5e8: MATHEMATICAL SANS-SERIF BOLD CAPITAL U*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5e9: MATHEMATICAL SANS-SERIF BOLD CAPITAL V*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5ea: MATHEMATICAL SANS-SERIF BOLD CAPITAL W*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5eb: MATHEMATICAL SANS-SERIF BOLD CAPITAL X*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5ec: MATHEMATICAL SANS-SERIF BOLD CAPITAL Y*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5ed: MATHEMATICAL SANS-SERIF BOLD CAPITAL Z*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5ee: MATHEMATICAL SANS-SERIF BOLD SMALL A*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5ef: MATHEMATICAL SANS-SERIF BOLD SMALL B*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5f0: MATHEMATICAL SANS-SERIF BOLD SMALL C*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5f1: MATHEMATICAL SANS-SERIF BOLD SMALL D*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5f2: MATHEMATICAL SANS-SERIF BOLD SMALL E*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5f3: MATHEMATICAL SANS-SERIF BOLD SMALL F*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5f4: MATHEMATICAL SANS-SERIF BOLD SMALL G*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5f5: MATHEMATICAL SANS-SERIF BOLD SMALL H*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5f6: MATHEMATICAL SANS-SERIF BOLD SMALL I*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5f7: MATHEMATICAL SANS-SERIF BOLD SMALL J*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5f8: MATHEMATICAL SANS-SERIF BOLD SMALL K*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5f9: MATHEMATICAL SANS-SERIF BOLD SMALL L*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5fa: MATHEMATICAL SANS-SERIF BOLD SMALL M*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5fb: MATHEMATICAL SANS-SERIF BOLD SMALL N*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5fc: MATHEMATICAL SANS-SERIF BOLD SMALL O*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5fd: MATHEMATICAL SANS-SERIF BOLD SMALL P*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5fe: MATHEMATICAL SANS-SERIF BOLD SMALL Q*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5ff: MATHEMATICAL SANS-SERIF BOLD SMALL R*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d600: MATHEMATICAL SANS-SERIF BOLD SMALL S*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d601: MATHEMATICAL SANS-SERIF BOLD SMALL T*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d602: MATHEMATICAL SANS-SERIF BOLD SMALL U*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d603: MATHEMATICAL SANS-SERIF BOLD SMALL V*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d604: MATHEMATICAL SANS-SERIF BOLD SMALL W*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d605: MATHEMATICAL SANS-SERIF BOLD SMALL X*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d606: MATHEMATICAL SANS-SERIF BOLD SMALL Y*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d607: MATHEMATICAL SANS-SERIF BOLD SMALL Z*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d608: MATHEMATICAL SANS-SERIF ITALIC CAPITAL A*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d609: MATHEMATICAL SANS-SERIF ITALIC CAPITAL B*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d60a: MATHEMATICAL SANS-SERIF ITALIC CAPITAL C*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d60b: MATHEMATICAL SANS-SERIF ITALIC CAPITAL D*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d60c: MATHEMATICAL SANS-SERIF ITALIC CAPITAL E*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d60d: MATHEMATICAL SANS-SERIF ITALIC CAPITAL F*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d60e: MATHEMATICAL SANS-SERIF ITALIC CAPITAL G*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d60f: MATHEMATICAL SANS-SERIF ITALIC CAPITAL H*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d610: MATHEMATICAL SANS-SERIF ITALIC CAPITAL I*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d611: MATHEMATICAL SANS-SERIF ITALIC CAPITAL J*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d612: MATHEMATICAL SANS-SERIF ITALIC CAPITAL K*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d613: MATHEMATICAL SANS-SERIF ITALIC CAPITAL L*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d614: MATHEMATICAL SANS-SERIF ITALIC CAPITAL M*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d615: MATHEMATICAL SANS-SERIF ITALIC CAPITAL N*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d616: MATHEMATICAL SANS-SERIF ITALIC CAPITAL O*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d617: MATHEMATICAL SANS-SERIF ITALIC CAPITAL P*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d618: MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d619: MATHEMATICAL SANS-SERIF ITALIC CAPITAL R*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d61a: MATHEMATICAL SANS-SERIF ITALIC CAPITAL S*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d61b: MATHEMATICAL SANS-SERIF ITALIC CAPITAL T*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d61c: MATHEMATICAL SANS-SERIF ITALIC CAPITAL U*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d61d: MATHEMATICAL SANS-SERIF ITALIC CAPITAL V*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d61e: MATHEMATICAL SANS-SERIF ITALIC CAPITAL W*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d61f: MATHEMATICAL SANS-SERIF ITALIC CAPITAL X*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d620: MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d621: MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d622: MATHEMATICAL SANS-SERIF ITALIC SMALL A*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d623: MATHEMATICAL SANS-SERIF ITALIC SMALL B*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d624: MATHEMATICAL SANS-SERIF ITALIC SMALL C*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d625: MATHEMATICAL SANS-SERIF ITALIC SMALL D*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d626: MATHEMATICAL SANS-SERIF ITALIC SMALL E*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d627: MATHEMATICAL SANS-SERIF ITALIC SMALL F*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d628: MATHEMATICAL SANS-SERIF ITALIC SMALL G*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d629: MATHEMATICAL SANS-SERIF ITALIC SMALL H*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d62a: MATHEMATICAL SANS-SERIF ITALIC SMALL I*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d62b: MATHEMATICAL SANS-SERIF ITALIC SMALL J*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d62c: MATHEMATICAL SANS-SERIF ITALIC SMALL K*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d62d: MATHEMATICAL SANS-SERIF ITALIC SMALL L*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d62e: MATHEMATICAL SANS-SERIF ITALIC SMALL M*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d62f: MATHEMATICAL SANS-SERIF ITALIC SMALL N*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d630: MATHEMATICAL SANS-SERIF ITALIC SMALL O*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d631: MATHEMATICAL SANS-SERIF ITALIC SMALL P*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d632: MATHEMATICAL SANS-SERIF ITALIC SMALL Q*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d633: MATHEMATICAL SANS-SERIF ITALIC SMALL R*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d634: MATHEMATICAL SANS-SERIF ITALIC SMALL S*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d635: MATHEMATICAL SANS-SERIF ITALIC SMALL T*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d636: MATHEMATICAL SANS-SERIF ITALIC SMALL U*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d637: MATHEMATICAL SANS-SERIF ITALIC SMALL V*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d638: MATHEMATICAL SANS-SERIF ITALIC SMALL W*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d639: MATHEMATICAL SANS-SERIF ITALIC SMALL X*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d63a: MATHEMATICAL SANS-SERIF ITALIC SMALL Y*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d63b: MATHEMATICAL SANS-SERIF ITALIC SMALL Z*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d63c: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d63d: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d63e: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d63f: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d640: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d641: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d642: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d643: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d644: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d645: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d646: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d647: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d648: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d649: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d64a: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d64b: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d64c: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d64d: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d64e: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d64f: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d650: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d651: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d652: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d653: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d654: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d655: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d656: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d657: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d658: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d659: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d65a: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d65b: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d65c: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d65d: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d65e: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d65f: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d660: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d661: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d662: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d663: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d664: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d665: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d666: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d667: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d668: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d669: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d66a: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d66b: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d66c: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d66d: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d66e: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d66f: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d670: MATHEMATICAL MONOSPACE CAPITAL A*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d671: MATHEMATICAL MONOSPACE CAPITAL B*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d672: MATHEMATICAL MONOSPACE CAPITAL C*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d673: MATHEMATICAL MONOSPACE CAPITAL D*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d674: MATHEMATICAL MONOSPACE CAPITAL E*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d675: MATHEMATICAL MONOSPACE CAPITAL F*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d676: MATHEMATICAL MONOSPACE CAPITAL G*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d677: MATHEMATICAL MONOSPACE CAPITAL H*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d678: MATHEMATICAL MONOSPACE CAPITAL I*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d679: MATHEMATICAL MONOSPACE CAPITAL J*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d67a: MATHEMATICAL MONOSPACE CAPITAL K*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d67b: MATHEMATICAL MONOSPACE CAPITAL L*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d67c: MATHEMATICAL MONOSPACE CAPITAL M*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d67d: MATHEMATICAL MONOSPACE CAPITAL N*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d67e: MATHEMATICAL MONOSPACE CAPITAL O*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d67f: MATHEMATICAL MONOSPACE CAPITAL P*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d680: MATHEMATICAL MONOSPACE CAPITAL Q*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d681: MATHEMATICAL MONOSPACE CAPITAL R*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d682: MATHEMATICAL MONOSPACE CAPITAL S*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d683: MATHEMATICAL MONOSPACE CAPITAL T*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d684: MATHEMATICAL MONOSPACE CAPITAL U*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d685: MATHEMATICAL MONOSPACE CAPITAL V*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d686: MATHEMATICAL MONOSPACE CAPITAL W*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d687: MATHEMATICAL MONOSPACE CAPITAL X*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d688: MATHEMATICAL MONOSPACE CAPITAL Y*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d689: MATHEMATICAL MONOSPACE CAPITAL Z*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d68a: MATHEMATICAL MONOSPACE SMALL A*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d68b: MATHEMATICAL MONOSPACE SMALL B*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d68c: MATHEMATICAL MONOSPACE SMALL C*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d68d: MATHEMATICAL MONOSPACE SMALL D*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d68e: MATHEMATICAL MONOSPACE SMALL E*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d68f: MATHEMATICAL MONOSPACE SMALL F*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d690: MATHEMATICAL MONOSPACE SMALL G*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d691: MATHEMATICAL MONOSPACE SMALL H*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d692: MATHEMATICAL MONOSPACE SMALL I*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d693: MATHEMATICAL MONOSPACE SMALL J*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d694: MATHEMATICAL MONOSPACE SMALL K*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d695: MATHEMATICAL MONOSPACE SMALL L*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d696: MATHEMATICAL MONOSPACE SMALL M*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d697: MATHEMATICAL MONOSPACE SMALL N*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d698: MATHEMATICAL MONOSPACE SMALL O*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d699: MATHEMATICAL MONOSPACE SMALL P*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d69a: MATHEMATICAL MONOSPACE SMALL Q*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d69b: MATHEMATICAL MONOSPACE SMALL R*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d69c: MATHEMATICAL MONOSPACE SMALL S*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d69d: MATHEMATICAL MONOSPACE SMALL T*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d69e: MATHEMATICAL MONOSPACE SMALL U*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d69f: MATHEMATICAL MONOSPACE SMALL V*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6a0: MATHEMATICAL MONOSPACE SMALL W*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6a1: MATHEMATICAL MONOSPACE SMALL X*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6a2: MATHEMATICAL MONOSPACE SMALL Y*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6a3: MATHEMATICAL MONOSPACE SMALL Z*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6a4: MATHEMATICAL ITALIC SMALL DOTLESS I*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6a5: MATHEMATICAL ITALIC SMALL DOTLESS J*/
+ 0, /* U+01d6a6: */
+ 0, /* U+01d6a7: */
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6a8: MATHEMATICAL BOLD CAPITAL ALPHA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6a9: MATHEMATICAL BOLD CAPITAL BETA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6aa: MATHEMATICAL BOLD CAPITAL GAMMA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6ab: MATHEMATICAL BOLD CAPITAL DELTA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6ac: MATHEMATICAL BOLD CAPITAL EPSILON*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6ad: MATHEMATICAL BOLD CAPITAL ZETA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6ae: MATHEMATICAL BOLD CAPITAL ETA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6af: MATHEMATICAL BOLD CAPITAL THETA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6b0: MATHEMATICAL BOLD CAPITAL IOTA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6b1: MATHEMATICAL BOLD CAPITAL KAPPA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6b2: MATHEMATICAL BOLD CAPITAL LAMDA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6b3: MATHEMATICAL BOLD CAPITAL MU*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6b4: MATHEMATICAL BOLD CAPITAL NU*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6b5: MATHEMATICAL BOLD CAPITAL XI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6b6: MATHEMATICAL BOLD CAPITAL OMICRON*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6b7: MATHEMATICAL BOLD CAPITAL PI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6b8: MATHEMATICAL BOLD CAPITAL RHO*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6b9: MATHEMATICAL BOLD CAPITAL THETA SYMBOL*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6ba: MATHEMATICAL BOLD CAPITAL SIGMA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6bb: MATHEMATICAL BOLD CAPITAL TAU*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6bc: MATHEMATICAL BOLD CAPITAL UPSILON*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6bd: MATHEMATICAL BOLD CAPITAL PHI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6be: MATHEMATICAL BOLD CAPITAL CHI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6bf: MATHEMATICAL BOLD CAPITAL PSI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6c0: MATHEMATICAL BOLD CAPITAL OMEGA*/
+ 0, /* U+01d6c1: MATHEMATICAL BOLD NABLA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6c2: MATHEMATICAL BOLD SMALL ALPHA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6c3: MATHEMATICAL BOLD SMALL BETA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6c4: MATHEMATICAL BOLD SMALL GAMMA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6c5: MATHEMATICAL BOLD SMALL DELTA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6c6: MATHEMATICAL BOLD SMALL EPSILON*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6c7: MATHEMATICAL BOLD SMALL ZETA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6c8: MATHEMATICAL BOLD SMALL ETA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6c9: MATHEMATICAL BOLD SMALL THETA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6ca: MATHEMATICAL BOLD SMALL IOTA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6cb: MATHEMATICAL BOLD SMALL KAPPA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6cc: MATHEMATICAL BOLD SMALL LAMDA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6cd: MATHEMATICAL BOLD SMALL MU*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6ce: MATHEMATICAL BOLD SMALL NU*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6cf: MATHEMATICAL BOLD SMALL XI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6d0: MATHEMATICAL BOLD SMALL OMICRON*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6d1: MATHEMATICAL BOLD SMALL PI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6d2: MATHEMATICAL BOLD SMALL RHO*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6d3: MATHEMATICAL BOLD SMALL FINAL SIGMA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6d4: MATHEMATICAL BOLD SMALL SIGMA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6d5: MATHEMATICAL BOLD SMALL TAU*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6d6: MATHEMATICAL BOLD SMALL UPSILON*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6d7: MATHEMATICAL BOLD SMALL PHI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6d8: MATHEMATICAL BOLD SMALL CHI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6d9: MATHEMATICAL BOLD SMALL PSI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6da: MATHEMATICAL BOLD SMALL OMEGA*/
+ 0, /* U+01d6db: MATHEMATICAL BOLD PARTIAL DIFFERENTIAL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6dc: MATHEMATICAL BOLD EPSILON SYMBOL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6dd: MATHEMATICAL BOLD THETA SYMBOL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6de: MATHEMATICAL BOLD KAPPA SYMBOL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6df: MATHEMATICAL BOLD PHI SYMBOL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6e0: MATHEMATICAL BOLD RHO SYMBOL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6e1: MATHEMATICAL BOLD PI SYMBOL*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6e2: MATHEMATICAL ITALIC CAPITAL ALPHA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6e3: MATHEMATICAL ITALIC CAPITAL BETA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6e4: MATHEMATICAL ITALIC CAPITAL GAMMA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6e5: MATHEMATICAL ITALIC CAPITAL DELTA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6e6: MATHEMATICAL ITALIC CAPITAL EPSILON*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6e7: MATHEMATICAL ITALIC CAPITAL ZETA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6e8: MATHEMATICAL ITALIC CAPITAL ETA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6e9: MATHEMATICAL ITALIC CAPITAL THETA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6ea: MATHEMATICAL ITALIC CAPITAL IOTA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6eb: MATHEMATICAL ITALIC CAPITAL KAPPA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6ec: MATHEMATICAL ITALIC CAPITAL LAMDA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6ed: MATHEMATICAL ITALIC CAPITAL MU*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6ee: MATHEMATICAL ITALIC CAPITAL NU*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6ef: MATHEMATICAL ITALIC CAPITAL XI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6f0: MATHEMATICAL ITALIC CAPITAL OMICRON*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6f1: MATHEMATICAL ITALIC CAPITAL PI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6f2: MATHEMATICAL ITALIC CAPITAL RHO*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6f3: MATHEMATICAL ITALIC CAPITAL THETA SYMBOL*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6f4: MATHEMATICAL ITALIC CAPITAL SIGMA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6f5: MATHEMATICAL ITALIC CAPITAL TAU*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6f6: MATHEMATICAL ITALIC CAPITAL UPSILON*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6f7: MATHEMATICAL ITALIC CAPITAL PHI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6f8: MATHEMATICAL ITALIC CAPITAL CHI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6f9: MATHEMATICAL ITALIC CAPITAL PSI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6fa: MATHEMATICAL ITALIC CAPITAL OMEGA*/
+ 0, /* U+01d6fb: MATHEMATICAL ITALIC NABLA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6fc: MATHEMATICAL ITALIC SMALL ALPHA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6fd: MATHEMATICAL ITALIC SMALL BETA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6fe: MATHEMATICAL ITALIC SMALL GAMMA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6ff: MATHEMATICAL ITALIC SMALL DELTA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d700: MATHEMATICAL ITALIC SMALL EPSILON*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d701: MATHEMATICAL ITALIC SMALL ZETA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d702: MATHEMATICAL ITALIC SMALL ETA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d703: MATHEMATICAL ITALIC SMALL THETA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d704: MATHEMATICAL ITALIC SMALL IOTA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d705: MATHEMATICAL ITALIC SMALL KAPPA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d706: MATHEMATICAL ITALIC SMALL LAMDA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d707: MATHEMATICAL ITALIC SMALL MU*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d708: MATHEMATICAL ITALIC SMALL NU*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d709: MATHEMATICAL ITALIC SMALL XI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d70a: MATHEMATICAL ITALIC SMALL OMICRON*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d70b: MATHEMATICAL ITALIC SMALL PI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d70c: MATHEMATICAL ITALIC SMALL RHO*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d70d: MATHEMATICAL ITALIC SMALL FINAL SIGMA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d70e: MATHEMATICAL ITALIC SMALL SIGMA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d70f: MATHEMATICAL ITALIC SMALL TAU*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d710: MATHEMATICAL ITALIC SMALL UPSILON*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d711: MATHEMATICAL ITALIC SMALL PHI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d712: MATHEMATICAL ITALIC SMALL CHI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d713: MATHEMATICAL ITALIC SMALL PSI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d714: MATHEMATICAL ITALIC SMALL OMEGA*/
+ 0, /* U+01d715: MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d716: MATHEMATICAL ITALIC EPSILON SYMBOL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d717: MATHEMATICAL ITALIC THETA SYMBOL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d718: MATHEMATICAL ITALIC KAPPA SYMBOL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d719: MATHEMATICAL ITALIC PHI SYMBOL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d71a: MATHEMATICAL ITALIC RHO SYMBOL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d71b: MATHEMATICAL ITALIC PI SYMBOL*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d71c: MATHEMATICAL BOLD ITALIC CAPITAL ALPHA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d71d: MATHEMATICAL BOLD ITALIC CAPITAL BETA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d71e: MATHEMATICAL BOLD ITALIC CAPITAL GAMMA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d71f: MATHEMATICAL BOLD ITALIC CAPITAL DELTA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d720: MATHEMATICAL BOLD ITALIC CAPITAL EPSILON*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d721: MATHEMATICAL BOLD ITALIC CAPITAL ZETA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d722: MATHEMATICAL BOLD ITALIC CAPITAL ETA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d723: MATHEMATICAL BOLD ITALIC CAPITAL THETA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d724: MATHEMATICAL BOLD ITALIC CAPITAL IOTA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d725: MATHEMATICAL BOLD ITALIC CAPITAL KAPPA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d726: MATHEMATICAL BOLD ITALIC CAPITAL LAMDA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d727: MATHEMATICAL BOLD ITALIC CAPITAL MU*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d728: MATHEMATICAL BOLD ITALIC CAPITAL NU*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d729: MATHEMATICAL BOLD ITALIC CAPITAL XI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d72a: MATHEMATICAL BOLD ITALIC CAPITAL OMICRON*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d72b: MATHEMATICAL BOLD ITALIC CAPITAL PI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d72c: MATHEMATICAL BOLD ITALIC CAPITAL RHO*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d72d: MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d72e: MATHEMATICAL BOLD ITALIC CAPITAL SIGMA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d72f: MATHEMATICAL BOLD ITALIC CAPITAL TAU*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d730: MATHEMATICAL BOLD ITALIC CAPITAL UPSILON*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d731: MATHEMATICAL BOLD ITALIC CAPITAL PHI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d732: MATHEMATICAL BOLD ITALIC CAPITAL CHI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d733: MATHEMATICAL BOLD ITALIC CAPITAL PSI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d734: MATHEMATICAL BOLD ITALIC CAPITAL OMEGA*/
+ 0, /* U+01d735: MATHEMATICAL BOLD ITALIC NABLA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d736: MATHEMATICAL BOLD ITALIC SMALL ALPHA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d737: MATHEMATICAL BOLD ITALIC SMALL BETA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d738: MATHEMATICAL BOLD ITALIC SMALL GAMMA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d739: MATHEMATICAL BOLD ITALIC SMALL DELTA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d73a: MATHEMATICAL BOLD ITALIC SMALL EPSILON*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d73b: MATHEMATICAL BOLD ITALIC SMALL ZETA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d73c: MATHEMATICAL BOLD ITALIC SMALL ETA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d73d: MATHEMATICAL BOLD ITALIC SMALL THETA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d73e: MATHEMATICAL BOLD ITALIC SMALL IOTA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d73f: MATHEMATICAL BOLD ITALIC SMALL KAPPA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d740: MATHEMATICAL BOLD ITALIC SMALL LAMDA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d741: MATHEMATICAL BOLD ITALIC SMALL MU*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d742: MATHEMATICAL BOLD ITALIC SMALL NU*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d743: MATHEMATICAL BOLD ITALIC SMALL XI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d744: MATHEMATICAL BOLD ITALIC SMALL OMICRON*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d745: MATHEMATICAL BOLD ITALIC SMALL PI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d746: MATHEMATICAL BOLD ITALIC SMALL RHO*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d747: MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d748: MATHEMATICAL BOLD ITALIC SMALL SIGMA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d749: MATHEMATICAL BOLD ITALIC SMALL TAU*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d74a: MATHEMATICAL BOLD ITALIC SMALL UPSILON*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d74b: MATHEMATICAL BOLD ITALIC SMALL PHI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d74c: MATHEMATICAL BOLD ITALIC SMALL CHI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d74d: MATHEMATICAL BOLD ITALIC SMALL PSI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d74e: MATHEMATICAL BOLD ITALIC SMALL OMEGA*/
+ 0, /* U+01d74f: MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d750: MATHEMATICAL BOLD ITALIC EPSILON SYMBOL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d751: MATHEMATICAL BOLD ITALIC THETA SYMBOL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d752: MATHEMATICAL BOLD ITALIC KAPPA SYMBOL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d753: MATHEMATICAL BOLD ITALIC PHI SYMBOL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d754: MATHEMATICAL BOLD ITALIC RHO SYMBOL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d755: MATHEMATICAL BOLD ITALIC PI SYMBOL*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d756: MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d757: MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d758: MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d759: MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d75a: MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d75b: MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d75c: MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d75d: MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d75e: MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d75f: MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d760: MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d761: MATHEMATICAL SANS-SERIF BOLD CAPITAL MU*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d762: MATHEMATICAL SANS-SERIF BOLD CAPITAL NU*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d763: MATHEMATICAL SANS-SERIF BOLD CAPITAL XI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d764: MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d765: MATHEMATICAL SANS-SERIF BOLD CAPITAL PI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d766: MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d767: MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d768: MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d769: MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d76a: MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d76b: MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d76c: MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d76d: MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d76e: MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA*/
+ 0, /* U+01d76f: MATHEMATICAL SANS-SERIF BOLD NABLA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d770: MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d771: MATHEMATICAL SANS-SERIF BOLD SMALL BETA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d772: MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d773: MATHEMATICAL SANS-SERIF BOLD SMALL DELTA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d774: MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d775: MATHEMATICAL SANS-SERIF BOLD SMALL ZETA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d776: MATHEMATICAL SANS-SERIF BOLD SMALL ETA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d777: MATHEMATICAL SANS-SERIF BOLD SMALL THETA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d778: MATHEMATICAL SANS-SERIF BOLD SMALL IOTA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d779: MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d77a: MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d77b: MATHEMATICAL SANS-SERIF BOLD SMALL MU*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d77c: MATHEMATICAL SANS-SERIF BOLD SMALL NU*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d77d: MATHEMATICAL SANS-SERIF BOLD SMALL XI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d77e: MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d77f: MATHEMATICAL SANS-SERIF BOLD SMALL PI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d780: MATHEMATICAL SANS-SERIF BOLD SMALL RHO*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d781: MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d782: MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d783: MATHEMATICAL SANS-SERIF BOLD SMALL TAU*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d784: MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d785: MATHEMATICAL SANS-SERIF BOLD SMALL PHI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d786: MATHEMATICAL SANS-SERIF BOLD SMALL CHI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d787: MATHEMATICAL SANS-SERIF BOLD SMALL PSI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d788: MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA*/
+ 0, /* U+01d789: MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d78a: MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d78b: MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d78c: MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d78d: MATHEMATICAL SANS-SERIF BOLD PHI SYMBOL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d78e: MATHEMATICAL SANS-SERIF BOLD RHO SYMBOL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d78f: MATHEMATICAL SANS-SERIF BOLD PI SYMBOL*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d790: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d791: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d792: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d793: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d794: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d795: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d796: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d797: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d798: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d799: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d79a: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d79b: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d79c: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d79d: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d79e: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d79f: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d7a0: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d7a1: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d7a2: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d7a3: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d7a4: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d7a5: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d7a6: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d7a7: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d7a8: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA*/
+ 0, /* U+01d7a9: MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7aa: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7ab: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7ac: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7ad: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7ae: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7af: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7b0: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7b1: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7b2: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7b3: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7b4: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7b5: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7b6: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7b7: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7b8: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7b9: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7ba: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7bb: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7bc: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7bd: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7be: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7bf: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7c0: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7c1: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7c2: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA*/
+ 0, /* U+01d7c3: MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7c4: MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7c5: MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7c6: MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7c7: MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7c8: MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7c9: MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL*/
+ RTUNI_ALPHA | RTUNI_UPPER, /* U+01d7ca: MATHEMATICAL BOLD CAPITAL DIGAMMA*/
+ RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7cb: MATHEMATICAL BOLD SMALL DIGAMMA*/
+ 0, /* U+01d7cc: */
+ 0, /* U+01d7cd: */
+ RTUNI_DDIGIT, /* U+01d7ce: MATHEMATICAL BOLD DIGIT ZERO*/
+ RTUNI_DDIGIT, /* U+01d7cf: MATHEMATICAL BOLD DIGIT ONE*/
+ RTUNI_DDIGIT, /* U+01d7d0: MATHEMATICAL BOLD DIGIT TWO*/
+ RTUNI_DDIGIT, /* U+01d7d1: MATHEMATICAL BOLD DIGIT THREE*/
+ RTUNI_DDIGIT, /* U+01d7d2: MATHEMATICAL BOLD DIGIT FOUR*/
+ RTUNI_DDIGIT, /* U+01d7d3: MATHEMATICAL BOLD DIGIT FIVE*/
+ RTUNI_DDIGIT, /* U+01d7d4: MATHEMATICAL BOLD DIGIT SIX*/
+ RTUNI_DDIGIT, /* U+01d7d5: MATHEMATICAL BOLD DIGIT SEVEN*/
+ RTUNI_DDIGIT, /* U+01d7d6: MATHEMATICAL BOLD DIGIT EIGHT*/
+ RTUNI_DDIGIT, /* U+01d7d7: MATHEMATICAL BOLD DIGIT NINE*/
+ RTUNI_DDIGIT, /* U+01d7d8: MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO*/
+ RTUNI_DDIGIT, /* U+01d7d9: MATHEMATICAL DOUBLE-STRUCK DIGIT ONE*/
+ RTUNI_DDIGIT, /* U+01d7da: MATHEMATICAL DOUBLE-STRUCK DIGIT TWO*/
+ RTUNI_DDIGIT, /* U+01d7db: MATHEMATICAL DOUBLE-STRUCK DIGIT THREE*/
+ RTUNI_DDIGIT, /* U+01d7dc: MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR*/
+ RTUNI_DDIGIT, /* U+01d7dd: MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE*/
+ RTUNI_DDIGIT, /* U+01d7de: MATHEMATICAL DOUBLE-STRUCK DIGIT SIX*/
+ RTUNI_DDIGIT, /* U+01d7df: MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN*/
+ RTUNI_DDIGIT, /* U+01d7e0: MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT*/
+ RTUNI_DDIGIT, /* U+01d7e1: MATHEMATICAL DOUBLE-STRUCK DIGIT NINE*/
+ RTUNI_DDIGIT, /* U+01d7e2: MATHEMATICAL SANS-SERIF DIGIT ZERO*/
+ RTUNI_DDIGIT, /* U+01d7e3: MATHEMATICAL SANS-SERIF DIGIT ONE*/
+ RTUNI_DDIGIT, /* U+01d7e4: MATHEMATICAL SANS-SERIF DIGIT TWO*/
+ RTUNI_DDIGIT, /* U+01d7e5: MATHEMATICAL SANS-SERIF DIGIT THREE*/
+ RTUNI_DDIGIT, /* U+01d7e6: MATHEMATICAL SANS-SERIF DIGIT FOUR*/
+ RTUNI_DDIGIT, /* U+01d7e7: MATHEMATICAL SANS-SERIF DIGIT FIVE*/
+ RTUNI_DDIGIT, /* U+01d7e8: MATHEMATICAL SANS-SERIF DIGIT SIX*/
+ RTUNI_DDIGIT, /* U+01d7e9: MATHEMATICAL SANS-SERIF DIGIT SEVEN*/
+ RTUNI_DDIGIT, /* U+01d7ea: MATHEMATICAL SANS-SERIF DIGIT EIGHT*/
+ RTUNI_DDIGIT, /* U+01d7eb: MATHEMATICAL SANS-SERIF DIGIT NINE*/
+ RTUNI_DDIGIT, /* U+01d7ec: MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO*/
+ RTUNI_DDIGIT, /* U+01d7ed: MATHEMATICAL SANS-SERIF BOLD DIGIT ONE*/
+ RTUNI_DDIGIT, /* U+01d7ee: MATHEMATICAL SANS-SERIF BOLD DIGIT TWO*/
+ RTUNI_DDIGIT, /* U+01d7ef: MATHEMATICAL SANS-SERIF BOLD DIGIT THREE*/
+ RTUNI_DDIGIT, /* U+01d7f0: MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR*/
+ RTUNI_DDIGIT, /* U+01d7f1: MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE*/
+ RTUNI_DDIGIT, /* U+01d7f2: MATHEMATICAL SANS-SERIF BOLD DIGIT SIX*/
+ RTUNI_DDIGIT, /* U+01d7f3: MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN*/
+ RTUNI_DDIGIT, /* U+01d7f4: MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT*/
+ RTUNI_DDIGIT, /* U+01d7f5: MATHEMATICAL SANS-SERIF BOLD DIGIT NINE*/
+ RTUNI_DDIGIT, /* U+01d7f6: MATHEMATICAL MONOSPACE DIGIT ZERO*/
+ RTUNI_DDIGIT, /* U+01d7f7: MATHEMATICAL MONOSPACE DIGIT ONE*/
+ RTUNI_DDIGIT, /* U+01d7f8: MATHEMATICAL MONOSPACE DIGIT TWO*/
+ RTUNI_DDIGIT, /* U+01d7f9: MATHEMATICAL MONOSPACE DIGIT THREE*/
+ RTUNI_DDIGIT, /* U+01d7fa: MATHEMATICAL MONOSPACE DIGIT FOUR*/
+ RTUNI_DDIGIT, /* U+01d7fb: MATHEMATICAL MONOSPACE DIGIT FIVE*/
+ RTUNI_DDIGIT, /* U+01d7fc: MATHEMATICAL MONOSPACE DIGIT SIX*/
+ RTUNI_DDIGIT, /* U+01d7fd: MATHEMATICAL MONOSPACE DIGIT SEVEN*/
+ RTUNI_DDIGIT, /* U+01d7fe: MATHEMATICAL MONOSPACE DIGIT EIGHT*/
+ RTUNI_DDIGIT, /* U+01d7ff: MATHEMATICAL MONOSPACE DIGIT NINE*/
+};
+
+static const uint8_t g_afRTUniFlags0x01ee00[] =
+{
+ RTUNI_ALPHA, /* U+01ee00: ARABIC MATHEMATICAL ALEF*/
+ RTUNI_ALPHA, /* U+01ee01: ARABIC MATHEMATICAL BEH*/
+ RTUNI_ALPHA, /* U+01ee02: ARABIC MATHEMATICAL JEEM*/
+ RTUNI_ALPHA, /* U+01ee03: ARABIC MATHEMATICAL DAL*/
+ 0, /* U+01ee04: */
+ RTUNI_ALPHA, /* U+01ee05: ARABIC MATHEMATICAL WAW*/
+ RTUNI_ALPHA, /* U+01ee06: ARABIC MATHEMATICAL ZAIN*/
+ RTUNI_ALPHA, /* U+01ee07: ARABIC MATHEMATICAL HAH*/
+ RTUNI_ALPHA, /* U+01ee08: ARABIC MATHEMATICAL TAH*/
+ RTUNI_ALPHA, /* U+01ee09: ARABIC MATHEMATICAL YEH*/
+ RTUNI_ALPHA, /* U+01ee0a: ARABIC MATHEMATICAL KAF*/
+ RTUNI_ALPHA, /* U+01ee0b: ARABIC MATHEMATICAL LAM*/
+ RTUNI_ALPHA, /* U+01ee0c: ARABIC MATHEMATICAL MEEM*/
+ RTUNI_ALPHA, /* U+01ee0d: ARABIC MATHEMATICAL NOON*/
+ RTUNI_ALPHA, /* U+01ee0e: ARABIC MATHEMATICAL SEEN*/
+ RTUNI_ALPHA, /* U+01ee0f: ARABIC MATHEMATICAL AIN*/
+ RTUNI_ALPHA, /* U+01ee10: ARABIC MATHEMATICAL FEH*/
+ RTUNI_ALPHA, /* U+01ee11: ARABIC MATHEMATICAL SAD*/
+ RTUNI_ALPHA, /* U+01ee12: ARABIC MATHEMATICAL QAF*/
+ RTUNI_ALPHA, /* U+01ee13: ARABIC MATHEMATICAL REH*/
+ RTUNI_ALPHA, /* U+01ee14: ARABIC MATHEMATICAL SHEEN*/
+ RTUNI_ALPHA, /* U+01ee15: ARABIC MATHEMATICAL TEH*/
+ RTUNI_ALPHA, /* U+01ee16: ARABIC MATHEMATICAL THEH*/
+ RTUNI_ALPHA, /* U+01ee17: ARABIC MATHEMATICAL KHAH*/
+ RTUNI_ALPHA, /* U+01ee18: ARABIC MATHEMATICAL THAL*/
+ RTUNI_ALPHA, /* U+01ee19: ARABIC MATHEMATICAL DAD*/
+ RTUNI_ALPHA, /* U+01ee1a: ARABIC MATHEMATICAL ZAH*/
+ RTUNI_ALPHA, /* U+01ee1b: ARABIC MATHEMATICAL GHAIN*/
+ RTUNI_ALPHA, /* U+01ee1c: ARABIC MATHEMATICAL DOTLESS BEH*/
+ RTUNI_ALPHA, /* U+01ee1d: ARABIC MATHEMATICAL DOTLESS NOON*/
+ RTUNI_ALPHA, /* U+01ee1e: ARABIC MATHEMATICAL DOTLESS FEH*/
+ RTUNI_ALPHA, /* U+01ee1f: ARABIC MATHEMATICAL DOTLESS QAF*/
+ 0, /* U+01ee20: */
+ RTUNI_ALPHA, /* U+01ee21: ARABIC MATHEMATICAL INITIAL BEH*/
+ RTUNI_ALPHA, /* U+01ee22: ARABIC MATHEMATICAL INITIAL JEEM*/
+ 0, /* U+01ee23: */
+ RTUNI_ALPHA, /* U+01ee24: ARABIC MATHEMATICAL INITIAL HEH*/
+ 0, /* U+01ee25: */
+ 0, /* U+01ee26: */
+ RTUNI_ALPHA, /* U+01ee27: ARABIC MATHEMATICAL INITIAL HAH*/
+ 0, /* U+01ee28: */
+ RTUNI_ALPHA, /* U+01ee29: ARABIC MATHEMATICAL INITIAL YEH*/
+ RTUNI_ALPHA, /* U+01ee2a: ARABIC MATHEMATICAL INITIAL KAF*/
+ RTUNI_ALPHA, /* U+01ee2b: ARABIC MATHEMATICAL INITIAL LAM*/
+ RTUNI_ALPHA, /* U+01ee2c: ARABIC MATHEMATICAL INITIAL MEEM*/
+ RTUNI_ALPHA, /* U+01ee2d: ARABIC MATHEMATICAL INITIAL NOON*/
+ RTUNI_ALPHA, /* U+01ee2e: ARABIC MATHEMATICAL INITIAL SEEN*/
+ RTUNI_ALPHA, /* U+01ee2f: ARABIC MATHEMATICAL INITIAL AIN*/
+ RTUNI_ALPHA, /* U+01ee30: ARABIC MATHEMATICAL INITIAL FEH*/
+ RTUNI_ALPHA, /* U+01ee31: ARABIC MATHEMATICAL INITIAL SAD*/
+ RTUNI_ALPHA, /* U+01ee32: ARABIC MATHEMATICAL INITIAL QAF*/
+ 0, /* U+01ee33: */
+ RTUNI_ALPHA, /* U+01ee34: ARABIC MATHEMATICAL INITIAL SHEEN*/
+ RTUNI_ALPHA, /* U+01ee35: ARABIC MATHEMATICAL INITIAL TEH*/
+ RTUNI_ALPHA, /* U+01ee36: ARABIC MATHEMATICAL INITIAL THEH*/
+ RTUNI_ALPHA, /* U+01ee37: ARABIC MATHEMATICAL INITIAL KHAH*/
+ 0, /* U+01ee38: */
+ RTUNI_ALPHA, /* U+01ee39: ARABIC MATHEMATICAL INITIAL DAD*/
+ 0, /* U+01ee3a: */
+ RTUNI_ALPHA, /* U+01ee3b: ARABIC MATHEMATICAL INITIAL GHAIN*/
+ 0, /* U+01ee3c: */
+ 0, /* U+01ee3d: */
+ 0, /* U+01ee3e: */
+ 0, /* U+01ee3f: */
+ 0, /* U+01ee40: */
+ 0, /* U+01ee41: */
+ RTUNI_ALPHA, /* U+01ee42: ARABIC MATHEMATICAL TAILED JEEM*/
+ 0, /* U+01ee43: */
+ 0, /* U+01ee44: */
+ 0, /* U+01ee45: */
+ 0, /* U+01ee46: */
+ RTUNI_ALPHA, /* U+01ee47: ARABIC MATHEMATICAL TAILED HAH*/
+ 0, /* U+01ee48: */
+ RTUNI_ALPHA, /* U+01ee49: ARABIC MATHEMATICAL TAILED YEH*/
+ 0, /* U+01ee4a: */
+ RTUNI_ALPHA, /* U+01ee4b: ARABIC MATHEMATICAL TAILED LAM*/
+ 0, /* U+01ee4c: */
+ RTUNI_ALPHA, /* U+01ee4d: ARABIC MATHEMATICAL TAILED NOON*/
+ RTUNI_ALPHA, /* U+01ee4e: ARABIC MATHEMATICAL TAILED SEEN*/
+ RTUNI_ALPHA, /* U+01ee4f: ARABIC MATHEMATICAL TAILED AIN*/
+ 0, /* U+01ee50: */
+ RTUNI_ALPHA, /* U+01ee51: ARABIC MATHEMATICAL TAILED SAD*/
+ RTUNI_ALPHA, /* U+01ee52: ARABIC MATHEMATICAL TAILED QAF*/
+ 0, /* U+01ee53: */
+ RTUNI_ALPHA, /* U+01ee54: ARABIC MATHEMATICAL TAILED SHEEN*/
+ 0, /* U+01ee55: */
+ 0, /* U+01ee56: */
+ RTUNI_ALPHA, /* U+01ee57: ARABIC MATHEMATICAL TAILED KHAH*/
+ 0, /* U+01ee58: */
+ RTUNI_ALPHA, /* U+01ee59: ARABIC MATHEMATICAL TAILED DAD*/
+ 0, /* U+01ee5a: */
+ RTUNI_ALPHA, /* U+01ee5b: ARABIC MATHEMATICAL TAILED GHAIN*/
+ 0, /* U+01ee5c: */
+ RTUNI_ALPHA, /* U+01ee5d: ARABIC MATHEMATICAL TAILED DOTLESS NOON*/
+ 0, /* U+01ee5e: */
+ RTUNI_ALPHA, /* U+01ee5f: ARABIC MATHEMATICAL TAILED DOTLESS QAF*/
+ 0, /* U+01ee60: */
+ RTUNI_ALPHA, /* U+01ee61: ARABIC MATHEMATICAL STRETCHED BEH*/
+ RTUNI_ALPHA, /* U+01ee62: ARABIC MATHEMATICAL STRETCHED JEEM*/
+ 0, /* U+01ee63: */
+ RTUNI_ALPHA, /* U+01ee64: ARABIC MATHEMATICAL STRETCHED HEH*/
+ 0, /* U+01ee65: */
+ 0, /* U+01ee66: */
+ RTUNI_ALPHA, /* U+01ee67: ARABIC MATHEMATICAL STRETCHED HAH*/
+ RTUNI_ALPHA, /* U+01ee68: ARABIC MATHEMATICAL STRETCHED TAH*/
+ RTUNI_ALPHA, /* U+01ee69: ARABIC MATHEMATICAL STRETCHED YEH*/
+ RTUNI_ALPHA, /* U+01ee6a: ARABIC MATHEMATICAL STRETCHED KAF*/
+ 0, /* U+01ee6b: */
+ RTUNI_ALPHA, /* U+01ee6c: ARABIC MATHEMATICAL STRETCHED MEEM*/
+ RTUNI_ALPHA, /* U+01ee6d: ARABIC MATHEMATICAL STRETCHED NOON*/
+ RTUNI_ALPHA, /* U+01ee6e: ARABIC MATHEMATICAL STRETCHED SEEN*/
+ RTUNI_ALPHA, /* U+01ee6f: ARABIC MATHEMATICAL STRETCHED AIN*/
+ RTUNI_ALPHA, /* U+01ee70: ARABIC MATHEMATICAL STRETCHED FEH*/
+ RTUNI_ALPHA, /* U+01ee71: ARABIC MATHEMATICAL STRETCHED SAD*/
+ RTUNI_ALPHA, /* U+01ee72: ARABIC MATHEMATICAL STRETCHED QAF*/
+ 0, /* U+01ee73: */
+ RTUNI_ALPHA, /* U+01ee74: ARABIC MATHEMATICAL STRETCHED SHEEN*/
+ RTUNI_ALPHA, /* U+01ee75: ARABIC MATHEMATICAL STRETCHED TEH*/
+ RTUNI_ALPHA, /* U+01ee76: ARABIC MATHEMATICAL STRETCHED THEH*/
+ RTUNI_ALPHA, /* U+01ee77: ARABIC MATHEMATICAL STRETCHED KHAH*/
+ 0, /* U+01ee78: */
+ RTUNI_ALPHA, /* U+01ee79: ARABIC MATHEMATICAL STRETCHED DAD*/
+ RTUNI_ALPHA, /* U+01ee7a: ARABIC MATHEMATICAL STRETCHED ZAH*/
+ RTUNI_ALPHA, /* U+01ee7b: ARABIC MATHEMATICAL STRETCHED GHAIN*/
+ RTUNI_ALPHA, /* U+01ee7c: ARABIC MATHEMATICAL STRETCHED DOTLESS BEH*/
+ 0, /* U+01ee7d: */
+ RTUNI_ALPHA, /* U+01ee7e: ARABIC MATHEMATICAL STRETCHED DOTLESS FEH*/
+ 0, /* U+01ee7f: */
+ RTUNI_ALPHA, /* U+01ee80: ARABIC MATHEMATICAL LOOPED ALEF*/
+ RTUNI_ALPHA, /* U+01ee81: ARABIC MATHEMATICAL LOOPED BEH*/
+ RTUNI_ALPHA, /* U+01ee82: ARABIC MATHEMATICAL LOOPED JEEM*/
+ RTUNI_ALPHA, /* U+01ee83: ARABIC MATHEMATICAL LOOPED DAL*/
+ RTUNI_ALPHA, /* U+01ee84: ARABIC MATHEMATICAL LOOPED HEH*/
+ RTUNI_ALPHA, /* U+01ee85: ARABIC MATHEMATICAL LOOPED WAW*/
+ RTUNI_ALPHA, /* U+01ee86: ARABIC MATHEMATICAL LOOPED ZAIN*/
+ RTUNI_ALPHA, /* U+01ee87: ARABIC MATHEMATICAL LOOPED HAH*/
+ RTUNI_ALPHA, /* U+01ee88: ARABIC MATHEMATICAL LOOPED TAH*/
+ RTUNI_ALPHA, /* U+01ee89: ARABIC MATHEMATICAL LOOPED YEH*/
+ 0, /* U+01ee8a: */
+ RTUNI_ALPHA, /* U+01ee8b: ARABIC MATHEMATICAL LOOPED LAM*/
+ RTUNI_ALPHA, /* U+01ee8c: ARABIC MATHEMATICAL LOOPED MEEM*/
+ RTUNI_ALPHA, /* U+01ee8d: ARABIC MATHEMATICAL LOOPED NOON*/
+ RTUNI_ALPHA, /* U+01ee8e: ARABIC MATHEMATICAL LOOPED SEEN*/
+ RTUNI_ALPHA, /* U+01ee8f: ARABIC MATHEMATICAL LOOPED AIN*/
+ RTUNI_ALPHA, /* U+01ee90: ARABIC MATHEMATICAL LOOPED FEH*/
+ RTUNI_ALPHA, /* U+01ee91: ARABIC MATHEMATICAL LOOPED SAD*/
+ RTUNI_ALPHA, /* U+01ee92: ARABIC MATHEMATICAL LOOPED QAF*/
+ RTUNI_ALPHA, /* U+01ee93: ARABIC MATHEMATICAL LOOPED REH*/
+ RTUNI_ALPHA, /* U+01ee94: ARABIC MATHEMATICAL LOOPED SHEEN*/
+ RTUNI_ALPHA, /* U+01ee95: ARABIC MATHEMATICAL LOOPED TEH*/
+ RTUNI_ALPHA, /* U+01ee96: ARABIC MATHEMATICAL LOOPED THEH*/
+ RTUNI_ALPHA, /* U+01ee97: ARABIC MATHEMATICAL LOOPED KHAH*/
+ RTUNI_ALPHA, /* U+01ee98: ARABIC MATHEMATICAL LOOPED THAL*/
+ RTUNI_ALPHA, /* U+01ee99: ARABIC MATHEMATICAL LOOPED DAD*/
+ RTUNI_ALPHA, /* U+01ee9a: ARABIC MATHEMATICAL LOOPED ZAH*/
+ RTUNI_ALPHA, /* U+01ee9b: ARABIC MATHEMATICAL LOOPED GHAIN*/
+ 0, /* U+01ee9c: */
+ 0, /* U+01ee9d: */
+ 0, /* U+01ee9e: */
+ 0, /* U+01ee9f: */
+ 0, /* U+01eea0: */
+ RTUNI_ALPHA, /* U+01eea1: ARABIC MATHEMATICAL DOUBLE-STRUCK BEH*/
+ RTUNI_ALPHA, /* U+01eea2: ARABIC MATHEMATICAL DOUBLE-STRUCK JEEM*/
+ RTUNI_ALPHA, /* U+01eea3: ARABIC MATHEMATICAL DOUBLE-STRUCK DAL*/
+ 0, /* U+01eea4: */
+ RTUNI_ALPHA, /* U+01eea5: ARABIC MATHEMATICAL DOUBLE-STRUCK WAW*/
+ RTUNI_ALPHA, /* U+01eea6: ARABIC MATHEMATICAL DOUBLE-STRUCK ZAIN*/
+ RTUNI_ALPHA, /* U+01eea7: ARABIC MATHEMATICAL DOUBLE-STRUCK HAH*/
+ RTUNI_ALPHA, /* U+01eea8: ARABIC MATHEMATICAL DOUBLE-STRUCK TAH*/
+ RTUNI_ALPHA, /* U+01eea9: ARABIC MATHEMATICAL DOUBLE-STRUCK YEH*/
+ 0, /* U+01eeaa: */
+ RTUNI_ALPHA, /* U+01eeab: ARABIC MATHEMATICAL DOUBLE-STRUCK LAM*/
+ RTUNI_ALPHA, /* U+01eeac: ARABIC MATHEMATICAL DOUBLE-STRUCK MEEM*/
+ RTUNI_ALPHA, /* U+01eead: ARABIC MATHEMATICAL DOUBLE-STRUCK NOON*/
+ RTUNI_ALPHA, /* U+01eeae: ARABIC MATHEMATICAL DOUBLE-STRUCK SEEN*/
+ RTUNI_ALPHA, /* U+01eeaf: ARABIC MATHEMATICAL DOUBLE-STRUCK AIN*/
+ RTUNI_ALPHA, /* U+01eeb0: ARABIC MATHEMATICAL DOUBLE-STRUCK FEH*/
+ RTUNI_ALPHA, /* U+01eeb1: ARABIC MATHEMATICAL DOUBLE-STRUCK SAD*/
+ RTUNI_ALPHA, /* U+01eeb2: ARABIC MATHEMATICAL DOUBLE-STRUCK QAF*/
+ RTUNI_ALPHA, /* U+01eeb3: ARABIC MATHEMATICAL DOUBLE-STRUCK REH*/
+ RTUNI_ALPHA, /* U+01eeb4: ARABIC MATHEMATICAL DOUBLE-STRUCK SHEEN*/
+ RTUNI_ALPHA, /* U+01eeb5: ARABIC MATHEMATICAL DOUBLE-STRUCK TEH*/
+ RTUNI_ALPHA, /* U+01eeb6: ARABIC MATHEMATICAL DOUBLE-STRUCK THEH*/
+ RTUNI_ALPHA, /* U+01eeb7: ARABIC MATHEMATICAL DOUBLE-STRUCK KHAH*/
+ RTUNI_ALPHA, /* U+01eeb8: ARABIC MATHEMATICAL DOUBLE-STRUCK THAL*/
+ RTUNI_ALPHA, /* U+01eeb9: ARABIC MATHEMATICAL DOUBLE-STRUCK DAD*/
+ RTUNI_ALPHA, /* U+01eeba: ARABIC MATHEMATICAL DOUBLE-STRUCK ZAH*/
+ RTUNI_ALPHA, /* U+01eebb: ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN*/
+};
+
+static const uint8_t g_afRTUniFlags0x020000[] =
+{
+ RTUNI_ALPHA, /* U+020000: <CJK Ideograph Extension B, First>*/
+};
+
+static const uint8_t g_afRTUniFlags0x02a6d6[] =
+{
+ RTUNI_ALPHA, /* U+02a6d6: <CJK Ideograph Extension B, Last>*/
+ 0, /* U+02a6d7: */
+ 0, /* U+02a6d8: */
+ 0, /* U+02a6d9: */
+ 0, /* U+02a6da: */
+ 0, /* U+02a6db: */
+ 0, /* U+02a6dc: */
+ 0, /* U+02a6dd: */
+ 0, /* U+02a6de: */
+ 0, /* U+02a6df: */
+ 0, /* U+02a6e0: */
+ 0, /* U+02a6e1: */
+ 0, /* U+02a6e2: */
+ 0, /* U+02a6e3: */
+ 0, /* U+02a6e4: */
+ 0, /* U+02a6e5: */
+ 0, /* U+02a6e6: */
+ 0, /* U+02a6e7: */
+ 0, /* U+02a6e8: */
+ 0, /* U+02a6e9: */
+ 0, /* U+02a6ea: */
+ 0, /* U+02a6eb: */
+ 0, /* U+02a6ec: */
+ 0, /* U+02a6ed: */
+ 0, /* U+02a6ee: */
+ 0, /* U+02a6ef: */
+ 0, /* U+02a6f0: */
+ 0, /* U+02a6f1: */
+ 0, /* U+02a6f2: */
+ 0, /* U+02a6f3: */
+ 0, /* U+02a6f4: */
+ 0, /* U+02a6f5: */
+ 0, /* U+02a6f6: */
+ 0, /* U+02a6f7: */
+ 0, /* U+02a6f8: */
+ 0, /* U+02a6f9: */
+ 0, /* U+02a6fa: */
+ 0, /* U+02a6fb: */
+ 0, /* U+02a6fc: */
+ 0, /* U+02a6fd: */
+ 0, /* U+02a6fe: */
+ 0, /* U+02a6ff: */
+ RTUNI_ALPHA, /* U+02a700: <CJK Ideograph Extension C, First>*/
+};
+
+static const uint8_t g_afRTUniFlags0x02b734[] =
+{
+ RTUNI_ALPHA, /* U+02b734: <CJK Ideograph Extension C, Last>*/
+ 0, /* U+02b735: */
+ 0, /* U+02b736: */
+ 0, /* U+02b737: */
+ 0, /* U+02b738: */
+ 0, /* U+02b739: */
+ 0, /* U+02b73a: */
+ 0, /* U+02b73b: */
+ 0, /* U+02b73c: */
+ 0, /* U+02b73d: */
+ 0, /* U+02b73e: */
+ 0, /* U+02b73f: */
+ RTUNI_ALPHA, /* U+02b740: <CJK Ideograph Extension D, First>*/
+ RTUNI_ALPHA, /* U+02b741: */
+ RTUNI_ALPHA, /* U+02b742: */
+ RTUNI_ALPHA, /* U+02b743: */
+ RTUNI_ALPHA, /* U+02b744: */
+ RTUNI_ALPHA, /* U+02b745: */
+ RTUNI_ALPHA, /* U+02b746: */
+ RTUNI_ALPHA, /* U+02b747: */
+ RTUNI_ALPHA, /* U+02b748: */
+ RTUNI_ALPHA, /* U+02b749: */
+ RTUNI_ALPHA, /* U+02b74a: */
+ RTUNI_ALPHA, /* U+02b74b: */
+ RTUNI_ALPHA, /* U+02b74c: */
+ RTUNI_ALPHA, /* U+02b74d: */
+ RTUNI_ALPHA, /* U+02b74e: */
+ RTUNI_ALPHA, /* U+02b74f: */
+ RTUNI_ALPHA, /* U+02b750: */
+ RTUNI_ALPHA, /* U+02b751: */
+ RTUNI_ALPHA, /* U+02b752: */
+ RTUNI_ALPHA, /* U+02b753: */
+ RTUNI_ALPHA, /* U+02b754: */
+ RTUNI_ALPHA, /* U+02b755: */
+ RTUNI_ALPHA, /* U+02b756: */
+ RTUNI_ALPHA, /* U+02b757: */
+ RTUNI_ALPHA, /* U+02b758: */
+ RTUNI_ALPHA, /* U+02b759: */
+ RTUNI_ALPHA, /* U+02b75a: */
+ RTUNI_ALPHA, /* U+02b75b: */
+ RTUNI_ALPHA, /* U+02b75c: */
+ RTUNI_ALPHA, /* U+02b75d: */
+ RTUNI_ALPHA, /* U+02b75e: */
+ RTUNI_ALPHA, /* U+02b75f: */
+ RTUNI_ALPHA, /* U+02b760: */
+ RTUNI_ALPHA, /* U+02b761: */
+ RTUNI_ALPHA, /* U+02b762: */
+ RTUNI_ALPHA, /* U+02b763: */
+ RTUNI_ALPHA, /* U+02b764: */
+ RTUNI_ALPHA, /* U+02b765: */
+ RTUNI_ALPHA, /* U+02b766: */
+ RTUNI_ALPHA, /* U+02b767: */
+ RTUNI_ALPHA, /* U+02b768: */
+ RTUNI_ALPHA, /* U+02b769: */
+ RTUNI_ALPHA, /* U+02b76a: */
+ RTUNI_ALPHA, /* U+02b76b: */
+ RTUNI_ALPHA, /* U+02b76c: */
+ RTUNI_ALPHA, /* U+02b76d: */
+ RTUNI_ALPHA, /* U+02b76e: */
+ RTUNI_ALPHA, /* U+02b76f: */
+ RTUNI_ALPHA, /* U+02b770: */
+ RTUNI_ALPHA, /* U+02b771: */
+ RTUNI_ALPHA, /* U+02b772: */
+ RTUNI_ALPHA, /* U+02b773: */
+ RTUNI_ALPHA, /* U+02b774: */
+ RTUNI_ALPHA, /* U+02b775: */
+ RTUNI_ALPHA, /* U+02b776: */
+ RTUNI_ALPHA, /* U+02b777: */
+ RTUNI_ALPHA, /* U+02b778: */
+ RTUNI_ALPHA, /* U+02b779: */
+ RTUNI_ALPHA, /* U+02b77a: */
+ RTUNI_ALPHA, /* U+02b77b: */
+ RTUNI_ALPHA, /* U+02b77c: */
+ RTUNI_ALPHA, /* U+02b77d: */
+ RTUNI_ALPHA, /* U+02b77e: */
+ RTUNI_ALPHA, /* U+02b77f: */
+ RTUNI_ALPHA, /* U+02b780: */
+ RTUNI_ALPHA, /* U+02b781: */
+ RTUNI_ALPHA, /* U+02b782: */
+ RTUNI_ALPHA, /* U+02b783: */
+ RTUNI_ALPHA, /* U+02b784: */
+ RTUNI_ALPHA, /* U+02b785: */
+ RTUNI_ALPHA, /* U+02b786: */
+ RTUNI_ALPHA, /* U+02b787: */
+ RTUNI_ALPHA, /* U+02b788: */
+ RTUNI_ALPHA, /* U+02b789: */
+ RTUNI_ALPHA, /* U+02b78a: */
+ RTUNI_ALPHA, /* U+02b78b: */
+ RTUNI_ALPHA, /* U+02b78c: */
+ RTUNI_ALPHA, /* U+02b78d: */
+ RTUNI_ALPHA, /* U+02b78e: */
+ RTUNI_ALPHA, /* U+02b78f: */
+ RTUNI_ALPHA, /* U+02b790: */
+ RTUNI_ALPHA, /* U+02b791: */
+ RTUNI_ALPHA, /* U+02b792: */
+ RTUNI_ALPHA, /* U+02b793: */
+ RTUNI_ALPHA, /* U+02b794: */
+ RTUNI_ALPHA, /* U+02b795: */
+ RTUNI_ALPHA, /* U+02b796: */
+ RTUNI_ALPHA, /* U+02b797: */
+ RTUNI_ALPHA, /* U+02b798: */
+ RTUNI_ALPHA, /* U+02b799: */
+ RTUNI_ALPHA, /* U+02b79a: */
+ RTUNI_ALPHA, /* U+02b79b: */
+ RTUNI_ALPHA, /* U+02b79c: */
+ RTUNI_ALPHA, /* U+02b79d: */
+ RTUNI_ALPHA, /* U+02b79e: */
+ RTUNI_ALPHA, /* U+02b79f: */
+ RTUNI_ALPHA, /* U+02b7a0: */
+ RTUNI_ALPHA, /* U+02b7a1: */
+ RTUNI_ALPHA, /* U+02b7a2: */
+ RTUNI_ALPHA, /* U+02b7a3: */
+ RTUNI_ALPHA, /* U+02b7a4: */
+ RTUNI_ALPHA, /* U+02b7a5: */
+ RTUNI_ALPHA, /* U+02b7a6: */
+ RTUNI_ALPHA, /* U+02b7a7: */
+ RTUNI_ALPHA, /* U+02b7a8: */
+ RTUNI_ALPHA, /* U+02b7a9: */
+ RTUNI_ALPHA, /* U+02b7aa: */
+ RTUNI_ALPHA, /* U+02b7ab: */
+ RTUNI_ALPHA, /* U+02b7ac: */
+ RTUNI_ALPHA, /* U+02b7ad: */
+ RTUNI_ALPHA, /* U+02b7ae: */
+ RTUNI_ALPHA, /* U+02b7af: */
+ RTUNI_ALPHA, /* U+02b7b0: */
+ RTUNI_ALPHA, /* U+02b7b1: */
+ RTUNI_ALPHA, /* U+02b7b2: */
+ RTUNI_ALPHA, /* U+02b7b3: */
+ RTUNI_ALPHA, /* U+02b7b4: */
+ RTUNI_ALPHA, /* U+02b7b5: */
+ RTUNI_ALPHA, /* U+02b7b6: */
+ RTUNI_ALPHA, /* U+02b7b7: */
+ RTUNI_ALPHA, /* U+02b7b8: */
+ RTUNI_ALPHA, /* U+02b7b9: */
+ RTUNI_ALPHA, /* U+02b7ba: */
+ RTUNI_ALPHA, /* U+02b7bb: */
+ RTUNI_ALPHA, /* U+02b7bc: */
+ RTUNI_ALPHA, /* U+02b7bd: */
+ RTUNI_ALPHA, /* U+02b7be: */
+ RTUNI_ALPHA, /* U+02b7bf: */
+ RTUNI_ALPHA, /* U+02b7c0: */
+ RTUNI_ALPHA, /* U+02b7c1: */
+ RTUNI_ALPHA, /* U+02b7c2: */
+ RTUNI_ALPHA, /* U+02b7c3: */
+ RTUNI_ALPHA, /* U+02b7c4: */
+ RTUNI_ALPHA, /* U+02b7c5: */
+ RTUNI_ALPHA, /* U+02b7c6: */
+ RTUNI_ALPHA, /* U+02b7c7: */
+ RTUNI_ALPHA, /* U+02b7c8: */
+ RTUNI_ALPHA, /* U+02b7c9: */
+ RTUNI_ALPHA, /* U+02b7ca: */
+ RTUNI_ALPHA, /* U+02b7cb: */
+ RTUNI_ALPHA, /* U+02b7cc: */
+ RTUNI_ALPHA, /* U+02b7cd: */
+ RTUNI_ALPHA, /* U+02b7ce: */
+ RTUNI_ALPHA, /* U+02b7cf: */
+ RTUNI_ALPHA, /* U+02b7d0: */
+ RTUNI_ALPHA, /* U+02b7d1: */
+ RTUNI_ALPHA, /* U+02b7d2: */
+ RTUNI_ALPHA, /* U+02b7d3: */
+ RTUNI_ALPHA, /* U+02b7d4: */
+ RTUNI_ALPHA, /* U+02b7d5: */
+ RTUNI_ALPHA, /* U+02b7d6: */
+ RTUNI_ALPHA, /* U+02b7d7: */
+ RTUNI_ALPHA, /* U+02b7d8: */
+ RTUNI_ALPHA, /* U+02b7d9: */
+ RTUNI_ALPHA, /* U+02b7da: */
+ RTUNI_ALPHA, /* U+02b7db: */
+ RTUNI_ALPHA, /* U+02b7dc: */
+ RTUNI_ALPHA, /* U+02b7dd: */
+ RTUNI_ALPHA, /* U+02b7de: */
+ RTUNI_ALPHA, /* U+02b7df: */
+ RTUNI_ALPHA, /* U+02b7e0: */
+ RTUNI_ALPHA, /* U+02b7e1: */
+ RTUNI_ALPHA, /* U+02b7e2: */
+ RTUNI_ALPHA, /* U+02b7e3: */
+ RTUNI_ALPHA, /* U+02b7e4: */
+ RTUNI_ALPHA, /* U+02b7e5: */
+ RTUNI_ALPHA, /* U+02b7e6: */
+ RTUNI_ALPHA, /* U+02b7e7: */
+ RTUNI_ALPHA, /* U+02b7e8: */
+ RTUNI_ALPHA, /* U+02b7e9: */
+ RTUNI_ALPHA, /* U+02b7ea: */
+ RTUNI_ALPHA, /* U+02b7eb: */
+ RTUNI_ALPHA, /* U+02b7ec: */
+ RTUNI_ALPHA, /* U+02b7ed: */
+ RTUNI_ALPHA, /* U+02b7ee: */
+ RTUNI_ALPHA, /* U+02b7ef: */
+ RTUNI_ALPHA, /* U+02b7f0: */
+ RTUNI_ALPHA, /* U+02b7f1: */
+ RTUNI_ALPHA, /* U+02b7f2: */
+ RTUNI_ALPHA, /* U+02b7f3: */
+ RTUNI_ALPHA, /* U+02b7f4: */
+ RTUNI_ALPHA, /* U+02b7f5: */
+ RTUNI_ALPHA, /* U+02b7f6: */
+ RTUNI_ALPHA, /* U+02b7f7: */
+ RTUNI_ALPHA, /* U+02b7f8: */
+ RTUNI_ALPHA, /* U+02b7f9: */
+ RTUNI_ALPHA, /* U+02b7fa: */
+ RTUNI_ALPHA, /* U+02b7fb: */
+ RTUNI_ALPHA, /* U+02b7fc: */
+ RTUNI_ALPHA, /* U+02b7fd: */
+ RTUNI_ALPHA, /* U+02b7fe: */
+ RTUNI_ALPHA, /* U+02b7ff: */
+ RTUNI_ALPHA, /* U+02b800: */
+ RTUNI_ALPHA, /* U+02b801: */
+ RTUNI_ALPHA, /* U+02b802: */
+ RTUNI_ALPHA, /* U+02b803: */
+ RTUNI_ALPHA, /* U+02b804: */
+ RTUNI_ALPHA, /* U+02b805: */
+ RTUNI_ALPHA, /* U+02b806: */
+ RTUNI_ALPHA, /* U+02b807: */
+ RTUNI_ALPHA, /* U+02b808: */
+ RTUNI_ALPHA, /* U+02b809: */
+ RTUNI_ALPHA, /* U+02b80a: */
+ RTUNI_ALPHA, /* U+02b80b: */
+ RTUNI_ALPHA, /* U+02b80c: */
+ RTUNI_ALPHA, /* U+02b80d: */
+ RTUNI_ALPHA, /* U+02b80e: */
+ RTUNI_ALPHA, /* U+02b80f: */
+ RTUNI_ALPHA, /* U+02b810: */
+ RTUNI_ALPHA, /* U+02b811: */
+ RTUNI_ALPHA, /* U+02b812: */
+ RTUNI_ALPHA, /* U+02b813: */
+ RTUNI_ALPHA, /* U+02b814: */
+ RTUNI_ALPHA, /* U+02b815: */
+ RTUNI_ALPHA, /* U+02b816: */
+ RTUNI_ALPHA, /* U+02b817: */
+ RTUNI_ALPHA, /* U+02b818: */
+ RTUNI_ALPHA, /* U+02b819: */
+ RTUNI_ALPHA, /* U+02b81a: */
+ RTUNI_ALPHA, /* U+02b81b: */
+ RTUNI_ALPHA, /* U+02b81c: */
+ RTUNI_ALPHA, /* U+02b81d: <CJK Ideograph Extension D, Last>*/
+};
+
+static const uint8_t g_afRTUniFlags0x02f800[] =
+{
+ RTUNI_ALPHA, /* U+02f800: CJK COMPATIBILITY IDEOGRAPH-2F800*/
+ RTUNI_ALPHA, /* U+02f801: CJK COMPATIBILITY IDEOGRAPH-2F801*/
+ RTUNI_ALPHA, /* U+02f802: CJK COMPATIBILITY IDEOGRAPH-2F802*/
+ RTUNI_ALPHA, /* U+02f803: CJK COMPATIBILITY IDEOGRAPH-2F803*/
+ RTUNI_ALPHA, /* U+02f804: CJK COMPATIBILITY IDEOGRAPH-2F804*/
+ RTUNI_ALPHA, /* U+02f805: CJK COMPATIBILITY IDEOGRAPH-2F805*/
+ RTUNI_ALPHA, /* U+02f806: CJK COMPATIBILITY IDEOGRAPH-2F806*/
+ RTUNI_ALPHA, /* U+02f807: CJK COMPATIBILITY IDEOGRAPH-2F807*/
+ RTUNI_ALPHA, /* U+02f808: CJK COMPATIBILITY IDEOGRAPH-2F808*/
+ RTUNI_ALPHA, /* U+02f809: CJK COMPATIBILITY IDEOGRAPH-2F809*/
+ RTUNI_ALPHA, /* U+02f80a: CJK COMPATIBILITY IDEOGRAPH-2F80A*/
+ RTUNI_ALPHA, /* U+02f80b: CJK COMPATIBILITY IDEOGRAPH-2F80B*/
+ RTUNI_ALPHA, /* U+02f80c: CJK COMPATIBILITY IDEOGRAPH-2F80C*/
+ RTUNI_ALPHA, /* U+02f80d: CJK COMPATIBILITY IDEOGRAPH-2F80D*/
+ RTUNI_ALPHA, /* U+02f80e: CJK COMPATIBILITY IDEOGRAPH-2F80E*/
+ RTUNI_ALPHA, /* U+02f80f: CJK COMPATIBILITY IDEOGRAPH-2F80F*/
+ RTUNI_ALPHA, /* U+02f810: CJK COMPATIBILITY IDEOGRAPH-2F810*/
+ RTUNI_ALPHA, /* U+02f811: CJK COMPATIBILITY IDEOGRAPH-2F811*/
+ RTUNI_ALPHA, /* U+02f812: CJK COMPATIBILITY IDEOGRAPH-2F812*/
+ RTUNI_ALPHA, /* U+02f813: CJK COMPATIBILITY IDEOGRAPH-2F813*/
+ RTUNI_ALPHA, /* U+02f814: CJK COMPATIBILITY IDEOGRAPH-2F814*/
+ RTUNI_ALPHA, /* U+02f815: CJK COMPATIBILITY IDEOGRAPH-2F815*/
+ RTUNI_ALPHA, /* U+02f816: CJK COMPATIBILITY IDEOGRAPH-2F816*/
+ RTUNI_ALPHA, /* U+02f817: CJK COMPATIBILITY IDEOGRAPH-2F817*/
+ RTUNI_ALPHA, /* U+02f818: CJK COMPATIBILITY IDEOGRAPH-2F818*/
+ RTUNI_ALPHA, /* U+02f819: CJK COMPATIBILITY IDEOGRAPH-2F819*/
+ RTUNI_ALPHA, /* U+02f81a: CJK COMPATIBILITY IDEOGRAPH-2F81A*/
+ RTUNI_ALPHA, /* U+02f81b: CJK COMPATIBILITY IDEOGRAPH-2F81B*/
+ RTUNI_ALPHA, /* U+02f81c: CJK COMPATIBILITY IDEOGRAPH-2F81C*/
+ RTUNI_ALPHA, /* U+02f81d: CJK COMPATIBILITY IDEOGRAPH-2F81D*/
+ RTUNI_ALPHA, /* U+02f81e: CJK COMPATIBILITY IDEOGRAPH-2F81E*/
+ RTUNI_ALPHA, /* U+02f81f: CJK COMPATIBILITY IDEOGRAPH-2F81F*/
+ RTUNI_ALPHA, /* U+02f820: CJK COMPATIBILITY IDEOGRAPH-2F820*/
+ RTUNI_ALPHA, /* U+02f821: CJK COMPATIBILITY IDEOGRAPH-2F821*/
+ RTUNI_ALPHA, /* U+02f822: CJK COMPATIBILITY IDEOGRAPH-2F822*/
+ RTUNI_ALPHA, /* U+02f823: CJK COMPATIBILITY IDEOGRAPH-2F823*/
+ RTUNI_ALPHA, /* U+02f824: CJK COMPATIBILITY IDEOGRAPH-2F824*/
+ RTUNI_ALPHA, /* U+02f825: CJK COMPATIBILITY IDEOGRAPH-2F825*/
+ RTUNI_ALPHA, /* U+02f826: CJK COMPATIBILITY IDEOGRAPH-2F826*/
+ RTUNI_ALPHA, /* U+02f827: CJK COMPATIBILITY IDEOGRAPH-2F827*/
+ RTUNI_ALPHA, /* U+02f828: CJK COMPATIBILITY IDEOGRAPH-2F828*/
+ RTUNI_ALPHA, /* U+02f829: CJK COMPATIBILITY IDEOGRAPH-2F829*/
+ RTUNI_ALPHA, /* U+02f82a: CJK COMPATIBILITY IDEOGRAPH-2F82A*/
+ RTUNI_ALPHA, /* U+02f82b: CJK COMPATIBILITY IDEOGRAPH-2F82B*/
+ RTUNI_ALPHA, /* U+02f82c: CJK COMPATIBILITY IDEOGRAPH-2F82C*/
+ RTUNI_ALPHA, /* U+02f82d: CJK COMPATIBILITY IDEOGRAPH-2F82D*/
+ RTUNI_ALPHA, /* U+02f82e: CJK COMPATIBILITY IDEOGRAPH-2F82E*/
+ RTUNI_ALPHA, /* U+02f82f: CJK COMPATIBILITY IDEOGRAPH-2F82F*/
+ RTUNI_ALPHA, /* U+02f830: CJK COMPATIBILITY IDEOGRAPH-2F830*/
+ RTUNI_ALPHA, /* U+02f831: CJK COMPATIBILITY IDEOGRAPH-2F831*/
+ RTUNI_ALPHA, /* U+02f832: CJK COMPATIBILITY IDEOGRAPH-2F832*/
+ RTUNI_ALPHA, /* U+02f833: CJK COMPATIBILITY IDEOGRAPH-2F833*/
+ RTUNI_ALPHA, /* U+02f834: CJK COMPATIBILITY IDEOGRAPH-2F834*/
+ RTUNI_ALPHA, /* U+02f835: CJK COMPATIBILITY IDEOGRAPH-2F835*/
+ RTUNI_ALPHA, /* U+02f836: CJK COMPATIBILITY IDEOGRAPH-2F836*/
+ RTUNI_ALPHA, /* U+02f837: CJK COMPATIBILITY IDEOGRAPH-2F837*/
+ RTUNI_ALPHA, /* U+02f838: CJK COMPATIBILITY IDEOGRAPH-2F838*/
+ RTUNI_ALPHA, /* U+02f839: CJK COMPATIBILITY IDEOGRAPH-2F839*/
+ RTUNI_ALPHA, /* U+02f83a: CJK COMPATIBILITY IDEOGRAPH-2F83A*/
+ RTUNI_ALPHA, /* U+02f83b: CJK COMPATIBILITY IDEOGRAPH-2F83B*/
+ RTUNI_ALPHA, /* U+02f83c: CJK COMPATIBILITY IDEOGRAPH-2F83C*/
+ RTUNI_ALPHA, /* U+02f83d: CJK COMPATIBILITY IDEOGRAPH-2F83D*/
+ RTUNI_ALPHA, /* U+02f83e: CJK COMPATIBILITY IDEOGRAPH-2F83E*/
+ RTUNI_ALPHA, /* U+02f83f: CJK COMPATIBILITY IDEOGRAPH-2F83F*/
+ RTUNI_ALPHA, /* U+02f840: CJK COMPATIBILITY IDEOGRAPH-2F840*/
+ RTUNI_ALPHA, /* U+02f841: CJK COMPATIBILITY IDEOGRAPH-2F841*/
+ RTUNI_ALPHA, /* U+02f842: CJK COMPATIBILITY IDEOGRAPH-2F842*/
+ RTUNI_ALPHA, /* U+02f843: CJK COMPATIBILITY IDEOGRAPH-2F843*/
+ RTUNI_ALPHA, /* U+02f844: CJK COMPATIBILITY IDEOGRAPH-2F844*/
+ RTUNI_ALPHA, /* U+02f845: CJK COMPATIBILITY IDEOGRAPH-2F845*/
+ RTUNI_ALPHA, /* U+02f846: CJK COMPATIBILITY IDEOGRAPH-2F846*/
+ RTUNI_ALPHA, /* U+02f847: CJK COMPATIBILITY IDEOGRAPH-2F847*/
+ RTUNI_ALPHA, /* U+02f848: CJK COMPATIBILITY IDEOGRAPH-2F848*/
+ RTUNI_ALPHA, /* U+02f849: CJK COMPATIBILITY IDEOGRAPH-2F849*/
+ RTUNI_ALPHA, /* U+02f84a: CJK COMPATIBILITY IDEOGRAPH-2F84A*/
+ RTUNI_ALPHA, /* U+02f84b: CJK COMPATIBILITY IDEOGRAPH-2F84B*/
+ RTUNI_ALPHA, /* U+02f84c: CJK COMPATIBILITY IDEOGRAPH-2F84C*/
+ RTUNI_ALPHA, /* U+02f84d: CJK COMPATIBILITY IDEOGRAPH-2F84D*/
+ RTUNI_ALPHA, /* U+02f84e: CJK COMPATIBILITY IDEOGRAPH-2F84E*/
+ RTUNI_ALPHA, /* U+02f84f: CJK COMPATIBILITY IDEOGRAPH-2F84F*/
+ RTUNI_ALPHA, /* U+02f850: CJK COMPATIBILITY IDEOGRAPH-2F850*/
+ RTUNI_ALPHA, /* U+02f851: CJK COMPATIBILITY IDEOGRAPH-2F851*/
+ RTUNI_ALPHA, /* U+02f852: CJK COMPATIBILITY IDEOGRAPH-2F852*/
+ RTUNI_ALPHA, /* U+02f853: CJK COMPATIBILITY IDEOGRAPH-2F853*/
+ RTUNI_ALPHA, /* U+02f854: CJK COMPATIBILITY IDEOGRAPH-2F854*/
+ RTUNI_ALPHA, /* U+02f855: CJK COMPATIBILITY IDEOGRAPH-2F855*/
+ RTUNI_ALPHA, /* U+02f856: CJK COMPATIBILITY IDEOGRAPH-2F856*/
+ RTUNI_ALPHA, /* U+02f857: CJK COMPATIBILITY IDEOGRAPH-2F857*/
+ RTUNI_ALPHA, /* U+02f858: CJK COMPATIBILITY IDEOGRAPH-2F858*/
+ RTUNI_ALPHA, /* U+02f859: CJK COMPATIBILITY IDEOGRAPH-2F859*/
+ RTUNI_ALPHA, /* U+02f85a: CJK COMPATIBILITY IDEOGRAPH-2F85A*/
+ RTUNI_ALPHA, /* U+02f85b: CJK COMPATIBILITY IDEOGRAPH-2F85B*/
+ RTUNI_ALPHA, /* U+02f85c: CJK COMPATIBILITY IDEOGRAPH-2F85C*/
+ RTUNI_ALPHA, /* U+02f85d: CJK COMPATIBILITY IDEOGRAPH-2F85D*/
+ RTUNI_ALPHA, /* U+02f85e: CJK COMPATIBILITY IDEOGRAPH-2F85E*/
+ RTUNI_ALPHA, /* U+02f85f: CJK COMPATIBILITY IDEOGRAPH-2F85F*/
+ RTUNI_ALPHA, /* U+02f860: CJK COMPATIBILITY IDEOGRAPH-2F860*/
+ RTUNI_ALPHA, /* U+02f861: CJK COMPATIBILITY IDEOGRAPH-2F861*/
+ RTUNI_ALPHA, /* U+02f862: CJK COMPATIBILITY IDEOGRAPH-2F862*/
+ RTUNI_ALPHA, /* U+02f863: CJK COMPATIBILITY IDEOGRAPH-2F863*/
+ RTUNI_ALPHA, /* U+02f864: CJK COMPATIBILITY IDEOGRAPH-2F864*/
+ RTUNI_ALPHA, /* U+02f865: CJK COMPATIBILITY IDEOGRAPH-2F865*/
+ RTUNI_ALPHA, /* U+02f866: CJK COMPATIBILITY IDEOGRAPH-2F866*/
+ RTUNI_ALPHA, /* U+02f867: CJK COMPATIBILITY IDEOGRAPH-2F867*/
+ RTUNI_ALPHA, /* U+02f868: CJK COMPATIBILITY IDEOGRAPH-2F868*/
+ RTUNI_ALPHA, /* U+02f869: CJK COMPATIBILITY IDEOGRAPH-2F869*/
+ RTUNI_ALPHA, /* U+02f86a: CJK COMPATIBILITY IDEOGRAPH-2F86A*/
+ RTUNI_ALPHA, /* U+02f86b: CJK COMPATIBILITY IDEOGRAPH-2F86B*/
+ RTUNI_ALPHA, /* U+02f86c: CJK COMPATIBILITY IDEOGRAPH-2F86C*/
+ RTUNI_ALPHA, /* U+02f86d: CJK COMPATIBILITY IDEOGRAPH-2F86D*/
+ RTUNI_ALPHA, /* U+02f86e: CJK COMPATIBILITY IDEOGRAPH-2F86E*/
+ RTUNI_ALPHA, /* U+02f86f: CJK COMPATIBILITY IDEOGRAPH-2F86F*/
+ RTUNI_ALPHA, /* U+02f870: CJK COMPATIBILITY IDEOGRAPH-2F870*/
+ RTUNI_ALPHA, /* U+02f871: CJK COMPATIBILITY IDEOGRAPH-2F871*/
+ RTUNI_ALPHA, /* U+02f872: CJK COMPATIBILITY IDEOGRAPH-2F872*/
+ RTUNI_ALPHA, /* U+02f873: CJK COMPATIBILITY IDEOGRAPH-2F873*/
+ RTUNI_ALPHA, /* U+02f874: CJK COMPATIBILITY IDEOGRAPH-2F874*/
+ RTUNI_ALPHA, /* U+02f875: CJK COMPATIBILITY IDEOGRAPH-2F875*/
+ RTUNI_ALPHA, /* U+02f876: CJK COMPATIBILITY IDEOGRAPH-2F876*/
+ RTUNI_ALPHA, /* U+02f877: CJK COMPATIBILITY IDEOGRAPH-2F877*/
+ RTUNI_ALPHA, /* U+02f878: CJK COMPATIBILITY IDEOGRAPH-2F878*/
+ RTUNI_ALPHA, /* U+02f879: CJK COMPATIBILITY IDEOGRAPH-2F879*/
+ RTUNI_ALPHA, /* U+02f87a: CJK COMPATIBILITY IDEOGRAPH-2F87A*/
+ RTUNI_ALPHA, /* U+02f87b: CJK COMPATIBILITY IDEOGRAPH-2F87B*/
+ RTUNI_ALPHA, /* U+02f87c: CJK COMPATIBILITY IDEOGRAPH-2F87C*/
+ RTUNI_ALPHA, /* U+02f87d: CJK COMPATIBILITY IDEOGRAPH-2F87D*/
+ RTUNI_ALPHA, /* U+02f87e: CJK COMPATIBILITY IDEOGRAPH-2F87E*/
+ RTUNI_ALPHA, /* U+02f87f: CJK COMPATIBILITY IDEOGRAPH-2F87F*/
+ RTUNI_ALPHA, /* U+02f880: CJK COMPATIBILITY IDEOGRAPH-2F880*/
+ RTUNI_ALPHA, /* U+02f881: CJK COMPATIBILITY IDEOGRAPH-2F881*/
+ RTUNI_ALPHA, /* U+02f882: CJK COMPATIBILITY IDEOGRAPH-2F882*/
+ RTUNI_ALPHA, /* U+02f883: CJK COMPATIBILITY IDEOGRAPH-2F883*/
+ RTUNI_ALPHA, /* U+02f884: CJK COMPATIBILITY IDEOGRAPH-2F884*/
+ RTUNI_ALPHA, /* U+02f885: CJK COMPATIBILITY IDEOGRAPH-2F885*/
+ RTUNI_ALPHA, /* U+02f886: CJK COMPATIBILITY IDEOGRAPH-2F886*/
+ RTUNI_ALPHA, /* U+02f887: CJK COMPATIBILITY IDEOGRAPH-2F887*/
+ RTUNI_ALPHA, /* U+02f888: CJK COMPATIBILITY IDEOGRAPH-2F888*/
+ RTUNI_ALPHA, /* U+02f889: CJK COMPATIBILITY IDEOGRAPH-2F889*/
+ RTUNI_ALPHA, /* U+02f88a: CJK COMPATIBILITY IDEOGRAPH-2F88A*/
+ RTUNI_ALPHA, /* U+02f88b: CJK COMPATIBILITY IDEOGRAPH-2F88B*/
+ RTUNI_ALPHA, /* U+02f88c: CJK COMPATIBILITY IDEOGRAPH-2F88C*/
+ RTUNI_ALPHA, /* U+02f88d: CJK COMPATIBILITY IDEOGRAPH-2F88D*/
+ RTUNI_ALPHA, /* U+02f88e: CJK COMPATIBILITY IDEOGRAPH-2F88E*/
+ RTUNI_ALPHA, /* U+02f88f: CJK COMPATIBILITY IDEOGRAPH-2F88F*/
+ RTUNI_ALPHA, /* U+02f890: CJK COMPATIBILITY IDEOGRAPH-2F890*/
+ RTUNI_ALPHA, /* U+02f891: CJK COMPATIBILITY IDEOGRAPH-2F891*/
+ RTUNI_ALPHA, /* U+02f892: CJK COMPATIBILITY IDEOGRAPH-2F892*/
+ RTUNI_ALPHA, /* U+02f893: CJK COMPATIBILITY IDEOGRAPH-2F893*/
+ RTUNI_ALPHA, /* U+02f894: CJK COMPATIBILITY IDEOGRAPH-2F894*/
+ RTUNI_ALPHA, /* U+02f895: CJK COMPATIBILITY IDEOGRAPH-2F895*/
+ RTUNI_ALPHA, /* U+02f896: CJK COMPATIBILITY IDEOGRAPH-2F896*/
+ RTUNI_ALPHA, /* U+02f897: CJK COMPATIBILITY IDEOGRAPH-2F897*/
+ RTUNI_ALPHA, /* U+02f898: CJK COMPATIBILITY IDEOGRAPH-2F898*/
+ RTUNI_ALPHA, /* U+02f899: CJK COMPATIBILITY IDEOGRAPH-2F899*/
+ RTUNI_ALPHA, /* U+02f89a: CJK COMPATIBILITY IDEOGRAPH-2F89A*/
+ RTUNI_ALPHA, /* U+02f89b: CJK COMPATIBILITY IDEOGRAPH-2F89B*/
+ RTUNI_ALPHA, /* U+02f89c: CJK COMPATIBILITY IDEOGRAPH-2F89C*/
+ RTUNI_ALPHA, /* U+02f89d: CJK COMPATIBILITY IDEOGRAPH-2F89D*/
+ RTUNI_ALPHA, /* U+02f89e: CJK COMPATIBILITY IDEOGRAPH-2F89E*/
+ RTUNI_ALPHA, /* U+02f89f: CJK COMPATIBILITY IDEOGRAPH-2F89F*/
+ RTUNI_ALPHA, /* U+02f8a0: CJK COMPATIBILITY IDEOGRAPH-2F8A0*/
+ RTUNI_ALPHA, /* U+02f8a1: CJK COMPATIBILITY IDEOGRAPH-2F8A1*/
+ RTUNI_ALPHA, /* U+02f8a2: CJK COMPATIBILITY IDEOGRAPH-2F8A2*/
+ RTUNI_ALPHA, /* U+02f8a3: CJK COMPATIBILITY IDEOGRAPH-2F8A3*/
+ RTUNI_ALPHA, /* U+02f8a4: CJK COMPATIBILITY IDEOGRAPH-2F8A4*/
+ RTUNI_ALPHA, /* U+02f8a5: CJK COMPATIBILITY IDEOGRAPH-2F8A5*/
+ RTUNI_ALPHA, /* U+02f8a6: CJK COMPATIBILITY IDEOGRAPH-2F8A6*/
+ RTUNI_ALPHA, /* U+02f8a7: CJK COMPATIBILITY IDEOGRAPH-2F8A7*/
+ RTUNI_ALPHA, /* U+02f8a8: CJK COMPATIBILITY IDEOGRAPH-2F8A8*/
+ RTUNI_ALPHA, /* U+02f8a9: CJK COMPATIBILITY IDEOGRAPH-2F8A9*/
+ RTUNI_ALPHA, /* U+02f8aa: CJK COMPATIBILITY IDEOGRAPH-2F8AA*/
+ RTUNI_ALPHA, /* U+02f8ab: CJK COMPATIBILITY IDEOGRAPH-2F8AB*/
+ RTUNI_ALPHA, /* U+02f8ac: CJK COMPATIBILITY IDEOGRAPH-2F8AC*/
+ RTUNI_ALPHA, /* U+02f8ad: CJK COMPATIBILITY IDEOGRAPH-2F8AD*/
+ RTUNI_ALPHA, /* U+02f8ae: CJK COMPATIBILITY IDEOGRAPH-2F8AE*/
+ RTUNI_ALPHA, /* U+02f8af: CJK COMPATIBILITY IDEOGRAPH-2F8AF*/
+ RTUNI_ALPHA, /* U+02f8b0: CJK COMPATIBILITY IDEOGRAPH-2F8B0*/
+ RTUNI_ALPHA, /* U+02f8b1: CJK COMPATIBILITY IDEOGRAPH-2F8B1*/
+ RTUNI_ALPHA, /* U+02f8b2: CJK COMPATIBILITY IDEOGRAPH-2F8B2*/
+ RTUNI_ALPHA, /* U+02f8b3: CJK COMPATIBILITY IDEOGRAPH-2F8B3*/
+ RTUNI_ALPHA, /* U+02f8b4: CJK COMPATIBILITY IDEOGRAPH-2F8B4*/
+ RTUNI_ALPHA, /* U+02f8b5: CJK COMPATIBILITY IDEOGRAPH-2F8B5*/
+ RTUNI_ALPHA, /* U+02f8b6: CJK COMPATIBILITY IDEOGRAPH-2F8B6*/
+ RTUNI_ALPHA, /* U+02f8b7: CJK COMPATIBILITY IDEOGRAPH-2F8B7*/
+ RTUNI_ALPHA, /* U+02f8b8: CJK COMPATIBILITY IDEOGRAPH-2F8B8*/
+ RTUNI_ALPHA, /* U+02f8b9: CJK COMPATIBILITY IDEOGRAPH-2F8B9*/
+ RTUNI_ALPHA, /* U+02f8ba: CJK COMPATIBILITY IDEOGRAPH-2F8BA*/
+ RTUNI_ALPHA, /* U+02f8bb: CJK COMPATIBILITY IDEOGRAPH-2F8BB*/
+ RTUNI_ALPHA, /* U+02f8bc: CJK COMPATIBILITY IDEOGRAPH-2F8BC*/
+ RTUNI_ALPHA, /* U+02f8bd: CJK COMPATIBILITY IDEOGRAPH-2F8BD*/
+ RTUNI_ALPHA, /* U+02f8be: CJK COMPATIBILITY IDEOGRAPH-2F8BE*/
+ RTUNI_ALPHA, /* U+02f8bf: CJK COMPATIBILITY IDEOGRAPH-2F8BF*/
+ RTUNI_ALPHA, /* U+02f8c0: CJK COMPATIBILITY IDEOGRAPH-2F8C0*/
+ RTUNI_ALPHA, /* U+02f8c1: CJK COMPATIBILITY IDEOGRAPH-2F8C1*/
+ RTUNI_ALPHA, /* U+02f8c2: CJK COMPATIBILITY IDEOGRAPH-2F8C2*/
+ RTUNI_ALPHA, /* U+02f8c3: CJK COMPATIBILITY IDEOGRAPH-2F8C3*/
+ RTUNI_ALPHA, /* U+02f8c4: CJK COMPATIBILITY IDEOGRAPH-2F8C4*/
+ RTUNI_ALPHA, /* U+02f8c5: CJK COMPATIBILITY IDEOGRAPH-2F8C5*/
+ RTUNI_ALPHA, /* U+02f8c6: CJK COMPATIBILITY IDEOGRAPH-2F8C6*/
+ RTUNI_ALPHA, /* U+02f8c7: CJK COMPATIBILITY IDEOGRAPH-2F8C7*/
+ RTUNI_ALPHA, /* U+02f8c8: CJK COMPATIBILITY IDEOGRAPH-2F8C8*/
+ RTUNI_ALPHA, /* U+02f8c9: CJK COMPATIBILITY IDEOGRAPH-2F8C9*/
+ RTUNI_ALPHA, /* U+02f8ca: CJK COMPATIBILITY IDEOGRAPH-2F8CA*/
+ RTUNI_ALPHA, /* U+02f8cb: CJK COMPATIBILITY IDEOGRAPH-2F8CB*/
+ RTUNI_ALPHA, /* U+02f8cc: CJK COMPATIBILITY IDEOGRAPH-2F8CC*/
+ RTUNI_ALPHA, /* U+02f8cd: CJK COMPATIBILITY IDEOGRAPH-2F8CD*/
+ RTUNI_ALPHA, /* U+02f8ce: CJK COMPATIBILITY IDEOGRAPH-2F8CE*/
+ RTUNI_ALPHA, /* U+02f8cf: CJK COMPATIBILITY IDEOGRAPH-2F8CF*/
+ RTUNI_ALPHA, /* U+02f8d0: CJK COMPATIBILITY IDEOGRAPH-2F8D0*/
+ RTUNI_ALPHA, /* U+02f8d1: CJK COMPATIBILITY IDEOGRAPH-2F8D1*/
+ RTUNI_ALPHA, /* U+02f8d2: CJK COMPATIBILITY IDEOGRAPH-2F8D2*/
+ RTUNI_ALPHA, /* U+02f8d3: CJK COMPATIBILITY IDEOGRAPH-2F8D3*/
+ RTUNI_ALPHA, /* U+02f8d4: CJK COMPATIBILITY IDEOGRAPH-2F8D4*/
+ RTUNI_ALPHA, /* U+02f8d5: CJK COMPATIBILITY IDEOGRAPH-2F8D5*/
+ RTUNI_ALPHA, /* U+02f8d6: CJK COMPATIBILITY IDEOGRAPH-2F8D6*/
+ RTUNI_ALPHA, /* U+02f8d7: CJK COMPATIBILITY IDEOGRAPH-2F8D7*/
+ RTUNI_ALPHA, /* U+02f8d8: CJK COMPATIBILITY IDEOGRAPH-2F8D8*/
+ RTUNI_ALPHA, /* U+02f8d9: CJK COMPATIBILITY IDEOGRAPH-2F8D9*/
+ RTUNI_ALPHA, /* U+02f8da: CJK COMPATIBILITY IDEOGRAPH-2F8DA*/
+ RTUNI_ALPHA, /* U+02f8db: CJK COMPATIBILITY IDEOGRAPH-2F8DB*/
+ RTUNI_ALPHA, /* U+02f8dc: CJK COMPATIBILITY IDEOGRAPH-2F8DC*/
+ RTUNI_ALPHA, /* U+02f8dd: CJK COMPATIBILITY IDEOGRAPH-2F8DD*/
+ RTUNI_ALPHA, /* U+02f8de: CJK COMPATIBILITY IDEOGRAPH-2F8DE*/
+ RTUNI_ALPHA, /* U+02f8df: CJK COMPATIBILITY IDEOGRAPH-2F8DF*/
+ RTUNI_ALPHA, /* U+02f8e0: CJK COMPATIBILITY IDEOGRAPH-2F8E0*/
+ RTUNI_ALPHA, /* U+02f8e1: CJK COMPATIBILITY IDEOGRAPH-2F8E1*/
+ RTUNI_ALPHA, /* U+02f8e2: CJK COMPATIBILITY IDEOGRAPH-2F8E2*/
+ RTUNI_ALPHA, /* U+02f8e3: CJK COMPATIBILITY IDEOGRAPH-2F8E3*/
+ RTUNI_ALPHA, /* U+02f8e4: CJK COMPATIBILITY IDEOGRAPH-2F8E4*/
+ RTUNI_ALPHA, /* U+02f8e5: CJK COMPATIBILITY IDEOGRAPH-2F8E5*/
+ RTUNI_ALPHA, /* U+02f8e6: CJK COMPATIBILITY IDEOGRAPH-2F8E6*/
+ RTUNI_ALPHA, /* U+02f8e7: CJK COMPATIBILITY IDEOGRAPH-2F8E7*/
+ RTUNI_ALPHA, /* U+02f8e8: CJK COMPATIBILITY IDEOGRAPH-2F8E8*/
+ RTUNI_ALPHA, /* U+02f8e9: CJK COMPATIBILITY IDEOGRAPH-2F8E9*/
+ RTUNI_ALPHA, /* U+02f8ea: CJK COMPATIBILITY IDEOGRAPH-2F8EA*/
+ RTUNI_ALPHA, /* U+02f8eb: CJK COMPATIBILITY IDEOGRAPH-2F8EB*/
+ RTUNI_ALPHA, /* U+02f8ec: CJK COMPATIBILITY IDEOGRAPH-2F8EC*/
+ RTUNI_ALPHA, /* U+02f8ed: CJK COMPATIBILITY IDEOGRAPH-2F8ED*/
+ RTUNI_ALPHA, /* U+02f8ee: CJK COMPATIBILITY IDEOGRAPH-2F8EE*/
+ RTUNI_ALPHA, /* U+02f8ef: CJK COMPATIBILITY IDEOGRAPH-2F8EF*/
+ RTUNI_ALPHA, /* U+02f8f0: CJK COMPATIBILITY IDEOGRAPH-2F8F0*/
+ RTUNI_ALPHA, /* U+02f8f1: CJK COMPATIBILITY IDEOGRAPH-2F8F1*/
+ RTUNI_ALPHA, /* U+02f8f2: CJK COMPATIBILITY IDEOGRAPH-2F8F2*/
+ RTUNI_ALPHA, /* U+02f8f3: CJK COMPATIBILITY IDEOGRAPH-2F8F3*/
+ RTUNI_ALPHA, /* U+02f8f4: CJK COMPATIBILITY IDEOGRAPH-2F8F4*/
+ RTUNI_ALPHA, /* U+02f8f5: CJK COMPATIBILITY IDEOGRAPH-2F8F5*/
+ RTUNI_ALPHA, /* U+02f8f6: CJK COMPATIBILITY IDEOGRAPH-2F8F6*/
+ RTUNI_ALPHA, /* U+02f8f7: CJK COMPATIBILITY IDEOGRAPH-2F8F7*/
+ RTUNI_ALPHA, /* U+02f8f8: CJK COMPATIBILITY IDEOGRAPH-2F8F8*/
+ RTUNI_ALPHA, /* U+02f8f9: CJK COMPATIBILITY IDEOGRAPH-2F8F9*/
+ RTUNI_ALPHA, /* U+02f8fa: CJK COMPATIBILITY IDEOGRAPH-2F8FA*/
+ RTUNI_ALPHA, /* U+02f8fb: CJK COMPATIBILITY IDEOGRAPH-2F8FB*/
+ RTUNI_ALPHA, /* U+02f8fc: CJK COMPATIBILITY IDEOGRAPH-2F8FC*/
+ RTUNI_ALPHA, /* U+02f8fd: CJK COMPATIBILITY IDEOGRAPH-2F8FD*/
+ RTUNI_ALPHA, /* U+02f8fe: CJK COMPATIBILITY IDEOGRAPH-2F8FE*/
+ RTUNI_ALPHA, /* U+02f8ff: CJK COMPATIBILITY IDEOGRAPH-2F8FF*/
+ RTUNI_ALPHA, /* U+02f900: CJK COMPATIBILITY IDEOGRAPH-2F900*/
+ RTUNI_ALPHA, /* U+02f901: CJK COMPATIBILITY IDEOGRAPH-2F901*/
+ RTUNI_ALPHA, /* U+02f902: CJK COMPATIBILITY IDEOGRAPH-2F902*/
+ RTUNI_ALPHA, /* U+02f903: CJK COMPATIBILITY IDEOGRAPH-2F903*/
+ RTUNI_ALPHA, /* U+02f904: CJK COMPATIBILITY IDEOGRAPH-2F904*/
+ RTUNI_ALPHA, /* U+02f905: CJK COMPATIBILITY IDEOGRAPH-2F905*/
+ RTUNI_ALPHA, /* U+02f906: CJK COMPATIBILITY IDEOGRAPH-2F906*/
+ RTUNI_ALPHA, /* U+02f907: CJK COMPATIBILITY IDEOGRAPH-2F907*/
+ RTUNI_ALPHA, /* U+02f908: CJK COMPATIBILITY IDEOGRAPH-2F908*/
+ RTUNI_ALPHA, /* U+02f909: CJK COMPATIBILITY IDEOGRAPH-2F909*/
+ RTUNI_ALPHA, /* U+02f90a: CJK COMPATIBILITY IDEOGRAPH-2F90A*/
+ RTUNI_ALPHA, /* U+02f90b: CJK COMPATIBILITY IDEOGRAPH-2F90B*/
+ RTUNI_ALPHA, /* U+02f90c: CJK COMPATIBILITY IDEOGRAPH-2F90C*/
+ RTUNI_ALPHA, /* U+02f90d: CJK COMPATIBILITY IDEOGRAPH-2F90D*/
+ RTUNI_ALPHA, /* U+02f90e: CJK COMPATIBILITY IDEOGRAPH-2F90E*/
+ RTUNI_ALPHA, /* U+02f90f: CJK COMPATIBILITY IDEOGRAPH-2F90F*/
+ RTUNI_ALPHA, /* U+02f910: CJK COMPATIBILITY IDEOGRAPH-2F910*/
+ RTUNI_ALPHA, /* U+02f911: CJK COMPATIBILITY IDEOGRAPH-2F911*/
+ RTUNI_ALPHA, /* U+02f912: CJK COMPATIBILITY IDEOGRAPH-2F912*/
+ RTUNI_ALPHA, /* U+02f913: CJK COMPATIBILITY IDEOGRAPH-2F913*/
+ RTUNI_ALPHA, /* U+02f914: CJK COMPATIBILITY IDEOGRAPH-2F914*/
+ RTUNI_ALPHA, /* U+02f915: CJK COMPATIBILITY IDEOGRAPH-2F915*/
+ RTUNI_ALPHA, /* U+02f916: CJK COMPATIBILITY IDEOGRAPH-2F916*/
+ RTUNI_ALPHA, /* U+02f917: CJK COMPATIBILITY IDEOGRAPH-2F917*/
+ RTUNI_ALPHA, /* U+02f918: CJK COMPATIBILITY IDEOGRAPH-2F918*/
+ RTUNI_ALPHA, /* U+02f919: CJK COMPATIBILITY IDEOGRAPH-2F919*/
+ RTUNI_ALPHA, /* U+02f91a: CJK COMPATIBILITY IDEOGRAPH-2F91A*/
+ RTUNI_ALPHA, /* U+02f91b: CJK COMPATIBILITY IDEOGRAPH-2F91B*/
+ RTUNI_ALPHA, /* U+02f91c: CJK COMPATIBILITY IDEOGRAPH-2F91C*/
+ RTUNI_ALPHA, /* U+02f91d: CJK COMPATIBILITY IDEOGRAPH-2F91D*/
+ RTUNI_ALPHA, /* U+02f91e: CJK COMPATIBILITY IDEOGRAPH-2F91E*/
+ RTUNI_ALPHA, /* U+02f91f: CJK COMPATIBILITY IDEOGRAPH-2F91F*/
+ RTUNI_ALPHA, /* U+02f920: CJK COMPATIBILITY IDEOGRAPH-2F920*/
+ RTUNI_ALPHA, /* U+02f921: CJK COMPATIBILITY IDEOGRAPH-2F921*/
+ RTUNI_ALPHA, /* U+02f922: CJK COMPATIBILITY IDEOGRAPH-2F922*/
+ RTUNI_ALPHA, /* U+02f923: CJK COMPATIBILITY IDEOGRAPH-2F923*/
+ RTUNI_ALPHA, /* U+02f924: CJK COMPATIBILITY IDEOGRAPH-2F924*/
+ RTUNI_ALPHA, /* U+02f925: CJK COMPATIBILITY IDEOGRAPH-2F925*/
+ RTUNI_ALPHA, /* U+02f926: CJK COMPATIBILITY IDEOGRAPH-2F926*/
+ RTUNI_ALPHA, /* U+02f927: CJK COMPATIBILITY IDEOGRAPH-2F927*/
+ RTUNI_ALPHA, /* U+02f928: CJK COMPATIBILITY IDEOGRAPH-2F928*/
+ RTUNI_ALPHA, /* U+02f929: CJK COMPATIBILITY IDEOGRAPH-2F929*/
+ RTUNI_ALPHA, /* U+02f92a: CJK COMPATIBILITY IDEOGRAPH-2F92A*/
+ RTUNI_ALPHA, /* U+02f92b: CJK COMPATIBILITY IDEOGRAPH-2F92B*/
+ RTUNI_ALPHA, /* U+02f92c: CJK COMPATIBILITY IDEOGRAPH-2F92C*/
+ RTUNI_ALPHA, /* U+02f92d: CJK COMPATIBILITY IDEOGRAPH-2F92D*/
+ RTUNI_ALPHA, /* U+02f92e: CJK COMPATIBILITY IDEOGRAPH-2F92E*/
+ RTUNI_ALPHA, /* U+02f92f: CJK COMPATIBILITY IDEOGRAPH-2F92F*/
+ RTUNI_ALPHA, /* U+02f930: CJK COMPATIBILITY IDEOGRAPH-2F930*/
+ RTUNI_ALPHA, /* U+02f931: CJK COMPATIBILITY IDEOGRAPH-2F931*/
+ RTUNI_ALPHA, /* U+02f932: CJK COMPATIBILITY IDEOGRAPH-2F932*/
+ RTUNI_ALPHA, /* U+02f933: CJK COMPATIBILITY IDEOGRAPH-2F933*/
+ RTUNI_ALPHA, /* U+02f934: CJK COMPATIBILITY IDEOGRAPH-2F934*/
+ RTUNI_ALPHA, /* U+02f935: CJK COMPATIBILITY IDEOGRAPH-2F935*/
+ RTUNI_ALPHA, /* U+02f936: CJK COMPATIBILITY IDEOGRAPH-2F936*/
+ RTUNI_ALPHA, /* U+02f937: CJK COMPATIBILITY IDEOGRAPH-2F937*/
+ RTUNI_ALPHA, /* U+02f938: CJK COMPATIBILITY IDEOGRAPH-2F938*/
+ RTUNI_ALPHA, /* U+02f939: CJK COMPATIBILITY IDEOGRAPH-2F939*/
+ RTUNI_ALPHA, /* U+02f93a: CJK COMPATIBILITY IDEOGRAPH-2F93A*/
+ RTUNI_ALPHA, /* U+02f93b: CJK COMPATIBILITY IDEOGRAPH-2F93B*/
+ RTUNI_ALPHA, /* U+02f93c: CJK COMPATIBILITY IDEOGRAPH-2F93C*/
+ RTUNI_ALPHA, /* U+02f93d: CJK COMPATIBILITY IDEOGRAPH-2F93D*/
+ RTUNI_ALPHA, /* U+02f93e: CJK COMPATIBILITY IDEOGRAPH-2F93E*/
+ RTUNI_ALPHA, /* U+02f93f: CJK COMPATIBILITY IDEOGRAPH-2F93F*/
+ RTUNI_ALPHA, /* U+02f940: CJK COMPATIBILITY IDEOGRAPH-2F940*/
+ RTUNI_ALPHA, /* U+02f941: CJK COMPATIBILITY IDEOGRAPH-2F941*/
+ RTUNI_ALPHA, /* U+02f942: CJK COMPATIBILITY IDEOGRAPH-2F942*/
+ RTUNI_ALPHA, /* U+02f943: CJK COMPATIBILITY IDEOGRAPH-2F943*/
+ RTUNI_ALPHA, /* U+02f944: CJK COMPATIBILITY IDEOGRAPH-2F944*/
+ RTUNI_ALPHA, /* U+02f945: CJK COMPATIBILITY IDEOGRAPH-2F945*/
+ RTUNI_ALPHA, /* U+02f946: CJK COMPATIBILITY IDEOGRAPH-2F946*/
+ RTUNI_ALPHA, /* U+02f947: CJK COMPATIBILITY IDEOGRAPH-2F947*/
+ RTUNI_ALPHA, /* U+02f948: CJK COMPATIBILITY IDEOGRAPH-2F948*/
+ RTUNI_ALPHA, /* U+02f949: CJK COMPATIBILITY IDEOGRAPH-2F949*/
+ RTUNI_ALPHA, /* U+02f94a: CJK COMPATIBILITY IDEOGRAPH-2F94A*/
+ RTUNI_ALPHA, /* U+02f94b: CJK COMPATIBILITY IDEOGRAPH-2F94B*/
+ RTUNI_ALPHA, /* U+02f94c: CJK COMPATIBILITY IDEOGRAPH-2F94C*/
+ RTUNI_ALPHA, /* U+02f94d: CJK COMPATIBILITY IDEOGRAPH-2F94D*/
+ RTUNI_ALPHA, /* U+02f94e: CJK COMPATIBILITY IDEOGRAPH-2F94E*/
+ RTUNI_ALPHA, /* U+02f94f: CJK COMPATIBILITY IDEOGRAPH-2F94F*/
+ RTUNI_ALPHA, /* U+02f950: CJK COMPATIBILITY IDEOGRAPH-2F950*/
+ RTUNI_ALPHA, /* U+02f951: CJK COMPATIBILITY IDEOGRAPH-2F951*/
+ RTUNI_ALPHA, /* U+02f952: CJK COMPATIBILITY IDEOGRAPH-2F952*/
+ RTUNI_ALPHA, /* U+02f953: CJK COMPATIBILITY IDEOGRAPH-2F953*/
+ RTUNI_ALPHA, /* U+02f954: CJK COMPATIBILITY IDEOGRAPH-2F954*/
+ RTUNI_ALPHA, /* U+02f955: CJK COMPATIBILITY IDEOGRAPH-2F955*/
+ RTUNI_ALPHA, /* U+02f956: CJK COMPATIBILITY IDEOGRAPH-2F956*/
+ RTUNI_ALPHA, /* U+02f957: CJK COMPATIBILITY IDEOGRAPH-2F957*/
+ RTUNI_ALPHA, /* U+02f958: CJK COMPATIBILITY IDEOGRAPH-2F958*/
+ RTUNI_ALPHA, /* U+02f959: CJK COMPATIBILITY IDEOGRAPH-2F959*/
+ RTUNI_ALPHA, /* U+02f95a: CJK COMPATIBILITY IDEOGRAPH-2F95A*/
+ RTUNI_ALPHA, /* U+02f95b: CJK COMPATIBILITY IDEOGRAPH-2F95B*/
+ RTUNI_ALPHA, /* U+02f95c: CJK COMPATIBILITY IDEOGRAPH-2F95C*/
+ RTUNI_ALPHA, /* U+02f95d: CJK COMPATIBILITY IDEOGRAPH-2F95D*/
+ RTUNI_ALPHA, /* U+02f95e: CJK COMPATIBILITY IDEOGRAPH-2F95E*/
+ RTUNI_ALPHA, /* U+02f95f: CJK COMPATIBILITY IDEOGRAPH-2F95F*/
+ RTUNI_ALPHA, /* U+02f960: CJK COMPATIBILITY IDEOGRAPH-2F960*/
+ RTUNI_ALPHA, /* U+02f961: CJK COMPATIBILITY IDEOGRAPH-2F961*/
+ RTUNI_ALPHA, /* U+02f962: CJK COMPATIBILITY IDEOGRAPH-2F962*/
+ RTUNI_ALPHA, /* U+02f963: CJK COMPATIBILITY IDEOGRAPH-2F963*/
+ RTUNI_ALPHA, /* U+02f964: CJK COMPATIBILITY IDEOGRAPH-2F964*/
+ RTUNI_ALPHA, /* U+02f965: CJK COMPATIBILITY IDEOGRAPH-2F965*/
+ RTUNI_ALPHA, /* U+02f966: CJK COMPATIBILITY IDEOGRAPH-2F966*/
+ RTUNI_ALPHA, /* U+02f967: CJK COMPATIBILITY IDEOGRAPH-2F967*/
+ RTUNI_ALPHA, /* U+02f968: CJK COMPATIBILITY IDEOGRAPH-2F968*/
+ RTUNI_ALPHA, /* U+02f969: CJK COMPATIBILITY IDEOGRAPH-2F969*/
+ RTUNI_ALPHA, /* U+02f96a: CJK COMPATIBILITY IDEOGRAPH-2F96A*/
+ RTUNI_ALPHA, /* U+02f96b: CJK COMPATIBILITY IDEOGRAPH-2F96B*/
+ RTUNI_ALPHA, /* U+02f96c: CJK COMPATIBILITY IDEOGRAPH-2F96C*/
+ RTUNI_ALPHA, /* U+02f96d: CJK COMPATIBILITY IDEOGRAPH-2F96D*/
+ RTUNI_ALPHA, /* U+02f96e: CJK COMPATIBILITY IDEOGRAPH-2F96E*/
+ RTUNI_ALPHA, /* U+02f96f: CJK COMPATIBILITY IDEOGRAPH-2F96F*/
+ RTUNI_ALPHA, /* U+02f970: CJK COMPATIBILITY IDEOGRAPH-2F970*/
+ RTUNI_ALPHA, /* U+02f971: CJK COMPATIBILITY IDEOGRAPH-2F971*/
+ RTUNI_ALPHA, /* U+02f972: CJK COMPATIBILITY IDEOGRAPH-2F972*/
+ RTUNI_ALPHA, /* U+02f973: CJK COMPATIBILITY IDEOGRAPH-2F973*/
+ RTUNI_ALPHA, /* U+02f974: CJK COMPATIBILITY IDEOGRAPH-2F974*/
+ RTUNI_ALPHA, /* U+02f975: CJK COMPATIBILITY IDEOGRAPH-2F975*/
+ RTUNI_ALPHA, /* U+02f976: CJK COMPATIBILITY IDEOGRAPH-2F976*/
+ RTUNI_ALPHA, /* U+02f977: CJK COMPATIBILITY IDEOGRAPH-2F977*/
+ RTUNI_ALPHA, /* U+02f978: CJK COMPATIBILITY IDEOGRAPH-2F978*/
+ RTUNI_ALPHA, /* U+02f979: CJK COMPATIBILITY IDEOGRAPH-2F979*/
+ RTUNI_ALPHA, /* U+02f97a: CJK COMPATIBILITY IDEOGRAPH-2F97A*/
+ RTUNI_ALPHA, /* U+02f97b: CJK COMPATIBILITY IDEOGRAPH-2F97B*/
+ RTUNI_ALPHA, /* U+02f97c: CJK COMPATIBILITY IDEOGRAPH-2F97C*/
+ RTUNI_ALPHA, /* U+02f97d: CJK COMPATIBILITY IDEOGRAPH-2F97D*/
+ RTUNI_ALPHA, /* U+02f97e: CJK COMPATIBILITY IDEOGRAPH-2F97E*/
+ RTUNI_ALPHA, /* U+02f97f: CJK COMPATIBILITY IDEOGRAPH-2F97F*/
+ RTUNI_ALPHA, /* U+02f980: CJK COMPATIBILITY IDEOGRAPH-2F980*/
+ RTUNI_ALPHA, /* U+02f981: CJK COMPATIBILITY IDEOGRAPH-2F981*/
+ RTUNI_ALPHA, /* U+02f982: CJK COMPATIBILITY IDEOGRAPH-2F982*/
+ RTUNI_ALPHA, /* U+02f983: CJK COMPATIBILITY IDEOGRAPH-2F983*/
+ RTUNI_ALPHA, /* U+02f984: CJK COMPATIBILITY IDEOGRAPH-2F984*/
+ RTUNI_ALPHA, /* U+02f985: CJK COMPATIBILITY IDEOGRAPH-2F985*/
+ RTUNI_ALPHA, /* U+02f986: CJK COMPATIBILITY IDEOGRAPH-2F986*/
+ RTUNI_ALPHA, /* U+02f987: CJK COMPATIBILITY IDEOGRAPH-2F987*/
+ RTUNI_ALPHA, /* U+02f988: CJK COMPATIBILITY IDEOGRAPH-2F988*/
+ RTUNI_ALPHA, /* U+02f989: CJK COMPATIBILITY IDEOGRAPH-2F989*/
+ RTUNI_ALPHA, /* U+02f98a: CJK COMPATIBILITY IDEOGRAPH-2F98A*/
+ RTUNI_ALPHA, /* U+02f98b: CJK COMPATIBILITY IDEOGRAPH-2F98B*/
+ RTUNI_ALPHA, /* U+02f98c: CJK COMPATIBILITY IDEOGRAPH-2F98C*/
+ RTUNI_ALPHA, /* U+02f98d: CJK COMPATIBILITY IDEOGRAPH-2F98D*/
+ RTUNI_ALPHA, /* U+02f98e: CJK COMPATIBILITY IDEOGRAPH-2F98E*/
+ RTUNI_ALPHA, /* U+02f98f: CJK COMPATIBILITY IDEOGRAPH-2F98F*/
+ RTUNI_ALPHA, /* U+02f990: CJK COMPATIBILITY IDEOGRAPH-2F990*/
+ RTUNI_ALPHA, /* U+02f991: CJK COMPATIBILITY IDEOGRAPH-2F991*/
+ RTUNI_ALPHA, /* U+02f992: CJK COMPATIBILITY IDEOGRAPH-2F992*/
+ RTUNI_ALPHA, /* U+02f993: CJK COMPATIBILITY IDEOGRAPH-2F993*/
+ RTUNI_ALPHA, /* U+02f994: CJK COMPATIBILITY IDEOGRAPH-2F994*/
+ RTUNI_ALPHA, /* U+02f995: CJK COMPATIBILITY IDEOGRAPH-2F995*/
+ RTUNI_ALPHA, /* U+02f996: CJK COMPATIBILITY IDEOGRAPH-2F996*/
+ RTUNI_ALPHA, /* U+02f997: CJK COMPATIBILITY IDEOGRAPH-2F997*/
+ RTUNI_ALPHA, /* U+02f998: CJK COMPATIBILITY IDEOGRAPH-2F998*/
+ RTUNI_ALPHA, /* U+02f999: CJK COMPATIBILITY IDEOGRAPH-2F999*/
+ RTUNI_ALPHA, /* U+02f99a: CJK COMPATIBILITY IDEOGRAPH-2F99A*/
+ RTUNI_ALPHA, /* U+02f99b: CJK COMPATIBILITY IDEOGRAPH-2F99B*/
+ RTUNI_ALPHA, /* U+02f99c: CJK COMPATIBILITY IDEOGRAPH-2F99C*/
+ RTUNI_ALPHA, /* U+02f99d: CJK COMPATIBILITY IDEOGRAPH-2F99D*/
+ RTUNI_ALPHA, /* U+02f99e: CJK COMPATIBILITY IDEOGRAPH-2F99E*/
+ RTUNI_ALPHA, /* U+02f99f: CJK COMPATIBILITY IDEOGRAPH-2F99F*/
+ RTUNI_ALPHA, /* U+02f9a0: CJK COMPATIBILITY IDEOGRAPH-2F9A0*/
+ RTUNI_ALPHA, /* U+02f9a1: CJK COMPATIBILITY IDEOGRAPH-2F9A1*/
+ RTUNI_ALPHA, /* U+02f9a2: CJK COMPATIBILITY IDEOGRAPH-2F9A2*/
+ RTUNI_ALPHA, /* U+02f9a3: CJK COMPATIBILITY IDEOGRAPH-2F9A3*/
+ RTUNI_ALPHA, /* U+02f9a4: CJK COMPATIBILITY IDEOGRAPH-2F9A4*/
+ RTUNI_ALPHA, /* U+02f9a5: CJK COMPATIBILITY IDEOGRAPH-2F9A5*/
+ RTUNI_ALPHA, /* U+02f9a6: CJK COMPATIBILITY IDEOGRAPH-2F9A6*/
+ RTUNI_ALPHA, /* U+02f9a7: CJK COMPATIBILITY IDEOGRAPH-2F9A7*/
+ RTUNI_ALPHA, /* U+02f9a8: CJK COMPATIBILITY IDEOGRAPH-2F9A8*/
+ RTUNI_ALPHA, /* U+02f9a9: CJK COMPATIBILITY IDEOGRAPH-2F9A9*/
+ RTUNI_ALPHA, /* U+02f9aa: CJK COMPATIBILITY IDEOGRAPH-2F9AA*/
+ RTUNI_ALPHA, /* U+02f9ab: CJK COMPATIBILITY IDEOGRAPH-2F9AB*/
+ RTUNI_ALPHA, /* U+02f9ac: CJK COMPATIBILITY IDEOGRAPH-2F9AC*/
+ RTUNI_ALPHA, /* U+02f9ad: CJK COMPATIBILITY IDEOGRAPH-2F9AD*/
+ RTUNI_ALPHA, /* U+02f9ae: CJK COMPATIBILITY IDEOGRAPH-2F9AE*/
+ RTUNI_ALPHA, /* U+02f9af: CJK COMPATIBILITY IDEOGRAPH-2F9AF*/
+ RTUNI_ALPHA, /* U+02f9b0: CJK COMPATIBILITY IDEOGRAPH-2F9B0*/
+ RTUNI_ALPHA, /* U+02f9b1: CJK COMPATIBILITY IDEOGRAPH-2F9B1*/
+ RTUNI_ALPHA, /* U+02f9b2: CJK COMPATIBILITY IDEOGRAPH-2F9B2*/
+ RTUNI_ALPHA, /* U+02f9b3: CJK COMPATIBILITY IDEOGRAPH-2F9B3*/
+ RTUNI_ALPHA, /* U+02f9b4: CJK COMPATIBILITY IDEOGRAPH-2F9B4*/
+ RTUNI_ALPHA, /* U+02f9b5: CJK COMPATIBILITY IDEOGRAPH-2F9B5*/
+ RTUNI_ALPHA, /* U+02f9b6: CJK COMPATIBILITY IDEOGRAPH-2F9B6*/
+ RTUNI_ALPHA, /* U+02f9b7: CJK COMPATIBILITY IDEOGRAPH-2F9B7*/
+ RTUNI_ALPHA, /* U+02f9b8: CJK COMPATIBILITY IDEOGRAPH-2F9B8*/
+ RTUNI_ALPHA, /* U+02f9b9: CJK COMPATIBILITY IDEOGRAPH-2F9B9*/
+ RTUNI_ALPHA, /* U+02f9ba: CJK COMPATIBILITY IDEOGRAPH-2F9BA*/
+ RTUNI_ALPHA, /* U+02f9bb: CJK COMPATIBILITY IDEOGRAPH-2F9BB*/
+ RTUNI_ALPHA, /* U+02f9bc: CJK COMPATIBILITY IDEOGRAPH-2F9BC*/
+ RTUNI_ALPHA, /* U+02f9bd: CJK COMPATIBILITY IDEOGRAPH-2F9BD*/
+ RTUNI_ALPHA, /* U+02f9be: CJK COMPATIBILITY IDEOGRAPH-2F9BE*/
+ RTUNI_ALPHA, /* U+02f9bf: CJK COMPATIBILITY IDEOGRAPH-2F9BF*/
+ RTUNI_ALPHA, /* U+02f9c0: CJK COMPATIBILITY IDEOGRAPH-2F9C0*/
+ RTUNI_ALPHA, /* U+02f9c1: CJK COMPATIBILITY IDEOGRAPH-2F9C1*/
+ RTUNI_ALPHA, /* U+02f9c2: CJK COMPATIBILITY IDEOGRAPH-2F9C2*/
+ RTUNI_ALPHA, /* U+02f9c3: CJK COMPATIBILITY IDEOGRAPH-2F9C3*/
+ RTUNI_ALPHA, /* U+02f9c4: CJK COMPATIBILITY IDEOGRAPH-2F9C4*/
+ RTUNI_ALPHA, /* U+02f9c5: CJK COMPATIBILITY IDEOGRAPH-2F9C5*/
+ RTUNI_ALPHA, /* U+02f9c6: CJK COMPATIBILITY IDEOGRAPH-2F9C6*/
+ RTUNI_ALPHA, /* U+02f9c7: CJK COMPATIBILITY IDEOGRAPH-2F9C7*/
+ RTUNI_ALPHA, /* U+02f9c8: CJK COMPATIBILITY IDEOGRAPH-2F9C8*/
+ RTUNI_ALPHA, /* U+02f9c9: CJK COMPATIBILITY IDEOGRAPH-2F9C9*/
+ RTUNI_ALPHA, /* U+02f9ca: CJK COMPATIBILITY IDEOGRAPH-2F9CA*/
+ RTUNI_ALPHA, /* U+02f9cb: CJK COMPATIBILITY IDEOGRAPH-2F9CB*/
+ RTUNI_ALPHA, /* U+02f9cc: CJK COMPATIBILITY IDEOGRAPH-2F9CC*/
+ RTUNI_ALPHA, /* U+02f9cd: CJK COMPATIBILITY IDEOGRAPH-2F9CD*/
+ RTUNI_ALPHA, /* U+02f9ce: CJK COMPATIBILITY IDEOGRAPH-2F9CE*/
+ RTUNI_ALPHA, /* U+02f9cf: CJK COMPATIBILITY IDEOGRAPH-2F9CF*/
+ RTUNI_ALPHA, /* U+02f9d0: CJK COMPATIBILITY IDEOGRAPH-2F9D0*/
+ RTUNI_ALPHA, /* U+02f9d1: CJK COMPATIBILITY IDEOGRAPH-2F9D1*/
+ RTUNI_ALPHA, /* U+02f9d2: CJK COMPATIBILITY IDEOGRAPH-2F9D2*/
+ RTUNI_ALPHA, /* U+02f9d3: CJK COMPATIBILITY IDEOGRAPH-2F9D3*/
+ RTUNI_ALPHA, /* U+02f9d4: CJK COMPATIBILITY IDEOGRAPH-2F9D4*/
+ RTUNI_ALPHA, /* U+02f9d5: CJK COMPATIBILITY IDEOGRAPH-2F9D5*/
+ RTUNI_ALPHA, /* U+02f9d6: CJK COMPATIBILITY IDEOGRAPH-2F9D6*/
+ RTUNI_ALPHA, /* U+02f9d7: CJK COMPATIBILITY IDEOGRAPH-2F9D7*/
+ RTUNI_ALPHA, /* U+02f9d8: CJK COMPATIBILITY IDEOGRAPH-2F9D8*/
+ RTUNI_ALPHA, /* U+02f9d9: CJK COMPATIBILITY IDEOGRAPH-2F9D9*/
+ RTUNI_ALPHA, /* U+02f9da: CJK COMPATIBILITY IDEOGRAPH-2F9DA*/
+ RTUNI_ALPHA, /* U+02f9db: CJK COMPATIBILITY IDEOGRAPH-2F9DB*/
+ RTUNI_ALPHA, /* U+02f9dc: CJK COMPATIBILITY IDEOGRAPH-2F9DC*/
+ RTUNI_ALPHA, /* U+02f9dd: CJK COMPATIBILITY IDEOGRAPH-2F9DD*/
+ RTUNI_ALPHA, /* U+02f9de: CJK COMPATIBILITY IDEOGRAPH-2F9DE*/
+ RTUNI_ALPHA, /* U+02f9df: CJK COMPATIBILITY IDEOGRAPH-2F9DF*/
+ RTUNI_ALPHA, /* U+02f9e0: CJK COMPATIBILITY IDEOGRAPH-2F9E0*/
+ RTUNI_ALPHA, /* U+02f9e1: CJK COMPATIBILITY IDEOGRAPH-2F9E1*/
+ RTUNI_ALPHA, /* U+02f9e2: CJK COMPATIBILITY IDEOGRAPH-2F9E2*/
+ RTUNI_ALPHA, /* U+02f9e3: CJK COMPATIBILITY IDEOGRAPH-2F9E3*/
+ RTUNI_ALPHA, /* U+02f9e4: CJK COMPATIBILITY IDEOGRAPH-2F9E4*/
+ RTUNI_ALPHA, /* U+02f9e5: CJK COMPATIBILITY IDEOGRAPH-2F9E5*/
+ RTUNI_ALPHA, /* U+02f9e6: CJK COMPATIBILITY IDEOGRAPH-2F9E6*/
+ RTUNI_ALPHA, /* U+02f9e7: CJK COMPATIBILITY IDEOGRAPH-2F9E7*/
+ RTUNI_ALPHA, /* U+02f9e8: CJK COMPATIBILITY IDEOGRAPH-2F9E8*/
+ RTUNI_ALPHA, /* U+02f9e9: CJK COMPATIBILITY IDEOGRAPH-2F9E9*/
+ RTUNI_ALPHA, /* U+02f9ea: CJK COMPATIBILITY IDEOGRAPH-2F9EA*/
+ RTUNI_ALPHA, /* U+02f9eb: CJK COMPATIBILITY IDEOGRAPH-2F9EB*/
+ RTUNI_ALPHA, /* U+02f9ec: CJK COMPATIBILITY IDEOGRAPH-2F9EC*/
+ RTUNI_ALPHA, /* U+02f9ed: CJK COMPATIBILITY IDEOGRAPH-2F9ED*/
+ RTUNI_ALPHA, /* U+02f9ee: CJK COMPATIBILITY IDEOGRAPH-2F9EE*/
+ RTUNI_ALPHA, /* U+02f9ef: CJK COMPATIBILITY IDEOGRAPH-2F9EF*/
+ RTUNI_ALPHA, /* U+02f9f0: CJK COMPATIBILITY IDEOGRAPH-2F9F0*/
+ RTUNI_ALPHA, /* U+02f9f1: CJK COMPATIBILITY IDEOGRAPH-2F9F1*/
+ RTUNI_ALPHA, /* U+02f9f2: CJK COMPATIBILITY IDEOGRAPH-2F9F2*/
+ RTUNI_ALPHA, /* U+02f9f3: CJK COMPATIBILITY IDEOGRAPH-2F9F3*/
+ RTUNI_ALPHA, /* U+02f9f4: CJK COMPATIBILITY IDEOGRAPH-2F9F4*/
+ RTUNI_ALPHA, /* U+02f9f5: CJK COMPATIBILITY IDEOGRAPH-2F9F5*/
+ RTUNI_ALPHA, /* U+02f9f6: CJK COMPATIBILITY IDEOGRAPH-2F9F6*/
+ RTUNI_ALPHA, /* U+02f9f7: CJK COMPATIBILITY IDEOGRAPH-2F9F7*/
+ RTUNI_ALPHA, /* U+02f9f8: CJK COMPATIBILITY IDEOGRAPH-2F9F8*/
+ RTUNI_ALPHA, /* U+02f9f9: CJK COMPATIBILITY IDEOGRAPH-2F9F9*/
+ RTUNI_ALPHA, /* U+02f9fa: CJK COMPATIBILITY IDEOGRAPH-2F9FA*/
+ RTUNI_ALPHA, /* U+02f9fb: CJK COMPATIBILITY IDEOGRAPH-2F9FB*/
+ RTUNI_ALPHA, /* U+02f9fc: CJK COMPATIBILITY IDEOGRAPH-2F9FC*/
+ RTUNI_ALPHA, /* U+02f9fd: CJK COMPATIBILITY IDEOGRAPH-2F9FD*/
+ RTUNI_ALPHA, /* U+02f9fe: CJK COMPATIBILITY IDEOGRAPH-2F9FE*/
+ RTUNI_ALPHA, /* U+02f9ff: CJK COMPATIBILITY IDEOGRAPH-2F9FF*/
+ RTUNI_ALPHA, /* U+02fa00: CJK COMPATIBILITY IDEOGRAPH-2FA00*/
+ RTUNI_ALPHA, /* U+02fa01: CJK COMPATIBILITY IDEOGRAPH-2FA01*/
+ RTUNI_ALPHA, /* U+02fa02: CJK COMPATIBILITY IDEOGRAPH-2FA02*/
+ RTUNI_ALPHA, /* U+02fa03: CJK COMPATIBILITY IDEOGRAPH-2FA03*/
+ RTUNI_ALPHA, /* U+02fa04: CJK COMPATIBILITY IDEOGRAPH-2FA04*/
+ RTUNI_ALPHA, /* U+02fa05: CJK COMPATIBILITY IDEOGRAPH-2FA05*/
+ RTUNI_ALPHA, /* U+02fa06: CJK COMPATIBILITY IDEOGRAPH-2FA06*/
+ RTUNI_ALPHA, /* U+02fa07: CJK COMPATIBILITY IDEOGRAPH-2FA07*/
+ RTUNI_ALPHA, /* U+02fa08: CJK COMPATIBILITY IDEOGRAPH-2FA08*/
+ RTUNI_ALPHA, /* U+02fa09: CJK COMPATIBILITY IDEOGRAPH-2FA09*/
+ RTUNI_ALPHA, /* U+02fa0a: CJK COMPATIBILITY IDEOGRAPH-2FA0A*/
+ RTUNI_ALPHA, /* U+02fa0b: CJK COMPATIBILITY IDEOGRAPH-2FA0B*/
+ RTUNI_ALPHA, /* U+02fa0c: CJK COMPATIBILITY IDEOGRAPH-2FA0C*/
+ RTUNI_ALPHA, /* U+02fa0d: CJK COMPATIBILITY IDEOGRAPH-2FA0D*/
+ RTUNI_ALPHA, /* U+02fa0e: CJK COMPATIBILITY IDEOGRAPH-2FA0E*/
+ RTUNI_ALPHA, /* U+02fa0f: CJK COMPATIBILITY IDEOGRAPH-2FA0F*/
+ RTUNI_ALPHA, /* U+02fa10: CJK COMPATIBILITY IDEOGRAPH-2FA10*/
+ RTUNI_ALPHA, /* U+02fa11: CJK COMPATIBILITY IDEOGRAPH-2FA11*/
+ RTUNI_ALPHA, /* U+02fa12: CJK COMPATIBILITY IDEOGRAPH-2FA12*/
+ RTUNI_ALPHA, /* U+02fa13: CJK COMPATIBILITY IDEOGRAPH-2FA13*/
+ RTUNI_ALPHA, /* U+02fa14: CJK COMPATIBILITY IDEOGRAPH-2FA14*/
+ RTUNI_ALPHA, /* U+02fa15: CJK COMPATIBILITY IDEOGRAPH-2FA15*/
+ RTUNI_ALPHA, /* U+02fa16: CJK COMPATIBILITY IDEOGRAPH-2FA16*/
+ RTUNI_ALPHA, /* U+02fa17: CJK COMPATIBILITY IDEOGRAPH-2FA17*/
+ RTUNI_ALPHA, /* U+02fa18: CJK COMPATIBILITY IDEOGRAPH-2FA18*/
+ RTUNI_ALPHA, /* U+02fa19: CJK COMPATIBILITY IDEOGRAPH-2FA19*/
+ RTUNI_ALPHA, /* U+02fa1a: CJK COMPATIBILITY IDEOGRAPH-2FA1A*/
+ RTUNI_ALPHA, /* U+02fa1b: CJK COMPATIBILITY IDEOGRAPH-2FA1B*/
+ RTUNI_ALPHA, /* U+02fa1c: CJK COMPATIBILITY IDEOGRAPH-2FA1C*/
+ RTUNI_ALPHA, /* U+02fa1d: CJK COMPATIBILITY IDEOGRAPH-2FA1D*/
+};
+
+
+RT_DECL_DATA_CONST(const RTUNIFLAGSRANGE) g_aRTUniFlagsRanges[] =
+{
+ { 0x000000, 0x003401, &g_afRTUniFlags0x000000[0] },
+ { 0x004db5, 0x004e01, &g_afRTUniFlags0x004db5[0] },
+ { 0x009fcc, 0x00d7fc, &g_afRTUniFlags0x009fcc[0] },
+ { 0x00f900, 0x01342f, &g_afRTUniFlags0x00f900[0] },
+ { 0x016800, 0x016fa0, &g_afRTUniFlags0x016800[0] },
+ { 0x01b000, 0x01b002, &g_afRTUniFlags0x01b000[0] },
+ { 0x01d400, 0x01d800, &g_afRTUniFlags0x01d400[0] },
+ { 0x01ee00, 0x01eebc, &g_afRTUniFlags0x01ee00[0] },
+ { 0x020000, 0x020001, &g_afRTUniFlags0x020000[0] },
+ { 0x02a6d6, 0x02a701, &g_afRTUniFlags0x02a6d6[0] },
+ { 0x02b734, 0x02b81e, &g_afRTUniFlags0x02b734[0] },
+ { 0x02f800, 0x02fa1e, &g_afRTUniFlags0x02f800[0] },
+ { ~(RTUNICP)0, ~(RTUNICP)0, NULL }
+};
+
+
diff --git a/src/VBox/Runtime/common/string/unidata-lower.cpp b/src/VBox/Runtime/common/string/unidata-lower.cpp
new file mode 100644
index 00000000000..1d8b6185fbd
--- /dev/null
+++ b/src/VBox/Runtime/common/string/unidata-lower.cpp
@@ -0,0 +1,3902 @@
+/* $Id$ */
+/** @file
+ * IPRT - Unicode Tables.
+ *
+ * Automatically Generated from d:\src\unicode\6.3.0\
+ * by ..\..\..\..\..\out\win.amd64\debug\obj\uniread\uniread.exe (May 22 2014 19:07:40)
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+#include <iprt/uni.h>
+
+static const RTUNICP g_afRTUniLower0x000000[] =
+{
+ 0x00, /* U+000000: <control>*/
+ 0x01, /* U+000001: <control>*/
+ 0x02, /* U+000002: <control>*/
+ 0x03, /* U+000003: <control>*/
+ 0x04, /* U+000004: <control>*/
+ 0x05, /* U+000005: <control>*/
+ 0x06, /* U+000006: <control>*/
+ 0x07, /* U+000007: <control>*/
+ 0x08, /* U+000008: <control>*/
+ 0x09, /* U+000009: <control>*/
+ 0x0a, /* U+00000a: <control>*/
+ 0x0b, /* U+00000b: <control>*/
+ 0x0c, /* U+00000c: <control>*/
+ 0x0d, /* U+00000d: <control>*/
+ 0x0e, /* U+00000e: <control>*/
+ 0x0f, /* U+00000f: <control>*/
+ 0x10, /* U+000010: <control>*/
+ 0x11, /* U+000011: <control>*/
+ 0x12, /* U+000012: <control>*/
+ 0x13, /* U+000013: <control>*/
+ 0x14, /* U+000014: <control>*/
+ 0x15, /* U+000015: <control>*/
+ 0x16, /* U+000016: <control>*/
+ 0x17, /* U+000017: <control>*/
+ 0x18, /* U+000018: <control>*/
+ 0x19, /* U+000019: <control>*/
+ 0x1a, /* U+00001a: <control>*/
+ 0x1b, /* U+00001b: <control>*/
+ 0x1c, /* U+00001c: <control>*/
+ 0x1d, /* U+00001d: <control>*/
+ 0x1e, /* U+00001e: <control>*/
+ 0x1f, /* U+00001f: <control>*/
+ 0x20, /* U+000020: SPACE*/
+ 0x21, /* U+000021: EXCLAMATION MARK*/
+ 0x22, /* U+000022: QUOTATION MARK*/
+ 0x23, /* U+000023: NUMBER SIGN*/
+ 0x24, /* U+000024: DOLLAR SIGN*/
+ 0x25, /* U+000025: PERCENT SIGN*/
+ 0x26, /* U+000026: AMPERSAND*/
+ 0x27, /* U+000027: APOSTROPHE*/
+ 0x28, /* U+000028: LEFT PARENTHESIS*/
+ 0x29, /* U+000029: RIGHT PARENTHESIS*/
+ 0x2a, /* U+00002a: ASTERISK*/
+ 0x2b, /* U+00002b: PLUS SIGN*/
+ 0x2c, /* U+00002c: COMMA*/
+ 0x2d, /* U+00002d: HYPHEN-MINUS*/
+ 0x2e, /* U+00002e: FULL STOP*/
+ 0x2f, /* U+00002f: SOLIDUS*/
+ 0x30, /* U+000030: DIGIT ZERO*/
+ 0x31, /* U+000031: DIGIT ONE*/
+ 0x32, /* U+000032: DIGIT TWO*/
+ 0x33, /* U+000033: DIGIT THREE*/
+ 0x34, /* U+000034: DIGIT FOUR*/
+ 0x35, /* U+000035: DIGIT FIVE*/
+ 0x36, /* U+000036: DIGIT SIX*/
+ 0x37, /* U+000037: DIGIT SEVEN*/
+ 0x38, /* U+000038: DIGIT EIGHT*/
+ 0x39, /* U+000039: DIGIT NINE*/
+ 0x3a, /* U+00003a: COLON*/
+ 0x3b, /* U+00003b: SEMICOLON*/
+ 0x3c, /* U+00003c: LESS-THAN SIGN*/
+ 0x3d, /* U+00003d: EQUALS SIGN*/
+ 0x3e, /* U+00003e: GREATER-THAN SIGN*/
+ 0x3f, /* U+00003f: QUESTION MARK*/
+ 0x40, /* U+000040: COMMERCIAL AT*/
+ 0x61, /* U+000041: LATIN CAPITAL LETTER A*/
+ 0x62, /* U+000042: LATIN CAPITAL LETTER B*/
+ 0x63, /* U+000043: LATIN CAPITAL LETTER C*/
+ 0x64, /* U+000044: LATIN CAPITAL LETTER D*/
+ 0x65, /* U+000045: LATIN CAPITAL LETTER E*/
+ 0x66, /* U+000046: LATIN CAPITAL LETTER F*/
+ 0x67, /* U+000047: LATIN CAPITAL LETTER G*/
+ 0x68, /* U+000048: LATIN CAPITAL LETTER H*/
+ 0x69, /* U+000049: LATIN CAPITAL LETTER I*/
+ 0x6a, /* U+00004a: LATIN CAPITAL LETTER J*/
+ 0x6b, /* U+00004b: LATIN CAPITAL LETTER K*/
+ 0x6c, /* U+00004c: LATIN CAPITAL LETTER L*/
+ 0x6d, /* U+00004d: LATIN CAPITAL LETTER M*/
+ 0x6e, /* U+00004e: LATIN CAPITAL LETTER N*/
+ 0x6f, /* U+00004f: LATIN CAPITAL LETTER O*/
+ 0x70, /* U+000050: LATIN CAPITAL LETTER P*/
+ 0x71, /* U+000051: LATIN CAPITAL LETTER Q*/
+ 0x72, /* U+000052: LATIN CAPITAL LETTER R*/
+ 0x73, /* U+000053: LATIN CAPITAL LETTER S*/
+ 0x74, /* U+000054: LATIN CAPITAL LETTER T*/
+ 0x75, /* U+000055: LATIN CAPITAL LETTER U*/
+ 0x76, /* U+000056: LATIN CAPITAL LETTER V*/
+ 0x77, /* U+000057: LATIN CAPITAL LETTER W*/
+ 0x78, /* U+000058: LATIN CAPITAL LETTER X*/
+ 0x79, /* U+000059: LATIN CAPITAL LETTER Y*/
+ 0x7a, /* U+00005a: LATIN CAPITAL LETTER Z*/
+ 0x5b, /* U+00005b: LEFT SQUARE BRACKET*/
+ 0x5c, /* U+00005c: REVERSE SOLIDUS*/
+ 0x5d, /* U+00005d: RIGHT SQUARE BRACKET*/
+ 0x5e, /* U+00005e: CIRCUMFLEX ACCENT*/
+ 0x5f, /* U+00005f: LOW LINE*/
+ 0x60, /* U+000060: GRAVE ACCENT*/
+ 0x61, /* U+000061: LATIN SMALL LETTER A*/
+ 0x62, /* U+000062: LATIN SMALL LETTER B*/
+ 0x63, /* U+000063: LATIN SMALL LETTER C*/
+ 0x64, /* U+000064: LATIN SMALL LETTER D*/
+ 0x65, /* U+000065: LATIN SMALL LETTER E*/
+ 0x66, /* U+000066: LATIN SMALL LETTER F*/
+ 0x67, /* U+000067: LATIN SMALL LETTER G*/
+ 0x68, /* U+000068: LATIN SMALL LETTER H*/
+ 0x69, /* U+000069: LATIN SMALL LETTER I*/
+ 0x6a, /* U+00006a: LATIN SMALL LETTER J*/
+ 0x6b, /* U+00006b: LATIN SMALL LETTER K*/
+ 0x6c, /* U+00006c: LATIN SMALL LETTER L*/
+ 0x6d, /* U+00006d: LATIN SMALL LETTER M*/
+ 0x6e, /* U+00006e: LATIN SMALL LETTER N*/
+ 0x6f, /* U+00006f: LATIN SMALL LETTER O*/
+ 0x70, /* U+000070: LATIN SMALL LETTER P*/
+ 0x71, /* U+000071: LATIN SMALL LETTER Q*/
+ 0x72, /* U+000072: LATIN SMALL LETTER R*/
+ 0x73, /* U+000073: LATIN SMALL LETTER S*/
+ 0x74, /* U+000074: LATIN SMALL LETTER T*/
+ 0x75, /* U+000075: LATIN SMALL LETTER U*/
+ 0x76, /* U+000076: LATIN SMALL LETTER V*/
+ 0x77, /* U+000077: LATIN SMALL LETTER W*/
+ 0x78, /* U+000078: LATIN SMALL LETTER X*/
+ 0x79, /* U+000079: LATIN SMALL LETTER Y*/
+ 0x7a, /* U+00007a: LATIN SMALL LETTER Z*/
+ 0x7b, /* U+00007b: LEFT CURLY BRACKET*/
+ 0x7c, /* U+00007c: VERTICAL LINE*/
+ 0x7d, /* U+00007d: RIGHT CURLY BRACKET*/
+ 0x7e, /* U+00007e: TILDE*/
+ 0x7f, /* U+00007f: <control>*/
+ 0x80, /* U+000080: <control>*/
+ 0x81, /* U+000081: <control>*/
+ 0x82, /* U+000082: <control>*/
+ 0x83, /* U+000083: <control>*/
+ 0x84, /* U+000084: <control>*/
+ 0x85, /* U+000085: <control>*/
+ 0x86, /* U+000086: <control>*/
+ 0x87, /* U+000087: <control>*/
+ 0x88, /* U+000088: <control>*/
+ 0x89, /* U+000089: <control>*/
+ 0x8a, /* U+00008a: <control>*/
+ 0x8b, /* U+00008b: <control>*/
+ 0x8c, /* U+00008c: <control>*/
+ 0x8d, /* U+00008d: <control>*/
+ 0x8e, /* U+00008e: <control>*/
+ 0x8f, /* U+00008f: <control>*/
+ 0x90, /* U+000090: <control>*/
+ 0x91, /* U+000091: <control>*/
+ 0x92, /* U+000092: <control>*/
+ 0x93, /* U+000093: <control>*/
+ 0x94, /* U+000094: <control>*/
+ 0x95, /* U+000095: <control>*/
+ 0x96, /* U+000096: <control>*/
+ 0x97, /* U+000097: <control>*/
+ 0x98, /* U+000098: <control>*/
+ 0x99, /* U+000099: <control>*/
+ 0x9a, /* U+00009a: <control>*/
+ 0x9b, /* U+00009b: <control>*/
+ 0x9c, /* U+00009c: <control>*/
+ 0x9d, /* U+00009d: <control>*/
+ 0x9e, /* U+00009e: <control>*/
+ 0x9f, /* U+00009f: <control>*/
+ 0xa0, /* U+0000a0: NO-BREAK SPACE*/
+ 0xa1, /* U+0000a1: INVERTED EXCLAMATION MARK*/
+ 0xa2, /* U+0000a2: CENT SIGN*/
+ 0xa3, /* U+0000a3: POUND SIGN*/
+ 0xa4, /* U+0000a4: CURRENCY SIGN*/
+ 0xa5, /* U+0000a5: YEN SIGN*/
+ 0xa6, /* U+0000a6: BROKEN BAR*/
+ 0xa7, /* U+0000a7: SECTION SIGN*/
+ 0xa8, /* U+0000a8: DIAERESIS*/
+ 0xa9, /* U+0000a9: COPYRIGHT SIGN*/
+ 0xaa, /* U+0000aa: FEMININE ORDINAL INDICATOR*/
+ 0xab, /* U+0000ab: LEFT-POINTING DOUBLE ANGLE QUOTATION MARK*/
+ 0xac, /* U+0000ac: NOT SIGN*/
+ 0xad, /* U+0000ad: SOFT HYPHEN*/
+ 0xae, /* U+0000ae: REGISTERED SIGN*/
+ 0xaf, /* U+0000af: MACRON*/
+ 0xb0, /* U+0000b0: DEGREE SIGN*/
+ 0xb1, /* U+0000b1: PLUS-MINUS SIGN*/
+ 0xb2, /* U+0000b2: SUPERSCRIPT TWO*/
+ 0xb3, /* U+0000b3: SUPERSCRIPT THREE*/
+ 0xb4, /* U+0000b4: ACUTE ACCENT*/
+ 0xb5, /* U+0000b5: MICRO SIGN*/
+ 0xb6, /* U+0000b6: PILCROW SIGN*/
+ 0xb7, /* U+0000b7: MIDDLE DOT*/
+ 0xb8, /* U+0000b8: CEDILLA*/
+ 0xb9, /* U+0000b9: SUPERSCRIPT ONE*/
+ 0xba, /* U+0000ba: MASCULINE ORDINAL INDICATOR*/
+ 0xbb, /* U+0000bb: RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK*/
+ 0xbc, /* U+0000bc: VULGAR FRACTION ONE QUARTER*/
+ 0xbd, /* U+0000bd: VULGAR FRACTION ONE HALF*/
+ 0xbe, /* U+0000be: VULGAR FRACTION THREE QUARTERS*/
+ 0xbf, /* U+0000bf: INVERTED QUESTION MARK*/
+ 0xe0, /* U+0000c0: LATIN CAPITAL LETTER A WITH GRAVE*/
+ 0xe1, /* U+0000c1: LATIN CAPITAL LETTER A WITH ACUTE*/
+ 0xe2, /* U+0000c2: LATIN CAPITAL LETTER A WITH CIRCUMFLEX*/
+ 0xe3, /* U+0000c3: LATIN CAPITAL LETTER A WITH TILDE*/
+ 0xe4, /* U+0000c4: LATIN CAPITAL LETTER A WITH DIAERESIS*/
+ 0xe5, /* U+0000c5: LATIN CAPITAL LETTER A WITH RING ABOVE*/
+ 0xe6, /* U+0000c6: LATIN CAPITAL LETTER AE*/
+ 0xe7, /* U+0000c7: LATIN CAPITAL LETTER C WITH CEDILLA*/
+ 0xe8, /* U+0000c8: LATIN CAPITAL LETTER E WITH GRAVE*/
+ 0xe9, /* U+0000c9: LATIN CAPITAL LETTER E WITH ACUTE*/
+ 0xea, /* U+0000ca: LATIN CAPITAL LETTER E WITH CIRCUMFLEX*/
+ 0xeb, /* U+0000cb: LATIN CAPITAL LETTER E WITH DIAERESIS*/
+ 0xec, /* U+0000cc: LATIN CAPITAL LETTER I WITH GRAVE*/
+ 0xed, /* U+0000cd: LATIN CAPITAL LETTER I WITH ACUTE*/
+ 0xee, /* U+0000ce: LATIN CAPITAL LETTER I WITH CIRCUMFLEX*/
+ 0xef, /* U+0000cf: LATIN CAPITAL LETTER I WITH DIAERESIS*/
+ 0xf0, /* U+0000d0: LATIN CAPITAL LETTER ETH*/
+ 0xf1, /* U+0000d1: LATIN CAPITAL LETTER N WITH TILDE*/
+ 0xf2, /* U+0000d2: LATIN CAPITAL LETTER O WITH GRAVE*/
+ 0xf3, /* U+0000d3: LATIN CAPITAL LETTER O WITH ACUTE*/
+ 0xf4, /* U+0000d4: LATIN CAPITAL LETTER O WITH CIRCUMFLEX*/
+ 0xf5, /* U+0000d5: LATIN CAPITAL LETTER O WITH TILDE*/
+ 0xf6, /* U+0000d6: LATIN CAPITAL LETTER O WITH DIAERESIS*/
+ 0xd7, /* U+0000d7: MULTIPLICATION SIGN*/
+ 0xf8, /* U+0000d8: LATIN CAPITAL LETTER O WITH STROKE*/
+ 0xf9, /* U+0000d9: LATIN CAPITAL LETTER U WITH GRAVE*/
+ 0xfa, /* U+0000da: LATIN CAPITAL LETTER U WITH ACUTE*/
+ 0xfb, /* U+0000db: LATIN CAPITAL LETTER U WITH CIRCUMFLEX*/
+ 0xfc, /* U+0000dc: LATIN CAPITAL LETTER U WITH DIAERESIS*/
+ 0xfd, /* U+0000dd: LATIN CAPITAL LETTER Y WITH ACUTE*/
+ 0xfe, /* U+0000de: LATIN CAPITAL LETTER THORN*/
+ 0xdf, /* U+0000df: LATIN SMALL LETTER SHARP S*/
+ 0xe0, /* U+0000e0: LATIN SMALL LETTER A WITH GRAVE*/
+ 0xe1, /* U+0000e1: LATIN SMALL LETTER A WITH ACUTE*/
+ 0xe2, /* U+0000e2: LATIN SMALL LETTER A WITH CIRCUMFLEX*/
+ 0xe3, /* U+0000e3: LATIN SMALL LETTER A WITH TILDE*/
+ 0xe4, /* U+0000e4: LATIN SMALL LETTER A WITH DIAERESIS*/
+ 0xe5, /* U+0000e5: LATIN SMALL LETTER A WITH RING ABOVE*/
+ 0xe6, /* U+0000e6: LATIN SMALL LETTER AE*/
+ 0xe7, /* U+0000e7: LATIN SMALL LETTER C WITH CEDILLA*/
+ 0xe8, /* U+0000e8: LATIN SMALL LETTER E WITH GRAVE*/
+ 0xe9, /* U+0000e9: LATIN SMALL LETTER E WITH ACUTE*/
+ 0xea, /* U+0000ea: LATIN SMALL LETTER E WITH CIRCUMFLEX*/
+ 0xeb, /* U+0000eb: LATIN SMALL LETTER E WITH DIAERESIS*/
+ 0xec, /* U+0000ec: LATIN SMALL LETTER I WITH GRAVE*/
+ 0xed, /* U+0000ed: LATIN SMALL LETTER I WITH ACUTE*/
+ 0xee, /* U+0000ee: LATIN SMALL LETTER I WITH CIRCUMFLEX*/
+ 0xef, /* U+0000ef: LATIN SMALL LETTER I WITH DIAERESIS*/
+ 0xf0, /* U+0000f0: LATIN SMALL LETTER ETH*/
+ 0xf1, /* U+0000f1: LATIN SMALL LETTER N WITH TILDE*/
+ 0xf2, /* U+0000f2: LATIN SMALL LETTER O WITH GRAVE*/
+ 0xf3, /* U+0000f3: LATIN SMALL LETTER O WITH ACUTE*/
+ 0xf4, /* U+0000f4: LATIN SMALL LETTER O WITH CIRCUMFLEX*/
+ 0xf5, /* U+0000f5: LATIN SMALL LETTER O WITH TILDE*/
+ 0xf6, /* U+0000f6: LATIN SMALL LETTER O WITH DIAERESIS*/
+ 0xf7, /* U+0000f7: DIVISION SIGN*/
+ 0xf8, /* U+0000f8: LATIN SMALL LETTER O WITH STROKE*/
+ 0xf9, /* U+0000f9: LATIN SMALL LETTER U WITH GRAVE*/
+ 0xfa, /* U+0000fa: LATIN SMALL LETTER U WITH ACUTE*/
+ 0xfb, /* U+0000fb: LATIN SMALL LETTER U WITH CIRCUMFLEX*/
+ 0xfc, /* U+0000fc: LATIN SMALL LETTER U WITH DIAERESIS*/
+ 0xfd, /* U+0000fd: LATIN SMALL LETTER Y WITH ACUTE*/
+ 0xfe, /* U+0000fe: LATIN SMALL LETTER THORN*/
+ 0xff, /* U+0000ff: LATIN SMALL LETTER Y WITH DIAERESIS*/
+ 0x101, /* U+000100: LATIN CAPITAL LETTER A WITH MACRON*/
+ 0x101, /* U+000101: LATIN SMALL LETTER A WITH MACRON*/
+ 0x103, /* U+000102: LATIN CAPITAL LETTER A WITH BREVE*/
+ 0x103, /* U+000103: LATIN SMALL LETTER A WITH BREVE*/
+ 0x105, /* U+000104: LATIN CAPITAL LETTER A WITH OGONEK*/
+ 0x105, /* U+000105: LATIN SMALL LETTER A WITH OGONEK*/
+ 0x107, /* U+000106: LATIN CAPITAL LETTER C WITH ACUTE*/
+ 0x107, /* U+000107: LATIN SMALL LETTER C WITH ACUTE*/
+ 0x109, /* U+000108: LATIN CAPITAL LETTER C WITH CIRCUMFLEX*/
+ 0x109, /* U+000109: LATIN SMALL LETTER C WITH CIRCUMFLEX*/
+ 0x10b, /* U+00010a: LATIN CAPITAL LETTER C WITH DOT ABOVE*/
+ 0x10b, /* U+00010b: LATIN SMALL LETTER C WITH DOT ABOVE*/
+ 0x10d, /* U+00010c: LATIN CAPITAL LETTER C WITH CARON*/
+ 0x10d, /* U+00010d: LATIN SMALL LETTER C WITH CARON*/
+ 0x10f, /* U+00010e: LATIN CAPITAL LETTER D WITH CARON*/
+ 0x10f, /* U+00010f: LATIN SMALL LETTER D WITH CARON*/
+ 0x111, /* U+000110: LATIN CAPITAL LETTER D WITH STROKE*/
+ 0x111, /* U+000111: LATIN SMALL LETTER D WITH STROKE*/
+ 0x113, /* U+000112: LATIN CAPITAL LETTER E WITH MACRON*/
+ 0x113, /* U+000113: LATIN SMALL LETTER E WITH MACRON*/
+ 0x115, /* U+000114: LATIN CAPITAL LETTER E WITH BREVE*/
+ 0x115, /* U+000115: LATIN SMALL LETTER E WITH BREVE*/
+ 0x117, /* U+000116: LATIN CAPITAL LETTER E WITH DOT ABOVE*/
+ 0x117, /* U+000117: LATIN SMALL LETTER E WITH DOT ABOVE*/
+ 0x119, /* U+000118: LATIN CAPITAL LETTER E WITH OGONEK*/
+ 0x119, /* U+000119: LATIN SMALL LETTER E WITH OGONEK*/
+ 0x11b, /* U+00011a: LATIN CAPITAL LETTER E WITH CARON*/
+ 0x11b, /* U+00011b: LATIN SMALL LETTER E WITH CARON*/
+ 0x11d, /* U+00011c: LATIN CAPITAL LETTER G WITH CIRCUMFLEX*/
+ 0x11d, /* U+00011d: LATIN SMALL LETTER G WITH CIRCUMFLEX*/
+ 0x11f, /* U+00011e: LATIN CAPITAL LETTER G WITH BREVE*/
+ 0x11f, /* U+00011f: LATIN SMALL LETTER G WITH BREVE*/
+ 0x121, /* U+000120: LATIN CAPITAL LETTER G WITH DOT ABOVE*/
+ 0x121, /* U+000121: LATIN SMALL LETTER G WITH DOT ABOVE*/
+ 0x123, /* U+000122: LATIN CAPITAL LETTER G WITH CEDILLA*/
+ 0x123, /* U+000123: LATIN SMALL LETTER G WITH CEDILLA*/
+ 0x125, /* U+000124: LATIN CAPITAL LETTER H WITH CIRCUMFLEX*/
+ 0x125, /* U+000125: LATIN SMALL LETTER H WITH CIRCUMFLEX*/
+ 0x127, /* U+000126: LATIN CAPITAL LETTER H WITH STROKE*/
+ 0x127, /* U+000127: LATIN SMALL LETTER H WITH STROKE*/
+ 0x129, /* U+000128: LATIN CAPITAL LETTER I WITH TILDE*/
+ 0x129, /* U+000129: LATIN SMALL LETTER I WITH TILDE*/
+ 0x12b, /* U+00012a: LATIN CAPITAL LETTER I WITH MACRON*/
+ 0x12b, /* U+00012b: LATIN SMALL LETTER I WITH MACRON*/
+ 0x12d, /* U+00012c: LATIN CAPITAL LETTER I WITH BREVE*/
+ 0x12d, /* U+00012d: LATIN SMALL LETTER I WITH BREVE*/
+ 0x12f, /* U+00012e: LATIN CAPITAL LETTER I WITH OGONEK*/
+ 0x12f, /* U+00012f: LATIN SMALL LETTER I WITH OGONEK*/
+ 0x69, /* U+000130: LATIN CAPITAL LETTER I WITH DOT ABOVE*/
+ 0x131, /* U+000131: LATIN SMALL LETTER DOTLESS I*/
+ 0x133, /* U+000132: LATIN CAPITAL LIGATURE IJ*/
+ 0x133, /* U+000133: LATIN SMALL LIGATURE IJ*/
+ 0x135, /* U+000134: LATIN CAPITAL LETTER J WITH CIRCUMFLEX*/
+ 0x135, /* U+000135: LATIN SMALL LETTER J WITH CIRCUMFLEX*/
+ 0x137, /* U+000136: LATIN CAPITAL LETTER K WITH CEDILLA*/
+ 0x137, /* U+000137: LATIN SMALL LETTER K WITH CEDILLA*/
+ 0x138, /* U+000138: LATIN SMALL LETTER KRA*/
+ 0x13a, /* U+000139: LATIN CAPITAL LETTER L WITH ACUTE*/
+ 0x13a, /* U+00013a: LATIN SMALL LETTER L WITH ACUTE*/
+ 0x13c, /* U+00013b: LATIN CAPITAL LETTER L WITH CEDILLA*/
+ 0x13c, /* U+00013c: LATIN SMALL LETTER L WITH CEDILLA*/
+ 0x13e, /* U+00013d: LATIN CAPITAL LETTER L WITH CARON*/
+ 0x13e, /* U+00013e: LATIN SMALL LETTER L WITH CARON*/
+ 0x140, /* U+00013f: LATIN CAPITAL LETTER L WITH MIDDLE DOT*/
+ 0x140, /* U+000140: LATIN SMALL LETTER L WITH MIDDLE DOT*/
+ 0x142, /* U+000141: LATIN CAPITAL LETTER L WITH STROKE*/
+ 0x142, /* U+000142: LATIN SMALL LETTER L WITH STROKE*/
+ 0x144, /* U+000143: LATIN CAPITAL LETTER N WITH ACUTE*/
+ 0x144, /* U+000144: LATIN SMALL LETTER N WITH ACUTE*/
+ 0x146, /* U+000145: LATIN CAPITAL LETTER N WITH CEDILLA*/
+ 0x146, /* U+000146: LATIN SMALL LETTER N WITH CEDILLA*/
+ 0x148, /* U+000147: LATIN CAPITAL LETTER N WITH CARON*/
+ 0x148, /* U+000148: LATIN SMALL LETTER N WITH CARON*/
+ 0x149, /* U+000149: LATIN SMALL LETTER N PRECEDED BY APOSTROPHE*/
+ 0x14b, /* U+00014a: LATIN CAPITAL LETTER ENG*/
+ 0x14b, /* U+00014b: LATIN SMALL LETTER ENG*/
+ 0x14d, /* U+00014c: LATIN CAPITAL LETTER O WITH MACRON*/
+ 0x14d, /* U+00014d: LATIN SMALL LETTER O WITH MACRON*/
+ 0x14f, /* U+00014e: LATIN CAPITAL LETTER O WITH BREVE*/
+ 0x14f, /* U+00014f: LATIN SMALL LETTER O WITH BREVE*/
+ 0x151, /* U+000150: LATIN CAPITAL LETTER O WITH DOUBLE ACUTE*/
+ 0x151, /* U+000151: LATIN SMALL LETTER O WITH DOUBLE ACUTE*/
+ 0x153, /* U+000152: LATIN CAPITAL LIGATURE OE*/
+ 0x153, /* U+000153: LATIN SMALL LIGATURE OE*/
+ 0x155, /* U+000154: LATIN CAPITAL LETTER R WITH ACUTE*/
+ 0x155, /* U+000155: LATIN SMALL LETTER R WITH ACUTE*/
+ 0x157, /* U+000156: LATIN CAPITAL LETTER R WITH CEDILLA*/
+ 0x157, /* U+000157: LATIN SMALL LETTER R WITH CEDILLA*/
+ 0x159, /* U+000158: LATIN CAPITAL LETTER R WITH CARON*/
+ 0x159, /* U+000159: LATIN SMALL LETTER R WITH CARON*/
+ 0x15b, /* U+00015a: LATIN CAPITAL LETTER S WITH ACUTE*/
+ 0x15b, /* U+00015b: LATIN SMALL LETTER S WITH ACUTE*/
+ 0x15d, /* U+00015c: LATIN CAPITAL LETTER S WITH CIRCUMFLEX*/
+ 0x15d, /* U+00015d: LATIN SMALL LETTER S WITH CIRCUMFLEX*/
+ 0x15f, /* U+00015e: LATIN CAPITAL LETTER S WITH CEDILLA*/
+ 0x15f, /* U+00015f: LATIN SMALL LETTER S WITH CEDILLA*/
+ 0x161, /* U+000160: LATIN CAPITAL LETTER S WITH CARON*/
+ 0x161, /* U+000161: LATIN SMALL LETTER S WITH CARON*/
+ 0x163, /* U+000162: LATIN CAPITAL LETTER T WITH CEDILLA*/
+ 0x163, /* U+000163: LATIN SMALL LETTER T WITH CEDILLA*/
+ 0x165, /* U+000164: LATIN CAPITAL LETTER T WITH CARON*/
+ 0x165, /* U+000165: LATIN SMALL LETTER T WITH CARON*/
+ 0x167, /* U+000166: LATIN CAPITAL LETTER T WITH STROKE*/
+ 0x167, /* U+000167: LATIN SMALL LETTER T WITH STROKE*/
+ 0x169, /* U+000168: LATIN CAPITAL LETTER U WITH TILDE*/
+ 0x169, /* U+000169: LATIN SMALL LETTER U WITH TILDE*/
+ 0x16b, /* U+00016a: LATIN CAPITAL LETTER U WITH MACRON*/
+ 0x16b, /* U+00016b: LATIN SMALL LETTER U WITH MACRON*/
+ 0x16d, /* U+00016c: LATIN CAPITAL LETTER U WITH BREVE*/
+ 0x16d, /* U+00016d: LATIN SMALL LETTER U WITH BREVE*/
+ 0x16f, /* U+00016e: LATIN CAPITAL LETTER U WITH RING ABOVE*/
+ 0x16f, /* U+00016f: LATIN SMALL LETTER U WITH RING ABOVE*/
+ 0x171, /* U+000170: LATIN CAPITAL LETTER U WITH DOUBLE ACUTE*/
+ 0x171, /* U+000171: LATIN SMALL LETTER U WITH DOUBLE ACUTE*/
+ 0x173, /* U+000172: LATIN CAPITAL LETTER U WITH OGONEK*/
+ 0x173, /* U+000173: LATIN SMALL LETTER U WITH OGONEK*/
+ 0x175, /* U+000174: LATIN CAPITAL LETTER W WITH CIRCUMFLEX*/
+ 0x175, /* U+000175: LATIN SMALL LETTER W WITH CIRCUMFLEX*/
+ 0x177, /* U+000176: LATIN CAPITAL LETTER Y WITH CIRCUMFLEX*/
+ 0x177, /* U+000177: LATIN SMALL LETTER Y WITH CIRCUMFLEX*/
+ 0xff, /* U+000178: LATIN CAPITAL LETTER Y WITH DIAERESIS*/
+ 0x17a, /* U+000179: LATIN CAPITAL LETTER Z WITH ACUTE*/
+ 0x17a, /* U+00017a: LATIN SMALL LETTER Z WITH ACUTE*/
+ 0x17c, /* U+00017b: LATIN CAPITAL LETTER Z WITH DOT ABOVE*/
+ 0x17c, /* U+00017c: LATIN SMALL LETTER Z WITH DOT ABOVE*/
+ 0x17e, /* U+00017d: LATIN CAPITAL LETTER Z WITH CARON*/
+ 0x17e, /* U+00017e: LATIN SMALL LETTER Z WITH CARON*/
+ 0x17f, /* U+00017f: LATIN SMALL LETTER LONG S*/
+ 0x180, /* U+000180: LATIN SMALL LETTER B WITH STROKE*/
+ 0x253, /* U+000181: LATIN CAPITAL LETTER B WITH HOOK*/
+ 0x183, /* U+000182: LATIN CAPITAL LETTER B WITH TOPBAR*/
+ 0x183, /* U+000183: LATIN SMALL LETTER B WITH TOPBAR*/
+ 0x185, /* U+000184: LATIN CAPITAL LETTER TONE SIX*/
+ 0x185, /* U+000185: LATIN SMALL LETTER TONE SIX*/
+ 0x254, /* U+000186: LATIN CAPITAL LETTER OPEN O*/
+ 0x188, /* U+000187: LATIN CAPITAL LETTER C WITH HOOK*/
+ 0x188, /* U+000188: LATIN SMALL LETTER C WITH HOOK*/
+ 0x256, /* U+000189: LATIN CAPITAL LETTER AFRICAN D*/
+ 0x257, /* U+00018a: LATIN CAPITAL LETTER D WITH HOOK*/
+ 0x18c, /* U+00018b: LATIN CAPITAL LETTER D WITH TOPBAR*/
+ 0x18c, /* U+00018c: LATIN SMALL LETTER D WITH TOPBAR*/
+ 0x18d, /* U+00018d: LATIN SMALL LETTER TURNED DELTA*/
+ 0x1dd, /* U+00018e: LATIN CAPITAL LETTER REVERSED E*/
+ 0x259, /* U+00018f: LATIN CAPITAL LETTER SCHWA*/
+ 0x25b, /* U+000190: LATIN CAPITAL LETTER OPEN E*/
+ 0x192, /* U+000191: LATIN CAPITAL LETTER F WITH HOOK*/
+ 0x192, /* U+000192: LATIN SMALL LETTER F WITH HOOK*/
+ 0x260, /* U+000193: LATIN CAPITAL LETTER G WITH HOOK*/
+ 0x263, /* U+000194: LATIN CAPITAL LETTER GAMMA*/
+ 0x195, /* U+000195: LATIN SMALL LETTER HV*/
+ 0x269, /* U+000196: LATIN CAPITAL LETTER IOTA*/
+ 0x268, /* U+000197: LATIN CAPITAL LETTER I WITH STROKE*/
+ 0x199, /* U+000198: LATIN CAPITAL LETTER K WITH HOOK*/
+ 0x199, /* U+000199: LATIN SMALL LETTER K WITH HOOK*/
+ 0x19a, /* U+00019a: LATIN SMALL LETTER L WITH BAR*/
+ 0x19b, /* U+00019b: LATIN SMALL LETTER LAMBDA WITH STROKE*/
+ 0x26f, /* U+00019c: LATIN CAPITAL LETTER TURNED M*/
+ 0x272, /* U+00019d: LATIN CAPITAL LETTER N WITH LEFT HOOK*/
+ 0x19e, /* U+00019e: LATIN SMALL LETTER N WITH LONG RIGHT LEG*/
+ 0x275, /* U+00019f: LATIN CAPITAL LETTER O WITH MIDDLE TILDE*/
+ 0x1a1, /* U+0001a0: LATIN CAPITAL LETTER O WITH HORN*/
+ 0x1a1, /* U+0001a1: LATIN SMALL LETTER O WITH HORN*/
+ 0x1a3, /* U+0001a2: LATIN CAPITAL LETTER OI*/
+ 0x1a3, /* U+0001a3: LATIN SMALL LETTER OI*/
+ 0x1a5, /* U+0001a4: LATIN CAPITAL LETTER P WITH HOOK*/
+ 0x1a5, /* U+0001a5: LATIN SMALL LETTER P WITH HOOK*/
+ 0x280, /* U+0001a6: LATIN LETTER YR*/
+ 0x1a8, /* U+0001a7: LATIN CAPITAL LETTER TONE TWO*/
+ 0x1a8, /* U+0001a8: LATIN SMALL LETTER TONE TWO*/
+ 0x283, /* U+0001a9: LATIN CAPITAL LETTER ESH*/
+ 0x1aa, /* U+0001aa: LATIN LETTER REVERSED ESH LOOP*/
+ 0x1ab, /* U+0001ab: LATIN SMALL LETTER T WITH PALATAL HOOK*/
+ 0x1ad, /* U+0001ac: LATIN CAPITAL LETTER T WITH HOOK*/
+ 0x1ad, /* U+0001ad: LATIN SMALL LETTER T WITH HOOK*/
+ 0x288, /* U+0001ae: LATIN CAPITAL LETTER T WITH RETROFLEX HOOK*/
+ 0x1b0, /* U+0001af: LATIN CAPITAL LETTER U WITH HORN*/
+ 0x1b0, /* U+0001b0: LATIN SMALL LETTER U WITH HORN*/
+ 0x28a, /* U+0001b1: LATIN CAPITAL LETTER UPSILON*/
+ 0x28b, /* U+0001b2: LATIN CAPITAL LETTER V WITH HOOK*/
+ 0x1b4, /* U+0001b3: LATIN CAPITAL LETTER Y WITH HOOK*/
+ 0x1b4, /* U+0001b4: LATIN SMALL LETTER Y WITH HOOK*/
+ 0x1b6, /* U+0001b5: LATIN CAPITAL LETTER Z WITH STROKE*/
+ 0x1b6, /* U+0001b6: LATIN SMALL LETTER Z WITH STROKE*/
+ 0x292, /* U+0001b7: LATIN CAPITAL LETTER EZH*/
+ 0x1b9, /* U+0001b8: LATIN CAPITAL LETTER EZH REVERSED*/
+ 0x1b9, /* U+0001b9: LATIN SMALL LETTER EZH REVERSED*/
+ 0x1ba, /* U+0001ba: LATIN SMALL LETTER EZH WITH TAIL*/
+ 0x1bb, /* U+0001bb: LATIN LETTER TWO WITH STROKE*/
+ 0x1bd, /* U+0001bc: LATIN CAPITAL LETTER TONE FIVE*/
+ 0x1bd, /* U+0001bd: LATIN SMALL LETTER TONE FIVE*/
+ 0x1be, /* U+0001be: LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE*/
+ 0x1bf, /* U+0001bf: LATIN LETTER WYNN*/
+ 0x1c0, /* U+0001c0: LATIN LETTER DENTAL CLICK*/
+ 0x1c1, /* U+0001c1: LATIN LETTER LATERAL CLICK*/
+ 0x1c2, /* U+0001c2: LATIN LETTER ALVEOLAR CLICK*/
+ 0x1c3, /* U+0001c3: LATIN LETTER RETROFLEX CLICK*/
+ 0x1c6, /* U+0001c4: LATIN CAPITAL LETTER DZ WITH CARON*/
+ 0x1c6, /* U+0001c5: LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON*/
+ 0x1c6, /* U+0001c6: LATIN SMALL LETTER DZ WITH CARON*/
+ 0x1c9, /* U+0001c7: LATIN CAPITAL LETTER LJ*/
+ 0x1c9, /* U+0001c8: LATIN CAPITAL LETTER L WITH SMALL LETTER J*/
+ 0x1c9, /* U+0001c9: LATIN SMALL LETTER LJ*/
+ 0x1cc, /* U+0001ca: LATIN CAPITAL LETTER NJ*/
+ 0x1cc, /* U+0001cb: LATIN CAPITAL LETTER N WITH SMALL LETTER J*/
+ 0x1cc, /* U+0001cc: LATIN SMALL LETTER NJ*/
+ 0x1ce, /* U+0001cd: LATIN CAPITAL LETTER A WITH CARON*/
+ 0x1ce, /* U+0001ce: LATIN SMALL LETTER A WITH CARON*/
+ 0x1d0, /* U+0001cf: LATIN CAPITAL LETTER I WITH CARON*/
+ 0x1d0, /* U+0001d0: LATIN SMALL LETTER I WITH CARON*/
+ 0x1d2, /* U+0001d1: LATIN CAPITAL LETTER O WITH CARON*/
+ 0x1d2, /* U+0001d2: LATIN SMALL LETTER O WITH CARON*/
+ 0x1d4, /* U+0001d3: LATIN CAPITAL LETTER U WITH CARON*/
+ 0x1d4, /* U+0001d4: LATIN SMALL LETTER U WITH CARON*/
+ 0x1d6, /* U+0001d5: LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON*/
+ 0x1d6, /* U+0001d6: LATIN SMALL LETTER U WITH DIAERESIS AND MACRON*/
+ 0x1d8, /* U+0001d7: LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE*/
+ 0x1d8, /* U+0001d8: LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE*/
+ 0x1da, /* U+0001d9: LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON*/
+ 0x1da, /* U+0001da: LATIN SMALL LETTER U WITH DIAERESIS AND CARON*/
+ 0x1dc, /* U+0001db: LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE*/
+ 0x1dc, /* U+0001dc: LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE*/
+ 0x1dd, /* U+0001dd: LATIN SMALL LETTER TURNED E*/
+ 0x1df, /* U+0001de: LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON*/
+ 0x1df, /* U+0001df: LATIN SMALL LETTER A WITH DIAERESIS AND MACRON*/
+ 0x1e1, /* U+0001e0: LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON*/
+ 0x1e1, /* U+0001e1: LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON*/
+ 0x1e3, /* U+0001e2: LATIN CAPITAL LETTER AE WITH MACRON*/
+ 0x1e3, /* U+0001e3: LATIN SMALL LETTER AE WITH MACRON*/
+ 0x1e5, /* U+0001e4: LATIN CAPITAL LETTER G WITH STROKE*/
+ 0x1e5, /* U+0001e5: LATIN SMALL LETTER G WITH STROKE*/
+ 0x1e7, /* U+0001e6: LATIN CAPITAL LETTER G WITH CARON*/
+ 0x1e7, /* U+0001e7: LATIN SMALL LETTER G WITH CARON*/
+ 0x1e9, /* U+0001e8: LATIN CAPITAL LETTER K WITH CARON*/
+ 0x1e9, /* U+0001e9: LATIN SMALL LETTER K WITH CARON*/
+ 0x1eb, /* U+0001ea: LATIN CAPITAL LETTER O WITH OGONEK*/
+ 0x1eb, /* U+0001eb: LATIN SMALL LETTER O WITH OGONEK*/
+ 0x1ed, /* U+0001ec: LATIN CAPITAL LETTER O WITH OGONEK AND MACRON*/
+ 0x1ed, /* U+0001ed: LATIN SMALL LETTER O WITH OGONEK AND MACRON*/
+ 0x1ef, /* U+0001ee: LATIN CAPITAL LETTER EZH WITH CARON*/
+ 0x1ef, /* U+0001ef: LATIN SMALL LETTER EZH WITH CARON*/
+ 0x1f0, /* U+0001f0: LATIN SMALL LETTER J WITH CARON*/
+ 0x1f3, /* U+0001f1: LATIN CAPITAL LETTER DZ*/
+ 0x1f3, /* U+0001f2: LATIN CAPITAL LETTER D WITH SMALL LETTER Z*/
+ 0x1f3, /* U+0001f3: LATIN SMALL LETTER DZ*/
+ 0x1f5, /* U+0001f4: LATIN CAPITAL LETTER G WITH ACUTE*/
+ 0x1f5, /* U+0001f5: LATIN SMALL LETTER G WITH ACUTE*/
+ 0x195, /* U+0001f6: LATIN CAPITAL LETTER HWAIR*/
+ 0x1bf, /* U+0001f7: LATIN CAPITAL LETTER WYNN*/
+ 0x1f9, /* U+0001f8: LATIN CAPITAL LETTER N WITH GRAVE*/
+ 0x1f9, /* U+0001f9: LATIN SMALL LETTER N WITH GRAVE*/
+ 0x1fb, /* U+0001fa: LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE*/
+ 0x1fb, /* U+0001fb: LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE*/
+ 0x1fd, /* U+0001fc: LATIN CAPITAL LETTER AE WITH ACUTE*/
+ 0x1fd, /* U+0001fd: LATIN SMALL LETTER AE WITH ACUTE*/
+ 0x1ff, /* U+0001fe: LATIN CAPITAL LETTER O WITH STROKE AND ACUTE*/
+ 0x1ff, /* U+0001ff: LATIN SMALL LETTER O WITH STROKE AND ACUTE*/
+ 0x201, /* U+000200: LATIN CAPITAL LETTER A WITH DOUBLE GRAVE*/
+ 0x201, /* U+000201: LATIN SMALL LETTER A WITH DOUBLE GRAVE*/
+ 0x203, /* U+000202: LATIN CAPITAL LETTER A WITH INVERTED BREVE*/
+ 0x203, /* U+000203: LATIN SMALL LETTER A WITH INVERTED BREVE*/
+ 0x205, /* U+000204: LATIN CAPITAL LETTER E WITH DOUBLE GRAVE*/
+ 0x205, /* U+000205: LATIN SMALL LETTER E WITH DOUBLE GRAVE*/
+ 0x207, /* U+000206: LATIN CAPITAL LETTER E WITH INVERTED BREVE*/
+ 0x207, /* U+000207: LATIN SMALL LETTER E WITH INVERTED BREVE*/
+ 0x209, /* U+000208: LATIN CAPITAL LETTER I WITH DOUBLE GRAVE*/
+ 0x209, /* U+000209: LATIN SMALL LETTER I WITH DOUBLE GRAVE*/
+ 0x20b, /* U+00020a: LATIN CAPITAL LETTER I WITH INVERTED BREVE*/
+ 0x20b, /* U+00020b: LATIN SMALL LETTER I WITH INVERTED BREVE*/
+ 0x20d, /* U+00020c: LATIN CAPITAL LETTER O WITH DOUBLE GRAVE*/
+ 0x20d, /* U+00020d: LATIN SMALL LETTER O WITH DOUBLE GRAVE*/
+ 0x20f, /* U+00020e: LATIN CAPITAL LETTER O WITH INVERTED BREVE*/
+ 0x20f, /* U+00020f: LATIN SMALL LETTER O WITH INVERTED BREVE*/
+ 0x211, /* U+000210: LATIN CAPITAL LETTER R WITH DOUBLE GRAVE*/
+ 0x211, /* U+000211: LATIN SMALL LETTER R WITH DOUBLE GRAVE*/
+ 0x213, /* U+000212: LATIN CAPITAL LETTER R WITH INVERTED BREVE*/
+ 0x213, /* U+000213: LATIN SMALL LETTER R WITH INVERTED BREVE*/
+ 0x215, /* U+000214: LATIN CAPITAL LETTER U WITH DOUBLE GRAVE*/
+ 0x215, /* U+000215: LATIN SMALL LETTER U WITH DOUBLE GRAVE*/
+ 0x217, /* U+000216: LATIN CAPITAL LETTER U WITH INVERTED BREVE*/
+ 0x217, /* U+000217: LATIN SMALL LETTER U WITH INVERTED BREVE*/
+ 0x219, /* U+000218: LATIN CAPITAL LETTER S WITH COMMA BELOW*/
+ 0x219, /* U+000219: LATIN SMALL LETTER S WITH COMMA BELOW*/
+ 0x21b, /* U+00021a: LATIN CAPITAL LETTER T WITH COMMA BELOW*/
+ 0x21b, /* U+00021b: LATIN SMALL LETTER T WITH COMMA BELOW*/
+ 0x21d, /* U+00021c: LATIN CAPITAL LETTER YOGH*/
+ 0x21d, /* U+00021d: LATIN SMALL LETTER YOGH*/
+ 0x21f, /* U+00021e: LATIN CAPITAL LETTER H WITH CARON*/
+ 0x21f, /* U+00021f: LATIN SMALL LETTER H WITH CARON*/
+ 0x19e, /* U+000220: LATIN CAPITAL LETTER N WITH LONG RIGHT LEG*/
+ 0x221, /* U+000221: LATIN SMALL LETTER D WITH CURL*/
+ 0x223, /* U+000222: LATIN CAPITAL LETTER OU*/
+ 0x223, /* U+000223: LATIN SMALL LETTER OU*/
+ 0x225, /* U+000224: LATIN CAPITAL LETTER Z WITH HOOK*/
+ 0x225, /* U+000225: LATIN SMALL LETTER Z WITH HOOK*/
+ 0x227, /* U+000226: LATIN CAPITAL LETTER A WITH DOT ABOVE*/
+ 0x227, /* U+000227: LATIN SMALL LETTER A WITH DOT ABOVE*/
+ 0x229, /* U+000228: LATIN CAPITAL LETTER E WITH CEDILLA*/
+ 0x229, /* U+000229: LATIN SMALL LETTER E WITH CEDILLA*/
+ 0x22b, /* U+00022a: LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON*/
+ 0x22b, /* U+00022b: LATIN SMALL LETTER O WITH DIAERESIS AND MACRON*/
+ 0x22d, /* U+00022c: LATIN CAPITAL LETTER O WITH TILDE AND MACRON*/
+ 0x22d, /* U+00022d: LATIN SMALL LETTER O WITH TILDE AND MACRON*/
+ 0x22f, /* U+00022e: LATIN CAPITAL LETTER O WITH DOT ABOVE*/
+ 0x22f, /* U+00022f: LATIN SMALL LETTER O WITH DOT ABOVE*/
+ 0x231, /* U+000230: LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON*/
+ 0x231, /* U+000231: LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON*/
+ 0x233, /* U+000232: LATIN CAPITAL LETTER Y WITH MACRON*/
+ 0x233, /* U+000233: LATIN SMALL LETTER Y WITH MACRON*/
+ 0x234, /* U+000234: LATIN SMALL LETTER L WITH CURL*/
+ 0x235, /* U+000235: LATIN SMALL LETTER N WITH CURL*/
+ 0x236, /* U+000236: LATIN SMALL LETTER T WITH CURL*/
+ 0x237, /* U+000237: LATIN SMALL LETTER DOTLESS J*/
+ 0x238, /* U+000238: LATIN SMALL LETTER DB DIGRAPH*/
+ 0x239, /* U+000239: LATIN SMALL LETTER QP DIGRAPH*/
+ 0x2c65, /* U+00023a: LATIN CAPITAL LETTER A WITH STROKE*/
+ 0x23c, /* U+00023b: LATIN CAPITAL LETTER C WITH STROKE*/
+ 0x23c, /* U+00023c: LATIN SMALL LETTER C WITH STROKE*/
+ 0x19a, /* U+00023d: LATIN CAPITAL LETTER L WITH BAR*/
+ 0x2c66, /* U+00023e: LATIN CAPITAL LETTER T WITH DIAGONAL STROKE*/
+ 0x23f, /* U+00023f: LATIN SMALL LETTER S WITH SWASH TAIL*/
+ 0x240, /* U+000240: LATIN SMALL LETTER Z WITH SWASH TAIL*/
+ 0x242, /* U+000241: LATIN CAPITAL LETTER GLOTTAL STOP*/
+ 0x242, /* U+000242: LATIN SMALL LETTER GLOTTAL STOP*/
+ 0x180, /* U+000243: LATIN CAPITAL LETTER B WITH STROKE*/
+ 0x289, /* U+000244: LATIN CAPITAL LETTER U BAR*/
+ 0x28c, /* U+000245: LATIN CAPITAL LETTER TURNED V*/
+ 0x247, /* U+000246: LATIN CAPITAL LETTER E WITH STROKE*/
+ 0x247, /* U+000247: LATIN SMALL LETTER E WITH STROKE*/
+ 0x249, /* U+000248: LATIN CAPITAL LETTER J WITH STROKE*/
+ 0x249, /* U+000249: LATIN SMALL LETTER J WITH STROKE*/
+ 0x24b, /* U+00024a: LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL*/
+ 0x24b, /* U+00024b: LATIN SMALL LETTER Q WITH HOOK TAIL*/
+ 0x24d, /* U+00024c: LATIN CAPITAL LETTER R WITH STROKE*/
+ 0x24d, /* U+00024d: LATIN SMALL LETTER R WITH STROKE*/
+ 0x24f, /* U+00024e: LATIN CAPITAL LETTER Y WITH STROKE*/
+ 0x24f, /* U+00024f: LATIN SMALL LETTER Y WITH STROKE*/
+ 0x250, /* U+000250: LATIN SMALL LETTER TURNED A*/
+ 0x251, /* U+000251: LATIN SMALL LETTER ALPHA*/
+ 0x252, /* U+000252: LATIN SMALL LETTER TURNED ALPHA*/
+ 0x253, /* U+000253: LATIN SMALL LETTER B WITH HOOK*/
+ 0x254, /* U+000254: LATIN SMALL LETTER OPEN O*/
+ 0x255, /* U+000255: LATIN SMALL LETTER C WITH CURL*/
+ 0x256, /* U+000256: LATIN SMALL LETTER D WITH TAIL*/
+ 0x257, /* U+000257: LATIN SMALL LETTER D WITH HOOK*/
+ 0x258, /* U+000258: LATIN SMALL LETTER REVERSED E*/
+ 0x259, /* U+000259: LATIN SMALL LETTER SCHWA*/
+ 0x25a, /* U+00025a: LATIN SMALL LETTER SCHWA WITH HOOK*/
+ 0x25b, /* U+00025b: LATIN SMALL LETTER OPEN E*/
+ 0x25c, /* U+00025c: LATIN SMALL LETTER REVERSED OPEN E*/
+ 0x25d, /* U+00025d: LATIN SMALL LETTER REVERSED OPEN E WITH HOOK*/
+ 0x25e, /* U+00025e: LATIN SMALL LETTER CLOSED REVERSED OPEN E*/
+ 0x25f, /* U+00025f: LATIN SMALL LETTER DOTLESS J WITH STROKE*/
+ 0x260, /* U+000260: LATIN SMALL LETTER G WITH HOOK*/
+ 0x261, /* U+000261: LATIN SMALL LETTER SCRIPT G*/
+ 0x262, /* U+000262: LATIN LETTER SMALL CAPITAL G*/
+ 0x263, /* U+000263: LATIN SMALL LETTER GAMMA*/
+ 0x264, /* U+000264: LATIN SMALL LETTER RAMS HORN*/
+ 0x265, /* U+000265: LATIN SMALL LETTER TURNED H*/
+ 0x266, /* U+000266: LATIN SMALL LETTER H WITH HOOK*/
+ 0x267, /* U+000267: LATIN SMALL LETTER HENG WITH HOOK*/
+ 0x268, /* U+000268: LATIN SMALL LETTER I WITH STROKE*/
+ 0x269, /* U+000269: LATIN SMALL LETTER IOTA*/
+ 0x26a, /* U+00026a: LATIN LETTER SMALL CAPITAL I*/
+ 0x26b, /* U+00026b: LATIN SMALL LETTER L WITH MIDDLE TILDE*/
+ 0x26c, /* U+00026c: LATIN SMALL LETTER L WITH BELT*/
+ 0x26d, /* U+00026d: LATIN SMALL LETTER L WITH RETROFLEX HOOK*/
+ 0x26e, /* U+00026e: LATIN SMALL LETTER LEZH*/
+ 0x26f, /* U+00026f: LATIN SMALL LETTER TURNED M*/
+ 0x270, /* U+000270: LATIN SMALL LETTER TURNED M WITH LONG LEG*/
+ 0x271, /* U+000271: LATIN SMALL LETTER M WITH HOOK*/
+ 0x272, /* U+000272: LATIN SMALL LETTER N WITH LEFT HOOK*/
+ 0x273, /* U+000273: LATIN SMALL LETTER N WITH RETROFLEX HOOK*/
+ 0x274, /* U+000274: LATIN LETTER SMALL CAPITAL N*/
+ 0x275, /* U+000275: LATIN SMALL LETTER BARRED O*/
+ 0x276, /* U+000276: LATIN LETTER SMALL CAPITAL OE*/
+ 0x277, /* U+000277: LATIN SMALL LETTER CLOSED OMEGA*/
+ 0x278, /* U+000278: LATIN SMALL LETTER PHI*/
+ 0x279, /* U+000279: LATIN SMALL LETTER TURNED R*/
+ 0x27a, /* U+00027a: LATIN SMALL LETTER TURNED R WITH LONG LEG*/
+ 0x27b, /* U+00027b: LATIN SMALL LETTER TURNED R WITH HOOK*/
+ 0x27c, /* U+00027c: LATIN SMALL LETTER R WITH LONG LEG*/
+ 0x27d, /* U+00027d: LATIN SMALL LETTER R WITH TAIL*/
+ 0x27e, /* U+00027e: LATIN SMALL LETTER R WITH FISHHOOK*/
+ 0x27f, /* U+00027f: LATIN SMALL LETTER REVERSED R WITH FISHHOOK*/
+ 0x280, /* U+000280: LATIN LETTER SMALL CAPITAL R*/
+ 0x281, /* U+000281: LATIN LETTER SMALL CAPITAL INVERTED R*/
+ 0x282, /* U+000282: LATIN SMALL LETTER S WITH HOOK*/
+ 0x283, /* U+000283: LATIN SMALL LETTER ESH*/
+ 0x284, /* U+000284: LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK*/
+ 0x285, /* U+000285: LATIN SMALL LETTER SQUAT REVERSED ESH*/
+ 0x286, /* U+000286: LATIN SMALL LETTER ESH WITH CURL*/
+ 0x287, /* U+000287: LATIN SMALL LETTER TURNED T*/
+ 0x288, /* U+000288: LATIN SMALL LETTER T WITH RETROFLEX HOOK*/
+ 0x289, /* U+000289: LATIN SMALL LETTER U BAR*/
+ 0x28a, /* U+00028a: LATIN SMALL LETTER UPSILON*/
+ 0x28b, /* U+00028b: LATIN SMALL LETTER V WITH HOOK*/
+ 0x28c, /* U+00028c: LATIN SMALL LETTER TURNED V*/
+ 0x28d, /* U+00028d: LATIN SMALL LETTER TURNED W*/
+ 0x28e, /* U+00028e: LATIN SMALL LETTER TURNED Y*/
+ 0x28f, /* U+00028f: LATIN LETTER SMALL CAPITAL Y*/
+ 0x290, /* U+000290: LATIN SMALL LETTER Z WITH RETROFLEX HOOK*/
+ 0x291, /* U+000291: LATIN SMALL LETTER Z WITH CURL*/
+ 0x292, /* U+000292: LATIN SMALL LETTER EZH*/
+ 0x293, /* U+000293: LATIN SMALL LETTER EZH WITH CURL*/
+ 0x294, /* U+000294: LATIN LETTER GLOTTAL STOP*/
+ 0x295, /* U+000295: LATIN LETTER PHARYNGEAL VOICED FRICATIVE*/
+ 0x296, /* U+000296: LATIN LETTER INVERTED GLOTTAL STOP*/
+ 0x297, /* U+000297: LATIN LETTER STRETCHED C*/
+ 0x298, /* U+000298: LATIN LETTER BILABIAL CLICK*/
+ 0x299, /* U+000299: LATIN LETTER SMALL CAPITAL B*/
+ 0x29a, /* U+00029a: LATIN SMALL LETTER CLOSED OPEN E*/
+ 0x29b, /* U+00029b: LATIN LETTER SMALL CAPITAL G WITH HOOK*/
+ 0x29c, /* U+00029c: LATIN LETTER SMALL CAPITAL H*/
+ 0x29d, /* U+00029d: LATIN SMALL LETTER J WITH CROSSED-TAIL*/
+ 0x29e, /* U+00029e: LATIN SMALL LETTER TURNED K*/
+ 0x29f, /* U+00029f: LATIN LETTER SMALL CAPITAL L*/
+ 0x2a0, /* U+0002a0: LATIN SMALL LETTER Q WITH HOOK*/
+ 0x2a1, /* U+0002a1: LATIN LETTER GLOTTAL STOP WITH STROKE*/
+ 0x2a2, /* U+0002a2: LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE*/
+ 0x2a3, /* U+0002a3: LATIN SMALL LETTER DZ DIGRAPH*/
+ 0x2a4, /* U+0002a4: LATIN SMALL LETTER DEZH DIGRAPH*/
+ 0x2a5, /* U+0002a5: LATIN SMALL LETTER DZ DIGRAPH WITH CURL*/
+ 0x2a6, /* U+0002a6: LATIN SMALL LETTER TS DIGRAPH*/
+ 0x2a7, /* U+0002a7: LATIN SMALL LETTER TESH DIGRAPH*/
+ 0x2a8, /* U+0002a8: LATIN SMALL LETTER TC DIGRAPH WITH CURL*/
+ 0x2a9, /* U+0002a9: LATIN SMALL LETTER FENG DIGRAPH*/
+ 0x2aa, /* U+0002aa: LATIN SMALL LETTER LS DIGRAPH*/
+ 0x2ab, /* U+0002ab: LATIN SMALL LETTER LZ DIGRAPH*/
+ 0x2ac, /* U+0002ac: LATIN LETTER BILABIAL PERCUSSIVE*/
+ 0x2ad, /* U+0002ad: LATIN LETTER BIDENTAL PERCUSSIVE*/
+ 0x2ae, /* U+0002ae: LATIN SMALL LETTER TURNED H WITH FISHHOOK*/
+ 0x2af, /* U+0002af: LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL*/
+ 0x2b0, /* U+0002b0: MODIFIER LETTER SMALL H*/
+ 0x2b1, /* U+0002b1: MODIFIER LETTER SMALL H WITH HOOK*/
+ 0x2b2, /* U+0002b2: MODIFIER LETTER SMALL J*/
+ 0x2b3, /* U+0002b3: MODIFIER LETTER SMALL R*/
+ 0x2b4, /* U+0002b4: MODIFIER LETTER SMALL TURNED R*/
+ 0x2b5, /* U+0002b5: MODIFIER LETTER SMALL TURNED R WITH HOOK*/
+ 0x2b6, /* U+0002b6: MODIFIER LETTER SMALL CAPITAL INVERTED R*/
+ 0x2b7, /* U+0002b7: MODIFIER LETTER SMALL W*/
+ 0x2b8, /* U+0002b8: MODIFIER LETTER SMALL Y*/
+ 0x2b9, /* U+0002b9: MODIFIER LETTER PRIME*/
+ 0x2ba, /* U+0002ba: MODIFIER LETTER DOUBLE PRIME*/
+ 0x2bb, /* U+0002bb: MODIFIER LETTER TURNED COMMA*/
+ 0x2bc, /* U+0002bc: MODIFIER LETTER APOSTROPHE*/
+ 0x2bd, /* U+0002bd: MODIFIER LETTER REVERSED COMMA*/
+ 0x2be, /* U+0002be: MODIFIER LETTER RIGHT HALF RING*/
+ 0x2bf, /* U+0002bf: MODIFIER LETTER LEFT HALF RING*/
+ 0x2c0, /* U+0002c0: MODIFIER LETTER GLOTTAL STOP*/
+ 0x2c1, /* U+0002c1: MODIFIER LETTER REVERSED GLOTTAL STOP*/
+ 0x2c2, /* U+0002c2: MODIFIER LETTER LEFT ARROWHEAD*/
+ 0x2c3, /* U+0002c3: MODIFIER LETTER RIGHT ARROWHEAD*/
+ 0x2c4, /* U+0002c4: MODIFIER LETTER UP ARROWHEAD*/
+ 0x2c5, /* U+0002c5: MODIFIER LETTER DOWN ARROWHEAD*/
+ 0x2c6, /* U+0002c6: MODIFIER LETTER CIRCUMFLEX ACCENT*/
+ 0x2c7, /* U+0002c7: CARON*/
+ 0x2c8, /* U+0002c8: MODIFIER LETTER VERTICAL LINE*/
+ 0x2c9, /* U+0002c9: MODIFIER LETTER MACRON*/
+ 0x2ca, /* U+0002ca: MODIFIER LETTER ACUTE ACCENT*/
+ 0x2cb, /* U+0002cb: MODIFIER LETTER GRAVE ACCENT*/
+ 0x2cc, /* U+0002cc: MODIFIER LETTER LOW VERTICAL LINE*/
+ 0x2cd, /* U+0002cd: MODIFIER LETTER LOW MACRON*/
+ 0x2ce, /* U+0002ce: MODIFIER LETTER LOW GRAVE ACCENT*/
+ 0x2cf, /* U+0002cf: MODIFIER LETTER LOW ACUTE ACCENT*/
+ 0x2d0, /* U+0002d0: MODIFIER LETTER TRIANGULAR COLON*/
+ 0x2d1, /* U+0002d1: MODIFIER LETTER HALF TRIANGULAR COLON*/
+ 0x2d2, /* U+0002d2: MODIFIER LETTER CENTRED RIGHT HALF RING*/
+ 0x2d3, /* U+0002d3: MODIFIER LETTER CENTRED LEFT HALF RING*/
+ 0x2d4, /* U+0002d4: MODIFIER LETTER UP TACK*/
+ 0x2d5, /* U+0002d5: MODIFIER LETTER DOWN TACK*/
+ 0x2d6, /* U+0002d6: MODIFIER LETTER PLUS SIGN*/
+ 0x2d7, /* U+0002d7: MODIFIER LETTER MINUS SIGN*/
+ 0x2d8, /* U+0002d8: BREVE*/
+ 0x2d9, /* U+0002d9: DOT ABOVE*/
+ 0x2da, /* U+0002da: RING ABOVE*/
+ 0x2db, /* U+0002db: OGONEK*/
+ 0x2dc, /* U+0002dc: SMALL TILDE*/
+ 0x2dd, /* U+0002dd: DOUBLE ACUTE ACCENT*/
+ 0x2de, /* U+0002de: MODIFIER LETTER RHOTIC HOOK*/
+ 0x2df, /* U+0002df: MODIFIER LETTER CROSS ACCENT*/
+ 0x2e0, /* U+0002e0: MODIFIER LETTER SMALL GAMMA*/
+ 0x2e1, /* U+0002e1: MODIFIER LETTER SMALL L*/
+ 0x2e2, /* U+0002e2: MODIFIER LETTER SMALL S*/
+ 0x2e3, /* U+0002e3: MODIFIER LETTER SMALL X*/
+ 0x2e4, /* U+0002e4: MODIFIER LETTER SMALL REVERSED GLOTTAL STOP*/
+ 0x2e5, /* U+0002e5: MODIFIER LETTER EXTRA-HIGH TONE BAR*/
+ 0x2e6, /* U+0002e6: MODIFIER LETTER HIGH TONE BAR*/
+ 0x2e7, /* U+0002e7: MODIFIER LETTER MID TONE BAR*/
+ 0x2e8, /* U+0002e8: MODIFIER LETTER LOW TONE BAR*/
+ 0x2e9, /* U+0002e9: MODIFIER LETTER EXTRA-LOW TONE BAR*/
+ 0x2ea, /* U+0002ea: MODIFIER LETTER YIN DEPARTING TONE MARK*/
+ 0x2eb, /* U+0002eb: MODIFIER LETTER YANG DEPARTING TONE MARK*/
+ 0x2ec, /* U+0002ec: MODIFIER LETTER VOICING*/
+ 0x2ed, /* U+0002ed: MODIFIER LETTER UNASPIRATED*/
+ 0x2ee, /* U+0002ee: MODIFIER LETTER DOUBLE APOSTROPHE*/
+ 0x2ef, /* U+0002ef: MODIFIER LETTER LOW DOWN ARROWHEAD*/
+ 0x2f0, /* U+0002f0: MODIFIER LETTER LOW UP ARROWHEAD*/
+ 0x2f1, /* U+0002f1: MODIFIER LETTER LOW LEFT ARROWHEAD*/
+ 0x2f2, /* U+0002f2: MODIFIER LETTER LOW RIGHT ARROWHEAD*/
+ 0x2f3, /* U+0002f3: MODIFIER LETTER LOW RING*/
+ 0x2f4, /* U+0002f4: MODIFIER LETTER MIDDLE GRAVE ACCENT*/
+ 0x2f5, /* U+0002f5: MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT*/
+ 0x2f6, /* U+0002f6: MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT*/
+ 0x2f7, /* U+0002f7: MODIFIER LETTER LOW TILDE*/
+ 0x2f8, /* U+0002f8: MODIFIER LETTER RAISED COLON*/
+ 0x2f9, /* U+0002f9: MODIFIER LETTER BEGIN HIGH TONE*/
+ 0x2fa, /* U+0002fa: MODIFIER LETTER END HIGH TONE*/
+ 0x2fb, /* U+0002fb: MODIFIER LETTER BEGIN LOW TONE*/
+ 0x2fc, /* U+0002fc: MODIFIER LETTER END LOW TONE*/
+ 0x2fd, /* U+0002fd: MODIFIER LETTER SHELF*/
+ 0x2fe, /* U+0002fe: MODIFIER LETTER OPEN SHELF*/
+ 0x2ff, /* U+0002ff: MODIFIER LETTER LOW LEFT ARROW*/
+ 0x300, /* U+000300: COMBINING GRAVE ACCENT*/
+ 0x301, /* U+000301: COMBINING ACUTE ACCENT*/
+ 0x302, /* U+000302: COMBINING CIRCUMFLEX ACCENT*/
+ 0x303, /* U+000303: COMBINING TILDE*/
+ 0x304, /* U+000304: COMBINING MACRON*/
+ 0x305, /* U+000305: COMBINING OVERLINE*/
+ 0x306, /* U+000306: COMBINING BREVE*/
+ 0x307, /* U+000307: COMBINING DOT ABOVE*/
+ 0x308, /* U+000308: COMBINING DIAERESIS*/
+ 0x309, /* U+000309: COMBINING HOOK ABOVE*/
+ 0x30a, /* U+00030a: COMBINING RING ABOVE*/
+ 0x30b, /* U+00030b: COMBINING DOUBLE ACUTE ACCENT*/
+ 0x30c, /* U+00030c: COMBINING CARON*/
+ 0x30d, /* U+00030d: COMBINING VERTICAL LINE ABOVE*/
+ 0x30e, /* U+00030e: COMBINING DOUBLE VERTICAL LINE ABOVE*/
+ 0x30f, /* U+00030f: COMBINING DOUBLE GRAVE ACCENT*/
+ 0x310, /* U+000310: COMBINING CANDRABINDU*/
+ 0x311, /* U+000311: COMBINING INVERTED BREVE*/
+ 0x312, /* U+000312: COMBINING TURNED COMMA ABOVE*/
+ 0x313, /* U+000313: COMBINING COMMA ABOVE*/
+ 0x314, /* U+000314: COMBINING REVERSED COMMA ABOVE*/
+ 0x315, /* U+000315: COMBINING COMMA ABOVE RIGHT*/
+ 0x316, /* U+000316: COMBINING GRAVE ACCENT BELOW*/
+ 0x317, /* U+000317: COMBINING ACUTE ACCENT BELOW*/
+ 0x318, /* U+000318: COMBINING LEFT TACK BELOW*/
+ 0x319, /* U+000319: COMBINING RIGHT TACK BELOW*/
+ 0x31a, /* U+00031a: COMBINING LEFT ANGLE ABOVE*/
+ 0x31b, /* U+00031b: COMBINING HORN*/
+ 0x31c, /* U+00031c: COMBINING LEFT HALF RING BELOW*/
+ 0x31d, /* U+00031d: COMBINING UP TACK BELOW*/
+ 0x31e, /* U+00031e: COMBINING DOWN TACK BELOW*/
+ 0x31f, /* U+00031f: COMBINING PLUS SIGN BELOW*/
+ 0x320, /* U+000320: COMBINING MINUS SIGN BELOW*/
+ 0x321, /* U+000321: COMBINING PALATALIZED HOOK BELOW*/
+ 0x322, /* U+000322: COMBINING RETROFLEX HOOK BELOW*/
+ 0x323, /* U+000323: COMBINING DOT BELOW*/
+ 0x324, /* U+000324: COMBINING DIAERESIS BELOW*/
+ 0x325, /* U+000325: COMBINING RING BELOW*/
+ 0x326, /* U+000326: COMBINING COMMA BELOW*/
+ 0x327, /* U+000327: COMBINING CEDILLA*/
+ 0x328, /* U+000328: COMBINING OGONEK*/
+ 0x329, /* U+000329: COMBINING VERTICAL LINE BELOW*/
+ 0x32a, /* U+00032a: COMBINING BRIDGE BELOW*/
+ 0x32b, /* U+00032b: COMBINING INVERTED DOUBLE ARCH BELOW*/
+ 0x32c, /* U+00032c: COMBINING CARON BELOW*/
+ 0x32d, /* U+00032d: COMBINING CIRCUMFLEX ACCENT BELOW*/
+ 0x32e, /* U+00032e: COMBINING BREVE BELOW*/
+ 0x32f, /* U+00032f: COMBINING INVERTED BREVE BELOW*/
+ 0x330, /* U+000330: COMBINING TILDE BELOW*/
+ 0x331, /* U+000331: COMBINING MACRON BELOW*/
+ 0x332, /* U+000332: COMBINING LOW LINE*/
+ 0x333, /* U+000333: COMBINING DOUBLE LOW LINE*/
+ 0x334, /* U+000334: COMBINING TILDE OVERLAY*/
+ 0x335, /* U+000335: COMBINING SHORT STROKE OVERLAY*/
+ 0x336, /* U+000336: COMBINING LONG STROKE OVERLAY*/
+ 0x337, /* U+000337: COMBINING SHORT SOLIDUS OVERLAY*/
+ 0x338, /* U+000338: COMBINING LONG SOLIDUS OVERLAY*/
+ 0x339, /* U+000339: COMBINING RIGHT HALF RING BELOW*/
+ 0x33a, /* U+00033a: COMBINING INVERTED BRIDGE BELOW*/
+ 0x33b, /* U+00033b: COMBINING SQUARE BELOW*/
+ 0x33c, /* U+00033c: COMBINING SEAGULL BELOW*/
+ 0x33d, /* U+00033d: COMBINING X ABOVE*/
+ 0x33e, /* U+00033e: COMBINING VERTICAL TILDE*/
+ 0x33f, /* U+00033f: COMBINING DOUBLE OVERLINE*/
+ 0x340, /* U+000340: COMBINING GRAVE TONE MARK*/
+ 0x341, /* U+000341: COMBINING ACUTE TONE MARK*/
+ 0x342, /* U+000342: COMBINING GREEK PERISPOMENI*/
+ 0x343, /* U+000343: COMBINING GREEK KORONIS*/
+ 0x344, /* U+000344: COMBINING GREEK DIALYTIKA TONOS*/
+ 0x345, /* U+000345: COMBINING GREEK YPOGEGRAMMENI*/
+ 0x346, /* U+000346: COMBINING BRIDGE ABOVE*/
+ 0x347, /* U+000347: COMBINING EQUALS SIGN BELOW*/
+ 0x348, /* U+000348: COMBINING DOUBLE VERTICAL LINE BELOW*/
+ 0x349, /* U+000349: COMBINING LEFT ANGLE BELOW*/
+ 0x34a, /* U+00034a: COMBINING NOT TILDE ABOVE*/
+ 0x34b, /* U+00034b: COMBINING HOMOTHETIC ABOVE*/
+ 0x34c, /* U+00034c: COMBINING ALMOST EQUAL TO ABOVE*/
+ 0x34d, /* U+00034d: COMBINING LEFT RIGHT ARROW BELOW*/
+ 0x34e, /* U+00034e: COMBINING UPWARDS ARROW BELOW*/
+ 0x34f, /* U+00034f: COMBINING GRAPHEME JOINER*/
+ 0x350, /* U+000350: COMBINING RIGHT ARROWHEAD ABOVE*/
+ 0x351, /* U+000351: COMBINING LEFT HALF RING ABOVE*/
+ 0x352, /* U+000352: COMBINING FERMATA*/
+ 0x353, /* U+000353: COMBINING X BELOW*/
+ 0x354, /* U+000354: COMBINING LEFT ARROWHEAD BELOW*/
+ 0x355, /* U+000355: COMBINING RIGHT ARROWHEAD BELOW*/
+ 0x356, /* U+000356: COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW*/
+ 0x357, /* U+000357: COMBINING RIGHT HALF RING ABOVE*/
+ 0x358, /* U+000358: COMBINING DOT ABOVE RIGHT*/
+ 0x359, /* U+000359: COMBINING ASTERISK BELOW*/
+ 0x35a, /* U+00035a: COMBINING DOUBLE RING BELOW*/
+ 0x35b, /* U+00035b: COMBINING ZIGZAG ABOVE*/
+ 0x35c, /* U+00035c: COMBINING DOUBLE BREVE BELOW*/
+ 0x35d, /* U+00035d: COMBINING DOUBLE BREVE*/
+ 0x35e, /* U+00035e: COMBINING DOUBLE MACRON*/
+ 0x35f, /* U+00035f: COMBINING DOUBLE MACRON BELOW*/
+ 0x360, /* U+000360: COMBINING DOUBLE TILDE*/
+ 0x361, /* U+000361: COMBINING DOUBLE INVERTED BREVE*/
+ 0x362, /* U+000362: COMBINING DOUBLE RIGHTWARDS ARROW BELOW*/
+ 0x363, /* U+000363: COMBINING LATIN SMALL LETTER A*/
+ 0x364, /* U+000364: COMBINING LATIN SMALL LETTER E*/
+ 0x365, /* U+000365: COMBINING LATIN SMALL LETTER I*/
+ 0x366, /* U+000366: COMBINING LATIN SMALL LETTER O*/
+ 0x367, /* U+000367: COMBINING LATIN SMALL LETTER U*/
+ 0x368, /* U+000368: COMBINING LATIN SMALL LETTER C*/
+ 0x369, /* U+000369: COMBINING LATIN SMALL LETTER D*/
+ 0x36a, /* U+00036a: COMBINING LATIN SMALL LETTER H*/
+ 0x36b, /* U+00036b: COMBINING LATIN SMALL LETTER M*/
+ 0x36c, /* U+00036c: COMBINING LATIN SMALL LETTER R*/
+ 0x36d, /* U+00036d: COMBINING LATIN SMALL LETTER T*/
+ 0x36e, /* U+00036e: COMBINING LATIN SMALL LETTER V*/
+ 0x36f, /* U+00036f: COMBINING LATIN SMALL LETTER X*/
+ 0x371, /* U+000370: GREEK CAPITAL LETTER HETA*/
+ 0x371, /* U+000371: GREEK SMALL LETTER HETA*/
+ 0x373, /* U+000372: GREEK CAPITAL LETTER ARCHAIC SAMPI*/
+ 0x373, /* U+000373: GREEK SMALL LETTER ARCHAIC SAMPI*/
+ 0x374, /* U+000374: GREEK NUMERAL SIGN*/
+ 0x375, /* U+000375: GREEK LOWER NUMERAL SIGN*/
+ 0x377, /* U+000376: GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA*/
+ 0x377, /* U+000377: GREEK SMALL LETTER PAMPHYLIAN DIGAMMA*/
+ 0x378, /* U+000378: */
+ 0x379, /* U+000379: */
+ 0x37a, /* U+00037a: GREEK YPOGEGRAMMENI*/
+ 0x37b, /* U+00037b: GREEK SMALL REVERSED LUNATE SIGMA SYMBOL*/
+ 0x37c, /* U+00037c: GREEK SMALL DOTTED LUNATE SIGMA SYMBOL*/
+ 0x37d, /* U+00037d: GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL*/
+ 0x37e, /* U+00037e: GREEK QUESTION MARK*/
+ 0x37f, /* U+00037f: */
+ 0x380, /* U+000380: */
+ 0x381, /* U+000381: */
+ 0x382, /* U+000382: */
+ 0x383, /* U+000383: */
+ 0x384, /* U+000384: GREEK TONOS*/
+ 0x385, /* U+000385: GREEK DIALYTIKA TONOS*/
+ 0x3ac, /* U+000386: GREEK CAPITAL LETTER ALPHA WITH TONOS*/
+ 0x387, /* U+000387: GREEK ANO TELEIA*/
+ 0x3ad, /* U+000388: GREEK CAPITAL LETTER EPSILON WITH TONOS*/
+ 0x3ae, /* U+000389: GREEK CAPITAL LETTER ETA WITH TONOS*/
+ 0x3af, /* U+00038a: GREEK CAPITAL LETTER IOTA WITH TONOS*/
+ 0x38b, /* U+00038b: */
+ 0x3cc, /* U+00038c: GREEK CAPITAL LETTER OMICRON WITH TONOS*/
+ 0x38d, /* U+00038d: */
+ 0x3cd, /* U+00038e: GREEK CAPITAL LETTER UPSILON WITH TONOS*/
+ 0x3ce, /* U+00038f: GREEK CAPITAL LETTER OMEGA WITH TONOS*/
+ 0x390, /* U+000390: GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS*/
+ 0x3b1, /* U+000391: GREEK CAPITAL LETTER ALPHA*/
+ 0x3b2, /* U+000392: GREEK CAPITAL LETTER BETA*/
+ 0x3b3, /* U+000393: GREEK CAPITAL LETTER GAMMA*/
+ 0x3b4, /* U+000394: GREEK CAPITAL LETTER DELTA*/
+ 0x3b5, /* U+000395: GREEK CAPITAL LETTER EPSILON*/
+ 0x3b6, /* U+000396: GREEK CAPITAL LETTER ZETA*/
+ 0x3b7, /* U+000397: GREEK CAPITAL LETTER ETA*/
+ 0x3b8, /* U+000398: GREEK CAPITAL LETTER THETA*/
+ 0x3b9, /* U+000399: GREEK CAPITAL LETTER IOTA*/
+ 0x3ba, /* U+00039a: GREEK CAPITAL LETTER KAPPA*/
+ 0x3bb, /* U+00039b: GREEK CAPITAL LETTER LAMDA*/
+ 0x3bc, /* U+00039c: GREEK CAPITAL LETTER MU*/
+ 0x3bd, /* U+00039d: GREEK CAPITAL LETTER NU*/
+ 0x3be, /* U+00039e: GREEK CAPITAL LETTER XI*/
+ 0x3bf, /* U+00039f: GREEK CAPITAL LETTER OMICRON*/
+ 0x3c0, /* U+0003a0: GREEK CAPITAL LETTER PI*/
+ 0x3c1, /* U+0003a1: GREEK CAPITAL LETTER RHO*/
+ 0x3a2, /* U+0003a2: */
+ 0x3c3, /* U+0003a3: GREEK CAPITAL LETTER SIGMA*/
+ 0x3c4, /* U+0003a4: GREEK CAPITAL LETTER TAU*/
+ 0x3c5, /* U+0003a5: GREEK CAPITAL LETTER UPSILON*/
+ 0x3c6, /* U+0003a6: GREEK CAPITAL LETTER PHI*/
+ 0x3c7, /* U+0003a7: GREEK CAPITAL LETTER CHI*/
+ 0x3c8, /* U+0003a8: GREEK CAPITAL LETTER PSI*/
+ 0x3c9, /* U+0003a9: GREEK CAPITAL LETTER OMEGA*/
+ 0x3ca, /* U+0003aa: GREEK CAPITAL LETTER IOTA WITH DIALYTIKA*/
+ 0x3cb, /* U+0003ab: GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA*/
+ 0x3ac, /* U+0003ac: GREEK SMALL LETTER ALPHA WITH TONOS*/
+ 0x3ad, /* U+0003ad: GREEK SMALL LETTER EPSILON WITH TONOS*/
+ 0x3ae, /* U+0003ae: GREEK SMALL LETTER ETA WITH TONOS*/
+ 0x3af, /* U+0003af: GREEK SMALL LETTER IOTA WITH TONOS*/
+ 0x3b0, /* U+0003b0: GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS*/
+ 0x3b1, /* U+0003b1: GREEK SMALL LETTER ALPHA*/
+ 0x3b2, /* U+0003b2: GREEK SMALL LETTER BETA*/
+ 0x3b3, /* U+0003b3: GREEK SMALL LETTER GAMMA*/
+ 0x3b4, /* U+0003b4: GREEK SMALL LETTER DELTA*/
+ 0x3b5, /* U+0003b5: GREEK SMALL LETTER EPSILON*/
+ 0x3b6, /* U+0003b6: GREEK SMALL LETTER ZETA*/
+ 0x3b7, /* U+0003b7: GREEK SMALL LETTER ETA*/
+ 0x3b8, /* U+0003b8: GREEK SMALL LETTER THETA*/
+ 0x3b9, /* U+0003b9: GREEK SMALL LETTER IOTA*/
+ 0x3ba, /* U+0003ba: GREEK SMALL LETTER KAPPA*/
+ 0x3bb, /* U+0003bb: GREEK SMALL LETTER LAMDA*/
+ 0x3bc, /* U+0003bc: GREEK SMALL LETTER MU*/
+ 0x3bd, /* U+0003bd: GREEK SMALL LETTER NU*/
+ 0x3be, /* U+0003be: GREEK SMALL LETTER XI*/
+ 0x3bf, /* U+0003bf: GREEK SMALL LETTER OMICRON*/
+ 0x3c0, /* U+0003c0: GREEK SMALL LETTER PI*/
+ 0x3c1, /* U+0003c1: GREEK SMALL LETTER RHO*/
+ 0x3c2, /* U+0003c2: GREEK SMALL LETTER FINAL SIGMA*/
+ 0x3c3, /* U+0003c3: GREEK SMALL LETTER SIGMA*/
+ 0x3c4, /* U+0003c4: GREEK SMALL LETTER TAU*/
+ 0x3c5, /* U+0003c5: GREEK SMALL LETTER UPSILON*/
+ 0x3c6, /* U+0003c6: GREEK SMALL LETTER PHI*/
+ 0x3c7, /* U+0003c7: GREEK SMALL LETTER CHI*/
+ 0x3c8, /* U+0003c8: GREEK SMALL LETTER PSI*/
+ 0x3c9, /* U+0003c9: GREEK SMALL LETTER OMEGA*/
+ 0x3ca, /* U+0003ca: GREEK SMALL LETTER IOTA WITH DIALYTIKA*/
+ 0x3cb, /* U+0003cb: GREEK SMALL LETTER UPSILON WITH DIALYTIKA*/
+ 0x3cc, /* U+0003cc: GREEK SMALL LETTER OMICRON WITH TONOS*/
+ 0x3cd, /* U+0003cd: GREEK SMALL LETTER UPSILON WITH TONOS*/
+ 0x3ce, /* U+0003ce: GREEK SMALL LETTER OMEGA WITH TONOS*/
+ 0x3d7, /* U+0003cf: GREEK CAPITAL KAI SYMBOL*/
+ 0x3d0, /* U+0003d0: GREEK BETA SYMBOL*/
+ 0x3d1, /* U+0003d1: GREEK THETA SYMBOL*/
+ 0x3d2, /* U+0003d2: GREEK UPSILON WITH HOOK SYMBOL*/
+ 0x3d3, /* U+0003d3: GREEK UPSILON WITH ACUTE AND HOOK SYMBOL*/
+ 0x3d4, /* U+0003d4: GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL*/
+ 0x3d5, /* U+0003d5: GREEK PHI SYMBOL*/
+ 0x3d6, /* U+0003d6: GREEK PI SYMBOL*/
+ 0x3d7, /* U+0003d7: GREEK KAI SYMBOL*/
+ 0x3d9, /* U+0003d8: GREEK LETTER ARCHAIC KOPPA*/
+ 0x3d9, /* U+0003d9: GREEK SMALL LETTER ARCHAIC KOPPA*/
+ 0x3db, /* U+0003da: GREEK LETTER STIGMA*/
+ 0x3db, /* U+0003db: GREEK SMALL LETTER STIGMA*/
+ 0x3dd, /* U+0003dc: GREEK LETTER DIGAMMA*/
+ 0x3dd, /* U+0003dd: GREEK SMALL LETTER DIGAMMA*/
+ 0x3df, /* U+0003de: GREEK LETTER KOPPA*/
+ 0x3df, /* U+0003df: GREEK SMALL LETTER KOPPA*/
+ 0x3e1, /* U+0003e0: GREEK LETTER SAMPI*/
+ 0x3e1, /* U+0003e1: GREEK SMALL LETTER SAMPI*/
+ 0x3e3, /* U+0003e2: COPTIC CAPITAL LETTER SHEI*/
+ 0x3e3, /* U+0003e3: COPTIC SMALL LETTER SHEI*/
+ 0x3e5, /* U+0003e4: COPTIC CAPITAL LETTER FEI*/
+ 0x3e5, /* U+0003e5: COPTIC SMALL LETTER FEI*/
+ 0x3e7, /* U+0003e6: COPTIC CAPITAL LETTER KHEI*/
+ 0x3e7, /* U+0003e7: COPTIC SMALL LETTER KHEI*/
+ 0x3e9, /* U+0003e8: COPTIC CAPITAL LETTER HORI*/
+ 0x3e9, /* U+0003e9: COPTIC SMALL LETTER HORI*/
+ 0x3eb, /* U+0003ea: COPTIC CAPITAL LETTER GANGIA*/
+ 0x3eb, /* U+0003eb: COPTIC SMALL LETTER GANGIA*/
+ 0x3ed, /* U+0003ec: COPTIC CAPITAL LETTER SHIMA*/
+ 0x3ed, /* U+0003ed: COPTIC SMALL LETTER SHIMA*/
+ 0x3ef, /* U+0003ee: COPTIC CAPITAL LETTER DEI*/
+ 0x3ef, /* U+0003ef: COPTIC SMALL LETTER DEI*/
+ 0x3f0, /* U+0003f0: GREEK KAPPA SYMBOL*/
+ 0x3f1, /* U+0003f1: GREEK RHO SYMBOL*/
+ 0x3f2, /* U+0003f2: GREEK LUNATE SIGMA SYMBOL*/
+ 0x3f3, /* U+0003f3: GREEK LETTER YOT*/
+ 0x3b8, /* U+0003f4: GREEK CAPITAL THETA SYMBOL*/
+ 0x3f5, /* U+0003f5: GREEK LUNATE EPSILON SYMBOL*/
+ 0x3f6, /* U+0003f6: GREEK REVERSED LUNATE EPSILON SYMBOL*/
+ 0x3f8, /* U+0003f7: GREEK CAPITAL LETTER SHO*/
+ 0x3f8, /* U+0003f8: GREEK SMALL LETTER SHO*/
+ 0x3f2, /* U+0003f9: GREEK CAPITAL LUNATE SIGMA SYMBOL*/
+ 0x3fb, /* U+0003fa: GREEK CAPITAL LETTER SAN*/
+ 0x3fb, /* U+0003fb: GREEK SMALL LETTER SAN*/
+ 0x3fc, /* U+0003fc: GREEK RHO WITH STROKE SYMBOL*/
+ 0x37b, /* U+0003fd: GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL*/
+ 0x37c, /* U+0003fe: GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL*/
+ 0x37d, /* U+0003ff: GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL*/
+ 0x450, /* U+000400: CYRILLIC CAPITAL LETTER IE WITH GRAVE*/
+ 0x451, /* U+000401: CYRILLIC CAPITAL LETTER IO*/
+ 0x452, /* U+000402: CYRILLIC CAPITAL LETTER DJE*/
+ 0x453, /* U+000403: CYRILLIC CAPITAL LETTER GJE*/
+ 0x454, /* U+000404: CYRILLIC CAPITAL LETTER UKRAINIAN IE*/
+ 0x455, /* U+000405: CYRILLIC CAPITAL LETTER DZE*/
+ 0x456, /* U+000406: CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I*/
+ 0x457, /* U+000407: CYRILLIC CAPITAL LETTER YI*/
+ 0x458, /* U+000408: CYRILLIC CAPITAL LETTER JE*/
+ 0x459, /* U+000409: CYRILLIC CAPITAL LETTER LJE*/
+ 0x45a, /* U+00040a: CYRILLIC CAPITAL LETTER NJE*/
+ 0x45b, /* U+00040b: CYRILLIC CAPITAL LETTER TSHE*/
+ 0x45c, /* U+00040c: CYRILLIC CAPITAL LETTER KJE*/
+ 0x45d, /* U+00040d: CYRILLIC CAPITAL LETTER I WITH GRAVE*/
+ 0x45e, /* U+00040e: CYRILLIC CAPITAL LETTER SHORT U*/
+ 0x45f, /* U+00040f: CYRILLIC CAPITAL LETTER DZHE*/
+ 0x430, /* U+000410: CYRILLIC CAPITAL LETTER A*/
+ 0x431, /* U+000411: CYRILLIC CAPITAL LETTER BE*/
+ 0x432, /* U+000412: CYRILLIC CAPITAL LETTER VE*/
+ 0x433, /* U+000413: CYRILLIC CAPITAL LETTER GHE*/
+ 0x434, /* U+000414: CYRILLIC CAPITAL LETTER DE*/
+ 0x435, /* U+000415: CYRILLIC CAPITAL LETTER IE*/
+ 0x436, /* U+000416: CYRILLIC CAPITAL LETTER ZHE*/
+ 0x437, /* U+000417: CYRILLIC CAPITAL LETTER ZE*/
+ 0x438, /* U+000418: CYRILLIC CAPITAL LETTER I*/
+ 0x439, /* U+000419: CYRILLIC CAPITAL LETTER SHORT I*/
+ 0x43a, /* U+00041a: CYRILLIC CAPITAL LETTER KA*/
+ 0x43b, /* U+00041b: CYRILLIC CAPITAL LETTER EL*/
+ 0x43c, /* U+00041c: CYRILLIC CAPITAL LETTER EM*/
+ 0x43d, /* U+00041d: CYRILLIC CAPITAL LETTER EN*/
+ 0x43e, /* U+00041e: CYRILLIC CAPITAL LETTER O*/
+ 0x43f, /* U+00041f: CYRILLIC CAPITAL LETTER PE*/
+ 0x440, /* U+000420: CYRILLIC CAPITAL LETTER ER*/
+ 0x441, /* U+000421: CYRILLIC CAPITAL LETTER ES*/
+ 0x442, /* U+000422: CYRILLIC CAPITAL LETTER TE*/
+ 0x443, /* U+000423: CYRILLIC CAPITAL LETTER U*/
+ 0x444, /* U+000424: CYRILLIC CAPITAL LETTER EF*/
+ 0x445, /* U+000425: CYRILLIC CAPITAL LETTER HA*/
+ 0x446, /* U+000426: CYRILLIC CAPITAL LETTER TSE*/
+ 0x447, /* U+000427: CYRILLIC CAPITAL LETTER CHE*/
+ 0x448, /* U+000428: CYRILLIC CAPITAL LETTER SHA*/
+ 0x449, /* U+000429: CYRILLIC CAPITAL LETTER SHCHA*/
+ 0x44a, /* U+00042a: CYRILLIC CAPITAL LETTER HARD SIGN*/
+ 0x44b, /* U+00042b: CYRILLIC CAPITAL LETTER YERU*/
+ 0x44c, /* U+00042c: CYRILLIC CAPITAL LETTER SOFT SIGN*/
+ 0x44d, /* U+00042d: CYRILLIC CAPITAL LETTER E*/
+ 0x44e, /* U+00042e: CYRILLIC CAPITAL LETTER YU*/
+ 0x44f, /* U+00042f: CYRILLIC CAPITAL LETTER YA*/
+ 0x430, /* U+000430: CYRILLIC SMALL LETTER A*/
+ 0x431, /* U+000431: CYRILLIC SMALL LETTER BE*/
+ 0x432, /* U+000432: CYRILLIC SMALL LETTER VE*/
+ 0x433, /* U+000433: CYRILLIC SMALL LETTER GHE*/
+ 0x434, /* U+000434: CYRILLIC SMALL LETTER DE*/
+ 0x435, /* U+000435: CYRILLIC SMALL LETTER IE*/
+ 0x436, /* U+000436: CYRILLIC SMALL LETTER ZHE*/
+ 0x437, /* U+000437: CYRILLIC SMALL LETTER ZE*/
+ 0x438, /* U+000438: CYRILLIC SMALL LETTER I*/
+ 0x439, /* U+000439: CYRILLIC SMALL LETTER SHORT I*/
+ 0x43a, /* U+00043a: CYRILLIC SMALL LETTER KA*/
+ 0x43b, /* U+00043b: CYRILLIC SMALL LETTER EL*/
+ 0x43c, /* U+00043c: CYRILLIC SMALL LETTER EM*/
+ 0x43d, /* U+00043d: CYRILLIC SMALL LETTER EN*/
+ 0x43e, /* U+00043e: CYRILLIC SMALL LETTER O*/
+ 0x43f, /* U+00043f: CYRILLIC SMALL LETTER PE*/
+ 0x440, /* U+000440: CYRILLIC SMALL LETTER ER*/
+ 0x441, /* U+000441: CYRILLIC SMALL LETTER ES*/
+ 0x442, /* U+000442: CYRILLIC SMALL LETTER TE*/
+ 0x443, /* U+000443: CYRILLIC SMALL LETTER U*/
+ 0x444, /* U+000444: CYRILLIC SMALL LETTER EF*/
+ 0x445, /* U+000445: CYRILLIC SMALL LETTER HA*/
+ 0x446, /* U+000446: CYRILLIC SMALL LETTER TSE*/
+ 0x447, /* U+000447: CYRILLIC SMALL LETTER CHE*/
+ 0x448, /* U+000448: CYRILLIC SMALL LETTER SHA*/
+ 0x449, /* U+000449: CYRILLIC SMALL LETTER SHCHA*/
+ 0x44a, /* U+00044a: CYRILLIC SMALL LETTER HARD SIGN*/
+ 0x44b, /* U+00044b: CYRILLIC SMALL LETTER YERU*/
+ 0x44c, /* U+00044c: CYRILLIC SMALL LETTER SOFT SIGN*/
+ 0x44d, /* U+00044d: CYRILLIC SMALL LETTER E*/
+ 0x44e, /* U+00044e: CYRILLIC SMALL LETTER YU*/
+ 0x44f, /* U+00044f: CYRILLIC SMALL LETTER YA*/
+ 0x450, /* U+000450: CYRILLIC SMALL LETTER IE WITH GRAVE*/
+ 0x451, /* U+000451: CYRILLIC SMALL LETTER IO*/
+ 0x452, /* U+000452: CYRILLIC SMALL LETTER DJE*/
+ 0x453, /* U+000453: CYRILLIC SMALL LETTER GJE*/
+ 0x454, /* U+000454: CYRILLIC SMALL LETTER UKRAINIAN IE*/
+ 0x455, /* U+000455: CYRILLIC SMALL LETTER DZE*/
+ 0x456, /* U+000456: CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I*/
+ 0x457, /* U+000457: CYRILLIC SMALL LETTER YI*/
+ 0x458, /* U+000458: CYRILLIC SMALL LETTER JE*/
+ 0x459, /* U+000459: CYRILLIC SMALL LETTER LJE*/
+ 0x45a, /* U+00045a: CYRILLIC SMALL LETTER NJE*/
+ 0x45b, /* U+00045b: CYRILLIC SMALL LETTER TSHE*/
+ 0x45c, /* U+00045c: CYRILLIC SMALL LETTER KJE*/
+ 0x45d, /* U+00045d: CYRILLIC SMALL LETTER I WITH GRAVE*/
+ 0x45e, /* U+00045e: CYRILLIC SMALL LETTER SHORT U*/
+ 0x45f, /* U+00045f: CYRILLIC SMALL LETTER DZHE*/
+ 0x461, /* U+000460: CYRILLIC CAPITAL LETTER OMEGA*/
+ 0x461, /* U+000461: CYRILLIC SMALL LETTER OMEGA*/
+ 0x463, /* U+000462: CYRILLIC CAPITAL LETTER YAT*/
+ 0x463, /* U+000463: CYRILLIC SMALL LETTER YAT*/
+ 0x465, /* U+000464: CYRILLIC CAPITAL LETTER IOTIFIED E*/
+ 0x465, /* U+000465: CYRILLIC SMALL LETTER IOTIFIED E*/
+ 0x467, /* U+000466: CYRILLIC CAPITAL LETTER LITTLE YUS*/
+ 0x467, /* U+000467: CYRILLIC SMALL LETTER LITTLE YUS*/
+ 0x469, /* U+000468: CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS*/
+ 0x469, /* U+000469: CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS*/
+ 0x46b, /* U+00046a: CYRILLIC CAPITAL LETTER BIG YUS*/
+ 0x46b, /* U+00046b: CYRILLIC SMALL LETTER BIG YUS*/
+ 0x46d, /* U+00046c: CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS*/
+ 0x46d, /* U+00046d: CYRILLIC SMALL LETTER IOTIFIED BIG YUS*/
+ 0x46f, /* U+00046e: CYRILLIC CAPITAL LETTER KSI*/
+ 0x46f, /* U+00046f: CYRILLIC SMALL LETTER KSI*/
+ 0x471, /* U+000470: CYRILLIC CAPITAL LETTER PSI*/
+ 0x471, /* U+000471: CYRILLIC SMALL LETTER PSI*/
+ 0x473, /* U+000472: CYRILLIC CAPITAL LETTER FITA*/
+ 0x473, /* U+000473: CYRILLIC SMALL LETTER FITA*/
+ 0x475, /* U+000474: CYRILLIC CAPITAL LETTER IZHITSA*/
+ 0x475, /* U+000475: CYRILLIC SMALL LETTER IZHITSA*/
+ 0x477, /* U+000476: CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT*/
+ 0x477, /* U+000477: CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT*/
+ 0x479, /* U+000478: CYRILLIC CAPITAL LETTER UK*/
+ 0x479, /* U+000479: CYRILLIC SMALL LETTER UK*/
+ 0x47b, /* U+00047a: CYRILLIC CAPITAL LETTER ROUND OMEGA*/
+ 0x47b, /* U+00047b: CYRILLIC SMALL LETTER ROUND OMEGA*/
+ 0x47d, /* U+00047c: CYRILLIC CAPITAL LETTER OMEGA WITH TITLO*/
+ 0x47d, /* U+00047d: CYRILLIC SMALL LETTER OMEGA WITH TITLO*/
+ 0x47f, /* U+00047e: CYRILLIC CAPITAL LETTER OT*/
+ 0x47f, /* U+00047f: CYRILLIC SMALL LETTER OT*/
+ 0x481, /* U+000480: CYRILLIC CAPITAL LETTER KOPPA*/
+ 0x481, /* U+000481: CYRILLIC SMALL LETTER KOPPA*/
+ 0x482, /* U+000482: CYRILLIC THOUSANDS SIGN*/
+ 0x483, /* U+000483: COMBINING CYRILLIC TITLO*/
+ 0x484, /* U+000484: COMBINING CYRILLIC PALATALIZATION*/
+ 0x485, /* U+000485: COMBINING CYRILLIC DASIA PNEUMATA*/
+ 0x486, /* U+000486: COMBINING CYRILLIC PSILI PNEUMATA*/
+ 0x487, /* U+000487: COMBINING CYRILLIC POKRYTIE*/
+ 0x488, /* U+000488: COMBINING CYRILLIC HUNDRED THOUSANDS SIGN*/
+ 0x489, /* U+000489: COMBINING CYRILLIC MILLIONS SIGN*/
+ 0x48b, /* U+00048a: CYRILLIC CAPITAL LETTER SHORT I WITH TAIL*/
+ 0x48b, /* U+00048b: CYRILLIC SMALL LETTER SHORT I WITH TAIL*/
+ 0x48d, /* U+00048c: CYRILLIC CAPITAL LETTER SEMISOFT SIGN*/
+ 0x48d, /* U+00048d: CYRILLIC SMALL LETTER SEMISOFT SIGN*/
+ 0x48f, /* U+00048e: CYRILLIC CAPITAL LETTER ER WITH TICK*/
+ 0x48f, /* U+00048f: CYRILLIC SMALL LETTER ER WITH TICK*/
+ 0x491, /* U+000490: CYRILLIC CAPITAL LETTER GHE WITH UPTURN*/
+ 0x491, /* U+000491: CYRILLIC SMALL LETTER GHE WITH UPTURN*/
+ 0x493, /* U+000492: CYRILLIC CAPITAL LETTER GHE WITH STROKE*/
+ 0x493, /* U+000493: CYRILLIC SMALL LETTER GHE WITH STROKE*/
+ 0x495, /* U+000494: CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK*/
+ 0x495, /* U+000495: CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK*/
+ 0x497, /* U+000496: CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER*/
+ 0x497, /* U+000497: CYRILLIC SMALL LETTER ZHE WITH DESCENDER*/
+ 0x499, /* U+000498: CYRILLIC CAPITAL LETTER ZE WITH DESCENDER*/
+ 0x499, /* U+000499: CYRILLIC SMALL LETTER ZE WITH DESCENDER*/
+ 0x49b, /* U+00049a: CYRILLIC CAPITAL LETTER KA WITH DESCENDER*/
+ 0x49b, /* U+00049b: CYRILLIC SMALL LETTER KA WITH DESCENDER*/
+ 0x49d, /* U+00049c: CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE*/
+ 0x49d, /* U+00049d: CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE*/
+ 0x49f, /* U+00049e: CYRILLIC CAPITAL LETTER KA WITH STROKE*/
+ 0x49f, /* U+00049f: CYRILLIC SMALL LETTER KA WITH STROKE*/
+ 0x4a1, /* U+0004a0: CYRILLIC CAPITAL LETTER BASHKIR KA*/
+ 0x4a1, /* U+0004a1: CYRILLIC SMALL LETTER BASHKIR KA*/
+ 0x4a3, /* U+0004a2: CYRILLIC CAPITAL LETTER EN WITH DESCENDER*/
+ 0x4a3, /* U+0004a3: CYRILLIC SMALL LETTER EN WITH DESCENDER*/
+ 0x4a5, /* U+0004a4: CYRILLIC CAPITAL LIGATURE EN GHE*/
+ 0x4a5, /* U+0004a5: CYRILLIC SMALL LIGATURE EN GHE*/
+ 0x4a7, /* U+0004a6: CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK*/
+ 0x4a7, /* U+0004a7: CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK*/
+ 0x4a9, /* U+0004a8: CYRILLIC CAPITAL LETTER ABKHASIAN HA*/
+ 0x4a9, /* U+0004a9: CYRILLIC SMALL LETTER ABKHASIAN HA*/
+ 0x4ab, /* U+0004aa: CYRILLIC CAPITAL LETTER ES WITH DESCENDER*/
+ 0x4ab, /* U+0004ab: CYRILLIC SMALL LETTER ES WITH DESCENDER*/
+ 0x4ad, /* U+0004ac: CYRILLIC CAPITAL LETTER TE WITH DESCENDER*/
+ 0x4ad, /* U+0004ad: CYRILLIC SMALL LETTER TE WITH DESCENDER*/
+ 0x4af, /* U+0004ae: CYRILLIC CAPITAL LETTER STRAIGHT U*/
+ 0x4af, /* U+0004af: CYRILLIC SMALL LETTER STRAIGHT U*/
+ 0x4b1, /* U+0004b0: CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE*/
+ 0x4b1, /* U+0004b1: CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE*/
+ 0x4b3, /* U+0004b2: CYRILLIC CAPITAL LETTER HA WITH DESCENDER*/
+ 0x4b3, /* U+0004b3: CYRILLIC SMALL LETTER HA WITH DESCENDER*/
+ 0x4b5, /* U+0004b4: CYRILLIC CAPITAL LIGATURE TE TSE*/
+ 0x4b5, /* U+0004b5: CYRILLIC SMALL LIGATURE TE TSE*/
+ 0x4b7, /* U+0004b6: CYRILLIC CAPITAL LETTER CHE WITH DESCENDER*/
+ 0x4b7, /* U+0004b7: CYRILLIC SMALL LETTER CHE WITH DESCENDER*/
+ 0x4b9, /* U+0004b8: CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE*/
+ 0x4b9, /* U+0004b9: CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE*/
+ 0x4bb, /* U+0004ba: CYRILLIC CAPITAL LETTER SHHA*/
+ 0x4bb, /* U+0004bb: CYRILLIC SMALL LETTER SHHA*/
+ 0x4bd, /* U+0004bc: CYRILLIC CAPITAL LETTER ABKHASIAN CHE*/
+ 0x4bd, /* U+0004bd: CYRILLIC SMALL LETTER ABKHASIAN CHE*/
+ 0x4bf, /* U+0004be: CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER*/
+ 0x4bf, /* U+0004bf: CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER*/
+ 0x4cf, /* U+0004c0: CYRILLIC LETTER PALOCHKA*/
+ 0x4c2, /* U+0004c1: CYRILLIC CAPITAL LETTER ZHE WITH BREVE*/
+ 0x4c2, /* U+0004c2: CYRILLIC SMALL LETTER ZHE WITH BREVE*/
+ 0x4c4, /* U+0004c3: CYRILLIC CAPITAL LETTER KA WITH HOOK*/
+ 0x4c4, /* U+0004c4: CYRILLIC SMALL LETTER KA WITH HOOK*/
+ 0x4c6, /* U+0004c5: CYRILLIC CAPITAL LETTER EL WITH TAIL*/
+ 0x4c6, /* U+0004c6: CYRILLIC SMALL LETTER EL WITH TAIL*/
+ 0x4c8, /* U+0004c7: CYRILLIC CAPITAL LETTER EN WITH HOOK*/
+ 0x4c8, /* U+0004c8: CYRILLIC SMALL LETTER EN WITH HOOK*/
+ 0x4ca, /* U+0004c9: CYRILLIC CAPITAL LETTER EN WITH TAIL*/
+ 0x4ca, /* U+0004ca: CYRILLIC SMALL LETTER EN WITH TAIL*/
+ 0x4cc, /* U+0004cb: CYRILLIC CAPITAL LETTER KHAKASSIAN CHE*/
+ 0x4cc, /* U+0004cc: CYRILLIC SMALL LETTER KHAKASSIAN CHE*/
+ 0x4ce, /* U+0004cd: CYRILLIC CAPITAL LETTER EM WITH TAIL*/
+ 0x4ce, /* U+0004ce: CYRILLIC SMALL LETTER EM WITH TAIL*/
+ 0x4cf, /* U+0004cf: CYRILLIC SMALL LETTER PALOCHKA*/
+ 0x4d1, /* U+0004d0: CYRILLIC CAPITAL LETTER A WITH BREVE*/
+ 0x4d1, /* U+0004d1: CYRILLIC SMALL LETTER A WITH BREVE*/
+ 0x4d3, /* U+0004d2: CYRILLIC CAPITAL LETTER A WITH DIAERESIS*/
+ 0x4d3, /* U+0004d3: CYRILLIC SMALL LETTER A WITH DIAERESIS*/
+ 0x4d5, /* U+0004d4: CYRILLIC CAPITAL LIGATURE A IE*/
+ 0x4d5, /* U+0004d5: CYRILLIC SMALL LIGATURE A IE*/
+ 0x4d7, /* U+0004d6: CYRILLIC CAPITAL LETTER IE WITH BREVE*/
+ 0x4d7, /* U+0004d7: CYRILLIC SMALL LETTER IE WITH BREVE*/
+ 0x4d9, /* U+0004d8: CYRILLIC CAPITAL LETTER SCHWA*/
+ 0x4d9, /* U+0004d9: CYRILLIC SMALL LETTER SCHWA*/
+ 0x4db, /* U+0004da: CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS*/
+ 0x4db, /* U+0004db: CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS*/
+ 0x4dd, /* U+0004dc: CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS*/
+ 0x4dd, /* U+0004dd: CYRILLIC SMALL LETTER ZHE WITH DIAERESIS*/
+ 0x4df, /* U+0004de: CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS*/
+ 0x4df, /* U+0004df: CYRILLIC SMALL LETTER ZE WITH DIAERESIS*/
+ 0x4e1, /* U+0004e0: CYRILLIC CAPITAL LETTER ABKHASIAN DZE*/
+ 0x4e1, /* U+0004e1: CYRILLIC SMALL LETTER ABKHASIAN DZE*/
+ 0x4e3, /* U+0004e2: CYRILLIC CAPITAL LETTER I WITH MACRON*/
+ 0x4e3, /* U+0004e3: CYRILLIC SMALL LETTER I WITH MACRON*/
+ 0x4e5, /* U+0004e4: CYRILLIC CAPITAL LETTER I WITH DIAERESIS*/
+ 0x4e5, /* U+0004e5: CYRILLIC SMALL LETTER I WITH DIAERESIS*/
+ 0x4e7, /* U+0004e6: CYRILLIC CAPITAL LETTER O WITH DIAERESIS*/
+ 0x4e7, /* U+0004e7: CYRILLIC SMALL LETTER O WITH DIAERESIS*/
+ 0x4e9, /* U+0004e8: CYRILLIC CAPITAL LETTER BARRED O*/
+ 0x4e9, /* U+0004e9: CYRILLIC SMALL LETTER BARRED O*/
+ 0x4eb, /* U+0004ea: CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS*/
+ 0x4eb, /* U+0004eb: CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS*/
+ 0x4ed, /* U+0004ec: CYRILLIC CAPITAL LETTER E WITH DIAERESIS*/
+ 0x4ed, /* U+0004ed: CYRILLIC SMALL LETTER E WITH DIAERESIS*/
+ 0x4ef, /* U+0004ee: CYRILLIC CAPITAL LETTER U WITH MACRON*/
+ 0x4ef, /* U+0004ef: CYRILLIC SMALL LETTER U WITH MACRON*/
+ 0x4f1, /* U+0004f0: CYRILLIC CAPITAL LETTER U WITH DIAERESIS*/
+ 0x4f1, /* U+0004f1: CYRILLIC SMALL LETTER U WITH DIAERESIS*/
+ 0x4f3, /* U+0004f2: CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE*/
+ 0x4f3, /* U+0004f3: CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE*/
+ 0x4f5, /* U+0004f4: CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS*/
+ 0x4f5, /* U+0004f5: CYRILLIC SMALL LETTER CHE WITH DIAERESIS*/
+ 0x4f7, /* U+0004f6: CYRILLIC CAPITAL LETTER GHE WITH DESCENDER*/
+ 0x4f7, /* U+0004f7: CYRILLIC SMALL LETTER GHE WITH DESCENDER*/
+ 0x4f9, /* U+0004f8: CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS*/
+ 0x4f9, /* U+0004f9: CYRILLIC SMALL LETTER YERU WITH DIAERESIS*/
+ 0x4fb, /* U+0004fa: CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK*/
+ 0x4fb, /* U+0004fb: CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK*/
+ 0x4fd, /* U+0004fc: CYRILLIC CAPITAL LETTER HA WITH HOOK*/
+ 0x4fd, /* U+0004fd: CYRILLIC SMALL LETTER HA WITH HOOK*/
+ 0x4ff, /* U+0004fe: CYRILLIC CAPITAL LETTER HA WITH STROKE*/
+ 0x4ff, /* U+0004ff: CYRILLIC SMALL LETTER HA WITH STROKE*/
+ 0x501, /* U+000500: CYRILLIC CAPITAL LETTER KOMI DE*/
+ 0x501, /* U+000501: CYRILLIC SMALL LETTER KOMI DE*/
+ 0x503, /* U+000502: CYRILLIC CAPITAL LETTER KOMI DJE*/
+ 0x503, /* U+000503: CYRILLIC SMALL LETTER KOMI DJE*/
+ 0x505, /* U+000504: CYRILLIC CAPITAL LETTER KOMI ZJE*/
+ 0x505, /* U+000505: CYRILLIC SMALL LETTER KOMI ZJE*/
+ 0x507, /* U+000506: CYRILLIC CAPITAL LETTER KOMI DZJE*/
+ 0x507, /* U+000507: CYRILLIC SMALL LETTER KOMI DZJE*/
+ 0x509, /* U+000508: CYRILLIC CAPITAL LETTER KOMI LJE*/
+ 0x509, /* U+000509: CYRILLIC SMALL LETTER KOMI LJE*/
+ 0x50b, /* U+00050a: CYRILLIC CAPITAL LETTER KOMI NJE*/
+ 0x50b, /* U+00050b: CYRILLIC SMALL LETTER KOMI NJE*/
+ 0x50d, /* U+00050c: CYRILLIC CAPITAL LETTER KOMI SJE*/
+ 0x50d, /* U+00050d: CYRILLIC SMALL LETTER KOMI SJE*/
+ 0x50f, /* U+00050e: CYRILLIC CAPITAL LETTER KOMI TJE*/
+ 0x50f, /* U+00050f: CYRILLIC SMALL LETTER KOMI TJE*/
+ 0x511, /* U+000510: CYRILLIC CAPITAL LETTER REVERSED ZE*/
+ 0x511, /* U+000511: CYRILLIC SMALL LETTER REVERSED ZE*/
+ 0x513, /* U+000512: CYRILLIC CAPITAL LETTER EL WITH HOOK*/
+ 0x513, /* U+000513: CYRILLIC SMALL LETTER EL WITH HOOK*/
+ 0x515, /* U+000514: CYRILLIC CAPITAL LETTER LHA*/
+ 0x515, /* U+000515: CYRILLIC SMALL LETTER LHA*/
+ 0x517, /* U+000516: CYRILLIC CAPITAL LETTER RHA*/
+ 0x517, /* U+000517: CYRILLIC SMALL LETTER RHA*/
+ 0x519, /* U+000518: CYRILLIC CAPITAL LETTER YAE*/
+ 0x519, /* U+000519: CYRILLIC SMALL LETTER YAE*/
+ 0x51b, /* U+00051a: CYRILLIC CAPITAL LETTER QA*/
+ 0x51b, /* U+00051b: CYRILLIC SMALL LETTER QA*/
+ 0x51d, /* U+00051c: CYRILLIC CAPITAL LETTER WE*/
+ 0x51d, /* U+00051d: CYRILLIC SMALL LETTER WE*/
+ 0x51f, /* U+00051e: CYRILLIC CAPITAL LETTER ALEUT KA*/
+ 0x51f, /* U+00051f: CYRILLIC SMALL LETTER ALEUT KA*/
+ 0x521, /* U+000520: CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK*/
+ 0x521, /* U+000521: CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK*/
+ 0x523, /* U+000522: CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK*/
+ 0x523, /* U+000523: CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK*/
+ 0x525, /* U+000524: CYRILLIC CAPITAL LETTER PE WITH DESCENDER*/
+ 0x525, /* U+000525: CYRILLIC SMALL LETTER PE WITH DESCENDER*/
+ 0x527, /* U+000526: CYRILLIC CAPITAL LETTER SHHA WITH DESCENDER*/
+ 0x527, /* U+000527: CYRILLIC SMALL LETTER SHHA WITH DESCENDER*/
+ 0x528, /* U+000528: */
+ 0x529, /* U+000529: */
+ 0x52a, /* U+00052a: */
+ 0x52b, /* U+00052b: */
+ 0x52c, /* U+00052c: */
+ 0x52d, /* U+00052d: */
+ 0x52e, /* U+00052e: */
+ 0x52f, /* U+00052f: */
+ 0x530, /* U+000530: */
+ 0x561, /* U+000531: ARMENIAN CAPITAL LETTER AYB*/
+ 0x562, /* U+000532: ARMENIAN CAPITAL LETTER BEN*/
+ 0x563, /* U+000533: ARMENIAN CAPITAL LETTER GIM*/
+ 0x564, /* U+000534: ARMENIAN CAPITAL LETTER DA*/
+ 0x565, /* U+000535: ARMENIAN CAPITAL LETTER ECH*/
+ 0x566, /* U+000536: ARMENIAN CAPITAL LETTER ZA*/
+ 0x567, /* U+000537: ARMENIAN CAPITAL LETTER EH*/
+ 0x568, /* U+000538: ARMENIAN CAPITAL LETTER ET*/
+ 0x569, /* U+000539: ARMENIAN CAPITAL LETTER TO*/
+ 0x56a, /* U+00053a: ARMENIAN CAPITAL LETTER ZHE*/
+ 0x56b, /* U+00053b: ARMENIAN CAPITAL LETTER INI*/
+ 0x56c, /* U+00053c: ARMENIAN CAPITAL LETTER LIWN*/
+ 0x56d, /* U+00053d: ARMENIAN CAPITAL LETTER XEH*/
+ 0x56e, /* U+00053e: ARMENIAN CAPITAL LETTER CA*/
+ 0x56f, /* U+00053f: ARMENIAN CAPITAL LETTER KEN*/
+ 0x570, /* U+000540: ARMENIAN CAPITAL LETTER HO*/
+ 0x571, /* U+000541: ARMENIAN CAPITAL LETTER JA*/
+ 0x572, /* U+000542: ARMENIAN CAPITAL LETTER GHAD*/
+ 0x573, /* U+000543: ARMENIAN CAPITAL LETTER CHEH*/
+ 0x574, /* U+000544: ARMENIAN CAPITAL LETTER MEN*/
+ 0x575, /* U+000545: ARMENIAN CAPITAL LETTER YI*/
+ 0x576, /* U+000546: ARMENIAN CAPITAL LETTER NOW*/
+ 0x577, /* U+000547: ARMENIAN CAPITAL LETTER SHA*/
+ 0x578, /* U+000548: ARMENIAN CAPITAL LETTER VO*/
+ 0x579, /* U+000549: ARMENIAN CAPITAL LETTER CHA*/
+ 0x57a, /* U+00054a: ARMENIAN CAPITAL LETTER PEH*/
+ 0x57b, /* U+00054b: ARMENIAN CAPITAL LETTER JHEH*/
+ 0x57c, /* U+00054c: ARMENIAN CAPITAL LETTER RA*/
+ 0x57d, /* U+00054d: ARMENIAN CAPITAL LETTER SEH*/
+ 0x57e, /* U+00054e: ARMENIAN CAPITAL LETTER VEW*/
+ 0x57f, /* U+00054f: ARMENIAN CAPITAL LETTER TIWN*/
+ 0x580, /* U+000550: ARMENIAN CAPITAL LETTER REH*/
+ 0x581, /* U+000551: ARMENIAN CAPITAL LETTER CO*/
+ 0x582, /* U+000552: ARMENIAN CAPITAL LETTER YIWN*/
+ 0x583, /* U+000553: ARMENIAN CAPITAL LETTER PIWR*/
+ 0x584, /* U+000554: ARMENIAN CAPITAL LETTER KEH*/
+ 0x585, /* U+000555: ARMENIAN CAPITAL LETTER OH*/
+ 0x586, /* U+000556: ARMENIAN CAPITAL LETTER FEH*/
+};
+
+static const RTUNICP g_afRTUniLower0x0010a0[] =
+{
+ 0x2d00, /* U+0010a0: GEORGIAN CAPITAL LETTER AN*/
+ 0x2d01, /* U+0010a1: GEORGIAN CAPITAL LETTER BAN*/
+ 0x2d02, /* U+0010a2: GEORGIAN CAPITAL LETTER GAN*/
+ 0x2d03, /* U+0010a3: GEORGIAN CAPITAL LETTER DON*/
+ 0x2d04, /* U+0010a4: GEORGIAN CAPITAL LETTER EN*/
+ 0x2d05, /* U+0010a5: GEORGIAN CAPITAL LETTER VIN*/
+ 0x2d06, /* U+0010a6: GEORGIAN CAPITAL LETTER ZEN*/
+ 0x2d07, /* U+0010a7: GEORGIAN CAPITAL LETTER TAN*/
+ 0x2d08, /* U+0010a8: GEORGIAN CAPITAL LETTER IN*/
+ 0x2d09, /* U+0010a9: GEORGIAN CAPITAL LETTER KAN*/
+ 0x2d0a, /* U+0010aa: GEORGIAN CAPITAL LETTER LAS*/
+ 0x2d0b, /* U+0010ab: GEORGIAN CAPITAL LETTER MAN*/
+ 0x2d0c, /* U+0010ac: GEORGIAN CAPITAL LETTER NAR*/
+ 0x2d0d, /* U+0010ad: GEORGIAN CAPITAL LETTER ON*/
+ 0x2d0e, /* U+0010ae: GEORGIAN CAPITAL LETTER PAR*/
+ 0x2d0f, /* U+0010af: GEORGIAN CAPITAL LETTER ZHAR*/
+ 0x2d10, /* U+0010b0: GEORGIAN CAPITAL LETTER RAE*/
+ 0x2d11, /* U+0010b1: GEORGIAN CAPITAL LETTER SAN*/
+ 0x2d12, /* U+0010b2: GEORGIAN CAPITAL LETTER TAR*/
+ 0x2d13, /* U+0010b3: GEORGIAN CAPITAL LETTER UN*/
+ 0x2d14, /* U+0010b4: GEORGIAN CAPITAL LETTER PHAR*/
+ 0x2d15, /* U+0010b5: GEORGIAN CAPITAL LETTER KHAR*/
+ 0x2d16, /* U+0010b6: GEORGIAN CAPITAL LETTER GHAN*/
+ 0x2d17, /* U+0010b7: GEORGIAN CAPITAL LETTER QAR*/
+ 0x2d18, /* U+0010b8: GEORGIAN CAPITAL LETTER SHIN*/
+ 0x2d19, /* U+0010b9: GEORGIAN CAPITAL LETTER CHIN*/
+ 0x2d1a, /* U+0010ba: GEORGIAN CAPITAL LETTER CAN*/
+ 0x2d1b, /* U+0010bb: GEORGIAN CAPITAL LETTER JIL*/
+ 0x2d1c, /* U+0010bc: GEORGIAN CAPITAL LETTER CIL*/
+ 0x2d1d, /* U+0010bd: GEORGIAN CAPITAL LETTER CHAR*/
+ 0x2d1e, /* U+0010be: GEORGIAN CAPITAL LETTER XAN*/
+ 0x2d1f, /* U+0010bf: GEORGIAN CAPITAL LETTER JHAN*/
+ 0x2d20, /* U+0010c0: GEORGIAN CAPITAL LETTER HAE*/
+ 0x2d21, /* U+0010c1: GEORGIAN CAPITAL LETTER HE*/
+ 0x2d22, /* U+0010c2: GEORGIAN CAPITAL LETTER HIE*/
+ 0x2d23, /* U+0010c3: GEORGIAN CAPITAL LETTER WE*/
+ 0x2d24, /* U+0010c4: GEORGIAN CAPITAL LETTER HAR*/
+ 0x2d25, /* U+0010c5: GEORGIAN CAPITAL LETTER HOE*/
+ 0x10c6, /* U+0010c6: */
+ 0x2d27, /* U+0010c7: GEORGIAN CAPITAL LETTER YN*/
+ 0x10c8, /* U+0010c8: */
+ 0x10c9, /* U+0010c9: */
+ 0x10ca, /* U+0010ca: */
+ 0x10cb, /* U+0010cb: */
+ 0x10cc, /* U+0010cc: */
+ 0x2d2d, /* U+0010cd: GEORGIAN CAPITAL LETTER AEN*/
+};
+
+static const RTUNICP g_afRTUniLower0x001e00[] =
+{
+ 0x1e01, /* U+001e00: LATIN CAPITAL LETTER A WITH RING BELOW*/
+ 0x1e01, /* U+001e01: LATIN SMALL LETTER A WITH RING BELOW*/
+ 0x1e03, /* U+001e02: LATIN CAPITAL LETTER B WITH DOT ABOVE*/
+ 0x1e03, /* U+001e03: LATIN SMALL LETTER B WITH DOT ABOVE*/
+ 0x1e05, /* U+001e04: LATIN CAPITAL LETTER B WITH DOT BELOW*/
+ 0x1e05, /* U+001e05: LATIN SMALL LETTER B WITH DOT BELOW*/
+ 0x1e07, /* U+001e06: LATIN CAPITAL LETTER B WITH LINE BELOW*/
+ 0x1e07, /* U+001e07: LATIN SMALL LETTER B WITH LINE BELOW*/
+ 0x1e09, /* U+001e08: LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE*/
+ 0x1e09, /* U+001e09: LATIN SMALL LETTER C WITH CEDILLA AND ACUTE*/
+ 0x1e0b, /* U+001e0a: LATIN CAPITAL LETTER D WITH DOT ABOVE*/
+ 0x1e0b, /* U+001e0b: LATIN SMALL LETTER D WITH DOT ABOVE*/
+ 0x1e0d, /* U+001e0c: LATIN CAPITAL LETTER D WITH DOT BELOW*/
+ 0x1e0d, /* U+001e0d: LATIN SMALL LETTER D WITH DOT BELOW*/
+ 0x1e0f, /* U+001e0e: LATIN CAPITAL LETTER D WITH LINE BELOW*/
+ 0x1e0f, /* U+001e0f: LATIN SMALL LETTER D WITH LINE BELOW*/
+ 0x1e11, /* U+001e10: LATIN CAPITAL LETTER D WITH CEDILLA*/
+ 0x1e11, /* U+001e11: LATIN SMALL LETTER D WITH CEDILLA*/
+ 0x1e13, /* U+001e12: LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW*/
+ 0x1e13, /* U+001e13: LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW*/
+ 0x1e15, /* U+001e14: LATIN CAPITAL LETTER E WITH MACRON AND GRAVE*/
+ 0x1e15, /* U+001e15: LATIN SMALL LETTER E WITH MACRON AND GRAVE*/
+ 0x1e17, /* U+001e16: LATIN CAPITAL LETTER E WITH MACRON AND ACUTE*/
+ 0x1e17, /* U+001e17: LATIN SMALL LETTER E WITH MACRON AND ACUTE*/
+ 0x1e19, /* U+001e18: LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW*/
+ 0x1e19, /* U+001e19: LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW*/
+ 0x1e1b, /* U+001e1a: LATIN CAPITAL LETTER E WITH TILDE BELOW*/
+ 0x1e1b, /* U+001e1b: LATIN SMALL LETTER E WITH TILDE BELOW*/
+ 0x1e1d, /* U+001e1c: LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE*/
+ 0x1e1d, /* U+001e1d: LATIN SMALL LETTER E WITH CEDILLA AND BREVE*/
+ 0x1e1f, /* U+001e1e: LATIN CAPITAL LETTER F WITH DOT ABOVE*/
+ 0x1e1f, /* U+001e1f: LATIN SMALL LETTER F WITH DOT ABOVE*/
+ 0x1e21, /* U+001e20: LATIN CAPITAL LETTER G WITH MACRON*/
+ 0x1e21, /* U+001e21: LATIN SMALL LETTER G WITH MACRON*/
+ 0x1e23, /* U+001e22: LATIN CAPITAL LETTER H WITH DOT ABOVE*/
+ 0x1e23, /* U+001e23: LATIN SMALL LETTER H WITH DOT ABOVE*/
+ 0x1e25, /* U+001e24: LATIN CAPITAL LETTER H WITH DOT BELOW*/
+ 0x1e25, /* U+001e25: LATIN SMALL LETTER H WITH DOT BELOW*/
+ 0x1e27, /* U+001e26: LATIN CAPITAL LETTER H WITH DIAERESIS*/
+ 0x1e27, /* U+001e27: LATIN SMALL LETTER H WITH DIAERESIS*/
+ 0x1e29, /* U+001e28: LATIN CAPITAL LETTER H WITH CEDILLA*/
+ 0x1e29, /* U+001e29: LATIN SMALL LETTER H WITH CEDILLA*/
+ 0x1e2b, /* U+001e2a: LATIN CAPITAL LETTER H WITH BREVE BELOW*/
+ 0x1e2b, /* U+001e2b: LATIN SMALL LETTER H WITH BREVE BELOW*/
+ 0x1e2d, /* U+001e2c: LATIN CAPITAL LETTER I WITH TILDE BELOW*/
+ 0x1e2d, /* U+001e2d: LATIN SMALL LETTER I WITH TILDE BELOW*/
+ 0x1e2f, /* U+001e2e: LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE*/
+ 0x1e2f, /* U+001e2f: LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE*/
+ 0x1e31, /* U+001e30: LATIN CAPITAL LETTER K WITH ACUTE*/
+ 0x1e31, /* U+001e31: LATIN SMALL LETTER K WITH ACUTE*/
+ 0x1e33, /* U+001e32: LATIN CAPITAL LETTER K WITH DOT BELOW*/
+ 0x1e33, /* U+001e33: LATIN SMALL LETTER K WITH DOT BELOW*/
+ 0x1e35, /* U+001e34: LATIN CAPITAL LETTER K WITH LINE BELOW*/
+ 0x1e35, /* U+001e35: LATIN SMALL LETTER K WITH LINE BELOW*/
+ 0x1e37, /* U+001e36: LATIN CAPITAL LETTER L WITH DOT BELOW*/
+ 0x1e37, /* U+001e37: LATIN SMALL LETTER L WITH DOT BELOW*/
+ 0x1e39, /* U+001e38: LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON*/
+ 0x1e39, /* U+001e39: LATIN SMALL LETTER L WITH DOT BELOW AND MACRON*/
+ 0x1e3b, /* U+001e3a: LATIN CAPITAL LETTER L WITH LINE BELOW*/
+ 0x1e3b, /* U+001e3b: LATIN SMALL LETTER L WITH LINE BELOW*/
+ 0x1e3d, /* U+001e3c: LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW*/
+ 0x1e3d, /* U+001e3d: LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW*/
+ 0x1e3f, /* U+001e3e: LATIN CAPITAL LETTER M WITH ACUTE*/
+ 0x1e3f, /* U+001e3f: LATIN SMALL LETTER M WITH ACUTE*/
+ 0x1e41, /* U+001e40: LATIN CAPITAL LETTER M WITH DOT ABOVE*/
+ 0x1e41, /* U+001e41: LATIN SMALL LETTER M WITH DOT ABOVE*/
+ 0x1e43, /* U+001e42: LATIN CAPITAL LETTER M WITH DOT BELOW*/
+ 0x1e43, /* U+001e43: LATIN SMALL LETTER M WITH DOT BELOW*/
+ 0x1e45, /* U+001e44: LATIN CAPITAL LETTER N WITH DOT ABOVE*/
+ 0x1e45, /* U+001e45: LATIN SMALL LETTER N WITH DOT ABOVE*/
+ 0x1e47, /* U+001e46: LATIN CAPITAL LETTER N WITH DOT BELOW*/
+ 0x1e47, /* U+001e47: LATIN SMALL LETTER N WITH DOT BELOW*/
+ 0x1e49, /* U+001e48: LATIN CAPITAL LETTER N WITH LINE BELOW*/
+ 0x1e49, /* U+001e49: LATIN SMALL LETTER N WITH LINE BELOW*/
+ 0x1e4b, /* U+001e4a: LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW*/
+ 0x1e4b, /* U+001e4b: LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW*/
+ 0x1e4d, /* U+001e4c: LATIN CAPITAL LETTER O WITH TILDE AND ACUTE*/
+ 0x1e4d, /* U+001e4d: LATIN SMALL LETTER O WITH TILDE AND ACUTE*/
+ 0x1e4f, /* U+001e4e: LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS*/
+ 0x1e4f, /* U+001e4f: LATIN SMALL LETTER O WITH TILDE AND DIAERESIS*/
+ 0x1e51, /* U+001e50: LATIN CAPITAL LETTER O WITH MACRON AND GRAVE*/
+ 0x1e51, /* U+001e51: LATIN SMALL LETTER O WITH MACRON AND GRAVE*/
+ 0x1e53, /* U+001e52: LATIN CAPITAL LETTER O WITH MACRON AND ACUTE*/
+ 0x1e53, /* U+001e53: LATIN SMALL LETTER O WITH MACRON AND ACUTE*/
+ 0x1e55, /* U+001e54: LATIN CAPITAL LETTER P WITH ACUTE*/
+ 0x1e55, /* U+001e55: LATIN SMALL LETTER P WITH ACUTE*/
+ 0x1e57, /* U+001e56: LATIN CAPITAL LETTER P WITH DOT ABOVE*/
+ 0x1e57, /* U+001e57: LATIN SMALL LETTER P WITH DOT ABOVE*/
+ 0x1e59, /* U+001e58: LATIN CAPITAL LETTER R WITH DOT ABOVE*/
+ 0x1e59, /* U+001e59: LATIN SMALL LETTER R WITH DOT ABOVE*/
+ 0x1e5b, /* U+001e5a: LATIN CAPITAL LETTER R WITH DOT BELOW*/
+ 0x1e5b, /* U+001e5b: LATIN SMALL LETTER R WITH DOT BELOW*/
+ 0x1e5d, /* U+001e5c: LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON*/
+ 0x1e5d, /* U+001e5d: LATIN SMALL LETTER R WITH DOT BELOW AND MACRON*/
+ 0x1e5f, /* U+001e5e: LATIN CAPITAL LETTER R WITH LINE BELOW*/
+ 0x1e5f, /* U+001e5f: LATIN SMALL LETTER R WITH LINE BELOW*/
+ 0x1e61, /* U+001e60: LATIN CAPITAL LETTER S WITH DOT ABOVE*/
+ 0x1e61, /* U+001e61: LATIN SMALL LETTER S WITH DOT ABOVE*/
+ 0x1e63, /* U+001e62: LATIN CAPITAL LETTER S WITH DOT BELOW*/
+ 0x1e63, /* U+001e63: LATIN SMALL LETTER S WITH DOT BELOW*/
+ 0x1e65, /* U+001e64: LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE*/
+ 0x1e65, /* U+001e65: LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE*/
+ 0x1e67, /* U+001e66: LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE*/
+ 0x1e67, /* U+001e67: LATIN SMALL LETTER S WITH CARON AND DOT ABOVE*/
+ 0x1e69, /* U+001e68: LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE*/
+ 0x1e69, /* U+001e69: LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE*/
+ 0x1e6b, /* U+001e6a: LATIN CAPITAL LETTER T WITH DOT ABOVE*/
+ 0x1e6b, /* U+001e6b: LATIN SMALL LETTER T WITH DOT ABOVE*/
+ 0x1e6d, /* U+001e6c: LATIN CAPITAL LETTER T WITH DOT BELOW*/
+ 0x1e6d, /* U+001e6d: LATIN SMALL LETTER T WITH DOT BELOW*/
+ 0x1e6f, /* U+001e6e: LATIN CAPITAL LETTER T WITH LINE BELOW*/
+ 0x1e6f, /* U+001e6f: LATIN SMALL LETTER T WITH LINE BELOW*/
+ 0x1e71, /* U+001e70: LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW*/
+ 0x1e71, /* U+001e71: LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW*/
+ 0x1e73, /* U+001e72: LATIN CAPITAL LETTER U WITH DIAERESIS BELOW*/
+ 0x1e73, /* U+001e73: LATIN SMALL LETTER U WITH DIAERESIS BELOW*/
+ 0x1e75, /* U+001e74: LATIN CAPITAL LETTER U WITH TILDE BELOW*/
+ 0x1e75, /* U+001e75: LATIN SMALL LETTER U WITH TILDE BELOW*/
+ 0x1e77, /* U+001e76: LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW*/
+ 0x1e77, /* U+001e77: LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW*/
+ 0x1e79, /* U+001e78: LATIN CAPITAL LETTER U WITH TILDE AND ACUTE*/
+ 0x1e79, /* U+001e79: LATIN SMALL LETTER U WITH TILDE AND ACUTE*/
+ 0x1e7b, /* U+001e7a: LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS*/
+ 0x1e7b, /* U+001e7b: LATIN SMALL LETTER U WITH MACRON AND DIAERESIS*/
+ 0x1e7d, /* U+001e7c: LATIN CAPITAL LETTER V WITH TILDE*/
+ 0x1e7d, /* U+001e7d: LATIN SMALL LETTER V WITH TILDE*/
+ 0x1e7f, /* U+001e7e: LATIN CAPITAL LETTER V WITH DOT BELOW*/
+ 0x1e7f, /* U+001e7f: LATIN SMALL LETTER V WITH DOT BELOW*/
+ 0x1e81, /* U+001e80: LATIN CAPITAL LETTER W WITH GRAVE*/
+ 0x1e81, /* U+001e81: LATIN SMALL LETTER W WITH GRAVE*/
+ 0x1e83, /* U+001e82: LATIN CAPITAL LETTER W WITH ACUTE*/
+ 0x1e83, /* U+001e83: LATIN SMALL LETTER W WITH ACUTE*/
+ 0x1e85, /* U+001e84: LATIN CAPITAL LETTER W WITH DIAERESIS*/
+ 0x1e85, /* U+001e85: LATIN SMALL LETTER W WITH DIAERESIS*/
+ 0x1e87, /* U+001e86: LATIN CAPITAL LETTER W WITH DOT ABOVE*/
+ 0x1e87, /* U+001e87: LATIN SMALL LETTER W WITH DOT ABOVE*/
+ 0x1e89, /* U+001e88: LATIN CAPITAL LETTER W WITH DOT BELOW*/
+ 0x1e89, /* U+001e89: LATIN SMALL LETTER W WITH DOT BELOW*/
+ 0x1e8b, /* U+001e8a: LATIN CAPITAL LETTER X WITH DOT ABOVE*/
+ 0x1e8b, /* U+001e8b: LATIN SMALL LETTER X WITH DOT ABOVE*/
+ 0x1e8d, /* U+001e8c: LATIN CAPITAL LETTER X WITH DIAERESIS*/
+ 0x1e8d, /* U+001e8d: LATIN SMALL LETTER X WITH DIAERESIS*/
+ 0x1e8f, /* U+001e8e: LATIN CAPITAL LETTER Y WITH DOT ABOVE*/
+ 0x1e8f, /* U+001e8f: LATIN SMALL LETTER Y WITH DOT ABOVE*/
+ 0x1e91, /* U+001e90: LATIN CAPITAL LETTER Z WITH CIRCUMFLEX*/
+ 0x1e91, /* U+001e91: LATIN SMALL LETTER Z WITH CIRCUMFLEX*/
+ 0x1e93, /* U+001e92: LATIN CAPITAL LETTER Z WITH DOT BELOW*/
+ 0x1e93, /* U+001e93: LATIN SMALL LETTER Z WITH DOT BELOW*/
+ 0x1e95, /* U+001e94: LATIN CAPITAL LETTER Z WITH LINE BELOW*/
+ 0x1e95, /* U+001e95: LATIN SMALL LETTER Z WITH LINE BELOW*/
+ 0x1e96, /* U+001e96: LATIN SMALL LETTER H WITH LINE BELOW*/
+ 0x1e97, /* U+001e97: LATIN SMALL LETTER T WITH DIAERESIS*/
+ 0x1e98, /* U+001e98: LATIN SMALL LETTER W WITH RING ABOVE*/
+ 0x1e99, /* U+001e99: LATIN SMALL LETTER Y WITH RING ABOVE*/
+ 0x1e9a, /* U+001e9a: LATIN SMALL LETTER A WITH RIGHT HALF RING*/
+ 0x1e9b, /* U+001e9b: LATIN SMALL LETTER LONG S WITH DOT ABOVE*/
+ 0x1e9c, /* U+001e9c: LATIN SMALL LETTER LONG S WITH DIAGONAL STROKE*/
+ 0x1e9d, /* U+001e9d: LATIN SMALL LETTER LONG S WITH HIGH STROKE*/
+ 0xdf, /* U+001e9e: LATIN CAPITAL LETTER SHARP S*/
+ 0x1e9f, /* U+001e9f: LATIN SMALL LETTER DELTA*/
+ 0x1ea1, /* U+001ea0: LATIN CAPITAL LETTER A WITH DOT BELOW*/
+ 0x1ea1, /* U+001ea1: LATIN SMALL LETTER A WITH DOT BELOW*/
+ 0x1ea3, /* U+001ea2: LATIN CAPITAL LETTER A WITH HOOK ABOVE*/
+ 0x1ea3, /* U+001ea3: LATIN SMALL LETTER A WITH HOOK ABOVE*/
+ 0x1ea5, /* U+001ea4: LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE*/
+ 0x1ea5, /* U+001ea5: LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE*/
+ 0x1ea7, /* U+001ea6: LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE*/
+ 0x1ea7, /* U+001ea7: LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE*/
+ 0x1ea9, /* U+001ea8: LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE*/
+ 0x1ea9, /* U+001ea9: LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE*/
+ 0x1eab, /* U+001eaa: LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE*/
+ 0x1eab, /* U+001eab: LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE*/
+ 0x1ead, /* U+001eac: LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW*/
+ 0x1ead, /* U+001ead: LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW*/
+ 0x1eaf, /* U+001eae: LATIN CAPITAL LETTER A WITH BREVE AND ACUTE*/
+ 0x1eaf, /* U+001eaf: LATIN SMALL LETTER A WITH BREVE AND ACUTE*/
+ 0x1eb1, /* U+001eb0: LATIN CAPITAL LETTER A WITH BREVE AND GRAVE*/
+ 0x1eb1, /* U+001eb1: LATIN SMALL LETTER A WITH BREVE AND GRAVE*/
+ 0x1eb3, /* U+001eb2: LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE*/
+ 0x1eb3, /* U+001eb3: LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE*/
+ 0x1eb5, /* U+001eb4: LATIN CAPITAL LETTER A WITH BREVE AND TILDE*/
+ 0x1eb5, /* U+001eb5: LATIN SMALL LETTER A WITH BREVE AND TILDE*/
+ 0x1eb7, /* U+001eb6: LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW*/
+ 0x1eb7, /* U+001eb7: LATIN SMALL LETTER A WITH BREVE AND DOT BELOW*/
+ 0x1eb9, /* U+001eb8: LATIN CAPITAL LETTER E WITH DOT BELOW*/
+ 0x1eb9, /* U+001eb9: LATIN SMALL LETTER E WITH DOT BELOW*/
+ 0x1ebb, /* U+001eba: LATIN CAPITAL LETTER E WITH HOOK ABOVE*/
+ 0x1ebb, /* U+001ebb: LATIN SMALL LETTER E WITH HOOK ABOVE*/
+ 0x1ebd, /* U+001ebc: LATIN CAPITAL LETTER E WITH TILDE*/
+ 0x1ebd, /* U+001ebd: LATIN SMALL LETTER E WITH TILDE*/
+ 0x1ebf, /* U+001ebe: LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE*/
+ 0x1ebf, /* U+001ebf: LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE*/
+ 0x1ec1, /* U+001ec0: LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE*/
+ 0x1ec1, /* U+001ec1: LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE*/
+ 0x1ec3, /* U+001ec2: LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE*/
+ 0x1ec3, /* U+001ec3: LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE*/
+ 0x1ec5, /* U+001ec4: LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE*/
+ 0x1ec5, /* U+001ec5: LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE*/
+ 0x1ec7, /* U+001ec6: LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW*/
+ 0x1ec7, /* U+001ec7: LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW*/
+ 0x1ec9, /* U+001ec8: LATIN CAPITAL LETTER I WITH HOOK ABOVE*/
+ 0x1ec9, /* U+001ec9: LATIN SMALL LETTER I WITH HOOK ABOVE*/
+ 0x1ecb, /* U+001eca: LATIN CAPITAL LETTER I WITH DOT BELOW*/
+ 0x1ecb, /* U+001ecb: LATIN SMALL LETTER I WITH DOT BELOW*/
+ 0x1ecd, /* U+001ecc: LATIN CAPITAL LETTER O WITH DOT BELOW*/
+ 0x1ecd, /* U+001ecd: LATIN SMALL LETTER O WITH DOT BELOW*/
+ 0x1ecf, /* U+001ece: LATIN CAPITAL LETTER O WITH HOOK ABOVE*/
+ 0x1ecf, /* U+001ecf: LATIN SMALL LETTER O WITH HOOK ABOVE*/
+ 0x1ed1, /* U+001ed0: LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE*/
+ 0x1ed1, /* U+001ed1: LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE*/
+ 0x1ed3, /* U+001ed2: LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE*/
+ 0x1ed3, /* U+001ed3: LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE*/
+ 0x1ed5, /* U+001ed4: LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE*/
+ 0x1ed5, /* U+001ed5: LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE*/
+ 0x1ed7, /* U+001ed6: LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE*/
+ 0x1ed7, /* U+001ed7: LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE*/
+ 0x1ed9, /* U+001ed8: LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW*/
+ 0x1ed9, /* U+001ed9: LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW*/
+ 0x1edb, /* U+001eda: LATIN CAPITAL LETTER O WITH HORN AND ACUTE*/
+ 0x1edb, /* U+001edb: LATIN SMALL LETTER O WITH HORN AND ACUTE*/
+ 0x1edd, /* U+001edc: LATIN CAPITAL LETTER O WITH HORN AND GRAVE*/
+ 0x1edd, /* U+001edd: LATIN SMALL LETTER O WITH HORN AND GRAVE*/
+ 0x1edf, /* U+001ede: LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE*/
+ 0x1edf, /* U+001edf: LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE*/
+ 0x1ee1, /* U+001ee0: LATIN CAPITAL LETTER O WITH HORN AND TILDE*/
+ 0x1ee1, /* U+001ee1: LATIN SMALL LETTER O WITH HORN AND TILDE*/
+ 0x1ee3, /* U+001ee2: LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW*/
+ 0x1ee3, /* U+001ee3: LATIN SMALL LETTER O WITH HORN AND DOT BELOW*/
+ 0x1ee5, /* U+001ee4: LATIN CAPITAL LETTER U WITH DOT BELOW*/
+ 0x1ee5, /* U+001ee5: LATIN SMALL LETTER U WITH DOT BELOW*/
+ 0x1ee7, /* U+001ee6: LATIN CAPITAL LETTER U WITH HOOK ABOVE*/
+ 0x1ee7, /* U+001ee7: LATIN SMALL LETTER U WITH HOOK ABOVE*/
+ 0x1ee9, /* U+001ee8: LATIN CAPITAL LETTER U WITH HORN AND ACUTE*/
+ 0x1ee9, /* U+001ee9: LATIN SMALL LETTER U WITH HORN AND ACUTE*/
+ 0x1eeb, /* U+001eea: LATIN CAPITAL LETTER U WITH HORN AND GRAVE*/
+ 0x1eeb, /* U+001eeb: LATIN SMALL LETTER U WITH HORN AND GRAVE*/
+ 0x1eed, /* U+001eec: LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE*/
+ 0x1eed, /* U+001eed: LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE*/
+ 0x1eef, /* U+001eee: LATIN CAPITAL LETTER U WITH HORN AND TILDE*/
+ 0x1eef, /* U+001eef: LATIN SMALL LETTER U WITH HORN AND TILDE*/
+ 0x1ef1, /* U+001ef0: LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW*/
+ 0x1ef1, /* U+001ef1: LATIN SMALL LETTER U WITH HORN AND DOT BELOW*/
+ 0x1ef3, /* U+001ef2: LATIN CAPITAL LETTER Y WITH GRAVE*/
+ 0x1ef3, /* U+001ef3: LATIN SMALL LETTER Y WITH GRAVE*/
+ 0x1ef5, /* U+001ef4: LATIN CAPITAL LETTER Y WITH DOT BELOW*/
+ 0x1ef5, /* U+001ef5: LATIN SMALL LETTER Y WITH DOT BELOW*/
+ 0x1ef7, /* U+001ef6: LATIN CAPITAL LETTER Y WITH HOOK ABOVE*/
+ 0x1ef7, /* U+001ef7: LATIN SMALL LETTER Y WITH HOOK ABOVE*/
+ 0x1ef9, /* U+001ef8: LATIN CAPITAL LETTER Y WITH TILDE*/
+ 0x1ef9, /* U+001ef9: LATIN SMALL LETTER Y WITH TILDE*/
+ 0x1efb, /* U+001efa: LATIN CAPITAL LETTER MIDDLE-WELSH LL*/
+ 0x1efb, /* U+001efb: LATIN SMALL LETTER MIDDLE-WELSH LL*/
+ 0x1efd, /* U+001efc: LATIN CAPITAL LETTER MIDDLE-WELSH V*/
+ 0x1efd, /* U+001efd: LATIN SMALL LETTER MIDDLE-WELSH V*/
+ 0x1eff, /* U+001efe: LATIN CAPITAL LETTER Y WITH LOOP*/
+ 0x1eff, /* U+001eff: LATIN SMALL LETTER Y WITH LOOP*/
+ 0x1f00, /* U+001f00: GREEK SMALL LETTER ALPHA WITH PSILI*/
+ 0x1f01, /* U+001f01: GREEK SMALL LETTER ALPHA WITH DASIA*/
+ 0x1f02, /* U+001f02: GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA*/
+ 0x1f03, /* U+001f03: GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA*/
+ 0x1f04, /* U+001f04: GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA*/
+ 0x1f05, /* U+001f05: GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA*/
+ 0x1f06, /* U+001f06: GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI*/
+ 0x1f07, /* U+001f07: GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI*/
+ 0x1f00, /* U+001f08: GREEK CAPITAL LETTER ALPHA WITH PSILI*/
+ 0x1f01, /* U+001f09: GREEK CAPITAL LETTER ALPHA WITH DASIA*/
+ 0x1f02, /* U+001f0a: GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA*/
+ 0x1f03, /* U+001f0b: GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA*/
+ 0x1f04, /* U+001f0c: GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA*/
+ 0x1f05, /* U+001f0d: GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA*/
+ 0x1f06, /* U+001f0e: GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI*/
+ 0x1f07, /* U+001f0f: GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI*/
+ 0x1f10, /* U+001f10: GREEK SMALL LETTER EPSILON WITH PSILI*/
+ 0x1f11, /* U+001f11: GREEK SMALL LETTER EPSILON WITH DASIA*/
+ 0x1f12, /* U+001f12: GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA*/
+ 0x1f13, /* U+001f13: GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA*/
+ 0x1f14, /* U+001f14: GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA*/
+ 0x1f15, /* U+001f15: GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA*/
+ 0x1f16, /* U+001f16: */
+ 0x1f17, /* U+001f17: */
+ 0x1f10, /* U+001f18: GREEK CAPITAL LETTER EPSILON WITH PSILI*/
+ 0x1f11, /* U+001f19: GREEK CAPITAL LETTER EPSILON WITH DASIA*/
+ 0x1f12, /* U+001f1a: GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA*/
+ 0x1f13, /* U+001f1b: GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA*/
+ 0x1f14, /* U+001f1c: GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA*/
+ 0x1f15, /* U+001f1d: GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA*/
+ 0x1f1e, /* U+001f1e: */
+ 0x1f1f, /* U+001f1f: */
+ 0x1f20, /* U+001f20: GREEK SMALL LETTER ETA WITH PSILI*/
+ 0x1f21, /* U+001f21: GREEK SMALL LETTER ETA WITH DASIA*/
+ 0x1f22, /* U+001f22: GREEK SMALL LETTER ETA WITH PSILI AND VARIA*/
+ 0x1f23, /* U+001f23: GREEK SMALL LETTER ETA WITH DASIA AND VARIA*/
+ 0x1f24, /* U+001f24: GREEK SMALL LETTER ETA WITH PSILI AND OXIA*/
+ 0x1f25, /* U+001f25: GREEK SMALL LETTER ETA WITH DASIA AND OXIA*/
+ 0x1f26, /* U+001f26: GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI*/
+ 0x1f27, /* U+001f27: GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI*/
+ 0x1f20, /* U+001f28: GREEK CAPITAL LETTER ETA WITH PSILI*/
+ 0x1f21, /* U+001f29: GREEK CAPITAL LETTER ETA WITH DASIA*/
+ 0x1f22, /* U+001f2a: GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA*/
+ 0x1f23, /* U+001f2b: GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA*/
+ 0x1f24, /* U+001f2c: GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA*/
+ 0x1f25, /* U+001f2d: GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA*/
+ 0x1f26, /* U+001f2e: GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI*/
+ 0x1f27, /* U+001f2f: GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI*/
+ 0x1f30, /* U+001f30: GREEK SMALL LETTER IOTA WITH PSILI*/
+ 0x1f31, /* U+001f31: GREEK SMALL LETTER IOTA WITH DASIA*/
+ 0x1f32, /* U+001f32: GREEK SMALL LETTER IOTA WITH PSILI AND VARIA*/
+ 0x1f33, /* U+001f33: GREEK SMALL LETTER IOTA WITH DASIA AND VARIA*/
+ 0x1f34, /* U+001f34: GREEK SMALL LETTER IOTA WITH PSILI AND OXIA*/
+ 0x1f35, /* U+001f35: GREEK SMALL LETTER IOTA WITH DASIA AND OXIA*/
+ 0x1f36, /* U+001f36: GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI*/
+ 0x1f37, /* U+001f37: GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI*/
+ 0x1f30, /* U+001f38: GREEK CAPITAL LETTER IOTA WITH PSILI*/
+ 0x1f31, /* U+001f39: GREEK CAPITAL LETTER IOTA WITH DASIA*/
+ 0x1f32, /* U+001f3a: GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA*/
+ 0x1f33, /* U+001f3b: GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA*/
+ 0x1f34, /* U+001f3c: GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA*/
+ 0x1f35, /* U+001f3d: GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA*/
+ 0x1f36, /* U+001f3e: GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI*/
+ 0x1f37, /* U+001f3f: GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI*/
+ 0x1f40, /* U+001f40: GREEK SMALL LETTER OMICRON WITH PSILI*/
+ 0x1f41, /* U+001f41: GREEK SMALL LETTER OMICRON WITH DASIA*/
+ 0x1f42, /* U+001f42: GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA*/
+ 0x1f43, /* U+001f43: GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA*/
+ 0x1f44, /* U+001f44: GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA*/
+ 0x1f45, /* U+001f45: GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA*/
+ 0x1f46, /* U+001f46: */
+ 0x1f47, /* U+001f47: */
+ 0x1f40, /* U+001f48: GREEK CAPITAL LETTER OMICRON WITH PSILI*/
+ 0x1f41, /* U+001f49: GREEK CAPITAL LETTER OMICRON WITH DASIA*/
+ 0x1f42, /* U+001f4a: GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA*/
+ 0x1f43, /* U+001f4b: GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA*/
+ 0x1f44, /* U+001f4c: GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA*/
+ 0x1f45, /* U+001f4d: GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA*/
+ 0x1f4e, /* U+001f4e: */
+ 0x1f4f, /* U+001f4f: */
+ 0x1f50, /* U+001f50: GREEK SMALL LETTER UPSILON WITH PSILI*/
+ 0x1f51, /* U+001f51: GREEK SMALL LETTER UPSILON WITH DASIA*/
+ 0x1f52, /* U+001f52: GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA*/
+ 0x1f53, /* U+001f53: GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA*/
+ 0x1f54, /* U+001f54: GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA*/
+ 0x1f55, /* U+001f55: GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA*/
+ 0x1f56, /* U+001f56: GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI*/
+ 0x1f57, /* U+001f57: GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI*/
+ 0x1f58, /* U+001f58: */
+ 0x1f51, /* U+001f59: GREEK CAPITAL LETTER UPSILON WITH DASIA*/
+ 0x1f5a, /* U+001f5a: */
+ 0x1f53, /* U+001f5b: GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA*/
+ 0x1f5c, /* U+001f5c: */
+ 0x1f55, /* U+001f5d: GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA*/
+ 0x1f5e, /* U+001f5e: */
+ 0x1f57, /* U+001f5f: GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI*/
+ 0x1f60, /* U+001f60: GREEK SMALL LETTER OMEGA WITH PSILI*/
+ 0x1f61, /* U+001f61: GREEK SMALL LETTER OMEGA WITH DASIA*/
+ 0x1f62, /* U+001f62: GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA*/
+ 0x1f63, /* U+001f63: GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA*/
+ 0x1f64, /* U+001f64: GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA*/
+ 0x1f65, /* U+001f65: GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA*/
+ 0x1f66, /* U+001f66: GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI*/
+ 0x1f67, /* U+001f67: GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI*/
+ 0x1f60, /* U+001f68: GREEK CAPITAL LETTER OMEGA WITH PSILI*/
+ 0x1f61, /* U+001f69: GREEK CAPITAL LETTER OMEGA WITH DASIA*/
+ 0x1f62, /* U+001f6a: GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA*/
+ 0x1f63, /* U+001f6b: GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA*/
+ 0x1f64, /* U+001f6c: GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA*/
+ 0x1f65, /* U+001f6d: GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA*/
+ 0x1f66, /* U+001f6e: GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI*/
+ 0x1f67, /* U+001f6f: GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI*/
+ 0x1f70, /* U+001f70: GREEK SMALL LETTER ALPHA WITH VARIA*/
+ 0x1f71, /* U+001f71: GREEK SMALL LETTER ALPHA WITH OXIA*/
+ 0x1f72, /* U+001f72: GREEK SMALL LETTER EPSILON WITH VARIA*/
+ 0x1f73, /* U+001f73: GREEK SMALL LETTER EPSILON WITH OXIA*/
+ 0x1f74, /* U+001f74: GREEK SMALL LETTER ETA WITH VARIA*/
+ 0x1f75, /* U+001f75: GREEK SMALL LETTER ETA WITH OXIA*/
+ 0x1f76, /* U+001f76: GREEK SMALL LETTER IOTA WITH VARIA*/
+ 0x1f77, /* U+001f77: GREEK SMALL LETTER IOTA WITH OXIA*/
+ 0x1f78, /* U+001f78: GREEK SMALL LETTER OMICRON WITH VARIA*/
+ 0x1f79, /* U+001f79: GREEK SMALL LETTER OMICRON WITH OXIA*/
+ 0x1f7a, /* U+001f7a: GREEK SMALL LETTER UPSILON WITH VARIA*/
+ 0x1f7b, /* U+001f7b: GREEK SMALL LETTER UPSILON WITH OXIA*/
+ 0x1f7c, /* U+001f7c: GREEK SMALL LETTER OMEGA WITH VARIA*/
+ 0x1f7d, /* U+001f7d: GREEK SMALL LETTER OMEGA WITH OXIA*/
+ 0x1f7e, /* U+001f7e: */
+ 0x1f7f, /* U+001f7f: */
+ 0x1f80, /* U+001f80: GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI*/
+ 0x1f81, /* U+001f81: GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI*/
+ 0x1f82, /* U+001f82: GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI*/
+ 0x1f83, /* U+001f83: GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI*/
+ 0x1f84, /* U+001f84: GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI*/
+ 0x1f85, /* U+001f85: GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI*/
+ 0x1f86, /* U+001f86: GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI*/
+ 0x1f87, /* U+001f87: GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI*/
+ 0x1f80, /* U+001f88: GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI*/
+ 0x1f81, /* U+001f89: GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI*/
+ 0x1f82, /* U+001f8a: GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI*/
+ 0x1f83, /* U+001f8b: GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI*/
+ 0x1f84, /* U+001f8c: GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI*/
+ 0x1f85, /* U+001f8d: GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI*/
+ 0x1f86, /* U+001f8e: GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI*/
+ 0x1f87, /* U+001f8f: GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI*/
+ 0x1f90, /* U+001f90: GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI*/
+ 0x1f91, /* U+001f91: GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI*/
+ 0x1f92, /* U+001f92: GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI*/
+ 0x1f93, /* U+001f93: GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI*/
+ 0x1f94, /* U+001f94: GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI*/
+ 0x1f95, /* U+001f95: GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI*/
+ 0x1f96, /* U+001f96: GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI*/
+ 0x1f97, /* U+001f97: GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI*/
+ 0x1f90, /* U+001f98: GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI*/
+ 0x1f91, /* U+001f99: GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI*/
+ 0x1f92, /* U+001f9a: GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI*/
+ 0x1f93, /* U+001f9b: GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI*/
+ 0x1f94, /* U+001f9c: GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI*/
+ 0x1f95, /* U+001f9d: GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI*/
+ 0x1f96, /* U+001f9e: GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI*/
+ 0x1f97, /* U+001f9f: GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI*/
+ 0x1fa0, /* U+001fa0: GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI*/
+ 0x1fa1, /* U+001fa1: GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI*/
+ 0x1fa2, /* U+001fa2: GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI*/
+ 0x1fa3, /* U+001fa3: GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI*/
+ 0x1fa4, /* U+001fa4: GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI*/
+ 0x1fa5, /* U+001fa5: GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI*/
+ 0x1fa6, /* U+001fa6: GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI*/
+ 0x1fa7, /* U+001fa7: GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI*/
+ 0x1fa0, /* U+001fa8: GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI*/
+ 0x1fa1, /* U+001fa9: GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI*/
+ 0x1fa2, /* U+001faa: GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI*/
+ 0x1fa3, /* U+001fab: GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI*/
+ 0x1fa4, /* U+001fac: GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI*/
+ 0x1fa5, /* U+001fad: GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI*/
+ 0x1fa6, /* U+001fae: GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI*/
+ 0x1fa7, /* U+001faf: GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI*/
+ 0x1fb0, /* U+001fb0: GREEK SMALL LETTER ALPHA WITH VRACHY*/
+ 0x1fb1, /* U+001fb1: GREEK SMALL LETTER ALPHA WITH MACRON*/
+ 0x1fb2, /* U+001fb2: GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI*/
+ 0x1fb3, /* U+001fb3: GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI*/
+ 0x1fb4, /* U+001fb4: GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI*/
+ 0x1fb5, /* U+001fb5: */
+ 0x1fb6, /* U+001fb6: GREEK SMALL LETTER ALPHA WITH PERISPOMENI*/
+ 0x1fb7, /* U+001fb7: GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI*/
+ 0x1fb0, /* U+001fb8: GREEK CAPITAL LETTER ALPHA WITH VRACHY*/
+ 0x1fb1, /* U+001fb9: GREEK CAPITAL LETTER ALPHA WITH MACRON*/
+ 0x1f70, /* U+001fba: GREEK CAPITAL LETTER ALPHA WITH VARIA*/
+ 0x1f71, /* U+001fbb: GREEK CAPITAL LETTER ALPHA WITH OXIA*/
+ 0x1fb3, /* U+001fbc: GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI*/
+ 0x1fbd, /* U+001fbd: GREEK KORONIS*/
+ 0x1fbe, /* U+001fbe: GREEK PROSGEGRAMMENI*/
+ 0x1fbf, /* U+001fbf: GREEK PSILI*/
+ 0x1fc0, /* U+001fc0: GREEK PERISPOMENI*/
+ 0x1fc1, /* U+001fc1: GREEK DIALYTIKA AND PERISPOMENI*/
+ 0x1fc2, /* U+001fc2: GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI*/
+ 0x1fc3, /* U+001fc3: GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI*/
+ 0x1fc4, /* U+001fc4: GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI*/
+ 0x1fc5, /* U+001fc5: */
+ 0x1fc6, /* U+001fc6: GREEK SMALL LETTER ETA WITH PERISPOMENI*/
+ 0x1fc7, /* U+001fc7: GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI*/
+ 0x1f72, /* U+001fc8: GREEK CAPITAL LETTER EPSILON WITH VARIA*/
+ 0x1f73, /* U+001fc9: GREEK CAPITAL LETTER EPSILON WITH OXIA*/
+ 0x1f74, /* U+001fca: GREEK CAPITAL LETTER ETA WITH VARIA*/
+ 0x1f75, /* U+001fcb: GREEK CAPITAL LETTER ETA WITH OXIA*/
+ 0x1fc3, /* U+001fcc: GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI*/
+ 0x1fcd, /* U+001fcd: GREEK PSILI AND VARIA*/
+ 0x1fce, /* U+001fce: GREEK PSILI AND OXIA*/
+ 0x1fcf, /* U+001fcf: GREEK PSILI AND PERISPOMENI*/
+ 0x1fd0, /* U+001fd0: GREEK SMALL LETTER IOTA WITH VRACHY*/
+ 0x1fd1, /* U+001fd1: GREEK SMALL LETTER IOTA WITH MACRON*/
+ 0x1fd2, /* U+001fd2: GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA*/
+ 0x1fd3, /* U+001fd3: GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA*/
+ 0x1fd4, /* U+001fd4: */
+ 0x1fd5, /* U+001fd5: */
+ 0x1fd6, /* U+001fd6: GREEK SMALL LETTER IOTA WITH PERISPOMENI*/
+ 0x1fd7, /* U+001fd7: GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI*/
+ 0x1fd0, /* U+001fd8: GREEK CAPITAL LETTER IOTA WITH VRACHY*/
+ 0x1fd1, /* U+001fd9: GREEK CAPITAL LETTER IOTA WITH MACRON*/
+ 0x1f76, /* U+001fda: GREEK CAPITAL LETTER IOTA WITH VARIA*/
+ 0x1f77, /* U+001fdb: GREEK CAPITAL LETTER IOTA WITH OXIA*/
+ 0x1fdc, /* U+001fdc: */
+ 0x1fdd, /* U+001fdd: GREEK DASIA AND VARIA*/
+ 0x1fde, /* U+001fde: GREEK DASIA AND OXIA*/
+ 0x1fdf, /* U+001fdf: GREEK DASIA AND PERISPOMENI*/
+ 0x1fe0, /* U+001fe0: GREEK SMALL LETTER UPSILON WITH VRACHY*/
+ 0x1fe1, /* U+001fe1: GREEK SMALL LETTER UPSILON WITH MACRON*/
+ 0x1fe2, /* U+001fe2: GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA*/
+ 0x1fe3, /* U+001fe3: GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA*/
+ 0x1fe4, /* U+001fe4: GREEK SMALL LETTER RHO WITH PSILI*/
+ 0x1fe5, /* U+001fe5: GREEK SMALL LETTER RHO WITH DASIA*/
+ 0x1fe6, /* U+001fe6: GREEK SMALL LETTER UPSILON WITH PERISPOMENI*/
+ 0x1fe7, /* U+001fe7: GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI*/
+ 0x1fe0, /* U+001fe8: GREEK CAPITAL LETTER UPSILON WITH VRACHY*/
+ 0x1fe1, /* U+001fe9: GREEK CAPITAL LETTER UPSILON WITH MACRON*/
+ 0x1f7a, /* U+001fea: GREEK CAPITAL LETTER UPSILON WITH VARIA*/
+ 0x1f7b, /* U+001feb: GREEK CAPITAL LETTER UPSILON WITH OXIA*/
+ 0x1fe5, /* U+001fec: GREEK CAPITAL LETTER RHO WITH DASIA*/
+ 0x1fed, /* U+001fed: GREEK DIALYTIKA AND VARIA*/
+ 0x1fee, /* U+001fee: GREEK DIALYTIKA AND OXIA*/
+ 0x1fef, /* U+001fef: GREEK VARIA*/
+ 0x1ff0, /* U+001ff0: */
+ 0x1ff1, /* U+001ff1: */
+ 0x1ff2, /* U+001ff2: GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI*/
+ 0x1ff3, /* U+001ff3: GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI*/
+ 0x1ff4, /* U+001ff4: GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI*/
+ 0x1ff5, /* U+001ff5: */
+ 0x1ff6, /* U+001ff6: GREEK SMALL LETTER OMEGA WITH PERISPOMENI*/
+ 0x1ff7, /* U+001ff7: GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI*/
+ 0x1f78, /* U+001ff8: GREEK CAPITAL LETTER OMICRON WITH VARIA*/
+ 0x1f79, /* U+001ff9: GREEK CAPITAL LETTER OMICRON WITH OXIA*/
+ 0x1f7c, /* U+001ffa: GREEK CAPITAL LETTER OMEGA WITH VARIA*/
+ 0x1f7d, /* U+001ffb: GREEK CAPITAL LETTER OMEGA WITH OXIA*/
+ 0x1ff3, /* U+001ffc: GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI*/
+ 0x1ffd, /* U+001ffd: GREEK OXIA*/
+ 0x1ffe, /* U+001ffe: GREEK DASIA*/
+ 0x1fff, /* U+001fff: */
+ 0x2000, /* U+002000: EN QUAD*/
+ 0x2001, /* U+002001: EM QUAD*/
+ 0x2002, /* U+002002: EN SPACE*/
+ 0x2003, /* U+002003: EM SPACE*/
+ 0x2004, /* U+002004: THREE-PER-EM SPACE*/
+ 0x2005, /* U+002005: FOUR-PER-EM SPACE*/
+ 0x2006, /* U+002006: SIX-PER-EM SPACE*/
+ 0x2007, /* U+002007: FIGURE SPACE*/
+ 0x2008, /* U+002008: PUNCTUATION SPACE*/
+ 0x2009, /* U+002009: THIN SPACE*/
+ 0x200a, /* U+00200a: HAIR SPACE*/
+ 0x200b, /* U+00200b: ZERO WIDTH SPACE*/
+ 0x200c, /* U+00200c: ZERO WIDTH NON-JOINER*/
+ 0x200d, /* U+00200d: ZERO WIDTH JOINER*/
+ 0x200e, /* U+00200e: LEFT-TO-RIGHT MARK*/
+ 0x200f, /* U+00200f: RIGHT-TO-LEFT MARK*/
+ 0x2010, /* U+002010: HYPHEN*/
+ 0x2011, /* U+002011: NON-BREAKING HYPHEN*/
+ 0x2012, /* U+002012: FIGURE DASH*/
+ 0x2013, /* U+002013: EN DASH*/
+ 0x2014, /* U+002014: EM DASH*/
+ 0x2015, /* U+002015: HORIZONTAL BAR*/
+ 0x2016, /* U+002016: DOUBLE VERTICAL LINE*/
+ 0x2017, /* U+002017: DOUBLE LOW LINE*/
+ 0x2018, /* U+002018: LEFT SINGLE QUOTATION MARK*/
+ 0x2019, /* U+002019: RIGHT SINGLE QUOTATION MARK*/
+ 0x201a, /* U+00201a: SINGLE LOW-9 QUOTATION MARK*/
+ 0x201b, /* U+00201b: SINGLE HIGH-REVERSED-9 QUOTATION MARK*/
+ 0x201c, /* U+00201c: LEFT DOUBLE QUOTATION MARK*/
+ 0x201d, /* U+00201d: RIGHT DOUBLE QUOTATION MARK*/
+ 0x201e, /* U+00201e: DOUBLE LOW-9 QUOTATION MARK*/
+ 0x201f, /* U+00201f: DOUBLE HIGH-REVERSED-9 QUOTATION MARK*/
+ 0x2020, /* U+002020: DAGGER*/
+ 0x2021, /* U+002021: DOUBLE DAGGER*/
+ 0x2022, /* U+002022: BULLET*/
+ 0x2023, /* U+002023: TRIANGULAR BULLET*/
+ 0x2024, /* U+002024: ONE DOT LEADER*/
+ 0x2025, /* U+002025: TWO DOT LEADER*/
+ 0x2026, /* U+002026: HORIZONTAL ELLIPSIS*/
+ 0x2027, /* U+002027: HYPHENATION POINT*/
+ 0x2028, /* U+002028: LINE SEPARATOR*/
+ 0x2029, /* U+002029: PARAGRAPH SEPARATOR*/
+ 0x202a, /* U+00202a: LEFT-TO-RIGHT EMBEDDING*/
+ 0x202b, /* U+00202b: RIGHT-TO-LEFT EMBEDDING*/
+ 0x202c, /* U+00202c: POP DIRECTIONAL FORMATTING*/
+ 0x202d, /* U+00202d: LEFT-TO-RIGHT OVERRIDE*/
+ 0x202e, /* U+00202e: RIGHT-TO-LEFT OVERRIDE*/
+ 0x202f, /* U+00202f: NARROW NO-BREAK SPACE*/
+ 0x2030, /* U+002030: PER MILLE SIGN*/
+ 0x2031, /* U+002031: PER TEN THOUSAND SIGN*/
+ 0x2032, /* U+002032: PRIME*/
+ 0x2033, /* U+002033: DOUBLE PRIME*/
+ 0x2034, /* U+002034: TRIPLE PRIME*/
+ 0x2035, /* U+002035: REVERSED PRIME*/
+ 0x2036, /* U+002036: REVERSED DOUBLE PRIME*/
+ 0x2037, /* U+002037: REVERSED TRIPLE PRIME*/
+ 0x2038, /* U+002038: CARET*/
+ 0x2039, /* U+002039: SINGLE LEFT-POINTING ANGLE QUOTATION MARK*/
+ 0x203a, /* U+00203a: SINGLE RIGHT-POINTING ANGLE QUOTATION MARK*/
+ 0x203b, /* U+00203b: REFERENCE MARK*/
+ 0x203c, /* U+00203c: DOUBLE EXCLAMATION MARK*/
+ 0x203d, /* U+00203d: INTERROBANG*/
+ 0x203e, /* U+00203e: OVERLINE*/
+ 0x203f, /* U+00203f: UNDERTIE*/
+ 0x2040, /* U+002040: CHARACTER TIE*/
+ 0x2041, /* U+002041: CARET INSERTION POINT*/
+ 0x2042, /* U+002042: ASTERISM*/
+ 0x2043, /* U+002043: HYPHEN BULLET*/
+ 0x2044, /* U+002044: FRACTION SLASH*/
+ 0x2045, /* U+002045: LEFT SQUARE BRACKET WITH QUILL*/
+ 0x2046, /* U+002046: RIGHT SQUARE BRACKET WITH QUILL*/
+ 0x2047, /* U+002047: DOUBLE QUESTION MARK*/
+ 0x2048, /* U+002048: QUESTION EXCLAMATION MARK*/
+ 0x2049, /* U+002049: EXCLAMATION QUESTION MARK*/
+ 0x204a, /* U+00204a: TIRONIAN SIGN ET*/
+ 0x204b, /* U+00204b: REVERSED PILCROW SIGN*/
+ 0x204c, /* U+00204c: BLACK LEFTWARDS BULLET*/
+ 0x204d, /* U+00204d: BLACK RIGHTWARDS BULLET*/
+ 0x204e, /* U+00204e: LOW ASTERISK*/
+ 0x204f, /* U+00204f: REVERSED SEMICOLON*/
+ 0x2050, /* U+002050: CLOSE UP*/
+ 0x2051, /* U+002051: TWO ASTERISKS ALIGNED VERTICALLY*/
+ 0x2052, /* U+002052: COMMERCIAL MINUS SIGN*/
+ 0x2053, /* U+002053: SWUNG DASH*/
+ 0x2054, /* U+002054: INVERTED UNDERTIE*/
+ 0x2055, /* U+002055: FLOWER PUNCTUATION MARK*/
+ 0x2056, /* U+002056: THREE DOT PUNCTUATION*/
+ 0x2057, /* U+002057: QUADRUPLE PRIME*/
+ 0x2058, /* U+002058: FOUR DOT PUNCTUATION*/
+ 0x2059, /* U+002059: FIVE DOT PUNCTUATION*/
+ 0x205a, /* U+00205a: TWO DOT PUNCTUATION*/
+ 0x205b, /* U+00205b: FOUR DOT MARK*/
+ 0x205c, /* U+00205c: DOTTED CROSS*/
+ 0x205d, /* U+00205d: TRICOLON*/
+ 0x205e, /* U+00205e: VERTICAL FOUR DOTS*/
+ 0x205f, /* U+00205f: MEDIUM MATHEMATICAL SPACE*/
+ 0x2060, /* U+002060: WORD JOINER*/
+ 0x2061, /* U+002061: FUNCTION APPLICATION*/
+ 0x2062, /* U+002062: INVISIBLE TIMES*/
+ 0x2063, /* U+002063: INVISIBLE SEPARATOR*/
+ 0x2064, /* U+002064: INVISIBLE PLUS*/
+ 0x2065, /* U+002065: */
+ 0x2066, /* U+002066: LEFT-TO-RIGHT ISOLATE*/
+ 0x2067, /* U+002067: RIGHT-TO-LEFT ISOLATE*/
+ 0x2068, /* U+002068: FIRST STRONG ISOLATE*/
+ 0x2069, /* U+002069: POP DIRECTIONAL ISOLATE*/
+ 0x206a, /* U+00206a: INHIBIT SYMMETRIC SWAPPING*/
+ 0x206b, /* U+00206b: ACTIVATE SYMMETRIC SWAPPING*/
+ 0x206c, /* U+00206c: INHIBIT ARABIC FORM SHAPING*/
+ 0x206d, /* U+00206d: ACTIVATE ARABIC FORM SHAPING*/
+ 0x206e, /* U+00206e: NATIONAL DIGIT SHAPES*/
+ 0x206f, /* U+00206f: NOMINAL DIGIT SHAPES*/
+ 0x2070, /* U+002070: SUPERSCRIPT ZERO*/
+ 0x2071, /* U+002071: SUPERSCRIPT LATIN SMALL LETTER I*/
+ 0x2072, /* U+002072: */
+ 0x2073, /* U+002073: */
+ 0x2074, /* U+002074: SUPERSCRIPT FOUR*/
+ 0x2075, /* U+002075: SUPERSCRIPT FIVE*/
+ 0x2076, /* U+002076: SUPERSCRIPT SIX*/
+ 0x2077, /* U+002077: SUPERSCRIPT SEVEN*/
+ 0x2078, /* U+002078: SUPERSCRIPT EIGHT*/
+ 0x2079, /* U+002079: SUPERSCRIPT NINE*/
+ 0x207a, /* U+00207a: SUPERSCRIPT PLUS SIGN*/
+ 0x207b, /* U+00207b: SUPERSCRIPT MINUS*/
+ 0x207c, /* U+00207c: SUPERSCRIPT EQUALS SIGN*/
+ 0x207d, /* U+00207d: SUPERSCRIPT LEFT PARENTHESIS*/
+ 0x207e, /* U+00207e: SUPERSCRIPT RIGHT PARENTHESIS*/
+ 0x207f, /* U+00207f: SUPERSCRIPT LATIN SMALL LETTER N*/
+ 0x2080, /* U+002080: SUBSCRIPT ZERO*/
+ 0x2081, /* U+002081: SUBSCRIPT ONE*/
+ 0x2082, /* U+002082: SUBSCRIPT TWO*/
+ 0x2083, /* U+002083: SUBSCRIPT THREE*/
+ 0x2084, /* U+002084: SUBSCRIPT FOUR*/
+ 0x2085, /* U+002085: SUBSCRIPT FIVE*/
+ 0x2086, /* U+002086: SUBSCRIPT SIX*/
+ 0x2087, /* U+002087: SUBSCRIPT SEVEN*/
+ 0x2088, /* U+002088: SUBSCRIPT EIGHT*/
+ 0x2089, /* U+002089: SUBSCRIPT NINE*/
+ 0x208a, /* U+00208a: SUBSCRIPT PLUS SIGN*/
+ 0x208b, /* U+00208b: SUBSCRIPT MINUS*/
+ 0x208c, /* U+00208c: SUBSCRIPT EQUALS SIGN*/
+ 0x208d, /* U+00208d: SUBSCRIPT LEFT PARENTHESIS*/
+ 0x208e, /* U+00208e: SUBSCRIPT RIGHT PARENTHESIS*/
+ 0x208f, /* U+00208f: */
+ 0x2090, /* U+002090: LATIN SUBSCRIPT SMALL LETTER A*/
+ 0x2091, /* U+002091: LATIN SUBSCRIPT SMALL LETTER E*/
+ 0x2092, /* U+002092: LATIN SUBSCRIPT SMALL LETTER O*/
+ 0x2093, /* U+002093: LATIN SUBSCRIPT SMALL LETTER X*/
+ 0x2094, /* U+002094: LATIN SUBSCRIPT SMALL LETTER SCHWA*/
+ 0x2095, /* U+002095: LATIN SUBSCRIPT SMALL LETTER H*/
+ 0x2096, /* U+002096: LATIN SUBSCRIPT SMALL LETTER K*/
+ 0x2097, /* U+002097: LATIN SUBSCRIPT SMALL LETTER L*/
+ 0x2098, /* U+002098: LATIN SUBSCRIPT SMALL LETTER M*/
+ 0x2099, /* U+002099: LATIN SUBSCRIPT SMALL LETTER N*/
+ 0x209a, /* U+00209a: LATIN SUBSCRIPT SMALL LETTER P*/
+ 0x209b, /* U+00209b: LATIN SUBSCRIPT SMALL LETTER S*/
+ 0x209c, /* U+00209c: LATIN SUBSCRIPT SMALL LETTER T*/
+ 0x209d, /* U+00209d: */
+ 0x209e, /* U+00209e: */
+ 0x209f, /* U+00209f: */
+ 0x20a0, /* U+0020a0: EURO-CURRENCY SIGN*/
+ 0x20a1, /* U+0020a1: COLON SIGN*/
+ 0x20a2, /* U+0020a2: CRUZEIRO SIGN*/
+ 0x20a3, /* U+0020a3: FRENCH FRANC SIGN*/
+ 0x20a4, /* U+0020a4: LIRA SIGN*/
+ 0x20a5, /* U+0020a5: MILL SIGN*/
+ 0x20a6, /* U+0020a6: NAIRA SIGN*/
+ 0x20a7, /* U+0020a7: PESETA SIGN*/
+ 0x20a8, /* U+0020a8: RUPEE SIGN*/
+ 0x20a9, /* U+0020a9: WON SIGN*/
+ 0x20aa, /* U+0020aa: NEW SHEQEL SIGN*/
+ 0x20ab, /* U+0020ab: DONG SIGN*/
+ 0x20ac, /* U+0020ac: EURO SIGN*/
+ 0x20ad, /* U+0020ad: KIP SIGN*/
+ 0x20ae, /* U+0020ae: TUGRIK SIGN*/
+ 0x20af, /* U+0020af: DRACHMA SIGN*/
+ 0x20b0, /* U+0020b0: GERMAN PENNY SIGN*/
+ 0x20b1, /* U+0020b1: PESO SIGN*/
+ 0x20b2, /* U+0020b2: GUARANI SIGN*/
+ 0x20b3, /* U+0020b3: AUSTRAL SIGN*/
+ 0x20b4, /* U+0020b4: HRYVNIA SIGN*/
+ 0x20b5, /* U+0020b5: CEDI SIGN*/
+ 0x20b6, /* U+0020b6: LIVRE TOURNOIS SIGN*/
+ 0x20b7, /* U+0020b7: SPESMILO SIGN*/
+ 0x20b8, /* U+0020b8: TENGE SIGN*/
+ 0x20b9, /* U+0020b9: INDIAN RUPEE SIGN*/
+ 0x20ba, /* U+0020ba: TURKISH LIRA SIGN*/
+ 0x20bb, /* U+0020bb: */
+ 0x20bc, /* U+0020bc: */
+ 0x20bd, /* U+0020bd: */
+ 0x20be, /* U+0020be: */
+ 0x20bf, /* U+0020bf: */
+ 0x20c0, /* U+0020c0: */
+ 0x20c1, /* U+0020c1: */
+ 0x20c2, /* U+0020c2: */
+ 0x20c3, /* U+0020c3: */
+ 0x20c4, /* U+0020c4: */
+ 0x20c5, /* U+0020c5: */
+ 0x20c6, /* U+0020c6: */
+ 0x20c7, /* U+0020c7: */
+ 0x20c8, /* U+0020c8: */
+ 0x20c9, /* U+0020c9: */
+ 0x20ca, /* U+0020ca: */
+ 0x20cb, /* U+0020cb: */
+ 0x20cc, /* U+0020cc: */
+ 0x20cd, /* U+0020cd: */
+ 0x20ce, /* U+0020ce: */
+ 0x20cf, /* U+0020cf: */
+ 0x20d0, /* U+0020d0: COMBINING LEFT HARPOON ABOVE*/
+ 0x20d1, /* U+0020d1: COMBINING RIGHT HARPOON ABOVE*/
+ 0x20d2, /* U+0020d2: COMBINING LONG VERTICAL LINE OVERLAY*/
+ 0x20d3, /* U+0020d3: COMBINING SHORT VERTICAL LINE OVERLAY*/
+ 0x20d4, /* U+0020d4: COMBINING ANTICLOCKWISE ARROW ABOVE*/
+ 0x20d5, /* U+0020d5: COMBINING CLOCKWISE ARROW ABOVE*/
+ 0x20d6, /* U+0020d6: COMBINING LEFT ARROW ABOVE*/
+ 0x20d7, /* U+0020d7: COMBINING RIGHT ARROW ABOVE*/
+ 0x20d8, /* U+0020d8: COMBINING RING OVERLAY*/
+ 0x20d9, /* U+0020d9: COMBINING CLOCKWISE RING OVERLAY*/
+ 0x20da, /* U+0020da: COMBINING ANTICLOCKWISE RING OVERLAY*/
+ 0x20db, /* U+0020db: COMBINING THREE DOTS ABOVE*/
+ 0x20dc, /* U+0020dc: COMBINING FOUR DOTS ABOVE*/
+ 0x20dd, /* U+0020dd: COMBINING ENCLOSING CIRCLE*/
+ 0x20de, /* U+0020de: COMBINING ENCLOSING SQUARE*/
+ 0x20df, /* U+0020df: COMBINING ENCLOSING DIAMOND*/
+ 0x20e0, /* U+0020e0: COMBINING ENCLOSING CIRCLE BACKSLASH*/
+ 0x20e1, /* U+0020e1: COMBINING LEFT RIGHT ARROW ABOVE*/
+ 0x20e2, /* U+0020e2: COMBINING ENCLOSING SCREEN*/
+ 0x20e3, /* U+0020e3: COMBINING ENCLOSING KEYCAP*/
+ 0x20e4, /* U+0020e4: COMBINING ENCLOSING UPWARD POINTING TRIANGLE*/
+ 0x20e5, /* U+0020e5: COMBINING REVERSE SOLIDUS OVERLAY*/
+ 0x20e6, /* U+0020e6: COMBINING DOUBLE VERTICAL STROKE OVERLAY*/
+ 0x20e7, /* U+0020e7: COMBINING ANNUITY SYMBOL*/
+ 0x20e8, /* U+0020e8: COMBINING TRIPLE UNDERDOT*/
+ 0x20e9, /* U+0020e9: COMBINING WIDE BRIDGE ABOVE*/
+ 0x20ea, /* U+0020ea: COMBINING LEFTWARDS ARROW OVERLAY*/
+ 0x20eb, /* U+0020eb: COMBINING LONG DOUBLE SOLIDUS OVERLAY*/
+ 0x20ec, /* U+0020ec: COMBINING RIGHTWARDS HARPOON WITH BARB DOWNWARDS*/
+ 0x20ed, /* U+0020ed: COMBINING LEFTWARDS HARPOON WITH BARB DOWNWARDS*/
+ 0x20ee, /* U+0020ee: COMBINING LEFT ARROW BELOW*/
+ 0x20ef, /* U+0020ef: COMBINING RIGHT ARROW BELOW*/
+ 0x20f0, /* U+0020f0: COMBINING ASTERISK ABOVE*/
+ 0x20f1, /* U+0020f1: */
+ 0x20f2, /* U+0020f2: */
+ 0x20f3, /* U+0020f3: */
+ 0x20f4, /* U+0020f4: */
+ 0x20f5, /* U+0020f5: */
+ 0x20f6, /* U+0020f6: */
+ 0x20f7, /* U+0020f7: */
+ 0x20f8, /* U+0020f8: */
+ 0x20f9, /* U+0020f9: */
+ 0x20fa, /* U+0020fa: */
+ 0x20fb, /* U+0020fb: */
+ 0x20fc, /* U+0020fc: */
+ 0x20fd, /* U+0020fd: */
+ 0x20fe, /* U+0020fe: */
+ 0x20ff, /* U+0020ff: */
+ 0x2100, /* U+002100: ACCOUNT OF*/
+ 0x2101, /* U+002101: ADDRESSED TO THE SUBJECT*/
+ 0x2102, /* U+002102: DOUBLE-STRUCK CAPITAL C*/
+ 0x2103, /* U+002103: DEGREE CELSIUS*/
+ 0x2104, /* U+002104: CENTRE LINE SYMBOL*/
+ 0x2105, /* U+002105: CARE OF*/
+ 0x2106, /* U+002106: CADA UNA*/
+ 0x2107, /* U+002107: EULER CONSTANT*/
+ 0x2108, /* U+002108: SCRUPLE*/
+ 0x2109, /* U+002109: DEGREE FAHRENHEIT*/
+ 0x210a, /* U+00210a: SCRIPT SMALL G*/
+ 0x210b, /* U+00210b: SCRIPT CAPITAL H*/
+ 0x210c, /* U+00210c: BLACK-LETTER CAPITAL H*/
+ 0x210d, /* U+00210d: DOUBLE-STRUCK CAPITAL H*/
+ 0x210e, /* U+00210e: PLANCK CONSTANT*/
+ 0x210f, /* U+00210f: PLANCK CONSTANT OVER TWO PI*/
+ 0x2110, /* U+002110: SCRIPT CAPITAL I*/
+ 0x2111, /* U+002111: BLACK-LETTER CAPITAL I*/
+ 0x2112, /* U+002112: SCRIPT CAPITAL L*/
+ 0x2113, /* U+002113: SCRIPT SMALL L*/
+ 0x2114, /* U+002114: L B BAR SYMBOL*/
+ 0x2115, /* U+002115: DOUBLE-STRUCK CAPITAL N*/
+ 0x2116, /* U+002116: NUMERO SIGN*/
+ 0x2117, /* U+002117: SOUND RECORDING COPYRIGHT*/
+ 0x2118, /* U+002118: SCRIPT CAPITAL P*/
+ 0x2119, /* U+002119: DOUBLE-STRUCK CAPITAL P*/
+ 0x211a, /* U+00211a: DOUBLE-STRUCK CAPITAL Q*/
+ 0x211b, /* U+00211b: SCRIPT CAPITAL R*/
+ 0x211c, /* U+00211c: BLACK-LETTER CAPITAL R*/
+ 0x211d, /* U+00211d: DOUBLE-STRUCK CAPITAL R*/
+ 0x211e, /* U+00211e: PRESCRIPTION TAKE*/
+ 0x211f, /* U+00211f: RESPONSE*/
+ 0x2120, /* U+002120: SERVICE MARK*/
+ 0x2121, /* U+002121: TELEPHONE SIGN*/
+ 0x2122, /* U+002122: TRADE MARK SIGN*/
+ 0x2123, /* U+002123: VERSICLE*/
+ 0x2124, /* U+002124: DOUBLE-STRUCK CAPITAL Z*/
+ 0x2125, /* U+002125: OUNCE SIGN*/
+ 0x3c9, /* U+002126: OHM SIGN*/
+ 0x2127, /* U+002127: INVERTED OHM SIGN*/
+ 0x2128, /* U+002128: BLACK-LETTER CAPITAL Z*/
+ 0x2129, /* U+002129: TURNED GREEK SMALL LETTER IOTA*/
+ 0x6b, /* U+00212a: KELVIN SIGN*/
+ 0xe5, /* U+00212b: ANGSTROM SIGN*/
+ 0x212c, /* U+00212c: SCRIPT CAPITAL B*/
+ 0x212d, /* U+00212d: BLACK-LETTER CAPITAL C*/
+ 0x212e, /* U+00212e: ESTIMATED SYMBOL*/
+ 0x212f, /* U+00212f: SCRIPT SMALL E*/
+ 0x2130, /* U+002130: SCRIPT CAPITAL E*/
+ 0x2131, /* U+002131: SCRIPT CAPITAL F*/
+ 0x214e, /* U+002132: TURNED CAPITAL F*/
+ 0x2133, /* U+002133: SCRIPT CAPITAL M*/
+ 0x2134, /* U+002134: SCRIPT SMALL O*/
+ 0x2135, /* U+002135: ALEF SYMBOL*/
+ 0x2136, /* U+002136: BET SYMBOL*/
+ 0x2137, /* U+002137: GIMEL SYMBOL*/
+ 0x2138, /* U+002138: DALET SYMBOL*/
+ 0x2139, /* U+002139: INFORMATION SOURCE*/
+ 0x213a, /* U+00213a: ROTATED CAPITAL Q*/
+ 0x213b, /* U+00213b: FACSIMILE SIGN*/
+ 0x213c, /* U+00213c: DOUBLE-STRUCK SMALL PI*/
+ 0x213d, /* U+00213d: DOUBLE-STRUCK SMALL GAMMA*/
+ 0x213e, /* U+00213e: DOUBLE-STRUCK CAPITAL GAMMA*/
+ 0x213f, /* U+00213f: DOUBLE-STRUCK CAPITAL PI*/
+ 0x2140, /* U+002140: DOUBLE-STRUCK N-ARY SUMMATION*/
+ 0x2141, /* U+002141: TURNED SANS-SERIF CAPITAL G*/
+ 0x2142, /* U+002142: TURNED SANS-SERIF CAPITAL L*/
+ 0x2143, /* U+002143: REVERSED SANS-SERIF CAPITAL L*/
+ 0x2144, /* U+002144: TURNED SANS-SERIF CAPITAL Y*/
+ 0x2145, /* U+002145: DOUBLE-STRUCK ITALIC CAPITAL D*/
+ 0x2146, /* U+002146: DOUBLE-STRUCK ITALIC SMALL D*/
+ 0x2147, /* U+002147: DOUBLE-STRUCK ITALIC SMALL E*/
+ 0x2148, /* U+002148: DOUBLE-STRUCK ITALIC SMALL I*/
+ 0x2149, /* U+002149: DOUBLE-STRUCK ITALIC SMALL J*/
+ 0x214a, /* U+00214a: PROPERTY LINE*/
+ 0x214b, /* U+00214b: TURNED AMPERSAND*/
+ 0x214c, /* U+00214c: PER SIGN*/
+ 0x214d, /* U+00214d: AKTIESELSKAB*/
+ 0x214e, /* U+00214e: TURNED SMALL F*/
+ 0x214f, /* U+00214f: SYMBOL FOR SAMARITAN SOURCE*/
+ 0x2150, /* U+002150: VULGAR FRACTION ONE SEVENTH*/
+ 0x2151, /* U+002151: VULGAR FRACTION ONE NINTH*/
+ 0x2152, /* U+002152: VULGAR FRACTION ONE TENTH*/
+ 0x2153, /* U+002153: VULGAR FRACTION ONE THIRD*/
+ 0x2154, /* U+002154: VULGAR FRACTION TWO THIRDS*/
+ 0x2155, /* U+002155: VULGAR FRACTION ONE FIFTH*/
+ 0x2156, /* U+002156: VULGAR FRACTION TWO FIFTHS*/
+ 0x2157, /* U+002157: VULGAR FRACTION THREE FIFTHS*/
+ 0x2158, /* U+002158: VULGAR FRACTION FOUR FIFTHS*/
+ 0x2159, /* U+002159: VULGAR FRACTION ONE SIXTH*/
+ 0x215a, /* U+00215a: VULGAR FRACTION FIVE SIXTHS*/
+ 0x215b, /* U+00215b: VULGAR FRACTION ONE EIGHTH*/
+ 0x215c, /* U+00215c: VULGAR FRACTION THREE EIGHTHS*/
+ 0x215d, /* U+00215d: VULGAR FRACTION FIVE EIGHTHS*/
+ 0x215e, /* U+00215e: VULGAR FRACTION SEVEN EIGHTHS*/
+ 0x215f, /* U+00215f: FRACTION NUMERATOR ONE*/
+ 0x2170, /* U+002160: ROMAN NUMERAL ONE*/
+ 0x2171, /* U+002161: ROMAN NUMERAL TWO*/
+ 0x2172, /* U+002162: ROMAN NUMERAL THREE*/
+ 0x2173, /* U+002163: ROMAN NUMERAL FOUR*/
+ 0x2174, /* U+002164: ROMAN NUMERAL FIVE*/
+ 0x2175, /* U+002165: ROMAN NUMERAL SIX*/
+ 0x2176, /* U+002166: ROMAN NUMERAL SEVEN*/
+ 0x2177, /* U+002167: ROMAN NUMERAL EIGHT*/
+ 0x2178, /* U+002168: ROMAN NUMERAL NINE*/
+ 0x2179, /* U+002169: ROMAN NUMERAL TEN*/
+ 0x217a, /* U+00216a: ROMAN NUMERAL ELEVEN*/
+ 0x217b, /* U+00216b: ROMAN NUMERAL TWELVE*/
+ 0x217c, /* U+00216c: ROMAN NUMERAL FIFTY*/
+ 0x217d, /* U+00216d: ROMAN NUMERAL ONE HUNDRED*/
+ 0x217e, /* U+00216e: ROMAN NUMERAL FIVE HUNDRED*/
+ 0x217f, /* U+00216f: ROMAN NUMERAL ONE THOUSAND*/
+ 0x2170, /* U+002170: SMALL ROMAN NUMERAL ONE*/
+ 0x2171, /* U+002171: SMALL ROMAN NUMERAL TWO*/
+ 0x2172, /* U+002172: SMALL ROMAN NUMERAL THREE*/
+ 0x2173, /* U+002173: SMALL ROMAN NUMERAL FOUR*/
+ 0x2174, /* U+002174: SMALL ROMAN NUMERAL FIVE*/
+ 0x2175, /* U+002175: SMALL ROMAN NUMERAL SIX*/
+ 0x2176, /* U+002176: SMALL ROMAN NUMERAL SEVEN*/
+ 0x2177, /* U+002177: SMALL ROMAN NUMERAL EIGHT*/
+ 0x2178, /* U+002178: SMALL ROMAN NUMERAL NINE*/
+ 0x2179, /* U+002179: SMALL ROMAN NUMERAL TEN*/
+ 0x217a, /* U+00217a: SMALL ROMAN NUMERAL ELEVEN*/
+ 0x217b, /* U+00217b: SMALL ROMAN NUMERAL TWELVE*/
+ 0x217c, /* U+00217c: SMALL ROMAN NUMERAL FIFTY*/
+ 0x217d, /* U+00217d: SMALL ROMAN NUMERAL ONE HUNDRED*/
+ 0x217e, /* U+00217e: SMALL ROMAN NUMERAL FIVE HUNDRED*/
+ 0x217f, /* U+00217f: SMALL ROMAN NUMERAL ONE THOUSAND*/
+ 0x2180, /* U+002180: ROMAN NUMERAL ONE THOUSAND C D*/
+ 0x2181, /* U+002181: ROMAN NUMERAL FIVE THOUSAND*/
+ 0x2182, /* U+002182: ROMAN NUMERAL TEN THOUSAND*/
+ 0x2184, /* U+002183: ROMAN NUMERAL REVERSED ONE HUNDRED*/
+ 0x2184, /* U+002184: LATIN SMALL LETTER REVERSED C*/
+ 0x2185, /* U+002185: ROMAN NUMERAL SIX LATE FORM*/
+ 0x2186, /* U+002186: ROMAN NUMERAL FIFTY EARLY FORM*/
+ 0x2187, /* U+002187: ROMAN NUMERAL FIFTY THOUSAND*/
+ 0x2188, /* U+002188: ROMAN NUMERAL ONE HUNDRED THOUSAND*/
+ 0x2189, /* U+002189: VULGAR FRACTION ZERO THIRDS*/
+ 0x218a, /* U+00218a: */
+ 0x218b, /* U+00218b: */
+ 0x218c, /* U+00218c: */
+ 0x218d, /* U+00218d: */
+ 0x218e, /* U+00218e: */
+ 0x218f, /* U+00218f: */
+ 0x2190, /* U+002190: LEFTWARDS ARROW*/
+ 0x2191, /* U+002191: UPWARDS ARROW*/
+ 0x2192, /* U+002192: RIGHTWARDS ARROW*/
+ 0x2193, /* U+002193: DOWNWARDS ARROW*/
+ 0x2194, /* U+002194: LEFT RIGHT ARROW*/
+ 0x2195, /* U+002195: UP DOWN ARROW*/
+ 0x2196, /* U+002196: NORTH WEST ARROW*/
+ 0x2197, /* U+002197: NORTH EAST ARROW*/
+ 0x2198, /* U+002198: SOUTH EAST ARROW*/
+ 0x2199, /* U+002199: SOUTH WEST ARROW*/
+ 0x219a, /* U+00219a: LEFTWARDS ARROW WITH STROKE*/
+ 0x219b, /* U+00219b: RIGHTWARDS ARROW WITH STROKE*/
+ 0x219c, /* U+00219c: LEFTWARDS WAVE ARROW*/
+ 0x219d, /* U+00219d: RIGHTWARDS WAVE ARROW*/
+ 0x219e, /* U+00219e: LEFTWARDS TWO HEADED ARROW*/
+ 0x219f, /* U+00219f: UPWARDS TWO HEADED ARROW*/
+ 0x21a0, /* U+0021a0: RIGHTWARDS TWO HEADED ARROW*/
+ 0x21a1, /* U+0021a1: DOWNWARDS TWO HEADED ARROW*/
+ 0x21a2, /* U+0021a2: LEFTWARDS ARROW WITH TAIL*/
+ 0x21a3, /* U+0021a3: RIGHTWARDS ARROW WITH TAIL*/
+ 0x21a4, /* U+0021a4: LEFTWARDS ARROW FROM BAR*/
+ 0x21a5, /* U+0021a5: UPWARDS ARROW FROM BAR*/
+ 0x21a6, /* U+0021a6: RIGHTWARDS ARROW FROM BAR*/
+ 0x21a7, /* U+0021a7: DOWNWARDS ARROW FROM BAR*/
+ 0x21a8, /* U+0021a8: UP DOWN ARROW WITH BASE*/
+ 0x21a9, /* U+0021a9: LEFTWARDS ARROW WITH HOOK*/
+ 0x21aa, /* U+0021aa: RIGHTWARDS ARROW WITH HOOK*/
+ 0x21ab, /* U+0021ab: LEFTWARDS ARROW WITH LOOP*/
+ 0x21ac, /* U+0021ac: RIGHTWARDS ARROW WITH LOOP*/
+ 0x21ad, /* U+0021ad: LEFT RIGHT WAVE ARROW*/
+ 0x21ae, /* U+0021ae: LEFT RIGHT ARROW WITH STROKE*/
+ 0x21af, /* U+0021af: DOWNWARDS ZIGZAG ARROW*/
+ 0x21b0, /* U+0021b0: UPWARDS ARROW WITH TIP LEFTWARDS*/
+ 0x21b1, /* U+0021b1: UPWARDS ARROW WITH TIP RIGHTWARDS*/
+ 0x21b2, /* U+0021b2: DOWNWARDS ARROW WITH TIP LEFTWARDS*/
+ 0x21b3, /* U+0021b3: DOWNWARDS ARROW WITH TIP RIGHTWARDS*/
+ 0x21b4, /* U+0021b4: RIGHTWARDS ARROW WITH CORNER DOWNWARDS*/
+ 0x21b5, /* U+0021b5: DOWNWARDS ARROW WITH CORNER LEFTWARDS*/
+ 0x21b6, /* U+0021b6: ANTICLOCKWISE TOP SEMICIRCLE ARROW*/
+ 0x21b7, /* U+0021b7: CLOCKWISE TOP SEMICIRCLE ARROW*/
+ 0x21b8, /* U+0021b8: NORTH WEST ARROW TO LONG BAR*/
+ 0x21b9, /* U+0021b9: LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR*/
+ 0x21ba, /* U+0021ba: ANTICLOCKWISE OPEN CIRCLE ARROW*/
+ 0x21bb, /* U+0021bb: CLOCKWISE OPEN CIRCLE ARROW*/
+ 0x21bc, /* U+0021bc: LEFTWARDS HARPOON WITH BARB UPWARDS*/
+ 0x21bd, /* U+0021bd: LEFTWARDS HARPOON WITH BARB DOWNWARDS*/
+ 0x21be, /* U+0021be: UPWARDS HARPOON WITH BARB RIGHTWARDS*/
+ 0x21bf, /* U+0021bf: UPWARDS HARPOON WITH BARB LEFTWARDS*/
+ 0x21c0, /* U+0021c0: RIGHTWARDS HARPOON WITH BARB UPWARDS*/
+ 0x21c1, /* U+0021c1: RIGHTWARDS HARPOON WITH BARB DOWNWARDS*/
+ 0x21c2, /* U+0021c2: DOWNWARDS HARPOON WITH BARB RIGHTWARDS*/
+ 0x21c3, /* U+0021c3: DOWNWARDS HARPOON WITH BARB LEFTWARDS*/
+ 0x21c4, /* U+0021c4: RIGHTWARDS ARROW OVER LEFTWARDS ARROW*/
+ 0x21c5, /* U+0021c5: UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW*/
+ 0x21c6, /* U+0021c6: LEFTWARDS ARROW OVER RIGHTWARDS ARROW*/
+ 0x21c7, /* U+0021c7: LEFTWARDS PAIRED ARROWS*/
+ 0x21c8, /* U+0021c8: UPWARDS PAIRED ARROWS*/
+ 0x21c9, /* U+0021c9: RIGHTWARDS PAIRED ARROWS*/
+ 0x21ca, /* U+0021ca: DOWNWARDS PAIRED ARROWS*/
+ 0x21cb, /* U+0021cb: LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON*/
+ 0x21cc, /* U+0021cc: RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON*/
+ 0x21cd, /* U+0021cd: LEFTWARDS DOUBLE ARROW WITH STROKE*/
+ 0x21ce, /* U+0021ce: LEFT RIGHT DOUBLE ARROW WITH STROKE*/
+ 0x21cf, /* U+0021cf: RIGHTWARDS DOUBLE ARROW WITH STROKE*/
+ 0x21d0, /* U+0021d0: LEFTWARDS DOUBLE ARROW*/
+ 0x21d1, /* U+0021d1: UPWARDS DOUBLE ARROW*/
+ 0x21d2, /* U+0021d2: RIGHTWARDS DOUBLE ARROW*/
+ 0x21d3, /* U+0021d3: DOWNWARDS DOUBLE ARROW*/
+ 0x21d4, /* U+0021d4: LEFT RIGHT DOUBLE ARROW*/
+ 0x21d5, /* U+0021d5: UP DOWN DOUBLE ARROW*/
+ 0x21d6, /* U+0021d6: NORTH WEST DOUBLE ARROW*/
+ 0x21d7, /* U+0021d7: NORTH EAST DOUBLE ARROW*/
+ 0x21d8, /* U+0021d8: SOUTH EAST DOUBLE ARROW*/
+ 0x21d9, /* U+0021d9: SOUTH WEST DOUBLE ARROW*/
+ 0x21da, /* U+0021da: LEFTWARDS TRIPLE ARROW*/
+ 0x21db, /* U+0021db: RIGHTWARDS TRIPLE ARROW*/
+ 0x21dc, /* U+0021dc: LEFTWARDS SQUIGGLE ARROW*/
+ 0x21dd, /* U+0021dd: RIGHTWARDS SQUIGGLE ARROW*/
+ 0x21de, /* U+0021de: UPWARDS ARROW WITH DOUBLE STROKE*/
+ 0x21df, /* U+0021df: DOWNWARDS ARROW WITH DOUBLE STROKE*/
+ 0x21e0, /* U+0021e0: LEFTWARDS DASHED ARROW*/
+ 0x21e1, /* U+0021e1: UPWARDS DASHED ARROW*/
+ 0x21e2, /* U+0021e2: RIGHTWARDS DASHED ARROW*/
+ 0x21e3, /* U+0021e3: DOWNWARDS DASHED ARROW*/
+ 0x21e4, /* U+0021e4: LEFTWARDS ARROW TO BAR*/
+ 0x21e5, /* U+0021e5: RIGHTWARDS ARROW TO BAR*/
+ 0x21e6, /* U+0021e6: LEFTWARDS WHITE ARROW*/
+ 0x21e7, /* U+0021e7: UPWARDS WHITE ARROW*/
+ 0x21e8, /* U+0021e8: RIGHTWARDS WHITE ARROW*/
+ 0x21e9, /* U+0021e9: DOWNWARDS WHITE ARROW*/
+ 0x21ea, /* U+0021ea: UPWARDS WHITE ARROW FROM BAR*/
+ 0x21eb, /* U+0021eb: UPWARDS WHITE ARROW ON PEDESTAL*/
+ 0x21ec, /* U+0021ec: UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR*/
+ 0x21ed, /* U+0021ed: UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR*/
+ 0x21ee, /* U+0021ee: UPWARDS WHITE DOUBLE ARROW*/
+ 0x21ef, /* U+0021ef: UPWARDS WHITE DOUBLE ARROW ON PEDESTAL*/
+ 0x21f0, /* U+0021f0: RIGHTWARDS WHITE ARROW FROM WALL*/
+ 0x21f1, /* U+0021f1: NORTH WEST ARROW TO CORNER*/
+ 0x21f2, /* U+0021f2: SOUTH EAST ARROW TO CORNER*/
+ 0x21f3, /* U+0021f3: UP DOWN WHITE ARROW*/
+ 0x21f4, /* U+0021f4: RIGHT ARROW WITH SMALL CIRCLE*/
+ 0x21f5, /* U+0021f5: DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW*/
+ 0x21f6, /* U+0021f6: THREE RIGHTWARDS ARROWS*/
+ 0x21f7, /* U+0021f7: LEFTWARDS ARROW WITH VERTICAL STROKE*/
+ 0x21f8, /* U+0021f8: RIGHTWARDS ARROW WITH VERTICAL STROKE*/
+ 0x21f9, /* U+0021f9: LEFT RIGHT ARROW WITH VERTICAL STROKE*/
+ 0x21fa, /* U+0021fa: LEFTWARDS ARROW WITH DOUBLE VERTICAL STROKE*/
+ 0x21fb, /* U+0021fb: RIGHTWARDS ARROW WITH DOUBLE VERTICAL STROKE*/
+ 0x21fc, /* U+0021fc: LEFT RIGHT ARROW WITH DOUBLE VERTICAL STROKE*/
+ 0x21fd, /* U+0021fd: LEFTWARDS OPEN-HEADED ARROW*/
+ 0x21fe, /* U+0021fe: RIGHTWARDS OPEN-HEADED ARROW*/
+ 0x21ff, /* U+0021ff: LEFT RIGHT OPEN-HEADED ARROW*/
+ 0x2200, /* U+002200: FOR ALL*/
+ 0x2201, /* U+002201: COMPLEMENT*/
+ 0x2202, /* U+002202: PARTIAL DIFFERENTIAL*/
+ 0x2203, /* U+002203: THERE EXISTS*/
+ 0x2204, /* U+002204: THERE DOES NOT EXIST*/
+ 0x2205, /* U+002205: EMPTY SET*/
+ 0x2206, /* U+002206: INCREMENT*/
+ 0x2207, /* U+002207: NABLA*/
+ 0x2208, /* U+002208: ELEMENT OF*/
+ 0x2209, /* U+002209: NOT AN ELEMENT OF*/
+ 0x220a, /* U+00220a: SMALL ELEMENT OF*/
+ 0x220b, /* U+00220b: CONTAINS AS MEMBER*/
+ 0x220c, /* U+00220c: DOES NOT CONTAIN AS MEMBER*/
+ 0x220d, /* U+00220d: SMALL CONTAINS AS MEMBER*/
+ 0x220e, /* U+00220e: END OF PROOF*/
+ 0x220f, /* U+00220f: N-ARY PRODUCT*/
+ 0x2210, /* U+002210: N-ARY COPRODUCT*/
+ 0x2211, /* U+002211: N-ARY SUMMATION*/
+ 0x2212, /* U+002212: MINUS SIGN*/
+ 0x2213, /* U+002213: MINUS-OR-PLUS SIGN*/
+ 0x2214, /* U+002214: DOT PLUS*/
+ 0x2215, /* U+002215: DIVISION SLASH*/
+ 0x2216, /* U+002216: SET MINUS*/
+ 0x2217, /* U+002217: ASTERISK OPERATOR*/
+ 0x2218, /* U+002218: RING OPERATOR*/
+ 0x2219, /* U+002219: BULLET OPERATOR*/
+ 0x221a, /* U+00221a: SQUARE ROOT*/
+ 0x221b, /* U+00221b: CUBE ROOT*/
+ 0x221c, /* U+00221c: FOURTH ROOT*/
+ 0x221d, /* U+00221d: PROPORTIONAL TO*/
+ 0x221e, /* U+00221e: INFINITY*/
+ 0x221f, /* U+00221f: RIGHT ANGLE*/
+ 0x2220, /* U+002220: ANGLE*/
+ 0x2221, /* U+002221: MEASURED ANGLE*/
+ 0x2222, /* U+002222: SPHERICAL ANGLE*/
+ 0x2223, /* U+002223: DIVIDES*/
+ 0x2224, /* U+002224: DOES NOT DIVIDE*/
+ 0x2225, /* U+002225: PARALLEL TO*/
+ 0x2226, /* U+002226: NOT PARALLEL TO*/
+ 0x2227, /* U+002227: LOGICAL AND*/
+ 0x2228, /* U+002228: LOGICAL OR*/
+ 0x2229, /* U+002229: INTERSECTION*/
+ 0x222a, /* U+00222a: UNION*/
+ 0x222b, /* U+00222b: INTEGRAL*/
+ 0x222c, /* U+00222c: DOUBLE INTEGRAL*/
+ 0x222d, /* U+00222d: TRIPLE INTEGRAL*/
+ 0x222e, /* U+00222e: CONTOUR INTEGRAL*/
+ 0x222f, /* U+00222f: SURFACE INTEGRAL*/
+ 0x2230, /* U+002230: VOLUME INTEGRAL*/
+ 0x2231, /* U+002231: CLOCKWISE INTEGRAL*/
+ 0x2232, /* U+002232: CLOCKWISE CONTOUR INTEGRAL*/
+ 0x2233, /* U+002233: ANTICLOCKWISE CONTOUR INTEGRAL*/
+ 0x2234, /* U+002234: THEREFORE*/
+ 0x2235, /* U+002235: BECAUSE*/
+ 0x2236, /* U+002236: RATIO*/
+ 0x2237, /* U+002237: PROPORTION*/
+ 0x2238, /* U+002238: DOT MINUS*/
+ 0x2239, /* U+002239: EXCESS*/
+ 0x223a, /* U+00223a: GEOMETRIC PROPORTION*/
+ 0x223b, /* U+00223b: HOMOTHETIC*/
+ 0x223c, /* U+00223c: TILDE OPERATOR*/
+ 0x223d, /* U+00223d: REVERSED TILDE*/
+ 0x223e, /* U+00223e: INVERTED LAZY S*/
+ 0x223f, /* U+00223f: SINE WAVE*/
+ 0x2240, /* U+002240: WREATH PRODUCT*/
+ 0x2241, /* U+002241: NOT TILDE*/
+ 0x2242, /* U+002242: MINUS TILDE*/
+ 0x2243, /* U+002243: ASYMPTOTICALLY EQUAL TO*/
+ 0x2244, /* U+002244: NOT ASYMPTOTICALLY EQUAL TO*/
+ 0x2245, /* U+002245: APPROXIMATELY EQUAL TO*/
+ 0x2246, /* U+002246: APPROXIMATELY BUT NOT ACTUALLY EQUAL TO*/
+ 0x2247, /* U+002247: NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO*/
+ 0x2248, /* U+002248: ALMOST EQUAL TO*/
+ 0x2249, /* U+002249: NOT ALMOST EQUAL TO*/
+ 0x224a, /* U+00224a: ALMOST EQUAL OR EQUAL TO*/
+ 0x224b, /* U+00224b: TRIPLE TILDE*/
+ 0x224c, /* U+00224c: ALL EQUAL TO*/
+ 0x224d, /* U+00224d: EQUIVALENT TO*/
+ 0x224e, /* U+00224e: GEOMETRICALLY EQUIVALENT TO*/
+ 0x224f, /* U+00224f: DIFFERENCE BETWEEN*/
+ 0x2250, /* U+002250: APPROACHES THE LIMIT*/
+ 0x2251, /* U+002251: GEOMETRICALLY EQUAL TO*/
+ 0x2252, /* U+002252: APPROXIMATELY EQUAL TO OR THE IMAGE OF*/
+ 0x2253, /* U+002253: IMAGE OF OR APPROXIMATELY EQUAL TO*/
+ 0x2254, /* U+002254: COLON EQUALS*/
+ 0x2255, /* U+002255: EQUALS COLON*/
+ 0x2256, /* U+002256: RING IN EQUAL TO*/
+ 0x2257, /* U+002257: RING EQUAL TO*/
+ 0x2258, /* U+002258: CORRESPONDS TO*/
+ 0x2259, /* U+002259: ESTIMATES*/
+ 0x225a, /* U+00225a: EQUIANGULAR TO*/
+ 0x225b, /* U+00225b: STAR EQUALS*/
+ 0x225c, /* U+00225c: DELTA EQUAL TO*/
+ 0x225d, /* U+00225d: EQUAL TO BY DEFINITION*/
+ 0x225e, /* U+00225e: MEASURED BY*/
+ 0x225f, /* U+00225f: QUESTIONED EQUAL TO*/
+ 0x2260, /* U+002260: NOT EQUAL TO*/
+ 0x2261, /* U+002261: IDENTICAL TO*/
+ 0x2262, /* U+002262: NOT IDENTICAL TO*/
+ 0x2263, /* U+002263: STRICTLY EQUIVALENT TO*/
+ 0x2264, /* U+002264: LESS-THAN OR EQUAL TO*/
+ 0x2265, /* U+002265: GREATER-THAN OR EQUAL TO*/
+ 0x2266, /* U+002266: LESS-THAN OVER EQUAL TO*/
+ 0x2267, /* U+002267: GREATER-THAN OVER EQUAL TO*/
+ 0x2268, /* U+002268: LESS-THAN BUT NOT EQUAL TO*/
+ 0x2269, /* U+002269: GREATER-THAN BUT NOT EQUAL TO*/
+ 0x226a, /* U+00226a: MUCH LESS-THAN*/
+ 0x226b, /* U+00226b: MUCH GREATER-THAN*/
+ 0x226c, /* U+00226c: BETWEEN*/
+ 0x226d, /* U+00226d: NOT EQUIVALENT TO*/
+ 0x226e, /* U+00226e: NOT LESS-THAN*/
+ 0x226f, /* U+00226f: NOT GREATER-THAN*/
+ 0x2270, /* U+002270: NEITHER LESS-THAN NOR EQUAL TO*/
+ 0x2271, /* U+002271: NEITHER GREATER-THAN NOR EQUAL TO*/
+ 0x2272, /* U+002272: LESS-THAN OR EQUIVALENT TO*/
+ 0x2273, /* U+002273: GREATER-THAN OR EQUIVALENT TO*/
+ 0x2274, /* U+002274: NEITHER LESS-THAN NOR EQUIVALENT TO*/
+ 0x2275, /* U+002275: NEITHER GREATER-THAN NOR EQUIVALENT TO*/
+ 0x2276, /* U+002276: LESS-THAN OR GREATER-THAN*/
+ 0x2277, /* U+002277: GREATER-THAN OR LESS-THAN*/
+ 0x2278, /* U+002278: NEITHER LESS-THAN NOR GREATER-THAN*/
+ 0x2279, /* U+002279: NEITHER GREATER-THAN NOR LESS-THAN*/
+ 0x227a, /* U+00227a: PRECEDES*/
+ 0x227b, /* U+00227b: SUCCEEDS*/
+ 0x227c, /* U+00227c: PRECEDES OR EQUAL TO*/
+ 0x227d, /* U+00227d: SUCCEEDS OR EQUAL TO*/
+ 0x227e, /* U+00227e: PRECEDES OR EQUIVALENT TO*/
+ 0x227f, /* U+00227f: SUCCEEDS OR EQUIVALENT TO*/
+ 0x2280, /* U+002280: DOES NOT PRECEDE*/
+ 0x2281, /* U+002281: DOES NOT SUCCEED*/
+ 0x2282, /* U+002282: SUBSET OF*/
+ 0x2283, /* U+002283: SUPERSET OF*/
+ 0x2284, /* U+002284: NOT A SUBSET OF*/
+ 0x2285, /* U+002285: NOT A SUPERSET OF*/
+ 0x2286, /* U+002286: SUBSET OF OR EQUAL TO*/
+ 0x2287, /* U+002287: SUPERSET OF OR EQUAL TO*/
+ 0x2288, /* U+002288: NEITHER A SUBSET OF NOR EQUAL TO*/
+ 0x2289, /* U+002289: NEITHER A SUPERSET OF NOR EQUAL TO*/
+ 0x228a, /* U+00228a: SUBSET OF WITH NOT EQUAL TO*/
+ 0x228b, /* U+00228b: SUPERSET OF WITH NOT EQUAL TO*/
+ 0x228c, /* U+00228c: MULTISET*/
+ 0x228d, /* U+00228d: MULTISET MULTIPLICATION*/
+ 0x228e, /* U+00228e: MULTISET UNION*/
+ 0x228f, /* U+00228f: SQUARE IMAGE OF*/
+ 0x2290, /* U+002290: SQUARE ORIGINAL OF*/
+ 0x2291, /* U+002291: SQUARE IMAGE OF OR EQUAL TO*/
+ 0x2292, /* U+002292: SQUARE ORIGINAL OF OR EQUAL TO*/
+ 0x2293, /* U+002293: SQUARE CAP*/
+ 0x2294, /* U+002294: SQUARE CUP*/
+ 0x2295, /* U+002295: CIRCLED PLUS*/
+ 0x2296, /* U+002296: CIRCLED MINUS*/
+ 0x2297, /* U+002297: CIRCLED TIMES*/
+ 0x2298, /* U+002298: CIRCLED DIVISION SLASH*/
+ 0x2299, /* U+002299: CIRCLED DOT OPERATOR*/
+ 0x229a, /* U+00229a: CIRCLED RING OPERATOR*/
+ 0x229b, /* U+00229b: CIRCLED ASTERISK OPERATOR*/
+ 0x229c, /* U+00229c: CIRCLED EQUALS*/
+ 0x229d, /* U+00229d: CIRCLED DASH*/
+ 0x229e, /* U+00229e: SQUARED PLUS*/
+ 0x229f, /* U+00229f: SQUARED MINUS*/
+ 0x22a0, /* U+0022a0: SQUARED TIMES*/
+ 0x22a1, /* U+0022a1: SQUARED DOT OPERATOR*/
+ 0x22a2, /* U+0022a2: RIGHT TACK*/
+ 0x22a3, /* U+0022a3: LEFT TACK*/
+ 0x22a4, /* U+0022a4: DOWN TACK*/
+ 0x22a5, /* U+0022a5: UP TACK*/
+ 0x22a6, /* U+0022a6: ASSERTION*/
+ 0x22a7, /* U+0022a7: MODELS*/
+ 0x22a8, /* U+0022a8: TRUE*/
+ 0x22a9, /* U+0022a9: FORCES*/
+ 0x22aa, /* U+0022aa: TRIPLE VERTICAL BAR RIGHT TURNSTILE*/
+ 0x22ab, /* U+0022ab: DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE*/
+ 0x22ac, /* U+0022ac: DOES NOT PROVE*/
+ 0x22ad, /* U+0022ad: NOT TRUE*/
+ 0x22ae, /* U+0022ae: DOES NOT FORCE*/
+ 0x22af, /* U+0022af: NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE*/
+ 0x22b0, /* U+0022b0: PRECEDES UNDER RELATION*/
+ 0x22b1, /* U+0022b1: SUCCEEDS UNDER RELATION*/
+ 0x22b2, /* U+0022b2: NORMAL SUBGROUP OF*/
+ 0x22b3, /* U+0022b3: CONTAINS AS NORMAL SUBGROUP*/
+ 0x22b4, /* U+0022b4: NORMAL SUBGROUP OF OR EQUAL TO*/
+ 0x22b5, /* U+0022b5: CONTAINS AS NORMAL SUBGROUP OR EQUAL TO*/
+ 0x22b6, /* U+0022b6: ORIGINAL OF*/
+ 0x22b7, /* U+0022b7: IMAGE OF*/
+ 0x22b8, /* U+0022b8: MULTIMAP*/
+ 0x22b9, /* U+0022b9: HERMITIAN CONJUGATE MATRIX*/
+ 0x22ba, /* U+0022ba: INTERCALATE*/
+ 0x22bb, /* U+0022bb: XOR*/
+ 0x22bc, /* U+0022bc: NAND*/
+ 0x22bd, /* U+0022bd: NOR*/
+ 0x22be, /* U+0022be: RIGHT ANGLE WITH ARC*/
+ 0x22bf, /* U+0022bf: RIGHT TRIANGLE*/
+ 0x22c0, /* U+0022c0: N-ARY LOGICAL AND*/
+ 0x22c1, /* U+0022c1: N-ARY LOGICAL OR*/
+ 0x22c2, /* U+0022c2: N-ARY INTERSECTION*/
+ 0x22c3, /* U+0022c3: N-ARY UNION*/
+ 0x22c4, /* U+0022c4: DIAMOND OPERATOR*/
+ 0x22c5, /* U+0022c5: DOT OPERATOR*/
+ 0x22c6, /* U+0022c6: STAR OPERATOR*/
+ 0x22c7, /* U+0022c7: DIVISION TIMES*/
+ 0x22c8, /* U+0022c8: BOWTIE*/
+ 0x22c9, /* U+0022c9: LEFT NORMAL FACTOR SEMIDIRECT PRODUCT*/
+ 0x22ca, /* U+0022ca: RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT*/
+ 0x22cb, /* U+0022cb: LEFT SEMIDIRECT PRODUCT*/
+ 0x22cc, /* U+0022cc: RIGHT SEMIDIRECT PRODUCT*/
+ 0x22cd, /* U+0022cd: REVERSED TILDE EQUALS*/
+ 0x22ce, /* U+0022ce: CURLY LOGICAL OR*/
+ 0x22cf, /* U+0022cf: CURLY LOGICAL AND*/
+ 0x22d0, /* U+0022d0: DOUBLE SUBSET*/
+ 0x22d1, /* U+0022d1: DOUBLE SUPERSET*/
+ 0x22d2, /* U+0022d2: DOUBLE INTERSECTION*/
+ 0x22d3, /* U+0022d3: DOUBLE UNION*/
+ 0x22d4, /* U+0022d4: PITCHFORK*/
+ 0x22d5, /* U+0022d5: EQUAL AND PARALLEL TO*/
+ 0x22d6, /* U+0022d6: LESS-THAN WITH DOT*/
+ 0x22d7, /* U+0022d7: GREATER-THAN WITH DOT*/
+ 0x22d8, /* U+0022d8: VERY MUCH LESS-THAN*/
+ 0x22d9, /* U+0022d9: VERY MUCH GREATER-THAN*/
+ 0x22da, /* U+0022da: LESS-THAN EQUAL TO OR GREATER-THAN*/
+ 0x22db, /* U+0022db: GREATER-THAN EQUAL TO OR LESS-THAN*/
+ 0x22dc, /* U+0022dc: EQUAL TO OR LESS-THAN*/
+ 0x22dd, /* U+0022dd: EQUAL TO OR GREATER-THAN*/
+ 0x22de, /* U+0022de: EQUAL TO OR PRECEDES*/
+ 0x22df, /* U+0022df: EQUAL TO OR SUCCEEDS*/
+ 0x22e0, /* U+0022e0: DOES NOT PRECEDE OR EQUAL*/
+ 0x22e1, /* U+0022e1: DOES NOT SUCCEED OR EQUAL*/
+ 0x22e2, /* U+0022e2: NOT SQUARE IMAGE OF OR EQUAL TO*/
+ 0x22e3, /* U+0022e3: NOT SQUARE ORIGINAL OF OR EQUAL TO*/
+ 0x22e4, /* U+0022e4: SQUARE IMAGE OF OR NOT EQUAL TO*/
+ 0x22e5, /* U+0022e5: SQUARE ORIGINAL OF OR NOT EQUAL TO*/
+ 0x22e6, /* U+0022e6: LESS-THAN BUT NOT EQUIVALENT TO*/
+ 0x22e7, /* U+0022e7: GREATER-THAN BUT NOT EQUIVALENT TO*/
+ 0x22e8, /* U+0022e8: PRECEDES BUT NOT EQUIVALENT TO*/
+ 0x22e9, /* U+0022e9: SUCCEEDS BUT NOT EQUIVALENT TO*/
+ 0x22ea, /* U+0022ea: NOT NORMAL SUBGROUP OF*/
+ 0x22eb, /* U+0022eb: DOES NOT CONTAIN AS NORMAL SUBGROUP*/
+ 0x22ec, /* U+0022ec: NOT NORMAL SUBGROUP OF OR EQUAL TO*/
+ 0x22ed, /* U+0022ed: DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL*/
+ 0x22ee, /* U+0022ee: VERTICAL ELLIPSIS*/
+ 0x22ef, /* U+0022ef: MIDLINE HORIZONTAL ELLIPSIS*/
+ 0x22f0, /* U+0022f0: UP RIGHT DIAGONAL ELLIPSIS*/
+ 0x22f1, /* U+0022f1: DOWN RIGHT DIAGONAL ELLIPSIS*/
+ 0x22f2, /* U+0022f2: ELEMENT OF WITH LONG HORIZONTAL STROKE*/
+ 0x22f3, /* U+0022f3: ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE*/
+ 0x22f4, /* U+0022f4: SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE*/
+ 0x22f5, /* U+0022f5: ELEMENT OF WITH DOT ABOVE*/
+ 0x22f6, /* U+0022f6: ELEMENT OF WITH OVERBAR*/
+ 0x22f7, /* U+0022f7: SMALL ELEMENT OF WITH OVERBAR*/
+ 0x22f8, /* U+0022f8: ELEMENT OF WITH UNDERBAR*/
+ 0x22f9, /* U+0022f9: ELEMENT OF WITH TWO HORIZONTAL STROKES*/
+ 0x22fa, /* U+0022fa: CONTAINS WITH LONG HORIZONTAL STROKE*/
+ 0x22fb, /* U+0022fb: CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE*/
+ 0x22fc, /* U+0022fc: SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE*/
+ 0x22fd, /* U+0022fd: CONTAINS WITH OVERBAR*/
+ 0x22fe, /* U+0022fe: SMALL CONTAINS WITH OVERBAR*/
+ 0x22ff, /* U+0022ff: Z NOTATION BAG MEMBERSHIP*/
+ 0x2300, /* U+002300: DIAMETER SIGN*/
+ 0x2301, /* U+002301: ELECTRIC ARROW*/
+ 0x2302, /* U+002302: HOUSE*/
+ 0x2303, /* U+002303: UP ARROWHEAD*/
+ 0x2304, /* U+002304: DOWN ARROWHEAD*/
+ 0x2305, /* U+002305: PROJECTIVE*/
+ 0x2306, /* U+002306: PERSPECTIVE*/
+ 0x2307, /* U+002307: WAVY LINE*/
+ 0x2308, /* U+002308: LEFT CEILING*/
+ 0x2309, /* U+002309: RIGHT CEILING*/
+ 0x230a, /* U+00230a: LEFT FLOOR*/
+ 0x230b, /* U+00230b: RIGHT FLOOR*/
+ 0x230c, /* U+00230c: BOTTOM RIGHT CROP*/
+ 0x230d, /* U+00230d: BOTTOM LEFT CROP*/
+ 0x230e, /* U+00230e: TOP RIGHT CROP*/
+ 0x230f, /* U+00230f: TOP LEFT CROP*/
+ 0x2310, /* U+002310: REVERSED NOT SIGN*/
+ 0x2311, /* U+002311: SQUARE LOZENGE*/
+ 0x2312, /* U+002312: ARC*/
+ 0x2313, /* U+002313: SEGMENT*/
+ 0x2314, /* U+002314: SECTOR*/
+ 0x2315, /* U+002315: TELEPHONE RECORDER*/
+ 0x2316, /* U+002316: POSITION INDICATOR*/
+ 0x2317, /* U+002317: VIEWDATA SQUARE*/
+ 0x2318, /* U+002318: PLACE OF INTEREST SIGN*/
+ 0x2319, /* U+002319: TURNED NOT SIGN*/
+ 0x231a, /* U+00231a: WATCH*/
+ 0x231b, /* U+00231b: HOURGLASS*/
+ 0x231c, /* U+00231c: TOP LEFT CORNER*/
+ 0x231d, /* U+00231d: TOP RIGHT CORNER*/
+ 0x231e, /* U+00231e: BOTTOM LEFT CORNER*/
+ 0x231f, /* U+00231f: BOTTOM RIGHT CORNER*/
+ 0x2320, /* U+002320: TOP HALF INTEGRAL*/
+ 0x2321, /* U+002321: BOTTOM HALF INTEGRAL*/
+ 0x2322, /* U+002322: FROWN*/
+ 0x2323, /* U+002323: SMILE*/
+ 0x2324, /* U+002324: UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS*/
+ 0x2325, /* U+002325: OPTION KEY*/
+ 0x2326, /* U+002326: ERASE TO THE RIGHT*/
+ 0x2327, /* U+002327: X IN A RECTANGLE BOX*/
+ 0x2328, /* U+002328: KEYBOARD*/
+ 0x2329, /* U+002329: LEFT-POINTING ANGLE BRACKET*/
+ 0x232a, /* U+00232a: RIGHT-POINTING ANGLE BRACKET*/
+ 0x232b, /* U+00232b: ERASE TO THE LEFT*/
+ 0x232c, /* U+00232c: BENZENE RING*/
+ 0x232d, /* U+00232d: CYLINDRICITY*/
+ 0x232e, /* U+00232e: ALL AROUND-PROFILE*/
+ 0x232f, /* U+00232f: SYMMETRY*/
+ 0x2330, /* U+002330: TOTAL RUNOUT*/
+ 0x2331, /* U+002331: DIMENSION ORIGIN*/
+ 0x2332, /* U+002332: CONICAL TAPER*/
+ 0x2333, /* U+002333: SLOPE*/
+ 0x2334, /* U+002334: COUNTERBORE*/
+ 0x2335, /* U+002335: COUNTERSINK*/
+ 0x2336, /* U+002336: APL FUNCTIONAL SYMBOL I-BEAM*/
+ 0x2337, /* U+002337: APL FUNCTIONAL SYMBOL SQUISH QUAD*/
+ 0x2338, /* U+002338: APL FUNCTIONAL SYMBOL QUAD EQUAL*/
+ 0x2339, /* U+002339: APL FUNCTIONAL SYMBOL QUAD DIVIDE*/
+ 0x233a, /* U+00233a: APL FUNCTIONAL SYMBOL QUAD DIAMOND*/
+ 0x233b, /* U+00233b: APL FUNCTIONAL SYMBOL QUAD JOT*/
+ 0x233c, /* U+00233c: APL FUNCTIONAL SYMBOL QUAD CIRCLE*/
+ 0x233d, /* U+00233d: APL FUNCTIONAL SYMBOL CIRCLE STILE*/
+ 0x233e, /* U+00233e: APL FUNCTIONAL SYMBOL CIRCLE JOT*/
+ 0x233f, /* U+00233f: APL FUNCTIONAL SYMBOL SLASH BAR*/
+ 0x2340, /* U+002340: APL FUNCTIONAL SYMBOL BACKSLASH BAR*/
+ 0x2341, /* U+002341: APL FUNCTIONAL SYMBOL QUAD SLASH*/
+ 0x2342, /* U+002342: APL FUNCTIONAL SYMBOL QUAD BACKSLASH*/
+ 0x2343, /* U+002343: APL FUNCTIONAL SYMBOL QUAD LESS-THAN*/
+ 0x2344, /* U+002344: APL FUNCTIONAL SYMBOL QUAD GREATER-THAN*/
+ 0x2345, /* U+002345: APL FUNCTIONAL SYMBOL LEFTWARDS VANE*/
+ 0x2346, /* U+002346: APL FUNCTIONAL SYMBOL RIGHTWARDS VANE*/
+ 0x2347, /* U+002347: APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW*/
+ 0x2348, /* U+002348: APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW*/
+ 0x2349, /* U+002349: APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH*/
+ 0x234a, /* U+00234a: APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR*/
+ 0x234b, /* U+00234b: APL FUNCTIONAL SYMBOL DELTA STILE*/
+ 0x234c, /* U+00234c: APL FUNCTIONAL SYMBOL QUAD DOWN CARET*/
+ 0x234d, /* U+00234d: APL FUNCTIONAL SYMBOL QUAD DELTA*/
+ 0x234e, /* U+00234e: APL FUNCTIONAL SYMBOL DOWN TACK JOT*/
+ 0x234f, /* U+00234f: APL FUNCTIONAL SYMBOL UPWARDS VANE*/
+ 0x2350, /* U+002350: APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW*/
+ 0x2351, /* U+002351: APL FUNCTIONAL SYMBOL UP TACK OVERBAR*/
+ 0x2352, /* U+002352: APL FUNCTIONAL SYMBOL DEL STILE*/
+ 0x2353, /* U+002353: APL FUNCTIONAL SYMBOL QUAD UP CARET*/
+ 0x2354, /* U+002354: APL FUNCTIONAL SYMBOL QUAD DEL*/
+ 0x2355, /* U+002355: APL FUNCTIONAL SYMBOL UP TACK JOT*/
+ 0x2356, /* U+002356: APL FUNCTIONAL SYMBOL DOWNWARDS VANE*/
+ 0x2357, /* U+002357: APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW*/
+ 0x2358, /* U+002358: APL FUNCTIONAL SYMBOL QUOTE UNDERBAR*/
+ 0x2359, /* U+002359: APL FUNCTIONAL SYMBOL DELTA UNDERBAR*/
+ 0x235a, /* U+00235a: APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR*/
+ 0x235b, /* U+00235b: APL FUNCTIONAL SYMBOL JOT UNDERBAR*/
+ 0x235c, /* U+00235c: APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR*/
+ 0x235d, /* U+00235d: APL FUNCTIONAL SYMBOL UP SHOE JOT*/
+ 0x235e, /* U+00235e: APL FUNCTIONAL SYMBOL QUOTE QUAD*/
+ 0x235f, /* U+00235f: APL FUNCTIONAL SYMBOL CIRCLE STAR*/
+ 0x2360, /* U+002360: APL FUNCTIONAL SYMBOL QUAD COLON*/
+ 0x2361, /* U+002361: APL FUNCTIONAL SYMBOL UP TACK DIAERESIS*/
+ 0x2362, /* U+002362: APL FUNCTIONAL SYMBOL DEL DIAERESIS*/
+ 0x2363, /* U+002363: APL FUNCTIONAL SYMBOL STAR DIAERESIS*/
+ 0x2364, /* U+002364: APL FUNCTIONAL SYMBOL JOT DIAERESIS*/
+ 0x2365, /* U+002365: APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS*/
+ 0x2366, /* U+002366: APL FUNCTIONAL SYMBOL DOWN SHOE STILE*/
+ 0x2367, /* U+002367: APL FUNCTIONAL SYMBOL LEFT SHOE STILE*/
+ 0x2368, /* U+002368: APL FUNCTIONAL SYMBOL TILDE DIAERESIS*/
+ 0x2369, /* U+002369: APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS*/
+ 0x236a, /* U+00236a: APL FUNCTIONAL SYMBOL COMMA BAR*/
+ 0x236b, /* U+00236b: APL FUNCTIONAL SYMBOL DEL TILDE*/
+ 0x236c, /* U+00236c: APL FUNCTIONAL SYMBOL ZILDE*/
+ 0x236d, /* U+00236d: APL FUNCTIONAL SYMBOL STILE TILDE*/
+ 0x236e, /* U+00236e: APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR*/
+ 0x236f, /* U+00236f: APL FUNCTIONAL SYMBOL QUAD NOT EQUAL*/
+ 0x2370, /* U+002370: APL FUNCTIONAL SYMBOL QUAD QUESTION*/
+ 0x2371, /* U+002371: APL FUNCTIONAL SYMBOL DOWN CARET TILDE*/
+ 0x2372, /* U+002372: APL FUNCTIONAL SYMBOL UP CARET TILDE*/
+ 0x2373, /* U+002373: APL FUNCTIONAL SYMBOL IOTA*/
+ 0x2374, /* U+002374: APL FUNCTIONAL SYMBOL RHO*/
+ 0x2375, /* U+002375: APL FUNCTIONAL SYMBOL OMEGA*/
+ 0x2376, /* U+002376: APL FUNCTIONAL SYMBOL ALPHA UNDERBAR*/
+ 0x2377, /* U+002377: APL FUNCTIONAL SYMBOL EPSILON UNDERBAR*/
+ 0x2378, /* U+002378: APL FUNCTIONAL SYMBOL IOTA UNDERBAR*/
+ 0x2379, /* U+002379: APL FUNCTIONAL SYMBOL OMEGA UNDERBAR*/
+ 0x237a, /* U+00237a: APL FUNCTIONAL SYMBOL ALPHA*/
+ 0x237b, /* U+00237b: NOT CHECK MARK*/
+ 0x237c, /* U+00237c: RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW*/
+ 0x237d, /* U+00237d: SHOULDERED OPEN BOX*/
+ 0x237e, /* U+00237e: BELL SYMBOL*/
+ 0x237f, /* U+00237f: VERTICAL LINE WITH MIDDLE DOT*/
+ 0x2380, /* U+002380: INSERTION SYMBOL*/
+ 0x2381, /* U+002381: CONTINUOUS UNDERLINE SYMBOL*/
+ 0x2382, /* U+002382: DISCONTINUOUS UNDERLINE SYMBOL*/
+ 0x2383, /* U+002383: EMPHASIS SYMBOL*/
+ 0x2384, /* U+002384: COMPOSITION SYMBOL*/
+ 0x2385, /* U+002385: WHITE SQUARE WITH CENTRE VERTICAL LINE*/
+ 0x2386, /* U+002386: ENTER SYMBOL*/
+ 0x2387, /* U+002387: ALTERNATIVE KEY SYMBOL*/
+ 0x2388, /* U+002388: HELM SYMBOL*/
+ 0x2389, /* U+002389: CIRCLED HORIZONTAL BAR WITH NOTCH*/
+ 0x238a, /* U+00238a: CIRCLED TRIANGLE DOWN*/
+ 0x238b, /* U+00238b: BROKEN CIRCLE WITH NORTHWEST ARROW*/
+ 0x238c, /* U+00238c: UNDO SYMBOL*/
+ 0x238d, /* U+00238d: MONOSTABLE SYMBOL*/
+ 0x238e, /* U+00238e: HYSTERESIS SYMBOL*/
+ 0x238f, /* U+00238f: OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL*/
+ 0x2390, /* U+002390: OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL*/
+ 0x2391, /* U+002391: PASSIVE-PULL-DOWN-OUTPUT SYMBOL*/
+ 0x2392, /* U+002392: PASSIVE-PULL-UP-OUTPUT SYMBOL*/
+ 0x2393, /* U+002393: DIRECT CURRENT SYMBOL FORM TWO*/
+ 0x2394, /* U+002394: SOFTWARE-FUNCTION SYMBOL*/
+ 0x2395, /* U+002395: APL FUNCTIONAL SYMBOL QUAD*/
+ 0x2396, /* U+002396: DECIMAL SEPARATOR KEY SYMBOL*/
+ 0x2397, /* U+002397: PREVIOUS PAGE*/
+ 0x2398, /* U+002398: NEXT PAGE*/
+ 0x2399, /* U+002399: PRINT SCREEN SYMBOL*/
+ 0x239a, /* U+00239a: CLEAR SCREEN SYMBOL*/
+ 0x239b, /* U+00239b: LEFT PARENTHESIS UPPER HOOK*/
+ 0x239c, /* U+00239c: LEFT PARENTHESIS EXTENSION*/
+ 0x239d, /* U+00239d: LEFT PARENTHESIS LOWER HOOK*/
+ 0x239e, /* U+00239e: RIGHT PARENTHESIS UPPER HOOK*/
+ 0x239f, /* U+00239f: RIGHT PARENTHESIS EXTENSION*/
+ 0x23a0, /* U+0023a0: RIGHT PARENTHESIS LOWER HOOK*/
+ 0x23a1, /* U+0023a1: LEFT SQUARE BRACKET UPPER CORNER*/
+ 0x23a2, /* U+0023a2: LEFT SQUARE BRACKET EXTENSION*/
+ 0x23a3, /* U+0023a3: LEFT SQUARE BRACKET LOWER CORNER*/
+ 0x23a4, /* U+0023a4: RIGHT SQUARE BRACKET UPPER CORNER*/
+ 0x23a5, /* U+0023a5: RIGHT SQUARE BRACKET EXTENSION*/
+ 0x23a6, /* U+0023a6: RIGHT SQUARE BRACKET LOWER CORNER*/
+ 0x23a7, /* U+0023a7: LEFT CURLY BRACKET UPPER HOOK*/
+ 0x23a8, /* U+0023a8: LEFT CURLY BRACKET MIDDLE PIECE*/
+ 0x23a9, /* U+0023a9: LEFT CURLY BRACKET LOWER HOOK*/
+ 0x23aa, /* U+0023aa: CURLY BRACKET EXTENSION*/
+ 0x23ab, /* U+0023ab: RIGHT CURLY BRACKET UPPER HOOK*/
+ 0x23ac, /* U+0023ac: RIGHT CURLY BRACKET MIDDLE PIECE*/
+ 0x23ad, /* U+0023ad: RIGHT CURLY BRACKET LOWER HOOK*/
+ 0x23ae, /* U+0023ae: INTEGRAL EXTENSION*/
+ 0x23af, /* U+0023af: HORIZONTAL LINE EXTENSION*/
+ 0x23b0, /* U+0023b0: UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION*/
+ 0x23b1, /* U+0023b1: UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION*/
+ 0x23b2, /* U+0023b2: SUMMATION TOP*/
+ 0x23b3, /* U+0023b3: SUMMATION BOTTOM*/
+ 0x23b4, /* U+0023b4: TOP SQUARE BRACKET*/
+ 0x23b5, /* U+0023b5: BOTTOM SQUARE BRACKET*/
+ 0x23b6, /* U+0023b6: BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET*/
+ 0x23b7, /* U+0023b7: RADICAL SYMBOL BOTTOM*/
+ 0x23b8, /* U+0023b8: LEFT VERTICAL BOX LINE*/
+ 0x23b9, /* U+0023b9: RIGHT VERTICAL BOX LINE*/
+ 0x23ba, /* U+0023ba: HORIZONTAL SCAN LINE-1*/
+ 0x23bb, /* U+0023bb: HORIZONTAL SCAN LINE-3*/
+ 0x23bc, /* U+0023bc: HORIZONTAL SCAN LINE-7*/
+ 0x23bd, /* U+0023bd: HORIZONTAL SCAN LINE-9*/
+ 0x23be, /* U+0023be: DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT*/
+ 0x23bf, /* U+0023bf: DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT*/
+ 0x23c0, /* U+0023c0: DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE*/
+ 0x23c1, /* U+0023c1: DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE*/
+ 0x23c2, /* U+0023c2: DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE*/
+ 0x23c3, /* U+0023c3: DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE*/
+ 0x23c4, /* U+0023c4: DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE*/
+ 0x23c5, /* U+0023c5: DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE*/
+ 0x23c6, /* U+0023c6: DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE*/
+ 0x23c7, /* U+0023c7: DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE*/
+ 0x23c8, /* U+0023c8: DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE*/
+ 0x23c9, /* U+0023c9: DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL*/
+ 0x23ca, /* U+0023ca: DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL*/
+ 0x23cb, /* U+0023cb: DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT*/
+ 0x23cc, /* U+0023cc: DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT*/
+ 0x23cd, /* U+0023cd: SQUARE FOOT*/
+ 0x23ce, /* U+0023ce: RETURN SYMBOL*/
+ 0x23cf, /* U+0023cf: EJECT SYMBOL*/
+ 0x23d0, /* U+0023d0: VERTICAL LINE EXTENSION*/
+ 0x23d1, /* U+0023d1: METRICAL BREVE*/
+ 0x23d2, /* U+0023d2: METRICAL LONG OVER SHORT*/
+ 0x23d3, /* U+0023d3: METRICAL SHORT OVER LONG*/
+ 0x23d4, /* U+0023d4: METRICAL LONG OVER TWO SHORTS*/
+ 0x23d5, /* U+0023d5: METRICAL TWO SHORTS OVER LONG*/
+ 0x23d6, /* U+0023d6: METRICAL TWO SHORTS JOINED*/
+ 0x23d7, /* U+0023d7: METRICAL TRISEME*/
+ 0x23d8, /* U+0023d8: METRICAL TETRASEME*/
+ 0x23d9, /* U+0023d9: METRICAL PENTASEME*/
+ 0x23da, /* U+0023da: EARTH GROUND*/
+ 0x23db, /* U+0023db: FUSE*/
+ 0x23dc, /* U+0023dc: TOP PARENTHESIS*/
+ 0x23dd, /* U+0023dd: BOTTOM PARENTHESIS*/
+ 0x23de, /* U+0023de: TOP CURLY BRACKET*/
+ 0x23df, /* U+0023df: BOTTOM CURLY BRACKET*/
+ 0x23e0, /* U+0023e0: TOP TORTOISE SHELL BRACKET*/
+ 0x23e1, /* U+0023e1: BOTTOM TORTOISE SHELL BRACKET*/
+ 0x23e2, /* U+0023e2: WHITE TRAPEZIUM*/
+ 0x23e3, /* U+0023e3: BENZENE RING WITH CIRCLE*/
+ 0x23e4, /* U+0023e4: STRAIGHTNESS*/
+ 0x23e5, /* U+0023e5: FLATNESS*/
+ 0x23e6, /* U+0023e6: AC CURRENT*/
+ 0x23e7, /* U+0023e7: ELECTRICAL INTERSECTION*/
+ 0x23e8, /* U+0023e8: DECIMAL EXPONENT SYMBOL*/
+ 0x23e9, /* U+0023e9: BLACK RIGHT-POINTING DOUBLE TRIANGLE*/
+ 0x23ea, /* U+0023ea: BLACK LEFT-POINTING DOUBLE TRIANGLE*/
+ 0x23eb, /* U+0023eb: BLACK UP-POINTING DOUBLE TRIANGLE*/
+ 0x23ec, /* U+0023ec: BLACK DOWN-POINTING DOUBLE TRIANGLE*/
+ 0x23ed, /* U+0023ed: BLACK RIGHT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR*/
+ 0x23ee, /* U+0023ee: BLACK LEFT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR*/
+ 0x23ef, /* U+0023ef: BLACK RIGHT-POINTING TRIANGLE WITH DOUBLE VERTICAL BAR*/
+ 0x23f0, /* U+0023f0: ALARM CLOCK*/
+ 0x23f1, /* U+0023f1: STOPWATCH*/
+ 0x23f2, /* U+0023f2: TIMER CLOCK*/
+ 0x23f3, /* U+0023f3: HOURGLASS WITH FLOWING SAND*/
+ 0x23f4, /* U+0023f4: */
+ 0x23f5, /* U+0023f5: */
+ 0x23f6, /* U+0023f6: */
+ 0x23f7, /* U+0023f7: */
+ 0x23f8, /* U+0023f8: */
+ 0x23f9, /* U+0023f9: */
+ 0x23fa, /* U+0023fa: */
+ 0x23fb, /* U+0023fb: */
+ 0x23fc, /* U+0023fc: */
+ 0x23fd, /* U+0023fd: */
+ 0x23fe, /* U+0023fe: */
+ 0x23ff, /* U+0023ff: */
+ 0x2400, /* U+002400: SYMBOL FOR NULL*/
+ 0x2401, /* U+002401: SYMBOL FOR START OF HEADING*/
+ 0x2402, /* U+002402: SYMBOL FOR START OF TEXT*/
+ 0x2403, /* U+002403: SYMBOL FOR END OF TEXT*/
+ 0x2404, /* U+002404: SYMBOL FOR END OF TRANSMISSION*/
+ 0x2405, /* U+002405: SYMBOL FOR ENQUIRY*/
+ 0x2406, /* U+002406: SYMBOL FOR ACKNOWLEDGE*/
+ 0x2407, /* U+002407: SYMBOL FOR BELL*/
+ 0x2408, /* U+002408: SYMBOL FOR BACKSPACE*/
+ 0x2409, /* U+002409: SYMBOL FOR HORIZONTAL TABULATION*/
+ 0x240a, /* U+00240a: SYMBOL FOR LINE FEED*/
+ 0x240b, /* U+00240b: SYMBOL FOR VERTICAL TABULATION*/
+ 0x240c, /* U+00240c: SYMBOL FOR FORM FEED*/
+ 0x240d, /* U+00240d: SYMBOL FOR CARRIAGE RETURN*/
+ 0x240e, /* U+00240e: SYMBOL FOR SHIFT OUT*/
+ 0x240f, /* U+00240f: SYMBOL FOR SHIFT IN*/
+ 0x2410, /* U+002410: SYMBOL FOR DATA LINK ESCAPE*/
+ 0x2411, /* U+002411: SYMBOL FOR DEVICE CONTROL ONE*/
+ 0x2412, /* U+002412: SYMBOL FOR DEVICE CONTROL TWO*/
+ 0x2413, /* U+002413: SYMBOL FOR DEVICE CONTROL THREE*/
+ 0x2414, /* U+002414: SYMBOL FOR DEVICE CONTROL FOUR*/
+ 0x2415, /* U+002415: SYMBOL FOR NEGATIVE ACKNOWLEDGE*/
+ 0x2416, /* U+002416: SYMBOL FOR SYNCHRONOUS IDLE*/
+ 0x2417, /* U+002417: SYMBOL FOR END OF TRANSMISSION BLOCK*/
+ 0x2418, /* U+002418: SYMBOL FOR CANCEL*/
+ 0x2419, /* U+002419: SYMBOL FOR END OF MEDIUM*/
+ 0x241a, /* U+00241a: SYMBOL FOR SUBSTITUTE*/
+ 0x241b, /* U+00241b: SYMBOL FOR ESCAPE*/
+ 0x241c, /* U+00241c: SYMBOL FOR FILE SEPARATOR*/
+ 0x241d, /* U+00241d: SYMBOL FOR GROUP SEPARATOR*/
+ 0x241e, /* U+00241e: SYMBOL FOR RECORD SEPARATOR*/
+ 0x241f, /* U+00241f: SYMBOL FOR UNIT SEPARATOR*/
+ 0x2420, /* U+002420: SYMBOL FOR SPACE*/
+ 0x2421, /* U+002421: SYMBOL FOR DELETE*/
+ 0x2422, /* U+002422: BLANK SYMBOL*/
+ 0x2423, /* U+002423: OPEN BOX*/
+ 0x2424, /* U+002424: SYMBOL FOR NEWLINE*/
+ 0x2425, /* U+002425: SYMBOL FOR DELETE FORM TWO*/
+ 0x2426, /* U+002426: SYMBOL FOR SUBSTITUTE FORM TWO*/
+ 0x2427, /* U+002427: */
+ 0x2428, /* U+002428: */
+ 0x2429, /* U+002429: */
+ 0x242a, /* U+00242a: */
+ 0x242b, /* U+00242b: */
+ 0x242c, /* U+00242c: */
+ 0x242d, /* U+00242d: */
+ 0x242e, /* U+00242e: */
+ 0x242f, /* U+00242f: */
+ 0x2430, /* U+002430: */
+ 0x2431, /* U+002431: */
+ 0x2432, /* U+002432: */
+ 0x2433, /* U+002433: */
+ 0x2434, /* U+002434: */
+ 0x2435, /* U+002435: */
+ 0x2436, /* U+002436: */
+ 0x2437, /* U+002437: */
+ 0x2438, /* U+002438: */
+ 0x2439, /* U+002439: */
+ 0x243a, /* U+00243a: */
+ 0x243b, /* U+00243b: */
+ 0x243c, /* U+00243c: */
+ 0x243d, /* U+00243d: */
+ 0x243e, /* U+00243e: */
+ 0x243f, /* U+00243f: */
+ 0x2440, /* U+002440: OCR HOOK*/
+ 0x2441, /* U+002441: OCR CHAIR*/
+ 0x2442, /* U+002442: OCR FORK*/
+ 0x2443, /* U+002443: OCR INVERTED FORK*/
+ 0x2444, /* U+002444: OCR BELT BUCKLE*/
+ 0x2445, /* U+002445: OCR BOW TIE*/
+ 0x2446, /* U+002446: OCR BRANCH BANK IDENTIFICATION*/
+ 0x2447, /* U+002447: OCR AMOUNT OF CHECK*/
+ 0x2448, /* U+002448: OCR DASH*/
+ 0x2449, /* U+002449: OCR CUSTOMER ACCOUNT NUMBER*/
+ 0x244a, /* U+00244a: OCR DOUBLE BACKSLASH*/
+ 0x244b, /* U+00244b: */
+ 0x244c, /* U+00244c: */
+ 0x244d, /* U+00244d: */
+ 0x244e, /* U+00244e: */
+ 0x244f, /* U+00244f: */
+ 0x2450, /* U+002450: */
+ 0x2451, /* U+002451: */
+ 0x2452, /* U+002452: */
+ 0x2453, /* U+002453: */
+ 0x2454, /* U+002454: */
+ 0x2455, /* U+002455: */
+ 0x2456, /* U+002456: */
+ 0x2457, /* U+002457: */
+ 0x2458, /* U+002458: */
+ 0x2459, /* U+002459: */
+ 0x245a, /* U+00245a: */
+ 0x245b, /* U+00245b: */
+ 0x245c, /* U+00245c: */
+ 0x245d, /* U+00245d: */
+ 0x245e, /* U+00245e: */
+ 0x245f, /* U+00245f: */
+ 0x2460, /* U+002460: CIRCLED DIGIT ONE*/
+ 0x2461, /* U+002461: CIRCLED DIGIT TWO*/
+ 0x2462, /* U+002462: CIRCLED DIGIT THREE*/
+ 0x2463, /* U+002463: CIRCLED DIGIT FOUR*/
+ 0x2464, /* U+002464: CIRCLED DIGIT FIVE*/
+ 0x2465, /* U+002465: CIRCLED DIGIT SIX*/
+ 0x2466, /* U+002466: CIRCLED DIGIT SEVEN*/
+ 0x2467, /* U+002467: CIRCLED DIGIT EIGHT*/
+ 0x2468, /* U+002468: CIRCLED DIGIT NINE*/
+ 0x2469, /* U+002469: CIRCLED NUMBER TEN*/
+ 0x246a, /* U+00246a: CIRCLED NUMBER ELEVEN*/
+ 0x246b, /* U+00246b: CIRCLED NUMBER TWELVE*/
+ 0x246c, /* U+00246c: CIRCLED NUMBER THIRTEEN*/
+ 0x246d, /* U+00246d: CIRCLED NUMBER FOURTEEN*/
+ 0x246e, /* U+00246e: CIRCLED NUMBER FIFTEEN*/
+ 0x246f, /* U+00246f: CIRCLED NUMBER SIXTEEN*/
+ 0x2470, /* U+002470: CIRCLED NUMBER SEVENTEEN*/
+ 0x2471, /* U+002471: CIRCLED NUMBER EIGHTEEN*/
+ 0x2472, /* U+002472: CIRCLED NUMBER NINETEEN*/
+ 0x2473, /* U+002473: CIRCLED NUMBER TWENTY*/
+ 0x2474, /* U+002474: PARENTHESIZED DIGIT ONE*/
+ 0x2475, /* U+002475: PARENTHESIZED DIGIT TWO*/
+ 0x2476, /* U+002476: PARENTHESIZED DIGIT THREE*/
+ 0x2477, /* U+002477: PARENTHESIZED DIGIT FOUR*/
+ 0x2478, /* U+002478: PARENTHESIZED DIGIT FIVE*/
+ 0x2479, /* U+002479: PARENTHESIZED DIGIT SIX*/
+ 0x247a, /* U+00247a: PARENTHESIZED DIGIT SEVEN*/
+ 0x247b, /* U+00247b: PARENTHESIZED DIGIT EIGHT*/
+ 0x247c, /* U+00247c: PARENTHESIZED DIGIT NINE*/
+ 0x247d, /* U+00247d: PARENTHESIZED NUMBER TEN*/
+ 0x247e, /* U+00247e: PARENTHESIZED NUMBER ELEVEN*/
+ 0x247f, /* U+00247f: PARENTHESIZED NUMBER TWELVE*/
+ 0x2480, /* U+002480: PARENTHESIZED NUMBER THIRTEEN*/
+ 0x2481, /* U+002481: PARENTHESIZED NUMBER FOURTEEN*/
+ 0x2482, /* U+002482: PARENTHESIZED NUMBER FIFTEEN*/
+ 0x2483, /* U+002483: PARENTHESIZED NUMBER SIXTEEN*/
+ 0x2484, /* U+002484: PARENTHESIZED NUMBER SEVENTEEN*/
+ 0x2485, /* U+002485: PARENTHESIZED NUMBER EIGHTEEN*/
+ 0x2486, /* U+002486: PARENTHESIZED NUMBER NINETEEN*/
+ 0x2487, /* U+002487: PARENTHESIZED NUMBER TWENTY*/
+ 0x2488, /* U+002488: DIGIT ONE FULL STOP*/
+ 0x2489, /* U+002489: DIGIT TWO FULL STOP*/
+ 0x248a, /* U+00248a: DIGIT THREE FULL STOP*/
+ 0x248b, /* U+00248b: DIGIT FOUR FULL STOP*/
+ 0x248c, /* U+00248c: DIGIT FIVE FULL STOP*/
+ 0x248d, /* U+00248d: DIGIT SIX FULL STOP*/
+ 0x248e, /* U+00248e: DIGIT SEVEN FULL STOP*/
+ 0x248f, /* U+00248f: DIGIT EIGHT FULL STOP*/
+ 0x2490, /* U+002490: DIGIT NINE FULL STOP*/
+ 0x2491, /* U+002491: NUMBER TEN FULL STOP*/
+ 0x2492, /* U+002492: NUMBER ELEVEN FULL STOP*/
+ 0x2493, /* U+002493: NUMBER TWELVE FULL STOP*/
+ 0x2494, /* U+002494: NUMBER THIRTEEN FULL STOP*/
+ 0x2495, /* U+002495: NUMBER FOURTEEN FULL STOP*/
+ 0x2496, /* U+002496: NUMBER FIFTEEN FULL STOP*/
+ 0x2497, /* U+002497: NUMBER SIXTEEN FULL STOP*/
+ 0x2498, /* U+002498: NUMBER SEVENTEEN FULL STOP*/
+ 0x2499, /* U+002499: NUMBER EIGHTEEN FULL STOP*/
+ 0x249a, /* U+00249a: NUMBER NINETEEN FULL STOP*/
+ 0x249b, /* U+00249b: NUMBER TWENTY FULL STOP*/
+ 0x249c, /* U+00249c: PARENTHESIZED LATIN SMALL LETTER A*/
+ 0x249d, /* U+00249d: PARENTHESIZED LATIN SMALL LETTER B*/
+ 0x249e, /* U+00249e: PARENTHESIZED LATIN SMALL LETTER C*/
+ 0x249f, /* U+00249f: PARENTHESIZED LATIN SMALL LETTER D*/
+ 0x24a0, /* U+0024a0: PARENTHESIZED LATIN SMALL LETTER E*/
+ 0x24a1, /* U+0024a1: PARENTHESIZED LATIN SMALL LETTER F*/
+ 0x24a2, /* U+0024a2: PARENTHESIZED LATIN SMALL LETTER G*/
+ 0x24a3, /* U+0024a3: PARENTHESIZED LATIN SMALL LETTER H*/
+ 0x24a4, /* U+0024a4: PARENTHESIZED LATIN SMALL LETTER I*/
+ 0x24a5, /* U+0024a5: PARENTHESIZED LATIN SMALL LETTER J*/
+ 0x24a6, /* U+0024a6: PARENTHESIZED LATIN SMALL LETTER K*/
+ 0x24a7, /* U+0024a7: PARENTHESIZED LATIN SMALL LETTER L*/
+ 0x24a8, /* U+0024a8: PARENTHESIZED LATIN SMALL LETTER M*/
+ 0x24a9, /* U+0024a9: PARENTHESIZED LATIN SMALL LETTER N*/
+ 0x24aa, /* U+0024aa: PARENTHESIZED LATIN SMALL LETTER O*/
+ 0x24ab, /* U+0024ab: PARENTHESIZED LATIN SMALL LETTER P*/
+ 0x24ac, /* U+0024ac: PARENTHESIZED LATIN SMALL LETTER Q*/
+ 0x24ad, /* U+0024ad: PARENTHESIZED LATIN SMALL LETTER R*/
+ 0x24ae, /* U+0024ae: PARENTHESIZED LATIN SMALL LETTER S*/
+ 0x24af, /* U+0024af: PARENTHESIZED LATIN SMALL LETTER T*/
+ 0x24b0, /* U+0024b0: PARENTHESIZED LATIN SMALL LETTER U*/
+ 0x24b1, /* U+0024b1: PARENTHESIZED LATIN SMALL LETTER V*/
+ 0x24b2, /* U+0024b2: PARENTHESIZED LATIN SMALL LETTER W*/
+ 0x24b3, /* U+0024b3: PARENTHESIZED LATIN SMALL LETTER X*/
+ 0x24b4, /* U+0024b4: PARENTHESIZED LATIN SMALL LETTER Y*/
+ 0x24b5, /* U+0024b5: PARENTHESIZED LATIN SMALL LETTER Z*/
+ 0x24d0, /* U+0024b6: CIRCLED LATIN CAPITAL LETTER A*/
+ 0x24d1, /* U+0024b7: CIRCLED LATIN CAPITAL LETTER B*/
+ 0x24d2, /* U+0024b8: CIRCLED LATIN CAPITAL LETTER C*/
+ 0x24d3, /* U+0024b9: CIRCLED LATIN CAPITAL LETTER D*/
+ 0x24d4, /* U+0024ba: CIRCLED LATIN CAPITAL LETTER E*/
+ 0x24d5, /* U+0024bb: CIRCLED LATIN CAPITAL LETTER F*/
+ 0x24d6, /* U+0024bc: CIRCLED LATIN CAPITAL LETTER G*/
+ 0x24d7, /* U+0024bd: CIRCLED LATIN CAPITAL LETTER H*/
+ 0x24d8, /* U+0024be: CIRCLED LATIN CAPITAL LETTER I*/
+ 0x24d9, /* U+0024bf: CIRCLED LATIN CAPITAL LETTER J*/
+ 0x24da, /* U+0024c0: CIRCLED LATIN CAPITAL LETTER K*/
+ 0x24db, /* U+0024c1: CIRCLED LATIN CAPITAL LETTER L*/
+ 0x24dc, /* U+0024c2: CIRCLED LATIN CAPITAL LETTER M*/
+ 0x24dd, /* U+0024c3: CIRCLED LATIN CAPITAL LETTER N*/
+ 0x24de, /* U+0024c4: CIRCLED LATIN CAPITAL LETTER O*/
+ 0x24df, /* U+0024c5: CIRCLED LATIN CAPITAL LETTER P*/
+ 0x24e0, /* U+0024c6: CIRCLED LATIN CAPITAL LETTER Q*/
+ 0x24e1, /* U+0024c7: CIRCLED LATIN CAPITAL LETTER R*/
+ 0x24e2, /* U+0024c8: CIRCLED LATIN CAPITAL LETTER S*/
+ 0x24e3, /* U+0024c9: CIRCLED LATIN CAPITAL LETTER T*/
+ 0x24e4, /* U+0024ca: CIRCLED LATIN CAPITAL LETTER U*/
+ 0x24e5, /* U+0024cb: CIRCLED LATIN CAPITAL LETTER V*/
+ 0x24e6, /* U+0024cc: CIRCLED LATIN CAPITAL LETTER W*/
+ 0x24e7, /* U+0024cd: CIRCLED LATIN CAPITAL LETTER X*/
+ 0x24e8, /* U+0024ce: CIRCLED LATIN CAPITAL LETTER Y*/
+ 0x24e9, /* U+0024cf: CIRCLED LATIN CAPITAL LETTER Z*/
+};
+
+static const RTUNICP g_afRTUniLower0x002c00[] =
+{
+ 0x2c30, /* U+002c00: GLAGOLITIC CAPITAL LETTER AZU*/
+ 0x2c31, /* U+002c01: GLAGOLITIC CAPITAL LETTER BUKY*/
+ 0x2c32, /* U+002c02: GLAGOLITIC CAPITAL LETTER VEDE*/
+ 0x2c33, /* U+002c03: GLAGOLITIC CAPITAL LETTER GLAGOLI*/
+ 0x2c34, /* U+002c04: GLAGOLITIC CAPITAL LETTER DOBRO*/
+ 0x2c35, /* U+002c05: GLAGOLITIC CAPITAL LETTER YESTU*/
+ 0x2c36, /* U+002c06: GLAGOLITIC CAPITAL LETTER ZHIVETE*/
+ 0x2c37, /* U+002c07: GLAGOLITIC CAPITAL LETTER DZELO*/
+ 0x2c38, /* U+002c08: GLAGOLITIC CAPITAL LETTER ZEMLJA*/
+ 0x2c39, /* U+002c09: GLAGOLITIC CAPITAL LETTER IZHE*/
+ 0x2c3a, /* U+002c0a: GLAGOLITIC CAPITAL LETTER INITIAL IZHE*/
+ 0x2c3b, /* U+002c0b: GLAGOLITIC CAPITAL LETTER I*/
+ 0x2c3c, /* U+002c0c: GLAGOLITIC CAPITAL LETTER DJERVI*/
+ 0x2c3d, /* U+002c0d: GLAGOLITIC CAPITAL LETTER KAKO*/
+ 0x2c3e, /* U+002c0e: GLAGOLITIC CAPITAL LETTER LJUDIJE*/
+ 0x2c3f, /* U+002c0f: GLAGOLITIC CAPITAL LETTER MYSLITE*/
+ 0x2c40, /* U+002c10: GLAGOLITIC CAPITAL LETTER NASHI*/
+ 0x2c41, /* U+002c11: GLAGOLITIC CAPITAL LETTER ONU*/
+ 0x2c42, /* U+002c12: GLAGOLITIC CAPITAL LETTER POKOJI*/
+ 0x2c43, /* U+002c13: GLAGOLITIC CAPITAL LETTER RITSI*/
+ 0x2c44, /* U+002c14: GLAGOLITIC CAPITAL LETTER SLOVO*/
+ 0x2c45, /* U+002c15: GLAGOLITIC CAPITAL LETTER TVRIDO*/
+ 0x2c46, /* U+002c16: GLAGOLITIC CAPITAL LETTER UKU*/
+ 0x2c47, /* U+002c17: GLAGOLITIC CAPITAL LETTER FRITU*/
+ 0x2c48, /* U+002c18: GLAGOLITIC CAPITAL LETTER HERU*/
+ 0x2c49, /* U+002c19: GLAGOLITIC CAPITAL LETTER OTU*/
+ 0x2c4a, /* U+002c1a: GLAGOLITIC CAPITAL LETTER PE*/
+ 0x2c4b, /* U+002c1b: GLAGOLITIC CAPITAL LETTER SHTA*/
+ 0x2c4c, /* U+002c1c: GLAGOLITIC CAPITAL LETTER TSI*/
+ 0x2c4d, /* U+002c1d: GLAGOLITIC CAPITAL LETTER CHRIVI*/
+ 0x2c4e, /* U+002c1e: GLAGOLITIC CAPITAL LETTER SHA*/
+ 0x2c4f, /* U+002c1f: GLAGOLITIC CAPITAL LETTER YERU*/
+ 0x2c50, /* U+002c20: GLAGOLITIC CAPITAL LETTER YERI*/
+ 0x2c51, /* U+002c21: GLAGOLITIC CAPITAL LETTER YATI*/
+ 0x2c52, /* U+002c22: GLAGOLITIC CAPITAL LETTER SPIDERY HA*/
+ 0x2c53, /* U+002c23: GLAGOLITIC CAPITAL LETTER YU*/
+ 0x2c54, /* U+002c24: GLAGOLITIC CAPITAL LETTER SMALL YUS*/
+ 0x2c55, /* U+002c25: GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL*/
+ 0x2c56, /* U+002c26: GLAGOLITIC CAPITAL LETTER YO*/
+ 0x2c57, /* U+002c27: GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS*/
+ 0x2c58, /* U+002c28: GLAGOLITIC CAPITAL LETTER BIG YUS*/
+ 0x2c59, /* U+002c29: GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS*/
+ 0x2c5a, /* U+002c2a: GLAGOLITIC CAPITAL LETTER FITA*/
+ 0x2c5b, /* U+002c2b: GLAGOLITIC CAPITAL LETTER IZHITSA*/
+ 0x2c5c, /* U+002c2c: GLAGOLITIC CAPITAL LETTER SHTAPIC*/
+ 0x2c5d, /* U+002c2d: GLAGOLITIC CAPITAL LETTER TROKUTASTI A*/
+ 0x2c5e, /* U+002c2e: GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE*/
+ 0x2c2f, /* U+002c2f: */
+ 0x2c30, /* U+002c30: GLAGOLITIC SMALL LETTER AZU*/
+ 0x2c31, /* U+002c31: GLAGOLITIC SMALL LETTER BUKY*/
+ 0x2c32, /* U+002c32: GLAGOLITIC SMALL LETTER VEDE*/
+ 0x2c33, /* U+002c33: GLAGOLITIC SMALL LETTER GLAGOLI*/
+ 0x2c34, /* U+002c34: GLAGOLITIC SMALL LETTER DOBRO*/
+ 0x2c35, /* U+002c35: GLAGOLITIC SMALL LETTER YESTU*/
+ 0x2c36, /* U+002c36: GLAGOLITIC SMALL LETTER ZHIVETE*/
+ 0x2c37, /* U+002c37: GLAGOLITIC SMALL LETTER DZELO*/
+ 0x2c38, /* U+002c38: GLAGOLITIC SMALL LETTER ZEMLJA*/
+ 0x2c39, /* U+002c39: GLAGOLITIC SMALL LETTER IZHE*/
+ 0x2c3a, /* U+002c3a: GLAGOLITIC SMALL LETTER INITIAL IZHE*/
+ 0x2c3b, /* U+002c3b: GLAGOLITIC SMALL LETTER I*/
+ 0x2c3c, /* U+002c3c: GLAGOLITIC SMALL LETTER DJERVI*/
+ 0x2c3d, /* U+002c3d: GLAGOLITIC SMALL LETTER KAKO*/
+ 0x2c3e, /* U+002c3e: GLAGOLITIC SMALL LETTER LJUDIJE*/
+ 0x2c3f, /* U+002c3f: GLAGOLITIC SMALL LETTER MYSLITE*/
+ 0x2c40, /* U+002c40: GLAGOLITIC SMALL LETTER NASHI*/
+ 0x2c41, /* U+002c41: GLAGOLITIC SMALL LETTER ONU*/
+ 0x2c42, /* U+002c42: GLAGOLITIC SMALL LETTER POKOJI*/
+ 0x2c43, /* U+002c43: GLAGOLITIC SMALL LETTER RITSI*/
+ 0x2c44, /* U+002c44: GLAGOLITIC SMALL LETTER SLOVO*/
+ 0x2c45, /* U+002c45: GLAGOLITIC SMALL LETTER TVRIDO*/
+ 0x2c46, /* U+002c46: GLAGOLITIC SMALL LETTER UKU*/
+ 0x2c47, /* U+002c47: GLAGOLITIC SMALL LETTER FRITU*/
+ 0x2c48, /* U+002c48: GLAGOLITIC SMALL LETTER HERU*/
+ 0x2c49, /* U+002c49: GLAGOLITIC SMALL LETTER OTU*/
+ 0x2c4a, /* U+002c4a: GLAGOLITIC SMALL LETTER PE*/
+ 0x2c4b, /* U+002c4b: GLAGOLITIC SMALL LETTER SHTA*/
+ 0x2c4c, /* U+002c4c: GLAGOLITIC SMALL LETTER TSI*/
+ 0x2c4d, /* U+002c4d: GLAGOLITIC SMALL LETTER CHRIVI*/
+ 0x2c4e, /* U+002c4e: GLAGOLITIC SMALL LETTER SHA*/
+ 0x2c4f, /* U+002c4f: GLAGOLITIC SMALL LETTER YERU*/
+ 0x2c50, /* U+002c50: GLAGOLITIC SMALL LETTER YERI*/
+ 0x2c51, /* U+002c51: GLAGOLITIC SMALL LETTER YATI*/
+ 0x2c52, /* U+002c52: GLAGOLITIC SMALL LETTER SPIDERY HA*/
+ 0x2c53, /* U+002c53: GLAGOLITIC SMALL LETTER YU*/
+ 0x2c54, /* U+002c54: GLAGOLITIC SMALL LETTER SMALL YUS*/
+ 0x2c55, /* U+002c55: GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL*/
+ 0x2c56, /* U+002c56: GLAGOLITIC SMALL LETTER YO*/
+ 0x2c57, /* U+002c57: GLAGOLITIC SMALL LETTER IOTATED SMALL YUS*/
+ 0x2c58, /* U+002c58: GLAGOLITIC SMALL LETTER BIG YUS*/
+ 0x2c59, /* U+002c59: GLAGOLITIC SMALL LETTER IOTATED BIG YUS*/
+ 0x2c5a, /* U+002c5a: GLAGOLITIC SMALL LETTER FITA*/
+ 0x2c5b, /* U+002c5b: GLAGOLITIC SMALL LETTER IZHITSA*/
+ 0x2c5c, /* U+002c5c: GLAGOLITIC SMALL LETTER SHTAPIC*/
+ 0x2c5d, /* U+002c5d: GLAGOLITIC SMALL LETTER TROKUTASTI A*/
+ 0x2c5e, /* U+002c5e: GLAGOLITIC SMALL LETTER LATINATE MYSLITE*/
+ 0x2c5f, /* U+002c5f: */
+ 0x2c61, /* U+002c60: LATIN CAPITAL LETTER L WITH DOUBLE BAR*/
+ 0x2c61, /* U+002c61: LATIN SMALL LETTER L WITH DOUBLE BAR*/
+ 0x26b, /* U+002c62: LATIN CAPITAL LETTER L WITH MIDDLE TILDE*/
+ 0x1d7d, /* U+002c63: LATIN CAPITAL LETTER P WITH STROKE*/
+ 0x27d, /* U+002c64: LATIN CAPITAL LETTER R WITH TAIL*/
+ 0x2c65, /* U+002c65: LATIN SMALL LETTER A WITH STROKE*/
+ 0x2c66, /* U+002c66: LATIN SMALL LETTER T WITH DIAGONAL STROKE*/
+ 0x2c68, /* U+002c67: LATIN CAPITAL LETTER H WITH DESCENDER*/
+ 0x2c68, /* U+002c68: LATIN SMALL LETTER H WITH DESCENDER*/
+ 0x2c6a, /* U+002c69: LATIN CAPITAL LETTER K WITH DESCENDER*/
+ 0x2c6a, /* U+002c6a: LATIN SMALL LETTER K WITH DESCENDER*/
+ 0x2c6c, /* U+002c6b: LATIN CAPITAL LETTER Z WITH DESCENDER*/
+ 0x2c6c, /* U+002c6c: LATIN SMALL LETTER Z WITH DESCENDER*/
+ 0x251, /* U+002c6d: LATIN CAPITAL LETTER ALPHA*/
+ 0x271, /* U+002c6e: LATIN CAPITAL LETTER M WITH HOOK*/
+ 0x250, /* U+002c6f: LATIN CAPITAL LETTER TURNED A*/
+ 0x252, /* U+002c70: LATIN CAPITAL LETTER TURNED ALPHA*/
+ 0x2c71, /* U+002c71: LATIN SMALL LETTER V WITH RIGHT HOOK*/
+ 0x2c73, /* U+002c72: LATIN CAPITAL LETTER W WITH HOOK*/
+ 0x2c73, /* U+002c73: LATIN SMALL LETTER W WITH HOOK*/
+ 0x2c74, /* U+002c74: LATIN SMALL LETTER V WITH CURL*/
+ 0x2c76, /* U+002c75: LATIN CAPITAL LETTER HALF H*/
+ 0x2c76, /* U+002c76: LATIN SMALL LETTER HALF H*/
+ 0x2c77, /* U+002c77: LATIN SMALL LETTER TAILLESS PHI*/
+ 0x2c78, /* U+002c78: LATIN SMALL LETTER E WITH NOTCH*/
+ 0x2c79, /* U+002c79: LATIN SMALL LETTER TURNED R WITH TAIL*/
+ 0x2c7a, /* U+002c7a: LATIN SMALL LETTER O WITH LOW RING INSIDE*/
+ 0x2c7b, /* U+002c7b: LATIN LETTER SMALL CAPITAL TURNED E*/
+ 0x2c7c, /* U+002c7c: LATIN SUBSCRIPT SMALL LETTER J*/
+ 0x2c7d, /* U+002c7d: MODIFIER LETTER CAPITAL V*/
+ 0x23f, /* U+002c7e: LATIN CAPITAL LETTER S WITH SWASH TAIL*/
+ 0x240, /* U+002c7f: LATIN CAPITAL LETTER Z WITH SWASH TAIL*/
+ 0x2c81, /* U+002c80: COPTIC CAPITAL LETTER ALFA*/
+ 0x2c81, /* U+002c81: COPTIC SMALL LETTER ALFA*/
+ 0x2c83, /* U+002c82: COPTIC CAPITAL LETTER VIDA*/
+ 0x2c83, /* U+002c83: COPTIC SMALL LETTER VIDA*/
+ 0x2c85, /* U+002c84: COPTIC CAPITAL LETTER GAMMA*/
+ 0x2c85, /* U+002c85: COPTIC SMALL LETTER GAMMA*/
+ 0x2c87, /* U+002c86: COPTIC CAPITAL LETTER DALDA*/
+ 0x2c87, /* U+002c87: COPTIC SMALL LETTER DALDA*/
+ 0x2c89, /* U+002c88: COPTIC CAPITAL LETTER EIE*/
+ 0x2c89, /* U+002c89: COPTIC SMALL LETTER EIE*/
+ 0x2c8b, /* U+002c8a: COPTIC CAPITAL LETTER SOU*/
+ 0x2c8b, /* U+002c8b: COPTIC SMALL LETTER SOU*/
+ 0x2c8d, /* U+002c8c: COPTIC CAPITAL LETTER ZATA*/
+ 0x2c8d, /* U+002c8d: COPTIC SMALL LETTER ZATA*/
+ 0x2c8f, /* U+002c8e: COPTIC CAPITAL LETTER HATE*/
+ 0x2c8f, /* U+002c8f: COPTIC SMALL LETTER HATE*/
+ 0x2c91, /* U+002c90: COPTIC CAPITAL LETTER THETHE*/
+ 0x2c91, /* U+002c91: COPTIC SMALL LETTER THETHE*/
+ 0x2c93, /* U+002c92: COPTIC CAPITAL LETTER IAUDA*/
+ 0x2c93, /* U+002c93: COPTIC SMALL LETTER IAUDA*/
+ 0x2c95, /* U+002c94: COPTIC CAPITAL LETTER KAPA*/
+ 0x2c95, /* U+002c95: COPTIC SMALL LETTER KAPA*/
+ 0x2c97, /* U+002c96: COPTIC CAPITAL LETTER LAULA*/
+ 0x2c97, /* U+002c97: COPTIC SMALL LETTER LAULA*/
+ 0x2c99, /* U+002c98: COPTIC CAPITAL LETTER MI*/
+ 0x2c99, /* U+002c99: COPTIC SMALL LETTER MI*/
+ 0x2c9b, /* U+002c9a: COPTIC CAPITAL LETTER NI*/
+ 0x2c9b, /* U+002c9b: COPTIC SMALL LETTER NI*/
+ 0x2c9d, /* U+002c9c: COPTIC CAPITAL LETTER KSI*/
+ 0x2c9d, /* U+002c9d: COPTIC SMALL LETTER KSI*/
+ 0x2c9f, /* U+002c9e: COPTIC CAPITAL LETTER O*/
+ 0x2c9f, /* U+002c9f: COPTIC SMALL LETTER O*/
+ 0x2ca1, /* U+002ca0: COPTIC CAPITAL LETTER PI*/
+ 0x2ca1, /* U+002ca1: COPTIC SMALL LETTER PI*/
+ 0x2ca3, /* U+002ca2: COPTIC CAPITAL LETTER RO*/
+ 0x2ca3, /* U+002ca3: COPTIC SMALL LETTER RO*/
+ 0x2ca5, /* U+002ca4: COPTIC CAPITAL LETTER SIMA*/
+ 0x2ca5, /* U+002ca5: COPTIC SMALL LETTER SIMA*/
+ 0x2ca7, /* U+002ca6: COPTIC CAPITAL LETTER TAU*/
+ 0x2ca7, /* U+002ca7: COPTIC SMALL LETTER TAU*/
+ 0x2ca9, /* U+002ca8: COPTIC CAPITAL LETTER UA*/
+ 0x2ca9, /* U+002ca9: COPTIC SMALL LETTER UA*/
+ 0x2cab, /* U+002caa: COPTIC CAPITAL LETTER FI*/
+ 0x2cab, /* U+002cab: COPTIC SMALL LETTER FI*/
+ 0x2cad, /* U+002cac: COPTIC CAPITAL LETTER KHI*/
+ 0x2cad, /* U+002cad: COPTIC SMALL LETTER KHI*/
+ 0x2caf, /* U+002cae: COPTIC CAPITAL LETTER PSI*/
+ 0x2caf, /* U+002caf: COPTIC SMALL LETTER PSI*/
+ 0x2cb1, /* U+002cb0: COPTIC CAPITAL LETTER OOU*/
+ 0x2cb1, /* U+002cb1: COPTIC SMALL LETTER OOU*/
+ 0x2cb3, /* U+002cb2: COPTIC CAPITAL LETTER DIALECT-P ALEF*/
+ 0x2cb3, /* U+002cb3: COPTIC SMALL LETTER DIALECT-P ALEF*/
+ 0x2cb5, /* U+002cb4: COPTIC CAPITAL LETTER OLD COPTIC AIN*/
+ 0x2cb5, /* U+002cb5: COPTIC SMALL LETTER OLD COPTIC AIN*/
+ 0x2cb7, /* U+002cb6: COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE*/
+ 0x2cb7, /* U+002cb7: COPTIC SMALL LETTER CRYPTOGRAMMIC EIE*/
+ 0x2cb9, /* U+002cb8: COPTIC CAPITAL LETTER DIALECT-P KAPA*/
+ 0x2cb9, /* U+002cb9: COPTIC SMALL LETTER DIALECT-P KAPA*/
+ 0x2cbb, /* U+002cba: COPTIC CAPITAL LETTER DIALECT-P NI*/
+ 0x2cbb, /* U+002cbb: COPTIC SMALL LETTER DIALECT-P NI*/
+ 0x2cbd, /* U+002cbc: COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI*/
+ 0x2cbd, /* U+002cbd: COPTIC SMALL LETTER CRYPTOGRAMMIC NI*/
+ 0x2cbf, /* U+002cbe: COPTIC CAPITAL LETTER OLD COPTIC OOU*/
+ 0x2cbf, /* U+002cbf: COPTIC SMALL LETTER OLD COPTIC OOU*/
+ 0x2cc1, /* U+002cc0: COPTIC CAPITAL LETTER SAMPI*/
+ 0x2cc1, /* U+002cc1: COPTIC SMALL LETTER SAMPI*/
+ 0x2cc3, /* U+002cc2: COPTIC CAPITAL LETTER CROSSED SHEI*/
+ 0x2cc3, /* U+002cc3: COPTIC SMALL LETTER CROSSED SHEI*/
+ 0x2cc5, /* U+002cc4: COPTIC CAPITAL LETTER OLD COPTIC SHEI*/
+ 0x2cc5, /* U+002cc5: COPTIC SMALL LETTER OLD COPTIC SHEI*/
+ 0x2cc7, /* U+002cc6: COPTIC CAPITAL LETTER OLD COPTIC ESH*/
+ 0x2cc7, /* U+002cc7: COPTIC SMALL LETTER OLD COPTIC ESH*/
+ 0x2cc9, /* U+002cc8: COPTIC CAPITAL LETTER AKHMIMIC KHEI*/
+ 0x2cc9, /* U+002cc9: COPTIC SMALL LETTER AKHMIMIC KHEI*/
+ 0x2ccb, /* U+002cca: COPTIC CAPITAL LETTER DIALECT-P HORI*/
+ 0x2ccb, /* U+002ccb: COPTIC SMALL LETTER DIALECT-P HORI*/
+ 0x2ccd, /* U+002ccc: COPTIC CAPITAL LETTER OLD COPTIC HORI*/
+ 0x2ccd, /* U+002ccd: COPTIC SMALL LETTER OLD COPTIC HORI*/
+ 0x2ccf, /* U+002cce: COPTIC CAPITAL LETTER OLD COPTIC HA*/
+ 0x2ccf, /* U+002ccf: COPTIC SMALL LETTER OLD COPTIC HA*/
+ 0x2cd1, /* U+002cd0: COPTIC CAPITAL LETTER L-SHAPED HA*/
+ 0x2cd1, /* U+002cd1: COPTIC SMALL LETTER L-SHAPED HA*/
+ 0x2cd3, /* U+002cd2: COPTIC CAPITAL LETTER OLD COPTIC HEI*/
+ 0x2cd3, /* U+002cd3: COPTIC SMALL LETTER OLD COPTIC HEI*/
+ 0x2cd5, /* U+002cd4: COPTIC CAPITAL LETTER OLD COPTIC HAT*/
+ 0x2cd5, /* U+002cd5: COPTIC SMALL LETTER OLD COPTIC HAT*/
+ 0x2cd7, /* U+002cd6: COPTIC CAPITAL LETTER OLD COPTIC GANGIA*/
+ 0x2cd7, /* U+002cd7: COPTIC SMALL LETTER OLD COPTIC GANGIA*/
+ 0x2cd9, /* U+002cd8: COPTIC CAPITAL LETTER OLD COPTIC DJA*/
+ 0x2cd9, /* U+002cd9: COPTIC SMALL LETTER OLD COPTIC DJA*/
+ 0x2cdb, /* U+002cda: COPTIC CAPITAL LETTER OLD COPTIC SHIMA*/
+ 0x2cdb, /* U+002cdb: COPTIC SMALL LETTER OLD COPTIC SHIMA*/
+ 0x2cdd, /* U+002cdc: COPTIC CAPITAL LETTER OLD NUBIAN SHIMA*/
+ 0x2cdd, /* U+002cdd: COPTIC SMALL LETTER OLD NUBIAN SHIMA*/
+ 0x2cdf, /* U+002cde: COPTIC CAPITAL LETTER OLD NUBIAN NGI*/
+ 0x2cdf, /* U+002cdf: COPTIC SMALL LETTER OLD NUBIAN NGI*/
+ 0x2ce1, /* U+002ce0: COPTIC CAPITAL LETTER OLD NUBIAN NYI*/
+ 0x2ce1, /* U+002ce1: COPTIC SMALL LETTER OLD NUBIAN NYI*/
+ 0x2ce3, /* U+002ce2: COPTIC CAPITAL LETTER OLD NUBIAN WAU*/
+ 0x2ce3, /* U+002ce3: COPTIC SMALL LETTER OLD NUBIAN WAU*/
+ 0x2ce4, /* U+002ce4: COPTIC SYMBOL KAI*/
+ 0x2ce5, /* U+002ce5: COPTIC SYMBOL MI RO*/
+ 0x2ce6, /* U+002ce6: COPTIC SYMBOL PI RO*/
+ 0x2ce7, /* U+002ce7: COPTIC SYMBOL STAUROS*/
+ 0x2ce8, /* U+002ce8: COPTIC SYMBOL TAU RO*/
+ 0x2ce9, /* U+002ce9: COPTIC SYMBOL KHI RO*/
+ 0x2cea, /* U+002cea: COPTIC SYMBOL SHIMA SIMA*/
+ 0x2cec, /* U+002ceb: COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI*/
+ 0x2cec, /* U+002cec: COPTIC SMALL LETTER CRYPTOGRAMMIC SHEI*/
+ 0x2cee, /* U+002ced: COPTIC CAPITAL LETTER CRYPTOGRAMMIC GANGIA*/
+ 0x2cee, /* U+002cee: COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA*/
+ 0x2cef, /* U+002cef: COPTIC COMBINING NI ABOVE*/
+ 0x2cf0, /* U+002cf0: COPTIC COMBINING SPIRITUS ASPER*/
+ 0x2cf1, /* U+002cf1: COPTIC COMBINING SPIRITUS LENIS*/
+ 0x2cf3, /* U+002cf2: COPTIC CAPITAL LETTER BOHAIRIC KHEI*/
+};
+
+static const RTUNICP g_afRTUniLower0x00a640[] =
+{
+ 0xa641, /* U+00a640: CYRILLIC CAPITAL LETTER ZEMLYA*/
+ 0xa641, /* U+00a641: CYRILLIC SMALL LETTER ZEMLYA*/
+ 0xa643, /* U+00a642: CYRILLIC CAPITAL LETTER DZELO*/
+ 0xa643, /* U+00a643: CYRILLIC SMALL LETTER DZELO*/
+ 0xa645, /* U+00a644: CYRILLIC CAPITAL LETTER REVERSED DZE*/
+ 0xa645, /* U+00a645: CYRILLIC SMALL LETTER REVERSED DZE*/
+ 0xa647, /* U+00a646: CYRILLIC CAPITAL LETTER IOTA*/
+ 0xa647, /* U+00a647: CYRILLIC SMALL LETTER IOTA*/
+ 0xa649, /* U+00a648: CYRILLIC CAPITAL LETTER DJERV*/
+ 0xa649, /* U+00a649: CYRILLIC SMALL LETTER DJERV*/
+ 0xa64b, /* U+00a64a: CYRILLIC CAPITAL LETTER MONOGRAPH UK*/
+ 0xa64b, /* U+00a64b: CYRILLIC SMALL LETTER MONOGRAPH UK*/
+ 0xa64d, /* U+00a64c: CYRILLIC CAPITAL LETTER BROAD OMEGA*/
+ 0xa64d, /* U+00a64d: CYRILLIC SMALL LETTER BROAD OMEGA*/
+ 0xa64f, /* U+00a64e: CYRILLIC CAPITAL LETTER NEUTRAL YER*/
+ 0xa64f, /* U+00a64f: CYRILLIC SMALL LETTER NEUTRAL YER*/
+ 0xa651, /* U+00a650: CYRILLIC CAPITAL LETTER YERU WITH BACK YER*/
+ 0xa651, /* U+00a651: CYRILLIC SMALL LETTER YERU WITH BACK YER*/
+ 0xa653, /* U+00a652: CYRILLIC CAPITAL LETTER IOTIFIED YAT*/
+ 0xa653, /* U+00a653: CYRILLIC SMALL LETTER IOTIFIED YAT*/
+ 0xa655, /* U+00a654: CYRILLIC CAPITAL LETTER REVERSED YU*/
+ 0xa655, /* U+00a655: CYRILLIC SMALL LETTER REVERSED YU*/
+ 0xa657, /* U+00a656: CYRILLIC CAPITAL LETTER IOTIFIED A*/
+ 0xa657, /* U+00a657: CYRILLIC SMALL LETTER IOTIFIED A*/
+ 0xa659, /* U+00a658: CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS*/
+ 0xa659, /* U+00a659: CYRILLIC SMALL LETTER CLOSED LITTLE YUS*/
+ 0xa65b, /* U+00a65a: CYRILLIC CAPITAL LETTER BLENDED YUS*/
+ 0xa65b, /* U+00a65b: CYRILLIC SMALL LETTER BLENDED YUS*/
+ 0xa65d, /* U+00a65c: CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS*/
+ 0xa65d, /* U+00a65d: CYRILLIC SMALL LETTER IOTIFIED CLOSED LITTLE YUS*/
+ 0xa65f, /* U+00a65e: CYRILLIC CAPITAL LETTER YN*/
+ 0xa65f, /* U+00a65f: CYRILLIC SMALL LETTER YN*/
+ 0xa661, /* U+00a660: CYRILLIC CAPITAL LETTER REVERSED TSE*/
+ 0xa661, /* U+00a661: CYRILLIC SMALL LETTER REVERSED TSE*/
+ 0xa663, /* U+00a662: CYRILLIC CAPITAL LETTER SOFT DE*/
+ 0xa663, /* U+00a663: CYRILLIC SMALL LETTER SOFT DE*/
+ 0xa665, /* U+00a664: CYRILLIC CAPITAL LETTER SOFT EL*/
+ 0xa665, /* U+00a665: CYRILLIC SMALL LETTER SOFT EL*/
+ 0xa667, /* U+00a666: CYRILLIC CAPITAL LETTER SOFT EM*/
+ 0xa667, /* U+00a667: CYRILLIC SMALL LETTER SOFT EM*/
+ 0xa669, /* U+00a668: CYRILLIC CAPITAL LETTER MONOCULAR O*/
+ 0xa669, /* U+00a669: CYRILLIC SMALL LETTER MONOCULAR O*/
+ 0xa66b, /* U+00a66a: CYRILLIC CAPITAL LETTER BINOCULAR O*/
+ 0xa66b, /* U+00a66b: CYRILLIC SMALL LETTER BINOCULAR O*/
+ 0xa66d, /* U+00a66c: CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O*/
+ 0xa66d, /* U+00a66d: CYRILLIC SMALL LETTER DOUBLE MONOCULAR O*/
+ 0xa66e, /* U+00a66e: CYRILLIC LETTER MULTIOCULAR O*/
+ 0xa66f, /* U+00a66f: COMBINING CYRILLIC VZMET*/
+ 0xa670, /* U+00a670: COMBINING CYRILLIC TEN MILLIONS SIGN*/
+ 0xa671, /* U+00a671: COMBINING CYRILLIC HUNDRED MILLIONS SIGN*/
+ 0xa672, /* U+00a672: COMBINING CYRILLIC THOUSAND MILLIONS SIGN*/
+ 0xa673, /* U+00a673: SLAVONIC ASTERISK*/
+ 0xa674, /* U+00a674: COMBINING CYRILLIC LETTER UKRAINIAN IE*/
+ 0xa675, /* U+00a675: COMBINING CYRILLIC LETTER I*/
+ 0xa676, /* U+00a676: COMBINING CYRILLIC LETTER YI*/
+ 0xa677, /* U+00a677: COMBINING CYRILLIC LETTER U*/
+ 0xa678, /* U+00a678: COMBINING CYRILLIC LETTER HARD SIGN*/
+ 0xa679, /* U+00a679: COMBINING CYRILLIC LETTER YERU*/
+ 0xa67a, /* U+00a67a: COMBINING CYRILLIC LETTER SOFT SIGN*/
+ 0xa67b, /* U+00a67b: COMBINING CYRILLIC LETTER OMEGA*/
+ 0xa67c, /* U+00a67c: COMBINING CYRILLIC KAVYKA*/
+ 0xa67d, /* U+00a67d: COMBINING CYRILLIC PAYEROK*/
+ 0xa67e, /* U+00a67e: CYRILLIC KAVYKA*/
+ 0xa67f, /* U+00a67f: CYRILLIC PAYEROK*/
+ 0xa681, /* U+00a680: CYRILLIC CAPITAL LETTER DWE*/
+ 0xa681, /* U+00a681: CYRILLIC SMALL LETTER DWE*/
+ 0xa683, /* U+00a682: CYRILLIC CAPITAL LETTER DZWE*/
+ 0xa683, /* U+00a683: CYRILLIC SMALL LETTER DZWE*/
+ 0xa685, /* U+00a684: CYRILLIC CAPITAL LETTER ZHWE*/
+ 0xa685, /* U+00a685: CYRILLIC SMALL LETTER ZHWE*/
+ 0xa687, /* U+00a686: CYRILLIC CAPITAL LETTER CCHE*/
+ 0xa687, /* U+00a687: CYRILLIC SMALL LETTER CCHE*/
+ 0xa689, /* U+00a688: CYRILLIC CAPITAL LETTER DZZE*/
+ 0xa689, /* U+00a689: CYRILLIC SMALL LETTER DZZE*/
+ 0xa68b, /* U+00a68a: CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK*/
+ 0xa68b, /* U+00a68b: CYRILLIC SMALL LETTER TE WITH MIDDLE HOOK*/
+ 0xa68d, /* U+00a68c: CYRILLIC CAPITAL LETTER TWE*/
+ 0xa68d, /* U+00a68d: CYRILLIC SMALL LETTER TWE*/
+ 0xa68f, /* U+00a68e: CYRILLIC CAPITAL LETTER TSWE*/
+ 0xa68f, /* U+00a68f: CYRILLIC SMALL LETTER TSWE*/
+ 0xa691, /* U+00a690: CYRILLIC CAPITAL LETTER TSSE*/
+ 0xa691, /* U+00a691: CYRILLIC SMALL LETTER TSSE*/
+ 0xa693, /* U+00a692: CYRILLIC CAPITAL LETTER TCHE*/
+ 0xa693, /* U+00a693: CYRILLIC SMALL LETTER TCHE*/
+ 0xa695, /* U+00a694: CYRILLIC CAPITAL LETTER HWE*/
+ 0xa695, /* U+00a695: CYRILLIC SMALL LETTER HWE*/
+ 0xa697, /* U+00a696: CYRILLIC CAPITAL LETTER SHWE*/
+ 0xa697, /* U+00a697: CYRILLIC SMALL LETTER SHWE*/
+ 0xa698, /* U+00a698: */
+ 0xa699, /* U+00a699: */
+ 0xa69a, /* U+00a69a: */
+ 0xa69b, /* U+00a69b: */
+ 0xa69c, /* U+00a69c: */
+ 0xa69d, /* U+00a69d: */
+ 0xa69e, /* U+00a69e: */
+ 0xa69f, /* U+00a69f: COMBINING CYRILLIC LETTER IOTIFIED E*/
+ 0xa6a0, /* U+00a6a0: BAMUM LETTER A*/
+ 0xa6a1, /* U+00a6a1: BAMUM LETTER KA*/
+ 0xa6a2, /* U+00a6a2: BAMUM LETTER U*/
+ 0xa6a3, /* U+00a6a3: BAMUM LETTER KU*/
+ 0xa6a4, /* U+00a6a4: BAMUM LETTER EE*/
+ 0xa6a5, /* U+00a6a5: BAMUM LETTER REE*/
+ 0xa6a6, /* U+00a6a6: BAMUM LETTER TAE*/
+ 0xa6a7, /* U+00a6a7: BAMUM LETTER O*/
+ 0xa6a8, /* U+00a6a8: BAMUM LETTER NYI*/
+ 0xa6a9, /* U+00a6a9: BAMUM LETTER I*/
+ 0xa6aa, /* U+00a6aa: BAMUM LETTER LA*/
+ 0xa6ab, /* U+00a6ab: BAMUM LETTER PA*/
+ 0xa6ac, /* U+00a6ac: BAMUM LETTER RII*/
+ 0xa6ad, /* U+00a6ad: BAMUM LETTER RIEE*/
+ 0xa6ae, /* U+00a6ae: BAMUM LETTER LEEEE*/
+ 0xa6af, /* U+00a6af: BAMUM LETTER MEEEE*/
+ 0xa6b0, /* U+00a6b0: BAMUM LETTER TAA*/
+ 0xa6b1, /* U+00a6b1: BAMUM LETTER NDAA*/
+ 0xa6b2, /* U+00a6b2: BAMUM LETTER NJAEM*/
+ 0xa6b3, /* U+00a6b3: BAMUM LETTER M*/
+ 0xa6b4, /* U+00a6b4: BAMUM LETTER SUU*/
+ 0xa6b5, /* U+00a6b5: BAMUM LETTER MU*/
+ 0xa6b6, /* U+00a6b6: BAMUM LETTER SHII*/
+ 0xa6b7, /* U+00a6b7: BAMUM LETTER SI*/
+ 0xa6b8, /* U+00a6b8: BAMUM LETTER SHEUX*/
+ 0xa6b9, /* U+00a6b9: BAMUM LETTER SEUX*/
+ 0xa6ba, /* U+00a6ba: BAMUM LETTER KYEE*/
+ 0xa6bb, /* U+00a6bb: BAMUM LETTER KET*/
+ 0xa6bc, /* U+00a6bc: BAMUM LETTER NUAE*/
+ 0xa6bd, /* U+00a6bd: BAMUM LETTER NU*/
+ 0xa6be, /* U+00a6be: BAMUM LETTER NJUAE*/
+ 0xa6bf, /* U+00a6bf: BAMUM LETTER YOQ*/
+ 0xa6c0, /* U+00a6c0: BAMUM LETTER SHU*/
+ 0xa6c1, /* U+00a6c1: BAMUM LETTER YUQ*/
+ 0xa6c2, /* U+00a6c2: BAMUM LETTER YA*/
+ 0xa6c3, /* U+00a6c3: BAMUM LETTER NSHA*/
+ 0xa6c4, /* U+00a6c4: BAMUM LETTER KEUX*/
+ 0xa6c5, /* U+00a6c5: BAMUM LETTER PEUX*/
+ 0xa6c6, /* U+00a6c6: BAMUM LETTER NJEE*/
+ 0xa6c7, /* U+00a6c7: BAMUM LETTER NTEE*/
+ 0xa6c8, /* U+00a6c8: BAMUM LETTER PUE*/
+ 0xa6c9, /* U+00a6c9: BAMUM LETTER WUE*/
+ 0xa6ca, /* U+00a6ca: BAMUM LETTER PEE*/
+ 0xa6cb, /* U+00a6cb: BAMUM LETTER FEE*/
+ 0xa6cc, /* U+00a6cc: BAMUM LETTER RU*/
+ 0xa6cd, /* U+00a6cd: BAMUM LETTER LU*/
+ 0xa6ce, /* U+00a6ce: BAMUM LETTER MI*/
+ 0xa6cf, /* U+00a6cf: BAMUM LETTER NI*/
+ 0xa6d0, /* U+00a6d0: BAMUM LETTER REUX*/
+ 0xa6d1, /* U+00a6d1: BAMUM LETTER RAE*/
+ 0xa6d2, /* U+00a6d2: BAMUM LETTER KEN*/
+ 0xa6d3, /* U+00a6d3: BAMUM LETTER NGKWAEN*/
+ 0xa6d4, /* U+00a6d4: BAMUM LETTER NGGA*/
+ 0xa6d5, /* U+00a6d5: BAMUM LETTER NGA*/
+ 0xa6d6, /* U+00a6d6: BAMUM LETTER SHO*/
+ 0xa6d7, /* U+00a6d7: BAMUM LETTER PUAE*/
+ 0xa6d8, /* U+00a6d8: BAMUM LETTER FU*/
+ 0xa6d9, /* U+00a6d9: BAMUM LETTER FOM*/
+ 0xa6da, /* U+00a6da: BAMUM LETTER WA*/
+ 0xa6db, /* U+00a6db: BAMUM LETTER NA*/
+ 0xa6dc, /* U+00a6dc: BAMUM LETTER LI*/
+ 0xa6dd, /* U+00a6dd: BAMUM LETTER PI*/
+ 0xa6de, /* U+00a6de: BAMUM LETTER LOQ*/
+ 0xa6df, /* U+00a6df: BAMUM LETTER KO*/
+ 0xa6e0, /* U+00a6e0: BAMUM LETTER MBEN*/
+ 0xa6e1, /* U+00a6e1: BAMUM LETTER REN*/
+ 0xa6e2, /* U+00a6e2: BAMUM LETTER MEN*/
+ 0xa6e3, /* U+00a6e3: BAMUM LETTER MA*/
+ 0xa6e4, /* U+00a6e4: BAMUM LETTER TI*/
+ 0xa6e5, /* U+00a6e5: BAMUM LETTER KI*/
+ 0xa6e6, /* U+00a6e6: BAMUM LETTER MO*/
+ 0xa6e7, /* U+00a6e7: BAMUM LETTER MBAA*/
+ 0xa6e8, /* U+00a6e8: BAMUM LETTER TET*/
+ 0xa6e9, /* U+00a6e9: BAMUM LETTER KPA*/
+ 0xa6ea, /* U+00a6ea: BAMUM LETTER TEN*/
+ 0xa6eb, /* U+00a6eb: BAMUM LETTER NTUU*/
+ 0xa6ec, /* U+00a6ec: BAMUM LETTER SAMBA*/
+ 0xa6ed, /* U+00a6ed: BAMUM LETTER FAAMAE*/
+ 0xa6ee, /* U+00a6ee: BAMUM LETTER KOVUU*/
+ 0xa6ef, /* U+00a6ef: BAMUM LETTER KOGHOM*/
+ 0xa6f0, /* U+00a6f0: BAMUM COMBINING MARK KOQNDON*/
+ 0xa6f1, /* U+00a6f1: BAMUM COMBINING MARK TUKWENTIS*/
+ 0xa6f2, /* U+00a6f2: BAMUM NJAEMLI*/
+ 0xa6f3, /* U+00a6f3: BAMUM FULL STOP*/
+ 0xa6f4, /* U+00a6f4: BAMUM COLON*/
+ 0xa6f5, /* U+00a6f5: BAMUM COMMA*/
+ 0xa6f6, /* U+00a6f6: BAMUM SEMICOLON*/
+ 0xa6f7, /* U+00a6f7: BAMUM QUESTION MARK*/
+ 0xa6f8, /* U+00a6f8: */
+ 0xa6f9, /* U+00a6f9: */
+ 0xa6fa, /* U+00a6fa: */
+ 0xa6fb, /* U+00a6fb: */
+ 0xa6fc, /* U+00a6fc: */
+ 0xa6fd, /* U+00a6fd: */
+ 0xa6fe, /* U+00a6fe: */
+ 0xa6ff, /* U+00a6ff: */
+ 0xa700, /* U+00a700: MODIFIER LETTER CHINESE TONE YIN PING*/
+ 0xa701, /* U+00a701: MODIFIER LETTER CHINESE TONE YANG PING*/
+ 0xa702, /* U+00a702: MODIFIER LETTER CHINESE TONE YIN SHANG*/
+ 0xa703, /* U+00a703: MODIFIER LETTER CHINESE TONE YANG SHANG*/
+ 0xa704, /* U+00a704: MODIFIER LETTER CHINESE TONE YIN QU*/
+ 0xa705, /* U+00a705: MODIFIER LETTER CHINESE TONE YANG QU*/
+ 0xa706, /* U+00a706: MODIFIER LETTER CHINESE TONE YIN RU*/
+ 0xa707, /* U+00a707: MODIFIER LETTER CHINESE TONE YANG RU*/
+ 0xa708, /* U+00a708: MODIFIER LETTER EXTRA-HIGH DOTTED TONE BAR*/
+ 0xa709, /* U+00a709: MODIFIER LETTER HIGH DOTTED TONE BAR*/
+ 0xa70a, /* U+00a70a: MODIFIER LETTER MID DOTTED TONE BAR*/
+ 0xa70b, /* U+00a70b: MODIFIER LETTER LOW DOTTED TONE BAR*/
+ 0xa70c, /* U+00a70c: MODIFIER LETTER EXTRA-LOW DOTTED TONE BAR*/
+ 0xa70d, /* U+00a70d: MODIFIER LETTER EXTRA-HIGH DOTTED LEFT-STEM TONE BAR*/
+ 0xa70e, /* U+00a70e: MODIFIER LETTER HIGH DOTTED LEFT-STEM TONE BAR*/
+ 0xa70f, /* U+00a70f: MODIFIER LETTER MID DOTTED LEFT-STEM TONE BAR*/
+ 0xa710, /* U+00a710: MODIFIER LETTER LOW DOTTED LEFT-STEM TONE BAR*/
+ 0xa711, /* U+00a711: MODIFIER LETTER EXTRA-LOW DOTTED LEFT-STEM TONE BAR*/
+ 0xa712, /* U+00a712: MODIFIER LETTER EXTRA-HIGH LEFT-STEM TONE BAR*/
+ 0xa713, /* U+00a713: MODIFIER LETTER HIGH LEFT-STEM TONE BAR*/
+ 0xa714, /* U+00a714: MODIFIER LETTER MID LEFT-STEM TONE BAR*/
+ 0xa715, /* U+00a715: MODIFIER LETTER LOW LEFT-STEM TONE BAR*/
+ 0xa716, /* U+00a716: MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR*/
+ 0xa717, /* U+00a717: MODIFIER LETTER DOT VERTICAL BAR*/
+ 0xa718, /* U+00a718: MODIFIER LETTER DOT SLASH*/
+ 0xa719, /* U+00a719: MODIFIER LETTER DOT HORIZONTAL BAR*/
+ 0xa71a, /* U+00a71a: MODIFIER LETTER LOWER RIGHT CORNER ANGLE*/
+ 0xa71b, /* U+00a71b: MODIFIER LETTER RAISED UP ARROW*/
+ 0xa71c, /* U+00a71c: MODIFIER LETTER RAISED DOWN ARROW*/
+ 0xa71d, /* U+00a71d: MODIFIER LETTER RAISED EXCLAMATION MARK*/
+ 0xa71e, /* U+00a71e: MODIFIER LETTER RAISED INVERTED EXCLAMATION MARK*/
+ 0xa71f, /* U+00a71f: MODIFIER LETTER LOW INVERTED EXCLAMATION MARK*/
+ 0xa720, /* U+00a720: MODIFIER LETTER STRESS AND HIGH TONE*/
+ 0xa721, /* U+00a721: MODIFIER LETTER STRESS AND LOW TONE*/
+ 0xa723, /* U+00a722: LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF*/
+ 0xa723, /* U+00a723: LATIN SMALL LETTER EGYPTOLOGICAL ALEF*/
+ 0xa725, /* U+00a724: LATIN CAPITAL LETTER EGYPTOLOGICAL AIN*/
+ 0xa725, /* U+00a725: LATIN SMALL LETTER EGYPTOLOGICAL AIN*/
+ 0xa727, /* U+00a726: LATIN CAPITAL LETTER HENG*/
+ 0xa727, /* U+00a727: LATIN SMALL LETTER HENG*/
+ 0xa729, /* U+00a728: LATIN CAPITAL LETTER TZ*/
+ 0xa729, /* U+00a729: LATIN SMALL LETTER TZ*/
+ 0xa72b, /* U+00a72a: LATIN CAPITAL LETTER TRESILLO*/
+ 0xa72b, /* U+00a72b: LATIN SMALL LETTER TRESILLO*/
+ 0xa72d, /* U+00a72c: LATIN CAPITAL LETTER CUATRILLO*/
+ 0xa72d, /* U+00a72d: LATIN SMALL LETTER CUATRILLO*/
+ 0xa72f, /* U+00a72e: LATIN CAPITAL LETTER CUATRILLO WITH COMMA*/
+ 0xa72f, /* U+00a72f: LATIN SMALL LETTER CUATRILLO WITH COMMA*/
+ 0xa730, /* U+00a730: LATIN LETTER SMALL CAPITAL F*/
+ 0xa731, /* U+00a731: LATIN LETTER SMALL CAPITAL S*/
+ 0xa733, /* U+00a732: LATIN CAPITAL LETTER AA*/
+ 0xa733, /* U+00a733: LATIN SMALL LETTER AA*/
+ 0xa735, /* U+00a734: LATIN CAPITAL LETTER AO*/
+ 0xa735, /* U+00a735: LATIN SMALL LETTER AO*/
+ 0xa737, /* U+00a736: LATIN CAPITAL LETTER AU*/
+ 0xa737, /* U+00a737: LATIN SMALL LETTER AU*/
+ 0xa739, /* U+00a738: LATIN CAPITAL LETTER AV*/
+ 0xa739, /* U+00a739: LATIN SMALL LETTER AV*/
+ 0xa73b, /* U+00a73a: LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR*/
+ 0xa73b, /* U+00a73b: LATIN SMALL LETTER AV WITH HORIZONTAL BAR*/
+ 0xa73d, /* U+00a73c: LATIN CAPITAL LETTER AY*/
+ 0xa73d, /* U+00a73d: LATIN SMALL LETTER AY*/
+ 0xa73f, /* U+00a73e: LATIN CAPITAL LETTER REVERSED C WITH DOT*/
+ 0xa73f, /* U+00a73f: LATIN SMALL LETTER REVERSED C WITH DOT*/
+ 0xa741, /* U+00a740: LATIN CAPITAL LETTER K WITH STROKE*/
+ 0xa741, /* U+00a741: LATIN SMALL LETTER K WITH STROKE*/
+ 0xa743, /* U+00a742: LATIN CAPITAL LETTER K WITH DIAGONAL STROKE*/
+ 0xa743, /* U+00a743: LATIN SMALL LETTER K WITH DIAGONAL STROKE*/
+ 0xa745, /* U+00a744: LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE*/
+ 0xa745, /* U+00a745: LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE*/
+ 0xa747, /* U+00a746: LATIN CAPITAL LETTER BROKEN L*/
+ 0xa747, /* U+00a747: LATIN SMALL LETTER BROKEN L*/
+ 0xa749, /* U+00a748: LATIN CAPITAL LETTER L WITH HIGH STROKE*/
+ 0xa749, /* U+00a749: LATIN SMALL LETTER L WITH HIGH STROKE*/
+ 0xa74b, /* U+00a74a: LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY*/
+ 0xa74b, /* U+00a74b: LATIN SMALL LETTER O WITH LONG STROKE OVERLAY*/
+ 0xa74d, /* U+00a74c: LATIN CAPITAL LETTER O WITH LOOP*/
+ 0xa74d, /* U+00a74d: LATIN SMALL LETTER O WITH LOOP*/
+ 0xa74f, /* U+00a74e: LATIN CAPITAL LETTER OO*/
+ 0xa74f, /* U+00a74f: LATIN SMALL LETTER OO*/
+ 0xa751, /* U+00a750: LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER*/
+ 0xa751, /* U+00a751: LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER*/
+ 0xa753, /* U+00a752: LATIN CAPITAL LETTER P WITH FLOURISH*/
+ 0xa753, /* U+00a753: LATIN SMALL LETTER P WITH FLOURISH*/
+ 0xa755, /* U+00a754: LATIN CAPITAL LETTER P WITH SQUIRREL TAIL*/
+ 0xa755, /* U+00a755: LATIN SMALL LETTER P WITH SQUIRREL TAIL*/
+ 0xa757, /* U+00a756: LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER*/
+ 0xa757, /* U+00a757: LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER*/
+ 0xa759, /* U+00a758: LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE*/
+ 0xa759, /* U+00a759: LATIN SMALL LETTER Q WITH DIAGONAL STROKE*/
+ 0xa75b, /* U+00a75a: LATIN CAPITAL LETTER R ROTUNDA*/
+ 0xa75b, /* U+00a75b: LATIN SMALL LETTER R ROTUNDA*/
+ 0xa75d, /* U+00a75c: LATIN CAPITAL LETTER RUM ROTUNDA*/
+ 0xa75d, /* U+00a75d: LATIN SMALL LETTER RUM ROTUNDA*/
+ 0xa75f, /* U+00a75e: LATIN CAPITAL LETTER V WITH DIAGONAL STROKE*/
+ 0xa75f, /* U+00a75f: LATIN SMALL LETTER V WITH DIAGONAL STROKE*/
+ 0xa761, /* U+00a760: LATIN CAPITAL LETTER VY*/
+ 0xa761, /* U+00a761: LATIN SMALL LETTER VY*/
+ 0xa763, /* U+00a762: LATIN CAPITAL LETTER VISIGOTHIC Z*/
+ 0xa763, /* U+00a763: LATIN SMALL LETTER VISIGOTHIC Z*/
+ 0xa765, /* U+00a764: LATIN CAPITAL LETTER THORN WITH STROKE*/
+ 0xa765, /* U+00a765: LATIN SMALL LETTER THORN WITH STROKE*/
+ 0xa767, /* U+00a766: LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER*/
+ 0xa767, /* U+00a767: LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER*/
+ 0xa769, /* U+00a768: LATIN CAPITAL LETTER VEND*/
+ 0xa769, /* U+00a769: LATIN SMALL LETTER VEND*/
+ 0xa76b, /* U+00a76a: LATIN CAPITAL LETTER ET*/
+ 0xa76b, /* U+00a76b: LATIN SMALL LETTER ET*/
+ 0xa76d, /* U+00a76c: LATIN CAPITAL LETTER IS*/
+ 0xa76d, /* U+00a76d: LATIN SMALL LETTER IS*/
+ 0xa76f, /* U+00a76e: LATIN CAPITAL LETTER CON*/
+ 0xa76f, /* U+00a76f: LATIN SMALL LETTER CON*/
+ 0xa770, /* U+00a770: MODIFIER LETTER US*/
+ 0xa771, /* U+00a771: LATIN SMALL LETTER DUM*/
+ 0xa772, /* U+00a772: LATIN SMALL LETTER LUM*/
+ 0xa773, /* U+00a773: LATIN SMALL LETTER MUM*/
+ 0xa774, /* U+00a774: LATIN SMALL LETTER NUM*/
+ 0xa775, /* U+00a775: LATIN SMALL LETTER RUM*/
+ 0xa776, /* U+00a776: LATIN LETTER SMALL CAPITAL RUM*/
+ 0xa777, /* U+00a777: LATIN SMALL LETTER TUM*/
+ 0xa778, /* U+00a778: LATIN SMALL LETTER UM*/
+ 0xa77a, /* U+00a779: LATIN CAPITAL LETTER INSULAR D*/
+ 0xa77a, /* U+00a77a: LATIN SMALL LETTER INSULAR D*/
+ 0xa77c, /* U+00a77b: LATIN CAPITAL LETTER INSULAR F*/
+ 0xa77c, /* U+00a77c: LATIN SMALL LETTER INSULAR F*/
+ 0x1d79, /* U+00a77d: LATIN CAPITAL LETTER INSULAR G*/
+ 0xa77f, /* U+00a77e: LATIN CAPITAL LETTER TURNED INSULAR G*/
+ 0xa77f, /* U+00a77f: LATIN SMALL LETTER TURNED INSULAR G*/
+ 0xa781, /* U+00a780: LATIN CAPITAL LETTER TURNED L*/
+ 0xa781, /* U+00a781: LATIN SMALL LETTER TURNED L*/
+ 0xa783, /* U+00a782: LATIN CAPITAL LETTER INSULAR R*/
+ 0xa783, /* U+00a783: LATIN SMALL LETTER INSULAR R*/
+ 0xa785, /* U+00a784: LATIN CAPITAL LETTER INSULAR S*/
+ 0xa785, /* U+00a785: LATIN SMALL LETTER INSULAR S*/
+ 0xa787, /* U+00a786: LATIN CAPITAL LETTER INSULAR T*/
+ 0xa787, /* U+00a787: LATIN SMALL LETTER INSULAR T*/
+ 0xa788, /* U+00a788: MODIFIER LETTER LOW CIRCUMFLEX ACCENT*/
+ 0xa789, /* U+00a789: MODIFIER LETTER COLON*/
+ 0xa78a, /* U+00a78a: MODIFIER LETTER SHORT EQUALS SIGN*/
+ 0xa78c, /* U+00a78b: LATIN CAPITAL LETTER SALTILLO*/
+ 0xa78c, /* U+00a78c: LATIN SMALL LETTER SALTILLO*/
+ 0x265, /* U+00a78d: LATIN CAPITAL LETTER TURNED H*/
+ 0xa78e, /* U+00a78e: LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT*/
+ 0xa78f, /* U+00a78f: */
+ 0xa791, /* U+00a790: LATIN CAPITAL LETTER N WITH DESCENDER*/
+ 0xa791, /* U+00a791: LATIN SMALL LETTER N WITH DESCENDER*/
+ 0xa793, /* U+00a792: LATIN CAPITAL LETTER C WITH BAR*/
+ 0xa793, /* U+00a793: LATIN SMALL LETTER C WITH BAR*/
+ 0xa794, /* U+00a794: */
+ 0xa795, /* U+00a795: */
+ 0xa796, /* U+00a796: */
+ 0xa797, /* U+00a797: */
+ 0xa798, /* U+00a798: */
+ 0xa799, /* U+00a799: */
+ 0xa79a, /* U+00a79a: */
+ 0xa79b, /* U+00a79b: */
+ 0xa79c, /* U+00a79c: */
+ 0xa79d, /* U+00a79d: */
+ 0xa79e, /* U+00a79e: */
+ 0xa79f, /* U+00a79f: */
+ 0xa7a1, /* U+00a7a0: LATIN CAPITAL LETTER G WITH OBLIQUE STROKE*/
+ 0xa7a1, /* U+00a7a1: LATIN SMALL LETTER G WITH OBLIQUE STROKE*/
+ 0xa7a3, /* U+00a7a2: LATIN CAPITAL LETTER K WITH OBLIQUE STROKE*/
+ 0xa7a3, /* U+00a7a3: LATIN SMALL LETTER K WITH OBLIQUE STROKE*/
+ 0xa7a5, /* U+00a7a4: LATIN CAPITAL LETTER N WITH OBLIQUE STROKE*/
+ 0xa7a5, /* U+00a7a5: LATIN SMALL LETTER N WITH OBLIQUE STROKE*/
+ 0xa7a7, /* U+00a7a6: LATIN CAPITAL LETTER R WITH OBLIQUE STROKE*/
+ 0xa7a7, /* U+00a7a7: LATIN SMALL LETTER R WITH OBLIQUE STROKE*/
+ 0xa7a9, /* U+00a7a8: LATIN CAPITAL LETTER S WITH OBLIQUE STROKE*/
+ 0xa7a9, /* U+00a7a9: LATIN SMALL LETTER S WITH OBLIQUE STROKE*/
+ 0x266, /* U+00a7aa: LATIN CAPITAL LETTER H WITH HOOK*/
+};
+
+static const RTUNICP g_afRTUniLower0x00ff21[] =
+{
+ 0xff41, /* U+00ff21: FULLWIDTH LATIN CAPITAL LETTER A*/
+ 0xff42, /* U+00ff22: FULLWIDTH LATIN CAPITAL LETTER B*/
+ 0xff43, /* U+00ff23: FULLWIDTH LATIN CAPITAL LETTER C*/
+ 0xff44, /* U+00ff24: FULLWIDTH LATIN CAPITAL LETTER D*/
+ 0xff45, /* U+00ff25: FULLWIDTH LATIN CAPITAL LETTER E*/
+ 0xff46, /* U+00ff26: FULLWIDTH LATIN CAPITAL LETTER F*/
+ 0xff47, /* U+00ff27: FULLWIDTH LATIN CAPITAL LETTER G*/
+ 0xff48, /* U+00ff28: FULLWIDTH LATIN CAPITAL LETTER H*/
+ 0xff49, /* U+00ff29: FULLWIDTH LATIN CAPITAL LETTER I*/
+ 0xff4a, /* U+00ff2a: FULLWIDTH LATIN CAPITAL LETTER J*/
+ 0xff4b, /* U+00ff2b: FULLWIDTH LATIN CAPITAL LETTER K*/
+ 0xff4c, /* U+00ff2c: FULLWIDTH LATIN CAPITAL LETTER L*/
+ 0xff4d, /* U+00ff2d: FULLWIDTH LATIN CAPITAL LETTER M*/
+ 0xff4e, /* U+00ff2e: FULLWIDTH LATIN CAPITAL LETTER N*/
+ 0xff4f, /* U+00ff2f: FULLWIDTH LATIN CAPITAL LETTER O*/
+ 0xff50, /* U+00ff30: FULLWIDTH LATIN CAPITAL LETTER P*/
+ 0xff51, /* U+00ff31: FULLWIDTH LATIN CAPITAL LETTER Q*/
+ 0xff52, /* U+00ff32: FULLWIDTH LATIN CAPITAL LETTER R*/
+ 0xff53, /* U+00ff33: FULLWIDTH LATIN CAPITAL LETTER S*/
+ 0xff54, /* U+00ff34: FULLWIDTH LATIN CAPITAL LETTER T*/
+ 0xff55, /* U+00ff35: FULLWIDTH LATIN CAPITAL LETTER U*/
+ 0xff56, /* U+00ff36: FULLWIDTH LATIN CAPITAL LETTER V*/
+ 0xff57, /* U+00ff37: FULLWIDTH LATIN CAPITAL LETTER W*/
+ 0xff58, /* U+00ff38: FULLWIDTH LATIN CAPITAL LETTER X*/
+ 0xff59, /* U+00ff39: FULLWIDTH LATIN CAPITAL LETTER Y*/
+ 0xff5a, /* U+00ff3a: FULLWIDTH LATIN CAPITAL LETTER Z*/
+};
+
+static const RTUNICP g_afRTUniLower0x010400[] =
+{
+ 0x10428, /* U+010400: DESERET CAPITAL LETTER LONG I*/
+ 0x10429, /* U+010401: DESERET CAPITAL LETTER LONG E*/
+ 0x1042a, /* U+010402: DESERET CAPITAL LETTER LONG A*/
+ 0x1042b, /* U+010403: DESERET CAPITAL LETTER LONG AH*/
+ 0x1042c, /* U+010404: DESERET CAPITAL LETTER LONG O*/
+ 0x1042d, /* U+010405: DESERET CAPITAL LETTER LONG OO*/
+ 0x1042e, /* U+010406: DESERET CAPITAL LETTER SHORT I*/
+ 0x1042f, /* U+010407: DESERET CAPITAL LETTER SHORT E*/
+ 0x10430, /* U+010408: DESERET CAPITAL LETTER SHORT A*/
+ 0x10431, /* U+010409: DESERET CAPITAL LETTER SHORT AH*/
+ 0x10432, /* U+01040a: DESERET CAPITAL LETTER SHORT O*/
+ 0x10433, /* U+01040b: DESERET CAPITAL LETTER SHORT OO*/
+ 0x10434, /* U+01040c: DESERET CAPITAL LETTER AY*/
+ 0x10435, /* U+01040d: DESERET CAPITAL LETTER OW*/
+ 0x10436, /* U+01040e: DESERET CAPITAL LETTER WU*/
+ 0x10437, /* U+01040f: DESERET CAPITAL LETTER YEE*/
+ 0x10438, /* U+010410: DESERET CAPITAL LETTER H*/
+ 0x10439, /* U+010411: DESERET CAPITAL LETTER PEE*/
+ 0x1043a, /* U+010412: DESERET CAPITAL LETTER BEE*/
+ 0x1043b, /* U+010413: DESERET CAPITAL LETTER TEE*/
+ 0x1043c, /* U+010414: DESERET CAPITAL LETTER DEE*/
+ 0x1043d, /* U+010415: DESERET CAPITAL LETTER CHEE*/
+ 0x1043e, /* U+010416: DESERET CAPITAL LETTER JEE*/
+ 0x1043f, /* U+010417: DESERET CAPITAL LETTER KAY*/
+ 0x10440, /* U+010418: DESERET CAPITAL LETTER GAY*/
+ 0x10441, /* U+010419: DESERET CAPITAL LETTER EF*/
+ 0x10442, /* U+01041a: DESERET CAPITAL LETTER VEE*/
+ 0x10443, /* U+01041b: DESERET CAPITAL LETTER ETH*/
+ 0x10444, /* U+01041c: DESERET CAPITAL LETTER THEE*/
+ 0x10445, /* U+01041d: DESERET CAPITAL LETTER ES*/
+ 0x10446, /* U+01041e: DESERET CAPITAL LETTER ZEE*/
+ 0x10447, /* U+01041f: DESERET CAPITAL LETTER ESH*/
+ 0x10448, /* U+010420: DESERET CAPITAL LETTER ZHEE*/
+ 0x10449, /* U+010421: DESERET CAPITAL LETTER ER*/
+ 0x1044a, /* U+010422: DESERET CAPITAL LETTER EL*/
+ 0x1044b, /* U+010423: DESERET CAPITAL LETTER EM*/
+ 0x1044c, /* U+010424: DESERET CAPITAL LETTER EN*/
+ 0x1044d, /* U+010425: DESERET CAPITAL LETTER ENG*/
+ 0x1044e, /* U+010426: DESERET CAPITAL LETTER OI*/
+ 0x1044f, /* U+010427: DESERET CAPITAL LETTER EW*/
+};
+
+
+RT_DECL_DATA_CONST(const RTUNICASERANGE) g_aRTUniLowerRanges[] =
+{
+ { 0x000000, 0x000557, &g_afRTUniLower0x000000[0] },
+ { 0x0010a0, 0x0010ce, &g_afRTUniLower0x0010a0[0] },
+ { 0x001e00, 0x0024d0, &g_afRTUniLower0x001e00[0] },
+ { 0x002c00, 0x002cf3, &g_afRTUniLower0x002c00[0] },
+ { 0x00a640, 0x00a7ab, &g_afRTUniLower0x00a640[0] },
+ { 0x00ff21, 0x00ff3b, &g_afRTUniLower0x00ff21[0] },
+ { 0x010400, 0x010428, &g_afRTUniLower0x010400[0] },
+ { ~(RTUNICP)0, ~(RTUNICP)0, NULL }
+};
+
+
diff --git a/src/VBox/Runtime/common/string/unidata-upper.cpp b/src/VBox/Runtime/common/string/unidata-upper.cpp
new file mode 100644
index 00000000000..2069101ec2a
--- /dev/null
+++ b/src/VBox/Runtime/common/string/unidata-upper.cpp
@@ -0,0 +1,4069 @@
+/* $Id$ */
+/** @file
+ * IPRT - Unicode Tables.
+ *
+ * Automatically Generated from d:\src\unicode\6.3.0\
+ * by ..\..\..\..\..\out\win.amd64\debug\obj\uniread\uniread.exe (May 22 2014 19:07:40)
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+#include <iprt/uni.h>
+
+static const RTUNICP g_afRTUniUpper0x000000[] =
+{
+ 0x00, /* U+000000: <control>*/
+ 0x01, /* U+000001: <control>*/
+ 0x02, /* U+000002: <control>*/
+ 0x03, /* U+000003: <control>*/
+ 0x04, /* U+000004: <control>*/
+ 0x05, /* U+000005: <control>*/
+ 0x06, /* U+000006: <control>*/
+ 0x07, /* U+000007: <control>*/
+ 0x08, /* U+000008: <control>*/
+ 0x09, /* U+000009: <control>*/
+ 0x0a, /* U+00000a: <control>*/
+ 0x0b, /* U+00000b: <control>*/
+ 0x0c, /* U+00000c: <control>*/
+ 0x0d, /* U+00000d: <control>*/
+ 0x0e, /* U+00000e: <control>*/
+ 0x0f, /* U+00000f: <control>*/
+ 0x10, /* U+000010: <control>*/
+ 0x11, /* U+000011: <control>*/
+ 0x12, /* U+000012: <control>*/
+ 0x13, /* U+000013: <control>*/
+ 0x14, /* U+000014: <control>*/
+ 0x15, /* U+000015: <control>*/
+ 0x16, /* U+000016: <control>*/
+ 0x17, /* U+000017: <control>*/
+ 0x18, /* U+000018: <control>*/
+ 0x19, /* U+000019: <control>*/
+ 0x1a, /* U+00001a: <control>*/
+ 0x1b, /* U+00001b: <control>*/
+ 0x1c, /* U+00001c: <control>*/
+ 0x1d, /* U+00001d: <control>*/
+ 0x1e, /* U+00001e: <control>*/
+ 0x1f, /* U+00001f: <control>*/
+ 0x20, /* U+000020: SPACE*/
+ 0x21, /* U+000021: EXCLAMATION MARK*/
+ 0x22, /* U+000022: QUOTATION MARK*/
+ 0x23, /* U+000023: NUMBER SIGN*/
+ 0x24, /* U+000024: DOLLAR SIGN*/
+ 0x25, /* U+000025: PERCENT SIGN*/
+ 0x26, /* U+000026: AMPERSAND*/
+ 0x27, /* U+000027: APOSTROPHE*/
+ 0x28, /* U+000028: LEFT PARENTHESIS*/
+ 0x29, /* U+000029: RIGHT PARENTHESIS*/
+ 0x2a, /* U+00002a: ASTERISK*/
+ 0x2b, /* U+00002b: PLUS SIGN*/
+ 0x2c, /* U+00002c: COMMA*/
+ 0x2d, /* U+00002d: HYPHEN-MINUS*/
+ 0x2e, /* U+00002e: FULL STOP*/
+ 0x2f, /* U+00002f: SOLIDUS*/
+ 0x30, /* U+000030: DIGIT ZERO*/
+ 0x31, /* U+000031: DIGIT ONE*/
+ 0x32, /* U+000032: DIGIT TWO*/
+ 0x33, /* U+000033: DIGIT THREE*/
+ 0x34, /* U+000034: DIGIT FOUR*/
+ 0x35, /* U+000035: DIGIT FIVE*/
+ 0x36, /* U+000036: DIGIT SIX*/
+ 0x37, /* U+000037: DIGIT SEVEN*/
+ 0x38, /* U+000038: DIGIT EIGHT*/
+ 0x39, /* U+000039: DIGIT NINE*/
+ 0x3a, /* U+00003a: COLON*/
+ 0x3b, /* U+00003b: SEMICOLON*/
+ 0x3c, /* U+00003c: LESS-THAN SIGN*/
+ 0x3d, /* U+00003d: EQUALS SIGN*/
+ 0x3e, /* U+00003e: GREATER-THAN SIGN*/
+ 0x3f, /* U+00003f: QUESTION MARK*/
+ 0x40, /* U+000040: COMMERCIAL AT*/
+ 0x41, /* U+000041: LATIN CAPITAL LETTER A*/
+ 0x42, /* U+000042: LATIN CAPITAL LETTER B*/
+ 0x43, /* U+000043: LATIN CAPITAL LETTER C*/
+ 0x44, /* U+000044: LATIN CAPITAL LETTER D*/
+ 0x45, /* U+000045: LATIN CAPITAL LETTER E*/
+ 0x46, /* U+000046: LATIN CAPITAL LETTER F*/
+ 0x47, /* U+000047: LATIN CAPITAL LETTER G*/
+ 0x48, /* U+000048: LATIN CAPITAL LETTER H*/
+ 0x49, /* U+000049: LATIN CAPITAL LETTER I*/
+ 0x4a, /* U+00004a: LATIN CAPITAL LETTER J*/
+ 0x4b, /* U+00004b: LATIN CAPITAL LETTER K*/
+ 0x4c, /* U+00004c: LATIN CAPITAL LETTER L*/
+ 0x4d, /* U+00004d: LATIN CAPITAL LETTER M*/
+ 0x4e, /* U+00004e: LATIN CAPITAL LETTER N*/
+ 0x4f, /* U+00004f: LATIN CAPITAL LETTER O*/
+ 0x50, /* U+000050: LATIN CAPITAL LETTER P*/
+ 0x51, /* U+000051: LATIN CAPITAL LETTER Q*/
+ 0x52, /* U+000052: LATIN CAPITAL LETTER R*/
+ 0x53, /* U+000053: LATIN CAPITAL LETTER S*/
+ 0x54, /* U+000054: LATIN CAPITAL LETTER T*/
+ 0x55, /* U+000055: LATIN CAPITAL LETTER U*/
+ 0x56, /* U+000056: LATIN CAPITAL LETTER V*/
+ 0x57, /* U+000057: LATIN CAPITAL LETTER W*/
+ 0x58, /* U+000058: LATIN CAPITAL LETTER X*/
+ 0x59, /* U+000059: LATIN CAPITAL LETTER Y*/
+ 0x5a, /* U+00005a: LATIN CAPITAL LETTER Z*/
+ 0x5b, /* U+00005b: LEFT SQUARE BRACKET*/
+ 0x5c, /* U+00005c: REVERSE SOLIDUS*/
+ 0x5d, /* U+00005d: RIGHT SQUARE BRACKET*/
+ 0x5e, /* U+00005e: CIRCUMFLEX ACCENT*/
+ 0x5f, /* U+00005f: LOW LINE*/
+ 0x60, /* U+000060: GRAVE ACCENT*/
+ 0x41, /* U+000061: LATIN SMALL LETTER A*/
+ 0x42, /* U+000062: LATIN SMALL LETTER B*/
+ 0x43, /* U+000063: LATIN SMALL LETTER C*/
+ 0x44, /* U+000064: LATIN SMALL LETTER D*/
+ 0x45, /* U+000065: LATIN SMALL LETTER E*/
+ 0x46, /* U+000066: LATIN SMALL LETTER F*/
+ 0x47, /* U+000067: LATIN SMALL LETTER G*/
+ 0x48, /* U+000068: LATIN SMALL LETTER H*/
+ 0x49, /* U+000069: LATIN SMALL LETTER I*/
+ 0x4a, /* U+00006a: LATIN SMALL LETTER J*/
+ 0x4b, /* U+00006b: LATIN SMALL LETTER K*/
+ 0x4c, /* U+00006c: LATIN SMALL LETTER L*/
+ 0x4d, /* U+00006d: LATIN SMALL LETTER M*/
+ 0x4e, /* U+00006e: LATIN SMALL LETTER N*/
+ 0x4f, /* U+00006f: LATIN SMALL LETTER O*/
+ 0x50, /* U+000070: LATIN SMALL LETTER P*/
+ 0x51, /* U+000071: LATIN SMALL LETTER Q*/
+ 0x52, /* U+000072: LATIN SMALL LETTER R*/
+ 0x53, /* U+000073: LATIN SMALL LETTER S*/
+ 0x54, /* U+000074: LATIN SMALL LETTER T*/
+ 0x55, /* U+000075: LATIN SMALL LETTER U*/
+ 0x56, /* U+000076: LATIN SMALL LETTER V*/
+ 0x57, /* U+000077: LATIN SMALL LETTER W*/
+ 0x58, /* U+000078: LATIN SMALL LETTER X*/
+ 0x59, /* U+000079: LATIN SMALL LETTER Y*/
+ 0x5a, /* U+00007a: LATIN SMALL LETTER Z*/
+ 0x7b, /* U+00007b: LEFT CURLY BRACKET*/
+ 0x7c, /* U+00007c: VERTICAL LINE*/
+ 0x7d, /* U+00007d: RIGHT CURLY BRACKET*/
+ 0x7e, /* U+00007e: TILDE*/
+ 0x7f, /* U+00007f: <control>*/
+ 0x80, /* U+000080: <control>*/
+ 0x81, /* U+000081: <control>*/
+ 0x82, /* U+000082: <control>*/
+ 0x83, /* U+000083: <control>*/
+ 0x84, /* U+000084: <control>*/
+ 0x85, /* U+000085: <control>*/
+ 0x86, /* U+000086: <control>*/
+ 0x87, /* U+000087: <control>*/
+ 0x88, /* U+000088: <control>*/
+ 0x89, /* U+000089: <control>*/
+ 0x8a, /* U+00008a: <control>*/
+ 0x8b, /* U+00008b: <control>*/
+ 0x8c, /* U+00008c: <control>*/
+ 0x8d, /* U+00008d: <control>*/
+ 0x8e, /* U+00008e: <control>*/
+ 0x8f, /* U+00008f: <control>*/
+ 0x90, /* U+000090: <control>*/
+ 0x91, /* U+000091: <control>*/
+ 0x92, /* U+000092: <control>*/
+ 0x93, /* U+000093: <control>*/
+ 0x94, /* U+000094: <control>*/
+ 0x95, /* U+000095: <control>*/
+ 0x96, /* U+000096: <control>*/
+ 0x97, /* U+000097: <control>*/
+ 0x98, /* U+000098: <control>*/
+ 0x99, /* U+000099: <control>*/
+ 0x9a, /* U+00009a: <control>*/
+ 0x9b, /* U+00009b: <control>*/
+ 0x9c, /* U+00009c: <control>*/
+ 0x9d, /* U+00009d: <control>*/
+ 0x9e, /* U+00009e: <control>*/
+ 0x9f, /* U+00009f: <control>*/
+ 0xa0, /* U+0000a0: NO-BREAK SPACE*/
+ 0xa1, /* U+0000a1: INVERTED EXCLAMATION MARK*/
+ 0xa2, /* U+0000a2: CENT SIGN*/
+ 0xa3, /* U+0000a3: POUND SIGN*/
+ 0xa4, /* U+0000a4: CURRENCY SIGN*/
+ 0xa5, /* U+0000a5: YEN SIGN*/
+ 0xa6, /* U+0000a6: BROKEN BAR*/
+ 0xa7, /* U+0000a7: SECTION SIGN*/
+ 0xa8, /* U+0000a8: DIAERESIS*/
+ 0xa9, /* U+0000a9: COPYRIGHT SIGN*/
+ 0xaa, /* U+0000aa: FEMININE ORDINAL INDICATOR*/
+ 0xab, /* U+0000ab: LEFT-POINTING DOUBLE ANGLE QUOTATION MARK*/
+ 0xac, /* U+0000ac: NOT SIGN*/
+ 0xad, /* U+0000ad: SOFT HYPHEN*/
+ 0xae, /* U+0000ae: REGISTERED SIGN*/
+ 0xaf, /* U+0000af: MACRON*/
+ 0xb0, /* U+0000b0: DEGREE SIGN*/
+ 0xb1, /* U+0000b1: PLUS-MINUS SIGN*/
+ 0xb2, /* U+0000b2: SUPERSCRIPT TWO*/
+ 0xb3, /* U+0000b3: SUPERSCRIPT THREE*/
+ 0xb4, /* U+0000b4: ACUTE ACCENT*/
+ 0x39c, /* U+0000b5: MICRO SIGN*/
+ 0xb6, /* U+0000b6: PILCROW SIGN*/
+ 0xb7, /* U+0000b7: MIDDLE DOT*/
+ 0xb8, /* U+0000b8: CEDILLA*/
+ 0xb9, /* U+0000b9: SUPERSCRIPT ONE*/
+ 0xba, /* U+0000ba: MASCULINE ORDINAL INDICATOR*/
+ 0xbb, /* U+0000bb: RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK*/
+ 0xbc, /* U+0000bc: VULGAR FRACTION ONE QUARTER*/
+ 0xbd, /* U+0000bd: VULGAR FRACTION ONE HALF*/
+ 0xbe, /* U+0000be: VULGAR FRACTION THREE QUARTERS*/
+ 0xbf, /* U+0000bf: INVERTED QUESTION MARK*/
+ 0xc0, /* U+0000c0: LATIN CAPITAL LETTER A WITH GRAVE*/
+ 0xc1, /* U+0000c1: LATIN CAPITAL LETTER A WITH ACUTE*/
+ 0xc2, /* U+0000c2: LATIN CAPITAL LETTER A WITH CIRCUMFLEX*/
+ 0xc3, /* U+0000c3: LATIN CAPITAL LETTER A WITH TILDE*/
+ 0xc4, /* U+0000c4: LATIN CAPITAL LETTER A WITH DIAERESIS*/
+ 0xc5, /* U+0000c5: LATIN CAPITAL LETTER A WITH RING ABOVE*/
+ 0xc6, /* U+0000c6: LATIN CAPITAL LETTER AE*/
+ 0xc7, /* U+0000c7: LATIN CAPITAL LETTER C WITH CEDILLA*/
+ 0xc8, /* U+0000c8: LATIN CAPITAL LETTER E WITH GRAVE*/
+ 0xc9, /* U+0000c9: LATIN CAPITAL LETTER E WITH ACUTE*/
+ 0xca, /* U+0000ca: LATIN CAPITAL LETTER E WITH CIRCUMFLEX*/
+ 0xcb, /* U+0000cb: LATIN CAPITAL LETTER E WITH DIAERESIS*/
+ 0xcc, /* U+0000cc: LATIN CAPITAL LETTER I WITH GRAVE*/
+ 0xcd, /* U+0000cd: LATIN CAPITAL LETTER I WITH ACUTE*/
+ 0xce, /* U+0000ce: LATIN CAPITAL LETTER I WITH CIRCUMFLEX*/
+ 0xcf, /* U+0000cf: LATIN CAPITAL LETTER I WITH DIAERESIS*/
+ 0xd0, /* U+0000d0: LATIN CAPITAL LETTER ETH*/
+ 0xd1, /* U+0000d1: LATIN CAPITAL LETTER N WITH TILDE*/
+ 0xd2, /* U+0000d2: LATIN CAPITAL LETTER O WITH GRAVE*/
+ 0xd3, /* U+0000d3: LATIN CAPITAL LETTER O WITH ACUTE*/
+ 0xd4, /* U+0000d4: LATIN CAPITAL LETTER O WITH CIRCUMFLEX*/
+ 0xd5, /* U+0000d5: LATIN CAPITAL LETTER O WITH TILDE*/
+ 0xd6, /* U+0000d6: LATIN CAPITAL LETTER O WITH DIAERESIS*/
+ 0xd7, /* U+0000d7: MULTIPLICATION SIGN*/
+ 0xd8, /* U+0000d8: LATIN CAPITAL LETTER O WITH STROKE*/
+ 0xd9, /* U+0000d9: LATIN CAPITAL LETTER U WITH GRAVE*/
+ 0xda, /* U+0000da: LATIN CAPITAL LETTER U WITH ACUTE*/
+ 0xdb, /* U+0000db: LATIN CAPITAL LETTER U WITH CIRCUMFLEX*/
+ 0xdc, /* U+0000dc: LATIN CAPITAL LETTER U WITH DIAERESIS*/
+ 0xdd, /* U+0000dd: LATIN CAPITAL LETTER Y WITH ACUTE*/
+ 0xde, /* U+0000de: LATIN CAPITAL LETTER THORN*/
+ 0xdf, /* U+0000df: LATIN SMALL LETTER SHARP S*/
+ 0xc0, /* U+0000e0: LATIN SMALL LETTER A WITH GRAVE*/
+ 0xc1, /* U+0000e1: LATIN SMALL LETTER A WITH ACUTE*/
+ 0xc2, /* U+0000e2: LATIN SMALL LETTER A WITH CIRCUMFLEX*/
+ 0xc3, /* U+0000e3: LATIN SMALL LETTER A WITH TILDE*/
+ 0xc4, /* U+0000e4: LATIN SMALL LETTER A WITH DIAERESIS*/
+ 0xc5, /* U+0000e5: LATIN SMALL LETTER A WITH RING ABOVE*/
+ 0xc6, /* U+0000e6: LATIN SMALL LETTER AE*/
+ 0xc7, /* U+0000e7: LATIN SMALL LETTER C WITH CEDILLA*/
+ 0xc8, /* U+0000e8: LATIN SMALL LETTER E WITH GRAVE*/
+ 0xc9, /* U+0000e9: LATIN SMALL LETTER E WITH ACUTE*/
+ 0xca, /* U+0000ea: LATIN SMALL LETTER E WITH CIRCUMFLEX*/
+ 0xcb, /* U+0000eb: LATIN SMALL LETTER E WITH DIAERESIS*/
+ 0xcc, /* U+0000ec: LATIN SMALL LETTER I WITH GRAVE*/
+ 0xcd, /* U+0000ed: LATIN SMALL LETTER I WITH ACUTE*/
+ 0xce, /* U+0000ee: LATIN SMALL LETTER I WITH CIRCUMFLEX*/
+ 0xcf, /* U+0000ef: LATIN SMALL LETTER I WITH DIAERESIS*/
+ 0xd0, /* U+0000f0: LATIN SMALL LETTER ETH*/
+ 0xd1, /* U+0000f1: LATIN SMALL LETTER N WITH TILDE*/
+ 0xd2, /* U+0000f2: LATIN SMALL LETTER O WITH GRAVE*/
+ 0xd3, /* U+0000f3: LATIN SMALL LETTER O WITH ACUTE*/
+ 0xd4, /* U+0000f4: LATIN SMALL LETTER O WITH CIRCUMFLEX*/
+ 0xd5, /* U+0000f5: LATIN SMALL LETTER O WITH TILDE*/
+ 0xd6, /* U+0000f6: LATIN SMALL LETTER O WITH DIAERESIS*/
+ 0xf7, /* U+0000f7: DIVISION SIGN*/
+ 0xd8, /* U+0000f8: LATIN SMALL LETTER O WITH STROKE*/
+ 0xd9, /* U+0000f9: LATIN SMALL LETTER U WITH GRAVE*/
+ 0xda, /* U+0000fa: LATIN SMALL LETTER U WITH ACUTE*/
+ 0xdb, /* U+0000fb: LATIN SMALL LETTER U WITH CIRCUMFLEX*/
+ 0xdc, /* U+0000fc: LATIN SMALL LETTER U WITH DIAERESIS*/
+ 0xdd, /* U+0000fd: LATIN SMALL LETTER Y WITH ACUTE*/
+ 0xde, /* U+0000fe: LATIN SMALL LETTER THORN*/
+ 0x178, /* U+0000ff: LATIN SMALL LETTER Y WITH DIAERESIS*/
+ 0x100, /* U+000100: LATIN CAPITAL LETTER A WITH MACRON*/
+ 0x100, /* U+000101: LATIN SMALL LETTER A WITH MACRON*/
+ 0x102, /* U+000102: LATIN CAPITAL LETTER A WITH BREVE*/
+ 0x102, /* U+000103: LATIN SMALL LETTER A WITH BREVE*/
+ 0x104, /* U+000104: LATIN CAPITAL LETTER A WITH OGONEK*/
+ 0x104, /* U+000105: LATIN SMALL LETTER A WITH OGONEK*/
+ 0x106, /* U+000106: LATIN CAPITAL LETTER C WITH ACUTE*/
+ 0x106, /* U+000107: LATIN SMALL LETTER C WITH ACUTE*/
+ 0x108, /* U+000108: LATIN CAPITAL LETTER C WITH CIRCUMFLEX*/
+ 0x108, /* U+000109: LATIN SMALL LETTER C WITH CIRCUMFLEX*/
+ 0x10a, /* U+00010a: LATIN CAPITAL LETTER C WITH DOT ABOVE*/
+ 0x10a, /* U+00010b: LATIN SMALL LETTER C WITH DOT ABOVE*/
+ 0x10c, /* U+00010c: LATIN CAPITAL LETTER C WITH CARON*/
+ 0x10c, /* U+00010d: LATIN SMALL LETTER C WITH CARON*/
+ 0x10e, /* U+00010e: LATIN CAPITAL LETTER D WITH CARON*/
+ 0x10e, /* U+00010f: LATIN SMALL LETTER D WITH CARON*/
+ 0x110, /* U+000110: LATIN CAPITAL LETTER D WITH STROKE*/
+ 0x110, /* U+000111: LATIN SMALL LETTER D WITH STROKE*/
+ 0x112, /* U+000112: LATIN CAPITAL LETTER E WITH MACRON*/
+ 0x112, /* U+000113: LATIN SMALL LETTER E WITH MACRON*/
+ 0x114, /* U+000114: LATIN CAPITAL LETTER E WITH BREVE*/
+ 0x114, /* U+000115: LATIN SMALL LETTER E WITH BREVE*/
+ 0x116, /* U+000116: LATIN CAPITAL LETTER E WITH DOT ABOVE*/
+ 0x116, /* U+000117: LATIN SMALL LETTER E WITH DOT ABOVE*/
+ 0x118, /* U+000118: LATIN CAPITAL LETTER E WITH OGONEK*/
+ 0x118, /* U+000119: LATIN SMALL LETTER E WITH OGONEK*/
+ 0x11a, /* U+00011a: LATIN CAPITAL LETTER E WITH CARON*/
+ 0x11a, /* U+00011b: LATIN SMALL LETTER E WITH CARON*/
+ 0x11c, /* U+00011c: LATIN CAPITAL LETTER G WITH CIRCUMFLEX*/
+ 0x11c, /* U+00011d: LATIN SMALL LETTER G WITH CIRCUMFLEX*/
+ 0x11e, /* U+00011e: LATIN CAPITAL LETTER G WITH BREVE*/
+ 0x11e, /* U+00011f: LATIN SMALL LETTER G WITH BREVE*/
+ 0x120, /* U+000120: LATIN CAPITAL LETTER G WITH DOT ABOVE*/
+ 0x120, /* U+000121: LATIN SMALL LETTER G WITH DOT ABOVE*/
+ 0x122, /* U+000122: LATIN CAPITAL LETTER G WITH CEDILLA*/
+ 0x122, /* U+000123: LATIN SMALL LETTER G WITH CEDILLA*/
+ 0x124, /* U+000124: LATIN CAPITAL LETTER H WITH CIRCUMFLEX*/
+ 0x124, /* U+000125: LATIN SMALL LETTER H WITH CIRCUMFLEX*/
+ 0x126, /* U+000126: LATIN CAPITAL LETTER H WITH STROKE*/
+ 0x126, /* U+000127: LATIN SMALL LETTER H WITH STROKE*/
+ 0x128, /* U+000128: LATIN CAPITAL LETTER I WITH TILDE*/
+ 0x128, /* U+000129: LATIN SMALL LETTER I WITH TILDE*/
+ 0x12a, /* U+00012a: LATIN CAPITAL LETTER I WITH MACRON*/
+ 0x12a, /* U+00012b: LATIN SMALL LETTER I WITH MACRON*/
+ 0x12c, /* U+00012c: LATIN CAPITAL LETTER I WITH BREVE*/
+ 0x12c, /* U+00012d: LATIN SMALL LETTER I WITH BREVE*/
+ 0x12e, /* U+00012e: LATIN CAPITAL LETTER I WITH OGONEK*/
+ 0x12e, /* U+00012f: LATIN SMALL LETTER I WITH OGONEK*/
+ 0x130, /* U+000130: LATIN CAPITAL LETTER I WITH DOT ABOVE*/
+ 0x49, /* U+000131: LATIN SMALL LETTER DOTLESS I*/
+ 0x132, /* U+000132: LATIN CAPITAL LIGATURE IJ*/
+ 0x132, /* U+000133: LATIN SMALL LIGATURE IJ*/
+ 0x134, /* U+000134: LATIN CAPITAL LETTER J WITH CIRCUMFLEX*/
+ 0x134, /* U+000135: LATIN SMALL LETTER J WITH CIRCUMFLEX*/
+ 0x136, /* U+000136: LATIN CAPITAL LETTER K WITH CEDILLA*/
+ 0x136, /* U+000137: LATIN SMALL LETTER K WITH CEDILLA*/
+ 0x138, /* U+000138: LATIN SMALL LETTER KRA*/
+ 0x139, /* U+000139: LATIN CAPITAL LETTER L WITH ACUTE*/
+ 0x139, /* U+00013a: LATIN SMALL LETTER L WITH ACUTE*/
+ 0x13b, /* U+00013b: LATIN CAPITAL LETTER L WITH CEDILLA*/
+ 0x13b, /* U+00013c: LATIN SMALL LETTER L WITH CEDILLA*/
+ 0x13d, /* U+00013d: LATIN CAPITAL LETTER L WITH CARON*/
+ 0x13d, /* U+00013e: LATIN SMALL LETTER L WITH CARON*/
+ 0x13f, /* U+00013f: LATIN CAPITAL LETTER L WITH MIDDLE DOT*/
+ 0x13f, /* U+000140: LATIN SMALL LETTER L WITH MIDDLE DOT*/
+ 0x141, /* U+000141: LATIN CAPITAL LETTER L WITH STROKE*/
+ 0x141, /* U+000142: LATIN SMALL LETTER L WITH STROKE*/
+ 0x143, /* U+000143: LATIN CAPITAL LETTER N WITH ACUTE*/
+ 0x143, /* U+000144: LATIN SMALL LETTER N WITH ACUTE*/
+ 0x145, /* U+000145: LATIN CAPITAL LETTER N WITH CEDILLA*/
+ 0x145, /* U+000146: LATIN SMALL LETTER N WITH CEDILLA*/
+ 0x147, /* U+000147: LATIN CAPITAL LETTER N WITH CARON*/
+ 0x147, /* U+000148: LATIN SMALL LETTER N WITH CARON*/
+ 0x149, /* U+000149: LATIN SMALL LETTER N PRECEDED BY APOSTROPHE*/
+ 0x14a, /* U+00014a: LATIN CAPITAL LETTER ENG*/
+ 0x14a, /* U+00014b: LATIN SMALL LETTER ENG*/
+ 0x14c, /* U+00014c: LATIN CAPITAL LETTER O WITH MACRON*/
+ 0x14c, /* U+00014d: LATIN SMALL LETTER O WITH MACRON*/
+ 0x14e, /* U+00014e: LATIN CAPITAL LETTER O WITH BREVE*/
+ 0x14e, /* U+00014f: LATIN SMALL LETTER O WITH BREVE*/
+ 0x150, /* U+000150: LATIN CAPITAL LETTER O WITH DOUBLE ACUTE*/
+ 0x150, /* U+000151: LATIN SMALL LETTER O WITH DOUBLE ACUTE*/
+ 0x152, /* U+000152: LATIN CAPITAL LIGATURE OE*/
+ 0x152, /* U+000153: LATIN SMALL LIGATURE OE*/
+ 0x154, /* U+000154: LATIN CAPITAL LETTER R WITH ACUTE*/
+ 0x154, /* U+000155: LATIN SMALL LETTER R WITH ACUTE*/
+ 0x156, /* U+000156: LATIN CAPITAL LETTER R WITH CEDILLA*/
+ 0x156, /* U+000157: LATIN SMALL LETTER R WITH CEDILLA*/
+ 0x158, /* U+000158: LATIN CAPITAL LETTER R WITH CARON*/
+ 0x158, /* U+000159: LATIN SMALL LETTER R WITH CARON*/
+ 0x15a, /* U+00015a: LATIN CAPITAL LETTER S WITH ACUTE*/
+ 0x15a, /* U+00015b: LATIN SMALL LETTER S WITH ACUTE*/
+ 0x15c, /* U+00015c: LATIN CAPITAL LETTER S WITH CIRCUMFLEX*/
+ 0x15c, /* U+00015d: LATIN SMALL LETTER S WITH CIRCUMFLEX*/
+ 0x15e, /* U+00015e: LATIN CAPITAL LETTER S WITH CEDILLA*/
+ 0x15e, /* U+00015f: LATIN SMALL LETTER S WITH CEDILLA*/
+ 0x160, /* U+000160: LATIN CAPITAL LETTER S WITH CARON*/
+ 0x160, /* U+000161: LATIN SMALL LETTER S WITH CARON*/
+ 0x162, /* U+000162: LATIN CAPITAL LETTER T WITH CEDILLA*/
+ 0x162, /* U+000163: LATIN SMALL LETTER T WITH CEDILLA*/
+ 0x164, /* U+000164: LATIN CAPITAL LETTER T WITH CARON*/
+ 0x164, /* U+000165: LATIN SMALL LETTER T WITH CARON*/
+ 0x166, /* U+000166: LATIN CAPITAL LETTER T WITH STROKE*/
+ 0x166, /* U+000167: LATIN SMALL LETTER T WITH STROKE*/
+ 0x168, /* U+000168: LATIN CAPITAL LETTER U WITH TILDE*/
+ 0x168, /* U+000169: LATIN SMALL LETTER U WITH TILDE*/
+ 0x16a, /* U+00016a: LATIN CAPITAL LETTER U WITH MACRON*/
+ 0x16a, /* U+00016b: LATIN SMALL LETTER U WITH MACRON*/
+ 0x16c, /* U+00016c: LATIN CAPITAL LETTER U WITH BREVE*/
+ 0x16c, /* U+00016d: LATIN SMALL LETTER U WITH BREVE*/
+ 0x16e, /* U+00016e: LATIN CAPITAL LETTER U WITH RING ABOVE*/
+ 0x16e, /* U+00016f: LATIN SMALL LETTER U WITH RING ABOVE*/
+ 0x170, /* U+000170: LATIN CAPITAL LETTER U WITH DOUBLE ACUTE*/
+ 0x170, /* U+000171: LATIN SMALL LETTER U WITH DOUBLE ACUTE*/
+ 0x172, /* U+000172: LATIN CAPITAL LETTER U WITH OGONEK*/
+ 0x172, /* U+000173: LATIN SMALL LETTER U WITH OGONEK*/
+ 0x174, /* U+000174: LATIN CAPITAL LETTER W WITH CIRCUMFLEX*/
+ 0x174, /* U+000175: LATIN SMALL LETTER W WITH CIRCUMFLEX*/
+ 0x176, /* U+000176: LATIN CAPITAL LETTER Y WITH CIRCUMFLEX*/
+ 0x176, /* U+000177: LATIN SMALL LETTER Y WITH CIRCUMFLEX*/
+ 0x178, /* U+000178: LATIN CAPITAL LETTER Y WITH DIAERESIS*/
+ 0x179, /* U+000179: LATIN CAPITAL LETTER Z WITH ACUTE*/
+ 0x179, /* U+00017a: LATIN SMALL LETTER Z WITH ACUTE*/
+ 0x17b, /* U+00017b: LATIN CAPITAL LETTER Z WITH DOT ABOVE*/
+ 0x17b, /* U+00017c: LATIN SMALL LETTER Z WITH DOT ABOVE*/
+ 0x17d, /* U+00017d: LATIN CAPITAL LETTER Z WITH CARON*/
+ 0x17d, /* U+00017e: LATIN SMALL LETTER Z WITH CARON*/
+ 0x53, /* U+00017f: LATIN SMALL LETTER LONG S*/
+ 0x243, /* U+000180: LATIN SMALL LETTER B WITH STROKE*/
+ 0x181, /* U+000181: LATIN CAPITAL LETTER B WITH HOOK*/
+ 0x182, /* U+000182: LATIN CAPITAL LETTER B WITH TOPBAR*/
+ 0x182, /* U+000183: LATIN SMALL LETTER B WITH TOPBAR*/
+ 0x184, /* U+000184: LATIN CAPITAL LETTER TONE SIX*/
+ 0x184, /* U+000185: LATIN SMALL LETTER TONE SIX*/
+ 0x186, /* U+000186: LATIN CAPITAL LETTER OPEN O*/
+ 0x187, /* U+000187: LATIN CAPITAL LETTER C WITH HOOK*/
+ 0x187, /* U+000188: LATIN SMALL LETTER C WITH HOOK*/
+ 0x189, /* U+000189: LATIN CAPITAL LETTER AFRICAN D*/
+ 0x18a, /* U+00018a: LATIN CAPITAL LETTER D WITH HOOK*/
+ 0x18b, /* U+00018b: LATIN CAPITAL LETTER D WITH TOPBAR*/
+ 0x18b, /* U+00018c: LATIN SMALL LETTER D WITH TOPBAR*/
+ 0x18d, /* U+00018d: LATIN SMALL LETTER TURNED DELTA*/
+ 0x18e, /* U+00018e: LATIN CAPITAL LETTER REVERSED E*/
+ 0x18f, /* U+00018f: LATIN CAPITAL LETTER SCHWA*/
+ 0x190, /* U+000190: LATIN CAPITAL LETTER OPEN E*/
+ 0x191, /* U+000191: LATIN CAPITAL LETTER F WITH HOOK*/
+ 0x191, /* U+000192: LATIN SMALL LETTER F WITH HOOK*/
+ 0x193, /* U+000193: LATIN CAPITAL LETTER G WITH HOOK*/
+ 0x194, /* U+000194: LATIN CAPITAL LETTER GAMMA*/
+ 0x1f6, /* U+000195: LATIN SMALL LETTER HV*/
+ 0x196, /* U+000196: LATIN CAPITAL LETTER IOTA*/
+ 0x197, /* U+000197: LATIN CAPITAL LETTER I WITH STROKE*/
+ 0x198, /* U+000198: LATIN CAPITAL LETTER K WITH HOOK*/
+ 0x198, /* U+000199: LATIN SMALL LETTER K WITH HOOK*/
+ 0x23d, /* U+00019a: LATIN SMALL LETTER L WITH BAR*/
+ 0x19b, /* U+00019b: LATIN SMALL LETTER LAMBDA WITH STROKE*/
+ 0x19c, /* U+00019c: LATIN CAPITAL LETTER TURNED M*/
+ 0x19d, /* U+00019d: LATIN CAPITAL LETTER N WITH LEFT HOOK*/
+ 0x220, /* U+00019e: LATIN SMALL LETTER N WITH LONG RIGHT LEG*/
+ 0x19f, /* U+00019f: LATIN CAPITAL LETTER O WITH MIDDLE TILDE*/
+ 0x1a0, /* U+0001a0: LATIN CAPITAL LETTER O WITH HORN*/
+ 0x1a0, /* U+0001a1: LATIN SMALL LETTER O WITH HORN*/
+ 0x1a2, /* U+0001a2: LATIN CAPITAL LETTER OI*/
+ 0x1a2, /* U+0001a3: LATIN SMALL LETTER OI*/
+ 0x1a4, /* U+0001a4: LATIN CAPITAL LETTER P WITH HOOK*/
+ 0x1a4, /* U+0001a5: LATIN SMALL LETTER P WITH HOOK*/
+ 0x1a6, /* U+0001a6: LATIN LETTER YR*/
+ 0x1a7, /* U+0001a7: LATIN CAPITAL LETTER TONE TWO*/
+ 0x1a7, /* U+0001a8: LATIN SMALL LETTER TONE TWO*/
+ 0x1a9, /* U+0001a9: LATIN CAPITAL LETTER ESH*/
+ 0x1aa, /* U+0001aa: LATIN LETTER REVERSED ESH LOOP*/
+ 0x1ab, /* U+0001ab: LATIN SMALL LETTER T WITH PALATAL HOOK*/
+ 0x1ac, /* U+0001ac: LATIN CAPITAL LETTER T WITH HOOK*/
+ 0x1ac, /* U+0001ad: LATIN SMALL LETTER T WITH HOOK*/
+ 0x1ae, /* U+0001ae: LATIN CAPITAL LETTER T WITH RETROFLEX HOOK*/
+ 0x1af, /* U+0001af: LATIN CAPITAL LETTER U WITH HORN*/
+ 0x1af, /* U+0001b0: LATIN SMALL LETTER U WITH HORN*/
+ 0x1b1, /* U+0001b1: LATIN CAPITAL LETTER UPSILON*/
+ 0x1b2, /* U+0001b2: LATIN CAPITAL LETTER V WITH HOOK*/
+ 0x1b3, /* U+0001b3: LATIN CAPITAL LETTER Y WITH HOOK*/
+ 0x1b3, /* U+0001b4: LATIN SMALL LETTER Y WITH HOOK*/
+ 0x1b5, /* U+0001b5: LATIN CAPITAL LETTER Z WITH STROKE*/
+ 0x1b5, /* U+0001b6: LATIN SMALL LETTER Z WITH STROKE*/
+ 0x1b7, /* U+0001b7: LATIN CAPITAL LETTER EZH*/
+ 0x1b8, /* U+0001b8: LATIN CAPITAL LETTER EZH REVERSED*/
+ 0x1b8, /* U+0001b9: LATIN SMALL LETTER EZH REVERSED*/
+ 0x1ba, /* U+0001ba: LATIN SMALL LETTER EZH WITH TAIL*/
+ 0x1bb, /* U+0001bb: LATIN LETTER TWO WITH STROKE*/
+ 0x1bc, /* U+0001bc: LATIN CAPITAL LETTER TONE FIVE*/
+ 0x1bc, /* U+0001bd: LATIN SMALL LETTER TONE FIVE*/
+ 0x1be, /* U+0001be: LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE*/
+ 0x1f7, /* U+0001bf: LATIN LETTER WYNN*/
+ 0x1c0, /* U+0001c0: LATIN LETTER DENTAL CLICK*/
+ 0x1c1, /* U+0001c1: LATIN LETTER LATERAL CLICK*/
+ 0x1c2, /* U+0001c2: LATIN LETTER ALVEOLAR CLICK*/
+ 0x1c3, /* U+0001c3: LATIN LETTER RETROFLEX CLICK*/
+ 0x1c4, /* U+0001c4: LATIN CAPITAL LETTER DZ WITH CARON*/
+ 0x1c4, /* U+0001c5: LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON*/
+ 0x1c4, /* U+0001c6: LATIN SMALL LETTER DZ WITH CARON*/
+ 0x1c7, /* U+0001c7: LATIN CAPITAL LETTER LJ*/
+ 0x1c7, /* U+0001c8: LATIN CAPITAL LETTER L WITH SMALL LETTER J*/
+ 0x1c7, /* U+0001c9: LATIN SMALL LETTER LJ*/
+ 0x1ca, /* U+0001ca: LATIN CAPITAL LETTER NJ*/
+ 0x1ca, /* U+0001cb: LATIN CAPITAL LETTER N WITH SMALL LETTER J*/
+ 0x1ca, /* U+0001cc: LATIN SMALL LETTER NJ*/
+ 0x1cd, /* U+0001cd: LATIN CAPITAL LETTER A WITH CARON*/
+ 0x1cd, /* U+0001ce: LATIN SMALL LETTER A WITH CARON*/
+ 0x1cf, /* U+0001cf: LATIN CAPITAL LETTER I WITH CARON*/
+ 0x1cf, /* U+0001d0: LATIN SMALL LETTER I WITH CARON*/
+ 0x1d1, /* U+0001d1: LATIN CAPITAL LETTER O WITH CARON*/
+ 0x1d1, /* U+0001d2: LATIN SMALL LETTER O WITH CARON*/
+ 0x1d3, /* U+0001d3: LATIN CAPITAL LETTER U WITH CARON*/
+ 0x1d3, /* U+0001d4: LATIN SMALL LETTER U WITH CARON*/
+ 0x1d5, /* U+0001d5: LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON*/
+ 0x1d5, /* U+0001d6: LATIN SMALL LETTER U WITH DIAERESIS AND MACRON*/
+ 0x1d7, /* U+0001d7: LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE*/
+ 0x1d7, /* U+0001d8: LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE*/
+ 0x1d9, /* U+0001d9: LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON*/
+ 0x1d9, /* U+0001da: LATIN SMALL LETTER U WITH DIAERESIS AND CARON*/
+ 0x1db, /* U+0001db: LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE*/
+ 0x1db, /* U+0001dc: LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE*/
+ 0x18e, /* U+0001dd: LATIN SMALL LETTER TURNED E*/
+ 0x1de, /* U+0001de: LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON*/
+ 0x1de, /* U+0001df: LATIN SMALL LETTER A WITH DIAERESIS AND MACRON*/
+ 0x1e0, /* U+0001e0: LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON*/
+ 0x1e0, /* U+0001e1: LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON*/
+ 0x1e2, /* U+0001e2: LATIN CAPITAL LETTER AE WITH MACRON*/
+ 0x1e2, /* U+0001e3: LATIN SMALL LETTER AE WITH MACRON*/
+ 0x1e4, /* U+0001e4: LATIN CAPITAL LETTER G WITH STROKE*/
+ 0x1e4, /* U+0001e5: LATIN SMALL LETTER G WITH STROKE*/
+ 0x1e6, /* U+0001e6: LATIN CAPITAL LETTER G WITH CARON*/
+ 0x1e6, /* U+0001e7: LATIN SMALL LETTER G WITH CARON*/
+ 0x1e8, /* U+0001e8: LATIN CAPITAL LETTER K WITH CARON*/
+ 0x1e8, /* U+0001e9: LATIN SMALL LETTER K WITH CARON*/
+ 0x1ea, /* U+0001ea: LATIN CAPITAL LETTER O WITH OGONEK*/
+ 0x1ea, /* U+0001eb: LATIN SMALL LETTER O WITH OGONEK*/
+ 0x1ec, /* U+0001ec: LATIN CAPITAL LETTER O WITH OGONEK AND MACRON*/
+ 0x1ec, /* U+0001ed: LATIN SMALL LETTER O WITH OGONEK AND MACRON*/
+ 0x1ee, /* U+0001ee: LATIN CAPITAL LETTER EZH WITH CARON*/
+ 0x1ee, /* U+0001ef: LATIN SMALL LETTER EZH WITH CARON*/
+ 0x1f0, /* U+0001f0: LATIN SMALL LETTER J WITH CARON*/
+ 0x1f1, /* U+0001f1: LATIN CAPITAL LETTER DZ*/
+ 0x1f1, /* U+0001f2: LATIN CAPITAL LETTER D WITH SMALL LETTER Z*/
+ 0x1f1, /* U+0001f3: LATIN SMALL LETTER DZ*/
+ 0x1f4, /* U+0001f4: LATIN CAPITAL LETTER G WITH ACUTE*/
+ 0x1f4, /* U+0001f5: LATIN SMALL LETTER G WITH ACUTE*/
+ 0x1f6, /* U+0001f6: LATIN CAPITAL LETTER HWAIR*/
+ 0x1f7, /* U+0001f7: LATIN CAPITAL LETTER WYNN*/
+ 0x1f8, /* U+0001f8: LATIN CAPITAL LETTER N WITH GRAVE*/
+ 0x1f8, /* U+0001f9: LATIN SMALL LETTER N WITH GRAVE*/
+ 0x1fa, /* U+0001fa: LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE*/
+ 0x1fa, /* U+0001fb: LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE*/
+ 0x1fc, /* U+0001fc: LATIN CAPITAL LETTER AE WITH ACUTE*/
+ 0x1fc, /* U+0001fd: LATIN SMALL LETTER AE WITH ACUTE*/
+ 0x1fe, /* U+0001fe: LATIN CAPITAL LETTER O WITH STROKE AND ACUTE*/
+ 0x1fe, /* U+0001ff: LATIN SMALL LETTER O WITH STROKE AND ACUTE*/
+ 0x200, /* U+000200: LATIN CAPITAL LETTER A WITH DOUBLE GRAVE*/
+ 0x200, /* U+000201: LATIN SMALL LETTER A WITH DOUBLE GRAVE*/
+ 0x202, /* U+000202: LATIN CAPITAL LETTER A WITH INVERTED BREVE*/
+ 0x202, /* U+000203: LATIN SMALL LETTER A WITH INVERTED BREVE*/
+ 0x204, /* U+000204: LATIN CAPITAL LETTER E WITH DOUBLE GRAVE*/
+ 0x204, /* U+000205: LATIN SMALL LETTER E WITH DOUBLE GRAVE*/
+ 0x206, /* U+000206: LATIN CAPITAL LETTER E WITH INVERTED BREVE*/
+ 0x206, /* U+000207: LATIN SMALL LETTER E WITH INVERTED BREVE*/
+ 0x208, /* U+000208: LATIN CAPITAL LETTER I WITH DOUBLE GRAVE*/
+ 0x208, /* U+000209: LATIN SMALL LETTER I WITH DOUBLE GRAVE*/
+ 0x20a, /* U+00020a: LATIN CAPITAL LETTER I WITH INVERTED BREVE*/
+ 0x20a, /* U+00020b: LATIN SMALL LETTER I WITH INVERTED BREVE*/
+ 0x20c, /* U+00020c: LATIN CAPITAL LETTER O WITH DOUBLE GRAVE*/
+ 0x20c, /* U+00020d: LATIN SMALL LETTER O WITH DOUBLE GRAVE*/
+ 0x20e, /* U+00020e: LATIN CAPITAL LETTER O WITH INVERTED BREVE*/
+ 0x20e, /* U+00020f: LATIN SMALL LETTER O WITH INVERTED BREVE*/
+ 0x210, /* U+000210: LATIN CAPITAL LETTER R WITH DOUBLE GRAVE*/
+ 0x210, /* U+000211: LATIN SMALL LETTER R WITH DOUBLE GRAVE*/
+ 0x212, /* U+000212: LATIN CAPITAL LETTER R WITH INVERTED BREVE*/
+ 0x212, /* U+000213: LATIN SMALL LETTER R WITH INVERTED BREVE*/
+ 0x214, /* U+000214: LATIN CAPITAL LETTER U WITH DOUBLE GRAVE*/
+ 0x214, /* U+000215: LATIN SMALL LETTER U WITH DOUBLE GRAVE*/
+ 0x216, /* U+000216: LATIN CAPITAL LETTER U WITH INVERTED BREVE*/
+ 0x216, /* U+000217: LATIN SMALL LETTER U WITH INVERTED BREVE*/
+ 0x218, /* U+000218: LATIN CAPITAL LETTER S WITH COMMA BELOW*/
+ 0x218, /* U+000219: LATIN SMALL LETTER S WITH COMMA BELOW*/
+ 0x21a, /* U+00021a: LATIN CAPITAL LETTER T WITH COMMA BELOW*/
+ 0x21a, /* U+00021b: LATIN SMALL LETTER T WITH COMMA BELOW*/
+ 0x21c, /* U+00021c: LATIN CAPITAL LETTER YOGH*/
+ 0x21c, /* U+00021d: LATIN SMALL LETTER YOGH*/
+ 0x21e, /* U+00021e: LATIN CAPITAL LETTER H WITH CARON*/
+ 0x21e, /* U+00021f: LATIN SMALL LETTER H WITH CARON*/
+ 0x220, /* U+000220: LATIN CAPITAL LETTER N WITH LONG RIGHT LEG*/
+ 0x221, /* U+000221: LATIN SMALL LETTER D WITH CURL*/
+ 0x222, /* U+000222: LATIN CAPITAL LETTER OU*/
+ 0x222, /* U+000223: LATIN SMALL LETTER OU*/
+ 0x224, /* U+000224: LATIN CAPITAL LETTER Z WITH HOOK*/
+ 0x224, /* U+000225: LATIN SMALL LETTER Z WITH HOOK*/
+ 0x226, /* U+000226: LATIN CAPITAL LETTER A WITH DOT ABOVE*/
+ 0x226, /* U+000227: LATIN SMALL LETTER A WITH DOT ABOVE*/
+ 0x228, /* U+000228: LATIN CAPITAL LETTER E WITH CEDILLA*/
+ 0x228, /* U+000229: LATIN SMALL LETTER E WITH CEDILLA*/
+ 0x22a, /* U+00022a: LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON*/
+ 0x22a, /* U+00022b: LATIN SMALL LETTER O WITH DIAERESIS AND MACRON*/
+ 0x22c, /* U+00022c: LATIN CAPITAL LETTER O WITH TILDE AND MACRON*/
+ 0x22c, /* U+00022d: LATIN SMALL LETTER O WITH TILDE AND MACRON*/
+ 0x22e, /* U+00022e: LATIN CAPITAL LETTER O WITH DOT ABOVE*/
+ 0x22e, /* U+00022f: LATIN SMALL LETTER O WITH DOT ABOVE*/
+ 0x230, /* U+000230: LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON*/
+ 0x230, /* U+000231: LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON*/
+ 0x232, /* U+000232: LATIN CAPITAL LETTER Y WITH MACRON*/
+ 0x232, /* U+000233: LATIN SMALL LETTER Y WITH MACRON*/
+ 0x234, /* U+000234: LATIN SMALL LETTER L WITH CURL*/
+ 0x235, /* U+000235: LATIN SMALL LETTER N WITH CURL*/
+ 0x236, /* U+000236: LATIN SMALL LETTER T WITH CURL*/
+ 0x237, /* U+000237: LATIN SMALL LETTER DOTLESS J*/
+ 0x238, /* U+000238: LATIN SMALL LETTER DB DIGRAPH*/
+ 0x239, /* U+000239: LATIN SMALL LETTER QP DIGRAPH*/
+ 0x23a, /* U+00023a: LATIN CAPITAL LETTER A WITH STROKE*/
+ 0x23b, /* U+00023b: LATIN CAPITAL LETTER C WITH STROKE*/
+ 0x23b, /* U+00023c: LATIN SMALL LETTER C WITH STROKE*/
+ 0x23d, /* U+00023d: LATIN CAPITAL LETTER L WITH BAR*/
+ 0x23e, /* U+00023e: LATIN CAPITAL LETTER T WITH DIAGONAL STROKE*/
+ 0x2c7e, /* U+00023f: LATIN SMALL LETTER S WITH SWASH TAIL*/
+ 0x2c7f, /* U+000240: LATIN SMALL LETTER Z WITH SWASH TAIL*/
+ 0x241, /* U+000241: LATIN CAPITAL LETTER GLOTTAL STOP*/
+ 0x241, /* U+000242: LATIN SMALL LETTER GLOTTAL STOP*/
+ 0x243, /* U+000243: LATIN CAPITAL LETTER B WITH STROKE*/
+ 0x244, /* U+000244: LATIN CAPITAL LETTER U BAR*/
+ 0x245, /* U+000245: LATIN CAPITAL LETTER TURNED V*/
+ 0x246, /* U+000246: LATIN CAPITAL LETTER E WITH STROKE*/
+ 0x246, /* U+000247: LATIN SMALL LETTER E WITH STROKE*/
+ 0x248, /* U+000248: LATIN CAPITAL LETTER J WITH STROKE*/
+ 0x248, /* U+000249: LATIN SMALL LETTER J WITH STROKE*/
+ 0x24a, /* U+00024a: LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL*/
+ 0x24a, /* U+00024b: LATIN SMALL LETTER Q WITH HOOK TAIL*/
+ 0x24c, /* U+00024c: LATIN CAPITAL LETTER R WITH STROKE*/
+ 0x24c, /* U+00024d: LATIN SMALL LETTER R WITH STROKE*/
+ 0x24e, /* U+00024e: LATIN CAPITAL LETTER Y WITH STROKE*/
+ 0x24e, /* U+00024f: LATIN SMALL LETTER Y WITH STROKE*/
+ 0x2c6f, /* U+000250: LATIN SMALL LETTER TURNED A*/
+ 0x2c6d, /* U+000251: LATIN SMALL LETTER ALPHA*/
+ 0x2c70, /* U+000252: LATIN SMALL LETTER TURNED ALPHA*/
+ 0x181, /* U+000253: LATIN SMALL LETTER B WITH HOOK*/
+ 0x186, /* U+000254: LATIN SMALL LETTER OPEN O*/
+ 0x255, /* U+000255: LATIN SMALL LETTER C WITH CURL*/
+ 0x189, /* U+000256: LATIN SMALL LETTER D WITH TAIL*/
+ 0x18a, /* U+000257: LATIN SMALL LETTER D WITH HOOK*/
+ 0x258, /* U+000258: LATIN SMALL LETTER REVERSED E*/
+ 0x18f, /* U+000259: LATIN SMALL LETTER SCHWA*/
+ 0x25a, /* U+00025a: LATIN SMALL LETTER SCHWA WITH HOOK*/
+ 0x190, /* U+00025b: LATIN SMALL LETTER OPEN E*/
+ 0x25c, /* U+00025c: LATIN SMALL LETTER REVERSED OPEN E*/
+ 0x25d, /* U+00025d: LATIN SMALL LETTER REVERSED OPEN E WITH HOOK*/
+ 0x25e, /* U+00025e: LATIN SMALL LETTER CLOSED REVERSED OPEN E*/
+ 0x25f, /* U+00025f: LATIN SMALL LETTER DOTLESS J WITH STROKE*/
+ 0x193, /* U+000260: LATIN SMALL LETTER G WITH HOOK*/
+ 0x261, /* U+000261: LATIN SMALL LETTER SCRIPT G*/
+ 0x262, /* U+000262: LATIN LETTER SMALL CAPITAL G*/
+ 0x194, /* U+000263: LATIN SMALL LETTER GAMMA*/
+ 0x264, /* U+000264: LATIN SMALL LETTER RAMS HORN*/
+ 0xa78d, /* U+000265: LATIN SMALL LETTER TURNED H*/
+ 0xa7aa, /* U+000266: LATIN SMALL LETTER H WITH HOOK*/
+ 0x267, /* U+000267: LATIN SMALL LETTER HENG WITH HOOK*/
+ 0x197, /* U+000268: LATIN SMALL LETTER I WITH STROKE*/
+ 0x196, /* U+000269: LATIN SMALL LETTER IOTA*/
+ 0x26a, /* U+00026a: LATIN LETTER SMALL CAPITAL I*/
+ 0x2c62, /* U+00026b: LATIN SMALL LETTER L WITH MIDDLE TILDE*/
+ 0x26c, /* U+00026c: LATIN SMALL LETTER L WITH BELT*/
+ 0x26d, /* U+00026d: LATIN SMALL LETTER L WITH RETROFLEX HOOK*/
+ 0x26e, /* U+00026e: LATIN SMALL LETTER LEZH*/
+ 0x19c, /* U+00026f: LATIN SMALL LETTER TURNED M*/
+ 0x270, /* U+000270: LATIN SMALL LETTER TURNED M WITH LONG LEG*/
+ 0x2c6e, /* U+000271: LATIN SMALL LETTER M WITH HOOK*/
+ 0x19d, /* U+000272: LATIN SMALL LETTER N WITH LEFT HOOK*/
+ 0x273, /* U+000273: LATIN SMALL LETTER N WITH RETROFLEX HOOK*/
+ 0x274, /* U+000274: LATIN LETTER SMALL CAPITAL N*/
+ 0x19f, /* U+000275: LATIN SMALL LETTER BARRED O*/
+ 0x276, /* U+000276: LATIN LETTER SMALL CAPITAL OE*/
+ 0x277, /* U+000277: LATIN SMALL LETTER CLOSED OMEGA*/
+ 0x278, /* U+000278: LATIN SMALL LETTER PHI*/
+ 0x279, /* U+000279: LATIN SMALL LETTER TURNED R*/
+ 0x27a, /* U+00027a: LATIN SMALL LETTER TURNED R WITH LONG LEG*/
+ 0x27b, /* U+00027b: LATIN SMALL LETTER TURNED R WITH HOOK*/
+ 0x27c, /* U+00027c: LATIN SMALL LETTER R WITH LONG LEG*/
+ 0x2c64, /* U+00027d: LATIN SMALL LETTER R WITH TAIL*/
+ 0x27e, /* U+00027e: LATIN SMALL LETTER R WITH FISHHOOK*/
+ 0x27f, /* U+00027f: LATIN SMALL LETTER REVERSED R WITH FISHHOOK*/
+ 0x1a6, /* U+000280: LATIN LETTER SMALL CAPITAL R*/
+ 0x281, /* U+000281: LATIN LETTER SMALL CAPITAL INVERTED R*/
+ 0x282, /* U+000282: LATIN SMALL LETTER S WITH HOOK*/
+ 0x1a9, /* U+000283: LATIN SMALL LETTER ESH*/
+ 0x284, /* U+000284: LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK*/
+ 0x285, /* U+000285: LATIN SMALL LETTER SQUAT REVERSED ESH*/
+ 0x286, /* U+000286: LATIN SMALL LETTER ESH WITH CURL*/
+ 0x287, /* U+000287: LATIN SMALL LETTER TURNED T*/
+ 0x1ae, /* U+000288: LATIN SMALL LETTER T WITH RETROFLEX HOOK*/
+ 0x244, /* U+000289: LATIN SMALL LETTER U BAR*/
+ 0x1b1, /* U+00028a: LATIN SMALL LETTER UPSILON*/
+ 0x1b2, /* U+00028b: LATIN SMALL LETTER V WITH HOOK*/
+ 0x245, /* U+00028c: LATIN SMALL LETTER TURNED V*/
+ 0x28d, /* U+00028d: LATIN SMALL LETTER TURNED W*/
+ 0x28e, /* U+00028e: LATIN SMALL LETTER TURNED Y*/
+ 0x28f, /* U+00028f: LATIN LETTER SMALL CAPITAL Y*/
+ 0x290, /* U+000290: LATIN SMALL LETTER Z WITH RETROFLEX HOOK*/
+ 0x291, /* U+000291: LATIN SMALL LETTER Z WITH CURL*/
+ 0x1b7, /* U+000292: LATIN SMALL LETTER EZH*/
+ 0x293, /* U+000293: LATIN SMALL LETTER EZH WITH CURL*/
+ 0x294, /* U+000294: LATIN LETTER GLOTTAL STOP*/
+ 0x295, /* U+000295: LATIN LETTER PHARYNGEAL VOICED FRICATIVE*/
+ 0x296, /* U+000296: LATIN LETTER INVERTED GLOTTAL STOP*/
+ 0x297, /* U+000297: LATIN LETTER STRETCHED C*/
+ 0x298, /* U+000298: LATIN LETTER BILABIAL CLICK*/
+ 0x299, /* U+000299: LATIN LETTER SMALL CAPITAL B*/
+ 0x29a, /* U+00029a: LATIN SMALL LETTER CLOSED OPEN E*/
+ 0x29b, /* U+00029b: LATIN LETTER SMALL CAPITAL G WITH HOOK*/
+ 0x29c, /* U+00029c: LATIN LETTER SMALL CAPITAL H*/
+ 0x29d, /* U+00029d: LATIN SMALL LETTER J WITH CROSSED-TAIL*/
+ 0x29e, /* U+00029e: LATIN SMALL LETTER TURNED K*/
+ 0x29f, /* U+00029f: LATIN LETTER SMALL CAPITAL L*/
+ 0x2a0, /* U+0002a0: LATIN SMALL LETTER Q WITH HOOK*/
+ 0x2a1, /* U+0002a1: LATIN LETTER GLOTTAL STOP WITH STROKE*/
+ 0x2a2, /* U+0002a2: LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE*/
+ 0x2a3, /* U+0002a3: LATIN SMALL LETTER DZ DIGRAPH*/
+ 0x2a4, /* U+0002a4: LATIN SMALL LETTER DEZH DIGRAPH*/
+ 0x2a5, /* U+0002a5: LATIN SMALL LETTER DZ DIGRAPH WITH CURL*/
+ 0x2a6, /* U+0002a6: LATIN SMALL LETTER TS DIGRAPH*/
+ 0x2a7, /* U+0002a7: LATIN SMALL LETTER TESH DIGRAPH*/
+ 0x2a8, /* U+0002a8: LATIN SMALL LETTER TC DIGRAPH WITH CURL*/
+ 0x2a9, /* U+0002a9: LATIN SMALL LETTER FENG DIGRAPH*/
+ 0x2aa, /* U+0002aa: LATIN SMALL LETTER LS DIGRAPH*/
+ 0x2ab, /* U+0002ab: LATIN SMALL LETTER LZ DIGRAPH*/
+ 0x2ac, /* U+0002ac: LATIN LETTER BILABIAL PERCUSSIVE*/
+ 0x2ad, /* U+0002ad: LATIN LETTER BIDENTAL PERCUSSIVE*/
+ 0x2ae, /* U+0002ae: LATIN SMALL LETTER TURNED H WITH FISHHOOK*/
+ 0x2af, /* U+0002af: LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL*/
+ 0x2b0, /* U+0002b0: MODIFIER LETTER SMALL H*/
+ 0x2b1, /* U+0002b1: MODIFIER LETTER SMALL H WITH HOOK*/
+ 0x2b2, /* U+0002b2: MODIFIER LETTER SMALL J*/
+ 0x2b3, /* U+0002b3: MODIFIER LETTER SMALL R*/
+ 0x2b4, /* U+0002b4: MODIFIER LETTER SMALL TURNED R*/
+ 0x2b5, /* U+0002b5: MODIFIER LETTER SMALL TURNED R WITH HOOK*/
+ 0x2b6, /* U+0002b6: MODIFIER LETTER SMALL CAPITAL INVERTED R*/
+ 0x2b7, /* U+0002b7: MODIFIER LETTER SMALL W*/
+ 0x2b8, /* U+0002b8: MODIFIER LETTER SMALL Y*/
+ 0x2b9, /* U+0002b9: MODIFIER LETTER PRIME*/
+ 0x2ba, /* U+0002ba: MODIFIER LETTER DOUBLE PRIME*/
+ 0x2bb, /* U+0002bb: MODIFIER LETTER TURNED COMMA*/
+ 0x2bc, /* U+0002bc: MODIFIER LETTER APOSTROPHE*/
+ 0x2bd, /* U+0002bd: MODIFIER LETTER REVERSED COMMA*/
+ 0x2be, /* U+0002be: MODIFIER LETTER RIGHT HALF RING*/
+ 0x2bf, /* U+0002bf: MODIFIER LETTER LEFT HALF RING*/
+ 0x2c0, /* U+0002c0: MODIFIER LETTER GLOTTAL STOP*/
+ 0x2c1, /* U+0002c1: MODIFIER LETTER REVERSED GLOTTAL STOP*/
+ 0x2c2, /* U+0002c2: MODIFIER LETTER LEFT ARROWHEAD*/
+ 0x2c3, /* U+0002c3: MODIFIER LETTER RIGHT ARROWHEAD*/
+ 0x2c4, /* U+0002c4: MODIFIER LETTER UP ARROWHEAD*/
+ 0x2c5, /* U+0002c5: MODIFIER LETTER DOWN ARROWHEAD*/
+ 0x2c6, /* U+0002c6: MODIFIER LETTER CIRCUMFLEX ACCENT*/
+ 0x2c7, /* U+0002c7: CARON*/
+ 0x2c8, /* U+0002c8: MODIFIER LETTER VERTICAL LINE*/
+ 0x2c9, /* U+0002c9: MODIFIER LETTER MACRON*/
+ 0x2ca, /* U+0002ca: MODIFIER LETTER ACUTE ACCENT*/
+ 0x2cb, /* U+0002cb: MODIFIER LETTER GRAVE ACCENT*/
+ 0x2cc, /* U+0002cc: MODIFIER LETTER LOW VERTICAL LINE*/
+ 0x2cd, /* U+0002cd: MODIFIER LETTER LOW MACRON*/
+ 0x2ce, /* U+0002ce: MODIFIER LETTER LOW GRAVE ACCENT*/
+ 0x2cf, /* U+0002cf: MODIFIER LETTER LOW ACUTE ACCENT*/
+ 0x2d0, /* U+0002d0: MODIFIER LETTER TRIANGULAR COLON*/
+ 0x2d1, /* U+0002d1: MODIFIER LETTER HALF TRIANGULAR COLON*/
+ 0x2d2, /* U+0002d2: MODIFIER LETTER CENTRED RIGHT HALF RING*/
+ 0x2d3, /* U+0002d3: MODIFIER LETTER CENTRED LEFT HALF RING*/
+ 0x2d4, /* U+0002d4: MODIFIER LETTER UP TACK*/
+ 0x2d5, /* U+0002d5: MODIFIER LETTER DOWN TACK*/
+ 0x2d6, /* U+0002d6: MODIFIER LETTER PLUS SIGN*/
+ 0x2d7, /* U+0002d7: MODIFIER LETTER MINUS SIGN*/
+ 0x2d8, /* U+0002d8: BREVE*/
+ 0x2d9, /* U+0002d9: DOT ABOVE*/
+ 0x2da, /* U+0002da: RING ABOVE*/
+ 0x2db, /* U+0002db: OGONEK*/
+ 0x2dc, /* U+0002dc: SMALL TILDE*/
+ 0x2dd, /* U+0002dd: DOUBLE ACUTE ACCENT*/
+ 0x2de, /* U+0002de: MODIFIER LETTER RHOTIC HOOK*/
+ 0x2df, /* U+0002df: MODIFIER LETTER CROSS ACCENT*/
+ 0x2e0, /* U+0002e0: MODIFIER LETTER SMALL GAMMA*/
+ 0x2e1, /* U+0002e1: MODIFIER LETTER SMALL L*/
+ 0x2e2, /* U+0002e2: MODIFIER LETTER SMALL S*/
+ 0x2e3, /* U+0002e3: MODIFIER LETTER SMALL X*/
+ 0x2e4, /* U+0002e4: MODIFIER LETTER SMALL REVERSED GLOTTAL STOP*/
+ 0x2e5, /* U+0002e5: MODIFIER LETTER EXTRA-HIGH TONE BAR*/
+ 0x2e6, /* U+0002e6: MODIFIER LETTER HIGH TONE BAR*/
+ 0x2e7, /* U+0002e7: MODIFIER LETTER MID TONE BAR*/
+ 0x2e8, /* U+0002e8: MODIFIER LETTER LOW TONE BAR*/
+ 0x2e9, /* U+0002e9: MODIFIER LETTER EXTRA-LOW TONE BAR*/
+ 0x2ea, /* U+0002ea: MODIFIER LETTER YIN DEPARTING TONE MARK*/
+ 0x2eb, /* U+0002eb: MODIFIER LETTER YANG DEPARTING TONE MARK*/
+ 0x2ec, /* U+0002ec: MODIFIER LETTER VOICING*/
+ 0x2ed, /* U+0002ed: MODIFIER LETTER UNASPIRATED*/
+ 0x2ee, /* U+0002ee: MODIFIER LETTER DOUBLE APOSTROPHE*/
+ 0x2ef, /* U+0002ef: MODIFIER LETTER LOW DOWN ARROWHEAD*/
+ 0x2f0, /* U+0002f0: MODIFIER LETTER LOW UP ARROWHEAD*/
+ 0x2f1, /* U+0002f1: MODIFIER LETTER LOW LEFT ARROWHEAD*/
+ 0x2f2, /* U+0002f2: MODIFIER LETTER LOW RIGHT ARROWHEAD*/
+ 0x2f3, /* U+0002f3: MODIFIER LETTER LOW RING*/
+ 0x2f4, /* U+0002f4: MODIFIER LETTER MIDDLE GRAVE ACCENT*/
+ 0x2f5, /* U+0002f5: MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT*/
+ 0x2f6, /* U+0002f6: MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT*/
+ 0x2f7, /* U+0002f7: MODIFIER LETTER LOW TILDE*/
+ 0x2f8, /* U+0002f8: MODIFIER LETTER RAISED COLON*/
+ 0x2f9, /* U+0002f9: MODIFIER LETTER BEGIN HIGH TONE*/
+ 0x2fa, /* U+0002fa: MODIFIER LETTER END HIGH TONE*/
+ 0x2fb, /* U+0002fb: MODIFIER LETTER BEGIN LOW TONE*/
+ 0x2fc, /* U+0002fc: MODIFIER LETTER END LOW TONE*/
+ 0x2fd, /* U+0002fd: MODIFIER LETTER SHELF*/
+ 0x2fe, /* U+0002fe: MODIFIER LETTER OPEN SHELF*/
+ 0x2ff, /* U+0002ff: MODIFIER LETTER LOW LEFT ARROW*/
+ 0x300, /* U+000300: COMBINING GRAVE ACCENT*/
+ 0x301, /* U+000301: COMBINING ACUTE ACCENT*/
+ 0x302, /* U+000302: COMBINING CIRCUMFLEX ACCENT*/
+ 0x303, /* U+000303: COMBINING TILDE*/
+ 0x304, /* U+000304: COMBINING MACRON*/
+ 0x305, /* U+000305: COMBINING OVERLINE*/
+ 0x306, /* U+000306: COMBINING BREVE*/
+ 0x307, /* U+000307: COMBINING DOT ABOVE*/
+ 0x308, /* U+000308: COMBINING DIAERESIS*/
+ 0x309, /* U+000309: COMBINING HOOK ABOVE*/
+ 0x30a, /* U+00030a: COMBINING RING ABOVE*/
+ 0x30b, /* U+00030b: COMBINING DOUBLE ACUTE ACCENT*/
+ 0x30c, /* U+00030c: COMBINING CARON*/
+ 0x30d, /* U+00030d: COMBINING VERTICAL LINE ABOVE*/
+ 0x30e, /* U+00030e: COMBINING DOUBLE VERTICAL LINE ABOVE*/
+ 0x30f, /* U+00030f: COMBINING DOUBLE GRAVE ACCENT*/
+ 0x310, /* U+000310: COMBINING CANDRABINDU*/
+ 0x311, /* U+000311: COMBINING INVERTED BREVE*/
+ 0x312, /* U+000312: COMBINING TURNED COMMA ABOVE*/
+ 0x313, /* U+000313: COMBINING COMMA ABOVE*/
+ 0x314, /* U+000314: COMBINING REVERSED COMMA ABOVE*/
+ 0x315, /* U+000315: COMBINING COMMA ABOVE RIGHT*/
+ 0x316, /* U+000316: COMBINING GRAVE ACCENT BELOW*/
+ 0x317, /* U+000317: COMBINING ACUTE ACCENT BELOW*/
+ 0x318, /* U+000318: COMBINING LEFT TACK BELOW*/
+ 0x319, /* U+000319: COMBINING RIGHT TACK BELOW*/
+ 0x31a, /* U+00031a: COMBINING LEFT ANGLE ABOVE*/
+ 0x31b, /* U+00031b: COMBINING HORN*/
+ 0x31c, /* U+00031c: COMBINING LEFT HALF RING BELOW*/
+ 0x31d, /* U+00031d: COMBINING UP TACK BELOW*/
+ 0x31e, /* U+00031e: COMBINING DOWN TACK BELOW*/
+ 0x31f, /* U+00031f: COMBINING PLUS SIGN BELOW*/
+ 0x320, /* U+000320: COMBINING MINUS SIGN BELOW*/
+ 0x321, /* U+000321: COMBINING PALATALIZED HOOK BELOW*/
+ 0x322, /* U+000322: COMBINING RETROFLEX HOOK BELOW*/
+ 0x323, /* U+000323: COMBINING DOT BELOW*/
+ 0x324, /* U+000324: COMBINING DIAERESIS BELOW*/
+ 0x325, /* U+000325: COMBINING RING BELOW*/
+ 0x326, /* U+000326: COMBINING COMMA BELOW*/
+ 0x327, /* U+000327: COMBINING CEDILLA*/
+ 0x328, /* U+000328: COMBINING OGONEK*/
+ 0x329, /* U+000329: COMBINING VERTICAL LINE BELOW*/
+ 0x32a, /* U+00032a: COMBINING BRIDGE BELOW*/
+ 0x32b, /* U+00032b: COMBINING INVERTED DOUBLE ARCH BELOW*/
+ 0x32c, /* U+00032c: COMBINING CARON BELOW*/
+ 0x32d, /* U+00032d: COMBINING CIRCUMFLEX ACCENT BELOW*/
+ 0x32e, /* U+00032e: COMBINING BREVE BELOW*/
+ 0x32f, /* U+00032f: COMBINING INVERTED BREVE BELOW*/
+ 0x330, /* U+000330: COMBINING TILDE BELOW*/
+ 0x331, /* U+000331: COMBINING MACRON BELOW*/
+ 0x332, /* U+000332: COMBINING LOW LINE*/
+ 0x333, /* U+000333: COMBINING DOUBLE LOW LINE*/
+ 0x334, /* U+000334: COMBINING TILDE OVERLAY*/
+ 0x335, /* U+000335: COMBINING SHORT STROKE OVERLAY*/
+ 0x336, /* U+000336: COMBINING LONG STROKE OVERLAY*/
+ 0x337, /* U+000337: COMBINING SHORT SOLIDUS OVERLAY*/
+ 0x338, /* U+000338: COMBINING LONG SOLIDUS OVERLAY*/
+ 0x339, /* U+000339: COMBINING RIGHT HALF RING BELOW*/
+ 0x33a, /* U+00033a: COMBINING INVERTED BRIDGE BELOW*/
+ 0x33b, /* U+00033b: COMBINING SQUARE BELOW*/
+ 0x33c, /* U+00033c: COMBINING SEAGULL BELOW*/
+ 0x33d, /* U+00033d: COMBINING X ABOVE*/
+ 0x33e, /* U+00033e: COMBINING VERTICAL TILDE*/
+ 0x33f, /* U+00033f: COMBINING DOUBLE OVERLINE*/
+ 0x340, /* U+000340: COMBINING GRAVE TONE MARK*/
+ 0x341, /* U+000341: COMBINING ACUTE TONE MARK*/
+ 0x342, /* U+000342: COMBINING GREEK PERISPOMENI*/
+ 0x343, /* U+000343: COMBINING GREEK KORONIS*/
+ 0x344, /* U+000344: COMBINING GREEK DIALYTIKA TONOS*/
+ 0x399, /* U+000345: COMBINING GREEK YPOGEGRAMMENI*/
+ 0x346, /* U+000346: COMBINING BRIDGE ABOVE*/
+ 0x347, /* U+000347: COMBINING EQUALS SIGN BELOW*/
+ 0x348, /* U+000348: COMBINING DOUBLE VERTICAL LINE BELOW*/
+ 0x349, /* U+000349: COMBINING LEFT ANGLE BELOW*/
+ 0x34a, /* U+00034a: COMBINING NOT TILDE ABOVE*/
+ 0x34b, /* U+00034b: COMBINING HOMOTHETIC ABOVE*/
+ 0x34c, /* U+00034c: COMBINING ALMOST EQUAL TO ABOVE*/
+ 0x34d, /* U+00034d: COMBINING LEFT RIGHT ARROW BELOW*/
+ 0x34e, /* U+00034e: COMBINING UPWARDS ARROW BELOW*/
+ 0x34f, /* U+00034f: COMBINING GRAPHEME JOINER*/
+ 0x350, /* U+000350: COMBINING RIGHT ARROWHEAD ABOVE*/
+ 0x351, /* U+000351: COMBINING LEFT HALF RING ABOVE*/
+ 0x352, /* U+000352: COMBINING FERMATA*/
+ 0x353, /* U+000353: COMBINING X BELOW*/
+ 0x354, /* U+000354: COMBINING LEFT ARROWHEAD BELOW*/
+ 0x355, /* U+000355: COMBINING RIGHT ARROWHEAD BELOW*/
+ 0x356, /* U+000356: COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW*/
+ 0x357, /* U+000357: COMBINING RIGHT HALF RING ABOVE*/
+ 0x358, /* U+000358: COMBINING DOT ABOVE RIGHT*/
+ 0x359, /* U+000359: COMBINING ASTERISK BELOW*/
+ 0x35a, /* U+00035a: COMBINING DOUBLE RING BELOW*/
+ 0x35b, /* U+00035b: COMBINING ZIGZAG ABOVE*/
+ 0x35c, /* U+00035c: COMBINING DOUBLE BREVE BELOW*/
+ 0x35d, /* U+00035d: COMBINING DOUBLE BREVE*/
+ 0x35e, /* U+00035e: COMBINING DOUBLE MACRON*/
+ 0x35f, /* U+00035f: COMBINING DOUBLE MACRON BELOW*/
+ 0x360, /* U+000360: COMBINING DOUBLE TILDE*/
+ 0x361, /* U+000361: COMBINING DOUBLE INVERTED BREVE*/
+ 0x362, /* U+000362: COMBINING DOUBLE RIGHTWARDS ARROW BELOW*/
+ 0x363, /* U+000363: COMBINING LATIN SMALL LETTER A*/
+ 0x364, /* U+000364: COMBINING LATIN SMALL LETTER E*/
+ 0x365, /* U+000365: COMBINING LATIN SMALL LETTER I*/
+ 0x366, /* U+000366: COMBINING LATIN SMALL LETTER O*/
+ 0x367, /* U+000367: COMBINING LATIN SMALL LETTER U*/
+ 0x368, /* U+000368: COMBINING LATIN SMALL LETTER C*/
+ 0x369, /* U+000369: COMBINING LATIN SMALL LETTER D*/
+ 0x36a, /* U+00036a: COMBINING LATIN SMALL LETTER H*/
+ 0x36b, /* U+00036b: COMBINING LATIN SMALL LETTER M*/
+ 0x36c, /* U+00036c: COMBINING LATIN SMALL LETTER R*/
+ 0x36d, /* U+00036d: COMBINING LATIN SMALL LETTER T*/
+ 0x36e, /* U+00036e: COMBINING LATIN SMALL LETTER V*/
+ 0x36f, /* U+00036f: COMBINING LATIN SMALL LETTER X*/
+ 0x370, /* U+000370: GREEK CAPITAL LETTER HETA*/
+ 0x370, /* U+000371: GREEK SMALL LETTER HETA*/
+ 0x372, /* U+000372: GREEK CAPITAL LETTER ARCHAIC SAMPI*/
+ 0x372, /* U+000373: GREEK SMALL LETTER ARCHAIC SAMPI*/
+ 0x374, /* U+000374: GREEK NUMERAL SIGN*/
+ 0x375, /* U+000375: GREEK LOWER NUMERAL SIGN*/
+ 0x376, /* U+000376: GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA*/
+ 0x376, /* U+000377: GREEK SMALL LETTER PAMPHYLIAN DIGAMMA*/
+ 0x378, /* U+000378: */
+ 0x379, /* U+000379: */
+ 0x37a, /* U+00037a: GREEK YPOGEGRAMMENI*/
+ 0x3fd, /* U+00037b: GREEK SMALL REVERSED LUNATE SIGMA SYMBOL*/
+ 0x3fe, /* U+00037c: GREEK SMALL DOTTED LUNATE SIGMA SYMBOL*/
+ 0x3ff, /* U+00037d: GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL*/
+ 0x37e, /* U+00037e: GREEK QUESTION MARK*/
+ 0x37f, /* U+00037f: */
+ 0x380, /* U+000380: */
+ 0x381, /* U+000381: */
+ 0x382, /* U+000382: */
+ 0x383, /* U+000383: */
+ 0x384, /* U+000384: GREEK TONOS*/
+ 0x385, /* U+000385: GREEK DIALYTIKA TONOS*/
+ 0x386, /* U+000386: GREEK CAPITAL LETTER ALPHA WITH TONOS*/
+ 0x387, /* U+000387: GREEK ANO TELEIA*/
+ 0x388, /* U+000388: GREEK CAPITAL LETTER EPSILON WITH TONOS*/
+ 0x389, /* U+000389: GREEK CAPITAL LETTER ETA WITH TONOS*/
+ 0x38a, /* U+00038a: GREEK CAPITAL LETTER IOTA WITH TONOS*/
+ 0x38b, /* U+00038b: */
+ 0x38c, /* U+00038c: GREEK CAPITAL LETTER OMICRON WITH TONOS*/
+ 0x38d, /* U+00038d: */
+ 0x38e, /* U+00038e: GREEK CAPITAL LETTER UPSILON WITH TONOS*/
+ 0x38f, /* U+00038f: GREEK CAPITAL LETTER OMEGA WITH TONOS*/
+ 0x390, /* U+000390: GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS*/
+ 0x391, /* U+000391: GREEK CAPITAL LETTER ALPHA*/
+ 0x392, /* U+000392: GREEK CAPITAL LETTER BETA*/
+ 0x393, /* U+000393: GREEK CAPITAL LETTER GAMMA*/
+ 0x394, /* U+000394: GREEK CAPITAL LETTER DELTA*/
+ 0x395, /* U+000395: GREEK CAPITAL LETTER EPSILON*/
+ 0x396, /* U+000396: GREEK CAPITAL LETTER ZETA*/
+ 0x397, /* U+000397: GREEK CAPITAL LETTER ETA*/
+ 0x398, /* U+000398: GREEK CAPITAL LETTER THETA*/
+ 0x399, /* U+000399: GREEK CAPITAL LETTER IOTA*/
+ 0x39a, /* U+00039a: GREEK CAPITAL LETTER KAPPA*/
+ 0x39b, /* U+00039b: GREEK CAPITAL LETTER LAMDA*/
+ 0x39c, /* U+00039c: GREEK CAPITAL LETTER MU*/
+ 0x39d, /* U+00039d: GREEK CAPITAL LETTER NU*/
+ 0x39e, /* U+00039e: GREEK CAPITAL LETTER XI*/
+ 0x39f, /* U+00039f: GREEK CAPITAL LETTER OMICRON*/
+ 0x3a0, /* U+0003a0: GREEK CAPITAL LETTER PI*/
+ 0x3a1, /* U+0003a1: GREEK CAPITAL LETTER RHO*/
+ 0x3a2, /* U+0003a2: */
+ 0x3a3, /* U+0003a3: GREEK CAPITAL LETTER SIGMA*/
+ 0x3a4, /* U+0003a4: GREEK CAPITAL LETTER TAU*/
+ 0x3a5, /* U+0003a5: GREEK CAPITAL LETTER UPSILON*/
+ 0x3a6, /* U+0003a6: GREEK CAPITAL LETTER PHI*/
+ 0x3a7, /* U+0003a7: GREEK CAPITAL LETTER CHI*/
+ 0x3a8, /* U+0003a8: GREEK CAPITAL LETTER PSI*/
+ 0x3a9, /* U+0003a9: GREEK CAPITAL LETTER OMEGA*/
+ 0x3aa, /* U+0003aa: GREEK CAPITAL LETTER IOTA WITH DIALYTIKA*/
+ 0x3ab, /* U+0003ab: GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA*/
+ 0x386, /* U+0003ac: GREEK SMALL LETTER ALPHA WITH TONOS*/
+ 0x388, /* U+0003ad: GREEK SMALL LETTER EPSILON WITH TONOS*/
+ 0x389, /* U+0003ae: GREEK SMALL LETTER ETA WITH TONOS*/
+ 0x38a, /* U+0003af: GREEK SMALL LETTER IOTA WITH TONOS*/
+ 0x3b0, /* U+0003b0: GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS*/
+ 0x391, /* U+0003b1: GREEK SMALL LETTER ALPHA*/
+ 0x392, /* U+0003b2: GREEK SMALL LETTER BETA*/
+ 0x393, /* U+0003b3: GREEK SMALL LETTER GAMMA*/
+ 0x394, /* U+0003b4: GREEK SMALL LETTER DELTA*/
+ 0x395, /* U+0003b5: GREEK SMALL LETTER EPSILON*/
+ 0x396, /* U+0003b6: GREEK SMALL LETTER ZETA*/
+ 0x397, /* U+0003b7: GREEK SMALL LETTER ETA*/
+ 0x398, /* U+0003b8: GREEK SMALL LETTER THETA*/
+ 0x399, /* U+0003b9: GREEK SMALL LETTER IOTA*/
+ 0x39a, /* U+0003ba: GREEK SMALL LETTER KAPPA*/
+ 0x39b, /* U+0003bb: GREEK SMALL LETTER LAMDA*/
+ 0x39c, /* U+0003bc: GREEK SMALL LETTER MU*/
+ 0x39d, /* U+0003bd: GREEK SMALL LETTER NU*/
+ 0x39e, /* U+0003be: GREEK SMALL LETTER XI*/
+ 0x39f, /* U+0003bf: GREEK SMALL LETTER OMICRON*/
+ 0x3a0, /* U+0003c0: GREEK SMALL LETTER PI*/
+ 0x3a1, /* U+0003c1: GREEK SMALL LETTER RHO*/
+ 0x3a3, /* U+0003c2: GREEK SMALL LETTER FINAL SIGMA*/
+ 0x3a3, /* U+0003c3: GREEK SMALL LETTER SIGMA*/
+ 0x3a4, /* U+0003c4: GREEK SMALL LETTER TAU*/
+ 0x3a5, /* U+0003c5: GREEK SMALL LETTER UPSILON*/
+ 0x3a6, /* U+0003c6: GREEK SMALL LETTER PHI*/
+ 0x3a7, /* U+0003c7: GREEK SMALL LETTER CHI*/
+ 0x3a8, /* U+0003c8: GREEK SMALL LETTER PSI*/
+ 0x3a9, /* U+0003c9: GREEK SMALL LETTER OMEGA*/
+ 0x3aa, /* U+0003ca: GREEK SMALL LETTER IOTA WITH DIALYTIKA*/
+ 0x3ab, /* U+0003cb: GREEK SMALL LETTER UPSILON WITH DIALYTIKA*/
+ 0x38c, /* U+0003cc: GREEK SMALL LETTER OMICRON WITH TONOS*/
+ 0x38e, /* U+0003cd: GREEK SMALL LETTER UPSILON WITH TONOS*/
+ 0x38f, /* U+0003ce: GREEK SMALL LETTER OMEGA WITH TONOS*/
+ 0x3cf, /* U+0003cf: GREEK CAPITAL KAI SYMBOL*/
+ 0x392, /* U+0003d0: GREEK BETA SYMBOL*/
+ 0x398, /* U+0003d1: GREEK THETA SYMBOL*/
+ 0x3d2, /* U+0003d2: GREEK UPSILON WITH HOOK SYMBOL*/
+ 0x3d3, /* U+0003d3: GREEK UPSILON WITH ACUTE AND HOOK SYMBOL*/
+ 0x3d4, /* U+0003d4: GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL*/
+ 0x3a6, /* U+0003d5: GREEK PHI SYMBOL*/
+ 0x3a0, /* U+0003d6: GREEK PI SYMBOL*/
+ 0x3cf, /* U+0003d7: GREEK KAI SYMBOL*/
+ 0x3d8, /* U+0003d8: GREEK LETTER ARCHAIC KOPPA*/
+ 0x3d8, /* U+0003d9: GREEK SMALL LETTER ARCHAIC KOPPA*/
+ 0x3da, /* U+0003da: GREEK LETTER STIGMA*/
+ 0x3da, /* U+0003db: GREEK SMALL LETTER STIGMA*/
+ 0x3dc, /* U+0003dc: GREEK LETTER DIGAMMA*/
+ 0x3dc, /* U+0003dd: GREEK SMALL LETTER DIGAMMA*/
+ 0x3de, /* U+0003de: GREEK LETTER KOPPA*/
+ 0x3de, /* U+0003df: GREEK SMALL LETTER KOPPA*/
+ 0x3e0, /* U+0003e0: GREEK LETTER SAMPI*/
+ 0x3e0, /* U+0003e1: GREEK SMALL LETTER SAMPI*/
+ 0x3e2, /* U+0003e2: COPTIC CAPITAL LETTER SHEI*/
+ 0x3e2, /* U+0003e3: COPTIC SMALL LETTER SHEI*/
+ 0x3e4, /* U+0003e4: COPTIC CAPITAL LETTER FEI*/
+ 0x3e4, /* U+0003e5: COPTIC SMALL LETTER FEI*/
+ 0x3e6, /* U+0003e6: COPTIC CAPITAL LETTER KHEI*/
+ 0x3e6, /* U+0003e7: COPTIC SMALL LETTER KHEI*/
+ 0x3e8, /* U+0003e8: COPTIC CAPITAL LETTER HORI*/
+ 0x3e8, /* U+0003e9: COPTIC SMALL LETTER HORI*/
+ 0x3ea, /* U+0003ea: COPTIC CAPITAL LETTER GANGIA*/
+ 0x3ea, /* U+0003eb: COPTIC SMALL LETTER GANGIA*/
+ 0x3ec, /* U+0003ec: COPTIC CAPITAL LETTER SHIMA*/
+ 0x3ec, /* U+0003ed: COPTIC SMALL LETTER SHIMA*/
+ 0x3ee, /* U+0003ee: COPTIC CAPITAL LETTER DEI*/
+ 0x3ee, /* U+0003ef: COPTIC SMALL LETTER DEI*/
+ 0x39a, /* U+0003f0: GREEK KAPPA SYMBOL*/
+ 0x3a1, /* U+0003f1: GREEK RHO SYMBOL*/
+ 0x3f9, /* U+0003f2: GREEK LUNATE SIGMA SYMBOL*/
+ 0x3f3, /* U+0003f3: GREEK LETTER YOT*/
+ 0x3f4, /* U+0003f4: GREEK CAPITAL THETA SYMBOL*/
+ 0x395, /* U+0003f5: GREEK LUNATE EPSILON SYMBOL*/
+ 0x3f6, /* U+0003f6: GREEK REVERSED LUNATE EPSILON SYMBOL*/
+ 0x3f7, /* U+0003f7: GREEK CAPITAL LETTER SHO*/
+ 0x3f7, /* U+0003f8: GREEK SMALL LETTER SHO*/
+ 0x3f9, /* U+0003f9: GREEK CAPITAL LUNATE SIGMA SYMBOL*/
+ 0x3fa, /* U+0003fa: GREEK CAPITAL LETTER SAN*/
+ 0x3fa, /* U+0003fb: GREEK SMALL LETTER SAN*/
+ 0x3fc, /* U+0003fc: GREEK RHO WITH STROKE SYMBOL*/
+ 0x3fd, /* U+0003fd: GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL*/
+ 0x3fe, /* U+0003fe: GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL*/
+ 0x3ff, /* U+0003ff: GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL*/
+ 0x400, /* U+000400: CYRILLIC CAPITAL LETTER IE WITH GRAVE*/
+ 0x401, /* U+000401: CYRILLIC CAPITAL LETTER IO*/
+ 0x402, /* U+000402: CYRILLIC CAPITAL LETTER DJE*/
+ 0x403, /* U+000403: CYRILLIC CAPITAL LETTER GJE*/
+ 0x404, /* U+000404: CYRILLIC CAPITAL LETTER UKRAINIAN IE*/
+ 0x405, /* U+000405: CYRILLIC CAPITAL LETTER DZE*/
+ 0x406, /* U+000406: CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I*/
+ 0x407, /* U+000407: CYRILLIC CAPITAL LETTER YI*/
+ 0x408, /* U+000408: CYRILLIC CAPITAL LETTER JE*/
+ 0x409, /* U+000409: CYRILLIC CAPITAL LETTER LJE*/
+ 0x40a, /* U+00040a: CYRILLIC CAPITAL LETTER NJE*/
+ 0x40b, /* U+00040b: CYRILLIC CAPITAL LETTER TSHE*/
+ 0x40c, /* U+00040c: CYRILLIC CAPITAL LETTER KJE*/
+ 0x40d, /* U+00040d: CYRILLIC CAPITAL LETTER I WITH GRAVE*/
+ 0x40e, /* U+00040e: CYRILLIC CAPITAL LETTER SHORT U*/
+ 0x40f, /* U+00040f: CYRILLIC CAPITAL LETTER DZHE*/
+ 0x410, /* U+000410: CYRILLIC CAPITAL LETTER A*/
+ 0x411, /* U+000411: CYRILLIC CAPITAL LETTER BE*/
+ 0x412, /* U+000412: CYRILLIC CAPITAL LETTER VE*/
+ 0x413, /* U+000413: CYRILLIC CAPITAL LETTER GHE*/
+ 0x414, /* U+000414: CYRILLIC CAPITAL LETTER DE*/
+ 0x415, /* U+000415: CYRILLIC CAPITAL LETTER IE*/
+ 0x416, /* U+000416: CYRILLIC CAPITAL LETTER ZHE*/
+ 0x417, /* U+000417: CYRILLIC CAPITAL LETTER ZE*/
+ 0x418, /* U+000418: CYRILLIC CAPITAL LETTER I*/
+ 0x419, /* U+000419: CYRILLIC CAPITAL LETTER SHORT I*/
+ 0x41a, /* U+00041a: CYRILLIC CAPITAL LETTER KA*/
+ 0x41b, /* U+00041b: CYRILLIC CAPITAL LETTER EL*/
+ 0x41c, /* U+00041c: CYRILLIC CAPITAL LETTER EM*/
+ 0x41d, /* U+00041d: CYRILLIC CAPITAL LETTER EN*/
+ 0x41e, /* U+00041e: CYRILLIC CAPITAL LETTER O*/
+ 0x41f, /* U+00041f: CYRILLIC CAPITAL LETTER PE*/
+ 0x420, /* U+000420: CYRILLIC CAPITAL LETTER ER*/
+ 0x421, /* U+000421: CYRILLIC CAPITAL LETTER ES*/
+ 0x422, /* U+000422: CYRILLIC CAPITAL LETTER TE*/
+ 0x423, /* U+000423: CYRILLIC CAPITAL LETTER U*/
+ 0x424, /* U+000424: CYRILLIC CAPITAL LETTER EF*/
+ 0x425, /* U+000425: CYRILLIC CAPITAL LETTER HA*/
+ 0x426, /* U+000426: CYRILLIC CAPITAL LETTER TSE*/
+ 0x427, /* U+000427: CYRILLIC CAPITAL LETTER CHE*/
+ 0x428, /* U+000428: CYRILLIC CAPITAL LETTER SHA*/
+ 0x429, /* U+000429: CYRILLIC CAPITAL LETTER SHCHA*/
+ 0x42a, /* U+00042a: CYRILLIC CAPITAL LETTER HARD SIGN*/
+ 0x42b, /* U+00042b: CYRILLIC CAPITAL LETTER YERU*/
+ 0x42c, /* U+00042c: CYRILLIC CAPITAL LETTER SOFT SIGN*/
+ 0x42d, /* U+00042d: CYRILLIC CAPITAL LETTER E*/
+ 0x42e, /* U+00042e: CYRILLIC CAPITAL LETTER YU*/
+ 0x42f, /* U+00042f: CYRILLIC CAPITAL LETTER YA*/
+ 0x410, /* U+000430: CYRILLIC SMALL LETTER A*/
+ 0x411, /* U+000431: CYRILLIC SMALL LETTER BE*/
+ 0x412, /* U+000432: CYRILLIC SMALL LETTER VE*/
+ 0x413, /* U+000433: CYRILLIC SMALL LETTER GHE*/
+ 0x414, /* U+000434: CYRILLIC SMALL LETTER DE*/
+ 0x415, /* U+000435: CYRILLIC SMALL LETTER IE*/
+ 0x416, /* U+000436: CYRILLIC SMALL LETTER ZHE*/
+ 0x417, /* U+000437: CYRILLIC SMALL LETTER ZE*/
+ 0x418, /* U+000438: CYRILLIC SMALL LETTER I*/
+ 0x419, /* U+000439: CYRILLIC SMALL LETTER SHORT I*/
+ 0x41a, /* U+00043a: CYRILLIC SMALL LETTER KA*/
+ 0x41b, /* U+00043b: CYRILLIC SMALL LETTER EL*/
+ 0x41c, /* U+00043c: CYRILLIC SMALL LETTER EM*/
+ 0x41d, /* U+00043d: CYRILLIC SMALL LETTER EN*/
+ 0x41e, /* U+00043e: CYRILLIC SMALL LETTER O*/
+ 0x41f, /* U+00043f: CYRILLIC SMALL LETTER PE*/
+ 0x420, /* U+000440: CYRILLIC SMALL LETTER ER*/
+ 0x421, /* U+000441: CYRILLIC SMALL LETTER ES*/
+ 0x422, /* U+000442: CYRILLIC SMALL LETTER TE*/
+ 0x423, /* U+000443: CYRILLIC SMALL LETTER U*/
+ 0x424, /* U+000444: CYRILLIC SMALL LETTER EF*/
+ 0x425, /* U+000445: CYRILLIC SMALL LETTER HA*/
+ 0x426, /* U+000446: CYRILLIC SMALL LETTER TSE*/
+ 0x427, /* U+000447: CYRILLIC SMALL LETTER CHE*/
+ 0x428, /* U+000448: CYRILLIC SMALL LETTER SHA*/
+ 0x429, /* U+000449: CYRILLIC SMALL LETTER SHCHA*/
+ 0x42a, /* U+00044a: CYRILLIC SMALL LETTER HARD SIGN*/
+ 0x42b, /* U+00044b: CYRILLIC SMALL LETTER YERU*/
+ 0x42c, /* U+00044c: CYRILLIC SMALL LETTER SOFT SIGN*/
+ 0x42d, /* U+00044d: CYRILLIC SMALL LETTER E*/
+ 0x42e, /* U+00044e: CYRILLIC SMALL LETTER YU*/
+ 0x42f, /* U+00044f: CYRILLIC SMALL LETTER YA*/
+ 0x400, /* U+000450: CYRILLIC SMALL LETTER IE WITH GRAVE*/
+ 0x401, /* U+000451: CYRILLIC SMALL LETTER IO*/
+ 0x402, /* U+000452: CYRILLIC SMALL LETTER DJE*/
+ 0x403, /* U+000453: CYRILLIC SMALL LETTER GJE*/
+ 0x404, /* U+000454: CYRILLIC SMALL LETTER UKRAINIAN IE*/
+ 0x405, /* U+000455: CYRILLIC SMALL LETTER DZE*/
+ 0x406, /* U+000456: CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I*/
+ 0x407, /* U+000457: CYRILLIC SMALL LETTER YI*/
+ 0x408, /* U+000458: CYRILLIC SMALL LETTER JE*/
+ 0x409, /* U+000459: CYRILLIC SMALL LETTER LJE*/
+ 0x40a, /* U+00045a: CYRILLIC SMALL LETTER NJE*/
+ 0x40b, /* U+00045b: CYRILLIC SMALL LETTER TSHE*/
+ 0x40c, /* U+00045c: CYRILLIC SMALL LETTER KJE*/
+ 0x40d, /* U+00045d: CYRILLIC SMALL LETTER I WITH GRAVE*/
+ 0x40e, /* U+00045e: CYRILLIC SMALL LETTER SHORT U*/
+ 0x40f, /* U+00045f: CYRILLIC SMALL LETTER DZHE*/
+ 0x460, /* U+000460: CYRILLIC CAPITAL LETTER OMEGA*/
+ 0x460, /* U+000461: CYRILLIC SMALL LETTER OMEGA*/
+ 0x462, /* U+000462: CYRILLIC CAPITAL LETTER YAT*/
+ 0x462, /* U+000463: CYRILLIC SMALL LETTER YAT*/
+ 0x464, /* U+000464: CYRILLIC CAPITAL LETTER IOTIFIED E*/
+ 0x464, /* U+000465: CYRILLIC SMALL LETTER IOTIFIED E*/
+ 0x466, /* U+000466: CYRILLIC CAPITAL LETTER LITTLE YUS*/
+ 0x466, /* U+000467: CYRILLIC SMALL LETTER LITTLE YUS*/
+ 0x468, /* U+000468: CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS*/
+ 0x468, /* U+000469: CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS*/
+ 0x46a, /* U+00046a: CYRILLIC CAPITAL LETTER BIG YUS*/
+ 0x46a, /* U+00046b: CYRILLIC SMALL LETTER BIG YUS*/
+ 0x46c, /* U+00046c: CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS*/
+ 0x46c, /* U+00046d: CYRILLIC SMALL LETTER IOTIFIED BIG YUS*/
+ 0x46e, /* U+00046e: CYRILLIC CAPITAL LETTER KSI*/
+ 0x46e, /* U+00046f: CYRILLIC SMALL LETTER KSI*/
+ 0x470, /* U+000470: CYRILLIC CAPITAL LETTER PSI*/
+ 0x470, /* U+000471: CYRILLIC SMALL LETTER PSI*/
+ 0x472, /* U+000472: CYRILLIC CAPITAL LETTER FITA*/
+ 0x472, /* U+000473: CYRILLIC SMALL LETTER FITA*/
+ 0x474, /* U+000474: CYRILLIC CAPITAL LETTER IZHITSA*/
+ 0x474, /* U+000475: CYRILLIC SMALL LETTER IZHITSA*/
+ 0x476, /* U+000476: CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT*/
+ 0x476, /* U+000477: CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT*/
+ 0x478, /* U+000478: CYRILLIC CAPITAL LETTER UK*/
+ 0x478, /* U+000479: CYRILLIC SMALL LETTER UK*/
+ 0x47a, /* U+00047a: CYRILLIC CAPITAL LETTER ROUND OMEGA*/
+ 0x47a, /* U+00047b: CYRILLIC SMALL LETTER ROUND OMEGA*/
+ 0x47c, /* U+00047c: CYRILLIC CAPITAL LETTER OMEGA WITH TITLO*/
+ 0x47c, /* U+00047d: CYRILLIC SMALL LETTER OMEGA WITH TITLO*/
+ 0x47e, /* U+00047e: CYRILLIC CAPITAL LETTER OT*/
+ 0x47e, /* U+00047f: CYRILLIC SMALL LETTER OT*/
+ 0x480, /* U+000480: CYRILLIC CAPITAL LETTER KOPPA*/
+ 0x480, /* U+000481: CYRILLIC SMALL LETTER KOPPA*/
+ 0x482, /* U+000482: CYRILLIC THOUSANDS SIGN*/
+ 0x483, /* U+000483: COMBINING CYRILLIC TITLO*/
+ 0x484, /* U+000484: COMBINING CYRILLIC PALATALIZATION*/
+ 0x485, /* U+000485: COMBINING CYRILLIC DASIA PNEUMATA*/
+ 0x486, /* U+000486: COMBINING CYRILLIC PSILI PNEUMATA*/
+ 0x487, /* U+000487: COMBINING CYRILLIC POKRYTIE*/
+ 0x488, /* U+000488: COMBINING CYRILLIC HUNDRED THOUSANDS SIGN*/
+ 0x489, /* U+000489: COMBINING CYRILLIC MILLIONS SIGN*/
+ 0x48a, /* U+00048a: CYRILLIC CAPITAL LETTER SHORT I WITH TAIL*/
+ 0x48a, /* U+00048b: CYRILLIC SMALL LETTER SHORT I WITH TAIL*/
+ 0x48c, /* U+00048c: CYRILLIC CAPITAL LETTER SEMISOFT SIGN*/
+ 0x48c, /* U+00048d: CYRILLIC SMALL LETTER SEMISOFT SIGN*/
+ 0x48e, /* U+00048e: CYRILLIC CAPITAL LETTER ER WITH TICK*/
+ 0x48e, /* U+00048f: CYRILLIC SMALL LETTER ER WITH TICK*/
+ 0x490, /* U+000490: CYRILLIC CAPITAL LETTER GHE WITH UPTURN*/
+ 0x490, /* U+000491: CYRILLIC SMALL LETTER GHE WITH UPTURN*/
+ 0x492, /* U+000492: CYRILLIC CAPITAL LETTER GHE WITH STROKE*/
+ 0x492, /* U+000493: CYRILLIC SMALL LETTER GHE WITH STROKE*/
+ 0x494, /* U+000494: CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK*/
+ 0x494, /* U+000495: CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK*/
+ 0x496, /* U+000496: CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER*/
+ 0x496, /* U+000497: CYRILLIC SMALL LETTER ZHE WITH DESCENDER*/
+ 0x498, /* U+000498: CYRILLIC CAPITAL LETTER ZE WITH DESCENDER*/
+ 0x498, /* U+000499: CYRILLIC SMALL LETTER ZE WITH DESCENDER*/
+ 0x49a, /* U+00049a: CYRILLIC CAPITAL LETTER KA WITH DESCENDER*/
+ 0x49a, /* U+00049b: CYRILLIC SMALL LETTER KA WITH DESCENDER*/
+ 0x49c, /* U+00049c: CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE*/
+ 0x49c, /* U+00049d: CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE*/
+ 0x49e, /* U+00049e: CYRILLIC CAPITAL LETTER KA WITH STROKE*/
+ 0x49e, /* U+00049f: CYRILLIC SMALL LETTER KA WITH STROKE*/
+ 0x4a0, /* U+0004a0: CYRILLIC CAPITAL LETTER BASHKIR KA*/
+ 0x4a0, /* U+0004a1: CYRILLIC SMALL LETTER BASHKIR KA*/
+ 0x4a2, /* U+0004a2: CYRILLIC CAPITAL LETTER EN WITH DESCENDER*/
+ 0x4a2, /* U+0004a3: CYRILLIC SMALL LETTER EN WITH DESCENDER*/
+ 0x4a4, /* U+0004a4: CYRILLIC CAPITAL LIGATURE EN GHE*/
+ 0x4a4, /* U+0004a5: CYRILLIC SMALL LIGATURE EN GHE*/
+ 0x4a6, /* U+0004a6: CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK*/
+ 0x4a6, /* U+0004a7: CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK*/
+ 0x4a8, /* U+0004a8: CYRILLIC CAPITAL LETTER ABKHASIAN HA*/
+ 0x4a8, /* U+0004a9: CYRILLIC SMALL LETTER ABKHASIAN HA*/
+ 0x4aa, /* U+0004aa: CYRILLIC CAPITAL LETTER ES WITH DESCENDER*/
+ 0x4aa, /* U+0004ab: CYRILLIC SMALL LETTER ES WITH DESCENDER*/
+ 0x4ac, /* U+0004ac: CYRILLIC CAPITAL LETTER TE WITH DESCENDER*/
+ 0x4ac, /* U+0004ad: CYRILLIC SMALL LETTER TE WITH DESCENDER*/
+ 0x4ae, /* U+0004ae: CYRILLIC CAPITAL LETTER STRAIGHT U*/
+ 0x4ae, /* U+0004af: CYRILLIC SMALL LETTER STRAIGHT U*/
+ 0x4b0, /* U+0004b0: CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE*/
+ 0x4b0, /* U+0004b1: CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE*/
+ 0x4b2, /* U+0004b2: CYRILLIC CAPITAL LETTER HA WITH DESCENDER*/
+ 0x4b2, /* U+0004b3: CYRILLIC SMALL LETTER HA WITH DESCENDER*/
+ 0x4b4, /* U+0004b4: CYRILLIC CAPITAL LIGATURE TE TSE*/
+ 0x4b4, /* U+0004b5: CYRILLIC SMALL LIGATURE TE TSE*/
+ 0x4b6, /* U+0004b6: CYRILLIC CAPITAL LETTER CHE WITH DESCENDER*/
+ 0x4b6, /* U+0004b7: CYRILLIC SMALL LETTER CHE WITH DESCENDER*/
+ 0x4b8, /* U+0004b8: CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE*/
+ 0x4b8, /* U+0004b9: CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE*/
+ 0x4ba, /* U+0004ba: CYRILLIC CAPITAL LETTER SHHA*/
+ 0x4ba, /* U+0004bb: CYRILLIC SMALL LETTER SHHA*/
+ 0x4bc, /* U+0004bc: CYRILLIC CAPITAL LETTER ABKHASIAN CHE*/
+ 0x4bc, /* U+0004bd: CYRILLIC SMALL LETTER ABKHASIAN CHE*/
+ 0x4be, /* U+0004be: CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER*/
+ 0x4be, /* U+0004bf: CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER*/
+ 0x4c0, /* U+0004c0: CYRILLIC LETTER PALOCHKA*/
+ 0x4c1, /* U+0004c1: CYRILLIC CAPITAL LETTER ZHE WITH BREVE*/
+ 0x4c1, /* U+0004c2: CYRILLIC SMALL LETTER ZHE WITH BREVE*/
+ 0x4c3, /* U+0004c3: CYRILLIC CAPITAL LETTER KA WITH HOOK*/
+ 0x4c3, /* U+0004c4: CYRILLIC SMALL LETTER KA WITH HOOK*/
+ 0x4c5, /* U+0004c5: CYRILLIC CAPITAL LETTER EL WITH TAIL*/
+ 0x4c5, /* U+0004c6: CYRILLIC SMALL LETTER EL WITH TAIL*/
+ 0x4c7, /* U+0004c7: CYRILLIC CAPITAL LETTER EN WITH HOOK*/
+ 0x4c7, /* U+0004c8: CYRILLIC SMALL LETTER EN WITH HOOK*/
+ 0x4c9, /* U+0004c9: CYRILLIC CAPITAL LETTER EN WITH TAIL*/
+ 0x4c9, /* U+0004ca: CYRILLIC SMALL LETTER EN WITH TAIL*/
+ 0x4cb, /* U+0004cb: CYRILLIC CAPITAL LETTER KHAKASSIAN CHE*/
+ 0x4cb, /* U+0004cc: CYRILLIC SMALL LETTER KHAKASSIAN CHE*/
+ 0x4cd, /* U+0004cd: CYRILLIC CAPITAL LETTER EM WITH TAIL*/
+ 0x4cd, /* U+0004ce: CYRILLIC SMALL LETTER EM WITH TAIL*/
+ 0x4c0, /* U+0004cf: CYRILLIC SMALL LETTER PALOCHKA*/
+ 0x4d0, /* U+0004d0: CYRILLIC CAPITAL LETTER A WITH BREVE*/
+ 0x4d0, /* U+0004d1: CYRILLIC SMALL LETTER A WITH BREVE*/
+ 0x4d2, /* U+0004d2: CYRILLIC CAPITAL LETTER A WITH DIAERESIS*/
+ 0x4d2, /* U+0004d3: CYRILLIC SMALL LETTER A WITH DIAERESIS*/
+ 0x4d4, /* U+0004d4: CYRILLIC CAPITAL LIGATURE A IE*/
+ 0x4d4, /* U+0004d5: CYRILLIC SMALL LIGATURE A IE*/
+ 0x4d6, /* U+0004d6: CYRILLIC CAPITAL LETTER IE WITH BREVE*/
+ 0x4d6, /* U+0004d7: CYRILLIC SMALL LETTER IE WITH BREVE*/
+ 0x4d8, /* U+0004d8: CYRILLIC CAPITAL LETTER SCHWA*/
+ 0x4d8, /* U+0004d9: CYRILLIC SMALL LETTER SCHWA*/
+ 0x4da, /* U+0004da: CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS*/
+ 0x4da, /* U+0004db: CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS*/
+ 0x4dc, /* U+0004dc: CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS*/
+ 0x4dc, /* U+0004dd: CYRILLIC SMALL LETTER ZHE WITH DIAERESIS*/
+ 0x4de, /* U+0004de: CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS*/
+ 0x4de, /* U+0004df: CYRILLIC SMALL LETTER ZE WITH DIAERESIS*/
+ 0x4e0, /* U+0004e0: CYRILLIC CAPITAL LETTER ABKHASIAN DZE*/
+ 0x4e0, /* U+0004e1: CYRILLIC SMALL LETTER ABKHASIAN DZE*/
+ 0x4e2, /* U+0004e2: CYRILLIC CAPITAL LETTER I WITH MACRON*/
+ 0x4e2, /* U+0004e3: CYRILLIC SMALL LETTER I WITH MACRON*/
+ 0x4e4, /* U+0004e4: CYRILLIC CAPITAL LETTER I WITH DIAERESIS*/
+ 0x4e4, /* U+0004e5: CYRILLIC SMALL LETTER I WITH DIAERESIS*/
+ 0x4e6, /* U+0004e6: CYRILLIC CAPITAL LETTER O WITH DIAERESIS*/
+ 0x4e6, /* U+0004e7: CYRILLIC SMALL LETTER O WITH DIAERESIS*/
+ 0x4e8, /* U+0004e8: CYRILLIC CAPITAL LETTER BARRED O*/
+ 0x4e8, /* U+0004e9: CYRILLIC SMALL LETTER BARRED O*/
+ 0x4ea, /* U+0004ea: CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS*/
+ 0x4ea, /* U+0004eb: CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS*/
+ 0x4ec, /* U+0004ec: CYRILLIC CAPITAL LETTER E WITH DIAERESIS*/
+ 0x4ec, /* U+0004ed: CYRILLIC SMALL LETTER E WITH DIAERESIS*/
+ 0x4ee, /* U+0004ee: CYRILLIC CAPITAL LETTER U WITH MACRON*/
+ 0x4ee, /* U+0004ef: CYRILLIC SMALL LETTER U WITH MACRON*/
+ 0x4f0, /* U+0004f0: CYRILLIC CAPITAL LETTER U WITH DIAERESIS*/
+ 0x4f0, /* U+0004f1: CYRILLIC SMALL LETTER U WITH DIAERESIS*/
+ 0x4f2, /* U+0004f2: CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE*/
+ 0x4f2, /* U+0004f3: CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE*/
+ 0x4f4, /* U+0004f4: CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS*/
+ 0x4f4, /* U+0004f5: CYRILLIC SMALL LETTER CHE WITH DIAERESIS*/
+ 0x4f6, /* U+0004f6: CYRILLIC CAPITAL LETTER GHE WITH DESCENDER*/
+ 0x4f6, /* U+0004f7: CYRILLIC SMALL LETTER GHE WITH DESCENDER*/
+ 0x4f8, /* U+0004f8: CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS*/
+ 0x4f8, /* U+0004f9: CYRILLIC SMALL LETTER YERU WITH DIAERESIS*/
+ 0x4fa, /* U+0004fa: CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK*/
+ 0x4fa, /* U+0004fb: CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK*/
+ 0x4fc, /* U+0004fc: CYRILLIC CAPITAL LETTER HA WITH HOOK*/
+ 0x4fc, /* U+0004fd: CYRILLIC SMALL LETTER HA WITH HOOK*/
+ 0x4fe, /* U+0004fe: CYRILLIC CAPITAL LETTER HA WITH STROKE*/
+ 0x4fe, /* U+0004ff: CYRILLIC SMALL LETTER HA WITH STROKE*/
+ 0x500, /* U+000500: CYRILLIC CAPITAL LETTER KOMI DE*/
+ 0x500, /* U+000501: CYRILLIC SMALL LETTER KOMI DE*/
+ 0x502, /* U+000502: CYRILLIC CAPITAL LETTER KOMI DJE*/
+ 0x502, /* U+000503: CYRILLIC SMALL LETTER KOMI DJE*/
+ 0x504, /* U+000504: CYRILLIC CAPITAL LETTER KOMI ZJE*/
+ 0x504, /* U+000505: CYRILLIC SMALL LETTER KOMI ZJE*/
+ 0x506, /* U+000506: CYRILLIC CAPITAL LETTER KOMI DZJE*/
+ 0x506, /* U+000507: CYRILLIC SMALL LETTER KOMI DZJE*/
+ 0x508, /* U+000508: CYRILLIC CAPITAL LETTER KOMI LJE*/
+ 0x508, /* U+000509: CYRILLIC SMALL LETTER KOMI LJE*/
+ 0x50a, /* U+00050a: CYRILLIC CAPITAL LETTER KOMI NJE*/
+ 0x50a, /* U+00050b: CYRILLIC SMALL LETTER KOMI NJE*/
+ 0x50c, /* U+00050c: CYRILLIC CAPITAL LETTER KOMI SJE*/
+ 0x50c, /* U+00050d: CYRILLIC SMALL LETTER KOMI SJE*/
+ 0x50e, /* U+00050e: CYRILLIC CAPITAL LETTER KOMI TJE*/
+ 0x50e, /* U+00050f: CYRILLIC SMALL LETTER KOMI TJE*/
+ 0x510, /* U+000510: CYRILLIC CAPITAL LETTER REVERSED ZE*/
+ 0x510, /* U+000511: CYRILLIC SMALL LETTER REVERSED ZE*/
+ 0x512, /* U+000512: CYRILLIC CAPITAL LETTER EL WITH HOOK*/
+ 0x512, /* U+000513: CYRILLIC SMALL LETTER EL WITH HOOK*/
+ 0x514, /* U+000514: CYRILLIC CAPITAL LETTER LHA*/
+ 0x514, /* U+000515: CYRILLIC SMALL LETTER LHA*/
+ 0x516, /* U+000516: CYRILLIC CAPITAL LETTER RHA*/
+ 0x516, /* U+000517: CYRILLIC SMALL LETTER RHA*/
+ 0x518, /* U+000518: CYRILLIC CAPITAL LETTER YAE*/
+ 0x518, /* U+000519: CYRILLIC SMALL LETTER YAE*/
+ 0x51a, /* U+00051a: CYRILLIC CAPITAL LETTER QA*/
+ 0x51a, /* U+00051b: CYRILLIC SMALL LETTER QA*/
+ 0x51c, /* U+00051c: CYRILLIC CAPITAL LETTER WE*/
+ 0x51c, /* U+00051d: CYRILLIC SMALL LETTER WE*/
+ 0x51e, /* U+00051e: CYRILLIC CAPITAL LETTER ALEUT KA*/
+ 0x51e, /* U+00051f: CYRILLIC SMALL LETTER ALEUT KA*/
+ 0x520, /* U+000520: CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK*/
+ 0x520, /* U+000521: CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK*/
+ 0x522, /* U+000522: CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK*/
+ 0x522, /* U+000523: CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK*/
+ 0x524, /* U+000524: CYRILLIC CAPITAL LETTER PE WITH DESCENDER*/
+ 0x524, /* U+000525: CYRILLIC SMALL LETTER PE WITH DESCENDER*/
+ 0x526, /* U+000526: CYRILLIC CAPITAL LETTER SHHA WITH DESCENDER*/
+ 0x526, /* U+000527: CYRILLIC SMALL LETTER SHHA WITH DESCENDER*/
+ 0x528, /* U+000528: */
+ 0x529, /* U+000529: */
+ 0x52a, /* U+00052a: */
+ 0x52b, /* U+00052b: */
+ 0x52c, /* U+00052c: */
+ 0x52d, /* U+00052d: */
+ 0x52e, /* U+00052e: */
+ 0x52f, /* U+00052f: */
+ 0x530, /* U+000530: */
+ 0x531, /* U+000531: ARMENIAN CAPITAL LETTER AYB*/
+ 0x532, /* U+000532: ARMENIAN CAPITAL LETTER BEN*/
+ 0x533, /* U+000533: ARMENIAN CAPITAL LETTER GIM*/
+ 0x534, /* U+000534: ARMENIAN CAPITAL LETTER DA*/
+ 0x535, /* U+000535: ARMENIAN CAPITAL LETTER ECH*/
+ 0x536, /* U+000536: ARMENIAN CAPITAL LETTER ZA*/
+ 0x537, /* U+000537: ARMENIAN CAPITAL LETTER EH*/
+ 0x538, /* U+000538: ARMENIAN CAPITAL LETTER ET*/
+ 0x539, /* U+000539: ARMENIAN CAPITAL LETTER TO*/
+ 0x53a, /* U+00053a: ARMENIAN CAPITAL LETTER ZHE*/
+ 0x53b, /* U+00053b: ARMENIAN CAPITAL LETTER INI*/
+ 0x53c, /* U+00053c: ARMENIAN CAPITAL LETTER LIWN*/
+ 0x53d, /* U+00053d: ARMENIAN CAPITAL LETTER XEH*/
+ 0x53e, /* U+00053e: ARMENIAN CAPITAL LETTER CA*/
+ 0x53f, /* U+00053f: ARMENIAN CAPITAL LETTER KEN*/
+ 0x540, /* U+000540: ARMENIAN CAPITAL LETTER HO*/
+ 0x541, /* U+000541: ARMENIAN CAPITAL LETTER JA*/
+ 0x542, /* U+000542: ARMENIAN CAPITAL LETTER GHAD*/
+ 0x543, /* U+000543: ARMENIAN CAPITAL LETTER CHEH*/
+ 0x544, /* U+000544: ARMENIAN CAPITAL LETTER MEN*/
+ 0x545, /* U+000545: ARMENIAN CAPITAL LETTER YI*/
+ 0x546, /* U+000546: ARMENIAN CAPITAL LETTER NOW*/
+ 0x547, /* U+000547: ARMENIAN CAPITAL LETTER SHA*/
+ 0x548, /* U+000548: ARMENIAN CAPITAL LETTER VO*/
+ 0x549, /* U+000549: ARMENIAN CAPITAL LETTER CHA*/
+ 0x54a, /* U+00054a: ARMENIAN CAPITAL LETTER PEH*/
+ 0x54b, /* U+00054b: ARMENIAN CAPITAL LETTER JHEH*/
+ 0x54c, /* U+00054c: ARMENIAN CAPITAL LETTER RA*/
+ 0x54d, /* U+00054d: ARMENIAN CAPITAL LETTER SEH*/
+ 0x54e, /* U+00054e: ARMENIAN CAPITAL LETTER VEW*/
+ 0x54f, /* U+00054f: ARMENIAN CAPITAL LETTER TIWN*/
+ 0x550, /* U+000550: ARMENIAN CAPITAL LETTER REH*/
+ 0x551, /* U+000551: ARMENIAN CAPITAL LETTER CO*/
+ 0x552, /* U+000552: ARMENIAN CAPITAL LETTER YIWN*/
+ 0x553, /* U+000553: ARMENIAN CAPITAL LETTER PIWR*/
+ 0x554, /* U+000554: ARMENIAN CAPITAL LETTER KEH*/
+ 0x555, /* U+000555: ARMENIAN CAPITAL LETTER OH*/
+ 0x556, /* U+000556: ARMENIAN CAPITAL LETTER FEH*/
+ 0x557, /* U+000557: */
+ 0x558, /* U+000558: */
+ 0x559, /* U+000559: ARMENIAN MODIFIER LETTER LEFT HALF RING*/
+ 0x55a, /* U+00055a: ARMENIAN APOSTROPHE*/
+ 0x55b, /* U+00055b: ARMENIAN EMPHASIS MARK*/
+ 0x55c, /* U+00055c: ARMENIAN EXCLAMATION MARK*/
+ 0x55d, /* U+00055d: ARMENIAN COMMA*/
+ 0x55e, /* U+00055e: ARMENIAN QUESTION MARK*/
+ 0x55f, /* U+00055f: ARMENIAN ABBREVIATION MARK*/
+ 0x560, /* U+000560: */
+ 0x531, /* U+000561: ARMENIAN SMALL LETTER AYB*/
+ 0x532, /* U+000562: ARMENIAN SMALL LETTER BEN*/
+ 0x533, /* U+000563: ARMENIAN SMALL LETTER GIM*/
+ 0x534, /* U+000564: ARMENIAN SMALL LETTER DA*/
+ 0x535, /* U+000565: ARMENIAN SMALL LETTER ECH*/
+ 0x536, /* U+000566: ARMENIAN SMALL LETTER ZA*/
+ 0x537, /* U+000567: ARMENIAN SMALL LETTER EH*/
+ 0x538, /* U+000568: ARMENIAN SMALL LETTER ET*/
+ 0x539, /* U+000569: ARMENIAN SMALL LETTER TO*/
+ 0x53a, /* U+00056a: ARMENIAN SMALL LETTER ZHE*/
+ 0x53b, /* U+00056b: ARMENIAN SMALL LETTER INI*/
+ 0x53c, /* U+00056c: ARMENIAN SMALL LETTER LIWN*/
+ 0x53d, /* U+00056d: ARMENIAN SMALL LETTER XEH*/
+ 0x53e, /* U+00056e: ARMENIAN SMALL LETTER CA*/
+ 0x53f, /* U+00056f: ARMENIAN SMALL LETTER KEN*/
+ 0x540, /* U+000570: ARMENIAN SMALL LETTER HO*/
+ 0x541, /* U+000571: ARMENIAN SMALL LETTER JA*/
+ 0x542, /* U+000572: ARMENIAN SMALL LETTER GHAD*/
+ 0x543, /* U+000573: ARMENIAN SMALL LETTER CHEH*/
+ 0x544, /* U+000574: ARMENIAN SMALL LETTER MEN*/
+ 0x545, /* U+000575: ARMENIAN SMALL LETTER YI*/
+ 0x546, /* U+000576: ARMENIAN SMALL LETTER NOW*/
+ 0x547, /* U+000577: ARMENIAN SMALL LETTER SHA*/
+ 0x548, /* U+000578: ARMENIAN SMALL LETTER VO*/
+ 0x549, /* U+000579: ARMENIAN SMALL LETTER CHA*/
+ 0x54a, /* U+00057a: ARMENIAN SMALL LETTER PEH*/
+ 0x54b, /* U+00057b: ARMENIAN SMALL LETTER JHEH*/
+ 0x54c, /* U+00057c: ARMENIAN SMALL LETTER RA*/
+ 0x54d, /* U+00057d: ARMENIAN SMALL LETTER SEH*/
+ 0x54e, /* U+00057e: ARMENIAN SMALL LETTER VEW*/
+ 0x54f, /* U+00057f: ARMENIAN SMALL LETTER TIWN*/
+ 0x550, /* U+000580: ARMENIAN SMALL LETTER REH*/
+ 0x551, /* U+000581: ARMENIAN SMALL LETTER CO*/
+ 0x552, /* U+000582: ARMENIAN SMALL LETTER YIWN*/
+ 0x553, /* U+000583: ARMENIAN SMALL LETTER PIWR*/
+ 0x554, /* U+000584: ARMENIAN SMALL LETTER KEH*/
+ 0x555, /* U+000585: ARMENIAN SMALL LETTER OH*/
+ 0x556, /* U+000586: ARMENIAN SMALL LETTER FEH*/
+};
+
+static const RTUNICP g_afRTUniUpper0x001d79[] =
+{
+ 0xa77d, /* U+001d79: LATIN SMALL LETTER INSULAR G*/
+ 0x1d7a, /* U+001d7a: LATIN SMALL LETTER TH WITH STRIKETHROUGH*/
+ 0x1d7b, /* U+001d7b: LATIN SMALL CAPITAL LETTER I WITH STROKE*/
+ 0x1d7c, /* U+001d7c: LATIN SMALL LETTER IOTA WITH STROKE*/
+ 0x2c63, /* U+001d7d: LATIN SMALL LETTER P WITH STROKE*/
+ 0x1d7e, /* U+001d7e: LATIN SMALL CAPITAL LETTER U WITH STROKE*/
+ 0x1d7f, /* U+001d7f: LATIN SMALL LETTER UPSILON WITH STROKE*/
+ 0x1d80, /* U+001d80: LATIN SMALL LETTER B WITH PALATAL HOOK*/
+ 0x1d81, /* U+001d81: LATIN SMALL LETTER D WITH PALATAL HOOK*/
+ 0x1d82, /* U+001d82: LATIN SMALL LETTER F WITH PALATAL HOOK*/
+ 0x1d83, /* U+001d83: LATIN SMALL LETTER G WITH PALATAL HOOK*/
+ 0x1d84, /* U+001d84: LATIN SMALL LETTER K WITH PALATAL HOOK*/
+ 0x1d85, /* U+001d85: LATIN SMALL LETTER L WITH PALATAL HOOK*/
+ 0x1d86, /* U+001d86: LATIN SMALL LETTER M WITH PALATAL HOOK*/
+ 0x1d87, /* U+001d87: LATIN SMALL LETTER N WITH PALATAL HOOK*/
+ 0x1d88, /* U+001d88: LATIN SMALL LETTER P WITH PALATAL HOOK*/
+ 0x1d89, /* U+001d89: LATIN SMALL LETTER R WITH PALATAL HOOK*/
+ 0x1d8a, /* U+001d8a: LATIN SMALL LETTER S WITH PALATAL HOOK*/
+ 0x1d8b, /* U+001d8b: LATIN SMALL LETTER ESH WITH PALATAL HOOK*/
+ 0x1d8c, /* U+001d8c: LATIN SMALL LETTER V WITH PALATAL HOOK*/
+ 0x1d8d, /* U+001d8d: LATIN SMALL LETTER X WITH PALATAL HOOK*/
+ 0x1d8e, /* U+001d8e: LATIN SMALL LETTER Z WITH PALATAL HOOK*/
+ 0x1d8f, /* U+001d8f: LATIN SMALL LETTER A WITH RETROFLEX HOOK*/
+ 0x1d90, /* U+001d90: LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK*/
+ 0x1d91, /* U+001d91: LATIN SMALL LETTER D WITH HOOK AND TAIL*/
+ 0x1d92, /* U+001d92: LATIN SMALL LETTER E WITH RETROFLEX HOOK*/
+ 0x1d93, /* U+001d93: LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK*/
+ 0x1d94, /* U+001d94: LATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOK*/
+ 0x1d95, /* U+001d95: LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK*/
+ 0x1d96, /* U+001d96: LATIN SMALL LETTER I WITH RETROFLEX HOOK*/
+ 0x1d97, /* U+001d97: LATIN SMALL LETTER OPEN O WITH RETROFLEX HOOK*/
+ 0x1d98, /* U+001d98: LATIN SMALL LETTER ESH WITH RETROFLEX HOOK*/
+ 0x1d99, /* U+001d99: LATIN SMALL LETTER U WITH RETROFLEX HOOK*/
+ 0x1d9a, /* U+001d9a: LATIN SMALL LETTER EZH WITH RETROFLEX HOOK*/
+ 0x1d9b, /* U+001d9b: MODIFIER LETTER SMALL TURNED ALPHA*/
+ 0x1d9c, /* U+001d9c: MODIFIER LETTER SMALL C*/
+ 0x1d9d, /* U+001d9d: MODIFIER LETTER SMALL C WITH CURL*/
+ 0x1d9e, /* U+001d9e: MODIFIER LETTER SMALL ETH*/
+ 0x1d9f, /* U+001d9f: MODIFIER LETTER SMALL REVERSED OPEN E*/
+ 0x1da0, /* U+001da0: MODIFIER LETTER SMALL F*/
+ 0x1da1, /* U+001da1: MODIFIER LETTER SMALL DOTLESS J WITH STROKE*/
+ 0x1da2, /* U+001da2: MODIFIER LETTER SMALL SCRIPT G*/
+ 0x1da3, /* U+001da3: MODIFIER LETTER SMALL TURNED H*/
+ 0x1da4, /* U+001da4: MODIFIER LETTER SMALL I WITH STROKE*/
+ 0x1da5, /* U+001da5: MODIFIER LETTER SMALL IOTA*/
+ 0x1da6, /* U+001da6: MODIFIER LETTER SMALL CAPITAL I*/
+ 0x1da7, /* U+001da7: MODIFIER LETTER SMALL CAPITAL I WITH STROKE*/
+ 0x1da8, /* U+001da8: MODIFIER LETTER SMALL J WITH CROSSED-TAIL*/
+ 0x1da9, /* U+001da9: MODIFIER LETTER SMALL L WITH RETROFLEX HOOK*/
+ 0x1daa, /* U+001daa: MODIFIER LETTER SMALL L WITH PALATAL HOOK*/
+ 0x1dab, /* U+001dab: MODIFIER LETTER SMALL CAPITAL L*/
+ 0x1dac, /* U+001dac: MODIFIER LETTER SMALL M WITH HOOK*/
+ 0x1dad, /* U+001dad: MODIFIER LETTER SMALL TURNED M WITH LONG LEG*/
+ 0x1dae, /* U+001dae: MODIFIER LETTER SMALL N WITH LEFT HOOK*/
+ 0x1daf, /* U+001daf: MODIFIER LETTER SMALL N WITH RETROFLEX HOOK*/
+ 0x1db0, /* U+001db0: MODIFIER LETTER SMALL CAPITAL N*/
+ 0x1db1, /* U+001db1: MODIFIER LETTER SMALL BARRED O*/
+ 0x1db2, /* U+001db2: MODIFIER LETTER SMALL PHI*/
+ 0x1db3, /* U+001db3: MODIFIER LETTER SMALL S WITH HOOK*/
+ 0x1db4, /* U+001db4: MODIFIER LETTER SMALL ESH*/
+ 0x1db5, /* U+001db5: MODIFIER LETTER SMALL T WITH PALATAL HOOK*/
+ 0x1db6, /* U+001db6: MODIFIER LETTER SMALL U BAR*/
+ 0x1db7, /* U+001db7: MODIFIER LETTER SMALL UPSILON*/
+ 0x1db8, /* U+001db8: MODIFIER LETTER SMALL CAPITAL U*/
+ 0x1db9, /* U+001db9: MODIFIER LETTER SMALL V WITH HOOK*/
+ 0x1dba, /* U+001dba: MODIFIER LETTER SMALL TURNED V*/
+ 0x1dbb, /* U+001dbb: MODIFIER LETTER SMALL Z*/
+ 0x1dbc, /* U+001dbc: MODIFIER LETTER SMALL Z WITH RETROFLEX HOOK*/
+ 0x1dbd, /* U+001dbd: MODIFIER LETTER SMALL Z WITH CURL*/
+ 0x1dbe, /* U+001dbe: MODIFIER LETTER SMALL EZH*/
+ 0x1dbf, /* U+001dbf: MODIFIER LETTER SMALL THETA*/
+ 0x1dc0, /* U+001dc0: COMBINING DOTTED GRAVE ACCENT*/
+ 0x1dc1, /* U+001dc1: COMBINING DOTTED ACUTE ACCENT*/
+ 0x1dc2, /* U+001dc2: COMBINING SNAKE BELOW*/
+ 0x1dc3, /* U+001dc3: COMBINING SUSPENSION MARK*/
+ 0x1dc4, /* U+001dc4: COMBINING MACRON-ACUTE*/
+ 0x1dc5, /* U+001dc5: COMBINING GRAVE-MACRON*/
+ 0x1dc6, /* U+001dc6: COMBINING MACRON-GRAVE*/
+ 0x1dc7, /* U+001dc7: COMBINING ACUTE-MACRON*/
+ 0x1dc8, /* U+001dc8: COMBINING GRAVE-ACUTE-GRAVE*/
+ 0x1dc9, /* U+001dc9: COMBINING ACUTE-GRAVE-ACUTE*/
+ 0x1dca, /* U+001dca: COMBINING LATIN SMALL LETTER R BELOW*/
+ 0x1dcb, /* U+001dcb: COMBINING BREVE-MACRON*/
+ 0x1dcc, /* U+001dcc: COMBINING MACRON-BREVE*/
+ 0x1dcd, /* U+001dcd: COMBINING DOUBLE CIRCUMFLEX ABOVE*/
+ 0x1dce, /* U+001dce: COMBINING OGONEK ABOVE*/
+ 0x1dcf, /* U+001dcf: COMBINING ZIGZAG BELOW*/
+ 0x1dd0, /* U+001dd0: COMBINING IS BELOW*/
+ 0x1dd1, /* U+001dd1: COMBINING UR ABOVE*/
+ 0x1dd2, /* U+001dd2: COMBINING US ABOVE*/
+ 0x1dd3, /* U+001dd3: COMBINING LATIN SMALL LETTER FLATTENED OPEN A ABOVE*/
+ 0x1dd4, /* U+001dd4: COMBINING LATIN SMALL LETTER AE*/
+ 0x1dd5, /* U+001dd5: COMBINING LATIN SMALL LETTER AO*/
+ 0x1dd6, /* U+001dd6: COMBINING LATIN SMALL LETTER AV*/
+ 0x1dd7, /* U+001dd7: COMBINING LATIN SMALL LETTER C CEDILLA*/
+ 0x1dd8, /* U+001dd8: COMBINING LATIN SMALL LETTER INSULAR D*/
+ 0x1dd9, /* U+001dd9: COMBINING LATIN SMALL LETTER ETH*/
+ 0x1dda, /* U+001dda: COMBINING LATIN SMALL LETTER G*/
+ 0x1ddb, /* U+001ddb: COMBINING LATIN LETTER SMALL CAPITAL G*/
+ 0x1ddc, /* U+001ddc: COMBINING LATIN SMALL LETTER K*/
+ 0x1ddd, /* U+001ddd: COMBINING LATIN SMALL LETTER L*/
+ 0x1dde, /* U+001dde: COMBINING LATIN LETTER SMALL CAPITAL L*/
+ 0x1ddf, /* U+001ddf: COMBINING LATIN LETTER SMALL CAPITAL M*/
+ 0x1de0, /* U+001de0: COMBINING LATIN SMALL LETTER N*/
+ 0x1de1, /* U+001de1: COMBINING LATIN LETTER SMALL CAPITAL N*/
+ 0x1de2, /* U+001de2: COMBINING LATIN LETTER SMALL CAPITAL R*/
+ 0x1de3, /* U+001de3: COMBINING LATIN SMALL LETTER R ROTUNDA*/
+ 0x1de4, /* U+001de4: COMBINING LATIN SMALL LETTER S*/
+ 0x1de5, /* U+001de5: COMBINING LATIN SMALL LETTER LONG S*/
+ 0x1de6, /* U+001de6: COMBINING LATIN SMALL LETTER Z*/
+ 0x1de7, /* U+001de7: */
+ 0x1de8, /* U+001de8: */
+ 0x1de9, /* U+001de9: */
+ 0x1dea, /* U+001dea: */
+ 0x1deb, /* U+001deb: */
+ 0x1dec, /* U+001dec: */
+ 0x1ded, /* U+001ded: */
+ 0x1dee, /* U+001dee: */
+ 0x1def, /* U+001def: */
+ 0x1df0, /* U+001df0: */
+ 0x1df1, /* U+001df1: */
+ 0x1df2, /* U+001df2: */
+ 0x1df3, /* U+001df3: */
+ 0x1df4, /* U+001df4: */
+ 0x1df5, /* U+001df5: */
+ 0x1df6, /* U+001df6: */
+ 0x1df7, /* U+001df7: */
+ 0x1df8, /* U+001df8: */
+ 0x1df9, /* U+001df9: */
+ 0x1dfa, /* U+001dfa: */
+ 0x1dfb, /* U+001dfb: */
+ 0x1dfc, /* U+001dfc: COMBINING DOUBLE INVERTED BREVE BELOW*/
+ 0x1dfd, /* U+001dfd: COMBINING ALMOST EQUAL TO BELOW*/
+ 0x1dfe, /* U+001dfe: COMBINING LEFT ARROWHEAD ABOVE*/
+ 0x1dff, /* U+001dff: COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW*/
+ 0x1e00, /* U+001e00: LATIN CAPITAL LETTER A WITH RING BELOW*/
+ 0x1e00, /* U+001e01: LATIN SMALL LETTER A WITH RING BELOW*/
+ 0x1e02, /* U+001e02: LATIN CAPITAL LETTER B WITH DOT ABOVE*/
+ 0x1e02, /* U+001e03: LATIN SMALL LETTER B WITH DOT ABOVE*/
+ 0x1e04, /* U+001e04: LATIN CAPITAL LETTER B WITH DOT BELOW*/
+ 0x1e04, /* U+001e05: LATIN SMALL LETTER B WITH DOT BELOW*/
+ 0x1e06, /* U+001e06: LATIN CAPITAL LETTER B WITH LINE BELOW*/
+ 0x1e06, /* U+001e07: LATIN SMALL LETTER B WITH LINE BELOW*/
+ 0x1e08, /* U+001e08: LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE*/
+ 0x1e08, /* U+001e09: LATIN SMALL LETTER C WITH CEDILLA AND ACUTE*/
+ 0x1e0a, /* U+001e0a: LATIN CAPITAL LETTER D WITH DOT ABOVE*/
+ 0x1e0a, /* U+001e0b: LATIN SMALL LETTER D WITH DOT ABOVE*/
+ 0x1e0c, /* U+001e0c: LATIN CAPITAL LETTER D WITH DOT BELOW*/
+ 0x1e0c, /* U+001e0d: LATIN SMALL LETTER D WITH DOT BELOW*/
+ 0x1e0e, /* U+001e0e: LATIN CAPITAL LETTER D WITH LINE BELOW*/
+ 0x1e0e, /* U+001e0f: LATIN SMALL LETTER D WITH LINE BELOW*/
+ 0x1e10, /* U+001e10: LATIN CAPITAL LETTER D WITH CEDILLA*/
+ 0x1e10, /* U+001e11: LATIN SMALL LETTER D WITH CEDILLA*/
+ 0x1e12, /* U+001e12: LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW*/
+ 0x1e12, /* U+001e13: LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW*/
+ 0x1e14, /* U+001e14: LATIN CAPITAL LETTER E WITH MACRON AND GRAVE*/
+ 0x1e14, /* U+001e15: LATIN SMALL LETTER E WITH MACRON AND GRAVE*/
+ 0x1e16, /* U+001e16: LATIN CAPITAL LETTER E WITH MACRON AND ACUTE*/
+ 0x1e16, /* U+001e17: LATIN SMALL LETTER E WITH MACRON AND ACUTE*/
+ 0x1e18, /* U+001e18: LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW*/
+ 0x1e18, /* U+001e19: LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW*/
+ 0x1e1a, /* U+001e1a: LATIN CAPITAL LETTER E WITH TILDE BELOW*/
+ 0x1e1a, /* U+001e1b: LATIN SMALL LETTER E WITH TILDE BELOW*/
+ 0x1e1c, /* U+001e1c: LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE*/
+ 0x1e1c, /* U+001e1d: LATIN SMALL LETTER E WITH CEDILLA AND BREVE*/
+ 0x1e1e, /* U+001e1e: LATIN CAPITAL LETTER F WITH DOT ABOVE*/
+ 0x1e1e, /* U+001e1f: LATIN SMALL LETTER F WITH DOT ABOVE*/
+ 0x1e20, /* U+001e20: LATIN CAPITAL LETTER G WITH MACRON*/
+ 0x1e20, /* U+001e21: LATIN SMALL LETTER G WITH MACRON*/
+ 0x1e22, /* U+001e22: LATIN CAPITAL LETTER H WITH DOT ABOVE*/
+ 0x1e22, /* U+001e23: LATIN SMALL LETTER H WITH DOT ABOVE*/
+ 0x1e24, /* U+001e24: LATIN CAPITAL LETTER H WITH DOT BELOW*/
+ 0x1e24, /* U+001e25: LATIN SMALL LETTER H WITH DOT BELOW*/
+ 0x1e26, /* U+001e26: LATIN CAPITAL LETTER H WITH DIAERESIS*/
+ 0x1e26, /* U+001e27: LATIN SMALL LETTER H WITH DIAERESIS*/
+ 0x1e28, /* U+001e28: LATIN CAPITAL LETTER H WITH CEDILLA*/
+ 0x1e28, /* U+001e29: LATIN SMALL LETTER H WITH CEDILLA*/
+ 0x1e2a, /* U+001e2a: LATIN CAPITAL LETTER H WITH BREVE BELOW*/
+ 0x1e2a, /* U+001e2b: LATIN SMALL LETTER H WITH BREVE BELOW*/
+ 0x1e2c, /* U+001e2c: LATIN CAPITAL LETTER I WITH TILDE BELOW*/
+ 0x1e2c, /* U+001e2d: LATIN SMALL LETTER I WITH TILDE BELOW*/
+ 0x1e2e, /* U+001e2e: LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE*/
+ 0x1e2e, /* U+001e2f: LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE*/
+ 0x1e30, /* U+001e30: LATIN CAPITAL LETTER K WITH ACUTE*/
+ 0x1e30, /* U+001e31: LATIN SMALL LETTER K WITH ACUTE*/
+ 0x1e32, /* U+001e32: LATIN CAPITAL LETTER K WITH DOT BELOW*/
+ 0x1e32, /* U+001e33: LATIN SMALL LETTER K WITH DOT BELOW*/
+ 0x1e34, /* U+001e34: LATIN CAPITAL LETTER K WITH LINE BELOW*/
+ 0x1e34, /* U+001e35: LATIN SMALL LETTER K WITH LINE BELOW*/
+ 0x1e36, /* U+001e36: LATIN CAPITAL LETTER L WITH DOT BELOW*/
+ 0x1e36, /* U+001e37: LATIN SMALL LETTER L WITH DOT BELOW*/
+ 0x1e38, /* U+001e38: LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON*/
+ 0x1e38, /* U+001e39: LATIN SMALL LETTER L WITH DOT BELOW AND MACRON*/
+ 0x1e3a, /* U+001e3a: LATIN CAPITAL LETTER L WITH LINE BELOW*/
+ 0x1e3a, /* U+001e3b: LATIN SMALL LETTER L WITH LINE BELOW*/
+ 0x1e3c, /* U+001e3c: LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW*/
+ 0x1e3c, /* U+001e3d: LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW*/
+ 0x1e3e, /* U+001e3e: LATIN CAPITAL LETTER M WITH ACUTE*/
+ 0x1e3e, /* U+001e3f: LATIN SMALL LETTER M WITH ACUTE*/
+ 0x1e40, /* U+001e40: LATIN CAPITAL LETTER M WITH DOT ABOVE*/
+ 0x1e40, /* U+001e41: LATIN SMALL LETTER M WITH DOT ABOVE*/
+ 0x1e42, /* U+001e42: LATIN CAPITAL LETTER M WITH DOT BELOW*/
+ 0x1e42, /* U+001e43: LATIN SMALL LETTER M WITH DOT BELOW*/
+ 0x1e44, /* U+001e44: LATIN CAPITAL LETTER N WITH DOT ABOVE*/
+ 0x1e44, /* U+001e45: LATIN SMALL LETTER N WITH DOT ABOVE*/
+ 0x1e46, /* U+001e46: LATIN CAPITAL LETTER N WITH DOT BELOW*/
+ 0x1e46, /* U+001e47: LATIN SMALL LETTER N WITH DOT BELOW*/
+ 0x1e48, /* U+001e48: LATIN CAPITAL LETTER N WITH LINE BELOW*/
+ 0x1e48, /* U+001e49: LATIN SMALL LETTER N WITH LINE BELOW*/
+ 0x1e4a, /* U+001e4a: LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW*/
+ 0x1e4a, /* U+001e4b: LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW*/
+ 0x1e4c, /* U+001e4c: LATIN CAPITAL LETTER O WITH TILDE AND ACUTE*/
+ 0x1e4c, /* U+001e4d: LATIN SMALL LETTER O WITH TILDE AND ACUTE*/
+ 0x1e4e, /* U+001e4e: LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS*/
+ 0x1e4e, /* U+001e4f: LATIN SMALL LETTER O WITH TILDE AND DIAERESIS*/
+ 0x1e50, /* U+001e50: LATIN CAPITAL LETTER O WITH MACRON AND GRAVE*/
+ 0x1e50, /* U+001e51: LATIN SMALL LETTER O WITH MACRON AND GRAVE*/
+ 0x1e52, /* U+001e52: LATIN CAPITAL LETTER O WITH MACRON AND ACUTE*/
+ 0x1e52, /* U+001e53: LATIN SMALL LETTER O WITH MACRON AND ACUTE*/
+ 0x1e54, /* U+001e54: LATIN CAPITAL LETTER P WITH ACUTE*/
+ 0x1e54, /* U+001e55: LATIN SMALL LETTER P WITH ACUTE*/
+ 0x1e56, /* U+001e56: LATIN CAPITAL LETTER P WITH DOT ABOVE*/
+ 0x1e56, /* U+001e57: LATIN SMALL LETTER P WITH DOT ABOVE*/
+ 0x1e58, /* U+001e58: LATIN CAPITAL LETTER R WITH DOT ABOVE*/
+ 0x1e58, /* U+001e59: LATIN SMALL LETTER R WITH DOT ABOVE*/
+ 0x1e5a, /* U+001e5a: LATIN CAPITAL LETTER R WITH DOT BELOW*/
+ 0x1e5a, /* U+001e5b: LATIN SMALL LETTER R WITH DOT BELOW*/
+ 0x1e5c, /* U+001e5c: LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON*/
+ 0x1e5c, /* U+001e5d: LATIN SMALL LETTER R WITH DOT BELOW AND MACRON*/
+ 0x1e5e, /* U+001e5e: LATIN CAPITAL LETTER R WITH LINE BELOW*/
+ 0x1e5e, /* U+001e5f: LATIN SMALL LETTER R WITH LINE BELOW*/
+ 0x1e60, /* U+001e60: LATIN CAPITAL LETTER S WITH DOT ABOVE*/
+ 0x1e60, /* U+001e61: LATIN SMALL LETTER S WITH DOT ABOVE*/
+ 0x1e62, /* U+001e62: LATIN CAPITAL LETTER S WITH DOT BELOW*/
+ 0x1e62, /* U+001e63: LATIN SMALL LETTER S WITH DOT BELOW*/
+ 0x1e64, /* U+001e64: LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE*/
+ 0x1e64, /* U+001e65: LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE*/
+ 0x1e66, /* U+001e66: LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE*/
+ 0x1e66, /* U+001e67: LATIN SMALL LETTER S WITH CARON AND DOT ABOVE*/
+ 0x1e68, /* U+001e68: LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE*/
+ 0x1e68, /* U+001e69: LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE*/
+ 0x1e6a, /* U+001e6a: LATIN CAPITAL LETTER T WITH DOT ABOVE*/
+ 0x1e6a, /* U+001e6b: LATIN SMALL LETTER T WITH DOT ABOVE*/
+ 0x1e6c, /* U+001e6c: LATIN CAPITAL LETTER T WITH DOT BELOW*/
+ 0x1e6c, /* U+001e6d: LATIN SMALL LETTER T WITH DOT BELOW*/
+ 0x1e6e, /* U+001e6e: LATIN CAPITAL LETTER T WITH LINE BELOW*/
+ 0x1e6e, /* U+001e6f: LATIN SMALL LETTER T WITH LINE BELOW*/
+ 0x1e70, /* U+001e70: LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW*/
+ 0x1e70, /* U+001e71: LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW*/
+ 0x1e72, /* U+001e72: LATIN CAPITAL LETTER U WITH DIAERESIS BELOW*/
+ 0x1e72, /* U+001e73: LATIN SMALL LETTER U WITH DIAERESIS BELOW*/
+ 0x1e74, /* U+001e74: LATIN CAPITAL LETTER U WITH TILDE BELOW*/
+ 0x1e74, /* U+001e75: LATIN SMALL LETTER U WITH TILDE BELOW*/
+ 0x1e76, /* U+001e76: LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW*/
+ 0x1e76, /* U+001e77: LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW*/
+ 0x1e78, /* U+001e78: LATIN CAPITAL LETTER U WITH TILDE AND ACUTE*/
+ 0x1e78, /* U+001e79: LATIN SMALL LETTER U WITH TILDE AND ACUTE*/
+ 0x1e7a, /* U+001e7a: LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS*/
+ 0x1e7a, /* U+001e7b: LATIN SMALL LETTER U WITH MACRON AND DIAERESIS*/
+ 0x1e7c, /* U+001e7c: LATIN CAPITAL LETTER V WITH TILDE*/
+ 0x1e7c, /* U+001e7d: LATIN SMALL LETTER V WITH TILDE*/
+ 0x1e7e, /* U+001e7e: LATIN CAPITAL LETTER V WITH DOT BELOW*/
+ 0x1e7e, /* U+001e7f: LATIN SMALL LETTER V WITH DOT BELOW*/
+ 0x1e80, /* U+001e80: LATIN CAPITAL LETTER W WITH GRAVE*/
+ 0x1e80, /* U+001e81: LATIN SMALL LETTER W WITH GRAVE*/
+ 0x1e82, /* U+001e82: LATIN CAPITAL LETTER W WITH ACUTE*/
+ 0x1e82, /* U+001e83: LATIN SMALL LETTER W WITH ACUTE*/
+ 0x1e84, /* U+001e84: LATIN CAPITAL LETTER W WITH DIAERESIS*/
+ 0x1e84, /* U+001e85: LATIN SMALL LETTER W WITH DIAERESIS*/
+ 0x1e86, /* U+001e86: LATIN CAPITAL LETTER W WITH DOT ABOVE*/
+ 0x1e86, /* U+001e87: LATIN SMALL LETTER W WITH DOT ABOVE*/
+ 0x1e88, /* U+001e88: LATIN CAPITAL LETTER W WITH DOT BELOW*/
+ 0x1e88, /* U+001e89: LATIN SMALL LETTER W WITH DOT BELOW*/
+ 0x1e8a, /* U+001e8a: LATIN CAPITAL LETTER X WITH DOT ABOVE*/
+ 0x1e8a, /* U+001e8b: LATIN SMALL LETTER X WITH DOT ABOVE*/
+ 0x1e8c, /* U+001e8c: LATIN CAPITAL LETTER X WITH DIAERESIS*/
+ 0x1e8c, /* U+001e8d: LATIN SMALL LETTER X WITH DIAERESIS*/
+ 0x1e8e, /* U+001e8e: LATIN CAPITAL LETTER Y WITH DOT ABOVE*/
+ 0x1e8e, /* U+001e8f: LATIN SMALL LETTER Y WITH DOT ABOVE*/
+ 0x1e90, /* U+001e90: LATIN CAPITAL LETTER Z WITH CIRCUMFLEX*/
+ 0x1e90, /* U+001e91: LATIN SMALL LETTER Z WITH CIRCUMFLEX*/
+ 0x1e92, /* U+001e92: LATIN CAPITAL LETTER Z WITH DOT BELOW*/
+ 0x1e92, /* U+001e93: LATIN SMALL LETTER Z WITH DOT BELOW*/
+ 0x1e94, /* U+001e94: LATIN CAPITAL LETTER Z WITH LINE BELOW*/
+ 0x1e94, /* U+001e95: LATIN SMALL LETTER Z WITH LINE BELOW*/
+ 0x1e96, /* U+001e96: LATIN SMALL LETTER H WITH LINE BELOW*/
+ 0x1e97, /* U+001e97: LATIN SMALL LETTER T WITH DIAERESIS*/
+ 0x1e98, /* U+001e98: LATIN SMALL LETTER W WITH RING ABOVE*/
+ 0x1e99, /* U+001e99: LATIN SMALL LETTER Y WITH RING ABOVE*/
+ 0x1e9a, /* U+001e9a: LATIN SMALL LETTER A WITH RIGHT HALF RING*/
+ 0x1e60, /* U+001e9b: LATIN SMALL LETTER LONG S WITH DOT ABOVE*/
+ 0x1e9c, /* U+001e9c: LATIN SMALL LETTER LONG S WITH DIAGONAL STROKE*/
+ 0x1e9d, /* U+001e9d: LATIN SMALL LETTER LONG S WITH HIGH STROKE*/
+ 0x1e9e, /* U+001e9e: LATIN CAPITAL LETTER SHARP S*/
+ 0x1e9f, /* U+001e9f: LATIN SMALL LETTER DELTA*/
+ 0x1ea0, /* U+001ea0: LATIN CAPITAL LETTER A WITH DOT BELOW*/
+ 0x1ea0, /* U+001ea1: LATIN SMALL LETTER A WITH DOT BELOW*/
+ 0x1ea2, /* U+001ea2: LATIN CAPITAL LETTER A WITH HOOK ABOVE*/
+ 0x1ea2, /* U+001ea3: LATIN SMALL LETTER A WITH HOOK ABOVE*/
+ 0x1ea4, /* U+001ea4: LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE*/
+ 0x1ea4, /* U+001ea5: LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE*/
+ 0x1ea6, /* U+001ea6: LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE*/
+ 0x1ea6, /* U+001ea7: LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE*/
+ 0x1ea8, /* U+001ea8: LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE*/
+ 0x1ea8, /* U+001ea9: LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE*/
+ 0x1eaa, /* U+001eaa: LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE*/
+ 0x1eaa, /* U+001eab: LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE*/
+ 0x1eac, /* U+001eac: LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW*/
+ 0x1eac, /* U+001ead: LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW*/
+ 0x1eae, /* U+001eae: LATIN CAPITAL LETTER A WITH BREVE AND ACUTE*/
+ 0x1eae, /* U+001eaf: LATIN SMALL LETTER A WITH BREVE AND ACUTE*/
+ 0x1eb0, /* U+001eb0: LATIN CAPITAL LETTER A WITH BREVE AND GRAVE*/
+ 0x1eb0, /* U+001eb1: LATIN SMALL LETTER A WITH BREVE AND GRAVE*/
+ 0x1eb2, /* U+001eb2: LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE*/
+ 0x1eb2, /* U+001eb3: LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE*/
+ 0x1eb4, /* U+001eb4: LATIN CAPITAL LETTER A WITH BREVE AND TILDE*/
+ 0x1eb4, /* U+001eb5: LATIN SMALL LETTER A WITH BREVE AND TILDE*/
+ 0x1eb6, /* U+001eb6: LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW*/
+ 0x1eb6, /* U+001eb7: LATIN SMALL LETTER A WITH BREVE AND DOT BELOW*/
+ 0x1eb8, /* U+001eb8: LATIN CAPITAL LETTER E WITH DOT BELOW*/
+ 0x1eb8, /* U+001eb9: LATIN SMALL LETTER E WITH DOT BELOW*/
+ 0x1eba, /* U+001eba: LATIN CAPITAL LETTER E WITH HOOK ABOVE*/
+ 0x1eba, /* U+001ebb: LATIN SMALL LETTER E WITH HOOK ABOVE*/
+ 0x1ebc, /* U+001ebc: LATIN CAPITAL LETTER E WITH TILDE*/
+ 0x1ebc, /* U+001ebd: LATIN SMALL LETTER E WITH TILDE*/
+ 0x1ebe, /* U+001ebe: LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE*/
+ 0x1ebe, /* U+001ebf: LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE*/
+ 0x1ec0, /* U+001ec0: LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE*/
+ 0x1ec0, /* U+001ec1: LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE*/
+ 0x1ec2, /* U+001ec2: LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE*/
+ 0x1ec2, /* U+001ec3: LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE*/
+ 0x1ec4, /* U+001ec4: LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE*/
+ 0x1ec4, /* U+001ec5: LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE*/
+ 0x1ec6, /* U+001ec6: LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW*/
+ 0x1ec6, /* U+001ec7: LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW*/
+ 0x1ec8, /* U+001ec8: LATIN CAPITAL LETTER I WITH HOOK ABOVE*/
+ 0x1ec8, /* U+001ec9: LATIN SMALL LETTER I WITH HOOK ABOVE*/
+ 0x1eca, /* U+001eca: LATIN CAPITAL LETTER I WITH DOT BELOW*/
+ 0x1eca, /* U+001ecb: LATIN SMALL LETTER I WITH DOT BELOW*/
+ 0x1ecc, /* U+001ecc: LATIN CAPITAL LETTER O WITH DOT BELOW*/
+ 0x1ecc, /* U+001ecd: LATIN SMALL LETTER O WITH DOT BELOW*/
+ 0x1ece, /* U+001ece: LATIN CAPITAL LETTER O WITH HOOK ABOVE*/
+ 0x1ece, /* U+001ecf: LATIN SMALL LETTER O WITH HOOK ABOVE*/
+ 0x1ed0, /* U+001ed0: LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE*/
+ 0x1ed0, /* U+001ed1: LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE*/
+ 0x1ed2, /* U+001ed2: LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE*/
+ 0x1ed2, /* U+001ed3: LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE*/
+ 0x1ed4, /* U+001ed4: LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE*/
+ 0x1ed4, /* U+001ed5: LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE*/
+ 0x1ed6, /* U+001ed6: LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE*/
+ 0x1ed6, /* U+001ed7: LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE*/
+ 0x1ed8, /* U+001ed8: LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW*/
+ 0x1ed8, /* U+001ed9: LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW*/
+ 0x1eda, /* U+001eda: LATIN CAPITAL LETTER O WITH HORN AND ACUTE*/
+ 0x1eda, /* U+001edb: LATIN SMALL LETTER O WITH HORN AND ACUTE*/
+ 0x1edc, /* U+001edc: LATIN CAPITAL LETTER O WITH HORN AND GRAVE*/
+ 0x1edc, /* U+001edd: LATIN SMALL LETTER O WITH HORN AND GRAVE*/
+ 0x1ede, /* U+001ede: LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE*/
+ 0x1ede, /* U+001edf: LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE*/
+ 0x1ee0, /* U+001ee0: LATIN CAPITAL LETTER O WITH HORN AND TILDE*/
+ 0x1ee0, /* U+001ee1: LATIN SMALL LETTER O WITH HORN AND TILDE*/
+ 0x1ee2, /* U+001ee2: LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW*/
+ 0x1ee2, /* U+001ee3: LATIN SMALL LETTER O WITH HORN AND DOT BELOW*/
+ 0x1ee4, /* U+001ee4: LATIN CAPITAL LETTER U WITH DOT BELOW*/
+ 0x1ee4, /* U+001ee5: LATIN SMALL LETTER U WITH DOT BELOW*/
+ 0x1ee6, /* U+001ee6: LATIN CAPITAL LETTER U WITH HOOK ABOVE*/
+ 0x1ee6, /* U+001ee7: LATIN SMALL LETTER U WITH HOOK ABOVE*/
+ 0x1ee8, /* U+001ee8: LATIN CAPITAL LETTER U WITH HORN AND ACUTE*/
+ 0x1ee8, /* U+001ee9: LATIN SMALL LETTER U WITH HORN AND ACUTE*/
+ 0x1eea, /* U+001eea: LATIN CAPITAL LETTER U WITH HORN AND GRAVE*/
+ 0x1eea, /* U+001eeb: LATIN SMALL LETTER U WITH HORN AND GRAVE*/
+ 0x1eec, /* U+001eec: LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE*/
+ 0x1eec, /* U+001eed: LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE*/
+ 0x1eee, /* U+001eee: LATIN CAPITAL LETTER U WITH HORN AND TILDE*/
+ 0x1eee, /* U+001eef: LATIN SMALL LETTER U WITH HORN AND TILDE*/
+ 0x1ef0, /* U+001ef0: LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW*/
+ 0x1ef0, /* U+001ef1: LATIN SMALL LETTER U WITH HORN AND DOT BELOW*/
+ 0x1ef2, /* U+001ef2: LATIN CAPITAL LETTER Y WITH GRAVE*/
+ 0x1ef2, /* U+001ef3: LATIN SMALL LETTER Y WITH GRAVE*/
+ 0x1ef4, /* U+001ef4: LATIN CAPITAL LETTER Y WITH DOT BELOW*/
+ 0x1ef4, /* U+001ef5: LATIN SMALL LETTER Y WITH DOT BELOW*/
+ 0x1ef6, /* U+001ef6: LATIN CAPITAL LETTER Y WITH HOOK ABOVE*/
+ 0x1ef6, /* U+001ef7: LATIN SMALL LETTER Y WITH HOOK ABOVE*/
+ 0x1ef8, /* U+001ef8: LATIN CAPITAL LETTER Y WITH TILDE*/
+ 0x1ef8, /* U+001ef9: LATIN SMALL LETTER Y WITH TILDE*/
+ 0x1efa, /* U+001efa: LATIN CAPITAL LETTER MIDDLE-WELSH LL*/
+ 0x1efa, /* U+001efb: LATIN SMALL LETTER MIDDLE-WELSH LL*/
+ 0x1efc, /* U+001efc: LATIN CAPITAL LETTER MIDDLE-WELSH V*/
+ 0x1efc, /* U+001efd: LATIN SMALL LETTER MIDDLE-WELSH V*/
+ 0x1efe, /* U+001efe: LATIN CAPITAL LETTER Y WITH LOOP*/
+ 0x1efe, /* U+001eff: LATIN SMALL LETTER Y WITH LOOP*/
+ 0x1f08, /* U+001f00: GREEK SMALL LETTER ALPHA WITH PSILI*/
+ 0x1f09, /* U+001f01: GREEK SMALL LETTER ALPHA WITH DASIA*/
+ 0x1f0a, /* U+001f02: GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA*/
+ 0x1f0b, /* U+001f03: GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA*/
+ 0x1f0c, /* U+001f04: GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA*/
+ 0x1f0d, /* U+001f05: GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA*/
+ 0x1f0e, /* U+001f06: GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI*/
+ 0x1f0f, /* U+001f07: GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI*/
+ 0x1f08, /* U+001f08: GREEK CAPITAL LETTER ALPHA WITH PSILI*/
+ 0x1f09, /* U+001f09: GREEK CAPITAL LETTER ALPHA WITH DASIA*/
+ 0x1f0a, /* U+001f0a: GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA*/
+ 0x1f0b, /* U+001f0b: GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA*/
+ 0x1f0c, /* U+001f0c: GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA*/
+ 0x1f0d, /* U+001f0d: GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA*/
+ 0x1f0e, /* U+001f0e: GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI*/
+ 0x1f0f, /* U+001f0f: GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI*/
+ 0x1f18, /* U+001f10: GREEK SMALL LETTER EPSILON WITH PSILI*/
+ 0x1f19, /* U+001f11: GREEK SMALL LETTER EPSILON WITH DASIA*/
+ 0x1f1a, /* U+001f12: GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA*/
+ 0x1f1b, /* U+001f13: GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA*/
+ 0x1f1c, /* U+001f14: GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA*/
+ 0x1f1d, /* U+001f15: GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA*/
+ 0x1f16, /* U+001f16: */
+ 0x1f17, /* U+001f17: */
+ 0x1f18, /* U+001f18: GREEK CAPITAL LETTER EPSILON WITH PSILI*/
+ 0x1f19, /* U+001f19: GREEK CAPITAL LETTER EPSILON WITH DASIA*/
+ 0x1f1a, /* U+001f1a: GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA*/
+ 0x1f1b, /* U+001f1b: GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA*/
+ 0x1f1c, /* U+001f1c: GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA*/
+ 0x1f1d, /* U+001f1d: GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA*/
+ 0x1f1e, /* U+001f1e: */
+ 0x1f1f, /* U+001f1f: */
+ 0x1f28, /* U+001f20: GREEK SMALL LETTER ETA WITH PSILI*/
+ 0x1f29, /* U+001f21: GREEK SMALL LETTER ETA WITH DASIA*/
+ 0x1f2a, /* U+001f22: GREEK SMALL LETTER ETA WITH PSILI AND VARIA*/
+ 0x1f2b, /* U+001f23: GREEK SMALL LETTER ETA WITH DASIA AND VARIA*/
+ 0x1f2c, /* U+001f24: GREEK SMALL LETTER ETA WITH PSILI AND OXIA*/
+ 0x1f2d, /* U+001f25: GREEK SMALL LETTER ETA WITH DASIA AND OXIA*/
+ 0x1f2e, /* U+001f26: GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI*/
+ 0x1f2f, /* U+001f27: GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI*/
+ 0x1f28, /* U+001f28: GREEK CAPITAL LETTER ETA WITH PSILI*/
+ 0x1f29, /* U+001f29: GREEK CAPITAL LETTER ETA WITH DASIA*/
+ 0x1f2a, /* U+001f2a: GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA*/
+ 0x1f2b, /* U+001f2b: GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA*/
+ 0x1f2c, /* U+001f2c: GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA*/
+ 0x1f2d, /* U+001f2d: GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA*/
+ 0x1f2e, /* U+001f2e: GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI*/
+ 0x1f2f, /* U+001f2f: GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI*/
+ 0x1f38, /* U+001f30: GREEK SMALL LETTER IOTA WITH PSILI*/
+ 0x1f39, /* U+001f31: GREEK SMALL LETTER IOTA WITH DASIA*/
+ 0x1f3a, /* U+001f32: GREEK SMALL LETTER IOTA WITH PSILI AND VARIA*/
+ 0x1f3b, /* U+001f33: GREEK SMALL LETTER IOTA WITH DASIA AND VARIA*/
+ 0x1f3c, /* U+001f34: GREEK SMALL LETTER IOTA WITH PSILI AND OXIA*/
+ 0x1f3d, /* U+001f35: GREEK SMALL LETTER IOTA WITH DASIA AND OXIA*/
+ 0x1f3e, /* U+001f36: GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI*/
+ 0x1f3f, /* U+001f37: GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI*/
+ 0x1f38, /* U+001f38: GREEK CAPITAL LETTER IOTA WITH PSILI*/
+ 0x1f39, /* U+001f39: GREEK CAPITAL LETTER IOTA WITH DASIA*/
+ 0x1f3a, /* U+001f3a: GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA*/
+ 0x1f3b, /* U+001f3b: GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA*/
+ 0x1f3c, /* U+001f3c: GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA*/
+ 0x1f3d, /* U+001f3d: GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA*/
+ 0x1f3e, /* U+001f3e: GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI*/
+ 0x1f3f, /* U+001f3f: GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI*/
+ 0x1f48, /* U+001f40: GREEK SMALL LETTER OMICRON WITH PSILI*/
+ 0x1f49, /* U+001f41: GREEK SMALL LETTER OMICRON WITH DASIA*/
+ 0x1f4a, /* U+001f42: GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA*/
+ 0x1f4b, /* U+001f43: GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA*/
+ 0x1f4c, /* U+001f44: GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA*/
+ 0x1f4d, /* U+001f45: GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA*/
+ 0x1f46, /* U+001f46: */
+ 0x1f47, /* U+001f47: */
+ 0x1f48, /* U+001f48: GREEK CAPITAL LETTER OMICRON WITH PSILI*/
+ 0x1f49, /* U+001f49: GREEK CAPITAL LETTER OMICRON WITH DASIA*/
+ 0x1f4a, /* U+001f4a: GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA*/
+ 0x1f4b, /* U+001f4b: GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA*/
+ 0x1f4c, /* U+001f4c: GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA*/
+ 0x1f4d, /* U+001f4d: GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA*/
+ 0x1f4e, /* U+001f4e: */
+ 0x1f4f, /* U+001f4f: */
+ 0x1f50, /* U+001f50: GREEK SMALL LETTER UPSILON WITH PSILI*/
+ 0x1f59, /* U+001f51: GREEK SMALL LETTER UPSILON WITH DASIA*/
+ 0x1f52, /* U+001f52: GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA*/
+ 0x1f5b, /* U+001f53: GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA*/
+ 0x1f54, /* U+001f54: GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA*/
+ 0x1f5d, /* U+001f55: GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA*/
+ 0x1f56, /* U+001f56: GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI*/
+ 0x1f5f, /* U+001f57: GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI*/
+ 0x1f58, /* U+001f58: */
+ 0x1f59, /* U+001f59: GREEK CAPITAL LETTER UPSILON WITH DASIA*/
+ 0x1f5a, /* U+001f5a: */
+ 0x1f5b, /* U+001f5b: GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA*/
+ 0x1f5c, /* U+001f5c: */
+ 0x1f5d, /* U+001f5d: GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA*/
+ 0x1f5e, /* U+001f5e: */
+ 0x1f5f, /* U+001f5f: GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI*/
+ 0x1f68, /* U+001f60: GREEK SMALL LETTER OMEGA WITH PSILI*/
+ 0x1f69, /* U+001f61: GREEK SMALL LETTER OMEGA WITH DASIA*/
+ 0x1f6a, /* U+001f62: GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA*/
+ 0x1f6b, /* U+001f63: GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA*/
+ 0x1f6c, /* U+001f64: GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA*/
+ 0x1f6d, /* U+001f65: GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA*/
+ 0x1f6e, /* U+001f66: GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI*/
+ 0x1f6f, /* U+001f67: GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI*/
+ 0x1f68, /* U+001f68: GREEK CAPITAL LETTER OMEGA WITH PSILI*/
+ 0x1f69, /* U+001f69: GREEK CAPITAL LETTER OMEGA WITH DASIA*/
+ 0x1f6a, /* U+001f6a: GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA*/
+ 0x1f6b, /* U+001f6b: GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA*/
+ 0x1f6c, /* U+001f6c: GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA*/
+ 0x1f6d, /* U+001f6d: GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA*/
+ 0x1f6e, /* U+001f6e: GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI*/
+ 0x1f6f, /* U+001f6f: GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI*/
+ 0x1fba, /* U+001f70: GREEK SMALL LETTER ALPHA WITH VARIA*/
+ 0x1fbb, /* U+001f71: GREEK SMALL LETTER ALPHA WITH OXIA*/
+ 0x1fc8, /* U+001f72: GREEK SMALL LETTER EPSILON WITH VARIA*/
+ 0x1fc9, /* U+001f73: GREEK SMALL LETTER EPSILON WITH OXIA*/
+ 0x1fca, /* U+001f74: GREEK SMALL LETTER ETA WITH VARIA*/
+ 0x1fcb, /* U+001f75: GREEK SMALL LETTER ETA WITH OXIA*/
+ 0x1fda, /* U+001f76: GREEK SMALL LETTER IOTA WITH VARIA*/
+ 0x1fdb, /* U+001f77: GREEK SMALL LETTER IOTA WITH OXIA*/
+ 0x1ff8, /* U+001f78: GREEK SMALL LETTER OMICRON WITH VARIA*/
+ 0x1ff9, /* U+001f79: GREEK SMALL LETTER OMICRON WITH OXIA*/
+ 0x1fea, /* U+001f7a: GREEK SMALL LETTER UPSILON WITH VARIA*/
+ 0x1feb, /* U+001f7b: GREEK SMALL LETTER UPSILON WITH OXIA*/
+ 0x1ffa, /* U+001f7c: GREEK SMALL LETTER OMEGA WITH VARIA*/
+ 0x1ffb, /* U+001f7d: GREEK SMALL LETTER OMEGA WITH OXIA*/
+ 0x1f7e, /* U+001f7e: */
+ 0x1f7f, /* U+001f7f: */
+ 0x1f88, /* U+001f80: GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI*/
+ 0x1f89, /* U+001f81: GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI*/
+ 0x1f8a, /* U+001f82: GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI*/
+ 0x1f8b, /* U+001f83: GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI*/
+ 0x1f8c, /* U+001f84: GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI*/
+ 0x1f8d, /* U+001f85: GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI*/
+ 0x1f8e, /* U+001f86: GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI*/
+ 0x1f8f, /* U+001f87: GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI*/
+ 0x1f88, /* U+001f88: GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI*/
+ 0x1f89, /* U+001f89: GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI*/
+ 0x1f8a, /* U+001f8a: GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI*/
+ 0x1f8b, /* U+001f8b: GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI*/
+ 0x1f8c, /* U+001f8c: GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI*/
+ 0x1f8d, /* U+001f8d: GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI*/
+ 0x1f8e, /* U+001f8e: GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI*/
+ 0x1f8f, /* U+001f8f: GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI*/
+ 0x1f98, /* U+001f90: GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI*/
+ 0x1f99, /* U+001f91: GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI*/
+ 0x1f9a, /* U+001f92: GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI*/
+ 0x1f9b, /* U+001f93: GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI*/
+ 0x1f9c, /* U+001f94: GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI*/
+ 0x1f9d, /* U+001f95: GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI*/
+ 0x1f9e, /* U+001f96: GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI*/
+ 0x1f9f, /* U+001f97: GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI*/
+ 0x1f98, /* U+001f98: GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI*/
+ 0x1f99, /* U+001f99: GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI*/
+ 0x1f9a, /* U+001f9a: GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI*/
+ 0x1f9b, /* U+001f9b: GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI*/
+ 0x1f9c, /* U+001f9c: GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI*/
+ 0x1f9d, /* U+001f9d: GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI*/
+ 0x1f9e, /* U+001f9e: GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI*/
+ 0x1f9f, /* U+001f9f: GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI*/
+ 0x1fa8, /* U+001fa0: GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI*/
+ 0x1fa9, /* U+001fa1: GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI*/
+ 0x1faa, /* U+001fa2: GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI*/
+ 0x1fab, /* U+001fa3: GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI*/
+ 0x1fac, /* U+001fa4: GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI*/
+ 0x1fad, /* U+001fa5: GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI*/
+ 0x1fae, /* U+001fa6: GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI*/
+ 0x1faf, /* U+001fa7: GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI*/
+ 0x1fa8, /* U+001fa8: GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI*/
+ 0x1fa9, /* U+001fa9: GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI*/
+ 0x1faa, /* U+001faa: GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI*/
+ 0x1fab, /* U+001fab: GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI*/
+ 0x1fac, /* U+001fac: GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI*/
+ 0x1fad, /* U+001fad: GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI*/
+ 0x1fae, /* U+001fae: GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI*/
+ 0x1faf, /* U+001faf: GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI*/
+ 0x1fb8, /* U+001fb0: GREEK SMALL LETTER ALPHA WITH VRACHY*/
+ 0x1fb9, /* U+001fb1: GREEK SMALL LETTER ALPHA WITH MACRON*/
+ 0x1fb2, /* U+001fb2: GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI*/
+ 0x1fbc, /* U+001fb3: GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI*/
+ 0x1fb4, /* U+001fb4: GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI*/
+ 0x1fb5, /* U+001fb5: */
+ 0x1fb6, /* U+001fb6: GREEK SMALL LETTER ALPHA WITH PERISPOMENI*/
+ 0x1fb7, /* U+001fb7: GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI*/
+ 0x1fb8, /* U+001fb8: GREEK CAPITAL LETTER ALPHA WITH VRACHY*/
+ 0x1fb9, /* U+001fb9: GREEK CAPITAL LETTER ALPHA WITH MACRON*/
+ 0x1fba, /* U+001fba: GREEK CAPITAL LETTER ALPHA WITH VARIA*/
+ 0x1fbb, /* U+001fbb: GREEK CAPITAL LETTER ALPHA WITH OXIA*/
+ 0x1fbc, /* U+001fbc: GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI*/
+ 0x1fbd, /* U+001fbd: GREEK KORONIS*/
+ 0x399, /* U+001fbe: GREEK PROSGEGRAMMENI*/
+ 0x1fbf, /* U+001fbf: GREEK PSILI*/
+ 0x1fc0, /* U+001fc0: GREEK PERISPOMENI*/
+ 0x1fc1, /* U+001fc1: GREEK DIALYTIKA AND PERISPOMENI*/
+ 0x1fc2, /* U+001fc2: GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI*/
+ 0x1fcc, /* U+001fc3: GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI*/
+ 0x1fc4, /* U+001fc4: GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI*/
+ 0x1fc5, /* U+001fc5: */
+ 0x1fc6, /* U+001fc6: GREEK SMALL LETTER ETA WITH PERISPOMENI*/
+ 0x1fc7, /* U+001fc7: GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI*/
+ 0x1fc8, /* U+001fc8: GREEK CAPITAL LETTER EPSILON WITH VARIA*/
+ 0x1fc9, /* U+001fc9: GREEK CAPITAL LETTER EPSILON WITH OXIA*/
+ 0x1fca, /* U+001fca: GREEK CAPITAL LETTER ETA WITH VARIA*/
+ 0x1fcb, /* U+001fcb: GREEK CAPITAL LETTER ETA WITH OXIA*/
+ 0x1fcc, /* U+001fcc: GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI*/
+ 0x1fcd, /* U+001fcd: GREEK PSILI AND VARIA*/
+ 0x1fce, /* U+001fce: GREEK PSILI AND OXIA*/
+ 0x1fcf, /* U+001fcf: GREEK PSILI AND PERISPOMENI*/
+ 0x1fd8, /* U+001fd0: GREEK SMALL LETTER IOTA WITH VRACHY*/
+ 0x1fd9, /* U+001fd1: GREEK SMALL LETTER IOTA WITH MACRON*/
+ 0x1fd2, /* U+001fd2: GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA*/
+ 0x1fd3, /* U+001fd3: GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA*/
+ 0x1fd4, /* U+001fd4: */
+ 0x1fd5, /* U+001fd5: */
+ 0x1fd6, /* U+001fd6: GREEK SMALL LETTER IOTA WITH PERISPOMENI*/
+ 0x1fd7, /* U+001fd7: GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI*/
+ 0x1fd8, /* U+001fd8: GREEK CAPITAL LETTER IOTA WITH VRACHY*/
+ 0x1fd9, /* U+001fd9: GREEK CAPITAL LETTER IOTA WITH MACRON*/
+ 0x1fda, /* U+001fda: GREEK CAPITAL LETTER IOTA WITH VARIA*/
+ 0x1fdb, /* U+001fdb: GREEK CAPITAL LETTER IOTA WITH OXIA*/
+ 0x1fdc, /* U+001fdc: */
+ 0x1fdd, /* U+001fdd: GREEK DASIA AND VARIA*/
+ 0x1fde, /* U+001fde: GREEK DASIA AND OXIA*/
+ 0x1fdf, /* U+001fdf: GREEK DASIA AND PERISPOMENI*/
+ 0x1fe8, /* U+001fe0: GREEK SMALL LETTER UPSILON WITH VRACHY*/
+ 0x1fe9, /* U+001fe1: GREEK SMALL LETTER UPSILON WITH MACRON*/
+ 0x1fe2, /* U+001fe2: GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA*/
+ 0x1fe3, /* U+001fe3: GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA*/
+ 0x1fe4, /* U+001fe4: GREEK SMALL LETTER RHO WITH PSILI*/
+ 0x1fec, /* U+001fe5: GREEK SMALL LETTER RHO WITH DASIA*/
+ 0x1fe6, /* U+001fe6: GREEK SMALL LETTER UPSILON WITH PERISPOMENI*/
+ 0x1fe7, /* U+001fe7: GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI*/
+ 0x1fe8, /* U+001fe8: GREEK CAPITAL LETTER UPSILON WITH VRACHY*/
+ 0x1fe9, /* U+001fe9: GREEK CAPITAL LETTER UPSILON WITH MACRON*/
+ 0x1fea, /* U+001fea: GREEK CAPITAL LETTER UPSILON WITH VARIA*/
+ 0x1feb, /* U+001feb: GREEK CAPITAL LETTER UPSILON WITH OXIA*/
+ 0x1fec, /* U+001fec: GREEK CAPITAL LETTER RHO WITH DASIA*/
+ 0x1fed, /* U+001fed: GREEK DIALYTIKA AND VARIA*/
+ 0x1fee, /* U+001fee: GREEK DIALYTIKA AND OXIA*/
+ 0x1fef, /* U+001fef: GREEK VARIA*/
+ 0x1ff0, /* U+001ff0: */
+ 0x1ff1, /* U+001ff1: */
+ 0x1ff2, /* U+001ff2: GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI*/
+ 0x1ffc, /* U+001ff3: GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI*/
+ 0x1ff4, /* U+001ff4: GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI*/
+ 0x1ff5, /* U+001ff5: */
+ 0x1ff6, /* U+001ff6: GREEK SMALL LETTER OMEGA WITH PERISPOMENI*/
+ 0x1ff7, /* U+001ff7: GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI*/
+ 0x1ff8, /* U+001ff8: GREEK CAPITAL LETTER OMICRON WITH VARIA*/
+ 0x1ff9, /* U+001ff9: GREEK CAPITAL LETTER OMICRON WITH OXIA*/
+ 0x1ffa, /* U+001ffa: GREEK CAPITAL LETTER OMEGA WITH VARIA*/
+ 0x1ffb, /* U+001ffb: GREEK CAPITAL LETTER OMEGA WITH OXIA*/
+ 0x1ffc, /* U+001ffc: GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI*/
+ 0x1ffd, /* U+001ffd: GREEK OXIA*/
+ 0x1ffe, /* U+001ffe: GREEK DASIA*/
+ 0x1fff, /* U+001fff: */
+ 0x2000, /* U+002000: EN QUAD*/
+ 0x2001, /* U+002001: EM QUAD*/
+ 0x2002, /* U+002002: EN SPACE*/
+ 0x2003, /* U+002003: EM SPACE*/
+ 0x2004, /* U+002004: THREE-PER-EM SPACE*/
+ 0x2005, /* U+002005: FOUR-PER-EM SPACE*/
+ 0x2006, /* U+002006: SIX-PER-EM SPACE*/
+ 0x2007, /* U+002007: FIGURE SPACE*/
+ 0x2008, /* U+002008: PUNCTUATION SPACE*/
+ 0x2009, /* U+002009: THIN SPACE*/
+ 0x200a, /* U+00200a: HAIR SPACE*/
+ 0x200b, /* U+00200b: ZERO WIDTH SPACE*/
+ 0x200c, /* U+00200c: ZERO WIDTH NON-JOINER*/
+ 0x200d, /* U+00200d: ZERO WIDTH JOINER*/
+ 0x200e, /* U+00200e: LEFT-TO-RIGHT MARK*/
+ 0x200f, /* U+00200f: RIGHT-TO-LEFT MARK*/
+ 0x2010, /* U+002010: HYPHEN*/
+ 0x2011, /* U+002011: NON-BREAKING HYPHEN*/
+ 0x2012, /* U+002012: FIGURE DASH*/
+ 0x2013, /* U+002013: EN DASH*/
+ 0x2014, /* U+002014: EM DASH*/
+ 0x2015, /* U+002015: HORIZONTAL BAR*/
+ 0x2016, /* U+002016: DOUBLE VERTICAL LINE*/
+ 0x2017, /* U+002017: DOUBLE LOW LINE*/
+ 0x2018, /* U+002018: LEFT SINGLE QUOTATION MARK*/
+ 0x2019, /* U+002019: RIGHT SINGLE QUOTATION MARK*/
+ 0x201a, /* U+00201a: SINGLE LOW-9 QUOTATION MARK*/
+ 0x201b, /* U+00201b: SINGLE HIGH-REVERSED-9 QUOTATION MARK*/
+ 0x201c, /* U+00201c: LEFT DOUBLE QUOTATION MARK*/
+ 0x201d, /* U+00201d: RIGHT DOUBLE QUOTATION MARK*/
+ 0x201e, /* U+00201e: DOUBLE LOW-9 QUOTATION MARK*/
+ 0x201f, /* U+00201f: DOUBLE HIGH-REVERSED-9 QUOTATION MARK*/
+ 0x2020, /* U+002020: DAGGER*/
+ 0x2021, /* U+002021: DOUBLE DAGGER*/
+ 0x2022, /* U+002022: BULLET*/
+ 0x2023, /* U+002023: TRIANGULAR BULLET*/
+ 0x2024, /* U+002024: ONE DOT LEADER*/
+ 0x2025, /* U+002025: TWO DOT LEADER*/
+ 0x2026, /* U+002026: HORIZONTAL ELLIPSIS*/
+ 0x2027, /* U+002027: HYPHENATION POINT*/
+ 0x2028, /* U+002028: LINE SEPARATOR*/
+ 0x2029, /* U+002029: PARAGRAPH SEPARATOR*/
+ 0x202a, /* U+00202a: LEFT-TO-RIGHT EMBEDDING*/
+ 0x202b, /* U+00202b: RIGHT-TO-LEFT EMBEDDING*/
+ 0x202c, /* U+00202c: POP DIRECTIONAL FORMATTING*/
+ 0x202d, /* U+00202d: LEFT-TO-RIGHT OVERRIDE*/
+ 0x202e, /* U+00202e: RIGHT-TO-LEFT OVERRIDE*/
+ 0x202f, /* U+00202f: NARROW NO-BREAK SPACE*/
+ 0x2030, /* U+002030: PER MILLE SIGN*/
+ 0x2031, /* U+002031: PER TEN THOUSAND SIGN*/
+ 0x2032, /* U+002032: PRIME*/
+ 0x2033, /* U+002033: DOUBLE PRIME*/
+ 0x2034, /* U+002034: TRIPLE PRIME*/
+ 0x2035, /* U+002035: REVERSED PRIME*/
+ 0x2036, /* U+002036: REVERSED DOUBLE PRIME*/
+ 0x2037, /* U+002037: REVERSED TRIPLE PRIME*/
+ 0x2038, /* U+002038: CARET*/
+ 0x2039, /* U+002039: SINGLE LEFT-POINTING ANGLE QUOTATION MARK*/
+ 0x203a, /* U+00203a: SINGLE RIGHT-POINTING ANGLE QUOTATION MARK*/
+ 0x203b, /* U+00203b: REFERENCE MARK*/
+ 0x203c, /* U+00203c: DOUBLE EXCLAMATION MARK*/
+ 0x203d, /* U+00203d: INTERROBANG*/
+ 0x203e, /* U+00203e: OVERLINE*/
+ 0x203f, /* U+00203f: UNDERTIE*/
+ 0x2040, /* U+002040: CHARACTER TIE*/
+ 0x2041, /* U+002041: CARET INSERTION POINT*/
+ 0x2042, /* U+002042: ASTERISM*/
+ 0x2043, /* U+002043: HYPHEN BULLET*/
+ 0x2044, /* U+002044: FRACTION SLASH*/
+ 0x2045, /* U+002045: LEFT SQUARE BRACKET WITH QUILL*/
+ 0x2046, /* U+002046: RIGHT SQUARE BRACKET WITH QUILL*/
+ 0x2047, /* U+002047: DOUBLE QUESTION MARK*/
+ 0x2048, /* U+002048: QUESTION EXCLAMATION MARK*/
+ 0x2049, /* U+002049: EXCLAMATION QUESTION MARK*/
+ 0x204a, /* U+00204a: TIRONIAN SIGN ET*/
+ 0x204b, /* U+00204b: REVERSED PILCROW SIGN*/
+ 0x204c, /* U+00204c: BLACK LEFTWARDS BULLET*/
+ 0x204d, /* U+00204d: BLACK RIGHTWARDS BULLET*/
+ 0x204e, /* U+00204e: LOW ASTERISK*/
+ 0x204f, /* U+00204f: REVERSED SEMICOLON*/
+ 0x2050, /* U+002050: CLOSE UP*/
+ 0x2051, /* U+002051: TWO ASTERISKS ALIGNED VERTICALLY*/
+ 0x2052, /* U+002052: COMMERCIAL MINUS SIGN*/
+ 0x2053, /* U+002053: SWUNG DASH*/
+ 0x2054, /* U+002054: INVERTED UNDERTIE*/
+ 0x2055, /* U+002055: FLOWER PUNCTUATION MARK*/
+ 0x2056, /* U+002056: THREE DOT PUNCTUATION*/
+ 0x2057, /* U+002057: QUADRUPLE PRIME*/
+ 0x2058, /* U+002058: FOUR DOT PUNCTUATION*/
+ 0x2059, /* U+002059: FIVE DOT PUNCTUATION*/
+ 0x205a, /* U+00205a: TWO DOT PUNCTUATION*/
+ 0x205b, /* U+00205b: FOUR DOT MARK*/
+ 0x205c, /* U+00205c: DOTTED CROSS*/
+ 0x205d, /* U+00205d: TRICOLON*/
+ 0x205e, /* U+00205e: VERTICAL FOUR DOTS*/
+ 0x205f, /* U+00205f: MEDIUM MATHEMATICAL SPACE*/
+ 0x2060, /* U+002060: WORD JOINER*/
+ 0x2061, /* U+002061: FUNCTION APPLICATION*/
+ 0x2062, /* U+002062: INVISIBLE TIMES*/
+ 0x2063, /* U+002063: INVISIBLE SEPARATOR*/
+ 0x2064, /* U+002064: INVISIBLE PLUS*/
+ 0x2065, /* U+002065: */
+ 0x2066, /* U+002066: LEFT-TO-RIGHT ISOLATE*/
+ 0x2067, /* U+002067: RIGHT-TO-LEFT ISOLATE*/
+ 0x2068, /* U+002068: FIRST STRONG ISOLATE*/
+ 0x2069, /* U+002069: POP DIRECTIONAL ISOLATE*/
+ 0x206a, /* U+00206a: INHIBIT SYMMETRIC SWAPPING*/
+ 0x206b, /* U+00206b: ACTIVATE SYMMETRIC SWAPPING*/
+ 0x206c, /* U+00206c: INHIBIT ARABIC FORM SHAPING*/
+ 0x206d, /* U+00206d: ACTIVATE ARABIC FORM SHAPING*/
+ 0x206e, /* U+00206e: NATIONAL DIGIT SHAPES*/
+ 0x206f, /* U+00206f: NOMINAL DIGIT SHAPES*/
+ 0x2070, /* U+002070: SUPERSCRIPT ZERO*/
+ 0x2071, /* U+002071: SUPERSCRIPT LATIN SMALL LETTER I*/
+ 0x2072, /* U+002072: */
+ 0x2073, /* U+002073: */
+ 0x2074, /* U+002074: SUPERSCRIPT FOUR*/
+ 0x2075, /* U+002075: SUPERSCRIPT FIVE*/
+ 0x2076, /* U+002076: SUPERSCRIPT SIX*/
+ 0x2077, /* U+002077: SUPERSCRIPT SEVEN*/
+ 0x2078, /* U+002078: SUPERSCRIPT EIGHT*/
+ 0x2079, /* U+002079: SUPERSCRIPT NINE*/
+ 0x207a, /* U+00207a: SUPERSCRIPT PLUS SIGN*/
+ 0x207b, /* U+00207b: SUPERSCRIPT MINUS*/
+ 0x207c, /* U+00207c: SUPERSCRIPT EQUALS SIGN*/
+ 0x207d, /* U+00207d: SUPERSCRIPT LEFT PARENTHESIS*/
+ 0x207e, /* U+00207e: SUPERSCRIPT RIGHT PARENTHESIS*/
+ 0x207f, /* U+00207f: SUPERSCRIPT LATIN SMALL LETTER N*/
+ 0x2080, /* U+002080: SUBSCRIPT ZERO*/
+ 0x2081, /* U+002081: SUBSCRIPT ONE*/
+ 0x2082, /* U+002082: SUBSCRIPT TWO*/
+ 0x2083, /* U+002083: SUBSCRIPT THREE*/
+ 0x2084, /* U+002084: SUBSCRIPT FOUR*/
+ 0x2085, /* U+002085: SUBSCRIPT FIVE*/
+ 0x2086, /* U+002086: SUBSCRIPT SIX*/
+ 0x2087, /* U+002087: SUBSCRIPT SEVEN*/
+ 0x2088, /* U+002088: SUBSCRIPT EIGHT*/
+ 0x2089, /* U+002089: SUBSCRIPT NINE*/
+ 0x208a, /* U+00208a: SUBSCRIPT PLUS SIGN*/
+ 0x208b, /* U+00208b: SUBSCRIPT MINUS*/
+ 0x208c, /* U+00208c: SUBSCRIPT EQUALS SIGN*/
+ 0x208d, /* U+00208d: SUBSCRIPT LEFT PARENTHESIS*/
+ 0x208e, /* U+00208e: SUBSCRIPT RIGHT PARENTHESIS*/
+ 0x208f, /* U+00208f: */
+ 0x2090, /* U+002090: LATIN SUBSCRIPT SMALL LETTER A*/
+ 0x2091, /* U+002091: LATIN SUBSCRIPT SMALL LETTER E*/
+ 0x2092, /* U+002092: LATIN SUBSCRIPT SMALL LETTER O*/
+ 0x2093, /* U+002093: LATIN SUBSCRIPT SMALL LETTER X*/
+ 0x2094, /* U+002094: LATIN SUBSCRIPT SMALL LETTER SCHWA*/
+ 0x2095, /* U+002095: LATIN SUBSCRIPT SMALL LETTER H*/
+ 0x2096, /* U+002096: LATIN SUBSCRIPT SMALL LETTER K*/
+ 0x2097, /* U+002097: LATIN SUBSCRIPT SMALL LETTER L*/
+ 0x2098, /* U+002098: LATIN SUBSCRIPT SMALL LETTER M*/
+ 0x2099, /* U+002099: LATIN SUBSCRIPT SMALL LETTER N*/
+ 0x209a, /* U+00209a: LATIN SUBSCRIPT SMALL LETTER P*/
+ 0x209b, /* U+00209b: LATIN SUBSCRIPT SMALL LETTER S*/
+ 0x209c, /* U+00209c: LATIN SUBSCRIPT SMALL LETTER T*/
+ 0x209d, /* U+00209d: */
+ 0x209e, /* U+00209e: */
+ 0x209f, /* U+00209f: */
+ 0x20a0, /* U+0020a0: EURO-CURRENCY SIGN*/
+ 0x20a1, /* U+0020a1: COLON SIGN*/
+ 0x20a2, /* U+0020a2: CRUZEIRO SIGN*/
+ 0x20a3, /* U+0020a3: FRENCH FRANC SIGN*/
+ 0x20a4, /* U+0020a4: LIRA SIGN*/
+ 0x20a5, /* U+0020a5: MILL SIGN*/
+ 0x20a6, /* U+0020a6: NAIRA SIGN*/
+ 0x20a7, /* U+0020a7: PESETA SIGN*/
+ 0x20a8, /* U+0020a8: RUPEE SIGN*/
+ 0x20a9, /* U+0020a9: WON SIGN*/
+ 0x20aa, /* U+0020aa: NEW SHEQEL SIGN*/
+ 0x20ab, /* U+0020ab: DONG SIGN*/
+ 0x20ac, /* U+0020ac: EURO SIGN*/
+ 0x20ad, /* U+0020ad: KIP SIGN*/
+ 0x20ae, /* U+0020ae: TUGRIK SIGN*/
+ 0x20af, /* U+0020af: DRACHMA SIGN*/
+ 0x20b0, /* U+0020b0: GERMAN PENNY SIGN*/
+ 0x20b1, /* U+0020b1: PESO SIGN*/
+ 0x20b2, /* U+0020b2: GUARANI SIGN*/
+ 0x20b3, /* U+0020b3: AUSTRAL SIGN*/
+ 0x20b4, /* U+0020b4: HRYVNIA SIGN*/
+ 0x20b5, /* U+0020b5: CEDI SIGN*/
+ 0x20b6, /* U+0020b6: LIVRE TOURNOIS SIGN*/
+ 0x20b7, /* U+0020b7: SPESMILO SIGN*/
+ 0x20b8, /* U+0020b8: TENGE SIGN*/
+ 0x20b9, /* U+0020b9: INDIAN RUPEE SIGN*/
+ 0x20ba, /* U+0020ba: TURKISH LIRA SIGN*/
+ 0x20bb, /* U+0020bb: */
+ 0x20bc, /* U+0020bc: */
+ 0x20bd, /* U+0020bd: */
+ 0x20be, /* U+0020be: */
+ 0x20bf, /* U+0020bf: */
+ 0x20c0, /* U+0020c0: */
+ 0x20c1, /* U+0020c1: */
+ 0x20c2, /* U+0020c2: */
+ 0x20c3, /* U+0020c3: */
+ 0x20c4, /* U+0020c4: */
+ 0x20c5, /* U+0020c5: */
+ 0x20c6, /* U+0020c6: */
+ 0x20c7, /* U+0020c7: */
+ 0x20c8, /* U+0020c8: */
+ 0x20c9, /* U+0020c9: */
+ 0x20ca, /* U+0020ca: */
+ 0x20cb, /* U+0020cb: */
+ 0x20cc, /* U+0020cc: */
+ 0x20cd, /* U+0020cd: */
+ 0x20ce, /* U+0020ce: */
+ 0x20cf, /* U+0020cf: */
+ 0x20d0, /* U+0020d0: COMBINING LEFT HARPOON ABOVE*/
+ 0x20d1, /* U+0020d1: COMBINING RIGHT HARPOON ABOVE*/
+ 0x20d2, /* U+0020d2: COMBINING LONG VERTICAL LINE OVERLAY*/
+ 0x20d3, /* U+0020d3: COMBINING SHORT VERTICAL LINE OVERLAY*/
+ 0x20d4, /* U+0020d4: COMBINING ANTICLOCKWISE ARROW ABOVE*/
+ 0x20d5, /* U+0020d5: COMBINING CLOCKWISE ARROW ABOVE*/
+ 0x20d6, /* U+0020d6: COMBINING LEFT ARROW ABOVE*/
+ 0x20d7, /* U+0020d7: COMBINING RIGHT ARROW ABOVE*/
+ 0x20d8, /* U+0020d8: COMBINING RING OVERLAY*/
+ 0x20d9, /* U+0020d9: COMBINING CLOCKWISE RING OVERLAY*/
+ 0x20da, /* U+0020da: COMBINING ANTICLOCKWISE RING OVERLAY*/
+ 0x20db, /* U+0020db: COMBINING THREE DOTS ABOVE*/
+ 0x20dc, /* U+0020dc: COMBINING FOUR DOTS ABOVE*/
+ 0x20dd, /* U+0020dd: COMBINING ENCLOSING CIRCLE*/
+ 0x20de, /* U+0020de: COMBINING ENCLOSING SQUARE*/
+ 0x20df, /* U+0020df: COMBINING ENCLOSING DIAMOND*/
+ 0x20e0, /* U+0020e0: COMBINING ENCLOSING CIRCLE BACKSLASH*/
+ 0x20e1, /* U+0020e1: COMBINING LEFT RIGHT ARROW ABOVE*/
+ 0x20e2, /* U+0020e2: COMBINING ENCLOSING SCREEN*/
+ 0x20e3, /* U+0020e3: COMBINING ENCLOSING KEYCAP*/
+ 0x20e4, /* U+0020e4: COMBINING ENCLOSING UPWARD POINTING TRIANGLE*/
+ 0x20e5, /* U+0020e5: COMBINING REVERSE SOLIDUS OVERLAY*/
+ 0x20e6, /* U+0020e6: COMBINING DOUBLE VERTICAL STROKE OVERLAY*/
+ 0x20e7, /* U+0020e7: COMBINING ANNUITY SYMBOL*/
+ 0x20e8, /* U+0020e8: COMBINING TRIPLE UNDERDOT*/
+ 0x20e9, /* U+0020e9: COMBINING WIDE BRIDGE ABOVE*/
+ 0x20ea, /* U+0020ea: COMBINING LEFTWARDS ARROW OVERLAY*/
+ 0x20eb, /* U+0020eb: COMBINING LONG DOUBLE SOLIDUS OVERLAY*/
+ 0x20ec, /* U+0020ec: COMBINING RIGHTWARDS HARPOON WITH BARB DOWNWARDS*/
+ 0x20ed, /* U+0020ed: COMBINING LEFTWARDS HARPOON WITH BARB DOWNWARDS*/
+ 0x20ee, /* U+0020ee: COMBINING LEFT ARROW BELOW*/
+ 0x20ef, /* U+0020ef: COMBINING RIGHT ARROW BELOW*/
+ 0x20f0, /* U+0020f0: COMBINING ASTERISK ABOVE*/
+ 0x20f1, /* U+0020f1: */
+ 0x20f2, /* U+0020f2: */
+ 0x20f3, /* U+0020f3: */
+ 0x20f4, /* U+0020f4: */
+ 0x20f5, /* U+0020f5: */
+ 0x20f6, /* U+0020f6: */
+ 0x20f7, /* U+0020f7: */
+ 0x20f8, /* U+0020f8: */
+ 0x20f9, /* U+0020f9: */
+ 0x20fa, /* U+0020fa: */
+ 0x20fb, /* U+0020fb: */
+ 0x20fc, /* U+0020fc: */
+ 0x20fd, /* U+0020fd: */
+ 0x20fe, /* U+0020fe: */
+ 0x20ff, /* U+0020ff: */
+ 0x2100, /* U+002100: ACCOUNT OF*/
+ 0x2101, /* U+002101: ADDRESSED TO THE SUBJECT*/
+ 0x2102, /* U+002102: DOUBLE-STRUCK CAPITAL C*/
+ 0x2103, /* U+002103: DEGREE CELSIUS*/
+ 0x2104, /* U+002104: CENTRE LINE SYMBOL*/
+ 0x2105, /* U+002105: CARE OF*/
+ 0x2106, /* U+002106: CADA UNA*/
+ 0x2107, /* U+002107: EULER CONSTANT*/
+ 0x2108, /* U+002108: SCRUPLE*/
+ 0x2109, /* U+002109: DEGREE FAHRENHEIT*/
+ 0x210a, /* U+00210a: SCRIPT SMALL G*/
+ 0x210b, /* U+00210b: SCRIPT CAPITAL H*/
+ 0x210c, /* U+00210c: BLACK-LETTER CAPITAL H*/
+ 0x210d, /* U+00210d: DOUBLE-STRUCK CAPITAL H*/
+ 0x210e, /* U+00210e: PLANCK CONSTANT*/
+ 0x210f, /* U+00210f: PLANCK CONSTANT OVER TWO PI*/
+ 0x2110, /* U+002110: SCRIPT CAPITAL I*/
+ 0x2111, /* U+002111: BLACK-LETTER CAPITAL I*/
+ 0x2112, /* U+002112: SCRIPT CAPITAL L*/
+ 0x2113, /* U+002113: SCRIPT SMALL L*/
+ 0x2114, /* U+002114: L B BAR SYMBOL*/
+ 0x2115, /* U+002115: DOUBLE-STRUCK CAPITAL N*/
+ 0x2116, /* U+002116: NUMERO SIGN*/
+ 0x2117, /* U+002117: SOUND RECORDING COPYRIGHT*/
+ 0x2118, /* U+002118: SCRIPT CAPITAL P*/
+ 0x2119, /* U+002119: DOUBLE-STRUCK CAPITAL P*/
+ 0x211a, /* U+00211a: DOUBLE-STRUCK CAPITAL Q*/
+ 0x211b, /* U+00211b: SCRIPT CAPITAL R*/
+ 0x211c, /* U+00211c: BLACK-LETTER CAPITAL R*/
+ 0x211d, /* U+00211d: DOUBLE-STRUCK CAPITAL R*/
+ 0x211e, /* U+00211e: PRESCRIPTION TAKE*/
+ 0x211f, /* U+00211f: RESPONSE*/
+ 0x2120, /* U+002120: SERVICE MARK*/
+ 0x2121, /* U+002121: TELEPHONE SIGN*/
+ 0x2122, /* U+002122: TRADE MARK SIGN*/
+ 0x2123, /* U+002123: VERSICLE*/
+ 0x2124, /* U+002124: DOUBLE-STRUCK CAPITAL Z*/
+ 0x2125, /* U+002125: OUNCE SIGN*/
+ 0x2126, /* U+002126: OHM SIGN*/
+ 0x2127, /* U+002127: INVERTED OHM SIGN*/
+ 0x2128, /* U+002128: BLACK-LETTER CAPITAL Z*/
+ 0x2129, /* U+002129: TURNED GREEK SMALL LETTER IOTA*/
+ 0x212a, /* U+00212a: KELVIN SIGN*/
+ 0x212b, /* U+00212b: ANGSTROM SIGN*/
+ 0x212c, /* U+00212c: SCRIPT CAPITAL B*/
+ 0x212d, /* U+00212d: BLACK-LETTER CAPITAL C*/
+ 0x212e, /* U+00212e: ESTIMATED SYMBOL*/
+ 0x212f, /* U+00212f: SCRIPT SMALL E*/
+ 0x2130, /* U+002130: SCRIPT CAPITAL E*/
+ 0x2131, /* U+002131: SCRIPT CAPITAL F*/
+ 0x2132, /* U+002132: TURNED CAPITAL F*/
+ 0x2133, /* U+002133: SCRIPT CAPITAL M*/
+ 0x2134, /* U+002134: SCRIPT SMALL O*/
+ 0x2135, /* U+002135: ALEF SYMBOL*/
+ 0x2136, /* U+002136: BET SYMBOL*/
+ 0x2137, /* U+002137: GIMEL SYMBOL*/
+ 0x2138, /* U+002138: DALET SYMBOL*/
+ 0x2139, /* U+002139: INFORMATION SOURCE*/
+ 0x213a, /* U+00213a: ROTATED CAPITAL Q*/
+ 0x213b, /* U+00213b: FACSIMILE SIGN*/
+ 0x213c, /* U+00213c: DOUBLE-STRUCK SMALL PI*/
+ 0x213d, /* U+00213d: DOUBLE-STRUCK SMALL GAMMA*/
+ 0x213e, /* U+00213e: DOUBLE-STRUCK CAPITAL GAMMA*/
+ 0x213f, /* U+00213f: DOUBLE-STRUCK CAPITAL PI*/
+ 0x2140, /* U+002140: DOUBLE-STRUCK N-ARY SUMMATION*/
+ 0x2141, /* U+002141: TURNED SANS-SERIF CAPITAL G*/
+ 0x2142, /* U+002142: TURNED SANS-SERIF CAPITAL L*/
+ 0x2143, /* U+002143: REVERSED SANS-SERIF CAPITAL L*/
+ 0x2144, /* U+002144: TURNED SANS-SERIF CAPITAL Y*/
+ 0x2145, /* U+002145: DOUBLE-STRUCK ITALIC CAPITAL D*/
+ 0x2146, /* U+002146: DOUBLE-STRUCK ITALIC SMALL D*/
+ 0x2147, /* U+002147: DOUBLE-STRUCK ITALIC SMALL E*/
+ 0x2148, /* U+002148: DOUBLE-STRUCK ITALIC SMALL I*/
+ 0x2149, /* U+002149: DOUBLE-STRUCK ITALIC SMALL J*/
+ 0x214a, /* U+00214a: PROPERTY LINE*/
+ 0x214b, /* U+00214b: TURNED AMPERSAND*/
+ 0x214c, /* U+00214c: PER SIGN*/
+ 0x214d, /* U+00214d: AKTIESELSKAB*/
+ 0x2132, /* U+00214e: TURNED SMALL F*/
+ 0x214f, /* U+00214f: SYMBOL FOR SAMARITAN SOURCE*/
+ 0x2150, /* U+002150: VULGAR FRACTION ONE SEVENTH*/
+ 0x2151, /* U+002151: VULGAR FRACTION ONE NINTH*/
+ 0x2152, /* U+002152: VULGAR FRACTION ONE TENTH*/
+ 0x2153, /* U+002153: VULGAR FRACTION ONE THIRD*/
+ 0x2154, /* U+002154: VULGAR FRACTION TWO THIRDS*/
+ 0x2155, /* U+002155: VULGAR FRACTION ONE FIFTH*/
+ 0x2156, /* U+002156: VULGAR FRACTION TWO FIFTHS*/
+ 0x2157, /* U+002157: VULGAR FRACTION THREE FIFTHS*/
+ 0x2158, /* U+002158: VULGAR FRACTION FOUR FIFTHS*/
+ 0x2159, /* U+002159: VULGAR FRACTION ONE SIXTH*/
+ 0x215a, /* U+00215a: VULGAR FRACTION FIVE SIXTHS*/
+ 0x215b, /* U+00215b: VULGAR FRACTION ONE EIGHTH*/
+ 0x215c, /* U+00215c: VULGAR FRACTION THREE EIGHTHS*/
+ 0x215d, /* U+00215d: VULGAR FRACTION FIVE EIGHTHS*/
+ 0x215e, /* U+00215e: VULGAR FRACTION SEVEN EIGHTHS*/
+ 0x215f, /* U+00215f: FRACTION NUMERATOR ONE*/
+ 0x2160, /* U+002160: ROMAN NUMERAL ONE*/
+ 0x2161, /* U+002161: ROMAN NUMERAL TWO*/
+ 0x2162, /* U+002162: ROMAN NUMERAL THREE*/
+ 0x2163, /* U+002163: ROMAN NUMERAL FOUR*/
+ 0x2164, /* U+002164: ROMAN NUMERAL FIVE*/
+ 0x2165, /* U+002165: ROMAN NUMERAL SIX*/
+ 0x2166, /* U+002166: ROMAN NUMERAL SEVEN*/
+ 0x2167, /* U+002167: ROMAN NUMERAL EIGHT*/
+ 0x2168, /* U+002168: ROMAN NUMERAL NINE*/
+ 0x2169, /* U+002169: ROMAN NUMERAL TEN*/
+ 0x216a, /* U+00216a: ROMAN NUMERAL ELEVEN*/
+ 0x216b, /* U+00216b: ROMAN NUMERAL TWELVE*/
+ 0x216c, /* U+00216c: ROMAN NUMERAL FIFTY*/
+ 0x216d, /* U+00216d: ROMAN NUMERAL ONE HUNDRED*/
+ 0x216e, /* U+00216e: ROMAN NUMERAL FIVE HUNDRED*/
+ 0x216f, /* U+00216f: ROMAN NUMERAL ONE THOUSAND*/
+ 0x2160, /* U+002170: SMALL ROMAN NUMERAL ONE*/
+ 0x2161, /* U+002171: SMALL ROMAN NUMERAL TWO*/
+ 0x2162, /* U+002172: SMALL ROMAN NUMERAL THREE*/
+ 0x2163, /* U+002173: SMALL ROMAN NUMERAL FOUR*/
+ 0x2164, /* U+002174: SMALL ROMAN NUMERAL FIVE*/
+ 0x2165, /* U+002175: SMALL ROMAN NUMERAL SIX*/
+ 0x2166, /* U+002176: SMALL ROMAN NUMERAL SEVEN*/
+ 0x2167, /* U+002177: SMALL ROMAN NUMERAL EIGHT*/
+ 0x2168, /* U+002178: SMALL ROMAN NUMERAL NINE*/
+ 0x2169, /* U+002179: SMALL ROMAN NUMERAL TEN*/
+ 0x216a, /* U+00217a: SMALL ROMAN NUMERAL ELEVEN*/
+ 0x216b, /* U+00217b: SMALL ROMAN NUMERAL TWELVE*/
+ 0x216c, /* U+00217c: SMALL ROMAN NUMERAL FIFTY*/
+ 0x216d, /* U+00217d: SMALL ROMAN NUMERAL ONE HUNDRED*/
+ 0x216e, /* U+00217e: SMALL ROMAN NUMERAL FIVE HUNDRED*/
+ 0x216f, /* U+00217f: SMALL ROMAN NUMERAL ONE THOUSAND*/
+ 0x2180, /* U+002180: ROMAN NUMERAL ONE THOUSAND C D*/
+ 0x2181, /* U+002181: ROMAN NUMERAL FIVE THOUSAND*/
+ 0x2182, /* U+002182: ROMAN NUMERAL TEN THOUSAND*/
+ 0x2183, /* U+002183: ROMAN NUMERAL REVERSED ONE HUNDRED*/
+ 0x2183, /* U+002184: LATIN SMALL LETTER REVERSED C*/
+ 0x2185, /* U+002185: ROMAN NUMERAL SIX LATE FORM*/
+ 0x2186, /* U+002186: ROMAN NUMERAL FIFTY EARLY FORM*/
+ 0x2187, /* U+002187: ROMAN NUMERAL FIFTY THOUSAND*/
+ 0x2188, /* U+002188: ROMAN NUMERAL ONE HUNDRED THOUSAND*/
+ 0x2189, /* U+002189: VULGAR FRACTION ZERO THIRDS*/
+ 0x218a, /* U+00218a: */
+ 0x218b, /* U+00218b: */
+ 0x218c, /* U+00218c: */
+ 0x218d, /* U+00218d: */
+ 0x218e, /* U+00218e: */
+ 0x218f, /* U+00218f: */
+ 0x2190, /* U+002190: LEFTWARDS ARROW*/
+ 0x2191, /* U+002191: UPWARDS ARROW*/
+ 0x2192, /* U+002192: RIGHTWARDS ARROW*/
+ 0x2193, /* U+002193: DOWNWARDS ARROW*/
+ 0x2194, /* U+002194: LEFT RIGHT ARROW*/
+ 0x2195, /* U+002195: UP DOWN ARROW*/
+ 0x2196, /* U+002196: NORTH WEST ARROW*/
+ 0x2197, /* U+002197: NORTH EAST ARROW*/
+ 0x2198, /* U+002198: SOUTH EAST ARROW*/
+ 0x2199, /* U+002199: SOUTH WEST ARROW*/
+ 0x219a, /* U+00219a: LEFTWARDS ARROW WITH STROKE*/
+ 0x219b, /* U+00219b: RIGHTWARDS ARROW WITH STROKE*/
+ 0x219c, /* U+00219c: LEFTWARDS WAVE ARROW*/
+ 0x219d, /* U+00219d: RIGHTWARDS WAVE ARROW*/
+ 0x219e, /* U+00219e: LEFTWARDS TWO HEADED ARROW*/
+ 0x219f, /* U+00219f: UPWARDS TWO HEADED ARROW*/
+ 0x21a0, /* U+0021a0: RIGHTWARDS TWO HEADED ARROW*/
+ 0x21a1, /* U+0021a1: DOWNWARDS TWO HEADED ARROW*/
+ 0x21a2, /* U+0021a2: LEFTWARDS ARROW WITH TAIL*/
+ 0x21a3, /* U+0021a3: RIGHTWARDS ARROW WITH TAIL*/
+ 0x21a4, /* U+0021a4: LEFTWARDS ARROW FROM BAR*/
+ 0x21a5, /* U+0021a5: UPWARDS ARROW FROM BAR*/
+ 0x21a6, /* U+0021a6: RIGHTWARDS ARROW FROM BAR*/
+ 0x21a7, /* U+0021a7: DOWNWARDS ARROW FROM BAR*/
+ 0x21a8, /* U+0021a8: UP DOWN ARROW WITH BASE*/
+ 0x21a9, /* U+0021a9: LEFTWARDS ARROW WITH HOOK*/
+ 0x21aa, /* U+0021aa: RIGHTWARDS ARROW WITH HOOK*/
+ 0x21ab, /* U+0021ab: LEFTWARDS ARROW WITH LOOP*/
+ 0x21ac, /* U+0021ac: RIGHTWARDS ARROW WITH LOOP*/
+ 0x21ad, /* U+0021ad: LEFT RIGHT WAVE ARROW*/
+ 0x21ae, /* U+0021ae: LEFT RIGHT ARROW WITH STROKE*/
+ 0x21af, /* U+0021af: DOWNWARDS ZIGZAG ARROW*/
+ 0x21b0, /* U+0021b0: UPWARDS ARROW WITH TIP LEFTWARDS*/
+ 0x21b1, /* U+0021b1: UPWARDS ARROW WITH TIP RIGHTWARDS*/
+ 0x21b2, /* U+0021b2: DOWNWARDS ARROW WITH TIP LEFTWARDS*/
+ 0x21b3, /* U+0021b3: DOWNWARDS ARROW WITH TIP RIGHTWARDS*/
+ 0x21b4, /* U+0021b4: RIGHTWARDS ARROW WITH CORNER DOWNWARDS*/
+ 0x21b5, /* U+0021b5: DOWNWARDS ARROW WITH CORNER LEFTWARDS*/
+ 0x21b6, /* U+0021b6: ANTICLOCKWISE TOP SEMICIRCLE ARROW*/
+ 0x21b7, /* U+0021b7: CLOCKWISE TOP SEMICIRCLE ARROW*/
+ 0x21b8, /* U+0021b8: NORTH WEST ARROW TO LONG BAR*/
+ 0x21b9, /* U+0021b9: LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR*/
+ 0x21ba, /* U+0021ba: ANTICLOCKWISE OPEN CIRCLE ARROW*/
+ 0x21bb, /* U+0021bb: CLOCKWISE OPEN CIRCLE ARROW*/
+ 0x21bc, /* U+0021bc: LEFTWARDS HARPOON WITH BARB UPWARDS*/
+ 0x21bd, /* U+0021bd: LEFTWARDS HARPOON WITH BARB DOWNWARDS*/
+ 0x21be, /* U+0021be: UPWARDS HARPOON WITH BARB RIGHTWARDS*/
+ 0x21bf, /* U+0021bf: UPWARDS HARPOON WITH BARB LEFTWARDS*/
+ 0x21c0, /* U+0021c0: RIGHTWARDS HARPOON WITH BARB UPWARDS*/
+ 0x21c1, /* U+0021c1: RIGHTWARDS HARPOON WITH BARB DOWNWARDS*/
+ 0x21c2, /* U+0021c2: DOWNWARDS HARPOON WITH BARB RIGHTWARDS*/
+ 0x21c3, /* U+0021c3: DOWNWARDS HARPOON WITH BARB LEFTWARDS*/
+ 0x21c4, /* U+0021c4: RIGHTWARDS ARROW OVER LEFTWARDS ARROW*/
+ 0x21c5, /* U+0021c5: UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW*/
+ 0x21c6, /* U+0021c6: LEFTWARDS ARROW OVER RIGHTWARDS ARROW*/
+ 0x21c7, /* U+0021c7: LEFTWARDS PAIRED ARROWS*/
+ 0x21c8, /* U+0021c8: UPWARDS PAIRED ARROWS*/
+ 0x21c9, /* U+0021c9: RIGHTWARDS PAIRED ARROWS*/
+ 0x21ca, /* U+0021ca: DOWNWARDS PAIRED ARROWS*/
+ 0x21cb, /* U+0021cb: LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON*/
+ 0x21cc, /* U+0021cc: RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON*/
+ 0x21cd, /* U+0021cd: LEFTWARDS DOUBLE ARROW WITH STROKE*/
+ 0x21ce, /* U+0021ce: LEFT RIGHT DOUBLE ARROW WITH STROKE*/
+ 0x21cf, /* U+0021cf: RIGHTWARDS DOUBLE ARROW WITH STROKE*/
+ 0x21d0, /* U+0021d0: LEFTWARDS DOUBLE ARROW*/
+ 0x21d1, /* U+0021d1: UPWARDS DOUBLE ARROW*/
+ 0x21d2, /* U+0021d2: RIGHTWARDS DOUBLE ARROW*/
+ 0x21d3, /* U+0021d3: DOWNWARDS DOUBLE ARROW*/
+ 0x21d4, /* U+0021d4: LEFT RIGHT DOUBLE ARROW*/
+ 0x21d5, /* U+0021d5: UP DOWN DOUBLE ARROW*/
+ 0x21d6, /* U+0021d6: NORTH WEST DOUBLE ARROW*/
+ 0x21d7, /* U+0021d7: NORTH EAST DOUBLE ARROW*/
+ 0x21d8, /* U+0021d8: SOUTH EAST DOUBLE ARROW*/
+ 0x21d9, /* U+0021d9: SOUTH WEST DOUBLE ARROW*/
+ 0x21da, /* U+0021da: LEFTWARDS TRIPLE ARROW*/
+ 0x21db, /* U+0021db: RIGHTWARDS TRIPLE ARROW*/
+ 0x21dc, /* U+0021dc: LEFTWARDS SQUIGGLE ARROW*/
+ 0x21dd, /* U+0021dd: RIGHTWARDS SQUIGGLE ARROW*/
+ 0x21de, /* U+0021de: UPWARDS ARROW WITH DOUBLE STROKE*/
+ 0x21df, /* U+0021df: DOWNWARDS ARROW WITH DOUBLE STROKE*/
+ 0x21e0, /* U+0021e0: LEFTWARDS DASHED ARROW*/
+ 0x21e1, /* U+0021e1: UPWARDS DASHED ARROW*/
+ 0x21e2, /* U+0021e2: RIGHTWARDS DASHED ARROW*/
+ 0x21e3, /* U+0021e3: DOWNWARDS DASHED ARROW*/
+ 0x21e4, /* U+0021e4: LEFTWARDS ARROW TO BAR*/
+ 0x21e5, /* U+0021e5: RIGHTWARDS ARROW TO BAR*/
+ 0x21e6, /* U+0021e6: LEFTWARDS WHITE ARROW*/
+ 0x21e7, /* U+0021e7: UPWARDS WHITE ARROW*/
+ 0x21e8, /* U+0021e8: RIGHTWARDS WHITE ARROW*/
+ 0x21e9, /* U+0021e9: DOWNWARDS WHITE ARROW*/
+ 0x21ea, /* U+0021ea: UPWARDS WHITE ARROW FROM BAR*/
+ 0x21eb, /* U+0021eb: UPWARDS WHITE ARROW ON PEDESTAL*/
+ 0x21ec, /* U+0021ec: UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR*/
+ 0x21ed, /* U+0021ed: UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR*/
+ 0x21ee, /* U+0021ee: UPWARDS WHITE DOUBLE ARROW*/
+ 0x21ef, /* U+0021ef: UPWARDS WHITE DOUBLE ARROW ON PEDESTAL*/
+ 0x21f0, /* U+0021f0: RIGHTWARDS WHITE ARROW FROM WALL*/
+ 0x21f1, /* U+0021f1: NORTH WEST ARROW TO CORNER*/
+ 0x21f2, /* U+0021f2: SOUTH EAST ARROW TO CORNER*/
+ 0x21f3, /* U+0021f3: UP DOWN WHITE ARROW*/
+ 0x21f4, /* U+0021f4: RIGHT ARROW WITH SMALL CIRCLE*/
+ 0x21f5, /* U+0021f5: DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW*/
+ 0x21f6, /* U+0021f6: THREE RIGHTWARDS ARROWS*/
+ 0x21f7, /* U+0021f7: LEFTWARDS ARROW WITH VERTICAL STROKE*/
+ 0x21f8, /* U+0021f8: RIGHTWARDS ARROW WITH VERTICAL STROKE*/
+ 0x21f9, /* U+0021f9: LEFT RIGHT ARROW WITH VERTICAL STROKE*/
+ 0x21fa, /* U+0021fa: LEFTWARDS ARROW WITH DOUBLE VERTICAL STROKE*/
+ 0x21fb, /* U+0021fb: RIGHTWARDS ARROW WITH DOUBLE VERTICAL STROKE*/
+ 0x21fc, /* U+0021fc: LEFT RIGHT ARROW WITH DOUBLE VERTICAL STROKE*/
+ 0x21fd, /* U+0021fd: LEFTWARDS OPEN-HEADED ARROW*/
+ 0x21fe, /* U+0021fe: RIGHTWARDS OPEN-HEADED ARROW*/
+ 0x21ff, /* U+0021ff: LEFT RIGHT OPEN-HEADED ARROW*/
+ 0x2200, /* U+002200: FOR ALL*/
+ 0x2201, /* U+002201: COMPLEMENT*/
+ 0x2202, /* U+002202: PARTIAL DIFFERENTIAL*/
+ 0x2203, /* U+002203: THERE EXISTS*/
+ 0x2204, /* U+002204: THERE DOES NOT EXIST*/
+ 0x2205, /* U+002205: EMPTY SET*/
+ 0x2206, /* U+002206: INCREMENT*/
+ 0x2207, /* U+002207: NABLA*/
+ 0x2208, /* U+002208: ELEMENT OF*/
+ 0x2209, /* U+002209: NOT AN ELEMENT OF*/
+ 0x220a, /* U+00220a: SMALL ELEMENT OF*/
+ 0x220b, /* U+00220b: CONTAINS AS MEMBER*/
+ 0x220c, /* U+00220c: DOES NOT CONTAIN AS MEMBER*/
+ 0x220d, /* U+00220d: SMALL CONTAINS AS MEMBER*/
+ 0x220e, /* U+00220e: END OF PROOF*/
+ 0x220f, /* U+00220f: N-ARY PRODUCT*/
+ 0x2210, /* U+002210: N-ARY COPRODUCT*/
+ 0x2211, /* U+002211: N-ARY SUMMATION*/
+ 0x2212, /* U+002212: MINUS SIGN*/
+ 0x2213, /* U+002213: MINUS-OR-PLUS SIGN*/
+ 0x2214, /* U+002214: DOT PLUS*/
+ 0x2215, /* U+002215: DIVISION SLASH*/
+ 0x2216, /* U+002216: SET MINUS*/
+ 0x2217, /* U+002217: ASTERISK OPERATOR*/
+ 0x2218, /* U+002218: RING OPERATOR*/
+ 0x2219, /* U+002219: BULLET OPERATOR*/
+ 0x221a, /* U+00221a: SQUARE ROOT*/
+ 0x221b, /* U+00221b: CUBE ROOT*/
+ 0x221c, /* U+00221c: FOURTH ROOT*/
+ 0x221d, /* U+00221d: PROPORTIONAL TO*/
+ 0x221e, /* U+00221e: INFINITY*/
+ 0x221f, /* U+00221f: RIGHT ANGLE*/
+ 0x2220, /* U+002220: ANGLE*/
+ 0x2221, /* U+002221: MEASURED ANGLE*/
+ 0x2222, /* U+002222: SPHERICAL ANGLE*/
+ 0x2223, /* U+002223: DIVIDES*/
+ 0x2224, /* U+002224: DOES NOT DIVIDE*/
+ 0x2225, /* U+002225: PARALLEL TO*/
+ 0x2226, /* U+002226: NOT PARALLEL TO*/
+ 0x2227, /* U+002227: LOGICAL AND*/
+ 0x2228, /* U+002228: LOGICAL OR*/
+ 0x2229, /* U+002229: INTERSECTION*/
+ 0x222a, /* U+00222a: UNION*/
+ 0x222b, /* U+00222b: INTEGRAL*/
+ 0x222c, /* U+00222c: DOUBLE INTEGRAL*/
+ 0x222d, /* U+00222d: TRIPLE INTEGRAL*/
+ 0x222e, /* U+00222e: CONTOUR INTEGRAL*/
+ 0x222f, /* U+00222f: SURFACE INTEGRAL*/
+ 0x2230, /* U+002230: VOLUME INTEGRAL*/
+ 0x2231, /* U+002231: CLOCKWISE INTEGRAL*/
+ 0x2232, /* U+002232: CLOCKWISE CONTOUR INTEGRAL*/
+ 0x2233, /* U+002233: ANTICLOCKWISE CONTOUR INTEGRAL*/
+ 0x2234, /* U+002234: THEREFORE*/
+ 0x2235, /* U+002235: BECAUSE*/
+ 0x2236, /* U+002236: RATIO*/
+ 0x2237, /* U+002237: PROPORTION*/
+ 0x2238, /* U+002238: DOT MINUS*/
+ 0x2239, /* U+002239: EXCESS*/
+ 0x223a, /* U+00223a: GEOMETRIC PROPORTION*/
+ 0x223b, /* U+00223b: HOMOTHETIC*/
+ 0x223c, /* U+00223c: TILDE OPERATOR*/
+ 0x223d, /* U+00223d: REVERSED TILDE*/
+ 0x223e, /* U+00223e: INVERTED LAZY S*/
+ 0x223f, /* U+00223f: SINE WAVE*/
+ 0x2240, /* U+002240: WREATH PRODUCT*/
+ 0x2241, /* U+002241: NOT TILDE*/
+ 0x2242, /* U+002242: MINUS TILDE*/
+ 0x2243, /* U+002243: ASYMPTOTICALLY EQUAL TO*/
+ 0x2244, /* U+002244: NOT ASYMPTOTICALLY EQUAL TO*/
+ 0x2245, /* U+002245: APPROXIMATELY EQUAL TO*/
+ 0x2246, /* U+002246: APPROXIMATELY BUT NOT ACTUALLY EQUAL TO*/
+ 0x2247, /* U+002247: NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO*/
+ 0x2248, /* U+002248: ALMOST EQUAL TO*/
+ 0x2249, /* U+002249: NOT ALMOST EQUAL TO*/
+ 0x224a, /* U+00224a: ALMOST EQUAL OR EQUAL TO*/
+ 0x224b, /* U+00224b: TRIPLE TILDE*/
+ 0x224c, /* U+00224c: ALL EQUAL TO*/
+ 0x224d, /* U+00224d: EQUIVALENT TO*/
+ 0x224e, /* U+00224e: GEOMETRICALLY EQUIVALENT TO*/
+ 0x224f, /* U+00224f: DIFFERENCE BETWEEN*/
+ 0x2250, /* U+002250: APPROACHES THE LIMIT*/
+ 0x2251, /* U+002251: GEOMETRICALLY EQUAL TO*/
+ 0x2252, /* U+002252: APPROXIMATELY EQUAL TO OR THE IMAGE OF*/
+ 0x2253, /* U+002253: IMAGE OF OR APPROXIMATELY EQUAL TO*/
+ 0x2254, /* U+002254: COLON EQUALS*/
+ 0x2255, /* U+002255: EQUALS COLON*/
+ 0x2256, /* U+002256: RING IN EQUAL TO*/
+ 0x2257, /* U+002257: RING EQUAL TO*/
+ 0x2258, /* U+002258: CORRESPONDS TO*/
+ 0x2259, /* U+002259: ESTIMATES*/
+ 0x225a, /* U+00225a: EQUIANGULAR TO*/
+ 0x225b, /* U+00225b: STAR EQUALS*/
+ 0x225c, /* U+00225c: DELTA EQUAL TO*/
+ 0x225d, /* U+00225d: EQUAL TO BY DEFINITION*/
+ 0x225e, /* U+00225e: MEASURED BY*/
+ 0x225f, /* U+00225f: QUESTIONED EQUAL TO*/
+ 0x2260, /* U+002260: NOT EQUAL TO*/
+ 0x2261, /* U+002261: IDENTICAL TO*/
+ 0x2262, /* U+002262: NOT IDENTICAL TO*/
+ 0x2263, /* U+002263: STRICTLY EQUIVALENT TO*/
+ 0x2264, /* U+002264: LESS-THAN OR EQUAL TO*/
+ 0x2265, /* U+002265: GREATER-THAN OR EQUAL TO*/
+ 0x2266, /* U+002266: LESS-THAN OVER EQUAL TO*/
+ 0x2267, /* U+002267: GREATER-THAN OVER EQUAL TO*/
+ 0x2268, /* U+002268: LESS-THAN BUT NOT EQUAL TO*/
+ 0x2269, /* U+002269: GREATER-THAN BUT NOT EQUAL TO*/
+ 0x226a, /* U+00226a: MUCH LESS-THAN*/
+ 0x226b, /* U+00226b: MUCH GREATER-THAN*/
+ 0x226c, /* U+00226c: BETWEEN*/
+ 0x226d, /* U+00226d: NOT EQUIVALENT TO*/
+ 0x226e, /* U+00226e: NOT LESS-THAN*/
+ 0x226f, /* U+00226f: NOT GREATER-THAN*/
+ 0x2270, /* U+002270: NEITHER LESS-THAN NOR EQUAL TO*/
+ 0x2271, /* U+002271: NEITHER GREATER-THAN NOR EQUAL TO*/
+ 0x2272, /* U+002272: LESS-THAN OR EQUIVALENT TO*/
+ 0x2273, /* U+002273: GREATER-THAN OR EQUIVALENT TO*/
+ 0x2274, /* U+002274: NEITHER LESS-THAN NOR EQUIVALENT TO*/
+ 0x2275, /* U+002275: NEITHER GREATER-THAN NOR EQUIVALENT TO*/
+ 0x2276, /* U+002276: LESS-THAN OR GREATER-THAN*/
+ 0x2277, /* U+002277: GREATER-THAN OR LESS-THAN*/
+ 0x2278, /* U+002278: NEITHER LESS-THAN NOR GREATER-THAN*/
+ 0x2279, /* U+002279: NEITHER GREATER-THAN NOR LESS-THAN*/
+ 0x227a, /* U+00227a: PRECEDES*/
+ 0x227b, /* U+00227b: SUCCEEDS*/
+ 0x227c, /* U+00227c: PRECEDES OR EQUAL TO*/
+ 0x227d, /* U+00227d: SUCCEEDS OR EQUAL TO*/
+ 0x227e, /* U+00227e: PRECEDES OR EQUIVALENT TO*/
+ 0x227f, /* U+00227f: SUCCEEDS OR EQUIVALENT TO*/
+ 0x2280, /* U+002280: DOES NOT PRECEDE*/
+ 0x2281, /* U+002281: DOES NOT SUCCEED*/
+ 0x2282, /* U+002282: SUBSET OF*/
+ 0x2283, /* U+002283: SUPERSET OF*/
+ 0x2284, /* U+002284: NOT A SUBSET OF*/
+ 0x2285, /* U+002285: NOT A SUPERSET OF*/
+ 0x2286, /* U+002286: SUBSET OF OR EQUAL TO*/
+ 0x2287, /* U+002287: SUPERSET OF OR EQUAL TO*/
+ 0x2288, /* U+002288: NEITHER A SUBSET OF NOR EQUAL TO*/
+ 0x2289, /* U+002289: NEITHER A SUPERSET OF NOR EQUAL TO*/
+ 0x228a, /* U+00228a: SUBSET OF WITH NOT EQUAL TO*/
+ 0x228b, /* U+00228b: SUPERSET OF WITH NOT EQUAL TO*/
+ 0x228c, /* U+00228c: MULTISET*/
+ 0x228d, /* U+00228d: MULTISET MULTIPLICATION*/
+ 0x228e, /* U+00228e: MULTISET UNION*/
+ 0x228f, /* U+00228f: SQUARE IMAGE OF*/
+ 0x2290, /* U+002290: SQUARE ORIGINAL OF*/
+ 0x2291, /* U+002291: SQUARE IMAGE OF OR EQUAL TO*/
+ 0x2292, /* U+002292: SQUARE ORIGINAL OF OR EQUAL TO*/
+ 0x2293, /* U+002293: SQUARE CAP*/
+ 0x2294, /* U+002294: SQUARE CUP*/
+ 0x2295, /* U+002295: CIRCLED PLUS*/
+ 0x2296, /* U+002296: CIRCLED MINUS*/
+ 0x2297, /* U+002297: CIRCLED TIMES*/
+ 0x2298, /* U+002298: CIRCLED DIVISION SLASH*/
+ 0x2299, /* U+002299: CIRCLED DOT OPERATOR*/
+ 0x229a, /* U+00229a: CIRCLED RING OPERATOR*/
+ 0x229b, /* U+00229b: CIRCLED ASTERISK OPERATOR*/
+ 0x229c, /* U+00229c: CIRCLED EQUALS*/
+ 0x229d, /* U+00229d: CIRCLED DASH*/
+ 0x229e, /* U+00229e: SQUARED PLUS*/
+ 0x229f, /* U+00229f: SQUARED MINUS*/
+ 0x22a0, /* U+0022a0: SQUARED TIMES*/
+ 0x22a1, /* U+0022a1: SQUARED DOT OPERATOR*/
+ 0x22a2, /* U+0022a2: RIGHT TACK*/
+ 0x22a3, /* U+0022a3: LEFT TACK*/
+ 0x22a4, /* U+0022a4: DOWN TACK*/
+ 0x22a5, /* U+0022a5: UP TACK*/
+ 0x22a6, /* U+0022a6: ASSERTION*/
+ 0x22a7, /* U+0022a7: MODELS*/
+ 0x22a8, /* U+0022a8: TRUE*/
+ 0x22a9, /* U+0022a9: FORCES*/
+ 0x22aa, /* U+0022aa: TRIPLE VERTICAL BAR RIGHT TURNSTILE*/
+ 0x22ab, /* U+0022ab: DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE*/
+ 0x22ac, /* U+0022ac: DOES NOT PROVE*/
+ 0x22ad, /* U+0022ad: NOT TRUE*/
+ 0x22ae, /* U+0022ae: DOES NOT FORCE*/
+ 0x22af, /* U+0022af: NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE*/
+ 0x22b0, /* U+0022b0: PRECEDES UNDER RELATION*/
+ 0x22b1, /* U+0022b1: SUCCEEDS UNDER RELATION*/
+ 0x22b2, /* U+0022b2: NORMAL SUBGROUP OF*/
+ 0x22b3, /* U+0022b3: CONTAINS AS NORMAL SUBGROUP*/
+ 0x22b4, /* U+0022b4: NORMAL SUBGROUP OF OR EQUAL TO*/
+ 0x22b5, /* U+0022b5: CONTAINS AS NORMAL SUBGROUP OR EQUAL TO*/
+ 0x22b6, /* U+0022b6: ORIGINAL OF*/
+ 0x22b7, /* U+0022b7: IMAGE OF*/
+ 0x22b8, /* U+0022b8: MULTIMAP*/
+ 0x22b9, /* U+0022b9: HERMITIAN CONJUGATE MATRIX*/
+ 0x22ba, /* U+0022ba: INTERCALATE*/
+ 0x22bb, /* U+0022bb: XOR*/
+ 0x22bc, /* U+0022bc: NAND*/
+ 0x22bd, /* U+0022bd: NOR*/
+ 0x22be, /* U+0022be: RIGHT ANGLE WITH ARC*/
+ 0x22bf, /* U+0022bf: RIGHT TRIANGLE*/
+ 0x22c0, /* U+0022c0: N-ARY LOGICAL AND*/
+ 0x22c1, /* U+0022c1: N-ARY LOGICAL OR*/
+ 0x22c2, /* U+0022c2: N-ARY INTERSECTION*/
+ 0x22c3, /* U+0022c3: N-ARY UNION*/
+ 0x22c4, /* U+0022c4: DIAMOND OPERATOR*/
+ 0x22c5, /* U+0022c5: DOT OPERATOR*/
+ 0x22c6, /* U+0022c6: STAR OPERATOR*/
+ 0x22c7, /* U+0022c7: DIVISION TIMES*/
+ 0x22c8, /* U+0022c8: BOWTIE*/
+ 0x22c9, /* U+0022c9: LEFT NORMAL FACTOR SEMIDIRECT PRODUCT*/
+ 0x22ca, /* U+0022ca: RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT*/
+ 0x22cb, /* U+0022cb: LEFT SEMIDIRECT PRODUCT*/
+ 0x22cc, /* U+0022cc: RIGHT SEMIDIRECT PRODUCT*/
+ 0x22cd, /* U+0022cd: REVERSED TILDE EQUALS*/
+ 0x22ce, /* U+0022ce: CURLY LOGICAL OR*/
+ 0x22cf, /* U+0022cf: CURLY LOGICAL AND*/
+ 0x22d0, /* U+0022d0: DOUBLE SUBSET*/
+ 0x22d1, /* U+0022d1: DOUBLE SUPERSET*/
+ 0x22d2, /* U+0022d2: DOUBLE INTERSECTION*/
+ 0x22d3, /* U+0022d3: DOUBLE UNION*/
+ 0x22d4, /* U+0022d4: PITCHFORK*/
+ 0x22d5, /* U+0022d5: EQUAL AND PARALLEL TO*/
+ 0x22d6, /* U+0022d6: LESS-THAN WITH DOT*/
+ 0x22d7, /* U+0022d7: GREATER-THAN WITH DOT*/
+ 0x22d8, /* U+0022d8: VERY MUCH LESS-THAN*/
+ 0x22d9, /* U+0022d9: VERY MUCH GREATER-THAN*/
+ 0x22da, /* U+0022da: LESS-THAN EQUAL TO OR GREATER-THAN*/
+ 0x22db, /* U+0022db: GREATER-THAN EQUAL TO OR LESS-THAN*/
+ 0x22dc, /* U+0022dc: EQUAL TO OR LESS-THAN*/
+ 0x22dd, /* U+0022dd: EQUAL TO OR GREATER-THAN*/
+ 0x22de, /* U+0022de: EQUAL TO OR PRECEDES*/
+ 0x22df, /* U+0022df: EQUAL TO OR SUCCEEDS*/
+ 0x22e0, /* U+0022e0: DOES NOT PRECEDE OR EQUAL*/
+ 0x22e1, /* U+0022e1: DOES NOT SUCCEED OR EQUAL*/
+ 0x22e2, /* U+0022e2: NOT SQUARE IMAGE OF OR EQUAL TO*/
+ 0x22e3, /* U+0022e3: NOT SQUARE ORIGINAL OF OR EQUAL TO*/
+ 0x22e4, /* U+0022e4: SQUARE IMAGE OF OR NOT EQUAL TO*/
+ 0x22e5, /* U+0022e5: SQUARE ORIGINAL OF OR NOT EQUAL TO*/
+ 0x22e6, /* U+0022e6: LESS-THAN BUT NOT EQUIVALENT TO*/
+ 0x22e7, /* U+0022e7: GREATER-THAN BUT NOT EQUIVALENT TO*/
+ 0x22e8, /* U+0022e8: PRECEDES BUT NOT EQUIVALENT TO*/
+ 0x22e9, /* U+0022e9: SUCCEEDS BUT NOT EQUIVALENT TO*/
+ 0x22ea, /* U+0022ea: NOT NORMAL SUBGROUP OF*/
+ 0x22eb, /* U+0022eb: DOES NOT CONTAIN AS NORMAL SUBGROUP*/
+ 0x22ec, /* U+0022ec: NOT NORMAL SUBGROUP OF OR EQUAL TO*/
+ 0x22ed, /* U+0022ed: DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL*/
+ 0x22ee, /* U+0022ee: VERTICAL ELLIPSIS*/
+ 0x22ef, /* U+0022ef: MIDLINE HORIZONTAL ELLIPSIS*/
+ 0x22f0, /* U+0022f0: UP RIGHT DIAGONAL ELLIPSIS*/
+ 0x22f1, /* U+0022f1: DOWN RIGHT DIAGONAL ELLIPSIS*/
+ 0x22f2, /* U+0022f2: ELEMENT OF WITH LONG HORIZONTAL STROKE*/
+ 0x22f3, /* U+0022f3: ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE*/
+ 0x22f4, /* U+0022f4: SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE*/
+ 0x22f5, /* U+0022f5: ELEMENT OF WITH DOT ABOVE*/
+ 0x22f6, /* U+0022f6: ELEMENT OF WITH OVERBAR*/
+ 0x22f7, /* U+0022f7: SMALL ELEMENT OF WITH OVERBAR*/
+ 0x22f8, /* U+0022f8: ELEMENT OF WITH UNDERBAR*/
+ 0x22f9, /* U+0022f9: ELEMENT OF WITH TWO HORIZONTAL STROKES*/
+ 0x22fa, /* U+0022fa: CONTAINS WITH LONG HORIZONTAL STROKE*/
+ 0x22fb, /* U+0022fb: CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE*/
+ 0x22fc, /* U+0022fc: SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE*/
+ 0x22fd, /* U+0022fd: CONTAINS WITH OVERBAR*/
+ 0x22fe, /* U+0022fe: SMALL CONTAINS WITH OVERBAR*/
+ 0x22ff, /* U+0022ff: Z NOTATION BAG MEMBERSHIP*/
+ 0x2300, /* U+002300: DIAMETER SIGN*/
+ 0x2301, /* U+002301: ELECTRIC ARROW*/
+ 0x2302, /* U+002302: HOUSE*/
+ 0x2303, /* U+002303: UP ARROWHEAD*/
+ 0x2304, /* U+002304: DOWN ARROWHEAD*/
+ 0x2305, /* U+002305: PROJECTIVE*/
+ 0x2306, /* U+002306: PERSPECTIVE*/
+ 0x2307, /* U+002307: WAVY LINE*/
+ 0x2308, /* U+002308: LEFT CEILING*/
+ 0x2309, /* U+002309: RIGHT CEILING*/
+ 0x230a, /* U+00230a: LEFT FLOOR*/
+ 0x230b, /* U+00230b: RIGHT FLOOR*/
+ 0x230c, /* U+00230c: BOTTOM RIGHT CROP*/
+ 0x230d, /* U+00230d: BOTTOM LEFT CROP*/
+ 0x230e, /* U+00230e: TOP RIGHT CROP*/
+ 0x230f, /* U+00230f: TOP LEFT CROP*/
+ 0x2310, /* U+002310: REVERSED NOT SIGN*/
+ 0x2311, /* U+002311: SQUARE LOZENGE*/
+ 0x2312, /* U+002312: ARC*/
+ 0x2313, /* U+002313: SEGMENT*/
+ 0x2314, /* U+002314: SECTOR*/
+ 0x2315, /* U+002315: TELEPHONE RECORDER*/
+ 0x2316, /* U+002316: POSITION INDICATOR*/
+ 0x2317, /* U+002317: VIEWDATA SQUARE*/
+ 0x2318, /* U+002318: PLACE OF INTEREST SIGN*/
+ 0x2319, /* U+002319: TURNED NOT SIGN*/
+ 0x231a, /* U+00231a: WATCH*/
+ 0x231b, /* U+00231b: HOURGLASS*/
+ 0x231c, /* U+00231c: TOP LEFT CORNER*/
+ 0x231d, /* U+00231d: TOP RIGHT CORNER*/
+ 0x231e, /* U+00231e: BOTTOM LEFT CORNER*/
+ 0x231f, /* U+00231f: BOTTOM RIGHT CORNER*/
+ 0x2320, /* U+002320: TOP HALF INTEGRAL*/
+ 0x2321, /* U+002321: BOTTOM HALF INTEGRAL*/
+ 0x2322, /* U+002322: FROWN*/
+ 0x2323, /* U+002323: SMILE*/
+ 0x2324, /* U+002324: UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS*/
+ 0x2325, /* U+002325: OPTION KEY*/
+ 0x2326, /* U+002326: ERASE TO THE RIGHT*/
+ 0x2327, /* U+002327: X IN A RECTANGLE BOX*/
+ 0x2328, /* U+002328: KEYBOARD*/
+ 0x2329, /* U+002329: LEFT-POINTING ANGLE BRACKET*/
+ 0x232a, /* U+00232a: RIGHT-POINTING ANGLE BRACKET*/
+ 0x232b, /* U+00232b: ERASE TO THE LEFT*/
+ 0x232c, /* U+00232c: BENZENE RING*/
+ 0x232d, /* U+00232d: CYLINDRICITY*/
+ 0x232e, /* U+00232e: ALL AROUND-PROFILE*/
+ 0x232f, /* U+00232f: SYMMETRY*/
+ 0x2330, /* U+002330: TOTAL RUNOUT*/
+ 0x2331, /* U+002331: DIMENSION ORIGIN*/
+ 0x2332, /* U+002332: CONICAL TAPER*/
+ 0x2333, /* U+002333: SLOPE*/
+ 0x2334, /* U+002334: COUNTERBORE*/
+ 0x2335, /* U+002335: COUNTERSINK*/
+ 0x2336, /* U+002336: APL FUNCTIONAL SYMBOL I-BEAM*/
+ 0x2337, /* U+002337: APL FUNCTIONAL SYMBOL SQUISH QUAD*/
+ 0x2338, /* U+002338: APL FUNCTIONAL SYMBOL QUAD EQUAL*/
+ 0x2339, /* U+002339: APL FUNCTIONAL SYMBOL QUAD DIVIDE*/
+ 0x233a, /* U+00233a: APL FUNCTIONAL SYMBOL QUAD DIAMOND*/
+ 0x233b, /* U+00233b: APL FUNCTIONAL SYMBOL QUAD JOT*/
+ 0x233c, /* U+00233c: APL FUNCTIONAL SYMBOL QUAD CIRCLE*/
+ 0x233d, /* U+00233d: APL FUNCTIONAL SYMBOL CIRCLE STILE*/
+ 0x233e, /* U+00233e: APL FUNCTIONAL SYMBOL CIRCLE JOT*/
+ 0x233f, /* U+00233f: APL FUNCTIONAL SYMBOL SLASH BAR*/
+ 0x2340, /* U+002340: APL FUNCTIONAL SYMBOL BACKSLASH BAR*/
+ 0x2341, /* U+002341: APL FUNCTIONAL SYMBOL QUAD SLASH*/
+ 0x2342, /* U+002342: APL FUNCTIONAL SYMBOL QUAD BACKSLASH*/
+ 0x2343, /* U+002343: APL FUNCTIONAL SYMBOL QUAD LESS-THAN*/
+ 0x2344, /* U+002344: APL FUNCTIONAL SYMBOL QUAD GREATER-THAN*/
+ 0x2345, /* U+002345: APL FUNCTIONAL SYMBOL LEFTWARDS VANE*/
+ 0x2346, /* U+002346: APL FUNCTIONAL SYMBOL RIGHTWARDS VANE*/
+ 0x2347, /* U+002347: APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW*/
+ 0x2348, /* U+002348: APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW*/
+ 0x2349, /* U+002349: APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH*/
+ 0x234a, /* U+00234a: APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR*/
+ 0x234b, /* U+00234b: APL FUNCTIONAL SYMBOL DELTA STILE*/
+ 0x234c, /* U+00234c: APL FUNCTIONAL SYMBOL QUAD DOWN CARET*/
+ 0x234d, /* U+00234d: APL FUNCTIONAL SYMBOL QUAD DELTA*/
+ 0x234e, /* U+00234e: APL FUNCTIONAL SYMBOL DOWN TACK JOT*/
+ 0x234f, /* U+00234f: APL FUNCTIONAL SYMBOL UPWARDS VANE*/
+ 0x2350, /* U+002350: APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW*/
+ 0x2351, /* U+002351: APL FUNCTIONAL SYMBOL UP TACK OVERBAR*/
+ 0x2352, /* U+002352: APL FUNCTIONAL SYMBOL DEL STILE*/
+ 0x2353, /* U+002353: APL FUNCTIONAL SYMBOL QUAD UP CARET*/
+ 0x2354, /* U+002354: APL FUNCTIONAL SYMBOL QUAD DEL*/
+ 0x2355, /* U+002355: APL FUNCTIONAL SYMBOL UP TACK JOT*/
+ 0x2356, /* U+002356: APL FUNCTIONAL SYMBOL DOWNWARDS VANE*/
+ 0x2357, /* U+002357: APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW*/
+ 0x2358, /* U+002358: APL FUNCTIONAL SYMBOL QUOTE UNDERBAR*/
+ 0x2359, /* U+002359: APL FUNCTIONAL SYMBOL DELTA UNDERBAR*/
+ 0x235a, /* U+00235a: APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR*/
+ 0x235b, /* U+00235b: APL FUNCTIONAL SYMBOL JOT UNDERBAR*/
+ 0x235c, /* U+00235c: APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR*/
+ 0x235d, /* U+00235d: APL FUNCTIONAL SYMBOL UP SHOE JOT*/
+ 0x235e, /* U+00235e: APL FUNCTIONAL SYMBOL QUOTE QUAD*/
+ 0x235f, /* U+00235f: APL FUNCTIONAL SYMBOL CIRCLE STAR*/
+ 0x2360, /* U+002360: APL FUNCTIONAL SYMBOL QUAD COLON*/
+ 0x2361, /* U+002361: APL FUNCTIONAL SYMBOL UP TACK DIAERESIS*/
+ 0x2362, /* U+002362: APL FUNCTIONAL SYMBOL DEL DIAERESIS*/
+ 0x2363, /* U+002363: APL FUNCTIONAL SYMBOL STAR DIAERESIS*/
+ 0x2364, /* U+002364: APL FUNCTIONAL SYMBOL JOT DIAERESIS*/
+ 0x2365, /* U+002365: APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS*/
+ 0x2366, /* U+002366: APL FUNCTIONAL SYMBOL DOWN SHOE STILE*/
+ 0x2367, /* U+002367: APL FUNCTIONAL SYMBOL LEFT SHOE STILE*/
+ 0x2368, /* U+002368: APL FUNCTIONAL SYMBOL TILDE DIAERESIS*/
+ 0x2369, /* U+002369: APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS*/
+ 0x236a, /* U+00236a: APL FUNCTIONAL SYMBOL COMMA BAR*/
+ 0x236b, /* U+00236b: APL FUNCTIONAL SYMBOL DEL TILDE*/
+ 0x236c, /* U+00236c: APL FUNCTIONAL SYMBOL ZILDE*/
+ 0x236d, /* U+00236d: APL FUNCTIONAL SYMBOL STILE TILDE*/
+ 0x236e, /* U+00236e: APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR*/
+ 0x236f, /* U+00236f: APL FUNCTIONAL SYMBOL QUAD NOT EQUAL*/
+ 0x2370, /* U+002370: APL FUNCTIONAL SYMBOL QUAD QUESTION*/
+ 0x2371, /* U+002371: APL FUNCTIONAL SYMBOL DOWN CARET TILDE*/
+ 0x2372, /* U+002372: APL FUNCTIONAL SYMBOL UP CARET TILDE*/
+ 0x2373, /* U+002373: APL FUNCTIONAL SYMBOL IOTA*/
+ 0x2374, /* U+002374: APL FUNCTIONAL SYMBOL RHO*/
+ 0x2375, /* U+002375: APL FUNCTIONAL SYMBOL OMEGA*/
+ 0x2376, /* U+002376: APL FUNCTIONAL SYMBOL ALPHA UNDERBAR*/
+ 0x2377, /* U+002377: APL FUNCTIONAL SYMBOL EPSILON UNDERBAR*/
+ 0x2378, /* U+002378: APL FUNCTIONAL SYMBOL IOTA UNDERBAR*/
+ 0x2379, /* U+002379: APL FUNCTIONAL SYMBOL OMEGA UNDERBAR*/
+ 0x237a, /* U+00237a: APL FUNCTIONAL SYMBOL ALPHA*/
+ 0x237b, /* U+00237b: NOT CHECK MARK*/
+ 0x237c, /* U+00237c: RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW*/
+ 0x237d, /* U+00237d: SHOULDERED OPEN BOX*/
+ 0x237e, /* U+00237e: BELL SYMBOL*/
+ 0x237f, /* U+00237f: VERTICAL LINE WITH MIDDLE DOT*/
+ 0x2380, /* U+002380: INSERTION SYMBOL*/
+ 0x2381, /* U+002381: CONTINUOUS UNDERLINE SYMBOL*/
+ 0x2382, /* U+002382: DISCONTINUOUS UNDERLINE SYMBOL*/
+ 0x2383, /* U+002383: EMPHASIS SYMBOL*/
+ 0x2384, /* U+002384: COMPOSITION SYMBOL*/
+ 0x2385, /* U+002385: WHITE SQUARE WITH CENTRE VERTICAL LINE*/
+ 0x2386, /* U+002386: ENTER SYMBOL*/
+ 0x2387, /* U+002387: ALTERNATIVE KEY SYMBOL*/
+ 0x2388, /* U+002388: HELM SYMBOL*/
+ 0x2389, /* U+002389: CIRCLED HORIZONTAL BAR WITH NOTCH*/
+ 0x238a, /* U+00238a: CIRCLED TRIANGLE DOWN*/
+ 0x238b, /* U+00238b: BROKEN CIRCLE WITH NORTHWEST ARROW*/
+ 0x238c, /* U+00238c: UNDO SYMBOL*/
+ 0x238d, /* U+00238d: MONOSTABLE SYMBOL*/
+ 0x238e, /* U+00238e: HYSTERESIS SYMBOL*/
+ 0x238f, /* U+00238f: OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL*/
+ 0x2390, /* U+002390: OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL*/
+ 0x2391, /* U+002391: PASSIVE-PULL-DOWN-OUTPUT SYMBOL*/
+ 0x2392, /* U+002392: PASSIVE-PULL-UP-OUTPUT SYMBOL*/
+ 0x2393, /* U+002393: DIRECT CURRENT SYMBOL FORM TWO*/
+ 0x2394, /* U+002394: SOFTWARE-FUNCTION SYMBOL*/
+ 0x2395, /* U+002395: APL FUNCTIONAL SYMBOL QUAD*/
+ 0x2396, /* U+002396: DECIMAL SEPARATOR KEY SYMBOL*/
+ 0x2397, /* U+002397: PREVIOUS PAGE*/
+ 0x2398, /* U+002398: NEXT PAGE*/
+ 0x2399, /* U+002399: PRINT SCREEN SYMBOL*/
+ 0x239a, /* U+00239a: CLEAR SCREEN SYMBOL*/
+ 0x239b, /* U+00239b: LEFT PARENTHESIS UPPER HOOK*/
+ 0x239c, /* U+00239c: LEFT PARENTHESIS EXTENSION*/
+ 0x239d, /* U+00239d: LEFT PARENTHESIS LOWER HOOK*/
+ 0x239e, /* U+00239e: RIGHT PARENTHESIS UPPER HOOK*/
+ 0x239f, /* U+00239f: RIGHT PARENTHESIS EXTENSION*/
+ 0x23a0, /* U+0023a0: RIGHT PARENTHESIS LOWER HOOK*/
+ 0x23a1, /* U+0023a1: LEFT SQUARE BRACKET UPPER CORNER*/
+ 0x23a2, /* U+0023a2: LEFT SQUARE BRACKET EXTENSION*/
+ 0x23a3, /* U+0023a3: LEFT SQUARE BRACKET LOWER CORNER*/
+ 0x23a4, /* U+0023a4: RIGHT SQUARE BRACKET UPPER CORNER*/
+ 0x23a5, /* U+0023a5: RIGHT SQUARE BRACKET EXTENSION*/
+ 0x23a6, /* U+0023a6: RIGHT SQUARE BRACKET LOWER CORNER*/
+ 0x23a7, /* U+0023a7: LEFT CURLY BRACKET UPPER HOOK*/
+ 0x23a8, /* U+0023a8: LEFT CURLY BRACKET MIDDLE PIECE*/
+ 0x23a9, /* U+0023a9: LEFT CURLY BRACKET LOWER HOOK*/
+ 0x23aa, /* U+0023aa: CURLY BRACKET EXTENSION*/
+ 0x23ab, /* U+0023ab: RIGHT CURLY BRACKET UPPER HOOK*/
+ 0x23ac, /* U+0023ac: RIGHT CURLY BRACKET MIDDLE PIECE*/
+ 0x23ad, /* U+0023ad: RIGHT CURLY BRACKET LOWER HOOK*/
+ 0x23ae, /* U+0023ae: INTEGRAL EXTENSION*/
+ 0x23af, /* U+0023af: HORIZONTAL LINE EXTENSION*/
+ 0x23b0, /* U+0023b0: UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION*/
+ 0x23b1, /* U+0023b1: UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION*/
+ 0x23b2, /* U+0023b2: SUMMATION TOP*/
+ 0x23b3, /* U+0023b3: SUMMATION BOTTOM*/
+ 0x23b4, /* U+0023b4: TOP SQUARE BRACKET*/
+ 0x23b5, /* U+0023b5: BOTTOM SQUARE BRACKET*/
+ 0x23b6, /* U+0023b6: BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET*/
+ 0x23b7, /* U+0023b7: RADICAL SYMBOL BOTTOM*/
+ 0x23b8, /* U+0023b8: LEFT VERTICAL BOX LINE*/
+ 0x23b9, /* U+0023b9: RIGHT VERTICAL BOX LINE*/
+ 0x23ba, /* U+0023ba: HORIZONTAL SCAN LINE-1*/
+ 0x23bb, /* U+0023bb: HORIZONTAL SCAN LINE-3*/
+ 0x23bc, /* U+0023bc: HORIZONTAL SCAN LINE-7*/
+ 0x23bd, /* U+0023bd: HORIZONTAL SCAN LINE-9*/
+ 0x23be, /* U+0023be: DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT*/
+ 0x23bf, /* U+0023bf: DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT*/
+ 0x23c0, /* U+0023c0: DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE*/
+ 0x23c1, /* U+0023c1: DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE*/
+ 0x23c2, /* U+0023c2: DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE*/
+ 0x23c3, /* U+0023c3: DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE*/
+ 0x23c4, /* U+0023c4: DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE*/
+ 0x23c5, /* U+0023c5: DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE*/
+ 0x23c6, /* U+0023c6: DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE*/
+ 0x23c7, /* U+0023c7: DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE*/
+ 0x23c8, /* U+0023c8: DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE*/
+ 0x23c9, /* U+0023c9: DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL*/
+ 0x23ca, /* U+0023ca: DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL*/
+ 0x23cb, /* U+0023cb: DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT*/
+ 0x23cc, /* U+0023cc: DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT*/
+ 0x23cd, /* U+0023cd: SQUARE FOOT*/
+ 0x23ce, /* U+0023ce: RETURN SYMBOL*/
+ 0x23cf, /* U+0023cf: EJECT SYMBOL*/
+ 0x23d0, /* U+0023d0: VERTICAL LINE EXTENSION*/
+ 0x23d1, /* U+0023d1: METRICAL BREVE*/
+ 0x23d2, /* U+0023d2: METRICAL LONG OVER SHORT*/
+ 0x23d3, /* U+0023d3: METRICAL SHORT OVER LONG*/
+ 0x23d4, /* U+0023d4: METRICAL LONG OVER TWO SHORTS*/
+ 0x23d5, /* U+0023d5: METRICAL TWO SHORTS OVER LONG*/
+ 0x23d6, /* U+0023d6: METRICAL TWO SHORTS JOINED*/
+ 0x23d7, /* U+0023d7: METRICAL TRISEME*/
+ 0x23d8, /* U+0023d8: METRICAL TETRASEME*/
+ 0x23d9, /* U+0023d9: METRICAL PENTASEME*/
+ 0x23da, /* U+0023da: EARTH GROUND*/
+ 0x23db, /* U+0023db: FUSE*/
+ 0x23dc, /* U+0023dc: TOP PARENTHESIS*/
+ 0x23dd, /* U+0023dd: BOTTOM PARENTHESIS*/
+ 0x23de, /* U+0023de: TOP CURLY BRACKET*/
+ 0x23df, /* U+0023df: BOTTOM CURLY BRACKET*/
+ 0x23e0, /* U+0023e0: TOP TORTOISE SHELL BRACKET*/
+ 0x23e1, /* U+0023e1: BOTTOM TORTOISE SHELL BRACKET*/
+ 0x23e2, /* U+0023e2: WHITE TRAPEZIUM*/
+ 0x23e3, /* U+0023e3: BENZENE RING WITH CIRCLE*/
+ 0x23e4, /* U+0023e4: STRAIGHTNESS*/
+ 0x23e5, /* U+0023e5: FLATNESS*/
+ 0x23e6, /* U+0023e6: AC CURRENT*/
+ 0x23e7, /* U+0023e7: ELECTRICAL INTERSECTION*/
+ 0x23e8, /* U+0023e8: DECIMAL EXPONENT SYMBOL*/
+ 0x23e9, /* U+0023e9: BLACK RIGHT-POINTING DOUBLE TRIANGLE*/
+ 0x23ea, /* U+0023ea: BLACK LEFT-POINTING DOUBLE TRIANGLE*/
+ 0x23eb, /* U+0023eb: BLACK UP-POINTING DOUBLE TRIANGLE*/
+ 0x23ec, /* U+0023ec: BLACK DOWN-POINTING DOUBLE TRIANGLE*/
+ 0x23ed, /* U+0023ed: BLACK RIGHT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR*/
+ 0x23ee, /* U+0023ee: BLACK LEFT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR*/
+ 0x23ef, /* U+0023ef: BLACK RIGHT-POINTING TRIANGLE WITH DOUBLE VERTICAL BAR*/
+ 0x23f0, /* U+0023f0: ALARM CLOCK*/
+ 0x23f1, /* U+0023f1: STOPWATCH*/
+ 0x23f2, /* U+0023f2: TIMER CLOCK*/
+ 0x23f3, /* U+0023f3: HOURGLASS WITH FLOWING SAND*/
+ 0x23f4, /* U+0023f4: */
+ 0x23f5, /* U+0023f5: */
+ 0x23f6, /* U+0023f6: */
+ 0x23f7, /* U+0023f7: */
+ 0x23f8, /* U+0023f8: */
+ 0x23f9, /* U+0023f9: */
+ 0x23fa, /* U+0023fa: */
+ 0x23fb, /* U+0023fb: */
+ 0x23fc, /* U+0023fc: */
+ 0x23fd, /* U+0023fd: */
+ 0x23fe, /* U+0023fe: */
+ 0x23ff, /* U+0023ff: */
+ 0x2400, /* U+002400: SYMBOL FOR NULL*/
+ 0x2401, /* U+002401: SYMBOL FOR START OF HEADING*/
+ 0x2402, /* U+002402: SYMBOL FOR START OF TEXT*/
+ 0x2403, /* U+002403: SYMBOL FOR END OF TEXT*/
+ 0x2404, /* U+002404: SYMBOL FOR END OF TRANSMISSION*/
+ 0x2405, /* U+002405: SYMBOL FOR ENQUIRY*/
+ 0x2406, /* U+002406: SYMBOL FOR ACKNOWLEDGE*/
+ 0x2407, /* U+002407: SYMBOL FOR BELL*/
+ 0x2408, /* U+002408: SYMBOL FOR BACKSPACE*/
+ 0x2409, /* U+002409: SYMBOL FOR HORIZONTAL TABULATION*/
+ 0x240a, /* U+00240a: SYMBOL FOR LINE FEED*/
+ 0x240b, /* U+00240b: SYMBOL FOR VERTICAL TABULATION*/
+ 0x240c, /* U+00240c: SYMBOL FOR FORM FEED*/
+ 0x240d, /* U+00240d: SYMBOL FOR CARRIAGE RETURN*/
+ 0x240e, /* U+00240e: SYMBOL FOR SHIFT OUT*/
+ 0x240f, /* U+00240f: SYMBOL FOR SHIFT IN*/
+ 0x2410, /* U+002410: SYMBOL FOR DATA LINK ESCAPE*/
+ 0x2411, /* U+002411: SYMBOL FOR DEVICE CONTROL ONE*/
+ 0x2412, /* U+002412: SYMBOL FOR DEVICE CONTROL TWO*/
+ 0x2413, /* U+002413: SYMBOL FOR DEVICE CONTROL THREE*/
+ 0x2414, /* U+002414: SYMBOL FOR DEVICE CONTROL FOUR*/
+ 0x2415, /* U+002415: SYMBOL FOR NEGATIVE ACKNOWLEDGE*/
+ 0x2416, /* U+002416: SYMBOL FOR SYNCHRONOUS IDLE*/
+ 0x2417, /* U+002417: SYMBOL FOR END OF TRANSMISSION BLOCK*/
+ 0x2418, /* U+002418: SYMBOL FOR CANCEL*/
+ 0x2419, /* U+002419: SYMBOL FOR END OF MEDIUM*/
+ 0x241a, /* U+00241a: SYMBOL FOR SUBSTITUTE*/
+ 0x241b, /* U+00241b: SYMBOL FOR ESCAPE*/
+ 0x241c, /* U+00241c: SYMBOL FOR FILE SEPARATOR*/
+ 0x241d, /* U+00241d: SYMBOL FOR GROUP SEPARATOR*/
+ 0x241e, /* U+00241e: SYMBOL FOR RECORD SEPARATOR*/
+ 0x241f, /* U+00241f: SYMBOL FOR UNIT SEPARATOR*/
+ 0x2420, /* U+002420: SYMBOL FOR SPACE*/
+ 0x2421, /* U+002421: SYMBOL FOR DELETE*/
+ 0x2422, /* U+002422: BLANK SYMBOL*/
+ 0x2423, /* U+002423: OPEN BOX*/
+ 0x2424, /* U+002424: SYMBOL FOR NEWLINE*/
+ 0x2425, /* U+002425: SYMBOL FOR DELETE FORM TWO*/
+ 0x2426, /* U+002426: SYMBOL FOR SUBSTITUTE FORM TWO*/
+ 0x2427, /* U+002427: */
+ 0x2428, /* U+002428: */
+ 0x2429, /* U+002429: */
+ 0x242a, /* U+00242a: */
+ 0x242b, /* U+00242b: */
+ 0x242c, /* U+00242c: */
+ 0x242d, /* U+00242d: */
+ 0x242e, /* U+00242e: */
+ 0x242f, /* U+00242f: */
+ 0x2430, /* U+002430: */
+ 0x2431, /* U+002431: */
+ 0x2432, /* U+002432: */
+ 0x2433, /* U+002433: */
+ 0x2434, /* U+002434: */
+ 0x2435, /* U+002435: */
+ 0x2436, /* U+002436: */
+ 0x2437, /* U+002437: */
+ 0x2438, /* U+002438: */
+ 0x2439, /* U+002439: */
+ 0x243a, /* U+00243a: */
+ 0x243b, /* U+00243b: */
+ 0x243c, /* U+00243c: */
+ 0x243d, /* U+00243d: */
+ 0x243e, /* U+00243e: */
+ 0x243f, /* U+00243f: */
+ 0x2440, /* U+002440: OCR HOOK*/
+ 0x2441, /* U+002441: OCR CHAIR*/
+ 0x2442, /* U+002442: OCR FORK*/
+ 0x2443, /* U+002443: OCR INVERTED FORK*/
+ 0x2444, /* U+002444: OCR BELT BUCKLE*/
+ 0x2445, /* U+002445: OCR BOW TIE*/
+ 0x2446, /* U+002446: OCR BRANCH BANK IDENTIFICATION*/
+ 0x2447, /* U+002447: OCR AMOUNT OF CHECK*/
+ 0x2448, /* U+002448: OCR DASH*/
+ 0x2449, /* U+002449: OCR CUSTOMER ACCOUNT NUMBER*/
+ 0x244a, /* U+00244a: OCR DOUBLE BACKSLASH*/
+ 0x244b, /* U+00244b: */
+ 0x244c, /* U+00244c: */
+ 0x244d, /* U+00244d: */
+ 0x244e, /* U+00244e: */
+ 0x244f, /* U+00244f: */
+ 0x2450, /* U+002450: */
+ 0x2451, /* U+002451: */
+ 0x2452, /* U+002452: */
+ 0x2453, /* U+002453: */
+ 0x2454, /* U+002454: */
+ 0x2455, /* U+002455: */
+ 0x2456, /* U+002456: */
+ 0x2457, /* U+002457: */
+ 0x2458, /* U+002458: */
+ 0x2459, /* U+002459: */
+ 0x245a, /* U+00245a: */
+ 0x245b, /* U+00245b: */
+ 0x245c, /* U+00245c: */
+ 0x245d, /* U+00245d: */
+ 0x245e, /* U+00245e: */
+ 0x245f, /* U+00245f: */
+ 0x2460, /* U+002460: CIRCLED DIGIT ONE*/
+ 0x2461, /* U+002461: CIRCLED DIGIT TWO*/
+ 0x2462, /* U+002462: CIRCLED DIGIT THREE*/
+ 0x2463, /* U+002463: CIRCLED DIGIT FOUR*/
+ 0x2464, /* U+002464: CIRCLED DIGIT FIVE*/
+ 0x2465, /* U+002465: CIRCLED DIGIT SIX*/
+ 0x2466, /* U+002466: CIRCLED DIGIT SEVEN*/
+ 0x2467, /* U+002467: CIRCLED DIGIT EIGHT*/
+ 0x2468, /* U+002468: CIRCLED DIGIT NINE*/
+ 0x2469, /* U+002469: CIRCLED NUMBER TEN*/
+ 0x246a, /* U+00246a: CIRCLED NUMBER ELEVEN*/
+ 0x246b, /* U+00246b: CIRCLED NUMBER TWELVE*/
+ 0x246c, /* U+00246c: CIRCLED NUMBER THIRTEEN*/
+ 0x246d, /* U+00246d: CIRCLED NUMBER FOURTEEN*/
+ 0x246e, /* U+00246e: CIRCLED NUMBER FIFTEEN*/
+ 0x246f, /* U+00246f: CIRCLED NUMBER SIXTEEN*/
+ 0x2470, /* U+002470: CIRCLED NUMBER SEVENTEEN*/
+ 0x2471, /* U+002471: CIRCLED NUMBER EIGHTEEN*/
+ 0x2472, /* U+002472: CIRCLED NUMBER NINETEEN*/
+ 0x2473, /* U+002473: CIRCLED NUMBER TWENTY*/
+ 0x2474, /* U+002474: PARENTHESIZED DIGIT ONE*/
+ 0x2475, /* U+002475: PARENTHESIZED DIGIT TWO*/
+ 0x2476, /* U+002476: PARENTHESIZED DIGIT THREE*/
+ 0x2477, /* U+002477: PARENTHESIZED DIGIT FOUR*/
+ 0x2478, /* U+002478: PARENTHESIZED DIGIT FIVE*/
+ 0x2479, /* U+002479: PARENTHESIZED DIGIT SIX*/
+ 0x247a, /* U+00247a: PARENTHESIZED DIGIT SEVEN*/
+ 0x247b, /* U+00247b: PARENTHESIZED DIGIT EIGHT*/
+ 0x247c, /* U+00247c: PARENTHESIZED DIGIT NINE*/
+ 0x247d, /* U+00247d: PARENTHESIZED NUMBER TEN*/
+ 0x247e, /* U+00247e: PARENTHESIZED NUMBER ELEVEN*/
+ 0x247f, /* U+00247f: PARENTHESIZED NUMBER TWELVE*/
+ 0x2480, /* U+002480: PARENTHESIZED NUMBER THIRTEEN*/
+ 0x2481, /* U+002481: PARENTHESIZED NUMBER FOURTEEN*/
+ 0x2482, /* U+002482: PARENTHESIZED NUMBER FIFTEEN*/
+ 0x2483, /* U+002483: PARENTHESIZED NUMBER SIXTEEN*/
+ 0x2484, /* U+002484: PARENTHESIZED NUMBER SEVENTEEN*/
+ 0x2485, /* U+002485: PARENTHESIZED NUMBER EIGHTEEN*/
+ 0x2486, /* U+002486: PARENTHESIZED NUMBER NINETEEN*/
+ 0x2487, /* U+002487: PARENTHESIZED NUMBER TWENTY*/
+ 0x2488, /* U+002488: DIGIT ONE FULL STOP*/
+ 0x2489, /* U+002489: DIGIT TWO FULL STOP*/
+ 0x248a, /* U+00248a: DIGIT THREE FULL STOP*/
+ 0x248b, /* U+00248b: DIGIT FOUR FULL STOP*/
+ 0x248c, /* U+00248c: DIGIT FIVE FULL STOP*/
+ 0x248d, /* U+00248d: DIGIT SIX FULL STOP*/
+ 0x248e, /* U+00248e: DIGIT SEVEN FULL STOP*/
+ 0x248f, /* U+00248f: DIGIT EIGHT FULL STOP*/
+ 0x2490, /* U+002490: DIGIT NINE FULL STOP*/
+ 0x2491, /* U+002491: NUMBER TEN FULL STOP*/
+ 0x2492, /* U+002492: NUMBER ELEVEN FULL STOP*/
+ 0x2493, /* U+002493: NUMBER TWELVE FULL STOP*/
+ 0x2494, /* U+002494: NUMBER THIRTEEN FULL STOP*/
+ 0x2495, /* U+002495: NUMBER FOURTEEN FULL STOP*/
+ 0x2496, /* U+002496: NUMBER FIFTEEN FULL STOP*/
+ 0x2497, /* U+002497: NUMBER SIXTEEN FULL STOP*/
+ 0x2498, /* U+002498: NUMBER SEVENTEEN FULL STOP*/
+ 0x2499, /* U+002499: NUMBER EIGHTEEN FULL STOP*/
+ 0x249a, /* U+00249a: NUMBER NINETEEN FULL STOP*/
+ 0x249b, /* U+00249b: NUMBER TWENTY FULL STOP*/
+ 0x249c, /* U+00249c: PARENTHESIZED LATIN SMALL LETTER A*/
+ 0x249d, /* U+00249d: PARENTHESIZED LATIN SMALL LETTER B*/
+ 0x249e, /* U+00249e: PARENTHESIZED LATIN SMALL LETTER C*/
+ 0x249f, /* U+00249f: PARENTHESIZED LATIN SMALL LETTER D*/
+ 0x24a0, /* U+0024a0: PARENTHESIZED LATIN SMALL LETTER E*/
+ 0x24a1, /* U+0024a1: PARENTHESIZED LATIN SMALL LETTER F*/
+ 0x24a2, /* U+0024a2: PARENTHESIZED LATIN SMALL LETTER G*/
+ 0x24a3, /* U+0024a3: PARENTHESIZED LATIN SMALL LETTER H*/
+ 0x24a4, /* U+0024a4: PARENTHESIZED LATIN SMALL LETTER I*/
+ 0x24a5, /* U+0024a5: PARENTHESIZED LATIN SMALL LETTER J*/
+ 0x24a6, /* U+0024a6: PARENTHESIZED LATIN SMALL LETTER K*/
+ 0x24a7, /* U+0024a7: PARENTHESIZED LATIN SMALL LETTER L*/
+ 0x24a8, /* U+0024a8: PARENTHESIZED LATIN SMALL LETTER M*/
+ 0x24a9, /* U+0024a9: PARENTHESIZED LATIN SMALL LETTER N*/
+ 0x24aa, /* U+0024aa: PARENTHESIZED LATIN SMALL LETTER O*/
+ 0x24ab, /* U+0024ab: PARENTHESIZED LATIN SMALL LETTER P*/
+ 0x24ac, /* U+0024ac: PARENTHESIZED LATIN SMALL LETTER Q*/
+ 0x24ad, /* U+0024ad: PARENTHESIZED LATIN SMALL LETTER R*/
+ 0x24ae, /* U+0024ae: PARENTHESIZED LATIN SMALL LETTER S*/
+ 0x24af, /* U+0024af: PARENTHESIZED LATIN SMALL LETTER T*/
+ 0x24b0, /* U+0024b0: PARENTHESIZED LATIN SMALL LETTER U*/
+ 0x24b1, /* U+0024b1: PARENTHESIZED LATIN SMALL LETTER V*/
+ 0x24b2, /* U+0024b2: PARENTHESIZED LATIN SMALL LETTER W*/
+ 0x24b3, /* U+0024b3: PARENTHESIZED LATIN SMALL LETTER X*/
+ 0x24b4, /* U+0024b4: PARENTHESIZED LATIN SMALL LETTER Y*/
+ 0x24b5, /* U+0024b5: PARENTHESIZED LATIN SMALL LETTER Z*/
+ 0x24b6, /* U+0024b6: CIRCLED LATIN CAPITAL LETTER A*/
+ 0x24b7, /* U+0024b7: CIRCLED LATIN CAPITAL LETTER B*/
+ 0x24b8, /* U+0024b8: CIRCLED LATIN CAPITAL LETTER C*/
+ 0x24b9, /* U+0024b9: CIRCLED LATIN CAPITAL LETTER D*/
+ 0x24ba, /* U+0024ba: CIRCLED LATIN CAPITAL LETTER E*/
+ 0x24bb, /* U+0024bb: CIRCLED LATIN CAPITAL LETTER F*/
+ 0x24bc, /* U+0024bc: CIRCLED LATIN CAPITAL LETTER G*/
+ 0x24bd, /* U+0024bd: CIRCLED LATIN CAPITAL LETTER H*/
+ 0x24be, /* U+0024be: CIRCLED LATIN CAPITAL LETTER I*/
+ 0x24bf, /* U+0024bf: CIRCLED LATIN CAPITAL LETTER J*/
+ 0x24c0, /* U+0024c0: CIRCLED LATIN CAPITAL LETTER K*/
+ 0x24c1, /* U+0024c1: CIRCLED LATIN CAPITAL LETTER L*/
+ 0x24c2, /* U+0024c2: CIRCLED LATIN CAPITAL LETTER M*/
+ 0x24c3, /* U+0024c3: CIRCLED LATIN CAPITAL LETTER N*/
+ 0x24c4, /* U+0024c4: CIRCLED LATIN CAPITAL LETTER O*/
+ 0x24c5, /* U+0024c5: CIRCLED LATIN CAPITAL LETTER P*/
+ 0x24c6, /* U+0024c6: CIRCLED LATIN CAPITAL LETTER Q*/
+ 0x24c7, /* U+0024c7: CIRCLED LATIN CAPITAL LETTER R*/
+ 0x24c8, /* U+0024c8: CIRCLED LATIN CAPITAL LETTER S*/
+ 0x24c9, /* U+0024c9: CIRCLED LATIN CAPITAL LETTER T*/
+ 0x24ca, /* U+0024ca: CIRCLED LATIN CAPITAL LETTER U*/
+ 0x24cb, /* U+0024cb: CIRCLED LATIN CAPITAL LETTER V*/
+ 0x24cc, /* U+0024cc: CIRCLED LATIN CAPITAL LETTER W*/
+ 0x24cd, /* U+0024cd: CIRCLED LATIN CAPITAL LETTER X*/
+ 0x24ce, /* U+0024ce: CIRCLED LATIN CAPITAL LETTER Y*/
+ 0x24cf, /* U+0024cf: CIRCLED LATIN CAPITAL LETTER Z*/
+ 0x24b6, /* U+0024d0: CIRCLED LATIN SMALL LETTER A*/
+ 0x24b7, /* U+0024d1: CIRCLED LATIN SMALL LETTER B*/
+ 0x24b8, /* U+0024d2: CIRCLED LATIN SMALL LETTER C*/
+ 0x24b9, /* U+0024d3: CIRCLED LATIN SMALL LETTER D*/
+ 0x24ba, /* U+0024d4: CIRCLED LATIN SMALL LETTER E*/
+ 0x24bb, /* U+0024d5: CIRCLED LATIN SMALL LETTER F*/
+ 0x24bc, /* U+0024d6: CIRCLED LATIN SMALL LETTER G*/
+ 0x24bd, /* U+0024d7: CIRCLED LATIN SMALL LETTER H*/
+ 0x24be, /* U+0024d8: CIRCLED LATIN SMALL LETTER I*/
+ 0x24bf, /* U+0024d9: CIRCLED LATIN SMALL LETTER J*/
+ 0x24c0, /* U+0024da: CIRCLED LATIN SMALL LETTER K*/
+ 0x24c1, /* U+0024db: CIRCLED LATIN SMALL LETTER L*/
+ 0x24c2, /* U+0024dc: CIRCLED LATIN SMALL LETTER M*/
+ 0x24c3, /* U+0024dd: CIRCLED LATIN SMALL LETTER N*/
+ 0x24c4, /* U+0024de: CIRCLED LATIN SMALL LETTER O*/
+ 0x24c5, /* U+0024df: CIRCLED LATIN SMALL LETTER P*/
+ 0x24c6, /* U+0024e0: CIRCLED LATIN SMALL LETTER Q*/
+ 0x24c7, /* U+0024e1: CIRCLED LATIN SMALL LETTER R*/
+ 0x24c8, /* U+0024e2: CIRCLED LATIN SMALL LETTER S*/
+ 0x24c9, /* U+0024e3: CIRCLED LATIN SMALL LETTER T*/
+ 0x24ca, /* U+0024e4: CIRCLED LATIN SMALL LETTER U*/
+ 0x24cb, /* U+0024e5: CIRCLED LATIN SMALL LETTER V*/
+ 0x24cc, /* U+0024e6: CIRCLED LATIN SMALL LETTER W*/
+ 0x24cd, /* U+0024e7: CIRCLED LATIN SMALL LETTER X*/
+ 0x24ce, /* U+0024e8: CIRCLED LATIN SMALL LETTER Y*/
+ 0x24cf, /* U+0024e9: CIRCLED LATIN SMALL LETTER Z*/
+};
+
+static const RTUNICP g_afRTUniUpper0x002c30[] =
+{
+ 0x2c00, /* U+002c30: GLAGOLITIC SMALL LETTER AZU*/
+ 0x2c01, /* U+002c31: GLAGOLITIC SMALL LETTER BUKY*/
+ 0x2c02, /* U+002c32: GLAGOLITIC SMALL LETTER VEDE*/
+ 0x2c03, /* U+002c33: GLAGOLITIC SMALL LETTER GLAGOLI*/
+ 0x2c04, /* U+002c34: GLAGOLITIC SMALL LETTER DOBRO*/
+ 0x2c05, /* U+002c35: GLAGOLITIC SMALL LETTER YESTU*/
+ 0x2c06, /* U+002c36: GLAGOLITIC SMALL LETTER ZHIVETE*/
+ 0x2c07, /* U+002c37: GLAGOLITIC SMALL LETTER DZELO*/
+ 0x2c08, /* U+002c38: GLAGOLITIC SMALL LETTER ZEMLJA*/
+ 0x2c09, /* U+002c39: GLAGOLITIC SMALL LETTER IZHE*/
+ 0x2c0a, /* U+002c3a: GLAGOLITIC SMALL LETTER INITIAL IZHE*/
+ 0x2c0b, /* U+002c3b: GLAGOLITIC SMALL LETTER I*/
+ 0x2c0c, /* U+002c3c: GLAGOLITIC SMALL LETTER DJERVI*/
+ 0x2c0d, /* U+002c3d: GLAGOLITIC SMALL LETTER KAKO*/
+ 0x2c0e, /* U+002c3e: GLAGOLITIC SMALL LETTER LJUDIJE*/
+ 0x2c0f, /* U+002c3f: GLAGOLITIC SMALL LETTER MYSLITE*/
+ 0x2c10, /* U+002c40: GLAGOLITIC SMALL LETTER NASHI*/
+ 0x2c11, /* U+002c41: GLAGOLITIC SMALL LETTER ONU*/
+ 0x2c12, /* U+002c42: GLAGOLITIC SMALL LETTER POKOJI*/
+ 0x2c13, /* U+002c43: GLAGOLITIC SMALL LETTER RITSI*/
+ 0x2c14, /* U+002c44: GLAGOLITIC SMALL LETTER SLOVO*/
+ 0x2c15, /* U+002c45: GLAGOLITIC SMALL LETTER TVRIDO*/
+ 0x2c16, /* U+002c46: GLAGOLITIC SMALL LETTER UKU*/
+ 0x2c17, /* U+002c47: GLAGOLITIC SMALL LETTER FRITU*/
+ 0x2c18, /* U+002c48: GLAGOLITIC SMALL LETTER HERU*/
+ 0x2c19, /* U+002c49: GLAGOLITIC SMALL LETTER OTU*/
+ 0x2c1a, /* U+002c4a: GLAGOLITIC SMALL LETTER PE*/
+ 0x2c1b, /* U+002c4b: GLAGOLITIC SMALL LETTER SHTA*/
+ 0x2c1c, /* U+002c4c: GLAGOLITIC SMALL LETTER TSI*/
+ 0x2c1d, /* U+002c4d: GLAGOLITIC SMALL LETTER CHRIVI*/
+ 0x2c1e, /* U+002c4e: GLAGOLITIC SMALL LETTER SHA*/
+ 0x2c1f, /* U+002c4f: GLAGOLITIC SMALL LETTER YERU*/
+ 0x2c20, /* U+002c50: GLAGOLITIC SMALL LETTER YERI*/
+ 0x2c21, /* U+002c51: GLAGOLITIC SMALL LETTER YATI*/
+ 0x2c22, /* U+002c52: GLAGOLITIC SMALL LETTER SPIDERY HA*/
+ 0x2c23, /* U+002c53: GLAGOLITIC SMALL LETTER YU*/
+ 0x2c24, /* U+002c54: GLAGOLITIC SMALL LETTER SMALL YUS*/
+ 0x2c25, /* U+002c55: GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL*/
+ 0x2c26, /* U+002c56: GLAGOLITIC SMALL LETTER YO*/
+ 0x2c27, /* U+002c57: GLAGOLITIC SMALL LETTER IOTATED SMALL YUS*/
+ 0x2c28, /* U+002c58: GLAGOLITIC SMALL LETTER BIG YUS*/
+ 0x2c29, /* U+002c59: GLAGOLITIC SMALL LETTER IOTATED BIG YUS*/
+ 0x2c2a, /* U+002c5a: GLAGOLITIC SMALL LETTER FITA*/
+ 0x2c2b, /* U+002c5b: GLAGOLITIC SMALL LETTER IZHITSA*/
+ 0x2c2c, /* U+002c5c: GLAGOLITIC SMALL LETTER SHTAPIC*/
+ 0x2c2d, /* U+002c5d: GLAGOLITIC SMALL LETTER TROKUTASTI A*/
+ 0x2c2e, /* U+002c5e: GLAGOLITIC SMALL LETTER LATINATE MYSLITE*/
+ 0x2c5f, /* U+002c5f: */
+ 0x2c60, /* U+002c60: LATIN CAPITAL LETTER L WITH DOUBLE BAR*/
+ 0x2c60, /* U+002c61: LATIN SMALL LETTER L WITH DOUBLE BAR*/
+ 0x2c62, /* U+002c62: LATIN CAPITAL LETTER L WITH MIDDLE TILDE*/
+ 0x2c63, /* U+002c63: LATIN CAPITAL LETTER P WITH STROKE*/
+ 0x2c64, /* U+002c64: LATIN CAPITAL LETTER R WITH TAIL*/
+ 0x23a, /* U+002c65: LATIN SMALL LETTER A WITH STROKE*/
+ 0x23e, /* U+002c66: LATIN SMALL LETTER T WITH DIAGONAL STROKE*/
+ 0x2c67, /* U+002c67: LATIN CAPITAL LETTER H WITH DESCENDER*/
+ 0x2c67, /* U+002c68: LATIN SMALL LETTER H WITH DESCENDER*/
+ 0x2c69, /* U+002c69: LATIN CAPITAL LETTER K WITH DESCENDER*/
+ 0x2c69, /* U+002c6a: LATIN SMALL LETTER K WITH DESCENDER*/
+ 0x2c6b, /* U+002c6b: LATIN CAPITAL LETTER Z WITH DESCENDER*/
+ 0x2c6b, /* U+002c6c: LATIN SMALL LETTER Z WITH DESCENDER*/
+ 0x2c6d, /* U+002c6d: LATIN CAPITAL LETTER ALPHA*/
+ 0x2c6e, /* U+002c6e: LATIN CAPITAL LETTER M WITH HOOK*/
+ 0x2c6f, /* U+002c6f: LATIN CAPITAL LETTER TURNED A*/
+ 0x2c70, /* U+002c70: LATIN CAPITAL LETTER TURNED ALPHA*/
+ 0x2c71, /* U+002c71: LATIN SMALL LETTER V WITH RIGHT HOOK*/
+ 0x2c72, /* U+002c72: LATIN CAPITAL LETTER W WITH HOOK*/
+ 0x2c72, /* U+002c73: LATIN SMALL LETTER W WITH HOOK*/
+ 0x2c74, /* U+002c74: LATIN SMALL LETTER V WITH CURL*/
+ 0x2c75, /* U+002c75: LATIN CAPITAL LETTER HALF H*/
+ 0x2c75, /* U+002c76: LATIN SMALL LETTER HALF H*/
+ 0x2c77, /* U+002c77: LATIN SMALL LETTER TAILLESS PHI*/
+ 0x2c78, /* U+002c78: LATIN SMALL LETTER E WITH NOTCH*/
+ 0x2c79, /* U+002c79: LATIN SMALL LETTER TURNED R WITH TAIL*/
+ 0x2c7a, /* U+002c7a: LATIN SMALL LETTER O WITH LOW RING INSIDE*/
+ 0x2c7b, /* U+002c7b: LATIN LETTER SMALL CAPITAL TURNED E*/
+ 0x2c7c, /* U+002c7c: LATIN SUBSCRIPT SMALL LETTER J*/
+ 0x2c7d, /* U+002c7d: MODIFIER LETTER CAPITAL V*/
+ 0x2c7e, /* U+002c7e: LATIN CAPITAL LETTER S WITH SWASH TAIL*/
+ 0x2c7f, /* U+002c7f: LATIN CAPITAL LETTER Z WITH SWASH TAIL*/
+ 0x2c80, /* U+002c80: COPTIC CAPITAL LETTER ALFA*/
+ 0x2c80, /* U+002c81: COPTIC SMALL LETTER ALFA*/
+ 0x2c82, /* U+002c82: COPTIC CAPITAL LETTER VIDA*/
+ 0x2c82, /* U+002c83: COPTIC SMALL LETTER VIDA*/
+ 0x2c84, /* U+002c84: COPTIC CAPITAL LETTER GAMMA*/
+ 0x2c84, /* U+002c85: COPTIC SMALL LETTER GAMMA*/
+ 0x2c86, /* U+002c86: COPTIC CAPITAL LETTER DALDA*/
+ 0x2c86, /* U+002c87: COPTIC SMALL LETTER DALDA*/
+ 0x2c88, /* U+002c88: COPTIC CAPITAL LETTER EIE*/
+ 0x2c88, /* U+002c89: COPTIC SMALL LETTER EIE*/
+ 0x2c8a, /* U+002c8a: COPTIC CAPITAL LETTER SOU*/
+ 0x2c8a, /* U+002c8b: COPTIC SMALL LETTER SOU*/
+ 0x2c8c, /* U+002c8c: COPTIC CAPITAL LETTER ZATA*/
+ 0x2c8c, /* U+002c8d: COPTIC SMALL LETTER ZATA*/
+ 0x2c8e, /* U+002c8e: COPTIC CAPITAL LETTER HATE*/
+ 0x2c8e, /* U+002c8f: COPTIC SMALL LETTER HATE*/
+ 0x2c90, /* U+002c90: COPTIC CAPITAL LETTER THETHE*/
+ 0x2c90, /* U+002c91: COPTIC SMALL LETTER THETHE*/
+ 0x2c92, /* U+002c92: COPTIC CAPITAL LETTER IAUDA*/
+ 0x2c92, /* U+002c93: COPTIC SMALL LETTER IAUDA*/
+ 0x2c94, /* U+002c94: COPTIC CAPITAL LETTER KAPA*/
+ 0x2c94, /* U+002c95: COPTIC SMALL LETTER KAPA*/
+ 0x2c96, /* U+002c96: COPTIC CAPITAL LETTER LAULA*/
+ 0x2c96, /* U+002c97: COPTIC SMALL LETTER LAULA*/
+ 0x2c98, /* U+002c98: COPTIC CAPITAL LETTER MI*/
+ 0x2c98, /* U+002c99: COPTIC SMALL LETTER MI*/
+ 0x2c9a, /* U+002c9a: COPTIC CAPITAL LETTER NI*/
+ 0x2c9a, /* U+002c9b: COPTIC SMALL LETTER NI*/
+ 0x2c9c, /* U+002c9c: COPTIC CAPITAL LETTER KSI*/
+ 0x2c9c, /* U+002c9d: COPTIC SMALL LETTER KSI*/
+ 0x2c9e, /* U+002c9e: COPTIC CAPITAL LETTER O*/
+ 0x2c9e, /* U+002c9f: COPTIC SMALL LETTER O*/
+ 0x2ca0, /* U+002ca0: COPTIC CAPITAL LETTER PI*/
+ 0x2ca0, /* U+002ca1: COPTIC SMALL LETTER PI*/
+ 0x2ca2, /* U+002ca2: COPTIC CAPITAL LETTER RO*/
+ 0x2ca2, /* U+002ca3: COPTIC SMALL LETTER RO*/
+ 0x2ca4, /* U+002ca4: COPTIC CAPITAL LETTER SIMA*/
+ 0x2ca4, /* U+002ca5: COPTIC SMALL LETTER SIMA*/
+ 0x2ca6, /* U+002ca6: COPTIC CAPITAL LETTER TAU*/
+ 0x2ca6, /* U+002ca7: COPTIC SMALL LETTER TAU*/
+ 0x2ca8, /* U+002ca8: COPTIC CAPITAL LETTER UA*/
+ 0x2ca8, /* U+002ca9: COPTIC SMALL LETTER UA*/
+ 0x2caa, /* U+002caa: COPTIC CAPITAL LETTER FI*/
+ 0x2caa, /* U+002cab: COPTIC SMALL LETTER FI*/
+ 0x2cac, /* U+002cac: COPTIC CAPITAL LETTER KHI*/
+ 0x2cac, /* U+002cad: COPTIC SMALL LETTER KHI*/
+ 0x2cae, /* U+002cae: COPTIC CAPITAL LETTER PSI*/
+ 0x2cae, /* U+002caf: COPTIC SMALL LETTER PSI*/
+ 0x2cb0, /* U+002cb0: COPTIC CAPITAL LETTER OOU*/
+ 0x2cb0, /* U+002cb1: COPTIC SMALL LETTER OOU*/
+ 0x2cb2, /* U+002cb2: COPTIC CAPITAL LETTER DIALECT-P ALEF*/
+ 0x2cb2, /* U+002cb3: COPTIC SMALL LETTER DIALECT-P ALEF*/
+ 0x2cb4, /* U+002cb4: COPTIC CAPITAL LETTER OLD COPTIC AIN*/
+ 0x2cb4, /* U+002cb5: COPTIC SMALL LETTER OLD COPTIC AIN*/
+ 0x2cb6, /* U+002cb6: COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE*/
+ 0x2cb6, /* U+002cb7: COPTIC SMALL LETTER CRYPTOGRAMMIC EIE*/
+ 0x2cb8, /* U+002cb8: COPTIC CAPITAL LETTER DIALECT-P KAPA*/
+ 0x2cb8, /* U+002cb9: COPTIC SMALL LETTER DIALECT-P KAPA*/
+ 0x2cba, /* U+002cba: COPTIC CAPITAL LETTER DIALECT-P NI*/
+ 0x2cba, /* U+002cbb: COPTIC SMALL LETTER DIALECT-P NI*/
+ 0x2cbc, /* U+002cbc: COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI*/
+ 0x2cbc, /* U+002cbd: COPTIC SMALL LETTER CRYPTOGRAMMIC NI*/
+ 0x2cbe, /* U+002cbe: COPTIC CAPITAL LETTER OLD COPTIC OOU*/
+ 0x2cbe, /* U+002cbf: COPTIC SMALL LETTER OLD COPTIC OOU*/
+ 0x2cc0, /* U+002cc0: COPTIC CAPITAL LETTER SAMPI*/
+ 0x2cc0, /* U+002cc1: COPTIC SMALL LETTER SAMPI*/
+ 0x2cc2, /* U+002cc2: COPTIC CAPITAL LETTER CROSSED SHEI*/
+ 0x2cc2, /* U+002cc3: COPTIC SMALL LETTER CROSSED SHEI*/
+ 0x2cc4, /* U+002cc4: COPTIC CAPITAL LETTER OLD COPTIC SHEI*/
+ 0x2cc4, /* U+002cc5: COPTIC SMALL LETTER OLD COPTIC SHEI*/
+ 0x2cc6, /* U+002cc6: COPTIC CAPITAL LETTER OLD COPTIC ESH*/
+ 0x2cc6, /* U+002cc7: COPTIC SMALL LETTER OLD COPTIC ESH*/
+ 0x2cc8, /* U+002cc8: COPTIC CAPITAL LETTER AKHMIMIC KHEI*/
+ 0x2cc8, /* U+002cc9: COPTIC SMALL LETTER AKHMIMIC KHEI*/
+ 0x2cca, /* U+002cca: COPTIC CAPITAL LETTER DIALECT-P HORI*/
+ 0x2cca, /* U+002ccb: COPTIC SMALL LETTER DIALECT-P HORI*/
+ 0x2ccc, /* U+002ccc: COPTIC CAPITAL LETTER OLD COPTIC HORI*/
+ 0x2ccc, /* U+002ccd: COPTIC SMALL LETTER OLD COPTIC HORI*/
+ 0x2cce, /* U+002cce: COPTIC CAPITAL LETTER OLD COPTIC HA*/
+ 0x2cce, /* U+002ccf: COPTIC SMALL LETTER OLD COPTIC HA*/
+ 0x2cd0, /* U+002cd0: COPTIC CAPITAL LETTER L-SHAPED HA*/
+ 0x2cd0, /* U+002cd1: COPTIC SMALL LETTER L-SHAPED HA*/
+ 0x2cd2, /* U+002cd2: COPTIC CAPITAL LETTER OLD COPTIC HEI*/
+ 0x2cd2, /* U+002cd3: COPTIC SMALL LETTER OLD COPTIC HEI*/
+ 0x2cd4, /* U+002cd4: COPTIC CAPITAL LETTER OLD COPTIC HAT*/
+ 0x2cd4, /* U+002cd5: COPTIC SMALL LETTER OLD COPTIC HAT*/
+ 0x2cd6, /* U+002cd6: COPTIC CAPITAL LETTER OLD COPTIC GANGIA*/
+ 0x2cd6, /* U+002cd7: COPTIC SMALL LETTER OLD COPTIC GANGIA*/
+ 0x2cd8, /* U+002cd8: COPTIC CAPITAL LETTER OLD COPTIC DJA*/
+ 0x2cd8, /* U+002cd9: COPTIC SMALL LETTER OLD COPTIC DJA*/
+ 0x2cda, /* U+002cda: COPTIC CAPITAL LETTER OLD COPTIC SHIMA*/
+ 0x2cda, /* U+002cdb: COPTIC SMALL LETTER OLD COPTIC SHIMA*/
+ 0x2cdc, /* U+002cdc: COPTIC CAPITAL LETTER OLD NUBIAN SHIMA*/
+ 0x2cdc, /* U+002cdd: COPTIC SMALL LETTER OLD NUBIAN SHIMA*/
+ 0x2cde, /* U+002cde: COPTIC CAPITAL LETTER OLD NUBIAN NGI*/
+ 0x2cde, /* U+002cdf: COPTIC SMALL LETTER OLD NUBIAN NGI*/
+ 0x2ce0, /* U+002ce0: COPTIC CAPITAL LETTER OLD NUBIAN NYI*/
+ 0x2ce0, /* U+002ce1: COPTIC SMALL LETTER OLD NUBIAN NYI*/
+ 0x2ce2, /* U+002ce2: COPTIC CAPITAL LETTER OLD NUBIAN WAU*/
+ 0x2ce2, /* U+002ce3: COPTIC SMALL LETTER OLD NUBIAN WAU*/
+ 0x2ce4, /* U+002ce4: COPTIC SYMBOL KAI*/
+ 0x2ce5, /* U+002ce5: COPTIC SYMBOL MI RO*/
+ 0x2ce6, /* U+002ce6: COPTIC SYMBOL PI RO*/
+ 0x2ce7, /* U+002ce7: COPTIC SYMBOL STAUROS*/
+ 0x2ce8, /* U+002ce8: COPTIC SYMBOL TAU RO*/
+ 0x2ce9, /* U+002ce9: COPTIC SYMBOL KHI RO*/
+ 0x2cea, /* U+002cea: COPTIC SYMBOL SHIMA SIMA*/
+ 0x2ceb, /* U+002ceb: COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI*/
+ 0x2ceb, /* U+002cec: COPTIC SMALL LETTER CRYPTOGRAMMIC SHEI*/
+ 0x2ced, /* U+002ced: COPTIC CAPITAL LETTER CRYPTOGRAMMIC GANGIA*/
+ 0x2ced, /* U+002cee: COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA*/
+ 0x2cef, /* U+002cef: COPTIC COMBINING NI ABOVE*/
+ 0x2cf0, /* U+002cf0: COPTIC COMBINING SPIRITUS ASPER*/
+ 0x2cf1, /* U+002cf1: COPTIC COMBINING SPIRITUS LENIS*/
+ 0x2cf2, /* U+002cf2: COPTIC CAPITAL LETTER BOHAIRIC KHEI*/
+ 0x2cf2, /* U+002cf3: COPTIC SMALL LETTER BOHAIRIC KHEI*/
+ 0x2cf4, /* U+002cf4: */
+ 0x2cf5, /* U+002cf5: */
+ 0x2cf6, /* U+002cf6: */
+ 0x2cf7, /* U+002cf7: */
+ 0x2cf8, /* U+002cf8: */
+ 0x2cf9, /* U+002cf9: COPTIC OLD NUBIAN FULL STOP*/
+ 0x2cfa, /* U+002cfa: COPTIC OLD NUBIAN DIRECT QUESTION MARK*/
+ 0x2cfb, /* U+002cfb: COPTIC OLD NUBIAN INDIRECT QUESTION MARK*/
+ 0x2cfc, /* U+002cfc: COPTIC OLD NUBIAN VERSE DIVIDER*/
+ 0x2cfd, /* U+002cfd: COPTIC FRACTION ONE HALF*/
+ 0x2cfe, /* U+002cfe: COPTIC FULL STOP*/
+ 0x2cff, /* U+002cff: COPTIC MORPHOLOGICAL DIVIDER*/
+ 0x10a0, /* U+002d00: GEORGIAN SMALL LETTER AN*/
+ 0x10a1, /* U+002d01: GEORGIAN SMALL LETTER BAN*/
+ 0x10a2, /* U+002d02: GEORGIAN SMALL LETTER GAN*/
+ 0x10a3, /* U+002d03: GEORGIAN SMALL LETTER DON*/
+ 0x10a4, /* U+002d04: GEORGIAN SMALL LETTER EN*/
+ 0x10a5, /* U+002d05: GEORGIAN SMALL LETTER VIN*/
+ 0x10a6, /* U+002d06: GEORGIAN SMALL LETTER ZEN*/
+ 0x10a7, /* U+002d07: GEORGIAN SMALL LETTER TAN*/
+ 0x10a8, /* U+002d08: GEORGIAN SMALL LETTER IN*/
+ 0x10a9, /* U+002d09: GEORGIAN SMALL LETTER KAN*/
+ 0x10aa, /* U+002d0a: GEORGIAN SMALL LETTER LAS*/
+ 0x10ab, /* U+002d0b: GEORGIAN SMALL LETTER MAN*/
+ 0x10ac, /* U+002d0c: GEORGIAN SMALL LETTER NAR*/
+ 0x10ad, /* U+002d0d: GEORGIAN SMALL LETTER ON*/
+ 0x10ae, /* U+002d0e: GEORGIAN SMALL LETTER PAR*/
+ 0x10af, /* U+002d0f: GEORGIAN SMALL LETTER ZHAR*/
+ 0x10b0, /* U+002d10: GEORGIAN SMALL LETTER RAE*/
+ 0x10b1, /* U+002d11: GEORGIAN SMALL LETTER SAN*/
+ 0x10b2, /* U+002d12: GEORGIAN SMALL LETTER TAR*/
+ 0x10b3, /* U+002d13: GEORGIAN SMALL LETTER UN*/
+ 0x10b4, /* U+002d14: GEORGIAN SMALL LETTER PHAR*/
+ 0x10b5, /* U+002d15: GEORGIAN SMALL LETTER KHAR*/
+ 0x10b6, /* U+002d16: GEORGIAN SMALL LETTER GHAN*/
+ 0x10b7, /* U+002d17: GEORGIAN SMALL LETTER QAR*/
+ 0x10b8, /* U+002d18: GEORGIAN SMALL LETTER SHIN*/
+ 0x10b9, /* U+002d19: GEORGIAN SMALL LETTER CHIN*/
+ 0x10ba, /* U+002d1a: GEORGIAN SMALL LETTER CAN*/
+ 0x10bb, /* U+002d1b: GEORGIAN SMALL LETTER JIL*/
+ 0x10bc, /* U+002d1c: GEORGIAN SMALL LETTER CIL*/
+ 0x10bd, /* U+002d1d: GEORGIAN SMALL LETTER CHAR*/
+ 0x10be, /* U+002d1e: GEORGIAN SMALL LETTER XAN*/
+ 0x10bf, /* U+002d1f: GEORGIAN SMALL LETTER JHAN*/
+ 0x10c0, /* U+002d20: GEORGIAN SMALL LETTER HAE*/
+ 0x10c1, /* U+002d21: GEORGIAN SMALL LETTER HE*/
+ 0x10c2, /* U+002d22: GEORGIAN SMALL LETTER HIE*/
+ 0x10c3, /* U+002d23: GEORGIAN SMALL LETTER WE*/
+ 0x10c4, /* U+002d24: GEORGIAN SMALL LETTER HAR*/
+ 0x10c5, /* U+002d25: GEORGIAN SMALL LETTER HOE*/
+ 0x2d26, /* U+002d26: */
+ 0x10c7, /* U+002d27: GEORGIAN SMALL LETTER YN*/
+ 0x2d28, /* U+002d28: */
+ 0x2d29, /* U+002d29: */
+ 0x2d2a, /* U+002d2a: */
+ 0x2d2b, /* U+002d2b: */
+ 0x2d2c, /* U+002d2c: */
+ 0x10cd, /* U+002d2d: GEORGIAN SMALL LETTER AEN*/
+};
+
+static const RTUNICP g_afRTUniUpper0x00a641[] =
+{
+ 0xa640, /* U+00a641: CYRILLIC SMALL LETTER ZEMLYA*/
+ 0xa642, /* U+00a642: CYRILLIC CAPITAL LETTER DZELO*/
+ 0xa642, /* U+00a643: CYRILLIC SMALL LETTER DZELO*/
+ 0xa644, /* U+00a644: CYRILLIC CAPITAL LETTER REVERSED DZE*/
+ 0xa644, /* U+00a645: CYRILLIC SMALL LETTER REVERSED DZE*/
+ 0xa646, /* U+00a646: CYRILLIC CAPITAL LETTER IOTA*/
+ 0xa646, /* U+00a647: CYRILLIC SMALL LETTER IOTA*/
+ 0xa648, /* U+00a648: CYRILLIC CAPITAL LETTER DJERV*/
+ 0xa648, /* U+00a649: CYRILLIC SMALL LETTER DJERV*/
+ 0xa64a, /* U+00a64a: CYRILLIC CAPITAL LETTER MONOGRAPH UK*/
+ 0xa64a, /* U+00a64b: CYRILLIC SMALL LETTER MONOGRAPH UK*/
+ 0xa64c, /* U+00a64c: CYRILLIC CAPITAL LETTER BROAD OMEGA*/
+ 0xa64c, /* U+00a64d: CYRILLIC SMALL LETTER BROAD OMEGA*/
+ 0xa64e, /* U+00a64e: CYRILLIC CAPITAL LETTER NEUTRAL YER*/
+ 0xa64e, /* U+00a64f: CYRILLIC SMALL LETTER NEUTRAL YER*/
+ 0xa650, /* U+00a650: CYRILLIC CAPITAL LETTER YERU WITH BACK YER*/
+ 0xa650, /* U+00a651: CYRILLIC SMALL LETTER YERU WITH BACK YER*/
+ 0xa652, /* U+00a652: CYRILLIC CAPITAL LETTER IOTIFIED YAT*/
+ 0xa652, /* U+00a653: CYRILLIC SMALL LETTER IOTIFIED YAT*/
+ 0xa654, /* U+00a654: CYRILLIC CAPITAL LETTER REVERSED YU*/
+ 0xa654, /* U+00a655: CYRILLIC SMALL LETTER REVERSED YU*/
+ 0xa656, /* U+00a656: CYRILLIC CAPITAL LETTER IOTIFIED A*/
+ 0xa656, /* U+00a657: CYRILLIC SMALL LETTER IOTIFIED A*/
+ 0xa658, /* U+00a658: CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS*/
+ 0xa658, /* U+00a659: CYRILLIC SMALL LETTER CLOSED LITTLE YUS*/
+ 0xa65a, /* U+00a65a: CYRILLIC CAPITAL LETTER BLENDED YUS*/
+ 0xa65a, /* U+00a65b: CYRILLIC SMALL LETTER BLENDED YUS*/
+ 0xa65c, /* U+00a65c: CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS*/
+ 0xa65c, /* U+00a65d: CYRILLIC SMALL LETTER IOTIFIED CLOSED LITTLE YUS*/
+ 0xa65e, /* U+00a65e: CYRILLIC CAPITAL LETTER YN*/
+ 0xa65e, /* U+00a65f: CYRILLIC SMALL LETTER YN*/
+ 0xa660, /* U+00a660: CYRILLIC CAPITAL LETTER REVERSED TSE*/
+ 0xa660, /* U+00a661: CYRILLIC SMALL LETTER REVERSED TSE*/
+ 0xa662, /* U+00a662: CYRILLIC CAPITAL LETTER SOFT DE*/
+ 0xa662, /* U+00a663: CYRILLIC SMALL LETTER SOFT DE*/
+ 0xa664, /* U+00a664: CYRILLIC CAPITAL LETTER SOFT EL*/
+ 0xa664, /* U+00a665: CYRILLIC SMALL LETTER SOFT EL*/
+ 0xa666, /* U+00a666: CYRILLIC CAPITAL LETTER SOFT EM*/
+ 0xa666, /* U+00a667: CYRILLIC SMALL LETTER SOFT EM*/
+ 0xa668, /* U+00a668: CYRILLIC CAPITAL LETTER MONOCULAR O*/
+ 0xa668, /* U+00a669: CYRILLIC SMALL LETTER MONOCULAR O*/
+ 0xa66a, /* U+00a66a: CYRILLIC CAPITAL LETTER BINOCULAR O*/
+ 0xa66a, /* U+00a66b: CYRILLIC SMALL LETTER BINOCULAR O*/
+ 0xa66c, /* U+00a66c: CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O*/
+ 0xa66c, /* U+00a66d: CYRILLIC SMALL LETTER DOUBLE MONOCULAR O*/
+ 0xa66e, /* U+00a66e: CYRILLIC LETTER MULTIOCULAR O*/
+ 0xa66f, /* U+00a66f: COMBINING CYRILLIC VZMET*/
+ 0xa670, /* U+00a670: COMBINING CYRILLIC TEN MILLIONS SIGN*/
+ 0xa671, /* U+00a671: COMBINING CYRILLIC HUNDRED MILLIONS SIGN*/
+ 0xa672, /* U+00a672: COMBINING CYRILLIC THOUSAND MILLIONS SIGN*/
+ 0xa673, /* U+00a673: SLAVONIC ASTERISK*/
+ 0xa674, /* U+00a674: COMBINING CYRILLIC LETTER UKRAINIAN IE*/
+ 0xa675, /* U+00a675: COMBINING CYRILLIC LETTER I*/
+ 0xa676, /* U+00a676: COMBINING CYRILLIC LETTER YI*/
+ 0xa677, /* U+00a677: COMBINING CYRILLIC LETTER U*/
+ 0xa678, /* U+00a678: COMBINING CYRILLIC LETTER HARD SIGN*/
+ 0xa679, /* U+00a679: COMBINING CYRILLIC LETTER YERU*/
+ 0xa67a, /* U+00a67a: COMBINING CYRILLIC LETTER SOFT SIGN*/
+ 0xa67b, /* U+00a67b: COMBINING CYRILLIC LETTER OMEGA*/
+ 0xa67c, /* U+00a67c: COMBINING CYRILLIC KAVYKA*/
+ 0xa67d, /* U+00a67d: COMBINING CYRILLIC PAYEROK*/
+ 0xa67e, /* U+00a67e: CYRILLIC KAVYKA*/
+ 0xa67f, /* U+00a67f: CYRILLIC PAYEROK*/
+ 0xa680, /* U+00a680: CYRILLIC CAPITAL LETTER DWE*/
+ 0xa680, /* U+00a681: CYRILLIC SMALL LETTER DWE*/
+ 0xa682, /* U+00a682: CYRILLIC CAPITAL LETTER DZWE*/
+ 0xa682, /* U+00a683: CYRILLIC SMALL LETTER DZWE*/
+ 0xa684, /* U+00a684: CYRILLIC CAPITAL LETTER ZHWE*/
+ 0xa684, /* U+00a685: CYRILLIC SMALL LETTER ZHWE*/
+ 0xa686, /* U+00a686: CYRILLIC CAPITAL LETTER CCHE*/
+ 0xa686, /* U+00a687: CYRILLIC SMALL LETTER CCHE*/
+ 0xa688, /* U+00a688: CYRILLIC CAPITAL LETTER DZZE*/
+ 0xa688, /* U+00a689: CYRILLIC SMALL LETTER DZZE*/
+ 0xa68a, /* U+00a68a: CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK*/
+ 0xa68a, /* U+00a68b: CYRILLIC SMALL LETTER TE WITH MIDDLE HOOK*/
+ 0xa68c, /* U+00a68c: CYRILLIC CAPITAL LETTER TWE*/
+ 0xa68c, /* U+00a68d: CYRILLIC SMALL LETTER TWE*/
+ 0xa68e, /* U+00a68e: CYRILLIC CAPITAL LETTER TSWE*/
+ 0xa68e, /* U+00a68f: CYRILLIC SMALL LETTER TSWE*/
+ 0xa690, /* U+00a690: CYRILLIC CAPITAL LETTER TSSE*/
+ 0xa690, /* U+00a691: CYRILLIC SMALL LETTER TSSE*/
+ 0xa692, /* U+00a692: CYRILLIC CAPITAL LETTER TCHE*/
+ 0xa692, /* U+00a693: CYRILLIC SMALL LETTER TCHE*/
+ 0xa694, /* U+00a694: CYRILLIC CAPITAL LETTER HWE*/
+ 0xa694, /* U+00a695: CYRILLIC SMALL LETTER HWE*/
+ 0xa696, /* U+00a696: CYRILLIC CAPITAL LETTER SHWE*/
+ 0xa696, /* U+00a697: CYRILLIC SMALL LETTER SHWE*/
+ 0xa698, /* U+00a698: */
+ 0xa699, /* U+00a699: */
+ 0xa69a, /* U+00a69a: */
+ 0xa69b, /* U+00a69b: */
+ 0xa69c, /* U+00a69c: */
+ 0xa69d, /* U+00a69d: */
+ 0xa69e, /* U+00a69e: */
+ 0xa69f, /* U+00a69f: COMBINING CYRILLIC LETTER IOTIFIED E*/
+ 0xa6a0, /* U+00a6a0: BAMUM LETTER A*/
+ 0xa6a1, /* U+00a6a1: BAMUM LETTER KA*/
+ 0xa6a2, /* U+00a6a2: BAMUM LETTER U*/
+ 0xa6a3, /* U+00a6a3: BAMUM LETTER KU*/
+ 0xa6a4, /* U+00a6a4: BAMUM LETTER EE*/
+ 0xa6a5, /* U+00a6a5: BAMUM LETTER REE*/
+ 0xa6a6, /* U+00a6a6: BAMUM LETTER TAE*/
+ 0xa6a7, /* U+00a6a7: BAMUM LETTER O*/
+ 0xa6a8, /* U+00a6a8: BAMUM LETTER NYI*/
+ 0xa6a9, /* U+00a6a9: BAMUM LETTER I*/
+ 0xa6aa, /* U+00a6aa: BAMUM LETTER LA*/
+ 0xa6ab, /* U+00a6ab: BAMUM LETTER PA*/
+ 0xa6ac, /* U+00a6ac: BAMUM LETTER RII*/
+ 0xa6ad, /* U+00a6ad: BAMUM LETTER RIEE*/
+ 0xa6ae, /* U+00a6ae: BAMUM LETTER LEEEE*/
+ 0xa6af, /* U+00a6af: BAMUM LETTER MEEEE*/
+ 0xa6b0, /* U+00a6b0: BAMUM LETTER TAA*/
+ 0xa6b1, /* U+00a6b1: BAMUM LETTER NDAA*/
+ 0xa6b2, /* U+00a6b2: BAMUM LETTER NJAEM*/
+ 0xa6b3, /* U+00a6b3: BAMUM LETTER M*/
+ 0xa6b4, /* U+00a6b4: BAMUM LETTER SUU*/
+ 0xa6b5, /* U+00a6b5: BAMUM LETTER MU*/
+ 0xa6b6, /* U+00a6b6: BAMUM LETTER SHII*/
+ 0xa6b7, /* U+00a6b7: BAMUM LETTER SI*/
+ 0xa6b8, /* U+00a6b8: BAMUM LETTER SHEUX*/
+ 0xa6b9, /* U+00a6b9: BAMUM LETTER SEUX*/
+ 0xa6ba, /* U+00a6ba: BAMUM LETTER KYEE*/
+ 0xa6bb, /* U+00a6bb: BAMUM LETTER KET*/
+ 0xa6bc, /* U+00a6bc: BAMUM LETTER NUAE*/
+ 0xa6bd, /* U+00a6bd: BAMUM LETTER NU*/
+ 0xa6be, /* U+00a6be: BAMUM LETTER NJUAE*/
+ 0xa6bf, /* U+00a6bf: BAMUM LETTER YOQ*/
+ 0xa6c0, /* U+00a6c0: BAMUM LETTER SHU*/
+ 0xa6c1, /* U+00a6c1: BAMUM LETTER YUQ*/
+ 0xa6c2, /* U+00a6c2: BAMUM LETTER YA*/
+ 0xa6c3, /* U+00a6c3: BAMUM LETTER NSHA*/
+ 0xa6c4, /* U+00a6c4: BAMUM LETTER KEUX*/
+ 0xa6c5, /* U+00a6c5: BAMUM LETTER PEUX*/
+ 0xa6c6, /* U+00a6c6: BAMUM LETTER NJEE*/
+ 0xa6c7, /* U+00a6c7: BAMUM LETTER NTEE*/
+ 0xa6c8, /* U+00a6c8: BAMUM LETTER PUE*/
+ 0xa6c9, /* U+00a6c9: BAMUM LETTER WUE*/
+ 0xa6ca, /* U+00a6ca: BAMUM LETTER PEE*/
+ 0xa6cb, /* U+00a6cb: BAMUM LETTER FEE*/
+ 0xa6cc, /* U+00a6cc: BAMUM LETTER RU*/
+ 0xa6cd, /* U+00a6cd: BAMUM LETTER LU*/
+ 0xa6ce, /* U+00a6ce: BAMUM LETTER MI*/
+ 0xa6cf, /* U+00a6cf: BAMUM LETTER NI*/
+ 0xa6d0, /* U+00a6d0: BAMUM LETTER REUX*/
+ 0xa6d1, /* U+00a6d1: BAMUM LETTER RAE*/
+ 0xa6d2, /* U+00a6d2: BAMUM LETTER KEN*/
+ 0xa6d3, /* U+00a6d3: BAMUM LETTER NGKWAEN*/
+ 0xa6d4, /* U+00a6d4: BAMUM LETTER NGGA*/
+ 0xa6d5, /* U+00a6d5: BAMUM LETTER NGA*/
+ 0xa6d6, /* U+00a6d6: BAMUM LETTER SHO*/
+ 0xa6d7, /* U+00a6d7: BAMUM LETTER PUAE*/
+ 0xa6d8, /* U+00a6d8: BAMUM LETTER FU*/
+ 0xa6d9, /* U+00a6d9: BAMUM LETTER FOM*/
+ 0xa6da, /* U+00a6da: BAMUM LETTER WA*/
+ 0xa6db, /* U+00a6db: BAMUM LETTER NA*/
+ 0xa6dc, /* U+00a6dc: BAMUM LETTER LI*/
+ 0xa6dd, /* U+00a6dd: BAMUM LETTER PI*/
+ 0xa6de, /* U+00a6de: BAMUM LETTER LOQ*/
+ 0xa6df, /* U+00a6df: BAMUM LETTER KO*/
+ 0xa6e0, /* U+00a6e0: BAMUM LETTER MBEN*/
+ 0xa6e1, /* U+00a6e1: BAMUM LETTER REN*/
+ 0xa6e2, /* U+00a6e2: BAMUM LETTER MEN*/
+ 0xa6e3, /* U+00a6e3: BAMUM LETTER MA*/
+ 0xa6e4, /* U+00a6e4: BAMUM LETTER TI*/
+ 0xa6e5, /* U+00a6e5: BAMUM LETTER KI*/
+ 0xa6e6, /* U+00a6e6: BAMUM LETTER MO*/
+ 0xa6e7, /* U+00a6e7: BAMUM LETTER MBAA*/
+ 0xa6e8, /* U+00a6e8: BAMUM LETTER TET*/
+ 0xa6e9, /* U+00a6e9: BAMUM LETTER KPA*/
+ 0xa6ea, /* U+00a6ea: BAMUM LETTER TEN*/
+ 0xa6eb, /* U+00a6eb: BAMUM LETTER NTUU*/
+ 0xa6ec, /* U+00a6ec: BAMUM LETTER SAMBA*/
+ 0xa6ed, /* U+00a6ed: BAMUM LETTER FAAMAE*/
+ 0xa6ee, /* U+00a6ee: BAMUM LETTER KOVUU*/
+ 0xa6ef, /* U+00a6ef: BAMUM LETTER KOGHOM*/
+ 0xa6f0, /* U+00a6f0: BAMUM COMBINING MARK KOQNDON*/
+ 0xa6f1, /* U+00a6f1: BAMUM COMBINING MARK TUKWENTIS*/
+ 0xa6f2, /* U+00a6f2: BAMUM NJAEMLI*/
+ 0xa6f3, /* U+00a6f3: BAMUM FULL STOP*/
+ 0xa6f4, /* U+00a6f4: BAMUM COLON*/
+ 0xa6f5, /* U+00a6f5: BAMUM COMMA*/
+ 0xa6f6, /* U+00a6f6: BAMUM SEMICOLON*/
+ 0xa6f7, /* U+00a6f7: BAMUM QUESTION MARK*/
+ 0xa6f8, /* U+00a6f8: */
+ 0xa6f9, /* U+00a6f9: */
+ 0xa6fa, /* U+00a6fa: */
+ 0xa6fb, /* U+00a6fb: */
+ 0xa6fc, /* U+00a6fc: */
+ 0xa6fd, /* U+00a6fd: */
+ 0xa6fe, /* U+00a6fe: */
+ 0xa6ff, /* U+00a6ff: */
+ 0xa700, /* U+00a700: MODIFIER LETTER CHINESE TONE YIN PING*/
+ 0xa701, /* U+00a701: MODIFIER LETTER CHINESE TONE YANG PING*/
+ 0xa702, /* U+00a702: MODIFIER LETTER CHINESE TONE YIN SHANG*/
+ 0xa703, /* U+00a703: MODIFIER LETTER CHINESE TONE YANG SHANG*/
+ 0xa704, /* U+00a704: MODIFIER LETTER CHINESE TONE YIN QU*/
+ 0xa705, /* U+00a705: MODIFIER LETTER CHINESE TONE YANG QU*/
+ 0xa706, /* U+00a706: MODIFIER LETTER CHINESE TONE YIN RU*/
+ 0xa707, /* U+00a707: MODIFIER LETTER CHINESE TONE YANG RU*/
+ 0xa708, /* U+00a708: MODIFIER LETTER EXTRA-HIGH DOTTED TONE BAR*/
+ 0xa709, /* U+00a709: MODIFIER LETTER HIGH DOTTED TONE BAR*/
+ 0xa70a, /* U+00a70a: MODIFIER LETTER MID DOTTED TONE BAR*/
+ 0xa70b, /* U+00a70b: MODIFIER LETTER LOW DOTTED TONE BAR*/
+ 0xa70c, /* U+00a70c: MODIFIER LETTER EXTRA-LOW DOTTED TONE BAR*/
+ 0xa70d, /* U+00a70d: MODIFIER LETTER EXTRA-HIGH DOTTED LEFT-STEM TONE BAR*/
+ 0xa70e, /* U+00a70e: MODIFIER LETTER HIGH DOTTED LEFT-STEM TONE BAR*/
+ 0xa70f, /* U+00a70f: MODIFIER LETTER MID DOTTED LEFT-STEM TONE BAR*/
+ 0xa710, /* U+00a710: MODIFIER LETTER LOW DOTTED LEFT-STEM TONE BAR*/
+ 0xa711, /* U+00a711: MODIFIER LETTER EXTRA-LOW DOTTED LEFT-STEM TONE BAR*/
+ 0xa712, /* U+00a712: MODIFIER LETTER EXTRA-HIGH LEFT-STEM TONE BAR*/
+ 0xa713, /* U+00a713: MODIFIER LETTER HIGH LEFT-STEM TONE BAR*/
+ 0xa714, /* U+00a714: MODIFIER LETTER MID LEFT-STEM TONE BAR*/
+ 0xa715, /* U+00a715: MODIFIER LETTER LOW LEFT-STEM TONE BAR*/
+ 0xa716, /* U+00a716: MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR*/
+ 0xa717, /* U+00a717: MODIFIER LETTER DOT VERTICAL BAR*/
+ 0xa718, /* U+00a718: MODIFIER LETTER DOT SLASH*/
+ 0xa719, /* U+00a719: MODIFIER LETTER DOT HORIZONTAL BAR*/
+ 0xa71a, /* U+00a71a: MODIFIER LETTER LOWER RIGHT CORNER ANGLE*/
+ 0xa71b, /* U+00a71b: MODIFIER LETTER RAISED UP ARROW*/
+ 0xa71c, /* U+00a71c: MODIFIER LETTER RAISED DOWN ARROW*/
+ 0xa71d, /* U+00a71d: MODIFIER LETTER RAISED EXCLAMATION MARK*/
+ 0xa71e, /* U+00a71e: MODIFIER LETTER RAISED INVERTED EXCLAMATION MARK*/
+ 0xa71f, /* U+00a71f: MODIFIER LETTER LOW INVERTED EXCLAMATION MARK*/
+ 0xa720, /* U+00a720: MODIFIER LETTER STRESS AND HIGH TONE*/
+ 0xa721, /* U+00a721: MODIFIER LETTER STRESS AND LOW TONE*/
+ 0xa722, /* U+00a722: LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF*/
+ 0xa722, /* U+00a723: LATIN SMALL LETTER EGYPTOLOGICAL ALEF*/
+ 0xa724, /* U+00a724: LATIN CAPITAL LETTER EGYPTOLOGICAL AIN*/
+ 0xa724, /* U+00a725: LATIN SMALL LETTER EGYPTOLOGICAL AIN*/
+ 0xa726, /* U+00a726: LATIN CAPITAL LETTER HENG*/
+ 0xa726, /* U+00a727: LATIN SMALL LETTER HENG*/
+ 0xa728, /* U+00a728: LATIN CAPITAL LETTER TZ*/
+ 0xa728, /* U+00a729: LATIN SMALL LETTER TZ*/
+ 0xa72a, /* U+00a72a: LATIN CAPITAL LETTER TRESILLO*/
+ 0xa72a, /* U+00a72b: LATIN SMALL LETTER TRESILLO*/
+ 0xa72c, /* U+00a72c: LATIN CAPITAL LETTER CUATRILLO*/
+ 0xa72c, /* U+00a72d: LATIN SMALL LETTER CUATRILLO*/
+ 0xa72e, /* U+00a72e: LATIN CAPITAL LETTER CUATRILLO WITH COMMA*/
+ 0xa72e, /* U+00a72f: LATIN SMALL LETTER CUATRILLO WITH COMMA*/
+ 0xa730, /* U+00a730: LATIN LETTER SMALL CAPITAL F*/
+ 0xa731, /* U+00a731: LATIN LETTER SMALL CAPITAL S*/
+ 0xa732, /* U+00a732: LATIN CAPITAL LETTER AA*/
+ 0xa732, /* U+00a733: LATIN SMALL LETTER AA*/
+ 0xa734, /* U+00a734: LATIN CAPITAL LETTER AO*/
+ 0xa734, /* U+00a735: LATIN SMALL LETTER AO*/
+ 0xa736, /* U+00a736: LATIN CAPITAL LETTER AU*/
+ 0xa736, /* U+00a737: LATIN SMALL LETTER AU*/
+ 0xa738, /* U+00a738: LATIN CAPITAL LETTER AV*/
+ 0xa738, /* U+00a739: LATIN SMALL LETTER AV*/
+ 0xa73a, /* U+00a73a: LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR*/
+ 0xa73a, /* U+00a73b: LATIN SMALL LETTER AV WITH HORIZONTAL BAR*/
+ 0xa73c, /* U+00a73c: LATIN CAPITAL LETTER AY*/
+ 0xa73c, /* U+00a73d: LATIN SMALL LETTER AY*/
+ 0xa73e, /* U+00a73e: LATIN CAPITAL LETTER REVERSED C WITH DOT*/
+ 0xa73e, /* U+00a73f: LATIN SMALL LETTER REVERSED C WITH DOT*/
+ 0xa740, /* U+00a740: LATIN CAPITAL LETTER K WITH STROKE*/
+ 0xa740, /* U+00a741: LATIN SMALL LETTER K WITH STROKE*/
+ 0xa742, /* U+00a742: LATIN CAPITAL LETTER K WITH DIAGONAL STROKE*/
+ 0xa742, /* U+00a743: LATIN SMALL LETTER K WITH DIAGONAL STROKE*/
+ 0xa744, /* U+00a744: LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE*/
+ 0xa744, /* U+00a745: LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE*/
+ 0xa746, /* U+00a746: LATIN CAPITAL LETTER BROKEN L*/
+ 0xa746, /* U+00a747: LATIN SMALL LETTER BROKEN L*/
+ 0xa748, /* U+00a748: LATIN CAPITAL LETTER L WITH HIGH STROKE*/
+ 0xa748, /* U+00a749: LATIN SMALL LETTER L WITH HIGH STROKE*/
+ 0xa74a, /* U+00a74a: LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY*/
+ 0xa74a, /* U+00a74b: LATIN SMALL LETTER O WITH LONG STROKE OVERLAY*/
+ 0xa74c, /* U+00a74c: LATIN CAPITAL LETTER O WITH LOOP*/
+ 0xa74c, /* U+00a74d: LATIN SMALL LETTER O WITH LOOP*/
+ 0xa74e, /* U+00a74e: LATIN CAPITAL LETTER OO*/
+ 0xa74e, /* U+00a74f: LATIN SMALL LETTER OO*/
+ 0xa750, /* U+00a750: LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER*/
+ 0xa750, /* U+00a751: LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER*/
+ 0xa752, /* U+00a752: LATIN CAPITAL LETTER P WITH FLOURISH*/
+ 0xa752, /* U+00a753: LATIN SMALL LETTER P WITH FLOURISH*/
+ 0xa754, /* U+00a754: LATIN CAPITAL LETTER P WITH SQUIRREL TAIL*/
+ 0xa754, /* U+00a755: LATIN SMALL LETTER P WITH SQUIRREL TAIL*/
+ 0xa756, /* U+00a756: LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER*/
+ 0xa756, /* U+00a757: LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER*/
+ 0xa758, /* U+00a758: LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE*/
+ 0xa758, /* U+00a759: LATIN SMALL LETTER Q WITH DIAGONAL STROKE*/
+ 0xa75a, /* U+00a75a: LATIN CAPITAL LETTER R ROTUNDA*/
+ 0xa75a, /* U+00a75b: LATIN SMALL LETTER R ROTUNDA*/
+ 0xa75c, /* U+00a75c: LATIN CAPITAL LETTER RUM ROTUNDA*/
+ 0xa75c, /* U+00a75d: LATIN SMALL LETTER RUM ROTUNDA*/
+ 0xa75e, /* U+00a75e: LATIN CAPITAL LETTER V WITH DIAGONAL STROKE*/
+ 0xa75e, /* U+00a75f: LATIN SMALL LETTER V WITH DIAGONAL STROKE*/
+ 0xa760, /* U+00a760: LATIN CAPITAL LETTER VY*/
+ 0xa760, /* U+00a761: LATIN SMALL LETTER VY*/
+ 0xa762, /* U+00a762: LATIN CAPITAL LETTER VISIGOTHIC Z*/
+ 0xa762, /* U+00a763: LATIN SMALL LETTER VISIGOTHIC Z*/
+ 0xa764, /* U+00a764: LATIN CAPITAL LETTER THORN WITH STROKE*/
+ 0xa764, /* U+00a765: LATIN SMALL LETTER THORN WITH STROKE*/
+ 0xa766, /* U+00a766: LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER*/
+ 0xa766, /* U+00a767: LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER*/
+ 0xa768, /* U+00a768: LATIN CAPITAL LETTER VEND*/
+ 0xa768, /* U+00a769: LATIN SMALL LETTER VEND*/
+ 0xa76a, /* U+00a76a: LATIN CAPITAL LETTER ET*/
+ 0xa76a, /* U+00a76b: LATIN SMALL LETTER ET*/
+ 0xa76c, /* U+00a76c: LATIN CAPITAL LETTER IS*/
+ 0xa76c, /* U+00a76d: LATIN SMALL LETTER IS*/
+ 0xa76e, /* U+00a76e: LATIN CAPITAL LETTER CON*/
+ 0xa76e, /* U+00a76f: LATIN SMALL LETTER CON*/
+ 0xa770, /* U+00a770: MODIFIER LETTER US*/
+ 0xa771, /* U+00a771: LATIN SMALL LETTER DUM*/
+ 0xa772, /* U+00a772: LATIN SMALL LETTER LUM*/
+ 0xa773, /* U+00a773: LATIN SMALL LETTER MUM*/
+ 0xa774, /* U+00a774: LATIN SMALL LETTER NUM*/
+ 0xa775, /* U+00a775: LATIN SMALL LETTER RUM*/
+ 0xa776, /* U+00a776: LATIN LETTER SMALL CAPITAL RUM*/
+ 0xa777, /* U+00a777: LATIN SMALL LETTER TUM*/
+ 0xa778, /* U+00a778: LATIN SMALL LETTER UM*/
+ 0xa779, /* U+00a779: LATIN CAPITAL LETTER INSULAR D*/
+ 0xa779, /* U+00a77a: LATIN SMALL LETTER INSULAR D*/
+ 0xa77b, /* U+00a77b: LATIN CAPITAL LETTER INSULAR F*/
+ 0xa77b, /* U+00a77c: LATIN SMALL LETTER INSULAR F*/
+ 0xa77d, /* U+00a77d: LATIN CAPITAL LETTER INSULAR G*/
+ 0xa77e, /* U+00a77e: LATIN CAPITAL LETTER TURNED INSULAR G*/
+ 0xa77e, /* U+00a77f: LATIN SMALL LETTER TURNED INSULAR G*/
+ 0xa780, /* U+00a780: LATIN CAPITAL LETTER TURNED L*/
+ 0xa780, /* U+00a781: LATIN SMALL LETTER TURNED L*/
+ 0xa782, /* U+00a782: LATIN CAPITAL LETTER INSULAR R*/
+ 0xa782, /* U+00a783: LATIN SMALL LETTER INSULAR R*/
+ 0xa784, /* U+00a784: LATIN CAPITAL LETTER INSULAR S*/
+ 0xa784, /* U+00a785: LATIN SMALL LETTER INSULAR S*/
+ 0xa786, /* U+00a786: LATIN CAPITAL LETTER INSULAR T*/
+ 0xa786, /* U+00a787: LATIN SMALL LETTER INSULAR T*/
+ 0xa788, /* U+00a788: MODIFIER LETTER LOW CIRCUMFLEX ACCENT*/
+ 0xa789, /* U+00a789: MODIFIER LETTER COLON*/
+ 0xa78a, /* U+00a78a: MODIFIER LETTER SHORT EQUALS SIGN*/
+ 0xa78b, /* U+00a78b: LATIN CAPITAL LETTER SALTILLO*/
+ 0xa78b, /* U+00a78c: LATIN SMALL LETTER SALTILLO*/
+ 0xa78d, /* U+00a78d: LATIN CAPITAL LETTER TURNED H*/
+ 0xa78e, /* U+00a78e: LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT*/
+ 0xa78f, /* U+00a78f: */
+ 0xa790, /* U+00a790: LATIN CAPITAL LETTER N WITH DESCENDER*/
+ 0xa790, /* U+00a791: LATIN SMALL LETTER N WITH DESCENDER*/
+ 0xa792, /* U+00a792: LATIN CAPITAL LETTER C WITH BAR*/
+ 0xa792, /* U+00a793: LATIN SMALL LETTER C WITH BAR*/
+ 0xa794, /* U+00a794: */
+ 0xa795, /* U+00a795: */
+ 0xa796, /* U+00a796: */
+ 0xa797, /* U+00a797: */
+ 0xa798, /* U+00a798: */
+ 0xa799, /* U+00a799: */
+ 0xa79a, /* U+00a79a: */
+ 0xa79b, /* U+00a79b: */
+ 0xa79c, /* U+00a79c: */
+ 0xa79d, /* U+00a79d: */
+ 0xa79e, /* U+00a79e: */
+ 0xa79f, /* U+00a79f: */
+ 0xa7a0, /* U+00a7a0: LATIN CAPITAL LETTER G WITH OBLIQUE STROKE*/
+ 0xa7a0, /* U+00a7a1: LATIN SMALL LETTER G WITH OBLIQUE STROKE*/
+ 0xa7a2, /* U+00a7a2: LATIN CAPITAL LETTER K WITH OBLIQUE STROKE*/
+ 0xa7a2, /* U+00a7a3: LATIN SMALL LETTER K WITH OBLIQUE STROKE*/
+ 0xa7a4, /* U+00a7a4: LATIN CAPITAL LETTER N WITH OBLIQUE STROKE*/
+ 0xa7a4, /* U+00a7a5: LATIN SMALL LETTER N WITH OBLIQUE STROKE*/
+ 0xa7a6, /* U+00a7a6: LATIN CAPITAL LETTER R WITH OBLIQUE STROKE*/
+ 0xa7a6, /* U+00a7a7: LATIN SMALL LETTER R WITH OBLIQUE STROKE*/
+ 0xa7a8, /* U+00a7a8: LATIN CAPITAL LETTER S WITH OBLIQUE STROKE*/
+ 0xa7a8, /* U+00a7a9: LATIN SMALL LETTER S WITH OBLIQUE STROKE*/
+};
+
+static const RTUNICP g_afRTUniUpper0x00ff41[] =
+{
+ 0xff21, /* U+00ff41: FULLWIDTH LATIN SMALL LETTER A*/
+ 0xff22, /* U+00ff42: FULLWIDTH LATIN SMALL LETTER B*/
+ 0xff23, /* U+00ff43: FULLWIDTH LATIN SMALL LETTER C*/
+ 0xff24, /* U+00ff44: FULLWIDTH LATIN SMALL LETTER D*/
+ 0xff25, /* U+00ff45: FULLWIDTH LATIN SMALL LETTER E*/
+ 0xff26, /* U+00ff46: FULLWIDTH LATIN SMALL LETTER F*/
+ 0xff27, /* U+00ff47: FULLWIDTH LATIN SMALL LETTER G*/
+ 0xff28, /* U+00ff48: FULLWIDTH LATIN SMALL LETTER H*/
+ 0xff29, /* U+00ff49: FULLWIDTH LATIN SMALL LETTER I*/
+ 0xff2a, /* U+00ff4a: FULLWIDTH LATIN SMALL LETTER J*/
+ 0xff2b, /* U+00ff4b: FULLWIDTH LATIN SMALL LETTER K*/
+ 0xff2c, /* U+00ff4c: FULLWIDTH LATIN SMALL LETTER L*/
+ 0xff2d, /* U+00ff4d: FULLWIDTH LATIN SMALL LETTER M*/
+ 0xff2e, /* U+00ff4e: FULLWIDTH LATIN SMALL LETTER N*/
+ 0xff2f, /* U+00ff4f: FULLWIDTH LATIN SMALL LETTER O*/
+ 0xff30, /* U+00ff50: FULLWIDTH LATIN SMALL LETTER P*/
+ 0xff31, /* U+00ff51: FULLWIDTH LATIN SMALL LETTER Q*/
+ 0xff32, /* U+00ff52: FULLWIDTH LATIN SMALL LETTER R*/
+ 0xff33, /* U+00ff53: FULLWIDTH LATIN SMALL LETTER S*/
+ 0xff34, /* U+00ff54: FULLWIDTH LATIN SMALL LETTER T*/
+ 0xff35, /* U+00ff55: FULLWIDTH LATIN SMALL LETTER U*/
+ 0xff36, /* U+00ff56: FULLWIDTH LATIN SMALL LETTER V*/
+ 0xff37, /* U+00ff57: FULLWIDTH LATIN SMALL LETTER W*/
+ 0xff38, /* U+00ff58: FULLWIDTH LATIN SMALL LETTER X*/
+ 0xff39, /* U+00ff59: FULLWIDTH LATIN SMALL LETTER Y*/
+ 0xff3a, /* U+00ff5a: FULLWIDTH LATIN SMALL LETTER Z*/
+};
+
+static const RTUNICP g_afRTUniUpper0x010428[] =
+{
+ 0x10400, /* U+010428: DESERET SMALL LETTER LONG I*/
+ 0x10401, /* U+010429: DESERET SMALL LETTER LONG E*/
+ 0x10402, /* U+01042a: DESERET SMALL LETTER LONG A*/
+ 0x10403, /* U+01042b: DESERET SMALL LETTER LONG AH*/
+ 0x10404, /* U+01042c: DESERET SMALL LETTER LONG O*/
+ 0x10405, /* U+01042d: DESERET SMALL LETTER LONG OO*/
+ 0x10406, /* U+01042e: DESERET SMALL LETTER SHORT I*/
+ 0x10407, /* U+01042f: DESERET SMALL LETTER SHORT E*/
+ 0x10408, /* U+010430: DESERET SMALL LETTER SHORT A*/
+ 0x10409, /* U+010431: DESERET SMALL LETTER SHORT AH*/
+ 0x1040a, /* U+010432: DESERET SMALL LETTER SHORT O*/
+ 0x1040b, /* U+010433: DESERET SMALL LETTER SHORT OO*/
+ 0x1040c, /* U+010434: DESERET SMALL LETTER AY*/
+ 0x1040d, /* U+010435: DESERET SMALL LETTER OW*/
+ 0x1040e, /* U+010436: DESERET SMALL LETTER WU*/
+ 0x1040f, /* U+010437: DESERET SMALL LETTER YEE*/
+ 0x10410, /* U+010438: DESERET SMALL LETTER H*/
+ 0x10411, /* U+010439: DESERET SMALL LETTER PEE*/
+ 0x10412, /* U+01043a: DESERET SMALL LETTER BEE*/
+ 0x10413, /* U+01043b: DESERET SMALL LETTER TEE*/
+ 0x10414, /* U+01043c: DESERET SMALL LETTER DEE*/
+ 0x10415, /* U+01043d: DESERET SMALL LETTER CHEE*/
+ 0x10416, /* U+01043e: DESERET SMALL LETTER JEE*/
+ 0x10417, /* U+01043f: DESERET SMALL LETTER KAY*/
+ 0x10418, /* U+010440: DESERET SMALL LETTER GAY*/
+ 0x10419, /* U+010441: DESERET SMALL LETTER EF*/
+ 0x1041a, /* U+010442: DESERET SMALL LETTER VEE*/
+ 0x1041b, /* U+010443: DESERET SMALL LETTER ETH*/
+ 0x1041c, /* U+010444: DESERET SMALL LETTER THEE*/
+ 0x1041d, /* U+010445: DESERET SMALL LETTER ES*/
+ 0x1041e, /* U+010446: DESERET SMALL LETTER ZEE*/
+ 0x1041f, /* U+010447: DESERET SMALL LETTER ESH*/
+ 0x10420, /* U+010448: DESERET SMALL LETTER ZHEE*/
+ 0x10421, /* U+010449: DESERET SMALL LETTER ER*/
+ 0x10422, /* U+01044a: DESERET SMALL LETTER EL*/
+ 0x10423, /* U+01044b: DESERET SMALL LETTER EM*/
+ 0x10424, /* U+01044c: DESERET SMALL LETTER EN*/
+ 0x10425, /* U+01044d: DESERET SMALL LETTER ENG*/
+ 0x10426, /* U+01044e: DESERET SMALL LETTER OI*/
+ 0x10427, /* U+01044f: DESERET SMALL LETTER EW*/
+};
+
+
+RT_DECL_DATA_CONST(const RTUNICASERANGE) g_aRTUniUpperRanges[] =
+{
+ { 0x000000, 0x000587, &g_afRTUniUpper0x000000[0] },
+ { 0x001d79, 0x0024ea, &g_afRTUniUpper0x001d79[0] },
+ { 0x002c30, 0x002d2e, &g_afRTUniUpper0x002c30[0] },
+ { 0x00a641, 0x00a7aa, &g_afRTUniUpper0x00a641[0] },
+ { 0x00ff41, 0x00ff5b, &g_afRTUniUpper0x00ff41[0] },
+ { 0x010428, 0x010450, &g_afRTUniUpper0x010428[0] },
+ { ~(RTUNICP)0, ~(RTUNICP)0, NULL }
+};
+
+
diff --git a/src/VBox/Runtime/common/string/unidata.cpp b/src/VBox/Runtime/common/string/unidata.cpp
deleted file mode 100644
index 4db7406e7de..00000000000
--- a/src/VBox/Runtime/common/string/unidata.cpp
+++ /dev/null
@@ -1,29592 +0,0 @@
-/* $Id$ */
-/** @file
- * IPRT - Unicode Tables
- *
- * Automatically Generated by G:/coding/vbox/tree/out/win32/debug/obj/src/VBox/Runtime/uniread/uniread.exe (Jan 30 2006 04:37:06)
- */
-
-/*
- * Copyright (C) 2006-2010 Oracle Corporation
- *
- * This file is part of VirtualBox Open Source Edition (OSE), as
- * available from http://www.virtualbox.org. This file is free software;
- * you can redistribute it and/or modify it under the terms of the GNU
- * General Public License (GPL) as published by the Free Software
- * Foundation, in version 2 as it comes in the "COPYING" file of the
- * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
- * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
- *
- * The contents of this file may alternatively be used under the terms
- * of the Common Development and Distribution License Version 1.0
- * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
- * VirtualBox OSE distribution, in which case the provisions of the
- * CDDL are applicable instead of those of the GPL.
- *
- * You may elect to license modified versions of this file under the
- * terms and conditions of either the GPL or the CDDL or both.
- */
-
-#include <iprt/uni.h>
-
-static const uint8_t g_afRTUniFlags0x000000[] =
-{
- 0, /* U+000000: <control>*/
- 0, /* U+000001: <control>*/
- 0, /* U+000002: <control>*/
- 0, /* U+000003: <control>*/
- 0, /* U+000004: <control>*/
- 0, /* U+000005: <control>*/
- 0, /* U+000006: <control>*/
- 0, /* U+000007: <control>*/
- 0, /* U+000008: <control>*/
- RTUNI_WSPACE, /* U+000009: <control>*/
- RTUNI_WSPACE, /* U+00000a: <control>*/
- RTUNI_WSPACE, /* U+00000b: <control>*/
- RTUNI_WSPACE, /* U+00000c: <control>*/
- RTUNI_WSPACE, /* U+00000d: <control>*/
- 0, /* U+00000e: <control>*/
- 0, /* U+00000f: <control>*/
- 0, /* U+000010: <control>*/
- 0, /* U+000011: <control>*/
- 0, /* U+000012: <control>*/
- 0, /* U+000013: <control>*/
- 0, /* U+000014: <control>*/
- 0, /* U+000015: <control>*/
- 0, /* U+000016: <control>*/
- 0, /* U+000017: <control>*/
- 0, /* U+000018: <control>*/
- 0, /* U+000019: <control>*/
- 0, /* U+00001a: <control>*/
- 0, /* U+00001b: <control>*/
- 0, /* U+00001c: <control>*/
- 0, /* U+00001d: <control>*/
- 0, /* U+00001e: <control>*/
- 0, /* U+00001f: <control>*/
- RTUNI_WSPACE, /* U+000020: SPACE*/
- 0, /* U+000021: EXCLAMATION MARK*/
- 0, /* U+000022: QUOTATION MARK*/
- 0, /* U+000023: NUMBER SIGN*/
- 0, /* U+000024: DOLLAR SIGN*/
- 0, /* U+000025: PERCENT SIGN*/
- 0, /* U+000026: AMPERSAND*/
- 0, /* U+000027: APOSTROPHE*/
- 0, /* U+000028: LEFT PARENTHESIS*/
- 0, /* U+000029: RIGHT PARENTHESIS*/
- 0, /* U+00002a: ASTERISK*/
- 0, /* U+00002b: PLUS SIGN*/
- 0, /* U+00002c: COMMA*/
- 0, /* U+00002d: HYPHEN-MINUS*/
- 0, /* U+00002e: FULL STOP*/
- 0, /* U+00002f: SOLIDUS*/
- RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+000030: DIGIT ZERO*/
- RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+000031: DIGIT ONE*/
- RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+000032: DIGIT TWO*/
- RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+000033: DIGIT THREE*/
- RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+000034: DIGIT FOUR*/
- RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+000035: DIGIT FIVE*/
- RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+000036: DIGIT SIX*/
- RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+000037: DIGIT SEVEN*/
- RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+000038: DIGIT EIGHT*/
- RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+000039: DIGIT NINE*/
- 0, /* U+00003a: COLON*/
- 0, /* U+00003b: SEMICOLON*/
- 0, /* U+00003c: LESS-THAN SIGN*/
- 0, /* U+00003d: EQUALS SIGN*/
- 0, /* U+00003e: GREATER-THAN SIGN*/
- 0, /* U+00003f: QUESTION MARK*/
- 0, /* U+000040: COMMERCIAL AT*/
- RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_UPPER, /* U+000041: LATIN CAPITAL LETTER A*/
- RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_UPPER, /* U+000042: LATIN CAPITAL LETTER B*/
- RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_UPPER, /* U+000043: LATIN CAPITAL LETTER C*/
- RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_UPPER, /* U+000044: LATIN CAPITAL LETTER D*/
- RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_UPPER, /* U+000045: LATIN CAPITAL LETTER E*/
- RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_UPPER, /* U+000046: LATIN CAPITAL LETTER F*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000047: LATIN CAPITAL LETTER G*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000048: LATIN CAPITAL LETTER H*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000049: LATIN CAPITAL LETTER I*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00004a: LATIN CAPITAL LETTER J*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00004b: LATIN CAPITAL LETTER K*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00004c: LATIN CAPITAL LETTER L*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00004d: LATIN CAPITAL LETTER M*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00004e: LATIN CAPITAL LETTER N*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00004f: LATIN CAPITAL LETTER O*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000050: LATIN CAPITAL LETTER P*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000051: LATIN CAPITAL LETTER Q*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000052: LATIN CAPITAL LETTER R*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000053: LATIN CAPITAL LETTER S*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000054: LATIN CAPITAL LETTER T*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000055: LATIN CAPITAL LETTER U*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000056: LATIN CAPITAL LETTER V*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000057: LATIN CAPITAL LETTER W*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000058: LATIN CAPITAL LETTER X*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000059: LATIN CAPITAL LETTER Y*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00005a: LATIN CAPITAL LETTER Z*/
- 0, /* U+00005b: LEFT SQUARE BRACKET*/
- 0, /* U+00005c: REVERSE SOLIDUS*/
- 0, /* U+00005d: RIGHT SQUARE BRACKET*/
- 0, /* U+00005e: CIRCUMFLEX ACCENT*/
- 0, /* U+00005f: LOW LINE*/
- 0, /* U+000060: GRAVE ACCENT*/
- RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_LOWER, /* U+000061: LATIN SMALL LETTER A*/
- RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_LOWER, /* U+000062: LATIN SMALL LETTER B*/
- RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_LOWER, /* U+000063: LATIN SMALL LETTER C*/
- RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_LOWER, /* U+000064: LATIN SMALL LETTER D*/
- RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_LOWER, /* U+000065: LATIN SMALL LETTER E*/
- RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_LOWER, /* U+000066: LATIN SMALL LETTER F*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000067: LATIN SMALL LETTER G*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000068: LATIN SMALL LETTER H*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000069: LATIN SMALL LETTER I*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00006a: LATIN SMALL LETTER J*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00006b: LATIN SMALL LETTER K*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00006c: LATIN SMALL LETTER L*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00006d: LATIN SMALL LETTER M*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00006e: LATIN SMALL LETTER N*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00006f: LATIN SMALL LETTER O*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000070: LATIN SMALL LETTER P*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000071: LATIN SMALL LETTER Q*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000072: LATIN SMALL LETTER R*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000073: LATIN SMALL LETTER S*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000074: LATIN SMALL LETTER T*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000075: LATIN SMALL LETTER U*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000076: LATIN SMALL LETTER V*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000077: LATIN SMALL LETTER W*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000078: LATIN SMALL LETTER X*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000079: LATIN SMALL LETTER Y*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00007a: LATIN SMALL LETTER Z*/
- 0, /* U+00007b: LEFT CURLY BRACKET*/
- 0, /* U+00007c: VERTICAL LINE*/
- 0, /* U+00007d: RIGHT CURLY BRACKET*/
- 0, /* U+00007e: TILDE*/
- 0, /* U+00007f: <control>*/
- 0, /* U+000080: <control>*/
- 0, /* U+000081: <control>*/
- 0, /* U+000082: <control>*/
- 0, /* U+000083: <control>*/
- 0, /* U+000084: <control>*/
- RTUNI_WSPACE, /* U+000085: <control>*/
- 0, /* U+000086: <control>*/
- 0, /* U+000087: <control>*/
- 0, /* U+000088: <control>*/
- 0, /* U+000089: <control>*/
- 0, /* U+00008a: <control>*/
- 0, /* U+00008b: <control>*/
- 0, /* U+00008c: <control>*/
- 0, /* U+00008d: <control>*/
- 0, /* U+00008e: <control>*/
- 0, /* U+00008f: <control>*/
- 0, /* U+000090: <control>*/
- 0, /* U+000091: <control>*/
- 0, /* U+000092: <control>*/
- 0, /* U+000093: <control>*/
- 0, /* U+000094: <control>*/
- 0, /* U+000095: <control>*/
- 0, /* U+000096: <control>*/
- 0, /* U+000097: <control>*/
- 0, /* U+000098: <control>*/
- 0, /* U+000099: <control>*/
- 0, /* U+00009a: <control>*/
- 0, /* U+00009b: <control>*/
- 0, /* U+00009c: <control>*/
- 0, /* U+00009d: <control>*/
- 0, /* U+00009e: <control>*/
- 0, /* U+00009f: <control>*/
- RTUNI_WSPACE, /* U+0000a0: NO-BREAK SPACE*/
- 0, /* U+0000a1: INVERTED EXCLAMATION MARK*/
- 0, /* U+0000a2: CENT SIGN*/
- 0, /* U+0000a3: POUND SIGN*/
- 0, /* U+0000a4: CURRENCY SIGN*/
- 0, /* U+0000a5: YEN SIGN*/
- 0, /* U+0000a6: BROKEN BAR*/
- 0, /* U+0000a7: SECTION SIGN*/
- 0, /* U+0000a8: DIAERESIS*/
- 0, /* U+0000a9: COPYRIGHT SIGN*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0000aa: FEMININE ORDINAL INDICATOR*/
- 0, /* U+0000ab: LEFT-POINTING DOUBLE ANGLE QUOTATION MARK*/
- 0, /* U+0000ac: NOT SIGN*/
- 0, /* U+0000ad: SOFT HYPHEN*/
- 0, /* U+0000ae: REGISTERED SIGN*/
- 0, /* U+0000af: MACRON*/
- 0, /* U+0000b0: DEGREE SIGN*/
- 0, /* U+0000b1: PLUS-MINUS SIGN*/
- 0, /* U+0000b2: SUPERSCRIPT TWO*/
- 0, /* U+0000b3: SUPERSCRIPT THREE*/
- 0, /* U+0000b4: ACUTE ACCENT*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0000b5: MICRO SIGN*/
- 0, /* U+0000b6: PILCROW SIGN*/
- 0, /* U+0000b7: MIDDLE DOT*/
- 0, /* U+0000b8: CEDILLA*/
- 0, /* U+0000b9: SUPERSCRIPT ONE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0000ba: MASCULINE ORDINAL INDICATOR*/
- 0, /* U+0000bb: RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK*/
- 0, /* U+0000bc: VULGAR FRACTION ONE QUARTER*/
- 0, /* U+0000bd: VULGAR FRACTION ONE HALF*/
- 0, /* U+0000be: VULGAR FRACTION THREE QUARTERS*/
- 0, /* U+0000bf: INVERTED QUESTION MARK*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0000c0: LATIN CAPITAL LETTER A WITH GRAVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0000c1: LATIN CAPITAL LETTER A WITH ACUTE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0000c2: LATIN CAPITAL LETTER A WITH CIRCUMFLEX*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0000c3: LATIN CAPITAL LETTER A WITH TILDE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0000c4: LATIN CAPITAL LETTER A WITH DIAERESIS*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0000c5: LATIN CAPITAL LETTER A WITH RING ABOVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0000c6: LATIN CAPITAL LETTER AE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0000c7: LATIN CAPITAL LETTER C WITH CEDILLA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0000c8: LATIN CAPITAL LETTER E WITH GRAVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0000c9: LATIN CAPITAL LETTER E WITH ACUTE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0000ca: LATIN CAPITAL LETTER E WITH CIRCUMFLEX*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0000cb: LATIN CAPITAL LETTER E WITH DIAERESIS*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0000cc: LATIN CAPITAL LETTER I WITH GRAVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0000cd: LATIN CAPITAL LETTER I WITH ACUTE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0000ce: LATIN CAPITAL LETTER I WITH CIRCUMFLEX*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0000cf: LATIN CAPITAL LETTER I WITH DIAERESIS*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0000d0: LATIN CAPITAL LETTER ETH*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0000d1: LATIN CAPITAL LETTER N WITH TILDE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0000d2: LATIN CAPITAL LETTER O WITH GRAVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0000d3: LATIN CAPITAL LETTER O WITH ACUTE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0000d4: LATIN CAPITAL LETTER O WITH CIRCUMFLEX*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0000d5: LATIN CAPITAL LETTER O WITH TILDE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0000d6: LATIN CAPITAL LETTER O WITH DIAERESIS*/
- 0, /* U+0000d7: MULTIPLICATION SIGN*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0000d8: LATIN CAPITAL LETTER O WITH STROKE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0000d9: LATIN CAPITAL LETTER U WITH GRAVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0000da: LATIN CAPITAL LETTER U WITH ACUTE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0000db: LATIN CAPITAL LETTER U WITH CIRCUMFLEX*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0000dc: LATIN CAPITAL LETTER U WITH DIAERESIS*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0000dd: LATIN CAPITAL LETTER Y WITH ACUTE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0000de: LATIN CAPITAL LETTER THORN*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0000df: LATIN SMALL LETTER SHARP S*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0000e0: LATIN SMALL LETTER A WITH GRAVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0000e1: LATIN SMALL LETTER A WITH ACUTE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0000e2: LATIN SMALL LETTER A WITH CIRCUMFLEX*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0000e3: LATIN SMALL LETTER A WITH TILDE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0000e4: LATIN SMALL LETTER A WITH DIAERESIS*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0000e5: LATIN SMALL LETTER A WITH RING ABOVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0000e6: LATIN SMALL LETTER AE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0000e7: LATIN SMALL LETTER C WITH CEDILLA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0000e8: LATIN SMALL LETTER E WITH GRAVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0000e9: LATIN SMALL LETTER E WITH ACUTE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0000ea: LATIN SMALL LETTER E WITH CIRCUMFLEX*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0000eb: LATIN SMALL LETTER E WITH DIAERESIS*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0000ec: LATIN SMALL LETTER I WITH GRAVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0000ed: LATIN SMALL LETTER I WITH ACUTE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0000ee: LATIN SMALL LETTER I WITH CIRCUMFLEX*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0000ef: LATIN SMALL LETTER I WITH DIAERESIS*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0000f0: LATIN SMALL LETTER ETH*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0000f1: LATIN SMALL LETTER N WITH TILDE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0000f2: LATIN SMALL LETTER O WITH GRAVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0000f3: LATIN SMALL LETTER O WITH ACUTE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0000f4: LATIN SMALL LETTER O WITH CIRCUMFLEX*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0000f5: LATIN SMALL LETTER O WITH TILDE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0000f6: LATIN SMALL LETTER O WITH DIAERESIS*/
- 0, /* U+0000f7: DIVISION SIGN*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0000f8: LATIN SMALL LETTER O WITH STROKE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0000f9: LATIN SMALL LETTER U WITH GRAVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0000fa: LATIN SMALL LETTER U WITH ACUTE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0000fb: LATIN SMALL LETTER U WITH CIRCUMFLEX*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0000fc: LATIN SMALL LETTER U WITH DIAERESIS*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0000fd: LATIN SMALL LETTER Y WITH ACUTE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0000fe: LATIN SMALL LETTER THORN*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0000ff: LATIN SMALL LETTER Y WITH DIAERESIS*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000100: LATIN CAPITAL LETTER A WITH MACRON*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000101: LATIN SMALL LETTER A WITH MACRON*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000102: LATIN CAPITAL LETTER A WITH BREVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000103: LATIN SMALL LETTER A WITH BREVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000104: LATIN CAPITAL LETTER A WITH OGONEK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000105: LATIN SMALL LETTER A WITH OGONEK*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000106: LATIN CAPITAL LETTER C WITH ACUTE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000107: LATIN SMALL LETTER C WITH ACUTE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000108: LATIN CAPITAL LETTER C WITH CIRCUMFLEX*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000109: LATIN SMALL LETTER C WITH CIRCUMFLEX*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00010a: LATIN CAPITAL LETTER C WITH DOT ABOVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00010b: LATIN SMALL LETTER C WITH DOT ABOVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00010c: LATIN CAPITAL LETTER C WITH CARON*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00010d: LATIN SMALL LETTER C WITH CARON*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00010e: LATIN CAPITAL LETTER D WITH CARON*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00010f: LATIN SMALL LETTER D WITH CARON*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000110: LATIN CAPITAL LETTER D WITH STROKE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000111: LATIN SMALL LETTER D WITH STROKE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000112: LATIN CAPITAL LETTER E WITH MACRON*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000113: LATIN SMALL LETTER E WITH MACRON*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000114: LATIN CAPITAL LETTER E WITH BREVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000115: LATIN SMALL LETTER E WITH BREVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000116: LATIN CAPITAL LETTER E WITH DOT ABOVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000117: LATIN SMALL LETTER E WITH DOT ABOVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000118: LATIN CAPITAL LETTER E WITH OGONEK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000119: LATIN SMALL LETTER E WITH OGONEK*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00011a: LATIN CAPITAL LETTER E WITH CARON*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00011b: LATIN SMALL LETTER E WITH CARON*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00011c: LATIN CAPITAL LETTER G WITH CIRCUMFLEX*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00011d: LATIN SMALL LETTER G WITH CIRCUMFLEX*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00011e: LATIN CAPITAL LETTER G WITH BREVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00011f: LATIN SMALL LETTER G WITH BREVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000120: LATIN CAPITAL LETTER G WITH DOT ABOVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000121: LATIN SMALL LETTER G WITH DOT ABOVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000122: LATIN CAPITAL LETTER G WITH CEDILLA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000123: LATIN SMALL LETTER G WITH CEDILLA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000124: LATIN CAPITAL LETTER H WITH CIRCUMFLEX*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000125: LATIN SMALL LETTER H WITH CIRCUMFLEX*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000126: LATIN CAPITAL LETTER H WITH STROKE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000127: LATIN SMALL LETTER H WITH STROKE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000128: LATIN CAPITAL LETTER I WITH TILDE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000129: LATIN SMALL LETTER I WITH TILDE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00012a: LATIN CAPITAL LETTER I WITH MACRON*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00012b: LATIN SMALL LETTER I WITH MACRON*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00012c: LATIN CAPITAL LETTER I WITH BREVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00012d: LATIN SMALL LETTER I WITH BREVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00012e: LATIN CAPITAL LETTER I WITH OGONEK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00012f: LATIN SMALL LETTER I WITH OGONEK*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000130: LATIN CAPITAL LETTER I WITH DOT ABOVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000131: LATIN SMALL LETTER DOTLESS I*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000132: LATIN CAPITAL LIGATURE IJ*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000133: LATIN SMALL LIGATURE IJ*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000134: LATIN CAPITAL LETTER J WITH CIRCUMFLEX*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000135: LATIN SMALL LETTER J WITH CIRCUMFLEX*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000136: LATIN CAPITAL LETTER K WITH CEDILLA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000137: LATIN SMALL LETTER K WITH CEDILLA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000138: LATIN SMALL LETTER KRA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000139: LATIN CAPITAL LETTER L WITH ACUTE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00013a: LATIN SMALL LETTER L WITH ACUTE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00013b: LATIN CAPITAL LETTER L WITH CEDILLA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00013c: LATIN SMALL LETTER L WITH CEDILLA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00013d: LATIN CAPITAL LETTER L WITH CARON*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00013e: LATIN SMALL LETTER L WITH CARON*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00013f: LATIN CAPITAL LETTER L WITH MIDDLE DOT*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000140: LATIN SMALL LETTER L WITH MIDDLE DOT*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000141: LATIN CAPITAL LETTER L WITH STROKE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000142: LATIN SMALL LETTER L WITH STROKE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000143: LATIN CAPITAL LETTER N WITH ACUTE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000144: LATIN SMALL LETTER N WITH ACUTE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000145: LATIN CAPITAL LETTER N WITH CEDILLA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000146: LATIN SMALL LETTER N WITH CEDILLA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000147: LATIN CAPITAL LETTER N WITH CARON*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000148: LATIN SMALL LETTER N WITH CARON*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000149: LATIN SMALL LETTER N PRECEDED BY APOSTROPHE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00014a: LATIN CAPITAL LETTER ENG*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00014b: LATIN SMALL LETTER ENG*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00014c: LATIN CAPITAL LETTER O WITH MACRON*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00014d: LATIN SMALL LETTER O WITH MACRON*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00014e: LATIN CAPITAL LETTER O WITH BREVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00014f: LATIN SMALL LETTER O WITH BREVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000150: LATIN CAPITAL LETTER O WITH DOUBLE ACUTE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000151: LATIN SMALL LETTER O WITH DOUBLE ACUTE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000152: LATIN CAPITAL LIGATURE OE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000153: LATIN SMALL LIGATURE OE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000154: LATIN CAPITAL LETTER R WITH ACUTE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000155: LATIN SMALL LETTER R WITH ACUTE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000156: LATIN CAPITAL LETTER R WITH CEDILLA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000157: LATIN SMALL LETTER R WITH CEDILLA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000158: LATIN CAPITAL LETTER R WITH CARON*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000159: LATIN SMALL LETTER R WITH CARON*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00015a: LATIN CAPITAL LETTER S WITH ACUTE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00015b: LATIN SMALL LETTER S WITH ACUTE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00015c: LATIN CAPITAL LETTER S WITH CIRCUMFLEX*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00015d: LATIN SMALL LETTER S WITH CIRCUMFLEX*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00015e: LATIN CAPITAL LETTER S WITH CEDILLA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00015f: LATIN SMALL LETTER S WITH CEDILLA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000160: LATIN CAPITAL LETTER S WITH CARON*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000161: LATIN SMALL LETTER S WITH CARON*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000162: LATIN CAPITAL LETTER T WITH CEDILLA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000163: LATIN SMALL LETTER T WITH CEDILLA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000164: LATIN CAPITAL LETTER T WITH CARON*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000165: LATIN SMALL LETTER T WITH CARON*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000166: LATIN CAPITAL LETTER T WITH STROKE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000167: LATIN SMALL LETTER T WITH STROKE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000168: LATIN CAPITAL LETTER U WITH TILDE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000169: LATIN SMALL LETTER U WITH TILDE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00016a: LATIN CAPITAL LETTER U WITH MACRON*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00016b: LATIN SMALL LETTER U WITH MACRON*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00016c: LATIN CAPITAL LETTER U WITH BREVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00016d: LATIN SMALL LETTER U WITH BREVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00016e: LATIN CAPITAL LETTER U WITH RING ABOVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00016f: LATIN SMALL LETTER U WITH RING ABOVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000170: LATIN CAPITAL LETTER U WITH DOUBLE ACUTE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000171: LATIN SMALL LETTER U WITH DOUBLE ACUTE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000172: LATIN CAPITAL LETTER U WITH OGONEK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000173: LATIN SMALL LETTER U WITH OGONEK*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000174: LATIN CAPITAL LETTER W WITH CIRCUMFLEX*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000175: LATIN SMALL LETTER W WITH CIRCUMFLEX*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000176: LATIN CAPITAL LETTER Y WITH CIRCUMFLEX*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000177: LATIN SMALL LETTER Y WITH CIRCUMFLEX*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000178: LATIN CAPITAL LETTER Y WITH DIAERESIS*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000179: LATIN CAPITAL LETTER Z WITH ACUTE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00017a: LATIN SMALL LETTER Z WITH ACUTE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00017b: LATIN CAPITAL LETTER Z WITH DOT ABOVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00017c: LATIN SMALL LETTER Z WITH DOT ABOVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00017d: LATIN CAPITAL LETTER Z WITH CARON*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00017e: LATIN SMALL LETTER Z WITH CARON*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00017f: LATIN SMALL LETTER LONG S*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000180: LATIN SMALL LETTER B WITH STROKE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000181: LATIN CAPITAL LETTER B WITH HOOK*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000182: LATIN CAPITAL LETTER B WITH TOPBAR*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000183: LATIN SMALL LETTER B WITH TOPBAR*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000184: LATIN CAPITAL LETTER TONE SIX*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000185: LATIN SMALL LETTER TONE SIX*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000186: LATIN CAPITAL LETTER OPEN O*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000187: LATIN CAPITAL LETTER C WITH HOOK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000188: LATIN SMALL LETTER C WITH HOOK*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000189: LATIN CAPITAL LETTER AFRICAN D*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00018a: LATIN CAPITAL LETTER D WITH HOOK*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00018b: LATIN CAPITAL LETTER D WITH TOPBAR*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00018c: LATIN SMALL LETTER D WITH TOPBAR*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00018d: LATIN SMALL LETTER TURNED DELTA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00018e: LATIN CAPITAL LETTER REVERSED E*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00018f: LATIN CAPITAL LETTER SCHWA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000190: LATIN CAPITAL LETTER OPEN E*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000191: LATIN CAPITAL LETTER F WITH HOOK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000192: LATIN SMALL LETTER F WITH HOOK*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000193: LATIN CAPITAL LETTER G WITH HOOK*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000194: LATIN CAPITAL LETTER GAMMA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000195: LATIN SMALL LETTER HV*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000196: LATIN CAPITAL LETTER IOTA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000197: LATIN CAPITAL LETTER I WITH STROKE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000198: LATIN CAPITAL LETTER K WITH HOOK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000199: LATIN SMALL LETTER K WITH HOOK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00019a: LATIN SMALL LETTER L WITH BAR*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00019b: LATIN SMALL LETTER LAMBDA WITH STROKE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00019c: LATIN CAPITAL LETTER TURNED M*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00019d: LATIN CAPITAL LETTER N WITH LEFT HOOK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00019e: LATIN SMALL LETTER N WITH LONG RIGHT LEG*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00019f: LATIN CAPITAL LETTER O WITH MIDDLE TILDE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0001a0: LATIN CAPITAL LETTER O WITH HORN*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0001a1: LATIN SMALL LETTER O WITH HORN*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0001a2: LATIN CAPITAL LETTER OI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0001a3: LATIN SMALL LETTER OI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0001a4: LATIN CAPITAL LETTER P WITH HOOK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0001a5: LATIN SMALL LETTER P WITH HOOK*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0001a6: LATIN LETTER YR*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0001a7: LATIN CAPITAL LETTER TONE TWO*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0001a8: LATIN SMALL LETTER TONE TWO*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0001a9: LATIN CAPITAL LETTER ESH*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0001aa: LATIN LETTER REVERSED ESH LOOP*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0001ab: LATIN SMALL LETTER T WITH PALATAL HOOK*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0001ac: LATIN CAPITAL LETTER T WITH HOOK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0001ad: LATIN SMALL LETTER T WITH HOOK*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0001ae: LATIN CAPITAL LETTER T WITH RETROFLEX HOOK*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0001af: LATIN CAPITAL LETTER U WITH HORN*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0001b0: LATIN SMALL LETTER U WITH HORN*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0001b1: LATIN CAPITAL LETTER UPSILON*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0001b2: LATIN CAPITAL LETTER V WITH HOOK*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0001b3: LATIN CAPITAL LETTER Y WITH HOOK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0001b4: LATIN SMALL LETTER Y WITH HOOK*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0001b5: LATIN CAPITAL LETTER Z WITH STROKE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0001b6: LATIN SMALL LETTER Z WITH STROKE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0001b7: LATIN CAPITAL LETTER EZH*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0001b8: LATIN CAPITAL LETTER EZH REVERSED*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0001b9: LATIN SMALL LETTER EZH REVERSED*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0001ba: LATIN SMALL LETTER EZH WITH TAIL*/
- RTUNI_ALPHA, /* U+0001bb: LATIN LETTER TWO WITH STROKE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0001bc: LATIN CAPITAL LETTER TONE FIVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0001bd: LATIN SMALL LETTER TONE FIVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0001be: LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0001bf: LATIN LETTER WYNN*/
- RTUNI_ALPHA, /* U+0001c0: LATIN LETTER DENTAL CLICK*/
- RTUNI_ALPHA, /* U+0001c1: LATIN LETTER LATERAL CLICK*/
- RTUNI_ALPHA, /* U+0001c2: LATIN LETTER ALVEOLAR CLICK*/
- RTUNI_ALPHA, /* U+0001c3: LATIN LETTER RETROFLEX CLICK*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0001c4: LATIN CAPITAL LETTER DZ WITH CARON*/
- RTUNI_ALPHA, /* U+0001c5: LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0001c6: LATIN SMALL LETTER DZ WITH CARON*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0001c7: LATIN CAPITAL LETTER LJ*/
- RTUNI_ALPHA, /* U+0001c8: LATIN CAPITAL LETTER L WITH SMALL LETTER J*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0001c9: LATIN SMALL LETTER LJ*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0001ca: LATIN CAPITAL LETTER NJ*/
- RTUNI_ALPHA, /* U+0001cb: LATIN CAPITAL LETTER N WITH SMALL LETTER J*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0001cc: LATIN SMALL LETTER NJ*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0001cd: LATIN CAPITAL LETTER A WITH CARON*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0001ce: LATIN SMALL LETTER A WITH CARON*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0001cf: LATIN CAPITAL LETTER I WITH CARON*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0001d0: LATIN SMALL LETTER I WITH CARON*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0001d1: LATIN CAPITAL LETTER O WITH CARON*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0001d2: LATIN SMALL LETTER O WITH CARON*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0001d3: LATIN CAPITAL LETTER U WITH CARON*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0001d4: LATIN SMALL LETTER U WITH CARON*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0001d5: LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0001d6: LATIN SMALL LETTER U WITH DIAERESIS AND MACRON*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0001d7: LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0001d8: LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0001d9: LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0001da: LATIN SMALL LETTER U WITH DIAERESIS AND CARON*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0001db: LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0001dc: LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0001dd: LATIN SMALL LETTER TURNED E*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0001de: LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0001df: LATIN SMALL LETTER A WITH DIAERESIS AND MACRON*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0001e0: LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0001e1: LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0001e2: LATIN CAPITAL LETTER AE WITH MACRON*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0001e3: LATIN SMALL LETTER AE WITH MACRON*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0001e4: LATIN CAPITAL LETTER G WITH STROKE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0001e5: LATIN SMALL LETTER G WITH STROKE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0001e6: LATIN CAPITAL LETTER G WITH CARON*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0001e7: LATIN SMALL LETTER G WITH CARON*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0001e8: LATIN CAPITAL LETTER K WITH CARON*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0001e9: LATIN SMALL LETTER K WITH CARON*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0001ea: LATIN CAPITAL LETTER O WITH OGONEK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0001eb: LATIN SMALL LETTER O WITH OGONEK*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0001ec: LATIN CAPITAL LETTER O WITH OGONEK AND MACRON*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0001ed: LATIN SMALL LETTER O WITH OGONEK AND MACRON*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0001ee: LATIN CAPITAL LETTER EZH WITH CARON*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0001ef: LATIN SMALL LETTER EZH WITH CARON*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0001f0: LATIN SMALL LETTER J WITH CARON*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0001f1: LATIN CAPITAL LETTER DZ*/
- RTUNI_ALPHA, /* U+0001f2: LATIN CAPITAL LETTER D WITH SMALL LETTER Z*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0001f3: LATIN SMALL LETTER DZ*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0001f4: LATIN CAPITAL LETTER G WITH ACUTE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0001f5: LATIN SMALL LETTER G WITH ACUTE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0001f6: LATIN CAPITAL LETTER HWAIR*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0001f7: LATIN CAPITAL LETTER WYNN*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0001f8: LATIN CAPITAL LETTER N WITH GRAVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0001f9: LATIN SMALL LETTER N WITH GRAVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0001fa: LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0001fb: LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0001fc: LATIN CAPITAL LETTER AE WITH ACUTE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0001fd: LATIN SMALL LETTER AE WITH ACUTE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0001fe: LATIN CAPITAL LETTER O WITH STROKE AND ACUTE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0001ff: LATIN SMALL LETTER O WITH STROKE AND ACUTE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000200: LATIN CAPITAL LETTER A WITH DOUBLE GRAVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000201: LATIN SMALL LETTER A WITH DOUBLE GRAVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000202: LATIN CAPITAL LETTER A WITH INVERTED BREVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000203: LATIN SMALL LETTER A WITH INVERTED BREVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000204: LATIN CAPITAL LETTER E WITH DOUBLE GRAVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000205: LATIN SMALL LETTER E WITH DOUBLE GRAVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000206: LATIN CAPITAL LETTER E WITH INVERTED BREVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000207: LATIN SMALL LETTER E WITH INVERTED BREVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000208: LATIN CAPITAL LETTER I WITH DOUBLE GRAVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000209: LATIN SMALL LETTER I WITH DOUBLE GRAVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00020a: LATIN CAPITAL LETTER I WITH INVERTED BREVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00020b: LATIN SMALL LETTER I WITH INVERTED BREVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00020c: LATIN CAPITAL LETTER O WITH DOUBLE GRAVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00020d: LATIN SMALL LETTER O WITH DOUBLE GRAVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00020e: LATIN CAPITAL LETTER O WITH INVERTED BREVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00020f: LATIN SMALL LETTER O WITH INVERTED BREVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000210: LATIN CAPITAL LETTER R WITH DOUBLE GRAVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000211: LATIN SMALL LETTER R WITH DOUBLE GRAVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000212: LATIN CAPITAL LETTER R WITH INVERTED BREVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000213: LATIN SMALL LETTER R WITH INVERTED BREVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000214: LATIN CAPITAL LETTER U WITH DOUBLE GRAVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000215: LATIN SMALL LETTER U WITH DOUBLE GRAVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000216: LATIN CAPITAL LETTER U WITH INVERTED BREVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000217: LATIN SMALL LETTER U WITH INVERTED BREVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000218: LATIN CAPITAL LETTER S WITH COMMA BELOW*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000219: LATIN SMALL LETTER S WITH COMMA BELOW*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00021a: LATIN CAPITAL LETTER T WITH COMMA BELOW*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00021b: LATIN SMALL LETTER T WITH COMMA BELOW*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00021c: LATIN CAPITAL LETTER YOGH*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00021d: LATIN SMALL LETTER YOGH*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00021e: LATIN CAPITAL LETTER H WITH CARON*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00021f: LATIN SMALL LETTER H WITH CARON*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000220: LATIN CAPITAL LETTER N WITH LONG RIGHT LEG*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000221: LATIN SMALL LETTER D WITH CURL*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000222: LATIN CAPITAL LETTER OU*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000223: LATIN SMALL LETTER OU*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000224: LATIN CAPITAL LETTER Z WITH HOOK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000225: LATIN SMALL LETTER Z WITH HOOK*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000226: LATIN CAPITAL LETTER A WITH DOT ABOVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000227: LATIN SMALL LETTER A WITH DOT ABOVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000228: LATIN CAPITAL LETTER E WITH CEDILLA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000229: LATIN SMALL LETTER E WITH CEDILLA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00022a: LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00022b: LATIN SMALL LETTER O WITH DIAERESIS AND MACRON*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00022c: LATIN CAPITAL LETTER O WITH TILDE AND MACRON*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00022d: LATIN SMALL LETTER O WITH TILDE AND MACRON*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00022e: LATIN CAPITAL LETTER O WITH DOT ABOVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00022f: LATIN SMALL LETTER O WITH DOT ABOVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000230: LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000231: LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000232: LATIN CAPITAL LETTER Y WITH MACRON*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000233: LATIN SMALL LETTER Y WITH MACRON*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000234: LATIN SMALL LETTER L WITH CURL*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000235: LATIN SMALL LETTER N WITH CURL*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000236: LATIN SMALL LETTER T WITH CURL*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000237: LATIN SMALL LETTER DOTLESS J*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000238: LATIN SMALL LETTER DB DIGRAPH*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000239: LATIN SMALL LETTER QP DIGRAPH*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00023a: LATIN CAPITAL LETTER A WITH STROKE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00023b: LATIN CAPITAL LETTER C WITH STROKE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00023c: LATIN SMALL LETTER C WITH STROKE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00023d: LATIN CAPITAL LETTER L WITH BAR*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00023e: LATIN CAPITAL LETTER T WITH DIAGONAL STROKE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00023f: LATIN SMALL LETTER S WITH SWASH TAIL*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000240: LATIN SMALL LETTER Z WITH SWASH TAIL*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000241: LATIN CAPITAL LETTER GLOTTAL STOP*/
- 0, /* U+000242: */
- 0, /* U+000243: */
- 0, /* U+000244: */
- 0, /* U+000245: */
- 0, /* U+000246: */
- 0, /* U+000247: */
- 0, /* U+000248: */
- 0, /* U+000249: */
- 0, /* U+00024a: */
- 0, /* U+00024b: */
- 0, /* U+00024c: */
- 0, /* U+00024d: */
- 0, /* U+00024e: */
- 0, /* U+00024f: */
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000250: LATIN SMALL LETTER TURNED A*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000251: LATIN SMALL LETTER ALPHA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000252: LATIN SMALL LETTER TURNED ALPHA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000253: LATIN SMALL LETTER B WITH HOOK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000254: LATIN SMALL LETTER OPEN O*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000255: LATIN SMALL LETTER C WITH CURL*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000256: LATIN SMALL LETTER D WITH TAIL*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000257: LATIN SMALL LETTER D WITH HOOK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000258: LATIN SMALL LETTER REVERSED E*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000259: LATIN SMALL LETTER SCHWA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00025a: LATIN SMALL LETTER SCHWA WITH HOOK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00025b: LATIN SMALL LETTER OPEN E*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00025c: LATIN SMALL LETTER REVERSED OPEN E*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00025d: LATIN SMALL LETTER REVERSED OPEN E WITH HOOK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00025e: LATIN SMALL LETTER CLOSED REVERSED OPEN E*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00025f: LATIN SMALL LETTER DOTLESS J WITH STROKE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000260: LATIN SMALL LETTER G WITH HOOK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000261: LATIN SMALL LETTER SCRIPT G*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000262: LATIN LETTER SMALL CAPITAL G*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000263: LATIN SMALL LETTER GAMMA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000264: LATIN SMALL LETTER RAMS HORN*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000265: LATIN SMALL LETTER TURNED H*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000266: LATIN SMALL LETTER H WITH HOOK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000267: LATIN SMALL LETTER HENG WITH HOOK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000268: LATIN SMALL LETTER I WITH STROKE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000269: LATIN SMALL LETTER IOTA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00026a: LATIN LETTER SMALL CAPITAL I*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00026b: LATIN SMALL LETTER L WITH MIDDLE TILDE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00026c: LATIN SMALL LETTER L WITH BELT*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00026d: LATIN SMALL LETTER L WITH RETROFLEX HOOK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00026e: LATIN SMALL LETTER LEZH*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00026f: LATIN SMALL LETTER TURNED M*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000270: LATIN SMALL LETTER TURNED M WITH LONG LEG*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000271: LATIN SMALL LETTER M WITH HOOK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000272: LATIN SMALL LETTER N WITH LEFT HOOK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000273: LATIN SMALL LETTER N WITH RETROFLEX HOOK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000274: LATIN LETTER SMALL CAPITAL N*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000275: LATIN SMALL LETTER BARRED O*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000276: LATIN LETTER SMALL CAPITAL OE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000277: LATIN SMALL LETTER CLOSED OMEGA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000278: LATIN SMALL LETTER PHI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000279: LATIN SMALL LETTER TURNED R*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00027a: LATIN SMALL LETTER TURNED R WITH LONG LEG*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00027b: LATIN SMALL LETTER TURNED R WITH HOOK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00027c: LATIN SMALL LETTER R WITH LONG LEG*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00027d: LATIN SMALL LETTER R WITH TAIL*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00027e: LATIN SMALL LETTER R WITH FISHHOOK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00027f: LATIN SMALL LETTER REVERSED R WITH FISHHOOK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000280: LATIN LETTER SMALL CAPITAL R*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000281: LATIN LETTER SMALL CAPITAL INVERTED R*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000282: LATIN SMALL LETTER S WITH HOOK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000283: LATIN SMALL LETTER ESH*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000284: LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000285: LATIN SMALL LETTER SQUAT REVERSED ESH*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000286: LATIN SMALL LETTER ESH WITH CURL*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000287: LATIN SMALL LETTER TURNED T*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000288: LATIN SMALL LETTER T WITH RETROFLEX HOOK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000289: LATIN SMALL LETTER U BAR*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00028a: LATIN SMALL LETTER UPSILON*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00028b: LATIN SMALL LETTER V WITH HOOK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00028c: LATIN SMALL LETTER TURNED V*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00028d: LATIN SMALL LETTER TURNED W*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00028e: LATIN SMALL LETTER TURNED Y*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00028f: LATIN LETTER SMALL CAPITAL Y*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000290: LATIN SMALL LETTER Z WITH RETROFLEX HOOK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000291: LATIN SMALL LETTER Z WITH CURL*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000292: LATIN SMALL LETTER EZH*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000293: LATIN SMALL LETTER EZH WITH CURL*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000294: LATIN LETTER GLOTTAL STOP*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000295: LATIN LETTER PHARYNGEAL VOICED FRICATIVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000296: LATIN LETTER INVERTED GLOTTAL STOP*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000297: LATIN LETTER STRETCHED C*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000298: LATIN LETTER BILABIAL CLICK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000299: LATIN LETTER SMALL CAPITAL B*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00029a: LATIN SMALL LETTER CLOSED OPEN E*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00029b: LATIN LETTER SMALL CAPITAL G WITH HOOK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00029c: LATIN LETTER SMALL CAPITAL H*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00029d: LATIN SMALL LETTER J WITH CROSSED-TAIL*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00029e: LATIN SMALL LETTER TURNED K*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00029f: LATIN LETTER SMALL CAPITAL L*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0002a0: LATIN SMALL LETTER Q WITH HOOK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0002a1: LATIN LETTER GLOTTAL STOP WITH STROKE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0002a2: LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0002a3: LATIN SMALL LETTER DZ DIGRAPH*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0002a4: LATIN SMALL LETTER DEZH DIGRAPH*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0002a5: LATIN SMALL LETTER DZ DIGRAPH WITH CURL*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0002a6: LATIN SMALL LETTER TS DIGRAPH*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0002a7: LATIN SMALL LETTER TESH DIGRAPH*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0002a8: LATIN SMALL LETTER TC DIGRAPH WITH CURL*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0002a9: LATIN SMALL LETTER FENG DIGRAPH*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0002aa: LATIN SMALL LETTER LS DIGRAPH*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0002ab: LATIN SMALL LETTER LZ DIGRAPH*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0002ac: LATIN LETTER BILABIAL PERCUSSIVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0002ad: LATIN LETTER BIDENTAL PERCUSSIVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0002ae: LATIN SMALL LETTER TURNED H WITH FISHHOOK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0002af: LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0002b0: MODIFIER LETTER SMALL H*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0002b1: MODIFIER LETTER SMALL H WITH HOOK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0002b2: MODIFIER LETTER SMALL J*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0002b3: MODIFIER LETTER SMALL R*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0002b4: MODIFIER LETTER SMALL TURNED R*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0002b5: MODIFIER LETTER SMALL TURNED R WITH HOOK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0002b6: MODIFIER LETTER SMALL CAPITAL INVERTED R*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0002b7: MODIFIER LETTER SMALL W*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0002b8: MODIFIER LETTER SMALL Y*/
- RTUNI_ALPHA, /* U+0002b9: MODIFIER LETTER PRIME*/
- RTUNI_ALPHA, /* U+0002ba: MODIFIER LETTER DOUBLE PRIME*/
- RTUNI_ALPHA, /* U+0002bb: MODIFIER LETTER TURNED COMMA*/
- RTUNI_ALPHA, /* U+0002bc: MODIFIER LETTER APOSTROPHE*/
- RTUNI_ALPHA, /* U+0002bd: MODIFIER LETTER REVERSED COMMA*/
- RTUNI_ALPHA, /* U+0002be: MODIFIER LETTER RIGHT HALF RING*/
- RTUNI_ALPHA, /* U+0002bf: MODIFIER LETTER LEFT HALF RING*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0002c0: MODIFIER LETTER GLOTTAL STOP*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0002c1: MODIFIER LETTER REVERSED GLOTTAL STOP*/
- 0, /* U+0002c2: MODIFIER LETTER LEFT ARROWHEAD*/
- 0, /* U+0002c3: MODIFIER LETTER RIGHT ARROWHEAD*/
- 0, /* U+0002c4: MODIFIER LETTER UP ARROWHEAD*/
- 0, /* U+0002c5: MODIFIER LETTER DOWN ARROWHEAD*/
- RTUNI_ALPHA, /* U+0002c6: MODIFIER LETTER CIRCUMFLEX ACCENT*/
- RTUNI_ALPHA, /* U+0002c7: CARON*/
- RTUNI_ALPHA, /* U+0002c8: MODIFIER LETTER VERTICAL LINE*/
- RTUNI_ALPHA, /* U+0002c9: MODIFIER LETTER MACRON*/
- RTUNI_ALPHA, /* U+0002ca: MODIFIER LETTER ACUTE ACCENT*/
- RTUNI_ALPHA, /* U+0002cb: MODIFIER LETTER GRAVE ACCENT*/
- RTUNI_ALPHA, /* U+0002cc: MODIFIER LETTER LOW VERTICAL LINE*/
- RTUNI_ALPHA, /* U+0002cd: MODIFIER LETTER LOW MACRON*/
- RTUNI_ALPHA, /* U+0002ce: MODIFIER LETTER LOW GRAVE ACCENT*/
- RTUNI_ALPHA, /* U+0002cf: MODIFIER LETTER LOW ACUTE ACCENT*/
- RTUNI_ALPHA, /* U+0002d0: MODIFIER LETTER TRIANGULAR COLON*/
- RTUNI_ALPHA, /* U+0002d1: MODIFIER LETTER HALF TRIANGULAR COLON*/
- 0, /* U+0002d2: MODIFIER LETTER CENTRED RIGHT HALF RING*/
- 0, /* U+0002d3: MODIFIER LETTER CENTRED LEFT HALF RING*/
- 0, /* U+0002d4: MODIFIER LETTER UP TACK*/
- 0, /* U+0002d5: MODIFIER LETTER DOWN TACK*/
- 0, /* U+0002d6: MODIFIER LETTER PLUS SIGN*/
- 0, /* U+0002d7: MODIFIER LETTER MINUS SIGN*/
- 0, /* U+0002d8: BREVE*/
- 0, /* U+0002d9: DOT ABOVE*/
- 0, /* U+0002da: RING ABOVE*/
- 0, /* U+0002db: OGONEK*/
- 0, /* U+0002dc: SMALL TILDE*/
- 0, /* U+0002dd: DOUBLE ACUTE ACCENT*/
- 0, /* U+0002de: MODIFIER LETTER RHOTIC HOOK*/
- 0, /* U+0002df: MODIFIER LETTER CROSS ACCENT*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0002e0: MODIFIER LETTER SMALL GAMMA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0002e1: MODIFIER LETTER SMALL L*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0002e2: MODIFIER LETTER SMALL S*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0002e3: MODIFIER LETTER SMALL X*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0002e4: MODIFIER LETTER SMALL REVERSED GLOTTAL STOP*/
- 0, /* U+0002e5: MODIFIER LETTER EXTRA-HIGH TONE BAR*/
- 0, /* U+0002e6: MODIFIER LETTER HIGH TONE BAR*/
- 0, /* U+0002e7: MODIFIER LETTER MID TONE BAR*/
- 0, /* U+0002e8: MODIFIER LETTER LOW TONE BAR*/
- 0, /* U+0002e9: MODIFIER LETTER EXTRA-LOW TONE BAR*/
- 0, /* U+0002ea: MODIFIER LETTER YIN DEPARTING TONE MARK*/
- 0, /* U+0002eb: MODIFIER LETTER YANG DEPARTING TONE MARK*/
- 0, /* U+0002ec: MODIFIER LETTER VOICING*/
- 0, /* U+0002ed: MODIFIER LETTER UNASPIRATED*/
- RTUNI_ALPHA, /* U+0002ee: MODIFIER LETTER DOUBLE APOSTROPHE*/
- 0, /* U+0002ef: MODIFIER LETTER LOW DOWN ARROWHEAD*/
- 0, /* U+0002f0: MODIFIER LETTER LOW UP ARROWHEAD*/
- 0, /* U+0002f1: MODIFIER LETTER LOW LEFT ARROWHEAD*/
- 0, /* U+0002f2: MODIFIER LETTER LOW RIGHT ARROWHEAD*/
- 0, /* U+0002f3: MODIFIER LETTER LOW RING*/
- 0, /* U+0002f4: MODIFIER LETTER MIDDLE GRAVE ACCENT*/
- 0, /* U+0002f5: MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT*/
- 0, /* U+0002f6: MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT*/
- 0, /* U+0002f7: MODIFIER LETTER LOW TILDE*/
- 0, /* U+0002f8: MODIFIER LETTER RAISED COLON*/
- 0, /* U+0002f9: MODIFIER LETTER BEGIN HIGH TONE*/
- 0, /* U+0002fa: MODIFIER LETTER END HIGH TONE*/
- 0, /* U+0002fb: MODIFIER LETTER BEGIN LOW TONE*/
- 0, /* U+0002fc: MODIFIER LETTER END LOW TONE*/
- 0, /* U+0002fd: MODIFIER LETTER SHELF*/
- 0, /* U+0002fe: MODIFIER LETTER OPEN SHELF*/
- 0, /* U+0002ff: MODIFIER LETTER LOW LEFT ARROW*/
- 0, /* U+000300: COMBINING GRAVE ACCENT*/
- 0, /* U+000301: COMBINING ACUTE ACCENT*/
- 0, /* U+000302: COMBINING CIRCUMFLEX ACCENT*/
- 0, /* U+000303: COMBINING TILDE*/
- 0, /* U+000304: COMBINING MACRON*/
- 0, /* U+000305: COMBINING OVERLINE*/
- 0, /* U+000306: COMBINING BREVE*/
- 0, /* U+000307: COMBINING DOT ABOVE*/
- 0, /* U+000308: COMBINING DIAERESIS*/
- 0, /* U+000309: COMBINING HOOK ABOVE*/
- 0, /* U+00030a: COMBINING RING ABOVE*/
- 0, /* U+00030b: COMBINING DOUBLE ACUTE ACCENT*/
- 0, /* U+00030c: COMBINING CARON*/
- 0, /* U+00030d: COMBINING VERTICAL LINE ABOVE*/
- 0, /* U+00030e: COMBINING DOUBLE VERTICAL LINE ABOVE*/
- 0, /* U+00030f: COMBINING DOUBLE GRAVE ACCENT*/
- 0, /* U+000310: COMBINING CANDRABINDU*/
- 0, /* U+000311: COMBINING INVERTED BREVE*/
- 0, /* U+000312: COMBINING TURNED COMMA ABOVE*/
- 0, /* U+000313: COMBINING COMMA ABOVE*/
- 0, /* U+000314: COMBINING REVERSED COMMA ABOVE*/
- 0, /* U+000315: COMBINING COMMA ABOVE RIGHT*/
- 0, /* U+000316: COMBINING GRAVE ACCENT BELOW*/
- 0, /* U+000317: COMBINING ACUTE ACCENT BELOW*/
- 0, /* U+000318: COMBINING LEFT TACK BELOW*/
- 0, /* U+000319: COMBINING RIGHT TACK BELOW*/
- 0, /* U+00031a: COMBINING LEFT ANGLE ABOVE*/
- 0, /* U+00031b: COMBINING HORN*/
- 0, /* U+00031c: COMBINING LEFT HALF RING BELOW*/
- 0, /* U+00031d: COMBINING UP TACK BELOW*/
- 0, /* U+00031e: COMBINING DOWN TACK BELOW*/
- 0, /* U+00031f: COMBINING PLUS SIGN BELOW*/
- 0, /* U+000320: COMBINING MINUS SIGN BELOW*/
- 0, /* U+000321: COMBINING PALATALIZED HOOK BELOW*/
- 0, /* U+000322: COMBINING RETROFLEX HOOK BELOW*/
- 0, /* U+000323: COMBINING DOT BELOW*/
- 0, /* U+000324: COMBINING DIAERESIS BELOW*/
- 0, /* U+000325: COMBINING RING BELOW*/
- 0, /* U+000326: COMBINING COMMA BELOW*/
- 0, /* U+000327: COMBINING CEDILLA*/
- 0, /* U+000328: COMBINING OGONEK*/
- 0, /* U+000329: COMBINING VERTICAL LINE BELOW*/
- 0, /* U+00032a: COMBINING BRIDGE BELOW*/
- 0, /* U+00032b: COMBINING INVERTED DOUBLE ARCH BELOW*/
- 0, /* U+00032c: COMBINING CARON BELOW*/
- 0, /* U+00032d: COMBINING CIRCUMFLEX ACCENT BELOW*/
- 0, /* U+00032e: COMBINING BREVE BELOW*/
- 0, /* U+00032f: COMBINING INVERTED BREVE BELOW*/
- 0, /* U+000330: COMBINING TILDE BELOW*/
- 0, /* U+000331: COMBINING MACRON BELOW*/
- 0, /* U+000332: COMBINING LOW LINE*/
- 0, /* U+000333: COMBINING DOUBLE LOW LINE*/
- 0, /* U+000334: COMBINING TILDE OVERLAY*/
- 0, /* U+000335: COMBINING SHORT STROKE OVERLAY*/
- 0, /* U+000336: COMBINING LONG STROKE OVERLAY*/
- 0, /* U+000337: COMBINING SHORT SOLIDUS OVERLAY*/
- 0, /* U+000338: COMBINING LONG SOLIDUS OVERLAY*/
- 0, /* U+000339: COMBINING RIGHT HALF RING BELOW*/
- 0, /* U+00033a: COMBINING INVERTED BRIDGE BELOW*/
- 0, /* U+00033b: COMBINING SQUARE BELOW*/
- 0, /* U+00033c: COMBINING SEAGULL BELOW*/
- 0, /* U+00033d: COMBINING X ABOVE*/
- 0, /* U+00033e: COMBINING VERTICAL TILDE*/
- 0, /* U+00033f: COMBINING DOUBLE OVERLINE*/
- 0, /* U+000340: COMBINING GRAVE TONE MARK*/
- 0, /* U+000341: COMBINING ACUTE TONE MARK*/
- 0, /* U+000342: COMBINING GREEK PERISPOMENI*/
- 0, /* U+000343: COMBINING GREEK KORONIS*/
- 0, /* U+000344: COMBINING GREEK DIALYTIKA TONOS*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000345: COMBINING GREEK YPOGEGRAMMENI*/
- 0, /* U+000346: COMBINING BRIDGE ABOVE*/
- 0, /* U+000347: COMBINING EQUALS SIGN BELOW*/
- 0, /* U+000348: COMBINING DOUBLE VERTICAL LINE BELOW*/
- 0, /* U+000349: COMBINING LEFT ANGLE BELOW*/
- 0, /* U+00034a: COMBINING NOT TILDE ABOVE*/
- 0, /* U+00034b: COMBINING HOMOTHETIC ABOVE*/
- 0, /* U+00034c: COMBINING ALMOST EQUAL TO ABOVE*/
- 0, /* U+00034d: COMBINING LEFT RIGHT ARROW BELOW*/
- 0, /* U+00034e: COMBINING UPWARDS ARROW BELOW*/
- 0, /* U+00034f: COMBINING GRAPHEME JOINER*/
- 0, /* U+000350: COMBINING RIGHT ARROWHEAD ABOVE*/
- 0, /* U+000351: COMBINING LEFT HALF RING ABOVE*/
- 0, /* U+000352: COMBINING FERMATA*/
- 0, /* U+000353: COMBINING X BELOW*/
- 0, /* U+000354: COMBINING LEFT ARROWHEAD BELOW*/
- 0, /* U+000355: COMBINING RIGHT ARROWHEAD BELOW*/
- 0, /* U+000356: COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW*/
- 0, /* U+000357: COMBINING RIGHT HALF RING ABOVE*/
- 0, /* U+000358: COMBINING DOT ABOVE RIGHT*/
- 0, /* U+000359: COMBINING ASTERISK BELOW*/
- 0, /* U+00035a: COMBINING DOUBLE RING BELOW*/
- 0, /* U+00035b: COMBINING ZIGZAG ABOVE*/
- 0, /* U+00035c: COMBINING DOUBLE BREVE BELOW*/
- 0, /* U+00035d: COMBINING DOUBLE BREVE*/
- 0, /* U+00035e: COMBINING DOUBLE MACRON*/
- 0, /* U+00035f: COMBINING DOUBLE MACRON BELOW*/
- 0, /* U+000360: COMBINING DOUBLE TILDE*/
- 0, /* U+000361: COMBINING DOUBLE INVERTED BREVE*/
- 0, /* U+000362: COMBINING DOUBLE RIGHTWARDS ARROW BELOW*/
- 0, /* U+000363: COMBINING LATIN SMALL LETTER A*/
- 0, /* U+000364: COMBINING LATIN SMALL LETTER E*/
- 0, /* U+000365: COMBINING LATIN SMALL LETTER I*/
- 0, /* U+000366: COMBINING LATIN SMALL LETTER O*/
- 0, /* U+000367: COMBINING LATIN SMALL LETTER U*/
- 0, /* U+000368: COMBINING LATIN SMALL LETTER C*/
- 0, /* U+000369: COMBINING LATIN SMALL LETTER D*/
- 0, /* U+00036a: COMBINING LATIN SMALL LETTER H*/
- 0, /* U+00036b: COMBINING LATIN SMALL LETTER M*/
- 0, /* U+00036c: COMBINING LATIN SMALL LETTER R*/
- 0, /* U+00036d: COMBINING LATIN SMALL LETTER T*/
- 0, /* U+00036e: COMBINING LATIN SMALL LETTER V*/
- 0, /* U+00036f: COMBINING LATIN SMALL LETTER X*/
- 0, /* U+000370: */
- 0, /* U+000371: */
- 0, /* U+000372: */
- 0, /* U+000373: */
- 0, /* U+000374: GREEK NUMERAL SIGN*/
- 0, /* U+000375: GREEK LOWER NUMERAL SIGN*/
- 0, /* U+000376: */
- 0, /* U+000377: */
- 0, /* U+000378: */
- 0, /* U+000379: */
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00037a: GREEK YPOGEGRAMMENI*/
- 0, /* U+00037b: */
- 0, /* U+00037c: */
- 0, /* U+00037d: */
- 0, /* U+00037e: GREEK QUESTION MARK*/
- 0, /* U+00037f: */
- 0, /* U+000380: */
- 0, /* U+000381: */
- 0, /* U+000382: */
- 0, /* U+000383: */
- 0, /* U+000384: GREEK TONOS*/
- 0, /* U+000385: GREEK DIALYTIKA TONOS*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000386: GREEK CAPITAL LETTER ALPHA WITH TONOS*/
- 0, /* U+000387: GREEK ANO TELEIA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000388: GREEK CAPITAL LETTER EPSILON WITH TONOS*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000389: GREEK CAPITAL LETTER ETA WITH TONOS*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00038a: GREEK CAPITAL LETTER IOTA WITH TONOS*/
- 0, /* U+00038b: */
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00038c: GREEK CAPITAL LETTER OMICRON WITH TONOS*/
- 0, /* U+00038d: */
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00038e: GREEK CAPITAL LETTER UPSILON WITH TONOS*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00038f: GREEK CAPITAL LETTER OMEGA WITH TONOS*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000390: GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000391: GREEK CAPITAL LETTER ALPHA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000392: GREEK CAPITAL LETTER BETA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000393: GREEK CAPITAL LETTER GAMMA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000394: GREEK CAPITAL LETTER DELTA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000395: GREEK CAPITAL LETTER EPSILON*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000396: GREEK CAPITAL LETTER ZETA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000397: GREEK CAPITAL LETTER ETA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000398: GREEK CAPITAL LETTER THETA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000399: GREEK CAPITAL LETTER IOTA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00039a: GREEK CAPITAL LETTER KAPPA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00039b: GREEK CAPITAL LETTER LAMDA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00039c: GREEK CAPITAL LETTER MU*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00039d: GREEK CAPITAL LETTER NU*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00039e: GREEK CAPITAL LETTER XI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00039f: GREEK CAPITAL LETTER OMICRON*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0003a0: GREEK CAPITAL LETTER PI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0003a1: GREEK CAPITAL LETTER RHO*/
- 0, /* U+0003a2: */
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0003a3: GREEK CAPITAL LETTER SIGMA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0003a4: GREEK CAPITAL LETTER TAU*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0003a5: GREEK CAPITAL LETTER UPSILON*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0003a6: GREEK CAPITAL LETTER PHI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0003a7: GREEK CAPITAL LETTER CHI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0003a8: GREEK CAPITAL LETTER PSI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0003a9: GREEK CAPITAL LETTER OMEGA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0003aa: GREEK CAPITAL LETTER IOTA WITH DIALYTIKA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0003ab: GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0003ac: GREEK SMALL LETTER ALPHA WITH TONOS*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0003ad: GREEK SMALL LETTER EPSILON WITH TONOS*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0003ae: GREEK SMALL LETTER ETA WITH TONOS*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0003af: GREEK SMALL LETTER IOTA WITH TONOS*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0003b0: GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0003b1: GREEK SMALL LETTER ALPHA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0003b2: GREEK SMALL LETTER BETA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0003b3: GREEK SMALL LETTER GAMMA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0003b4: GREEK SMALL LETTER DELTA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0003b5: GREEK SMALL LETTER EPSILON*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0003b6: GREEK SMALL LETTER ZETA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0003b7: GREEK SMALL LETTER ETA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0003b8: GREEK SMALL LETTER THETA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0003b9: GREEK SMALL LETTER IOTA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0003ba: GREEK SMALL LETTER KAPPA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0003bb: GREEK SMALL LETTER LAMDA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0003bc: GREEK SMALL LETTER MU*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0003bd: GREEK SMALL LETTER NU*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0003be: GREEK SMALL LETTER XI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0003bf: GREEK SMALL LETTER OMICRON*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0003c0: GREEK SMALL LETTER PI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0003c1: GREEK SMALL LETTER RHO*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0003c2: GREEK SMALL LETTER FINAL SIGMA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0003c3: GREEK SMALL LETTER SIGMA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0003c4: GREEK SMALL LETTER TAU*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0003c5: GREEK SMALL LETTER UPSILON*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0003c6: GREEK SMALL LETTER PHI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0003c7: GREEK SMALL LETTER CHI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0003c8: GREEK SMALL LETTER PSI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0003c9: GREEK SMALL LETTER OMEGA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0003ca: GREEK SMALL LETTER IOTA WITH DIALYTIKA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0003cb: GREEK SMALL LETTER UPSILON WITH DIALYTIKA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0003cc: GREEK SMALL LETTER OMICRON WITH TONOS*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0003cd: GREEK SMALL LETTER UPSILON WITH TONOS*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0003ce: GREEK SMALL LETTER OMEGA WITH TONOS*/
- 0, /* U+0003cf: */
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0003d0: GREEK BETA SYMBOL*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0003d1: GREEK THETA SYMBOL*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0003d2: GREEK UPSILON WITH HOOK SYMBOL*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0003d3: GREEK UPSILON WITH ACUTE AND HOOK SYMBOL*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0003d4: GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0003d5: GREEK PHI SYMBOL*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0003d6: GREEK PI SYMBOL*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0003d7: GREEK KAI SYMBOL*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0003d8: GREEK LETTER ARCHAIC KOPPA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0003d9: GREEK SMALL LETTER ARCHAIC KOPPA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0003da: GREEK LETTER STIGMA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0003db: GREEK SMALL LETTER STIGMA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0003dc: GREEK LETTER DIGAMMA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0003dd: GREEK SMALL LETTER DIGAMMA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0003de: GREEK LETTER KOPPA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0003df: GREEK SMALL LETTER KOPPA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0003e0: GREEK LETTER SAMPI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0003e1: GREEK SMALL LETTER SAMPI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0003e2: COPTIC CAPITAL LETTER SHEI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0003e3: COPTIC SMALL LETTER SHEI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0003e4: COPTIC CAPITAL LETTER FEI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0003e5: COPTIC SMALL LETTER FEI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0003e6: COPTIC CAPITAL LETTER KHEI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0003e7: COPTIC SMALL LETTER KHEI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0003e8: COPTIC CAPITAL LETTER HORI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0003e9: COPTIC SMALL LETTER HORI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0003ea: COPTIC CAPITAL LETTER GANGIA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0003eb: COPTIC SMALL LETTER GANGIA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0003ec: COPTIC CAPITAL LETTER SHIMA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0003ed: COPTIC SMALL LETTER SHIMA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0003ee: COPTIC CAPITAL LETTER DEI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0003ef: COPTIC SMALL LETTER DEI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0003f0: GREEK KAPPA SYMBOL*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0003f1: GREEK RHO SYMBOL*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0003f2: GREEK LUNATE SIGMA SYMBOL*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0003f3: GREEK LETTER YOT*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0003f4: GREEK CAPITAL THETA SYMBOL*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0003f5: GREEK LUNATE EPSILON SYMBOL*/
- 0, /* U+0003f6: GREEK REVERSED LUNATE EPSILON SYMBOL*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0003f7: GREEK CAPITAL LETTER SHO*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0003f8: GREEK SMALL LETTER SHO*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0003f9: GREEK CAPITAL LUNATE SIGMA SYMBOL*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0003fa: GREEK CAPITAL LETTER SAN*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0003fb: GREEK SMALL LETTER SAN*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0003fc: GREEK RHO WITH STROKE SYMBOL*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0003fd: GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0003fe: GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0003ff: GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000400: CYRILLIC CAPITAL LETTER IE WITH GRAVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000401: CYRILLIC CAPITAL LETTER IO*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000402: CYRILLIC CAPITAL LETTER DJE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000403: CYRILLIC CAPITAL LETTER GJE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000404: CYRILLIC CAPITAL LETTER UKRAINIAN IE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000405: CYRILLIC CAPITAL LETTER DZE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000406: CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000407: CYRILLIC CAPITAL LETTER YI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000408: CYRILLIC CAPITAL LETTER JE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000409: CYRILLIC CAPITAL LETTER LJE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00040a: CYRILLIC CAPITAL LETTER NJE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00040b: CYRILLIC CAPITAL LETTER TSHE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00040c: CYRILLIC CAPITAL LETTER KJE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00040d: CYRILLIC CAPITAL LETTER I WITH GRAVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00040e: CYRILLIC CAPITAL LETTER SHORT U*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00040f: CYRILLIC CAPITAL LETTER DZHE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000410: CYRILLIC CAPITAL LETTER A*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000411: CYRILLIC CAPITAL LETTER BE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000412: CYRILLIC CAPITAL LETTER VE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000413: CYRILLIC CAPITAL LETTER GHE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000414: CYRILLIC CAPITAL LETTER DE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000415: CYRILLIC CAPITAL LETTER IE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000416: CYRILLIC CAPITAL LETTER ZHE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000417: CYRILLIC CAPITAL LETTER ZE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000418: CYRILLIC CAPITAL LETTER I*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000419: CYRILLIC CAPITAL LETTER SHORT I*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00041a: CYRILLIC CAPITAL LETTER KA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00041b: CYRILLIC CAPITAL LETTER EL*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00041c: CYRILLIC CAPITAL LETTER EM*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00041d: CYRILLIC CAPITAL LETTER EN*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00041e: CYRILLIC CAPITAL LETTER O*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00041f: CYRILLIC CAPITAL LETTER PE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000420: CYRILLIC CAPITAL LETTER ER*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000421: CYRILLIC CAPITAL LETTER ES*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000422: CYRILLIC CAPITAL LETTER TE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000423: CYRILLIC CAPITAL LETTER U*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000424: CYRILLIC CAPITAL LETTER EF*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000425: CYRILLIC CAPITAL LETTER HA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000426: CYRILLIC CAPITAL LETTER TSE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000427: CYRILLIC CAPITAL LETTER CHE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000428: CYRILLIC CAPITAL LETTER SHA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000429: CYRILLIC CAPITAL LETTER SHCHA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00042a: CYRILLIC CAPITAL LETTER HARD SIGN*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00042b: CYRILLIC CAPITAL LETTER YERU*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00042c: CYRILLIC CAPITAL LETTER SOFT SIGN*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00042d: CYRILLIC CAPITAL LETTER E*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00042e: CYRILLIC CAPITAL LETTER YU*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00042f: CYRILLIC CAPITAL LETTER YA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000430: CYRILLIC SMALL LETTER A*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000431: CYRILLIC SMALL LETTER BE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000432: CYRILLIC SMALL LETTER VE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000433: CYRILLIC SMALL LETTER GHE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000434: CYRILLIC SMALL LETTER DE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000435: CYRILLIC SMALL LETTER IE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000436: CYRILLIC SMALL LETTER ZHE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000437: CYRILLIC SMALL LETTER ZE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000438: CYRILLIC SMALL LETTER I*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000439: CYRILLIC SMALL LETTER SHORT I*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00043a: CYRILLIC SMALL LETTER KA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00043b: CYRILLIC SMALL LETTER EL*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00043c: CYRILLIC SMALL LETTER EM*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00043d: CYRILLIC SMALL LETTER EN*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00043e: CYRILLIC SMALL LETTER O*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00043f: CYRILLIC SMALL LETTER PE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000440: CYRILLIC SMALL LETTER ER*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000441: CYRILLIC SMALL LETTER ES*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000442: CYRILLIC SMALL LETTER TE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000443: CYRILLIC SMALL LETTER U*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000444: CYRILLIC SMALL LETTER EF*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000445: CYRILLIC SMALL LETTER HA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000446: CYRILLIC SMALL LETTER TSE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000447: CYRILLIC SMALL LETTER CHE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000448: CYRILLIC SMALL LETTER SHA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000449: CYRILLIC SMALL LETTER SHCHA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00044a: CYRILLIC SMALL LETTER HARD SIGN*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00044b: CYRILLIC SMALL LETTER YERU*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00044c: CYRILLIC SMALL LETTER SOFT SIGN*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00044d: CYRILLIC SMALL LETTER E*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00044e: CYRILLIC SMALL LETTER YU*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00044f: CYRILLIC SMALL LETTER YA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000450: CYRILLIC SMALL LETTER IE WITH GRAVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000451: CYRILLIC SMALL LETTER IO*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000452: CYRILLIC SMALL LETTER DJE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000453: CYRILLIC SMALL LETTER GJE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000454: CYRILLIC SMALL LETTER UKRAINIAN IE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000455: CYRILLIC SMALL LETTER DZE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000456: CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000457: CYRILLIC SMALL LETTER YI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000458: CYRILLIC SMALL LETTER JE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000459: CYRILLIC SMALL LETTER LJE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00045a: CYRILLIC SMALL LETTER NJE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00045b: CYRILLIC SMALL LETTER TSHE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00045c: CYRILLIC SMALL LETTER KJE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00045d: CYRILLIC SMALL LETTER I WITH GRAVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00045e: CYRILLIC SMALL LETTER SHORT U*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00045f: CYRILLIC SMALL LETTER DZHE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000460: CYRILLIC CAPITAL LETTER OMEGA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000461: CYRILLIC SMALL LETTER OMEGA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000462: CYRILLIC CAPITAL LETTER YAT*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000463: CYRILLIC SMALL LETTER YAT*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000464: CYRILLIC CAPITAL LETTER IOTIFIED E*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000465: CYRILLIC SMALL LETTER IOTIFIED E*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000466: CYRILLIC CAPITAL LETTER LITTLE YUS*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000467: CYRILLIC SMALL LETTER LITTLE YUS*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000468: CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000469: CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00046a: CYRILLIC CAPITAL LETTER BIG YUS*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00046b: CYRILLIC SMALL LETTER BIG YUS*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00046c: CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00046d: CYRILLIC SMALL LETTER IOTIFIED BIG YUS*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00046e: CYRILLIC CAPITAL LETTER KSI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00046f: CYRILLIC SMALL LETTER KSI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000470: CYRILLIC CAPITAL LETTER PSI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000471: CYRILLIC SMALL LETTER PSI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000472: CYRILLIC CAPITAL LETTER FITA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000473: CYRILLIC SMALL LETTER FITA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000474: CYRILLIC CAPITAL LETTER IZHITSA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000475: CYRILLIC SMALL LETTER IZHITSA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000476: CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000477: CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000478: CYRILLIC CAPITAL LETTER UK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000479: CYRILLIC SMALL LETTER UK*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00047a: CYRILLIC CAPITAL LETTER ROUND OMEGA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00047b: CYRILLIC SMALL LETTER ROUND OMEGA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00047c: CYRILLIC CAPITAL LETTER OMEGA WITH TITLO*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00047d: CYRILLIC SMALL LETTER OMEGA WITH TITLO*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00047e: CYRILLIC CAPITAL LETTER OT*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00047f: CYRILLIC SMALL LETTER OT*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000480: CYRILLIC CAPITAL LETTER KOPPA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000481: CYRILLIC SMALL LETTER KOPPA*/
- 0, /* U+000482: CYRILLIC THOUSANDS SIGN*/
- 0, /* U+000483: COMBINING CYRILLIC TITLO*/
- 0, /* U+000484: COMBINING CYRILLIC PALATALIZATION*/
- 0, /* U+000485: COMBINING CYRILLIC DASIA PNEUMATA*/
- 0, /* U+000486: COMBINING CYRILLIC PSILI PNEUMATA*/
- 0, /* U+000487: */
- 0, /* U+000488: COMBINING CYRILLIC HUNDRED THOUSANDS SIGN*/
- 0, /* U+000489: COMBINING CYRILLIC MILLIONS SIGN*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00048a: CYRILLIC CAPITAL LETTER SHORT I WITH TAIL*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00048b: CYRILLIC SMALL LETTER SHORT I WITH TAIL*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00048c: CYRILLIC CAPITAL LETTER SEMISOFT SIGN*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00048d: CYRILLIC SMALL LETTER SEMISOFT SIGN*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00048e: CYRILLIC CAPITAL LETTER ER WITH TICK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00048f: CYRILLIC SMALL LETTER ER WITH TICK*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000490: CYRILLIC CAPITAL LETTER GHE WITH UPTURN*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000491: CYRILLIC SMALL LETTER GHE WITH UPTURN*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000492: CYRILLIC CAPITAL LETTER GHE WITH STROKE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000493: CYRILLIC SMALL LETTER GHE WITH STROKE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000494: CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000495: CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000496: CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000497: CYRILLIC SMALL LETTER ZHE WITH DESCENDER*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000498: CYRILLIC CAPITAL LETTER ZE WITH DESCENDER*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000499: CYRILLIC SMALL LETTER ZE WITH DESCENDER*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00049a: CYRILLIC CAPITAL LETTER KA WITH DESCENDER*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00049b: CYRILLIC SMALL LETTER KA WITH DESCENDER*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00049c: CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00049d: CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00049e: CYRILLIC CAPITAL LETTER KA WITH STROKE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00049f: CYRILLIC SMALL LETTER KA WITH STROKE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0004a0: CYRILLIC CAPITAL LETTER BASHKIR KA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0004a1: CYRILLIC SMALL LETTER BASHKIR KA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0004a2: CYRILLIC CAPITAL LETTER EN WITH DESCENDER*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0004a3: CYRILLIC SMALL LETTER EN WITH DESCENDER*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0004a4: CYRILLIC CAPITAL LIGATURE EN GHE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0004a5: CYRILLIC SMALL LIGATURE EN GHE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0004a6: CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0004a7: CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0004a8: CYRILLIC CAPITAL LETTER ABKHASIAN HA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0004a9: CYRILLIC SMALL LETTER ABKHASIAN HA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0004aa: CYRILLIC CAPITAL LETTER ES WITH DESCENDER*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0004ab: CYRILLIC SMALL LETTER ES WITH DESCENDER*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0004ac: CYRILLIC CAPITAL LETTER TE WITH DESCENDER*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0004ad: CYRILLIC SMALL LETTER TE WITH DESCENDER*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0004ae: CYRILLIC CAPITAL LETTER STRAIGHT U*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0004af: CYRILLIC SMALL LETTER STRAIGHT U*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0004b0: CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0004b1: CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0004b2: CYRILLIC CAPITAL LETTER HA WITH DESCENDER*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0004b3: CYRILLIC SMALL LETTER HA WITH DESCENDER*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0004b4: CYRILLIC CAPITAL LIGATURE TE TSE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0004b5: CYRILLIC SMALL LIGATURE TE TSE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0004b6: CYRILLIC CAPITAL LETTER CHE WITH DESCENDER*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0004b7: CYRILLIC SMALL LETTER CHE WITH DESCENDER*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0004b8: CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0004b9: CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0004ba: CYRILLIC CAPITAL LETTER SHHA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0004bb: CYRILLIC SMALL LETTER SHHA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0004bc: CYRILLIC CAPITAL LETTER ABKHASIAN CHE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0004bd: CYRILLIC SMALL LETTER ABKHASIAN CHE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0004be: CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0004bf: CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0004c0: CYRILLIC LETTER PALOCHKA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0004c1: CYRILLIC CAPITAL LETTER ZHE WITH BREVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0004c2: CYRILLIC SMALL LETTER ZHE WITH BREVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0004c3: CYRILLIC CAPITAL LETTER KA WITH HOOK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0004c4: CYRILLIC SMALL LETTER KA WITH HOOK*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0004c5: CYRILLIC CAPITAL LETTER EL WITH TAIL*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0004c6: CYRILLIC SMALL LETTER EL WITH TAIL*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0004c7: CYRILLIC CAPITAL LETTER EN WITH HOOK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0004c8: CYRILLIC SMALL LETTER EN WITH HOOK*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0004c9: CYRILLIC CAPITAL LETTER EN WITH TAIL*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0004ca: CYRILLIC SMALL LETTER EN WITH TAIL*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0004cb: CYRILLIC CAPITAL LETTER KHAKASSIAN CHE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0004cc: CYRILLIC SMALL LETTER KHAKASSIAN CHE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0004cd: CYRILLIC CAPITAL LETTER EM WITH TAIL*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0004ce: CYRILLIC SMALL LETTER EM WITH TAIL*/
- 0, /* U+0004cf: */
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0004d0: CYRILLIC CAPITAL LETTER A WITH BREVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0004d1: CYRILLIC SMALL LETTER A WITH BREVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0004d2: CYRILLIC CAPITAL LETTER A WITH DIAERESIS*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0004d3: CYRILLIC SMALL LETTER A WITH DIAERESIS*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0004d4: CYRILLIC CAPITAL LIGATURE A IE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0004d5: CYRILLIC SMALL LIGATURE A IE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0004d6: CYRILLIC CAPITAL LETTER IE WITH BREVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0004d7: CYRILLIC SMALL LETTER IE WITH BREVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0004d8: CYRILLIC CAPITAL LETTER SCHWA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0004d9: CYRILLIC SMALL LETTER SCHWA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0004da: CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0004db: CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0004dc: CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0004dd: CYRILLIC SMALL LETTER ZHE WITH DIAERESIS*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0004de: CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0004df: CYRILLIC SMALL LETTER ZE WITH DIAERESIS*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0004e0: CYRILLIC CAPITAL LETTER ABKHASIAN DZE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0004e1: CYRILLIC SMALL LETTER ABKHASIAN DZE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0004e2: CYRILLIC CAPITAL LETTER I WITH MACRON*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0004e3: CYRILLIC SMALL LETTER I WITH MACRON*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0004e4: CYRILLIC CAPITAL LETTER I WITH DIAERESIS*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0004e5: CYRILLIC SMALL LETTER I WITH DIAERESIS*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0004e6: CYRILLIC CAPITAL LETTER O WITH DIAERESIS*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0004e7: CYRILLIC SMALL LETTER O WITH DIAERESIS*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0004e8: CYRILLIC CAPITAL LETTER BARRED O*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0004e9: CYRILLIC SMALL LETTER BARRED O*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0004ea: CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0004eb: CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0004ec: CYRILLIC CAPITAL LETTER E WITH DIAERESIS*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0004ed: CYRILLIC SMALL LETTER E WITH DIAERESIS*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0004ee: CYRILLIC CAPITAL LETTER U WITH MACRON*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0004ef: CYRILLIC SMALL LETTER U WITH MACRON*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0004f0: CYRILLIC CAPITAL LETTER U WITH DIAERESIS*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0004f1: CYRILLIC SMALL LETTER U WITH DIAERESIS*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0004f2: CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0004f3: CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0004f4: CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0004f5: CYRILLIC SMALL LETTER CHE WITH DIAERESIS*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0004f6: CYRILLIC CAPITAL LETTER GHE WITH DESCENDER*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0004f7: CYRILLIC SMALL LETTER GHE WITH DESCENDER*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0004f8: CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0004f9: CYRILLIC SMALL LETTER YERU WITH DIAERESIS*/
- 0, /* U+0004fa: */
- 0, /* U+0004fb: */
- 0, /* U+0004fc: */
- 0, /* U+0004fd: */
- 0, /* U+0004fe: */
- 0, /* U+0004ff: */
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000500: CYRILLIC CAPITAL LETTER KOMI DE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000501: CYRILLIC SMALL LETTER KOMI DE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000502: CYRILLIC CAPITAL LETTER KOMI DJE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000503: CYRILLIC SMALL LETTER KOMI DJE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000504: CYRILLIC CAPITAL LETTER KOMI ZJE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000505: CYRILLIC SMALL LETTER KOMI ZJE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000506: CYRILLIC CAPITAL LETTER KOMI DZJE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000507: CYRILLIC SMALL LETTER KOMI DZJE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000508: CYRILLIC CAPITAL LETTER KOMI LJE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000509: CYRILLIC SMALL LETTER KOMI LJE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00050a: CYRILLIC CAPITAL LETTER KOMI NJE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00050b: CYRILLIC SMALL LETTER KOMI NJE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00050c: CYRILLIC CAPITAL LETTER KOMI SJE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00050d: CYRILLIC SMALL LETTER KOMI SJE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00050e: CYRILLIC CAPITAL LETTER KOMI TJE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00050f: CYRILLIC SMALL LETTER KOMI TJE*/
- 0, /* U+000510: */
- 0, /* U+000511: */
- 0, /* U+000512: */
- 0, /* U+000513: */
- 0, /* U+000514: */
- 0, /* U+000515: */
- 0, /* U+000516: */
- 0, /* U+000517: */
- 0, /* U+000518: */
- 0, /* U+000519: */
- 0, /* U+00051a: */
- 0, /* U+00051b: */
- 0, /* U+00051c: */
- 0, /* U+00051d: */
- 0, /* U+00051e: */
- 0, /* U+00051f: */
- 0, /* U+000520: */
- 0, /* U+000521: */
- 0, /* U+000522: */
- 0, /* U+000523: */
- 0, /* U+000524: */
- 0, /* U+000525: */
- 0, /* U+000526: */
- 0, /* U+000527: */
- 0, /* U+000528: */
- 0, /* U+000529: */
- 0, /* U+00052a: */
- 0, /* U+00052b: */
- 0, /* U+00052c: */
- 0, /* U+00052d: */
- 0, /* U+00052e: */
- 0, /* U+00052f: */
- 0, /* U+000530: */
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000531: ARMENIAN CAPITAL LETTER AYB*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000532: ARMENIAN CAPITAL LETTER BEN*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000533: ARMENIAN CAPITAL LETTER GIM*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000534: ARMENIAN CAPITAL LETTER DA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000535: ARMENIAN CAPITAL LETTER ECH*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000536: ARMENIAN CAPITAL LETTER ZA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000537: ARMENIAN CAPITAL LETTER EH*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000538: ARMENIAN CAPITAL LETTER ET*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000539: ARMENIAN CAPITAL LETTER TO*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00053a: ARMENIAN CAPITAL LETTER ZHE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00053b: ARMENIAN CAPITAL LETTER INI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00053c: ARMENIAN CAPITAL LETTER LIWN*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00053d: ARMENIAN CAPITAL LETTER XEH*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00053e: ARMENIAN CAPITAL LETTER CA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00053f: ARMENIAN CAPITAL LETTER KEN*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000540: ARMENIAN CAPITAL LETTER HO*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000541: ARMENIAN CAPITAL LETTER JA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000542: ARMENIAN CAPITAL LETTER GHAD*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000543: ARMENIAN CAPITAL LETTER CHEH*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000544: ARMENIAN CAPITAL LETTER MEN*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000545: ARMENIAN CAPITAL LETTER YI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000546: ARMENIAN CAPITAL LETTER NOW*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000547: ARMENIAN CAPITAL LETTER SHA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000548: ARMENIAN CAPITAL LETTER VO*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000549: ARMENIAN CAPITAL LETTER CHA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00054a: ARMENIAN CAPITAL LETTER PEH*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00054b: ARMENIAN CAPITAL LETTER JHEH*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00054c: ARMENIAN CAPITAL LETTER RA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00054d: ARMENIAN CAPITAL LETTER SEH*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00054e: ARMENIAN CAPITAL LETTER VEW*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00054f: ARMENIAN CAPITAL LETTER TIWN*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000550: ARMENIAN CAPITAL LETTER REH*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000551: ARMENIAN CAPITAL LETTER CO*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000552: ARMENIAN CAPITAL LETTER YIWN*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000553: ARMENIAN CAPITAL LETTER PIWR*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000554: ARMENIAN CAPITAL LETTER KEH*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000555: ARMENIAN CAPITAL LETTER OH*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+000556: ARMENIAN CAPITAL LETTER FEH*/
- 0, /* U+000557: */
- 0, /* U+000558: */
- RTUNI_ALPHA, /* U+000559: ARMENIAN MODIFIER LETTER LEFT HALF RING*/
- 0, /* U+00055a: ARMENIAN APOSTROPHE*/
- 0, /* U+00055b: ARMENIAN EMPHASIS MARK*/
- 0, /* U+00055c: ARMENIAN EXCLAMATION MARK*/
- 0, /* U+00055d: ARMENIAN COMMA*/
- 0, /* U+00055e: ARMENIAN QUESTION MARK*/
- 0, /* U+00055f: ARMENIAN ABBREVIATION MARK*/
- 0, /* U+000560: */
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000561: ARMENIAN SMALL LETTER AYB*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000562: ARMENIAN SMALL LETTER BEN*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000563: ARMENIAN SMALL LETTER GIM*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000564: ARMENIAN SMALL LETTER DA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000565: ARMENIAN SMALL LETTER ECH*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000566: ARMENIAN SMALL LETTER ZA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000567: ARMENIAN SMALL LETTER EH*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000568: ARMENIAN SMALL LETTER ET*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000569: ARMENIAN SMALL LETTER TO*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00056a: ARMENIAN SMALL LETTER ZHE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00056b: ARMENIAN SMALL LETTER INI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00056c: ARMENIAN SMALL LETTER LIWN*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00056d: ARMENIAN SMALL LETTER XEH*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00056e: ARMENIAN SMALL LETTER CA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00056f: ARMENIAN SMALL LETTER KEN*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000570: ARMENIAN SMALL LETTER HO*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000571: ARMENIAN SMALL LETTER JA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000572: ARMENIAN SMALL LETTER GHAD*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000573: ARMENIAN SMALL LETTER CHEH*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000574: ARMENIAN SMALL LETTER MEN*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000575: ARMENIAN SMALL LETTER YI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000576: ARMENIAN SMALL LETTER NOW*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000577: ARMENIAN SMALL LETTER SHA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000578: ARMENIAN SMALL LETTER VO*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000579: ARMENIAN SMALL LETTER CHA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00057a: ARMENIAN SMALL LETTER PEH*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00057b: ARMENIAN SMALL LETTER JHEH*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00057c: ARMENIAN SMALL LETTER RA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00057d: ARMENIAN SMALL LETTER SEH*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00057e: ARMENIAN SMALL LETTER VEW*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00057f: ARMENIAN SMALL LETTER TIWN*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000580: ARMENIAN SMALL LETTER REH*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000581: ARMENIAN SMALL LETTER CO*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000582: ARMENIAN SMALL LETTER YIWN*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000583: ARMENIAN SMALL LETTER PIWR*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000584: ARMENIAN SMALL LETTER KEH*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000585: ARMENIAN SMALL LETTER OH*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000586: ARMENIAN SMALL LETTER FEH*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+000587: ARMENIAN SMALL LIGATURE ECH YIWN*/
- 0, /* U+000588: */
- 0, /* U+000589: ARMENIAN FULL STOP*/
- 0, /* U+00058a: ARMENIAN HYPHEN*/
- 0, /* U+00058b: */
- 0, /* U+00058c: */
- 0, /* U+00058d: */
- 0, /* U+00058e: */
- 0, /* U+00058f: */
- 0, /* U+000590: */
- 0, /* U+000591: HEBREW ACCENT ETNAHTA*/
- 0, /* U+000592: HEBREW ACCENT SEGOL*/
- 0, /* U+000593: HEBREW ACCENT SHALSHELET*/
- 0, /* U+000594: HEBREW ACCENT ZAQEF QATAN*/
- 0, /* U+000595: HEBREW ACCENT ZAQEF GADOL*/
- 0, /* U+000596: HEBREW ACCENT TIPEHA*/
- 0, /* U+000597: HEBREW ACCENT REVIA*/
- 0, /* U+000598: HEBREW ACCENT ZARQA*/
- 0, /* U+000599: HEBREW ACCENT PASHTA*/
- 0, /* U+00059a: HEBREW ACCENT YETIV*/
- 0, /* U+00059b: HEBREW ACCENT TEVIR*/
- 0, /* U+00059c: HEBREW ACCENT GERESH*/
- 0, /* U+00059d: HEBREW ACCENT GERESH MUQDAM*/
- 0, /* U+00059e: HEBREW ACCENT GERSHAYIM*/
- 0, /* U+00059f: HEBREW ACCENT QARNEY PARA*/
- 0, /* U+0005a0: HEBREW ACCENT TELISHA GEDOLA*/
- 0, /* U+0005a1: HEBREW ACCENT PAZER*/
- 0, /* U+0005a2: HEBREW ACCENT ATNAH HAFUKH*/
- 0, /* U+0005a3: HEBREW ACCENT MUNAH*/
- 0, /* U+0005a4: HEBREW ACCENT MAHAPAKH*/
- 0, /* U+0005a5: HEBREW ACCENT MERKHA*/
- 0, /* U+0005a6: HEBREW ACCENT MERKHA KEFULA*/
- 0, /* U+0005a7: HEBREW ACCENT DARGA*/
- 0, /* U+0005a8: HEBREW ACCENT QADMA*/
- 0, /* U+0005a9: HEBREW ACCENT TELISHA QETANA*/
- 0, /* U+0005aa: HEBREW ACCENT YERAH BEN YOMO*/
- 0, /* U+0005ab: HEBREW ACCENT OLE*/
- 0, /* U+0005ac: HEBREW ACCENT ILUY*/
- 0, /* U+0005ad: HEBREW ACCENT DEHI*/
- 0, /* U+0005ae: HEBREW ACCENT ZINOR*/
- 0, /* U+0005af: HEBREW MARK MASORA CIRCLE*/
- RTUNI_ALPHA, /* U+0005b0: HEBREW POINT SHEVA*/
- RTUNI_ALPHA, /* U+0005b1: HEBREW POINT HATAF SEGOL*/
- RTUNI_ALPHA, /* U+0005b2: HEBREW POINT HATAF PATAH*/
- RTUNI_ALPHA, /* U+0005b3: HEBREW POINT HATAF QAMATS*/
- RTUNI_ALPHA, /* U+0005b4: HEBREW POINT HIRIQ*/
- RTUNI_ALPHA, /* U+0005b5: HEBREW POINT TSERE*/
- RTUNI_ALPHA, /* U+0005b6: HEBREW POINT SEGOL*/
- RTUNI_ALPHA, /* U+0005b7: HEBREW POINT PATAH*/
- RTUNI_ALPHA, /* U+0005b8: HEBREW POINT QAMATS*/
- RTUNI_ALPHA, /* U+0005b9: HEBREW POINT HOLAM*/
- 0, /* U+0005ba: */
- RTUNI_ALPHA, /* U+0005bb: HEBREW POINT QUBUTS*/
- RTUNI_ALPHA, /* U+0005bc: HEBREW POINT DAGESH OR MAPIQ*/
- RTUNI_ALPHA, /* U+0005bd: HEBREW POINT METEG*/
- 0, /* U+0005be: HEBREW PUNCTUATION MAQAF*/
- RTUNI_ALPHA, /* U+0005bf: HEBREW POINT RAFE*/
- 0, /* U+0005c0: HEBREW PUNCTUATION PASEQ*/
- RTUNI_ALPHA, /* U+0005c1: HEBREW POINT SHIN DOT*/
- RTUNI_ALPHA, /* U+0005c2: HEBREW POINT SIN DOT*/
- 0, /* U+0005c3: HEBREW PUNCTUATION SOF PASUQ*/
- RTUNI_ALPHA, /* U+0005c4: HEBREW MARK UPPER DOT*/
- RTUNI_ALPHA, /* U+0005c5: HEBREW MARK LOWER DOT*/
- 0, /* U+0005c6: HEBREW PUNCTUATION NUN HAFUKHA*/
- RTUNI_ALPHA, /* U+0005c7: HEBREW POINT QAMATS QATAN*/
- 0, /* U+0005c8: */
- 0, /* U+0005c9: */
- 0, /* U+0005ca: */
- 0, /* U+0005cb: */
- 0, /* U+0005cc: */
- 0, /* U+0005cd: */
- 0, /* U+0005ce: */
- 0, /* U+0005cf: */
- RTUNI_ALPHA, /* U+0005d0: HEBREW LETTER ALEF*/
- RTUNI_ALPHA, /* U+0005d1: HEBREW LETTER BET*/
- RTUNI_ALPHA, /* U+0005d2: HEBREW LETTER GIMEL*/
- RTUNI_ALPHA, /* U+0005d3: HEBREW LETTER DALET*/
- RTUNI_ALPHA, /* U+0005d4: HEBREW LETTER HE*/
- RTUNI_ALPHA, /* U+0005d5: HEBREW LETTER VAV*/
- RTUNI_ALPHA, /* U+0005d6: HEBREW LETTER ZAYIN*/
- RTUNI_ALPHA, /* U+0005d7: HEBREW LETTER HET*/
- RTUNI_ALPHA, /* U+0005d8: HEBREW LETTER TET*/
- RTUNI_ALPHA, /* U+0005d9: HEBREW LETTER YOD*/
- RTUNI_ALPHA, /* U+0005da: HEBREW LETTER FINAL KAF*/
- RTUNI_ALPHA, /* U+0005db: HEBREW LETTER KAF*/
- RTUNI_ALPHA, /* U+0005dc: HEBREW LETTER LAMED*/
- RTUNI_ALPHA, /* U+0005dd: HEBREW LETTER FINAL MEM*/
- RTUNI_ALPHA, /* U+0005de: HEBREW LETTER MEM*/
- RTUNI_ALPHA, /* U+0005df: HEBREW LETTER FINAL NUN*/
- RTUNI_ALPHA, /* U+0005e0: HEBREW LETTER NUN*/
- RTUNI_ALPHA, /* U+0005e1: HEBREW LETTER SAMEKH*/
- RTUNI_ALPHA, /* U+0005e2: HEBREW LETTER AYIN*/
- RTUNI_ALPHA, /* U+0005e3: HEBREW LETTER FINAL PE*/
- RTUNI_ALPHA, /* U+0005e4: HEBREW LETTER PE*/
- RTUNI_ALPHA, /* U+0005e5: HEBREW LETTER FINAL TSADI*/
- RTUNI_ALPHA, /* U+0005e6: HEBREW LETTER TSADI*/
- RTUNI_ALPHA, /* U+0005e7: HEBREW LETTER QOF*/
- RTUNI_ALPHA, /* U+0005e8: HEBREW LETTER RESH*/
- RTUNI_ALPHA, /* U+0005e9: HEBREW LETTER SHIN*/
- RTUNI_ALPHA, /* U+0005ea: HEBREW LETTER TAV*/
- 0, /* U+0005eb: */
- 0, /* U+0005ec: */
- 0, /* U+0005ed: */
- 0, /* U+0005ee: */
- 0, /* U+0005ef: */
- RTUNI_ALPHA, /* U+0005f0: HEBREW LIGATURE YIDDISH DOUBLE VAV*/
- RTUNI_ALPHA, /* U+0005f1: HEBREW LIGATURE YIDDISH VAV YOD*/
- RTUNI_ALPHA, /* U+0005f2: HEBREW LIGATURE YIDDISH DOUBLE YOD*/
- 0, /* U+0005f3: HEBREW PUNCTUATION GERESH*/
- 0, /* U+0005f4: HEBREW PUNCTUATION GERSHAYIM*/
- 0, /* U+0005f5: */
- 0, /* U+0005f6: */
- 0, /* U+0005f7: */
- 0, /* U+0005f8: */
- 0, /* U+0005f9: */
- 0, /* U+0005fa: */
- 0, /* U+0005fb: */
- 0, /* U+0005fc: */
- 0, /* U+0005fd: */
- 0, /* U+0005fe: */
- 0, /* U+0005ff: */
- 0, /* U+000600: ARABIC NUMBER SIGN*/
- 0, /* U+000601: ARABIC SIGN SANAH*/
- 0, /* U+000602: ARABIC FOOTNOTE MARKER*/
- 0, /* U+000603: ARABIC SIGN SAFHA*/
- 0, /* U+000604: */
- 0, /* U+000605: */
- 0, /* U+000606: */
- 0, /* U+000607: */
- 0, /* U+000608: */
- 0, /* U+000609: */
- 0, /* U+00060a: */
- 0, /* U+00060b: AFGHANI SIGN*/
- 0, /* U+00060c: ARABIC COMMA*/
- 0, /* U+00060d: ARABIC DATE SEPARATOR*/
- 0, /* U+00060e: ARABIC POETIC VERSE SIGN*/
- 0, /* U+00060f: ARABIC SIGN MISRA*/
- RTUNI_ALPHA, /* U+000610: ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM*/
- RTUNI_ALPHA, /* U+000611: ARABIC SIGN ALAYHE ASSALLAM*/
- RTUNI_ALPHA, /* U+000612: ARABIC SIGN RAHMATULLAH ALAYHE*/
- RTUNI_ALPHA, /* U+000613: ARABIC SIGN RADI ALLAHOU ANHU*/
- RTUNI_ALPHA, /* U+000614: ARABIC SIGN TAKHALLUS*/
- RTUNI_ALPHA, /* U+000615: ARABIC SMALL HIGH TAH*/
- 0, /* U+000616: */
- 0, /* U+000617: */
- 0, /* U+000618: */
- 0, /* U+000619: */
- 0, /* U+00061a: */
- 0, /* U+00061b: ARABIC SEMICOLON*/
- 0, /* U+00061c: */
- 0, /* U+00061d: */
- 0, /* U+00061e: ARABIC TRIPLE DOT PUNCTUATION MARK*/
- 0, /* U+00061f: ARABIC QUESTION MARK*/
- 0, /* U+000620: */
- RTUNI_ALPHA, /* U+000621: ARABIC LETTER HAMZA*/
- RTUNI_ALPHA, /* U+000622: ARABIC LETTER ALEF WITH MADDA ABOVE*/
- RTUNI_ALPHA, /* U+000623: ARABIC LETTER ALEF WITH HAMZA ABOVE*/
- RTUNI_ALPHA, /* U+000624: ARABIC LETTER WAW WITH HAMZA ABOVE*/
- RTUNI_ALPHA, /* U+000625: ARABIC LETTER ALEF WITH HAMZA BELOW*/
- RTUNI_ALPHA, /* U+000626: ARABIC LETTER YEH WITH HAMZA ABOVE*/
- RTUNI_ALPHA, /* U+000627: ARABIC LETTER ALEF*/
- RTUNI_ALPHA, /* U+000628: ARABIC LETTER BEH*/
- RTUNI_ALPHA, /* U+000629: ARABIC LETTER TEH MARBUTA*/
- RTUNI_ALPHA, /* U+00062a: ARABIC LETTER TEH*/
- RTUNI_ALPHA, /* U+00062b: ARABIC LETTER THEH*/
- RTUNI_ALPHA, /* U+00062c: ARABIC LETTER JEEM*/
- RTUNI_ALPHA, /* U+00062d: ARABIC LETTER HAH*/
- RTUNI_ALPHA, /* U+00062e: ARABIC LETTER KHAH*/
- RTUNI_ALPHA, /* U+00062f: ARABIC LETTER DAL*/
- RTUNI_ALPHA, /* U+000630: ARABIC LETTER THAL*/
- RTUNI_ALPHA, /* U+000631: ARABIC LETTER REH*/
- RTUNI_ALPHA, /* U+000632: ARABIC LETTER ZAIN*/
- RTUNI_ALPHA, /* U+000633: ARABIC LETTER SEEN*/
- RTUNI_ALPHA, /* U+000634: ARABIC LETTER SHEEN*/
- RTUNI_ALPHA, /* U+000635: ARABIC LETTER SAD*/
- RTUNI_ALPHA, /* U+000636: ARABIC LETTER DAD*/
- RTUNI_ALPHA, /* U+000637: ARABIC LETTER TAH*/
- RTUNI_ALPHA, /* U+000638: ARABIC LETTER ZAH*/
- RTUNI_ALPHA, /* U+000639: ARABIC LETTER AIN*/
- RTUNI_ALPHA, /* U+00063a: ARABIC LETTER GHAIN*/
- 0, /* U+00063b: */
- 0, /* U+00063c: */
- 0, /* U+00063d: */
- 0, /* U+00063e: */
- 0, /* U+00063f: */
- RTUNI_ALPHA, /* U+000640: ARABIC TATWEEL*/
- RTUNI_ALPHA, /* U+000641: ARABIC LETTER FEH*/
- RTUNI_ALPHA, /* U+000642: ARABIC LETTER QAF*/
- RTUNI_ALPHA, /* U+000643: ARABIC LETTER KAF*/
- RTUNI_ALPHA, /* U+000644: ARABIC LETTER LAM*/
- RTUNI_ALPHA, /* U+000645: ARABIC LETTER MEEM*/
- RTUNI_ALPHA, /* U+000646: ARABIC LETTER NOON*/
- RTUNI_ALPHA, /* U+000647: ARABIC LETTER HEH*/
- RTUNI_ALPHA, /* U+000648: ARABIC LETTER WAW*/
- RTUNI_ALPHA, /* U+000649: ARABIC LETTER ALEF MAKSURA*/
- RTUNI_ALPHA, /* U+00064a: ARABIC LETTER YEH*/
- RTUNI_ALPHA, /* U+00064b: ARABIC FATHATAN*/
- RTUNI_ALPHA, /* U+00064c: ARABIC DAMMATAN*/
- RTUNI_ALPHA, /* U+00064d: ARABIC KASRATAN*/
- RTUNI_ALPHA, /* U+00064e: ARABIC FATHA*/
- RTUNI_ALPHA, /* U+00064f: ARABIC DAMMA*/
- RTUNI_ALPHA, /* U+000650: ARABIC KASRA*/
- RTUNI_ALPHA, /* U+000651: ARABIC SHADDA*/
- RTUNI_ALPHA, /* U+000652: ARABIC SUKUN*/
- RTUNI_ALPHA, /* U+000653: ARABIC MADDAH ABOVE*/
- RTUNI_ALPHA, /* U+000654: ARABIC HAMZA ABOVE*/
- RTUNI_ALPHA, /* U+000655: ARABIC HAMZA BELOW*/
- RTUNI_ALPHA, /* U+000656: ARABIC SUBSCRIPT ALEF*/
- RTUNI_ALPHA, /* U+000657: ARABIC INVERTED DAMMA*/
- 0, /* U+000658: ARABIC MARK NOON GHUNNA*/
- RTUNI_ALPHA, /* U+000659: ARABIC ZWARAKAY*/
- RTUNI_ALPHA, /* U+00065a: ARABIC VOWEL SIGN SMALL V ABOVE*/
- RTUNI_ALPHA, /* U+00065b: ARABIC VOWEL SIGN INVERTED SMALL V ABOVE*/
- RTUNI_ALPHA, /* U+00065c: ARABIC VOWEL SIGN DOT BELOW*/
- RTUNI_ALPHA, /* U+00065d: ARABIC REVERSED DAMMA*/
- RTUNI_ALPHA, /* U+00065e: ARABIC FATHA WITH TWO DOTS*/
- 0, /* U+00065f: */
- RTUNI_DDIGIT, /* U+000660: ARABIC-INDIC DIGIT ZERO*/
- RTUNI_DDIGIT, /* U+000661: ARABIC-INDIC DIGIT ONE*/
- RTUNI_DDIGIT, /* U+000662: ARABIC-INDIC DIGIT TWO*/
- RTUNI_DDIGIT, /* U+000663: ARABIC-INDIC DIGIT THREE*/
- RTUNI_DDIGIT, /* U+000664: ARABIC-INDIC DIGIT FOUR*/
- RTUNI_DDIGIT, /* U+000665: ARABIC-INDIC DIGIT FIVE*/
- RTUNI_DDIGIT, /* U+000666: ARABIC-INDIC DIGIT SIX*/
- RTUNI_DDIGIT, /* U+000667: ARABIC-INDIC DIGIT SEVEN*/
- RTUNI_DDIGIT, /* U+000668: ARABIC-INDIC DIGIT EIGHT*/
- RTUNI_DDIGIT, /* U+000669: ARABIC-INDIC DIGIT NINE*/
- 0, /* U+00066a: ARABIC PERCENT SIGN*/
- 0, /* U+00066b: ARABIC DECIMAL SEPARATOR*/
- 0, /* U+00066c: ARABIC THOUSANDS SEPARATOR*/
- 0, /* U+00066d: ARABIC FIVE POINTED STAR*/
- RTUNI_ALPHA, /* U+00066e: ARABIC LETTER DOTLESS BEH*/
- RTUNI_ALPHA, /* U+00066f: ARABIC LETTER DOTLESS QAF*/
- RTUNI_ALPHA, /* U+000670: ARABIC LETTER SUPERSCRIPT ALEF*/
- RTUNI_ALPHA, /* U+000671: ARABIC LETTER ALEF WASLA*/
- RTUNI_ALPHA, /* U+000672: ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE*/
- RTUNI_ALPHA, /* U+000673: ARABIC LETTER ALEF WITH WAVY HAMZA BELOW*/
- RTUNI_ALPHA, /* U+000674: ARABIC LETTER HIGH HAMZA*/
- RTUNI_ALPHA, /* U+000675: ARABIC LETTER HIGH HAMZA ALEF*/
- RTUNI_ALPHA, /* U+000676: ARABIC LETTER HIGH HAMZA WAW*/
- RTUNI_ALPHA, /* U+000677: ARABIC LETTER U WITH HAMZA ABOVE*/
- RTUNI_ALPHA, /* U+000678: ARABIC LETTER HIGH HAMZA YEH*/
- RTUNI_ALPHA, /* U+000679: ARABIC LETTER TTEH*/
- RTUNI_ALPHA, /* U+00067a: ARABIC LETTER TTEHEH*/
- RTUNI_ALPHA, /* U+00067b: ARABIC LETTER BEEH*/
- RTUNI_ALPHA, /* U+00067c: ARABIC LETTER TEH WITH RING*/
- RTUNI_ALPHA, /* U+00067d: ARABIC LETTER TEH WITH THREE DOTS ABOVE DOWNWARDS*/
- RTUNI_ALPHA, /* U+00067e: ARABIC LETTER PEH*/
- RTUNI_ALPHA, /* U+00067f: ARABIC LETTER TEHEH*/
- RTUNI_ALPHA, /* U+000680: ARABIC LETTER BEHEH*/
- RTUNI_ALPHA, /* U+000681: ARABIC LETTER HAH WITH HAMZA ABOVE*/
- RTUNI_ALPHA, /* U+000682: ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE*/
- RTUNI_ALPHA, /* U+000683: ARABIC LETTER NYEH*/
- RTUNI_ALPHA, /* U+000684: ARABIC LETTER DYEH*/
- RTUNI_ALPHA, /* U+000685: ARABIC LETTER HAH WITH THREE DOTS ABOVE*/
- RTUNI_ALPHA, /* U+000686: ARABIC LETTER TCHEH*/
- RTUNI_ALPHA, /* U+000687: ARABIC LETTER TCHEHEH*/
- RTUNI_ALPHA, /* U+000688: ARABIC LETTER DDAL*/
- RTUNI_ALPHA, /* U+000689: ARABIC LETTER DAL WITH RING*/
- RTUNI_ALPHA, /* U+00068a: ARABIC LETTER DAL WITH DOT BELOW*/
- RTUNI_ALPHA, /* U+00068b: ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH*/
- RTUNI_ALPHA, /* U+00068c: ARABIC LETTER DAHAL*/
- RTUNI_ALPHA, /* U+00068d: ARABIC LETTER DDAHAL*/
- RTUNI_ALPHA, /* U+00068e: ARABIC LETTER DUL*/
- RTUNI_ALPHA, /* U+00068f: ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARDS*/
- RTUNI_ALPHA, /* U+000690: ARABIC LETTER DAL WITH FOUR DOTS ABOVE*/
- RTUNI_ALPHA, /* U+000691: ARABIC LETTER RREH*/
- RTUNI_ALPHA, /* U+000692: ARABIC LETTER REH WITH SMALL V*/
- RTUNI_ALPHA, /* U+000693: ARABIC LETTER REH WITH RING*/
- RTUNI_ALPHA, /* U+000694: ARABIC LETTER REH WITH DOT BELOW*/
- RTUNI_ALPHA, /* U+000695: ARABIC LETTER REH WITH SMALL V BELOW*/
- RTUNI_ALPHA, /* U+000696: ARABIC LETTER REH WITH DOT BELOW AND DOT ABOVE*/
- RTUNI_ALPHA, /* U+000697: ARABIC LETTER REH WITH TWO DOTS ABOVE*/
- RTUNI_ALPHA, /* U+000698: ARABIC LETTER JEH*/
- RTUNI_ALPHA, /* U+000699: ARABIC LETTER REH WITH FOUR DOTS ABOVE*/
- RTUNI_ALPHA, /* U+00069a: ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE*/
- RTUNI_ALPHA, /* U+00069b: ARABIC LETTER SEEN WITH THREE DOTS BELOW*/
- RTUNI_ALPHA, /* U+00069c: ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE*/
- RTUNI_ALPHA, /* U+00069d: ARABIC LETTER SAD WITH TWO DOTS BELOW*/
- RTUNI_ALPHA, /* U+00069e: ARABIC LETTER SAD WITH THREE DOTS ABOVE*/
- RTUNI_ALPHA, /* U+00069f: ARABIC LETTER TAH WITH THREE DOTS ABOVE*/
- RTUNI_ALPHA, /* U+0006a0: ARABIC LETTER AIN WITH THREE DOTS ABOVE*/
- RTUNI_ALPHA, /* U+0006a1: ARABIC LETTER DOTLESS FEH*/
- RTUNI_ALPHA, /* U+0006a2: ARABIC LETTER FEH WITH DOT MOVED BELOW*/
- RTUNI_ALPHA, /* U+0006a3: ARABIC LETTER FEH WITH DOT BELOW*/
- RTUNI_ALPHA, /* U+0006a4: ARABIC LETTER VEH*/
- RTUNI_ALPHA, /* U+0006a5: ARABIC LETTER FEH WITH THREE DOTS BELOW*/
- RTUNI_ALPHA, /* U+0006a6: ARABIC LETTER PEHEH*/
- RTUNI_ALPHA, /* U+0006a7: ARABIC LETTER QAF WITH DOT ABOVE*/
- RTUNI_ALPHA, /* U+0006a8: ARABIC LETTER QAF WITH THREE DOTS ABOVE*/
- RTUNI_ALPHA, /* U+0006a9: ARABIC LETTER KEHEH*/
- RTUNI_ALPHA, /* U+0006aa: ARABIC LETTER SWASH KAF*/
- RTUNI_ALPHA, /* U+0006ab: ARABIC LETTER KAF WITH RING*/
- RTUNI_ALPHA, /* U+0006ac: ARABIC LETTER KAF WITH DOT ABOVE*/
- RTUNI_ALPHA, /* U+0006ad: ARABIC LETTER NG*/
- RTUNI_ALPHA, /* U+0006ae: ARABIC LETTER KAF WITH THREE DOTS BELOW*/
- RTUNI_ALPHA, /* U+0006af: ARABIC LETTER GAF*/
- RTUNI_ALPHA, /* U+0006b0: ARABIC LETTER GAF WITH RING*/
- RTUNI_ALPHA, /* U+0006b1: ARABIC LETTER NGOEH*/
- RTUNI_ALPHA, /* U+0006b2: ARABIC LETTER GAF WITH TWO DOTS BELOW*/
- RTUNI_ALPHA, /* U+0006b3: ARABIC LETTER GUEH*/
- RTUNI_ALPHA, /* U+0006b4: ARABIC LETTER GAF WITH THREE DOTS ABOVE*/
- RTUNI_ALPHA, /* U+0006b5: ARABIC LETTER LAM WITH SMALL V*/
- RTUNI_ALPHA, /* U+0006b6: ARABIC LETTER LAM WITH DOT ABOVE*/
- RTUNI_ALPHA, /* U+0006b7: ARABIC LETTER LAM WITH THREE DOTS ABOVE*/
- RTUNI_ALPHA, /* U+0006b8: ARABIC LETTER LAM WITH THREE DOTS BELOW*/
- RTUNI_ALPHA, /* U+0006b9: ARABIC LETTER NOON WITH DOT BELOW*/
- RTUNI_ALPHA, /* U+0006ba: ARABIC LETTER NOON GHUNNA*/
- RTUNI_ALPHA, /* U+0006bb: ARABIC LETTER RNOON*/
- RTUNI_ALPHA, /* U+0006bc: ARABIC LETTER NOON WITH RING*/
- RTUNI_ALPHA, /* U+0006bd: ARABIC LETTER NOON WITH THREE DOTS ABOVE*/
- RTUNI_ALPHA, /* U+0006be: ARABIC LETTER HEH DOACHASHMEE*/
- RTUNI_ALPHA, /* U+0006bf: ARABIC LETTER TCHEH WITH DOT ABOVE*/
- RTUNI_ALPHA, /* U+0006c0: ARABIC LETTER HEH WITH YEH ABOVE*/
- RTUNI_ALPHA, /* U+0006c1: ARABIC LETTER HEH GOAL*/
- RTUNI_ALPHA, /* U+0006c2: ARABIC LETTER HEH GOAL WITH HAMZA ABOVE*/
- RTUNI_ALPHA, /* U+0006c3: ARABIC LETTER TEH MARBUTA GOAL*/
- RTUNI_ALPHA, /* U+0006c4: ARABIC LETTER WAW WITH RING*/
- RTUNI_ALPHA, /* U+0006c5: ARABIC LETTER KIRGHIZ OE*/
- RTUNI_ALPHA, /* U+0006c6: ARABIC LETTER OE*/
- RTUNI_ALPHA, /* U+0006c7: ARABIC LETTER U*/
- RTUNI_ALPHA, /* U+0006c8: ARABIC LETTER YU*/
- RTUNI_ALPHA, /* U+0006c9: ARABIC LETTER KIRGHIZ YU*/
- RTUNI_ALPHA, /* U+0006ca: ARABIC LETTER WAW WITH TWO DOTS ABOVE*/
- RTUNI_ALPHA, /* U+0006cb: ARABIC LETTER VE*/
- RTUNI_ALPHA, /* U+0006cc: ARABIC LETTER FARSI YEH*/
- RTUNI_ALPHA, /* U+0006cd: ARABIC LETTER YEH WITH TAIL*/
- RTUNI_ALPHA, /* U+0006ce: ARABIC LETTER YEH WITH SMALL V*/
- RTUNI_ALPHA, /* U+0006cf: ARABIC LETTER WAW WITH DOT ABOVE*/
- RTUNI_ALPHA, /* U+0006d0: ARABIC LETTER E*/
- RTUNI_ALPHA, /* U+0006d1: ARABIC LETTER YEH WITH THREE DOTS BELOW*/
- RTUNI_ALPHA, /* U+0006d2: ARABIC LETTER YEH BARREE*/
- RTUNI_ALPHA, /* U+0006d3: ARABIC LETTER YEH BARREE WITH HAMZA ABOVE*/
- 0, /* U+0006d4: ARABIC FULL STOP*/
- RTUNI_ALPHA, /* U+0006d5: ARABIC LETTER AE*/
- RTUNI_ALPHA, /* U+0006d6: ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA*/
- RTUNI_ALPHA, /* U+0006d7: ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA*/
- RTUNI_ALPHA, /* U+0006d8: ARABIC SMALL HIGH MEEM INITIAL FORM*/
- RTUNI_ALPHA, /* U+0006d9: ARABIC SMALL HIGH LAM ALEF*/
- RTUNI_ALPHA, /* U+0006da: ARABIC SMALL HIGH JEEM*/
- RTUNI_ALPHA, /* U+0006db: ARABIC SMALL HIGH THREE DOTS*/
- RTUNI_ALPHA, /* U+0006dc: ARABIC SMALL HIGH SEEN*/
- 0, /* U+0006dd: ARABIC END OF AYAH*/
- 0, /* U+0006de: ARABIC START OF RUB EL HIZB*/
- 0, /* U+0006df: ARABIC SMALL HIGH ROUNDED ZERO*/
- 0, /* U+0006e0: ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO*/
- RTUNI_ALPHA, /* U+0006e1: ARABIC SMALL HIGH DOTLESS HEAD OF KHAH*/
- RTUNI_ALPHA, /* U+0006e2: ARABIC SMALL HIGH MEEM ISOLATED FORM*/
- RTUNI_ALPHA, /* U+0006e3: ARABIC SMALL LOW SEEN*/
- RTUNI_ALPHA, /* U+0006e4: ARABIC SMALL HIGH MADDA*/
- RTUNI_ALPHA, /* U+0006e5: ARABIC SMALL WAW*/
- RTUNI_ALPHA, /* U+0006e6: ARABIC SMALL YEH*/
- RTUNI_ALPHA, /* U+0006e7: ARABIC SMALL HIGH YEH*/
- RTUNI_ALPHA, /* U+0006e8: ARABIC SMALL HIGH NOON*/
- 0, /* U+0006e9: ARABIC PLACE OF SAJDAH*/
- 0, /* U+0006ea: ARABIC EMPTY CENTRE LOW STOP*/
- 0, /* U+0006eb: ARABIC EMPTY CENTRE HIGH STOP*/
- 0, /* U+0006ec: ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE*/
- RTUNI_ALPHA, /* U+0006ed: ARABIC SMALL LOW MEEM*/
- RTUNI_ALPHA, /* U+0006ee: ARABIC LETTER DAL WITH INVERTED V*/
- RTUNI_ALPHA, /* U+0006ef: ARABIC LETTER REH WITH INVERTED V*/
- RTUNI_DDIGIT, /* U+0006f0: EXTENDED ARABIC-INDIC DIGIT ZERO*/
- RTUNI_DDIGIT, /* U+0006f1: EXTENDED ARABIC-INDIC DIGIT ONE*/
- RTUNI_DDIGIT, /* U+0006f2: EXTENDED ARABIC-INDIC DIGIT TWO*/
- RTUNI_DDIGIT, /* U+0006f3: EXTENDED ARABIC-INDIC DIGIT THREE*/
- RTUNI_DDIGIT, /* U+0006f4: EXTENDED ARABIC-INDIC DIGIT FOUR*/
- RTUNI_DDIGIT, /* U+0006f5: EXTENDED ARABIC-INDIC DIGIT FIVE*/
- RTUNI_DDIGIT, /* U+0006f6: EXTENDED ARABIC-INDIC DIGIT SIX*/
- RTUNI_DDIGIT, /* U+0006f7: EXTENDED ARABIC-INDIC DIGIT SEVEN*/
- RTUNI_DDIGIT, /* U+0006f8: EXTENDED ARABIC-INDIC DIGIT EIGHT*/
- RTUNI_DDIGIT, /* U+0006f9: EXTENDED ARABIC-INDIC DIGIT NINE*/
- RTUNI_ALPHA, /* U+0006fa: ARABIC LETTER SHEEN WITH DOT BELOW*/
- RTUNI_ALPHA, /* U+0006fb: ARABIC LETTER DAD WITH DOT BELOW*/
- RTUNI_ALPHA, /* U+0006fc: ARABIC LETTER GHAIN WITH DOT BELOW*/
- 0, /* U+0006fd: ARABIC SIGN SINDHI AMPERSAND*/
- 0, /* U+0006fe: ARABIC SIGN SINDHI POSTPOSITION MEN*/
- RTUNI_ALPHA, /* U+0006ff: ARABIC LETTER HEH WITH INVERTED V*/
- 0, /* U+000700: SYRIAC END OF PARAGRAPH*/
- 0, /* U+000701: SYRIAC SUPRALINEAR FULL STOP*/
- 0, /* U+000702: SYRIAC SUBLINEAR FULL STOP*/
- 0, /* U+000703: SYRIAC SUPRALINEAR COLON*/
- 0, /* U+000704: SYRIAC SUBLINEAR COLON*/
- 0, /* U+000705: SYRIAC HORIZONTAL COLON*/
- 0, /* U+000706: SYRIAC COLON SKEWED LEFT*/
- 0, /* U+000707: SYRIAC COLON SKEWED RIGHT*/
- 0, /* U+000708: SYRIAC SUPRALINEAR COLON SKEWED LEFT*/
- 0, /* U+000709: SYRIAC SUBLINEAR COLON SKEWED RIGHT*/
- 0, /* U+00070a: SYRIAC CONTRACTION*/
- 0, /* U+00070b: SYRIAC HARKLEAN OBELUS*/
- 0, /* U+00070c: SYRIAC HARKLEAN METOBELUS*/
- 0, /* U+00070d: SYRIAC HARKLEAN ASTERISCUS*/
- 0, /* U+00070e: */
- 0, /* U+00070f: SYRIAC ABBREVIATION MARK*/
- RTUNI_ALPHA, /* U+000710: SYRIAC LETTER ALAPH*/
- RTUNI_ALPHA, /* U+000711: SYRIAC LETTER SUPERSCRIPT ALAPH*/
- RTUNI_ALPHA, /* U+000712: SYRIAC LETTER BETH*/
- RTUNI_ALPHA, /* U+000713: SYRIAC LETTER GAMAL*/
- RTUNI_ALPHA, /* U+000714: SYRIAC LETTER GAMAL GARSHUNI*/
- RTUNI_ALPHA, /* U+000715: SYRIAC LETTER DALATH*/
- RTUNI_ALPHA, /* U+000716: SYRIAC LETTER DOTLESS DALATH RISH*/
- RTUNI_ALPHA, /* U+000717: SYRIAC LETTER HE*/
- RTUNI_ALPHA, /* U+000718: SYRIAC LETTER WAW*/
- RTUNI_ALPHA, /* U+000719: SYRIAC LETTER ZAIN*/
- RTUNI_ALPHA, /* U+00071a: SYRIAC LETTER HETH*/
- RTUNI_ALPHA, /* U+00071b: SYRIAC LETTER TETH*/
- RTUNI_ALPHA, /* U+00071c: SYRIAC LETTER TETH GARSHUNI*/
- RTUNI_ALPHA, /* U+00071d: SYRIAC LETTER YUDH*/
- RTUNI_ALPHA, /* U+00071e: SYRIAC LETTER YUDH HE*/
- RTUNI_ALPHA, /* U+00071f: SYRIAC LETTER KAPH*/
- RTUNI_ALPHA, /* U+000720: SYRIAC LETTER LAMADH*/
- RTUNI_ALPHA, /* U+000721: SYRIAC LETTER MIM*/
- RTUNI_ALPHA, /* U+000722: SYRIAC LETTER NUN*/
- RTUNI_ALPHA, /* U+000723: SYRIAC LETTER SEMKATH*/
- RTUNI_ALPHA, /* U+000724: SYRIAC LETTER FINAL SEMKATH*/
- RTUNI_ALPHA, /* U+000725: SYRIAC LETTER E*/
- RTUNI_ALPHA, /* U+000726: SYRIAC LETTER PE*/
- RTUNI_ALPHA, /* U+000727: SYRIAC LETTER REVERSED PE*/
- RTUNI_ALPHA, /* U+000728: SYRIAC LETTER SADHE*/
- RTUNI_ALPHA, /* U+000729: SYRIAC LETTER QAPH*/
- RTUNI_ALPHA, /* U+00072a: SYRIAC LETTER RISH*/
- RTUNI_ALPHA, /* U+00072b: SYRIAC LETTER SHIN*/
- RTUNI_ALPHA, /* U+00072c: SYRIAC LETTER TAW*/
- RTUNI_ALPHA, /* U+00072d: SYRIAC LETTER PERSIAN BHETH*/
- RTUNI_ALPHA, /* U+00072e: SYRIAC LETTER PERSIAN GHAMAL*/
- RTUNI_ALPHA, /* U+00072f: SYRIAC LETTER PERSIAN DHALATH*/
- RTUNI_ALPHA, /* U+000730: SYRIAC PTHAHA ABOVE*/
- RTUNI_ALPHA, /* U+000731: SYRIAC PTHAHA BELOW*/
- RTUNI_ALPHA, /* U+000732: SYRIAC PTHAHA DOTTED*/
- RTUNI_ALPHA, /* U+000733: SYRIAC ZQAPHA ABOVE*/
- RTUNI_ALPHA, /* U+000734: SYRIAC ZQAPHA BELOW*/
- RTUNI_ALPHA, /* U+000735: SYRIAC ZQAPHA DOTTED*/
- RTUNI_ALPHA, /* U+000736: SYRIAC RBASA ABOVE*/
- RTUNI_ALPHA, /* U+000737: SYRIAC RBASA BELOW*/
- RTUNI_ALPHA, /* U+000738: SYRIAC DOTTED ZLAMA HORIZONTAL*/
- RTUNI_ALPHA, /* U+000739: SYRIAC DOTTED ZLAMA ANGULAR*/
- RTUNI_ALPHA, /* U+00073a: SYRIAC HBASA ABOVE*/
- RTUNI_ALPHA, /* U+00073b: SYRIAC HBASA BELOW*/
- RTUNI_ALPHA, /* U+00073c: SYRIAC HBASA-ESASA DOTTED*/
- RTUNI_ALPHA, /* U+00073d: SYRIAC ESASA ABOVE*/
- RTUNI_ALPHA, /* U+00073e: SYRIAC ESASA BELOW*/
- RTUNI_ALPHA, /* U+00073f: SYRIAC RWAHA*/
- 0, /* U+000740: SYRIAC FEMININE DOT*/
- 0, /* U+000741: SYRIAC QUSHSHAYA*/
- 0, /* U+000742: SYRIAC RUKKAKHA*/
- 0, /* U+000743: SYRIAC TWO VERTICAL DOTS ABOVE*/
- 0, /* U+000744: SYRIAC TWO VERTICAL DOTS BELOW*/
- 0, /* U+000745: SYRIAC THREE DOTS ABOVE*/
- 0, /* U+000746: SYRIAC THREE DOTS BELOW*/
- 0, /* U+000747: SYRIAC OBLIQUE LINE ABOVE*/
- 0, /* U+000748: SYRIAC OBLIQUE LINE BELOW*/
- 0, /* U+000749: SYRIAC MUSIC*/
- 0, /* U+00074a: SYRIAC BARREKH*/
- 0, /* U+00074b: */
- 0, /* U+00074c: */
- RTUNI_ALPHA, /* U+00074d: SYRIAC LETTER SOGDIAN ZHAIN*/
- RTUNI_ALPHA, /* U+00074e: SYRIAC LETTER SOGDIAN KHAPH*/
- RTUNI_ALPHA, /* U+00074f: SYRIAC LETTER SOGDIAN FE*/
- RTUNI_ALPHA, /* U+000750: ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW*/
- RTUNI_ALPHA, /* U+000751: ARABIC LETTER BEH WITH DOT BELOW AND THREE DOTS ABOVE*/
- RTUNI_ALPHA, /* U+000752: ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW*/
- RTUNI_ALPHA, /* U+000753: ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW AND TWO DOTS ABOVE*/
- RTUNI_ALPHA, /* U+000754: ARABIC LETTER BEH WITH TWO DOTS BELOW AND DOT ABOVE*/
- RTUNI_ALPHA, /* U+000755: ARABIC LETTER BEH WITH INVERTED SMALL V BELOW*/
- RTUNI_ALPHA, /* U+000756: ARABIC LETTER BEH WITH SMALL V*/
- RTUNI_ALPHA, /* U+000757: ARABIC LETTER HAH WITH TWO DOTS ABOVE*/
- RTUNI_ALPHA, /* U+000758: ARABIC LETTER HAH WITH THREE DOTS POINTING UPWARDS BELOW*/
- RTUNI_ALPHA, /* U+000759: ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW AND SMALL TAH*/
- RTUNI_ALPHA, /* U+00075a: ARABIC LETTER DAL WITH INVERTED SMALL V BELOW*/
- RTUNI_ALPHA, /* U+00075b: ARABIC LETTER REH WITH STROKE*/
- RTUNI_ALPHA, /* U+00075c: ARABIC LETTER SEEN WITH FOUR DOTS ABOVE*/
- RTUNI_ALPHA, /* U+00075d: ARABIC LETTER AIN WITH TWO DOTS ABOVE*/
- RTUNI_ALPHA, /* U+00075e: ARABIC LETTER AIN WITH THREE DOTS POINTING DOWNWARDS ABOVE*/
- RTUNI_ALPHA, /* U+00075f: ARABIC LETTER AIN WITH TWO DOTS VERTICALLY ABOVE*/
- RTUNI_ALPHA, /* U+000760: ARABIC LETTER FEH WITH TWO DOTS BELOW*/
- RTUNI_ALPHA, /* U+000761: ARABIC LETTER FEH WITH THREE DOTS POINTING UPWARDS BELOW*/
- RTUNI_ALPHA, /* U+000762: ARABIC LETTER KEHEH WITH DOT ABOVE*/
- RTUNI_ALPHA, /* U+000763: ARABIC LETTER KEHEH WITH THREE DOTS ABOVE*/
- RTUNI_ALPHA, /* U+000764: ARABIC LETTER KEHEH WITH THREE DOTS POINTING UPWARDS BELOW*/
- RTUNI_ALPHA, /* U+000765: ARABIC LETTER MEEM WITH DOT ABOVE*/
- RTUNI_ALPHA, /* U+000766: ARABIC LETTER MEEM WITH DOT BELOW*/
- RTUNI_ALPHA, /* U+000767: ARABIC LETTER NOON WITH TWO DOTS BELOW*/
- RTUNI_ALPHA, /* U+000768: ARABIC LETTER NOON WITH SMALL TAH*/
- RTUNI_ALPHA, /* U+000769: ARABIC LETTER NOON WITH SMALL V*/
- RTUNI_ALPHA, /* U+00076a: ARABIC LETTER LAM WITH BAR*/
- RTUNI_ALPHA, /* U+00076b: ARABIC LETTER REH WITH TWO DOTS VERTICALLY ABOVE*/
- RTUNI_ALPHA, /* U+00076c: ARABIC LETTER REH WITH HAMZA ABOVE*/
- RTUNI_ALPHA, /* U+00076d: ARABIC LETTER SEEN WITH TWO DOTS VERTICALLY ABOVE*/
- 0, /* U+00076e: */
- 0, /* U+00076f: */
- 0, /* U+000770: */
- 0, /* U+000771: */
- 0, /* U+000772: */
- 0, /* U+000773: */
- 0, /* U+000774: */
- 0, /* U+000775: */
- 0, /* U+000776: */
- 0, /* U+000777: */
- 0, /* U+000778: */
- 0, /* U+000779: */
- 0, /* U+00077a: */
- 0, /* U+00077b: */
- 0, /* U+00077c: */
- 0, /* U+00077d: */
- 0, /* U+00077e: */
- 0, /* U+00077f: */
- RTUNI_ALPHA, /* U+000780: THAANA LETTER HAA*/
- RTUNI_ALPHA, /* U+000781: THAANA LETTER SHAVIYANI*/
- RTUNI_ALPHA, /* U+000782: THAANA LETTER NOONU*/
- RTUNI_ALPHA, /* U+000783: THAANA LETTER RAA*/
- RTUNI_ALPHA, /* U+000784: THAANA LETTER BAA*/
- RTUNI_ALPHA, /* U+000785: THAANA LETTER LHAVIYANI*/
- RTUNI_ALPHA, /* U+000786: THAANA LETTER KAAFU*/
- RTUNI_ALPHA, /* U+000787: THAANA LETTER ALIFU*/
- RTUNI_ALPHA, /* U+000788: THAANA LETTER VAAVU*/
- RTUNI_ALPHA, /* U+000789: THAANA LETTER MEEMU*/
- RTUNI_ALPHA, /* U+00078a: THAANA LETTER FAAFU*/
- RTUNI_ALPHA, /* U+00078b: THAANA LETTER DHAALU*/
- RTUNI_ALPHA, /* U+00078c: THAANA LETTER THAA*/
- RTUNI_ALPHA, /* U+00078d: THAANA LETTER LAAMU*/
- RTUNI_ALPHA, /* U+00078e: THAANA LETTER GAAFU*/
- RTUNI_ALPHA, /* U+00078f: THAANA LETTER GNAVIYANI*/
- RTUNI_ALPHA, /* U+000790: THAANA LETTER SEENU*/
- RTUNI_ALPHA, /* U+000791: THAANA LETTER DAVIYANI*/
- RTUNI_ALPHA, /* U+000792: THAANA LETTER ZAVIYANI*/
- RTUNI_ALPHA, /* U+000793: THAANA LETTER TAVIYANI*/
- RTUNI_ALPHA, /* U+000794: THAANA LETTER YAA*/
- RTUNI_ALPHA, /* U+000795: THAANA LETTER PAVIYANI*/
- RTUNI_ALPHA, /* U+000796: THAANA LETTER JAVIYANI*/
- RTUNI_ALPHA, /* U+000797: THAANA LETTER CHAVIYANI*/
- RTUNI_ALPHA, /* U+000798: THAANA LETTER TTAA*/
- RTUNI_ALPHA, /* U+000799: THAANA LETTER HHAA*/
- RTUNI_ALPHA, /* U+00079a: THAANA LETTER KHAA*/
- RTUNI_ALPHA, /* U+00079b: THAANA LETTER THAALU*/
- RTUNI_ALPHA, /* U+00079c: THAANA LETTER ZAA*/
- RTUNI_ALPHA, /* U+00079d: THAANA LETTER SHEENU*/
- RTUNI_ALPHA, /* U+00079e: THAANA LETTER SAADHU*/
- RTUNI_ALPHA, /* U+00079f: THAANA LETTER DAADHU*/
- RTUNI_ALPHA, /* U+0007a0: THAANA LETTER TO*/
- RTUNI_ALPHA, /* U+0007a1: THAANA LETTER ZO*/
- RTUNI_ALPHA, /* U+0007a2: THAANA LETTER AINU*/
- RTUNI_ALPHA, /* U+0007a3: THAANA LETTER GHAINU*/
- RTUNI_ALPHA, /* U+0007a4: THAANA LETTER QAAFU*/
- RTUNI_ALPHA, /* U+0007a5: THAANA LETTER WAAVU*/
- RTUNI_ALPHA, /* U+0007a6: THAANA ABAFILI*/
- RTUNI_ALPHA, /* U+0007a7: THAANA AABAAFILI*/
- RTUNI_ALPHA, /* U+0007a8: THAANA IBIFILI*/
- RTUNI_ALPHA, /* U+0007a9: THAANA EEBEEFILI*/
- RTUNI_ALPHA, /* U+0007aa: THAANA UBUFILI*/
- RTUNI_ALPHA, /* U+0007ab: THAANA OOBOOFILI*/
- RTUNI_ALPHA, /* U+0007ac: THAANA EBEFILI*/
- RTUNI_ALPHA, /* U+0007ad: THAANA EYBEYFILI*/
- RTUNI_ALPHA, /* U+0007ae: THAANA OBOFILI*/
- RTUNI_ALPHA, /* U+0007af: THAANA OABOAFILI*/
- RTUNI_ALPHA, /* U+0007b0: THAANA SUKUN*/
- RTUNI_ALPHA, /* U+0007b1: THAANA LETTER NAA*/
- 0, /* U+0007b2: */
- 0, /* U+0007b3: */
- 0, /* U+0007b4: */
- 0, /* U+0007b5: */
- 0, /* U+0007b6: */
- 0, /* U+0007b7: */
- 0, /* U+0007b8: */
- 0, /* U+0007b9: */
- 0, /* U+0007ba: */
- 0, /* U+0007bb: */
- 0, /* U+0007bc: */
- 0, /* U+0007bd: */
- 0, /* U+0007be: */
- 0, /* U+0007bf: */
- 0, /* U+0007c0: */
- 0, /* U+0007c1: */
- 0, /* U+0007c2: */
- 0, /* U+0007c3: */
- 0, /* U+0007c4: */
- 0, /* U+0007c5: */
- 0, /* U+0007c6: */
- 0, /* U+0007c7: */
- 0, /* U+0007c8: */
- 0, /* U+0007c9: */
- 0, /* U+0007ca: */
- 0, /* U+0007cb: */
- 0, /* U+0007cc: */
- 0, /* U+0007cd: */
- 0, /* U+0007ce: */
- 0, /* U+0007cf: */
- 0, /* U+0007d0: */
- 0, /* U+0007d1: */
- 0, /* U+0007d2: */
- 0, /* U+0007d3: */
- 0, /* U+0007d4: */
- 0, /* U+0007d5: */
- 0, /* U+0007d6: */
- 0, /* U+0007d7: */
- 0, /* U+0007d8: */
- 0, /* U+0007d9: */
- 0, /* U+0007da: */
- 0, /* U+0007db: */
- 0, /* U+0007dc: */
- 0, /* U+0007dd: */
- 0, /* U+0007de: */
- 0, /* U+0007df: */
- 0, /* U+0007e0: */
- 0, /* U+0007e1: */
- 0, /* U+0007e2: */
- 0, /* U+0007e3: */
- 0, /* U+0007e4: */
- 0, /* U+0007e5: */
- 0, /* U+0007e6: */
- 0, /* U+0007e7: */
- 0, /* U+0007e8: */
- 0, /* U+0007e9: */
- 0, /* U+0007ea: */
- 0, /* U+0007eb: */
- 0, /* U+0007ec: */
- 0, /* U+0007ed: */
- 0, /* U+0007ee: */
- 0, /* U+0007ef: */
- 0, /* U+0007f0: */
- 0, /* U+0007f1: */
- 0, /* U+0007f2: */
- 0, /* U+0007f3: */
- 0, /* U+0007f4: */
- 0, /* U+0007f5: */
- 0, /* U+0007f6: */
- 0, /* U+0007f7: */
- 0, /* U+0007f8: */
- 0, /* U+0007f9: */
- 0, /* U+0007fa: */
- 0, /* U+0007fb: */
- 0, /* U+0007fc: */
- 0, /* U+0007fd: */
- 0, /* U+0007fe: */
- 0, /* U+0007ff: */
- 0, /* U+000800: */
- 0, /* U+000801: */
- 0, /* U+000802: */
- 0, /* U+000803: */
- 0, /* U+000804: */
- 0, /* U+000805: */
- 0, /* U+000806: */
- 0, /* U+000807: */
- 0, /* U+000808: */
- 0, /* U+000809: */
- 0, /* U+00080a: */
- 0, /* U+00080b: */
- 0, /* U+00080c: */
- 0, /* U+00080d: */
- 0, /* U+00080e: */
- 0, /* U+00080f: */
- 0, /* U+000810: */
- 0, /* U+000811: */
- 0, /* U+000812: */
- 0, /* U+000813: */
- 0, /* U+000814: */
- 0, /* U+000815: */
- 0, /* U+000816: */
- 0, /* U+000817: */
- 0, /* U+000818: */
- 0, /* U+000819: */
- 0, /* U+00081a: */
- 0, /* U+00081b: */
- 0, /* U+00081c: */
- 0, /* U+00081d: */
- 0, /* U+00081e: */
- 0, /* U+00081f: */
- 0, /* U+000820: */
- 0, /* U+000821: */
- 0, /* U+000822: */
- 0, /* U+000823: */
- 0, /* U+000824: */
- 0, /* U+000825: */
- 0, /* U+000826: */
- 0, /* U+000827: */
- 0, /* U+000828: */
- 0, /* U+000829: */
- 0, /* U+00082a: */
- 0, /* U+00082b: */
- 0, /* U+00082c: */
- 0, /* U+00082d: */
- 0, /* U+00082e: */
- 0, /* U+00082f: */
- 0, /* U+000830: */
- 0, /* U+000831: */
- 0, /* U+000832: */
- 0, /* U+000833: */
- 0, /* U+000834: */
- 0, /* U+000835: */
- 0, /* U+000836: */
- 0, /* U+000837: */
- 0, /* U+000838: */
- 0, /* U+000839: */
- 0, /* U+00083a: */
- 0, /* U+00083b: */
- 0, /* U+00083c: */
- 0, /* U+00083d: */
- 0, /* U+00083e: */
- 0, /* U+00083f: */
- 0, /* U+000840: */
- 0, /* U+000841: */
- 0, /* U+000842: */
- 0, /* U+000843: */
- 0, /* U+000844: */
- 0, /* U+000845: */
- 0, /* U+000846: */
- 0, /* U+000847: */
- 0, /* U+000848: */
- 0, /* U+000849: */
- 0, /* U+00084a: */
- 0, /* U+00084b: */
- 0, /* U+00084c: */
- 0, /* U+00084d: */
- 0, /* U+00084e: */
- 0, /* U+00084f: */
- 0, /* U+000850: */
- 0, /* U+000851: */
- 0, /* U+000852: */
- 0, /* U+000853: */
- 0, /* U+000854: */
- 0, /* U+000855: */
- 0, /* U+000856: */
- 0, /* U+000857: */
- 0, /* U+000858: */
- 0, /* U+000859: */
- 0, /* U+00085a: */
- 0, /* U+00085b: */
- 0, /* U+00085c: */
- 0, /* U+00085d: */
- 0, /* U+00085e: */
- 0, /* U+00085f: */
- 0, /* U+000860: */
- 0, /* U+000861: */
- 0, /* U+000862: */
- 0, /* U+000863: */
- 0, /* U+000864: */
- 0, /* U+000865: */
- 0, /* U+000866: */
- 0, /* U+000867: */
- 0, /* U+000868: */
- 0, /* U+000869: */
- 0, /* U+00086a: */
- 0, /* U+00086b: */
- 0, /* U+00086c: */
- 0, /* U+00086d: */
- 0, /* U+00086e: */
- 0, /* U+00086f: */
- 0, /* U+000870: */
- 0, /* U+000871: */
- 0, /* U+000872: */
- 0, /* U+000873: */
- 0, /* U+000874: */
- 0, /* U+000875: */
- 0, /* U+000876: */
- 0, /* U+000877: */
- 0, /* U+000878: */
- 0, /* U+000879: */
- 0, /* U+00087a: */
- 0, /* U+00087b: */
- 0, /* U+00087c: */
- 0, /* U+00087d: */
- 0, /* U+00087e: */
- 0, /* U+00087f: */
- 0, /* U+000880: */
- 0, /* U+000881: */
- 0, /* U+000882: */
- 0, /* U+000883: */
- 0, /* U+000884: */
- 0, /* U+000885: */
- 0, /* U+000886: */
- 0, /* U+000887: */
- 0, /* U+000888: */
- 0, /* U+000889: */
- 0, /* U+00088a: */
- 0, /* U+00088b: */
- 0, /* U+00088c: */
- 0, /* U+00088d: */
- 0, /* U+00088e: */
- 0, /* U+00088f: */
- 0, /* U+000890: */
- 0, /* U+000891: */
- 0, /* U+000892: */
- 0, /* U+000893: */
- 0, /* U+000894: */
- 0, /* U+000895: */
- 0, /* U+000896: */
- 0, /* U+000897: */
- 0, /* U+000898: */
- 0, /* U+000899: */
- 0, /* U+00089a: */
- 0, /* U+00089b: */
- 0, /* U+00089c: */
- 0, /* U+00089d: */
- 0, /* U+00089e: */
- 0, /* U+00089f: */
- 0, /* U+0008a0: */
- 0, /* U+0008a1: */
- 0, /* U+0008a2: */
- 0, /* U+0008a3: */
- 0, /* U+0008a4: */
- 0, /* U+0008a5: */
- 0, /* U+0008a6: */
- 0, /* U+0008a7: */
- 0, /* U+0008a8: */
- 0, /* U+0008a9: */
- 0, /* U+0008aa: */
- 0, /* U+0008ab: */
- 0, /* U+0008ac: */
- 0, /* U+0008ad: */
- 0, /* U+0008ae: */
- 0, /* U+0008af: */
- 0, /* U+0008b0: */
- 0, /* U+0008b1: */
- 0, /* U+0008b2: */
- 0, /* U+0008b3: */
- 0, /* U+0008b4: */
- 0, /* U+0008b5: */
- 0, /* U+0008b6: */
- 0, /* U+0008b7: */
- 0, /* U+0008b8: */
- 0, /* U+0008b9: */
- 0, /* U+0008ba: */
- 0, /* U+0008bb: */
- 0, /* U+0008bc: */
- 0, /* U+0008bd: */
- 0, /* U+0008be: */
- 0, /* U+0008bf: */
- 0, /* U+0008c0: */
- 0, /* U+0008c1: */
- 0, /* U+0008c2: */
- 0, /* U+0008c3: */
- 0, /* U+0008c4: */
- 0, /* U+0008c5: */
- 0, /* U+0008c6: */
- 0, /* U+0008c7: */
- 0, /* U+0008c8: */
- 0, /* U+0008c9: */
- 0, /* U+0008ca: */
- 0, /* U+0008cb: */
- 0, /* U+0008cc: */
- 0, /* U+0008cd: */
- 0, /* U+0008ce: */
- 0, /* U+0008cf: */
- 0, /* U+0008d0: */
- 0, /* U+0008d1: */
- 0, /* U+0008d2: */
- 0, /* U+0008d3: */
- 0, /* U+0008d4: */
- 0, /* U+0008d5: */
- 0, /* U+0008d6: */
- 0, /* U+0008d7: */
- 0, /* U+0008d8: */
- 0, /* U+0008d9: */
- 0, /* U+0008da: */
- 0, /* U+0008db: */
- 0, /* U+0008dc: */
- 0, /* U+0008dd: */
- 0, /* U+0008de: */
- 0, /* U+0008df: */
- 0, /* U+0008e0: */
- 0, /* U+0008e1: */
- 0, /* U+0008e2: */
- 0, /* U+0008e3: */
- 0, /* U+0008e4: */
- 0, /* U+0008e5: */
- 0, /* U+0008e6: */
- 0, /* U+0008e7: */
- 0, /* U+0008e8: */
- 0, /* U+0008e9: */
- 0, /* U+0008ea: */
- 0, /* U+0008eb: */
- 0, /* U+0008ec: */
- 0, /* U+0008ed: */
- 0, /* U+0008ee: */
- 0, /* U+0008ef: */
- 0, /* U+0008f0: */
- 0, /* U+0008f1: */
- 0, /* U+0008f2: */
- 0, /* U+0008f3: */
- 0, /* U+0008f4: */
- 0, /* U+0008f5: */
- 0, /* U+0008f6: */
- 0, /* U+0008f7: */
- 0, /* U+0008f8: */
- 0, /* U+0008f9: */
- 0, /* U+0008fa: */
- 0, /* U+0008fb: */
- 0, /* U+0008fc: */
- 0, /* U+0008fd: */
- 0, /* U+0008fe: */
- 0, /* U+0008ff: */
- 0, /* U+000900: */
- RTUNI_ALPHA, /* U+000901: DEVANAGARI SIGN CANDRABINDU*/
- RTUNI_ALPHA, /* U+000902: DEVANAGARI SIGN ANUSVARA*/
- RTUNI_ALPHA, /* U+000903: DEVANAGARI SIGN VISARGA*/
- RTUNI_ALPHA, /* U+000904: DEVANAGARI LETTER SHORT A*/
- RTUNI_ALPHA, /* U+000905: DEVANAGARI LETTER A*/
- RTUNI_ALPHA, /* U+000906: DEVANAGARI LETTER AA*/
- RTUNI_ALPHA, /* U+000907: DEVANAGARI LETTER I*/
- RTUNI_ALPHA, /* U+000908: DEVANAGARI LETTER II*/
- RTUNI_ALPHA, /* U+000909: DEVANAGARI LETTER U*/
- RTUNI_ALPHA, /* U+00090a: DEVANAGARI LETTER UU*/
- RTUNI_ALPHA, /* U+00090b: DEVANAGARI LETTER VOCALIC R*/
- RTUNI_ALPHA, /* U+00090c: DEVANAGARI LETTER VOCALIC L*/
- RTUNI_ALPHA, /* U+00090d: DEVANAGARI LETTER CANDRA E*/
- RTUNI_ALPHA, /* U+00090e: DEVANAGARI LETTER SHORT E*/
- RTUNI_ALPHA, /* U+00090f: DEVANAGARI LETTER E*/
- RTUNI_ALPHA, /* U+000910: DEVANAGARI LETTER AI*/
- RTUNI_ALPHA, /* U+000911: DEVANAGARI LETTER CANDRA O*/
- RTUNI_ALPHA, /* U+000912: DEVANAGARI LETTER SHORT O*/
- RTUNI_ALPHA, /* U+000913: DEVANAGARI LETTER O*/
- RTUNI_ALPHA, /* U+000914: DEVANAGARI LETTER AU*/
- RTUNI_ALPHA, /* U+000915: DEVANAGARI LETTER KA*/
- RTUNI_ALPHA, /* U+000916: DEVANAGARI LETTER KHA*/
- RTUNI_ALPHA, /* U+000917: DEVANAGARI LETTER GA*/
- RTUNI_ALPHA, /* U+000918: DEVANAGARI LETTER GHA*/
- RTUNI_ALPHA, /* U+000919: DEVANAGARI LETTER NGA*/
- RTUNI_ALPHA, /* U+00091a: DEVANAGARI LETTER CA*/
- RTUNI_ALPHA, /* U+00091b: DEVANAGARI LETTER CHA*/
- RTUNI_ALPHA, /* U+00091c: DEVANAGARI LETTER JA*/
- RTUNI_ALPHA, /* U+00091d: DEVANAGARI LETTER JHA*/
- RTUNI_ALPHA, /* U+00091e: DEVANAGARI LETTER NYA*/
- RTUNI_ALPHA, /* U+00091f: DEVANAGARI LETTER TTA*/
- RTUNI_ALPHA, /* U+000920: DEVANAGARI LETTER TTHA*/
- RTUNI_ALPHA, /* U+000921: DEVANAGARI LETTER DDA*/
- RTUNI_ALPHA, /* U+000922: DEVANAGARI LETTER DDHA*/
- RTUNI_ALPHA, /* U+000923: DEVANAGARI LETTER NNA*/
- RTUNI_ALPHA, /* U+000924: DEVANAGARI LETTER TA*/
- RTUNI_ALPHA, /* U+000925: DEVANAGARI LETTER THA*/
- RTUNI_ALPHA, /* U+000926: DEVANAGARI LETTER DA*/
- RTUNI_ALPHA, /* U+000927: DEVANAGARI LETTER DHA*/
- RTUNI_ALPHA, /* U+000928: DEVANAGARI LETTER NA*/
- RTUNI_ALPHA, /* U+000929: DEVANAGARI LETTER NNNA*/
- RTUNI_ALPHA, /* U+00092a: DEVANAGARI LETTER PA*/
- RTUNI_ALPHA, /* U+00092b: DEVANAGARI LETTER PHA*/
- RTUNI_ALPHA, /* U+00092c: DEVANAGARI LETTER BA*/
- RTUNI_ALPHA, /* U+00092d: DEVANAGARI LETTER BHA*/
- RTUNI_ALPHA, /* U+00092e: DEVANAGARI LETTER MA*/
- RTUNI_ALPHA, /* U+00092f: DEVANAGARI LETTER YA*/
- RTUNI_ALPHA, /* U+000930: DEVANAGARI LETTER RA*/
- RTUNI_ALPHA, /* U+000931: DEVANAGARI LETTER RRA*/
- RTUNI_ALPHA, /* U+000932: DEVANAGARI LETTER LA*/
- RTUNI_ALPHA, /* U+000933: DEVANAGARI LETTER LLA*/
- RTUNI_ALPHA, /* U+000934: DEVANAGARI LETTER LLLA*/
- RTUNI_ALPHA, /* U+000935: DEVANAGARI LETTER VA*/
- RTUNI_ALPHA, /* U+000936: DEVANAGARI LETTER SHA*/
- RTUNI_ALPHA, /* U+000937: DEVANAGARI LETTER SSA*/
- RTUNI_ALPHA, /* U+000938: DEVANAGARI LETTER SA*/
- RTUNI_ALPHA, /* U+000939: DEVANAGARI LETTER HA*/
- 0, /* U+00093a: */
- 0, /* U+00093b: */
- 0, /* U+00093c: DEVANAGARI SIGN NUKTA*/
- RTUNI_ALPHA, /* U+00093d: DEVANAGARI SIGN AVAGRAHA*/
- RTUNI_ALPHA, /* U+00093e: DEVANAGARI VOWEL SIGN AA*/
- RTUNI_ALPHA, /* U+00093f: DEVANAGARI VOWEL SIGN I*/
- RTUNI_ALPHA, /* U+000940: DEVANAGARI VOWEL SIGN II*/
- RTUNI_ALPHA, /* U+000941: DEVANAGARI VOWEL SIGN U*/
- RTUNI_ALPHA, /* U+000942: DEVANAGARI VOWEL SIGN UU*/
- RTUNI_ALPHA, /* U+000943: DEVANAGARI VOWEL SIGN VOCALIC R*/
- RTUNI_ALPHA, /* U+000944: DEVANAGARI VOWEL SIGN VOCALIC RR*/
- RTUNI_ALPHA, /* U+000945: DEVANAGARI VOWEL SIGN CANDRA E*/
- RTUNI_ALPHA, /* U+000946: DEVANAGARI VOWEL SIGN SHORT E*/
- RTUNI_ALPHA, /* U+000947: DEVANAGARI VOWEL SIGN E*/
- RTUNI_ALPHA, /* U+000948: DEVANAGARI VOWEL SIGN AI*/
- RTUNI_ALPHA, /* U+000949: DEVANAGARI VOWEL SIGN CANDRA O*/
- RTUNI_ALPHA, /* U+00094a: DEVANAGARI VOWEL SIGN SHORT O*/
- RTUNI_ALPHA, /* U+00094b: DEVANAGARI VOWEL SIGN O*/
- RTUNI_ALPHA, /* U+00094c: DEVANAGARI VOWEL SIGN AU*/
- 0, /* U+00094d: DEVANAGARI SIGN VIRAMA*/
- 0, /* U+00094e: */
- 0, /* U+00094f: */
- RTUNI_ALPHA, /* U+000950: DEVANAGARI OM*/
- 0, /* U+000951: DEVANAGARI STRESS SIGN UDATTA*/
- 0, /* U+000952: DEVANAGARI STRESS SIGN ANUDATTA*/
- 0, /* U+000953: DEVANAGARI GRAVE ACCENT*/
- 0, /* U+000954: DEVANAGARI ACUTE ACCENT*/
- 0, /* U+000955: */
- 0, /* U+000956: */
- 0, /* U+000957: */
- RTUNI_ALPHA, /* U+000958: DEVANAGARI LETTER QA*/
- RTUNI_ALPHA, /* U+000959: DEVANAGARI LETTER KHHA*/
- RTUNI_ALPHA, /* U+00095a: DEVANAGARI LETTER GHHA*/
- RTUNI_ALPHA, /* U+00095b: DEVANAGARI LETTER ZA*/
- RTUNI_ALPHA, /* U+00095c: DEVANAGARI LETTER DDDHA*/
- RTUNI_ALPHA, /* U+00095d: DEVANAGARI LETTER RHA*/
- RTUNI_ALPHA, /* U+00095e: DEVANAGARI LETTER FA*/
- RTUNI_ALPHA, /* U+00095f: DEVANAGARI LETTER YYA*/
- RTUNI_ALPHA, /* U+000960: DEVANAGARI LETTER VOCALIC RR*/
- RTUNI_ALPHA, /* U+000961: DEVANAGARI LETTER VOCALIC LL*/
- RTUNI_ALPHA, /* U+000962: DEVANAGARI VOWEL SIGN VOCALIC L*/
- RTUNI_ALPHA, /* U+000963: DEVANAGARI VOWEL SIGN VOCALIC LL*/
- 0, /* U+000964: DEVANAGARI DANDA*/
- 0, /* U+000965: DEVANAGARI DOUBLE DANDA*/
- RTUNI_DDIGIT, /* U+000966: DEVANAGARI DIGIT ZERO*/
- RTUNI_DDIGIT, /* U+000967: DEVANAGARI DIGIT ONE*/
- RTUNI_DDIGIT, /* U+000968: DEVANAGARI DIGIT TWO*/
- RTUNI_DDIGIT, /* U+000969: DEVANAGARI DIGIT THREE*/
- RTUNI_DDIGIT, /* U+00096a: DEVANAGARI DIGIT FOUR*/
- RTUNI_DDIGIT, /* U+00096b: DEVANAGARI DIGIT FIVE*/
- RTUNI_DDIGIT, /* U+00096c: DEVANAGARI DIGIT SIX*/
- RTUNI_DDIGIT, /* U+00096d: DEVANAGARI DIGIT SEVEN*/
- RTUNI_DDIGIT, /* U+00096e: DEVANAGARI DIGIT EIGHT*/
- RTUNI_DDIGIT, /* U+00096f: DEVANAGARI DIGIT NINE*/
- 0, /* U+000970: DEVANAGARI ABBREVIATION SIGN*/
- 0, /* U+000971: */
- 0, /* U+000972: */
- 0, /* U+000973: */
- 0, /* U+000974: */
- 0, /* U+000975: */
- 0, /* U+000976: */
- 0, /* U+000977: */
- 0, /* U+000978: */
- 0, /* U+000979: */
- 0, /* U+00097a: */
- 0, /* U+00097b: */
- 0, /* U+00097c: */
- RTUNI_ALPHA, /* U+00097d: DEVANAGARI LETTER GLOTTAL STOP*/
- 0, /* U+00097e: */
- 0, /* U+00097f: */
- 0, /* U+000980: */
- RTUNI_ALPHA, /* U+000981: BENGALI SIGN CANDRABINDU*/
- RTUNI_ALPHA, /* U+000982: BENGALI SIGN ANUSVARA*/
- RTUNI_ALPHA, /* U+000983: BENGALI SIGN VISARGA*/
- 0, /* U+000984: */
- RTUNI_ALPHA, /* U+000985: BENGALI LETTER A*/
- RTUNI_ALPHA, /* U+000986: BENGALI LETTER AA*/
- RTUNI_ALPHA, /* U+000987: BENGALI LETTER I*/
- RTUNI_ALPHA, /* U+000988: BENGALI LETTER II*/
- RTUNI_ALPHA, /* U+000989: BENGALI LETTER U*/
- RTUNI_ALPHA, /* U+00098a: BENGALI LETTER UU*/
- RTUNI_ALPHA, /* U+00098b: BENGALI LETTER VOCALIC R*/
- RTUNI_ALPHA, /* U+00098c: BENGALI LETTER VOCALIC L*/
- 0, /* U+00098d: */
- 0, /* U+00098e: */
- RTUNI_ALPHA, /* U+00098f: BENGALI LETTER E*/
- RTUNI_ALPHA, /* U+000990: BENGALI LETTER AI*/
- 0, /* U+000991: */
- 0, /* U+000992: */
- RTUNI_ALPHA, /* U+000993: BENGALI LETTER O*/
- RTUNI_ALPHA, /* U+000994: BENGALI LETTER AU*/
- RTUNI_ALPHA, /* U+000995: BENGALI LETTER KA*/
- RTUNI_ALPHA, /* U+000996: BENGALI LETTER KHA*/
- RTUNI_ALPHA, /* U+000997: BENGALI LETTER GA*/
- RTUNI_ALPHA, /* U+000998: BENGALI LETTER GHA*/
- RTUNI_ALPHA, /* U+000999: BENGALI LETTER NGA*/
- RTUNI_ALPHA, /* U+00099a: BENGALI LETTER CA*/
- RTUNI_ALPHA, /* U+00099b: BENGALI LETTER CHA*/
- RTUNI_ALPHA, /* U+00099c: BENGALI LETTER JA*/
- RTUNI_ALPHA, /* U+00099d: BENGALI LETTER JHA*/
- RTUNI_ALPHA, /* U+00099e: BENGALI LETTER NYA*/
- RTUNI_ALPHA, /* U+00099f: BENGALI LETTER TTA*/
- RTUNI_ALPHA, /* U+0009a0: BENGALI LETTER TTHA*/
- RTUNI_ALPHA, /* U+0009a1: BENGALI LETTER DDA*/
- RTUNI_ALPHA, /* U+0009a2: BENGALI LETTER DDHA*/
- RTUNI_ALPHA, /* U+0009a3: BENGALI LETTER NNA*/
- RTUNI_ALPHA, /* U+0009a4: BENGALI LETTER TA*/
- RTUNI_ALPHA, /* U+0009a5: BENGALI LETTER THA*/
- RTUNI_ALPHA, /* U+0009a6: BENGALI LETTER DA*/
- RTUNI_ALPHA, /* U+0009a7: BENGALI LETTER DHA*/
- RTUNI_ALPHA, /* U+0009a8: BENGALI LETTER NA*/
- 0, /* U+0009a9: */
- RTUNI_ALPHA, /* U+0009aa: BENGALI LETTER PA*/
- RTUNI_ALPHA, /* U+0009ab: BENGALI LETTER PHA*/
- RTUNI_ALPHA, /* U+0009ac: BENGALI LETTER BA*/
- RTUNI_ALPHA, /* U+0009ad: BENGALI LETTER BHA*/
- RTUNI_ALPHA, /* U+0009ae: BENGALI LETTER MA*/
- RTUNI_ALPHA, /* U+0009af: BENGALI LETTER YA*/
- RTUNI_ALPHA, /* U+0009b0: BENGALI LETTER RA*/
- 0, /* U+0009b1: */
- RTUNI_ALPHA, /* U+0009b2: BENGALI LETTER LA*/
- 0, /* U+0009b3: */
- 0, /* U+0009b4: */
- 0, /* U+0009b5: */
- RTUNI_ALPHA, /* U+0009b6: BENGALI LETTER SHA*/
- RTUNI_ALPHA, /* U+0009b7: BENGALI LETTER SSA*/
- RTUNI_ALPHA, /* U+0009b8: BENGALI LETTER SA*/
- RTUNI_ALPHA, /* U+0009b9: BENGALI LETTER HA*/
- 0, /* U+0009ba: */
- 0, /* U+0009bb: */
- 0, /* U+0009bc: BENGALI SIGN NUKTA*/
- RTUNI_ALPHA, /* U+0009bd: BENGALI SIGN AVAGRAHA*/
- RTUNI_ALPHA, /* U+0009be: BENGALI VOWEL SIGN AA*/
- RTUNI_ALPHA, /* U+0009bf: BENGALI VOWEL SIGN I*/
- RTUNI_ALPHA, /* U+0009c0: BENGALI VOWEL SIGN II*/
- RTUNI_ALPHA, /* U+0009c1: BENGALI VOWEL SIGN U*/
- RTUNI_ALPHA, /* U+0009c2: BENGALI VOWEL SIGN UU*/
- RTUNI_ALPHA, /* U+0009c3: BENGALI VOWEL SIGN VOCALIC R*/
- RTUNI_ALPHA, /* U+0009c4: BENGALI VOWEL SIGN VOCALIC RR*/
- 0, /* U+0009c5: */
- 0, /* U+0009c6: */
- RTUNI_ALPHA, /* U+0009c7: BENGALI VOWEL SIGN E*/
- RTUNI_ALPHA, /* U+0009c8: BENGALI VOWEL SIGN AI*/
- 0, /* U+0009c9: */
- 0, /* U+0009ca: */
- RTUNI_ALPHA, /* U+0009cb: BENGALI VOWEL SIGN O*/
- RTUNI_ALPHA, /* U+0009cc: BENGALI VOWEL SIGN AU*/
- 0, /* U+0009cd: BENGALI SIGN VIRAMA*/
- RTUNI_ALPHA, /* U+0009ce: BENGALI LETTER KHANDA TA*/
- 0, /* U+0009cf: */
- 0, /* U+0009d0: */
- 0, /* U+0009d1: */
- 0, /* U+0009d2: */
- 0, /* U+0009d3: */
- 0, /* U+0009d4: */
- 0, /* U+0009d5: */
- 0, /* U+0009d6: */
- RTUNI_ALPHA, /* U+0009d7: BENGALI AU LENGTH MARK*/
- 0, /* U+0009d8: */
- 0, /* U+0009d9: */
- 0, /* U+0009da: */
- 0, /* U+0009db: */
- RTUNI_ALPHA, /* U+0009dc: BENGALI LETTER RRA*/
- RTUNI_ALPHA, /* U+0009dd: BENGALI LETTER RHA*/
- 0, /* U+0009de: */
- RTUNI_ALPHA, /* U+0009df: BENGALI LETTER YYA*/
- RTUNI_ALPHA, /* U+0009e0: BENGALI LETTER VOCALIC RR*/
- RTUNI_ALPHA, /* U+0009e1: BENGALI LETTER VOCALIC LL*/
- RTUNI_ALPHA, /* U+0009e2: BENGALI VOWEL SIGN VOCALIC L*/
- RTUNI_ALPHA, /* U+0009e3: BENGALI VOWEL SIGN VOCALIC LL*/
- 0, /* U+0009e4: */
- 0, /* U+0009e5: */
- RTUNI_DDIGIT, /* U+0009e6: BENGALI DIGIT ZERO*/
- RTUNI_DDIGIT, /* U+0009e7: BENGALI DIGIT ONE*/
- RTUNI_DDIGIT, /* U+0009e8: BENGALI DIGIT TWO*/
- RTUNI_DDIGIT, /* U+0009e9: BENGALI DIGIT THREE*/
- RTUNI_DDIGIT, /* U+0009ea: BENGALI DIGIT FOUR*/
- RTUNI_DDIGIT, /* U+0009eb: BENGALI DIGIT FIVE*/
- RTUNI_DDIGIT, /* U+0009ec: BENGALI DIGIT SIX*/
- RTUNI_DDIGIT, /* U+0009ed: BENGALI DIGIT SEVEN*/
- RTUNI_DDIGIT, /* U+0009ee: BENGALI DIGIT EIGHT*/
- RTUNI_DDIGIT, /* U+0009ef: BENGALI DIGIT NINE*/
- RTUNI_ALPHA, /* U+0009f0: BENGALI LETTER RA WITH MIDDLE DIAGONAL*/
- RTUNI_ALPHA, /* U+0009f1: BENGALI LETTER RA WITH LOWER DIAGONAL*/
- 0, /* U+0009f2: BENGALI RUPEE MARK*/
- 0, /* U+0009f3: BENGALI RUPEE SIGN*/
- 0, /* U+0009f4: BENGALI CURRENCY NUMERATOR ONE*/
- 0, /* U+0009f5: BENGALI CURRENCY NUMERATOR TWO*/
- 0, /* U+0009f6: BENGALI CURRENCY NUMERATOR THREE*/
- 0, /* U+0009f7: BENGALI CURRENCY NUMERATOR FOUR*/
- 0, /* U+0009f8: BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR*/
- 0, /* U+0009f9: BENGALI CURRENCY DENOMINATOR SIXTEEN*/
- 0, /* U+0009fa: BENGALI ISSHAR*/
- 0, /* U+0009fb: */
- 0, /* U+0009fc: */
- 0, /* U+0009fd: */
- 0, /* U+0009fe: */
- 0, /* U+0009ff: */
- 0, /* U+000a00: */
- RTUNI_ALPHA, /* U+000a01: GURMUKHI SIGN ADAK BINDI*/
- RTUNI_ALPHA, /* U+000a02: GURMUKHI SIGN BINDI*/
- RTUNI_ALPHA, /* U+000a03: GURMUKHI SIGN VISARGA*/
- 0, /* U+000a04: */
- RTUNI_ALPHA, /* U+000a05: GURMUKHI LETTER A*/
- RTUNI_ALPHA, /* U+000a06: GURMUKHI LETTER AA*/
- RTUNI_ALPHA, /* U+000a07: GURMUKHI LETTER I*/
- RTUNI_ALPHA, /* U+000a08: GURMUKHI LETTER II*/
- RTUNI_ALPHA, /* U+000a09: GURMUKHI LETTER U*/
- RTUNI_ALPHA, /* U+000a0a: GURMUKHI LETTER UU*/
- 0, /* U+000a0b: */
- 0, /* U+000a0c: */
- 0, /* U+000a0d: */
- 0, /* U+000a0e: */
- RTUNI_ALPHA, /* U+000a0f: GURMUKHI LETTER EE*/
- RTUNI_ALPHA, /* U+000a10: GURMUKHI LETTER AI*/
- 0, /* U+000a11: */
- 0, /* U+000a12: */
- RTUNI_ALPHA, /* U+000a13: GURMUKHI LETTER OO*/
- RTUNI_ALPHA, /* U+000a14: GURMUKHI LETTER AU*/
- RTUNI_ALPHA, /* U+000a15: GURMUKHI LETTER KA*/
- RTUNI_ALPHA, /* U+000a16: GURMUKHI LETTER KHA*/
- RTUNI_ALPHA, /* U+000a17: GURMUKHI LETTER GA*/
- RTUNI_ALPHA, /* U+000a18: GURMUKHI LETTER GHA*/
- RTUNI_ALPHA, /* U+000a19: GURMUKHI LETTER NGA*/
- RTUNI_ALPHA, /* U+000a1a: GURMUKHI LETTER CA*/
- RTUNI_ALPHA, /* U+000a1b: GURMUKHI LETTER CHA*/
- RTUNI_ALPHA, /* U+000a1c: GURMUKHI LETTER JA*/
- RTUNI_ALPHA, /* U+000a1d: GURMUKHI LETTER JHA*/
- RTUNI_ALPHA, /* U+000a1e: GURMUKHI LETTER NYA*/
- RTUNI_ALPHA, /* U+000a1f: GURMUKHI LETTER TTA*/
- RTUNI_ALPHA, /* U+000a20: GURMUKHI LETTER TTHA*/
- RTUNI_ALPHA, /* U+000a21: GURMUKHI LETTER DDA*/
- RTUNI_ALPHA, /* U+000a22: GURMUKHI LETTER DDHA*/
- RTUNI_ALPHA, /* U+000a23: GURMUKHI LETTER NNA*/
- RTUNI_ALPHA, /* U+000a24: GURMUKHI LETTER TA*/
- RTUNI_ALPHA, /* U+000a25: GURMUKHI LETTER THA*/
- RTUNI_ALPHA, /* U+000a26: GURMUKHI LETTER DA*/
- RTUNI_ALPHA, /* U+000a27: GURMUKHI LETTER DHA*/
- RTUNI_ALPHA, /* U+000a28: GURMUKHI LETTER NA*/
- 0, /* U+000a29: */
- RTUNI_ALPHA, /* U+000a2a: GURMUKHI LETTER PA*/
- RTUNI_ALPHA, /* U+000a2b: GURMUKHI LETTER PHA*/
- RTUNI_ALPHA, /* U+000a2c: GURMUKHI LETTER BA*/
- RTUNI_ALPHA, /* U+000a2d: GURMUKHI LETTER BHA*/
- RTUNI_ALPHA, /* U+000a2e: GURMUKHI LETTER MA*/
- RTUNI_ALPHA, /* U+000a2f: GURMUKHI LETTER YA*/
- RTUNI_ALPHA, /* U+000a30: GURMUKHI LETTER RA*/
- 0, /* U+000a31: */
- RTUNI_ALPHA, /* U+000a32: GURMUKHI LETTER LA*/
- RTUNI_ALPHA, /* U+000a33: GURMUKHI LETTER LLA*/
- 0, /* U+000a34: */
- RTUNI_ALPHA, /* U+000a35: GURMUKHI LETTER VA*/
- RTUNI_ALPHA, /* U+000a36: GURMUKHI LETTER SHA*/
- 0, /* U+000a37: */
- RTUNI_ALPHA, /* U+000a38: GURMUKHI LETTER SA*/
- RTUNI_ALPHA, /* U+000a39: GURMUKHI LETTER HA*/
- 0, /* U+000a3a: */
- 0, /* U+000a3b: */
- 0, /* U+000a3c: GURMUKHI SIGN NUKTA*/
- 0, /* U+000a3d: */
- RTUNI_ALPHA, /* U+000a3e: GURMUKHI VOWEL SIGN AA*/
- RTUNI_ALPHA, /* U+000a3f: GURMUKHI VOWEL SIGN I*/
- RTUNI_ALPHA, /* U+000a40: GURMUKHI VOWEL SIGN II*/
- RTUNI_ALPHA, /* U+000a41: GURMUKHI VOWEL SIGN U*/
- RTUNI_ALPHA, /* U+000a42: GURMUKHI VOWEL SIGN UU*/
- 0, /* U+000a43: */
- 0, /* U+000a44: */
- 0, /* U+000a45: */
- 0, /* U+000a46: */
- RTUNI_ALPHA, /* U+000a47: GURMUKHI VOWEL SIGN EE*/
- RTUNI_ALPHA, /* U+000a48: GURMUKHI VOWEL SIGN AI*/
- 0, /* U+000a49: */
- 0, /* U+000a4a: */
- RTUNI_ALPHA, /* U+000a4b: GURMUKHI VOWEL SIGN OO*/
- RTUNI_ALPHA, /* U+000a4c: GURMUKHI VOWEL SIGN AU*/
- 0, /* U+000a4d: GURMUKHI SIGN VIRAMA*/
- 0, /* U+000a4e: */
- 0, /* U+000a4f: */
- 0, /* U+000a50: */
- 0, /* U+000a51: */
- 0, /* U+000a52: */
- 0, /* U+000a53: */
- 0, /* U+000a54: */
- 0, /* U+000a55: */
- 0, /* U+000a56: */
- 0, /* U+000a57: */
- 0, /* U+000a58: */
- RTUNI_ALPHA, /* U+000a59: GURMUKHI LETTER KHHA*/
- RTUNI_ALPHA, /* U+000a5a: GURMUKHI LETTER GHHA*/
- RTUNI_ALPHA, /* U+000a5b: GURMUKHI LETTER ZA*/
- RTUNI_ALPHA, /* U+000a5c: GURMUKHI LETTER RRA*/
- 0, /* U+000a5d: */
- RTUNI_ALPHA, /* U+000a5e: GURMUKHI LETTER FA*/
- 0, /* U+000a5f: */
- 0, /* U+000a60: */
- 0, /* U+000a61: */
- 0, /* U+000a62: */
- 0, /* U+000a63: */
- 0, /* U+000a64: */
- 0, /* U+000a65: */
- RTUNI_DDIGIT, /* U+000a66: GURMUKHI DIGIT ZERO*/
- RTUNI_DDIGIT, /* U+000a67: GURMUKHI DIGIT ONE*/
- RTUNI_DDIGIT, /* U+000a68: GURMUKHI DIGIT TWO*/
- RTUNI_DDIGIT, /* U+000a69: GURMUKHI DIGIT THREE*/
- RTUNI_DDIGIT, /* U+000a6a: GURMUKHI DIGIT FOUR*/
- RTUNI_DDIGIT, /* U+000a6b: GURMUKHI DIGIT FIVE*/
- RTUNI_DDIGIT, /* U+000a6c: GURMUKHI DIGIT SIX*/
- RTUNI_DDIGIT, /* U+000a6d: GURMUKHI DIGIT SEVEN*/
- RTUNI_DDIGIT, /* U+000a6e: GURMUKHI DIGIT EIGHT*/
- RTUNI_DDIGIT, /* U+000a6f: GURMUKHI DIGIT NINE*/
- RTUNI_ALPHA, /* U+000a70: GURMUKHI TIPPI*/
- RTUNI_ALPHA, /* U+000a71: GURMUKHI ADDAK*/
- RTUNI_ALPHA, /* U+000a72: GURMUKHI IRI*/
- RTUNI_ALPHA, /* U+000a73: GURMUKHI URA*/
- RTUNI_ALPHA, /* U+000a74: GURMUKHI EK ONKAR*/
- 0, /* U+000a75: */
- 0, /* U+000a76: */
- 0, /* U+000a77: */
- 0, /* U+000a78: */
- 0, /* U+000a79: */
- 0, /* U+000a7a: */
- 0, /* U+000a7b: */
- 0, /* U+000a7c: */
- 0, /* U+000a7d: */
- 0, /* U+000a7e: */
- 0, /* U+000a7f: */
- 0, /* U+000a80: */
- RTUNI_ALPHA, /* U+000a81: GUJARATI SIGN CANDRABINDU*/
- RTUNI_ALPHA, /* U+000a82: GUJARATI SIGN ANUSVARA*/
- RTUNI_ALPHA, /* U+000a83: GUJARATI SIGN VISARGA*/
- 0, /* U+000a84: */
- RTUNI_ALPHA, /* U+000a85: GUJARATI LETTER A*/
- RTUNI_ALPHA, /* U+000a86: GUJARATI LETTER AA*/
- RTUNI_ALPHA, /* U+000a87: GUJARATI LETTER I*/
- RTUNI_ALPHA, /* U+000a88: GUJARATI LETTER II*/
- RTUNI_ALPHA, /* U+000a89: GUJARATI LETTER U*/
- RTUNI_ALPHA, /* U+000a8a: GUJARATI LETTER UU*/
- RTUNI_ALPHA, /* U+000a8b: GUJARATI LETTER VOCALIC R*/
- RTUNI_ALPHA, /* U+000a8c: GUJARATI LETTER VOCALIC L*/
- RTUNI_ALPHA, /* U+000a8d: GUJARATI VOWEL CANDRA E*/
- 0, /* U+000a8e: */
- RTUNI_ALPHA, /* U+000a8f: GUJARATI LETTER E*/
- RTUNI_ALPHA, /* U+000a90: GUJARATI LETTER AI*/
- RTUNI_ALPHA, /* U+000a91: GUJARATI VOWEL CANDRA O*/
- 0, /* U+000a92: */
- RTUNI_ALPHA, /* U+000a93: GUJARATI LETTER O*/
- RTUNI_ALPHA, /* U+000a94: GUJARATI LETTER AU*/
- RTUNI_ALPHA, /* U+000a95: GUJARATI LETTER KA*/
- RTUNI_ALPHA, /* U+000a96: GUJARATI LETTER KHA*/
- RTUNI_ALPHA, /* U+000a97: GUJARATI LETTER GA*/
- RTUNI_ALPHA, /* U+000a98: GUJARATI LETTER GHA*/
- RTUNI_ALPHA, /* U+000a99: GUJARATI LETTER NGA*/
- RTUNI_ALPHA, /* U+000a9a: GUJARATI LETTER CA*/
- RTUNI_ALPHA, /* U+000a9b: GUJARATI LETTER CHA*/
- RTUNI_ALPHA, /* U+000a9c: GUJARATI LETTER JA*/
- RTUNI_ALPHA, /* U+000a9d: GUJARATI LETTER JHA*/
- RTUNI_ALPHA, /* U+000a9e: GUJARATI LETTER NYA*/
- RTUNI_ALPHA, /* U+000a9f: GUJARATI LETTER TTA*/
- RTUNI_ALPHA, /* U+000aa0: GUJARATI LETTER TTHA*/
- RTUNI_ALPHA, /* U+000aa1: GUJARATI LETTER DDA*/
- RTUNI_ALPHA, /* U+000aa2: GUJARATI LETTER DDHA*/
- RTUNI_ALPHA, /* U+000aa3: GUJARATI LETTER NNA*/
- RTUNI_ALPHA, /* U+000aa4: GUJARATI LETTER TA*/
- RTUNI_ALPHA, /* U+000aa5: GUJARATI LETTER THA*/
- RTUNI_ALPHA, /* U+000aa6: GUJARATI LETTER DA*/
- RTUNI_ALPHA, /* U+000aa7: GUJARATI LETTER DHA*/
- RTUNI_ALPHA, /* U+000aa8: GUJARATI LETTER NA*/
- 0, /* U+000aa9: */
- RTUNI_ALPHA, /* U+000aaa: GUJARATI LETTER PA*/
- RTUNI_ALPHA, /* U+000aab: GUJARATI LETTER PHA*/
- RTUNI_ALPHA, /* U+000aac: GUJARATI LETTER BA*/
- RTUNI_ALPHA, /* U+000aad: GUJARATI LETTER BHA*/
- RTUNI_ALPHA, /* U+000aae: GUJARATI LETTER MA*/
- RTUNI_ALPHA, /* U+000aaf: GUJARATI LETTER YA*/
- RTUNI_ALPHA, /* U+000ab0: GUJARATI LETTER RA*/
- 0, /* U+000ab1: */
- RTUNI_ALPHA, /* U+000ab2: GUJARATI LETTER LA*/
- RTUNI_ALPHA, /* U+000ab3: GUJARATI LETTER LLA*/
- 0, /* U+000ab4: */
- RTUNI_ALPHA, /* U+000ab5: GUJARATI LETTER VA*/
- RTUNI_ALPHA, /* U+000ab6: GUJARATI LETTER SHA*/
- RTUNI_ALPHA, /* U+000ab7: GUJARATI LETTER SSA*/
- RTUNI_ALPHA, /* U+000ab8: GUJARATI LETTER SA*/
- RTUNI_ALPHA, /* U+000ab9: GUJARATI LETTER HA*/
- 0, /* U+000aba: */
- 0, /* U+000abb: */
- 0, /* U+000abc: GUJARATI SIGN NUKTA*/
- RTUNI_ALPHA, /* U+000abd: GUJARATI SIGN AVAGRAHA*/
- RTUNI_ALPHA, /* U+000abe: GUJARATI VOWEL SIGN AA*/
- RTUNI_ALPHA, /* U+000abf: GUJARATI VOWEL SIGN I*/
- RTUNI_ALPHA, /* U+000ac0: GUJARATI VOWEL SIGN II*/
- RTUNI_ALPHA, /* U+000ac1: GUJARATI VOWEL SIGN U*/
- RTUNI_ALPHA, /* U+000ac2: GUJARATI VOWEL SIGN UU*/
- RTUNI_ALPHA, /* U+000ac3: GUJARATI VOWEL SIGN VOCALIC R*/
- RTUNI_ALPHA, /* U+000ac4: GUJARATI VOWEL SIGN VOCALIC RR*/
- RTUNI_ALPHA, /* U+000ac5: GUJARATI VOWEL SIGN CANDRA E*/
- 0, /* U+000ac6: */
- RTUNI_ALPHA, /* U+000ac7: GUJARATI VOWEL SIGN E*/
- RTUNI_ALPHA, /* U+000ac8: GUJARATI VOWEL SIGN AI*/
- RTUNI_ALPHA, /* U+000ac9: GUJARATI VOWEL SIGN CANDRA O*/
- 0, /* U+000aca: */
- RTUNI_ALPHA, /* U+000acb: GUJARATI VOWEL SIGN O*/
- RTUNI_ALPHA, /* U+000acc: GUJARATI VOWEL SIGN AU*/
- 0, /* U+000acd: GUJARATI SIGN VIRAMA*/
- 0, /* U+000ace: */
- 0, /* U+000acf: */
- RTUNI_ALPHA, /* U+000ad0: GUJARATI OM*/
- 0, /* U+000ad1: */
- 0, /* U+000ad2: */
- 0, /* U+000ad3: */
- 0, /* U+000ad4: */
- 0, /* U+000ad5: */
- 0, /* U+000ad6: */
- 0, /* U+000ad7: */
- 0, /* U+000ad8: */
- 0, /* U+000ad9: */
- 0, /* U+000ada: */
- 0, /* U+000adb: */
- 0, /* U+000adc: */
- 0, /* U+000add: */
- 0, /* U+000ade: */
- 0, /* U+000adf: */
- RTUNI_ALPHA, /* U+000ae0: GUJARATI LETTER VOCALIC RR*/
- RTUNI_ALPHA, /* U+000ae1: GUJARATI LETTER VOCALIC LL*/
- RTUNI_ALPHA, /* U+000ae2: GUJARATI VOWEL SIGN VOCALIC L*/
- RTUNI_ALPHA, /* U+000ae3: GUJARATI VOWEL SIGN VOCALIC LL*/
- 0, /* U+000ae4: */
- 0, /* U+000ae5: */
- RTUNI_DDIGIT, /* U+000ae6: GUJARATI DIGIT ZERO*/
- RTUNI_DDIGIT, /* U+000ae7: GUJARATI DIGIT ONE*/
- RTUNI_DDIGIT, /* U+000ae8: GUJARATI DIGIT TWO*/
- RTUNI_DDIGIT, /* U+000ae9: GUJARATI DIGIT THREE*/
- RTUNI_DDIGIT, /* U+000aea: GUJARATI DIGIT FOUR*/
- RTUNI_DDIGIT, /* U+000aeb: GUJARATI DIGIT FIVE*/
- RTUNI_DDIGIT, /* U+000aec: GUJARATI DIGIT SIX*/
- RTUNI_DDIGIT, /* U+000aed: GUJARATI DIGIT SEVEN*/
- RTUNI_DDIGIT, /* U+000aee: GUJARATI DIGIT EIGHT*/
- RTUNI_DDIGIT, /* U+000aef: GUJARATI DIGIT NINE*/
- 0, /* U+000af0: */
- 0, /* U+000af1: GUJARATI RUPEE SIGN*/
- 0, /* U+000af2: */
- 0, /* U+000af3: */
- 0, /* U+000af4: */
- 0, /* U+000af5: */
- 0, /* U+000af6: */
- 0, /* U+000af7: */
- 0, /* U+000af8: */
- 0, /* U+000af9: */
- 0, /* U+000afa: */
- 0, /* U+000afb: */
- 0, /* U+000afc: */
- 0, /* U+000afd: */
- 0, /* U+000afe: */
- 0, /* U+000aff: */
- 0, /* U+000b00: */
- RTUNI_ALPHA, /* U+000b01: ORIYA SIGN CANDRABINDU*/
- RTUNI_ALPHA, /* U+000b02: ORIYA SIGN ANUSVARA*/
- RTUNI_ALPHA, /* U+000b03: ORIYA SIGN VISARGA*/
- 0, /* U+000b04: */
- RTUNI_ALPHA, /* U+000b05: ORIYA LETTER A*/
- RTUNI_ALPHA, /* U+000b06: ORIYA LETTER AA*/
- RTUNI_ALPHA, /* U+000b07: ORIYA LETTER I*/
- RTUNI_ALPHA, /* U+000b08: ORIYA LETTER II*/
- RTUNI_ALPHA, /* U+000b09: ORIYA LETTER U*/
- RTUNI_ALPHA, /* U+000b0a: ORIYA LETTER UU*/
- RTUNI_ALPHA, /* U+000b0b: ORIYA LETTER VOCALIC R*/
- RTUNI_ALPHA, /* U+000b0c: ORIYA LETTER VOCALIC L*/
- 0, /* U+000b0d: */
- 0, /* U+000b0e: */
- RTUNI_ALPHA, /* U+000b0f: ORIYA LETTER E*/
- RTUNI_ALPHA, /* U+000b10: ORIYA LETTER AI*/
- 0, /* U+000b11: */
- 0, /* U+000b12: */
- RTUNI_ALPHA, /* U+000b13: ORIYA LETTER O*/
- RTUNI_ALPHA, /* U+000b14: ORIYA LETTER AU*/
- RTUNI_ALPHA, /* U+000b15: ORIYA LETTER KA*/
- RTUNI_ALPHA, /* U+000b16: ORIYA LETTER KHA*/
- RTUNI_ALPHA, /* U+000b17: ORIYA LETTER GA*/
- RTUNI_ALPHA, /* U+000b18: ORIYA LETTER GHA*/
- RTUNI_ALPHA, /* U+000b19: ORIYA LETTER NGA*/
- RTUNI_ALPHA, /* U+000b1a: ORIYA LETTER CA*/
- RTUNI_ALPHA, /* U+000b1b: ORIYA LETTER CHA*/
- RTUNI_ALPHA, /* U+000b1c: ORIYA LETTER JA*/
- RTUNI_ALPHA, /* U+000b1d: ORIYA LETTER JHA*/
- RTUNI_ALPHA, /* U+000b1e: ORIYA LETTER NYA*/
- RTUNI_ALPHA, /* U+000b1f: ORIYA LETTER TTA*/
- RTUNI_ALPHA, /* U+000b20: ORIYA LETTER TTHA*/
- RTUNI_ALPHA, /* U+000b21: ORIYA LETTER DDA*/
- RTUNI_ALPHA, /* U+000b22: ORIYA LETTER DDHA*/
- RTUNI_ALPHA, /* U+000b23: ORIYA LETTER NNA*/
- RTUNI_ALPHA, /* U+000b24: ORIYA LETTER TA*/
- RTUNI_ALPHA, /* U+000b25: ORIYA LETTER THA*/
- RTUNI_ALPHA, /* U+000b26: ORIYA LETTER DA*/
- RTUNI_ALPHA, /* U+000b27: ORIYA LETTER DHA*/
- RTUNI_ALPHA, /* U+000b28: ORIYA LETTER NA*/
- 0, /* U+000b29: */
- RTUNI_ALPHA, /* U+000b2a: ORIYA LETTER PA*/
- RTUNI_ALPHA, /* U+000b2b: ORIYA LETTER PHA*/
- RTUNI_ALPHA, /* U+000b2c: ORIYA LETTER BA*/
- RTUNI_ALPHA, /* U+000b2d: ORIYA LETTER BHA*/
- RTUNI_ALPHA, /* U+000b2e: ORIYA LETTER MA*/
- RTUNI_ALPHA, /* U+000b2f: ORIYA LETTER YA*/
- RTUNI_ALPHA, /* U+000b30: ORIYA LETTER RA*/
- 0, /* U+000b31: */
- RTUNI_ALPHA, /* U+000b32: ORIYA LETTER LA*/
- RTUNI_ALPHA, /* U+000b33: ORIYA LETTER LLA*/
- 0, /* U+000b34: */
- RTUNI_ALPHA, /* U+000b35: ORIYA LETTER VA*/
- RTUNI_ALPHA, /* U+000b36: ORIYA LETTER SHA*/
- RTUNI_ALPHA, /* U+000b37: ORIYA LETTER SSA*/
- RTUNI_ALPHA, /* U+000b38: ORIYA LETTER SA*/
- RTUNI_ALPHA, /* U+000b39: ORIYA LETTER HA*/
- 0, /* U+000b3a: */
- 0, /* U+000b3b: */
- 0, /* U+000b3c: ORIYA SIGN NUKTA*/
- RTUNI_ALPHA, /* U+000b3d: ORIYA SIGN AVAGRAHA*/
- RTUNI_ALPHA, /* U+000b3e: ORIYA VOWEL SIGN AA*/
- RTUNI_ALPHA, /* U+000b3f: ORIYA VOWEL SIGN I*/
- RTUNI_ALPHA, /* U+000b40: ORIYA VOWEL SIGN II*/
- RTUNI_ALPHA, /* U+000b41: ORIYA VOWEL SIGN U*/
- RTUNI_ALPHA, /* U+000b42: ORIYA VOWEL SIGN UU*/
- RTUNI_ALPHA, /* U+000b43: ORIYA VOWEL SIGN VOCALIC R*/
- 0, /* U+000b44: */
- 0, /* U+000b45: */
- 0, /* U+000b46: */
- RTUNI_ALPHA, /* U+000b47: ORIYA VOWEL SIGN E*/
- RTUNI_ALPHA, /* U+000b48: ORIYA VOWEL SIGN AI*/
- 0, /* U+000b49: */
- 0, /* U+000b4a: */
- RTUNI_ALPHA, /* U+000b4b: ORIYA VOWEL SIGN O*/
- RTUNI_ALPHA, /* U+000b4c: ORIYA VOWEL SIGN AU*/
- 0, /* U+000b4d: ORIYA SIGN VIRAMA*/
- 0, /* U+000b4e: */
- 0, /* U+000b4f: */
- 0, /* U+000b50: */
- 0, /* U+000b51: */
- 0, /* U+000b52: */
- 0, /* U+000b53: */
- 0, /* U+000b54: */
- 0, /* U+000b55: */
- RTUNI_ALPHA, /* U+000b56: ORIYA AI LENGTH MARK*/
- RTUNI_ALPHA, /* U+000b57: ORIYA AU LENGTH MARK*/
- 0, /* U+000b58: */
- 0, /* U+000b59: */
- 0, /* U+000b5a: */
- 0, /* U+000b5b: */
- RTUNI_ALPHA, /* U+000b5c: ORIYA LETTER RRA*/
- RTUNI_ALPHA, /* U+000b5d: ORIYA LETTER RHA*/
- 0, /* U+000b5e: */
- RTUNI_ALPHA, /* U+000b5f: ORIYA LETTER YYA*/
- RTUNI_ALPHA, /* U+000b60: ORIYA LETTER VOCALIC RR*/
- RTUNI_ALPHA, /* U+000b61: ORIYA LETTER VOCALIC LL*/
- 0, /* U+000b62: */
- 0, /* U+000b63: */
- 0, /* U+000b64: */
- 0, /* U+000b65: */
- RTUNI_DDIGIT, /* U+000b66: ORIYA DIGIT ZERO*/
- RTUNI_DDIGIT, /* U+000b67: ORIYA DIGIT ONE*/
- RTUNI_DDIGIT, /* U+000b68: ORIYA DIGIT TWO*/
- RTUNI_DDIGIT, /* U+000b69: ORIYA DIGIT THREE*/
- RTUNI_DDIGIT, /* U+000b6a: ORIYA DIGIT FOUR*/
- RTUNI_DDIGIT, /* U+000b6b: ORIYA DIGIT FIVE*/
- RTUNI_DDIGIT, /* U+000b6c: ORIYA DIGIT SIX*/
- RTUNI_DDIGIT, /* U+000b6d: ORIYA DIGIT SEVEN*/
- RTUNI_DDIGIT, /* U+000b6e: ORIYA DIGIT EIGHT*/
- RTUNI_DDIGIT, /* U+000b6f: ORIYA DIGIT NINE*/
- 0, /* U+000b70: ORIYA ISSHAR*/
- RTUNI_ALPHA, /* U+000b71: ORIYA LETTER WA*/
- 0, /* U+000b72: */
- 0, /* U+000b73: */
- 0, /* U+000b74: */
- 0, /* U+000b75: */
- 0, /* U+000b76: */
- 0, /* U+000b77: */
- 0, /* U+000b78: */
- 0, /* U+000b79: */
- 0, /* U+000b7a: */
- 0, /* U+000b7b: */
- 0, /* U+000b7c: */
- 0, /* U+000b7d: */
- 0, /* U+000b7e: */
- 0, /* U+000b7f: */
- 0, /* U+000b80: */
- 0, /* U+000b81: */
- RTUNI_ALPHA, /* U+000b82: TAMIL SIGN ANUSVARA*/
- RTUNI_ALPHA, /* U+000b83: TAMIL SIGN VISARGA*/
- 0, /* U+000b84: */
- RTUNI_ALPHA, /* U+000b85: TAMIL LETTER A*/
- RTUNI_ALPHA, /* U+000b86: TAMIL LETTER AA*/
- RTUNI_ALPHA, /* U+000b87: TAMIL LETTER I*/
- RTUNI_ALPHA, /* U+000b88: TAMIL LETTER II*/
- RTUNI_ALPHA, /* U+000b89: TAMIL LETTER U*/
- RTUNI_ALPHA, /* U+000b8a: TAMIL LETTER UU*/
- 0, /* U+000b8b: */
- 0, /* U+000b8c: */
- 0, /* U+000b8d: */
- RTUNI_ALPHA, /* U+000b8e: TAMIL LETTER E*/
- RTUNI_ALPHA, /* U+000b8f: TAMIL LETTER EE*/
- RTUNI_ALPHA, /* U+000b90: TAMIL LETTER AI*/
- 0, /* U+000b91: */
- RTUNI_ALPHA, /* U+000b92: TAMIL LETTER O*/
- RTUNI_ALPHA, /* U+000b93: TAMIL LETTER OO*/
- RTUNI_ALPHA, /* U+000b94: TAMIL LETTER AU*/
- RTUNI_ALPHA, /* U+000b95: TAMIL LETTER KA*/
- 0, /* U+000b96: */
- 0, /* U+000b97: */
- 0, /* U+000b98: */
- RTUNI_ALPHA, /* U+000b99: TAMIL LETTER NGA*/
- RTUNI_ALPHA, /* U+000b9a: TAMIL LETTER CA*/
- 0, /* U+000b9b: */
- RTUNI_ALPHA, /* U+000b9c: TAMIL LETTER JA*/
- 0, /* U+000b9d: */
- RTUNI_ALPHA, /* U+000b9e: TAMIL LETTER NYA*/
- RTUNI_ALPHA, /* U+000b9f: TAMIL LETTER TTA*/
- 0, /* U+000ba0: */
- 0, /* U+000ba1: */
- 0, /* U+000ba2: */
- RTUNI_ALPHA, /* U+000ba3: TAMIL LETTER NNA*/
- RTUNI_ALPHA, /* U+000ba4: TAMIL LETTER TA*/
- 0, /* U+000ba5: */
- 0, /* U+000ba6: */
- 0, /* U+000ba7: */
- RTUNI_ALPHA, /* U+000ba8: TAMIL LETTER NA*/
- RTUNI_ALPHA, /* U+000ba9: TAMIL LETTER NNNA*/
- RTUNI_ALPHA, /* U+000baa: TAMIL LETTER PA*/
- 0, /* U+000bab: */
- 0, /* U+000bac: */
- 0, /* U+000bad: */
- RTUNI_ALPHA, /* U+000bae: TAMIL LETTER MA*/
- RTUNI_ALPHA, /* U+000baf: TAMIL LETTER YA*/
- RTUNI_ALPHA, /* U+000bb0: TAMIL LETTER RA*/
- RTUNI_ALPHA, /* U+000bb1: TAMIL LETTER RRA*/
- RTUNI_ALPHA, /* U+000bb2: TAMIL LETTER LA*/
- RTUNI_ALPHA, /* U+000bb3: TAMIL LETTER LLA*/
- RTUNI_ALPHA, /* U+000bb4: TAMIL LETTER LLLA*/
- RTUNI_ALPHA, /* U+000bb5: TAMIL LETTER VA*/
- RTUNI_ALPHA, /* U+000bb6: TAMIL LETTER SHA*/
- RTUNI_ALPHA, /* U+000bb7: TAMIL LETTER SSA*/
- RTUNI_ALPHA, /* U+000bb8: TAMIL LETTER SA*/
- RTUNI_ALPHA, /* U+000bb9: TAMIL LETTER HA*/
- 0, /* U+000bba: */
- 0, /* U+000bbb: */
- 0, /* U+000bbc: */
- 0, /* U+000bbd: */
- RTUNI_ALPHA, /* U+000bbe: TAMIL VOWEL SIGN AA*/
- RTUNI_ALPHA, /* U+000bbf: TAMIL VOWEL SIGN I*/
- RTUNI_ALPHA, /* U+000bc0: TAMIL VOWEL SIGN II*/
- RTUNI_ALPHA, /* U+000bc1: TAMIL VOWEL SIGN U*/
- RTUNI_ALPHA, /* U+000bc2: TAMIL VOWEL SIGN UU*/
- 0, /* U+000bc3: */
- 0, /* U+000bc4: */
- 0, /* U+000bc5: */
- RTUNI_ALPHA, /* U+000bc6: TAMIL VOWEL SIGN E*/
- RTUNI_ALPHA, /* U+000bc7: TAMIL VOWEL SIGN EE*/
- RTUNI_ALPHA, /* U+000bc8: TAMIL VOWEL SIGN AI*/
- 0, /* U+000bc9: */
- RTUNI_ALPHA, /* U+000bca: TAMIL VOWEL SIGN O*/
- RTUNI_ALPHA, /* U+000bcb: TAMIL VOWEL SIGN OO*/
- RTUNI_ALPHA, /* U+000bcc: TAMIL VOWEL SIGN AU*/
- 0, /* U+000bcd: TAMIL SIGN VIRAMA*/
- 0, /* U+000bce: */
- 0, /* U+000bcf: */
- 0, /* U+000bd0: */
- 0, /* U+000bd1: */
- 0, /* U+000bd2: */
- 0, /* U+000bd3: */
- 0, /* U+000bd4: */
- 0, /* U+000bd5: */
- 0, /* U+000bd6: */
- RTUNI_ALPHA, /* U+000bd7: TAMIL AU LENGTH MARK*/
- 0, /* U+000bd8: */
- 0, /* U+000bd9: */
- 0, /* U+000bda: */
- 0, /* U+000bdb: */
- 0, /* U+000bdc: */
- 0, /* U+000bdd: */
- 0, /* U+000bde: */
- 0, /* U+000bdf: */
- 0, /* U+000be0: */
- 0, /* U+000be1: */
- 0, /* U+000be2: */
- 0, /* U+000be3: */
- 0, /* U+000be4: */
- 0, /* U+000be5: */
- RTUNI_DDIGIT, /* U+000be6: TAMIL DIGIT ZERO*/
- RTUNI_DDIGIT, /* U+000be7: TAMIL DIGIT ONE*/
- RTUNI_DDIGIT, /* U+000be8: TAMIL DIGIT TWO*/
- RTUNI_DDIGIT, /* U+000be9: TAMIL DIGIT THREE*/
- RTUNI_DDIGIT, /* U+000bea: TAMIL DIGIT FOUR*/
- RTUNI_DDIGIT, /* U+000beb: TAMIL DIGIT FIVE*/
- RTUNI_DDIGIT, /* U+000bec: TAMIL DIGIT SIX*/
- RTUNI_DDIGIT, /* U+000bed: TAMIL DIGIT SEVEN*/
- RTUNI_DDIGIT, /* U+000bee: TAMIL DIGIT EIGHT*/
- RTUNI_DDIGIT, /* U+000bef: TAMIL DIGIT NINE*/
- 0, /* U+000bf0: TAMIL NUMBER TEN*/
- 0, /* U+000bf1: TAMIL NUMBER ONE HUNDRED*/
- 0, /* U+000bf2: TAMIL NUMBER ONE THOUSAND*/
- 0, /* U+000bf3: TAMIL DAY SIGN*/
- 0, /* U+000bf4: TAMIL MONTH SIGN*/
- 0, /* U+000bf5: TAMIL YEAR SIGN*/
- 0, /* U+000bf6: TAMIL DEBIT SIGN*/
- 0, /* U+000bf7: TAMIL CREDIT SIGN*/
- 0, /* U+000bf8: TAMIL AS ABOVE SIGN*/
- 0, /* U+000bf9: TAMIL RUPEE SIGN*/
- 0, /* U+000bfa: TAMIL NUMBER SIGN*/
- 0, /* U+000bfb: */
- 0, /* U+000bfc: */
- 0, /* U+000bfd: */
- 0, /* U+000bfe: */
- 0, /* U+000bff: */
- 0, /* U+000c00: */
- RTUNI_ALPHA, /* U+000c01: TELUGU SIGN CANDRABINDU*/
- RTUNI_ALPHA, /* U+000c02: TELUGU SIGN ANUSVARA*/
- RTUNI_ALPHA, /* U+000c03: TELUGU SIGN VISARGA*/
- 0, /* U+000c04: */
- RTUNI_ALPHA, /* U+000c05: TELUGU LETTER A*/
- RTUNI_ALPHA, /* U+000c06: TELUGU LETTER AA*/
- RTUNI_ALPHA, /* U+000c07: TELUGU LETTER I*/
- RTUNI_ALPHA, /* U+000c08: TELUGU LETTER II*/
- RTUNI_ALPHA, /* U+000c09: TELUGU LETTER U*/
- RTUNI_ALPHA, /* U+000c0a: TELUGU LETTER UU*/
- RTUNI_ALPHA, /* U+000c0b: TELUGU LETTER VOCALIC R*/
- RTUNI_ALPHA, /* U+000c0c: TELUGU LETTER VOCALIC L*/
- 0, /* U+000c0d: */
- RTUNI_ALPHA, /* U+000c0e: TELUGU LETTER E*/
- RTUNI_ALPHA, /* U+000c0f: TELUGU LETTER EE*/
- RTUNI_ALPHA, /* U+000c10: TELUGU LETTER AI*/
- 0, /* U+000c11: */
- RTUNI_ALPHA, /* U+000c12: TELUGU LETTER O*/
- RTUNI_ALPHA, /* U+000c13: TELUGU LETTER OO*/
- RTUNI_ALPHA, /* U+000c14: TELUGU LETTER AU*/
- RTUNI_ALPHA, /* U+000c15: TELUGU LETTER KA*/
- RTUNI_ALPHA, /* U+000c16: TELUGU LETTER KHA*/
- RTUNI_ALPHA, /* U+000c17: TELUGU LETTER GA*/
- RTUNI_ALPHA, /* U+000c18: TELUGU LETTER GHA*/
- RTUNI_ALPHA, /* U+000c19: TELUGU LETTER NGA*/
- RTUNI_ALPHA, /* U+000c1a: TELUGU LETTER CA*/
- RTUNI_ALPHA, /* U+000c1b: TELUGU LETTER CHA*/
- RTUNI_ALPHA, /* U+000c1c: TELUGU LETTER JA*/
- RTUNI_ALPHA, /* U+000c1d: TELUGU LETTER JHA*/
- RTUNI_ALPHA, /* U+000c1e: TELUGU LETTER NYA*/
- RTUNI_ALPHA, /* U+000c1f: TELUGU LETTER TTA*/
- RTUNI_ALPHA, /* U+000c20: TELUGU LETTER TTHA*/
- RTUNI_ALPHA, /* U+000c21: TELUGU LETTER DDA*/
- RTUNI_ALPHA, /* U+000c22: TELUGU LETTER DDHA*/
- RTUNI_ALPHA, /* U+000c23: TELUGU LETTER NNA*/
- RTUNI_ALPHA, /* U+000c24: TELUGU LETTER TA*/
- RTUNI_ALPHA, /* U+000c25: TELUGU LETTER THA*/
- RTUNI_ALPHA, /* U+000c26: TELUGU LETTER DA*/
- RTUNI_ALPHA, /* U+000c27: TELUGU LETTER DHA*/
- RTUNI_ALPHA, /* U+000c28: TELUGU LETTER NA*/
- 0, /* U+000c29: */
- RTUNI_ALPHA, /* U+000c2a: TELUGU LETTER PA*/
- RTUNI_ALPHA, /* U+000c2b: TELUGU LETTER PHA*/
- RTUNI_ALPHA, /* U+000c2c: TELUGU LETTER BA*/
- RTUNI_ALPHA, /* U+000c2d: TELUGU LETTER BHA*/
- RTUNI_ALPHA, /* U+000c2e: TELUGU LETTER MA*/
- RTUNI_ALPHA, /* U+000c2f: TELUGU LETTER YA*/
- RTUNI_ALPHA, /* U+000c30: TELUGU LETTER RA*/
- RTUNI_ALPHA, /* U+000c31: TELUGU LETTER RRA*/
- RTUNI_ALPHA, /* U+000c32: TELUGU LETTER LA*/
- RTUNI_ALPHA, /* U+000c33: TELUGU LETTER LLA*/
- 0, /* U+000c34: */
- RTUNI_ALPHA, /* U+000c35: TELUGU LETTER VA*/
- RTUNI_ALPHA, /* U+000c36: TELUGU LETTER SHA*/
- RTUNI_ALPHA, /* U+000c37: TELUGU LETTER SSA*/
- RTUNI_ALPHA, /* U+000c38: TELUGU LETTER SA*/
- RTUNI_ALPHA, /* U+000c39: TELUGU LETTER HA*/
- 0, /* U+000c3a: */
- 0, /* U+000c3b: */
- 0, /* U+000c3c: */
- 0, /* U+000c3d: */
- RTUNI_ALPHA, /* U+000c3e: TELUGU VOWEL SIGN AA*/
- RTUNI_ALPHA, /* U+000c3f: TELUGU VOWEL SIGN I*/
- RTUNI_ALPHA, /* U+000c40: TELUGU VOWEL SIGN II*/
- RTUNI_ALPHA, /* U+000c41: TELUGU VOWEL SIGN U*/
- RTUNI_ALPHA, /* U+000c42: TELUGU VOWEL SIGN UU*/
- RTUNI_ALPHA, /* U+000c43: TELUGU VOWEL SIGN VOCALIC R*/
- RTUNI_ALPHA, /* U+000c44: TELUGU VOWEL SIGN VOCALIC RR*/
- 0, /* U+000c45: */
- RTUNI_ALPHA, /* U+000c46: TELUGU VOWEL SIGN E*/
- RTUNI_ALPHA, /* U+000c47: TELUGU VOWEL SIGN EE*/
- RTUNI_ALPHA, /* U+000c48: TELUGU VOWEL SIGN AI*/
- 0, /* U+000c49: */
- RTUNI_ALPHA, /* U+000c4a: TELUGU VOWEL SIGN O*/
- RTUNI_ALPHA, /* U+000c4b: TELUGU VOWEL SIGN OO*/
- RTUNI_ALPHA, /* U+000c4c: TELUGU VOWEL SIGN AU*/
- 0, /* U+000c4d: TELUGU SIGN VIRAMA*/
- 0, /* U+000c4e: */
- 0, /* U+000c4f: */
- 0, /* U+000c50: */
- 0, /* U+000c51: */
- 0, /* U+000c52: */
- 0, /* U+000c53: */
- 0, /* U+000c54: */
- RTUNI_ALPHA, /* U+000c55: TELUGU LENGTH MARK*/
- RTUNI_ALPHA, /* U+000c56: TELUGU AI LENGTH MARK*/
- 0, /* U+000c57: */
- 0, /* U+000c58: */
- 0, /* U+000c59: */
- 0, /* U+000c5a: */
- 0, /* U+000c5b: */
- 0, /* U+000c5c: */
- 0, /* U+000c5d: */
- 0, /* U+000c5e: */
- 0, /* U+000c5f: */
- RTUNI_ALPHA, /* U+000c60: TELUGU LETTER VOCALIC RR*/
- RTUNI_ALPHA, /* U+000c61: TELUGU LETTER VOCALIC LL*/
- 0, /* U+000c62: */
- 0, /* U+000c63: */
- 0, /* U+000c64: */
- 0, /* U+000c65: */
- RTUNI_DDIGIT, /* U+000c66: TELUGU DIGIT ZERO*/
- RTUNI_DDIGIT, /* U+000c67: TELUGU DIGIT ONE*/
- RTUNI_DDIGIT, /* U+000c68: TELUGU DIGIT TWO*/
- RTUNI_DDIGIT, /* U+000c69: TELUGU DIGIT THREE*/
- RTUNI_DDIGIT, /* U+000c6a: TELUGU DIGIT FOUR*/
- RTUNI_DDIGIT, /* U+000c6b: TELUGU DIGIT FIVE*/
- RTUNI_DDIGIT, /* U+000c6c: TELUGU DIGIT SIX*/
- RTUNI_DDIGIT, /* U+000c6d: TELUGU DIGIT SEVEN*/
- RTUNI_DDIGIT, /* U+000c6e: TELUGU DIGIT EIGHT*/
- RTUNI_DDIGIT, /* U+000c6f: TELUGU DIGIT NINE*/
- 0, /* U+000c70: */
- 0, /* U+000c71: */
- 0, /* U+000c72: */
- 0, /* U+000c73: */
- 0, /* U+000c74: */
- 0, /* U+000c75: */
- 0, /* U+000c76: */
- 0, /* U+000c77: */
- 0, /* U+000c78: */
- 0, /* U+000c79: */
- 0, /* U+000c7a: */
- 0, /* U+000c7b: */
- 0, /* U+000c7c: */
- 0, /* U+000c7d: */
- 0, /* U+000c7e: */
- 0, /* U+000c7f: */
- 0, /* U+000c80: */
- 0, /* U+000c81: */
- RTUNI_ALPHA, /* U+000c82: KANNADA SIGN ANUSVARA*/
- RTUNI_ALPHA, /* U+000c83: KANNADA SIGN VISARGA*/
- 0, /* U+000c84: */
- RTUNI_ALPHA, /* U+000c85: KANNADA LETTER A*/
- RTUNI_ALPHA, /* U+000c86: KANNADA LETTER AA*/
- RTUNI_ALPHA, /* U+000c87: KANNADA LETTER I*/
- RTUNI_ALPHA, /* U+000c88: KANNADA LETTER II*/
- RTUNI_ALPHA, /* U+000c89: KANNADA LETTER U*/
- RTUNI_ALPHA, /* U+000c8a: KANNADA LETTER UU*/
- RTUNI_ALPHA, /* U+000c8b: KANNADA LETTER VOCALIC R*/
- RTUNI_ALPHA, /* U+000c8c: KANNADA LETTER VOCALIC L*/
- 0, /* U+000c8d: */
- RTUNI_ALPHA, /* U+000c8e: KANNADA LETTER E*/
- RTUNI_ALPHA, /* U+000c8f: KANNADA LETTER EE*/
- RTUNI_ALPHA, /* U+000c90: KANNADA LETTER AI*/
- 0, /* U+000c91: */
- RTUNI_ALPHA, /* U+000c92: KANNADA LETTER O*/
- RTUNI_ALPHA, /* U+000c93: KANNADA LETTER OO*/
- RTUNI_ALPHA, /* U+000c94: KANNADA LETTER AU*/
- RTUNI_ALPHA, /* U+000c95: KANNADA LETTER KA*/
- RTUNI_ALPHA, /* U+000c96: KANNADA LETTER KHA*/
- RTUNI_ALPHA, /* U+000c97: KANNADA LETTER GA*/
- RTUNI_ALPHA, /* U+000c98: KANNADA LETTER GHA*/
- RTUNI_ALPHA, /* U+000c99: KANNADA LETTER NGA*/
- RTUNI_ALPHA, /* U+000c9a: KANNADA LETTER CA*/
- RTUNI_ALPHA, /* U+000c9b: KANNADA LETTER CHA*/
- RTUNI_ALPHA, /* U+000c9c: KANNADA LETTER JA*/
- RTUNI_ALPHA, /* U+000c9d: KANNADA LETTER JHA*/
- RTUNI_ALPHA, /* U+000c9e: KANNADA LETTER NYA*/
- RTUNI_ALPHA, /* U+000c9f: KANNADA LETTER TTA*/
- RTUNI_ALPHA, /* U+000ca0: KANNADA LETTER TTHA*/
- RTUNI_ALPHA, /* U+000ca1: KANNADA LETTER DDA*/
- RTUNI_ALPHA, /* U+000ca2: KANNADA LETTER DDHA*/
- RTUNI_ALPHA, /* U+000ca3: KANNADA LETTER NNA*/
- RTUNI_ALPHA, /* U+000ca4: KANNADA LETTER TA*/
- RTUNI_ALPHA, /* U+000ca5: KANNADA LETTER THA*/
- RTUNI_ALPHA, /* U+000ca6: KANNADA LETTER DA*/
- RTUNI_ALPHA, /* U+000ca7: KANNADA LETTER DHA*/
- RTUNI_ALPHA, /* U+000ca8: KANNADA LETTER NA*/
- 0, /* U+000ca9: */
- RTUNI_ALPHA, /* U+000caa: KANNADA LETTER PA*/
- RTUNI_ALPHA, /* U+000cab: KANNADA LETTER PHA*/
- RTUNI_ALPHA, /* U+000cac: KANNADA LETTER BA*/
- RTUNI_ALPHA, /* U+000cad: KANNADA LETTER BHA*/
- RTUNI_ALPHA, /* U+000cae: KANNADA LETTER MA*/
- RTUNI_ALPHA, /* U+000caf: KANNADA LETTER YA*/
- RTUNI_ALPHA, /* U+000cb0: KANNADA LETTER RA*/
- RTUNI_ALPHA, /* U+000cb1: KANNADA LETTER RRA*/
- RTUNI_ALPHA, /* U+000cb2: KANNADA LETTER LA*/
- RTUNI_ALPHA, /* U+000cb3: KANNADA LETTER LLA*/
- 0, /* U+000cb4: */
- RTUNI_ALPHA, /* U+000cb5: KANNADA LETTER VA*/
- RTUNI_ALPHA, /* U+000cb6: KANNADA LETTER SHA*/
- RTUNI_ALPHA, /* U+000cb7: KANNADA LETTER SSA*/
- RTUNI_ALPHA, /* U+000cb8: KANNADA LETTER SA*/
- RTUNI_ALPHA, /* U+000cb9: KANNADA LETTER HA*/
- 0, /* U+000cba: */
- 0, /* U+000cbb: */
- 0, /* U+000cbc: KANNADA SIGN NUKTA*/
- RTUNI_ALPHA, /* U+000cbd: KANNADA SIGN AVAGRAHA*/
- RTUNI_ALPHA, /* U+000cbe: KANNADA VOWEL SIGN AA*/
- RTUNI_ALPHA, /* U+000cbf: KANNADA VOWEL SIGN I*/
- RTUNI_ALPHA, /* U+000cc0: KANNADA VOWEL SIGN II*/
- RTUNI_ALPHA, /* U+000cc1: KANNADA VOWEL SIGN U*/
- RTUNI_ALPHA, /* U+000cc2: KANNADA VOWEL SIGN UU*/
- RTUNI_ALPHA, /* U+000cc3: KANNADA VOWEL SIGN VOCALIC R*/
- RTUNI_ALPHA, /* U+000cc4: KANNADA VOWEL SIGN VOCALIC RR*/
- 0, /* U+000cc5: */
- RTUNI_ALPHA, /* U+000cc6: KANNADA VOWEL SIGN E*/
- RTUNI_ALPHA, /* U+000cc7: KANNADA VOWEL SIGN EE*/
- RTUNI_ALPHA, /* U+000cc8: KANNADA VOWEL SIGN AI*/
- 0, /* U+000cc9: */
- RTUNI_ALPHA, /* U+000cca: KANNADA VOWEL SIGN O*/
- RTUNI_ALPHA, /* U+000ccb: KANNADA VOWEL SIGN OO*/
- RTUNI_ALPHA, /* U+000ccc: KANNADA VOWEL SIGN AU*/
- 0, /* U+000ccd: KANNADA SIGN VIRAMA*/
- 0, /* U+000cce: */
- 0, /* U+000ccf: */
- 0, /* U+000cd0: */
- 0, /* U+000cd1: */
- 0, /* U+000cd2: */
- 0, /* U+000cd3: */
- 0, /* U+000cd4: */
- RTUNI_ALPHA, /* U+000cd5: KANNADA LENGTH MARK*/
- RTUNI_ALPHA, /* U+000cd6: KANNADA AI LENGTH MARK*/
- 0, /* U+000cd7: */
- 0, /* U+000cd8: */
- 0, /* U+000cd9: */
- 0, /* U+000cda: */
- 0, /* U+000cdb: */
- 0, /* U+000cdc: */
- 0, /* U+000cdd: */
- RTUNI_ALPHA, /* U+000cde: KANNADA LETTER FA*/
- 0, /* U+000cdf: */
- RTUNI_ALPHA, /* U+000ce0: KANNADA LETTER VOCALIC RR*/
- RTUNI_ALPHA, /* U+000ce1: KANNADA LETTER VOCALIC LL*/
- 0, /* U+000ce2: */
- 0, /* U+000ce3: */
- 0, /* U+000ce4: */
- 0, /* U+000ce5: */
- RTUNI_DDIGIT, /* U+000ce6: KANNADA DIGIT ZERO*/
- RTUNI_DDIGIT, /* U+000ce7: KANNADA DIGIT ONE*/
- RTUNI_DDIGIT, /* U+000ce8: KANNADA DIGIT TWO*/
- RTUNI_DDIGIT, /* U+000ce9: KANNADA DIGIT THREE*/
- RTUNI_DDIGIT, /* U+000cea: KANNADA DIGIT FOUR*/
- RTUNI_DDIGIT, /* U+000ceb: KANNADA DIGIT FIVE*/
- RTUNI_DDIGIT, /* U+000cec: KANNADA DIGIT SIX*/
- RTUNI_DDIGIT, /* U+000ced: KANNADA DIGIT SEVEN*/
- RTUNI_DDIGIT, /* U+000cee: KANNADA DIGIT EIGHT*/
- RTUNI_DDIGIT, /* U+000cef: KANNADA DIGIT NINE*/
- 0, /* U+000cf0: */
- 0, /* U+000cf1: */
- 0, /* U+000cf2: */
- 0, /* U+000cf3: */
- 0, /* U+000cf4: */
- 0, /* U+000cf5: */
- 0, /* U+000cf6: */
- 0, /* U+000cf7: */
- 0, /* U+000cf8: */
- 0, /* U+000cf9: */
- 0, /* U+000cfa: */
- 0, /* U+000cfb: */
- 0, /* U+000cfc: */
- 0, /* U+000cfd: */
- 0, /* U+000cfe: */
- 0, /* U+000cff: */
- 0, /* U+000d00: */
- 0, /* U+000d01: */
- RTUNI_ALPHA, /* U+000d02: MALAYALAM SIGN ANUSVARA*/
- RTUNI_ALPHA, /* U+000d03: MALAYALAM SIGN VISARGA*/
- 0, /* U+000d04: */
- RTUNI_ALPHA, /* U+000d05: MALAYALAM LETTER A*/
- RTUNI_ALPHA, /* U+000d06: MALAYALAM LETTER AA*/
- RTUNI_ALPHA, /* U+000d07: MALAYALAM LETTER I*/
- RTUNI_ALPHA, /* U+000d08: MALAYALAM LETTER II*/
- RTUNI_ALPHA, /* U+000d09: MALAYALAM LETTER U*/
- RTUNI_ALPHA, /* U+000d0a: MALAYALAM LETTER UU*/
- RTUNI_ALPHA, /* U+000d0b: MALAYALAM LETTER VOCALIC R*/
- RTUNI_ALPHA, /* U+000d0c: MALAYALAM LETTER VOCALIC L*/
- 0, /* U+000d0d: */
- RTUNI_ALPHA, /* U+000d0e: MALAYALAM LETTER E*/
- RTUNI_ALPHA, /* U+000d0f: MALAYALAM LETTER EE*/
- RTUNI_ALPHA, /* U+000d10: MALAYALAM LETTER AI*/
- 0, /* U+000d11: */
- RTUNI_ALPHA, /* U+000d12: MALAYALAM LETTER O*/
- RTUNI_ALPHA, /* U+000d13: MALAYALAM LETTER OO*/
- RTUNI_ALPHA, /* U+000d14: MALAYALAM LETTER AU*/
- RTUNI_ALPHA, /* U+000d15: MALAYALAM LETTER KA*/
- RTUNI_ALPHA, /* U+000d16: MALAYALAM LETTER KHA*/
- RTUNI_ALPHA, /* U+000d17: MALAYALAM LETTER GA*/
- RTUNI_ALPHA, /* U+000d18: MALAYALAM LETTER GHA*/
- RTUNI_ALPHA, /* U+000d19: MALAYALAM LETTER NGA*/
- RTUNI_ALPHA, /* U+000d1a: MALAYALAM LETTER CA*/
- RTUNI_ALPHA, /* U+000d1b: MALAYALAM LETTER CHA*/
- RTUNI_ALPHA, /* U+000d1c: MALAYALAM LETTER JA*/
- RTUNI_ALPHA, /* U+000d1d: MALAYALAM LETTER JHA*/
- RTUNI_ALPHA, /* U+000d1e: MALAYALAM LETTER NYA*/
- RTUNI_ALPHA, /* U+000d1f: MALAYALAM LETTER TTA*/
- RTUNI_ALPHA, /* U+000d20: MALAYALAM LETTER TTHA*/
- RTUNI_ALPHA, /* U+000d21: MALAYALAM LETTER DDA*/
- RTUNI_ALPHA, /* U+000d22: MALAYALAM LETTER DDHA*/
- RTUNI_ALPHA, /* U+000d23: MALAYALAM LETTER NNA*/
- RTUNI_ALPHA, /* U+000d24: MALAYALAM LETTER TA*/
- RTUNI_ALPHA, /* U+000d25: MALAYALAM LETTER THA*/
- RTUNI_ALPHA, /* U+000d26: MALAYALAM LETTER DA*/
- RTUNI_ALPHA, /* U+000d27: MALAYALAM LETTER DHA*/
- RTUNI_ALPHA, /* U+000d28: MALAYALAM LETTER NA*/
- 0, /* U+000d29: */
- RTUNI_ALPHA, /* U+000d2a: MALAYALAM LETTER PA*/
- RTUNI_ALPHA, /* U+000d2b: MALAYALAM LETTER PHA*/
- RTUNI_ALPHA, /* U+000d2c: MALAYALAM LETTER BA*/
- RTUNI_ALPHA, /* U+000d2d: MALAYALAM LETTER BHA*/
- RTUNI_ALPHA, /* U+000d2e: MALAYALAM LETTER MA*/
- RTUNI_ALPHA, /* U+000d2f: MALAYALAM LETTER YA*/
- RTUNI_ALPHA, /* U+000d30: MALAYALAM LETTER RA*/
- RTUNI_ALPHA, /* U+000d31: MALAYALAM LETTER RRA*/
- RTUNI_ALPHA, /* U+000d32: MALAYALAM LETTER LA*/
- RTUNI_ALPHA, /* U+000d33: MALAYALAM LETTER LLA*/
- RTUNI_ALPHA, /* U+000d34: MALAYALAM LETTER LLLA*/
- RTUNI_ALPHA, /* U+000d35: MALAYALAM LETTER VA*/
- RTUNI_ALPHA, /* U+000d36: MALAYALAM LETTER SHA*/
- RTUNI_ALPHA, /* U+000d37: MALAYALAM LETTER SSA*/
- RTUNI_ALPHA, /* U+000d38: MALAYALAM LETTER SA*/
- RTUNI_ALPHA, /* U+000d39: MALAYALAM LETTER HA*/
- 0, /* U+000d3a: */
- 0, /* U+000d3b: */
- 0, /* U+000d3c: */
- 0, /* U+000d3d: */
- RTUNI_ALPHA, /* U+000d3e: MALAYALAM VOWEL SIGN AA*/
- RTUNI_ALPHA, /* U+000d3f: MALAYALAM VOWEL SIGN I*/
- RTUNI_ALPHA, /* U+000d40: MALAYALAM VOWEL SIGN II*/
- RTUNI_ALPHA, /* U+000d41: MALAYALAM VOWEL SIGN U*/
- RTUNI_ALPHA, /* U+000d42: MALAYALAM VOWEL SIGN UU*/
- RTUNI_ALPHA, /* U+000d43: MALAYALAM VOWEL SIGN VOCALIC R*/
- 0, /* U+000d44: */
- 0, /* U+000d45: */
- RTUNI_ALPHA, /* U+000d46: MALAYALAM VOWEL SIGN E*/
- RTUNI_ALPHA, /* U+000d47: MALAYALAM VOWEL SIGN EE*/
- RTUNI_ALPHA, /* U+000d48: MALAYALAM VOWEL SIGN AI*/
- 0, /* U+000d49: */
- RTUNI_ALPHA, /* U+000d4a: MALAYALAM VOWEL SIGN O*/
- RTUNI_ALPHA, /* U+000d4b: MALAYALAM VOWEL SIGN OO*/
- RTUNI_ALPHA, /* U+000d4c: MALAYALAM VOWEL SIGN AU*/
- 0, /* U+000d4d: MALAYALAM SIGN VIRAMA*/
- 0, /* U+000d4e: */
- 0, /* U+000d4f: */
- 0, /* U+000d50: */
- 0, /* U+000d51: */
- 0, /* U+000d52: */
- 0, /* U+000d53: */
- 0, /* U+000d54: */
- 0, /* U+000d55: */
- 0, /* U+000d56: */
- RTUNI_ALPHA, /* U+000d57: MALAYALAM AU LENGTH MARK*/
- 0, /* U+000d58: */
- 0, /* U+000d59: */
- 0, /* U+000d5a: */
- 0, /* U+000d5b: */
- 0, /* U+000d5c: */
- 0, /* U+000d5d: */
- 0, /* U+000d5e: */
- 0, /* U+000d5f: */
- RTUNI_ALPHA, /* U+000d60: MALAYALAM LETTER VOCALIC RR*/
- RTUNI_ALPHA, /* U+000d61: MALAYALAM LETTER VOCALIC LL*/
- 0, /* U+000d62: */
- 0, /* U+000d63: */
- 0, /* U+000d64: */
- 0, /* U+000d65: */
- RTUNI_DDIGIT, /* U+000d66: MALAYALAM DIGIT ZERO*/
- RTUNI_DDIGIT, /* U+000d67: MALAYALAM DIGIT ONE*/
- RTUNI_DDIGIT, /* U+000d68: MALAYALAM DIGIT TWO*/
- RTUNI_DDIGIT, /* U+000d69: MALAYALAM DIGIT THREE*/
- RTUNI_DDIGIT, /* U+000d6a: MALAYALAM DIGIT FOUR*/
- RTUNI_DDIGIT, /* U+000d6b: MALAYALAM DIGIT FIVE*/
- RTUNI_DDIGIT, /* U+000d6c: MALAYALAM DIGIT SIX*/
- RTUNI_DDIGIT, /* U+000d6d: MALAYALAM DIGIT SEVEN*/
- RTUNI_DDIGIT, /* U+000d6e: MALAYALAM DIGIT EIGHT*/
- RTUNI_DDIGIT, /* U+000d6f: MALAYALAM DIGIT NINE*/
- 0, /* U+000d70: */
- 0, /* U+000d71: */
- 0, /* U+000d72: */
- 0, /* U+000d73: */
- 0, /* U+000d74: */
- 0, /* U+000d75: */
- 0, /* U+000d76: */
- 0, /* U+000d77: */
- 0, /* U+000d78: */
- 0, /* U+000d79: */
- 0, /* U+000d7a: */
- 0, /* U+000d7b: */
- 0, /* U+000d7c: */
- 0, /* U+000d7d: */
- 0, /* U+000d7e: */
- 0, /* U+000d7f: */
- 0, /* U+000d80: */
- 0, /* U+000d81: */
- RTUNI_ALPHA, /* U+000d82: SINHALA SIGN ANUSVARAYA*/
- RTUNI_ALPHA, /* U+000d83: SINHALA SIGN VISARGAYA*/
- 0, /* U+000d84: */
- RTUNI_ALPHA, /* U+000d85: SINHALA LETTER AYANNA*/
- RTUNI_ALPHA, /* U+000d86: SINHALA LETTER AAYANNA*/
- RTUNI_ALPHA, /* U+000d87: SINHALA LETTER AEYANNA*/
- RTUNI_ALPHA, /* U+000d88: SINHALA LETTER AEEYANNA*/
- RTUNI_ALPHA, /* U+000d89: SINHALA LETTER IYANNA*/
- RTUNI_ALPHA, /* U+000d8a: SINHALA LETTER IIYANNA*/
- RTUNI_ALPHA, /* U+000d8b: SINHALA LETTER UYANNA*/
- RTUNI_ALPHA, /* U+000d8c: SINHALA LETTER UUYANNA*/
- RTUNI_ALPHA, /* U+000d8d: SINHALA LETTER IRUYANNA*/
- RTUNI_ALPHA, /* U+000d8e: SINHALA LETTER IRUUYANNA*/
- RTUNI_ALPHA, /* U+000d8f: SINHALA LETTER ILUYANNA*/
- RTUNI_ALPHA, /* U+000d90: SINHALA LETTER ILUUYANNA*/
- RTUNI_ALPHA, /* U+000d91: SINHALA LETTER EYANNA*/
- RTUNI_ALPHA, /* U+000d92: SINHALA LETTER EEYANNA*/
- RTUNI_ALPHA, /* U+000d93: SINHALA LETTER AIYANNA*/
- RTUNI_ALPHA, /* U+000d94: SINHALA LETTER OYANNA*/
- RTUNI_ALPHA, /* U+000d95: SINHALA LETTER OOYANNA*/
- RTUNI_ALPHA, /* U+000d96: SINHALA LETTER AUYANNA*/
- 0, /* U+000d97: */
- 0, /* U+000d98: */
- 0, /* U+000d99: */
- RTUNI_ALPHA, /* U+000d9a: SINHALA LETTER ALPAPRAANA KAYANNA*/
- RTUNI_ALPHA, /* U+000d9b: SINHALA LETTER MAHAAPRAANA KAYANNA*/
- RTUNI_ALPHA, /* U+000d9c: SINHALA LETTER ALPAPRAANA GAYANNA*/
- RTUNI_ALPHA, /* U+000d9d: SINHALA LETTER MAHAAPRAANA GAYANNA*/
- RTUNI_ALPHA, /* U+000d9e: SINHALA LETTER KANTAJA NAASIKYAYA*/
- RTUNI_ALPHA, /* U+000d9f: SINHALA LETTER SANYAKA GAYANNA*/
- RTUNI_ALPHA, /* U+000da0: SINHALA LETTER ALPAPRAANA CAYANNA*/
- RTUNI_ALPHA, /* U+000da1: SINHALA LETTER MAHAAPRAANA CAYANNA*/
- RTUNI_ALPHA, /* U+000da2: SINHALA LETTER ALPAPRAANA JAYANNA*/
- RTUNI_ALPHA, /* U+000da3: SINHALA LETTER MAHAAPRAANA JAYANNA*/
- RTUNI_ALPHA, /* U+000da4: SINHALA LETTER TAALUJA NAASIKYAYA*/
- RTUNI_ALPHA, /* U+000da5: SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA*/
- RTUNI_ALPHA, /* U+000da6: SINHALA LETTER SANYAKA JAYANNA*/
- RTUNI_ALPHA, /* U+000da7: SINHALA LETTER ALPAPRAANA TTAYANNA*/
- RTUNI_ALPHA, /* U+000da8: SINHALA LETTER MAHAAPRAANA TTAYANNA*/
- RTUNI_ALPHA, /* U+000da9: SINHALA LETTER ALPAPRAANA DDAYANNA*/
- RTUNI_ALPHA, /* U+000daa: SINHALA LETTER MAHAAPRAANA DDAYANNA*/
- RTUNI_ALPHA, /* U+000dab: SINHALA LETTER MUURDHAJA NAYANNA*/
- RTUNI_ALPHA, /* U+000dac: SINHALA LETTER SANYAKA DDAYANNA*/
- RTUNI_ALPHA, /* U+000dad: SINHALA LETTER ALPAPRAANA TAYANNA*/
- RTUNI_ALPHA, /* U+000dae: SINHALA LETTER MAHAAPRAANA TAYANNA*/
- RTUNI_ALPHA, /* U+000daf: SINHALA LETTER ALPAPRAANA DAYANNA*/
- RTUNI_ALPHA, /* U+000db0: SINHALA LETTER MAHAAPRAANA DAYANNA*/
- RTUNI_ALPHA, /* U+000db1: SINHALA LETTER DANTAJA NAYANNA*/
- 0, /* U+000db2: */
- RTUNI_ALPHA, /* U+000db3: SINHALA LETTER SANYAKA DAYANNA*/
- RTUNI_ALPHA, /* U+000db4: SINHALA LETTER ALPAPRAANA PAYANNA*/
- RTUNI_ALPHA, /* U+000db5: SINHALA LETTER MAHAAPRAANA PAYANNA*/
- RTUNI_ALPHA, /* U+000db6: SINHALA LETTER ALPAPRAANA BAYANNA*/
- RTUNI_ALPHA, /* U+000db7: SINHALA LETTER MAHAAPRAANA BAYANNA*/
- RTUNI_ALPHA, /* U+000db8: SINHALA LETTER MAYANNA*/
- RTUNI_ALPHA, /* U+000db9: SINHALA LETTER AMBA BAYANNA*/
- RTUNI_ALPHA, /* U+000dba: SINHALA LETTER YAYANNA*/
- RTUNI_ALPHA, /* U+000dbb: SINHALA LETTER RAYANNA*/
- 0, /* U+000dbc: */
- RTUNI_ALPHA, /* U+000dbd: SINHALA LETTER DANTAJA LAYANNA*/
- 0, /* U+000dbe: */
- 0, /* U+000dbf: */
- RTUNI_ALPHA, /* U+000dc0: SINHALA LETTER VAYANNA*/
- RTUNI_ALPHA, /* U+000dc1: SINHALA LETTER TAALUJA SAYANNA*/
- RTUNI_ALPHA, /* U+000dc2: SINHALA LETTER MUURDHAJA SAYANNA*/
- RTUNI_ALPHA, /* U+000dc3: SINHALA LETTER DANTAJA SAYANNA*/
- RTUNI_ALPHA, /* U+000dc4: SINHALA LETTER HAYANNA*/
- RTUNI_ALPHA, /* U+000dc5: SINHALA LETTER MUURDHAJA LAYANNA*/
- RTUNI_ALPHA, /* U+000dc6: SINHALA LETTER FAYANNA*/
- 0, /* U+000dc7: */
- 0, /* U+000dc8: */
- 0, /* U+000dc9: */
- 0, /* U+000dca: SINHALA SIGN AL-LAKUNA*/
- 0, /* U+000dcb: */
- 0, /* U+000dcc: */
- 0, /* U+000dcd: */
- 0, /* U+000dce: */
- RTUNI_ALPHA, /* U+000dcf: SINHALA VOWEL SIGN AELA-PILLA*/
- RTUNI_ALPHA, /* U+000dd0: SINHALA VOWEL SIGN KETTI AEDA-PILLA*/
- RTUNI_ALPHA, /* U+000dd1: SINHALA VOWEL SIGN DIGA AEDA-PILLA*/
- RTUNI_ALPHA, /* U+000dd2: SINHALA VOWEL SIGN KETTI IS-PILLA*/
- RTUNI_ALPHA, /* U+000dd3: SINHALA VOWEL SIGN DIGA IS-PILLA*/
- RTUNI_ALPHA, /* U+000dd4: SINHALA VOWEL SIGN KETTI PAA-PILLA*/
- 0, /* U+000dd5: */
- RTUNI_ALPHA, /* U+000dd6: SINHALA VOWEL SIGN DIGA PAA-PILLA*/
- 0, /* U+000dd7: */
- RTUNI_ALPHA, /* U+000dd8: SINHALA VOWEL SIGN GAETTA-PILLA*/
- RTUNI_ALPHA, /* U+000dd9: SINHALA VOWEL SIGN KOMBUVA*/
- RTUNI_ALPHA, /* U+000dda: SINHALA VOWEL SIGN DIGA KOMBUVA*/
- RTUNI_ALPHA, /* U+000ddb: SINHALA VOWEL SIGN KOMBU DEKA*/
- RTUNI_ALPHA, /* U+000ddc: SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA*/
- RTUNI_ALPHA, /* U+000ddd: SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA*/
- RTUNI_ALPHA, /* U+000dde: SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA*/
- RTUNI_ALPHA, /* U+000ddf: SINHALA VOWEL SIGN GAYANUKITTA*/
- 0, /* U+000de0: */
- 0, /* U+000de1: */
- 0, /* U+000de2: */
- 0, /* U+000de3: */
- 0, /* U+000de4: */
- 0, /* U+000de5: */
- 0, /* U+000de6: */
- 0, /* U+000de7: */
- 0, /* U+000de8: */
- 0, /* U+000de9: */
- 0, /* U+000dea: */
- 0, /* U+000deb: */
- 0, /* U+000dec: */
- 0, /* U+000ded: */
- 0, /* U+000dee: */
- 0, /* U+000def: */
- 0, /* U+000df0: */
- 0, /* U+000df1: */
- RTUNI_ALPHA, /* U+000df2: SINHALA VOWEL SIGN DIGA GAETTA-PILLA*/
- RTUNI_ALPHA, /* U+000df3: SINHALA VOWEL SIGN DIGA GAYANUKITTA*/
- 0, /* U+000df4: SINHALA PUNCTUATION KUNDDALIYA*/
- 0, /* U+000df5: */
- 0, /* U+000df6: */
- 0, /* U+000df7: */
- 0, /* U+000df8: */
- 0, /* U+000df9: */
- 0, /* U+000dfa: */
- 0, /* U+000dfb: */
- 0, /* U+000dfc: */
- 0, /* U+000dfd: */
- 0, /* U+000dfe: */
- 0, /* U+000dff: */
- 0, /* U+000e00: */
- RTUNI_ALPHA, /* U+000e01: THAI CHARACTER KO KAI*/
- RTUNI_ALPHA, /* U+000e02: THAI CHARACTER KHO KHAI*/
- RTUNI_ALPHA, /* U+000e03: THAI CHARACTER KHO KHUAT*/
- RTUNI_ALPHA, /* U+000e04: THAI CHARACTER KHO KHWAI*/
- RTUNI_ALPHA, /* U+000e05: THAI CHARACTER KHO KHON*/
- RTUNI_ALPHA, /* U+000e06: THAI CHARACTER KHO RAKHANG*/
- RTUNI_ALPHA, /* U+000e07: THAI CHARACTER NGO NGU*/
- RTUNI_ALPHA, /* U+000e08: THAI CHARACTER CHO CHAN*/
- RTUNI_ALPHA, /* U+000e09: THAI CHARACTER CHO CHING*/
- RTUNI_ALPHA, /* U+000e0a: THAI CHARACTER CHO CHANG*/
- RTUNI_ALPHA, /* U+000e0b: THAI CHARACTER SO SO*/
- RTUNI_ALPHA, /* U+000e0c: THAI CHARACTER CHO CHOE*/
- RTUNI_ALPHA, /* U+000e0d: THAI CHARACTER YO YING*/
- RTUNI_ALPHA, /* U+000e0e: THAI CHARACTER DO CHADA*/
- RTUNI_ALPHA, /* U+000e0f: THAI CHARACTER TO PATAK*/
- RTUNI_ALPHA, /* U+000e10: THAI CHARACTER THO THAN*/
- RTUNI_ALPHA, /* U+000e11: THAI CHARACTER THO NANGMONTHO*/
- RTUNI_ALPHA, /* U+000e12: THAI CHARACTER THO PHUTHAO*/
- RTUNI_ALPHA, /* U+000e13: THAI CHARACTER NO NEN*/
- RTUNI_ALPHA, /* U+000e14: THAI CHARACTER DO DEK*/
- RTUNI_ALPHA, /* U+000e15: THAI CHARACTER TO TAO*/
- RTUNI_ALPHA, /* U+000e16: THAI CHARACTER THO THUNG*/
- RTUNI_ALPHA, /* U+000e17: THAI CHARACTER THO THAHAN*/
- RTUNI_ALPHA, /* U+000e18: THAI CHARACTER THO THONG*/
- RTUNI_ALPHA, /* U+000e19: THAI CHARACTER NO NU*/
- RTUNI_ALPHA, /* U+000e1a: THAI CHARACTER BO BAIMAI*/
- RTUNI_ALPHA, /* U+000e1b: THAI CHARACTER PO PLA*/
- RTUNI_ALPHA, /* U+000e1c: THAI CHARACTER PHO PHUNG*/
- RTUNI_ALPHA, /* U+000e1d: THAI CHARACTER FO FA*/
- RTUNI_ALPHA, /* U+000e1e: THAI CHARACTER PHO PHAN*/
- RTUNI_ALPHA, /* U+000e1f: THAI CHARACTER FO FAN*/
- RTUNI_ALPHA, /* U+000e20: THAI CHARACTER PHO SAMPHAO*/
- RTUNI_ALPHA, /* U+000e21: THAI CHARACTER MO MA*/
- RTUNI_ALPHA, /* U+000e22: THAI CHARACTER YO YAK*/
- RTUNI_ALPHA, /* U+000e23: THAI CHARACTER RO RUA*/
- RTUNI_ALPHA, /* U+000e24: THAI CHARACTER RU*/
- RTUNI_ALPHA, /* U+000e25: THAI CHARACTER LO LING*/
- RTUNI_ALPHA, /* U+000e26: THAI CHARACTER LU*/
- RTUNI_ALPHA, /* U+000e27: THAI CHARACTER WO WAEN*/
- RTUNI_ALPHA, /* U+000e28: THAI CHARACTER SO SALA*/
- RTUNI_ALPHA, /* U+000e29: THAI CHARACTER SO RUSI*/
- RTUNI_ALPHA, /* U+000e2a: THAI CHARACTER SO SUA*/
- RTUNI_ALPHA, /* U+000e2b: THAI CHARACTER HO HIP*/
- RTUNI_ALPHA, /* U+000e2c: THAI CHARACTER LO CHULA*/
- RTUNI_ALPHA, /* U+000e2d: THAI CHARACTER O ANG*/
- RTUNI_ALPHA, /* U+000e2e: THAI CHARACTER HO NOKHUK*/
- RTUNI_ALPHA, /* U+000e2f: THAI CHARACTER PAIYANNOI*/
- RTUNI_ALPHA, /* U+000e30: THAI CHARACTER SARA A*/
- RTUNI_ALPHA, /* U+000e31: THAI CHARACTER MAI HAN-AKAT*/
- RTUNI_ALPHA, /* U+000e32: THAI CHARACTER SARA AA*/
- RTUNI_ALPHA, /* U+000e33: THAI CHARACTER SARA AM*/
- RTUNI_ALPHA, /* U+000e34: THAI CHARACTER SARA I*/
- RTUNI_ALPHA, /* U+000e35: THAI CHARACTER SARA II*/
- RTUNI_ALPHA, /* U+000e36: THAI CHARACTER SARA UE*/
- RTUNI_ALPHA, /* U+000e37: THAI CHARACTER SARA UEE*/
- RTUNI_ALPHA, /* U+000e38: THAI CHARACTER SARA U*/
- RTUNI_ALPHA, /* U+000e39: THAI CHARACTER SARA UU*/
- RTUNI_ALPHA, /* U+000e3a: THAI CHARACTER PHINTHU*/
- 0, /* U+000e3b: */
- 0, /* U+000e3c: */
- 0, /* U+000e3d: */
- 0, /* U+000e3e: */
- 0, /* U+000e3f: THAI CURRENCY SYMBOL BAHT*/
- RTUNI_ALPHA, /* U+000e40: THAI CHARACTER SARA E*/
- RTUNI_ALPHA, /* U+000e41: THAI CHARACTER SARA AE*/
- RTUNI_ALPHA, /* U+000e42: THAI CHARACTER SARA O*/
- RTUNI_ALPHA, /* U+000e43: THAI CHARACTER SARA AI MAIMUAN*/
- RTUNI_ALPHA, /* U+000e44: THAI CHARACTER SARA AI MAIMALAI*/
- RTUNI_ALPHA, /* U+000e45: THAI CHARACTER LAKKHANGYAO*/
- RTUNI_ALPHA, /* U+000e46: THAI CHARACTER MAIYAMOK*/
- 0, /* U+000e47: THAI CHARACTER MAITAIKHU*/
- 0, /* U+000e48: THAI CHARACTER MAI EK*/
- 0, /* U+000e49: THAI CHARACTER MAI THO*/
- 0, /* U+000e4a: THAI CHARACTER MAI TRI*/
- 0, /* U+000e4b: THAI CHARACTER MAI CHATTAWA*/
- 0, /* U+000e4c: THAI CHARACTER THANTHAKHAT*/
- RTUNI_ALPHA, /* U+000e4d: THAI CHARACTER NIKHAHIT*/
- 0, /* U+000e4e: THAI CHARACTER YAMAKKAN*/
- 0, /* U+000e4f: THAI CHARACTER FONGMAN*/
- RTUNI_DDIGIT, /* U+000e50: THAI DIGIT ZERO*/
- RTUNI_DDIGIT, /* U+000e51: THAI DIGIT ONE*/
- RTUNI_DDIGIT, /* U+000e52: THAI DIGIT TWO*/
- RTUNI_DDIGIT, /* U+000e53: THAI DIGIT THREE*/
- RTUNI_DDIGIT, /* U+000e54: THAI DIGIT FOUR*/
- RTUNI_DDIGIT, /* U+000e55: THAI DIGIT FIVE*/
- RTUNI_DDIGIT, /* U+000e56: THAI DIGIT SIX*/
- RTUNI_DDIGIT, /* U+000e57: THAI DIGIT SEVEN*/
- RTUNI_DDIGIT, /* U+000e58: THAI DIGIT EIGHT*/
- RTUNI_DDIGIT, /* U+000e59: THAI DIGIT NINE*/
- 0, /* U+000e5a: THAI CHARACTER ANGKHANKHU*/
- 0, /* U+000e5b: THAI CHARACTER KHOMUT*/
- 0, /* U+000e5c: */
- 0, /* U+000e5d: */
- 0, /* U+000e5e: */
- 0, /* U+000e5f: */
- 0, /* U+000e60: */
- 0, /* U+000e61: */
- 0, /* U+000e62: */
- 0, /* U+000e63: */
- 0, /* U+000e64: */
- 0, /* U+000e65: */
- 0, /* U+000e66: */
- 0, /* U+000e67: */
- 0, /* U+000e68: */
- 0, /* U+000e69: */
- 0, /* U+000e6a: */
- 0, /* U+000e6b: */
- 0, /* U+000e6c: */
- 0, /* U+000e6d: */
- 0, /* U+000e6e: */
- 0, /* U+000e6f: */
- 0, /* U+000e70: */
- 0, /* U+000e71: */
- 0, /* U+000e72: */
- 0, /* U+000e73: */
- 0, /* U+000e74: */
- 0, /* U+000e75: */
- 0, /* U+000e76: */
- 0, /* U+000e77: */
- 0, /* U+000e78: */
- 0, /* U+000e79: */
- 0, /* U+000e7a: */
- 0, /* U+000e7b: */
- 0, /* U+000e7c: */
- 0, /* U+000e7d: */
- 0, /* U+000e7e: */
- 0, /* U+000e7f: */
- 0, /* U+000e80: */
- RTUNI_ALPHA, /* U+000e81: LAO LETTER KO*/
- RTUNI_ALPHA, /* U+000e82: LAO LETTER KHO SUNG*/
- 0, /* U+000e83: */
- RTUNI_ALPHA, /* U+000e84: LAO LETTER KHO TAM*/
- 0, /* U+000e85: */
- 0, /* U+000e86: */
- RTUNI_ALPHA, /* U+000e87: LAO LETTER NGO*/
- RTUNI_ALPHA, /* U+000e88: LAO LETTER CO*/
- 0, /* U+000e89: */
- RTUNI_ALPHA, /* U+000e8a: LAO LETTER SO TAM*/
- 0, /* U+000e8b: */
- 0, /* U+000e8c: */
- RTUNI_ALPHA, /* U+000e8d: LAO LETTER NYO*/
- 0, /* U+000e8e: */
- 0, /* U+000e8f: */
- 0, /* U+000e90: */
- 0, /* U+000e91: */
- 0, /* U+000e92: */
- 0, /* U+000e93: */
- RTUNI_ALPHA, /* U+000e94: LAO LETTER DO*/
- RTUNI_ALPHA, /* U+000e95: LAO LETTER TO*/
- RTUNI_ALPHA, /* U+000e96: LAO LETTER THO SUNG*/
- RTUNI_ALPHA, /* U+000e97: LAO LETTER THO TAM*/
- 0, /* U+000e98: */
- RTUNI_ALPHA, /* U+000e99: LAO LETTER NO*/
- RTUNI_ALPHA, /* U+000e9a: LAO LETTER BO*/
- RTUNI_ALPHA, /* U+000e9b: LAO LETTER PO*/
- RTUNI_ALPHA, /* U+000e9c: LAO LETTER PHO SUNG*/
- RTUNI_ALPHA, /* U+000e9d: LAO LETTER FO TAM*/
- RTUNI_ALPHA, /* U+000e9e: LAO LETTER PHO TAM*/
- RTUNI_ALPHA, /* U+000e9f: LAO LETTER FO SUNG*/
- 0, /* U+000ea0: */
- RTUNI_ALPHA, /* U+000ea1: LAO LETTER MO*/
- RTUNI_ALPHA, /* U+000ea2: LAO LETTER YO*/
- RTUNI_ALPHA, /* U+000ea3: LAO LETTER LO LING*/
- 0, /* U+000ea4: */
- RTUNI_ALPHA, /* U+000ea5: LAO LETTER LO LOOT*/
- 0, /* U+000ea6: */
- RTUNI_ALPHA, /* U+000ea7: LAO LETTER WO*/
- 0, /* U+000ea8: */
- 0, /* U+000ea9: */
- RTUNI_ALPHA, /* U+000eaa: LAO LETTER SO SUNG*/
- RTUNI_ALPHA, /* U+000eab: LAO LETTER HO SUNG*/
- 0, /* U+000eac: */
- RTUNI_ALPHA, /* U+000ead: LAO LETTER O*/
- RTUNI_ALPHA, /* U+000eae: LAO LETTER HO TAM*/
- RTUNI_ALPHA, /* U+000eaf: LAO ELLIPSIS*/
- RTUNI_ALPHA, /* U+000eb0: LAO VOWEL SIGN A*/
- RTUNI_ALPHA, /* U+000eb1: LAO VOWEL SIGN MAI KAN*/
- RTUNI_ALPHA, /* U+000eb2: LAO VOWEL SIGN AA*/
- RTUNI_ALPHA, /* U+000eb3: LAO VOWEL SIGN AM*/
- RTUNI_ALPHA, /* U+000eb4: LAO VOWEL SIGN I*/
- RTUNI_ALPHA, /* U+000eb5: LAO VOWEL SIGN II*/
- RTUNI_ALPHA, /* U+000eb6: LAO VOWEL SIGN Y*/
- RTUNI_ALPHA, /* U+000eb7: LAO VOWEL SIGN YY*/
- RTUNI_ALPHA, /* U+000eb8: LAO VOWEL SIGN U*/
- RTUNI_ALPHA, /* U+000eb9: LAO VOWEL SIGN UU*/
- 0, /* U+000eba: */
- RTUNI_ALPHA, /* U+000ebb: LAO VOWEL SIGN MAI KON*/
- RTUNI_ALPHA, /* U+000ebc: LAO SEMIVOWEL SIGN LO*/
- RTUNI_ALPHA, /* U+000ebd: LAO SEMIVOWEL SIGN NYO*/
- 0, /* U+000ebe: */
- 0, /* U+000ebf: */
- RTUNI_ALPHA, /* U+000ec0: LAO VOWEL SIGN E*/
- RTUNI_ALPHA, /* U+000ec1: LAO VOWEL SIGN EI*/
- RTUNI_ALPHA, /* U+000ec2: LAO VOWEL SIGN O*/
- RTUNI_ALPHA, /* U+000ec3: LAO VOWEL SIGN AY*/
- RTUNI_ALPHA, /* U+000ec4: LAO VOWEL SIGN AI*/
- 0, /* U+000ec5: */
- RTUNI_ALPHA, /* U+000ec6: LAO KO LA*/
- 0, /* U+000ec7: */
- 0, /* U+000ec8: LAO TONE MAI EK*/
- 0, /* U+000ec9: LAO TONE MAI THO*/
- 0, /* U+000eca: LAO TONE MAI TI*/
- 0, /* U+000ecb: LAO TONE MAI CATAWA*/
- 0, /* U+000ecc: LAO CANCELLATION MARK*/
- RTUNI_ALPHA, /* U+000ecd: LAO NIGGAHITA*/
- 0, /* U+000ece: */
- 0, /* U+000ecf: */
- RTUNI_DDIGIT, /* U+000ed0: LAO DIGIT ZERO*/
- RTUNI_DDIGIT, /* U+000ed1: LAO DIGIT ONE*/
- RTUNI_DDIGIT, /* U+000ed2: LAO DIGIT TWO*/
- RTUNI_DDIGIT, /* U+000ed3: LAO DIGIT THREE*/
- RTUNI_DDIGIT, /* U+000ed4: LAO DIGIT FOUR*/
- RTUNI_DDIGIT, /* U+000ed5: LAO DIGIT FIVE*/
- RTUNI_DDIGIT, /* U+000ed6: LAO DIGIT SIX*/
- RTUNI_DDIGIT, /* U+000ed7: LAO DIGIT SEVEN*/
- RTUNI_DDIGIT, /* U+000ed8: LAO DIGIT EIGHT*/
- RTUNI_DDIGIT, /* U+000ed9: LAO DIGIT NINE*/
- 0, /* U+000eda: */
- 0, /* U+000edb: */
- RTUNI_ALPHA, /* U+000edc: LAO HO NO*/
- RTUNI_ALPHA, /* U+000edd: LAO HO MO*/
- 0, /* U+000ede: */
- 0, /* U+000edf: */
- 0, /* U+000ee0: */
- 0, /* U+000ee1: */
- 0, /* U+000ee2: */
- 0, /* U+000ee3: */
- 0, /* U+000ee4: */
- 0, /* U+000ee5: */
- 0, /* U+000ee6: */
- 0, /* U+000ee7: */
- 0, /* U+000ee8: */
- 0, /* U+000ee9: */
- 0, /* U+000eea: */
- 0, /* U+000eeb: */
- 0, /* U+000eec: */
- 0, /* U+000eed: */
- 0, /* U+000eee: */
- 0, /* U+000eef: */
- 0, /* U+000ef0: */
- 0, /* U+000ef1: */
- 0, /* U+000ef2: */
- 0, /* U+000ef3: */
- 0, /* U+000ef4: */
- 0, /* U+000ef5: */
- 0, /* U+000ef6: */
- 0, /* U+000ef7: */
- 0, /* U+000ef8: */
- 0, /* U+000ef9: */
- 0, /* U+000efa: */
- 0, /* U+000efb: */
- 0, /* U+000efc: */
- 0, /* U+000efd: */
- 0, /* U+000efe: */
- 0, /* U+000eff: */
- RTUNI_ALPHA, /* U+000f00: TIBETAN SYLLABLE OM*/
- 0, /* U+000f01: TIBETAN MARK GTER YIG MGO TRUNCATED A*/
- 0, /* U+000f02: TIBETAN MARK GTER YIG MGO -UM RNAM BCAD MA*/
- 0, /* U+000f03: TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA*/
- 0, /* U+000f04: TIBETAN MARK INITIAL YIG MGO MDUN MA*/
- 0, /* U+000f05: TIBETAN MARK CLOSING YIG MGO SGAB MA*/
- 0, /* U+000f06: TIBETAN MARK CARET YIG MGO PHUR SHAD MA*/
- 0, /* U+000f07: TIBETAN MARK YIG MGO TSHEG SHAD MA*/
- 0, /* U+000f08: TIBETAN MARK SBRUL SHAD*/
- 0, /* U+000f09: TIBETAN MARK BSKUR YIG MGO*/
- 0, /* U+000f0a: TIBETAN MARK BKA- SHOG YIG MGO*/
- 0, /* U+000f0b: TIBETAN MARK INTERSYLLABIC TSHEG*/
- 0, /* U+000f0c: TIBETAN MARK DELIMITER TSHEG BSTAR*/
- 0, /* U+000f0d: TIBETAN MARK SHAD*/
- 0, /* U+000f0e: TIBETAN MARK NYIS SHAD*/
- 0, /* U+000f0f: TIBETAN MARK TSHEG SHAD*/
- 0, /* U+000f10: TIBETAN MARK NYIS TSHEG SHAD*/
- 0, /* U+000f11: TIBETAN MARK RIN CHEN SPUNGS SHAD*/
- 0, /* U+000f12: TIBETAN MARK RGYA GRAM SHAD*/
- 0, /* U+000f13: TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN*/
- 0, /* U+000f14: TIBETAN MARK GTER TSHEG*/
- 0, /* U+000f15: TIBETAN LOGOTYPE SIGN CHAD RTAGS*/
- 0, /* U+000f16: TIBETAN LOGOTYPE SIGN LHAG RTAGS*/
- 0, /* U+000f17: TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS*/
- 0, /* U+000f18: TIBETAN ASTROLOGICAL SIGN -KHYUD PA*/
- 0, /* U+000f19: TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS*/
- 0, /* U+000f1a: TIBETAN SIGN RDEL DKAR GCIG*/
- 0, /* U+000f1b: TIBETAN SIGN RDEL DKAR GNYIS*/
- 0, /* U+000f1c: TIBETAN SIGN RDEL DKAR GSUM*/
- 0, /* U+000f1d: TIBETAN SIGN RDEL NAG GCIG*/
- 0, /* U+000f1e: TIBETAN SIGN RDEL NAG GNYIS*/
- 0, /* U+000f1f: TIBETAN SIGN RDEL DKAR RDEL NAG*/
- RTUNI_DDIGIT, /* U+000f20: TIBETAN DIGIT ZERO*/
- RTUNI_DDIGIT, /* U+000f21: TIBETAN DIGIT ONE*/
- RTUNI_DDIGIT, /* U+000f22: TIBETAN DIGIT TWO*/
- RTUNI_DDIGIT, /* U+000f23: TIBETAN DIGIT THREE*/
- RTUNI_DDIGIT, /* U+000f24: TIBETAN DIGIT FOUR*/
- RTUNI_DDIGIT, /* U+000f25: TIBETAN DIGIT FIVE*/
- RTUNI_DDIGIT, /* U+000f26: TIBETAN DIGIT SIX*/
- RTUNI_DDIGIT, /* U+000f27: TIBETAN DIGIT SEVEN*/
- RTUNI_DDIGIT, /* U+000f28: TIBETAN DIGIT EIGHT*/
- RTUNI_DDIGIT, /* U+000f29: TIBETAN DIGIT NINE*/
- 0, /* U+000f2a: TIBETAN DIGIT HALF ONE*/
- 0, /* U+000f2b: TIBETAN DIGIT HALF TWO*/
- 0, /* U+000f2c: TIBETAN DIGIT HALF THREE*/
- 0, /* U+000f2d: TIBETAN DIGIT HALF FOUR*/
- 0, /* U+000f2e: TIBETAN DIGIT HALF FIVE*/
- 0, /* U+000f2f: TIBETAN DIGIT HALF SIX*/
- 0, /* U+000f30: TIBETAN DIGIT HALF SEVEN*/
- 0, /* U+000f31: TIBETAN DIGIT HALF EIGHT*/
- 0, /* U+000f32: TIBETAN DIGIT HALF NINE*/
- 0, /* U+000f33: TIBETAN DIGIT HALF ZERO*/
- 0, /* U+000f34: TIBETAN MARK BSDUS RTAGS*/
- 0, /* U+000f35: TIBETAN MARK NGAS BZUNG NYI ZLA*/
- 0, /* U+000f36: TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN*/
- 0, /* U+000f37: TIBETAN MARK NGAS BZUNG SGOR RTAGS*/
- 0, /* U+000f38: TIBETAN MARK CHE MGO*/
- 0, /* U+000f39: TIBETAN MARK TSA -PHRU*/
- 0, /* U+000f3a: TIBETAN MARK GUG RTAGS GYON*/
- 0, /* U+000f3b: TIBETAN MARK GUG RTAGS GYAS*/
- 0, /* U+000f3c: TIBETAN MARK ANG KHANG GYON*/
- 0, /* U+000f3d: TIBETAN MARK ANG KHANG GYAS*/
- 0, /* U+000f3e: TIBETAN SIGN YAR TSHES*/
- 0, /* U+000f3f: TIBETAN SIGN MAR TSHES*/
- RTUNI_ALPHA, /* U+000f40: TIBETAN LETTER KA*/
- RTUNI_ALPHA, /* U+000f41: TIBETAN LETTER KHA*/
- RTUNI_ALPHA, /* U+000f42: TIBETAN LETTER GA*/
- RTUNI_ALPHA, /* U+000f43: TIBETAN LETTER GHA*/
- RTUNI_ALPHA, /* U+000f44: TIBETAN LETTER NGA*/
- RTUNI_ALPHA, /* U+000f45: TIBETAN LETTER CA*/
- RTUNI_ALPHA, /* U+000f46: TIBETAN LETTER CHA*/
- RTUNI_ALPHA, /* U+000f47: TIBETAN LETTER JA*/
- 0, /* U+000f48: */
- RTUNI_ALPHA, /* U+000f49: TIBETAN LETTER NYA*/
- RTUNI_ALPHA, /* U+000f4a: TIBETAN LETTER TTA*/
- RTUNI_ALPHA, /* U+000f4b: TIBETAN LETTER TTHA*/
- RTUNI_ALPHA, /* U+000f4c: TIBETAN LETTER DDA*/
- RTUNI_ALPHA, /* U+000f4d: TIBETAN LETTER DDHA*/
- RTUNI_ALPHA, /* U+000f4e: TIBETAN LETTER NNA*/
- RTUNI_ALPHA, /* U+000f4f: TIBETAN LETTER TA*/
- RTUNI_ALPHA, /* U+000f50: TIBETAN LETTER THA*/
- RTUNI_ALPHA, /* U+000f51: TIBETAN LETTER DA*/
- RTUNI_ALPHA, /* U+000f52: TIBETAN LETTER DHA*/
- RTUNI_ALPHA, /* U+000f53: TIBETAN LETTER NA*/
- RTUNI_ALPHA, /* U+000f54: TIBETAN LETTER PA*/
- RTUNI_ALPHA, /* U+000f55: TIBETAN LETTER PHA*/
- RTUNI_ALPHA, /* U+000f56: TIBETAN LETTER BA*/
- RTUNI_ALPHA, /* U+000f57: TIBETAN LETTER BHA*/
- RTUNI_ALPHA, /* U+000f58: TIBETAN LETTER MA*/
- RTUNI_ALPHA, /* U+000f59: TIBETAN LETTER TSA*/
- RTUNI_ALPHA, /* U+000f5a: TIBETAN LETTER TSHA*/
- RTUNI_ALPHA, /* U+000f5b: TIBETAN LETTER DZA*/
- RTUNI_ALPHA, /* U+000f5c: TIBETAN LETTER DZHA*/
- RTUNI_ALPHA, /* U+000f5d: TIBETAN LETTER WA*/
- RTUNI_ALPHA, /* U+000f5e: TIBETAN LETTER ZHA*/
- RTUNI_ALPHA, /* U+000f5f: TIBETAN LETTER ZA*/
- RTUNI_ALPHA, /* U+000f60: TIBETAN LETTER -A*/
- RTUNI_ALPHA, /* U+000f61: TIBETAN LETTER YA*/
- RTUNI_ALPHA, /* U+000f62: TIBETAN LETTER RA*/
- RTUNI_ALPHA, /* U+000f63: TIBETAN LETTER LA*/
- RTUNI_ALPHA, /* U+000f64: TIBETAN LETTER SHA*/
- RTUNI_ALPHA, /* U+000f65: TIBETAN LETTER SSA*/
- RTUNI_ALPHA, /* U+000f66: TIBETAN LETTER SA*/
- RTUNI_ALPHA, /* U+000f67: TIBETAN LETTER HA*/
- RTUNI_ALPHA, /* U+000f68: TIBETAN LETTER A*/
- RTUNI_ALPHA, /* U+000f69: TIBETAN LETTER KSSA*/
- RTUNI_ALPHA, /* U+000f6a: TIBETAN LETTER FIXED-FORM RA*/
- 0, /* U+000f6b: */
- 0, /* U+000f6c: */
- 0, /* U+000f6d: */
- 0, /* U+000f6e: */
- 0, /* U+000f6f: */
- 0, /* U+000f70: */
- RTUNI_ALPHA, /* U+000f71: TIBETAN VOWEL SIGN AA*/
- RTUNI_ALPHA, /* U+000f72: TIBETAN VOWEL SIGN I*/
- RTUNI_ALPHA, /* U+000f73: TIBETAN VOWEL SIGN II*/
- RTUNI_ALPHA, /* U+000f74: TIBETAN VOWEL SIGN U*/
- RTUNI_ALPHA, /* U+000f75: TIBETAN VOWEL SIGN UU*/
- RTUNI_ALPHA, /* U+000f76: TIBETAN VOWEL SIGN VOCALIC R*/
- RTUNI_ALPHA, /* U+000f77: TIBETAN VOWEL SIGN VOCALIC RR*/
- RTUNI_ALPHA, /* U+000f78: TIBETAN VOWEL SIGN VOCALIC L*/
- RTUNI_ALPHA, /* U+000f79: TIBETAN VOWEL SIGN VOCALIC LL*/
- RTUNI_ALPHA, /* U+000f7a: TIBETAN VOWEL SIGN E*/
- RTUNI_ALPHA, /* U+000f7b: TIBETAN VOWEL SIGN EE*/
- RTUNI_ALPHA, /* U+000f7c: TIBETAN VOWEL SIGN O*/
- RTUNI_ALPHA, /* U+000f7d: TIBETAN VOWEL SIGN OO*/
- RTUNI_ALPHA, /* U+000f7e: TIBETAN SIGN RJES SU NGA RO*/
- RTUNI_ALPHA, /* U+000f7f: TIBETAN SIGN RNAM BCAD*/
- RTUNI_ALPHA, /* U+000f80: TIBETAN VOWEL SIGN REVERSED I*/
- RTUNI_ALPHA, /* U+000f81: TIBETAN VOWEL SIGN REVERSED II*/
- 0, /* U+000f82: TIBETAN SIGN NYI ZLA NAA DA*/
- 0, /* U+000f83: TIBETAN SIGN SNA LDAN*/
- 0, /* U+000f84: TIBETAN MARK HALANTA*/
- 0, /* U+000f85: TIBETAN MARK PALUTA*/
- 0, /* U+000f86: TIBETAN SIGN LCI RTAGS*/
- 0, /* U+000f87: TIBETAN SIGN YANG RTAGS*/
- RTUNI_ALPHA, /* U+000f88: TIBETAN SIGN LCE TSA CAN*/
- RTUNI_ALPHA, /* U+000f89: TIBETAN SIGN MCHU CAN*/
- RTUNI_ALPHA, /* U+000f8a: TIBETAN SIGN GRU CAN RGYINGS*/
- RTUNI_ALPHA, /* U+000f8b: TIBETAN SIGN GRU MED RGYINGS*/
- 0, /* U+000f8c: */
- 0, /* U+000f8d: */
- 0, /* U+000f8e: */
- 0, /* U+000f8f: */
- RTUNI_ALPHA, /* U+000f90: TIBETAN SUBJOINED LETTER KA*/
- RTUNI_ALPHA, /* U+000f91: TIBETAN SUBJOINED LETTER KHA*/
- RTUNI_ALPHA, /* U+000f92: TIBETAN SUBJOINED LETTER GA*/
- RTUNI_ALPHA, /* U+000f93: TIBETAN SUBJOINED LETTER GHA*/
- RTUNI_ALPHA, /* U+000f94: TIBETAN SUBJOINED LETTER NGA*/
- RTUNI_ALPHA, /* U+000f95: TIBETAN SUBJOINED LETTER CA*/
- RTUNI_ALPHA, /* U+000f96: TIBETAN SUBJOINED LETTER CHA*/
- RTUNI_ALPHA, /* U+000f97: TIBETAN SUBJOINED LETTER JA*/
- 0, /* U+000f98: */
- RTUNI_ALPHA, /* U+000f99: TIBETAN SUBJOINED LETTER NYA*/
- RTUNI_ALPHA, /* U+000f9a: TIBETAN SUBJOINED LETTER TTA*/
- RTUNI_ALPHA, /* U+000f9b: TIBETAN SUBJOINED LETTER TTHA*/
- RTUNI_ALPHA, /* U+000f9c: TIBETAN SUBJOINED LETTER DDA*/
- RTUNI_ALPHA, /* U+000f9d: TIBETAN SUBJOINED LETTER DDHA*/
- RTUNI_ALPHA, /* U+000f9e: TIBETAN SUBJOINED LETTER NNA*/
- RTUNI_ALPHA, /* U+000f9f: TIBETAN SUBJOINED LETTER TA*/
- RTUNI_ALPHA, /* U+000fa0: TIBETAN SUBJOINED LETTER THA*/
- RTUNI_ALPHA, /* U+000fa1: TIBETAN SUBJOINED LETTER DA*/
- RTUNI_ALPHA, /* U+000fa2: TIBETAN SUBJOINED LETTER DHA*/
- RTUNI_ALPHA, /* U+000fa3: TIBETAN SUBJOINED LETTER NA*/
- RTUNI_ALPHA, /* U+000fa4: TIBETAN SUBJOINED LETTER PA*/
- RTUNI_ALPHA, /* U+000fa5: TIBETAN SUBJOINED LETTER PHA*/
- RTUNI_ALPHA, /* U+000fa6: TIBETAN SUBJOINED LETTER BA*/
- RTUNI_ALPHA, /* U+000fa7: TIBETAN SUBJOINED LETTER BHA*/
- RTUNI_ALPHA, /* U+000fa8: TIBETAN SUBJOINED LETTER MA*/
- RTUNI_ALPHA, /* U+000fa9: TIBETAN SUBJOINED LETTER TSA*/
- RTUNI_ALPHA, /* U+000faa: TIBETAN SUBJOINED LETTER TSHA*/
- RTUNI_ALPHA, /* U+000fab: TIBETAN SUBJOINED LETTER DZA*/
- RTUNI_ALPHA, /* U+000fac: TIBETAN SUBJOINED LETTER DZHA*/
- RTUNI_ALPHA, /* U+000fad: TIBETAN SUBJOINED LETTER WA*/
- RTUNI_ALPHA, /* U+000fae: TIBETAN SUBJOINED LETTER ZHA*/
- RTUNI_ALPHA, /* U+000faf: TIBETAN SUBJOINED LETTER ZA*/
- RTUNI_ALPHA, /* U+000fb0: TIBETAN SUBJOINED LETTER -A*/
- RTUNI_ALPHA, /* U+000fb1: TIBETAN SUBJOINED LETTER YA*/
- RTUNI_ALPHA, /* U+000fb2: TIBETAN SUBJOINED LETTER RA*/
- RTUNI_ALPHA, /* U+000fb3: TIBETAN SUBJOINED LETTER LA*/
- RTUNI_ALPHA, /* U+000fb4: TIBETAN SUBJOINED LETTER SHA*/
- RTUNI_ALPHA, /* U+000fb5: TIBETAN SUBJOINED LETTER SSA*/
- RTUNI_ALPHA, /* U+000fb6: TIBETAN SUBJOINED LETTER SA*/
- RTUNI_ALPHA, /* U+000fb7: TIBETAN SUBJOINED LETTER HA*/
- RTUNI_ALPHA, /* U+000fb8: TIBETAN SUBJOINED LETTER A*/
- RTUNI_ALPHA, /* U+000fb9: TIBETAN SUBJOINED LETTER KSSA*/
- RTUNI_ALPHA, /* U+000fba: TIBETAN SUBJOINED LETTER FIXED-FORM WA*/
- RTUNI_ALPHA, /* U+000fbb: TIBETAN SUBJOINED LETTER FIXED-FORM YA*/
- RTUNI_ALPHA, /* U+000fbc: TIBETAN SUBJOINED LETTER FIXED-FORM RA*/
- 0, /* U+000fbd: */
- 0, /* U+000fbe: TIBETAN KU RU KHA*/
- 0, /* U+000fbf: TIBETAN KU RU KHA BZHI MIG CAN*/
- 0, /* U+000fc0: TIBETAN CANTILLATION SIGN HEAVY BEAT*/
- 0, /* U+000fc1: TIBETAN CANTILLATION SIGN LIGHT BEAT*/
- 0, /* U+000fc2: TIBETAN CANTILLATION SIGN CANG TE-U*/
- 0, /* U+000fc3: TIBETAN CANTILLATION SIGN SBUB -CHAL*/
- 0, /* U+000fc4: TIBETAN SYMBOL DRIL BU*/
- 0, /* U+000fc5: TIBETAN SYMBOL RDO RJE*/
- 0, /* U+000fc6: TIBETAN SYMBOL PADMA GDAN*/
- 0, /* U+000fc7: TIBETAN SYMBOL RDO RJE RGYA GRAM*/
- 0, /* U+000fc8: TIBETAN SYMBOL PHUR PA*/
- 0, /* U+000fc9: TIBETAN SYMBOL NOR BU*/
- 0, /* U+000fca: TIBETAN SYMBOL NOR BU NYIS -KHYIL*/
- 0, /* U+000fcb: TIBETAN SYMBOL NOR BU GSUM -KHYIL*/
- 0, /* U+000fcc: TIBETAN SYMBOL NOR BU BZHI -KHYIL*/
- 0, /* U+000fcd: */
- 0, /* U+000fce: */
- 0, /* U+000fcf: TIBETAN SIGN RDEL NAG GSUM*/
- 0, /* U+000fd0: TIBETAN MARK BSKA- SHOG GI MGO RGYAN*/
- 0, /* U+000fd1: TIBETAN MARK MNYAM YIG GI MGO RGYAN*/
- 0, /* U+000fd2: */
- 0, /* U+000fd3: */
- 0, /* U+000fd4: */
- 0, /* U+000fd5: */
- 0, /* U+000fd6: */
- 0, /* U+000fd7: */
- 0, /* U+000fd8: */
- 0, /* U+000fd9: */
- 0, /* U+000fda: */
- 0, /* U+000fdb: */
- 0, /* U+000fdc: */
- 0, /* U+000fdd: */
- 0, /* U+000fde: */
- 0, /* U+000fdf: */
- 0, /* U+000fe0: */
- 0, /* U+000fe1: */
- 0, /* U+000fe2: */
- 0, /* U+000fe3: */
- 0, /* U+000fe4: */
- 0, /* U+000fe5: */
- 0, /* U+000fe6: */
- 0, /* U+000fe7: */
- 0, /* U+000fe8: */
- 0, /* U+000fe9: */
- 0, /* U+000fea: */
- 0, /* U+000feb: */
- 0, /* U+000fec: */
- 0, /* U+000fed: */
- 0, /* U+000fee: */
- 0, /* U+000fef: */
- 0, /* U+000ff0: */
- 0, /* U+000ff1: */
- 0, /* U+000ff2: */
- 0, /* U+000ff3: */
- 0, /* U+000ff4: */
- 0, /* U+000ff5: */
- 0, /* U+000ff6: */
- 0, /* U+000ff7: */
- 0, /* U+000ff8: */
- 0, /* U+000ff9: */
- 0, /* U+000ffa: */
- 0, /* U+000ffb: */
- 0, /* U+000ffc: */
- 0, /* U+000ffd: */
- 0, /* U+000ffe: */
- 0, /* U+000fff: */
- RTUNI_ALPHA, /* U+001000: MYANMAR LETTER KA*/
- RTUNI_ALPHA, /* U+001001: MYANMAR LETTER KHA*/
- RTUNI_ALPHA, /* U+001002: MYANMAR LETTER GA*/
- RTUNI_ALPHA, /* U+001003: MYANMAR LETTER GHA*/
- RTUNI_ALPHA, /* U+001004: MYANMAR LETTER NGA*/
- RTUNI_ALPHA, /* U+001005: MYANMAR LETTER CA*/
- RTUNI_ALPHA, /* U+001006: MYANMAR LETTER CHA*/
- RTUNI_ALPHA, /* U+001007: MYANMAR LETTER JA*/
- RTUNI_ALPHA, /* U+001008: MYANMAR LETTER JHA*/
- RTUNI_ALPHA, /* U+001009: MYANMAR LETTER NYA*/
- RTUNI_ALPHA, /* U+00100a: MYANMAR LETTER NNYA*/
- RTUNI_ALPHA, /* U+00100b: MYANMAR LETTER TTA*/
- RTUNI_ALPHA, /* U+00100c: MYANMAR LETTER TTHA*/
- RTUNI_ALPHA, /* U+00100d: MYANMAR LETTER DDA*/
- RTUNI_ALPHA, /* U+00100e: MYANMAR LETTER DDHA*/
- RTUNI_ALPHA, /* U+00100f: MYANMAR LETTER NNA*/
- RTUNI_ALPHA, /* U+001010: MYANMAR LETTER TA*/
- RTUNI_ALPHA, /* U+001011: MYANMAR LETTER THA*/
- RTUNI_ALPHA, /* U+001012: MYANMAR LETTER DA*/
- RTUNI_ALPHA, /* U+001013: MYANMAR LETTER DHA*/
- RTUNI_ALPHA, /* U+001014: MYANMAR LETTER NA*/
- RTUNI_ALPHA, /* U+001015: MYANMAR LETTER PA*/
- RTUNI_ALPHA, /* U+001016: MYANMAR LETTER PHA*/
- RTUNI_ALPHA, /* U+001017: MYANMAR LETTER BA*/
- RTUNI_ALPHA, /* U+001018: MYANMAR LETTER BHA*/
- RTUNI_ALPHA, /* U+001019: MYANMAR LETTER MA*/
- RTUNI_ALPHA, /* U+00101a: MYANMAR LETTER YA*/
- RTUNI_ALPHA, /* U+00101b: MYANMAR LETTER RA*/
- RTUNI_ALPHA, /* U+00101c: MYANMAR LETTER LA*/
- RTUNI_ALPHA, /* U+00101d: MYANMAR LETTER WA*/
- RTUNI_ALPHA, /* U+00101e: MYANMAR LETTER SA*/
- RTUNI_ALPHA, /* U+00101f: MYANMAR LETTER HA*/
- RTUNI_ALPHA, /* U+001020: MYANMAR LETTER LLA*/
- RTUNI_ALPHA, /* U+001021: MYANMAR LETTER A*/
- 0, /* U+001022: */
- RTUNI_ALPHA, /* U+001023: MYANMAR LETTER I*/
- RTUNI_ALPHA, /* U+001024: MYANMAR LETTER II*/
- RTUNI_ALPHA, /* U+001025: MYANMAR LETTER U*/
- RTUNI_ALPHA, /* U+001026: MYANMAR LETTER UU*/
- RTUNI_ALPHA, /* U+001027: MYANMAR LETTER E*/
- 0, /* U+001028: */
- RTUNI_ALPHA, /* U+001029: MYANMAR LETTER O*/
- RTUNI_ALPHA, /* U+00102a: MYANMAR LETTER AU*/
- 0, /* U+00102b: */
- RTUNI_ALPHA, /* U+00102c: MYANMAR VOWEL SIGN AA*/
- RTUNI_ALPHA, /* U+00102d: MYANMAR VOWEL SIGN I*/
- RTUNI_ALPHA, /* U+00102e: MYANMAR VOWEL SIGN II*/
- RTUNI_ALPHA, /* U+00102f: MYANMAR VOWEL SIGN U*/
- RTUNI_ALPHA, /* U+001030: MYANMAR VOWEL SIGN UU*/
- RTUNI_ALPHA, /* U+001031: MYANMAR VOWEL SIGN E*/
- RTUNI_ALPHA, /* U+001032: MYANMAR VOWEL SIGN AI*/
- 0, /* U+001033: */
- 0, /* U+001034: */
- 0, /* U+001035: */
- RTUNI_ALPHA, /* U+001036: MYANMAR SIGN ANUSVARA*/
- 0, /* U+001037: MYANMAR SIGN DOT BELOW*/
- RTUNI_ALPHA, /* U+001038: MYANMAR SIGN VISARGA*/
- 0, /* U+001039: MYANMAR SIGN VIRAMA*/
- 0, /* U+00103a: */
- 0, /* U+00103b: */
- 0, /* U+00103c: */
- 0, /* U+00103d: */
- 0, /* U+00103e: */
- 0, /* U+00103f: */
- RTUNI_DDIGIT, /* U+001040: MYANMAR DIGIT ZERO*/
- RTUNI_DDIGIT, /* U+001041: MYANMAR DIGIT ONE*/
- RTUNI_DDIGIT, /* U+001042: MYANMAR DIGIT TWO*/
- RTUNI_DDIGIT, /* U+001043: MYANMAR DIGIT THREE*/
- RTUNI_DDIGIT, /* U+001044: MYANMAR DIGIT FOUR*/
- RTUNI_DDIGIT, /* U+001045: MYANMAR DIGIT FIVE*/
- RTUNI_DDIGIT, /* U+001046: MYANMAR DIGIT SIX*/
- RTUNI_DDIGIT, /* U+001047: MYANMAR DIGIT SEVEN*/
- RTUNI_DDIGIT, /* U+001048: MYANMAR DIGIT EIGHT*/
- RTUNI_DDIGIT, /* U+001049: MYANMAR DIGIT NINE*/
- 0, /* U+00104a: MYANMAR SIGN LITTLE SECTION*/
- 0, /* U+00104b: MYANMAR SIGN SECTION*/
- 0, /* U+00104c: MYANMAR SYMBOL LOCATIVE*/
- 0, /* U+00104d: MYANMAR SYMBOL COMPLETED*/
- 0, /* U+00104e: MYANMAR SYMBOL AFOREMENTIONED*/
- 0, /* U+00104f: MYANMAR SYMBOL GENITIVE*/
- RTUNI_ALPHA, /* U+001050: MYANMAR LETTER SHA*/
- RTUNI_ALPHA, /* U+001051: MYANMAR LETTER SSA*/
- RTUNI_ALPHA, /* U+001052: MYANMAR LETTER VOCALIC R*/
- RTUNI_ALPHA, /* U+001053: MYANMAR LETTER VOCALIC RR*/
- RTUNI_ALPHA, /* U+001054: MYANMAR LETTER VOCALIC L*/
- RTUNI_ALPHA, /* U+001055: MYANMAR LETTER VOCALIC LL*/
- RTUNI_ALPHA, /* U+001056: MYANMAR VOWEL SIGN VOCALIC R*/
- RTUNI_ALPHA, /* U+001057: MYANMAR VOWEL SIGN VOCALIC RR*/
- RTUNI_ALPHA, /* U+001058: MYANMAR VOWEL SIGN VOCALIC L*/
- RTUNI_ALPHA, /* U+001059: MYANMAR VOWEL SIGN VOCALIC LL*/
- 0, /* U+00105a: */
- 0, /* U+00105b: */
- 0, /* U+00105c: */
- 0, /* U+00105d: */
- 0, /* U+00105e: */
- 0, /* U+00105f: */
- 0, /* U+001060: */
- 0, /* U+001061: */
- 0, /* U+001062: */
- 0, /* U+001063: */
- 0, /* U+001064: */
- 0, /* U+001065: */
- 0, /* U+001066: */
- 0, /* U+001067: */
- 0, /* U+001068: */
- 0, /* U+001069: */
- 0, /* U+00106a: */
- 0, /* U+00106b: */
- 0, /* U+00106c: */
- 0, /* U+00106d: */
- 0, /* U+00106e: */
- 0, /* U+00106f: */
- 0, /* U+001070: */
- 0, /* U+001071: */
- 0, /* U+001072: */
- 0, /* U+001073: */
- 0, /* U+001074: */
- 0, /* U+001075: */
- 0, /* U+001076: */
- 0, /* U+001077: */
- 0, /* U+001078: */
- 0, /* U+001079: */
- 0, /* U+00107a: */
- 0, /* U+00107b: */
- 0, /* U+00107c: */
- 0, /* U+00107d: */
- 0, /* U+00107e: */
- 0, /* U+00107f: */
- 0, /* U+001080: */
- 0, /* U+001081: */
- 0, /* U+001082: */
- 0, /* U+001083: */
- 0, /* U+001084: */
- 0, /* U+001085: */
- 0, /* U+001086: */
- 0, /* U+001087: */
- 0, /* U+001088: */
- 0, /* U+001089: */
- 0, /* U+00108a: */
- 0, /* U+00108b: */
- 0, /* U+00108c: */
- 0, /* U+00108d: */
- 0, /* U+00108e: */
- 0, /* U+00108f: */
- 0, /* U+001090: */
- 0, /* U+001091: */
- 0, /* U+001092: */
- 0, /* U+001093: */
- 0, /* U+001094: */
- 0, /* U+001095: */
- 0, /* U+001096: */
- 0, /* U+001097: */
- 0, /* U+001098: */
- 0, /* U+001099: */
- 0, /* U+00109a: */
- 0, /* U+00109b: */
- 0, /* U+00109c: */
- 0, /* U+00109d: */
- 0, /* U+00109e: */
- 0, /* U+00109f: */
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0010a0: GEORGIAN CAPITAL LETTER AN*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0010a1: GEORGIAN CAPITAL LETTER BAN*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0010a2: GEORGIAN CAPITAL LETTER GAN*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0010a3: GEORGIAN CAPITAL LETTER DON*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0010a4: GEORGIAN CAPITAL LETTER EN*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0010a5: GEORGIAN CAPITAL LETTER VIN*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0010a6: GEORGIAN CAPITAL LETTER ZEN*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0010a7: GEORGIAN CAPITAL LETTER TAN*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0010a8: GEORGIAN CAPITAL LETTER IN*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0010a9: GEORGIAN CAPITAL LETTER KAN*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0010aa: GEORGIAN CAPITAL LETTER LAS*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0010ab: GEORGIAN CAPITAL LETTER MAN*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0010ac: GEORGIAN CAPITAL LETTER NAR*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0010ad: GEORGIAN CAPITAL LETTER ON*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0010ae: GEORGIAN CAPITAL LETTER PAR*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0010af: GEORGIAN CAPITAL LETTER ZHAR*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0010b0: GEORGIAN CAPITAL LETTER RAE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0010b1: GEORGIAN CAPITAL LETTER SAN*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0010b2: GEORGIAN CAPITAL LETTER TAR*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0010b3: GEORGIAN CAPITAL LETTER UN*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0010b4: GEORGIAN CAPITAL LETTER PHAR*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0010b5: GEORGIAN CAPITAL LETTER KHAR*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0010b6: GEORGIAN CAPITAL LETTER GHAN*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0010b7: GEORGIAN CAPITAL LETTER QAR*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0010b8: GEORGIAN CAPITAL LETTER SHIN*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0010b9: GEORGIAN CAPITAL LETTER CHIN*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0010ba: GEORGIAN CAPITAL LETTER CAN*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0010bb: GEORGIAN CAPITAL LETTER JIL*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0010bc: GEORGIAN CAPITAL LETTER CIL*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0010bd: GEORGIAN CAPITAL LETTER CHAR*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0010be: GEORGIAN CAPITAL LETTER XAN*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0010bf: GEORGIAN CAPITAL LETTER JHAN*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0010c0: GEORGIAN CAPITAL LETTER HAE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0010c1: GEORGIAN CAPITAL LETTER HE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0010c2: GEORGIAN CAPITAL LETTER HIE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0010c3: GEORGIAN CAPITAL LETTER WE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0010c4: GEORGIAN CAPITAL LETTER HAR*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0010c5: GEORGIAN CAPITAL LETTER HOE*/
- 0, /* U+0010c6: */
- 0, /* U+0010c7: */
- 0, /* U+0010c8: */
- 0, /* U+0010c9: */
- 0, /* U+0010ca: */
- 0, /* U+0010cb: */
- 0, /* U+0010cc: */
- 0, /* U+0010cd: */
- 0, /* U+0010ce: */
- 0, /* U+0010cf: */
- RTUNI_ALPHA, /* U+0010d0: GEORGIAN LETTER AN*/
- RTUNI_ALPHA, /* U+0010d1: GEORGIAN LETTER BAN*/
- RTUNI_ALPHA, /* U+0010d2: GEORGIAN LETTER GAN*/
- RTUNI_ALPHA, /* U+0010d3: GEORGIAN LETTER DON*/
- RTUNI_ALPHA, /* U+0010d4: GEORGIAN LETTER EN*/
- RTUNI_ALPHA, /* U+0010d5: GEORGIAN LETTER VIN*/
- RTUNI_ALPHA, /* U+0010d6: GEORGIAN LETTER ZEN*/
- RTUNI_ALPHA, /* U+0010d7: GEORGIAN LETTER TAN*/
- RTUNI_ALPHA, /* U+0010d8: GEORGIAN LETTER IN*/
- RTUNI_ALPHA, /* U+0010d9: GEORGIAN LETTER KAN*/
- RTUNI_ALPHA, /* U+0010da: GEORGIAN LETTER LAS*/
- RTUNI_ALPHA, /* U+0010db: GEORGIAN LETTER MAN*/
- RTUNI_ALPHA, /* U+0010dc: GEORGIAN LETTER NAR*/
- RTUNI_ALPHA, /* U+0010dd: GEORGIAN LETTER ON*/
- RTUNI_ALPHA, /* U+0010de: GEORGIAN LETTER PAR*/
- RTUNI_ALPHA, /* U+0010df: GEORGIAN LETTER ZHAR*/
- RTUNI_ALPHA, /* U+0010e0: GEORGIAN LETTER RAE*/
- RTUNI_ALPHA, /* U+0010e1: GEORGIAN LETTER SAN*/
- RTUNI_ALPHA, /* U+0010e2: GEORGIAN LETTER TAR*/
- RTUNI_ALPHA, /* U+0010e3: GEORGIAN LETTER UN*/
- RTUNI_ALPHA, /* U+0010e4: GEORGIAN LETTER PHAR*/
- RTUNI_ALPHA, /* U+0010e5: GEORGIAN LETTER KHAR*/
- RTUNI_ALPHA, /* U+0010e6: GEORGIAN LETTER GHAN*/
- RTUNI_ALPHA, /* U+0010e7: GEORGIAN LETTER QAR*/
- RTUNI_ALPHA, /* U+0010e8: GEORGIAN LETTER SHIN*/
- RTUNI_ALPHA, /* U+0010e9: GEORGIAN LETTER CHIN*/
- RTUNI_ALPHA, /* U+0010ea: GEORGIAN LETTER CAN*/
- RTUNI_ALPHA, /* U+0010eb: GEORGIAN LETTER JIL*/
- RTUNI_ALPHA, /* U+0010ec: GEORGIAN LETTER CIL*/
- RTUNI_ALPHA, /* U+0010ed: GEORGIAN LETTER CHAR*/
- RTUNI_ALPHA, /* U+0010ee: GEORGIAN LETTER XAN*/
- RTUNI_ALPHA, /* U+0010ef: GEORGIAN LETTER JHAN*/
- RTUNI_ALPHA, /* U+0010f0: GEORGIAN LETTER HAE*/
- RTUNI_ALPHA, /* U+0010f1: GEORGIAN LETTER HE*/
- RTUNI_ALPHA, /* U+0010f2: GEORGIAN LETTER HIE*/
- RTUNI_ALPHA, /* U+0010f3: GEORGIAN LETTER WE*/
- RTUNI_ALPHA, /* U+0010f4: GEORGIAN LETTER HAR*/
- RTUNI_ALPHA, /* U+0010f5: GEORGIAN LETTER HOE*/
- RTUNI_ALPHA, /* U+0010f6: GEORGIAN LETTER FI*/
- RTUNI_ALPHA, /* U+0010f7: GEORGIAN LETTER YN*/
- RTUNI_ALPHA, /* U+0010f8: GEORGIAN LETTER ELIFI*/
- RTUNI_ALPHA, /* U+0010f9: GEORGIAN LETTER TURNED GAN*/
- RTUNI_ALPHA, /* U+0010fa: GEORGIAN LETTER AIN*/
- 0, /* U+0010fb: GEORGIAN PARAGRAPH SEPARATOR*/
- RTUNI_ALPHA, /* U+0010fc: MODIFIER LETTER GEORGIAN NAR*/
- 0, /* U+0010fd: */
- 0, /* U+0010fe: */
- 0, /* U+0010ff: */
- RTUNI_ALPHA, /* U+001100: HANGUL CHOSEONG KIYEOK*/
- RTUNI_ALPHA, /* U+001101: HANGUL CHOSEONG SSANGKIYEOK*/
- RTUNI_ALPHA, /* U+001102: HANGUL CHOSEONG NIEUN*/
- RTUNI_ALPHA, /* U+001103: HANGUL CHOSEONG TIKEUT*/
- RTUNI_ALPHA, /* U+001104: HANGUL CHOSEONG SSANGTIKEUT*/
- RTUNI_ALPHA, /* U+001105: HANGUL CHOSEONG RIEUL*/
- RTUNI_ALPHA, /* U+001106: HANGUL CHOSEONG MIEUM*/
- RTUNI_ALPHA, /* U+001107: HANGUL CHOSEONG PIEUP*/
- RTUNI_ALPHA, /* U+001108: HANGUL CHOSEONG SSANGPIEUP*/
- RTUNI_ALPHA, /* U+001109: HANGUL CHOSEONG SIOS*/
- RTUNI_ALPHA, /* U+00110a: HANGUL CHOSEONG SSANGSIOS*/
- RTUNI_ALPHA, /* U+00110b: HANGUL CHOSEONG IEUNG*/
- RTUNI_ALPHA, /* U+00110c: HANGUL CHOSEONG CIEUC*/
- RTUNI_ALPHA, /* U+00110d: HANGUL CHOSEONG SSANGCIEUC*/
- RTUNI_ALPHA, /* U+00110e: HANGUL CHOSEONG CHIEUCH*/
- RTUNI_ALPHA, /* U+00110f: HANGUL CHOSEONG KHIEUKH*/
- RTUNI_ALPHA, /* U+001110: HANGUL CHOSEONG THIEUTH*/
- RTUNI_ALPHA, /* U+001111: HANGUL CHOSEONG PHIEUPH*/
- RTUNI_ALPHA, /* U+001112: HANGUL CHOSEONG HIEUH*/
- RTUNI_ALPHA, /* U+001113: HANGUL CHOSEONG NIEUN-KIYEOK*/
- RTUNI_ALPHA, /* U+001114: HANGUL CHOSEONG SSANGNIEUN*/
- RTUNI_ALPHA, /* U+001115: HANGUL CHOSEONG NIEUN-TIKEUT*/
- RTUNI_ALPHA, /* U+001116: HANGUL CHOSEONG NIEUN-PIEUP*/
- RTUNI_ALPHA, /* U+001117: HANGUL CHOSEONG TIKEUT-KIYEOK*/
- RTUNI_ALPHA, /* U+001118: HANGUL CHOSEONG RIEUL-NIEUN*/
- RTUNI_ALPHA, /* U+001119: HANGUL CHOSEONG SSANGRIEUL*/
- RTUNI_ALPHA, /* U+00111a: HANGUL CHOSEONG RIEUL-HIEUH*/
- RTUNI_ALPHA, /* U+00111b: HANGUL CHOSEONG KAPYEOUNRIEUL*/
- RTUNI_ALPHA, /* U+00111c: HANGUL CHOSEONG MIEUM-PIEUP*/
- RTUNI_ALPHA, /* U+00111d: HANGUL CHOSEONG KAPYEOUNMIEUM*/
- RTUNI_ALPHA, /* U+00111e: HANGUL CHOSEONG PIEUP-KIYEOK*/
- RTUNI_ALPHA, /* U+00111f: HANGUL CHOSEONG PIEUP-NIEUN*/
- RTUNI_ALPHA, /* U+001120: HANGUL CHOSEONG PIEUP-TIKEUT*/
- RTUNI_ALPHA, /* U+001121: HANGUL CHOSEONG PIEUP-SIOS*/
- RTUNI_ALPHA, /* U+001122: HANGUL CHOSEONG PIEUP-SIOS-KIYEOK*/
- RTUNI_ALPHA, /* U+001123: HANGUL CHOSEONG PIEUP-SIOS-TIKEUT*/
- RTUNI_ALPHA, /* U+001124: HANGUL CHOSEONG PIEUP-SIOS-PIEUP*/
- RTUNI_ALPHA, /* U+001125: HANGUL CHOSEONG PIEUP-SSANGSIOS*/
- RTUNI_ALPHA, /* U+001126: HANGUL CHOSEONG PIEUP-SIOS-CIEUC*/
- RTUNI_ALPHA, /* U+001127: HANGUL CHOSEONG PIEUP-CIEUC*/
- RTUNI_ALPHA, /* U+001128: HANGUL CHOSEONG PIEUP-CHIEUCH*/
- RTUNI_ALPHA, /* U+001129: HANGUL CHOSEONG PIEUP-THIEUTH*/
- RTUNI_ALPHA, /* U+00112a: HANGUL CHOSEONG PIEUP-PHIEUPH*/
- RTUNI_ALPHA, /* U+00112b: HANGUL CHOSEONG KAPYEOUNPIEUP*/
- RTUNI_ALPHA, /* U+00112c: HANGUL CHOSEONG KAPYEOUNSSANGPIEUP*/
- RTUNI_ALPHA, /* U+00112d: HANGUL CHOSEONG SIOS-KIYEOK*/
- RTUNI_ALPHA, /* U+00112e: HANGUL CHOSEONG SIOS-NIEUN*/
- RTUNI_ALPHA, /* U+00112f: HANGUL CHOSEONG SIOS-TIKEUT*/
- RTUNI_ALPHA, /* U+001130: HANGUL CHOSEONG SIOS-RIEUL*/
- RTUNI_ALPHA, /* U+001131: HANGUL CHOSEONG SIOS-MIEUM*/
- RTUNI_ALPHA, /* U+001132: HANGUL CHOSEONG SIOS-PIEUP*/
- RTUNI_ALPHA, /* U+001133: HANGUL CHOSEONG SIOS-PIEUP-KIYEOK*/
- RTUNI_ALPHA, /* U+001134: HANGUL CHOSEONG SIOS-SSANGSIOS*/
- RTUNI_ALPHA, /* U+001135: HANGUL CHOSEONG SIOS-IEUNG*/
- RTUNI_ALPHA, /* U+001136: HANGUL CHOSEONG SIOS-CIEUC*/
- RTUNI_ALPHA, /* U+001137: HANGUL CHOSEONG SIOS-CHIEUCH*/
- RTUNI_ALPHA, /* U+001138: HANGUL CHOSEONG SIOS-KHIEUKH*/
- RTUNI_ALPHA, /* U+001139: HANGUL CHOSEONG SIOS-THIEUTH*/
- RTUNI_ALPHA, /* U+00113a: HANGUL CHOSEONG SIOS-PHIEUPH*/
- RTUNI_ALPHA, /* U+00113b: HANGUL CHOSEONG SIOS-HIEUH*/
- RTUNI_ALPHA, /* U+00113c: HANGUL CHOSEONG CHITUEUMSIOS*/
- RTUNI_ALPHA, /* U+00113d: HANGUL CHOSEONG CHITUEUMSSANGSIOS*/
- RTUNI_ALPHA, /* U+00113e: HANGUL CHOSEONG CEONGCHIEUMSIOS*/
- RTUNI_ALPHA, /* U+00113f: HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS*/
- RTUNI_ALPHA, /* U+001140: HANGUL CHOSEONG PANSIOS*/
- RTUNI_ALPHA, /* U+001141: HANGUL CHOSEONG IEUNG-KIYEOK*/
- RTUNI_ALPHA, /* U+001142: HANGUL CHOSEONG IEUNG-TIKEUT*/
- RTUNI_ALPHA, /* U+001143: HANGUL CHOSEONG IEUNG-MIEUM*/
- RTUNI_ALPHA, /* U+001144: HANGUL CHOSEONG IEUNG-PIEUP*/
- RTUNI_ALPHA, /* U+001145: HANGUL CHOSEONG IEUNG-SIOS*/
- RTUNI_ALPHA, /* U+001146: HANGUL CHOSEONG IEUNG-PANSIOS*/
- RTUNI_ALPHA, /* U+001147: HANGUL CHOSEONG SSANGIEUNG*/
- RTUNI_ALPHA, /* U+001148: HANGUL CHOSEONG IEUNG-CIEUC*/
- RTUNI_ALPHA, /* U+001149: HANGUL CHOSEONG IEUNG-CHIEUCH*/
- RTUNI_ALPHA, /* U+00114a: HANGUL CHOSEONG IEUNG-THIEUTH*/
- RTUNI_ALPHA, /* U+00114b: HANGUL CHOSEONG IEUNG-PHIEUPH*/
- RTUNI_ALPHA, /* U+00114c: HANGUL CHOSEONG YESIEUNG*/
- RTUNI_ALPHA, /* U+00114d: HANGUL CHOSEONG CIEUC-IEUNG*/
- RTUNI_ALPHA, /* U+00114e: HANGUL CHOSEONG CHITUEUMCIEUC*/
- RTUNI_ALPHA, /* U+00114f: HANGUL CHOSEONG CHITUEUMSSANGCIEUC*/
- RTUNI_ALPHA, /* U+001150: HANGUL CHOSEONG CEONGCHIEUMCIEUC*/
- RTUNI_ALPHA, /* U+001151: HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC*/
- RTUNI_ALPHA, /* U+001152: HANGUL CHOSEONG CHIEUCH-KHIEUKH*/
- RTUNI_ALPHA, /* U+001153: HANGUL CHOSEONG CHIEUCH-HIEUH*/
- RTUNI_ALPHA, /* U+001154: HANGUL CHOSEONG CHITUEUMCHIEUCH*/
- RTUNI_ALPHA, /* U+001155: HANGUL CHOSEONG CEONGCHIEUMCHIEUCH*/
- RTUNI_ALPHA, /* U+001156: HANGUL CHOSEONG PHIEUPH-PIEUP*/
- RTUNI_ALPHA, /* U+001157: HANGUL CHOSEONG KAPYEOUNPHIEUPH*/
- RTUNI_ALPHA, /* U+001158: HANGUL CHOSEONG SSANGHIEUH*/
- RTUNI_ALPHA, /* U+001159: HANGUL CHOSEONG YEORINHIEUH*/
- 0, /* U+00115a: */
- 0, /* U+00115b: */
- 0, /* U+00115c: */
- 0, /* U+00115d: */
- 0, /* U+00115e: */
- RTUNI_ALPHA, /* U+00115f: HANGUL CHOSEONG FILLER*/
- RTUNI_ALPHA, /* U+001160: HANGUL JUNGSEONG FILLER*/
- RTUNI_ALPHA, /* U+001161: HANGUL JUNGSEONG A*/
- RTUNI_ALPHA, /* U+001162: HANGUL JUNGSEONG AE*/
- RTUNI_ALPHA, /* U+001163: HANGUL JUNGSEONG YA*/
- RTUNI_ALPHA, /* U+001164: HANGUL JUNGSEONG YAE*/
- RTUNI_ALPHA, /* U+001165: HANGUL JUNGSEONG EO*/
- RTUNI_ALPHA, /* U+001166: HANGUL JUNGSEONG E*/
- RTUNI_ALPHA, /* U+001167: HANGUL JUNGSEONG YEO*/
- RTUNI_ALPHA, /* U+001168: HANGUL JUNGSEONG YE*/
- RTUNI_ALPHA, /* U+001169: HANGUL JUNGSEONG O*/
- RTUNI_ALPHA, /* U+00116a: HANGUL JUNGSEONG WA*/
- RTUNI_ALPHA, /* U+00116b: HANGUL JUNGSEONG WAE*/
- RTUNI_ALPHA, /* U+00116c: HANGUL JUNGSEONG OE*/
- RTUNI_ALPHA, /* U+00116d: HANGUL JUNGSEONG YO*/
- RTUNI_ALPHA, /* U+00116e: HANGUL JUNGSEONG U*/
- RTUNI_ALPHA, /* U+00116f: HANGUL JUNGSEONG WEO*/
- RTUNI_ALPHA, /* U+001170: HANGUL JUNGSEONG WE*/
- RTUNI_ALPHA, /* U+001171: HANGUL JUNGSEONG WI*/
- RTUNI_ALPHA, /* U+001172: HANGUL JUNGSEONG YU*/
- RTUNI_ALPHA, /* U+001173: HANGUL JUNGSEONG EU*/
- RTUNI_ALPHA, /* U+001174: HANGUL JUNGSEONG YI*/
- RTUNI_ALPHA, /* U+001175: HANGUL JUNGSEONG I*/
- RTUNI_ALPHA, /* U+001176: HANGUL JUNGSEONG A-O*/
- RTUNI_ALPHA, /* U+001177: HANGUL JUNGSEONG A-U*/
- RTUNI_ALPHA, /* U+001178: HANGUL JUNGSEONG YA-O*/
- RTUNI_ALPHA, /* U+001179: HANGUL JUNGSEONG YA-YO*/
- RTUNI_ALPHA, /* U+00117a: HANGUL JUNGSEONG EO-O*/
- RTUNI_ALPHA, /* U+00117b: HANGUL JUNGSEONG EO-U*/
- RTUNI_ALPHA, /* U+00117c: HANGUL JUNGSEONG EO-EU*/
- RTUNI_ALPHA, /* U+00117d: HANGUL JUNGSEONG YEO-O*/
- RTUNI_ALPHA, /* U+00117e: HANGUL JUNGSEONG YEO-U*/
- RTUNI_ALPHA, /* U+00117f: HANGUL JUNGSEONG O-EO*/
- RTUNI_ALPHA, /* U+001180: HANGUL JUNGSEONG O-E*/
- RTUNI_ALPHA, /* U+001181: HANGUL JUNGSEONG O-YE*/
- RTUNI_ALPHA, /* U+001182: HANGUL JUNGSEONG O-O*/
- RTUNI_ALPHA, /* U+001183: HANGUL JUNGSEONG O-U*/
- RTUNI_ALPHA, /* U+001184: HANGUL JUNGSEONG YO-YA*/
- RTUNI_ALPHA, /* U+001185: HANGUL JUNGSEONG YO-YAE*/
- RTUNI_ALPHA, /* U+001186: HANGUL JUNGSEONG YO-YEO*/
- RTUNI_ALPHA, /* U+001187: HANGUL JUNGSEONG YO-O*/
- RTUNI_ALPHA, /* U+001188: HANGUL JUNGSEONG YO-I*/
- RTUNI_ALPHA, /* U+001189: HANGUL JUNGSEONG U-A*/
- RTUNI_ALPHA, /* U+00118a: HANGUL JUNGSEONG U-AE*/
- RTUNI_ALPHA, /* U+00118b: HANGUL JUNGSEONG U-EO-EU*/
- RTUNI_ALPHA, /* U+00118c: HANGUL JUNGSEONG U-YE*/
- RTUNI_ALPHA, /* U+00118d: HANGUL JUNGSEONG U-U*/
- RTUNI_ALPHA, /* U+00118e: HANGUL JUNGSEONG YU-A*/
- RTUNI_ALPHA, /* U+00118f: HANGUL JUNGSEONG YU-EO*/
- RTUNI_ALPHA, /* U+001190: HANGUL JUNGSEONG YU-E*/
- RTUNI_ALPHA, /* U+001191: HANGUL JUNGSEONG YU-YEO*/
- RTUNI_ALPHA, /* U+001192: HANGUL JUNGSEONG YU-YE*/
- RTUNI_ALPHA, /* U+001193: HANGUL JUNGSEONG YU-U*/
- RTUNI_ALPHA, /* U+001194: HANGUL JUNGSEONG YU-I*/
- RTUNI_ALPHA, /* U+001195: HANGUL JUNGSEONG EU-U*/
- RTUNI_ALPHA, /* U+001196: HANGUL JUNGSEONG EU-EU*/
- RTUNI_ALPHA, /* U+001197: HANGUL JUNGSEONG YI-U*/
- RTUNI_ALPHA, /* U+001198: HANGUL JUNGSEONG I-A*/
- RTUNI_ALPHA, /* U+001199: HANGUL JUNGSEONG I-YA*/
- RTUNI_ALPHA, /* U+00119a: HANGUL JUNGSEONG I-O*/
- RTUNI_ALPHA, /* U+00119b: HANGUL JUNGSEONG I-U*/
- RTUNI_ALPHA, /* U+00119c: HANGUL JUNGSEONG I-EU*/
- RTUNI_ALPHA, /* U+00119d: HANGUL JUNGSEONG I-ARAEA*/
- RTUNI_ALPHA, /* U+00119e: HANGUL JUNGSEONG ARAEA*/
- RTUNI_ALPHA, /* U+00119f: HANGUL JUNGSEONG ARAEA-EO*/
- RTUNI_ALPHA, /* U+0011a0: HANGUL JUNGSEONG ARAEA-U*/
- RTUNI_ALPHA, /* U+0011a1: HANGUL JUNGSEONG ARAEA-I*/
- RTUNI_ALPHA, /* U+0011a2: HANGUL JUNGSEONG SSANGARAEA*/
- 0, /* U+0011a3: */
- 0, /* U+0011a4: */
- 0, /* U+0011a5: */
- 0, /* U+0011a6: */
- 0, /* U+0011a7: */
- RTUNI_ALPHA, /* U+0011a8: HANGUL JONGSEONG KIYEOK*/
- RTUNI_ALPHA, /* U+0011a9: HANGUL JONGSEONG SSANGKIYEOK*/
- RTUNI_ALPHA, /* U+0011aa: HANGUL JONGSEONG KIYEOK-SIOS*/
- RTUNI_ALPHA, /* U+0011ab: HANGUL JONGSEONG NIEUN*/
- RTUNI_ALPHA, /* U+0011ac: HANGUL JONGSEONG NIEUN-CIEUC*/
- RTUNI_ALPHA, /* U+0011ad: HANGUL JONGSEONG NIEUN-HIEUH*/
- RTUNI_ALPHA, /* U+0011ae: HANGUL JONGSEONG TIKEUT*/
- RTUNI_ALPHA, /* U+0011af: HANGUL JONGSEONG RIEUL*/
- RTUNI_ALPHA, /* U+0011b0: HANGUL JONGSEONG RIEUL-KIYEOK*/
- RTUNI_ALPHA, /* U+0011b1: HANGUL JONGSEONG RIEUL-MIEUM*/
- RTUNI_ALPHA, /* U+0011b2: HANGUL JONGSEONG RIEUL-PIEUP*/
- RTUNI_ALPHA, /* U+0011b3: HANGUL JONGSEONG RIEUL-SIOS*/
- RTUNI_ALPHA, /* U+0011b4: HANGUL JONGSEONG RIEUL-THIEUTH*/
- RTUNI_ALPHA, /* U+0011b5: HANGUL JONGSEONG RIEUL-PHIEUPH*/
- RTUNI_ALPHA, /* U+0011b6: HANGUL JONGSEONG RIEUL-HIEUH*/
- RTUNI_ALPHA, /* U+0011b7: HANGUL JONGSEONG MIEUM*/
- RTUNI_ALPHA, /* U+0011b8: HANGUL JONGSEONG PIEUP*/
- RTUNI_ALPHA, /* U+0011b9: HANGUL JONGSEONG PIEUP-SIOS*/
- RTUNI_ALPHA, /* U+0011ba: HANGUL JONGSEONG SIOS*/
- RTUNI_ALPHA, /* U+0011bb: HANGUL JONGSEONG SSANGSIOS*/
- RTUNI_ALPHA, /* U+0011bc: HANGUL JONGSEONG IEUNG*/
- RTUNI_ALPHA, /* U+0011bd: HANGUL JONGSEONG CIEUC*/
- RTUNI_ALPHA, /* U+0011be: HANGUL JONGSEONG CHIEUCH*/
- RTUNI_ALPHA, /* U+0011bf: HANGUL JONGSEONG KHIEUKH*/
- RTUNI_ALPHA, /* U+0011c0: HANGUL JONGSEONG THIEUTH*/
- RTUNI_ALPHA, /* U+0011c1: HANGUL JONGSEONG PHIEUPH*/
- RTUNI_ALPHA, /* U+0011c2: HANGUL JONGSEONG HIEUH*/
- RTUNI_ALPHA, /* U+0011c3: HANGUL JONGSEONG KIYEOK-RIEUL*/
- RTUNI_ALPHA, /* U+0011c4: HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK*/
- RTUNI_ALPHA, /* U+0011c5: HANGUL JONGSEONG NIEUN-KIYEOK*/
- RTUNI_ALPHA, /* U+0011c6: HANGUL JONGSEONG NIEUN-TIKEUT*/
- RTUNI_ALPHA, /* U+0011c7: HANGUL JONGSEONG NIEUN-SIOS*/
- RTUNI_ALPHA, /* U+0011c8: HANGUL JONGSEONG NIEUN-PANSIOS*/
- RTUNI_ALPHA, /* U+0011c9: HANGUL JONGSEONG NIEUN-THIEUTH*/
- RTUNI_ALPHA, /* U+0011ca: HANGUL JONGSEONG TIKEUT-KIYEOK*/
- RTUNI_ALPHA, /* U+0011cb: HANGUL JONGSEONG TIKEUT-RIEUL*/
- RTUNI_ALPHA, /* U+0011cc: HANGUL JONGSEONG RIEUL-KIYEOK-SIOS*/
- RTUNI_ALPHA, /* U+0011cd: HANGUL JONGSEONG RIEUL-NIEUN*/
- RTUNI_ALPHA, /* U+0011ce: HANGUL JONGSEONG RIEUL-TIKEUT*/
- RTUNI_ALPHA, /* U+0011cf: HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH*/
- RTUNI_ALPHA, /* U+0011d0: HANGUL JONGSEONG SSANGRIEUL*/
- RTUNI_ALPHA, /* U+0011d1: HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK*/
- RTUNI_ALPHA, /* U+0011d2: HANGUL JONGSEONG RIEUL-MIEUM-SIOS*/
- RTUNI_ALPHA, /* U+0011d3: HANGUL JONGSEONG RIEUL-PIEUP-SIOS*/
- RTUNI_ALPHA, /* U+0011d4: HANGUL JONGSEONG RIEUL-PIEUP-HIEUH*/
- RTUNI_ALPHA, /* U+0011d5: HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP*/
- RTUNI_ALPHA, /* U+0011d6: HANGUL JONGSEONG RIEUL-SSANGSIOS*/
- RTUNI_ALPHA, /* U+0011d7: HANGUL JONGSEONG RIEUL-PANSIOS*/
- RTUNI_ALPHA, /* U+0011d8: HANGUL JONGSEONG RIEUL-KHIEUKH*/
- RTUNI_ALPHA, /* U+0011d9: HANGUL JONGSEONG RIEUL-YEORINHIEUH*/
- RTUNI_ALPHA, /* U+0011da: HANGUL JONGSEONG MIEUM-KIYEOK*/
- RTUNI_ALPHA, /* U+0011db: HANGUL JONGSEONG MIEUM-RIEUL*/
- RTUNI_ALPHA, /* U+0011dc: HANGUL JONGSEONG MIEUM-PIEUP*/
- RTUNI_ALPHA, /* U+0011dd: HANGUL JONGSEONG MIEUM-SIOS*/
- RTUNI_ALPHA, /* U+0011de: HANGUL JONGSEONG MIEUM-SSANGSIOS*/
- RTUNI_ALPHA, /* U+0011df: HANGUL JONGSEONG MIEUM-PANSIOS*/
- RTUNI_ALPHA, /* U+0011e0: HANGUL JONGSEONG MIEUM-CHIEUCH*/
- RTUNI_ALPHA, /* U+0011e1: HANGUL JONGSEONG MIEUM-HIEUH*/
- RTUNI_ALPHA, /* U+0011e2: HANGUL JONGSEONG KAPYEOUNMIEUM*/
- RTUNI_ALPHA, /* U+0011e3: HANGUL JONGSEONG PIEUP-RIEUL*/
- RTUNI_ALPHA, /* U+0011e4: HANGUL JONGSEONG PIEUP-PHIEUPH*/
- RTUNI_ALPHA, /* U+0011e5: HANGUL JONGSEONG PIEUP-HIEUH*/
- RTUNI_ALPHA, /* U+0011e6: HANGUL JONGSEONG KAPYEOUNPIEUP*/
- RTUNI_ALPHA, /* U+0011e7: HANGUL JONGSEONG SIOS-KIYEOK*/
- RTUNI_ALPHA, /* U+0011e8: HANGUL JONGSEONG SIOS-TIKEUT*/
- RTUNI_ALPHA, /* U+0011e9: HANGUL JONGSEONG SIOS-RIEUL*/
- RTUNI_ALPHA, /* U+0011ea: HANGUL JONGSEONG SIOS-PIEUP*/
- RTUNI_ALPHA, /* U+0011eb: HANGUL JONGSEONG PANSIOS*/
- RTUNI_ALPHA, /* U+0011ec: HANGUL JONGSEONG IEUNG-KIYEOK*/
- RTUNI_ALPHA, /* U+0011ed: HANGUL JONGSEONG IEUNG-SSANGKIYEOK*/
- RTUNI_ALPHA, /* U+0011ee: HANGUL JONGSEONG SSANGIEUNG*/
- RTUNI_ALPHA, /* U+0011ef: HANGUL JONGSEONG IEUNG-KHIEUKH*/
- RTUNI_ALPHA, /* U+0011f0: HANGUL JONGSEONG YESIEUNG*/
- RTUNI_ALPHA, /* U+0011f1: HANGUL JONGSEONG YESIEUNG-SIOS*/
- RTUNI_ALPHA, /* U+0011f2: HANGUL JONGSEONG YESIEUNG-PANSIOS*/
- RTUNI_ALPHA, /* U+0011f3: HANGUL JONGSEONG PHIEUPH-PIEUP*/
- RTUNI_ALPHA, /* U+0011f4: HANGUL JONGSEONG KAPYEOUNPHIEUPH*/
- RTUNI_ALPHA, /* U+0011f5: HANGUL JONGSEONG HIEUH-NIEUN*/
- RTUNI_ALPHA, /* U+0011f6: HANGUL JONGSEONG HIEUH-RIEUL*/
- RTUNI_ALPHA, /* U+0011f7: HANGUL JONGSEONG HIEUH-MIEUM*/
- RTUNI_ALPHA, /* U+0011f8: HANGUL JONGSEONG HIEUH-PIEUP*/
- RTUNI_ALPHA, /* U+0011f9: HANGUL JONGSEONG YEORINHIEUH*/
- 0, /* U+0011fa: */
- 0, /* U+0011fb: */
- 0, /* U+0011fc: */
- 0, /* U+0011fd: */
- 0, /* U+0011fe: */
- 0, /* U+0011ff: */
- RTUNI_ALPHA, /* U+001200: ETHIOPIC SYLLABLE HA*/
- RTUNI_ALPHA, /* U+001201: ETHIOPIC SYLLABLE HU*/
- RTUNI_ALPHA, /* U+001202: ETHIOPIC SYLLABLE HI*/
- RTUNI_ALPHA, /* U+001203: ETHIOPIC SYLLABLE HAA*/
- RTUNI_ALPHA, /* U+001204: ETHIOPIC SYLLABLE HEE*/
- RTUNI_ALPHA, /* U+001205: ETHIOPIC SYLLABLE HE*/
- RTUNI_ALPHA, /* U+001206: ETHIOPIC SYLLABLE HO*/
- RTUNI_ALPHA, /* U+001207: ETHIOPIC SYLLABLE HOA*/
- RTUNI_ALPHA, /* U+001208: ETHIOPIC SYLLABLE LA*/
- RTUNI_ALPHA, /* U+001209: ETHIOPIC SYLLABLE LU*/
- RTUNI_ALPHA, /* U+00120a: ETHIOPIC SYLLABLE LI*/
- RTUNI_ALPHA, /* U+00120b: ETHIOPIC SYLLABLE LAA*/
- RTUNI_ALPHA, /* U+00120c: ETHIOPIC SYLLABLE LEE*/
- RTUNI_ALPHA, /* U+00120d: ETHIOPIC SYLLABLE LE*/
- RTUNI_ALPHA, /* U+00120e: ETHIOPIC SYLLABLE LO*/
- RTUNI_ALPHA, /* U+00120f: ETHIOPIC SYLLABLE LWA*/
- RTUNI_ALPHA, /* U+001210: ETHIOPIC SYLLABLE HHA*/
- RTUNI_ALPHA, /* U+001211: ETHIOPIC SYLLABLE HHU*/
- RTUNI_ALPHA, /* U+001212: ETHIOPIC SYLLABLE HHI*/
- RTUNI_ALPHA, /* U+001213: ETHIOPIC SYLLABLE HHAA*/
- RTUNI_ALPHA, /* U+001214: ETHIOPIC SYLLABLE HHEE*/
- RTUNI_ALPHA, /* U+001215: ETHIOPIC SYLLABLE HHE*/
- RTUNI_ALPHA, /* U+001216: ETHIOPIC SYLLABLE HHO*/
- RTUNI_ALPHA, /* U+001217: ETHIOPIC SYLLABLE HHWA*/
- RTUNI_ALPHA, /* U+001218: ETHIOPIC SYLLABLE MA*/
- RTUNI_ALPHA, /* U+001219: ETHIOPIC SYLLABLE MU*/
- RTUNI_ALPHA, /* U+00121a: ETHIOPIC SYLLABLE MI*/
- RTUNI_ALPHA, /* U+00121b: ETHIOPIC SYLLABLE MAA*/
- RTUNI_ALPHA, /* U+00121c: ETHIOPIC SYLLABLE MEE*/
- RTUNI_ALPHA, /* U+00121d: ETHIOPIC SYLLABLE ME*/
- RTUNI_ALPHA, /* U+00121e: ETHIOPIC SYLLABLE MO*/
- RTUNI_ALPHA, /* U+00121f: ETHIOPIC SYLLABLE MWA*/
- RTUNI_ALPHA, /* U+001220: ETHIOPIC SYLLABLE SZA*/
- RTUNI_ALPHA, /* U+001221: ETHIOPIC SYLLABLE SZU*/
- RTUNI_ALPHA, /* U+001222: ETHIOPIC SYLLABLE SZI*/
- RTUNI_ALPHA, /* U+001223: ETHIOPIC SYLLABLE SZAA*/
- RTUNI_ALPHA, /* U+001224: ETHIOPIC SYLLABLE SZEE*/
- RTUNI_ALPHA, /* U+001225: ETHIOPIC SYLLABLE SZE*/
- RTUNI_ALPHA, /* U+001226: ETHIOPIC SYLLABLE SZO*/
- RTUNI_ALPHA, /* U+001227: ETHIOPIC SYLLABLE SZWA*/
- RTUNI_ALPHA, /* U+001228: ETHIOPIC SYLLABLE RA*/
- RTUNI_ALPHA, /* U+001229: ETHIOPIC SYLLABLE RU*/
- RTUNI_ALPHA, /* U+00122a: ETHIOPIC SYLLABLE RI*/
- RTUNI_ALPHA, /* U+00122b: ETHIOPIC SYLLABLE RAA*/
- RTUNI_ALPHA, /* U+00122c: ETHIOPIC SYLLABLE REE*/
- RTUNI_ALPHA, /* U+00122d: ETHIOPIC SYLLABLE RE*/
- RTUNI_ALPHA, /* U+00122e: ETHIOPIC SYLLABLE RO*/
- RTUNI_ALPHA, /* U+00122f: ETHIOPIC SYLLABLE RWA*/
- RTUNI_ALPHA, /* U+001230: ETHIOPIC SYLLABLE SA*/
- RTUNI_ALPHA, /* U+001231: ETHIOPIC SYLLABLE SU*/
- RTUNI_ALPHA, /* U+001232: ETHIOPIC SYLLABLE SI*/
- RTUNI_ALPHA, /* U+001233: ETHIOPIC SYLLABLE SAA*/
- RTUNI_ALPHA, /* U+001234: ETHIOPIC SYLLABLE SEE*/
- RTUNI_ALPHA, /* U+001235: ETHIOPIC SYLLABLE SE*/
- RTUNI_ALPHA, /* U+001236: ETHIOPIC SYLLABLE SO*/
- RTUNI_ALPHA, /* U+001237: ETHIOPIC SYLLABLE SWA*/
- RTUNI_ALPHA, /* U+001238: ETHIOPIC SYLLABLE SHA*/
- RTUNI_ALPHA, /* U+001239: ETHIOPIC SYLLABLE SHU*/
- RTUNI_ALPHA, /* U+00123a: ETHIOPIC SYLLABLE SHI*/
- RTUNI_ALPHA, /* U+00123b: ETHIOPIC SYLLABLE SHAA*/
- RTUNI_ALPHA, /* U+00123c: ETHIOPIC SYLLABLE SHEE*/
- RTUNI_ALPHA, /* U+00123d: ETHIOPIC SYLLABLE SHE*/
- RTUNI_ALPHA, /* U+00123e: ETHIOPIC SYLLABLE SHO*/
- RTUNI_ALPHA, /* U+00123f: ETHIOPIC SYLLABLE SHWA*/
- RTUNI_ALPHA, /* U+001240: ETHIOPIC SYLLABLE QA*/
- RTUNI_ALPHA, /* U+001241: ETHIOPIC SYLLABLE QU*/
- RTUNI_ALPHA, /* U+001242: ETHIOPIC SYLLABLE QI*/
- RTUNI_ALPHA, /* U+001243: ETHIOPIC SYLLABLE QAA*/
- RTUNI_ALPHA, /* U+001244: ETHIOPIC SYLLABLE QEE*/
- RTUNI_ALPHA, /* U+001245: ETHIOPIC SYLLABLE QE*/
- RTUNI_ALPHA, /* U+001246: ETHIOPIC SYLLABLE QO*/
- RTUNI_ALPHA, /* U+001247: ETHIOPIC SYLLABLE QOA*/
- RTUNI_ALPHA, /* U+001248: ETHIOPIC SYLLABLE QWA*/
- 0, /* U+001249: */
- RTUNI_ALPHA, /* U+00124a: ETHIOPIC SYLLABLE QWI*/
- RTUNI_ALPHA, /* U+00124b: ETHIOPIC SYLLABLE QWAA*/
- RTUNI_ALPHA, /* U+00124c: ETHIOPIC SYLLABLE QWEE*/
- RTUNI_ALPHA, /* U+00124d: ETHIOPIC SYLLABLE QWE*/
- 0, /* U+00124e: */
- 0, /* U+00124f: */
- RTUNI_ALPHA, /* U+001250: ETHIOPIC SYLLABLE QHA*/
- RTUNI_ALPHA, /* U+001251: ETHIOPIC SYLLABLE QHU*/
- RTUNI_ALPHA, /* U+001252: ETHIOPIC SYLLABLE QHI*/
- RTUNI_ALPHA, /* U+001253: ETHIOPIC SYLLABLE QHAA*/
- RTUNI_ALPHA, /* U+001254: ETHIOPIC SYLLABLE QHEE*/
- RTUNI_ALPHA, /* U+001255: ETHIOPIC SYLLABLE QHE*/
- RTUNI_ALPHA, /* U+001256: ETHIOPIC SYLLABLE QHO*/
- 0, /* U+001257: */
- RTUNI_ALPHA, /* U+001258: ETHIOPIC SYLLABLE QHWA*/
- 0, /* U+001259: */
- RTUNI_ALPHA, /* U+00125a: ETHIOPIC SYLLABLE QHWI*/
- RTUNI_ALPHA, /* U+00125b: ETHIOPIC SYLLABLE QHWAA*/
- RTUNI_ALPHA, /* U+00125c: ETHIOPIC SYLLABLE QHWEE*/
- RTUNI_ALPHA, /* U+00125d: ETHIOPIC SYLLABLE QHWE*/
- 0, /* U+00125e: */
- 0, /* U+00125f: */
- RTUNI_ALPHA, /* U+001260: ETHIOPIC SYLLABLE BA*/
- RTUNI_ALPHA, /* U+001261: ETHIOPIC SYLLABLE BU*/
- RTUNI_ALPHA, /* U+001262: ETHIOPIC SYLLABLE BI*/
- RTUNI_ALPHA, /* U+001263: ETHIOPIC SYLLABLE BAA*/
- RTUNI_ALPHA, /* U+001264: ETHIOPIC SYLLABLE BEE*/
- RTUNI_ALPHA, /* U+001265: ETHIOPIC SYLLABLE BE*/
- RTUNI_ALPHA, /* U+001266: ETHIOPIC SYLLABLE BO*/
- RTUNI_ALPHA, /* U+001267: ETHIOPIC SYLLABLE BWA*/
- RTUNI_ALPHA, /* U+001268: ETHIOPIC SYLLABLE VA*/
- RTUNI_ALPHA, /* U+001269: ETHIOPIC SYLLABLE VU*/
- RTUNI_ALPHA, /* U+00126a: ETHIOPIC SYLLABLE VI*/
- RTUNI_ALPHA, /* U+00126b: ETHIOPIC SYLLABLE VAA*/
- RTUNI_ALPHA, /* U+00126c: ETHIOPIC SYLLABLE VEE*/
- RTUNI_ALPHA, /* U+00126d: ETHIOPIC SYLLABLE VE*/
- RTUNI_ALPHA, /* U+00126e: ETHIOPIC SYLLABLE VO*/
- RTUNI_ALPHA, /* U+00126f: ETHIOPIC SYLLABLE VWA*/
- RTUNI_ALPHA, /* U+001270: ETHIOPIC SYLLABLE TA*/
- RTUNI_ALPHA, /* U+001271: ETHIOPIC SYLLABLE TU*/
- RTUNI_ALPHA, /* U+001272: ETHIOPIC SYLLABLE TI*/
- RTUNI_ALPHA, /* U+001273: ETHIOPIC SYLLABLE TAA*/
- RTUNI_ALPHA, /* U+001274: ETHIOPIC SYLLABLE TEE*/
- RTUNI_ALPHA, /* U+001275: ETHIOPIC SYLLABLE TE*/
- RTUNI_ALPHA, /* U+001276: ETHIOPIC SYLLABLE TO*/
- RTUNI_ALPHA, /* U+001277: ETHIOPIC SYLLABLE TWA*/
- RTUNI_ALPHA, /* U+001278: ETHIOPIC SYLLABLE CA*/
- RTUNI_ALPHA, /* U+001279: ETHIOPIC SYLLABLE CU*/
- RTUNI_ALPHA, /* U+00127a: ETHIOPIC SYLLABLE CI*/
- RTUNI_ALPHA, /* U+00127b: ETHIOPIC SYLLABLE CAA*/
- RTUNI_ALPHA, /* U+00127c: ETHIOPIC SYLLABLE CEE*/
- RTUNI_ALPHA, /* U+00127d: ETHIOPIC SYLLABLE CE*/
- RTUNI_ALPHA, /* U+00127e: ETHIOPIC SYLLABLE CO*/
- RTUNI_ALPHA, /* U+00127f: ETHIOPIC SYLLABLE CWA*/
- RTUNI_ALPHA, /* U+001280: ETHIOPIC SYLLABLE XA*/
- RTUNI_ALPHA, /* U+001281: ETHIOPIC SYLLABLE XU*/
- RTUNI_ALPHA, /* U+001282: ETHIOPIC SYLLABLE XI*/
- RTUNI_ALPHA, /* U+001283: ETHIOPIC SYLLABLE XAA*/
- RTUNI_ALPHA, /* U+001284: ETHIOPIC SYLLABLE XEE*/
- RTUNI_ALPHA, /* U+001285: ETHIOPIC SYLLABLE XE*/
- RTUNI_ALPHA, /* U+001286: ETHIOPIC SYLLABLE XO*/
- RTUNI_ALPHA, /* U+001287: ETHIOPIC SYLLABLE XOA*/
- RTUNI_ALPHA, /* U+001288: ETHIOPIC SYLLABLE XWA*/
- 0, /* U+001289: */
- RTUNI_ALPHA, /* U+00128a: ETHIOPIC SYLLABLE XWI*/
- RTUNI_ALPHA, /* U+00128b: ETHIOPIC SYLLABLE XWAA*/
- RTUNI_ALPHA, /* U+00128c: ETHIOPIC SYLLABLE XWEE*/
- RTUNI_ALPHA, /* U+00128d: ETHIOPIC SYLLABLE XWE*/
- 0, /* U+00128e: */
- 0, /* U+00128f: */
- RTUNI_ALPHA, /* U+001290: ETHIOPIC SYLLABLE NA*/
- RTUNI_ALPHA, /* U+001291: ETHIOPIC SYLLABLE NU*/
- RTUNI_ALPHA, /* U+001292: ETHIOPIC SYLLABLE NI*/
- RTUNI_ALPHA, /* U+001293: ETHIOPIC SYLLABLE NAA*/
- RTUNI_ALPHA, /* U+001294: ETHIOPIC SYLLABLE NEE*/
- RTUNI_ALPHA, /* U+001295: ETHIOPIC SYLLABLE NE*/
- RTUNI_ALPHA, /* U+001296: ETHIOPIC SYLLABLE NO*/
- RTUNI_ALPHA, /* U+001297: ETHIOPIC SYLLABLE NWA*/
- RTUNI_ALPHA, /* U+001298: ETHIOPIC SYLLABLE NYA*/
- RTUNI_ALPHA, /* U+001299: ETHIOPIC SYLLABLE NYU*/
- RTUNI_ALPHA, /* U+00129a: ETHIOPIC SYLLABLE NYI*/
- RTUNI_ALPHA, /* U+00129b: ETHIOPIC SYLLABLE NYAA*/
- RTUNI_ALPHA, /* U+00129c: ETHIOPIC SYLLABLE NYEE*/
- RTUNI_ALPHA, /* U+00129d: ETHIOPIC SYLLABLE NYE*/
- RTUNI_ALPHA, /* U+00129e: ETHIOPIC SYLLABLE NYO*/
- RTUNI_ALPHA, /* U+00129f: ETHIOPIC SYLLABLE NYWA*/
- RTUNI_ALPHA, /* U+0012a0: ETHIOPIC SYLLABLE GLOTTAL A*/
- RTUNI_ALPHA, /* U+0012a1: ETHIOPIC SYLLABLE GLOTTAL U*/
- RTUNI_ALPHA, /* U+0012a2: ETHIOPIC SYLLABLE GLOTTAL I*/
- RTUNI_ALPHA, /* U+0012a3: ETHIOPIC SYLLABLE GLOTTAL AA*/
- RTUNI_ALPHA, /* U+0012a4: ETHIOPIC SYLLABLE GLOTTAL EE*/
- RTUNI_ALPHA, /* U+0012a5: ETHIOPIC SYLLABLE GLOTTAL E*/
- RTUNI_ALPHA, /* U+0012a6: ETHIOPIC SYLLABLE GLOTTAL O*/
- RTUNI_ALPHA, /* U+0012a7: ETHIOPIC SYLLABLE GLOTTAL WA*/
- RTUNI_ALPHA, /* U+0012a8: ETHIOPIC SYLLABLE KA*/
- RTUNI_ALPHA, /* U+0012a9: ETHIOPIC SYLLABLE KU*/
- RTUNI_ALPHA, /* U+0012aa: ETHIOPIC SYLLABLE KI*/
- RTUNI_ALPHA, /* U+0012ab: ETHIOPIC SYLLABLE KAA*/
- RTUNI_ALPHA, /* U+0012ac: ETHIOPIC SYLLABLE KEE*/
- RTUNI_ALPHA, /* U+0012ad: ETHIOPIC SYLLABLE KE*/
- RTUNI_ALPHA, /* U+0012ae: ETHIOPIC SYLLABLE KO*/
- RTUNI_ALPHA, /* U+0012af: ETHIOPIC SYLLABLE KOA*/
- RTUNI_ALPHA, /* U+0012b0: ETHIOPIC SYLLABLE KWA*/
- 0, /* U+0012b1: */
- RTUNI_ALPHA, /* U+0012b2: ETHIOPIC SYLLABLE KWI*/
- RTUNI_ALPHA, /* U+0012b3: ETHIOPIC SYLLABLE KWAA*/
- RTUNI_ALPHA, /* U+0012b4: ETHIOPIC SYLLABLE KWEE*/
- RTUNI_ALPHA, /* U+0012b5: ETHIOPIC SYLLABLE KWE*/
- 0, /* U+0012b6: */
- 0, /* U+0012b7: */
- RTUNI_ALPHA, /* U+0012b8: ETHIOPIC SYLLABLE KXA*/
- RTUNI_ALPHA, /* U+0012b9: ETHIOPIC SYLLABLE KXU*/
- RTUNI_ALPHA, /* U+0012ba: ETHIOPIC SYLLABLE KXI*/
- RTUNI_ALPHA, /* U+0012bb: ETHIOPIC SYLLABLE KXAA*/
- RTUNI_ALPHA, /* U+0012bc: ETHIOPIC SYLLABLE KXEE*/
- RTUNI_ALPHA, /* U+0012bd: ETHIOPIC SYLLABLE KXE*/
- RTUNI_ALPHA, /* U+0012be: ETHIOPIC SYLLABLE KXO*/
- 0, /* U+0012bf: */
- RTUNI_ALPHA, /* U+0012c0: ETHIOPIC SYLLABLE KXWA*/
- 0, /* U+0012c1: */
- RTUNI_ALPHA, /* U+0012c2: ETHIOPIC SYLLABLE KXWI*/
- RTUNI_ALPHA, /* U+0012c3: ETHIOPIC SYLLABLE KXWAA*/
- RTUNI_ALPHA, /* U+0012c4: ETHIOPIC SYLLABLE KXWEE*/
- RTUNI_ALPHA, /* U+0012c5: ETHIOPIC SYLLABLE KXWE*/
- 0, /* U+0012c6: */
- 0, /* U+0012c7: */
- RTUNI_ALPHA, /* U+0012c8: ETHIOPIC SYLLABLE WA*/
- RTUNI_ALPHA, /* U+0012c9: ETHIOPIC SYLLABLE WU*/
- RTUNI_ALPHA, /* U+0012ca: ETHIOPIC SYLLABLE WI*/
- RTUNI_ALPHA, /* U+0012cb: ETHIOPIC SYLLABLE WAA*/
- RTUNI_ALPHA, /* U+0012cc: ETHIOPIC SYLLABLE WEE*/
- RTUNI_ALPHA, /* U+0012cd: ETHIOPIC SYLLABLE WE*/
- RTUNI_ALPHA, /* U+0012ce: ETHIOPIC SYLLABLE WO*/
- RTUNI_ALPHA, /* U+0012cf: ETHIOPIC SYLLABLE WOA*/
- RTUNI_ALPHA, /* U+0012d0: ETHIOPIC SYLLABLE PHARYNGEAL A*/
- RTUNI_ALPHA, /* U+0012d1: ETHIOPIC SYLLABLE PHARYNGEAL U*/
- RTUNI_ALPHA, /* U+0012d2: ETHIOPIC SYLLABLE PHARYNGEAL I*/
- RTUNI_ALPHA, /* U+0012d3: ETHIOPIC SYLLABLE PHARYNGEAL AA*/
- RTUNI_ALPHA, /* U+0012d4: ETHIOPIC SYLLABLE PHARYNGEAL EE*/
- RTUNI_ALPHA, /* U+0012d5: ETHIOPIC SYLLABLE PHARYNGEAL E*/
- RTUNI_ALPHA, /* U+0012d6: ETHIOPIC SYLLABLE PHARYNGEAL O*/
- 0, /* U+0012d7: */
- RTUNI_ALPHA, /* U+0012d8: ETHIOPIC SYLLABLE ZA*/
- RTUNI_ALPHA, /* U+0012d9: ETHIOPIC SYLLABLE ZU*/
- RTUNI_ALPHA, /* U+0012da: ETHIOPIC SYLLABLE ZI*/
- RTUNI_ALPHA, /* U+0012db: ETHIOPIC SYLLABLE ZAA*/
- RTUNI_ALPHA, /* U+0012dc: ETHIOPIC SYLLABLE ZEE*/
- RTUNI_ALPHA, /* U+0012dd: ETHIOPIC SYLLABLE ZE*/
- RTUNI_ALPHA, /* U+0012de: ETHIOPIC SYLLABLE ZO*/
- RTUNI_ALPHA, /* U+0012df: ETHIOPIC SYLLABLE ZWA*/
- RTUNI_ALPHA, /* U+0012e0: ETHIOPIC SYLLABLE ZHA*/
- RTUNI_ALPHA, /* U+0012e1: ETHIOPIC SYLLABLE ZHU*/
- RTUNI_ALPHA, /* U+0012e2: ETHIOPIC SYLLABLE ZHI*/
- RTUNI_ALPHA, /* U+0012e3: ETHIOPIC SYLLABLE ZHAA*/
- RTUNI_ALPHA, /* U+0012e4: ETHIOPIC SYLLABLE ZHEE*/
- RTUNI_ALPHA, /* U+0012e5: ETHIOPIC SYLLABLE ZHE*/
- RTUNI_ALPHA, /* U+0012e6: ETHIOPIC SYLLABLE ZHO*/
- RTUNI_ALPHA, /* U+0012e7: ETHIOPIC SYLLABLE ZHWA*/
- RTUNI_ALPHA, /* U+0012e8: ETHIOPIC SYLLABLE YA*/
- RTUNI_ALPHA, /* U+0012e9: ETHIOPIC SYLLABLE YU*/
- RTUNI_ALPHA, /* U+0012ea: ETHIOPIC SYLLABLE YI*/
- RTUNI_ALPHA, /* U+0012eb: ETHIOPIC SYLLABLE YAA*/
- RTUNI_ALPHA, /* U+0012ec: ETHIOPIC SYLLABLE YEE*/
- RTUNI_ALPHA, /* U+0012ed: ETHIOPIC SYLLABLE YE*/
- RTUNI_ALPHA, /* U+0012ee: ETHIOPIC SYLLABLE YO*/
- RTUNI_ALPHA, /* U+0012ef: ETHIOPIC SYLLABLE YOA*/
- RTUNI_ALPHA, /* U+0012f0: ETHIOPIC SYLLABLE DA*/
- RTUNI_ALPHA, /* U+0012f1: ETHIOPIC SYLLABLE DU*/
- RTUNI_ALPHA, /* U+0012f2: ETHIOPIC SYLLABLE DI*/
- RTUNI_ALPHA, /* U+0012f3: ETHIOPIC SYLLABLE DAA*/
- RTUNI_ALPHA, /* U+0012f4: ETHIOPIC SYLLABLE DEE*/
- RTUNI_ALPHA, /* U+0012f5: ETHIOPIC SYLLABLE DE*/
- RTUNI_ALPHA, /* U+0012f6: ETHIOPIC SYLLABLE DO*/
- RTUNI_ALPHA, /* U+0012f7: ETHIOPIC SYLLABLE DWA*/
- RTUNI_ALPHA, /* U+0012f8: ETHIOPIC SYLLABLE DDA*/
- RTUNI_ALPHA, /* U+0012f9: ETHIOPIC SYLLABLE DDU*/
- RTUNI_ALPHA, /* U+0012fa: ETHIOPIC SYLLABLE DDI*/
- RTUNI_ALPHA, /* U+0012fb: ETHIOPIC SYLLABLE DDAA*/
- RTUNI_ALPHA, /* U+0012fc: ETHIOPIC SYLLABLE DDEE*/
- RTUNI_ALPHA, /* U+0012fd: ETHIOPIC SYLLABLE DDE*/
- RTUNI_ALPHA, /* U+0012fe: ETHIOPIC SYLLABLE DDO*/
- RTUNI_ALPHA, /* U+0012ff: ETHIOPIC SYLLABLE DDWA*/
- RTUNI_ALPHA, /* U+001300: ETHIOPIC SYLLABLE JA*/
- RTUNI_ALPHA, /* U+001301: ETHIOPIC SYLLABLE JU*/
- RTUNI_ALPHA, /* U+001302: ETHIOPIC SYLLABLE JI*/
- RTUNI_ALPHA, /* U+001303: ETHIOPIC SYLLABLE JAA*/
- RTUNI_ALPHA, /* U+001304: ETHIOPIC SYLLABLE JEE*/
- RTUNI_ALPHA, /* U+001305: ETHIOPIC SYLLABLE JE*/
- RTUNI_ALPHA, /* U+001306: ETHIOPIC SYLLABLE JO*/
- RTUNI_ALPHA, /* U+001307: ETHIOPIC SYLLABLE JWA*/
- RTUNI_ALPHA, /* U+001308: ETHIOPIC SYLLABLE GA*/
- RTUNI_ALPHA, /* U+001309: ETHIOPIC SYLLABLE GU*/
- RTUNI_ALPHA, /* U+00130a: ETHIOPIC SYLLABLE GI*/
- RTUNI_ALPHA, /* U+00130b: ETHIOPIC SYLLABLE GAA*/
- RTUNI_ALPHA, /* U+00130c: ETHIOPIC SYLLABLE GEE*/
- RTUNI_ALPHA, /* U+00130d: ETHIOPIC SYLLABLE GE*/
- RTUNI_ALPHA, /* U+00130e: ETHIOPIC SYLLABLE GO*/
- RTUNI_ALPHA, /* U+00130f: ETHIOPIC SYLLABLE GOA*/
- RTUNI_ALPHA, /* U+001310: ETHIOPIC SYLLABLE GWA*/
- 0, /* U+001311: */
- RTUNI_ALPHA, /* U+001312: ETHIOPIC SYLLABLE GWI*/
- RTUNI_ALPHA, /* U+001313: ETHIOPIC SYLLABLE GWAA*/
- RTUNI_ALPHA, /* U+001314: ETHIOPIC SYLLABLE GWEE*/
- RTUNI_ALPHA, /* U+001315: ETHIOPIC SYLLABLE GWE*/
- 0, /* U+001316: */
- 0, /* U+001317: */
- RTUNI_ALPHA, /* U+001318: ETHIOPIC SYLLABLE GGA*/
- RTUNI_ALPHA, /* U+001319: ETHIOPIC SYLLABLE GGU*/
- RTUNI_ALPHA, /* U+00131a: ETHIOPIC SYLLABLE GGI*/
- RTUNI_ALPHA, /* U+00131b: ETHIOPIC SYLLABLE GGAA*/
- RTUNI_ALPHA, /* U+00131c: ETHIOPIC SYLLABLE GGEE*/
- RTUNI_ALPHA, /* U+00131d: ETHIOPIC SYLLABLE GGE*/
- RTUNI_ALPHA, /* U+00131e: ETHIOPIC SYLLABLE GGO*/
- RTUNI_ALPHA, /* U+00131f: ETHIOPIC SYLLABLE GGWAA*/
- RTUNI_ALPHA, /* U+001320: ETHIOPIC SYLLABLE THA*/
- RTUNI_ALPHA, /* U+001321: ETHIOPIC SYLLABLE THU*/
- RTUNI_ALPHA, /* U+001322: ETHIOPIC SYLLABLE THI*/
- RTUNI_ALPHA, /* U+001323: ETHIOPIC SYLLABLE THAA*/
- RTUNI_ALPHA, /* U+001324: ETHIOPIC SYLLABLE THEE*/
- RTUNI_ALPHA, /* U+001325: ETHIOPIC SYLLABLE THE*/
- RTUNI_ALPHA, /* U+001326: ETHIOPIC SYLLABLE THO*/
- RTUNI_ALPHA, /* U+001327: ETHIOPIC SYLLABLE THWA*/
- RTUNI_ALPHA, /* U+001328: ETHIOPIC SYLLABLE CHA*/
- RTUNI_ALPHA, /* U+001329: ETHIOPIC SYLLABLE CHU*/
- RTUNI_ALPHA, /* U+00132a: ETHIOPIC SYLLABLE CHI*/
- RTUNI_ALPHA, /* U+00132b: ETHIOPIC SYLLABLE CHAA*/
- RTUNI_ALPHA, /* U+00132c: ETHIOPIC SYLLABLE CHEE*/
- RTUNI_ALPHA, /* U+00132d: ETHIOPIC SYLLABLE CHE*/
- RTUNI_ALPHA, /* U+00132e: ETHIOPIC SYLLABLE CHO*/
- RTUNI_ALPHA, /* U+00132f: ETHIOPIC SYLLABLE CHWA*/
- RTUNI_ALPHA, /* U+001330: ETHIOPIC SYLLABLE PHA*/
- RTUNI_ALPHA, /* U+001331: ETHIOPIC SYLLABLE PHU*/
- RTUNI_ALPHA, /* U+001332: ETHIOPIC SYLLABLE PHI*/
- RTUNI_ALPHA, /* U+001333: ETHIOPIC SYLLABLE PHAA*/
- RTUNI_ALPHA, /* U+001334: ETHIOPIC SYLLABLE PHEE*/
- RTUNI_ALPHA, /* U+001335: ETHIOPIC SYLLABLE PHE*/
- RTUNI_ALPHA, /* U+001336: ETHIOPIC SYLLABLE PHO*/
- RTUNI_ALPHA, /* U+001337: ETHIOPIC SYLLABLE PHWA*/
- RTUNI_ALPHA, /* U+001338: ETHIOPIC SYLLABLE TSA*/
- RTUNI_ALPHA, /* U+001339: ETHIOPIC SYLLABLE TSU*/
- RTUNI_ALPHA, /* U+00133a: ETHIOPIC SYLLABLE TSI*/
- RTUNI_ALPHA, /* U+00133b: ETHIOPIC SYLLABLE TSAA*/
- RTUNI_ALPHA, /* U+00133c: ETHIOPIC SYLLABLE TSEE*/
- RTUNI_ALPHA, /* U+00133d: ETHIOPIC SYLLABLE TSE*/
- RTUNI_ALPHA, /* U+00133e: ETHIOPIC SYLLABLE TSO*/
- RTUNI_ALPHA, /* U+00133f: ETHIOPIC SYLLABLE TSWA*/
- RTUNI_ALPHA, /* U+001340: ETHIOPIC SYLLABLE TZA*/
- RTUNI_ALPHA, /* U+001341: ETHIOPIC SYLLABLE TZU*/
- RTUNI_ALPHA, /* U+001342: ETHIOPIC SYLLABLE TZI*/
- RTUNI_ALPHA, /* U+001343: ETHIOPIC SYLLABLE TZAA*/
- RTUNI_ALPHA, /* U+001344: ETHIOPIC SYLLABLE TZEE*/
- RTUNI_ALPHA, /* U+001345: ETHIOPIC SYLLABLE TZE*/
- RTUNI_ALPHA, /* U+001346: ETHIOPIC SYLLABLE TZO*/
- RTUNI_ALPHA, /* U+001347: ETHIOPIC SYLLABLE TZOA*/
- RTUNI_ALPHA, /* U+001348: ETHIOPIC SYLLABLE FA*/
- RTUNI_ALPHA, /* U+001349: ETHIOPIC SYLLABLE FU*/
- RTUNI_ALPHA, /* U+00134a: ETHIOPIC SYLLABLE FI*/
- RTUNI_ALPHA, /* U+00134b: ETHIOPIC SYLLABLE FAA*/
- RTUNI_ALPHA, /* U+00134c: ETHIOPIC SYLLABLE FEE*/
- RTUNI_ALPHA, /* U+00134d: ETHIOPIC SYLLABLE FE*/
- RTUNI_ALPHA, /* U+00134e: ETHIOPIC SYLLABLE FO*/
- RTUNI_ALPHA, /* U+00134f: ETHIOPIC SYLLABLE FWA*/
- RTUNI_ALPHA, /* U+001350: ETHIOPIC SYLLABLE PA*/
- RTUNI_ALPHA, /* U+001351: ETHIOPIC SYLLABLE PU*/
- RTUNI_ALPHA, /* U+001352: ETHIOPIC SYLLABLE PI*/
- RTUNI_ALPHA, /* U+001353: ETHIOPIC SYLLABLE PAA*/
- RTUNI_ALPHA, /* U+001354: ETHIOPIC SYLLABLE PEE*/
- RTUNI_ALPHA, /* U+001355: ETHIOPIC SYLLABLE PE*/
- RTUNI_ALPHA, /* U+001356: ETHIOPIC SYLLABLE PO*/
- RTUNI_ALPHA, /* U+001357: ETHIOPIC SYLLABLE PWA*/
- RTUNI_ALPHA, /* U+001358: ETHIOPIC SYLLABLE RYA*/
- RTUNI_ALPHA, /* U+001359: ETHIOPIC SYLLABLE MYA*/
- RTUNI_ALPHA, /* U+00135a: ETHIOPIC SYLLABLE FYA*/
- 0, /* U+00135b: */
- 0, /* U+00135c: */
- 0, /* U+00135d: */
- 0, /* U+00135e: */
- RTUNI_ALPHA, /* U+00135f: ETHIOPIC COMBINING GEMINATION MARK*/
- 0, /* U+001360: ETHIOPIC SECTION MARK*/
- 0, /* U+001361: ETHIOPIC WORDSPACE*/
- 0, /* U+001362: ETHIOPIC FULL STOP*/
- 0, /* U+001363: ETHIOPIC COMMA*/
- 0, /* U+001364: ETHIOPIC SEMICOLON*/
- 0, /* U+001365: ETHIOPIC COLON*/
- 0, /* U+001366: ETHIOPIC PREFACE COLON*/
- 0, /* U+001367: ETHIOPIC QUESTION MARK*/
- 0, /* U+001368: ETHIOPIC PARAGRAPH SEPARATOR*/
- 0, /* U+001369: ETHIOPIC DIGIT ONE*/
- 0, /* U+00136a: ETHIOPIC DIGIT TWO*/
- 0, /* U+00136b: ETHIOPIC DIGIT THREE*/
- 0, /* U+00136c: ETHIOPIC DIGIT FOUR*/
- 0, /* U+00136d: ETHIOPIC DIGIT FIVE*/
- 0, /* U+00136e: ETHIOPIC DIGIT SIX*/
- 0, /* U+00136f: ETHIOPIC DIGIT SEVEN*/
- 0, /* U+001370: ETHIOPIC DIGIT EIGHT*/
- 0, /* U+001371: ETHIOPIC DIGIT NINE*/
- 0, /* U+001372: ETHIOPIC NUMBER TEN*/
- 0, /* U+001373: ETHIOPIC NUMBER TWENTY*/
- 0, /* U+001374: ETHIOPIC NUMBER THIRTY*/
- 0, /* U+001375: ETHIOPIC NUMBER FORTY*/
- 0, /* U+001376: ETHIOPIC NUMBER FIFTY*/
- 0, /* U+001377: ETHIOPIC NUMBER SIXTY*/
- 0, /* U+001378: ETHIOPIC NUMBER SEVENTY*/
- 0, /* U+001379: ETHIOPIC NUMBER EIGHTY*/
- 0, /* U+00137a: ETHIOPIC NUMBER NINETY*/
- 0, /* U+00137b: ETHIOPIC NUMBER HUNDRED*/
- 0, /* U+00137c: ETHIOPIC NUMBER TEN THOUSAND*/
- 0, /* U+00137d: */
- 0, /* U+00137e: */
- 0, /* U+00137f: */
- RTUNI_ALPHA, /* U+001380: ETHIOPIC SYLLABLE SEBATBEIT MWA*/
- RTUNI_ALPHA, /* U+001381: ETHIOPIC SYLLABLE MWI*/
- RTUNI_ALPHA, /* U+001382: ETHIOPIC SYLLABLE MWEE*/
- RTUNI_ALPHA, /* U+001383: ETHIOPIC SYLLABLE MWE*/
- RTUNI_ALPHA, /* U+001384: ETHIOPIC SYLLABLE SEBATBEIT BWA*/
- RTUNI_ALPHA, /* U+001385: ETHIOPIC SYLLABLE BWI*/
- RTUNI_ALPHA, /* U+001386: ETHIOPIC SYLLABLE BWEE*/
- RTUNI_ALPHA, /* U+001387: ETHIOPIC SYLLABLE BWE*/
- RTUNI_ALPHA, /* U+001388: ETHIOPIC SYLLABLE SEBATBEIT FWA*/
- RTUNI_ALPHA, /* U+001389: ETHIOPIC SYLLABLE FWI*/
- RTUNI_ALPHA, /* U+00138a: ETHIOPIC SYLLABLE FWEE*/
- RTUNI_ALPHA, /* U+00138b: ETHIOPIC SYLLABLE FWE*/
- RTUNI_ALPHA, /* U+00138c: ETHIOPIC SYLLABLE SEBATBEIT PWA*/
- RTUNI_ALPHA, /* U+00138d: ETHIOPIC SYLLABLE PWI*/
- RTUNI_ALPHA, /* U+00138e: ETHIOPIC SYLLABLE PWEE*/
- RTUNI_ALPHA, /* U+00138f: ETHIOPIC SYLLABLE PWE*/
- 0, /* U+001390: ETHIOPIC TONAL MARK YIZET*/
- 0, /* U+001391: ETHIOPIC TONAL MARK DERET*/
- 0, /* U+001392: ETHIOPIC TONAL MARK RIKRIK*/
- 0, /* U+001393: ETHIOPIC TONAL MARK SHORT RIKRIK*/
- 0, /* U+001394: ETHIOPIC TONAL MARK DIFAT*/
- 0, /* U+001395: ETHIOPIC TONAL MARK KENAT*/
- 0, /* U+001396: ETHIOPIC TONAL MARK CHIRET*/
- 0, /* U+001397: ETHIOPIC TONAL MARK HIDET*/
- 0, /* U+001398: ETHIOPIC TONAL MARK DERET-HIDET*/
- 0, /* U+001399: ETHIOPIC TONAL MARK KURT*/
- 0, /* U+00139a: */
- 0, /* U+00139b: */
- 0, /* U+00139c: */
- 0, /* U+00139d: */
- 0, /* U+00139e: */
- 0, /* U+00139f: */
- RTUNI_ALPHA, /* U+0013a0: CHEROKEE LETTER A*/
- RTUNI_ALPHA, /* U+0013a1: CHEROKEE LETTER E*/
- RTUNI_ALPHA, /* U+0013a2: CHEROKEE LETTER I*/
- RTUNI_ALPHA, /* U+0013a3: CHEROKEE LETTER O*/
- RTUNI_ALPHA, /* U+0013a4: CHEROKEE LETTER U*/
- RTUNI_ALPHA, /* U+0013a5: CHEROKEE LETTER V*/
- RTUNI_ALPHA, /* U+0013a6: CHEROKEE LETTER GA*/
- RTUNI_ALPHA, /* U+0013a7: CHEROKEE LETTER KA*/
- RTUNI_ALPHA, /* U+0013a8: CHEROKEE LETTER GE*/
- RTUNI_ALPHA, /* U+0013a9: CHEROKEE LETTER GI*/
- RTUNI_ALPHA, /* U+0013aa: CHEROKEE LETTER GO*/
- RTUNI_ALPHA, /* U+0013ab: CHEROKEE LETTER GU*/
- RTUNI_ALPHA, /* U+0013ac: CHEROKEE LETTER GV*/
- RTUNI_ALPHA, /* U+0013ad: CHEROKEE LETTER HA*/
- RTUNI_ALPHA, /* U+0013ae: CHEROKEE LETTER HE*/
- RTUNI_ALPHA, /* U+0013af: CHEROKEE LETTER HI*/
- RTUNI_ALPHA, /* U+0013b0: CHEROKEE LETTER HO*/
- RTUNI_ALPHA, /* U+0013b1: CHEROKEE LETTER HU*/
- RTUNI_ALPHA, /* U+0013b2: CHEROKEE LETTER HV*/
- RTUNI_ALPHA, /* U+0013b3: CHEROKEE LETTER LA*/
- RTUNI_ALPHA, /* U+0013b4: CHEROKEE LETTER LE*/
- RTUNI_ALPHA, /* U+0013b5: CHEROKEE LETTER LI*/
- RTUNI_ALPHA, /* U+0013b6: CHEROKEE LETTER LO*/
- RTUNI_ALPHA, /* U+0013b7: CHEROKEE LETTER LU*/
- RTUNI_ALPHA, /* U+0013b8: CHEROKEE LETTER LV*/
- RTUNI_ALPHA, /* U+0013b9: CHEROKEE LETTER MA*/
- RTUNI_ALPHA, /* U+0013ba: CHEROKEE LETTER ME*/
- RTUNI_ALPHA, /* U+0013bb: CHEROKEE LETTER MI*/
- RTUNI_ALPHA, /* U+0013bc: CHEROKEE LETTER MO*/
- RTUNI_ALPHA, /* U+0013bd: CHEROKEE LETTER MU*/
- RTUNI_ALPHA, /* U+0013be: CHEROKEE LETTER NA*/
- RTUNI_ALPHA, /* U+0013bf: CHEROKEE LETTER HNA*/
- RTUNI_ALPHA, /* U+0013c0: CHEROKEE LETTER NAH*/
- RTUNI_ALPHA, /* U+0013c1: CHEROKEE LETTER NE*/
- RTUNI_ALPHA, /* U+0013c2: CHEROKEE LETTER NI*/
- RTUNI_ALPHA, /* U+0013c3: CHEROKEE LETTER NO*/
- RTUNI_ALPHA, /* U+0013c4: CHEROKEE LETTER NU*/
- RTUNI_ALPHA, /* U+0013c5: CHEROKEE LETTER NV*/
- RTUNI_ALPHA, /* U+0013c6: CHEROKEE LETTER QUA*/
- RTUNI_ALPHA, /* U+0013c7: CHEROKEE LETTER QUE*/
- RTUNI_ALPHA, /* U+0013c8: CHEROKEE LETTER QUI*/
- RTUNI_ALPHA, /* U+0013c9: CHEROKEE LETTER QUO*/
- RTUNI_ALPHA, /* U+0013ca: CHEROKEE LETTER QUU*/
- RTUNI_ALPHA, /* U+0013cb: CHEROKEE LETTER QUV*/
- RTUNI_ALPHA, /* U+0013cc: CHEROKEE LETTER SA*/
- RTUNI_ALPHA, /* U+0013cd: CHEROKEE LETTER S*/
- RTUNI_ALPHA, /* U+0013ce: CHEROKEE LETTER SE*/
- RTUNI_ALPHA, /* U+0013cf: CHEROKEE LETTER SI*/
- RTUNI_ALPHA, /* U+0013d0: CHEROKEE LETTER SO*/
- RTUNI_ALPHA, /* U+0013d1: CHEROKEE LETTER SU*/
- RTUNI_ALPHA, /* U+0013d2: CHEROKEE LETTER SV*/
- RTUNI_ALPHA, /* U+0013d3: CHEROKEE LETTER DA*/
- RTUNI_ALPHA, /* U+0013d4: CHEROKEE LETTER TA*/
- RTUNI_ALPHA, /* U+0013d5: CHEROKEE LETTER DE*/
- RTUNI_ALPHA, /* U+0013d6: CHEROKEE LETTER TE*/
- RTUNI_ALPHA, /* U+0013d7: CHEROKEE LETTER DI*/
- RTUNI_ALPHA, /* U+0013d8: CHEROKEE LETTER TI*/
- RTUNI_ALPHA, /* U+0013d9: CHEROKEE LETTER DO*/
- RTUNI_ALPHA, /* U+0013da: CHEROKEE LETTER DU*/
- RTUNI_ALPHA, /* U+0013db: CHEROKEE LETTER DV*/
- RTUNI_ALPHA, /* U+0013dc: CHEROKEE LETTER DLA*/
- RTUNI_ALPHA, /* U+0013dd: CHEROKEE LETTER TLA*/
- RTUNI_ALPHA, /* U+0013de: CHEROKEE LETTER TLE*/
- RTUNI_ALPHA, /* U+0013df: CHEROKEE LETTER TLI*/
- RTUNI_ALPHA, /* U+0013e0: CHEROKEE LETTER TLO*/
- RTUNI_ALPHA, /* U+0013e1: CHEROKEE LETTER TLU*/
- RTUNI_ALPHA, /* U+0013e2: CHEROKEE LETTER TLV*/
- RTUNI_ALPHA, /* U+0013e3: CHEROKEE LETTER TSA*/
- RTUNI_ALPHA, /* U+0013e4: CHEROKEE LETTER TSE*/
- RTUNI_ALPHA, /* U+0013e5: CHEROKEE LETTER TSI*/
- RTUNI_ALPHA, /* U+0013e6: CHEROKEE LETTER TSO*/
- RTUNI_ALPHA, /* U+0013e7: CHEROKEE LETTER TSU*/
- RTUNI_ALPHA, /* U+0013e8: CHEROKEE LETTER TSV*/
- RTUNI_ALPHA, /* U+0013e9: CHEROKEE LETTER WA*/
- RTUNI_ALPHA, /* U+0013ea: CHEROKEE LETTER WE*/
- RTUNI_ALPHA, /* U+0013eb: CHEROKEE LETTER WI*/
- RTUNI_ALPHA, /* U+0013ec: CHEROKEE LETTER WO*/
- RTUNI_ALPHA, /* U+0013ed: CHEROKEE LETTER WU*/
- RTUNI_ALPHA, /* U+0013ee: CHEROKEE LETTER WV*/
- RTUNI_ALPHA, /* U+0013ef: CHEROKEE LETTER YA*/
- RTUNI_ALPHA, /* U+0013f0: CHEROKEE LETTER YE*/
- RTUNI_ALPHA, /* U+0013f1: CHEROKEE LETTER YI*/
- RTUNI_ALPHA, /* U+0013f2: CHEROKEE LETTER YO*/
- RTUNI_ALPHA, /* U+0013f3: CHEROKEE LETTER YU*/
- RTUNI_ALPHA, /* U+0013f4: CHEROKEE LETTER YV*/
- 0, /* U+0013f5: */
- 0, /* U+0013f6: */
- 0, /* U+0013f7: */
- 0, /* U+0013f8: */
- 0, /* U+0013f9: */
- 0, /* U+0013fa: */
- 0, /* U+0013fb: */
- 0, /* U+0013fc: */
- 0, /* U+0013fd: */
- 0, /* U+0013fe: */
- 0, /* U+0013ff: */
- 0, /* U+001400: */
- RTUNI_ALPHA, /* U+001401: CANADIAN SYLLABICS E*/
- RTUNI_ALPHA, /* U+001402: CANADIAN SYLLABICS AAI*/
- RTUNI_ALPHA, /* U+001403: CANADIAN SYLLABICS I*/
- RTUNI_ALPHA, /* U+001404: CANADIAN SYLLABICS II*/
- RTUNI_ALPHA, /* U+001405: CANADIAN SYLLABICS O*/
- RTUNI_ALPHA, /* U+001406: CANADIAN SYLLABICS OO*/
- RTUNI_ALPHA, /* U+001407: CANADIAN SYLLABICS Y-CREE OO*/
- RTUNI_ALPHA, /* U+001408: CANADIAN SYLLABICS CARRIER EE*/
- RTUNI_ALPHA, /* U+001409: CANADIAN SYLLABICS CARRIER I*/
- RTUNI_ALPHA, /* U+00140a: CANADIAN SYLLABICS A*/
- RTUNI_ALPHA, /* U+00140b: CANADIAN SYLLABICS AA*/
- RTUNI_ALPHA, /* U+00140c: CANADIAN SYLLABICS WE*/
- RTUNI_ALPHA, /* U+00140d: CANADIAN SYLLABICS WEST-CREE WE*/
- RTUNI_ALPHA, /* U+00140e: CANADIAN SYLLABICS WI*/
- RTUNI_ALPHA, /* U+00140f: CANADIAN SYLLABICS WEST-CREE WI*/
- RTUNI_ALPHA, /* U+001410: CANADIAN SYLLABICS WII*/
- RTUNI_ALPHA, /* U+001411: CANADIAN SYLLABICS WEST-CREE WII*/
- RTUNI_ALPHA, /* U+001412: CANADIAN SYLLABICS WO*/
- RTUNI_ALPHA, /* U+001413: CANADIAN SYLLABICS WEST-CREE WO*/
- RTUNI_ALPHA, /* U+001414: CANADIAN SYLLABICS WOO*/
- RTUNI_ALPHA, /* U+001415: CANADIAN SYLLABICS WEST-CREE WOO*/
- RTUNI_ALPHA, /* U+001416: CANADIAN SYLLABICS NASKAPI WOO*/
- RTUNI_ALPHA, /* U+001417: CANADIAN SYLLABICS WA*/
- RTUNI_ALPHA, /* U+001418: CANADIAN SYLLABICS WEST-CREE WA*/
- RTUNI_ALPHA, /* U+001419: CANADIAN SYLLABICS WAA*/
- RTUNI_ALPHA, /* U+00141a: CANADIAN SYLLABICS WEST-CREE WAA*/
- RTUNI_ALPHA, /* U+00141b: CANADIAN SYLLABICS NASKAPI WAA*/
- RTUNI_ALPHA, /* U+00141c: CANADIAN SYLLABICS AI*/
- RTUNI_ALPHA, /* U+00141d: CANADIAN SYLLABICS Y-CREE W*/
- RTUNI_ALPHA, /* U+00141e: CANADIAN SYLLABICS GLOTTAL STOP*/
- RTUNI_ALPHA, /* U+00141f: CANADIAN SYLLABICS FINAL ACUTE*/
- RTUNI_ALPHA, /* U+001420: CANADIAN SYLLABICS FINAL GRAVE*/
- RTUNI_ALPHA, /* U+001421: CANADIAN SYLLABICS FINAL BOTTOM HALF RING*/
- RTUNI_ALPHA, /* U+001422: CANADIAN SYLLABICS FINAL TOP HALF RING*/
- RTUNI_ALPHA, /* U+001423: CANADIAN SYLLABICS FINAL RIGHT HALF RING*/
- RTUNI_ALPHA, /* U+001424: CANADIAN SYLLABICS FINAL RING*/
- RTUNI_ALPHA, /* U+001425: CANADIAN SYLLABICS FINAL DOUBLE ACUTE*/
- RTUNI_ALPHA, /* U+001426: CANADIAN SYLLABICS FINAL DOUBLE SHORT VERTICAL STROKES*/
- RTUNI_ALPHA, /* U+001427: CANADIAN SYLLABICS FINAL MIDDLE DOT*/
- RTUNI_ALPHA, /* U+001428: CANADIAN SYLLABICS FINAL SHORT HORIZONTAL STROKE*/
- RTUNI_ALPHA, /* U+001429: CANADIAN SYLLABICS FINAL PLUS*/
- RTUNI_ALPHA, /* U+00142a: CANADIAN SYLLABICS FINAL DOWN TACK*/
- RTUNI_ALPHA, /* U+00142b: CANADIAN SYLLABICS EN*/
- RTUNI_ALPHA, /* U+00142c: CANADIAN SYLLABICS IN*/
- RTUNI_ALPHA, /* U+00142d: CANADIAN SYLLABICS ON*/
- RTUNI_ALPHA, /* U+00142e: CANADIAN SYLLABICS AN*/
- RTUNI_ALPHA, /* U+00142f: CANADIAN SYLLABICS PE*/
- RTUNI_ALPHA, /* U+001430: CANADIAN SYLLABICS PAAI*/
- RTUNI_ALPHA, /* U+001431: CANADIAN SYLLABICS PI*/
- RTUNI_ALPHA, /* U+001432: CANADIAN SYLLABICS PII*/
- RTUNI_ALPHA, /* U+001433: CANADIAN SYLLABICS PO*/
- RTUNI_ALPHA, /* U+001434: CANADIAN SYLLABICS POO*/
- RTUNI_ALPHA, /* U+001435: CANADIAN SYLLABICS Y-CREE POO*/
- RTUNI_ALPHA, /* U+001436: CANADIAN SYLLABICS CARRIER HEE*/
- RTUNI_ALPHA, /* U+001437: CANADIAN SYLLABICS CARRIER HI*/
- RTUNI_ALPHA, /* U+001438: CANADIAN SYLLABICS PA*/
- RTUNI_ALPHA, /* U+001439: CANADIAN SYLLABICS PAA*/
- RTUNI_ALPHA, /* U+00143a: CANADIAN SYLLABICS PWE*/
- RTUNI_ALPHA, /* U+00143b: CANADIAN SYLLABICS WEST-CREE PWE*/
- RTUNI_ALPHA, /* U+00143c: CANADIAN SYLLABICS PWI*/
- RTUNI_ALPHA, /* U+00143d: CANADIAN SYLLABICS WEST-CREE PWI*/
- RTUNI_ALPHA, /* U+00143e: CANADIAN SYLLABICS PWII*/
- RTUNI_ALPHA, /* U+00143f: CANADIAN SYLLABICS WEST-CREE PWII*/
- RTUNI_ALPHA, /* U+001440: CANADIAN SYLLABICS PWO*/
- RTUNI_ALPHA, /* U+001441: CANADIAN SYLLABICS WEST-CREE PWO*/
- RTUNI_ALPHA, /* U+001442: CANADIAN SYLLABICS PWOO*/
- RTUNI_ALPHA, /* U+001443: CANADIAN SYLLABICS WEST-CREE PWOO*/
- RTUNI_ALPHA, /* U+001444: CANADIAN SYLLABICS PWA*/
- RTUNI_ALPHA, /* U+001445: CANADIAN SYLLABICS WEST-CREE PWA*/
- RTUNI_ALPHA, /* U+001446: CANADIAN SYLLABICS PWAA*/
- RTUNI_ALPHA, /* U+001447: CANADIAN SYLLABICS WEST-CREE PWAA*/
- RTUNI_ALPHA, /* U+001448: CANADIAN SYLLABICS Y-CREE PWAA*/
- RTUNI_ALPHA, /* U+001449: CANADIAN SYLLABICS P*/
- RTUNI_ALPHA, /* U+00144a: CANADIAN SYLLABICS WEST-CREE P*/
- RTUNI_ALPHA, /* U+00144b: CANADIAN SYLLABICS CARRIER H*/
- RTUNI_ALPHA, /* U+00144c: CANADIAN SYLLABICS TE*/
- RTUNI_ALPHA, /* U+00144d: CANADIAN SYLLABICS TAAI*/
- RTUNI_ALPHA, /* U+00144e: CANADIAN SYLLABICS TI*/
- RTUNI_ALPHA, /* U+00144f: CANADIAN SYLLABICS TII*/
- RTUNI_ALPHA, /* U+001450: CANADIAN SYLLABICS TO*/
- RTUNI_ALPHA, /* U+001451: CANADIAN SYLLABICS TOO*/
- RTUNI_ALPHA, /* U+001452: CANADIAN SYLLABICS Y-CREE TOO*/
- RTUNI_ALPHA, /* U+001453: CANADIAN SYLLABICS CARRIER DEE*/
- RTUNI_ALPHA, /* U+001454: CANADIAN SYLLABICS CARRIER DI*/
- RTUNI_ALPHA, /* U+001455: CANADIAN SYLLABICS TA*/
- RTUNI_ALPHA, /* U+001456: CANADIAN SYLLABICS TAA*/
- RTUNI_ALPHA, /* U+001457: CANADIAN SYLLABICS TWE*/
- RTUNI_ALPHA, /* U+001458: CANADIAN SYLLABICS WEST-CREE TWE*/
- RTUNI_ALPHA, /* U+001459: CANADIAN SYLLABICS TWI*/
- RTUNI_ALPHA, /* U+00145a: CANADIAN SYLLABICS WEST-CREE TWI*/
- RTUNI_ALPHA, /* U+00145b: CANADIAN SYLLABICS TWII*/
- RTUNI_ALPHA, /* U+00145c: CANADIAN SYLLABICS WEST-CREE TWII*/
- RTUNI_ALPHA, /* U+00145d: CANADIAN SYLLABICS TWO*/
- RTUNI_ALPHA, /* U+00145e: CANADIAN SYLLABICS WEST-CREE TWO*/
- RTUNI_ALPHA, /* U+00145f: CANADIAN SYLLABICS TWOO*/
- RTUNI_ALPHA, /* U+001460: CANADIAN SYLLABICS WEST-CREE TWOO*/
- RTUNI_ALPHA, /* U+001461: CANADIAN SYLLABICS TWA*/
- RTUNI_ALPHA, /* U+001462: CANADIAN SYLLABICS WEST-CREE TWA*/
- RTUNI_ALPHA, /* U+001463: CANADIAN SYLLABICS TWAA*/
- RTUNI_ALPHA, /* U+001464: CANADIAN SYLLABICS WEST-CREE TWAA*/
- RTUNI_ALPHA, /* U+001465: CANADIAN SYLLABICS NASKAPI TWAA*/
- RTUNI_ALPHA, /* U+001466: CANADIAN SYLLABICS T*/
- RTUNI_ALPHA, /* U+001467: CANADIAN SYLLABICS TTE*/
- RTUNI_ALPHA, /* U+001468: CANADIAN SYLLABICS TTI*/
- RTUNI_ALPHA, /* U+001469: CANADIAN SYLLABICS TTO*/
- RTUNI_ALPHA, /* U+00146a: CANADIAN SYLLABICS TTA*/
- RTUNI_ALPHA, /* U+00146b: CANADIAN SYLLABICS KE*/
- RTUNI_ALPHA, /* U+00146c: CANADIAN SYLLABICS KAAI*/
- RTUNI_ALPHA, /* U+00146d: CANADIAN SYLLABICS KI*/
- RTUNI_ALPHA, /* U+00146e: CANADIAN SYLLABICS KII*/
- RTUNI_ALPHA, /* U+00146f: CANADIAN SYLLABICS KO*/
- RTUNI_ALPHA, /* U+001470: CANADIAN SYLLABICS KOO*/
- RTUNI_ALPHA, /* U+001471: CANADIAN SYLLABICS Y-CREE KOO*/
- RTUNI_ALPHA, /* U+001472: CANADIAN SYLLABICS KA*/
- RTUNI_ALPHA, /* U+001473: CANADIAN SYLLABICS KAA*/
- RTUNI_ALPHA, /* U+001474: CANADIAN SYLLABICS KWE*/
- RTUNI_ALPHA, /* U+001475: CANADIAN SYLLABICS WEST-CREE KWE*/
- RTUNI_ALPHA, /* U+001476: CANADIAN SYLLABICS KWI*/
- RTUNI_ALPHA, /* U+001477: CANADIAN SYLLABICS WEST-CREE KWI*/
- RTUNI_ALPHA, /* U+001478: CANADIAN SYLLABICS KWII*/
- RTUNI_ALPHA, /* U+001479: CANADIAN SYLLABICS WEST-CREE KWII*/
- RTUNI_ALPHA, /* U+00147a: CANADIAN SYLLABICS KWO*/
- RTUNI_ALPHA, /* U+00147b: CANADIAN SYLLABICS WEST-CREE KWO*/
- RTUNI_ALPHA, /* U+00147c: CANADIAN SYLLABICS KWOO*/
- RTUNI_ALPHA, /* U+00147d: CANADIAN SYLLABICS WEST-CREE KWOO*/
- RTUNI_ALPHA, /* U+00147e: CANADIAN SYLLABICS KWA*/
- RTUNI_ALPHA, /* U+00147f: CANADIAN SYLLABICS WEST-CREE KWA*/
- RTUNI_ALPHA, /* U+001480: CANADIAN SYLLABICS KWAA*/
- RTUNI_ALPHA, /* U+001481: CANADIAN SYLLABICS WEST-CREE KWAA*/
- RTUNI_ALPHA, /* U+001482: CANADIAN SYLLABICS NASKAPI KWAA*/
- RTUNI_ALPHA, /* U+001483: CANADIAN SYLLABICS K*/
- RTUNI_ALPHA, /* U+001484: CANADIAN SYLLABICS KW*/
- RTUNI_ALPHA, /* U+001485: CANADIAN SYLLABICS SOUTH-SLAVEY KEH*/
- RTUNI_ALPHA, /* U+001486: CANADIAN SYLLABICS SOUTH-SLAVEY KIH*/
- RTUNI_ALPHA, /* U+001487: CANADIAN SYLLABICS SOUTH-SLAVEY KOH*/
- RTUNI_ALPHA, /* U+001488: CANADIAN SYLLABICS SOUTH-SLAVEY KAH*/
- RTUNI_ALPHA, /* U+001489: CANADIAN SYLLABICS CE*/
- RTUNI_ALPHA, /* U+00148a: CANADIAN SYLLABICS CAAI*/
- RTUNI_ALPHA, /* U+00148b: CANADIAN SYLLABICS CI*/
- RTUNI_ALPHA, /* U+00148c: CANADIAN SYLLABICS CII*/
- RTUNI_ALPHA, /* U+00148d: CANADIAN SYLLABICS CO*/
- RTUNI_ALPHA, /* U+00148e: CANADIAN SYLLABICS COO*/
- RTUNI_ALPHA, /* U+00148f: CANADIAN SYLLABICS Y-CREE COO*/
- RTUNI_ALPHA, /* U+001490: CANADIAN SYLLABICS CA*/
- RTUNI_ALPHA, /* U+001491: CANADIAN SYLLABICS CAA*/
- RTUNI_ALPHA, /* U+001492: CANADIAN SYLLABICS CWE*/
- RTUNI_ALPHA, /* U+001493: CANADIAN SYLLABICS WEST-CREE CWE*/
- RTUNI_ALPHA, /* U+001494: CANADIAN SYLLABICS CWI*/
- RTUNI_ALPHA, /* U+001495: CANADIAN SYLLABICS WEST-CREE CWI*/
- RTUNI_ALPHA, /* U+001496: CANADIAN SYLLABICS CWII*/
- RTUNI_ALPHA, /* U+001497: CANADIAN SYLLABICS WEST-CREE CWII*/
- RTUNI_ALPHA, /* U+001498: CANADIAN SYLLABICS CWO*/
- RTUNI_ALPHA, /* U+001499: CANADIAN SYLLABICS WEST-CREE CWO*/
- RTUNI_ALPHA, /* U+00149a: CANADIAN SYLLABICS CWOO*/
- RTUNI_ALPHA, /* U+00149b: CANADIAN SYLLABICS WEST-CREE CWOO*/
- RTUNI_ALPHA, /* U+00149c: CANADIAN SYLLABICS CWA*/
- RTUNI_ALPHA, /* U+00149d: CANADIAN SYLLABICS WEST-CREE CWA*/
- RTUNI_ALPHA, /* U+00149e: CANADIAN SYLLABICS CWAA*/
- RTUNI_ALPHA, /* U+00149f: CANADIAN SYLLABICS WEST-CREE CWAA*/
- RTUNI_ALPHA, /* U+0014a0: CANADIAN SYLLABICS NASKAPI CWAA*/
- RTUNI_ALPHA, /* U+0014a1: CANADIAN SYLLABICS C*/
- RTUNI_ALPHA, /* U+0014a2: CANADIAN SYLLABICS SAYISI TH*/
- RTUNI_ALPHA, /* U+0014a3: CANADIAN SYLLABICS ME*/
- RTUNI_ALPHA, /* U+0014a4: CANADIAN SYLLABICS MAAI*/
- RTUNI_ALPHA, /* U+0014a5: CANADIAN SYLLABICS MI*/
- RTUNI_ALPHA, /* U+0014a6: CANADIAN SYLLABICS MII*/
- RTUNI_ALPHA, /* U+0014a7: CANADIAN SYLLABICS MO*/
- RTUNI_ALPHA, /* U+0014a8: CANADIAN SYLLABICS MOO*/
- RTUNI_ALPHA, /* U+0014a9: CANADIAN SYLLABICS Y-CREE MOO*/
- RTUNI_ALPHA, /* U+0014aa: CANADIAN SYLLABICS MA*/
- RTUNI_ALPHA, /* U+0014ab: CANADIAN SYLLABICS MAA*/
- RTUNI_ALPHA, /* U+0014ac: CANADIAN SYLLABICS MWE*/
- RTUNI_ALPHA, /* U+0014ad: CANADIAN SYLLABICS WEST-CREE MWE*/
- RTUNI_ALPHA, /* U+0014ae: CANADIAN SYLLABICS MWI*/
- RTUNI_ALPHA, /* U+0014af: CANADIAN SYLLABICS WEST-CREE MWI*/
- RTUNI_ALPHA, /* U+0014b0: CANADIAN SYLLABICS MWII*/
- RTUNI_ALPHA, /* U+0014b1: CANADIAN SYLLABICS WEST-CREE MWII*/
- RTUNI_ALPHA, /* U+0014b2: CANADIAN SYLLABICS MWO*/
- RTUNI_ALPHA, /* U+0014b3: CANADIAN SYLLABICS WEST-CREE MWO*/
- RTUNI_ALPHA, /* U+0014b4: CANADIAN SYLLABICS MWOO*/
- RTUNI_ALPHA, /* U+0014b5: CANADIAN SYLLABICS WEST-CREE MWOO*/
- RTUNI_ALPHA, /* U+0014b6: CANADIAN SYLLABICS MWA*/
- RTUNI_ALPHA, /* U+0014b7: CANADIAN SYLLABICS WEST-CREE MWA*/
- RTUNI_ALPHA, /* U+0014b8: CANADIAN SYLLABICS MWAA*/
- RTUNI_ALPHA, /* U+0014b9: CANADIAN SYLLABICS WEST-CREE MWAA*/
- RTUNI_ALPHA, /* U+0014ba: CANADIAN SYLLABICS NASKAPI MWAA*/
- RTUNI_ALPHA, /* U+0014bb: CANADIAN SYLLABICS M*/
- RTUNI_ALPHA, /* U+0014bc: CANADIAN SYLLABICS WEST-CREE M*/
- RTUNI_ALPHA, /* U+0014bd: CANADIAN SYLLABICS MH*/
- RTUNI_ALPHA, /* U+0014be: CANADIAN SYLLABICS ATHAPASCAN M*/
- RTUNI_ALPHA, /* U+0014bf: CANADIAN SYLLABICS SAYISI M*/
- RTUNI_ALPHA, /* U+0014c0: CANADIAN SYLLABICS NE*/
- RTUNI_ALPHA, /* U+0014c1: CANADIAN SYLLABICS NAAI*/
- RTUNI_ALPHA, /* U+0014c2: CANADIAN SYLLABICS NI*/
- RTUNI_ALPHA, /* U+0014c3: CANADIAN SYLLABICS NII*/
- RTUNI_ALPHA, /* U+0014c4: CANADIAN SYLLABICS NO*/
- RTUNI_ALPHA, /* U+0014c5: CANADIAN SYLLABICS NOO*/
- RTUNI_ALPHA, /* U+0014c6: CANADIAN SYLLABICS Y-CREE NOO*/
- RTUNI_ALPHA, /* U+0014c7: CANADIAN SYLLABICS NA*/
- RTUNI_ALPHA, /* U+0014c8: CANADIAN SYLLABICS NAA*/
- RTUNI_ALPHA, /* U+0014c9: CANADIAN SYLLABICS NWE*/
- RTUNI_ALPHA, /* U+0014ca: CANADIAN SYLLABICS WEST-CREE NWE*/
- RTUNI_ALPHA, /* U+0014cb: CANADIAN SYLLABICS NWA*/
- RTUNI_ALPHA, /* U+0014cc: CANADIAN SYLLABICS WEST-CREE NWA*/
- RTUNI_ALPHA, /* U+0014cd: CANADIAN SYLLABICS NWAA*/
- RTUNI_ALPHA, /* U+0014ce: CANADIAN SYLLABICS WEST-CREE NWAA*/
- RTUNI_ALPHA, /* U+0014cf: CANADIAN SYLLABICS NASKAPI NWAA*/
- RTUNI_ALPHA, /* U+0014d0: CANADIAN SYLLABICS N*/
- RTUNI_ALPHA, /* U+0014d1: CANADIAN SYLLABICS CARRIER NG*/
- RTUNI_ALPHA, /* U+0014d2: CANADIAN SYLLABICS NH*/
- RTUNI_ALPHA, /* U+0014d3: CANADIAN SYLLABICS LE*/
- RTUNI_ALPHA, /* U+0014d4: CANADIAN SYLLABICS LAAI*/
- RTUNI_ALPHA, /* U+0014d5: CANADIAN SYLLABICS LI*/
- RTUNI_ALPHA, /* U+0014d6: CANADIAN SYLLABICS LII*/
- RTUNI_ALPHA, /* U+0014d7: CANADIAN SYLLABICS LO*/
- RTUNI_ALPHA, /* U+0014d8: CANADIAN SYLLABICS LOO*/
- RTUNI_ALPHA, /* U+0014d9: CANADIAN SYLLABICS Y-CREE LOO*/
- RTUNI_ALPHA, /* U+0014da: CANADIAN SYLLABICS LA*/
- RTUNI_ALPHA, /* U+0014db: CANADIAN SYLLABICS LAA*/
- RTUNI_ALPHA, /* U+0014dc: CANADIAN SYLLABICS LWE*/
- RTUNI_ALPHA, /* U+0014dd: CANADIAN SYLLABICS WEST-CREE LWE*/
- RTUNI_ALPHA, /* U+0014de: CANADIAN SYLLABICS LWI*/
- RTUNI_ALPHA, /* U+0014df: CANADIAN SYLLABICS WEST-CREE LWI*/
- RTUNI_ALPHA, /* U+0014e0: CANADIAN SYLLABICS LWII*/
- RTUNI_ALPHA, /* U+0014e1: CANADIAN SYLLABICS WEST-CREE LWII*/
- RTUNI_ALPHA, /* U+0014e2: CANADIAN SYLLABICS LWO*/
- RTUNI_ALPHA, /* U+0014e3: CANADIAN SYLLABICS WEST-CREE LWO*/
- RTUNI_ALPHA, /* U+0014e4: CANADIAN SYLLABICS LWOO*/
- RTUNI_ALPHA, /* U+0014e5: CANADIAN SYLLABICS WEST-CREE LWOO*/
- RTUNI_ALPHA, /* U+0014e6: CANADIAN SYLLABICS LWA*/
- RTUNI_ALPHA, /* U+0014e7: CANADIAN SYLLABICS WEST-CREE LWA*/
- RTUNI_ALPHA, /* U+0014e8: CANADIAN SYLLABICS LWAA*/
- RTUNI_ALPHA, /* U+0014e9: CANADIAN SYLLABICS WEST-CREE LWAA*/
- RTUNI_ALPHA, /* U+0014ea: CANADIAN SYLLABICS L*/
- RTUNI_ALPHA, /* U+0014eb: CANADIAN SYLLABICS WEST-CREE L*/
- RTUNI_ALPHA, /* U+0014ec: CANADIAN SYLLABICS MEDIAL L*/
- RTUNI_ALPHA, /* U+0014ed: CANADIAN SYLLABICS SE*/
- RTUNI_ALPHA, /* U+0014ee: CANADIAN SYLLABICS SAAI*/
- RTUNI_ALPHA, /* U+0014ef: CANADIAN SYLLABICS SI*/
- RTUNI_ALPHA, /* U+0014f0: CANADIAN SYLLABICS SII*/
- RTUNI_ALPHA, /* U+0014f1: CANADIAN SYLLABICS SO*/
- RTUNI_ALPHA, /* U+0014f2: CANADIAN SYLLABICS SOO*/
- RTUNI_ALPHA, /* U+0014f3: CANADIAN SYLLABICS Y-CREE SOO*/
- RTUNI_ALPHA, /* U+0014f4: CANADIAN SYLLABICS SA*/
- RTUNI_ALPHA, /* U+0014f5: CANADIAN SYLLABICS SAA*/
- RTUNI_ALPHA, /* U+0014f6: CANADIAN SYLLABICS SWE*/
- RTUNI_ALPHA, /* U+0014f7: CANADIAN SYLLABICS WEST-CREE SWE*/
- RTUNI_ALPHA, /* U+0014f8: CANADIAN SYLLABICS SWI*/
- RTUNI_ALPHA, /* U+0014f9: CANADIAN SYLLABICS WEST-CREE SWI*/
- RTUNI_ALPHA, /* U+0014fa: CANADIAN SYLLABICS SWII*/
- RTUNI_ALPHA, /* U+0014fb: CANADIAN SYLLABICS WEST-CREE SWII*/
- RTUNI_ALPHA, /* U+0014fc: CANADIAN SYLLABICS SWO*/
- RTUNI_ALPHA, /* U+0014fd: CANADIAN SYLLABICS WEST-CREE SWO*/
- RTUNI_ALPHA, /* U+0014fe: CANADIAN SYLLABICS SWOO*/
- RTUNI_ALPHA, /* U+0014ff: CANADIAN SYLLABICS WEST-CREE SWOO*/
- RTUNI_ALPHA, /* U+001500: CANADIAN SYLLABICS SWA*/
- RTUNI_ALPHA, /* U+001501: CANADIAN SYLLABICS WEST-CREE SWA*/
- RTUNI_ALPHA, /* U+001502: CANADIAN SYLLABICS SWAA*/
- RTUNI_ALPHA, /* U+001503: CANADIAN SYLLABICS WEST-CREE SWAA*/
- RTUNI_ALPHA, /* U+001504: CANADIAN SYLLABICS NASKAPI SWAA*/
- RTUNI_ALPHA, /* U+001505: CANADIAN SYLLABICS S*/
- RTUNI_ALPHA, /* U+001506: CANADIAN SYLLABICS ATHAPASCAN S*/
- RTUNI_ALPHA, /* U+001507: CANADIAN SYLLABICS SW*/
- RTUNI_ALPHA, /* U+001508: CANADIAN SYLLABICS BLACKFOOT S*/
- RTUNI_ALPHA, /* U+001509: CANADIAN SYLLABICS MOOSE-CREE SK*/
- RTUNI_ALPHA, /* U+00150a: CANADIAN SYLLABICS NASKAPI SKW*/
- RTUNI_ALPHA, /* U+00150b: CANADIAN SYLLABICS NASKAPI S-W*/
- RTUNI_ALPHA, /* U+00150c: CANADIAN SYLLABICS NASKAPI SPWA*/
- RTUNI_ALPHA, /* U+00150d: CANADIAN SYLLABICS NASKAPI STWA*/
- RTUNI_ALPHA, /* U+00150e: CANADIAN SYLLABICS NASKAPI SKWA*/
- RTUNI_ALPHA, /* U+00150f: CANADIAN SYLLABICS NASKAPI SCWA*/
- RTUNI_ALPHA, /* U+001510: CANADIAN SYLLABICS SHE*/
- RTUNI_ALPHA, /* U+001511: CANADIAN SYLLABICS SHI*/
- RTUNI_ALPHA, /* U+001512: CANADIAN SYLLABICS SHII*/
- RTUNI_ALPHA, /* U+001513: CANADIAN SYLLABICS SHO*/
- RTUNI_ALPHA, /* U+001514: CANADIAN SYLLABICS SHOO*/
- RTUNI_ALPHA, /* U+001515: CANADIAN SYLLABICS SHA*/
- RTUNI_ALPHA, /* U+001516: CANADIAN SYLLABICS SHAA*/
- RTUNI_ALPHA, /* U+001517: CANADIAN SYLLABICS SHWE*/
- RTUNI_ALPHA, /* U+001518: CANADIAN SYLLABICS WEST-CREE SHWE*/
- RTUNI_ALPHA, /* U+001519: CANADIAN SYLLABICS SHWI*/
- RTUNI_ALPHA, /* U+00151a: CANADIAN SYLLABICS WEST-CREE SHWI*/
- RTUNI_ALPHA, /* U+00151b: CANADIAN SYLLABICS SHWII*/
- RTUNI_ALPHA, /* U+00151c: CANADIAN SYLLABICS WEST-CREE SHWII*/
- RTUNI_ALPHA, /* U+00151d: CANADIAN SYLLABICS SHWO*/
- RTUNI_ALPHA, /* U+00151e: CANADIAN SYLLABICS WEST-CREE SHWO*/
- RTUNI_ALPHA, /* U+00151f: CANADIAN SYLLABICS SHWOO*/
- RTUNI_ALPHA, /* U+001520: CANADIAN SYLLABICS WEST-CREE SHWOO*/
- RTUNI_ALPHA, /* U+001521: CANADIAN SYLLABICS SHWA*/
- RTUNI_ALPHA, /* U+001522: CANADIAN SYLLABICS WEST-CREE SHWA*/
- RTUNI_ALPHA, /* U+001523: CANADIAN SYLLABICS SHWAA*/
- RTUNI_ALPHA, /* U+001524: CANADIAN SYLLABICS WEST-CREE SHWAA*/
- RTUNI_ALPHA, /* U+001525: CANADIAN SYLLABICS SH*/
- RTUNI_ALPHA, /* U+001526: CANADIAN SYLLABICS YE*/
- RTUNI_ALPHA, /* U+001527: CANADIAN SYLLABICS YAAI*/
- RTUNI_ALPHA, /* U+001528: CANADIAN SYLLABICS YI*/
- RTUNI_ALPHA, /* U+001529: CANADIAN SYLLABICS YII*/
- RTUNI_ALPHA, /* U+00152a: CANADIAN SYLLABICS YO*/
- RTUNI_ALPHA, /* U+00152b: CANADIAN SYLLABICS YOO*/
- RTUNI_ALPHA, /* U+00152c: CANADIAN SYLLABICS Y-CREE YOO*/
- RTUNI_ALPHA, /* U+00152d: CANADIAN SYLLABICS YA*/
- RTUNI_ALPHA, /* U+00152e: CANADIAN SYLLABICS YAA*/
- RTUNI_ALPHA, /* U+00152f: CANADIAN SYLLABICS YWE*/
- RTUNI_ALPHA, /* U+001530: CANADIAN SYLLABICS WEST-CREE YWE*/
- RTUNI_ALPHA, /* U+001531: CANADIAN SYLLABICS YWI*/
- RTUNI_ALPHA, /* U+001532: CANADIAN SYLLABICS WEST-CREE YWI*/
- RTUNI_ALPHA, /* U+001533: CANADIAN SYLLABICS YWII*/
- RTUNI_ALPHA, /* U+001534: CANADIAN SYLLABICS WEST-CREE YWII*/
- RTUNI_ALPHA, /* U+001535: CANADIAN SYLLABICS YWO*/
- RTUNI_ALPHA, /* U+001536: CANADIAN SYLLABICS WEST-CREE YWO*/
- RTUNI_ALPHA, /* U+001537: CANADIAN SYLLABICS YWOO*/
- RTUNI_ALPHA, /* U+001538: CANADIAN SYLLABICS WEST-CREE YWOO*/
- RTUNI_ALPHA, /* U+001539: CANADIAN SYLLABICS YWA*/
- RTUNI_ALPHA, /* U+00153a: CANADIAN SYLLABICS WEST-CREE YWA*/
- RTUNI_ALPHA, /* U+00153b: CANADIAN SYLLABICS YWAA*/
- RTUNI_ALPHA, /* U+00153c: CANADIAN SYLLABICS WEST-CREE YWAA*/
- RTUNI_ALPHA, /* U+00153d: CANADIAN SYLLABICS NASKAPI YWAA*/
- RTUNI_ALPHA, /* U+00153e: CANADIAN SYLLABICS Y*/
- RTUNI_ALPHA, /* U+00153f: CANADIAN SYLLABICS BIBLE-CREE Y*/
- RTUNI_ALPHA, /* U+001540: CANADIAN SYLLABICS WEST-CREE Y*/
- RTUNI_ALPHA, /* U+001541: CANADIAN SYLLABICS SAYISI YI*/
- RTUNI_ALPHA, /* U+001542: CANADIAN SYLLABICS RE*/
- RTUNI_ALPHA, /* U+001543: CANADIAN SYLLABICS R-CREE RE*/
- RTUNI_ALPHA, /* U+001544: CANADIAN SYLLABICS WEST-CREE LE*/
- RTUNI_ALPHA, /* U+001545: CANADIAN SYLLABICS RAAI*/
- RTUNI_ALPHA, /* U+001546: CANADIAN SYLLABICS RI*/
- RTUNI_ALPHA, /* U+001547: CANADIAN SYLLABICS RII*/
- RTUNI_ALPHA, /* U+001548: CANADIAN SYLLABICS RO*/
- RTUNI_ALPHA, /* U+001549: CANADIAN SYLLABICS ROO*/
- RTUNI_ALPHA, /* U+00154a: CANADIAN SYLLABICS WEST-CREE LO*/
- RTUNI_ALPHA, /* U+00154b: CANADIAN SYLLABICS RA*/
- RTUNI_ALPHA, /* U+00154c: CANADIAN SYLLABICS RAA*/
- RTUNI_ALPHA, /* U+00154d: CANADIAN SYLLABICS WEST-CREE LA*/
- RTUNI_ALPHA, /* U+00154e: CANADIAN SYLLABICS RWAA*/
- RTUNI_ALPHA, /* U+00154f: CANADIAN SYLLABICS WEST-CREE RWAA*/
- RTUNI_ALPHA, /* U+001550: CANADIAN SYLLABICS R*/
- RTUNI_ALPHA, /* U+001551: CANADIAN SYLLABICS WEST-CREE R*/
- RTUNI_ALPHA, /* U+001552: CANADIAN SYLLABICS MEDIAL R*/
- RTUNI_ALPHA, /* U+001553: CANADIAN SYLLABICS FE*/
- RTUNI_ALPHA, /* U+001554: CANADIAN SYLLABICS FAAI*/
- RTUNI_ALPHA, /* U+001555: CANADIAN SYLLABICS FI*/
- RTUNI_ALPHA, /* U+001556: CANADIAN SYLLABICS FII*/
- RTUNI_ALPHA, /* U+001557: CANADIAN SYLLABICS FO*/
- RTUNI_ALPHA, /* U+001558: CANADIAN SYLLABICS FOO*/
- RTUNI_ALPHA, /* U+001559: CANADIAN SYLLABICS FA*/
- RTUNI_ALPHA, /* U+00155a: CANADIAN SYLLABICS FAA*/
- RTUNI_ALPHA, /* U+00155b: CANADIAN SYLLABICS FWAA*/
- RTUNI_ALPHA, /* U+00155c: CANADIAN SYLLABICS WEST-CREE FWAA*/
- RTUNI_ALPHA, /* U+00155d: CANADIAN SYLLABICS F*/
- RTUNI_ALPHA, /* U+00155e: CANADIAN SYLLABICS THE*/
- RTUNI_ALPHA, /* U+00155f: CANADIAN SYLLABICS N-CREE THE*/
- RTUNI_ALPHA, /* U+001560: CANADIAN SYLLABICS THI*/
- RTUNI_ALPHA, /* U+001561: CANADIAN SYLLABICS N-CREE THI*/
- RTUNI_ALPHA, /* U+001562: CANADIAN SYLLABICS THII*/
- RTUNI_ALPHA, /* U+001563: CANADIAN SYLLABICS N-CREE THII*/
- RTUNI_ALPHA, /* U+001564: CANADIAN SYLLABICS THO*/
- RTUNI_ALPHA, /* U+001565: CANADIAN SYLLABICS THOO*/
- RTUNI_ALPHA, /* U+001566: CANADIAN SYLLABICS THA*/
- RTUNI_ALPHA, /* U+001567: CANADIAN SYLLABICS THAA*/
- RTUNI_ALPHA, /* U+001568: CANADIAN SYLLABICS THWAA*/
- RTUNI_ALPHA, /* U+001569: CANADIAN SYLLABICS WEST-CREE THWAA*/
- RTUNI_ALPHA, /* U+00156a: CANADIAN SYLLABICS TH*/
- RTUNI_ALPHA, /* U+00156b: CANADIAN SYLLABICS TTHE*/
- RTUNI_ALPHA, /* U+00156c: CANADIAN SYLLABICS TTHI*/
- RTUNI_ALPHA, /* U+00156d: CANADIAN SYLLABICS TTHO*/
- RTUNI_ALPHA, /* U+00156e: CANADIAN SYLLABICS TTHA*/
- RTUNI_ALPHA, /* U+00156f: CANADIAN SYLLABICS TTH*/
- RTUNI_ALPHA, /* U+001570: CANADIAN SYLLABICS TYE*/
- RTUNI_ALPHA, /* U+001571: CANADIAN SYLLABICS TYI*/
- RTUNI_ALPHA, /* U+001572: CANADIAN SYLLABICS TYO*/
- RTUNI_ALPHA, /* U+001573: CANADIAN SYLLABICS TYA*/
- RTUNI_ALPHA, /* U+001574: CANADIAN SYLLABICS NUNAVIK HE*/
- RTUNI_ALPHA, /* U+001575: CANADIAN SYLLABICS NUNAVIK HI*/
- RTUNI_ALPHA, /* U+001576: CANADIAN SYLLABICS NUNAVIK HII*/
- RTUNI_ALPHA, /* U+001577: CANADIAN SYLLABICS NUNAVIK HO*/
- RTUNI_ALPHA, /* U+001578: CANADIAN SYLLABICS NUNAVIK HOO*/
- RTUNI_ALPHA, /* U+001579: CANADIAN SYLLABICS NUNAVIK HA*/
- RTUNI_ALPHA, /* U+00157a: CANADIAN SYLLABICS NUNAVIK HAA*/
- RTUNI_ALPHA, /* U+00157b: CANADIAN SYLLABICS NUNAVIK H*/
- RTUNI_ALPHA, /* U+00157c: CANADIAN SYLLABICS NUNAVUT H*/
- RTUNI_ALPHA, /* U+00157d: CANADIAN SYLLABICS HK*/
- RTUNI_ALPHA, /* U+00157e: CANADIAN SYLLABICS QAAI*/
- RTUNI_ALPHA, /* U+00157f: CANADIAN SYLLABICS QI*/
- RTUNI_ALPHA, /* U+001580: CANADIAN SYLLABICS QII*/
- RTUNI_ALPHA, /* U+001581: CANADIAN SYLLABICS QO*/
- RTUNI_ALPHA, /* U+001582: CANADIAN SYLLABICS QOO*/
- RTUNI_ALPHA, /* U+001583: CANADIAN SYLLABICS QA*/
- RTUNI_ALPHA, /* U+001584: CANADIAN SYLLABICS QAA*/
- RTUNI_ALPHA, /* U+001585: CANADIAN SYLLABICS Q*/
- RTUNI_ALPHA, /* U+001586: CANADIAN SYLLABICS TLHE*/
- RTUNI_ALPHA, /* U+001587: CANADIAN SYLLABICS TLHI*/
- RTUNI_ALPHA, /* U+001588: CANADIAN SYLLABICS TLHO*/
- RTUNI_ALPHA, /* U+001589: CANADIAN SYLLABICS TLHA*/
- RTUNI_ALPHA, /* U+00158a: CANADIAN SYLLABICS WEST-CREE RE*/
- RTUNI_ALPHA, /* U+00158b: CANADIAN SYLLABICS WEST-CREE RI*/
- RTUNI_ALPHA, /* U+00158c: CANADIAN SYLLABICS WEST-CREE RO*/
- RTUNI_ALPHA, /* U+00158d: CANADIAN SYLLABICS WEST-CREE RA*/
- RTUNI_ALPHA, /* U+00158e: CANADIAN SYLLABICS NGAAI*/
- RTUNI_ALPHA, /* U+00158f: CANADIAN SYLLABICS NGI*/
- RTUNI_ALPHA, /* U+001590: CANADIAN SYLLABICS NGII*/
- RTUNI_ALPHA, /* U+001591: CANADIAN SYLLABICS NGO*/
- RTUNI_ALPHA, /* U+001592: CANADIAN SYLLABICS NGOO*/
- RTUNI_ALPHA, /* U+001593: CANADIAN SYLLABICS NGA*/
- RTUNI_ALPHA, /* U+001594: CANADIAN SYLLABICS NGAA*/
- RTUNI_ALPHA, /* U+001595: CANADIAN SYLLABICS NG*/
- RTUNI_ALPHA, /* U+001596: CANADIAN SYLLABICS NNG*/
- RTUNI_ALPHA, /* U+001597: CANADIAN SYLLABICS SAYISI SHE*/
- RTUNI_ALPHA, /* U+001598: CANADIAN SYLLABICS SAYISI SHI*/
- RTUNI_ALPHA, /* U+001599: CANADIAN SYLLABICS SAYISI SHO*/
- RTUNI_ALPHA, /* U+00159a: CANADIAN SYLLABICS SAYISI SHA*/
- RTUNI_ALPHA, /* U+00159b: CANADIAN SYLLABICS WOODS-CREE THE*/
- RTUNI_ALPHA, /* U+00159c: CANADIAN SYLLABICS WOODS-CREE THI*/
- RTUNI_ALPHA, /* U+00159d: CANADIAN SYLLABICS WOODS-CREE THO*/
- RTUNI_ALPHA, /* U+00159e: CANADIAN SYLLABICS WOODS-CREE THA*/
- RTUNI_ALPHA, /* U+00159f: CANADIAN SYLLABICS WOODS-CREE TH*/
- RTUNI_ALPHA, /* U+0015a0: CANADIAN SYLLABICS LHI*/
- RTUNI_ALPHA, /* U+0015a1: CANADIAN SYLLABICS LHII*/
- RTUNI_ALPHA, /* U+0015a2: CANADIAN SYLLABICS LHO*/
- RTUNI_ALPHA, /* U+0015a3: CANADIAN SYLLABICS LHOO*/
- RTUNI_ALPHA, /* U+0015a4: CANADIAN SYLLABICS LHA*/
- RTUNI_ALPHA, /* U+0015a5: CANADIAN SYLLABICS LHAA*/
- RTUNI_ALPHA, /* U+0015a6: CANADIAN SYLLABICS LH*/
- RTUNI_ALPHA, /* U+0015a7: CANADIAN SYLLABICS TH-CREE THE*/
- RTUNI_ALPHA, /* U+0015a8: CANADIAN SYLLABICS TH-CREE THI*/
- RTUNI_ALPHA, /* U+0015a9: CANADIAN SYLLABICS TH-CREE THII*/
- RTUNI_ALPHA, /* U+0015aa: CANADIAN SYLLABICS TH-CREE THO*/
- RTUNI_ALPHA, /* U+0015ab: CANADIAN SYLLABICS TH-CREE THOO*/
- RTUNI_ALPHA, /* U+0015ac: CANADIAN SYLLABICS TH-CREE THA*/
- RTUNI_ALPHA, /* U+0015ad: CANADIAN SYLLABICS TH-CREE THAA*/
- RTUNI_ALPHA, /* U+0015ae: CANADIAN SYLLABICS TH-CREE TH*/
- RTUNI_ALPHA, /* U+0015af: CANADIAN SYLLABICS AIVILIK B*/
- RTUNI_ALPHA, /* U+0015b0: CANADIAN SYLLABICS BLACKFOOT E*/
- RTUNI_ALPHA, /* U+0015b1: CANADIAN SYLLABICS BLACKFOOT I*/
- RTUNI_ALPHA, /* U+0015b2: CANADIAN SYLLABICS BLACKFOOT O*/
- RTUNI_ALPHA, /* U+0015b3: CANADIAN SYLLABICS BLACKFOOT A*/
- RTUNI_ALPHA, /* U+0015b4: CANADIAN SYLLABICS BLACKFOOT WE*/
- RTUNI_ALPHA, /* U+0015b5: CANADIAN SYLLABICS BLACKFOOT WI*/
- RTUNI_ALPHA, /* U+0015b6: CANADIAN SYLLABICS BLACKFOOT WO*/
- RTUNI_ALPHA, /* U+0015b7: CANADIAN SYLLABICS BLACKFOOT WA*/
- RTUNI_ALPHA, /* U+0015b8: CANADIAN SYLLABICS BLACKFOOT NE*/
- RTUNI_ALPHA, /* U+0015b9: CANADIAN SYLLABICS BLACKFOOT NI*/
- RTUNI_ALPHA, /* U+0015ba: CANADIAN SYLLABICS BLACKFOOT NO*/
- RTUNI_ALPHA, /* U+0015bb: CANADIAN SYLLABICS BLACKFOOT NA*/
- RTUNI_ALPHA, /* U+0015bc: CANADIAN SYLLABICS BLACKFOOT KE*/
- RTUNI_ALPHA, /* U+0015bd: CANADIAN SYLLABICS BLACKFOOT KI*/
- RTUNI_ALPHA, /* U+0015be: CANADIAN SYLLABICS BLACKFOOT KO*/
- RTUNI_ALPHA, /* U+0015bf: CANADIAN SYLLABICS BLACKFOOT KA*/
- RTUNI_ALPHA, /* U+0015c0: CANADIAN SYLLABICS SAYISI HE*/
- RTUNI_ALPHA, /* U+0015c1: CANADIAN SYLLABICS SAYISI HI*/
- RTUNI_ALPHA, /* U+0015c2: CANADIAN SYLLABICS SAYISI HO*/
- RTUNI_ALPHA, /* U+0015c3: CANADIAN SYLLABICS SAYISI HA*/
- RTUNI_ALPHA, /* U+0015c4: CANADIAN SYLLABICS CARRIER GHU*/
- RTUNI_ALPHA, /* U+0015c5: CANADIAN SYLLABICS CARRIER GHO*/
- RTUNI_ALPHA, /* U+0015c6: CANADIAN SYLLABICS CARRIER GHE*/
- RTUNI_ALPHA, /* U+0015c7: CANADIAN SYLLABICS CARRIER GHEE*/
- RTUNI_ALPHA, /* U+0015c8: CANADIAN SYLLABICS CARRIER GHI*/
- RTUNI_ALPHA, /* U+0015c9: CANADIAN SYLLABICS CARRIER GHA*/
- RTUNI_ALPHA, /* U+0015ca: CANADIAN SYLLABICS CARRIER RU*/
- RTUNI_ALPHA, /* U+0015cb: CANADIAN SYLLABICS CARRIER RO*/
- RTUNI_ALPHA, /* U+0015cc: CANADIAN SYLLABICS CARRIER RE*/
- RTUNI_ALPHA, /* U+0015cd: CANADIAN SYLLABICS CARRIER REE*/
- RTUNI_ALPHA, /* U+0015ce: CANADIAN SYLLABICS CARRIER RI*/
- RTUNI_ALPHA, /* U+0015cf: CANADIAN SYLLABICS CARRIER RA*/
- RTUNI_ALPHA, /* U+0015d0: CANADIAN SYLLABICS CARRIER WU*/
- RTUNI_ALPHA, /* U+0015d1: CANADIAN SYLLABICS CARRIER WO*/
- RTUNI_ALPHA, /* U+0015d2: CANADIAN SYLLABICS CARRIER WE*/
- RTUNI_ALPHA, /* U+0015d3: CANADIAN SYLLABICS CARRIER WEE*/
- RTUNI_ALPHA, /* U+0015d4: CANADIAN SYLLABICS CARRIER WI*/
- RTUNI_ALPHA, /* U+0015d5: CANADIAN SYLLABICS CARRIER WA*/
- RTUNI_ALPHA, /* U+0015d6: CANADIAN SYLLABICS CARRIER HWU*/
- RTUNI_ALPHA, /* U+0015d7: CANADIAN SYLLABICS CARRIER HWO*/
- RTUNI_ALPHA, /* U+0015d8: CANADIAN SYLLABICS CARRIER HWE*/
- RTUNI_ALPHA, /* U+0015d9: CANADIAN SYLLABICS CARRIER HWEE*/
- RTUNI_ALPHA, /* U+0015da: CANADIAN SYLLABICS CARRIER HWI*/
- RTUNI_ALPHA, /* U+0015db: CANADIAN SYLLABICS CARRIER HWA*/
- RTUNI_ALPHA, /* U+0015dc: CANADIAN SYLLABICS CARRIER THU*/
- RTUNI_ALPHA, /* U+0015dd: CANADIAN SYLLABICS CARRIER THO*/
- RTUNI_ALPHA, /* U+0015de: CANADIAN SYLLABICS CARRIER THE*/
- RTUNI_ALPHA, /* U+0015df: CANADIAN SYLLABICS CARRIER THEE*/
- RTUNI_ALPHA, /* U+0015e0: CANADIAN SYLLABICS CARRIER THI*/
- RTUNI_ALPHA, /* U+0015e1: CANADIAN SYLLABICS CARRIER THA*/
- RTUNI_ALPHA, /* U+0015e2: CANADIAN SYLLABICS CARRIER TTU*/
- RTUNI_ALPHA, /* U+0015e3: CANADIAN SYLLABICS CARRIER TTO*/
- RTUNI_ALPHA, /* U+0015e4: CANADIAN SYLLABICS CARRIER TTE*/
- RTUNI_ALPHA, /* U+0015e5: CANADIAN SYLLABICS CARRIER TTEE*/
- RTUNI_ALPHA, /* U+0015e6: CANADIAN SYLLABICS CARRIER TTI*/
- RTUNI_ALPHA, /* U+0015e7: CANADIAN SYLLABICS CARRIER TTA*/
- RTUNI_ALPHA, /* U+0015e8: CANADIAN SYLLABICS CARRIER PU*/
- RTUNI_ALPHA, /* U+0015e9: CANADIAN SYLLABICS CARRIER PO*/
- RTUNI_ALPHA, /* U+0015ea: CANADIAN SYLLABICS CARRIER PE*/
- RTUNI_ALPHA, /* U+0015eb: CANADIAN SYLLABICS CARRIER PEE*/
- RTUNI_ALPHA, /* U+0015ec: CANADIAN SYLLABICS CARRIER PI*/
- RTUNI_ALPHA, /* U+0015ed: CANADIAN SYLLABICS CARRIER PA*/
- RTUNI_ALPHA, /* U+0015ee: CANADIAN SYLLABICS CARRIER P*/
- RTUNI_ALPHA, /* U+0015ef: CANADIAN SYLLABICS CARRIER GU*/
- RTUNI_ALPHA, /* U+0015f0: CANADIAN SYLLABICS CARRIER GO*/
- RTUNI_ALPHA, /* U+0015f1: CANADIAN SYLLABICS CARRIER GE*/
- RTUNI_ALPHA, /* U+0015f2: CANADIAN SYLLABICS CARRIER GEE*/
- RTUNI_ALPHA, /* U+0015f3: CANADIAN SYLLABICS CARRIER GI*/
- RTUNI_ALPHA, /* U+0015f4: CANADIAN SYLLABICS CARRIER GA*/
- RTUNI_ALPHA, /* U+0015f5: CANADIAN SYLLABICS CARRIER KHU*/
- RTUNI_ALPHA, /* U+0015f6: CANADIAN SYLLABICS CARRIER KHO*/
- RTUNI_ALPHA, /* U+0015f7: CANADIAN SYLLABICS CARRIER KHE*/
- RTUNI_ALPHA, /* U+0015f8: CANADIAN SYLLABICS CARRIER KHEE*/
- RTUNI_ALPHA, /* U+0015f9: CANADIAN SYLLABICS CARRIER KHI*/
- RTUNI_ALPHA, /* U+0015fa: CANADIAN SYLLABICS CARRIER KHA*/
- RTUNI_ALPHA, /* U+0015fb: CANADIAN SYLLABICS CARRIER KKU*/
- RTUNI_ALPHA, /* U+0015fc: CANADIAN SYLLABICS CARRIER KKO*/
- RTUNI_ALPHA, /* U+0015fd: CANADIAN SYLLABICS CARRIER KKE*/
- RTUNI_ALPHA, /* U+0015fe: CANADIAN SYLLABICS CARRIER KKEE*/
- RTUNI_ALPHA, /* U+0015ff: CANADIAN SYLLABICS CARRIER KKI*/
- RTUNI_ALPHA, /* U+001600: CANADIAN SYLLABICS CARRIER KKA*/
- RTUNI_ALPHA, /* U+001601: CANADIAN SYLLABICS CARRIER KK*/
- RTUNI_ALPHA, /* U+001602: CANADIAN SYLLABICS CARRIER NU*/
- RTUNI_ALPHA, /* U+001603: CANADIAN SYLLABICS CARRIER NO*/
- RTUNI_ALPHA, /* U+001604: CANADIAN SYLLABICS CARRIER NE*/
- RTUNI_ALPHA, /* U+001605: CANADIAN SYLLABICS CARRIER NEE*/
- RTUNI_ALPHA, /* U+001606: CANADIAN SYLLABICS CARRIER NI*/
- RTUNI_ALPHA, /* U+001607: CANADIAN SYLLABICS CARRIER NA*/
- RTUNI_ALPHA, /* U+001608: CANADIAN SYLLABICS CARRIER MU*/
- RTUNI_ALPHA, /* U+001609: CANADIAN SYLLABICS CARRIER MO*/
- RTUNI_ALPHA, /* U+00160a: CANADIAN SYLLABICS CARRIER ME*/
- RTUNI_ALPHA, /* U+00160b: CANADIAN SYLLABICS CARRIER MEE*/
- RTUNI_ALPHA, /* U+00160c: CANADIAN SYLLABICS CARRIER MI*/
- RTUNI_ALPHA, /* U+00160d: CANADIAN SYLLABICS CARRIER MA*/
- RTUNI_ALPHA, /* U+00160e: CANADIAN SYLLABICS CARRIER YU*/
- RTUNI_ALPHA, /* U+00160f: CANADIAN SYLLABICS CARRIER YO*/
- RTUNI_ALPHA, /* U+001610: CANADIAN SYLLABICS CARRIER YE*/
- RTUNI_ALPHA, /* U+001611: CANADIAN SYLLABICS CARRIER YEE*/
- RTUNI_ALPHA, /* U+001612: CANADIAN SYLLABICS CARRIER YI*/
- RTUNI_ALPHA, /* U+001613: CANADIAN SYLLABICS CARRIER YA*/
- RTUNI_ALPHA, /* U+001614: CANADIAN SYLLABICS CARRIER JU*/
- RTUNI_ALPHA, /* U+001615: CANADIAN SYLLABICS SAYISI JU*/
- RTUNI_ALPHA, /* U+001616: CANADIAN SYLLABICS CARRIER JO*/
- RTUNI_ALPHA, /* U+001617: CANADIAN SYLLABICS CARRIER JE*/
- RTUNI_ALPHA, /* U+001618: CANADIAN SYLLABICS CARRIER JEE*/
- RTUNI_ALPHA, /* U+001619: CANADIAN SYLLABICS CARRIER JI*/
- RTUNI_ALPHA, /* U+00161a: CANADIAN SYLLABICS SAYISI JI*/
- RTUNI_ALPHA, /* U+00161b: CANADIAN SYLLABICS CARRIER JA*/
- RTUNI_ALPHA, /* U+00161c: CANADIAN SYLLABICS CARRIER JJU*/
- RTUNI_ALPHA, /* U+00161d: CANADIAN SYLLABICS CARRIER JJO*/
- RTUNI_ALPHA, /* U+00161e: CANADIAN SYLLABICS CARRIER JJE*/
- RTUNI_ALPHA, /* U+00161f: CANADIAN SYLLABICS CARRIER JJEE*/
- RTUNI_ALPHA, /* U+001620: CANADIAN SYLLABICS CARRIER JJI*/
- RTUNI_ALPHA, /* U+001621: CANADIAN SYLLABICS CARRIER JJA*/
- RTUNI_ALPHA, /* U+001622: CANADIAN SYLLABICS CARRIER LU*/
- RTUNI_ALPHA, /* U+001623: CANADIAN SYLLABICS CARRIER LO*/
- RTUNI_ALPHA, /* U+001624: CANADIAN SYLLABICS CARRIER LE*/
- RTUNI_ALPHA, /* U+001625: CANADIAN SYLLABICS CARRIER LEE*/
- RTUNI_ALPHA, /* U+001626: CANADIAN SYLLABICS CARRIER LI*/
- RTUNI_ALPHA, /* U+001627: CANADIAN SYLLABICS CARRIER LA*/
- RTUNI_ALPHA, /* U+001628: CANADIAN SYLLABICS CARRIER DLU*/
- RTUNI_ALPHA, /* U+001629: CANADIAN SYLLABICS CARRIER DLO*/
- RTUNI_ALPHA, /* U+00162a: CANADIAN SYLLABICS CARRIER DLE*/
- RTUNI_ALPHA, /* U+00162b: CANADIAN SYLLABICS CARRIER DLEE*/
- RTUNI_ALPHA, /* U+00162c: CANADIAN SYLLABICS CARRIER DLI*/
- RTUNI_ALPHA, /* U+00162d: CANADIAN SYLLABICS CARRIER DLA*/
- RTUNI_ALPHA, /* U+00162e: CANADIAN SYLLABICS CARRIER LHU*/
- RTUNI_ALPHA, /* U+00162f: CANADIAN SYLLABICS CARRIER LHO*/
- RTUNI_ALPHA, /* U+001630: CANADIAN SYLLABICS CARRIER LHE*/
- RTUNI_ALPHA, /* U+001631: CANADIAN SYLLABICS CARRIER LHEE*/
- RTUNI_ALPHA, /* U+001632: CANADIAN SYLLABICS CARRIER LHI*/
- RTUNI_ALPHA, /* U+001633: CANADIAN SYLLABICS CARRIER LHA*/
- RTUNI_ALPHA, /* U+001634: CANADIAN SYLLABICS CARRIER TLHU*/
- RTUNI_ALPHA, /* U+001635: CANADIAN SYLLABICS CARRIER TLHO*/
- RTUNI_ALPHA, /* U+001636: CANADIAN SYLLABICS CARRIER TLHE*/
- RTUNI_ALPHA, /* U+001637: CANADIAN SYLLABICS CARRIER TLHEE*/
- RTUNI_ALPHA, /* U+001638: CANADIAN SYLLABICS CARRIER TLHI*/
- RTUNI_ALPHA, /* U+001639: CANADIAN SYLLABICS CARRIER TLHA*/
- RTUNI_ALPHA, /* U+00163a: CANADIAN SYLLABICS CARRIER TLU*/
- RTUNI_ALPHA, /* U+00163b: CANADIAN SYLLABICS CARRIER TLO*/
- RTUNI_ALPHA, /* U+00163c: CANADIAN SYLLABICS CARRIER TLE*/
- RTUNI_ALPHA, /* U+00163d: CANADIAN SYLLABICS CARRIER TLEE*/
- RTUNI_ALPHA, /* U+00163e: CANADIAN SYLLABICS CARRIER TLI*/
- RTUNI_ALPHA, /* U+00163f: CANADIAN SYLLABICS CARRIER TLA*/
- RTUNI_ALPHA, /* U+001640: CANADIAN SYLLABICS CARRIER ZU*/
- RTUNI_ALPHA, /* U+001641: CANADIAN SYLLABICS CARRIER ZO*/
- RTUNI_ALPHA, /* U+001642: CANADIAN SYLLABICS CARRIER ZE*/
- RTUNI_ALPHA, /* U+001643: CANADIAN SYLLABICS CARRIER ZEE*/
- RTUNI_ALPHA, /* U+001644: CANADIAN SYLLABICS CARRIER ZI*/
- RTUNI_ALPHA, /* U+001645: CANADIAN SYLLABICS CARRIER ZA*/
- RTUNI_ALPHA, /* U+001646: CANADIAN SYLLABICS CARRIER Z*/
- RTUNI_ALPHA, /* U+001647: CANADIAN SYLLABICS CARRIER INITIAL Z*/
- RTUNI_ALPHA, /* U+001648: CANADIAN SYLLABICS CARRIER DZU*/
- RTUNI_ALPHA, /* U+001649: CANADIAN SYLLABICS CARRIER DZO*/
- RTUNI_ALPHA, /* U+00164a: CANADIAN SYLLABICS CARRIER DZE*/
- RTUNI_ALPHA, /* U+00164b: CANADIAN SYLLABICS CARRIER DZEE*/
- RTUNI_ALPHA, /* U+00164c: CANADIAN SYLLABICS CARRIER DZI*/
- RTUNI_ALPHA, /* U+00164d: CANADIAN SYLLABICS CARRIER DZA*/
- RTUNI_ALPHA, /* U+00164e: CANADIAN SYLLABICS CARRIER SU*/
- RTUNI_ALPHA, /* U+00164f: CANADIAN SYLLABICS CARRIER SO*/
- RTUNI_ALPHA, /* U+001650: CANADIAN SYLLABICS CARRIER SE*/
- RTUNI_ALPHA, /* U+001651: CANADIAN SYLLABICS CARRIER SEE*/
- RTUNI_ALPHA, /* U+001652: CANADIAN SYLLABICS CARRIER SI*/
- RTUNI_ALPHA, /* U+001653: CANADIAN SYLLABICS CARRIER SA*/
- RTUNI_ALPHA, /* U+001654: CANADIAN SYLLABICS CARRIER SHU*/
- RTUNI_ALPHA, /* U+001655: CANADIAN SYLLABICS CARRIER SHO*/
- RTUNI_ALPHA, /* U+001656: CANADIAN SYLLABICS CARRIER SHE*/
- RTUNI_ALPHA, /* U+001657: CANADIAN SYLLABICS CARRIER SHEE*/
- RTUNI_ALPHA, /* U+001658: CANADIAN SYLLABICS CARRIER SHI*/
- RTUNI_ALPHA, /* U+001659: CANADIAN SYLLABICS CARRIER SHA*/
- RTUNI_ALPHA, /* U+00165a: CANADIAN SYLLABICS CARRIER SH*/
- RTUNI_ALPHA, /* U+00165b: CANADIAN SYLLABICS CARRIER TSU*/
- RTUNI_ALPHA, /* U+00165c: CANADIAN SYLLABICS CARRIER TSO*/
- RTUNI_ALPHA, /* U+00165d: CANADIAN SYLLABICS CARRIER TSE*/
- RTUNI_ALPHA, /* U+00165e: CANADIAN SYLLABICS CARRIER TSEE*/
- RTUNI_ALPHA, /* U+00165f: CANADIAN SYLLABICS CARRIER TSI*/
- RTUNI_ALPHA, /* U+001660: CANADIAN SYLLABICS CARRIER TSA*/
- RTUNI_ALPHA, /* U+001661: CANADIAN SYLLABICS CARRIER CHU*/
- RTUNI_ALPHA, /* U+001662: CANADIAN SYLLABICS CARRIER CHO*/
- RTUNI_ALPHA, /* U+001663: CANADIAN SYLLABICS CARRIER CHE*/
- RTUNI_ALPHA, /* U+001664: CANADIAN SYLLABICS CARRIER CHEE*/
- RTUNI_ALPHA, /* U+001665: CANADIAN SYLLABICS CARRIER CHI*/
- RTUNI_ALPHA, /* U+001666: CANADIAN SYLLABICS CARRIER CHA*/
- RTUNI_ALPHA, /* U+001667: CANADIAN SYLLABICS CARRIER TTSU*/
- RTUNI_ALPHA, /* U+001668: CANADIAN SYLLABICS CARRIER TTSO*/
- RTUNI_ALPHA, /* U+001669: CANADIAN SYLLABICS CARRIER TTSE*/
- RTUNI_ALPHA, /* U+00166a: CANADIAN SYLLABICS CARRIER TTSEE*/
- RTUNI_ALPHA, /* U+00166b: CANADIAN SYLLABICS CARRIER TTSI*/
- RTUNI_ALPHA, /* U+00166c: CANADIAN SYLLABICS CARRIER TTSA*/
- 0, /* U+00166d: CANADIAN SYLLABICS CHI SIGN*/
- 0, /* U+00166e: CANADIAN SYLLABICS FULL STOP*/
- RTUNI_ALPHA, /* U+00166f: CANADIAN SYLLABICS QAI*/
- RTUNI_ALPHA, /* U+001670: CANADIAN SYLLABICS NGAI*/
- RTUNI_ALPHA, /* U+001671: CANADIAN SYLLABICS NNGI*/
- RTUNI_ALPHA, /* U+001672: CANADIAN SYLLABICS NNGII*/
- RTUNI_ALPHA, /* U+001673: CANADIAN SYLLABICS NNGO*/
- RTUNI_ALPHA, /* U+001674: CANADIAN SYLLABICS NNGOO*/
- RTUNI_ALPHA, /* U+001675: CANADIAN SYLLABICS NNGA*/
- RTUNI_ALPHA, /* U+001676: CANADIAN SYLLABICS NNGAA*/
- 0, /* U+001677: */
- 0, /* U+001678: */
- 0, /* U+001679: */
- 0, /* U+00167a: */
- 0, /* U+00167b: */
- 0, /* U+00167c: */
- 0, /* U+00167d: */
- 0, /* U+00167e: */
- 0, /* U+00167f: */
- RTUNI_WSPACE, /* U+001680: OGHAM SPACE MARK*/
- RTUNI_ALPHA, /* U+001681: OGHAM LETTER BEITH*/
- RTUNI_ALPHA, /* U+001682: OGHAM LETTER LUIS*/
- RTUNI_ALPHA, /* U+001683: OGHAM LETTER FEARN*/
- RTUNI_ALPHA, /* U+001684: OGHAM LETTER SAIL*/
- RTUNI_ALPHA, /* U+001685: OGHAM LETTER NION*/
- RTUNI_ALPHA, /* U+001686: OGHAM LETTER UATH*/
- RTUNI_ALPHA, /* U+001687: OGHAM LETTER DAIR*/
- RTUNI_ALPHA, /* U+001688: OGHAM LETTER TINNE*/
- RTUNI_ALPHA, /* U+001689: OGHAM LETTER COLL*/
- RTUNI_ALPHA, /* U+00168a: OGHAM LETTER CEIRT*/
- RTUNI_ALPHA, /* U+00168b: OGHAM LETTER MUIN*/
- RTUNI_ALPHA, /* U+00168c: OGHAM LETTER GORT*/
- RTUNI_ALPHA, /* U+00168d: OGHAM LETTER NGEADAL*/
- RTUNI_ALPHA, /* U+00168e: OGHAM LETTER STRAIF*/
- RTUNI_ALPHA, /* U+00168f: OGHAM LETTER RUIS*/
- RTUNI_ALPHA, /* U+001690: OGHAM LETTER AILM*/
- RTUNI_ALPHA, /* U+001691: OGHAM LETTER ONN*/
- RTUNI_ALPHA, /* U+001692: OGHAM LETTER UR*/
- RTUNI_ALPHA, /* U+001693: OGHAM LETTER EADHADH*/
- RTUNI_ALPHA, /* U+001694: OGHAM LETTER IODHADH*/
- RTUNI_ALPHA, /* U+001695: OGHAM LETTER EABHADH*/
- RTUNI_ALPHA, /* U+001696: OGHAM LETTER OR*/
- RTUNI_ALPHA, /* U+001697: OGHAM LETTER UILLEANN*/
- RTUNI_ALPHA, /* U+001698: OGHAM LETTER IFIN*/
- RTUNI_ALPHA, /* U+001699: OGHAM LETTER EAMHANCHOLL*/
- RTUNI_ALPHA, /* U+00169a: OGHAM LETTER PEITH*/
- 0, /* U+00169b: OGHAM FEATHER MARK*/
- 0, /* U+00169c: OGHAM REVERSED FEATHER MARK*/
- 0, /* U+00169d: */
- 0, /* U+00169e: */
- 0, /* U+00169f: */
- RTUNI_ALPHA, /* U+0016a0: RUNIC LETTER FEHU FEOH FE F*/
- RTUNI_ALPHA, /* U+0016a1: RUNIC LETTER V*/
- RTUNI_ALPHA, /* U+0016a2: RUNIC LETTER URUZ UR U*/
- RTUNI_ALPHA, /* U+0016a3: RUNIC LETTER YR*/
- RTUNI_ALPHA, /* U+0016a4: RUNIC LETTER Y*/
- RTUNI_ALPHA, /* U+0016a5: RUNIC LETTER W*/
- RTUNI_ALPHA, /* U+0016a6: RUNIC LETTER THURISAZ THURS THORN*/
- RTUNI_ALPHA, /* U+0016a7: RUNIC LETTER ETH*/
- RTUNI_ALPHA, /* U+0016a8: RUNIC LETTER ANSUZ A*/
- RTUNI_ALPHA, /* U+0016a9: RUNIC LETTER OS O*/
- RTUNI_ALPHA, /* U+0016aa: RUNIC LETTER AC A*/
- RTUNI_ALPHA, /* U+0016ab: RUNIC LETTER AESC*/
- RTUNI_ALPHA, /* U+0016ac: RUNIC LETTER LONG-BRANCH-OSS O*/
- RTUNI_ALPHA, /* U+0016ad: RUNIC LETTER SHORT-TWIG-OSS O*/
- RTUNI_ALPHA, /* U+0016ae: RUNIC LETTER O*/
- RTUNI_ALPHA, /* U+0016af: RUNIC LETTER OE*/
- RTUNI_ALPHA, /* U+0016b0: RUNIC LETTER ON*/
- RTUNI_ALPHA, /* U+0016b1: RUNIC LETTER RAIDO RAD REID R*/
- RTUNI_ALPHA, /* U+0016b2: RUNIC LETTER KAUNA*/
- RTUNI_ALPHA, /* U+0016b3: RUNIC LETTER CEN*/
- RTUNI_ALPHA, /* U+0016b4: RUNIC LETTER KAUN K*/
- RTUNI_ALPHA, /* U+0016b5: RUNIC LETTER G*/
- RTUNI_ALPHA, /* U+0016b6: RUNIC LETTER ENG*/
- RTUNI_ALPHA, /* U+0016b7: RUNIC LETTER GEBO GYFU G*/
- RTUNI_ALPHA, /* U+0016b8: RUNIC LETTER GAR*/
- RTUNI_ALPHA, /* U+0016b9: RUNIC LETTER WUNJO WYNN W*/
- RTUNI_ALPHA, /* U+0016ba: RUNIC LETTER HAGLAZ H*/
- RTUNI_ALPHA, /* U+0016bb: RUNIC LETTER HAEGL H*/
- RTUNI_ALPHA, /* U+0016bc: RUNIC LETTER LONG-BRANCH-HAGALL H*/
- RTUNI_ALPHA, /* U+0016bd: RUNIC LETTER SHORT-TWIG-HAGALL H*/
- RTUNI_ALPHA, /* U+0016be: RUNIC LETTER NAUDIZ NYD NAUD N*/
- RTUNI_ALPHA, /* U+0016bf: RUNIC LETTER SHORT-TWIG-NAUD N*/
- RTUNI_ALPHA, /* U+0016c0: RUNIC LETTER DOTTED-N*/
- RTUNI_ALPHA, /* U+0016c1: RUNIC LETTER ISAZ IS ISS I*/
- RTUNI_ALPHA, /* U+0016c2: RUNIC LETTER E*/
- RTUNI_ALPHA, /* U+0016c3: RUNIC LETTER JERAN J*/
- RTUNI_ALPHA, /* U+0016c4: RUNIC LETTER GER*/
- RTUNI_ALPHA, /* U+0016c5: RUNIC LETTER LONG-BRANCH-AR AE*/
- RTUNI_ALPHA, /* U+0016c6: RUNIC LETTER SHORT-TWIG-AR A*/
- RTUNI_ALPHA, /* U+0016c7: RUNIC LETTER IWAZ EOH*/
- RTUNI_ALPHA, /* U+0016c8: RUNIC LETTER PERTHO PEORTH P*/
- RTUNI_ALPHA, /* U+0016c9: RUNIC LETTER ALGIZ EOLHX*/
- RTUNI_ALPHA, /* U+0016ca: RUNIC LETTER SOWILO S*/
- RTUNI_ALPHA, /* U+0016cb: RUNIC LETTER SIGEL LONG-BRANCH-SOL S*/
- RTUNI_ALPHA, /* U+0016cc: RUNIC LETTER SHORT-TWIG-SOL S*/
- RTUNI_ALPHA, /* U+0016cd: RUNIC LETTER C*/
- RTUNI_ALPHA, /* U+0016ce: RUNIC LETTER Z*/
- RTUNI_ALPHA, /* U+0016cf: RUNIC LETTER TIWAZ TIR TYR T*/
- RTUNI_ALPHA, /* U+0016d0: RUNIC LETTER SHORT-TWIG-TYR T*/
- RTUNI_ALPHA, /* U+0016d1: RUNIC LETTER D*/
- RTUNI_ALPHA, /* U+0016d2: RUNIC LETTER BERKANAN BEORC BJARKAN B*/
- RTUNI_ALPHA, /* U+0016d3: RUNIC LETTER SHORT-TWIG-BJARKAN B*/
- RTUNI_ALPHA, /* U+0016d4: RUNIC LETTER DOTTED-P*/
- RTUNI_ALPHA, /* U+0016d5: RUNIC LETTER OPEN-P*/
- RTUNI_ALPHA, /* U+0016d6: RUNIC LETTER EHWAZ EH E*/
- RTUNI_ALPHA, /* U+0016d7: RUNIC LETTER MANNAZ MAN M*/
- RTUNI_ALPHA, /* U+0016d8: RUNIC LETTER LONG-BRANCH-MADR M*/
- RTUNI_ALPHA, /* U+0016d9: RUNIC LETTER SHORT-TWIG-MADR M*/
- RTUNI_ALPHA, /* U+0016da: RUNIC LETTER LAUKAZ LAGU LOGR L*/
- RTUNI_ALPHA, /* U+0016db: RUNIC LETTER DOTTED-L*/
- RTUNI_ALPHA, /* U+0016dc: RUNIC LETTER INGWAZ*/
- RTUNI_ALPHA, /* U+0016dd: RUNIC LETTER ING*/
- RTUNI_ALPHA, /* U+0016de: RUNIC LETTER DAGAZ DAEG D*/
- RTUNI_ALPHA, /* U+0016df: RUNIC LETTER OTHALAN ETHEL O*/
- RTUNI_ALPHA, /* U+0016e0: RUNIC LETTER EAR*/
- RTUNI_ALPHA, /* U+0016e1: RUNIC LETTER IOR*/
- RTUNI_ALPHA, /* U+0016e2: RUNIC LETTER CWEORTH*/
- RTUNI_ALPHA, /* U+0016e3: RUNIC LETTER CALC*/
- RTUNI_ALPHA, /* U+0016e4: RUNIC LETTER CEALC*/
- RTUNI_ALPHA, /* U+0016e5: RUNIC LETTER STAN*/
- RTUNI_ALPHA, /* U+0016e6: RUNIC LETTER LONG-BRANCH-YR*/
- RTUNI_ALPHA, /* U+0016e7: RUNIC LETTER SHORT-TWIG-YR*/
- RTUNI_ALPHA, /* U+0016e8: RUNIC LETTER ICELANDIC-YR*/
- RTUNI_ALPHA, /* U+0016e9: RUNIC LETTER Q*/
- RTUNI_ALPHA, /* U+0016ea: RUNIC LETTER X*/
- 0, /* U+0016eb: RUNIC SINGLE PUNCTUATION*/
- 0, /* U+0016ec: RUNIC MULTIPLE PUNCTUATION*/
- 0, /* U+0016ed: RUNIC CROSS PUNCTUATION*/
- RTUNI_ALPHA, /* U+0016ee: RUNIC ARLAUG SYMBOL*/
- RTUNI_ALPHA, /* U+0016ef: RUNIC TVIMADUR SYMBOL*/
- RTUNI_ALPHA, /* U+0016f0: RUNIC BELGTHOR SYMBOL*/
- 0, /* U+0016f1: */
- 0, /* U+0016f2: */
- 0, /* U+0016f3: */
- 0, /* U+0016f4: */
- 0, /* U+0016f5: */
- 0, /* U+0016f6: */
- 0, /* U+0016f7: */
- 0, /* U+0016f8: */
- 0, /* U+0016f9: */
- 0, /* U+0016fa: */
- 0, /* U+0016fb: */
- 0, /* U+0016fc: */
- 0, /* U+0016fd: */
- 0, /* U+0016fe: */
- 0, /* U+0016ff: */
- RTUNI_ALPHA, /* U+001700: TAGALOG LETTER A*/
- RTUNI_ALPHA, /* U+001701: TAGALOG LETTER I*/
- RTUNI_ALPHA, /* U+001702: TAGALOG LETTER U*/
- RTUNI_ALPHA, /* U+001703: TAGALOG LETTER KA*/
- RTUNI_ALPHA, /* U+001704: TAGALOG LETTER GA*/
- RTUNI_ALPHA, /* U+001705: TAGALOG LETTER NGA*/
- RTUNI_ALPHA, /* U+001706: TAGALOG LETTER TA*/
- RTUNI_ALPHA, /* U+001707: TAGALOG LETTER DA*/
- RTUNI_ALPHA, /* U+001708: TAGALOG LETTER NA*/
- RTUNI_ALPHA, /* U+001709: TAGALOG LETTER PA*/
- RTUNI_ALPHA, /* U+00170a: TAGALOG LETTER BA*/
- RTUNI_ALPHA, /* U+00170b: TAGALOG LETTER MA*/
- RTUNI_ALPHA, /* U+00170c: TAGALOG LETTER YA*/
- 0, /* U+00170d: */
- RTUNI_ALPHA, /* U+00170e: TAGALOG LETTER LA*/
- RTUNI_ALPHA, /* U+00170f: TAGALOG LETTER WA*/
- RTUNI_ALPHA, /* U+001710: TAGALOG LETTER SA*/
- RTUNI_ALPHA, /* U+001711: TAGALOG LETTER HA*/
- RTUNI_ALPHA, /* U+001712: TAGALOG VOWEL SIGN I*/
- RTUNI_ALPHA, /* U+001713: TAGALOG VOWEL SIGN U*/
- 0, /* U+001714: TAGALOG SIGN VIRAMA*/
- 0, /* U+001715: */
- 0, /* U+001716: */
- 0, /* U+001717: */
- 0, /* U+001718: */
- 0, /* U+001719: */
- 0, /* U+00171a: */
- 0, /* U+00171b: */
- 0, /* U+00171c: */
- 0, /* U+00171d: */
- 0, /* U+00171e: */
- 0, /* U+00171f: */
- RTUNI_ALPHA, /* U+001720: HANUNOO LETTER A*/
- RTUNI_ALPHA, /* U+001721: HANUNOO LETTER I*/
- RTUNI_ALPHA, /* U+001722: HANUNOO LETTER U*/
- RTUNI_ALPHA, /* U+001723: HANUNOO LETTER KA*/
- RTUNI_ALPHA, /* U+001724: HANUNOO LETTER GA*/
- RTUNI_ALPHA, /* U+001725: HANUNOO LETTER NGA*/
- RTUNI_ALPHA, /* U+001726: HANUNOO LETTER TA*/
- RTUNI_ALPHA, /* U+001727: HANUNOO LETTER DA*/
- RTUNI_ALPHA, /* U+001728: HANUNOO LETTER NA*/
- RTUNI_ALPHA, /* U+001729: HANUNOO LETTER PA*/
- RTUNI_ALPHA, /* U+00172a: HANUNOO LETTER BA*/
- RTUNI_ALPHA, /* U+00172b: HANUNOO LETTER MA*/
- RTUNI_ALPHA, /* U+00172c: HANUNOO LETTER YA*/
- RTUNI_ALPHA, /* U+00172d: HANUNOO LETTER RA*/
- RTUNI_ALPHA, /* U+00172e: HANUNOO LETTER LA*/
- RTUNI_ALPHA, /* U+00172f: HANUNOO LETTER WA*/
- RTUNI_ALPHA, /* U+001730: HANUNOO LETTER SA*/
- RTUNI_ALPHA, /* U+001731: HANUNOO LETTER HA*/
- RTUNI_ALPHA, /* U+001732: HANUNOO VOWEL SIGN I*/
- RTUNI_ALPHA, /* U+001733: HANUNOO VOWEL SIGN U*/
- 0, /* U+001734: HANUNOO SIGN PAMUDPOD*/
- 0, /* U+001735: PHILIPPINE SINGLE PUNCTUATION*/
- 0, /* U+001736: PHILIPPINE DOUBLE PUNCTUATION*/
- 0, /* U+001737: */
- 0, /* U+001738: */
- 0, /* U+001739: */
- 0, /* U+00173a: */
- 0, /* U+00173b: */
- 0, /* U+00173c: */
- 0, /* U+00173d: */
- 0, /* U+00173e: */
- 0, /* U+00173f: */
- RTUNI_ALPHA, /* U+001740: BUHID LETTER A*/
- RTUNI_ALPHA, /* U+001741: BUHID LETTER I*/
- RTUNI_ALPHA, /* U+001742: BUHID LETTER U*/
- RTUNI_ALPHA, /* U+001743: BUHID LETTER KA*/
- RTUNI_ALPHA, /* U+001744: BUHID LETTER GA*/
- RTUNI_ALPHA, /* U+001745: BUHID LETTER NGA*/
- RTUNI_ALPHA, /* U+001746: BUHID LETTER TA*/
- RTUNI_ALPHA, /* U+001747: BUHID LETTER DA*/
- RTUNI_ALPHA, /* U+001748: BUHID LETTER NA*/
- RTUNI_ALPHA, /* U+001749: BUHID LETTER PA*/
- RTUNI_ALPHA, /* U+00174a: BUHID LETTER BA*/
- RTUNI_ALPHA, /* U+00174b: BUHID LETTER MA*/
- RTUNI_ALPHA, /* U+00174c: BUHID LETTER YA*/
- RTUNI_ALPHA, /* U+00174d: BUHID LETTER RA*/
- RTUNI_ALPHA, /* U+00174e: BUHID LETTER LA*/
- RTUNI_ALPHA, /* U+00174f: BUHID LETTER WA*/
- RTUNI_ALPHA, /* U+001750: BUHID LETTER SA*/
- RTUNI_ALPHA, /* U+001751: BUHID LETTER HA*/
- RTUNI_ALPHA, /* U+001752: BUHID VOWEL SIGN I*/
- RTUNI_ALPHA, /* U+001753: BUHID VOWEL SIGN U*/
- 0, /* U+001754: */
- 0, /* U+001755: */
- 0, /* U+001756: */
- 0, /* U+001757: */
- 0, /* U+001758: */
- 0, /* U+001759: */
- 0, /* U+00175a: */
- 0, /* U+00175b: */
- 0, /* U+00175c: */
- 0, /* U+00175d: */
- 0, /* U+00175e: */
- 0, /* U+00175f: */
- RTUNI_ALPHA, /* U+001760: TAGBANWA LETTER A*/
- RTUNI_ALPHA, /* U+001761: TAGBANWA LETTER I*/
- RTUNI_ALPHA, /* U+001762: TAGBANWA LETTER U*/
- RTUNI_ALPHA, /* U+001763: TAGBANWA LETTER KA*/
- RTUNI_ALPHA, /* U+001764: TAGBANWA LETTER GA*/
- RTUNI_ALPHA, /* U+001765: TAGBANWA LETTER NGA*/
- RTUNI_ALPHA, /* U+001766: TAGBANWA LETTER TA*/
- RTUNI_ALPHA, /* U+001767: TAGBANWA LETTER DA*/
- RTUNI_ALPHA, /* U+001768: TAGBANWA LETTER NA*/
- RTUNI_ALPHA, /* U+001769: TAGBANWA LETTER PA*/
- RTUNI_ALPHA, /* U+00176a: TAGBANWA LETTER BA*/
- RTUNI_ALPHA, /* U+00176b: TAGBANWA LETTER MA*/
- RTUNI_ALPHA, /* U+00176c: TAGBANWA LETTER YA*/
- 0, /* U+00176d: */
- RTUNI_ALPHA, /* U+00176e: TAGBANWA LETTER LA*/
- RTUNI_ALPHA, /* U+00176f: TAGBANWA LETTER WA*/
- RTUNI_ALPHA, /* U+001770: TAGBANWA LETTER SA*/
- 0, /* U+001771: */
- RTUNI_ALPHA, /* U+001772: TAGBANWA VOWEL SIGN I*/
- RTUNI_ALPHA, /* U+001773: TAGBANWA VOWEL SIGN U*/
- 0, /* U+001774: */
- 0, /* U+001775: */
- 0, /* U+001776: */
- 0, /* U+001777: */
- 0, /* U+001778: */
- 0, /* U+001779: */
- 0, /* U+00177a: */
- 0, /* U+00177b: */
- 0, /* U+00177c: */
- 0, /* U+00177d: */
- 0, /* U+00177e: */
- 0, /* U+00177f: */
- RTUNI_ALPHA, /* U+001780: KHMER LETTER KA*/
- RTUNI_ALPHA, /* U+001781: KHMER LETTER KHA*/
- RTUNI_ALPHA, /* U+001782: KHMER LETTER KO*/
- RTUNI_ALPHA, /* U+001783: KHMER LETTER KHO*/
- RTUNI_ALPHA, /* U+001784: KHMER LETTER NGO*/
- RTUNI_ALPHA, /* U+001785: KHMER LETTER CA*/
- RTUNI_ALPHA, /* U+001786: KHMER LETTER CHA*/
- RTUNI_ALPHA, /* U+001787: KHMER LETTER CO*/
- RTUNI_ALPHA, /* U+001788: KHMER LETTER CHO*/
- RTUNI_ALPHA, /* U+001789: KHMER LETTER NYO*/
- RTUNI_ALPHA, /* U+00178a: KHMER LETTER DA*/
- RTUNI_ALPHA, /* U+00178b: KHMER LETTER TTHA*/
- RTUNI_ALPHA, /* U+00178c: KHMER LETTER DO*/
- RTUNI_ALPHA, /* U+00178d: KHMER LETTER TTHO*/
- RTUNI_ALPHA, /* U+00178e: KHMER LETTER NNO*/
- RTUNI_ALPHA, /* U+00178f: KHMER LETTER TA*/
- RTUNI_ALPHA, /* U+001790: KHMER LETTER THA*/
- RTUNI_ALPHA, /* U+001791: KHMER LETTER TO*/
- RTUNI_ALPHA, /* U+001792: KHMER LETTER THO*/
- RTUNI_ALPHA, /* U+001793: KHMER LETTER NO*/
- RTUNI_ALPHA, /* U+001794: KHMER LETTER BA*/
- RTUNI_ALPHA, /* U+001795: KHMER LETTER PHA*/
- RTUNI_ALPHA, /* U+001796: KHMER LETTER PO*/
- RTUNI_ALPHA, /* U+001797: KHMER LETTER PHO*/
- RTUNI_ALPHA, /* U+001798: KHMER LETTER MO*/
- RTUNI_ALPHA, /* U+001799: KHMER LETTER YO*/
- RTUNI_ALPHA, /* U+00179a: KHMER LETTER RO*/
- RTUNI_ALPHA, /* U+00179b: KHMER LETTER LO*/
- RTUNI_ALPHA, /* U+00179c: KHMER LETTER VO*/
- RTUNI_ALPHA, /* U+00179d: KHMER LETTER SHA*/
- RTUNI_ALPHA, /* U+00179e: KHMER LETTER SSO*/
- RTUNI_ALPHA, /* U+00179f: KHMER LETTER SA*/
- RTUNI_ALPHA, /* U+0017a0: KHMER LETTER HA*/
- RTUNI_ALPHA, /* U+0017a1: KHMER LETTER LA*/
- RTUNI_ALPHA, /* U+0017a2: KHMER LETTER QA*/
- RTUNI_ALPHA, /* U+0017a3: KHMER INDEPENDENT VOWEL QAQ*/
- RTUNI_ALPHA, /* U+0017a4: KHMER INDEPENDENT VOWEL QAA*/
- RTUNI_ALPHA, /* U+0017a5: KHMER INDEPENDENT VOWEL QI*/
- RTUNI_ALPHA, /* U+0017a6: KHMER INDEPENDENT VOWEL QII*/
- RTUNI_ALPHA, /* U+0017a7: KHMER INDEPENDENT VOWEL QU*/
- RTUNI_ALPHA, /* U+0017a8: KHMER INDEPENDENT VOWEL QUK*/
- RTUNI_ALPHA, /* U+0017a9: KHMER INDEPENDENT VOWEL QUU*/
- RTUNI_ALPHA, /* U+0017aa: KHMER INDEPENDENT VOWEL QUUV*/
- RTUNI_ALPHA, /* U+0017ab: KHMER INDEPENDENT VOWEL RY*/
- RTUNI_ALPHA, /* U+0017ac: KHMER INDEPENDENT VOWEL RYY*/
- RTUNI_ALPHA, /* U+0017ad: KHMER INDEPENDENT VOWEL LY*/
- RTUNI_ALPHA, /* U+0017ae: KHMER INDEPENDENT VOWEL LYY*/
- RTUNI_ALPHA, /* U+0017af: KHMER INDEPENDENT VOWEL QE*/
- RTUNI_ALPHA, /* U+0017b0: KHMER INDEPENDENT VOWEL QAI*/
- RTUNI_ALPHA, /* U+0017b1: KHMER INDEPENDENT VOWEL QOO TYPE ONE*/
- RTUNI_ALPHA, /* U+0017b2: KHMER INDEPENDENT VOWEL QOO TYPE TWO*/
- RTUNI_ALPHA, /* U+0017b3: KHMER INDEPENDENT VOWEL QAU*/
- 0, /* U+0017b4: KHMER VOWEL INHERENT AQ*/
- 0, /* U+0017b5: KHMER VOWEL INHERENT AA*/
- RTUNI_ALPHA, /* U+0017b6: KHMER VOWEL SIGN AA*/
- RTUNI_ALPHA, /* U+0017b7: KHMER VOWEL SIGN I*/
- RTUNI_ALPHA, /* U+0017b8: KHMER VOWEL SIGN II*/
- RTUNI_ALPHA, /* U+0017b9: KHMER VOWEL SIGN Y*/
- RTUNI_ALPHA, /* U+0017ba: KHMER VOWEL SIGN YY*/
- RTUNI_ALPHA, /* U+0017bb: KHMER VOWEL SIGN U*/
- RTUNI_ALPHA, /* U+0017bc: KHMER VOWEL SIGN UU*/
- RTUNI_ALPHA, /* U+0017bd: KHMER VOWEL SIGN UA*/
- RTUNI_ALPHA, /* U+0017be: KHMER VOWEL SIGN OE*/
- RTUNI_ALPHA, /* U+0017bf: KHMER VOWEL SIGN YA*/
- RTUNI_ALPHA, /* U+0017c0: KHMER VOWEL SIGN IE*/
- RTUNI_ALPHA, /* U+0017c1: KHMER VOWEL SIGN E*/
- RTUNI_ALPHA, /* U+0017c2: KHMER VOWEL SIGN AE*/
- RTUNI_ALPHA, /* U+0017c3: KHMER VOWEL SIGN AI*/
- RTUNI_ALPHA, /* U+0017c4: KHMER VOWEL SIGN OO*/
- RTUNI_ALPHA, /* U+0017c5: KHMER VOWEL SIGN AU*/
- RTUNI_ALPHA, /* U+0017c6: KHMER SIGN NIKAHIT*/
- RTUNI_ALPHA, /* U+0017c7: KHMER SIGN REAHMUK*/
- RTUNI_ALPHA, /* U+0017c8: KHMER SIGN YUUKALEAPINTU*/
- 0, /* U+0017c9: KHMER SIGN MUUSIKATOAN*/
- 0, /* U+0017ca: KHMER SIGN TRIISAP*/
- 0, /* U+0017cb: KHMER SIGN BANTOC*/
- 0, /* U+0017cc: KHMER SIGN ROBAT*/
- 0, /* U+0017cd: KHMER SIGN TOANDAKHIAT*/
- 0, /* U+0017ce: KHMER SIGN KAKABAT*/
- 0, /* U+0017cf: KHMER SIGN AHSDA*/
- 0, /* U+0017d0: KHMER SIGN SAMYOK SANNYA*/
- 0, /* U+0017d1: KHMER SIGN VIRIAM*/
- 0, /* U+0017d2: KHMER SIGN COENG*/
- 0, /* U+0017d3: KHMER SIGN BATHAMASAT*/
- 0, /* U+0017d4: KHMER SIGN KHAN*/
- 0, /* U+0017d5: KHMER SIGN BARIYOOSAN*/
- 0, /* U+0017d6: KHMER SIGN CAMNUC PII KUUH*/
- RTUNI_ALPHA, /* U+0017d7: KHMER SIGN LEK TOO*/
- 0, /* U+0017d8: KHMER SIGN BEYYAL*/
- 0, /* U+0017d9: KHMER SIGN PHNAEK MUAN*/
- 0, /* U+0017da: KHMER SIGN KOOMUUT*/
- 0, /* U+0017db: KHMER CURRENCY SYMBOL RIEL*/
- RTUNI_ALPHA, /* U+0017dc: KHMER SIGN AVAKRAHASANYA*/
- 0, /* U+0017dd: KHMER SIGN ATTHACAN*/
- 0, /* U+0017de: */
- 0, /* U+0017df: */
- RTUNI_DDIGIT, /* U+0017e0: KHMER DIGIT ZERO*/
- RTUNI_DDIGIT, /* U+0017e1: KHMER DIGIT ONE*/
- RTUNI_DDIGIT, /* U+0017e2: KHMER DIGIT TWO*/
- RTUNI_DDIGIT, /* U+0017e3: KHMER DIGIT THREE*/
- RTUNI_DDIGIT, /* U+0017e4: KHMER DIGIT FOUR*/
- RTUNI_DDIGIT, /* U+0017e5: KHMER DIGIT FIVE*/
- RTUNI_DDIGIT, /* U+0017e6: KHMER DIGIT SIX*/
- RTUNI_DDIGIT, /* U+0017e7: KHMER DIGIT SEVEN*/
- RTUNI_DDIGIT, /* U+0017e8: KHMER DIGIT EIGHT*/
- RTUNI_DDIGIT, /* U+0017e9: KHMER DIGIT NINE*/
- 0, /* U+0017ea: */
- 0, /* U+0017eb: */
- 0, /* U+0017ec: */
- 0, /* U+0017ed: */
- 0, /* U+0017ee: */
- 0, /* U+0017ef: */
- 0, /* U+0017f0: KHMER SYMBOL LEK ATTAK SON*/
- 0, /* U+0017f1: KHMER SYMBOL LEK ATTAK MUOY*/
- 0, /* U+0017f2: KHMER SYMBOL LEK ATTAK PII*/
- 0, /* U+0017f3: KHMER SYMBOL LEK ATTAK BEI*/
- 0, /* U+0017f4: KHMER SYMBOL LEK ATTAK BUON*/
- 0, /* U+0017f5: KHMER SYMBOL LEK ATTAK PRAM*/
- 0, /* U+0017f6: KHMER SYMBOL LEK ATTAK PRAM-MUOY*/
- 0, /* U+0017f7: KHMER SYMBOL LEK ATTAK PRAM-PII*/
- 0, /* U+0017f8: KHMER SYMBOL LEK ATTAK PRAM-BEI*/
- 0, /* U+0017f9: KHMER SYMBOL LEK ATTAK PRAM-BUON*/
- 0, /* U+0017fa: */
- 0, /* U+0017fb: */
- 0, /* U+0017fc: */
- 0, /* U+0017fd: */
- 0, /* U+0017fe: */
- 0, /* U+0017ff: */
- 0, /* U+001800: MONGOLIAN BIRGA*/
- 0, /* U+001801: MONGOLIAN ELLIPSIS*/
- 0, /* U+001802: MONGOLIAN COMMA*/
- 0, /* U+001803: MONGOLIAN FULL STOP*/
- 0, /* U+001804: MONGOLIAN COLON*/
- 0, /* U+001805: MONGOLIAN FOUR DOTS*/
- 0, /* U+001806: MONGOLIAN TODO SOFT HYPHEN*/
- 0, /* U+001807: MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER*/
- 0, /* U+001808: MONGOLIAN MANCHU COMMA*/
- 0, /* U+001809: MONGOLIAN MANCHU FULL STOP*/
- 0, /* U+00180a: MONGOLIAN NIRUGU*/
- 0, /* U+00180b: MONGOLIAN FREE VARIATION SELECTOR ONE*/
- 0, /* U+00180c: MONGOLIAN FREE VARIATION SELECTOR TWO*/
- 0, /* U+00180d: MONGOLIAN FREE VARIATION SELECTOR THREE*/
- RTUNI_WSPACE, /* U+00180e: MONGOLIAN VOWEL SEPARATOR*/
- 0, /* U+00180f: */
- RTUNI_DDIGIT, /* U+001810: MONGOLIAN DIGIT ZERO*/
- RTUNI_DDIGIT, /* U+001811: MONGOLIAN DIGIT ONE*/
- RTUNI_DDIGIT, /* U+001812: MONGOLIAN DIGIT TWO*/
- RTUNI_DDIGIT, /* U+001813: MONGOLIAN DIGIT THREE*/
- RTUNI_DDIGIT, /* U+001814: MONGOLIAN DIGIT FOUR*/
- RTUNI_DDIGIT, /* U+001815: MONGOLIAN DIGIT FIVE*/
- RTUNI_DDIGIT, /* U+001816: MONGOLIAN DIGIT SIX*/
- RTUNI_DDIGIT, /* U+001817: MONGOLIAN DIGIT SEVEN*/
- RTUNI_DDIGIT, /* U+001818: MONGOLIAN DIGIT EIGHT*/
- RTUNI_DDIGIT, /* U+001819: MONGOLIAN DIGIT NINE*/
- 0, /* U+00181a: */
- 0, /* U+00181b: */
- 0, /* U+00181c: */
- 0, /* U+00181d: */
- 0, /* U+00181e: */
- 0, /* U+00181f: */
- RTUNI_ALPHA, /* U+001820: MONGOLIAN LETTER A*/
- RTUNI_ALPHA, /* U+001821: MONGOLIAN LETTER E*/
- RTUNI_ALPHA, /* U+001822: MONGOLIAN LETTER I*/
- RTUNI_ALPHA, /* U+001823: MONGOLIAN LETTER O*/
- RTUNI_ALPHA, /* U+001824: MONGOLIAN LETTER U*/
- RTUNI_ALPHA, /* U+001825: MONGOLIAN LETTER OE*/
- RTUNI_ALPHA, /* U+001826: MONGOLIAN LETTER UE*/
- RTUNI_ALPHA, /* U+001827: MONGOLIAN LETTER EE*/
- RTUNI_ALPHA, /* U+001828: MONGOLIAN LETTER NA*/
- RTUNI_ALPHA, /* U+001829: MONGOLIAN LETTER ANG*/
- RTUNI_ALPHA, /* U+00182a: MONGOLIAN LETTER BA*/
- RTUNI_ALPHA, /* U+00182b: MONGOLIAN LETTER PA*/
- RTUNI_ALPHA, /* U+00182c: MONGOLIAN LETTER QA*/
- RTUNI_ALPHA, /* U+00182d: MONGOLIAN LETTER GA*/
- RTUNI_ALPHA, /* U+00182e: MONGOLIAN LETTER MA*/
- RTUNI_ALPHA, /* U+00182f: MONGOLIAN LETTER LA*/
- RTUNI_ALPHA, /* U+001830: MONGOLIAN LETTER SA*/
- RTUNI_ALPHA, /* U+001831: MONGOLIAN LETTER SHA*/
- RTUNI_ALPHA, /* U+001832: MONGOLIAN LETTER TA*/
- RTUNI_ALPHA, /* U+001833: MONGOLIAN LETTER DA*/
- RTUNI_ALPHA, /* U+001834: MONGOLIAN LETTER CHA*/
- RTUNI_ALPHA, /* U+001835: MONGOLIAN LETTER JA*/
- RTUNI_ALPHA, /* U+001836: MONGOLIAN LETTER YA*/
- RTUNI_ALPHA, /* U+001837: MONGOLIAN LETTER RA*/
- RTUNI_ALPHA, /* U+001838: MONGOLIAN LETTER WA*/
- RTUNI_ALPHA, /* U+001839: MONGOLIAN LETTER FA*/
- RTUNI_ALPHA, /* U+00183a: MONGOLIAN LETTER KA*/
- RTUNI_ALPHA, /* U+00183b: MONGOLIAN LETTER KHA*/
- RTUNI_ALPHA, /* U+00183c: MONGOLIAN LETTER TSA*/
- RTUNI_ALPHA, /* U+00183d: MONGOLIAN LETTER ZA*/
- RTUNI_ALPHA, /* U+00183e: MONGOLIAN LETTER HAA*/
- RTUNI_ALPHA, /* U+00183f: MONGOLIAN LETTER ZRA*/
- RTUNI_ALPHA, /* U+001840: MONGOLIAN LETTER LHA*/
- RTUNI_ALPHA, /* U+001841: MONGOLIAN LETTER ZHI*/
- RTUNI_ALPHA, /* U+001842: MONGOLIAN LETTER CHI*/
- RTUNI_ALPHA, /* U+001843: MONGOLIAN LETTER TODO LONG VOWEL SIGN*/
- RTUNI_ALPHA, /* U+001844: MONGOLIAN LETTER TODO E*/
- RTUNI_ALPHA, /* U+001845: MONGOLIAN LETTER TODO I*/
- RTUNI_ALPHA, /* U+001846: MONGOLIAN LETTER TODO O*/
- RTUNI_ALPHA, /* U+001847: MONGOLIAN LETTER TODO U*/
- RTUNI_ALPHA, /* U+001848: MONGOLIAN LETTER TODO OE*/
- RTUNI_ALPHA, /* U+001849: MONGOLIAN LETTER TODO UE*/
- RTUNI_ALPHA, /* U+00184a: MONGOLIAN LETTER TODO ANG*/
- RTUNI_ALPHA, /* U+00184b: MONGOLIAN LETTER TODO BA*/
- RTUNI_ALPHA, /* U+00184c: MONGOLIAN LETTER TODO PA*/
- RTUNI_ALPHA, /* U+00184d: MONGOLIAN LETTER TODO QA*/
- RTUNI_ALPHA, /* U+00184e: MONGOLIAN LETTER TODO GA*/
- RTUNI_ALPHA, /* U+00184f: MONGOLIAN LETTER TODO MA*/
- RTUNI_ALPHA, /* U+001850: MONGOLIAN LETTER TODO TA*/
- RTUNI_ALPHA, /* U+001851: MONGOLIAN LETTER TODO DA*/
- RTUNI_ALPHA, /* U+001852: MONGOLIAN LETTER TODO CHA*/
- RTUNI_ALPHA, /* U+001853: MONGOLIAN LETTER TODO JA*/
- RTUNI_ALPHA, /* U+001854: MONGOLIAN LETTER TODO TSA*/
- RTUNI_ALPHA, /* U+001855: MONGOLIAN LETTER TODO YA*/
- RTUNI_ALPHA, /* U+001856: MONGOLIAN LETTER TODO WA*/
- RTUNI_ALPHA, /* U+001857: MONGOLIAN LETTER TODO KA*/
- RTUNI_ALPHA, /* U+001858: MONGOLIAN LETTER TODO GAA*/
- RTUNI_ALPHA, /* U+001859: MONGOLIAN LETTER TODO HAA*/
- RTUNI_ALPHA, /* U+00185a: MONGOLIAN LETTER TODO JIA*/
- RTUNI_ALPHA, /* U+00185b: MONGOLIAN LETTER TODO NIA*/
- RTUNI_ALPHA, /* U+00185c: MONGOLIAN LETTER TODO DZA*/
- RTUNI_ALPHA, /* U+00185d: MONGOLIAN LETTER SIBE E*/
- RTUNI_ALPHA, /* U+00185e: MONGOLIAN LETTER SIBE I*/
- RTUNI_ALPHA, /* U+00185f: MONGOLIAN LETTER SIBE IY*/
- RTUNI_ALPHA, /* U+001860: MONGOLIAN LETTER SIBE UE*/
- RTUNI_ALPHA, /* U+001861: MONGOLIAN LETTER SIBE U*/
- RTUNI_ALPHA, /* U+001862: MONGOLIAN LETTER SIBE ANG*/
- RTUNI_ALPHA, /* U+001863: MONGOLIAN LETTER SIBE KA*/
- RTUNI_ALPHA, /* U+001864: MONGOLIAN LETTER SIBE GA*/
- RTUNI_ALPHA, /* U+001865: MONGOLIAN LETTER SIBE HA*/
- RTUNI_ALPHA, /* U+001866: MONGOLIAN LETTER SIBE PA*/
- RTUNI_ALPHA, /* U+001867: MONGOLIAN LETTER SIBE SHA*/
- RTUNI_ALPHA, /* U+001868: MONGOLIAN LETTER SIBE TA*/
- RTUNI_ALPHA, /* U+001869: MONGOLIAN LETTER SIBE DA*/
- RTUNI_ALPHA, /* U+00186a: MONGOLIAN LETTER SIBE JA*/
- RTUNI_ALPHA, /* U+00186b: MONGOLIAN LETTER SIBE FA*/
- RTUNI_ALPHA, /* U+00186c: MONGOLIAN LETTER SIBE GAA*/
- RTUNI_ALPHA, /* U+00186d: MONGOLIAN LETTER SIBE HAA*/
- RTUNI_ALPHA, /* U+00186e: MONGOLIAN LETTER SIBE TSA*/
- RTUNI_ALPHA, /* U+00186f: MONGOLIAN LETTER SIBE ZA*/
- RTUNI_ALPHA, /* U+001870: MONGOLIAN LETTER SIBE RAA*/
- RTUNI_ALPHA, /* U+001871: MONGOLIAN LETTER SIBE CHA*/
- RTUNI_ALPHA, /* U+001872: MONGOLIAN LETTER SIBE ZHA*/
- RTUNI_ALPHA, /* U+001873: MONGOLIAN LETTER MANCHU I*/
- RTUNI_ALPHA, /* U+001874: MONGOLIAN LETTER MANCHU KA*/
- RTUNI_ALPHA, /* U+001875: MONGOLIAN LETTER MANCHU RA*/
- RTUNI_ALPHA, /* U+001876: MONGOLIAN LETTER MANCHU FA*/
- RTUNI_ALPHA, /* U+001877: MONGOLIAN LETTER MANCHU ZHA*/
- 0, /* U+001878: */
- 0, /* U+001879: */
- 0, /* U+00187a: */
- 0, /* U+00187b: */
- 0, /* U+00187c: */
- 0, /* U+00187d: */
- 0, /* U+00187e: */
- 0, /* U+00187f: */
- RTUNI_ALPHA, /* U+001880: MONGOLIAN LETTER ALI GALI ANUSVARA ONE*/
- RTUNI_ALPHA, /* U+001881: MONGOLIAN LETTER ALI GALI VISARGA ONE*/
- RTUNI_ALPHA, /* U+001882: MONGOLIAN LETTER ALI GALI DAMARU*/
- RTUNI_ALPHA, /* U+001883: MONGOLIAN LETTER ALI GALI UBADAMA*/
- RTUNI_ALPHA, /* U+001884: MONGOLIAN LETTER ALI GALI INVERTED UBADAMA*/
- RTUNI_ALPHA, /* U+001885: MONGOLIAN LETTER ALI GALI BALUDA*/
- RTUNI_ALPHA, /* U+001886: MONGOLIAN LETTER ALI GALI THREE BALUDA*/
- RTUNI_ALPHA, /* U+001887: MONGOLIAN LETTER ALI GALI A*/
- RTUNI_ALPHA, /* U+001888: MONGOLIAN LETTER ALI GALI I*/
- RTUNI_ALPHA, /* U+001889: MONGOLIAN LETTER ALI GALI KA*/
- RTUNI_ALPHA, /* U+00188a: MONGOLIAN LETTER ALI GALI NGA*/
- RTUNI_ALPHA, /* U+00188b: MONGOLIAN LETTER ALI GALI CA*/
- RTUNI_ALPHA, /* U+00188c: MONGOLIAN LETTER ALI GALI TTA*/
- RTUNI_ALPHA, /* U+00188d: MONGOLIAN LETTER ALI GALI TTHA*/
- RTUNI_ALPHA, /* U+00188e: MONGOLIAN LETTER ALI GALI DDA*/
- RTUNI_ALPHA, /* U+00188f: MONGOLIAN LETTER ALI GALI NNA*/
- RTUNI_ALPHA, /* U+001890: MONGOLIAN LETTER ALI GALI TA*/
- RTUNI_ALPHA, /* U+001891: MONGOLIAN LETTER ALI GALI DA*/
- RTUNI_ALPHA, /* U+001892: MONGOLIAN LETTER ALI GALI PA*/
- RTUNI_ALPHA, /* U+001893: MONGOLIAN LETTER ALI GALI PHA*/
- RTUNI_ALPHA, /* U+001894: MONGOLIAN LETTER ALI GALI SSA*/
- RTUNI_ALPHA, /* U+001895: MONGOLIAN LETTER ALI GALI ZHA*/
- RTUNI_ALPHA, /* U+001896: MONGOLIAN LETTER ALI GALI ZA*/
- RTUNI_ALPHA, /* U+001897: MONGOLIAN LETTER ALI GALI AH*/
- RTUNI_ALPHA, /* U+001898: MONGOLIAN LETTER TODO ALI GALI TA*/
- RTUNI_ALPHA, /* U+001899: MONGOLIAN LETTER TODO ALI GALI ZHA*/
- RTUNI_ALPHA, /* U+00189a: MONGOLIAN LETTER MANCHU ALI GALI GHA*/
- RTUNI_ALPHA, /* U+00189b: MONGOLIAN LETTER MANCHU ALI GALI NGA*/
- RTUNI_ALPHA, /* U+00189c: MONGOLIAN LETTER MANCHU ALI GALI CA*/
- RTUNI_ALPHA, /* U+00189d: MONGOLIAN LETTER MANCHU ALI GALI JHA*/
- RTUNI_ALPHA, /* U+00189e: MONGOLIAN LETTER MANCHU ALI GALI TTA*/
- RTUNI_ALPHA, /* U+00189f: MONGOLIAN LETTER MANCHU ALI GALI DDHA*/
- RTUNI_ALPHA, /* U+0018a0: MONGOLIAN LETTER MANCHU ALI GALI TA*/
- RTUNI_ALPHA, /* U+0018a1: MONGOLIAN LETTER MANCHU ALI GALI DHA*/
- RTUNI_ALPHA, /* U+0018a2: MONGOLIAN LETTER MANCHU ALI GALI SSA*/
- RTUNI_ALPHA, /* U+0018a3: MONGOLIAN LETTER MANCHU ALI GALI CYA*/
- RTUNI_ALPHA, /* U+0018a4: MONGOLIAN LETTER MANCHU ALI GALI ZHA*/
- RTUNI_ALPHA, /* U+0018a5: MONGOLIAN LETTER MANCHU ALI GALI ZA*/
- RTUNI_ALPHA, /* U+0018a6: MONGOLIAN LETTER ALI GALI HALF U*/
- RTUNI_ALPHA, /* U+0018a7: MONGOLIAN LETTER ALI GALI HALF YA*/
- RTUNI_ALPHA, /* U+0018a8: MONGOLIAN LETTER MANCHU ALI GALI BHA*/
- RTUNI_ALPHA, /* U+0018a9: MONGOLIAN LETTER ALI GALI DAGALGA*/
- 0, /* U+0018aa: */
- 0, /* U+0018ab: */
- 0, /* U+0018ac: */
- 0, /* U+0018ad: */
- 0, /* U+0018ae: */
- 0, /* U+0018af: */
- 0, /* U+0018b0: */
- 0, /* U+0018b1: */
- 0, /* U+0018b2: */
- 0, /* U+0018b3: */
- 0, /* U+0018b4: */
- 0, /* U+0018b5: */
- 0, /* U+0018b6: */
- 0, /* U+0018b7: */
- 0, /* U+0018b8: */
- 0, /* U+0018b9: */
- 0, /* U+0018ba: */
- 0, /* U+0018bb: */
- 0, /* U+0018bc: */
- 0, /* U+0018bd: */
- 0, /* U+0018be: */
- 0, /* U+0018bf: */
- 0, /* U+0018c0: */
- 0, /* U+0018c1: */
- 0, /* U+0018c2: */
- 0, /* U+0018c3: */
- 0, /* U+0018c4: */
- 0, /* U+0018c5: */
- 0, /* U+0018c6: */
- 0, /* U+0018c7: */
- 0, /* U+0018c8: */
- 0, /* U+0018c9: */
- 0, /* U+0018ca: */
- 0, /* U+0018cb: */
- 0, /* U+0018cc: */
- 0, /* U+0018cd: */
- 0, /* U+0018ce: */
- 0, /* U+0018cf: */
- 0, /* U+0018d0: */
- 0, /* U+0018d1: */
- 0, /* U+0018d2: */
- 0, /* U+0018d3: */
- 0, /* U+0018d4: */
- 0, /* U+0018d5: */
- 0, /* U+0018d6: */
- 0, /* U+0018d7: */
- 0, /* U+0018d8: */
- 0, /* U+0018d9: */
- 0, /* U+0018da: */
- 0, /* U+0018db: */
- 0, /* U+0018dc: */
- 0, /* U+0018dd: */
- 0, /* U+0018de: */
- 0, /* U+0018df: */
- 0, /* U+0018e0: */
- 0, /* U+0018e1: */
- 0, /* U+0018e2: */
- 0, /* U+0018e3: */
- 0, /* U+0018e4: */
- 0, /* U+0018e5: */
- 0, /* U+0018e6: */
- 0, /* U+0018e7: */
- 0, /* U+0018e8: */
- 0, /* U+0018e9: */
- 0, /* U+0018ea: */
- 0, /* U+0018eb: */
- 0, /* U+0018ec: */
- 0, /* U+0018ed: */
- 0, /* U+0018ee: */
- 0, /* U+0018ef: */
- 0, /* U+0018f0: */
- 0, /* U+0018f1: */
- 0, /* U+0018f2: */
- 0, /* U+0018f3: */
- 0, /* U+0018f4: */
- 0, /* U+0018f5: */
- 0, /* U+0018f6: */
- 0, /* U+0018f7: */
- 0, /* U+0018f8: */
- 0, /* U+0018f9: */
- 0, /* U+0018fa: */
- 0, /* U+0018fb: */
- 0, /* U+0018fc: */
- 0, /* U+0018fd: */
- 0, /* U+0018fe: */
- 0, /* U+0018ff: */
- RTUNI_ALPHA, /* U+001900: LIMBU VOWEL-CARRIER LETTER*/
- RTUNI_ALPHA, /* U+001901: LIMBU LETTER KA*/
- RTUNI_ALPHA, /* U+001902: LIMBU LETTER KHA*/
- RTUNI_ALPHA, /* U+001903: LIMBU LETTER GA*/
- RTUNI_ALPHA, /* U+001904: LIMBU LETTER GHA*/
- RTUNI_ALPHA, /* U+001905: LIMBU LETTER NGA*/
- RTUNI_ALPHA, /* U+001906: LIMBU LETTER CA*/
- RTUNI_ALPHA, /* U+001907: LIMBU LETTER CHA*/
- RTUNI_ALPHA, /* U+001908: LIMBU LETTER JA*/
- RTUNI_ALPHA, /* U+001909: LIMBU LETTER JHA*/
- RTUNI_ALPHA, /* U+00190a: LIMBU LETTER YAN*/
- RTUNI_ALPHA, /* U+00190b: LIMBU LETTER TA*/
- RTUNI_ALPHA, /* U+00190c: LIMBU LETTER THA*/
- RTUNI_ALPHA, /* U+00190d: LIMBU LETTER DA*/
- RTUNI_ALPHA, /* U+00190e: LIMBU LETTER DHA*/
- RTUNI_ALPHA, /* U+00190f: LIMBU LETTER NA*/
- RTUNI_ALPHA, /* U+001910: LIMBU LETTER PA*/
- RTUNI_ALPHA, /* U+001911: LIMBU LETTER PHA*/
- RTUNI_ALPHA, /* U+001912: LIMBU LETTER BA*/
- RTUNI_ALPHA, /* U+001913: LIMBU LETTER BHA*/
- RTUNI_ALPHA, /* U+001914: LIMBU LETTER MA*/
- RTUNI_ALPHA, /* U+001915: LIMBU LETTER YA*/
- RTUNI_ALPHA, /* U+001916: LIMBU LETTER RA*/
- RTUNI_ALPHA, /* U+001917: LIMBU LETTER LA*/
- RTUNI_ALPHA, /* U+001918: LIMBU LETTER WA*/
- RTUNI_ALPHA, /* U+001919: LIMBU LETTER SHA*/
- RTUNI_ALPHA, /* U+00191a: LIMBU LETTER SSA*/
- RTUNI_ALPHA, /* U+00191b: LIMBU LETTER SA*/
- RTUNI_ALPHA, /* U+00191c: LIMBU LETTER HA*/
- 0, /* U+00191d: */
- 0, /* U+00191e: */
- 0, /* U+00191f: */
- RTUNI_ALPHA, /* U+001920: LIMBU VOWEL SIGN A*/
- RTUNI_ALPHA, /* U+001921: LIMBU VOWEL SIGN I*/
- RTUNI_ALPHA, /* U+001922: LIMBU VOWEL SIGN U*/
- RTUNI_ALPHA, /* U+001923: LIMBU VOWEL SIGN EE*/
- RTUNI_ALPHA, /* U+001924: LIMBU VOWEL SIGN AI*/
- RTUNI_ALPHA, /* U+001925: LIMBU VOWEL SIGN OO*/
- RTUNI_ALPHA, /* U+001926: LIMBU VOWEL SIGN AU*/
- RTUNI_ALPHA, /* U+001927: LIMBU VOWEL SIGN E*/
- RTUNI_ALPHA, /* U+001928: LIMBU VOWEL SIGN O*/
- RTUNI_ALPHA, /* U+001929: LIMBU SUBJOINED LETTER YA*/
- RTUNI_ALPHA, /* U+00192a: LIMBU SUBJOINED LETTER RA*/
- RTUNI_ALPHA, /* U+00192b: LIMBU SUBJOINED LETTER WA*/
- 0, /* U+00192c: */
- 0, /* U+00192d: */
- 0, /* U+00192e: */
- 0, /* U+00192f: */
- RTUNI_ALPHA, /* U+001930: LIMBU SMALL LETTER KA*/
- RTUNI_ALPHA, /* U+001931: LIMBU SMALL LETTER NGA*/
- RTUNI_ALPHA, /* U+001932: LIMBU SMALL LETTER ANUSVARA*/
- RTUNI_ALPHA, /* U+001933: LIMBU SMALL LETTER TA*/
- RTUNI_ALPHA, /* U+001934: LIMBU SMALL LETTER NA*/
- RTUNI_ALPHA, /* U+001935: LIMBU SMALL LETTER PA*/
- RTUNI_ALPHA, /* U+001936: LIMBU SMALL LETTER MA*/
- RTUNI_ALPHA, /* U+001937: LIMBU SMALL LETTER RA*/
- RTUNI_ALPHA, /* U+001938: LIMBU SMALL LETTER LA*/
- 0, /* U+001939: LIMBU SIGN MUKPHRENG*/
- 0, /* U+00193a: LIMBU SIGN KEMPHRENG*/
- 0, /* U+00193b: LIMBU SIGN SA-I*/
- 0, /* U+00193c: */
- 0, /* U+00193d: */
- 0, /* U+00193e: */
- 0, /* U+00193f: */
- 0, /* U+001940: LIMBU SIGN LOO*/
- 0, /* U+001941: */
- 0, /* U+001942: */
- 0, /* U+001943: */
- 0, /* U+001944: LIMBU EXCLAMATION MARK*/
- 0, /* U+001945: LIMBU QUESTION MARK*/
- RTUNI_DDIGIT, /* U+001946: LIMBU DIGIT ZERO*/
- RTUNI_DDIGIT, /* U+001947: LIMBU DIGIT ONE*/
- RTUNI_DDIGIT, /* U+001948: LIMBU DIGIT TWO*/
- RTUNI_DDIGIT, /* U+001949: LIMBU DIGIT THREE*/
- RTUNI_DDIGIT, /* U+00194a: LIMBU DIGIT FOUR*/
- RTUNI_DDIGIT, /* U+00194b: LIMBU DIGIT FIVE*/
- RTUNI_DDIGIT, /* U+00194c: LIMBU DIGIT SIX*/
- RTUNI_DDIGIT, /* U+00194d: LIMBU DIGIT SEVEN*/
- RTUNI_DDIGIT, /* U+00194e: LIMBU DIGIT EIGHT*/
- RTUNI_DDIGIT, /* U+00194f: LIMBU DIGIT NINE*/
- RTUNI_ALPHA, /* U+001950: TAI LE LETTER KA*/
- RTUNI_ALPHA, /* U+001951: TAI LE LETTER XA*/
- RTUNI_ALPHA, /* U+001952: TAI LE LETTER NGA*/
- RTUNI_ALPHA, /* U+001953: TAI LE LETTER TSA*/
- RTUNI_ALPHA, /* U+001954: TAI LE LETTER SA*/
- RTUNI_ALPHA, /* U+001955: TAI LE LETTER YA*/
- RTUNI_ALPHA, /* U+001956: TAI LE LETTER TA*/
- RTUNI_ALPHA, /* U+001957: TAI LE LETTER THA*/
- RTUNI_ALPHA, /* U+001958: TAI LE LETTER LA*/
- RTUNI_ALPHA, /* U+001959: TAI LE LETTER PA*/
- RTUNI_ALPHA, /* U+00195a: TAI LE LETTER PHA*/
- RTUNI_ALPHA, /* U+00195b: TAI LE LETTER MA*/
- RTUNI_ALPHA, /* U+00195c: TAI LE LETTER FA*/
- RTUNI_ALPHA, /* U+00195d: TAI LE LETTER VA*/
- RTUNI_ALPHA, /* U+00195e: TAI LE LETTER HA*/
- RTUNI_ALPHA, /* U+00195f: TAI LE LETTER QA*/
- RTUNI_ALPHA, /* U+001960: TAI LE LETTER KHA*/
- RTUNI_ALPHA, /* U+001961: TAI LE LETTER TSHA*/
- RTUNI_ALPHA, /* U+001962: TAI LE LETTER NA*/
- RTUNI_ALPHA, /* U+001963: TAI LE LETTER A*/
- RTUNI_ALPHA, /* U+001964: TAI LE LETTER I*/
- RTUNI_ALPHA, /* U+001965: TAI LE LETTER EE*/
- RTUNI_ALPHA, /* U+001966: TAI LE LETTER EH*/
- RTUNI_ALPHA, /* U+001967: TAI LE LETTER U*/
- RTUNI_ALPHA, /* U+001968: TAI LE LETTER OO*/
- RTUNI_ALPHA, /* U+001969: TAI LE LETTER O*/
- RTUNI_ALPHA, /* U+00196a: TAI LE LETTER UE*/
- RTUNI_ALPHA, /* U+00196b: TAI LE LETTER E*/
- RTUNI_ALPHA, /* U+00196c: TAI LE LETTER AUE*/
- RTUNI_ALPHA, /* U+00196d: TAI LE LETTER AI*/
- 0, /* U+00196e: */
- 0, /* U+00196f: */
- RTUNI_ALPHA, /* U+001970: TAI LE LETTER TONE-2*/
- RTUNI_ALPHA, /* U+001971: TAI LE LETTER TONE-3*/
- RTUNI_ALPHA, /* U+001972: TAI LE LETTER TONE-4*/
- RTUNI_ALPHA, /* U+001973: TAI LE LETTER TONE-5*/
- RTUNI_ALPHA, /* U+001974: TAI LE LETTER TONE-6*/
- 0, /* U+001975: */
- 0, /* U+001976: */
- 0, /* U+001977: */
- 0, /* U+001978: */
- 0, /* U+001979: */
- 0, /* U+00197a: */
- 0, /* U+00197b: */
- 0, /* U+00197c: */
- 0, /* U+00197d: */
- 0, /* U+00197e: */
- 0, /* U+00197f: */
- RTUNI_ALPHA, /* U+001980: NEW TAI LUE LETTER HIGH QA*/
- RTUNI_ALPHA, /* U+001981: NEW TAI LUE LETTER LOW QA*/
- RTUNI_ALPHA, /* U+001982: NEW TAI LUE LETTER HIGH KA*/
- RTUNI_ALPHA, /* U+001983: NEW TAI LUE LETTER HIGH XA*/
- RTUNI_ALPHA, /* U+001984: NEW TAI LUE LETTER HIGH NGA*/
- RTUNI_ALPHA, /* U+001985: NEW TAI LUE LETTER LOW KA*/
- RTUNI_ALPHA, /* U+001986: NEW TAI LUE LETTER LOW XA*/
- RTUNI_ALPHA, /* U+001987: NEW TAI LUE LETTER LOW NGA*/
- RTUNI_ALPHA, /* U+001988: NEW TAI LUE LETTER HIGH TSA*/
- RTUNI_ALPHA, /* U+001989: NEW TAI LUE LETTER HIGH SA*/
- RTUNI_ALPHA, /* U+00198a: NEW TAI LUE LETTER HIGH YA*/
- RTUNI_ALPHA, /* U+00198b: NEW TAI LUE LETTER LOW TSA*/
- RTUNI_ALPHA, /* U+00198c: NEW TAI LUE LETTER LOW SA*/
- RTUNI_ALPHA, /* U+00198d: NEW TAI LUE LETTER LOW YA*/
- RTUNI_ALPHA, /* U+00198e: NEW TAI LUE LETTER HIGH TA*/
- RTUNI_ALPHA, /* U+00198f: NEW TAI LUE LETTER HIGH THA*/
- RTUNI_ALPHA, /* U+001990: NEW TAI LUE LETTER HIGH NA*/
- RTUNI_ALPHA, /* U+001991: NEW TAI LUE LETTER LOW TA*/
- RTUNI_ALPHA, /* U+001992: NEW TAI LUE LETTER LOW THA*/
- RTUNI_ALPHA, /* U+001993: NEW TAI LUE LETTER LOW NA*/
- RTUNI_ALPHA, /* U+001994: NEW TAI LUE LETTER HIGH PA*/
- RTUNI_ALPHA, /* U+001995: NEW TAI LUE LETTER HIGH PHA*/
- RTUNI_ALPHA, /* U+001996: NEW TAI LUE LETTER HIGH MA*/
- RTUNI_ALPHA, /* U+001997: NEW TAI LUE LETTER LOW PA*/
- RTUNI_ALPHA, /* U+001998: NEW TAI LUE LETTER LOW PHA*/
- RTUNI_ALPHA, /* U+001999: NEW TAI LUE LETTER LOW MA*/
- RTUNI_ALPHA, /* U+00199a: NEW TAI LUE LETTER HIGH FA*/
- RTUNI_ALPHA, /* U+00199b: NEW TAI LUE LETTER HIGH VA*/
- RTUNI_ALPHA, /* U+00199c: NEW TAI LUE LETTER HIGH LA*/
- RTUNI_ALPHA, /* U+00199d: NEW TAI LUE LETTER LOW FA*/
- RTUNI_ALPHA, /* U+00199e: NEW TAI LUE LETTER LOW VA*/
- RTUNI_ALPHA, /* U+00199f: NEW TAI LUE LETTER LOW LA*/
- RTUNI_ALPHA, /* U+0019a0: NEW TAI LUE LETTER HIGH HA*/
- RTUNI_ALPHA, /* U+0019a1: NEW TAI LUE LETTER HIGH DA*/
- RTUNI_ALPHA, /* U+0019a2: NEW TAI LUE LETTER HIGH BA*/
- RTUNI_ALPHA, /* U+0019a3: NEW TAI LUE LETTER LOW HA*/
- RTUNI_ALPHA, /* U+0019a4: NEW TAI LUE LETTER LOW DA*/
- RTUNI_ALPHA, /* U+0019a5: NEW TAI LUE LETTER LOW BA*/
- RTUNI_ALPHA, /* U+0019a6: NEW TAI LUE LETTER HIGH KVA*/
- RTUNI_ALPHA, /* U+0019a7: NEW TAI LUE LETTER HIGH XVA*/
- RTUNI_ALPHA, /* U+0019a8: NEW TAI LUE LETTER LOW KVA*/
- RTUNI_ALPHA, /* U+0019a9: NEW TAI LUE LETTER LOW XVA*/
- 0, /* U+0019aa: */
- 0, /* U+0019ab: */
- 0, /* U+0019ac: */
- 0, /* U+0019ad: */
- 0, /* U+0019ae: */
- 0, /* U+0019af: */
- RTUNI_ALPHA, /* U+0019b0: NEW TAI LUE VOWEL SIGN VOWEL SHORTENER*/
- RTUNI_ALPHA, /* U+0019b1: NEW TAI LUE VOWEL SIGN AA*/
- RTUNI_ALPHA, /* U+0019b2: NEW TAI LUE VOWEL SIGN II*/
- RTUNI_ALPHA, /* U+0019b3: NEW TAI LUE VOWEL SIGN U*/
- RTUNI_ALPHA, /* U+0019b4: NEW TAI LUE VOWEL SIGN UU*/
- RTUNI_ALPHA, /* U+0019b5: NEW TAI LUE VOWEL SIGN E*/
- RTUNI_ALPHA, /* U+0019b6: NEW TAI LUE VOWEL SIGN AE*/
- RTUNI_ALPHA, /* U+0019b7: NEW TAI LUE VOWEL SIGN O*/
- RTUNI_ALPHA, /* U+0019b8: NEW TAI LUE VOWEL SIGN OA*/
- RTUNI_ALPHA, /* U+0019b9: NEW TAI LUE VOWEL SIGN UE*/
- RTUNI_ALPHA, /* U+0019ba: NEW TAI LUE VOWEL SIGN AY*/
- RTUNI_ALPHA, /* U+0019bb: NEW TAI LUE VOWEL SIGN AAY*/
- RTUNI_ALPHA, /* U+0019bc: NEW TAI LUE VOWEL SIGN UY*/
- RTUNI_ALPHA, /* U+0019bd: NEW TAI LUE VOWEL SIGN OY*/
- RTUNI_ALPHA, /* U+0019be: NEW TAI LUE VOWEL SIGN OAY*/
- RTUNI_ALPHA, /* U+0019bf: NEW TAI LUE VOWEL SIGN UEY*/
- RTUNI_ALPHA, /* U+0019c0: NEW TAI LUE VOWEL SIGN IY*/
- RTUNI_ALPHA, /* U+0019c1: NEW TAI LUE LETTER FINAL V*/
- RTUNI_ALPHA, /* U+0019c2: NEW TAI LUE LETTER FINAL NG*/
- RTUNI_ALPHA, /* U+0019c3: NEW TAI LUE LETTER FINAL N*/
- RTUNI_ALPHA, /* U+0019c4: NEW TAI LUE LETTER FINAL M*/
- RTUNI_ALPHA, /* U+0019c5: NEW TAI LUE LETTER FINAL K*/
- RTUNI_ALPHA, /* U+0019c6: NEW TAI LUE LETTER FINAL D*/
- RTUNI_ALPHA, /* U+0019c7: NEW TAI LUE LETTER FINAL B*/
- RTUNI_ALPHA, /* U+0019c8: NEW TAI LUE TONE MARK-1*/
- RTUNI_ALPHA, /* U+0019c9: NEW TAI LUE TONE MARK-2*/
- 0, /* U+0019ca: */
- 0, /* U+0019cb: */
- 0, /* U+0019cc: */
- 0, /* U+0019cd: */
- 0, /* U+0019ce: */
- 0, /* U+0019cf: */
- RTUNI_DDIGIT, /* U+0019d0: NEW TAI LUE DIGIT ZERO*/
- RTUNI_DDIGIT, /* U+0019d1: NEW TAI LUE DIGIT ONE*/
- RTUNI_DDIGIT, /* U+0019d2: NEW TAI LUE DIGIT TWO*/
- RTUNI_DDIGIT, /* U+0019d3: NEW TAI LUE DIGIT THREE*/
- RTUNI_DDIGIT, /* U+0019d4: NEW TAI LUE DIGIT FOUR*/
- RTUNI_DDIGIT, /* U+0019d5: NEW TAI LUE DIGIT FIVE*/
- RTUNI_DDIGIT, /* U+0019d6: NEW TAI LUE DIGIT SIX*/
- RTUNI_DDIGIT, /* U+0019d7: NEW TAI LUE DIGIT SEVEN*/
- RTUNI_DDIGIT, /* U+0019d8: NEW TAI LUE DIGIT EIGHT*/
- RTUNI_DDIGIT, /* U+0019d9: NEW TAI LUE DIGIT NINE*/
- 0, /* U+0019da: */
- 0, /* U+0019db: */
- 0, /* U+0019dc: */
- 0, /* U+0019dd: */
- 0, /* U+0019de: NEW TAI LUE SIGN LAE*/
- 0, /* U+0019df: NEW TAI LUE SIGN LAEV*/
- 0, /* U+0019e0: KHMER SYMBOL PATHAMASAT*/
- 0, /* U+0019e1: KHMER SYMBOL MUOY KOET*/
- 0, /* U+0019e2: KHMER SYMBOL PII KOET*/
- 0, /* U+0019e3: KHMER SYMBOL BEI KOET*/
- 0, /* U+0019e4: KHMER SYMBOL BUON KOET*/
- 0, /* U+0019e5: KHMER SYMBOL PRAM KOET*/
- 0, /* U+0019e6: KHMER SYMBOL PRAM-MUOY KOET*/
- 0, /* U+0019e7: KHMER SYMBOL PRAM-PII KOET*/
- 0, /* U+0019e8: KHMER SYMBOL PRAM-BEI KOET*/
- 0, /* U+0019e9: KHMER SYMBOL PRAM-BUON KOET*/
- 0, /* U+0019ea: KHMER SYMBOL DAP KOET*/
- 0, /* U+0019eb: KHMER SYMBOL DAP-MUOY KOET*/
- 0, /* U+0019ec: KHMER SYMBOL DAP-PII KOET*/
- 0, /* U+0019ed: KHMER SYMBOL DAP-BEI KOET*/
- 0, /* U+0019ee: KHMER SYMBOL DAP-BUON KOET*/
- 0, /* U+0019ef: KHMER SYMBOL DAP-PRAM KOET*/
- 0, /* U+0019f0: KHMER SYMBOL TUTEYASAT*/
- 0, /* U+0019f1: KHMER SYMBOL MUOY ROC*/
- 0, /* U+0019f2: KHMER SYMBOL PII ROC*/
- 0, /* U+0019f3: KHMER SYMBOL BEI ROC*/
- 0, /* U+0019f4: KHMER SYMBOL BUON ROC*/
- 0, /* U+0019f5: KHMER SYMBOL PRAM ROC*/
- 0, /* U+0019f6: KHMER SYMBOL PRAM-MUOY ROC*/
- 0, /* U+0019f7: KHMER SYMBOL PRAM-PII ROC*/
- 0, /* U+0019f8: KHMER SYMBOL PRAM-BEI ROC*/
- 0, /* U+0019f9: KHMER SYMBOL PRAM-BUON ROC*/
- 0, /* U+0019fa: KHMER SYMBOL DAP ROC*/
- 0, /* U+0019fb: KHMER SYMBOL DAP-MUOY ROC*/
- 0, /* U+0019fc: KHMER SYMBOL DAP-PII ROC*/
- 0, /* U+0019fd: KHMER SYMBOL DAP-BEI ROC*/
- 0, /* U+0019fe: KHMER SYMBOL DAP-BUON ROC*/
- 0, /* U+0019ff: KHMER SYMBOL DAP-PRAM ROC*/
- RTUNI_ALPHA, /* U+001a00: BUGINESE LETTER KA*/
- RTUNI_ALPHA, /* U+001a01: BUGINESE LETTER GA*/
- RTUNI_ALPHA, /* U+001a02: BUGINESE LETTER NGA*/
- RTUNI_ALPHA, /* U+001a03: BUGINESE LETTER NGKA*/
- RTUNI_ALPHA, /* U+001a04: BUGINESE LETTER PA*/
- RTUNI_ALPHA, /* U+001a05: BUGINESE LETTER BA*/
- RTUNI_ALPHA, /* U+001a06: BUGINESE LETTER MA*/
- RTUNI_ALPHA, /* U+001a07: BUGINESE LETTER MPA*/
- RTUNI_ALPHA, /* U+001a08: BUGINESE LETTER TA*/
- RTUNI_ALPHA, /* U+001a09: BUGINESE LETTER DA*/
- RTUNI_ALPHA, /* U+001a0a: BUGINESE LETTER NA*/
- RTUNI_ALPHA, /* U+001a0b: BUGINESE LETTER NRA*/
- RTUNI_ALPHA, /* U+001a0c: BUGINESE LETTER CA*/
- RTUNI_ALPHA, /* U+001a0d: BUGINESE LETTER JA*/
- RTUNI_ALPHA, /* U+001a0e: BUGINESE LETTER NYA*/
- RTUNI_ALPHA, /* U+001a0f: BUGINESE LETTER NYCA*/
- RTUNI_ALPHA, /* U+001a10: BUGINESE LETTER YA*/
- RTUNI_ALPHA, /* U+001a11: BUGINESE LETTER RA*/
- RTUNI_ALPHA, /* U+001a12: BUGINESE LETTER LA*/
- RTUNI_ALPHA, /* U+001a13: BUGINESE LETTER VA*/
- RTUNI_ALPHA, /* U+001a14: BUGINESE LETTER SA*/
- RTUNI_ALPHA, /* U+001a15: BUGINESE LETTER A*/
- RTUNI_ALPHA, /* U+001a16: BUGINESE LETTER HA*/
- RTUNI_ALPHA, /* U+001a17: BUGINESE VOWEL SIGN I*/
- RTUNI_ALPHA, /* U+001a18: BUGINESE VOWEL SIGN U*/
- RTUNI_ALPHA, /* U+001a19: BUGINESE VOWEL SIGN E*/
- RTUNI_ALPHA, /* U+001a1a: BUGINESE VOWEL SIGN O*/
- RTUNI_ALPHA, /* U+001a1b: BUGINESE VOWEL SIGN AE*/
- 0, /* U+001a1c: */
- 0, /* U+001a1d: */
- 0, /* U+001a1e: BUGINESE PALLAWA*/
- 0, /* U+001a1f: BUGINESE END OF SECTION*/
- 0, /* U+001a20: */
- 0, /* U+001a21: */
- 0, /* U+001a22: */
- 0, /* U+001a23: */
- 0, /* U+001a24: */
- 0, /* U+001a25: */
- 0, /* U+001a26: */
- 0, /* U+001a27: */
- 0, /* U+001a28: */
- 0, /* U+001a29: */
- 0, /* U+001a2a: */
- 0, /* U+001a2b: */
- 0, /* U+001a2c: */
- 0, /* U+001a2d: */
- 0, /* U+001a2e: */
- 0, /* U+001a2f: */
- 0, /* U+001a30: */
- 0, /* U+001a31: */
- 0, /* U+001a32: */
- 0, /* U+001a33: */
- 0, /* U+001a34: */
- 0, /* U+001a35: */
- 0, /* U+001a36: */
- 0, /* U+001a37: */
- 0, /* U+001a38: */
- 0, /* U+001a39: */
- 0, /* U+001a3a: */
- 0, /* U+001a3b: */
- 0, /* U+001a3c: */
- 0, /* U+001a3d: */
- 0, /* U+001a3e: */
- 0, /* U+001a3f: */
- 0, /* U+001a40: */
- 0, /* U+001a41: */
- 0, /* U+001a42: */
- 0, /* U+001a43: */
- 0, /* U+001a44: */
- 0, /* U+001a45: */
- 0, /* U+001a46: */
- 0, /* U+001a47: */
- 0, /* U+001a48: */
- 0, /* U+001a49: */
- 0, /* U+001a4a: */
- 0, /* U+001a4b: */
- 0, /* U+001a4c: */
- 0, /* U+001a4d: */
- 0, /* U+001a4e: */
- 0, /* U+001a4f: */
- 0, /* U+001a50: */
- 0, /* U+001a51: */
- 0, /* U+001a52: */
- 0, /* U+001a53: */
- 0, /* U+001a54: */
- 0, /* U+001a55: */
- 0, /* U+001a56: */
- 0, /* U+001a57: */
- 0, /* U+001a58: */
- 0, /* U+001a59: */
- 0, /* U+001a5a: */
- 0, /* U+001a5b: */
- 0, /* U+001a5c: */
- 0, /* U+001a5d: */
- 0, /* U+001a5e: */
- 0, /* U+001a5f: */
- 0, /* U+001a60: */
- 0, /* U+001a61: */
- 0, /* U+001a62: */
- 0, /* U+001a63: */
- 0, /* U+001a64: */
- 0, /* U+001a65: */
- 0, /* U+001a66: */
- 0, /* U+001a67: */
- 0, /* U+001a68: */
- 0, /* U+001a69: */
- 0, /* U+001a6a: */
- 0, /* U+001a6b: */
- 0, /* U+001a6c: */
- 0, /* U+001a6d: */
- 0, /* U+001a6e: */
- 0, /* U+001a6f: */
- 0, /* U+001a70: */
- 0, /* U+001a71: */
- 0, /* U+001a72: */
- 0, /* U+001a73: */
- 0, /* U+001a74: */
- 0, /* U+001a75: */
- 0, /* U+001a76: */
- 0, /* U+001a77: */
- 0, /* U+001a78: */
- 0, /* U+001a79: */
- 0, /* U+001a7a: */
- 0, /* U+001a7b: */
- 0, /* U+001a7c: */
- 0, /* U+001a7d: */
- 0, /* U+001a7e: */
- 0, /* U+001a7f: */
- 0, /* U+001a80: */
- 0, /* U+001a81: */
- 0, /* U+001a82: */
- 0, /* U+001a83: */
- 0, /* U+001a84: */
- 0, /* U+001a85: */
- 0, /* U+001a86: */
- 0, /* U+001a87: */
- 0, /* U+001a88: */
- 0, /* U+001a89: */
- 0, /* U+001a8a: */
- 0, /* U+001a8b: */
- 0, /* U+001a8c: */
- 0, /* U+001a8d: */
- 0, /* U+001a8e: */
- 0, /* U+001a8f: */
- 0, /* U+001a90: */
- 0, /* U+001a91: */
- 0, /* U+001a92: */
- 0, /* U+001a93: */
- 0, /* U+001a94: */
- 0, /* U+001a95: */
- 0, /* U+001a96: */
- 0, /* U+001a97: */
- 0, /* U+001a98: */
- 0, /* U+001a99: */
- 0, /* U+001a9a: */
- 0, /* U+001a9b: */
- 0, /* U+001a9c: */
- 0, /* U+001a9d: */
- 0, /* U+001a9e: */
- 0, /* U+001a9f: */
- 0, /* U+001aa0: */
- 0, /* U+001aa1: */
- 0, /* U+001aa2: */
- 0, /* U+001aa3: */
- 0, /* U+001aa4: */
- 0, /* U+001aa5: */
- 0, /* U+001aa6: */
- 0, /* U+001aa7: */
- 0, /* U+001aa8: */
- 0, /* U+001aa9: */
- 0, /* U+001aaa: */
- 0, /* U+001aab: */
- 0, /* U+001aac: */
- 0, /* U+001aad: */
- 0, /* U+001aae: */
- 0, /* U+001aaf: */
- 0, /* U+001ab0: */
- 0, /* U+001ab1: */
- 0, /* U+001ab2: */
- 0, /* U+001ab3: */
- 0, /* U+001ab4: */
- 0, /* U+001ab5: */
- 0, /* U+001ab6: */
- 0, /* U+001ab7: */
- 0, /* U+001ab8: */
- 0, /* U+001ab9: */
- 0, /* U+001aba: */
- 0, /* U+001abb: */
- 0, /* U+001abc: */
- 0, /* U+001abd: */
- 0, /* U+001abe: */
- 0, /* U+001abf: */
- 0, /* U+001ac0: */
- 0, /* U+001ac1: */
- 0, /* U+001ac2: */
- 0, /* U+001ac3: */
- 0, /* U+001ac4: */
- 0, /* U+001ac5: */
- 0, /* U+001ac6: */
- 0, /* U+001ac7: */
- 0, /* U+001ac8: */
- 0, /* U+001ac9: */
- 0, /* U+001aca: */
- 0, /* U+001acb: */
- 0, /* U+001acc: */
- 0, /* U+001acd: */
- 0, /* U+001ace: */
- 0, /* U+001acf: */
- 0, /* U+001ad0: */
- 0, /* U+001ad1: */
- 0, /* U+001ad2: */
- 0, /* U+001ad3: */
- 0, /* U+001ad4: */
- 0, /* U+001ad5: */
- 0, /* U+001ad6: */
- 0, /* U+001ad7: */
- 0, /* U+001ad8: */
- 0, /* U+001ad9: */
- 0, /* U+001ada: */
- 0, /* U+001adb: */
- 0, /* U+001adc: */
- 0, /* U+001add: */
- 0, /* U+001ade: */
- 0, /* U+001adf: */
- 0, /* U+001ae0: */
- 0, /* U+001ae1: */
- 0, /* U+001ae2: */
- 0, /* U+001ae3: */
- 0, /* U+001ae4: */
- 0, /* U+001ae5: */
- 0, /* U+001ae6: */
- 0, /* U+001ae7: */
- 0, /* U+001ae8: */
- 0, /* U+001ae9: */
- 0, /* U+001aea: */
- 0, /* U+001aeb: */
- 0, /* U+001aec: */
- 0, /* U+001aed: */
- 0, /* U+001aee: */
- 0, /* U+001aef: */
- 0, /* U+001af0: */
- 0, /* U+001af1: */
- 0, /* U+001af2: */
- 0, /* U+001af3: */
- 0, /* U+001af4: */
- 0, /* U+001af5: */
- 0, /* U+001af6: */
- 0, /* U+001af7: */
- 0, /* U+001af8: */
- 0, /* U+001af9: */
- 0, /* U+001afa: */
- 0, /* U+001afb: */
- 0, /* U+001afc: */
- 0, /* U+001afd: */
- 0, /* U+001afe: */
- 0, /* U+001aff: */
- 0, /* U+001b00: */
- 0, /* U+001b01: */
- 0, /* U+001b02: */
- 0, /* U+001b03: */
- 0, /* U+001b04: */
- 0, /* U+001b05: */
- 0, /* U+001b06: */
- 0, /* U+001b07: */
- 0, /* U+001b08: */
- 0, /* U+001b09: */
- 0, /* U+001b0a: */
- 0, /* U+001b0b: */
- 0, /* U+001b0c: */
- 0, /* U+001b0d: */
- 0, /* U+001b0e: */
- 0, /* U+001b0f: */
- 0, /* U+001b10: */
- 0, /* U+001b11: */
- 0, /* U+001b12: */
- 0, /* U+001b13: */
- 0, /* U+001b14: */
- 0, /* U+001b15: */
- 0, /* U+001b16: */
- 0, /* U+001b17: */
- 0, /* U+001b18: */
- 0, /* U+001b19: */
- 0, /* U+001b1a: */
- 0, /* U+001b1b: */
- 0, /* U+001b1c: */
- 0, /* U+001b1d: */
- 0, /* U+001b1e: */
- 0, /* U+001b1f: */
- 0, /* U+001b20: */
- 0, /* U+001b21: */
- 0, /* U+001b22: */
- 0, /* U+001b23: */
- 0, /* U+001b24: */
- 0, /* U+001b25: */
- 0, /* U+001b26: */
- 0, /* U+001b27: */
- 0, /* U+001b28: */
- 0, /* U+001b29: */
- 0, /* U+001b2a: */
- 0, /* U+001b2b: */
- 0, /* U+001b2c: */
- 0, /* U+001b2d: */
- 0, /* U+001b2e: */
- 0, /* U+001b2f: */
- 0, /* U+001b30: */
- 0, /* U+001b31: */
- 0, /* U+001b32: */
- 0, /* U+001b33: */
- 0, /* U+001b34: */
- 0, /* U+001b35: */
- 0, /* U+001b36: */
- 0, /* U+001b37: */
- 0, /* U+001b38: */
- 0, /* U+001b39: */
- 0, /* U+001b3a: */
- 0, /* U+001b3b: */
- 0, /* U+001b3c: */
- 0, /* U+001b3d: */
- 0, /* U+001b3e: */
- 0, /* U+001b3f: */
- 0, /* U+001b40: */
- 0, /* U+001b41: */
- 0, /* U+001b42: */
- 0, /* U+001b43: */
- 0, /* U+001b44: */
- 0, /* U+001b45: */
- 0, /* U+001b46: */
- 0, /* U+001b47: */
- 0, /* U+001b48: */
- 0, /* U+001b49: */
- 0, /* U+001b4a: */
- 0, /* U+001b4b: */
- 0, /* U+001b4c: */
- 0, /* U+001b4d: */
- 0, /* U+001b4e: */
- 0, /* U+001b4f: */
- 0, /* U+001b50: */
- 0, /* U+001b51: */
- 0, /* U+001b52: */
- 0, /* U+001b53: */
- 0, /* U+001b54: */
- 0, /* U+001b55: */
- 0, /* U+001b56: */
- 0, /* U+001b57: */
- 0, /* U+001b58: */
- 0, /* U+001b59: */
- 0, /* U+001b5a: */
- 0, /* U+001b5b: */
- 0, /* U+001b5c: */
- 0, /* U+001b5d: */
- 0, /* U+001b5e: */
- 0, /* U+001b5f: */
- 0, /* U+001b60: */
- 0, /* U+001b61: */
- 0, /* U+001b62: */
- 0, /* U+001b63: */
- 0, /* U+001b64: */
- 0, /* U+001b65: */
- 0, /* U+001b66: */
- 0, /* U+001b67: */
- 0, /* U+001b68: */
- 0, /* U+001b69: */
- 0, /* U+001b6a: */
- 0, /* U+001b6b: */
- 0, /* U+001b6c: */
- 0, /* U+001b6d: */
- 0, /* U+001b6e: */
- 0, /* U+001b6f: */
- 0, /* U+001b70: */
- 0, /* U+001b71: */
- 0, /* U+001b72: */
- 0, /* U+001b73: */
- 0, /* U+001b74: */
- 0, /* U+001b75: */
- 0, /* U+001b76: */
- 0, /* U+001b77: */
- 0, /* U+001b78: */
- 0, /* U+001b79: */
- 0, /* U+001b7a: */
- 0, /* U+001b7b: */
- 0, /* U+001b7c: */
- 0, /* U+001b7d: */
- 0, /* U+001b7e: */
- 0, /* U+001b7f: */
- 0, /* U+001b80: */
- 0, /* U+001b81: */
- 0, /* U+001b82: */
- 0, /* U+001b83: */
- 0, /* U+001b84: */
- 0, /* U+001b85: */
- 0, /* U+001b86: */
- 0, /* U+001b87: */
- 0, /* U+001b88: */
- 0, /* U+001b89: */
- 0, /* U+001b8a: */
- 0, /* U+001b8b: */
- 0, /* U+001b8c: */
- 0, /* U+001b8d: */
- 0, /* U+001b8e: */
- 0, /* U+001b8f: */
- 0, /* U+001b90: */
- 0, /* U+001b91: */
- 0, /* U+001b92: */
- 0, /* U+001b93: */
- 0, /* U+001b94: */
- 0, /* U+001b95: */
- 0, /* U+001b96: */
- 0, /* U+001b97: */
- 0, /* U+001b98: */
- 0, /* U+001b99: */
- 0, /* U+001b9a: */
- 0, /* U+001b9b: */
- 0, /* U+001b9c: */
- 0, /* U+001b9d: */
- 0, /* U+001b9e: */
- 0, /* U+001b9f: */
- 0, /* U+001ba0: */
- 0, /* U+001ba1: */
- 0, /* U+001ba2: */
- 0, /* U+001ba3: */
- 0, /* U+001ba4: */
- 0, /* U+001ba5: */
- 0, /* U+001ba6: */
- 0, /* U+001ba7: */
- 0, /* U+001ba8: */
- 0, /* U+001ba9: */
- 0, /* U+001baa: */
- 0, /* U+001bab: */
- 0, /* U+001bac: */
- 0, /* U+001bad: */
- 0, /* U+001bae: */
- 0, /* U+001baf: */
- 0, /* U+001bb0: */
- 0, /* U+001bb1: */
- 0, /* U+001bb2: */
- 0, /* U+001bb3: */
- 0, /* U+001bb4: */
- 0, /* U+001bb5: */
- 0, /* U+001bb6: */
- 0, /* U+001bb7: */
- 0, /* U+001bb8: */
- 0, /* U+001bb9: */
- 0, /* U+001bba: */
- 0, /* U+001bbb: */
- 0, /* U+001bbc: */
- 0, /* U+001bbd: */
- 0, /* U+001bbe: */
- 0, /* U+001bbf: */
- 0, /* U+001bc0: */
- 0, /* U+001bc1: */
- 0, /* U+001bc2: */
- 0, /* U+001bc3: */
- 0, /* U+001bc4: */
- 0, /* U+001bc5: */
- 0, /* U+001bc6: */
- 0, /* U+001bc7: */
- 0, /* U+001bc8: */
- 0, /* U+001bc9: */
- 0, /* U+001bca: */
- 0, /* U+001bcb: */
- 0, /* U+001bcc: */
- 0, /* U+001bcd: */
- 0, /* U+001bce: */
- 0, /* U+001bcf: */
- 0, /* U+001bd0: */
- 0, /* U+001bd1: */
- 0, /* U+001bd2: */
- 0, /* U+001bd3: */
- 0, /* U+001bd4: */
- 0, /* U+001bd5: */
- 0, /* U+001bd6: */
- 0, /* U+001bd7: */
- 0, /* U+001bd8: */
- 0, /* U+001bd9: */
- 0, /* U+001bda: */
- 0, /* U+001bdb: */
- 0, /* U+001bdc: */
- 0, /* U+001bdd: */
- 0, /* U+001bde: */
- 0, /* U+001bdf: */
- 0, /* U+001be0: */
- 0, /* U+001be1: */
- 0, /* U+001be2: */
- 0, /* U+001be3: */
- 0, /* U+001be4: */
- 0, /* U+001be5: */
- 0, /* U+001be6: */
- 0, /* U+001be7: */
- 0, /* U+001be8: */
- 0, /* U+001be9: */
- 0, /* U+001bea: */
- 0, /* U+001beb: */
- 0, /* U+001bec: */
- 0, /* U+001bed: */
- 0, /* U+001bee: */
- 0, /* U+001bef: */
- 0, /* U+001bf0: */
- 0, /* U+001bf1: */
- 0, /* U+001bf2: */
- 0, /* U+001bf3: */
- 0, /* U+001bf4: */
- 0, /* U+001bf5: */
- 0, /* U+001bf6: */
- 0, /* U+001bf7: */
- 0, /* U+001bf8: */
- 0, /* U+001bf9: */
- 0, /* U+001bfa: */
- 0, /* U+001bfb: */
- 0, /* U+001bfc: */
- 0, /* U+001bfd: */
- 0, /* U+001bfe: */
- 0, /* U+001bff: */
- 0, /* U+001c00: */
- 0, /* U+001c01: */
- 0, /* U+001c02: */
- 0, /* U+001c03: */
- 0, /* U+001c04: */
- 0, /* U+001c05: */
- 0, /* U+001c06: */
- 0, /* U+001c07: */
- 0, /* U+001c08: */
- 0, /* U+001c09: */
- 0, /* U+001c0a: */
- 0, /* U+001c0b: */
- 0, /* U+001c0c: */
- 0, /* U+001c0d: */
- 0, /* U+001c0e: */
- 0, /* U+001c0f: */
- 0, /* U+001c10: */
- 0, /* U+001c11: */
- 0, /* U+001c12: */
- 0, /* U+001c13: */
- 0, /* U+001c14: */
- 0, /* U+001c15: */
- 0, /* U+001c16: */
- 0, /* U+001c17: */
- 0, /* U+001c18: */
- 0, /* U+001c19: */
- 0, /* U+001c1a: */
- 0, /* U+001c1b: */
- 0, /* U+001c1c: */
- 0, /* U+001c1d: */
- 0, /* U+001c1e: */
- 0, /* U+001c1f: */
- 0, /* U+001c20: */
- 0, /* U+001c21: */
- 0, /* U+001c22: */
- 0, /* U+001c23: */
- 0, /* U+001c24: */
- 0, /* U+001c25: */
- 0, /* U+001c26: */
- 0, /* U+001c27: */
- 0, /* U+001c28: */
- 0, /* U+001c29: */
- 0, /* U+001c2a: */
- 0, /* U+001c2b: */
- 0, /* U+001c2c: */
- 0, /* U+001c2d: */
- 0, /* U+001c2e: */
- 0, /* U+001c2f: */
- 0, /* U+001c30: */
- 0, /* U+001c31: */
- 0, /* U+001c32: */
- 0, /* U+001c33: */
- 0, /* U+001c34: */
- 0, /* U+001c35: */
- 0, /* U+001c36: */
- 0, /* U+001c37: */
- 0, /* U+001c38: */
- 0, /* U+001c39: */
- 0, /* U+001c3a: */
- 0, /* U+001c3b: */
- 0, /* U+001c3c: */
- 0, /* U+001c3d: */
- 0, /* U+001c3e: */
- 0, /* U+001c3f: */
- 0, /* U+001c40: */
- 0, /* U+001c41: */
- 0, /* U+001c42: */
- 0, /* U+001c43: */
- 0, /* U+001c44: */
- 0, /* U+001c45: */
- 0, /* U+001c46: */
- 0, /* U+001c47: */
- 0, /* U+001c48: */
- 0, /* U+001c49: */
- 0, /* U+001c4a: */
- 0, /* U+001c4b: */
- 0, /* U+001c4c: */
- 0, /* U+001c4d: */
- 0, /* U+001c4e: */
- 0, /* U+001c4f: */
- 0, /* U+001c50: */
- 0, /* U+001c51: */
- 0, /* U+001c52: */
- 0, /* U+001c53: */
- 0, /* U+001c54: */
- 0, /* U+001c55: */
- 0, /* U+001c56: */
- 0, /* U+001c57: */
- 0, /* U+001c58: */
- 0, /* U+001c59: */
- 0, /* U+001c5a: */
- 0, /* U+001c5b: */
- 0, /* U+001c5c: */
- 0, /* U+001c5d: */
- 0, /* U+001c5e: */
- 0, /* U+001c5f: */
- 0, /* U+001c60: */
- 0, /* U+001c61: */
- 0, /* U+001c62: */
- 0, /* U+001c63: */
- 0, /* U+001c64: */
- 0, /* U+001c65: */
- 0, /* U+001c66: */
- 0, /* U+001c67: */
- 0, /* U+001c68: */
- 0, /* U+001c69: */
- 0, /* U+001c6a: */
- 0, /* U+001c6b: */
- 0, /* U+001c6c: */
- 0, /* U+001c6d: */
- 0, /* U+001c6e: */
- 0, /* U+001c6f: */
- 0, /* U+001c70: */
- 0, /* U+001c71: */
- 0, /* U+001c72: */
- 0, /* U+001c73: */
- 0, /* U+001c74: */
- 0, /* U+001c75: */
- 0, /* U+001c76: */
- 0, /* U+001c77: */
- 0, /* U+001c78: */
- 0, /* U+001c79: */
- 0, /* U+001c7a: */
- 0, /* U+001c7b: */
- 0, /* U+001c7c: */
- 0, /* U+001c7d: */
- 0, /* U+001c7e: */
- 0, /* U+001c7f: */
- 0, /* U+001c80: */
- 0, /* U+001c81: */
- 0, /* U+001c82: */
- 0, /* U+001c83: */
- 0, /* U+001c84: */
- 0, /* U+001c85: */
- 0, /* U+001c86: */
- 0, /* U+001c87: */
- 0, /* U+001c88: */
- 0, /* U+001c89: */
- 0, /* U+001c8a: */
- 0, /* U+001c8b: */
- 0, /* U+001c8c: */
- 0, /* U+001c8d: */
- 0, /* U+001c8e: */
- 0, /* U+001c8f: */
- 0, /* U+001c90: */
- 0, /* U+001c91: */
- 0, /* U+001c92: */
- 0, /* U+001c93: */
- 0, /* U+001c94: */
- 0, /* U+001c95: */
- 0, /* U+001c96: */
- 0, /* U+001c97: */
- 0, /* U+001c98: */
- 0, /* U+001c99: */
- 0, /* U+001c9a: */
- 0, /* U+001c9b: */
- 0, /* U+001c9c: */
- 0, /* U+001c9d: */
- 0, /* U+001c9e: */
- 0, /* U+001c9f: */
- 0, /* U+001ca0: */
- 0, /* U+001ca1: */
- 0, /* U+001ca2: */
- 0, /* U+001ca3: */
- 0, /* U+001ca4: */
- 0, /* U+001ca5: */
- 0, /* U+001ca6: */
- 0, /* U+001ca7: */
- 0, /* U+001ca8: */
- 0, /* U+001ca9: */
- 0, /* U+001caa: */
- 0, /* U+001cab: */
- 0, /* U+001cac: */
- 0, /* U+001cad: */
- 0, /* U+001cae: */
- 0, /* U+001caf: */
- 0, /* U+001cb0: */
- 0, /* U+001cb1: */
- 0, /* U+001cb2: */
- 0, /* U+001cb3: */
- 0, /* U+001cb4: */
- 0, /* U+001cb5: */
- 0, /* U+001cb6: */
- 0, /* U+001cb7: */
- 0, /* U+001cb8: */
- 0, /* U+001cb9: */
- 0, /* U+001cba: */
- 0, /* U+001cbb: */
- 0, /* U+001cbc: */
- 0, /* U+001cbd: */
- 0, /* U+001cbe: */
- 0, /* U+001cbf: */
- 0, /* U+001cc0: */
- 0, /* U+001cc1: */
- 0, /* U+001cc2: */
- 0, /* U+001cc3: */
- 0, /* U+001cc4: */
- 0, /* U+001cc5: */
- 0, /* U+001cc6: */
- 0, /* U+001cc7: */
- 0, /* U+001cc8: */
- 0, /* U+001cc9: */
- 0, /* U+001cca: */
- 0, /* U+001ccb: */
- 0, /* U+001ccc: */
- 0, /* U+001ccd: */
- 0, /* U+001cce: */
- 0, /* U+001ccf: */
- 0, /* U+001cd0: */
- 0, /* U+001cd1: */
- 0, /* U+001cd2: */
- 0, /* U+001cd3: */
- 0, /* U+001cd4: */
- 0, /* U+001cd5: */
- 0, /* U+001cd6: */
- 0, /* U+001cd7: */
- 0, /* U+001cd8: */
- 0, /* U+001cd9: */
- 0, /* U+001cda: */
- 0, /* U+001cdb: */
- 0, /* U+001cdc: */
- 0, /* U+001cdd: */
- 0, /* U+001cde: */
- 0, /* U+001cdf: */
- 0, /* U+001ce0: */
- 0, /* U+001ce1: */
- 0, /* U+001ce2: */
- 0, /* U+001ce3: */
- 0, /* U+001ce4: */
- 0, /* U+001ce5: */
- 0, /* U+001ce6: */
- 0, /* U+001ce7: */
- 0, /* U+001ce8: */
- 0, /* U+001ce9: */
- 0, /* U+001cea: */
- 0, /* U+001ceb: */
- 0, /* U+001cec: */
- 0, /* U+001ced: */
- 0, /* U+001cee: */
- 0, /* U+001cef: */
- 0, /* U+001cf0: */
- 0, /* U+001cf1: */
- 0, /* U+001cf2: */
- 0, /* U+001cf3: */
- 0, /* U+001cf4: */
- 0, /* U+001cf5: */
- 0, /* U+001cf6: */
- 0, /* U+001cf7: */
- 0, /* U+001cf8: */
- 0, /* U+001cf9: */
- 0, /* U+001cfa: */
- 0, /* U+001cfb: */
- 0, /* U+001cfc: */
- 0, /* U+001cfd: */
- 0, /* U+001cfe: */
- 0, /* U+001cff: */
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d00: LATIN LETTER SMALL CAPITAL A*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d01: LATIN LETTER SMALL CAPITAL AE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d02: LATIN SMALL LETTER TURNED AE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d03: LATIN LETTER SMALL CAPITAL BARRED B*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d04: LATIN LETTER SMALL CAPITAL C*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d05: LATIN LETTER SMALL CAPITAL D*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d06: LATIN LETTER SMALL CAPITAL ETH*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d07: LATIN LETTER SMALL CAPITAL E*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d08: LATIN SMALL LETTER TURNED OPEN E*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d09: LATIN SMALL LETTER TURNED I*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d0a: LATIN LETTER SMALL CAPITAL J*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d0b: LATIN LETTER SMALL CAPITAL K*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d0c: LATIN LETTER SMALL CAPITAL L WITH STROKE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d0d: LATIN LETTER SMALL CAPITAL M*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d0e: LATIN LETTER SMALL CAPITAL REVERSED N*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d0f: LATIN LETTER SMALL CAPITAL O*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d10: LATIN LETTER SMALL CAPITAL OPEN O*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d11: LATIN SMALL LETTER SIDEWAYS O*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d12: LATIN SMALL LETTER SIDEWAYS OPEN O*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d13: LATIN SMALL LETTER SIDEWAYS O WITH STROKE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d14: LATIN SMALL LETTER TURNED OE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d15: LATIN LETTER SMALL CAPITAL OU*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d16: LATIN SMALL LETTER TOP HALF O*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d17: LATIN SMALL LETTER BOTTOM HALF O*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d18: LATIN LETTER SMALL CAPITAL P*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d19: LATIN LETTER SMALL CAPITAL REVERSED R*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d1a: LATIN LETTER SMALL CAPITAL TURNED R*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d1b: LATIN LETTER SMALL CAPITAL T*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d1c: LATIN LETTER SMALL CAPITAL U*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d1d: LATIN SMALL LETTER SIDEWAYS U*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d1e: LATIN SMALL LETTER SIDEWAYS DIAERESIZED U*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d1f: LATIN SMALL LETTER SIDEWAYS TURNED M*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d20: LATIN LETTER SMALL CAPITAL V*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d21: LATIN LETTER SMALL CAPITAL W*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d22: LATIN LETTER SMALL CAPITAL Z*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d23: LATIN LETTER SMALL CAPITAL EZH*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d24: LATIN LETTER VOICED LARYNGEAL SPIRANT*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d25: LATIN LETTER AIN*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d26: GREEK LETTER SMALL CAPITAL GAMMA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d27: GREEK LETTER SMALL CAPITAL LAMDA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d28: GREEK LETTER SMALL CAPITAL PI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d29: GREEK LETTER SMALL CAPITAL RHO*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d2a: GREEK LETTER SMALL CAPITAL PSI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d2b: CYRILLIC LETTER SMALL CAPITAL EL*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d2c: MODIFIER LETTER CAPITAL A*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d2d: MODIFIER LETTER CAPITAL AE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d2e: MODIFIER LETTER CAPITAL B*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d2f: MODIFIER LETTER CAPITAL BARRED B*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d30: MODIFIER LETTER CAPITAL D*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d31: MODIFIER LETTER CAPITAL E*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d32: MODIFIER LETTER CAPITAL REVERSED E*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d33: MODIFIER LETTER CAPITAL G*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d34: MODIFIER LETTER CAPITAL H*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d35: MODIFIER LETTER CAPITAL I*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d36: MODIFIER LETTER CAPITAL J*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d37: MODIFIER LETTER CAPITAL K*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d38: MODIFIER LETTER CAPITAL L*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d39: MODIFIER LETTER CAPITAL M*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d3a: MODIFIER LETTER CAPITAL N*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d3b: MODIFIER LETTER CAPITAL REVERSED N*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d3c: MODIFIER LETTER CAPITAL O*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d3d: MODIFIER LETTER CAPITAL OU*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d3e: MODIFIER LETTER CAPITAL P*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d3f: MODIFIER LETTER CAPITAL R*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d40: MODIFIER LETTER CAPITAL T*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d41: MODIFIER LETTER CAPITAL U*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d42: MODIFIER LETTER CAPITAL W*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d43: MODIFIER LETTER SMALL A*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d44: MODIFIER LETTER SMALL TURNED A*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d45: MODIFIER LETTER SMALL ALPHA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d46: MODIFIER LETTER SMALL TURNED AE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d47: MODIFIER LETTER SMALL B*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d48: MODIFIER LETTER SMALL D*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d49: MODIFIER LETTER SMALL E*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d4a: MODIFIER LETTER SMALL SCHWA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d4b: MODIFIER LETTER SMALL OPEN E*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d4c: MODIFIER LETTER SMALL TURNED OPEN E*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d4d: MODIFIER LETTER SMALL G*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d4e: MODIFIER LETTER SMALL TURNED I*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d4f: MODIFIER LETTER SMALL K*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d50: MODIFIER LETTER SMALL M*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d51: MODIFIER LETTER SMALL ENG*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d52: MODIFIER LETTER SMALL O*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d53: MODIFIER LETTER SMALL OPEN O*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d54: MODIFIER LETTER SMALL TOP HALF O*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d55: MODIFIER LETTER SMALL BOTTOM HALF O*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d56: MODIFIER LETTER SMALL P*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d57: MODIFIER LETTER SMALL T*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d58: MODIFIER LETTER SMALL U*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d59: MODIFIER LETTER SMALL SIDEWAYS U*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d5a: MODIFIER LETTER SMALL TURNED M*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d5b: MODIFIER LETTER SMALL V*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d5c: MODIFIER LETTER SMALL AIN*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d5d: MODIFIER LETTER SMALL BETA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d5e: MODIFIER LETTER SMALL GREEK GAMMA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d5f: MODIFIER LETTER SMALL DELTA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d60: MODIFIER LETTER SMALL GREEK PHI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d61: MODIFIER LETTER SMALL CHI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d62: LATIN SUBSCRIPT SMALL LETTER I*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d63: LATIN SUBSCRIPT SMALL LETTER R*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d64: LATIN SUBSCRIPT SMALL LETTER U*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d65: LATIN SUBSCRIPT SMALL LETTER V*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d66: GREEK SUBSCRIPT SMALL LETTER BETA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d67: GREEK SUBSCRIPT SMALL LETTER GAMMA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d68: GREEK SUBSCRIPT SMALL LETTER RHO*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d69: GREEK SUBSCRIPT SMALL LETTER PHI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d6a: GREEK SUBSCRIPT SMALL LETTER CHI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d6b: LATIN SMALL LETTER UE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d6c: LATIN SMALL LETTER B WITH MIDDLE TILDE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d6d: LATIN SMALL LETTER D WITH MIDDLE TILDE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d6e: LATIN SMALL LETTER F WITH MIDDLE TILDE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d6f: LATIN SMALL LETTER M WITH MIDDLE TILDE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d70: LATIN SMALL LETTER N WITH MIDDLE TILDE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d71: LATIN SMALL LETTER P WITH MIDDLE TILDE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d72: LATIN SMALL LETTER R WITH MIDDLE TILDE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d73: LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d74: LATIN SMALL LETTER S WITH MIDDLE TILDE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d75: LATIN SMALL LETTER T WITH MIDDLE TILDE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d76: LATIN SMALL LETTER Z WITH MIDDLE TILDE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d77: LATIN SMALL LETTER TURNED G*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d78: MODIFIER LETTER CYRILLIC EN*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d79: LATIN SMALL LETTER INSULAR G*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d7a: LATIN SMALL LETTER TH WITH STRIKETHROUGH*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d7b: LATIN SMALL CAPITAL LETTER I WITH STROKE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d7c: LATIN SMALL LETTER IOTA WITH STROKE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d7d: LATIN SMALL LETTER P WITH STROKE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d7e: LATIN SMALL CAPITAL LETTER U WITH STROKE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d7f: LATIN SMALL LETTER UPSILON WITH STROKE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d80: LATIN SMALL LETTER B WITH PALATAL HOOK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d81: LATIN SMALL LETTER D WITH PALATAL HOOK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d82: LATIN SMALL LETTER F WITH PALATAL HOOK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d83: LATIN SMALL LETTER G WITH PALATAL HOOK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d84: LATIN SMALL LETTER K WITH PALATAL HOOK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d85: LATIN SMALL LETTER L WITH PALATAL HOOK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d86: LATIN SMALL LETTER M WITH PALATAL HOOK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d87: LATIN SMALL LETTER N WITH PALATAL HOOK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d88: LATIN SMALL LETTER P WITH PALATAL HOOK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d89: LATIN SMALL LETTER R WITH PALATAL HOOK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d8a: LATIN SMALL LETTER S WITH PALATAL HOOK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d8b: LATIN SMALL LETTER ESH WITH PALATAL HOOK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d8c: LATIN SMALL LETTER V WITH PALATAL HOOK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d8d: LATIN SMALL LETTER X WITH PALATAL HOOK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d8e: LATIN SMALL LETTER Z WITH PALATAL HOOK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d8f: LATIN SMALL LETTER A WITH RETROFLEX HOOK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d90: LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d91: LATIN SMALL LETTER D WITH HOOK AND TAIL*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d92: LATIN SMALL LETTER E WITH RETROFLEX HOOK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d93: LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d94: LATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d95: LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d96: LATIN SMALL LETTER I WITH RETROFLEX HOOK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d97: LATIN SMALL LETTER OPEN O WITH RETROFLEX HOOK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d98: LATIN SMALL LETTER ESH WITH RETROFLEX HOOK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d99: LATIN SMALL LETTER U WITH RETROFLEX HOOK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d9a: LATIN SMALL LETTER EZH WITH RETROFLEX HOOK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d9b: MODIFIER LETTER SMALL TURNED ALPHA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d9c: MODIFIER LETTER SMALL C*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d9d: MODIFIER LETTER SMALL C WITH CURL*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d9e: MODIFIER LETTER SMALL ETH*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001d9f: MODIFIER LETTER SMALL REVERSED OPEN E*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001da0: MODIFIER LETTER SMALL F*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001da1: MODIFIER LETTER SMALL DOTLESS J WITH STROKE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001da2: MODIFIER LETTER SMALL SCRIPT G*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001da3: MODIFIER LETTER SMALL TURNED H*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001da4: MODIFIER LETTER SMALL I WITH STROKE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001da5: MODIFIER LETTER SMALL IOTA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001da6: MODIFIER LETTER SMALL CAPITAL I*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001da7: MODIFIER LETTER SMALL CAPITAL I WITH STROKE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001da8: MODIFIER LETTER SMALL J WITH CROSSED-TAIL*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001da9: MODIFIER LETTER SMALL L WITH RETROFLEX HOOK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001daa: MODIFIER LETTER SMALL L WITH PALATAL HOOK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001dab: MODIFIER LETTER SMALL CAPITAL L*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001dac: MODIFIER LETTER SMALL M WITH HOOK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001dad: MODIFIER LETTER SMALL TURNED M WITH LONG LEG*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001dae: MODIFIER LETTER SMALL N WITH LEFT HOOK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001daf: MODIFIER LETTER SMALL N WITH RETROFLEX HOOK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001db0: MODIFIER LETTER SMALL CAPITAL N*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001db1: MODIFIER LETTER SMALL BARRED O*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001db2: MODIFIER LETTER SMALL PHI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001db3: MODIFIER LETTER SMALL S WITH HOOK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001db4: MODIFIER LETTER SMALL ESH*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001db5: MODIFIER LETTER SMALL T WITH PALATAL HOOK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001db6: MODIFIER LETTER SMALL U BAR*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001db7: MODIFIER LETTER SMALL UPSILON*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001db8: MODIFIER LETTER SMALL CAPITAL U*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001db9: MODIFIER LETTER SMALL V WITH HOOK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001dba: MODIFIER LETTER SMALL TURNED V*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001dbb: MODIFIER LETTER SMALL Z*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001dbc: MODIFIER LETTER SMALL Z WITH RETROFLEX HOOK*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001dbd: MODIFIER LETTER SMALL Z WITH CURL*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001dbe: MODIFIER LETTER SMALL EZH*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001dbf: MODIFIER LETTER SMALL THETA*/
- 0, /* U+001dc0: COMBINING DOTTED GRAVE ACCENT*/
- 0, /* U+001dc1: COMBINING DOTTED ACUTE ACCENT*/
- 0, /* U+001dc2: COMBINING SNAKE BELOW*/
- 0, /* U+001dc3: COMBINING SUSPENSION MARK*/
- 0, /* U+001dc4: */
- 0, /* U+001dc5: */
- 0, /* U+001dc6: */
- 0, /* U+001dc7: */
- 0, /* U+001dc8: */
- 0, /* U+001dc9: */
- 0, /* U+001dca: */
- 0, /* U+001dcb: */
- 0, /* U+001dcc: */
- 0, /* U+001dcd: */
- 0, /* U+001dce: */
- 0, /* U+001dcf: */
- 0, /* U+001dd0: */
- 0, /* U+001dd1: */
- 0, /* U+001dd2: */
- 0, /* U+001dd3: */
- 0, /* U+001dd4: */
- 0, /* U+001dd5: */
- 0, /* U+001dd6: */
- 0, /* U+001dd7: */
- 0, /* U+001dd8: */
- 0, /* U+001dd9: */
- 0, /* U+001dda: */
- 0, /* U+001ddb: */
- 0, /* U+001ddc: */
- 0, /* U+001ddd: */
- 0, /* U+001dde: */
- 0, /* U+001ddf: */
- 0, /* U+001de0: */
- 0, /* U+001de1: */
- 0, /* U+001de2: */
- 0, /* U+001de3: */
- 0, /* U+001de4: */
- 0, /* U+001de5: */
- 0, /* U+001de6: */
- 0, /* U+001de7: */
- 0, /* U+001de8: */
- 0, /* U+001de9: */
- 0, /* U+001dea: */
- 0, /* U+001deb: */
- 0, /* U+001dec: */
- 0, /* U+001ded: */
- 0, /* U+001dee: */
- 0, /* U+001def: */
- 0, /* U+001df0: */
- 0, /* U+001df1: */
- 0, /* U+001df2: */
- 0, /* U+001df3: */
- 0, /* U+001df4: */
- 0, /* U+001df5: */
- 0, /* U+001df6: */
- 0, /* U+001df7: */
- 0, /* U+001df8: */
- 0, /* U+001df9: */
- 0, /* U+001dfa: */
- 0, /* U+001dfb: */
- 0, /* U+001dfc: */
- 0, /* U+001dfd: */
- 0, /* U+001dfe: */
- 0, /* U+001dff: */
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e00: LATIN CAPITAL LETTER A WITH RING BELOW*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e01: LATIN SMALL LETTER A WITH RING BELOW*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e02: LATIN CAPITAL LETTER B WITH DOT ABOVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e03: LATIN SMALL LETTER B WITH DOT ABOVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e04: LATIN CAPITAL LETTER B WITH DOT BELOW*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e05: LATIN SMALL LETTER B WITH DOT BELOW*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e06: LATIN CAPITAL LETTER B WITH LINE BELOW*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e07: LATIN SMALL LETTER B WITH LINE BELOW*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e08: LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e09: LATIN SMALL LETTER C WITH CEDILLA AND ACUTE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e0a: LATIN CAPITAL LETTER D WITH DOT ABOVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e0b: LATIN SMALL LETTER D WITH DOT ABOVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e0c: LATIN CAPITAL LETTER D WITH DOT BELOW*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e0d: LATIN SMALL LETTER D WITH DOT BELOW*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e0e: LATIN CAPITAL LETTER D WITH LINE BELOW*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e0f: LATIN SMALL LETTER D WITH LINE BELOW*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e10: LATIN CAPITAL LETTER D WITH CEDILLA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e11: LATIN SMALL LETTER D WITH CEDILLA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e12: LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e13: LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e14: LATIN CAPITAL LETTER E WITH MACRON AND GRAVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e15: LATIN SMALL LETTER E WITH MACRON AND GRAVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e16: LATIN CAPITAL LETTER E WITH MACRON AND ACUTE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e17: LATIN SMALL LETTER E WITH MACRON AND ACUTE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e18: LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e19: LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e1a: LATIN CAPITAL LETTER E WITH TILDE BELOW*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e1b: LATIN SMALL LETTER E WITH TILDE BELOW*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e1c: LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e1d: LATIN SMALL LETTER E WITH CEDILLA AND BREVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e1e: LATIN CAPITAL LETTER F WITH DOT ABOVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e1f: LATIN SMALL LETTER F WITH DOT ABOVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e20: LATIN CAPITAL LETTER G WITH MACRON*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e21: LATIN SMALL LETTER G WITH MACRON*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e22: LATIN CAPITAL LETTER H WITH DOT ABOVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e23: LATIN SMALL LETTER H WITH DOT ABOVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e24: LATIN CAPITAL LETTER H WITH DOT BELOW*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e25: LATIN SMALL LETTER H WITH DOT BELOW*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e26: LATIN CAPITAL LETTER H WITH DIAERESIS*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e27: LATIN SMALL LETTER H WITH DIAERESIS*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e28: LATIN CAPITAL LETTER H WITH CEDILLA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e29: LATIN SMALL LETTER H WITH CEDILLA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e2a: LATIN CAPITAL LETTER H WITH BREVE BELOW*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e2b: LATIN SMALL LETTER H WITH BREVE BELOW*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e2c: LATIN CAPITAL LETTER I WITH TILDE BELOW*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e2d: LATIN SMALL LETTER I WITH TILDE BELOW*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e2e: LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e2f: LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e30: LATIN CAPITAL LETTER K WITH ACUTE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e31: LATIN SMALL LETTER K WITH ACUTE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e32: LATIN CAPITAL LETTER K WITH DOT BELOW*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e33: LATIN SMALL LETTER K WITH DOT BELOW*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e34: LATIN CAPITAL LETTER K WITH LINE BELOW*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e35: LATIN SMALL LETTER K WITH LINE BELOW*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e36: LATIN CAPITAL LETTER L WITH DOT BELOW*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e37: LATIN SMALL LETTER L WITH DOT BELOW*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e38: LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e39: LATIN SMALL LETTER L WITH DOT BELOW AND MACRON*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e3a: LATIN CAPITAL LETTER L WITH LINE BELOW*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e3b: LATIN SMALL LETTER L WITH LINE BELOW*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e3c: LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e3d: LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e3e: LATIN CAPITAL LETTER M WITH ACUTE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e3f: LATIN SMALL LETTER M WITH ACUTE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e40: LATIN CAPITAL LETTER M WITH DOT ABOVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e41: LATIN SMALL LETTER M WITH DOT ABOVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e42: LATIN CAPITAL LETTER M WITH DOT BELOW*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e43: LATIN SMALL LETTER M WITH DOT BELOW*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e44: LATIN CAPITAL LETTER N WITH DOT ABOVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e45: LATIN SMALL LETTER N WITH DOT ABOVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e46: LATIN CAPITAL LETTER N WITH DOT BELOW*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e47: LATIN SMALL LETTER N WITH DOT BELOW*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e48: LATIN CAPITAL LETTER N WITH LINE BELOW*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e49: LATIN SMALL LETTER N WITH LINE BELOW*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e4a: LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e4b: LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e4c: LATIN CAPITAL LETTER O WITH TILDE AND ACUTE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e4d: LATIN SMALL LETTER O WITH TILDE AND ACUTE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e4e: LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e4f: LATIN SMALL LETTER O WITH TILDE AND DIAERESIS*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e50: LATIN CAPITAL LETTER O WITH MACRON AND GRAVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e51: LATIN SMALL LETTER O WITH MACRON AND GRAVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e52: LATIN CAPITAL LETTER O WITH MACRON AND ACUTE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e53: LATIN SMALL LETTER O WITH MACRON AND ACUTE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e54: LATIN CAPITAL LETTER P WITH ACUTE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e55: LATIN SMALL LETTER P WITH ACUTE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e56: LATIN CAPITAL LETTER P WITH DOT ABOVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e57: LATIN SMALL LETTER P WITH DOT ABOVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e58: LATIN CAPITAL LETTER R WITH DOT ABOVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e59: LATIN SMALL LETTER R WITH DOT ABOVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e5a: LATIN CAPITAL LETTER R WITH DOT BELOW*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e5b: LATIN SMALL LETTER R WITH DOT BELOW*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e5c: LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e5d: LATIN SMALL LETTER R WITH DOT BELOW AND MACRON*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e5e: LATIN CAPITAL LETTER R WITH LINE BELOW*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e5f: LATIN SMALL LETTER R WITH LINE BELOW*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e60: LATIN CAPITAL LETTER S WITH DOT ABOVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e61: LATIN SMALL LETTER S WITH DOT ABOVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e62: LATIN CAPITAL LETTER S WITH DOT BELOW*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e63: LATIN SMALL LETTER S WITH DOT BELOW*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e64: LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e65: LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e66: LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e67: LATIN SMALL LETTER S WITH CARON AND DOT ABOVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e68: LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e69: LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e6a: LATIN CAPITAL LETTER T WITH DOT ABOVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e6b: LATIN SMALL LETTER T WITH DOT ABOVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e6c: LATIN CAPITAL LETTER T WITH DOT BELOW*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e6d: LATIN SMALL LETTER T WITH DOT BELOW*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e6e: LATIN CAPITAL LETTER T WITH LINE BELOW*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e6f: LATIN SMALL LETTER T WITH LINE BELOW*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e70: LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e71: LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e72: LATIN CAPITAL LETTER U WITH DIAERESIS BELOW*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e73: LATIN SMALL LETTER U WITH DIAERESIS BELOW*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e74: LATIN CAPITAL LETTER U WITH TILDE BELOW*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e75: LATIN SMALL LETTER U WITH TILDE BELOW*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e76: LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e77: LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e78: LATIN CAPITAL LETTER U WITH TILDE AND ACUTE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e79: LATIN SMALL LETTER U WITH TILDE AND ACUTE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e7a: LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e7b: LATIN SMALL LETTER U WITH MACRON AND DIAERESIS*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e7c: LATIN CAPITAL LETTER V WITH TILDE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e7d: LATIN SMALL LETTER V WITH TILDE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e7e: LATIN CAPITAL LETTER V WITH DOT BELOW*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e7f: LATIN SMALL LETTER V WITH DOT BELOW*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e80: LATIN CAPITAL LETTER W WITH GRAVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e81: LATIN SMALL LETTER W WITH GRAVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e82: LATIN CAPITAL LETTER W WITH ACUTE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e83: LATIN SMALL LETTER W WITH ACUTE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e84: LATIN CAPITAL LETTER W WITH DIAERESIS*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e85: LATIN SMALL LETTER W WITH DIAERESIS*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e86: LATIN CAPITAL LETTER W WITH DOT ABOVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e87: LATIN SMALL LETTER W WITH DOT ABOVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e88: LATIN CAPITAL LETTER W WITH DOT BELOW*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e89: LATIN SMALL LETTER W WITH DOT BELOW*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e8a: LATIN CAPITAL LETTER X WITH DOT ABOVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e8b: LATIN SMALL LETTER X WITH DOT ABOVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e8c: LATIN CAPITAL LETTER X WITH DIAERESIS*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e8d: LATIN SMALL LETTER X WITH DIAERESIS*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e8e: LATIN CAPITAL LETTER Y WITH DOT ABOVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e8f: LATIN SMALL LETTER Y WITH DOT ABOVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e90: LATIN CAPITAL LETTER Z WITH CIRCUMFLEX*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e91: LATIN SMALL LETTER Z WITH CIRCUMFLEX*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e92: LATIN CAPITAL LETTER Z WITH DOT BELOW*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e93: LATIN SMALL LETTER Z WITH DOT BELOW*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001e94: LATIN CAPITAL LETTER Z WITH LINE BELOW*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e95: LATIN SMALL LETTER Z WITH LINE BELOW*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e96: LATIN SMALL LETTER H WITH LINE BELOW*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e97: LATIN SMALL LETTER T WITH DIAERESIS*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e98: LATIN SMALL LETTER W WITH RING ABOVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e99: LATIN SMALL LETTER Y WITH RING ABOVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e9a: LATIN SMALL LETTER A WITH RIGHT HALF RING*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001e9b: LATIN SMALL LETTER LONG S WITH DOT ABOVE*/
- 0, /* U+001e9c: */
- 0, /* U+001e9d: */
- 0, /* U+001e9e: */
- 0, /* U+001e9f: */
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001ea0: LATIN CAPITAL LETTER A WITH DOT BELOW*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001ea1: LATIN SMALL LETTER A WITH DOT BELOW*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001ea2: LATIN CAPITAL LETTER A WITH HOOK ABOVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001ea3: LATIN SMALL LETTER A WITH HOOK ABOVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001ea4: LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001ea5: LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001ea6: LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001ea7: LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001ea8: LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001ea9: LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001eaa: LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001eab: LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001eac: LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001ead: LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001eae: LATIN CAPITAL LETTER A WITH BREVE AND ACUTE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001eaf: LATIN SMALL LETTER A WITH BREVE AND ACUTE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001eb0: LATIN CAPITAL LETTER A WITH BREVE AND GRAVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001eb1: LATIN SMALL LETTER A WITH BREVE AND GRAVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001eb2: LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001eb3: LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001eb4: LATIN CAPITAL LETTER A WITH BREVE AND TILDE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001eb5: LATIN SMALL LETTER A WITH BREVE AND TILDE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001eb6: LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001eb7: LATIN SMALL LETTER A WITH BREVE AND DOT BELOW*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001eb8: LATIN CAPITAL LETTER E WITH DOT BELOW*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001eb9: LATIN SMALL LETTER E WITH DOT BELOW*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001eba: LATIN CAPITAL LETTER E WITH HOOK ABOVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001ebb: LATIN SMALL LETTER E WITH HOOK ABOVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001ebc: LATIN CAPITAL LETTER E WITH TILDE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001ebd: LATIN SMALL LETTER E WITH TILDE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001ebe: LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001ebf: LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001ec0: LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001ec1: LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001ec2: LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001ec3: LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001ec4: LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001ec5: LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001ec6: LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001ec7: LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001ec8: LATIN CAPITAL LETTER I WITH HOOK ABOVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001ec9: LATIN SMALL LETTER I WITH HOOK ABOVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001eca: LATIN CAPITAL LETTER I WITH DOT BELOW*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001ecb: LATIN SMALL LETTER I WITH DOT BELOW*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001ecc: LATIN CAPITAL LETTER O WITH DOT BELOW*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001ecd: LATIN SMALL LETTER O WITH DOT BELOW*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001ece: LATIN CAPITAL LETTER O WITH HOOK ABOVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001ecf: LATIN SMALL LETTER O WITH HOOK ABOVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001ed0: LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001ed1: LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001ed2: LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001ed3: LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001ed4: LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001ed5: LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001ed6: LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001ed7: LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001ed8: LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001ed9: LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001eda: LATIN CAPITAL LETTER O WITH HORN AND ACUTE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001edb: LATIN SMALL LETTER O WITH HORN AND ACUTE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001edc: LATIN CAPITAL LETTER O WITH HORN AND GRAVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001edd: LATIN SMALL LETTER O WITH HORN AND GRAVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001ede: LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001edf: LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001ee0: LATIN CAPITAL LETTER O WITH HORN AND TILDE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001ee1: LATIN SMALL LETTER O WITH HORN AND TILDE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001ee2: LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001ee3: LATIN SMALL LETTER O WITH HORN AND DOT BELOW*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001ee4: LATIN CAPITAL LETTER U WITH DOT BELOW*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001ee5: LATIN SMALL LETTER U WITH DOT BELOW*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001ee6: LATIN CAPITAL LETTER U WITH HOOK ABOVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001ee7: LATIN SMALL LETTER U WITH HOOK ABOVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001ee8: LATIN CAPITAL LETTER U WITH HORN AND ACUTE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001ee9: LATIN SMALL LETTER U WITH HORN AND ACUTE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001eea: LATIN CAPITAL LETTER U WITH HORN AND GRAVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001eeb: LATIN SMALL LETTER U WITH HORN AND GRAVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001eec: LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001eed: LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001eee: LATIN CAPITAL LETTER U WITH HORN AND TILDE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001eef: LATIN SMALL LETTER U WITH HORN AND TILDE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001ef0: LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001ef1: LATIN SMALL LETTER U WITH HORN AND DOT BELOW*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001ef2: LATIN CAPITAL LETTER Y WITH GRAVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001ef3: LATIN SMALL LETTER Y WITH GRAVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001ef4: LATIN CAPITAL LETTER Y WITH DOT BELOW*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001ef5: LATIN SMALL LETTER Y WITH DOT BELOW*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001ef6: LATIN CAPITAL LETTER Y WITH HOOK ABOVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001ef7: LATIN SMALL LETTER Y WITH HOOK ABOVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001ef8: LATIN CAPITAL LETTER Y WITH TILDE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001ef9: LATIN SMALL LETTER Y WITH TILDE*/
- 0, /* U+001efa: */
- 0, /* U+001efb: */
- 0, /* U+001efc: */
- 0, /* U+001efd: */
- 0, /* U+001efe: */
- 0, /* U+001eff: */
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f00: GREEK SMALL LETTER ALPHA WITH PSILI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f01: GREEK SMALL LETTER ALPHA WITH DASIA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f02: GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f03: GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f04: GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f05: GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f06: GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f07: GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001f08: GREEK CAPITAL LETTER ALPHA WITH PSILI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001f09: GREEK CAPITAL LETTER ALPHA WITH DASIA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001f0a: GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001f0b: GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001f0c: GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001f0d: GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001f0e: GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001f0f: GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f10: GREEK SMALL LETTER EPSILON WITH PSILI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f11: GREEK SMALL LETTER EPSILON WITH DASIA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f12: GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f13: GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f14: GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f15: GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA*/
- 0, /* U+001f16: */
- 0, /* U+001f17: */
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001f18: GREEK CAPITAL LETTER EPSILON WITH PSILI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001f19: GREEK CAPITAL LETTER EPSILON WITH DASIA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001f1a: GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001f1b: GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001f1c: GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001f1d: GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA*/
- 0, /* U+001f1e: */
- 0, /* U+001f1f: */
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f20: GREEK SMALL LETTER ETA WITH PSILI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f21: GREEK SMALL LETTER ETA WITH DASIA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f22: GREEK SMALL LETTER ETA WITH PSILI AND VARIA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f23: GREEK SMALL LETTER ETA WITH DASIA AND VARIA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f24: GREEK SMALL LETTER ETA WITH PSILI AND OXIA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f25: GREEK SMALL LETTER ETA WITH DASIA AND OXIA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f26: GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f27: GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001f28: GREEK CAPITAL LETTER ETA WITH PSILI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001f29: GREEK CAPITAL LETTER ETA WITH DASIA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001f2a: GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001f2b: GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001f2c: GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001f2d: GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001f2e: GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001f2f: GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f30: GREEK SMALL LETTER IOTA WITH PSILI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f31: GREEK SMALL LETTER IOTA WITH DASIA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f32: GREEK SMALL LETTER IOTA WITH PSILI AND VARIA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f33: GREEK SMALL LETTER IOTA WITH DASIA AND VARIA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f34: GREEK SMALL LETTER IOTA WITH PSILI AND OXIA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f35: GREEK SMALL LETTER IOTA WITH DASIA AND OXIA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f36: GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f37: GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001f38: GREEK CAPITAL LETTER IOTA WITH PSILI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001f39: GREEK CAPITAL LETTER IOTA WITH DASIA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001f3a: GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001f3b: GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001f3c: GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001f3d: GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001f3e: GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001f3f: GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f40: GREEK SMALL LETTER OMICRON WITH PSILI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f41: GREEK SMALL LETTER OMICRON WITH DASIA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f42: GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f43: GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f44: GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f45: GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA*/
- 0, /* U+001f46: */
- 0, /* U+001f47: */
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001f48: GREEK CAPITAL LETTER OMICRON WITH PSILI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001f49: GREEK CAPITAL LETTER OMICRON WITH DASIA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001f4a: GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001f4b: GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001f4c: GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001f4d: GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA*/
- 0, /* U+001f4e: */
- 0, /* U+001f4f: */
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f50: GREEK SMALL LETTER UPSILON WITH PSILI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f51: GREEK SMALL LETTER UPSILON WITH DASIA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f52: GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f53: GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f54: GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f55: GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f56: GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f57: GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI*/
- 0, /* U+001f58: */
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001f59: GREEK CAPITAL LETTER UPSILON WITH DASIA*/
- 0, /* U+001f5a: */
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001f5b: GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA*/
- 0, /* U+001f5c: */
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001f5d: GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA*/
- 0, /* U+001f5e: */
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001f5f: GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f60: GREEK SMALL LETTER OMEGA WITH PSILI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f61: GREEK SMALL LETTER OMEGA WITH DASIA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f62: GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f63: GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f64: GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f65: GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f66: GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f67: GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001f68: GREEK CAPITAL LETTER OMEGA WITH PSILI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001f69: GREEK CAPITAL LETTER OMEGA WITH DASIA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001f6a: GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001f6b: GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001f6c: GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001f6d: GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001f6e: GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001f6f: GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f70: GREEK SMALL LETTER ALPHA WITH VARIA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f71: GREEK SMALL LETTER ALPHA WITH OXIA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f72: GREEK SMALL LETTER EPSILON WITH VARIA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f73: GREEK SMALL LETTER EPSILON WITH OXIA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f74: GREEK SMALL LETTER ETA WITH VARIA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f75: GREEK SMALL LETTER ETA WITH OXIA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f76: GREEK SMALL LETTER IOTA WITH VARIA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f77: GREEK SMALL LETTER IOTA WITH OXIA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f78: GREEK SMALL LETTER OMICRON WITH VARIA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f79: GREEK SMALL LETTER OMICRON WITH OXIA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f7a: GREEK SMALL LETTER UPSILON WITH VARIA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f7b: GREEK SMALL LETTER UPSILON WITH OXIA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f7c: GREEK SMALL LETTER OMEGA WITH VARIA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f7d: GREEK SMALL LETTER OMEGA WITH OXIA*/
- 0, /* U+001f7e: */
- 0, /* U+001f7f: */
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f80: GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f81: GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f82: GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f83: GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f84: GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f85: GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f86: GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f87: GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI*/
- RTUNI_ALPHA, /* U+001f88: GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI*/
- RTUNI_ALPHA, /* U+001f89: GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI*/
- RTUNI_ALPHA, /* U+001f8a: GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI*/
- RTUNI_ALPHA, /* U+001f8b: GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI*/
- RTUNI_ALPHA, /* U+001f8c: GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI*/
- RTUNI_ALPHA, /* U+001f8d: GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI*/
- RTUNI_ALPHA, /* U+001f8e: GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI*/
- RTUNI_ALPHA, /* U+001f8f: GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f90: GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f91: GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f92: GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f93: GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f94: GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f95: GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f96: GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001f97: GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI*/
- RTUNI_ALPHA, /* U+001f98: GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI*/
- RTUNI_ALPHA, /* U+001f99: GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI*/
- RTUNI_ALPHA, /* U+001f9a: GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI*/
- RTUNI_ALPHA, /* U+001f9b: GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI*/
- RTUNI_ALPHA, /* U+001f9c: GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI*/
- RTUNI_ALPHA, /* U+001f9d: GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI*/
- RTUNI_ALPHA, /* U+001f9e: GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI*/
- RTUNI_ALPHA, /* U+001f9f: GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001fa0: GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001fa1: GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001fa2: GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001fa3: GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001fa4: GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001fa5: GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001fa6: GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001fa7: GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI*/
- RTUNI_ALPHA, /* U+001fa8: GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI*/
- RTUNI_ALPHA, /* U+001fa9: GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI*/
- RTUNI_ALPHA, /* U+001faa: GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI*/
- RTUNI_ALPHA, /* U+001fab: GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI*/
- RTUNI_ALPHA, /* U+001fac: GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI*/
- RTUNI_ALPHA, /* U+001fad: GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI*/
- RTUNI_ALPHA, /* U+001fae: GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI*/
- RTUNI_ALPHA, /* U+001faf: GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001fb0: GREEK SMALL LETTER ALPHA WITH VRACHY*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001fb1: GREEK SMALL LETTER ALPHA WITH MACRON*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001fb2: GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001fb3: GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001fb4: GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI*/
- 0, /* U+001fb5: */
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001fb6: GREEK SMALL LETTER ALPHA WITH PERISPOMENI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001fb7: GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001fb8: GREEK CAPITAL LETTER ALPHA WITH VRACHY*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001fb9: GREEK CAPITAL LETTER ALPHA WITH MACRON*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001fba: GREEK CAPITAL LETTER ALPHA WITH VARIA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001fbb: GREEK CAPITAL LETTER ALPHA WITH OXIA*/
- RTUNI_ALPHA, /* U+001fbc: GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI*/
- 0, /* U+001fbd: GREEK KORONIS*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001fbe: GREEK PROSGEGRAMMENI*/
- 0, /* U+001fbf: GREEK PSILI*/
- 0, /* U+001fc0: GREEK PERISPOMENI*/
- 0, /* U+001fc1: GREEK DIALYTIKA AND PERISPOMENI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001fc2: GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001fc3: GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001fc4: GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI*/
- 0, /* U+001fc5: */
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001fc6: GREEK SMALL LETTER ETA WITH PERISPOMENI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001fc7: GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001fc8: GREEK CAPITAL LETTER EPSILON WITH VARIA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001fc9: GREEK CAPITAL LETTER EPSILON WITH OXIA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001fca: GREEK CAPITAL LETTER ETA WITH VARIA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001fcb: GREEK CAPITAL LETTER ETA WITH OXIA*/
- RTUNI_ALPHA, /* U+001fcc: GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI*/
- 0, /* U+001fcd: GREEK PSILI AND VARIA*/
- 0, /* U+001fce: GREEK PSILI AND OXIA*/
- 0, /* U+001fcf: GREEK PSILI AND PERISPOMENI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001fd0: GREEK SMALL LETTER IOTA WITH VRACHY*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001fd1: GREEK SMALL LETTER IOTA WITH MACRON*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001fd2: GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001fd3: GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA*/
- 0, /* U+001fd4: */
- 0, /* U+001fd5: */
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001fd6: GREEK SMALL LETTER IOTA WITH PERISPOMENI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001fd7: GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001fd8: GREEK CAPITAL LETTER IOTA WITH VRACHY*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001fd9: GREEK CAPITAL LETTER IOTA WITH MACRON*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001fda: GREEK CAPITAL LETTER IOTA WITH VARIA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001fdb: GREEK CAPITAL LETTER IOTA WITH OXIA*/
- 0, /* U+001fdc: */
- 0, /* U+001fdd: GREEK DASIA AND VARIA*/
- 0, /* U+001fde: GREEK DASIA AND OXIA*/
- 0, /* U+001fdf: GREEK DASIA AND PERISPOMENI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001fe0: GREEK SMALL LETTER UPSILON WITH VRACHY*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001fe1: GREEK SMALL LETTER UPSILON WITH MACRON*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001fe2: GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001fe3: GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001fe4: GREEK SMALL LETTER RHO WITH PSILI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001fe5: GREEK SMALL LETTER RHO WITH DASIA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001fe6: GREEK SMALL LETTER UPSILON WITH PERISPOMENI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001fe7: GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001fe8: GREEK CAPITAL LETTER UPSILON WITH VRACHY*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001fe9: GREEK CAPITAL LETTER UPSILON WITH MACRON*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001fea: GREEK CAPITAL LETTER UPSILON WITH VARIA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001feb: GREEK CAPITAL LETTER UPSILON WITH OXIA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001fec: GREEK CAPITAL LETTER RHO WITH DASIA*/
- 0, /* U+001fed: GREEK DIALYTIKA AND VARIA*/
- 0, /* U+001fee: GREEK DIALYTIKA AND OXIA*/
- 0, /* U+001fef: GREEK VARIA*/
- 0, /* U+001ff0: */
- 0, /* U+001ff1: */
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001ff2: GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001ff3: GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001ff4: GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI*/
- 0, /* U+001ff5: */
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001ff6: GREEK SMALL LETTER OMEGA WITH PERISPOMENI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+001ff7: GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001ff8: GREEK CAPITAL LETTER OMICRON WITH VARIA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001ff9: GREEK CAPITAL LETTER OMICRON WITH OXIA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001ffa: GREEK CAPITAL LETTER OMEGA WITH VARIA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+001ffb: GREEK CAPITAL LETTER OMEGA WITH OXIA*/
- RTUNI_ALPHA, /* U+001ffc: GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI*/
- 0, /* U+001ffd: GREEK OXIA*/
- 0, /* U+001ffe: GREEK DASIA*/
- 0, /* U+001fff: */
- RTUNI_WSPACE, /* U+002000: EN QUAD*/
- RTUNI_WSPACE, /* U+002001: EM QUAD*/
- RTUNI_WSPACE, /* U+002002: EN SPACE*/
- RTUNI_WSPACE, /* U+002003: EM SPACE*/
- RTUNI_WSPACE, /* U+002004: THREE-PER-EM SPACE*/
- RTUNI_WSPACE, /* U+002005: FOUR-PER-EM SPACE*/
- RTUNI_WSPACE, /* U+002006: SIX-PER-EM SPACE*/
- RTUNI_WSPACE, /* U+002007: FIGURE SPACE*/
- RTUNI_WSPACE, /* U+002008: PUNCTUATION SPACE*/
- RTUNI_WSPACE, /* U+002009: THIN SPACE*/
- RTUNI_WSPACE, /* U+00200a: HAIR SPACE*/
- 0, /* U+00200b: ZERO WIDTH SPACE*/
- 0, /* U+00200c: ZERO WIDTH NON-JOINER*/
- 0, /* U+00200d: ZERO WIDTH JOINER*/
- 0, /* U+00200e: LEFT-TO-RIGHT MARK*/
- 0, /* U+00200f: RIGHT-TO-LEFT MARK*/
- 0, /* U+002010: HYPHEN*/
- 0, /* U+002011: NON-BREAKING HYPHEN*/
- 0, /* U+002012: FIGURE DASH*/
- 0, /* U+002013: EN DASH*/
- 0, /* U+002014: EM DASH*/
- 0, /* U+002015: HORIZONTAL BAR*/
- 0, /* U+002016: DOUBLE VERTICAL LINE*/
- 0, /* U+002017: DOUBLE LOW LINE*/
- 0, /* U+002018: LEFT SINGLE QUOTATION MARK*/
- 0, /* U+002019: RIGHT SINGLE QUOTATION MARK*/
- 0, /* U+00201a: SINGLE LOW-9 QUOTATION MARK*/
- 0, /* U+00201b: SINGLE HIGH-REVERSED-9 QUOTATION MARK*/
- 0, /* U+00201c: LEFT DOUBLE QUOTATION MARK*/
- 0, /* U+00201d: RIGHT DOUBLE QUOTATION MARK*/
- 0, /* U+00201e: DOUBLE LOW-9 QUOTATION MARK*/
- 0, /* U+00201f: DOUBLE HIGH-REVERSED-9 QUOTATION MARK*/
- 0, /* U+002020: DAGGER*/
- 0, /* U+002021: DOUBLE DAGGER*/
- 0, /* U+002022: BULLET*/
- 0, /* U+002023: TRIANGULAR BULLET*/
- 0, /* U+002024: ONE DOT LEADER*/
- 0, /* U+002025: TWO DOT LEADER*/
- 0, /* U+002026: HORIZONTAL ELLIPSIS*/
- 0, /* U+002027: HYPHENATION POINT*/
- RTUNI_WSPACE, /* U+002028: LINE SEPARATOR*/
- RTUNI_WSPACE, /* U+002029: PARAGRAPH SEPARATOR*/
- 0, /* U+00202a: LEFT-TO-RIGHT EMBEDDING*/
- 0, /* U+00202b: RIGHT-TO-LEFT EMBEDDING*/
- 0, /* U+00202c: POP DIRECTIONAL FORMATTING*/
- 0, /* U+00202d: LEFT-TO-RIGHT OVERRIDE*/
- 0, /* U+00202e: RIGHT-TO-LEFT OVERRIDE*/
- RTUNI_WSPACE, /* U+00202f: NARROW NO-BREAK SPACE*/
- 0, /* U+002030: PER MILLE SIGN*/
- 0, /* U+002031: PER TEN THOUSAND SIGN*/
- 0, /* U+002032: PRIME*/
- 0, /* U+002033: DOUBLE PRIME*/
- 0, /* U+002034: TRIPLE PRIME*/
- 0, /* U+002035: REVERSED PRIME*/
- 0, /* U+002036: REVERSED DOUBLE PRIME*/
- 0, /* U+002037: REVERSED TRIPLE PRIME*/
- 0, /* U+002038: CARET*/
- 0, /* U+002039: SINGLE LEFT-POINTING ANGLE QUOTATION MARK*/
- 0, /* U+00203a: SINGLE RIGHT-POINTING ANGLE QUOTATION MARK*/
- 0, /* U+00203b: REFERENCE MARK*/
- 0, /* U+00203c: DOUBLE EXCLAMATION MARK*/
- 0, /* U+00203d: INTERROBANG*/
- 0, /* U+00203e: OVERLINE*/
- 0, /* U+00203f: UNDERTIE*/
- 0, /* U+002040: CHARACTER TIE*/
- 0, /* U+002041: CARET INSERTION POINT*/
- 0, /* U+002042: ASTERISM*/
- 0, /* U+002043: HYPHEN BULLET*/
- 0, /* U+002044: FRACTION SLASH*/
- 0, /* U+002045: LEFT SQUARE BRACKET WITH QUILL*/
- 0, /* U+002046: RIGHT SQUARE BRACKET WITH QUILL*/
- 0, /* U+002047: DOUBLE QUESTION MARK*/
- 0, /* U+002048: QUESTION EXCLAMATION MARK*/
- 0, /* U+002049: EXCLAMATION QUESTION MARK*/
- 0, /* U+00204a: TIRONIAN SIGN ET*/
- 0, /* U+00204b: REVERSED PILCROW SIGN*/
- 0, /* U+00204c: BLACK LEFTWARDS BULLET*/
- 0, /* U+00204d: BLACK RIGHTWARDS BULLET*/
- 0, /* U+00204e: LOW ASTERISK*/
- 0, /* U+00204f: REVERSED SEMICOLON*/
- 0, /* U+002050: CLOSE UP*/
- 0, /* U+002051: TWO ASTERISKS ALIGNED VERTICALLY*/
- 0, /* U+002052: COMMERCIAL MINUS SIGN*/
- 0, /* U+002053: SWUNG DASH*/
- 0, /* U+002054: INVERTED UNDERTIE*/
- 0, /* U+002055: FLOWER PUNCTUATION MARK*/
- 0, /* U+002056: THREE DOT PUNCTUATION*/
- 0, /* U+002057: QUADRUPLE PRIME*/
- 0, /* U+002058: FOUR DOT PUNCTUATION*/
- 0, /* U+002059: FIVE DOT PUNCTUATION*/
- 0, /* U+00205a: TWO DOT PUNCTUATION*/
- 0, /* U+00205b: FOUR DOT MARK*/
- 0, /* U+00205c: DOTTED CROSS*/
- 0, /* U+00205d: TRICOLON*/
- 0, /* U+00205e: VERTICAL FOUR DOTS*/
- RTUNI_WSPACE, /* U+00205f: MEDIUM MATHEMATICAL SPACE*/
- 0, /* U+002060: WORD JOINER*/
- 0, /* U+002061: FUNCTION APPLICATION*/
- 0, /* U+002062: INVISIBLE TIMES*/
- 0, /* U+002063: INVISIBLE SEPARATOR*/
- 0, /* U+002064: */
- 0, /* U+002065: */
- 0, /* U+002066: */
- 0, /* U+002067: */
- 0, /* U+002068: */
- 0, /* U+002069: */
- 0, /* U+00206a: INHIBIT SYMMETRIC SWAPPING*/
- 0, /* U+00206b: ACTIVATE SYMMETRIC SWAPPING*/
- 0, /* U+00206c: INHIBIT ARABIC FORM SHAPING*/
- 0, /* U+00206d: ACTIVATE ARABIC FORM SHAPING*/
- 0, /* U+00206e: NATIONAL DIGIT SHAPES*/
- 0, /* U+00206f: NOMINAL DIGIT SHAPES*/
- 0, /* U+002070: SUPERSCRIPT ZERO*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002071: SUPERSCRIPT LATIN SMALL LETTER I*/
- 0, /* U+002072: */
- 0, /* U+002073: */
- 0, /* U+002074: SUPERSCRIPT FOUR*/
- 0, /* U+002075: SUPERSCRIPT FIVE*/
- 0, /* U+002076: SUPERSCRIPT SIX*/
- 0, /* U+002077: SUPERSCRIPT SEVEN*/
- 0, /* U+002078: SUPERSCRIPT EIGHT*/
- 0, /* U+002079: SUPERSCRIPT NINE*/
- 0, /* U+00207a: SUPERSCRIPT PLUS SIGN*/
- 0, /* U+00207b: SUPERSCRIPT MINUS*/
- 0, /* U+00207c: SUPERSCRIPT EQUALS SIGN*/
- 0, /* U+00207d: SUPERSCRIPT LEFT PARENTHESIS*/
- 0, /* U+00207e: SUPERSCRIPT RIGHT PARENTHESIS*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00207f: SUPERSCRIPT LATIN SMALL LETTER N*/
- 0, /* U+002080: SUBSCRIPT ZERO*/
- 0, /* U+002081: SUBSCRIPT ONE*/
- 0, /* U+002082: SUBSCRIPT TWO*/
- 0, /* U+002083: SUBSCRIPT THREE*/
- 0, /* U+002084: SUBSCRIPT FOUR*/
- 0, /* U+002085: SUBSCRIPT FIVE*/
- 0, /* U+002086: SUBSCRIPT SIX*/
- 0, /* U+002087: SUBSCRIPT SEVEN*/
- 0, /* U+002088: SUBSCRIPT EIGHT*/
- 0, /* U+002089: SUBSCRIPT NINE*/
- 0, /* U+00208a: SUBSCRIPT PLUS SIGN*/
- 0, /* U+00208b: SUBSCRIPT MINUS*/
- 0, /* U+00208c: SUBSCRIPT EQUALS SIGN*/
- 0, /* U+00208d: SUBSCRIPT LEFT PARENTHESIS*/
- 0, /* U+00208e: SUBSCRIPT RIGHT PARENTHESIS*/
- 0, /* U+00208f: */
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002090: LATIN SUBSCRIPT SMALL LETTER A*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002091: LATIN SUBSCRIPT SMALL LETTER E*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002092: LATIN SUBSCRIPT SMALL LETTER O*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002093: LATIN SUBSCRIPT SMALL LETTER X*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002094: LATIN SUBSCRIPT SMALL LETTER SCHWA*/
- 0, /* U+002095: */
- 0, /* U+002096: */
- 0, /* U+002097: */
- 0, /* U+002098: */
- 0, /* U+002099: */
- 0, /* U+00209a: */
- 0, /* U+00209b: */
- 0, /* U+00209c: */
- 0, /* U+00209d: */
- 0, /* U+00209e: */
- 0, /* U+00209f: */
- 0, /* U+0020a0: EURO-CURRENCY SIGN*/
- 0, /* U+0020a1: COLON SIGN*/
- 0, /* U+0020a2: CRUZEIRO SIGN*/
- 0, /* U+0020a3: FRENCH FRANC SIGN*/
- 0, /* U+0020a4: LIRA SIGN*/
- 0, /* U+0020a5: MILL SIGN*/
- 0, /* U+0020a6: NAIRA SIGN*/
- 0, /* U+0020a7: PESETA SIGN*/
- 0, /* U+0020a8: RUPEE SIGN*/
- 0, /* U+0020a9: WON SIGN*/
- 0, /* U+0020aa: NEW SHEQEL SIGN*/
- 0, /* U+0020ab: DONG SIGN*/
- 0, /* U+0020ac: EURO SIGN*/
- 0, /* U+0020ad: KIP SIGN*/
- 0, /* U+0020ae: TUGRIK SIGN*/
- 0, /* U+0020af: DRACHMA SIGN*/
- 0, /* U+0020b0: GERMAN PENNY SIGN*/
- 0, /* U+0020b1: PESO SIGN*/
- 0, /* U+0020b2: GUARANI SIGN*/
- 0, /* U+0020b3: AUSTRAL SIGN*/
- 0, /* U+0020b4: HRYVNIA SIGN*/
- 0, /* U+0020b5: CEDI SIGN*/
- 0, /* U+0020b6: */
- 0, /* U+0020b7: */
- 0, /* U+0020b8: */
- 0, /* U+0020b9: */
- 0, /* U+0020ba: */
- 0, /* U+0020bb: */
- 0, /* U+0020bc: */
- 0, /* U+0020bd: */
- 0, /* U+0020be: */
- 0, /* U+0020bf: */
- 0, /* U+0020c0: */
- 0, /* U+0020c1: */
- 0, /* U+0020c2: */
- 0, /* U+0020c3: */
- 0, /* U+0020c4: */
- 0, /* U+0020c5: */
- 0, /* U+0020c6: */
- 0, /* U+0020c7: */
- 0, /* U+0020c8: */
- 0, /* U+0020c9: */
- 0, /* U+0020ca: */
- 0, /* U+0020cb: */
- 0, /* U+0020cc: */
- 0, /* U+0020cd: */
- 0, /* U+0020ce: */
- 0, /* U+0020cf: */
- 0, /* U+0020d0: COMBINING LEFT HARPOON ABOVE*/
- 0, /* U+0020d1: COMBINING RIGHT HARPOON ABOVE*/
- 0, /* U+0020d2: COMBINING LONG VERTICAL LINE OVERLAY*/
- 0, /* U+0020d3: COMBINING SHORT VERTICAL LINE OVERLAY*/
- 0, /* U+0020d4: COMBINING ANTICLOCKWISE ARROW ABOVE*/
- 0, /* U+0020d5: COMBINING CLOCKWISE ARROW ABOVE*/
- 0, /* U+0020d6: COMBINING LEFT ARROW ABOVE*/
- 0, /* U+0020d7: COMBINING RIGHT ARROW ABOVE*/
- 0, /* U+0020d8: COMBINING RING OVERLAY*/
- 0, /* U+0020d9: COMBINING CLOCKWISE RING OVERLAY*/
- 0, /* U+0020da: COMBINING ANTICLOCKWISE RING OVERLAY*/
- 0, /* U+0020db: COMBINING THREE DOTS ABOVE*/
- 0, /* U+0020dc: COMBINING FOUR DOTS ABOVE*/
- 0, /* U+0020dd: COMBINING ENCLOSING CIRCLE*/
- 0, /* U+0020de: COMBINING ENCLOSING SQUARE*/
- 0, /* U+0020df: COMBINING ENCLOSING DIAMOND*/
- 0, /* U+0020e0: COMBINING ENCLOSING CIRCLE BACKSLASH*/
- 0, /* U+0020e1: COMBINING LEFT RIGHT ARROW ABOVE*/
- 0, /* U+0020e2: COMBINING ENCLOSING SCREEN*/
- 0, /* U+0020e3: COMBINING ENCLOSING KEYCAP*/
- 0, /* U+0020e4: COMBINING ENCLOSING UPWARD POINTING TRIANGLE*/
- 0, /* U+0020e5: COMBINING REVERSE SOLIDUS OVERLAY*/
- 0, /* U+0020e6: COMBINING DOUBLE VERTICAL STROKE OVERLAY*/
- 0, /* U+0020e7: COMBINING ANNUITY SYMBOL*/
- 0, /* U+0020e8: COMBINING TRIPLE UNDERDOT*/
- 0, /* U+0020e9: COMBINING WIDE BRIDGE ABOVE*/
- 0, /* U+0020ea: COMBINING LEFTWARDS ARROW OVERLAY*/
- 0, /* U+0020eb: COMBINING LONG DOUBLE SOLIDUS OVERLAY*/
- 0, /* U+0020ec: */
- 0, /* U+0020ed: */
- 0, /* U+0020ee: */
- 0, /* U+0020ef: */
- 0, /* U+0020f0: */
- 0, /* U+0020f1: */
- 0, /* U+0020f2: */
- 0, /* U+0020f3: */
- 0, /* U+0020f4: */
- 0, /* U+0020f5: */
- 0, /* U+0020f6: */
- 0, /* U+0020f7: */
- 0, /* U+0020f8: */
- 0, /* U+0020f9: */
- 0, /* U+0020fa: */
- 0, /* U+0020fb: */
- 0, /* U+0020fc: */
- 0, /* U+0020fd: */
- 0, /* U+0020fe: */
- 0, /* U+0020ff: */
- 0, /* U+002100: ACCOUNT OF*/
- 0, /* U+002101: ADDRESSED TO THE SUBJECT*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002102: DOUBLE-STRUCK CAPITAL C*/
- 0, /* U+002103: DEGREE CELSIUS*/
- 0, /* U+002104: CENTRE LINE SYMBOL*/
- 0, /* U+002105: CARE OF*/
- 0, /* U+002106: CADA UNA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002107: EULER CONSTANT*/
- 0, /* U+002108: SCRUPLE*/
- 0, /* U+002109: DEGREE FAHRENHEIT*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00210a: SCRIPT SMALL G*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00210b: SCRIPT CAPITAL H*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00210c: BLACK-LETTER CAPITAL H*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00210d: DOUBLE-STRUCK CAPITAL H*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00210e: PLANCK CONSTANT*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00210f: PLANCK CONSTANT OVER TWO PI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002110: SCRIPT CAPITAL I*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002111: BLACK-LETTER CAPITAL I*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002112: SCRIPT CAPITAL L*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002113: SCRIPT SMALL L*/
- 0, /* U+002114: L B BAR SYMBOL*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002115: DOUBLE-STRUCK CAPITAL N*/
- 0, /* U+002116: NUMERO SIGN*/
- 0, /* U+002117: SOUND RECORDING COPYRIGHT*/
- 0, /* U+002118: SCRIPT CAPITAL P*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002119: DOUBLE-STRUCK CAPITAL P*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00211a: DOUBLE-STRUCK CAPITAL Q*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00211b: SCRIPT CAPITAL R*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00211c: BLACK-LETTER CAPITAL R*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00211d: DOUBLE-STRUCK CAPITAL R*/
- 0, /* U+00211e: PRESCRIPTION TAKE*/
- 0, /* U+00211f: RESPONSE*/
- 0, /* U+002120: SERVICE MARK*/
- 0, /* U+002121: TELEPHONE SIGN*/
- 0, /* U+002122: TRADE MARK SIGN*/
- 0, /* U+002123: VERSICLE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002124: DOUBLE-STRUCK CAPITAL Z*/
- 0, /* U+002125: OUNCE SIGN*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002126: OHM SIGN*/
- 0, /* U+002127: INVERTED OHM SIGN*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002128: BLACK-LETTER CAPITAL Z*/
- 0, /* U+002129: TURNED GREEK SMALL LETTER IOTA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00212a: KELVIN SIGN*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00212b: ANGSTROM SIGN*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00212c: SCRIPT CAPITAL B*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00212d: BLACK-LETTER CAPITAL C*/
- 0, /* U+00212e: ESTIMATED SYMBOL*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00212f: SCRIPT SMALL E*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002130: SCRIPT CAPITAL E*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002131: SCRIPT CAPITAL F*/
- 0, /* U+002132: TURNED CAPITAL F*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002133: SCRIPT CAPITAL M*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002134: SCRIPT SMALL O*/
- RTUNI_ALPHA, /* U+002135: ALEF SYMBOL*/
- RTUNI_ALPHA, /* U+002136: BET SYMBOL*/
- RTUNI_ALPHA, /* U+002137: GIMEL SYMBOL*/
- RTUNI_ALPHA, /* U+002138: DALET SYMBOL*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002139: INFORMATION SOURCE*/
- 0, /* U+00213a: ROTATED CAPITAL Q*/
- 0, /* U+00213b: FACSIMILE SIGN*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00213c: DOUBLE-STRUCK SMALL PI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00213d: DOUBLE-STRUCK SMALL GAMMA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00213e: DOUBLE-STRUCK CAPITAL GAMMA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00213f: DOUBLE-STRUCK CAPITAL PI*/
- 0, /* U+002140: DOUBLE-STRUCK N-ARY SUMMATION*/
- 0, /* U+002141: TURNED SANS-SERIF CAPITAL G*/
- 0, /* U+002142: TURNED SANS-SERIF CAPITAL L*/
- 0, /* U+002143: REVERSED SANS-SERIF CAPITAL L*/
- 0, /* U+002144: TURNED SANS-SERIF CAPITAL Y*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002145: DOUBLE-STRUCK ITALIC CAPITAL D*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002146: DOUBLE-STRUCK ITALIC SMALL D*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002147: DOUBLE-STRUCK ITALIC SMALL E*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002148: DOUBLE-STRUCK ITALIC SMALL I*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002149: DOUBLE-STRUCK ITALIC SMALL J*/
- 0, /* U+00214a: PROPERTY LINE*/
- 0, /* U+00214b: TURNED AMPERSAND*/
- 0, /* U+00214c: PER SIGN*/
- 0, /* U+00214d: */
- 0, /* U+00214e: */
- 0, /* U+00214f: */
- 0, /* U+002150: */
- 0, /* U+002151: */
- 0, /* U+002152: */
- 0, /* U+002153: VULGAR FRACTION ONE THIRD*/
- 0, /* U+002154: VULGAR FRACTION TWO THIRDS*/
- 0, /* U+002155: VULGAR FRACTION ONE FIFTH*/
- 0, /* U+002156: VULGAR FRACTION TWO FIFTHS*/
- 0, /* U+002157: VULGAR FRACTION THREE FIFTHS*/
- 0, /* U+002158: VULGAR FRACTION FOUR FIFTHS*/
- 0, /* U+002159: VULGAR FRACTION ONE SIXTH*/
- 0, /* U+00215a: VULGAR FRACTION FIVE SIXTHS*/
- 0, /* U+00215b: VULGAR FRACTION ONE EIGHTH*/
- 0, /* U+00215c: VULGAR FRACTION THREE EIGHTHS*/
- 0, /* U+00215d: VULGAR FRACTION FIVE EIGHTHS*/
- 0, /* U+00215e: VULGAR FRACTION SEVEN EIGHTHS*/
- 0, /* U+00215f: FRACTION NUMERATOR ONE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002160: ROMAN NUMERAL ONE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002161: ROMAN NUMERAL TWO*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002162: ROMAN NUMERAL THREE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002163: ROMAN NUMERAL FOUR*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002164: ROMAN NUMERAL FIVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002165: ROMAN NUMERAL SIX*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002166: ROMAN NUMERAL SEVEN*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002167: ROMAN NUMERAL EIGHT*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002168: ROMAN NUMERAL NINE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002169: ROMAN NUMERAL TEN*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00216a: ROMAN NUMERAL ELEVEN*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00216b: ROMAN NUMERAL TWELVE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00216c: ROMAN NUMERAL FIFTY*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00216d: ROMAN NUMERAL ONE HUNDRED*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00216e: ROMAN NUMERAL FIVE HUNDRED*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00216f: ROMAN NUMERAL ONE THOUSAND*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002170: SMALL ROMAN NUMERAL ONE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002171: SMALL ROMAN NUMERAL TWO*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002172: SMALL ROMAN NUMERAL THREE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002173: SMALL ROMAN NUMERAL FOUR*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002174: SMALL ROMAN NUMERAL FIVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002175: SMALL ROMAN NUMERAL SIX*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002176: SMALL ROMAN NUMERAL SEVEN*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002177: SMALL ROMAN NUMERAL EIGHT*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002178: SMALL ROMAN NUMERAL NINE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002179: SMALL ROMAN NUMERAL TEN*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00217a: SMALL ROMAN NUMERAL ELEVEN*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00217b: SMALL ROMAN NUMERAL TWELVE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00217c: SMALL ROMAN NUMERAL FIFTY*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00217d: SMALL ROMAN NUMERAL ONE HUNDRED*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00217e: SMALL ROMAN NUMERAL FIVE HUNDRED*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00217f: SMALL ROMAN NUMERAL ONE THOUSAND*/
- RTUNI_ALPHA, /* U+002180: ROMAN NUMERAL ONE THOUSAND C D*/
- RTUNI_ALPHA, /* U+002181: ROMAN NUMERAL FIVE THOUSAND*/
- RTUNI_ALPHA, /* U+002182: ROMAN NUMERAL TEN THOUSAND*/
- RTUNI_ALPHA, /* U+002183: ROMAN NUMERAL REVERSED ONE HUNDRED*/
- 0, /* U+002184: */
- 0, /* U+002185: */
- 0, /* U+002186: */
- 0, /* U+002187: */
- 0, /* U+002188: */
- 0, /* U+002189: */
- 0, /* U+00218a: */
- 0, /* U+00218b: */
- 0, /* U+00218c: */
- 0, /* U+00218d: */
- 0, /* U+00218e: */
- 0, /* U+00218f: */
- 0, /* U+002190: LEFTWARDS ARROW*/
- 0, /* U+002191: UPWARDS ARROW*/
- 0, /* U+002192: RIGHTWARDS ARROW*/
- 0, /* U+002193: DOWNWARDS ARROW*/
- 0, /* U+002194: LEFT RIGHT ARROW*/
- 0, /* U+002195: UP DOWN ARROW*/
- 0, /* U+002196: NORTH WEST ARROW*/
- 0, /* U+002197: NORTH EAST ARROW*/
- 0, /* U+002198: SOUTH EAST ARROW*/
- 0, /* U+002199: SOUTH WEST ARROW*/
- 0, /* U+00219a: LEFTWARDS ARROW WITH STROKE*/
- 0, /* U+00219b: RIGHTWARDS ARROW WITH STROKE*/
- 0, /* U+00219c: LEFTWARDS WAVE ARROW*/
- 0, /* U+00219d: RIGHTWARDS WAVE ARROW*/
- 0, /* U+00219e: LEFTWARDS TWO HEADED ARROW*/
- 0, /* U+00219f: UPWARDS TWO HEADED ARROW*/
- 0, /* U+0021a0: RIGHTWARDS TWO HEADED ARROW*/
- 0, /* U+0021a1: DOWNWARDS TWO HEADED ARROW*/
- 0, /* U+0021a2: LEFTWARDS ARROW WITH TAIL*/
- 0, /* U+0021a3: RIGHTWARDS ARROW WITH TAIL*/
- 0, /* U+0021a4: LEFTWARDS ARROW FROM BAR*/
- 0, /* U+0021a5: UPWARDS ARROW FROM BAR*/
- 0, /* U+0021a6: RIGHTWARDS ARROW FROM BAR*/
- 0, /* U+0021a7: DOWNWARDS ARROW FROM BAR*/
- 0, /* U+0021a8: UP DOWN ARROW WITH BASE*/
- 0, /* U+0021a9: LEFTWARDS ARROW WITH HOOK*/
- 0, /* U+0021aa: RIGHTWARDS ARROW WITH HOOK*/
- 0, /* U+0021ab: LEFTWARDS ARROW WITH LOOP*/
- 0, /* U+0021ac: RIGHTWARDS ARROW WITH LOOP*/
- 0, /* U+0021ad: LEFT RIGHT WAVE ARROW*/
- 0, /* U+0021ae: LEFT RIGHT ARROW WITH STROKE*/
- 0, /* U+0021af: DOWNWARDS ZIGZAG ARROW*/
- 0, /* U+0021b0: UPWARDS ARROW WITH TIP LEFTWARDS*/
- 0, /* U+0021b1: UPWARDS ARROW WITH TIP RIGHTWARDS*/
- 0, /* U+0021b2: DOWNWARDS ARROW WITH TIP LEFTWARDS*/
- 0, /* U+0021b3: DOWNWARDS ARROW WITH TIP RIGHTWARDS*/
- 0, /* U+0021b4: RIGHTWARDS ARROW WITH CORNER DOWNWARDS*/
- 0, /* U+0021b5: DOWNWARDS ARROW WITH CORNER LEFTWARDS*/
- 0, /* U+0021b6: ANTICLOCKWISE TOP SEMICIRCLE ARROW*/
- 0, /* U+0021b7: CLOCKWISE TOP SEMICIRCLE ARROW*/
- 0, /* U+0021b8: NORTH WEST ARROW TO LONG BAR*/
- 0, /* U+0021b9: LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR*/
- 0, /* U+0021ba: ANTICLOCKWISE OPEN CIRCLE ARROW*/
- 0, /* U+0021bb: CLOCKWISE OPEN CIRCLE ARROW*/
- 0, /* U+0021bc: LEFTWARDS HARPOON WITH BARB UPWARDS*/
- 0, /* U+0021bd: LEFTWARDS HARPOON WITH BARB DOWNWARDS*/
- 0, /* U+0021be: UPWARDS HARPOON WITH BARB RIGHTWARDS*/
- 0, /* U+0021bf: UPWARDS HARPOON WITH BARB LEFTWARDS*/
- 0, /* U+0021c0: RIGHTWARDS HARPOON WITH BARB UPWARDS*/
- 0, /* U+0021c1: RIGHTWARDS HARPOON WITH BARB DOWNWARDS*/
- 0, /* U+0021c2: DOWNWARDS HARPOON WITH BARB RIGHTWARDS*/
- 0, /* U+0021c3: DOWNWARDS HARPOON WITH BARB LEFTWARDS*/
- 0, /* U+0021c4: RIGHTWARDS ARROW OVER LEFTWARDS ARROW*/
- 0, /* U+0021c5: UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW*/
- 0, /* U+0021c6: LEFTWARDS ARROW OVER RIGHTWARDS ARROW*/
- 0, /* U+0021c7: LEFTWARDS PAIRED ARROWS*/
- 0, /* U+0021c8: UPWARDS PAIRED ARROWS*/
- 0, /* U+0021c9: RIGHTWARDS PAIRED ARROWS*/
- 0, /* U+0021ca: DOWNWARDS PAIRED ARROWS*/
- 0, /* U+0021cb: LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON*/
- 0, /* U+0021cc: RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON*/
- 0, /* U+0021cd: LEFTWARDS DOUBLE ARROW WITH STROKE*/
- 0, /* U+0021ce: LEFT RIGHT DOUBLE ARROW WITH STROKE*/
- 0, /* U+0021cf: RIGHTWARDS DOUBLE ARROW WITH STROKE*/
- 0, /* U+0021d0: LEFTWARDS DOUBLE ARROW*/
- 0, /* U+0021d1: UPWARDS DOUBLE ARROW*/
- 0, /* U+0021d2: RIGHTWARDS DOUBLE ARROW*/
- 0, /* U+0021d3: DOWNWARDS DOUBLE ARROW*/
- 0, /* U+0021d4: LEFT RIGHT DOUBLE ARROW*/
- 0, /* U+0021d5: UP DOWN DOUBLE ARROW*/
- 0, /* U+0021d6: NORTH WEST DOUBLE ARROW*/
- 0, /* U+0021d7: NORTH EAST DOUBLE ARROW*/
- 0, /* U+0021d8: SOUTH EAST DOUBLE ARROW*/
- 0, /* U+0021d9: SOUTH WEST DOUBLE ARROW*/
- 0, /* U+0021da: LEFTWARDS TRIPLE ARROW*/
- 0, /* U+0021db: RIGHTWARDS TRIPLE ARROW*/
- 0, /* U+0021dc: LEFTWARDS SQUIGGLE ARROW*/
- 0, /* U+0021dd: RIGHTWARDS SQUIGGLE ARROW*/
- 0, /* U+0021de: UPWARDS ARROW WITH DOUBLE STROKE*/
- 0, /* U+0021df: DOWNWARDS ARROW WITH DOUBLE STROKE*/
- 0, /* U+0021e0: LEFTWARDS DASHED ARROW*/
- 0, /* U+0021e1: UPWARDS DASHED ARROW*/
- 0, /* U+0021e2: RIGHTWARDS DASHED ARROW*/
- 0, /* U+0021e3: DOWNWARDS DASHED ARROW*/
- 0, /* U+0021e4: LEFTWARDS ARROW TO BAR*/
- 0, /* U+0021e5: RIGHTWARDS ARROW TO BAR*/
- 0, /* U+0021e6: LEFTWARDS WHITE ARROW*/
- 0, /* U+0021e7: UPWARDS WHITE ARROW*/
- 0, /* U+0021e8: RIGHTWARDS WHITE ARROW*/
- 0, /* U+0021e9: DOWNWARDS WHITE ARROW*/
- 0, /* U+0021ea: UPWARDS WHITE ARROW FROM BAR*/
- 0, /* U+0021eb: UPWARDS WHITE ARROW ON PEDESTAL*/
- 0, /* U+0021ec: UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR*/
- 0, /* U+0021ed: UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR*/
- 0, /* U+0021ee: UPWARDS WHITE DOUBLE ARROW*/
- 0, /* U+0021ef: UPWARDS WHITE DOUBLE ARROW ON PEDESTAL*/
- 0, /* U+0021f0: RIGHTWARDS WHITE ARROW FROM WALL*/
- 0, /* U+0021f1: NORTH WEST ARROW TO CORNER*/
- 0, /* U+0021f2: SOUTH EAST ARROW TO CORNER*/
- 0, /* U+0021f3: UP DOWN WHITE ARROW*/
- 0, /* U+0021f4: RIGHT ARROW WITH SMALL CIRCLE*/
- 0, /* U+0021f5: DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW*/
- 0, /* U+0021f6: THREE RIGHTWARDS ARROWS*/
- 0, /* U+0021f7: LEFTWARDS ARROW WITH VERTICAL STROKE*/
- 0, /* U+0021f8: RIGHTWARDS ARROW WITH VERTICAL STROKE*/
- 0, /* U+0021f9: LEFT RIGHT ARROW WITH VERTICAL STROKE*/
- 0, /* U+0021fa: LEFTWARDS ARROW WITH DOUBLE VERTICAL STROKE*/
- 0, /* U+0021fb: RIGHTWARDS ARROW WITH DOUBLE VERTICAL STROKE*/
- 0, /* U+0021fc: LEFT RIGHT ARROW WITH DOUBLE VERTICAL STROKE*/
- 0, /* U+0021fd: LEFTWARDS OPEN-HEADED ARROW*/
- 0, /* U+0021fe: RIGHTWARDS OPEN-HEADED ARROW*/
- 0, /* U+0021ff: LEFT RIGHT OPEN-HEADED ARROW*/
- 0, /* U+002200: FOR ALL*/
- 0, /* U+002201: COMPLEMENT*/
- 0, /* U+002202: PARTIAL DIFFERENTIAL*/
- 0, /* U+002203: THERE EXISTS*/
- 0, /* U+002204: THERE DOES NOT EXIST*/
- 0, /* U+002205: EMPTY SET*/
- 0, /* U+002206: INCREMENT*/
- 0, /* U+002207: NABLA*/
- 0, /* U+002208: ELEMENT OF*/
- 0, /* U+002209: NOT AN ELEMENT OF*/
- 0, /* U+00220a: SMALL ELEMENT OF*/
- 0, /* U+00220b: CONTAINS AS MEMBER*/
- 0, /* U+00220c: DOES NOT CONTAIN AS MEMBER*/
- 0, /* U+00220d: SMALL CONTAINS AS MEMBER*/
- 0, /* U+00220e: END OF PROOF*/
- 0, /* U+00220f: N-ARY PRODUCT*/
- 0, /* U+002210: N-ARY COPRODUCT*/
- 0, /* U+002211: N-ARY SUMMATION*/
- 0, /* U+002212: MINUS SIGN*/
- 0, /* U+002213: MINUS-OR-PLUS SIGN*/
- 0, /* U+002214: DOT PLUS*/
- 0, /* U+002215: DIVISION SLASH*/
- 0, /* U+002216: SET MINUS*/
- 0, /* U+002217: ASTERISK OPERATOR*/
- 0, /* U+002218: RING OPERATOR*/
- 0, /* U+002219: BULLET OPERATOR*/
- 0, /* U+00221a: SQUARE ROOT*/
- 0, /* U+00221b: CUBE ROOT*/
- 0, /* U+00221c: FOURTH ROOT*/
- 0, /* U+00221d: PROPORTIONAL TO*/
- 0, /* U+00221e: INFINITY*/
- 0, /* U+00221f: RIGHT ANGLE*/
- 0, /* U+002220: ANGLE*/
- 0, /* U+002221: MEASURED ANGLE*/
- 0, /* U+002222: SPHERICAL ANGLE*/
- 0, /* U+002223: DIVIDES*/
- 0, /* U+002224: DOES NOT DIVIDE*/
- 0, /* U+002225: PARALLEL TO*/
- 0, /* U+002226: NOT PARALLEL TO*/
- 0, /* U+002227: LOGICAL AND*/
- 0, /* U+002228: LOGICAL OR*/
- 0, /* U+002229: INTERSECTION*/
- 0, /* U+00222a: UNION*/
- 0, /* U+00222b: INTEGRAL*/
- 0, /* U+00222c: DOUBLE INTEGRAL*/
- 0, /* U+00222d: TRIPLE INTEGRAL*/
- 0, /* U+00222e: CONTOUR INTEGRAL*/
- 0, /* U+00222f: SURFACE INTEGRAL*/
- 0, /* U+002230: VOLUME INTEGRAL*/
- 0, /* U+002231: CLOCKWISE INTEGRAL*/
- 0, /* U+002232: CLOCKWISE CONTOUR INTEGRAL*/
- 0, /* U+002233: ANTICLOCKWISE CONTOUR INTEGRAL*/
- 0, /* U+002234: THEREFORE*/
- 0, /* U+002235: BECAUSE*/
- 0, /* U+002236: RATIO*/
- 0, /* U+002237: PROPORTION*/
- 0, /* U+002238: DOT MINUS*/
- 0, /* U+002239: EXCESS*/
- 0, /* U+00223a: GEOMETRIC PROPORTION*/
- 0, /* U+00223b: HOMOTHETIC*/
- 0, /* U+00223c: TILDE OPERATOR*/
- 0, /* U+00223d: REVERSED TILDE*/
- 0, /* U+00223e: INVERTED LAZY S*/
- 0, /* U+00223f: SINE WAVE*/
- 0, /* U+002240: WREATH PRODUCT*/
- 0, /* U+002241: NOT TILDE*/
- 0, /* U+002242: MINUS TILDE*/
- 0, /* U+002243: ASYMPTOTICALLY EQUAL TO*/
- 0, /* U+002244: NOT ASYMPTOTICALLY EQUAL TO*/
- 0, /* U+002245: APPROXIMATELY EQUAL TO*/
- 0, /* U+002246: APPROXIMATELY BUT NOT ACTUALLY EQUAL TO*/
- 0, /* U+002247: NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO*/
- 0, /* U+002248: ALMOST EQUAL TO*/
- 0, /* U+002249: NOT ALMOST EQUAL TO*/
- 0, /* U+00224a: ALMOST EQUAL OR EQUAL TO*/
- 0, /* U+00224b: TRIPLE TILDE*/
- 0, /* U+00224c: ALL EQUAL TO*/
- 0, /* U+00224d: EQUIVALENT TO*/
- 0, /* U+00224e: GEOMETRICALLY EQUIVALENT TO*/
- 0, /* U+00224f: DIFFERENCE BETWEEN*/
- 0, /* U+002250: APPROACHES THE LIMIT*/
- 0, /* U+002251: GEOMETRICALLY EQUAL TO*/
- 0, /* U+002252: APPROXIMATELY EQUAL TO OR THE IMAGE OF*/
- 0, /* U+002253: IMAGE OF OR APPROXIMATELY EQUAL TO*/
- 0, /* U+002254: COLON EQUALS*/
- 0, /* U+002255: EQUALS COLON*/
- 0, /* U+002256: RING IN EQUAL TO*/
- 0, /* U+002257: RING EQUAL TO*/
- 0, /* U+002258: CORRESPONDS TO*/
- 0, /* U+002259: ESTIMATES*/
- 0, /* U+00225a: EQUIANGULAR TO*/
- 0, /* U+00225b: STAR EQUALS*/
- 0, /* U+00225c: DELTA EQUAL TO*/
- 0, /* U+00225d: EQUAL TO BY DEFINITION*/
- 0, /* U+00225e: MEASURED BY*/
- 0, /* U+00225f: QUESTIONED EQUAL TO*/
- 0, /* U+002260: NOT EQUAL TO*/
- 0, /* U+002261: IDENTICAL TO*/
- 0, /* U+002262: NOT IDENTICAL TO*/
- 0, /* U+002263: STRICTLY EQUIVALENT TO*/
- 0, /* U+002264: LESS-THAN OR EQUAL TO*/
- 0, /* U+002265: GREATER-THAN OR EQUAL TO*/
- 0, /* U+002266: LESS-THAN OVER EQUAL TO*/
- 0, /* U+002267: GREATER-THAN OVER EQUAL TO*/
- 0, /* U+002268: LESS-THAN BUT NOT EQUAL TO*/
- 0, /* U+002269: GREATER-THAN BUT NOT EQUAL TO*/
- 0, /* U+00226a: MUCH LESS-THAN*/
- 0, /* U+00226b: MUCH GREATER-THAN*/
- 0, /* U+00226c: BETWEEN*/
- 0, /* U+00226d: NOT EQUIVALENT TO*/
- 0, /* U+00226e: NOT LESS-THAN*/
- 0, /* U+00226f: NOT GREATER-THAN*/
- 0, /* U+002270: NEITHER LESS-THAN NOR EQUAL TO*/
- 0, /* U+002271: NEITHER GREATER-THAN NOR EQUAL TO*/
- 0, /* U+002272: LESS-THAN OR EQUIVALENT TO*/
- 0, /* U+002273: GREATER-THAN OR EQUIVALENT TO*/
- 0, /* U+002274: NEITHER LESS-THAN NOR EQUIVALENT TO*/
- 0, /* U+002275: NEITHER GREATER-THAN NOR EQUIVALENT TO*/
- 0, /* U+002276: LESS-THAN OR GREATER-THAN*/
- 0, /* U+002277: GREATER-THAN OR LESS-THAN*/
- 0, /* U+002278: NEITHER LESS-THAN NOR GREATER-THAN*/
- 0, /* U+002279: NEITHER GREATER-THAN NOR LESS-THAN*/
- 0, /* U+00227a: PRECEDES*/
- 0, /* U+00227b: SUCCEEDS*/
- 0, /* U+00227c: PRECEDES OR EQUAL TO*/
- 0, /* U+00227d: SUCCEEDS OR EQUAL TO*/
- 0, /* U+00227e: PRECEDES OR EQUIVALENT TO*/
- 0, /* U+00227f: SUCCEEDS OR EQUIVALENT TO*/
- 0, /* U+002280: DOES NOT PRECEDE*/
- 0, /* U+002281: DOES NOT SUCCEED*/
- 0, /* U+002282: SUBSET OF*/
- 0, /* U+002283: SUPERSET OF*/
- 0, /* U+002284: NOT A SUBSET OF*/
- 0, /* U+002285: NOT A SUPERSET OF*/
- 0, /* U+002286: SUBSET OF OR EQUAL TO*/
- 0, /* U+002287: SUPERSET OF OR EQUAL TO*/
- 0, /* U+002288: NEITHER A SUBSET OF NOR EQUAL TO*/
- 0, /* U+002289: NEITHER A SUPERSET OF NOR EQUAL TO*/
- 0, /* U+00228a: SUBSET OF WITH NOT EQUAL TO*/
- 0, /* U+00228b: SUPERSET OF WITH NOT EQUAL TO*/
- 0, /* U+00228c: MULTISET*/
- 0, /* U+00228d: MULTISET MULTIPLICATION*/
- 0, /* U+00228e: MULTISET UNION*/
- 0, /* U+00228f: SQUARE IMAGE OF*/
- 0, /* U+002290: SQUARE ORIGINAL OF*/
- 0, /* U+002291: SQUARE IMAGE OF OR EQUAL TO*/
- 0, /* U+002292: SQUARE ORIGINAL OF OR EQUAL TO*/
- 0, /* U+002293: SQUARE CAP*/
- 0, /* U+002294: SQUARE CUP*/
- 0, /* U+002295: CIRCLED PLUS*/
- 0, /* U+002296: CIRCLED MINUS*/
- 0, /* U+002297: CIRCLED TIMES*/
- 0, /* U+002298: CIRCLED DIVISION SLASH*/
- 0, /* U+002299: CIRCLED DOT OPERATOR*/
- 0, /* U+00229a: CIRCLED RING OPERATOR*/
- 0, /* U+00229b: CIRCLED ASTERISK OPERATOR*/
- 0, /* U+00229c: CIRCLED EQUALS*/
- 0, /* U+00229d: CIRCLED DASH*/
- 0, /* U+00229e: SQUARED PLUS*/
- 0, /* U+00229f: SQUARED MINUS*/
- 0, /* U+0022a0: SQUARED TIMES*/
- 0, /* U+0022a1: SQUARED DOT OPERATOR*/
- 0, /* U+0022a2: RIGHT TACK*/
- 0, /* U+0022a3: LEFT TACK*/
- 0, /* U+0022a4: DOWN TACK*/
- 0, /* U+0022a5: UP TACK*/
- 0, /* U+0022a6: ASSERTION*/
- 0, /* U+0022a7: MODELS*/
- 0, /* U+0022a8: TRUE*/
- 0, /* U+0022a9: FORCES*/
- 0, /* U+0022aa: TRIPLE VERTICAL BAR RIGHT TURNSTILE*/
- 0, /* U+0022ab: DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE*/
- 0, /* U+0022ac: DOES NOT PROVE*/
- 0, /* U+0022ad: NOT TRUE*/
- 0, /* U+0022ae: DOES NOT FORCE*/
- 0, /* U+0022af: NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE*/
- 0, /* U+0022b0: PRECEDES UNDER RELATION*/
- 0, /* U+0022b1: SUCCEEDS UNDER RELATION*/
- 0, /* U+0022b2: NORMAL SUBGROUP OF*/
- 0, /* U+0022b3: CONTAINS AS NORMAL SUBGROUP*/
- 0, /* U+0022b4: NORMAL SUBGROUP OF OR EQUAL TO*/
- 0, /* U+0022b5: CONTAINS AS NORMAL SUBGROUP OR EQUAL TO*/
- 0, /* U+0022b6: ORIGINAL OF*/
- 0, /* U+0022b7: IMAGE OF*/
- 0, /* U+0022b8: MULTIMAP*/
- 0, /* U+0022b9: HERMITIAN CONJUGATE MATRIX*/
- 0, /* U+0022ba: INTERCALATE*/
- 0, /* U+0022bb: XOR*/
- 0, /* U+0022bc: NAND*/
- 0, /* U+0022bd: NOR*/
- 0, /* U+0022be: RIGHT ANGLE WITH ARC*/
- 0, /* U+0022bf: RIGHT TRIANGLE*/
- 0, /* U+0022c0: N-ARY LOGICAL AND*/
- 0, /* U+0022c1: N-ARY LOGICAL OR*/
- 0, /* U+0022c2: N-ARY INTERSECTION*/
- 0, /* U+0022c3: N-ARY UNION*/
- 0, /* U+0022c4: DIAMOND OPERATOR*/
- 0, /* U+0022c5: DOT OPERATOR*/
- 0, /* U+0022c6: STAR OPERATOR*/
- 0, /* U+0022c7: DIVISION TIMES*/
- 0, /* U+0022c8: BOWTIE*/
- 0, /* U+0022c9: LEFT NORMAL FACTOR SEMIDIRECT PRODUCT*/
- 0, /* U+0022ca: RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT*/
- 0, /* U+0022cb: LEFT SEMIDIRECT PRODUCT*/
- 0, /* U+0022cc: RIGHT SEMIDIRECT PRODUCT*/
- 0, /* U+0022cd: REVERSED TILDE EQUALS*/
- 0, /* U+0022ce: CURLY LOGICAL OR*/
- 0, /* U+0022cf: CURLY LOGICAL AND*/
- 0, /* U+0022d0: DOUBLE SUBSET*/
- 0, /* U+0022d1: DOUBLE SUPERSET*/
- 0, /* U+0022d2: DOUBLE INTERSECTION*/
- 0, /* U+0022d3: DOUBLE UNION*/
- 0, /* U+0022d4: PITCHFORK*/
- 0, /* U+0022d5: EQUAL AND PARALLEL TO*/
- 0, /* U+0022d6: LESS-THAN WITH DOT*/
- 0, /* U+0022d7: GREATER-THAN WITH DOT*/
- 0, /* U+0022d8: VERY MUCH LESS-THAN*/
- 0, /* U+0022d9: VERY MUCH GREATER-THAN*/
- 0, /* U+0022da: LESS-THAN EQUAL TO OR GREATER-THAN*/
- 0, /* U+0022db: GREATER-THAN EQUAL TO OR LESS-THAN*/
- 0, /* U+0022dc: EQUAL TO OR LESS-THAN*/
- 0, /* U+0022dd: EQUAL TO OR GREATER-THAN*/
- 0, /* U+0022de: EQUAL TO OR PRECEDES*/
- 0, /* U+0022df: EQUAL TO OR SUCCEEDS*/
- 0, /* U+0022e0: DOES NOT PRECEDE OR EQUAL*/
- 0, /* U+0022e1: DOES NOT SUCCEED OR EQUAL*/
- 0, /* U+0022e2: NOT SQUARE IMAGE OF OR EQUAL TO*/
- 0, /* U+0022e3: NOT SQUARE ORIGINAL OF OR EQUAL TO*/
- 0, /* U+0022e4: SQUARE IMAGE OF OR NOT EQUAL TO*/
- 0, /* U+0022e5: SQUARE ORIGINAL OF OR NOT EQUAL TO*/
- 0, /* U+0022e6: LESS-THAN BUT NOT EQUIVALENT TO*/
- 0, /* U+0022e7: GREATER-THAN BUT NOT EQUIVALENT TO*/
- 0, /* U+0022e8: PRECEDES BUT NOT EQUIVALENT TO*/
- 0, /* U+0022e9: SUCCEEDS BUT NOT EQUIVALENT TO*/
- 0, /* U+0022ea: NOT NORMAL SUBGROUP OF*/
- 0, /* U+0022eb: DOES NOT CONTAIN AS NORMAL SUBGROUP*/
- 0, /* U+0022ec: NOT NORMAL SUBGROUP OF OR EQUAL TO*/
- 0, /* U+0022ed: DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL*/
- 0, /* U+0022ee: VERTICAL ELLIPSIS*/
- 0, /* U+0022ef: MIDLINE HORIZONTAL ELLIPSIS*/
- 0, /* U+0022f0: UP RIGHT DIAGONAL ELLIPSIS*/
- 0, /* U+0022f1: DOWN RIGHT DIAGONAL ELLIPSIS*/
- 0, /* U+0022f2: ELEMENT OF WITH LONG HORIZONTAL STROKE*/
- 0, /* U+0022f3: ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE*/
- 0, /* U+0022f4: SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE*/
- 0, /* U+0022f5: ELEMENT OF WITH DOT ABOVE*/
- 0, /* U+0022f6: ELEMENT OF WITH OVERBAR*/
- 0, /* U+0022f7: SMALL ELEMENT OF WITH OVERBAR*/
- 0, /* U+0022f8: ELEMENT OF WITH UNDERBAR*/
- 0, /* U+0022f9: ELEMENT OF WITH TWO HORIZONTAL STROKES*/
- 0, /* U+0022fa: CONTAINS WITH LONG HORIZONTAL STROKE*/
- 0, /* U+0022fb: CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE*/
- 0, /* U+0022fc: SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE*/
- 0, /* U+0022fd: CONTAINS WITH OVERBAR*/
- 0, /* U+0022fe: SMALL CONTAINS WITH OVERBAR*/
- 0, /* U+0022ff: Z NOTATION BAG MEMBERSHIP*/
- 0, /* U+002300: DIAMETER SIGN*/
- 0, /* U+002301: ELECTRIC ARROW*/
- 0, /* U+002302: HOUSE*/
- 0, /* U+002303: UP ARROWHEAD*/
- 0, /* U+002304: DOWN ARROWHEAD*/
- 0, /* U+002305: PROJECTIVE*/
- 0, /* U+002306: PERSPECTIVE*/
- 0, /* U+002307: WAVY LINE*/
- 0, /* U+002308: LEFT CEILING*/
- 0, /* U+002309: RIGHT CEILING*/
- 0, /* U+00230a: LEFT FLOOR*/
- 0, /* U+00230b: RIGHT FLOOR*/
- 0, /* U+00230c: BOTTOM RIGHT CROP*/
- 0, /* U+00230d: BOTTOM LEFT CROP*/
- 0, /* U+00230e: TOP RIGHT CROP*/
- 0, /* U+00230f: TOP LEFT CROP*/
- 0, /* U+002310: REVERSED NOT SIGN*/
- 0, /* U+002311: SQUARE LOZENGE*/
- 0, /* U+002312: ARC*/
- 0, /* U+002313: SEGMENT*/
- 0, /* U+002314: SECTOR*/
- 0, /* U+002315: TELEPHONE RECORDER*/
- 0, /* U+002316: POSITION INDICATOR*/
- 0, /* U+002317: VIEWDATA SQUARE*/
- 0, /* U+002318: PLACE OF INTEREST SIGN*/
- 0, /* U+002319: TURNED NOT SIGN*/
- 0, /* U+00231a: WATCH*/
- 0, /* U+00231b: HOURGLASS*/
- 0, /* U+00231c: TOP LEFT CORNER*/
- 0, /* U+00231d: TOP RIGHT CORNER*/
- 0, /* U+00231e: BOTTOM LEFT CORNER*/
- 0, /* U+00231f: BOTTOM RIGHT CORNER*/
- 0, /* U+002320: TOP HALF INTEGRAL*/
- 0, /* U+002321: BOTTOM HALF INTEGRAL*/
- 0, /* U+002322: FROWN*/
- 0, /* U+002323: SMILE*/
- 0, /* U+002324: UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS*/
- 0, /* U+002325: OPTION KEY*/
- 0, /* U+002326: ERASE TO THE RIGHT*/
- 0, /* U+002327: X IN A RECTANGLE BOX*/
- 0, /* U+002328: KEYBOARD*/
- 0, /* U+002329: LEFT-POINTING ANGLE BRACKET*/
- 0, /* U+00232a: RIGHT-POINTING ANGLE BRACKET*/
- 0, /* U+00232b: ERASE TO THE LEFT*/
- 0, /* U+00232c: BENZENE RING*/
- 0, /* U+00232d: CYLINDRICITY*/
- 0, /* U+00232e: ALL AROUND-PROFILE*/
- 0, /* U+00232f: SYMMETRY*/
- 0, /* U+002330: TOTAL RUNOUT*/
- 0, /* U+002331: DIMENSION ORIGIN*/
- 0, /* U+002332: CONICAL TAPER*/
- 0, /* U+002333: SLOPE*/
- 0, /* U+002334: COUNTERBORE*/
- 0, /* U+002335: COUNTERSINK*/
- 0, /* U+002336: APL FUNCTIONAL SYMBOL I-BEAM*/
- 0, /* U+002337: APL FUNCTIONAL SYMBOL SQUISH QUAD*/
- 0, /* U+002338: APL FUNCTIONAL SYMBOL QUAD EQUAL*/
- 0, /* U+002339: APL FUNCTIONAL SYMBOL QUAD DIVIDE*/
- 0, /* U+00233a: APL FUNCTIONAL SYMBOL QUAD DIAMOND*/
- 0, /* U+00233b: APL FUNCTIONAL SYMBOL QUAD JOT*/
- 0, /* U+00233c: APL FUNCTIONAL SYMBOL QUAD CIRCLE*/
- 0, /* U+00233d: APL FUNCTIONAL SYMBOL CIRCLE STILE*/
- 0, /* U+00233e: APL FUNCTIONAL SYMBOL CIRCLE JOT*/
- 0, /* U+00233f: APL FUNCTIONAL SYMBOL SLASH BAR*/
- 0, /* U+002340: APL FUNCTIONAL SYMBOL BACKSLASH BAR*/
- 0, /* U+002341: APL FUNCTIONAL SYMBOL QUAD SLASH*/
- 0, /* U+002342: APL FUNCTIONAL SYMBOL QUAD BACKSLASH*/
- 0, /* U+002343: APL FUNCTIONAL SYMBOL QUAD LESS-THAN*/
- 0, /* U+002344: APL FUNCTIONAL SYMBOL QUAD GREATER-THAN*/
- 0, /* U+002345: APL FUNCTIONAL SYMBOL LEFTWARDS VANE*/
- 0, /* U+002346: APL FUNCTIONAL SYMBOL RIGHTWARDS VANE*/
- 0, /* U+002347: APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW*/
- 0, /* U+002348: APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW*/
- 0, /* U+002349: APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH*/
- 0, /* U+00234a: APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR*/
- 0, /* U+00234b: APL FUNCTIONAL SYMBOL DELTA STILE*/
- 0, /* U+00234c: APL FUNCTIONAL SYMBOL QUAD DOWN CARET*/
- 0, /* U+00234d: APL FUNCTIONAL SYMBOL QUAD DELTA*/
- 0, /* U+00234e: APL FUNCTIONAL SYMBOL DOWN TACK JOT*/
- 0, /* U+00234f: APL FUNCTIONAL SYMBOL UPWARDS VANE*/
- 0, /* U+002350: APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW*/
- 0, /* U+002351: APL FUNCTIONAL SYMBOL UP TACK OVERBAR*/
- 0, /* U+002352: APL FUNCTIONAL SYMBOL DEL STILE*/
- 0, /* U+002353: APL FUNCTIONAL SYMBOL QUAD UP CARET*/
- 0, /* U+002354: APL FUNCTIONAL SYMBOL QUAD DEL*/
- 0, /* U+002355: APL FUNCTIONAL SYMBOL UP TACK JOT*/
- 0, /* U+002356: APL FUNCTIONAL SYMBOL DOWNWARDS VANE*/
- 0, /* U+002357: APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW*/
- 0, /* U+002358: APL FUNCTIONAL SYMBOL QUOTE UNDERBAR*/
- 0, /* U+002359: APL FUNCTIONAL SYMBOL DELTA UNDERBAR*/
- 0, /* U+00235a: APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR*/
- 0, /* U+00235b: APL FUNCTIONAL SYMBOL JOT UNDERBAR*/
- 0, /* U+00235c: APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR*/
- 0, /* U+00235d: APL FUNCTIONAL SYMBOL UP SHOE JOT*/
- 0, /* U+00235e: APL FUNCTIONAL SYMBOL QUOTE QUAD*/
- 0, /* U+00235f: APL FUNCTIONAL SYMBOL CIRCLE STAR*/
- 0, /* U+002360: APL FUNCTIONAL SYMBOL QUAD COLON*/
- 0, /* U+002361: APL FUNCTIONAL SYMBOL UP TACK DIAERESIS*/
- 0, /* U+002362: APL FUNCTIONAL SYMBOL DEL DIAERESIS*/
- 0, /* U+002363: APL FUNCTIONAL SYMBOL STAR DIAERESIS*/
- 0, /* U+002364: APL FUNCTIONAL SYMBOL JOT DIAERESIS*/
- 0, /* U+002365: APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS*/
- 0, /* U+002366: APL FUNCTIONAL SYMBOL DOWN SHOE STILE*/
- 0, /* U+002367: APL FUNCTIONAL SYMBOL LEFT SHOE STILE*/
- 0, /* U+002368: APL FUNCTIONAL SYMBOL TILDE DIAERESIS*/
- 0, /* U+002369: APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS*/
- 0, /* U+00236a: APL FUNCTIONAL SYMBOL COMMA BAR*/
- 0, /* U+00236b: APL FUNCTIONAL SYMBOL DEL TILDE*/
- 0, /* U+00236c: APL FUNCTIONAL SYMBOL ZILDE*/
- 0, /* U+00236d: APL FUNCTIONAL SYMBOL STILE TILDE*/
- 0, /* U+00236e: APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR*/
- 0, /* U+00236f: APL FUNCTIONAL SYMBOL QUAD NOT EQUAL*/
- 0, /* U+002370: APL FUNCTIONAL SYMBOL QUAD QUESTION*/
- 0, /* U+002371: APL FUNCTIONAL SYMBOL DOWN CARET TILDE*/
- 0, /* U+002372: APL FUNCTIONAL SYMBOL UP CARET TILDE*/
- 0, /* U+002373: APL FUNCTIONAL SYMBOL IOTA*/
- 0, /* U+002374: APL FUNCTIONAL SYMBOL RHO*/
- 0, /* U+002375: APL FUNCTIONAL SYMBOL OMEGA*/
- 0, /* U+002376: APL FUNCTIONAL SYMBOL ALPHA UNDERBAR*/
- 0, /* U+002377: APL FUNCTIONAL SYMBOL EPSILON UNDERBAR*/
- 0, /* U+002378: APL FUNCTIONAL SYMBOL IOTA UNDERBAR*/
- 0, /* U+002379: APL FUNCTIONAL SYMBOL OMEGA UNDERBAR*/
- 0, /* U+00237a: APL FUNCTIONAL SYMBOL ALPHA*/
- 0, /* U+00237b: NOT CHECK MARK*/
- 0, /* U+00237c: RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW*/
- 0, /* U+00237d: SHOULDERED OPEN BOX*/
- 0, /* U+00237e: BELL SYMBOL*/
- 0, /* U+00237f: VERTICAL LINE WITH MIDDLE DOT*/
- 0, /* U+002380: INSERTION SYMBOL*/
- 0, /* U+002381: CONTINUOUS UNDERLINE SYMBOL*/
- 0, /* U+002382: DISCONTINUOUS UNDERLINE SYMBOL*/
- 0, /* U+002383: EMPHASIS SYMBOL*/
- 0, /* U+002384: COMPOSITION SYMBOL*/
- 0, /* U+002385: WHITE SQUARE WITH CENTRE VERTICAL LINE*/
- 0, /* U+002386: ENTER SYMBOL*/
- 0, /* U+002387: ALTERNATIVE KEY SYMBOL*/
- 0, /* U+002388: HELM SYMBOL*/
- 0, /* U+002389: CIRCLED HORIZONTAL BAR WITH NOTCH*/
- 0, /* U+00238a: CIRCLED TRIANGLE DOWN*/
- 0, /* U+00238b: BROKEN CIRCLE WITH NORTHWEST ARROW*/
- 0, /* U+00238c: UNDO SYMBOL*/
- 0, /* U+00238d: MONOSTABLE SYMBOL*/
- 0, /* U+00238e: HYSTERESIS SYMBOL*/
- 0, /* U+00238f: OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL*/
- 0, /* U+002390: OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL*/
- 0, /* U+002391: PASSIVE-PULL-DOWN-OUTPUT SYMBOL*/
- 0, /* U+002392: PASSIVE-PULL-UP-OUTPUT SYMBOL*/
- 0, /* U+002393: DIRECT CURRENT SYMBOL FORM TWO*/
- 0, /* U+002394: SOFTWARE-FUNCTION SYMBOL*/
- 0, /* U+002395: APL FUNCTIONAL SYMBOL QUAD*/
- 0, /* U+002396: DECIMAL SEPARATOR KEY SYMBOL*/
- 0, /* U+002397: PREVIOUS PAGE*/
- 0, /* U+002398: NEXT PAGE*/
- 0, /* U+002399: PRINT SCREEN SYMBOL*/
- 0, /* U+00239a: CLEAR SCREEN SYMBOL*/
- 0, /* U+00239b: LEFT PARENTHESIS UPPER HOOK*/
- 0, /* U+00239c: LEFT PARENTHESIS EXTENSION*/
- 0, /* U+00239d: LEFT PARENTHESIS LOWER HOOK*/
- 0, /* U+00239e: RIGHT PARENTHESIS UPPER HOOK*/
- 0, /* U+00239f: RIGHT PARENTHESIS EXTENSION*/
- 0, /* U+0023a0: RIGHT PARENTHESIS LOWER HOOK*/
- 0, /* U+0023a1: LEFT SQUARE BRACKET UPPER CORNER*/
- 0, /* U+0023a2: LEFT SQUARE BRACKET EXTENSION*/
- 0, /* U+0023a3: LEFT SQUARE BRACKET LOWER CORNER*/
- 0, /* U+0023a4: RIGHT SQUARE BRACKET UPPER CORNER*/
- 0, /* U+0023a5: RIGHT SQUARE BRACKET EXTENSION*/
- 0, /* U+0023a6: RIGHT SQUARE BRACKET LOWER CORNER*/
- 0, /* U+0023a7: LEFT CURLY BRACKET UPPER HOOK*/
- 0, /* U+0023a8: LEFT CURLY BRACKET MIDDLE PIECE*/
- 0, /* U+0023a9: LEFT CURLY BRACKET LOWER HOOK*/
- 0, /* U+0023aa: CURLY BRACKET EXTENSION*/
- 0, /* U+0023ab: RIGHT CURLY BRACKET UPPER HOOK*/
- 0, /* U+0023ac: RIGHT CURLY BRACKET MIDDLE PIECE*/
- 0, /* U+0023ad: RIGHT CURLY BRACKET LOWER HOOK*/
- 0, /* U+0023ae: INTEGRAL EXTENSION*/
- 0, /* U+0023af: HORIZONTAL LINE EXTENSION*/
- 0, /* U+0023b0: UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION*/
- 0, /* U+0023b1: UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION*/
- 0, /* U+0023b2: SUMMATION TOP*/
- 0, /* U+0023b3: SUMMATION BOTTOM*/
- 0, /* U+0023b4: TOP SQUARE BRACKET*/
- 0, /* U+0023b5: BOTTOM SQUARE BRACKET*/
- 0, /* U+0023b6: BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET*/
- 0, /* U+0023b7: RADICAL SYMBOL BOTTOM*/
- 0, /* U+0023b8: LEFT VERTICAL BOX LINE*/
- 0, /* U+0023b9: RIGHT VERTICAL BOX LINE*/
- 0, /* U+0023ba: HORIZONTAL SCAN LINE-1*/
- 0, /* U+0023bb: HORIZONTAL SCAN LINE-3*/
- 0, /* U+0023bc: HORIZONTAL SCAN LINE-7*/
- 0, /* U+0023bd: HORIZONTAL SCAN LINE-9*/
- 0, /* U+0023be: DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT*/
- 0, /* U+0023bf: DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT*/
- 0, /* U+0023c0: DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE*/
- 0, /* U+0023c1: DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE*/
- 0, /* U+0023c2: DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE*/
- 0, /* U+0023c3: DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE*/
- 0, /* U+0023c4: DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE*/
- 0, /* U+0023c5: DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE*/
- 0, /* U+0023c6: DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE*/
- 0, /* U+0023c7: DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE*/
- 0, /* U+0023c8: DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE*/
- 0, /* U+0023c9: DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL*/
- 0, /* U+0023ca: DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL*/
- 0, /* U+0023cb: DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT*/
- 0, /* U+0023cc: DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT*/
- 0, /* U+0023cd: SQUARE FOOT*/
- 0, /* U+0023ce: RETURN SYMBOL*/
- 0, /* U+0023cf: EJECT SYMBOL*/
- 0, /* U+0023d0: VERTICAL LINE EXTENSION*/
- 0, /* U+0023d1: METRICAL BREVE*/
- 0, /* U+0023d2: METRICAL LONG OVER SHORT*/
- 0, /* U+0023d3: METRICAL SHORT OVER LONG*/
- 0, /* U+0023d4: METRICAL LONG OVER TWO SHORTS*/
- 0, /* U+0023d5: METRICAL TWO SHORTS OVER LONG*/
- 0, /* U+0023d6: METRICAL TWO SHORTS JOINED*/
- 0, /* U+0023d7: METRICAL TRISEME*/
- 0, /* U+0023d8: METRICAL TETRASEME*/
- 0, /* U+0023d9: METRICAL PENTASEME*/
- 0, /* U+0023da: EARTH GROUND*/
- 0, /* U+0023db: FUSE*/
- 0, /* U+0023dc: */
- 0, /* U+0023dd: */
- 0, /* U+0023de: */
- 0, /* U+0023df: */
- 0, /* U+0023e0: */
- 0, /* U+0023e1: */
- 0, /* U+0023e2: */
- 0, /* U+0023e3: */
- 0, /* U+0023e4: */
- 0, /* U+0023e5: */
- 0, /* U+0023e6: */
- 0, /* U+0023e7: */
- 0, /* U+0023e8: */
- 0, /* U+0023e9: */
- 0, /* U+0023ea: */
- 0, /* U+0023eb: */
- 0, /* U+0023ec: */
- 0, /* U+0023ed: */
- 0, /* U+0023ee: */
- 0, /* U+0023ef: */
- 0, /* U+0023f0: */
- 0, /* U+0023f1: */
- 0, /* U+0023f2: */
- 0, /* U+0023f3: */
- 0, /* U+0023f4: */
- 0, /* U+0023f5: */
- 0, /* U+0023f6: */
- 0, /* U+0023f7: */
- 0, /* U+0023f8: */
- 0, /* U+0023f9: */
- 0, /* U+0023fa: */
- 0, /* U+0023fb: */
- 0, /* U+0023fc: */
- 0, /* U+0023fd: */
- 0, /* U+0023fe: */
- 0, /* U+0023ff: */
- 0, /* U+002400: SYMBOL FOR NULL*/
- 0, /* U+002401: SYMBOL FOR START OF HEADING*/
- 0, /* U+002402: SYMBOL FOR START OF TEXT*/
- 0, /* U+002403: SYMBOL FOR END OF TEXT*/
- 0, /* U+002404: SYMBOL FOR END OF TRANSMISSION*/
- 0, /* U+002405: SYMBOL FOR ENQUIRY*/
- 0, /* U+002406: SYMBOL FOR ACKNOWLEDGE*/
- 0, /* U+002407: SYMBOL FOR BELL*/
- 0, /* U+002408: SYMBOL FOR BACKSPACE*/
- 0, /* U+002409: SYMBOL FOR HORIZONTAL TABULATION*/
- 0, /* U+00240a: SYMBOL FOR LINE FEED*/
- 0, /* U+00240b: SYMBOL FOR VERTICAL TABULATION*/
- 0, /* U+00240c: SYMBOL FOR FORM FEED*/
- 0, /* U+00240d: SYMBOL FOR CARRIAGE RETURN*/
- 0, /* U+00240e: SYMBOL FOR SHIFT OUT*/
- 0, /* U+00240f: SYMBOL FOR SHIFT IN*/
- 0, /* U+002410: SYMBOL FOR DATA LINK ESCAPE*/
- 0, /* U+002411: SYMBOL FOR DEVICE CONTROL ONE*/
- 0, /* U+002412: SYMBOL FOR DEVICE CONTROL TWO*/
- 0, /* U+002413: SYMBOL FOR DEVICE CONTROL THREE*/
- 0, /* U+002414: SYMBOL FOR DEVICE CONTROL FOUR*/
- 0, /* U+002415: SYMBOL FOR NEGATIVE ACKNOWLEDGE*/
- 0, /* U+002416: SYMBOL FOR SYNCHRONOUS IDLE*/
- 0, /* U+002417: SYMBOL FOR END OF TRANSMISSION BLOCK*/
- 0, /* U+002418: SYMBOL FOR CANCEL*/
- 0, /* U+002419: SYMBOL FOR END OF MEDIUM*/
- 0, /* U+00241a: SYMBOL FOR SUBSTITUTE*/
- 0, /* U+00241b: SYMBOL FOR ESCAPE*/
- 0, /* U+00241c: SYMBOL FOR FILE SEPARATOR*/
- 0, /* U+00241d: SYMBOL FOR GROUP SEPARATOR*/
- 0, /* U+00241e: SYMBOL FOR RECORD SEPARATOR*/
- 0, /* U+00241f: SYMBOL FOR UNIT SEPARATOR*/
- 0, /* U+002420: SYMBOL FOR SPACE*/
- 0, /* U+002421: SYMBOL FOR DELETE*/
- 0, /* U+002422: BLANK SYMBOL*/
- 0, /* U+002423: OPEN BOX*/
- 0, /* U+002424: SYMBOL FOR NEWLINE*/
- 0, /* U+002425: SYMBOL FOR DELETE FORM TWO*/
- 0, /* U+002426: SYMBOL FOR SUBSTITUTE FORM TWO*/
- 0, /* U+002427: */
- 0, /* U+002428: */
- 0, /* U+002429: */
- 0, /* U+00242a: */
- 0, /* U+00242b: */
- 0, /* U+00242c: */
- 0, /* U+00242d: */
- 0, /* U+00242e: */
- 0, /* U+00242f: */
- 0, /* U+002430: */
- 0, /* U+002431: */
- 0, /* U+002432: */
- 0, /* U+002433: */
- 0, /* U+002434: */
- 0, /* U+002435: */
- 0, /* U+002436: */
- 0, /* U+002437: */
- 0, /* U+002438: */
- 0, /* U+002439: */
- 0, /* U+00243a: */
- 0, /* U+00243b: */
- 0, /* U+00243c: */
- 0, /* U+00243d: */
- 0, /* U+00243e: */
- 0, /* U+00243f: */
- 0, /* U+002440: OCR HOOK*/
- 0, /* U+002441: OCR CHAIR*/
- 0, /* U+002442: OCR FORK*/
- 0, /* U+002443: OCR INVERTED FORK*/
- 0, /* U+002444: OCR BELT BUCKLE*/
- 0, /* U+002445: OCR BOW TIE*/
- 0, /* U+002446: OCR BRANCH BANK IDENTIFICATION*/
- 0, /* U+002447: OCR AMOUNT OF CHECK*/
- 0, /* U+002448: OCR DASH*/
- 0, /* U+002449: OCR CUSTOMER ACCOUNT NUMBER*/
- 0, /* U+00244a: OCR DOUBLE BACKSLASH*/
- 0, /* U+00244b: */
- 0, /* U+00244c: */
- 0, /* U+00244d: */
- 0, /* U+00244e: */
- 0, /* U+00244f: */
- 0, /* U+002450: */
- 0, /* U+002451: */
- 0, /* U+002452: */
- 0, /* U+002453: */
- 0, /* U+002454: */
- 0, /* U+002455: */
- 0, /* U+002456: */
- 0, /* U+002457: */
- 0, /* U+002458: */
- 0, /* U+002459: */
- 0, /* U+00245a: */
- 0, /* U+00245b: */
- 0, /* U+00245c: */
- 0, /* U+00245d: */
- 0, /* U+00245e: */
- 0, /* U+00245f: */
- 0, /* U+002460: CIRCLED DIGIT ONE*/
- 0, /* U+002461: CIRCLED DIGIT TWO*/
- 0, /* U+002462: CIRCLED DIGIT THREE*/
- 0, /* U+002463: CIRCLED DIGIT FOUR*/
- 0, /* U+002464: CIRCLED DIGIT FIVE*/
- 0, /* U+002465: CIRCLED DIGIT SIX*/
- 0, /* U+002466: CIRCLED DIGIT SEVEN*/
- 0, /* U+002467: CIRCLED DIGIT EIGHT*/
- 0, /* U+002468: CIRCLED DIGIT NINE*/
- 0, /* U+002469: CIRCLED NUMBER TEN*/
- 0, /* U+00246a: CIRCLED NUMBER ELEVEN*/
- 0, /* U+00246b: CIRCLED NUMBER TWELVE*/
- 0, /* U+00246c: CIRCLED NUMBER THIRTEEN*/
- 0, /* U+00246d: CIRCLED NUMBER FOURTEEN*/
- 0, /* U+00246e: CIRCLED NUMBER FIFTEEN*/
- 0, /* U+00246f: CIRCLED NUMBER SIXTEEN*/
- 0, /* U+002470: CIRCLED NUMBER SEVENTEEN*/
- 0, /* U+002471: CIRCLED NUMBER EIGHTEEN*/
- 0, /* U+002472: CIRCLED NUMBER NINETEEN*/
- 0, /* U+002473: CIRCLED NUMBER TWENTY*/
- 0, /* U+002474: PARENTHESIZED DIGIT ONE*/
- 0, /* U+002475: PARENTHESIZED DIGIT TWO*/
- 0, /* U+002476: PARENTHESIZED DIGIT THREE*/
- 0, /* U+002477: PARENTHESIZED DIGIT FOUR*/
- 0, /* U+002478: PARENTHESIZED DIGIT FIVE*/
- 0, /* U+002479: PARENTHESIZED DIGIT SIX*/
- 0, /* U+00247a: PARENTHESIZED DIGIT SEVEN*/
- 0, /* U+00247b: PARENTHESIZED DIGIT EIGHT*/
- 0, /* U+00247c: PARENTHESIZED DIGIT NINE*/
- 0, /* U+00247d: PARENTHESIZED NUMBER TEN*/
- 0, /* U+00247e: PARENTHESIZED NUMBER ELEVEN*/
- 0, /* U+00247f: PARENTHESIZED NUMBER TWELVE*/
- 0, /* U+002480: PARENTHESIZED NUMBER THIRTEEN*/
- 0, /* U+002481: PARENTHESIZED NUMBER FOURTEEN*/
- 0, /* U+002482: PARENTHESIZED NUMBER FIFTEEN*/
- 0, /* U+002483: PARENTHESIZED NUMBER SIXTEEN*/
- 0, /* U+002484: PARENTHESIZED NUMBER SEVENTEEN*/
- 0, /* U+002485: PARENTHESIZED NUMBER EIGHTEEN*/
- 0, /* U+002486: PARENTHESIZED NUMBER NINETEEN*/
- 0, /* U+002487: PARENTHESIZED NUMBER TWENTY*/
- 0, /* U+002488: DIGIT ONE FULL STOP*/
- 0, /* U+002489: DIGIT TWO FULL STOP*/
- 0, /* U+00248a: DIGIT THREE FULL STOP*/
- 0, /* U+00248b: DIGIT FOUR FULL STOP*/
- 0, /* U+00248c: DIGIT FIVE FULL STOP*/
- 0, /* U+00248d: DIGIT SIX FULL STOP*/
- 0, /* U+00248e: DIGIT SEVEN FULL STOP*/
- 0, /* U+00248f: DIGIT EIGHT FULL STOP*/
- 0, /* U+002490: DIGIT NINE FULL STOP*/
- 0, /* U+002491: NUMBER TEN FULL STOP*/
- 0, /* U+002492: NUMBER ELEVEN FULL STOP*/
- 0, /* U+002493: NUMBER TWELVE FULL STOP*/
- 0, /* U+002494: NUMBER THIRTEEN FULL STOP*/
- 0, /* U+002495: NUMBER FOURTEEN FULL STOP*/
- 0, /* U+002496: NUMBER FIFTEEN FULL STOP*/
- 0, /* U+002497: NUMBER SIXTEEN FULL STOP*/
- 0, /* U+002498: NUMBER SEVENTEEN FULL STOP*/
- 0, /* U+002499: NUMBER EIGHTEEN FULL STOP*/
- 0, /* U+00249a: NUMBER NINETEEN FULL STOP*/
- 0, /* U+00249b: NUMBER TWENTY FULL STOP*/
- 0, /* U+00249c: PARENTHESIZED LATIN SMALL LETTER A*/
- 0, /* U+00249d: PARENTHESIZED LATIN SMALL LETTER B*/
- 0, /* U+00249e: PARENTHESIZED LATIN SMALL LETTER C*/
- 0, /* U+00249f: PARENTHESIZED LATIN SMALL LETTER D*/
- 0, /* U+0024a0: PARENTHESIZED LATIN SMALL LETTER E*/
- 0, /* U+0024a1: PARENTHESIZED LATIN SMALL LETTER F*/
- 0, /* U+0024a2: PARENTHESIZED LATIN SMALL LETTER G*/
- 0, /* U+0024a3: PARENTHESIZED LATIN SMALL LETTER H*/
- 0, /* U+0024a4: PARENTHESIZED LATIN SMALL LETTER I*/
- 0, /* U+0024a5: PARENTHESIZED LATIN SMALL LETTER J*/
- 0, /* U+0024a6: PARENTHESIZED LATIN SMALL LETTER K*/
- 0, /* U+0024a7: PARENTHESIZED LATIN SMALL LETTER L*/
- 0, /* U+0024a8: PARENTHESIZED LATIN SMALL LETTER M*/
- 0, /* U+0024a9: PARENTHESIZED LATIN SMALL LETTER N*/
- 0, /* U+0024aa: PARENTHESIZED LATIN SMALL LETTER O*/
- 0, /* U+0024ab: PARENTHESIZED LATIN SMALL LETTER P*/
- 0, /* U+0024ac: PARENTHESIZED LATIN SMALL LETTER Q*/
- 0, /* U+0024ad: PARENTHESIZED LATIN SMALL LETTER R*/
- 0, /* U+0024ae: PARENTHESIZED LATIN SMALL LETTER S*/
- 0, /* U+0024af: PARENTHESIZED LATIN SMALL LETTER T*/
- 0, /* U+0024b0: PARENTHESIZED LATIN SMALL LETTER U*/
- 0, /* U+0024b1: PARENTHESIZED LATIN SMALL LETTER V*/
- 0, /* U+0024b2: PARENTHESIZED LATIN SMALL LETTER W*/
- 0, /* U+0024b3: PARENTHESIZED LATIN SMALL LETTER X*/
- 0, /* U+0024b4: PARENTHESIZED LATIN SMALL LETTER Y*/
- 0, /* U+0024b5: PARENTHESIZED LATIN SMALL LETTER Z*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0024b6: CIRCLED LATIN CAPITAL LETTER A*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0024b7: CIRCLED LATIN CAPITAL LETTER B*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0024b8: CIRCLED LATIN CAPITAL LETTER C*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0024b9: CIRCLED LATIN CAPITAL LETTER D*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0024ba: CIRCLED LATIN CAPITAL LETTER E*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0024bb: CIRCLED LATIN CAPITAL LETTER F*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0024bc: CIRCLED LATIN CAPITAL LETTER G*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0024bd: CIRCLED LATIN CAPITAL LETTER H*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0024be: CIRCLED LATIN CAPITAL LETTER I*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0024bf: CIRCLED LATIN CAPITAL LETTER J*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0024c0: CIRCLED LATIN CAPITAL LETTER K*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0024c1: CIRCLED LATIN CAPITAL LETTER L*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0024c2: CIRCLED LATIN CAPITAL LETTER M*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0024c3: CIRCLED LATIN CAPITAL LETTER N*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0024c4: CIRCLED LATIN CAPITAL LETTER O*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0024c5: CIRCLED LATIN CAPITAL LETTER P*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0024c6: CIRCLED LATIN CAPITAL LETTER Q*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0024c7: CIRCLED LATIN CAPITAL LETTER R*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0024c8: CIRCLED LATIN CAPITAL LETTER S*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0024c9: CIRCLED LATIN CAPITAL LETTER T*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0024ca: CIRCLED LATIN CAPITAL LETTER U*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0024cb: CIRCLED LATIN CAPITAL LETTER V*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0024cc: CIRCLED LATIN CAPITAL LETTER W*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0024cd: CIRCLED LATIN CAPITAL LETTER X*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0024ce: CIRCLED LATIN CAPITAL LETTER Y*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+0024cf: CIRCLED LATIN CAPITAL LETTER Z*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0024d0: CIRCLED LATIN SMALL LETTER A*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0024d1: CIRCLED LATIN SMALL LETTER B*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0024d2: CIRCLED LATIN SMALL LETTER C*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0024d3: CIRCLED LATIN SMALL LETTER D*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0024d4: CIRCLED LATIN SMALL LETTER E*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0024d5: CIRCLED LATIN SMALL LETTER F*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0024d6: CIRCLED LATIN SMALL LETTER G*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0024d7: CIRCLED LATIN SMALL LETTER H*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0024d8: CIRCLED LATIN SMALL LETTER I*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0024d9: CIRCLED LATIN SMALL LETTER J*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0024da: CIRCLED LATIN SMALL LETTER K*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0024db: CIRCLED LATIN SMALL LETTER L*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0024dc: CIRCLED LATIN SMALL LETTER M*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0024dd: CIRCLED LATIN SMALL LETTER N*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0024de: CIRCLED LATIN SMALL LETTER O*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0024df: CIRCLED LATIN SMALL LETTER P*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0024e0: CIRCLED LATIN SMALL LETTER Q*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0024e1: CIRCLED LATIN SMALL LETTER R*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0024e2: CIRCLED LATIN SMALL LETTER S*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0024e3: CIRCLED LATIN SMALL LETTER T*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0024e4: CIRCLED LATIN SMALL LETTER U*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0024e5: CIRCLED LATIN SMALL LETTER V*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0024e6: CIRCLED LATIN SMALL LETTER W*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0024e7: CIRCLED LATIN SMALL LETTER X*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0024e8: CIRCLED LATIN SMALL LETTER Y*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+0024e9: CIRCLED LATIN SMALL LETTER Z*/
- 0, /* U+0024ea: CIRCLED DIGIT ZERO*/
- 0, /* U+0024eb: NEGATIVE CIRCLED NUMBER ELEVEN*/
- 0, /* U+0024ec: NEGATIVE CIRCLED NUMBER TWELVE*/
- 0, /* U+0024ed: NEGATIVE CIRCLED NUMBER THIRTEEN*/
- 0, /* U+0024ee: NEGATIVE CIRCLED NUMBER FOURTEEN*/
- 0, /* U+0024ef: NEGATIVE CIRCLED NUMBER FIFTEEN*/
- 0, /* U+0024f0: NEGATIVE CIRCLED NUMBER SIXTEEN*/
- 0, /* U+0024f1: NEGATIVE CIRCLED NUMBER SEVENTEEN*/
- 0, /* U+0024f2: NEGATIVE CIRCLED NUMBER EIGHTEEN*/
- 0, /* U+0024f3: NEGATIVE CIRCLED NUMBER NINETEEN*/
- 0, /* U+0024f4: NEGATIVE CIRCLED NUMBER TWENTY*/
- 0, /* U+0024f5: DOUBLE CIRCLED DIGIT ONE*/
- 0, /* U+0024f6: DOUBLE CIRCLED DIGIT TWO*/
- 0, /* U+0024f7: DOUBLE CIRCLED DIGIT THREE*/
- 0, /* U+0024f8: DOUBLE CIRCLED DIGIT FOUR*/
- 0, /* U+0024f9: DOUBLE CIRCLED DIGIT FIVE*/
- 0, /* U+0024fa: DOUBLE CIRCLED DIGIT SIX*/
- 0, /* U+0024fb: DOUBLE CIRCLED DIGIT SEVEN*/
- 0, /* U+0024fc: DOUBLE CIRCLED DIGIT EIGHT*/
- 0, /* U+0024fd: DOUBLE CIRCLED DIGIT NINE*/
- 0, /* U+0024fe: DOUBLE CIRCLED NUMBER TEN*/
- 0, /* U+0024ff: NEGATIVE CIRCLED DIGIT ZERO*/
- 0, /* U+002500: BOX DRAWINGS LIGHT HORIZONTAL*/
- 0, /* U+002501: BOX DRAWINGS HEAVY HORIZONTAL*/
- 0, /* U+002502: BOX DRAWINGS LIGHT VERTICAL*/
- 0, /* U+002503: BOX DRAWINGS HEAVY VERTICAL*/
- 0, /* U+002504: BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL*/
- 0, /* U+002505: BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL*/
- 0, /* U+002506: BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL*/
- 0, /* U+002507: BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL*/
- 0, /* U+002508: BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL*/
- 0, /* U+002509: BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL*/
- 0, /* U+00250a: BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL*/
- 0, /* U+00250b: BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL*/
- 0, /* U+00250c: BOX DRAWINGS LIGHT DOWN AND RIGHT*/
- 0, /* U+00250d: BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY*/
- 0, /* U+00250e: BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT*/
- 0, /* U+00250f: BOX DRAWINGS HEAVY DOWN AND RIGHT*/
- 0, /* U+002510: BOX DRAWINGS LIGHT DOWN AND LEFT*/
- 0, /* U+002511: BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY*/
- 0, /* U+002512: BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT*/
- 0, /* U+002513: BOX DRAWINGS HEAVY DOWN AND LEFT*/
- 0, /* U+002514: BOX DRAWINGS LIGHT UP AND RIGHT*/
- 0, /* U+002515: BOX DRAWINGS UP LIGHT AND RIGHT HEAVY*/
- 0, /* U+002516: BOX DRAWINGS UP HEAVY AND RIGHT LIGHT*/
- 0, /* U+002517: BOX DRAWINGS HEAVY UP AND RIGHT*/
- 0, /* U+002518: BOX DRAWINGS LIGHT UP AND LEFT*/
- 0, /* U+002519: BOX DRAWINGS UP LIGHT AND LEFT HEAVY*/
- 0, /* U+00251a: BOX DRAWINGS UP HEAVY AND LEFT LIGHT*/
- 0, /* U+00251b: BOX DRAWINGS HEAVY UP AND LEFT*/
- 0, /* U+00251c: BOX DRAWINGS LIGHT VERTICAL AND RIGHT*/
- 0, /* U+00251d: BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY*/
- 0, /* U+00251e: BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT*/
- 0, /* U+00251f: BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT*/
- 0, /* U+002520: BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT*/
- 0, /* U+002521: BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY*/
- 0, /* U+002522: BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY*/
- 0, /* U+002523: BOX DRAWINGS HEAVY VERTICAL AND RIGHT*/
- 0, /* U+002524: BOX DRAWINGS LIGHT VERTICAL AND LEFT*/
- 0, /* U+002525: BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY*/
- 0, /* U+002526: BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT*/
- 0, /* U+002527: BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT*/
- 0, /* U+002528: BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT*/
- 0, /* U+002529: BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY*/
- 0, /* U+00252a: BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY*/
- 0, /* U+00252b: BOX DRAWINGS HEAVY VERTICAL AND LEFT*/
- 0, /* U+00252c: BOX DRAWINGS LIGHT DOWN AND HORIZONTAL*/
- 0, /* U+00252d: BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT*/
- 0, /* U+00252e: BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT*/
- 0, /* U+00252f: BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY*/
- 0, /* U+002530: BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT*/
- 0, /* U+002531: BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY*/
- 0, /* U+002532: BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY*/
- 0, /* U+002533: BOX DRAWINGS HEAVY DOWN AND HORIZONTAL*/
- 0, /* U+002534: BOX DRAWINGS LIGHT UP AND HORIZONTAL*/
- 0, /* U+002535: BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT*/
- 0, /* U+002536: BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT*/
- 0, /* U+002537: BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY*/
- 0, /* U+002538: BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT*/
- 0, /* U+002539: BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY*/
- 0, /* U+00253a: BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY*/
- 0, /* U+00253b: BOX DRAWINGS HEAVY UP AND HORIZONTAL*/
- 0, /* U+00253c: BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL*/
- 0, /* U+00253d: BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT*/
- 0, /* U+00253e: BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT*/
- 0, /* U+00253f: BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY*/
- 0, /* U+002540: BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT*/
- 0, /* U+002541: BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT*/
- 0, /* U+002542: BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT*/
- 0, /* U+002543: BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT*/
- 0, /* U+002544: BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT*/
- 0, /* U+002545: BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT*/
- 0, /* U+002546: BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT*/
- 0, /* U+002547: BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY*/
- 0, /* U+002548: BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY*/
- 0, /* U+002549: BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY*/
- 0, /* U+00254a: BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY*/
- 0, /* U+00254b: BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL*/
- 0, /* U+00254c: BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL*/
- 0, /* U+00254d: BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL*/
- 0, /* U+00254e: BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL*/
- 0, /* U+00254f: BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL*/
- 0, /* U+002550: BOX DRAWINGS DOUBLE HORIZONTAL*/
- 0, /* U+002551: BOX DRAWINGS DOUBLE VERTICAL*/
- 0, /* U+002552: BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE*/
- 0, /* U+002553: BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE*/
- 0, /* U+002554: BOX DRAWINGS DOUBLE DOWN AND RIGHT*/
- 0, /* U+002555: BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE*/
- 0, /* U+002556: BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE*/
- 0, /* U+002557: BOX DRAWINGS DOUBLE DOWN AND LEFT*/
- 0, /* U+002558: BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE*/
- 0, /* U+002559: BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE*/
- 0, /* U+00255a: BOX DRAWINGS DOUBLE UP AND RIGHT*/
- 0, /* U+00255b: BOX DRAWINGS UP SINGLE AND LEFT DOUBLE*/
- 0, /* U+00255c: BOX DRAWINGS UP DOUBLE AND LEFT SINGLE*/
- 0, /* U+00255d: BOX DRAWINGS DOUBLE UP AND LEFT*/
- 0, /* U+00255e: BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE*/
- 0, /* U+00255f: BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE*/
- 0, /* U+002560: BOX DRAWINGS DOUBLE VERTICAL AND RIGHT*/
- 0, /* U+002561: BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE*/
- 0, /* U+002562: BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE*/
- 0, /* U+002563: BOX DRAWINGS DOUBLE VERTICAL AND LEFT*/
- 0, /* U+002564: BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE*/
- 0, /* U+002565: BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE*/
- 0, /* U+002566: BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL*/
- 0, /* U+002567: BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE*/
- 0, /* U+002568: BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE*/
- 0, /* U+002569: BOX DRAWINGS DOUBLE UP AND HORIZONTAL*/
- 0, /* U+00256a: BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE*/
- 0, /* U+00256b: BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE*/
- 0, /* U+00256c: BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL*/
- 0, /* U+00256d: BOX DRAWINGS LIGHT ARC DOWN AND RIGHT*/
- 0, /* U+00256e: BOX DRAWINGS LIGHT ARC DOWN AND LEFT*/
- 0, /* U+00256f: BOX DRAWINGS LIGHT ARC UP AND LEFT*/
- 0, /* U+002570: BOX DRAWINGS LIGHT ARC UP AND RIGHT*/
- 0, /* U+002571: BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT*/
- 0, /* U+002572: BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT*/
- 0, /* U+002573: BOX DRAWINGS LIGHT DIAGONAL CROSS*/
- 0, /* U+002574: BOX DRAWINGS LIGHT LEFT*/
- 0, /* U+002575: BOX DRAWINGS LIGHT UP*/
- 0, /* U+002576: BOX DRAWINGS LIGHT RIGHT*/
- 0, /* U+002577: BOX DRAWINGS LIGHT DOWN*/
- 0, /* U+002578: BOX DRAWINGS HEAVY LEFT*/
- 0, /* U+002579: BOX DRAWINGS HEAVY UP*/
- 0, /* U+00257a: BOX DRAWINGS HEAVY RIGHT*/
- 0, /* U+00257b: BOX DRAWINGS HEAVY DOWN*/
- 0, /* U+00257c: BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT*/
- 0, /* U+00257d: BOX DRAWINGS LIGHT UP AND HEAVY DOWN*/
- 0, /* U+00257e: BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT*/
- 0, /* U+00257f: BOX DRAWINGS HEAVY UP AND LIGHT DOWN*/
- 0, /* U+002580: UPPER HALF BLOCK*/
- 0, /* U+002581: LOWER ONE EIGHTH BLOCK*/
- 0, /* U+002582: LOWER ONE QUARTER BLOCK*/
- 0, /* U+002583: LOWER THREE EIGHTHS BLOCK*/
- 0, /* U+002584: LOWER HALF BLOCK*/
- 0, /* U+002585: LOWER FIVE EIGHTHS BLOCK*/
- 0, /* U+002586: LOWER THREE QUARTERS BLOCK*/
- 0, /* U+002587: LOWER SEVEN EIGHTHS BLOCK*/
- 0, /* U+002588: FULL BLOCK*/
- 0, /* U+002589: LEFT SEVEN EIGHTHS BLOCK*/
- 0, /* U+00258a: LEFT THREE QUARTERS BLOCK*/
- 0, /* U+00258b: LEFT FIVE EIGHTHS BLOCK*/
- 0, /* U+00258c: LEFT HALF BLOCK*/
- 0, /* U+00258d: LEFT THREE EIGHTHS BLOCK*/
- 0, /* U+00258e: LEFT ONE QUARTER BLOCK*/
- 0, /* U+00258f: LEFT ONE EIGHTH BLOCK*/
- 0, /* U+002590: RIGHT HALF BLOCK*/
- 0, /* U+002591: LIGHT SHADE*/
- 0, /* U+002592: MEDIUM SHADE*/
- 0, /* U+002593: DARK SHADE*/
- 0, /* U+002594: UPPER ONE EIGHTH BLOCK*/
- 0, /* U+002595: RIGHT ONE EIGHTH BLOCK*/
- 0, /* U+002596: QUADRANT LOWER LEFT*/
- 0, /* U+002597: QUADRANT LOWER RIGHT*/
- 0, /* U+002598: QUADRANT UPPER LEFT*/
- 0, /* U+002599: QUADRANT UPPER LEFT AND LOWER LEFT AND LOWER RIGHT*/
- 0, /* U+00259a: QUADRANT UPPER LEFT AND LOWER RIGHT*/
- 0, /* U+00259b: QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER LEFT*/
- 0, /* U+00259c: QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER RIGHT*/
- 0, /* U+00259d: QUADRANT UPPER RIGHT*/
- 0, /* U+00259e: QUADRANT UPPER RIGHT AND LOWER LEFT*/
- 0, /* U+00259f: QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT*/
- 0, /* U+0025a0: BLACK SQUARE*/
- 0, /* U+0025a1: WHITE SQUARE*/
- 0, /* U+0025a2: WHITE SQUARE WITH ROUNDED CORNERS*/
- 0, /* U+0025a3: WHITE SQUARE CONTAINING BLACK SMALL SQUARE*/
- 0, /* U+0025a4: SQUARE WITH HORIZONTAL FILL*/
- 0, /* U+0025a5: SQUARE WITH VERTICAL FILL*/
- 0, /* U+0025a6: SQUARE WITH ORTHOGONAL CROSSHATCH FILL*/
- 0, /* U+0025a7: SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL*/
- 0, /* U+0025a8: SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL*/
- 0, /* U+0025a9: SQUARE WITH DIAGONAL CROSSHATCH FILL*/
- 0, /* U+0025aa: BLACK SMALL SQUARE*/
- 0, /* U+0025ab: WHITE SMALL SQUARE*/
- 0, /* U+0025ac: BLACK RECTANGLE*/
- 0, /* U+0025ad: WHITE RECTANGLE*/
- 0, /* U+0025ae: BLACK VERTICAL RECTANGLE*/
- 0, /* U+0025af: WHITE VERTICAL RECTANGLE*/
- 0, /* U+0025b0: BLACK PARALLELOGRAM*/
- 0, /* U+0025b1: WHITE PARALLELOGRAM*/
- 0, /* U+0025b2: BLACK UP-POINTING TRIANGLE*/
- 0, /* U+0025b3: WHITE UP-POINTING TRIANGLE*/
- 0, /* U+0025b4: BLACK UP-POINTING SMALL TRIANGLE*/
- 0, /* U+0025b5: WHITE UP-POINTING SMALL TRIANGLE*/
- 0, /* U+0025b6: BLACK RIGHT-POINTING TRIANGLE*/
- 0, /* U+0025b7: WHITE RIGHT-POINTING TRIANGLE*/
- 0, /* U+0025b8: BLACK RIGHT-POINTING SMALL TRIANGLE*/
- 0, /* U+0025b9: WHITE RIGHT-POINTING SMALL TRIANGLE*/
- 0, /* U+0025ba: BLACK RIGHT-POINTING POINTER*/
- 0, /* U+0025bb: WHITE RIGHT-POINTING POINTER*/
- 0, /* U+0025bc: BLACK DOWN-POINTING TRIANGLE*/
- 0, /* U+0025bd: WHITE DOWN-POINTING TRIANGLE*/
- 0, /* U+0025be: BLACK DOWN-POINTING SMALL TRIANGLE*/
- 0, /* U+0025bf: WHITE DOWN-POINTING SMALL TRIANGLE*/
- 0, /* U+0025c0: BLACK LEFT-POINTING TRIANGLE*/
- 0, /* U+0025c1: WHITE LEFT-POINTING TRIANGLE*/
- 0, /* U+0025c2: BLACK LEFT-POINTING SMALL TRIANGLE*/
- 0, /* U+0025c3: WHITE LEFT-POINTING SMALL TRIANGLE*/
- 0, /* U+0025c4: BLACK LEFT-POINTING POINTER*/
- 0, /* U+0025c5: WHITE LEFT-POINTING POINTER*/
- 0, /* U+0025c6: BLACK DIAMOND*/
- 0, /* U+0025c7: WHITE DIAMOND*/
- 0, /* U+0025c8: WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND*/
- 0, /* U+0025c9: FISHEYE*/
- 0, /* U+0025ca: LOZENGE*/
- 0, /* U+0025cb: WHITE CIRCLE*/
- 0, /* U+0025cc: DOTTED CIRCLE*/
- 0, /* U+0025cd: CIRCLE WITH VERTICAL FILL*/
- 0, /* U+0025ce: BULLSEYE*/
- 0, /* U+0025cf: BLACK CIRCLE*/
- 0, /* U+0025d0: CIRCLE WITH LEFT HALF BLACK*/
- 0, /* U+0025d1: CIRCLE WITH RIGHT HALF BLACK*/
- 0, /* U+0025d2: CIRCLE WITH LOWER HALF BLACK*/
- 0, /* U+0025d3: CIRCLE WITH UPPER HALF BLACK*/
- 0, /* U+0025d4: CIRCLE WITH UPPER RIGHT QUADRANT BLACK*/
- 0, /* U+0025d5: CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK*/
- 0, /* U+0025d6: LEFT HALF BLACK CIRCLE*/
- 0, /* U+0025d7: RIGHT HALF BLACK CIRCLE*/
- 0, /* U+0025d8: INVERSE BULLET*/
- 0, /* U+0025d9: INVERSE WHITE CIRCLE*/
- 0, /* U+0025da: UPPER HALF INVERSE WHITE CIRCLE*/
- 0, /* U+0025db: LOWER HALF INVERSE WHITE CIRCLE*/
- 0, /* U+0025dc: UPPER LEFT QUADRANT CIRCULAR ARC*/
- 0, /* U+0025dd: UPPER RIGHT QUADRANT CIRCULAR ARC*/
- 0, /* U+0025de: LOWER RIGHT QUADRANT CIRCULAR ARC*/
- 0, /* U+0025df: LOWER LEFT QUADRANT CIRCULAR ARC*/
- 0, /* U+0025e0: UPPER HALF CIRCLE*/
- 0, /* U+0025e1: LOWER HALF CIRCLE*/
- 0, /* U+0025e2: BLACK LOWER RIGHT TRIANGLE*/
- 0, /* U+0025e3: BLACK LOWER LEFT TRIANGLE*/
- 0, /* U+0025e4: BLACK UPPER LEFT TRIANGLE*/
- 0, /* U+0025e5: BLACK UPPER RIGHT TRIANGLE*/
- 0, /* U+0025e6: WHITE BULLET*/
- 0, /* U+0025e7: SQUARE WITH LEFT HALF BLACK*/
- 0, /* U+0025e8: SQUARE WITH RIGHT HALF BLACK*/
- 0, /* U+0025e9: SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK*/
- 0, /* U+0025ea: SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK*/
- 0, /* U+0025eb: WHITE SQUARE WITH VERTICAL BISECTING LINE*/
- 0, /* U+0025ec: WHITE UP-POINTING TRIANGLE WITH DOT*/
- 0, /* U+0025ed: UP-POINTING TRIANGLE WITH LEFT HALF BLACK*/
- 0, /* U+0025ee: UP-POINTING TRIANGLE WITH RIGHT HALF BLACK*/
- 0, /* U+0025ef: LARGE CIRCLE*/
- 0, /* U+0025f0: WHITE SQUARE WITH UPPER LEFT QUADRANT*/
- 0, /* U+0025f1: WHITE SQUARE WITH LOWER LEFT QUADRANT*/
- 0, /* U+0025f2: WHITE SQUARE WITH LOWER RIGHT QUADRANT*/
- 0, /* U+0025f3: WHITE SQUARE WITH UPPER RIGHT QUADRANT*/
- 0, /* U+0025f4: WHITE CIRCLE WITH UPPER LEFT QUADRANT*/
- 0, /* U+0025f5: WHITE CIRCLE WITH LOWER LEFT QUADRANT*/
- 0, /* U+0025f6: WHITE CIRCLE WITH LOWER RIGHT QUADRANT*/
- 0, /* U+0025f7: WHITE CIRCLE WITH UPPER RIGHT QUADRANT*/
- 0, /* U+0025f8: UPPER LEFT TRIANGLE*/
- 0, /* U+0025f9: UPPER RIGHT TRIANGLE*/
- 0, /* U+0025fa: LOWER LEFT TRIANGLE*/
- 0, /* U+0025fb: WHITE MEDIUM SQUARE*/
- 0, /* U+0025fc: BLACK MEDIUM SQUARE*/
- 0, /* U+0025fd: WHITE MEDIUM SMALL SQUARE*/
- 0, /* U+0025fe: BLACK MEDIUM SMALL SQUARE*/
- 0, /* U+0025ff: LOWER RIGHT TRIANGLE*/
- 0, /* U+002600: BLACK SUN WITH RAYS*/
- 0, /* U+002601: CLOUD*/
- 0, /* U+002602: UMBRELLA*/
- 0, /* U+002603: SNOWMAN*/
- 0, /* U+002604: COMET*/
- 0, /* U+002605: BLACK STAR*/
- 0, /* U+002606: WHITE STAR*/
- 0, /* U+002607: LIGHTNING*/
- 0, /* U+002608: THUNDERSTORM*/
- 0, /* U+002609: SUN*/
- 0, /* U+00260a: ASCENDING NODE*/
- 0, /* U+00260b: DESCENDING NODE*/
- 0, /* U+00260c: CONJUNCTION*/
- 0, /* U+00260d: OPPOSITION*/
- 0, /* U+00260e: BLACK TELEPHONE*/
- 0, /* U+00260f: WHITE TELEPHONE*/
- 0, /* U+002610: BALLOT BOX*/
- 0, /* U+002611: BALLOT BOX WITH CHECK*/
- 0, /* U+002612: BALLOT BOX WITH X*/
- 0, /* U+002613: SALTIRE*/
- 0, /* U+002614: UMBRELLA WITH RAIN DROPS*/
- 0, /* U+002615: HOT BEVERAGE*/
- 0, /* U+002616: WHITE SHOGI PIECE*/
- 0, /* U+002617: BLACK SHOGI PIECE*/
- 0, /* U+002618: SHAMROCK*/
- 0, /* U+002619: REVERSED ROTATED FLORAL HEART BULLET*/
- 0, /* U+00261a: BLACK LEFT POINTING INDEX*/
- 0, /* U+00261b: BLACK RIGHT POINTING INDEX*/
- 0, /* U+00261c: WHITE LEFT POINTING INDEX*/
- 0, /* U+00261d: WHITE UP POINTING INDEX*/
- 0, /* U+00261e: WHITE RIGHT POINTING INDEX*/
- 0, /* U+00261f: WHITE DOWN POINTING INDEX*/
- 0, /* U+002620: SKULL AND CROSSBONES*/
- 0, /* U+002621: CAUTION SIGN*/
- 0, /* U+002622: RADIOACTIVE SIGN*/
- 0, /* U+002623: BIOHAZARD SIGN*/
- 0, /* U+002624: CADUCEUS*/
- 0, /* U+002625: ANKH*/
- 0, /* U+002626: ORTHODOX CROSS*/
- 0, /* U+002627: CHI RHO*/
- 0, /* U+002628: CROSS OF LORRAINE*/
- 0, /* U+002629: CROSS OF JERUSALEM*/
- 0, /* U+00262a: STAR AND CRESCENT*/
- 0, /* U+00262b: FARSI SYMBOL*/
- 0, /* U+00262c: ADI SHAKTI*/
- 0, /* U+00262d: HAMMER AND SICKLE*/
- 0, /* U+00262e: PEACE SYMBOL*/
- 0, /* U+00262f: YIN YANG*/
- 0, /* U+002630: TRIGRAM FOR HEAVEN*/
- 0, /* U+002631: TRIGRAM FOR LAKE*/
- 0, /* U+002632: TRIGRAM FOR FIRE*/
- 0, /* U+002633: TRIGRAM FOR THUNDER*/
- 0, /* U+002634: TRIGRAM FOR WIND*/
- 0, /* U+002635: TRIGRAM FOR WATER*/
- 0, /* U+002636: TRIGRAM FOR MOUNTAIN*/
- 0, /* U+002637: TRIGRAM FOR EARTH*/
- 0, /* U+002638: WHEEL OF DHARMA*/
- 0, /* U+002639: WHITE FROWNING FACE*/
- 0, /* U+00263a: WHITE SMILING FACE*/
- 0, /* U+00263b: BLACK SMILING FACE*/
- 0, /* U+00263c: WHITE SUN WITH RAYS*/
- 0, /* U+00263d: FIRST QUARTER MOON*/
- 0, /* U+00263e: LAST QUARTER MOON*/
- 0, /* U+00263f: MERCURY*/
- 0, /* U+002640: FEMALE SIGN*/
- 0, /* U+002641: EARTH*/
- 0, /* U+002642: MALE SIGN*/
- 0, /* U+002643: JUPITER*/
- 0, /* U+002644: SATURN*/
- 0, /* U+002645: URANUS*/
- 0, /* U+002646: NEPTUNE*/
- 0, /* U+002647: PLUTO*/
- 0, /* U+002648: ARIES*/
- 0, /* U+002649: TAURUS*/
- 0, /* U+00264a: GEMINI*/
- 0, /* U+00264b: CANCER*/
- 0, /* U+00264c: LEO*/
- 0, /* U+00264d: VIRGO*/
- 0, /* U+00264e: LIBRA*/
- 0, /* U+00264f: SCORPIUS*/
- 0, /* U+002650: SAGITTARIUS*/
- 0, /* U+002651: CAPRICORN*/
- 0, /* U+002652: AQUARIUS*/
- 0, /* U+002653: PISCES*/
- 0, /* U+002654: WHITE CHESS KING*/
- 0, /* U+002655: WHITE CHESS QUEEN*/
- 0, /* U+002656: WHITE CHESS ROOK*/
- 0, /* U+002657: WHITE CHESS BISHOP*/
- 0, /* U+002658: WHITE CHESS KNIGHT*/
- 0, /* U+002659: WHITE CHESS PAWN*/
- 0, /* U+00265a: BLACK CHESS KING*/
- 0, /* U+00265b: BLACK CHESS QUEEN*/
- 0, /* U+00265c: BLACK CHESS ROOK*/
- 0, /* U+00265d: BLACK CHESS BISHOP*/
- 0, /* U+00265e: BLACK CHESS KNIGHT*/
- 0, /* U+00265f: BLACK CHESS PAWN*/
- 0, /* U+002660: BLACK SPADE SUIT*/
- 0, /* U+002661: WHITE HEART SUIT*/
- 0, /* U+002662: WHITE DIAMOND SUIT*/
- 0, /* U+002663: BLACK CLUB SUIT*/
- 0, /* U+002664: WHITE SPADE SUIT*/
- 0, /* U+002665: BLACK HEART SUIT*/
- 0, /* U+002666: BLACK DIAMOND SUIT*/
- 0, /* U+002667: WHITE CLUB SUIT*/
- 0, /* U+002668: HOT SPRINGS*/
- 0, /* U+002669: QUARTER NOTE*/
- 0, /* U+00266a: EIGHTH NOTE*/
- 0, /* U+00266b: BEAMED EIGHTH NOTES*/
- 0, /* U+00266c: BEAMED SIXTEENTH NOTES*/
- 0, /* U+00266d: MUSIC FLAT SIGN*/
- 0, /* U+00266e: MUSIC NATURAL SIGN*/
- 0, /* U+00266f: MUSIC SHARP SIGN*/
- 0, /* U+002670: WEST SYRIAC CROSS*/
- 0, /* U+002671: EAST SYRIAC CROSS*/
- 0, /* U+002672: UNIVERSAL RECYCLING SYMBOL*/
- 0, /* U+002673: RECYCLING SYMBOL FOR TYPE-1 PLASTICS*/
- 0, /* U+002674: RECYCLING SYMBOL FOR TYPE-2 PLASTICS*/
- 0, /* U+002675: RECYCLING SYMBOL FOR TYPE-3 PLASTICS*/
- 0, /* U+002676: RECYCLING SYMBOL FOR TYPE-4 PLASTICS*/
- 0, /* U+002677: RECYCLING SYMBOL FOR TYPE-5 PLASTICS*/
- 0, /* U+002678: RECYCLING SYMBOL FOR TYPE-6 PLASTICS*/
- 0, /* U+002679: RECYCLING SYMBOL FOR TYPE-7 PLASTICS*/
- 0, /* U+00267a: RECYCLING SYMBOL FOR GENERIC MATERIALS*/
- 0, /* U+00267b: BLACK UNIVERSAL RECYCLING SYMBOL*/
- 0, /* U+00267c: RECYCLED PAPER SYMBOL*/
- 0, /* U+00267d: PARTIALLY-RECYCLED PAPER SYMBOL*/
- 0, /* U+00267e: PERMANENT PAPER SIGN*/
- 0, /* U+00267f: WHEELCHAIR SYMBOL*/
- 0, /* U+002680: DIE FACE-1*/
- 0, /* U+002681: DIE FACE-2*/
- 0, /* U+002682: DIE FACE-3*/
- 0, /* U+002683: DIE FACE-4*/
- 0, /* U+002684: DIE FACE-5*/
- 0, /* U+002685: DIE FACE-6*/
- 0, /* U+002686: WHITE CIRCLE WITH DOT RIGHT*/
- 0, /* U+002687: WHITE CIRCLE WITH TWO DOTS*/
- 0, /* U+002688: BLACK CIRCLE WITH WHITE DOT RIGHT*/
- 0, /* U+002689: BLACK CIRCLE WITH TWO WHITE DOTS*/
- 0, /* U+00268a: MONOGRAM FOR YANG*/
- 0, /* U+00268b: MONOGRAM FOR YIN*/
- 0, /* U+00268c: DIGRAM FOR GREATER YANG*/
- 0, /* U+00268d: DIGRAM FOR LESSER YIN*/
- 0, /* U+00268e: DIGRAM FOR LESSER YANG*/
- 0, /* U+00268f: DIGRAM FOR GREATER YIN*/
- 0, /* U+002690: WHITE FLAG*/
- 0, /* U+002691: BLACK FLAG*/
- 0, /* U+002692: HAMMER AND PICK*/
- 0, /* U+002693: ANCHOR*/
- 0, /* U+002694: CROSSED SWORDS*/
- 0, /* U+002695: STAFF OF AESCULAPIUS*/
- 0, /* U+002696: SCALES*/
- 0, /* U+002697: ALEMBIC*/
- 0, /* U+002698: FLOWER*/
- 0, /* U+002699: GEAR*/
- 0, /* U+00269a: STAFF OF HERMES*/
- 0, /* U+00269b: ATOM SYMBOL*/
- 0, /* U+00269c: FLEUR-DE-LIS*/
- 0, /* U+00269d: */
- 0, /* U+00269e: */
- 0, /* U+00269f: */
- 0, /* U+0026a0: WARNING SIGN*/
- 0, /* U+0026a1: HIGH VOLTAGE SIGN*/
- 0, /* U+0026a2: DOUBLED FEMALE SIGN*/
- 0, /* U+0026a3: DOUBLED MALE SIGN*/
- 0, /* U+0026a4: INTERLOCKED FEMALE AND MALE SIGN*/
- 0, /* U+0026a5: MALE AND FEMALE SIGN*/
- 0, /* U+0026a6: MALE WITH STROKE SIGN*/
- 0, /* U+0026a7: MALE WITH STROKE AND MALE AND FEMALE SIGN*/
- 0, /* U+0026a8: VERTICAL MALE WITH STROKE SIGN*/
- 0, /* U+0026a9: HORIZONTAL MALE WITH STROKE SIGN*/
- 0, /* U+0026aa: MEDIUM WHITE CIRCLE*/
- 0, /* U+0026ab: MEDIUM BLACK CIRCLE*/
- 0, /* U+0026ac: MEDIUM SMALL WHITE CIRCLE*/
- 0, /* U+0026ad: MARRIAGE SYMBOL*/
- 0, /* U+0026ae: DIVORCE SYMBOL*/
- 0, /* U+0026af: UNMARRIED PARTNERSHIP SYMBOL*/
- 0, /* U+0026b0: COFFIN*/
- 0, /* U+0026b1: FUNERAL URN*/
- 0, /* U+0026b2: */
- 0, /* U+0026b3: */
- 0, /* U+0026b4: */
- 0, /* U+0026b5: */
- 0, /* U+0026b6: */
- 0, /* U+0026b7: */
- 0, /* U+0026b8: */
- 0, /* U+0026b9: */
- 0, /* U+0026ba: */
- 0, /* U+0026bb: */
- 0, /* U+0026bc: */
- 0, /* U+0026bd: */
- 0, /* U+0026be: */
- 0, /* U+0026bf: */
- 0, /* U+0026c0: */
- 0, /* U+0026c1: */
- 0, /* U+0026c2: */
- 0, /* U+0026c3: */
- 0, /* U+0026c4: */
- 0, /* U+0026c5: */
- 0, /* U+0026c6: */
- 0, /* U+0026c7: */
- 0, /* U+0026c8: */
- 0, /* U+0026c9: */
- 0, /* U+0026ca: */
- 0, /* U+0026cb: */
- 0, /* U+0026cc: */
- 0, /* U+0026cd: */
- 0, /* U+0026ce: */
- 0, /* U+0026cf: */
- 0, /* U+0026d0: */
- 0, /* U+0026d1: */
- 0, /* U+0026d2: */
- 0, /* U+0026d3: */
- 0, /* U+0026d4: */
- 0, /* U+0026d5: */
- 0, /* U+0026d6: */
- 0, /* U+0026d7: */
- 0, /* U+0026d8: */
- 0, /* U+0026d9: */
- 0, /* U+0026da: */
- 0, /* U+0026db: */
- 0, /* U+0026dc: */
- 0, /* U+0026dd: */
- 0, /* U+0026de: */
- 0, /* U+0026df: */
- 0, /* U+0026e0: */
- 0, /* U+0026e1: */
- 0, /* U+0026e2: */
- 0, /* U+0026e3: */
- 0, /* U+0026e4: */
- 0, /* U+0026e5: */
- 0, /* U+0026e6: */
- 0, /* U+0026e7: */
- 0, /* U+0026e8: */
- 0, /* U+0026e9: */
- 0, /* U+0026ea: */
- 0, /* U+0026eb: */
- 0, /* U+0026ec: */
- 0, /* U+0026ed: */
- 0, /* U+0026ee: */
- 0, /* U+0026ef: */
- 0, /* U+0026f0: */
- 0, /* U+0026f1: */
- 0, /* U+0026f2: */
- 0, /* U+0026f3: */
- 0, /* U+0026f4: */
- 0, /* U+0026f5: */
- 0, /* U+0026f6: */
- 0, /* U+0026f7: */
- 0, /* U+0026f8: */
- 0, /* U+0026f9: */
- 0, /* U+0026fa: */
- 0, /* U+0026fb: */
- 0, /* U+0026fc: */
- 0, /* U+0026fd: */
- 0, /* U+0026fe: */
- 0, /* U+0026ff: */
- 0, /* U+002700: */
- 0, /* U+002701: UPPER BLADE SCISSORS*/
- 0, /* U+002702: BLACK SCISSORS*/
- 0, /* U+002703: LOWER BLADE SCISSORS*/
- 0, /* U+002704: WHITE SCISSORS*/
- 0, /* U+002705: */
- 0, /* U+002706: TELEPHONE LOCATION SIGN*/
- 0, /* U+002707: TAPE DRIVE*/
- 0, /* U+002708: AIRPLANE*/
- 0, /* U+002709: ENVELOPE*/
- 0, /* U+00270a: */
- 0, /* U+00270b: */
- 0, /* U+00270c: VICTORY HAND*/
- 0, /* U+00270d: WRITING HAND*/
- 0, /* U+00270e: LOWER RIGHT PENCIL*/
- 0, /* U+00270f: PENCIL*/
- 0, /* U+002710: UPPER RIGHT PENCIL*/
- 0, /* U+002711: WHITE NIB*/
- 0, /* U+002712: BLACK NIB*/
- 0, /* U+002713: CHECK MARK*/
- 0, /* U+002714: HEAVY CHECK MARK*/
- 0, /* U+002715: MULTIPLICATION X*/
- 0, /* U+002716: HEAVY MULTIPLICATION X*/
- 0, /* U+002717: BALLOT X*/
- 0, /* U+002718: HEAVY BALLOT X*/
- 0, /* U+002719: OUTLINED GREEK CROSS*/
- 0, /* U+00271a: HEAVY GREEK CROSS*/
- 0, /* U+00271b: OPEN CENTRE CROSS*/
- 0, /* U+00271c: HEAVY OPEN CENTRE CROSS*/
- 0, /* U+00271d: LATIN CROSS*/
- 0, /* U+00271e: SHADOWED WHITE LATIN CROSS*/
- 0, /* U+00271f: OUTLINED LATIN CROSS*/
- 0, /* U+002720: MALTESE CROSS*/
- 0, /* U+002721: STAR OF DAVID*/
- 0, /* U+002722: FOUR TEARDROP-SPOKED ASTERISK*/
- 0, /* U+002723: FOUR BALLOON-SPOKED ASTERISK*/
- 0, /* U+002724: HEAVY FOUR BALLOON-SPOKED ASTERISK*/
- 0, /* U+002725: FOUR CLUB-SPOKED ASTERISK*/
- 0, /* U+002726: BLACK FOUR POINTED STAR*/
- 0, /* U+002727: WHITE FOUR POINTED STAR*/
- 0, /* U+002728: */
- 0, /* U+002729: STRESS OUTLINED WHITE STAR*/
- 0, /* U+00272a: CIRCLED WHITE STAR*/
- 0, /* U+00272b: OPEN CENTRE BLACK STAR*/
- 0, /* U+00272c: BLACK CENTRE WHITE STAR*/
- 0, /* U+00272d: OUTLINED BLACK STAR*/
- 0, /* U+00272e: HEAVY OUTLINED BLACK STAR*/
- 0, /* U+00272f: PINWHEEL STAR*/
- 0, /* U+002730: SHADOWED WHITE STAR*/
- 0, /* U+002731: HEAVY ASTERISK*/
- 0, /* U+002732: OPEN CENTRE ASTERISK*/
- 0, /* U+002733: EIGHT SPOKED ASTERISK*/
- 0, /* U+002734: EIGHT POINTED BLACK STAR*/
- 0, /* U+002735: EIGHT POINTED PINWHEEL STAR*/
- 0, /* U+002736: SIX POINTED BLACK STAR*/
- 0, /* U+002737: EIGHT POINTED RECTILINEAR BLACK STAR*/
- 0, /* U+002738: HEAVY EIGHT POINTED RECTILINEAR BLACK STAR*/
- 0, /* U+002739: TWELVE POINTED BLACK STAR*/
- 0, /* U+00273a: SIXTEEN POINTED ASTERISK*/
- 0, /* U+00273b: TEARDROP-SPOKED ASTERISK*/
- 0, /* U+00273c: OPEN CENTRE TEARDROP-SPOKED ASTERISK*/
- 0, /* U+00273d: HEAVY TEARDROP-SPOKED ASTERISK*/
- 0, /* U+00273e: SIX PETALLED BLACK AND WHITE FLORETTE*/
- 0, /* U+00273f: BLACK FLORETTE*/
- 0, /* U+002740: WHITE FLORETTE*/
- 0, /* U+002741: EIGHT PETALLED OUTLINED BLACK FLORETTE*/
- 0, /* U+002742: CIRCLED OPEN CENTRE EIGHT POINTED STAR*/
- 0, /* U+002743: HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK*/
- 0, /* U+002744: SNOWFLAKE*/
- 0, /* U+002745: TIGHT TRIFOLIATE SNOWFLAKE*/
- 0, /* U+002746: HEAVY CHEVRON SNOWFLAKE*/
- 0, /* U+002747: SPARKLE*/
- 0, /* U+002748: HEAVY SPARKLE*/
- 0, /* U+002749: BALLOON-SPOKED ASTERISK*/
- 0, /* U+00274a: EIGHT TEARDROP-SPOKED PROPELLER ASTERISK*/
- 0, /* U+00274b: HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK*/
- 0, /* U+00274c: */
- 0, /* U+00274d: SHADOWED WHITE CIRCLE*/
- 0, /* U+00274e: */
- 0, /* U+00274f: LOWER RIGHT DROP-SHADOWED WHITE SQUARE*/
- 0, /* U+002750: UPPER RIGHT DROP-SHADOWED WHITE SQUARE*/
- 0, /* U+002751: LOWER RIGHT SHADOWED WHITE SQUARE*/
- 0, /* U+002752: UPPER RIGHT SHADOWED WHITE SQUARE*/
- 0, /* U+002753: */
- 0, /* U+002754: */
- 0, /* U+002755: */
- 0, /* U+002756: BLACK DIAMOND MINUS WHITE X*/
- 0, /* U+002757: */
- 0, /* U+002758: LIGHT VERTICAL BAR*/
- 0, /* U+002759: MEDIUM VERTICAL BAR*/
- 0, /* U+00275a: HEAVY VERTICAL BAR*/
- 0, /* U+00275b: HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT*/
- 0, /* U+00275c: HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT*/
- 0, /* U+00275d: HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT*/
- 0, /* U+00275e: HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT*/
- 0, /* U+00275f: */
- 0, /* U+002760: */
- 0, /* U+002761: CURVED STEM PARAGRAPH SIGN ORNAMENT*/
- 0, /* U+002762: HEAVY EXCLAMATION MARK ORNAMENT*/
- 0, /* U+002763: HEAVY HEART EXCLAMATION MARK ORNAMENT*/
- 0, /* U+002764: HEAVY BLACK HEART*/
- 0, /* U+002765: ROTATED HEAVY BLACK HEART BULLET*/
- 0, /* U+002766: FLORAL HEART*/
- 0, /* U+002767: ROTATED FLORAL HEART BULLET*/
- 0, /* U+002768: MEDIUM LEFT PARENTHESIS ORNAMENT*/
- 0, /* U+002769: MEDIUM RIGHT PARENTHESIS ORNAMENT*/
- 0, /* U+00276a: MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT*/
- 0, /* U+00276b: MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT*/
- 0, /* U+00276c: MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT*/
- 0, /* U+00276d: MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT*/
- 0, /* U+00276e: HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT*/
- 0, /* U+00276f: HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT*/
- 0, /* U+002770: HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT*/
- 0, /* U+002771: HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT*/
- 0, /* U+002772: LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT*/
- 0, /* U+002773: LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT*/
- 0, /* U+002774: MEDIUM LEFT CURLY BRACKET ORNAMENT*/
- 0, /* U+002775: MEDIUM RIGHT CURLY BRACKET ORNAMENT*/
- 0, /* U+002776: DINGBAT NEGATIVE CIRCLED DIGIT ONE*/
- 0, /* U+002777: DINGBAT NEGATIVE CIRCLED DIGIT TWO*/
- 0, /* U+002778: DINGBAT NEGATIVE CIRCLED DIGIT THREE*/
- 0, /* U+002779: DINGBAT NEGATIVE CIRCLED DIGIT FOUR*/
- 0, /* U+00277a: DINGBAT NEGATIVE CIRCLED DIGIT FIVE*/
- 0, /* U+00277b: DINGBAT NEGATIVE CIRCLED DIGIT SIX*/
- 0, /* U+00277c: DINGBAT NEGATIVE CIRCLED DIGIT SEVEN*/
- 0, /* U+00277d: DINGBAT NEGATIVE CIRCLED DIGIT EIGHT*/
- 0, /* U+00277e: DINGBAT NEGATIVE CIRCLED DIGIT NINE*/
- 0, /* U+00277f: DINGBAT NEGATIVE CIRCLED NUMBER TEN*/
- 0, /* U+002780: DINGBAT CIRCLED SANS-SERIF DIGIT ONE*/
- 0, /* U+002781: DINGBAT CIRCLED SANS-SERIF DIGIT TWO*/
- 0, /* U+002782: DINGBAT CIRCLED SANS-SERIF DIGIT THREE*/
- 0, /* U+002783: DINGBAT CIRCLED SANS-SERIF DIGIT FOUR*/
- 0, /* U+002784: DINGBAT CIRCLED SANS-SERIF DIGIT FIVE*/
- 0, /* U+002785: DINGBAT CIRCLED SANS-SERIF DIGIT SIX*/
- 0, /* U+002786: DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN*/
- 0, /* U+002787: DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT*/
- 0, /* U+002788: DINGBAT CIRCLED SANS-SERIF DIGIT NINE*/
- 0, /* U+002789: DINGBAT CIRCLED SANS-SERIF NUMBER TEN*/
- 0, /* U+00278a: DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE*/
- 0, /* U+00278b: DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO*/
- 0, /* U+00278c: DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE*/
- 0, /* U+00278d: DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR*/
- 0, /* U+00278e: DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE*/
- 0, /* U+00278f: DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX*/
- 0, /* U+002790: DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN*/
- 0, /* U+002791: DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT*/
- 0, /* U+002792: DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE*/
- 0, /* U+002793: DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN*/
- 0, /* U+002794: HEAVY WIDE-HEADED RIGHTWARDS ARROW*/
- 0, /* U+002795: */
- 0, /* U+002796: */
- 0, /* U+002797: */
- 0, /* U+002798: HEAVY SOUTH EAST ARROW*/
- 0, /* U+002799: HEAVY RIGHTWARDS ARROW*/
- 0, /* U+00279a: HEAVY NORTH EAST ARROW*/
- 0, /* U+00279b: DRAFTING POINT RIGHTWARDS ARROW*/
- 0, /* U+00279c: HEAVY ROUND-TIPPED RIGHTWARDS ARROW*/
- 0, /* U+00279d: TRIANGLE-HEADED RIGHTWARDS ARROW*/
- 0, /* U+00279e: HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW*/
- 0, /* U+00279f: DASHED TRIANGLE-HEADED RIGHTWARDS ARROW*/
- 0, /* U+0027a0: HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW*/
- 0, /* U+0027a1: BLACK RIGHTWARDS ARROW*/
- 0, /* U+0027a2: THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD*/
- 0, /* U+0027a3: THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD*/
- 0, /* U+0027a4: BLACK RIGHTWARDS ARROWHEAD*/
- 0, /* U+0027a5: HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW*/
- 0, /* U+0027a6: HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW*/
- 0, /* U+0027a7: SQUAT BLACK RIGHTWARDS ARROW*/
- 0, /* U+0027a8: HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW*/
- 0, /* U+0027a9: RIGHT-SHADED WHITE RIGHTWARDS ARROW*/
- 0, /* U+0027aa: LEFT-SHADED WHITE RIGHTWARDS ARROW*/
- 0, /* U+0027ab: BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW*/
- 0, /* U+0027ac: FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW*/
- 0, /* U+0027ad: HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW*/
- 0, /* U+0027ae: HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW*/
- 0, /* U+0027af: NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW*/
- 0, /* U+0027b0: */
- 0, /* U+0027b1: NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW*/
- 0, /* U+0027b2: CIRCLED HEAVY WHITE RIGHTWARDS ARROW*/
- 0, /* U+0027b3: WHITE-FEATHERED RIGHTWARDS ARROW*/
- 0, /* U+0027b4: BLACK-FEATHERED SOUTH EAST ARROW*/
- 0, /* U+0027b5: BLACK-FEATHERED RIGHTWARDS ARROW*/
- 0, /* U+0027b6: BLACK-FEATHERED NORTH EAST ARROW*/
- 0, /* U+0027b7: HEAVY BLACK-FEATHERED SOUTH EAST ARROW*/
- 0, /* U+0027b8: HEAVY BLACK-FEATHERED RIGHTWARDS ARROW*/
- 0, /* U+0027b9: HEAVY BLACK-FEATHERED NORTH EAST ARROW*/
- 0, /* U+0027ba: TEARDROP-BARBED RIGHTWARDS ARROW*/
- 0, /* U+0027bb: HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW*/
- 0, /* U+0027bc: WEDGE-TAILED RIGHTWARDS ARROW*/
- 0, /* U+0027bd: HEAVY WEDGE-TAILED RIGHTWARDS ARROW*/
- 0, /* U+0027be: OPEN-OUTLINED RIGHTWARDS ARROW*/
- 0, /* U+0027bf: */
- 0, /* U+0027c0: THREE DIMENSIONAL ANGLE*/
- 0, /* U+0027c1: WHITE TRIANGLE CONTAINING SMALL WHITE TRIANGLE*/
- 0, /* U+0027c2: PERPENDICULAR*/
- 0, /* U+0027c3: OPEN SUBSET*/
- 0, /* U+0027c4: OPEN SUPERSET*/
- 0, /* U+0027c5: LEFT S-SHAPED BAG DELIMITER*/
- 0, /* U+0027c6: RIGHT S-SHAPED BAG DELIMITER*/
- 0, /* U+0027c7: */
- 0, /* U+0027c8: */
- 0, /* U+0027c9: */
- 0, /* U+0027ca: */
- 0, /* U+0027cb: */
- 0, /* U+0027cc: */
- 0, /* U+0027cd: */
- 0, /* U+0027ce: */
- 0, /* U+0027cf: */
- 0, /* U+0027d0: WHITE DIAMOND WITH CENTRED DOT*/
- 0, /* U+0027d1: AND WITH DOT*/
- 0, /* U+0027d2: ELEMENT OF OPENING UPWARDS*/
- 0, /* U+0027d3: LOWER RIGHT CORNER WITH DOT*/
- 0, /* U+0027d4: UPPER LEFT CORNER WITH DOT*/
- 0, /* U+0027d5: LEFT OUTER JOIN*/
- 0, /* U+0027d6: RIGHT OUTER JOIN*/
- 0, /* U+0027d7: FULL OUTER JOIN*/
- 0, /* U+0027d8: LARGE UP TACK*/
- 0, /* U+0027d9: LARGE DOWN TACK*/
- 0, /* U+0027da: LEFT AND RIGHT DOUBLE TURNSTILE*/
- 0, /* U+0027db: LEFT AND RIGHT TACK*/
- 0, /* U+0027dc: LEFT MULTIMAP*/
- 0, /* U+0027dd: LONG RIGHT TACK*/
- 0, /* U+0027de: LONG LEFT TACK*/
- 0, /* U+0027df: UP TACK WITH CIRCLE ABOVE*/
- 0, /* U+0027e0: LOZENGE DIVIDED BY HORIZONTAL RULE*/
- 0, /* U+0027e1: WHITE CONCAVE-SIDED DIAMOND*/
- 0, /* U+0027e2: WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK*/
- 0, /* U+0027e3: WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK*/
- 0, /* U+0027e4: WHITE SQUARE WITH LEFTWARDS TICK*/
- 0, /* U+0027e5: WHITE SQUARE WITH RIGHTWARDS TICK*/
- 0, /* U+0027e6: MATHEMATICAL LEFT WHITE SQUARE BRACKET*/
- 0, /* U+0027e7: MATHEMATICAL RIGHT WHITE SQUARE BRACKET*/
- 0, /* U+0027e8: MATHEMATICAL LEFT ANGLE BRACKET*/
- 0, /* U+0027e9: MATHEMATICAL RIGHT ANGLE BRACKET*/
- 0, /* U+0027ea: MATHEMATICAL LEFT DOUBLE ANGLE BRACKET*/
- 0, /* U+0027eb: MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET*/
- 0, /* U+0027ec: */
- 0, /* U+0027ed: */
- 0, /* U+0027ee: */
- 0, /* U+0027ef: */
- 0, /* U+0027f0: UPWARDS QUADRUPLE ARROW*/
- 0, /* U+0027f1: DOWNWARDS QUADRUPLE ARROW*/
- 0, /* U+0027f2: ANTICLOCKWISE GAPPED CIRCLE ARROW*/
- 0, /* U+0027f3: CLOCKWISE GAPPED CIRCLE ARROW*/
- 0, /* U+0027f4: RIGHT ARROW WITH CIRCLED PLUS*/
- 0, /* U+0027f5: LONG LEFTWARDS ARROW*/
- 0, /* U+0027f6: LONG RIGHTWARDS ARROW*/
- 0, /* U+0027f7: LONG LEFT RIGHT ARROW*/
- 0, /* U+0027f8: LONG LEFTWARDS DOUBLE ARROW*/
- 0, /* U+0027f9: LONG RIGHTWARDS DOUBLE ARROW*/
- 0, /* U+0027fa: LONG LEFT RIGHT DOUBLE ARROW*/
- 0, /* U+0027fb: LONG LEFTWARDS ARROW FROM BAR*/
- 0, /* U+0027fc: LONG RIGHTWARDS ARROW FROM BAR*/
- 0, /* U+0027fd: LONG LEFTWARDS DOUBLE ARROW FROM BAR*/
- 0, /* U+0027fe: LONG RIGHTWARDS DOUBLE ARROW FROM BAR*/
- 0, /* U+0027ff: LONG RIGHTWARDS SQUIGGLE ARROW*/
- 0, /* U+002800: BRAILLE PATTERN BLANK*/
- 0, /* U+002801: BRAILLE PATTERN DOTS-1*/
- 0, /* U+002802: BRAILLE PATTERN DOTS-2*/
- 0, /* U+002803: BRAILLE PATTERN DOTS-12*/
- 0, /* U+002804: BRAILLE PATTERN DOTS-3*/
- 0, /* U+002805: BRAILLE PATTERN DOTS-13*/
- 0, /* U+002806: BRAILLE PATTERN DOTS-23*/
- 0, /* U+002807: BRAILLE PATTERN DOTS-123*/
- 0, /* U+002808: BRAILLE PATTERN DOTS-4*/
- 0, /* U+002809: BRAILLE PATTERN DOTS-14*/
- 0, /* U+00280a: BRAILLE PATTERN DOTS-24*/
- 0, /* U+00280b: BRAILLE PATTERN DOTS-124*/
- 0, /* U+00280c: BRAILLE PATTERN DOTS-34*/
- 0, /* U+00280d: BRAILLE PATTERN DOTS-134*/
- 0, /* U+00280e: BRAILLE PATTERN DOTS-234*/
- 0, /* U+00280f: BRAILLE PATTERN DOTS-1234*/
- 0, /* U+002810: BRAILLE PATTERN DOTS-5*/
- 0, /* U+002811: BRAILLE PATTERN DOTS-15*/
- 0, /* U+002812: BRAILLE PATTERN DOTS-25*/
- 0, /* U+002813: BRAILLE PATTERN DOTS-125*/
- 0, /* U+002814: BRAILLE PATTERN DOTS-35*/
- 0, /* U+002815: BRAILLE PATTERN DOTS-135*/
- 0, /* U+002816: BRAILLE PATTERN DOTS-235*/
- 0, /* U+002817: BRAILLE PATTERN DOTS-1235*/
- 0, /* U+002818: BRAILLE PATTERN DOTS-45*/
- 0, /* U+002819: BRAILLE PATTERN DOTS-145*/
- 0, /* U+00281a: BRAILLE PATTERN DOTS-245*/
- 0, /* U+00281b: BRAILLE PATTERN DOTS-1245*/
- 0, /* U+00281c: BRAILLE PATTERN DOTS-345*/
- 0, /* U+00281d: BRAILLE PATTERN DOTS-1345*/
- 0, /* U+00281e: BRAILLE PATTERN DOTS-2345*/
- 0, /* U+00281f: BRAILLE PATTERN DOTS-12345*/
- 0, /* U+002820: BRAILLE PATTERN DOTS-6*/
- 0, /* U+002821: BRAILLE PATTERN DOTS-16*/
- 0, /* U+002822: BRAILLE PATTERN DOTS-26*/
- 0, /* U+002823: BRAILLE PATTERN DOTS-126*/
- 0, /* U+002824: BRAILLE PATTERN DOTS-36*/
- 0, /* U+002825: BRAILLE PATTERN DOTS-136*/
- 0, /* U+002826: BRAILLE PATTERN DOTS-236*/
- 0, /* U+002827: BRAILLE PATTERN DOTS-1236*/
- 0, /* U+002828: BRAILLE PATTERN DOTS-46*/
- 0, /* U+002829: BRAILLE PATTERN DOTS-146*/
- 0, /* U+00282a: BRAILLE PATTERN DOTS-246*/
- 0, /* U+00282b: BRAILLE PATTERN DOTS-1246*/
- 0, /* U+00282c: BRAILLE PATTERN DOTS-346*/
- 0, /* U+00282d: BRAILLE PATTERN DOTS-1346*/
- 0, /* U+00282e: BRAILLE PATTERN DOTS-2346*/
- 0, /* U+00282f: BRAILLE PATTERN DOTS-12346*/
- 0, /* U+002830: BRAILLE PATTERN DOTS-56*/
- 0, /* U+002831: BRAILLE PATTERN DOTS-156*/
- 0, /* U+002832: BRAILLE PATTERN DOTS-256*/
- 0, /* U+002833: BRAILLE PATTERN DOTS-1256*/
- 0, /* U+002834: BRAILLE PATTERN DOTS-356*/
- 0, /* U+002835: BRAILLE PATTERN DOTS-1356*/
- 0, /* U+002836: BRAILLE PATTERN DOTS-2356*/
- 0, /* U+002837: BRAILLE PATTERN DOTS-12356*/
- 0, /* U+002838: BRAILLE PATTERN DOTS-456*/
- 0, /* U+002839: BRAILLE PATTERN DOTS-1456*/
- 0, /* U+00283a: BRAILLE PATTERN DOTS-2456*/
- 0, /* U+00283b: BRAILLE PATTERN DOTS-12456*/
- 0, /* U+00283c: BRAILLE PATTERN DOTS-3456*/
- 0, /* U+00283d: BRAILLE PATTERN DOTS-13456*/
- 0, /* U+00283e: BRAILLE PATTERN DOTS-23456*/
- 0, /* U+00283f: BRAILLE PATTERN DOTS-123456*/
- 0, /* U+002840: BRAILLE PATTERN DOTS-7*/
- 0, /* U+002841: BRAILLE PATTERN DOTS-17*/
- 0, /* U+002842: BRAILLE PATTERN DOTS-27*/
- 0, /* U+002843: BRAILLE PATTERN DOTS-127*/
- 0, /* U+002844: BRAILLE PATTERN DOTS-37*/
- 0, /* U+002845: BRAILLE PATTERN DOTS-137*/
- 0, /* U+002846: BRAILLE PATTERN DOTS-237*/
- 0, /* U+002847: BRAILLE PATTERN DOTS-1237*/
- 0, /* U+002848: BRAILLE PATTERN DOTS-47*/
- 0, /* U+002849: BRAILLE PATTERN DOTS-147*/
- 0, /* U+00284a: BRAILLE PATTERN DOTS-247*/
- 0, /* U+00284b: BRAILLE PATTERN DOTS-1247*/
- 0, /* U+00284c: BRAILLE PATTERN DOTS-347*/
- 0, /* U+00284d: BRAILLE PATTERN DOTS-1347*/
- 0, /* U+00284e: BRAILLE PATTERN DOTS-2347*/
- 0, /* U+00284f: BRAILLE PATTERN DOTS-12347*/
- 0, /* U+002850: BRAILLE PATTERN DOTS-57*/
- 0, /* U+002851: BRAILLE PATTERN DOTS-157*/
- 0, /* U+002852: BRAILLE PATTERN DOTS-257*/
- 0, /* U+002853: BRAILLE PATTERN DOTS-1257*/
- 0, /* U+002854: BRAILLE PATTERN DOTS-357*/
- 0, /* U+002855: BRAILLE PATTERN DOTS-1357*/
- 0, /* U+002856: BRAILLE PATTERN DOTS-2357*/
- 0, /* U+002857: BRAILLE PATTERN DOTS-12357*/
- 0, /* U+002858: BRAILLE PATTERN DOTS-457*/
- 0, /* U+002859: BRAILLE PATTERN DOTS-1457*/
- 0, /* U+00285a: BRAILLE PATTERN DOTS-2457*/
- 0, /* U+00285b: BRAILLE PATTERN DOTS-12457*/
- 0, /* U+00285c: BRAILLE PATTERN DOTS-3457*/
- 0, /* U+00285d: BRAILLE PATTERN DOTS-13457*/
- 0, /* U+00285e: BRAILLE PATTERN DOTS-23457*/
- 0, /* U+00285f: BRAILLE PATTERN DOTS-123457*/
- 0, /* U+002860: BRAILLE PATTERN DOTS-67*/
- 0, /* U+002861: BRAILLE PATTERN DOTS-167*/
- 0, /* U+002862: BRAILLE PATTERN DOTS-267*/
- 0, /* U+002863: BRAILLE PATTERN DOTS-1267*/
- 0, /* U+002864: BRAILLE PATTERN DOTS-367*/
- 0, /* U+002865: BRAILLE PATTERN DOTS-1367*/
- 0, /* U+002866: BRAILLE PATTERN DOTS-2367*/
- 0, /* U+002867: BRAILLE PATTERN DOTS-12367*/
- 0, /* U+002868: BRAILLE PATTERN DOTS-467*/
- 0, /* U+002869: BRAILLE PATTERN DOTS-1467*/
- 0, /* U+00286a: BRAILLE PATTERN DOTS-2467*/
- 0, /* U+00286b: BRAILLE PATTERN DOTS-12467*/
- 0, /* U+00286c: BRAILLE PATTERN DOTS-3467*/
- 0, /* U+00286d: BRAILLE PATTERN DOTS-13467*/
- 0, /* U+00286e: BRAILLE PATTERN DOTS-23467*/
- 0, /* U+00286f: BRAILLE PATTERN DOTS-123467*/
- 0, /* U+002870: BRAILLE PATTERN DOTS-567*/
- 0, /* U+002871: BRAILLE PATTERN DOTS-1567*/
- 0, /* U+002872: BRAILLE PATTERN DOTS-2567*/
- 0, /* U+002873: BRAILLE PATTERN DOTS-12567*/
- 0, /* U+002874: BRAILLE PATTERN DOTS-3567*/
- 0, /* U+002875: BRAILLE PATTERN DOTS-13567*/
- 0, /* U+002876: BRAILLE PATTERN DOTS-23567*/
- 0, /* U+002877: BRAILLE PATTERN DOTS-123567*/
- 0, /* U+002878: BRAILLE PATTERN DOTS-4567*/
- 0, /* U+002879: BRAILLE PATTERN DOTS-14567*/
- 0, /* U+00287a: BRAILLE PATTERN DOTS-24567*/
- 0, /* U+00287b: BRAILLE PATTERN DOTS-124567*/
- 0, /* U+00287c: BRAILLE PATTERN DOTS-34567*/
- 0, /* U+00287d: BRAILLE PATTERN DOTS-134567*/
- 0, /* U+00287e: BRAILLE PATTERN DOTS-234567*/
- 0, /* U+00287f: BRAILLE PATTERN DOTS-1234567*/
- 0, /* U+002880: BRAILLE PATTERN DOTS-8*/
- 0, /* U+002881: BRAILLE PATTERN DOTS-18*/
- 0, /* U+002882: BRAILLE PATTERN DOTS-28*/
- 0, /* U+002883: BRAILLE PATTERN DOTS-128*/
- 0, /* U+002884: BRAILLE PATTERN DOTS-38*/
- 0, /* U+002885: BRAILLE PATTERN DOTS-138*/
- 0, /* U+002886: BRAILLE PATTERN DOTS-238*/
- 0, /* U+002887: BRAILLE PATTERN DOTS-1238*/
- 0, /* U+002888: BRAILLE PATTERN DOTS-48*/
- 0, /* U+002889: BRAILLE PATTERN DOTS-148*/
- 0, /* U+00288a: BRAILLE PATTERN DOTS-248*/
- 0, /* U+00288b: BRAILLE PATTERN DOTS-1248*/
- 0, /* U+00288c: BRAILLE PATTERN DOTS-348*/
- 0, /* U+00288d: BRAILLE PATTERN DOTS-1348*/
- 0, /* U+00288e: BRAILLE PATTERN DOTS-2348*/
- 0, /* U+00288f: BRAILLE PATTERN DOTS-12348*/
- 0, /* U+002890: BRAILLE PATTERN DOTS-58*/
- 0, /* U+002891: BRAILLE PATTERN DOTS-158*/
- 0, /* U+002892: BRAILLE PATTERN DOTS-258*/
- 0, /* U+002893: BRAILLE PATTERN DOTS-1258*/
- 0, /* U+002894: BRAILLE PATTERN DOTS-358*/
- 0, /* U+002895: BRAILLE PATTERN DOTS-1358*/
- 0, /* U+002896: BRAILLE PATTERN DOTS-2358*/
- 0, /* U+002897: BRAILLE PATTERN DOTS-12358*/
- 0, /* U+002898: BRAILLE PATTERN DOTS-458*/
- 0, /* U+002899: BRAILLE PATTERN DOTS-1458*/
- 0, /* U+00289a: BRAILLE PATTERN DOTS-2458*/
- 0, /* U+00289b: BRAILLE PATTERN DOTS-12458*/
- 0, /* U+00289c: BRAILLE PATTERN DOTS-3458*/
- 0, /* U+00289d: BRAILLE PATTERN DOTS-13458*/
- 0, /* U+00289e: BRAILLE PATTERN DOTS-23458*/
- 0, /* U+00289f: BRAILLE PATTERN DOTS-123458*/
- 0, /* U+0028a0: BRAILLE PATTERN DOTS-68*/
- 0, /* U+0028a1: BRAILLE PATTERN DOTS-168*/
- 0, /* U+0028a2: BRAILLE PATTERN DOTS-268*/
- 0, /* U+0028a3: BRAILLE PATTERN DOTS-1268*/
- 0, /* U+0028a4: BRAILLE PATTERN DOTS-368*/
- 0, /* U+0028a5: BRAILLE PATTERN DOTS-1368*/
- 0, /* U+0028a6: BRAILLE PATTERN DOTS-2368*/
- 0, /* U+0028a7: BRAILLE PATTERN DOTS-12368*/
- 0, /* U+0028a8: BRAILLE PATTERN DOTS-468*/
- 0, /* U+0028a9: BRAILLE PATTERN DOTS-1468*/
- 0, /* U+0028aa: BRAILLE PATTERN DOTS-2468*/
- 0, /* U+0028ab: BRAILLE PATTERN DOTS-12468*/
- 0, /* U+0028ac: BRAILLE PATTERN DOTS-3468*/
- 0, /* U+0028ad: BRAILLE PATTERN DOTS-13468*/
- 0, /* U+0028ae: BRAILLE PATTERN DOTS-23468*/
- 0, /* U+0028af: BRAILLE PATTERN DOTS-123468*/
- 0, /* U+0028b0: BRAILLE PATTERN DOTS-568*/
- 0, /* U+0028b1: BRAILLE PATTERN DOTS-1568*/
- 0, /* U+0028b2: BRAILLE PATTERN DOTS-2568*/
- 0, /* U+0028b3: BRAILLE PATTERN DOTS-12568*/
- 0, /* U+0028b4: BRAILLE PATTERN DOTS-3568*/
- 0, /* U+0028b5: BRAILLE PATTERN DOTS-13568*/
- 0, /* U+0028b6: BRAILLE PATTERN DOTS-23568*/
- 0, /* U+0028b7: BRAILLE PATTERN DOTS-123568*/
- 0, /* U+0028b8: BRAILLE PATTERN DOTS-4568*/
- 0, /* U+0028b9: BRAILLE PATTERN DOTS-14568*/
- 0, /* U+0028ba: BRAILLE PATTERN DOTS-24568*/
- 0, /* U+0028bb: BRAILLE PATTERN DOTS-124568*/
- 0, /* U+0028bc: BRAILLE PATTERN DOTS-34568*/
- 0, /* U+0028bd: BRAILLE PATTERN DOTS-134568*/
- 0, /* U+0028be: BRAILLE PATTERN DOTS-234568*/
- 0, /* U+0028bf: BRAILLE PATTERN DOTS-1234568*/
- 0, /* U+0028c0: BRAILLE PATTERN DOTS-78*/
- 0, /* U+0028c1: BRAILLE PATTERN DOTS-178*/
- 0, /* U+0028c2: BRAILLE PATTERN DOTS-278*/
- 0, /* U+0028c3: BRAILLE PATTERN DOTS-1278*/
- 0, /* U+0028c4: BRAILLE PATTERN DOTS-378*/
- 0, /* U+0028c5: BRAILLE PATTERN DOTS-1378*/
- 0, /* U+0028c6: BRAILLE PATTERN DOTS-2378*/
- 0, /* U+0028c7: BRAILLE PATTERN DOTS-12378*/
- 0, /* U+0028c8: BRAILLE PATTERN DOTS-478*/
- 0, /* U+0028c9: BRAILLE PATTERN DOTS-1478*/
- 0, /* U+0028ca: BRAILLE PATTERN DOTS-2478*/
- 0, /* U+0028cb: BRAILLE PATTERN DOTS-12478*/
- 0, /* U+0028cc: BRAILLE PATTERN DOTS-3478*/
- 0, /* U+0028cd: BRAILLE PATTERN DOTS-13478*/
- 0, /* U+0028ce: BRAILLE PATTERN DOTS-23478*/
- 0, /* U+0028cf: BRAILLE PATTERN DOTS-123478*/
- 0, /* U+0028d0: BRAILLE PATTERN DOTS-578*/
- 0, /* U+0028d1: BRAILLE PATTERN DOTS-1578*/
- 0, /* U+0028d2: BRAILLE PATTERN DOTS-2578*/
- 0, /* U+0028d3: BRAILLE PATTERN DOTS-12578*/
- 0, /* U+0028d4: BRAILLE PATTERN DOTS-3578*/
- 0, /* U+0028d5: BRAILLE PATTERN DOTS-13578*/
- 0, /* U+0028d6: BRAILLE PATTERN DOTS-23578*/
- 0, /* U+0028d7: BRAILLE PATTERN DOTS-123578*/
- 0, /* U+0028d8: BRAILLE PATTERN DOTS-4578*/
- 0, /* U+0028d9: BRAILLE PATTERN DOTS-14578*/
- 0, /* U+0028da: BRAILLE PATTERN DOTS-24578*/
- 0, /* U+0028db: BRAILLE PATTERN DOTS-124578*/
- 0, /* U+0028dc: BRAILLE PATTERN DOTS-34578*/
- 0, /* U+0028dd: BRAILLE PATTERN DOTS-134578*/
- 0, /* U+0028de: BRAILLE PATTERN DOTS-234578*/
- 0, /* U+0028df: BRAILLE PATTERN DOTS-1234578*/
- 0, /* U+0028e0: BRAILLE PATTERN DOTS-678*/
- 0, /* U+0028e1: BRAILLE PATTERN DOTS-1678*/
- 0, /* U+0028e2: BRAILLE PATTERN DOTS-2678*/
- 0, /* U+0028e3: BRAILLE PATTERN DOTS-12678*/
- 0, /* U+0028e4: BRAILLE PATTERN DOTS-3678*/
- 0, /* U+0028e5: BRAILLE PATTERN DOTS-13678*/
- 0, /* U+0028e6: BRAILLE PATTERN DOTS-23678*/
- 0, /* U+0028e7: BRAILLE PATTERN DOTS-123678*/
- 0, /* U+0028e8: BRAILLE PATTERN DOTS-4678*/
- 0, /* U+0028e9: BRAILLE PATTERN DOTS-14678*/
- 0, /* U+0028ea: BRAILLE PATTERN DOTS-24678*/
- 0, /* U+0028eb: BRAILLE PATTERN DOTS-124678*/
- 0, /* U+0028ec: BRAILLE PATTERN DOTS-34678*/
- 0, /* U+0028ed: BRAILLE PATTERN DOTS-134678*/
- 0, /* U+0028ee: BRAILLE PATTERN DOTS-234678*/
- 0, /* U+0028ef: BRAILLE PATTERN DOTS-1234678*/
- 0, /* U+0028f0: BRAILLE PATTERN DOTS-5678*/
- 0, /* U+0028f1: BRAILLE PATTERN DOTS-15678*/
- 0, /* U+0028f2: BRAILLE PATTERN DOTS-25678*/
- 0, /* U+0028f3: BRAILLE PATTERN DOTS-125678*/
- 0, /* U+0028f4: BRAILLE PATTERN DOTS-35678*/
- 0, /* U+0028f5: BRAILLE PATTERN DOTS-135678*/
- 0, /* U+0028f6: BRAILLE PATTERN DOTS-235678*/
- 0, /* U+0028f7: BRAILLE PATTERN DOTS-1235678*/
- 0, /* U+0028f8: BRAILLE PATTERN DOTS-45678*/
- 0, /* U+0028f9: BRAILLE PATTERN DOTS-145678*/
- 0, /* U+0028fa: BRAILLE PATTERN DOTS-245678*/
- 0, /* U+0028fb: BRAILLE PATTERN DOTS-1245678*/
- 0, /* U+0028fc: BRAILLE PATTERN DOTS-345678*/
- 0, /* U+0028fd: BRAILLE PATTERN DOTS-1345678*/
- 0, /* U+0028fe: BRAILLE PATTERN DOTS-2345678*/
- 0, /* U+0028ff: BRAILLE PATTERN DOTS-12345678*/
- 0, /* U+002900: RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE*/
- 0, /* U+002901: RIGHTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE*/
- 0, /* U+002902: LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE*/
- 0, /* U+002903: RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE*/
- 0, /* U+002904: LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE*/
- 0, /* U+002905: RIGHTWARDS TWO-HEADED ARROW FROM BAR*/
- 0, /* U+002906: LEFTWARDS DOUBLE ARROW FROM BAR*/
- 0, /* U+002907: RIGHTWARDS DOUBLE ARROW FROM BAR*/
- 0, /* U+002908: DOWNWARDS ARROW WITH HORIZONTAL STROKE*/
- 0, /* U+002909: UPWARDS ARROW WITH HORIZONTAL STROKE*/
- 0, /* U+00290a: UPWARDS TRIPLE ARROW*/
- 0, /* U+00290b: DOWNWARDS TRIPLE ARROW*/
- 0, /* U+00290c: LEFTWARDS DOUBLE DASH ARROW*/
- 0, /* U+00290d: RIGHTWARDS DOUBLE DASH ARROW*/
- 0, /* U+00290e: LEFTWARDS TRIPLE DASH ARROW*/
- 0, /* U+00290f: RIGHTWARDS TRIPLE DASH ARROW*/
- 0, /* U+002910: RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW*/
- 0, /* U+002911: RIGHTWARDS ARROW WITH DOTTED STEM*/
- 0, /* U+002912: UPWARDS ARROW TO BAR*/
- 0, /* U+002913: DOWNWARDS ARROW TO BAR*/
- 0, /* U+002914: RIGHTWARDS ARROW WITH TAIL WITH VERTICAL STROKE*/
- 0, /* U+002915: RIGHTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE*/
- 0, /* U+002916: RIGHTWARDS TWO-HEADED ARROW WITH TAIL*/
- 0, /* U+002917: RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE*/
- 0, /* U+002918: RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE*/
- 0, /* U+002919: LEFTWARDS ARROW-TAIL*/
- 0, /* U+00291a: RIGHTWARDS ARROW-TAIL*/
- 0, /* U+00291b: LEFTWARDS DOUBLE ARROW-TAIL*/
- 0, /* U+00291c: RIGHTWARDS DOUBLE ARROW-TAIL*/
- 0, /* U+00291d: LEFTWARDS ARROW TO BLACK DIAMOND*/
- 0, /* U+00291e: RIGHTWARDS ARROW TO BLACK DIAMOND*/
- 0, /* U+00291f: LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND*/
- 0, /* U+002920: RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND*/
- 0, /* U+002921: NORTH WEST AND SOUTH EAST ARROW*/
- 0, /* U+002922: NORTH EAST AND SOUTH WEST ARROW*/
- 0, /* U+002923: NORTH WEST ARROW WITH HOOK*/
- 0, /* U+002924: NORTH EAST ARROW WITH HOOK*/
- 0, /* U+002925: SOUTH EAST ARROW WITH HOOK*/
- 0, /* U+002926: SOUTH WEST ARROW WITH HOOK*/
- 0, /* U+002927: NORTH WEST ARROW AND NORTH EAST ARROW*/
- 0, /* U+002928: NORTH EAST ARROW AND SOUTH EAST ARROW*/
- 0, /* U+002929: SOUTH EAST ARROW AND SOUTH WEST ARROW*/
- 0, /* U+00292a: SOUTH WEST ARROW AND NORTH WEST ARROW*/
- 0, /* U+00292b: RISING DIAGONAL CROSSING FALLING DIAGONAL*/
- 0, /* U+00292c: FALLING DIAGONAL CROSSING RISING DIAGONAL*/
- 0, /* U+00292d: SOUTH EAST ARROW CROSSING NORTH EAST ARROW*/
- 0, /* U+00292e: NORTH EAST ARROW CROSSING SOUTH EAST ARROW*/
- 0, /* U+00292f: FALLING DIAGONAL CROSSING NORTH EAST ARROW*/
- 0, /* U+002930: RISING DIAGONAL CROSSING SOUTH EAST ARROW*/
- 0, /* U+002931: NORTH EAST ARROW CROSSING NORTH WEST ARROW*/
- 0, /* U+002932: NORTH WEST ARROW CROSSING NORTH EAST ARROW*/
- 0, /* U+002933: WAVE ARROW POINTING DIRECTLY RIGHT*/
- 0, /* U+002934: ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS*/
- 0, /* U+002935: ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS*/
- 0, /* U+002936: ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS*/
- 0, /* U+002937: ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS*/
- 0, /* U+002938: RIGHT-SIDE ARC CLOCKWISE ARROW*/
- 0, /* U+002939: LEFT-SIDE ARC ANTICLOCKWISE ARROW*/
- 0, /* U+00293a: TOP ARC ANTICLOCKWISE ARROW*/
- 0, /* U+00293b: BOTTOM ARC ANTICLOCKWISE ARROW*/
- 0, /* U+00293c: TOP ARC CLOCKWISE ARROW WITH MINUS*/
- 0, /* U+00293d: TOP ARC ANTICLOCKWISE ARROW WITH PLUS*/
- 0, /* U+00293e: LOWER RIGHT SEMICIRCULAR CLOCKWISE ARROW*/
- 0, /* U+00293f: LOWER LEFT SEMICIRCULAR ANTICLOCKWISE ARROW*/
- 0, /* U+002940: ANTICLOCKWISE CLOSED CIRCLE ARROW*/
- 0, /* U+002941: CLOCKWISE CLOSED CIRCLE ARROW*/
- 0, /* U+002942: RIGHTWARDS ARROW ABOVE SHORT LEFTWARDS ARROW*/
- 0, /* U+002943: LEFTWARDS ARROW ABOVE SHORT RIGHTWARDS ARROW*/
- 0, /* U+002944: SHORT RIGHTWARDS ARROW ABOVE LEFTWARDS ARROW*/
- 0, /* U+002945: RIGHTWARDS ARROW WITH PLUS BELOW*/
- 0, /* U+002946: LEFTWARDS ARROW WITH PLUS BELOW*/
- 0, /* U+002947: RIGHTWARDS ARROW THROUGH X*/
- 0, /* U+002948: LEFT RIGHT ARROW THROUGH SMALL CIRCLE*/
- 0, /* U+002949: UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE*/
- 0, /* U+00294a: LEFT BARB UP RIGHT BARB DOWN HARPOON*/
- 0, /* U+00294b: LEFT BARB DOWN RIGHT BARB UP HARPOON*/
- 0, /* U+00294c: UP BARB RIGHT DOWN BARB LEFT HARPOON*/
- 0, /* U+00294d: UP BARB LEFT DOWN BARB RIGHT HARPOON*/
- 0, /* U+00294e: LEFT BARB UP RIGHT BARB UP HARPOON*/
- 0, /* U+00294f: UP BARB RIGHT DOWN BARB RIGHT HARPOON*/
- 0, /* U+002950: LEFT BARB DOWN RIGHT BARB DOWN HARPOON*/
- 0, /* U+002951: UP BARB LEFT DOWN BARB LEFT HARPOON*/
- 0, /* U+002952: LEFTWARDS HARPOON WITH BARB UP TO BAR*/
- 0, /* U+002953: RIGHTWARDS HARPOON WITH BARB UP TO BAR*/
- 0, /* U+002954: UPWARDS HARPOON WITH BARB RIGHT TO BAR*/
- 0, /* U+002955: DOWNWARDS HARPOON WITH BARB RIGHT TO BAR*/
- 0, /* U+002956: LEFTWARDS HARPOON WITH BARB DOWN TO BAR*/
- 0, /* U+002957: RIGHTWARDS HARPOON WITH BARB DOWN TO BAR*/
- 0, /* U+002958: UPWARDS HARPOON WITH BARB LEFT TO BAR*/
- 0, /* U+002959: DOWNWARDS HARPOON WITH BARB LEFT TO BAR*/
- 0, /* U+00295a: LEFTWARDS HARPOON WITH BARB UP FROM BAR*/
- 0, /* U+00295b: RIGHTWARDS HARPOON WITH BARB UP FROM BAR*/
- 0, /* U+00295c: UPWARDS HARPOON WITH BARB RIGHT FROM BAR*/
- 0, /* U+00295d: DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR*/
- 0, /* U+00295e: LEFTWARDS HARPOON WITH BARB DOWN FROM BAR*/
- 0, /* U+00295f: RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR*/
- 0, /* U+002960: UPWARDS HARPOON WITH BARB LEFT FROM BAR*/
- 0, /* U+002961: DOWNWARDS HARPOON WITH BARB LEFT FROM BAR*/
- 0, /* U+002962: LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN*/
- 0, /* U+002963: UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT*/
- 0, /* U+002964: RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN*/
- 0, /* U+002965: DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT*/
- 0, /* U+002966: LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP*/
- 0, /* U+002967: LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN*/
- 0, /* U+002968: RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP*/
- 0, /* U+002969: RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN*/
- 0, /* U+00296a: LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH*/
- 0, /* U+00296b: LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH*/
- 0, /* U+00296c: RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH*/
- 0, /* U+00296d: RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH*/
- 0, /* U+00296e: UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT*/
- 0, /* U+00296f: DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT*/
- 0, /* U+002970: RIGHT DOUBLE ARROW WITH ROUNDED HEAD*/
- 0, /* U+002971: EQUALS SIGN ABOVE RIGHTWARDS ARROW*/
- 0, /* U+002972: TILDE OPERATOR ABOVE RIGHTWARDS ARROW*/
- 0, /* U+002973: LEFTWARDS ARROW ABOVE TILDE OPERATOR*/
- 0, /* U+002974: RIGHTWARDS ARROW ABOVE TILDE OPERATOR*/
- 0, /* U+002975: RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO*/
- 0, /* U+002976: LESS-THAN ABOVE LEFTWARDS ARROW*/
- 0, /* U+002977: LEFTWARDS ARROW THROUGH LESS-THAN*/
- 0, /* U+002978: GREATER-THAN ABOVE RIGHTWARDS ARROW*/
- 0, /* U+002979: SUBSET ABOVE RIGHTWARDS ARROW*/
- 0, /* U+00297a: LEFTWARDS ARROW THROUGH SUBSET*/
- 0, /* U+00297b: SUPERSET ABOVE LEFTWARDS ARROW*/
- 0, /* U+00297c: LEFT FISH TAIL*/
- 0, /* U+00297d: RIGHT FISH TAIL*/
- 0, /* U+00297e: UP FISH TAIL*/
- 0, /* U+00297f: DOWN FISH TAIL*/
- 0, /* U+002980: TRIPLE VERTICAL BAR DELIMITER*/
- 0, /* U+002981: Z NOTATION SPOT*/
- 0, /* U+002982: Z NOTATION TYPE COLON*/
- 0, /* U+002983: LEFT WHITE CURLY BRACKET*/
- 0, /* U+002984: RIGHT WHITE CURLY BRACKET*/
- 0, /* U+002985: LEFT WHITE PARENTHESIS*/
- 0, /* U+002986: RIGHT WHITE PARENTHESIS*/
- 0, /* U+002987: Z NOTATION LEFT IMAGE BRACKET*/
- 0, /* U+002988: Z NOTATION RIGHT IMAGE BRACKET*/
- 0, /* U+002989: Z NOTATION LEFT BINDING BRACKET*/
- 0, /* U+00298a: Z NOTATION RIGHT BINDING BRACKET*/
- 0, /* U+00298b: LEFT SQUARE BRACKET WITH UNDERBAR*/
- 0, /* U+00298c: RIGHT SQUARE BRACKET WITH UNDERBAR*/
- 0, /* U+00298d: LEFT SQUARE BRACKET WITH TICK IN TOP CORNER*/
- 0, /* U+00298e: RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER*/
- 0, /* U+00298f: LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER*/
- 0, /* U+002990: RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER*/
- 0, /* U+002991: LEFT ANGLE BRACKET WITH DOT*/
- 0, /* U+002992: RIGHT ANGLE BRACKET WITH DOT*/
- 0, /* U+002993: LEFT ARC LESS-THAN BRACKET*/
- 0, /* U+002994: RIGHT ARC GREATER-THAN BRACKET*/
- 0, /* U+002995: DOUBLE LEFT ARC GREATER-THAN BRACKET*/
- 0, /* U+002996: DOUBLE RIGHT ARC LESS-THAN BRACKET*/
- 0, /* U+002997: LEFT BLACK TORTOISE SHELL BRACKET*/
- 0, /* U+002998: RIGHT BLACK TORTOISE SHELL BRACKET*/
- 0, /* U+002999: DOTTED FENCE*/
- 0, /* U+00299a: VERTICAL ZIGZAG LINE*/
- 0, /* U+00299b: MEASURED ANGLE OPENING LEFT*/
- 0, /* U+00299c: RIGHT ANGLE VARIANT WITH SQUARE*/
- 0, /* U+00299d: MEASURED RIGHT ANGLE WITH DOT*/
- 0, /* U+00299e: ANGLE WITH S INSIDE*/
- 0, /* U+00299f: ACUTE ANGLE*/
- 0, /* U+0029a0: SPHERICAL ANGLE OPENING LEFT*/
- 0, /* U+0029a1: SPHERICAL ANGLE OPENING UP*/
- 0, /* U+0029a2: TURNED ANGLE*/
- 0, /* U+0029a3: REVERSED ANGLE*/
- 0, /* U+0029a4: ANGLE WITH UNDERBAR*/
- 0, /* U+0029a5: REVERSED ANGLE WITH UNDERBAR*/
- 0, /* U+0029a6: OBLIQUE ANGLE OPENING UP*/
- 0, /* U+0029a7: OBLIQUE ANGLE OPENING DOWN*/
- 0, /* U+0029a8: MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT*/
- 0, /* U+0029a9: MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT*/
- 0, /* U+0029aa: MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT*/
- 0, /* U+0029ab: MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT*/
- 0, /* U+0029ac: MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP*/
- 0, /* U+0029ad: MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP*/
- 0, /* U+0029ae: MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN*/
- 0, /* U+0029af: MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN*/
- 0, /* U+0029b0: REVERSED EMPTY SET*/
- 0, /* U+0029b1: EMPTY SET WITH OVERBAR*/
- 0, /* U+0029b2: EMPTY SET WITH SMALL CIRCLE ABOVE*/
- 0, /* U+0029b3: EMPTY SET WITH RIGHT ARROW ABOVE*/
- 0, /* U+0029b4: EMPTY SET WITH LEFT ARROW ABOVE*/
- 0, /* U+0029b5: CIRCLE WITH HORIZONTAL BAR*/
- 0, /* U+0029b6: CIRCLED VERTICAL BAR*/
- 0, /* U+0029b7: CIRCLED PARALLEL*/
- 0, /* U+0029b8: CIRCLED REVERSE SOLIDUS*/
- 0, /* U+0029b9: CIRCLED PERPENDICULAR*/
- 0, /* U+0029ba: CIRCLE DIVIDED BY HORIZONTAL BAR AND TOP HALF DIVIDED BY VERTICAL BAR*/
- 0, /* U+0029bb: CIRCLE WITH SUPERIMPOSED X*/
- 0, /* U+0029bc: CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN*/
- 0, /* U+0029bd: UP ARROW THROUGH CIRCLE*/
- 0, /* U+0029be: CIRCLED WHITE BULLET*/
- 0, /* U+0029bf: CIRCLED BULLET*/
- 0, /* U+0029c0: CIRCLED LESS-THAN*/
- 0, /* U+0029c1: CIRCLED GREATER-THAN*/
- 0, /* U+0029c2: CIRCLE WITH SMALL CIRCLE TO THE RIGHT*/
- 0, /* U+0029c3: CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT*/
- 0, /* U+0029c4: SQUARED RISING DIAGONAL SLASH*/
- 0, /* U+0029c5: SQUARED FALLING DIAGONAL SLASH*/
- 0, /* U+0029c6: SQUARED ASTERISK*/
- 0, /* U+0029c7: SQUARED SMALL CIRCLE*/
- 0, /* U+0029c8: SQUARED SQUARE*/
- 0, /* U+0029c9: TWO JOINED SQUARES*/
- 0, /* U+0029ca: TRIANGLE WITH DOT ABOVE*/
- 0, /* U+0029cb: TRIANGLE WITH UNDERBAR*/
- 0, /* U+0029cc: S IN TRIANGLE*/
- 0, /* U+0029cd: TRIANGLE WITH SERIFS AT BOTTOM*/
- 0, /* U+0029ce: RIGHT TRIANGLE ABOVE LEFT TRIANGLE*/
- 0, /* U+0029cf: LEFT TRIANGLE BESIDE VERTICAL BAR*/
- 0, /* U+0029d0: VERTICAL BAR BESIDE RIGHT TRIANGLE*/
- 0, /* U+0029d1: BOWTIE WITH LEFT HALF BLACK*/
- 0, /* U+0029d2: BOWTIE WITH RIGHT HALF BLACK*/
- 0, /* U+0029d3: BLACK BOWTIE*/
- 0, /* U+0029d4: TIMES WITH LEFT HALF BLACK*/
- 0, /* U+0029d5: TIMES WITH RIGHT HALF BLACK*/
- 0, /* U+0029d6: WHITE HOURGLASS*/
- 0, /* U+0029d7: BLACK HOURGLASS*/
- 0, /* U+0029d8: LEFT WIGGLY FENCE*/
- 0, /* U+0029d9: RIGHT WIGGLY FENCE*/
- 0, /* U+0029da: LEFT DOUBLE WIGGLY FENCE*/
- 0, /* U+0029db: RIGHT DOUBLE WIGGLY FENCE*/
- 0, /* U+0029dc: INCOMPLETE INFINITY*/
- 0, /* U+0029dd: TIE OVER INFINITY*/
- 0, /* U+0029de: INFINITY NEGATED WITH VERTICAL BAR*/
- 0, /* U+0029df: DOUBLE-ENDED MULTIMAP*/
- 0, /* U+0029e0: SQUARE WITH CONTOURED OUTLINE*/
- 0, /* U+0029e1: INCREASES AS*/
- 0, /* U+0029e2: SHUFFLE PRODUCT*/
- 0, /* U+0029e3: EQUALS SIGN AND SLANTED PARALLEL*/
- 0, /* U+0029e4: EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE*/
- 0, /* U+0029e5: IDENTICAL TO AND SLANTED PARALLEL*/
- 0, /* U+0029e6: GLEICH STARK*/
- 0, /* U+0029e7: THERMODYNAMIC*/
- 0, /* U+0029e8: DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK*/
- 0, /* U+0029e9: DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK*/
- 0, /* U+0029ea: BLACK DIAMOND WITH DOWN ARROW*/
- 0, /* U+0029eb: BLACK LOZENGE*/
- 0, /* U+0029ec: WHITE CIRCLE WITH DOWN ARROW*/
- 0, /* U+0029ed: BLACK CIRCLE WITH DOWN ARROW*/
- 0, /* U+0029ee: ERROR-BARRED WHITE SQUARE*/
- 0, /* U+0029ef: ERROR-BARRED BLACK SQUARE*/
- 0, /* U+0029f0: ERROR-BARRED WHITE DIAMOND*/
- 0, /* U+0029f1: ERROR-BARRED BLACK DIAMOND*/
- 0, /* U+0029f2: ERROR-BARRED WHITE CIRCLE*/
- 0, /* U+0029f3: ERROR-BARRED BLACK CIRCLE*/
- 0, /* U+0029f4: RULE-DELAYED*/
- 0, /* U+0029f5: REVERSE SOLIDUS OPERATOR*/
- 0, /* U+0029f6: SOLIDUS WITH OVERBAR*/
- 0, /* U+0029f7: REVERSE SOLIDUS WITH HORIZONTAL STROKE*/
- 0, /* U+0029f8: BIG SOLIDUS*/
- 0, /* U+0029f9: BIG REVERSE SOLIDUS*/
- 0, /* U+0029fa: DOUBLE PLUS*/
- 0, /* U+0029fb: TRIPLE PLUS*/
- 0, /* U+0029fc: LEFT-POINTING CURVED ANGLE BRACKET*/
- 0, /* U+0029fd: RIGHT-POINTING CURVED ANGLE BRACKET*/
- 0, /* U+0029fe: TINY*/
- 0, /* U+0029ff: MINY*/
- 0, /* U+002a00: N-ARY CIRCLED DOT OPERATOR*/
- 0, /* U+002a01: N-ARY CIRCLED PLUS OPERATOR*/
- 0, /* U+002a02: N-ARY CIRCLED TIMES OPERATOR*/
- 0, /* U+002a03: N-ARY UNION OPERATOR WITH DOT*/
- 0, /* U+002a04: N-ARY UNION OPERATOR WITH PLUS*/
- 0, /* U+002a05: N-ARY SQUARE INTERSECTION OPERATOR*/
- 0, /* U+002a06: N-ARY SQUARE UNION OPERATOR*/
- 0, /* U+002a07: TWO LOGICAL AND OPERATOR*/
- 0, /* U+002a08: TWO LOGICAL OR OPERATOR*/
- 0, /* U+002a09: N-ARY TIMES OPERATOR*/
- 0, /* U+002a0a: MODULO TWO SUM*/
- 0, /* U+002a0b: SUMMATION WITH INTEGRAL*/
- 0, /* U+002a0c: QUADRUPLE INTEGRAL OPERATOR*/
- 0, /* U+002a0d: FINITE PART INTEGRAL*/
- 0, /* U+002a0e: INTEGRAL WITH DOUBLE STROKE*/
- 0, /* U+002a0f: INTEGRAL AVERAGE WITH SLASH*/
- 0, /* U+002a10: CIRCULATION FUNCTION*/
- 0, /* U+002a11: ANTICLOCKWISE INTEGRATION*/
- 0, /* U+002a12: LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE*/
- 0, /* U+002a13: LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE*/
- 0, /* U+002a14: LINE INTEGRATION NOT INCLUDING THE POLE*/
- 0, /* U+002a15: INTEGRAL AROUND A POINT OPERATOR*/
- 0, /* U+002a16: QUATERNION INTEGRAL OPERATOR*/
- 0, /* U+002a17: INTEGRAL WITH LEFTWARDS ARROW WITH HOOK*/
- 0, /* U+002a18: INTEGRAL WITH TIMES SIGN*/
- 0, /* U+002a19: INTEGRAL WITH INTERSECTION*/
- 0, /* U+002a1a: INTEGRAL WITH UNION*/
- 0, /* U+002a1b: INTEGRAL WITH OVERBAR*/
- 0, /* U+002a1c: INTEGRAL WITH UNDERBAR*/
- 0, /* U+002a1d: JOIN*/
- 0, /* U+002a1e: LARGE LEFT TRIANGLE OPERATOR*/
- 0, /* U+002a1f: Z NOTATION SCHEMA COMPOSITION*/
- 0, /* U+002a20: Z NOTATION SCHEMA PIPING*/
- 0, /* U+002a21: Z NOTATION SCHEMA PROJECTION*/
- 0, /* U+002a22: PLUS SIGN WITH SMALL CIRCLE ABOVE*/
- 0, /* U+002a23: PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE*/
- 0, /* U+002a24: PLUS SIGN WITH TILDE ABOVE*/
- 0, /* U+002a25: PLUS SIGN WITH DOT BELOW*/
- 0, /* U+002a26: PLUS SIGN WITH TILDE BELOW*/
- 0, /* U+002a27: PLUS SIGN WITH SUBSCRIPT TWO*/
- 0, /* U+002a28: PLUS SIGN WITH BLACK TRIANGLE*/
- 0, /* U+002a29: MINUS SIGN WITH COMMA ABOVE*/
- 0, /* U+002a2a: MINUS SIGN WITH DOT BELOW*/
- 0, /* U+002a2b: MINUS SIGN WITH FALLING DOTS*/
- 0, /* U+002a2c: MINUS SIGN WITH RISING DOTS*/
- 0, /* U+002a2d: PLUS SIGN IN LEFT HALF CIRCLE*/
- 0, /* U+002a2e: PLUS SIGN IN RIGHT HALF CIRCLE*/
- 0, /* U+002a2f: VECTOR OR CROSS PRODUCT*/
- 0, /* U+002a30: MULTIPLICATION SIGN WITH DOT ABOVE*/
- 0, /* U+002a31: MULTIPLICATION SIGN WITH UNDERBAR*/
- 0, /* U+002a32: SEMIDIRECT PRODUCT WITH BOTTOM CLOSED*/
- 0, /* U+002a33: SMASH PRODUCT*/
- 0, /* U+002a34: MULTIPLICATION SIGN IN LEFT HALF CIRCLE*/
- 0, /* U+002a35: MULTIPLICATION SIGN IN RIGHT HALF CIRCLE*/
- 0, /* U+002a36: CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT*/
- 0, /* U+002a37: MULTIPLICATION SIGN IN DOUBLE CIRCLE*/
- 0, /* U+002a38: CIRCLED DIVISION SIGN*/
- 0, /* U+002a39: PLUS SIGN IN TRIANGLE*/
- 0, /* U+002a3a: MINUS SIGN IN TRIANGLE*/
- 0, /* U+002a3b: MULTIPLICATION SIGN IN TRIANGLE*/
- 0, /* U+002a3c: INTERIOR PRODUCT*/
- 0, /* U+002a3d: RIGHTHAND INTERIOR PRODUCT*/
- 0, /* U+002a3e: Z NOTATION RELATIONAL COMPOSITION*/
- 0, /* U+002a3f: AMALGAMATION OR COPRODUCT*/
- 0, /* U+002a40: INTERSECTION WITH DOT*/
- 0, /* U+002a41: UNION WITH MINUS SIGN*/
- 0, /* U+002a42: UNION WITH OVERBAR*/
- 0, /* U+002a43: INTERSECTION WITH OVERBAR*/
- 0, /* U+002a44: INTERSECTION WITH LOGICAL AND*/
- 0, /* U+002a45: UNION WITH LOGICAL OR*/
- 0, /* U+002a46: UNION ABOVE INTERSECTION*/
- 0, /* U+002a47: INTERSECTION ABOVE UNION*/
- 0, /* U+002a48: UNION ABOVE BAR ABOVE INTERSECTION*/
- 0, /* U+002a49: INTERSECTION ABOVE BAR ABOVE UNION*/
- 0, /* U+002a4a: UNION BESIDE AND JOINED WITH UNION*/
- 0, /* U+002a4b: INTERSECTION BESIDE AND JOINED WITH INTERSECTION*/
- 0, /* U+002a4c: CLOSED UNION WITH SERIFS*/
- 0, /* U+002a4d: CLOSED INTERSECTION WITH SERIFS*/
- 0, /* U+002a4e: DOUBLE SQUARE INTERSECTION*/
- 0, /* U+002a4f: DOUBLE SQUARE UNION*/
- 0, /* U+002a50: CLOSED UNION WITH SERIFS AND SMASH PRODUCT*/
- 0, /* U+002a51: LOGICAL AND WITH DOT ABOVE*/
- 0, /* U+002a52: LOGICAL OR WITH DOT ABOVE*/
- 0, /* U+002a53: DOUBLE LOGICAL AND*/
- 0, /* U+002a54: DOUBLE LOGICAL OR*/
- 0, /* U+002a55: TWO INTERSECTING LOGICAL AND*/
- 0, /* U+002a56: TWO INTERSECTING LOGICAL OR*/
- 0, /* U+002a57: SLOPING LARGE OR*/
- 0, /* U+002a58: SLOPING LARGE AND*/
- 0, /* U+002a59: LOGICAL OR OVERLAPPING LOGICAL AND*/
- 0, /* U+002a5a: LOGICAL AND WITH MIDDLE STEM*/
- 0, /* U+002a5b: LOGICAL OR WITH MIDDLE STEM*/
- 0, /* U+002a5c: LOGICAL AND WITH HORIZONTAL DASH*/
- 0, /* U+002a5d: LOGICAL OR WITH HORIZONTAL DASH*/
- 0, /* U+002a5e: LOGICAL AND WITH DOUBLE OVERBAR*/
- 0, /* U+002a5f: LOGICAL AND WITH UNDERBAR*/
- 0, /* U+002a60: LOGICAL AND WITH DOUBLE UNDERBAR*/
- 0, /* U+002a61: SMALL VEE WITH UNDERBAR*/
- 0, /* U+002a62: LOGICAL OR WITH DOUBLE OVERBAR*/
- 0, /* U+002a63: LOGICAL OR WITH DOUBLE UNDERBAR*/
- 0, /* U+002a64: Z NOTATION DOMAIN ANTIRESTRICTION*/
- 0, /* U+002a65: Z NOTATION RANGE ANTIRESTRICTION*/
- 0, /* U+002a66: EQUALS SIGN WITH DOT BELOW*/
- 0, /* U+002a67: IDENTICAL WITH DOT ABOVE*/
- 0, /* U+002a68: TRIPLE HORIZONTAL BAR WITH DOUBLE VERTICAL STROKE*/
- 0, /* U+002a69: TRIPLE HORIZONTAL BAR WITH TRIPLE VERTICAL STROKE*/
- 0, /* U+002a6a: TILDE OPERATOR WITH DOT ABOVE*/
- 0, /* U+002a6b: TILDE OPERATOR WITH RISING DOTS*/
- 0, /* U+002a6c: SIMILAR MINUS SIMILAR*/
- 0, /* U+002a6d: CONGRUENT WITH DOT ABOVE*/
- 0, /* U+002a6e: EQUALS WITH ASTERISK*/
- 0, /* U+002a6f: ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT*/
- 0, /* U+002a70: APPROXIMATELY EQUAL OR EQUAL TO*/
- 0, /* U+002a71: EQUALS SIGN ABOVE PLUS SIGN*/
- 0, /* U+002a72: PLUS SIGN ABOVE EQUALS SIGN*/
- 0, /* U+002a73: EQUALS SIGN ABOVE TILDE OPERATOR*/
- 0, /* U+002a74: DOUBLE COLON EQUAL*/
- 0, /* U+002a75: TWO CONSECUTIVE EQUALS SIGNS*/
- 0, /* U+002a76: THREE CONSECUTIVE EQUALS SIGNS*/
- 0, /* U+002a77: EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW*/
- 0, /* U+002a78: EQUIVALENT WITH FOUR DOTS ABOVE*/
- 0, /* U+002a79: LESS-THAN WITH CIRCLE INSIDE*/
- 0, /* U+002a7a: GREATER-THAN WITH CIRCLE INSIDE*/
- 0, /* U+002a7b: LESS-THAN WITH QUESTION MARK ABOVE*/
- 0, /* U+002a7c: GREATER-THAN WITH QUESTION MARK ABOVE*/
- 0, /* U+002a7d: LESS-THAN OR SLANTED EQUAL TO*/
- 0, /* U+002a7e: GREATER-THAN OR SLANTED EQUAL TO*/
- 0, /* U+002a7f: LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE*/
- 0, /* U+002a80: GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE*/
- 0, /* U+002a81: LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE*/
- 0, /* U+002a82: GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE*/
- 0, /* U+002a83: LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT*/
- 0, /* U+002a84: GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT*/
- 0, /* U+002a85: LESS-THAN OR APPROXIMATE*/
- 0, /* U+002a86: GREATER-THAN OR APPROXIMATE*/
- 0, /* U+002a87: LESS-THAN AND SINGLE-LINE NOT EQUAL TO*/
- 0, /* U+002a88: GREATER-THAN AND SINGLE-LINE NOT EQUAL TO*/
- 0, /* U+002a89: LESS-THAN AND NOT APPROXIMATE*/
- 0, /* U+002a8a: GREATER-THAN AND NOT APPROXIMATE*/
- 0, /* U+002a8b: LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN*/
- 0, /* U+002a8c: GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN*/
- 0, /* U+002a8d: LESS-THAN ABOVE SIMILAR OR EQUAL*/
- 0, /* U+002a8e: GREATER-THAN ABOVE SIMILAR OR EQUAL*/
- 0, /* U+002a8f: LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN*/
- 0, /* U+002a90: GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN*/
- 0, /* U+002a91: LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL*/
- 0, /* U+002a92: GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL*/
- 0, /* U+002a93: LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL*/
- 0, /* U+002a94: GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL*/
- 0, /* U+002a95: SLANTED EQUAL TO OR LESS-THAN*/
- 0, /* U+002a96: SLANTED EQUAL TO OR GREATER-THAN*/
- 0, /* U+002a97: SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE*/
- 0, /* U+002a98: SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE*/
- 0, /* U+002a99: DOUBLE-LINE EQUAL TO OR LESS-THAN*/
- 0, /* U+002a9a: DOUBLE-LINE EQUAL TO OR GREATER-THAN*/
- 0, /* U+002a9b: DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN*/
- 0, /* U+002a9c: DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN*/
- 0, /* U+002a9d: SIMILAR OR LESS-THAN*/
- 0, /* U+002a9e: SIMILAR OR GREATER-THAN*/
- 0, /* U+002a9f: SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN*/
- 0, /* U+002aa0: SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN*/
- 0, /* U+002aa1: DOUBLE NESTED LESS-THAN*/
- 0, /* U+002aa2: DOUBLE NESTED GREATER-THAN*/
- 0, /* U+002aa3: DOUBLE NESTED LESS-THAN WITH UNDERBAR*/
- 0, /* U+002aa4: GREATER-THAN OVERLAPPING LESS-THAN*/
- 0, /* U+002aa5: GREATER-THAN BESIDE LESS-THAN*/
- 0, /* U+002aa6: LESS-THAN CLOSED BY CURVE*/
- 0, /* U+002aa7: GREATER-THAN CLOSED BY CURVE*/
- 0, /* U+002aa8: LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL*/
- 0, /* U+002aa9: GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL*/
- 0, /* U+002aaa: SMALLER THAN*/
- 0, /* U+002aab: LARGER THAN*/
- 0, /* U+002aac: SMALLER THAN OR EQUAL TO*/
- 0, /* U+002aad: LARGER THAN OR EQUAL TO*/
- 0, /* U+002aae: EQUALS SIGN WITH BUMPY ABOVE*/
- 0, /* U+002aaf: PRECEDES ABOVE SINGLE-LINE EQUALS SIGN*/
- 0, /* U+002ab0: SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN*/
- 0, /* U+002ab1: PRECEDES ABOVE SINGLE-LINE NOT EQUAL TO*/
- 0, /* U+002ab2: SUCCEEDS ABOVE SINGLE-LINE NOT EQUAL TO*/
- 0, /* U+002ab3: PRECEDES ABOVE EQUALS SIGN*/
- 0, /* U+002ab4: SUCCEEDS ABOVE EQUALS SIGN*/
- 0, /* U+002ab5: PRECEDES ABOVE NOT EQUAL TO*/
- 0, /* U+002ab6: SUCCEEDS ABOVE NOT EQUAL TO*/
- 0, /* U+002ab7: PRECEDES ABOVE ALMOST EQUAL TO*/
- 0, /* U+002ab8: SUCCEEDS ABOVE ALMOST EQUAL TO*/
- 0, /* U+002ab9: PRECEDES ABOVE NOT ALMOST EQUAL TO*/
- 0, /* U+002aba: SUCCEEDS ABOVE NOT ALMOST EQUAL TO*/
- 0, /* U+002abb: DOUBLE PRECEDES*/
- 0, /* U+002abc: DOUBLE SUCCEEDS*/
- 0, /* U+002abd: SUBSET WITH DOT*/
- 0, /* U+002abe: SUPERSET WITH DOT*/
- 0, /* U+002abf: SUBSET WITH PLUS SIGN BELOW*/
- 0, /* U+002ac0: SUPERSET WITH PLUS SIGN BELOW*/
- 0, /* U+002ac1: SUBSET WITH MULTIPLICATION SIGN BELOW*/
- 0, /* U+002ac2: SUPERSET WITH MULTIPLICATION SIGN BELOW*/
- 0, /* U+002ac3: SUBSET OF OR EQUAL TO WITH DOT ABOVE*/
- 0, /* U+002ac4: SUPERSET OF OR EQUAL TO WITH DOT ABOVE*/
- 0, /* U+002ac5: SUBSET OF ABOVE EQUALS SIGN*/
- 0, /* U+002ac6: SUPERSET OF ABOVE EQUALS SIGN*/
- 0, /* U+002ac7: SUBSET OF ABOVE TILDE OPERATOR*/
- 0, /* U+002ac8: SUPERSET OF ABOVE TILDE OPERATOR*/
- 0, /* U+002ac9: SUBSET OF ABOVE ALMOST EQUAL TO*/
- 0, /* U+002aca: SUPERSET OF ABOVE ALMOST EQUAL TO*/
- 0, /* U+002acb: SUBSET OF ABOVE NOT EQUAL TO*/
- 0, /* U+002acc: SUPERSET OF ABOVE NOT EQUAL TO*/
- 0, /* U+002acd: SQUARE LEFT OPEN BOX OPERATOR*/
- 0, /* U+002ace: SQUARE RIGHT OPEN BOX OPERATOR*/
- 0, /* U+002acf: CLOSED SUBSET*/
- 0, /* U+002ad0: CLOSED SUPERSET*/
- 0, /* U+002ad1: CLOSED SUBSET OR EQUAL TO*/
- 0, /* U+002ad2: CLOSED SUPERSET OR EQUAL TO*/
- 0, /* U+002ad3: SUBSET ABOVE SUPERSET*/
- 0, /* U+002ad4: SUPERSET ABOVE SUBSET*/
- 0, /* U+002ad5: SUBSET ABOVE SUBSET*/
- 0, /* U+002ad6: SUPERSET ABOVE SUPERSET*/
- 0, /* U+002ad7: SUPERSET BESIDE SUBSET*/
- 0, /* U+002ad8: SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET*/
- 0, /* U+002ad9: ELEMENT OF OPENING DOWNWARDS*/
- 0, /* U+002ada: PITCHFORK WITH TEE TOP*/
- 0, /* U+002adb: TRANSVERSAL INTERSECTION*/
- 0, /* U+002adc: FORKING*/
- 0, /* U+002add: NONFORKING*/
- 0, /* U+002ade: SHORT LEFT TACK*/
- 0, /* U+002adf: SHORT DOWN TACK*/
- 0, /* U+002ae0: SHORT UP TACK*/
- 0, /* U+002ae1: PERPENDICULAR WITH S*/
- 0, /* U+002ae2: VERTICAL BAR TRIPLE RIGHT TURNSTILE*/
- 0, /* U+002ae3: DOUBLE VERTICAL BAR LEFT TURNSTILE*/
- 0, /* U+002ae4: VERTICAL BAR DOUBLE LEFT TURNSTILE*/
- 0, /* U+002ae5: DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE*/
- 0, /* U+002ae6: LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL*/
- 0, /* U+002ae7: SHORT DOWN TACK WITH OVERBAR*/
- 0, /* U+002ae8: SHORT UP TACK WITH UNDERBAR*/
- 0, /* U+002ae9: SHORT UP TACK ABOVE SHORT DOWN TACK*/
- 0, /* U+002aea: DOUBLE DOWN TACK*/
- 0, /* U+002aeb: DOUBLE UP TACK*/
- 0, /* U+002aec: DOUBLE STROKE NOT SIGN*/
- 0, /* U+002aed: REVERSED DOUBLE STROKE NOT SIGN*/
- 0, /* U+002aee: DOES NOT DIVIDE WITH REVERSED NEGATION SLASH*/
- 0, /* U+002aef: VERTICAL LINE WITH CIRCLE ABOVE*/
- 0, /* U+002af0: VERTICAL LINE WITH CIRCLE BELOW*/
- 0, /* U+002af1: DOWN TACK WITH CIRCLE BELOW*/
- 0, /* U+002af2: PARALLEL WITH HORIZONTAL STROKE*/
- 0, /* U+002af3: PARALLEL WITH TILDE OPERATOR*/
- 0, /* U+002af4: TRIPLE VERTICAL BAR BINARY RELATION*/
- 0, /* U+002af5: TRIPLE VERTICAL BAR WITH HORIZONTAL STROKE*/
- 0, /* U+002af6: TRIPLE COLON OPERATOR*/
- 0, /* U+002af7: TRIPLE NESTED LESS-THAN*/
- 0, /* U+002af8: TRIPLE NESTED GREATER-THAN*/
- 0, /* U+002af9: DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO*/
- 0, /* U+002afa: DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO*/
- 0, /* U+002afb: TRIPLE SOLIDUS BINARY RELATION*/
- 0, /* U+002afc: LARGE TRIPLE VERTICAL BAR OPERATOR*/
- 0, /* U+002afd: DOUBLE SOLIDUS OPERATOR*/
- 0, /* U+002afe: WHITE VERTICAL BAR*/
- 0, /* U+002aff: N-ARY WHITE VERTICAL BAR*/
- 0, /* U+002b00: NORTH EAST WHITE ARROW*/
- 0, /* U+002b01: NORTH WEST WHITE ARROW*/
- 0, /* U+002b02: SOUTH EAST WHITE ARROW*/
- 0, /* U+002b03: SOUTH WEST WHITE ARROW*/
- 0, /* U+002b04: LEFT RIGHT WHITE ARROW*/
- 0, /* U+002b05: LEFTWARDS BLACK ARROW*/
- 0, /* U+002b06: UPWARDS BLACK ARROW*/
- 0, /* U+002b07: DOWNWARDS BLACK ARROW*/
- 0, /* U+002b08: NORTH EAST BLACK ARROW*/
- 0, /* U+002b09: NORTH WEST BLACK ARROW*/
- 0, /* U+002b0a: SOUTH EAST BLACK ARROW*/
- 0, /* U+002b0b: SOUTH WEST BLACK ARROW*/
- 0, /* U+002b0c: LEFT RIGHT BLACK ARROW*/
- 0, /* U+002b0d: UP DOWN BLACK ARROW*/
- 0, /* U+002b0e: RIGHTWARDS ARROW WITH TIP DOWNWARDS*/
- 0, /* U+002b0f: RIGHTWARDS ARROW WITH TIP UPWARDS*/
- 0, /* U+002b10: LEFTWARDS ARROW WITH TIP DOWNWARDS*/
- 0, /* U+002b11: LEFTWARDS ARROW WITH TIP UPWARDS*/
- 0, /* U+002b12: SQUARE WITH TOP HALF BLACK*/
- 0, /* U+002b13: SQUARE WITH BOTTOM HALF BLACK*/
- 0, /* U+002b14: */
- 0, /* U+002b15: */
- 0, /* U+002b16: */
- 0, /* U+002b17: */
- 0, /* U+002b18: */
- 0, /* U+002b19: */
- 0, /* U+002b1a: */
- 0, /* U+002b1b: */
- 0, /* U+002b1c: */
- 0, /* U+002b1d: */
- 0, /* U+002b1e: */
- 0, /* U+002b1f: */
- 0, /* U+002b20: */
- 0, /* U+002b21: */
- 0, /* U+002b22: */
- 0, /* U+002b23: */
- 0, /* U+002b24: */
- 0, /* U+002b25: */
- 0, /* U+002b26: */
- 0, /* U+002b27: */
- 0, /* U+002b28: */
- 0, /* U+002b29: */
- 0, /* U+002b2a: */
- 0, /* U+002b2b: */
- 0, /* U+002b2c: */
- 0, /* U+002b2d: */
- 0, /* U+002b2e: */
- 0, /* U+002b2f: */
- 0, /* U+002b30: */
- 0, /* U+002b31: */
- 0, /* U+002b32: */
- 0, /* U+002b33: */
- 0, /* U+002b34: */
- 0, /* U+002b35: */
- 0, /* U+002b36: */
- 0, /* U+002b37: */
- 0, /* U+002b38: */
- 0, /* U+002b39: */
- 0, /* U+002b3a: */
- 0, /* U+002b3b: */
- 0, /* U+002b3c: */
- 0, /* U+002b3d: */
- 0, /* U+002b3e: */
- 0, /* U+002b3f: */
- 0, /* U+002b40: */
- 0, /* U+002b41: */
- 0, /* U+002b42: */
- 0, /* U+002b43: */
- 0, /* U+002b44: */
- 0, /* U+002b45: */
- 0, /* U+002b46: */
- 0, /* U+002b47: */
- 0, /* U+002b48: */
- 0, /* U+002b49: */
- 0, /* U+002b4a: */
- 0, /* U+002b4b: */
- 0, /* U+002b4c: */
- 0, /* U+002b4d: */
- 0, /* U+002b4e: */
- 0, /* U+002b4f: */
- 0, /* U+002b50: */
- 0, /* U+002b51: */
- 0, /* U+002b52: */
- 0, /* U+002b53: */
- 0, /* U+002b54: */
- 0, /* U+002b55: */
- 0, /* U+002b56: */
- 0, /* U+002b57: */
- 0, /* U+002b58: */
- 0, /* U+002b59: */
- 0, /* U+002b5a: */
- 0, /* U+002b5b: */
- 0, /* U+002b5c: */
- 0, /* U+002b5d: */
- 0, /* U+002b5e: */
- 0, /* U+002b5f: */
- 0, /* U+002b60: */
- 0, /* U+002b61: */
- 0, /* U+002b62: */
- 0, /* U+002b63: */
- 0, /* U+002b64: */
- 0, /* U+002b65: */
- 0, /* U+002b66: */
- 0, /* U+002b67: */
- 0, /* U+002b68: */
- 0, /* U+002b69: */
- 0, /* U+002b6a: */
- 0, /* U+002b6b: */
- 0, /* U+002b6c: */
- 0, /* U+002b6d: */
- 0, /* U+002b6e: */
- 0, /* U+002b6f: */
- 0, /* U+002b70: */
- 0, /* U+002b71: */
- 0, /* U+002b72: */
- 0, /* U+002b73: */
- 0, /* U+002b74: */
- 0, /* U+002b75: */
- 0, /* U+002b76: */
- 0, /* U+002b77: */
- 0, /* U+002b78: */
- 0, /* U+002b79: */
- 0, /* U+002b7a: */
- 0, /* U+002b7b: */
- 0, /* U+002b7c: */
- 0, /* U+002b7d: */
- 0, /* U+002b7e: */
- 0, /* U+002b7f: */
- 0, /* U+002b80: */
- 0, /* U+002b81: */
- 0, /* U+002b82: */
- 0, /* U+002b83: */
- 0, /* U+002b84: */
- 0, /* U+002b85: */
- 0, /* U+002b86: */
- 0, /* U+002b87: */
- 0, /* U+002b88: */
- 0, /* U+002b89: */
- 0, /* U+002b8a: */
- 0, /* U+002b8b: */
- 0, /* U+002b8c: */
- 0, /* U+002b8d: */
- 0, /* U+002b8e: */
- 0, /* U+002b8f: */
- 0, /* U+002b90: */
- 0, /* U+002b91: */
- 0, /* U+002b92: */
- 0, /* U+002b93: */
- 0, /* U+002b94: */
- 0, /* U+002b95: */
- 0, /* U+002b96: */
- 0, /* U+002b97: */
- 0, /* U+002b98: */
- 0, /* U+002b99: */
- 0, /* U+002b9a: */
- 0, /* U+002b9b: */
- 0, /* U+002b9c: */
- 0, /* U+002b9d: */
- 0, /* U+002b9e: */
- 0, /* U+002b9f: */
- 0, /* U+002ba0: */
- 0, /* U+002ba1: */
- 0, /* U+002ba2: */
- 0, /* U+002ba3: */
- 0, /* U+002ba4: */
- 0, /* U+002ba5: */
- 0, /* U+002ba6: */
- 0, /* U+002ba7: */
- 0, /* U+002ba8: */
- 0, /* U+002ba9: */
- 0, /* U+002baa: */
- 0, /* U+002bab: */
- 0, /* U+002bac: */
- 0, /* U+002bad: */
- 0, /* U+002bae: */
- 0, /* U+002baf: */
- 0, /* U+002bb0: */
- 0, /* U+002bb1: */
- 0, /* U+002bb2: */
- 0, /* U+002bb3: */
- 0, /* U+002bb4: */
- 0, /* U+002bb5: */
- 0, /* U+002bb6: */
- 0, /* U+002bb7: */
- 0, /* U+002bb8: */
- 0, /* U+002bb9: */
- 0, /* U+002bba: */
- 0, /* U+002bbb: */
- 0, /* U+002bbc: */
- 0, /* U+002bbd: */
- 0, /* U+002bbe: */
- 0, /* U+002bbf: */
- 0, /* U+002bc0: */
- 0, /* U+002bc1: */
- 0, /* U+002bc2: */
- 0, /* U+002bc3: */
- 0, /* U+002bc4: */
- 0, /* U+002bc5: */
- 0, /* U+002bc6: */
- 0, /* U+002bc7: */
- 0, /* U+002bc8: */
- 0, /* U+002bc9: */
- 0, /* U+002bca: */
- 0, /* U+002bcb: */
- 0, /* U+002bcc: */
- 0, /* U+002bcd: */
- 0, /* U+002bce: */
- 0, /* U+002bcf: */
- 0, /* U+002bd0: */
- 0, /* U+002bd1: */
- 0, /* U+002bd2: */
- 0, /* U+002bd3: */
- 0, /* U+002bd4: */
- 0, /* U+002bd5: */
- 0, /* U+002bd6: */
- 0, /* U+002bd7: */
- 0, /* U+002bd8: */
- 0, /* U+002bd9: */
- 0, /* U+002bda: */
- 0, /* U+002bdb: */
- 0, /* U+002bdc: */
- 0, /* U+002bdd: */
- 0, /* U+002bde: */
- 0, /* U+002bdf: */
- 0, /* U+002be0: */
- 0, /* U+002be1: */
- 0, /* U+002be2: */
- 0, /* U+002be3: */
- 0, /* U+002be4: */
- 0, /* U+002be5: */
- 0, /* U+002be6: */
- 0, /* U+002be7: */
- 0, /* U+002be8: */
- 0, /* U+002be9: */
- 0, /* U+002bea: */
- 0, /* U+002beb: */
- 0, /* U+002bec: */
- 0, /* U+002bed: */
- 0, /* U+002bee: */
- 0, /* U+002bef: */
- 0, /* U+002bf0: */
- 0, /* U+002bf1: */
- 0, /* U+002bf2: */
- 0, /* U+002bf3: */
- 0, /* U+002bf4: */
- 0, /* U+002bf5: */
- 0, /* U+002bf6: */
- 0, /* U+002bf7: */
- 0, /* U+002bf8: */
- 0, /* U+002bf9: */
- 0, /* U+002bfa: */
- 0, /* U+002bfb: */
- 0, /* U+002bfc: */
- 0, /* U+002bfd: */
- 0, /* U+002bfe: */
- 0, /* U+002bff: */
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002c00: GLAGOLITIC CAPITAL LETTER AZU*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002c01: GLAGOLITIC CAPITAL LETTER BUKY*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002c02: GLAGOLITIC CAPITAL LETTER VEDE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002c03: GLAGOLITIC CAPITAL LETTER GLAGOLI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002c04: GLAGOLITIC CAPITAL LETTER DOBRO*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002c05: GLAGOLITIC CAPITAL LETTER YESTU*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002c06: GLAGOLITIC CAPITAL LETTER ZHIVETE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002c07: GLAGOLITIC CAPITAL LETTER DZELO*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002c08: GLAGOLITIC CAPITAL LETTER ZEMLJA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002c09: GLAGOLITIC CAPITAL LETTER IZHE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002c0a: GLAGOLITIC CAPITAL LETTER INITIAL IZHE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002c0b: GLAGOLITIC CAPITAL LETTER I*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002c0c: GLAGOLITIC CAPITAL LETTER DJERVI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002c0d: GLAGOLITIC CAPITAL LETTER KAKO*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002c0e: GLAGOLITIC CAPITAL LETTER LJUDIJE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002c0f: GLAGOLITIC CAPITAL LETTER MYSLITE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002c10: GLAGOLITIC CAPITAL LETTER NASHI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002c11: GLAGOLITIC CAPITAL LETTER ONU*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002c12: GLAGOLITIC CAPITAL LETTER POKOJI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002c13: GLAGOLITIC CAPITAL LETTER RITSI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002c14: GLAGOLITIC CAPITAL LETTER SLOVO*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002c15: GLAGOLITIC CAPITAL LETTER TVRIDO*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002c16: GLAGOLITIC CAPITAL LETTER UKU*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002c17: GLAGOLITIC CAPITAL LETTER FRITU*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002c18: GLAGOLITIC CAPITAL LETTER HERU*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002c19: GLAGOLITIC CAPITAL LETTER OTU*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002c1a: GLAGOLITIC CAPITAL LETTER PE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002c1b: GLAGOLITIC CAPITAL LETTER SHTA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002c1c: GLAGOLITIC CAPITAL LETTER TSI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002c1d: GLAGOLITIC CAPITAL LETTER CHRIVI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002c1e: GLAGOLITIC CAPITAL LETTER SHA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002c1f: GLAGOLITIC CAPITAL LETTER YERU*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002c20: GLAGOLITIC CAPITAL LETTER YERI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002c21: GLAGOLITIC CAPITAL LETTER YATI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002c22: GLAGOLITIC CAPITAL LETTER SPIDERY HA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002c23: GLAGOLITIC CAPITAL LETTER YU*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002c24: GLAGOLITIC CAPITAL LETTER SMALL YUS*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002c25: GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002c26: GLAGOLITIC CAPITAL LETTER YO*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002c27: GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002c28: GLAGOLITIC CAPITAL LETTER BIG YUS*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002c29: GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002c2a: GLAGOLITIC CAPITAL LETTER FITA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002c2b: GLAGOLITIC CAPITAL LETTER IZHITSA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002c2c: GLAGOLITIC CAPITAL LETTER SHTAPIC*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002c2d: GLAGOLITIC CAPITAL LETTER TROKUTASTI A*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002c2e: GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE*/
- 0, /* U+002c2f: */
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002c30: GLAGOLITIC SMALL LETTER AZU*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002c31: GLAGOLITIC SMALL LETTER BUKY*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002c32: GLAGOLITIC SMALL LETTER VEDE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002c33: GLAGOLITIC SMALL LETTER GLAGOLI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002c34: GLAGOLITIC SMALL LETTER DOBRO*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002c35: GLAGOLITIC SMALL LETTER YESTU*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002c36: GLAGOLITIC SMALL LETTER ZHIVETE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002c37: GLAGOLITIC SMALL LETTER DZELO*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002c38: GLAGOLITIC SMALL LETTER ZEMLJA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002c39: GLAGOLITIC SMALL LETTER IZHE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002c3a: GLAGOLITIC SMALL LETTER INITIAL IZHE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002c3b: GLAGOLITIC SMALL LETTER I*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002c3c: GLAGOLITIC SMALL LETTER DJERVI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002c3d: GLAGOLITIC SMALL LETTER KAKO*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002c3e: GLAGOLITIC SMALL LETTER LJUDIJE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002c3f: GLAGOLITIC SMALL LETTER MYSLITE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002c40: GLAGOLITIC SMALL LETTER NASHI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002c41: GLAGOLITIC SMALL LETTER ONU*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002c42: GLAGOLITIC SMALL LETTER POKOJI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002c43: GLAGOLITIC SMALL LETTER RITSI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002c44: GLAGOLITIC SMALL LETTER SLOVO*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002c45: GLAGOLITIC SMALL LETTER TVRIDO*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002c46: GLAGOLITIC SMALL LETTER UKU*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002c47: GLAGOLITIC SMALL LETTER FRITU*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002c48: GLAGOLITIC SMALL LETTER HERU*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002c49: GLAGOLITIC SMALL LETTER OTU*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002c4a: GLAGOLITIC SMALL LETTER PE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002c4b: GLAGOLITIC SMALL LETTER SHTA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002c4c: GLAGOLITIC SMALL LETTER TSI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002c4d: GLAGOLITIC SMALL LETTER CHRIVI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002c4e: GLAGOLITIC SMALL LETTER SHA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002c4f: GLAGOLITIC SMALL LETTER YERU*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002c50: GLAGOLITIC SMALL LETTER YERI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002c51: GLAGOLITIC SMALL LETTER YATI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002c52: GLAGOLITIC SMALL LETTER SPIDERY HA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002c53: GLAGOLITIC SMALL LETTER YU*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002c54: GLAGOLITIC SMALL LETTER SMALL YUS*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002c55: GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002c56: GLAGOLITIC SMALL LETTER YO*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002c57: GLAGOLITIC SMALL LETTER IOTATED SMALL YUS*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002c58: GLAGOLITIC SMALL LETTER BIG YUS*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002c59: GLAGOLITIC SMALL LETTER IOTATED BIG YUS*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002c5a: GLAGOLITIC SMALL LETTER FITA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002c5b: GLAGOLITIC SMALL LETTER IZHITSA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002c5c: GLAGOLITIC SMALL LETTER SHTAPIC*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002c5d: GLAGOLITIC SMALL LETTER TROKUTASTI A*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002c5e: GLAGOLITIC SMALL LETTER LATINATE MYSLITE*/
- 0, /* U+002c5f: */
- 0, /* U+002c60: */
- 0, /* U+002c61: */
- 0, /* U+002c62: */
- 0, /* U+002c63: */
- 0, /* U+002c64: */
- 0, /* U+002c65: */
- 0, /* U+002c66: */
- 0, /* U+002c67: */
- 0, /* U+002c68: */
- 0, /* U+002c69: */
- 0, /* U+002c6a: */
- 0, /* U+002c6b: */
- 0, /* U+002c6c: */
- 0, /* U+002c6d: */
- 0, /* U+002c6e: */
- 0, /* U+002c6f: */
- 0, /* U+002c70: */
- 0, /* U+002c71: */
- 0, /* U+002c72: */
- 0, /* U+002c73: */
- 0, /* U+002c74: */
- 0, /* U+002c75: */
- 0, /* U+002c76: */
- 0, /* U+002c77: */
- 0, /* U+002c78: */
- 0, /* U+002c79: */
- 0, /* U+002c7a: */
- 0, /* U+002c7b: */
- 0, /* U+002c7c: */
- 0, /* U+002c7d: */
- 0, /* U+002c7e: */
- 0, /* U+002c7f: */
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002c80: COPTIC CAPITAL LETTER ALFA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002c81: COPTIC SMALL LETTER ALFA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002c82: COPTIC CAPITAL LETTER VIDA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002c83: COPTIC SMALL LETTER VIDA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002c84: COPTIC CAPITAL LETTER GAMMA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002c85: COPTIC SMALL LETTER GAMMA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002c86: COPTIC CAPITAL LETTER DALDA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002c87: COPTIC SMALL LETTER DALDA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002c88: COPTIC CAPITAL LETTER EIE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002c89: COPTIC SMALL LETTER EIE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002c8a: COPTIC CAPITAL LETTER SOU*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002c8b: COPTIC SMALL LETTER SOU*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002c8c: COPTIC CAPITAL LETTER ZATA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002c8d: COPTIC SMALL LETTER ZATA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002c8e: COPTIC CAPITAL LETTER HATE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002c8f: COPTIC SMALL LETTER HATE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002c90: COPTIC CAPITAL LETTER THETHE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002c91: COPTIC SMALL LETTER THETHE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002c92: COPTIC CAPITAL LETTER IAUDA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002c93: COPTIC SMALL LETTER IAUDA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002c94: COPTIC CAPITAL LETTER KAPA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002c95: COPTIC SMALL LETTER KAPA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002c96: COPTIC CAPITAL LETTER LAULA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002c97: COPTIC SMALL LETTER LAULA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002c98: COPTIC CAPITAL LETTER MI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002c99: COPTIC SMALL LETTER MI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002c9a: COPTIC CAPITAL LETTER NI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002c9b: COPTIC SMALL LETTER NI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002c9c: COPTIC CAPITAL LETTER KSI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002c9d: COPTIC SMALL LETTER KSI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002c9e: COPTIC CAPITAL LETTER O*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002c9f: COPTIC SMALL LETTER O*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002ca0: COPTIC CAPITAL LETTER PI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002ca1: COPTIC SMALL LETTER PI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002ca2: COPTIC CAPITAL LETTER RO*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002ca3: COPTIC SMALL LETTER RO*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002ca4: COPTIC CAPITAL LETTER SIMA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002ca5: COPTIC SMALL LETTER SIMA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002ca6: COPTIC CAPITAL LETTER TAU*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002ca7: COPTIC SMALL LETTER TAU*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002ca8: COPTIC CAPITAL LETTER UA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002ca9: COPTIC SMALL LETTER UA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002caa: COPTIC CAPITAL LETTER FI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002cab: COPTIC SMALL LETTER FI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002cac: COPTIC CAPITAL LETTER KHI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002cad: COPTIC SMALL LETTER KHI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002cae: COPTIC CAPITAL LETTER PSI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002caf: COPTIC SMALL LETTER PSI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002cb0: COPTIC CAPITAL LETTER OOU*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002cb1: COPTIC SMALL LETTER OOU*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002cb2: COPTIC CAPITAL LETTER DIALECT-P ALEF*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002cb3: COPTIC SMALL LETTER DIALECT-P ALEF*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002cb4: COPTIC CAPITAL LETTER OLD COPTIC AIN*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002cb5: COPTIC SMALL LETTER OLD COPTIC AIN*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002cb6: COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002cb7: COPTIC SMALL LETTER CRYPTOGRAMMIC EIE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002cb8: COPTIC CAPITAL LETTER DIALECT-P KAPA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002cb9: COPTIC SMALL LETTER DIALECT-P KAPA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002cba: COPTIC CAPITAL LETTER DIALECT-P NI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002cbb: COPTIC SMALL LETTER DIALECT-P NI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002cbc: COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002cbd: COPTIC SMALL LETTER CRYPTOGRAMMIC NI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002cbe: COPTIC CAPITAL LETTER OLD COPTIC OOU*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002cbf: COPTIC SMALL LETTER OLD COPTIC OOU*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002cc0: COPTIC CAPITAL LETTER SAMPI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002cc1: COPTIC SMALL LETTER SAMPI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002cc2: COPTIC CAPITAL LETTER CROSSED SHEI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002cc3: COPTIC SMALL LETTER CROSSED SHEI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002cc4: COPTIC CAPITAL LETTER OLD COPTIC SHEI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002cc5: COPTIC SMALL LETTER OLD COPTIC SHEI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002cc6: COPTIC CAPITAL LETTER OLD COPTIC ESH*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002cc7: COPTIC SMALL LETTER OLD COPTIC ESH*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002cc8: COPTIC CAPITAL LETTER AKHMIMIC KHEI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002cc9: COPTIC SMALL LETTER AKHMIMIC KHEI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002cca: COPTIC CAPITAL LETTER DIALECT-P HORI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002ccb: COPTIC SMALL LETTER DIALECT-P HORI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002ccc: COPTIC CAPITAL LETTER OLD COPTIC HORI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002ccd: COPTIC SMALL LETTER OLD COPTIC HORI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002cce: COPTIC CAPITAL LETTER OLD COPTIC HA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002ccf: COPTIC SMALL LETTER OLD COPTIC HA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002cd0: COPTIC CAPITAL LETTER L-SHAPED HA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002cd1: COPTIC SMALL LETTER L-SHAPED HA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002cd2: COPTIC CAPITAL LETTER OLD COPTIC HEI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002cd3: COPTIC SMALL LETTER OLD COPTIC HEI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002cd4: COPTIC CAPITAL LETTER OLD COPTIC HAT*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002cd5: COPTIC SMALL LETTER OLD COPTIC HAT*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002cd6: COPTIC CAPITAL LETTER OLD COPTIC GANGIA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002cd7: COPTIC SMALL LETTER OLD COPTIC GANGIA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002cd8: COPTIC CAPITAL LETTER OLD COPTIC DJA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002cd9: COPTIC SMALL LETTER OLD COPTIC DJA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002cda: COPTIC CAPITAL LETTER OLD COPTIC SHIMA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002cdb: COPTIC SMALL LETTER OLD COPTIC SHIMA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002cdc: COPTIC CAPITAL LETTER OLD NUBIAN SHIMA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002cdd: COPTIC SMALL LETTER OLD NUBIAN SHIMA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002cde: COPTIC CAPITAL LETTER OLD NUBIAN NGI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002cdf: COPTIC SMALL LETTER OLD NUBIAN NGI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002ce0: COPTIC CAPITAL LETTER OLD NUBIAN NYI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002ce1: COPTIC SMALL LETTER OLD NUBIAN NYI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+002ce2: COPTIC CAPITAL LETTER OLD NUBIAN WAU*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002ce3: COPTIC SMALL LETTER OLD NUBIAN WAU*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002ce4: COPTIC SYMBOL KAI*/
- 0, /* U+002ce5: COPTIC SYMBOL MI RO*/
- 0, /* U+002ce6: COPTIC SYMBOL PI RO*/
- 0, /* U+002ce7: COPTIC SYMBOL STAUROS*/
- 0, /* U+002ce8: COPTIC SYMBOL TAU RO*/
- 0, /* U+002ce9: COPTIC SYMBOL KHI RO*/
- 0, /* U+002cea: COPTIC SYMBOL SHIMA SIMA*/
- 0, /* U+002ceb: */
- 0, /* U+002cec: */
- 0, /* U+002ced: */
- 0, /* U+002cee: */
- 0, /* U+002cef: */
- 0, /* U+002cf0: */
- 0, /* U+002cf1: */
- 0, /* U+002cf2: */
- 0, /* U+002cf3: */
- 0, /* U+002cf4: */
- 0, /* U+002cf5: */
- 0, /* U+002cf6: */
- 0, /* U+002cf7: */
- 0, /* U+002cf8: */
- 0, /* U+002cf9: COPTIC OLD NUBIAN FULL STOP*/
- 0, /* U+002cfa: COPTIC OLD NUBIAN DIRECT QUESTION MARK*/
- 0, /* U+002cfb: COPTIC OLD NUBIAN INDIRECT QUESTION MARK*/
- 0, /* U+002cfc: COPTIC OLD NUBIAN VERSE DIVIDER*/
- 0, /* U+002cfd: COPTIC FRACTION ONE HALF*/
- 0, /* U+002cfe: COPTIC FULL STOP*/
- 0, /* U+002cff: COPTIC MORPHOLOGICAL DIVIDER*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002d00: GEORGIAN SMALL LETTER AN*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002d01: GEORGIAN SMALL LETTER BAN*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002d02: GEORGIAN SMALL LETTER GAN*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002d03: GEORGIAN SMALL LETTER DON*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002d04: GEORGIAN SMALL LETTER EN*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002d05: GEORGIAN SMALL LETTER VIN*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002d06: GEORGIAN SMALL LETTER ZEN*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002d07: GEORGIAN SMALL LETTER TAN*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002d08: GEORGIAN SMALL LETTER IN*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002d09: GEORGIAN SMALL LETTER KAN*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002d0a: GEORGIAN SMALL LETTER LAS*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002d0b: GEORGIAN SMALL LETTER MAN*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002d0c: GEORGIAN SMALL LETTER NAR*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002d0d: GEORGIAN SMALL LETTER ON*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002d0e: GEORGIAN SMALL LETTER PAR*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002d0f: GEORGIAN SMALL LETTER ZHAR*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002d10: GEORGIAN SMALL LETTER RAE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002d11: GEORGIAN SMALL LETTER SAN*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002d12: GEORGIAN SMALL LETTER TAR*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002d13: GEORGIAN SMALL LETTER UN*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002d14: GEORGIAN SMALL LETTER PHAR*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002d15: GEORGIAN SMALL LETTER KHAR*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002d16: GEORGIAN SMALL LETTER GHAN*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002d17: GEORGIAN SMALL LETTER QAR*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002d18: GEORGIAN SMALL LETTER SHIN*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002d19: GEORGIAN SMALL LETTER CHIN*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002d1a: GEORGIAN SMALL LETTER CAN*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002d1b: GEORGIAN SMALL LETTER JIL*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002d1c: GEORGIAN SMALL LETTER CIL*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002d1d: GEORGIAN SMALL LETTER CHAR*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002d1e: GEORGIAN SMALL LETTER XAN*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002d1f: GEORGIAN SMALL LETTER JHAN*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002d20: GEORGIAN SMALL LETTER HAE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002d21: GEORGIAN SMALL LETTER HE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002d22: GEORGIAN SMALL LETTER HIE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002d23: GEORGIAN SMALL LETTER WE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002d24: GEORGIAN SMALL LETTER HAR*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+002d25: GEORGIAN SMALL LETTER HOE*/
- 0, /* U+002d26: */
- 0, /* U+002d27: */
- 0, /* U+002d28: */
- 0, /* U+002d29: */
- 0, /* U+002d2a: */
- 0, /* U+002d2b: */
- 0, /* U+002d2c: */
- 0, /* U+002d2d: */
- 0, /* U+002d2e: */
- 0, /* U+002d2f: */
- RTUNI_ALPHA, /* U+002d30: TIFINAGH LETTER YA*/
- RTUNI_ALPHA, /* U+002d31: TIFINAGH LETTER YAB*/
- RTUNI_ALPHA, /* U+002d32: TIFINAGH LETTER YABH*/
- RTUNI_ALPHA, /* U+002d33: TIFINAGH LETTER YAG*/
- RTUNI_ALPHA, /* U+002d34: TIFINAGH LETTER YAGHH*/
- RTUNI_ALPHA, /* U+002d35: TIFINAGH LETTER BERBER ACADEMY YAJ*/
- RTUNI_ALPHA, /* U+002d36: TIFINAGH LETTER YAJ*/
- RTUNI_ALPHA, /* U+002d37: TIFINAGH LETTER YAD*/
- RTUNI_ALPHA, /* U+002d38: TIFINAGH LETTER YADH*/
- RTUNI_ALPHA, /* U+002d39: TIFINAGH LETTER YADD*/
- RTUNI_ALPHA, /* U+002d3a: TIFINAGH LETTER YADDH*/
- RTUNI_ALPHA, /* U+002d3b: TIFINAGH LETTER YEY*/
- RTUNI_ALPHA, /* U+002d3c: TIFINAGH LETTER YAF*/
- RTUNI_ALPHA, /* U+002d3d: TIFINAGH LETTER YAK*/
- RTUNI_ALPHA, /* U+002d3e: TIFINAGH LETTER TUAREG YAK*/
- RTUNI_ALPHA, /* U+002d3f: TIFINAGH LETTER YAKHH*/
- RTUNI_ALPHA, /* U+002d40: TIFINAGH LETTER YAH*/
- RTUNI_ALPHA, /* U+002d41: TIFINAGH LETTER BERBER ACADEMY YAH*/
- RTUNI_ALPHA, /* U+002d42: TIFINAGH LETTER TUAREG YAH*/
- RTUNI_ALPHA, /* U+002d43: TIFINAGH LETTER YAHH*/
- RTUNI_ALPHA, /* U+002d44: TIFINAGH LETTER YAA*/
- RTUNI_ALPHA, /* U+002d45: TIFINAGH LETTER YAKH*/
- RTUNI_ALPHA, /* U+002d46: TIFINAGH LETTER TUAREG YAKH*/
- RTUNI_ALPHA, /* U+002d47: TIFINAGH LETTER YAQ*/
- RTUNI_ALPHA, /* U+002d48: TIFINAGH LETTER TUAREG YAQ*/
- RTUNI_ALPHA, /* U+002d49: TIFINAGH LETTER YI*/
- RTUNI_ALPHA, /* U+002d4a: TIFINAGH LETTER YAZH*/
- RTUNI_ALPHA, /* U+002d4b: TIFINAGH LETTER AHAGGAR YAZH*/
- RTUNI_ALPHA, /* U+002d4c: TIFINAGH LETTER TUAREG YAZH*/
- RTUNI_ALPHA, /* U+002d4d: TIFINAGH LETTER YAL*/
- RTUNI_ALPHA, /* U+002d4e: TIFINAGH LETTER YAM*/
- RTUNI_ALPHA, /* U+002d4f: TIFINAGH LETTER YAN*/
- RTUNI_ALPHA, /* U+002d50: TIFINAGH LETTER TUAREG YAGN*/
- RTUNI_ALPHA, /* U+002d51: TIFINAGH LETTER TUAREG YANG*/
- RTUNI_ALPHA, /* U+002d52: TIFINAGH LETTER YAP*/
- RTUNI_ALPHA, /* U+002d53: TIFINAGH LETTER YU*/
- RTUNI_ALPHA, /* U+002d54: TIFINAGH LETTER YAR*/
- RTUNI_ALPHA, /* U+002d55: TIFINAGH LETTER YARR*/
- RTUNI_ALPHA, /* U+002d56: TIFINAGH LETTER YAGH*/
- RTUNI_ALPHA, /* U+002d57: TIFINAGH LETTER TUAREG YAGH*/
- RTUNI_ALPHA, /* U+002d58: TIFINAGH LETTER AYER YAGH*/
- RTUNI_ALPHA, /* U+002d59: TIFINAGH LETTER YAS*/
- RTUNI_ALPHA, /* U+002d5a: TIFINAGH LETTER YASS*/
- RTUNI_ALPHA, /* U+002d5b: TIFINAGH LETTER YASH*/
- RTUNI_ALPHA, /* U+002d5c: TIFINAGH LETTER YAT*/
- RTUNI_ALPHA, /* U+002d5d: TIFINAGH LETTER YATH*/
- RTUNI_ALPHA, /* U+002d5e: TIFINAGH LETTER YACH*/
- RTUNI_ALPHA, /* U+002d5f: TIFINAGH LETTER YATT*/
- RTUNI_ALPHA, /* U+002d60: TIFINAGH LETTER YAV*/
- RTUNI_ALPHA, /* U+002d61: TIFINAGH LETTER YAW*/
- RTUNI_ALPHA, /* U+002d62: TIFINAGH LETTER YAY*/
- RTUNI_ALPHA, /* U+002d63: TIFINAGH LETTER YAZ*/
- RTUNI_ALPHA, /* U+002d64: TIFINAGH LETTER TAWELLEMET YAZ*/
- RTUNI_ALPHA, /* U+002d65: TIFINAGH LETTER YAZZ*/
- 0, /* U+002d66: */
- 0, /* U+002d67: */
- 0, /* U+002d68: */
- 0, /* U+002d69: */
- 0, /* U+002d6a: */
- 0, /* U+002d6b: */
- 0, /* U+002d6c: */
- 0, /* U+002d6d: */
- 0, /* U+002d6e: */
- RTUNI_ALPHA, /* U+002d6f: TIFINAGH MODIFIER LETTER LABIALIZATION MARK*/
- 0, /* U+002d70: */
- 0, /* U+002d71: */
- 0, /* U+002d72: */
- 0, /* U+002d73: */
- 0, /* U+002d74: */
- 0, /* U+002d75: */
- 0, /* U+002d76: */
- 0, /* U+002d77: */
- 0, /* U+002d78: */
- 0, /* U+002d79: */
- 0, /* U+002d7a: */
- 0, /* U+002d7b: */
- 0, /* U+002d7c: */
- 0, /* U+002d7d: */
- 0, /* U+002d7e: */
- 0, /* U+002d7f: */
- RTUNI_ALPHA, /* U+002d80: ETHIOPIC SYLLABLE LOA*/
- RTUNI_ALPHA, /* U+002d81: ETHIOPIC SYLLABLE MOA*/
- RTUNI_ALPHA, /* U+002d82: ETHIOPIC SYLLABLE ROA*/
- RTUNI_ALPHA, /* U+002d83: ETHIOPIC SYLLABLE SOA*/
- RTUNI_ALPHA, /* U+002d84: ETHIOPIC SYLLABLE SHOA*/
- RTUNI_ALPHA, /* U+002d85: ETHIOPIC SYLLABLE BOA*/
- RTUNI_ALPHA, /* U+002d86: ETHIOPIC SYLLABLE TOA*/
- RTUNI_ALPHA, /* U+002d87: ETHIOPIC SYLLABLE COA*/
- RTUNI_ALPHA, /* U+002d88: ETHIOPIC SYLLABLE NOA*/
- RTUNI_ALPHA, /* U+002d89: ETHIOPIC SYLLABLE NYOA*/
- RTUNI_ALPHA, /* U+002d8a: ETHIOPIC SYLLABLE GLOTTAL OA*/
- RTUNI_ALPHA, /* U+002d8b: ETHIOPIC SYLLABLE ZOA*/
- RTUNI_ALPHA, /* U+002d8c: ETHIOPIC SYLLABLE DOA*/
- RTUNI_ALPHA, /* U+002d8d: ETHIOPIC SYLLABLE DDOA*/
- RTUNI_ALPHA, /* U+002d8e: ETHIOPIC SYLLABLE JOA*/
- RTUNI_ALPHA, /* U+002d8f: ETHIOPIC SYLLABLE THOA*/
- RTUNI_ALPHA, /* U+002d90: ETHIOPIC SYLLABLE CHOA*/
- RTUNI_ALPHA, /* U+002d91: ETHIOPIC SYLLABLE PHOA*/
- RTUNI_ALPHA, /* U+002d92: ETHIOPIC SYLLABLE POA*/
- RTUNI_ALPHA, /* U+002d93: ETHIOPIC SYLLABLE GGWA*/
- RTUNI_ALPHA, /* U+002d94: ETHIOPIC SYLLABLE GGWI*/
- RTUNI_ALPHA, /* U+002d95: ETHIOPIC SYLLABLE GGWEE*/
- RTUNI_ALPHA, /* U+002d96: ETHIOPIC SYLLABLE GGWE*/
- 0, /* U+002d97: */
- 0, /* U+002d98: */
- 0, /* U+002d99: */
- 0, /* U+002d9a: */
- 0, /* U+002d9b: */
- 0, /* U+002d9c: */
- 0, /* U+002d9d: */
- 0, /* U+002d9e: */
- 0, /* U+002d9f: */
- RTUNI_ALPHA, /* U+002da0: ETHIOPIC SYLLABLE SSA*/
- RTUNI_ALPHA, /* U+002da1: ETHIOPIC SYLLABLE SSU*/
- RTUNI_ALPHA, /* U+002da2: ETHIOPIC SYLLABLE SSI*/
- RTUNI_ALPHA, /* U+002da3: ETHIOPIC SYLLABLE SSAA*/
- RTUNI_ALPHA, /* U+002da4: ETHIOPIC SYLLABLE SSEE*/
- RTUNI_ALPHA, /* U+002da5: ETHIOPIC SYLLABLE SSE*/
- RTUNI_ALPHA, /* U+002da6: ETHIOPIC SYLLABLE SSO*/
- 0, /* U+002da7: */
- RTUNI_ALPHA, /* U+002da8: ETHIOPIC SYLLABLE CCA*/
- RTUNI_ALPHA, /* U+002da9: ETHIOPIC SYLLABLE CCU*/
- RTUNI_ALPHA, /* U+002daa: ETHIOPIC SYLLABLE CCI*/
- RTUNI_ALPHA, /* U+002dab: ETHIOPIC SYLLABLE CCAA*/
- RTUNI_ALPHA, /* U+002dac: ETHIOPIC SYLLABLE CCEE*/
- RTUNI_ALPHA, /* U+002dad: ETHIOPIC SYLLABLE CCE*/
- RTUNI_ALPHA, /* U+002dae: ETHIOPIC SYLLABLE CCO*/
- 0, /* U+002daf: */
- RTUNI_ALPHA, /* U+002db0: ETHIOPIC SYLLABLE ZZA*/
- RTUNI_ALPHA, /* U+002db1: ETHIOPIC SYLLABLE ZZU*/
- RTUNI_ALPHA, /* U+002db2: ETHIOPIC SYLLABLE ZZI*/
- RTUNI_ALPHA, /* U+002db3: ETHIOPIC SYLLABLE ZZAA*/
- RTUNI_ALPHA, /* U+002db4: ETHIOPIC SYLLABLE ZZEE*/
- RTUNI_ALPHA, /* U+002db5: ETHIOPIC SYLLABLE ZZE*/
- RTUNI_ALPHA, /* U+002db6: ETHIOPIC SYLLABLE ZZO*/
- 0, /* U+002db7: */
- RTUNI_ALPHA, /* U+002db8: ETHIOPIC SYLLABLE CCHA*/
- RTUNI_ALPHA, /* U+002db9: ETHIOPIC SYLLABLE CCHU*/
- RTUNI_ALPHA, /* U+002dba: ETHIOPIC SYLLABLE CCHI*/
- RTUNI_ALPHA, /* U+002dbb: ETHIOPIC SYLLABLE CCHAA*/
- RTUNI_ALPHA, /* U+002dbc: ETHIOPIC SYLLABLE CCHEE*/
- RTUNI_ALPHA, /* U+002dbd: ETHIOPIC SYLLABLE CCHE*/
- RTUNI_ALPHA, /* U+002dbe: ETHIOPIC SYLLABLE CCHO*/
- 0, /* U+002dbf: */
- RTUNI_ALPHA, /* U+002dc0: ETHIOPIC SYLLABLE QYA*/
- RTUNI_ALPHA, /* U+002dc1: ETHIOPIC SYLLABLE QYU*/
- RTUNI_ALPHA, /* U+002dc2: ETHIOPIC SYLLABLE QYI*/
- RTUNI_ALPHA, /* U+002dc3: ETHIOPIC SYLLABLE QYAA*/
- RTUNI_ALPHA, /* U+002dc4: ETHIOPIC SYLLABLE QYEE*/
- RTUNI_ALPHA, /* U+002dc5: ETHIOPIC SYLLABLE QYE*/
- RTUNI_ALPHA, /* U+002dc6: ETHIOPIC SYLLABLE QYO*/
- 0, /* U+002dc7: */
- RTUNI_ALPHA, /* U+002dc8: ETHIOPIC SYLLABLE KYA*/
- RTUNI_ALPHA, /* U+002dc9: ETHIOPIC SYLLABLE KYU*/
- RTUNI_ALPHA, /* U+002dca: ETHIOPIC SYLLABLE KYI*/
- RTUNI_ALPHA, /* U+002dcb: ETHIOPIC SYLLABLE KYAA*/
- RTUNI_ALPHA, /* U+002dcc: ETHIOPIC SYLLABLE KYEE*/
- RTUNI_ALPHA, /* U+002dcd: ETHIOPIC SYLLABLE KYE*/
- RTUNI_ALPHA, /* U+002dce: ETHIOPIC SYLLABLE KYO*/
- 0, /* U+002dcf: */
- RTUNI_ALPHA, /* U+002dd0: ETHIOPIC SYLLABLE XYA*/
- RTUNI_ALPHA, /* U+002dd1: ETHIOPIC SYLLABLE XYU*/
- RTUNI_ALPHA, /* U+002dd2: ETHIOPIC SYLLABLE XYI*/
- RTUNI_ALPHA, /* U+002dd3: ETHIOPIC SYLLABLE XYAA*/
- RTUNI_ALPHA, /* U+002dd4: ETHIOPIC SYLLABLE XYEE*/
- RTUNI_ALPHA, /* U+002dd5: ETHIOPIC SYLLABLE XYE*/
- RTUNI_ALPHA, /* U+002dd6: ETHIOPIC SYLLABLE XYO*/
- 0, /* U+002dd7: */
- RTUNI_ALPHA, /* U+002dd8: ETHIOPIC SYLLABLE GYA*/
- RTUNI_ALPHA, /* U+002dd9: ETHIOPIC SYLLABLE GYU*/
- RTUNI_ALPHA, /* U+002dda: ETHIOPIC SYLLABLE GYI*/
- RTUNI_ALPHA, /* U+002ddb: ETHIOPIC SYLLABLE GYAA*/
- RTUNI_ALPHA, /* U+002ddc: ETHIOPIC SYLLABLE GYEE*/
- RTUNI_ALPHA, /* U+002ddd: ETHIOPIC SYLLABLE GYE*/
- RTUNI_ALPHA, /* U+002dde: ETHIOPIC SYLLABLE GYO*/
- 0, /* U+002ddf: */
- 0, /* U+002de0: */
- 0, /* U+002de1: */
- 0, /* U+002de2: */
- 0, /* U+002de3: */
- 0, /* U+002de4: */
- 0, /* U+002de5: */
- 0, /* U+002de6: */
- 0, /* U+002de7: */
- 0, /* U+002de8: */
- 0, /* U+002de9: */
- 0, /* U+002dea: */
- 0, /* U+002deb: */
- 0, /* U+002dec: */
- 0, /* U+002ded: */
- 0, /* U+002dee: */
- 0, /* U+002def: */
- 0, /* U+002df0: */
- 0, /* U+002df1: */
- 0, /* U+002df2: */
- 0, /* U+002df3: */
- 0, /* U+002df4: */
- 0, /* U+002df5: */
- 0, /* U+002df6: */
- 0, /* U+002df7: */
- 0, /* U+002df8: */
- 0, /* U+002df9: */
- 0, /* U+002dfa: */
- 0, /* U+002dfb: */
- 0, /* U+002dfc: */
- 0, /* U+002dfd: */
- 0, /* U+002dfe: */
- 0, /* U+002dff: */
- 0, /* U+002e00: RIGHT ANGLE SUBSTITUTION MARKER*/
- 0, /* U+002e01: RIGHT ANGLE DOTTED SUBSTITUTION MARKER*/
- 0, /* U+002e02: LEFT SUBSTITUTION BRACKET*/
- 0, /* U+002e03: RIGHT SUBSTITUTION BRACKET*/
- 0, /* U+002e04: LEFT DOTTED SUBSTITUTION BRACKET*/
- 0, /* U+002e05: RIGHT DOTTED SUBSTITUTION BRACKET*/
- 0, /* U+002e06: RAISED INTERPOLATION MARKER*/
- 0, /* U+002e07: RAISED DOTTED INTERPOLATION MARKER*/
- 0, /* U+002e08: DOTTED TRANSPOSITION MARKER*/
- 0, /* U+002e09: LEFT TRANSPOSITION BRACKET*/
- 0, /* U+002e0a: RIGHT TRANSPOSITION BRACKET*/
- 0, /* U+002e0b: RAISED SQUARE*/
- 0, /* U+002e0c: LEFT RAISED OMISSION BRACKET*/
- 0, /* U+002e0d: RIGHT RAISED OMISSION BRACKET*/
- 0, /* U+002e0e: EDITORIAL CORONIS*/
- 0, /* U+002e0f: PARAGRAPHOS*/
- 0, /* U+002e10: FORKED PARAGRAPHOS*/
- 0, /* U+002e11: REVERSED FORKED PARAGRAPHOS*/
- 0, /* U+002e12: HYPODIASTOLE*/
- 0, /* U+002e13: DOTTED OBELOS*/
- 0, /* U+002e14: DOWNWARDS ANCORA*/
- 0, /* U+002e15: UPWARDS ANCORA*/
- 0, /* U+002e16: DOTTED RIGHT-POINTING ANGLE*/
- 0, /* U+002e17: DOUBLE OBLIQUE HYPHEN*/
- 0, /* U+002e18: */
- 0, /* U+002e19: */
- 0, /* U+002e1a: */
- 0, /* U+002e1b: */
- 0, /* U+002e1c: LEFT LOW PARAPHRASE BRACKET*/
- 0, /* U+002e1d: RIGHT LOW PARAPHRASE BRACKET*/
- 0, /* U+002e1e: */
- 0, /* U+002e1f: */
- 0, /* U+002e20: */
- 0, /* U+002e21: */
- 0, /* U+002e22: */
- 0, /* U+002e23: */
- 0, /* U+002e24: */
- 0, /* U+002e25: */
- 0, /* U+002e26: */
- 0, /* U+002e27: */
- 0, /* U+002e28: */
- 0, /* U+002e29: */
- 0, /* U+002e2a: */
- 0, /* U+002e2b: */
- 0, /* U+002e2c: */
- 0, /* U+002e2d: */
- 0, /* U+002e2e: */
- 0, /* U+002e2f: */
- 0, /* U+002e30: */
- 0, /* U+002e31: */
- 0, /* U+002e32: */
- 0, /* U+002e33: */
- 0, /* U+002e34: */
- 0, /* U+002e35: */
- 0, /* U+002e36: */
- 0, /* U+002e37: */
- 0, /* U+002e38: */
- 0, /* U+002e39: */
- 0, /* U+002e3a: */
- 0, /* U+002e3b: */
- 0, /* U+002e3c: */
- 0, /* U+002e3d: */
- 0, /* U+002e3e: */
- 0, /* U+002e3f: */
- 0, /* U+002e40: */
- 0, /* U+002e41: */
- 0, /* U+002e42: */
- 0, /* U+002e43: */
- 0, /* U+002e44: */
- 0, /* U+002e45: */
- 0, /* U+002e46: */
- 0, /* U+002e47: */
- 0, /* U+002e48: */
- 0, /* U+002e49: */
- 0, /* U+002e4a: */
- 0, /* U+002e4b: */
- 0, /* U+002e4c: */
- 0, /* U+002e4d: */
- 0, /* U+002e4e: */
- 0, /* U+002e4f: */
- 0, /* U+002e50: */
- 0, /* U+002e51: */
- 0, /* U+002e52: */
- 0, /* U+002e53: */
- 0, /* U+002e54: */
- 0, /* U+002e55: */
- 0, /* U+002e56: */
- 0, /* U+002e57: */
- 0, /* U+002e58: */
- 0, /* U+002e59: */
- 0, /* U+002e5a: */
- 0, /* U+002e5b: */
- 0, /* U+002e5c: */
- 0, /* U+002e5d: */
- 0, /* U+002e5e: */
- 0, /* U+002e5f: */
- 0, /* U+002e60: */
- 0, /* U+002e61: */
- 0, /* U+002e62: */
- 0, /* U+002e63: */
- 0, /* U+002e64: */
- 0, /* U+002e65: */
- 0, /* U+002e66: */
- 0, /* U+002e67: */
- 0, /* U+002e68: */
- 0, /* U+002e69: */
- 0, /* U+002e6a: */
- 0, /* U+002e6b: */
- 0, /* U+002e6c: */
- 0, /* U+002e6d: */
- 0, /* U+002e6e: */
- 0, /* U+002e6f: */
- 0, /* U+002e70: */
- 0, /* U+002e71: */
- 0, /* U+002e72: */
- 0, /* U+002e73: */
- 0, /* U+002e74: */
- 0, /* U+002e75: */
- 0, /* U+002e76: */
- 0, /* U+002e77: */
- 0, /* U+002e78: */
- 0, /* U+002e79: */
- 0, /* U+002e7a: */
- 0, /* U+002e7b: */
- 0, /* U+002e7c: */
- 0, /* U+002e7d: */
- 0, /* U+002e7e: */
- 0, /* U+002e7f: */
- 0, /* U+002e80: CJK RADICAL REPEAT*/
- 0, /* U+002e81: CJK RADICAL CLIFF*/
- 0, /* U+002e82: CJK RADICAL SECOND ONE*/
- 0, /* U+002e83: CJK RADICAL SECOND TWO*/
- 0, /* U+002e84: CJK RADICAL SECOND THREE*/
- 0, /* U+002e85: CJK RADICAL PERSON*/
- 0, /* U+002e86: CJK RADICAL BOX*/
- 0, /* U+002e87: CJK RADICAL TABLE*/
- 0, /* U+002e88: CJK RADICAL KNIFE ONE*/
- 0, /* U+002e89: CJK RADICAL KNIFE TWO*/
- 0, /* U+002e8a: CJK RADICAL DIVINATION*/
- 0, /* U+002e8b: CJK RADICAL SEAL*/
- 0, /* U+002e8c: CJK RADICAL SMALL ONE*/
- 0, /* U+002e8d: CJK RADICAL SMALL TWO*/
- 0, /* U+002e8e: CJK RADICAL LAME ONE*/
- 0, /* U+002e8f: CJK RADICAL LAME TWO*/
- 0, /* U+002e90: CJK RADICAL LAME THREE*/
- 0, /* U+002e91: CJK RADICAL LAME FOUR*/
- 0, /* U+002e92: CJK RADICAL SNAKE*/
- 0, /* U+002e93: CJK RADICAL THREAD*/
- 0, /* U+002e94: CJK RADICAL SNOUT ONE*/
- 0, /* U+002e95: CJK RADICAL SNOUT TWO*/
- 0, /* U+002e96: CJK RADICAL HEART ONE*/
- 0, /* U+002e97: CJK RADICAL HEART TWO*/
- 0, /* U+002e98: CJK RADICAL HAND*/
- 0, /* U+002e99: CJK RADICAL RAP*/
- 0, /* U+002e9a: */
- 0, /* U+002e9b: CJK RADICAL CHOKE*/
- 0, /* U+002e9c: CJK RADICAL SUN*/
- 0, /* U+002e9d: CJK RADICAL MOON*/
- 0, /* U+002e9e: CJK RADICAL DEATH*/
- 0, /* U+002e9f: CJK RADICAL MOTHER*/
- 0, /* U+002ea0: CJK RADICAL CIVILIAN*/
- 0, /* U+002ea1: CJK RADICAL WATER ONE*/
- 0, /* U+002ea2: CJK RADICAL WATER TWO*/
- 0, /* U+002ea3: CJK RADICAL FIRE*/
- 0, /* U+002ea4: CJK RADICAL PAW ONE*/
- 0, /* U+002ea5: CJK RADICAL PAW TWO*/
- 0, /* U+002ea6: CJK RADICAL SIMPLIFIED HALF TREE TRUNK*/
- 0, /* U+002ea7: CJK RADICAL COW*/
- 0, /* U+002ea8: CJK RADICAL DOG*/
- 0, /* U+002ea9: CJK RADICAL JADE*/
- 0, /* U+002eaa: CJK RADICAL BOLT OF CLOTH*/
- 0, /* U+002eab: CJK RADICAL EYE*/
- 0, /* U+002eac: CJK RADICAL SPIRIT ONE*/
- 0, /* U+002ead: CJK RADICAL SPIRIT TWO*/
- 0, /* U+002eae: CJK RADICAL BAMBOO*/
- 0, /* U+002eaf: CJK RADICAL SILK*/
- 0, /* U+002eb0: CJK RADICAL C-SIMPLIFIED SILK*/
- 0, /* U+002eb1: CJK RADICAL NET ONE*/
- 0, /* U+002eb2: CJK RADICAL NET TWO*/
- 0, /* U+002eb3: CJK RADICAL NET THREE*/
- 0, /* U+002eb4: CJK RADICAL NET FOUR*/
- 0, /* U+002eb5: CJK RADICAL MESH*/
- 0, /* U+002eb6: CJK RADICAL SHEEP*/
- 0, /* U+002eb7: CJK RADICAL RAM*/
- 0, /* U+002eb8: CJK RADICAL EWE*/
- 0, /* U+002eb9: CJK RADICAL OLD*/
- 0, /* U+002eba: CJK RADICAL BRUSH ONE*/
- 0, /* U+002ebb: CJK RADICAL BRUSH TWO*/
- 0, /* U+002ebc: CJK RADICAL MEAT*/
- 0, /* U+002ebd: CJK RADICAL MORTAR*/
- 0, /* U+002ebe: CJK RADICAL GRASS ONE*/
- 0, /* U+002ebf: CJK RADICAL GRASS TWO*/
- 0, /* U+002ec0: CJK RADICAL GRASS THREE*/
- 0, /* U+002ec1: CJK RADICAL TIGER*/
- 0, /* U+002ec2: CJK RADICAL CLOTHES*/
- 0, /* U+002ec3: CJK RADICAL WEST ONE*/
- 0, /* U+002ec4: CJK RADICAL WEST TWO*/
- 0, /* U+002ec5: CJK RADICAL C-SIMPLIFIED SEE*/
- 0, /* U+002ec6: CJK RADICAL SIMPLIFIED HORN*/
- 0, /* U+002ec7: CJK RADICAL HORN*/
- 0, /* U+002ec8: CJK RADICAL C-SIMPLIFIED SPEECH*/
- 0, /* U+002ec9: CJK RADICAL C-SIMPLIFIED SHELL*/
- 0, /* U+002eca: CJK RADICAL FOOT*/
- 0, /* U+002ecb: CJK RADICAL C-SIMPLIFIED CART*/
- 0, /* U+002ecc: CJK RADICAL SIMPLIFIED WALK*/
- 0, /* U+002ecd: CJK RADICAL WALK ONE*/
- 0, /* U+002ece: CJK RADICAL WALK TWO*/
- 0, /* U+002ecf: CJK RADICAL CITY*/
- 0, /* U+002ed0: CJK RADICAL C-SIMPLIFIED GOLD*/
- 0, /* U+002ed1: CJK RADICAL LONG ONE*/
- 0, /* U+002ed2: CJK RADICAL LONG TWO*/
- 0, /* U+002ed3: CJK RADICAL C-SIMPLIFIED LONG*/
- 0, /* U+002ed4: CJK RADICAL C-SIMPLIFIED GATE*/
- 0, /* U+002ed5: CJK RADICAL MOUND ONE*/
- 0, /* U+002ed6: CJK RADICAL MOUND TWO*/
- 0, /* U+002ed7: CJK RADICAL RAIN*/
- 0, /* U+002ed8: CJK RADICAL BLUE*/
- 0, /* U+002ed9: CJK RADICAL C-SIMPLIFIED TANNED LEATHER*/
- 0, /* U+002eda: CJK RADICAL C-SIMPLIFIED LEAF*/
- 0, /* U+002edb: CJK RADICAL C-SIMPLIFIED WIND*/
- 0, /* U+002edc: CJK RADICAL C-SIMPLIFIED FLY*/
- 0, /* U+002edd: CJK RADICAL EAT ONE*/
- 0, /* U+002ede: CJK RADICAL EAT TWO*/
- 0, /* U+002edf: CJK RADICAL EAT THREE*/
- 0, /* U+002ee0: CJK RADICAL C-SIMPLIFIED EAT*/
- 0, /* U+002ee1: CJK RADICAL HEAD*/
- 0, /* U+002ee2: CJK RADICAL C-SIMPLIFIED HORSE*/
- 0, /* U+002ee3: CJK RADICAL BONE*/
- 0, /* U+002ee4: CJK RADICAL GHOST*/
- 0, /* U+002ee5: CJK RADICAL C-SIMPLIFIED FISH*/
- 0, /* U+002ee6: CJK RADICAL C-SIMPLIFIED BIRD*/
- 0, /* U+002ee7: CJK RADICAL C-SIMPLIFIED SALT*/
- 0, /* U+002ee8: CJK RADICAL SIMPLIFIED WHEAT*/
- 0, /* U+002ee9: CJK RADICAL SIMPLIFIED YELLOW*/
- 0, /* U+002eea: CJK RADICAL C-SIMPLIFIED FROG*/
- 0, /* U+002eeb: CJK RADICAL J-SIMPLIFIED EVEN*/
- 0, /* U+002eec: CJK RADICAL C-SIMPLIFIED EVEN*/
- 0, /* U+002eed: CJK RADICAL J-SIMPLIFIED TOOTH*/
- 0, /* U+002eee: CJK RADICAL C-SIMPLIFIED TOOTH*/
- 0, /* U+002eef: CJK RADICAL J-SIMPLIFIED DRAGON*/
- 0, /* U+002ef0: CJK RADICAL C-SIMPLIFIED DRAGON*/
- 0, /* U+002ef1: CJK RADICAL TURTLE*/
- 0, /* U+002ef2: CJK RADICAL J-SIMPLIFIED TURTLE*/
- 0, /* U+002ef3: CJK RADICAL C-SIMPLIFIED TURTLE*/
- 0, /* U+002ef4: */
- 0, /* U+002ef5: */
- 0, /* U+002ef6: */
- 0, /* U+002ef7: */
- 0, /* U+002ef8: */
- 0, /* U+002ef9: */
- 0, /* U+002efa: */
- 0, /* U+002efb: */
- 0, /* U+002efc: */
- 0, /* U+002efd: */
- 0, /* U+002efe: */
- 0, /* U+002eff: */
- 0, /* U+002f00: KANGXI RADICAL ONE*/
- 0, /* U+002f01: KANGXI RADICAL LINE*/
- 0, /* U+002f02: KANGXI RADICAL DOT*/
- 0, /* U+002f03: KANGXI RADICAL SLASH*/
- 0, /* U+002f04: KANGXI RADICAL SECOND*/
- 0, /* U+002f05: KANGXI RADICAL HOOK*/
- 0, /* U+002f06: KANGXI RADICAL TWO*/
- 0, /* U+002f07: KANGXI RADICAL LID*/
- 0, /* U+002f08: KANGXI RADICAL MAN*/
- 0, /* U+002f09: KANGXI RADICAL LEGS*/
- 0, /* U+002f0a: KANGXI RADICAL ENTER*/
- 0, /* U+002f0b: KANGXI RADICAL EIGHT*/
- 0, /* U+002f0c: KANGXI RADICAL DOWN BOX*/
- 0, /* U+002f0d: KANGXI RADICAL COVER*/
- 0, /* U+002f0e: KANGXI RADICAL ICE*/
- 0, /* U+002f0f: KANGXI RADICAL TABLE*/
- 0, /* U+002f10: KANGXI RADICAL OPEN BOX*/
- 0, /* U+002f11: KANGXI RADICAL KNIFE*/
- 0, /* U+002f12: KANGXI RADICAL POWER*/
- 0, /* U+002f13: KANGXI RADICAL WRAP*/
- 0, /* U+002f14: KANGXI RADICAL SPOON*/
- 0, /* U+002f15: KANGXI RADICAL RIGHT OPEN BOX*/
- 0, /* U+002f16: KANGXI RADICAL HIDING ENCLOSURE*/
- 0, /* U+002f17: KANGXI RADICAL TEN*/
- 0, /* U+002f18: KANGXI RADICAL DIVINATION*/
- 0, /* U+002f19: KANGXI RADICAL SEAL*/
- 0, /* U+002f1a: KANGXI RADICAL CLIFF*/
- 0, /* U+002f1b: KANGXI RADICAL PRIVATE*/
- 0, /* U+002f1c: KANGXI RADICAL AGAIN*/
- 0, /* U+002f1d: KANGXI RADICAL MOUTH*/
- 0, /* U+002f1e: KANGXI RADICAL ENCLOSURE*/
- 0, /* U+002f1f: KANGXI RADICAL EARTH*/
- 0, /* U+002f20: KANGXI RADICAL SCHOLAR*/
- 0, /* U+002f21: KANGXI RADICAL GO*/
- 0, /* U+002f22: KANGXI RADICAL GO SLOWLY*/
- 0, /* U+002f23: KANGXI RADICAL EVENING*/
- 0, /* U+002f24: KANGXI RADICAL BIG*/
- 0, /* U+002f25: KANGXI RADICAL WOMAN*/
- 0, /* U+002f26: KANGXI RADICAL CHILD*/
- 0, /* U+002f27: KANGXI RADICAL ROOF*/
- 0, /* U+002f28: KANGXI RADICAL INCH*/
- 0, /* U+002f29: KANGXI RADICAL SMALL*/
- 0, /* U+002f2a: KANGXI RADICAL LAME*/
- 0, /* U+002f2b: KANGXI RADICAL CORPSE*/
- 0, /* U+002f2c: KANGXI RADICAL SPROUT*/
- 0, /* U+002f2d: KANGXI RADICAL MOUNTAIN*/
- 0, /* U+002f2e: KANGXI RADICAL RIVER*/
- 0, /* U+002f2f: KANGXI RADICAL WORK*/
- 0, /* U+002f30: KANGXI RADICAL ONESELF*/
- 0, /* U+002f31: KANGXI RADICAL TURBAN*/
- 0, /* U+002f32: KANGXI RADICAL DRY*/
- 0, /* U+002f33: KANGXI RADICAL SHORT THREAD*/
- 0, /* U+002f34: KANGXI RADICAL DOTTED CLIFF*/
- 0, /* U+002f35: KANGXI RADICAL LONG STRIDE*/
- 0, /* U+002f36: KANGXI RADICAL TWO HANDS*/
- 0, /* U+002f37: KANGXI RADICAL SHOOT*/
- 0, /* U+002f38: KANGXI RADICAL BOW*/
- 0, /* U+002f39: KANGXI RADICAL SNOUT*/
- 0, /* U+002f3a: KANGXI RADICAL BRISTLE*/
- 0, /* U+002f3b: KANGXI RADICAL STEP*/
- 0, /* U+002f3c: KANGXI RADICAL HEART*/
- 0, /* U+002f3d: KANGXI RADICAL HALBERD*/
- 0, /* U+002f3e: KANGXI RADICAL DOOR*/
- 0, /* U+002f3f: KANGXI RADICAL HAND*/
- 0, /* U+002f40: KANGXI RADICAL BRANCH*/
- 0, /* U+002f41: KANGXI RADICAL RAP*/
- 0, /* U+002f42: KANGXI RADICAL SCRIPT*/
- 0, /* U+002f43: KANGXI RADICAL DIPPER*/
- 0, /* U+002f44: KANGXI RADICAL AXE*/
- 0, /* U+002f45: KANGXI RADICAL SQUARE*/
- 0, /* U+002f46: KANGXI RADICAL NOT*/
- 0, /* U+002f47: KANGXI RADICAL SUN*/
- 0, /* U+002f48: KANGXI RADICAL SAY*/
- 0, /* U+002f49: KANGXI RADICAL MOON*/
- 0, /* U+002f4a: KANGXI RADICAL TREE*/
- 0, /* U+002f4b: KANGXI RADICAL LACK*/
- 0, /* U+002f4c: KANGXI RADICAL STOP*/
- 0, /* U+002f4d: KANGXI RADICAL DEATH*/
- 0, /* U+002f4e: KANGXI RADICAL WEAPON*/
- 0, /* U+002f4f: KANGXI RADICAL DO NOT*/
- 0, /* U+002f50: KANGXI RADICAL COMPARE*/
- 0, /* U+002f51: KANGXI RADICAL FUR*/
- 0, /* U+002f52: KANGXI RADICAL CLAN*/
- 0, /* U+002f53: KANGXI RADICAL STEAM*/
- 0, /* U+002f54: KANGXI RADICAL WATER*/
- 0, /* U+002f55: KANGXI RADICAL FIRE*/
- 0, /* U+002f56: KANGXI RADICAL CLAW*/
- 0, /* U+002f57: KANGXI RADICAL FATHER*/
- 0, /* U+002f58: KANGXI RADICAL DOUBLE X*/
- 0, /* U+002f59: KANGXI RADICAL HALF TREE TRUNK*/
- 0, /* U+002f5a: KANGXI RADICAL SLICE*/
- 0, /* U+002f5b: KANGXI RADICAL FANG*/
- 0, /* U+002f5c: KANGXI RADICAL COW*/
- 0, /* U+002f5d: KANGXI RADICAL DOG*/
- 0, /* U+002f5e: KANGXI RADICAL PROFOUND*/
- 0, /* U+002f5f: KANGXI RADICAL JADE*/
- 0, /* U+002f60: KANGXI RADICAL MELON*/
- 0, /* U+002f61: KANGXI RADICAL TILE*/
- 0, /* U+002f62: KANGXI RADICAL SWEET*/
- 0, /* U+002f63: KANGXI RADICAL LIFE*/
- 0, /* U+002f64: KANGXI RADICAL USE*/
- 0, /* U+002f65: KANGXI RADICAL FIELD*/
- 0, /* U+002f66: KANGXI RADICAL BOLT OF CLOTH*/
- 0, /* U+002f67: KANGXI RADICAL SICKNESS*/
- 0, /* U+002f68: KANGXI RADICAL DOTTED TENT*/
- 0, /* U+002f69: KANGXI RADICAL WHITE*/
- 0, /* U+002f6a: KANGXI RADICAL SKIN*/
- 0, /* U+002f6b: KANGXI RADICAL DISH*/
- 0, /* U+002f6c: KANGXI RADICAL EYE*/
- 0, /* U+002f6d: KANGXI RADICAL SPEAR*/
- 0, /* U+002f6e: KANGXI RADICAL ARROW*/
- 0, /* U+002f6f: KANGXI RADICAL STONE*/
- 0, /* U+002f70: KANGXI RADICAL SPIRIT*/
- 0, /* U+002f71: KANGXI RADICAL TRACK*/
- 0, /* U+002f72: KANGXI RADICAL GRAIN*/
- 0, /* U+002f73: KANGXI RADICAL CAVE*/
- 0, /* U+002f74: KANGXI RADICAL STAND*/
- 0, /* U+002f75: KANGXI RADICAL BAMBOO*/
- 0, /* U+002f76: KANGXI RADICAL RICE*/
- 0, /* U+002f77: KANGXI RADICAL SILK*/
- 0, /* U+002f78: KANGXI RADICAL JAR*/
- 0, /* U+002f79: KANGXI RADICAL NET*/
- 0, /* U+002f7a: KANGXI RADICAL SHEEP*/
- 0, /* U+002f7b: KANGXI RADICAL FEATHER*/
- 0, /* U+002f7c: KANGXI RADICAL OLD*/
- 0, /* U+002f7d: KANGXI RADICAL AND*/
- 0, /* U+002f7e: KANGXI RADICAL PLOW*/
- 0, /* U+002f7f: KANGXI RADICAL EAR*/
- 0, /* U+002f80: KANGXI RADICAL BRUSH*/
- 0, /* U+002f81: KANGXI RADICAL MEAT*/
- 0, /* U+002f82: KANGXI RADICAL MINISTER*/
- 0, /* U+002f83: KANGXI RADICAL SELF*/
- 0, /* U+002f84: KANGXI RADICAL ARRIVE*/
- 0, /* U+002f85: KANGXI RADICAL MORTAR*/
- 0, /* U+002f86: KANGXI RADICAL TONGUE*/
- 0, /* U+002f87: KANGXI RADICAL OPPOSE*/
- 0, /* U+002f88: KANGXI RADICAL BOAT*/
- 0, /* U+002f89: KANGXI RADICAL STOPPING*/
- 0, /* U+002f8a: KANGXI RADICAL COLOR*/
- 0, /* U+002f8b: KANGXI RADICAL GRASS*/
- 0, /* U+002f8c: KANGXI RADICAL TIGER*/
- 0, /* U+002f8d: KANGXI RADICAL INSECT*/
- 0, /* U+002f8e: KANGXI RADICAL BLOOD*/
- 0, /* U+002f8f: KANGXI RADICAL WALK ENCLOSURE*/
- 0, /* U+002f90: KANGXI RADICAL CLOTHES*/
- 0, /* U+002f91: KANGXI RADICAL WEST*/
- 0, /* U+002f92: KANGXI RADICAL SEE*/
- 0, /* U+002f93: KANGXI RADICAL HORN*/
- 0, /* U+002f94: KANGXI RADICAL SPEECH*/
- 0, /* U+002f95: KANGXI RADICAL VALLEY*/
- 0, /* U+002f96: KANGXI RADICAL BEAN*/
- 0, /* U+002f97: KANGXI RADICAL PIG*/
- 0, /* U+002f98: KANGXI RADICAL BADGER*/
- 0, /* U+002f99: KANGXI RADICAL SHELL*/
- 0, /* U+002f9a: KANGXI RADICAL RED*/
- 0, /* U+002f9b: KANGXI RADICAL RUN*/
- 0, /* U+002f9c: KANGXI RADICAL FOOT*/
- 0, /* U+002f9d: KANGXI RADICAL BODY*/
- 0, /* U+002f9e: KANGXI RADICAL CART*/
- 0, /* U+002f9f: KANGXI RADICAL BITTER*/
- 0, /* U+002fa0: KANGXI RADICAL MORNING*/
- 0, /* U+002fa1: KANGXI RADICAL WALK*/
- 0, /* U+002fa2: KANGXI RADICAL CITY*/
- 0, /* U+002fa3: KANGXI RADICAL WINE*/
- 0, /* U+002fa4: KANGXI RADICAL DISTINGUISH*/
- 0, /* U+002fa5: KANGXI RADICAL VILLAGE*/
- 0, /* U+002fa6: KANGXI RADICAL GOLD*/
- 0, /* U+002fa7: KANGXI RADICAL LONG*/
- 0, /* U+002fa8: KANGXI RADICAL GATE*/
- 0, /* U+002fa9: KANGXI RADICAL MOUND*/
- 0, /* U+002faa: KANGXI RADICAL SLAVE*/
- 0, /* U+002fab: KANGXI RADICAL SHORT TAILED BIRD*/
- 0, /* U+002fac: KANGXI RADICAL RAIN*/
- 0, /* U+002fad: KANGXI RADICAL BLUE*/
- 0, /* U+002fae: KANGXI RADICAL WRONG*/
- 0, /* U+002faf: KANGXI RADICAL FACE*/
- 0, /* U+002fb0: KANGXI RADICAL LEATHER*/
- 0, /* U+002fb1: KANGXI RADICAL TANNED LEATHER*/
- 0, /* U+002fb2: KANGXI RADICAL LEEK*/
- 0, /* U+002fb3: KANGXI RADICAL SOUND*/
- 0, /* U+002fb4: KANGXI RADICAL LEAF*/
- 0, /* U+002fb5: KANGXI RADICAL WIND*/
- 0, /* U+002fb6: KANGXI RADICAL FLY*/
- 0, /* U+002fb7: KANGXI RADICAL EAT*/
- 0, /* U+002fb8: KANGXI RADICAL HEAD*/
- 0, /* U+002fb9: KANGXI RADICAL FRAGRANT*/
- 0, /* U+002fba: KANGXI RADICAL HORSE*/
- 0, /* U+002fbb: KANGXI RADICAL BONE*/
- 0, /* U+002fbc: KANGXI RADICAL TALL*/
- 0, /* U+002fbd: KANGXI RADICAL HAIR*/
- 0, /* U+002fbe: KANGXI RADICAL FIGHT*/
- 0, /* U+002fbf: KANGXI RADICAL SACRIFICIAL WINE*/
- 0, /* U+002fc0: KANGXI RADICAL CAULDRON*/
- 0, /* U+002fc1: KANGXI RADICAL GHOST*/
- 0, /* U+002fc2: KANGXI RADICAL FISH*/
- 0, /* U+002fc3: KANGXI RADICAL BIRD*/
- 0, /* U+002fc4: KANGXI RADICAL SALT*/
- 0, /* U+002fc5: KANGXI RADICAL DEER*/
- 0, /* U+002fc6: KANGXI RADICAL WHEAT*/
- 0, /* U+002fc7: KANGXI RADICAL HEMP*/
- 0, /* U+002fc8: KANGXI RADICAL YELLOW*/
- 0, /* U+002fc9: KANGXI RADICAL MILLET*/
- 0, /* U+002fca: KANGXI RADICAL BLACK*/
- 0, /* U+002fcb: KANGXI RADICAL EMBROIDERY*/
- 0, /* U+002fcc: KANGXI RADICAL FROG*/
- 0, /* U+002fcd: KANGXI RADICAL TRIPOD*/
- 0, /* U+002fce: KANGXI RADICAL DRUM*/
- 0, /* U+002fcf: KANGXI RADICAL RAT*/
- 0, /* U+002fd0: KANGXI RADICAL NOSE*/
- 0, /* U+002fd1: KANGXI RADICAL EVEN*/
- 0, /* U+002fd2: KANGXI RADICAL TOOTH*/
- 0, /* U+002fd3: KANGXI RADICAL DRAGON*/
- 0, /* U+002fd4: KANGXI RADICAL TURTLE*/
- 0, /* U+002fd5: KANGXI RADICAL FLUTE*/
- 0, /* U+002fd6: */
- 0, /* U+002fd7: */
- 0, /* U+002fd8: */
- 0, /* U+002fd9: */
- 0, /* U+002fda: */
- 0, /* U+002fdb: */
- 0, /* U+002fdc: */
- 0, /* U+002fdd: */
- 0, /* U+002fde: */
- 0, /* U+002fdf: */
- 0, /* U+002fe0: */
- 0, /* U+002fe1: */
- 0, /* U+002fe2: */
- 0, /* U+002fe3: */
- 0, /* U+002fe4: */
- 0, /* U+002fe5: */
- 0, /* U+002fe6: */
- 0, /* U+002fe7: */
- 0, /* U+002fe8: */
- 0, /* U+002fe9: */
- 0, /* U+002fea: */
- 0, /* U+002feb: */
- 0, /* U+002fec: */
- 0, /* U+002fed: */
- 0, /* U+002fee: */
- 0, /* U+002fef: */
- 0, /* U+002ff0: IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT*/
- 0, /* U+002ff1: IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW*/
- 0, /* U+002ff2: IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT*/
- 0, /* U+002ff3: IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW*/
- 0, /* U+002ff4: IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND*/
- 0, /* U+002ff5: IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM ABOVE*/
- 0, /* U+002ff6: IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM BELOW*/
- 0, /* U+002ff7: IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LEFT*/
- 0, /* U+002ff8: IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER LEFT*/
- 0, /* U+002ff9: IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER RIGHT*/
- 0, /* U+002ffa: IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER LEFT*/
- 0, /* U+002ffb: IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID*/
- 0, /* U+002ffc: */
- 0, /* U+002ffd: */
- 0, /* U+002ffe: */
- 0, /* U+002fff: */
- RTUNI_WSPACE, /* U+003000: IDEOGRAPHIC SPACE*/
- 0, /* U+003001: IDEOGRAPHIC COMMA*/
- 0, /* U+003002: IDEOGRAPHIC FULL STOP*/
- 0, /* U+003003: DITTO MARK*/
- 0, /* U+003004: JAPANESE INDUSTRIAL STANDARD SYMBOL*/
- RTUNI_ALPHA, /* U+003005: IDEOGRAPHIC ITERATION MARK*/
- RTUNI_ALPHA, /* U+003006: IDEOGRAPHIC CLOSING MARK*/
- RTUNI_ALPHA, /* U+003007: IDEOGRAPHIC NUMBER ZERO*/
- 0, /* U+003008: LEFT ANGLE BRACKET*/
- 0, /* U+003009: RIGHT ANGLE BRACKET*/
- 0, /* U+00300a: LEFT DOUBLE ANGLE BRACKET*/
- 0, /* U+00300b: RIGHT DOUBLE ANGLE BRACKET*/
- 0, /* U+00300c: LEFT CORNER BRACKET*/
- 0, /* U+00300d: RIGHT CORNER BRACKET*/
- 0, /* U+00300e: LEFT WHITE CORNER BRACKET*/
- 0, /* U+00300f: RIGHT WHITE CORNER BRACKET*/
- 0, /* U+003010: LEFT BLACK LENTICULAR BRACKET*/
- 0, /* U+003011: RIGHT BLACK LENTICULAR BRACKET*/
- 0, /* U+003012: POSTAL MARK*/
- 0, /* U+003013: GETA MARK*/
- 0, /* U+003014: LEFT TORTOISE SHELL BRACKET*/
- 0, /* U+003015: RIGHT TORTOISE SHELL BRACKET*/
- 0, /* U+003016: LEFT WHITE LENTICULAR BRACKET*/
- 0, /* U+003017: RIGHT WHITE LENTICULAR BRACKET*/
- 0, /* U+003018: LEFT WHITE TORTOISE SHELL BRACKET*/
- 0, /* U+003019: RIGHT WHITE TORTOISE SHELL BRACKET*/
- 0, /* U+00301a: LEFT WHITE SQUARE BRACKET*/
- 0, /* U+00301b: RIGHT WHITE SQUARE BRACKET*/
- 0, /* U+00301c: WAVE DASH*/
- 0, /* U+00301d: REVERSED DOUBLE PRIME QUOTATION MARK*/
- 0, /* U+00301e: DOUBLE PRIME QUOTATION MARK*/
- 0, /* U+00301f: LOW DOUBLE PRIME QUOTATION MARK*/
- 0, /* U+003020: POSTAL MARK FACE*/
- RTUNI_ALPHA, /* U+003021: HANGZHOU NUMERAL ONE*/
- RTUNI_ALPHA, /* U+003022: HANGZHOU NUMERAL TWO*/
- RTUNI_ALPHA, /* U+003023: HANGZHOU NUMERAL THREE*/
- RTUNI_ALPHA, /* U+003024: HANGZHOU NUMERAL FOUR*/
- RTUNI_ALPHA, /* U+003025: HANGZHOU NUMERAL FIVE*/
- RTUNI_ALPHA, /* U+003026: HANGZHOU NUMERAL SIX*/
- RTUNI_ALPHA, /* U+003027: HANGZHOU NUMERAL SEVEN*/
- RTUNI_ALPHA, /* U+003028: HANGZHOU NUMERAL EIGHT*/
- RTUNI_ALPHA, /* U+003029: HANGZHOU NUMERAL NINE*/
- 0, /* U+00302a: IDEOGRAPHIC LEVEL TONE MARK*/
- 0, /* U+00302b: IDEOGRAPHIC RISING TONE MARK*/
- 0, /* U+00302c: IDEOGRAPHIC DEPARTING TONE MARK*/
- 0, /* U+00302d: IDEOGRAPHIC ENTERING TONE MARK*/
- 0, /* U+00302e: HANGUL SINGLE DOT TONE MARK*/
- 0, /* U+00302f: HANGUL DOUBLE DOT TONE MARK*/
- 0, /* U+003030: WAVY DASH*/
- RTUNI_ALPHA, /* U+003031: VERTICAL KANA REPEAT MARK*/
- RTUNI_ALPHA, /* U+003032: VERTICAL KANA REPEAT WITH VOICED SOUND MARK*/
- RTUNI_ALPHA, /* U+003033: VERTICAL KANA REPEAT MARK UPPER HALF*/
- RTUNI_ALPHA, /* U+003034: VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF*/
- RTUNI_ALPHA, /* U+003035: VERTICAL KANA REPEAT MARK LOWER HALF*/
- 0, /* U+003036: CIRCLED POSTAL MARK*/
- 0, /* U+003037: IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL*/
- RTUNI_ALPHA, /* U+003038: HANGZHOU NUMERAL TEN*/
- RTUNI_ALPHA, /* U+003039: HANGZHOU NUMERAL TWENTY*/
- RTUNI_ALPHA, /* U+00303a: HANGZHOU NUMERAL THIRTY*/
- RTUNI_ALPHA, /* U+00303b: VERTICAL IDEOGRAPHIC ITERATION MARK*/
- RTUNI_ALPHA, /* U+00303c: MASU MARK*/
- 0, /* U+00303d: PART ALTERNATION MARK*/
- 0, /* U+00303e: IDEOGRAPHIC VARIATION INDICATOR*/
- 0, /* U+00303f: IDEOGRAPHIC HALF FILL SPACE*/
- 0, /* U+003040: */
- RTUNI_ALPHA, /* U+003041: HIRAGANA LETTER SMALL A*/
- RTUNI_ALPHA, /* U+003042: HIRAGANA LETTER A*/
- RTUNI_ALPHA, /* U+003043: HIRAGANA LETTER SMALL I*/
- RTUNI_ALPHA, /* U+003044: HIRAGANA LETTER I*/
- RTUNI_ALPHA, /* U+003045: HIRAGANA LETTER SMALL U*/
- RTUNI_ALPHA, /* U+003046: HIRAGANA LETTER U*/
- RTUNI_ALPHA, /* U+003047: HIRAGANA LETTER SMALL E*/
- RTUNI_ALPHA, /* U+003048: HIRAGANA LETTER E*/
- RTUNI_ALPHA, /* U+003049: HIRAGANA LETTER SMALL O*/
- RTUNI_ALPHA, /* U+00304a: HIRAGANA LETTER O*/
- RTUNI_ALPHA, /* U+00304b: HIRAGANA LETTER KA*/
- RTUNI_ALPHA, /* U+00304c: HIRAGANA LETTER GA*/
- RTUNI_ALPHA, /* U+00304d: HIRAGANA LETTER KI*/
- RTUNI_ALPHA, /* U+00304e: HIRAGANA LETTER GI*/
- RTUNI_ALPHA, /* U+00304f: HIRAGANA LETTER KU*/
- RTUNI_ALPHA, /* U+003050: HIRAGANA LETTER GU*/
- RTUNI_ALPHA, /* U+003051: HIRAGANA LETTER KE*/
- RTUNI_ALPHA, /* U+003052: HIRAGANA LETTER GE*/
- RTUNI_ALPHA, /* U+003053: HIRAGANA LETTER KO*/
- RTUNI_ALPHA, /* U+003054: HIRAGANA LETTER GO*/
- RTUNI_ALPHA, /* U+003055: HIRAGANA LETTER SA*/
- RTUNI_ALPHA, /* U+003056: HIRAGANA LETTER ZA*/
- RTUNI_ALPHA, /* U+003057: HIRAGANA LETTER SI*/
- RTUNI_ALPHA, /* U+003058: HIRAGANA LETTER ZI*/
- RTUNI_ALPHA, /* U+003059: HIRAGANA LETTER SU*/
- RTUNI_ALPHA, /* U+00305a: HIRAGANA LETTER ZU*/
- RTUNI_ALPHA, /* U+00305b: HIRAGANA LETTER SE*/
- RTUNI_ALPHA, /* U+00305c: HIRAGANA LETTER ZE*/
- RTUNI_ALPHA, /* U+00305d: HIRAGANA LETTER SO*/
- RTUNI_ALPHA, /* U+00305e: HIRAGANA LETTER ZO*/
- RTUNI_ALPHA, /* U+00305f: HIRAGANA LETTER TA*/
- RTUNI_ALPHA, /* U+003060: HIRAGANA LETTER DA*/
- RTUNI_ALPHA, /* U+003061: HIRAGANA LETTER TI*/
- RTUNI_ALPHA, /* U+003062: HIRAGANA LETTER DI*/
- RTUNI_ALPHA, /* U+003063: HIRAGANA LETTER SMALL TU*/
- RTUNI_ALPHA, /* U+003064: HIRAGANA LETTER TU*/
- RTUNI_ALPHA, /* U+003065: HIRAGANA LETTER DU*/
- RTUNI_ALPHA, /* U+003066: HIRAGANA LETTER TE*/
- RTUNI_ALPHA, /* U+003067: HIRAGANA LETTER DE*/
- RTUNI_ALPHA, /* U+003068: HIRAGANA LETTER TO*/
- RTUNI_ALPHA, /* U+003069: HIRAGANA LETTER DO*/
- RTUNI_ALPHA, /* U+00306a: HIRAGANA LETTER NA*/
- RTUNI_ALPHA, /* U+00306b: HIRAGANA LETTER NI*/
- RTUNI_ALPHA, /* U+00306c: HIRAGANA LETTER NU*/
- RTUNI_ALPHA, /* U+00306d: HIRAGANA LETTER NE*/
- RTUNI_ALPHA, /* U+00306e: HIRAGANA LETTER NO*/
- RTUNI_ALPHA, /* U+00306f: HIRAGANA LETTER HA*/
- RTUNI_ALPHA, /* U+003070: HIRAGANA LETTER BA*/
- RTUNI_ALPHA, /* U+003071: HIRAGANA LETTER PA*/
- RTUNI_ALPHA, /* U+003072: HIRAGANA LETTER HI*/
- RTUNI_ALPHA, /* U+003073: HIRAGANA LETTER BI*/
- RTUNI_ALPHA, /* U+003074: HIRAGANA LETTER PI*/
- RTUNI_ALPHA, /* U+003075: HIRAGANA LETTER HU*/
- RTUNI_ALPHA, /* U+003076: HIRAGANA LETTER BU*/
- RTUNI_ALPHA, /* U+003077: HIRAGANA LETTER PU*/
- RTUNI_ALPHA, /* U+003078: HIRAGANA LETTER HE*/
- RTUNI_ALPHA, /* U+003079: HIRAGANA LETTER BE*/
- RTUNI_ALPHA, /* U+00307a: HIRAGANA LETTER PE*/
- RTUNI_ALPHA, /* U+00307b: HIRAGANA LETTER HO*/
- RTUNI_ALPHA, /* U+00307c: HIRAGANA LETTER BO*/
- RTUNI_ALPHA, /* U+00307d: HIRAGANA LETTER PO*/
- RTUNI_ALPHA, /* U+00307e: HIRAGANA LETTER MA*/
- RTUNI_ALPHA, /* U+00307f: HIRAGANA LETTER MI*/
- RTUNI_ALPHA, /* U+003080: HIRAGANA LETTER MU*/
- RTUNI_ALPHA, /* U+003081: HIRAGANA LETTER ME*/
- RTUNI_ALPHA, /* U+003082: HIRAGANA LETTER MO*/
- RTUNI_ALPHA, /* U+003083: HIRAGANA LETTER SMALL YA*/
- RTUNI_ALPHA, /* U+003084: HIRAGANA LETTER YA*/
- RTUNI_ALPHA, /* U+003085: HIRAGANA LETTER SMALL YU*/
- RTUNI_ALPHA, /* U+003086: HIRAGANA LETTER YU*/
- RTUNI_ALPHA, /* U+003087: HIRAGANA LETTER SMALL YO*/
- RTUNI_ALPHA, /* U+003088: HIRAGANA LETTER YO*/
- RTUNI_ALPHA, /* U+003089: HIRAGANA LETTER RA*/
- RTUNI_ALPHA, /* U+00308a: HIRAGANA LETTER RI*/
- RTUNI_ALPHA, /* U+00308b: HIRAGANA LETTER RU*/
- RTUNI_ALPHA, /* U+00308c: HIRAGANA LETTER RE*/
- RTUNI_ALPHA, /* U+00308d: HIRAGANA LETTER RO*/
- RTUNI_ALPHA, /* U+00308e: HIRAGANA LETTER SMALL WA*/
- RTUNI_ALPHA, /* U+00308f: HIRAGANA LETTER WA*/
- RTUNI_ALPHA, /* U+003090: HIRAGANA LETTER WI*/
- RTUNI_ALPHA, /* U+003091: HIRAGANA LETTER WE*/
- RTUNI_ALPHA, /* U+003092: HIRAGANA LETTER WO*/
- RTUNI_ALPHA, /* U+003093: HIRAGANA LETTER N*/
- RTUNI_ALPHA, /* U+003094: HIRAGANA LETTER VU*/
- RTUNI_ALPHA, /* U+003095: HIRAGANA LETTER SMALL KA*/
- RTUNI_ALPHA, /* U+003096: HIRAGANA LETTER SMALL KE*/
- 0, /* U+003097: */
- 0, /* U+003098: */
- 0, /* U+003099: COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK*/
- 0, /* U+00309a: COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK*/
- 0, /* U+00309b: KATAKANA-HIRAGANA VOICED SOUND MARK*/
- 0, /* U+00309c: KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK*/
- RTUNI_ALPHA, /* U+00309d: HIRAGANA ITERATION MARK*/
- RTUNI_ALPHA, /* U+00309e: HIRAGANA VOICED ITERATION MARK*/
- RTUNI_ALPHA, /* U+00309f: HIRAGANA DIGRAPH YORI*/
- 0, /* U+0030a0: KATAKANA-HIRAGANA DOUBLE HYPHEN*/
- RTUNI_ALPHA, /* U+0030a1: KATAKANA LETTER SMALL A*/
- RTUNI_ALPHA, /* U+0030a2: KATAKANA LETTER A*/
- RTUNI_ALPHA, /* U+0030a3: KATAKANA LETTER SMALL I*/
- RTUNI_ALPHA, /* U+0030a4: KATAKANA LETTER I*/
- RTUNI_ALPHA, /* U+0030a5: KATAKANA LETTER SMALL U*/
- RTUNI_ALPHA, /* U+0030a6: KATAKANA LETTER U*/
- RTUNI_ALPHA, /* U+0030a7: KATAKANA LETTER SMALL E*/
- RTUNI_ALPHA, /* U+0030a8: KATAKANA LETTER E*/
- RTUNI_ALPHA, /* U+0030a9: KATAKANA LETTER SMALL O*/
- RTUNI_ALPHA, /* U+0030aa: KATAKANA LETTER O*/
- RTUNI_ALPHA, /* U+0030ab: KATAKANA LETTER KA*/
- RTUNI_ALPHA, /* U+0030ac: KATAKANA LETTER GA*/
- RTUNI_ALPHA, /* U+0030ad: KATAKANA LETTER KI*/
- RTUNI_ALPHA, /* U+0030ae: KATAKANA LETTER GI*/
- RTUNI_ALPHA, /* U+0030af: KATAKANA LETTER KU*/
- RTUNI_ALPHA, /* U+0030b0: KATAKANA LETTER GU*/
- RTUNI_ALPHA, /* U+0030b1: KATAKANA LETTER KE*/
- RTUNI_ALPHA, /* U+0030b2: KATAKANA LETTER GE*/
- RTUNI_ALPHA, /* U+0030b3: KATAKANA LETTER KO*/
- RTUNI_ALPHA, /* U+0030b4: KATAKANA LETTER GO*/
- RTUNI_ALPHA, /* U+0030b5: KATAKANA LETTER SA*/
- RTUNI_ALPHA, /* U+0030b6: KATAKANA LETTER ZA*/
- RTUNI_ALPHA, /* U+0030b7: KATAKANA LETTER SI*/
- RTUNI_ALPHA, /* U+0030b8: KATAKANA LETTER ZI*/
- RTUNI_ALPHA, /* U+0030b9: KATAKANA LETTER SU*/
- RTUNI_ALPHA, /* U+0030ba: KATAKANA LETTER ZU*/
- RTUNI_ALPHA, /* U+0030bb: KATAKANA LETTER SE*/
- RTUNI_ALPHA, /* U+0030bc: KATAKANA LETTER ZE*/
- RTUNI_ALPHA, /* U+0030bd: KATAKANA LETTER SO*/
- RTUNI_ALPHA, /* U+0030be: KATAKANA LETTER ZO*/
- RTUNI_ALPHA, /* U+0030bf: KATAKANA LETTER TA*/
- RTUNI_ALPHA, /* U+0030c0: KATAKANA LETTER DA*/
- RTUNI_ALPHA, /* U+0030c1: KATAKANA LETTER TI*/
- RTUNI_ALPHA, /* U+0030c2: KATAKANA LETTER DI*/
- RTUNI_ALPHA, /* U+0030c3: KATAKANA LETTER SMALL TU*/
- RTUNI_ALPHA, /* U+0030c4: KATAKANA LETTER TU*/
- RTUNI_ALPHA, /* U+0030c5: KATAKANA LETTER DU*/
- RTUNI_ALPHA, /* U+0030c6: KATAKANA LETTER TE*/
- RTUNI_ALPHA, /* U+0030c7: KATAKANA LETTER DE*/
- RTUNI_ALPHA, /* U+0030c8: KATAKANA LETTER TO*/
- RTUNI_ALPHA, /* U+0030c9: KATAKANA LETTER DO*/
- RTUNI_ALPHA, /* U+0030ca: KATAKANA LETTER NA*/
- RTUNI_ALPHA, /* U+0030cb: KATAKANA LETTER NI*/
- RTUNI_ALPHA, /* U+0030cc: KATAKANA LETTER NU*/
- RTUNI_ALPHA, /* U+0030cd: KATAKANA LETTER NE*/
- RTUNI_ALPHA, /* U+0030ce: KATAKANA LETTER NO*/
- RTUNI_ALPHA, /* U+0030cf: KATAKANA LETTER HA*/
- RTUNI_ALPHA, /* U+0030d0: KATAKANA LETTER BA*/
- RTUNI_ALPHA, /* U+0030d1: KATAKANA LETTER PA*/
- RTUNI_ALPHA, /* U+0030d2: KATAKANA LETTER HI*/
- RTUNI_ALPHA, /* U+0030d3: KATAKANA LETTER BI*/
- RTUNI_ALPHA, /* U+0030d4: KATAKANA LETTER PI*/
- RTUNI_ALPHA, /* U+0030d5: KATAKANA LETTER HU*/
- RTUNI_ALPHA, /* U+0030d6: KATAKANA LETTER BU*/
- RTUNI_ALPHA, /* U+0030d7: KATAKANA LETTER PU*/
- RTUNI_ALPHA, /* U+0030d8: KATAKANA LETTER HE*/
- RTUNI_ALPHA, /* U+0030d9: KATAKANA LETTER BE*/
- RTUNI_ALPHA, /* U+0030da: KATAKANA LETTER PE*/
- RTUNI_ALPHA, /* U+0030db: KATAKANA LETTER HO*/
- RTUNI_ALPHA, /* U+0030dc: KATAKANA LETTER BO*/
- RTUNI_ALPHA, /* U+0030dd: KATAKANA LETTER PO*/
- RTUNI_ALPHA, /* U+0030de: KATAKANA LETTER MA*/
- RTUNI_ALPHA, /* U+0030df: KATAKANA LETTER MI*/
- RTUNI_ALPHA, /* U+0030e0: KATAKANA LETTER MU*/
- RTUNI_ALPHA, /* U+0030e1: KATAKANA LETTER ME*/
- RTUNI_ALPHA, /* U+0030e2: KATAKANA LETTER MO*/
- RTUNI_ALPHA, /* U+0030e3: KATAKANA LETTER SMALL YA*/
- RTUNI_ALPHA, /* U+0030e4: KATAKANA LETTER YA*/
- RTUNI_ALPHA, /* U+0030e5: KATAKANA LETTER SMALL YU*/
- RTUNI_ALPHA, /* U+0030e6: KATAKANA LETTER YU*/
- RTUNI_ALPHA, /* U+0030e7: KATAKANA LETTER SMALL YO*/
- RTUNI_ALPHA, /* U+0030e8: KATAKANA LETTER YO*/
- RTUNI_ALPHA, /* U+0030e9: KATAKANA LETTER RA*/
- RTUNI_ALPHA, /* U+0030ea: KATAKANA LETTER RI*/
- RTUNI_ALPHA, /* U+0030eb: KATAKANA LETTER RU*/
- RTUNI_ALPHA, /* U+0030ec: KATAKANA LETTER RE*/
- RTUNI_ALPHA, /* U+0030ed: KATAKANA LETTER RO*/
- RTUNI_ALPHA, /* U+0030ee: KATAKANA LETTER SMALL WA*/
- RTUNI_ALPHA, /* U+0030ef: KATAKANA LETTER WA*/
- RTUNI_ALPHA, /* U+0030f0: KATAKANA LETTER WI*/
- RTUNI_ALPHA, /* U+0030f1: KATAKANA LETTER WE*/
- RTUNI_ALPHA, /* U+0030f2: KATAKANA LETTER WO*/
- RTUNI_ALPHA, /* U+0030f3: KATAKANA LETTER N*/
- RTUNI_ALPHA, /* U+0030f4: KATAKANA LETTER VU*/
- RTUNI_ALPHA, /* U+0030f5: KATAKANA LETTER SMALL KA*/
- RTUNI_ALPHA, /* U+0030f6: KATAKANA LETTER SMALL KE*/
- RTUNI_ALPHA, /* U+0030f7: KATAKANA LETTER VA*/
- RTUNI_ALPHA, /* U+0030f8: KATAKANA LETTER VI*/
- RTUNI_ALPHA, /* U+0030f9: KATAKANA LETTER VE*/
- RTUNI_ALPHA, /* U+0030fa: KATAKANA LETTER VO*/
- 0, /* U+0030fb: KATAKANA MIDDLE DOT*/
- RTUNI_ALPHA, /* U+0030fc: KATAKANA-HIRAGANA PROLONGED SOUND MARK*/
- RTUNI_ALPHA, /* U+0030fd: KATAKANA ITERATION MARK*/
- RTUNI_ALPHA, /* U+0030fe: KATAKANA VOICED ITERATION MARK*/
- RTUNI_ALPHA, /* U+0030ff: KATAKANA DIGRAPH KOTO*/
- 0, /* U+003100: */
- 0, /* U+003101: */
- 0, /* U+003102: */
- 0, /* U+003103: */
- 0, /* U+003104: */
- RTUNI_ALPHA, /* U+003105: BOPOMOFO LETTER B*/
- RTUNI_ALPHA, /* U+003106: BOPOMOFO LETTER P*/
- RTUNI_ALPHA, /* U+003107: BOPOMOFO LETTER M*/
- RTUNI_ALPHA, /* U+003108: BOPOMOFO LETTER F*/
- RTUNI_ALPHA, /* U+003109: BOPOMOFO LETTER D*/
- RTUNI_ALPHA, /* U+00310a: BOPOMOFO LETTER T*/
- RTUNI_ALPHA, /* U+00310b: BOPOMOFO LETTER N*/
- RTUNI_ALPHA, /* U+00310c: BOPOMOFO LETTER L*/
- RTUNI_ALPHA, /* U+00310d: BOPOMOFO LETTER G*/
- RTUNI_ALPHA, /* U+00310e: BOPOMOFO LETTER K*/
- RTUNI_ALPHA, /* U+00310f: BOPOMOFO LETTER H*/
- RTUNI_ALPHA, /* U+003110: BOPOMOFO LETTER J*/
- RTUNI_ALPHA, /* U+003111: BOPOMOFO LETTER Q*/
- RTUNI_ALPHA, /* U+003112: BOPOMOFO LETTER X*/
- RTUNI_ALPHA, /* U+003113: BOPOMOFO LETTER ZH*/
- RTUNI_ALPHA, /* U+003114: BOPOMOFO LETTER CH*/
- RTUNI_ALPHA, /* U+003115: BOPOMOFO LETTER SH*/
- RTUNI_ALPHA, /* U+003116: BOPOMOFO LETTER R*/
- RTUNI_ALPHA, /* U+003117: BOPOMOFO LETTER Z*/
- RTUNI_ALPHA, /* U+003118: BOPOMOFO LETTER C*/
- RTUNI_ALPHA, /* U+003119: BOPOMOFO LETTER S*/
- RTUNI_ALPHA, /* U+00311a: BOPOMOFO LETTER A*/
- RTUNI_ALPHA, /* U+00311b: BOPOMOFO LETTER O*/
- RTUNI_ALPHA, /* U+00311c: BOPOMOFO LETTER E*/
- RTUNI_ALPHA, /* U+00311d: BOPOMOFO LETTER EH*/
- RTUNI_ALPHA, /* U+00311e: BOPOMOFO LETTER AI*/
- RTUNI_ALPHA, /* U+00311f: BOPOMOFO LETTER EI*/
- RTUNI_ALPHA, /* U+003120: BOPOMOFO LETTER AU*/
- RTUNI_ALPHA, /* U+003121: BOPOMOFO LETTER OU*/
- RTUNI_ALPHA, /* U+003122: BOPOMOFO LETTER AN*/
- RTUNI_ALPHA, /* U+003123: BOPOMOFO LETTER EN*/
- RTUNI_ALPHA, /* U+003124: BOPOMOFO LETTER ANG*/
- RTUNI_ALPHA, /* U+003125: BOPOMOFO LETTER ENG*/
- RTUNI_ALPHA, /* U+003126: BOPOMOFO LETTER ER*/
- RTUNI_ALPHA, /* U+003127: BOPOMOFO LETTER I*/
- RTUNI_ALPHA, /* U+003128: BOPOMOFO LETTER U*/
- RTUNI_ALPHA, /* U+003129: BOPOMOFO LETTER IU*/
- RTUNI_ALPHA, /* U+00312a: BOPOMOFO LETTER V*/
- RTUNI_ALPHA, /* U+00312b: BOPOMOFO LETTER NG*/
- RTUNI_ALPHA, /* U+00312c: BOPOMOFO LETTER GN*/
- 0, /* U+00312d: */
- 0, /* U+00312e: */
- 0, /* U+00312f: */
- 0, /* U+003130: */
- RTUNI_ALPHA, /* U+003131: HANGUL LETTER KIYEOK*/
- RTUNI_ALPHA, /* U+003132: HANGUL LETTER SSANGKIYEOK*/
- RTUNI_ALPHA, /* U+003133: HANGUL LETTER KIYEOK-SIOS*/
- RTUNI_ALPHA, /* U+003134: HANGUL LETTER NIEUN*/
- RTUNI_ALPHA, /* U+003135: HANGUL LETTER NIEUN-CIEUC*/
- RTUNI_ALPHA, /* U+003136: HANGUL LETTER NIEUN-HIEUH*/
- RTUNI_ALPHA, /* U+003137: HANGUL LETTER TIKEUT*/
- RTUNI_ALPHA, /* U+003138: HANGUL LETTER SSANGTIKEUT*/
- RTUNI_ALPHA, /* U+003139: HANGUL LETTER RIEUL*/
- RTUNI_ALPHA, /* U+00313a: HANGUL LETTER RIEUL-KIYEOK*/
- RTUNI_ALPHA, /* U+00313b: HANGUL LETTER RIEUL-MIEUM*/
- RTUNI_ALPHA, /* U+00313c: HANGUL LETTER RIEUL-PIEUP*/
- RTUNI_ALPHA, /* U+00313d: HANGUL LETTER RIEUL-SIOS*/
- RTUNI_ALPHA, /* U+00313e: HANGUL LETTER RIEUL-THIEUTH*/
- RTUNI_ALPHA, /* U+00313f: HANGUL LETTER RIEUL-PHIEUPH*/
- RTUNI_ALPHA, /* U+003140: HANGUL LETTER RIEUL-HIEUH*/
- RTUNI_ALPHA, /* U+003141: HANGUL LETTER MIEUM*/
- RTUNI_ALPHA, /* U+003142: HANGUL LETTER PIEUP*/
- RTUNI_ALPHA, /* U+003143: HANGUL LETTER SSANGPIEUP*/
- RTUNI_ALPHA, /* U+003144: HANGUL LETTER PIEUP-SIOS*/
- RTUNI_ALPHA, /* U+003145: HANGUL LETTER SIOS*/
- RTUNI_ALPHA, /* U+003146: HANGUL LETTER SSANGSIOS*/
- RTUNI_ALPHA, /* U+003147: HANGUL LETTER IEUNG*/
- RTUNI_ALPHA, /* U+003148: HANGUL LETTER CIEUC*/
- RTUNI_ALPHA, /* U+003149: HANGUL LETTER SSANGCIEUC*/
- RTUNI_ALPHA, /* U+00314a: HANGUL LETTER CHIEUCH*/
- RTUNI_ALPHA, /* U+00314b: HANGUL LETTER KHIEUKH*/
- RTUNI_ALPHA, /* U+00314c: HANGUL LETTER THIEUTH*/
- RTUNI_ALPHA, /* U+00314d: HANGUL LETTER PHIEUPH*/
- RTUNI_ALPHA, /* U+00314e: HANGUL LETTER HIEUH*/
- RTUNI_ALPHA, /* U+00314f: HANGUL LETTER A*/
- RTUNI_ALPHA, /* U+003150: HANGUL LETTER AE*/
- RTUNI_ALPHA, /* U+003151: HANGUL LETTER YA*/
- RTUNI_ALPHA, /* U+003152: HANGUL LETTER YAE*/
- RTUNI_ALPHA, /* U+003153: HANGUL LETTER EO*/
- RTUNI_ALPHA, /* U+003154: HANGUL LETTER E*/
- RTUNI_ALPHA, /* U+003155: HANGUL LETTER YEO*/
- RTUNI_ALPHA, /* U+003156: HANGUL LETTER YE*/
- RTUNI_ALPHA, /* U+003157: HANGUL LETTER O*/
- RTUNI_ALPHA, /* U+003158: HANGUL LETTER WA*/
- RTUNI_ALPHA, /* U+003159: HANGUL LETTER WAE*/
- RTUNI_ALPHA, /* U+00315a: HANGUL LETTER OE*/
- RTUNI_ALPHA, /* U+00315b: HANGUL LETTER YO*/
- RTUNI_ALPHA, /* U+00315c: HANGUL LETTER U*/
- RTUNI_ALPHA, /* U+00315d: HANGUL LETTER WEO*/
- RTUNI_ALPHA, /* U+00315e: HANGUL LETTER WE*/
- RTUNI_ALPHA, /* U+00315f: HANGUL LETTER WI*/
- RTUNI_ALPHA, /* U+003160: HANGUL LETTER YU*/
- RTUNI_ALPHA, /* U+003161: HANGUL LETTER EU*/
- RTUNI_ALPHA, /* U+003162: HANGUL LETTER YI*/
- RTUNI_ALPHA, /* U+003163: HANGUL LETTER I*/
- RTUNI_ALPHA, /* U+003164: HANGUL FILLER*/
- RTUNI_ALPHA, /* U+003165: HANGUL LETTER SSANGNIEUN*/
- RTUNI_ALPHA, /* U+003166: HANGUL LETTER NIEUN-TIKEUT*/
- RTUNI_ALPHA, /* U+003167: HANGUL LETTER NIEUN-SIOS*/
- RTUNI_ALPHA, /* U+003168: HANGUL LETTER NIEUN-PANSIOS*/
- RTUNI_ALPHA, /* U+003169: HANGUL LETTER RIEUL-KIYEOK-SIOS*/
- RTUNI_ALPHA, /* U+00316a: HANGUL LETTER RIEUL-TIKEUT*/
- RTUNI_ALPHA, /* U+00316b: HANGUL LETTER RIEUL-PIEUP-SIOS*/
- RTUNI_ALPHA, /* U+00316c: HANGUL LETTER RIEUL-PANSIOS*/
- RTUNI_ALPHA, /* U+00316d: HANGUL LETTER RIEUL-YEORINHIEUH*/
- RTUNI_ALPHA, /* U+00316e: HANGUL LETTER MIEUM-PIEUP*/
- RTUNI_ALPHA, /* U+00316f: HANGUL LETTER MIEUM-SIOS*/
- RTUNI_ALPHA, /* U+003170: HANGUL LETTER MIEUM-PANSIOS*/
- RTUNI_ALPHA, /* U+003171: HANGUL LETTER KAPYEOUNMIEUM*/
- RTUNI_ALPHA, /* U+003172: HANGUL LETTER PIEUP-KIYEOK*/
- RTUNI_ALPHA, /* U+003173: HANGUL LETTER PIEUP-TIKEUT*/
- RTUNI_ALPHA, /* U+003174: HANGUL LETTER PIEUP-SIOS-KIYEOK*/
- RTUNI_ALPHA, /* U+003175: HANGUL LETTER PIEUP-SIOS-TIKEUT*/
- RTUNI_ALPHA, /* U+003176: HANGUL LETTER PIEUP-CIEUC*/
- RTUNI_ALPHA, /* U+003177: HANGUL LETTER PIEUP-THIEUTH*/
- RTUNI_ALPHA, /* U+003178: HANGUL LETTER KAPYEOUNPIEUP*/
- RTUNI_ALPHA, /* U+003179: HANGUL LETTER KAPYEOUNSSANGPIEUP*/
- RTUNI_ALPHA, /* U+00317a: HANGUL LETTER SIOS-KIYEOK*/
- RTUNI_ALPHA, /* U+00317b: HANGUL LETTER SIOS-NIEUN*/
- RTUNI_ALPHA, /* U+00317c: HANGUL LETTER SIOS-TIKEUT*/
- RTUNI_ALPHA, /* U+00317d: HANGUL LETTER SIOS-PIEUP*/
- RTUNI_ALPHA, /* U+00317e: HANGUL LETTER SIOS-CIEUC*/
- RTUNI_ALPHA, /* U+00317f: HANGUL LETTER PANSIOS*/
- RTUNI_ALPHA, /* U+003180: HANGUL LETTER SSANGIEUNG*/
- RTUNI_ALPHA, /* U+003181: HANGUL LETTER YESIEUNG*/
- RTUNI_ALPHA, /* U+003182: HANGUL LETTER YESIEUNG-SIOS*/
- RTUNI_ALPHA, /* U+003183: HANGUL LETTER YESIEUNG-PANSIOS*/
- RTUNI_ALPHA, /* U+003184: HANGUL LETTER KAPYEOUNPHIEUPH*/
- RTUNI_ALPHA, /* U+003185: HANGUL LETTER SSANGHIEUH*/
- RTUNI_ALPHA, /* U+003186: HANGUL LETTER YEORINHIEUH*/
- RTUNI_ALPHA, /* U+003187: HANGUL LETTER YO-YA*/
- RTUNI_ALPHA, /* U+003188: HANGUL LETTER YO-YAE*/
- RTUNI_ALPHA, /* U+003189: HANGUL LETTER YO-I*/
- RTUNI_ALPHA, /* U+00318a: HANGUL LETTER YU-YEO*/
- RTUNI_ALPHA, /* U+00318b: HANGUL LETTER YU-YE*/
- RTUNI_ALPHA, /* U+00318c: HANGUL LETTER YU-I*/
- RTUNI_ALPHA, /* U+00318d: HANGUL LETTER ARAEA*/
- RTUNI_ALPHA, /* U+00318e: HANGUL LETTER ARAEAE*/
- 0, /* U+00318f: */
- 0, /* U+003190: IDEOGRAPHIC ANNOTATION LINKING MARK*/
- 0, /* U+003191: IDEOGRAPHIC ANNOTATION REVERSE MARK*/
- 0, /* U+003192: IDEOGRAPHIC ANNOTATION ONE MARK*/
- 0, /* U+003193: IDEOGRAPHIC ANNOTATION TWO MARK*/
- 0, /* U+003194: IDEOGRAPHIC ANNOTATION THREE MARK*/
- 0, /* U+003195: IDEOGRAPHIC ANNOTATION FOUR MARK*/
- 0, /* U+003196: IDEOGRAPHIC ANNOTATION TOP MARK*/
- 0, /* U+003197: IDEOGRAPHIC ANNOTATION MIDDLE MARK*/
- 0, /* U+003198: IDEOGRAPHIC ANNOTATION BOTTOM MARK*/
- 0, /* U+003199: IDEOGRAPHIC ANNOTATION FIRST MARK*/
- 0, /* U+00319a: IDEOGRAPHIC ANNOTATION SECOND MARK*/
- 0, /* U+00319b: IDEOGRAPHIC ANNOTATION THIRD MARK*/
- 0, /* U+00319c: IDEOGRAPHIC ANNOTATION FOURTH MARK*/
- 0, /* U+00319d: IDEOGRAPHIC ANNOTATION HEAVEN MARK*/
- 0, /* U+00319e: IDEOGRAPHIC ANNOTATION EARTH MARK*/
- 0, /* U+00319f: IDEOGRAPHIC ANNOTATION MAN MARK*/
- RTUNI_ALPHA, /* U+0031a0: BOPOMOFO LETTER BU*/
- RTUNI_ALPHA, /* U+0031a1: BOPOMOFO LETTER ZI*/
- RTUNI_ALPHA, /* U+0031a2: BOPOMOFO LETTER JI*/
- RTUNI_ALPHA, /* U+0031a3: BOPOMOFO LETTER GU*/
- RTUNI_ALPHA, /* U+0031a4: BOPOMOFO LETTER EE*/
- RTUNI_ALPHA, /* U+0031a5: BOPOMOFO LETTER ENN*/
- RTUNI_ALPHA, /* U+0031a6: BOPOMOFO LETTER OO*/
- RTUNI_ALPHA, /* U+0031a7: BOPOMOFO LETTER ONN*/
- RTUNI_ALPHA, /* U+0031a8: BOPOMOFO LETTER IR*/
- RTUNI_ALPHA, /* U+0031a9: BOPOMOFO LETTER ANN*/
- RTUNI_ALPHA, /* U+0031aa: BOPOMOFO LETTER INN*/
- RTUNI_ALPHA, /* U+0031ab: BOPOMOFO LETTER UNN*/
- RTUNI_ALPHA, /* U+0031ac: BOPOMOFO LETTER IM*/
- RTUNI_ALPHA, /* U+0031ad: BOPOMOFO LETTER NGG*/
- RTUNI_ALPHA, /* U+0031ae: BOPOMOFO LETTER AINN*/
- RTUNI_ALPHA, /* U+0031af: BOPOMOFO LETTER AUNN*/
- RTUNI_ALPHA, /* U+0031b0: BOPOMOFO LETTER AM*/
- RTUNI_ALPHA, /* U+0031b1: BOPOMOFO LETTER OM*/
- RTUNI_ALPHA, /* U+0031b2: BOPOMOFO LETTER ONG*/
- RTUNI_ALPHA, /* U+0031b3: BOPOMOFO LETTER INNN*/
- RTUNI_ALPHA, /* U+0031b4: BOPOMOFO FINAL LETTER P*/
- RTUNI_ALPHA, /* U+0031b5: BOPOMOFO FINAL LETTER T*/
- RTUNI_ALPHA, /* U+0031b6: BOPOMOFO FINAL LETTER K*/
- RTUNI_ALPHA, /* U+0031b7: BOPOMOFO FINAL LETTER H*/
- 0, /* U+0031b8: */
- 0, /* U+0031b9: */
- 0, /* U+0031ba: */
- 0, /* U+0031bb: */
- 0, /* U+0031bc: */
- 0, /* U+0031bd: */
- 0, /* U+0031be: */
- 0, /* U+0031bf: */
- 0, /* U+0031c0: CJK STROKE T*/
- 0, /* U+0031c1: CJK STROKE WG*/
- 0, /* U+0031c2: CJK STROKE XG*/
- 0, /* U+0031c3: CJK STROKE BXG*/
- 0, /* U+0031c4: CJK STROKE SW*/
- 0, /* U+0031c5: CJK STROKE HZZ*/
- 0, /* U+0031c6: CJK STROKE HZG*/
- 0, /* U+0031c7: CJK STROKE HP*/
- 0, /* U+0031c8: CJK STROKE HZWG*/
- 0, /* U+0031c9: CJK STROKE SZWG*/
- 0, /* U+0031ca: CJK STROKE HZT*/
- 0, /* U+0031cb: CJK STROKE HZZP*/
- 0, /* U+0031cc: CJK STROKE HPWG*/
- 0, /* U+0031cd: CJK STROKE HZW*/
- 0, /* U+0031ce: CJK STROKE HZZZ*/
- 0, /* U+0031cf: CJK STROKE N*/
- 0, /* U+0031d0: */
- 0, /* U+0031d1: */
- 0, /* U+0031d2: */
- 0, /* U+0031d3: */
- 0, /* U+0031d4: */
- 0, /* U+0031d5: */
- 0, /* U+0031d6: */
- 0, /* U+0031d7: */
- 0, /* U+0031d8: */
- 0, /* U+0031d9: */
- 0, /* U+0031da: */
- 0, /* U+0031db: */
- 0, /* U+0031dc: */
- 0, /* U+0031dd: */
- 0, /* U+0031de: */
- 0, /* U+0031df: */
- 0, /* U+0031e0: */
- 0, /* U+0031e1: */
- 0, /* U+0031e2: */
- 0, /* U+0031e3: */
- 0, /* U+0031e4: */
- 0, /* U+0031e5: */
- 0, /* U+0031e6: */
- 0, /* U+0031e7: */
- 0, /* U+0031e8: */
- 0, /* U+0031e9: */
- 0, /* U+0031ea: */
- 0, /* U+0031eb: */
- 0, /* U+0031ec: */
- 0, /* U+0031ed: */
- 0, /* U+0031ee: */
- 0, /* U+0031ef: */
- RTUNI_ALPHA, /* U+0031f0: KATAKANA LETTER SMALL KU*/
- RTUNI_ALPHA, /* U+0031f1: KATAKANA LETTER SMALL SI*/
- RTUNI_ALPHA, /* U+0031f2: KATAKANA LETTER SMALL SU*/
- RTUNI_ALPHA, /* U+0031f3: KATAKANA LETTER SMALL TO*/
- RTUNI_ALPHA, /* U+0031f4: KATAKANA LETTER SMALL NU*/
- RTUNI_ALPHA, /* U+0031f5: KATAKANA LETTER SMALL HA*/
- RTUNI_ALPHA, /* U+0031f6: KATAKANA LETTER SMALL HI*/
- RTUNI_ALPHA, /* U+0031f7: KATAKANA LETTER SMALL HU*/
- RTUNI_ALPHA, /* U+0031f8: KATAKANA LETTER SMALL HE*/
- RTUNI_ALPHA, /* U+0031f9: KATAKANA LETTER SMALL HO*/
- RTUNI_ALPHA, /* U+0031fa: KATAKANA LETTER SMALL MU*/
- RTUNI_ALPHA, /* U+0031fb: KATAKANA LETTER SMALL RA*/
- RTUNI_ALPHA, /* U+0031fc: KATAKANA LETTER SMALL RI*/
- RTUNI_ALPHA, /* U+0031fd: KATAKANA LETTER SMALL RU*/
- RTUNI_ALPHA, /* U+0031fe: KATAKANA LETTER SMALL RE*/
- RTUNI_ALPHA, /* U+0031ff: KATAKANA LETTER SMALL RO*/
- 0, /* U+003200: PARENTHESIZED HANGUL KIYEOK*/
- 0, /* U+003201: PARENTHESIZED HANGUL NIEUN*/
- 0, /* U+003202: PARENTHESIZED HANGUL TIKEUT*/
- 0, /* U+003203: PARENTHESIZED HANGUL RIEUL*/
- 0, /* U+003204: PARENTHESIZED HANGUL MIEUM*/
- 0, /* U+003205: PARENTHESIZED HANGUL PIEUP*/
- 0, /* U+003206: PARENTHESIZED HANGUL SIOS*/
- 0, /* U+003207: PARENTHESIZED HANGUL IEUNG*/
- 0, /* U+003208: PARENTHESIZED HANGUL CIEUC*/
- 0, /* U+003209: PARENTHESIZED HANGUL CHIEUCH*/
- 0, /* U+00320a: PARENTHESIZED HANGUL KHIEUKH*/
- 0, /* U+00320b: PARENTHESIZED HANGUL THIEUTH*/
- 0, /* U+00320c: PARENTHESIZED HANGUL PHIEUPH*/
- 0, /* U+00320d: PARENTHESIZED HANGUL HIEUH*/
- 0, /* U+00320e: PARENTHESIZED HANGUL KIYEOK A*/
- 0, /* U+00320f: PARENTHESIZED HANGUL NIEUN A*/
- 0, /* U+003210: PARENTHESIZED HANGUL TIKEUT A*/
- 0, /* U+003211: PARENTHESIZED HANGUL RIEUL A*/
- 0, /* U+003212: PARENTHESIZED HANGUL MIEUM A*/
- 0, /* U+003213: PARENTHESIZED HANGUL PIEUP A*/
- 0, /* U+003214: PARENTHESIZED HANGUL SIOS A*/
- 0, /* U+003215: PARENTHESIZED HANGUL IEUNG A*/
- 0, /* U+003216: PARENTHESIZED HANGUL CIEUC A*/
- 0, /* U+003217: PARENTHESIZED HANGUL CHIEUCH A*/
- 0, /* U+003218: PARENTHESIZED HANGUL KHIEUKH A*/
- 0, /* U+003219: PARENTHESIZED HANGUL THIEUTH A*/
- 0, /* U+00321a: PARENTHESIZED HANGUL PHIEUPH A*/
- 0, /* U+00321b: PARENTHESIZED HANGUL HIEUH A*/
- 0, /* U+00321c: PARENTHESIZED HANGUL CIEUC U*/
- 0, /* U+00321d: PARENTHESIZED KOREAN CHARACTER OJEON*/
- 0, /* U+00321e: PARENTHESIZED KOREAN CHARACTER O HU*/
- 0, /* U+00321f: */
- 0, /* U+003220: PARENTHESIZED IDEOGRAPH ONE*/
- 0, /* U+003221: PARENTHESIZED IDEOGRAPH TWO*/
- 0, /* U+003222: PARENTHESIZED IDEOGRAPH THREE*/
- 0, /* U+003223: PARENTHESIZED IDEOGRAPH FOUR*/
- 0, /* U+003224: PARENTHESIZED IDEOGRAPH FIVE*/
- 0, /* U+003225: PARENTHESIZED IDEOGRAPH SIX*/
- 0, /* U+003226: PARENTHESIZED IDEOGRAPH SEVEN*/
- 0, /* U+003227: PARENTHESIZED IDEOGRAPH EIGHT*/
- 0, /* U+003228: PARENTHESIZED IDEOGRAPH NINE*/
- 0, /* U+003229: PARENTHESIZED IDEOGRAPH TEN*/
- 0, /* U+00322a: PARENTHESIZED IDEOGRAPH MOON*/
- 0, /* U+00322b: PARENTHESIZED IDEOGRAPH FIRE*/
- 0, /* U+00322c: PARENTHESIZED IDEOGRAPH WATER*/
- 0, /* U+00322d: PARENTHESIZED IDEOGRAPH WOOD*/
- 0, /* U+00322e: PARENTHESIZED IDEOGRAPH METAL*/
- 0, /* U+00322f: PARENTHESIZED IDEOGRAPH EARTH*/
- 0, /* U+003230: PARENTHESIZED IDEOGRAPH SUN*/
- 0, /* U+003231: PARENTHESIZED IDEOGRAPH STOCK*/
- 0, /* U+003232: PARENTHESIZED IDEOGRAPH HAVE*/
- 0, /* U+003233: PARENTHESIZED IDEOGRAPH SOCIETY*/
- 0, /* U+003234: PARENTHESIZED IDEOGRAPH NAME*/
- 0, /* U+003235: PARENTHESIZED IDEOGRAPH SPECIAL*/
- 0, /* U+003236: PARENTHESIZED IDEOGRAPH FINANCIAL*/
- 0, /* U+003237: PARENTHESIZED IDEOGRAPH CONGRATULATION*/
- 0, /* U+003238: PARENTHESIZED IDEOGRAPH LABOR*/
- 0, /* U+003239: PARENTHESIZED IDEOGRAPH REPRESENT*/
- 0, /* U+00323a: PARENTHESIZED IDEOGRAPH CALL*/
- 0, /* U+00323b: PARENTHESIZED IDEOGRAPH STUDY*/
- 0, /* U+00323c: PARENTHESIZED IDEOGRAPH SUPERVISE*/
- 0, /* U+00323d: PARENTHESIZED IDEOGRAPH ENTERPRISE*/
- 0, /* U+00323e: PARENTHESIZED IDEOGRAPH RESOURCE*/
- 0, /* U+00323f: PARENTHESIZED IDEOGRAPH ALLIANCE*/
- 0, /* U+003240: PARENTHESIZED IDEOGRAPH FESTIVAL*/
- 0, /* U+003241: PARENTHESIZED IDEOGRAPH REST*/
- 0, /* U+003242: PARENTHESIZED IDEOGRAPH SELF*/
- 0, /* U+003243: PARENTHESIZED IDEOGRAPH REACH*/
- 0, /* U+003244: */
- 0, /* U+003245: */
- 0, /* U+003246: */
- 0, /* U+003247: */
- 0, /* U+003248: */
- 0, /* U+003249: */
- 0, /* U+00324a: */
- 0, /* U+00324b: */
- 0, /* U+00324c: */
- 0, /* U+00324d: */
- 0, /* U+00324e: */
- 0, /* U+00324f: */
- 0, /* U+003250: PARTNERSHIP SIGN*/
- 0, /* U+003251: CIRCLED NUMBER TWENTY ONE*/
- 0, /* U+003252: CIRCLED NUMBER TWENTY TWO*/
- 0, /* U+003253: CIRCLED NUMBER TWENTY THREE*/
- 0, /* U+003254: CIRCLED NUMBER TWENTY FOUR*/
- 0, /* U+003255: CIRCLED NUMBER TWENTY FIVE*/
- 0, /* U+003256: CIRCLED NUMBER TWENTY SIX*/
- 0, /* U+003257: CIRCLED NUMBER TWENTY SEVEN*/
- 0, /* U+003258: CIRCLED NUMBER TWENTY EIGHT*/
- 0, /* U+003259: CIRCLED NUMBER TWENTY NINE*/
- 0, /* U+00325a: CIRCLED NUMBER THIRTY*/
- 0, /* U+00325b: CIRCLED NUMBER THIRTY ONE*/
- 0, /* U+00325c: CIRCLED NUMBER THIRTY TWO*/
- 0, /* U+00325d: CIRCLED NUMBER THIRTY THREE*/
- 0, /* U+00325e: CIRCLED NUMBER THIRTY FOUR*/
- 0, /* U+00325f: CIRCLED NUMBER THIRTY FIVE*/
- 0, /* U+003260: CIRCLED HANGUL KIYEOK*/
- 0, /* U+003261: CIRCLED HANGUL NIEUN*/
- 0, /* U+003262: CIRCLED HANGUL TIKEUT*/
- 0, /* U+003263: CIRCLED HANGUL RIEUL*/
- 0, /* U+003264: CIRCLED HANGUL MIEUM*/
- 0, /* U+003265: CIRCLED HANGUL PIEUP*/
- 0, /* U+003266: CIRCLED HANGUL SIOS*/
- 0, /* U+003267: CIRCLED HANGUL IEUNG*/
- 0, /* U+003268: CIRCLED HANGUL CIEUC*/
- 0, /* U+003269: CIRCLED HANGUL CHIEUCH*/
- 0, /* U+00326a: CIRCLED HANGUL KHIEUKH*/
- 0, /* U+00326b: CIRCLED HANGUL THIEUTH*/
- 0, /* U+00326c: CIRCLED HANGUL PHIEUPH*/
- 0, /* U+00326d: CIRCLED HANGUL HIEUH*/
- 0, /* U+00326e: CIRCLED HANGUL KIYEOK A*/
- 0, /* U+00326f: CIRCLED HANGUL NIEUN A*/
- 0, /* U+003270: CIRCLED HANGUL TIKEUT A*/
- 0, /* U+003271: CIRCLED HANGUL RIEUL A*/
- 0, /* U+003272: CIRCLED HANGUL MIEUM A*/
- 0, /* U+003273: CIRCLED HANGUL PIEUP A*/
- 0, /* U+003274: CIRCLED HANGUL SIOS A*/
- 0, /* U+003275: CIRCLED HANGUL IEUNG A*/
- 0, /* U+003276: CIRCLED HANGUL CIEUC A*/
- 0, /* U+003277: CIRCLED HANGUL CHIEUCH A*/
- 0, /* U+003278: CIRCLED HANGUL KHIEUKH A*/
- 0, /* U+003279: CIRCLED HANGUL THIEUTH A*/
- 0, /* U+00327a: CIRCLED HANGUL PHIEUPH A*/
- 0, /* U+00327b: CIRCLED HANGUL HIEUH A*/
- 0, /* U+00327c: CIRCLED KOREAN CHARACTER CHAMKO*/
- 0, /* U+00327d: CIRCLED KOREAN CHARACTER JUEUI*/
- 0, /* U+00327e: CIRCLED HANGUL IEUNG U*/
- 0, /* U+00327f: KOREAN STANDARD SYMBOL*/
- 0, /* U+003280: CIRCLED IDEOGRAPH ONE*/
- 0, /* U+003281: CIRCLED IDEOGRAPH TWO*/
- 0, /* U+003282: CIRCLED IDEOGRAPH THREE*/
- 0, /* U+003283: CIRCLED IDEOGRAPH FOUR*/
- 0, /* U+003284: CIRCLED IDEOGRAPH FIVE*/
- 0, /* U+003285: CIRCLED IDEOGRAPH SIX*/
- 0, /* U+003286: CIRCLED IDEOGRAPH SEVEN*/
- 0, /* U+003287: CIRCLED IDEOGRAPH EIGHT*/
- 0, /* U+003288: CIRCLED IDEOGRAPH NINE*/
- 0, /* U+003289: CIRCLED IDEOGRAPH TEN*/
- 0, /* U+00328a: CIRCLED IDEOGRAPH MOON*/
- 0, /* U+00328b: CIRCLED IDEOGRAPH FIRE*/
- 0, /* U+00328c: CIRCLED IDEOGRAPH WATER*/
- 0, /* U+00328d: CIRCLED IDEOGRAPH WOOD*/
- 0, /* U+00328e: CIRCLED IDEOGRAPH METAL*/
- 0, /* U+00328f: CIRCLED IDEOGRAPH EARTH*/
- 0, /* U+003290: CIRCLED IDEOGRAPH SUN*/
- 0, /* U+003291: CIRCLED IDEOGRAPH STOCK*/
- 0, /* U+003292: CIRCLED IDEOGRAPH HAVE*/
- 0, /* U+003293: CIRCLED IDEOGRAPH SOCIETY*/
- 0, /* U+003294: CIRCLED IDEOGRAPH NAME*/
- 0, /* U+003295: CIRCLED IDEOGRAPH SPECIAL*/
- 0, /* U+003296: CIRCLED IDEOGRAPH FINANCIAL*/
- 0, /* U+003297: CIRCLED IDEOGRAPH CONGRATULATION*/
- 0, /* U+003298: CIRCLED IDEOGRAPH LABOR*/
- 0, /* U+003299: CIRCLED IDEOGRAPH SECRET*/
- 0, /* U+00329a: CIRCLED IDEOGRAPH MALE*/
- 0, /* U+00329b: CIRCLED IDEOGRAPH FEMALE*/
- 0, /* U+00329c: CIRCLED IDEOGRAPH SUITABLE*/
- 0, /* U+00329d: CIRCLED IDEOGRAPH EXCELLENT*/
- 0, /* U+00329e: CIRCLED IDEOGRAPH PRINT*/
- 0, /* U+00329f: CIRCLED IDEOGRAPH ATTENTION*/
- 0, /* U+0032a0: CIRCLED IDEOGRAPH ITEM*/
- 0, /* U+0032a1: CIRCLED IDEOGRAPH REST*/
- 0, /* U+0032a2: CIRCLED IDEOGRAPH COPY*/
- 0, /* U+0032a3: CIRCLED IDEOGRAPH CORRECT*/
- 0, /* U+0032a4: CIRCLED IDEOGRAPH HIGH*/
- 0, /* U+0032a5: CIRCLED IDEOGRAPH CENTRE*/
- 0, /* U+0032a6: CIRCLED IDEOGRAPH LOW*/
- 0, /* U+0032a7: CIRCLED IDEOGRAPH LEFT*/
- 0, /* U+0032a8: CIRCLED IDEOGRAPH RIGHT*/
- 0, /* U+0032a9: CIRCLED IDEOGRAPH MEDICINE*/
- 0, /* U+0032aa: CIRCLED IDEOGRAPH RELIGION*/
- 0, /* U+0032ab: CIRCLED IDEOGRAPH STUDY*/
- 0, /* U+0032ac: CIRCLED IDEOGRAPH SUPERVISE*/
- 0, /* U+0032ad: CIRCLED IDEOGRAPH ENTERPRISE*/
- 0, /* U+0032ae: CIRCLED IDEOGRAPH RESOURCE*/
- 0, /* U+0032af: CIRCLED IDEOGRAPH ALLIANCE*/
- 0, /* U+0032b0: CIRCLED IDEOGRAPH NIGHT*/
- 0, /* U+0032b1: CIRCLED NUMBER THIRTY SIX*/
- 0, /* U+0032b2: CIRCLED NUMBER THIRTY SEVEN*/
- 0, /* U+0032b3: CIRCLED NUMBER THIRTY EIGHT*/
- 0, /* U+0032b4: CIRCLED NUMBER THIRTY NINE*/
- 0, /* U+0032b5: CIRCLED NUMBER FORTY*/
- 0, /* U+0032b6: CIRCLED NUMBER FORTY ONE*/
- 0, /* U+0032b7: CIRCLED NUMBER FORTY TWO*/
- 0, /* U+0032b8: CIRCLED NUMBER FORTY THREE*/
- 0, /* U+0032b9: CIRCLED NUMBER FORTY FOUR*/
- 0, /* U+0032ba: CIRCLED NUMBER FORTY FIVE*/
- 0, /* U+0032bb: CIRCLED NUMBER FORTY SIX*/
- 0, /* U+0032bc: CIRCLED NUMBER FORTY SEVEN*/
- 0, /* U+0032bd: CIRCLED NUMBER FORTY EIGHT*/
- 0, /* U+0032be: CIRCLED NUMBER FORTY NINE*/
- 0, /* U+0032bf: CIRCLED NUMBER FIFTY*/
- 0, /* U+0032c0: IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY*/
- 0, /* U+0032c1: IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY*/
- 0, /* U+0032c2: IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH*/
- 0, /* U+0032c3: IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL*/
- 0, /* U+0032c4: IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY*/
- 0, /* U+0032c5: IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE*/
- 0, /* U+0032c6: IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY*/
- 0, /* U+0032c7: IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST*/
- 0, /* U+0032c8: IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER*/
- 0, /* U+0032c9: IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER*/
- 0, /* U+0032ca: IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER*/
- 0, /* U+0032cb: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER*/
- 0, /* U+0032cc: SQUARE HG*/
- 0, /* U+0032cd: SQUARE ERG*/
- 0, /* U+0032ce: SQUARE EV*/
- 0, /* U+0032cf: LIMITED LIABILITY SIGN*/
- 0, /* U+0032d0: CIRCLED KATAKANA A*/
- 0, /* U+0032d1: CIRCLED KATAKANA I*/
- 0, /* U+0032d2: CIRCLED KATAKANA U*/
- 0, /* U+0032d3: CIRCLED KATAKANA E*/
- 0, /* U+0032d4: CIRCLED KATAKANA O*/
- 0, /* U+0032d5: CIRCLED KATAKANA KA*/
- 0, /* U+0032d6: CIRCLED KATAKANA KI*/
- 0, /* U+0032d7: CIRCLED KATAKANA KU*/
- 0, /* U+0032d8: CIRCLED KATAKANA KE*/
- 0, /* U+0032d9: CIRCLED KATAKANA KO*/
- 0, /* U+0032da: CIRCLED KATAKANA SA*/
- 0, /* U+0032db: CIRCLED KATAKANA SI*/
- 0, /* U+0032dc: CIRCLED KATAKANA SU*/
- 0, /* U+0032dd: CIRCLED KATAKANA SE*/
- 0, /* U+0032de: CIRCLED KATAKANA SO*/
- 0, /* U+0032df: CIRCLED KATAKANA TA*/
- 0, /* U+0032e0: CIRCLED KATAKANA TI*/
- 0, /* U+0032e1: CIRCLED KATAKANA TU*/
- 0, /* U+0032e2: CIRCLED KATAKANA TE*/
- 0, /* U+0032e3: CIRCLED KATAKANA TO*/
- 0, /* U+0032e4: CIRCLED KATAKANA NA*/
- 0, /* U+0032e5: CIRCLED KATAKANA NI*/
- 0, /* U+0032e6: CIRCLED KATAKANA NU*/
- 0, /* U+0032e7: CIRCLED KATAKANA NE*/
- 0, /* U+0032e8: CIRCLED KATAKANA NO*/
- 0, /* U+0032e9: CIRCLED KATAKANA HA*/
- 0, /* U+0032ea: CIRCLED KATAKANA HI*/
- 0, /* U+0032eb: CIRCLED KATAKANA HU*/
- 0, /* U+0032ec: CIRCLED KATAKANA HE*/
- 0, /* U+0032ed: CIRCLED KATAKANA HO*/
- 0, /* U+0032ee: CIRCLED KATAKANA MA*/
- 0, /* U+0032ef: CIRCLED KATAKANA MI*/
- 0, /* U+0032f0: CIRCLED KATAKANA MU*/
- 0, /* U+0032f1: CIRCLED KATAKANA ME*/
- 0, /* U+0032f2: CIRCLED KATAKANA MO*/
- 0, /* U+0032f3: CIRCLED KATAKANA YA*/
- 0, /* U+0032f4: CIRCLED KATAKANA YU*/
- 0, /* U+0032f5: CIRCLED KATAKANA YO*/
- 0, /* U+0032f6: CIRCLED KATAKANA RA*/
- 0, /* U+0032f7: CIRCLED KATAKANA RI*/
- 0, /* U+0032f8: CIRCLED KATAKANA RU*/
- 0, /* U+0032f9: CIRCLED KATAKANA RE*/
- 0, /* U+0032fa: CIRCLED KATAKANA RO*/
- 0, /* U+0032fb: CIRCLED KATAKANA WA*/
- 0, /* U+0032fc: CIRCLED KATAKANA WI*/
- 0, /* U+0032fd: CIRCLED KATAKANA WE*/
- 0, /* U+0032fe: CIRCLED KATAKANA WO*/
- 0, /* U+0032ff: */
- 0, /* U+003300: SQUARE APAATO*/
- 0, /* U+003301: SQUARE ARUHUA*/
- 0, /* U+003302: SQUARE ANPEA*/
- 0, /* U+003303: SQUARE AARU*/
- 0, /* U+003304: SQUARE ININGU*/
- 0, /* U+003305: SQUARE INTI*/
- 0, /* U+003306: SQUARE UON*/
- 0, /* U+003307: SQUARE ESUKUUDO*/
- 0, /* U+003308: SQUARE EEKAA*/
- 0, /* U+003309: SQUARE ONSU*/
- 0, /* U+00330a: SQUARE OOMU*/
- 0, /* U+00330b: SQUARE KAIRI*/
- 0, /* U+00330c: SQUARE KARATTO*/
- 0, /* U+00330d: SQUARE KARORII*/
- 0, /* U+00330e: SQUARE GARON*/
- 0, /* U+00330f: SQUARE GANMA*/
- 0, /* U+003310: SQUARE GIGA*/
- 0, /* U+003311: SQUARE GINII*/
- 0, /* U+003312: SQUARE KYURII*/
- 0, /* U+003313: SQUARE GIRUDAA*/
- 0, /* U+003314: SQUARE KIRO*/
- 0, /* U+003315: SQUARE KIROGURAMU*/
- 0, /* U+003316: SQUARE KIROMEETORU*/
- 0, /* U+003317: SQUARE KIROWATTO*/
- 0, /* U+003318: SQUARE GURAMU*/
- 0, /* U+003319: SQUARE GURAMUTON*/
- 0, /* U+00331a: SQUARE KURUZEIRO*/
- 0, /* U+00331b: SQUARE KUROONE*/
- 0, /* U+00331c: SQUARE KEESU*/
- 0, /* U+00331d: SQUARE KORUNA*/
- 0, /* U+00331e: SQUARE KOOPO*/
- 0, /* U+00331f: SQUARE SAIKURU*/
- 0, /* U+003320: SQUARE SANTIIMU*/
- 0, /* U+003321: SQUARE SIRINGU*/
- 0, /* U+003322: SQUARE SENTI*/
- 0, /* U+003323: SQUARE SENTO*/
- 0, /* U+003324: SQUARE DAASU*/
- 0, /* U+003325: SQUARE DESI*/
- 0, /* U+003326: SQUARE DORU*/
- 0, /* U+003327: SQUARE TON*/
- 0, /* U+003328: SQUARE NANO*/
- 0, /* U+003329: SQUARE NOTTO*/
- 0, /* U+00332a: SQUARE HAITU*/
- 0, /* U+00332b: SQUARE PAASENTO*/
- 0, /* U+00332c: SQUARE PAATU*/
- 0, /* U+00332d: SQUARE BAARERU*/
- 0, /* U+00332e: SQUARE PIASUTORU*/
- 0, /* U+00332f: SQUARE PIKURU*/
- 0, /* U+003330: SQUARE PIKO*/
- 0, /* U+003331: SQUARE BIRU*/
- 0, /* U+003332: SQUARE HUARADDO*/
- 0, /* U+003333: SQUARE HUIITO*/
- 0, /* U+003334: SQUARE BUSSYERU*/
- 0, /* U+003335: SQUARE HURAN*/
- 0, /* U+003336: SQUARE HEKUTAARU*/
- 0, /* U+003337: SQUARE PESO*/
- 0, /* U+003338: SQUARE PENIHI*/
- 0, /* U+003339: SQUARE HERUTU*/
- 0, /* U+00333a: SQUARE PENSU*/
- 0, /* U+00333b: SQUARE PEEZI*/
- 0, /* U+00333c: SQUARE BEETA*/
- 0, /* U+00333d: SQUARE POINTO*/
- 0, /* U+00333e: SQUARE BORUTO*/
- 0, /* U+00333f: SQUARE HON*/
- 0, /* U+003340: SQUARE PONDO*/
- 0, /* U+003341: SQUARE HOORU*/
- 0, /* U+003342: SQUARE HOON*/
- 0, /* U+003343: SQUARE MAIKURO*/
- 0, /* U+003344: SQUARE MAIRU*/
- 0, /* U+003345: SQUARE MAHHA*/
- 0, /* U+003346: SQUARE MARUKU*/
- 0, /* U+003347: SQUARE MANSYON*/
- 0, /* U+003348: SQUARE MIKURON*/
- 0, /* U+003349: SQUARE MIRI*/
- 0, /* U+00334a: SQUARE MIRIBAARU*/
- 0, /* U+00334b: SQUARE MEGA*/
- 0, /* U+00334c: SQUARE MEGATON*/
- 0, /* U+00334d: SQUARE MEETORU*/
- 0, /* U+00334e: SQUARE YAADO*/
- 0, /* U+00334f: SQUARE YAARU*/
- 0, /* U+003350: SQUARE YUAN*/
- 0, /* U+003351: SQUARE RITTORU*/
- 0, /* U+003352: SQUARE RIRA*/
- 0, /* U+003353: SQUARE RUPII*/
- 0, /* U+003354: SQUARE RUUBURU*/
- 0, /* U+003355: SQUARE REMU*/
- 0, /* U+003356: SQUARE RENTOGEN*/
- 0, /* U+003357: SQUARE WATTO*/
- 0, /* U+003358: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO*/
- 0, /* U+003359: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE*/
- 0, /* U+00335a: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO*/
- 0, /* U+00335b: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE*/
- 0, /* U+00335c: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR*/
- 0, /* U+00335d: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE*/
- 0, /* U+00335e: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX*/
- 0, /* U+00335f: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN*/
- 0, /* U+003360: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT*/
- 0, /* U+003361: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE*/
- 0, /* U+003362: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN*/
- 0, /* U+003363: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN*/
- 0, /* U+003364: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE*/
- 0, /* U+003365: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN*/
- 0, /* U+003366: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN*/
- 0, /* U+003367: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN*/
- 0, /* U+003368: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN*/
- 0, /* U+003369: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN*/
- 0, /* U+00336a: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN*/
- 0, /* U+00336b: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN*/
- 0, /* U+00336c: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY*/
- 0, /* U+00336d: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE*/
- 0, /* U+00336e: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO*/
- 0, /* U+00336f: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE*/
- 0, /* U+003370: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR*/
- 0, /* U+003371: SQUARE HPA*/
- 0, /* U+003372: SQUARE DA*/
- 0, /* U+003373: SQUARE AU*/
- 0, /* U+003374: SQUARE BAR*/
- 0, /* U+003375: SQUARE OV*/
- 0, /* U+003376: SQUARE PC*/
- 0, /* U+003377: SQUARE DM*/
- 0, /* U+003378: SQUARE DM SQUARED*/
- 0, /* U+003379: SQUARE DM CUBED*/
- 0, /* U+00337a: SQUARE IU*/
- 0, /* U+00337b: SQUARE ERA NAME HEISEI*/
- 0, /* U+00337c: SQUARE ERA NAME SYOUWA*/
- 0, /* U+00337d: SQUARE ERA NAME TAISYOU*/
- 0, /* U+00337e: SQUARE ERA NAME MEIZI*/
- 0, /* U+00337f: SQUARE CORPORATION*/
- 0, /* U+003380: SQUARE PA AMPS*/
- 0, /* U+003381: SQUARE NA*/
- 0, /* U+003382: SQUARE MU A*/
- 0, /* U+003383: SQUARE MA*/
- 0, /* U+003384: SQUARE KA*/
- 0, /* U+003385: SQUARE KB*/
- 0, /* U+003386: SQUARE MB*/
- 0, /* U+003387: SQUARE GB*/
- 0, /* U+003388: SQUARE CAL*/
- 0, /* U+003389: SQUARE KCAL*/
- 0, /* U+00338a: SQUARE PF*/
- 0, /* U+00338b: SQUARE NF*/
- 0, /* U+00338c: SQUARE MU F*/
- 0, /* U+00338d: SQUARE MU G*/
- 0, /* U+00338e: SQUARE MG*/
- 0, /* U+00338f: SQUARE KG*/
- 0, /* U+003390: SQUARE HZ*/
- 0, /* U+003391: SQUARE KHZ*/
- 0, /* U+003392: SQUARE MHZ*/
- 0, /* U+003393: SQUARE GHZ*/
- 0, /* U+003394: SQUARE THZ*/
- 0, /* U+003395: SQUARE MU L*/
- 0, /* U+003396: SQUARE ML*/
- 0, /* U+003397: SQUARE DL*/
- 0, /* U+003398: SQUARE KL*/
- 0, /* U+003399: SQUARE FM*/
- 0, /* U+00339a: SQUARE NM*/
- 0, /* U+00339b: SQUARE MU M*/
- 0, /* U+00339c: SQUARE MM*/
- 0, /* U+00339d: SQUARE CM*/
- 0, /* U+00339e: SQUARE KM*/
- 0, /* U+00339f: SQUARE MM SQUARED*/
- 0, /* U+0033a0: SQUARE CM SQUARED*/
- 0, /* U+0033a1: SQUARE M SQUARED*/
- 0, /* U+0033a2: SQUARE KM SQUARED*/
- 0, /* U+0033a3: SQUARE MM CUBED*/
- 0, /* U+0033a4: SQUARE CM CUBED*/
- 0, /* U+0033a5: SQUARE M CUBED*/
- 0, /* U+0033a6: SQUARE KM CUBED*/
- 0, /* U+0033a7: SQUARE M OVER S*/
- 0, /* U+0033a8: SQUARE M OVER S SQUARED*/
- 0, /* U+0033a9: SQUARE PA*/
- 0, /* U+0033aa: SQUARE KPA*/
- 0, /* U+0033ab: SQUARE MPA*/
- 0, /* U+0033ac: SQUARE GPA*/
- 0, /* U+0033ad: SQUARE RAD*/
- 0, /* U+0033ae: SQUARE RAD OVER S*/
- 0, /* U+0033af: SQUARE RAD OVER S SQUARED*/
- 0, /* U+0033b0: SQUARE PS*/
- 0, /* U+0033b1: SQUARE NS*/
- 0, /* U+0033b2: SQUARE MU S*/
- 0, /* U+0033b3: SQUARE MS*/
- 0, /* U+0033b4: SQUARE PV*/
- 0, /* U+0033b5: SQUARE NV*/
- 0, /* U+0033b6: SQUARE MU V*/
- 0, /* U+0033b7: SQUARE MV*/
- 0, /* U+0033b8: SQUARE KV*/
- 0, /* U+0033b9: SQUARE MV MEGA*/
- 0, /* U+0033ba: SQUARE PW*/
- 0, /* U+0033bb: SQUARE NW*/
- 0, /* U+0033bc: SQUARE MU W*/
- 0, /* U+0033bd: SQUARE MW*/
- 0, /* U+0033be: SQUARE KW*/
- 0, /* U+0033bf: SQUARE MW MEGA*/
- 0, /* U+0033c0: SQUARE K OHM*/
- 0, /* U+0033c1: SQUARE M OHM*/
- 0, /* U+0033c2: SQUARE AM*/
- 0, /* U+0033c3: SQUARE BQ*/
- 0, /* U+0033c4: SQUARE CC*/
- 0, /* U+0033c5: SQUARE CD*/
- 0, /* U+0033c6: SQUARE C OVER KG*/
- 0, /* U+0033c7: SQUARE CO*/
- 0, /* U+0033c8: SQUARE DB*/
- 0, /* U+0033c9: SQUARE GY*/
- 0, /* U+0033ca: SQUARE HA*/
- 0, /* U+0033cb: SQUARE HP*/
- 0, /* U+0033cc: SQUARE IN*/
- 0, /* U+0033cd: SQUARE KK*/
- 0, /* U+0033ce: SQUARE KM CAPITAL*/
- 0, /* U+0033cf: SQUARE KT*/
- 0, /* U+0033d0: SQUARE LM*/
- 0, /* U+0033d1: SQUARE LN*/
- 0, /* U+0033d2: SQUARE LOG*/
- 0, /* U+0033d3: SQUARE LX*/
- 0, /* U+0033d4: SQUARE MB SMALL*/
- 0, /* U+0033d5: SQUARE MIL*/
- 0, /* U+0033d6: SQUARE MOL*/
- 0, /* U+0033d7: SQUARE PH*/
- 0, /* U+0033d8: SQUARE PM*/
- 0, /* U+0033d9: SQUARE PPM*/
- 0, /* U+0033da: SQUARE PR*/
- 0, /* U+0033db: SQUARE SR*/
- 0, /* U+0033dc: SQUARE SV*/
- 0, /* U+0033dd: SQUARE WB*/
- 0, /* U+0033de: SQUARE V OVER M*/
- 0, /* U+0033df: SQUARE A OVER M*/
- 0, /* U+0033e0: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE*/
- 0, /* U+0033e1: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO*/
- 0, /* U+0033e2: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE*/
- 0, /* U+0033e3: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR*/
- 0, /* U+0033e4: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE*/
- 0, /* U+0033e5: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX*/
- 0, /* U+0033e6: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN*/
- 0, /* U+0033e7: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT*/
- 0, /* U+0033e8: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE*/
- 0, /* U+0033e9: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN*/
- 0, /* U+0033ea: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN*/
- 0, /* U+0033eb: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE*/
- 0, /* U+0033ec: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN*/
- 0, /* U+0033ed: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN*/
- 0, /* U+0033ee: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN*/
- 0, /* U+0033ef: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN*/
- 0, /* U+0033f0: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN*/
- 0, /* U+0033f1: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN*/
- 0, /* U+0033f2: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN*/
- 0, /* U+0033f3: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY*/
- 0, /* U+0033f4: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE*/
- 0, /* U+0033f5: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO*/
- 0, /* U+0033f6: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE*/
- 0, /* U+0033f7: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR*/
- 0, /* U+0033f8: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE*/
- 0, /* U+0033f9: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX*/
- 0, /* U+0033fa: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN*/
- 0, /* U+0033fb: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT*/
- 0, /* U+0033fc: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE*/
- 0, /* U+0033fd: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY*/
- 0, /* U+0033fe: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE*/
- 0, /* U+0033ff: SQUARE GAL*/
- RTUNI_ALPHA, /* U+003400: <CJK Ideograph Extension A, First>*/
-};
-
-static const uint8_t g_afRTUniFlags0x004db5[] =
-{
- RTUNI_ALPHA, /* U+004db5: <CJK Ideograph Extension A, Last>*/
- 0, /* U+004db6: */
- 0, /* U+004db7: */
- 0, /* U+004db8: */
- 0, /* U+004db9: */
- 0, /* U+004dba: */
- 0, /* U+004dbb: */
- 0, /* U+004dbc: */
- 0, /* U+004dbd: */
- 0, /* U+004dbe: */
- 0, /* U+004dbf: */
- 0, /* U+004dc0: HEXAGRAM FOR THE CREATIVE HEAVEN*/
- 0, /* U+004dc1: HEXAGRAM FOR THE RECEPTIVE EARTH*/
- 0, /* U+004dc2: HEXAGRAM FOR DIFFICULTY AT THE BEGINNING*/
- 0, /* U+004dc3: HEXAGRAM FOR YOUTHFUL FOLLY*/
- 0, /* U+004dc4: HEXAGRAM FOR WAITING*/
- 0, /* U+004dc5: HEXAGRAM FOR CONFLICT*/
- 0, /* U+004dc6: HEXAGRAM FOR THE ARMY*/
- 0, /* U+004dc7: HEXAGRAM FOR HOLDING TOGETHER*/
- 0, /* U+004dc8: HEXAGRAM FOR SMALL TAMING*/
- 0, /* U+004dc9: HEXAGRAM FOR TREADING*/
- 0, /* U+004dca: HEXAGRAM FOR PEACE*/
- 0, /* U+004dcb: HEXAGRAM FOR STANDSTILL*/
- 0, /* U+004dcc: HEXAGRAM FOR FELLOWSHIP*/
- 0, /* U+004dcd: HEXAGRAM FOR GREAT POSSESSION*/
- 0, /* U+004dce: HEXAGRAM FOR MODESTY*/
- 0, /* U+004dcf: HEXAGRAM FOR ENTHUSIASM*/
- 0, /* U+004dd0: HEXAGRAM FOR FOLLOWING*/
- 0, /* U+004dd1: HEXAGRAM FOR WORK ON THE DECAYED*/
- 0, /* U+004dd2: HEXAGRAM FOR APPROACH*/
- 0, /* U+004dd3: HEXAGRAM FOR CONTEMPLATION*/
- 0, /* U+004dd4: HEXAGRAM FOR BITING THROUGH*/
- 0, /* U+004dd5: HEXAGRAM FOR GRACE*/
- 0, /* U+004dd6: HEXAGRAM FOR SPLITTING APART*/
- 0, /* U+004dd7: HEXAGRAM FOR RETURN*/
- 0, /* U+004dd8: HEXAGRAM FOR INNOCENCE*/
- 0, /* U+004dd9: HEXAGRAM FOR GREAT TAMING*/
- 0, /* U+004dda: HEXAGRAM FOR MOUTH CORNERS*/
- 0, /* U+004ddb: HEXAGRAM FOR GREAT PREPONDERANCE*/
- 0, /* U+004ddc: HEXAGRAM FOR THE ABYSMAL WATER*/
- 0, /* U+004ddd: HEXAGRAM FOR THE CLINGING FIRE*/
- 0, /* U+004dde: HEXAGRAM FOR INFLUENCE*/
- 0, /* U+004ddf: HEXAGRAM FOR DURATION*/
- 0, /* U+004de0: HEXAGRAM FOR RETREAT*/
- 0, /* U+004de1: HEXAGRAM FOR GREAT POWER*/
- 0, /* U+004de2: HEXAGRAM FOR PROGRESS*/
- 0, /* U+004de3: HEXAGRAM FOR DARKENING OF THE LIGHT*/
- 0, /* U+004de4: HEXAGRAM FOR THE FAMILY*/
- 0, /* U+004de5: HEXAGRAM FOR OPPOSITION*/
- 0, /* U+004de6: HEXAGRAM FOR OBSTRUCTION*/
- 0, /* U+004de7: HEXAGRAM FOR DELIVERANCE*/
- 0, /* U+004de8: HEXAGRAM FOR DECREASE*/
- 0, /* U+004de9: HEXAGRAM FOR INCREASE*/
- 0, /* U+004dea: HEXAGRAM FOR BREAKTHROUGH*/
- 0, /* U+004deb: HEXAGRAM FOR COMING TO MEET*/
- 0, /* U+004dec: HEXAGRAM FOR GATHERING TOGETHER*/
- 0, /* U+004ded: HEXAGRAM FOR PUSHING UPWARD*/
- 0, /* U+004dee: HEXAGRAM FOR OPPRESSION*/
- 0, /* U+004def: HEXAGRAM FOR THE WELL*/
- 0, /* U+004df0: HEXAGRAM FOR REVOLUTION*/
- 0, /* U+004df1: HEXAGRAM FOR THE CAULDRON*/
- 0, /* U+004df2: HEXAGRAM FOR THE AROUSING THUNDER*/
- 0, /* U+004df3: HEXAGRAM FOR THE KEEPING STILL MOUNTAIN*/
- 0, /* U+004df4: HEXAGRAM FOR DEVELOPMENT*/
- 0, /* U+004df5: HEXAGRAM FOR THE MARRYING MAIDEN*/
- 0, /* U+004df6: HEXAGRAM FOR ABUNDANCE*/
- 0, /* U+004df7: HEXAGRAM FOR THE WANDERER*/
- 0, /* U+004df8: HEXAGRAM FOR THE GENTLE WIND*/
- 0, /* U+004df9: HEXAGRAM FOR THE JOYOUS LAKE*/
- 0, /* U+004dfa: HEXAGRAM FOR DISPERSION*/
- 0, /* U+004dfb: HEXAGRAM FOR LIMITATION*/
- 0, /* U+004dfc: HEXAGRAM FOR INNER TRUTH*/
- 0, /* U+004dfd: HEXAGRAM FOR SMALL PREPONDERANCE*/
- 0, /* U+004dfe: HEXAGRAM FOR AFTER COMPLETION*/
- 0, /* U+004dff: HEXAGRAM FOR BEFORE COMPLETION*/
- RTUNI_ALPHA, /* U+004e00: <CJK Ideograph, First>*/
-};
-
-static const uint8_t g_afRTUniFlags0x009fbb[] =
-{
- RTUNI_ALPHA, /* U+009fbb: <CJK Ideograph, Last>*/
- 0, /* U+009fbc: */
- 0, /* U+009fbd: */
- 0, /* U+009fbe: */
- 0, /* U+009fbf: */
- 0, /* U+009fc0: */
- 0, /* U+009fc1: */
- 0, /* U+009fc2: */
- 0, /* U+009fc3: */
- 0, /* U+009fc4: */
- 0, /* U+009fc5: */
- 0, /* U+009fc6: */
- 0, /* U+009fc7: */
- 0, /* U+009fc8: */
- 0, /* U+009fc9: */
- 0, /* U+009fca: */
- 0, /* U+009fcb: */
- 0, /* U+009fcc: */
- 0, /* U+009fcd: */
- 0, /* U+009fce: */
- 0, /* U+009fcf: */
- 0, /* U+009fd0: */
- 0, /* U+009fd1: */
- 0, /* U+009fd2: */
- 0, /* U+009fd3: */
- 0, /* U+009fd4: */
- 0, /* U+009fd5: */
- 0, /* U+009fd6: */
- 0, /* U+009fd7: */
- 0, /* U+009fd8: */
- 0, /* U+009fd9: */
- 0, /* U+009fda: */
- 0, /* U+009fdb: */
- 0, /* U+009fdc: */
- 0, /* U+009fdd: */
- 0, /* U+009fde: */
- 0, /* U+009fdf: */
- 0, /* U+009fe0: */
- 0, /* U+009fe1: */
- 0, /* U+009fe2: */
- 0, /* U+009fe3: */
- 0, /* U+009fe4: */
- 0, /* U+009fe5: */
- 0, /* U+009fe6: */
- 0, /* U+009fe7: */
- 0, /* U+009fe8: */
- 0, /* U+009fe9: */
- 0, /* U+009fea: */
- 0, /* U+009feb: */
- 0, /* U+009fec: */
- 0, /* U+009fed: */
- 0, /* U+009fee: */
- 0, /* U+009fef: */
- 0, /* U+009ff0: */
- 0, /* U+009ff1: */
- 0, /* U+009ff2: */
- 0, /* U+009ff3: */
- 0, /* U+009ff4: */
- 0, /* U+009ff5: */
- 0, /* U+009ff6: */
- 0, /* U+009ff7: */
- 0, /* U+009ff8: */
- 0, /* U+009ff9: */
- 0, /* U+009ffa: */
- 0, /* U+009ffb: */
- 0, /* U+009ffc: */
- 0, /* U+009ffd: */
- 0, /* U+009ffe: */
- 0, /* U+009fff: */
- RTUNI_ALPHA, /* U+00a000: YI SYLLABLE IT*/
- RTUNI_ALPHA, /* U+00a001: YI SYLLABLE IX*/
- RTUNI_ALPHA, /* U+00a002: YI SYLLABLE I*/
- RTUNI_ALPHA, /* U+00a003: YI SYLLABLE IP*/
- RTUNI_ALPHA, /* U+00a004: YI SYLLABLE IET*/
- RTUNI_ALPHA, /* U+00a005: YI SYLLABLE IEX*/
- RTUNI_ALPHA, /* U+00a006: YI SYLLABLE IE*/
- RTUNI_ALPHA, /* U+00a007: YI SYLLABLE IEP*/
- RTUNI_ALPHA, /* U+00a008: YI SYLLABLE AT*/
- RTUNI_ALPHA, /* U+00a009: YI SYLLABLE AX*/
- RTUNI_ALPHA, /* U+00a00a: YI SYLLABLE A*/
- RTUNI_ALPHA, /* U+00a00b: YI SYLLABLE AP*/
- RTUNI_ALPHA, /* U+00a00c: YI SYLLABLE UOX*/
- RTUNI_ALPHA, /* U+00a00d: YI SYLLABLE UO*/
- RTUNI_ALPHA, /* U+00a00e: YI SYLLABLE UOP*/
- RTUNI_ALPHA, /* U+00a00f: YI SYLLABLE OT*/
- RTUNI_ALPHA, /* U+00a010: YI SYLLABLE OX*/
- RTUNI_ALPHA, /* U+00a011: YI SYLLABLE O*/
- RTUNI_ALPHA, /* U+00a012: YI SYLLABLE OP*/
- RTUNI_ALPHA, /* U+00a013: YI SYLLABLE EX*/
- RTUNI_ALPHA, /* U+00a014: YI SYLLABLE E*/
- RTUNI_ALPHA, /* U+00a015: YI SYLLABLE WU*/
- RTUNI_ALPHA, /* U+00a016: YI SYLLABLE BIT*/
- RTUNI_ALPHA, /* U+00a017: YI SYLLABLE BIX*/
- RTUNI_ALPHA, /* U+00a018: YI SYLLABLE BI*/
- RTUNI_ALPHA, /* U+00a019: YI SYLLABLE BIP*/
- RTUNI_ALPHA, /* U+00a01a: YI SYLLABLE BIET*/
- RTUNI_ALPHA, /* U+00a01b: YI SYLLABLE BIEX*/
- RTUNI_ALPHA, /* U+00a01c: YI SYLLABLE BIE*/
- RTUNI_ALPHA, /* U+00a01d: YI SYLLABLE BIEP*/
- RTUNI_ALPHA, /* U+00a01e: YI SYLLABLE BAT*/
- RTUNI_ALPHA, /* U+00a01f: YI SYLLABLE BAX*/
- RTUNI_ALPHA, /* U+00a020: YI SYLLABLE BA*/
- RTUNI_ALPHA, /* U+00a021: YI SYLLABLE BAP*/
- RTUNI_ALPHA, /* U+00a022: YI SYLLABLE BUOX*/
- RTUNI_ALPHA, /* U+00a023: YI SYLLABLE BUO*/
- RTUNI_ALPHA, /* U+00a024: YI SYLLABLE BUOP*/
- RTUNI_ALPHA, /* U+00a025: YI SYLLABLE BOT*/
- RTUNI_ALPHA, /* U+00a026: YI SYLLABLE BOX*/
- RTUNI_ALPHA, /* U+00a027: YI SYLLABLE BO*/
- RTUNI_ALPHA, /* U+00a028: YI SYLLABLE BOP*/
- RTUNI_ALPHA, /* U+00a029: YI SYLLABLE BEX*/
- RTUNI_ALPHA, /* U+00a02a: YI SYLLABLE BE*/
- RTUNI_ALPHA, /* U+00a02b: YI SYLLABLE BEP*/
- RTUNI_ALPHA, /* U+00a02c: YI SYLLABLE BUT*/
- RTUNI_ALPHA, /* U+00a02d: YI SYLLABLE BUX*/
- RTUNI_ALPHA, /* U+00a02e: YI SYLLABLE BU*/
- RTUNI_ALPHA, /* U+00a02f: YI SYLLABLE BUP*/
- RTUNI_ALPHA, /* U+00a030: YI SYLLABLE BURX*/
- RTUNI_ALPHA, /* U+00a031: YI SYLLABLE BUR*/
- RTUNI_ALPHA, /* U+00a032: YI SYLLABLE BYT*/
- RTUNI_ALPHA, /* U+00a033: YI SYLLABLE BYX*/
- RTUNI_ALPHA, /* U+00a034: YI SYLLABLE BY*/
- RTUNI_ALPHA, /* U+00a035: YI SYLLABLE BYP*/
- RTUNI_ALPHA, /* U+00a036: YI SYLLABLE BYRX*/
- RTUNI_ALPHA, /* U+00a037: YI SYLLABLE BYR*/
- RTUNI_ALPHA, /* U+00a038: YI SYLLABLE PIT*/
- RTUNI_ALPHA, /* U+00a039: YI SYLLABLE PIX*/
- RTUNI_ALPHA, /* U+00a03a: YI SYLLABLE PI*/
- RTUNI_ALPHA, /* U+00a03b: YI SYLLABLE PIP*/
- RTUNI_ALPHA, /* U+00a03c: YI SYLLABLE PIEX*/
- RTUNI_ALPHA, /* U+00a03d: YI SYLLABLE PIE*/
- RTUNI_ALPHA, /* U+00a03e: YI SYLLABLE PIEP*/
- RTUNI_ALPHA, /* U+00a03f: YI SYLLABLE PAT*/
- RTUNI_ALPHA, /* U+00a040: YI SYLLABLE PAX*/
- RTUNI_ALPHA, /* U+00a041: YI SYLLABLE PA*/
- RTUNI_ALPHA, /* U+00a042: YI SYLLABLE PAP*/
- RTUNI_ALPHA, /* U+00a043: YI SYLLABLE PUOX*/
- RTUNI_ALPHA, /* U+00a044: YI SYLLABLE PUO*/
- RTUNI_ALPHA, /* U+00a045: YI SYLLABLE PUOP*/
- RTUNI_ALPHA, /* U+00a046: YI SYLLABLE POT*/
- RTUNI_ALPHA, /* U+00a047: YI SYLLABLE POX*/
- RTUNI_ALPHA, /* U+00a048: YI SYLLABLE PO*/
- RTUNI_ALPHA, /* U+00a049: YI SYLLABLE POP*/
- RTUNI_ALPHA, /* U+00a04a: YI SYLLABLE PUT*/
- RTUNI_ALPHA, /* U+00a04b: YI SYLLABLE PUX*/
- RTUNI_ALPHA, /* U+00a04c: YI SYLLABLE PU*/
- RTUNI_ALPHA, /* U+00a04d: YI SYLLABLE PUP*/
- RTUNI_ALPHA, /* U+00a04e: YI SYLLABLE PURX*/
- RTUNI_ALPHA, /* U+00a04f: YI SYLLABLE PUR*/
- RTUNI_ALPHA, /* U+00a050: YI SYLLABLE PYT*/
- RTUNI_ALPHA, /* U+00a051: YI SYLLABLE PYX*/
- RTUNI_ALPHA, /* U+00a052: YI SYLLABLE PY*/
- RTUNI_ALPHA, /* U+00a053: YI SYLLABLE PYP*/
- RTUNI_ALPHA, /* U+00a054: YI SYLLABLE PYRX*/
- RTUNI_ALPHA, /* U+00a055: YI SYLLABLE PYR*/
- RTUNI_ALPHA, /* U+00a056: YI SYLLABLE BBIT*/
- RTUNI_ALPHA, /* U+00a057: YI SYLLABLE BBIX*/
- RTUNI_ALPHA, /* U+00a058: YI SYLLABLE BBI*/
- RTUNI_ALPHA, /* U+00a059: YI SYLLABLE BBIP*/
- RTUNI_ALPHA, /* U+00a05a: YI SYLLABLE BBIET*/
- RTUNI_ALPHA, /* U+00a05b: YI SYLLABLE BBIEX*/
- RTUNI_ALPHA, /* U+00a05c: YI SYLLABLE BBIE*/
- RTUNI_ALPHA, /* U+00a05d: YI SYLLABLE BBIEP*/
- RTUNI_ALPHA, /* U+00a05e: YI SYLLABLE BBAT*/
- RTUNI_ALPHA, /* U+00a05f: YI SYLLABLE BBAX*/
- RTUNI_ALPHA, /* U+00a060: YI SYLLABLE BBA*/
- RTUNI_ALPHA, /* U+00a061: YI SYLLABLE BBAP*/
- RTUNI_ALPHA, /* U+00a062: YI SYLLABLE BBUOX*/
- RTUNI_ALPHA, /* U+00a063: YI SYLLABLE BBUO*/
- RTUNI_ALPHA, /* U+00a064: YI SYLLABLE BBUOP*/
- RTUNI_ALPHA, /* U+00a065: YI SYLLABLE BBOT*/
- RTUNI_ALPHA, /* U+00a066: YI SYLLABLE BBOX*/
- RTUNI_ALPHA, /* U+00a067: YI SYLLABLE BBO*/
- RTUNI_ALPHA, /* U+00a068: YI SYLLABLE BBOP*/
- RTUNI_ALPHA, /* U+00a069: YI SYLLABLE BBEX*/
- RTUNI_ALPHA, /* U+00a06a: YI SYLLABLE BBE*/
- RTUNI_ALPHA, /* U+00a06b: YI SYLLABLE BBEP*/
- RTUNI_ALPHA, /* U+00a06c: YI SYLLABLE BBUT*/
- RTUNI_ALPHA, /* U+00a06d: YI SYLLABLE BBUX*/
- RTUNI_ALPHA, /* U+00a06e: YI SYLLABLE BBU*/
- RTUNI_ALPHA, /* U+00a06f: YI SYLLABLE BBUP*/
- RTUNI_ALPHA, /* U+00a070: YI SYLLABLE BBURX*/
- RTUNI_ALPHA, /* U+00a071: YI SYLLABLE BBUR*/
- RTUNI_ALPHA, /* U+00a072: YI SYLLABLE BBYT*/
- RTUNI_ALPHA, /* U+00a073: YI SYLLABLE BBYX*/
- RTUNI_ALPHA, /* U+00a074: YI SYLLABLE BBY*/
- RTUNI_ALPHA, /* U+00a075: YI SYLLABLE BBYP*/
- RTUNI_ALPHA, /* U+00a076: YI SYLLABLE NBIT*/
- RTUNI_ALPHA, /* U+00a077: YI SYLLABLE NBIX*/
- RTUNI_ALPHA, /* U+00a078: YI SYLLABLE NBI*/
- RTUNI_ALPHA, /* U+00a079: YI SYLLABLE NBIP*/
- RTUNI_ALPHA, /* U+00a07a: YI SYLLABLE NBIEX*/
- RTUNI_ALPHA, /* U+00a07b: YI SYLLABLE NBIE*/
- RTUNI_ALPHA, /* U+00a07c: YI SYLLABLE NBIEP*/
- RTUNI_ALPHA, /* U+00a07d: YI SYLLABLE NBAT*/
- RTUNI_ALPHA, /* U+00a07e: YI SYLLABLE NBAX*/
- RTUNI_ALPHA, /* U+00a07f: YI SYLLABLE NBA*/
- RTUNI_ALPHA, /* U+00a080: YI SYLLABLE NBAP*/
- RTUNI_ALPHA, /* U+00a081: YI SYLLABLE NBOT*/
- RTUNI_ALPHA, /* U+00a082: YI SYLLABLE NBOX*/
- RTUNI_ALPHA, /* U+00a083: YI SYLLABLE NBO*/
- RTUNI_ALPHA, /* U+00a084: YI SYLLABLE NBOP*/
- RTUNI_ALPHA, /* U+00a085: YI SYLLABLE NBUT*/
- RTUNI_ALPHA, /* U+00a086: YI SYLLABLE NBUX*/
- RTUNI_ALPHA, /* U+00a087: YI SYLLABLE NBU*/
- RTUNI_ALPHA, /* U+00a088: YI SYLLABLE NBUP*/
- RTUNI_ALPHA, /* U+00a089: YI SYLLABLE NBURX*/
- RTUNI_ALPHA, /* U+00a08a: YI SYLLABLE NBUR*/
- RTUNI_ALPHA, /* U+00a08b: YI SYLLABLE NBYT*/
- RTUNI_ALPHA, /* U+00a08c: YI SYLLABLE NBYX*/
- RTUNI_ALPHA, /* U+00a08d: YI SYLLABLE NBY*/
- RTUNI_ALPHA, /* U+00a08e: YI SYLLABLE NBYP*/
- RTUNI_ALPHA, /* U+00a08f: YI SYLLABLE NBYRX*/
- RTUNI_ALPHA, /* U+00a090: YI SYLLABLE NBYR*/
- RTUNI_ALPHA, /* U+00a091: YI SYLLABLE HMIT*/
- RTUNI_ALPHA, /* U+00a092: YI SYLLABLE HMIX*/
- RTUNI_ALPHA, /* U+00a093: YI SYLLABLE HMI*/
- RTUNI_ALPHA, /* U+00a094: YI SYLLABLE HMIP*/
- RTUNI_ALPHA, /* U+00a095: YI SYLLABLE HMIEX*/
- RTUNI_ALPHA, /* U+00a096: YI SYLLABLE HMIE*/
- RTUNI_ALPHA, /* U+00a097: YI SYLLABLE HMIEP*/
- RTUNI_ALPHA, /* U+00a098: YI SYLLABLE HMAT*/
- RTUNI_ALPHA, /* U+00a099: YI SYLLABLE HMAX*/
- RTUNI_ALPHA, /* U+00a09a: YI SYLLABLE HMA*/
- RTUNI_ALPHA, /* U+00a09b: YI SYLLABLE HMAP*/
- RTUNI_ALPHA, /* U+00a09c: YI SYLLABLE HMUOX*/
- RTUNI_ALPHA, /* U+00a09d: YI SYLLABLE HMUO*/
- RTUNI_ALPHA, /* U+00a09e: YI SYLLABLE HMUOP*/
- RTUNI_ALPHA, /* U+00a09f: YI SYLLABLE HMOT*/
- RTUNI_ALPHA, /* U+00a0a0: YI SYLLABLE HMOX*/
- RTUNI_ALPHA, /* U+00a0a1: YI SYLLABLE HMO*/
- RTUNI_ALPHA, /* U+00a0a2: YI SYLLABLE HMOP*/
- RTUNI_ALPHA, /* U+00a0a3: YI SYLLABLE HMUT*/
- RTUNI_ALPHA, /* U+00a0a4: YI SYLLABLE HMUX*/
- RTUNI_ALPHA, /* U+00a0a5: YI SYLLABLE HMU*/
- RTUNI_ALPHA, /* U+00a0a6: YI SYLLABLE HMUP*/
- RTUNI_ALPHA, /* U+00a0a7: YI SYLLABLE HMURX*/
- RTUNI_ALPHA, /* U+00a0a8: YI SYLLABLE HMUR*/
- RTUNI_ALPHA, /* U+00a0a9: YI SYLLABLE HMYX*/
- RTUNI_ALPHA, /* U+00a0aa: YI SYLLABLE HMY*/
- RTUNI_ALPHA, /* U+00a0ab: YI SYLLABLE HMYP*/
- RTUNI_ALPHA, /* U+00a0ac: YI SYLLABLE HMYRX*/
- RTUNI_ALPHA, /* U+00a0ad: YI SYLLABLE HMYR*/
- RTUNI_ALPHA, /* U+00a0ae: YI SYLLABLE MIT*/
- RTUNI_ALPHA, /* U+00a0af: YI SYLLABLE MIX*/
- RTUNI_ALPHA, /* U+00a0b0: YI SYLLABLE MI*/
- RTUNI_ALPHA, /* U+00a0b1: YI SYLLABLE MIP*/
- RTUNI_ALPHA, /* U+00a0b2: YI SYLLABLE MIEX*/
- RTUNI_ALPHA, /* U+00a0b3: YI SYLLABLE MIE*/
- RTUNI_ALPHA, /* U+00a0b4: YI SYLLABLE MIEP*/
- RTUNI_ALPHA, /* U+00a0b5: YI SYLLABLE MAT*/
- RTUNI_ALPHA, /* U+00a0b6: YI SYLLABLE MAX*/
- RTUNI_ALPHA, /* U+00a0b7: YI SYLLABLE MA*/
- RTUNI_ALPHA, /* U+00a0b8: YI SYLLABLE MAP*/
- RTUNI_ALPHA, /* U+00a0b9: YI SYLLABLE MUOT*/
- RTUNI_ALPHA, /* U+00a0ba: YI SYLLABLE MUOX*/
- RTUNI_ALPHA, /* U+00a0bb: YI SYLLABLE MUO*/
- RTUNI_ALPHA, /* U+00a0bc: YI SYLLABLE MUOP*/
- RTUNI_ALPHA, /* U+00a0bd: YI SYLLABLE MOT*/
- RTUNI_ALPHA, /* U+00a0be: YI SYLLABLE MOX*/
- RTUNI_ALPHA, /* U+00a0bf: YI SYLLABLE MO*/
- RTUNI_ALPHA, /* U+00a0c0: YI SYLLABLE MOP*/
- RTUNI_ALPHA, /* U+00a0c1: YI SYLLABLE MEX*/
- RTUNI_ALPHA, /* U+00a0c2: YI SYLLABLE ME*/
- RTUNI_ALPHA, /* U+00a0c3: YI SYLLABLE MUT*/
- RTUNI_ALPHA, /* U+00a0c4: YI SYLLABLE MUX*/
- RTUNI_ALPHA, /* U+00a0c5: YI SYLLABLE MU*/
- RTUNI_ALPHA, /* U+00a0c6: YI SYLLABLE MUP*/
- RTUNI_ALPHA, /* U+00a0c7: YI SYLLABLE MURX*/
- RTUNI_ALPHA, /* U+00a0c8: YI SYLLABLE MUR*/
- RTUNI_ALPHA, /* U+00a0c9: YI SYLLABLE MYT*/
- RTUNI_ALPHA, /* U+00a0ca: YI SYLLABLE MYX*/
- RTUNI_ALPHA, /* U+00a0cb: YI SYLLABLE MY*/
- RTUNI_ALPHA, /* U+00a0cc: YI SYLLABLE MYP*/
- RTUNI_ALPHA, /* U+00a0cd: YI SYLLABLE FIT*/
- RTUNI_ALPHA, /* U+00a0ce: YI SYLLABLE FIX*/
- RTUNI_ALPHA, /* U+00a0cf: YI SYLLABLE FI*/
- RTUNI_ALPHA, /* U+00a0d0: YI SYLLABLE FIP*/
- RTUNI_ALPHA, /* U+00a0d1: YI SYLLABLE FAT*/
- RTUNI_ALPHA, /* U+00a0d2: YI SYLLABLE FAX*/
- RTUNI_ALPHA, /* U+00a0d3: YI SYLLABLE FA*/
- RTUNI_ALPHA, /* U+00a0d4: YI SYLLABLE FAP*/
- RTUNI_ALPHA, /* U+00a0d5: YI SYLLABLE FOX*/
- RTUNI_ALPHA, /* U+00a0d6: YI SYLLABLE FO*/
- RTUNI_ALPHA, /* U+00a0d7: YI SYLLABLE FOP*/
- RTUNI_ALPHA, /* U+00a0d8: YI SYLLABLE FUT*/
- RTUNI_ALPHA, /* U+00a0d9: YI SYLLABLE FUX*/
- RTUNI_ALPHA, /* U+00a0da: YI SYLLABLE FU*/
- RTUNI_ALPHA, /* U+00a0db: YI SYLLABLE FUP*/
- RTUNI_ALPHA, /* U+00a0dc: YI SYLLABLE FURX*/
- RTUNI_ALPHA, /* U+00a0dd: YI SYLLABLE FUR*/
- RTUNI_ALPHA, /* U+00a0de: YI SYLLABLE FYT*/
- RTUNI_ALPHA, /* U+00a0df: YI SYLLABLE FYX*/
- RTUNI_ALPHA, /* U+00a0e0: YI SYLLABLE FY*/
- RTUNI_ALPHA, /* U+00a0e1: YI SYLLABLE FYP*/
- RTUNI_ALPHA, /* U+00a0e2: YI SYLLABLE VIT*/
- RTUNI_ALPHA, /* U+00a0e3: YI SYLLABLE VIX*/
- RTUNI_ALPHA, /* U+00a0e4: YI SYLLABLE VI*/
- RTUNI_ALPHA, /* U+00a0e5: YI SYLLABLE VIP*/
- RTUNI_ALPHA, /* U+00a0e6: YI SYLLABLE VIET*/
- RTUNI_ALPHA, /* U+00a0e7: YI SYLLABLE VIEX*/
- RTUNI_ALPHA, /* U+00a0e8: YI SYLLABLE VIE*/
- RTUNI_ALPHA, /* U+00a0e9: YI SYLLABLE VIEP*/
- RTUNI_ALPHA, /* U+00a0ea: YI SYLLABLE VAT*/
- RTUNI_ALPHA, /* U+00a0eb: YI SYLLABLE VAX*/
- RTUNI_ALPHA, /* U+00a0ec: YI SYLLABLE VA*/
- RTUNI_ALPHA, /* U+00a0ed: YI SYLLABLE VAP*/
- RTUNI_ALPHA, /* U+00a0ee: YI SYLLABLE VOT*/
- RTUNI_ALPHA, /* U+00a0ef: YI SYLLABLE VOX*/
- RTUNI_ALPHA, /* U+00a0f0: YI SYLLABLE VO*/
- RTUNI_ALPHA, /* U+00a0f1: YI SYLLABLE VOP*/
- RTUNI_ALPHA, /* U+00a0f2: YI SYLLABLE VEX*/
- RTUNI_ALPHA, /* U+00a0f3: YI SYLLABLE VEP*/
- RTUNI_ALPHA, /* U+00a0f4: YI SYLLABLE VUT*/
- RTUNI_ALPHA, /* U+00a0f5: YI SYLLABLE VUX*/
- RTUNI_ALPHA, /* U+00a0f6: YI SYLLABLE VU*/
- RTUNI_ALPHA, /* U+00a0f7: YI SYLLABLE VUP*/
- RTUNI_ALPHA, /* U+00a0f8: YI SYLLABLE VURX*/
- RTUNI_ALPHA, /* U+00a0f9: YI SYLLABLE VUR*/
- RTUNI_ALPHA, /* U+00a0fa: YI SYLLABLE VYT*/
- RTUNI_ALPHA, /* U+00a0fb: YI SYLLABLE VYX*/
- RTUNI_ALPHA, /* U+00a0fc: YI SYLLABLE VY*/
- RTUNI_ALPHA, /* U+00a0fd: YI SYLLABLE VYP*/
- RTUNI_ALPHA, /* U+00a0fe: YI SYLLABLE VYRX*/
- RTUNI_ALPHA, /* U+00a0ff: YI SYLLABLE VYR*/
- RTUNI_ALPHA, /* U+00a100: YI SYLLABLE DIT*/
- RTUNI_ALPHA, /* U+00a101: YI SYLLABLE DIX*/
- RTUNI_ALPHA, /* U+00a102: YI SYLLABLE DI*/
- RTUNI_ALPHA, /* U+00a103: YI SYLLABLE DIP*/
- RTUNI_ALPHA, /* U+00a104: YI SYLLABLE DIEX*/
- RTUNI_ALPHA, /* U+00a105: YI SYLLABLE DIE*/
- RTUNI_ALPHA, /* U+00a106: YI SYLLABLE DIEP*/
- RTUNI_ALPHA, /* U+00a107: YI SYLLABLE DAT*/
- RTUNI_ALPHA, /* U+00a108: YI SYLLABLE DAX*/
- RTUNI_ALPHA, /* U+00a109: YI SYLLABLE DA*/
- RTUNI_ALPHA, /* U+00a10a: YI SYLLABLE DAP*/
- RTUNI_ALPHA, /* U+00a10b: YI SYLLABLE DUOX*/
- RTUNI_ALPHA, /* U+00a10c: YI SYLLABLE DUO*/
- RTUNI_ALPHA, /* U+00a10d: YI SYLLABLE DOT*/
- RTUNI_ALPHA, /* U+00a10e: YI SYLLABLE DOX*/
- RTUNI_ALPHA, /* U+00a10f: YI SYLLABLE DO*/
- RTUNI_ALPHA, /* U+00a110: YI SYLLABLE DOP*/
- RTUNI_ALPHA, /* U+00a111: YI SYLLABLE DEX*/
- RTUNI_ALPHA, /* U+00a112: YI SYLLABLE DE*/
- RTUNI_ALPHA, /* U+00a113: YI SYLLABLE DEP*/
- RTUNI_ALPHA, /* U+00a114: YI SYLLABLE DUT*/
- RTUNI_ALPHA, /* U+00a115: YI SYLLABLE DUX*/
- RTUNI_ALPHA, /* U+00a116: YI SYLLABLE DU*/
- RTUNI_ALPHA, /* U+00a117: YI SYLLABLE DUP*/
- RTUNI_ALPHA, /* U+00a118: YI SYLLABLE DURX*/
- RTUNI_ALPHA, /* U+00a119: YI SYLLABLE DUR*/
- RTUNI_ALPHA, /* U+00a11a: YI SYLLABLE TIT*/
- RTUNI_ALPHA, /* U+00a11b: YI SYLLABLE TIX*/
- RTUNI_ALPHA, /* U+00a11c: YI SYLLABLE TI*/
- RTUNI_ALPHA, /* U+00a11d: YI SYLLABLE TIP*/
- RTUNI_ALPHA, /* U+00a11e: YI SYLLABLE TIEX*/
- RTUNI_ALPHA, /* U+00a11f: YI SYLLABLE TIE*/
- RTUNI_ALPHA, /* U+00a120: YI SYLLABLE TIEP*/
- RTUNI_ALPHA, /* U+00a121: YI SYLLABLE TAT*/
- RTUNI_ALPHA, /* U+00a122: YI SYLLABLE TAX*/
- RTUNI_ALPHA, /* U+00a123: YI SYLLABLE TA*/
- RTUNI_ALPHA, /* U+00a124: YI SYLLABLE TAP*/
- RTUNI_ALPHA, /* U+00a125: YI SYLLABLE TUOT*/
- RTUNI_ALPHA, /* U+00a126: YI SYLLABLE TUOX*/
- RTUNI_ALPHA, /* U+00a127: YI SYLLABLE TUO*/
- RTUNI_ALPHA, /* U+00a128: YI SYLLABLE TUOP*/
- RTUNI_ALPHA, /* U+00a129: YI SYLLABLE TOT*/
- RTUNI_ALPHA, /* U+00a12a: YI SYLLABLE TOX*/
- RTUNI_ALPHA, /* U+00a12b: YI SYLLABLE TO*/
- RTUNI_ALPHA, /* U+00a12c: YI SYLLABLE TOP*/
- RTUNI_ALPHA, /* U+00a12d: YI SYLLABLE TEX*/
- RTUNI_ALPHA, /* U+00a12e: YI SYLLABLE TE*/
- RTUNI_ALPHA, /* U+00a12f: YI SYLLABLE TEP*/
- RTUNI_ALPHA, /* U+00a130: YI SYLLABLE TUT*/
- RTUNI_ALPHA, /* U+00a131: YI SYLLABLE TUX*/
- RTUNI_ALPHA, /* U+00a132: YI SYLLABLE TU*/
- RTUNI_ALPHA, /* U+00a133: YI SYLLABLE TUP*/
- RTUNI_ALPHA, /* U+00a134: YI SYLLABLE TURX*/
- RTUNI_ALPHA, /* U+00a135: YI SYLLABLE TUR*/
- RTUNI_ALPHA, /* U+00a136: YI SYLLABLE DDIT*/
- RTUNI_ALPHA, /* U+00a137: YI SYLLABLE DDIX*/
- RTUNI_ALPHA, /* U+00a138: YI SYLLABLE DDI*/
- RTUNI_ALPHA, /* U+00a139: YI SYLLABLE DDIP*/
- RTUNI_ALPHA, /* U+00a13a: YI SYLLABLE DDIEX*/
- RTUNI_ALPHA, /* U+00a13b: YI SYLLABLE DDIE*/
- RTUNI_ALPHA, /* U+00a13c: YI SYLLABLE DDIEP*/
- RTUNI_ALPHA, /* U+00a13d: YI SYLLABLE DDAT*/
- RTUNI_ALPHA, /* U+00a13e: YI SYLLABLE DDAX*/
- RTUNI_ALPHA, /* U+00a13f: YI SYLLABLE DDA*/
- RTUNI_ALPHA, /* U+00a140: YI SYLLABLE DDAP*/
- RTUNI_ALPHA, /* U+00a141: YI SYLLABLE DDUOX*/
- RTUNI_ALPHA, /* U+00a142: YI SYLLABLE DDUO*/
- RTUNI_ALPHA, /* U+00a143: YI SYLLABLE DDUOP*/
- RTUNI_ALPHA, /* U+00a144: YI SYLLABLE DDOT*/
- RTUNI_ALPHA, /* U+00a145: YI SYLLABLE DDOX*/
- RTUNI_ALPHA, /* U+00a146: YI SYLLABLE DDO*/
- RTUNI_ALPHA, /* U+00a147: YI SYLLABLE DDOP*/
- RTUNI_ALPHA, /* U+00a148: YI SYLLABLE DDEX*/
- RTUNI_ALPHA, /* U+00a149: YI SYLLABLE DDE*/
- RTUNI_ALPHA, /* U+00a14a: YI SYLLABLE DDEP*/
- RTUNI_ALPHA, /* U+00a14b: YI SYLLABLE DDUT*/
- RTUNI_ALPHA, /* U+00a14c: YI SYLLABLE DDUX*/
- RTUNI_ALPHA, /* U+00a14d: YI SYLLABLE DDU*/
- RTUNI_ALPHA, /* U+00a14e: YI SYLLABLE DDUP*/
- RTUNI_ALPHA, /* U+00a14f: YI SYLLABLE DDURX*/
- RTUNI_ALPHA, /* U+00a150: YI SYLLABLE DDUR*/
- RTUNI_ALPHA, /* U+00a151: YI SYLLABLE NDIT*/
- RTUNI_ALPHA, /* U+00a152: YI SYLLABLE NDIX*/
- RTUNI_ALPHA, /* U+00a153: YI SYLLABLE NDI*/
- RTUNI_ALPHA, /* U+00a154: YI SYLLABLE NDIP*/
- RTUNI_ALPHA, /* U+00a155: YI SYLLABLE NDIEX*/
- RTUNI_ALPHA, /* U+00a156: YI SYLLABLE NDIE*/
- RTUNI_ALPHA, /* U+00a157: YI SYLLABLE NDAT*/
- RTUNI_ALPHA, /* U+00a158: YI SYLLABLE NDAX*/
- RTUNI_ALPHA, /* U+00a159: YI SYLLABLE NDA*/
- RTUNI_ALPHA, /* U+00a15a: YI SYLLABLE NDAP*/
- RTUNI_ALPHA, /* U+00a15b: YI SYLLABLE NDOT*/
- RTUNI_ALPHA, /* U+00a15c: YI SYLLABLE NDOX*/
- RTUNI_ALPHA, /* U+00a15d: YI SYLLABLE NDO*/
- RTUNI_ALPHA, /* U+00a15e: YI SYLLABLE NDOP*/
- RTUNI_ALPHA, /* U+00a15f: YI SYLLABLE NDEX*/
- RTUNI_ALPHA, /* U+00a160: YI SYLLABLE NDE*/
- RTUNI_ALPHA, /* U+00a161: YI SYLLABLE NDEP*/
- RTUNI_ALPHA, /* U+00a162: YI SYLLABLE NDUT*/
- RTUNI_ALPHA, /* U+00a163: YI SYLLABLE NDUX*/
- RTUNI_ALPHA, /* U+00a164: YI SYLLABLE NDU*/
- RTUNI_ALPHA, /* U+00a165: YI SYLLABLE NDUP*/
- RTUNI_ALPHA, /* U+00a166: YI SYLLABLE NDURX*/
- RTUNI_ALPHA, /* U+00a167: YI SYLLABLE NDUR*/
- RTUNI_ALPHA, /* U+00a168: YI SYLLABLE HNIT*/
- RTUNI_ALPHA, /* U+00a169: YI SYLLABLE HNIX*/
- RTUNI_ALPHA, /* U+00a16a: YI SYLLABLE HNI*/
- RTUNI_ALPHA, /* U+00a16b: YI SYLLABLE HNIP*/
- RTUNI_ALPHA, /* U+00a16c: YI SYLLABLE HNIET*/
- RTUNI_ALPHA, /* U+00a16d: YI SYLLABLE HNIEX*/
- RTUNI_ALPHA, /* U+00a16e: YI SYLLABLE HNIE*/
- RTUNI_ALPHA, /* U+00a16f: YI SYLLABLE HNIEP*/
- RTUNI_ALPHA, /* U+00a170: YI SYLLABLE HNAT*/
- RTUNI_ALPHA, /* U+00a171: YI SYLLABLE HNAX*/
- RTUNI_ALPHA, /* U+00a172: YI SYLLABLE HNA*/
- RTUNI_ALPHA, /* U+00a173: YI SYLLABLE HNAP*/
- RTUNI_ALPHA, /* U+00a174: YI SYLLABLE HNUOX*/
- RTUNI_ALPHA, /* U+00a175: YI SYLLABLE HNUO*/
- RTUNI_ALPHA, /* U+00a176: YI SYLLABLE HNOT*/
- RTUNI_ALPHA, /* U+00a177: YI SYLLABLE HNOX*/
- RTUNI_ALPHA, /* U+00a178: YI SYLLABLE HNOP*/
- RTUNI_ALPHA, /* U+00a179: YI SYLLABLE HNEX*/
- RTUNI_ALPHA, /* U+00a17a: YI SYLLABLE HNE*/
- RTUNI_ALPHA, /* U+00a17b: YI SYLLABLE HNEP*/
- RTUNI_ALPHA, /* U+00a17c: YI SYLLABLE HNUT*/
- RTUNI_ALPHA, /* U+00a17d: YI SYLLABLE NIT*/
- RTUNI_ALPHA, /* U+00a17e: YI SYLLABLE NIX*/
- RTUNI_ALPHA, /* U+00a17f: YI SYLLABLE NI*/
- RTUNI_ALPHA, /* U+00a180: YI SYLLABLE NIP*/
- RTUNI_ALPHA, /* U+00a181: YI SYLLABLE NIEX*/
- RTUNI_ALPHA, /* U+00a182: YI SYLLABLE NIE*/
- RTUNI_ALPHA, /* U+00a183: YI SYLLABLE NIEP*/
- RTUNI_ALPHA, /* U+00a184: YI SYLLABLE NAX*/
- RTUNI_ALPHA, /* U+00a185: YI SYLLABLE NA*/
- RTUNI_ALPHA, /* U+00a186: YI SYLLABLE NAP*/
- RTUNI_ALPHA, /* U+00a187: YI SYLLABLE NUOX*/
- RTUNI_ALPHA, /* U+00a188: YI SYLLABLE NUO*/
- RTUNI_ALPHA, /* U+00a189: YI SYLLABLE NUOP*/
- RTUNI_ALPHA, /* U+00a18a: YI SYLLABLE NOT*/
- RTUNI_ALPHA, /* U+00a18b: YI SYLLABLE NOX*/
- RTUNI_ALPHA, /* U+00a18c: YI SYLLABLE NO*/
- RTUNI_ALPHA, /* U+00a18d: YI SYLLABLE NOP*/
- RTUNI_ALPHA, /* U+00a18e: YI SYLLABLE NEX*/
- RTUNI_ALPHA, /* U+00a18f: YI SYLLABLE NE*/
- RTUNI_ALPHA, /* U+00a190: YI SYLLABLE NEP*/
- RTUNI_ALPHA, /* U+00a191: YI SYLLABLE NUT*/
- RTUNI_ALPHA, /* U+00a192: YI SYLLABLE NUX*/
- RTUNI_ALPHA, /* U+00a193: YI SYLLABLE NU*/
- RTUNI_ALPHA, /* U+00a194: YI SYLLABLE NUP*/
- RTUNI_ALPHA, /* U+00a195: YI SYLLABLE NURX*/
- RTUNI_ALPHA, /* U+00a196: YI SYLLABLE NUR*/
- RTUNI_ALPHA, /* U+00a197: YI SYLLABLE HLIT*/
- RTUNI_ALPHA, /* U+00a198: YI SYLLABLE HLIX*/
- RTUNI_ALPHA, /* U+00a199: YI SYLLABLE HLI*/
- RTUNI_ALPHA, /* U+00a19a: YI SYLLABLE HLIP*/
- RTUNI_ALPHA, /* U+00a19b: YI SYLLABLE HLIEX*/
- RTUNI_ALPHA, /* U+00a19c: YI SYLLABLE HLIE*/
- RTUNI_ALPHA, /* U+00a19d: YI SYLLABLE HLIEP*/
- RTUNI_ALPHA, /* U+00a19e: YI SYLLABLE HLAT*/
- RTUNI_ALPHA, /* U+00a19f: YI SYLLABLE HLAX*/
- RTUNI_ALPHA, /* U+00a1a0: YI SYLLABLE HLA*/
- RTUNI_ALPHA, /* U+00a1a1: YI SYLLABLE HLAP*/
- RTUNI_ALPHA, /* U+00a1a2: YI SYLLABLE HLUOX*/
- RTUNI_ALPHA, /* U+00a1a3: YI SYLLABLE HLUO*/
- RTUNI_ALPHA, /* U+00a1a4: YI SYLLABLE HLUOP*/
- RTUNI_ALPHA, /* U+00a1a5: YI SYLLABLE HLOX*/
- RTUNI_ALPHA, /* U+00a1a6: YI SYLLABLE HLO*/
- RTUNI_ALPHA, /* U+00a1a7: YI SYLLABLE HLOP*/
- RTUNI_ALPHA, /* U+00a1a8: YI SYLLABLE HLEX*/
- RTUNI_ALPHA, /* U+00a1a9: YI SYLLABLE HLE*/
- RTUNI_ALPHA, /* U+00a1aa: YI SYLLABLE HLEP*/
- RTUNI_ALPHA, /* U+00a1ab: YI SYLLABLE HLUT*/
- RTUNI_ALPHA, /* U+00a1ac: YI SYLLABLE HLUX*/
- RTUNI_ALPHA, /* U+00a1ad: YI SYLLABLE HLU*/
- RTUNI_ALPHA, /* U+00a1ae: YI SYLLABLE HLUP*/
- RTUNI_ALPHA, /* U+00a1af: YI SYLLABLE HLURX*/
- RTUNI_ALPHA, /* U+00a1b0: YI SYLLABLE HLUR*/
- RTUNI_ALPHA, /* U+00a1b1: YI SYLLABLE HLYT*/
- RTUNI_ALPHA, /* U+00a1b2: YI SYLLABLE HLYX*/
- RTUNI_ALPHA, /* U+00a1b3: YI SYLLABLE HLY*/
- RTUNI_ALPHA, /* U+00a1b4: YI SYLLABLE HLYP*/
- RTUNI_ALPHA, /* U+00a1b5: YI SYLLABLE HLYRX*/
- RTUNI_ALPHA, /* U+00a1b6: YI SYLLABLE HLYR*/
- RTUNI_ALPHA, /* U+00a1b7: YI SYLLABLE LIT*/
- RTUNI_ALPHA, /* U+00a1b8: YI SYLLABLE LIX*/
- RTUNI_ALPHA, /* U+00a1b9: YI SYLLABLE LI*/
- RTUNI_ALPHA, /* U+00a1ba: YI SYLLABLE LIP*/
- RTUNI_ALPHA, /* U+00a1bb: YI SYLLABLE LIET*/
- RTUNI_ALPHA, /* U+00a1bc: YI SYLLABLE LIEX*/
- RTUNI_ALPHA, /* U+00a1bd: YI SYLLABLE LIE*/
- RTUNI_ALPHA, /* U+00a1be: YI SYLLABLE LIEP*/
- RTUNI_ALPHA, /* U+00a1bf: YI SYLLABLE LAT*/
- RTUNI_ALPHA, /* U+00a1c0: YI SYLLABLE LAX*/
- RTUNI_ALPHA, /* U+00a1c1: YI SYLLABLE LA*/
- RTUNI_ALPHA, /* U+00a1c2: YI SYLLABLE LAP*/
- RTUNI_ALPHA, /* U+00a1c3: YI SYLLABLE LUOT*/
- RTUNI_ALPHA, /* U+00a1c4: YI SYLLABLE LUOX*/
- RTUNI_ALPHA, /* U+00a1c5: YI SYLLABLE LUO*/
- RTUNI_ALPHA, /* U+00a1c6: YI SYLLABLE LUOP*/
- RTUNI_ALPHA, /* U+00a1c7: YI SYLLABLE LOT*/
- RTUNI_ALPHA, /* U+00a1c8: YI SYLLABLE LOX*/
- RTUNI_ALPHA, /* U+00a1c9: YI SYLLABLE LO*/
- RTUNI_ALPHA, /* U+00a1ca: YI SYLLABLE LOP*/
- RTUNI_ALPHA, /* U+00a1cb: YI SYLLABLE LEX*/
- RTUNI_ALPHA, /* U+00a1cc: YI SYLLABLE LE*/
- RTUNI_ALPHA, /* U+00a1cd: YI SYLLABLE LEP*/
- RTUNI_ALPHA, /* U+00a1ce: YI SYLLABLE LUT*/
- RTUNI_ALPHA, /* U+00a1cf: YI SYLLABLE LUX*/
- RTUNI_ALPHA, /* U+00a1d0: YI SYLLABLE LU*/
- RTUNI_ALPHA, /* U+00a1d1: YI SYLLABLE LUP*/
- RTUNI_ALPHA, /* U+00a1d2: YI SYLLABLE LURX*/
- RTUNI_ALPHA, /* U+00a1d3: YI SYLLABLE LUR*/
- RTUNI_ALPHA, /* U+00a1d4: YI SYLLABLE LYT*/
- RTUNI_ALPHA, /* U+00a1d5: YI SYLLABLE LYX*/
- RTUNI_ALPHA, /* U+00a1d6: YI SYLLABLE LY*/
- RTUNI_ALPHA, /* U+00a1d7: YI SYLLABLE LYP*/
- RTUNI_ALPHA, /* U+00a1d8: YI SYLLABLE LYRX*/
- RTUNI_ALPHA, /* U+00a1d9: YI SYLLABLE LYR*/
- RTUNI_ALPHA, /* U+00a1da: YI SYLLABLE GIT*/
- RTUNI_ALPHA, /* U+00a1db: YI SYLLABLE GIX*/
- RTUNI_ALPHA, /* U+00a1dc: YI SYLLABLE GI*/
- RTUNI_ALPHA, /* U+00a1dd: YI SYLLABLE GIP*/
- RTUNI_ALPHA, /* U+00a1de: YI SYLLABLE GIET*/
- RTUNI_ALPHA, /* U+00a1df: YI SYLLABLE GIEX*/
- RTUNI_ALPHA, /* U+00a1e0: YI SYLLABLE GIE*/
- RTUNI_ALPHA, /* U+00a1e1: YI SYLLABLE GIEP*/
- RTUNI_ALPHA, /* U+00a1e2: YI SYLLABLE GAT*/
- RTUNI_ALPHA, /* U+00a1e3: YI SYLLABLE GAX*/
- RTUNI_ALPHA, /* U+00a1e4: YI SYLLABLE GA*/
- RTUNI_ALPHA, /* U+00a1e5: YI SYLLABLE GAP*/
- RTUNI_ALPHA, /* U+00a1e6: YI SYLLABLE GUOT*/
- RTUNI_ALPHA, /* U+00a1e7: YI SYLLABLE GUOX*/
- RTUNI_ALPHA, /* U+00a1e8: YI SYLLABLE GUO*/
- RTUNI_ALPHA, /* U+00a1e9: YI SYLLABLE GUOP*/
- RTUNI_ALPHA, /* U+00a1ea: YI SYLLABLE GOT*/
- RTUNI_ALPHA, /* U+00a1eb: YI SYLLABLE GOX*/
- RTUNI_ALPHA, /* U+00a1ec: YI SYLLABLE GO*/
- RTUNI_ALPHA, /* U+00a1ed: YI SYLLABLE GOP*/
- RTUNI_ALPHA, /* U+00a1ee: YI SYLLABLE GET*/
- RTUNI_ALPHA, /* U+00a1ef: YI SYLLABLE GEX*/
- RTUNI_ALPHA, /* U+00a1f0: YI SYLLABLE GE*/
- RTUNI_ALPHA, /* U+00a1f1: YI SYLLABLE GEP*/
- RTUNI_ALPHA, /* U+00a1f2: YI SYLLABLE GUT*/
- RTUNI_ALPHA, /* U+00a1f3: YI SYLLABLE GUX*/
- RTUNI_ALPHA, /* U+00a1f4: YI SYLLABLE GU*/
- RTUNI_ALPHA, /* U+00a1f5: YI SYLLABLE GUP*/
- RTUNI_ALPHA, /* U+00a1f6: YI SYLLABLE GURX*/
- RTUNI_ALPHA, /* U+00a1f7: YI SYLLABLE GUR*/
- RTUNI_ALPHA, /* U+00a1f8: YI SYLLABLE KIT*/
- RTUNI_ALPHA, /* U+00a1f9: YI SYLLABLE KIX*/
- RTUNI_ALPHA, /* U+00a1fa: YI SYLLABLE KI*/
- RTUNI_ALPHA, /* U+00a1fb: YI SYLLABLE KIP*/
- RTUNI_ALPHA, /* U+00a1fc: YI SYLLABLE KIEX*/
- RTUNI_ALPHA, /* U+00a1fd: YI SYLLABLE KIE*/
- RTUNI_ALPHA, /* U+00a1fe: YI SYLLABLE KIEP*/
- RTUNI_ALPHA, /* U+00a1ff: YI SYLLABLE KAT*/
- RTUNI_ALPHA, /* U+00a200: YI SYLLABLE KAX*/
- RTUNI_ALPHA, /* U+00a201: YI SYLLABLE KA*/
- RTUNI_ALPHA, /* U+00a202: YI SYLLABLE KAP*/
- RTUNI_ALPHA, /* U+00a203: YI SYLLABLE KUOX*/
- RTUNI_ALPHA, /* U+00a204: YI SYLLABLE KUO*/
- RTUNI_ALPHA, /* U+00a205: YI SYLLABLE KUOP*/
- RTUNI_ALPHA, /* U+00a206: YI SYLLABLE KOT*/
- RTUNI_ALPHA, /* U+00a207: YI SYLLABLE KOX*/
- RTUNI_ALPHA, /* U+00a208: YI SYLLABLE KO*/
- RTUNI_ALPHA, /* U+00a209: YI SYLLABLE KOP*/
- RTUNI_ALPHA, /* U+00a20a: YI SYLLABLE KET*/
- RTUNI_ALPHA, /* U+00a20b: YI SYLLABLE KEX*/
- RTUNI_ALPHA, /* U+00a20c: YI SYLLABLE KE*/
- RTUNI_ALPHA, /* U+00a20d: YI SYLLABLE KEP*/
- RTUNI_ALPHA, /* U+00a20e: YI SYLLABLE KUT*/
- RTUNI_ALPHA, /* U+00a20f: YI SYLLABLE KUX*/
- RTUNI_ALPHA, /* U+00a210: YI SYLLABLE KU*/
- RTUNI_ALPHA, /* U+00a211: YI SYLLABLE KUP*/
- RTUNI_ALPHA, /* U+00a212: YI SYLLABLE KURX*/
- RTUNI_ALPHA, /* U+00a213: YI SYLLABLE KUR*/
- RTUNI_ALPHA, /* U+00a214: YI SYLLABLE GGIT*/
- RTUNI_ALPHA, /* U+00a215: YI SYLLABLE GGIX*/
- RTUNI_ALPHA, /* U+00a216: YI SYLLABLE GGI*/
- RTUNI_ALPHA, /* U+00a217: YI SYLLABLE GGIEX*/
- RTUNI_ALPHA, /* U+00a218: YI SYLLABLE GGIE*/
- RTUNI_ALPHA, /* U+00a219: YI SYLLABLE GGIEP*/
- RTUNI_ALPHA, /* U+00a21a: YI SYLLABLE GGAT*/
- RTUNI_ALPHA, /* U+00a21b: YI SYLLABLE GGAX*/
- RTUNI_ALPHA, /* U+00a21c: YI SYLLABLE GGA*/
- RTUNI_ALPHA, /* U+00a21d: YI SYLLABLE GGAP*/
- RTUNI_ALPHA, /* U+00a21e: YI SYLLABLE GGUOT*/
- RTUNI_ALPHA, /* U+00a21f: YI SYLLABLE GGUOX*/
- RTUNI_ALPHA, /* U+00a220: YI SYLLABLE GGUO*/
- RTUNI_ALPHA, /* U+00a221: YI SYLLABLE GGUOP*/
- RTUNI_ALPHA, /* U+00a222: YI SYLLABLE GGOT*/
- RTUNI_ALPHA, /* U+00a223: YI SYLLABLE GGOX*/
- RTUNI_ALPHA, /* U+00a224: YI SYLLABLE GGO*/
- RTUNI_ALPHA, /* U+00a225: YI SYLLABLE GGOP*/
- RTUNI_ALPHA, /* U+00a226: YI SYLLABLE GGET*/
- RTUNI_ALPHA, /* U+00a227: YI SYLLABLE GGEX*/
- RTUNI_ALPHA, /* U+00a228: YI SYLLABLE GGE*/
- RTUNI_ALPHA, /* U+00a229: YI SYLLABLE GGEP*/
- RTUNI_ALPHA, /* U+00a22a: YI SYLLABLE GGUT*/
- RTUNI_ALPHA, /* U+00a22b: YI SYLLABLE GGUX*/
- RTUNI_ALPHA, /* U+00a22c: YI SYLLABLE GGU*/
- RTUNI_ALPHA, /* U+00a22d: YI SYLLABLE GGUP*/
- RTUNI_ALPHA, /* U+00a22e: YI SYLLABLE GGURX*/
- RTUNI_ALPHA, /* U+00a22f: YI SYLLABLE GGUR*/
- RTUNI_ALPHA, /* U+00a230: YI SYLLABLE MGIEX*/
- RTUNI_ALPHA, /* U+00a231: YI SYLLABLE MGIE*/
- RTUNI_ALPHA, /* U+00a232: YI SYLLABLE MGAT*/
- RTUNI_ALPHA, /* U+00a233: YI SYLLABLE MGAX*/
- RTUNI_ALPHA, /* U+00a234: YI SYLLABLE MGA*/
- RTUNI_ALPHA, /* U+00a235: YI SYLLABLE MGAP*/
- RTUNI_ALPHA, /* U+00a236: YI SYLLABLE MGUOX*/
- RTUNI_ALPHA, /* U+00a237: YI SYLLABLE MGUO*/
- RTUNI_ALPHA, /* U+00a238: YI SYLLABLE MGUOP*/
- RTUNI_ALPHA, /* U+00a239: YI SYLLABLE MGOT*/
- RTUNI_ALPHA, /* U+00a23a: YI SYLLABLE MGOX*/
- RTUNI_ALPHA, /* U+00a23b: YI SYLLABLE MGO*/
- RTUNI_ALPHA, /* U+00a23c: YI SYLLABLE MGOP*/
- RTUNI_ALPHA, /* U+00a23d: YI SYLLABLE MGEX*/
- RTUNI_ALPHA, /* U+00a23e: YI SYLLABLE MGE*/
- RTUNI_ALPHA, /* U+00a23f: YI SYLLABLE MGEP*/
- RTUNI_ALPHA, /* U+00a240: YI SYLLABLE MGUT*/
- RTUNI_ALPHA, /* U+00a241: YI SYLLABLE MGUX*/
- RTUNI_ALPHA, /* U+00a242: YI SYLLABLE MGU*/
- RTUNI_ALPHA, /* U+00a243: YI SYLLABLE MGUP*/
- RTUNI_ALPHA, /* U+00a244: YI SYLLABLE MGURX*/
- RTUNI_ALPHA, /* U+00a245: YI SYLLABLE MGUR*/
- RTUNI_ALPHA, /* U+00a246: YI SYLLABLE HXIT*/
- RTUNI_ALPHA, /* U+00a247: YI SYLLABLE HXIX*/
- RTUNI_ALPHA, /* U+00a248: YI SYLLABLE HXI*/
- RTUNI_ALPHA, /* U+00a249: YI SYLLABLE HXIP*/
- RTUNI_ALPHA, /* U+00a24a: YI SYLLABLE HXIET*/
- RTUNI_ALPHA, /* U+00a24b: YI SYLLABLE HXIEX*/
- RTUNI_ALPHA, /* U+00a24c: YI SYLLABLE HXIE*/
- RTUNI_ALPHA, /* U+00a24d: YI SYLLABLE HXIEP*/
- RTUNI_ALPHA, /* U+00a24e: YI SYLLABLE HXAT*/
- RTUNI_ALPHA, /* U+00a24f: YI SYLLABLE HXAX*/
- RTUNI_ALPHA, /* U+00a250: YI SYLLABLE HXA*/
- RTUNI_ALPHA, /* U+00a251: YI SYLLABLE HXAP*/
- RTUNI_ALPHA, /* U+00a252: YI SYLLABLE HXUOT*/
- RTUNI_ALPHA, /* U+00a253: YI SYLLABLE HXUOX*/
- RTUNI_ALPHA, /* U+00a254: YI SYLLABLE HXUO*/
- RTUNI_ALPHA, /* U+00a255: YI SYLLABLE HXUOP*/
- RTUNI_ALPHA, /* U+00a256: YI SYLLABLE HXOT*/
- RTUNI_ALPHA, /* U+00a257: YI SYLLABLE HXOX*/
- RTUNI_ALPHA, /* U+00a258: YI SYLLABLE HXO*/
- RTUNI_ALPHA, /* U+00a259: YI SYLLABLE HXOP*/
- RTUNI_ALPHA, /* U+00a25a: YI SYLLABLE HXEX*/
- RTUNI_ALPHA, /* U+00a25b: YI SYLLABLE HXE*/
- RTUNI_ALPHA, /* U+00a25c: YI SYLLABLE HXEP*/
- RTUNI_ALPHA, /* U+00a25d: YI SYLLABLE NGIEX*/
- RTUNI_ALPHA, /* U+00a25e: YI SYLLABLE NGIE*/
- RTUNI_ALPHA, /* U+00a25f: YI SYLLABLE NGIEP*/
- RTUNI_ALPHA, /* U+00a260: YI SYLLABLE NGAT*/
- RTUNI_ALPHA, /* U+00a261: YI SYLLABLE NGAX*/
- RTUNI_ALPHA, /* U+00a262: YI SYLLABLE NGA*/
- RTUNI_ALPHA, /* U+00a263: YI SYLLABLE NGAP*/
- RTUNI_ALPHA, /* U+00a264: YI SYLLABLE NGUOT*/
- RTUNI_ALPHA, /* U+00a265: YI SYLLABLE NGUOX*/
- RTUNI_ALPHA, /* U+00a266: YI SYLLABLE NGUO*/
- RTUNI_ALPHA, /* U+00a267: YI SYLLABLE NGOT*/
- RTUNI_ALPHA, /* U+00a268: YI SYLLABLE NGOX*/
- RTUNI_ALPHA, /* U+00a269: YI SYLLABLE NGO*/
- RTUNI_ALPHA, /* U+00a26a: YI SYLLABLE NGOP*/
- RTUNI_ALPHA, /* U+00a26b: YI SYLLABLE NGEX*/
- RTUNI_ALPHA, /* U+00a26c: YI SYLLABLE NGE*/
- RTUNI_ALPHA, /* U+00a26d: YI SYLLABLE NGEP*/
- RTUNI_ALPHA, /* U+00a26e: YI SYLLABLE HIT*/
- RTUNI_ALPHA, /* U+00a26f: YI SYLLABLE HIEX*/
- RTUNI_ALPHA, /* U+00a270: YI SYLLABLE HIE*/
- RTUNI_ALPHA, /* U+00a271: YI SYLLABLE HAT*/
- RTUNI_ALPHA, /* U+00a272: YI SYLLABLE HAX*/
- RTUNI_ALPHA, /* U+00a273: YI SYLLABLE HA*/
- RTUNI_ALPHA, /* U+00a274: YI SYLLABLE HAP*/
- RTUNI_ALPHA, /* U+00a275: YI SYLLABLE HUOT*/
- RTUNI_ALPHA, /* U+00a276: YI SYLLABLE HUOX*/
- RTUNI_ALPHA, /* U+00a277: YI SYLLABLE HUO*/
- RTUNI_ALPHA, /* U+00a278: YI SYLLABLE HUOP*/
- RTUNI_ALPHA, /* U+00a279: YI SYLLABLE HOT*/
- RTUNI_ALPHA, /* U+00a27a: YI SYLLABLE HOX*/
- RTUNI_ALPHA, /* U+00a27b: YI SYLLABLE HO*/
- RTUNI_ALPHA, /* U+00a27c: YI SYLLABLE HOP*/
- RTUNI_ALPHA, /* U+00a27d: YI SYLLABLE HEX*/
- RTUNI_ALPHA, /* U+00a27e: YI SYLLABLE HE*/
- RTUNI_ALPHA, /* U+00a27f: YI SYLLABLE HEP*/
- RTUNI_ALPHA, /* U+00a280: YI SYLLABLE WAT*/
- RTUNI_ALPHA, /* U+00a281: YI SYLLABLE WAX*/
- RTUNI_ALPHA, /* U+00a282: YI SYLLABLE WA*/
- RTUNI_ALPHA, /* U+00a283: YI SYLLABLE WAP*/
- RTUNI_ALPHA, /* U+00a284: YI SYLLABLE WUOX*/
- RTUNI_ALPHA, /* U+00a285: YI SYLLABLE WUO*/
- RTUNI_ALPHA, /* U+00a286: YI SYLLABLE WUOP*/
- RTUNI_ALPHA, /* U+00a287: YI SYLLABLE WOX*/
- RTUNI_ALPHA, /* U+00a288: YI SYLLABLE WO*/
- RTUNI_ALPHA, /* U+00a289: YI SYLLABLE WOP*/
- RTUNI_ALPHA, /* U+00a28a: YI SYLLABLE WEX*/
- RTUNI_ALPHA, /* U+00a28b: YI SYLLABLE WE*/
- RTUNI_ALPHA, /* U+00a28c: YI SYLLABLE WEP*/
- RTUNI_ALPHA, /* U+00a28d: YI SYLLABLE ZIT*/
- RTUNI_ALPHA, /* U+00a28e: YI SYLLABLE ZIX*/
- RTUNI_ALPHA, /* U+00a28f: YI SYLLABLE ZI*/
- RTUNI_ALPHA, /* U+00a290: YI SYLLABLE ZIP*/
- RTUNI_ALPHA, /* U+00a291: YI SYLLABLE ZIEX*/
- RTUNI_ALPHA, /* U+00a292: YI SYLLABLE ZIE*/
- RTUNI_ALPHA, /* U+00a293: YI SYLLABLE ZIEP*/
- RTUNI_ALPHA, /* U+00a294: YI SYLLABLE ZAT*/
- RTUNI_ALPHA, /* U+00a295: YI SYLLABLE ZAX*/
- RTUNI_ALPHA, /* U+00a296: YI SYLLABLE ZA*/
- RTUNI_ALPHA, /* U+00a297: YI SYLLABLE ZAP*/
- RTUNI_ALPHA, /* U+00a298: YI SYLLABLE ZUOX*/
- RTUNI_ALPHA, /* U+00a299: YI SYLLABLE ZUO*/
- RTUNI_ALPHA, /* U+00a29a: YI SYLLABLE ZUOP*/
- RTUNI_ALPHA, /* U+00a29b: YI SYLLABLE ZOT*/
- RTUNI_ALPHA, /* U+00a29c: YI SYLLABLE ZOX*/
- RTUNI_ALPHA, /* U+00a29d: YI SYLLABLE ZO*/
- RTUNI_ALPHA, /* U+00a29e: YI SYLLABLE ZOP*/
- RTUNI_ALPHA, /* U+00a29f: YI SYLLABLE ZEX*/
- RTUNI_ALPHA, /* U+00a2a0: YI SYLLABLE ZE*/
- RTUNI_ALPHA, /* U+00a2a1: YI SYLLABLE ZEP*/
- RTUNI_ALPHA, /* U+00a2a2: YI SYLLABLE ZUT*/
- RTUNI_ALPHA, /* U+00a2a3: YI SYLLABLE ZUX*/
- RTUNI_ALPHA, /* U+00a2a4: YI SYLLABLE ZU*/
- RTUNI_ALPHA, /* U+00a2a5: YI SYLLABLE ZUP*/
- RTUNI_ALPHA, /* U+00a2a6: YI SYLLABLE ZURX*/
- RTUNI_ALPHA, /* U+00a2a7: YI SYLLABLE ZUR*/
- RTUNI_ALPHA, /* U+00a2a8: YI SYLLABLE ZYT*/
- RTUNI_ALPHA, /* U+00a2a9: YI SYLLABLE ZYX*/
- RTUNI_ALPHA, /* U+00a2aa: YI SYLLABLE ZY*/
- RTUNI_ALPHA, /* U+00a2ab: YI SYLLABLE ZYP*/
- RTUNI_ALPHA, /* U+00a2ac: YI SYLLABLE ZYRX*/
- RTUNI_ALPHA, /* U+00a2ad: YI SYLLABLE ZYR*/
- RTUNI_ALPHA, /* U+00a2ae: YI SYLLABLE CIT*/
- RTUNI_ALPHA, /* U+00a2af: YI SYLLABLE CIX*/
- RTUNI_ALPHA, /* U+00a2b0: YI SYLLABLE CI*/
- RTUNI_ALPHA, /* U+00a2b1: YI SYLLABLE CIP*/
- RTUNI_ALPHA, /* U+00a2b2: YI SYLLABLE CIET*/
- RTUNI_ALPHA, /* U+00a2b3: YI SYLLABLE CIEX*/
- RTUNI_ALPHA, /* U+00a2b4: YI SYLLABLE CIE*/
- RTUNI_ALPHA, /* U+00a2b5: YI SYLLABLE CIEP*/
- RTUNI_ALPHA, /* U+00a2b6: YI SYLLABLE CAT*/
- RTUNI_ALPHA, /* U+00a2b7: YI SYLLABLE CAX*/
- RTUNI_ALPHA, /* U+00a2b8: YI SYLLABLE CA*/
- RTUNI_ALPHA, /* U+00a2b9: YI SYLLABLE CAP*/
- RTUNI_ALPHA, /* U+00a2ba: YI SYLLABLE CUOX*/
- RTUNI_ALPHA, /* U+00a2bb: YI SYLLABLE CUO*/
- RTUNI_ALPHA, /* U+00a2bc: YI SYLLABLE CUOP*/
- RTUNI_ALPHA, /* U+00a2bd: YI SYLLABLE COT*/
- RTUNI_ALPHA, /* U+00a2be: YI SYLLABLE COX*/
- RTUNI_ALPHA, /* U+00a2bf: YI SYLLABLE CO*/
- RTUNI_ALPHA, /* U+00a2c0: YI SYLLABLE COP*/
- RTUNI_ALPHA, /* U+00a2c1: YI SYLLABLE CEX*/
- RTUNI_ALPHA, /* U+00a2c2: YI SYLLABLE CE*/
- RTUNI_ALPHA, /* U+00a2c3: YI SYLLABLE CEP*/
- RTUNI_ALPHA, /* U+00a2c4: YI SYLLABLE CUT*/
- RTUNI_ALPHA, /* U+00a2c5: YI SYLLABLE CUX*/
- RTUNI_ALPHA, /* U+00a2c6: YI SYLLABLE CU*/
- RTUNI_ALPHA, /* U+00a2c7: YI SYLLABLE CUP*/
- RTUNI_ALPHA, /* U+00a2c8: YI SYLLABLE CURX*/
- RTUNI_ALPHA, /* U+00a2c9: YI SYLLABLE CUR*/
- RTUNI_ALPHA, /* U+00a2ca: YI SYLLABLE CYT*/
- RTUNI_ALPHA, /* U+00a2cb: YI SYLLABLE CYX*/
- RTUNI_ALPHA, /* U+00a2cc: YI SYLLABLE CY*/
- RTUNI_ALPHA, /* U+00a2cd: YI SYLLABLE CYP*/
- RTUNI_ALPHA, /* U+00a2ce: YI SYLLABLE CYRX*/
- RTUNI_ALPHA, /* U+00a2cf: YI SYLLABLE CYR*/
- RTUNI_ALPHA, /* U+00a2d0: YI SYLLABLE ZZIT*/
- RTUNI_ALPHA, /* U+00a2d1: YI SYLLABLE ZZIX*/
- RTUNI_ALPHA, /* U+00a2d2: YI SYLLABLE ZZI*/
- RTUNI_ALPHA, /* U+00a2d3: YI SYLLABLE ZZIP*/
- RTUNI_ALPHA, /* U+00a2d4: YI SYLLABLE ZZIET*/
- RTUNI_ALPHA, /* U+00a2d5: YI SYLLABLE ZZIEX*/
- RTUNI_ALPHA, /* U+00a2d6: YI SYLLABLE ZZIE*/
- RTUNI_ALPHA, /* U+00a2d7: YI SYLLABLE ZZIEP*/
- RTUNI_ALPHA, /* U+00a2d8: YI SYLLABLE ZZAT*/
- RTUNI_ALPHA, /* U+00a2d9: YI SYLLABLE ZZAX*/
- RTUNI_ALPHA, /* U+00a2da: YI SYLLABLE ZZA*/
- RTUNI_ALPHA, /* U+00a2db: YI SYLLABLE ZZAP*/
- RTUNI_ALPHA, /* U+00a2dc: YI SYLLABLE ZZOX*/
- RTUNI_ALPHA, /* U+00a2dd: YI SYLLABLE ZZO*/
- RTUNI_ALPHA, /* U+00a2de: YI SYLLABLE ZZOP*/
- RTUNI_ALPHA, /* U+00a2df: YI SYLLABLE ZZEX*/
- RTUNI_ALPHA, /* U+00a2e0: YI SYLLABLE ZZE*/
- RTUNI_ALPHA, /* U+00a2e1: YI SYLLABLE ZZEP*/
- RTUNI_ALPHA, /* U+00a2e2: YI SYLLABLE ZZUX*/
- RTUNI_ALPHA, /* U+00a2e3: YI SYLLABLE ZZU*/
- RTUNI_ALPHA, /* U+00a2e4: YI SYLLABLE ZZUP*/
- RTUNI_ALPHA, /* U+00a2e5: YI SYLLABLE ZZURX*/
- RTUNI_ALPHA, /* U+00a2e6: YI SYLLABLE ZZUR*/
- RTUNI_ALPHA, /* U+00a2e7: YI SYLLABLE ZZYT*/
- RTUNI_ALPHA, /* U+00a2e8: YI SYLLABLE ZZYX*/
- RTUNI_ALPHA, /* U+00a2e9: YI SYLLABLE ZZY*/
- RTUNI_ALPHA, /* U+00a2ea: YI SYLLABLE ZZYP*/
- RTUNI_ALPHA, /* U+00a2eb: YI SYLLABLE ZZYRX*/
- RTUNI_ALPHA, /* U+00a2ec: YI SYLLABLE ZZYR*/
- RTUNI_ALPHA, /* U+00a2ed: YI SYLLABLE NZIT*/
- RTUNI_ALPHA, /* U+00a2ee: YI SYLLABLE NZIX*/
- RTUNI_ALPHA, /* U+00a2ef: YI SYLLABLE NZI*/
- RTUNI_ALPHA, /* U+00a2f0: YI SYLLABLE NZIP*/
- RTUNI_ALPHA, /* U+00a2f1: YI SYLLABLE NZIEX*/
- RTUNI_ALPHA, /* U+00a2f2: YI SYLLABLE NZIE*/
- RTUNI_ALPHA, /* U+00a2f3: YI SYLLABLE NZIEP*/
- RTUNI_ALPHA, /* U+00a2f4: YI SYLLABLE NZAT*/
- RTUNI_ALPHA, /* U+00a2f5: YI SYLLABLE NZAX*/
- RTUNI_ALPHA, /* U+00a2f6: YI SYLLABLE NZA*/
- RTUNI_ALPHA, /* U+00a2f7: YI SYLLABLE NZAP*/
- RTUNI_ALPHA, /* U+00a2f8: YI SYLLABLE NZUOX*/
- RTUNI_ALPHA, /* U+00a2f9: YI SYLLABLE NZUO*/
- RTUNI_ALPHA, /* U+00a2fa: YI SYLLABLE NZOX*/
- RTUNI_ALPHA, /* U+00a2fb: YI SYLLABLE NZOP*/
- RTUNI_ALPHA, /* U+00a2fc: YI SYLLABLE NZEX*/
- RTUNI_ALPHA, /* U+00a2fd: YI SYLLABLE NZE*/
- RTUNI_ALPHA, /* U+00a2fe: YI SYLLABLE NZUX*/
- RTUNI_ALPHA, /* U+00a2ff: YI SYLLABLE NZU*/
- RTUNI_ALPHA, /* U+00a300: YI SYLLABLE NZUP*/
- RTUNI_ALPHA, /* U+00a301: YI SYLLABLE NZURX*/
- RTUNI_ALPHA, /* U+00a302: YI SYLLABLE NZUR*/
- RTUNI_ALPHA, /* U+00a303: YI SYLLABLE NZYT*/
- RTUNI_ALPHA, /* U+00a304: YI SYLLABLE NZYX*/
- RTUNI_ALPHA, /* U+00a305: YI SYLLABLE NZY*/
- RTUNI_ALPHA, /* U+00a306: YI SYLLABLE NZYP*/
- RTUNI_ALPHA, /* U+00a307: YI SYLLABLE NZYRX*/
- RTUNI_ALPHA, /* U+00a308: YI SYLLABLE NZYR*/
- RTUNI_ALPHA, /* U+00a309: YI SYLLABLE SIT*/
- RTUNI_ALPHA, /* U+00a30a: YI SYLLABLE SIX*/
- RTUNI_ALPHA, /* U+00a30b: YI SYLLABLE SI*/
- RTUNI_ALPHA, /* U+00a30c: YI SYLLABLE SIP*/
- RTUNI_ALPHA, /* U+00a30d: YI SYLLABLE SIEX*/
- RTUNI_ALPHA, /* U+00a30e: YI SYLLABLE SIE*/
- RTUNI_ALPHA, /* U+00a30f: YI SYLLABLE SIEP*/
- RTUNI_ALPHA, /* U+00a310: YI SYLLABLE SAT*/
- RTUNI_ALPHA, /* U+00a311: YI SYLLABLE SAX*/
- RTUNI_ALPHA, /* U+00a312: YI SYLLABLE SA*/
- RTUNI_ALPHA, /* U+00a313: YI SYLLABLE SAP*/
- RTUNI_ALPHA, /* U+00a314: YI SYLLABLE SUOX*/
- RTUNI_ALPHA, /* U+00a315: YI SYLLABLE SUO*/
- RTUNI_ALPHA, /* U+00a316: YI SYLLABLE SUOP*/
- RTUNI_ALPHA, /* U+00a317: YI SYLLABLE SOT*/
- RTUNI_ALPHA, /* U+00a318: YI SYLLABLE SOX*/
- RTUNI_ALPHA, /* U+00a319: YI SYLLABLE SO*/
- RTUNI_ALPHA, /* U+00a31a: YI SYLLABLE SOP*/
- RTUNI_ALPHA, /* U+00a31b: YI SYLLABLE SEX*/
- RTUNI_ALPHA, /* U+00a31c: YI SYLLABLE SE*/
- RTUNI_ALPHA, /* U+00a31d: YI SYLLABLE SEP*/
- RTUNI_ALPHA, /* U+00a31e: YI SYLLABLE SUT*/
- RTUNI_ALPHA, /* U+00a31f: YI SYLLABLE SUX*/
- RTUNI_ALPHA, /* U+00a320: YI SYLLABLE SU*/
- RTUNI_ALPHA, /* U+00a321: YI SYLLABLE SUP*/
- RTUNI_ALPHA, /* U+00a322: YI SYLLABLE SURX*/
- RTUNI_ALPHA, /* U+00a323: YI SYLLABLE SUR*/
- RTUNI_ALPHA, /* U+00a324: YI SYLLABLE SYT*/
- RTUNI_ALPHA, /* U+00a325: YI SYLLABLE SYX*/
- RTUNI_ALPHA, /* U+00a326: YI SYLLABLE SY*/
- RTUNI_ALPHA, /* U+00a327: YI SYLLABLE SYP*/
- RTUNI_ALPHA, /* U+00a328: YI SYLLABLE SYRX*/
- RTUNI_ALPHA, /* U+00a329: YI SYLLABLE SYR*/
- RTUNI_ALPHA, /* U+00a32a: YI SYLLABLE SSIT*/
- RTUNI_ALPHA, /* U+00a32b: YI SYLLABLE SSIX*/
- RTUNI_ALPHA, /* U+00a32c: YI SYLLABLE SSI*/
- RTUNI_ALPHA, /* U+00a32d: YI SYLLABLE SSIP*/
- RTUNI_ALPHA, /* U+00a32e: YI SYLLABLE SSIEX*/
- RTUNI_ALPHA, /* U+00a32f: YI SYLLABLE SSIE*/
- RTUNI_ALPHA, /* U+00a330: YI SYLLABLE SSIEP*/
- RTUNI_ALPHA, /* U+00a331: YI SYLLABLE SSAT*/
- RTUNI_ALPHA, /* U+00a332: YI SYLLABLE SSAX*/
- RTUNI_ALPHA, /* U+00a333: YI SYLLABLE SSA*/
- RTUNI_ALPHA, /* U+00a334: YI SYLLABLE SSAP*/
- RTUNI_ALPHA, /* U+00a335: YI SYLLABLE SSOT*/
- RTUNI_ALPHA, /* U+00a336: YI SYLLABLE SSOX*/
- RTUNI_ALPHA, /* U+00a337: YI SYLLABLE SSO*/
- RTUNI_ALPHA, /* U+00a338: YI SYLLABLE SSOP*/
- RTUNI_ALPHA, /* U+00a339: YI SYLLABLE SSEX*/
- RTUNI_ALPHA, /* U+00a33a: YI SYLLABLE SSE*/
- RTUNI_ALPHA, /* U+00a33b: YI SYLLABLE SSEP*/
- RTUNI_ALPHA, /* U+00a33c: YI SYLLABLE SSUT*/
- RTUNI_ALPHA, /* U+00a33d: YI SYLLABLE SSUX*/
- RTUNI_ALPHA, /* U+00a33e: YI SYLLABLE SSU*/
- RTUNI_ALPHA, /* U+00a33f: YI SYLLABLE SSUP*/
- RTUNI_ALPHA, /* U+00a340: YI SYLLABLE SSYT*/
- RTUNI_ALPHA, /* U+00a341: YI SYLLABLE SSYX*/
- RTUNI_ALPHA, /* U+00a342: YI SYLLABLE SSY*/
- RTUNI_ALPHA, /* U+00a343: YI SYLLABLE SSYP*/
- RTUNI_ALPHA, /* U+00a344: YI SYLLABLE SSYRX*/
- RTUNI_ALPHA, /* U+00a345: YI SYLLABLE SSYR*/
- RTUNI_ALPHA, /* U+00a346: YI SYLLABLE ZHAT*/
- RTUNI_ALPHA, /* U+00a347: YI SYLLABLE ZHAX*/
- RTUNI_ALPHA, /* U+00a348: YI SYLLABLE ZHA*/
- RTUNI_ALPHA, /* U+00a349: YI SYLLABLE ZHAP*/
- RTUNI_ALPHA, /* U+00a34a: YI SYLLABLE ZHUOX*/
- RTUNI_ALPHA, /* U+00a34b: YI SYLLABLE ZHUO*/
- RTUNI_ALPHA, /* U+00a34c: YI SYLLABLE ZHUOP*/
- RTUNI_ALPHA, /* U+00a34d: YI SYLLABLE ZHOT*/
- RTUNI_ALPHA, /* U+00a34e: YI SYLLABLE ZHOX*/
- RTUNI_ALPHA, /* U+00a34f: YI SYLLABLE ZHO*/
- RTUNI_ALPHA, /* U+00a350: YI SYLLABLE ZHOP*/
- RTUNI_ALPHA, /* U+00a351: YI SYLLABLE ZHET*/
- RTUNI_ALPHA, /* U+00a352: YI SYLLABLE ZHEX*/
- RTUNI_ALPHA, /* U+00a353: YI SYLLABLE ZHE*/
- RTUNI_ALPHA, /* U+00a354: YI SYLLABLE ZHEP*/
- RTUNI_ALPHA, /* U+00a355: YI SYLLABLE ZHUT*/
- RTUNI_ALPHA, /* U+00a356: YI SYLLABLE ZHUX*/
- RTUNI_ALPHA, /* U+00a357: YI SYLLABLE ZHU*/
- RTUNI_ALPHA, /* U+00a358: YI SYLLABLE ZHUP*/
- RTUNI_ALPHA, /* U+00a359: YI SYLLABLE ZHURX*/
- RTUNI_ALPHA, /* U+00a35a: YI SYLLABLE ZHUR*/
- RTUNI_ALPHA, /* U+00a35b: YI SYLLABLE ZHYT*/
- RTUNI_ALPHA, /* U+00a35c: YI SYLLABLE ZHYX*/
- RTUNI_ALPHA, /* U+00a35d: YI SYLLABLE ZHY*/
- RTUNI_ALPHA, /* U+00a35e: YI SYLLABLE ZHYP*/
- RTUNI_ALPHA, /* U+00a35f: YI SYLLABLE ZHYRX*/
- RTUNI_ALPHA, /* U+00a360: YI SYLLABLE ZHYR*/
- RTUNI_ALPHA, /* U+00a361: YI SYLLABLE CHAT*/
- RTUNI_ALPHA, /* U+00a362: YI SYLLABLE CHAX*/
- RTUNI_ALPHA, /* U+00a363: YI SYLLABLE CHA*/
- RTUNI_ALPHA, /* U+00a364: YI SYLLABLE CHAP*/
- RTUNI_ALPHA, /* U+00a365: YI SYLLABLE CHUOT*/
- RTUNI_ALPHA, /* U+00a366: YI SYLLABLE CHUOX*/
- RTUNI_ALPHA, /* U+00a367: YI SYLLABLE CHUO*/
- RTUNI_ALPHA, /* U+00a368: YI SYLLABLE CHUOP*/
- RTUNI_ALPHA, /* U+00a369: YI SYLLABLE CHOT*/
- RTUNI_ALPHA, /* U+00a36a: YI SYLLABLE CHOX*/
- RTUNI_ALPHA, /* U+00a36b: YI SYLLABLE CHO*/
- RTUNI_ALPHA, /* U+00a36c: YI SYLLABLE CHOP*/
- RTUNI_ALPHA, /* U+00a36d: YI SYLLABLE CHET*/
- RTUNI_ALPHA, /* U+00a36e: YI SYLLABLE CHEX*/
- RTUNI_ALPHA, /* U+00a36f: YI SYLLABLE CHE*/
- RTUNI_ALPHA, /* U+00a370: YI SYLLABLE CHEP*/
- RTUNI_ALPHA, /* U+00a371: YI SYLLABLE CHUX*/
- RTUNI_ALPHA, /* U+00a372: YI SYLLABLE CHU*/
- RTUNI_ALPHA, /* U+00a373: YI SYLLABLE CHUP*/
- RTUNI_ALPHA, /* U+00a374: YI SYLLABLE CHURX*/
- RTUNI_ALPHA, /* U+00a375: YI SYLLABLE CHUR*/
- RTUNI_ALPHA, /* U+00a376: YI SYLLABLE CHYT*/
- RTUNI_ALPHA, /* U+00a377: YI SYLLABLE CHYX*/
- RTUNI_ALPHA, /* U+00a378: YI SYLLABLE CHY*/
- RTUNI_ALPHA, /* U+00a379: YI SYLLABLE CHYP*/
- RTUNI_ALPHA, /* U+00a37a: YI SYLLABLE CHYRX*/
- RTUNI_ALPHA, /* U+00a37b: YI SYLLABLE CHYR*/
- RTUNI_ALPHA, /* U+00a37c: YI SYLLABLE RRAX*/
- RTUNI_ALPHA, /* U+00a37d: YI SYLLABLE RRA*/
- RTUNI_ALPHA, /* U+00a37e: YI SYLLABLE RRUOX*/
- RTUNI_ALPHA, /* U+00a37f: YI SYLLABLE RRUO*/
- RTUNI_ALPHA, /* U+00a380: YI SYLLABLE RROT*/
- RTUNI_ALPHA, /* U+00a381: YI SYLLABLE RROX*/
- RTUNI_ALPHA, /* U+00a382: YI SYLLABLE RRO*/
- RTUNI_ALPHA, /* U+00a383: YI SYLLABLE RROP*/
- RTUNI_ALPHA, /* U+00a384: YI SYLLABLE RRET*/
- RTUNI_ALPHA, /* U+00a385: YI SYLLABLE RREX*/
- RTUNI_ALPHA, /* U+00a386: YI SYLLABLE RRE*/
- RTUNI_ALPHA, /* U+00a387: YI SYLLABLE RREP*/
- RTUNI_ALPHA, /* U+00a388: YI SYLLABLE RRUT*/
- RTUNI_ALPHA, /* U+00a389: YI SYLLABLE RRUX*/
- RTUNI_ALPHA, /* U+00a38a: YI SYLLABLE RRU*/
- RTUNI_ALPHA, /* U+00a38b: YI SYLLABLE RRUP*/
- RTUNI_ALPHA, /* U+00a38c: YI SYLLABLE RRURX*/
- RTUNI_ALPHA, /* U+00a38d: YI SYLLABLE RRUR*/
- RTUNI_ALPHA, /* U+00a38e: YI SYLLABLE RRYT*/
- RTUNI_ALPHA, /* U+00a38f: YI SYLLABLE RRYX*/
- RTUNI_ALPHA, /* U+00a390: YI SYLLABLE RRY*/
- RTUNI_ALPHA, /* U+00a391: YI SYLLABLE RRYP*/
- RTUNI_ALPHA, /* U+00a392: YI SYLLABLE RRYRX*/
- RTUNI_ALPHA, /* U+00a393: YI SYLLABLE RRYR*/
- RTUNI_ALPHA, /* U+00a394: YI SYLLABLE NRAT*/
- RTUNI_ALPHA, /* U+00a395: YI SYLLABLE NRAX*/
- RTUNI_ALPHA, /* U+00a396: YI SYLLABLE NRA*/
- RTUNI_ALPHA, /* U+00a397: YI SYLLABLE NRAP*/
- RTUNI_ALPHA, /* U+00a398: YI SYLLABLE NROX*/
- RTUNI_ALPHA, /* U+00a399: YI SYLLABLE NRO*/
- RTUNI_ALPHA, /* U+00a39a: YI SYLLABLE NROP*/
- RTUNI_ALPHA, /* U+00a39b: YI SYLLABLE NRET*/
- RTUNI_ALPHA, /* U+00a39c: YI SYLLABLE NREX*/
- RTUNI_ALPHA, /* U+00a39d: YI SYLLABLE NRE*/
- RTUNI_ALPHA, /* U+00a39e: YI SYLLABLE NREP*/
- RTUNI_ALPHA, /* U+00a39f: YI SYLLABLE NRUT*/
- RTUNI_ALPHA, /* U+00a3a0: YI SYLLABLE NRUX*/
- RTUNI_ALPHA, /* U+00a3a1: YI SYLLABLE NRU*/
- RTUNI_ALPHA, /* U+00a3a2: YI SYLLABLE NRUP*/
- RTUNI_ALPHA, /* U+00a3a3: YI SYLLABLE NRURX*/
- RTUNI_ALPHA, /* U+00a3a4: YI SYLLABLE NRUR*/
- RTUNI_ALPHA, /* U+00a3a5: YI SYLLABLE NRYT*/
- RTUNI_ALPHA, /* U+00a3a6: YI SYLLABLE NRYX*/
- RTUNI_ALPHA, /* U+00a3a7: YI SYLLABLE NRY*/
- RTUNI_ALPHA, /* U+00a3a8: YI SYLLABLE NRYP*/
- RTUNI_ALPHA, /* U+00a3a9: YI SYLLABLE NRYRX*/
- RTUNI_ALPHA, /* U+00a3aa: YI SYLLABLE NRYR*/
- RTUNI_ALPHA, /* U+00a3ab: YI SYLLABLE SHAT*/
- RTUNI_ALPHA, /* U+00a3ac: YI SYLLABLE SHAX*/
- RTUNI_ALPHA, /* U+00a3ad: YI SYLLABLE SHA*/
- RTUNI_ALPHA, /* U+00a3ae: YI SYLLABLE SHAP*/
- RTUNI_ALPHA, /* U+00a3af: YI SYLLABLE SHUOX*/
- RTUNI_ALPHA, /* U+00a3b0: YI SYLLABLE SHUO*/
- RTUNI_ALPHA, /* U+00a3b1: YI SYLLABLE SHUOP*/
- RTUNI_ALPHA, /* U+00a3b2: YI SYLLABLE SHOT*/
- RTUNI_ALPHA, /* U+00a3b3: YI SYLLABLE SHOX*/
- RTUNI_ALPHA, /* U+00a3b4: YI SYLLABLE SHO*/
- RTUNI_ALPHA, /* U+00a3b5: YI SYLLABLE SHOP*/
- RTUNI_ALPHA, /* U+00a3b6: YI SYLLABLE SHET*/
- RTUNI_ALPHA, /* U+00a3b7: YI SYLLABLE SHEX*/
- RTUNI_ALPHA, /* U+00a3b8: YI SYLLABLE SHE*/
- RTUNI_ALPHA, /* U+00a3b9: YI SYLLABLE SHEP*/
- RTUNI_ALPHA, /* U+00a3ba: YI SYLLABLE SHUT*/
- RTUNI_ALPHA, /* U+00a3bb: YI SYLLABLE SHUX*/
- RTUNI_ALPHA, /* U+00a3bc: YI SYLLABLE SHU*/
- RTUNI_ALPHA, /* U+00a3bd: YI SYLLABLE SHUP*/
- RTUNI_ALPHA, /* U+00a3be: YI SYLLABLE SHURX*/
- RTUNI_ALPHA, /* U+00a3bf: YI SYLLABLE SHUR*/
- RTUNI_ALPHA, /* U+00a3c0: YI SYLLABLE SHYT*/
- RTUNI_ALPHA, /* U+00a3c1: YI SYLLABLE SHYX*/
- RTUNI_ALPHA, /* U+00a3c2: YI SYLLABLE SHY*/
- RTUNI_ALPHA, /* U+00a3c3: YI SYLLABLE SHYP*/
- RTUNI_ALPHA, /* U+00a3c4: YI SYLLABLE SHYRX*/
- RTUNI_ALPHA, /* U+00a3c5: YI SYLLABLE SHYR*/
- RTUNI_ALPHA, /* U+00a3c6: YI SYLLABLE RAT*/
- RTUNI_ALPHA, /* U+00a3c7: YI SYLLABLE RAX*/
- RTUNI_ALPHA, /* U+00a3c8: YI SYLLABLE RA*/
- RTUNI_ALPHA, /* U+00a3c9: YI SYLLABLE RAP*/
- RTUNI_ALPHA, /* U+00a3ca: YI SYLLABLE RUOX*/
- RTUNI_ALPHA, /* U+00a3cb: YI SYLLABLE RUO*/
- RTUNI_ALPHA, /* U+00a3cc: YI SYLLABLE RUOP*/
- RTUNI_ALPHA, /* U+00a3cd: YI SYLLABLE ROT*/
- RTUNI_ALPHA, /* U+00a3ce: YI SYLLABLE ROX*/
- RTUNI_ALPHA, /* U+00a3cf: YI SYLLABLE RO*/
- RTUNI_ALPHA, /* U+00a3d0: YI SYLLABLE ROP*/
- RTUNI_ALPHA, /* U+00a3d1: YI SYLLABLE REX*/
- RTUNI_ALPHA, /* U+00a3d2: YI SYLLABLE RE*/
- RTUNI_ALPHA, /* U+00a3d3: YI SYLLABLE REP*/
- RTUNI_ALPHA, /* U+00a3d4: YI SYLLABLE RUT*/
- RTUNI_ALPHA, /* U+00a3d5: YI SYLLABLE RUX*/
- RTUNI_ALPHA, /* U+00a3d6: YI SYLLABLE RU*/
- RTUNI_ALPHA, /* U+00a3d7: YI SYLLABLE RUP*/
- RTUNI_ALPHA, /* U+00a3d8: YI SYLLABLE RURX*/
- RTUNI_ALPHA, /* U+00a3d9: YI SYLLABLE RUR*/
- RTUNI_ALPHA, /* U+00a3da: YI SYLLABLE RYT*/
- RTUNI_ALPHA, /* U+00a3db: YI SYLLABLE RYX*/
- RTUNI_ALPHA, /* U+00a3dc: YI SYLLABLE RY*/
- RTUNI_ALPHA, /* U+00a3dd: YI SYLLABLE RYP*/
- RTUNI_ALPHA, /* U+00a3de: YI SYLLABLE RYRX*/
- RTUNI_ALPHA, /* U+00a3df: YI SYLLABLE RYR*/
- RTUNI_ALPHA, /* U+00a3e0: YI SYLLABLE JIT*/
- RTUNI_ALPHA, /* U+00a3e1: YI SYLLABLE JIX*/
- RTUNI_ALPHA, /* U+00a3e2: YI SYLLABLE JI*/
- RTUNI_ALPHA, /* U+00a3e3: YI SYLLABLE JIP*/
- RTUNI_ALPHA, /* U+00a3e4: YI SYLLABLE JIET*/
- RTUNI_ALPHA, /* U+00a3e5: YI SYLLABLE JIEX*/
- RTUNI_ALPHA, /* U+00a3e6: YI SYLLABLE JIE*/
- RTUNI_ALPHA, /* U+00a3e7: YI SYLLABLE JIEP*/
- RTUNI_ALPHA, /* U+00a3e8: YI SYLLABLE JUOT*/
- RTUNI_ALPHA, /* U+00a3e9: YI SYLLABLE JUOX*/
- RTUNI_ALPHA, /* U+00a3ea: YI SYLLABLE JUO*/
- RTUNI_ALPHA, /* U+00a3eb: YI SYLLABLE JUOP*/
- RTUNI_ALPHA, /* U+00a3ec: YI SYLLABLE JOT*/
- RTUNI_ALPHA, /* U+00a3ed: YI SYLLABLE JOX*/
- RTUNI_ALPHA, /* U+00a3ee: YI SYLLABLE JO*/
- RTUNI_ALPHA, /* U+00a3ef: YI SYLLABLE JOP*/
- RTUNI_ALPHA, /* U+00a3f0: YI SYLLABLE JUT*/
- RTUNI_ALPHA, /* U+00a3f1: YI SYLLABLE JUX*/
- RTUNI_ALPHA, /* U+00a3f2: YI SYLLABLE JU*/
- RTUNI_ALPHA, /* U+00a3f3: YI SYLLABLE JUP*/
- RTUNI_ALPHA, /* U+00a3f4: YI SYLLABLE JURX*/
- RTUNI_ALPHA, /* U+00a3f5: YI SYLLABLE JUR*/
- RTUNI_ALPHA, /* U+00a3f6: YI SYLLABLE JYT*/
- RTUNI_ALPHA, /* U+00a3f7: YI SYLLABLE JYX*/
- RTUNI_ALPHA, /* U+00a3f8: YI SYLLABLE JY*/
- RTUNI_ALPHA, /* U+00a3f9: YI SYLLABLE JYP*/
- RTUNI_ALPHA, /* U+00a3fa: YI SYLLABLE JYRX*/
- RTUNI_ALPHA, /* U+00a3fb: YI SYLLABLE JYR*/
- RTUNI_ALPHA, /* U+00a3fc: YI SYLLABLE QIT*/
- RTUNI_ALPHA, /* U+00a3fd: YI SYLLABLE QIX*/
- RTUNI_ALPHA, /* U+00a3fe: YI SYLLABLE QI*/
- RTUNI_ALPHA, /* U+00a3ff: YI SYLLABLE QIP*/
- RTUNI_ALPHA, /* U+00a400: YI SYLLABLE QIET*/
- RTUNI_ALPHA, /* U+00a401: YI SYLLABLE QIEX*/
- RTUNI_ALPHA, /* U+00a402: YI SYLLABLE QIE*/
- RTUNI_ALPHA, /* U+00a403: YI SYLLABLE QIEP*/
- RTUNI_ALPHA, /* U+00a404: YI SYLLABLE QUOT*/
- RTUNI_ALPHA, /* U+00a405: YI SYLLABLE QUOX*/
- RTUNI_ALPHA, /* U+00a406: YI SYLLABLE QUO*/
- RTUNI_ALPHA, /* U+00a407: YI SYLLABLE QUOP*/
- RTUNI_ALPHA, /* U+00a408: YI SYLLABLE QOT*/
- RTUNI_ALPHA, /* U+00a409: YI SYLLABLE QOX*/
- RTUNI_ALPHA, /* U+00a40a: YI SYLLABLE QO*/
- RTUNI_ALPHA, /* U+00a40b: YI SYLLABLE QOP*/
- RTUNI_ALPHA, /* U+00a40c: YI SYLLABLE QUT*/
- RTUNI_ALPHA, /* U+00a40d: YI SYLLABLE QUX*/
- RTUNI_ALPHA, /* U+00a40e: YI SYLLABLE QU*/
- RTUNI_ALPHA, /* U+00a40f: YI SYLLABLE QUP*/
- RTUNI_ALPHA, /* U+00a410: YI SYLLABLE QURX*/
- RTUNI_ALPHA, /* U+00a411: YI SYLLABLE QUR*/
- RTUNI_ALPHA, /* U+00a412: YI SYLLABLE QYT*/
- RTUNI_ALPHA, /* U+00a413: YI SYLLABLE QYX*/
- RTUNI_ALPHA, /* U+00a414: YI SYLLABLE QY*/
- RTUNI_ALPHA, /* U+00a415: YI SYLLABLE QYP*/
- RTUNI_ALPHA, /* U+00a416: YI SYLLABLE QYRX*/
- RTUNI_ALPHA, /* U+00a417: YI SYLLABLE QYR*/
- RTUNI_ALPHA, /* U+00a418: YI SYLLABLE JJIT*/
- RTUNI_ALPHA, /* U+00a419: YI SYLLABLE JJIX*/
- RTUNI_ALPHA, /* U+00a41a: YI SYLLABLE JJI*/
- RTUNI_ALPHA, /* U+00a41b: YI SYLLABLE JJIP*/
- RTUNI_ALPHA, /* U+00a41c: YI SYLLABLE JJIET*/
- RTUNI_ALPHA, /* U+00a41d: YI SYLLABLE JJIEX*/
- RTUNI_ALPHA, /* U+00a41e: YI SYLLABLE JJIE*/
- RTUNI_ALPHA, /* U+00a41f: YI SYLLABLE JJIEP*/
- RTUNI_ALPHA, /* U+00a420: YI SYLLABLE JJUOX*/
- RTUNI_ALPHA, /* U+00a421: YI SYLLABLE JJUO*/
- RTUNI_ALPHA, /* U+00a422: YI SYLLABLE JJUOP*/
- RTUNI_ALPHA, /* U+00a423: YI SYLLABLE JJOT*/
- RTUNI_ALPHA, /* U+00a424: YI SYLLABLE JJOX*/
- RTUNI_ALPHA, /* U+00a425: YI SYLLABLE JJO*/
- RTUNI_ALPHA, /* U+00a426: YI SYLLABLE JJOP*/
- RTUNI_ALPHA, /* U+00a427: YI SYLLABLE JJUT*/
- RTUNI_ALPHA, /* U+00a428: YI SYLLABLE JJUX*/
- RTUNI_ALPHA, /* U+00a429: YI SYLLABLE JJU*/
- RTUNI_ALPHA, /* U+00a42a: YI SYLLABLE JJUP*/
- RTUNI_ALPHA, /* U+00a42b: YI SYLLABLE JJURX*/
- RTUNI_ALPHA, /* U+00a42c: YI SYLLABLE JJUR*/
- RTUNI_ALPHA, /* U+00a42d: YI SYLLABLE JJYT*/
- RTUNI_ALPHA, /* U+00a42e: YI SYLLABLE JJYX*/
- RTUNI_ALPHA, /* U+00a42f: YI SYLLABLE JJY*/
- RTUNI_ALPHA, /* U+00a430: YI SYLLABLE JJYP*/
- RTUNI_ALPHA, /* U+00a431: YI SYLLABLE NJIT*/
- RTUNI_ALPHA, /* U+00a432: YI SYLLABLE NJIX*/
- RTUNI_ALPHA, /* U+00a433: YI SYLLABLE NJI*/
- RTUNI_ALPHA, /* U+00a434: YI SYLLABLE NJIP*/
- RTUNI_ALPHA, /* U+00a435: YI SYLLABLE NJIET*/
- RTUNI_ALPHA, /* U+00a436: YI SYLLABLE NJIEX*/
- RTUNI_ALPHA, /* U+00a437: YI SYLLABLE NJIE*/
- RTUNI_ALPHA, /* U+00a438: YI SYLLABLE NJIEP*/
- RTUNI_ALPHA, /* U+00a439: YI SYLLABLE NJUOX*/
- RTUNI_ALPHA, /* U+00a43a: YI SYLLABLE NJUO*/
- RTUNI_ALPHA, /* U+00a43b: YI SYLLABLE NJOT*/
- RTUNI_ALPHA, /* U+00a43c: YI SYLLABLE NJOX*/
- RTUNI_ALPHA, /* U+00a43d: YI SYLLABLE NJO*/
- RTUNI_ALPHA, /* U+00a43e: YI SYLLABLE NJOP*/
- RTUNI_ALPHA, /* U+00a43f: YI SYLLABLE NJUX*/
- RTUNI_ALPHA, /* U+00a440: YI SYLLABLE NJU*/
- RTUNI_ALPHA, /* U+00a441: YI SYLLABLE NJUP*/
- RTUNI_ALPHA, /* U+00a442: YI SYLLABLE NJURX*/
- RTUNI_ALPHA, /* U+00a443: YI SYLLABLE NJUR*/
- RTUNI_ALPHA, /* U+00a444: YI SYLLABLE NJYT*/
- RTUNI_ALPHA, /* U+00a445: YI SYLLABLE NJYX*/
- RTUNI_ALPHA, /* U+00a446: YI SYLLABLE NJY*/
- RTUNI_ALPHA, /* U+00a447: YI SYLLABLE NJYP*/
- RTUNI_ALPHA, /* U+00a448: YI SYLLABLE NJYRX*/
- RTUNI_ALPHA, /* U+00a449: YI SYLLABLE NJYR*/
- RTUNI_ALPHA, /* U+00a44a: YI SYLLABLE NYIT*/
- RTUNI_ALPHA, /* U+00a44b: YI SYLLABLE NYIX*/
- RTUNI_ALPHA, /* U+00a44c: YI SYLLABLE NYI*/
- RTUNI_ALPHA, /* U+00a44d: YI SYLLABLE NYIP*/
- RTUNI_ALPHA, /* U+00a44e: YI SYLLABLE NYIET*/
- RTUNI_ALPHA, /* U+00a44f: YI SYLLABLE NYIEX*/
- RTUNI_ALPHA, /* U+00a450: YI SYLLABLE NYIE*/
- RTUNI_ALPHA, /* U+00a451: YI SYLLABLE NYIEP*/
- RTUNI_ALPHA, /* U+00a452: YI SYLLABLE NYUOX*/
- RTUNI_ALPHA, /* U+00a453: YI SYLLABLE NYUO*/
- RTUNI_ALPHA, /* U+00a454: YI SYLLABLE NYUOP*/
- RTUNI_ALPHA, /* U+00a455: YI SYLLABLE NYOT*/
- RTUNI_ALPHA, /* U+00a456: YI SYLLABLE NYOX*/
- RTUNI_ALPHA, /* U+00a457: YI SYLLABLE NYO*/
- RTUNI_ALPHA, /* U+00a458: YI SYLLABLE NYOP*/
- RTUNI_ALPHA, /* U+00a459: YI SYLLABLE NYUT*/
- RTUNI_ALPHA, /* U+00a45a: YI SYLLABLE NYUX*/
- RTUNI_ALPHA, /* U+00a45b: YI SYLLABLE NYU*/
- RTUNI_ALPHA, /* U+00a45c: YI SYLLABLE NYUP*/
- RTUNI_ALPHA, /* U+00a45d: YI SYLLABLE XIT*/
- RTUNI_ALPHA, /* U+00a45e: YI SYLLABLE XIX*/
- RTUNI_ALPHA, /* U+00a45f: YI SYLLABLE XI*/
- RTUNI_ALPHA, /* U+00a460: YI SYLLABLE XIP*/
- RTUNI_ALPHA, /* U+00a461: YI SYLLABLE XIET*/
- RTUNI_ALPHA, /* U+00a462: YI SYLLABLE XIEX*/
- RTUNI_ALPHA, /* U+00a463: YI SYLLABLE XIE*/
- RTUNI_ALPHA, /* U+00a464: YI SYLLABLE XIEP*/
- RTUNI_ALPHA, /* U+00a465: YI SYLLABLE XUOX*/
- RTUNI_ALPHA, /* U+00a466: YI SYLLABLE XUO*/
- RTUNI_ALPHA, /* U+00a467: YI SYLLABLE XOT*/
- RTUNI_ALPHA, /* U+00a468: YI SYLLABLE XOX*/
- RTUNI_ALPHA, /* U+00a469: YI SYLLABLE XO*/
- RTUNI_ALPHA, /* U+00a46a: YI SYLLABLE XOP*/
- RTUNI_ALPHA, /* U+00a46b: YI SYLLABLE XYT*/
- RTUNI_ALPHA, /* U+00a46c: YI SYLLABLE XYX*/
- RTUNI_ALPHA, /* U+00a46d: YI SYLLABLE XY*/
- RTUNI_ALPHA, /* U+00a46e: YI SYLLABLE XYP*/
- RTUNI_ALPHA, /* U+00a46f: YI SYLLABLE XYRX*/
- RTUNI_ALPHA, /* U+00a470: YI SYLLABLE XYR*/
- RTUNI_ALPHA, /* U+00a471: YI SYLLABLE YIT*/
- RTUNI_ALPHA, /* U+00a472: YI SYLLABLE YIX*/
- RTUNI_ALPHA, /* U+00a473: YI SYLLABLE YI*/
- RTUNI_ALPHA, /* U+00a474: YI SYLLABLE YIP*/
- RTUNI_ALPHA, /* U+00a475: YI SYLLABLE YIET*/
- RTUNI_ALPHA, /* U+00a476: YI SYLLABLE YIEX*/
- RTUNI_ALPHA, /* U+00a477: YI SYLLABLE YIE*/
- RTUNI_ALPHA, /* U+00a478: YI SYLLABLE YIEP*/
- RTUNI_ALPHA, /* U+00a479: YI SYLLABLE YUOT*/
- RTUNI_ALPHA, /* U+00a47a: YI SYLLABLE YUOX*/
- RTUNI_ALPHA, /* U+00a47b: YI SYLLABLE YUO*/
- RTUNI_ALPHA, /* U+00a47c: YI SYLLABLE YUOP*/
- RTUNI_ALPHA, /* U+00a47d: YI SYLLABLE YOT*/
- RTUNI_ALPHA, /* U+00a47e: YI SYLLABLE YOX*/
- RTUNI_ALPHA, /* U+00a47f: YI SYLLABLE YO*/
- RTUNI_ALPHA, /* U+00a480: YI SYLLABLE YOP*/
- RTUNI_ALPHA, /* U+00a481: YI SYLLABLE YUT*/
- RTUNI_ALPHA, /* U+00a482: YI SYLLABLE YUX*/
- RTUNI_ALPHA, /* U+00a483: YI SYLLABLE YU*/
- RTUNI_ALPHA, /* U+00a484: YI SYLLABLE YUP*/
- RTUNI_ALPHA, /* U+00a485: YI SYLLABLE YURX*/
- RTUNI_ALPHA, /* U+00a486: YI SYLLABLE YUR*/
- RTUNI_ALPHA, /* U+00a487: YI SYLLABLE YYT*/
- RTUNI_ALPHA, /* U+00a488: YI SYLLABLE YYX*/
- RTUNI_ALPHA, /* U+00a489: YI SYLLABLE YY*/
- RTUNI_ALPHA, /* U+00a48a: YI SYLLABLE YYP*/
- RTUNI_ALPHA, /* U+00a48b: YI SYLLABLE YYRX*/
- RTUNI_ALPHA, /* U+00a48c: YI SYLLABLE YYR*/
- 0, /* U+00a48d: */
- 0, /* U+00a48e: */
- 0, /* U+00a48f: */
- 0, /* U+00a490: YI RADICAL QOT*/
- 0, /* U+00a491: YI RADICAL LI*/
- 0, /* U+00a492: YI RADICAL KIT*/
- 0, /* U+00a493: YI RADICAL NYIP*/
- 0, /* U+00a494: YI RADICAL CYP*/
- 0, /* U+00a495: YI RADICAL SSI*/
- 0, /* U+00a496: YI RADICAL GGOP*/
- 0, /* U+00a497: YI RADICAL GEP*/
- 0, /* U+00a498: YI RADICAL MI*/
- 0, /* U+00a499: YI RADICAL HXIT*/
- 0, /* U+00a49a: YI RADICAL LYR*/
- 0, /* U+00a49b: YI RADICAL BBUT*/
- 0, /* U+00a49c: YI RADICAL MOP*/
- 0, /* U+00a49d: YI RADICAL YO*/
- 0, /* U+00a49e: YI RADICAL PUT*/
- 0, /* U+00a49f: YI RADICAL HXUO*/
- 0, /* U+00a4a0: YI RADICAL TAT*/
- 0, /* U+00a4a1: YI RADICAL GA*/
- 0, /* U+00a4a2: YI RADICAL ZUP*/
- 0, /* U+00a4a3: YI RADICAL CYT*/
- 0, /* U+00a4a4: YI RADICAL DDUR*/
- 0, /* U+00a4a5: YI RADICAL BUR*/
- 0, /* U+00a4a6: YI RADICAL GGUO*/
- 0, /* U+00a4a7: YI RADICAL NYOP*/
- 0, /* U+00a4a8: YI RADICAL TU*/
- 0, /* U+00a4a9: YI RADICAL OP*/
- 0, /* U+00a4aa: YI RADICAL JJUT*/
- 0, /* U+00a4ab: YI RADICAL ZOT*/
- 0, /* U+00a4ac: YI RADICAL PYT*/
- 0, /* U+00a4ad: YI RADICAL HMO*/
- 0, /* U+00a4ae: YI RADICAL YIT*/
- 0, /* U+00a4af: YI RADICAL VUR*/
- 0, /* U+00a4b0: YI RADICAL SHY*/
- 0, /* U+00a4b1: YI RADICAL VEP*/
- 0, /* U+00a4b2: YI RADICAL ZA*/
- 0, /* U+00a4b3: YI RADICAL JO*/
- 0, /* U+00a4b4: YI RADICAL NZUP*/
- 0, /* U+00a4b5: YI RADICAL JJY*/
- 0, /* U+00a4b6: YI RADICAL GOT*/
- 0, /* U+00a4b7: YI RADICAL JJIE*/
- 0, /* U+00a4b8: YI RADICAL WO*/
- 0, /* U+00a4b9: YI RADICAL DU*/
- 0, /* U+00a4ba: YI RADICAL SHUR*/
- 0, /* U+00a4bb: YI RADICAL LIE*/
- 0, /* U+00a4bc: YI RADICAL CY*/
- 0, /* U+00a4bd: YI RADICAL CUOP*/
- 0, /* U+00a4be: YI RADICAL CIP*/
- 0, /* U+00a4bf: YI RADICAL HXOP*/
- 0, /* U+00a4c0: YI RADICAL SHAT*/
- 0, /* U+00a4c1: YI RADICAL ZUR*/
- 0, /* U+00a4c2: YI RADICAL SHOP*/
- 0, /* U+00a4c3: YI RADICAL CHE*/
- 0, /* U+00a4c4: YI RADICAL ZZIET*/
- 0, /* U+00a4c5: YI RADICAL NBIE*/
- 0, /* U+00a4c6: YI RADICAL KE*/
- 0, /* U+00a4c7: */
- 0, /* U+00a4c8: */
- 0, /* U+00a4c9: */
- 0, /* U+00a4ca: */
- 0, /* U+00a4cb: */
- 0, /* U+00a4cc: */
- 0, /* U+00a4cd: */
- 0, /* U+00a4ce: */
- 0, /* U+00a4cf: */
- 0, /* U+00a4d0: */
- 0, /* U+00a4d1: */
- 0, /* U+00a4d2: */
- 0, /* U+00a4d3: */
- 0, /* U+00a4d4: */
- 0, /* U+00a4d5: */
- 0, /* U+00a4d6: */
- 0, /* U+00a4d7: */
- 0, /* U+00a4d8: */
- 0, /* U+00a4d9: */
- 0, /* U+00a4da: */
- 0, /* U+00a4db: */
- 0, /* U+00a4dc: */
- 0, /* U+00a4dd: */
- 0, /* U+00a4de: */
- 0, /* U+00a4df: */
- 0, /* U+00a4e0: */
- 0, /* U+00a4e1: */
- 0, /* U+00a4e2: */
- 0, /* U+00a4e3: */
- 0, /* U+00a4e4: */
- 0, /* U+00a4e5: */
- 0, /* U+00a4e6: */
- 0, /* U+00a4e7: */
- 0, /* U+00a4e8: */
- 0, /* U+00a4e9: */
- 0, /* U+00a4ea: */
- 0, /* U+00a4eb: */
- 0, /* U+00a4ec: */
- 0, /* U+00a4ed: */
- 0, /* U+00a4ee: */
- 0, /* U+00a4ef: */
- 0, /* U+00a4f0: */
- 0, /* U+00a4f1: */
- 0, /* U+00a4f2: */
- 0, /* U+00a4f3: */
- 0, /* U+00a4f4: */
- 0, /* U+00a4f5: */
- 0, /* U+00a4f6: */
- 0, /* U+00a4f7: */
- 0, /* U+00a4f8: */
- 0, /* U+00a4f9: */
- 0, /* U+00a4fa: */
- 0, /* U+00a4fb: */
- 0, /* U+00a4fc: */
- 0, /* U+00a4fd: */
- 0, /* U+00a4fe: */
- 0, /* U+00a4ff: */
- 0, /* U+00a500: */
- 0, /* U+00a501: */
- 0, /* U+00a502: */
- 0, /* U+00a503: */
- 0, /* U+00a504: */
- 0, /* U+00a505: */
- 0, /* U+00a506: */
- 0, /* U+00a507: */
- 0, /* U+00a508: */
- 0, /* U+00a509: */
- 0, /* U+00a50a: */
- 0, /* U+00a50b: */
- 0, /* U+00a50c: */
- 0, /* U+00a50d: */
- 0, /* U+00a50e: */
- 0, /* U+00a50f: */
- 0, /* U+00a510: */
- 0, /* U+00a511: */
- 0, /* U+00a512: */
- 0, /* U+00a513: */
- 0, /* U+00a514: */
- 0, /* U+00a515: */
- 0, /* U+00a516: */
- 0, /* U+00a517: */
- 0, /* U+00a518: */
- 0, /* U+00a519: */
- 0, /* U+00a51a: */
- 0, /* U+00a51b: */
- 0, /* U+00a51c: */
- 0, /* U+00a51d: */
- 0, /* U+00a51e: */
- 0, /* U+00a51f: */
- 0, /* U+00a520: */
- 0, /* U+00a521: */
- 0, /* U+00a522: */
- 0, /* U+00a523: */
- 0, /* U+00a524: */
- 0, /* U+00a525: */
- 0, /* U+00a526: */
- 0, /* U+00a527: */
- 0, /* U+00a528: */
- 0, /* U+00a529: */
- 0, /* U+00a52a: */
- 0, /* U+00a52b: */
- 0, /* U+00a52c: */
- 0, /* U+00a52d: */
- 0, /* U+00a52e: */
- 0, /* U+00a52f: */
- 0, /* U+00a530: */
- 0, /* U+00a531: */
- 0, /* U+00a532: */
- 0, /* U+00a533: */
- 0, /* U+00a534: */
- 0, /* U+00a535: */
- 0, /* U+00a536: */
- 0, /* U+00a537: */
- 0, /* U+00a538: */
- 0, /* U+00a539: */
- 0, /* U+00a53a: */
- 0, /* U+00a53b: */
- 0, /* U+00a53c: */
- 0, /* U+00a53d: */
- 0, /* U+00a53e: */
- 0, /* U+00a53f: */
- 0, /* U+00a540: */
- 0, /* U+00a541: */
- 0, /* U+00a542: */
- 0, /* U+00a543: */
- 0, /* U+00a544: */
- 0, /* U+00a545: */
- 0, /* U+00a546: */
- 0, /* U+00a547: */
- 0, /* U+00a548: */
- 0, /* U+00a549: */
- 0, /* U+00a54a: */
- 0, /* U+00a54b: */
- 0, /* U+00a54c: */
- 0, /* U+00a54d: */
- 0, /* U+00a54e: */
- 0, /* U+00a54f: */
- 0, /* U+00a550: */
- 0, /* U+00a551: */
- 0, /* U+00a552: */
- 0, /* U+00a553: */
- 0, /* U+00a554: */
- 0, /* U+00a555: */
- 0, /* U+00a556: */
- 0, /* U+00a557: */
- 0, /* U+00a558: */
- 0, /* U+00a559: */
- 0, /* U+00a55a: */
- 0, /* U+00a55b: */
- 0, /* U+00a55c: */
- 0, /* U+00a55d: */
- 0, /* U+00a55e: */
- 0, /* U+00a55f: */
- 0, /* U+00a560: */
- 0, /* U+00a561: */
- 0, /* U+00a562: */
- 0, /* U+00a563: */
- 0, /* U+00a564: */
- 0, /* U+00a565: */
- 0, /* U+00a566: */
- 0, /* U+00a567: */
- 0, /* U+00a568: */
- 0, /* U+00a569: */
- 0, /* U+00a56a: */
- 0, /* U+00a56b: */
- 0, /* U+00a56c: */
- 0, /* U+00a56d: */
- 0, /* U+00a56e: */
- 0, /* U+00a56f: */
- 0, /* U+00a570: */
- 0, /* U+00a571: */
- 0, /* U+00a572: */
- 0, /* U+00a573: */
- 0, /* U+00a574: */
- 0, /* U+00a575: */
- 0, /* U+00a576: */
- 0, /* U+00a577: */
- 0, /* U+00a578: */
- 0, /* U+00a579: */
- 0, /* U+00a57a: */
- 0, /* U+00a57b: */
- 0, /* U+00a57c: */
- 0, /* U+00a57d: */
- 0, /* U+00a57e: */
- 0, /* U+00a57f: */
- 0, /* U+00a580: */
- 0, /* U+00a581: */
- 0, /* U+00a582: */
- 0, /* U+00a583: */
- 0, /* U+00a584: */
- 0, /* U+00a585: */
- 0, /* U+00a586: */
- 0, /* U+00a587: */
- 0, /* U+00a588: */
- 0, /* U+00a589: */
- 0, /* U+00a58a: */
- 0, /* U+00a58b: */
- 0, /* U+00a58c: */
- 0, /* U+00a58d: */
- 0, /* U+00a58e: */
- 0, /* U+00a58f: */
- 0, /* U+00a590: */
- 0, /* U+00a591: */
- 0, /* U+00a592: */
- 0, /* U+00a593: */
- 0, /* U+00a594: */
- 0, /* U+00a595: */
- 0, /* U+00a596: */
- 0, /* U+00a597: */
- 0, /* U+00a598: */
- 0, /* U+00a599: */
- 0, /* U+00a59a: */
- 0, /* U+00a59b: */
- 0, /* U+00a59c: */
- 0, /* U+00a59d: */
- 0, /* U+00a59e: */
- 0, /* U+00a59f: */
- 0, /* U+00a5a0: */
- 0, /* U+00a5a1: */
- 0, /* U+00a5a2: */
- 0, /* U+00a5a3: */
- 0, /* U+00a5a4: */
- 0, /* U+00a5a5: */
- 0, /* U+00a5a6: */
- 0, /* U+00a5a7: */
- 0, /* U+00a5a8: */
- 0, /* U+00a5a9: */
- 0, /* U+00a5aa: */
- 0, /* U+00a5ab: */
- 0, /* U+00a5ac: */
- 0, /* U+00a5ad: */
- 0, /* U+00a5ae: */
- 0, /* U+00a5af: */
- 0, /* U+00a5b0: */
- 0, /* U+00a5b1: */
- 0, /* U+00a5b2: */
- 0, /* U+00a5b3: */
- 0, /* U+00a5b4: */
- 0, /* U+00a5b5: */
- 0, /* U+00a5b6: */
- 0, /* U+00a5b7: */
- 0, /* U+00a5b8: */
- 0, /* U+00a5b9: */
- 0, /* U+00a5ba: */
- 0, /* U+00a5bb: */
- 0, /* U+00a5bc: */
- 0, /* U+00a5bd: */
- 0, /* U+00a5be: */
- 0, /* U+00a5bf: */
- 0, /* U+00a5c0: */
- 0, /* U+00a5c1: */
- 0, /* U+00a5c2: */
- 0, /* U+00a5c3: */
- 0, /* U+00a5c4: */
- 0, /* U+00a5c5: */
- 0, /* U+00a5c6: */
- 0, /* U+00a5c7: */
- 0, /* U+00a5c8: */
- 0, /* U+00a5c9: */
- 0, /* U+00a5ca: */
- 0, /* U+00a5cb: */
- 0, /* U+00a5cc: */
- 0, /* U+00a5cd: */
- 0, /* U+00a5ce: */
- 0, /* U+00a5cf: */
- 0, /* U+00a5d0: */
- 0, /* U+00a5d1: */
- 0, /* U+00a5d2: */
- 0, /* U+00a5d3: */
- 0, /* U+00a5d4: */
- 0, /* U+00a5d5: */
- 0, /* U+00a5d6: */
- 0, /* U+00a5d7: */
- 0, /* U+00a5d8: */
- 0, /* U+00a5d9: */
- 0, /* U+00a5da: */
- 0, /* U+00a5db: */
- 0, /* U+00a5dc: */
- 0, /* U+00a5dd: */
- 0, /* U+00a5de: */
- 0, /* U+00a5df: */
- 0, /* U+00a5e0: */
- 0, /* U+00a5e1: */
- 0, /* U+00a5e2: */
- 0, /* U+00a5e3: */
- 0, /* U+00a5e4: */
- 0, /* U+00a5e5: */
- 0, /* U+00a5e6: */
- 0, /* U+00a5e7: */
- 0, /* U+00a5e8: */
- 0, /* U+00a5e9: */
- 0, /* U+00a5ea: */
- 0, /* U+00a5eb: */
- 0, /* U+00a5ec: */
- 0, /* U+00a5ed: */
- 0, /* U+00a5ee: */
- 0, /* U+00a5ef: */
- 0, /* U+00a5f0: */
- 0, /* U+00a5f1: */
- 0, /* U+00a5f2: */
- 0, /* U+00a5f3: */
- 0, /* U+00a5f4: */
- 0, /* U+00a5f5: */
- 0, /* U+00a5f6: */
- 0, /* U+00a5f7: */
- 0, /* U+00a5f8: */
- 0, /* U+00a5f9: */
- 0, /* U+00a5fa: */
- 0, /* U+00a5fb: */
- 0, /* U+00a5fc: */
- 0, /* U+00a5fd: */
- 0, /* U+00a5fe: */
- 0, /* U+00a5ff: */
- 0, /* U+00a600: */
- 0, /* U+00a601: */
- 0, /* U+00a602: */
- 0, /* U+00a603: */
- 0, /* U+00a604: */
- 0, /* U+00a605: */
- 0, /* U+00a606: */
- 0, /* U+00a607: */
- 0, /* U+00a608: */
- 0, /* U+00a609: */
- 0, /* U+00a60a: */
- 0, /* U+00a60b: */
- 0, /* U+00a60c: */
- 0, /* U+00a60d: */
- 0, /* U+00a60e: */
- 0, /* U+00a60f: */
- 0, /* U+00a610: */
- 0, /* U+00a611: */
- 0, /* U+00a612: */
- 0, /* U+00a613: */
- 0, /* U+00a614: */
- 0, /* U+00a615: */
- 0, /* U+00a616: */
- 0, /* U+00a617: */
- 0, /* U+00a618: */
- 0, /* U+00a619: */
- 0, /* U+00a61a: */
- 0, /* U+00a61b: */
- 0, /* U+00a61c: */
- 0, /* U+00a61d: */
- 0, /* U+00a61e: */
- 0, /* U+00a61f: */
- 0, /* U+00a620: */
- 0, /* U+00a621: */
- 0, /* U+00a622: */
- 0, /* U+00a623: */
- 0, /* U+00a624: */
- 0, /* U+00a625: */
- 0, /* U+00a626: */
- 0, /* U+00a627: */
- 0, /* U+00a628: */
- 0, /* U+00a629: */
- 0, /* U+00a62a: */
- 0, /* U+00a62b: */
- 0, /* U+00a62c: */
- 0, /* U+00a62d: */
- 0, /* U+00a62e: */
- 0, /* U+00a62f: */
- 0, /* U+00a630: */
- 0, /* U+00a631: */
- 0, /* U+00a632: */
- 0, /* U+00a633: */
- 0, /* U+00a634: */
- 0, /* U+00a635: */
- 0, /* U+00a636: */
- 0, /* U+00a637: */
- 0, /* U+00a638: */
- 0, /* U+00a639: */
- 0, /* U+00a63a: */
- 0, /* U+00a63b: */
- 0, /* U+00a63c: */
- 0, /* U+00a63d: */
- 0, /* U+00a63e: */
- 0, /* U+00a63f: */
- 0, /* U+00a640: */
- 0, /* U+00a641: */
- 0, /* U+00a642: */
- 0, /* U+00a643: */
- 0, /* U+00a644: */
- 0, /* U+00a645: */
- 0, /* U+00a646: */
- 0, /* U+00a647: */
- 0, /* U+00a648: */
- 0, /* U+00a649: */
- 0, /* U+00a64a: */
- 0, /* U+00a64b: */
- 0, /* U+00a64c: */
- 0, /* U+00a64d: */
- 0, /* U+00a64e: */
- 0, /* U+00a64f: */
- 0, /* U+00a650: */
- 0, /* U+00a651: */
- 0, /* U+00a652: */
- 0, /* U+00a653: */
- 0, /* U+00a654: */
- 0, /* U+00a655: */
- 0, /* U+00a656: */
- 0, /* U+00a657: */
- 0, /* U+00a658: */
- 0, /* U+00a659: */
- 0, /* U+00a65a: */
- 0, /* U+00a65b: */
- 0, /* U+00a65c: */
- 0, /* U+00a65d: */
- 0, /* U+00a65e: */
- 0, /* U+00a65f: */
- 0, /* U+00a660: */
- 0, /* U+00a661: */
- 0, /* U+00a662: */
- 0, /* U+00a663: */
- 0, /* U+00a664: */
- 0, /* U+00a665: */
- 0, /* U+00a666: */
- 0, /* U+00a667: */
- 0, /* U+00a668: */
- 0, /* U+00a669: */
- 0, /* U+00a66a: */
- 0, /* U+00a66b: */
- 0, /* U+00a66c: */
- 0, /* U+00a66d: */
- 0, /* U+00a66e: */
- 0, /* U+00a66f: */
- 0, /* U+00a670: */
- 0, /* U+00a671: */
- 0, /* U+00a672: */
- 0, /* U+00a673: */
- 0, /* U+00a674: */
- 0, /* U+00a675: */
- 0, /* U+00a676: */
- 0, /* U+00a677: */
- 0, /* U+00a678: */
- 0, /* U+00a679: */
- 0, /* U+00a67a: */
- 0, /* U+00a67b: */
- 0, /* U+00a67c: */
- 0, /* U+00a67d: */
- 0, /* U+00a67e: */
- 0, /* U+00a67f: */
- 0, /* U+00a680: */
- 0, /* U+00a681: */
- 0, /* U+00a682: */
- 0, /* U+00a683: */
- 0, /* U+00a684: */
- 0, /* U+00a685: */
- 0, /* U+00a686: */
- 0, /* U+00a687: */
- 0, /* U+00a688: */
- 0, /* U+00a689: */
- 0, /* U+00a68a: */
- 0, /* U+00a68b: */
- 0, /* U+00a68c: */
- 0, /* U+00a68d: */
- 0, /* U+00a68e: */
- 0, /* U+00a68f: */
- 0, /* U+00a690: */
- 0, /* U+00a691: */
- 0, /* U+00a692: */
- 0, /* U+00a693: */
- 0, /* U+00a694: */
- 0, /* U+00a695: */
- 0, /* U+00a696: */
- 0, /* U+00a697: */
- 0, /* U+00a698: */
- 0, /* U+00a699: */
- 0, /* U+00a69a: */
- 0, /* U+00a69b: */
- 0, /* U+00a69c: */
- 0, /* U+00a69d: */
- 0, /* U+00a69e: */
- 0, /* U+00a69f: */
- 0, /* U+00a6a0: */
- 0, /* U+00a6a1: */
- 0, /* U+00a6a2: */
- 0, /* U+00a6a3: */
- 0, /* U+00a6a4: */
- 0, /* U+00a6a5: */
- 0, /* U+00a6a6: */
- 0, /* U+00a6a7: */
- 0, /* U+00a6a8: */
- 0, /* U+00a6a9: */
- 0, /* U+00a6aa: */
- 0, /* U+00a6ab: */
- 0, /* U+00a6ac: */
- 0, /* U+00a6ad: */
- 0, /* U+00a6ae: */
- 0, /* U+00a6af: */
- 0, /* U+00a6b0: */
- 0, /* U+00a6b1: */
- 0, /* U+00a6b2: */
- 0, /* U+00a6b3: */
- 0, /* U+00a6b4: */
- 0, /* U+00a6b5: */
- 0, /* U+00a6b6: */
- 0, /* U+00a6b7: */
- 0, /* U+00a6b8: */
- 0, /* U+00a6b9: */
- 0, /* U+00a6ba: */
- 0, /* U+00a6bb: */
- 0, /* U+00a6bc: */
- 0, /* U+00a6bd: */
- 0, /* U+00a6be: */
- 0, /* U+00a6bf: */
- 0, /* U+00a6c0: */
- 0, /* U+00a6c1: */
- 0, /* U+00a6c2: */
- 0, /* U+00a6c3: */
- 0, /* U+00a6c4: */
- 0, /* U+00a6c5: */
- 0, /* U+00a6c6: */
- 0, /* U+00a6c7: */
- 0, /* U+00a6c8: */
- 0, /* U+00a6c9: */
- 0, /* U+00a6ca: */
- 0, /* U+00a6cb: */
- 0, /* U+00a6cc: */
- 0, /* U+00a6cd: */
- 0, /* U+00a6ce: */
- 0, /* U+00a6cf: */
- 0, /* U+00a6d0: */
- 0, /* U+00a6d1: */
- 0, /* U+00a6d2: */
- 0, /* U+00a6d3: */
- 0, /* U+00a6d4: */
- 0, /* U+00a6d5: */
- 0, /* U+00a6d6: */
- 0, /* U+00a6d7: */
- 0, /* U+00a6d8: */
- 0, /* U+00a6d9: */
- 0, /* U+00a6da: */
- 0, /* U+00a6db: */
- 0, /* U+00a6dc: */
- 0, /* U+00a6dd: */
- 0, /* U+00a6de: */
- 0, /* U+00a6df: */
- 0, /* U+00a6e0: */
- 0, /* U+00a6e1: */
- 0, /* U+00a6e2: */
- 0, /* U+00a6e3: */
- 0, /* U+00a6e4: */
- 0, /* U+00a6e5: */
- 0, /* U+00a6e6: */
- 0, /* U+00a6e7: */
- 0, /* U+00a6e8: */
- 0, /* U+00a6e9: */
- 0, /* U+00a6ea: */
- 0, /* U+00a6eb: */
- 0, /* U+00a6ec: */
- 0, /* U+00a6ed: */
- 0, /* U+00a6ee: */
- 0, /* U+00a6ef: */
- 0, /* U+00a6f0: */
- 0, /* U+00a6f1: */
- 0, /* U+00a6f2: */
- 0, /* U+00a6f3: */
- 0, /* U+00a6f4: */
- 0, /* U+00a6f5: */
- 0, /* U+00a6f6: */
- 0, /* U+00a6f7: */
- 0, /* U+00a6f8: */
- 0, /* U+00a6f9: */
- 0, /* U+00a6fa: */
- 0, /* U+00a6fb: */
- 0, /* U+00a6fc: */
- 0, /* U+00a6fd: */
- 0, /* U+00a6fe: */
- 0, /* U+00a6ff: */
- 0, /* U+00a700: MODIFIER LETTER CHINESE TONE YIN PING*/
- 0, /* U+00a701: MODIFIER LETTER CHINESE TONE YANG PING*/
- 0, /* U+00a702: MODIFIER LETTER CHINESE TONE YIN SHANG*/
- 0, /* U+00a703: MODIFIER LETTER CHINESE TONE YANG SHANG*/
- 0, /* U+00a704: MODIFIER LETTER CHINESE TONE YIN QU*/
- 0, /* U+00a705: MODIFIER LETTER CHINESE TONE YANG QU*/
- 0, /* U+00a706: MODIFIER LETTER CHINESE TONE YIN RU*/
- 0, /* U+00a707: MODIFIER LETTER CHINESE TONE YANG RU*/
- 0, /* U+00a708: MODIFIER LETTER EXTRA-HIGH DOTTED TONE BAR*/
- 0, /* U+00a709: MODIFIER LETTER HIGH DOTTED TONE BAR*/
- 0, /* U+00a70a: MODIFIER LETTER MID DOTTED TONE BAR*/
- 0, /* U+00a70b: MODIFIER LETTER LOW DOTTED TONE BAR*/
- 0, /* U+00a70c: MODIFIER LETTER EXTRA-LOW DOTTED TONE BAR*/
- 0, /* U+00a70d: MODIFIER LETTER EXTRA-HIGH DOTTED LEFT-STEM TONE BAR*/
- 0, /* U+00a70e: MODIFIER LETTER HIGH DOTTED LEFT-STEM TONE BAR*/
- 0, /* U+00a70f: MODIFIER LETTER MID DOTTED LEFT-STEM TONE BAR*/
- 0, /* U+00a710: MODIFIER LETTER LOW DOTTED LEFT-STEM TONE BAR*/
- 0, /* U+00a711: MODIFIER LETTER EXTRA-LOW DOTTED LEFT-STEM TONE BAR*/
- 0, /* U+00a712: MODIFIER LETTER EXTRA-HIGH LEFT-STEM TONE BAR*/
- 0, /* U+00a713: MODIFIER LETTER HIGH LEFT-STEM TONE BAR*/
- 0, /* U+00a714: MODIFIER LETTER MID LEFT-STEM TONE BAR*/
- 0, /* U+00a715: MODIFIER LETTER LOW LEFT-STEM TONE BAR*/
- 0, /* U+00a716: MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR*/
- 0, /* U+00a717: */
- 0, /* U+00a718: */
- 0, /* U+00a719: */
- 0, /* U+00a71a: */
- 0, /* U+00a71b: */
- 0, /* U+00a71c: */
- 0, /* U+00a71d: */
- 0, /* U+00a71e: */
- 0, /* U+00a71f: */
- 0, /* U+00a720: */
- 0, /* U+00a721: */
- 0, /* U+00a722: */
- 0, /* U+00a723: */
- 0, /* U+00a724: */
- 0, /* U+00a725: */
- 0, /* U+00a726: */
- 0, /* U+00a727: */
- 0, /* U+00a728: */
- 0, /* U+00a729: */
- 0, /* U+00a72a: */
- 0, /* U+00a72b: */
- 0, /* U+00a72c: */
- 0, /* U+00a72d: */
- 0, /* U+00a72e: */
- 0, /* U+00a72f: */
- 0, /* U+00a730: */
- 0, /* U+00a731: */
- 0, /* U+00a732: */
- 0, /* U+00a733: */
- 0, /* U+00a734: */
- 0, /* U+00a735: */
- 0, /* U+00a736: */
- 0, /* U+00a737: */
- 0, /* U+00a738: */
- 0, /* U+00a739: */
- 0, /* U+00a73a: */
- 0, /* U+00a73b: */
- 0, /* U+00a73c: */
- 0, /* U+00a73d: */
- 0, /* U+00a73e: */
- 0, /* U+00a73f: */
- 0, /* U+00a740: */
- 0, /* U+00a741: */
- 0, /* U+00a742: */
- 0, /* U+00a743: */
- 0, /* U+00a744: */
- 0, /* U+00a745: */
- 0, /* U+00a746: */
- 0, /* U+00a747: */
- 0, /* U+00a748: */
- 0, /* U+00a749: */
- 0, /* U+00a74a: */
- 0, /* U+00a74b: */
- 0, /* U+00a74c: */
- 0, /* U+00a74d: */
- 0, /* U+00a74e: */
- 0, /* U+00a74f: */
- 0, /* U+00a750: */
- 0, /* U+00a751: */
- 0, /* U+00a752: */
- 0, /* U+00a753: */
- 0, /* U+00a754: */
- 0, /* U+00a755: */
- 0, /* U+00a756: */
- 0, /* U+00a757: */
- 0, /* U+00a758: */
- 0, /* U+00a759: */
- 0, /* U+00a75a: */
- 0, /* U+00a75b: */
- 0, /* U+00a75c: */
- 0, /* U+00a75d: */
- 0, /* U+00a75e: */
- 0, /* U+00a75f: */
- 0, /* U+00a760: */
- 0, /* U+00a761: */
- 0, /* U+00a762: */
- 0, /* U+00a763: */
- 0, /* U+00a764: */
- 0, /* U+00a765: */
- 0, /* U+00a766: */
- 0, /* U+00a767: */
- 0, /* U+00a768: */
- 0, /* U+00a769: */
- 0, /* U+00a76a: */
- 0, /* U+00a76b: */
- 0, /* U+00a76c: */
- 0, /* U+00a76d: */
- 0, /* U+00a76e: */
- 0, /* U+00a76f: */
- 0, /* U+00a770: */
- 0, /* U+00a771: */
- 0, /* U+00a772: */
- 0, /* U+00a773: */
- 0, /* U+00a774: */
- 0, /* U+00a775: */
- 0, /* U+00a776: */
- 0, /* U+00a777: */
- 0, /* U+00a778: */
- 0, /* U+00a779: */
- 0, /* U+00a77a: */
- 0, /* U+00a77b: */
- 0, /* U+00a77c: */
- 0, /* U+00a77d: */
- 0, /* U+00a77e: */
- 0, /* U+00a77f: */
- 0, /* U+00a780: */
- 0, /* U+00a781: */
- 0, /* U+00a782: */
- 0, /* U+00a783: */
- 0, /* U+00a784: */
- 0, /* U+00a785: */
- 0, /* U+00a786: */
- 0, /* U+00a787: */
- 0, /* U+00a788: */
- 0, /* U+00a789: */
- 0, /* U+00a78a: */
- 0, /* U+00a78b: */
- 0, /* U+00a78c: */
- 0, /* U+00a78d: */
- 0, /* U+00a78e: */
- 0, /* U+00a78f: */
- 0, /* U+00a790: */
- 0, /* U+00a791: */
- 0, /* U+00a792: */
- 0, /* U+00a793: */
- 0, /* U+00a794: */
- 0, /* U+00a795: */
- 0, /* U+00a796: */
- 0, /* U+00a797: */
- 0, /* U+00a798: */
- 0, /* U+00a799: */
- 0, /* U+00a79a: */
- 0, /* U+00a79b: */
- 0, /* U+00a79c: */
- 0, /* U+00a79d: */
- 0, /* U+00a79e: */
- 0, /* U+00a79f: */
- 0, /* U+00a7a0: */
- 0, /* U+00a7a1: */
- 0, /* U+00a7a2: */
- 0, /* U+00a7a3: */
- 0, /* U+00a7a4: */
- 0, /* U+00a7a5: */
- 0, /* U+00a7a6: */
- 0, /* U+00a7a7: */
- 0, /* U+00a7a8: */
- 0, /* U+00a7a9: */
- 0, /* U+00a7aa: */
- 0, /* U+00a7ab: */
- 0, /* U+00a7ac: */
- 0, /* U+00a7ad: */
- 0, /* U+00a7ae: */
- 0, /* U+00a7af: */
- 0, /* U+00a7b0: */
- 0, /* U+00a7b1: */
- 0, /* U+00a7b2: */
- 0, /* U+00a7b3: */
- 0, /* U+00a7b4: */
- 0, /* U+00a7b5: */
- 0, /* U+00a7b6: */
- 0, /* U+00a7b7: */
- 0, /* U+00a7b8: */
- 0, /* U+00a7b9: */
- 0, /* U+00a7ba: */
- 0, /* U+00a7bb: */
- 0, /* U+00a7bc: */
- 0, /* U+00a7bd: */
- 0, /* U+00a7be: */
- 0, /* U+00a7bf: */
- 0, /* U+00a7c0: */
- 0, /* U+00a7c1: */
- 0, /* U+00a7c2: */
- 0, /* U+00a7c3: */
- 0, /* U+00a7c4: */
- 0, /* U+00a7c5: */
- 0, /* U+00a7c6: */
- 0, /* U+00a7c7: */
- 0, /* U+00a7c8: */
- 0, /* U+00a7c9: */
- 0, /* U+00a7ca: */
- 0, /* U+00a7cb: */
- 0, /* U+00a7cc: */
- 0, /* U+00a7cd: */
- 0, /* U+00a7ce: */
- 0, /* U+00a7cf: */
- 0, /* U+00a7d0: */
- 0, /* U+00a7d1: */
- 0, /* U+00a7d2: */
- 0, /* U+00a7d3: */
- 0, /* U+00a7d4: */
- 0, /* U+00a7d5: */
- 0, /* U+00a7d6: */
- 0, /* U+00a7d7: */
- 0, /* U+00a7d8: */
- 0, /* U+00a7d9: */
- 0, /* U+00a7da: */
- 0, /* U+00a7db: */
- 0, /* U+00a7dc: */
- 0, /* U+00a7dd: */
- 0, /* U+00a7de: */
- 0, /* U+00a7df: */
- 0, /* U+00a7e0: */
- 0, /* U+00a7e1: */
- 0, /* U+00a7e2: */
- 0, /* U+00a7e3: */
- 0, /* U+00a7e4: */
- 0, /* U+00a7e5: */
- 0, /* U+00a7e6: */
- 0, /* U+00a7e7: */
- 0, /* U+00a7e8: */
- 0, /* U+00a7e9: */
- 0, /* U+00a7ea: */
- 0, /* U+00a7eb: */
- 0, /* U+00a7ec: */
- 0, /* U+00a7ed: */
- 0, /* U+00a7ee: */
- 0, /* U+00a7ef: */
- 0, /* U+00a7f0: */
- 0, /* U+00a7f1: */
- 0, /* U+00a7f2: */
- 0, /* U+00a7f3: */
- 0, /* U+00a7f4: */
- 0, /* U+00a7f5: */
- 0, /* U+00a7f6: */
- 0, /* U+00a7f7: */
- 0, /* U+00a7f8: */
- 0, /* U+00a7f9: */
- 0, /* U+00a7fa: */
- 0, /* U+00a7fb: */
- 0, /* U+00a7fc: */
- 0, /* U+00a7fd: */
- 0, /* U+00a7fe: */
- 0, /* U+00a7ff: */
- RTUNI_ALPHA, /* U+00a800: SYLOTI NAGRI LETTER A*/
- RTUNI_ALPHA, /* U+00a801: SYLOTI NAGRI LETTER I*/
- 0, /* U+00a802: SYLOTI NAGRI SIGN DVISVARA*/
- RTUNI_ALPHA, /* U+00a803: SYLOTI NAGRI LETTER U*/
- RTUNI_ALPHA, /* U+00a804: SYLOTI NAGRI LETTER E*/
- RTUNI_ALPHA, /* U+00a805: SYLOTI NAGRI LETTER O*/
- 0, /* U+00a806: SYLOTI NAGRI SIGN HASANTA*/
- RTUNI_ALPHA, /* U+00a807: SYLOTI NAGRI LETTER KO*/
- RTUNI_ALPHA, /* U+00a808: SYLOTI NAGRI LETTER KHO*/
- RTUNI_ALPHA, /* U+00a809: SYLOTI NAGRI LETTER GO*/
- RTUNI_ALPHA, /* U+00a80a: SYLOTI NAGRI LETTER GHO*/
- 0, /* U+00a80b: SYLOTI NAGRI SIGN ANUSVARA*/
- RTUNI_ALPHA, /* U+00a80c: SYLOTI NAGRI LETTER CO*/
- RTUNI_ALPHA, /* U+00a80d: SYLOTI NAGRI LETTER CHO*/
- RTUNI_ALPHA, /* U+00a80e: SYLOTI NAGRI LETTER JO*/
- RTUNI_ALPHA, /* U+00a80f: SYLOTI NAGRI LETTER JHO*/
- RTUNI_ALPHA, /* U+00a810: SYLOTI NAGRI LETTER TTO*/
- RTUNI_ALPHA, /* U+00a811: SYLOTI NAGRI LETTER TTHO*/
- RTUNI_ALPHA, /* U+00a812: SYLOTI NAGRI LETTER DDO*/
- RTUNI_ALPHA, /* U+00a813: SYLOTI NAGRI LETTER DDHO*/
- RTUNI_ALPHA, /* U+00a814: SYLOTI NAGRI LETTER TO*/
- RTUNI_ALPHA, /* U+00a815: SYLOTI NAGRI LETTER THO*/
- RTUNI_ALPHA, /* U+00a816: SYLOTI NAGRI LETTER DO*/
- RTUNI_ALPHA, /* U+00a817: SYLOTI NAGRI LETTER DHO*/
- RTUNI_ALPHA, /* U+00a818: SYLOTI NAGRI LETTER NO*/
- RTUNI_ALPHA, /* U+00a819: SYLOTI NAGRI LETTER PO*/
- RTUNI_ALPHA, /* U+00a81a: SYLOTI NAGRI LETTER PHO*/
- RTUNI_ALPHA, /* U+00a81b: SYLOTI NAGRI LETTER BO*/
- RTUNI_ALPHA, /* U+00a81c: SYLOTI NAGRI LETTER BHO*/
- RTUNI_ALPHA, /* U+00a81d: SYLOTI NAGRI LETTER MO*/
- RTUNI_ALPHA, /* U+00a81e: SYLOTI NAGRI LETTER RO*/
- RTUNI_ALPHA, /* U+00a81f: SYLOTI NAGRI LETTER LO*/
- RTUNI_ALPHA, /* U+00a820: SYLOTI NAGRI LETTER RRO*/
- RTUNI_ALPHA, /* U+00a821: SYLOTI NAGRI LETTER SO*/
- RTUNI_ALPHA, /* U+00a822: SYLOTI NAGRI LETTER HO*/
- RTUNI_ALPHA, /* U+00a823: SYLOTI NAGRI VOWEL SIGN A*/
- RTUNI_ALPHA, /* U+00a824: SYLOTI NAGRI VOWEL SIGN I*/
- RTUNI_ALPHA, /* U+00a825: SYLOTI NAGRI VOWEL SIGN U*/
- RTUNI_ALPHA, /* U+00a826: SYLOTI NAGRI VOWEL SIGN E*/
- RTUNI_ALPHA, /* U+00a827: SYLOTI NAGRI VOWEL SIGN OO*/
- 0, /* U+00a828: SYLOTI NAGRI POETRY MARK-1*/
- 0, /* U+00a829: SYLOTI NAGRI POETRY MARK-2*/
- 0, /* U+00a82a: SYLOTI NAGRI POETRY MARK-3*/
- 0, /* U+00a82b: SYLOTI NAGRI POETRY MARK-4*/
- 0, /* U+00a82c: */
- 0, /* U+00a82d: */
- 0, /* U+00a82e: */
- 0, /* U+00a82f: */
- 0, /* U+00a830: */
- 0, /* U+00a831: */
- 0, /* U+00a832: */
- 0, /* U+00a833: */
- 0, /* U+00a834: */
- 0, /* U+00a835: */
- 0, /* U+00a836: */
- 0, /* U+00a837: */
- 0, /* U+00a838: */
- 0, /* U+00a839: */
- 0, /* U+00a83a: */
- 0, /* U+00a83b: */
- 0, /* U+00a83c: */
- 0, /* U+00a83d: */
- 0, /* U+00a83e: */
- 0, /* U+00a83f: */
- 0, /* U+00a840: */
- 0, /* U+00a841: */
- 0, /* U+00a842: */
- 0, /* U+00a843: */
- 0, /* U+00a844: */
- 0, /* U+00a845: */
- 0, /* U+00a846: */
- 0, /* U+00a847: */
- 0, /* U+00a848: */
- 0, /* U+00a849: */
- 0, /* U+00a84a: */
- 0, /* U+00a84b: */
- 0, /* U+00a84c: */
- 0, /* U+00a84d: */
- 0, /* U+00a84e: */
- 0, /* U+00a84f: */
- 0, /* U+00a850: */
- 0, /* U+00a851: */
- 0, /* U+00a852: */
- 0, /* U+00a853: */
- 0, /* U+00a854: */
- 0, /* U+00a855: */
- 0, /* U+00a856: */
- 0, /* U+00a857: */
- 0, /* U+00a858: */
- 0, /* U+00a859: */
- 0, /* U+00a85a: */
- 0, /* U+00a85b: */
- 0, /* U+00a85c: */
- 0, /* U+00a85d: */
- 0, /* U+00a85e: */
- 0, /* U+00a85f: */
- 0, /* U+00a860: */
- 0, /* U+00a861: */
- 0, /* U+00a862: */
- 0, /* U+00a863: */
- 0, /* U+00a864: */
- 0, /* U+00a865: */
- 0, /* U+00a866: */
- 0, /* U+00a867: */
- 0, /* U+00a868: */
- 0, /* U+00a869: */
- 0, /* U+00a86a: */
- 0, /* U+00a86b: */
- 0, /* U+00a86c: */
- 0, /* U+00a86d: */
- 0, /* U+00a86e: */
- 0, /* U+00a86f: */
- 0, /* U+00a870: */
- 0, /* U+00a871: */
- 0, /* U+00a872: */
- 0, /* U+00a873: */
- 0, /* U+00a874: */
- 0, /* U+00a875: */
- 0, /* U+00a876: */
- 0, /* U+00a877: */
- 0, /* U+00a878: */
- 0, /* U+00a879: */
- 0, /* U+00a87a: */
- 0, /* U+00a87b: */
- 0, /* U+00a87c: */
- 0, /* U+00a87d: */
- 0, /* U+00a87e: */
- 0, /* U+00a87f: */
- 0, /* U+00a880: */
- 0, /* U+00a881: */
- 0, /* U+00a882: */
- 0, /* U+00a883: */
- 0, /* U+00a884: */
- 0, /* U+00a885: */
- 0, /* U+00a886: */
- 0, /* U+00a887: */
- 0, /* U+00a888: */
- 0, /* U+00a889: */
- 0, /* U+00a88a: */
- 0, /* U+00a88b: */
- 0, /* U+00a88c: */
- 0, /* U+00a88d: */
- 0, /* U+00a88e: */
- 0, /* U+00a88f: */
- 0, /* U+00a890: */
- 0, /* U+00a891: */
- 0, /* U+00a892: */
- 0, /* U+00a893: */
- 0, /* U+00a894: */
- 0, /* U+00a895: */
- 0, /* U+00a896: */
- 0, /* U+00a897: */
- 0, /* U+00a898: */
- 0, /* U+00a899: */
- 0, /* U+00a89a: */
- 0, /* U+00a89b: */
- 0, /* U+00a89c: */
- 0, /* U+00a89d: */
- 0, /* U+00a89e: */
- 0, /* U+00a89f: */
- 0, /* U+00a8a0: */
- 0, /* U+00a8a1: */
- 0, /* U+00a8a2: */
- 0, /* U+00a8a3: */
- 0, /* U+00a8a4: */
- 0, /* U+00a8a5: */
- 0, /* U+00a8a6: */
- 0, /* U+00a8a7: */
- 0, /* U+00a8a8: */
- 0, /* U+00a8a9: */
- 0, /* U+00a8aa: */
- 0, /* U+00a8ab: */
- 0, /* U+00a8ac: */
- 0, /* U+00a8ad: */
- 0, /* U+00a8ae: */
- 0, /* U+00a8af: */
- 0, /* U+00a8b0: */
- 0, /* U+00a8b1: */
- 0, /* U+00a8b2: */
- 0, /* U+00a8b3: */
- 0, /* U+00a8b4: */
- 0, /* U+00a8b5: */
- 0, /* U+00a8b6: */
- 0, /* U+00a8b7: */
- 0, /* U+00a8b8: */
- 0, /* U+00a8b9: */
- 0, /* U+00a8ba: */
- 0, /* U+00a8bb: */
- 0, /* U+00a8bc: */
- 0, /* U+00a8bd: */
- 0, /* U+00a8be: */
- 0, /* U+00a8bf: */
- 0, /* U+00a8c0: */
- 0, /* U+00a8c1: */
- 0, /* U+00a8c2: */
- 0, /* U+00a8c3: */
- 0, /* U+00a8c4: */
- 0, /* U+00a8c5: */
- 0, /* U+00a8c6: */
- 0, /* U+00a8c7: */
- 0, /* U+00a8c8: */
- 0, /* U+00a8c9: */
- 0, /* U+00a8ca: */
- 0, /* U+00a8cb: */
- 0, /* U+00a8cc: */
- 0, /* U+00a8cd: */
- 0, /* U+00a8ce: */
- 0, /* U+00a8cf: */
- 0, /* U+00a8d0: */
- 0, /* U+00a8d1: */
- 0, /* U+00a8d2: */
- 0, /* U+00a8d3: */
- 0, /* U+00a8d4: */
- 0, /* U+00a8d5: */
- 0, /* U+00a8d6: */
- 0, /* U+00a8d7: */
- 0, /* U+00a8d8: */
- 0, /* U+00a8d9: */
- 0, /* U+00a8da: */
- 0, /* U+00a8db: */
- 0, /* U+00a8dc: */
- 0, /* U+00a8dd: */
- 0, /* U+00a8de: */
- 0, /* U+00a8df: */
- 0, /* U+00a8e0: */
- 0, /* U+00a8e1: */
- 0, /* U+00a8e2: */
- 0, /* U+00a8e3: */
- 0, /* U+00a8e4: */
- 0, /* U+00a8e5: */
- 0, /* U+00a8e6: */
- 0, /* U+00a8e7: */
- 0, /* U+00a8e8: */
- 0, /* U+00a8e9: */
- 0, /* U+00a8ea: */
- 0, /* U+00a8eb: */
- 0, /* U+00a8ec: */
- 0, /* U+00a8ed: */
- 0, /* U+00a8ee: */
- 0, /* U+00a8ef: */
- 0, /* U+00a8f0: */
- 0, /* U+00a8f1: */
- 0, /* U+00a8f2: */
- 0, /* U+00a8f3: */
- 0, /* U+00a8f4: */
- 0, /* U+00a8f5: */
- 0, /* U+00a8f6: */
- 0, /* U+00a8f7: */
- 0, /* U+00a8f8: */
- 0, /* U+00a8f9: */
- 0, /* U+00a8fa: */
- 0, /* U+00a8fb: */
- 0, /* U+00a8fc: */
- 0, /* U+00a8fd: */
- 0, /* U+00a8fe: */
- 0, /* U+00a8ff: */
- 0, /* U+00a900: */
- 0, /* U+00a901: */
- 0, /* U+00a902: */
- 0, /* U+00a903: */
- 0, /* U+00a904: */
- 0, /* U+00a905: */
- 0, /* U+00a906: */
- 0, /* U+00a907: */
- 0, /* U+00a908: */
- 0, /* U+00a909: */
- 0, /* U+00a90a: */
- 0, /* U+00a90b: */
- 0, /* U+00a90c: */
- 0, /* U+00a90d: */
- 0, /* U+00a90e: */
- 0, /* U+00a90f: */
- 0, /* U+00a910: */
- 0, /* U+00a911: */
- 0, /* U+00a912: */
- 0, /* U+00a913: */
- 0, /* U+00a914: */
- 0, /* U+00a915: */
- 0, /* U+00a916: */
- 0, /* U+00a917: */
- 0, /* U+00a918: */
- 0, /* U+00a919: */
- 0, /* U+00a91a: */
- 0, /* U+00a91b: */
- 0, /* U+00a91c: */
- 0, /* U+00a91d: */
- 0, /* U+00a91e: */
- 0, /* U+00a91f: */
- 0, /* U+00a920: */
- 0, /* U+00a921: */
- 0, /* U+00a922: */
- 0, /* U+00a923: */
- 0, /* U+00a924: */
- 0, /* U+00a925: */
- 0, /* U+00a926: */
- 0, /* U+00a927: */
- 0, /* U+00a928: */
- 0, /* U+00a929: */
- 0, /* U+00a92a: */
- 0, /* U+00a92b: */
- 0, /* U+00a92c: */
- 0, /* U+00a92d: */
- 0, /* U+00a92e: */
- 0, /* U+00a92f: */
- 0, /* U+00a930: */
- 0, /* U+00a931: */
- 0, /* U+00a932: */
- 0, /* U+00a933: */
- 0, /* U+00a934: */
- 0, /* U+00a935: */
- 0, /* U+00a936: */
- 0, /* U+00a937: */
- 0, /* U+00a938: */
- 0, /* U+00a939: */
- 0, /* U+00a93a: */
- 0, /* U+00a93b: */
- 0, /* U+00a93c: */
- 0, /* U+00a93d: */
- 0, /* U+00a93e: */
- 0, /* U+00a93f: */
- 0, /* U+00a940: */
- 0, /* U+00a941: */
- 0, /* U+00a942: */
- 0, /* U+00a943: */
- 0, /* U+00a944: */
- 0, /* U+00a945: */
- 0, /* U+00a946: */
- 0, /* U+00a947: */
- 0, /* U+00a948: */
- 0, /* U+00a949: */
- 0, /* U+00a94a: */
- 0, /* U+00a94b: */
- 0, /* U+00a94c: */
- 0, /* U+00a94d: */
- 0, /* U+00a94e: */
- 0, /* U+00a94f: */
- 0, /* U+00a950: */
- 0, /* U+00a951: */
- 0, /* U+00a952: */
- 0, /* U+00a953: */
- 0, /* U+00a954: */
- 0, /* U+00a955: */
- 0, /* U+00a956: */
- 0, /* U+00a957: */
- 0, /* U+00a958: */
- 0, /* U+00a959: */
- 0, /* U+00a95a: */
- 0, /* U+00a95b: */
- 0, /* U+00a95c: */
- 0, /* U+00a95d: */
- 0, /* U+00a95e: */
- 0, /* U+00a95f: */
- 0, /* U+00a960: */
- 0, /* U+00a961: */
- 0, /* U+00a962: */
- 0, /* U+00a963: */
- 0, /* U+00a964: */
- 0, /* U+00a965: */
- 0, /* U+00a966: */
- 0, /* U+00a967: */
- 0, /* U+00a968: */
- 0, /* U+00a969: */
- 0, /* U+00a96a: */
- 0, /* U+00a96b: */
- 0, /* U+00a96c: */
- 0, /* U+00a96d: */
- 0, /* U+00a96e: */
- 0, /* U+00a96f: */
- 0, /* U+00a970: */
- 0, /* U+00a971: */
- 0, /* U+00a972: */
- 0, /* U+00a973: */
- 0, /* U+00a974: */
- 0, /* U+00a975: */
- 0, /* U+00a976: */
- 0, /* U+00a977: */
- 0, /* U+00a978: */
- 0, /* U+00a979: */
- 0, /* U+00a97a: */
- 0, /* U+00a97b: */
- 0, /* U+00a97c: */
- 0, /* U+00a97d: */
- 0, /* U+00a97e: */
- 0, /* U+00a97f: */
- 0, /* U+00a980: */
- 0, /* U+00a981: */
- 0, /* U+00a982: */
- 0, /* U+00a983: */
- 0, /* U+00a984: */
- 0, /* U+00a985: */
- 0, /* U+00a986: */
- 0, /* U+00a987: */
- 0, /* U+00a988: */
- 0, /* U+00a989: */
- 0, /* U+00a98a: */
- 0, /* U+00a98b: */
- 0, /* U+00a98c: */
- 0, /* U+00a98d: */
- 0, /* U+00a98e: */
- 0, /* U+00a98f: */
- 0, /* U+00a990: */
- 0, /* U+00a991: */
- 0, /* U+00a992: */
- 0, /* U+00a993: */
- 0, /* U+00a994: */
- 0, /* U+00a995: */
- 0, /* U+00a996: */
- 0, /* U+00a997: */
- 0, /* U+00a998: */
- 0, /* U+00a999: */
- 0, /* U+00a99a: */
- 0, /* U+00a99b: */
- 0, /* U+00a99c: */
- 0, /* U+00a99d: */
- 0, /* U+00a99e: */
- 0, /* U+00a99f: */
- 0, /* U+00a9a0: */
- 0, /* U+00a9a1: */
- 0, /* U+00a9a2: */
- 0, /* U+00a9a3: */
- 0, /* U+00a9a4: */
- 0, /* U+00a9a5: */
- 0, /* U+00a9a6: */
- 0, /* U+00a9a7: */
- 0, /* U+00a9a8: */
- 0, /* U+00a9a9: */
- 0, /* U+00a9aa: */
- 0, /* U+00a9ab: */
- 0, /* U+00a9ac: */
- 0, /* U+00a9ad: */
- 0, /* U+00a9ae: */
- 0, /* U+00a9af: */
- 0, /* U+00a9b0: */
- 0, /* U+00a9b1: */
- 0, /* U+00a9b2: */
- 0, /* U+00a9b3: */
- 0, /* U+00a9b4: */
- 0, /* U+00a9b5: */
- 0, /* U+00a9b6: */
- 0, /* U+00a9b7: */
- 0, /* U+00a9b8: */
- 0, /* U+00a9b9: */
- 0, /* U+00a9ba: */
- 0, /* U+00a9bb: */
- 0, /* U+00a9bc: */
- 0, /* U+00a9bd: */
- 0, /* U+00a9be: */
- 0, /* U+00a9bf: */
- 0, /* U+00a9c0: */
- 0, /* U+00a9c1: */
- 0, /* U+00a9c2: */
- 0, /* U+00a9c3: */
- 0, /* U+00a9c4: */
- 0, /* U+00a9c5: */
- 0, /* U+00a9c6: */
- 0, /* U+00a9c7: */
- 0, /* U+00a9c8: */
- 0, /* U+00a9c9: */
- 0, /* U+00a9ca: */
- 0, /* U+00a9cb: */
- 0, /* U+00a9cc: */
- 0, /* U+00a9cd: */
- 0, /* U+00a9ce: */
- 0, /* U+00a9cf: */
- 0, /* U+00a9d0: */
- 0, /* U+00a9d1: */
- 0, /* U+00a9d2: */
- 0, /* U+00a9d3: */
- 0, /* U+00a9d4: */
- 0, /* U+00a9d5: */
- 0, /* U+00a9d6: */
- 0, /* U+00a9d7: */
- 0, /* U+00a9d8: */
- 0, /* U+00a9d9: */
- 0, /* U+00a9da: */
- 0, /* U+00a9db: */
- 0, /* U+00a9dc: */
- 0, /* U+00a9dd: */
- 0, /* U+00a9de: */
- 0, /* U+00a9df: */
- 0, /* U+00a9e0: */
- 0, /* U+00a9e1: */
- 0, /* U+00a9e2: */
- 0, /* U+00a9e3: */
- 0, /* U+00a9e4: */
- 0, /* U+00a9e5: */
- 0, /* U+00a9e6: */
- 0, /* U+00a9e7: */
- 0, /* U+00a9e8: */
- 0, /* U+00a9e9: */
- 0, /* U+00a9ea: */
- 0, /* U+00a9eb: */
- 0, /* U+00a9ec: */
- 0, /* U+00a9ed: */
- 0, /* U+00a9ee: */
- 0, /* U+00a9ef: */
- 0, /* U+00a9f0: */
- 0, /* U+00a9f1: */
- 0, /* U+00a9f2: */
- 0, /* U+00a9f3: */
- 0, /* U+00a9f4: */
- 0, /* U+00a9f5: */
- 0, /* U+00a9f6: */
- 0, /* U+00a9f7: */
- 0, /* U+00a9f8: */
- 0, /* U+00a9f9: */
- 0, /* U+00a9fa: */
- 0, /* U+00a9fb: */
- 0, /* U+00a9fc: */
- 0, /* U+00a9fd: */
- 0, /* U+00a9fe: */
- 0, /* U+00a9ff: */
- 0, /* U+00aa00: */
- 0, /* U+00aa01: */
- 0, /* U+00aa02: */
- 0, /* U+00aa03: */
- 0, /* U+00aa04: */
- 0, /* U+00aa05: */
- 0, /* U+00aa06: */
- 0, /* U+00aa07: */
- 0, /* U+00aa08: */
- 0, /* U+00aa09: */
- 0, /* U+00aa0a: */
- 0, /* U+00aa0b: */
- 0, /* U+00aa0c: */
- 0, /* U+00aa0d: */
- 0, /* U+00aa0e: */
- 0, /* U+00aa0f: */
- 0, /* U+00aa10: */
- 0, /* U+00aa11: */
- 0, /* U+00aa12: */
- 0, /* U+00aa13: */
- 0, /* U+00aa14: */
- 0, /* U+00aa15: */
- 0, /* U+00aa16: */
- 0, /* U+00aa17: */
- 0, /* U+00aa18: */
- 0, /* U+00aa19: */
- 0, /* U+00aa1a: */
- 0, /* U+00aa1b: */
- 0, /* U+00aa1c: */
- 0, /* U+00aa1d: */
- 0, /* U+00aa1e: */
- 0, /* U+00aa1f: */
- 0, /* U+00aa20: */
- 0, /* U+00aa21: */
- 0, /* U+00aa22: */
- 0, /* U+00aa23: */
- 0, /* U+00aa24: */
- 0, /* U+00aa25: */
- 0, /* U+00aa26: */
- 0, /* U+00aa27: */
- 0, /* U+00aa28: */
- 0, /* U+00aa29: */
- 0, /* U+00aa2a: */
- 0, /* U+00aa2b: */
- 0, /* U+00aa2c: */
- 0, /* U+00aa2d: */
- 0, /* U+00aa2e: */
- 0, /* U+00aa2f: */
- 0, /* U+00aa30: */
- 0, /* U+00aa31: */
- 0, /* U+00aa32: */
- 0, /* U+00aa33: */
- 0, /* U+00aa34: */
- 0, /* U+00aa35: */
- 0, /* U+00aa36: */
- 0, /* U+00aa37: */
- 0, /* U+00aa38: */
- 0, /* U+00aa39: */
- 0, /* U+00aa3a: */
- 0, /* U+00aa3b: */
- 0, /* U+00aa3c: */
- 0, /* U+00aa3d: */
- 0, /* U+00aa3e: */
- 0, /* U+00aa3f: */
- 0, /* U+00aa40: */
- 0, /* U+00aa41: */
- 0, /* U+00aa42: */
- 0, /* U+00aa43: */
- 0, /* U+00aa44: */
- 0, /* U+00aa45: */
- 0, /* U+00aa46: */
- 0, /* U+00aa47: */
- 0, /* U+00aa48: */
- 0, /* U+00aa49: */
- 0, /* U+00aa4a: */
- 0, /* U+00aa4b: */
- 0, /* U+00aa4c: */
- 0, /* U+00aa4d: */
- 0, /* U+00aa4e: */
- 0, /* U+00aa4f: */
- 0, /* U+00aa50: */
- 0, /* U+00aa51: */
- 0, /* U+00aa52: */
- 0, /* U+00aa53: */
- 0, /* U+00aa54: */
- 0, /* U+00aa55: */
- 0, /* U+00aa56: */
- 0, /* U+00aa57: */
- 0, /* U+00aa58: */
- 0, /* U+00aa59: */
- 0, /* U+00aa5a: */
- 0, /* U+00aa5b: */
- 0, /* U+00aa5c: */
- 0, /* U+00aa5d: */
- 0, /* U+00aa5e: */
- 0, /* U+00aa5f: */
- 0, /* U+00aa60: */
- 0, /* U+00aa61: */
- 0, /* U+00aa62: */
- 0, /* U+00aa63: */
- 0, /* U+00aa64: */
- 0, /* U+00aa65: */
- 0, /* U+00aa66: */
- 0, /* U+00aa67: */
- 0, /* U+00aa68: */
- 0, /* U+00aa69: */
- 0, /* U+00aa6a: */
- 0, /* U+00aa6b: */
- 0, /* U+00aa6c: */
- 0, /* U+00aa6d: */
- 0, /* U+00aa6e: */
- 0, /* U+00aa6f: */
- 0, /* U+00aa70: */
- 0, /* U+00aa71: */
- 0, /* U+00aa72: */
- 0, /* U+00aa73: */
- 0, /* U+00aa74: */
- 0, /* U+00aa75: */
- 0, /* U+00aa76: */
- 0, /* U+00aa77: */
- 0, /* U+00aa78: */
- 0, /* U+00aa79: */
- 0, /* U+00aa7a: */
- 0, /* U+00aa7b: */
- 0, /* U+00aa7c: */
- 0, /* U+00aa7d: */
- 0, /* U+00aa7e: */
- 0, /* U+00aa7f: */
- 0, /* U+00aa80: */
- 0, /* U+00aa81: */
- 0, /* U+00aa82: */
- 0, /* U+00aa83: */
- 0, /* U+00aa84: */
- 0, /* U+00aa85: */
- 0, /* U+00aa86: */
- 0, /* U+00aa87: */
- 0, /* U+00aa88: */
- 0, /* U+00aa89: */
- 0, /* U+00aa8a: */
- 0, /* U+00aa8b: */
- 0, /* U+00aa8c: */
- 0, /* U+00aa8d: */
- 0, /* U+00aa8e: */
- 0, /* U+00aa8f: */
- 0, /* U+00aa90: */
- 0, /* U+00aa91: */
- 0, /* U+00aa92: */
- 0, /* U+00aa93: */
- 0, /* U+00aa94: */
- 0, /* U+00aa95: */
- 0, /* U+00aa96: */
- 0, /* U+00aa97: */
- 0, /* U+00aa98: */
- 0, /* U+00aa99: */
- 0, /* U+00aa9a: */
- 0, /* U+00aa9b: */
- 0, /* U+00aa9c: */
- 0, /* U+00aa9d: */
- 0, /* U+00aa9e: */
- 0, /* U+00aa9f: */
- 0, /* U+00aaa0: */
- 0, /* U+00aaa1: */
- 0, /* U+00aaa2: */
- 0, /* U+00aaa3: */
- 0, /* U+00aaa4: */
- 0, /* U+00aaa5: */
- 0, /* U+00aaa6: */
- 0, /* U+00aaa7: */
- 0, /* U+00aaa8: */
- 0, /* U+00aaa9: */
- 0, /* U+00aaaa: */
- 0, /* U+00aaab: */
- 0, /* U+00aaac: */
- 0, /* U+00aaad: */
- 0, /* U+00aaae: */
- 0, /* U+00aaaf: */
- 0, /* U+00aab0: */
- 0, /* U+00aab1: */
- 0, /* U+00aab2: */
- 0, /* U+00aab3: */
- 0, /* U+00aab4: */
- 0, /* U+00aab5: */
- 0, /* U+00aab6: */
- 0, /* U+00aab7: */
- 0, /* U+00aab8: */
- 0, /* U+00aab9: */
- 0, /* U+00aaba: */
- 0, /* U+00aabb: */
- 0, /* U+00aabc: */
- 0, /* U+00aabd: */
- 0, /* U+00aabe: */
- 0, /* U+00aabf: */
- 0, /* U+00aac0: */
- 0, /* U+00aac1: */
- 0, /* U+00aac2: */
- 0, /* U+00aac3: */
- 0, /* U+00aac4: */
- 0, /* U+00aac5: */
- 0, /* U+00aac6: */
- 0, /* U+00aac7: */
- 0, /* U+00aac8: */
- 0, /* U+00aac9: */
- 0, /* U+00aaca: */
- 0, /* U+00aacb: */
- 0, /* U+00aacc: */
- 0, /* U+00aacd: */
- 0, /* U+00aace: */
- 0, /* U+00aacf: */
- 0, /* U+00aad0: */
- 0, /* U+00aad1: */
- 0, /* U+00aad2: */
- 0, /* U+00aad3: */
- 0, /* U+00aad4: */
- 0, /* U+00aad5: */
- 0, /* U+00aad6: */
- 0, /* U+00aad7: */
- 0, /* U+00aad8: */
- 0, /* U+00aad9: */
- 0, /* U+00aada: */
- 0, /* U+00aadb: */
- 0, /* U+00aadc: */
- 0, /* U+00aadd: */
- 0, /* U+00aade: */
- 0, /* U+00aadf: */
- 0, /* U+00aae0: */
- 0, /* U+00aae1: */
- 0, /* U+00aae2: */
- 0, /* U+00aae3: */
- 0, /* U+00aae4: */
- 0, /* U+00aae5: */
- 0, /* U+00aae6: */
- 0, /* U+00aae7: */
- 0, /* U+00aae8: */
- 0, /* U+00aae9: */
- 0, /* U+00aaea: */
- 0, /* U+00aaeb: */
- 0, /* U+00aaec: */
- 0, /* U+00aaed: */
- 0, /* U+00aaee: */
- 0, /* U+00aaef: */
- 0, /* U+00aaf0: */
- 0, /* U+00aaf1: */
- 0, /* U+00aaf2: */
- 0, /* U+00aaf3: */
- 0, /* U+00aaf4: */
- 0, /* U+00aaf5: */
- 0, /* U+00aaf6: */
- 0, /* U+00aaf7: */
- 0, /* U+00aaf8: */
- 0, /* U+00aaf9: */
- 0, /* U+00aafa: */
- 0, /* U+00aafb: */
- 0, /* U+00aafc: */
- 0, /* U+00aafd: */
- 0, /* U+00aafe: */
- 0, /* U+00aaff: */
- 0, /* U+00ab00: */
- 0, /* U+00ab01: */
- 0, /* U+00ab02: */
- 0, /* U+00ab03: */
- 0, /* U+00ab04: */
- 0, /* U+00ab05: */
- 0, /* U+00ab06: */
- 0, /* U+00ab07: */
- 0, /* U+00ab08: */
- 0, /* U+00ab09: */
- 0, /* U+00ab0a: */
- 0, /* U+00ab0b: */
- 0, /* U+00ab0c: */
- 0, /* U+00ab0d: */
- 0, /* U+00ab0e: */
- 0, /* U+00ab0f: */
- 0, /* U+00ab10: */
- 0, /* U+00ab11: */
- 0, /* U+00ab12: */
- 0, /* U+00ab13: */
- 0, /* U+00ab14: */
- 0, /* U+00ab15: */
- 0, /* U+00ab16: */
- 0, /* U+00ab17: */
- 0, /* U+00ab18: */
- 0, /* U+00ab19: */
- 0, /* U+00ab1a: */
- 0, /* U+00ab1b: */
- 0, /* U+00ab1c: */
- 0, /* U+00ab1d: */
- 0, /* U+00ab1e: */
- 0, /* U+00ab1f: */
- 0, /* U+00ab20: */
- 0, /* U+00ab21: */
- 0, /* U+00ab22: */
- 0, /* U+00ab23: */
- 0, /* U+00ab24: */
- 0, /* U+00ab25: */
- 0, /* U+00ab26: */
- 0, /* U+00ab27: */
- 0, /* U+00ab28: */
- 0, /* U+00ab29: */
- 0, /* U+00ab2a: */
- 0, /* U+00ab2b: */
- 0, /* U+00ab2c: */
- 0, /* U+00ab2d: */
- 0, /* U+00ab2e: */
- 0, /* U+00ab2f: */
- 0, /* U+00ab30: */
- 0, /* U+00ab31: */
- 0, /* U+00ab32: */
- 0, /* U+00ab33: */
- 0, /* U+00ab34: */
- 0, /* U+00ab35: */
- 0, /* U+00ab36: */
- 0, /* U+00ab37: */
- 0, /* U+00ab38: */
- 0, /* U+00ab39: */
- 0, /* U+00ab3a: */
- 0, /* U+00ab3b: */
- 0, /* U+00ab3c: */
- 0, /* U+00ab3d: */
- 0, /* U+00ab3e: */
- 0, /* U+00ab3f: */
- 0, /* U+00ab40: */
- 0, /* U+00ab41: */
- 0, /* U+00ab42: */
- 0, /* U+00ab43: */
- 0, /* U+00ab44: */
- 0, /* U+00ab45: */
- 0, /* U+00ab46: */
- 0, /* U+00ab47: */
- 0, /* U+00ab48: */
- 0, /* U+00ab49: */
- 0, /* U+00ab4a: */
- 0, /* U+00ab4b: */
- 0, /* U+00ab4c: */
- 0, /* U+00ab4d: */
- 0, /* U+00ab4e: */
- 0, /* U+00ab4f: */
- 0, /* U+00ab50: */
- 0, /* U+00ab51: */
- 0, /* U+00ab52: */
- 0, /* U+00ab53: */
- 0, /* U+00ab54: */
- 0, /* U+00ab55: */
- 0, /* U+00ab56: */
- 0, /* U+00ab57: */
- 0, /* U+00ab58: */
- 0, /* U+00ab59: */
- 0, /* U+00ab5a: */
- 0, /* U+00ab5b: */
- 0, /* U+00ab5c: */
- 0, /* U+00ab5d: */
- 0, /* U+00ab5e: */
- 0, /* U+00ab5f: */
- 0, /* U+00ab60: */
- 0, /* U+00ab61: */
- 0, /* U+00ab62: */
- 0, /* U+00ab63: */
- 0, /* U+00ab64: */
- 0, /* U+00ab65: */
- 0, /* U+00ab66: */
- 0, /* U+00ab67: */
- 0, /* U+00ab68: */
- 0, /* U+00ab69: */
- 0, /* U+00ab6a: */
- 0, /* U+00ab6b: */
- 0, /* U+00ab6c: */
- 0, /* U+00ab6d: */
- 0, /* U+00ab6e: */
- 0, /* U+00ab6f: */
- 0, /* U+00ab70: */
- 0, /* U+00ab71: */
- 0, /* U+00ab72: */
- 0, /* U+00ab73: */
- 0, /* U+00ab74: */
- 0, /* U+00ab75: */
- 0, /* U+00ab76: */
- 0, /* U+00ab77: */
- 0, /* U+00ab78: */
- 0, /* U+00ab79: */
- 0, /* U+00ab7a: */
- 0, /* U+00ab7b: */
- 0, /* U+00ab7c: */
- 0, /* U+00ab7d: */
- 0, /* U+00ab7e: */
- 0, /* U+00ab7f: */
- 0, /* U+00ab80: */
- 0, /* U+00ab81: */
- 0, /* U+00ab82: */
- 0, /* U+00ab83: */
- 0, /* U+00ab84: */
- 0, /* U+00ab85: */
- 0, /* U+00ab86: */
- 0, /* U+00ab87: */
- 0, /* U+00ab88: */
- 0, /* U+00ab89: */
- 0, /* U+00ab8a: */
- 0, /* U+00ab8b: */
- 0, /* U+00ab8c: */
- 0, /* U+00ab8d: */
- 0, /* U+00ab8e: */
- 0, /* U+00ab8f: */
- 0, /* U+00ab90: */
- 0, /* U+00ab91: */
- 0, /* U+00ab92: */
- 0, /* U+00ab93: */
- 0, /* U+00ab94: */
- 0, /* U+00ab95: */
- 0, /* U+00ab96: */
- 0, /* U+00ab97: */
- 0, /* U+00ab98: */
- 0, /* U+00ab99: */
- 0, /* U+00ab9a: */
- 0, /* U+00ab9b: */
- 0, /* U+00ab9c: */
- 0, /* U+00ab9d: */
- 0, /* U+00ab9e: */
- 0, /* U+00ab9f: */
- 0, /* U+00aba0: */
- 0, /* U+00aba1: */
- 0, /* U+00aba2: */
- 0, /* U+00aba3: */
- 0, /* U+00aba4: */
- 0, /* U+00aba5: */
- 0, /* U+00aba6: */
- 0, /* U+00aba7: */
- 0, /* U+00aba8: */
- 0, /* U+00aba9: */
- 0, /* U+00abaa: */
- 0, /* U+00abab: */
- 0, /* U+00abac: */
- 0, /* U+00abad: */
- 0, /* U+00abae: */
- 0, /* U+00abaf: */
- 0, /* U+00abb0: */
- 0, /* U+00abb1: */
- 0, /* U+00abb2: */
- 0, /* U+00abb3: */
- 0, /* U+00abb4: */
- 0, /* U+00abb5: */
- 0, /* U+00abb6: */
- 0, /* U+00abb7: */
- 0, /* U+00abb8: */
- 0, /* U+00abb9: */
- 0, /* U+00abba: */
- 0, /* U+00abbb: */
- 0, /* U+00abbc: */
- 0, /* U+00abbd: */
- 0, /* U+00abbe: */
- 0, /* U+00abbf: */
- 0, /* U+00abc0: */
- 0, /* U+00abc1: */
- 0, /* U+00abc2: */
- 0, /* U+00abc3: */
- 0, /* U+00abc4: */
- 0, /* U+00abc5: */
- 0, /* U+00abc6: */
- 0, /* U+00abc7: */
- 0, /* U+00abc8: */
- 0, /* U+00abc9: */
- 0, /* U+00abca: */
- 0, /* U+00abcb: */
- 0, /* U+00abcc: */
- 0, /* U+00abcd: */
- 0, /* U+00abce: */
- 0, /* U+00abcf: */
- 0, /* U+00abd0: */
- 0, /* U+00abd1: */
- 0, /* U+00abd2: */
- 0, /* U+00abd3: */
- 0, /* U+00abd4: */
- 0, /* U+00abd5: */
- 0, /* U+00abd6: */
- 0, /* U+00abd7: */
- 0, /* U+00abd8: */
- 0, /* U+00abd9: */
- 0, /* U+00abda: */
- 0, /* U+00abdb: */
- 0, /* U+00abdc: */
- 0, /* U+00abdd: */
- 0, /* U+00abde: */
- 0, /* U+00abdf: */
- 0, /* U+00abe0: */
- 0, /* U+00abe1: */
- 0, /* U+00abe2: */
- 0, /* U+00abe3: */
- 0, /* U+00abe4: */
- 0, /* U+00abe5: */
- 0, /* U+00abe6: */
- 0, /* U+00abe7: */
- 0, /* U+00abe8: */
- 0, /* U+00abe9: */
- 0, /* U+00abea: */
- 0, /* U+00abeb: */
- 0, /* U+00abec: */
- 0, /* U+00abed: */
- 0, /* U+00abee: */
- 0, /* U+00abef: */
- 0, /* U+00abf0: */
- 0, /* U+00abf1: */
- 0, /* U+00abf2: */
- 0, /* U+00abf3: */
- 0, /* U+00abf4: */
- 0, /* U+00abf5: */
- 0, /* U+00abf6: */
- 0, /* U+00abf7: */
- 0, /* U+00abf8: */
- 0, /* U+00abf9: */
- 0, /* U+00abfa: */
- 0, /* U+00abfb: */
- 0, /* U+00abfc: */
- 0, /* U+00abfd: */
- 0, /* U+00abfe: */
- 0, /* U+00abff: */
- RTUNI_ALPHA, /* U+00ac00: <Hangul Syllable, First>*/
-};
-
-static const uint8_t g_afRTUniFlags0x00d7a3[] =
-{
- RTUNI_ALPHA, /* U+00d7a3: <Hangul Syllable, Last>*/
-};
-
-static const uint8_t g_afRTUniFlags0x00f900[] =
-{
- RTUNI_ALPHA, /* U+00f900: CJK COMPATIBILITY IDEOGRAPH-F900*/
- RTUNI_ALPHA, /* U+00f901: CJK COMPATIBILITY IDEOGRAPH-F901*/
- RTUNI_ALPHA, /* U+00f902: CJK COMPATIBILITY IDEOGRAPH-F902*/
- RTUNI_ALPHA, /* U+00f903: CJK COMPATIBILITY IDEOGRAPH-F903*/
- RTUNI_ALPHA, /* U+00f904: CJK COMPATIBILITY IDEOGRAPH-F904*/
- RTUNI_ALPHA, /* U+00f905: CJK COMPATIBILITY IDEOGRAPH-F905*/
- RTUNI_ALPHA, /* U+00f906: CJK COMPATIBILITY IDEOGRAPH-F906*/
- RTUNI_ALPHA, /* U+00f907: CJK COMPATIBILITY IDEOGRAPH-F907*/
- RTUNI_ALPHA, /* U+00f908: CJK COMPATIBILITY IDEOGRAPH-F908*/
- RTUNI_ALPHA, /* U+00f909: CJK COMPATIBILITY IDEOGRAPH-F909*/
- RTUNI_ALPHA, /* U+00f90a: CJK COMPATIBILITY IDEOGRAPH-F90A*/
- RTUNI_ALPHA, /* U+00f90b: CJK COMPATIBILITY IDEOGRAPH-F90B*/
- RTUNI_ALPHA, /* U+00f90c: CJK COMPATIBILITY IDEOGRAPH-F90C*/
- RTUNI_ALPHA, /* U+00f90d: CJK COMPATIBILITY IDEOGRAPH-F90D*/
- RTUNI_ALPHA, /* U+00f90e: CJK COMPATIBILITY IDEOGRAPH-F90E*/
- RTUNI_ALPHA, /* U+00f90f: CJK COMPATIBILITY IDEOGRAPH-F90F*/
- RTUNI_ALPHA, /* U+00f910: CJK COMPATIBILITY IDEOGRAPH-F910*/
- RTUNI_ALPHA, /* U+00f911: CJK COMPATIBILITY IDEOGRAPH-F911*/
- RTUNI_ALPHA, /* U+00f912: CJK COMPATIBILITY IDEOGRAPH-F912*/
- RTUNI_ALPHA, /* U+00f913: CJK COMPATIBILITY IDEOGRAPH-F913*/
- RTUNI_ALPHA, /* U+00f914: CJK COMPATIBILITY IDEOGRAPH-F914*/
- RTUNI_ALPHA, /* U+00f915: CJK COMPATIBILITY IDEOGRAPH-F915*/
- RTUNI_ALPHA, /* U+00f916: CJK COMPATIBILITY IDEOGRAPH-F916*/
- RTUNI_ALPHA, /* U+00f917: CJK COMPATIBILITY IDEOGRAPH-F917*/
- RTUNI_ALPHA, /* U+00f918: CJK COMPATIBILITY IDEOGRAPH-F918*/
- RTUNI_ALPHA, /* U+00f919: CJK COMPATIBILITY IDEOGRAPH-F919*/
- RTUNI_ALPHA, /* U+00f91a: CJK COMPATIBILITY IDEOGRAPH-F91A*/
- RTUNI_ALPHA, /* U+00f91b: CJK COMPATIBILITY IDEOGRAPH-F91B*/
- RTUNI_ALPHA, /* U+00f91c: CJK COMPATIBILITY IDEOGRAPH-F91C*/
- RTUNI_ALPHA, /* U+00f91d: CJK COMPATIBILITY IDEOGRAPH-F91D*/
- RTUNI_ALPHA, /* U+00f91e: CJK COMPATIBILITY IDEOGRAPH-F91E*/
- RTUNI_ALPHA, /* U+00f91f: CJK COMPATIBILITY IDEOGRAPH-F91F*/
- RTUNI_ALPHA, /* U+00f920: CJK COMPATIBILITY IDEOGRAPH-F920*/
- RTUNI_ALPHA, /* U+00f921: CJK COMPATIBILITY IDEOGRAPH-F921*/
- RTUNI_ALPHA, /* U+00f922: CJK COMPATIBILITY IDEOGRAPH-F922*/
- RTUNI_ALPHA, /* U+00f923: CJK COMPATIBILITY IDEOGRAPH-F923*/
- RTUNI_ALPHA, /* U+00f924: CJK COMPATIBILITY IDEOGRAPH-F924*/
- RTUNI_ALPHA, /* U+00f925: CJK COMPATIBILITY IDEOGRAPH-F925*/
- RTUNI_ALPHA, /* U+00f926: CJK COMPATIBILITY IDEOGRAPH-F926*/
- RTUNI_ALPHA, /* U+00f927: CJK COMPATIBILITY IDEOGRAPH-F927*/
- RTUNI_ALPHA, /* U+00f928: CJK COMPATIBILITY IDEOGRAPH-F928*/
- RTUNI_ALPHA, /* U+00f929: CJK COMPATIBILITY IDEOGRAPH-F929*/
- RTUNI_ALPHA, /* U+00f92a: CJK COMPATIBILITY IDEOGRAPH-F92A*/
- RTUNI_ALPHA, /* U+00f92b: CJK COMPATIBILITY IDEOGRAPH-F92B*/
- RTUNI_ALPHA, /* U+00f92c: CJK COMPATIBILITY IDEOGRAPH-F92C*/
- RTUNI_ALPHA, /* U+00f92d: CJK COMPATIBILITY IDEOGRAPH-F92D*/
- RTUNI_ALPHA, /* U+00f92e: CJK COMPATIBILITY IDEOGRAPH-F92E*/
- RTUNI_ALPHA, /* U+00f92f: CJK COMPATIBILITY IDEOGRAPH-F92F*/
- RTUNI_ALPHA, /* U+00f930: CJK COMPATIBILITY IDEOGRAPH-F930*/
- RTUNI_ALPHA, /* U+00f931: CJK COMPATIBILITY IDEOGRAPH-F931*/
- RTUNI_ALPHA, /* U+00f932: CJK COMPATIBILITY IDEOGRAPH-F932*/
- RTUNI_ALPHA, /* U+00f933: CJK COMPATIBILITY IDEOGRAPH-F933*/
- RTUNI_ALPHA, /* U+00f934: CJK COMPATIBILITY IDEOGRAPH-F934*/
- RTUNI_ALPHA, /* U+00f935: CJK COMPATIBILITY IDEOGRAPH-F935*/
- RTUNI_ALPHA, /* U+00f936: CJK COMPATIBILITY IDEOGRAPH-F936*/
- RTUNI_ALPHA, /* U+00f937: CJK COMPATIBILITY IDEOGRAPH-F937*/
- RTUNI_ALPHA, /* U+00f938: CJK COMPATIBILITY IDEOGRAPH-F938*/
- RTUNI_ALPHA, /* U+00f939: CJK COMPATIBILITY IDEOGRAPH-F939*/
- RTUNI_ALPHA, /* U+00f93a: CJK COMPATIBILITY IDEOGRAPH-F93A*/
- RTUNI_ALPHA, /* U+00f93b: CJK COMPATIBILITY IDEOGRAPH-F93B*/
- RTUNI_ALPHA, /* U+00f93c: CJK COMPATIBILITY IDEOGRAPH-F93C*/
- RTUNI_ALPHA, /* U+00f93d: CJK COMPATIBILITY IDEOGRAPH-F93D*/
- RTUNI_ALPHA, /* U+00f93e: CJK COMPATIBILITY IDEOGRAPH-F93E*/
- RTUNI_ALPHA, /* U+00f93f: CJK COMPATIBILITY IDEOGRAPH-F93F*/
- RTUNI_ALPHA, /* U+00f940: CJK COMPATIBILITY IDEOGRAPH-F940*/
- RTUNI_ALPHA, /* U+00f941: CJK COMPATIBILITY IDEOGRAPH-F941*/
- RTUNI_ALPHA, /* U+00f942: CJK COMPATIBILITY IDEOGRAPH-F942*/
- RTUNI_ALPHA, /* U+00f943: CJK COMPATIBILITY IDEOGRAPH-F943*/
- RTUNI_ALPHA, /* U+00f944: CJK COMPATIBILITY IDEOGRAPH-F944*/
- RTUNI_ALPHA, /* U+00f945: CJK COMPATIBILITY IDEOGRAPH-F945*/
- RTUNI_ALPHA, /* U+00f946: CJK COMPATIBILITY IDEOGRAPH-F946*/
- RTUNI_ALPHA, /* U+00f947: CJK COMPATIBILITY IDEOGRAPH-F947*/
- RTUNI_ALPHA, /* U+00f948: CJK COMPATIBILITY IDEOGRAPH-F948*/
- RTUNI_ALPHA, /* U+00f949: CJK COMPATIBILITY IDEOGRAPH-F949*/
- RTUNI_ALPHA, /* U+00f94a: CJK COMPATIBILITY IDEOGRAPH-F94A*/
- RTUNI_ALPHA, /* U+00f94b: CJK COMPATIBILITY IDEOGRAPH-F94B*/
- RTUNI_ALPHA, /* U+00f94c: CJK COMPATIBILITY IDEOGRAPH-F94C*/
- RTUNI_ALPHA, /* U+00f94d: CJK COMPATIBILITY IDEOGRAPH-F94D*/
- RTUNI_ALPHA, /* U+00f94e: CJK COMPATIBILITY IDEOGRAPH-F94E*/
- RTUNI_ALPHA, /* U+00f94f: CJK COMPATIBILITY IDEOGRAPH-F94F*/
- RTUNI_ALPHA, /* U+00f950: CJK COMPATIBILITY IDEOGRAPH-F950*/
- RTUNI_ALPHA, /* U+00f951: CJK COMPATIBILITY IDEOGRAPH-F951*/
- RTUNI_ALPHA, /* U+00f952: CJK COMPATIBILITY IDEOGRAPH-F952*/
- RTUNI_ALPHA, /* U+00f953: CJK COMPATIBILITY IDEOGRAPH-F953*/
- RTUNI_ALPHA, /* U+00f954: CJK COMPATIBILITY IDEOGRAPH-F954*/
- RTUNI_ALPHA, /* U+00f955: CJK COMPATIBILITY IDEOGRAPH-F955*/
- RTUNI_ALPHA, /* U+00f956: CJK COMPATIBILITY IDEOGRAPH-F956*/
- RTUNI_ALPHA, /* U+00f957: CJK COMPATIBILITY IDEOGRAPH-F957*/
- RTUNI_ALPHA, /* U+00f958: CJK COMPATIBILITY IDEOGRAPH-F958*/
- RTUNI_ALPHA, /* U+00f959: CJK COMPATIBILITY IDEOGRAPH-F959*/
- RTUNI_ALPHA, /* U+00f95a: CJK COMPATIBILITY IDEOGRAPH-F95A*/
- RTUNI_ALPHA, /* U+00f95b: CJK COMPATIBILITY IDEOGRAPH-F95B*/
- RTUNI_ALPHA, /* U+00f95c: CJK COMPATIBILITY IDEOGRAPH-F95C*/
- RTUNI_ALPHA, /* U+00f95d: CJK COMPATIBILITY IDEOGRAPH-F95D*/
- RTUNI_ALPHA, /* U+00f95e: CJK COMPATIBILITY IDEOGRAPH-F95E*/
- RTUNI_ALPHA, /* U+00f95f: CJK COMPATIBILITY IDEOGRAPH-F95F*/
- RTUNI_ALPHA, /* U+00f960: CJK COMPATIBILITY IDEOGRAPH-F960*/
- RTUNI_ALPHA, /* U+00f961: CJK COMPATIBILITY IDEOGRAPH-F961*/
- RTUNI_ALPHA, /* U+00f962: CJK COMPATIBILITY IDEOGRAPH-F962*/
- RTUNI_ALPHA, /* U+00f963: CJK COMPATIBILITY IDEOGRAPH-F963*/
- RTUNI_ALPHA, /* U+00f964: CJK COMPATIBILITY IDEOGRAPH-F964*/
- RTUNI_ALPHA, /* U+00f965: CJK COMPATIBILITY IDEOGRAPH-F965*/
- RTUNI_ALPHA, /* U+00f966: CJK COMPATIBILITY IDEOGRAPH-F966*/
- RTUNI_ALPHA, /* U+00f967: CJK COMPATIBILITY IDEOGRAPH-F967*/
- RTUNI_ALPHA, /* U+00f968: CJK COMPATIBILITY IDEOGRAPH-F968*/
- RTUNI_ALPHA, /* U+00f969: CJK COMPATIBILITY IDEOGRAPH-F969*/
- RTUNI_ALPHA, /* U+00f96a: CJK COMPATIBILITY IDEOGRAPH-F96A*/
- RTUNI_ALPHA, /* U+00f96b: CJK COMPATIBILITY IDEOGRAPH-F96B*/
- RTUNI_ALPHA, /* U+00f96c: CJK COMPATIBILITY IDEOGRAPH-F96C*/
- RTUNI_ALPHA, /* U+00f96d: CJK COMPATIBILITY IDEOGRAPH-F96D*/
- RTUNI_ALPHA, /* U+00f96e: CJK COMPATIBILITY IDEOGRAPH-F96E*/
- RTUNI_ALPHA, /* U+00f96f: CJK COMPATIBILITY IDEOGRAPH-F96F*/
- RTUNI_ALPHA, /* U+00f970: CJK COMPATIBILITY IDEOGRAPH-F970*/
- RTUNI_ALPHA, /* U+00f971: CJK COMPATIBILITY IDEOGRAPH-F971*/
- RTUNI_ALPHA, /* U+00f972: CJK COMPATIBILITY IDEOGRAPH-F972*/
- RTUNI_ALPHA, /* U+00f973: CJK COMPATIBILITY IDEOGRAPH-F973*/
- RTUNI_ALPHA, /* U+00f974: CJK COMPATIBILITY IDEOGRAPH-F974*/
- RTUNI_ALPHA, /* U+00f975: CJK COMPATIBILITY IDEOGRAPH-F975*/
- RTUNI_ALPHA, /* U+00f976: CJK COMPATIBILITY IDEOGRAPH-F976*/
- RTUNI_ALPHA, /* U+00f977: CJK COMPATIBILITY IDEOGRAPH-F977*/
- RTUNI_ALPHA, /* U+00f978: CJK COMPATIBILITY IDEOGRAPH-F978*/
- RTUNI_ALPHA, /* U+00f979: CJK COMPATIBILITY IDEOGRAPH-F979*/
- RTUNI_ALPHA, /* U+00f97a: CJK COMPATIBILITY IDEOGRAPH-F97A*/
- RTUNI_ALPHA, /* U+00f97b: CJK COMPATIBILITY IDEOGRAPH-F97B*/
- RTUNI_ALPHA, /* U+00f97c: CJK COMPATIBILITY IDEOGRAPH-F97C*/
- RTUNI_ALPHA, /* U+00f97d: CJK COMPATIBILITY IDEOGRAPH-F97D*/
- RTUNI_ALPHA, /* U+00f97e: CJK COMPATIBILITY IDEOGRAPH-F97E*/
- RTUNI_ALPHA, /* U+00f97f: CJK COMPATIBILITY IDEOGRAPH-F97F*/
- RTUNI_ALPHA, /* U+00f980: CJK COMPATIBILITY IDEOGRAPH-F980*/
- RTUNI_ALPHA, /* U+00f981: CJK COMPATIBILITY IDEOGRAPH-F981*/
- RTUNI_ALPHA, /* U+00f982: CJK COMPATIBILITY IDEOGRAPH-F982*/
- RTUNI_ALPHA, /* U+00f983: CJK COMPATIBILITY IDEOGRAPH-F983*/
- RTUNI_ALPHA, /* U+00f984: CJK COMPATIBILITY IDEOGRAPH-F984*/
- RTUNI_ALPHA, /* U+00f985: CJK COMPATIBILITY IDEOGRAPH-F985*/
- RTUNI_ALPHA, /* U+00f986: CJK COMPATIBILITY IDEOGRAPH-F986*/
- RTUNI_ALPHA, /* U+00f987: CJK COMPATIBILITY IDEOGRAPH-F987*/
- RTUNI_ALPHA, /* U+00f988: CJK COMPATIBILITY IDEOGRAPH-F988*/
- RTUNI_ALPHA, /* U+00f989: CJK COMPATIBILITY IDEOGRAPH-F989*/
- RTUNI_ALPHA, /* U+00f98a: CJK COMPATIBILITY IDEOGRAPH-F98A*/
- RTUNI_ALPHA, /* U+00f98b: CJK COMPATIBILITY IDEOGRAPH-F98B*/
- RTUNI_ALPHA, /* U+00f98c: CJK COMPATIBILITY IDEOGRAPH-F98C*/
- RTUNI_ALPHA, /* U+00f98d: CJK COMPATIBILITY IDEOGRAPH-F98D*/
- RTUNI_ALPHA, /* U+00f98e: CJK COMPATIBILITY IDEOGRAPH-F98E*/
- RTUNI_ALPHA, /* U+00f98f: CJK COMPATIBILITY IDEOGRAPH-F98F*/
- RTUNI_ALPHA, /* U+00f990: CJK COMPATIBILITY IDEOGRAPH-F990*/
- RTUNI_ALPHA, /* U+00f991: CJK COMPATIBILITY IDEOGRAPH-F991*/
- RTUNI_ALPHA, /* U+00f992: CJK COMPATIBILITY IDEOGRAPH-F992*/
- RTUNI_ALPHA, /* U+00f993: CJK COMPATIBILITY IDEOGRAPH-F993*/
- RTUNI_ALPHA, /* U+00f994: CJK COMPATIBILITY IDEOGRAPH-F994*/
- RTUNI_ALPHA, /* U+00f995: CJK COMPATIBILITY IDEOGRAPH-F995*/
- RTUNI_ALPHA, /* U+00f996: CJK COMPATIBILITY IDEOGRAPH-F996*/
- RTUNI_ALPHA, /* U+00f997: CJK COMPATIBILITY IDEOGRAPH-F997*/
- RTUNI_ALPHA, /* U+00f998: CJK COMPATIBILITY IDEOGRAPH-F998*/
- RTUNI_ALPHA, /* U+00f999: CJK COMPATIBILITY IDEOGRAPH-F999*/
- RTUNI_ALPHA, /* U+00f99a: CJK COMPATIBILITY IDEOGRAPH-F99A*/
- RTUNI_ALPHA, /* U+00f99b: CJK COMPATIBILITY IDEOGRAPH-F99B*/
- RTUNI_ALPHA, /* U+00f99c: CJK COMPATIBILITY IDEOGRAPH-F99C*/
- RTUNI_ALPHA, /* U+00f99d: CJK COMPATIBILITY IDEOGRAPH-F99D*/
- RTUNI_ALPHA, /* U+00f99e: CJK COMPATIBILITY IDEOGRAPH-F99E*/
- RTUNI_ALPHA, /* U+00f99f: CJK COMPATIBILITY IDEOGRAPH-F99F*/
- RTUNI_ALPHA, /* U+00f9a0: CJK COMPATIBILITY IDEOGRAPH-F9A0*/
- RTUNI_ALPHA, /* U+00f9a1: CJK COMPATIBILITY IDEOGRAPH-F9A1*/
- RTUNI_ALPHA, /* U+00f9a2: CJK COMPATIBILITY IDEOGRAPH-F9A2*/
- RTUNI_ALPHA, /* U+00f9a3: CJK COMPATIBILITY IDEOGRAPH-F9A3*/
- RTUNI_ALPHA, /* U+00f9a4: CJK COMPATIBILITY IDEOGRAPH-F9A4*/
- RTUNI_ALPHA, /* U+00f9a5: CJK COMPATIBILITY IDEOGRAPH-F9A5*/
- RTUNI_ALPHA, /* U+00f9a6: CJK COMPATIBILITY IDEOGRAPH-F9A6*/
- RTUNI_ALPHA, /* U+00f9a7: CJK COMPATIBILITY IDEOGRAPH-F9A7*/
- RTUNI_ALPHA, /* U+00f9a8: CJK COMPATIBILITY IDEOGRAPH-F9A8*/
- RTUNI_ALPHA, /* U+00f9a9: CJK COMPATIBILITY IDEOGRAPH-F9A9*/
- RTUNI_ALPHA, /* U+00f9aa: CJK COMPATIBILITY IDEOGRAPH-F9AA*/
- RTUNI_ALPHA, /* U+00f9ab: CJK COMPATIBILITY IDEOGRAPH-F9AB*/
- RTUNI_ALPHA, /* U+00f9ac: CJK COMPATIBILITY IDEOGRAPH-F9AC*/
- RTUNI_ALPHA, /* U+00f9ad: CJK COMPATIBILITY IDEOGRAPH-F9AD*/
- RTUNI_ALPHA, /* U+00f9ae: CJK COMPATIBILITY IDEOGRAPH-F9AE*/
- RTUNI_ALPHA, /* U+00f9af: CJK COMPATIBILITY IDEOGRAPH-F9AF*/
- RTUNI_ALPHA, /* U+00f9b0: CJK COMPATIBILITY IDEOGRAPH-F9B0*/
- RTUNI_ALPHA, /* U+00f9b1: CJK COMPATIBILITY IDEOGRAPH-F9B1*/
- RTUNI_ALPHA, /* U+00f9b2: CJK COMPATIBILITY IDEOGRAPH-F9B2*/
- RTUNI_ALPHA, /* U+00f9b3: CJK COMPATIBILITY IDEOGRAPH-F9B3*/
- RTUNI_ALPHA, /* U+00f9b4: CJK COMPATIBILITY IDEOGRAPH-F9B4*/
- RTUNI_ALPHA, /* U+00f9b5: CJK COMPATIBILITY IDEOGRAPH-F9B5*/
- RTUNI_ALPHA, /* U+00f9b6: CJK COMPATIBILITY IDEOGRAPH-F9B6*/
- RTUNI_ALPHA, /* U+00f9b7: CJK COMPATIBILITY IDEOGRAPH-F9B7*/
- RTUNI_ALPHA, /* U+00f9b8: CJK COMPATIBILITY IDEOGRAPH-F9B8*/
- RTUNI_ALPHA, /* U+00f9b9: CJK COMPATIBILITY IDEOGRAPH-F9B9*/
- RTUNI_ALPHA, /* U+00f9ba: CJK COMPATIBILITY IDEOGRAPH-F9BA*/
- RTUNI_ALPHA, /* U+00f9bb: CJK COMPATIBILITY IDEOGRAPH-F9BB*/
- RTUNI_ALPHA, /* U+00f9bc: CJK COMPATIBILITY IDEOGRAPH-F9BC*/
- RTUNI_ALPHA, /* U+00f9bd: CJK COMPATIBILITY IDEOGRAPH-F9BD*/
- RTUNI_ALPHA, /* U+00f9be: CJK COMPATIBILITY IDEOGRAPH-F9BE*/
- RTUNI_ALPHA, /* U+00f9bf: CJK COMPATIBILITY IDEOGRAPH-F9BF*/
- RTUNI_ALPHA, /* U+00f9c0: CJK COMPATIBILITY IDEOGRAPH-F9C0*/
- RTUNI_ALPHA, /* U+00f9c1: CJK COMPATIBILITY IDEOGRAPH-F9C1*/
- RTUNI_ALPHA, /* U+00f9c2: CJK COMPATIBILITY IDEOGRAPH-F9C2*/
- RTUNI_ALPHA, /* U+00f9c3: CJK COMPATIBILITY IDEOGRAPH-F9C3*/
- RTUNI_ALPHA, /* U+00f9c4: CJK COMPATIBILITY IDEOGRAPH-F9C4*/
- RTUNI_ALPHA, /* U+00f9c5: CJK COMPATIBILITY IDEOGRAPH-F9C5*/
- RTUNI_ALPHA, /* U+00f9c6: CJK COMPATIBILITY IDEOGRAPH-F9C6*/
- RTUNI_ALPHA, /* U+00f9c7: CJK COMPATIBILITY IDEOGRAPH-F9C7*/
- RTUNI_ALPHA, /* U+00f9c8: CJK COMPATIBILITY IDEOGRAPH-F9C8*/
- RTUNI_ALPHA, /* U+00f9c9: CJK COMPATIBILITY IDEOGRAPH-F9C9*/
- RTUNI_ALPHA, /* U+00f9ca: CJK COMPATIBILITY IDEOGRAPH-F9CA*/
- RTUNI_ALPHA, /* U+00f9cb: CJK COMPATIBILITY IDEOGRAPH-F9CB*/
- RTUNI_ALPHA, /* U+00f9cc: CJK COMPATIBILITY IDEOGRAPH-F9CC*/
- RTUNI_ALPHA, /* U+00f9cd: CJK COMPATIBILITY IDEOGRAPH-F9CD*/
- RTUNI_ALPHA, /* U+00f9ce: CJK COMPATIBILITY IDEOGRAPH-F9CE*/
- RTUNI_ALPHA, /* U+00f9cf: CJK COMPATIBILITY IDEOGRAPH-F9CF*/
- RTUNI_ALPHA, /* U+00f9d0: CJK COMPATIBILITY IDEOGRAPH-F9D0*/
- RTUNI_ALPHA, /* U+00f9d1: CJK COMPATIBILITY IDEOGRAPH-F9D1*/
- RTUNI_ALPHA, /* U+00f9d2: CJK COMPATIBILITY IDEOGRAPH-F9D2*/
- RTUNI_ALPHA, /* U+00f9d3: CJK COMPATIBILITY IDEOGRAPH-F9D3*/
- RTUNI_ALPHA, /* U+00f9d4: CJK COMPATIBILITY IDEOGRAPH-F9D4*/
- RTUNI_ALPHA, /* U+00f9d5: CJK COMPATIBILITY IDEOGRAPH-F9D5*/
- RTUNI_ALPHA, /* U+00f9d6: CJK COMPATIBILITY IDEOGRAPH-F9D6*/
- RTUNI_ALPHA, /* U+00f9d7: CJK COMPATIBILITY IDEOGRAPH-F9D7*/
- RTUNI_ALPHA, /* U+00f9d8: CJK COMPATIBILITY IDEOGRAPH-F9D8*/
- RTUNI_ALPHA, /* U+00f9d9: CJK COMPATIBILITY IDEOGRAPH-F9D9*/
- RTUNI_ALPHA, /* U+00f9da: CJK COMPATIBILITY IDEOGRAPH-F9DA*/
- RTUNI_ALPHA, /* U+00f9db: CJK COMPATIBILITY IDEOGRAPH-F9DB*/
- RTUNI_ALPHA, /* U+00f9dc: CJK COMPATIBILITY IDEOGRAPH-F9DC*/
- RTUNI_ALPHA, /* U+00f9dd: CJK COMPATIBILITY IDEOGRAPH-F9DD*/
- RTUNI_ALPHA, /* U+00f9de: CJK COMPATIBILITY IDEOGRAPH-F9DE*/
- RTUNI_ALPHA, /* U+00f9df: CJK COMPATIBILITY IDEOGRAPH-F9DF*/
- RTUNI_ALPHA, /* U+00f9e0: CJK COMPATIBILITY IDEOGRAPH-F9E0*/
- RTUNI_ALPHA, /* U+00f9e1: CJK COMPATIBILITY IDEOGRAPH-F9E1*/
- RTUNI_ALPHA, /* U+00f9e2: CJK COMPATIBILITY IDEOGRAPH-F9E2*/
- RTUNI_ALPHA, /* U+00f9e3: CJK COMPATIBILITY IDEOGRAPH-F9E3*/
- RTUNI_ALPHA, /* U+00f9e4: CJK COMPATIBILITY IDEOGRAPH-F9E4*/
- RTUNI_ALPHA, /* U+00f9e5: CJK COMPATIBILITY IDEOGRAPH-F9E5*/
- RTUNI_ALPHA, /* U+00f9e6: CJK COMPATIBILITY IDEOGRAPH-F9E6*/
- RTUNI_ALPHA, /* U+00f9e7: CJK COMPATIBILITY IDEOGRAPH-F9E7*/
- RTUNI_ALPHA, /* U+00f9e8: CJK COMPATIBILITY IDEOGRAPH-F9E8*/
- RTUNI_ALPHA, /* U+00f9e9: CJK COMPATIBILITY IDEOGRAPH-F9E9*/
- RTUNI_ALPHA, /* U+00f9ea: CJK COMPATIBILITY IDEOGRAPH-F9EA*/
- RTUNI_ALPHA, /* U+00f9eb: CJK COMPATIBILITY IDEOGRAPH-F9EB*/
- RTUNI_ALPHA, /* U+00f9ec: CJK COMPATIBILITY IDEOGRAPH-F9EC*/
- RTUNI_ALPHA, /* U+00f9ed: CJK COMPATIBILITY IDEOGRAPH-F9ED*/
- RTUNI_ALPHA, /* U+00f9ee: CJK COMPATIBILITY IDEOGRAPH-F9EE*/
- RTUNI_ALPHA, /* U+00f9ef: CJK COMPATIBILITY IDEOGRAPH-F9EF*/
- RTUNI_ALPHA, /* U+00f9f0: CJK COMPATIBILITY IDEOGRAPH-F9F0*/
- RTUNI_ALPHA, /* U+00f9f1: CJK COMPATIBILITY IDEOGRAPH-F9F1*/
- RTUNI_ALPHA, /* U+00f9f2: CJK COMPATIBILITY IDEOGRAPH-F9F2*/
- RTUNI_ALPHA, /* U+00f9f3: CJK COMPATIBILITY IDEOGRAPH-F9F3*/
- RTUNI_ALPHA, /* U+00f9f4: CJK COMPATIBILITY IDEOGRAPH-F9F4*/
- RTUNI_ALPHA, /* U+00f9f5: CJK COMPATIBILITY IDEOGRAPH-F9F5*/
- RTUNI_ALPHA, /* U+00f9f6: CJK COMPATIBILITY IDEOGRAPH-F9F6*/
- RTUNI_ALPHA, /* U+00f9f7: CJK COMPATIBILITY IDEOGRAPH-F9F7*/
- RTUNI_ALPHA, /* U+00f9f8: CJK COMPATIBILITY IDEOGRAPH-F9F8*/
- RTUNI_ALPHA, /* U+00f9f9: CJK COMPATIBILITY IDEOGRAPH-F9F9*/
- RTUNI_ALPHA, /* U+00f9fa: CJK COMPATIBILITY IDEOGRAPH-F9FA*/
- RTUNI_ALPHA, /* U+00f9fb: CJK COMPATIBILITY IDEOGRAPH-F9FB*/
- RTUNI_ALPHA, /* U+00f9fc: CJK COMPATIBILITY IDEOGRAPH-F9FC*/
- RTUNI_ALPHA, /* U+00f9fd: CJK COMPATIBILITY IDEOGRAPH-F9FD*/
- RTUNI_ALPHA, /* U+00f9fe: CJK COMPATIBILITY IDEOGRAPH-F9FE*/
- RTUNI_ALPHA, /* U+00f9ff: CJK COMPATIBILITY IDEOGRAPH-F9FF*/
- RTUNI_ALPHA, /* U+00fa00: CJK COMPATIBILITY IDEOGRAPH-FA00*/
- RTUNI_ALPHA, /* U+00fa01: CJK COMPATIBILITY IDEOGRAPH-FA01*/
- RTUNI_ALPHA, /* U+00fa02: CJK COMPATIBILITY IDEOGRAPH-FA02*/
- RTUNI_ALPHA, /* U+00fa03: CJK COMPATIBILITY IDEOGRAPH-FA03*/
- RTUNI_ALPHA, /* U+00fa04: CJK COMPATIBILITY IDEOGRAPH-FA04*/
- RTUNI_ALPHA, /* U+00fa05: CJK COMPATIBILITY IDEOGRAPH-FA05*/
- RTUNI_ALPHA, /* U+00fa06: CJK COMPATIBILITY IDEOGRAPH-FA06*/
- RTUNI_ALPHA, /* U+00fa07: CJK COMPATIBILITY IDEOGRAPH-FA07*/
- RTUNI_ALPHA, /* U+00fa08: CJK COMPATIBILITY IDEOGRAPH-FA08*/
- RTUNI_ALPHA, /* U+00fa09: CJK COMPATIBILITY IDEOGRAPH-FA09*/
- RTUNI_ALPHA, /* U+00fa0a: CJK COMPATIBILITY IDEOGRAPH-FA0A*/
- RTUNI_ALPHA, /* U+00fa0b: CJK COMPATIBILITY IDEOGRAPH-FA0B*/
- RTUNI_ALPHA, /* U+00fa0c: CJK COMPATIBILITY IDEOGRAPH-FA0C*/
- RTUNI_ALPHA, /* U+00fa0d: CJK COMPATIBILITY IDEOGRAPH-FA0D*/
- RTUNI_ALPHA, /* U+00fa0e: CJK COMPATIBILITY IDEOGRAPH-FA0E*/
- RTUNI_ALPHA, /* U+00fa0f: CJK COMPATIBILITY IDEOGRAPH-FA0F*/
- RTUNI_ALPHA, /* U+00fa10: CJK COMPATIBILITY IDEOGRAPH-FA10*/
- RTUNI_ALPHA, /* U+00fa11: CJK COMPATIBILITY IDEOGRAPH-FA11*/
- RTUNI_ALPHA, /* U+00fa12: CJK COMPATIBILITY IDEOGRAPH-FA12*/
- RTUNI_ALPHA, /* U+00fa13: CJK COMPATIBILITY IDEOGRAPH-FA13*/
- RTUNI_ALPHA, /* U+00fa14: CJK COMPATIBILITY IDEOGRAPH-FA14*/
- RTUNI_ALPHA, /* U+00fa15: CJK COMPATIBILITY IDEOGRAPH-FA15*/
- RTUNI_ALPHA, /* U+00fa16: CJK COMPATIBILITY IDEOGRAPH-FA16*/
- RTUNI_ALPHA, /* U+00fa17: CJK COMPATIBILITY IDEOGRAPH-FA17*/
- RTUNI_ALPHA, /* U+00fa18: CJK COMPATIBILITY IDEOGRAPH-FA18*/
- RTUNI_ALPHA, /* U+00fa19: CJK COMPATIBILITY IDEOGRAPH-FA19*/
- RTUNI_ALPHA, /* U+00fa1a: CJK COMPATIBILITY IDEOGRAPH-FA1A*/
- RTUNI_ALPHA, /* U+00fa1b: CJK COMPATIBILITY IDEOGRAPH-FA1B*/
- RTUNI_ALPHA, /* U+00fa1c: CJK COMPATIBILITY IDEOGRAPH-FA1C*/
- RTUNI_ALPHA, /* U+00fa1d: CJK COMPATIBILITY IDEOGRAPH-FA1D*/
- RTUNI_ALPHA, /* U+00fa1e: CJK COMPATIBILITY IDEOGRAPH-FA1E*/
- RTUNI_ALPHA, /* U+00fa1f: CJK COMPATIBILITY IDEOGRAPH-FA1F*/
- RTUNI_ALPHA, /* U+00fa20: CJK COMPATIBILITY IDEOGRAPH-FA20*/
- RTUNI_ALPHA, /* U+00fa21: CJK COMPATIBILITY IDEOGRAPH-FA21*/
- RTUNI_ALPHA, /* U+00fa22: CJK COMPATIBILITY IDEOGRAPH-FA22*/
- RTUNI_ALPHA, /* U+00fa23: CJK COMPATIBILITY IDEOGRAPH-FA23*/
- RTUNI_ALPHA, /* U+00fa24: CJK COMPATIBILITY IDEOGRAPH-FA24*/
- RTUNI_ALPHA, /* U+00fa25: CJK COMPATIBILITY IDEOGRAPH-FA25*/
- RTUNI_ALPHA, /* U+00fa26: CJK COMPATIBILITY IDEOGRAPH-FA26*/
- RTUNI_ALPHA, /* U+00fa27: CJK COMPATIBILITY IDEOGRAPH-FA27*/
- RTUNI_ALPHA, /* U+00fa28: CJK COMPATIBILITY IDEOGRAPH-FA28*/
- RTUNI_ALPHA, /* U+00fa29: CJK COMPATIBILITY IDEOGRAPH-FA29*/
- RTUNI_ALPHA, /* U+00fa2a: CJK COMPATIBILITY IDEOGRAPH-FA2A*/
- RTUNI_ALPHA, /* U+00fa2b: CJK COMPATIBILITY IDEOGRAPH-FA2B*/
- RTUNI_ALPHA, /* U+00fa2c: CJK COMPATIBILITY IDEOGRAPH-FA2C*/
- RTUNI_ALPHA, /* U+00fa2d: CJK COMPATIBILITY IDEOGRAPH-FA2D*/
- 0, /* U+00fa2e: */
- 0, /* U+00fa2f: */
- RTUNI_ALPHA, /* U+00fa30: CJK COMPATIBILITY IDEOGRAPH-FA30*/
- RTUNI_ALPHA, /* U+00fa31: CJK COMPATIBILITY IDEOGRAPH-FA31*/
- RTUNI_ALPHA, /* U+00fa32: CJK COMPATIBILITY IDEOGRAPH-FA32*/
- RTUNI_ALPHA, /* U+00fa33: CJK COMPATIBILITY IDEOGRAPH-FA33*/
- RTUNI_ALPHA, /* U+00fa34: CJK COMPATIBILITY IDEOGRAPH-FA34*/
- RTUNI_ALPHA, /* U+00fa35: CJK COMPATIBILITY IDEOGRAPH-FA35*/
- RTUNI_ALPHA, /* U+00fa36: CJK COMPATIBILITY IDEOGRAPH-FA36*/
- RTUNI_ALPHA, /* U+00fa37: CJK COMPATIBILITY IDEOGRAPH-FA37*/
- RTUNI_ALPHA, /* U+00fa38: CJK COMPATIBILITY IDEOGRAPH-FA38*/
- RTUNI_ALPHA, /* U+00fa39: CJK COMPATIBILITY IDEOGRAPH-FA39*/
- RTUNI_ALPHA, /* U+00fa3a: CJK COMPATIBILITY IDEOGRAPH-FA3A*/
- RTUNI_ALPHA, /* U+00fa3b: CJK COMPATIBILITY IDEOGRAPH-FA3B*/
- RTUNI_ALPHA, /* U+00fa3c: CJK COMPATIBILITY IDEOGRAPH-FA3C*/
- RTUNI_ALPHA, /* U+00fa3d: CJK COMPATIBILITY IDEOGRAPH-FA3D*/
- RTUNI_ALPHA, /* U+00fa3e: CJK COMPATIBILITY IDEOGRAPH-FA3E*/
- RTUNI_ALPHA, /* U+00fa3f: CJK COMPATIBILITY IDEOGRAPH-FA3F*/
- RTUNI_ALPHA, /* U+00fa40: CJK COMPATIBILITY IDEOGRAPH-FA40*/
- RTUNI_ALPHA, /* U+00fa41: CJK COMPATIBILITY IDEOGRAPH-FA41*/
- RTUNI_ALPHA, /* U+00fa42: CJK COMPATIBILITY IDEOGRAPH-FA42*/
- RTUNI_ALPHA, /* U+00fa43: CJK COMPATIBILITY IDEOGRAPH-FA43*/
- RTUNI_ALPHA, /* U+00fa44: CJK COMPATIBILITY IDEOGRAPH-FA44*/
- RTUNI_ALPHA, /* U+00fa45: CJK COMPATIBILITY IDEOGRAPH-FA45*/
- RTUNI_ALPHA, /* U+00fa46: CJK COMPATIBILITY IDEOGRAPH-FA46*/
- RTUNI_ALPHA, /* U+00fa47: CJK COMPATIBILITY IDEOGRAPH-FA47*/
- RTUNI_ALPHA, /* U+00fa48: CJK COMPATIBILITY IDEOGRAPH-FA48*/
- RTUNI_ALPHA, /* U+00fa49: CJK COMPATIBILITY IDEOGRAPH-FA49*/
- RTUNI_ALPHA, /* U+00fa4a: CJK COMPATIBILITY IDEOGRAPH-FA4A*/
- RTUNI_ALPHA, /* U+00fa4b: CJK COMPATIBILITY IDEOGRAPH-FA4B*/
- RTUNI_ALPHA, /* U+00fa4c: CJK COMPATIBILITY IDEOGRAPH-FA4C*/
- RTUNI_ALPHA, /* U+00fa4d: CJK COMPATIBILITY IDEOGRAPH-FA4D*/
- RTUNI_ALPHA, /* U+00fa4e: CJK COMPATIBILITY IDEOGRAPH-FA4E*/
- RTUNI_ALPHA, /* U+00fa4f: CJK COMPATIBILITY IDEOGRAPH-FA4F*/
- RTUNI_ALPHA, /* U+00fa50: CJK COMPATIBILITY IDEOGRAPH-FA50*/
- RTUNI_ALPHA, /* U+00fa51: CJK COMPATIBILITY IDEOGRAPH-FA51*/
- RTUNI_ALPHA, /* U+00fa52: CJK COMPATIBILITY IDEOGRAPH-FA52*/
- RTUNI_ALPHA, /* U+00fa53: CJK COMPATIBILITY IDEOGRAPH-FA53*/
- RTUNI_ALPHA, /* U+00fa54: CJK COMPATIBILITY IDEOGRAPH-FA54*/
- RTUNI_ALPHA, /* U+00fa55: CJK COMPATIBILITY IDEOGRAPH-FA55*/
- RTUNI_ALPHA, /* U+00fa56: CJK COMPATIBILITY IDEOGRAPH-FA56*/
- RTUNI_ALPHA, /* U+00fa57: CJK COMPATIBILITY IDEOGRAPH-FA57*/
- RTUNI_ALPHA, /* U+00fa58: CJK COMPATIBILITY IDEOGRAPH-FA58*/
- RTUNI_ALPHA, /* U+00fa59: CJK COMPATIBILITY IDEOGRAPH-FA59*/
- RTUNI_ALPHA, /* U+00fa5a: CJK COMPATIBILITY IDEOGRAPH-FA5A*/
- RTUNI_ALPHA, /* U+00fa5b: CJK COMPATIBILITY IDEOGRAPH-FA5B*/
- RTUNI_ALPHA, /* U+00fa5c: CJK COMPATIBILITY IDEOGRAPH-FA5C*/
- RTUNI_ALPHA, /* U+00fa5d: CJK COMPATIBILITY IDEOGRAPH-FA5D*/
- RTUNI_ALPHA, /* U+00fa5e: CJK COMPATIBILITY IDEOGRAPH-FA5E*/
- RTUNI_ALPHA, /* U+00fa5f: CJK COMPATIBILITY IDEOGRAPH-FA5F*/
- RTUNI_ALPHA, /* U+00fa60: CJK COMPATIBILITY IDEOGRAPH-FA60*/
- RTUNI_ALPHA, /* U+00fa61: CJK COMPATIBILITY IDEOGRAPH-FA61*/
- RTUNI_ALPHA, /* U+00fa62: CJK COMPATIBILITY IDEOGRAPH-FA62*/
- RTUNI_ALPHA, /* U+00fa63: CJK COMPATIBILITY IDEOGRAPH-FA63*/
- RTUNI_ALPHA, /* U+00fa64: CJK COMPATIBILITY IDEOGRAPH-FA64*/
- RTUNI_ALPHA, /* U+00fa65: CJK COMPATIBILITY IDEOGRAPH-FA65*/
- RTUNI_ALPHA, /* U+00fa66: CJK COMPATIBILITY IDEOGRAPH-FA66*/
- RTUNI_ALPHA, /* U+00fa67: CJK COMPATIBILITY IDEOGRAPH-FA67*/
- RTUNI_ALPHA, /* U+00fa68: CJK COMPATIBILITY IDEOGRAPH-FA68*/
- RTUNI_ALPHA, /* U+00fa69: CJK COMPATIBILITY IDEOGRAPH-FA69*/
- RTUNI_ALPHA, /* U+00fa6a: CJK COMPATIBILITY IDEOGRAPH-FA6A*/
- 0, /* U+00fa6b: */
- 0, /* U+00fa6c: */
- 0, /* U+00fa6d: */
- 0, /* U+00fa6e: */
- 0, /* U+00fa6f: */
- RTUNI_ALPHA, /* U+00fa70: CJK COMPATIBILITY IDEOGRAPH-FA70*/
- RTUNI_ALPHA, /* U+00fa71: CJK COMPATIBILITY IDEOGRAPH-FA71*/
- RTUNI_ALPHA, /* U+00fa72: CJK COMPATIBILITY IDEOGRAPH-FA72*/
- RTUNI_ALPHA, /* U+00fa73: CJK COMPATIBILITY IDEOGRAPH-FA73*/
- RTUNI_ALPHA, /* U+00fa74: CJK COMPATIBILITY IDEOGRAPH-FA74*/
- RTUNI_ALPHA, /* U+00fa75: CJK COMPATIBILITY IDEOGRAPH-FA75*/
- RTUNI_ALPHA, /* U+00fa76: CJK COMPATIBILITY IDEOGRAPH-FA76*/
- RTUNI_ALPHA, /* U+00fa77: CJK COMPATIBILITY IDEOGRAPH-FA77*/
- RTUNI_ALPHA, /* U+00fa78: CJK COMPATIBILITY IDEOGRAPH-FA78*/
- RTUNI_ALPHA, /* U+00fa79: CJK COMPATIBILITY IDEOGRAPH-FA79*/
- RTUNI_ALPHA, /* U+00fa7a: CJK COMPATIBILITY IDEOGRAPH-FA7A*/
- RTUNI_ALPHA, /* U+00fa7b: CJK COMPATIBILITY IDEOGRAPH-FA7B*/
- RTUNI_ALPHA, /* U+00fa7c: CJK COMPATIBILITY IDEOGRAPH-FA7C*/
- RTUNI_ALPHA, /* U+00fa7d: CJK COMPATIBILITY IDEOGRAPH-FA7D*/
- RTUNI_ALPHA, /* U+00fa7e: CJK COMPATIBILITY IDEOGRAPH-FA7E*/
- RTUNI_ALPHA, /* U+00fa7f: CJK COMPATIBILITY IDEOGRAPH-FA7F*/
- RTUNI_ALPHA, /* U+00fa80: CJK COMPATIBILITY IDEOGRAPH-FA80*/
- RTUNI_ALPHA, /* U+00fa81: CJK COMPATIBILITY IDEOGRAPH-FA81*/
- RTUNI_ALPHA, /* U+00fa82: CJK COMPATIBILITY IDEOGRAPH-FA82*/
- RTUNI_ALPHA, /* U+00fa83: CJK COMPATIBILITY IDEOGRAPH-FA83*/
- RTUNI_ALPHA, /* U+00fa84: CJK COMPATIBILITY IDEOGRAPH-FA84*/
- RTUNI_ALPHA, /* U+00fa85: CJK COMPATIBILITY IDEOGRAPH-FA85*/
- RTUNI_ALPHA, /* U+00fa86: CJK COMPATIBILITY IDEOGRAPH-FA86*/
- RTUNI_ALPHA, /* U+00fa87: CJK COMPATIBILITY IDEOGRAPH-FA87*/
- RTUNI_ALPHA, /* U+00fa88: CJK COMPATIBILITY IDEOGRAPH-FA88*/
- RTUNI_ALPHA, /* U+00fa89: CJK COMPATIBILITY IDEOGRAPH-FA89*/
- RTUNI_ALPHA, /* U+00fa8a: CJK COMPATIBILITY IDEOGRAPH-FA8A*/
- RTUNI_ALPHA, /* U+00fa8b: CJK COMPATIBILITY IDEOGRAPH-FA8B*/
- RTUNI_ALPHA, /* U+00fa8c: CJK COMPATIBILITY IDEOGRAPH-FA8C*/
- RTUNI_ALPHA, /* U+00fa8d: CJK COMPATIBILITY IDEOGRAPH-FA8D*/
- RTUNI_ALPHA, /* U+00fa8e: CJK COMPATIBILITY IDEOGRAPH-FA8E*/
- RTUNI_ALPHA, /* U+00fa8f: CJK COMPATIBILITY IDEOGRAPH-FA8F*/
- RTUNI_ALPHA, /* U+00fa90: CJK COMPATIBILITY IDEOGRAPH-FA90*/
- RTUNI_ALPHA, /* U+00fa91: CJK COMPATIBILITY IDEOGRAPH-FA91*/
- RTUNI_ALPHA, /* U+00fa92: CJK COMPATIBILITY IDEOGRAPH-FA92*/
- RTUNI_ALPHA, /* U+00fa93: CJK COMPATIBILITY IDEOGRAPH-FA93*/
- RTUNI_ALPHA, /* U+00fa94: CJK COMPATIBILITY IDEOGRAPH-FA94*/
- RTUNI_ALPHA, /* U+00fa95: CJK COMPATIBILITY IDEOGRAPH-FA95*/
- RTUNI_ALPHA, /* U+00fa96: CJK COMPATIBILITY IDEOGRAPH-FA96*/
- RTUNI_ALPHA, /* U+00fa97: CJK COMPATIBILITY IDEOGRAPH-FA97*/
- RTUNI_ALPHA, /* U+00fa98: CJK COMPATIBILITY IDEOGRAPH-FA98*/
- RTUNI_ALPHA, /* U+00fa99: CJK COMPATIBILITY IDEOGRAPH-FA99*/
- RTUNI_ALPHA, /* U+00fa9a: CJK COMPATIBILITY IDEOGRAPH-FA9A*/
- RTUNI_ALPHA, /* U+00fa9b: CJK COMPATIBILITY IDEOGRAPH-FA9B*/
- RTUNI_ALPHA, /* U+00fa9c: CJK COMPATIBILITY IDEOGRAPH-FA9C*/
- RTUNI_ALPHA, /* U+00fa9d: CJK COMPATIBILITY IDEOGRAPH-FA9D*/
- RTUNI_ALPHA, /* U+00fa9e: CJK COMPATIBILITY IDEOGRAPH-FA9E*/
- RTUNI_ALPHA, /* U+00fa9f: CJK COMPATIBILITY IDEOGRAPH-FA9F*/
- RTUNI_ALPHA, /* U+00faa0: CJK COMPATIBILITY IDEOGRAPH-FAA0*/
- RTUNI_ALPHA, /* U+00faa1: CJK COMPATIBILITY IDEOGRAPH-FAA1*/
- RTUNI_ALPHA, /* U+00faa2: CJK COMPATIBILITY IDEOGRAPH-FAA2*/
- RTUNI_ALPHA, /* U+00faa3: CJK COMPATIBILITY IDEOGRAPH-FAA3*/
- RTUNI_ALPHA, /* U+00faa4: CJK COMPATIBILITY IDEOGRAPH-FAA4*/
- RTUNI_ALPHA, /* U+00faa5: CJK COMPATIBILITY IDEOGRAPH-FAA5*/
- RTUNI_ALPHA, /* U+00faa6: CJK COMPATIBILITY IDEOGRAPH-FAA6*/
- RTUNI_ALPHA, /* U+00faa7: CJK COMPATIBILITY IDEOGRAPH-FAA7*/
- RTUNI_ALPHA, /* U+00faa8: CJK COMPATIBILITY IDEOGRAPH-FAA8*/
- RTUNI_ALPHA, /* U+00faa9: CJK COMPATIBILITY IDEOGRAPH-FAA9*/
- RTUNI_ALPHA, /* U+00faaa: CJK COMPATIBILITY IDEOGRAPH-FAAA*/
- RTUNI_ALPHA, /* U+00faab: CJK COMPATIBILITY IDEOGRAPH-FAAB*/
- RTUNI_ALPHA, /* U+00faac: CJK COMPATIBILITY IDEOGRAPH-FAAC*/
- RTUNI_ALPHA, /* U+00faad: CJK COMPATIBILITY IDEOGRAPH-FAAD*/
- RTUNI_ALPHA, /* U+00faae: CJK COMPATIBILITY IDEOGRAPH-FAAE*/
- RTUNI_ALPHA, /* U+00faaf: CJK COMPATIBILITY IDEOGRAPH-FAAF*/
- RTUNI_ALPHA, /* U+00fab0: CJK COMPATIBILITY IDEOGRAPH-FAB0*/
- RTUNI_ALPHA, /* U+00fab1: CJK COMPATIBILITY IDEOGRAPH-FAB1*/
- RTUNI_ALPHA, /* U+00fab2: CJK COMPATIBILITY IDEOGRAPH-FAB2*/
- RTUNI_ALPHA, /* U+00fab3: CJK COMPATIBILITY IDEOGRAPH-FAB3*/
- RTUNI_ALPHA, /* U+00fab4: CJK COMPATIBILITY IDEOGRAPH-FAB4*/
- RTUNI_ALPHA, /* U+00fab5: CJK COMPATIBILITY IDEOGRAPH-FAB5*/
- RTUNI_ALPHA, /* U+00fab6: CJK COMPATIBILITY IDEOGRAPH-FAB6*/
- RTUNI_ALPHA, /* U+00fab7: CJK COMPATIBILITY IDEOGRAPH-FAB7*/
- RTUNI_ALPHA, /* U+00fab8: CJK COMPATIBILITY IDEOGRAPH-FAB8*/
- RTUNI_ALPHA, /* U+00fab9: CJK COMPATIBILITY IDEOGRAPH-FAB9*/
- RTUNI_ALPHA, /* U+00faba: CJK COMPATIBILITY IDEOGRAPH-FABA*/
- RTUNI_ALPHA, /* U+00fabb: CJK COMPATIBILITY IDEOGRAPH-FABB*/
- RTUNI_ALPHA, /* U+00fabc: CJK COMPATIBILITY IDEOGRAPH-FABC*/
- RTUNI_ALPHA, /* U+00fabd: CJK COMPATIBILITY IDEOGRAPH-FABD*/
- RTUNI_ALPHA, /* U+00fabe: CJK COMPATIBILITY IDEOGRAPH-FABE*/
- RTUNI_ALPHA, /* U+00fabf: CJK COMPATIBILITY IDEOGRAPH-FABF*/
- RTUNI_ALPHA, /* U+00fac0: CJK COMPATIBILITY IDEOGRAPH-FAC0*/
- RTUNI_ALPHA, /* U+00fac1: CJK COMPATIBILITY IDEOGRAPH-FAC1*/
- RTUNI_ALPHA, /* U+00fac2: CJK COMPATIBILITY IDEOGRAPH-FAC2*/
- RTUNI_ALPHA, /* U+00fac3: CJK COMPATIBILITY IDEOGRAPH-FAC3*/
- RTUNI_ALPHA, /* U+00fac4: CJK COMPATIBILITY IDEOGRAPH-FAC4*/
- RTUNI_ALPHA, /* U+00fac5: CJK COMPATIBILITY IDEOGRAPH-FAC5*/
- RTUNI_ALPHA, /* U+00fac6: CJK COMPATIBILITY IDEOGRAPH-FAC6*/
- RTUNI_ALPHA, /* U+00fac7: CJK COMPATIBILITY IDEOGRAPH-FAC7*/
- RTUNI_ALPHA, /* U+00fac8: CJK COMPATIBILITY IDEOGRAPH-FAC8*/
- RTUNI_ALPHA, /* U+00fac9: CJK COMPATIBILITY IDEOGRAPH-FAC9*/
- RTUNI_ALPHA, /* U+00faca: CJK COMPATIBILITY IDEOGRAPH-FACA*/
- RTUNI_ALPHA, /* U+00facb: CJK COMPATIBILITY IDEOGRAPH-FACB*/
- RTUNI_ALPHA, /* U+00facc: CJK COMPATIBILITY IDEOGRAPH-FACC*/
- RTUNI_ALPHA, /* U+00facd: CJK COMPATIBILITY IDEOGRAPH-FACD*/
- RTUNI_ALPHA, /* U+00face: CJK COMPATIBILITY IDEOGRAPH-FACE*/
- RTUNI_ALPHA, /* U+00facf: CJK COMPATIBILITY IDEOGRAPH-FACF*/
- RTUNI_ALPHA, /* U+00fad0: CJK COMPATIBILITY IDEOGRAPH-FAD0*/
- RTUNI_ALPHA, /* U+00fad1: CJK COMPATIBILITY IDEOGRAPH-FAD1*/
- RTUNI_ALPHA, /* U+00fad2: CJK COMPATIBILITY IDEOGRAPH-FAD2*/
- RTUNI_ALPHA, /* U+00fad3: CJK COMPATIBILITY IDEOGRAPH-FAD3*/
- RTUNI_ALPHA, /* U+00fad4: CJK COMPATIBILITY IDEOGRAPH-FAD4*/
- RTUNI_ALPHA, /* U+00fad5: CJK COMPATIBILITY IDEOGRAPH-FAD5*/
- RTUNI_ALPHA, /* U+00fad6: CJK COMPATIBILITY IDEOGRAPH-FAD6*/
- RTUNI_ALPHA, /* U+00fad7: CJK COMPATIBILITY IDEOGRAPH-FAD7*/
- RTUNI_ALPHA, /* U+00fad8: CJK COMPATIBILITY IDEOGRAPH-FAD8*/
- RTUNI_ALPHA, /* U+00fad9: CJK COMPATIBILITY IDEOGRAPH-FAD9*/
- 0, /* U+00fada: */
- 0, /* U+00fadb: */
- 0, /* U+00fadc: */
- 0, /* U+00fadd: */
- 0, /* U+00fade: */
- 0, /* U+00fadf: */
- 0, /* U+00fae0: */
- 0, /* U+00fae1: */
- 0, /* U+00fae2: */
- 0, /* U+00fae3: */
- 0, /* U+00fae4: */
- 0, /* U+00fae5: */
- 0, /* U+00fae6: */
- 0, /* U+00fae7: */
- 0, /* U+00fae8: */
- 0, /* U+00fae9: */
- 0, /* U+00faea: */
- 0, /* U+00faeb: */
- 0, /* U+00faec: */
- 0, /* U+00faed: */
- 0, /* U+00faee: */
- 0, /* U+00faef: */
- 0, /* U+00faf0: */
- 0, /* U+00faf1: */
- 0, /* U+00faf2: */
- 0, /* U+00faf3: */
- 0, /* U+00faf4: */
- 0, /* U+00faf5: */
- 0, /* U+00faf6: */
- 0, /* U+00faf7: */
- 0, /* U+00faf8: */
- 0, /* U+00faf9: */
- 0, /* U+00fafa: */
- 0, /* U+00fafb: */
- 0, /* U+00fafc: */
- 0, /* U+00fafd: */
- 0, /* U+00fafe: */
- 0, /* U+00faff: */
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00fb00: LATIN SMALL LIGATURE FF*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00fb01: LATIN SMALL LIGATURE FI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00fb02: LATIN SMALL LIGATURE FL*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00fb03: LATIN SMALL LIGATURE FFI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00fb04: LATIN SMALL LIGATURE FFL*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00fb05: LATIN SMALL LIGATURE LONG S T*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00fb06: LATIN SMALL LIGATURE ST*/
- 0, /* U+00fb07: */
- 0, /* U+00fb08: */
- 0, /* U+00fb09: */
- 0, /* U+00fb0a: */
- 0, /* U+00fb0b: */
- 0, /* U+00fb0c: */
- 0, /* U+00fb0d: */
- 0, /* U+00fb0e: */
- 0, /* U+00fb0f: */
- 0, /* U+00fb10: */
- 0, /* U+00fb11: */
- 0, /* U+00fb12: */
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00fb13: ARMENIAN SMALL LIGATURE MEN NOW*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00fb14: ARMENIAN SMALL LIGATURE MEN ECH*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00fb15: ARMENIAN SMALL LIGATURE MEN INI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00fb16: ARMENIAN SMALL LIGATURE VEW NOW*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00fb17: ARMENIAN SMALL LIGATURE MEN XEH*/
- 0, /* U+00fb18: */
- 0, /* U+00fb19: */
- 0, /* U+00fb1a: */
- 0, /* U+00fb1b: */
- 0, /* U+00fb1c: */
- RTUNI_ALPHA, /* U+00fb1d: HEBREW LETTER YOD WITH HIRIQ*/
- RTUNI_ALPHA, /* U+00fb1e: HEBREW POINT JUDEO-SPANISH VARIKA*/
- RTUNI_ALPHA, /* U+00fb1f: HEBREW LIGATURE YIDDISH YOD YOD PATAH*/
- RTUNI_ALPHA, /* U+00fb20: HEBREW LETTER ALTERNATIVE AYIN*/
- RTUNI_ALPHA, /* U+00fb21: HEBREW LETTER WIDE ALEF*/
- RTUNI_ALPHA, /* U+00fb22: HEBREW LETTER WIDE DALET*/
- RTUNI_ALPHA, /* U+00fb23: HEBREW LETTER WIDE HE*/
- RTUNI_ALPHA, /* U+00fb24: HEBREW LETTER WIDE KAF*/
- RTUNI_ALPHA, /* U+00fb25: HEBREW LETTER WIDE LAMED*/
- RTUNI_ALPHA, /* U+00fb26: HEBREW LETTER WIDE FINAL MEM*/
- RTUNI_ALPHA, /* U+00fb27: HEBREW LETTER WIDE RESH*/
- RTUNI_ALPHA, /* U+00fb28: HEBREW LETTER WIDE TAV*/
- 0, /* U+00fb29: HEBREW LETTER ALTERNATIVE PLUS SIGN*/
- RTUNI_ALPHA, /* U+00fb2a: HEBREW LETTER SHIN WITH SHIN DOT*/
- RTUNI_ALPHA, /* U+00fb2b: HEBREW LETTER SHIN WITH SIN DOT*/
- RTUNI_ALPHA, /* U+00fb2c: HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT*/
- RTUNI_ALPHA, /* U+00fb2d: HEBREW LETTER SHIN WITH DAGESH AND SIN DOT*/
- RTUNI_ALPHA, /* U+00fb2e: HEBREW LETTER ALEF WITH PATAH*/
- RTUNI_ALPHA, /* U+00fb2f: HEBREW LETTER ALEF WITH QAMATS*/
- RTUNI_ALPHA, /* U+00fb30: HEBREW LETTER ALEF WITH MAPIQ*/
- RTUNI_ALPHA, /* U+00fb31: HEBREW LETTER BET WITH DAGESH*/
- RTUNI_ALPHA, /* U+00fb32: HEBREW LETTER GIMEL WITH DAGESH*/
- RTUNI_ALPHA, /* U+00fb33: HEBREW LETTER DALET WITH DAGESH*/
- RTUNI_ALPHA, /* U+00fb34: HEBREW LETTER HE WITH MAPIQ*/
- RTUNI_ALPHA, /* U+00fb35: HEBREW LETTER VAV WITH DAGESH*/
- RTUNI_ALPHA, /* U+00fb36: HEBREW LETTER ZAYIN WITH DAGESH*/
- 0, /* U+00fb37: */
- RTUNI_ALPHA, /* U+00fb38: HEBREW LETTER TET WITH DAGESH*/
- RTUNI_ALPHA, /* U+00fb39: HEBREW LETTER YOD WITH DAGESH*/
- RTUNI_ALPHA, /* U+00fb3a: HEBREW LETTER FINAL KAF WITH DAGESH*/
- RTUNI_ALPHA, /* U+00fb3b: HEBREW LETTER KAF WITH DAGESH*/
- RTUNI_ALPHA, /* U+00fb3c: HEBREW LETTER LAMED WITH DAGESH*/
- 0, /* U+00fb3d: */
- RTUNI_ALPHA, /* U+00fb3e: HEBREW LETTER MEM WITH DAGESH*/
- 0, /* U+00fb3f: */
- RTUNI_ALPHA, /* U+00fb40: HEBREW LETTER NUN WITH DAGESH*/
- RTUNI_ALPHA, /* U+00fb41: HEBREW LETTER SAMEKH WITH DAGESH*/
- 0, /* U+00fb42: */
- RTUNI_ALPHA, /* U+00fb43: HEBREW LETTER FINAL PE WITH DAGESH*/
- RTUNI_ALPHA, /* U+00fb44: HEBREW LETTER PE WITH DAGESH*/
- 0, /* U+00fb45: */
- RTUNI_ALPHA, /* U+00fb46: HEBREW LETTER TSADI WITH DAGESH*/
- RTUNI_ALPHA, /* U+00fb47: HEBREW LETTER QOF WITH DAGESH*/
- RTUNI_ALPHA, /* U+00fb48: HEBREW LETTER RESH WITH DAGESH*/
- RTUNI_ALPHA, /* U+00fb49: HEBREW LETTER SHIN WITH DAGESH*/
- RTUNI_ALPHA, /* U+00fb4a: HEBREW LETTER TAV WITH DAGESH*/
- RTUNI_ALPHA, /* U+00fb4b: HEBREW LETTER VAV WITH HOLAM*/
- RTUNI_ALPHA, /* U+00fb4c: HEBREW LETTER BET WITH RAFE*/
- RTUNI_ALPHA, /* U+00fb4d: HEBREW LETTER KAF WITH RAFE*/
- RTUNI_ALPHA, /* U+00fb4e: HEBREW LETTER PE WITH RAFE*/
- RTUNI_ALPHA, /* U+00fb4f: HEBREW LIGATURE ALEF LAMED*/
- RTUNI_ALPHA, /* U+00fb50: ARABIC LETTER ALEF WASLA ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fb51: ARABIC LETTER ALEF WASLA FINAL FORM*/
- RTUNI_ALPHA, /* U+00fb52: ARABIC LETTER BEEH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fb53: ARABIC LETTER BEEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fb54: ARABIC LETTER BEEH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fb55: ARABIC LETTER BEEH MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fb56: ARABIC LETTER PEH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fb57: ARABIC LETTER PEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fb58: ARABIC LETTER PEH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fb59: ARABIC LETTER PEH MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fb5a: ARABIC LETTER BEHEH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fb5b: ARABIC LETTER BEHEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fb5c: ARABIC LETTER BEHEH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fb5d: ARABIC LETTER BEHEH MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fb5e: ARABIC LETTER TTEHEH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fb5f: ARABIC LETTER TTEHEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fb60: ARABIC LETTER TTEHEH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fb61: ARABIC LETTER TTEHEH MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fb62: ARABIC LETTER TEHEH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fb63: ARABIC LETTER TEHEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fb64: ARABIC LETTER TEHEH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fb65: ARABIC LETTER TEHEH MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fb66: ARABIC LETTER TTEH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fb67: ARABIC LETTER TTEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fb68: ARABIC LETTER TTEH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fb69: ARABIC LETTER TTEH MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fb6a: ARABIC LETTER VEH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fb6b: ARABIC LETTER VEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fb6c: ARABIC LETTER VEH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fb6d: ARABIC LETTER VEH MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fb6e: ARABIC LETTER PEHEH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fb6f: ARABIC LETTER PEHEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fb70: ARABIC LETTER PEHEH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fb71: ARABIC LETTER PEHEH MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fb72: ARABIC LETTER DYEH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fb73: ARABIC LETTER DYEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fb74: ARABIC LETTER DYEH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fb75: ARABIC LETTER DYEH MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fb76: ARABIC LETTER NYEH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fb77: ARABIC LETTER NYEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fb78: ARABIC LETTER NYEH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fb79: ARABIC LETTER NYEH MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fb7a: ARABIC LETTER TCHEH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fb7b: ARABIC LETTER TCHEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fb7c: ARABIC LETTER TCHEH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fb7d: ARABIC LETTER TCHEH MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fb7e: ARABIC LETTER TCHEHEH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fb7f: ARABIC LETTER TCHEHEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fb80: ARABIC LETTER TCHEHEH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fb81: ARABIC LETTER TCHEHEH MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fb82: ARABIC LETTER DDAHAL ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fb83: ARABIC LETTER DDAHAL FINAL FORM*/
- RTUNI_ALPHA, /* U+00fb84: ARABIC LETTER DAHAL ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fb85: ARABIC LETTER DAHAL FINAL FORM*/
- RTUNI_ALPHA, /* U+00fb86: ARABIC LETTER DUL ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fb87: ARABIC LETTER DUL FINAL FORM*/
- RTUNI_ALPHA, /* U+00fb88: ARABIC LETTER DDAL ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fb89: ARABIC LETTER DDAL FINAL FORM*/
- RTUNI_ALPHA, /* U+00fb8a: ARABIC LETTER JEH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fb8b: ARABIC LETTER JEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fb8c: ARABIC LETTER RREH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fb8d: ARABIC LETTER RREH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fb8e: ARABIC LETTER KEHEH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fb8f: ARABIC LETTER KEHEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fb90: ARABIC LETTER KEHEH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fb91: ARABIC LETTER KEHEH MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fb92: ARABIC LETTER GAF ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fb93: ARABIC LETTER GAF FINAL FORM*/
- RTUNI_ALPHA, /* U+00fb94: ARABIC LETTER GAF INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fb95: ARABIC LETTER GAF MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fb96: ARABIC LETTER GUEH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fb97: ARABIC LETTER GUEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fb98: ARABIC LETTER GUEH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fb99: ARABIC LETTER GUEH MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fb9a: ARABIC LETTER NGOEH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fb9b: ARABIC LETTER NGOEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fb9c: ARABIC LETTER NGOEH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fb9d: ARABIC LETTER NGOEH MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fb9e: ARABIC LETTER NOON GHUNNA ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fb9f: ARABIC LETTER NOON GHUNNA FINAL FORM*/
- RTUNI_ALPHA, /* U+00fba0: ARABIC LETTER RNOON ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fba1: ARABIC LETTER RNOON FINAL FORM*/
- RTUNI_ALPHA, /* U+00fba2: ARABIC LETTER RNOON INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fba3: ARABIC LETTER RNOON MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fba4: ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fba5: ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM*/
- RTUNI_ALPHA, /* U+00fba6: ARABIC LETTER HEH GOAL ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fba7: ARABIC LETTER HEH GOAL FINAL FORM*/
- RTUNI_ALPHA, /* U+00fba8: ARABIC LETTER HEH GOAL INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fba9: ARABIC LETTER HEH GOAL MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fbaa: ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fbab: ARABIC LETTER HEH DOACHASHMEE FINAL FORM*/
- RTUNI_ALPHA, /* U+00fbac: ARABIC LETTER HEH DOACHASHMEE INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fbad: ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fbae: ARABIC LETTER YEH BARREE ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fbaf: ARABIC LETTER YEH BARREE FINAL FORM*/
- RTUNI_ALPHA, /* U+00fbb0: ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fbb1: ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM*/
- 0, /* U+00fbb2: */
- 0, /* U+00fbb3: */
- 0, /* U+00fbb4: */
- 0, /* U+00fbb5: */
- 0, /* U+00fbb6: */
- 0, /* U+00fbb7: */
- 0, /* U+00fbb8: */
- 0, /* U+00fbb9: */
- 0, /* U+00fbba: */
- 0, /* U+00fbbb: */
- 0, /* U+00fbbc: */
- 0, /* U+00fbbd: */
- 0, /* U+00fbbe: */
- 0, /* U+00fbbf: */
- 0, /* U+00fbc0: */
- 0, /* U+00fbc1: */
- 0, /* U+00fbc2: */
- 0, /* U+00fbc3: */
- 0, /* U+00fbc4: */
- 0, /* U+00fbc5: */
- 0, /* U+00fbc6: */
- 0, /* U+00fbc7: */
- 0, /* U+00fbc8: */
- 0, /* U+00fbc9: */
- 0, /* U+00fbca: */
- 0, /* U+00fbcb: */
- 0, /* U+00fbcc: */
- 0, /* U+00fbcd: */
- 0, /* U+00fbce: */
- 0, /* U+00fbcf: */
- 0, /* U+00fbd0: */
- 0, /* U+00fbd1: */
- 0, /* U+00fbd2: */
- RTUNI_ALPHA, /* U+00fbd3: ARABIC LETTER NG ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fbd4: ARABIC LETTER NG FINAL FORM*/
- RTUNI_ALPHA, /* U+00fbd5: ARABIC LETTER NG INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fbd6: ARABIC LETTER NG MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fbd7: ARABIC LETTER U ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fbd8: ARABIC LETTER U FINAL FORM*/
- RTUNI_ALPHA, /* U+00fbd9: ARABIC LETTER OE ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fbda: ARABIC LETTER OE FINAL FORM*/
- RTUNI_ALPHA, /* U+00fbdb: ARABIC LETTER YU ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fbdc: ARABIC LETTER YU FINAL FORM*/
- RTUNI_ALPHA, /* U+00fbdd: ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fbde: ARABIC LETTER VE ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fbdf: ARABIC LETTER VE FINAL FORM*/
- RTUNI_ALPHA, /* U+00fbe0: ARABIC LETTER KIRGHIZ OE ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fbe1: ARABIC LETTER KIRGHIZ OE FINAL FORM*/
- RTUNI_ALPHA, /* U+00fbe2: ARABIC LETTER KIRGHIZ YU ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fbe3: ARABIC LETTER KIRGHIZ YU FINAL FORM*/
- RTUNI_ALPHA, /* U+00fbe4: ARABIC LETTER E ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fbe5: ARABIC LETTER E FINAL FORM*/
- RTUNI_ALPHA, /* U+00fbe6: ARABIC LETTER E INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fbe7: ARABIC LETTER E MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fbe8: ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fbe9: ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fbea: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fbeb: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM*/
- RTUNI_ALPHA, /* U+00fbec: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fbed: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM*/
- RTUNI_ALPHA, /* U+00fbee: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fbef: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM*/
- RTUNI_ALPHA, /* U+00fbf0: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fbf1: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM*/
- RTUNI_ALPHA, /* U+00fbf2: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fbf3: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM*/
- RTUNI_ALPHA, /* U+00fbf4: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fbf5: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM*/
- RTUNI_ALPHA, /* U+00fbf6: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fbf7: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM*/
- RTUNI_ALPHA, /* U+00fbf8: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fbf9: ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fbfa: ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM*/
- RTUNI_ALPHA, /* U+00fbfb: ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fbfc: ARABIC LETTER FARSI YEH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fbfd: ARABIC LETTER FARSI YEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fbfe: ARABIC LETTER FARSI YEH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fbff: ARABIC LETTER FARSI YEH MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fc00: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc01: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc02: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc03: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc04: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc05: ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc06: ARABIC LIGATURE BEH WITH HAH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc07: ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc08: ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc09: ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc0a: ARABIC LIGATURE BEH WITH YEH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc0b: ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc0c: ARABIC LIGATURE TEH WITH HAH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc0d: ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc0e: ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc0f: ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc10: ARABIC LIGATURE TEH WITH YEH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc11: ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc12: ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc13: ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc14: ARABIC LIGATURE THEH WITH YEH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc15: ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc16: ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc17: ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc18: ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc19: ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc1a: ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc1b: ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc1c: ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc1d: ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc1e: ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc1f: ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc20: ARABIC LIGATURE SAD WITH HAH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc21: ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc22: ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc23: ARABIC LIGATURE DAD WITH HAH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc24: ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc25: ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc26: ARABIC LIGATURE TAH WITH HAH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc27: ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc28: ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc29: ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc2a: ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc2b: ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc2c: ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc2d: ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc2e: ARABIC LIGATURE FEH WITH HAH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc2f: ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc30: ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc31: ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc32: ARABIC LIGATURE FEH WITH YEH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc33: ARABIC LIGATURE QAF WITH HAH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc34: ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc35: ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc36: ARABIC LIGATURE QAF WITH YEH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc37: ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc38: ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc39: ARABIC LIGATURE KAF WITH HAH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc3a: ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc3b: ARABIC LIGATURE KAF WITH LAM ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc3c: ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc3d: ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc3e: ARABIC LIGATURE KAF WITH YEH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc3f: ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc40: ARABIC LIGATURE LAM WITH HAH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc41: ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc42: ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc43: ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc44: ARABIC LIGATURE LAM WITH YEH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc45: ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc46: ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc47: ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc48: ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc49: ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc4a: ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc4b: ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc4c: ARABIC LIGATURE NOON WITH HAH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc4d: ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc4e: ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc4f: ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc50: ARABIC LIGATURE NOON WITH YEH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc51: ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc52: ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc53: ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc54: ARABIC LIGATURE HEH WITH YEH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc55: ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc56: ARABIC LIGATURE YEH WITH HAH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc57: ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc58: ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc59: ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc5a: ARABIC LIGATURE YEH WITH YEH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc5b: ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc5c: ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc5d: ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc5e: ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc5f: ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc60: ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc61: ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc62: ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc63: ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fc64: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fc65: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM*/
- RTUNI_ALPHA, /* U+00fc66: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM*/
- RTUNI_ALPHA, /* U+00fc67: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM*/
- RTUNI_ALPHA, /* U+00fc68: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM*/
- RTUNI_ALPHA, /* U+00fc69: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fc6a: ARABIC LIGATURE BEH WITH REH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fc6b: ARABIC LIGATURE BEH WITH ZAIN FINAL FORM*/
- RTUNI_ALPHA, /* U+00fc6c: ARABIC LIGATURE BEH WITH MEEM FINAL FORM*/
- RTUNI_ALPHA, /* U+00fc6d: ARABIC LIGATURE BEH WITH NOON FINAL FORM*/
- RTUNI_ALPHA, /* U+00fc6e: ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM*/
- RTUNI_ALPHA, /* U+00fc6f: ARABIC LIGATURE BEH WITH YEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fc70: ARABIC LIGATURE TEH WITH REH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fc71: ARABIC LIGATURE TEH WITH ZAIN FINAL FORM*/
- RTUNI_ALPHA, /* U+00fc72: ARABIC LIGATURE TEH WITH MEEM FINAL FORM*/
- RTUNI_ALPHA, /* U+00fc73: ARABIC LIGATURE TEH WITH NOON FINAL FORM*/
- RTUNI_ALPHA, /* U+00fc74: ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM*/
- RTUNI_ALPHA, /* U+00fc75: ARABIC LIGATURE TEH WITH YEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fc76: ARABIC LIGATURE THEH WITH REH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fc77: ARABIC LIGATURE THEH WITH ZAIN FINAL FORM*/
- RTUNI_ALPHA, /* U+00fc78: ARABIC LIGATURE THEH WITH MEEM FINAL FORM*/
- RTUNI_ALPHA, /* U+00fc79: ARABIC LIGATURE THEH WITH NOON FINAL FORM*/
- RTUNI_ALPHA, /* U+00fc7a: ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM*/
- RTUNI_ALPHA, /* U+00fc7b: ARABIC LIGATURE THEH WITH YEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fc7c: ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM*/
- RTUNI_ALPHA, /* U+00fc7d: ARABIC LIGATURE FEH WITH YEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fc7e: ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM*/
- RTUNI_ALPHA, /* U+00fc7f: ARABIC LIGATURE QAF WITH YEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fc80: ARABIC LIGATURE KAF WITH ALEF FINAL FORM*/
- RTUNI_ALPHA, /* U+00fc81: ARABIC LIGATURE KAF WITH LAM FINAL FORM*/
- RTUNI_ALPHA, /* U+00fc82: ARABIC LIGATURE KAF WITH MEEM FINAL FORM*/
- RTUNI_ALPHA, /* U+00fc83: ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM*/
- RTUNI_ALPHA, /* U+00fc84: ARABIC LIGATURE KAF WITH YEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fc85: ARABIC LIGATURE LAM WITH MEEM FINAL FORM*/
- RTUNI_ALPHA, /* U+00fc86: ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM*/
- RTUNI_ALPHA, /* U+00fc87: ARABIC LIGATURE LAM WITH YEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fc88: ARABIC LIGATURE MEEM WITH ALEF FINAL FORM*/
- RTUNI_ALPHA, /* U+00fc89: ARABIC LIGATURE MEEM WITH MEEM FINAL FORM*/
- RTUNI_ALPHA, /* U+00fc8a: ARABIC LIGATURE NOON WITH REH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fc8b: ARABIC LIGATURE NOON WITH ZAIN FINAL FORM*/
- RTUNI_ALPHA, /* U+00fc8c: ARABIC LIGATURE NOON WITH MEEM FINAL FORM*/
- RTUNI_ALPHA, /* U+00fc8d: ARABIC LIGATURE NOON WITH NOON FINAL FORM*/
- RTUNI_ALPHA, /* U+00fc8e: ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM*/
- RTUNI_ALPHA, /* U+00fc8f: ARABIC LIGATURE NOON WITH YEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fc90: ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM*/
- RTUNI_ALPHA, /* U+00fc91: ARABIC LIGATURE YEH WITH REH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fc92: ARABIC LIGATURE YEH WITH ZAIN FINAL FORM*/
- RTUNI_ALPHA, /* U+00fc93: ARABIC LIGATURE YEH WITH MEEM FINAL FORM*/
- RTUNI_ALPHA, /* U+00fc94: ARABIC LIGATURE YEH WITH NOON FINAL FORM*/
- RTUNI_ALPHA, /* U+00fc95: ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM*/
- RTUNI_ALPHA, /* U+00fc96: ARABIC LIGATURE YEH WITH YEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fc97: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fc98: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fc99: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fc9a: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fc9b: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fc9c: ARABIC LIGATURE BEH WITH JEEM INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fc9d: ARABIC LIGATURE BEH WITH HAH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fc9e: ARABIC LIGATURE BEH WITH KHAH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fc9f: ARABIC LIGATURE BEH WITH MEEM INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fca0: ARABIC LIGATURE BEH WITH HEH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fca1: ARABIC LIGATURE TEH WITH JEEM INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fca2: ARABIC LIGATURE TEH WITH HAH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fca3: ARABIC LIGATURE TEH WITH KHAH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fca4: ARABIC LIGATURE TEH WITH MEEM INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fca5: ARABIC LIGATURE TEH WITH HEH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fca6: ARABIC LIGATURE THEH WITH MEEM INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fca7: ARABIC LIGATURE JEEM WITH HAH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fca8: ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fca9: ARABIC LIGATURE HAH WITH JEEM INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fcaa: ARABIC LIGATURE HAH WITH MEEM INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fcab: ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fcac: ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fcad: ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fcae: ARABIC LIGATURE SEEN WITH HAH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fcaf: ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fcb0: ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fcb1: ARABIC LIGATURE SAD WITH HAH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fcb2: ARABIC LIGATURE SAD WITH KHAH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fcb3: ARABIC LIGATURE SAD WITH MEEM INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fcb4: ARABIC LIGATURE DAD WITH JEEM INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fcb5: ARABIC LIGATURE DAD WITH HAH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fcb6: ARABIC LIGATURE DAD WITH KHAH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fcb7: ARABIC LIGATURE DAD WITH MEEM INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fcb8: ARABIC LIGATURE TAH WITH HAH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fcb9: ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fcba: ARABIC LIGATURE AIN WITH JEEM INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fcbb: ARABIC LIGATURE AIN WITH MEEM INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fcbc: ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fcbd: ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fcbe: ARABIC LIGATURE FEH WITH JEEM INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fcbf: ARABIC LIGATURE FEH WITH HAH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fcc0: ARABIC LIGATURE FEH WITH KHAH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fcc1: ARABIC LIGATURE FEH WITH MEEM INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fcc2: ARABIC LIGATURE QAF WITH HAH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fcc3: ARABIC LIGATURE QAF WITH MEEM INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fcc4: ARABIC LIGATURE KAF WITH JEEM INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fcc5: ARABIC LIGATURE KAF WITH HAH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fcc6: ARABIC LIGATURE KAF WITH KHAH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fcc7: ARABIC LIGATURE KAF WITH LAM INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fcc8: ARABIC LIGATURE KAF WITH MEEM INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fcc9: ARABIC LIGATURE LAM WITH JEEM INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fcca: ARABIC LIGATURE LAM WITH HAH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fccb: ARABIC LIGATURE LAM WITH KHAH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fccc: ARABIC LIGATURE LAM WITH MEEM INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fccd: ARABIC LIGATURE LAM WITH HEH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fcce: ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fccf: ARABIC LIGATURE MEEM WITH HAH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fcd0: ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fcd1: ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fcd2: ARABIC LIGATURE NOON WITH JEEM INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fcd3: ARABIC LIGATURE NOON WITH HAH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fcd4: ARABIC LIGATURE NOON WITH KHAH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fcd5: ARABIC LIGATURE NOON WITH MEEM INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fcd6: ARABIC LIGATURE NOON WITH HEH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fcd7: ARABIC LIGATURE HEH WITH JEEM INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fcd8: ARABIC LIGATURE HEH WITH MEEM INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fcd9: ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fcda: ARABIC LIGATURE YEH WITH JEEM INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fcdb: ARABIC LIGATURE YEH WITH HAH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fcdc: ARABIC LIGATURE YEH WITH KHAH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fcdd: ARABIC LIGATURE YEH WITH MEEM INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fcde: ARABIC LIGATURE YEH WITH HEH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fcdf: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fce0: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fce1: ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fce2: ARABIC LIGATURE BEH WITH HEH MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fce3: ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fce4: ARABIC LIGATURE TEH WITH HEH MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fce5: ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fce6: ARABIC LIGATURE THEH WITH HEH MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fce7: ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fce8: ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fce9: ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fcea: ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fceb: ARABIC LIGATURE KAF WITH LAM MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fcec: ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fced: ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fcee: ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fcef: ARABIC LIGATURE NOON WITH HEH MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fcf0: ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fcf1: ARABIC LIGATURE YEH WITH HEH MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fcf2: ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fcf3: ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fcf4: ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fcf5: ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fcf6: ARABIC LIGATURE TAH WITH YEH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fcf7: ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fcf8: ARABIC LIGATURE AIN WITH YEH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fcf9: ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fcfa: ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fcfb: ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fcfc: ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fcfd: ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fcfe: ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fcff: ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fd00: ARABIC LIGATURE HAH WITH YEH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fd01: ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fd02: ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fd03: ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fd04: ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fd05: ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fd06: ARABIC LIGATURE SAD WITH YEH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fd07: ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fd08: ARABIC LIGATURE DAD WITH YEH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fd09: ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fd0a: ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fd0b: ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fd0c: ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fd0d: ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fd0e: ARABIC LIGATURE SEEN WITH REH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fd0f: ARABIC LIGATURE SAD WITH REH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fd10: ARABIC LIGATURE DAD WITH REH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fd11: ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM*/
- RTUNI_ALPHA, /* U+00fd12: ARABIC LIGATURE TAH WITH YEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fd13: ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM*/
- RTUNI_ALPHA, /* U+00fd14: ARABIC LIGATURE AIN WITH YEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fd15: ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM*/
- RTUNI_ALPHA, /* U+00fd16: ARABIC LIGATURE GHAIN WITH YEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fd17: ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM*/
- RTUNI_ALPHA, /* U+00fd18: ARABIC LIGATURE SEEN WITH YEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fd19: ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM*/
- RTUNI_ALPHA, /* U+00fd1a: ARABIC LIGATURE SHEEN WITH YEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fd1b: ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM*/
- RTUNI_ALPHA, /* U+00fd1c: ARABIC LIGATURE HAH WITH YEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fd1d: ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM*/
- RTUNI_ALPHA, /* U+00fd1e: ARABIC LIGATURE JEEM WITH YEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fd1f: ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM*/
- RTUNI_ALPHA, /* U+00fd20: ARABIC LIGATURE KHAH WITH YEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fd21: ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM*/
- RTUNI_ALPHA, /* U+00fd22: ARABIC LIGATURE SAD WITH YEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fd23: ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM*/
- RTUNI_ALPHA, /* U+00fd24: ARABIC LIGATURE DAD WITH YEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fd25: ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM*/
- RTUNI_ALPHA, /* U+00fd26: ARABIC LIGATURE SHEEN WITH HAH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fd27: ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fd28: ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM*/
- RTUNI_ALPHA, /* U+00fd29: ARABIC LIGATURE SHEEN WITH REH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fd2a: ARABIC LIGATURE SEEN WITH REH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fd2b: ARABIC LIGATURE SAD WITH REH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fd2c: ARABIC LIGATURE DAD WITH REH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fd2d: ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fd2e: ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fd2f: ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fd30: ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fd31: ARABIC LIGATURE SEEN WITH HEH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fd32: ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fd33: ARABIC LIGATURE TAH WITH MEEM INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fd34: ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fd35: ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fd36: ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fd37: ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fd38: ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fd39: ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fd3a: ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fd3b: ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fd3c: ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM*/
- RTUNI_ALPHA, /* U+00fd3d: ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM*/
- 0, /* U+00fd3e: ORNATE LEFT PARENTHESIS*/
- 0, /* U+00fd3f: ORNATE RIGHT PARENTHESIS*/
- 0, /* U+00fd40: */
- 0, /* U+00fd41: */
- 0, /* U+00fd42: */
- 0, /* U+00fd43: */
- 0, /* U+00fd44: */
- 0, /* U+00fd45: */
- 0, /* U+00fd46: */
- 0, /* U+00fd47: */
- 0, /* U+00fd48: */
- 0, /* U+00fd49: */
- 0, /* U+00fd4a: */
- 0, /* U+00fd4b: */
- 0, /* U+00fd4c: */
- 0, /* U+00fd4d: */
- 0, /* U+00fd4e: */
- 0, /* U+00fd4f: */
- RTUNI_ALPHA, /* U+00fd50: ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fd51: ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM*/
- RTUNI_ALPHA, /* U+00fd52: ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fd53: ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fd54: ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fd55: ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fd56: ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fd57: ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fd58: ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fd59: ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fd5a: ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fd5b: ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM*/
- RTUNI_ALPHA, /* U+00fd5c: ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fd5d: ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fd5e: ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM*/
- RTUNI_ALPHA, /* U+00fd5f: ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fd60: ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fd61: ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fd62: ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM*/
- RTUNI_ALPHA, /* U+00fd63: ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fd64: ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fd65: ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fd66: ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM*/
- RTUNI_ALPHA, /* U+00fd67: ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM*/
- RTUNI_ALPHA, /* U+00fd68: ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fd69: ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fd6a: ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fd6b: ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fd6c: ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM*/
- RTUNI_ALPHA, /* U+00fd6d: ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fd6e: ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM*/
- RTUNI_ALPHA, /* U+00fd6f: ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM*/
- RTUNI_ALPHA, /* U+00fd70: ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fd71: ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fd72: ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fd73: ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fd74: ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fd75: ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM*/
- RTUNI_ALPHA, /* U+00fd76: ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM*/
- RTUNI_ALPHA, /* U+00fd77: ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fd78: ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM*/
- RTUNI_ALPHA, /* U+00fd79: ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM*/
- RTUNI_ALPHA, /* U+00fd7a: ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fd7b: ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM*/
- RTUNI_ALPHA, /* U+00fd7c: ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM*/
- RTUNI_ALPHA, /* U+00fd7d: ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fd7e: ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fd7f: ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM*/
- RTUNI_ALPHA, /* U+00fd80: ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM*/
- RTUNI_ALPHA, /* U+00fd81: ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fd82: ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM*/
- RTUNI_ALPHA, /* U+00fd83: ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fd84: ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM*/
- RTUNI_ALPHA, /* U+00fd85: ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM*/
- RTUNI_ALPHA, /* U+00fd86: ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fd87: ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fd88: ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fd89: ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fd8a: ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fd8b: ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fd8c: ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fd8d: ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fd8e: ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fd8f: ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM*/
- 0, /* U+00fd90: */
- 0, /* U+00fd91: */
- RTUNI_ALPHA, /* U+00fd92: ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fd93: ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fd94: ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fd95: ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fd96: ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM*/
- RTUNI_ALPHA, /* U+00fd97: ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM*/
- RTUNI_ALPHA, /* U+00fd98: ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fd99: ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM*/
- RTUNI_ALPHA, /* U+00fd9a: ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fd9b: ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM*/
- RTUNI_ALPHA, /* U+00fd9c: ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM*/
- RTUNI_ALPHA, /* U+00fd9d: ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fd9e: ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fd9f: ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fda0: ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM*/
- RTUNI_ALPHA, /* U+00fda1: ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fda2: ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM*/
- RTUNI_ALPHA, /* U+00fda3: ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fda4: ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM*/
- RTUNI_ALPHA, /* U+00fda5: ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fda6: ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM*/
- RTUNI_ALPHA, /* U+00fda7: ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM*/
- RTUNI_ALPHA, /* U+00fda8: ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM*/
- RTUNI_ALPHA, /* U+00fda9: ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fdaa: ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fdab: ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fdac: ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fdad: ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fdae: ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fdaf: ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fdb0: ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fdb1: ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fdb2: ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fdb3: ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fdb4: ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fdb5: ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fdb6: ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fdb7: ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fdb8: ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fdb9: ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fdba: ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fdbb: ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM*/
- RTUNI_ALPHA, /* U+00fdbc: ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM*/
- RTUNI_ALPHA, /* U+00fdbd: ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fdbe: ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fdbf: ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fdc0: ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fdc1: ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fdc2: ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fdc3: ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fdc4: ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fdc5: ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fdc6: ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fdc7: ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM*/
- 0, /* U+00fdc8: */
- 0, /* U+00fdc9: */
- 0, /* U+00fdca: */
- 0, /* U+00fdcb: */
- 0, /* U+00fdcc: */
- 0, /* U+00fdcd: */
- 0, /* U+00fdce: */
- 0, /* U+00fdcf: */
- 0, /* U+00fdd0: */
- 0, /* U+00fdd1: */
- 0, /* U+00fdd2: */
- 0, /* U+00fdd3: */
- 0, /* U+00fdd4: */
- 0, /* U+00fdd5: */
- 0, /* U+00fdd6: */
- 0, /* U+00fdd7: */
- 0, /* U+00fdd8: */
- 0, /* U+00fdd9: */
- 0, /* U+00fdda: */
- 0, /* U+00fddb: */
- 0, /* U+00fddc: */
- 0, /* U+00fddd: */
- 0, /* U+00fdde: */
- 0, /* U+00fddf: */
- 0, /* U+00fde0: */
- 0, /* U+00fde1: */
- 0, /* U+00fde2: */
- 0, /* U+00fde3: */
- 0, /* U+00fde4: */
- 0, /* U+00fde5: */
- 0, /* U+00fde6: */
- 0, /* U+00fde7: */
- 0, /* U+00fde8: */
- 0, /* U+00fde9: */
- 0, /* U+00fdea: */
- 0, /* U+00fdeb: */
- 0, /* U+00fdec: */
- 0, /* U+00fded: */
- 0, /* U+00fdee: */
- 0, /* U+00fdef: */
- RTUNI_ALPHA, /* U+00fdf0: ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fdf1: ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fdf2: ARABIC LIGATURE ALLAH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fdf3: ARABIC LIGATURE AKBAR ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fdf4: ARABIC LIGATURE MOHAMMAD ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fdf5: ARABIC LIGATURE SALAM ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fdf6: ARABIC LIGATURE RASOUL ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fdf7: ARABIC LIGATURE ALAYHE ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fdf8: ARABIC LIGATURE WASALLAM ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fdf9: ARABIC LIGATURE SALLA ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fdfa: ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM*/
- RTUNI_ALPHA, /* U+00fdfb: ARABIC LIGATURE JALLAJALALOUHOU*/
- 0, /* U+00fdfc: RIAL SIGN*/
- 0, /* U+00fdfd: ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM*/
- 0, /* U+00fdfe: */
- 0, /* U+00fdff: */
- 0, /* U+00fe00: VARIATION SELECTOR-1*/
- 0, /* U+00fe01: VARIATION SELECTOR-2*/
- 0, /* U+00fe02: VARIATION SELECTOR-3*/
- 0, /* U+00fe03: VARIATION SELECTOR-4*/
- 0, /* U+00fe04: VARIATION SELECTOR-5*/
- 0, /* U+00fe05: VARIATION SELECTOR-6*/
- 0, /* U+00fe06: VARIATION SELECTOR-7*/
- 0, /* U+00fe07: VARIATION SELECTOR-8*/
- 0, /* U+00fe08: VARIATION SELECTOR-9*/
- 0, /* U+00fe09: VARIATION SELECTOR-10*/
- 0, /* U+00fe0a: VARIATION SELECTOR-11*/
- 0, /* U+00fe0b: VARIATION SELECTOR-12*/
- 0, /* U+00fe0c: VARIATION SELECTOR-13*/
- 0, /* U+00fe0d: VARIATION SELECTOR-14*/
- 0, /* U+00fe0e: VARIATION SELECTOR-15*/
- 0, /* U+00fe0f: VARIATION SELECTOR-16*/
- 0, /* U+00fe10: PRESENTATION FORM FOR VERTICAL COMMA*/
- 0, /* U+00fe11: PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA*/
- 0, /* U+00fe12: PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP*/
- 0, /* U+00fe13: PRESENTATION FORM FOR VERTICAL COLON*/
- 0, /* U+00fe14: PRESENTATION FORM FOR VERTICAL SEMICOLON*/
- 0, /* U+00fe15: PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK*/
- 0, /* U+00fe16: PRESENTATION FORM FOR VERTICAL QUESTION MARK*/
- 0, /* U+00fe17: PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET*/
- 0, /* U+00fe18: PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET*/
- 0, /* U+00fe19: PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS*/
- 0, /* U+00fe1a: */
- 0, /* U+00fe1b: */
- 0, /* U+00fe1c: */
- 0, /* U+00fe1d: */
- 0, /* U+00fe1e: */
- 0, /* U+00fe1f: */
- 0, /* U+00fe20: COMBINING LIGATURE LEFT HALF*/
- 0, /* U+00fe21: COMBINING LIGATURE RIGHT HALF*/
- 0, /* U+00fe22: COMBINING DOUBLE TILDE LEFT HALF*/
- 0, /* U+00fe23: COMBINING DOUBLE TILDE RIGHT HALF*/
- 0, /* U+00fe24: */
- 0, /* U+00fe25: */
- 0, /* U+00fe26: */
- 0, /* U+00fe27: */
- 0, /* U+00fe28: */
- 0, /* U+00fe29: */
- 0, /* U+00fe2a: */
- 0, /* U+00fe2b: */
- 0, /* U+00fe2c: */
- 0, /* U+00fe2d: */
- 0, /* U+00fe2e: */
- 0, /* U+00fe2f: */
- 0, /* U+00fe30: PRESENTATION FORM FOR VERTICAL TWO DOT LEADER*/
- 0, /* U+00fe31: PRESENTATION FORM FOR VERTICAL EM DASH*/
- 0, /* U+00fe32: PRESENTATION FORM FOR VERTICAL EN DASH*/
- 0, /* U+00fe33: PRESENTATION FORM FOR VERTICAL LOW LINE*/
- 0, /* U+00fe34: PRESENTATION FORM FOR VERTICAL WAVY LOW LINE*/
- 0, /* U+00fe35: PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS*/
- 0, /* U+00fe36: PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS*/
- 0, /* U+00fe37: PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET*/
- 0, /* U+00fe38: PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET*/
- 0, /* U+00fe39: PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET*/
- 0, /* U+00fe3a: PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET*/
- 0, /* U+00fe3b: PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET*/
- 0, /* U+00fe3c: PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET*/
- 0, /* U+00fe3d: PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET*/
- 0, /* U+00fe3e: PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET*/
- 0, /* U+00fe3f: PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET*/
- 0, /* U+00fe40: PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET*/
- 0, /* U+00fe41: PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET*/
- 0, /* U+00fe42: PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET*/
- 0, /* U+00fe43: PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET*/
- 0, /* U+00fe44: PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET*/
- 0, /* U+00fe45: SESAME DOT*/
- 0, /* U+00fe46: WHITE SESAME DOT*/
- 0, /* U+00fe47: PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET*/
- 0, /* U+00fe48: PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET*/
- 0, /* U+00fe49: DASHED OVERLINE*/
- 0, /* U+00fe4a: CENTRELINE OVERLINE*/
- 0, /* U+00fe4b: WAVY OVERLINE*/
- 0, /* U+00fe4c: DOUBLE WAVY OVERLINE*/
- 0, /* U+00fe4d: DASHED LOW LINE*/
- 0, /* U+00fe4e: CENTRELINE LOW LINE*/
- 0, /* U+00fe4f: WAVY LOW LINE*/
- 0, /* U+00fe50: SMALL COMMA*/
- 0, /* U+00fe51: SMALL IDEOGRAPHIC COMMA*/
- 0, /* U+00fe52: SMALL FULL STOP*/
- 0, /* U+00fe53: */
- 0, /* U+00fe54: SMALL SEMICOLON*/
- 0, /* U+00fe55: SMALL COLON*/
- 0, /* U+00fe56: SMALL QUESTION MARK*/
- 0, /* U+00fe57: SMALL EXCLAMATION MARK*/
- 0, /* U+00fe58: SMALL EM DASH*/
- 0, /* U+00fe59: SMALL LEFT PARENTHESIS*/
- 0, /* U+00fe5a: SMALL RIGHT PARENTHESIS*/
- 0, /* U+00fe5b: SMALL LEFT CURLY BRACKET*/
- 0, /* U+00fe5c: SMALL RIGHT CURLY BRACKET*/
- 0, /* U+00fe5d: SMALL LEFT TORTOISE SHELL BRACKET*/
- 0, /* U+00fe5e: SMALL RIGHT TORTOISE SHELL BRACKET*/
- 0, /* U+00fe5f: SMALL NUMBER SIGN*/
- 0, /* U+00fe60: SMALL AMPERSAND*/
- 0, /* U+00fe61: SMALL ASTERISK*/
- 0, /* U+00fe62: SMALL PLUS SIGN*/
- 0, /* U+00fe63: SMALL HYPHEN-MINUS*/
- 0, /* U+00fe64: SMALL LESS-THAN SIGN*/
- 0, /* U+00fe65: SMALL GREATER-THAN SIGN*/
- 0, /* U+00fe66: SMALL EQUALS SIGN*/
- 0, /* U+00fe67: */
- 0, /* U+00fe68: SMALL REVERSE SOLIDUS*/
- 0, /* U+00fe69: SMALL DOLLAR SIGN*/
- 0, /* U+00fe6a: SMALL PERCENT SIGN*/
- 0, /* U+00fe6b: SMALL COMMERCIAL AT*/
- 0, /* U+00fe6c: */
- 0, /* U+00fe6d: */
- 0, /* U+00fe6e: */
- 0, /* U+00fe6f: */
- RTUNI_ALPHA, /* U+00fe70: ARABIC FATHATAN ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fe71: ARABIC TATWEEL WITH FATHATAN ABOVE*/
- RTUNI_ALPHA, /* U+00fe72: ARABIC DAMMATAN ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fe73: ARABIC TAIL FRAGMENT*/
- RTUNI_ALPHA, /* U+00fe74: ARABIC KASRATAN ISOLATED FORM*/
- 0, /* U+00fe75: */
- RTUNI_ALPHA, /* U+00fe76: ARABIC FATHA ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fe77: ARABIC FATHA MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fe78: ARABIC DAMMA ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fe79: ARABIC DAMMA MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fe7a: ARABIC KASRA ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fe7b: ARABIC KASRA MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fe7c: ARABIC SHADDA ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fe7d: ARABIC SHADDA MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fe7e: ARABIC SUKUN ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fe7f: ARABIC SUKUN MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fe80: ARABIC LETTER HAMZA ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fe81: ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fe82: ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM*/
- RTUNI_ALPHA, /* U+00fe83: ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fe84: ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM*/
- RTUNI_ALPHA, /* U+00fe85: ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fe86: ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM*/
- RTUNI_ALPHA, /* U+00fe87: ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fe88: ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM*/
- RTUNI_ALPHA, /* U+00fe89: ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fe8a: ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM*/
- RTUNI_ALPHA, /* U+00fe8b: ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fe8c: ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fe8d: ARABIC LETTER ALEF ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fe8e: ARABIC LETTER ALEF FINAL FORM*/
- RTUNI_ALPHA, /* U+00fe8f: ARABIC LETTER BEH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fe90: ARABIC LETTER BEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fe91: ARABIC LETTER BEH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fe92: ARABIC LETTER BEH MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fe93: ARABIC LETTER TEH MARBUTA ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fe94: ARABIC LETTER TEH MARBUTA FINAL FORM*/
- RTUNI_ALPHA, /* U+00fe95: ARABIC LETTER TEH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fe96: ARABIC LETTER TEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fe97: ARABIC LETTER TEH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fe98: ARABIC LETTER TEH MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fe99: ARABIC LETTER THEH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fe9a: ARABIC LETTER THEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fe9b: ARABIC LETTER THEH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fe9c: ARABIC LETTER THEH MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fe9d: ARABIC LETTER JEEM ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fe9e: ARABIC LETTER JEEM FINAL FORM*/
- RTUNI_ALPHA, /* U+00fe9f: ARABIC LETTER JEEM INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fea0: ARABIC LETTER JEEM MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fea1: ARABIC LETTER HAH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fea2: ARABIC LETTER HAH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fea3: ARABIC LETTER HAH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fea4: ARABIC LETTER HAH MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fea5: ARABIC LETTER KHAH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fea6: ARABIC LETTER KHAH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fea7: ARABIC LETTER KHAH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fea8: ARABIC LETTER KHAH MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fea9: ARABIC LETTER DAL ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00feaa: ARABIC LETTER DAL FINAL FORM*/
- RTUNI_ALPHA, /* U+00feab: ARABIC LETTER THAL ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00feac: ARABIC LETTER THAL FINAL FORM*/
- RTUNI_ALPHA, /* U+00fead: ARABIC LETTER REH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00feae: ARABIC LETTER REH FINAL FORM*/
- RTUNI_ALPHA, /* U+00feaf: ARABIC LETTER ZAIN ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00feb0: ARABIC LETTER ZAIN FINAL FORM*/
- RTUNI_ALPHA, /* U+00feb1: ARABIC LETTER SEEN ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00feb2: ARABIC LETTER SEEN FINAL FORM*/
- RTUNI_ALPHA, /* U+00feb3: ARABIC LETTER SEEN INITIAL FORM*/
- RTUNI_ALPHA, /* U+00feb4: ARABIC LETTER SEEN MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00feb5: ARABIC LETTER SHEEN ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00feb6: ARABIC LETTER SHEEN FINAL FORM*/
- RTUNI_ALPHA, /* U+00feb7: ARABIC LETTER SHEEN INITIAL FORM*/
- RTUNI_ALPHA, /* U+00feb8: ARABIC LETTER SHEEN MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00feb9: ARABIC LETTER SAD ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00feba: ARABIC LETTER SAD FINAL FORM*/
- RTUNI_ALPHA, /* U+00febb: ARABIC LETTER SAD INITIAL FORM*/
- RTUNI_ALPHA, /* U+00febc: ARABIC LETTER SAD MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00febd: ARABIC LETTER DAD ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00febe: ARABIC LETTER DAD FINAL FORM*/
- RTUNI_ALPHA, /* U+00febf: ARABIC LETTER DAD INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fec0: ARABIC LETTER DAD MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fec1: ARABIC LETTER TAH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fec2: ARABIC LETTER TAH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fec3: ARABIC LETTER TAH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fec4: ARABIC LETTER TAH MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fec5: ARABIC LETTER ZAH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fec6: ARABIC LETTER ZAH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fec7: ARABIC LETTER ZAH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fec8: ARABIC LETTER ZAH MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fec9: ARABIC LETTER AIN ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00feca: ARABIC LETTER AIN FINAL FORM*/
- RTUNI_ALPHA, /* U+00fecb: ARABIC LETTER AIN INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fecc: ARABIC LETTER AIN MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fecd: ARABIC LETTER GHAIN ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fece: ARABIC LETTER GHAIN FINAL FORM*/
- RTUNI_ALPHA, /* U+00fecf: ARABIC LETTER GHAIN INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fed0: ARABIC LETTER GHAIN MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fed1: ARABIC LETTER FEH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fed2: ARABIC LETTER FEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fed3: ARABIC LETTER FEH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fed4: ARABIC LETTER FEH MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fed5: ARABIC LETTER QAF ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fed6: ARABIC LETTER QAF FINAL FORM*/
- RTUNI_ALPHA, /* U+00fed7: ARABIC LETTER QAF INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fed8: ARABIC LETTER QAF MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fed9: ARABIC LETTER KAF ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00feda: ARABIC LETTER KAF FINAL FORM*/
- RTUNI_ALPHA, /* U+00fedb: ARABIC LETTER KAF INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fedc: ARABIC LETTER KAF MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fedd: ARABIC LETTER LAM ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fede: ARABIC LETTER LAM FINAL FORM*/
- RTUNI_ALPHA, /* U+00fedf: ARABIC LETTER LAM INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fee0: ARABIC LETTER LAM MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fee1: ARABIC LETTER MEEM ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fee2: ARABIC LETTER MEEM FINAL FORM*/
- RTUNI_ALPHA, /* U+00fee3: ARABIC LETTER MEEM INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fee4: ARABIC LETTER MEEM MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fee5: ARABIC LETTER NOON ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fee6: ARABIC LETTER NOON FINAL FORM*/
- RTUNI_ALPHA, /* U+00fee7: ARABIC LETTER NOON INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fee8: ARABIC LETTER NOON MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fee9: ARABIC LETTER HEH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00feea: ARABIC LETTER HEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00feeb: ARABIC LETTER HEH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00feec: ARABIC LETTER HEH MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00feed: ARABIC LETTER WAW ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00feee: ARABIC LETTER WAW FINAL FORM*/
- RTUNI_ALPHA, /* U+00feef: ARABIC LETTER ALEF MAKSURA ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fef0: ARABIC LETTER ALEF MAKSURA FINAL FORM*/
- RTUNI_ALPHA, /* U+00fef1: ARABIC LETTER YEH ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fef2: ARABIC LETTER YEH FINAL FORM*/
- RTUNI_ALPHA, /* U+00fef3: ARABIC LETTER YEH INITIAL FORM*/
- RTUNI_ALPHA, /* U+00fef4: ARABIC LETTER YEH MEDIAL FORM*/
- RTUNI_ALPHA, /* U+00fef5: ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fef6: ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM*/
- RTUNI_ALPHA, /* U+00fef7: ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fef8: ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM*/
- RTUNI_ALPHA, /* U+00fef9: ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fefa: ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM*/
- RTUNI_ALPHA, /* U+00fefb: ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM*/
- RTUNI_ALPHA, /* U+00fefc: ARABIC LIGATURE LAM WITH ALEF FINAL FORM*/
- 0, /* U+00fefd: */
- 0, /* U+00fefe: */
- 0, /* U+00feff: ZERO WIDTH NO-BREAK SPACE*/
- 0, /* U+00ff00: */
- 0, /* U+00ff01: FULLWIDTH EXCLAMATION MARK*/
- 0, /* U+00ff02: FULLWIDTH QUOTATION MARK*/
- 0, /* U+00ff03: FULLWIDTH NUMBER SIGN*/
- 0, /* U+00ff04: FULLWIDTH DOLLAR SIGN*/
- 0, /* U+00ff05: FULLWIDTH PERCENT SIGN*/
- 0, /* U+00ff06: FULLWIDTH AMPERSAND*/
- 0, /* U+00ff07: FULLWIDTH APOSTROPHE*/
- 0, /* U+00ff08: FULLWIDTH LEFT PARENTHESIS*/
- 0, /* U+00ff09: FULLWIDTH RIGHT PARENTHESIS*/
- 0, /* U+00ff0a: FULLWIDTH ASTERISK*/
- 0, /* U+00ff0b: FULLWIDTH PLUS SIGN*/
- 0, /* U+00ff0c: FULLWIDTH COMMA*/
- 0, /* U+00ff0d: FULLWIDTH HYPHEN-MINUS*/
- 0, /* U+00ff0e: FULLWIDTH FULL STOP*/
- 0, /* U+00ff0f: FULLWIDTH SOLIDUS*/
- RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+00ff10: FULLWIDTH DIGIT ZERO*/
- RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+00ff11: FULLWIDTH DIGIT ONE*/
- RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+00ff12: FULLWIDTH DIGIT TWO*/
- RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+00ff13: FULLWIDTH DIGIT THREE*/
- RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+00ff14: FULLWIDTH DIGIT FOUR*/
- RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+00ff15: FULLWIDTH DIGIT FIVE*/
- RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+00ff16: FULLWIDTH DIGIT SIX*/
- RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+00ff17: FULLWIDTH DIGIT SEVEN*/
- RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+00ff18: FULLWIDTH DIGIT EIGHT*/
- RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+00ff19: FULLWIDTH DIGIT NINE*/
- 0, /* U+00ff1a: FULLWIDTH COLON*/
- 0, /* U+00ff1b: FULLWIDTH SEMICOLON*/
- 0, /* U+00ff1c: FULLWIDTH LESS-THAN SIGN*/
- 0, /* U+00ff1d: FULLWIDTH EQUALS SIGN*/
- 0, /* U+00ff1e: FULLWIDTH GREATER-THAN SIGN*/
- 0, /* U+00ff1f: FULLWIDTH QUESTION MARK*/
- 0, /* U+00ff20: FULLWIDTH COMMERCIAL AT*/
- RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_UPPER, /* U+00ff21: FULLWIDTH LATIN CAPITAL LETTER A*/
- RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_UPPER, /* U+00ff22: FULLWIDTH LATIN CAPITAL LETTER B*/
- RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_UPPER, /* U+00ff23: FULLWIDTH LATIN CAPITAL LETTER C*/
- RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_UPPER, /* U+00ff24: FULLWIDTH LATIN CAPITAL LETTER D*/
- RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_UPPER, /* U+00ff25: FULLWIDTH LATIN CAPITAL LETTER E*/
- RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_UPPER, /* U+00ff26: FULLWIDTH LATIN CAPITAL LETTER F*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff27: FULLWIDTH LATIN CAPITAL LETTER G*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff28: FULLWIDTH LATIN CAPITAL LETTER H*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff29: FULLWIDTH LATIN CAPITAL LETTER I*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff2a: FULLWIDTH LATIN CAPITAL LETTER J*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff2b: FULLWIDTH LATIN CAPITAL LETTER K*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff2c: FULLWIDTH LATIN CAPITAL LETTER L*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff2d: FULLWIDTH LATIN CAPITAL LETTER M*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff2e: FULLWIDTH LATIN CAPITAL LETTER N*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff2f: FULLWIDTH LATIN CAPITAL LETTER O*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff30: FULLWIDTH LATIN CAPITAL LETTER P*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff31: FULLWIDTH LATIN CAPITAL LETTER Q*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff32: FULLWIDTH LATIN CAPITAL LETTER R*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff33: FULLWIDTH LATIN CAPITAL LETTER S*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff34: FULLWIDTH LATIN CAPITAL LETTER T*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff35: FULLWIDTH LATIN CAPITAL LETTER U*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff36: FULLWIDTH LATIN CAPITAL LETTER V*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff37: FULLWIDTH LATIN CAPITAL LETTER W*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff38: FULLWIDTH LATIN CAPITAL LETTER X*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff39: FULLWIDTH LATIN CAPITAL LETTER Y*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff3a: FULLWIDTH LATIN CAPITAL LETTER Z*/
- 0, /* U+00ff3b: FULLWIDTH LEFT SQUARE BRACKET*/
- 0, /* U+00ff3c: FULLWIDTH REVERSE SOLIDUS*/
- 0, /* U+00ff3d: FULLWIDTH RIGHT SQUARE BRACKET*/
- 0, /* U+00ff3e: FULLWIDTH CIRCUMFLEX ACCENT*/
- 0, /* U+00ff3f: FULLWIDTH LOW LINE*/
- 0, /* U+00ff40: FULLWIDTH GRAVE ACCENT*/
- RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_LOWER, /* U+00ff41: FULLWIDTH LATIN SMALL LETTER A*/
- RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_LOWER, /* U+00ff42: FULLWIDTH LATIN SMALL LETTER B*/
- RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_LOWER, /* U+00ff43: FULLWIDTH LATIN SMALL LETTER C*/
- RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_LOWER, /* U+00ff44: FULLWIDTH LATIN SMALL LETTER D*/
- RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_LOWER, /* U+00ff45: FULLWIDTH LATIN SMALL LETTER E*/
- RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_LOWER, /* U+00ff46: FULLWIDTH LATIN SMALL LETTER F*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff47: FULLWIDTH LATIN SMALL LETTER G*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff48: FULLWIDTH LATIN SMALL LETTER H*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff49: FULLWIDTH LATIN SMALL LETTER I*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff4a: FULLWIDTH LATIN SMALL LETTER J*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff4b: FULLWIDTH LATIN SMALL LETTER K*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff4c: FULLWIDTH LATIN SMALL LETTER L*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff4d: FULLWIDTH LATIN SMALL LETTER M*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff4e: FULLWIDTH LATIN SMALL LETTER N*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff4f: FULLWIDTH LATIN SMALL LETTER O*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff50: FULLWIDTH LATIN SMALL LETTER P*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff51: FULLWIDTH LATIN SMALL LETTER Q*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff52: FULLWIDTH LATIN SMALL LETTER R*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff53: FULLWIDTH LATIN SMALL LETTER S*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff54: FULLWIDTH LATIN SMALL LETTER T*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff55: FULLWIDTH LATIN SMALL LETTER U*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff56: FULLWIDTH LATIN SMALL LETTER V*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff57: FULLWIDTH LATIN SMALL LETTER W*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff58: FULLWIDTH LATIN SMALL LETTER X*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff59: FULLWIDTH LATIN SMALL LETTER Y*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff5a: FULLWIDTH LATIN SMALL LETTER Z*/
- 0, /* U+00ff5b: FULLWIDTH LEFT CURLY BRACKET*/
- 0, /* U+00ff5c: FULLWIDTH VERTICAL LINE*/
- 0, /* U+00ff5d: FULLWIDTH RIGHT CURLY BRACKET*/
- 0, /* U+00ff5e: FULLWIDTH TILDE*/
- 0, /* U+00ff5f: FULLWIDTH LEFT WHITE PARENTHESIS*/
- 0, /* U+00ff60: FULLWIDTH RIGHT WHITE PARENTHESIS*/
- 0, /* U+00ff61: HALFWIDTH IDEOGRAPHIC FULL STOP*/
- 0, /* U+00ff62: HALFWIDTH LEFT CORNER BRACKET*/
- 0, /* U+00ff63: HALFWIDTH RIGHT CORNER BRACKET*/
- 0, /* U+00ff64: HALFWIDTH IDEOGRAPHIC COMMA*/
- 0, /* U+00ff65: HALFWIDTH KATAKANA MIDDLE DOT*/
- RTUNI_ALPHA, /* U+00ff66: HALFWIDTH KATAKANA LETTER WO*/
- RTUNI_ALPHA, /* U+00ff67: HALFWIDTH KATAKANA LETTER SMALL A*/
- RTUNI_ALPHA, /* U+00ff68: HALFWIDTH KATAKANA LETTER SMALL I*/
- RTUNI_ALPHA, /* U+00ff69: HALFWIDTH KATAKANA LETTER SMALL U*/
- RTUNI_ALPHA, /* U+00ff6a: HALFWIDTH KATAKANA LETTER SMALL E*/
- RTUNI_ALPHA, /* U+00ff6b: HALFWIDTH KATAKANA LETTER SMALL O*/
- RTUNI_ALPHA, /* U+00ff6c: HALFWIDTH KATAKANA LETTER SMALL YA*/
- RTUNI_ALPHA, /* U+00ff6d: HALFWIDTH KATAKANA LETTER SMALL YU*/
- RTUNI_ALPHA, /* U+00ff6e: HALFWIDTH KATAKANA LETTER SMALL YO*/
- RTUNI_ALPHA, /* U+00ff6f: HALFWIDTH KATAKANA LETTER SMALL TU*/
- RTUNI_ALPHA, /* U+00ff70: HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK*/
- RTUNI_ALPHA, /* U+00ff71: HALFWIDTH KATAKANA LETTER A*/
- RTUNI_ALPHA, /* U+00ff72: HALFWIDTH KATAKANA LETTER I*/
- RTUNI_ALPHA, /* U+00ff73: HALFWIDTH KATAKANA LETTER U*/
- RTUNI_ALPHA, /* U+00ff74: HALFWIDTH KATAKANA LETTER E*/
- RTUNI_ALPHA, /* U+00ff75: HALFWIDTH KATAKANA LETTER O*/
- RTUNI_ALPHA, /* U+00ff76: HALFWIDTH KATAKANA LETTER KA*/
- RTUNI_ALPHA, /* U+00ff77: HALFWIDTH KATAKANA LETTER KI*/
- RTUNI_ALPHA, /* U+00ff78: HALFWIDTH KATAKANA LETTER KU*/
- RTUNI_ALPHA, /* U+00ff79: HALFWIDTH KATAKANA LETTER KE*/
- RTUNI_ALPHA, /* U+00ff7a: HALFWIDTH KATAKANA LETTER KO*/
- RTUNI_ALPHA, /* U+00ff7b: HALFWIDTH KATAKANA LETTER SA*/
- RTUNI_ALPHA, /* U+00ff7c: HALFWIDTH KATAKANA LETTER SI*/
- RTUNI_ALPHA, /* U+00ff7d: HALFWIDTH KATAKANA LETTER SU*/
- RTUNI_ALPHA, /* U+00ff7e: HALFWIDTH KATAKANA LETTER SE*/
- RTUNI_ALPHA, /* U+00ff7f: HALFWIDTH KATAKANA LETTER SO*/
- RTUNI_ALPHA, /* U+00ff80: HALFWIDTH KATAKANA LETTER TA*/
- RTUNI_ALPHA, /* U+00ff81: HALFWIDTH KATAKANA LETTER TI*/
- RTUNI_ALPHA, /* U+00ff82: HALFWIDTH KATAKANA LETTER TU*/
- RTUNI_ALPHA, /* U+00ff83: HALFWIDTH KATAKANA LETTER TE*/
- RTUNI_ALPHA, /* U+00ff84: HALFWIDTH KATAKANA LETTER TO*/
- RTUNI_ALPHA, /* U+00ff85: HALFWIDTH KATAKANA LETTER NA*/
- RTUNI_ALPHA, /* U+00ff86: HALFWIDTH KATAKANA LETTER NI*/
- RTUNI_ALPHA, /* U+00ff87: HALFWIDTH KATAKANA LETTER NU*/
- RTUNI_ALPHA, /* U+00ff88: HALFWIDTH KATAKANA LETTER NE*/
- RTUNI_ALPHA, /* U+00ff89: HALFWIDTH KATAKANA LETTER NO*/
- RTUNI_ALPHA, /* U+00ff8a: HALFWIDTH KATAKANA LETTER HA*/
- RTUNI_ALPHA, /* U+00ff8b: HALFWIDTH KATAKANA LETTER HI*/
- RTUNI_ALPHA, /* U+00ff8c: HALFWIDTH KATAKANA LETTER HU*/
- RTUNI_ALPHA, /* U+00ff8d: HALFWIDTH KATAKANA LETTER HE*/
- RTUNI_ALPHA, /* U+00ff8e: HALFWIDTH KATAKANA LETTER HO*/
- RTUNI_ALPHA, /* U+00ff8f: HALFWIDTH KATAKANA LETTER MA*/
- RTUNI_ALPHA, /* U+00ff90: HALFWIDTH KATAKANA LETTER MI*/
- RTUNI_ALPHA, /* U+00ff91: HALFWIDTH KATAKANA LETTER MU*/
- RTUNI_ALPHA, /* U+00ff92: HALFWIDTH KATAKANA LETTER ME*/
- RTUNI_ALPHA, /* U+00ff93: HALFWIDTH KATAKANA LETTER MO*/
- RTUNI_ALPHA, /* U+00ff94: HALFWIDTH KATAKANA LETTER YA*/
- RTUNI_ALPHA, /* U+00ff95: HALFWIDTH KATAKANA LETTER YU*/
- RTUNI_ALPHA, /* U+00ff96: HALFWIDTH KATAKANA LETTER YO*/
- RTUNI_ALPHA, /* U+00ff97: HALFWIDTH KATAKANA LETTER RA*/
- RTUNI_ALPHA, /* U+00ff98: HALFWIDTH KATAKANA LETTER RI*/
- RTUNI_ALPHA, /* U+00ff99: HALFWIDTH KATAKANA LETTER RU*/
- RTUNI_ALPHA, /* U+00ff9a: HALFWIDTH KATAKANA LETTER RE*/
- RTUNI_ALPHA, /* U+00ff9b: HALFWIDTH KATAKANA LETTER RO*/
- RTUNI_ALPHA, /* U+00ff9c: HALFWIDTH KATAKANA LETTER WA*/
- RTUNI_ALPHA, /* U+00ff9d: HALFWIDTH KATAKANA LETTER N*/
- RTUNI_ALPHA, /* U+00ff9e: HALFWIDTH KATAKANA VOICED SOUND MARK*/
- RTUNI_ALPHA, /* U+00ff9f: HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK*/
- RTUNI_ALPHA, /* U+00ffa0: HALFWIDTH HANGUL FILLER*/
- RTUNI_ALPHA, /* U+00ffa1: HALFWIDTH HANGUL LETTER KIYEOK*/
- RTUNI_ALPHA, /* U+00ffa2: HALFWIDTH HANGUL LETTER SSANGKIYEOK*/
- RTUNI_ALPHA, /* U+00ffa3: HALFWIDTH HANGUL LETTER KIYEOK-SIOS*/
- RTUNI_ALPHA, /* U+00ffa4: HALFWIDTH HANGUL LETTER NIEUN*/
- RTUNI_ALPHA, /* U+00ffa5: HALFWIDTH HANGUL LETTER NIEUN-CIEUC*/
- RTUNI_ALPHA, /* U+00ffa6: HALFWIDTH HANGUL LETTER NIEUN-HIEUH*/
- RTUNI_ALPHA, /* U+00ffa7: HALFWIDTH HANGUL LETTER TIKEUT*/
- RTUNI_ALPHA, /* U+00ffa8: HALFWIDTH HANGUL LETTER SSANGTIKEUT*/
- RTUNI_ALPHA, /* U+00ffa9: HALFWIDTH HANGUL LETTER RIEUL*/
- RTUNI_ALPHA, /* U+00ffaa: HALFWIDTH HANGUL LETTER RIEUL-KIYEOK*/
- RTUNI_ALPHA, /* U+00ffab: HALFWIDTH HANGUL LETTER RIEUL-MIEUM*/
- RTUNI_ALPHA, /* U+00ffac: HALFWIDTH HANGUL LETTER RIEUL-PIEUP*/
- RTUNI_ALPHA, /* U+00ffad: HALFWIDTH HANGUL LETTER RIEUL-SIOS*/
- RTUNI_ALPHA, /* U+00ffae: HALFWIDTH HANGUL LETTER RIEUL-THIEUTH*/
- RTUNI_ALPHA, /* U+00ffaf: HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH*/
- RTUNI_ALPHA, /* U+00ffb0: HALFWIDTH HANGUL LETTER RIEUL-HIEUH*/
- RTUNI_ALPHA, /* U+00ffb1: HALFWIDTH HANGUL LETTER MIEUM*/
- RTUNI_ALPHA, /* U+00ffb2: HALFWIDTH HANGUL LETTER PIEUP*/
- RTUNI_ALPHA, /* U+00ffb3: HALFWIDTH HANGUL LETTER SSANGPIEUP*/
- RTUNI_ALPHA, /* U+00ffb4: HALFWIDTH HANGUL LETTER PIEUP-SIOS*/
- RTUNI_ALPHA, /* U+00ffb5: HALFWIDTH HANGUL LETTER SIOS*/
- RTUNI_ALPHA, /* U+00ffb6: HALFWIDTH HANGUL LETTER SSANGSIOS*/
- RTUNI_ALPHA, /* U+00ffb7: HALFWIDTH HANGUL LETTER IEUNG*/
- RTUNI_ALPHA, /* U+00ffb8: HALFWIDTH HANGUL LETTER CIEUC*/
- RTUNI_ALPHA, /* U+00ffb9: HALFWIDTH HANGUL LETTER SSANGCIEUC*/
- RTUNI_ALPHA, /* U+00ffba: HALFWIDTH HANGUL LETTER CHIEUCH*/
- RTUNI_ALPHA, /* U+00ffbb: HALFWIDTH HANGUL LETTER KHIEUKH*/
- RTUNI_ALPHA, /* U+00ffbc: HALFWIDTH HANGUL LETTER THIEUTH*/
- RTUNI_ALPHA, /* U+00ffbd: HALFWIDTH HANGUL LETTER PHIEUPH*/
- RTUNI_ALPHA, /* U+00ffbe: HALFWIDTH HANGUL LETTER HIEUH*/
- 0, /* U+00ffbf: */
- 0, /* U+00ffc0: */
- 0, /* U+00ffc1: */
- RTUNI_ALPHA, /* U+00ffc2: HALFWIDTH HANGUL LETTER A*/
- RTUNI_ALPHA, /* U+00ffc3: HALFWIDTH HANGUL LETTER AE*/
- RTUNI_ALPHA, /* U+00ffc4: HALFWIDTH HANGUL LETTER YA*/
- RTUNI_ALPHA, /* U+00ffc5: HALFWIDTH HANGUL LETTER YAE*/
- RTUNI_ALPHA, /* U+00ffc6: HALFWIDTH HANGUL LETTER EO*/
- RTUNI_ALPHA, /* U+00ffc7: HALFWIDTH HANGUL LETTER E*/
- 0, /* U+00ffc8: */
- 0, /* U+00ffc9: */
- RTUNI_ALPHA, /* U+00ffca: HALFWIDTH HANGUL LETTER YEO*/
- RTUNI_ALPHA, /* U+00ffcb: HALFWIDTH HANGUL LETTER YE*/
- RTUNI_ALPHA, /* U+00ffcc: HALFWIDTH HANGUL LETTER O*/
- RTUNI_ALPHA, /* U+00ffcd: HALFWIDTH HANGUL LETTER WA*/
- RTUNI_ALPHA, /* U+00ffce: HALFWIDTH HANGUL LETTER WAE*/
- RTUNI_ALPHA, /* U+00ffcf: HALFWIDTH HANGUL LETTER OE*/
- 0, /* U+00ffd0: */
- 0, /* U+00ffd1: */
- RTUNI_ALPHA, /* U+00ffd2: HALFWIDTH HANGUL LETTER YO*/
- RTUNI_ALPHA, /* U+00ffd3: HALFWIDTH HANGUL LETTER U*/
- RTUNI_ALPHA, /* U+00ffd4: HALFWIDTH HANGUL LETTER WEO*/
- RTUNI_ALPHA, /* U+00ffd5: HALFWIDTH HANGUL LETTER WE*/
- RTUNI_ALPHA, /* U+00ffd6: HALFWIDTH HANGUL LETTER WI*/
- RTUNI_ALPHA, /* U+00ffd7: HALFWIDTH HANGUL LETTER YU*/
- 0, /* U+00ffd8: */
- 0, /* U+00ffd9: */
- RTUNI_ALPHA, /* U+00ffda: HALFWIDTH HANGUL LETTER EU*/
- RTUNI_ALPHA, /* U+00ffdb: HALFWIDTH HANGUL LETTER YI*/
- RTUNI_ALPHA, /* U+00ffdc: HALFWIDTH HANGUL LETTER I*/
- 0, /* U+00ffdd: */
- 0, /* U+00ffde: */
- 0, /* U+00ffdf: */
- 0, /* U+00ffe0: FULLWIDTH CENT SIGN*/
- 0, /* U+00ffe1: FULLWIDTH POUND SIGN*/
- 0, /* U+00ffe2: FULLWIDTH NOT SIGN*/
- 0, /* U+00ffe3: FULLWIDTH MACRON*/
- 0, /* U+00ffe4: FULLWIDTH BROKEN BAR*/
- 0, /* U+00ffe5: FULLWIDTH YEN SIGN*/
- 0, /* U+00ffe6: FULLWIDTH WON SIGN*/
- 0, /* U+00ffe7: */
- 0, /* U+00ffe8: HALFWIDTH FORMS LIGHT VERTICAL*/
- 0, /* U+00ffe9: HALFWIDTH LEFTWARDS ARROW*/
- 0, /* U+00ffea: HALFWIDTH UPWARDS ARROW*/
- 0, /* U+00ffeb: HALFWIDTH RIGHTWARDS ARROW*/
- 0, /* U+00ffec: HALFWIDTH DOWNWARDS ARROW*/
- 0, /* U+00ffed: HALFWIDTH BLACK SQUARE*/
- 0, /* U+00ffee: HALFWIDTH WHITE CIRCLE*/
- 0, /* U+00ffef: */
- 0, /* U+00fff0: */
- 0, /* U+00fff1: */
- 0, /* U+00fff2: */
- 0, /* U+00fff3: */
- 0, /* U+00fff4: */
- 0, /* U+00fff5: */
- 0, /* U+00fff6: */
- 0, /* U+00fff7: */
- 0, /* U+00fff8: */
- 0, /* U+00fff9: INTERLINEAR ANNOTATION ANCHOR*/
- 0, /* U+00fffa: INTERLINEAR ANNOTATION SEPARATOR*/
- 0, /* U+00fffb: INTERLINEAR ANNOTATION TERMINATOR*/
- 0, /* U+00fffc: OBJECT REPLACEMENT CHARACTER*/
- 0, /* U+00fffd: REPLACEMENT CHARACTER*/
- 0, /* U+00fffe: */
- 0, /* U+00ffff: */
- RTUNI_ALPHA, /* U+010000: LINEAR B SYLLABLE B008 A*/
- RTUNI_ALPHA, /* U+010001: LINEAR B SYLLABLE B038 E*/
- RTUNI_ALPHA, /* U+010002: LINEAR B SYLLABLE B028 I*/
- RTUNI_ALPHA, /* U+010003: LINEAR B SYLLABLE B061 O*/
- RTUNI_ALPHA, /* U+010004: LINEAR B SYLLABLE B010 U*/
- RTUNI_ALPHA, /* U+010005: LINEAR B SYLLABLE B001 DA*/
- RTUNI_ALPHA, /* U+010006: LINEAR B SYLLABLE B045 DE*/
- RTUNI_ALPHA, /* U+010007: LINEAR B SYLLABLE B007 DI*/
- RTUNI_ALPHA, /* U+010008: LINEAR B SYLLABLE B014 DO*/
- RTUNI_ALPHA, /* U+010009: LINEAR B SYLLABLE B051 DU*/
- RTUNI_ALPHA, /* U+01000a: LINEAR B SYLLABLE B057 JA*/
- RTUNI_ALPHA, /* U+01000b: LINEAR B SYLLABLE B046 JE*/
- 0, /* U+01000c: */
- RTUNI_ALPHA, /* U+01000d: LINEAR B SYLLABLE B036 JO*/
- RTUNI_ALPHA, /* U+01000e: LINEAR B SYLLABLE B065 JU*/
- RTUNI_ALPHA, /* U+01000f: LINEAR B SYLLABLE B077 KA*/
- RTUNI_ALPHA, /* U+010010: LINEAR B SYLLABLE B044 KE*/
- RTUNI_ALPHA, /* U+010011: LINEAR B SYLLABLE B067 KI*/
- RTUNI_ALPHA, /* U+010012: LINEAR B SYLLABLE B070 KO*/
- RTUNI_ALPHA, /* U+010013: LINEAR B SYLLABLE B081 KU*/
- RTUNI_ALPHA, /* U+010014: LINEAR B SYLLABLE B080 MA*/
- RTUNI_ALPHA, /* U+010015: LINEAR B SYLLABLE B013 ME*/
- RTUNI_ALPHA, /* U+010016: LINEAR B SYLLABLE B073 MI*/
- RTUNI_ALPHA, /* U+010017: LINEAR B SYLLABLE B015 MO*/
- RTUNI_ALPHA, /* U+010018: LINEAR B SYLLABLE B023 MU*/
- RTUNI_ALPHA, /* U+010019: LINEAR B SYLLABLE B006 NA*/
- RTUNI_ALPHA, /* U+01001a: LINEAR B SYLLABLE B024 NE*/
- RTUNI_ALPHA, /* U+01001b: LINEAR B SYLLABLE B030 NI*/
- RTUNI_ALPHA, /* U+01001c: LINEAR B SYLLABLE B052 NO*/
- RTUNI_ALPHA, /* U+01001d: LINEAR B SYLLABLE B055 NU*/
- RTUNI_ALPHA, /* U+01001e: LINEAR B SYLLABLE B003 PA*/
- RTUNI_ALPHA, /* U+01001f: LINEAR B SYLLABLE B072 PE*/
- RTUNI_ALPHA, /* U+010020: LINEAR B SYLLABLE B039 PI*/
- RTUNI_ALPHA, /* U+010021: LINEAR B SYLLABLE B011 PO*/
- RTUNI_ALPHA, /* U+010022: LINEAR B SYLLABLE B050 PU*/
- RTUNI_ALPHA, /* U+010023: LINEAR B SYLLABLE B016 QA*/
- RTUNI_ALPHA, /* U+010024: LINEAR B SYLLABLE B078 QE*/
- RTUNI_ALPHA, /* U+010025: LINEAR B SYLLABLE B021 QI*/
- RTUNI_ALPHA, /* U+010026: LINEAR B SYLLABLE B032 QO*/
- 0, /* U+010027: */
- RTUNI_ALPHA, /* U+010028: LINEAR B SYLLABLE B060 RA*/
- RTUNI_ALPHA, /* U+010029: LINEAR B SYLLABLE B027 RE*/
- RTUNI_ALPHA, /* U+01002a: LINEAR B SYLLABLE B053 RI*/
- RTUNI_ALPHA, /* U+01002b: LINEAR B SYLLABLE B002 RO*/
- RTUNI_ALPHA, /* U+01002c: LINEAR B SYLLABLE B026 RU*/
- RTUNI_ALPHA, /* U+01002d: LINEAR B SYLLABLE B031 SA*/
- RTUNI_ALPHA, /* U+01002e: LINEAR B SYLLABLE B009 SE*/
- RTUNI_ALPHA, /* U+01002f: LINEAR B SYLLABLE B041 SI*/
- RTUNI_ALPHA, /* U+010030: LINEAR B SYLLABLE B012 SO*/
- RTUNI_ALPHA, /* U+010031: LINEAR B SYLLABLE B058 SU*/
- RTUNI_ALPHA, /* U+010032: LINEAR B SYLLABLE B059 TA*/
- RTUNI_ALPHA, /* U+010033: LINEAR B SYLLABLE B004 TE*/
- RTUNI_ALPHA, /* U+010034: LINEAR B SYLLABLE B037 TI*/
- RTUNI_ALPHA, /* U+010035: LINEAR B SYLLABLE B005 TO*/
- RTUNI_ALPHA, /* U+010036: LINEAR B SYLLABLE B069 TU*/
- RTUNI_ALPHA, /* U+010037: LINEAR B SYLLABLE B054 WA*/
- RTUNI_ALPHA, /* U+010038: LINEAR B SYLLABLE B075 WE*/
- RTUNI_ALPHA, /* U+010039: LINEAR B SYLLABLE B040 WI*/
- RTUNI_ALPHA, /* U+01003a: LINEAR B SYLLABLE B042 WO*/
- 0, /* U+01003b: */
- RTUNI_ALPHA, /* U+01003c: LINEAR B SYLLABLE B017 ZA*/
- RTUNI_ALPHA, /* U+01003d: LINEAR B SYLLABLE B074 ZE*/
- 0, /* U+01003e: */
- RTUNI_ALPHA, /* U+01003f: LINEAR B SYLLABLE B020 ZO*/
- RTUNI_ALPHA, /* U+010040: LINEAR B SYLLABLE B025 A2*/
- RTUNI_ALPHA, /* U+010041: LINEAR B SYLLABLE B043 A3*/
- RTUNI_ALPHA, /* U+010042: LINEAR B SYLLABLE B085 AU*/
- RTUNI_ALPHA, /* U+010043: LINEAR B SYLLABLE B071 DWE*/
- RTUNI_ALPHA, /* U+010044: LINEAR B SYLLABLE B090 DWO*/
- RTUNI_ALPHA, /* U+010045: LINEAR B SYLLABLE B048 NWA*/
- RTUNI_ALPHA, /* U+010046: LINEAR B SYLLABLE B029 PU2*/
- RTUNI_ALPHA, /* U+010047: LINEAR B SYLLABLE B062 PTE*/
- RTUNI_ALPHA, /* U+010048: LINEAR B SYLLABLE B076 RA2*/
- RTUNI_ALPHA, /* U+010049: LINEAR B SYLLABLE B033 RA3*/
- RTUNI_ALPHA, /* U+01004a: LINEAR B SYLLABLE B068 RO2*/
- RTUNI_ALPHA, /* U+01004b: LINEAR B SYLLABLE B066 TA2*/
- RTUNI_ALPHA, /* U+01004c: LINEAR B SYLLABLE B087 TWE*/
- RTUNI_ALPHA, /* U+01004d: LINEAR B SYLLABLE B091 TWO*/
- 0, /* U+01004e: */
- 0, /* U+01004f: */
- RTUNI_ALPHA, /* U+010050: LINEAR B SYMBOL B018*/
- RTUNI_ALPHA, /* U+010051: LINEAR B SYMBOL B019*/
- RTUNI_ALPHA, /* U+010052: LINEAR B SYMBOL B022*/
- RTUNI_ALPHA, /* U+010053: LINEAR B SYMBOL B034*/
- RTUNI_ALPHA, /* U+010054: LINEAR B SYMBOL B047*/
- RTUNI_ALPHA, /* U+010055: LINEAR B SYMBOL B049*/
- RTUNI_ALPHA, /* U+010056: LINEAR B SYMBOL B056*/
- RTUNI_ALPHA, /* U+010057: LINEAR B SYMBOL B063*/
- RTUNI_ALPHA, /* U+010058: LINEAR B SYMBOL B064*/
- RTUNI_ALPHA, /* U+010059: LINEAR B SYMBOL B079*/
- RTUNI_ALPHA, /* U+01005a: LINEAR B SYMBOL B082*/
- RTUNI_ALPHA, /* U+01005b: LINEAR B SYMBOL B083*/
- RTUNI_ALPHA, /* U+01005c: LINEAR B SYMBOL B086*/
- RTUNI_ALPHA, /* U+01005d: LINEAR B SYMBOL B089*/
- 0, /* U+01005e: */
- 0, /* U+01005f: */
- 0, /* U+010060: */
- 0, /* U+010061: */
- 0, /* U+010062: */
- 0, /* U+010063: */
- 0, /* U+010064: */
- 0, /* U+010065: */
- 0, /* U+010066: */
- 0, /* U+010067: */
- 0, /* U+010068: */
- 0, /* U+010069: */
- 0, /* U+01006a: */
- 0, /* U+01006b: */
- 0, /* U+01006c: */
- 0, /* U+01006d: */
- 0, /* U+01006e: */
- 0, /* U+01006f: */
- 0, /* U+010070: */
- 0, /* U+010071: */
- 0, /* U+010072: */
- 0, /* U+010073: */
- 0, /* U+010074: */
- 0, /* U+010075: */
- 0, /* U+010076: */
- 0, /* U+010077: */
- 0, /* U+010078: */
- 0, /* U+010079: */
- 0, /* U+01007a: */
- 0, /* U+01007b: */
- 0, /* U+01007c: */
- 0, /* U+01007d: */
- 0, /* U+01007e: */
- 0, /* U+01007f: */
- RTUNI_ALPHA, /* U+010080: LINEAR B IDEOGRAM B100 MAN*/
- RTUNI_ALPHA, /* U+010081: LINEAR B IDEOGRAM B102 WOMAN*/
- RTUNI_ALPHA, /* U+010082: LINEAR B IDEOGRAM B104 DEER*/
- RTUNI_ALPHA, /* U+010083: LINEAR B IDEOGRAM B105 EQUID*/
- RTUNI_ALPHA, /* U+010084: LINEAR B IDEOGRAM B105F MARE*/
- RTUNI_ALPHA, /* U+010085: LINEAR B IDEOGRAM B105M STALLION*/
- RTUNI_ALPHA, /* U+010086: LINEAR B IDEOGRAM B106F EWE*/
- RTUNI_ALPHA, /* U+010087: LINEAR B IDEOGRAM B106M RAM*/
- RTUNI_ALPHA, /* U+010088: LINEAR B IDEOGRAM B107F SHE-GOAT*/
- RTUNI_ALPHA, /* U+010089: LINEAR B IDEOGRAM B107M HE-GOAT*/
- RTUNI_ALPHA, /* U+01008a: LINEAR B IDEOGRAM B108F SOW*/
- RTUNI_ALPHA, /* U+01008b: LINEAR B IDEOGRAM B108M BOAR*/
- RTUNI_ALPHA, /* U+01008c: LINEAR B IDEOGRAM B109F COW*/
- RTUNI_ALPHA, /* U+01008d: LINEAR B IDEOGRAM B109M BULL*/
- RTUNI_ALPHA, /* U+01008e: LINEAR B IDEOGRAM B120 WHEAT*/
- RTUNI_ALPHA, /* U+01008f: LINEAR B IDEOGRAM B121 BARLEY*/
- RTUNI_ALPHA, /* U+010090: LINEAR B IDEOGRAM B122 OLIVE*/
- RTUNI_ALPHA, /* U+010091: LINEAR B IDEOGRAM B123 SPICE*/
- RTUNI_ALPHA, /* U+010092: LINEAR B IDEOGRAM B125 CYPERUS*/
- RTUNI_ALPHA, /* U+010093: LINEAR B MONOGRAM B127 KAPO*/
- RTUNI_ALPHA, /* U+010094: LINEAR B MONOGRAM B128 KANAKO*/
- RTUNI_ALPHA, /* U+010095: LINEAR B IDEOGRAM B130 OIL*/
- RTUNI_ALPHA, /* U+010096: LINEAR B IDEOGRAM B131 WINE*/
- RTUNI_ALPHA, /* U+010097: LINEAR B IDEOGRAM B132*/
- RTUNI_ALPHA, /* U+010098: LINEAR B MONOGRAM B133 AREPA*/
- RTUNI_ALPHA, /* U+010099: LINEAR B MONOGRAM B135 MERI*/
- RTUNI_ALPHA, /* U+01009a: LINEAR B IDEOGRAM B140 BRONZE*/
- RTUNI_ALPHA, /* U+01009b: LINEAR B IDEOGRAM B141 GOLD*/
- RTUNI_ALPHA, /* U+01009c: LINEAR B IDEOGRAM B142*/
- RTUNI_ALPHA, /* U+01009d: LINEAR B IDEOGRAM B145 WOOL*/
- RTUNI_ALPHA, /* U+01009e: LINEAR B IDEOGRAM B146*/
- RTUNI_ALPHA, /* U+01009f: LINEAR B IDEOGRAM B150*/
- RTUNI_ALPHA, /* U+0100a0: LINEAR B IDEOGRAM B151 HORN*/
- RTUNI_ALPHA, /* U+0100a1: LINEAR B IDEOGRAM B152*/
- RTUNI_ALPHA, /* U+0100a2: LINEAR B IDEOGRAM B153*/
- RTUNI_ALPHA, /* U+0100a3: LINEAR B IDEOGRAM B154*/
- RTUNI_ALPHA, /* U+0100a4: LINEAR B MONOGRAM B156 TURO2*/
- RTUNI_ALPHA, /* U+0100a5: LINEAR B IDEOGRAM B157*/
- RTUNI_ALPHA, /* U+0100a6: LINEAR B IDEOGRAM B158*/
- RTUNI_ALPHA, /* U+0100a7: LINEAR B IDEOGRAM B159 CLOTH*/
- RTUNI_ALPHA, /* U+0100a8: LINEAR B IDEOGRAM B160*/
- RTUNI_ALPHA, /* U+0100a9: LINEAR B IDEOGRAM B161*/
- RTUNI_ALPHA, /* U+0100aa: LINEAR B IDEOGRAM B162 GARMENT*/
- RTUNI_ALPHA, /* U+0100ab: LINEAR B IDEOGRAM B163 ARMOUR*/
- RTUNI_ALPHA, /* U+0100ac: LINEAR B IDEOGRAM B164*/
- RTUNI_ALPHA, /* U+0100ad: LINEAR B IDEOGRAM B165*/
- RTUNI_ALPHA, /* U+0100ae: LINEAR B IDEOGRAM B166*/
- RTUNI_ALPHA, /* U+0100af: LINEAR B IDEOGRAM B167*/
- RTUNI_ALPHA, /* U+0100b0: LINEAR B IDEOGRAM B168*/
- RTUNI_ALPHA, /* U+0100b1: LINEAR B IDEOGRAM B169*/
- RTUNI_ALPHA, /* U+0100b2: LINEAR B IDEOGRAM B170*/
- RTUNI_ALPHA, /* U+0100b3: LINEAR B IDEOGRAM B171*/
- RTUNI_ALPHA, /* U+0100b4: LINEAR B IDEOGRAM B172*/
- RTUNI_ALPHA, /* U+0100b5: LINEAR B IDEOGRAM B173 MONTH*/
- RTUNI_ALPHA, /* U+0100b6: LINEAR B IDEOGRAM B174*/
- RTUNI_ALPHA, /* U+0100b7: LINEAR B IDEOGRAM B176 TREE*/
- RTUNI_ALPHA, /* U+0100b8: LINEAR B IDEOGRAM B177*/
- RTUNI_ALPHA, /* U+0100b9: LINEAR B IDEOGRAM B178*/
- RTUNI_ALPHA, /* U+0100ba: LINEAR B IDEOGRAM B179*/
- RTUNI_ALPHA, /* U+0100bb: LINEAR B IDEOGRAM B180*/
- RTUNI_ALPHA, /* U+0100bc: LINEAR B IDEOGRAM B181*/
- RTUNI_ALPHA, /* U+0100bd: LINEAR B IDEOGRAM B182*/
- RTUNI_ALPHA, /* U+0100be: LINEAR B IDEOGRAM B183*/
- RTUNI_ALPHA, /* U+0100bf: LINEAR B IDEOGRAM B184*/
- RTUNI_ALPHA, /* U+0100c0: LINEAR B IDEOGRAM B185*/
- RTUNI_ALPHA, /* U+0100c1: LINEAR B IDEOGRAM B189*/
- RTUNI_ALPHA, /* U+0100c2: LINEAR B IDEOGRAM B190*/
- RTUNI_ALPHA, /* U+0100c3: LINEAR B IDEOGRAM B191 HELMET*/
- RTUNI_ALPHA, /* U+0100c4: LINEAR B IDEOGRAM B220 FOOTSTOOL*/
- RTUNI_ALPHA, /* U+0100c5: LINEAR B IDEOGRAM B225 BATHTUB*/
- RTUNI_ALPHA, /* U+0100c6: LINEAR B IDEOGRAM B230 SPEAR*/
- RTUNI_ALPHA, /* U+0100c7: LINEAR B IDEOGRAM B231 ARROW*/
- RTUNI_ALPHA, /* U+0100c8: LINEAR B IDEOGRAM B232*/
- RTUNI_ALPHA, /* U+0100c9: LINEAR B IDEOGRAM B233 SWORD*/
- RTUNI_ALPHA, /* U+0100ca: LINEAR B IDEOGRAM B234*/
- RTUNI_ALPHA, /* U+0100cb: LINEAR B IDEOGRAM B236*/
- RTUNI_ALPHA, /* U+0100cc: LINEAR B IDEOGRAM B240 WHEELED CHARIOT*/
- RTUNI_ALPHA, /* U+0100cd: LINEAR B IDEOGRAM B241 CHARIOT*/
- RTUNI_ALPHA, /* U+0100ce: LINEAR B IDEOGRAM B242 CHARIOT FRAME*/
- RTUNI_ALPHA, /* U+0100cf: LINEAR B IDEOGRAM B243 WHEEL*/
- RTUNI_ALPHA, /* U+0100d0: LINEAR B IDEOGRAM B245*/
- RTUNI_ALPHA, /* U+0100d1: LINEAR B IDEOGRAM B246*/
- RTUNI_ALPHA, /* U+0100d2: LINEAR B MONOGRAM B247 DIPTE*/
- RTUNI_ALPHA, /* U+0100d3: LINEAR B IDEOGRAM B248*/
- RTUNI_ALPHA, /* U+0100d4: LINEAR B IDEOGRAM B249*/
- RTUNI_ALPHA, /* U+0100d5: LINEAR B IDEOGRAM B251*/
- RTUNI_ALPHA, /* U+0100d6: LINEAR B IDEOGRAM B252*/
- RTUNI_ALPHA, /* U+0100d7: LINEAR B IDEOGRAM B253*/
- RTUNI_ALPHA, /* U+0100d8: LINEAR B IDEOGRAM B254 DART*/
- RTUNI_ALPHA, /* U+0100d9: LINEAR B IDEOGRAM B255*/
- RTUNI_ALPHA, /* U+0100da: LINEAR B IDEOGRAM B256*/
- RTUNI_ALPHA, /* U+0100db: LINEAR B IDEOGRAM B257*/
- RTUNI_ALPHA, /* U+0100dc: LINEAR B IDEOGRAM B258*/
- RTUNI_ALPHA, /* U+0100dd: LINEAR B IDEOGRAM B259*/
- RTUNI_ALPHA, /* U+0100de: LINEAR B IDEOGRAM VESSEL B155*/
- RTUNI_ALPHA, /* U+0100df: LINEAR B IDEOGRAM VESSEL B200*/
- RTUNI_ALPHA, /* U+0100e0: LINEAR B IDEOGRAM VESSEL B201*/
- RTUNI_ALPHA, /* U+0100e1: LINEAR B IDEOGRAM VESSEL B202*/
- RTUNI_ALPHA, /* U+0100e2: LINEAR B IDEOGRAM VESSEL B203*/
- RTUNI_ALPHA, /* U+0100e3: LINEAR B IDEOGRAM VESSEL B204*/
- RTUNI_ALPHA, /* U+0100e4: LINEAR B IDEOGRAM VESSEL B205*/
- RTUNI_ALPHA, /* U+0100e5: LINEAR B IDEOGRAM VESSEL B206*/
- RTUNI_ALPHA, /* U+0100e6: LINEAR B IDEOGRAM VESSEL B207*/
- RTUNI_ALPHA, /* U+0100e7: LINEAR B IDEOGRAM VESSEL B208*/
- RTUNI_ALPHA, /* U+0100e8: LINEAR B IDEOGRAM VESSEL B209*/
- RTUNI_ALPHA, /* U+0100e9: LINEAR B IDEOGRAM VESSEL B210*/
- RTUNI_ALPHA, /* U+0100ea: LINEAR B IDEOGRAM VESSEL B211*/
- RTUNI_ALPHA, /* U+0100eb: LINEAR B IDEOGRAM VESSEL B212*/
- RTUNI_ALPHA, /* U+0100ec: LINEAR B IDEOGRAM VESSEL B213*/
- RTUNI_ALPHA, /* U+0100ed: LINEAR B IDEOGRAM VESSEL B214*/
- RTUNI_ALPHA, /* U+0100ee: LINEAR B IDEOGRAM VESSEL B215*/
- RTUNI_ALPHA, /* U+0100ef: LINEAR B IDEOGRAM VESSEL B216*/
- RTUNI_ALPHA, /* U+0100f0: LINEAR B IDEOGRAM VESSEL B217*/
- RTUNI_ALPHA, /* U+0100f1: LINEAR B IDEOGRAM VESSEL B218*/
- RTUNI_ALPHA, /* U+0100f2: LINEAR B IDEOGRAM VESSEL B219*/
- RTUNI_ALPHA, /* U+0100f3: LINEAR B IDEOGRAM VESSEL B221*/
- RTUNI_ALPHA, /* U+0100f4: LINEAR B IDEOGRAM VESSEL B222*/
- RTUNI_ALPHA, /* U+0100f5: LINEAR B IDEOGRAM VESSEL B226*/
- RTUNI_ALPHA, /* U+0100f6: LINEAR B IDEOGRAM VESSEL B227*/
- RTUNI_ALPHA, /* U+0100f7: LINEAR B IDEOGRAM VESSEL B228*/
- RTUNI_ALPHA, /* U+0100f8: LINEAR B IDEOGRAM VESSEL B229*/
- RTUNI_ALPHA, /* U+0100f9: LINEAR B IDEOGRAM VESSEL B250*/
- RTUNI_ALPHA, /* U+0100fa: LINEAR B IDEOGRAM VESSEL B305*/
- 0, /* U+0100fb: */
- 0, /* U+0100fc: */
- 0, /* U+0100fd: */
- 0, /* U+0100fe: */
- 0, /* U+0100ff: */
- 0, /* U+010100: AEGEAN WORD SEPARATOR LINE*/
- 0, /* U+010101: AEGEAN WORD SEPARATOR DOT*/
- 0, /* U+010102: AEGEAN CHECK MARK*/
- 0, /* U+010103: */
- 0, /* U+010104: */
- 0, /* U+010105: */
- 0, /* U+010106: */
- 0, /* U+010107: AEGEAN NUMBER ONE*/
- 0, /* U+010108: AEGEAN NUMBER TWO*/
- 0, /* U+010109: AEGEAN NUMBER THREE*/
- 0, /* U+01010a: AEGEAN NUMBER FOUR*/
- 0, /* U+01010b: AEGEAN NUMBER FIVE*/
- 0, /* U+01010c: AEGEAN NUMBER SIX*/
- 0, /* U+01010d: AEGEAN NUMBER SEVEN*/
- 0, /* U+01010e: AEGEAN NUMBER EIGHT*/
- 0, /* U+01010f: AEGEAN NUMBER NINE*/
- 0, /* U+010110: AEGEAN NUMBER TEN*/
- 0, /* U+010111: AEGEAN NUMBER TWENTY*/
- 0, /* U+010112: AEGEAN NUMBER THIRTY*/
- 0, /* U+010113: AEGEAN NUMBER FORTY*/
- 0, /* U+010114: AEGEAN NUMBER FIFTY*/
- 0, /* U+010115: AEGEAN NUMBER SIXTY*/
- 0, /* U+010116: AEGEAN NUMBER SEVENTY*/
- 0, /* U+010117: AEGEAN NUMBER EIGHTY*/
- 0, /* U+010118: AEGEAN NUMBER NINETY*/
- 0, /* U+010119: AEGEAN NUMBER ONE HUNDRED*/
- 0, /* U+01011a: AEGEAN NUMBER TWO HUNDRED*/
- 0, /* U+01011b: AEGEAN NUMBER THREE HUNDRED*/
- 0, /* U+01011c: AEGEAN NUMBER FOUR HUNDRED*/
- 0, /* U+01011d: AEGEAN NUMBER FIVE HUNDRED*/
- 0, /* U+01011e: AEGEAN NUMBER SIX HUNDRED*/
- 0, /* U+01011f: AEGEAN NUMBER SEVEN HUNDRED*/
- 0, /* U+010120: AEGEAN NUMBER EIGHT HUNDRED*/
- 0, /* U+010121: AEGEAN NUMBER NINE HUNDRED*/
- 0, /* U+010122: AEGEAN NUMBER ONE THOUSAND*/
- 0, /* U+010123: AEGEAN NUMBER TWO THOUSAND*/
- 0, /* U+010124: AEGEAN NUMBER THREE THOUSAND*/
- 0, /* U+010125: AEGEAN NUMBER FOUR THOUSAND*/
- 0, /* U+010126: AEGEAN NUMBER FIVE THOUSAND*/
- 0, /* U+010127: AEGEAN NUMBER SIX THOUSAND*/
- 0, /* U+010128: AEGEAN NUMBER SEVEN THOUSAND*/
- 0, /* U+010129: AEGEAN NUMBER EIGHT THOUSAND*/
- 0, /* U+01012a: AEGEAN NUMBER NINE THOUSAND*/
- 0, /* U+01012b: AEGEAN NUMBER TEN THOUSAND*/
- 0, /* U+01012c: AEGEAN NUMBER TWENTY THOUSAND*/
- 0, /* U+01012d: AEGEAN NUMBER THIRTY THOUSAND*/
- 0, /* U+01012e: AEGEAN NUMBER FORTY THOUSAND*/
- 0, /* U+01012f: AEGEAN NUMBER FIFTY THOUSAND*/
- 0, /* U+010130: AEGEAN NUMBER SIXTY THOUSAND*/
- 0, /* U+010131: AEGEAN NUMBER SEVENTY THOUSAND*/
- 0, /* U+010132: AEGEAN NUMBER EIGHTY THOUSAND*/
- 0, /* U+010133: AEGEAN NUMBER NINETY THOUSAND*/
- 0, /* U+010134: */
- 0, /* U+010135: */
- 0, /* U+010136: */
- 0, /* U+010137: AEGEAN WEIGHT BASE UNIT*/
- 0, /* U+010138: AEGEAN WEIGHT FIRST SUBUNIT*/
- 0, /* U+010139: AEGEAN WEIGHT SECOND SUBUNIT*/
- 0, /* U+01013a: AEGEAN WEIGHT THIRD SUBUNIT*/
- 0, /* U+01013b: AEGEAN WEIGHT FOURTH SUBUNIT*/
- 0, /* U+01013c: AEGEAN DRY MEASURE FIRST SUBUNIT*/
- 0, /* U+01013d: AEGEAN LIQUID MEASURE FIRST SUBUNIT*/
- 0, /* U+01013e: AEGEAN MEASURE SECOND SUBUNIT*/
- 0, /* U+01013f: AEGEAN MEASURE THIRD SUBUNIT*/
- RTUNI_ALPHA, /* U+010140: GREEK ACROPHONIC ATTIC ONE QUARTER*/
- RTUNI_ALPHA, /* U+010141: GREEK ACROPHONIC ATTIC ONE HALF*/
- RTUNI_ALPHA, /* U+010142: GREEK ACROPHONIC ATTIC ONE DRACHMA*/
- RTUNI_ALPHA, /* U+010143: GREEK ACROPHONIC ATTIC FIVE*/
- RTUNI_ALPHA, /* U+010144: GREEK ACROPHONIC ATTIC FIFTY*/
- RTUNI_ALPHA, /* U+010145: GREEK ACROPHONIC ATTIC FIVE HUNDRED*/
- RTUNI_ALPHA, /* U+010146: GREEK ACROPHONIC ATTIC FIVE THOUSAND*/
- RTUNI_ALPHA, /* U+010147: GREEK ACROPHONIC ATTIC FIFTY THOUSAND*/
- RTUNI_ALPHA, /* U+010148: GREEK ACROPHONIC ATTIC FIVE TALENTS*/
- RTUNI_ALPHA, /* U+010149: GREEK ACROPHONIC ATTIC TEN TALENTS*/
- RTUNI_ALPHA, /* U+01014a: GREEK ACROPHONIC ATTIC FIFTY TALENTS*/
- RTUNI_ALPHA, /* U+01014b: GREEK ACROPHONIC ATTIC ONE HUNDRED TALENTS*/
- RTUNI_ALPHA, /* U+01014c: GREEK ACROPHONIC ATTIC FIVE HUNDRED TALENTS*/
- RTUNI_ALPHA, /* U+01014d: GREEK ACROPHONIC ATTIC ONE THOUSAND TALENTS*/
- RTUNI_ALPHA, /* U+01014e: GREEK ACROPHONIC ATTIC FIVE THOUSAND TALENTS*/
- RTUNI_ALPHA, /* U+01014f: GREEK ACROPHONIC ATTIC FIVE STATERS*/
- RTUNI_ALPHA, /* U+010150: GREEK ACROPHONIC ATTIC TEN STATERS*/
- RTUNI_ALPHA, /* U+010151: GREEK ACROPHONIC ATTIC FIFTY STATERS*/
- RTUNI_ALPHA, /* U+010152: GREEK ACROPHONIC ATTIC ONE HUNDRED STATERS*/
- RTUNI_ALPHA, /* U+010153: GREEK ACROPHONIC ATTIC FIVE HUNDRED STATERS*/
- RTUNI_ALPHA, /* U+010154: GREEK ACROPHONIC ATTIC ONE THOUSAND STATERS*/
- RTUNI_ALPHA, /* U+010155: GREEK ACROPHONIC ATTIC TEN THOUSAND STATERS*/
- RTUNI_ALPHA, /* U+010156: GREEK ACROPHONIC ATTIC FIFTY THOUSAND STATERS*/
- RTUNI_ALPHA, /* U+010157: GREEK ACROPHONIC ATTIC TEN MNAS*/
- RTUNI_ALPHA, /* U+010158: GREEK ACROPHONIC HERAEUM ONE PLETHRON*/
- RTUNI_ALPHA, /* U+010159: GREEK ACROPHONIC THESPIAN ONE*/
- RTUNI_ALPHA, /* U+01015a: GREEK ACROPHONIC HERMIONIAN ONE*/
- RTUNI_ALPHA, /* U+01015b: GREEK ACROPHONIC EPIDAUREAN TWO*/
- RTUNI_ALPHA, /* U+01015c: GREEK ACROPHONIC THESPIAN TWO*/
- RTUNI_ALPHA, /* U+01015d: GREEK ACROPHONIC CYRENAIC TWO DRACHMAS*/
- RTUNI_ALPHA, /* U+01015e: GREEK ACROPHONIC EPIDAUREAN TWO DRACHMAS*/
- RTUNI_ALPHA, /* U+01015f: GREEK ACROPHONIC TROEZENIAN FIVE*/
- RTUNI_ALPHA, /* U+010160: GREEK ACROPHONIC TROEZENIAN TEN*/
- RTUNI_ALPHA, /* U+010161: GREEK ACROPHONIC TROEZENIAN TEN ALTERNATE FORM*/
- RTUNI_ALPHA, /* U+010162: GREEK ACROPHONIC HERMIONIAN TEN*/
- RTUNI_ALPHA, /* U+010163: GREEK ACROPHONIC MESSENIAN TEN*/
- RTUNI_ALPHA, /* U+010164: GREEK ACROPHONIC THESPIAN TEN*/
- RTUNI_ALPHA, /* U+010165: GREEK ACROPHONIC THESPIAN THIRTY*/
- RTUNI_ALPHA, /* U+010166: GREEK ACROPHONIC TROEZENIAN FIFTY*/
- RTUNI_ALPHA, /* U+010167: GREEK ACROPHONIC TROEZENIAN FIFTY ALTERNATE FORM*/
- RTUNI_ALPHA, /* U+010168: GREEK ACROPHONIC HERMIONIAN FIFTY*/
- RTUNI_ALPHA, /* U+010169: GREEK ACROPHONIC THESPIAN FIFTY*/
- RTUNI_ALPHA, /* U+01016a: GREEK ACROPHONIC THESPIAN ONE HUNDRED*/
- RTUNI_ALPHA, /* U+01016b: GREEK ACROPHONIC THESPIAN THREE HUNDRED*/
- RTUNI_ALPHA, /* U+01016c: GREEK ACROPHONIC EPIDAUREAN FIVE HUNDRED*/
- RTUNI_ALPHA, /* U+01016d: GREEK ACROPHONIC TROEZENIAN FIVE HUNDRED*/
- RTUNI_ALPHA, /* U+01016e: GREEK ACROPHONIC THESPIAN FIVE HUNDRED*/
- RTUNI_ALPHA, /* U+01016f: GREEK ACROPHONIC CARYSTIAN FIVE HUNDRED*/
- RTUNI_ALPHA, /* U+010170: GREEK ACROPHONIC NAXIAN FIVE HUNDRED*/
- RTUNI_ALPHA, /* U+010171: GREEK ACROPHONIC THESPIAN ONE THOUSAND*/
- RTUNI_ALPHA, /* U+010172: GREEK ACROPHONIC THESPIAN FIVE THOUSAND*/
- RTUNI_ALPHA, /* U+010173: GREEK ACROPHONIC DELPHIC FIVE MNAS*/
- RTUNI_ALPHA, /* U+010174: GREEK ACROPHONIC STRATIAN FIFTY MNAS*/
- 0, /* U+010175: GREEK ONE HALF SIGN*/
- 0, /* U+010176: GREEK ONE HALF SIGN ALTERNATE FORM*/
- 0, /* U+010177: GREEK TWO THIRDS SIGN*/
- 0, /* U+010178: GREEK THREE QUARTERS SIGN*/
- 0, /* U+010179: GREEK YEAR SIGN*/
- 0, /* U+01017a: GREEK TALENT SIGN*/
- 0, /* U+01017b: GREEK DRACHMA SIGN*/
- 0, /* U+01017c: GREEK OBOL SIGN*/
- 0, /* U+01017d: GREEK TWO OBOLS SIGN*/
- 0, /* U+01017e: GREEK THREE OBOLS SIGN*/
- 0, /* U+01017f: GREEK FOUR OBOLS SIGN*/
- 0, /* U+010180: GREEK FIVE OBOLS SIGN*/
- 0, /* U+010181: GREEK METRETES SIGN*/
- 0, /* U+010182: GREEK KYATHOS BASE SIGN*/
- 0, /* U+010183: GREEK LITRA SIGN*/
- 0, /* U+010184: GREEK OUNKIA SIGN*/
- 0, /* U+010185: GREEK XESTES SIGN*/
- 0, /* U+010186: GREEK ARTABE SIGN*/
- 0, /* U+010187: GREEK AROURA SIGN*/
- 0, /* U+010188: GREEK GRAMMA SIGN*/
- 0, /* U+010189: GREEK TRYBLION BASE SIGN*/
- 0, /* U+01018a: GREEK ZERO SIGN*/
- 0, /* U+01018b: */
- 0, /* U+01018c: */
- 0, /* U+01018d: */
- 0, /* U+01018e: */
- 0, /* U+01018f: */
- 0, /* U+010190: */
- 0, /* U+010191: */
- 0, /* U+010192: */
- 0, /* U+010193: */
- 0, /* U+010194: */
- 0, /* U+010195: */
- 0, /* U+010196: */
- 0, /* U+010197: */
- 0, /* U+010198: */
- 0, /* U+010199: */
- 0, /* U+01019a: */
- 0, /* U+01019b: */
- 0, /* U+01019c: */
- 0, /* U+01019d: */
- 0, /* U+01019e: */
- 0, /* U+01019f: */
- 0, /* U+0101a0: */
- 0, /* U+0101a1: */
- 0, /* U+0101a2: */
- 0, /* U+0101a3: */
- 0, /* U+0101a4: */
- 0, /* U+0101a5: */
- 0, /* U+0101a6: */
- 0, /* U+0101a7: */
- 0, /* U+0101a8: */
- 0, /* U+0101a9: */
- 0, /* U+0101aa: */
- 0, /* U+0101ab: */
- 0, /* U+0101ac: */
- 0, /* U+0101ad: */
- 0, /* U+0101ae: */
- 0, /* U+0101af: */
- 0, /* U+0101b0: */
- 0, /* U+0101b1: */
- 0, /* U+0101b2: */
- 0, /* U+0101b3: */
- 0, /* U+0101b4: */
- 0, /* U+0101b5: */
- 0, /* U+0101b6: */
- 0, /* U+0101b7: */
- 0, /* U+0101b8: */
- 0, /* U+0101b9: */
- 0, /* U+0101ba: */
- 0, /* U+0101bb: */
- 0, /* U+0101bc: */
- 0, /* U+0101bd: */
- 0, /* U+0101be: */
- 0, /* U+0101bf: */
- 0, /* U+0101c0: */
- 0, /* U+0101c1: */
- 0, /* U+0101c2: */
- 0, /* U+0101c3: */
- 0, /* U+0101c4: */
- 0, /* U+0101c5: */
- 0, /* U+0101c6: */
- 0, /* U+0101c7: */
- 0, /* U+0101c8: */
- 0, /* U+0101c9: */
- 0, /* U+0101ca: */
- 0, /* U+0101cb: */
- 0, /* U+0101cc: */
- 0, /* U+0101cd: */
- 0, /* U+0101ce: */
- 0, /* U+0101cf: */
- 0, /* U+0101d0: */
- 0, /* U+0101d1: */
- 0, /* U+0101d2: */
- 0, /* U+0101d3: */
- 0, /* U+0101d4: */
- 0, /* U+0101d5: */
- 0, /* U+0101d6: */
- 0, /* U+0101d7: */
- 0, /* U+0101d8: */
- 0, /* U+0101d9: */
- 0, /* U+0101da: */
- 0, /* U+0101db: */
- 0, /* U+0101dc: */
- 0, /* U+0101dd: */
- 0, /* U+0101de: */
- 0, /* U+0101df: */
- 0, /* U+0101e0: */
- 0, /* U+0101e1: */
- 0, /* U+0101e2: */
- 0, /* U+0101e3: */
- 0, /* U+0101e4: */
- 0, /* U+0101e5: */
- 0, /* U+0101e6: */
- 0, /* U+0101e7: */
- 0, /* U+0101e8: */
- 0, /* U+0101e9: */
- 0, /* U+0101ea: */
- 0, /* U+0101eb: */
- 0, /* U+0101ec: */
- 0, /* U+0101ed: */
- 0, /* U+0101ee: */
- 0, /* U+0101ef: */
- 0, /* U+0101f0: */
- 0, /* U+0101f1: */
- 0, /* U+0101f2: */
- 0, /* U+0101f3: */
- 0, /* U+0101f4: */
- 0, /* U+0101f5: */
- 0, /* U+0101f6: */
- 0, /* U+0101f7: */
- 0, /* U+0101f8: */
- 0, /* U+0101f9: */
- 0, /* U+0101fa: */
- 0, /* U+0101fb: */
- 0, /* U+0101fc: */
- 0, /* U+0101fd: */
- 0, /* U+0101fe: */
- 0, /* U+0101ff: */
- 0, /* U+010200: */
- 0, /* U+010201: */
- 0, /* U+010202: */
- 0, /* U+010203: */
- 0, /* U+010204: */
- 0, /* U+010205: */
- 0, /* U+010206: */
- 0, /* U+010207: */
- 0, /* U+010208: */
- 0, /* U+010209: */
- 0, /* U+01020a: */
- 0, /* U+01020b: */
- 0, /* U+01020c: */
- 0, /* U+01020d: */
- 0, /* U+01020e: */
- 0, /* U+01020f: */
- 0, /* U+010210: */
- 0, /* U+010211: */
- 0, /* U+010212: */
- 0, /* U+010213: */
- 0, /* U+010214: */
- 0, /* U+010215: */
- 0, /* U+010216: */
- 0, /* U+010217: */
- 0, /* U+010218: */
- 0, /* U+010219: */
- 0, /* U+01021a: */
- 0, /* U+01021b: */
- 0, /* U+01021c: */
- 0, /* U+01021d: */
- 0, /* U+01021e: */
- 0, /* U+01021f: */
- 0, /* U+010220: */
- 0, /* U+010221: */
- 0, /* U+010222: */
- 0, /* U+010223: */
- 0, /* U+010224: */
- 0, /* U+010225: */
- 0, /* U+010226: */
- 0, /* U+010227: */
- 0, /* U+010228: */
- 0, /* U+010229: */
- 0, /* U+01022a: */
- 0, /* U+01022b: */
- 0, /* U+01022c: */
- 0, /* U+01022d: */
- 0, /* U+01022e: */
- 0, /* U+01022f: */
- 0, /* U+010230: */
- 0, /* U+010231: */
- 0, /* U+010232: */
- 0, /* U+010233: */
- 0, /* U+010234: */
- 0, /* U+010235: */
- 0, /* U+010236: */
- 0, /* U+010237: */
- 0, /* U+010238: */
- 0, /* U+010239: */
- 0, /* U+01023a: */
- 0, /* U+01023b: */
- 0, /* U+01023c: */
- 0, /* U+01023d: */
- 0, /* U+01023e: */
- 0, /* U+01023f: */
- 0, /* U+010240: */
- 0, /* U+010241: */
- 0, /* U+010242: */
- 0, /* U+010243: */
- 0, /* U+010244: */
- 0, /* U+010245: */
- 0, /* U+010246: */
- 0, /* U+010247: */
- 0, /* U+010248: */
- 0, /* U+010249: */
- 0, /* U+01024a: */
- 0, /* U+01024b: */
- 0, /* U+01024c: */
- 0, /* U+01024d: */
- 0, /* U+01024e: */
- 0, /* U+01024f: */
- 0, /* U+010250: */
- 0, /* U+010251: */
- 0, /* U+010252: */
- 0, /* U+010253: */
- 0, /* U+010254: */
- 0, /* U+010255: */
- 0, /* U+010256: */
- 0, /* U+010257: */
- 0, /* U+010258: */
- 0, /* U+010259: */
- 0, /* U+01025a: */
- 0, /* U+01025b: */
- 0, /* U+01025c: */
- 0, /* U+01025d: */
- 0, /* U+01025e: */
- 0, /* U+01025f: */
- 0, /* U+010260: */
- 0, /* U+010261: */
- 0, /* U+010262: */
- 0, /* U+010263: */
- 0, /* U+010264: */
- 0, /* U+010265: */
- 0, /* U+010266: */
- 0, /* U+010267: */
- 0, /* U+010268: */
- 0, /* U+010269: */
- 0, /* U+01026a: */
- 0, /* U+01026b: */
- 0, /* U+01026c: */
- 0, /* U+01026d: */
- 0, /* U+01026e: */
- 0, /* U+01026f: */
- 0, /* U+010270: */
- 0, /* U+010271: */
- 0, /* U+010272: */
- 0, /* U+010273: */
- 0, /* U+010274: */
- 0, /* U+010275: */
- 0, /* U+010276: */
- 0, /* U+010277: */
- 0, /* U+010278: */
- 0, /* U+010279: */
- 0, /* U+01027a: */
- 0, /* U+01027b: */
- 0, /* U+01027c: */
- 0, /* U+01027d: */
- 0, /* U+01027e: */
- 0, /* U+01027f: */
- 0, /* U+010280: */
- 0, /* U+010281: */
- 0, /* U+010282: */
- 0, /* U+010283: */
- 0, /* U+010284: */
- 0, /* U+010285: */
- 0, /* U+010286: */
- 0, /* U+010287: */
- 0, /* U+010288: */
- 0, /* U+010289: */
- 0, /* U+01028a: */
- 0, /* U+01028b: */
- 0, /* U+01028c: */
- 0, /* U+01028d: */
- 0, /* U+01028e: */
- 0, /* U+01028f: */
- 0, /* U+010290: */
- 0, /* U+010291: */
- 0, /* U+010292: */
- 0, /* U+010293: */
- 0, /* U+010294: */
- 0, /* U+010295: */
- 0, /* U+010296: */
- 0, /* U+010297: */
- 0, /* U+010298: */
- 0, /* U+010299: */
- 0, /* U+01029a: */
- 0, /* U+01029b: */
- 0, /* U+01029c: */
- 0, /* U+01029d: */
- 0, /* U+01029e: */
- 0, /* U+01029f: */
- 0, /* U+0102a0: */
- 0, /* U+0102a1: */
- 0, /* U+0102a2: */
- 0, /* U+0102a3: */
- 0, /* U+0102a4: */
- 0, /* U+0102a5: */
- 0, /* U+0102a6: */
- 0, /* U+0102a7: */
- 0, /* U+0102a8: */
- 0, /* U+0102a9: */
- 0, /* U+0102aa: */
- 0, /* U+0102ab: */
- 0, /* U+0102ac: */
- 0, /* U+0102ad: */
- 0, /* U+0102ae: */
- 0, /* U+0102af: */
- 0, /* U+0102b0: */
- 0, /* U+0102b1: */
- 0, /* U+0102b2: */
- 0, /* U+0102b3: */
- 0, /* U+0102b4: */
- 0, /* U+0102b5: */
- 0, /* U+0102b6: */
- 0, /* U+0102b7: */
- 0, /* U+0102b8: */
- 0, /* U+0102b9: */
- 0, /* U+0102ba: */
- 0, /* U+0102bb: */
- 0, /* U+0102bc: */
- 0, /* U+0102bd: */
- 0, /* U+0102be: */
- 0, /* U+0102bf: */
- 0, /* U+0102c0: */
- 0, /* U+0102c1: */
- 0, /* U+0102c2: */
- 0, /* U+0102c3: */
- 0, /* U+0102c4: */
- 0, /* U+0102c5: */
- 0, /* U+0102c6: */
- 0, /* U+0102c7: */
- 0, /* U+0102c8: */
- 0, /* U+0102c9: */
- 0, /* U+0102ca: */
- 0, /* U+0102cb: */
- 0, /* U+0102cc: */
- 0, /* U+0102cd: */
- 0, /* U+0102ce: */
- 0, /* U+0102cf: */
- 0, /* U+0102d0: */
- 0, /* U+0102d1: */
- 0, /* U+0102d2: */
- 0, /* U+0102d3: */
- 0, /* U+0102d4: */
- 0, /* U+0102d5: */
- 0, /* U+0102d6: */
- 0, /* U+0102d7: */
- 0, /* U+0102d8: */
- 0, /* U+0102d9: */
- 0, /* U+0102da: */
- 0, /* U+0102db: */
- 0, /* U+0102dc: */
- 0, /* U+0102dd: */
- 0, /* U+0102de: */
- 0, /* U+0102df: */
- 0, /* U+0102e0: */
- 0, /* U+0102e1: */
- 0, /* U+0102e2: */
- 0, /* U+0102e3: */
- 0, /* U+0102e4: */
- 0, /* U+0102e5: */
- 0, /* U+0102e6: */
- 0, /* U+0102e7: */
- 0, /* U+0102e8: */
- 0, /* U+0102e9: */
- 0, /* U+0102ea: */
- 0, /* U+0102eb: */
- 0, /* U+0102ec: */
- 0, /* U+0102ed: */
- 0, /* U+0102ee: */
- 0, /* U+0102ef: */
- 0, /* U+0102f0: */
- 0, /* U+0102f1: */
- 0, /* U+0102f2: */
- 0, /* U+0102f3: */
- 0, /* U+0102f4: */
- 0, /* U+0102f5: */
- 0, /* U+0102f6: */
- 0, /* U+0102f7: */
- 0, /* U+0102f8: */
- 0, /* U+0102f9: */
- 0, /* U+0102fa: */
- 0, /* U+0102fb: */
- 0, /* U+0102fc: */
- 0, /* U+0102fd: */
- 0, /* U+0102fe: */
- 0, /* U+0102ff: */
- RTUNI_ALPHA, /* U+010300: OLD ITALIC LETTER A*/
- RTUNI_ALPHA, /* U+010301: OLD ITALIC LETTER BE*/
- RTUNI_ALPHA, /* U+010302: OLD ITALIC LETTER KE*/
- RTUNI_ALPHA, /* U+010303: OLD ITALIC LETTER DE*/
- RTUNI_ALPHA, /* U+010304: OLD ITALIC LETTER E*/
- RTUNI_ALPHA, /* U+010305: OLD ITALIC LETTER VE*/
- RTUNI_ALPHA, /* U+010306: OLD ITALIC LETTER ZE*/
- RTUNI_ALPHA, /* U+010307: OLD ITALIC LETTER HE*/
- RTUNI_ALPHA, /* U+010308: OLD ITALIC LETTER THE*/
- RTUNI_ALPHA, /* U+010309: OLD ITALIC LETTER I*/
- RTUNI_ALPHA, /* U+01030a: OLD ITALIC LETTER KA*/
- RTUNI_ALPHA, /* U+01030b: OLD ITALIC LETTER EL*/
- RTUNI_ALPHA, /* U+01030c: OLD ITALIC LETTER EM*/
- RTUNI_ALPHA, /* U+01030d: OLD ITALIC LETTER EN*/
- RTUNI_ALPHA, /* U+01030e: OLD ITALIC LETTER ESH*/
- RTUNI_ALPHA, /* U+01030f: OLD ITALIC LETTER O*/
- RTUNI_ALPHA, /* U+010310: OLD ITALIC LETTER PE*/
- RTUNI_ALPHA, /* U+010311: OLD ITALIC LETTER SHE*/
- RTUNI_ALPHA, /* U+010312: OLD ITALIC LETTER KU*/
- RTUNI_ALPHA, /* U+010313: OLD ITALIC LETTER ER*/
- RTUNI_ALPHA, /* U+010314: OLD ITALIC LETTER ES*/
- RTUNI_ALPHA, /* U+010315: OLD ITALIC LETTER TE*/
- RTUNI_ALPHA, /* U+010316: OLD ITALIC LETTER U*/
- RTUNI_ALPHA, /* U+010317: OLD ITALIC LETTER EKS*/
- RTUNI_ALPHA, /* U+010318: OLD ITALIC LETTER PHE*/
- RTUNI_ALPHA, /* U+010319: OLD ITALIC LETTER KHE*/
- RTUNI_ALPHA, /* U+01031a: OLD ITALIC LETTER EF*/
- RTUNI_ALPHA, /* U+01031b: OLD ITALIC LETTER ERS*/
- RTUNI_ALPHA, /* U+01031c: OLD ITALIC LETTER CHE*/
- RTUNI_ALPHA, /* U+01031d: OLD ITALIC LETTER II*/
- RTUNI_ALPHA, /* U+01031e: OLD ITALIC LETTER UU*/
- 0, /* U+01031f: */
- 0, /* U+010320: OLD ITALIC NUMERAL ONE*/
- 0, /* U+010321: OLD ITALIC NUMERAL FIVE*/
- 0, /* U+010322: OLD ITALIC NUMERAL TEN*/
- 0, /* U+010323: OLD ITALIC NUMERAL FIFTY*/
- 0, /* U+010324: */
- 0, /* U+010325: */
- 0, /* U+010326: */
- 0, /* U+010327: */
- 0, /* U+010328: */
- 0, /* U+010329: */
- 0, /* U+01032a: */
- 0, /* U+01032b: */
- 0, /* U+01032c: */
- 0, /* U+01032d: */
- 0, /* U+01032e: */
- 0, /* U+01032f: */
- RTUNI_ALPHA, /* U+010330: GOTHIC LETTER AHSA*/
- RTUNI_ALPHA, /* U+010331: GOTHIC LETTER BAIRKAN*/
- RTUNI_ALPHA, /* U+010332: GOTHIC LETTER GIBA*/
- RTUNI_ALPHA, /* U+010333: GOTHIC LETTER DAGS*/
- RTUNI_ALPHA, /* U+010334: GOTHIC LETTER AIHVUS*/
- RTUNI_ALPHA, /* U+010335: GOTHIC LETTER QAIRTHRA*/
- RTUNI_ALPHA, /* U+010336: GOTHIC LETTER IUJA*/
- RTUNI_ALPHA, /* U+010337: GOTHIC LETTER HAGL*/
- RTUNI_ALPHA, /* U+010338: GOTHIC LETTER THIUTH*/
- RTUNI_ALPHA, /* U+010339: GOTHIC LETTER EIS*/
- RTUNI_ALPHA, /* U+01033a: GOTHIC LETTER KUSMA*/
- RTUNI_ALPHA, /* U+01033b: GOTHIC LETTER LAGUS*/
- RTUNI_ALPHA, /* U+01033c: GOTHIC LETTER MANNA*/
- RTUNI_ALPHA, /* U+01033d: GOTHIC LETTER NAUTHS*/
- RTUNI_ALPHA, /* U+01033e: GOTHIC LETTER JER*/
- RTUNI_ALPHA, /* U+01033f: GOTHIC LETTER URUS*/
- RTUNI_ALPHA, /* U+010340: GOTHIC LETTER PAIRTHRA*/
- RTUNI_ALPHA, /* U+010341: GOTHIC LETTER NINETY*/
- RTUNI_ALPHA, /* U+010342: GOTHIC LETTER RAIDA*/
- RTUNI_ALPHA, /* U+010343: GOTHIC LETTER SAUIL*/
- RTUNI_ALPHA, /* U+010344: GOTHIC LETTER TEIWS*/
- RTUNI_ALPHA, /* U+010345: GOTHIC LETTER WINJA*/
- RTUNI_ALPHA, /* U+010346: GOTHIC LETTER FAIHU*/
- RTUNI_ALPHA, /* U+010347: GOTHIC LETTER IGGWS*/
- RTUNI_ALPHA, /* U+010348: GOTHIC LETTER HWAIR*/
- RTUNI_ALPHA, /* U+010349: GOTHIC LETTER OTHAL*/
- RTUNI_ALPHA, /* U+01034a: GOTHIC LETTER NINE HUNDRED*/
- 0, /* U+01034b: */
- 0, /* U+01034c: */
- 0, /* U+01034d: */
- 0, /* U+01034e: */
- 0, /* U+01034f: */
- 0, /* U+010350: */
- 0, /* U+010351: */
- 0, /* U+010352: */
- 0, /* U+010353: */
- 0, /* U+010354: */
- 0, /* U+010355: */
- 0, /* U+010356: */
- 0, /* U+010357: */
- 0, /* U+010358: */
- 0, /* U+010359: */
- 0, /* U+01035a: */
- 0, /* U+01035b: */
- 0, /* U+01035c: */
- 0, /* U+01035d: */
- 0, /* U+01035e: */
- 0, /* U+01035f: */
- 0, /* U+010360: */
- 0, /* U+010361: */
- 0, /* U+010362: */
- 0, /* U+010363: */
- 0, /* U+010364: */
- 0, /* U+010365: */
- 0, /* U+010366: */
- 0, /* U+010367: */
- 0, /* U+010368: */
- 0, /* U+010369: */
- 0, /* U+01036a: */
- 0, /* U+01036b: */
- 0, /* U+01036c: */
- 0, /* U+01036d: */
- 0, /* U+01036e: */
- 0, /* U+01036f: */
- 0, /* U+010370: */
- 0, /* U+010371: */
- 0, /* U+010372: */
- 0, /* U+010373: */
- 0, /* U+010374: */
- 0, /* U+010375: */
- 0, /* U+010376: */
- 0, /* U+010377: */
- 0, /* U+010378: */
- 0, /* U+010379: */
- 0, /* U+01037a: */
- 0, /* U+01037b: */
- 0, /* U+01037c: */
- 0, /* U+01037d: */
- 0, /* U+01037e: */
- 0, /* U+01037f: */
- RTUNI_ALPHA, /* U+010380: UGARITIC LETTER ALPA*/
- RTUNI_ALPHA, /* U+010381: UGARITIC LETTER BETA*/
- RTUNI_ALPHA, /* U+010382: UGARITIC LETTER GAMLA*/
- RTUNI_ALPHA, /* U+010383: UGARITIC LETTER KHA*/
- RTUNI_ALPHA, /* U+010384: UGARITIC LETTER DELTA*/
- RTUNI_ALPHA, /* U+010385: UGARITIC LETTER HO*/
- RTUNI_ALPHA, /* U+010386: UGARITIC LETTER WO*/
- RTUNI_ALPHA, /* U+010387: UGARITIC LETTER ZETA*/
- RTUNI_ALPHA, /* U+010388: UGARITIC LETTER HOTA*/
- RTUNI_ALPHA, /* U+010389: UGARITIC LETTER TET*/
- RTUNI_ALPHA, /* U+01038a: UGARITIC LETTER YOD*/
- RTUNI_ALPHA, /* U+01038b: UGARITIC LETTER KAF*/
- RTUNI_ALPHA, /* U+01038c: UGARITIC LETTER SHIN*/
- RTUNI_ALPHA, /* U+01038d: UGARITIC LETTER LAMDA*/
- RTUNI_ALPHA, /* U+01038e: UGARITIC LETTER MEM*/
- RTUNI_ALPHA, /* U+01038f: UGARITIC LETTER DHAL*/
- RTUNI_ALPHA, /* U+010390: UGARITIC LETTER NUN*/
- RTUNI_ALPHA, /* U+010391: UGARITIC LETTER ZU*/
- RTUNI_ALPHA, /* U+010392: UGARITIC LETTER SAMKA*/
- RTUNI_ALPHA, /* U+010393: UGARITIC LETTER AIN*/
- RTUNI_ALPHA, /* U+010394: UGARITIC LETTER PU*/
- RTUNI_ALPHA, /* U+010395: UGARITIC LETTER SADE*/
- RTUNI_ALPHA, /* U+010396: UGARITIC LETTER QOPA*/
- RTUNI_ALPHA, /* U+010397: UGARITIC LETTER RASHA*/
- RTUNI_ALPHA, /* U+010398: UGARITIC LETTER THANNA*/
- RTUNI_ALPHA, /* U+010399: UGARITIC LETTER GHAIN*/
- RTUNI_ALPHA, /* U+01039a: UGARITIC LETTER TO*/
- RTUNI_ALPHA, /* U+01039b: UGARITIC LETTER I*/
- RTUNI_ALPHA, /* U+01039c: UGARITIC LETTER U*/
- RTUNI_ALPHA, /* U+01039d: UGARITIC LETTER SSU*/
- 0, /* U+01039e: */
- 0, /* U+01039f: UGARITIC WORD DIVIDER*/
- RTUNI_ALPHA, /* U+0103a0: OLD PERSIAN SIGN A*/
- RTUNI_ALPHA, /* U+0103a1: OLD PERSIAN SIGN I*/
- RTUNI_ALPHA, /* U+0103a2: OLD PERSIAN SIGN U*/
- RTUNI_ALPHA, /* U+0103a3: OLD PERSIAN SIGN KA*/
- RTUNI_ALPHA, /* U+0103a4: OLD PERSIAN SIGN KU*/
- RTUNI_ALPHA, /* U+0103a5: OLD PERSIAN SIGN GA*/
- RTUNI_ALPHA, /* U+0103a6: OLD PERSIAN SIGN GU*/
- RTUNI_ALPHA, /* U+0103a7: OLD PERSIAN SIGN XA*/
- RTUNI_ALPHA, /* U+0103a8: OLD PERSIAN SIGN CA*/
- RTUNI_ALPHA, /* U+0103a9: OLD PERSIAN SIGN JA*/
- RTUNI_ALPHA, /* U+0103aa: OLD PERSIAN SIGN JI*/
- RTUNI_ALPHA, /* U+0103ab: OLD PERSIAN SIGN TA*/
- RTUNI_ALPHA, /* U+0103ac: OLD PERSIAN SIGN TU*/
- RTUNI_ALPHA, /* U+0103ad: OLD PERSIAN SIGN DA*/
- RTUNI_ALPHA, /* U+0103ae: OLD PERSIAN SIGN DI*/
- RTUNI_ALPHA, /* U+0103af: OLD PERSIAN SIGN DU*/
- RTUNI_ALPHA, /* U+0103b0: OLD PERSIAN SIGN THA*/
- RTUNI_ALPHA, /* U+0103b1: OLD PERSIAN SIGN PA*/
- RTUNI_ALPHA, /* U+0103b2: OLD PERSIAN SIGN BA*/
- RTUNI_ALPHA, /* U+0103b3: OLD PERSIAN SIGN FA*/
- RTUNI_ALPHA, /* U+0103b4: OLD PERSIAN SIGN NA*/
- RTUNI_ALPHA, /* U+0103b5: OLD PERSIAN SIGN NU*/
- RTUNI_ALPHA, /* U+0103b6: OLD PERSIAN SIGN MA*/
- RTUNI_ALPHA, /* U+0103b7: OLD PERSIAN SIGN MI*/
- RTUNI_ALPHA, /* U+0103b8: OLD PERSIAN SIGN MU*/
- RTUNI_ALPHA, /* U+0103b9: OLD PERSIAN SIGN YA*/
- RTUNI_ALPHA, /* U+0103ba: OLD PERSIAN SIGN VA*/
- RTUNI_ALPHA, /* U+0103bb: OLD PERSIAN SIGN VI*/
- RTUNI_ALPHA, /* U+0103bc: OLD PERSIAN SIGN RA*/
- RTUNI_ALPHA, /* U+0103bd: OLD PERSIAN SIGN RU*/
- RTUNI_ALPHA, /* U+0103be: OLD PERSIAN SIGN LA*/
- RTUNI_ALPHA, /* U+0103bf: OLD PERSIAN SIGN SA*/
- RTUNI_ALPHA, /* U+0103c0: OLD PERSIAN SIGN ZA*/
- RTUNI_ALPHA, /* U+0103c1: OLD PERSIAN SIGN SHA*/
- RTUNI_ALPHA, /* U+0103c2: OLD PERSIAN SIGN SSA*/
- RTUNI_ALPHA, /* U+0103c3: OLD PERSIAN SIGN HA*/
- 0, /* U+0103c4: */
- 0, /* U+0103c5: */
- 0, /* U+0103c6: */
- 0, /* U+0103c7: */
- RTUNI_ALPHA, /* U+0103c8: OLD PERSIAN SIGN AURAMAZDAA*/
- RTUNI_ALPHA, /* U+0103c9: OLD PERSIAN SIGN AURAMAZDAA-2*/
- RTUNI_ALPHA, /* U+0103ca: OLD PERSIAN SIGN AURAMAZDAAHA*/
- RTUNI_ALPHA, /* U+0103cb: OLD PERSIAN SIGN XSHAAYATHIYA*/
- RTUNI_ALPHA, /* U+0103cc: OLD PERSIAN SIGN DAHYAAUSH*/
- RTUNI_ALPHA, /* U+0103cd: OLD PERSIAN SIGN DAHYAAUSH-2*/
- RTUNI_ALPHA, /* U+0103ce: OLD PERSIAN SIGN BAGA*/
- RTUNI_ALPHA, /* U+0103cf: OLD PERSIAN SIGN BUUMISH*/
- 0, /* U+0103d0: OLD PERSIAN WORD DIVIDER*/
- RTUNI_ALPHA, /* U+0103d1: OLD PERSIAN NUMBER ONE*/
- RTUNI_ALPHA, /* U+0103d2: OLD PERSIAN NUMBER TWO*/
- RTUNI_ALPHA, /* U+0103d3: OLD PERSIAN NUMBER TEN*/
- RTUNI_ALPHA, /* U+0103d4: OLD PERSIAN NUMBER TWENTY*/
- RTUNI_ALPHA, /* U+0103d5: OLD PERSIAN NUMBER HUNDRED*/
- 0, /* U+0103d6: */
- 0, /* U+0103d7: */
- 0, /* U+0103d8: */
- 0, /* U+0103d9: */
- 0, /* U+0103da: */
- 0, /* U+0103db: */
- 0, /* U+0103dc: */
- 0, /* U+0103dd: */
- 0, /* U+0103de: */
- 0, /* U+0103df: */
- 0, /* U+0103e0: */
- 0, /* U+0103e1: */
- 0, /* U+0103e2: */
- 0, /* U+0103e3: */
- 0, /* U+0103e4: */
- 0, /* U+0103e5: */
- 0, /* U+0103e6: */
- 0, /* U+0103e7: */
- 0, /* U+0103e8: */
- 0, /* U+0103e9: */
- 0, /* U+0103ea: */
- 0, /* U+0103eb: */
- 0, /* U+0103ec: */
- 0, /* U+0103ed: */
- 0, /* U+0103ee: */
- 0, /* U+0103ef: */
- 0, /* U+0103f0: */
- 0, /* U+0103f1: */
- 0, /* U+0103f2: */
- 0, /* U+0103f3: */
- 0, /* U+0103f4: */
- 0, /* U+0103f5: */
- 0, /* U+0103f6: */
- 0, /* U+0103f7: */
- 0, /* U+0103f8: */
- 0, /* U+0103f9: */
- 0, /* U+0103fa: */
- 0, /* U+0103fb: */
- 0, /* U+0103fc: */
- 0, /* U+0103fd: */
- 0, /* U+0103fe: */
- 0, /* U+0103ff: */
- RTUNI_ALPHA | RTUNI_UPPER, /* U+010400: DESERET CAPITAL LETTER LONG I*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+010401: DESERET CAPITAL LETTER LONG E*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+010402: DESERET CAPITAL LETTER LONG A*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+010403: DESERET CAPITAL LETTER LONG AH*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+010404: DESERET CAPITAL LETTER LONG O*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+010405: DESERET CAPITAL LETTER LONG OO*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+010406: DESERET CAPITAL LETTER SHORT I*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+010407: DESERET CAPITAL LETTER SHORT E*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+010408: DESERET CAPITAL LETTER SHORT A*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+010409: DESERET CAPITAL LETTER SHORT AH*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01040a: DESERET CAPITAL LETTER SHORT O*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01040b: DESERET CAPITAL LETTER SHORT OO*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01040c: DESERET CAPITAL LETTER AY*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01040d: DESERET CAPITAL LETTER OW*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01040e: DESERET CAPITAL LETTER WU*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01040f: DESERET CAPITAL LETTER YEE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+010410: DESERET CAPITAL LETTER H*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+010411: DESERET CAPITAL LETTER PEE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+010412: DESERET CAPITAL LETTER BEE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+010413: DESERET CAPITAL LETTER TEE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+010414: DESERET CAPITAL LETTER DEE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+010415: DESERET CAPITAL LETTER CHEE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+010416: DESERET CAPITAL LETTER JEE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+010417: DESERET CAPITAL LETTER KAY*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+010418: DESERET CAPITAL LETTER GAY*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+010419: DESERET CAPITAL LETTER EF*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01041a: DESERET CAPITAL LETTER VEE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01041b: DESERET CAPITAL LETTER ETH*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01041c: DESERET CAPITAL LETTER THEE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01041d: DESERET CAPITAL LETTER ES*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01041e: DESERET CAPITAL LETTER ZEE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01041f: DESERET CAPITAL LETTER ESH*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+010420: DESERET CAPITAL LETTER ZHEE*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+010421: DESERET CAPITAL LETTER ER*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+010422: DESERET CAPITAL LETTER EL*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+010423: DESERET CAPITAL LETTER EM*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+010424: DESERET CAPITAL LETTER EN*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+010425: DESERET CAPITAL LETTER ENG*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+010426: DESERET CAPITAL LETTER OI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+010427: DESERET CAPITAL LETTER EW*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+010428: DESERET SMALL LETTER LONG I*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+010429: DESERET SMALL LETTER LONG E*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01042a: DESERET SMALL LETTER LONG A*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01042b: DESERET SMALL LETTER LONG AH*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01042c: DESERET SMALL LETTER LONG O*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01042d: DESERET SMALL LETTER LONG OO*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01042e: DESERET SMALL LETTER SHORT I*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01042f: DESERET SMALL LETTER SHORT E*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+010430: DESERET SMALL LETTER SHORT A*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+010431: DESERET SMALL LETTER SHORT AH*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+010432: DESERET SMALL LETTER SHORT O*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+010433: DESERET SMALL LETTER SHORT OO*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+010434: DESERET SMALL LETTER AY*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+010435: DESERET SMALL LETTER OW*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+010436: DESERET SMALL LETTER WU*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+010437: DESERET SMALL LETTER YEE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+010438: DESERET SMALL LETTER H*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+010439: DESERET SMALL LETTER PEE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01043a: DESERET SMALL LETTER BEE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01043b: DESERET SMALL LETTER TEE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01043c: DESERET SMALL LETTER DEE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01043d: DESERET SMALL LETTER CHEE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01043e: DESERET SMALL LETTER JEE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01043f: DESERET SMALL LETTER KAY*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+010440: DESERET SMALL LETTER GAY*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+010441: DESERET SMALL LETTER EF*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+010442: DESERET SMALL LETTER VEE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+010443: DESERET SMALL LETTER ETH*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+010444: DESERET SMALL LETTER THEE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+010445: DESERET SMALL LETTER ES*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+010446: DESERET SMALL LETTER ZEE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+010447: DESERET SMALL LETTER ESH*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+010448: DESERET SMALL LETTER ZHEE*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+010449: DESERET SMALL LETTER ER*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01044a: DESERET SMALL LETTER EL*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01044b: DESERET SMALL LETTER EM*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01044c: DESERET SMALL LETTER EN*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01044d: DESERET SMALL LETTER ENG*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01044e: DESERET SMALL LETTER OI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01044f: DESERET SMALL LETTER EW*/
- RTUNI_ALPHA, /* U+010450: SHAVIAN LETTER PEEP*/
- RTUNI_ALPHA, /* U+010451: SHAVIAN LETTER TOT*/
- RTUNI_ALPHA, /* U+010452: SHAVIAN LETTER KICK*/
- RTUNI_ALPHA, /* U+010453: SHAVIAN LETTER FEE*/
- RTUNI_ALPHA, /* U+010454: SHAVIAN LETTER THIGH*/
- RTUNI_ALPHA, /* U+010455: SHAVIAN LETTER SO*/
- RTUNI_ALPHA, /* U+010456: SHAVIAN LETTER SURE*/
- RTUNI_ALPHA, /* U+010457: SHAVIAN LETTER CHURCH*/
- RTUNI_ALPHA, /* U+010458: SHAVIAN LETTER YEA*/
- RTUNI_ALPHA, /* U+010459: SHAVIAN LETTER HUNG*/
- RTUNI_ALPHA, /* U+01045a: SHAVIAN LETTER BIB*/
- RTUNI_ALPHA, /* U+01045b: SHAVIAN LETTER DEAD*/
- RTUNI_ALPHA, /* U+01045c: SHAVIAN LETTER GAG*/
- RTUNI_ALPHA, /* U+01045d: SHAVIAN LETTER VOW*/
- RTUNI_ALPHA, /* U+01045e: SHAVIAN LETTER THEY*/
- RTUNI_ALPHA, /* U+01045f: SHAVIAN LETTER ZOO*/
- RTUNI_ALPHA, /* U+010460: SHAVIAN LETTER MEASURE*/
- RTUNI_ALPHA, /* U+010461: SHAVIAN LETTER JUDGE*/
- RTUNI_ALPHA, /* U+010462: SHAVIAN LETTER WOE*/
- RTUNI_ALPHA, /* U+010463: SHAVIAN LETTER HA-HA*/
- RTUNI_ALPHA, /* U+010464: SHAVIAN LETTER LOLL*/
- RTUNI_ALPHA, /* U+010465: SHAVIAN LETTER MIME*/
- RTUNI_ALPHA, /* U+010466: SHAVIAN LETTER IF*/
- RTUNI_ALPHA, /* U+010467: SHAVIAN LETTER EGG*/
- RTUNI_ALPHA, /* U+010468: SHAVIAN LETTER ASH*/
- RTUNI_ALPHA, /* U+010469: SHAVIAN LETTER ADO*/
- RTUNI_ALPHA, /* U+01046a: SHAVIAN LETTER ON*/
- RTUNI_ALPHA, /* U+01046b: SHAVIAN LETTER WOOL*/
- RTUNI_ALPHA, /* U+01046c: SHAVIAN LETTER OUT*/
- RTUNI_ALPHA, /* U+01046d: SHAVIAN LETTER AH*/
- RTUNI_ALPHA, /* U+01046e: SHAVIAN LETTER ROAR*/
- RTUNI_ALPHA, /* U+01046f: SHAVIAN LETTER NUN*/
- RTUNI_ALPHA, /* U+010470: SHAVIAN LETTER EAT*/
- RTUNI_ALPHA, /* U+010471: SHAVIAN LETTER AGE*/
- RTUNI_ALPHA, /* U+010472: SHAVIAN LETTER ICE*/
- RTUNI_ALPHA, /* U+010473: SHAVIAN LETTER UP*/
- RTUNI_ALPHA, /* U+010474: SHAVIAN LETTER OAK*/
- RTUNI_ALPHA, /* U+010475: SHAVIAN LETTER OOZE*/
- RTUNI_ALPHA, /* U+010476: SHAVIAN LETTER OIL*/
- RTUNI_ALPHA, /* U+010477: SHAVIAN LETTER AWE*/
- RTUNI_ALPHA, /* U+010478: SHAVIAN LETTER ARE*/
- RTUNI_ALPHA, /* U+010479: SHAVIAN LETTER OR*/
- RTUNI_ALPHA, /* U+01047a: SHAVIAN LETTER AIR*/
- RTUNI_ALPHA, /* U+01047b: SHAVIAN LETTER ERR*/
- RTUNI_ALPHA, /* U+01047c: SHAVIAN LETTER ARRAY*/
- RTUNI_ALPHA, /* U+01047d: SHAVIAN LETTER EAR*/
- RTUNI_ALPHA, /* U+01047e: SHAVIAN LETTER IAN*/
- RTUNI_ALPHA, /* U+01047f: SHAVIAN LETTER YEW*/
- RTUNI_ALPHA, /* U+010480: OSMANYA LETTER ALEF*/
- RTUNI_ALPHA, /* U+010481: OSMANYA LETTER BA*/
- RTUNI_ALPHA, /* U+010482: OSMANYA LETTER TA*/
- RTUNI_ALPHA, /* U+010483: OSMANYA LETTER JA*/
- RTUNI_ALPHA, /* U+010484: OSMANYA LETTER XA*/
- RTUNI_ALPHA, /* U+010485: OSMANYA LETTER KHA*/
- RTUNI_ALPHA, /* U+010486: OSMANYA LETTER DEEL*/
- RTUNI_ALPHA, /* U+010487: OSMANYA LETTER RA*/
- RTUNI_ALPHA, /* U+010488: OSMANYA LETTER SA*/
- RTUNI_ALPHA, /* U+010489: OSMANYA LETTER SHIIN*/
- RTUNI_ALPHA, /* U+01048a: OSMANYA LETTER DHA*/
- RTUNI_ALPHA, /* U+01048b: OSMANYA LETTER CAYN*/
- RTUNI_ALPHA, /* U+01048c: OSMANYA LETTER GA*/
- RTUNI_ALPHA, /* U+01048d: OSMANYA LETTER FA*/
- RTUNI_ALPHA, /* U+01048e: OSMANYA LETTER QAAF*/
- RTUNI_ALPHA, /* U+01048f: OSMANYA LETTER KAAF*/
- RTUNI_ALPHA, /* U+010490: OSMANYA LETTER LAAN*/
- RTUNI_ALPHA, /* U+010491: OSMANYA LETTER MIIN*/
- RTUNI_ALPHA, /* U+010492: OSMANYA LETTER NUUN*/
- RTUNI_ALPHA, /* U+010493: OSMANYA LETTER WAW*/
- RTUNI_ALPHA, /* U+010494: OSMANYA LETTER HA*/
- RTUNI_ALPHA, /* U+010495: OSMANYA LETTER YA*/
- RTUNI_ALPHA, /* U+010496: OSMANYA LETTER A*/
- RTUNI_ALPHA, /* U+010497: OSMANYA LETTER E*/
- RTUNI_ALPHA, /* U+010498: OSMANYA LETTER I*/
- RTUNI_ALPHA, /* U+010499: OSMANYA LETTER O*/
- RTUNI_ALPHA, /* U+01049a: OSMANYA LETTER U*/
- RTUNI_ALPHA, /* U+01049b: OSMANYA LETTER AA*/
- RTUNI_ALPHA, /* U+01049c: OSMANYA LETTER EE*/
- RTUNI_ALPHA, /* U+01049d: OSMANYA LETTER OO*/
- 0, /* U+01049e: */
- 0, /* U+01049f: */
- RTUNI_DDIGIT, /* U+0104a0: OSMANYA DIGIT ZERO*/
- RTUNI_DDIGIT, /* U+0104a1: OSMANYA DIGIT ONE*/
- RTUNI_DDIGIT, /* U+0104a2: OSMANYA DIGIT TWO*/
- RTUNI_DDIGIT, /* U+0104a3: OSMANYA DIGIT THREE*/
- RTUNI_DDIGIT, /* U+0104a4: OSMANYA DIGIT FOUR*/
- RTUNI_DDIGIT, /* U+0104a5: OSMANYA DIGIT FIVE*/
- RTUNI_DDIGIT, /* U+0104a6: OSMANYA DIGIT SIX*/
- RTUNI_DDIGIT, /* U+0104a7: OSMANYA DIGIT SEVEN*/
- RTUNI_DDIGIT, /* U+0104a8: OSMANYA DIGIT EIGHT*/
- RTUNI_DDIGIT, /* U+0104a9: OSMANYA DIGIT NINE*/
- 0, /* U+0104aa: */
- 0, /* U+0104ab: */
- 0, /* U+0104ac: */
- 0, /* U+0104ad: */
- 0, /* U+0104ae: */
- 0, /* U+0104af: */
- 0, /* U+0104b0: */
- 0, /* U+0104b1: */
- 0, /* U+0104b2: */
- 0, /* U+0104b3: */
- 0, /* U+0104b4: */
- 0, /* U+0104b5: */
- 0, /* U+0104b6: */
- 0, /* U+0104b7: */
- 0, /* U+0104b8: */
- 0, /* U+0104b9: */
- 0, /* U+0104ba: */
- 0, /* U+0104bb: */
- 0, /* U+0104bc: */
- 0, /* U+0104bd: */
- 0, /* U+0104be: */
- 0, /* U+0104bf: */
- 0, /* U+0104c0: */
- 0, /* U+0104c1: */
- 0, /* U+0104c2: */
- 0, /* U+0104c3: */
- 0, /* U+0104c4: */
- 0, /* U+0104c5: */
- 0, /* U+0104c6: */
- 0, /* U+0104c7: */
- 0, /* U+0104c8: */
- 0, /* U+0104c9: */
- 0, /* U+0104ca: */
- 0, /* U+0104cb: */
- 0, /* U+0104cc: */
- 0, /* U+0104cd: */
- 0, /* U+0104ce: */
- 0, /* U+0104cf: */
- 0, /* U+0104d0: */
- 0, /* U+0104d1: */
- 0, /* U+0104d2: */
- 0, /* U+0104d3: */
- 0, /* U+0104d4: */
- 0, /* U+0104d5: */
- 0, /* U+0104d6: */
- 0, /* U+0104d7: */
- 0, /* U+0104d8: */
- 0, /* U+0104d9: */
- 0, /* U+0104da: */
- 0, /* U+0104db: */
- 0, /* U+0104dc: */
- 0, /* U+0104dd: */
- 0, /* U+0104de: */
- 0, /* U+0104df: */
- 0, /* U+0104e0: */
- 0, /* U+0104e1: */
- 0, /* U+0104e2: */
- 0, /* U+0104e3: */
- 0, /* U+0104e4: */
- 0, /* U+0104e5: */
- 0, /* U+0104e6: */
- 0, /* U+0104e7: */
- 0, /* U+0104e8: */
- 0, /* U+0104e9: */
- 0, /* U+0104ea: */
- 0, /* U+0104eb: */
- 0, /* U+0104ec: */
- 0, /* U+0104ed: */
- 0, /* U+0104ee: */
- 0, /* U+0104ef: */
- 0, /* U+0104f0: */
- 0, /* U+0104f1: */
- 0, /* U+0104f2: */
- 0, /* U+0104f3: */
- 0, /* U+0104f4: */
- 0, /* U+0104f5: */
- 0, /* U+0104f6: */
- 0, /* U+0104f7: */
- 0, /* U+0104f8: */
- 0, /* U+0104f9: */
- 0, /* U+0104fa: */
- 0, /* U+0104fb: */
- 0, /* U+0104fc: */
- 0, /* U+0104fd: */
- 0, /* U+0104fe: */
- 0, /* U+0104ff: */
- 0, /* U+010500: */
- 0, /* U+010501: */
- 0, /* U+010502: */
- 0, /* U+010503: */
- 0, /* U+010504: */
- 0, /* U+010505: */
- 0, /* U+010506: */
- 0, /* U+010507: */
- 0, /* U+010508: */
- 0, /* U+010509: */
- 0, /* U+01050a: */
- 0, /* U+01050b: */
- 0, /* U+01050c: */
- 0, /* U+01050d: */
- 0, /* U+01050e: */
- 0, /* U+01050f: */
- 0, /* U+010510: */
- 0, /* U+010511: */
- 0, /* U+010512: */
- 0, /* U+010513: */
- 0, /* U+010514: */
- 0, /* U+010515: */
- 0, /* U+010516: */
- 0, /* U+010517: */
- 0, /* U+010518: */
- 0, /* U+010519: */
- 0, /* U+01051a: */
- 0, /* U+01051b: */
- 0, /* U+01051c: */
- 0, /* U+01051d: */
- 0, /* U+01051e: */
- 0, /* U+01051f: */
- 0, /* U+010520: */
- 0, /* U+010521: */
- 0, /* U+010522: */
- 0, /* U+010523: */
- 0, /* U+010524: */
- 0, /* U+010525: */
- 0, /* U+010526: */
- 0, /* U+010527: */
- 0, /* U+010528: */
- 0, /* U+010529: */
- 0, /* U+01052a: */
- 0, /* U+01052b: */
- 0, /* U+01052c: */
- 0, /* U+01052d: */
- 0, /* U+01052e: */
- 0, /* U+01052f: */
- 0, /* U+010530: */
- 0, /* U+010531: */
- 0, /* U+010532: */
- 0, /* U+010533: */
- 0, /* U+010534: */
- 0, /* U+010535: */
- 0, /* U+010536: */
- 0, /* U+010537: */
- 0, /* U+010538: */
- 0, /* U+010539: */
- 0, /* U+01053a: */
- 0, /* U+01053b: */
- 0, /* U+01053c: */
- 0, /* U+01053d: */
- 0, /* U+01053e: */
- 0, /* U+01053f: */
- 0, /* U+010540: */
- 0, /* U+010541: */
- 0, /* U+010542: */
- 0, /* U+010543: */
- 0, /* U+010544: */
- 0, /* U+010545: */
- 0, /* U+010546: */
- 0, /* U+010547: */
- 0, /* U+010548: */
- 0, /* U+010549: */
- 0, /* U+01054a: */
- 0, /* U+01054b: */
- 0, /* U+01054c: */
- 0, /* U+01054d: */
- 0, /* U+01054e: */
- 0, /* U+01054f: */
- 0, /* U+010550: */
- 0, /* U+010551: */
- 0, /* U+010552: */
- 0, /* U+010553: */
- 0, /* U+010554: */
- 0, /* U+010555: */
- 0, /* U+010556: */
- 0, /* U+010557: */
- 0, /* U+010558: */
- 0, /* U+010559: */
- 0, /* U+01055a: */
- 0, /* U+01055b: */
- 0, /* U+01055c: */
- 0, /* U+01055d: */
- 0, /* U+01055e: */
- 0, /* U+01055f: */
- 0, /* U+010560: */
- 0, /* U+010561: */
- 0, /* U+010562: */
- 0, /* U+010563: */
- 0, /* U+010564: */
- 0, /* U+010565: */
- 0, /* U+010566: */
- 0, /* U+010567: */
- 0, /* U+010568: */
- 0, /* U+010569: */
- 0, /* U+01056a: */
- 0, /* U+01056b: */
- 0, /* U+01056c: */
- 0, /* U+01056d: */
- 0, /* U+01056e: */
- 0, /* U+01056f: */
- 0, /* U+010570: */
- 0, /* U+010571: */
- 0, /* U+010572: */
- 0, /* U+010573: */
- 0, /* U+010574: */
- 0, /* U+010575: */
- 0, /* U+010576: */
- 0, /* U+010577: */
- 0, /* U+010578: */
- 0, /* U+010579: */
- 0, /* U+01057a: */
- 0, /* U+01057b: */
- 0, /* U+01057c: */
- 0, /* U+01057d: */
- 0, /* U+01057e: */
- 0, /* U+01057f: */
- 0, /* U+010580: */
- 0, /* U+010581: */
- 0, /* U+010582: */
- 0, /* U+010583: */
- 0, /* U+010584: */
- 0, /* U+010585: */
- 0, /* U+010586: */
- 0, /* U+010587: */
- 0, /* U+010588: */
- 0, /* U+010589: */
- 0, /* U+01058a: */
- 0, /* U+01058b: */
- 0, /* U+01058c: */
- 0, /* U+01058d: */
- 0, /* U+01058e: */
- 0, /* U+01058f: */
- 0, /* U+010590: */
- 0, /* U+010591: */
- 0, /* U+010592: */
- 0, /* U+010593: */
- 0, /* U+010594: */
- 0, /* U+010595: */
- 0, /* U+010596: */
- 0, /* U+010597: */
- 0, /* U+010598: */
- 0, /* U+010599: */
- 0, /* U+01059a: */
- 0, /* U+01059b: */
- 0, /* U+01059c: */
- 0, /* U+01059d: */
- 0, /* U+01059e: */
- 0, /* U+01059f: */
- 0, /* U+0105a0: */
- 0, /* U+0105a1: */
- 0, /* U+0105a2: */
- 0, /* U+0105a3: */
- 0, /* U+0105a4: */
- 0, /* U+0105a5: */
- 0, /* U+0105a6: */
- 0, /* U+0105a7: */
- 0, /* U+0105a8: */
- 0, /* U+0105a9: */
- 0, /* U+0105aa: */
- 0, /* U+0105ab: */
- 0, /* U+0105ac: */
- 0, /* U+0105ad: */
- 0, /* U+0105ae: */
- 0, /* U+0105af: */
- 0, /* U+0105b0: */
- 0, /* U+0105b1: */
- 0, /* U+0105b2: */
- 0, /* U+0105b3: */
- 0, /* U+0105b4: */
- 0, /* U+0105b5: */
- 0, /* U+0105b6: */
- 0, /* U+0105b7: */
- 0, /* U+0105b8: */
- 0, /* U+0105b9: */
- 0, /* U+0105ba: */
- 0, /* U+0105bb: */
- 0, /* U+0105bc: */
- 0, /* U+0105bd: */
- 0, /* U+0105be: */
- 0, /* U+0105bf: */
- 0, /* U+0105c0: */
- 0, /* U+0105c1: */
- 0, /* U+0105c2: */
- 0, /* U+0105c3: */
- 0, /* U+0105c4: */
- 0, /* U+0105c5: */
- 0, /* U+0105c6: */
- 0, /* U+0105c7: */
- 0, /* U+0105c8: */
- 0, /* U+0105c9: */
- 0, /* U+0105ca: */
- 0, /* U+0105cb: */
- 0, /* U+0105cc: */
- 0, /* U+0105cd: */
- 0, /* U+0105ce: */
- 0, /* U+0105cf: */
- 0, /* U+0105d0: */
- 0, /* U+0105d1: */
- 0, /* U+0105d2: */
- 0, /* U+0105d3: */
- 0, /* U+0105d4: */
- 0, /* U+0105d5: */
- 0, /* U+0105d6: */
- 0, /* U+0105d7: */
- 0, /* U+0105d8: */
- 0, /* U+0105d9: */
- 0, /* U+0105da: */
- 0, /* U+0105db: */
- 0, /* U+0105dc: */
- 0, /* U+0105dd: */
- 0, /* U+0105de: */
- 0, /* U+0105df: */
- 0, /* U+0105e0: */
- 0, /* U+0105e1: */
- 0, /* U+0105e2: */
- 0, /* U+0105e3: */
- 0, /* U+0105e4: */
- 0, /* U+0105e5: */
- 0, /* U+0105e6: */
- 0, /* U+0105e7: */
- 0, /* U+0105e8: */
- 0, /* U+0105e9: */
- 0, /* U+0105ea: */
- 0, /* U+0105eb: */
- 0, /* U+0105ec: */
- 0, /* U+0105ed: */
- 0, /* U+0105ee: */
- 0, /* U+0105ef: */
- 0, /* U+0105f0: */
- 0, /* U+0105f1: */
- 0, /* U+0105f2: */
- 0, /* U+0105f3: */
- 0, /* U+0105f4: */
- 0, /* U+0105f5: */
- 0, /* U+0105f6: */
- 0, /* U+0105f7: */
- 0, /* U+0105f8: */
- 0, /* U+0105f9: */
- 0, /* U+0105fa: */
- 0, /* U+0105fb: */
- 0, /* U+0105fc: */
- 0, /* U+0105fd: */
- 0, /* U+0105fe: */
- 0, /* U+0105ff: */
- 0, /* U+010600: */
- 0, /* U+010601: */
- 0, /* U+010602: */
- 0, /* U+010603: */
- 0, /* U+010604: */
- 0, /* U+010605: */
- 0, /* U+010606: */
- 0, /* U+010607: */
- 0, /* U+010608: */
- 0, /* U+010609: */
- 0, /* U+01060a: */
- 0, /* U+01060b: */
- 0, /* U+01060c: */
- 0, /* U+01060d: */
- 0, /* U+01060e: */
- 0, /* U+01060f: */
- 0, /* U+010610: */
- 0, /* U+010611: */
- 0, /* U+010612: */
- 0, /* U+010613: */
- 0, /* U+010614: */
- 0, /* U+010615: */
- 0, /* U+010616: */
- 0, /* U+010617: */
- 0, /* U+010618: */
- 0, /* U+010619: */
- 0, /* U+01061a: */
- 0, /* U+01061b: */
- 0, /* U+01061c: */
- 0, /* U+01061d: */
- 0, /* U+01061e: */
- 0, /* U+01061f: */
- 0, /* U+010620: */
- 0, /* U+010621: */
- 0, /* U+010622: */
- 0, /* U+010623: */
- 0, /* U+010624: */
- 0, /* U+010625: */
- 0, /* U+010626: */
- 0, /* U+010627: */
- 0, /* U+010628: */
- 0, /* U+010629: */
- 0, /* U+01062a: */
- 0, /* U+01062b: */
- 0, /* U+01062c: */
- 0, /* U+01062d: */
- 0, /* U+01062e: */
- 0, /* U+01062f: */
- 0, /* U+010630: */
- 0, /* U+010631: */
- 0, /* U+010632: */
- 0, /* U+010633: */
- 0, /* U+010634: */
- 0, /* U+010635: */
- 0, /* U+010636: */
- 0, /* U+010637: */
- 0, /* U+010638: */
- 0, /* U+010639: */
- 0, /* U+01063a: */
- 0, /* U+01063b: */
- 0, /* U+01063c: */
- 0, /* U+01063d: */
- 0, /* U+01063e: */
- 0, /* U+01063f: */
- 0, /* U+010640: */
- 0, /* U+010641: */
- 0, /* U+010642: */
- 0, /* U+010643: */
- 0, /* U+010644: */
- 0, /* U+010645: */
- 0, /* U+010646: */
- 0, /* U+010647: */
- 0, /* U+010648: */
- 0, /* U+010649: */
- 0, /* U+01064a: */
- 0, /* U+01064b: */
- 0, /* U+01064c: */
- 0, /* U+01064d: */
- 0, /* U+01064e: */
- 0, /* U+01064f: */
- 0, /* U+010650: */
- 0, /* U+010651: */
- 0, /* U+010652: */
- 0, /* U+010653: */
- 0, /* U+010654: */
- 0, /* U+010655: */
- 0, /* U+010656: */
- 0, /* U+010657: */
- 0, /* U+010658: */
- 0, /* U+010659: */
- 0, /* U+01065a: */
- 0, /* U+01065b: */
- 0, /* U+01065c: */
- 0, /* U+01065d: */
- 0, /* U+01065e: */
- 0, /* U+01065f: */
- 0, /* U+010660: */
- 0, /* U+010661: */
- 0, /* U+010662: */
- 0, /* U+010663: */
- 0, /* U+010664: */
- 0, /* U+010665: */
- 0, /* U+010666: */
- 0, /* U+010667: */
- 0, /* U+010668: */
- 0, /* U+010669: */
- 0, /* U+01066a: */
- 0, /* U+01066b: */
- 0, /* U+01066c: */
- 0, /* U+01066d: */
- 0, /* U+01066e: */
- 0, /* U+01066f: */
- 0, /* U+010670: */
- 0, /* U+010671: */
- 0, /* U+010672: */
- 0, /* U+010673: */
- 0, /* U+010674: */
- 0, /* U+010675: */
- 0, /* U+010676: */
- 0, /* U+010677: */
- 0, /* U+010678: */
- 0, /* U+010679: */
- 0, /* U+01067a: */
- 0, /* U+01067b: */
- 0, /* U+01067c: */
- 0, /* U+01067d: */
- 0, /* U+01067e: */
- 0, /* U+01067f: */
- 0, /* U+010680: */
- 0, /* U+010681: */
- 0, /* U+010682: */
- 0, /* U+010683: */
- 0, /* U+010684: */
- 0, /* U+010685: */
- 0, /* U+010686: */
- 0, /* U+010687: */
- 0, /* U+010688: */
- 0, /* U+010689: */
- 0, /* U+01068a: */
- 0, /* U+01068b: */
- 0, /* U+01068c: */
- 0, /* U+01068d: */
- 0, /* U+01068e: */
- 0, /* U+01068f: */
- 0, /* U+010690: */
- 0, /* U+010691: */
- 0, /* U+010692: */
- 0, /* U+010693: */
- 0, /* U+010694: */
- 0, /* U+010695: */
- 0, /* U+010696: */
- 0, /* U+010697: */
- 0, /* U+010698: */
- 0, /* U+010699: */
- 0, /* U+01069a: */
- 0, /* U+01069b: */
- 0, /* U+01069c: */
- 0, /* U+01069d: */
- 0, /* U+01069e: */
- 0, /* U+01069f: */
- 0, /* U+0106a0: */
- 0, /* U+0106a1: */
- 0, /* U+0106a2: */
- 0, /* U+0106a3: */
- 0, /* U+0106a4: */
- 0, /* U+0106a5: */
- 0, /* U+0106a6: */
- 0, /* U+0106a7: */
- 0, /* U+0106a8: */
- 0, /* U+0106a9: */
- 0, /* U+0106aa: */
- 0, /* U+0106ab: */
- 0, /* U+0106ac: */
- 0, /* U+0106ad: */
- 0, /* U+0106ae: */
- 0, /* U+0106af: */
- 0, /* U+0106b0: */
- 0, /* U+0106b1: */
- 0, /* U+0106b2: */
- 0, /* U+0106b3: */
- 0, /* U+0106b4: */
- 0, /* U+0106b5: */
- 0, /* U+0106b6: */
- 0, /* U+0106b7: */
- 0, /* U+0106b8: */
- 0, /* U+0106b9: */
- 0, /* U+0106ba: */
- 0, /* U+0106bb: */
- 0, /* U+0106bc: */
- 0, /* U+0106bd: */
- 0, /* U+0106be: */
- 0, /* U+0106bf: */
- 0, /* U+0106c0: */
- 0, /* U+0106c1: */
- 0, /* U+0106c2: */
- 0, /* U+0106c3: */
- 0, /* U+0106c4: */
- 0, /* U+0106c5: */
- 0, /* U+0106c6: */
- 0, /* U+0106c7: */
- 0, /* U+0106c8: */
- 0, /* U+0106c9: */
- 0, /* U+0106ca: */
- 0, /* U+0106cb: */
- 0, /* U+0106cc: */
- 0, /* U+0106cd: */
- 0, /* U+0106ce: */
- 0, /* U+0106cf: */
- 0, /* U+0106d0: */
- 0, /* U+0106d1: */
- 0, /* U+0106d2: */
- 0, /* U+0106d3: */
- 0, /* U+0106d4: */
- 0, /* U+0106d5: */
- 0, /* U+0106d6: */
- 0, /* U+0106d7: */
- 0, /* U+0106d8: */
- 0, /* U+0106d9: */
- 0, /* U+0106da: */
- 0, /* U+0106db: */
- 0, /* U+0106dc: */
- 0, /* U+0106dd: */
- 0, /* U+0106de: */
- 0, /* U+0106df: */
- 0, /* U+0106e0: */
- 0, /* U+0106e1: */
- 0, /* U+0106e2: */
- 0, /* U+0106e3: */
- 0, /* U+0106e4: */
- 0, /* U+0106e5: */
- 0, /* U+0106e6: */
- 0, /* U+0106e7: */
- 0, /* U+0106e8: */
- 0, /* U+0106e9: */
- 0, /* U+0106ea: */
- 0, /* U+0106eb: */
- 0, /* U+0106ec: */
- 0, /* U+0106ed: */
- 0, /* U+0106ee: */
- 0, /* U+0106ef: */
- 0, /* U+0106f0: */
- 0, /* U+0106f1: */
- 0, /* U+0106f2: */
- 0, /* U+0106f3: */
- 0, /* U+0106f4: */
- 0, /* U+0106f5: */
- 0, /* U+0106f6: */
- 0, /* U+0106f7: */
- 0, /* U+0106f8: */
- 0, /* U+0106f9: */
- 0, /* U+0106fa: */
- 0, /* U+0106fb: */
- 0, /* U+0106fc: */
- 0, /* U+0106fd: */
- 0, /* U+0106fe: */
- 0, /* U+0106ff: */
- 0, /* U+010700: */
- 0, /* U+010701: */
- 0, /* U+010702: */
- 0, /* U+010703: */
- 0, /* U+010704: */
- 0, /* U+010705: */
- 0, /* U+010706: */
- 0, /* U+010707: */
- 0, /* U+010708: */
- 0, /* U+010709: */
- 0, /* U+01070a: */
- 0, /* U+01070b: */
- 0, /* U+01070c: */
- 0, /* U+01070d: */
- 0, /* U+01070e: */
- 0, /* U+01070f: */
- 0, /* U+010710: */
- 0, /* U+010711: */
- 0, /* U+010712: */
- 0, /* U+010713: */
- 0, /* U+010714: */
- 0, /* U+010715: */
- 0, /* U+010716: */
- 0, /* U+010717: */
- 0, /* U+010718: */
- 0, /* U+010719: */
- 0, /* U+01071a: */
- 0, /* U+01071b: */
- 0, /* U+01071c: */
- 0, /* U+01071d: */
- 0, /* U+01071e: */
- 0, /* U+01071f: */
- 0, /* U+010720: */
- 0, /* U+010721: */
- 0, /* U+010722: */
- 0, /* U+010723: */
- 0, /* U+010724: */
- 0, /* U+010725: */
- 0, /* U+010726: */
- 0, /* U+010727: */
- 0, /* U+010728: */
- 0, /* U+010729: */
- 0, /* U+01072a: */
- 0, /* U+01072b: */
- 0, /* U+01072c: */
- 0, /* U+01072d: */
- 0, /* U+01072e: */
- 0, /* U+01072f: */
- 0, /* U+010730: */
- 0, /* U+010731: */
- 0, /* U+010732: */
- 0, /* U+010733: */
- 0, /* U+010734: */
- 0, /* U+010735: */
- 0, /* U+010736: */
- 0, /* U+010737: */
- 0, /* U+010738: */
- 0, /* U+010739: */
- 0, /* U+01073a: */
- 0, /* U+01073b: */
- 0, /* U+01073c: */
- 0, /* U+01073d: */
- 0, /* U+01073e: */
- 0, /* U+01073f: */
- 0, /* U+010740: */
- 0, /* U+010741: */
- 0, /* U+010742: */
- 0, /* U+010743: */
- 0, /* U+010744: */
- 0, /* U+010745: */
- 0, /* U+010746: */
- 0, /* U+010747: */
- 0, /* U+010748: */
- 0, /* U+010749: */
- 0, /* U+01074a: */
- 0, /* U+01074b: */
- 0, /* U+01074c: */
- 0, /* U+01074d: */
- 0, /* U+01074e: */
- 0, /* U+01074f: */
- 0, /* U+010750: */
- 0, /* U+010751: */
- 0, /* U+010752: */
- 0, /* U+010753: */
- 0, /* U+010754: */
- 0, /* U+010755: */
- 0, /* U+010756: */
- 0, /* U+010757: */
- 0, /* U+010758: */
- 0, /* U+010759: */
- 0, /* U+01075a: */
- 0, /* U+01075b: */
- 0, /* U+01075c: */
- 0, /* U+01075d: */
- 0, /* U+01075e: */
- 0, /* U+01075f: */
- 0, /* U+010760: */
- 0, /* U+010761: */
- 0, /* U+010762: */
- 0, /* U+010763: */
- 0, /* U+010764: */
- 0, /* U+010765: */
- 0, /* U+010766: */
- 0, /* U+010767: */
- 0, /* U+010768: */
- 0, /* U+010769: */
- 0, /* U+01076a: */
- 0, /* U+01076b: */
- 0, /* U+01076c: */
- 0, /* U+01076d: */
- 0, /* U+01076e: */
- 0, /* U+01076f: */
- 0, /* U+010770: */
- 0, /* U+010771: */
- 0, /* U+010772: */
- 0, /* U+010773: */
- 0, /* U+010774: */
- 0, /* U+010775: */
- 0, /* U+010776: */
- 0, /* U+010777: */
- 0, /* U+010778: */
- 0, /* U+010779: */
- 0, /* U+01077a: */
- 0, /* U+01077b: */
- 0, /* U+01077c: */
- 0, /* U+01077d: */
- 0, /* U+01077e: */
- 0, /* U+01077f: */
- 0, /* U+010780: */
- 0, /* U+010781: */
- 0, /* U+010782: */
- 0, /* U+010783: */
- 0, /* U+010784: */
- 0, /* U+010785: */
- 0, /* U+010786: */
- 0, /* U+010787: */
- 0, /* U+010788: */
- 0, /* U+010789: */
- 0, /* U+01078a: */
- 0, /* U+01078b: */
- 0, /* U+01078c: */
- 0, /* U+01078d: */
- 0, /* U+01078e: */
- 0, /* U+01078f: */
- 0, /* U+010790: */
- 0, /* U+010791: */
- 0, /* U+010792: */
- 0, /* U+010793: */
- 0, /* U+010794: */
- 0, /* U+010795: */
- 0, /* U+010796: */
- 0, /* U+010797: */
- 0, /* U+010798: */
- 0, /* U+010799: */
- 0, /* U+01079a: */
- 0, /* U+01079b: */
- 0, /* U+01079c: */
- 0, /* U+01079d: */
- 0, /* U+01079e: */
- 0, /* U+01079f: */
- 0, /* U+0107a0: */
- 0, /* U+0107a1: */
- 0, /* U+0107a2: */
- 0, /* U+0107a3: */
- 0, /* U+0107a4: */
- 0, /* U+0107a5: */
- 0, /* U+0107a6: */
- 0, /* U+0107a7: */
- 0, /* U+0107a8: */
- 0, /* U+0107a9: */
- 0, /* U+0107aa: */
- 0, /* U+0107ab: */
- 0, /* U+0107ac: */
- 0, /* U+0107ad: */
- 0, /* U+0107ae: */
- 0, /* U+0107af: */
- 0, /* U+0107b0: */
- 0, /* U+0107b1: */
- 0, /* U+0107b2: */
- 0, /* U+0107b3: */
- 0, /* U+0107b4: */
- 0, /* U+0107b5: */
- 0, /* U+0107b6: */
- 0, /* U+0107b7: */
- 0, /* U+0107b8: */
- 0, /* U+0107b9: */
- 0, /* U+0107ba: */
- 0, /* U+0107bb: */
- 0, /* U+0107bc: */
- 0, /* U+0107bd: */
- 0, /* U+0107be: */
- 0, /* U+0107bf: */
- 0, /* U+0107c0: */
- 0, /* U+0107c1: */
- 0, /* U+0107c2: */
- 0, /* U+0107c3: */
- 0, /* U+0107c4: */
- 0, /* U+0107c5: */
- 0, /* U+0107c6: */
- 0, /* U+0107c7: */
- 0, /* U+0107c8: */
- 0, /* U+0107c9: */
- 0, /* U+0107ca: */
- 0, /* U+0107cb: */
- 0, /* U+0107cc: */
- 0, /* U+0107cd: */
- 0, /* U+0107ce: */
- 0, /* U+0107cf: */
- 0, /* U+0107d0: */
- 0, /* U+0107d1: */
- 0, /* U+0107d2: */
- 0, /* U+0107d3: */
- 0, /* U+0107d4: */
- 0, /* U+0107d5: */
- 0, /* U+0107d6: */
- 0, /* U+0107d7: */
- 0, /* U+0107d8: */
- 0, /* U+0107d9: */
- 0, /* U+0107da: */
- 0, /* U+0107db: */
- 0, /* U+0107dc: */
- 0, /* U+0107dd: */
- 0, /* U+0107de: */
- 0, /* U+0107df: */
- 0, /* U+0107e0: */
- 0, /* U+0107e1: */
- 0, /* U+0107e2: */
- 0, /* U+0107e3: */
- 0, /* U+0107e4: */
- 0, /* U+0107e5: */
- 0, /* U+0107e6: */
- 0, /* U+0107e7: */
- 0, /* U+0107e8: */
- 0, /* U+0107e9: */
- 0, /* U+0107ea: */
- 0, /* U+0107eb: */
- 0, /* U+0107ec: */
- 0, /* U+0107ed: */
- 0, /* U+0107ee: */
- 0, /* U+0107ef: */
- 0, /* U+0107f0: */
- 0, /* U+0107f1: */
- 0, /* U+0107f2: */
- 0, /* U+0107f3: */
- 0, /* U+0107f4: */
- 0, /* U+0107f5: */
- 0, /* U+0107f6: */
- 0, /* U+0107f7: */
- 0, /* U+0107f8: */
- 0, /* U+0107f9: */
- 0, /* U+0107fa: */
- 0, /* U+0107fb: */
- 0, /* U+0107fc: */
- 0, /* U+0107fd: */
- 0, /* U+0107fe: */
- 0, /* U+0107ff: */
- RTUNI_ALPHA, /* U+010800: CYPRIOT SYLLABLE A*/
- RTUNI_ALPHA, /* U+010801: CYPRIOT SYLLABLE E*/
- RTUNI_ALPHA, /* U+010802: CYPRIOT SYLLABLE I*/
- RTUNI_ALPHA, /* U+010803: CYPRIOT SYLLABLE O*/
- RTUNI_ALPHA, /* U+010804: CYPRIOT SYLLABLE U*/
- RTUNI_ALPHA, /* U+010805: CYPRIOT SYLLABLE JA*/
- 0, /* U+010806: */
- 0, /* U+010807: */
- RTUNI_ALPHA, /* U+010808: CYPRIOT SYLLABLE JO*/
- 0, /* U+010809: */
- RTUNI_ALPHA, /* U+01080a: CYPRIOT SYLLABLE KA*/
- RTUNI_ALPHA, /* U+01080b: CYPRIOT SYLLABLE KE*/
- RTUNI_ALPHA, /* U+01080c: CYPRIOT SYLLABLE KI*/
- RTUNI_ALPHA, /* U+01080d: CYPRIOT SYLLABLE KO*/
- RTUNI_ALPHA, /* U+01080e: CYPRIOT SYLLABLE KU*/
- RTUNI_ALPHA, /* U+01080f: CYPRIOT SYLLABLE LA*/
- RTUNI_ALPHA, /* U+010810: CYPRIOT SYLLABLE LE*/
- RTUNI_ALPHA, /* U+010811: CYPRIOT SYLLABLE LI*/
- RTUNI_ALPHA, /* U+010812: CYPRIOT SYLLABLE LO*/
- RTUNI_ALPHA, /* U+010813: CYPRIOT SYLLABLE LU*/
- RTUNI_ALPHA, /* U+010814: CYPRIOT SYLLABLE MA*/
- RTUNI_ALPHA, /* U+010815: CYPRIOT SYLLABLE ME*/
- RTUNI_ALPHA, /* U+010816: CYPRIOT SYLLABLE MI*/
- RTUNI_ALPHA, /* U+010817: CYPRIOT SYLLABLE MO*/
- RTUNI_ALPHA, /* U+010818: CYPRIOT SYLLABLE MU*/
- RTUNI_ALPHA, /* U+010819: CYPRIOT SYLLABLE NA*/
- RTUNI_ALPHA, /* U+01081a: CYPRIOT SYLLABLE NE*/
- RTUNI_ALPHA, /* U+01081b: CYPRIOT SYLLABLE NI*/
- RTUNI_ALPHA, /* U+01081c: CYPRIOT SYLLABLE NO*/
- RTUNI_ALPHA, /* U+01081d: CYPRIOT SYLLABLE NU*/
- RTUNI_ALPHA, /* U+01081e: CYPRIOT SYLLABLE PA*/
- RTUNI_ALPHA, /* U+01081f: CYPRIOT SYLLABLE PE*/
- RTUNI_ALPHA, /* U+010820: CYPRIOT SYLLABLE PI*/
- RTUNI_ALPHA, /* U+010821: CYPRIOT SYLLABLE PO*/
- RTUNI_ALPHA, /* U+010822: CYPRIOT SYLLABLE PU*/
- RTUNI_ALPHA, /* U+010823: CYPRIOT SYLLABLE RA*/
- RTUNI_ALPHA, /* U+010824: CYPRIOT SYLLABLE RE*/
- RTUNI_ALPHA, /* U+010825: CYPRIOT SYLLABLE RI*/
- RTUNI_ALPHA, /* U+010826: CYPRIOT SYLLABLE RO*/
- RTUNI_ALPHA, /* U+010827: CYPRIOT SYLLABLE RU*/
- RTUNI_ALPHA, /* U+010828: CYPRIOT SYLLABLE SA*/
- RTUNI_ALPHA, /* U+010829: CYPRIOT SYLLABLE SE*/
- RTUNI_ALPHA, /* U+01082a: CYPRIOT SYLLABLE SI*/
- RTUNI_ALPHA, /* U+01082b: CYPRIOT SYLLABLE SO*/
- RTUNI_ALPHA, /* U+01082c: CYPRIOT SYLLABLE SU*/
- RTUNI_ALPHA, /* U+01082d: CYPRIOT SYLLABLE TA*/
- RTUNI_ALPHA, /* U+01082e: CYPRIOT SYLLABLE TE*/
- RTUNI_ALPHA, /* U+01082f: CYPRIOT SYLLABLE TI*/
- RTUNI_ALPHA, /* U+010830: CYPRIOT SYLLABLE TO*/
- RTUNI_ALPHA, /* U+010831: CYPRIOT SYLLABLE TU*/
- RTUNI_ALPHA, /* U+010832: CYPRIOT SYLLABLE WA*/
- RTUNI_ALPHA, /* U+010833: CYPRIOT SYLLABLE WE*/
- RTUNI_ALPHA, /* U+010834: CYPRIOT SYLLABLE WI*/
- RTUNI_ALPHA, /* U+010835: CYPRIOT SYLLABLE WO*/
- 0, /* U+010836: */
- RTUNI_ALPHA, /* U+010837: CYPRIOT SYLLABLE XA*/
- RTUNI_ALPHA, /* U+010838: CYPRIOT SYLLABLE XE*/
- 0, /* U+010839: */
- 0, /* U+01083a: */
- 0, /* U+01083b: */
- RTUNI_ALPHA, /* U+01083c: CYPRIOT SYLLABLE ZA*/
- 0, /* U+01083d: */
- 0, /* U+01083e: */
- RTUNI_ALPHA, /* U+01083f: CYPRIOT SYLLABLE ZO*/
- 0, /* U+010840: */
- 0, /* U+010841: */
- 0, /* U+010842: */
- 0, /* U+010843: */
- 0, /* U+010844: */
- 0, /* U+010845: */
- 0, /* U+010846: */
- 0, /* U+010847: */
- 0, /* U+010848: */
- 0, /* U+010849: */
- 0, /* U+01084a: */
- 0, /* U+01084b: */
- 0, /* U+01084c: */
- 0, /* U+01084d: */
- 0, /* U+01084e: */
- 0, /* U+01084f: */
- 0, /* U+010850: */
- 0, /* U+010851: */
- 0, /* U+010852: */
- 0, /* U+010853: */
- 0, /* U+010854: */
- 0, /* U+010855: */
- 0, /* U+010856: */
- 0, /* U+010857: */
- 0, /* U+010858: */
- 0, /* U+010859: */
- 0, /* U+01085a: */
- 0, /* U+01085b: */
- 0, /* U+01085c: */
- 0, /* U+01085d: */
- 0, /* U+01085e: */
- 0, /* U+01085f: */
- 0, /* U+010860: */
- 0, /* U+010861: */
- 0, /* U+010862: */
- 0, /* U+010863: */
- 0, /* U+010864: */
- 0, /* U+010865: */
- 0, /* U+010866: */
- 0, /* U+010867: */
- 0, /* U+010868: */
- 0, /* U+010869: */
- 0, /* U+01086a: */
- 0, /* U+01086b: */
- 0, /* U+01086c: */
- 0, /* U+01086d: */
- 0, /* U+01086e: */
- 0, /* U+01086f: */
- 0, /* U+010870: */
- 0, /* U+010871: */
- 0, /* U+010872: */
- 0, /* U+010873: */
- 0, /* U+010874: */
- 0, /* U+010875: */
- 0, /* U+010876: */
- 0, /* U+010877: */
- 0, /* U+010878: */
- 0, /* U+010879: */
- 0, /* U+01087a: */
- 0, /* U+01087b: */
- 0, /* U+01087c: */
- 0, /* U+01087d: */
- 0, /* U+01087e: */
- 0, /* U+01087f: */
- 0, /* U+010880: */
- 0, /* U+010881: */
- 0, /* U+010882: */
- 0, /* U+010883: */
- 0, /* U+010884: */
- 0, /* U+010885: */
- 0, /* U+010886: */
- 0, /* U+010887: */
- 0, /* U+010888: */
- 0, /* U+010889: */
- 0, /* U+01088a: */
- 0, /* U+01088b: */
- 0, /* U+01088c: */
- 0, /* U+01088d: */
- 0, /* U+01088e: */
- 0, /* U+01088f: */
- 0, /* U+010890: */
- 0, /* U+010891: */
- 0, /* U+010892: */
- 0, /* U+010893: */
- 0, /* U+010894: */
- 0, /* U+010895: */
- 0, /* U+010896: */
- 0, /* U+010897: */
- 0, /* U+010898: */
- 0, /* U+010899: */
- 0, /* U+01089a: */
- 0, /* U+01089b: */
- 0, /* U+01089c: */
- 0, /* U+01089d: */
- 0, /* U+01089e: */
- 0, /* U+01089f: */
- 0, /* U+0108a0: */
- 0, /* U+0108a1: */
- 0, /* U+0108a2: */
- 0, /* U+0108a3: */
- 0, /* U+0108a4: */
- 0, /* U+0108a5: */
- 0, /* U+0108a6: */
- 0, /* U+0108a7: */
- 0, /* U+0108a8: */
- 0, /* U+0108a9: */
- 0, /* U+0108aa: */
- 0, /* U+0108ab: */
- 0, /* U+0108ac: */
- 0, /* U+0108ad: */
- 0, /* U+0108ae: */
- 0, /* U+0108af: */
- 0, /* U+0108b0: */
- 0, /* U+0108b1: */
- 0, /* U+0108b2: */
- 0, /* U+0108b3: */
- 0, /* U+0108b4: */
- 0, /* U+0108b5: */
- 0, /* U+0108b6: */
- 0, /* U+0108b7: */
- 0, /* U+0108b8: */
- 0, /* U+0108b9: */
- 0, /* U+0108ba: */
- 0, /* U+0108bb: */
- 0, /* U+0108bc: */
- 0, /* U+0108bd: */
- 0, /* U+0108be: */
- 0, /* U+0108bf: */
- 0, /* U+0108c0: */
- 0, /* U+0108c1: */
- 0, /* U+0108c2: */
- 0, /* U+0108c3: */
- 0, /* U+0108c4: */
- 0, /* U+0108c5: */
- 0, /* U+0108c6: */
- 0, /* U+0108c7: */
- 0, /* U+0108c8: */
- 0, /* U+0108c9: */
- 0, /* U+0108ca: */
- 0, /* U+0108cb: */
- 0, /* U+0108cc: */
- 0, /* U+0108cd: */
- 0, /* U+0108ce: */
- 0, /* U+0108cf: */
- 0, /* U+0108d0: */
- 0, /* U+0108d1: */
- 0, /* U+0108d2: */
- 0, /* U+0108d3: */
- 0, /* U+0108d4: */
- 0, /* U+0108d5: */
- 0, /* U+0108d6: */
- 0, /* U+0108d7: */
- 0, /* U+0108d8: */
- 0, /* U+0108d9: */
- 0, /* U+0108da: */
- 0, /* U+0108db: */
- 0, /* U+0108dc: */
- 0, /* U+0108dd: */
- 0, /* U+0108de: */
- 0, /* U+0108df: */
- 0, /* U+0108e0: */
- 0, /* U+0108e1: */
- 0, /* U+0108e2: */
- 0, /* U+0108e3: */
- 0, /* U+0108e4: */
- 0, /* U+0108e5: */
- 0, /* U+0108e6: */
- 0, /* U+0108e7: */
- 0, /* U+0108e8: */
- 0, /* U+0108e9: */
- 0, /* U+0108ea: */
- 0, /* U+0108eb: */
- 0, /* U+0108ec: */
- 0, /* U+0108ed: */
- 0, /* U+0108ee: */
- 0, /* U+0108ef: */
- 0, /* U+0108f0: */
- 0, /* U+0108f1: */
- 0, /* U+0108f2: */
- 0, /* U+0108f3: */
- 0, /* U+0108f4: */
- 0, /* U+0108f5: */
- 0, /* U+0108f6: */
- 0, /* U+0108f7: */
- 0, /* U+0108f8: */
- 0, /* U+0108f9: */
- 0, /* U+0108fa: */
- 0, /* U+0108fb: */
- 0, /* U+0108fc: */
- 0, /* U+0108fd: */
- 0, /* U+0108fe: */
- 0, /* U+0108ff: */
- 0, /* U+010900: */
- 0, /* U+010901: */
- 0, /* U+010902: */
- 0, /* U+010903: */
- 0, /* U+010904: */
- 0, /* U+010905: */
- 0, /* U+010906: */
- 0, /* U+010907: */
- 0, /* U+010908: */
- 0, /* U+010909: */
- 0, /* U+01090a: */
- 0, /* U+01090b: */
- 0, /* U+01090c: */
- 0, /* U+01090d: */
- 0, /* U+01090e: */
- 0, /* U+01090f: */
- 0, /* U+010910: */
- 0, /* U+010911: */
- 0, /* U+010912: */
- 0, /* U+010913: */
- 0, /* U+010914: */
- 0, /* U+010915: */
- 0, /* U+010916: */
- 0, /* U+010917: */
- 0, /* U+010918: */
- 0, /* U+010919: */
- 0, /* U+01091a: */
- 0, /* U+01091b: */
- 0, /* U+01091c: */
- 0, /* U+01091d: */
- 0, /* U+01091e: */
- 0, /* U+01091f: */
- 0, /* U+010920: */
- 0, /* U+010921: */
- 0, /* U+010922: */
- 0, /* U+010923: */
- 0, /* U+010924: */
- 0, /* U+010925: */
- 0, /* U+010926: */
- 0, /* U+010927: */
- 0, /* U+010928: */
- 0, /* U+010929: */
- 0, /* U+01092a: */
- 0, /* U+01092b: */
- 0, /* U+01092c: */
- 0, /* U+01092d: */
- 0, /* U+01092e: */
- 0, /* U+01092f: */
- 0, /* U+010930: */
- 0, /* U+010931: */
- 0, /* U+010932: */
- 0, /* U+010933: */
- 0, /* U+010934: */
- 0, /* U+010935: */
- 0, /* U+010936: */
- 0, /* U+010937: */
- 0, /* U+010938: */
- 0, /* U+010939: */
- 0, /* U+01093a: */
- 0, /* U+01093b: */
- 0, /* U+01093c: */
- 0, /* U+01093d: */
- 0, /* U+01093e: */
- 0, /* U+01093f: */
- 0, /* U+010940: */
- 0, /* U+010941: */
- 0, /* U+010942: */
- 0, /* U+010943: */
- 0, /* U+010944: */
- 0, /* U+010945: */
- 0, /* U+010946: */
- 0, /* U+010947: */
- 0, /* U+010948: */
- 0, /* U+010949: */
- 0, /* U+01094a: */
- 0, /* U+01094b: */
- 0, /* U+01094c: */
- 0, /* U+01094d: */
- 0, /* U+01094e: */
- 0, /* U+01094f: */
- 0, /* U+010950: */
- 0, /* U+010951: */
- 0, /* U+010952: */
- 0, /* U+010953: */
- 0, /* U+010954: */
- 0, /* U+010955: */
- 0, /* U+010956: */
- 0, /* U+010957: */
- 0, /* U+010958: */
- 0, /* U+010959: */
- 0, /* U+01095a: */
- 0, /* U+01095b: */
- 0, /* U+01095c: */
- 0, /* U+01095d: */
- 0, /* U+01095e: */
- 0, /* U+01095f: */
- 0, /* U+010960: */
- 0, /* U+010961: */
- 0, /* U+010962: */
- 0, /* U+010963: */
- 0, /* U+010964: */
- 0, /* U+010965: */
- 0, /* U+010966: */
- 0, /* U+010967: */
- 0, /* U+010968: */
- 0, /* U+010969: */
- 0, /* U+01096a: */
- 0, /* U+01096b: */
- 0, /* U+01096c: */
- 0, /* U+01096d: */
- 0, /* U+01096e: */
- 0, /* U+01096f: */
- 0, /* U+010970: */
- 0, /* U+010971: */
- 0, /* U+010972: */
- 0, /* U+010973: */
- 0, /* U+010974: */
- 0, /* U+010975: */
- 0, /* U+010976: */
- 0, /* U+010977: */
- 0, /* U+010978: */
- 0, /* U+010979: */
- 0, /* U+01097a: */
- 0, /* U+01097b: */
- 0, /* U+01097c: */
- 0, /* U+01097d: */
- 0, /* U+01097e: */
- 0, /* U+01097f: */
- 0, /* U+010980: */
- 0, /* U+010981: */
- 0, /* U+010982: */
- 0, /* U+010983: */
- 0, /* U+010984: */
- 0, /* U+010985: */
- 0, /* U+010986: */
- 0, /* U+010987: */
- 0, /* U+010988: */
- 0, /* U+010989: */
- 0, /* U+01098a: */
- 0, /* U+01098b: */
- 0, /* U+01098c: */
- 0, /* U+01098d: */
- 0, /* U+01098e: */
- 0, /* U+01098f: */
- 0, /* U+010990: */
- 0, /* U+010991: */
- 0, /* U+010992: */
- 0, /* U+010993: */
- 0, /* U+010994: */
- 0, /* U+010995: */
- 0, /* U+010996: */
- 0, /* U+010997: */
- 0, /* U+010998: */
- 0, /* U+010999: */
- 0, /* U+01099a: */
- 0, /* U+01099b: */
- 0, /* U+01099c: */
- 0, /* U+01099d: */
- 0, /* U+01099e: */
- 0, /* U+01099f: */
- 0, /* U+0109a0: */
- 0, /* U+0109a1: */
- 0, /* U+0109a2: */
- 0, /* U+0109a3: */
- 0, /* U+0109a4: */
- 0, /* U+0109a5: */
- 0, /* U+0109a6: */
- 0, /* U+0109a7: */
- 0, /* U+0109a8: */
- 0, /* U+0109a9: */
- 0, /* U+0109aa: */
- 0, /* U+0109ab: */
- 0, /* U+0109ac: */
- 0, /* U+0109ad: */
- 0, /* U+0109ae: */
- 0, /* U+0109af: */
- 0, /* U+0109b0: */
- 0, /* U+0109b1: */
- 0, /* U+0109b2: */
- 0, /* U+0109b3: */
- 0, /* U+0109b4: */
- 0, /* U+0109b5: */
- 0, /* U+0109b6: */
- 0, /* U+0109b7: */
- 0, /* U+0109b8: */
- 0, /* U+0109b9: */
- 0, /* U+0109ba: */
- 0, /* U+0109bb: */
- 0, /* U+0109bc: */
- 0, /* U+0109bd: */
- 0, /* U+0109be: */
- 0, /* U+0109bf: */
- 0, /* U+0109c0: */
- 0, /* U+0109c1: */
- 0, /* U+0109c2: */
- 0, /* U+0109c3: */
- 0, /* U+0109c4: */
- 0, /* U+0109c5: */
- 0, /* U+0109c6: */
- 0, /* U+0109c7: */
- 0, /* U+0109c8: */
- 0, /* U+0109c9: */
- 0, /* U+0109ca: */
- 0, /* U+0109cb: */
- 0, /* U+0109cc: */
- 0, /* U+0109cd: */
- 0, /* U+0109ce: */
- 0, /* U+0109cf: */
- 0, /* U+0109d0: */
- 0, /* U+0109d1: */
- 0, /* U+0109d2: */
- 0, /* U+0109d3: */
- 0, /* U+0109d4: */
- 0, /* U+0109d5: */
- 0, /* U+0109d6: */
- 0, /* U+0109d7: */
- 0, /* U+0109d8: */
- 0, /* U+0109d9: */
- 0, /* U+0109da: */
- 0, /* U+0109db: */
- 0, /* U+0109dc: */
- 0, /* U+0109dd: */
- 0, /* U+0109de: */
- 0, /* U+0109df: */
- 0, /* U+0109e0: */
- 0, /* U+0109e1: */
- 0, /* U+0109e2: */
- 0, /* U+0109e3: */
- 0, /* U+0109e4: */
- 0, /* U+0109e5: */
- 0, /* U+0109e6: */
- 0, /* U+0109e7: */
- 0, /* U+0109e8: */
- 0, /* U+0109e9: */
- 0, /* U+0109ea: */
- 0, /* U+0109eb: */
- 0, /* U+0109ec: */
- 0, /* U+0109ed: */
- 0, /* U+0109ee: */
- 0, /* U+0109ef: */
- 0, /* U+0109f0: */
- 0, /* U+0109f1: */
- 0, /* U+0109f2: */
- 0, /* U+0109f3: */
- 0, /* U+0109f4: */
- 0, /* U+0109f5: */
- 0, /* U+0109f6: */
- 0, /* U+0109f7: */
- 0, /* U+0109f8: */
- 0, /* U+0109f9: */
- 0, /* U+0109fa: */
- 0, /* U+0109fb: */
- 0, /* U+0109fc: */
- 0, /* U+0109fd: */
- 0, /* U+0109fe: */
- 0, /* U+0109ff: */
- RTUNI_ALPHA, /* U+010a00: KHAROSHTHI LETTER A*/
- RTUNI_ALPHA, /* U+010a01: KHAROSHTHI VOWEL SIGN I*/
- RTUNI_ALPHA, /* U+010a02: KHAROSHTHI VOWEL SIGN U*/
- RTUNI_ALPHA, /* U+010a03: KHAROSHTHI VOWEL SIGN VOCALIC R*/
- 0, /* U+010a04: */
- RTUNI_ALPHA, /* U+010a05: KHAROSHTHI VOWEL SIGN E*/
- RTUNI_ALPHA, /* U+010a06: KHAROSHTHI VOWEL SIGN O*/
- 0, /* U+010a07: */
- 0, /* U+010a08: */
- 0, /* U+010a09: */
- 0, /* U+010a0a: */
- 0, /* U+010a0b: */
- RTUNI_ALPHA, /* U+010a0c: KHAROSHTHI VOWEL LENGTH MARK*/
- RTUNI_ALPHA, /* U+010a0d: KHAROSHTHI SIGN DOUBLE RING BELOW*/
- RTUNI_ALPHA, /* U+010a0e: KHAROSHTHI SIGN ANUSVARA*/
- RTUNI_ALPHA, /* U+010a0f: KHAROSHTHI SIGN VISARGA*/
- RTUNI_ALPHA, /* U+010a10: KHAROSHTHI LETTER KA*/
- RTUNI_ALPHA, /* U+010a11: KHAROSHTHI LETTER KHA*/
- RTUNI_ALPHA, /* U+010a12: KHAROSHTHI LETTER GA*/
- RTUNI_ALPHA, /* U+010a13: KHAROSHTHI LETTER GHA*/
- 0, /* U+010a14: */
- RTUNI_ALPHA, /* U+010a15: KHAROSHTHI LETTER CA*/
- RTUNI_ALPHA, /* U+010a16: KHAROSHTHI LETTER CHA*/
- RTUNI_ALPHA, /* U+010a17: KHAROSHTHI LETTER JA*/
- 0, /* U+010a18: */
- RTUNI_ALPHA, /* U+010a19: KHAROSHTHI LETTER NYA*/
- RTUNI_ALPHA, /* U+010a1a: KHAROSHTHI LETTER TTA*/
- RTUNI_ALPHA, /* U+010a1b: KHAROSHTHI LETTER TTHA*/
- RTUNI_ALPHA, /* U+010a1c: KHAROSHTHI LETTER DDA*/
- RTUNI_ALPHA, /* U+010a1d: KHAROSHTHI LETTER DDHA*/
- RTUNI_ALPHA, /* U+010a1e: KHAROSHTHI LETTER NNA*/
- RTUNI_ALPHA, /* U+010a1f: KHAROSHTHI LETTER TA*/
- RTUNI_ALPHA, /* U+010a20: KHAROSHTHI LETTER THA*/
- RTUNI_ALPHA, /* U+010a21: KHAROSHTHI LETTER DA*/
- RTUNI_ALPHA, /* U+010a22: KHAROSHTHI LETTER DHA*/
- RTUNI_ALPHA, /* U+010a23: KHAROSHTHI LETTER NA*/
- RTUNI_ALPHA, /* U+010a24: KHAROSHTHI LETTER PA*/
- RTUNI_ALPHA, /* U+010a25: KHAROSHTHI LETTER PHA*/
- RTUNI_ALPHA, /* U+010a26: KHAROSHTHI LETTER BA*/
- RTUNI_ALPHA, /* U+010a27: KHAROSHTHI LETTER BHA*/
- RTUNI_ALPHA, /* U+010a28: KHAROSHTHI LETTER MA*/
- RTUNI_ALPHA, /* U+010a29: KHAROSHTHI LETTER YA*/
- RTUNI_ALPHA, /* U+010a2a: KHAROSHTHI LETTER RA*/
- RTUNI_ALPHA, /* U+010a2b: KHAROSHTHI LETTER LA*/
- RTUNI_ALPHA, /* U+010a2c: KHAROSHTHI LETTER VA*/
- RTUNI_ALPHA, /* U+010a2d: KHAROSHTHI LETTER SHA*/
- RTUNI_ALPHA, /* U+010a2e: KHAROSHTHI LETTER SSA*/
- RTUNI_ALPHA, /* U+010a2f: KHAROSHTHI LETTER SA*/
- RTUNI_ALPHA, /* U+010a30: KHAROSHTHI LETTER ZA*/
- RTUNI_ALPHA, /* U+010a31: KHAROSHTHI LETTER HA*/
- RTUNI_ALPHA, /* U+010a32: KHAROSHTHI LETTER KKA*/
- RTUNI_ALPHA, /* U+010a33: KHAROSHTHI LETTER TTTHA*/
-};
-
-static const uint8_t g_afRTUniFlags0x01d400[] =
-{
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d400: MATHEMATICAL BOLD CAPITAL A*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d401: MATHEMATICAL BOLD CAPITAL B*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d402: MATHEMATICAL BOLD CAPITAL C*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d403: MATHEMATICAL BOLD CAPITAL D*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d404: MATHEMATICAL BOLD CAPITAL E*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d405: MATHEMATICAL BOLD CAPITAL F*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d406: MATHEMATICAL BOLD CAPITAL G*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d407: MATHEMATICAL BOLD CAPITAL H*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d408: MATHEMATICAL BOLD CAPITAL I*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d409: MATHEMATICAL BOLD CAPITAL J*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d40a: MATHEMATICAL BOLD CAPITAL K*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d40b: MATHEMATICAL BOLD CAPITAL L*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d40c: MATHEMATICAL BOLD CAPITAL M*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d40d: MATHEMATICAL BOLD CAPITAL N*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d40e: MATHEMATICAL BOLD CAPITAL O*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d40f: MATHEMATICAL BOLD CAPITAL P*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d410: MATHEMATICAL BOLD CAPITAL Q*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d411: MATHEMATICAL BOLD CAPITAL R*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d412: MATHEMATICAL BOLD CAPITAL S*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d413: MATHEMATICAL BOLD CAPITAL T*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d414: MATHEMATICAL BOLD CAPITAL U*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d415: MATHEMATICAL BOLD CAPITAL V*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d416: MATHEMATICAL BOLD CAPITAL W*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d417: MATHEMATICAL BOLD CAPITAL X*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d418: MATHEMATICAL BOLD CAPITAL Y*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d419: MATHEMATICAL BOLD CAPITAL Z*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d41a: MATHEMATICAL BOLD SMALL A*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d41b: MATHEMATICAL BOLD SMALL B*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d41c: MATHEMATICAL BOLD SMALL C*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d41d: MATHEMATICAL BOLD SMALL D*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d41e: MATHEMATICAL BOLD SMALL E*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d41f: MATHEMATICAL BOLD SMALL F*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d420: MATHEMATICAL BOLD SMALL G*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d421: MATHEMATICAL BOLD SMALL H*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d422: MATHEMATICAL BOLD SMALL I*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d423: MATHEMATICAL BOLD SMALL J*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d424: MATHEMATICAL BOLD SMALL K*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d425: MATHEMATICAL BOLD SMALL L*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d426: MATHEMATICAL BOLD SMALL M*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d427: MATHEMATICAL BOLD SMALL N*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d428: MATHEMATICAL BOLD SMALL O*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d429: MATHEMATICAL BOLD SMALL P*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d42a: MATHEMATICAL BOLD SMALL Q*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d42b: MATHEMATICAL BOLD SMALL R*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d42c: MATHEMATICAL BOLD SMALL S*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d42d: MATHEMATICAL BOLD SMALL T*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d42e: MATHEMATICAL BOLD SMALL U*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d42f: MATHEMATICAL BOLD SMALL V*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d430: MATHEMATICAL BOLD SMALL W*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d431: MATHEMATICAL BOLD SMALL X*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d432: MATHEMATICAL BOLD SMALL Y*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d433: MATHEMATICAL BOLD SMALL Z*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d434: MATHEMATICAL ITALIC CAPITAL A*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d435: MATHEMATICAL ITALIC CAPITAL B*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d436: MATHEMATICAL ITALIC CAPITAL C*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d437: MATHEMATICAL ITALIC CAPITAL D*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d438: MATHEMATICAL ITALIC CAPITAL E*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d439: MATHEMATICAL ITALIC CAPITAL F*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d43a: MATHEMATICAL ITALIC CAPITAL G*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d43b: MATHEMATICAL ITALIC CAPITAL H*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d43c: MATHEMATICAL ITALIC CAPITAL I*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d43d: MATHEMATICAL ITALIC CAPITAL J*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d43e: MATHEMATICAL ITALIC CAPITAL K*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d43f: MATHEMATICAL ITALIC CAPITAL L*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d440: MATHEMATICAL ITALIC CAPITAL M*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d441: MATHEMATICAL ITALIC CAPITAL N*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d442: MATHEMATICAL ITALIC CAPITAL O*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d443: MATHEMATICAL ITALIC CAPITAL P*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d444: MATHEMATICAL ITALIC CAPITAL Q*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d445: MATHEMATICAL ITALIC CAPITAL R*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d446: MATHEMATICAL ITALIC CAPITAL S*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d447: MATHEMATICAL ITALIC CAPITAL T*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d448: MATHEMATICAL ITALIC CAPITAL U*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d449: MATHEMATICAL ITALIC CAPITAL V*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d44a: MATHEMATICAL ITALIC CAPITAL W*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d44b: MATHEMATICAL ITALIC CAPITAL X*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d44c: MATHEMATICAL ITALIC CAPITAL Y*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d44d: MATHEMATICAL ITALIC CAPITAL Z*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d44e: MATHEMATICAL ITALIC SMALL A*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d44f: MATHEMATICAL ITALIC SMALL B*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d450: MATHEMATICAL ITALIC SMALL C*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d451: MATHEMATICAL ITALIC SMALL D*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d452: MATHEMATICAL ITALIC SMALL E*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d453: MATHEMATICAL ITALIC SMALL F*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d454: MATHEMATICAL ITALIC SMALL G*/
- 0, /* U+01d455: */
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d456: MATHEMATICAL ITALIC SMALL I*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d457: MATHEMATICAL ITALIC SMALL J*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d458: MATHEMATICAL ITALIC SMALL K*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d459: MATHEMATICAL ITALIC SMALL L*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d45a: MATHEMATICAL ITALIC SMALL M*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d45b: MATHEMATICAL ITALIC SMALL N*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d45c: MATHEMATICAL ITALIC SMALL O*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d45d: MATHEMATICAL ITALIC SMALL P*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d45e: MATHEMATICAL ITALIC SMALL Q*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d45f: MATHEMATICAL ITALIC SMALL R*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d460: MATHEMATICAL ITALIC SMALL S*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d461: MATHEMATICAL ITALIC SMALL T*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d462: MATHEMATICAL ITALIC SMALL U*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d463: MATHEMATICAL ITALIC SMALL V*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d464: MATHEMATICAL ITALIC SMALL W*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d465: MATHEMATICAL ITALIC SMALL X*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d466: MATHEMATICAL ITALIC SMALL Y*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d467: MATHEMATICAL ITALIC SMALL Z*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d468: MATHEMATICAL BOLD ITALIC CAPITAL A*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d469: MATHEMATICAL BOLD ITALIC CAPITAL B*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d46a: MATHEMATICAL BOLD ITALIC CAPITAL C*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d46b: MATHEMATICAL BOLD ITALIC CAPITAL D*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d46c: MATHEMATICAL BOLD ITALIC CAPITAL E*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d46d: MATHEMATICAL BOLD ITALIC CAPITAL F*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d46e: MATHEMATICAL BOLD ITALIC CAPITAL G*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d46f: MATHEMATICAL BOLD ITALIC CAPITAL H*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d470: MATHEMATICAL BOLD ITALIC CAPITAL I*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d471: MATHEMATICAL BOLD ITALIC CAPITAL J*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d472: MATHEMATICAL BOLD ITALIC CAPITAL K*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d473: MATHEMATICAL BOLD ITALIC CAPITAL L*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d474: MATHEMATICAL BOLD ITALIC CAPITAL M*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d475: MATHEMATICAL BOLD ITALIC CAPITAL N*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d476: MATHEMATICAL BOLD ITALIC CAPITAL O*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d477: MATHEMATICAL BOLD ITALIC CAPITAL P*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d478: MATHEMATICAL BOLD ITALIC CAPITAL Q*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d479: MATHEMATICAL BOLD ITALIC CAPITAL R*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d47a: MATHEMATICAL BOLD ITALIC CAPITAL S*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d47b: MATHEMATICAL BOLD ITALIC CAPITAL T*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d47c: MATHEMATICAL BOLD ITALIC CAPITAL U*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d47d: MATHEMATICAL BOLD ITALIC CAPITAL V*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d47e: MATHEMATICAL BOLD ITALIC CAPITAL W*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d47f: MATHEMATICAL BOLD ITALIC CAPITAL X*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d480: MATHEMATICAL BOLD ITALIC CAPITAL Y*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d481: MATHEMATICAL BOLD ITALIC CAPITAL Z*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d482: MATHEMATICAL BOLD ITALIC SMALL A*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d483: MATHEMATICAL BOLD ITALIC SMALL B*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d484: MATHEMATICAL BOLD ITALIC SMALL C*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d485: MATHEMATICAL BOLD ITALIC SMALL D*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d486: MATHEMATICAL BOLD ITALIC SMALL E*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d487: MATHEMATICAL BOLD ITALIC SMALL F*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d488: MATHEMATICAL BOLD ITALIC SMALL G*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d489: MATHEMATICAL BOLD ITALIC SMALL H*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d48a: MATHEMATICAL BOLD ITALIC SMALL I*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d48b: MATHEMATICAL BOLD ITALIC SMALL J*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d48c: MATHEMATICAL BOLD ITALIC SMALL K*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d48d: MATHEMATICAL BOLD ITALIC SMALL L*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d48e: MATHEMATICAL BOLD ITALIC SMALL M*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d48f: MATHEMATICAL BOLD ITALIC SMALL N*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d490: MATHEMATICAL BOLD ITALIC SMALL O*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d491: MATHEMATICAL BOLD ITALIC SMALL P*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d492: MATHEMATICAL BOLD ITALIC SMALL Q*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d493: MATHEMATICAL BOLD ITALIC SMALL R*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d494: MATHEMATICAL BOLD ITALIC SMALL S*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d495: MATHEMATICAL BOLD ITALIC SMALL T*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d496: MATHEMATICAL BOLD ITALIC SMALL U*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d497: MATHEMATICAL BOLD ITALIC SMALL V*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d498: MATHEMATICAL BOLD ITALIC SMALL W*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d499: MATHEMATICAL BOLD ITALIC SMALL X*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d49a: MATHEMATICAL BOLD ITALIC SMALL Y*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d49b: MATHEMATICAL BOLD ITALIC SMALL Z*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d49c: MATHEMATICAL SCRIPT CAPITAL A*/
- 0, /* U+01d49d: */
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d49e: MATHEMATICAL SCRIPT CAPITAL C*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d49f: MATHEMATICAL SCRIPT CAPITAL D*/
- 0, /* U+01d4a0: */
- 0, /* U+01d4a1: */
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4a2: MATHEMATICAL SCRIPT CAPITAL G*/
- 0, /* U+01d4a3: */
- 0, /* U+01d4a4: */
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4a5: MATHEMATICAL SCRIPT CAPITAL J*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4a6: MATHEMATICAL SCRIPT CAPITAL K*/
- 0, /* U+01d4a7: */
- 0, /* U+01d4a8: */
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4a9: MATHEMATICAL SCRIPT CAPITAL N*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4aa: MATHEMATICAL SCRIPT CAPITAL O*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4ab: MATHEMATICAL SCRIPT CAPITAL P*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4ac: MATHEMATICAL SCRIPT CAPITAL Q*/
- 0, /* U+01d4ad: */
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4ae: MATHEMATICAL SCRIPT CAPITAL S*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4af: MATHEMATICAL SCRIPT CAPITAL T*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4b0: MATHEMATICAL SCRIPT CAPITAL U*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4b1: MATHEMATICAL SCRIPT CAPITAL V*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4b2: MATHEMATICAL SCRIPT CAPITAL W*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4b3: MATHEMATICAL SCRIPT CAPITAL X*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4b4: MATHEMATICAL SCRIPT CAPITAL Y*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4b5: MATHEMATICAL SCRIPT CAPITAL Z*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4b6: MATHEMATICAL SCRIPT SMALL A*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4b7: MATHEMATICAL SCRIPT SMALL B*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4b8: MATHEMATICAL SCRIPT SMALL C*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4b9: MATHEMATICAL SCRIPT SMALL D*/
- 0, /* U+01d4ba: */
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4bb: MATHEMATICAL SCRIPT SMALL F*/
- 0, /* U+01d4bc: */
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4bd: MATHEMATICAL SCRIPT SMALL H*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4be: MATHEMATICAL SCRIPT SMALL I*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4bf: MATHEMATICAL SCRIPT SMALL J*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4c0: MATHEMATICAL SCRIPT SMALL K*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4c1: MATHEMATICAL SCRIPT SMALL L*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4c2: MATHEMATICAL SCRIPT SMALL M*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4c3: MATHEMATICAL SCRIPT SMALL N*/
- 0, /* U+01d4c4: */
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4c5: MATHEMATICAL SCRIPT SMALL P*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4c6: MATHEMATICAL SCRIPT SMALL Q*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4c7: MATHEMATICAL SCRIPT SMALL R*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4c8: MATHEMATICAL SCRIPT SMALL S*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4c9: MATHEMATICAL SCRIPT SMALL T*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4ca: MATHEMATICAL SCRIPT SMALL U*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4cb: MATHEMATICAL SCRIPT SMALL V*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4cc: MATHEMATICAL SCRIPT SMALL W*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4cd: MATHEMATICAL SCRIPT SMALL X*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4ce: MATHEMATICAL SCRIPT SMALL Y*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4cf: MATHEMATICAL SCRIPT SMALL Z*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4d0: MATHEMATICAL BOLD SCRIPT CAPITAL A*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4d1: MATHEMATICAL BOLD SCRIPT CAPITAL B*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4d2: MATHEMATICAL BOLD SCRIPT CAPITAL C*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4d3: MATHEMATICAL BOLD SCRIPT CAPITAL D*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4d4: MATHEMATICAL BOLD SCRIPT CAPITAL E*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4d5: MATHEMATICAL BOLD SCRIPT CAPITAL F*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4d6: MATHEMATICAL BOLD SCRIPT CAPITAL G*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4d7: MATHEMATICAL BOLD SCRIPT CAPITAL H*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4d8: MATHEMATICAL BOLD SCRIPT CAPITAL I*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4d9: MATHEMATICAL BOLD SCRIPT CAPITAL J*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4da: MATHEMATICAL BOLD SCRIPT CAPITAL K*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4db: MATHEMATICAL BOLD SCRIPT CAPITAL L*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4dc: MATHEMATICAL BOLD SCRIPT CAPITAL M*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4dd: MATHEMATICAL BOLD SCRIPT CAPITAL N*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4de: MATHEMATICAL BOLD SCRIPT CAPITAL O*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4df: MATHEMATICAL BOLD SCRIPT CAPITAL P*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4e0: MATHEMATICAL BOLD SCRIPT CAPITAL Q*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4e1: MATHEMATICAL BOLD SCRIPT CAPITAL R*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4e2: MATHEMATICAL BOLD SCRIPT CAPITAL S*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4e3: MATHEMATICAL BOLD SCRIPT CAPITAL T*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4e4: MATHEMATICAL BOLD SCRIPT CAPITAL U*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4e5: MATHEMATICAL BOLD SCRIPT CAPITAL V*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4e6: MATHEMATICAL BOLD SCRIPT CAPITAL W*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4e7: MATHEMATICAL BOLD SCRIPT CAPITAL X*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4e8: MATHEMATICAL BOLD SCRIPT CAPITAL Y*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4e9: MATHEMATICAL BOLD SCRIPT CAPITAL Z*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4ea: MATHEMATICAL BOLD SCRIPT SMALL A*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4eb: MATHEMATICAL BOLD SCRIPT SMALL B*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4ec: MATHEMATICAL BOLD SCRIPT SMALL C*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4ed: MATHEMATICAL BOLD SCRIPT SMALL D*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4ee: MATHEMATICAL BOLD SCRIPT SMALL E*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4ef: MATHEMATICAL BOLD SCRIPT SMALL F*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4f0: MATHEMATICAL BOLD SCRIPT SMALL G*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4f1: MATHEMATICAL BOLD SCRIPT SMALL H*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4f2: MATHEMATICAL BOLD SCRIPT SMALL I*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4f3: MATHEMATICAL BOLD SCRIPT SMALL J*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4f4: MATHEMATICAL BOLD SCRIPT SMALL K*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4f5: MATHEMATICAL BOLD SCRIPT SMALL L*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4f6: MATHEMATICAL BOLD SCRIPT SMALL M*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4f7: MATHEMATICAL BOLD SCRIPT SMALL N*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4f8: MATHEMATICAL BOLD SCRIPT SMALL O*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4f9: MATHEMATICAL BOLD SCRIPT SMALL P*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4fa: MATHEMATICAL BOLD SCRIPT SMALL Q*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4fb: MATHEMATICAL BOLD SCRIPT SMALL R*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4fc: MATHEMATICAL BOLD SCRIPT SMALL S*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4fd: MATHEMATICAL BOLD SCRIPT SMALL T*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4fe: MATHEMATICAL BOLD SCRIPT SMALL U*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4ff: MATHEMATICAL BOLD SCRIPT SMALL V*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d500: MATHEMATICAL BOLD SCRIPT SMALL W*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d501: MATHEMATICAL BOLD SCRIPT SMALL X*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d502: MATHEMATICAL BOLD SCRIPT SMALL Y*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d503: MATHEMATICAL BOLD SCRIPT SMALL Z*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d504: MATHEMATICAL FRAKTUR CAPITAL A*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d505: MATHEMATICAL FRAKTUR CAPITAL B*/
- 0, /* U+01d506: */
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d507: MATHEMATICAL FRAKTUR CAPITAL D*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d508: MATHEMATICAL FRAKTUR CAPITAL E*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d509: MATHEMATICAL FRAKTUR CAPITAL F*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d50a: MATHEMATICAL FRAKTUR CAPITAL G*/
- 0, /* U+01d50b: */
- 0, /* U+01d50c: */
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d50d: MATHEMATICAL FRAKTUR CAPITAL J*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d50e: MATHEMATICAL FRAKTUR CAPITAL K*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d50f: MATHEMATICAL FRAKTUR CAPITAL L*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d510: MATHEMATICAL FRAKTUR CAPITAL M*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d511: MATHEMATICAL FRAKTUR CAPITAL N*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d512: MATHEMATICAL FRAKTUR CAPITAL O*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d513: MATHEMATICAL FRAKTUR CAPITAL P*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d514: MATHEMATICAL FRAKTUR CAPITAL Q*/
- 0, /* U+01d515: */
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d516: MATHEMATICAL FRAKTUR CAPITAL S*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d517: MATHEMATICAL FRAKTUR CAPITAL T*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d518: MATHEMATICAL FRAKTUR CAPITAL U*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d519: MATHEMATICAL FRAKTUR CAPITAL V*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d51a: MATHEMATICAL FRAKTUR CAPITAL W*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d51b: MATHEMATICAL FRAKTUR CAPITAL X*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d51c: MATHEMATICAL FRAKTUR CAPITAL Y*/
- 0, /* U+01d51d: */
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d51e: MATHEMATICAL FRAKTUR SMALL A*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d51f: MATHEMATICAL FRAKTUR SMALL B*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d520: MATHEMATICAL FRAKTUR SMALL C*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d521: MATHEMATICAL FRAKTUR SMALL D*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d522: MATHEMATICAL FRAKTUR SMALL E*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d523: MATHEMATICAL FRAKTUR SMALL F*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d524: MATHEMATICAL FRAKTUR SMALL G*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d525: MATHEMATICAL FRAKTUR SMALL H*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d526: MATHEMATICAL FRAKTUR SMALL I*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d527: MATHEMATICAL FRAKTUR SMALL J*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d528: MATHEMATICAL FRAKTUR SMALL K*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d529: MATHEMATICAL FRAKTUR SMALL L*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d52a: MATHEMATICAL FRAKTUR SMALL M*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d52b: MATHEMATICAL FRAKTUR SMALL N*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d52c: MATHEMATICAL FRAKTUR SMALL O*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d52d: MATHEMATICAL FRAKTUR SMALL P*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d52e: MATHEMATICAL FRAKTUR SMALL Q*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d52f: MATHEMATICAL FRAKTUR SMALL R*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d530: MATHEMATICAL FRAKTUR SMALL S*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d531: MATHEMATICAL FRAKTUR SMALL T*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d532: MATHEMATICAL FRAKTUR SMALL U*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d533: MATHEMATICAL FRAKTUR SMALL V*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d534: MATHEMATICAL FRAKTUR SMALL W*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d535: MATHEMATICAL FRAKTUR SMALL X*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d536: MATHEMATICAL FRAKTUR SMALL Y*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d537: MATHEMATICAL FRAKTUR SMALL Z*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d538: MATHEMATICAL DOUBLE-STRUCK CAPITAL A*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d539: MATHEMATICAL DOUBLE-STRUCK CAPITAL B*/
- 0, /* U+01d53a: */
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d53b: MATHEMATICAL DOUBLE-STRUCK CAPITAL D*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d53c: MATHEMATICAL DOUBLE-STRUCK CAPITAL E*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d53d: MATHEMATICAL DOUBLE-STRUCK CAPITAL F*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d53e: MATHEMATICAL DOUBLE-STRUCK CAPITAL G*/
- 0, /* U+01d53f: */
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d540: MATHEMATICAL DOUBLE-STRUCK CAPITAL I*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d541: MATHEMATICAL DOUBLE-STRUCK CAPITAL J*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d542: MATHEMATICAL DOUBLE-STRUCK CAPITAL K*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d543: MATHEMATICAL DOUBLE-STRUCK CAPITAL L*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d544: MATHEMATICAL DOUBLE-STRUCK CAPITAL M*/
- 0, /* U+01d545: */
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d546: MATHEMATICAL DOUBLE-STRUCK CAPITAL O*/
- 0, /* U+01d547: */
- 0, /* U+01d548: */
- 0, /* U+01d549: */
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d54a: MATHEMATICAL DOUBLE-STRUCK CAPITAL S*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d54b: MATHEMATICAL DOUBLE-STRUCK CAPITAL T*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d54c: MATHEMATICAL DOUBLE-STRUCK CAPITAL U*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d54d: MATHEMATICAL DOUBLE-STRUCK CAPITAL V*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d54e: MATHEMATICAL DOUBLE-STRUCK CAPITAL W*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d54f: MATHEMATICAL DOUBLE-STRUCK CAPITAL X*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d550: MATHEMATICAL DOUBLE-STRUCK CAPITAL Y*/
- 0, /* U+01d551: */
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d552: MATHEMATICAL DOUBLE-STRUCK SMALL A*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d553: MATHEMATICAL DOUBLE-STRUCK SMALL B*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d554: MATHEMATICAL DOUBLE-STRUCK SMALL C*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d555: MATHEMATICAL DOUBLE-STRUCK SMALL D*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d556: MATHEMATICAL DOUBLE-STRUCK SMALL E*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d557: MATHEMATICAL DOUBLE-STRUCK SMALL F*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d558: MATHEMATICAL DOUBLE-STRUCK SMALL G*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d559: MATHEMATICAL DOUBLE-STRUCK SMALL H*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d55a: MATHEMATICAL DOUBLE-STRUCK SMALL I*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d55b: MATHEMATICAL DOUBLE-STRUCK SMALL J*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d55c: MATHEMATICAL DOUBLE-STRUCK SMALL K*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d55d: MATHEMATICAL DOUBLE-STRUCK SMALL L*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d55e: MATHEMATICAL DOUBLE-STRUCK SMALL M*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d55f: MATHEMATICAL DOUBLE-STRUCK SMALL N*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d560: MATHEMATICAL DOUBLE-STRUCK SMALL O*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d561: MATHEMATICAL DOUBLE-STRUCK SMALL P*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d562: MATHEMATICAL DOUBLE-STRUCK SMALL Q*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d563: MATHEMATICAL DOUBLE-STRUCK SMALL R*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d564: MATHEMATICAL DOUBLE-STRUCK SMALL S*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d565: MATHEMATICAL DOUBLE-STRUCK SMALL T*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d566: MATHEMATICAL DOUBLE-STRUCK SMALL U*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d567: MATHEMATICAL DOUBLE-STRUCK SMALL V*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d568: MATHEMATICAL DOUBLE-STRUCK SMALL W*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d569: MATHEMATICAL DOUBLE-STRUCK SMALL X*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d56a: MATHEMATICAL DOUBLE-STRUCK SMALL Y*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d56b: MATHEMATICAL DOUBLE-STRUCK SMALL Z*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d56c: MATHEMATICAL BOLD FRAKTUR CAPITAL A*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d56d: MATHEMATICAL BOLD FRAKTUR CAPITAL B*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d56e: MATHEMATICAL BOLD FRAKTUR CAPITAL C*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d56f: MATHEMATICAL BOLD FRAKTUR CAPITAL D*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d570: MATHEMATICAL BOLD FRAKTUR CAPITAL E*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d571: MATHEMATICAL BOLD FRAKTUR CAPITAL F*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d572: MATHEMATICAL BOLD FRAKTUR CAPITAL G*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d573: MATHEMATICAL BOLD FRAKTUR CAPITAL H*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d574: MATHEMATICAL BOLD FRAKTUR CAPITAL I*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d575: MATHEMATICAL BOLD FRAKTUR CAPITAL J*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d576: MATHEMATICAL BOLD FRAKTUR CAPITAL K*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d577: MATHEMATICAL BOLD FRAKTUR CAPITAL L*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d578: MATHEMATICAL BOLD FRAKTUR CAPITAL M*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d579: MATHEMATICAL BOLD FRAKTUR CAPITAL N*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d57a: MATHEMATICAL BOLD FRAKTUR CAPITAL O*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d57b: MATHEMATICAL BOLD FRAKTUR CAPITAL P*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d57c: MATHEMATICAL BOLD FRAKTUR CAPITAL Q*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d57d: MATHEMATICAL BOLD FRAKTUR CAPITAL R*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d57e: MATHEMATICAL BOLD FRAKTUR CAPITAL S*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d57f: MATHEMATICAL BOLD FRAKTUR CAPITAL T*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d580: MATHEMATICAL BOLD FRAKTUR CAPITAL U*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d581: MATHEMATICAL BOLD FRAKTUR CAPITAL V*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d582: MATHEMATICAL BOLD FRAKTUR CAPITAL W*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d583: MATHEMATICAL BOLD FRAKTUR CAPITAL X*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d584: MATHEMATICAL BOLD FRAKTUR CAPITAL Y*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d585: MATHEMATICAL BOLD FRAKTUR CAPITAL Z*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d586: MATHEMATICAL BOLD FRAKTUR SMALL A*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d587: MATHEMATICAL BOLD FRAKTUR SMALL B*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d588: MATHEMATICAL BOLD FRAKTUR SMALL C*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d589: MATHEMATICAL BOLD FRAKTUR SMALL D*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d58a: MATHEMATICAL BOLD FRAKTUR SMALL E*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d58b: MATHEMATICAL BOLD FRAKTUR SMALL F*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d58c: MATHEMATICAL BOLD FRAKTUR SMALL G*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d58d: MATHEMATICAL BOLD FRAKTUR SMALL H*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d58e: MATHEMATICAL BOLD FRAKTUR SMALL I*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d58f: MATHEMATICAL BOLD FRAKTUR SMALL J*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d590: MATHEMATICAL BOLD FRAKTUR SMALL K*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d591: MATHEMATICAL BOLD FRAKTUR SMALL L*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d592: MATHEMATICAL BOLD FRAKTUR SMALL M*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d593: MATHEMATICAL BOLD FRAKTUR SMALL N*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d594: MATHEMATICAL BOLD FRAKTUR SMALL O*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d595: MATHEMATICAL BOLD FRAKTUR SMALL P*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d596: MATHEMATICAL BOLD FRAKTUR SMALL Q*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d597: MATHEMATICAL BOLD FRAKTUR SMALL R*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d598: MATHEMATICAL BOLD FRAKTUR SMALL S*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d599: MATHEMATICAL BOLD FRAKTUR SMALL T*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d59a: MATHEMATICAL BOLD FRAKTUR SMALL U*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d59b: MATHEMATICAL BOLD FRAKTUR SMALL V*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d59c: MATHEMATICAL BOLD FRAKTUR SMALL W*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d59d: MATHEMATICAL BOLD FRAKTUR SMALL X*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d59e: MATHEMATICAL BOLD FRAKTUR SMALL Y*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d59f: MATHEMATICAL BOLD FRAKTUR SMALL Z*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5a0: MATHEMATICAL SANS-SERIF CAPITAL A*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5a1: MATHEMATICAL SANS-SERIF CAPITAL B*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5a2: MATHEMATICAL SANS-SERIF CAPITAL C*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5a3: MATHEMATICAL SANS-SERIF CAPITAL D*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5a4: MATHEMATICAL SANS-SERIF CAPITAL E*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5a5: MATHEMATICAL SANS-SERIF CAPITAL F*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5a6: MATHEMATICAL SANS-SERIF CAPITAL G*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5a7: MATHEMATICAL SANS-SERIF CAPITAL H*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5a8: MATHEMATICAL SANS-SERIF CAPITAL I*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5a9: MATHEMATICAL SANS-SERIF CAPITAL J*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5aa: MATHEMATICAL SANS-SERIF CAPITAL K*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5ab: MATHEMATICAL SANS-SERIF CAPITAL L*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5ac: MATHEMATICAL SANS-SERIF CAPITAL M*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5ad: MATHEMATICAL SANS-SERIF CAPITAL N*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5ae: MATHEMATICAL SANS-SERIF CAPITAL O*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5af: MATHEMATICAL SANS-SERIF CAPITAL P*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5b0: MATHEMATICAL SANS-SERIF CAPITAL Q*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5b1: MATHEMATICAL SANS-SERIF CAPITAL R*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5b2: MATHEMATICAL SANS-SERIF CAPITAL S*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5b3: MATHEMATICAL SANS-SERIF CAPITAL T*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5b4: MATHEMATICAL SANS-SERIF CAPITAL U*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5b5: MATHEMATICAL SANS-SERIF CAPITAL V*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5b6: MATHEMATICAL SANS-SERIF CAPITAL W*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5b7: MATHEMATICAL SANS-SERIF CAPITAL X*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5b8: MATHEMATICAL SANS-SERIF CAPITAL Y*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5b9: MATHEMATICAL SANS-SERIF CAPITAL Z*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5ba: MATHEMATICAL SANS-SERIF SMALL A*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5bb: MATHEMATICAL SANS-SERIF SMALL B*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5bc: MATHEMATICAL SANS-SERIF SMALL C*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5bd: MATHEMATICAL SANS-SERIF SMALL D*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5be: MATHEMATICAL SANS-SERIF SMALL E*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5bf: MATHEMATICAL SANS-SERIF SMALL F*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5c0: MATHEMATICAL SANS-SERIF SMALL G*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5c1: MATHEMATICAL SANS-SERIF SMALL H*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5c2: MATHEMATICAL SANS-SERIF SMALL I*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5c3: MATHEMATICAL SANS-SERIF SMALL J*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5c4: MATHEMATICAL SANS-SERIF SMALL K*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5c5: MATHEMATICAL SANS-SERIF SMALL L*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5c6: MATHEMATICAL SANS-SERIF SMALL M*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5c7: MATHEMATICAL SANS-SERIF SMALL N*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5c8: MATHEMATICAL SANS-SERIF SMALL O*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5c9: MATHEMATICAL SANS-SERIF SMALL P*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5ca: MATHEMATICAL SANS-SERIF SMALL Q*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5cb: MATHEMATICAL SANS-SERIF SMALL R*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5cc: MATHEMATICAL SANS-SERIF SMALL S*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5cd: MATHEMATICAL SANS-SERIF SMALL T*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5ce: MATHEMATICAL SANS-SERIF SMALL U*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5cf: MATHEMATICAL SANS-SERIF SMALL V*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5d0: MATHEMATICAL SANS-SERIF SMALL W*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5d1: MATHEMATICAL SANS-SERIF SMALL X*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5d2: MATHEMATICAL SANS-SERIF SMALL Y*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5d3: MATHEMATICAL SANS-SERIF SMALL Z*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5d4: MATHEMATICAL SANS-SERIF BOLD CAPITAL A*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5d5: MATHEMATICAL SANS-SERIF BOLD CAPITAL B*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5d6: MATHEMATICAL SANS-SERIF BOLD CAPITAL C*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5d7: MATHEMATICAL SANS-SERIF BOLD CAPITAL D*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5d8: MATHEMATICAL SANS-SERIF BOLD CAPITAL E*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5d9: MATHEMATICAL SANS-SERIF BOLD CAPITAL F*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5da: MATHEMATICAL SANS-SERIF BOLD CAPITAL G*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5db: MATHEMATICAL SANS-SERIF BOLD CAPITAL H*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5dc: MATHEMATICAL SANS-SERIF BOLD CAPITAL I*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5dd: MATHEMATICAL SANS-SERIF BOLD CAPITAL J*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5de: MATHEMATICAL SANS-SERIF BOLD CAPITAL K*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5df: MATHEMATICAL SANS-SERIF BOLD CAPITAL L*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5e0: MATHEMATICAL SANS-SERIF BOLD CAPITAL M*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5e1: MATHEMATICAL SANS-SERIF BOLD CAPITAL N*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5e2: MATHEMATICAL SANS-SERIF BOLD CAPITAL O*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5e3: MATHEMATICAL SANS-SERIF BOLD CAPITAL P*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5e4: MATHEMATICAL SANS-SERIF BOLD CAPITAL Q*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5e5: MATHEMATICAL SANS-SERIF BOLD CAPITAL R*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5e6: MATHEMATICAL SANS-SERIF BOLD CAPITAL S*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5e7: MATHEMATICAL SANS-SERIF BOLD CAPITAL T*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5e8: MATHEMATICAL SANS-SERIF BOLD CAPITAL U*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5e9: MATHEMATICAL SANS-SERIF BOLD CAPITAL V*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5ea: MATHEMATICAL SANS-SERIF BOLD CAPITAL W*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5eb: MATHEMATICAL SANS-SERIF BOLD CAPITAL X*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5ec: MATHEMATICAL SANS-SERIF BOLD CAPITAL Y*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5ed: MATHEMATICAL SANS-SERIF BOLD CAPITAL Z*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5ee: MATHEMATICAL SANS-SERIF BOLD SMALL A*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5ef: MATHEMATICAL SANS-SERIF BOLD SMALL B*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5f0: MATHEMATICAL SANS-SERIF BOLD SMALL C*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5f1: MATHEMATICAL SANS-SERIF BOLD SMALL D*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5f2: MATHEMATICAL SANS-SERIF BOLD SMALL E*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5f3: MATHEMATICAL SANS-SERIF BOLD SMALL F*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5f4: MATHEMATICAL SANS-SERIF BOLD SMALL G*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5f5: MATHEMATICAL SANS-SERIF BOLD SMALL H*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5f6: MATHEMATICAL SANS-SERIF BOLD SMALL I*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5f7: MATHEMATICAL SANS-SERIF BOLD SMALL J*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5f8: MATHEMATICAL SANS-SERIF BOLD SMALL K*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5f9: MATHEMATICAL SANS-SERIF BOLD SMALL L*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5fa: MATHEMATICAL SANS-SERIF BOLD SMALL M*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5fb: MATHEMATICAL SANS-SERIF BOLD SMALL N*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5fc: MATHEMATICAL SANS-SERIF BOLD SMALL O*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5fd: MATHEMATICAL SANS-SERIF BOLD SMALL P*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5fe: MATHEMATICAL SANS-SERIF BOLD SMALL Q*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5ff: MATHEMATICAL SANS-SERIF BOLD SMALL R*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d600: MATHEMATICAL SANS-SERIF BOLD SMALL S*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d601: MATHEMATICAL SANS-SERIF BOLD SMALL T*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d602: MATHEMATICAL SANS-SERIF BOLD SMALL U*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d603: MATHEMATICAL SANS-SERIF BOLD SMALL V*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d604: MATHEMATICAL SANS-SERIF BOLD SMALL W*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d605: MATHEMATICAL SANS-SERIF BOLD SMALL X*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d606: MATHEMATICAL SANS-SERIF BOLD SMALL Y*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d607: MATHEMATICAL SANS-SERIF BOLD SMALL Z*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d608: MATHEMATICAL SANS-SERIF ITALIC CAPITAL A*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d609: MATHEMATICAL SANS-SERIF ITALIC CAPITAL B*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d60a: MATHEMATICAL SANS-SERIF ITALIC CAPITAL C*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d60b: MATHEMATICAL SANS-SERIF ITALIC CAPITAL D*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d60c: MATHEMATICAL SANS-SERIF ITALIC CAPITAL E*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d60d: MATHEMATICAL SANS-SERIF ITALIC CAPITAL F*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d60e: MATHEMATICAL SANS-SERIF ITALIC CAPITAL G*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d60f: MATHEMATICAL SANS-SERIF ITALIC CAPITAL H*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d610: MATHEMATICAL SANS-SERIF ITALIC CAPITAL I*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d611: MATHEMATICAL SANS-SERIF ITALIC CAPITAL J*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d612: MATHEMATICAL SANS-SERIF ITALIC CAPITAL K*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d613: MATHEMATICAL SANS-SERIF ITALIC CAPITAL L*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d614: MATHEMATICAL SANS-SERIF ITALIC CAPITAL M*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d615: MATHEMATICAL SANS-SERIF ITALIC CAPITAL N*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d616: MATHEMATICAL SANS-SERIF ITALIC CAPITAL O*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d617: MATHEMATICAL SANS-SERIF ITALIC CAPITAL P*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d618: MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d619: MATHEMATICAL SANS-SERIF ITALIC CAPITAL R*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d61a: MATHEMATICAL SANS-SERIF ITALIC CAPITAL S*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d61b: MATHEMATICAL SANS-SERIF ITALIC CAPITAL T*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d61c: MATHEMATICAL SANS-SERIF ITALIC CAPITAL U*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d61d: MATHEMATICAL SANS-SERIF ITALIC CAPITAL V*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d61e: MATHEMATICAL SANS-SERIF ITALIC CAPITAL W*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d61f: MATHEMATICAL SANS-SERIF ITALIC CAPITAL X*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d620: MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d621: MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d622: MATHEMATICAL SANS-SERIF ITALIC SMALL A*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d623: MATHEMATICAL SANS-SERIF ITALIC SMALL B*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d624: MATHEMATICAL SANS-SERIF ITALIC SMALL C*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d625: MATHEMATICAL SANS-SERIF ITALIC SMALL D*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d626: MATHEMATICAL SANS-SERIF ITALIC SMALL E*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d627: MATHEMATICAL SANS-SERIF ITALIC SMALL F*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d628: MATHEMATICAL SANS-SERIF ITALIC SMALL G*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d629: MATHEMATICAL SANS-SERIF ITALIC SMALL H*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d62a: MATHEMATICAL SANS-SERIF ITALIC SMALL I*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d62b: MATHEMATICAL SANS-SERIF ITALIC SMALL J*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d62c: MATHEMATICAL SANS-SERIF ITALIC SMALL K*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d62d: MATHEMATICAL SANS-SERIF ITALIC SMALL L*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d62e: MATHEMATICAL SANS-SERIF ITALIC SMALL M*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d62f: MATHEMATICAL SANS-SERIF ITALIC SMALL N*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d630: MATHEMATICAL SANS-SERIF ITALIC SMALL O*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d631: MATHEMATICAL SANS-SERIF ITALIC SMALL P*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d632: MATHEMATICAL SANS-SERIF ITALIC SMALL Q*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d633: MATHEMATICAL SANS-SERIF ITALIC SMALL R*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d634: MATHEMATICAL SANS-SERIF ITALIC SMALL S*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d635: MATHEMATICAL SANS-SERIF ITALIC SMALL T*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d636: MATHEMATICAL SANS-SERIF ITALIC SMALL U*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d637: MATHEMATICAL SANS-SERIF ITALIC SMALL V*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d638: MATHEMATICAL SANS-SERIF ITALIC SMALL W*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d639: MATHEMATICAL SANS-SERIF ITALIC SMALL X*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d63a: MATHEMATICAL SANS-SERIF ITALIC SMALL Y*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d63b: MATHEMATICAL SANS-SERIF ITALIC SMALL Z*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d63c: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d63d: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d63e: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d63f: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d640: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d641: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d642: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d643: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d644: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d645: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d646: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d647: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d648: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d649: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d64a: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d64b: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d64c: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d64d: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d64e: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d64f: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d650: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d651: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d652: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d653: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d654: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d655: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d656: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d657: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d658: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d659: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d65a: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d65b: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d65c: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d65d: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d65e: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d65f: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d660: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d661: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d662: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d663: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d664: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d665: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d666: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d667: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d668: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d669: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d66a: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d66b: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d66c: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d66d: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d66e: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d66f: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d670: MATHEMATICAL MONOSPACE CAPITAL A*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d671: MATHEMATICAL MONOSPACE CAPITAL B*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d672: MATHEMATICAL MONOSPACE CAPITAL C*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d673: MATHEMATICAL MONOSPACE CAPITAL D*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d674: MATHEMATICAL MONOSPACE CAPITAL E*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d675: MATHEMATICAL MONOSPACE CAPITAL F*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d676: MATHEMATICAL MONOSPACE CAPITAL G*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d677: MATHEMATICAL MONOSPACE CAPITAL H*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d678: MATHEMATICAL MONOSPACE CAPITAL I*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d679: MATHEMATICAL MONOSPACE CAPITAL J*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d67a: MATHEMATICAL MONOSPACE CAPITAL K*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d67b: MATHEMATICAL MONOSPACE CAPITAL L*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d67c: MATHEMATICAL MONOSPACE CAPITAL M*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d67d: MATHEMATICAL MONOSPACE CAPITAL N*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d67e: MATHEMATICAL MONOSPACE CAPITAL O*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d67f: MATHEMATICAL MONOSPACE CAPITAL P*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d680: MATHEMATICAL MONOSPACE CAPITAL Q*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d681: MATHEMATICAL MONOSPACE CAPITAL R*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d682: MATHEMATICAL MONOSPACE CAPITAL S*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d683: MATHEMATICAL MONOSPACE CAPITAL T*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d684: MATHEMATICAL MONOSPACE CAPITAL U*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d685: MATHEMATICAL MONOSPACE CAPITAL V*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d686: MATHEMATICAL MONOSPACE CAPITAL W*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d687: MATHEMATICAL MONOSPACE CAPITAL X*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d688: MATHEMATICAL MONOSPACE CAPITAL Y*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d689: MATHEMATICAL MONOSPACE CAPITAL Z*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d68a: MATHEMATICAL MONOSPACE SMALL A*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d68b: MATHEMATICAL MONOSPACE SMALL B*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d68c: MATHEMATICAL MONOSPACE SMALL C*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d68d: MATHEMATICAL MONOSPACE SMALL D*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d68e: MATHEMATICAL MONOSPACE SMALL E*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d68f: MATHEMATICAL MONOSPACE SMALL F*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d690: MATHEMATICAL MONOSPACE SMALL G*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d691: MATHEMATICAL MONOSPACE SMALL H*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d692: MATHEMATICAL MONOSPACE SMALL I*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d693: MATHEMATICAL MONOSPACE SMALL J*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d694: MATHEMATICAL MONOSPACE SMALL K*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d695: MATHEMATICAL MONOSPACE SMALL L*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d696: MATHEMATICAL MONOSPACE SMALL M*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d697: MATHEMATICAL MONOSPACE SMALL N*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d698: MATHEMATICAL MONOSPACE SMALL O*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d699: MATHEMATICAL MONOSPACE SMALL P*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d69a: MATHEMATICAL MONOSPACE SMALL Q*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d69b: MATHEMATICAL MONOSPACE SMALL R*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d69c: MATHEMATICAL MONOSPACE SMALL S*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d69d: MATHEMATICAL MONOSPACE SMALL T*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d69e: MATHEMATICAL MONOSPACE SMALL U*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d69f: MATHEMATICAL MONOSPACE SMALL V*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6a0: MATHEMATICAL MONOSPACE SMALL W*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6a1: MATHEMATICAL MONOSPACE SMALL X*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6a2: MATHEMATICAL MONOSPACE SMALL Y*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6a3: MATHEMATICAL MONOSPACE SMALL Z*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6a4: MATHEMATICAL ITALIC SMALL DOTLESS I*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6a5: MATHEMATICAL ITALIC SMALL DOTLESS J*/
- 0, /* U+01d6a6: */
- 0, /* U+01d6a7: */
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6a8: MATHEMATICAL BOLD CAPITAL ALPHA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6a9: MATHEMATICAL BOLD CAPITAL BETA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6aa: MATHEMATICAL BOLD CAPITAL GAMMA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6ab: MATHEMATICAL BOLD CAPITAL DELTA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6ac: MATHEMATICAL BOLD CAPITAL EPSILON*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6ad: MATHEMATICAL BOLD CAPITAL ZETA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6ae: MATHEMATICAL BOLD CAPITAL ETA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6af: MATHEMATICAL BOLD CAPITAL THETA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6b0: MATHEMATICAL BOLD CAPITAL IOTA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6b1: MATHEMATICAL BOLD CAPITAL KAPPA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6b2: MATHEMATICAL BOLD CAPITAL LAMDA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6b3: MATHEMATICAL BOLD CAPITAL MU*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6b4: MATHEMATICAL BOLD CAPITAL NU*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6b5: MATHEMATICAL BOLD CAPITAL XI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6b6: MATHEMATICAL BOLD CAPITAL OMICRON*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6b7: MATHEMATICAL BOLD CAPITAL PI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6b8: MATHEMATICAL BOLD CAPITAL RHO*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6b9: MATHEMATICAL BOLD CAPITAL THETA SYMBOL*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6ba: MATHEMATICAL BOLD CAPITAL SIGMA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6bb: MATHEMATICAL BOLD CAPITAL TAU*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6bc: MATHEMATICAL BOLD CAPITAL UPSILON*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6bd: MATHEMATICAL BOLD CAPITAL PHI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6be: MATHEMATICAL BOLD CAPITAL CHI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6bf: MATHEMATICAL BOLD CAPITAL PSI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6c0: MATHEMATICAL BOLD CAPITAL OMEGA*/
- 0, /* U+01d6c1: MATHEMATICAL BOLD NABLA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6c2: MATHEMATICAL BOLD SMALL ALPHA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6c3: MATHEMATICAL BOLD SMALL BETA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6c4: MATHEMATICAL BOLD SMALL GAMMA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6c5: MATHEMATICAL BOLD SMALL DELTA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6c6: MATHEMATICAL BOLD SMALL EPSILON*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6c7: MATHEMATICAL BOLD SMALL ZETA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6c8: MATHEMATICAL BOLD SMALL ETA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6c9: MATHEMATICAL BOLD SMALL THETA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6ca: MATHEMATICAL BOLD SMALL IOTA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6cb: MATHEMATICAL BOLD SMALL KAPPA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6cc: MATHEMATICAL BOLD SMALL LAMDA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6cd: MATHEMATICAL BOLD SMALL MU*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6ce: MATHEMATICAL BOLD SMALL NU*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6cf: MATHEMATICAL BOLD SMALL XI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6d0: MATHEMATICAL BOLD SMALL OMICRON*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6d1: MATHEMATICAL BOLD SMALL PI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6d2: MATHEMATICAL BOLD SMALL RHO*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6d3: MATHEMATICAL BOLD SMALL FINAL SIGMA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6d4: MATHEMATICAL BOLD SMALL SIGMA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6d5: MATHEMATICAL BOLD SMALL TAU*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6d6: MATHEMATICAL BOLD SMALL UPSILON*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6d7: MATHEMATICAL BOLD SMALL PHI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6d8: MATHEMATICAL BOLD SMALL CHI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6d9: MATHEMATICAL BOLD SMALL PSI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6da: MATHEMATICAL BOLD SMALL OMEGA*/
- 0, /* U+01d6db: MATHEMATICAL BOLD PARTIAL DIFFERENTIAL*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6dc: MATHEMATICAL BOLD EPSILON SYMBOL*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6dd: MATHEMATICAL BOLD THETA SYMBOL*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6de: MATHEMATICAL BOLD KAPPA SYMBOL*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6df: MATHEMATICAL BOLD PHI SYMBOL*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6e0: MATHEMATICAL BOLD RHO SYMBOL*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6e1: MATHEMATICAL BOLD PI SYMBOL*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6e2: MATHEMATICAL ITALIC CAPITAL ALPHA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6e3: MATHEMATICAL ITALIC CAPITAL BETA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6e4: MATHEMATICAL ITALIC CAPITAL GAMMA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6e5: MATHEMATICAL ITALIC CAPITAL DELTA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6e6: MATHEMATICAL ITALIC CAPITAL EPSILON*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6e7: MATHEMATICAL ITALIC CAPITAL ZETA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6e8: MATHEMATICAL ITALIC CAPITAL ETA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6e9: MATHEMATICAL ITALIC CAPITAL THETA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6ea: MATHEMATICAL ITALIC CAPITAL IOTA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6eb: MATHEMATICAL ITALIC CAPITAL KAPPA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6ec: MATHEMATICAL ITALIC CAPITAL LAMDA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6ed: MATHEMATICAL ITALIC CAPITAL MU*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6ee: MATHEMATICAL ITALIC CAPITAL NU*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6ef: MATHEMATICAL ITALIC CAPITAL XI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6f0: MATHEMATICAL ITALIC CAPITAL OMICRON*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6f1: MATHEMATICAL ITALIC CAPITAL PI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6f2: MATHEMATICAL ITALIC CAPITAL RHO*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6f3: MATHEMATICAL ITALIC CAPITAL THETA SYMBOL*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6f4: MATHEMATICAL ITALIC CAPITAL SIGMA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6f5: MATHEMATICAL ITALIC CAPITAL TAU*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6f6: MATHEMATICAL ITALIC CAPITAL UPSILON*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6f7: MATHEMATICAL ITALIC CAPITAL PHI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6f8: MATHEMATICAL ITALIC CAPITAL CHI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6f9: MATHEMATICAL ITALIC CAPITAL PSI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6fa: MATHEMATICAL ITALIC CAPITAL OMEGA*/
- 0, /* U+01d6fb: MATHEMATICAL ITALIC NABLA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6fc: MATHEMATICAL ITALIC SMALL ALPHA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6fd: MATHEMATICAL ITALIC SMALL BETA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6fe: MATHEMATICAL ITALIC SMALL GAMMA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6ff: MATHEMATICAL ITALIC SMALL DELTA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d700: MATHEMATICAL ITALIC SMALL EPSILON*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d701: MATHEMATICAL ITALIC SMALL ZETA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d702: MATHEMATICAL ITALIC SMALL ETA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d703: MATHEMATICAL ITALIC SMALL THETA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d704: MATHEMATICAL ITALIC SMALL IOTA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d705: MATHEMATICAL ITALIC SMALL KAPPA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d706: MATHEMATICAL ITALIC SMALL LAMDA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d707: MATHEMATICAL ITALIC SMALL MU*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d708: MATHEMATICAL ITALIC SMALL NU*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d709: MATHEMATICAL ITALIC SMALL XI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d70a: MATHEMATICAL ITALIC SMALL OMICRON*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d70b: MATHEMATICAL ITALIC SMALL PI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d70c: MATHEMATICAL ITALIC SMALL RHO*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d70d: MATHEMATICAL ITALIC SMALL FINAL SIGMA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d70e: MATHEMATICAL ITALIC SMALL SIGMA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d70f: MATHEMATICAL ITALIC SMALL TAU*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d710: MATHEMATICAL ITALIC SMALL UPSILON*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d711: MATHEMATICAL ITALIC SMALL PHI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d712: MATHEMATICAL ITALIC SMALL CHI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d713: MATHEMATICAL ITALIC SMALL PSI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d714: MATHEMATICAL ITALIC SMALL OMEGA*/
- 0, /* U+01d715: MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d716: MATHEMATICAL ITALIC EPSILON SYMBOL*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d717: MATHEMATICAL ITALIC THETA SYMBOL*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d718: MATHEMATICAL ITALIC KAPPA SYMBOL*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d719: MATHEMATICAL ITALIC PHI SYMBOL*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d71a: MATHEMATICAL ITALIC RHO SYMBOL*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d71b: MATHEMATICAL ITALIC PI SYMBOL*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d71c: MATHEMATICAL BOLD ITALIC CAPITAL ALPHA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d71d: MATHEMATICAL BOLD ITALIC CAPITAL BETA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d71e: MATHEMATICAL BOLD ITALIC CAPITAL GAMMA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d71f: MATHEMATICAL BOLD ITALIC CAPITAL DELTA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d720: MATHEMATICAL BOLD ITALIC CAPITAL EPSILON*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d721: MATHEMATICAL BOLD ITALIC CAPITAL ZETA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d722: MATHEMATICAL BOLD ITALIC CAPITAL ETA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d723: MATHEMATICAL BOLD ITALIC CAPITAL THETA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d724: MATHEMATICAL BOLD ITALIC CAPITAL IOTA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d725: MATHEMATICAL BOLD ITALIC CAPITAL KAPPA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d726: MATHEMATICAL BOLD ITALIC CAPITAL LAMDA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d727: MATHEMATICAL BOLD ITALIC CAPITAL MU*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d728: MATHEMATICAL BOLD ITALIC CAPITAL NU*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d729: MATHEMATICAL BOLD ITALIC CAPITAL XI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d72a: MATHEMATICAL BOLD ITALIC CAPITAL OMICRON*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d72b: MATHEMATICAL BOLD ITALIC CAPITAL PI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d72c: MATHEMATICAL BOLD ITALIC CAPITAL RHO*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d72d: MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d72e: MATHEMATICAL BOLD ITALIC CAPITAL SIGMA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d72f: MATHEMATICAL BOLD ITALIC CAPITAL TAU*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d730: MATHEMATICAL BOLD ITALIC CAPITAL UPSILON*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d731: MATHEMATICAL BOLD ITALIC CAPITAL PHI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d732: MATHEMATICAL BOLD ITALIC CAPITAL CHI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d733: MATHEMATICAL BOLD ITALIC CAPITAL PSI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d734: MATHEMATICAL BOLD ITALIC CAPITAL OMEGA*/
- 0, /* U+01d735: MATHEMATICAL BOLD ITALIC NABLA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d736: MATHEMATICAL BOLD ITALIC SMALL ALPHA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d737: MATHEMATICAL BOLD ITALIC SMALL BETA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d738: MATHEMATICAL BOLD ITALIC SMALL GAMMA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d739: MATHEMATICAL BOLD ITALIC SMALL DELTA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d73a: MATHEMATICAL BOLD ITALIC SMALL EPSILON*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d73b: MATHEMATICAL BOLD ITALIC SMALL ZETA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d73c: MATHEMATICAL BOLD ITALIC SMALL ETA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d73d: MATHEMATICAL BOLD ITALIC SMALL THETA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d73e: MATHEMATICAL BOLD ITALIC SMALL IOTA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d73f: MATHEMATICAL BOLD ITALIC SMALL KAPPA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d740: MATHEMATICAL BOLD ITALIC SMALL LAMDA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d741: MATHEMATICAL BOLD ITALIC SMALL MU*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d742: MATHEMATICAL BOLD ITALIC SMALL NU*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d743: MATHEMATICAL BOLD ITALIC SMALL XI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d744: MATHEMATICAL BOLD ITALIC SMALL OMICRON*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d745: MATHEMATICAL BOLD ITALIC SMALL PI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d746: MATHEMATICAL BOLD ITALIC SMALL RHO*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d747: MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d748: MATHEMATICAL BOLD ITALIC SMALL SIGMA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d749: MATHEMATICAL BOLD ITALIC SMALL TAU*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d74a: MATHEMATICAL BOLD ITALIC SMALL UPSILON*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d74b: MATHEMATICAL BOLD ITALIC SMALL PHI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d74c: MATHEMATICAL BOLD ITALIC SMALL CHI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d74d: MATHEMATICAL BOLD ITALIC SMALL PSI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d74e: MATHEMATICAL BOLD ITALIC SMALL OMEGA*/
- 0, /* U+01d74f: MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d750: MATHEMATICAL BOLD ITALIC EPSILON SYMBOL*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d751: MATHEMATICAL BOLD ITALIC THETA SYMBOL*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d752: MATHEMATICAL BOLD ITALIC KAPPA SYMBOL*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d753: MATHEMATICAL BOLD ITALIC PHI SYMBOL*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d754: MATHEMATICAL BOLD ITALIC RHO SYMBOL*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d755: MATHEMATICAL BOLD ITALIC PI SYMBOL*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d756: MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d757: MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d758: MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d759: MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d75a: MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d75b: MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d75c: MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d75d: MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d75e: MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d75f: MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d760: MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d761: MATHEMATICAL SANS-SERIF BOLD CAPITAL MU*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d762: MATHEMATICAL SANS-SERIF BOLD CAPITAL NU*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d763: MATHEMATICAL SANS-SERIF BOLD CAPITAL XI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d764: MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d765: MATHEMATICAL SANS-SERIF BOLD CAPITAL PI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d766: MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d767: MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d768: MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d769: MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d76a: MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d76b: MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d76c: MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d76d: MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d76e: MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA*/
- 0, /* U+01d76f: MATHEMATICAL SANS-SERIF BOLD NABLA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d770: MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d771: MATHEMATICAL SANS-SERIF BOLD SMALL BETA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d772: MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d773: MATHEMATICAL SANS-SERIF BOLD SMALL DELTA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d774: MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d775: MATHEMATICAL SANS-SERIF BOLD SMALL ZETA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d776: MATHEMATICAL SANS-SERIF BOLD SMALL ETA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d777: MATHEMATICAL SANS-SERIF BOLD SMALL THETA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d778: MATHEMATICAL SANS-SERIF BOLD SMALL IOTA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d779: MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d77a: MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d77b: MATHEMATICAL SANS-SERIF BOLD SMALL MU*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d77c: MATHEMATICAL SANS-SERIF BOLD SMALL NU*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d77d: MATHEMATICAL SANS-SERIF BOLD SMALL XI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d77e: MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d77f: MATHEMATICAL SANS-SERIF BOLD SMALL PI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d780: MATHEMATICAL SANS-SERIF BOLD SMALL RHO*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d781: MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d782: MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d783: MATHEMATICAL SANS-SERIF BOLD SMALL TAU*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d784: MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d785: MATHEMATICAL SANS-SERIF BOLD SMALL PHI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d786: MATHEMATICAL SANS-SERIF BOLD SMALL CHI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d787: MATHEMATICAL SANS-SERIF BOLD SMALL PSI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d788: MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA*/
- 0, /* U+01d789: MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d78a: MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d78b: MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d78c: MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d78d: MATHEMATICAL SANS-SERIF BOLD PHI SYMBOL*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d78e: MATHEMATICAL SANS-SERIF BOLD RHO SYMBOL*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d78f: MATHEMATICAL SANS-SERIF BOLD PI SYMBOL*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d790: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d791: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d792: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d793: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d794: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d795: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d796: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d797: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d798: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d799: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d79a: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d79b: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d79c: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d79d: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d79e: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d79f: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d7a0: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d7a1: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d7a2: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d7a3: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d7a4: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d7a5: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d7a6: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d7a7: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI*/
- RTUNI_ALPHA | RTUNI_UPPER, /* U+01d7a8: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA*/
- 0, /* U+01d7a9: MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7aa: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7ab: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7ac: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7ad: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7ae: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7af: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7b0: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7b1: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7b2: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7b3: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7b4: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7b5: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7b6: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7b7: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7b8: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7b9: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7ba: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7bb: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7bc: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7bd: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7be: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7bf: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7c0: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7c1: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7c2: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA*/
- 0, /* U+01d7c3: MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7c4: MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7c5: MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7c6: MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7c7: MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7c8: MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL*/
- RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7c9: MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL*/
- 0, /* U+01d7ca: */
- 0, /* U+01d7cb: */
- 0, /* U+01d7cc: */
- 0, /* U+01d7cd: */
- RTUNI_DDIGIT, /* U+01d7ce: MATHEMATICAL BOLD DIGIT ZERO*/
- RTUNI_DDIGIT, /* U+01d7cf: MATHEMATICAL BOLD DIGIT ONE*/
- RTUNI_DDIGIT, /* U+01d7d0: MATHEMATICAL BOLD DIGIT TWO*/
- RTUNI_DDIGIT, /* U+01d7d1: MATHEMATICAL BOLD DIGIT THREE*/
- RTUNI_DDIGIT, /* U+01d7d2: MATHEMATICAL BOLD DIGIT FOUR*/
- RTUNI_DDIGIT, /* U+01d7d3: MATHEMATICAL BOLD DIGIT FIVE*/
- RTUNI_DDIGIT, /* U+01d7d4: MATHEMATICAL BOLD DIGIT SIX*/
- RTUNI_DDIGIT, /* U+01d7d5: MATHEMATICAL BOLD DIGIT SEVEN*/
- RTUNI_DDIGIT, /* U+01d7d6: MATHEMATICAL BOLD DIGIT EIGHT*/
- RTUNI_DDIGIT, /* U+01d7d7: MATHEMATICAL BOLD DIGIT NINE*/
- RTUNI_DDIGIT, /* U+01d7d8: MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO*/
- RTUNI_DDIGIT, /* U+01d7d9: MATHEMATICAL DOUBLE-STRUCK DIGIT ONE*/
- RTUNI_DDIGIT, /* U+01d7da: MATHEMATICAL DOUBLE-STRUCK DIGIT TWO*/
- RTUNI_DDIGIT, /* U+01d7db: MATHEMATICAL DOUBLE-STRUCK DIGIT THREE*/
- RTUNI_DDIGIT, /* U+01d7dc: MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR*/
- RTUNI_DDIGIT, /* U+01d7dd: MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE*/
- RTUNI_DDIGIT, /* U+01d7de: MATHEMATICAL DOUBLE-STRUCK DIGIT SIX*/
- RTUNI_DDIGIT, /* U+01d7df: MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN*/
- RTUNI_DDIGIT, /* U+01d7e0: MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT*/
- RTUNI_DDIGIT, /* U+01d7e1: MATHEMATICAL DOUBLE-STRUCK DIGIT NINE*/
- RTUNI_DDIGIT, /* U+01d7e2: MATHEMATICAL SANS-SERIF DIGIT ZERO*/
- RTUNI_DDIGIT, /* U+01d7e3: MATHEMATICAL SANS-SERIF DIGIT ONE*/
- RTUNI_DDIGIT, /* U+01d7e4: MATHEMATICAL SANS-SERIF DIGIT TWO*/
- RTUNI_DDIGIT, /* U+01d7e5: MATHEMATICAL SANS-SERIF DIGIT THREE*/
- RTUNI_DDIGIT, /* U+01d7e6: MATHEMATICAL SANS-SERIF DIGIT FOUR*/
- RTUNI_DDIGIT, /* U+01d7e7: MATHEMATICAL SANS-SERIF DIGIT FIVE*/
- RTUNI_DDIGIT, /* U+01d7e8: MATHEMATICAL SANS-SERIF DIGIT SIX*/
- RTUNI_DDIGIT, /* U+01d7e9: MATHEMATICAL SANS-SERIF DIGIT SEVEN*/
- RTUNI_DDIGIT, /* U+01d7ea: MATHEMATICAL SANS-SERIF DIGIT EIGHT*/
- RTUNI_DDIGIT, /* U+01d7eb: MATHEMATICAL SANS-SERIF DIGIT NINE*/
- RTUNI_DDIGIT, /* U+01d7ec: MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO*/
- RTUNI_DDIGIT, /* U+01d7ed: MATHEMATICAL SANS-SERIF BOLD DIGIT ONE*/
- RTUNI_DDIGIT, /* U+01d7ee: MATHEMATICAL SANS-SERIF BOLD DIGIT TWO*/
- RTUNI_DDIGIT, /* U+01d7ef: MATHEMATICAL SANS-SERIF BOLD DIGIT THREE*/
- RTUNI_DDIGIT, /* U+01d7f0: MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR*/
- RTUNI_DDIGIT, /* U+01d7f1: MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE*/
- RTUNI_DDIGIT, /* U+01d7f2: MATHEMATICAL SANS-SERIF BOLD DIGIT SIX*/
- RTUNI_DDIGIT, /* U+01d7f3: MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN*/
- RTUNI_DDIGIT, /* U+01d7f4: MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT*/
- RTUNI_DDIGIT, /* U+01d7f5: MATHEMATICAL SANS-SERIF BOLD DIGIT NINE*/
- RTUNI_DDIGIT, /* U+01d7f6: MATHEMATICAL MONOSPACE DIGIT ZERO*/
- RTUNI_DDIGIT, /* U+01d7f7: MATHEMATICAL MONOSPACE DIGIT ONE*/
- RTUNI_DDIGIT, /* U+01d7f8: MATHEMATICAL MONOSPACE DIGIT TWO*/
- RTUNI_DDIGIT, /* U+01d7f9: MATHEMATICAL MONOSPACE DIGIT THREE*/
- RTUNI_DDIGIT, /* U+01d7fa: MATHEMATICAL MONOSPACE DIGIT FOUR*/
- RTUNI_DDIGIT, /* U+01d7fb: MATHEMATICAL MONOSPACE DIGIT FIVE*/
- RTUNI_DDIGIT, /* U+01d7fc: MATHEMATICAL MONOSPACE DIGIT SIX*/
- RTUNI_DDIGIT, /* U+01d7fd: MATHEMATICAL MONOSPACE DIGIT SEVEN*/
- RTUNI_DDIGIT, /* U+01d7fe: MATHEMATICAL MONOSPACE DIGIT EIGHT*/
- RTUNI_DDIGIT, /* U+01d7ff: MATHEMATICAL MONOSPACE DIGIT NINE*/
-};
-
-static const uint8_t g_afRTUniFlags0x020000[] =
-{
- RTUNI_ALPHA, /* U+020000: <CJK Ideograph Extension B, First>*/
-};
-
-static const uint8_t g_afRTUniFlags0x02a6d6[] =
-{
- RTUNI_ALPHA, /* U+02a6d6: <CJK Ideograph Extension B, Last>*/
-};
-
-static const uint8_t g_afRTUniFlags0x02f800[] =
-{
- RTUNI_ALPHA, /* U+02f800: CJK COMPATIBILITY IDEOGRAPH-2F800*/
- RTUNI_ALPHA, /* U+02f801: CJK COMPATIBILITY IDEOGRAPH-2F801*/
- RTUNI_ALPHA, /* U+02f802: CJK COMPATIBILITY IDEOGRAPH-2F802*/
- RTUNI_ALPHA, /* U+02f803: CJK COMPATIBILITY IDEOGRAPH-2F803*/
- RTUNI_ALPHA, /* U+02f804: CJK COMPATIBILITY IDEOGRAPH-2F804*/
- RTUNI_ALPHA, /* U+02f805: CJK COMPATIBILITY IDEOGRAPH-2F805*/
- RTUNI_ALPHA, /* U+02f806: CJK COMPATIBILITY IDEOGRAPH-2F806*/
- RTUNI_ALPHA, /* U+02f807: CJK COMPATIBILITY IDEOGRAPH-2F807*/
- RTUNI_ALPHA, /* U+02f808: CJK COMPATIBILITY IDEOGRAPH-2F808*/
- RTUNI_ALPHA, /* U+02f809: CJK COMPATIBILITY IDEOGRAPH-2F809*/
- RTUNI_ALPHA, /* U+02f80a: CJK COMPATIBILITY IDEOGRAPH-2F80A*/
- RTUNI_ALPHA, /* U+02f80b: CJK COMPATIBILITY IDEOGRAPH-2F80B*/
- RTUNI_ALPHA, /* U+02f80c: CJK COMPATIBILITY IDEOGRAPH-2F80C*/
- RTUNI_ALPHA, /* U+02f80d: CJK COMPATIBILITY IDEOGRAPH-2F80D*/
- RTUNI_ALPHA, /* U+02f80e: CJK COMPATIBILITY IDEOGRAPH-2F80E*/
- RTUNI_ALPHA, /* U+02f80f: CJK COMPATIBILITY IDEOGRAPH-2F80F*/
- RTUNI_ALPHA, /* U+02f810: CJK COMPATIBILITY IDEOGRAPH-2F810*/
- RTUNI_ALPHA, /* U+02f811: CJK COMPATIBILITY IDEOGRAPH-2F811*/
- RTUNI_ALPHA, /* U+02f812: CJK COMPATIBILITY IDEOGRAPH-2F812*/
- RTUNI_ALPHA, /* U+02f813: CJK COMPATIBILITY IDEOGRAPH-2F813*/
- RTUNI_ALPHA, /* U+02f814: CJK COMPATIBILITY IDEOGRAPH-2F814*/
- RTUNI_ALPHA, /* U+02f815: CJK COMPATIBILITY IDEOGRAPH-2F815*/
- RTUNI_ALPHA, /* U+02f816: CJK COMPATIBILITY IDEOGRAPH-2F816*/
- RTUNI_ALPHA, /* U+02f817: CJK COMPATIBILITY IDEOGRAPH-2F817*/
- RTUNI_ALPHA, /* U+02f818: CJK COMPATIBILITY IDEOGRAPH-2F818*/
- RTUNI_ALPHA, /* U+02f819: CJK COMPATIBILITY IDEOGRAPH-2F819*/
- RTUNI_ALPHA, /* U+02f81a: CJK COMPATIBILITY IDEOGRAPH-2F81A*/
- RTUNI_ALPHA, /* U+02f81b: CJK COMPATIBILITY IDEOGRAPH-2F81B*/
- RTUNI_ALPHA, /* U+02f81c: CJK COMPATIBILITY IDEOGRAPH-2F81C*/
- RTUNI_ALPHA, /* U+02f81d: CJK COMPATIBILITY IDEOGRAPH-2F81D*/
- RTUNI_ALPHA, /* U+02f81e: CJK COMPATIBILITY IDEOGRAPH-2F81E*/
- RTUNI_ALPHA, /* U+02f81f: CJK COMPATIBILITY IDEOGRAPH-2F81F*/
- RTUNI_ALPHA, /* U+02f820: CJK COMPATIBILITY IDEOGRAPH-2F820*/
- RTUNI_ALPHA, /* U+02f821: CJK COMPATIBILITY IDEOGRAPH-2F821*/
- RTUNI_ALPHA, /* U+02f822: CJK COMPATIBILITY IDEOGRAPH-2F822*/
- RTUNI_ALPHA, /* U+02f823: CJK COMPATIBILITY IDEOGRAPH-2F823*/
- RTUNI_ALPHA, /* U+02f824: CJK COMPATIBILITY IDEOGRAPH-2F824*/
- RTUNI_ALPHA, /* U+02f825: CJK COMPATIBILITY IDEOGRAPH-2F825*/
- RTUNI_ALPHA, /* U+02f826: CJK COMPATIBILITY IDEOGRAPH-2F826*/
- RTUNI_ALPHA, /* U+02f827: CJK COMPATIBILITY IDEOGRAPH-2F827*/
- RTUNI_ALPHA, /* U+02f828: CJK COMPATIBILITY IDEOGRAPH-2F828*/
- RTUNI_ALPHA, /* U+02f829: CJK COMPATIBILITY IDEOGRAPH-2F829*/
- RTUNI_ALPHA, /* U+02f82a: CJK COMPATIBILITY IDEOGRAPH-2F82A*/
- RTUNI_ALPHA, /* U+02f82b: CJK COMPATIBILITY IDEOGRAPH-2F82B*/
- RTUNI_ALPHA, /* U+02f82c: CJK COMPATIBILITY IDEOGRAPH-2F82C*/
- RTUNI_ALPHA, /* U+02f82d: CJK COMPATIBILITY IDEOGRAPH-2F82D*/
- RTUNI_ALPHA, /* U+02f82e: CJK COMPATIBILITY IDEOGRAPH-2F82E*/
- RTUNI_ALPHA, /* U+02f82f: CJK COMPATIBILITY IDEOGRAPH-2F82F*/
- RTUNI_ALPHA, /* U+02f830: CJK COMPATIBILITY IDEOGRAPH-2F830*/
- RTUNI_ALPHA, /* U+02f831: CJK COMPATIBILITY IDEOGRAPH-2F831*/
- RTUNI_ALPHA, /* U+02f832: CJK COMPATIBILITY IDEOGRAPH-2F832*/
- RTUNI_ALPHA, /* U+02f833: CJK COMPATIBILITY IDEOGRAPH-2F833*/
- RTUNI_ALPHA, /* U+02f834: CJK COMPATIBILITY IDEOGRAPH-2F834*/
- RTUNI_ALPHA, /* U+02f835: CJK COMPATIBILITY IDEOGRAPH-2F835*/
- RTUNI_ALPHA, /* U+02f836: CJK COMPATIBILITY IDEOGRAPH-2F836*/
- RTUNI_ALPHA, /* U+02f837: CJK COMPATIBILITY IDEOGRAPH-2F837*/
- RTUNI_ALPHA, /* U+02f838: CJK COMPATIBILITY IDEOGRAPH-2F838*/
- RTUNI_ALPHA, /* U+02f839: CJK COMPATIBILITY IDEOGRAPH-2F839*/
- RTUNI_ALPHA, /* U+02f83a: CJK COMPATIBILITY IDEOGRAPH-2F83A*/
- RTUNI_ALPHA, /* U+02f83b: CJK COMPATIBILITY IDEOGRAPH-2F83B*/
- RTUNI_ALPHA, /* U+02f83c: CJK COMPATIBILITY IDEOGRAPH-2F83C*/
- RTUNI_ALPHA, /* U+02f83d: CJK COMPATIBILITY IDEOGRAPH-2F83D*/
- RTUNI_ALPHA, /* U+02f83e: CJK COMPATIBILITY IDEOGRAPH-2F83E*/
- RTUNI_ALPHA, /* U+02f83f: CJK COMPATIBILITY IDEOGRAPH-2F83F*/
- RTUNI_ALPHA, /* U+02f840: CJK COMPATIBILITY IDEOGRAPH-2F840*/
- RTUNI_ALPHA, /* U+02f841: CJK COMPATIBILITY IDEOGRAPH-2F841*/
- RTUNI_ALPHA, /* U+02f842: CJK COMPATIBILITY IDEOGRAPH-2F842*/
- RTUNI_ALPHA, /* U+02f843: CJK COMPATIBILITY IDEOGRAPH-2F843*/
- RTUNI_ALPHA, /* U+02f844: CJK COMPATIBILITY IDEOGRAPH-2F844*/
- RTUNI_ALPHA, /* U+02f845: CJK COMPATIBILITY IDEOGRAPH-2F845*/
- RTUNI_ALPHA, /* U+02f846: CJK COMPATIBILITY IDEOGRAPH-2F846*/
- RTUNI_ALPHA, /* U+02f847: CJK COMPATIBILITY IDEOGRAPH-2F847*/
- RTUNI_ALPHA, /* U+02f848: CJK COMPATIBILITY IDEOGRAPH-2F848*/
- RTUNI_ALPHA, /* U+02f849: CJK COMPATIBILITY IDEOGRAPH-2F849*/
- RTUNI_ALPHA, /* U+02f84a: CJK COMPATIBILITY IDEOGRAPH-2F84A*/
- RTUNI_ALPHA, /* U+02f84b: CJK COMPATIBILITY IDEOGRAPH-2F84B*/
- RTUNI_ALPHA, /* U+02f84c: CJK COMPATIBILITY IDEOGRAPH-2F84C*/
- RTUNI_ALPHA, /* U+02f84d: CJK COMPATIBILITY IDEOGRAPH-2F84D*/
- RTUNI_ALPHA, /* U+02f84e: CJK COMPATIBILITY IDEOGRAPH-2F84E*/
- RTUNI_ALPHA, /* U+02f84f: CJK COMPATIBILITY IDEOGRAPH-2F84F*/
- RTUNI_ALPHA, /* U+02f850: CJK COMPATIBILITY IDEOGRAPH-2F850*/
- RTUNI_ALPHA, /* U+02f851: CJK COMPATIBILITY IDEOGRAPH-2F851*/
- RTUNI_ALPHA, /* U+02f852: CJK COMPATIBILITY IDEOGRAPH-2F852*/
- RTUNI_ALPHA, /* U+02f853: CJK COMPATIBILITY IDEOGRAPH-2F853*/
- RTUNI_ALPHA, /* U+02f854: CJK COMPATIBILITY IDEOGRAPH-2F854*/
- RTUNI_ALPHA, /* U+02f855: CJK COMPATIBILITY IDEOGRAPH-2F855*/
- RTUNI_ALPHA, /* U+02f856: CJK COMPATIBILITY IDEOGRAPH-2F856*/
- RTUNI_ALPHA, /* U+02f857: CJK COMPATIBILITY IDEOGRAPH-2F857*/
- RTUNI_ALPHA, /* U+02f858: CJK COMPATIBILITY IDEOGRAPH-2F858*/
- RTUNI_ALPHA, /* U+02f859: CJK COMPATIBILITY IDEOGRAPH-2F859*/
- RTUNI_ALPHA, /* U+02f85a: CJK COMPATIBILITY IDEOGRAPH-2F85A*/
- RTUNI_ALPHA, /* U+02f85b: CJK COMPATIBILITY IDEOGRAPH-2F85B*/
- RTUNI_ALPHA, /* U+02f85c: CJK COMPATIBILITY IDEOGRAPH-2F85C*/
- RTUNI_ALPHA, /* U+02f85d: CJK COMPATIBILITY IDEOGRAPH-2F85D*/
- RTUNI_ALPHA, /* U+02f85e: CJK COMPATIBILITY IDEOGRAPH-2F85E*/
- RTUNI_ALPHA, /* U+02f85f: CJK COMPATIBILITY IDEOGRAPH-2F85F*/
- RTUNI_ALPHA, /* U+02f860: CJK COMPATIBILITY IDEOGRAPH-2F860*/
- RTUNI_ALPHA, /* U+02f861: CJK COMPATIBILITY IDEOGRAPH-2F861*/
- RTUNI_ALPHA, /* U+02f862: CJK COMPATIBILITY IDEOGRAPH-2F862*/
- RTUNI_ALPHA, /* U+02f863: CJK COMPATIBILITY IDEOGRAPH-2F863*/
- RTUNI_ALPHA, /* U+02f864: CJK COMPATIBILITY IDEOGRAPH-2F864*/
- RTUNI_ALPHA, /* U+02f865: CJK COMPATIBILITY IDEOGRAPH-2F865*/
- RTUNI_ALPHA, /* U+02f866: CJK COMPATIBILITY IDEOGRAPH-2F866*/
- RTUNI_ALPHA, /* U+02f867: CJK COMPATIBILITY IDEOGRAPH-2F867*/
- RTUNI_ALPHA, /* U+02f868: CJK COMPATIBILITY IDEOGRAPH-2F868*/
- RTUNI_ALPHA, /* U+02f869: CJK COMPATIBILITY IDEOGRAPH-2F869*/
- RTUNI_ALPHA, /* U+02f86a: CJK COMPATIBILITY IDEOGRAPH-2F86A*/
- RTUNI_ALPHA, /* U+02f86b: CJK COMPATIBILITY IDEOGRAPH-2F86B*/
- RTUNI_ALPHA, /* U+02f86c: CJK COMPATIBILITY IDEOGRAPH-2F86C*/
- RTUNI_ALPHA, /* U+02f86d: CJK COMPATIBILITY IDEOGRAPH-2F86D*/
- RTUNI_ALPHA, /* U+02f86e: CJK COMPATIBILITY IDEOGRAPH-2F86E*/
- RTUNI_ALPHA, /* U+02f86f: CJK COMPATIBILITY IDEOGRAPH-2F86F*/
- RTUNI_ALPHA, /* U+02f870: CJK COMPATIBILITY IDEOGRAPH-2F870*/
- RTUNI_ALPHA, /* U+02f871: CJK COMPATIBILITY IDEOGRAPH-2F871*/
- RTUNI_ALPHA, /* U+02f872: CJK COMPATIBILITY IDEOGRAPH-2F872*/
- RTUNI_ALPHA, /* U+02f873: CJK COMPATIBILITY IDEOGRAPH-2F873*/
- RTUNI_ALPHA, /* U+02f874: CJK COMPATIBILITY IDEOGRAPH-2F874*/
- RTUNI_ALPHA, /* U+02f875: CJK COMPATIBILITY IDEOGRAPH-2F875*/
- RTUNI_ALPHA, /* U+02f876: CJK COMPATIBILITY IDEOGRAPH-2F876*/
- RTUNI_ALPHA, /* U+02f877: CJK COMPATIBILITY IDEOGRAPH-2F877*/
- RTUNI_ALPHA, /* U+02f878: CJK COMPATIBILITY IDEOGRAPH-2F878*/
- RTUNI_ALPHA, /* U+02f879: CJK COMPATIBILITY IDEOGRAPH-2F879*/
- RTUNI_ALPHA, /* U+02f87a: CJK COMPATIBILITY IDEOGRAPH-2F87A*/
- RTUNI_ALPHA, /* U+02f87b: CJK COMPATIBILITY IDEOGRAPH-2F87B*/
- RTUNI_ALPHA, /* U+02f87c: CJK COMPATIBILITY IDEOGRAPH-2F87C*/
- RTUNI_ALPHA, /* U+02f87d: CJK COMPATIBILITY IDEOGRAPH-2F87D*/
- RTUNI_ALPHA, /* U+02f87e: CJK COMPATIBILITY IDEOGRAPH-2F87E*/
- RTUNI_ALPHA, /* U+02f87f: CJK COMPATIBILITY IDEOGRAPH-2F87F*/
- RTUNI_ALPHA, /* U+02f880: CJK COMPATIBILITY IDEOGRAPH-2F880*/
- RTUNI_ALPHA, /* U+02f881: CJK COMPATIBILITY IDEOGRAPH-2F881*/
- RTUNI_ALPHA, /* U+02f882: CJK COMPATIBILITY IDEOGRAPH-2F882*/
- RTUNI_ALPHA, /* U+02f883: CJK COMPATIBILITY IDEOGRAPH-2F883*/
- RTUNI_ALPHA, /* U+02f884: CJK COMPATIBILITY IDEOGRAPH-2F884*/
- RTUNI_ALPHA, /* U+02f885: CJK COMPATIBILITY IDEOGRAPH-2F885*/
- RTUNI_ALPHA, /* U+02f886: CJK COMPATIBILITY IDEOGRAPH-2F886*/
- RTUNI_ALPHA, /* U+02f887: CJK COMPATIBILITY IDEOGRAPH-2F887*/
- RTUNI_ALPHA, /* U+02f888: CJK COMPATIBILITY IDEOGRAPH-2F888*/
- RTUNI_ALPHA, /* U+02f889: CJK COMPATIBILITY IDEOGRAPH-2F889*/
- RTUNI_ALPHA, /* U+02f88a: CJK COMPATIBILITY IDEOGRAPH-2F88A*/
- RTUNI_ALPHA, /* U+02f88b: CJK COMPATIBILITY IDEOGRAPH-2F88B*/
- RTUNI_ALPHA, /* U+02f88c: CJK COMPATIBILITY IDEOGRAPH-2F88C*/
- RTUNI_ALPHA, /* U+02f88d: CJK COMPATIBILITY IDEOGRAPH-2F88D*/
- RTUNI_ALPHA, /* U+02f88e: CJK COMPATIBILITY IDEOGRAPH-2F88E*/
- RTUNI_ALPHA, /* U+02f88f: CJK COMPATIBILITY IDEOGRAPH-2F88F*/
- RTUNI_ALPHA, /* U+02f890: CJK COMPATIBILITY IDEOGRAPH-2F890*/
- RTUNI_ALPHA, /* U+02f891: CJK COMPATIBILITY IDEOGRAPH-2F891*/
- RTUNI_ALPHA, /* U+02f892: CJK COMPATIBILITY IDEOGRAPH-2F892*/
- RTUNI_ALPHA, /* U+02f893: CJK COMPATIBILITY IDEOGRAPH-2F893*/
- RTUNI_ALPHA, /* U+02f894: CJK COMPATIBILITY IDEOGRAPH-2F894*/
- RTUNI_ALPHA, /* U+02f895: CJK COMPATIBILITY IDEOGRAPH-2F895*/
- RTUNI_ALPHA, /* U+02f896: CJK COMPATIBILITY IDEOGRAPH-2F896*/
- RTUNI_ALPHA, /* U+02f897: CJK COMPATIBILITY IDEOGRAPH-2F897*/
- RTUNI_ALPHA, /* U+02f898: CJK COMPATIBILITY IDEOGRAPH-2F898*/
- RTUNI_ALPHA, /* U+02f899: CJK COMPATIBILITY IDEOGRAPH-2F899*/
- RTUNI_ALPHA, /* U+02f89a: CJK COMPATIBILITY IDEOGRAPH-2F89A*/
- RTUNI_ALPHA, /* U+02f89b: CJK COMPATIBILITY IDEOGRAPH-2F89B*/
- RTUNI_ALPHA, /* U+02f89c: CJK COMPATIBILITY IDEOGRAPH-2F89C*/
- RTUNI_ALPHA, /* U+02f89d: CJK COMPATIBILITY IDEOGRAPH-2F89D*/
- RTUNI_ALPHA, /* U+02f89e: CJK COMPATIBILITY IDEOGRAPH-2F89E*/
- RTUNI_ALPHA, /* U+02f89f: CJK COMPATIBILITY IDEOGRAPH-2F89F*/
- RTUNI_ALPHA, /* U+02f8a0: CJK COMPATIBILITY IDEOGRAPH-2F8A0*/
- RTUNI_ALPHA, /* U+02f8a1: CJK COMPATIBILITY IDEOGRAPH-2F8A1*/
- RTUNI_ALPHA, /* U+02f8a2: CJK COMPATIBILITY IDEOGRAPH-2F8A2*/
- RTUNI_ALPHA, /* U+02f8a3: CJK COMPATIBILITY IDEOGRAPH-2F8A3*/
- RTUNI_ALPHA, /* U+02f8a4: CJK COMPATIBILITY IDEOGRAPH-2F8A4*/
- RTUNI_ALPHA, /* U+02f8a5: CJK COMPATIBILITY IDEOGRAPH-2F8A5*/
- RTUNI_ALPHA, /* U+02f8a6: CJK COMPATIBILITY IDEOGRAPH-2F8A6*/
- RTUNI_ALPHA, /* U+02f8a7: CJK COMPATIBILITY IDEOGRAPH-2F8A7*/
- RTUNI_ALPHA, /* U+02f8a8: CJK COMPATIBILITY IDEOGRAPH-2F8A8*/
- RTUNI_ALPHA, /* U+02f8a9: CJK COMPATIBILITY IDEOGRAPH-2F8A9*/
- RTUNI_ALPHA, /* U+02f8aa: CJK COMPATIBILITY IDEOGRAPH-2F8AA*/
- RTUNI_ALPHA, /* U+02f8ab: CJK COMPATIBILITY IDEOGRAPH-2F8AB*/
- RTUNI_ALPHA, /* U+02f8ac: CJK COMPATIBILITY IDEOGRAPH-2F8AC*/
- RTUNI_ALPHA, /* U+02f8ad: CJK COMPATIBILITY IDEOGRAPH-2F8AD*/
- RTUNI_ALPHA, /* U+02f8ae: CJK COMPATIBILITY IDEOGRAPH-2F8AE*/
- RTUNI_ALPHA, /* U+02f8af: CJK COMPATIBILITY IDEOGRAPH-2F8AF*/
- RTUNI_ALPHA, /* U+02f8b0: CJK COMPATIBILITY IDEOGRAPH-2F8B0*/
- RTUNI_ALPHA, /* U+02f8b1: CJK COMPATIBILITY IDEOGRAPH-2F8B1*/
- RTUNI_ALPHA, /* U+02f8b2: CJK COMPATIBILITY IDEOGRAPH-2F8B2*/
- RTUNI_ALPHA, /* U+02f8b3: CJK COMPATIBILITY IDEOGRAPH-2F8B3*/
- RTUNI_ALPHA, /* U+02f8b4: CJK COMPATIBILITY IDEOGRAPH-2F8B4*/
- RTUNI_ALPHA, /* U+02f8b5: CJK COMPATIBILITY IDEOGRAPH-2F8B5*/
- RTUNI_ALPHA, /* U+02f8b6: CJK COMPATIBILITY IDEOGRAPH-2F8B6*/
- RTUNI_ALPHA, /* U+02f8b7: CJK COMPATIBILITY IDEOGRAPH-2F8B7*/
- RTUNI_ALPHA, /* U+02f8b8: CJK COMPATIBILITY IDEOGRAPH-2F8B8*/
- RTUNI_ALPHA, /* U+02f8b9: CJK COMPATIBILITY IDEOGRAPH-2F8B9*/
- RTUNI_ALPHA, /* U+02f8ba: CJK COMPATIBILITY IDEOGRAPH-2F8BA*/
- RTUNI_ALPHA, /* U+02f8bb: CJK COMPATIBILITY IDEOGRAPH-2F8BB*/
- RTUNI_ALPHA, /* U+02f8bc: CJK COMPATIBILITY IDEOGRAPH-2F8BC*/
- RTUNI_ALPHA, /* U+02f8bd: CJK COMPATIBILITY IDEOGRAPH-2F8BD*/
- RTUNI_ALPHA, /* U+02f8be: CJK COMPATIBILITY IDEOGRAPH-2F8BE*/
- RTUNI_ALPHA, /* U+02f8bf: CJK COMPATIBILITY IDEOGRAPH-2F8BF*/
- RTUNI_ALPHA, /* U+02f8c0: CJK COMPATIBILITY IDEOGRAPH-2F8C0*/
- RTUNI_ALPHA, /* U+02f8c1: CJK COMPATIBILITY IDEOGRAPH-2F8C1*/
- RTUNI_ALPHA, /* U+02f8c2: CJK COMPATIBILITY IDEOGRAPH-2F8C2*/
- RTUNI_ALPHA, /* U+02f8c3: CJK COMPATIBILITY IDEOGRAPH-2F8C3*/
- RTUNI_ALPHA, /* U+02f8c4: CJK COMPATIBILITY IDEOGRAPH-2F8C4*/
- RTUNI_ALPHA, /* U+02f8c5: CJK COMPATIBILITY IDEOGRAPH-2F8C5*/
- RTUNI_ALPHA, /* U+02f8c6: CJK COMPATIBILITY IDEOGRAPH-2F8C6*/
- RTUNI_ALPHA, /* U+02f8c7: CJK COMPATIBILITY IDEOGRAPH-2F8C7*/
- RTUNI_ALPHA, /* U+02f8c8: CJK COMPATIBILITY IDEOGRAPH-2F8C8*/
- RTUNI_ALPHA, /* U+02f8c9: CJK COMPATIBILITY IDEOGRAPH-2F8C9*/
- RTUNI_ALPHA, /* U+02f8ca: CJK COMPATIBILITY IDEOGRAPH-2F8CA*/
- RTUNI_ALPHA, /* U+02f8cb: CJK COMPATIBILITY IDEOGRAPH-2F8CB*/
- RTUNI_ALPHA, /* U+02f8cc: CJK COMPATIBILITY IDEOGRAPH-2F8CC*/
- RTUNI_ALPHA, /* U+02f8cd: CJK COMPATIBILITY IDEOGRAPH-2F8CD*/
- RTUNI_ALPHA, /* U+02f8ce: CJK COMPATIBILITY IDEOGRAPH-2F8CE*/
- RTUNI_ALPHA, /* U+02f8cf: CJK COMPATIBILITY IDEOGRAPH-2F8CF*/
- RTUNI_ALPHA, /* U+02f8d0: CJK COMPATIBILITY IDEOGRAPH-2F8D0*/
- RTUNI_ALPHA, /* U+02f8d1: CJK COMPATIBILITY IDEOGRAPH-2F8D1*/
- RTUNI_ALPHA, /* U+02f8d2: CJK COMPATIBILITY IDEOGRAPH-2F8D2*/
- RTUNI_ALPHA, /* U+02f8d3: CJK COMPATIBILITY IDEOGRAPH-2F8D3*/
- RTUNI_ALPHA, /* U+02f8d4: CJK COMPATIBILITY IDEOGRAPH-2F8D4*/
- RTUNI_ALPHA, /* U+02f8d5: CJK COMPATIBILITY IDEOGRAPH-2F8D5*/
- RTUNI_ALPHA, /* U+02f8d6: CJK COMPATIBILITY IDEOGRAPH-2F8D6*/
- RTUNI_ALPHA, /* U+02f8d7: CJK COMPATIBILITY IDEOGRAPH-2F8D7*/
- RTUNI_ALPHA, /* U+02f8d8: CJK COMPATIBILITY IDEOGRAPH-2F8D8*/
- RTUNI_ALPHA, /* U+02f8d9: CJK COMPATIBILITY IDEOGRAPH-2F8D9*/
- RTUNI_ALPHA, /* U+02f8da: CJK COMPATIBILITY IDEOGRAPH-2F8DA*/
- RTUNI_ALPHA, /* U+02f8db: CJK COMPATIBILITY IDEOGRAPH-2F8DB*/
- RTUNI_ALPHA, /* U+02f8dc: CJK COMPATIBILITY IDEOGRAPH-2F8DC*/
- RTUNI_ALPHA, /* U+02f8dd: CJK COMPATIBILITY IDEOGRAPH-2F8DD*/
- RTUNI_ALPHA, /* U+02f8de: CJK COMPATIBILITY IDEOGRAPH-2F8DE*/
- RTUNI_ALPHA, /* U+02f8df: CJK COMPATIBILITY IDEOGRAPH-2F8DF*/
- RTUNI_ALPHA, /* U+02f8e0: CJK COMPATIBILITY IDEOGRAPH-2F8E0*/
- RTUNI_ALPHA, /* U+02f8e1: CJK COMPATIBILITY IDEOGRAPH-2F8E1*/
- RTUNI_ALPHA, /* U+02f8e2: CJK COMPATIBILITY IDEOGRAPH-2F8E2*/
- RTUNI_ALPHA, /* U+02f8e3: CJK COMPATIBILITY IDEOGRAPH-2F8E3*/
- RTUNI_ALPHA, /* U+02f8e4: CJK COMPATIBILITY IDEOGRAPH-2F8E4*/
- RTUNI_ALPHA, /* U+02f8e5: CJK COMPATIBILITY IDEOGRAPH-2F8E5*/
- RTUNI_ALPHA, /* U+02f8e6: CJK COMPATIBILITY IDEOGRAPH-2F8E6*/
- RTUNI_ALPHA, /* U+02f8e7: CJK COMPATIBILITY IDEOGRAPH-2F8E7*/
- RTUNI_ALPHA, /* U+02f8e8: CJK COMPATIBILITY IDEOGRAPH-2F8E8*/
- RTUNI_ALPHA, /* U+02f8e9: CJK COMPATIBILITY IDEOGRAPH-2F8E9*/
- RTUNI_ALPHA, /* U+02f8ea: CJK COMPATIBILITY IDEOGRAPH-2F8EA*/
- RTUNI_ALPHA, /* U+02f8eb: CJK COMPATIBILITY IDEOGRAPH-2F8EB*/
- RTUNI_ALPHA, /* U+02f8ec: CJK COMPATIBILITY IDEOGRAPH-2F8EC*/
- RTUNI_ALPHA, /* U+02f8ed: CJK COMPATIBILITY IDEOGRAPH-2F8ED*/
- RTUNI_ALPHA, /* U+02f8ee: CJK COMPATIBILITY IDEOGRAPH-2F8EE*/
- RTUNI_ALPHA, /* U+02f8ef: CJK COMPATIBILITY IDEOGRAPH-2F8EF*/
- RTUNI_ALPHA, /* U+02f8f0: CJK COMPATIBILITY IDEOGRAPH-2F8F0*/
- RTUNI_ALPHA, /* U+02f8f1: CJK COMPATIBILITY IDEOGRAPH-2F8F1*/
- RTUNI_ALPHA, /* U+02f8f2: CJK COMPATIBILITY IDEOGRAPH-2F8F2*/
- RTUNI_ALPHA, /* U+02f8f3: CJK COMPATIBILITY IDEOGRAPH-2F8F3*/
- RTUNI_ALPHA, /* U+02f8f4: CJK COMPATIBILITY IDEOGRAPH-2F8F4*/
- RTUNI_ALPHA, /* U+02f8f5: CJK COMPATIBILITY IDEOGRAPH-2F8F5*/
- RTUNI_ALPHA, /* U+02f8f6: CJK COMPATIBILITY IDEOGRAPH-2F8F6*/
- RTUNI_ALPHA, /* U+02f8f7: CJK COMPATIBILITY IDEOGRAPH-2F8F7*/
- RTUNI_ALPHA, /* U+02f8f8: CJK COMPATIBILITY IDEOGRAPH-2F8F8*/
- RTUNI_ALPHA, /* U+02f8f9: CJK COMPATIBILITY IDEOGRAPH-2F8F9*/
- RTUNI_ALPHA, /* U+02f8fa: CJK COMPATIBILITY IDEOGRAPH-2F8FA*/
- RTUNI_ALPHA, /* U+02f8fb: CJK COMPATIBILITY IDEOGRAPH-2F8FB*/
- RTUNI_ALPHA, /* U+02f8fc: CJK COMPATIBILITY IDEOGRAPH-2F8FC*/
- RTUNI_ALPHA, /* U+02f8fd: CJK COMPATIBILITY IDEOGRAPH-2F8FD*/
- RTUNI_ALPHA, /* U+02f8fe: CJK COMPATIBILITY IDEOGRAPH-2F8FE*/
- RTUNI_ALPHA, /* U+02f8ff: CJK COMPATIBILITY IDEOGRAPH-2F8FF*/
- RTUNI_ALPHA, /* U+02f900: CJK COMPATIBILITY IDEOGRAPH-2F900*/
- RTUNI_ALPHA, /* U+02f901: CJK COMPATIBILITY IDEOGRAPH-2F901*/
- RTUNI_ALPHA, /* U+02f902: CJK COMPATIBILITY IDEOGRAPH-2F902*/
- RTUNI_ALPHA, /* U+02f903: CJK COMPATIBILITY IDEOGRAPH-2F903*/
- RTUNI_ALPHA, /* U+02f904: CJK COMPATIBILITY IDEOGRAPH-2F904*/
- RTUNI_ALPHA, /* U+02f905: CJK COMPATIBILITY IDEOGRAPH-2F905*/
- RTUNI_ALPHA, /* U+02f906: CJK COMPATIBILITY IDEOGRAPH-2F906*/
- RTUNI_ALPHA, /* U+02f907: CJK COMPATIBILITY IDEOGRAPH-2F907*/
- RTUNI_ALPHA, /* U+02f908: CJK COMPATIBILITY IDEOGRAPH-2F908*/
- RTUNI_ALPHA, /* U+02f909: CJK COMPATIBILITY IDEOGRAPH-2F909*/
- RTUNI_ALPHA, /* U+02f90a: CJK COMPATIBILITY IDEOGRAPH-2F90A*/
- RTUNI_ALPHA, /* U+02f90b: CJK COMPATIBILITY IDEOGRAPH-2F90B*/
- RTUNI_ALPHA, /* U+02f90c: CJK COMPATIBILITY IDEOGRAPH-2F90C*/
- RTUNI_ALPHA, /* U+02f90d: CJK COMPATIBILITY IDEOGRAPH-2F90D*/
- RTUNI_ALPHA, /* U+02f90e: CJK COMPATIBILITY IDEOGRAPH-2F90E*/
- RTUNI_ALPHA, /* U+02f90f: CJK COMPATIBILITY IDEOGRAPH-2F90F*/
- RTUNI_ALPHA, /* U+02f910: CJK COMPATIBILITY IDEOGRAPH-2F910*/
- RTUNI_ALPHA, /* U+02f911: CJK COMPATIBILITY IDEOGRAPH-2F911*/
- RTUNI_ALPHA, /* U+02f912: CJK COMPATIBILITY IDEOGRAPH-2F912*/
- RTUNI_ALPHA, /* U+02f913: CJK COMPATIBILITY IDEOGRAPH-2F913*/
- RTUNI_ALPHA, /* U+02f914: CJK COMPATIBILITY IDEOGRAPH-2F914*/
- RTUNI_ALPHA, /* U+02f915: CJK COMPATIBILITY IDEOGRAPH-2F915*/
- RTUNI_ALPHA, /* U+02f916: CJK COMPATIBILITY IDEOGRAPH-2F916*/
- RTUNI_ALPHA, /* U+02f917: CJK COMPATIBILITY IDEOGRAPH-2F917*/
- RTUNI_ALPHA, /* U+02f918: CJK COMPATIBILITY IDEOGRAPH-2F918*/
- RTUNI_ALPHA, /* U+02f919: CJK COMPATIBILITY IDEOGRAPH-2F919*/
- RTUNI_ALPHA, /* U+02f91a: CJK COMPATIBILITY IDEOGRAPH-2F91A*/
- RTUNI_ALPHA, /* U+02f91b: CJK COMPATIBILITY IDEOGRAPH-2F91B*/
- RTUNI_ALPHA, /* U+02f91c: CJK COMPATIBILITY IDEOGRAPH-2F91C*/
- RTUNI_ALPHA, /* U+02f91d: CJK COMPATIBILITY IDEOGRAPH-2F91D*/
- RTUNI_ALPHA, /* U+02f91e: CJK COMPATIBILITY IDEOGRAPH-2F91E*/
- RTUNI_ALPHA, /* U+02f91f: CJK COMPATIBILITY IDEOGRAPH-2F91F*/
- RTUNI_ALPHA, /* U+02f920: CJK COMPATIBILITY IDEOGRAPH-2F920*/
- RTUNI_ALPHA, /* U+02f921: CJK COMPATIBILITY IDEOGRAPH-2F921*/
- RTUNI_ALPHA, /* U+02f922: CJK COMPATIBILITY IDEOGRAPH-2F922*/
- RTUNI_ALPHA, /* U+02f923: CJK COMPATIBILITY IDEOGRAPH-2F923*/
- RTUNI_ALPHA, /* U+02f924: CJK COMPATIBILITY IDEOGRAPH-2F924*/
- RTUNI_ALPHA, /* U+02f925: CJK COMPATIBILITY IDEOGRAPH-2F925*/
- RTUNI_ALPHA, /* U+02f926: CJK COMPATIBILITY IDEOGRAPH-2F926*/
- RTUNI_ALPHA, /* U+02f927: CJK COMPATIBILITY IDEOGRAPH-2F927*/
- RTUNI_ALPHA, /* U+02f928: CJK COMPATIBILITY IDEOGRAPH-2F928*/
- RTUNI_ALPHA, /* U+02f929: CJK COMPATIBILITY IDEOGRAPH-2F929*/
- RTUNI_ALPHA, /* U+02f92a: CJK COMPATIBILITY IDEOGRAPH-2F92A*/
- RTUNI_ALPHA, /* U+02f92b: CJK COMPATIBILITY IDEOGRAPH-2F92B*/
- RTUNI_ALPHA, /* U+02f92c: CJK COMPATIBILITY IDEOGRAPH-2F92C*/
- RTUNI_ALPHA, /* U+02f92d: CJK COMPATIBILITY IDEOGRAPH-2F92D*/
- RTUNI_ALPHA, /* U+02f92e: CJK COMPATIBILITY IDEOGRAPH-2F92E*/
- RTUNI_ALPHA, /* U+02f92f: CJK COMPATIBILITY IDEOGRAPH-2F92F*/
- RTUNI_ALPHA, /* U+02f930: CJK COMPATIBILITY IDEOGRAPH-2F930*/
- RTUNI_ALPHA, /* U+02f931: CJK COMPATIBILITY IDEOGRAPH-2F931*/
- RTUNI_ALPHA, /* U+02f932: CJK COMPATIBILITY IDEOGRAPH-2F932*/
- RTUNI_ALPHA, /* U+02f933: CJK COMPATIBILITY IDEOGRAPH-2F933*/
- RTUNI_ALPHA, /* U+02f934: CJK COMPATIBILITY IDEOGRAPH-2F934*/
- RTUNI_ALPHA, /* U+02f935: CJK COMPATIBILITY IDEOGRAPH-2F935*/
- RTUNI_ALPHA, /* U+02f936: CJK COMPATIBILITY IDEOGRAPH-2F936*/
- RTUNI_ALPHA, /* U+02f937: CJK COMPATIBILITY IDEOGRAPH-2F937*/
- RTUNI_ALPHA, /* U+02f938: CJK COMPATIBILITY IDEOGRAPH-2F938*/
- RTUNI_ALPHA, /* U+02f939: CJK COMPATIBILITY IDEOGRAPH-2F939*/
- RTUNI_ALPHA, /* U+02f93a: CJK COMPATIBILITY IDEOGRAPH-2F93A*/
- RTUNI_ALPHA, /* U+02f93b: CJK COMPATIBILITY IDEOGRAPH-2F93B*/
- RTUNI_ALPHA, /* U+02f93c: CJK COMPATIBILITY IDEOGRAPH-2F93C*/
- RTUNI_ALPHA, /* U+02f93d: CJK COMPATIBILITY IDEOGRAPH-2F93D*/
- RTUNI_ALPHA, /* U+02f93e: CJK COMPATIBILITY IDEOGRAPH-2F93E*/
- RTUNI_ALPHA, /* U+02f93f: CJK COMPATIBILITY IDEOGRAPH-2F93F*/
- RTUNI_ALPHA, /* U+02f940: CJK COMPATIBILITY IDEOGRAPH-2F940*/
- RTUNI_ALPHA, /* U+02f941: CJK COMPATIBILITY IDEOGRAPH-2F941*/
- RTUNI_ALPHA, /* U+02f942: CJK COMPATIBILITY IDEOGRAPH-2F942*/
- RTUNI_ALPHA, /* U+02f943: CJK COMPATIBILITY IDEOGRAPH-2F943*/
- RTUNI_ALPHA, /* U+02f944: CJK COMPATIBILITY IDEOGRAPH-2F944*/
- RTUNI_ALPHA, /* U+02f945: CJK COMPATIBILITY IDEOGRAPH-2F945*/
- RTUNI_ALPHA, /* U+02f946: CJK COMPATIBILITY IDEOGRAPH-2F946*/
- RTUNI_ALPHA, /* U+02f947: CJK COMPATIBILITY IDEOGRAPH-2F947*/
- RTUNI_ALPHA, /* U+02f948: CJK COMPATIBILITY IDEOGRAPH-2F948*/
- RTUNI_ALPHA, /* U+02f949: CJK COMPATIBILITY IDEOGRAPH-2F949*/
- RTUNI_ALPHA, /* U+02f94a: CJK COMPATIBILITY IDEOGRAPH-2F94A*/
- RTUNI_ALPHA, /* U+02f94b: CJK COMPATIBILITY IDEOGRAPH-2F94B*/
- RTUNI_ALPHA, /* U+02f94c: CJK COMPATIBILITY IDEOGRAPH-2F94C*/
- RTUNI_ALPHA, /* U+02f94d: CJK COMPATIBILITY IDEOGRAPH-2F94D*/
- RTUNI_ALPHA, /* U+02f94e: CJK COMPATIBILITY IDEOGRAPH-2F94E*/
- RTUNI_ALPHA, /* U+02f94f: CJK COMPATIBILITY IDEOGRAPH-2F94F*/
- RTUNI_ALPHA, /* U+02f950: CJK COMPATIBILITY IDEOGRAPH-2F950*/
- RTUNI_ALPHA, /* U+02f951: CJK COMPATIBILITY IDEOGRAPH-2F951*/
- RTUNI_ALPHA, /* U+02f952: CJK COMPATIBILITY IDEOGRAPH-2F952*/
- RTUNI_ALPHA, /* U+02f953: CJK COMPATIBILITY IDEOGRAPH-2F953*/
- RTUNI_ALPHA, /* U+02f954: CJK COMPATIBILITY IDEOGRAPH-2F954*/
- RTUNI_ALPHA, /* U+02f955: CJK COMPATIBILITY IDEOGRAPH-2F955*/
- RTUNI_ALPHA, /* U+02f956: CJK COMPATIBILITY IDEOGRAPH-2F956*/
- RTUNI_ALPHA, /* U+02f957: CJK COMPATIBILITY IDEOGRAPH-2F957*/
- RTUNI_ALPHA, /* U+02f958: CJK COMPATIBILITY IDEOGRAPH-2F958*/
- RTUNI_ALPHA, /* U+02f959: CJK COMPATIBILITY IDEOGRAPH-2F959*/
- RTUNI_ALPHA, /* U+02f95a: CJK COMPATIBILITY IDEOGRAPH-2F95A*/
- RTUNI_ALPHA, /* U+02f95b: CJK COMPATIBILITY IDEOGRAPH-2F95B*/
- RTUNI_ALPHA, /* U+02f95c: CJK COMPATIBILITY IDEOGRAPH-2F95C*/
- RTUNI_ALPHA, /* U+02f95d: CJK COMPATIBILITY IDEOGRAPH-2F95D*/
- RTUNI_ALPHA, /* U+02f95e: CJK COMPATIBILITY IDEOGRAPH-2F95E*/
- RTUNI_ALPHA, /* U+02f95f: CJK COMPATIBILITY IDEOGRAPH-2F95F*/
- RTUNI_ALPHA, /* U+02f960: CJK COMPATIBILITY IDEOGRAPH-2F960*/
- RTUNI_ALPHA, /* U+02f961: CJK COMPATIBILITY IDEOGRAPH-2F961*/
- RTUNI_ALPHA, /* U+02f962: CJK COMPATIBILITY IDEOGRAPH-2F962*/
- RTUNI_ALPHA, /* U+02f963: CJK COMPATIBILITY IDEOGRAPH-2F963*/
- RTUNI_ALPHA, /* U+02f964: CJK COMPATIBILITY IDEOGRAPH-2F964*/
- RTUNI_ALPHA, /* U+02f965: CJK COMPATIBILITY IDEOGRAPH-2F965*/
- RTUNI_ALPHA, /* U+02f966: CJK COMPATIBILITY IDEOGRAPH-2F966*/
- RTUNI_ALPHA, /* U+02f967: CJK COMPATIBILITY IDEOGRAPH-2F967*/
- RTUNI_ALPHA, /* U+02f968: CJK COMPATIBILITY IDEOGRAPH-2F968*/
- RTUNI_ALPHA, /* U+02f969: CJK COMPATIBILITY IDEOGRAPH-2F969*/
- RTUNI_ALPHA, /* U+02f96a: CJK COMPATIBILITY IDEOGRAPH-2F96A*/
- RTUNI_ALPHA, /* U+02f96b: CJK COMPATIBILITY IDEOGRAPH-2F96B*/
- RTUNI_ALPHA, /* U+02f96c: CJK COMPATIBILITY IDEOGRAPH-2F96C*/
- RTUNI_ALPHA, /* U+02f96d: CJK COMPATIBILITY IDEOGRAPH-2F96D*/
- RTUNI_ALPHA, /* U+02f96e: CJK COMPATIBILITY IDEOGRAPH-2F96E*/
- RTUNI_ALPHA, /* U+02f96f: CJK COMPATIBILITY IDEOGRAPH-2F96F*/
- RTUNI_ALPHA, /* U+02f970: CJK COMPATIBILITY IDEOGRAPH-2F970*/
- RTUNI_ALPHA, /* U+02f971: CJK COMPATIBILITY IDEOGRAPH-2F971*/
- RTUNI_ALPHA, /* U+02f972: CJK COMPATIBILITY IDEOGRAPH-2F972*/
- RTUNI_ALPHA, /* U+02f973: CJK COMPATIBILITY IDEOGRAPH-2F973*/
- RTUNI_ALPHA, /* U+02f974: CJK COMPATIBILITY IDEOGRAPH-2F974*/
- RTUNI_ALPHA, /* U+02f975: CJK COMPATIBILITY IDEOGRAPH-2F975*/
- RTUNI_ALPHA, /* U+02f976: CJK COMPATIBILITY IDEOGRAPH-2F976*/
- RTUNI_ALPHA, /* U+02f977: CJK COMPATIBILITY IDEOGRAPH-2F977*/
- RTUNI_ALPHA, /* U+02f978: CJK COMPATIBILITY IDEOGRAPH-2F978*/
- RTUNI_ALPHA, /* U+02f979: CJK COMPATIBILITY IDEOGRAPH-2F979*/
- RTUNI_ALPHA, /* U+02f97a: CJK COMPATIBILITY IDEOGRAPH-2F97A*/
- RTUNI_ALPHA, /* U+02f97b: CJK COMPATIBILITY IDEOGRAPH-2F97B*/
- RTUNI_ALPHA, /* U+02f97c: CJK COMPATIBILITY IDEOGRAPH-2F97C*/
- RTUNI_ALPHA, /* U+02f97d: CJK COMPATIBILITY IDEOGRAPH-2F97D*/
- RTUNI_ALPHA, /* U+02f97e: CJK COMPATIBILITY IDEOGRAPH-2F97E*/
- RTUNI_ALPHA, /* U+02f97f: CJK COMPATIBILITY IDEOGRAPH-2F97F*/
- RTUNI_ALPHA, /* U+02f980: CJK COMPATIBILITY IDEOGRAPH-2F980*/
- RTUNI_ALPHA, /* U+02f981: CJK COMPATIBILITY IDEOGRAPH-2F981*/
- RTUNI_ALPHA, /* U+02f982: CJK COMPATIBILITY IDEOGRAPH-2F982*/
- RTUNI_ALPHA, /* U+02f983: CJK COMPATIBILITY IDEOGRAPH-2F983*/
- RTUNI_ALPHA, /* U+02f984: CJK COMPATIBILITY IDEOGRAPH-2F984*/
- RTUNI_ALPHA, /* U+02f985: CJK COMPATIBILITY IDEOGRAPH-2F985*/
- RTUNI_ALPHA, /* U+02f986: CJK COMPATIBILITY IDEOGRAPH-2F986*/
- RTUNI_ALPHA, /* U+02f987: CJK COMPATIBILITY IDEOGRAPH-2F987*/
- RTUNI_ALPHA, /* U+02f988: CJK COMPATIBILITY IDEOGRAPH-2F988*/
- RTUNI_ALPHA, /* U+02f989: CJK COMPATIBILITY IDEOGRAPH-2F989*/
- RTUNI_ALPHA, /* U+02f98a: CJK COMPATIBILITY IDEOGRAPH-2F98A*/
- RTUNI_ALPHA, /* U+02f98b: CJK COMPATIBILITY IDEOGRAPH-2F98B*/
- RTUNI_ALPHA, /* U+02f98c: CJK COMPATIBILITY IDEOGRAPH-2F98C*/
- RTUNI_ALPHA, /* U+02f98d: CJK COMPATIBILITY IDEOGRAPH-2F98D*/
- RTUNI_ALPHA, /* U+02f98e: CJK COMPATIBILITY IDEOGRAPH-2F98E*/
- RTUNI_ALPHA, /* U+02f98f: CJK COMPATIBILITY IDEOGRAPH-2F98F*/
- RTUNI_ALPHA, /* U+02f990: CJK COMPATIBILITY IDEOGRAPH-2F990*/
- RTUNI_ALPHA, /* U+02f991: CJK COMPATIBILITY IDEOGRAPH-2F991*/
- RTUNI_ALPHA, /* U+02f992: CJK COMPATIBILITY IDEOGRAPH-2F992*/
- RTUNI_ALPHA, /* U+02f993: CJK COMPATIBILITY IDEOGRAPH-2F993*/
- RTUNI_ALPHA, /* U+02f994: CJK COMPATIBILITY IDEOGRAPH-2F994*/
- RTUNI_ALPHA, /* U+02f995: CJK COMPATIBILITY IDEOGRAPH-2F995*/
- RTUNI_ALPHA, /* U+02f996: CJK COMPATIBILITY IDEOGRAPH-2F996*/
- RTUNI_ALPHA, /* U+02f997: CJK COMPATIBILITY IDEOGRAPH-2F997*/
- RTUNI_ALPHA, /* U+02f998: CJK COMPATIBILITY IDEOGRAPH-2F998*/
- RTUNI_ALPHA, /* U+02f999: CJK COMPATIBILITY IDEOGRAPH-2F999*/
- RTUNI_ALPHA, /* U+02f99a: CJK COMPATIBILITY IDEOGRAPH-2F99A*/
- RTUNI_ALPHA, /* U+02f99b: CJK COMPATIBILITY IDEOGRAPH-2F99B*/
- RTUNI_ALPHA, /* U+02f99c: CJK COMPATIBILITY IDEOGRAPH-2F99C*/
- RTUNI_ALPHA, /* U+02f99d: CJK COMPATIBILITY IDEOGRAPH-2F99D*/
- RTUNI_ALPHA, /* U+02f99e: CJK COMPATIBILITY IDEOGRAPH-2F99E*/
- RTUNI_ALPHA, /* U+02f99f: CJK COMPATIBILITY IDEOGRAPH-2F99F*/
- RTUNI_ALPHA, /* U+02f9a0: CJK COMPATIBILITY IDEOGRAPH-2F9A0*/
- RTUNI_ALPHA, /* U+02f9a1: CJK COMPATIBILITY IDEOGRAPH-2F9A1*/
- RTUNI_ALPHA, /* U+02f9a2: CJK COMPATIBILITY IDEOGRAPH-2F9A2*/
- RTUNI_ALPHA, /* U+02f9a3: CJK COMPATIBILITY IDEOGRAPH-2F9A3*/
- RTUNI_ALPHA, /* U+02f9a4: CJK COMPATIBILITY IDEOGRAPH-2F9A4*/
- RTUNI_ALPHA, /* U+02f9a5: CJK COMPATIBILITY IDEOGRAPH-2F9A5*/
- RTUNI_ALPHA, /* U+02f9a6: CJK COMPATIBILITY IDEOGRAPH-2F9A6*/
- RTUNI_ALPHA, /* U+02f9a7: CJK COMPATIBILITY IDEOGRAPH-2F9A7*/
- RTUNI_ALPHA, /* U+02f9a8: CJK COMPATIBILITY IDEOGRAPH-2F9A8*/
- RTUNI_ALPHA, /* U+02f9a9: CJK COMPATIBILITY IDEOGRAPH-2F9A9*/
- RTUNI_ALPHA, /* U+02f9aa: CJK COMPATIBILITY IDEOGRAPH-2F9AA*/
- RTUNI_ALPHA, /* U+02f9ab: CJK COMPATIBILITY IDEOGRAPH-2F9AB*/
- RTUNI_ALPHA, /* U+02f9ac: CJK COMPATIBILITY IDEOGRAPH-2F9AC*/
- RTUNI_ALPHA, /* U+02f9ad: CJK COMPATIBILITY IDEOGRAPH-2F9AD*/
- RTUNI_ALPHA, /* U+02f9ae: CJK COMPATIBILITY IDEOGRAPH-2F9AE*/
- RTUNI_ALPHA, /* U+02f9af: CJK COMPATIBILITY IDEOGRAPH-2F9AF*/
- RTUNI_ALPHA, /* U+02f9b0: CJK COMPATIBILITY IDEOGRAPH-2F9B0*/
- RTUNI_ALPHA, /* U+02f9b1: CJK COMPATIBILITY IDEOGRAPH-2F9B1*/
- RTUNI_ALPHA, /* U+02f9b2: CJK COMPATIBILITY IDEOGRAPH-2F9B2*/
- RTUNI_ALPHA, /* U+02f9b3: CJK COMPATIBILITY IDEOGRAPH-2F9B3*/
- RTUNI_ALPHA, /* U+02f9b4: CJK COMPATIBILITY IDEOGRAPH-2F9B4*/
- RTUNI_ALPHA, /* U+02f9b5: CJK COMPATIBILITY IDEOGRAPH-2F9B5*/
- RTUNI_ALPHA, /* U+02f9b6: CJK COMPATIBILITY IDEOGRAPH-2F9B6*/
- RTUNI_ALPHA, /* U+02f9b7: CJK COMPATIBILITY IDEOGRAPH-2F9B7*/
- RTUNI_ALPHA, /* U+02f9b8: CJK COMPATIBILITY IDEOGRAPH-2F9B8*/
- RTUNI_ALPHA, /* U+02f9b9: CJK COMPATIBILITY IDEOGRAPH-2F9B9*/
- RTUNI_ALPHA, /* U+02f9ba: CJK COMPATIBILITY IDEOGRAPH-2F9BA*/
- RTUNI_ALPHA, /* U+02f9bb: CJK COMPATIBILITY IDEOGRAPH-2F9BB*/
- RTUNI_ALPHA, /* U+02f9bc: CJK COMPATIBILITY IDEOGRAPH-2F9BC*/
- RTUNI_ALPHA, /* U+02f9bd: CJK COMPATIBILITY IDEOGRAPH-2F9BD*/
- RTUNI_ALPHA, /* U+02f9be: CJK COMPATIBILITY IDEOGRAPH-2F9BE*/
- RTUNI_ALPHA, /* U+02f9bf: CJK COMPATIBILITY IDEOGRAPH-2F9BF*/
- RTUNI_ALPHA, /* U+02f9c0: CJK COMPATIBILITY IDEOGRAPH-2F9C0*/
- RTUNI_ALPHA, /* U+02f9c1: CJK COMPATIBILITY IDEOGRAPH-2F9C1*/
- RTUNI_ALPHA, /* U+02f9c2: CJK COMPATIBILITY IDEOGRAPH-2F9C2*/
- RTUNI_ALPHA, /* U+02f9c3: CJK COMPATIBILITY IDEOGRAPH-2F9C3*/
- RTUNI_ALPHA, /* U+02f9c4: CJK COMPATIBILITY IDEOGRAPH-2F9C4*/
- RTUNI_ALPHA, /* U+02f9c5: CJK COMPATIBILITY IDEOGRAPH-2F9C5*/
- RTUNI_ALPHA, /* U+02f9c6: CJK COMPATIBILITY IDEOGRAPH-2F9C6*/
- RTUNI_ALPHA, /* U+02f9c7: CJK COMPATIBILITY IDEOGRAPH-2F9C7*/
- RTUNI_ALPHA, /* U+02f9c8: CJK COMPATIBILITY IDEOGRAPH-2F9C8*/
- RTUNI_ALPHA, /* U+02f9c9: CJK COMPATIBILITY IDEOGRAPH-2F9C9*/
- RTUNI_ALPHA, /* U+02f9ca: CJK COMPATIBILITY IDEOGRAPH-2F9CA*/
- RTUNI_ALPHA, /* U+02f9cb: CJK COMPATIBILITY IDEOGRAPH-2F9CB*/
- RTUNI_ALPHA, /* U+02f9cc: CJK COMPATIBILITY IDEOGRAPH-2F9CC*/
- RTUNI_ALPHA, /* U+02f9cd: CJK COMPATIBILITY IDEOGRAPH-2F9CD*/
- RTUNI_ALPHA, /* U+02f9ce: CJK COMPATIBILITY IDEOGRAPH-2F9CE*/
- RTUNI_ALPHA, /* U+02f9cf: CJK COMPATIBILITY IDEOGRAPH-2F9CF*/
- RTUNI_ALPHA, /* U+02f9d0: CJK COMPATIBILITY IDEOGRAPH-2F9D0*/
- RTUNI_ALPHA, /* U+02f9d1: CJK COMPATIBILITY IDEOGRAPH-2F9D1*/
- RTUNI_ALPHA, /* U+02f9d2: CJK COMPATIBILITY IDEOGRAPH-2F9D2*/
- RTUNI_ALPHA, /* U+02f9d3: CJK COMPATIBILITY IDEOGRAPH-2F9D3*/
- RTUNI_ALPHA, /* U+02f9d4: CJK COMPATIBILITY IDEOGRAPH-2F9D4*/
- RTUNI_ALPHA, /* U+02f9d5: CJK COMPATIBILITY IDEOGRAPH-2F9D5*/
- RTUNI_ALPHA, /* U+02f9d6: CJK COMPATIBILITY IDEOGRAPH-2F9D6*/
- RTUNI_ALPHA, /* U+02f9d7: CJK COMPATIBILITY IDEOGRAPH-2F9D7*/
- RTUNI_ALPHA, /* U+02f9d8: CJK COMPATIBILITY IDEOGRAPH-2F9D8*/
- RTUNI_ALPHA, /* U+02f9d9: CJK COMPATIBILITY IDEOGRAPH-2F9D9*/
- RTUNI_ALPHA, /* U+02f9da: CJK COMPATIBILITY IDEOGRAPH-2F9DA*/
- RTUNI_ALPHA, /* U+02f9db: CJK COMPATIBILITY IDEOGRAPH-2F9DB*/
- RTUNI_ALPHA, /* U+02f9dc: CJK COMPATIBILITY IDEOGRAPH-2F9DC*/
- RTUNI_ALPHA, /* U+02f9dd: CJK COMPATIBILITY IDEOGRAPH-2F9DD*/
- RTUNI_ALPHA, /* U+02f9de: CJK COMPATIBILITY IDEOGRAPH-2F9DE*/
- RTUNI_ALPHA, /* U+02f9df: CJK COMPATIBILITY IDEOGRAPH-2F9DF*/
- RTUNI_ALPHA, /* U+02f9e0: CJK COMPATIBILITY IDEOGRAPH-2F9E0*/
- RTUNI_ALPHA, /* U+02f9e1: CJK COMPATIBILITY IDEOGRAPH-2F9E1*/
- RTUNI_ALPHA, /* U+02f9e2: CJK COMPATIBILITY IDEOGRAPH-2F9E2*/
- RTUNI_ALPHA, /* U+02f9e3: CJK COMPATIBILITY IDEOGRAPH-2F9E3*/
- RTUNI_ALPHA, /* U+02f9e4: CJK COMPATIBILITY IDEOGRAPH-2F9E4*/
- RTUNI_ALPHA, /* U+02f9e5: CJK COMPATIBILITY IDEOGRAPH-2F9E5*/
- RTUNI_ALPHA, /* U+02f9e6: CJK COMPATIBILITY IDEOGRAPH-2F9E6*/
- RTUNI_ALPHA, /* U+02f9e7: CJK COMPATIBILITY IDEOGRAPH-2F9E7*/
- RTUNI_ALPHA, /* U+02f9e8: CJK COMPATIBILITY IDEOGRAPH-2F9E8*/
- RTUNI_ALPHA, /* U+02f9e9: CJK COMPATIBILITY IDEOGRAPH-2F9E9*/
- RTUNI_ALPHA, /* U+02f9ea: CJK COMPATIBILITY IDEOGRAPH-2F9EA*/
- RTUNI_ALPHA, /* U+02f9eb: CJK COMPATIBILITY IDEOGRAPH-2F9EB*/
- RTUNI_ALPHA, /* U+02f9ec: CJK COMPATIBILITY IDEOGRAPH-2F9EC*/
- RTUNI_ALPHA, /* U+02f9ed: CJK COMPATIBILITY IDEOGRAPH-2F9ED*/
- RTUNI_ALPHA, /* U+02f9ee: CJK COMPATIBILITY IDEOGRAPH-2F9EE*/
- RTUNI_ALPHA, /* U+02f9ef: CJK COMPATIBILITY IDEOGRAPH-2F9EF*/
- RTUNI_ALPHA, /* U+02f9f0: CJK COMPATIBILITY IDEOGRAPH-2F9F0*/
- RTUNI_ALPHA, /* U+02f9f1: CJK COMPATIBILITY IDEOGRAPH-2F9F1*/
- RTUNI_ALPHA, /* U+02f9f2: CJK COMPATIBILITY IDEOGRAPH-2F9F2*/
- RTUNI_ALPHA, /* U+02f9f3: CJK COMPATIBILITY IDEOGRAPH-2F9F3*/
- RTUNI_ALPHA, /* U+02f9f4: CJK COMPATIBILITY IDEOGRAPH-2F9F4*/
- RTUNI_ALPHA, /* U+02f9f5: CJK COMPATIBILITY IDEOGRAPH-2F9F5*/
- RTUNI_ALPHA, /* U+02f9f6: CJK COMPATIBILITY IDEOGRAPH-2F9F6*/
- RTUNI_ALPHA, /* U+02f9f7: CJK COMPATIBILITY IDEOGRAPH-2F9F7*/
- RTUNI_ALPHA, /* U+02f9f8: CJK COMPATIBILITY IDEOGRAPH-2F9F8*/
- RTUNI_ALPHA, /* U+02f9f9: CJK COMPATIBILITY IDEOGRAPH-2F9F9*/
- RTUNI_ALPHA, /* U+02f9fa: CJK COMPATIBILITY IDEOGRAPH-2F9FA*/
- RTUNI_ALPHA, /* U+02f9fb: CJK COMPATIBILITY IDEOGRAPH-2F9FB*/
- RTUNI_ALPHA, /* U+02f9fc: CJK COMPATIBILITY IDEOGRAPH-2F9FC*/
- RTUNI_ALPHA, /* U+02f9fd: CJK COMPATIBILITY IDEOGRAPH-2F9FD*/
- RTUNI_ALPHA, /* U+02f9fe: CJK COMPATIBILITY IDEOGRAPH-2F9FE*/
- RTUNI_ALPHA, /* U+02f9ff: CJK COMPATIBILITY IDEOGRAPH-2F9FF*/
- RTUNI_ALPHA, /* U+02fa00: CJK COMPATIBILITY IDEOGRAPH-2FA00*/
- RTUNI_ALPHA, /* U+02fa01: CJK COMPATIBILITY IDEOGRAPH-2FA01*/
- RTUNI_ALPHA, /* U+02fa02: CJK COMPATIBILITY IDEOGRAPH-2FA02*/
- RTUNI_ALPHA, /* U+02fa03: CJK COMPATIBILITY IDEOGRAPH-2FA03*/
- RTUNI_ALPHA, /* U+02fa04: CJK COMPATIBILITY IDEOGRAPH-2FA04*/
- RTUNI_ALPHA, /* U+02fa05: CJK COMPATIBILITY IDEOGRAPH-2FA05*/
- RTUNI_ALPHA, /* U+02fa06: CJK COMPATIBILITY IDEOGRAPH-2FA06*/
- RTUNI_ALPHA, /* U+02fa07: CJK COMPATIBILITY IDEOGRAPH-2FA07*/
- RTUNI_ALPHA, /* U+02fa08: CJK COMPATIBILITY IDEOGRAPH-2FA08*/
- RTUNI_ALPHA, /* U+02fa09: CJK COMPATIBILITY IDEOGRAPH-2FA09*/
- RTUNI_ALPHA, /* U+02fa0a: CJK COMPATIBILITY IDEOGRAPH-2FA0A*/
- RTUNI_ALPHA, /* U+02fa0b: CJK COMPATIBILITY IDEOGRAPH-2FA0B*/
- RTUNI_ALPHA, /* U+02fa0c: CJK COMPATIBILITY IDEOGRAPH-2FA0C*/
- RTUNI_ALPHA, /* U+02fa0d: CJK COMPATIBILITY IDEOGRAPH-2FA0D*/
- RTUNI_ALPHA, /* U+02fa0e: CJK COMPATIBILITY IDEOGRAPH-2FA0E*/
- RTUNI_ALPHA, /* U+02fa0f: CJK COMPATIBILITY IDEOGRAPH-2FA0F*/
- RTUNI_ALPHA, /* U+02fa10: CJK COMPATIBILITY IDEOGRAPH-2FA10*/
- RTUNI_ALPHA, /* U+02fa11: CJK COMPATIBILITY IDEOGRAPH-2FA11*/
- RTUNI_ALPHA, /* U+02fa12: CJK COMPATIBILITY IDEOGRAPH-2FA12*/
- RTUNI_ALPHA, /* U+02fa13: CJK COMPATIBILITY IDEOGRAPH-2FA13*/
- RTUNI_ALPHA, /* U+02fa14: CJK COMPATIBILITY IDEOGRAPH-2FA14*/
- RTUNI_ALPHA, /* U+02fa15: CJK COMPATIBILITY IDEOGRAPH-2FA15*/
- RTUNI_ALPHA, /* U+02fa16: CJK COMPATIBILITY IDEOGRAPH-2FA16*/
- RTUNI_ALPHA, /* U+02fa17: CJK COMPATIBILITY IDEOGRAPH-2FA17*/
- RTUNI_ALPHA, /* U+02fa18: CJK COMPATIBILITY IDEOGRAPH-2FA18*/
- RTUNI_ALPHA, /* U+02fa19: CJK COMPATIBILITY IDEOGRAPH-2FA19*/
- RTUNI_ALPHA, /* U+02fa1a: CJK COMPATIBILITY IDEOGRAPH-2FA1A*/
- RTUNI_ALPHA, /* U+02fa1b: CJK COMPATIBILITY IDEOGRAPH-2FA1B*/
- RTUNI_ALPHA, /* U+02fa1c: CJK COMPATIBILITY IDEOGRAPH-2FA1C*/
- RTUNI_ALPHA, /* U+02fa1d: CJK COMPATIBILITY IDEOGRAPH-2FA1D*/
-};
-
-
-const RTUNIFLAGSRANGE g_aRTUniFlagsRanges[] =
-{
- { 0x000000, 0x003401, &g_afRTUniFlags0x000000[0] },
- { 0x004db5, 0x004e01, &g_afRTUniFlags0x004db5[0] },
- { 0x009fbb, 0x00ac01, &g_afRTUniFlags0x009fbb[0] },
- { 0x00d7a3, 0x00d7a4, &g_afRTUniFlags0x00d7a3[0] },
- { 0x00f900, 0x010a34, &g_afRTUniFlags0x00f900[0] },
- { 0x01d400, 0x01d800, &g_afRTUniFlags0x01d400[0] },
- { 0x020000, 0x020001, &g_afRTUniFlags0x020000[0] },
- { 0x02a6d6, 0x02a6d7, &g_afRTUniFlags0x02a6d6[0] },
- { 0x02f800, 0x02fa1e, &g_afRTUniFlags0x02f800[0] },
- { ~(RTUNICP)0, ~(RTUNICP)0, NULL }
-};
-
-
-static const RTUNICP g_afRTUniUpper0x000000[] =
-{
- 0x00, /* U+000000: <control>*/
- 0x01, /* U+000001: <control>*/
- 0x02, /* U+000002: <control>*/
- 0x03, /* U+000003: <control>*/
- 0x04, /* U+000004: <control>*/
- 0x05, /* U+000005: <control>*/
- 0x06, /* U+000006: <control>*/
- 0x07, /* U+000007: <control>*/
- 0x08, /* U+000008: <control>*/
- 0x09, /* U+000009: <control>*/
- 0x0a, /* U+00000a: <control>*/
- 0x0b, /* U+00000b: <control>*/
- 0x0c, /* U+00000c: <control>*/
- 0x0d, /* U+00000d: <control>*/
- 0x0e, /* U+00000e: <control>*/
- 0x0f, /* U+00000f: <control>*/
- 0x10, /* U+000010: <control>*/
- 0x11, /* U+000011: <control>*/
- 0x12, /* U+000012: <control>*/
- 0x13, /* U+000013: <control>*/
- 0x14, /* U+000014: <control>*/
- 0x15, /* U+000015: <control>*/
- 0x16, /* U+000016: <control>*/
- 0x17, /* U+000017: <control>*/
- 0x18, /* U+000018: <control>*/
- 0x19, /* U+000019: <control>*/
- 0x1a, /* U+00001a: <control>*/
- 0x1b, /* U+00001b: <control>*/
- 0x1c, /* U+00001c: <control>*/
- 0x1d, /* U+00001d: <control>*/
- 0x1e, /* U+00001e: <control>*/
- 0x1f, /* U+00001f: <control>*/
- 0x20, /* U+000020: SPACE*/
- 0x21, /* U+000021: EXCLAMATION MARK*/
- 0x22, /* U+000022: QUOTATION MARK*/
- 0x23, /* U+000023: NUMBER SIGN*/
- 0x24, /* U+000024: DOLLAR SIGN*/
- 0x25, /* U+000025: PERCENT SIGN*/
- 0x26, /* U+000026: AMPERSAND*/
- 0x27, /* U+000027: APOSTROPHE*/
- 0x28, /* U+000028: LEFT PARENTHESIS*/
- 0x29, /* U+000029: RIGHT PARENTHESIS*/
- 0x2a, /* U+00002a: ASTERISK*/
- 0x2b, /* U+00002b: PLUS SIGN*/
- 0x2c, /* U+00002c: COMMA*/
- 0x2d, /* U+00002d: HYPHEN-MINUS*/
- 0x2e, /* U+00002e: FULL STOP*/
- 0x2f, /* U+00002f: SOLIDUS*/
- 0x30, /* U+000030: DIGIT ZERO*/
- 0x31, /* U+000031: DIGIT ONE*/
- 0x32, /* U+000032: DIGIT TWO*/
- 0x33, /* U+000033: DIGIT THREE*/
- 0x34, /* U+000034: DIGIT FOUR*/
- 0x35, /* U+000035: DIGIT FIVE*/
- 0x36, /* U+000036: DIGIT SIX*/
- 0x37, /* U+000037: DIGIT SEVEN*/
- 0x38, /* U+000038: DIGIT EIGHT*/
- 0x39, /* U+000039: DIGIT NINE*/
- 0x3a, /* U+00003a: COLON*/
- 0x3b, /* U+00003b: SEMICOLON*/
- 0x3c, /* U+00003c: LESS-THAN SIGN*/
- 0x3d, /* U+00003d: EQUALS SIGN*/
- 0x3e, /* U+00003e: GREATER-THAN SIGN*/
- 0x3f, /* U+00003f: QUESTION MARK*/
- 0x40, /* U+000040: COMMERCIAL AT*/
- 0x41, /* U+000041: LATIN CAPITAL LETTER A*/
- 0x42, /* U+000042: LATIN CAPITAL LETTER B*/
- 0x43, /* U+000043: LATIN CAPITAL LETTER C*/
- 0x44, /* U+000044: LATIN CAPITAL LETTER D*/
- 0x45, /* U+000045: LATIN CAPITAL LETTER E*/
- 0x46, /* U+000046: LATIN CAPITAL LETTER F*/
- 0x47, /* U+000047: LATIN CAPITAL LETTER G*/
- 0x48, /* U+000048: LATIN CAPITAL LETTER H*/
- 0x49, /* U+000049: LATIN CAPITAL LETTER I*/
- 0x4a, /* U+00004a: LATIN CAPITAL LETTER J*/
- 0x4b, /* U+00004b: LATIN CAPITAL LETTER K*/
- 0x4c, /* U+00004c: LATIN CAPITAL LETTER L*/
- 0x4d, /* U+00004d: LATIN CAPITAL LETTER M*/
- 0x4e, /* U+00004e: LATIN CAPITAL LETTER N*/
- 0x4f, /* U+00004f: LATIN CAPITAL LETTER O*/
- 0x50, /* U+000050: LATIN CAPITAL LETTER P*/
- 0x51, /* U+000051: LATIN CAPITAL LETTER Q*/
- 0x52, /* U+000052: LATIN CAPITAL LETTER R*/
- 0x53, /* U+000053: LATIN CAPITAL LETTER S*/
- 0x54, /* U+000054: LATIN CAPITAL LETTER T*/
- 0x55, /* U+000055: LATIN CAPITAL LETTER U*/
- 0x56, /* U+000056: LATIN CAPITAL LETTER V*/
- 0x57, /* U+000057: LATIN CAPITAL LETTER W*/
- 0x58, /* U+000058: LATIN CAPITAL LETTER X*/
- 0x59, /* U+000059: LATIN CAPITAL LETTER Y*/
- 0x5a, /* U+00005a: LATIN CAPITAL LETTER Z*/
- 0x5b, /* U+00005b: LEFT SQUARE BRACKET*/
- 0x5c, /* U+00005c: REVERSE SOLIDUS*/
- 0x5d, /* U+00005d: RIGHT SQUARE BRACKET*/
- 0x5e, /* U+00005e: CIRCUMFLEX ACCENT*/
- 0x5f, /* U+00005f: LOW LINE*/
- 0x60, /* U+000060: GRAVE ACCENT*/
- 0x41, /* U+000061: LATIN SMALL LETTER A*/
- 0x42, /* U+000062: LATIN SMALL LETTER B*/
- 0x43, /* U+000063: LATIN SMALL LETTER C*/
- 0x44, /* U+000064: LATIN SMALL LETTER D*/
- 0x45, /* U+000065: LATIN SMALL LETTER E*/
- 0x46, /* U+000066: LATIN SMALL LETTER F*/
- 0x47, /* U+000067: LATIN SMALL LETTER G*/
- 0x48, /* U+000068: LATIN SMALL LETTER H*/
- 0x49, /* U+000069: LATIN SMALL LETTER I*/
- 0x4a, /* U+00006a: LATIN SMALL LETTER J*/
- 0x4b, /* U+00006b: LATIN SMALL LETTER K*/
- 0x4c, /* U+00006c: LATIN SMALL LETTER L*/
- 0x4d, /* U+00006d: LATIN SMALL LETTER M*/
- 0x4e, /* U+00006e: LATIN SMALL LETTER N*/
- 0x4f, /* U+00006f: LATIN SMALL LETTER O*/
- 0x50, /* U+000070: LATIN SMALL LETTER P*/
- 0x51, /* U+000071: LATIN SMALL LETTER Q*/
- 0x52, /* U+000072: LATIN SMALL LETTER R*/
- 0x53, /* U+000073: LATIN SMALL LETTER S*/
- 0x54, /* U+000074: LATIN SMALL LETTER T*/
- 0x55, /* U+000075: LATIN SMALL LETTER U*/
- 0x56, /* U+000076: LATIN SMALL LETTER V*/
- 0x57, /* U+000077: LATIN SMALL LETTER W*/
- 0x58, /* U+000078: LATIN SMALL LETTER X*/
- 0x59, /* U+000079: LATIN SMALL LETTER Y*/
- 0x5a, /* U+00007a: LATIN SMALL LETTER Z*/
- 0x7b, /* U+00007b: LEFT CURLY BRACKET*/
- 0x7c, /* U+00007c: VERTICAL LINE*/
- 0x7d, /* U+00007d: RIGHT CURLY BRACKET*/
- 0x7e, /* U+00007e: TILDE*/
- 0x7f, /* U+00007f: <control>*/
- 0x80, /* U+000080: <control>*/
- 0x81, /* U+000081: <control>*/
- 0x82, /* U+000082: <control>*/
- 0x83, /* U+000083: <control>*/
- 0x84, /* U+000084: <control>*/
- 0x85, /* U+000085: <control>*/
- 0x86, /* U+000086: <control>*/
- 0x87, /* U+000087: <control>*/
- 0x88, /* U+000088: <control>*/
- 0x89, /* U+000089: <control>*/
- 0x8a, /* U+00008a: <control>*/
- 0x8b, /* U+00008b: <control>*/
- 0x8c, /* U+00008c: <control>*/
- 0x8d, /* U+00008d: <control>*/
- 0x8e, /* U+00008e: <control>*/
- 0x8f, /* U+00008f: <control>*/
- 0x90, /* U+000090: <control>*/
- 0x91, /* U+000091: <control>*/
- 0x92, /* U+000092: <control>*/
- 0x93, /* U+000093: <control>*/
- 0x94, /* U+000094: <control>*/
- 0x95, /* U+000095: <control>*/
- 0x96, /* U+000096: <control>*/
- 0x97, /* U+000097: <control>*/
- 0x98, /* U+000098: <control>*/
- 0x99, /* U+000099: <control>*/
- 0x9a, /* U+00009a: <control>*/
- 0x9b, /* U+00009b: <control>*/
- 0x9c, /* U+00009c: <control>*/
- 0x9d, /* U+00009d: <control>*/
- 0x9e, /* U+00009e: <control>*/
- 0x9f, /* U+00009f: <control>*/
- 0xa0, /* U+0000a0: NO-BREAK SPACE*/
- 0xa1, /* U+0000a1: INVERTED EXCLAMATION MARK*/
- 0xa2, /* U+0000a2: CENT SIGN*/
- 0xa3, /* U+0000a3: POUND SIGN*/
- 0xa4, /* U+0000a4: CURRENCY SIGN*/
- 0xa5, /* U+0000a5: YEN SIGN*/
- 0xa6, /* U+0000a6: BROKEN BAR*/
- 0xa7, /* U+0000a7: SECTION SIGN*/
- 0xa8, /* U+0000a8: DIAERESIS*/
- 0xa9, /* U+0000a9: COPYRIGHT SIGN*/
- 0xaa, /* U+0000aa: FEMININE ORDINAL INDICATOR*/
- 0xab, /* U+0000ab: LEFT-POINTING DOUBLE ANGLE QUOTATION MARK*/
- 0xac, /* U+0000ac: NOT SIGN*/
- 0xad, /* U+0000ad: SOFT HYPHEN*/
- 0xae, /* U+0000ae: REGISTERED SIGN*/
- 0xaf, /* U+0000af: MACRON*/
- 0xb0, /* U+0000b0: DEGREE SIGN*/
- 0xb1, /* U+0000b1: PLUS-MINUS SIGN*/
- 0xb2, /* U+0000b2: SUPERSCRIPT TWO*/
- 0xb3, /* U+0000b3: SUPERSCRIPT THREE*/
- 0xb4, /* U+0000b4: ACUTE ACCENT*/
- 0x39c, /* U+0000b5: MICRO SIGN*/
- 0xb6, /* U+0000b6: PILCROW SIGN*/
- 0xb7, /* U+0000b7: MIDDLE DOT*/
- 0xb8, /* U+0000b8: CEDILLA*/
- 0xb9, /* U+0000b9: SUPERSCRIPT ONE*/
- 0xba, /* U+0000ba: MASCULINE ORDINAL INDICATOR*/
- 0xbb, /* U+0000bb: RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK*/
- 0xbc, /* U+0000bc: VULGAR FRACTION ONE QUARTER*/
- 0xbd, /* U+0000bd: VULGAR FRACTION ONE HALF*/
- 0xbe, /* U+0000be: VULGAR FRACTION THREE QUARTERS*/
- 0xbf, /* U+0000bf: INVERTED QUESTION MARK*/
- 0xc0, /* U+0000c0: LATIN CAPITAL LETTER A WITH GRAVE*/
- 0xc1, /* U+0000c1: LATIN CAPITAL LETTER A WITH ACUTE*/
- 0xc2, /* U+0000c2: LATIN CAPITAL LETTER A WITH CIRCUMFLEX*/
- 0xc3, /* U+0000c3: LATIN CAPITAL LETTER A WITH TILDE*/
- 0xc4, /* U+0000c4: LATIN CAPITAL LETTER A WITH DIAERESIS*/
- 0xc5, /* U+0000c5: LATIN CAPITAL LETTER A WITH RING ABOVE*/
- 0xc6, /* U+0000c6: LATIN CAPITAL LETTER AE*/
- 0xc7, /* U+0000c7: LATIN CAPITAL LETTER C WITH CEDILLA*/
- 0xc8, /* U+0000c8: LATIN CAPITAL LETTER E WITH GRAVE*/
- 0xc9, /* U+0000c9: LATIN CAPITAL LETTER E WITH ACUTE*/
- 0xca, /* U+0000ca: LATIN CAPITAL LETTER E WITH CIRCUMFLEX*/
- 0xcb, /* U+0000cb: LATIN CAPITAL LETTER E WITH DIAERESIS*/
- 0xcc, /* U+0000cc: LATIN CAPITAL LETTER I WITH GRAVE*/
- 0xcd, /* U+0000cd: LATIN CAPITAL LETTER I WITH ACUTE*/
- 0xce, /* U+0000ce: LATIN CAPITAL LETTER I WITH CIRCUMFLEX*/
- 0xcf, /* U+0000cf: LATIN CAPITAL LETTER I WITH DIAERESIS*/
- 0xd0, /* U+0000d0: LATIN CAPITAL LETTER ETH*/
- 0xd1, /* U+0000d1: LATIN CAPITAL LETTER N WITH TILDE*/
- 0xd2, /* U+0000d2: LATIN CAPITAL LETTER O WITH GRAVE*/
- 0xd3, /* U+0000d3: LATIN CAPITAL LETTER O WITH ACUTE*/
- 0xd4, /* U+0000d4: LATIN CAPITAL LETTER O WITH CIRCUMFLEX*/
- 0xd5, /* U+0000d5: LATIN CAPITAL LETTER O WITH TILDE*/
- 0xd6, /* U+0000d6: LATIN CAPITAL LETTER O WITH DIAERESIS*/
- 0xd7, /* U+0000d7: MULTIPLICATION SIGN*/
- 0xd8, /* U+0000d8: LATIN CAPITAL LETTER O WITH STROKE*/
- 0xd9, /* U+0000d9: LATIN CAPITAL LETTER U WITH GRAVE*/
- 0xda, /* U+0000da: LATIN CAPITAL LETTER U WITH ACUTE*/
- 0xdb, /* U+0000db: LATIN CAPITAL LETTER U WITH CIRCUMFLEX*/
- 0xdc, /* U+0000dc: LATIN CAPITAL LETTER U WITH DIAERESIS*/
- 0xdd, /* U+0000dd: LATIN CAPITAL LETTER Y WITH ACUTE*/
- 0xde, /* U+0000de: LATIN CAPITAL LETTER THORN*/
- 0xdf, /* U+0000df: LATIN SMALL LETTER SHARP S*/
- 0xc0, /* U+0000e0: LATIN SMALL LETTER A WITH GRAVE*/
- 0xc1, /* U+0000e1: LATIN SMALL LETTER A WITH ACUTE*/
- 0xc2, /* U+0000e2: LATIN SMALL LETTER A WITH CIRCUMFLEX*/
- 0xc3, /* U+0000e3: LATIN SMALL LETTER A WITH TILDE*/
- 0xc4, /* U+0000e4: LATIN SMALL LETTER A WITH DIAERESIS*/
- 0xc5, /* U+0000e5: LATIN SMALL LETTER A WITH RING ABOVE*/
- 0xc6, /* U+0000e6: LATIN SMALL LETTER AE*/
- 0xc7, /* U+0000e7: LATIN SMALL LETTER C WITH CEDILLA*/
- 0xc8, /* U+0000e8: LATIN SMALL LETTER E WITH GRAVE*/
- 0xc9, /* U+0000e9: LATIN SMALL LETTER E WITH ACUTE*/
- 0xca, /* U+0000ea: LATIN SMALL LETTER E WITH CIRCUMFLEX*/
- 0xcb, /* U+0000eb: LATIN SMALL LETTER E WITH DIAERESIS*/
- 0xcc, /* U+0000ec: LATIN SMALL LETTER I WITH GRAVE*/
- 0xcd, /* U+0000ed: LATIN SMALL LETTER I WITH ACUTE*/
- 0xce, /* U+0000ee: LATIN SMALL LETTER I WITH CIRCUMFLEX*/
- 0xcf, /* U+0000ef: LATIN SMALL LETTER I WITH DIAERESIS*/
- 0xd0, /* U+0000f0: LATIN SMALL LETTER ETH*/
- 0xd1, /* U+0000f1: LATIN SMALL LETTER N WITH TILDE*/
- 0xd2, /* U+0000f2: LATIN SMALL LETTER O WITH GRAVE*/
- 0xd3, /* U+0000f3: LATIN SMALL LETTER O WITH ACUTE*/
- 0xd4, /* U+0000f4: LATIN SMALL LETTER O WITH CIRCUMFLEX*/
- 0xd5, /* U+0000f5: LATIN SMALL LETTER O WITH TILDE*/
- 0xd6, /* U+0000f6: LATIN SMALL LETTER O WITH DIAERESIS*/
- 0xf7, /* U+0000f7: DIVISION SIGN*/
- 0xd8, /* U+0000f8: LATIN SMALL LETTER O WITH STROKE*/
- 0xd9, /* U+0000f9: LATIN SMALL LETTER U WITH GRAVE*/
- 0xda, /* U+0000fa: LATIN SMALL LETTER U WITH ACUTE*/
- 0xdb, /* U+0000fb: LATIN SMALL LETTER U WITH CIRCUMFLEX*/
- 0xdc, /* U+0000fc: LATIN SMALL LETTER U WITH DIAERESIS*/
- 0xdd, /* U+0000fd: LATIN SMALL LETTER Y WITH ACUTE*/
- 0xde, /* U+0000fe: LATIN SMALL LETTER THORN*/
- 0x178, /* U+0000ff: LATIN SMALL LETTER Y WITH DIAERESIS*/
- 0x100, /* U+000100: LATIN CAPITAL LETTER A WITH MACRON*/
- 0x100, /* U+000101: LATIN SMALL LETTER A WITH MACRON*/
- 0x102, /* U+000102: LATIN CAPITAL LETTER A WITH BREVE*/
- 0x102, /* U+000103: LATIN SMALL LETTER A WITH BREVE*/
- 0x104, /* U+000104: LATIN CAPITAL LETTER A WITH OGONEK*/
- 0x104, /* U+000105: LATIN SMALL LETTER A WITH OGONEK*/
- 0x106, /* U+000106: LATIN CAPITAL LETTER C WITH ACUTE*/
- 0x106, /* U+000107: LATIN SMALL LETTER C WITH ACUTE*/
- 0x108, /* U+000108: LATIN CAPITAL LETTER C WITH CIRCUMFLEX*/
- 0x108, /* U+000109: LATIN SMALL LETTER C WITH CIRCUMFLEX*/
- 0x10a, /* U+00010a: LATIN CAPITAL LETTER C WITH DOT ABOVE*/
- 0x10a, /* U+00010b: LATIN SMALL LETTER C WITH DOT ABOVE*/
- 0x10c, /* U+00010c: LATIN CAPITAL LETTER C WITH CARON*/
- 0x10c, /* U+00010d: LATIN SMALL LETTER C WITH CARON*/
- 0x10e, /* U+00010e: LATIN CAPITAL LETTER D WITH CARON*/
- 0x10e, /* U+00010f: LATIN SMALL LETTER D WITH CARON*/
- 0x110, /* U+000110: LATIN CAPITAL LETTER D WITH STROKE*/
- 0x110, /* U+000111: LATIN SMALL LETTER D WITH STROKE*/
- 0x112, /* U+000112: LATIN CAPITAL LETTER E WITH MACRON*/
- 0x112, /* U+000113: LATIN SMALL LETTER E WITH MACRON*/
- 0x114, /* U+000114: LATIN CAPITAL LETTER E WITH BREVE*/
- 0x114, /* U+000115: LATIN SMALL LETTER E WITH BREVE*/
- 0x116, /* U+000116: LATIN CAPITAL LETTER E WITH DOT ABOVE*/
- 0x116, /* U+000117: LATIN SMALL LETTER E WITH DOT ABOVE*/
- 0x118, /* U+000118: LATIN CAPITAL LETTER E WITH OGONEK*/
- 0x118, /* U+000119: LATIN SMALL LETTER E WITH OGONEK*/
- 0x11a, /* U+00011a: LATIN CAPITAL LETTER E WITH CARON*/
- 0x11a, /* U+00011b: LATIN SMALL LETTER E WITH CARON*/
- 0x11c, /* U+00011c: LATIN CAPITAL LETTER G WITH CIRCUMFLEX*/
- 0x11c, /* U+00011d: LATIN SMALL LETTER G WITH CIRCUMFLEX*/
- 0x11e, /* U+00011e: LATIN CAPITAL LETTER G WITH BREVE*/
- 0x11e, /* U+00011f: LATIN SMALL LETTER G WITH BREVE*/
- 0x120, /* U+000120: LATIN CAPITAL LETTER G WITH DOT ABOVE*/
- 0x120, /* U+000121: LATIN SMALL LETTER G WITH DOT ABOVE*/
- 0x122, /* U+000122: LATIN CAPITAL LETTER G WITH CEDILLA*/
- 0x122, /* U+000123: LATIN SMALL LETTER G WITH CEDILLA*/
- 0x124, /* U+000124: LATIN CAPITAL LETTER H WITH CIRCUMFLEX*/
- 0x124, /* U+000125: LATIN SMALL LETTER H WITH CIRCUMFLEX*/
- 0x126, /* U+000126: LATIN CAPITAL LETTER H WITH STROKE*/
- 0x126, /* U+000127: LATIN SMALL LETTER H WITH STROKE*/
- 0x128, /* U+000128: LATIN CAPITAL LETTER I WITH TILDE*/
- 0x128, /* U+000129: LATIN SMALL LETTER I WITH TILDE*/
- 0x12a, /* U+00012a: LATIN CAPITAL LETTER I WITH MACRON*/
- 0x12a, /* U+00012b: LATIN SMALL LETTER I WITH MACRON*/
- 0x12c, /* U+00012c: LATIN CAPITAL LETTER I WITH BREVE*/
- 0x12c, /* U+00012d: LATIN SMALL LETTER I WITH BREVE*/
- 0x12e, /* U+00012e: LATIN CAPITAL LETTER I WITH OGONEK*/
- 0x12e, /* U+00012f: LATIN SMALL LETTER I WITH OGONEK*/
- 0x130, /* U+000130: LATIN CAPITAL LETTER I WITH DOT ABOVE*/
- 0x49, /* U+000131: LATIN SMALL LETTER DOTLESS I*/
- 0x132, /* U+000132: LATIN CAPITAL LIGATURE IJ*/
- 0x132, /* U+000133: LATIN SMALL LIGATURE IJ*/
- 0x134, /* U+000134: LATIN CAPITAL LETTER J WITH CIRCUMFLEX*/
- 0x134, /* U+000135: LATIN SMALL LETTER J WITH CIRCUMFLEX*/
- 0x136, /* U+000136: LATIN CAPITAL LETTER K WITH CEDILLA*/
- 0x136, /* U+000137: LATIN SMALL LETTER K WITH CEDILLA*/
- 0x138, /* U+000138: LATIN SMALL LETTER KRA*/
- 0x139, /* U+000139: LATIN CAPITAL LETTER L WITH ACUTE*/
- 0x139, /* U+00013a: LATIN SMALL LETTER L WITH ACUTE*/
- 0x13b, /* U+00013b: LATIN CAPITAL LETTER L WITH CEDILLA*/
- 0x13b, /* U+00013c: LATIN SMALL LETTER L WITH CEDILLA*/
- 0x13d, /* U+00013d: LATIN CAPITAL LETTER L WITH CARON*/
- 0x13d, /* U+00013e: LATIN SMALL LETTER L WITH CARON*/
- 0x13f, /* U+00013f: LATIN CAPITAL LETTER L WITH MIDDLE DOT*/
- 0x13f, /* U+000140: LATIN SMALL LETTER L WITH MIDDLE DOT*/
- 0x141, /* U+000141: LATIN CAPITAL LETTER L WITH STROKE*/
- 0x141, /* U+000142: LATIN SMALL LETTER L WITH STROKE*/
- 0x143, /* U+000143: LATIN CAPITAL LETTER N WITH ACUTE*/
- 0x143, /* U+000144: LATIN SMALL LETTER N WITH ACUTE*/
- 0x145, /* U+000145: LATIN CAPITAL LETTER N WITH CEDILLA*/
- 0x145, /* U+000146: LATIN SMALL LETTER N WITH CEDILLA*/
- 0x147, /* U+000147: LATIN CAPITAL LETTER N WITH CARON*/
- 0x147, /* U+000148: LATIN SMALL LETTER N WITH CARON*/
- 0x149, /* U+000149: LATIN SMALL LETTER N PRECEDED BY APOSTROPHE*/
- 0x14a, /* U+00014a: LATIN CAPITAL LETTER ENG*/
- 0x14a, /* U+00014b: LATIN SMALL LETTER ENG*/
- 0x14c, /* U+00014c: LATIN CAPITAL LETTER O WITH MACRON*/
- 0x14c, /* U+00014d: LATIN SMALL LETTER O WITH MACRON*/
- 0x14e, /* U+00014e: LATIN CAPITAL LETTER O WITH BREVE*/
- 0x14e, /* U+00014f: LATIN SMALL LETTER O WITH BREVE*/
- 0x150, /* U+000150: LATIN CAPITAL LETTER O WITH DOUBLE ACUTE*/
- 0x150, /* U+000151: LATIN SMALL LETTER O WITH DOUBLE ACUTE*/
- 0x152, /* U+000152: LATIN CAPITAL LIGATURE OE*/
- 0x152, /* U+000153: LATIN SMALL LIGATURE OE*/
- 0x154, /* U+000154: LATIN CAPITAL LETTER R WITH ACUTE*/
- 0x154, /* U+000155: LATIN SMALL LETTER R WITH ACUTE*/
- 0x156, /* U+000156: LATIN CAPITAL LETTER R WITH CEDILLA*/
- 0x156, /* U+000157: LATIN SMALL LETTER R WITH CEDILLA*/
- 0x158, /* U+000158: LATIN CAPITAL LETTER R WITH CARON*/
- 0x158, /* U+000159: LATIN SMALL LETTER R WITH CARON*/
- 0x15a, /* U+00015a: LATIN CAPITAL LETTER S WITH ACUTE*/
- 0x15a, /* U+00015b: LATIN SMALL LETTER S WITH ACUTE*/
- 0x15c, /* U+00015c: LATIN CAPITAL LETTER S WITH CIRCUMFLEX*/
- 0x15c, /* U+00015d: LATIN SMALL LETTER S WITH CIRCUMFLEX*/
- 0x15e, /* U+00015e: LATIN CAPITAL LETTER S WITH CEDILLA*/
- 0x15e, /* U+00015f: LATIN SMALL LETTER S WITH CEDILLA*/
- 0x160, /* U+000160: LATIN CAPITAL LETTER S WITH CARON*/
- 0x160, /* U+000161: LATIN SMALL LETTER S WITH CARON*/
- 0x162, /* U+000162: LATIN CAPITAL LETTER T WITH CEDILLA*/
- 0x162, /* U+000163: LATIN SMALL LETTER T WITH CEDILLA*/
- 0x164, /* U+000164: LATIN CAPITAL LETTER T WITH CARON*/
- 0x164, /* U+000165: LATIN SMALL LETTER T WITH CARON*/
- 0x166, /* U+000166: LATIN CAPITAL LETTER T WITH STROKE*/
- 0x166, /* U+000167: LATIN SMALL LETTER T WITH STROKE*/
- 0x168, /* U+000168: LATIN CAPITAL LETTER U WITH TILDE*/
- 0x168, /* U+000169: LATIN SMALL LETTER U WITH TILDE*/
- 0x16a, /* U+00016a: LATIN CAPITAL LETTER U WITH MACRON*/
- 0x16a, /* U+00016b: LATIN SMALL LETTER U WITH MACRON*/
- 0x16c, /* U+00016c: LATIN CAPITAL LETTER U WITH BREVE*/
- 0x16c, /* U+00016d: LATIN SMALL LETTER U WITH BREVE*/
- 0x16e, /* U+00016e: LATIN CAPITAL LETTER U WITH RING ABOVE*/
- 0x16e, /* U+00016f: LATIN SMALL LETTER U WITH RING ABOVE*/
- 0x170, /* U+000170: LATIN CAPITAL LETTER U WITH DOUBLE ACUTE*/
- 0x170, /* U+000171: LATIN SMALL LETTER U WITH DOUBLE ACUTE*/
- 0x172, /* U+000172: LATIN CAPITAL LETTER U WITH OGONEK*/
- 0x172, /* U+000173: LATIN SMALL LETTER U WITH OGONEK*/
- 0x174, /* U+000174: LATIN CAPITAL LETTER W WITH CIRCUMFLEX*/
- 0x174, /* U+000175: LATIN SMALL LETTER W WITH CIRCUMFLEX*/
- 0x176, /* U+000176: LATIN CAPITAL LETTER Y WITH CIRCUMFLEX*/
- 0x176, /* U+000177: LATIN SMALL LETTER Y WITH CIRCUMFLEX*/
- 0x178, /* U+000178: LATIN CAPITAL LETTER Y WITH DIAERESIS*/
- 0x179, /* U+000179: LATIN CAPITAL LETTER Z WITH ACUTE*/
- 0x179, /* U+00017a: LATIN SMALL LETTER Z WITH ACUTE*/
- 0x17b, /* U+00017b: LATIN CAPITAL LETTER Z WITH DOT ABOVE*/
- 0x17b, /* U+00017c: LATIN SMALL LETTER Z WITH DOT ABOVE*/
- 0x17d, /* U+00017d: LATIN CAPITAL LETTER Z WITH CARON*/
- 0x17d, /* U+00017e: LATIN SMALL LETTER Z WITH CARON*/
- 0x53, /* U+00017f: LATIN SMALL LETTER LONG S*/
- 0x180, /* U+000180: LATIN SMALL LETTER B WITH STROKE*/
- 0x181, /* U+000181: LATIN CAPITAL LETTER B WITH HOOK*/
- 0x182, /* U+000182: LATIN CAPITAL LETTER B WITH TOPBAR*/
- 0x182, /* U+000183: LATIN SMALL LETTER B WITH TOPBAR*/
- 0x184, /* U+000184: LATIN CAPITAL LETTER TONE SIX*/
- 0x184, /* U+000185: LATIN SMALL LETTER TONE SIX*/
- 0x186, /* U+000186: LATIN CAPITAL LETTER OPEN O*/
- 0x187, /* U+000187: LATIN CAPITAL LETTER C WITH HOOK*/
- 0x187, /* U+000188: LATIN SMALL LETTER C WITH HOOK*/
- 0x189, /* U+000189: LATIN CAPITAL LETTER AFRICAN D*/
- 0x18a, /* U+00018a: LATIN CAPITAL LETTER D WITH HOOK*/
- 0x18b, /* U+00018b: LATIN CAPITAL LETTER D WITH TOPBAR*/
- 0x18b, /* U+00018c: LATIN SMALL LETTER D WITH TOPBAR*/
- 0x18d, /* U+00018d: LATIN SMALL LETTER TURNED DELTA*/
- 0x18e, /* U+00018e: LATIN CAPITAL LETTER REVERSED E*/
- 0x18f, /* U+00018f: LATIN CAPITAL LETTER SCHWA*/
- 0x190, /* U+000190: LATIN CAPITAL LETTER OPEN E*/
- 0x191, /* U+000191: LATIN CAPITAL LETTER F WITH HOOK*/
- 0x191, /* U+000192: LATIN SMALL LETTER F WITH HOOK*/
- 0x193, /* U+000193: LATIN CAPITAL LETTER G WITH HOOK*/
- 0x194, /* U+000194: LATIN CAPITAL LETTER GAMMA*/
- 0x1f6, /* U+000195: LATIN SMALL LETTER HV*/
- 0x196, /* U+000196: LATIN CAPITAL LETTER IOTA*/
- 0x197, /* U+000197: LATIN CAPITAL LETTER I WITH STROKE*/
- 0x198, /* U+000198: LATIN CAPITAL LETTER K WITH HOOK*/
- 0x198, /* U+000199: LATIN SMALL LETTER K WITH HOOK*/
- 0x23d, /* U+00019a: LATIN SMALL LETTER L WITH BAR*/
- 0x19b, /* U+00019b: LATIN SMALL LETTER LAMBDA WITH STROKE*/
- 0x19c, /* U+00019c: LATIN CAPITAL LETTER TURNED M*/
- 0x19d, /* U+00019d: LATIN CAPITAL LETTER N WITH LEFT HOOK*/
- 0x220, /* U+00019e: LATIN SMALL LETTER N WITH LONG RIGHT LEG*/
- 0x19f, /* U+00019f: LATIN CAPITAL LETTER O WITH MIDDLE TILDE*/
- 0x1a0, /* U+0001a0: LATIN CAPITAL LETTER O WITH HORN*/
- 0x1a0, /* U+0001a1: LATIN SMALL LETTER O WITH HORN*/
- 0x1a2, /* U+0001a2: LATIN CAPITAL LETTER OI*/
- 0x1a2, /* U+0001a3: LATIN SMALL LETTER OI*/
- 0x1a4, /* U+0001a4: LATIN CAPITAL LETTER P WITH HOOK*/
- 0x1a4, /* U+0001a5: LATIN SMALL LETTER P WITH HOOK*/
- 0x1a6, /* U+0001a6: LATIN LETTER YR*/
- 0x1a7, /* U+0001a7: LATIN CAPITAL LETTER TONE TWO*/
- 0x1a7, /* U+0001a8: LATIN SMALL LETTER TONE TWO*/
- 0x1a9, /* U+0001a9: LATIN CAPITAL LETTER ESH*/
- 0x1aa, /* U+0001aa: LATIN LETTER REVERSED ESH LOOP*/
- 0x1ab, /* U+0001ab: LATIN SMALL LETTER T WITH PALATAL HOOK*/
- 0x1ac, /* U+0001ac: LATIN CAPITAL LETTER T WITH HOOK*/
- 0x1ac, /* U+0001ad: LATIN SMALL LETTER T WITH HOOK*/
- 0x1ae, /* U+0001ae: LATIN CAPITAL LETTER T WITH RETROFLEX HOOK*/
- 0x1af, /* U+0001af: LATIN CAPITAL LETTER U WITH HORN*/
- 0x1af, /* U+0001b0: LATIN SMALL LETTER U WITH HORN*/
- 0x1b1, /* U+0001b1: LATIN CAPITAL LETTER UPSILON*/
- 0x1b2, /* U+0001b2: LATIN CAPITAL LETTER V WITH HOOK*/
- 0x1b3, /* U+0001b3: LATIN CAPITAL LETTER Y WITH HOOK*/
- 0x1b3, /* U+0001b4: LATIN SMALL LETTER Y WITH HOOK*/
- 0x1b5, /* U+0001b5: LATIN CAPITAL LETTER Z WITH STROKE*/
- 0x1b5, /* U+0001b6: LATIN SMALL LETTER Z WITH STROKE*/
- 0x1b7, /* U+0001b7: LATIN CAPITAL LETTER EZH*/
- 0x1b8, /* U+0001b8: LATIN CAPITAL LETTER EZH REVERSED*/
- 0x1b8, /* U+0001b9: LATIN SMALL LETTER EZH REVERSED*/
- 0x1ba, /* U+0001ba: LATIN SMALL LETTER EZH WITH TAIL*/
- 0x1bb, /* U+0001bb: LATIN LETTER TWO WITH STROKE*/
- 0x1bc, /* U+0001bc: LATIN CAPITAL LETTER TONE FIVE*/
- 0x1bc, /* U+0001bd: LATIN SMALL LETTER TONE FIVE*/
- 0x1be, /* U+0001be: LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE*/
- 0x1f7, /* U+0001bf: LATIN LETTER WYNN*/
- 0x1c0, /* U+0001c0: LATIN LETTER DENTAL CLICK*/
- 0x1c1, /* U+0001c1: LATIN LETTER LATERAL CLICK*/
- 0x1c2, /* U+0001c2: LATIN LETTER ALVEOLAR CLICK*/
- 0x1c3, /* U+0001c3: LATIN LETTER RETROFLEX CLICK*/
- 0x1c4, /* U+0001c4: LATIN CAPITAL LETTER DZ WITH CARON*/
- 0x1c4, /* U+0001c5: LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON*/
- 0x1c4, /* U+0001c6: LATIN SMALL LETTER DZ WITH CARON*/
- 0x1c7, /* U+0001c7: LATIN CAPITAL LETTER LJ*/
- 0x1c7, /* U+0001c8: LATIN CAPITAL LETTER L WITH SMALL LETTER J*/
- 0x1c7, /* U+0001c9: LATIN SMALL LETTER LJ*/
- 0x1ca, /* U+0001ca: LATIN CAPITAL LETTER NJ*/
- 0x1ca, /* U+0001cb: LATIN CAPITAL LETTER N WITH SMALL LETTER J*/
- 0x1ca, /* U+0001cc: LATIN SMALL LETTER NJ*/
- 0x1cd, /* U+0001cd: LATIN CAPITAL LETTER A WITH CARON*/
- 0x1cd, /* U+0001ce: LATIN SMALL LETTER A WITH CARON*/
- 0x1cf, /* U+0001cf: LATIN CAPITAL LETTER I WITH CARON*/
- 0x1cf, /* U+0001d0: LATIN SMALL LETTER I WITH CARON*/
- 0x1d1, /* U+0001d1: LATIN CAPITAL LETTER O WITH CARON*/
- 0x1d1, /* U+0001d2: LATIN SMALL LETTER O WITH CARON*/
- 0x1d3, /* U+0001d3: LATIN CAPITAL LETTER U WITH CARON*/
- 0x1d3, /* U+0001d4: LATIN SMALL LETTER U WITH CARON*/
- 0x1d5, /* U+0001d5: LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON*/
- 0x1d5, /* U+0001d6: LATIN SMALL LETTER U WITH DIAERESIS AND MACRON*/
- 0x1d7, /* U+0001d7: LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE*/
- 0x1d7, /* U+0001d8: LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE*/
- 0x1d9, /* U+0001d9: LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON*/
- 0x1d9, /* U+0001da: LATIN SMALL LETTER U WITH DIAERESIS AND CARON*/
- 0x1db, /* U+0001db: LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE*/
- 0x1db, /* U+0001dc: LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE*/
- 0x18e, /* U+0001dd: LATIN SMALL LETTER TURNED E*/
- 0x1de, /* U+0001de: LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON*/
- 0x1de, /* U+0001df: LATIN SMALL LETTER A WITH DIAERESIS AND MACRON*/
- 0x1e0, /* U+0001e0: LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON*/
- 0x1e0, /* U+0001e1: LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON*/
- 0x1e2, /* U+0001e2: LATIN CAPITAL LETTER AE WITH MACRON*/
- 0x1e2, /* U+0001e3: LATIN SMALL LETTER AE WITH MACRON*/
- 0x1e4, /* U+0001e4: LATIN CAPITAL LETTER G WITH STROKE*/
- 0x1e4, /* U+0001e5: LATIN SMALL LETTER G WITH STROKE*/
- 0x1e6, /* U+0001e6: LATIN CAPITAL LETTER G WITH CARON*/
- 0x1e6, /* U+0001e7: LATIN SMALL LETTER G WITH CARON*/
- 0x1e8, /* U+0001e8: LATIN CAPITAL LETTER K WITH CARON*/
- 0x1e8, /* U+0001e9: LATIN SMALL LETTER K WITH CARON*/
- 0x1ea, /* U+0001ea: LATIN CAPITAL LETTER O WITH OGONEK*/
- 0x1ea, /* U+0001eb: LATIN SMALL LETTER O WITH OGONEK*/
- 0x1ec, /* U+0001ec: LATIN CAPITAL LETTER O WITH OGONEK AND MACRON*/
- 0x1ec, /* U+0001ed: LATIN SMALL LETTER O WITH OGONEK AND MACRON*/
- 0x1ee, /* U+0001ee: LATIN CAPITAL LETTER EZH WITH CARON*/
- 0x1ee, /* U+0001ef: LATIN SMALL LETTER EZH WITH CARON*/
- 0x1f0, /* U+0001f0: LATIN SMALL LETTER J WITH CARON*/
- 0x1f1, /* U+0001f1: LATIN CAPITAL LETTER DZ*/
- 0x1f1, /* U+0001f2: LATIN CAPITAL LETTER D WITH SMALL LETTER Z*/
- 0x1f1, /* U+0001f3: LATIN SMALL LETTER DZ*/
- 0x1f4, /* U+0001f4: LATIN CAPITAL LETTER G WITH ACUTE*/
- 0x1f4, /* U+0001f5: LATIN SMALL LETTER G WITH ACUTE*/
- 0x1f6, /* U+0001f6: LATIN CAPITAL LETTER HWAIR*/
- 0x1f7, /* U+0001f7: LATIN CAPITAL LETTER WYNN*/
- 0x1f8, /* U+0001f8: LATIN CAPITAL LETTER N WITH GRAVE*/
- 0x1f8, /* U+0001f9: LATIN SMALL LETTER N WITH GRAVE*/
- 0x1fa, /* U+0001fa: LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE*/
- 0x1fa, /* U+0001fb: LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE*/
- 0x1fc, /* U+0001fc: LATIN CAPITAL LETTER AE WITH ACUTE*/
- 0x1fc, /* U+0001fd: LATIN SMALL LETTER AE WITH ACUTE*/
- 0x1fe, /* U+0001fe: LATIN CAPITAL LETTER O WITH STROKE AND ACUTE*/
- 0x1fe, /* U+0001ff: LATIN SMALL LETTER O WITH STROKE AND ACUTE*/
- 0x200, /* U+000200: LATIN CAPITAL LETTER A WITH DOUBLE GRAVE*/
- 0x200, /* U+000201: LATIN SMALL LETTER A WITH DOUBLE GRAVE*/
- 0x202, /* U+000202: LATIN CAPITAL LETTER A WITH INVERTED BREVE*/
- 0x202, /* U+000203: LATIN SMALL LETTER A WITH INVERTED BREVE*/
- 0x204, /* U+000204: LATIN CAPITAL LETTER E WITH DOUBLE GRAVE*/
- 0x204, /* U+000205: LATIN SMALL LETTER E WITH DOUBLE GRAVE*/
- 0x206, /* U+000206: LATIN CAPITAL LETTER E WITH INVERTED BREVE*/
- 0x206, /* U+000207: LATIN SMALL LETTER E WITH INVERTED BREVE*/
- 0x208, /* U+000208: LATIN CAPITAL LETTER I WITH DOUBLE GRAVE*/
- 0x208, /* U+000209: LATIN SMALL LETTER I WITH DOUBLE GRAVE*/
- 0x20a, /* U+00020a: LATIN CAPITAL LETTER I WITH INVERTED BREVE*/
- 0x20a, /* U+00020b: LATIN SMALL LETTER I WITH INVERTED BREVE*/
- 0x20c, /* U+00020c: LATIN CAPITAL LETTER O WITH DOUBLE GRAVE*/
- 0x20c, /* U+00020d: LATIN SMALL LETTER O WITH DOUBLE GRAVE*/
- 0x20e, /* U+00020e: LATIN CAPITAL LETTER O WITH INVERTED BREVE*/
- 0x20e, /* U+00020f: LATIN SMALL LETTER O WITH INVERTED BREVE*/
- 0x210, /* U+000210: LATIN CAPITAL LETTER R WITH DOUBLE GRAVE*/
- 0x210, /* U+000211: LATIN SMALL LETTER R WITH DOUBLE GRAVE*/
- 0x212, /* U+000212: LATIN CAPITAL LETTER R WITH INVERTED BREVE*/
- 0x212, /* U+000213: LATIN SMALL LETTER R WITH INVERTED BREVE*/
- 0x214, /* U+000214: LATIN CAPITAL LETTER U WITH DOUBLE GRAVE*/
- 0x214, /* U+000215: LATIN SMALL LETTER U WITH DOUBLE GRAVE*/
- 0x216, /* U+000216: LATIN CAPITAL LETTER U WITH INVERTED BREVE*/
- 0x216, /* U+000217: LATIN SMALL LETTER U WITH INVERTED BREVE*/
- 0x218, /* U+000218: LATIN CAPITAL LETTER S WITH COMMA BELOW*/
- 0x218, /* U+000219: LATIN SMALL LETTER S WITH COMMA BELOW*/
- 0x21a, /* U+00021a: LATIN CAPITAL LETTER T WITH COMMA BELOW*/
- 0x21a, /* U+00021b: LATIN SMALL LETTER T WITH COMMA BELOW*/
- 0x21c, /* U+00021c: LATIN CAPITAL LETTER YOGH*/
- 0x21c, /* U+00021d: LATIN SMALL LETTER YOGH*/
- 0x21e, /* U+00021e: LATIN CAPITAL LETTER H WITH CARON*/
- 0x21e, /* U+00021f: LATIN SMALL LETTER H WITH CARON*/
- 0x220, /* U+000220: LATIN CAPITAL LETTER N WITH LONG RIGHT LEG*/
- 0x221, /* U+000221: LATIN SMALL LETTER D WITH CURL*/
- 0x222, /* U+000222: LATIN CAPITAL LETTER OU*/
- 0x222, /* U+000223: LATIN SMALL LETTER OU*/
- 0x224, /* U+000224: LATIN CAPITAL LETTER Z WITH HOOK*/
- 0x224, /* U+000225: LATIN SMALL LETTER Z WITH HOOK*/
- 0x226, /* U+000226: LATIN CAPITAL LETTER A WITH DOT ABOVE*/
- 0x226, /* U+000227: LATIN SMALL LETTER A WITH DOT ABOVE*/
- 0x228, /* U+000228: LATIN CAPITAL LETTER E WITH CEDILLA*/
- 0x228, /* U+000229: LATIN SMALL LETTER E WITH CEDILLA*/
- 0x22a, /* U+00022a: LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON*/
- 0x22a, /* U+00022b: LATIN SMALL LETTER O WITH DIAERESIS AND MACRON*/
- 0x22c, /* U+00022c: LATIN CAPITAL LETTER O WITH TILDE AND MACRON*/
- 0x22c, /* U+00022d: LATIN SMALL LETTER O WITH TILDE AND MACRON*/
- 0x22e, /* U+00022e: LATIN CAPITAL LETTER O WITH DOT ABOVE*/
- 0x22e, /* U+00022f: LATIN SMALL LETTER O WITH DOT ABOVE*/
- 0x230, /* U+000230: LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON*/
- 0x230, /* U+000231: LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON*/
- 0x232, /* U+000232: LATIN CAPITAL LETTER Y WITH MACRON*/
- 0x232, /* U+000233: LATIN SMALL LETTER Y WITH MACRON*/
- 0x234, /* U+000234: LATIN SMALL LETTER L WITH CURL*/
- 0x235, /* U+000235: LATIN SMALL LETTER N WITH CURL*/
- 0x236, /* U+000236: LATIN SMALL LETTER T WITH CURL*/
- 0x237, /* U+000237: LATIN SMALL LETTER DOTLESS J*/
- 0x238, /* U+000238: LATIN SMALL LETTER DB DIGRAPH*/
- 0x239, /* U+000239: LATIN SMALL LETTER QP DIGRAPH*/
- 0x23a, /* U+00023a: LATIN CAPITAL LETTER A WITH STROKE*/
- 0x23b, /* U+00023b: LATIN CAPITAL LETTER C WITH STROKE*/
- 0x23b, /* U+00023c: LATIN SMALL LETTER C WITH STROKE*/
- 0x23d, /* U+00023d: LATIN CAPITAL LETTER L WITH BAR*/
- 0x23e, /* U+00023e: LATIN CAPITAL LETTER T WITH DIAGONAL STROKE*/
- 0x23f, /* U+00023f: LATIN SMALL LETTER S WITH SWASH TAIL*/
- 0x240, /* U+000240: LATIN SMALL LETTER Z WITH SWASH TAIL*/
- 0x241, /* U+000241: LATIN CAPITAL LETTER GLOTTAL STOP*/
- 0x242, /* U+000242: */
- 0x243, /* U+000243: */
- 0x244, /* U+000244: */
- 0x245, /* U+000245: */
- 0x246, /* U+000246: */
- 0x247, /* U+000247: */
- 0x248, /* U+000248: */
- 0x249, /* U+000249: */
- 0x24a, /* U+00024a: */
- 0x24b, /* U+00024b: */
- 0x24c, /* U+00024c: */
- 0x24d, /* U+00024d: */
- 0x24e, /* U+00024e: */
- 0x24f, /* U+00024f: */
- 0x250, /* U+000250: LATIN SMALL LETTER TURNED A*/
- 0x251, /* U+000251: LATIN SMALL LETTER ALPHA*/
- 0x252, /* U+000252: LATIN SMALL LETTER TURNED ALPHA*/
- 0x181, /* U+000253: LATIN SMALL LETTER B WITH HOOK*/
- 0x186, /* U+000254: LATIN SMALL LETTER OPEN O*/
- 0x255, /* U+000255: LATIN SMALL LETTER C WITH CURL*/
- 0x189, /* U+000256: LATIN SMALL LETTER D WITH TAIL*/
- 0x18a, /* U+000257: LATIN SMALL LETTER D WITH HOOK*/
- 0x258, /* U+000258: LATIN SMALL LETTER REVERSED E*/
- 0x18f, /* U+000259: LATIN SMALL LETTER SCHWA*/
- 0x25a, /* U+00025a: LATIN SMALL LETTER SCHWA WITH HOOK*/
- 0x190, /* U+00025b: LATIN SMALL LETTER OPEN E*/
- 0x25c, /* U+00025c: LATIN SMALL LETTER REVERSED OPEN E*/
- 0x25d, /* U+00025d: LATIN SMALL LETTER REVERSED OPEN E WITH HOOK*/
- 0x25e, /* U+00025e: LATIN SMALL LETTER CLOSED REVERSED OPEN E*/
- 0x25f, /* U+00025f: LATIN SMALL LETTER DOTLESS J WITH STROKE*/
- 0x193, /* U+000260: LATIN SMALL LETTER G WITH HOOK*/
- 0x261, /* U+000261: LATIN SMALL LETTER SCRIPT G*/
- 0x262, /* U+000262: LATIN LETTER SMALL CAPITAL G*/
- 0x194, /* U+000263: LATIN SMALL LETTER GAMMA*/
- 0x264, /* U+000264: LATIN SMALL LETTER RAMS HORN*/
- 0x265, /* U+000265: LATIN SMALL LETTER TURNED H*/
- 0x266, /* U+000266: LATIN SMALL LETTER H WITH HOOK*/
- 0x267, /* U+000267: LATIN SMALL LETTER HENG WITH HOOK*/
- 0x197, /* U+000268: LATIN SMALL LETTER I WITH STROKE*/
- 0x196, /* U+000269: LATIN SMALL LETTER IOTA*/
- 0x26a, /* U+00026a: LATIN LETTER SMALL CAPITAL I*/
- 0x26b, /* U+00026b: LATIN SMALL LETTER L WITH MIDDLE TILDE*/
- 0x26c, /* U+00026c: LATIN SMALL LETTER L WITH BELT*/
- 0x26d, /* U+00026d: LATIN SMALL LETTER L WITH RETROFLEX HOOK*/
- 0x26e, /* U+00026e: LATIN SMALL LETTER LEZH*/
- 0x19c, /* U+00026f: LATIN SMALL LETTER TURNED M*/
- 0x270, /* U+000270: LATIN SMALL LETTER TURNED M WITH LONG LEG*/
- 0x271, /* U+000271: LATIN SMALL LETTER M WITH HOOK*/
- 0x19d, /* U+000272: LATIN SMALL LETTER N WITH LEFT HOOK*/
- 0x273, /* U+000273: LATIN SMALL LETTER N WITH RETROFLEX HOOK*/
- 0x274, /* U+000274: LATIN LETTER SMALL CAPITAL N*/
- 0x19f, /* U+000275: LATIN SMALL LETTER BARRED O*/
- 0x276, /* U+000276: LATIN LETTER SMALL CAPITAL OE*/
- 0x277, /* U+000277: LATIN SMALL LETTER CLOSED OMEGA*/
- 0x278, /* U+000278: LATIN SMALL LETTER PHI*/
- 0x279, /* U+000279: LATIN SMALL LETTER TURNED R*/
- 0x27a, /* U+00027a: LATIN SMALL LETTER TURNED R WITH LONG LEG*/
- 0x27b, /* U+00027b: LATIN SMALL LETTER TURNED R WITH HOOK*/
- 0x27c, /* U+00027c: LATIN SMALL LETTER R WITH LONG LEG*/
- 0x27d, /* U+00027d: LATIN SMALL LETTER R WITH TAIL*/
- 0x27e, /* U+00027e: LATIN SMALL LETTER R WITH FISHHOOK*/
- 0x27f, /* U+00027f: LATIN SMALL LETTER REVERSED R WITH FISHHOOK*/
- 0x1a6, /* U+000280: LATIN LETTER SMALL CAPITAL R*/
- 0x281, /* U+000281: LATIN LETTER SMALL CAPITAL INVERTED R*/
- 0x282, /* U+000282: LATIN SMALL LETTER S WITH HOOK*/
- 0x1a9, /* U+000283: LATIN SMALL LETTER ESH*/
- 0x284, /* U+000284: LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK*/
- 0x285, /* U+000285: LATIN SMALL LETTER SQUAT REVERSED ESH*/
- 0x286, /* U+000286: LATIN SMALL LETTER ESH WITH CURL*/
- 0x287, /* U+000287: LATIN SMALL LETTER TURNED T*/
- 0x1ae, /* U+000288: LATIN SMALL LETTER T WITH RETROFLEX HOOK*/
- 0x289, /* U+000289: LATIN SMALL LETTER U BAR*/
- 0x1b1, /* U+00028a: LATIN SMALL LETTER UPSILON*/
- 0x1b2, /* U+00028b: LATIN SMALL LETTER V WITH HOOK*/
- 0x28c, /* U+00028c: LATIN SMALL LETTER TURNED V*/
- 0x28d, /* U+00028d: LATIN SMALL LETTER TURNED W*/
- 0x28e, /* U+00028e: LATIN SMALL LETTER TURNED Y*/
- 0x28f, /* U+00028f: LATIN LETTER SMALL CAPITAL Y*/
- 0x290, /* U+000290: LATIN SMALL LETTER Z WITH RETROFLEX HOOK*/
- 0x291, /* U+000291: LATIN SMALL LETTER Z WITH CURL*/
- 0x1b7, /* U+000292: LATIN SMALL LETTER EZH*/
- 0x293, /* U+000293: LATIN SMALL LETTER EZH WITH CURL*/
- 0x241, /* U+000294: LATIN LETTER GLOTTAL STOP*/
- 0x295, /* U+000295: LATIN LETTER PHARYNGEAL VOICED FRICATIVE*/
- 0x296, /* U+000296: LATIN LETTER INVERTED GLOTTAL STOP*/
- 0x297, /* U+000297: LATIN LETTER STRETCHED C*/
- 0x298, /* U+000298: LATIN LETTER BILABIAL CLICK*/
- 0x299, /* U+000299: LATIN LETTER SMALL CAPITAL B*/
- 0x29a, /* U+00029a: LATIN SMALL LETTER CLOSED OPEN E*/
- 0x29b, /* U+00029b: LATIN LETTER SMALL CAPITAL G WITH HOOK*/
- 0x29c, /* U+00029c: LATIN LETTER SMALL CAPITAL H*/
- 0x29d, /* U+00029d: LATIN SMALL LETTER J WITH CROSSED-TAIL*/
- 0x29e, /* U+00029e: LATIN SMALL LETTER TURNED K*/
- 0x29f, /* U+00029f: LATIN LETTER SMALL CAPITAL L*/
- 0x2a0, /* U+0002a0: LATIN SMALL LETTER Q WITH HOOK*/
- 0x2a1, /* U+0002a1: LATIN LETTER GLOTTAL STOP WITH STROKE*/
- 0x2a2, /* U+0002a2: LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE*/
- 0x2a3, /* U+0002a3: LATIN SMALL LETTER DZ DIGRAPH*/
- 0x2a4, /* U+0002a4: LATIN SMALL LETTER DEZH DIGRAPH*/
- 0x2a5, /* U+0002a5: LATIN SMALL LETTER DZ DIGRAPH WITH CURL*/
- 0x2a6, /* U+0002a6: LATIN SMALL LETTER TS DIGRAPH*/
- 0x2a7, /* U+0002a7: LATIN SMALL LETTER TESH DIGRAPH*/
- 0x2a8, /* U+0002a8: LATIN SMALL LETTER TC DIGRAPH WITH CURL*/
- 0x2a9, /* U+0002a9: LATIN SMALL LETTER FENG DIGRAPH*/
- 0x2aa, /* U+0002aa: LATIN SMALL LETTER LS DIGRAPH*/
- 0x2ab, /* U+0002ab: LATIN SMALL LETTER LZ DIGRAPH*/
- 0x2ac, /* U+0002ac: LATIN LETTER BILABIAL PERCUSSIVE*/
- 0x2ad, /* U+0002ad: LATIN LETTER BIDENTAL PERCUSSIVE*/
- 0x2ae, /* U+0002ae: LATIN SMALL LETTER TURNED H WITH FISHHOOK*/
- 0x2af, /* U+0002af: LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL*/
- 0x2b0, /* U+0002b0: MODIFIER LETTER SMALL H*/
- 0x2b1, /* U+0002b1: MODIFIER LETTER SMALL H WITH HOOK*/
- 0x2b2, /* U+0002b2: MODIFIER LETTER SMALL J*/
- 0x2b3, /* U+0002b3: MODIFIER LETTER SMALL R*/
- 0x2b4, /* U+0002b4: MODIFIER LETTER SMALL TURNED R*/
- 0x2b5, /* U+0002b5: MODIFIER LETTER SMALL TURNED R WITH HOOK*/
- 0x2b6, /* U+0002b6: MODIFIER LETTER SMALL CAPITAL INVERTED R*/
- 0x2b7, /* U+0002b7: MODIFIER LETTER SMALL W*/
- 0x2b8, /* U+0002b8: MODIFIER LETTER SMALL Y*/
- 0x2b9, /* U+0002b9: MODIFIER LETTER PRIME*/
- 0x2ba, /* U+0002ba: MODIFIER LETTER DOUBLE PRIME*/
- 0x2bb, /* U+0002bb: MODIFIER LETTER TURNED COMMA*/
- 0x2bc, /* U+0002bc: MODIFIER LETTER APOSTROPHE*/
- 0x2bd, /* U+0002bd: MODIFIER LETTER REVERSED COMMA*/
- 0x2be, /* U+0002be: MODIFIER LETTER RIGHT HALF RING*/
- 0x2bf, /* U+0002bf: MODIFIER LETTER LEFT HALF RING*/
- 0x2c0, /* U+0002c0: MODIFIER LETTER GLOTTAL STOP*/
- 0x2c1, /* U+0002c1: MODIFIER LETTER REVERSED GLOTTAL STOP*/
- 0x2c2, /* U+0002c2: MODIFIER LETTER LEFT ARROWHEAD*/
- 0x2c3, /* U+0002c3: MODIFIER LETTER RIGHT ARROWHEAD*/
- 0x2c4, /* U+0002c4: MODIFIER LETTER UP ARROWHEAD*/
- 0x2c5, /* U+0002c5: MODIFIER LETTER DOWN ARROWHEAD*/
- 0x2c6, /* U+0002c6: MODIFIER LETTER CIRCUMFLEX ACCENT*/
- 0x2c7, /* U+0002c7: CARON*/
- 0x2c8, /* U+0002c8: MODIFIER LETTER VERTICAL LINE*/
- 0x2c9, /* U+0002c9: MODIFIER LETTER MACRON*/
- 0x2ca, /* U+0002ca: MODIFIER LETTER ACUTE ACCENT*/
- 0x2cb, /* U+0002cb: MODIFIER LETTER GRAVE ACCENT*/
- 0x2cc, /* U+0002cc: MODIFIER LETTER LOW VERTICAL LINE*/
- 0x2cd, /* U+0002cd: MODIFIER LETTER LOW MACRON*/
- 0x2ce, /* U+0002ce: MODIFIER LETTER LOW GRAVE ACCENT*/
- 0x2cf, /* U+0002cf: MODIFIER LETTER LOW ACUTE ACCENT*/
- 0x2d0, /* U+0002d0: MODIFIER LETTER TRIANGULAR COLON*/
- 0x2d1, /* U+0002d1: MODIFIER LETTER HALF TRIANGULAR COLON*/
- 0x2d2, /* U+0002d2: MODIFIER LETTER CENTRED RIGHT HALF RING*/
- 0x2d3, /* U+0002d3: MODIFIER LETTER CENTRED LEFT HALF RING*/
- 0x2d4, /* U+0002d4: MODIFIER LETTER UP TACK*/
- 0x2d5, /* U+0002d5: MODIFIER LETTER DOWN TACK*/
- 0x2d6, /* U+0002d6: MODIFIER LETTER PLUS SIGN*/
- 0x2d7, /* U+0002d7: MODIFIER LETTER MINUS SIGN*/
- 0x2d8, /* U+0002d8: BREVE*/
- 0x2d9, /* U+0002d9: DOT ABOVE*/
- 0x2da, /* U+0002da: RING ABOVE*/
- 0x2db, /* U+0002db: OGONEK*/
- 0x2dc, /* U+0002dc: SMALL TILDE*/
- 0x2dd, /* U+0002dd: DOUBLE ACUTE ACCENT*/
- 0x2de, /* U+0002de: MODIFIER LETTER RHOTIC HOOK*/
- 0x2df, /* U+0002df: MODIFIER LETTER CROSS ACCENT*/
- 0x2e0, /* U+0002e0: MODIFIER LETTER SMALL GAMMA*/
- 0x2e1, /* U+0002e1: MODIFIER LETTER SMALL L*/
- 0x2e2, /* U+0002e2: MODIFIER LETTER SMALL S*/
- 0x2e3, /* U+0002e3: MODIFIER LETTER SMALL X*/
- 0x2e4, /* U+0002e4: MODIFIER LETTER SMALL REVERSED GLOTTAL STOP*/
- 0x2e5, /* U+0002e5: MODIFIER LETTER EXTRA-HIGH TONE BAR*/
- 0x2e6, /* U+0002e6: MODIFIER LETTER HIGH TONE BAR*/
- 0x2e7, /* U+0002e7: MODIFIER LETTER MID TONE BAR*/
- 0x2e8, /* U+0002e8: MODIFIER LETTER LOW TONE BAR*/
- 0x2e9, /* U+0002e9: MODIFIER LETTER EXTRA-LOW TONE BAR*/
- 0x2ea, /* U+0002ea: MODIFIER LETTER YIN DEPARTING TONE MARK*/
- 0x2eb, /* U+0002eb: MODIFIER LETTER YANG DEPARTING TONE MARK*/
- 0x2ec, /* U+0002ec: MODIFIER LETTER VOICING*/
- 0x2ed, /* U+0002ed: MODIFIER LETTER UNASPIRATED*/
- 0x2ee, /* U+0002ee: MODIFIER LETTER DOUBLE APOSTROPHE*/
- 0x2ef, /* U+0002ef: MODIFIER LETTER LOW DOWN ARROWHEAD*/
- 0x2f0, /* U+0002f0: MODIFIER LETTER LOW UP ARROWHEAD*/
- 0x2f1, /* U+0002f1: MODIFIER LETTER LOW LEFT ARROWHEAD*/
- 0x2f2, /* U+0002f2: MODIFIER LETTER LOW RIGHT ARROWHEAD*/
- 0x2f3, /* U+0002f3: MODIFIER LETTER LOW RING*/
- 0x2f4, /* U+0002f4: MODIFIER LETTER MIDDLE GRAVE ACCENT*/
- 0x2f5, /* U+0002f5: MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT*/
- 0x2f6, /* U+0002f6: MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT*/
- 0x2f7, /* U+0002f7: MODIFIER LETTER LOW TILDE*/
- 0x2f8, /* U+0002f8: MODIFIER LETTER RAISED COLON*/
- 0x2f9, /* U+0002f9: MODIFIER LETTER BEGIN HIGH TONE*/
- 0x2fa, /* U+0002fa: MODIFIER LETTER END HIGH TONE*/
- 0x2fb, /* U+0002fb: MODIFIER LETTER BEGIN LOW TONE*/
- 0x2fc, /* U+0002fc: MODIFIER LETTER END LOW TONE*/
- 0x2fd, /* U+0002fd: MODIFIER LETTER SHELF*/
- 0x2fe, /* U+0002fe: MODIFIER LETTER OPEN SHELF*/
- 0x2ff, /* U+0002ff: MODIFIER LETTER LOW LEFT ARROW*/
- 0x300, /* U+000300: COMBINING GRAVE ACCENT*/
- 0x301, /* U+000301: COMBINING ACUTE ACCENT*/
- 0x302, /* U+000302: COMBINING CIRCUMFLEX ACCENT*/
- 0x303, /* U+000303: COMBINING TILDE*/
- 0x304, /* U+000304: COMBINING MACRON*/
- 0x305, /* U+000305: COMBINING OVERLINE*/
- 0x306, /* U+000306: COMBINING BREVE*/
- 0x307, /* U+000307: COMBINING DOT ABOVE*/
- 0x308, /* U+000308: COMBINING DIAERESIS*/
- 0x309, /* U+000309: COMBINING HOOK ABOVE*/
- 0x30a, /* U+00030a: COMBINING RING ABOVE*/
- 0x30b, /* U+00030b: COMBINING DOUBLE ACUTE ACCENT*/
- 0x30c, /* U+00030c: COMBINING CARON*/
- 0x30d, /* U+00030d: COMBINING VERTICAL LINE ABOVE*/
- 0x30e, /* U+00030e: COMBINING DOUBLE VERTICAL LINE ABOVE*/
- 0x30f, /* U+00030f: COMBINING DOUBLE GRAVE ACCENT*/
- 0x310, /* U+000310: COMBINING CANDRABINDU*/
- 0x311, /* U+000311: COMBINING INVERTED BREVE*/
- 0x312, /* U+000312: COMBINING TURNED COMMA ABOVE*/
- 0x313, /* U+000313: COMBINING COMMA ABOVE*/
- 0x314, /* U+000314: COMBINING REVERSED COMMA ABOVE*/
- 0x315, /* U+000315: COMBINING COMMA ABOVE RIGHT*/
- 0x316, /* U+000316: COMBINING GRAVE ACCENT BELOW*/
- 0x317, /* U+000317: COMBINING ACUTE ACCENT BELOW*/
- 0x318, /* U+000318: COMBINING LEFT TACK BELOW*/
- 0x319, /* U+000319: COMBINING RIGHT TACK BELOW*/
- 0x31a, /* U+00031a: COMBINING LEFT ANGLE ABOVE*/
- 0x31b, /* U+00031b: COMBINING HORN*/
- 0x31c, /* U+00031c: COMBINING LEFT HALF RING BELOW*/
- 0x31d, /* U+00031d: COMBINING UP TACK BELOW*/
- 0x31e, /* U+00031e: COMBINING DOWN TACK BELOW*/
- 0x31f, /* U+00031f: COMBINING PLUS SIGN BELOW*/
- 0x320, /* U+000320: COMBINING MINUS SIGN BELOW*/
- 0x321, /* U+000321: COMBINING PALATALIZED HOOK BELOW*/
- 0x322, /* U+000322: COMBINING RETROFLEX HOOK BELOW*/
- 0x323, /* U+000323: COMBINING DOT BELOW*/
- 0x324, /* U+000324: COMBINING DIAERESIS BELOW*/
- 0x325, /* U+000325: COMBINING RING BELOW*/
- 0x326, /* U+000326: COMBINING COMMA BELOW*/
- 0x327, /* U+000327: COMBINING CEDILLA*/
- 0x328, /* U+000328: COMBINING OGONEK*/
- 0x329, /* U+000329: COMBINING VERTICAL LINE BELOW*/
- 0x32a, /* U+00032a: COMBINING BRIDGE BELOW*/
- 0x32b, /* U+00032b: COMBINING INVERTED DOUBLE ARCH BELOW*/
- 0x32c, /* U+00032c: COMBINING CARON BELOW*/
- 0x32d, /* U+00032d: COMBINING CIRCUMFLEX ACCENT BELOW*/
- 0x32e, /* U+00032e: COMBINING BREVE BELOW*/
- 0x32f, /* U+00032f: COMBINING INVERTED BREVE BELOW*/
- 0x330, /* U+000330: COMBINING TILDE BELOW*/
- 0x331, /* U+000331: COMBINING MACRON BELOW*/
- 0x332, /* U+000332: COMBINING LOW LINE*/
- 0x333, /* U+000333: COMBINING DOUBLE LOW LINE*/
- 0x334, /* U+000334: COMBINING TILDE OVERLAY*/
- 0x335, /* U+000335: COMBINING SHORT STROKE OVERLAY*/
- 0x336, /* U+000336: COMBINING LONG STROKE OVERLAY*/
- 0x337, /* U+000337: COMBINING SHORT SOLIDUS OVERLAY*/
- 0x338, /* U+000338: COMBINING LONG SOLIDUS OVERLAY*/
- 0x339, /* U+000339: COMBINING RIGHT HALF RING BELOW*/
- 0x33a, /* U+00033a: COMBINING INVERTED BRIDGE BELOW*/
- 0x33b, /* U+00033b: COMBINING SQUARE BELOW*/
- 0x33c, /* U+00033c: COMBINING SEAGULL BELOW*/
- 0x33d, /* U+00033d: COMBINING X ABOVE*/
- 0x33e, /* U+00033e: COMBINING VERTICAL TILDE*/
- 0x33f, /* U+00033f: COMBINING DOUBLE OVERLINE*/
- 0x340, /* U+000340: COMBINING GRAVE TONE MARK*/
- 0x341, /* U+000341: COMBINING ACUTE TONE MARK*/
- 0x342, /* U+000342: COMBINING GREEK PERISPOMENI*/
- 0x343, /* U+000343: COMBINING GREEK KORONIS*/
- 0x344, /* U+000344: COMBINING GREEK DIALYTIKA TONOS*/
- 0x399, /* U+000345: COMBINING GREEK YPOGEGRAMMENI*/
- 0x346, /* U+000346: COMBINING BRIDGE ABOVE*/
- 0x347, /* U+000347: COMBINING EQUALS SIGN BELOW*/
- 0x348, /* U+000348: COMBINING DOUBLE VERTICAL LINE BELOW*/
- 0x349, /* U+000349: COMBINING LEFT ANGLE BELOW*/
- 0x34a, /* U+00034a: COMBINING NOT TILDE ABOVE*/
- 0x34b, /* U+00034b: COMBINING HOMOTHETIC ABOVE*/
- 0x34c, /* U+00034c: COMBINING ALMOST EQUAL TO ABOVE*/
- 0x34d, /* U+00034d: COMBINING LEFT RIGHT ARROW BELOW*/
- 0x34e, /* U+00034e: COMBINING UPWARDS ARROW BELOW*/
- 0x34f, /* U+00034f: COMBINING GRAPHEME JOINER*/
- 0x350, /* U+000350: COMBINING RIGHT ARROWHEAD ABOVE*/
- 0x351, /* U+000351: COMBINING LEFT HALF RING ABOVE*/
- 0x352, /* U+000352: COMBINING FERMATA*/
- 0x353, /* U+000353: COMBINING X BELOW*/
- 0x354, /* U+000354: COMBINING LEFT ARROWHEAD BELOW*/
- 0x355, /* U+000355: COMBINING RIGHT ARROWHEAD BELOW*/
- 0x356, /* U+000356: COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW*/
- 0x357, /* U+000357: COMBINING RIGHT HALF RING ABOVE*/
- 0x358, /* U+000358: COMBINING DOT ABOVE RIGHT*/
- 0x359, /* U+000359: COMBINING ASTERISK BELOW*/
- 0x35a, /* U+00035a: COMBINING DOUBLE RING BELOW*/
- 0x35b, /* U+00035b: COMBINING ZIGZAG ABOVE*/
- 0x35c, /* U+00035c: COMBINING DOUBLE BREVE BELOW*/
- 0x35d, /* U+00035d: COMBINING DOUBLE BREVE*/
- 0x35e, /* U+00035e: COMBINING DOUBLE MACRON*/
- 0x35f, /* U+00035f: COMBINING DOUBLE MACRON BELOW*/
- 0x360, /* U+000360: COMBINING DOUBLE TILDE*/
- 0x361, /* U+000361: COMBINING DOUBLE INVERTED BREVE*/
- 0x362, /* U+000362: COMBINING DOUBLE RIGHTWARDS ARROW BELOW*/
- 0x363, /* U+000363: COMBINING LATIN SMALL LETTER A*/
- 0x364, /* U+000364: COMBINING LATIN SMALL LETTER E*/
- 0x365, /* U+000365: COMBINING LATIN SMALL LETTER I*/
- 0x366, /* U+000366: COMBINING LATIN SMALL LETTER O*/
- 0x367, /* U+000367: COMBINING LATIN SMALL LETTER U*/
- 0x368, /* U+000368: COMBINING LATIN SMALL LETTER C*/
- 0x369, /* U+000369: COMBINING LATIN SMALL LETTER D*/
- 0x36a, /* U+00036a: COMBINING LATIN SMALL LETTER H*/
- 0x36b, /* U+00036b: COMBINING LATIN SMALL LETTER M*/
- 0x36c, /* U+00036c: COMBINING LATIN SMALL LETTER R*/
- 0x36d, /* U+00036d: COMBINING LATIN SMALL LETTER T*/
- 0x36e, /* U+00036e: COMBINING LATIN SMALL LETTER V*/
- 0x36f, /* U+00036f: COMBINING LATIN SMALL LETTER X*/
- 0x370, /* U+000370: */
- 0x371, /* U+000371: */
- 0x372, /* U+000372: */
- 0x373, /* U+000373: */
- 0x374, /* U+000374: GREEK NUMERAL SIGN*/
- 0x375, /* U+000375: GREEK LOWER NUMERAL SIGN*/
- 0x376, /* U+000376: */
- 0x377, /* U+000377: */
- 0x378, /* U+000378: */
- 0x379, /* U+000379: */
- 0x37a, /* U+00037a: GREEK YPOGEGRAMMENI*/
- 0x37b, /* U+00037b: */
- 0x37c, /* U+00037c: */
- 0x37d, /* U+00037d: */
- 0x37e, /* U+00037e: GREEK QUESTION MARK*/
- 0x37f, /* U+00037f: */
- 0x380, /* U+000380: */
- 0x381, /* U+000381: */
- 0x382, /* U+000382: */
- 0x383, /* U+000383: */
- 0x384, /* U+000384: GREEK TONOS*/
- 0x385, /* U+000385: GREEK DIALYTIKA TONOS*/
- 0x386, /* U+000386: GREEK CAPITAL LETTER ALPHA WITH TONOS*/
- 0x387, /* U+000387: GREEK ANO TELEIA*/
- 0x388, /* U+000388: GREEK CAPITAL LETTER EPSILON WITH TONOS*/
- 0x389, /* U+000389: GREEK CAPITAL LETTER ETA WITH TONOS*/
- 0x38a, /* U+00038a: GREEK CAPITAL LETTER IOTA WITH TONOS*/
- 0x38b, /* U+00038b: */
- 0x38c, /* U+00038c: GREEK CAPITAL LETTER OMICRON WITH TONOS*/
- 0x38d, /* U+00038d: */
- 0x38e, /* U+00038e: GREEK CAPITAL LETTER UPSILON WITH TONOS*/
- 0x38f, /* U+00038f: GREEK CAPITAL LETTER OMEGA WITH TONOS*/
- 0x390, /* U+000390: GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS*/
- 0x391, /* U+000391: GREEK CAPITAL LETTER ALPHA*/
- 0x392, /* U+000392: GREEK CAPITAL LETTER BETA*/
- 0x393, /* U+000393: GREEK CAPITAL LETTER GAMMA*/
- 0x394, /* U+000394: GREEK CAPITAL LETTER DELTA*/
- 0x395, /* U+000395: GREEK CAPITAL LETTER EPSILON*/
- 0x396, /* U+000396: GREEK CAPITAL LETTER ZETA*/
- 0x397, /* U+000397: GREEK CAPITAL LETTER ETA*/
- 0x398, /* U+000398: GREEK CAPITAL LETTER THETA*/
- 0x399, /* U+000399: GREEK CAPITAL LETTER IOTA*/
- 0x39a, /* U+00039a: GREEK CAPITAL LETTER KAPPA*/
- 0x39b, /* U+00039b: GREEK CAPITAL LETTER LAMDA*/
- 0x39c, /* U+00039c: GREEK CAPITAL LETTER MU*/
- 0x39d, /* U+00039d: GREEK CAPITAL LETTER NU*/
- 0x39e, /* U+00039e: GREEK CAPITAL LETTER XI*/
- 0x39f, /* U+00039f: GREEK CAPITAL LETTER OMICRON*/
- 0x3a0, /* U+0003a0: GREEK CAPITAL LETTER PI*/
- 0x3a1, /* U+0003a1: GREEK CAPITAL LETTER RHO*/
- 0x3a2, /* U+0003a2: */
- 0x3a3, /* U+0003a3: GREEK CAPITAL LETTER SIGMA*/
- 0x3a4, /* U+0003a4: GREEK CAPITAL LETTER TAU*/
- 0x3a5, /* U+0003a5: GREEK CAPITAL LETTER UPSILON*/
- 0x3a6, /* U+0003a6: GREEK CAPITAL LETTER PHI*/
- 0x3a7, /* U+0003a7: GREEK CAPITAL LETTER CHI*/
- 0x3a8, /* U+0003a8: GREEK CAPITAL LETTER PSI*/
- 0x3a9, /* U+0003a9: GREEK CAPITAL LETTER OMEGA*/
- 0x3aa, /* U+0003aa: GREEK CAPITAL LETTER IOTA WITH DIALYTIKA*/
- 0x3ab, /* U+0003ab: GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA*/
- 0x386, /* U+0003ac: GREEK SMALL LETTER ALPHA WITH TONOS*/
- 0x388, /* U+0003ad: GREEK SMALL LETTER EPSILON WITH TONOS*/
- 0x389, /* U+0003ae: GREEK SMALL LETTER ETA WITH TONOS*/
- 0x38a, /* U+0003af: GREEK SMALL LETTER IOTA WITH TONOS*/
- 0x3b0, /* U+0003b0: GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS*/
- 0x391, /* U+0003b1: GREEK SMALL LETTER ALPHA*/
- 0x392, /* U+0003b2: GREEK SMALL LETTER BETA*/
- 0x393, /* U+0003b3: GREEK SMALL LETTER GAMMA*/
- 0x394, /* U+0003b4: GREEK SMALL LETTER DELTA*/
- 0x395, /* U+0003b5: GREEK SMALL LETTER EPSILON*/
- 0x396, /* U+0003b6: GREEK SMALL LETTER ZETA*/
- 0x397, /* U+0003b7: GREEK SMALL LETTER ETA*/
- 0x398, /* U+0003b8: GREEK SMALL LETTER THETA*/
- 0x399, /* U+0003b9: GREEK SMALL LETTER IOTA*/
- 0x39a, /* U+0003ba: GREEK SMALL LETTER KAPPA*/
- 0x39b, /* U+0003bb: GREEK SMALL LETTER LAMDA*/
- 0x39c, /* U+0003bc: GREEK SMALL LETTER MU*/
- 0x39d, /* U+0003bd: GREEK SMALL LETTER NU*/
- 0x39e, /* U+0003be: GREEK SMALL LETTER XI*/
- 0x39f, /* U+0003bf: GREEK SMALL LETTER OMICRON*/
- 0x3a0, /* U+0003c0: GREEK SMALL LETTER PI*/
- 0x3a1, /* U+0003c1: GREEK SMALL LETTER RHO*/
- 0x3a3, /* U+0003c2: GREEK SMALL LETTER FINAL SIGMA*/
- 0x3a3, /* U+0003c3: GREEK SMALL LETTER SIGMA*/
- 0x3a4, /* U+0003c4: GREEK SMALL LETTER TAU*/
- 0x3a5, /* U+0003c5: GREEK SMALL LETTER UPSILON*/
- 0x3a6, /* U+0003c6: GREEK SMALL LETTER PHI*/
- 0x3a7, /* U+0003c7: GREEK SMALL LETTER CHI*/
- 0x3a8, /* U+0003c8: GREEK SMALL LETTER PSI*/
- 0x3a9, /* U+0003c9: GREEK SMALL LETTER OMEGA*/
- 0x3aa, /* U+0003ca: GREEK SMALL LETTER IOTA WITH DIALYTIKA*/
- 0x3ab, /* U+0003cb: GREEK SMALL LETTER UPSILON WITH DIALYTIKA*/
- 0x38c, /* U+0003cc: GREEK SMALL LETTER OMICRON WITH TONOS*/
- 0x38e, /* U+0003cd: GREEK SMALL LETTER UPSILON WITH TONOS*/
- 0x38f, /* U+0003ce: GREEK SMALL LETTER OMEGA WITH TONOS*/
- 0x3cf, /* U+0003cf: */
- 0x392, /* U+0003d0: GREEK BETA SYMBOL*/
- 0x398, /* U+0003d1: GREEK THETA SYMBOL*/
- 0x3d2, /* U+0003d2: GREEK UPSILON WITH HOOK SYMBOL*/
- 0x3d3, /* U+0003d3: GREEK UPSILON WITH ACUTE AND HOOK SYMBOL*/
- 0x3d4, /* U+0003d4: GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL*/
- 0x3a6, /* U+0003d5: GREEK PHI SYMBOL*/
- 0x3a0, /* U+0003d6: GREEK PI SYMBOL*/
- 0x3d7, /* U+0003d7: GREEK KAI SYMBOL*/
- 0x3d8, /* U+0003d8: GREEK LETTER ARCHAIC KOPPA*/
- 0x3d8, /* U+0003d9: GREEK SMALL LETTER ARCHAIC KOPPA*/
- 0x3da, /* U+0003da: GREEK LETTER STIGMA*/
- 0x3da, /* U+0003db: GREEK SMALL LETTER STIGMA*/
- 0x3dc, /* U+0003dc: GREEK LETTER DIGAMMA*/
- 0x3dc, /* U+0003dd: GREEK SMALL LETTER DIGAMMA*/
- 0x3de, /* U+0003de: GREEK LETTER KOPPA*/
- 0x3de, /* U+0003df: GREEK SMALL LETTER KOPPA*/
- 0x3e0, /* U+0003e0: GREEK LETTER SAMPI*/
- 0x3e0, /* U+0003e1: GREEK SMALL LETTER SAMPI*/
- 0x3e2, /* U+0003e2: COPTIC CAPITAL LETTER SHEI*/
- 0x3e2, /* U+0003e3: COPTIC SMALL LETTER SHEI*/
- 0x3e4, /* U+0003e4: COPTIC CAPITAL LETTER FEI*/
- 0x3e4, /* U+0003e5: COPTIC SMALL LETTER FEI*/
- 0x3e6, /* U+0003e6: COPTIC CAPITAL LETTER KHEI*/
- 0x3e6, /* U+0003e7: COPTIC SMALL LETTER KHEI*/
- 0x3e8, /* U+0003e8: COPTIC CAPITAL LETTER HORI*/
- 0x3e8, /* U+0003e9: COPTIC SMALL LETTER HORI*/
- 0x3ea, /* U+0003ea: COPTIC CAPITAL LETTER GANGIA*/
- 0x3ea, /* U+0003eb: COPTIC SMALL LETTER GANGIA*/
- 0x3ec, /* U+0003ec: COPTIC CAPITAL LETTER SHIMA*/
- 0x3ec, /* U+0003ed: COPTIC SMALL LETTER SHIMA*/
- 0x3ee, /* U+0003ee: COPTIC CAPITAL LETTER DEI*/
- 0x3ee, /* U+0003ef: COPTIC SMALL LETTER DEI*/
- 0x39a, /* U+0003f0: GREEK KAPPA SYMBOL*/
- 0x3a1, /* U+0003f1: GREEK RHO SYMBOL*/
- 0x3f9, /* U+0003f2: GREEK LUNATE SIGMA SYMBOL*/
- 0x3f3, /* U+0003f3: GREEK LETTER YOT*/
- 0x3f4, /* U+0003f4: GREEK CAPITAL THETA SYMBOL*/
- 0x395, /* U+0003f5: GREEK LUNATE EPSILON SYMBOL*/
- 0x3f6, /* U+0003f6: GREEK REVERSED LUNATE EPSILON SYMBOL*/
- 0x3f7, /* U+0003f7: GREEK CAPITAL LETTER SHO*/
- 0x3f7, /* U+0003f8: GREEK SMALL LETTER SHO*/
- 0x3f9, /* U+0003f9: GREEK CAPITAL LUNATE SIGMA SYMBOL*/
- 0x3fa, /* U+0003fa: GREEK CAPITAL LETTER SAN*/
- 0x3fa, /* U+0003fb: GREEK SMALL LETTER SAN*/
- 0x3fc, /* U+0003fc: GREEK RHO WITH STROKE SYMBOL*/
- 0x3fd, /* U+0003fd: GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL*/
- 0x3fe, /* U+0003fe: GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL*/
- 0x3ff, /* U+0003ff: GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL*/
- 0x400, /* U+000400: CYRILLIC CAPITAL LETTER IE WITH GRAVE*/
- 0x401, /* U+000401: CYRILLIC CAPITAL LETTER IO*/
- 0x402, /* U+000402: CYRILLIC CAPITAL LETTER DJE*/
- 0x403, /* U+000403: CYRILLIC CAPITAL LETTER GJE*/
- 0x404, /* U+000404: CYRILLIC CAPITAL LETTER UKRAINIAN IE*/
- 0x405, /* U+000405: CYRILLIC CAPITAL LETTER DZE*/
- 0x406, /* U+000406: CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I*/
- 0x407, /* U+000407: CYRILLIC CAPITAL LETTER YI*/
- 0x408, /* U+000408: CYRILLIC CAPITAL LETTER JE*/
- 0x409, /* U+000409: CYRILLIC CAPITAL LETTER LJE*/
- 0x40a, /* U+00040a: CYRILLIC CAPITAL LETTER NJE*/
- 0x40b, /* U+00040b: CYRILLIC CAPITAL LETTER TSHE*/
- 0x40c, /* U+00040c: CYRILLIC CAPITAL LETTER KJE*/
- 0x40d, /* U+00040d: CYRILLIC CAPITAL LETTER I WITH GRAVE*/
- 0x40e, /* U+00040e: CYRILLIC CAPITAL LETTER SHORT U*/
- 0x40f, /* U+00040f: CYRILLIC CAPITAL LETTER DZHE*/
- 0x410, /* U+000410: CYRILLIC CAPITAL LETTER A*/
- 0x411, /* U+000411: CYRILLIC CAPITAL LETTER BE*/
- 0x412, /* U+000412: CYRILLIC CAPITAL LETTER VE*/
- 0x413, /* U+000413: CYRILLIC CAPITAL LETTER GHE*/
- 0x414, /* U+000414: CYRILLIC CAPITAL LETTER DE*/
- 0x415, /* U+000415: CYRILLIC CAPITAL LETTER IE*/
- 0x416, /* U+000416: CYRILLIC CAPITAL LETTER ZHE*/
- 0x417, /* U+000417: CYRILLIC CAPITAL LETTER ZE*/
- 0x418, /* U+000418: CYRILLIC CAPITAL LETTER I*/
- 0x419, /* U+000419: CYRILLIC CAPITAL LETTER SHORT I*/
- 0x41a, /* U+00041a: CYRILLIC CAPITAL LETTER KA*/
- 0x41b, /* U+00041b: CYRILLIC CAPITAL LETTER EL*/
- 0x41c, /* U+00041c: CYRILLIC CAPITAL LETTER EM*/
- 0x41d, /* U+00041d: CYRILLIC CAPITAL LETTER EN*/
- 0x41e, /* U+00041e: CYRILLIC CAPITAL LETTER O*/
- 0x41f, /* U+00041f: CYRILLIC CAPITAL LETTER PE*/
- 0x420, /* U+000420: CYRILLIC CAPITAL LETTER ER*/
- 0x421, /* U+000421: CYRILLIC CAPITAL LETTER ES*/
- 0x422, /* U+000422: CYRILLIC CAPITAL LETTER TE*/
- 0x423, /* U+000423: CYRILLIC CAPITAL LETTER U*/
- 0x424, /* U+000424: CYRILLIC CAPITAL LETTER EF*/
- 0x425, /* U+000425: CYRILLIC CAPITAL LETTER HA*/
- 0x426, /* U+000426: CYRILLIC CAPITAL LETTER TSE*/
- 0x427, /* U+000427: CYRILLIC CAPITAL LETTER CHE*/
- 0x428, /* U+000428: CYRILLIC CAPITAL LETTER SHA*/
- 0x429, /* U+000429: CYRILLIC CAPITAL LETTER SHCHA*/
- 0x42a, /* U+00042a: CYRILLIC CAPITAL LETTER HARD SIGN*/
- 0x42b, /* U+00042b: CYRILLIC CAPITAL LETTER YERU*/
- 0x42c, /* U+00042c: CYRILLIC CAPITAL LETTER SOFT SIGN*/
- 0x42d, /* U+00042d: CYRILLIC CAPITAL LETTER E*/
- 0x42e, /* U+00042e: CYRILLIC CAPITAL LETTER YU*/
- 0x42f, /* U+00042f: CYRILLIC CAPITAL LETTER YA*/
- 0x410, /* U+000430: CYRILLIC SMALL LETTER A*/
- 0x411, /* U+000431: CYRILLIC SMALL LETTER BE*/
- 0x412, /* U+000432: CYRILLIC SMALL LETTER VE*/
- 0x413, /* U+000433: CYRILLIC SMALL LETTER GHE*/
- 0x414, /* U+000434: CYRILLIC SMALL LETTER DE*/
- 0x415, /* U+000435: CYRILLIC SMALL LETTER IE*/
- 0x416, /* U+000436: CYRILLIC SMALL LETTER ZHE*/
- 0x417, /* U+000437: CYRILLIC SMALL LETTER ZE*/
- 0x418, /* U+000438: CYRILLIC SMALL LETTER I*/
- 0x419, /* U+000439: CYRILLIC SMALL LETTER SHORT I*/
- 0x41a, /* U+00043a: CYRILLIC SMALL LETTER KA*/
- 0x41b, /* U+00043b: CYRILLIC SMALL LETTER EL*/
- 0x41c, /* U+00043c: CYRILLIC SMALL LETTER EM*/
- 0x41d, /* U+00043d: CYRILLIC SMALL LETTER EN*/
- 0x41e, /* U+00043e: CYRILLIC SMALL LETTER O*/
- 0x41f, /* U+00043f: CYRILLIC SMALL LETTER PE*/
- 0x420, /* U+000440: CYRILLIC SMALL LETTER ER*/
- 0x421, /* U+000441: CYRILLIC SMALL LETTER ES*/
- 0x422, /* U+000442: CYRILLIC SMALL LETTER TE*/
- 0x423, /* U+000443: CYRILLIC SMALL LETTER U*/
- 0x424, /* U+000444: CYRILLIC SMALL LETTER EF*/
- 0x425, /* U+000445: CYRILLIC SMALL LETTER HA*/
- 0x426, /* U+000446: CYRILLIC SMALL LETTER TSE*/
- 0x427, /* U+000447: CYRILLIC SMALL LETTER CHE*/
- 0x428, /* U+000448: CYRILLIC SMALL LETTER SHA*/
- 0x429, /* U+000449: CYRILLIC SMALL LETTER SHCHA*/
- 0x42a, /* U+00044a: CYRILLIC SMALL LETTER HARD SIGN*/
- 0x42b, /* U+00044b: CYRILLIC SMALL LETTER YERU*/
- 0x42c, /* U+00044c: CYRILLIC SMALL LETTER SOFT SIGN*/
- 0x42d, /* U+00044d: CYRILLIC SMALL LETTER E*/
- 0x42e, /* U+00044e: CYRILLIC SMALL LETTER YU*/
- 0x42f, /* U+00044f: CYRILLIC SMALL LETTER YA*/
- 0x400, /* U+000450: CYRILLIC SMALL LETTER IE WITH GRAVE*/
- 0x401, /* U+000451: CYRILLIC SMALL LETTER IO*/
- 0x402, /* U+000452: CYRILLIC SMALL LETTER DJE*/
- 0x403, /* U+000453: CYRILLIC SMALL LETTER GJE*/
- 0x404, /* U+000454: CYRILLIC SMALL LETTER UKRAINIAN IE*/
- 0x405, /* U+000455: CYRILLIC SMALL LETTER DZE*/
- 0x406, /* U+000456: CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I*/
- 0x407, /* U+000457: CYRILLIC SMALL LETTER YI*/
- 0x408, /* U+000458: CYRILLIC SMALL LETTER JE*/
- 0x409, /* U+000459: CYRILLIC SMALL LETTER LJE*/
- 0x40a, /* U+00045a: CYRILLIC SMALL LETTER NJE*/
- 0x40b, /* U+00045b: CYRILLIC SMALL LETTER TSHE*/
- 0x40c, /* U+00045c: CYRILLIC SMALL LETTER KJE*/
- 0x40d, /* U+00045d: CYRILLIC SMALL LETTER I WITH GRAVE*/
- 0x40e, /* U+00045e: CYRILLIC SMALL LETTER SHORT U*/
- 0x40f, /* U+00045f: CYRILLIC SMALL LETTER DZHE*/
- 0x460, /* U+000460: CYRILLIC CAPITAL LETTER OMEGA*/
- 0x460, /* U+000461: CYRILLIC SMALL LETTER OMEGA*/
- 0x462, /* U+000462: CYRILLIC CAPITAL LETTER YAT*/
- 0x462, /* U+000463: CYRILLIC SMALL LETTER YAT*/
- 0x464, /* U+000464: CYRILLIC CAPITAL LETTER IOTIFIED E*/
- 0x464, /* U+000465: CYRILLIC SMALL LETTER IOTIFIED E*/
- 0x466, /* U+000466: CYRILLIC CAPITAL LETTER LITTLE YUS*/
- 0x466, /* U+000467: CYRILLIC SMALL LETTER LITTLE YUS*/
- 0x468, /* U+000468: CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS*/
- 0x468, /* U+000469: CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS*/
- 0x46a, /* U+00046a: CYRILLIC CAPITAL LETTER BIG YUS*/
- 0x46a, /* U+00046b: CYRILLIC SMALL LETTER BIG YUS*/
- 0x46c, /* U+00046c: CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS*/
- 0x46c, /* U+00046d: CYRILLIC SMALL LETTER IOTIFIED BIG YUS*/
- 0x46e, /* U+00046e: CYRILLIC CAPITAL LETTER KSI*/
- 0x46e, /* U+00046f: CYRILLIC SMALL LETTER KSI*/
- 0x470, /* U+000470: CYRILLIC CAPITAL LETTER PSI*/
- 0x470, /* U+000471: CYRILLIC SMALL LETTER PSI*/
- 0x472, /* U+000472: CYRILLIC CAPITAL LETTER FITA*/
- 0x472, /* U+000473: CYRILLIC SMALL LETTER FITA*/
- 0x474, /* U+000474: CYRILLIC CAPITAL LETTER IZHITSA*/
- 0x474, /* U+000475: CYRILLIC SMALL LETTER IZHITSA*/
- 0x476, /* U+000476: CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT*/
- 0x476, /* U+000477: CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT*/
- 0x478, /* U+000478: CYRILLIC CAPITAL LETTER UK*/
- 0x478, /* U+000479: CYRILLIC SMALL LETTER UK*/
- 0x47a, /* U+00047a: CYRILLIC CAPITAL LETTER ROUND OMEGA*/
- 0x47a, /* U+00047b: CYRILLIC SMALL LETTER ROUND OMEGA*/
- 0x47c, /* U+00047c: CYRILLIC CAPITAL LETTER OMEGA WITH TITLO*/
- 0x47c, /* U+00047d: CYRILLIC SMALL LETTER OMEGA WITH TITLO*/
- 0x47e, /* U+00047e: CYRILLIC CAPITAL LETTER OT*/
- 0x47e, /* U+00047f: CYRILLIC SMALL LETTER OT*/
- 0x480, /* U+000480: CYRILLIC CAPITAL LETTER KOPPA*/
- 0x480, /* U+000481: CYRILLIC SMALL LETTER KOPPA*/
- 0x482, /* U+000482: CYRILLIC THOUSANDS SIGN*/
- 0x483, /* U+000483: COMBINING CYRILLIC TITLO*/
- 0x484, /* U+000484: COMBINING CYRILLIC PALATALIZATION*/
- 0x485, /* U+000485: COMBINING CYRILLIC DASIA PNEUMATA*/
- 0x486, /* U+000486: COMBINING CYRILLIC PSILI PNEUMATA*/
- 0x487, /* U+000487: */
- 0x488, /* U+000488: COMBINING CYRILLIC HUNDRED THOUSANDS SIGN*/
- 0x489, /* U+000489: COMBINING CYRILLIC MILLIONS SIGN*/
- 0x48a, /* U+00048a: CYRILLIC CAPITAL LETTER SHORT I WITH TAIL*/
- 0x48a, /* U+00048b: CYRILLIC SMALL LETTER SHORT I WITH TAIL*/
- 0x48c, /* U+00048c: CYRILLIC CAPITAL LETTER SEMISOFT SIGN*/
- 0x48c, /* U+00048d: CYRILLIC SMALL LETTER SEMISOFT SIGN*/
- 0x48e, /* U+00048e: CYRILLIC CAPITAL LETTER ER WITH TICK*/
- 0x48e, /* U+00048f: CYRILLIC SMALL LETTER ER WITH TICK*/
- 0x490, /* U+000490: CYRILLIC CAPITAL LETTER GHE WITH UPTURN*/
- 0x490, /* U+000491: CYRILLIC SMALL LETTER GHE WITH UPTURN*/
- 0x492, /* U+000492: CYRILLIC CAPITAL LETTER GHE WITH STROKE*/
- 0x492, /* U+000493: CYRILLIC SMALL LETTER GHE WITH STROKE*/
- 0x494, /* U+000494: CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK*/
- 0x494, /* U+000495: CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK*/
- 0x496, /* U+000496: CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER*/
- 0x496, /* U+000497: CYRILLIC SMALL LETTER ZHE WITH DESCENDER*/
- 0x498, /* U+000498: CYRILLIC CAPITAL LETTER ZE WITH DESCENDER*/
- 0x498, /* U+000499: CYRILLIC SMALL LETTER ZE WITH DESCENDER*/
- 0x49a, /* U+00049a: CYRILLIC CAPITAL LETTER KA WITH DESCENDER*/
- 0x49a, /* U+00049b: CYRILLIC SMALL LETTER KA WITH DESCENDER*/
- 0x49c, /* U+00049c: CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE*/
- 0x49c, /* U+00049d: CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE*/
- 0x49e, /* U+00049e: CYRILLIC CAPITAL LETTER KA WITH STROKE*/
- 0x49e, /* U+00049f: CYRILLIC SMALL LETTER KA WITH STROKE*/
- 0x4a0, /* U+0004a0: CYRILLIC CAPITAL LETTER BASHKIR KA*/
- 0x4a0, /* U+0004a1: CYRILLIC SMALL LETTER BASHKIR KA*/
- 0x4a2, /* U+0004a2: CYRILLIC CAPITAL LETTER EN WITH DESCENDER*/
- 0x4a2, /* U+0004a3: CYRILLIC SMALL LETTER EN WITH DESCENDER*/
- 0x4a4, /* U+0004a4: CYRILLIC CAPITAL LIGATURE EN GHE*/
- 0x4a4, /* U+0004a5: CYRILLIC SMALL LIGATURE EN GHE*/
- 0x4a6, /* U+0004a6: CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK*/
- 0x4a6, /* U+0004a7: CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK*/
- 0x4a8, /* U+0004a8: CYRILLIC CAPITAL LETTER ABKHASIAN HA*/
- 0x4a8, /* U+0004a9: CYRILLIC SMALL LETTER ABKHASIAN HA*/
- 0x4aa, /* U+0004aa: CYRILLIC CAPITAL LETTER ES WITH DESCENDER*/
- 0x4aa, /* U+0004ab: CYRILLIC SMALL LETTER ES WITH DESCENDER*/
- 0x4ac, /* U+0004ac: CYRILLIC CAPITAL LETTER TE WITH DESCENDER*/
- 0x4ac, /* U+0004ad: CYRILLIC SMALL LETTER TE WITH DESCENDER*/
- 0x4ae, /* U+0004ae: CYRILLIC CAPITAL LETTER STRAIGHT U*/
- 0x4ae, /* U+0004af: CYRILLIC SMALL LETTER STRAIGHT U*/
- 0x4b0, /* U+0004b0: CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE*/
- 0x4b0, /* U+0004b1: CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE*/
- 0x4b2, /* U+0004b2: CYRILLIC CAPITAL LETTER HA WITH DESCENDER*/
- 0x4b2, /* U+0004b3: CYRILLIC SMALL LETTER HA WITH DESCENDER*/
- 0x4b4, /* U+0004b4: CYRILLIC CAPITAL LIGATURE TE TSE*/
- 0x4b4, /* U+0004b5: CYRILLIC SMALL LIGATURE TE TSE*/
- 0x4b6, /* U+0004b6: CYRILLIC CAPITAL LETTER CHE WITH DESCENDER*/
- 0x4b6, /* U+0004b7: CYRILLIC SMALL LETTER CHE WITH DESCENDER*/
- 0x4b8, /* U+0004b8: CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE*/
- 0x4b8, /* U+0004b9: CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE*/
- 0x4ba, /* U+0004ba: CYRILLIC CAPITAL LETTER SHHA*/
- 0x4ba, /* U+0004bb: CYRILLIC SMALL LETTER SHHA*/
- 0x4bc, /* U+0004bc: CYRILLIC CAPITAL LETTER ABKHASIAN CHE*/
- 0x4bc, /* U+0004bd: CYRILLIC SMALL LETTER ABKHASIAN CHE*/
- 0x4be, /* U+0004be: CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER*/
- 0x4be, /* U+0004bf: CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER*/
- 0x4c0, /* U+0004c0: CYRILLIC LETTER PALOCHKA*/
- 0x4c1, /* U+0004c1: CYRILLIC CAPITAL LETTER ZHE WITH BREVE*/
- 0x4c1, /* U+0004c2: CYRILLIC SMALL LETTER ZHE WITH BREVE*/
- 0x4c3, /* U+0004c3: CYRILLIC CAPITAL LETTER KA WITH HOOK*/
- 0x4c3, /* U+0004c4: CYRILLIC SMALL LETTER KA WITH HOOK*/
- 0x4c5, /* U+0004c5: CYRILLIC CAPITAL LETTER EL WITH TAIL*/
- 0x4c5, /* U+0004c6: CYRILLIC SMALL LETTER EL WITH TAIL*/
- 0x4c7, /* U+0004c7: CYRILLIC CAPITAL LETTER EN WITH HOOK*/
- 0x4c7, /* U+0004c8: CYRILLIC SMALL LETTER EN WITH HOOK*/
- 0x4c9, /* U+0004c9: CYRILLIC CAPITAL LETTER EN WITH TAIL*/
- 0x4c9, /* U+0004ca: CYRILLIC SMALL LETTER EN WITH TAIL*/
- 0x4cb, /* U+0004cb: CYRILLIC CAPITAL LETTER KHAKASSIAN CHE*/
- 0x4cb, /* U+0004cc: CYRILLIC SMALL LETTER KHAKASSIAN CHE*/
- 0x4cd, /* U+0004cd: CYRILLIC CAPITAL LETTER EM WITH TAIL*/
- 0x4cd, /* U+0004ce: CYRILLIC SMALL LETTER EM WITH TAIL*/
- 0x4cf, /* U+0004cf: */
- 0x4d0, /* U+0004d0: CYRILLIC CAPITAL LETTER A WITH BREVE*/
- 0x4d0, /* U+0004d1: CYRILLIC SMALL LETTER A WITH BREVE*/
- 0x4d2, /* U+0004d2: CYRILLIC CAPITAL LETTER A WITH DIAERESIS*/
- 0x4d2, /* U+0004d3: CYRILLIC SMALL LETTER A WITH DIAERESIS*/
- 0x4d4, /* U+0004d4: CYRILLIC CAPITAL LIGATURE A IE*/
- 0x4d4, /* U+0004d5: CYRILLIC SMALL LIGATURE A IE*/
- 0x4d6, /* U+0004d6: CYRILLIC CAPITAL LETTER IE WITH BREVE*/
- 0x4d6, /* U+0004d7: CYRILLIC SMALL LETTER IE WITH BREVE*/
- 0x4d8, /* U+0004d8: CYRILLIC CAPITAL LETTER SCHWA*/
- 0x4d8, /* U+0004d9: CYRILLIC SMALL LETTER SCHWA*/
- 0x4da, /* U+0004da: CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS*/
- 0x4da, /* U+0004db: CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS*/
- 0x4dc, /* U+0004dc: CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS*/
- 0x4dc, /* U+0004dd: CYRILLIC SMALL LETTER ZHE WITH DIAERESIS*/
- 0x4de, /* U+0004de: CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS*/
- 0x4de, /* U+0004df: CYRILLIC SMALL LETTER ZE WITH DIAERESIS*/
- 0x4e0, /* U+0004e0: CYRILLIC CAPITAL LETTER ABKHASIAN DZE*/
- 0x4e0, /* U+0004e1: CYRILLIC SMALL LETTER ABKHASIAN DZE*/
- 0x4e2, /* U+0004e2: CYRILLIC CAPITAL LETTER I WITH MACRON*/
- 0x4e2, /* U+0004e3: CYRILLIC SMALL LETTER I WITH MACRON*/
- 0x4e4, /* U+0004e4: CYRILLIC CAPITAL LETTER I WITH DIAERESIS*/
- 0x4e4, /* U+0004e5: CYRILLIC SMALL LETTER I WITH DIAERESIS*/
- 0x4e6, /* U+0004e6: CYRILLIC CAPITAL LETTER O WITH DIAERESIS*/
- 0x4e6, /* U+0004e7: CYRILLIC SMALL LETTER O WITH DIAERESIS*/
- 0x4e8, /* U+0004e8: CYRILLIC CAPITAL LETTER BARRED O*/
- 0x4e8, /* U+0004e9: CYRILLIC SMALL LETTER BARRED O*/
- 0x4ea, /* U+0004ea: CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS*/
- 0x4ea, /* U+0004eb: CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS*/
- 0x4ec, /* U+0004ec: CYRILLIC CAPITAL LETTER E WITH DIAERESIS*/
- 0x4ec, /* U+0004ed: CYRILLIC SMALL LETTER E WITH DIAERESIS*/
- 0x4ee, /* U+0004ee: CYRILLIC CAPITAL LETTER U WITH MACRON*/
- 0x4ee, /* U+0004ef: CYRILLIC SMALL LETTER U WITH MACRON*/
- 0x4f0, /* U+0004f0: CYRILLIC CAPITAL LETTER U WITH DIAERESIS*/
- 0x4f0, /* U+0004f1: CYRILLIC SMALL LETTER U WITH DIAERESIS*/
- 0x4f2, /* U+0004f2: CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE*/
- 0x4f2, /* U+0004f3: CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE*/
- 0x4f4, /* U+0004f4: CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS*/
- 0x4f4, /* U+0004f5: CYRILLIC SMALL LETTER CHE WITH DIAERESIS*/
- 0x4f6, /* U+0004f6: CYRILLIC CAPITAL LETTER GHE WITH DESCENDER*/
- 0x4f6, /* U+0004f7: CYRILLIC SMALL LETTER GHE WITH DESCENDER*/
- 0x4f8, /* U+0004f8: CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS*/
- 0x4f8, /* U+0004f9: CYRILLIC SMALL LETTER YERU WITH DIAERESIS*/
- 0x4fa, /* U+0004fa: */
- 0x4fb, /* U+0004fb: */
- 0x4fc, /* U+0004fc: */
- 0x4fd, /* U+0004fd: */
- 0x4fe, /* U+0004fe: */
- 0x4ff, /* U+0004ff: */
- 0x500, /* U+000500: CYRILLIC CAPITAL LETTER KOMI DE*/
- 0x500, /* U+000501: CYRILLIC SMALL LETTER KOMI DE*/
- 0x502, /* U+000502: CYRILLIC CAPITAL LETTER KOMI DJE*/
- 0x502, /* U+000503: CYRILLIC SMALL LETTER KOMI DJE*/
- 0x504, /* U+000504: CYRILLIC CAPITAL LETTER KOMI ZJE*/
- 0x504, /* U+000505: CYRILLIC SMALL LETTER KOMI ZJE*/
- 0x506, /* U+000506: CYRILLIC CAPITAL LETTER KOMI DZJE*/
- 0x506, /* U+000507: CYRILLIC SMALL LETTER KOMI DZJE*/
- 0x508, /* U+000508: CYRILLIC CAPITAL LETTER KOMI LJE*/
- 0x508, /* U+000509: CYRILLIC SMALL LETTER KOMI LJE*/
- 0x50a, /* U+00050a: CYRILLIC CAPITAL LETTER KOMI NJE*/
- 0x50a, /* U+00050b: CYRILLIC SMALL LETTER KOMI NJE*/
- 0x50c, /* U+00050c: CYRILLIC CAPITAL LETTER KOMI SJE*/
- 0x50c, /* U+00050d: CYRILLIC SMALL LETTER KOMI SJE*/
- 0x50e, /* U+00050e: CYRILLIC CAPITAL LETTER KOMI TJE*/
- 0x50e, /* U+00050f: CYRILLIC SMALL LETTER KOMI TJE*/
- 0x510, /* U+000510: */
- 0x511, /* U+000511: */
- 0x512, /* U+000512: */
- 0x513, /* U+000513: */
- 0x514, /* U+000514: */
- 0x515, /* U+000515: */
- 0x516, /* U+000516: */
- 0x517, /* U+000517: */
- 0x518, /* U+000518: */
- 0x519, /* U+000519: */
- 0x51a, /* U+00051a: */
- 0x51b, /* U+00051b: */
- 0x51c, /* U+00051c: */
- 0x51d, /* U+00051d: */
- 0x51e, /* U+00051e: */
- 0x51f, /* U+00051f: */
- 0x520, /* U+000520: */
- 0x521, /* U+000521: */
- 0x522, /* U+000522: */
- 0x523, /* U+000523: */
- 0x524, /* U+000524: */
- 0x525, /* U+000525: */
- 0x526, /* U+000526: */
- 0x527, /* U+000527: */
- 0x528, /* U+000528: */
- 0x529, /* U+000529: */
- 0x52a, /* U+00052a: */
- 0x52b, /* U+00052b: */
- 0x52c, /* U+00052c: */
- 0x52d, /* U+00052d: */
- 0x52e, /* U+00052e: */
- 0x52f, /* U+00052f: */
- 0x530, /* U+000530: */
- 0x531, /* U+000531: ARMENIAN CAPITAL LETTER AYB*/
- 0x532, /* U+000532: ARMENIAN CAPITAL LETTER BEN*/
- 0x533, /* U+000533: ARMENIAN CAPITAL LETTER GIM*/
- 0x534, /* U+000534: ARMENIAN CAPITAL LETTER DA*/
- 0x535, /* U+000535: ARMENIAN CAPITAL LETTER ECH*/
- 0x536, /* U+000536: ARMENIAN CAPITAL LETTER ZA*/
- 0x537, /* U+000537: ARMENIAN CAPITAL LETTER EH*/
- 0x538, /* U+000538: ARMENIAN CAPITAL LETTER ET*/
- 0x539, /* U+000539: ARMENIAN CAPITAL LETTER TO*/
- 0x53a, /* U+00053a: ARMENIAN CAPITAL LETTER ZHE*/
- 0x53b, /* U+00053b: ARMENIAN CAPITAL LETTER INI*/
- 0x53c, /* U+00053c: ARMENIAN CAPITAL LETTER LIWN*/
- 0x53d, /* U+00053d: ARMENIAN CAPITAL LETTER XEH*/
- 0x53e, /* U+00053e: ARMENIAN CAPITAL LETTER CA*/
- 0x53f, /* U+00053f: ARMENIAN CAPITAL LETTER KEN*/
- 0x540, /* U+000540: ARMENIAN CAPITAL LETTER HO*/
- 0x541, /* U+000541: ARMENIAN CAPITAL LETTER JA*/
- 0x542, /* U+000542: ARMENIAN CAPITAL LETTER GHAD*/
- 0x543, /* U+000543: ARMENIAN CAPITAL LETTER CHEH*/
- 0x544, /* U+000544: ARMENIAN CAPITAL LETTER MEN*/
- 0x545, /* U+000545: ARMENIAN CAPITAL LETTER YI*/
- 0x546, /* U+000546: ARMENIAN CAPITAL LETTER NOW*/
- 0x547, /* U+000547: ARMENIAN CAPITAL LETTER SHA*/
- 0x548, /* U+000548: ARMENIAN CAPITAL LETTER VO*/
- 0x549, /* U+000549: ARMENIAN CAPITAL LETTER CHA*/
- 0x54a, /* U+00054a: ARMENIAN CAPITAL LETTER PEH*/
- 0x54b, /* U+00054b: ARMENIAN CAPITAL LETTER JHEH*/
- 0x54c, /* U+00054c: ARMENIAN CAPITAL LETTER RA*/
- 0x54d, /* U+00054d: ARMENIAN CAPITAL LETTER SEH*/
- 0x54e, /* U+00054e: ARMENIAN CAPITAL LETTER VEW*/
- 0x54f, /* U+00054f: ARMENIAN CAPITAL LETTER TIWN*/
- 0x550, /* U+000550: ARMENIAN CAPITAL LETTER REH*/
- 0x551, /* U+000551: ARMENIAN CAPITAL LETTER CO*/
- 0x552, /* U+000552: ARMENIAN CAPITAL LETTER YIWN*/
- 0x553, /* U+000553: ARMENIAN CAPITAL LETTER PIWR*/
- 0x554, /* U+000554: ARMENIAN CAPITAL LETTER KEH*/
- 0x555, /* U+000555: ARMENIAN CAPITAL LETTER OH*/
- 0x556, /* U+000556: ARMENIAN CAPITAL LETTER FEH*/
- 0x557, /* U+000557: */
- 0x558, /* U+000558: */
- 0x559, /* U+000559: ARMENIAN MODIFIER LETTER LEFT HALF RING*/
- 0x55a, /* U+00055a: ARMENIAN APOSTROPHE*/
- 0x55b, /* U+00055b: ARMENIAN EMPHASIS MARK*/
- 0x55c, /* U+00055c: ARMENIAN EXCLAMATION MARK*/
- 0x55d, /* U+00055d: ARMENIAN COMMA*/
- 0x55e, /* U+00055e: ARMENIAN QUESTION MARK*/
- 0x55f, /* U+00055f: ARMENIAN ABBREVIATION MARK*/
- 0x560, /* U+000560: */
- 0x531, /* U+000561: ARMENIAN SMALL LETTER AYB*/
- 0x532, /* U+000562: ARMENIAN SMALL LETTER BEN*/
- 0x533, /* U+000563: ARMENIAN SMALL LETTER GIM*/
- 0x534, /* U+000564: ARMENIAN SMALL LETTER DA*/
- 0x535, /* U+000565: ARMENIAN SMALL LETTER ECH*/
- 0x536, /* U+000566: ARMENIAN SMALL LETTER ZA*/
- 0x537, /* U+000567: ARMENIAN SMALL LETTER EH*/
- 0x538, /* U+000568: ARMENIAN SMALL LETTER ET*/
- 0x539, /* U+000569: ARMENIAN SMALL LETTER TO*/
- 0x53a, /* U+00056a: ARMENIAN SMALL LETTER ZHE*/
- 0x53b, /* U+00056b: ARMENIAN SMALL LETTER INI*/
- 0x53c, /* U+00056c: ARMENIAN SMALL LETTER LIWN*/
- 0x53d, /* U+00056d: ARMENIAN SMALL LETTER XEH*/
- 0x53e, /* U+00056e: ARMENIAN SMALL LETTER CA*/
- 0x53f, /* U+00056f: ARMENIAN SMALL LETTER KEN*/
- 0x540, /* U+000570: ARMENIAN SMALL LETTER HO*/
- 0x541, /* U+000571: ARMENIAN SMALL LETTER JA*/
- 0x542, /* U+000572: ARMENIAN SMALL LETTER GHAD*/
- 0x543, /* U+000573: ARMENIAN SMALL LETTER CHEH*/
- 0x544, /* U+000574: ARMENIAN SMALL LETTER MEN*/
- 0x545, /* U+000575: ARMENIAN SMALL LETTER YI*/
- 0x546, /* U+000576: ARMENIAN SMALL LETTER NOW*/
- 0x547, /* U+000577: ARMENIAN SMALL LETTER SHA*/
- 0x548, /* U+000578: ARMENIAN SMALL LETTER VO*/
- 0x549, /* U+000579: ARMENIAN SMALL LETTER CHA*/
- 0x54a, /* U+00057a: ARMENIAN SMALL LETTER PEH*/
- 0x54b, /* U+00057b: ARMENIAN SMALL LETTER JHEH*/
- 0x54c, /* U+00057c: ARMENIAN SMALL LETTER RA*/
- 0x54d, /* U+00057d: ARMENIAN SMALL LETTER SEH*/
- 0x54e, /* U+00057e: ARMENIAN SMALL LETTER VEW*/
- 0x54f, /* U+00057f: ARMENIAN SMALL LETTER TIWN*/
- 0x550, /* U+000580: ARMENIAN SMALL LETTER REH*/
- 0x551, /* U+000581: ARMENIAN SMALL LETTER CO*/
- 0x552, /* U+000582: ARMENIAN SMALL LETTER YIWN*/
- 0x553, /* U+000583: ARMENIAN SMALL LETTER PIWR*/
- 0x554, /* U+000584: ARMENIAN SMALL LETTER KEH*/
- 0x555, /* U+000585: ARMENIAN SMALL LETTER OH*/
- 0x556, /* U+000586: ARMENIAN SMALL LETTER FEH*/
-};
-
-static const RTUNICP g_afRTUniUpper0x001e01[] =
-{
- 0x1e00, /* U+001e01: LATIN SMALL LETTER A WITH RING BELOW*/
- 0x1e02, /* U+001e02: LATIN CAPITAL LETTER B WITH DOT ABOVE*/
- 0x1e02, /* U+001e03: LATIN SMALL LETTER B WITH DOT ABOVE*/
- 0x1e04, /* U+001e04: LATIN CAPITAL LETTER B WITH DOT BELOW*/
- 0x1e04, /* U+001e05: LATIN SMALL LETTER B WITH DOT BELOW*/
- 0x1e06, /* U+001e06: LATIN CAPITAL LETTER B WITH LINE BELOW*/
- 0x1e06, /* U+001e07: LATIN SMALL LETTER B WITH LINE BELOW*/
- 0x1e08, /* U+001e08: LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE*/
- 0x1e08, /* U+001e09: LATIN SMALL LETTER C WITH CEDILLA AND ACUTE*/
- 0x1e0a, /* U+001e0a: LATIN CAPITAL LETTER D WITH DOT ABOVE*/
- 0x1e0a, /* U+001e0b: LATIN SMALL LETTER D WITH DOT ABOVE*/
- 0x1e0c, /* U+001e0c: LATIN CAPITAL LETTER D WITH DOT BELOW*/
- 0x1e0c, /* U+001e0d: LATIN SMALL LETTER D WITH DOT BELOW*/
- 0x1e0e, /* U+001e0e: LATIN CAPITAL LETTER D WITH LINE BELOW*/
- 0x1e0e, /* U+001e0f: LATIN SMALL LETTER D WITH LINE BELOW*/
- 0x1e10, /* U+001e10: LATIN CAPITAL LETTER D WITH CEDILLA*/
- 0x1e10, /* U+001e11: LATIN SMALL LETTER D WITH CEDILLA*/
- 0x1e12, /* U+001e12: LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW*/
- 0x1e12, /* U+001e13: LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW*/
- 0x1e14, /* U+001e14: LATIN CAPITAL LETTER E WITH MACRON AND GRAVE*/
- 0x1e14, /* U+001e15: LATIN SMALL LETTER E WITH MACRON AND GRAVE*/
- 0x1e16, /* U+001e16: LATIN CAPITAL LETTER E WITH MACRON AND ACUTE*/
- 0x1e16, /* U+001e17: LATIN SMALL LETTER E WITH MACRON AND ACUTE*/
- 0x1e18, /* U+001e18: LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW*/
- 0x1e18, /* U+001e19: LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW*/
- 0x1e1a, /* U+001e1a: LATIN CAPITAL LETTER E WITH TILDE BELOW*/
- 0x1e1a, /* U+001e1b: LATIN SMALL LETTER E WITH TILDE BELOW*/
- 0x1e1c, /* U+001e1c: LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE*/
- 0x1e1c, /* U+001e1d: LATIN SMALL LETTER E WITH CEDILLA AND BREVE*/
- 0x1e1e, /* U+001e1e: LATIN CAPITAL LETTER F WITH DOT ABOVE*/
- 0x1e1e, /* U+001e1f: LATIN SMALL LETTER F WITH DOT ABOVE*/
- 0x1e20, /* U+001e20: LATIN CAPITAL LETTER G WITH MACRON*/
- 0x1e20, /* U+001e21: LATIN SMALL LETTER G WITH MACRON*/
- 0x1e22, /* U+001e22: LATIN CAPITAL LETTER H WITH DOT ABOVE*/
- 0x1e22, /* U+001e23: LATIN SMALL LETTER H WITH DOT ABOVE*/
- 0x1e24, /* U+001e24: LATIN CAPITAL LETTER H WITH DOT BELOW*/
- 0x1e24, /* U+001e25: LATIN SMALL LETTER H WITH DOT BELOW*/
- 0x1e26, /* U+001e26: LATIN CAPITAL LETTER H WITH DIAERESIS*/
- 0x1e26, /* U+001e27: LATIN SMALL LETTER H WITH DIAERESIS*/
- 0x1e28, /* U+001e28: LATIN CAPITAL LETTER H WITH CEDILLA*/
- 0x1e28, /* U+001e29: LATIN SMALL LETTER H WITH CEDILLA*/
- 0x1e2a, /* U+001e2a: LATIN CAPITAL LETTER H WITH BREVE BELOW*/
- 0x1e2a, /* U+001e2b: LATIN SMALL LETTER H WITH BREVE BELOW*/
- 0x1e2c, /* U+001e2c: LATIN CAPITAL LETTER I WITH TILDE BELOW*/
- 0x1e2c, /* U+001e2d: LATIN SMALL LETTER I WITH TILDE BELOW*/
- 0x1e2e, /* U+001e2e: LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE*/
- 0x1e2e, /* U+001e2f: LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE*/
- 0x1e30, /* U+001e30: LATIN CAPITAL LETTER K WITH ACUTE*/
- 0x1e30, /* U+001e31: LATIN SMALL LETTER K WITH ACUTE*/
- 0x1e32, /* U+001e32: LATIN CAPITAL LETTER K WITH DOT BELOW*/
- 0x1e32, /* U+001e33: LATIN SMALL LETTER K WITH DOT BELOW*/
- 0x1e34, /* U+001e34: LATIN CAPITAL LETTER K WITH LINE BELOW*/
- 0x1e34, /* U+001e35: LATIN SMALL LETTER K WITH LINE BELOW*/
- 0x1e36, /* U+001e36: LATIN CAPITAL LETTER L WITH DOT BELOW*/
- 0x1e36, /* U+001e37: LATIN SMALL LETTER L WITH DOT BELOW*/
- 0x1e38, /* U+001e38: LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON*/
- 0x1e38, /* U+001e39: LATIN SMALL LETTER L WITH DOT BELOW AND MACRON*/
- 0x1e3a, /* U+001e3a: LATIN CAPITAL LETTER L WITH LINE BELOW*/
- 0x1e3a, /* U+001e3b: LATIN SMALL LETTER L WITH LINE BELOW*/
- 0x1e3c, /* U+001e3c: LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW*/
- 0x1e3c, /* U+001e3d: LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW*/
- 0x1e3e, /* U+001e3e: LATIN CAPITAL LETTER M WITH ACUTE*/
- 0x1e3e, /* U+001e3f: LATIN SMALL LETTER M WITH ACUTE*/
- 0x1e40, /* U+001e40: LATIN CAPITAL LETTER M WITH DOT ABOVE*/
- 0x1e40, /* U+001e41: LATIN SMALL LETTER M WITH DOT ABOVE*/
- 0x1e42, /* U+001e42: LATIN CAPITAL LETTER M WITH DOT BELOW*/
- 0x1e42, /* U+001e43: LATIN SMALL LETTER M WITH DOT BELOW*/
- 0x1e44, /* U+001e44: LATIN CAPITAL LETTER N WITH DOT ABOVE*/
- 0x1e44, /* U+001e45: LATIN SMALL LETTER N WITH DOT ABOVE*/
- 0x1e46, /* U+001e46: LATIN CAPITAL LETTER N WITH DOT BELOW*/
- 0x1e46, /* U+001e47: LATIN SMALL LETTER N WITH DOT BELOW*/
- 0x1e48, /* U+001e48: LATIN CAPITAL LETTER N WITH LINE BELOW*/
- 0x1e48, /* U+001e49: LATIN SMALL LETTER N WITH LINE BELOW*/
- 0x1e4a, /* U+001e4a: LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW*/
- 0x1e4a, /* U+001e4b: LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW*/
- 0x1e4c, /* U+001e4c: LATIN CAPITAL LETTER O WITH TILDE AND ACUTE*/
- 0x1e4c, /* U+001e4d: LATIN SMALL LETTER O WITH TILDE AND ACUTE*/
- 0x1e4e, /* U+001e4e: LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS*/
- 0x1e4e, /* U+001e4f: LATIN SMALL LETTER O WITH TILDE AND DIAERESIS*/
- 0x1e50, /* U+001e50: LATIN CAPITAL LETTER O WITH MACRON AND GRAVE*/
- 0x1e50, /* U+001e51: LATIN SMALL LETTER O WITH MACRON AND GRAVE*/
- 0x1e52, /* U+001e52: LATIN CAPITAL LETTER O WITH MACRON AND ACUTE*/
- 0x1e52, /* U+001e53: LATIN SMALL LETTER O WITH MACRON AND ACUTE*/
- 0x1e54, /* U+001e54: LATIN CAPITAL LETTER P WITH ACUTE*/
- 0x1e54, /* U+001e55: LATIN SMALL LETTER P WITH ACUTE*/
- 0x1e56, /* U+001e56: LATIN CAPITAL LETTER P WITH DOT ABOVE*/
- 0x1e56, /* U+001e57: LATIN SMALL LETTER P WITH DOT ABOVE*/
- 0x1e58, /* U+001e58: LATIN CAPITAL LETTER R WITH DOT ABOVE*/
- 0x1e58, /* U+001e59: LATIN SMALL LETTER R WITH DOT ABOVE*/
- 0x1e5a, /* U+001e5a: LATIN CAPITAL LETTER R WITH DOT BELOW*/
- 0x1e5a, /* U+001e5b: LATIN SMALL LETTER R WITH DOT BELOW*/
- 0x1e5c, /* U+001e5c: LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON*/
- 0x1e5c, /* U+001e5d: LATIN SMALL LETTER R WITH DOT BELOW AND MACRON*/
- 0x1e5e, /* U+001e5e: LATIN CAPITAL LETTER R WITH LINE BELOW*/
- 0x1e5e, /* U+001e5f: LATIN SMALL LETTER R WITH LINE BELOW*/
- 0x1e60, /* U+001e60: LATIN CAPITAL LETTER S WITH DOT ABOVE*/
- 0x1e60, /* U+001e61: LATIN SMALL LETTER S WITH DOT ABOVE*/
- 0x1e62, /* U+001e62: LATIN CAPITAL LETTER S WITH DOT BELOW*/
- 0x1e62, /* U+001e63: LATIN SMALL LETTER S WITH DOT BELOW*/
- 0x1e64, /* U+001e64: LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE*/
- 0x1e64, /* U+001e65: LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE*/
- 0x1e66, /* U+001e66: LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE*/
- 0x1e66, /* U+001e67: LATIN SMALL LETTER S WITH CARON AND DOT ABOVE*/
- 0x1e68, /* U+001e68: LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE*/
- 0x1e68, /* U+001e69: LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE*/
- 0x1e6a, /* U+001e6a: LATIN CAPITAL LETTER T WITH DOT ABOVE*/
- 0x1e6a, /* U+001e6b: LATIN SMALL LETTER T WITH DOT ABOVE*/
- 0x1e6c, /* U+001e6c: LATIN CAPITAL LETTER T WITH DOT BELOW*/
- 0x1e6c, /* U+001e6d: LATIN SMALL LETTER T WITH DOT BELOW*/
- 0x1e6e, /* U+001e6e: LATIN CAPITAL LETTER T WITH LINE BELOW*/
- 0x1e6e, /* U+001e6f: LATIN SMALL LETTER T WITH LINE BELOW*/
- 0x1e70, /* U+001e70: LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW*/
- 0x1e70, /* U+001e71: LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW*/
- 0x1e72, /* U+001e72: LATIN CAPITAL LETTER U WITH DIAERESIS BELOW*/
- 0x1e72, /* U+001e73: LATIN SMALL LETTER U WITH DIAERESIS BELOW*/
- 0x1e74, /* U+001e74: LATIN CAPITAL LETTER U WITH TILDE BELOW*/
- 0x1e74, /* U+001e75: LATIN SMALL LETTER U WITH TILDE BELOW*/
- 0x1e76, /* U+001e76: LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW*/
- 0x1e76, /* U+001e77: LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW*/
- 0x1e78, /* U+001e78: LATIN CAPITAL LETTER U WITH TILDE AND ACUTE*/
- 0x1e78, /* U+001e79: LATIN SMALL LETTER U WITH TILDE AND ACUTE*/
- 0x1e7a, /* U+001e7a: LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS*/
- 0x1e7a, /* U+001e7b: LATIN SMALL LETTER U WITH MACRON AND DIAERESIS*/
- 0x1e7c, /* U+001e7c: LATIN CAPITAL LETTER V WITH TILDE*/
- 0x1e7c, /* U+001e7d: LATIN SMALL LETTER V WITH TILDE*/
- 0x1e7e, /* U+001e7e: LATIN CAPITAL LETTER V WITH DOT BELOW*/
- 0x1e7e, /* U+001e7f: LATIN SMALL LETTER V WITH DOT BELOW*/
- 0x1e80, /* U+001e80: LATIN CAPITAL LETTER W WITH GRAVE*/
- 0x1e80, /* U+001e81: LATIN SMALL LETTER W WITH GRAVE*/
- 0x1e82, /* U+001e82: LATIN CAPITAL LETTER W WITH ACUTE*/
- 0x1e82, /* U+001e83: LATIN SMALL LETTER W WITH ACUTE*/
- 0x1e84, /* U+001e84: LATIN CAPITAL LETTER W WITH DIAERESIS*/
- 0x1e84, /* U+001e85: LATIN SMALL LETTER W WITH DIAERESIS*/
- 0x1e86, /* U+001e86: LATIN CAPITAL LETTER W WITH DOT ABOVE*/
- 0x1e86, /* U+001e87: LATIN SMALL LETTER W WITH DOT ABOVE*/
- 0x1e88, /* U+001e88: LATIN CAPITAL LETTER W WITH DOT BELOW*/
- 0x1e88, /* U+001e89: LATIN SMALL LETTER W WITH DOT BELOW*/
- 0x1e8a, /* U+001e8a: LATIN CAPITAL LETTER X WITH DOT ABOVE*/
- 0x1e8a, /* U+001e8b: LATIN SMALL LETTER X WITH DOT ABOVE*/
- 0x1e8c, /* U+001e8c: LATIN CAPITAL LETTER X WITH DIAERESIS*/
- 0x1e8c, /* U+001e8d: LATIN SMALL LETTER X WITH DIAERESIS*/
- 0x1e8e, /* U+001e8e: LATIN CAPITAL LETTER Y WITH DOT ABOVE*/
- 0x1e8e, /* U+001e8f: LATIN SMALL LETTER Y WITH DOT ABOVE*/
- 0x1e90, /* U+001e90: LATIN CAPITAL LETTER Z WITH CIRCUMFLEX*/
- 0x1e90, /* U+001e91: LATIN SMALL LETTER Z WITH CIRCUMFLEX*/
- 0x1e92, /* U+001e92: LATIN CAPITAL LETTER Z WITH DOT BELOW*/
- 0x1e92, /* U+001e93: LATIN SMALL LETTER Z WITH DOT BELOW*/
- 0x1e94, /* U+001e94: LATIN CAPITAL LETTER Z WITH LINE BELOW*/
- 0x1e94, /* U+001e95: LATIN SMALL LETTER Z WITH LINE BELOW*/
- 0x1e96, /* U+001e96: LATIN SMALL LETTER H WITH LINE BELOW*/
- 0x1e97, /* U+001e97: LATIN SMALL LETTER T WITH DIAERESIS*/
- 0x1e98, /* U+001e98: LATIN SMALL LETTER W WITH RING ABOVE*/
- 0x1e99, /* U+001e99: LATIN SMALL LETTER Y WITH RING ABOVE*/
- 0x1e9a, /* U+001e9a: LATIN SMALL LETTER A WITH RIGHT HALF RING*/
- 0x1e60, /* U+001e9b: LATIN SMALL LETTER LONG S WITH DOT ABOVE*/
- 0x1e9c, /* U+001e9c: */
- 0x1e9d, /* U+001e9d: */
- 0x1e9e, /* U+001e9e: */
- 0x1e9f, /* U+001e9f: */
- 0x1ea0, /* U+001ea0: LATIN CAPITAL LETTER A WITH DOT BELOW*/
- 0x1ea0, /* U+001ea1: LATIN SMALL LETTER A WITH DOT BELOW*/
- 0x1ea2, /* U+001ea2: LATIN CAPITAL LETTER A WITH HOOK ABOVE*/
- 0x1ea2, /* U+001ea3: LATIN SMALL LETTER A WITH HOOK ABOVE*/
- 0x1ea4, /* U+001ea4: LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE*/
- 0x1ea4, /* U+001ea5: LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE*/
- 0x1ea6, /* U+001ea6: LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE*/
- 0x1ea6, /* U+001ea7: LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE*/
- 0x1ea8, /* U+001ea8: LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE*/
- 0x1ea8, /* U+001ea9: LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE*/
- 0x1eaa, /* U+001eaa: LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE*/
- 0x1eaa, /* U+001eab: LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE*/
- 0x1eac, /* U+001eac: LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW*/
- 0x1eac, /* U+001ead: LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW*/
- 0x1eae, /* U+001eae: LATIN CAPITAL LETTER A WITH BREVE AND ACUTE*/
- 0x1eae, /* U+001eaf: LATIN SMALL LETTER A WITH BREVE AND ACUTE*/
- 0x1eb0, /* U+001eb0: LATIN CAPITAL LETTER A WITH BREVE AND GRAVE*/
- 0x1eb0, /* U+001eb1: LATIN SMALL LETTER A WITH BREVE AND GRAVE*/
- 0x1eb2, /* U+001eb2: LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE*/
- 0x1eb2, /* U+001eb3: LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE*/
- 0x1eb4, /* U+001eb4: LATIN CAPITAL LETTER A WITH BREVE AND TILDE*/
- 0x1eb4, /* U+001eb5: LATIN SMALL LETTER A WITH BREVE AND TILDE*/
- 0x1eb6, /* U+001eb6: LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW*/
- 0x1eb6, /* U+001eb7: LATIN SMALL LETTER A WITH BREVE AND DOT BELOW*/
- 0x1eb8, /* U+001eb8: LATIN CAPITAL LETTER E WITH DOT BELOW*/
- 0x1eb8, /* U+001eb9: LATIN SMALL LETTER E WITH DOT BELOW*/
- 0x1eba, /* U+001eba: LATIN CAPITAL LETTER E WITH HOOK ABOVE*/
- 0x1eba, /* U+001ebb: LATIN SMALL LETTER E WITH HOOK ABOVE*/
- 0x1ebc, /* U+001ebc: LATIN CAPITAL LETTER E WITH TILDE*/
- 0x1ebc, /* U+001ebd: LATIN SMALL LETTER E WITH TILDE*/
- 0x1ebe, /* U+001ebe: LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE*/
- 0x1ebe, /* U+001ebf: LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE*/
- 0x1ec0, /* U+001ec0: LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE*/
- 0x1ec0, /* U+001ec1: LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE*/
- 0x1ec2, /* U+001ec2: LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE*/
- 0x1ec2, /* U+001ec3: LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE*/
- 0x1ec4, /* U+001ec4: LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE*/
- 0x1ec4, /* U+001ec5: LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE*/
- 0x1ec6, /* U+001ec6: LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW*/
- 0x1ec6, /* U+001ec7: LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW*/
- 0x1ec8, /* U+001ec8: LATIN CAPITAL LETTER I WITH HOOK ABOVE*/
- 0x1ec8, /* U+001ec9: LATIN SMALL LETTER I WITH HOOK ABOVE*/
- 0x1eca, /* U+001eca: LATIN CAPITAL LETTER I WITH DOT BELOW*/
- 0x1eca, /* U+001ecb: LATIN SMALL LETTER I WITH DOT BELOW*/
- 0x1ecc, /* U+001ecc: LATIN CAPITAL LETTER O WITH DOT BELOW*/
- 0x1ecc, /* U+001ecd: LATIN SMALL LETTER O WITH DOT BELOW*/
- 0x1ece, /* U+001ece: LATIN CAPITAL LETTER O WITH HOOK ABOVE*/
- 0x1ece, /* U+001ecf: LATIN SMALL LETTER O WITH HOOK ABOVE*/
- 0x1ed0, /* U+001ed0: LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE*/
- 0x1ed0, /* U+001ed1: LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE*/
- 0x1ed2, /* U+001ed2: LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE*/
- 0x1ed2, /* U+001ed3: LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE*/
- 0x1ed4, /* U+001ed4: LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE*/
- 0x1ed4, /* U+001ed5: LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE*/
- 0x1ed6, /* U+001ed6: LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE*/
- 0x1ed6, /* U+001ed7: LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE*/
- 0x1ed8, /* U+001ed8: LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW*/
- 0x1ed8, /* U+001ed9: LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW*/
- 0x1eda, /* U+001eda: LATIN CAPITAL LETTER O WITH HORN AND ACUTE*/
- 0x1eda, /* U+001edb: LATIN SMALL LETTER O WITH HORN AND ACUTE*/
- 0x1edc, /* U+001edc: LATIN CAPITAL LETTER O WITH HORN AND GRAVE*/
- 0x1edc, /* U+001edd: LATIN SMALL LETTER O WITH HORN AND GRAVE*/
- 0x1ede, /* U+001ede: LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE*/
- 0x1ede, /* U+001edf: LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE*/
- 0x1ee0, /* U+001ee0: LATIN CAPITAL LETTER O WITH HORN AND TILDE*/
- 0x1ee0, /* U+001ee1: LATIN SMALL LETTER O WITH HORN AND TILDE*/
- 0x1ee2, /* U+001ee2: LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW*/
- 0x1ee2, /* U+001ee3: LATIN SMALL LETTER O WITH HORN AND DOT BELOW*/
- 0x1ee4, /* U+001ee4: LATIN CAPITAL LETTER U WITH DOT BELOW*/
- 0x1ee4, /* U+001ee5: LATIN SMALL LETTER U WITH DOT BELOW*/
- 0x1ee6, /* U+001ee6: LATIN CAPITAL LETTER U WITH HOOK ABOVE*/
- 0x1ee6, /* U+001ee7: LATIN SMALL LETTER U WITH HOOK ABOVE*/
- 0x1ee8, /* U+001ee8: LATIN CAPITAL LETTER U WITH HORN AND ACUTE*/
- 0x1ee8, /* U+001ee9: LATIN SMALL LETTER U WITH HORN AND ACUTE*/
- 0x1eea, /* U+001eea: LATIN CAPITAL LETTER U WITH HORN AND GRAVE*/
- 0x1eea, /* U+001eeb: LATIN SMALL LETTER U WITH HORN AND GRAVE*/
- 0x1eec, /* U+001eec: LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE*/
- 0x1eec, /* U+001eed: LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE*/
- 0x1eee, /* U+001eee: LATIN CAPITAL LETTER U WITH HORN AND TILDE*/
- 0x1eee, /* U+001eef: LATIN SMALL LETTER U WITH HORN AND TILDE*/
- 0x1ef0, /* U+001ef0: LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW*/
- 0x1ef0, /* U+001ef1: LATIN SMALL LETTER U WITH HORN AND DOT BELOW*/
- 0x1ef2, /* U+001ef2: LATIN CAPITAL LETTER Y WITH GRAVE*/
- 0x1ef2, /* U+001ef3: LATIN SMALL LETTER Y WITH GRAVE*/
- 0x1ef4, /* U+001ef4: LATIN CAPITAL LETTER Y WITH DOT BELOW*/
- 0x1ef4, /* U+001ef5: LATIN SMALL LETTER Y WITH DOT BELOW*/
- 0x1ef6, /* U+001ef6: LATIN CAPITAL LETTER Y WITH HOOK ABOVE*/
- 0x1ef6, /* U+001ef7: LATIN SMALL LETTER Y WITH HOOK ABOVE*/
- 0x1ef8, /* U+001ef8: LATIN CAPITAL LETTER Y WITH TILDE*/
- 0x1ef8, /* U+001ef9: LATIN SMALL LETTER Y WITH TILDE*/
- 0x1efa, /* U+001efa: */
- 0x1efb, /* U+001efb: */
- 0x1efc, /* U+001efc: */
- 0x1efd, /* U+001efd: */
- 0x1efe, /* U+001efe: */
- 0x1eff, /* U+001eff: */
- 0x1f08, /* U+001f00: GREEK SMALL LETTER ALPHA WITH PSILI*/
- 0x1f09, /* U+001f01: GREEK SMALL LETTER ALPHA WITH DASIA*/
- 0x1f0a, /* U+001f02: GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA*/
- 0x1f0b, /* U+001f03: GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA*/
- 0x1f0c, /* U+001f04: GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA*/
- 0x1f0d, /* U+001f05: GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA*/
- 0x1f0e, /* U+001f06: GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI*/
- 0x1f0f, /* U+001f07: GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI*/
- 0x1f08, /* U+001f08: GREEK CAPITAL LETTER ALPHA WITH PSILI*/
- 0x1f09, /* U+001f09: GREEK CAPITAL LETTER ALPHA WITH DASIA*/
- 0x1f0a, /* U+001f0a: GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA*/
- 0x1f0b, /* U+001f0b: GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA*/
- 0x1f0c, /* U+001f0c: GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA*/
- 0x1f0d, /* U+001f0d: GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA*/
- 0x1f0e, /* U+001f0e: GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI*/
- 0x1f0f, /* U+001f0f: GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI*/
- 0x1f18, /* U+001f10: GREEK SMALL LETTER EPSILON WITH PSILI*/
- 0x1f19, /* U+001f11: GREEK SMALL LETTER EPSILON WITH DASIA*/
- 0x1f1a, /* U+001f12: GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA*/
- 0x1f1b, /* U+001f13: GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA*/
- 0x1f1c, /* U+001f14: GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA*/
- 0x1f1d, /* U+001f15: GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA*/
- 0x1f16, /* U+001f16: */
- 0x1f17, /* U+001f17: */
- 0x1f18, /* U+001f18: GREEK CAPITAL LETTER EPSILON WITH PSILI*/
- 0x1f19, /* U+001f19: GREEK CAPITAL LETTER EPSILON WITH DASIA*/
- 0x1f1a, /* U+001f1a: GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA*/
- 0x1f1b, /* U+001f1b: GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA*/
- 0x1f1c, /* U+001f1c: GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA*/
- 0x1f1d, /* U+001f1d: GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA*/
- 0x1f1e, /* U+001f1e: */
- 0x1f1f, /* U+001f1f: */
- 0x1f28, /* U+001f20: GREEK SMALL LETTER ETA WITH PSILI*/
- 0x1f29, /* U+001f21: GREEK SMALL LETTER ETA WITH DASIA*/
- 0x1f2a, /* U+001f22: GREEK SMALL LETTER ETA WITH PSILI AND VARIA*/
- 0x1f2b, /* U+001f23: GREEK SMALL LETTER ETA WITH DASIA AND VARIA*/
- 0x1f2c, /* U+001f24: GREEK SMALL LETTER ETA WITH PSILI AND OXIA*/
- 0x1f2d, /* U+001f25: GREEK SMALL LETTER ETA WITH DASIA AND OXIA*/
- 0x1f2e, /* U+001f26: GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI*/
- 0x1f2f, /* U+001f27: GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI*/
- 0x1f28, /* U+001f28: GREEK CAPITAL LETTER ETA WITH PSILI*/
- 0x1f29, /* U+001f29: GREEK CAPITAL LETTER ETA WITH DASIA*/
- 0x1f2a, /* U+001f2a: GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA*/
- 0x1f2b, /* U+001f2b: GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA*/
- 0x1f2c, /* U+001f2c: GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA*/
- 0x1f2d, /* U+001f2d: GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA*/
- 0x1f2e, /* U+001f2e: GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI*/
- 0x1f2f, /* U+001f2f: GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI*/
- 0x1f38, /* U+001f30: GREEK SMALL LETTER IOTA WITH PSILI*/
- 0x1f39, /* U+001f31: GREEK SMALL LETTER IOTA WITH DASIA*/
- 0x1f3a, /* U+001f32: GREEK SMALL LETTER IOTA WITH PSILI AND VARIA*/
- 0x1f3b, /* U+001f33: GREEK SMALL LETTER IOTA WITH DASIA AND VARIA*/
- 0x1f3c, /* U+001f34: GREEK SMALL LETTER IOTA WITH PSILI AND OXIA*/
- 0x1f3d, /* U+001f35: GREEK SMALL LETTER IOTA WITH DASIA AND OXIA*/
- 0x1f3e, /* U+001f36: GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI*/
- 0x1f3f, /* U+001f37: GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI*/
- 0x1f38, /* U+001f38: GREEK CAPITAL LETTER IOTA WITH PSILI*/
- 0x1f39, /* U+001f39: GREEK CAPITAL LETTER IOTA WITH DASIA*/
- 0x1f3a, /* U+001f3a: GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA*/
- 0x1f3b, /* U+001f3b: GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA*/
- 0x1f3c, /* U+001f3c: GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA*/
- 0x1f3d, /* U+001f3d: GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA*/
- 0x1f3e, /* U+001f3e: GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI*/
- 0x1f3f, /* U+001f3f: GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI*/
- 0x1f48, /* U+001f40: GREEK SMALL LETTER OMICRON WITH PSILI*/
- 0x1f49, /* U+001f41: GREEK SMALL LETTER OMICRON WITH DASIA*/
- 0x1f4a, /* U+001f42: GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA*/
- 0x1f4b, /* U+001f43: GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA*/
- 0x1f4c, /* U+001f44: GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA*/
- 0x1f4d, /* U+001f45: GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA*/
- 0x1f46, /* U+001f46: */
- 0x1f47, /* U+001f47: */
- 0x1f48, /* U+001f48: GREEK CAPITAL LETTER OMICRON WITH PSILI*/
- 0x1f49, /* U+001f49: GREEK CAPITAL LETTER OMICRON WITH DASIA*/
- 0x1f4a, /* U+001f4a: GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA*/
- 0x1f4b, /* U+001f4b: GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA*/
- 0x1f4c, /* U+001f4c: GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA*/
- 0x1f4d, /* U+001f4d: GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA*/
- 0x1f4e, /* U+001f4e: */
- 0x1f4f, /* U+001f4f: */
- 0x1f50, /* U+001f50: GREEK SMALL LETTER UPSILON WITH PSILI*/
- 0x1f59, /* U+001f51: GREEK SMALL LETTER UPSILON WITH DASIA*/
- 0x1f52, /* U+001f52: GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA*/
- 0x1f5b, /* U+001f53: GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA*/
- 0x1f54, /* U+001f54: GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA*/
- 0x1f5d, /* U+001f55: GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA*/
- 0x1f56, /* U+001f56: GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI*/
- 0x1f5f, /* U+001f57: GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI*/
- 0x1f58, /* U+001f58: */
- 0x1f59, /* U+001f59: GREEK CAPITAL LETTER UPSILON WITH DASIA*/
- 0x1f5a, /* U+001f5a: */
- 0x1f5b, /* U+001f5b: GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA*/
- 0x1f5c, /* U+001f5c: */
- 0x1f5d, /* U+001f5d: GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA*/
- 0x1f5e, /* U+001f5e: */
- 0x1f5f, /* U+001f5f: GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI*/
- 0x1f68, /* U+001f60: GREEK SMALL LETTER OMEGA WITH PSILI*/
- 0x1f69, /* U+001f61: GREEK SMALL LETTER OMEGA WITH DASIA*/
- 0x1f6a, /* U+001f62: GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA*/
- 0x1f6b, /* U+001f63: GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA*/
- 0x1f6c, /* U+001f64: GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA*/
- 0x1f6d, /* U+001f65: GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA*/
- 0x1f6e, /* U+001f66: GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI*/
- 0x1f6f, /* U+001f67: GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI*/
- 0x1f68, /* U+001f68: GREEK CAPITAL LETTER OMEGA WITH PSILI*/
- 0x1f69, /* U+001f69: GREEK CAPITAL LETTER OMEGA WITH DASIA*/
- 0x1f6a, /* U+001f6a: GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA*/
- 0x1f6b, /* U+001f6b: GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA*/
- 0x1f6c, /* U+001f6c: GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA*/
- 0x1f6d, /* U+001f6d: GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA*/
- 0x1f6e, /* U+001f6e: GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI*/
- 0x1f6f, /* U+001f6f: GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI*/
- 0x1fba, /* U+001f70: GREEK SMALL LETTER ALPHA WITH VARIA*/
- 0x1fbb, /* U+001f71: GREEK SMALL LETTER ALPHA WITH OXIA*/
- 0x1fc8, /* U+001f72: GREEK SMALL LETTER EPSILON WITH VARIA*/
- 0x1fc9, /* U+001f73: GREEK SMALL LETTER EPSILON WITH OXIA*/
- 0x1fca, /* U+001f74: GREEK SMALL LETTER ETA WITH VARIA*/
- 0x1fcb, /* U+001f75: GREEK SMALL LETTER ETA WITH OXIA*/
- 0x1fda, /* U+001f76: GREEK SMALL LETTER IOTA WITH VARIA*/
- 0x1fdb, /* U+001f77: GREEK SMALL LETTER IOTA WITH OXIA*/
- 0x1ff8, /* U+001f78: GREEK SMALL LETTER OMICRON WITH VARIA*/
- 0x1ff9, /* U+001f79: GREEK SMALL LETTER OMICRON WITH OXIA*/
- 0x1fea, /* U+001f7a: GREEK SMALL LETTER UPSILON WITH VARIA*/
- 0x1feb, /* U+001f7b: GREEK SMALL LETTER UPSILON WITH OXIA*/
- 0x1ffa, /* U+001f7c: GREEK SMALL LETTER OMEGA WITH VARIA*/
- 0x1ffb, /* U+001f7d: GREEK SMALL LETTER OMEGA WITH OXIA*/
- 0x1f7e, /* U+001f7e: */
- 0x1f7f, /* U+001f7f: */
- 0x1f88, /* U+001f80: GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI*/
- 0x1f89, /* U+001f81: GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI*/
- 0x1f8a, /* U+001f82: GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI*/
- 0x1f8b, /* U+001f83: GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI*/
- 0x1f8c, /* U+001f84: GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI*/
- 0x1f8d, /* U+001f85: GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI*/
- 0x1f8e, /* U+001f86: GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI*/
- 0x1f8f, /* U+001f87: GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI*/
- 0x1f88, /* U+001f88: GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI*/
- 0x1f89, /* U+001f89: GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI*/
- 0x1f8a, /* U+001f8a: GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI*/
- 0x1f8b, /* U+001f8b: GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI*/
- 0x1f8c, /* U+001f8c: GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI*/
- 0x1f8d, /* U+001f8d: GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI*/
- 0x1f8e, /* U+001f8e: GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI*/
- 0x1f8f, /* U+001f8f: GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI*/
- 0x1f98, /* U+001f90: GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI*/
- 0x1f99, /* U+001f91: GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI*/
- 0x1f9a, /* U+001f92: GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI*/
- 0x1f9b, /* U+001f93: GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI*/
- 0x1f9c, /* U+001f94: GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI*/
- 0x1f9d, /* U+001f95: GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI*/
- 0x1f9e, /* U+001f96: GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI*/
- 0x1f9f, /* U+001f97: GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI*/
- 0x1f98, /* U+001f98: GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI*/
- 0x1f99, /* U+001f99: GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI*/
- 0x1f9a, /* U+001f9a: GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI*/
- 0x1f9b, /* U+001f9b: GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI*/
- 0x1f9c, /* U+001f9c: GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI*/
- 0x1f9d, /* U+001f9d: GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI*/
- 0x1f9e, /* U+001f9e: GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI*/
- 0x1f9f, /* U+001f9f: GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI*/
- 0x1fa8, /* U+001fa0: GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI*/
- 0x1fa9, /* U+001fa1: GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI*/
- 0x1faa, /* U+001fa2: GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI*/
- 0x1fab, /* U+001fa3: GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI*/
- 0x1fac, /* U+001fa4: GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI*/
- 0x1fad, /* U+001fa5: GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI*/
- 0x1fae, /* U+001fa6: GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI*/
- 0x1faf, /* U+001fa7: GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI*/
- 0x1fa8, /* U+001fa8: GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI*/
- 0x1fa9, /* U+001fa9: GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI*/
- 0x1faa, /* U+001faa: GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI*/
- 0x1fab, /* U+001fab: GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI*/
- 0x1fac, /* U+001fac: GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI*/
- 0x1fad, /* U+001fad: GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI*/
- 0x1fae, /* U+001fae: GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI*/
- 0x1faf, /* U+001faf: GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI*/
- 0x1fb8, /* U+001fb0: GREEK SMALL LETTER ALPHA WITH VRACHY*/
- 0x1fb9, /* U+001fb1: GREEK SMALL LETTER ALPHA WITH MACRON*/
- 0x1fb2, /* U+001fb2: GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI*/
- 0x1fbc, /* U+001fb3: GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI*/
- 0x1fb4, /* U+001fb4: GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI*/
- 0x1fb5, /* U+001fb5: */
- 0x1fb6, /* U+001fb6: GREEK SMALL LETTER ALPHA WITH PERISPOMENI*/
- 0x1fb7, /* U+001fb7: GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI*/
- 0x1fb8, /* U+001fb8: GREEK CAPITAL LETTER ALPHA WITH VRACHY*/
- 0x1fb9, /* U+001fb9: GREEK CAPITAL LETTER ALPHA WITH MACRON*/
- 0x1fba, /* U+001fba: GREEK CAPITAL LETTER ALPHA WITH VARIA*/
- 0x1fbb, /* U+001fbb: GREEK CAPITAL LETTER ALPHA WITH OXIA*/
- 0x1fbc, /* U+001fbc: GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI*/
- 0x1fbd, /* U+001fbd: GREEK KORONIS*/
- 0x399, /* U+001fbe: GREEK PROSGEGRAMMENI*/
- 0x1fbf, /* U+001fbf: GREEK PSILI*/
- 0x1fc0, /* U+001fc0: GREEK PERISPOMENI*/
- 0x1fc1, /* U+001fc1: GREEK DIALYTIKA AND PERISPOMENI*/
- 0x1fc2, /* U+001fc2: GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI*/
- 0x1fcc, /* U+001fc3: GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI*/
- 0x1fc4, /* U+001fc4: GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI*/
- 0x1fc5, /* U+001fc5: */
- 0x1fc6, /* U+001fc6: GREEK SMALL LETTER ETA WITH PERISPOMENI*/
- 0x1fc7, /* U+001fc7: GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI*/
- 0x1fc8, /* U+001fc8: GREEK CAPITAL LETTER EPSILON WITH VARIA*/
- 0x1fc9, /* U+001fc9: GREEK CAPITAL LETTER EPSILON WITH OXIA*/
- 0x1fca, /* U+001fca: GREEK CAPITAL LETTER ETA WITH VARIA*/
- 0x1fcb, /* U+001fcb: GREEK CAPITAL LETTER ETA WITH OXIA*/
- 0x1fcc, /* U+001fcc: GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI*/
- 0x1fcd, /* U+001fcd: GREEK PSILI AND VARIA*/
- 0x1fce, /* U+001fce: GREEK PSILI AND OXIA*/
- 0x1fcf, /* U+001fcf: GREEK PSILI AND PERISPOMENI*/
- 0x1fd8, /* U+001fd0: GREEK SMALL LETTER IOTA WITH VRACHY*/
- 0x1fd9, /* U+001fd1: GREEK SMALL LETTER IOTA WITH MACRON*/
- 0x1fd2, /* U+001fd2: GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA*/
- 0x1fd3, /* U+001fd3: GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA*/
- 0x1fd4, /* U+001fd4: */
- 0x1fd5, /* U+001fd5: */
- 0x1fd6, /* U+001fd6: GREEK SMALL LETTER IOTA WITH PERISPOMENI*/
- 0x1fd7, /* U+001fd7: GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI*/
- 0x1fd8, /* U+001fd8: GREEK CAPITAL LETTER IOTA WITH VRACHY*/
- 0x1fd9, /* U+001fd9: GREEK CAPITAL LETTER IOTA WITH MACRON*/
- 0x1fda, /* U+001fda: GREEK CAPITAL LETTER IOTA WITH VARIA*/
- 0x1fdb, /* U+001fdb: GREEK CAPITAL LETTER IOTA WITH OXIA*/
- 0x1fdc, /* U+001fdc: */
- 0x1fdd, /* U+001fdd: GREEK DASIA AND VARIA*/
- 0x1fde, /* U+001fde: GREEK DASIA AND OXIA*/
- 0x1fdf, /* U+001fdf: GREEK DASIA AND PERISPOMENI*/
- 0x1fe8, /* U+001fe0: GREEK SMALL LETTER UPSILON WITH VRACHY*/
- 0x1fe9, /* U+001fe1: GREEK SMALL LETTER UPSILON WITH MACRON*/
- 0x1fe2, /* U+001fe2: GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA*/
- 0x1fe3, /* U+001fe3: GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA*/
- 0x1fe4, /* U+001fe4: GREEK SMALL LETTER RHO WITH PSILI*/
- 0x1fec, /* U+001fe5: GREEK SMALL LETTER RHO WITH DASIA*/
- 0x1fe6, /* U+001fe6: GREEK SMALL LETTER UPSILON WITH PERISPOMENI*/
- 0x1fe7, /* U+001fe7: GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI*/
- 0x1fe8, /* U+001fe8: GREEK CAPITAL LETTER UPSILON WITH VRACHY*/
- 0x1fe9, /* U+001fe9: GREEK CAPITAL LETTER UPSILON WITH MACRON*/
- 0x1fea, /* U+001fea: GREEK CAPITAL LETTER UPSILON WITH VARIA*/
- 0x1feb, /* U+001feb: GREEK CAPITAL LETTER UPSILON WITH OXIA*/
- 0x1fec, /* U+001fec: GREEK CAPITAL LETTER RHO WITH DASIA*/
- 0x1fed, /* U+001fed: GREEK DIALYTIKA AND VARIA*/
- 0x1fee, /* U+001fee: GREEK DIALYTIKA AND OXIA*/
- 0x1fef, /* U+001fef: GREEK VARIA*/
- 0x1ff0, /* U+001ff0: */
- 0x1ff1, /* U+001ff1: */
- 0x1ff2, /* U+001ff2: GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI*/
- 0x1ffc, /* U+001ff3: GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI*/
- 0x1ff4, /* U+001ff4: GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI*/
- 0x1ff5, /* U+001ff5: */
- 0x1ff6, /* U+001ff6: GREEK SMALL LETTER OMEGA WITH PERISPOMENI*/
- 0x1ff7, /* U+001ff7: GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI*/
- 0x1ff8, /* U+001ff8: GREEK CAPITAL LETTER OMICRON WITH VARIA*/
- 0x1ff9, /* U+001ff9: GREEK CAPITAL LETTER OMICRON WITH OXIA*/
- 0x1ffa, /* U+001ffa: GREEK CAPITAL LETTER OMEGA WITH VARIA*/
- 0x1ffb, /* U+001ffb: GREEK CAPITAL LETTER OMEGA WITH OXIA*/
- 0x1ffc, /* U+001ffc: GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI*/
- 0x1ffd, /* U+001ffd: GREEK OXIA*/
- 0x1ffe, /* U+001ffe: GREEK DASIA*/
- 0x1fff, /* U+001fff: */
- 0x2000, /* U+002000: EN QUAD*/
- 0x2001, /* U+002001: EM QUAD*/
- 0x2002, /* U+002002: EN SPACE*/
- 0x2003, /* U+002003: EM SPACE*/
- 0x2004, /* U+002004: THREE-PER-EM SPACE*/
- 0x2005, /* U+002005: FOUR-PER-EM SPACE*/
- 0x2006, /* U+002006: SIX-PER-EM SPACE*/
- 0x2007, /* U+002007: FIGURE SPACE*/
- 0x2008, /* U+002008: PUNCTUATION SPACE*/
- 0x2009, /* U+002009: THIN SPACE*/
- 0x200a, /* U+00200a: HAIR SPACE*/
- 0x200b, /* U+00200b: ZERO WIDTH SPACE*/
- 0x200c, /* U+00200c: ZERO WIDTH NON-JOINER*/
- 0x200d, /* U+00200d: ZERO WIDTH JOINER*/
- 0x200e, /* U+00200e: LEFT-TO-RIGHT MARK*/
- 0x200f, /* U+00200f: RIGHT-TO-LEFT MARK*/
- 0x2010, /* U+002010: HYPHEN*/
- 0x2011, /* U+002011: NON-BREAKING HYPHEN*/
- 0x2012, /* U+002012: FIGURE DASH*/
- 0x2013, /* U+002013: EN DASH*/
- 0x2014, /* U+002014: EM DASH*/
- 0x2015, /* U+002015: HORIZONTAL BAR*/
- 0x2016, /* U+002016: DOUBLE VERTICAL LINE*/
- 0x2017, /* U+002017: DOUBLE LOW LINE*/
- 0x2018, /* U+002018: LEFT SINGLE QUOTATION MARK*/
- 0x2019, /* U+002019: RIGHT SINGLE QUOTATION MARK*/
- 0x201a, /* U+00201a: SINGLE LOW-9 QUOTATION MARK*/
- 0x201b, /* U+00201b: SINGLE HIGH-REVERSED-9 QUOTATION MARK*/
- 0x201c, /* U+00201c: LEFT DOUBLE QUOTATION MARK*/
- 0x201d, /* U+00201d: RIGHT DOUBLE QUOTATION MARK*/
- 0x201e, /* U+00201e: DOUBLE LOW-9 QUOTATION MARK*/
- 0x201f, /* U+00201f: DOUBLE HIGH-REVERSED-9 QUOTATION MARK*/
- 0x2020, /* U+002020: DAGGER*/
- 0x2021, /* U+002021: DOUBLE DAGGER*/
- 0x2022, /* U+002022: BULLET*/
- 0x2023, /* U+002023: TRIANGULAR BULLET*/
- 0x2024, /* U+002024: ONE DOT LEADER*/
- 0x2025, /* U+002025: TWO DOT LEADER*/
- 0x2026, /* U+002026: HORIZONTAL ELLIPSIS*/
- 0x2027, /* U+002027: HYPHENATION POINT*/
- 0x2028, /* U+002028: LINE SEPARATOR*/
- 0x2029, /* U+002029: PARAGRAPH SEPARATOR*/
- 0x202a, /* U+00202a: LEFT-TO-RIGHT EMBEDDING*/
- 0x202b, /* U+00202b: RIGHT-TO-LEFT EMBEDDING*/
- 0x202c, /* U+00202c: POP DIRECTIONAL FORMATTING*/
- 0x202d, /* U+00202d: LEFT-TO-RIGHT OVERRIDE*/
- 0x202e, /* U+00202e: RIGHT-TO-LEFT OVERRIDE*/
- 0x202f, /* U+00202f: NARROW NO-BREAK SPACE*/
- 0x2030, /* U+002030: PER MILLE SIGN*/
- 0x2031, /* U+002031: PER TEN THOUSAND SIGN*/
- 0x2032, /* U+002032: PRIME*/
- 0x2033, /* U+002033: DOUBLE PRIME*/
- 0x2034, /* U+002034: TRIPLE PRIME*/
- 0x2035, /* U+002035: REVERSED PRIME*/
- 0x2036, /* U+002036: REVERSED DOUBLE PRIME*/
- 0x2037, /* U+002037: REVERSED TRIPLE PRIME*/
- 0x2038, /* U+002038: CARET*/
- 0x2039, /* U+002039: SINGLE LEFT-POINTING ANGLE QUOTATION MARK*/
- 0x203a, /* U+00203a: SINGLE RIGHT-POINTING ANGLE QUOTATION MARK*/
- 0x203b, /* U+00203b: REFERENCE MARK*/
- 0x203c, /* U+00203c: DOUBLE EXCLAMATION MARK*/
- 0x203d, /* U+00203d: INTERROBANG*/
- 0x203e, /* U+00203e: OVERLINE*/
- 0x203f, /* U+00203f: UNDERTIE*/
- 0x2040, /* U+002040: CHARACTER TIE*/
- 0x2041, /* U+002041: CARET INSERTION POINT*/
- 0x2042, /* U+002042: ASTERISM*/
- 0x2043, /* U+002043: HYPHEN BULLET*/
- 0x2044, /* U+002044: FRACTION SLASH*/
- 0x2045, /* U+002045: LEFT SQUARE BRACKET WITH QUILL*/
- 0x2046, /* U+002046: RIGHT SQUARE BRACKET WITH QUILL*/
- 0x2047, /* U+002047: DOUBLE QUESTION MARK*/
- 0x2048, /* U+002048: QUESTION EXCLAMATION MARK*/
- 0x2049, /* U+002049: EXCLAMATION QUESTION MARK*/
- 0x204a, /* U+00204a: TIRONIAN SIGN ET*/
- 0x204b, /* U+00204b: REVERSED PILCROW SIGN*/
- 0x204c, /* U+00204c: BLACK LEFTWARDS BULLET*/
- 0x204d, /* U+00204d: BLACK RIGHTWARDS BULLET*/
- 0x204e, /* U+00204e: LOW ASTERISK*/
- 0x204f, /* U+00204f: REVERSED SEMICOLON*/
- 0x2050, /* U+002050: CLOSE UP*/
- 0x2051, /* U+002051: TWO ASTERISKS ALIGNED VERTICALLY*/
- 0x2052, /* U+002052: COMMERCIAL MINUS SIGN*/
- 0x2053, /* U+002053: SWUNG DASH*/
- 0x2054, /* U+002054: INVERTED UNDERTIE*/
- 0x2055, /* U+002055: FLOWER PUNCTUATION MARK*/
- 0x2056, /* U+002056: THREE DOT PUNCTUATION*/
- 0x2057, /* U+002057: QUADRUPLE PRIME*/
- 0x2058, /* U+002058: FOUR DOT PUNCTUATION*/
- 0x2059, /* U+002059: FIVE DOT PUNCTUATION*/
- 0x205a, /* U+00205a: TWO DOT PUNCTUATION*/
- 0x205b, /* U+00205b: FOUR DOT MARK*/
- 0x205c, /* U+00205c: DOTTED CROSS*/
- 0x205d, /* U+00205d: TRICOLON*/
- 0x205e, /* U+00205e: VERTICAL FOUR DOTS*/
- 0x205f, /* U+00205f: MEDIUM MATHEMATICAL SPACE*/
- 0x2060, /* U+002060: WORD JOINER*/
- 0x2061, /* U+002061: FUNCTION APPLICATION*/
- 0x2062, /* U+002062: INVISIBLE TIMES*/
- 0x2063, /* U+002063: INVISIBLE SEPARATOR*/
- 0x2064, /* U+002064: */
- 0x2065, /* U+002065: */
- 0x2066, /* U+002066: */
- 0x2067, /* U+002067: */
- 0x2068, /* U+002068: */
- 0x2069, /* U+002069: */
- 0x206a, /* U+00206a: INHIBIT SYMMETRIC SWAPPING*/
- 0x206b, /* U+00206b: ACTIVATE SYMMETRIC SWAPPING*/
- 0x206c, /* U+00206c: INHIBIT ARABIC FORM SHAPING*/
- 0x206d, /* U+00206d: ACTIVATE ARABIC FORM SHAPING*/
- 0x206e, /* U+00206e: NATIONAL DIGIT SHAPES*/
- 0x206f, /* U+00206f: NOMINAL DIGIT SHAPES*/
- 0x2070, /* U+002070: SUPERSCRIPT ZERO*/
- 0x2071, /* U+002071: SUPERSCRIPT LATIN SMALL LETTER I*/
- 0x2072, /* U+002072: */
- 0x2073, /* U+002073: */
- 0x2074, /* U+002074: SUPERSCRIPT FOUR*/
- 0x2075, /* U+002075: SUPERSCRIPT FIVE*/
- 0x2076, /* U+002076: SUPERSCRIPT SIX*/
- 0x2077, /* U+002077: SUPERSCRIPT SEVEN*/
- 0x2078, /* U+002078: SUPERSCRIPT EIGHT*/
- 0x2079, /* U+002079: SUPERSCRIPT NINE*/
- 0x207a, /* U+00207a: SUPERSCRIPT PLUS SIGN*/
- 0x207b, /* U+00207b: SUPERSCRIPT MINUS*/
- 0x207c, /* U+00207c: SUPERSCRIPT EQUALS SIGN*/
- 0x207d, /* U+00207d: SUPERSCRIPT LEFT PARENTHESIS*/
- 0x207e, /* U+00207e: SUPERSCRIPT RIGHT PARENTHESIS*/
- 0x207f, /* U+00207f: SUPERSCRIPT LATIN SMALL LETTER N*/
- 0x2080, /* U+002080: SUBSCRIPT ZERO*/
- 0x2081, /* U+002081: SUBSCRIPT ONE*/
- 0x2082, /* U+002082: SUBSCRIPT TWO*/
- 0x2083, /* U+002083: SUBSCRIPT THREE*/
- 0x2084, /* U+002084: SUBSCRIPT FOUR*/
- 0x2085, /* U+002085: SUBSCRIPT FIVE*/
- 0x2086, /* U+002086: SUBSCRIPT SIX*/
- 0x2087, /* U+002087: SUBSCRIPT SEVEN*/
- 0x2088, /* U+002088: SUBSCRIPT EIGHT*/
- 0x2089, /* U+002089: SUBSCRIPT NINE*/
- 0x208a, /* U+00208a: SUBSCRIPT PLUS SIGN*/
- 0x208b, /* U+00208b: SUBSCRIPT MINUS*/
- 0x208c, /* U+00208c: SUBSCRIPT EQUALS SIGN*/
- 0x208d, /* U+00208d: SUBSCRIPT LEFT PARENTHESIS*/
- 0x208e, /* U+00208e: SUBSCRIPT RIGHT PARENTHESIS*/
- 0x208f, /* U+00208f: */
- 0x2090, /* U+002090: LATIN SUBSCRIPT SMALL LETTER A*/
- 0x2091, /* U+002091: LATIN SUBSCRIPT SMALL LETTER E*/
- 0x2092, /* U+002092: LATIN SUBSCRIPT SMALL LETTER O*/
- 0x2093, /* U+002093: LATIN SUBSCRIPT SMALL LETTER X*/
- 0x2094, /* U+002094: LATIN SUBSCRIPT SMALL LETTER SCHWA*/
- 0x2095, /* U+002095: */
- 0x2096, /* U+002096: */
- 0x2097, /* U+002097: */
- 0x2098, /* U+002098: */
- 0x2099, /* U+002099: */
- 0x209a, /* U+00209a: */
- 0x209b, /* U+00209b: */
- 0x209c, /* U+00209c: */
- 0x209d, /* U+00209d: */
- 0x209e, /* U+00209e: */
- 0x209f, /* U+00209f: */
- 0x20a0, /* U+0020a0: EURO-CURRENCY SIGN*/
- 0x20a1, /* U+0020a1: COLON SIGN*/
- 0x20a2, /* U+0020a2: CRUZEIRO SIGN*/
- 0x20a3, /* U+0020a3: FRENCH FRANC SIGN*/
- 0x20a4, /* U+0020a4: LIRA SIGN*/
- 0x20a5, /* U+0020a5: MILL SIGN*/
- 0x20a6, /* U+0020a6: NAIRA SIGN*/
- 0x20a7, /* U+0020a7: PESETA SIGN*/
- 0x20a8, /* U+0020a8: RUPEE SIGN*/
- 0x20a9, /* U+0020a9: WON SIGN*/
- 0x20aa, /* U+0020aa: NEW SHEQEL SIGN*/
- 0x20ab, /* U+0020ab: DONG SIGN*/
- 0x20ac, /* U+0020ac: EURO SIGN*/
- 0x20ad, /* U+0020ad: KIP SIGN*/
- 0x20ae, /* U+0020ae: TUGRIK SIGN*/
- 0x20af, /* U+0020af: DRACHMA SIGN*/
- 0x20b0, /* U+0020b0: GERMAN PENNY SIGN*/
- 0x20b1, /* U+0020b1: PESO SIGN*/
- 0x20b2, /* U+0020b2: GUARANI SIGN*/
- 0x20b3, /* U+0020b3: AUSTRAL SIGN*/
- 0x20b4, /* U+0020b4: HRYVNIA SIGN*/
- 0x20b5, /* U+0020b5: CEDI SIGN*/
- 0x20b6, /* U+0020b6: */
- 0x20b7, /* U+0020b7: */
- 0x20b8, /* U+0020b8: */
- 0x20b9, /* U+0020b9: */
- 0x20ba, /* U+0020ba: */
- 0x20bb, /* U+0020bb: */
- 0x20bc, /* U+0020bc: */
- 0x20bd, /* U+0020bd: */
- 0x20be, /* U+0020be: */
- 0x20bf, /* U+0020bf: */
- 0x20c0, /* U+0020c0: */
- 0x20c1, /* U+0020c1: */
- 0x20c2, /* U+0020c2: */
- 0x20c3, /* U+0020c3: */
- 0x20c4, /* U+0020c4: */
- 0x20c5, /* U+0020c5: */
- 0x20c6, /* U+0020c6: */
- 0x20c7, /* U+0020c7: */
- 0x20c8, /* U+0020c8: */
- 0x20c9, /* U+0020c9: */
- 0x20ca, /* U+0020ca: */
- 0x20cb, /* U+0020cb: */
- 0x20cc, /* U+0020cc: */
- 0x20cd, /* U+0020cd: */
- 0x20ce, /* U+0020ce: */
- 0x20cf, /* U+0020cf: */
- 0x20d0, /* U+0020d0: COMBINING LEFT HARPOON ABOVE*/
- 0x20d1, /* U+0020d1: COMBINING RIGHT HARPOON ABOVE*/
- 0x20d2, /* U+0020d2: COMBINING LONG VERTICAL LINE OVERLAY*/
- 0x20d3, /* U+0020d3: COMBINING SHORT VERTICAL LINE OVERLAY*/
- 0x20d4, /* U+0020d4: COMBINING ANTICLOCKWISE ARROW ABOVE*/
- 0x20d5, /* U+0020d5: COMBINING CLOCKWISE ARROW ABOVE*/
- 0x20d6, /* U+0020d6: COMBINING LEFT ARROW ABOVE*/
- 0x20d7, /* U+0020d7: COMBINING RIGHT ARROW ABOVE*/
- 0x20d8, /* U+0020d8: COMBINING RING OVERLAY*/
- 0x20d9, /* U+0020d9: COMBINING CLOCKWISE RING OVERLAY*/
- 0x20da, /* U+0020da: COMBINING ANTICLOCKWISE RING OVERLAY*/
- 0x20db, /* U+0020db: COMBINING THREE DOTS ABOVE*/
- 0x20dc, /* U+0020dc: COMBINING FOUR DOTS ABOVE*/
- 0x20dd, /* U+0020dd: COMBINING ENCLOSING CIRCLE*/
- 0x20de, /* U+0020de: COMBINING ENCLOSING SQUARE*/
- 0x20df, /* U+0020df: COMBINING ENCLOSING DIAMOND*/
- 0x20e0, /* U+0020e0: COMBINING ENCLOSING CIRCLE BACKSLASH*/
- 0x20e1, /* U+0020e1: COMBINING LEFT RIGHT ARROW ABOVE*/
- 0x20e2, /* U+0020e2: COMBINING ENCLOSING SCREEN*/
- 0x20e3, /* U+0020e3: COMBINING ENCLOSING KEYCAP*/
- 0x20e4, /* U+0020e4: COMBINING ENCLOSING UPWARD POINTING TRIANGLE*/
- 0x20e5, /* U+0020e5: COMBINING REVERSE SOLIDUS OVERLAY*/
- 0x20e6, /* U+0020e6: COMBINING DOUBLE VERTICAL STROKE OVERLAY*/
- 0x20e7, /* U+0020e7: COMBINING ANNUITY SYMBOL*/
- 0x20e8, /* U+0020e8: COMBINING TRIPLE UNDERDOT*/
- 0x20e9, /* U+0020e9: COMBINING WIDE BRIDGE ABOVE*/
- 0x20ea, /* U+0020ea: COMBINING LEFTWARDS ARROW OVERLAY*/
- 0x20eb, /* U+0020eb: COMBINING LONG DOUBLE SOLIDUS OVERLAY*/
- 0x20ec, /* U+0020ec: */
- 0x20ed, /* U+0020ed: */
- 0x20ee, /* U+0020ee: */
- 0x20ef, /* U+0020ef: */
- 0x20f0, /* U+0020f0: */
- 0x20f1, /* U+0020f1: */
- 0x20f2, /* U+0020f2: */
- 0x20f3, /* U+0020f3: */
- 0x20f4, /* U+0020f4: */
- 0x20f5, /* U+0020f5: */
- 0x20f6, /* U+0020f6: */
- 0x20f7, /* U+0020f7: */
- 0x20f8, /* U+0020f8: */
- 0x20f9, /* U+0020f9: */
- 0x20fa, /* U+0020fa: */
- 0x20fb, /* U+0020fb: */
- 0x20fc, /* U+0020fc: */
- 0x20fd, /* U+0020fd: */
- 0x20fe, /* U+0020fe: */
- 0x20ff, /* U+0020ff: */
- 0x2100, /* U+002100: ACCOUNT OF*/
- 0x2101, /* U+002101: ADDRESSED TO THE SUBJECT*/
- 0x2102, /* U+002102: DOUBLE-STRUCK CAPITAL C*/
- 0x2103, /* U+002103: DEGREE CELSIUS*/
- 0x2104, /* U+002104: CENTRE LINE SYMBOL*/
- 0x2105, /* U+002105: CARE OF*/
- 0x2106, /* U+002106: CADA UNA*/
- 0x2107, /* U+002107: EULER CONSTANT*/
- 0x2108, /* U+002108: SCRUPLE*/
- 0x2109, /* U+002109: DEGREE FAHRENHEIT*/
- 0x210a, /* U+00210a: SCRIPT SMALL G*/
- 0x210b, /* U+00210b: SCRIPT CAPITAL H*/
- 0x210c, /* U+00210c: BLACK-LETTER CAPITAL H*/
- 0x210d, /* U+00210d: DOUBLE-STRUCK CAPITAL H*/
- 0x210e, /* U+00210e: PLANCK CONSTANT*/
- 0x210f, /* U+00210f: PLANCK CONSTANT OVER TWO PI*/
- 0x2110, /* U+002110: SCRIPT CAPITAL I*/
- 0x2111, /* U+002111: BLACK-LETTER CAPITAL I*/
- 0x2112, /* U+002112: SCRIPT CAPITAL L*/
- 0x2113, /* U+002113: SCRIPT SMALL L*/
- 0x2114, /* U+002114: L B BAR SYMBOL*/
- 0x2115, /* U+002115: DOUBLE-STRUCK CAPITAL N*/
- 0x2116, /* U+002116: NUMERO SIGN*/
- 0x2117, /* U+002117: SOUND RECORDING COPYRIGHT*/
- 0x2118, /* U+002118: SCRIPT CAPITAL P*/
- 0x2119, /* U+002119: DOUBLE-STRUCK CAPITAL P*/
- 0x211a, /* U+00211a: DOUBLE-STRUCK CAPITAL Q*/
- 0x211b, /* U+00211b: SCRIPT CAPITAL R*/
- 0x211c, /* U+00211c: BLACK-LETTER CAPITAL R*/
- 0x211d, /* U+00211d: DOUBLE-STRUCK CAPITAL R*/
- 0x211e, /* U+00211e: PRESCRIPTION TAKE*/
- 0x211f, /* U+00211f: RESPONSE*/
- 0x2120, /* U+002120: SERVICE MARK*/
- 0x2121, /* U+002121: TELEPHONE SIGN*/
- 0x2122, /* U+002122: TRADE MARK SIGN*/
- 0x2123, /* U+002123: VERSICLE*/
- 0x2124, /* U+002124: DOUBLE-STRUCK CAPITAL Z*/
- 0x2125, /* U+002125: OUNCE SIGN*/
- 0x2126, /* U+002126: OHM SIGN*/
- 0x2127, /* U+002127: INVERTED OHM SIGN*/
- 0x2128, /* U+002128: BLACK-LETTER CAPITAL Z*/
- 0x2129, /* U+002129: TURNED GREEK SMALL LETTER IOTA*/
- 0x212a, /* U+00212a: KELVIN SIGN*/
- 0x212b, /* U+00212b: ANGSTROM SIGN*/
- 0x212c, /* U+00212c: SCRIPT CAPITAL B*/
- 0x212d, /* U+00212d: BLACK-LETTER CAPITAL C*/
- 0x212e, /* U+00212e: ESTIMATED SYMBOL*/
- 0x212f, /* U+00212f: SCRIPT SMALL E*/
- 0x2130, /* U+002130: SCRIPT CAPITAL E*/
- 0x2131, /* U+002131: SCRIPT CAPITAL F*/
- 0x2132, /* U+002132: TURNED CAPITAL F*/
- 0x2133, /* U+002133: SCRIPT CAPITAL M*/
- 0x2134, /* U+002134: SCRIPT SMALL O*/
- 0x2135, /* U+002135: ALEF SYMBOL*/
- 0x2136, /* U+002136: BET SYMBOL*/
- 0x2137, /* U+002137: GIMEL SYMBOL*/
- 0x2138, /* U+002138: DALET SYMBOL*/
- 0x2139, /* U+002139: INFORMATION SOURCE*/
- 0x213a, /* U+00213a: ROTATED CAPITAL Q*/
- 0x213b, /* U+00213b: FACSIMILE SIGN*/
- 0x213c, /* U+00213c: DOUBLE-STRUCK SMALL PI*/
- 0x213d, /* U+00213d: DOUBLE-STRUCK SMALL GAMMA*/
- 0x213e, /* U+00213e: DOUBLE-STRUCK CAPITAL GAMMA*/
- 0x213f, /* U+00213f: DOUBLE-STRUCK CAPITAL PI*/
- 0x2140, /* U+002140: DOUBLE-STRUCK N-ARY SUMMATION*/
- 0x2141, /* U+002141: TURNED SANS-SERIF CAPITAL G*/
- 0x2142, /* U+002142: TURNED SANS-SERIF CAPITAL L*/
- 0x2143, /* U+002143: REVERSED SANS-SERIF CAPITAL L*/
- 0x2144, /* U+002144: TURNED SANS-SERIF CAPITAL Y*/
- 0x2145, /* U+002145: DOUBLE-STRUCK ITALIC CAPITAL D*/
- 0x2146, /* U+002146: DOUBLE-STRUCK ITALIC SMALL D*/
- 0x2147, /* U+002147: DOUBLE-STRUCK ITALIC SMALL E*/
- 0x2148, /* U+002148: DOUBLE-STRUCK ITALIC SMALL I*/
- 0x2149, /* U+002149: DOUBLE-STRUCK ITALIC SMALL J*/
- 0x214a, /* U+00214a: PROPERTY LINE*/
- 0x214b, /* U+00214b: TURNED AMPERSAND*/
- 0x214c, /* U+00214c: PER SIGN*/
- 0x214d, /* U+00214d: */
- 0x214e, /* U+00214e: */
- 0x214f, /* U+00214f: */
- 0x2150, /* U+002150: */
- 0x2151, /* U+002151: */
- 0x2152, /* U+002152: */
- 0x2153, /* U+002153: VULGAR FRACTION ONE THIRD*/
- 0x2154, /* U+002154: VULGAR FRACTION TWO THIRDS*/
- 0x2155, /* U+002155: VULGAR FRACTION ONE FIFTH*/
- 0x2156, /* U+002156: VULGAR FRACTION TWO FIFTHS*/
- 0x2157, /* U+002157: VULGAR FRACTION THREE FIFTHS*/
- 0x2158, /* U+002158: VULGAR FRACTION FOUR FIFTHS*/
- 0x2159, /* U+002159: VULGAR FRACTION ONE SIXTH*/
- 0x215a, /* U+00215a: VULGAR FRACTION FIVE SIXTHS*/
- 0x215b, /* U+00215b: VULGAR FRACTION ONE EIGHTH*/
- 0x215c, /* U+00215c: VULGAR FRACTION THREE EIGHTHS*/
- 0x215d, /* U+00215d: VULGAR FRACTION FIVE EIGHTHS*/
- 0x215e, /* U+00215e: VULGAR FRACTION SEVEN EIGHTHS*/
- 0x215f, /* U+00215f: FRACTION NUMERATOR ONE*/
- 0x2160, /* U+002160: ROMAN NUMERAL ONE*/
- 0x2161, /* U+002161: ROMAN NUMERAL TWO*/
- 0x2162, /* U+002162: ROMAN NUMERAL THREE*/
- 0x2163, /* U+002163: ROMAN NUMERAL FOUR*/
- 0x2164, /* U+002164: ROMAN NUMERAL FIVE*/
- 0x2165, /* U+002165: ROMAN NUMERAL SIX*/
- 0x2166, /* U+002166: ROMAN NUMERAL SEVEN*/
- 0x2167, /* U+002167: ROMAN NUMERAL EIGHT*/
- 0x2168, /* U+002168: ROMAN NUMERAL NINE*/
- 0x2169, /* U+002169: ROMAN NUMERAL TEN*/
- 0x216a, /* U+00216a: ROMAN NUMERAL ELEVEN*/
- 0x216b, /* U+00216b: ROMAN NUMERAL TWELVE*/
- 0x216c, /* U+00216c: ROMAN NUMERAL FIFTY*/
- 0x216d, /* U+00216d: ROMAN NUMERAL ONE HUNDRED*/
- 0x216e, /* U+00216e: ROMAN NUMERAL FIVE HUNDRED*/
- 0x216f, /* U+00216f: ROMAN NUMERAL ONE THOUSAND*/
- 0x2160, /* U+002170: SMALL ROMAN NUMERAL ONE*/
- 0x2161, /* U+002171: SMALL ROMAN NUMERAL TWO*/
- 0x2162, /* U+002172: SMALL ROMAN NUMERAL THREE*/
- 0x2163, /* U+002173: SMALL ROMAN NUMERAL FOUR*/
- 0x2164, /* U+002174: SMALL ROMAN NUMERAL FIVE*/
- 0x2165, /* U+002175: SMALL ROMAN NUMERAL SIX*/
- 0x2166, /* U+002176: SMALL ROMAN NUMERAL SEVEN*/
- 0x2167, /* U+002177: SMALL ROMAN NUMERAL EIGHT*/
- 0x2168, /* U+002178: SMALL ROMAN NUMERAL NINE*/
- 0x2169, /* U+002179: SMALL ROMAN NUMERAL TEN*/
- 0x216a, /* U+00217a: SMALL ROMAN NUMERAL ELEVEN*/
- 0x216b, /* U+00217b: SMALL ROMAN NUMERAL TWELVE*/
- 0x216c, /* U+00217c: SMALL ROMAN NUMERAL FIFTY*/
- 0x216d, /* U+00217d: SMALL ROMAN NUMERAL ONE HUNDRED*/
- 0x216e, /* U+00217e: SMALL ROMAN NUMERAL FIVE HUNDRED*/
- 0x216f, /* U+00217f: SMALL ROMAN NUMERAL ONE THOUSAND*/
- 0x2180, /* U+002180: ROMAN NUMERAL ONE THOUSAND C D*/
- 0x2181, /* U+002181: ROMAN NUMERAL FIVE THOUSAND*/
- 0x2182, /* U+002182: ROMAN NUMERAL TEN THOUSAND*/
- 0x2183, /* U+002183: ROMAN NUMERAL REVERSED ONE HUNDRED*/
- 0x2184, /* U+002184: */
- 0x2185, /* U+002185: */
- 0x2186, /* U+002186: */
- 0x2187, /* U+002187: */
- 0x2188, /* U+002188: */
- 0x2189, /* U+002189: */
- 0x218a, /* U+00218a: */
- 0x218b, /* U+00218b: */
- 0x218c, /* U+00218c: */
- 0x218d, /* U+00218d: */
- 0x218e, /* U+00218e: */
- 0x218f, /* U+00218f: */
- 0x2190, /* U+002190: LEFTWARDS ARROW*/
- 0x2191, /* U+002191: UPWARDS ARROW*/
- 0x2192, /* U+002192: RIGHTWARDS ARROW*/
- 0x2193, /* U+002193: DOWNWARDS ARROW*/
- 0x2194, /* U+002194: LEFT RIGHT ARROW*/
- 0x2195, /* U+002195: UP DOWN ARROW*/
- 0x2196, /* U+002196: NORTH WEST ARROW*/
- 0x2197, /* U+002197: NORTH EAST ARROW*/
- 0x2198, /* U+002198: SOUTH EAST ARROW*/
- 0x2199, /* U+002199: SOUTH WEST ARROW*/
- 0x219a, /* U+00219a: LEFTWARDS ARROW WITH STROKE*/
- 0x219b, /* U+00219b: RIGHTWARDS ARROW WITH STROKE*/
- 0x219c, /* U+00219c: LEFTWARDS WAVE ARROW*/
- 0x219d, /* U+00219d: RIGHTWARDS WAVE ARROW*/
- 0x219e, /* U+00219e: LEFTWARDS TWO HEADED ARROW*/
- 0x219f, /* U+00219f: UPWARDS TWO HEADED ARROW*/
- 0x21a0, /* U+0021a0: RIGHTWARDS TWO HEADED ARROW*/
- 0x21a1, /* U+0021a1: DOWNWARDS TWO HEADED ARROW*/
- 0x21a2, /* U+0021a2: LEFTWARDS ARROW WITH TAIL*/
- 0x21a3, /* U+0021a3: RIGHTWARDS ARROW WITH TAIL*/
- 0x21a4, /* U+0021a4: LEFTWARDS ARROW FROM BAR*/
- 0x21a5, /* U+0021a5: UPWARDS ARROW FROM BAR*/
- 0x21a6, /* U+0021a6: RIGHTWARDS ARROW FROM BAR*/
- 0x21a7, /* U+0021a7: DOWNWARDS ARROW FROM BAR*/
- 0x21a8, /* U+0021a8: UP DOWN ARROW WITH BASE*/
- 0x21a9, /* U+0021a9: LEFTWARDS ARROW WITH HOOK*/
- 0x21aa, /* U+0021aa: RIGHTWARDS ARROW WITH HOOK*/
- 0x21ab, /* U+0021ab: LEFTWARDS ARROW WITH LOOP*/
- 0x21ac, /* U+0021ac: RIGHTWARDS ARROW WITH LOOP*/
- 0x21ad, /* U+0021ad: LEFT RIGHT WAVE ARROW*/
- 0x21ae, /* U+0021ae: LEFT RIGHT ARROW WITH STROKE*/
- 0x21af, /* U+0021af: DOWNWARDS ZIGZAG ARROW*/
- 0x21b0, /* U+0021b0: UPWARDS ARROW WITH TIP LEFTWARDS*/
- 0x21b1, /* U+0021b1: UPWARDS ARROW WITH TIP RIGHTWARDS*/
- 0x21b2, /* U+0021b2: DOWNWARDS ARROW WITH TIP LEFTWARDS*/
- 0x21b3, /* U+0021b3: DOWNWARDS ARROW WITH TIP RIGHTWARDS*/
- 0x21b4, /* U+0021b4: RIGHTWARDS ARROW WITH CORNER DOWNWARDS*/
- 0x21b5, /* U+0021b5: DOWNWARDS ARROW WITH CORNER LEFTWARDS*/
- 0x21b6, /* U+0021b6: ANTICLOCKWISE TOP SEMICIRCLE ARROW*/
- 0x21b7, /* U+0021b7: CLOCKWISE TOP SEMICIRCLE ARROW*/
- 0x21b8, /* U+0021b8: NORTH WEST ARROW TO LONG BAR*/
- 0x21b9, /* U+0021b9: LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR*/
- 0x21ba, /* U+0021ba: ANTICLOCKWISE OPEN CIRCLE ARROW*/
- 0x21bb, /* U+0021bb: CLOCKWISE OPEN CIRCLE ARROW*/
- 0x21bc, /* U+0021bc: LEFTWARDS HARPOON WITH BARB UPWARDS*/
- 0x21bd, /* U+0021bd: LEFTWARDS HARPOON WITH BARB DOWNWARDS*/
- 0x21be, /* U+0021be: UPWARDS HARPOON WITH BARB RIGHTWARDS*/
- 0x21bf, /* U+0021bf: UPWARDS HARPOON WITH BARB LEFTWARDS*/
- 0x21c0, /* U+0021c0: RIGHTWARDS HARPOON WITH BARB UPWARDS*/
- 0x21c1, /* U+0021c1: RIGHTWARDS HARPOON WITH BARB DOWNWARDS*/
- 0x21c2, /* U+0021c2: DOWNWARDS HARPOON WITH BARB RIGHTWARDS*/
- 0x21c3, /* U+0021c3: DOWNWARDS HARPOON WITH BARB LEFTWARDS*/
- 0x21c4, /* U+0021c4: RIGHTWARDS ARROW OVER LEFTWARDS ARROW*/
- 0x21c5, /* U+0021c5: UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW*/
- 0x21c6, /* U+0021c6: LEFTWARDS ARROW OVER RIGHTWARDS ARROW*/
- 0x21c7, /* U+0021c7: LEFTWARDS PAIRED ARROWS*/
- 0x21c8, /* U+0021c8: UPWARDS PAIRED ARROWS*/
- 0x21c9, /* U+0021c9: RIGHTWARDS PAIRED ARROWS*/
- 0x21ca, /* U+0021ca: DOWNWARDS PAIRED ARROWS*/
- 0x21cb, /* U+0021cb: LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON*/
- 0x21cc, /* U+0021cc: RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON*/
- 0x21cd, /* U+0021cd: LEFTWARDS DOUBLE ARROW WITH STROKE*/
- 0x21ce, /* U+0021ce: LEFT RIGHT DOUBLE ARROW WITH STROKE*/
- 0x21cf, /* U+0021cf: RIGHTWARDS DOUBLE ARROW WITH STROKE*/
- 0x21d0, /* U+0021d0: LEFTWARDS DOUBLE ARROW*/
- 0x21d1, /* U+0021d1: UPWARDS DOUBLE ARROW*/
- 0x21d2, /* U+0021d2: RIGHTWARDS DOUBLE ARROW*/
- 0x21d3, /* U+0021d3: DOWNWARDS DOUBLE ARROW*/
- 0x21d4, /* U+0021d4: LEFT RIGHT DOUBLE ARROW*/
- 0x21d5, /* U+0021d5: UP DOWN DOUBLE ARROW*/
- 0x21d6, /* U+0021d6: NORTH WEST DOUBLE ARROW*/
- 0x21d7, /* U+0021d7: NORTH EAST DOUBLE ARROW*/
- 0x21d8, /* U+0021d8: SOUTH EAST DOUBLE ARROW*/
- 0x21d9, /* U+0021d9: SOUTH WEST DOUBLE ARROW*/
- 0x21da, /* U+0021da: LEFTWARDS TRIPLE ARROW*/
- 0x21db, /* U+0021db: RIGHTWARDS TRIPLE ARROW*/
- 0x21dc, /* U+0021dc: LEFTWARDS SQUIGGLE ARROW*/
- 0x21dd, /* U+0021dd: RIGHTWARDS SQUIGGLE ARROW*/
- 0x21de, /* U+0021de: UPWARDS ARROW WITH DOUBLE STROKE*/
- 0x21df, /* U+0021df: DOWNWARDS ARROW WITH DOUBLE STROKE*/
- 0x21e0, /* U+0021e0: LEFTWARDS DASHED ARROW*/
- 0x21e1, /* U+0021e1: UPWARDS DASHED ARROW*/
- 0x21e2, /* U+0021e2: RIGHTWARDS DASHED ARROW*/
- 0x21e3, /* U+0021e3: DOWNWARDS DASHED ARROW*/
- 0x21e4, /* U+0021e4: LEFTWARDS ARROW TO BAR*/
- 0x21e5, /* U+0021e5: RIGHTWARDS ARROW TO BAR*/
- 0x21e6, /* U+0021e6: LEFTWARDS WHITE ARROW*/
- 0x21e7, /* U+0021e7: UPWARDS WHITE ARROW*/
- 0x21e8, /* U+0021e8: RIGHTWARDS WHITE ARROW*/
- 0x21e9, /* U+0021e9: DOWNWARDS WHITE ARROW*/
- 0x21ea, /* U+0021ea: UPWARDS WHITE ARROW FROM BAR*/
- 0x21eb, /* U+0021eb: UPWARDS WHITE ARROW ON PEDESTAL*/
- 0x21ec, /* U+0021ec: UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR*/
- 0x21ed, /* U+0021ed: UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR*/
- 0x21ee, /* U+0021ee: UPWARDS WHITE DOUBLE ARROW*/
- 0x21ef, /* U+0021ef: UPWARDS WHITE DOUBLE ARROW ON PEDESTAL*/
- 0x21f0, /* U+0021f0: RIGHTWARDS WHITE ARROW FROM WALL*/
- 0x21f1, /* U+0021f1: NORTH WEST ARROW TO CORNER*/
- 0x21f2, /* U+0021f2: SOUTH EAST ARROW TO CORNER*/
- 0x21f3, /* U+0021f3: UP DOWN WHITE ARROW*/
- 0x21f4, /* U+0021f4: RIGHT ARROW WITH SMALL CIRCLE*/
- 0x21f5, /* U+0021f5: DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW*/
- 0x21f6, /* U+0021f6: THREE RIGHTWARDS ARROWS*/
- 0x21f7, /* U+0021f7: LEFTWARDS ARROW WITH VERTICAL STROKE*/
- 0x21f8, /* U+0021f8: RIGHTWARDS ARROW WITH VERTICAL STROKE*/
- 0x21f9, /* U+0021f9: LEFT RIGHT ARROW WITH VERTICAL STROKE*/
- 0x21fa, /* U+0021fa: LEFTWARDS ARROW WITH DOUBLE VERTICAL STROKE*/
- 0x21fb, /* U+0021fb: RIGHTWARDS ARROW WITH DOUBLE VERTICAL STROKE*/
- 0x21fc, /* U+0021fc: LEFT RIGHT ARROW WITH DOUBLE VERTICAL STROKE*/
- 0x21fd, /* U+0021fd: LEFTWARDS OPEN-HEADED ARROW*/
- 0x21fe, /* U+0021fe: RIGHTWARDS OPEN-HEADED ARROW*/
- 0x21ff, /* U+0021ff: LEFT RIGHT OPEN-HEADED ARROW*/
- 0x2200, /* U+002200: FOR ALL*/
- 0x2201, /* U+002201: COMPLEMENT*/
- 0x2202, /* U+002202: PARTIAL DIFFERENTIAL*/
- 0x2203, /* U+002203: THERE EXISTS*/
- 0x2204, /* U+002204: THERE DOES NOT EXIST*/
- 0x2205, /* U+002205: EMPTY SET*/
- 0x2206, /* U+002206: INCREMENT*/
- 0x2207, /* U+002207: NABLA*/
- 0x2208, /* U+002208: ELEMENT OF*/
- 0x2209, /* U+002209: NOT AN ELEMENT OF*/
- 0x220a, /* U+00220a: SMALL ELEMENT OF*/
- 0x220b, /* U+00220b: CONTAINS AS MEMBER*/
- 0x220c, /* U+00220c: DOES NOT CONTAIN AS MEMBER*/
- 0x220d, /* U+00220d: SMALL CONTAINS AS MEMBER*/
- 0x220e, /* U+00220e: END OF PROOF*/
- 0x220f, /* U+00220f: N-ARY PRODUCT*/
- 0x2210, /* U+002210: N-ARY COPRODUCT*/
- 0x2211, /* U+002211: N-ARY SUMMATION*/
- 0x2212, /* U+002212: MINUS SIGN*/
- 0x2213, /* U+002213: MINUS-OR-PLUS SIGN*/
- 0x2214, /* U+002214: DOT PLUS*/
- 0x2215, /* U+002215: DIVISION SLASH*/
- 0x2216, /* U+002216: SET MINUS*/
- 0x2217, /* U+002217: ASTERISK OPERATOR*/
- 0x2218, /* U+002218: RING OPERATOR*/
- 0x2219, /* U+002219: BULLET OPERATOR*/
- 0x221a, /* U+00221a: SQUARE ROOT*/
- 0x221b, /* U+00221b: CUBE ROOT*/
- 0x221c, /* U+00221c: FOURTH ROOT*/
- 0x221d, /* U+00221d: PROPORTIONAL TO*/
- 0x221e, /* U+00221e: INFINITY*/
- 0x221f, /* U+00221f: RIGHT ANGLE*/
- 0x2220, /* U+002220: ANGLE*/
- 0x2221, /* U+002221: MEASURED ANGLE*/
- 0x2222, /* U+002222: SPHERICAL ANGLE*/
- 0x2223, /* U+002223: DIVIDES*/
- 0x2224, /* U+002224: DOES NOT DIVIDE*/
- 0x2225, /* U+002225: PARALLEL TO*/
- 0x2226, /* U+002226: NOT PARALLEL TO*/
- 0x2227, /* U+002227: LOGICAL AND*/
- 0x2228, /* U+002228: LOGICAL OR*/
- 0x2229, /* U+002229: INTERSECTION*/
- 0x222a, /* U+00222a: UNION*/
- 0x222b, /* U+00222b: INTEGRAL*/
- 0x222c, /* U+00222c: DOUBLE INTEGRAL*/
- 0x222d, /* U+00222d: TRIPLE INTEGRAL*/
- 0x222e, /* U+00222e: CONTOUR INTEGRAL*/
- 0x222f, /* U+00222f: SURFACE INTEGRAL*/
- 0x2230, /* U+002230: VOLUME INTEGRAL*/
- 0x2231, /* U+002231: CLOCKWISE INTEGRAL*/
- 0x2232, /* U+002232: CLOCKWISE CONTOUR INTEGRAL*/
- 0x2233, /* U+002233: ANTICLOCKWISE CONTOUR INTEGRAL*/
- 0x2234, /* U+002234: THEREFORE*/
- 0x2235, /* U+002235: BECAUSE*/
- 0x2236, /* U+002236: RATIO*/
- 0x2237, /* U+002237: PROPORTION*/
- 0x2238, /* U+002238: DOT MINUS*/
- 0x2239, /* U+002239: EXCESS*/
- 0x223a, /* U+00223a: GEOMETRIC PROPORTION*/
- 0x223b, /* U+00223b: HOMOTHETIC*/
- 0x223c, /* U+00223c: TILDE OPERATOR*/
- 0x223d, /* U+00223d: REVERSED TILDE*/
- 0x223e, /* U+00223e: INVERTED LAZY S*/
- 0x223f, /* U+00223f: SINE WAVE*/
- 0x2240, /* U+002240: WREATH PRODUCT*/
- 0x2241, /* U+002241: NOT TILDE*/
- 0x2242, /* U+002242: MINUS TILDE*/
- 0x2243, /* U+002243: ASYMPTOTICALLY EQUAL TO*/
- 0x2244, /* U+002244: NOT ASYMPTOTICALLY EQUAL TO*/
- 0x2245, /* U+002245: APPROXIMATELY EQUAL TO*/
- 0x2246, /* U+002246: APPROXIMATELY BUT NOT ACTUALLY EQUAL TO*/
- 0x2247, /* U+002247: NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO*/
- 0x2248, /* U+002248: ALMOST EQUAL TO*/
- 0x2249, /* U+002249: NOT ALMOST EQUAL TO*/
- 0x224a, /* U+00224a: ALMOST EQUAL OR EQUAL TO*/
- 0x224b, /* U+00224b: TRIPLE TILDE*/
- 0x224c, /* U+00224c: ALL EQUAL TO*/
- 0x224d, /* U+00224d: EQUIVALENT TO*/
- 0x224e, /* U+00224e: GEOMETRICALLY EQUIVALENT TO*/
- 0x224f, /* U+00224f: DIFFERENCE BETWEEN*/
- 0x2250, /* U+002250: APPROACHES THE LIMIT*/
- 0x2251, /* U+002251: GEOMETRICALLY EQUAL TO*/
- 0x2252, /* U+002252: APPROXIMATELY EQUAL TO OR THE IMAGE OF*/
- 0x2253, /* U+002253: IMAGE OF OR APPROXIMATELY EQUAL TO*/
- 0x2254, /* U+002254: COLON EQUALS*/
- 0x2255, /* U+002255: EQUALS COLON*/
- 0x2256, /* U+002256: RING IN EQUAL TO*/
- 0x2257, /* U+002257: RING EQUAL TO*/
- 0x2258, /* U+002258: CORRESPONDS TO*/
- 0x2259, /* U+002259: ESTIMATES*/
- 0x225a, /* U+00225a: EQUIANGULAR TO*/
- 0x225b, /* U+00225b: STAR EQUALS*/
- 0x225c, /* U+00225c: DELTA EQUAL TO*/
- 0x225d, /* U+00225d: EQUAL TO BY DEFINITION*/
- 0x225e, /* U+00225e: MEASURED BY*/
- 0x225f, /* U+00225f: QUESTIONED EQUAL TO*/
- 0x2260, /* U+002260: NOT EQUAL TO*/
- 0x2261, /* U+002261: IDENTICAL TO*/
- 0x2262, /* U+002262: NOT IDENTICAL TO*/
- 0x2263, /* U+002263: STRICTLY EQUIVALENT TO*/
- 0x2264, /* U+002264: LESS-THAN OR EQUAL TO*/
- 0x2265, /* U+002265: GREATER-THAN OR EQUAL TO*/
- 0x2266, /* U+002266: LESS-THAN OVER EQUAL TO*/
- 0x2267, /* U+002267: GREATER-THAN OVER EQUAL TO*/
- 0x2268, /* U+002268: LESS-THAN BUT NOT EQUAL TO*/
- 0x2269, /* U+002269: GREATER-THAN BUT NOT EQUAL TO*/
- 0x226a, /* U+00226a: MUCH LESS-THAN*/
- 0x226b, /* U+00226b: MUCH GREATER-THAN*/
- 0x226c, /* U+00226c: BETWEEN*/
- 0x226d, /* U+00226d: NOT EQUIVALENT TO*/
- 0x226e, /* U+00226e: NOT LESS-THAN*/
- 0x226f, /* U+00226f: NOT GREATER-THAN*/
- 0x2270, /* U+002270: NEITHER LESS-THAN NOR EQUAL TO*/
- 0x2271, /* U+002271: NEITHER GREATER-THAN NOR EQUAL TO*/
- 0x2272, /* U+002272: LESS-THAN OR EQUIVALENT TO*/
- 0x2273, /* U+002273: GREATER-THAN OR EQUIVALENT TO*/
- 0x2274, /* U+002274: NEITHER LESS-THAN NOR EQUIVALENT TO*/
- 0x2275, /* U+002275: NEITHER GREATER-THAN NOR EQUIVALENT TO*/
- 0x2276, /* U+002276: LESS-THAN OR GREATER-THAN*/
- 0x2277, /* U+002277: GREATER-THAN OR LESS-THAN*/
- 0x2278, /* U+002278: NEITHER LESS-THAN NOR GREATER-THAN*/
- 0x2279, /* U+002279: NEITHER GREATER-THAN NOR LESS-THAN*/
- 0x227a, /* U+00227a: PRECEDES*/
- 0x227b, /* U+00227b: SUCCEEDS*/
- 0x227c, /* U+00227c: PRECEDES OR EQUAL TO*/
- 0x227d, /* U+00227d: SUCCEEDS OR EQUAL TO*/
- 0x227e, /* U+00227e: PRECEDES OR EQUIVALENT TO*/
- 0x227f, /* U+00227f: SUCCEEDS OR EQUIVALENT TO*/
- 0x2280, /* U+002280: DOES NOT PRECEDE*/
- 0x2281, /* U+002281: DOES NOT SUCCEED*/
- 0x2282, /* U+002282: SUBSET OF*/
- 0x2283, /* U+002283: SUPERSET OF*/
- 0x2284, /* U+002284: NOT A SUBSET OF*/
- 0x2285, /* U+002285: NOT A SUPERSET OF*/
- 0x2286, /* U+002286: SUBSET OF OR EQUAL TO*/
- 0x2287, /* U+002287: SUPERSET OF OR EQUAL TO*/
- 0x2288, /* U+002288: NEITHER A SUBSET OF NOR EQUAL TO*/
- 0x2289, /* U+002289: NEITHER A SUPERSET OF NOR EQUAL TO*/
- 0x228a, /* U+00228a: SUBSET OF WITH NOT EQUAL TO*/
- 0x228b, /* U+00228b: SUPERSET OF WITH NOT EQUAL TO*/
- 0x228c, /* U+00228c: MULTISET*/
- 0x228d, /* U+00228d: MULTISET MULTIPLICATION*/
- 0x228e, /* U+00228e: MULTISET UNION*/
- 0x228f, /* U+00228f: SQUARE IMAGE OF*/
- 0x2290, /* U+002290: SQUARE ORIGINAL OF*/
- 0x2291, /* U+002291: SQUARE IMAGE OF OR EQUAL TO*/
- 0x2292, /* U+002292: SQUARE ORIGINAL OF OR EQUAL TO*/
- 0x2293, /* U+002293: SQUARE CAP*/
- 0x2294, /* U+002294: SQUARE CUP*/
- 0x2295, /* U+002295: CIRCLED PLUS*/
- 0x2296, /* U+002296: CIRCLED MINUS*/
- 0x2297, /* U+002297: CIRCLED TIMES*/
- 0x2298, /* U+002298: CIRCLED DIVISION SLASH*/
- 0x2299, /* U+002299: CIRCLED DOT OPERATOR*/
- 0x229a, /* U+00229a: CIRCLED RING OPERATOR*/
- 0x229b, /* U+00229b: CIRCLED ASTERISK OPERATOR*/
- 0x229c, /* U+00229c: CIRCLED EQUALS*/
- 0x229d, /* U+00229d: CIRCLED DASH*/
- 0x229e, /* U+00229e: SQUARED PLUS*/
- 0x229f, /* U+00229f: SQUARED MINUS*/
- 0x22a0, /* U+0022a0: SQUARED TIMES*/
- 0x22a1, /* U+0022a1: SQUARED DOT OPERATOR*/
- 0x22a2, /* U+0022a2: RIGHT TACK*/
- 0x22a3, /* U+0022a3: LEFT TACK*/
- 0x22a4, /* U+0022a4: DOWN TACK*/
- 0x22a5, /* U+0022a5: UP TACK*/
- 0x22a6, /* U+0022a6: ASSERTION*/
- 0x22a7, /* U+0022a7: MODELS*/
- 0x22a8, /* U+0022a8: TRUE*/
- 0x22a9, /* U+0022a9: FORCES*/
- 0x22aa, /* U+0022aa: TRIPLE VERTICAL BAR RIGHT TURNSTILE*/
- 0x22ab, /* U+0022ab: DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE*/
- 0x22ac, /* U+0022ac: DOES NOT PROVE*/
- 0x22ad, /* U+0022ad: NOT TRUE*/
- 0x22ae, /* U+0022ae: DOES NOT FORCE*/
- 0x22af, /* U+0022af: NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE*/
- 0x22b0, /* U+0022b0: PRECEDES UNDER RELATION*/
- 0x22b1, /* U+0022b1: SUCCEEDS UNDER RELATION*/
- 0x22b2, /* U+0022b2: NORMAL SUBGROUP OF*/
- 0x22b3, /* U+0022b3: CONTAINS AS NORMAL SUBGROUP*/
- 0x22b4, /* U+0022b4: NORMAL SUBGROUP OF OR EQUAL TO*/
- 0x22b5, /* U+0022b5: CONTAINS AS NORMAL SUBGROUP OR EQUAL TO*/
- 0x22b6, /* U+0022b6: ORIGINAL OF*/
- 0x22b7, /* U+0022b7: IMAGE OF*/
- 0x22b8, /* U+0022b8: MULTIMAP*/
- 0x22b9, /* U+0022b9: HERMITIAN CONJUGATE MATRIX*/
- 0x22ba, /* U+0022ba: INTERCALATE*/
- 0x22bb, /* U+0022bb: XOR*/
- 0x22bc, /* U+0022bc: NAND*/
- 0x22bd, /* U+0022bd: NOR*/
- 0x22be, /* U+0022be: RIGHT ANGLE WITH ARC*/
- 0x22bf, /* U+0022bf: RIGHT TRIANGLE*/
- 0x22c0, /* U+0022c0: N-ARY LOGICAL AND*/
- 0x22c1, /* U+0022c1: N-ARY LOGICAL OR*/
- 0x22c2, /* U+0022c2: N-ARY INTERSECTION*/
- 0x22c3, /* U+0022c3: N-ARY UNION*/
- 0x22c4, /* U+0022c4: DIAMOND OPERATOR*/
- 0x22c5, /* U+0022c5: DOT OPERATOR*/
- 0x22c6, /* U+0022c6: STAR OPERATOR*/
- 0x22c7, /* U+0022c7: DIVISION TIMES*/
- 0x22c8, /* U+0022c8: BOWTIE*/
- 0x22c9, /* U+0022c9: LEFT NORMAL FACTOR SEMIDIRECT PRODUCT*/
- 0x22ca, /* U+0022ca: RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT*/
- 0x22cb, /* U+0022cb: LEFT SEMIDIRECT PRODUCT*/
- 0x22cc, /* U+0022cc: RIGHT SEMIDIRECT PRODUCT*/
- 0x22cd, /* U+0022cd: REVERSED TILDE EQUALS*/
- 0x22ce, /* U+0022ce: CURLY LOGICAL OR*/
- 0x22cf, /* U+0022cf: CURLY LOGICAL AND*/
- 0x22d0, /* U+0022d0: DOUBLE SUBSET*/
- 0x22d1, /* U+0022d1: DOUBLE SUPERSET*/
- 0x22d2, /* U+0022d2: DOUBLE INTERSECTION*/
- 0x22d3, /* U+0022d3: DOUBLE UNION*/
- 0x22d4, /* U+0022d4: PITCHFORK*/
- 0x22d5, /* U+0022d5: EQUAL AND PARALLEL TO*/
- 0x22d6, /* U+0022d6: LESS-THAN WITH DOT*/
- 0x22d7, /* U+0022d7: GREATER-THAN WITH DOT*/
- 0x22d8, /* U+0022d8: VERY MUCH LESS-THAN*/
- 0x22d9, /* U+0022d9: VERY MUCH GREATER-THAN*/
- 0x22da, /* U+0022da: LESS-THAN EQUAL TO OR GREATER-THAN*/
- 0x22db, /* U+0022db: GREATER-THAN EQUAL TO OR LESS-THAN*/
- 0x22dc, /* U+0022dc: EQUAL TO OR LESS-THAN*/
- 0x22dd, /* U+0022dd: EQUAL TO OR GREATER-THAN*/
- 0x22de, /* U+0022de: EQUAL TO OR PRECEDES*/
- 0x22df, /* U+0022df: EQUAL TO OR SUCCEEDS*/
- 0x22e0, /* U+0022e0: DOES NOT PRECEDE OR EQUAL*/
- 0x22e1, /* U+0022e1: DOES NOT SUCCEED OR EQUAL*/
- 0x22e2, /* U+0022e2: NOT SQUARE IMAGE OF OR EQUAL TO*/
- 0x22e3, /* U+0022e3: NOT SQUARE ORIGINAL OF OR EQUAL TO*/
- 0x22e4, /* U+0022e4: SQUARE IMAGE OF OR NOT EQUAL TO*/
- 0x22e5, /* U+0022e5: SQUARE ORIGINAL OF OR NOT EQUAL TO*/
- 0x22e6, /* U+0022e6: LESS-THAN BUT NOT EQUIVALENT TO*/
- 0x22e7, /* U+0022e7: GREATER-THAN BUT NOT EQUIVALENT TO*/
- 0x22e8, /* U+0022e8: PRECEDES BUT NOT EQUIVALENT TO*/
- 0x22e9, /* U+0022e9: SUCCEEDS BUT NOT EQUIVALENT TO*/
- 0x22ea, /* U+0022ea: NOT NORMAL SUBGROUP OF*/
- 0x22eb, /* U+0022eb: DOES NOT CONTAIN AS NORMAL SUBGROUP*/
- 0x22ec, /* U+0022ec: NOT NORMAL SUBGROUP OF OR EQUAL TO*/
- 0x22ed, /* U+0022ed: DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL*/
- 0x22ee, /* U+0022ee: VERTICAL ELLIPSIS*/
- 0x22ef, /* U+0022ef: MIDLINE HORIZONTAL ELLIPSIS*/
- 0x22f0, /* U+0022f0: UP RIGHT DIAGONAL ELLIPSIS*/
- 0x22f1, /* U+0022f1: DOWN RIGHT DIAGONAL ELLIPSIS*/
- 0x22f2, /* U+0022f2: ELEMENT OF WITH LONG HORIZONTAL STROKE*/
- 0x22f3, /* U+0022f3: ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE*/
- 0x22f4, /* U+0022f4: SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE*/
- 0x22f5, /* U+0022f5: ELEMENT OF WITH DOT ABOVE*/
- 0x22f6, /* U+0022f6: ELEMENT OF WITH OVERBAR*/
- 0x22f7, /* U+0022f7: SMALL ELEMENT OF WITH OVERBAR*/
- 0x22f8, /* U+0022f8: ELEMENT OF WITH UNDERBAR*/
- 0x22f9, /* U+0022f9: ELEMENT OF WITH TWO HORIZONTAL STROKES*/
- 0x22fa, /* U+0022fa: CONTAINS WITH LONG HORIZONTAL STROKE*/
- 0x22fb, /* U+0022fb: CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE*/
- 0x22fc, /* U+0022fc: SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE*/
- 0x22fd, /* U+0022fd: CONTAINS WITH OVERBAR*/
- 0x22fe, /* U+0022fe: SMALL CONTAINS WITH OVERBAR*/
- 0x22ff, /* U+0022ff: Z NOTATION BAG MEMBERSHIP*/
- 0x2300, /* U+002300: DIAMETER SIGN*/
- 0x2301, /* U+002301: ELECTRIC ARROW*/
- 0x2302, /* U+002302: HOUSE*/
- 0x2303, /* U+002303: UP ARROWHEAD*/
- 0x2304, /* U+002304: DOWN ARROWHEAD*/
- 0x2305, /* U+002305: PROJECTIVE*/
- 0x2306, /* U+002306: PERSPECTIVE*/
- 0x2307, /* U+002307: WAVY LINE*/
- 0x2308, /* U+002308: LEFT CEILING*/
- 0x2309, /* U+002309: RIGHT CEILING*/
- 0x230a, /* U+00230a: LEFT FLOOR*/
- 0x230b, /* U+00230b: RIGHT FLOOR*/
- 0x230c, /* U+00230c: BOTTOM RIGHT CROP*/
- 0x230d, /* U+00230d: BOTTOM LEFT CROP*/
- 0x230e, /* U+00230e: TOP RIGHT CROP*/
- 0x230f, /* U+00230f: TOP LEFT CROP*/
- 0x2310, /* U+002310: REVERSED NOT SIGN*/
- 0x2311, /* U+002311: SQUARE LOZENGE*/
- 0x2312, /* U+002312: ARC*/
- 0x2313, /* U+002313: SEGMENT*/
- 0x2314, /* U+002314: SECTOR*/
- 0x2315, /* U+002315: TELEPHONE RECORDER*/
- 0x2316, /* U+002316: POSITION INDICATOR*/
- 0x2317, /* U+002317: VIEWDATA SQUARE*/
- 0x2318, /* U+002318: PLACE OF INTEREST SIGN*/
- 0x2319, /* U+002319: TURNED NOT SIGN*/
- 0x231a, /* U+00231a: WATCH*/
- 0x231b, /* U+00231b: HOURGLASS*/
- 0x231c, /* U+00231c: TOP LEFT CORNER*/
- 0x231d, /* U+00231d: TOP RIGHT CORNER*/
- 0x231e, /* U+00231e: BOTTOM LEFT CORNER*/
- 0x231f, /* U+00231f: BOTTOM RIGHT CORNER*/
- 0x2320, /* U+002320: TOP HALF INTEGRAL*/
- 0x2321, /* U+002321: BOTTOM HALF INTEGRAL*/
- 0x2322, /* U+002322: FROWN*/
- 0x2323, /* U+002323: SMILE*/
- 0x2324, /* U+002324: UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS*/
- 0x2325, /* U+002325: OPTION KEY*/
- 0x2326, /* U+002326: ERASE TO THE RIGHT*/
- 0x2327, /* U+002327: X IN A RECTANGLE BOX*/
- 0x2328, /* U+002328: KEYBOARD*/
- 0x2329, /* U+002329: LEFT-POINTING ANGLE BRACKET*/
- 0x232a, /* U+00232a: RIGHT-POINTING ANGLE BRACKET*/
- 0x232b, /* U+00232b: ERASE TO THE LEFT*/
- 0x232c, /* U+00232c: BENZENE RING*/
- 0x232d, /* U+00232d: CYLINDRICITY*/
- 0x232e, /* U+00232e: ALL AROUND-PROFILE*/
- 0x232f, /* U+00232f: SYMMETRY*/
- 0x2330, /* U+002330: TOTAL RUNOUT*/
- 0x2331, /* U+002331: DIMENSION ORIGIN*/
- 0x2332, /* U+002332: CONICAL TAPER*/
- 0x2333, /* U+002333: SLOPE*/
- 0x2334, /* U+002334: COUNTERBORE*/
- 0x2335, /* U+002335: COUNTERSINK*/
- 0x2336, /* U+002336: APL FUNCTIONAL SYMBOL I-BEAM*/
- 0x2337, /* U+002337: APL FUNCTIONAL SYMBOL SQUISH QUAD*/
- 0x2338, /* U+002338: APL FUNCTIONAL SYMBOL QUAD EQUAL*/
- 0x2339, /* U+002339: APL FUNCTIONAL SYMBOL QUAD DIVIDE*/
- 0x233a, /* U+00233a: APL FUNCTIONAL SYMBOL QUAD DIAMOND*/
- 0x233b, /* U+00233b: APL FUNCTIONAL SYMBOL QUAD JOT*/
- 0x233c, /* U+00233c: APL FUNCTIONAL SYMBOL QUAD CIRCLE*/
- 0x233d, /* U+00233d: APL FUNCTIONAL SYMBOL CIRCLE STILE*/
- 0x233e, /* U+00233e: APL FUNCTIONAL SYMBOL CIRCLE JOT*/
- 0x233f, /* U+00233f: APL FUNCTIONAL SYMBOL SLASH BAR*/
- 0x2340, /* U+002340: APL FUNCTIONAL SYMBOL BACKSLASH BAR*/
- 0x2341, /* U+002341: APL FUNCTIONAL SYMBOL QUAD SLASH*/
- 0x2342, /* U+002342: APL FUNCTIONAL SYMBOL QUAD BACKSLASH*/
- 0x2343, /* U+002343: APL FUNCTIONAL SYMBOL QUAD LESS-THAN*/
- 0x2344, /* U+002344: APL FUNCTIONAL SYMBOL QUAD GREATER-THAN*/
- 0x2345, /* U+002345: APL FUNCTIONAL SYMBOL LEFTWARDS VANE*/
- 0x2346, /* U+002346: APL FUNCTIONAL SYMBOL RIGHTWARDS VANE*/
- 0x2347, /* U+002347: APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW*/
- 0x2348, /* U+002348: APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW*/
- 0x2349, /* U+002349: APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH*/
- 0x234a, /* U+00234a: APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR*/
- 0x234b, /* U+00234b: APL FUNCTIONAL SYMBOL DELTA STILE*/
- 0x234c, /* U+00234c: APL FUNCTIONAL SYMBOL QUAD DOWN CARET*/
- 0x234d, /* U+00234d: APL FUNCTIONAL SYMBOL QUAD DELTA*/
- 0x234e, /* U+00234e: APL FUNCTIONAL SYMBOL DOWN TACK JOT*/
- 0x234f, /* U+00234f: APL FUNCTIONAL SYMBOL UPWARDS VANE*/
- 0x2350, /* U+002350: APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW*/
- 0x2351, /* U+002351: APL FUNCTIONAL SYMBOL UP TACK OVERBAR*/
- 0x2352, /* U+002352: APL FUNCTIONAL SYMBOL DEL STILE*/
- 0x2353, /* U+002353: APL FUNCTIONAL SYMBOL QUAD UP CARET*/
- 0x2354, /* U+002354: APL FUNCTIONAL SYMBOL QUAD DEL*/
- 0x2355, /* U+002355: APL FUNCTIONAL SYMBOL UP TACK JOT*/
- 0x2356, /* U+002356: APL FUNCTIONAL SYMBOL DOWNWARDS VANE*/
- 0x2357, /* U+002357: APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW*/
- 0x2358, /* U+002358: APL FUNCTIONAL SYMBOL QUOTE UNDERBAR*/
- 0x2359, /* U+002359: APL FUNCTIONAL SYMBOL DELTA UNDERBAR*/
- 0x235a, /* U+00235a: APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR*/
- 0x235b, /* U+00235b: APL FUNCTIONAL SYMBOL JOT UNDERBAR*/
- 0x235c, /* U+00235c: APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR*/
- 0x235d, /* U+00235d: APL FUNCTIONAL SYMBOL UP SHOE JOT*/
- 0x235e, /* U+00235e: APL FUNCTIONAL SYMBOL QUOTE QUAD*/
- 0x235f, /* U+00235f: APL FUNCTIONAL SYMBOL CIRCLE STAR*/
- 0x2360, /* U+002360: APL FUNCTIONAL SYMBOL QUAD COLON*/
- 0x2361, /* U+002361: APL FUNCTIONAL SYMBOL UP TACK DIAERESIS*/
- 0x2362, /* U+002362: APL FUNCTIONAL SYMBOL DEL DIAERESIS*/
- 0x2363, /* U+002363: APL FUNCTIONAL SYMBOL STAR DIAERESIS*/
- 0x2364, /* U+002364: APL FUNCTIONAL SYMBOL JOT DIAERESIS*/
- 0x2365, /* U+002365: APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS*/
- 0x2366, /* U+002366: APL FUNCTIONAL SYMBOL DOWN SHOE STILE*/
- 0x2367, /* U+002367: APL FUNCTIONAL SYMBOL LEFT SHOE STILE*/
- 0x2368, /* U+002368: APL FUNCTIONAL SYMBOL TILDE DIAERESIS*/
- 0x2369, /* U+002369: APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS*/
- 0x236a, /* U+00236a: APL FUNCTIONAL SYMBOL COMMA BAR*/
- 0x236b, /* U+00236b: APL FUNCTIONAL SYMBOL DEL TILDE*/
- 0x236c, /* U+00236c: APL FUNCTIONAL SYMBOL ZILDE*/
- 0x236d, /* U+00236d: APL FUNCTIONAL SYMBOL STILE TILDE*/
- 0x236e, /* U+00236e: APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR*/
- 0x236f, /* U+00236f: APL FUNCTIONAL SYMBOL QUAD NOT EQUAL*/
- 0x2370, /* U+002370: APL FUNCTIONAL SYMBOL QUAD QUESTION*/
- 0x2371, /* U+002371: APL FUNCTIONAL SYMBOL DOWN CARET TILDE*/
- 0x2372, /* U+002372: APL FUNCTIONAL SYMBOL UP CARET TILDE*/
- 0x2373, /* U+002373: APL FUNCTIONAL SYMBOL IOTA*/
- 0x2374, /* U+002374: APL FUNCTIONAL SYMBOL RHO*/
- 0x2375, /* U+002375: APL FUNCTIONAL SYMBOL OMEGA*/
- 0x2376, /* U+002376: APL FUNCTIONAL SYMBOL ALPHA UNDERBAR*/
- 0x2377, /* U+002377: APL FUNCTIONAL SYMBOL EPSILON UNDERBAR*/
- 0x2378, /* U+002378: APL FUNCTIONAL SYMBOL IOTA UNDERBAR*/
- 0x2379, /* U+002379: APL FUNCTIONAL SYMBOL OMEGA UNDERBAR*/
- 0x237a, /* U+00237a: APL FUNCTIONAL SYMBOL ALPHA*/
- 0x237b, /* U+00237b: NOT CHECK MARK*/
- 0x237c, /* U+00237c: RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW*/
- 0x237d, /* U+00237d: SHOULDERED OPEN BOX*/
- 0x237e, /* U+00237e: BELL SYMBOL*/
- 0x237f, /* U+00237f: VERTICAL LINE WITH MIDDLE DOT*/
- 0x2380, /* U+002380: INSERTION SYMBOL*/
- 0x2381, /* U+002381: CONTINUOUS UNDERLINE SYMBOL*/
- 0x2382, /* U+002382: DISCONTINUOUS UNDERLINE SYMBOL*/
- 0x2383, /* U+002383: EMPHASIS SYMBOL*/
- 0x2384, /* U+002384: COMPOSITION SYMBOL*/
- 0x2385, /* U+002385: WHITE SQUARE WITH CENTRE VERTICAL LINE*/
- 0x2386, /* U+002386: ENTER SYMBOL*/
- 0x2387, /* U+002387: ALTERNATIVE KEY SYMBOL*/
- 0x2388, /* U+002388: HELM SYMBOL*/
- 0x2389, /* U+002389: CIRCLED HORIZONTAL BAR WITH NOTCH*/
- 0x238a, /* U+00238a: CIRCLED TRIANGLE DOWN*/
- 0x238b, /* U+00238b: BROKEN CIRCLE WITH NORTHWEST ARROW*/
- 0x238c, /* U+00238c: UNDO SYMBOL*/
- 0x238d, /* U+00238d: MONOSTABLE SYMBOL*/
- 0x238e, /* U+00238e: HYSTERESIS SYMBOL*/
- 0x238f, /* U+00238f: OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL*/
- 0x2390, /* U+002390: OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL*/
- 0x2391, /* U+002391: PASSIVE-PULL-DOWN-OUTPUT SYMBOL*/
- 0x2392, /* U+002392: PASSIVE-PULL-UP-OUTPUT SYMBOL*/
- 0x2393, /* U+002393: DIRECT CURRENT SYMBOL FORM TWO*/
- 0x2394, /* U+002394: SOFTWARE-FUNCTION SYMBOL*/
- 0x2395, /* U+002395: APL FUNCTIONAL SYMBOL QUAD*/
- 0x2396, /* U+002396: DECIMAL SEPARATOR KEY SYMBOL*/
- 0x2397, /* U+002397: PREVIOUS PAGE*/
- 0x2398, /* U+002398: NEXT PAGE*/
- 0x2399, /* U+002399: PRINT SCREEN SYMBOL*/
- 0x239a, /* U+00239a: CLEAR SCREEN SYMBOL*/
- 0x239b, /* U+00239b: LEFT PARENTHESIS UPPER HOOK*/
- 0x239c, /* U+00239c: LEFT PARENTHESIS EXTENSION*/
- 0x239d, /* U+00239d: LEFT PARENTHESIS LOWER HOOK*/
- 0x239e, /* U+00239e: RIGHT PARENTHESIS UPPER HOOK*/
- 0x239f, /* U+00239f: RIGHT PARENTHESIS EXTENSION*/
- 0x23a0, /* U+0023a0: RIGHT PARENTHESIS LOWER HOOK*/
- 0x23a1, /* U+0023a1: LEFT SQUARE BRACKET UPPER CORNER*/
- 0x23a2, /* U+0023a2: LEFT SQUARE BRACKET EXTENSION*/
- 0x23a3, /* U+0023a3: LEFT SQUARE BRACKET LOWER CORNER*/
- 0x23a4, /* U+0023a4: RIGHT SQUARE BRACKET UPPER CORNER*/
- 0x23a5, /* U+0023a5: RIGHT SQUARE BRACKET EXTENSION*/
- 0x23a6, /* U+0023a6: RIGHT SQUARE BRACKET LOWER CORNER*/
- 0x23a7, /* U+0023a7: LEFT CURLY BRACKET UPPER HOOK*/
- 0x23a8, /* U+0023a8: LEFT CURLY BRACKET MIDDLE PIECE*/
- 0x23a9, /* U+0023a9: LEFT CURLY BRACKET LOWER HOOK*/
- 0x23aa, /* U+0023aa: CURLY BRACKET EXTENSION*/
- 0x23ab, /* U+0023ab: RIGHT CURLY BRACKET UPPER HOOK*/
- 0x23ac, /* U+0023ac: RIGHT CURLY BRACKET MIDDLE PIECE*/
- 0x23ad, /* U+0023ad: RIGHT CURLY BRACKET LOWER HOOK*/
- 0x23ae, /* U+0023ae: INTEGRAL EXTENSION*/
- 0x23af, /* U+0023af: HORIZONTAL LINE EXTENSION*/
- 0x23b0, /* U+0023b0: UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION*/
- 0x23b1, /* U+0023b1: UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION*/
- 0x23b2, /* U+0023b2: SUMMATION TOP*/
- 0x23b3, /* U+0023b3: SUMMATION BOTTOM*/
- 0x23b4, /* U+0023b4: TOP SQUARE BRACKET*/
- 0x23b5, /* U+0023b5: BOTTOM SQUARE BRACKET*/
- 0x23b6, /* U+0023b6: BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET*/
- 0x23b7, /* U+0023b7: RADICAL SYMBOL BOTTOM*/
- 0x23b8, /* U+0023b8: LEFT VERTICAL BOX LINE*/
- 0x23b9, /* U+0023b9: RIGHT VERTICAL BOX LINE*/
- 0x23ba, /* U+0023ba: HORIZONTAL SCAN LINE-1*/
- 0x23bb, /* U+0023bb: HORIZONTAL SCAN LINE-3*/
- 0x23bc, /* U+0023bc: HORIZONTAL SCAN LINE-7*/
- 0x23bd, /* U+0023bd: HORIZONTAL SCAN LINE-9*/
- 0x23be, /* U+0023be: DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT*/
- 0x23bf, /* U+0023bf: DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT*/
- 0x23c0, /* U+0023c0: DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE*/
- 0x23c1, /* U+0023c1: DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE*/
- 0x23c2, /* U+0023c2: DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE*/
- 0x23c3, /* U+0023c3: DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE*/
- 0x23c4, /* U+0023c4: DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE*/
- 0x23c5, /* U+0023c5: DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE*/
- 0x23c6, /* U+0023c6: DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE*/
- 0x23c7, /* U+0023c7: DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE*/
- 0x23c8, /* U+0023c8: DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE*/
- 0x23c9, /* U+0023c9: DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL*/
- 0x23ca, /* U+0023ca: DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL*/
- 0x23cb, /* U+0023cb: DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT*/
- 0x23cc, /* U+0023cc: DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT*/
- 0x23cd, /* U+0023cd: SQUARE FOOT*/
- 0x23ce, /* U+0023ce: RETURN SYMBOL*/
- 0x23cf, /* U+0023cf: EJECT SYMBOL*/
- 0x23d0, /* U+0023d0: VERTICAL LINE EXTENSION*/
- 0x23d1, /* U+0023d1: METRICAL BREVE*/
- 0x23d2, /* U+0023d2: METRICAL LONG OVER SHORT*/
- 0x23d3, /* U+0023d3: METRICAL SHORT OVER LONG*/
- 0x23d4, /* U+0023d4: METRICAL LONG OVER TWO SHORTS*/
- 0x23d5, /* U+0023d5: METRICAL TWO SHORTS OVER LONG*/
- 0x23d6, /* U+0023d6: METRICAL TWO SHORTS JOINED*/
- 0x23d7, /* U+0023d7: METRICAL TRISEME*/
- 0x23d8, /* U+0023d8: METRICAL TETRASEME*/
- 0x23d9, /* U+0023d9: METRICAL PENTASEME*/
- 0x23da, /* U+0023da: EARTH GROUND*/
- 0x23db, /* U+0023db: FUSE*/
- 0x23dc, /* U+0023dc: */
- 0x23dd, /* U+0023dd: */
- 0x23de, /* U+0023de: */
- 0x23df, /* U+0023df: */
- 0x23e0, /* U+0023e0: */
- 0x23e1, /* U+0023e1: */
- 0x23e2, /* U+0023e2: */
- 0x23e3, /* U+0023e3: */
- 0x23e4, /* U+0023e4: */
- 0x23e5, /* U+0023e5: */
- 0x23e6, /* U+0023e6: */
- 0x23e7, /* U+0023e7: */
- 0x23e8, /* U+0023e8: */
- 0x23e9, /* U+0023e9: */
- 0x23ea, /* U+0023ea: */
- 0x23eb, /* U+0023eb: */
- 0x23ec, /* U+0023ec: */
- 0x23ed, /* U+0023ed: */
- 0x23ee, /* U+0023ee: */
- 0x23ef, /* U+0023ef: */
- 0x23f0, /* U+0023f0: */
- 0x23f1, /* U+0023f1: */
- 0x23f2, /* U+0023f2: */
- 0x23f3, /* U+0023f3: */
- 0x23f4, /* U+0023f4: */
- 0x23f5, /* U+0023f5: */
- 0x23f6, /* U+0023f6: */
- 0x23f7, /* U+0023f7: */
- 0x23f8, /* U+0023f8: */
- 0x23f9, /* U+0023f9: */
- 0x23fa, /* U+0023fa: */
- 0x23fb, /* U+0023fb: */
- 0x23fc, /* U+0023fc: */
- 0x23fd, /* U+0023fd: */
- 0x23fe, /* U+0023fe: */
- 0x23ff, /* U+0023ff: */
- 0x2400, /* U+002400: SYMBOL FOR NULL*/
- 0x2401, /* U+002401: SYMBOL FOR START OF HEADING*/
- 0x2402, /* U+002402: SYMBOL FOR START OF TEXT*/
- 0x2403, /* U+002403: SYMBOL FOR END OF TEXT*/
- 0x2404, /* U+002404: SYMBOL FOR END OF TRANSMISSION*/
- 0x2405, /* U+002405: SYMBOL FOR ENQUIRY*/
- 0x2406, /* U+002406: SYMBOL FOR ACKNOWLEDGE*/
- 0x2407, /* U+002407: SYMBOL FOR BELL*/
- 0x2408, /* U+002408: SYMBOL FOR BACKSPACE*/
- 0x2409, /* U+002409: SYMBOL FOR HORIZONTAL TABULATION*/
- 0x240a, /* U+00240a: SYMBOL FOR LINE FEED*/
- 0x240b, /* U+00240b: SYMBOL FOR VERTICAL TABULATION*/
- 0x240c, /* U+00240c: SYMBOL FOR FORM FEED*/
- 0x240d, /* U+00240d: SYMBOL FOR CARRIAGE RETURN*/
- 0x240e, /* U+00240e: SYMBOL FOR SHIFT OUT*/
- 0x240f, /* U+00240f: SYMBOL FOR SHIFT IN*/
- 0x2410, /* U+002410: SYMBOL FOR DATA LINK ESCAPE*/
- 0x2411, /* U+002411: SYMBOL FOR DEVICE CONTROL ONE*/
- 0x2412, /* U+002412: SYMBOL FOR DEVICE CONTROL TWO*/
- 0x2413, /* U+002413: SYMBOL FOR DEVICE CONTROL THREE*/
- 0x2414, /* U+002414: SYMBOL FOR DEVICE CONTROL FOUR*/
- 0x2415, /* U+002415: SYMBOL FOR NEGATIVE ACKNOWLEDGE*/
- 0x2416, /* U+002416: SYMBOL FOR SYNCHRONOUS IDLE*/
- 0x2417, /* U+002417: SYMBOL FOR END OF TRANSMISSION BLOCK*/
- 0x2418, /* U+002418: SYMBOL FOR CANCEL*/
- 0x2419, /* U+002419: SYMBOL FOR END OF MEDIUM*/
- 0x241a, /* U+00241a: SYMBOL FOR SUBSTITUTE*/
- 0x241b, /* U+00241b: SYMBOL FOR ESCAPE*/
- 0x241c, /* U+00241c: SYMBOL FOR FILE SEPARATOR*/
- 0x241d, /* U+00241d: SYMBOL FOR GROUP SEPARATOR*/
- 0x241e, /* U+00241e: SYMBOL FOR RECORD SEPARATOR*/
- 0x241f, /* U+00241f: SYMBOL FOR UNIT SEPARATOR*/
- 0x2420, /* U+002420: SYMBOL FOR SPACE*/
- 0x2421, /* U+002421: SYMBOL FOR DELETE*/
- 0x2422, /* U+002422: BLANK SYMBOL*/
- 0x2423, /* U+002423: OPEN BOX*/
- 0x2424, /* U+002424: SYMBOL FOR NEWLINE*/
- 0x2425, /* U+002425: SYMBOL FOR DELETE FORM TWO*/
- 0x2426, /* U+002426: SYMBOL FOR SUBSTITUTE FORM TWO*/
- 0x2427, /* U+002427: */
- 0x2428, /* U+002428: */
- 0x2429, /* U+002429: */
- 0x242a, /* U+00242a: */
- 0x242b, /* U+00242b: */
- 0x242c, /* U+00242c: */
- 0x242d, /* U+00242d: */
- 0x242e, /* U+00242e: */
- 0x242f, /* U+00242f: */
- 0x2430, /* U+002430: */
- 0x2431, /* U+002431: */
- 0x2432, /* U+002432: */
- 0x2433, /* U+002433: */
- 0x2434, /* U+002434: */
- 0x2435, /* U+002435: */
- 0x2436, /* U+002436: */
- 0x2437, /* U+002437: */
- 0x2438, /* U+002438: */
- 0x2439, /* U+002439: */
- 0x243a, /* U+00243a: */
- 0x243b, /* U+00243b: */
- 0x243c, /* U+00243c: */
- 0x243d, /* U+00243d: */
- 0x243e, /* U+00243e: */
- 0x243f, /* U+00243f: */
- 0x2440, /* U+002440: OCR HOOK*/
- 0x2441, /* U+002441: OCR CHAIR*/
- 0x2442, /* U+002442: OCR FORK*/
- 0x2443, /* U+002443: OCR INVERTED FORK*/
- 0x2444, /* U+002444: OCR BELT BUCKLE*/
- 0x2445, /* U+002445: OCR BOW TIE*/
- 0x2446, /* U+002446: OCR BRANCH BANK IDENTIFICATION*/
- 0x2447, /* U+002447: OCR AMOUNT OF CHECK*/
- 0x2448, /* U+002448: OCR DASH*/
- 0x2449, /* U+002449: OCR CUSTOMER ACCOUNT NUMBER*/
- 0x244a, /* U+00244a: OCR DOUBLE BACKSLASH*/
- 0x244b, /* U+00244b: */
- 0x244c, /* U+00244c: */
- 0x244d, /* U+00244d: */
- 0x244e, /* U+00244e: */
- 0x244f, /* U+00244f: */
- 0x2450, /* U+002450: */
- 0x2451, /* U+002451: */
- 0x2452, /* U+002452: */
- 0x2453, /* U+002453: */
- 0x2454, /* U+002454: */
- 0x2455, /* U+002455: */
- 0x2456, /* U+002456: */
- 0x2457, /* U+002457: */
- 0x2458, /* U+002458: */
- 0x2459, /* U+002459: */
- 0x245a, /* U+00245a: */
- 0x245b, /* U+00245b: */
- 0x245c, /* U+00245c: */
- 0x245d, /* U+00245d: */
- 0x245e, /* U+00245e: */
- 0x245f, /* U+00245f: */
- 0x2460, /* U+002460: CIRCLED DIGIT ONE*/
- 0x2461, /* U+002461: CIRCLED DIGIT TWO*/
- 0x2462, /* U+002462: CIRCLED DIGIT THREE*/
- 0x2463, /* U+002463: CIRCLED DIGIT FOUR*/
- 0x2464, /* U+002464: CIRCLED DIGIT FIVE*/
- 0x2465, /* U+002465: CIRCLED DIGIT SIX*/
- 0x2466, /* U+002466: CIRCLED DIGIT SEVEN*/
- 0x2467, /* U+002467: CIRCLED DIGIT EIGHT*/
- 0x2468, /* U+002468: CIRCLED DIGIT NINE*/
- 0x2469, /* U+002469: CIRCLED NUMBER TEN*/
- 0x246a, /* U+00246a: CIRCLED NUMBER ELEVEN*/
- 0x246b, /* U+00246b: CIRCLED NUMBER TWELVE*/
- 0x246c, /* U+00246c: CIRCLED NUMBER THIRTEEN*/
- 0x246d, /* U+00246d: CIRCLED NUMBER FOURTEEN*/
- 0x246e, /* U+00246e: CIRCLED NUMBER FIFTEEN*/
- 0x246f, /* U+00246f: CIRCLED NUMBER SIXTEEN*/
- 0x2470, /* U+002470: CIRCLED NUMBER SEVENTEEN*/
- 0x2471, /* U+002471: CIRCLED NUMBER EIGHTEEN*/
- 0x2472, /* U+002472: CIRCLED NUMBER NINETEEN*/
- 0x2473, /* U+002473: CIRCLED NUMBER TWENTY*/
- 0x2474, /* U+002474: PARENTHESIZED DIGIT ONE*/
- 0x2475, /* U+002475: PARENTHESIZED DIGIT TWO*/
- 0x2476, /* U+002476: PARENTHESIZED DIGIT THREE*/
- 0x2477, /* U+002477: PARENTHESIZED DIGIT FOUR*/
- 0x2478, /* U+002478: PARENTHESIZED DIGIT FIVE*/
- 0x2479, /* U+002479: PARENTHESIZED DIGIT SIX*/
- 0x247a, /* U+00247a: PARENTHESIZED DIGIT SEVEN*/
- 0x247b, /* U+00247b: PARENTHESIZED DIGIT EIGHT*/
- 0x247c, /* U+00247c: PARENTHESIZED DIGIT NINE*/
- 0x247d, /* U+00247d: PARENTHESIZED NUMBER TEN*/
- 0x247e, /* U+00247e: PARENTHESIZED NUMBER ELEVEN*/
- 0x247f, /* U+00247f: PARENTHESIZED NUMBER TWELVE*/
- 0x2480, /* U+002480: PARENTHESIZED NUMBER THIRTEEN*/
- 0x2481, /* U+002481: PARENTHESIZED NUMBER FOURTEEN*/
- 0x2482, /* U+002482: PARENTHESIZED NUMBER FIFTEEN*/
- 0x2483, /* U+002483: PARENTHESIZED NUMBER SIXTEEN*/
- 0x2484, /* U+002484: PARENTHESIZED NUMBER SEVENTEEN*/
- 0x2485, /* U+002485: PARENTHESIZED NUMBER EIGHTEEN*/
- 0x2486, /* U+002486: PARENTHESIZED NUMBER NINETEEN*/
- 0x2487, /* U+002487: PARENTHESIZED NUMBER TWENTY*/
- 0x2488, /* U+002488: DIGIT ONE FULL STOP*/
- 0x2489, /* U+002489: DIGIT TWO FULL STOP*/
- 0x248a, /* U+00248a: DIGIT THREE FULL STOP*/
- 0x248b, /* U+00248b: DIGIT FOUR FULL STOP*/
- 0x248c, /* U+00248c: DIGIT FIVE FULL STOP*/
- 0x248d, /* U+00248d: DIGIT SIX FULL STOP*/
- 0x248e, /* U+00248e: DIGIT SEVEN FULL STOP*/
- 0x248f, /* U+00248f: DIGIT EIGHT FULL STOP*/
- 0x2490, /* U+002490: DIGIT NINE FULL STOP*/
- 0x2491, /* U+002491: NUMBER TEN FULL STOP*/
- 0x2492, /* U+002492: NUMBER ELEVEN FULL STOP*/
- 0x2493, /* U+002493: NUMBER TWELVE FULL STOP*/
- 0x2494, /* U+002494: NUMBER THIRTEEN FULL STOP*/
- 0x2495, /* U+002495: NUMBER FOURTEEN FULL STOP*/
- 0x2496, /* U+002496: NUMBER FIFTEEN FULL STOP*/
- 0x2497, /* U+002497: NUMBER SIXTEEN FULL STOP*/
- 0x2498, /* U+002498: NUMBER SEVENTEEN FULL STOP*/
- 0x2499, /* U+002499: NUMBER EIGHTEEN FULL STOP*/
- 0x249a, /* U+00249a: NUMBER NINETEEN FULL STOP*/
- 0x249b, /* U+00249b: NUMBER TWENTY FULL STOP*/
- 0x249c, /* U+00249c: PARENTHESIZED LATIN SMALL LETTER A*/
- 0x249d, /* U+00249d: PARENTHESIZED LATIN SMALL LETTER B*/
- 0x249e, /* U+00249e: PARENTHESIZED LATIN SMALL LETTER C*/
- 0x249f, /* U+00249f: PARENTHESIZED LATIN SMALL LETTER D*/
- 0x24a0, /* U+0024a0: PARENTHESIZED LATIN SMALL LETTER E*/
- 0x24a1, /* U+0024a1: PARENTHESIZED LATIN SMALL LETTER F*/
- 0x24a2, /* U+0024a2: PARENTHESIZED LATIN SMALL LETTER G*/
- 0x24a3, /* U+0024a3: PARENTHESIZED LATIN SMALL LETTER H*/
- 0x24a4, /* U+0024a4: PARENTHESIZED LATIN SMALL LETTER I*/
- 0x24a5, /* U+0024a5: PARENTHESIZED LATIN SMALL LETTER J*/
- 0x24a6, /* U+0024a6: PARENTHESIZED LATIN SMALL LETTER K*/
- 0x24a7, /* U+0024a7: PARENTHESIZED LATIN SMALL LETTER L*/
- 0x24a8, /* U+0024a8: PARENTHESIZED LATIN SMALL LETTER M*/
- 0x24a9, /* U+0024a9: PARENTHESIZED LATIN SMALL LETTER N*/
- 0x24aa, /* U+0024aa: PARENTHESIZED LATIN SMALL LETTER O*/
- 0x24ab, /* U+0024ab: PARENTHESIZED LATIN SMALL LETTER P*/
- 0x24ac, /* U+0024ac: PARENTHESIZED LATIN SMALL LETTER Q*/
- 0x24ad, /* U+0024ad: PARENTHESIZED LATIN SMALL LETTER R*/
- 0x24ae, /* U+0024ae: PARENTHESIZED LATIN SMALL LETTER S*/
- 0x24af, /* U+0024af: PARENTHESIZED LATIN SMALL LETTER T*/
- 0x24b0, /* U+0024b0: PARENTHESIZED LATIN SMALL LETTER U*/
- 0x24b1, /* U+0024b1: PARENTHESIZED LATIN SMALL LETTER V*/
- 0x24b2, /* U+0024b2: PARENTHESIZED LATIN SMALL LETTER W*/
- 0x24b3, /* U+0024b3: PARENTHESIZED LATIN SMALL LETTER X*/
- 0x24b4, /* U+0024b4: PARENTHESIZED LATIN SMALL LETTER Y*/
- 0x24b5, /* U+0024b5: PARENTHESIZED LATIN SMALL LETTER Z*/
- 0x24b6, /* U+0024b6: CIRCLED LATIN CAPITAL LETTER A*/
- 0x24b7, /* U+0024b7: CIRCLED LATIN CAPITAL LETTER B*/
- 0x24b8, /* U+0024b8: CIRCLED LATIN CAPITAL LETTER C*/
- 0x24b9, /* U+0024b9: CIRCLED LATIN CAPITAL LETTER D*/
- 0x24ba, /* U+0024ba: CIRCLED LATIN CAPITAL LETTER E*/
- 0x24bb, /* U+0024bb: CIRCLED LATIN CAPITAL LETTER F*/
- 0x24bc, /* U+0024bc: CIRCLED LATIN CAPITAL LETTER G*/
- 0x24bd, /* U+0024bd: CIRCLED LATIN CAPITAL LETTER H*/
- 0x24be, /* U+0024be: CIRCLED LATIN CAPITAL LETTER I*/
- 0x24bf, /* U+0024bf: CIRCLED LATIN CAPITAL LETTER J*/
- 0x24c0, /* U+0024c0: CIRCLED LATIN CAPITAL LETTER K*/
- 0x24c1, /* U+0024c1: CIRCLED LATIN CAPITAL LETTER L*/
- 0x24c2, /* U+0024c2: CIRCLED LATIN CAPITAL LETTER M*/
- 0x24c3, /* U+0024c3: CIRCLED LATIN CAPITAL LETTER N*/
- 0x24c4, /* U+0024c4: CIRCLED LATIN CAPITAL LETTER O*/
- 0x24c5, /* U+0024c5: CIRCLED LATIN CAPITAL LETTER P*/
- 0x24c6, /* U+0024c6: CIRCLED LATIN CAPITAL LETTER Q*/
- 0x24c7, /* U+0024c7: CIRCLED LATIN CAPITAL LETTER R*/
- 0x24c8, /* U+0024c8: CIRCLED LATIN CAPITAL LETTER S*/
- 0x24c9, /* U+0024c9: CIRCLED LATIN CAPITAL LETTER T*/
- 0x24ca, /* U+0024ca: CIRCLED LATIN CAPITAL LETTER U*/
- 0x24cb, /* U+0024cb: CIRCLED LATIN CAPITAL LETTER V*/
- 0x24cc, /* U+0024cc: CIRCLED LATIN CAPITAL LETTER W*/
- 0x24cd, /* U+0024cd: CIRCLED LATIN CAPITAL LETTER X*/
- 0x24ce, /* U+0024ce: CIRCLED LATIN CAPITAL LETTER Y*/
- 0x24cf, /* U+0024cf: CIRCLED LATIN CAPITAL LETTER Z*/
- 0x24b6, /* U+0024d0: CIRCLED LATIN SMALL LETTER A*/
- 0x24b7, /* U+0024d1: CIRCLED LATIN SMALL LETTER B*/
- 0x24b8, /* U+0024d2: CIRCLED LATIN SMALL LETTER C*/
- 0x24b9, /* U+0024d3: CIRCLED LATIN SMALL LETTER D*/
- 0x24ba, /* U+0024d4: CIRCLED LATIN SMALL LETTER E*/
- 0x24bb, /* U+0024d5: CIRCLED LATIN SMALL LETTER F*/
- 0x24bc, /* U+0024d6: CIRCLED LATIN SMALL LETTER G*/
- 0x24bd, /* U+0024d7: CIRCLED LATIN SMALL LETTER H*/
- 0x24be, /* U+0024d8: CIRCLED LATIN SMALL LETTER I*/
- 0x24bf, /* U+0024d9: CIRCLED LATIN SMALL LETTER J*/
- 0x24c0, /* U+0024da: CIRCLED LATIN SMALL LETTER K*/
- 0x24c1, /* U+0024db: CIRCLED LATIN SMALL LETTER L*/
- 0x24c2, /* U+0024dc: CIRCLED LATIN SMALL LETTER M*/
- 0x24c3, /* U+0024dd: CIRCLED LATIN SMALL LETTER N*/
- 0x24c4, /* U+0024de: CIRCLED LATIN SMALL LETTER O*/
- 0x24c5, /* U+0024df: CIRCLED LATIN SMALL LETTER P*/
- 0x24c6, /* U+0024e0: CIRCLED LATIN SMALL LETTER Q*/
- 0x24c7, /* U+0024e1: CIRCLED LATIN SMALL LETTER R*/
- 0x24c8, /* U+0024e2: CIRCLED LATIN SMALL LETTER S*/
- 0x24c9, /* U+0024e3: CIRCLED LATIN SMALL LETTER T*/
- 0x24ca, /* U+0024e4: CIRCLED LATIN SMALL LETTER U*/
- 0x24cb, /* U+0024e5: CIRCLED LATIN SMALL LETTER V*/
- 0x24cc, /* U+0024e6: CIRCLED LATIN SMALL LETTER W*/
- 0x24cd, /* U+0024e7: CIRCLED LATIN SMALL LETTER X*/
- 0x24ce, /* U+0024e8: CIRCLED LATIN SMALL LETTER Y*/
- 0x24cf, /* U+0024e9: CIRCLED LATIN SMALL LETTER Z*/
-};
-
-static const RTUNICP g_afRTUniUpper0x002c30[] =
-{
- 0x2c00, /* U+002c30: GLAGOLITIC SMALL LETTER AZU*/
- 0x2c01, /* U+002c31: GLAGOLITIC SMALL LETTER BUKY*/
- 0x2c02, /* U+002c32: GLAGOLITIC SMALL LETTER VEDE*/
- 0x2c03, /* U+002c33: GLAGOLITIC SMALL LETTER GLAGOLI*/
- 0x2c04, /* U+002c34: GLAGOLITIC SMALL LETTER DOBRO*/
- 0x2c05, /* U+002c35: GLAGOLITIC SMALL LETTER YESTU*/
- 0x2c06, /* U+002c36: GLAGOLITIC SMALL LETTER ZHIVETE*/
- 0x2c07, /* U+002c37: GLAGOLITIC SMALL LETTER DZELO*/
- 0x2c08, /* U+002c38: GLAGOLITIC SMALL LETTER ZEMLJA*/
- 0x2c09, /* U+002c39: GLAGOLITIC SMALL LETTER IZHE*/
- 0x2c0a, /* U+002c3a: GLAGOLITIC SMALL LETTER INITIAL IZHE*/
- 0x2c0b, /* U+002c3b: GLAGOLITIC SMALL LETTER I*/
- 0x2c0c, /* U+002c3c: GLAGOLITIC SMALL LETTER DJERVI*/
- 0x2c0d, /* U+002c3d: GLAGOLITIC SMALL LETTER KAKO*/
- 0x2c0e, /* U+002c3e: GLAGOLITIC SMALL LETTER LJUDIJE*/
- 0x2c0f, /* U+002c3f: GLAGOLITIC SMALL LETTER MYSLITE*/
- 0x2c10, /* U+002c40: GLAGOLITIC SMALL LETTER NASHI*/
- 0x2c11, /* U+002c41: GLAGOLITIC SMALL LETTER ONU*/
- 0x2c12, /* U+002c42: GLAGOLITIC SMALL LETTER POKOJI*/
- 0x2c13, /* U+002c43: GLAGOLITIC SMALL LETTER RITSI*/
- 0x2c14, /* U+002c44: GLAGOLITIC SMALL LETTER SLOVO*/
- 0x2c15, /* U+002c45: GLAGOLITIC SMALL LETTER TVRIDO*/
- 0x2c16, /* U+002c46: GLAGOLITIC SMALL LETTER UKU*/
- 0x2c17, /* U+002c47: GLAGOLITIC SMALL LETTER FRITU*/
- 0x2c18, /* U+002c48: GLAGOLITIC SMALL LETTER HERU*/
- 0x2c19, /* U+002c49: GLAGOLITIC SMALL LETTER OTU*/
- 0x2c1a, /* U+002c4a: GLAGOLITIC SMALL LETTER PE*/
- 0x2c1b, /* U+002c4b: GLAGOLITIC SMALL LETTER SHTA*/
- 0x2c1c, /* U+002c4c: GLAGOLITIC SMALL LETTER TSI*/
- 0x2c1d, /* U+002c4d: GLAGOLITIC SMALL LETTER CHRIVI*/
- 0x2c1e, /* U+002c4e: GLAGOLITIC SMALL LETTER SHA*/
- 0x2c1f, /* U+002c4f: GLAGOLITIC SMALL LETTER YERU*/
- 0x2c20, /* U+002c50: GLAGOLITIC SMALL LETTER YERI*/
- 0x2c21, /* U+002c51: GLAGOLITIC SMALL LETTER YATI*/
- 0x2c22, /* U+002c52: GLAGOLITIC SMALL LETTER SPIDERY HA*/
- 0x2c23, /* U+002c53: GLAGOLITIC SMALL LETTER YU*/
- 0x2c24, /* U+002c54: GLAGOLITIC SMALL LETTER SMALL YUS*/
- 0x2c25, /* U+002c55: GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL*/
- 0x2c26, /* U+002c56: GLAGOLITIC SMALL LETTER YO*/
- 0x2c27, /* U+002c57: GLAGOLITIC SMALL LETTER IOTATED SMALL YUS*/
- 0x2c28, /* U+002c58: GLAGOLITIC SMALL LETTER BIG YUS*/
- 0x2c29, /* U+002c59: GLAGOLITIC SMALL LETTER IOTATED BIG YUS*/
- 0x2c2a, /* U+002c5a: GLAGOLITIC SMALL LETTER FITA*/
- 0x2c2b, /* U+002c5b: GLAGOLITIC SMALL LETTER IZHITSA*/
- 0x2c2c, /* U+002c5c: GLAGOLITIC SMALL LETTER SHTAPIC*/
- 0x2c2d, /* U+002c5d: GLAGOLITIC SMALL LETTER TROKUTASTI A*/
- 0x2c2e, /* U+002c5e: GLAGOLITIC SMALL LETTER LATINATE MYSLITE*/
- 0x2c5f, /* U+002c5f: */
- 0x2c60, /* U+002c60: */
- 0x2c61, /* U+002c61: */
- 0x2c62, /* U+002c62: */
- 0x2c63, /* U+002c63: */
- 0x2c64, /* U+002c64: */
- 0x2c65, /* U+002c65: */
- 0x2c66, /* U+002c66: */
- 0x2c67, /* U+002c67: */
- 0x2c68, /* U+002c68: */
- 0x2c69, /* U+002c69: */
- 0x2c6a, /* U+002c6a: */
- 0x2c6b, /* U+002c6b: */
- 0x2c6c, /* U+002c6c: */
- 0x2c6d, /* U+002c6d: */
- 0x2c6e, /* U+002c6e: */
- 0x2c6f, /* U+002c6f: */
- 0x2c70, /* U+002c70: */
- 0x2c71, /* U+002c71: */
- 0x2c72, /* U+002c72: */
- 0x2c73, /* U+002c73: */
- 0x2c74, /* U+002c74: */
- 0x2c75, /* U+002c75: */
- 0x2c76, /* U+002c76: */
- 0x2c77, /* U+002c77: */
- 0x2c78, /* U+002c78: */
- 0x2c79, /* U+002c79: */
- 0x2c7a, /* U+002c7a: */
- 0x2c7b, /* U+002c7b: */
- 0x2c7c, /* U+002c7c: */
- 0x2c7d, /* U+002c7d: */
- 0x2c7e, /* U+002c7e: */
- 0x2c7f, /* U+002c7f: */
- 0x2c80, /* U+002c80: COPTIC CAPITAL LETTER ALFA*/
- 0x2c80, /* U+002c81: COPTIC SMALL LETTER ALFA*/
- 0x2c82, /* U+002c82: COPTIC CAPITAL LETTER VIDA*/
- 0x2c82, /* U+002c83: COPTIC SMALL LETTER VIDA*/
- 0x2c84, /* U+002c84: COPTIC CAPITAL LETTER GAMMA*/
- 0x2c84, /* U+002c85: COPTIC SMALL LETTER GAMMA*/
- 0x2c86, /* U+002c86: COPTIC CAPITAL LETTER DALDA*/
- 0x2c86, /* U+002c87: COPTIC SMALL LETTER DALDA*/
- 0x2c88, /* U+002c88: COPTIC CAPITAL LETTER EIE*/
- 0x2c88, /* U+002c89: COPTIC SMALL LETTER EIE*/
- 0x2c8a, /* U+002c8a: COPTIC CAPITAL LETTER SOU*/
- 0x2c8a, /* U+002c8b: COPTIC SMALL LETTER SOU*/
- 0x2c8c, /* U+002c8c: COPTIC CAPITAL LETTER ZATA*/
- 0x2c8c, /* U+002c8d: COPTIC SMALL LETTER ZATA*/
- 0x2c8e, /* U+002c8e: COPTIC CAPITAL LETTER HATE*/
- 0x2c8e, /* U+002c8f: COPTIC SMALL LETTER HATE*/
- 0x2c90, /* U+002c90: COPTIC CAPITAL LETTER THETHE*/
- 0x2c90, /* U+002c91: COPTIC SMALL LETTER THETHE*/
- 0x2c92, /* U+002c92: COPTIC CAPITAL LETTER IAUDA*/
- 0x2c92, /* U+002c93: COPTIC SMALL LETTER IAUDA*/
- 0x2c94, /* U+002c94: COPTIC CAPITAL LETTER KAPA*/
- 0x2c94, /* U+002c95: COPTIC SMALL LETTER KAPA*/
- 0x2c96, /* U+002c96: COPTIC CAPITAL LETTER LAULA*/
- 0x2c96, /* U+002c97: COPTIC SMALL LETTER LAULA*/
- 0x2c98, /* U+002c98: COPTIC CAPITAL LETTER MI*/
- 0x2c98, /* U+002c99: COPTIC SMALL LETTER MI*/
- 0x2c9a, /* U+002c9a: COPTIC CAPITAL LETTER NI*/
- 0x2c9a, /* U+002c9b: COPTIC SMALL LETTER NI*/
- 0x2c9c, /* U+002c9c: COPTIC CAPITAL LETTER KSI*/
- 0x2c9c, /* U+002c9d: COPTIC SMALL LETTER KSI*/
- 0x2c9e, /* U+002c9e: COPTIC CAPITAL LETTER O*/
- 0x2c9e, /* U+002c9f: COPTIC SMALL LETTER O*/
- 0x2ca0, /* U+002ca0: COPTIC CAPITAL LETTER PI*/
- 0x2ca0, /* U+002ca1: COPTIC SMALL LETTER PI*/
- 0x2ca2, /* U+002ca2: COPTIC CAPITAL LETTER RO*/
- 0x2ca2, /* U+002ca3: COPTIC SMALL LETTER RO*/
- 0x2ca4, /* U+002ca4: COPTIC CAPITAL LETTER SIMA*/
- 0x2ca4, /* U+002ca5: COPTIC SMALL LETTER SIMA*/
- 0x2ca6, /* U+002ca6: COPTIC CAPITAL LETTER TAU*/
- 0x2ca6, /* U+002ca7: COPTIC SMALL LETTER TAU*/
- 0x2ca8, /* U+002ca8: COPTIC CAPITAL LETTER UA*/
- 0x2ca8, /* U+002ca9: COPTIC SMALL LETTER UA*/
- 0x2caa, /* U+002caa: COPTIC CAPITAL LETTER FI*/
- 0x2caa, /* U+002cab: COPTIC SMALL LETTER FI*/
- 0x2cac, /* U+002cac: COPTIC CAPITAL LETTER KHI*/
- 0x2cac, /* U+002cad: COPTIC SMALL LETTER KHI*/
- 0x2cae, /* U+002cae: COPTIC CAPITAL LETTER PSI*/
- 0x2cae, /* U+002caf: COPTIC SMALL LETTER PSI*/
- 0x2cb0, /* U+002cb0: COPTIC CAPITAL LETTER OOU*/
- 0x2cb0, /* U+002cb1: COPTIC SMALL LETTER OOU*/
- 0x2cb2, /* U+002cb2: COPTIC CAPITAL LETTER DIALECT-P ALEF*/
- 0x2cb2, /* U+002cb3: COPTIC SMALL LETTER DIALECT-P ALEF*/
- 0x2cb4, /* U+002cb4: COPTIC CAPITAL LETTER OLD COPTIC AIN*/
- 0x2cb4, /* U+002cb5: COPTIC SMALL LETTER OLD COPTIC AIN*/
- 0x2cb6, /* U+002cb6: COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE*/
- 0x2cb6, /* U+002cb7: COPTIC SMALL LETTER CRYPTOGRAMMIC EIE*/
- 0x2cb8, /* U+002cb8: COPTIC CAPITAL LETTER DIALECT-P KAPA*/
- 0x2cb8, /* U+002cb9: COPTIC SMALL LETTER DIALECT-P KAPA*/
- 0x2cba, /* U+002cba: COPTIC CAPITAL LETTER DIALECT-P NI*/
- 0x2cba, /* U+002cbb: COPTIC SMALL LETTER DIALECT-P NI*/
- 0x2cbc, /* U+002cbc: COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI*/
- 0x2cbc, /* U+002cbd: COPTIC SMALL LETTER CRYPTOGRAMMIC NI*/
- 0x2cbe, /* U+002cbe: COPTIC CAPITAL LETTER OLD COPTIC OOU*/
- 0x2cbe, /* U+002cbf: COPTIC SMALL LETTER OLD COPTIC OOU*/
- 0x2cc0, /* U+002cc0: COPTIC CAPITAL LETTER SAMPI*/
- 0x2cc0, /* U+002cc1: COPTIC SMALL LETTER SAMPI*/
- 0x2cc2, /* U+002cc2: COPTIC CAPITAL LETTER CROSSED SHEI*/
- 0x2cc2, /* U+002cc3: COPTIC SMALL LETTER CROSSED SHEI*/
- 0x2cc4, /* U+002cc4: COPTIC CAPITAL LETTER OLD COPTIC SHEI*/
- 0x2cc4, /* U+002cc5: COPTIC SMALL LETTER OLD COPTIC SHEI*/
- 0x2cc6, /* U+002cc6: COPTIC CAPITAL LETTER OLD COPTIC ESH*/
- 0x2cc6, /* U+002cc7: COPTIC SMALL LETTER OLD COPTIC ESH*/
- 0x2cc8, /* U+002cc8: COPTIC CAPITAL LETTER AKHMIMIC KHEI*/
- 0x2cc8, /* U+002cc9: COPTIC SMALL LETTER AKHMIMIC KHEI*/
- 0x2cca, /* U+002cca: COPTIC CAPITAL LETTER DIALECT-P HORI*/
- 0x2cca, /* U+002ccb: COPTIC SMALL LETTER DIALECT-P HORI*/
- 0x2ccc, /* U+002ccc: COPTIC CAPITAL LETTER OLD COPTIC HORI*/
- 0x2ccc, /* U+002ccd: COPTIC SMALL LETTER OLD COPTIC HORI*/
- 0x2cce, /* U+002cce: COPTIC CAPITAL LETTER OLD COPTIC HA*/
- 0x2cce, /* U+002ccf: COPTIC SMALL LETTER OLD COPTIC HA*/
- 0x2cd0, /* U+002cd0: COPTIC CAPITAL LETTER L-SHAPED HA*/
- 0x2cd0, /* U+002cd1: COPTIC SMALL LETTER L-SHAPED HA*/
- 0x2cd2, /* U+002cd2: COPTIC CAPITAL LETTER OLD COPTIC HEI*/
- 0x2cd2, /* U+002cd3: COPTIC SMALL LETTER OLD COPTIC HEI*/
- 0x2cd4, /* U+002cd4: COPTIC CAPITAL LETTER OLD COPTIC HAT*/
- 0x2cd4, /* U+002cd5: COPTIC SMALL LETTER OLD COPTIC HAT*/
- 0x2cd6, /* U+002cd6: COPTIC CAPITAL LETTER OLD COPTIC GANGIA*/
- 0x2cd6, /* U+002cd7: COPTIC SMALL LETTER OLD COPTIC GANGIA*/
- 0x2cd8, /* U+002cd8: COPTIC CAPITAL LETTER OLD COPTIC DJA*/
- 0x2cd8, /* U+002cd9: COPTIC SMALL LETTER OLD COPTIC DJA*/
- 0x2cda, /* U+002cda: COPTIC CAPITAL LETTER OLD COPTIC SHIMA*/
- 0x2cda, /* U+002cdb: COPTIC SMALL LETTER OLD COPTIC SHIMA*/
- 0x2cdc, /* U+002cdc: COPTIC CAPITAL LETTER OLD NUBIAN SHIMA*/
- 0x2cdc, /* U+002cdd: COPTIC SMALL LETTER OLD NUBIAN SHIMA*/
- 0x2cde, /* U+002cde: COPTIC CAPITAL LETTER OLD NUBIAN NGI*/
- 0x2cde, /* U+002cdf: COPTIC SMALL LETTER OLD NUBIAN NGI*/
- 0x2ce0, /* U+002ce0: COPTIC CAPITAL LETTER OLD NUBIAN NYI*/
- 0x2ce0, /* U+002ce1: COPTIC SMALL LETTER OLD NUBIAN NYI*/
- 0x2ce2, /* U+002ce2: COPTIC CAPITAL LETTER OLD NUBIAN WAU*/
- 0x2ce2, /* U+002ce3: COPTIC SMALL LETTER OLD NUBIAN WAU*/
- 0x2ce4, /* U+002ce4: COPTIC SYMBOL KAI*/
- 0x2ce5, /* U+002ce5: COPTIC SYMBOL MI RO*/
- 0x2ce6, /* U+002ce6: COPTIC SYMBOL PI RO*/
- 0x2ce7, /* U+002ce7: COPTIC SYMBOL STAUROS*/
- 0x2ce8, /* U+002ce8: COPTIC SYMBOL TAU RO*/
- 0x2ce9, /* U+002ce9: COPTIC SYMBOL KHI RO*/
- 0x2cea, /* U+002cea: COPTIC SYMBOL SHIMA SIMA*/
- 0x2ceb, /* U+002ceb: */
- 0x2cec, /* U+002cec: */
- 0x2ced, /* U+002ced: */
- 0x2cee, /* U+002cee: */
- 0x2cef, /* U+002cef: */
- 0x2cf0, /* U+002cf0: */
- 0x2cf1, /* U+002cf1: */
- 0x2cf2, /* U+002cf2: */
- 0x2cf3, /* U+002cf3: */
- 0x2cf4, /* U+002cf4: */
- 0x2cf5, /* U+002cf5: */
- 0x2cf6, /* U+002cf6: */
- 0x2cf7, /* U+002cf7: */
- 0x2cf8, /* U+002cf8: */
- 0x2cf9, /* U+002cf9: COPTIC OLD NUBIAN FULL STOP*/
- 0x2cfa, /* U+002cfa: COPTIC OLD NUBIAN DIRECT QUESTION MARK*/
- 0x2cfb, /* U+002cfb: COPTIC OLD NUBIAN INDIRECT QUESTION MARK*/
- 0x2cfc, /* U+002cfc: COPTIC OLD NUBIAN VERSE DIVIDER*/
- 0x2cfd, /* U+002cfd: COPTIC FRACTION ONE HALF*/
- 0x2cfe, /* U+002cfe: COPTIC FULL STOP*/
- 0x2cff, /* U+002cff: COPTIC MORPHOLOGICAL DIVIDER*/
- 0x10a0, /* U+002d00: GEORGIAN SMALL LETTER AN*/
- 0x10a1, /* U+002d01: GEORGIAN SMALL LETTER BAN*/
- 0x10a2, /* U+002d02: GEORGIAN SMALL LETTER GAN*/
- 0x10a3, /* U+002d03: GEORGIAN SMALL LETTER DON*/
- 0x10a4, /* U+002d04: GEORGIAN SMALL LETTER EN*/
- 0x10a5, /* U+002d05: GEORGIAN SMALL LETTER VIN*/
- 0x10a6, /* U+002d06: GEORGIAN SMALL LETTER ZEN*/
- 0x10a7, /* U+002d07: GEORGIAN SMALL LETTER TAN*/
- 0x10a8, /* U+002d08: GEORGIAN SMALL LETTER IN*/
- 0x10a9, /* U+002d09: GEORGIAN SMALL LETTER KAN*/
- 0x10aa, /* U+002d0a: GEORGIAN SMALL LETTER LAS*/
- 0x10ab, /* U+002d0b: GEORGIAN SMALL LETTER MAN*/
- 0x10ac, /* U+002d0c: GEORGIAN SMALL LETTER NAR*/
- 0x10ad, /* U+002d0d: GEORGIAN SMALL LETTER ON*/
- 0x10ae, /* U+002d0e: GEORGIAN SMALL LETTER PAR*/
- 0x10af, /* U+002d0f: GEORGIAN SMALL LETTER ZHAR*/
- 0x10b0, /* U+002d10: GEORGIAN SMALL LETTER RAE*/
- 0x10b1, /* U+002d11: GEORGIAN SMALL LETTER SAN*/
- 0x10b2, /* U+002d12: GEORGIAN SMALL LETTER TAR*/
- 0x10b3, /* U+002d13: GEORGIAN SMALL LETTER UN*/
- 0x10b4, /* U+002d14: GEORGIAN SMALL LETTER PHAR*/
- 0x10b5, /* U+002d15: GEORGIAN SMALL LETTER KHAR*/
- 0x10b6, /* U+002d16: GEORGIAN SMALL LETTER GHAN*/
- 0x10b7, /* U+002d17: GEORGIAN SMALL LETTER QAR*/
- 0x10b8, /* U+002d18: GEORGIAN SMALL LETTER SHIN*/
- 0x10b9, /* U+002d19: GEORGIAN SMALL LETTER CHIN*/
- 0x10ba, /* U+002d1a: GEORGIAN SMALL LETTER CAN*/
- 0x10bb, /* U+002d1b: GEORGIAN SMALL LETTER JIL*/
- 0x10bc, /* U+002d1c: GEORGIAN SMALL LETTER CIL*/
- 0x10bd, /* U+002d1d: GEORGIAN SMALL LETTER CHAR*/
- 0x10be, /* U+002d1e: GEORGIAN SMALL LETTER XAN*/
- 0x10bf, /* U+002d1f: GEORGIAN SMALL LETTER JHAN*/
- 0x10c0, /* U+002d20: GEORGIAN SMALL LETTER HAE*/
- 0x10c1, /* U+002d21: GEORGIAN SMALL LETTER HE*/
- 0x10c2, /* U+002d22: GEORGIAN SMALL LETTER HIE*/
- 0x10c3, /* U+002d23: GEORGIAN SMALL LETTER WE*/
- 0x10c4, /* U+002d24: GEORGIAN SMALL LETTER HAR*/
- 0x10c5, /* U+002d25: GEORGIAN SMALL LETTER HOE*/
-};
-
-static const RTUNICP g_afRTUniUpper0x00ff41[] =
-{
- 0xff21, /* U+00ff41: FULLWIDTH LATIN SMALL LETTER A*/
- 0xff22, /* U+00ff42: FULLWIDTH LATIN SMALL LETTER B*/
- 0xff23, /* U+00ff43: FULLWIDTH LATIN SMALL LETTER C*/
- 0xff24, /* U+00ff44: FULLWIDTH LATIN SMALL LETTER D*/
- 0xff25, /* U+00ff45: FULLWIDTH LATIN SMALL LETTER E*/
- 0xff26, /* U+00ff46: FULLWIDTH LATIN SMALL LETTER F*/
- 0xff27, /* U+00ff47: FULLWIDTH LATIN SMALL LETTER G*/
- 0xff28, /* U+00ff48: FULLWIDTH LATIN SMALL LETTER H*/
- 0xff29, /* U+00ff49: FULLWIDTH LATIN SMALL LETTER I*/
- 0xff2a, /* U+00ff4a: FULLWIDTH LATIN SMALL LETTER J*/
- 0xff2b, /* U+00ff4b: FULLWIDTH LATIN SMALL LETTER K*/
- 0xff2c, /* U+00ff4c: FULLWIDTH LATIN SMALL LETTER L*/
- 0xff2d, /* U+00ff4d: FULLWIDTH LATIN SMALL LETTER M*/
- 0xff2e, /* U+00ff4e: FULLWIDTH LATIN SMALL LETTER N*/
- 0xff2f, /* U+00ff4f: FULLWIDTH LATIN SMALL LETTER O*/
- 0xff30, /* U+00ff50: FULLWIDTH LATIN SMALL LETTER P*/
- 0xff31, /* U+00ff51: FULLWIDTH LATIN SMALL LETTER Q*/
- 0xff32, /* U+00ff52: FULLWIDTH LATIN SMALL LETTER R*/
- 0xff33, /* U+00ff53: FULLWIDTH LATIN SMALL LETTER S*/
- 0xff34, /* U+00ff54: FULLWIDTH LATIN SMALL LETTER T*/
- 0xff35, /* U+00ff55: FULLWIDTH LATIN SMALL LETTER U*/
- 0xff36, /* U+00ff56: FULLWIDTH LATIN SMALL LETTER V*/
- 0xff37, /* U+00ff57: FULLWIDTH LATIN SMALL LETTER W*/
- 0xff38, /* U+00ff58: FULLWIDTH LATIN SMALL LETTER X*/
- 0xff39, /* U+00ff59: FULLWIDTH LATIN SMALL LETTER Y*/
- 0xff3a, /* U+00ff5a: FULLWIDTH LATIN SMALL LETTER Z*/
-};
-
-static const RTUNICP g_afRTUniUpper0x010428[] =
-{
- 0x10400, /* U+010428: DESERET SMALL LETTER LONG I*/
- 0x10401, /* U+010429: DESERET SMALL LETTER LONG E*/
- 0x10402, /* U+01042a: DESERET SMALL LETTER LONG A*/
- 0x10403, /* U+01042b: DESERET SMALL LETTER LONG AH*/
- 0x10404, /* U+01042c: DESERET SMALL LETTER LONG O*/
- 0x10405, /* U+01042d: DESERET SMALL LETTER LONG OO*/
- 0x10406, /* U+01042e: DESERET SMALL LETTER SHORT I*/
- 0x10407, /* U+01042f: DESERET SMALL LETTER SHORT E*/
- 0x10408, /* U+010430: DESERET SMALL LETTER SHORT A*/
- 0x10409, /* U+010431: DESERET SMALL LETTER SHORT AH*/
- 0x1040a, /* U+010432: DESERET SMALL LETTER SHORT O*/
- 0x1040b, /* U+010433: DESERET SMALL LETTER SHORT OO*/
- 0x1040c, /* U+010434: DESERET SMALL LETTER AY*/
- 0x1040d, /* U+010435: DESERET SMALL LETTER OW*/
- 0x1040e, /* U+010436: DESERET SMALL LETTER WU*/
- 0x1040f, /* U+010437: DESERET SMALL LETTER YEE*/
- 0x10410, /* U+010438: DESERET SMALL LETTER H*/
- 0x10411, /* U+010439: DESERET SMALL LETTER PEE*/
- 0x10412, /* U+01043a: DESERET SMALL LETTER BEE*/
- 0x10413, /* U+01043b: DESERET SMALL LETTER TEE*/
- 0x10414, /* U+01043c: DESERET SMALL LETTER DEE*/
- 0x10415, /* U+01043d: DESERET SMALL LETTER CHEE*/
- 0x10416, /* U+01043e: DESERET SMALL LETTER JEE*/
- 0x10417, /* U+01043f: DESERET SMALL LETTER KAY*/
- 0x10418, /* U+010440: DESERET SMALL LETTER GAY*/
- 0x10419, /* U+010441: DESERET SMALL LETTER EF*/
- 0x1041a, /* U+010442: DESERET SMALL LETTER VEE*/
- 0x1041b, /* U+010443: DESERET SMALL LETTER ETH*/
- 0x1041c, /* U+010444: DESERET SMALL LETTER THEE*/
- 0x1041d, /* U+010445: DESERET SMALL LETTER ES*/
- 0x1041e, /* U+010446: DESERET SMALL LETTER ZEE*/
- 0x1041f, /* U+010447: DESERET SMALL LETTER ESH*/
- 0x10420, /* U+010448: DESERET SMALL LETTER ZHEE*/
- 0x10421, /* U+010449: DESERET SMALL LETTER ER*/
- 0x10422, /* U+01044a: DESERET SMALL LETTER EL*/
- 0x10423, /* U+01044b: DESERET SMALL LETTER EM*/
- 0x10424, /* U+01044c: DESERET SMALL LETTER EN*/
- 0x10425, /* U+01044d: DESERET SMALL LETTER ENG*/
- 0x10426, /* U+01044e: DESERET SMALL LETTER OI*/
- 0x10427, /* U+01044f: DESERET SMALL LETTER EW*/
-};
-
-
-const RTUNICASERANGE g_aRTUniUpperRanges[] =
-{
- { 0x000000, 0x000587, &g_afRTUniUpper0x000000[0] },
- { 0x001e01, 0x0024ea, &g_afRTUniUpper0x001e01[0] },
- { 0x002c30, 0x002d26, &g_afRTUniUpper0x002c30[0] },
- { 0x00ff41, 0x00ff5b, &g_afRTUniUpper0x00ff41[0] },
- { 0x010428, 0x010450, &g_afRTUniUpper0x010428[0] },
- { ~(RTUNICP)0, ~(RTUNICP)0, NULL }
-};
-
-
-static const RTUNICP g_afRTUniLower0x000000[] =
-{
- 0x00, /* U+000000: <control>*/
- 0x01, /* U+000001: <control>*/
- 0x02, /* U+000002: <control>*/
- 0x03, /* U+000003: <control>*/
- 0x04, /* U+000004: <control>*/
- 0x05, /* U+000005: <control>*/
- 0x06, /* U+000006: <control>*/
- 0x07, /* U+000007: <control>*/
- 0x08, /* U+000008: <control>*/
- 0x09, /* U+000009: <control>*/
- 0x0a, /* U+00000a: <control>*/
- 0x0b, /* U+00000b: <control>*/
- 0x0c, /* U+00000c: <control>*/
- 0x0d, /* U+00000d: <control>*/
- 0x0e, /* U+00000e: <control>*/
- 0x0f, /* U+00000f: <control>*/
- 0x10, /* U+000010: <control>*/
- 0x11, /* U+000011: <control>*/
- 0x12, /* U+000012: <control>*/
- 0x13, /* U+000013: <control>*/
- 0x14, /* U+000014: <control>*/
- 0x15, /* U+000015: <control>*/
- 0x16, /* U+000016: <control>*/
- 0x17, /* U+000017: <control>*/
- 0x18, /* U+000018: <control>*/
- 0x19, /* U+000019: <control>*/
- 0x1a, /* U+00001a: <control>*/
- 0x1b, /* U+00001b: <control>*/
- 0x1c, /* U+00001c: <control>*/
- 0x1d, /* U+00001d: <control>*/
- 0x1e, /* U+00001e: <control>*/
- 0x1f, /* U+00001f: <control>*/
- 0x20, /* U+000020: SPACE*/
- 0x21, /* U+000021: EXCLAMATION MARK*/
- 0x22, /* U+000022: QUOTATION MARK*/
- 0x23, /* U+000023: NUMBER SIGN*/
- 0x24, /* U+000024: DOLLAR SIGN*/
- 0x25, /* U+000025: PERCENT SIGN*/
- 0x26, /* U+000026: AMPERSAND*/
- 0x27, /* U+000027: APOSTROPHE*/
- 0x28, /* U+000028: LEFT PARENTHESIS*/
- 0x29, /* U+000029: RIGHT PARENTHESIS*/
- 0x2a, /* U+00002a: ASTERISK*/
- 0x2b, /* U+00002b: PLUS SIGN*/
- 0x2c, /* U+00002c: COMMA*/
- 0x2d, /* U+00002d: HYPHEN-MINUS*/
- 0x2e, /* U+00002e: FULL STOP*/
- 0x2f, /* U+00002f: SOLIDUS*/
- 0x30, /* U+000030: DIGIT ZERO*/
- 0x31, /* U+000031: DIGIT ONE*/
- 0x32, /* U+000032: DIGIT TWO*/
- 0x33, /* U+000033: DIGIT THREE*/
- 0x34, /* U+000034: DIGIT FOUR*/
- 0x35, /* U+000035: DIGIT FIVE*/
- 0x36, /* U+000036: DIGIT SIX*/
- 0x37, /* U+000037: DIGIT SEVEN*/
- 0x38, /* U+000038: DIGIT EIGHT*/
- 0x39, /* U+000039: DIGIT NINE*/
- 0x3a, /* U+00003a: COLON*/
- 0x3b, /* U+00003b: SEMICOLON*/
- 0x3c, /* U+00003c: LESS-THAN SIGN*/
- 0x3d, /* U+00003d: EQUALS SIGN*/
- 0x3e, /* U+00003e: GREATER-THAN SIGN*/
- 0x3f, /* U+00003f: QUESTION MARK*/
- 0x40, /* U+000040: COMMERCIAL AT*/
- 0x61, /* U+000041: LATIN CAPITAL LETTER A*/
- 0x62, /* U+000042: LATIN CAPITAL LETTER B*/
- 0x63, /* U+000043: LATIN CAPITAL LETTER C*/
- 0x64, /* U+000044: LATIN CAPITAL LETTER D*/
- 0x65, /* U+000045: LATIN CAPITAL LETTER E*/
- 0x66, /* U+000046: LATIN CAPITAL LETTER F*/
- 0x67, /* U+000047: LATIN CAPITAL LETTER G*/
- 0x68, /* U+000048: LATIN CAPITAL LETTER H*/
- 0x69, /* U+000049: LATIN CAPITAL LETTER I*/
- 0x6a, /* U+00004a: LATIN CAPITAL LETTER J*/
- 0x6b, /* U+00004b: LATIN CAPITAL LETTER K*/
- 0x6c, /* U+00004c: LATIN CAPITAL LETTER L*/
- 0x6d, /* U+00004d: LATIN CAPITAL LETTER M*/
- 0x6e, /* U+00004e: LATIN CAPITAL LETTER N*/
- 0x6f, /* U+00004f: LATIN CAPITAL LETTER O*/
- 0x70, /* U+000050: LATIN CAPITAL LETTER P*/
- 0x71, /* U+000051: LATIN CAPITAL LETTER Q*/
- 0x72, /* U+000052: LATIN CAPITAL LETTER R*/
- 0x73, /* U+000053: LATIN CAPITAL LETTER S*/
- 0x74, /* U+000054: LATIN CAPITAL LETTER T*/
- 0x75, /* U+000055: LATIN CAPITAL LETTER U*/
- 0x76, /* U+000056: LATIN CAPITAL LETTER V*/
- 0x77, /* U+000057: LATIN CAPITAL LETTER W*/
- 0x78, /* U+000058: LATIN CAPITAL LETTER X*/
- 0x79, /* U+000059: LATIN CAPITAL LETTER Y*/
- 0x7a, /* U+00005a: LATIN CAPITAL LETTER Z*/
- 0x5b, /* U+00005b: LEFT SQUARE BRACKET*/
- 0x5c, /* U+00005c: REVERSE SOLIDUS*/
- 0x5d, /* U+00005d: RIGHT SQUARE BRACKET*/
- 0x5e, /* U+00005e: CIRCUMFLEX ACCENT*/
- 0x5f, /* U+00005f: LOW LINE*/
- 0x60, /* U+000060: GRAVE ACCENT*/
- 0x61, /* U+000061: LATIN SMALL LETTER A*/
- 0x62, /* U+000062: LATIN SMALL LETTER B*/
- 0x63, /* U+000063: LATIN SMALL LETTER C*/
- 0x64, /* U+000064: LATIN SMALL LETTER D*/
- 0x65, /* U+000065: LATIN SMALL LETTER E*/
- 0x66, /* U+000066: LATIN SMALL LETTER F*/
- 0x67, /* U+000067: LATIN SMALL LETTER G*/
- 0x68, /* U+000068: LATIN SMALL LETTER H*/
- 0x69, /* U+000069: LATIN SMALL LETTER I*/
- 0x6a, /* U+00006a: LATIN SMALL LETTER J*/
- 0x6b, /* U+00006b: LATIN SMALL LETTER K*/
- 0x6c, /* U+00006c: LATIN SMALL LETTER L*/
- 0x6d, /* U+00006d: LATIN SMALL LETTER M*/
- 0x6e, /* U+00006e: LATIN SMALL LETTER N*/
- 0x6f, /* U+00006f: LATIN SMALL LETTER O*/
- 0x70, /* U+000070: LATIN SMALL LETTER P*/
- 0x71, /* U+000071: LATIN SMALL LETTER Q*/
- 0x72, /* U+000072: LATIN SMALL LETTER R*/
- 0x73, /* U+000073: LATIN SMALL LETTER S*/
- 0x74, /* U+000074: LATIN SMALL LETTER T*/
- 0x75, /* U+000075: LATIN SMALL LETTER U*/
- 0x76, /* U+000076: LATIN SMALL LETTER V*/
- 0x77, /* U+000077: LATIN SMALL LETTER W*/
- 0x78, /* U+000078: LATIN SMALL LETTER X*/
- 0x79, /* U+000079: LATIN SMALL LETTER Y*/
- 0x7a, /* U+00007a: LATIN SMALL LETTER Z*/
- 0x7b, /* U+00007b: LEFT CURLY BRACKET*/
- 0x7c, /* U+00007c: VERTICAL LINE*/
- 0x7d, /* U+00007d: RIGHT CURLY BRACKET*/
- 0x7e, /* U+00007e: TILDE*/
- 0x7f, /* U+00007f: <control>*/
- 0x80, /* U+000080: <control>*/
- 0x81, /* U+000081: <control>*/
- 0x82, /* U+000082: <control>*/
- 0x83, /* U+000083: <control>*/
- 0x84, /* U+000084: <control>*/
- 0x85, /* U+000085: <control>*/
- 0x86, /* U+000086: <control>*/
- 0x87, /* U+000087: <control>*/
- 0x88, /* U+000088: <control>*/
- 0x89, /* U+000089: <control>*/
- 0x8a, /* U+00008a: <control>*/
- 0x8b, /* U+00008b: <control>*/
- 0x8c, /* U+00008c: <control>*/
- 0x8d, /* U+00008d: <control>*/
- 0x8e, /* U+00008e: <control>*/
- 0x8f, /* U+00008f: <control>*/
- 0x90, /* U+000090: <control>*/
- 0x91, /* U+000091: <control>*/
- 0x92, /* U+000092: <control>*/
- 0x93, /* U+000093: <control>*/
- 0x94, /* U+000094: <control>*/
- 0x95, /* U+000095: <control>*/
- 0x96, /* U+000096: <control>*/
- 0x97, /* U+000097: <control>*/
- 0x98, /* U+000098: <control>*/
- 0x99, /* U+000099: <control>*/
- 0x9a, /* U+00009a: <control>*/
- 0x9b, /* U+00009b: <control>*/
- 0x9c, /* U+00009c: <control>*/
- 0x9d, /* U+00009d: <control>*/
- 0x9e, /* U+00009e: <control>*/
- 0x9f, /* U+00009f: <control>*/
- 0xa0, /* U+0000a0: NO-BREAK SPACE*/
- 0xa1, /* U+0000a1: INVERTED EXCLAMATION MARK*/
- 0xa2, /* U+0000a2: CENT SIGN*/
- 0xa3, /* U+0000a3: POUND SIGN*/
- 0xa4, /* U+0000a4: CURRENCY SIGN*/
- 0xa5, /* U+0000a5: YEN SIGN*/
- 0xa6, /* U+0000a6: BROKEN BAR*/
- 0xa7, /* U+0000a7: SECTION SIGN*/
- 0xa8, /* U+0000a8: DIAERESIS*/
- 0xa9, /* U+0000a9: COPYRIGHT SIGN*/
- 0xaa, /* U+0000aa: FEMININE ORDINAL INDICATOR*/
- 0xab, /* U+0000ab: LEFT-POINTING DOUBLE ANGLE QUOTATION MARK*/
- 0xac, /* U+0000ac: NOT SIGN*/
- 0xad, /* U+0000ad: SOFT HYPHEN*/
- 0xae, /* U+0000ae: REGISTERED SIGN*/
- 0xaf, /* U+0000af: MACRON*/
- 0xb0, /* U+0000b0: DEGREE SIGN*/
- 0xb1, /* U+0000b1: PLUS-MINUS SIGN*/
- 0xb2, /* U+0000b2: SUPERSCRIPT TWO*/
- 0xb3, /* U+0000b3: SUPERSCRIPT THREE*/
- 0xb4, /* U+0000b4: ACUTE ACCENT*/
- 0xb5, /* U+0000b5: MICRO SIGN*/
- 0xb6, /* U+0000b6: PILCROW SIGN*/
- 0xb7, /* U+0000b7: MIDDLE DOT*/
- 0xb8, /* U+0000b8: CEDILLA*/
- 0xb9, /* U+0000b9: SUPERSCRIPT ONE*/
- 0xba, /* U+0000ba: MASCULINE ORDINAL INDICATOR*/
- 0xbb, /* U+0000bb: RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK*/
- 0xbc, /* U+0000bc: VULGAR FRACTION ONE QUARTER*/
- 0xbd, /* U+0000bd: VULGAR FRACTION ONE HALF*/
- 0xbe, /* U+0000be: VULGAR FRACTION THREE QUARTERS*/
- 0xbf, /* U+0000bf: INVERTED QUESTION MARK*/
- 0xe0, /* U+0000c0: LATIN CAPITAL LETTER A WITH GRAVE*/
- 0xe1, /* U+0000c1: LATIN CAPITAL LETTER A WITH ACUTE*/
- 0xe2, /* U+0000c2: LATIN CAPITAL LETTER A WITH CIRCUMFLEX*/
- 0xe3, /* U+0000c3: LATIN CAPITAL LETTER A WITH TILDE*/
- 0xe4, /* U+0000c4: LATIN CAPITAL LETTER A WITH DIAERESIS*/
- 0xe5, /* U+0000c5: LATIN CAPITAL LETTER A WITH RING ABOVE*/
- 0xe6, /* U+0000c6: LATIN CAPITAL LETTER AE*/
- 0xe7, /* U+0000c7: LATIN CAPITAL LETTER C WITH CEDILLA*/
- 0xe8, /* U+0000c8: LATIN CAPITAL LETTER E WITH GRAVE*/
- 0xe9, /* U+0000c9: LATIN CAPITAL LETTER E WITH ACUTE*/
- 0xea, /* U+0000ca: LATIN CAPITAL LETTER E WITH CIRCUMFLEX*/
- 0xeb, /* U+0000cb: LATIN CAPITAL LETTER E WITH DIAERESIS*/
- 0xec, /* U+0000cc: LATIN CAPITAL LETTER I WITH GRAVE*/
- 0xed, /* U+0000cd: LATIN CAPITAL LETTER I WITH ACUTE*/
- 0xee, /* U+0000ce: LATIN CAPITAL LETTER I WITH CIRCUMFLEX*/
- 0xef, /* U+0000cf: LATIN CAPITAL LETTER I WITH DIAERESIS*/
- 0xf0, /* U+0000d0: LATIN CAPITAL LETTER ETH*/
- 0xf1, /* U+0000d1: LATIN CAPITAL LETTER N WITH TILDE*/
- 0xf2, /* U+0000d2: LATIN CAPITAL LETTER O WITH GRAVE*/
- 0xf3, /* U+0000d3: LATIN CAPITAL LETTER O WITH ACUTE*/
- 0xf4, /* U+0000d4: LATIN CAPITAL LETTER O WITH CIRCUMFLEX*/
- 0xf5, /* U+0000d5: LATIN CAPITAL LETTER O WITH TILDE*/
- 0xf6, /* U+0000d6: LATIN CAPITAL LETTER O WITH DIAERESIS*/
- 0xd7, /* U+0000d7: MULTIPLICATION SIGN*/
- 0xf8, /* U+0000d8: LATIN CAPITAL LETTER O WITH STROKE*/
- 0xf9, /* U+0000d9: LATIN CAPITAL LETTER U WITH GRAVE*/
- 0xfa, /* U+0000da: LATIN CAPITAL LETTER U WITH ACUTE*/
- 0xfb, /* U+0000db: LATIN CAPITAL LETTER U WITH CIRCUMFLEX*/
- 0xfc, /* U+0000dc: LATIN CAPITAL LETTER U WITH DIAERESIS*/
- 0xfd, /* U+0000dd: LATIN CAPITAL LETTER Y WITH ACUTE*/
- 0xfe, /* U+0000de: LATIN CAPITAL LETTER THORN*/
- 0xdf, /* U+0000df: LATIN SMALL LETTER SHARP S*/
- 0xe0, /* U+0000e0: LATIN SMALL LETTER A WITH GRAVE*/
- 0xe1, /* U+0000e1: LATIN SMALL LETTER A WITH ACUTE*/
- 0xe2, /* U+0000e2: LATIN SMALL LETTER A WITH CIRCUMFLEX*/
- 0xe3, /* U+0000e3: LATIN SMALL LETTER A WITH TILDE*/
- 0xe4, /* U+0000e4: LATIN SMALL LETTER A WITH DIAERESIS*/
- 0xe5, /* U+0000e5: LATIN SMALL LETTER A WITH RING ABOVE*/
- 0xe6, /* U+0000e6: LATIN SMALL LETTER AE*/
- 0xe7, /* U+0000e7: LATIN SMALL LETTER C WITH CEDILLA*/
- 0xe8, /* U+0000e8: LATIN SMALL LETTER E WITH GRAVE*/
- 0xe9, /* U+0000e9: LATIN SMALL LETTER E WITH ACUTE*/
- 0xea, /* U+0000ea: LATIN SMALL LETTER E WITH CIRCUMFLEX*/
- 0xeb, /* U+0000eb: LATIN SMALL LETTER E WITH DIAERESIS*/
- 0xec, /* U+0000ec: LATIN SMALL LETTER I WITH GRAVE*/
- 0xed, /* U+0000ed: LATIN SMALL LETTER I WITH ACUTE*/
- 0xee, /* U+0000ee: LATIN SMALL LETTER I WITH CIRCUMFLEX*/
- 0xef, /* U+0000ef: LATIN SMALL LETTER I WITH DIAERESIS*/
- 0xf0, /* U+0000f0: LATIN SMALL LETTER ETH*/
- 0xf1, /* U+0000f1: LATIN SMALL LETTER N WITH TILDE*/
- 0xf2, /* U+0000f2: LATIN SMALL LETTER O WITH GRAVE*/
- 0xf3, /* U+0000f3: LATIN SMALL LETTER O WITH ACUTE*/
- 0xf4, /* U+0000f4: LATIN SMALL LETTER O WITH CIRCUMFLEX*/
- 0xf5, /* U+0000f5: LATIN SMALL LETTER O WITH TILDE*/
- 0xf6, /* U+0000f6: LATIN SMALL LETTER O WITH DIAERESIS*/
- 0xf7, /* U+0000f7: DIVISION SIGN*/
- 0xf8, /* U+0000f8: LATIN SMALL LETTER O WITH STROKE*/
- 0xf9, /* U+0000f9: LATIN SMALL LETTER U WITH GRAVE*/
- 0xfa, /* U+0000fa: LATIN SMALL LETTER U WITH ACUTE*/
- 0xfb, /* U+0000fb: LATIN SMALL LETTER U WITH CIRCUMFLEX*/
- 0xfc, /* U+0000fc: LATIN SMALL LETTER U WITH DIAERESIS*/
- 0xfd, /* U+0000fd: LATIN SMALL LETTER Y WITH ACUTE*/
- 0xfe, /* U+0000fe: LATIN SMALL LETTER THORN*/
- 0xff, /* U+0000ff: LATIN SMALL LETTER Y WITH DIAERESIS*/
- 0x101, /* U+000100: LATIN CAPITAL LETTER A WITH MACRON*/
- 0x101, /* U+000101: LATIN SMALL LETTER A WITH MACRON*/
- 0x103, /* U+000102: LATIN CAPITAL LETTER A WITH BREVE*/
- 0x103, /* U+000103: LATIN SMALL LETTER A WITH BREVE*/
- 0x105, /* U+000104: LATIN CAPITAL LETTER A WITH OGONEK*/
- 0x105, /* U+000105: LATIN SMALL LETTER A WITH OGONEK*/
- 0x107, /* U+000106: LATIN CAPITAL LETTER C WITH ACUTE*/
- 0x107, /* U+000107: LATIN SMALL LETTER C WITH ACUTE*/
- 0x109, /* U+000108: LATIN CAPITAL LETTER C WITH CIRCUMFLEX*/
- 0x109, /* U+000109: LATIN SMALL LETTER C WITH CIRCUMFLEX*/
- 0x10b, /* U+00010a: LATIN CAPITAL LETTER C WITH DOT ABOVE*/
- 0x10b, /* U+00010b: LATIN SMALL LETTER C WITH DOT ABOVE*/
- 0x10d, /* U+00010c: LATIN CAPITAL LETTER C WITH CARON*/
- 0x10d, /* U+00010d: LATIN SMALL LETTER C WITH CARON*/
- 0x10f, /* U+00010e: LATIN CAPITAL LETTER D WITH CARON*/
- 0x10f, /* U+00010f: LATIN SMALL LETTER D WITH CARON*/
- 0x111, /* U+000110: LATIN CAPITAL LETTER D WITH STROKE*/
- 0x111, /* U+000111: LATIN SMALL LETTER D WITH STROKE*/
- 0x113, /* U+000112: LATIN CAPITAL LETTER E WITH MACRON*/
- 0x113, /* U+000113: LATIN SMALL LETTER E WITH MACRON*/
- 0x115, /* U+000114: LATIN CAPITAL LETTER E WITH BREVE*/
- 0x115, /* U+000115: LATIN SMALL LETTER E WITH BREVE*/
- 0x117, /* U+000116: LATIN CAPITAL LETTER E WITH DOT ABOVE*/
- 0x117, /* U+000117: LATIN SMALL LETTER E WITH DOT ABOVE*/
- 0x119, /* U+000118: LATIN CAPITAL LETTER E WITH OGONEK*/
- 0x119, /* U+000119: LATIN SMALL LETTER E WITH OGONEK*/
- 0x11b, /* U+00011a: LATIN CAPITAL LETTER E WITH CARON*/
- 0x11b, /* U+00011b: LATIN SMALL LETTER E WITH CARON*/
- 0x11d, /* U+00011c: LATIN CAPITAL LETTER G WITH CIRCUMFLEX*/
- 0x11d, /* U+00011d: LATIN SMALL LETTER G WITH CIRCUMFLEX*/
- 0x11f, /* U+00011e: LATIN CAPITAL LETTER G WITH BREVE*/
- 0x11f, /* U+00011f: LATIN SMALL LETTER G WITH BREVE*/
- 0x121, /* U+000120: LATIN CAPITAL LETTER G WITH DOT ABOVE*/
- 0x121, /* U+000121: LATIN SMALL LETTER G WITH DOT ABOVE*/
- 0x123, /* U+000122: LATIN CAPITAL LETTER G WITH CEDILLA*/
- 0x123, /* U+000123: LATIN SMALL LETTER G WITH CEDILLA*/
- 0x125, /* U+000124: LATIN CAPITAL LETTER H WITH CIRCUMFLEX*/
- 0x125, /* U+000125: LATIN SMALL LETTER H WITH CIRCUMFLEX*/
- 0x127, /* U+000126: LATIN CAPITAL LETTER H WITH STROKE*/
- 0x127, /* U+000127: LATIN SMALL LETTER H WITH STROKE*/
- 0x129, /* U+000128: LATIN CAPITAL LETTER I WITH TILDE*/
- 0x129, /* U+000129: LATIN SMALL LETTER I WITH TILDE*/
- 0x12b, /* U+00012a: LATIN CAPITAL LETTER I WITH MACRON*/
- 0x12b, /* U+00012b: LATIN SMALL LETTER I WITH MACRON*/
- 0x12d, /* U+00012c: LATIN CAPITAL LETTER I WITH BREVE*/
- 0x12d, /* U+00012d: LATIN SMALL LETTER I WITH BREVE*/
- 0x12f, /* U+00012e: LATIN CAPITAL LETTER I WITH OGONEK*/
- 0x12f, /* U+00012f: LATIN SMALL LETTER I WITH OGONEK*/
- 0x69, /* U+000130: LATIN CAPITAL LETTER I WITH DOT ABOVE*/
- 0x131, /* U+000131: LATIN SMALL LETTER DOTLESS I*/
- 0x133, /* U+000132: LATIN CAPITAL LIGATURE IJ*/
- 0x133, /* U+000133: LATIN SMALL LIGATURE IJ*/
- 0x135, /* U+000134: LATIN CAPITAL LETTER J WITH CIRCUMFLEX*/
- 0x135, /* U+000135: LATIN SMALL LETTER J WITH CIRCUMFLEX*/
- 0x137, /* U+000136: LATIN CAPITAL LETTER K WITH CEDILLA*/
- 0x137, /* U+000137: LATIN SMALL LETTER K WITH CEDILLA*/
- 0x138, /* U+000138: LATIN SMALL LETTER KRA*/
- 0x13a, /* U+000139: LATIN CAPITAL LETTER L WITH ACUTE*/
- 0x13a, /* U+00013a: LATIN SMALL LETTER L WITH ACUTE*/
- 0x13c, /* U+00013b: LATIN CAPITAL LETTER L WITH CEDILLA*/
- 0x13c, /* U+00013c: LATIN SMALL LETTER L WITH CEDILLA*/
- 0x13e, /* U+00013d: LATIN CAPITAL LETTER L WITH CARON*/
- 0x13e, /* U+00013e: LATIN SMALL LETTER L WITH CARON*/
- 0x140, /* U+00013f: LATIN CAPITAL LETTER L WITH MIDDLE DOT*/
- 0x140, /* U+000140: LATIN SMALL LETTER L WITH MIDDLE DOT*/
- 0x142, /* U+000141: LATIN CAPITAL LETTER L WITH STROKE*/
- 0x142, /* U+000142: LATIN SMALL LETTER L WITH STROKE*/
- 0x144, /* U+000143: LATIN CAPITAL LETTER N WITH ACUTE*/
- 0x144, /* U+000144: LATIN SMALL LETTER N WITH ACUTE*/
- 0x146, /* U+000145: LATIN CAPITAL LETTER N WITH CEDILLA*/
- 0x146, /* U+000146: LATIN SMALL LETTER N WITH CEDILLA*/
- 0x148, /* U+000147: LATIN CAPITAL LETTER N WITH CARON*/
- 0x148, /* U+000148: LATIN SMALL LETTER N WITH CARON*/
- 0x149, /* U+000149: LATIN SMALL LETTER N PRECEDED BY APOSTROPHE*/
- 0x14b, /* U+00014a: LATIN CAPITAL LETTER ENG*/
- 0x14b, /* U+00014b: LATIN SMALL LETTER ENG*/
- 0x14d, /* U+00014c: LATIN CAPITAL LETTER O WITH MACRON*/
- 0x14d, /* U+00014d: LATIN SMALL LETTER O WITH MACRON*/
- 0x14f, /* U+00014e: LATIN CAPITAL LETTER O WITH BREVE*/
- 0x14f, /* U+00014f: LATIN SMALL LETTER O WITH BREVE*/
- 0x151, /* U+000150: LATIN CAPITAL LETTER O WITH DOUBLE ACUTE*/
- 0x151, /* U+000151: LATIN SMALL LETTER O WITH DOUBLE ACUTE*/
- 0x153, /* U+000152: LATIN CAPITAL LIGATURE OE*/
- 0x153, /* U+000153: LATIN SMALL LIGATURE OE*/
- 0x155, /* U+000154: LATIN CAPITAL LETTER R WITH ACUTE*/
- 0x155, /* U+000155: LATIN SMALL LETTER R WITH ACUTE*/
- 0x157, /* U+000156: LATIN CAPITAL LETTER R WITH CEDILLA*/
- 0x157, /* U+000157: LATIN SMALL LETTER R WITH CEDILLA*/
- 0x159, /* U+000158: LATIN CAPITAL LETTER R WITH CARON*/
- 0x159, /* U+000159: LATIN SMALL LETTER R WITH CARON*/
- 0x15b, /* U+00015a: LATIN CAPITAL LETTER S WITH ACUTE*/
- 0x15b, /* U+00015b: LATIN SMALL LETTER S WITH ACUTE*/
- 0x15d, /* U+00015c: LATIN CAPITAL LETTER S WITH CIRCUMFLEX*/
- 0x15d, /* U+00015d: LATIN SMALL LETTER S WITH CIRCUMFLEX*/
- 0x15f, /* U+00015e: LATIN CAPITAL LETTER S WITH CEDILLA*/
- 0x15f, /* U+00015f: LATIN SMALL LETTER S WITH CEDILLA*/
- 0x161, /* U+000160: LATIN CAPITAL LETTER S WITH CARON*/
- 0x161, /* U+000161: LATIN SMALL LETTER S WITH CARON*/
- 0x163, /* U+000162: LATIN CAPITAL LETTER T WITH CEDILLA*/
- 0x163, /* U+000163: LATIN SMALL LETTER T WITH CEDILLA*/
- 0x165, /* U+000164: LATIN CAPITAL LETTER T WITH CARON*/
- 0x165, /* U+000165: LATIN SMALL LETTER T WITH CARON*/
- 0x167, /* U+000166: LATIN CAPITAL LETTER T WITH STROKE*/
- 0x167, /* U+000167: LATIN SMALL LETTER T WITH STROKE*/
- 0x169, /* U+000168: LATIN CAPITAL LETTER U WITH TILDE*/
- 0x169, /* U+000169: LATIN SMALL LETTER U WITH TILDE*/
- 0x16b, /* U+00016a: LATIN CAPITAL LETTER U WITH MACRON*/
- 0x16b, /* U+00016b: LATIN SMALL LETTER U WITH MACRON*/
- 0x16d, /* U+00016c: LATIN CAPITAL LETTER U WITH BREVE*/
- 0x16d, /* U+00016d: LATIN SMALL LETTER U WITH BREVE*/
- 0x16f, /* U+00016e: LATIN CAPITAL LETTER U WITH RING ABOVE*/
- 0x16f, /* U+00016f: LATIN SMALL LETTER U WITH RING ABOVE*/
- 0x171, /* U+000170: LATIN CAPITAL LETTER U WITH DOUBLE ACUTE*/
- 0x171, /* U+000171: LATIN SMALL LETTER U WITH DOUBLE ACUTE*/
- 0x173, /* U+000172: LATIN CAPITAL LETTER U WITH OGONEK*/
- 0x173, /* U+000173: LATIN SMALL LETTER U WITH OGONEK*/
- 0x175, /* U+000174: LATIN CAPITAL LETTER W WITH CIRCUMFLEX*/
- 0x175, /* U+000175: LATIN SMALL LETTER W WITH CIRCUMFLEX*/
- 0x177, /* U+000176: LATIN CAPITAL LETTER Y WITH CIRCUMFLEX*/
- 0x177, /* U+000177: LATIN SMALL LETTER Y WITH CIRCUMFLEX*/
- 0xff, /* U+000178: LATIN CAPITAL LETTER Y WITH DIAERESIS*/
- 0x17a, /* U+000179: LATIN CAPITAL LETTER Z WITH ACUTE*/
- 0x17a, /* U+00017a: LATIN SMALL LETTER Z WITH ACUTE*/
- 0x17c, /* U+00017b: LATIN CAPITAL LETTER Z WITH DOT ABOVE*/
- 0x17c, /* U+00017c: LATIN SMALL LETTER Z WITH DOT ABOVE*/
- 0x17e, /* U+00017d: LATIN CAPITAL LETTER Z WITH CARON*/
- 0x17e, /* U+00017e: LATIN SMALL LETTER Z WITH CARON*/
- 0x17f, /* U+00017f: LATIN SMALL LETTER LONG S*/
- 0x180, /* U+000180: LATIN SMALL LETTER B WITH STROKE*/
- 0x253, /* U+000181: LATIN CAPITAL LETTER B WITH HOOK*/
- 0x183, /* U+000182: LATIN CAPITAL LETTER B WITH TOPBAR*/
- 0x183, /* U+000183: LATIN SMALL LETTER B WITH TOPBAR*/
- 0x185, /* U+000184: LATIN CAPITAL LETTER TONE SIX*/
- 0x185, /* U+000185: LATIN SMALL LETTER TONE SIX*/
- 0x254, /* U+000186: LATIN CAPITAL LETTER OPEN O*/
- 0x188, /* U+000187: LATIN CAPITAL LETTER C WITH HOOK*/
- 0x188, /* U+000188: LATIN SMALL LETTER C WITH HOOK*/
- 0x256, /* U+000189: LATIN CAPITAL LETTER AFRICAN D*/
- 0x257, /* U+00018a: LATIN CAPITAL LETTER D WITH HOOK*/
- 0x18c, /* U+00018b: LATIN CAPITAL LETTER D WITH TOPBAR*/
- 0x18c, /* U+00018c: LATIN SMALL LETTER D WITH TOPBAR*/
- 0x18d, /* U+00018d: LATIN SMALL LETTER TURNED DELTA*/
- 0x1dd, /* U+00018e: LATIN CAPITAL LETTER REVERSED E*/
- 0x259, /* U+00018f: LATIN CAPITAL LETTER SCHWA*/
- 0x25b, /* U+000190: LATIN CAPITAL LETTER OPEN E*/
- 0x192, /* U+000191: LATIN CAPITAL LETTER F WITH HOOK*/
- 0x192, /* U+000192: LATIN SMALL LETTER F WITH HOOK*/
- 0x260, /* U+000193: LATIN CAPITAL LETTER G WITH HOOK*/
- 0x263, /* U+000194: LATIN CAPITAL LETTER GAMMA*/
- 0x195, /* U+000195: LATIN SMALL LETTER HV*/
- 0x269, /* U+000196: LATIN CAPITAL LETTER IOTA*/
- 0x268, /* U+000197: LATIN CAPITAL LETTER I WITH STROKE*/
- 0x199, /* U+000198: LATIN CAPITAL LETTER K WITH HOOK*/
- 0x199, /* U+000199: LATIN SMALL LETTER K WITH HOOK*/
- 0x19a, /* U+00019a: LATIN SMALL LETTER L WITH BAR*/
- 0x19b, /* U+00019b: LATIN SMALL LETTER LAMBDA WITH STROKE*/
- 0x26f, /* U+00019c: LATIN CAPITAL LETTER TURNED M*/
- 0x272, /* U+00019d: LATIN CAPITAL LETTER N WITH LEFT HOOK*/
- 0x19e, /* U+00019e: LATIN SMALL LETTER N WITH LONG RIGHT LEG*/
- 0x275, /* U+00019f: LATIN CAPITAL LETTER O WITH MIDDLE TILDE*/
- 0x1a1, /* U+0001a0: LATIN CAPITAL LETTER O WITH HORN*/
- 0x1a1, /* U+0001a1: LATIN SMALL LETTER O WITH HORN*/
- 0x1a3, /* U+0001a2: LATIN CAPITAL LETTER OI*/
- 0x1a3, /* U+0001a3: LATIN SMALL LETTER OI*/
- 0x1a5, /* U+0001a4: LATIN CAPITAL LETTER P WITH HOOK*/
- 0x1a5, /* U+0001a5: LATIN SMALL LETTER P WITH HOOK*/
- 0x280, /* U+0001a6: LATIN LETTER YR*/
- 0x1a8, /* U+0001a7: LATIN CAPITAL LETTER TONE TWO*/
- 0x1a8, /* U+0001a8: LATIN SMALL LETTER TONE TWO*/
- 0x283, /* U+0001a9: LATIN CAPITAL LETTER ESH*/
- 0x1aa, /* U+0001aa: LATIN LETTER REVERSED ESH LOOP*/
- 0x1ab, /* U+0001ab: LATIN SMALL LETTER T WITH PALATAL HOOK*/
- 0x1ad, /* U+0001ac: LATIN CAPITAL LETTER T WITH HOOK*/
- 0x1ad, /* U+0001ad: LATIN SMALL LETTER T WITH HOOK*/
- 0x288, /* U+0001ae: LATIN CAPITAL LETTER T WITH RETROFLEX HOOK*/
- 0x1b0, /* U+0001af: LATIN CAPITAL LETTER U WITH HORN*/
- 0x1b0, /* U+0001b0: LATIN SMALL LETTER U WITH HORN*/
- 0x28a, /* U+0001b1: LATIN CAPITAL LETTER UPSILON*/
- 0x28b, /* U+0001b2: LATIN CAPITAL LETTER V WITH HOOK*/
- 0x1b4, /* U+0001b3: LATIN CAPITAL LETTER Y WITH HOOK*/
- 0x1b4, /* U+0001b4: LATIN SMALL LETTER Y WITH HOOK*/
- 0x1b6, /* U+0001b5: LATIN CAPITAL LETTER Z WITH STROKE*/
- 0x1b6, /* U+0001b6: LATIN SMALL LETTER Z WITH STROKE*/
- 0x292, /* U+0001b7: LATIN CAPITAL LETTER EZH*/
- 0x1b9, /* U+0001b8: LATIN CAPITAL LETTER EZH REVERSED*/
- 0x1b9, /* U+0001b9: LATIN SMALL LETTER EZH REVERSED*/
- 0x1ba, /* U+0001ba: LATIN SMALL LETTER EZH WITH TAIL*/
- 0x1bb, /* U+0001bb: LATIN LETTER TWO WITH STROKE*/
- 0x1bd, /* U+0001bc: LATIN CAPITAL LETTER TONE FIVE*/
- 0x1bd, /* U+0001bd: LATIN SMALL LETTER TONE FIVE*/
- 0x1be, /* U+0001be: LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE*/
- 0x1bf, /* U+0001bf: LATIN LETTER WYNN*/
- 0x1c0, /* U+0001c0: LATIN LETTER DENTAL CLICK*/
- 0x1c1, /* U+0001c1: LATIN LETTER LATERAL CLICK*/
- 0x1c2, /* U+0001c2: LATIN LETTER ALVEOLAR CLICK*/
- 0x1c3, /* U+0001c3: LATIN LETTER RETROFLEX CLICK*/
- 0x1c6, /* U+0001c4: LATIN CAPITAL LETTER DZ WITH CARON*/
- 0x1c6, /* U+0001c5: LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON*/
- 0x1c6, /* U+0001c6: LATIN SMALL LETTER DZ WITH CARON*/
- 0x1c9, /* U+0001c7: LATIN CAPITAL LETTER LJ*/
- 0x1c9, /* U+0001c8: LATIN CAPITAL LETTER L WITH SMALL LETTER J*/
- 0x1c9, /* U+0001c9: LATIN SMALL LETTER LJ*/
- 0x1cc, /* U+0001ca: LATIN CAPITAL LETTER NJ*/
- 0x1cc, /* U+0001cb: LATIN CAPITAL LETTER N WITH SMALL LETTER J*/
- 0x1cc, /* U+0001cc: LATIN SMALL LETTER NJ*/
- 0x1ce, /* U+0001cd: LATIN CAPITAL LETTER A WITH CARON*/
- 0x1ce, /* U+0001ce: LATIN SMALL LETTER A WITH CARON*/
- 0x1d0, /* U+0001cf: LATIN CAPITAL LETTER I WITH CARON*/
- 0x1d0, /* U+0001d0: LATIN SMALL LETTER I WITH CARON*/
- 0x1d2, /* U+0001d1: LATIN CAPITAL LETTER O WITH CARON*/
- 0x1d2, /* U+0001d2: LATIN SMALL LETTER O WITH CARON*/
- 0x1d4, /* U+0001d3: LATIN CAPITAL LETTER U WITH CARON*/
- 0x1d4, /* U+0001d4: LATIN SMALL LETTER U WITH CARON*/
- 0x1d6, /* U+0001d5: LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON*/
- 0x1d6, /* U+0001d6: LATIN SMALL LETTER U WITH DIAERESIS AND MACRON*/
- 0x1d8, /* U+0001d7: LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE*/
- 0x1d8, /* U+0001d8: LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE*/
- 0x1da, /* U+0001d9: LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON*/
- 0x1da, /* U+0001da: LATIN SMALL LETTER U WITH DIAERESIS AND CARON*/
- 0x1dc, /* U+0001db: LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE*/
- 0x1dc, /* U+0001dc: LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE*/
- 0x1dd, /* U+0001dd: LATIN SMALL LETTER TURNED E*/
- 0x1df, /* U+0001de: LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON*/
- 0x1df, /* U+0001df: LATIN SMALL LETTER A WITH DIAERESIS AND MACRON*/
- 0x1e1, /* U+0001e0: LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON*/
- 0x1e1, /* U+0001e1: LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON*/
- 0x1e3, /* U+0001e2: LATIN CAPITAL LETTER AE WITH MACRON*/
- 0x1e3, /* U+0001e3: LATIN SMALL LETTER AE WITH MACRON*/
- 0x1e5, /* U+0001e4: LATIN CAPITAL LETTER G WITH STROKE*/
- 0x1e5, /* U+0001e5: LATIN SMALL LETTER G WITH STROKE*/
- 0x1e7, /* U+0001e6: LATIN CAPITAL LETTER G WITH CARON*/
- 0x1e7, /* U+0001e7: LATIN SMALL LETTER G WITH CARON*/
- 0x1e9, /* U+0001e8: LATIN CAPITAL LETTER K WITH CARON*/
- 0x1e9, /* U+0001e9: LATIN SMALL LETTER K WITH CARON*/
- 0x1eb, /* U+0001ea: LATIN CAPITAL LETTER O WITH OGONEK*/
- 0x1eb, /* U+0001eb: LATIN SMALL LETTER O WITH OGONEK*/
- 0x1ed, /* U+0001ec: LATIN CAPITAL LETTER O WITH OGONEK AND MACRON*/
- 0x1ed, /* U+0001ed: LATIN SMALL LETTER O WITH OGONEK AND MACRON*/
- 0x1ef, /* U+0001ee: LATIN CAPITAL LETTER EZH WITH CARON*/
- 0x1ef, /* U+0001ef: LATIN SMALL LETTER EZH WITH CARON*/
- 0x1f0, /* U+0001f0: LATIN SMALL LETTER J WITH CARON*/
- 0x1f3, /* U+0001f1: LATIN CAPITAL LETTER DZ*/
- 0x1f3, /* U+0001f2: LATIN CAPITAL LETTER D WITH SMALL LETTER Z*/
- 0x1f3, /* U+0001f3: LATIN SMALL LETTER DZ*/
- 0x1f5, /* U+0001f4: LATIN CAPITAL LETTER G WITH ACUTE*/
- 0x1f5, /* U+0001f5: LATIN SMALL LETTER G WITH ACUTE*/
- 0x195, /* U+0001f6: LATIN CAPITAL LETTER HWAIR*/
- 0x1bf, /* U+0001f7: LATIN CAPITAL LETTER WYNN*/
- 0x1f9, /* U+0001f8: LATIN CAPITAL LETTER N WITH GRAVE*/
- 0x1f9, /* U+0001f9: LATIN SMALL LETTER N WITH GRAVE*/
- 0x1fb, /* U+0001fa: LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE*/
- 0x1fb, /* U+0001fb: LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE*/
- 0x1fd, /* U+0001fc: LATIN CAPITAL LETTER AE WITH ACUTE*/
- 0x1fd, /* U+0001fd: LATIN SMALL LETTER AE WITH ACUTE*/
- 0x1ff, /* U+0001fe: LATIN CAPITAL LETTER O WITH STROKE AND ACUTE*/
- 0x1ff, /* U+0001ff: LATIN SMALL LETTER O WITH STROKE AND ACUTE*/
- 0x201, /* U+000200: LATIN CAPITAL LETTER A WITH DOUBLE GRAVE*/
- 0x201, /* U+000201: LATIN SMALL LETTER A WITH DOUBLE GRAVE*/
- 0x203, /* U+000202: LATIN CAPITAL LETTER A WITH INVERTED BREVE*/
- 0x203, /* U+000203: LATIN SMALL LETTER A WITH INVERTED BREVE*/
- 0x205, /* U+000204: LATIN CAPITAL LETTER E WITH DOUBLE GRAVE*/
- 0x205, /* U+000205: LATIN SMALL LETTER E WITH DOUBLE GRAVE*/
- 0x207, /* U+000206: LATIN CAPITAL LETTER E WITH INVERTED BREVE*/
- 0x207, /* U+000207: LATIN SMALL LETTER E WITH INVERTED BREVE*/
- 0x209, /* U+000208: LATIN CAPITAL LETTER I WITH DOUBLE GRAVE*/
- 0x209, /* U+000209: LATIN SMALL LETTER I WITH DOUBLE GRAVE*/
- 0x20b, /* U+00020a: LATIN CAPITAL LETTER I WITH INVERTED BREVE*/
- 0x20b, /* U+00020b: LATIN SMALL LETTER I WITH INVERTED BREVE*/
- 0x20d, /* U+00020c: LATIN CAPITAL LETTER O WITH DOUBLE GRAVE*/
- 0x20d, /* U+00020d: LATIN SMALL LETTER O WITH DOUBLE GRAVE*/
- 0x20f, /* U+00020e: LATIN CAPITAL LETTER O WITH INVERTED BREVE*/
- 0x20f, /* U+00020f: LATIN SMALL LETTER O WITH INVERTED BREVE*/
- 0x211, /* U+000210: LATIN CAPITAL LETTER R WITH DOUBLE GRAVE*/
- 0x211, /* U+000211: LATIN SMALL LETTER R WITH DOUBLE GRAVE*/
- 0x213, /* U+000212: LATIN CAPITAL LETTER R WITH INVERTED BREVE*/
- 0x213, /* U+000213: LATIN SMALL LETTER R WITH INVERTED BREVE*/
- 0x215, /* U+000214: LATIN CAPITAL LETTER U WITH DOUBLE GRAVE*/
- 0x215, /* U+000215: LATIN SMALL LETTER U WITH DOUBLE GRAVE*/
- 0x217, /* U+000216: LATIN CAPITAL LETTER U WITH INVERTED BREVE*/
- 0x217, /* U+000217: LATIN SMALL LETTER U WITH INVERTED BREVE*/
- 0x219, /* U+000218: LATIN CAPITAL LETTER S WITH COMMA BELOW*/
- 0x219, /* U+000219: LATIN SMALL LETTER S WITH COMMA BELOW*/
- 0x21b, /* U+00021a: LATIN CAPITAL LETTER T WITH COMMA BELOW*/
- 0x21b, /* U+00021b: LATIN SMALL LETTER T WITH COMMA BELOW*/
- 0x21d, /* U+00021c: LATIN CAPITAL LETTER YOGH*/
- 0x21d, /* U+00021d: LATIN SMALL LETTER YOGH*/
- 0x21f, /* U+00021e: LATIN CAPITAL LETTER H WITH CARON*/
- 0x21f, /* U+00021f: LATIN SMALL LETTER H WITH CARON*/
- 0x19e, /* U+000220: LATIN CAPITAL LETTER N WITH LONG RIGHT LEG*/
- 0x221, /* U+000221: LATIN SMALL LETTER D WITH CURL*/
- 0x223, /* U+000222: LATIN CAPITAL LETTER OU*/
- 0x223, /* U+000223: LATIN SMALL LETTER OU*/
- 0x225, /* U+000224: LATIN CAPITAL LETTER Z WITH HOOK*/
- 0x225, /* U+000225: LATIN SMALL LETTER Z WITH HOOK*/
- 0x227, /* U+000226: LATIN CAPITAL LETTER A WITH DOT ABOVE*/
- 0x227, /* U+000227: LATIN SMALL LETTER A WITH DOT ABOVE*/
- 0x229, /* U+000228: LATIN CAPITAL LETTER E WITH CEDILLA*/
- 0x229, /* U+000229: LATIN SMALL LETTER E WITH CEDILLA*/
- 0x22b, /* U+00022a: LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON*/
- 0x22b, /* U+00022b: LATIN SMALL LETTER O WITH DIAERESIS AND MACRON*/
- 0x22d, /* U+00022c: LATIN CAPITAL LETTER O WITH TILDE AND MACRON*/
- 0x22d, /* U+00022d: LATIN SMALL LETTER O WITH TILDE AND MACRON*/
- 0x22f, /* U+00022e: LATIN CAPITAL LETTER O WITH DOT ABOVE*/
- 0x22f, /* U+00022f: LATIN SMALL LETTER O WITH DOT ABOVE*/
- 0x231, /* U+000230: LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON*/
- 0x231, /* U+000231: LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON*/
- 0x233, /* U+000232: LATIN CAPITAL LETTER Y WITH MACRON*/
- 0x233, /* U+000233: LATIN SMALL LETTER Y WITH MACRON*/
- 0x234, /* U+000234: LATIN SMALL LETTER L WITH CURL*/
- 0x235, /* U+000235: LATIN SMALL LETTER N WITH CURL*/
- 0x236, /* U+000236: LATIN SMALL LETTER T WITH CURL*/
- 0x237, /* U+000237: LATIN SMALL LETTER DOTLESS J*/
- 0x238, /* U+000238: LATIN SMALL LETTER DB DIGRAPH*/
- 0x239, /* U+000239: LATIN SMALL LETTER QP DIGRAPH*/
- 0x23a, /* U+00023a: LATIN CAPITAL LETTER A WITH STROKE*/
- 0x23c, /* U+00023b: LATIN CAPITAL LETTER C WITH STROKE*/
- 0x23c, /* U+00023c: LATIN SMALL LETTER C WITH STROKE*/
- 0x19a, /* U+00023d: LATIN CAPITAL LETTER L WITH BAR*/
- 0x23e, /* U+00023e: LATIN CAPITAL LETTER T WITH DIAGONAL STROKE*/
- 0x23f, /* U+00023f: LATIN SMALL LETTER S WITH SWASH TAIL*/
- 0x240, /* U+000240: LATIN SMALL LETTER Z WITH SWASH TAIL*/
- 0x294, /* U+000241: LATIN CAPITAL LETTER GLOTTAL STOP*/
- 0x242, /* U+000242: */
- 0x243, /* U+000243: */
- 0x244, /* U+000244: */
- 0x245, /* U+000245: */
- 0x246, /* U+000246: */
- 0x247, /* U+000247: */
- 0x248, /* U+000248: */
- 0x249, /* U+000249: */
- 0x24a, /* U+00024a: */
- 0x24b, /* U+00024b: */
- 0x24c, /* U+00024c: */
- 0x24d, /* U+00024d: */
- 0x24e, /* U+00024e: */
- 0x24f, /* U+00024f: */
- 0x250, /* U+000250: LATIN SMALL LETTER TURNED A*/
- 0x251, /* U+000251: LATIN SMALL LETTER ALPHA*/
- 0x252, /* U+000252: LATIN SMALL LETTER TURNED ALPHA*/
- 0x253, /* U+000253: LATIN SMALL LETTER B WITH HOOK*/
- 0x254, /* U+000254: LATIN SMALL LETTER OPEN O*/
- 0x255, /* U+000255: LATIN SMALL LETTER C WITH CURL*/
- 0x256, /* U+000256: LATIN SMALL LETTER D WITH TAIL*/
- 0x257, /* U+000257: LATIN SMALL LETTER D WITH HOOK*/
- 0x258, /* U+000258: LATIN SMALL LETTER REVERSED E*/
- 0x259, /* U+000259: LATIN SMALL LETTER SCHWA*/
- 0x25a, /* U+00025a: LATIN SMALL LETTER SCHWA WITH HOOK*/
- 0x25b, /* U+00025b: LATIN SMALL LETTER OPEN E*/
- 0x25c, /* U+00025c: LATIN SMALL LETTER REVERSED OPEN E*/
- 0x25d, /* U+00025d: LATIN SMALL LETTER REVERSED OPEN E WITH HOOK*/
- 0x25e, /* U+00025e: LATIN SMALL LETTER CLOSED REVERSED OPEN E*/
- 0x25f, /* U+00025f: LATIN SMALL LETTER DOTLESS J WITH STROKE*/
- 0x260, /* U+000260: LATIN SMALL LETTER G WITH HOOK*/
- 0x261, /* U+000261: LATIN SMALL LETTER SCRIPT G*/
- 0x262, /* U+000262: LATIN LETTER SMALL CAPITAL G*/
- 0x263, /* U+000263: LATIN SMALL LETTER GAMMA*/
- 0x264, /* U+000264: LATIN SMALL LETTER RAMS HORN*/
- 0x265, /* U+000265: LATIN SMALL LETTER TURNED H*/
- 0x266, /* U+000266: LATIN SMALL LETTER H WITH HOOK*/
- 0x267, /* U+000267: LATIN SMALL LETTER HENG WITH HOOK*/
- 0x268, /* U+000268: LATIN SMALL LETTER I WITH STROKE*/
- 0x269, /* U+000269: LATIN SMALL LETTER IOTA*/
- 0x26a, /* U+00026a: LATIN LETTER SMALL CAPITAL I*/
- 0x26b, /* U+00026b: LATIN SMALL LETTER L WITH MIDDLE TILDE*/
- 0x26c, /* U+00026c: LATIN SMALL LETTER L WITH BELT*/
- 0x26d, /* U+00026d: LATIN SMALL LETTER L WITH RETROFLEX HOOK*/
- 0x26e, /* U+00026e: LATIN SMALL LETTER LEZH*/
- 0x26f, /* U+00026f: LATIN SMALL LETTER TURNED M*/
- 0x270, /* U+000270: LATIN SMALL LETTER TURNED M WITH LONG LEG*/
- 0x271, /* U+000271: LATIN SMALL LETTER M WITH HOOK*/
- 0x272, /* U+000272: LATIN SMALL LETTER N WITH LEFT HOOK*/
- 0x273, /* U+000273: LATIN SMALL LETTER N WITH RETROFLEX HOOK*/
- 0x274, /* U+000274: LATIN LETTER SMALL CAPITAL N*/
- 0x275, /* U+000275: LATIN SMALL LETTER BARRED O*/
- 0x276, /* U+000276: LATIN LETTER SMALL CAPITAL OE*/
- 0x277, /* U+000277: LATIN SMALL LETTER CLOSED OMEGA*/
- 0x278, /* U+000278: LATIN SMALL LETTER PHI*/
- 0x279, /* U+000279: LATIN SMALL LETTER TURNED R*/
- 0x27a, /* U+00027a: LATIN SMALL LETTER TURNED R WITH LONG LEG*/
- 0x27b, /* U+00027b: LATIN SMALL LETTER TURNED R WITH HOOK*/
- 0x27c, /* U+00027c: LATIN SMALL LETTER R WITH LONG LEG*/
- 0x27d, /* U+00027d: LATIN SMALL LETTER R WITH TAIL*/
- 0x27e, /* U+00027e: LATIN SMALL LETTER R WITH FISHHOOK*/
- 0x27f, /* U+00027f: LATIN SMALL LETTER REVERSED R WITH FISHHOOK*/
- 0x280, /* U+000280: LATIN LETTER SMALL CAPITAL R*/
- 0x281, /* U+000281: LATIN LETTER SMALL CAPITAL INVERTED R*/
- 0x282, /* U+000282: LATIN SMALL LETTER S WITH HOOK*/
- 0x283, /* U+000283: LATIN SMALL LETTER ESH*/
- 0x284, /* U+000284: LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK*/
- 0x285, /* U+000285: LATIN SMALL LETTER SQUAT REVERSED ESH*/
- 0x286, /* U+000286: LATIN SMALL LETTER ESH WITH CURL*/
- 0x287, /* U+000287: LATIN SMALL LETTER TURNED T*/
- 0x288, /* U+000288: LATIN SMALL LETTER T WITH RETROFLEX HOOK*/
- 0x289, /* U+000289: LATIN SMALL LETTER U BAR*/
- 0x28a, /* U+00028a: LATIN SMALL LETTER UPSILON*/
- 0x28b, /* U+00028b: LATIN SMALL LETTER V WITH HOOK*/
- 0x28c, /* U+00028c: LATIN SMALL LETTER TURNED V*/
- 0x28d, /* U+00028d: LATIN SMALL LETTER TURNED W*/
- 0x28e, /* U+00028e: LATIN SMALL LETTER TURNED Y*/
- 0x28f, /* U+00028f: LATIN LETTER SMALL CAPITAL Y*/
- 0x290, /* U+000290: LATIN SMALL LETTER Z WITH RETROFLEX HOOK*/
- 0x291, /* U+000291: LATIN SMALL LETTER Z WITH CURL*/
- 0x292, /* U+000292: LATIN SMALL LETTER EZH*/
- 0x293, /* U+000293: LATIN SMALL LETTER EZH WITH CURL*/
- 0x294, /* U+000294: LATIN LETTER GLOTTAL STOP*/
- 0x295, /* U+000295: LATIN LETTER PHARYNGEAL VOICED FRICATIVE*/
- 0x296, /* U+000296: LATIN LETTER INVERTED GLOTTAL STOP*/
- 0x297, /* U+000297: LATIN LETTER STRETCHED C*/
- 0x298, /* U+000298: LATIN LETTER BILABIAL CLICK*/
- 0x299, /* U+000299: LATIN LETTER SMALL CAPITAL B*/
- 0x29a, /* U+00029a: LATIN SMALL LETTER CLOSED OPEN E*/
- 0x29b, /* U+00029b: LATIN LETTER SMALL CAPITAL G WITH HOOK*/
- 0x29c, /* U+00029c: LATIN LETTER SMALL CAPITAL H*/
- 0x29d, /* U+00029d: LATIN SMALL LETTER J WITH CROSSED-TAIL*/
- 0x29e, /* U+00029e: LATIN SMALL LETTER TURNED K*/
- 0x29f, /* U+00029f: LATIN LETTER SMALL CAPITAL L*/
- 0x2a0, /* U+0002a0: LATIN SMALL LETTER Q WITH HOOK*/
- 0x2a1, /* U+0002a1: LATIN LETTER GLOTTAL STOP WITH STROKE*/
- 0x2a2, /* U+0002a2: LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE*/
- 0x2a3, /* U+0002a3: LATIN SMALL LETTER DZ DIGRAPH*/
- 0x2a4, /* U+0002a4: LATIN SMALL LETTER DEZH DIGRAPH*/
- 0x2a5, /* U+0002a5: LATIN SMALL LETTER DZ DIGRAPH WITH CURL*/
- 0x2a6, /* U+0002a6: LATIN SMALL LETTER TS DIGRAPH*/
- 0x2a7, /* U+0002a7: LATIN SMALL LETTER TESH DIGRAPH*/
- 0x2a8, /* U+0002a8: LATIN SMALL LETTER TC DIGRAPH WITH CURL*/
- 0x2a9, /* U+0002a9: LATIN SMALL LETTER FENG DIGRAPH*/
- 0x2aa, /* U+0002aa: LATIN SMALL LETTER LS DIGRAPH*/
- 0x2ab, /* U+0002ab: LATIN SMALL LETTER LZ DIGRAPH*/
- 0x2ac, /* U+0002ac: LATIN LETTER BILABIAL PERCUSSIVE*/
- 0x2ad, /* U+0002ad: LATIN LETTER BIDENTAL PERCUSSIVE*/
- 0x2ae, /* U+0002ae: LATIN SMALL LETTER TURNED H WITH FISHHOOK*/
- 0x2af, /* U+0002af: LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL*/
- 0x2b0, /* U+0002b0: MODIFIER LETTER SMALL H*/
- 0x2b1, /* U+0002b1: MODIFIER LETTER SMALL H WITH HOOK*/
- 0x2b2, /* U+0002b2: MODIFIER LETTER SMALL J*/
- 0x2b3, /* U+0002b3: MODIFIER LETTER SMALL R*/
- 0x2b4, /* U+0002b4: MODIFIER LETTER SMALL TURNED R*/
- 0x2b5, /* U+0002b5: MODIFIER LETTER SMALL TURNED R WITH HOOK*/
- 0x2b6, /* U+0002b6: MODIFIER LETTER SMALL CAPITAL INVERTED R*/
- 0x2b7, /* U+0002b7: MODIFIER LETTER SMALL W*/
- 0x2b8, /* U+0002b8: MODIFIER LETTER SMALL Y*/
- 0x2b9, /* U+0002b9: MODIFIER LETTER PRIME*/
- 0x2ba, /* U+0002ba: MODIFIER LETTER DOUBLE PRIME*/
- 0x2bb, /* U+0002bb: MODIFIER LETTER TURNED COMMA*/
- 0x2bc, /* U+0002bc: MODIFIER LETTER APOSTROPHE*/
- 0x2bd, /* U+0002bd: MODIFIER LETTER REVERSED COMMA*/
- 0x2be, /* U+0002be: MODIFIER LETTER RIGHT HALF RING*/
- 0x2bf, /* U+0002bf: MODIFIER LETTER LEFT HALF RING*/
- 0x2c0, /* U+0002c0: MODIFIER LETTER GLOTTAL STOP*/
- 0x2c1, /* U+0002c1: MODIFIER LETTER REVERSED GLOTTAL STOP*/
- 0x2c2, /* U+0002c2: MODIFIER LETTER LEFT ARROWHEAD*/
- 0x2c3, /* U+0002c3: MODIFIER LETTER RIGHT ARROWHEAD*/
- 0x2c4, /* U+0002c4: MODIFIER LETTER UP ARROWHEAD*/
- 0x2c5, /* U+0002c5: MODIFIER LETTER DOWN ARROWHEAD*/
- 0x2c6, /* U+0002c6: MODIFIER LETTER CIRCUMFLEX ACCENT*/
- 0x2c7, /* U+0002c7: CARON*/
- 0x2c8, /* U+0002c8: MODIFIER LETTER VERTICAL LINE*/
- 0x2c9, /* U+0002c9: MODIFIER LETTER MACRON*/
- 0x2ca, /* U+0002ca: MODIFIER LETTER ACUTE ACCENT*/
- 0x2cb, /* U+0002cb: MODIFIER LETTER GRAVE ACCENT*/
- 0x2cc, /* U+0002cc: MODIFIER LETTER LOW VERTICAL LINE*/
- 0x2cd, /* U+0002cd: MODIFIER LETTER LOW MACRON*/
- 0x2ce, /* U+0002ce: MODIFIER LETTER LOW GRAVE ACCENT*/
- 0x2cf, /* U+0002cf: MODIFIER LETTER LOW ACUTE ACCENT*/
- 0x2d0, /* U+0002d0: MODIFIER LETTER TRIANGULAR COLON*/
- 0x2d1, /* U+0002d1: MODIFIER LETTER HALF TRIANGULAR COLON*/
- 0x2d2, /* U+0002d2: MODIFIER LETTER CENTRED RIGHT HALF RING*/
- 0x2d3, /* U+0002d3: MODIFIER LETTER CENTRED LEFT HALF RING*/
- 0x2d4, /* U+0002d4: MODIFIER LETTER UP TACK*/
- 0x2d5, /* U+0002d5: MODIFIER LETTER DOWN TACK*/
- 0x2d6, /* U+0002d6: MODIFIER LETTER PLUS SIGN*/
- 0x2d7, /* U+0002d7: MODIFIER LETTER MINUS SIGN*/
- 0x2d8, /* U+0002d8: BREVE*/
- 0x2d9, /* U+0002d9: DOT ABOVE*/
- 0x2da, /* U+0002da: RING ABOVE*/
- 0x2db, /* U+0002db: OGONEK*/
- 0x2dc, /* U+0002dc: SMALL TILDE*/
- 0x2dd, /* U+0002dd: DOUBLE ACUTE ACCENT*/
- 0x2de, /* U+0002de: MODIFIER LETTER RHOTIC HOOK*/
- 0x2df, /* U+0002df: MODIFIER LETTER CROSS ACCENT*/
- 0x2e0, /* U+0002e0: MODIFIER LETTER SMALL GAMMA*/
- 0x2e1, /* U+0002e1: MODIFIER LETTER SMALL L*/
- 0x2e2, /* U+0002e2: MODIFIER LETTER SMALL S*/
- 0x2e3, /* U+0002e3: MODIFIER LETTER SMALL X*/
- 0x2e4, /* U+0002e4: MODIFIER LETTER SMALL REVERSED GLOTTAL STOP*/
- 0x2e5, /* U+0002e5: MODIFIER LETTER EXTRA-HIGH TONE BAR*/
- 0x2e6, /* U+0002e6: MODIFIER LETTER HIGH TONE BAR*/
- 0x2e7, /* U+0002e7: MODIFIER LETTER MID TONE BAR*/
- 0x2e8, /* U+0002e8: MODIFIER LETTER LOW TONE BAR*/
- 0x2e9, /* U+0002e9: MODIFIER LETTER EXTRA-LOW TONE BAR*/
- 0x2ea, /* U+0002ea: MODIFIER LETTER YIN DEPARTING TONE MARK*/
- 0x2eb, /* U+0002eb: MODIFIER LETTER YANG DEPARTING TONE MARK*/
- 0x2ec, /* U+0002ec: MODIFIER LETTER VOICING*/
- 0x2ed, /* U+0002ed: MODIFIER LETTER UNASPIRATED*/
- 0x2ee, /* U+0002ee: MODIFIER LETTER DOUBLE APOSTROPHE*/
- 0x2ef, /* U+0002ef: MODIFIER LETTER LOW DOWN ARROWHEAD*/
- 0x2f0, /* U+0002f0: MODIFIER LETTER LOW UP ARROWHEAD*/
- 0x2f1, /* U+0002f1: MODIFIER LETTER LOW LEFT ARROWHEAD*/
- 0x2f2, /* U+0002f2: MODIFIER LETTER LOW RIGHT ARROWHEAD*/
- 0x2f3, /* U+0002f3: MODIFIER LETTER LOW RING*/
- 0x2f4, /* U+0002f4: MODIFIER LETTER MIDDLE GRAVE ACCENT*/
- 0x2f5, /* U+0002f5: MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT*/
- 0x2f6, /* U+0002f6: MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT*/
- 0x2f7, /* U+0002f7: MODIFIER LETTER LOW TILDE*/
- 0x2f8, /* U+0002f8: MODIFIER LETTER RAISED COLON*/
- 0x2f9, /* U+0002f9: MODIFIER LETTER BEGIN HIGH TONE*/
- 0x2fa, /* U+0002fa: MODIFIER LETTER END HIGH TONE*/
- 0x2fb, /* U+0002fb: MODIFIER LETTER BEGIN LOW TONE*/
- 0x2fc, /* U+0002fc: MODIFIER LETTER END LOW TONE*/
- 0x2fd, /* U+0002fd: MODIFIER LETTER SHELF*/
- 0x2fe, /* U+0002fe: MODIFIER LETTER OPEN SHELF*/
- 0x2ff, /* U+0002ff: MODIFIER LETTER LOW LEFT ARROW*/
- 0x300, /* U+000300: COMBINING GRAVE ACCENT*/
- 0x301, /* U+000301: COMBINING ACUTE ACCENT*/
- 0x302, /* U+000302: COMBINING CIRCUMFLEX ACCENT*/
- 0x303, /* U+000303: COMBINING TILDE*/
- 0x304, /* U+000304: COMBINING MACRON*/
- 0x305, /* U+000305: COMBINING OVERLINE*/
- 0x306, /* U+000306: COMBINING BREVE*/
- 0x307, /* U+000307: COMBINING DOT ABOVE*/
- 0x308, /* U+000308: COMBINING DIAERESIS*/
- 0x309, /* U+000309: COMBINING HOOK ABOVE*/
- 0x30a, /* U+00030a: COMBINING RING ABOVE*/
- 0x30b, /* U+00030b: COMBINING DOUBLE ACUTE ACCENT*/
- 0x30c, /* U+00030c: COMBINING CARON*/
- 0x30d, /* U+00030d: COMBINING VERTICAL LINE ABOVE*/
- 0x30e, /* U+00030e: COMBINING DOUBLE VERTICAL LINE ABOVE*/
- 0x30f, /* U+00030f: COMBINING DOUBLE GRAVE ACCENT*/
- 0x310, /* U+000310: COMBINING CANDRABINDU*/
- 0x311, /* U+000311: COMBINING INVERTED BREVE*/
- 0x312, /* U+000312: COMBINING TURNED COMMA ABOVE*/
- 0x313, /* U+000313: COMBINING COMMA ABOVE*/
- 0x314, /* U+000314: COMBINING REVERSED COMMA ABOVE*/
- 0x315, /* U+000315: COMBINING COMMA ABOVE RIGHT*/
- 0x316, /* U+000316: COMBINING GRAVE ACCENT BELOW*/
- 0x317, /* U+000317: COMBINING ACUTE ACCENT BELOW*/
- 0x318, /* U+000318: COMBINING LEFT TACK BELOW*/
- 0x319, /* U+000319: COMBINING RIGHT TACK BELOW*/
- 0x31a, /* U+00031a: COMBINING LEFT ANGLE ABOVE*/
- 0x31b, /* U+00031b: COMBINING HORN*/
- 0x31c, /* U+00031c: COMBINING LEFT HALF RING BELOW*/
- 0x31d, /* U+00031d: COMBINING UP TACK BELOW*/
- 0x31e, /* U+00031e: COMBINING DOWN TACK BELOW*/
- 0x31f, /* U+00031f: COMBINING PLUS SIGN BELOW*/
- 0x320, /* U+000320: COMBINING MINUS SIGN BELOW*/
- 0x321, /* U+000321: COMBINING PALATALIZED HOOK BELOW*/
- 0x322, /* U+000322: COMBINING RETROFLEX HOOK BELOW*/
- 0x323, /* U+000323: COMBINING DOT BELOW*/
- 0x324, /* U+000324: COMBINING DIAERESIS BELOW*/
- 0x325, /* U+000325: COMBINING RING BELOW*/
- 0x326, /* U+000326: COMBINING COMMA BELOW*/
- 0x327, /* U+000327: COMBINING CEDILLA*/
- 0x328, /* U+000328: COMBINING OGONEK*/
- 0x329, /* U+000329: COMBINING VERTICAL LINE BELOW*/
- 0x32a, /* U+00032a: COMBINING BRIDGE BELOW*/
- 0x32b, /* U+00032b: COMBINING INVERTED DOUBLE ARCH BELOW*/
- 0x32c, /* U+00032c: COMBINING CARON BELOW*/
- 0x32d, /* U+00032d: COMBINING CIRCUMFLEX ACCENT BELOW*/
- 0x32e, /* U+00032e: COMBINING BREVE BELOW*/
- 0x32f, /* U+00032f: COMBINING INVERTED BREVE BELOW*/
- 0x330, /* U+000330: COMBINING TILDE BELOW*/
- 0x331, /* U+000331: COMBINING MACRON BELOW*/
- 0x332, /* U+000332: COMBINING LOW LINE*/
- 0x333, /* U+000333: COMBINING DOUBLE LOW LINE*/
- 0x334, /* U+000334: COMBINING TILDE OVERLAY*/
- 0x335, /* U+000335: COMBINING SHORT STROKE OVERLAY*/
- 0x336, /* U+000336: COMBINING LONG STROKE OVERLAY*/
- 0x337, /* U+000337: COMBINING SHORT SOLIDUS OVERLAY*/
- 0x338, /* U+000338: COMBINING LONG SOLIDUS OVERLAY*/
- 0x339, /* U+000339: COMBINING RIGHT HALF RING BELOW*/
- 0x33a, /* U+00033a: COMBINING INVERTED BRIDGE BELOW*/
- 0x33b, /* U+00033b: COMBINING SQUARE BELOW*/
- 0x33c, /* U+00033c: COMBINING SEAGULL BELOW*/
- 0x33d, /* U+00033d: COMBINING X ABOVE*/
- 0x33e, /* U+00033e: COMBINING VERTICAL TILDE*/
- 0x33f, /* U+00033f: COMBINING DOUBLE OVERLINE*/
- 0x340, /* U+000340: COMBINING GRAVE TONE MARK*/
- 0x341, /* U+000341: COMBINING ACUTE TONE MARK*/
- 0x342, /* U+000342: COMBINING GREEK PERISPOMENI*/
- 0x343, /* U+000343: COMBINING GREEK KORONIS*/
- 0x344, /* U+000344: COMBINING GREEK DIALYTIKA TONOS*/
- 0x345, /* U+000345: COMBINING GREEK YPOGEGRAMMENI*/
- 0x346, /* U+000346: COMBINING BRIDGE ABOVE*/
- 0x347, /* U+000347: COMBINING EQUALS SIGN BELOW*/
- 0x348, /* U+000348: COMBINING DOUBLE VERTICAL LINE BELOW*/
- 0x349, /* U+000349: COMBINING LEFT ANGLE BELOW*/
- 0x34a, /* U+00034a: COMBINING NOT TILDE ABOVE*/
- 0x34b, /* U+00034b: COMBINING HOMOTHETIC ABOVE*/
- 0x34c, /* U+00034c: COMBINING ALMOST EQUAL TO ABOVE*/
- 0x34d, /* U+00034d: COMBINING LEFT RIGHT ARROW BELOW*/
- 0x34e, /* U+00034e: COMBINING UPWARDS ARROW BELOW*/
- 0x34f, /* U+00034f: COMBINING GRAPHEME JOINER*/
- 0x350, /* U+000350: COMBINING RIGHT ARROWHEAD ABOVE*/
- 0x351, /* U+000351: COMBINING LEFT HALF RING ABOVE*/
- 0x352, /* U+000352: COMBINING FERMATA*/
- 0x353, /* U+000353: COMBINING X BELOW*/
- 0x354, /* U+000354: COMBINING LEFT ARROWHEAD BELOW*/
- 0x355, /* U+000355: COMBINING RIGHT ARROWHEAD BELOW*/
- 0x356, /* U+000356: COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW*/
- 0x357, /* U+000357: COMBINING RIGHT HALF RING ABOVE*/
- 0x358, /* U+000358: COMBINING DOT ABOVE RIGHT*/
- 0x359, /* U+000359: COMBINING ASTERISK BELOW*/
- 0x35a, /* U+00035a: COMBINING DOUBLE RING BELOW*/
- 0x35b, /* U+00035b: COMBINING ZIGZAG ABOVE*/
- 0x35c, /* U+00035c: COMBINING DOUBLE BREVE BELOW*/
- 0x35d, /* U+00035d: COMBINING DOUBLE BREVE*/
- 0x35e, /* U+00035e: COMBINING DOUBLE MACRON*/
- 0x35f, /* U+00035f: COMBINING DOUBLE MACRON BELOW*/
- 0x360, /* U+000360: COMBINING DOUBLE TILDE*/
- 0x361, /* U+000361: COMBINING DOUBLE INVERTED BREVE*/
- 0x362, /* U+000362: COMBINING DOUBLE RIGHTWARDS ARROW BELOW*/
- 0x363, /* U+000363: COMBINING LATIN SMALL LETTER A*/
- 0x364, /* U+000364: COMBINING LATIN SMALL LETTER E*/
- 0x365, /* U+000365: COMBINING LATIN SMALL LETTER I*/
- 0x366, /* U+000366: COMBINING LATIN SMALL LETTER O*/
- 0x367, /* U+000367: COMBINING LATIN SMALL LETTER U*/
- 0x368, /* U+000368: COMBINING LATIN SMALL LETTER C*/
- 0x369, /* U+000369: COMBINING LATIN SMALL LETTER D*/
- 0x36a, /* U+00036a: COMBINING LATIN SMALL LETTER H*/
- 0x36b, /* U+00036b: COMBINING LATIN SMALL LETTER M*/
- 0x36c, /* U+00036c: COMBINING LATIN SMALL LETTER R*/
- 0x36d, /* U+00036d: COMBINING LATIN SMALL LETTER T*/
- 0x36e, /* U+00036e: COMBINING LATIN SMALL LETTER V*/
- 0x36f, /* U+00036f: COMBINING LATIN SMALL LETTER X*/
- 0x370, /* U+000370: */
- 0x371, /* U+000371: */
- 0x372, /* U+000372: */
- 0x373, /* U+000373: */
- 0x374, /* U+000374: GREEK NUMERAL SIGN*/
- 0x375, /* U+000375: GREEK LOWER NUMERAL SIGN*/
- 0x376, /* U+000376: */
- 0x377, /* U+000377: */
- 0x378, /* U+000378: */
- 0x379, /* U+000379: */
- 0x37a, /* U+00037a: GREEK YPOGEGRAMMENI*/
- 0x37b, /* U+00037b: */
- 0x37c, /* U+00037c: */
- 0x37d, /* U+00037d: */
- 0x37e, /* U+00037e: GREEK QUESTION MARK*/
- 0x37f, /* U+00037f: */
- 0x380, /* U+000380: */
- 0x381, /* U+000381: */
- 0x382, /* U+000382: */
- 0x383, /* U+000383: */
- 0x384, /* U+000384: GREEK TONOS*/
- 0x385, /* U+000385: GREEK DIALYTIKA TONOS*/
- 0x3ac, /* U+000386: GREEK CAPITAL LETTER ALPHA WITH TONOS*/
- 0x387, /* U+000387: GREEK ANO TELEIA*/
- 0x3ad, /* U+000388: GREEK CAPITAL LETTER EPSILON WITH TONOS*/
- 0x3ae, /* U+000389: GREEK CAPITAL LETTER ETA WITH TONOS*/
- 0x3af, /* U+00038a: GREEK CAPITAL LETTER IOTA WITH TONOS*/
- 0x38b, /* U+00038b: */
- 0x3cc, /* U+00038c: GREEK CAPITAL LETTER OMICRON WITH TONOS*/
- 0x38d, /* U+00038d: */
- 0x3cd, /* U+00038e: GREEK CAPITAL LETTER UPSILON WITH TONOS*/
- 0x3ce, /* U+00038f: GREEK CAPITAL LETTER OMEGA WITH TONOS*/
- 0x390, /* U+000390: GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS*/
- 0x3b1, /* U+000391: GREEK CAPITAL LETTER ALPHA*/
- 0x3b2, /* U+000392: GREEK CAPITAL LETTER BETA*/
- 0x3b3, /* U+000393: GREEK CAPITAL LETTER GAMMA*/
- 0x3b4, /* U+000394: GREEK CAPITAL LETTER DELTA*/
- 0x3b5, /* U+000395: GREEK CAPITAL LETTER EPSILON*/
- 0x3b6, /* U+000396: GREEK CAPITAL LETTER ZETA*/
- 0x3b7, /* U+000397: GREEK CAPITAL LETTER ETA*/
- 0x3b8, /* U+000398: GREEK CAPITAL LETTER THETA*/
- 0x3b9, /* U+000399: GREEK CAPITAL LETTER IOTA*/
- 0x3ba, /* U+00039a: GREEK CAPITAL LETTER KAPPA*/
- 0x3bb, /* U+00039b: GREEK CAPITAL LETTER LAMDA*/
- 0x3bc, /* U+00039c: GREEK CAPITAL LETTER MU*/
- 0x3bd, /* U+00039d: GREEK CAPITAL LETTER NU*/
- 0x3be, /* U+00039e: GREEK CAPITAL LETTER XI*/
- 0x3bf, /* U+00039f: GREEK CAPITAL LETTER OMICRON*/
- 0x3c0, /* U+0003a0: GREEK CAPITAL LETTER PI*/
- 0x3c1, /* U+0003a1: GREEK CAPITAL LETTER RHO*/
- 0x3a2, /* U+0003a2: */
- 0x3c3, /* U+0003a3: GREEK CAPITAL LETTER SIGMA*/
- 0x3c4, /* U+0003a4: GREEK CAPITAL LETTER TAU*/
- 0x3c5, /* U+0003a5: GREEK CAPITAL LETTER UPSILON*/
- 0x3c6, /* U+0003a6: GREEK CAPITAL LETTER PHI*/
- 0x3c7, /* U+0003a7: GREEK CAPITAL LETTER CHI*/
- 0x3c8, /* U+0003a8: GREEK CAPITAL LETTER PSI*/
- 0x3c9, /* U+0003a9: GREEK CAPITAL LETTER OMEGA*/
- 0x3ca, /* U+0003aa: GREEK CAPITAL LETTER IOTA WITH DIALYTIKA*/
- 0x3cb, /* U+0003ab: GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA*/
- 0x3ac, /* U+0003ac: GREEK SMALL LETTER ALPHA WITH TONOS*/
- 0x3ad, /* U+0003ad: GREEK SMALL LETTER EPSILON WITH TONOS*/
- 0x3ae, /* U+0003ae: GREEK SMALL LETTER ETA WITH TONOS*/
- 0x3af, /* U+0003af: GREEK SMALL LETTER IOTA WITH TONOS*/
- 0x3b0, /* U+0003b0: GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS*/
- 0x3b1, /* U+0003b1: GREEK SMALL LETTER ALPHA*/
- 0x3b2, /* U+0003b2: GREEK SMALL LETTER BETA*/
- 0x3b3, /* U+0003b3: GREEK SMALL LETTER GAMMA*/
- 0x3b4, /* U+0003b4: GREEK SMALL LETTER DELTA*/
- 0x3b5, /* U+0003b5: GREEK SMALL LETTER EPSILON*/
- 0x3b6, /* U+0003b6: GREEK SMALL LETTER ZETA*/
- 0x3b7, /* U+0003b7: GREEK SMALL LETTER ETA*/
- 0x3b8, /* U+0003b8: GREEK SMALL LETTER THETA*/
- 0x3b9, /* U+0003b9: GREEK SMALL LETTER IOTA*/
- 0x3ba, /* U+0003ba: GREEK SMALL LETTER KAPPA*/
- 0x3bb, /* U+0003bb: GREEK SMALL LETTER LAMDA*/
- 0x3bc, /* U+0003bc: GREEK SMALL LETTER MU*/
- 0x3bd, /* U+0003bd: GREEK SMALL LETTER NU*/
- 0x3be, /* U+0003be: GREEK SMALL LETTER XI*/
- 0x3bf, /* U+0003bf: GREEK SMALL LETTER OMICRON*/
- 0x3c0, /* U+0003c0: GREEK SMALL LETTER PI*/
- 0x3c1, /* U+0003c1: GREEK SMALL LETTER RHO*/
- 0x3c2, /* U+0003c2: GREEK SMALL LETTER FINAL SIGMA*/
- 0x3c3, /* U+0003c3: GREEK SMALL LETTER SIGMA*/
- 0x3c4, /* U+0003c4: GREEK SMALL LETTER TAU*/
- 0x3c5, /* U+0003c5: GREEK SMALL LETTER UPSILON*/
- 0x3c6, /* U+0003c6: GREEK SMALL LETTER PHI*/
- 0x3c7, /* U+0003c7: GREEK SMALL LETTER CHI*/
- 0x3c8, /* U+0003c8: GREEK SMALL LETTER PSI*/
- 0x3c9, /* U+0003c9: GREEK SMALL LETTER OMEGA*/
- 0x3ca, /* U+0003ca: GREEK SMALL LETTER IOTA WITH DIALYTIKA*/
- 0x3cb, /* U+0003cb: GREEK SMALL LETTER UPSILON WITH DIALYTIKA*/
- 0x3cc, /* U+0003cc: GREEK SMALL LETTER OMICRON WITH TONOS*/
- 0x3cd, /* U+0003cd: GREEK SMALL LETTER UPSILON WITH TONOS*/
- 0x3ce, /* U+0003ce: GREEK SMALL LETTER OMEGA WITH TONOS*/
- 0x3cf, /* U+0003cf: */
- 0x3d0, /* U+0003d0: GREEK BETA SYMBOL*/
- 0x3d1, /* U+0003d1: GREEK THETA SYMBOL*/
- 0x3d2, /* U+0003d2: GREEK UPSILON WITH HOOK SYMBOL*/
- 0x3d3, /* U+0003d3: GREEK UPSILON WITH ACUTE AND HOOK SYMBOL*/
- 0x3d4, /* U+0003d4: GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL*/
- 0x3d5, /* U+0003d5: GREEK PHI SYMBOL*/
- 0x3d6, /* U+0003d6: GREEK PI SYMBOL*/
- 0x3d7, /* U+0003d7: GREEK KAI SYMBOL*/
- 0x3d9, /* U+0003d8: GREEK LETTER ARCHAIC KOPPA*/
- 0x3d9, /* U+0003d9: GREEK SMALL LETTER ARCHAIC KOPPA*/
- 0x3db, /* U+0003da: GREEK LETTER STIGMA*/
- 0x3db, /* U+0003db: GREEK SMALL LETTER STIGMA*/
- 0x3dd, /* U+0003dc: GREEK LETTER DIGAMMA*/
- 0x3dd, /* U+0003dd: GREEK SMALL LETTER DIGAMMA*/
- 0x3df, /* U+0003de: GREEK LETTER KOPPA*/
- 0x3df, /* U+0003df: GREEK SMALL LETTER KOPPA*/
- 0x3e1, /* U+0003e0: GREEK LETTER SAMPI*/
- 0x3e1, /* U+0003e1: GREEK SMALL LETTER SAMPI*/
- 0x3e3, /* U+0003e2: COPTIC CAPITAL LETTER SHEI*/
- 0x3e3, /* U+0003e3: COPTIC SMALL LETTER SHEI*/
- 0x3e5, /* U+0003e4: COPTIC CAPITAL LETTER FEI*/
- 0x3e5, /* U+0003e5: COPTIC SMALL LETTER FEI*/
- 0x3e7, /* U+0003e6: COPTIC CAPITAL LETTER KHEI*/
- 0x3e7, /* U+0003e7: COPTIC SMALL LETTER KHEI*/
- 0x3e9, /* U+0003e8: COPTIC CAPITAL LETTER HORI*/
- 0x3e9, /* U+0003e9: COPTIC SMALL LETTER HORI*/
- 0x3eb, /* U+0003ea: COPTIC CAPITAL LETTER GANGIA*/
- 0x3eb, /* U+0003eb: COPTIC SMALL LETTER GANGIA*/
- 0x3ed, /* U+0003ec: COPTIC CAPITAL LETTER SHIMA*/
- 0x3ed, /* U+0003ed: COPTIC SMALL LETTER SHIMA*/
- 0x3ef, /* U+0003ee: COPTIC CAPITAL LETTER DEI*/
- 0x3ef, /* U+0003ef: COPTIC SMALL LETTER DEI*/
- 0x3f0, /* U+0003f0: GREEK KAPPA SYMBOL*/
- 0x3f1, /* U+0003f1: GREEK RHO SYMBOL*/
- 0x3f2, /* U+0003f2: GREEK LUNATE SIGMA SYMBOL*/
- 0x3f3, /* U+0003f3: GREEK LETTER YOT*/
- 0x3b8, /* U+0003f4: GREEK CAPITAL THETA SYMBOL*/
- 0x3f5, /* U+0003f5: GREEK LUNATE EPSILON SYMBOL*/
- 0x3f6, /* U+0003f6: GREEK REVERSED LUNATE EPSILON SYMBOL*/
- 0x3f8, /* U+0003f7: GREEK CAPITAL LETTER SHO*/
- 0x3f8, /* U+0003f8: GREEK SMALL LETTER SHO*/
- 0x3f2, /* U+0003f9: GREEK CAPITAL LUNATE SIGMA SYMBOL*/
- 0x3fb, /* U+0003fa: GREEK CAPITAL LETTER SAN*/
- 0x3fb, /* U+0003fb: GREEK SMALL LETTER SAN*/
- 0x3fc, /* U+0003fc: GREEK RHO WITH STROKE SYMBOL*/
- 0x3fd, /* U+0003fd: GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL*/
- 0x3fe, /* U+0003fe: GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL*/
- 0x3ff, /* U+0003ff: GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL*/
- 0x450, /* U+000400: CYRILLIC CAPITAL LETTER IE WITH GRAVE*/
- 0x451, /* U+000401: CYRILLIC CAPITAL LETTER IO*/
- 0x452, /* U+000402: CYRILLIC CAPITAL LETTER DJE*/
- 0x453, /* U+000403: CYRILLIC CAPITAL LETTER GJE*/
- 0x454, /* U+000404: CYRILLIC CAPITAL LETTER UKRAINIAN IE*/
- 0x455, /* U+000405: CYRILLIC CAPITAL LETTER DZE*/
- 0x456, /* U+000406: CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I*/
- 0x457, /* U+000407: CYRILLIC CAPITAL LETTER YI*/
- 0x458, /* U+000408: CYRILLIC CAPITAL LETTER JE*/
- 0x459, /* U+000409: CYRILLIC CAPITAL LETTER LJE*/
- 0x45a, /* U+00040a: CYRILLIC CAPITAL LETTER NJE*/
- 0x45b, /* U+00040b: CYRILLIC CAPITAL LETTER TSHE*/
- 0x45c, /* U+00040c: CYRILLIC CAPITAL LETTER KJE*/
- 0x45d, /* U+00040d: CYRILLIC CAPITAL LETTER I WITH GRAVE*/
- 0x45e, /* U+00040e: CYRILLIC CAPITAL LETTER SHORT U*/
- 0x45f, /* U+00040f: CYRILLIC CAPITAL LETTER DZHE*/
- 0x430, /* U+000410: CYRILLIC CAPITAL LETTER A*/
- 0x431, /* U+000411: CYRILLIC CAPITAL LETTER BE*/
- 0x432, /* U+000412: CYRILLIC CAPITAL LETTER VE*/
- 0x433, /* U+000413: CYRILLIC CAPITAL LETTER GHE*/
- 0x434, /* U+000414: CYRILLIC CAPITAL LETTER DE*/
- 0x435, /* U+000415: CYRILLIC CAPITAL LETTER IE*/
- 0x436, /* U+000416: CYRILLIC CAPITAL LETTER ZHE*/
- 0x437, /* U+000417: CYRILLIC CAPITAL LETTER ZE*/
- 0x438, /* U+000418: CYRILLIC CAPITAL LETTER I*/
- 0x439, /* U+000419: CYRILLIC CAPITAL LETTER SHORT I*/
- 0x43a, /* U+00041a: CYRILLIC CAPITAL LETTER KA*/
- 0x43b, /* U+00041b: CYRILLIC CAPITAL LETTER EL*/
- 0x43c, /* U+00041c: CYRILLIC CAPITAL LETTER EM*/
- 0x43d, /* U+00041d: CYRILLIC CAPITAL LETTER EN*/
- 0x43e, /* U+00041e: CYRILLIC CAPITAL LETTER O*/
- 0x43f, /* U+00041f: CYRILLIC CAPITAL LETTER PE*/
- 0x440, /* U+000420: CYRILLIC CAPITAL LETTER ER*/
- 0x441, /* U+000421: CYRILLIC CAPITAL LETTER ES*/
- 0x442, /* U+000422: CYRILLIC CAPITAL LETTER TE*/
- 0x443, /* U+000423: CYRILLIC CAPITAL LETTER U*/
- 0x444, /* U+000424: CYRILLIC CAPITAL LETTER EF*/
- 0x445, /* U+000425: CYRILLIC CAPITAL LETTER HA*/
- 0x446, /* U+000426: CYRILLIC CAPITAL LETTER TSE*/
- 0x447, /* U+000427: CYRILLIC CAPITAL LETTER CHE*/
- 0x448, /* U+000428: CYRILLIC CAPITAL LETTER SHA*/
- 0x449, /* U+000429: CYRILLIC CAPITAL LETTER SHCHA*/
- 0x44a, /* U+00042a: CYRILLIC CAPITAL LETTER HARD SIGN*/
- 0x44b, /* U+00042b: CYRILLIC CAPITAL LETTER YERU*/
- 0x44c, /* U+00042c: CYRILLIC CAPITAL LETTER SOFT SIGN*/
- 0x44d, /* U+00042d: CYRILLIC CAPITAL LETTER E*/
- 0x44e, /* U+00042e: CYRILLIC CAPITAL LETTER YU*/
- 0x44f, /* U+00042f: CYRILLIC CAPITAL LETTER YA*/
- 0x430, /* U+000430: CYRILLIC SMALL LETTER A*/
- 0x431, /* U+000431: CYRILLIC SMALL LETTER BE*/
- 0x432, /* U+000432: CYRILLIC SMALL LETTER VE*/
- 0x433, /* U+000433: CYRILLIC SMALL LETTER GHE*/
- 0x434, /* U+000434: CYRILLIC SMALL LETTER DE*/
- 0x435, /* U+000435: CYRILLIC SMALL LETTER IE*/
- 0x436, /* U+000436: CYRILLIC SMALL LETTER ZHE*/
- 0x437, /* U+000437: CYRILLIC SMALL LETTER ZE*/
- 0x438, /* U+000438: CYRILLIC SMALL LETTER I*/
- 0x439, /* U+000439: CYRILLIC SMALL LETTER SHORT I*/
- 0x43a, /* U+00043a: CYRILLIC SMALL LETTER KA*/
- 0x43b, /* U+00043b: CYRILLIC SMALL LETTER EL*/
- 0x43c, /* U+00043c: CYRILLIC SMALL LETTER EM*/
- 0x43d, /* U+00043d: CYRILLIC SMALL LETTER EN*/
- 0x43e, /* U+00043e: CYRILLIC SMALL LETTER O*/
- 0x43f, /* U+00043f: CYRILLIC SMALL LETTER PE*/
- 0x440, /* U+000440: CYRILLIC SMALL LETTER ER*/
- 0x441, /* U+000441: CYRILLIC SMALL LETTER ES*/
- 0x442, /* U+000442: CYRILLIC SMALL LETTER TE*/
- 0x443, /* U+000443: CYRILLIC SMALL LETTER U*/
- 0x444, /* U+000444: CYRILLIC SMALL LETTER EF*/
- 0x445, /* U+000445: CYRILLIC SMALL LETTER HA*/
- 0x446, /* U+000446: CYRILLIC SMALL LETTER TSE*/
- 0x447, /* U+000447: CYRILLIC SMALL LETTER CHE*/
- 0x448, /* U+000448: CYRILLIC SMALL LETTER SHA*/
- 0x449, /* U+000449: CYRILLIC SMALL LETTER SHCHA*/
- 0x44a, /* U+00044a: CYRILLIC SMALL LETTER HARD SIGN*/
- 0x44b, /* U+00044b: CYRILLIC SMALL LETTER YERU*/
- 0x44c, /* U+00044c: CYRILLIC SMALL LETTER SOFT SIGN*/
- 0x44d, /* U+00044d: CYRILLIC SMALL LETTER E*/
- 0x44e, /* U+00044e: CYRILLIC SMALL LETTER YU*/
- 0x44f, /* U+00044f: CYRILLIC SMALL LETTER YA*/
- 0x450, /* U+000450: CYRILLIC SMALL LETTER IE WITH GRAVE*/
- 0x451, /* U+000451: CYRILLIC SMALL LETTER IO*/
- 0x452, /* U+000452: CYRILLIC SMALL LETTER DJE*/
- 0x453, /* U+000453: CYRILLIC SMALL LETTER GJE*/
- 0x454, /* U+000454: CYRILLIC SMALL LETTER UKRAINIAN IE*/
- 0x455, /* U+000455: CYRILLIC SMALL LETTER DZE*/
- 0x456, /* U+000456: CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I*/
- 0x457, /* U+000457: CYRILLIC SMALL LETTER YI*/
- 0x458, /* U+000458: CYRILLIC SMALL LETTER JE*/
- 0x459, /* U+000459: CYRILLIC SMALL LETTER LJE*/
- 0x45a, /* U+00045a: CYRILLIC SMALL LETTER NJE*/
- 0x45b, /* U+00045b: CYRILLIC SMALL LETTER TSHE*/
- 0x45c, /* U+00045c: CYRILLIC SMALL LETTER KJE*/
- 0x45d, /* U+00045d: CYRILLIC SMALL LETTER I WITH GRAVE*/
- 0x45e, /* U+00045e: CYRILLIC SMALL LETTER SHORT U*/
- 0x45f, /* U+00045f: CYRILLIC SMALL LETTER DZHE*/
- 0x461, /* U+000460: CYRILLIC CAPITAL LETTER OMEGA*/
- 0x461, /* U+000461: CYRILLIC SMALL LETTER OMEGA*/
- 0x463, /* U+000462: CYRILLIC CAPITAL LETTER YAT*/
- 0x463, /* U+000463: CYRILLIC SMALL LETTER YAT*/
- 0x465, /* U+000464: CYRILLIC CAPITAL LETTER IOTIFIED E*/
- 0x465, /* U+000465: CYRILLIC SMALL LETTER IOTIFIED E*/
- 0x467, /* U+000466: CYRILLIC CAPITAL LETTER LITTLE YUS*/
- 0x467, /* U+000467: CYRILLIC SMALL LETTER LITTLE YUS*/
- 0x469, /* U+000468: CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS*/
- 0x469, /* U+000469: CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS*/
- 0x46b, /* U+00046a: CYRILLIC CAPITAL LETTER BIG YUS*/
- 0x46b, /* U+00046b: CYRILLIC SMALL LETTER BIG YUS*/
- 0x46d, /* U+00046c: CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS*/
- 0x46d, /* U+00046d: CYRILLIC SMALL LETTER IOTIFIED BIG YUS*/
- 0x46f, /* U+00046e: CYRILLIC CAPITAL LETTER KSI*/
- 0x46f, /* U+00046f: CYRILLIC SMALL LETTER KSI*/
- 0x471, /* U+000470: CYRILLIC CAPITAL LETTER PSI*/
- 0x471, /* U+000471: CYRILLIC SMALL LETTER PSI*/
- 0x473, /* U+000472: CYRILLIC CAPITAL LETTER FITA*/
- 0x473, /* U+000473: CYRILLIC SMALL LETTER FITA*/
- 0x475, /* U+000474: CYRILLIC CAPITAL LETTER IZHITSA*/
- 0x475, /* U+000475: CYRILLIC SMALL LETTER IZHITSA*/
- 0x477, /* U+000476: CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT*/
- 0x477, /* U+000477: CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT*/
- 0x479, /* U+000478: CYRILLIC CAPITAL LETTER UK*/
- 0x479, /* U+000479: CYRILLIC SMALL LETTER UK*/
- 0x47b, /* U+00047a: CYRILLIC CAPITAL LETTER ROUND OMEGA*/
- 0x47b, /* U+00047b: CYRILLIC SMALL LETTER ROUND OMEGA*/
- 0x47d, /* U+00047c: CYRILLIC CAPITAL LETTER OMEGA WITH TITLO*/
- 0x47d, /* U+00047d: CYRILLIC SMALL LETTER OMEGA WITH TITLO*/
- 0x47f, /* U+00047e: CYRILLIC CAPITAL LETTER OT*/
- 0x47f, /* U+00047f: CYRILLIC SMALL LETTER OT*/
- 0x481, /* U+000480: CYRILLIC CAPITAL LETTER KOPPA*/
- 0x481, /* U+000481: CYRILLIC SMALL LETTER KOPPA*/
- 0x482, /* U+000482: CYRILLIC THOUSANDS SIGN*/
- 0x483, /* U+000483: COMBINING CYRILLIC TITLO*/
- 0x484, /* U+000484: COMBINING CYRILLIC PALATALIZATION*/
- 0x485, /* U+000485: COMBINING CYRILLIC DASIA PNEUMATA*/
- 0x486, /* U+000486: COMBINING CYRILLIC PSILI PNEUMATA*/
- 0x487, /* U+000487: */
- 0x488, /* U+000488: COMBINING CYRILLIC HUNDRED THOUSANDS SIGN*/
- 0x489, /* U+000489: COMBINING CYRILLIC MILLIONS SIGN*/
- 0x48b, /* U+00048a: CYRILLIC CAPITAL LETTER SHORT I WITH TAIL*/
- 0x48b, /* U+00048b: CYRILLIC SMALL LETTER SHORT I WITH TAIL*/
- 0x48d, /* U+00048c: CYRILLIC CAPITAL LETTER SEMISOFT SIGN*/
- 0x48d, /* U+00048d: CYRILLIC SMALL LETTER SEMISOFT SIGN*/
- 0x48f, /* U+00048e: CYRILLIC CAPITAL LETTER ER WITH TICK*/
- 0x48f, /* U+00048f: CYRILLIC SMALL LETTER ER WITH TICK*/
- 0x491, /* U+000490: CYRILLIC CAPITAL LETTER GHE WITH UPTURN*/
- 0x491, /* U+000491: CYRILLIC SMALL LETTER GHE WITH UPTURN*/
- 0x493, /* U+000492: CYRILLIC CAPITAL LETTER GHE WITH STROKE*/
- 0x493, /* U+000493: CYRILLIC SMALL LETTER GHE WITH STROKE*/
- 0x495, /* U+000494: CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK*/
- 0x495, /* U+000495: CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK*/
- 0x497, /* U+000496: CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER*/
- 0x497, /* U+000497: CYRILLIC SMALL LETTER ZHE WITH DESCENDER*/
- 0x499, /* U+000498: CYRILLIC CAPITAL LETTER ZE WITH DESCENDER*/
- 0x499, /* U+000499: CYRILLIC SMALL LETTER ZE WITH DESCENDER*/
- 0x49b, /* U+00049a: CYRILLIC CAPITAL LETTER KA WITH DESCENDER*/
- 0x49b, /* U+00049b: CYRILLIC SMALL LETTER KA WITH DESCENDER*/
- 0x49d, /* U+00049c: CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE*/
- 0x49d, /* U+00049d: CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE*/
- 0x49f, /* U+00049e: CYRILLIC CAPITAL LETTER KA WITH STROKE*/
- 0x49f, /* U+00049f: CYRILLIC SMALL LETTER KA WITH STROKE*/
- 0x4a1, /* U+0004a0: CYRILLIC CAPITAL LETTER BASHKIR KA*/
- 0x4a1, /* U+0004a1: CYRILLIC SMALL LETTER BASHKIR KA*/
- 0x4a3, /* U+0004a2: CYRILLIC CAPITAL LETTER EN WITH DESCENDER*/
- 0x4a3, /* U+0004a3: CYRILLIC SMALL LETTER EN WITH DESCENDER*/
- 0x4a5, /* U+0004a4: CYRILLIC CAPITAL LIGATURE EN GHE*/
- 0x4a5, /* U+0004a5: CYRILLIC SMALL LIGATURE EN GHE*/
- 0x4a7, /* U+0004a6: CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK*/
- 0x4a7, /* U+0004a7: CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK*/
- 0x4a9, /* U+0004a8: CYRILLIC CAPITAL LETTER ABKHASIAN HA*/
- 0x4a9, /* U+0004a9: CYRILLIC SMALL LETTER ABKHASIAN HA*/
- 0x4ab, /* U+0004aa: CYRILLIC CAPITAL LETTER ES WITH DESCENDER*/
- 0x4ab, /* U+0004ab: CYRILLIC SMALL LETTER ES WITH DESCENDER*/
- 0x4ad, /* U+0004ac: CYRILLIC CAPITAL LETTER TE WITH DESCENDER*/
- 0x4ad, /* U+0004ad: CYRILLIC SMALL LETTER TE WITH DESCENDER*/
- 0x4af, /* U+0004ae: CYRILLIC CAPITAL LETTER STRAIGHT U*/
- 0x4af, /* U+0004af: CYRILLIC SMALL LETTER STRAIGHT U*/
- 0x4b1, /* U+0004b0: CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE*/
- 0x4b1, /* U+0004b1: CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE*/
- 0x4b3, /* U+0004b2: CYRILLIC CAPITAL LETTER HA WITH DESCENDER*/
- 0x4b3, /* U+0004b3: CYRILLIC SMALL LETTER HA WITH DESCENDER*/
- 0x4b5, /* U+0004b4: CYRILLIC CAPITAL LIGATURE TE TSE*/
- 0x4b5, /* U+0004b5: CYRILLIC SMALL LIGATURE TE TSE*/
- 0x4b7, /* U+0004b6: CYRILLIC CAPITAL LETTER CHE WITH DESCENDER*/
- 0x4b7, /* U+0004b7: CYRILLIC SMALL LETTER CHE WITH DESCENDER*/
- 0x4b9, /* U+0004b8: CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE*/
- 0x4b9, /* U+0004b9: CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE*/
- 0x4bb, /* U+0004ba: CYRILLIC CAPITAL LETTER SHHA*/
- 0x4bb, /* U+0004bb: CYRILLIC SMALL LETTER SHHA*/
- 0x4bd, /* U+0004bc: CYRILLIC CAPITAL LETTER ABKHASIAN CHE*/
- 0x4bd, /* U+0004bd: CYRILLIC SMALL LETTER ABKHASIAN CHE*/
- 0x4bf, /* U+0004be: CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER*/
- 0x4bf, /* U+0004bf: CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER*/
- 0x4c0, /* U+0004c0: CYRILLIC LETTER PALOCHKA*/
- 0x4c2, /* U+0004c1: CYRILLIC CAPITAL LETTER ZHE WITH BREVE*/
- 0x4c2, /* U+0004c2: CYRILLIC SMALL LETTER ZHE WITH BREVE*/
- 0x4c4, /* U+0004c3: CYRILLIC CAPITAL LETTER KA WITH HOOK*/
- 0x4c4, /* U+0004c4: CYRILLIC SMALL LETTER KA WITH HOOK*/
- 0x4c6, /* U+0004c5: CYRILLIC CAPITAL LETTER EL WITH TAIL*/
- 0x4c6, /* U+0004c6: CYRILLIC SMALL LETTER EL WITH TAIL*/
- 0x4c8, /* U+0004c7: CYRILLIC CAPITAL LETTER EN WITH HOOK*/
- 0x4c8, /* U+0004c8: CYRILLIC SMALL LETTER EN WITH HOOK*/
- 0x4ca, /* U+0004c9: CYRILLIC CAPITAL LETTER EN WITH TAIL*/
- 0x4ca, /* U+0004ca: CYRILLIC SMALL LETTER EN WITH TAIL*/
- 0x4cc, /* U+0004cb: CYRILLIC CAPITAL LETTER KHAKASSIAN CHE*/
- 0x4cc, /* U+0004cc: CYRILLIC SMALL LETTER KHAKASSIAN CHE*/
- 0x4ce, /* U+0004cd: CYRILLIC CAPITAL LETTER EM WITH TAIL*/
- 0x4ce, /* U+0004ce: CYRILLIC SMALL LETTER EM WITH TAIL*/
- 0x4cf, /* U+0004cf: */
- 0x4d1, /* U+0004d0: CYRILLIC CAPITAL LETTER A WITH BREVE*/
- 0x4d1, /* U+0004d1: CYRILLIC SMALL LETTER A WITH BREVE*/
- 0x4d3, /* U+0004d2: CYRILLIC CAPITAL LETTER A WITH DIAERESIS*/
- 0x4d3, /* U+0004d3: CYRILLIC SMALL LETTER A WITH DIAERESIS*/
- 0x4d5, /* U+0004d4: CYRILLIC CAPITAL LIGATURE A IE*/
- 0x4d5, /* U+0004d5: CYRILLIC SMALL LIGATURE A IE*/
- 0x4d7, /* U+0004d6: CYRILLIC CAPITAL LETTER IE WITH BREVE*/
- 0x4d7, /* U+0004d7: CYRILLIC SMALL LETTER IE WITH BREVE*/
- 0x4d9, /* U+0004d8: CYRILLIC CAPITAL LETTER SCHWA*/
- 0x4d9, /* U+0004d9: CYRILLIC SMALL LETTER SCHWA*/
- 0x4db, /* U+0004da: CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS*/
- 0x4db, /* U+0004db: CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS*/
- 0x4dd, /* U+0004dc: CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS*/
- 0x4dd, /* U+0004dd: CYRILLIC SMALL LETTER ZHE WITH DIAERESIS*/
- 0x4df, /* U+0004de: CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS*/
- 0x4df, /* U+0004df: CYRILLIC SMALL LETTER ZE WITH DIAERESIS*/
- 0x4e1, /* U+0004e0: CYRILLIC CAPITAL LETTER ABKHASIAN DZE*/
- 0x4e1, /* U+0004e1: CYRILLIC SMALL LETTER ABKHASIAN DZE*/
- 0x4e3, /* U+0004e2: CYRILLIC CAPITAL LETTER I WITH MACRON*/
- 0x4e3, /* U+0004e3: CYRILLIC SMALL LETTER I WITH MACRON*/
- 0x4e5, /* U+0004e4: CYRILLIC CAPITAL LETTER I WITH DIAERESIS*/
- 0x4e5, /* U+0004e5: CYRILLIC SMALL LETTER I WITH DIAERESIS*/
- 0x4e7, /* U+0004e6: CYRILLIC CAPITAL LETTER O WITH DIAERESIS*/
- 0x4e7, /* U+0004e7: CYRILLIC SMALL LETTER O WITH DIAERESIS*/
- 0x4e9, /* U+0004e8: CYRILLIC CAPITAL LETTER BARRED O*/
- 0x4e9, /* U+0004e9: CYRILLIC SMALL LETTER BARRED O*/
- 0x4eb, /* U+0004ea: CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS*/
- 0x4eb, /* U+0004eb: CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS*/
- 0x4ed, /* U+0004ec: CYRILLIC CAPITAL LETTER E WITH DIAERESIS*/
- 0x4ed, /* U+0004ed: CYRILLIC SMALL LETTER E WITH DIAERESIS*/
- 0x4ef, /* U+0004ee: CYRILLIC CAPITAL LETTER U WITH MACRON*/
- 0x4ef, /* U+0004ef: CYRILLIC SMALL LETTER U WITH MACRON*/
- 0x4f1, /* U+0004f0: CYRILLIC CAPITAL LETTER U WITH DIAERESIS*/
- 0x4f1, /* U+0004f1: CYRILLIC SMALL LETTER U WITH DIAERESIS*/
- 0x4f3, /* U+0004f2: CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE*/
- 0x4f3, /* U+0004f3: CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE*/
- 0x4f5, /* U+0004f4: CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS*/
- 0x4f5, /* U+0004f5: CYRILLIC SMALL LETTER CHE WITH DIAERESIS*/
- 0x4f7, /* U+0004f6: CYRILLIC CAPITAL LETTER GHE WITH DESCENDER*/
- 0x4f7, /* U+0004f7: CYRILLIC SMALL LETTER GHE WITH DESCENDER*/
- 0x4f9, /* U+0004f8: CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS*/
- 0x4f9, /* U+0004f9: CYRILLIC SMALL LETTER YERU WITH DIAERESIS*/
- 0x4fa, /* U+0004fa: */
- 0x4fb, /* U+0004fb: */
- 0x4fc, /* U+0004fc: */
- 0x4fd, /* U+0004fd: */
- 0x4fe, /* U+0004fe: */
- 0x4ff, /* U+0004ff: */
- 0x501, /* U+000500: CYRILLIC CAPITAL LETTER KOMI DE*/
- 0x501, /* U+000501: CYRILLIC SMALL LETTER KOMI DE*/
- 0x503, /* U+000502: CYRILLIC CAPITAL LETTER KOMI DJE*/
- 0x503, /* U+000503: CYRILLIC SMALL LETTER KOMI DJE*/
- 0x505, /* U+000504: CYRILLIC CAPITAL LETTER KOMI ZJE*/
- 0x505, /* U+000505: CYRILLIC SMALL LETTER KOMI ZJE*/
- 0x507, /* U+000506: CYRILLIC CAPITAL LETTER KOMI DZJE*/
- 0x507, /* U+000507: CYRILLIC SMALL LETTER KOMI DZJE*/
- 0x509, /* U+000508: CYRILLIC CAPITAL LETTER KOMI LJE*/
- 0x509, /* U+000509: CYRILLIC SMALL LETTER KOMI LJE*/
- 0x50b, /* U+00050a: CYRILLIC CAPITAL LETTER KOMI NJE*/
- 0x50b, /* U+00050b: CYRILLIC SMALL LETTER KOMI NJE*/
- 0x50d, /* U+00050c: CYRILLIC CAPITAL LETTER KOMI SJE*/
- 0x50d, /* U+00050d: CYRILLIC SMALL LETTER KOMI SJE*/
- 0x50f, /* U+00050e: CYRILLIC CAPITAL LETTER KOMI TJE*/
- 0x50f, /* U+00050f: CYRILLIC SMALL LETTER KOMI TJE*/
- 0x510, /* U+000510: */
- 0x511, /* U+000511: */
- 0x512, /* U+000512: */
- 0x513, /* U+000513: */
- 0x514, /* U+000514: */
- 0x515, /* U+000515: */
- 0x516, /* U+000516: */
- 0x517, /* U+000517: */
- 0x518, /* U+000518: */
- 0x519, /* U+000519: */
- 0x51a, /* U+00051a: */
- 0x51b, /* U+00051b: */
- 0x51c, /* U+00051c: */
- 0x51d, /* U+00051d: */
- 0x51e, /* U+00051e: */
- 0x51f, /* U+00051f: */
- 0x520, /* U+000520: */
- 0x521, /* U+000521: */
- 0x522, /* U+000522: */
- 0x523, /* U+000523: */
- 0x524, /* U+000524: */
- 0x525, /* U+000525: */
- 0x526, /* U+000526: */
- 0x527, /* U+000527: */
- 0x528, /* U+000528: */
- 0x529, /* U+000529: */
- 0x52a, /* U+00052a: */
- 0x52b, /* U+00052b: */
- 0x52c, /* U+00052c: */
- 0x52d, /* U+00052d: */
- 0x52e, /* U+00052e: */
- 0x52f, /* U+00052f: */
- 0x530, /* U+000530: */
- 0x561, /* U+000531: ARMENIAN CAPITAL LETTER AYB*/
- 0x562, /* U+000532: ARMENIAN CAPITAL LETTER BEN*/
- 0x563, /* U+000533: ARMENIAN CAPITAL LETTER GIM*/
- 0x564, /* U+000534: ARMENIAN CAPITAL LETTER DA*/
- 0x565, /* U+000535: ARMENIAN CAPITAL LETTER ECH*/
- 0x566, /* U+000536: ARMENIAN CAPITAL LETTER ZA*/
- 0x567, /* U+000537: ARMENIAN CAPITAL LETTER EH*/
- 0x568, /* U+000538: ARMENIAN CAPITAL LETTER ET*/
- 0x569, /* U+000539: ARMENIAN CAPITAL LETTER TO*/
- 0x56a, /* U+00053a: ARMENIAN CAPITAL LETTER ZHE*/
- 0x56b, /* U+00053b: ARMENIAN CAPITAL LETTER INI*/
- 0x56c, /* U+00053c: ARMENIAN CAPITAL LETTER LIWN*/
- 0x56d, /* U+00053d: ARMENIAN CAPITAL LETTER XEH*/
- 0x56e, /* U+00053e: ARMENIAN CAPITAL LETTER CA*/
- 0x56f, /* U+00053f: ARMENIAN CAPITAL LETTER KEN*/
- 0x570, /* U+000540: ARMENIAN CAPITAL LETTER HO*/
- 0x571, /* U+000541: ARMENIAN CAPITAL LETTER JA*/
- 0x572, /* U+000542: ARMENIAN CAPITAL LETTER GHAD*/
- 0x573, /* U+000543: ARMENIAN CAPITAL LETTER CHEH*/
- 0x574, /* U+000544: ARMENIAN CAPITAL LETTER MEN*/
- 0x575, /* U+000545: ARMENIAN CAPITAL LETTER YI*/
- 0x576, /* U+000546: ARMENIAN CAPITAL LETTER NOW*/
- 0x577, /* U+000547: ARMENIAN CAPITAL LETTER SHA*/
- 0x578, /* U+000548: ARMENIAN CAPITAL LETTER VO*/
- 0x579, /* U+000549: ARMENIAN CAPITAL LETTER CHA*/
- 0x57a, /* U+00054a: ARMENIAN CAPITAL LETTER PEH*/
- 0x57b, /* U+00054b: ARMENIAN CAPITAL LETTER JHEH*/
- 0x57c, /* U+00054c: ARMENIAN CAPITAL LETTER RA*/
- 0x57d, /* U+00054d: ARMENIAN CAPITAL LETTER SEH*/
- 0x57e, /* U+00054e: ARMENIAN CAPITAL LETTER VEW*/
- 0x57f, /* U+00054f: ARMENIAN CAPITAL LETTER TIWN*/
- 0x580, /* U+000550: ARMENIAN CAPITAL LETTER REH*/
- 0x581, /* U+000551: ARMENIAN CAPITAL LETTER CO*/
- 0x582, /* U+000552: ARMENIAN CAPITAL LETTER YIWN*/
- 0x583, /* U+000553: ARMENIAN CAPITAL LETTER PIWR*/
- 0x584, /* U+000554: ARMENIAN CAPITAL LETTER KEH*/
- 0x585, /* U+000555: ARMENIAN CAPITAL LETTER OH*/
- 0x586, /* U+000556: ARMENIAN CAPITAL LETTER FEH*/
-};
-
-static const RTUNICP g_afRTUniLower0x0010a0[] =
-{
- 0x2d00, /* U+0010a0: GEORGIAN CAPITAL LETTER AN*/
- 0x2d01, /* U+0010a1: GEORGIAN CAPITAL LETTER BAN*/
- 0x2d02, /* U+0010a2: GEORGIAN CAPITAL LETTER GAN*/
- 0x2d03, /* U+0010a3: GEORGIAN CAPITAL LETTER DON*/
- 0x2d04, /* U+0010a4: GEORGIAN CAPITAL LETTER EN*/
- 0x2d05, /* U+0010a5: GEORGIAN CAPITAL LETTER VIN*/
- 0x2d06, /* U+0010a6: GEORGIAN CAPITAL LETTER ZEN*/
- 0x2d07, /* U+0010a7: GEORGIAN CAPITAL LETTER TAN*/
- 0x2d08, /* U+0010a8: GEORGIAN CAPITAL LETTER IN*/
- 0x2d09, /* U+0010a9: GEORGIAN CAPITAL LETTER KAN*/
- 0x2d0a, /* U+0010aa: GEORGIAN CAPITAL LETTER LAS*/
- 0x2d0b, /* U+0010ab: GEORGIAN CAPITAL LETTER MAN*/
- 0x2d0c, /* U+0010ac: GEORGIAN CAPITAL LETTER NAR*/
- 0x2d0d, /* U+0010ad: GEORGIAN CAPITAL LETTER ON*/
- 0x2d0e, /* U+0010ae: GEORGIAN CAPITAL LETTER PAR*/
- 0x2d0f, /* U+0010af: GEORGIAN CAPITAL LETTER ZHAR*/
- 0x2d10, /* U+0010b0: GEORGIAN CAPITAL LETTER RAE*/
- 0x2d11, /* U+0010b1: GEORGIAN CAPITAL LETTER SAN*/
- 0x2d12, /* U+0010b2: GEORGIAN CAPITAL LETTER TAR*/
- 0x2d13, /* U+0010b3: GEORGIAN CAPITAL LETTER UN*/
- 0x2d14, /* U+0010b4: GEORGIAN CAPITAL LETTER PHAR*/
- 0x2d15, /* U+0010b5: GEORGIAN CAPITAL LETTER KHAR*/
- 0x2d16, /* U+0010b6: GEORGIAN CAPITAL LETTER GHAN*/
- 0x2d17, /* U+0010b7: GEORGIAN CAPITAL LETTER QAR*/
- 0x2d18, /* U+0010b8: GEORGIAN CAPITAL LETTER SHIN*/
- 0x2d19, /* U+0010b9: GEORGIAN CAPITAL LETTER CHIN*/
- 0x2d1a, /* U+0010ba: GEORGIAN CAPITAL LETTER CAN*/
- 0x2d1b, /* U+0010bb: GEORGIAN CAPITAL LETTER JIL*/
- 0x2d1c, /* U+0010bc: GEORGIAN CAPITAL LETTER CIL*/
- 0x2d1d, /* U+0010bd: GEORGIAN CAPITAL LETTER CHAR*/
- 0x2d1e, /* U+0010be: GEORGIAN CAPITAL LETTER XAN*/
- 0x2d1f, /* U+0010bf: GEORGIAN CAPITAL LETTER JHAN*/
- 0x2d20, /* U+0010c0: GEORGIAN CAPITAL LETTER HAE*/
- 0x2d21, /* U+0010c1: GEORGIAN CAPITAL LETTER HE*/
- 0x2d22, /* U+0010c2: GEORGIAN CAPITAL LETTER HIE*/
- 0x2d23, /* U+0010c3: GEORGIAN CAPITAL LETTER WE*/
- 0x2d24, /* U+0010c4: GEORGIAN CAPITAL LETTER HAR*/
- 0x2d25, /* U+0010c5: GEORGIAN CAPITAL LETTER HOE*/
-};
-
-static const RTUNICP g_afRTUniLower0x001e00[] =
-{
- 0x1e01, /* U+001e00: LATIN CAPITAL LETTER A WITH RING BELOW*/
- 0x1e01, /* U+001e01: LATIN SMALL LETTER A WITH RING BELOW*/
- 0x1e03, /* U+001e02: LATIN CAPITAL LETTER B WITH DOT ABOVE*/
- 0x1e03, /* U+001e03: LATIN SMALL LETTER B WITH DOT ABOVE*/
- 0x1e05, /* U+001e04: LATIN CAPITAL LETTER B WITH DOT BELOW*/
- 0x1e05, /* U+001e05: LATIN SMALL LETTER B WITH DOT BELOW*/
- 0x1e07, /* U+001e06: LATIN CAPITAL LETTER B WITH LINE BELOW*/
- 0x1e07, /* U+001e07: LATIN SMALL LETTER B WITH LINE BELOW*/
- 0x1e09, /* U+001e08: LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE*/
- 0x1e09, /* U+001e09: LATIN SMALL LETTER C WITH CEDILLA AND ACUTE*/
- 0x1e0b, /* U+001e0a: LATIN CAPITAL LETTER D WITH DOT ABOVE*/
- 0x1e0b, /* U+001e0b: LATIN SMALL LETTER D WITH DOT ABOVE*/
- 0x1e0d, /* U+001e0c: LATIN CAPITAL LETTER D WITH DOT BELOW*/
- 0x1e0d, /* U+001e0d: LATIN SMALL LETTER D WITH DOT BELOW*/
- 0x1e0f, /* U+001e0e: LATIN CAPITAL LETTER D WITH LINE BELOW*/
- 0x1e0f, /* U+001e0f: LATIN SMALL LETTER D WITH LINE BELOW*/
- 0x1e11, /* U+001e10: LATIN CAPITAL LETTER D WITH CEDILLA*/
- 0x1e11, /* U+001e11: LATIN SMALL LETTER D WITH CEDILLA*/
- 0x1e13, /* U+001e12: LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW*/
- 0x1e13, /* U+001e13: LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW*/
- 0x1e15, /* U+001e14: LATIN CAPITAL LETTER E WITH MACRON AND GRAVE*/
- 0x1e15, /* U+001e15: LATIN SMALL LETTER E WITH MACRON AND GRAVE*/
- 0x1e17, /* U+001e16: LATIN CAPITAL LETTER E WITH MACRON AND ACUTE*/
- 0x1e17, /* U+001e17: LATIN SMALL LETTER E WITH MACRON AND ACUTE*/
- 0x1e19, /* U+001e18: LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW*/
- 0x1e19, /* U+001e19: LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW*/
- 0x1e1b, /* U+001e1a: LATIN CAPITAL LETTER E WITH TILDE BELOW*/
- 0x1e1b, /* U+001e1b: LATIN SMALL LETTER E WITH TILDE BELOW*/
- 0x1e1d, /* U+001e1c: LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE*/
- 0x1e1d, /* U+001e1d: LATIN SMALL LETTER E WITH CEDILLA AND BREVE*/
- 0x1e1f, /* U+001e1e: LATIN CAPITAL LETTER F WITH DOT ABOVE*/
- 0x1e1f, /* U+001e1f: LATIN SMALL LETTER F WITH DOT ABOVE*/
- 0x1e21, /* U+001e20: LATIN CAPITAL LETTER G WITH MACRON*/
- 0x1e21, /* U+001e21: LATIN SMALL LETTER G WITH MACRON*/
- 0x1e23, /* U+001e22: LATIN CAPITAL LETTER H WITH DOT ABOVE*/
- 0x1e23, /* U+001e23: LATIN SMALL LETTER H WITH DOT ABOVE*/
- 0x1e25, /* U+001e24: LATIN CAPITAL LETTER H WITH DOT BELOW*/
- 0x1e25, /* U+001e25: LATIN SMALL LETTER H WITH DOT BELOW*/
- 0x1e27, /* U+001e26: LATIN CAPITAL LETTER H WITH DIAERESIS*/
- 0x1e27, /* U+001e27: LATIN SMALL LETTER H WITH DIAERESIS*/
- 0x1e29, /* U+001e28: LATIN CAPITAL LETTER H WITH CEDILLA*/
- 0x1e29, /* U+001e29: LATIN SMALL LETTER H WITH CEDILLA*/
- 0x1e2b, /* U+001e2a: LATIN CAPITAL LETTER H WITH BREVE BELOW*/
- 0x1e2b, /* U+001e2b: LATIN SMALL LETTER H WITH BREVE BELOW*/
- 0x1e2d, /* U+001e2c: LATIN CAPITAL LETTER I WITH TILDE BELOW*/
- 0x1e2d, /* U+001e2d: LATIN SMALL LETTER I WITH TILDE BELOW*/
- 0x1e2f, /* U+001e2e: LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE*/
- 0x1e2f, /* U+001e2f: LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE*/
- 0x1e31, /* U+001e30: LATIN CAPITAL LETTER K WITH ACUTE*/
- 0x1e31, /* U+001e31: LATIN SMALL LETTER K WITH ACUTE*/
- 0x1e33, /* U+001e32: LATIN CAPITAL LETTER K WITH DOT BELOW*/
- 0x1e33, /* U+001e33: LATIN SMALL LETTER K WITH DOT BELOW*/
- 0x1e35, /* U+001e34: LATIN CAPITAL LETTER K WITH LINE BELOW*/
- 0x1e35, /* U+001e35: LATIN SMALL LETTER K WITH LINE BELOW*/
- 0x1e37, /* U+001e36: LATIN CAPITAL LETTER L WITH DOT BELOW*/
- 0x1e37, /* U+001e37: LATIN SMALL LETTER L WITH DOT BELOW*/
- 0x1e39, /* U+001e38: LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON*/
- 0x1e39, /* U+001e39: LATIN SMALL LETTER L WITH DOT BELOW AND MACRON*/
- 0x1e3b, /* U+001e3a: LATIN CAPITAL LETTER L WITH LINE BELOW*/
- 0x1e3b, /* U+001e3b: LATIN SMALL LETTER L WITH LINE BELOW*/
- 0x1e3d, /* U+001e3c: LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW*/
- 0x1e3d, /* U+001e3d: LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW*/
- 0x1e3f, /* U+001e3e: LATIN CAPITAL LETTER M WITH ACUTE*/
- 0x1e3f, /* U+001e3f: LATIN SMALL LETTER M WITH ACUTE*/
- 0x1e41, /* U+001e40: LATIN CAPITAL LETTER M WITH DOT ABOVE*/
- 0x1e41, /* U+001e41: LATIN SMALL LETTER M WITH DOT ABOVE*/
- 0x1e43, /* U+001e42: LATIN CAPITAL LETTER M WITH DOT BELOW*/
- 0x1e43, /* U+001e43: LATIN SMALL LETTER M WITH DOT BELOW*/
- 0x1e45, /* U+001e44: LATIN CAPITAL LETTER N WITH DOT ABOVE*/
- 0x1e45, /* U+001e45: LATIN SMALL LETTER N WITH DOT ABOVE*/
- 0x1e47, /* U+001e46: LATIN CAPITAL LETTER N WITH DOT BELOW*/
- 0x1e47, /* U+001e47: LATIN SMALL LETTER N WITH DOT BELOW*/
- 0x1e49, /* U+001e48: LATIN CAPITAL LETTER N WITH LINE BELOW*/
- 0x1e49, /* U+001e49: LATIN SMALL LETTER N WITH LINE BELOW*/
- 0x1e4b, /* U+001e4a: LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW*/
- 0x1e4b, /* U+001e4b: LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW*/
- 0x1e4d, /* U+001e4c: LATIN CAPITAL LETTER O WITH TILDE AND ACUTE*/
- 0x1e4d, /* U+001e4d: LATIN SMALL LETTER O WITH TILDE AND ACUTE*/
- 0x1e4f, /* U+001e4e: LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS*/
- 0x1e4f, /* U+001e4f: LATIN SMALL LETTER O WITH TILDE AND DIAERESIS*/
- 0x1e51, /* U+001e50: LATIN CAPITAL LETTER O WITH MACRON AND GRAVE*/
- 0x1e51, /* U+001e51: LATIN SMALL LETTER O WITH MACRON AND GRAVE*/
- 0x1e53, /* U+001e52: LATIN CAPITAL LETTER O WITH MACRON AND ACUTE*/
- 0x1e53, /* U+001e53: LATIN SMALL LETTER O WITH MACRON AND ACUTE*/
- 0x1e55, /* U+001e54: LATIN CAPITAL LETTER P WITH ACUTE*/
- 0x1e55, /* U+001e55: LATIN SMALL LETTER P WITH ACUTE*/
- 0x1e57, /* U+001e56: LATIN CAPITAL LETTER P WITH DOT ABOVE*/
- 0x1e57, /* U+001e57: LATIN SMALL LETTER P WITH DOT ABOVE*/
- 0x1e59, /* U+001e58: LATIN CAPITAL LETTER R WITH DOT ABOVE*/
- 0x1e59, /* U+001e59: LATIN SMALL LETTER R WITH DOT ABOVE*/
- 0x1e5b, /* U+001e5a: LATIN CAPITAL LETTER R WITH DOT BELOW*/
- 0x1e5b, /* U+001e5b: LATIN SMALL LETTER R WITH DOT BELOW*/
- 0x1e5d, /* U+001e5c: LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON*/
- 0x1e5d, /* U+001e5d: LATIN SMALL LETTER R WITH DOT BELOW AND MACRON*/
- 0x1e5f, /* U+001e5e: LATIN CAPITAL LETTER R WITH LINE BELOW*/
- 0x1e5f, /* U+001e5f: LATIN SMALL LETTER R WITH LINE BELOW*/
- 0x1e61, /* U+001e60: LATIN CAPITAL LETTER S WITH DOT ABOVE*/
- 0x1e61, /* U+001e61: LATIN SMALL LETTER S WITH DOT ABOVE*/
- 0x1e63, /* U+001e62: LATIN CAPITAL LETTER S WITH DOT BELOW*/
- 0x1e63, /* U+001e63: LATIN SMALL LETTER S WITH DOT BELOW*/
- 0x1e65, /* U+001e64: LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE*/
- 0x1e65, /* U+001e65: LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE*/
- 0x1e67, /* U+001e66: LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE*/
- 0x1e67, /* U+001e67: LATIN SMALL LETTER S WITH CARON AND DOT ABOVE*/
- 0x1e69, /* U+001e68: LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE*/
- 0x1e69, /* U+001e69: LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE*/
- 0x1e6b, /* U+001e6a: LATIN CAPITAL LETTER T WITH DOT ABOVE*/
- 0x1e6b, /* U+001e6b: LATIN SMALL LETTER T WITH DOT ABOVE*/
- 0x1e6d, /* U+001e6c: LATIN CAPITAL LETTER T WITH DOT BELOW*/
- 0x1e6d, /* U+001e6d: LATIN SMALL LETTER T WITH DOT BELOW*/
- 0x1e6f, /* U+001e6e: LATIN CAPITAL LETTER T WITH LINE BELOW*/
- 0x1e6f, /* U+001e6f: LATIN SMALL LETTER T WITH LINE BELOW*/
- 0x1e71, /* U+001e70: LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW*/
- 0x1e71, /* U+001e71: LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW*/
- 0x1e73, /* U+001e72: LATIN CAPITAL LETTER U WITH DIAERESIS BELOW*/
- 0x1e73, /* U+001e73: LATIN SMALL LETTER U WITH DIAERESIS BELOW*/
- 0x1e75, /* U+001e74: LATIN CAPITAL LETTER U WITH TILDE BELOW*/
- 0x1e75, /* U+001e75: LATIN SMALL LETTER U WITH TILDE BELOW*/
- 0x1e77, /* U+001e76: LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW*/
- 0x1e77, /* U+001e77: LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW*/
- 0x1e79, /* U+001e78: LATIN CAPITAL LETTER U WITH TILDE AND ACUTE*/
- 0x1e79, /* U+001e79: LATIN SMALL LETTER U WITH TILDE AND ACUTE*/
- 0x1e7b, /* U+001e7a: LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS*/
- 0x1e7b, /* U+001e7b: LATIN SMALL LETTER U WITH MACRON AND DIAERESIS*/
- 0x1e7d, /* U+001e7c: LATIN CAPITAL LETTER V WITH TILDE*/
- 0x1e7d, /* U+001e7d: LATIN SMALL LETTER V WITH TILDE*/
- 0x1e7f, /* U+001e7e: LATIN CAPITAL LETTER V WITH DOT BELOW*/
- 0x1e7f, /* U+001e7f: LATIN SMALL LETTER V WITH DOT BELOW*/
- 0x1e81, /* U+001e80: LATIN CAPITAL LETTER W WITH GRAVE*/
- 0x1e81, /* U+001e81: LATIN SMALL LETTER W WITH GRAVE*/
- 0x1e83, /* U+001e82: LATIN CAPITAL LETTER W WITH ACUTE*/
- 0x1e83, /* U+001e83: LATIN SMALL LETTER W WITH ACUTE*/
- 0x1e85, /* U+001e84: LATIN CAPITAL LETTER W WITH DIAERESIS*/
- 0x1e85, /* U+001e85: LATIN SMALL LETTER W WITH DIAERESIS*/
- 0x1e87, /* U+001e86: LATIN CAPITAL LETTER W WITH DOT ABOVE*/
- 0x1e87, /* U+001e87: LATIN SMALL LETTER W WITH DOT ABOVE*/
- 0x1e89, /* U+001e88: LATIN CAPITAL LETTER W WITH DOT BELOW*/
- 0x1e89, /* U+001e89: LATIN SMALL LETTER W WITH DOT BELOW*/
- 0x1e8b, /* U+001e8a: LATIN CAPITAL LETTER X WITH DOT ABOVE*/
- 0x1e8b, /* U+001e8b: LATIN SMALL LETTER X WITH DOT ABOVE*/
- 0x1e8d, /* U+001e8c: LATIN CAPITAL LETTER X WITH DIAERESIS*/
- 0x1e8d, /* U+001e8d: LATIN SMALL LETTER X WITH DIAERESIS*/
- 0x1e8f, /* U+001e8e: LATIN CAPITAL LETTER Y WITH DOT ABOVE*/
- 0x1e8f, /* U+001e8f: LATIN SMALL LETTER Y WITH DOT ABOVE*/
- 0x1e91, /* U+001e90: LATIN CAPITAL LETTER Z WITH CIRCUMFLEX*/
- 0x1e91, /* U+001e91: LATIN SMALL LETTER Z WITH CIRCUMFLEX*/
- 0x1e93, /* U+001e92: LATIN CAPITAL LETTER Z WITH DOT BELOW*/
- 0x1e93, /* U+001e93: LATIN SMALL LETTER Z WITH DOT BELOW*/
- 0x1e95, /* U+001e94: LATIN CAPITAL LETTER Z WITH LINE BELOW*/
- 0x1e95, /* U+001e95: LATIN SMALL LETTER Z WITH LINE BELOW*/
- 0x1e96, /* U+001e96: LATIN SMALL LETTER H WITH LINE BELOW*/
- 0x1e97, /* U+001e97: LATIN SMALL LETTER T WITH DIAERESIS*/
- 0x1e98, /* U+001e98: LATIN SMALL LETTER W WITH RING ABOVE*/
- 0x1e99, /* U+001e99: LATIN SMALL LETTER Y WITH RING ABOVE*/
- 0x1e9a, /* U+001e9a: LATIN SMALL LETTER A WITH RIGHT HALF RING*/
- 0x1e9b, /* U+001e9b: LATIN SMALL LETTER LONG S WITH DOT ABOVE*/
- 0x1e9c, /* U+001e9c: */
- 0x1e9d, /* U+001e9d: */
- 0x1e9e, /* U+001e9e: */
- 0x1e9f, /* U+001e9f: */
- 0x1ea1, /* U+001ea0: LATIN CAPITAL LETTER A WITH DOT BELOW*/
- 0x1ea1, /* U+001ea1: LATIN SMALL LETTER A WITH DOT BELOW*/
- 0x1ea3, /* U+001ea2: LATIN CAPITAL LETTER A WITH HOOK ABOVE*/
- 0x1ea3, /* U+001ea3: LATIN SMALL LETTER A WITH HOOK ABOVE*/
- 0x1ea5, /* U+001ea4: LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE*/
- 0x1ea5, /* U+001ea5: LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE*/
- 0x1ea7, /* U+001ea6: LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE*/
- 0x1ea7, /* U+001ea7: LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE*/
- 0x1ea9, /* U+001ea8: LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE*/
- 0x1ea9, /* U+001ea9: LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE*/
- 0x1eab, /* U+001eaa: LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE*/
- 0x1eab, /* U+001eab: LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE*/
- 0x1ead, /* U+001eac: LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW*/
- 0x1ead, /* U+001ead: LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW*/
- 0x1eaf, /* U+001eae: LATIN CAPITAL LETTER A WITH BREVE AND ACUTE*/
- 0x1eaf, /* U+001eaf: LATIN SMALL LETTER A WITH BREVE AND ACUTE*/
- 0x1eb1, /* U+001eb0: LATIN CAPITAL LETTER A WITH BREVE AND GRAVE*/
- 0x1eb1, /* U+001eb1: LATIN SMALL LETTER A WITH BREVE AND GRAVE*/
- 0x1eb3, /* U+001eb2: LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE*/
- 0x1eb3, /* U+001eb3: LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE*/
- 0x1eb5, /* U+001eb4: LATIN CAPITAL LETTER A WITH BREVE AND TILDE*/
- 0x1eb5, /* U+001eb5: LATIN SMALL LETTER A WITH BREVE AND TILDE*/
- 0x1eb7, /* U+001eb6: LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW*/
- 0x1eb7, /* U+001eb7: LATIN SMALL LETTER A WITH BREVE AND DOT BELOW*/
- 0x1eb9, /* U+001eb8: LATIN CAPITAL LETTER E WITH DOT BELOW*/
- 0x1eb9, /* U+001eb9: LATIN SMALL LETTER E WITH DOT BELOW*/
- 0x1ebb, /* U+001eba: LATIN CAPITAL LETTER E WITH HOOK ABOVE*/
- 0x1ebb, /* U+001ebb: LATIN SMALL LETTER E WITH HOOK ABOVE*/
- 0x1ebd, /* U+001ebc: LATIN CAPITAL LETTER E WITH TILDE*/
- 0x1ebd, /* U+001ebd: LATIN SMALL LETTER E WITH TILDE*/
- 0x1ebf, /* U+001ebe: LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE*/
- 0x1ebf, /* U+001ebf: LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE*/
- 0x1ec1, /* U+001ec0: LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE*/
- 0x1ec1, /* U+001ec1: LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE*/
- 0x1ec3, /* U+001ec2: LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE*/
- 0x1ec3, /* U+001ec3: LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE*/
- 0x1ec5, /* U+001ec4: LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE*/
- 0x1ec5, /* U+001ec5: LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE*/
- 0x1ec7, /* U+001ec6: LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW*/
- 0x1ec7, /* U+001ec7: LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW*/
- 0x1ec9, /* U+001ec8: LATIN CAPITAL LETTER I WITH HOOK ABOVE*/
- 0x1ec9, /* U+001ec9: LATIN SMALL LETTER I WITH HOOK ABOVE*/
- 0x1ecb, /* U+001eca: LATIN CAPITAL LETTER I WITH DOT BELOW*/
- 0x1ecb, /* U+001ecb: LATIN SMALL LETTER I WITH DOT BELOW*/
- 0x1ecd, /* U+001ecc: LATIN CAPITAL LETTER O WITH DOT BELOW*/
- 0x1ecd, /* U+001ecd: LATIN SMALL LETTER O WITH DOT BELOW*/
- 0x1ecf, /* U+001ece: LATIN CAPITAL LETTER O WITH HOOK ABOVE*/
- 0x1ecf, /* U+001ecf: LATIN SMALL LETTER O WITH HOOK ABOVE*/
- 0x1ed1, /* U+001ed0: LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE*/
- 0x1ed1, /* U+001ed1: LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE*/
- 0x1ed3, /* U+001ed2: LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE*/
- 0x1ed3, /* U+001ed3: LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE*/
- 0x1ed5, /* U+001ed4: LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE*/
- 0x1ed5, /* U+001ed5: LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE*/
- 0x1ed7, /* U+001ed6: LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE*/
- 0x1ed7, /* U+001ed7: LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE*/
- 0x1ed9, /* U+001ed8: LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW*/
- 0x1ed9, /* U+001ed9: LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW*/
- 0x1edb, /* U+001eda: LATIN CAPITAL LETTER O WITH HORN AND ACUTE*/
- 0x1edb, /* U+001edb: LATIN SMALL LETTER O WITH HORN AND ACUTE*/
- 0x1edd, /* U+001edc: LATIN CAPITAL LETTER O WITH HORN AND GRAVE*/
- 0x1edd, /* U+001edd: LATIN SMALL LETTER O WITH HORN AND GRAVE*/
- 0x1edf, /* U+001ede: LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE*/
- 0x1edf, /* U+001edf: LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE*/
- 0x1ee1, /* U+001ee0: LATIN CAPITAL LETTER O WITH HORN AND TILDE*/
- 0x1ee1, /* U+001ee1: LATIN SMALL LETTER O WITH HORN AND TILDE*/
- 0x1ee3, /* U+001ee2: LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW*/
- 0x1ee3, /* U+001ee3: LATIN SMALL LETTER O WITH HORN AND DOT BELOW*/
- 0x1ee5, /* U+001ee4: LATIN CAPITAL LETTER U WITH DOT BELOW*/
- 0x1ee5, /* U+001ee5: LATIN SMALL LETTER U WITH DOT BELOW*/
- 0x1ee7, /* U+001ee6: LATIN CAPITAL LETTER U WITH HOOK ABOVE*/
- 0x1ee7, /* U+001ee7: LATIN SMALL LETTER U WITH HOOK ABOVE*/
- 0x1ee9, /* U+001ee8: LATIN CAPITAL LETTER U WITH HORN AND ACUTE*/
- 0x1ee9, /* U+001ee9: LATIN SMALL LETTER U WITH HORN AND ACUTE*/
- 0x1eeb, /* U+001eea: LATIN CAPITAL LETTER U WITH HORN AND GRAVE*/
- 0x1eeb, /* U+001eeb: LATIN SMALL LETTER U WITH HORN AND GRAVE*/
- 0x1eed, /* U+001eec: LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE*/
- 0x1eed, /* U+001eed: LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE*/
- 0x1eef, /* U+001eee: LATIN CAPITAL LETTER U WITH HORN AND TILDE*/
- 0x1eef, /* U+001eef: LATIN SMALL LETTER U WITH HORN AND TILDE*/
- 0x1ef1, /* U+001ef0: LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW*/
- 0x1ef1, /* U+001ef1: LATIN SMALL LETTER U WITH HORN AND DOT BELOW*/
- 0x1ef3, /* U+001ef2: LATIN CAPITAL LETTER Y WITH GRAVE*/
- 0x1ef3, /* U+001ef3: LATIN SMALL LETTER Y WITH GRAVE*/
- 0x1ef5, /* U+001ef4: LATIN CAPITAL LETTER Y WITH DOT BELOW*/
- 0x1ef5, /* U+001ef5: LATIN SMALL LETTER Y WITH DOT BELOW*/
- 0x1ef7, /* U+001ef6: LATIN CAPITAL LETTER Y WITH HOOK ABOVE*/
- 0x1ef7, /* U+001ef7: LATIN SMALL LETTER Y WITH HOOK ABOVE*/
- 0x1ef9, /* U+001ef8: LATIN CAPITAL LETTER Y WITH TILDE*/
- 0x1ef9, /* U+001ef9: LATIN SMALL LETTER Y WITH TILDE*/
- 0x1efa, /* U+001efa: */
- 0x1efb, /* U+001efb: */
- 0x1efc, /* U+001efc: */
- 0x1efd, /* U+001efd: */
- 0x1efe, /* U+001efe: */
- 0x1eff, /* U+001eff: */
- 0x1f00, /* U+001f00: GREEK SMALL LETTER ALPHA WITH PSILI*/
- 0x1f01, /* U+001f01: GREEK SMALL LETTER ALPHA WITH DASIA*/
- 0x1f02, /* U+001f02: GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA*/
- 0x1f03, /* U+001f03: GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA*/
- 0x1f04, /* U+001f04: GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA*/
- 0x1f05, /* U+001f05: GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA*/
- 0x1f06, /* U+001f06: GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI*/
- 0x1f07, /* U+001f07: GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI*/
- 0x1f00, /* U+001f08: GREEK CAPITAL LETTER ALPHA WITH PSILI*/
- 0x1f01, /* U+001f09: GREEK CAPITAL LETTER ALPHA WITH DASIA*/
- 0x1f02, /* U+001f0a: GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA*/
- 0x1f03, /* U+001f0b: GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA*/
- 0x1f04, /* U+001f0c: GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA*/
- 0x1f05, /* U+001f0d: GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA*/
- 0x1f06, /* U+001f0e: GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI*/
- 0x1f07, /* U+001f0f: GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI*/
- 0x1f10, /* U+001f10: GREEK SMALL LETTER EPSILON WITH PSILI*/
- 0x1f11, /* U+001f11: GREEK SMALL LETTER EPSILON WITH DASIA*/
- 0x1f12, /* U+001f12: GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA*/
- 0x1f13, /* U+001f13: GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA*/
- 0x1f14, /* U+001f14: GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA*/
- 0x1f15, /* U+001f15: GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA*/
- 0x1f16, /* U+001f16: */
- 0x1f17, /* U+001f17: */
- 0x1f10, /* U+001f18: GREEK CAPITAL LETTER EPSILON WITH PSILI*/
- 0x1f11, /* U+001f19: GREEK CAPITAL LETTER EPSILON WITH DASIA*/
- 0x1f12, /* U+001f1a: GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA*/
- 0x1f13, /* U+001f1b: GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA*/
- 0x1f14, /* U+001f1c: GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA*/
- 0x1f15, /* U+001f1d: GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA*/
- 0x1f1e, /* U+001f1e: */
- 0x1f1f, /* U+001f1f: */
- 0x1f20, /* U+001f20: GREEK SMALL LETTER ETA WITH PSILI*/
- 0x1f21, /* U+001f21: GREEK SMALL LETTER ETA WITH DASIA*/
- 0x1f22, /* U+001f22: GREEK SMALL LETTER ETA WITH PSILI AND VARIA*/
- 0x1f23, /* U+001f23: GREEK SMALL LETTER ETA WITH DASIA AND VARIA*/
- 0x1f24, /* U+001f24: GREEK SMALL LETTER ETA WITH PSILI AND OXIA*/
- 0x1f25, /* U+001f25: GREEK SMALL LETTER ETA WITH DASIA AND OXIA*/
- 0x1f26, /* U+001f26: GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI*/
- 0x1f27, /* U+001f27: GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI*/
- 0x1f20, /* U+001f28: GREEK CAPITAL LETTER ETA WITH PSILI*/
- 0x1f21, /* U+001f29: GREEK CAPITAL LETTER ETA WITH DASIA*/
- 0x1f22, /* U+001f2a: GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA*/
- 0x1f23, /* U+001f2b: GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA*/
- 0x1f24, /* U+001f2c: GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA*/
- 0x1f25, /* U+001f2d: GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA*/
- 0x1f26, /* U+001f2e: GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI*/
- 0x1f27, /* U+001f2f: GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI*/
- 0x1f30, /* U+001f30: GREEK SMALL LETTER IOTA WITH PSILI*/
- 0x1f31, /* U+001f31: GREEK SMALL LETTER IOTA WITH DASIA*/
- 0x1f32, /* U+001f32: GREEK SMALL LETTER IOTA WITH PSILI AND VARIA*/
- 0x1f33, /* U+001f33: GREEK SMALL LETTER IOTA WITH DASIA AND VARIA*/
- 0x1f34, /* U+001f34: GREEK SMALL LETTER IOTA WITH PSILI AND OXIA*/
- 0x1f35, /* U+001f35: GREEK SMALL LETTER IOTA WITH DASIA AND OXIA*/
- 0x1f36, /* U+001f36: GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI*/
- 0x1f37, /* U+001f37: GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI*/
- 0x1f30, /* U+001f38: GREEK CAPITAL LETTER IOTA WITH PSILI*/
- 0x1f31, /* U+001f39: GREEK CAPITAL LETTER IOTA WITH DASIA*/
- 0x1f32, /* U+001f3a: GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA*/
- 0x1f33, /* U+001f3b: GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA*/
- 0x1f34, /* U+001f3c: GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA*/
- 0x1f35, /* U+001f3d: GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA*/
- 0x1f36, /* U+001f3e: GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI*/
- 0x1f37, /* U+001f3f: GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI*/
- 0x1f40, /* U+001f40: GREEK SMALL LETTER OMICRON WITH PSILI*/
- 0x1f41, /* U+001f41: GREEK SMALL LETTER OMICRON WITH DASIA*/
- 0x1f42, /* U+001f42: GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA*/
- 0x1f43, /* U+001f43: GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA*/
- 0x1f44, /* U+001f44: GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA*/
- 0x1f45, /* U+001f45: GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA*/
- 0x1f46, /* U+001f46: */
- 0x1f47, /* U+001f47: */
- 0x1f40, /* U+001f48: GREEK CAPITAL LETTER OMICRON WITH PSILI*/
- 0x1f41, /* U+001f49: GREEK CAPITAL LETTER OMICRON WITH DASIA*/
- 0x1f42, /* U+001f4a: GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA*/
- 0x1f43, /* U+001f4b: GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA*/
- 0x1f44, /* U+001f4c: GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA*/
- 0x1f45, /* U+001f4d: GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA*/
- 0x1f4e, /* U+001f4e: */
- 0x1f4f, /* U+001f4f: */
- 0x1f50, /* U+001f50: GREEK SMALL LETTER UPSILON WITH PSILI*/
- 0x1f51, /* U+001f51: GREEK SMALL LETTER UPSILON WITH DASIA*/
- 0x1f52, /* U+001f52: GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA*/
- 0x1f53, /* U+001f53: GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA*/
- 0x1f54, /* U+001f54: GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA*/
- 0x1f55, /* U+001f55: GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA*/
- 0x1f56, /* U+001f56: GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI*/
- 0x1f57, /* U+001f57: GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI*/
- 0x1f58, /* U+001f58: */
- 0x1f51, /* U+001f59: GREEK CAPITAL LETTER UPSILON WITH DASIA*/
- 0x1f5a, /* U+001f5a: */
- 0x1f53, /* U+001f5b: GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA*/
- 0x1f5c, /* U+001f5c: */
- 0x1f55, /* U+001f5d: GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA*/
- 0x1f5e, /* U+001f5e: */
- 0x1f57, /* U+001f5f: GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI*/
- 0x1f60, /* U+001f60: GREEK SMALL LETTER OMEGA WITH PSILI*/
- 0x1f61, /* U+001f61: GREEK SMALL LETTER OMEGA WITH DASIA*/
- 0x1f62, /* U+001f62: GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA*/
- 0x1f63, /* U+001f63: GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA*/
- 0x1f64, /* U+001f64: GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA*/
- 0x1f65, /* U+001f65: GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA*/
- 0x1f66, /* U+001f66: GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI*/
- 0x1f67, /* U+001f67: GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI*/
- 0x1f60, /* U+001f68: GREEK CAPITAL LETTER OMEGA WITH PSILI*/
- 0x1f61, /* U+001f69: GREEK CAPITAL LETTER OMEGA WITH DASIA*/
- 0x1f62, /* U+001f6a: GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA*/
- 0x1f63, /* U+001f6b: GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA*/
- 0x1f64, /* U+001f6c: GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA*/
- 0x1f65, /* U+001f6d: GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA*/
- 0x1f66, /* U+001f6e: GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI*/
- 0x1f67, /* U+001f6f: GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI*/
- 0x1f70, /* U+001f70: GREEK SMALL LETTER ALPHA WITH VARIA*/
- 0x1f71, /* U+001f71: GREEK SMALL LETTER ALPHA WITH OXIA*/
- 0x1f72, /* U+001f72: GREEK SMALL LETTER EPSILON WITH VARIA*/
- 0x1f73, /* U+001f73: GREEK SMALL LETTER EPSILON WITH OXIA*/
- 0x1f74, /* U+001f74: GREEK SMALL LETTER ETA WITH VARIA*/
- 0x1f75, /* U+001f75: GREEK SMALL LETTER ETA WITH OXIA*/
- 0x1f76, /* U+001f76: GREEK SMALL LETTER IOTA WITH VARIA*/
- 0x1f77, /* U+001f77: GREEK SMALL LETTER IOTA WITH OXIA*/
- 0x1f78, /* U+001f78: GREEK SMALL LETTER OMICRON WITH VARIA*/
- 0x1f79, /* U+001f79: GREEK SMALL LETTER OMICRON WITH OXIA*/
- 0x1f7a, /* U+001f7a: GREEK SMALL LETTER UPSILON WITH VARIA*/
- 0x1f7b, /* U+001f7b: GREEK SMALL LETTER UPSILON WITH OXIA*/
- 0x1f7c, /* U+001f7c: GREEK SMALL LETTER OMEGA WITH VARIA*/
- 0x1f7d, /* U+001f7d: GREEK SMALL LETTER OMEGA WITH OXIA*/
- 0x1f7e, /* U+001f7e: */
- 0x1f7f, /* U+001f7f: */
- 0x1f80, /* U+001f80: GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI*/
- 0x1f81, /* U+001f81: GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI*/
- 0x1f82, /* U+001f82: GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI*/
- 0x1f83, /* U+001f83: GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI*/
- 0x1f84, /* U+001f84: GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI*/
- 0x1f85, /* U+001f85: GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI*/
- 0x1f86, /* U+001f86: GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI*/
- 0x1f87, /* U+001f87: GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI*/
- 0x1f80, /* U+001f88: GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI*/
- 0x1f81, /* U+001f89: GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI*/
- 0x1f82, /* U+001f8a: GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI*/
- 0x1f83, /* U+001f8b: GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI*/
- 0x1f84, /* U+001f8c: GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI*/
- 0x1f85, /* U+001f8d: GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI*/
- 0x1f86, /* U+001f8e: GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI*/
- 0x1f87, /* U+001f8f: GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI*/
- 0x1f90, /* U+001f90: GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI*/
- 0x1f91, /* U+001f91: GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI*/
- 0x1f92, /* U+001f92: GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI*/
- 0x1f93, /* U+001f93: GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI*/
- 0x1f94, /* U+001f94: GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI*/
- 0x1f95, /* U+001f95: GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI*/
- 0x1f96, /* U+001f96: GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI*/
- 0x1f97, /* U+001f97: GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI*/
- 0x1f90, /* U+001f98: GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI*/
- 0x1f91, /* U+001f99: GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI*/
- 0x1f92, /* U+001f9a: GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI*/
- 0x1f93, /* U+001f9b: GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI*/
- 0x1f94, /* U+001f9c: GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI*/
- 0x1f95, /* U+001f9d: GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI*/
- 0x1f96, /* U+001f9e: GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI*/
- 0x1f97, /* U+001f9f: GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI*/
- 0x1fa0, /* U+001fa0: GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI*/
- 0x1fa1, /* U+001fa1: GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI*/
- 0x1fa2, /* U+001fa2: GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI*/
- 0x1fa3, /* U+001fa3: GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI*/
- 0x1fa4, /* U+001fa4: GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI*/
- 0x1fa5, /* U+001fa5: GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI*/
- 0x1fa6, /* U+001fa6: GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI*/
- 0x1fa7, /* U+001fa7: GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI*/
- 0x1fa0, /* U+001fa8: GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI*/
- 0x1fa1, /* U+001fa9: GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI*/
- 0x1fa2, /* U+001faa: GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI*/
- 0x1fa3, /* U+001fab: GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI*/
- 0x1fa4, /* U+001fac: GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI*/
- 0x1fa5, /* U+001fad: GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI*/
- 0x1fa6, /* U+001fae: GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI*/
- 0x1fa7, /* U+001faf: GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI*/
- 0x1fb0, /* U+001fb0: GREEK SMALL LETTER ALPHA WITH VRACHY*/
- 0x1fb1, /* U+001fb1: GREEK SMALL LETTER ALPHA WITH MACRON*/
- 0x1fb2, /* U+001fb2: GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI*/
- 0x1fb3, /* U+001fb3: GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI*/
- 0x1fb4, /* U+001fb4: GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI*/
- 0x1fb5, /* U+001fb5: */
- 0x1fb6, /* U+001fb6: GREEK SMALL LETTER ALPHA WITH PERISPOMENI*/
- 0x1fb7, /* U+001fb7: GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI*/
- 0x1fb0, /* U+001fb8: GREEK CAPITAL LETTER ALPHA WITH VRACHY*/
- 0x1fb1, /* U+001fb9: GREEK CAPITAL LETTER ALPHA WITH MACRON*/
- 0x1f70, /* U+001fba: GREEK CAPITAL LETTER ALPHA WITH VARIA*/
- 0x1f71, /* U+001fbb: GREEK CAPITAL LETTER ALPHA WITH OXIA*/
- 0x1fb3, /* U+001fbc: GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI*/
- 0x1fbd, /* U+001fbd: GREEK KORONIS*/
- 0x1fbe, /* U+001fbe: GREEK PROSGEGRAMMENI*/
- 0x1fbf, /* U+001fbf: GREEK PSILI*/
- 0x1fc0, /* U+001fc0: GREEK PERISPOMENI*/
- 0x1fc1, /* U+001fc1: GREEK DIALYTIKA AND PERISPOMENI*/
- 0x1fc2, /* U+001fc2: GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI*/
- 0x1fc3, /* U+001fc3: GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI*/
- 0x1fc4, /* U+001fc4: GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI*/
- 0x1fc5, /* U+001fc5: */
- 0x1fc6, /* U+001fc6: GREEK SMALL LETTER ETA WITH PERISPOMENI*/
- 0x1fc7, /* U+001fc7: GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI*/
- 0x1f72, /* U+001fc8: GREEK CAPITAL LETTER EPSILON WITH VARIA*/
- 0x1f73, /* U+001fc9: GREEK CAPITAL LETTER EPSILON WITH OXIA*/
- 0x1f74, /* U+001fca: GREEK CAPITAL LETTER ETA WITH VARIA*/
- 0x1f75, /* U+001fcb: GREEK CAPITAL LETTER ETA WITH OXIA*/
- 0x1fc3, /* U+001fcc: GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI*/
- 0x1fcd, /* U+001fcd: GREEK PSILI AND VARIA*/
- 0x1fce, /* U+001fce: GREEK PSILI AND OXIA*/
- 0x1fcf, /* U+001fcf: GREEK PSILI AND PERISPOMENI*/
- 0x1fd0, /* U+001fd0: GREEK SMALL LETTER IOTA WITH VRACHY*/
- 0x1fd1, /* U+001fd1: GREEK SMALL LETTER IOTA WITH MACRON*/
- 0x1fd2, /* U+001fd2: GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA*/
- 0x1fd3, /* U+001fd3: GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA*/
- 0x1fd4, /* U+001fd4: */
- 0x1fd5, /* U+001fd5: */
- 0x1fd6, /* U+001fd6: GREEK SMALL LETTER IOTA WITH PERISPOMENI*/
- 0x1fd7, /* U+001fd7: GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI*/
- 0x1fd0, /* U+001fd8: GREEK CAPITAL LETTER IOTA WITH VRACHY*/
- 0x1fd1, /* U+001fd9: GREEK CAPITAL LETTER IOTA WITH MACRON*/
- 0x1f76, /* U+001fda: GREEK CAPITAL LETTER IOTA WITH VARIA*/
- 0x1f77, /* U+001fdb: GREEK CAPITAL LETTER IOTA WITH OXIA*/
- 0x1fdc, /* U+001fdc: */
- 0x1fdd, /* U+001fdd: GREEK DASIA AND VARIA*/
- 0x1fde, /* U+001fde: GREEK DASIA AND OXIA*/
- 0x1fdf, /* U+001fdf: GREEK DASIA AND PERISPOMENI*/
- 0x1fe0, /* U+001fe0: GREEK SMALL LETTER UPSILON WITH VRACHY*/
- 0x1fe1, /* U+001fe1: GREEK SMALL LETTER UPSILON WITH MACRON*/
- 0x1fe2, /* U+001fe2: GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA*/
- 0x1fe3, /* U+001fe3: GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA*/
- 0x1fe4, /* U+001fe4: GREEK SMALL LETTER RHO WITH PSILI*/
- 0x1fe5, /* U+001fe5: GREEK SMALL LETTER RHO WITH DASIA*/
- 0x1fe6, /* U+001fe6: GREEK SMALL LETTER UPSILON WITH PERISPOMENI*/
- 0x1fe7, /* U+001fe7: GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI*/
- 0x1fe0, /* U+001fe8: GREEK CAPITAL LETTER UPSILON WITH VRACHY*/
- 0x1fe1, /* U+001fe9: GREEK CAPITAL LETTER UPSILON WITH MACRON*/
- 0x1f7a, /* U+001fea: GREEK CAPITAL LETTER UPSILON WITH VARIA*/
- 0x1f7b, /* U+001feb: GREEK CAPITAL LETTER UPSILON WITH OXIA*/
- 0x1fe5, /* U+001fec: GREEK CAPITAL LETTER RHO WITH DASIA*/
- 0x1fed, /* U+001fed: GREEK DIALYTIKA AND VARIA*/
- 0x1fee, /* U+001fee: GREEK DIALYTIKA AND OXIA*/
- 0x1fef, /* U+001fef: GREEK VARIA*/
- 0x1ff0, /* U+001ff0: */
- 0x1ff1, /* U+001ff1: */
- 0x1ff2, /* U+001ff2: GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI*/
- 0x1ff3, /* U+001ff3: GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI*/
- 0x1ff4, /* U+001ff4: GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI*/
- 0x1ff5, /* U+001ff5: */
- 0x1ff6, /* U+001ff6: GREEK SMALL LETTER OMEGA WITH PERISPOMENI*/
- 0x1ff7, /* U+001ff7: GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI*/
- 0x1f78, /* U+001ff8: GREEK CAPITAL LETTER OMICRON WITH VARIA*/
- 0x1f79, /* U+001ff9: GREEK CAPITAL LETTER OMICRON WITH OXIA*/
- 0x1f7c, /* U+001ffa: GREEK CAPITAL LETTER OMEGA WITH VARIA*/
- 0x1f7d, /* U+001ffb: GREEK CAPITAL LETTER OMEGA WITH OXIA*/
- 0x1ff3, /* U+001ffc: GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI*/
- 0x1ffd, /* U+001ffd: GREEK OXIA*/
- 0x1ffe, /* U+001ffe: GREEK DASIA*/
- 0x1fff, /* U+001fff: */
- 0x2000, /* U+002000: EN QUAD*/
- 0x2001, /* U+002001: EM QUAD*/
- 0x2002, /* U+002002: EN SPACE*/
- 0x2003, /* U+002003: EM SPACE*/
- 0x2004, /* U+002004: THREE-PER-EM SPACE*/
- 0x2005, /* U+002005: FOUR-PER-EM SPACE*/
- 0x2006, /* U+002006: SIX-PER-EM SPACE*/
- 0x2007, /* U+002007: FIGURE SPACE*/
- 0x2008, /* U+002008: PUNCTUATION SPACE*/
- 0x2009, /* U+002009: THIN SPACE*/
- 0x200a, /* U+00200a: HAIR SPACE*/
- 0x200b, /* U+00200b: ZERO WIDTH SPACE*/
- 0x200c, /* U+00200c: ZERO WIDTH NON-JOINER*/
- 0x200d, /* U+00200d: ZERO WIDTH JOINER*/
- 0x200e, /* U+00200e: LEFT-TO-RIGHT MARK*/
- 0x200f, /* U+00200f: RIGHT-TO-LEFT MARK*/
- 0x2010, /* U+002010: HYPHEN*/
- 0x2011, /* U+002011: NON-BREAKING HYPHEN*/
- 0x2012, /* U+002012: FIGURE DASH*/
- 0x2013, /* U+002013: EN DASH*/
- 0x2014, /* U+002014: EM DASH*/
- 0x2015, /* U+002015: HORIZONTAL BAR*/
- 0x2016, /* U+002016: DOUBLE VERTICAL LINE*/
- 0x2017, /* U+002017: DOUBLE LOW LINE*/
- 0x2018, /* U+002018: LEFT SINGLE QUOTATION MARK*/
- 0x2019, /* U+002019: RIGHT SINGLE QUOTATION MARK*/
- 0x201a, /* U+00201a: SINGLE LOW-9 QUOTATION MARK*/
- 0x201b, /* U+00201b: SINGLE HIGH-REVERSED-9 QUOTATION MARK*/
- 0x201c, /* U+00201c: LEFT DOUBLE QUOTATION MARK*/
- 0x201d, /* U+00201d: RIGHT DOUBLE QUOTATION MARK*/
- 0x201e, /* U+00201e: DOUBLE LOW-9 QUOTATION MARK*/
- 0x201f, /* U+00201f: DOUBLE HIGH-REVERSED-9 QUOTATION MARK*/
- 0x2020, /* U+002020: DAGGER*/
- 0x2021, /* U+002021: DOUBLE DAGGER*/
- 0x2022, /* U+002022: BULLET*/
- 0x2023, /* U+002023: TRIANGULAR BULLET*/
- 0x2024, /* U+002024: ONE DOT LEADER*/
- 0x2025, /* U+002025: TWO DOT LEADER*/
- 0x2026, /* U+002026: HORIZONTAL ELLIPSIS*/
- 0x2027, /* U+002027: HYPHENATION POINT*/
- 0x2028, /* U+002028: LINE SEPARATOR*/
- 0x2029, /* U+002029: PARAGRAPH SEPARATOR*/
- 0x202a, /* U+00202a: LEFT-TO-RIGHT EMBEDDING*/
- 0x202b, /* U+00202b: RIGHT-TO-LEFT EMBEDDING*/
- 0x202c, /* U+00202c: POP DIRECTIONAL FORMATTING*/
- 0x202d, /* U+00202d: LEFT-TO-RIGHT OVERRIDE*/
- 0x202e, /* U+00202e: RIGHT-TO-LEFT OVERRIDE*/
- 0x202f, /* U+00202f: NARROW NO-BREAK SPACE*/
- 0x2030, /* U+002030: PER MILLE SIGN*/
- 0x2031, /* U+002031: PER TEN THOUSAND SIGN*/
- 0x2032, /* U+002032: PRIME*/
- 0x2033, /* U+002033: DOUBLE PRIME*/
- 0x2034, /* U+002034: TRIPLE PRIME*/
- 0x2035, /* U+002035: REVERSED PRIME*/
- 0x2036, /* U+002036: REVERSED DOUBLE PRIME*/
- 0x2037, /* U+002037: REVERSED TRIPLE PRIME*/
- 0x2038, /* U+002038: CARET*/
- 0x2039, /* U+002039: SINGLE LEFT-POINTING ANGLE QUOTATION MARK*/
- 0x203a, /* U+00203a: SINGLE RIGHT-POINTING ANGLE QUOTATION MARK*/
- 0x203b, /* U+00203b: REFERENCE MARK*/
- 0x203c, /* U+00203c: DOUBLE EXCLAMATION MARK*/
- 0x203d, /* U+00203d: INTERROBANG*/
- 0x203e, /* U+00203e: OVERLINE*/
- 0x203f, /* U+00203f: UNDERTIE*/
- 0x2040, /* U+002040: CHARACTER TIE*/
- 0x2041, /* U+002041: CARET INSERTION POINT*/
- 0x2042, /* U+002042: ASTERISM*/
- 0x2043, /* U+002043: HYPHEN BULLET*/
- 0x2044, /* U+002044: FRACTION SLASH*/
- 0x2045, /* U+002045: LEFT SQUARE BRACKET WITH QUILL*/
- 0x2046, /* U+002046: RIGHT SQUARE BRACKET WITH QUILL*/
- 0x2047, /* U+002047: DOUBLE QUESTION MARK*/
- 0x2048, /* U+002048: QUESTION EXCLAMATION MARK*/
- 0x2049, /* U+002049: EXCLAMATION QUESTION MARK*/
- 0x204a, /* U+00204a: TIRONIAN SIGN ET*/
- 0x204b, /* U+00204b: REVERSED PILCROW SIGN*/
- 0x204c, /* U+00204c: BLACK LEFTWARDS BULLET*/
- 0x204d, /* U+00204d: BLACK RIGHTWARDS BULLET*/
- 0x204e, /* U+00204e: LOW ASTERISK*/
- 0x204f, /* U+00204f: REVERSED SEMICOLON*/
- 0x2050, /* U+002050: CLOSE UP*/
- 0x2051, /* U+002051: TWO ASTERISKS ALIGNED VERTICALLY*/
- 0x2052, /* U+002052: COMMERCIAL MINUS SIGN*/
- 0x2053, /* U+002053: SWUNG DASH*/
- 0x2054, /* U+002054: INVERTED UNDERTIE*/
- 0x2055, /* U+002055: FLOWER PUNCTUATION MARK*/
- 0x2056, /* U+002056: THREE DOT PUNCTUATION*/
- 0x2057, /* U+002057: QUADRUPLE PRIME*/
- 0x2058, /* U+002058: FOUR DOT PUNCTUATION*/
- 0x2059, /* U+002059: FIVE DOT PUNCTUATION*/
- 0x205a, /* U+00205a: TWO DOT PUNCTUATION*/
- 0x205b, /* U+00205b: FOUR DOT MARK*/
- 0x205c, /* U+00205c: DOTTED CROSS*/
- 0x205d, /* U+00205d: TRICOLON*/
- 0x205e, /* U+00205e: VERTICAL FOUR DOTS*/
- 0x205f, /* U+00205f: MEDIUM MATHEMATICAL SPACE*/
- 0x2060, /* U+002060: WORD JOINER*/
- 0x2061, /* U+002061: FUNCTION APPLICATION*/
- 0x2062, /* U+002062: INVISIBLE TIMES*/
- 0x2063, /* U+002063: INVISIBLE SEPARATOR*/
- 0x2064, /* U+002064: */
- 0x2065, /* U+002065: */
- 0x2066, /* U+002066: */
- 0x2067, /* U+002067: */
- 0x2068, /* U+002068: */
- 0x2069, /* U+002069: */
- 0x206a, /* U+00206a: INHIBIT SYMMETRIC SWAPPING*/
- 0x206b, /* U+00206b: ACTIVATE SYMMETRIC SWAPPING*/
- 0x206c, /* U+00206c: INHIBIT ARABIC FORM SHAPING*/
- 0x206d, /* U+00206d: ACTIVATE ARABIC FORM SHAPING*/
- 0x206e, /* U+00206e: NATIONAL DIGIT SHAPES*/
- 0x206f, /* U+00206f: NOMINAL DIGIT SHAPES*/
- 0x2070, /* U+002070: SUPERSCRIPT ZERO*/
- 0x2071, /* U+002071: SUPERSCRIPT LATIN SMALL LETTER I*/
- 0x2072, /* U+002072: */
- 0x2073, /* U+002073: */
- 0x2074, /* U+002074: SUPERSCRIPT FOUR*/
- 0x2075, /* U+002075: SUPERSCRIPT FIVE*/
- 0x2076, /* U+002076: SUPERSCRIPT SIX*/
- 0x2077, /* U+002077: SUPERSCRIPT SEVEN*/
- 0x2078, /* U+002078: SUPERSCRIPT EIGHT*/
- 0x2079, /* U+002079: SUPERSCRIPT NINE*/
- 0x207a, /* U+00207a: SUPERSCRIPT PLUS SIGN*/
- 0x207b, /* U+00207b: SUPERSCRIPT MINUS*/
- 0x207c, /* U+00207c: SUPERSCRIPT EQUALS SIGN*/
- 0x207d, /* U+00207d: SUPERSCRIPT LEFT PARENTHESIS*/
- 0x207e, /* U+00207e: SUPERSCRIPT RIGHT PARENTHESIS*/
- 0x207f, /* U+00207f: SUPERSCRIPT LATIN SMALL LETTER N*/
- 0x2080, /* U+002080: SUBSCRIPT ZERO*/
- 0x2081, /* U+002081: SUBSCRIPT ONE*/
- 0x2082, /* U+002082: SUBSCRIPT TWO*/
- 0x2083, /* U+002083: SUBSCRIPT THREE*/
- 0x2084, /* U+002084: SUBSCRIPT FOUR*/
- 0x2085, /* U+002085: SUBSCRIPT FIVE*/
- 0x2086, /* U+002086: SUBSCRIPT SIX*/
- 0x2087, /* U+002087: SUBSCRIPT SEVEN*/
- 0x2088, /* U+002088: SUBSCRIPT EIGHT*/
- 0x2089, /* U+002089: SUBSCRIPT NINE*/
- 0x208a, /* U+00208a: SUBSCRIPT PLUS SIGN*/
- 0x208b, /* U+00208b: SUBSCRIPT MINUS*/
- 0x208c, /* U+00208c: SUBSCRIPT EQUALS SIGN*/
- 0x208d, /* U+00208d: SUBSCRIPT LEFT PARENTHESIS*/
- 0x208e, /* U+00208e: SUBSCRIPT RIGHT PARENTHESIS*/
- 0x208f, /* U+00208f: */
- 0x2090, /* U+002090: LATIN SUBSCRIPT SMALL LETTER A*/
- 0x2091, /* U+002091: LATIN SUBSCRIPT SMALL LETTER E*/
- 0x2092, /* U+002092: LATIN SUBSCRIPT SMALL LETTER O*/
- 0x2093, /* U+002093: LATIN SUBSCRIPT SMALL LETTER X*/
- 0x2094, /* U+002094: LATIN SUBSCRIPT SMALL LETTER SCHWA*/
- 0x2095, /* U+002095: */
- 0x2096, /* U+002096: */
- 0x2097, /* U+002097: */
- 0x2098, /* U+002098: */
- 0x2099, /* U+002099: */
- 0x209a, /* U+00209a: */
- 0x209b, /* U+00209b: */
- 0x209c, /* U+00209c: */
- 0x209d, /* U+00209d: */
- 0x209e, /* U+00209e: */
- 0x209f, /* U+00209f: */
- 0x20a0, /* U+0020a0: EURO-CURRENCY SIGN*/
- 0x20a1, /* U+0020a1: COLON SIGN*/
- 0x20a2, /* U+0020a2: CRUZEIRO SIGN*/
- 0x20a3, /* U+0020a3: FRENCH FRANC SIGN*/
- 0x20a4, /* U+0020a4: LIRA SIGN*/
- 0x20a5, /* U+0020a5: MILL SIGN*/
- 0x20a6, /* U+0020a6: NAIRA SIGN*/
- 0x20a7, /* U+0020a7: PESETA SIGN*/
- 0x20a8, /* U+0020a8: RUPEE SIGN*/
- 0x20a9, /* U+0020a9: WON SIGN*/
- 0x20aa, /* U+0020aa: NEW SHEQEL SIGN*/
- 0x20ab, /* U+0020ab: DONG SIGN*/
- 0x20ac, /* U+0020ac: EURO SIGN*/
- 0x20ad, /* U+0020ad: KIP SIGN*/
- 0x20ae, /* U+0020ae: TUGRIK SIGN*/
- 0x20af, /* U+0020af: DRACHMA SIGN*/
- 0x20b0, /* U+0020b0: GERMAN PENNY SIGN*/
- 0x20b1, /* U+0020b1: PESO SIGN*/
- 0x20b2, /* U+0020b2: GUARANI SIGN*/
- 0x20b3, /* U+0020b3: AUSTRAL SIGN*/
- 0x20b4, /* U+0020b4: HRYVNIA SIGN*/
- 0x20b5, /* U+0020b5: CEDI SIGN*/
- 0x20b6, /* U+0020b6: */
- 0x20b7, /* U+0020b7: */
- 0x20b8, /* U+0020b8: */
- 0x20b9, /* U+0020b9: */
- 0x20ba, /* U+0020ba: */
- 0x20bb, /* U+0020bb: */
- 0x20bc, /* U+0020bc: */
- 0x20bd, /* U+0020bd: */
- 0x20be, /* U+0020be: */
- 0x20bf, /* U+0020bf: */
- 0x20c0, /* U+0020c0: */
- 0x20c1, /* U+0020c1: */
- 0x20c2, /* U+0020c2: */
- 0x20c3, /* U+0020c3: */
- 0x20c4, /* U+0020c4: */
- 0x20c5, /* U+0020c5: */
- 0x20c6, /* U+0020c6: */
- 0x20c7, /* U+0020c7: */
- 0x20c8, /* U+0020c8: */
- 0x20c9, /* U+0020c9: */
- 0x20ca, /* U+0020ca: */
- 0x20cb, /* U+0020cb: */
- 0x20cc, /* U+0020cc: */
- 0x20cd, /* U+0020cd: */
- 0x20ce, /* U+0020ce: */
- 0x20cf, /* U+0020cf: */
- 0x20d0, /* U+0020d0: COMBINING LEFT HARPOON ABOVE*/
- 0x20d1, /* U+0020d1: COMBINING RIGHT HARPOON ABOVE*/
- 0x20d2, /* U+0020d2: COMBINING LONG VERTICAL LINE OVERLAY*/
- 0x20d3, /* U+0020d3: COMBINING SHORT VERTICAL LINE OVERLAY*/
- 0x20d4, /* U+0020d4: COMBINING ANTICLOCKWISE ARROW ABOVE*/
- 0x20d5, /* U+0020d5: COMBINING CLOCKWISE ARROW ABOVE*/
- 0x20d6, /* U+0020d6: COMBINING LEFT ARROW ABOVE*/
- 0x20d7, /* U+0020d7: COMBINING RIGHT ARROW ABOVE*/
- 0x20d8, /* U+0020d8: COMBINING RING OVERLAY*/
- 0x20d9, /* U+0020d9: COMBINING CLOCKWISE RING OVERLAY*/
- 0x20da, /* U+0020da: COMBINING ANTICLOCKWISE RING OVERLAY*/
- 0x20db, /* U+0020db: COMBINING THREE DOTS ABOVE*/
- 0x20dc, /* U+0020dc: COMBINING FOUR DOTS ABOVE*/
- 0x20dd, /* U+0020dd: COMBINING ENCLOSING CIRCLE*/
- 0x20de, /* U+0020de: COMBINING ENCLOSING SQUARE*/
- 0x20df, /* U+0020df: COMBINING ENCLOSING DIAMOND*/
- 0x20e0, /* U+0020e0: COMBINING ENCLOSING CIRCLE BACKSLASH*/
- 0x20e1, /* U+0020e1: COMBINING LEFT RIGHT ARROW ABOVE*/
- 0x20e2, /* U+0020e2: COMBINING ENCLOSING SCREEN*/
- 0x20e3, /* U+0020e3: COMBINING ENCLOSING KEYCAP*/
- 0x20e4, /* U+0020e4: COMBINING ENCLOSING UPWARD POINTING TRIANGLE*/
- 0x20e5, /* U+0020e5: COMBINING REVERSE SOLIDUS OVERLAY*/
- 0x20e6, /* U+0020e6: COMBINING DOUBLE VERTICAL STROKE OVERLAY*/
- 0x20e7, /* U+0020e7: COMBINING ANNUITY SYMBOL*/
- 0x20e8, /* U+0020e8: COMBINING TRIPLE UNDERDOT*/
- 0x20e9, /* U+0020e9: COMBINING WIDE BRIDGE ABOVE*/
- 0x20ea, /* U+0020ea: COMBINING LEFTWARDS ARROW OVERLAY*/
- 0x20eb, /* U+0020eb: COMBINING LONG DOUBLE SOLIDUS OVERLAY*/
- 0x20ec, /* U+0020ec: */
- 0x20ed, /* U+0020ed: */
- 0x20ee, /* U+0020ee: */
- 0x20ef, /* U+0020ef: */
- 0x20f0, /* U+0020f0: */
- 0x20f1, /* U+0020f1: */
- 0x20f2, /* U+0020f2: */
- 0x20f3, /* U+0020f3: */
- 0x20f4, /* U+0020f4: */
- 0x20f5, /* U+0020f5: */
- 0x20f6, /* U+0020f6: */
- 0x20f7, /* U+0020f7: */
- 0x20f8, /* U+0020f8: */
- 0x20f9, /* U+0020f9: */
- 0x20fa, /* U+0020fa: */
- 0x20fb, /* U+0020fb: */
- 0x20fc, /* U+0020fc: */
- 0x20fd, /* U+0020fd: */
- 0x20fe, /* U+0020fe: */
- 0x20ff, /* U+0020ff: */
- 0x2100, /* U+002100: ACCOUNT OF*/
- 0x2101, /* U+002101: ADDRESSED TO THE SUBJECT*/
- 0x2102, /* U+002102: DOUBLE-STRUCK CAPITAL C*/
- 0x2103, /* U+002103: DEGREE CELSIUS*/
- 0x2104, /* U+002104: CENTRE LINE SYMBOL*/
- 0x2105, /* U+002105: CARE OF*/
- 0x2106, /* U+002106: CADA UNA*/
- 0x2107, /* U+002107: EULER CONSTANT*/
- 0x2108, /* U+002108: SCRUPLE*/
- 0x2109, /* U+002109: DEGREE FAHRENHEIT*/
- 0x210a, /* U+00210a: SCRIPT SMALL G*/
- 0x210b, /* U+00210b: SCRIPT CAPITAL H*/
- 0x210c, /* U+00210c: BLACK-LETTER CAPITAL H*/
- 0x210d, /* U+00210d: DOUBLE-STRUCK CAPITAL H*/
- 0x210e, /* U+00210e: PLANCK CONSTANT*/
- 0x210f, /* U+00210f: PLANCK CONSTANT OVER TWO PI*/
- 0x2110, /* U+002110: SCRIPT CAPITAL I*/
- 0x2111, /* U+002111: BLACK-LETTER CAPITAL I*/
- 0x2112, /* U+002112: SCRIPT CAPITAL L*/
- 0x2113, /* U+002113: SCRIPT SMALL L*/
- 0x2114, /* U+002114: L B BAR SYMBOL*/
- 0x2115, /* U+002115: DOUBLE-STRUCK CAPITAL N*/
- 0x2116, /* U+002116: NUMERO SIGN*/
- 0x2117, /* U+002117: SOUND RECORDING COPYRIGHT*/
- 0x2118, /* U+002118: SCRIPT CAPITAL P*/
- 0x2119, /* U+002119: DOUBLE-STRUCK CAPITAL P*/
- 0x211a, /* U+00211a: DOUBLE-STRUCK CAPITAL Q*/
- 0x211b, /* U+00211b: SCRIPT CAPITAL R*/
- 0x211c, /* U+00211c: BLACK-LETTER CAPITAL R*/
- 0x211d, /* U+00211d: DOUBLE-STRUCK CAPITAL R*/
- 0x211e, /* U+00211e: PRESCRIPTION TAKE*/
- 0x211f, /* U+00211f: RESPONSE*/
- 0x2120, /* U+002120: SERVICE MARK*/
- 0x2121, /* U+002121: TELEPHONE SIGN*/
- 0x2122, /* U+002122: TRADE MARK SIGN*/
- 0x2123, /* U+002123: VERSICLE*/
- 0x2124, /* U+002124: DOUBLE-STRUCK CAPITAL Z*/
- 0x2125, /* U+002125: OUNCE SIGN*/
- 0x3c9, /* U+002126: OHM SIGN*/
- 0x2127, /* U+002127: INVERTED OHM SIGN*/
- 0x2128, /* U+002128: BLACK-LETTER CAPITAL Z*/
- 0x2129, /* U+002129: TURNED GREEK SMALL LETTER IOTA*/
- 0x6b, /* U+00212a: KELVIN SIGN*/
- 0xe5, /* U+00212b: ANGSTROM SIGN*/
- 0x212c, /* U+00212c: SCRIPT CAPITAL B*/
- 0x212d, /* U+00212d: BLACK-LETTER CAPITAL C*/
- 0x212e, /* U+00212e: ESTIMATED SYMBOL*/
- 0x212f, /* U+00212f: SCRIPT SMALL E*/
- 0x2130, /* U+002130: SCRIPT CAPITAL E*/
- 0x2131, /* U+002131: SCRIPT CAPITAL F*/
- 0x2132, /* U+002132: TURNED CAPITAL F*/
- 0x2133, /* U+002133: SCRIPT CAPITAL M*/
- 0x2134, /* U+002134: SCRIPT SMALL O*/
- 0x2135, /* U+002135: ALEF SYMBOL*/
- 0x2136, /* U+002136: BET SYMBOL*/
- 0x2137, /* U+002137: GIMEL SYMBOL*/
- 0x2138, /* U+002138: DALET SYMBOL*/
- 0x2139, /* U+002139: INFORMATION SOURCE*/
- 0x213a, /* U+00213a: ROTATED CAPITAL Q*/
- 0x213b, /* U+00213b: FACSIMILE SIGN*/
- 0x213c, /* U+00213c: DOUBLE-STRUCK SMALL PI*/
- 0x213d, /* U+00213d: DOUBLE-STRUCK SMALL GAMMA*/
- 0x213e, /* U+00213e: DOUBLE-STRUCK CAPITAL GAMMA*/
- 0x213f, /* U+00213f: DOUBLE-STRUCK CAPITAL PI*/
- 0x2140, /* U+002140: DOUBLE-STRUCK N-ARY SUMMATION*/
- 0x2141, /* U+002141: TURNED SANS-SERIF CAPITAL G*/
- 0x2142, /* U+002142: TURNED SANS-SERIF CAPITAL L*/
- 0x2143, /* U+002143: REVERSED SANS-SERIF CAPITAL L*/
- 0x2144, /* U+002144: TURNED SANS-SERIF CAPITAL Y*/
- 0x2145, /* U+002145: DOUBLE-STRUCK ITALIC CAPITAL D*/
- 0x2146, /* U+002146: DOUBLE-STRUCK ITALIC SMALL D*/
- 0x2147, /* U+002147: DOUBLE-STRUCK ITALIC SMALL E*/
- 0x2148, /* U+002148: DOUBLE-STRUCK ITALIC SMALL I*/
- 0x2149, /* U+002149: DOUBLE-STRUCK ITALIC SMALL J*/
- 0x214a, /* U+00214a: PROPERTY LINE*/
- 0x214b, /* U+00214b: TURNED AMPERSAND*/
- 0x214c, /* U+00214c: PER SIGN*/
- 0x214d, /* U+00214d: */
- 0x214e, /* U+00214e: */
- 0x214f, /* U+00214f: */
- 0x2150, /* U+002150: */
- 0x2151, /* U+002151: */
- 0x2152, /* U+002152: */
- 0x2153, /* U+002153: VULGAR FRACTION ONE THIRD*/
- 0x2154, /* U+002154: VULGAR FRACTION TWO THIRDS*/
- 0x2155, /* U+002155: VULGAR FRACTION ONE FIFTH*/
- 0x2156, /* U+002156: VULGAR FRACTION TWO FIFTHS*/
- 0x2157, /* U+002157: VULGAR FRACTION THREE FIFTHS*/
- 0x2158, /* U+002158: VULGAR FRACTION FOUR FIFTHS*/
- 0x2159, /* U+002159: VULGAR FRACTION ONE SIXTH*/
- 0x215a, /* U+00215a: VULGAR FRACTION FIVE SIXTHS*/
- 0x215b, /* U+00215b: VULGAR FRACTION ONE EIGHTH*/
- 0x215c, /* U+00215c: VULGAR FRACTION THREE EIGHTHS*/
- 0x215d, /* U+00215d: VULGAR FRACTION FIVE EIGHTHS*/
- 0x215e, /* U+00215e: VULGAR FRACTION SEVEN EIGHTHS*/
- 0x215f, /* U+00215f: FRACTION NUMERATOR ONE*/
- 0x2170, /* U+002160: ROMAN NUMERAL ONE*/
- 0x2171, /* U+002161: ROMAN NUMERAL TWO*/
- 0x2172, /* U+002162: ROMAN NUMERAL THREE*/
- 0x2173, /* U+002163: ROMAN NUMERAL FOUR*/
- 0x2174, /* U+002164: ROMAN NUMERAL FIVE*/
- 0x2175, /* U+002165: ROMAN NUMERAL SIX*/
- 0x2176, /* U+002166: ROMAN NUMERAL SEVEN*/
- 0x2177, /* U+002167: ROMAN NUMERAL EIGHT*/
- 0x2178, /* U+002168: ROMAN NUMERAL NINE*/
- 0x2179, /* U+002169: ROMAN NUMERAL TEN*/
- 0x217a, /* U+00216a: ROMAN NUMERAL ELEVEN*/
- 0x217b, /* U+00216b: ROMAN NUMERAL TWELVE*/
- 0x217c, /* U+00216c: ROMAN NUMERAL FIFTY*/
- 0x217d, /* U+00216d: ROMAN NUMERAL ONE HUNDRED*/
- 0x217e, /* U+00216e: ROMAN NUMERAL FIVE HUNDRED*/
- 0x217f, /* U+00216f: ROMAN NUMERAL ONE THOUSAND*/
- 0x2170, /* U+002170: SMALL ROMAN NUMERAL ONE*/
- 0x2171, /* U+002171: SMALL ROMAN NUMERAL TWO*/
- 0x2172, /* U+002172: SMALL ROMAN NUMERAL THREE*/
- 0x2173, /* U+002173: SMALL ROMAN NUMERAL FOUR*/
- 0x2174, /* U+002174: SMALL ROMAN NUMERAL FIVE*/
- 0x2175, /* U+002175: SMALL ROMAN NUMERAL SIX*/
- 0x2176, /* U+002176: SMALL ROMAN NUMERAL SEVEN*/
- 0x2177, /* U+002177: SMALL ROMAN NUMERAL EIGHT*/
- 0x2178, /* U+002178: SMALL ROMAN NUMERAL NINE*/
- 0x2179, /* U+002179: SMALL ROMAN NUMERAL TEN*/
- 0x217a, /* U+00217a: SMALL ROMAN NUMERAL ELEVEN*/
- 0x217b, /* U+00217b: SMALL ROMAN NUMERAL TWELVE*/
- 0x217c, /* U+00217c: SMALL ROMAN NUMERAL FIFTY*/
- 0x217d, /* U+00217d: SMALL ROMAN NUMERAL ONE HUNDRED*/
- 0x217e, /* U+00217e: SMALL ROMAN NUMERAL FIVE HUNDRED*/
- 0x217f, /* U+00217f: SMALL ROMAN NUMERAL ONE THOUSAND*/
- 0x2180, /* U+002180: ROMAN NUMERAL ONE THOUSAND C D*/
- 0x2181, /* U+002181: ROMAN NUMERAL FIVE THOUSAND*/
- 0x2182, /* U+002182: ROMAN NUMERAL TEN THOUSAND*/
- 0x2183, /* U+002183: ROMAN NUMERAL REVERSED ONE HUNDRED*/
- 0x2184, /* U+002184: */
- 0x2185, /* U+002185: */
- 0x2186, /* U+002186: */
- 0x2187, /* U+002187: */
- 0x2188, /* U+002188: */
- 0x2189, /* U+002189: */
- 0x218a, /* U+00218a: */
- 0x218b, /* U+00218b: */
- 0x218c, /* U+00218c: */
- 0x218d, /* U+00218d: */
- 0x218e, /* U+00218e: */
- 0x218f, /* U+00218f: */
- 0x2190, /* U+002190: LEFTWARDS ARROW*/
- 0x2191, /* U+002191: UPWARDS ARROW*/
- 0x2192, /* U+002192: RIGHTWARDS ARROW*/
- 0x2193, /* U+002193: DOWNWARDS ARROW*/
- 0x2194, /* U+002194: LEFT RIGHT ARROW*/
- 0x2195, /* U+002195: UP DOWN ARROW*/
- 0x2196, /* U+002196: NORTH WEST ARROW*/
- 0x2197, /* U+002197: NORTH EAST ARROW*/
- 0x2198, /* U+002198: SOUTH EAST ARROW*/
- 0x2199, /* U+002199: SOUTH WEST ARROW*/
- 0x219a, /* U+00219a: LEFTWARDS ARROW WITH STROKE*/
- 0x219b, /* U+00219b: RIGHTWARDS ARROW WITH STROKE*/
- 0x219c, /* U+00219c: LEFTWARDS WAVE ARROW*/
- 0x219d, /* U+00219d: RIGHTWARDS WAVE ARROW*/
- 0x219e, /* U+00219e: LEFTWARDS TWO HEADED ARROW*/
- 0x219f, /* U+00219f: UPWARDS TWO HEADED ARROW*/
- 0x21a0, /* U+0021a0: RIGHTWARDS TWO HEADED ARROW*/
- 0x21a1, /* U+0021a1: DOWNWARDS TWO HEADED ARROW*/
- 0x21a2, /* U+0021a2: LEFTWARDS ARROW WITH TAIL*/
- 0x21a3, /* U+0021a3: RIGHTWARDS ARROW WITH TAIL*/
- 0x21a4, /* U+0021a4: LEFTWARDS ARROW FROM BAR*/
- 0x21a5, /* U+0021a5: UPWARDS ARROW FROM BAR*/
- 0x21a6, /* U+0021a6: RIGHTWARDS ARROW FROM BAR*/
- 0x21a7, /* U+0021a7: DOWNWARDS ARROW FROM BAR*/
- 0x21a8, /* U+0021a8: UP DOWN ARROW WITH BASE*/
- 0x21a9, /* U+0021a9: LEFTWARDS ARROW WITH HOOK*/
- 0x21aa, /* U+0021aa: RIGHTWARDS ARROW WITH HOOK*/
- 0x21ab, /* U+0021ab: LEFTWARDS ARROW WITH LOOP*/
- 0x21ac, /* U+0021ac: RIGHTWARDS ARROW WITH LOOP*/
- 0x21ad, /* U+0021ad: LEFT RIGHT WAVE ARROW*/
- 0x21ae, /* U+0021ae: LEFT RIGHT ARROW WITH STROKE*/
- 0x21af, /* U+0021af: DOWNWARDS ZIGZAG ARROW*/
- 0x21b0, /* U+0021b0: UPWARDS ARROW WITH TIP LEFTWARDS*/
- 0x21b1, /* U+0021b1: UPWARDS ARROW WITH TIP RIGHTWARDS*/
- 0x21b2, /* U+0021b2: DOWNWARDS ARROW WITH TIP LEFTWARDS*/
- 0x21b3, /* U+0021b3: DOWNWARDS ARROW WITH TIP RIGHTWARDS*/
- 0x21b4, /* U+0021b4: RIGHTWARDS ARROW WITH CORNER DOWNWARDS*/
- 0x21b5, /* U+0021b5: DOWNWARDS ARROW WITH CORNER LEFTWARDS*/
- 0x21b6, /* U+0021b6: ANTICLOCKWISE TOP SEMICIRCLE ARROW*/
- 0x21b7, /* U+0021b7: CLOCKWISE TOP SEMICIRCLE ARROW*/
- 0x21b8, /* U+0021b8: NORTH WEST ARROW TO LONG BAR*/
- 0x21b9, /* U+0021b9: LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR*/
- 0x21ba, /* U+0021ba: ANTICLOCKWISE OPEN CIRCLE ARROW*/
- 0x21bb, /* U+0021bb: CLOCKWISE OPEN CIRCLE ARROW*/
- 0x21bc, /* U+0021bc: LEFTWARDS HARPOON WITH BARB UPWARDS*/
- 0x21bd, /* U+0021bd: LEFTWARDS HARPOON WITH BARB DOWNWARDS*/
- 0x21be, /* U+0021be: UPWARDS HARPOON WITH BARB RIGHTWARDS*/
- 0x21bf, /* U+0021bf: UPWARDS HARPOON WITH BARB LEFTWARDS*/
- 0x21c0, /* U+0021c0: RIGHTWARDS HARPOON WITH BARB UPWARDS*/
- 0x21c1, /* U+0021c1: RIGHTWARDS HARPOON WITH BARB DOWNWARDS*/
- 0x21c2, /* U+0021c2: DOWNWARDS HARPOON WITH BARB RIGHTWARDS*/
- 0x21c3, /* U+0021c3: DOWNWARDS HARPOON WITH BARB LEFTWARDS*/
- 0x21c4, /* U+0021c4: RIGHTWARDS ARROW OVER LEFTWARDS ARROW*/
- 0x21c5, /* U+0021c5: UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW*/
- 0x21c6, /* U+0021c6: LEFTWARDS ARROW OVER RIGHTWARDS ARROW*/
- 0x21c7, /* U+0021c7: LEFTWARDS PAIRED ARROWS*/
- 0x21c8, /* U+0021c8: UPWARDS PAIRED ARROWS*/
- 0x21c9, /* U+0021c9: RIGHTWARDS PAIRED ARROWS*/
- 0x21ca, /* U+0021ca: DOWNWARDS PAIRED ARROWS*/
- 0x21cb, /* U+0021cb: LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON*/
- 0x21cc, /* U+0021cc: RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON*/
- 0x21cd, /* U+0021cd: LEFTWARDS DOUBLE ARROW WITH STROKE*/
- 0x21ce, /* U+0021ce: LEFT RIGHT DOUBLE ARROW WITH STROKE*/
- 0x21cf, /* U+0021cf: RIGHTWARDS DOUBLE ARROW WITH STROKE*/
- 0x21d0, /* U+0021d0: LEFTWARDS DOUBLE ARROW*/
- 0x21d1, /* U+0021d1: UPWARDS DOUBLE ARROW*/
- 0x21d2, /* U+0021d2: RIGHTWARDS DOUBLE ARROW*/
- 0x21d3, /* U+0021d3: DOWNWARDS DOUBLE ARROW*/
- 0x21d4, /* U+0021d4: LEFT RIGHT DOUBLE ARROW*/
- 0x21d5, /* U+0021d5: UP DOWN DOUBLE ARROW*/
- 0x21d6, /* U+0021d6: NORTH WEST DOUBLE ARROW*/
- 0x21d7, /* U+0021d7: NORTH EAST DOUBLE ARROW*/
- 0x21d8, /* U+0021d8: SOUTH EAST DOUBLE ARROW*/
- 0x21d9, /* U+0021d9: SOUTH WEST DOUBLE ARROW*/
- 0x21da, /* U+0021da: LEFTWARDS TRIPLE ARROW*/
- 0x21db, /* U+0021db: RIGHTWARDS TRIPLE ARROW*/
- 0x21dc, /* U+0021dc: LEFTWARDS SQUIGGLE ARROW*/
- 0x21dd, /* U+0021dd: RIGHTWARDS SQUIGGLE ARROW*/
- 0x21de, /* U+0021de: UPWARDS ARROW WITH DOUBLE STROKE*/
- 0x21df, /* U+0021df: DOWNWARDS ARROW WITH DOUBLE STROKE*/
- 0x21e0, /* U+0021e0: LEFTWARDS DASHED ARROW*/
- 0x21e1, /* U+0021e1: UPWARDS DASHED ARROW*/
- 0x21e2, /* U+0021e2: RIGHTWARDS DASHED ARROW*/
- 0x21e3, /* U+0021e3: DOWNWARDS DASHED ARROW*/
- 0x21e4, /* U+0021e4: LEFTWARDS ARROW TO BAR*/
- 0x21e5, /* U+0021e5: RIGHTWARDS ARROW TO BAR*/
- 0x21e6, /* U+0021e6: LEFTWARDS WHITE ARROW*/
- 0x21e7, /* U+0021e7: UPWARDS WHITE ARROW*/
- 0x21e8, /* U+0021e8: RIGHTWARDS WHITE ARROW*/
- 0x21e9, /* U+0021e9: DOWNWARDS WHITE ARROW*/
- 0x21ea, /* U+0021ea: UPWARDS WHITE ARROW FROM BAR*/
- 0x21eb, /* U+0021eb: UPWARDS WHITE ARROW ON PEDESTAL*/
- 0x21ec, /* U+0021ec: UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR*/
- 0x21ed, /* U+0021ed: UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR*/
- 0x21ee, /* U+0021ee: UPWARDS WHITE DOUBLE ARROW*/
- 0x21ef, /* U+0021ef: UPWARDS WHITE DOUBLE ARROW ON PEDESTAL*/
- 0x21f0, /* U+0021f0: RIGHTWARDS WHITE ARROW FROM WALL*/
- 0x21f1, /* U+0021f1: NORTH WEST ARROW TO CORNER*/
- 0x21f2, /* U+0021f2: SOUTH EAST ARROW TO CORNER*/
- 0x21f3, /* U+0021f3: UP DOWN WHITE ARROW*/
- 0x21f4, /* U+0021f4: RIGHT ARROW WITH SMALL CIRCLE*/
- 0x21f5, /* U+0021f5: DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW*/
- 0x21f6, /* U+0021f6: THREE RIGHTWARDS ARROWS*/
- 0x21f7, /* U+0021f7: LEFTWARDS ARROW WITH VERTICAL STROKE*/
- 0x21f8, /* U+0021f8: RIGHTWARDS ARROW WITH VERTICAL STROKE*/
- 0x21f9, /* U+0021f9: LEFT RIGHT ARROW WITH VERTICAL STROKE*/
- 0x21fa, /* U+0021fa: LEFTWARDS ARROW WITH DOUBLE VERTICAL STROKE*/
- 0x21fb, /* U+0021fb: RIGHTWARDS ARROW WITH DOUBLE VERTICAL STROKE*/
- 0x21fc, /* U+0021fc: LEFT RIGHT ARROW WITH DOUBLE VERTICAL STROKE*/
- 0x21fd, /* U+0021fd: LEFTWARDS OPEN-HEADED ARROW*/
- 0x21fe, /* U+0021fe: RIGHTWARDS OPEN-HEADED ARROW*/
- 0x21ff, /* U+0021ff: LEFT RIGHT OPEN-HEADED ARROW*/
- 0x2200, /* U+002200: FOR ALL*/
- 0x2201, /* U+002201: COMPLEMENT*/
- 0x2202, /* U+002202: PARTIAL DIFFERENTIAL*/
- 0x2203, /* U+002203: THERE EXISTS*/
- 0x2204, /* U+002204: THERE DOES NOT EXIST*/
- 0x2205, /* U+002205: EMPTY SET*/
- 0x2206, /* U+002206: INCREMENT*/
- 0x2207, /* U+002207: NABLA*/
- 0x2208, /* U+002208: ELEMENT OF*/
- 0x2209, /* U+002209: NOT AN ELEMENT OF*/
- 0x220a, /* U+00220a: SMALL ELEMENT OF*/
- 0x220b, /* U+00220b: CONTAINS AS MEMBER*/
- 0x220c, /* U+00220c: DOES NOT CONTAIN AS MEMBER*/
- 0x220d, /* U+00220d: SMALL CONTAINS AS MEMBER*/
- 0x220e, /* U+00220e: END OF PROOF*/
- 0x220f, /* U+00220f: N-ARY PRODUCT*/
- 0x2210, /* U+002210: N-ARY COPRODUCT*/
- 0x2211, /* U+002211: N-ARY SUMMATION*/
- 0x2212, /* U+002212: MINUS SIGN*/
- 0x2213, /* U+002213: MINUS-OR-PLUS SIGN*/
- 0x2214, /* U+002214: DOT PLUS*/
- 0x2215, /* U+002215: DIVISION SLASH*/
- 0x2216, /* U+002216: SET MINUS*/
- 0x2217, /* U+002217: ASTERISK OPERATOR*/
- 0x2218, /* U+002218: RING OPERATOR*/
- 0x2219, /* U+002219: BULLET OPERATOR*/
- 0x221a, /* U+00221a: SQUARE ROOT*/
- 0x221b, /* U+00221b: CUBE ROOT*/
- 0x221c, /* U+00221c: FOURTH ROOT*/
- 0x221d, /* U+00221d: PROPORTIONAL TO*/
- 0x221e, /* U+00221e: INFINITY*/
- 0x221f, /* U+00221f: RIGHT ANGLE*/
- 0x2220, /* U+002220: ANGLE*/
- 0x2221, /* U+002221: MEASURED ANGLE*/
- 0x2222, /* U+002222: SPHERICAL ANGLE*/
- 0x2223, /* U+002223: DIVIDES*/
- 0x2224, /* U+002224: DOES NOT DIVIDE*/
- 0x2225, /* U+002225: PARALLEL TO*/
- 0x2226, /* U+002226: NOT PARALLEL TO*/
- 0x2227, /* U+002227: LOGICAL AND*/
- 0x2228, /* U+002228: LOGICAL OR*/
- 0x2229, /* U+002229: INTERSECTION*/
- 0x222a, /* U+00222a: UNION*/
- 0x222b, /* U+00222b: INTEGRAL*/
- 0x222c, /* U+00222c: DOUBLE INTEGRAL*/
- 0x222d, /* U+00222d: TRIPLE INTEGRAL*/
- 0x222e, /* U+00222e: CONTOUR INTEGRAL*/
- 0x222f, /* U+00222f: SURFACE INTEGRAL*/
- 0x2230, /* U+002230: VOLUME INTEGRAL*/
- 0x2231, /* U+002231: CLOCKWISE INTEGRAL*/
- 0x2232, /* U+002232: CLOCKWISE CONTOUR INTEGRAL*/
- 0x2233, /* U+002233: ANTICLOCKWISE CONTOUR INTEGRAL*/
- 0x2234, /* U+002234: THEREFORE*/
- 0x2235, /* U+002235: BECAUSE*/
- 0x2236, /* U+002236: RATIO*/
- 0x2237, /* U+002237: PROPORTION*/
- 0x2238, /* U+002238: DOT MINUS*/
- 0x2239, /* U+002239: EXCESS*/
- 0x223a, /* U+00223a: GEOMETRIC PROPORTION*/
- 0x223b, /* U+00223b: HOMOTHETIC*/
- 0x223c, /* U+00223c: TILDE OPERATOR*/
- 0x223d, /* U+00223d: REVERSED TILDE*/
- 0x223e, /* U+00223e: INVERTED LAZY S*/
- 0x223f, /* U+00223f: SINE WAVE*/
- 0x2240, /* U+002240: WREATH PRODUCT*/
- 0x2241, /* U+002241: NOT TILDE*/
- 0x2242, /* U+002242: MINUS TILDE*/
- 0x2243, /* U+002243: ASYMPTOTICALLY EQUAL TO*/
- 0x2244, /* U+002244: NOT ASYMPTOTICALLY EQUAL TO*/
- 0x2245, /* U+002245: APPROXIMATELY EQUAL TO*/
- 0x2246, /* U+002246: APPROXIMATELY BUT NOT ACTUALLY EQUAL TO*/
- 0x2247, /* U+002247: NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO*/
- 0x2248, /* U+002248: ALMOST EQUAL TO*/
- 0x2249, /* U+002249: NOT ALMOST EQUAL TO*/
- 0x224a, /* U+00224a: ALMOST EQUAL OR EQUAL TO*/
- 0x224b, /* U+00224b: TRIPLE TILDE*/
- 0x224c, /* U+00224c: ALL EQUAL TO*/
- 0x224d, /* U+00224d: EQUIVALENT TO*/
- 0x224e, /* U+00224e: GEOMETRICALLY EQUIVALENT TO*/
- 0x224f, /* U+00224f: DIFFERENCE BETWEEN*/
- 0x2250, /* U+002250: APPROACHES THE LIMIT*/
- 0x2251, /* U+002251: GEOMETRICALLY EQUAL TO*/
- 0x2252, /* U+002252: APPROXIMATELY EQUAL TO OR THE IMAGE OF*/
- 0x2253, /* U+002253: IMAGE OF OR APPROXIMATELY EQUAL TO*/
- 0x2254, /* U+002254: COLON EQUALS*/
- 0x2255, /* U+002255: EQUALS COLON*/
- 0x2256, /* U+002256: RING IN EQUAL TO*/
- 0x2257, /* U+002257: RING EQUAL TO*/
- 0x2258, /* U+002258: CORRESPONDS TO*/
- 0x2259, /* U+002259: ESTIMATES*/
- 0x225a, /* U+00225a: EQUIANGULAR TO*/
- 0x225b, /* U+00225b: STAR EQUALS*/
- 0x225c, /* U+00225c: DELTA EQUAL TO*/
- 0x225d, /* U+00225d: EQUAL TO BY DEFINITION*/
- 0x225e, /* U+00225e: MEASURED BY*/
- 0x225f, /* U+00225f: QUESTIONED EQUAL TO*/
- 0x2260, /* U+002260: NOT EQUAL TO*/
- 0x2261, /* U+002261: IDENTICAL TO*/
- 0x2262, /* U+002262: NOT IDENTICAL TO*/
- 0x2263, /* U+002263: STRICTLY EQUIVALENT TO*/
- 0x2264, /* U+002264: LESS-THAN OR EQUAL TO*/
- 0x2265, /* U+002265: GREATER-THAN OR EQUAL TO*/
- 0x2266, /* U+002266: LESS-THAN OVER EQUAL TO*/
- 0x2267, /* U+002267: GREATER-THAN OVER EQUAL TO*/
- 0x2268, /* U+002268: LESS-THAN BUT NOT EQUAL TO*/
- 0x2269, /* U+002269: GREATER-THAN BUT NOT EQUAL TO*/
- 0x226a, /* U+00226a: MUCH LESS-THAN*/
- 0x226b, /* U+00226b: MUCH GREATER-THAN*/
- 0x226c, /* U+00226c: BETWEEN*/
- 0x226d, /* U+00226d: NOT EQUIVALENT TO*/
- 0x226e, /* U+00226e: NOT LESS-THAN*/
- 0x226f, /* U+00226f: NOT GREATER-THAN*/
- 0x2270, /* U+002270: NEITHER LESS-THAN NOR EQUAL TO*/
- 0x2271, /* U+002271: NEITHER GREATER-THAN NOR EQUAL TO*/
- 0x2272, /* U+002272: LESS-THAN OR EQUIVALENT TO*/
- 0x2273, /* U+002273: GREATER-THAN OR EQUIVALENT TO*/
- 0x2274, /* U+002274: NEITHER LESS-THAN NOR EQUIVALENT TO*/
- 0x2275, /* U+002275: NEITHER GREATER-THAN NOR EQUIVALENT TO*/
- 0x2276, /* U+002276: LESS-THAN OR GREATER-THAN*/
- 0x2277, /* U+002277: GREATER-THAN OR LESS-THAN*/
- 0x2278, /* U+002278: NEITHER LESS-THAN NOR GREATER-THAN*/
- 0x2279, /* U+002279: NEITHER GREATER-THAN NOR LESS-THAN*/
- 0x227a, /* U+00227a: PRECEDES*/
- 0x227b, /* U+00227b: SUCCEEDS*/
- 0x227c, /* U+00227c: PRECEDES OR EQUAL TO*/
- 0x227d, /* U+00227d: SUCCEEDS OR EQUAL TO*/
- 0x227e, /* U+00227e: PRECEDES OR EQUIVALENT TO*/
- 0x227f, /* U+00227f: SUCCEEDS OR EQUIVALENT TO*/
- 0x2280, /* U+002280: DOES NOT PRECEDE*/
- 0x2281, /* U+002281: DOES NOT SUCCEED*/
- 0x2282, /* U+002282: SUBSET OF*/
- 0x2283, /* U+002283: SUPERSET OF*/
- 0x2284, /* U+002284: NOT A SUBSET OF*/
- 0x2285, /* U+002285: NOT A SUPERSET OF*/
- 0x2286, /* U+002286: SUBSET OF OR EQUAL TO*/
- 0x2287, /* U+002287: SUPERSET OF OR EQUAL TO*/
- 0x2288, /* U+002288: NEITHER A SUBSET OF NOR EQUAL TO*/
- 0x2289, /* U+002289: NEITHER A SUPERSET OF NOR EQUAL TO*/
- 0x228a, /* U+00228a: SUBSET OF WITH NOT EQUAL TO*/
- 0x228b, /* U+00228b: SUPERSET OF WITH NOT EQUAL TO*/
- 0x228c, /* U+00228c: MULTISET*/
- 0x228d, /* U+00228d: MULTISET MULTIPLICATION*/
- 0x228e, /* U+00228e: MULTISET UNION*/
- 0x228f, /* U+00228f: SQUARE IMAGE OF*/
- 0x2290, /* U+002290: SQUARE ORIGINAL OF*/
- 0x2291, /* U+002291: SQUARE IMAGE OF OR EQUAL TO*/
- 0x2292, /* U+002292: SQUARE ORIGINAL OF OR EQUAL TO*/
- 0x2293, /* U+002293: SQUARE CAP*/
- 0x2294, /* U+002294: SQUARE CUP*/
- 0x2295, /* U+002295: CIRCLED PLUS*/
- 0x2296, /* U+002296: CIRCLED MINUS*/
- 0x2297, /* U+002297: CIRCLED TIMES*/
- 0x2298, /* U+002298: CIRCLED DIVISION SLASH*/
- 0x2299, /* U+002299: CIRCLED DOT OPERATOR*/
- 0x229a, /* U+00229a: CIRCLED RING OPERATOR*/
- 0x229b, /* U+00229b: CIRCLED ASTERISK OPERATOR*/
- 0x229c, /* U+00229c: CIRCLED EQUALS*/
- 0x229d, /* U+00229d: CIRCLED DASH*/
- 0x229e, /* U+00229e: SQUARED PLUS*/
- 0x229f, /* U+00229f: SQUARED MINUS*/
- 0x22a0, /* U+0022a0: SQUARED TIMES*/
- 0x22a1, /* U+0022a1: SQUARED DOT OPERATOR*/
- 0x22a2, /* U+0022a2: RIGHT TACK*/
- 0x22a3, /* U+0022a3: LEFT TACK*/
- 0x22a4, /* U+0022a4: DOWN TACK*/
- 0x22a5, /* U+0022a5: UP TACK*/
- 0x22a6, /* U+0022a6: ASSERTION*/
- 0x22a7, /* U+0022a7: MODELS*/
- 0x22a8, /* U+0022a8: TRUE*/
- 0x22a9, /* U+0022a9: FORCES*/
- 0x22aa, /* U+0022aa: TRIPLE VERTICAL BAR RIGHT TURNSTILE*/
- 0x22ab, /* U+0022ab: DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE*/
- 0x22ac, /* U+0022ac: DOES NOT PROVE*/
- 0x22ad, /* U+0022ad: NOT TRUE*/
- 0x22ae, /* U+0022ae: DOES NOT FORCE*/
- 0x22af, /* U+0022af: NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE*/
- 0x22b0, /* U+0022b0: PRECEDES UNDER RELATION*/
- 0x22b1, /* U+0022b1: SUCCEEDS UNDER RELATION*/
- 0x22b2, /* U+0022b2: NORMAL SUBGROUP OF*/
- 0x22b3, /* U+0022b3: CONTAINS AS NORMAL SUBGROUP*/
- 0x22b4, /* U+0022b4: NORMAL SUBGROUP OF OR EQUAL TO*/
- 0x22b5, /* U+0022b5: CONTAINS AS NORMAL SUBGROUP OR EQUAL TO*/
- 0x22b6, /* U+0022b6: ORIGINAL OF*/
- 0x22b7, /* U+0022b7: IMAGE OF*/
- 0x22b8, /* U+0022b8: MULTIMAP*/
- 0x22b9, /* U+0022b9: HERMITIAN CONJUGATE MATRIX*/
- 0x22ba, /* U+0022ba: INTERCALATE*/
- 0x22bb, /* U+0022bb: XOR*/
- 0x22bc, /* U+0022bc: NAND*/
- 0x22bd, /* U+0022bd: NOR*/
- 0x22be, /* U+0022be: RIGHT ANGLE WITH ARC*/
- 0x22bf, /* U+0022bf: RIGHT TRIANGLE*/
- 0x22c0, /* U+0022c0: N-ARY LOGICAL AND*/
- 0x22c1, /* U+0022c1: N-ARY LOGICAL OR*/
- 0x22c2, /* U+0022c2: N-ARY INTERSECTION*/
- 0x22c3, /* U+0022c3: N-ARY UNION*/
- 0x22c4, /* U+0022c4: DIAMOND OPERATOR*/
- 0x22c5, /* U+0022c5: DOT OPERATOR*/
- 0x22c6, /* U+0022c6: STAR OPERATOR*/
- 0x22c7, /* U+0022c7: DIVISION TIMES*/
- 0x22c8, /* U+0022c8: BOWTIE*/
- 0x22c9, /* U+0022c9: LEFT NORMAL FACTOR SEMIDIRECT PRODUCT*/
- 0x22ca, /* U+0022ca: RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT*/
- 0x22cb, /* U+0022cb: LEFT SEMIDIRECT PRODUCT*/
- 0x22cc, /* U+0022cc: RIGHT SEMIDIRECT PRODUCT*/
- 0x22cd, /* U+0022cd: REVERSED TILDE EQUALS*/
- 0x22ce, /* U+0022ce: CURLY LOGICAL OR*/
- 0x22cf, /* U+0022cf: CURLY LOGICAL AND*/
- 0x22d0, /* U+0022d0: DOUBLE SUBSET*/
- 0x22d1, /* U+0022d1: DOUBLE SUPERSET*/
- 0x22d2, /* U+0022d2: DOUBLE INTERSECTION*/
- 0x22d3, /* U+0022d3: DOUBLE UNION*/
- 0x22d4, /* U+0022d4: PITCHFORK*/
- 0x22d5, /* U+0022d5: EQUAL AND PARALLEL TO*/
- 0x22d6, /* U+0022d6: LESS-THAN WITH DOT*/
- 0x22d7, /* U+0022d7: GREATER-THAN WITH DOT*/
- 0x22d8, /* U+0022d8: VERY MUCH LESS-THAN*/
- 0x22d9, /* U+0022d9: VERY MUCH GREATER-THAN*/
- 0x22da, /* U+0022da: LESS-THAN EQUAL TO OR GREATER-THAN*/
- 0x22db, /* U+0022db: GREATER-THAN EQUAL TO OR LESS-THAN*/
- 0x22dc, /* U+0022dc: EQUAL TO OR LESS-THAN*/
- 0x22dd, /* U+0022dd: EQUAL TO OR GREATER-THAN*/
- 0x22de, /* U+0022de: EQUAL TO OR PRECEDES*/
- 0x22df, /* U+0022df: EQUAL TO OR SUCCEEDS*/
- 0x22e0, /* U+0022e0: DOES NOT PRECEDE OR EQUAL*/
- 0x22e1, /* U+0022e1: DOES NOT SUCCEED OR EQUAL*/
- 0x22e2, /* U+0022e2: NOT SQUARE IMAGE OF OR EQUAL TO*/
- 0x22e3, /* U+0022e3: NOT SQUARE ORIGINAL OF OR EQUAL TO*/
- 0x22e4, /* U+0022e4: SQUARE IMAGE OF OR NOT EQUAL TO*/
- 0x22e5, /* U+0022e5: SQUARE ORIGINAL OF OR NOT EQUAL TO*/
- 0x22e6, /* U+0022e6: LESS-THAN BUT NOT EQUIVALENT TO*/
- 0x22e7, /* U+0022e7: GREATER-THAN BUT NOT EQUIVALENT TO*/
- 0x22e8, /* U+0022e8: PRECEDES BUT NOT EQUIVALENT TO*/
- 0x22e9, /* U+0022e9: SUCCEEDS BUT NOT EQUIVALENT TO*/
- 0x22ea, /* U+0022ea: NOT NORMAL SUBGROUP OF*/
- 0x22eb, /* U+0022eb: DOES NOT CONTAIN AS NORMAL SUBGROUP*/
- 0x22ec, /* U+0022ec: NOT NORMAL SUBGROUP OF OR EQUAL TO*/
- 0x22ed, /* U+0022ed: DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL*/
- 0x22ee, /* U+0022ee: VERTICAL ELLIPSIS*/
- 0x22ef, /* U+0022ef: MIDLINE HORIZONTAL ELLIPSIS*/
- 0x22f0, /* U+0022f0: UP RIGHT DIAGONAL ELLIPSIS*/
- 0x22f1, /* U+0022f1: DOWN RIGHT DIAGONAL ELLIPSIS*/
- 0x22f2, /* U+0022f2: ELEMENT OF WITH LONG HORIZONTAL STROKE*/
- 0x22f3, /* U+0022f3: ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE*/
- 0x22f4, /* U+0022f4: SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE*/
- 0x22f5, /* U+0022f5: ELEMENT OF WITH DOT ABOVE*/
- 0x22f6, /* U+0022f6: ELEMENT OF WITH OVERBAR*/
- 0x22f7, /* U+0022f7: SMALL ELEMENT OF WITH OVERBAR*/
- 0x22f8, /* U+0022f8: ELEMENT OF WITH UNDERBAR*/
- 0x22f9, /* U+0022f9: ELEMENT OF WITH TWO HORIZONTAL STROKES*/
- 0x22fa, /* U+0022fa: CONTAINS WITH LONG HORIZONTAL STROKE*/
- 0x22fb, /* U+0022fb: CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE*/
- 0x22fc, /* U+0022fc: SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE*/
- 0x22fd, /* U+0022fd: CONTAINS WITH OVERBAR*/
- 0x22fe, /* U+0022fe: SMALL CONTAINS WITH OVERBAR*/
- 0x22ff, /* U+0022ff: Z NOTATION BAG MEMBERSHIP*/
- 0x2300, /* U+002300: DIAMETER SIGN*/
- 0x2301, /* U+002301: ELECTRIC ARROW*/
- 0x2302, /* U+002302: HOUSE*/
- 0x2303, /* U+002303: UP ARROWHEAD*/
- 0x2304, /* U+002304: DOWN ARROWHEAD*/
- 0x2305, /* U+002305: PROJECTIVE*/
- 0x2306, /* U+002306: PERSPECTIVE*/
- 0x2307, /* U+002307: WAVY LINE*/
- 0x2308, /* U+002308: LEFT CEILING*/
- 0x2309, /* U+002309: RIGHT CEILING*/
- 0x230a, /* U+00230a: LEFT FLOOR*/
- 0x230b, /* U+00230b: RIGHT FLOOR*/
- 0x230c, /* U+00230c: BOTTOM RIGHT CROP*/
- 0x230d, /* U+00230d: BOTTOM LEFT CROP*/
- 0x230e, /* U+00230e: TOP RIGHT CROP*/
- 0x230f, /* U+00230f: TOP LEFT CROP*/
- 0x2310, /* U+002310: REVERSED NOT SIGN*/
- 0x2311, /* U+002311: SQUARE LOZENGE*/
- 0x2312, /* U+002312: ARC*/
- 0x2313, /* U+002313: SEGMENT*/
- 0x2314, /* U+002314: SECTOR*/
- 0x2315, /* U+002315: TELEPHONE RECORDER*/
- 0x2316, /* U+002316: POSITION INDICATOR*/
- 0x2317, /* U+002317: VIEWDATA SQUARE*/
- 0x2318, /* U+002318: PLACE OF INTEREST SIGN*/
- 0x2319, /* U+002319: TURNED NOT SIGN*/
- 0x231a, /* U+00231a: WATCH*/
- 0x231b, /* U+00231b: HOURGLASS*/
- 0x231c, /* U+00231c: TOP LEFT CORNER*/
- 0x231d, /* U+00231d: TOP RIGHT CORNER*/
- 0x231e, /* U+00231e: BOTTOM LEFT CORNER*/
- 0x231f, /* U+00231f: BOTTOM RIGHT CORNER*/
- 0x2320, /* U+002320: TOP HALF INTEGRAL*/
- 0x2321, /* U+002321: BOTTOM HALF INTEGRAL*/
- 0x2322, /* U+002322: FROWN*/
- 0x2323, /* U+002323: SMILE*/
- 0x2324, /* U+002324: UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS*/
- 0x2325, /* U+002325: OPTION KEY*/
- 0x2326, /* U+002326: ERASE TO THE RIGHT*/
- 0x2327, /* U+002327: X IN A RECTANGLE BOX*/
- 0x2328, /* U+002328: KEYBOARD*/
- 0x2329, /* U+002329: LEFT-POINTING ANGLE BRACKET*/
- 0x232a, /* U+00232a: RIGHT-POINTING ANGLE BRACKET*/
- 0x232b, /* U+00232b: ERASE TO THE LEFT*/
- 0x232c, /* U+00232c: BENZENE RING*/
- 0x232d, /* U+00232d: CYLINDRICITY*/
- 0x232e, /* U+00232e: ALL AROUND-PROFILE*/
- 0x232f, /* U+00232f: SYMMETRY*/
- 0x2330, /* U+002330: TOTAL RUNOUT*/
- 0x2331, /* U+002331: DIMENSION ORIGIN*/
- 0x2332, /* U+002332: CONICAL TAPER*/
- 0x2333, /* U+002333: SLOPE*/
- 0x2334, /* U+002334: COUNTERBORE*/
- 0x2335, /* U+002335: COUNTERSINK*/
- 0x2336, /* U+002336: APL FUNCTIONAL SYMBOL I-BEAM*/
- 0x2337, /* U+002337: APL FUNCTIONAL SYMBOL SQUISH QUAD*/
- 0x2338, /* U+002338: APL FUNCTIONAL SYMBOL QUAD EQUAL*/
- 0x2339, /* U+002339: APL FUNCTIONAL SYMBOL QUAD DIVIDE*/
- 0x233a, /* U+00233a: APL FUNCTIONAL SYMBOL QUAD DIAMOND*/
- 0x233b, /* U+00233b: APL FUNCTIONAL SYMBOL QUAD JOT*/
- 0x233c, /* U+00233c: APL FUNCTIONAL SYMBOL QUAD CIRCLE*/
- 0x233d, /* U+00233d: APL FUNCTIONAL SYMBOL CIRCLE STILE*/
- 0x233e, /* U+00233e: APL FUNCTIONAL SYMBOL CIRCLE JOT*/
- 0x233f, /* U+00233f: APL FUNCTIONAL SYMBOL SLASH BAR*/
- 0x2340, /* U+002340: APL FUNCTIONAL SYMBOL BACKSLASH BAR*/
- 0x2341, /* U+002341: APL FUNCTIONAL SYMBOL QUAD SLASH*/
- 0x2342, /* U+002342: APL FUNCTIONAL SYMBOL QUAD BACKSLASH*/
- 0x2343, /* U+002343: APL FUNCTIONAL SYMBOL QUAD LESS-THAN*/
- 0x2344, /* U+002344: APL FUNCTIONAL SYMBOL QUAD GREATER-THAN*/
- 0x2345, /* U+002345: APL FUNCTIONAL SYMBOL LEFTWARDS VANE*/
- 0x2346, /* U+002346: APL FUNCTIONAL SYMBOL RIGHTWARDS VANE*/
- 0x2347, /* U+002347: APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW*/
- 0x2348, /* U+002348: APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW*/
- 0x2349, /* U+002349: APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH*/
- 0x234a, /* U+00234a: APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR*/
- 0x234b, /* U+00234b: APL FUNCTIONAL SYMBOL DELTA STILE*/
- 0x234c, /* U+00234c: APL FUNCTIONAL SYMBOL QUAD DOWN CARET*/
- 0x234d, /* U+00234d: APL FUNCTIONAL SYMBOL QUAD DELTA*/
- 0x234e, /* U+00234e: APL FUNCTIONAL SYMBOL DOWN TACK JOT*/
- 0x234f, /* U+00234f: APL FUNCTIONAL SYMBOL UPWARDS VANE*/
- 0x2350, /* U+002350: APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW*/
- 0x2351, /* U+002351: APL FUNCTIONAL SYMBOL UP TACK OVERBAR*/
- 0x2352, /* U+002352: APL FUNCTIONAL SYMBOL DEL STILE*/
- 0x2353, /* U+002353: APL FUNCTIONAL SYMBOL QUAD UP CARET*/
- 0x2354, /* U+002354: APL FUNCTIONAL SYMBOL QUAD DEL*/
- 0x2355, /* U+002355: APL FUNCTIONAL SYMBOL UP TACK JOT*/
- 0x2356, /* U+002356: APL FUNCTIONAL SYMBOL DOWNWARDS VANE*/
- 0x2357, /* U+002357: APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW*/
- 0x2358, /* U+002358: APL FUNCTIONAL SYMBOL QUOTE UNDERBAR*/
- 0x2359, /* U+002359: APL FUNCTIONAL SYMBOL DELTA UNDERBAR*/
- 0x235a, /* U+00235a: APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR*/
- 0x235b, /* U+00235b: APL FUNCTIONAL SYMBOL JOT UNDERBAR*/
- 0x235c, /* U+00235c: APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR*/
- 0x235d, /* U+00235d: APL FUNCTIONAL SYMBOL UP SHOE JOT*/
- 0x235e, /* U+00235e: APL FUNCTIONAL SYMBOL QUOTE QUAD*/
- 0x235f, /* U+00235f: APL FUNCTIONAL SYMBOL CIRCLE STAR*/
- 0x2360, /* U+002360: APL FUNCTIONAL SYMBOL QUAD COLON*/
- 0x2361, /* U+002361: APL FUNCTIONAL SYMBOL UP TACK DIAERESIS*/
- 0x2362, /* U+002362: APL FUNCTIONAL SYMBOL DEL DIAERESIS*/
- 0x2363, /* U+002363: APL FUNCTIONAL SYMBOL STAR DIAERESIS*/
- 0x2364, /* U+002364: APL FUNCTIONAL SYMBOL JOT DIAERESIS*/
- 0x2365, /* U+002365: APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS*/
- 0x2366, /* U+002366: APL FUNCTIONAL SYMBOL DOWN SHOE STILE*/
- 0x2367, /* U+002367: APL FUNCTIONAL SYMBOL LEFT SHOE STILE*/
- 0x2368, /* U+002368: APL FUNCTIONAL SYMBOL TILDE DIAERESIS*/
- 0x2369, /* U+002369: APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS*/
- 0x236a, /* U+00236a: APL FUNCTIONAL SYMBOL COMMA BAR*/
- 0x236b, /* U+00236b: APL FUNCTIONAL SYMBOL DEL TILDE*/
- 0x236c, /* U+00236c: APL FUNCTIONAL SYMBOL ZILDE*/
- 0x236d, /* U+00236d: APL FUNCTIONAL SYMBOL STILE TILDE*/
- 0x236e, /* U+00236e: APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR*/
- 0x236f, /* U+00236f: APL FUNCTIONAL SYMBOL QUAD NOT EQUAL*/
- 0x2370, /* U+002370: APL FUNCTIONAL SYMBOL QUAD QUESTION*/
- 0x2371, /* U+002371: APL FUNCTIONAL SYMBOL DOWN CARET TILDE*/
- 0x2372, /* U+002372: APL FUNCTIONAL SYMBOL UP CARET TILDE*/
- 0x2373, /* U+002373: APL FUNCTIONAL SYMBOL IOTA*/
- 0x2374, /* U+002374: APL FUNCTIONAL SYMBOL RHO*/
- 0x2375, /* U+002375: APL FUNCTIONAL SYMBOL OMEGA*/
- 0x2376, /* U+002376: APL FUNCTIONAL SYMBOL ALPHA UNDERBAR*/
- 0x2377, /* U+002377: APL FUNCTIONAL SYMBOL EPSILON UNDERBAR*/
- 0x2378, /* U+002378: APL FUNCTIONAL SYMBOL IOTA UNDERBAR*/
- 0x2379, /* U+002379: APL FUNCTIONAL SYMBOL OMEGA UNDERBAR*/
- 0x237a, /* U+00237a: APL FUNCTIONAL SYMBOL ALPHA*/
- 0x237b, /* U+00237b: NOT CHECK MARK*/
- 0x237c, /* U+00237c: RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW*/
- 0x237d, /* U+00237d: SHOULDERED OPEN BOX*/
- 0x237e, /* U+00237e: BELL SYMBOL*/
- 0x237f, /* U+00237f: VERTICAL LINE WITH MIDDLE DOT*/
- 0x2380, /* U+002380: INSERTION SYMBOL*/
- 0x2381, /* U+002381: CONTINUOUS UNDERLINE SYMBOL*/
- 0x2382, /* U+002382: DISCONTINUOUS UNDERLINE SYMBOL*/
- 0x2383, /* U+002383: EMPHASIS SYMBOL*/
- 0x2384, /* U+002384: COMPOSITION SYMBOL*/
- 0x2385, /* U+002385: WHITE SQUARE WITH CENTRE VERTICAL LINE*/
- 0x2386, /* U+002386: ENTER SYMBOL*/
- 0x2387, /* U+002387: ALTERNATIVE KEY SYMBOL*/
- 0x2388, /* U+002388: HELM SYMBOL*/
- 0x2389, /* U+002389: CIRCLED HORIZONTAL BAR WITH NOTCH*/
- 0x238a, /* U+00238a: CIRCLED TRIANGLE DOWN*/
- 0x238b, /* U+00238b: BROKEN CIRCLE WITH NORTHWEST ARROW*/
- 0x238c, /* U+00238c: UNDO SYMBOL*/
- 0x238d, /* U+00238d: MONOSTABLE SYMBOL*/
- 0x238e, /* U+00238e: HYSTERESIS SYMBOL*/
- 0x238f, /* U+00238f: OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL*/
- 0x2390, /* U+002390: OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL*/
- 0x2391, /* U+002391: PASSIVE-PULL-DOWN-OUTPUT SYMBOL*/
- 0x2392, /* U+002392: PASSIVE-PULL-UP-OUTPUT SYMBOL*/
- 0x2393, /* U+002393: DIRECT CURRENT SYMBOL FORM TWO*/
- 0x2394, /* U+002394: SOFTWARE-FUNCTION SYMBOL*/
- 0x2395, /* U+002395: APL FUNCTIONAL SYMBOL QUAD*/
- 0x2396, /* U+002396: DECIMAL SEPARATOR KEY SYMBOL*/
- 0x2397, /* U+002397: PREVIOUS PAGE*/
- 0x2398, /* U+002398: NEXT PAGE*/
- 0x2399, /* U+002399: PRINT SCREEN SYMBOL*/
- 0x239a, /* U+00239a: CLEAR SCREEN SYMBOL*/
- 0x239b, /* U+00239b: LEFT PARENTHESIS UPPER HOOK*/
- 0x239c, /* U+00239c: LEFT PARENTHESIS EXTENSION*/
- 0x239d, /* U+00239d: LEFT PARENTHESIS LOWER HOOK*/
- 0x239e, /* U+00239e: RIGHT PARENTHESIS UPPER HOOK*/
- 0x239f, /* U+00239f: RIGHT PARENTHESIS EXTENSION*/
- 0x23a0, /* U+0023a0: RIGHT PARENTHESIS LOWER HOOK*/
- 0x23a1, /* U+0023a1: LEFT SQUARE BRACKET UPPER CORNER*/
- 0x23a2, /* U+0023a2: LEFT SQUARE BRACKET EXTENSION*/
- 0x23a3, /* U+0023a3: LEFT SQUARE BRACKET LOWER CORNER*/
- 0x23a4, /* U+0023a4: RIGHT SQUARE BRACKET UPPER CORNER*/
- 0x23a5, /* U+0023a5: RIGHT SQUARE BRACKET EXTENSION*/
- 0x23a6, /* U+0023a6: RIGHT SQUARE BRACKET LOWER CORNER*/
- 0x23a7, /* U+0023a7: LEFT CURLY BRACKET UPPER HOOK*/
- 0x23a8, /* U+0023a8: LEFT CURLY BRACKET MIDDLE PIECE*/
- 0x23a9, /* U+0023a9: LEFT CURLY BRACKET LOWER HOOK*/
- 0x23aa, /* U+0023aa: CURLY BRACKET EXTENSION*/
- 0x23ab, /* U+0023ab: RIGHT CURLY BRACKET UPPER HOOK*/
- 0x23ac, /* U+0023ac: RIGHT CURLY BRACKET MIDDLE PIECE*/
- 0x23ad, /* U+0023ad: RIGHT CURLY BRACKET LOWER HOOK*/
- 0x23ae, /* U+0023ae: INTEGRAL EXTENSION*/
- 0x23af, /* U+0023af: HORIZONTAL LINE EXTENSION*/
- 0x23b0, /* U+0023b0: UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION*/
- 0x23b1, /* U+0023b1: UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION*/
- 0x23b2, /* U+0023b2: SUMMATION TOP*/
- 0x23b3, /* U+0023b3: SUMMATION BOTTOM*/
- 0x23b4, /* U+0023b4: TOP SQUARE BRACKET*/
- 0x23b5, /* U+0023b5: BOTTOM SQUARE BRACKET*/
- 0x23b6, /* U+0023b6: BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET*/
- 0x23b7, /* U+0023b7: RADICAL SYMBOL BOTTOM*/
- 0x23b8, /* U+0023b8: LEFT VERTICAL BOX LINE*/
- 0x23b9, /* U+0023b9: RIGHT VERTICAL BOX LINE*/
- 0x23ba, /* U+0023ba: HORIZONTAL SCAN LINE-1*/
- 0x23bb, /* U+0023bb: HORIZONTAL SCAN LINE-3*/
- 0x23bc, /* U+0023bc: HORIZONTAL SCAN LINE-7*/
- 0x23bd, /* U+0023bd: HORIZONTAL SCAN LINE-9*/
- 0x23be, /* U+0023be: DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT*/
- 0x23bf, /* U+0023bf: DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT*/
- 0x23c0, /* U+0023c0: DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE*/
- 0x23c1, /* U+0023c1: DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE*/
- 0x23c2, /* U+0023c2: DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE*/
- 0x23c3, /* U+0023c3: DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE*/
- 0x23c4, /* U+0023c4: DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE*/
- 0x23c5, /* U+0023c5: DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE*/
- 0x23c6, /* U+0023c6: DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE*/
- 0x23c7, /* U+0023c7: DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE*/
- 0x23c8, /* U+0023c8: DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE*/
- 0x23c9, /* U+0023c9: DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL*/
- 0x23ca, /* U+0023ca: DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL*/
- 0x23cb, /* U+0023cb: DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT*/
- 0x23cc, /* U+0023cc: DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT*/
- 0x23cd, /* U+0023cd: SQUARE FOOT*/
- 0x23ce, /* U+0023ce: RETURN SYMBOL*/
- 0x23cf, /* U+0023cf: EJECT SYMBOL*/
- 0x23d0, /* U+0023d0: VERTICAL LINE EXTENSION*/
- 0x23d1, /* U+0023d1: METRICAL BREVE*/
- 0x23d2, /* U+0023d2: METRICAL LONG OVER SHORT*/
- 0x23d3, /* U+0023d3: METRICAL SHORT OVER LONG*/
- 0x23d4, /* U+0023d4: METRICAL LONG OVER TWO SHORTS*/
- 0x23d5, /* U+0023d5: METRICAL TWO SHORTS OVER LONG*/
- 0x23d6, /* U+0023d6: METRICAL TWO SHORTS JOINED*/
- 0x23d7, /* U+0023d7: METRICAL TRISEME*/
- 0x23d8, /* U+0023d8: METRICAL TETRASEME*/
- 0x23d9, /* U+0023d9: METRICAL PENTASEME*/
- 0x23da, /* U+0023da: EARTH GROUND*/
- 0x23db, /* U+0023db: FUSE*/
- 0x23dc, /* U+0023dc: */
- 0x23dd, /* U+0023dd: */
- 0x23de, /* U+0023de: */
- 0x23df, /* U+0023df: */
- 0x23e0, /* U+0023e0: */
- 0x23e1, /* U+0023e1: */
- 0x23e2, /* U+0023e2: */
- 0x23e3, /* U+0023e3: */
- 0x23e4, /* U+0023e4: */
- 0x23e5, /* U+0023e5: */
- 0x23e6, /* U+0023e6: */
- 0x23e7, /* U+0023e7: */
- 0x23e8, /* U+0023e8: */
- 0x23e9, /* U+0023e9: */
- 0x23ea, /* U+0023ea: */
- 0x23eb, /* U+0023eb: */
- 0x23ec, /* U+0023ec: */
- 0x23ed, /* U+0023ed: */
- 0x23ee, /* U+0023ee: */
- 0x23ef, /* U+0023ef: */
- 0x23f0, /* U+0023f0: */
- 0x23f1, /* U+0023f1: */
- 0x23f2, /* U+0023f2: */
- 0x23f3, /* U+0023f3: */
- 0x23f4, /* U+0023f4: */
- 0x23f5, /* U+0023f5: */
- 0x23f6, /* U+0023f6: */
- 0x23f7, /* U+0023f7: */
- 0x23f8, /* U+0023f8: */
- 0x23f9, /* U+0023f9: */
- 0x23fa, /* U+0023fa: */
- 0x23fb, /* U+0023fb: */
- 0x23fc, /* U+0023fc: */
- 0x23fd, /* U+0023fd: */
- 0x23fe, /* U+0023fe: */
- 0x23ff, /* U+0023ff: */
- 0x2400, /* U+002400: SYMBOL FOR NULL*/
- 0x2401, /* U+002401: SYMBOL FOR START OF HEADING*/
- 0x2402, /* U+002402: SYMBOL FOR START OF TEXT*/
- 0x2403, /* U+002403: SYMBOL FOR END OF TEXT*/
- 0x2404, /* U+002404: SYMBOL FOR END OF TRANSMISSION*/
- 0x2405, /* U+002405: SYMBOL FOR ENQUIRY*/
- 0x2406, /* U+002406: SYMBOL FOR ACKNOWLEDGE*/
- 0x2407, /* U+002407: SYMBOL FOR BELL*/
- 0x2408, /* U+002408: SYMBOL FOR BACKSPACE*/
- 0x2409, /* U+002409: SYMBOL FOR HORIZONTAL TABULATION*/
- 0x240a, /* U+00240a: SYMBOL FOR LINE FEED*/
- 0x240b, /* U+00240b: SYMBOL FOR VERTICAL TABULATION*/
- 0x240c, /* U+00240c: SYMBOL FOR FORM FEED*/
- 0x240d, /* U+00240d: SYMBOL FOR CARRIAGE RETURN*/
- 0x240e, /* U+00240e: SYMBOL FOR SHIFT OUT*/
- 0x240f, /* U+00240f: SYMBOL FOR SHIFT IN*/
- 0x2410, /* U+002410: SYMBOL FOR DATA LINK ESCAPE*/
- 0x2411, /* U+002411: SYMBOL FOR DEVICE CONTROL ONE*/
- 0x2412, /* U+002412: SYMBOL FOR DEVICE CONTROL TWO*/
- 0x2413, /* U+002413: SYMBOL FOR DEVICE CONTROL THREE*/
- 0x2414, /* U+002414: SYMBOL FOR DEVICE CONTROL FOUR*/
- 0x2415, /* U+002415: SYMBOL FOR NEGATIVE ACKNOWLEDGE*/
- 0x2416, /* U+002416: SYMBOL FOR SYNCHRONOUS IDLE*/
- 0x2417, /* U+002417: SYMBOL FOR END OF TRANSMISSION BLOCK*/
- 0x2418, /* U+002418: SYMBOL FOR CANCEL*/
- 0x2419, /* U+002419: SYMBOL FOR END OF MEDIUM*/
- 0x241a, /* U+00241a: SYMBOL FOR SUBSTITUTE*/
- 0x241b, /* U+00241b: SYMBOL FOR ESCAPE*/
- 0x241c, /* U+00241c: SYMBOL FOR FILE SEPARATOR*/
- 0x241d, /* U+00241d: SYMBOL FOR GROUP SEPARATOR*/
- 0x241e, /* U+00241e: SYMBOL FOR RECORD SEPARATOR*/
- 0x241f, /* U+00241f: SYMBOL FOR UNIT SEPARATOR*/
- 0x2420, /* U+002420: SYMBOL FOR SPACE*/
- 0x2421, /* U+002421: SYMBOL FOR DELETE*/
- 0x2422, /* U+002422: BLANK SYMBOL*/
- 0x2423, /* U+002423: OPEN BOX*/
- 0x2424, /* U+002424: SYMBOL FOR NEWLINE*/
- 0x2425, /* U+002425: SYMBOL FOR DELETE FORM TWO*/
- 0x2426, /* U+002426: SYMBOL FOR SUBSTITUTE FORM TWO*/
- 0x2427, /* U+002427: */
- 0x2428, /* U+002428: */
- 0x2429, /* U+002429: */
- 0x242a, /* U+00242a: */
- 0x242b, /* U+00242b: */
- 0x242c, /* U+00242c: */
- 0x242d, /* U+00242d: */
- 0x242e, /* U+00242e: */
- 0x242f, /* U+00242f: */
- 0x2430, /* U+002430: */
- 0x2431, /* U+002431: */
- 0x2432, /* U+002432: */
- 0x2433, /* U+002433: */
- 0x2434, /* U+002434: */
- 0x2435, /* U+002435: */
- 0x2436, /* U+002436: */
- 0x2437, /* U+002437: */
- 0x2438, /* U+002438: */
- 0x2439, /* U+002439: */
- 0x243a, /* U+00243a: */
- 0x243b, /* U+00243b: */
- 0x243c, /* U+00243c: */
- 0x243d, /* U+00243d: */
- 0x243e, /* U+00243e: */
- 0x243f, /* U+00243f: */
- 0x2440, /* U+002440: OCR HOOK*/
- 0x2441, /* U+002441: OCR CHAIR*/
- 0x2442, /* U+002442: OCR FORK*/
- 0x2443, /* U+002443: OCR INVERTED FORK*/
- 0x2444, /* U+002444: OCR BELT BUCKLE*/
- 0x2445, /* U+002445: OCR BOW TIE*/
- 0x2446, /* U+002446: OCR BRANCH BANK IDENTIFICATION*/
- 0x2447, /* U+002447: OCR AMOUNT OF CHECK*/
- 0x2448, /* U+002448: OCR DASH*/
- 0x2449, /* U+002449: OCR CUSTOMER ACCOUNT NUMBER*/
- 0x244a, /* U+00244a: OCR DOUBLE BACKSLASH*/
- 0x244b, /* U+00244b: */
- 0x244c, /* U+00244c: */
- 0x244d, /* U+00244d: */
- 0x244e, /* U+00244e: */
- 0x244f, /* U+00244f: */
- 0x2450, /* U+002450: */
- 0x2451, /* U+002451: */
- 0x2452, /* U+002452: */
- 0x2453, /* U+002453: */
- 0x2454, /* U+002454: */
- 0x2455, /* U+002455: */
- 0x2456, /* U+002456: */
- 0x2457, /* U+002457: */
- 0x2458, /* U+002458: */
- 0x2459, /* U+002459: */
- 0x245a, /* U+00245a: */
- 0x245b, /* U+00245b: */
- 0x245c, /* U+00245c: */
- 0x245d, /* U+00245d: */
- 0x245e, /* U+00245e: */
- 0x245f, /* U+00245f: */
- 0x2460, /* U+002460: CIRCLED DIGIT ONE*/
- 0x2461, /* U+002461: CIRCLED DIGIT TWO*/
- 0x2462, /* U+002462: CIRCLED DIGIT THREE*/
- 0x2463, /* U+002463: CIRCLED DIGIT FOUR*/
- 0x2464, /* U+002464: CIRCLED DIGIT FIVE*/
- 0x2465, /* U+002465: CIRCLED DIGIT SIX*/
- 0x2466, /* U+002466: CIRCLED DIGIT SEVEN*/
- 0x2467, /* U+002467: CIRCLED DIGIT EIGHT*/
- 0x2468, /* U+002468: CIRCLED DIGIT NINE*/
- 0x2469, /* U+002469: CIRCLED NUMBER TEN*/
- 0x246a, /* U+00246a: CIRCLED NUMBER ELEVEN*/
- 0x246b, /* U+00246b: CIRCLED NUMBER TWELVE*/
- 0x246c, /* U+00246c: CIRCLED NUMBER THIRTEEN*/
- 0x246d, /* U+00246d: CIRCLED NUMBER FOURTEEN*/
- 0x246e, /* U+00246e: CIRCLED NUMBER FIFTEEN*/
- 0x246f, /* U+00246f: CIRCLED NUMBER SIXTEEN*/
- 0x2470, /* U+002470: CIRCLED NUMBER SEVENTEEN*/
- 0x2471, /* U+002471: CIRCLED NUMBER EIGHTEEN*/
- 0x2472, /* U+002472: CIRCLED NUMBER NINETEEN*/
- 0x2473, /* U+002473: CIRCLED NUMBER TWENTY*/
- 0x2474, /* U+002474: PARENTHESIZED DIGIT ONE*/
- 0x2475, /* U+002475: PARENTHESIZED DIGIT TWO*/
- 0x2476, /* U+002476: PARENTHESIZED DIGIT THREE*/
- 0x2477, /* U+002477: PARENTHESIZED DIGIT FOUR*/
- 0x2478, /* U+002478: PARENTHESIZED DIGIT FIVE*/
- 0x2479, /* U+002479: PARENTHESIZED DIGIT SIX*/
- 0x247a, /* U+00247a: PARENTHESIZED DIGIT SEVEN*/
- 0x247b, /* U+00247b: PARENTHESIZED DIGIT EIGHT*/
- 0x247c, /* U+00247c: PARENTHESIZED DIGIT NINE*/
- 0x247d, /* U+00247d: PARENTHESIZED NUMBER TEN*/
- 0x247e, /* U+00247e: PARENTHESIZED NUMBER ELEVEN*/
- 0x247f, /* U+00247f: PARENTHESIZED NUMBER TWELVE*/
- 0x2480, /* U+002480: PARENTHESIZED NUMBER THIRTEEN*/
- 0x2481, /* U+002481: PARENTHESIZED NUMBER FOURTEEN*/
- 0x2482, /* U+002482: PARENTHESIZED NUMBER FIFTEEN*/
- 0x2483, /* U+002483: PARENTHESIZED NUMBER SIXTEEN*/
- 0x2484, /* U+002484: PARENTHESIZED NUMBER SEVENTEEN*/
- 0x2485, /* U+002485: PARENTHESIZED NUMBER EIGHTEEN*/
- 0x2486, /* U+002486: PARENTHESIZED NUMBER NINETEEN*/
- 0x2487, /* U+002487: PARENTHESIZED NUMBER TWENTY*/
- 0x2488, /* U+002488: DIGIT ONE FULL STOP*/
- 0x2489, /* U+002489: DIGIT TWO FULL STOP*/
- 0x248a, /* U+00248a: DIGIT THREE FULL STOP*/
- 0x248b, /* U+00248b: DIGIT FOUR FULL STOP*/
- 0x248c, /* U+00248c: DIGIT FIVE FULL STOP*/
- 0x248d, /* U+00248d: DIGIT SIX FULL STOP*/
- 0x248e, /* U+00248e: DIGIT SEVEN FULL STOP*/
- 0x248f, /* U+00248f: DIGIT EIGHT FULL STOP*/
- 0x2490, /* U+002490: DIGIT NINE FULL STOP*/
- 0x2491, /* U+002491: NUMBER TEN FULL STOP*/
- 0x2492, /* U+002492: NUMBER ELEVEN FULL STOP*/
- 0x2493, /* U+002493: NUMBER TWELVE FULL STOP*/
- 0x2494, /* U+002494: NUMBER THIRTEEN FULL STOP*/
- 0x2495, /* U+002495: NUMBER FOURTEEN FULL STOP*/
- 0x2496, /* U+002496: NUMBER FIFTEEN FULL STOP*/
- 0x2497, /* U+002497: NUMBER SIXTEEN FULL STOP*/
- 0x2498, /* U+002498: NUMBER SEVENTEEN FULL STOP*/
- 0x2499, /* U+002499: NUMBER EIGHTEEN FULL STOP*/
- 0x249a, /* U+00249a: NUMBER NINETEEN FULL STOP*/
- 0x249b, /* U+00249b: NUMBER TWENTY FULL STOP*/
- 0x249c, /* U+00249c: PARENTHESIZED LATIN SMALL LETTER A*/
- 0x249d, /* U+00249d: PARENTHESIZED LATIN SMALL LETTER B*/
- 0x249e, /* U+00249e: PARENTHESIZED LATIN SMALL LETTER C*/
- 0x249f, /* U+00249f: PARENTHESIZED LATIN SMALL LETTER D*/
- 0x24a0, /* U+0024a0: PARENTHESIZED LATIN SMALL LETTER E*/
- 0x24a1, /* U+0024a1: PARENTHESIZED LATIN SMALL LETTER F*/
- 0x24a2, /* U+0024a2: PARENTHESIZED LATIN SMALL LETTER G*/
- 0x24a3, /* U+0024a3: PARENTHESIZED LATIN SMALL LETTER H*/
- 0x24a4, /* U+0024a4: PARENTHESIZED LATIN SMALL LETTER I*/
- 0x24a5, /* U+0024a5: PARENTHESIZED LATIN SMALL LETTER J*/
- 0x24a6, /* U+0024a6: PARENTHESIZED LATIN SMALL LETTER K*/
- 0x24a7, /* U+0024a7: PARENTHESIZED LATIN SMALL LETTER L*/
- 0x24a8, /* U+0024a8: PARENTHESIZED LATIN SMALL LETTER M*/
- 0x24a9, /* U+0024a9: PARENTHESIZED LATIN SMALL LETTER N*/
- 0x24aa, /* U+0024aa: PARENTHESIZED LATIN SMALL LETTER O*/
- 0x24ab, /* U+0024ab: PARENTHESIZED LATIN SMALL LETTER P*/
- 0x24ac, /* U+0024ac: PARENTHESIZED LATIN SMALL LETTER Q*/
- 0x24ad, /* U+0024ad: PARENTHESIZED LATIN SMALL LETTER R*/
- 0x24ae, /* U+0024ae: PARENTHESIZED LATIN SMALL LETTER S*/
- 0x24af, /* U+0024af: PARENTHESIZED LATIN SMALL LETTER T*/
- 0x24b0, /* U+0024b0: PARENTHESIZED LATIN SMALL LETTER U*/
- 0x24b1, /* U+0024b1: PARENTHESIZED LATIN SMALL LETTER V*/
- 0x24b2, /* U+0024b2: PARENTHESIZED LATIN SMALL LETTER W*/
- 0x24b3, /* U+0024b3: PARENTHESIZED LATIN SMALL LETTER X*/
- 0x24b4, /* U+0024b4: PARENTHESIZED LATIN SMALL LETTER Y*/
- 0x24b5, /* U+0024b5: PARENTHESIZED LATIN SMALL LETTER Z*/
- 0x24d0, /* U+0024b6: CIRCLED LATIN CAPITAL LETTER A*/
- 0x24d1, /* U+0024b7: CIRCLED LATIN CAPITAL LETTER B*/
- 0x24d2, /* U+0024b8: CIRCLED LATIN CAPITAL LETTER C*/
- 0x24d3, /* U+0024b9: CIRCLED LATIN CAPITAL LETTER D*/
- 0x24d4, /* U+0024ba: CIRCLED LATIN CAPITAL LETTER E*/
- 0x24d5, /* U+0024bb: CIRCLED LATIN CAPITAL LETTER F*/
- 0x24d6, /* U+0024bc: CIRCLED LATIN CAPITAL LETTER G*/
- 0x24d7, /* U+0024bd: CIRCLED LATIN CAPITAL LETTER H*/
- 0x24d8, /* U+0024be: CIRCLED LATIN CAPITAL LETTER I*/
- 0x24d9, /* U+0024bf: CIRCLED LATIN CAPITAL LETTER J*/
- 0x24da, /* U+0024c0: CIRCLED LATIN CAPITAL LETTER K*/
- 0x24db, /* U+0024c1: CIRCLED LATIN CAPITAL LETTER L*/
- 0x24dc, /* U+0024c2: CIRCLED LATIN CAPITAL LETTER M*/
- 0x24dd, /* U+0024c3: CIRCLED LATIN CAPITAL LETTER N*/
- 0x24de, /* U+0024c4: CIRCLED LATIN CAPITAL LETTER O*/
- 0x24df, /* U+0024c5: CIRCLED LATIN CAPITAL LETTER P*/
- 0x24e0, /* U+0024c6: CIRCLED LATIN CAPITAL LETTER Q*/
- 0x24e1, /* U+0024c7: CIRCLED LATIN CAPITAL LETTER R*/
- 0x24e2, /* U+0024c8: CIRCLED LATIN CAPITAL LETTER S*/
- 0x24e3, /* U+0024c9: CIRCLED LATIN CAPITAL LETTER T*/
- 0x24e4, /* U+0024ca: CIRCLED LATIN CAPITAL LETTER U*/
- 0x24e5, /* U+0024cb: CIRCLED LATIN CAPITAL LETTER V*/
- 0x24e6, /* U+0024cc: CIRCLED LATIN CAPITAL LETTER W*/
- 0x24e7, /* U+0024cd: CIRCLED LATIN CAPITAL LETTER X*/
- 0x24e8, /* U+0024ce: CIRCLED LATIN CAPITAL LETTER Y*/
- 0x24e9, /* U+0024cf: CIRCLED LATIN CAPITAL LETTER Z*/
-};
-
-static const RTUNICP g_afRTUniLower0x002c00[] =
-{
- 0x2c30, /* U+002c00: GLAGOLITIC CAPITAL LETTER AZU*/
- 0x2c31, /* U+002c01: GLAGOLITIC CAPITAL LETTER BUKY*/
- 0x2c32, /* U+002c02: GLAGOLITIC CAPITAL LETTER VEDE*/
- 0x2c33, /* U+002c03: GLAGOLITIC CAPITAL LETTER GLAGOLI*/
- 0x2c34, /* U+002c04: GLAGOLITIC CAPITAL LETTER DOBRO*/
- 0x2c35, /* U+002c05: GLAGOLITIC CAPITAL LETTER YESTU*/
- 0x2c36, /* U+002c06: GLAGOLITIC CAPITAL LETTER ZHIVETE*/
- 0x2c37, /* U+002c07: GLAGOLITIC CAPITAL LETTER DZELO*/
- 0x2c38, /* U+002c08: GLAGOLITIC CAPITAL LETTER ZEMLJA*/
- 0x2c39, /* U+002c09: GLAGOLITIC CAPITAL LETTER IZHE*/
- 0x2c3a, /* U+002c0a: GLAGOLITIC CAPITAL LETTER INITIAL IZHE*/
- 0x2c3b, /* U+002c0b: GLAGOLITIC CAPITAL LETTER I*/
- 0x2c3c, /* U+002c0c: GLAGOLITIC CAPITAL LETTER DJERVI*/
- 0x2c3d, /* U+002c0d: GLAGOLITIC CAPITAL LETTER KAKO*/
- 0x2c3e, /* U+002c0e: GLAGOLITIC CAPITAL LETTER LJUDIJE*/
- 0x2c3f, /* U+002c0f: GLAGOLITIC CAPITAL LETTER MYSLITE*/
- 0x2c40, /* U+002c10: GLAGOLITIC CAPITAL LETTER NASHI*/
- 0x2c41, /* U+002c11: GLAGOLITIC CAPITAL LETTER ONU*/
- 0x2c42, /* U+002c12: GLAGOLITIC CAPITAL LETTER POKOJI*/
- 0x2c43, /* U+002c13: GLAGOLITIC CAPITAL LETTER RITSI*/
- 0x2c44, /* U+002c14: GLAGOLITIC CAPITAL LETTER SLOVO*/
- 0x2c45, /* U+002c15: GLAGOLITIC CAPITAL LETTER TVRIDO*/
- 0x2c46, /* U+002c16: GLAGOLITIC CAPITAL LETTER UKU*/
- 0x2c47, /* U+002c17: GLAGOLITIC CAPITAL LETTER FRITU*/
- 0x2c48, /* U+002c18: GLAGOLITIC CAPITAL LETTER HERU*/
- 0x2c49, /* U+002c19: GLAGOLITIC CAPITAL LETTER OTU*/
- 0x2c4a, /* U+002c1a: GLAGOLITIC CAPITAL LETTER PE*/
- 0x2c4b, /* U+002c1b: GLAGOLITIC CAPITAL LETTER SHTA*/
- 0x2c4c, /* U+002c1c: GLAGOLITIC CAPITAL LETTER TSI*/
- 0x2c4d, /* U+002c1d: GLAGOLITIC CAPITAL LETTER CHRIVI*/
- 0x2c4e, /* U+002c1e: GLAGOLITIC CAPITAL LETTER SHA*/
- 0x2c4f, /* U+002c1f: GLAGOLITIC CAPITAL LETTER YERU*/
- 0x2c50, /* U+002c20: GLAGOLITIC CAPITAL LETTER YERI*/
- 0x2c51, /* U+002c21: GLAGOLITIC CAPITAL LETTER YATI*/
- 0x2c52, /* U+002c22: GLAGOLITIC CAPITAL LETTER SPIDERY HA*/
- 0x2c53, /* U+002c23: GLAGOLITIC CAPITAL LETTER YU*/
- 0x2c54, /* U+002c24: GLAGOLITIC CAPITAL LETTER SMALL YUS*/
- 0x2c55, /* U+002c25: GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL*/
- 0x2c56, /* U+002c26: GLAGOLITIC CAPITAL LETTER YO*/
- 0x2c57, /* U+002c27: GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS*/
- 0x2c58, /* U+002c28: GLAGOLITIC CAPITAL LETTER BIG YUS*/
- 0x2c59, /* U+002c29: GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS*/
- 0x2c5a, /* U+002c2a: GLAGOLITIC CAPITAL LETTER FITA*/
- 0x2c5b, /* U+002c2b: GLAGOLITIC CAPITAL LETTER IZHITSA*/
- 0x2c5c, /* U+002c2c: GLAGOLITIC CAPITAL LETTER SHTAPIC*/
- 0x2c5d, /* U+002c2d: GLAGOLITIC CAPITAL LETTER TROKUTASTI A*/
- 0x2c5e, /* U+002c2e: GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE*/
- 0x2c2f, /* U+002c2f: */
- 0x2c30, /* U+002c30: GLAGOLITIC SMALL LETTER AZU*/
- 0x2c31, /* U+002c31: GLAGOLITIC SMALL LETTER BUKY*/
- 0x2c32, /* U+002c32: GLAGOLITIC SMALL LETTER VEDE*/
- 0x2c33, /* U+002c33: GLAGOLITIC SMALL LETTER GLAGOLI*/
- 0x2c34, /* U+002c34: GLAGOLITIC SMALL LETTER DOBRO*/
- 0x2c35, /* U+002c35: GLAGOLITIC SMALL LETTER YESTU*/
- 0x2c36, /* U+002c36: GLAGOLITIC SMALL LETTER ZHIVETE*/
- 0x2c37, /* U+002c37: GLAGOLITIC SMALL LETTER DZELO*/
- 0x2c38, /* U+002c38: GLAGOLITIC SMALL LETTER ZEMLJA*/
- 0x2c39, /* U+002c39: GLAGOLITIC SMALL LETTER IZHE*/
- 0x2c3a, /* U+002c3a: GLAGOLITIC SMALL LETTER INITIAL IZHE*/
- 0x2c3b, /* U+002c3b: GLAGOLITIC SMALL LETTER I*/
- 0x2c3c, /* U+002c3c: GLAGOLITIC SMALL LETTER DJERVI*/
- 0x2c3d, /* U+002c3d: GLAGOLITIC SMALL LETTER KAKO*/
- 0x2c3e, /* U+002c3e: GLAGOLITIC SMALL LETTER LJUDIJE*/
- 0x2c3f, /* U+002c3f: GLAGOLITIC SMALL LETTER MYSLITE*/
- 0x2c40, /* U+002c40: GLAGOLITIC SMALL LETTER NASHI*/
- 0x2c41, /* U+002c41: GLAGOLITIC SMALL LETTER ONU*/
- 0x2c42, /* U+002c42: GLAGOLITIC SMALL LETTER POKOJI*/
- 0x2c43, /* U+002c43: GLAGOLITIC SMALL LETTER RITSI*/
- 0x2c44, /* U+002c44: GLAGOLITIC SMALL LETTER SLOVO*/
- 0x2c45, /* U+002c45: GLAGOLITIC SMALL LETTER TVRIDO*/
- 0x2c46, /* U+002c46: GLAGOLITIC SMALL LETTER UKU*/
- 0x2c47, /* U+002c47: GLAGOLITIC SMALL LETTER FRITU*/
- 0x2c48, /* U+002c48: GLAGOLITIC SMALL LETTER HERU*/
- 0x2c49, /* U+002c49: GLAGOLITIC SMALL LETTER OTU*/
- 0x2c4a, /* U+002c4a: GLAGOLITIC SMALL LETTER PE*/
- 0x2c4b, /* U+002c4b: GLAGOLITIC SMALL LETTER SHTA*/
- 0x2c4c, /* U+002c4c: GLAGOLITIC SMALL LETTER TSI*/
- 0x2c4d, /* U+002c4d: GLAGOLITIC SMALL LETTER CHRIVI*/
- 0x2c4e, /* U+002c4e: GLAGOLITIC SMALL LETTER SHA*/
- 0x2c4f, /* U+002c4f: GLAGOLITIC SMALL LETTER YERU*/
- 0x2c50, /* U+002c50: GLAGOLITIC SMALL LETTER YERI*/
- 0x2c51, /* U+002c51: GLAGOLITIC SMALL LETTER YATI*/
- 0x2c52, /* U+002c52: GLAGOLITIC SMALL LETTER SPIDERY HA*/
- 0x2c53, /* U+002c53: GLAGOLITIC SMALL LETTER YU*/
- 0x2c54, /* U+002c54: GLAGOLITIC SMALL LETTER SMALL YUS*/
- 0x2c55, /* U+002c55: GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL*/
- 0x2c56, /* U+002c56: GLAGOLITIC SMALL LETTER YO*/
- 0x2c57, /* U+002c57: GLAGOLITIC SMALL LETTER IOTATED SMALL YUS*/
- 0x2c58, /* U+002c58: GLAGOLITIC SMALL LETTER BIG YUS*/
- 0x2c59, /* U+002c59: GLAGOLITIC SMALL LETTER IOTATED BIG YUS*/
- 0x2c5a, /* U+002c5a: GLAGOLITIC SMALL LETTER FITA*/
- 0x2c5b, /* U+002c5b: GLAGOLITIC SMALL LETTER IZHITSA*/
- 0x2c5c, /* U+002c5c: GLAGOLITIC SMALL LETTER SHTAPIC*/
- 0x2c5d, /* U+002c5d: GLAGOLITIC SMALL LETTER TROKUTASTI A*/
- 0x2c5e, /* U+002c5e: GLAGOLITIC SMALL LETTER LATINATE MYSLITE*/
- 0x2c5f, /* U+002c5f: */
- 0x2c60, /* U+002c60: */
- 0x2c61, /* U+002c61: */
- 0x2c62, /* U+002c62: */
- 0x2c63, /* U+002c63: */
- 0x2c64, /* U+002c64: */
- 0x2c65, /* U+002c65: */
- 0x2c66, /* U+002c66: */
- 0x2c67, /* U+002c67: */
- 0x2c68, /* U+002c68: */
- 0x2c69, /* U+002c69: */
- 0x2c6a, /* U+002c6a: */
- 0x2c6b, /* U+002c6b: */
- 0x2c6c, /* U+002c6c: */
- 0x2c6d, /* U+002c6d: */
- 0x2c6e, /* U+002c6e: */
- 0x2c6f, /* U+002c6f: */
- 0x2c70, /* U+002c70: */
- 0x2c71, /* U+002c71: */
- 0x2c72, /* U+002c72: */
- 0x2c73, /* U+002c73: */
- 0x2c74, /* U+002c74: */
- 0x2c75, /* U+002c75: */
- 0x2c76, /* U+002c76: */
- 0x2c77, /* U+002c77: */
- 0x2c78, /* U+002c78: */
- 0x2c79, /* U+002c79: */
- 0x2c7a, /* U+002c7a: */
- 0x2c7b, /* U+002c7b: */
- 0x2c7c, /* U+002c7c: */
- 0x2c7d, /* U+002c7d: */
- 0x2c7e, /* U+002c7e: */
- 0x2c7f, /* U+002c7f: */
- 0x2c81, /* U+002c80: COPTIC CAPITAL LETTER ALFA*/
- 0x2c81, /* U+002c81: COPTIC SMALL LETTER ALFA*/
- 0x2c83, /* U+002c82: COPTIC CAPITAL LETTER VIDA*/
- 0x2c83, /* U+002c83: COPTIC SMALL LETTER VIDA*/
- 0x2c85, /* U+002c84: COPTIC CAPITAL LETTER GAMMA*/
- 0x2c85, /* U+002c85: COPTIC SMALL LETTER GAMMA*/
- 0x2c87, /* U+002c86: COPTIC CAPITAL LETTER DALDA*/
- 0x2c87, /* U+002c87: COPTIC SMALL LETTER DALDA*/
- 0x2c89, /* U+002c88: COPTIC CAPITAL LETTER EIE*/
- 0x2c89, /* U+002c89: COPTIC SMALL LETTER EIE*/
- 0x2c8b, /* U+002c8a: COPTIC CAPITAL LETTER SOU*/
- 0x2c8b, /* U+002c8b: COPTIC SMALL LETTER SOU*/
- 0x2c8d, /* U+002c8c: COPTIC CAPITAL LETTER ZATA*/
- 0x2c8d, /* U+002c8d: COPTIC SMALL LETTER ZATA*/
- 0x2c8f, /* U+002c8e: COPTIC CAPITAL LETTER HATE*/
- 0x2c8f, /* U+002c8f: COPTIC SMALL LETTER HATE*/
- 0x2c91, /* U+002c90: COPTIC CAPITAL LETTER THETHE*/
- 0x2c91, /* U+002c91: COPTIC SMALL LETTER THETHE*/
- 0x2c93, /* U+002c92: COPTIC CAPITAL LETTER IAUDA*/
- 0x2c93, /* U+002c93: COPTIC SMALL LETTER IAUDA*/
- 0x2c95, /* U+002c94: COPTIC CAPITAL LETTER KAPA*/
- 0x2c95, /* U+002c95: COPTIC SMALL LETTER KAPA*/
- 0x2c97, /* U+002c96: COPTIC CAPITAL LETTER LAULA*/
- 0x2c97, /* U+002c97: COPTIC SMALL LETTER LAULA*/
- 0x2c99, /* U+002c98: COPTIC CAPITAL LETTER MI*/
- 0x2c99, /* U+002c99: COPTIC SMALL LETTER MI*/
- 0x2c9b, /* U+002c9a: COPTIC CAPITAL LETTER NI*/
- 0x2c9b, /* U+002c9b: COPTIC SMALL LETTER NI*/
- 0x2c9d, /* U+002c9c: COPTIC CAPITAL LETTER KSI*/
- 0x2c9d, /* U+002c9d: COPTIC SMALL LETTER KSI*/
- 0x2c9f, /* U+002c9e: COPTIC CAPITAL LETTER O*/
- 0x2c9f, /* U+002c9f: COPTIC SMALL LETTER O*/
- 0x2ca1, /* U+002ca0: COPTIC CAPITAL LETTER PI*/
- 0x2ca1, /* U+002ca1: COPTIC SMALL LETTER PI*/
- 0x2ca3, /* U+002ca2: COPTIC CAPITAL LETTER RO*/
- 0x2ca3, /* U+002ca3: COPTIC SMALL LETTER RO*/
- 0x2ca5, /* U+002ca4: COPTIC CAPITAL LETTER SIMA*/
- 0x2ca5, /* U+002ca5: COPTIC SMALL LETTER SIMA*/
- 0x2ca7, /* U+002ca6: COPTIC CAPITAL LETTER TAU*/
- 0x2ca7, /* U+002ca7: COPTIC SMALL LETTER TAU*/
- 0x2ca9, /* U+002ca8: COPTIC CAPITAL LETTER UA*/
- 0x2ca9, /* U+002ca9: COPTIC SMALL LETTER UA*/
- 0x2cab, /* U+002caa: COPTIC CAPITAL LETTER FI*/
- 0x2cab, /* U+002cab: COPTIC SMALL LETTER FI*/
- 0x2cad, /* U+002cac: COPTIC CAPITAL LETTER KHI*/
- 0x2cad, /* U+002cad: COPTIC SMALL LETTER KHI*/
- 0x2caf, /* U+002cae: COPTIC CAPITAL LETTER PSI*/
- 0x2caf, /* U+002caf: COPTIC SMALL LETTER PSI*/
- 0x2cb1, /* U+002cb0: COPTIC CAPITAL LETTER OOU*/
- 0x2cb1, /* U+002cb1: COPTIC SMALL LETTER OOU*/
- 0x2cb3, /* U+002cb2: COPTIC CAPITAL LETTER DIALECT-P ALEF*/
- 0x2cb3, /* U+002cb3: COPTIC SMALL LETTER DIALECT-P ALEF*/
- 0x2cb5, /* U+002cb4: COPTIC CAPITAL LETTER OLD COPTIC AIN*/
- 0x2cb5, /* U+002cb5: COPTIC SMALL LETTER OLD COPTIC AIN*/
- 0x2cb7, /* U+002cb6: COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE*/
- 0x2cb7, /* U+002cb7: COPTIC SMALL LETTER CRYPTOGRAMMIC EIE*/
- 0x2cb9, /* U+002cb8: COPTIC CAPITAL LETTER DIALECT-P KAPA*/
- 0x2cb9, /* U+002cb9: COPTIC SMALL LETTER DIALECT-P KAPA*/
- 0x2cbb, /* U+002cba: COPTIC CAPITAL LETTER DIALECT-P NI*/
- 0x2cbb, /* U+002cbb: COPTIC SMALL LETTER DIALECT-P NI*/
- 0x2cbd, /* U+002cbc: COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI*/
- 0x2cbd, /* U+002cbd: COPTIC SMALL LETTER CRYPTOGRAMMIC NI*/
- 0x2cbf, /* U+002cbe: COPTIC CAPITAL LETTER OLD COPTIC OOU*/
- 0x2cbf, /* U+002cbf: COPTIC SMALL LETTER OLD COPTIC OOU*/
- 0x2cc1, /* U+002cc0: COPTIC CAPITAL LETTER SAMPI*/
- 0x2cc1, /* U+002cc1: COPTIC SMALL LETTER SAMPI*/
- 0x2cc3, /* U+002cc2: COPTIC CAPITAL LETTER CROSSED SHEI*/
- 0x2cc3, /* U+002cc3: COPTIC SMALL LETTER CROSSED SHEI*/
- 0x2cc5, /* U+002cc4: COPTIC CAPITAL LETTER OLD COPTIC SHEI*/
- 0x2cc5, /* U+002cc5: COPTIC SMALL LETTER OLD COPTIC SHEI*/
- 0x2cc7, /* U+002cc6: COPTIC CAPITAL LETTER OLD COPTIC ESH*/
- 0x2cc7, /* U+002cc7: COPTIC SMALL LETTER OLD COPTIC ESH*/
- 0x2cc9, /* U+002cc8: COPTIC CAPITAL LETTER AKHMIMIC KHEI*/
- 0x2cc9, /* U+002cc9: COPTIC SMALL LETTER AKHMIMIC KHEI*/
- 0x2ccb, /* U+002cca: COPTIC CAPITAL LETTER DIALECT-P HORI*/
- 0x2ccb, /* U+002ccb: COPTIC SMALL LETTER DIALECT-P HORI*/
- 0x2ccd, /* U+002ccc: COPTIC CAPITAL LETTER OLD COPTIC HORI*/
- 0x2ccd, /* U+002ccd: COPTIC SMALL LETTER OLD COPTIC HORI*/
- 0x2ccf, /* U+002cce: COPTIC CAPITAL LETTER OLD COPTIC HA*/
- 0x2ccf, /* U+002ccf: COPTIC SMALL LETTER OLD COPTIC HA*/
- 0x2cd1, /* U+002cd0: COPTIC CAPITAL LETTER L-SHAPED HA*/
- 0x2cd1, /* U+002cd1: COPTIC SMALL LETTER L-SHAPED HA*/
- 0x2cd3, /* U+002cd2: COPTIC CAPITAL LETTER OLD COPTIC HEI*/
- 0x2cd3, /* U+002cd3: COPTIC SMALL LETTER OLD COPTIC HEI*/
- 0x2cd5, /* U+002cd4: COPTIC CAPITAL LETTER OLD COPTIC HAT*/
- 0x2cd5, /* U+002cd5: COPTIC SMALL LETTER OLD COPTIC HAT*/
- 0x2cd7, /* U+002cd6: COPTIC CAPITAL LETTER OLD COPTIC GANGIA*/
- 0x2cd7, /* U+002cd7: COPTIC SMALL LETTER OLD COPTIC GANGIA*/
- 0x2cd9, /* U+002cd8: COPTIC CAPITAL LETTER OLD COPTIC DJA*/
- 0x2cd9, /* U+002cd9: COPTIC SMALL LETTER OLD COPTIC DJA*/
- 0x2cdb, /* U+002cda: COPTIC CAPITAL LETTER OLD COPTIC SHIMA*/
- 0x2cdb, /* U+002cdb: COPTIC SMALL LETTER OLD COPTIC SHIMA*/
- 0x2cdd, /* U+002cdc: COPTIC CAPITAL LETTER OLD NUBIAN SHIMA*/
- 0x2cdd, /* U+002cdd: COPTIC SMALL LETTER OLD NUBIAN SHIMA*/
- 0x2cdf, /* U+002cde: COPTIC CAPITAL LETTER OLD NUBIAN NGI*/
- 0x2cdf, /* U+002cdf: COPTIC SMALL LETTER OLD NUBIAN NGI*/
- 0x2ce1, /* U+002ce0: COPTIC CAPITAL LETTER OLD NUBIAN NYI*/
- 0x2ce1, /* U+002ce1: COPTIC SMALL LETTER OLD NUBIAN NYI*/
- 0x2ce3, /* U+002ce2: COPTIC CAPITAL LETTER OLD NUBIAN WAU*/
-};
-
-static const RTUNICP g_afRTUniLower0x00ff21[] =
-{
- 0xff41, /* U+00ff21: FULLWIDTH LATIN CAPITAL LETTER A*/
- 0xff42, /* U+00ff22: FULLWIDTH LATIN CAPITAL LETTER B*/
- 0xff43, /* U+00ff23: FULLWIDTH LATIN CAPITAL LETTER C*/
- 0xff44, /* U+00ff24: FULLWIDTH LATIN CAPITAL LETTER D*/
- 0xff45, /* U+00ff25: FULLWIDTH LATIN CAPITAL LETTER E*/
- 0xff46, /* U+00ff26: FULLWIDTH LATIN CAPITAL LETTER F*/
- 0xff47, /* U+00ff27: FULLWIDTH LATIN CAPITAL LETTER G*/
- 0xff48, /* U+00ff28: FULLWIDTH LATIN CAPITAL LETTER H*/
- 0xff49, /* U+00ff29: FULLWIDTH LATIN CAPITAL LETTER I*/
- 0xff4a, /* U+00ff2a: FULLWIDTH LATIN CAPITAL LETTER J*/
- 0xff4b, /* U+00ff2b: FULLWIDTH LATIN CAPITAL LETTER K*/
- 0xff4c, /* U+00ff2c: FULLWIDTH LATIN CAPITAL LETTER L*/
- 0xff4d, /* U+00ff2d: FULLWIDTH LATIN CAPITAL LETTER M*/
- 0xff4e, /* U+00ff2e: FULLWIDTH LATIN CAPITAL LETTER N*/
- 0xff4f, /* U+00ff2f: FULLWIDTH LATIN CAPITAL LETTER O*/
- 0xff50, /* U+00ff30: FULLWIDTH LATIN CAPITAL LETTER P*/
- 0xff51, /* U+00ff31: FULLWIDTH LATIN CAPITAL LETTER Q*/
- 0xff52, /* U+00ff32: FULLWIDTH LATIN CAPITAL LETTER R*/
- 0xff53, /* U+00ff33: FULLWIDTH LATIN CAPITAL LETTER S*/
- 0xff54, /* U+00ff34: FULLWIDTH LATIN CAPITAL LETTER T*/
- 0xff55, /* U+00ff35: FULLWIDTH LATIN CAPITAL LETTER U*/
- 0xff56, /* U+00ff36: FULLWIDTH LATIN CAPITAL LETTER V*/
- 0xff57, /* U+00ff37: FULLWIDTH LATIN CAPITAL LETTER W*/
- 0xff58, /* U+00ff38: FULLWIDTH LATIN CAPITAL LETTER X*/
- 0xff59, /* U+00ff39: FULLWIDTH LATIN CAPITAL LETTER Y*/
- 0xff5a, /* U+00ff3a: FULLWIDTH LATIN CAPITAL LETTER Z*/
-};
-
-static const RTUNICP g_afRTUniLower0x010400[] =
-{
- 0x10428, /* U+010400: DESERET CAPITAL LETTER LONG I*/
- 0x10429, /* U+010401: DESERET CAPITAL LETTER LONG E*/
- 0x1042a, /* U+010402: DESERET CAPITAL LETTER LONG A*/
- 0x1042b, /* U+010403: DESERET CAPITAL LETTER LONG AH*/
- 0x1042c, /* U+010404: DESERET CAPITAL LETTER LONG O*/
- 0x1042d, /* U+010405: DESERET CAPITAL LETTER LONG OO*/
- 0x1042e, /* U+010406: DESERET CAPITAL LETTER SHORT I*/
- 0x1042f, /* U+010407: DESERET CAPITAL LETTER SHORT E*/
- 0x10430, /* U+010408: DESERET CAPITAL LETTER SHORT A*/
- 0x10431, /* U+010409: DESERET CAPITAL LETTER SHORT AH*/
- 0x10432, /* U+01040a: DESERET CAPITAL LETTER SHORT O*/
- 0x10433, /* U+01040b: DESERET CAPITAL LETTER SHORT OO*/
- 0x10434, /* U+01040c: DESERET CAPITAL LETTER AY*/
- 0x10435, /* U+01040d: DESERET CAPITAL LETTER OW*/
- 0x10436, /* U+01040e: DESERET CAPITAL LETTER WU*/
- 0x10437, /* U+01040f: DESERET CAPITAL LETTER YEE*/
- 0x10438, /* U+010410: DESERET CAPITAL LETTER H*/
- 0x10439, /* U+010411: DESERET CAPITAL LETTER PEE*/
- 0x1043a, /* U+010412: DESERET CAPITAL LETTER BEE*/
- 0x1043b, /* U+010413: DESERET CAPITAL LETTER TEE*/
- 0x1043c, /* U+010414: DESERET CAPITAL LETTER DEE*/
- 0x1043d, /* U+010415: DESERET CAPITAL LETTER CHEE*/
- 0x1043e, /* U+010416: DESERET CAPITAL LETTER JEE*/
- 0x1043f, /* U+010417: DESERET CAPITAL LETTER KAY*/
- 0x10440, /* U+010418: DESERET CAPITAL LETTER GAY*/
- 0x10441, /* U+010419: DESERET CAPITAL LETTER EF*/
- 0x10442, /* U+01041a: DESERET CAPITAL LETTER VEE*/
- 0x10443, /* U+01041b: DESERET CAPITAL LETTER ETH*/
- 0x10444, /* U+01041c: DESERET CAPITAL LETTER THEE*/
- 0x10445, /* U+01041d: DESERET CAPITAL LETTER ES*/
- 0x10446, /* U+01041e: DESERET CAPITAL LETTER ZEE*/
- 0x10447, /* U+01041f: DESERET CAPITAL LETTER ESH*/
- 0x10448, /* U+010420: DESERET CAPITAL LETTER ZHEE*/
- 0x10449, /* U+010421: DESERET CAPITAL LETTER ER*/
- 0x1044a, /* U+010422: DESERET CAPITAL LETTER EL*/
- 0x1044b, /* U+010423: DESERET CAPITAL LETTER EM*/
- 0x1044c, /* U+010424: DESERET CAPITAL LETTER EN*/
- 0x1044d, /* U+010425: DESERET CAPITAL LETTER ENG*/
- 0x1044e, /* U+010426: DESERET CAPITAL LETTER OI*/
- 0x1044f, /* U+010427: DESERET CAPITAL LETTER EW*/
-};
-
-
-const RTUNICASERANGE g_aRTUniLowerRanges[] =
-{
- { 0x000000, 0x000557, &g_afRTUniLower0x000000[0] },
- { 0x0010a0, 0x0010c6, &g_afRTUniLower0x0010a0[0] },
- { 0x001e00, 0x0024d0, &g_afRTUniLower0x001e00[0] },
- { 0x002c00, 0x002ce3, &g_afRTUniLower0x002c00[0] },
- { 0x00ff21, 0x00ff3b, &g_afRTUniLower0x00ff21[0] },
- { 0x010400, 0x010428, &g_afRTUniLower0x010400[0] },
- { ~(RTUNICP)0, ~(RTUNICP)0, NULL }
-};
-
diff --git a/src/VBox/Runtime/common/string/uniread.cpp b/src/VBox/Runtime/common/string/uniread.cpp
index eafec504b05..f8e2a8fa0a1 100644
--- a/src/VBox/Runtime/common/string/uniread.cpp
+++ b/src/VBox/Runtime/common/string/uniread.cpp
@@ -34,17 +34,22 @@
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
+#ifdef _MSC_VER
+# include <direct.h>
+#else
+# include <unistd.h>
+#endif
/*******************************************************************************
* Global Variables *
*******************************************************************************/
-/** When set, no output is produced. Very useful when debugging ths code. */
-static bool g_fQuiet = false;
/** The file we're currently parsing. */
static const char *g_pszCurFile;
/** The current line number. */
static unsigned g_iLine;
+/** The current output file. */
+static FILE *g_pCurOutFile;
/**
@@ -883,6 +888,7 @@ static bool CalcFlags(struct CPINFO *pInfo, char *pszFlags)
AppendFlag(pszFlags, "RTUNI_LOWER");
//if (pInfo->???)
// AppendFlag(pszFlags, "RTUNI_BSPACE");
+#if 0
if (pInfo->fInvNFD_QC != 0 || pInfo->fInvNFC_QC != 0)
{
AppendFlag(pszFlags, "RTUNI_QC_NFX");
@@ -893,6 +899,7 @@ static bool CalcFlags(struct CPINFO *pInfo, char *pszFlags)
}
else if (pInfo->paDecompositionMapping && !*pInfo->pszDecompositionType)
fprintf(stderr, "uniread: U+%05X is not QC_NFX but has canonical mappings.\n", pInfo->CodePoint);
+#endif
if (!*pszFlags)
{
@@ -905,6 +912,43 @@ static bool CalcFlags(struct CPINFO *pInfo, char *pszFlags)
/**
+ * Closes the primary output stream.
+ */
+static int Stream1Close(void)
+{
+ if (g_pCurOutFile && g_pCurOutFile != stdout && g_pCurOutFile != stderr)
+ {
+ if (fclose(g_pCurOutFile) != 0)
+ {
+ fprintf(stderr, "Error closing output file.\n");
+ return -1;
+ }
+ }
+ g_pCurOutFile = NULL;
+ return 0;
+}
+
+
+/**
+ * Initializes the 1st stream to output to a given file.
+ */
+static int Stream1Init(const char *pszName)
+{
+ int rc = Stream1Close();
+ if (!rc)
+ {
+ g_pCurOutFile = fopen(pszName, "w");
+ if (!g_pCurOutFile)
+ {
+ fprintf(stderr, "Error opening output file '%s'.\n", pszName);
+ rc = -1;
+ }
+ }
+ return rc;
+}
+
+
+/**
* printf wrapper for the primary output stream.
*
* @returns See vfprintf.
@@ -916,10 +960,7 @@ static int Stream1Printf(const char *pszFormat, ...)
int cch;
va_list va;
va_start(va, pszFormat);
- if (!g_fQuiet)
- cch = vfprintf(stdout, pszFormat, va);
- else
- cch = (int)strlen(pszFormat);
+ cch = vfprintf(g_pCurOutFile, pszFormat, va);
va_end(va);
return cch;
}
@@ -973,17 +1014,30 @@ static int Stream2Printf(const char *pszFormat, ...)
/**
* Print the unidata.cpp file header and include list.
*/
-int PrintHeader(const char *argv0)
+int PrintHeader(const char *argv0, const char *pszBaseDir)
{
- Stream1Printf("/** @file\n"
- " *\n"
+ char szBuf[1024];
+ if (!pszBaseDir)
+ {
+ memset(szBuf, 0, sizeof(szBuf));
+#ifdef _MSC_VER
+ _getcwd(szBuf, sizeof(szBuf));
+#else
+ getcwd(szBuf, sizeof(szBuf));
+#endif
+ pszBaseDir = szBuf;
+ }
+
+ Stream1Printf("/* $" "Id" "$ */\n"
+ "/** @file\n"
" * IPRT - Unicode Tables.\n"
" *\n"
- " * Automatically Generated by %s (" __DATE__ " " __TIME__ ")\n"
+ " * Automatically Generated from %s\n"
+ " * by %s (" __DATE__ " " __TIME__ ")\n"
" */\n"
"\n"
"/*\n"
- " * Copyright (C) 2006-2010 Oracle Corporation\n"
+ " * Copyright (C) 2006-2014 Oracle Corporation\n"
" *\n"
" * This file is part of VirtualBox Open Source Edition (OSE), as\n"
" * available from http://www.virtualbox.org. This file is free software;\n"
@@ -1005,7 +1059,7 @@ int PrintHeader(const char *argv0)
"\n"
"#include <iprt/uni.h>\n"
"\n",
- argv0);
+ pszBaseDir, argv0);
return 0;
}
@@ -1019,7 +1073,7 @@ int PrintFlags(void)
* Print flags table.
*/
Stream2Init();
- Stream2Printf("const RTUNIFLAGSRANGE g_aRTUniFlagsRanges[] =\n"
+ Stream2Printf("RT_DECL_DATA_CONST(const RTUNIFLAGSRANGE) g_aRTUniFlagsRanges[] =\n"
"{\n");
RTUNICP i = 0;
int iStart = -1;
@@ -1046,7 +1100,7 @@ int PrintFlags(void)
{
if (iStart < 0)
{
- Stream1Printf("static const uint8_t g_afRTUniFlags0x%06x[] = \n"
+ Stream1Printf("static const uint8_t g_afRTUniFlags0x%06x[] =\n"
"{\n", i);
iStart = i;
}
@@ -1068,7 +1122,7 @@ int PrintFlags(void)
static int PrintUpper(void)
{
Stream2Init();
- Stream2Printf("const RTUNICASERANGE g_aRTUniUpperRanges[] =\n"
+ Stream2Printf("RT_DECL_DATA_CONST(const RTUNICASERANGE) g_aRTUniUpperRanges[] =\n"
"{\n");
RTUNICP i = 0;
int iStart = -1;
@@ -1094,7 +1148,7 @@ static int PrintUpper(void)
{
if (iStart < 0)
{
- Stream1Printf("static const RTUNICP g_afRTUniUpper0x%06x[] = \n"
+ Stream1Printf("static const RTUNICP g_afRTUniUpper0x%06x[] =\n"
"{\n", i);
iStart = i;
}
@@ -1115,7 +1169,7 @@ static int PrintUpper(void)
static int PrintLower(void)
{
Stream2Init();
- Stream2Printf("const RTUNICASERANGE g_aRTUniLowerRanges[] =\n"
+ Stream2Printf("RT_DECL_DATA_CONST(const RTUNICASERANGE) g_aRTUniLowerRanges[] =\n"
"{\n");
RTUNICP i = 0;
int iStart = -1;
@@ -1141,7 +1195,7 @@ static int PrintLower(void)
{
if (iStart < 0)
{
- Stream1Printf("static const RTUNICP g_afRTUniLower0x%06x[] = \n"
+ Stream1Printf("static const RTUNICP g_afRTUniLower0x%06x[] =\n"
"{\n", i);
iStart = i;
}
@@ -1201,9 +1255,6 @@ int main(int argc, char **argv)
argi++;
pszBaseDir = argv[argi];
}
- else if ( !strcmp(argv[argi], "-q")
- || !strcmp(argv[argi], "--quiet"))
- g_fQuiet = true;
else
{
fprintf(stderr, "uniread: syntax error at '%s': Unknown argument\n", argv[argi]);
@@ -1231,24 +1282,29 @@ int main(int argc, char **argv)
return rc;
/*
- * Print stuff.
+ * Produce output files.
*/
- rc = PrintHeader(argv[0]);
- if (rc)
- return rc;
- rc = PrintFlags();
- if (rc)
- return rc;
- rc = PrintUpper();
- if (rc)
- return rc;
- rc = PrintLower();
- if (rc)
- return rc;
+ rc = Stream1Init("unidata-flags.cpp");
+ if (!rc)
+ rc = PrintHeader(argv[0], pszBaseDir);
+ if (!rc)
+ rc = PrintFlags();
+
+ rc = Stream1Init("unidata-upper.cpp");
+ if (!rc)
+ rc = PrintHeader(argv[0], pszBaseDir);
+ if (!rc)
+ rc = PrintUpper();
+
+ rc = Stream1Init("unidata-lower.cpp");
+ if (!rc)
+ rc = PrintHeader(argv[0], pszBaseDir);
+ if (!rc)
+ rc = PrintLower();
+ if (!rc)
+ rc = Stream1Close();
/* done */
- fflush(stdout);
-
return rc;
}
diff --git a/src/VBox/Runtime/common/string/utf-16-case.cpp b/src/VBox/Runtime/common/string/utf-16-case.cpp
new file mode 100644
index 00000000000..db141b79aa6
--- /dev/null
+++ b/src/VBox/Runtime/common/string/utf-16-case.cpp
@@ -0,0 +1,178 @@
+/* $Id$ */
+/** @file
+ * IPRT - UTF-16, Case Sensitivity.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include <iprt/string.h>
+#include "internal/iprt.h"
+
+#include <iprt/uni.h>
+#include <iprt/alloc.h>
+#include <iprt/assert.h>
+#include <iprt/err.h>
+#include "internal/string.h"
+
+
+RTDECL(int) RTUtf16ICmp(register PCRTUTF16 pwsz1, register PCRTUTF16 pwsz2)
+{
+ if (pwsz1 == pwsz2)
+ return 0;
+ if (!pwsz1)
+ return -1;
+ if (!pwsz2)
+ return 1;
+
+ PCRTUTF16 pwsz1Start = pwsz1; /* keep it around in case we have to backtrack on a surrogate pair */
+ for (;;)
+ {
+ register RTUTF16 wc1 = *pwsz1;
+ register RTUTF16 wc2 = *pwsz2;
+ register int iDiff = wc1 - wc2;
+ if (iDiff)
+ {
+ /* unless they are *both* surrogate pairs, there is no chance they'll be identical. */
+ if ( wc1 < 0xd800
+ || wc2 < 0xd800
+ || wc1 > 0xdfff
+ || wc2 > 0xdfff)
+ {
+ /* simple UCS-2 char */
+ iDiff = RTUniCpToUpper(wc1) - RTUniCpToUpper(wc2);
+ if (iDiff)
+ iDiff = RTUniCpToLower(wc1) - RTUniCpToLower(wc2);
+ }
+ else
+ {
+ /* a damned pair */
+ RTUNICP uc1;
+ RTUNICP uc2;
+ if (wc1 >= 0xdc00)
+ {
+ if (pwsz1Start == pwsz1)
+ return iDiff;
+ uc1 = pwsz1[-1];
+ if (uc1 < 0xd800 || uc1 >= 0xdc00)
+ return iDiff;
+ uc1 = 0x10000 + (((uc1 & 0x3ff) << 10) | (wc1 & 0x3ff));
+ uc2 = 0x10000 + (((pwsz2[-1] & 0x3ff) << 10) | (wc2 & 0x3ff));
+ }
+ else
+ {
+ uc1 = *++pwsz1;
+ if (uc1 < 0xdc00 || uc1 >= 0xe000)
+ return iDiff;
+ uc1 = 0x10000 + (((wc1 & 0x3ff) << 10) | (uc1 & 0x3ff));
+ uc2 = 0x10000 + (((wc2 & 0x3ff) << 10) | (*++pwsz2 & 0x3ff));
+ }
+ iDiff = RTUniCpToUpper(uc1) - RTUniCpToUpper(uc2);
+ if (iDiff)
+ iDiff = RTUniCpToLower(uc1) - RTUniCpToLower(uc2); /* serious paranoia! */
+ }
+ if (iDiff)
+ return iDiff;
+ }
+ if (!wc1)
+ return 0;
+ pwsz1++;
+ pwsz2++;
+ }
+}
+RT_EXPORT_SYMBOL(RTUtf16ICmp);
+
+
+RTDECL(PRTUTF16) RTUtf16ToLower(PRTUTF16 pwsz)
+{
+ PRTUTF16 pwc = pwsz;
+ for (;;)
+ {
+ RTUTF16 wc = *pwc;
+ if (!wc)
+ break;
+ if (wc < 0xd800 || wc >= 0xdc00)
+ {
+ RTUNICP ucFolded = RTUniCpToLower(wc);
+ if (ucFolded < 0x10000)
+ *pwc++ = RTUniCpToLower(wc);
+ }
+ else
+ {
+ /* surrogate */
+ RTUTF16 wc2 = pwc[1];
+ if (wc2 >= 0xdc00 && wc2 <= 0xdfff)
+ {
+ RTUNICP uc = 0x10000 + (((wc & 0x3ff) << 10) | (wc2 & 0x3ff));
+ RTUNICP ucFolded = RTUniCpToLower(uc);
+ if (uc != ucFolded && ucFolded >= 0x10000) /* we don't support shrinking the string */
+ {
+ uc -= 0x10000;
+ *pwc++ = 0xd800 | (uc >> 10);
+ *pwc++ = 0xdc00 | (uc & 0x3ff);
+ }
+ }
+ else /* invalid encoding. */
+ pwc++;
+ }
+ }
+ return pwsz;
+}
+RT_EXPORT_SYMBOL(RTUtf16ToLower);
+
+
+RTDECL(PRTUTF16) RTUtf16ToUpper(PRTUTF16 pwsz)
+{
+ PRTUTF16 pwc = pwsz;
+ for (;;)
+ {
+ RTUTF16 wc = *pwc;
+ if (!wc)
+ break;
+ if (wc < 0xd800 || wc >= 0xdc00)
+ *pwc++ = RTUniCpToUpper(wc);
+ else
+ {
+ /* surrogate */
+ RTUTF16 wc2 = pwc[1];
+ if (wc2 >= 0xdc00 && wc2 <= 0xdfff)
+ {
+ RTUNICP uc = 0x10000 + (((wc & 0x3ff) << 10) | (wc2 & 0x3ff));
+ RTUNICP ucFolded = RTUniCpToUpper(uc);
+ if (uc != ucFolded && ucFolded >= 0x10000) /* we don't support shrinking the string */
+ {
+ uc -= 0x10000;
+ *pwc++ = 0xd800 | (uc >> 10);
+ *pwc++ = 0xdc00 | (uc & 0x3ff);
+ }
+ }
+ else /* invalid encoding. */
+ pwc++;
+ }
+ }
+ return pwsz;
+}
+RT_EXPORT_SYMBOL(RTUtf16ToUpper);
+
diff --git a/src/VBox/Runtime/common/string/utf-16-latin-1.cpp b/src/VBox/Runtime/common/string/utf-16-latin-1.cpp
new file mode 100644
index 00000000000..443fa6bf42a
--- /dev/null
+++ b/src/VBox/Runtime/common/string/utf-16-latin-1.cpp
@@ -0,0 +1,479 @@
+/* $Id$ */
+/** @file
+ * IPRT - Latin-1 and UTF-16.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include <iprt/string.h>
+#include "internal/iprt.h"
+
+#include <iprt/uni.h>
+#include <iprt/alloc.h>
+#include <iprt/assert.h>
+#include <iprt/err.h>
+#include "internal/string.h"
+
+
+/**
+ * Validate the UTF-16 encoding and calculates the length of a Latin1 encoding.
+ *
+ * @returns iprt status code.
+ * @param pwsz The UTF-16 string.
+ * @param cwc The max length of the UTF-16 string to consider.
+ * @param pcch Where to store the length (excluding '\\0') of the Latin1 string. (cch == cb, btw)
+ */
+static int rtUtf16CalcLatin1Length(PCRTUTF16 pwsz, size_t cwc, size_t *pcch)
+{
+ int rc = VINF_SUCCESS;
+ size_t cch = 0;
+ while (cwc > 0)
+ {
+ RTUTF16 wc = *pwsz++; cwc--;
+ if (!wc)
+ break;
+ else if (RT_LIKELY(wc < 0x100))
+ ++cch;
+ else
+ {
+ if (wc < 0xd800 || wc > 0xdfff)
+ {
+ if (wc >= 0xfffe)
+ {
+ RTStrAssertMsgFailed(("endian indicator! wc=%#x\n", wc));
+ rc = VERR_CODE_POINT_ENDIAN_INDICATOR;
+ break;
+ }
+ }
+ else
+ {
+ if (wc >= 0xdc00)
+ {
+ RTStrAssertMsgFailed(("Wrong 1st char in surrogate! wc=%#x\n", wc));
+ rc = VERR_INVALID_UTF16_ENCODING;
+ break;
+ }
+ if (cwc <= 0)
+ {
+ RTStrAssertMsgFailed(("Invalid length! wc=%#x\n", wc));
+ rc = VERR_INVALID_UTF16_ENCODING;
+ break;
+ }
+ wc = *pwsz++; cwc--;
+ if (wc < 0xdc00 || wc > 0xdfff)
+ {
+ RTStrAssertMsgFailed(("Wrong 2nd char in surrogate! wc=%#x\n", wc));
+ rc = VERR_INVALID_UTF16_ENCODING;
+ break;
+ }
+ }
+
+ rc = VERR_NO_TRANSLATION;
+ break;
+ }
+ }
+
+ /* done */
+ *pcch = cch;
+ return rc;
+}
+
+
+/**
+ * Recodes an valid UTF-16 string as Latin1.
+ *
+ * @returns iprt status code.
+ * @param pwsz The UTF-16 string.
+ * @param cwc The number of RTUTF16 characters to process from pwsz. The recoding
+ * will stop when cwc or '\\0' is reached.
+ * @param psz Where to store the Latin1 string.
+ * @param cch The size of the Latin1 buffer, excluding the terminator.
+ */
+static int rtUtf16RecodeAsLatin1(PCRTUTF16 pwsz, size_t cwc, char *psz, size_t cch)
+{
+ unsigned char *pch = (unsigned char *)psz;
+ int rc = VINF_SUCCESS;
+ while (cwc > 0)
+ {
+ RTUTF16 wc = *pwsz++; cwc--;
+ if (!wc)
+ break;
+ if (RT_LIKELY(wc < 0x100))
+ {
+ if (RT_UNLIKELY(cch < 1))
+ {
+ RTStrAssertMsgFailed(("Buffer overflow! 1\n"));
+ rc = VERR_BUFFER_OVERFLOW;
+ break;
+ }
+ cch--;
+ *pch++ = (unsigned char)wc;
+ }
+ else
+ {
+ if (wc < 0xd800 || wc > 0xdfff)
+ {
+ if (wc >= 0xfffe)
+ {
+ RTStrAssertMsgFailed(("endian indicator! wc=%#x\n", wc));
+ rc = VERR_CODE_POINT_ENDIAN_INDICATOR;
+ break;
+ }
+ }
+ else
+ {
+ if (wc >= 0xdc00)
+ {
+ RTStrAssertMsgFailed(("Wrong 1st char in surrogate! wc=%#x\n", wc));
+ rc = VERR_INVALID_UTF16_ENCODING;
+ break;
+ }
+ if (cwc <= 0)
+ {
+ RTStrAssertMsgFailed(("Invalid length! wc=%#x\n", wc));
+ rc = VERR_INVALID_UTF16_ENCODING;
+ break;
+ }
+ RTUTF16 wc2 = *pwsz++; cwc--;
+ if (wc2 < 0xdc00 || wc2 > 0xdfff)
+ {
+ RTStrAssertMsgFailed(("Wrong 2nd char in surrogate! wc=%#x\n", wc));
+ rc = VERR_INVALID_UTF16_ENCODING;
+ break;
+ }
+ }
+
+ rc = VERR_NO_TRANSLATION;
+ break;
+ }
+ }
+
+ /* done */
+ *pch = '\0';
+ return rc;
+}
+
+
+RTDECL(int) RTUtf16ToLatin1Tag(PCRTUTF16 pwszString, char **ppszString, const char *pszTag)
+{
+ /*
+ * Validate input.
+ */
+ Assert(VALID_PTR(ppszString));
+ Assert(VALID_PTR(pwszString));
+ *ppszString = NULL;
+
+ /*
+ * Validate the UTF-16 string and calculate the length of the UTF-8 encoding of it.
+ */
+ size_t cch;
+ int rc = rtUtf16CalcLatin1Length(pwszString, RTSTR_MAX, &cch);
+ if (RT_SUCCESS(rc))
+ {
+ /*
+ * Allocate buffer and recode it.
+ */
+ char *pszResult = (char *)RTMemAllocTag(cch + 1, pszTag);
+ if (pszResult)
+ {
+ rc = rtUtf16RecodeAsLatin1(pwszString, RTSTR_MAX, pszResult, cch);
+ if (RT_SUCCESS(rc))
+ {
+ *ppszString = pszResult;
+ return rc;
+ }
+
+ RTMemFree(pszResult);
+ }
+ else
+ rc = VERR_NO_STR_MEMORY;
+ }
+ return rc;
+}
+RT_EXPORT_SYMBOL(RTUtf16ToLatin1Tag);
+
+
+RTDECL(int) RTUtf16ToLatin1ExTag(PCRTUTF16 pwszString, size_t cwcString, char **ppsz, size_t cch, size_t *pcch, const char *pszTag)
+{
+ /*
+ * Validate input.
+ */
+ AssertPtr(pwszString);
+ AssertPtr(ppsz);
+ AssertPtrNull(pcch);
+
+ /*
+ * Validate the UTF-16 string and calculate the length of the Latin1 encoding of it.
+ */
+ size_t cchResult;
+ int rc = rtUtf16CalcLatin1Length(pwszString, cwcString, &cchResult);
+ if (RT_SUCCESS(rc))
+ {
+ if (pcch)
+ *pcch = cchResult;
+
+ /*
+ * Check buffer size / Allocate buffer and recode it.
+ */
+ bool fShouldFree;
+ char *pszResult;
+ if (cch > 0 && *ppsz)
+ {
+ fShouldFree = false;
+ if (cch <= cchResult)
+ return VERR_BUFFER_OVERFLOW;
+ pszResult = *ppsz;
+ }
+ else
+ {
+ *ppsz = NULL;
+ fShouldFree = true;
+ cch = RT_MAX(cch, cchResult + 1);
+ pszResult = (char *)RTMemAllocTag(cch, pszTag);
+ }
+ if (pszResult)
+ {
+ rc = rtUtf16RecodeAsLatin1(pwszString, cwcString, pszResult, cch - 1);
+ if (RT_SUCCESS(rc))
+ {
+ *ppsz = pszResult;
+ return rc;
+ }
+
+ if (fShouldFree)
+ RTMemFree(pszResult);
+ }
+ else
+ rc = VERR_NO_STR_MEMORY;
+ }
+ return rc;
+}
+RT_EXPORT_SYMBOL(RTUtf16ToLatin1ExTag);
+
+
+RTDECL(size_t) RTUtf16CalcLatin1Len(PCRTUTF16 pwsz)
+{
+ size_t cch;
+ int rc = rtUtf16CalcLatin1Length(pwsz, RTSTR_MAX, &cch);
+ return RT_SUCCESS(rc) ? cch : 0;
+}
+RT_EXPORT_SYMBOL(RTUtf16CalcLatin1Len);
+
+
+RTDECL(int) RTUtf16CalcLatin1LenEx(PCRTUTF16 pwsz, size_t cwc, size_t *pcch)
+{
+ size_t cch;
+ int rc = rtUtf16CalcLatin1Length(pwsz, cwc, &cch);
+ if (pcch)
+ *pcch = RT_SUCCESS(rc) ? cch : ~(size_t)0;
+ return rc;
+}
+RT_EXPORT_SYMBOL(RTUtf16CalcLatin1LenEx);
+
+
+/**
+ * Calculates the UTF-16 length of a Latin1 string. In fact this is just the
+ * original length, but the function saves us nasty comments to that effect
+ * all over the place.
+ *
+ * @returns IPRT status code.
+ * @param psz Pointer to the Latin1 string.
+ * @param cch The max length of the string. (btw cch = cb)
+ * Use RTSTR_MAX if all of the string is to be examined.s
+ * @param pcwc Where to store the length of the UTF-16 string as a number of RTUTF16 characters.
+ */
+static int rtLatin1CalcUtf16Length(const char *psz, size_t cch, size_t *pcwc)
+{
+ *pcwc = RTStrNLen(psz, cch);
+ return VINF_SUCCESS;
+}
+
+
+/**
+ * Recodes a Latin1 string as UTF-16. This is just a case of expanding it to
+ * sixteen bits, as Unicode is a superset of Latin1.
+ *
+ * Since we know the input is valid, we do *not* perform length checks.
+ *
+ * @returns iprt status code.
+ * @param psz The Latin1 string to recode.
+ * @param cch The number of chars (the type char, so bytes if you like) to process of the Latin1 string.
+ * The recoding will stop when cch or '\\0' is reached. Pass RTSTR_MAX to process up to '\\0'.
+ * @param pwsz Where to store the UTF-16 string.
+ * @param cwc The number of RTUTF16 items the pwsz buffer can hold, excluding the terminator ('\\0').
+ */
+static int rtLatin1RecodeAsUtf16(const char *psz, size_t cch, PRTUTF16 pwsz, size_t cwc)
+{
+ int rc = VINF_SUCCESS;
+ const unsigned char *puch = (const unsigned char *)psz;
+ PRTUTF16 pwc = pwsz;
+ while (cch-- > 0)
+ {
+ /* read the next char and check for terminator. */
+ const unsigned char uch = *puch;
+ if (!uch)
+ break;
+
+ /* check for output overflow */
+ if (RT_UNLIKELY(cwc < 1))
+ {
+ rc = VERR_BUFFER_OVERFLOW;
+ break;
+ }
+
+ /* expand the code point */
+ *pwc++ = uch;
+ cwc--;
+ puch++;
+ }
+
+ /* done */
+ *pwc = '\0';
+ return rc;
+}
+
+
+RTDECL(int) RTLatin1ToUtf16Tag(const char *pszString, PRTUTF16 *ppwszString, const char *pszTag)
+{
+ /*
+ * Validate input.
+ */
+ Assert(VALID_PTR(ppwszString));
+ Assert(VALID_PTR(pszString));
+ *ppwszString = NULL;
+
+ /*
+ * Validate the input and calculate the length of the UTF-16 string.
+ */
+ size_t cwc;
+ int rc = rtLatin1CalcUtf16Length(pszString, RTSTR_MAX, &cwc);
+ if (RT_SUCCESS(rc))
+ {
+ /*
+ * Allocate buffer.
+ */
+ PRTUTF16 pwsz = (PRTUTF16)RTMemAllocTag((cwc + 1) * sizeof(RTUTF16), pszTag);
+ if (pwsz)
+ {
+ /*
+ * Encode the UTF-16 string.
+ */
+ rc = rtLatin1RecodeAsUtf16(pszString, RTSTR_MAX, pwsz, cwc);
+ if (RT_SUCCESS(rc))
+ {
+ *ppwszString = pwsz;
+ return rc;
+ }
+ RTMemFree(pwsz);
+ }
+ else
+ rc = VERR_NO_UTF16_MEMORY;
+ }
+ return rc;
+}
+RT_EXPORT_SYMBOL(RTLatin1ToUtf16Tag);
+
+
+RTDECL(int) RTLatin1ToUtf16ExTag(const char *pszString, size_t cchString,
+ PRTUTF16 *ppwsz, size_t cwc, size_t *pcwc, const char *pszTag)
+{
+ /*
+ * Validate input.
+ */
+ Assert(VALID_PTR(pszString));
+ Assert(VALID_PTR(ppwsz));
+ Assert(!pcwc || VALID_PTR(pcwc));
+
+ /*
+ * Validate the input and calculate the length of the UTF-16 string.
+ */
+ size_t cwcResult;
+ int rc = rtLatin1CalcUtf16Length(pszString, cchString, &cwcResult);
+ if (RT_SUCCESS(rc))
+ {
+ if (pcwc)
+ *pcwc = cwcResult;
+
+ /*
+ * Check buffer size / Allocate buffer.
+ */
+ bool fShouldFree;
+ PRTUTF16 pwszResult;
+ if (cwc > 0 && *ppwsz)
+ {
+ fShouldFree = false;
+ if (cwc <= cwcResult)
+ return VERR_BUFFER_OVERFLOW;
+ pwszResult = *ppwsz;
+ }
+ else
+ {
+ *ppwsz = NULL;
+ fShouldFree = true;
+ cwc = RT_MAX(cwcResult + 1, cwc);
+ pwszResult = (PRTUTF16)RTMemAllocTag(cwc * sizeof(RTUTF16), pszTag);
+ }
+ if (pwszResult)
+ {
+ /*
+ * Encode the UTF-16 string.
+ */
+ rc = rtLatin1RecodeAsUtf16(pszString, cchString, pwszResult, cwc - 1);
+ if (RT_SUCCESS(rc))
+ {
+ *ppwsz = pwszResult;
+ return rc;
+ }
+ if (fShouldFree)
+ RTMemFree(pwszResult);
+ }
+ else
+ rc = VERR_NO_UTF16_MEMORY;
+ }
+ return rc;
+}
+RT_EXPORT_SYMBOL(RTLatin1ToUtf16ExTag);
+
+
+RTDECL(size_t) RTLatin1CalcUtf16Len(const char *psz)
+{
+ size_t cwc;
+ int rc = rtLatin1CalcUtf16Length(psz, RTSTR_MAX, &cwc);
+ return RT_SUCCESS(rc) ? cwc : 0;
+}
+RT_EXPORT_SYMBOL(RTLatin1CalcUtf16Len);
+
+
+RTDECL(int) RTLatin1CalcUtf16LenEx(const char *psz, size_t cch, size_t *pcwc)
+{
+ size_t cwc;
+ int rc = rtLatin1CalcUtf16Length(psz, cch, &cwc);
+ if (pcwc)
+ *pcwc = RT_SUCCESS(rc) ? cwc : ~(size_t)0;
+ return rc;
+}
+RT_EXPORT_SYMBOL(RTLatin1CalcUtf16LenEx);
+
diff --git a/src/VBox/Runtime/common/string/utf-16.cpp b/src/VBox/Runtime/common/string/utf-16.cpp
index c1259a6dd0f..f5b85686942 100644
--- a/src/VBox/Runtime/common/string/utf-16.cpp
+++ b/src/VBox/Runtime/common/string/utf-16.cpp
@@ -170,145 +170,6 @@ RTDECL(int) RTUtf16Cmp(register PCRTUTF16 pwsz1, register PCRTUTF16 pwsz2)
RT_EXPORT_SYMBOL(RTUtf16Cmp);
-RTDECL(int) RTUtf16ICmp(register PCRTUTF16 pwsz1, register PCRTUTF16 pwsz2)
-{
- if (pwsz1 == pwsz2)
- return 0;
- if (!pwsz1)
- return -1;
- if (!pwsz2)
- return 1;
-
- PCRTUTF16 pwsz1Start = pwsz1; /* keep it around in case we have to backtrack on a surrogate pair */
- for (;;)
- {
- register RTUTF16 wc1 = *pwsz1;
- register RTUTF16 wc2 = *pwsz2;
- register int iDiff = wc1 - wc2;
- if (iDiff)
- {
- /* unless they are *both* surrogate pairs, there is no chance they'll be identical. */
- if ( wc1 < 0xd800
- || wc2 < 0xd800
- || wc1 > 0xdfff
- || wc2 > 0xdfff)
- {
- /* simple UCS-2 char */
- iDiff = RTUniCpToUpper(wc1) - RTUniCpToUpper(wc2);
- if (iDiff)
- iDiff = RTUniCpToLower(wc1) - RTUniCpToLower(wc2);
- }
- else
- {
- /* a damned pair */
- RTUNICP uc1;
- RTUNICP uc2;
- if (wc1 >= 0xdc00)
- {
- if (pwsz1Start == pwsz1)
- return iDiff;
- uc1 = pwsz1[-1];
- if (uc1 < 0xd800 || uc1 >= 0xdc00)
- return iDiff;
- uc1 = 0x10000 + (((uc1 & 0x3ff) << 10) | (wc1 & 0x3ff));
- uc2 = 0x10000 + (((pwsz2[-1] & 0x3ff) << 10) | (wc2 & 0x3ff));
- }
- else
- {
- uc1 = *++pwsz1;
- if (uc1 < 0xdc00 || uc1 >= 0xe000)
- return iDiff;
- uc1 = 0x10000 + (((wc1 & 0x3ff) << 10) | (uc1 & 0x3ff));
- uc2 = 0x10000 + (((wc2 & 0x3ff) << 10) | (*++pwsz2 & 0x3ff));
- }
- iDiff = RTUniCpToUpper(uc1) - RTUniCpToUpper(uc2);
- if (iDiff)
- iDiff = RTUniCpToLower(uc1) - RTUniCpToLower(uc2); /* serious paranoia! */
- }
- if (iDiff)
- return iDiff;
- }
- if (!wc1)
- return 0;
- pwsz1++;
- pwsz2++;
- }
-}
-RT_EXPORT_SYMBOL(RTUtf16ICmp);
-
-
-RTDECL(PRTUTF16) RTUtf16ToLower(PRTUTF16 pwsz)
-{
- PRTUTF16 pwc = pwsz;
- for (;;)
- {
- RTUTF16 wc = *pwc;
- if (!wc)
- break;
- if (wc < 0xd800 || wc >= 0xdc00)
- {
- RTUNICP ucFolded = RTUniCpToLower(wc);
- if (ucFolded < 0x10000)
- *pwc++ = RTUniCpToLower(wc);
- }
- else
- {
- /* surrogate */
- RTUTF16 wc2 = pwc[1];
- if (wc2 >= 0xdc00 && wc2 <= 0xdfff)
- {
- RTUNICP uc = 0x10000 + (((wc & 0x3ff) << 10) | (wc2 & 0x3ff));
- RTUNICP ucFolded = RTUniCpToLower(uc);
- if (uc != ucFolded && ucFolded >= 0x10000) /* we don't support shrinking the string */
- {
- uc -= 0x10000;
- *pwc++ = 0xd800 | (uc >> 10);
- *pwc++ = 0xdc00 | (uc & 0x3ff);
- }
- }
- else /* invalid encoding. */
- pwc++;
- }
- }
- return pwsz;
-}
-RT_EXPORT_SYMBOL(RTUtf16ToLower);
-
-
-RTDECL(PRTUTF16) RTUtf16ToUpper(PRTUTF16 pwsz)
-{
- PRTUTF16 pwc = pwsz;
- for (;;)
- {
- RTUTF16 wc = *pwc;
- if (!wc)
- break;
- if (wc < 0xd800 || wc >= 0xdc00)
- *pwc++ = RTUniCpToUpper(wc);
- else
- {
- /* surrogate */
- RTUTF16 wc2 = pwc[1];
- if (wc2 >= 0xdc00 && wc2 <= 0xdfff)
- {
- RTUNICP uc = 0x10000 + (((wc & 0x3ff) << 10) | (wc2 & 0x3ff));
- RTUNICP ucFolded = RTUniCpToUpper(uc);
- if (uc != ucFolded && ucFolded >= 0x10000) /* we don't support shrinking the string */
- {
- uc -= 0x10000;
- *pwc++ = 0xd800 | (uc >> 10);
- *pwc++ = 0xdc00 | (uc & 0x3ff);
- }
- }
- else /* invalid encoding. */
- pwc++;
- }
- }
- return pwsz;
-}
-RT_EXPORT_SYMBOL(RTUtf16ToUpper);
-
-
RTDECL(int) RTUtf16ValidateEncoding(PCRTUTF16 pwsz)
{
return RTUtf16ValidateEncodingEx(pwsz, RTSTR_MAX, 0);
@@ -785,442 +646,3 @@ RTDECL(PRTUTF16) RTUtf16PutCpInternal(PRTUTF16 pwsz, RTUNICP CodePoint)
}
RT_EXPORT_SYMBOL(RTUtf16PutCpInternal);
-
-/**
- * Validate the UTF-16 encoding and calculates the length of a Latin1 encoding.
- *
- * @returns iprt status code.
- * @param pwsz The UTF-16 string.
- * @param cwc The max length of the UTF-16 string to consider.
- * @param pcch Where to store the length (excluding '\\0') of the Latin1 string. (cch == cb, btw)
- */
-static int rtUtf16CalcLatin1Length(PCRTUTF16 pwsz, size_t cwc, size_t *pcch)
-{
- int rc = VINF_SUCCESS;
- size_t cch = 0;
- while (cwc > 0)
- {
- RTUTF16 wc = *pwsz++; cwc--;
- if (!wc)
- break;
- else if (RT_LIKELY(wc < 0x100))
- ++cch;
- else
- {
- if (wc < 0xd800 || wc > 0xdfff)
- {
- if (wc >= 0xfffe)
- {
- RTStrAssertMsgFailed(("endian indicator! wc=%#x\n", wc));
- rc = VERR_CODE_POINT_ENDIAN_INDICATOR;
- break;
- }
- }
- else
- {
- if (wc >= 0xdc00)
- {
- RTStrAssertMsgFailed(("Wrong 1st char in surrogate! wc=%#x\n", wc));
- rc = VERR_INVALID_UTF16_ENCODING;
- break;
- }
- if (cwc <= 0)
- {
- RTStrAssertMsgFailed(("Invalid length! wc=%#x\n", wc));
- rc = VERR_INVALID_UTF16_ENCODING;
- break;
- }
- wc = *pwsz++; cwc--;
- if (wc < 0xdc00 || wc > 0xdfff)
- {
- RTStrAssertMsgFailed(("Wrong 2nd char in surrogate! wc=%#x\n", wc));
- rc = VERR_INVALID_UTF16_ENCODING;
- break;
- }
- }
-
- rc = VERR_NO_TRANSLATION;
- break;
- }
- }
-
- /* done */
- *pcch = cch;
- return rc;
-}
-
-
-/**
- * Recodes an valid UTF-16 string as Latin1.
- *
- * @returns iprt status code.
- * @param pwsz The UTF-16 string.
- * @param cwc The number of RTUTF16 characters to process from pwsz. The recoding
- * will stop when cwc or '\\0' is reached.
- * @param psz Where to store the Latin1 string.
- * @param cch The size of the Latin1 buffer, excluding the terminator.
- */
-static int rtUtf16RecodeAsLatin1(PCRTUTF16 pwsz, size_t cwc, char *psz, size_t cch)
-{
- unsigned char *pch = (unsigned char *)psz;
- int rc = VINF_SUCCESS;
- while (cwc > 0)
- {
- RTUTF16 wc = *pwsz++; cwc--;
- if (!wc)
- break;
- if (RT_LIKELY(wc < 0x100))
- {
- if (RT_UNLIKELY(cch < 1))
- {
- RTStrAssertMsgFailed(("Buffer overflow! 1\n"));
- rc = VERR_BUFFER_OVERFLOW;
- break;
- }
- cch--;
- *pch++ = (unsigned char)wc;
- }
- else
- {
- if (wc < 0xd800 || wc > 0xdfff)
- {
- if (wc >= 0xfffe)
- {
- RTStrAssertMsgFailed(("endian indicator! wc=%#x\n", wc));
- rc = VERR_CODE_POINT_ENDIAN_INDICATOR;
- break;
- }
- }
- else
- {
- if (wc >= 0xdc00)
- {
- RTStrAssertMsgFailed(("Wrong 1st char in surrogate! wc=%#x\n", wc));
- rc = VERR_INVALID_UTF16_ENCODING;
- break;
- }
- if (cwc <= 0)
- {
- RTStrAssertMsgFailed(("Invalid length! wc=%#x\n", wc));
- rc = VERR_INVALID_UTF16_ENCODING;
- break;
- }
- RTUTF16 wc2 = *pwsz++; cwc--;
- if (wc2 < 0xdc00 || wc2 > 0xdfff)
- {
- RTStrAssertMsgFailed(("Wrong 2nd char in surrogate! wc=%#x\n", wc));
- rc = VERR_INVALID_UTF16_ENCODING;
- break;
- }
- }
-
- rc = VERR_NO_TRANSLATION;
- break;
- }
- }
-
- /* done */
- *pch = '\0';
- return rc;
-}
-
-
-RTDECL(int) RTUtf16ToLatin1Tag(PCRTUTF16 pwszString, char **ppszString, const char *pszTag)
-{
- /*
- * Validate input.
- */
- Assert(VALID_PTR(ppszString));
- Assert(VALID_PTR(pwszString));
- *ppszString = NULL;
-
- /*
- * Validate the UTF-16 string and calculate the length of the UTF-8 encoding of it.
- */
- size_t cch;
- int rc = rtUtf16CalcLatin1Length(pwszString, RTSTR_MAX, &cch);
- if (RT_SUCCESS(rc))
- {
- /*
- * Allocate buffer and recode it.
- */
- char *pszResult = (char *)RTMemAllocTag(cch + 1, pszTag);
- if (pszResult)
- {
- rc = rtUtf16RecodeAsLatin1(pwszString, RTSTR_MAX, pszResult, cch);
- if (RT_SUCCESS(rc))
- {
- *ppszString = pszResult;
- return rc;
- }
-
- RTMemFree(pszResult);
- }
- else
- rc = VERR_NO_STR_MEMORY;
- }
- return rc;
-}
-RT_EXPORT_SYMBOL(RTUtf16ToLatin1Tag);
-
-
-RTDECL(int) RTUtf16ToLatin1ExTag(PCRTUTF16 pwszString, size_t cwcString, char **ppsz, size_t cch, size_t *pcch, const char *pszTag)
-{
- /*
- * Validate input.
- */
- AssertPtr(pwszString);
- AssertPtr(ppsz);
- AssertPtrNull(pcch);
-
- /*
- * Validate the UTF-16 string and calculate the length of the Latin1 encoding of it.
- */
- size_t cchResult;
- int rc = rtUtf16CalcLatin1Length(pwszString, cwcString, &cchResult);
- if (RT_SUCCESS(rc))
- {
- if (pcch)
- *pcch = cchResult;
-
- /*
- * Check buffer size / Allocate buffer and recode it.
- */
- bool fShouldFree;
- char *pszResult;
- if (cch > 0 && *ppsz)
- {
- fShouldFree = false;
- if (cch <= cchResult)
- return VERR_BUFFER_OVERFLOW;
- pszResult = *ppsz;
- }
- else
- {
- *ppsz = NULL;
- fShouldFree = true;
- cch = RT_MAX(cch, cchResult + 1);
- pszResult = (char *)RTMemAllocTag(cch, pszTag);
- }
- if (pszResult)
- {
- rc = rtUtf16RecodeAsLatin1(pwszString, cwcString, pszResult, cch - 1);
- if (RT_SUCCESS(rc))
- {
- *ppsz = pszResult;
- return rc;
- }
-
- if (fShouldFree)
- RTMemFree(pszResult);
- }
- else
- rc = VERR_NO_STR_MEMORY;
- }
- return rc;
-}
-RT_EXPORT_SYMBOL(RTUtf16ToLatin1ExTag);
-
-
-RTDECL(size_t) RTUtf16CalcLatin1Len(PCRTUTF16 pwsz)
-{
- size_t cch;
- int rc = rtUtf16CalcLatin1Length(pwsz, RTSTR_MAX, &cch);
- return RT_SUCCESS(rc) ? cch : 0;
-}
-RT_EXPORT_SYMBOL(RTUtf16CalcLatin1Len);
-
-
-RTDECL(int) RTUtf16CalcLatin1LenEx(PCRTUTF16 pwsz, size_t cwc, size_t *pcch)
-{
- size_t cch;
- int rc = rtUtf16CalcLatin1Length(pwsz, cwc, &cch);
- if (pcch)
- *pcch = RT_SUCCESS(rc) ? cch : ~(size_t)0;
- return rc;
-}
-RT_EXPORT_SYMBOL(RTUtf16CalcLatin1LenEx);
-
-
-/**
- * Calculates the UTF-16 length of a Latin1 string. In fact this is just the
- * original length, but the function saves us nasty comments to that effect
- * all over the place.
- *
- * @returns IPRT status code.
- * @param psz Pointer to the Latin1 string.
- * @param cch The max length of the string. (btw cch = cb)
- * Use RTSTR_MAX if all of the string is to be examined.s
- * @param pcwc Where to store the length of the UTF-16 string as a number of RTUTF16 characters.
- */
-static int rtLatin1CalcUtf16Length(const char *psz, size_t cch, size_t *pcwc)
-{
- *pcwc = RTStrNLen(psz, cch);
- return VINF_SUCCESS;
-}
-
-
-/**
- * Recodes a Latin1 string as UTF-16. This is just a case of expanding it to
- * sixteen bits, as Unicode is a superset of Latin1.
- *
- * Since we know the input is valid, we do *not* perform length checks.
- *
- * @returns iprt status code.
- * @param psz The Latin1 string to recode.
- * @param cch The number of chars (the type char, so bytes if you like) to process of the Latin1 string.
- * The recoding will stop when cch or '\\0' is reached. Pass RTSTR_MAX to process up to '\\0'.
- * @param pwsz Where to store the UTF-16 string.
- * @param cwc The number of RTUTF16 items the pwsz buffer can hold, excluding the terminator ('\\0').
- */
-static int rtLatin1RecodeAsUtf16(const char *psz, size_t cch, PRTUTF16 pwsz, size_t cwc)
-{
- int rc = VINF_SUCCESS;
- const unsigned char *puch = (const unsigned char *)psz;
- PRTUTF16 pwc = pwsz;
- while (cch-- > 0)
- {
- /* read the next char and check for terminator. */
- const unsigned char uch = *puch;
- if (!uch)
- break;
-
- /* check for output overflow */
- if (RT_UNLIKELY(cwc < 1))
- {
- rc = VERR_BUFFER_OVERFLOW;
- break;
- }
-
- /* expand the code point */
- *pwc++ = uch;
- cwc--;
- puch++;
- }
-
- /* done */
- *pwc = '\0';
- return rc;
-}
-
-
-RTDECL(int) RTLatin1ToUtf16Tag(const char *pszString, PRTUTF16 *ppwszString, const char *pszTag)
-{
- /*
- * Validate input.
- */
- Assert(VALID_PTR(ppwszString));
- Assert(VALID_PTR(pszString));
- *ppwszString = NULL;
-
- /*
- * Validate the input and calculate the length of the UTF-16 string.
- */
- size_t cwc;
- int rc = rtLatin1CalcUtf16Length(pszString, RTSTR_MAX, &cwc);
- if (RT_SUCCESS(rc))
- {
- /*
- * Allocate buffer.
- */
- PRTUTF16 pwsz = (PRTUTF16)RTMemAllocTag((cwc + 1) * sizeof(RTUTF16), pszTag);
- if (pwsz)
- {
- /*
- * Encode the UTF-16 string.
- */
- rc = rtLatin1RecodeAsUtf16(pszString, RTSTR_MAX, pwsz, cwc);
- if (RT_SUCCESS(rc))
- {
- *ppwszString = pwsz;
- return rc;
- }
- RTMemFree(pwsz);
- }
- else
- rc = VERR_NO_UTF16_MEMORY;
- }
- return rc;
-}
-RT_EXPORT_SYMBOL(RTLatin1ToUtf16Tag);
-
-
-RTDECL(int) RTLatin1ToUtf16ExTag(const char *pszString, size_t cchString,
- PRTUTF16 *ppwsz, size_t cwc, size_t *pcwc, const char *pszTag)
-{
- /*
- * Validate input.
- */
- Assert(VALID_PTR(pszString));
- Assert(VALID_PTR(ppwsz));
- Assert(!pcwc || VALID_PTR(pcwc));
-
- /*
- * Validate the input and calculate the length of the UTF-16 string.
- */
- size_t cwcResult;
- int rc = rtLatin1CalcUtf16Length(pszString, cchString, &cwcResult);
- if (RT_SUCCESS(rc))
- {
- if (pcwc)
- *pcwc = cwcResult;
-
- /*
- * Check buffer size / Allocate buffer.
- */
- bool fShouldFree;
- PRTUTF16 pwszResult;
- if (cwc > 0 && *ppwsz)
- {
- fShouldFree = false;
- if (cwc <= cwcResult)
- return VERR_BUFFER_OVERFLOW;
- pwszResult = *ppwsz;
- }
- else
- {
- *ppwsz = NULL;
- fShouldFree = true;
- cwc = RT_MAX(cwcResult + 1, cwc);
- pwszResult = (PRTUTF16)RTMemAllocTag(cwc * sizeof(RTUTF16), pszTag);
- }
- if (pwszResult)
- {
- /*
- * Encode the UTF-16 string.
- */
- rc = rtLatin1RecodeAsUtf16(pszString, cchString, pwszResult, cwc - 1);
- if (RT_SUCCESS(rc))
- {
- *ppwsz = pwszResult;
- return rc;
- }
- if (fShouldFree)
- RTMemFree(pwszResult);
- }
- else
- rc = VERR_NO_UTF16_MEMORY;
- }
- return rc;
-}
-RT_EXPORT_SYMBOL(RTLatin1ToUtf16ExTag);
-
-
-RTDECL(size_t) RTLatin1CalcUtf16Len(const char *psz)
-{
- size_t cwc;
- int rc = rtLatin1CalcUtf16Length(psz, RTSTR_MAX, &cwc);
- return RT_SUCCESS(rc) ? cwc : 0;
-}
-RT_EXPORT_SYMBOL(RTLatin1CalcUtf16Len);
-
-
-RTDECL(int) RTLatin1CalcUtf16LenEx(const char *psz, size_t cch, size_t *pcwc)
-{
- size_t cwc;
- int rc = rtLatin1CalcUtf16Length(psz, cch, &cwc);
- if (pcwc)
- *pcwc = RT_SUCCESS(rc) ? cwc : ~(size_t)0;
- return rc;
-}
-RT_EXPORT_SYMBOL(RTLatin1CalcUtf16LenEx);
diff --git a/src/VBox/Runtime/common/string/utf-8-case.cpp b/src/VBox/Runtime/common/string/utf-8-case.cpp
index 62f53ceac44..168419762e2 100644
--- a/src/VBox/Runtime/common/string/utf-8-case.cpp
+++ b/src/VBox/Runtime/common/string/utf-8-case.cpp
@@ -1,6 +1,6 @@
/* $Id$ */
/** @file
- * IPRT - UTF-8 Case Sensitivity and Folding.
+ * IPRT - UTF-8 Case Sensitivity and Folding, Part 1.
*/
/*
@@ -338,82 +338,3 @@ RTDECL(char *) RTStrToUpper(char *psz)
}
RT_EXPORT_SYMBOL(RTStrToUpper);
-
-RTDECL(bool) RTStrIsCaseFoldable(const char *psz)
-{
- /*
- * Loop the code points in the string, checking them one by one until we
- * find something that can be folded.
- */
- RTUNICP uc;
- do
- {
- int rc = RTStrGetCpEx(&psz, &uc);
- if (RT_SUCCESS(rc))
- {
- if (RTUniCpIsFoldable(uc))
- return true;
- }
- else
- {
- /* bad encoding, just skip it quietly (uc == RTUNICP_INVALID (!= 0)). */
- AssertRC(rc);
- }
- } while (uc != 0);
-
- return false;
-}
-RT_EXPORT_SYMBOL(RTStrIsCaseFoldable);
-
-
-RTDECL(bool) RTStrIsUpperCased(const char *psz)
-{
- /*
- * Check that there are no lower case chars in the string.
- */
- RTUNICP uc;
- do
- {
- int rc = RTStrGetCpEx(&psz, &uc);
- if (RT_SUCCESS(rc))
- {
- if (RTUniCpIsLower(uc))
- return false;
- }
- else
- {
- /* bad encoding, just skip it quietly (uc == RTUNICP_INVALID (!= 0)). */
- AssertRC(rc);
- }
- } while (uc != 0);
-
- return true;
-}
-RT_EXPORT_SYMBOL(RTStrIsUpperCased);
-
-
-RTDECL(bool) RTStrIsLowerCased(const char *psz)
-{
- /*
- * Check that there are no lower case chars in the string.
- */
- RTUNICP uc;
- do
- {
- int rc = RTStrGetCpEx(&psz, &uc);
- if (RT_SUCCESS(rc))
- {
- if (RTUniCpIsUpper(uc))
- return false;
- }
- else
- {
- /* bad encoding, just skip it quietly (uc == RTUNICP_INVALID (!= 0)). */
- AssertRC(rc);
- }
- } while (uc != 0);
-
- return true;
-}
-RT_EXPORT_SYMBOL(RTStrIsLowerCased);
-
diff --git a/src/VBox/Runtime/common/string/utf-8-case2.cpp b/src/VBox/Runtime/common/string/utf-8-case2.cpp
new file mode 100644
index 00000000000..2937cc17f1a
--- /dev/null
+++ b/src/VBox/Runtime/common/string/utf-8-case2.cpp
@@ -0,0 +1,118 @@
+/* $Id$ */
+/** @file
+ * IPRT - UTF-8 Case Sensitivity and Folding, Part 2 (requires unidata-flags.cpp).
+ */
+
+/*
+ * Copyright (C) 2006-2010 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include <iprt/string.h>
+#include "internal/iprt.h"
+
+#include <iprt/uni.h>
+#include <iprt/alloc.h>
+#include <iprt/assert.h>
+#include <iprt/err.h>
+#include "internal/string.h"
+
+
+RTDECL(bool) RTStrIsCaseFoldable(const char *psz)
+{
+ /*
+ * Loop the code points in the string, checking them one by one until we
+ * find something that can be folded.
+ */
+ RTUNICP uc;
+ do
+ {
+ int rc = RTStrGetCpEx(&psz, &uc);
+ if (RT_SUCCESS(rc))
+ {
+ if (RTUniCpIsFoldable(uc))
+ return true;
+ }
+ else
+ {
+ /* bad encoding, just skip it quietly (uc == RTUNICP_INVALID (!= 0)). */
+ AssertRC(rc);
+ }
+ } while (uc != 0);
+
+ return false;
+}
+RT_EXPORT_SYMBOL(RTStrIsCaseFoldable);
+
+
+RTDECL(bool) RTStrIsUpperCased(const char *psz)
+{
+ /*
+ * Check that there are no lower case chars in the string.
+ */
+ RTUNICP uc;
+ do
+ {
+ int rc = RTStrGetCpEx(&psz, &uc);
+ if (RT_SUCCESS(rc))
+ {
+ if (RTUniCpIsLower(uc))
+ return false;
+ }
+ else
+ {
+ /* bad encoding, just skip it quietly (uc == RTUNICP_INVALID (!= 0)). */
+ AssertRC(rc);
+ }
+ } while (uc != 0);
+
+ return true;
+}
+RT_EXPORT_SYMBOL(RTStrIsUpperCased);
+
+
+RTDECL(bool) RTStrIsLowerCased(const char *psz)
+{
+ /*
+ * Check that there are no lower case chars in the string.
+ */
+ RTUNICP uc;
+ do
+ {
+ int rc = RTStrGetCpEx(&psz, &uc);
+ if (RT_SUCCESS(rc))
+ {
+ if (RTUniCpIsUpper(uc))
+ return false;
+ }
+ else
+ {
+ /* bad encoding, just skip it quietly (uc == RTUNICP_INVALID (!= 0)). */
+ AssertRC(rc);
+ }
+ } while (uc != 0);
+
+ return true;
+}
+RT_EXPORT_SYMBOL(RTStrIsLowerCased);
+
diff --git a/src/VBox/Runtime/generic/memsafer-generic.cpp b/src/VBox/Runtime/generic/memsafer-generic.cpp
new file mode 100644
index 00000000000..be19d452fbf
--- /dev/null
+++ b/src/VBox/Runtime/generic/memsafer-generic.cpp
@@ -0,0 +1,218 @@
+/* $Id$ */
+/** @file
+ * IPRT - Memory Allocate for Sensitive Data, generic heap-based implementation.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#if defined(DEBUG_bird) && !defined(IN_SUP_HARDENED_R3)
+# define RTMEM_WRAP_TO_EF_APIS
+#endif
+#include "internal/iprt.h"
+#include <iprt/memsafer.h>
+
+#include <iprt/assert.h>
+#include <iprt/string.h>
+
+
+/*******************************************************************************
+* Defined Constants And Macros *
+*******************************************************************************/
+/** Allocation size alignment. */
+#define RTMEMSAFER_ALIGN 16
+/** Padding after the block to avoid small overruns. */
+#define RTMEMSAFER_PAD_BEFORE 96
+/** Padding after the block to avoid small underruns. */
+#define RTMEMSAFER_PAD_AFTER 32
+
+
+/*******************************************************************************
+* Global Variables *
+*******************************************************************************/
+/** XOR scrabler value.
+ * @todo determine this at runtime */
+#if ARCH_BITS == 32
+static uintptr_t g_uScramblerXor = UINT32_C(0x867af88d);
+#elif ARCH_BITS == 64
+static uintptr_t g_uScramblerXor = UINT64_C(0xed95ecc99416d312);
+#else
+# error "Bad ARCH_BITS value"
+#endif
+
+
+
+RTDECL(int) RTMemSaferScramble(void *pv, size_t cb)
+{
+
+ AssertMsg(*(size_t *)((char *)pv - RTMEMSAFER_PAD_BEFORE) == cb,
+ ("*pvStart=%#zx cb=%#zx\n", *(size_t *)((char *)pv- RTMEMSAFER_PAD_BEFORE), cb));
+
+ /* Note! This isn't supposed to be safe, just less obvious. */
+ uintptr_t *pu = (uintptr_t *)pv;
+ cb = RT_ALIGN_Z(cb, RTMEMSAFER_ALIGN);
+ while (cb > 0)
+ {
+ *pu ^= g_uScramblerXor;
+ pu++;
+ cb -= sizeof(*pu);
+ }
+
+ return VINF_SUCCESS;
+}
+RT_EXPORT_SYMBOL(RTMemSaferScramble);
+
+
+RTDECL(int) RTMemSaferUnscramble(void *pv, size_t cb)
+{
+ AssertMsg(*(size_t *)((char *)pv - RTMEMSAFER_PAD_BEFORE) == cb,
+ ("*pvStart=%#zx cb=%#zx\n", *(size_t *)((char *)pv - RTMEMSAFER_PAD_BEFORE), cb));
+
+ /* Note! This isn't supposed to be safe, just less obvious. */
+ uintptr_t *pu = (uintptr_t *)pv;
+ cb = RT_ALIGN_Z(cb, RTMEMSAFER_ALIGN);
+ while (cb > 0)
+ {
+ *pu ^= g_uScramblerXor;
+ pu++;
+ cb -= sizeof(*pu);
+ }
+
+ return VINF_SUCCESS;
+}
+RT_EXPORT_SYMBOL(RTMemSaferUnscramble);
+
+
+RTDECL(int) RTMemSaferAllocZExTag(void **ppvNew, size_t cb, const char *pszTag) RT_NO_THROW
+{
+ AssertReturn(cb, VERR_INVALID_PARAMETER);
+ AssertPtrReturn(ppvNew, VERR_INVALID_PARAMETER);
+ *ppvNew = NULL;
+
+ /*
+ * Don't request zeroed memory. We want random heap garbage in the
+ * padding zones, notthing that makes our allocations easier to find.
+ */
+ size_t cbUser = RT_ALIGN_Z(cb, RTMEMSAFER_ALIGN);
+ void *pvNew = RTMemAlloc(cbUser + RTMEMSAFER_PAD_BEFORE + RTMEMSAFER_PAD_AFTER);
+ if (pvNew)
+ {
+#ifdef RT_STRICT /* For checking input in string builds. */
+ memset(pvNew, 0xad, RTMEMSAFER_PAD_BEFORE);
+ memset((char *)pvNew + RTMEMSAFER_PAD_BEFORE + cb, 0xda, RTMEMSAFER_PAD_AFTER + (cbUser - cb));
+ *(size_t *)pvNew = cb;
+#endif
+
+ void *pvUser = (char *)pvNew + RTMEMSAFER_PAD_BEFORE;
+ *ppvNew = pvUser;
+
+ /* You don't use this API for performance, so we always clean memory. */
+ RT_BZERO(pvUser, cb);
+
+ return VINF_SUCCESS;
+ }
+ return VERR_NO_MEMORY;
+}
+RT_EXPORT_SYMBOL(RTMemSaferAllocZExTag);
+
+
+RTDECL(void) RTMemSaferFree(void *pv, size_t cb) RT_NO_THROW
+{
+ if (pv)
+ {
+ Assert(cb);
+ void *pvStart = (char *)pv - RTMEMSAFER_PAD_BEFORE;
+ AssertMsg(*(size_t *)pvStart == cb, ("*pvStart=%#zx cb=%#zx\n", *(size_t *)pvStart, cb));
+ RTMemWipeThoroughly(pv, RT_ALIGN_Z(cb, RTMEMSAFER_ALIGN), 3);
+ RTMemFree(pvStart);
+ }
+ else
+ Assert(cb == 0);
+}
+RT_EXPORT_SYMBOL(RTMemSaferFree);
+
+
+RTDECL(int) RTMemSaferReallocZExTag(size_t cbOld, void *pvOld, size_t cbNew, void **ppvNew, const char *pszTag) RT_NO_THROW
+{
+ /*
+ * We cannot let the heap move us around because we will be failing in our
+ * duty to clean things up. So, allocate a new block, copy over the old
+ * content, and free the old one.
+ */
+ int rc;
+ /* Real realloc. */
+ if (cbNew && cbOld)
+ {
+ AssertPtr(pvOld);
+ AssertMsg(*(size_t *)((char *)pvOld - RTMEMSAFER_PAD_BEFORE) == cbOld,
+ ("*pvStart=%#zx cbOld=%#zx\n", *(size_t *)((char *)pvOld - RTMEMSAFER_PAD_BEFORE), cbOld));
+
+ void *pvNew;
+ rc = RTMemSaferAllocZExTag(&pvNew, cbNew, pszTag);
+ if (RT_SUCCESS(rc))
+ {
+ memcpy(pvNew, pvOld, RT_MIN(cbNew, cbOld));
+ RTMemSaferFree(pvOld, cbOld);
+ *ppvNew = pvNew;
+ }
+ }
+ /* First allocation. */
+ else if (!cbOld)
+ {
+ Assert(pvOld == NULL);
+ rc = RTMemSaferAllocZExTag(ppvNew, cbNew, pszTag);
+ }
+ /* Free operation*/
+ else
+ {
+ RTMemSaferFree(pvOld, cbOld);
+ rc = VINF_SUCCESS;
+ }
+ return rc;
+}
+RT_EXPORT_SYMBOL(RTMemSaferReallocZExTag);
+
+
+RTDECL(void *) RTMemSaferAllocZTag(size_t cb, const char *pszTag) RT_NO_THROW
+{
+ void *pvNew = NULL;
+ int rc = RTMemSaferAllocZExTag(&pvNew, cb, pszTag);
+ if (RT_SUCCESS(rc))
+ return pvNew;
+ return NULL;
+}
+RT_EXPORT_SYMBOL(RTMemSaferAllocZTag);
+
+
+RTDECL(void *) RTMemSaferReallocZTag(size_t cbOld, void *pvOld, size_t cbNew, const char *pszTag) RT_NO_THROW
+{
+ void *pvNew = NULL;
+ int rc = RTMemSaferReallocZExTag(cbOld, pvOld, cbNew, &pvNew, pszTag);
+ if (RT_SUCCESS(rc))
+ return pvNew;
+ return NULL;
+}
+RT_EXPORT_SYMBOL(RTMemSaferReallocZTag);
+
diff --git a/src/VBox/Runtime/include/internal/iprt-openssl.h b/src/VBox/Runtime/include/internal/iprt-openssl.h
new file mode 100644
index 00000000000..d163367053f
--- /dev/null
+++ b/src/VBox/Runtime/include/internal/iprt-openssl.h
@@ -0,0 +1,42 @@
+/* $Id$ */
+/** @file
+ * IPRT - Internal header for the OpenSSL helpers.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+#ifndef ___internal_iprt_openssl_h
+#define ___internal_iprt_openssl_h
+
+#include <iprt/crypto/x509.h>
+
+RT_C_DECLS_BEGIN
+
+DECLHIDDEN(void) rtCrOpenSslInit(void);
+DECLHIDDEN(int) rtCrOpenSslErrInfoCallback(const char *pach, size_t cch, void *pvUser);
+DECLHIDDEN(int) rtCrOpenSslAddX509CertToStack(void *pvOsslStack, PCRTCRX509CERTIFICATE pCert);
+
+RT_C_DECLS_END
+
+#endif
+
diff --git a/src/VBox/Runtime/include/internal/ldr.h b/src/VBox/Runtime/include/internal/ldr.h
index f2fba51eea3..64dceae0a78 100644
--- a/src/VBox/Runtime/include/internal/ldr.h
+++ b/src/VBox/Runtime/include/internal/ldr.h
@@ -322,8 +322,6 @@ typedef struct RTLDROPS
*/
DECLCALLBACKMEMBER(int, pfnReadDbgInfo)(PRTLDRMODINTERNAL pMod, uint32_t iDbgInfo, RTFOFF off, size_t cb, void *pvBuf);
-
-
/**
* Generic method for querying image properties.
*
@@ -337,95 +335,46 @@ typedef struct RTLDROPS
* @param pvBuf Pointer to the return buffer (valid).
* @param cbBuf The size of the return buffer (valid as per
* property).
+ * @param pcbRet The number of bytes actually returned. If
+ * VERR_BUFFER_OVERFLOW is returned, this is set to the
+ * required buffer size.
*/
- DECLCALLBACKMEMBER(int, pfnQueryProp)(PRTLDRMODINTERNAL pMod, RTLDRPROP enmProp, void *pvBuf, size_t cbBuf);
-
- /** Dummy entry to make sure we've initialized it all. */
- RTUINT uDummy;
-} RTLDROPS;
-typedef RTLDROPS *PRTLDROPS;
-typedef const RTLDROPS *PCRTLDROPS;
-
-
-/** Pointer to a loader reader instance. */
-typedef struct RTLDRREADER *PRTLDRREADER;
-
-/**
- * Loader image reader instance.
- * The reader will have extra data members following this structure.
- */
-typedef struct RTLDRREADER
-{
- /** The name of the image provider. */
- const char *pszName;
-
- /**
- * Reads bytes at a give place in the raw image.
- *
- * @returns iprt status code.
- * @param pReader Pointer to the reader instance.
- * @param pvBuf Where to store the bits.
- * @param cb Number of bytes to read.
- * @param off Where to start reading relative to the start of the raw image.
- */
- DECLCALLBACKMEMBER(int, pfnRead)(PRTLDRREADER pReader, void *pvBuf, size_t cb, RTFOFF off);
+ DECLCALLBACKMEMBER(int, pfnQueryProp)(PRTLDRMODINTERNAL pMod, RTLDRPROP enmProp, void *pvBuf, size_t cbBuf, size_t *pcbRet);
/**
- * Tells end position of last read.
+ * Verify the image signature.
*
- * @returns position relative to start of the raw image.
- * @param pReader Pointer to the reader instance.
- */
- DECLCALLBACKMEMBER(RTFOFF, pfnTell)(PRTLDRREADER pReader);
-
- /**
- * Gets the size of the raw image bits.
+ * This may permform additional integrity checks on the image structures that
+ * was not done when opening the image.
*
- * @returns size of raw image bits in bytes.
- * @param pReader Pointer to the reader instance.
- */
- DECLCALLBACKMEMBER(RTFOFF, pfnSize)(PRTLDRREADER pReader);
-
- /**
- * Map the bits into memory.
- *
- * The mapping will be freed upon calling pfnDestroy() if not pfnUnmap()
- * is called before that. The mapping is read only.
- *
- * @returns iprt status code.
- * @param pReader Pointer to the reader instance.
- * @param ppvBits Where to store the address of the memory mapping on success.
- * The size of the mapping can be obtained by calling pfnSize().
- */
- DECLCALLBACKMEMBER(int, pfnMap)(PRTLDRREADER pReader, const void **ppvBits);
-
- /**
- * Unmap bits.
- *
- * @returns iprt status code.
- * @param pReader Pointer to the reader instance.
- * @param pvBits Memory pointer returned by pfnMap().
- */
- DECLCALLBACKMEMBER(int, pfnUnmap)(PRTLDRREADER pReader, const void *pvBits);
-
- /**
- * Gets the most appropriate log name.
+ * @returns IPRT status code.
+ * @retval VERR_LDRVI_NOT_SIGNED if not signed.
*
- * @returns Pointer to readonly log name.
- * @param pReader Pointer to the reader instance.
+ * @param pMod Pointer to the loader module structure.
+ * @param pfnCallback Callback that does the signature and certificate
+ * verficiation.
+ * @param pvUser User argument for the callback.
+ * @param pErrInfo Pointer to an error info buffer. Optional.
*/
- DECLCALLBACKMEMBER(const char *, pfnLogName)(PRTLDRREADER pReader);
+ DECLCALLBACKMEMBER(int, pfnVerifySignature)(PRTLDRMODINTERNAL pMod, PFNRTLDRVALIDATESIGNEDDATA pfnCallback, void *pvUser,
+ PRTERRINFO pErrInfo);
/**
- * Releases all resources associated with the reader instance.
- * The instance is invalid after this call returns.
+ * Calculate the image hash according the image signing rules.
*
- * @returns iprt status code.
- * @param pReader Pointer to the reader instance.
+ * @returns IPRT status code.
+ * @param hLdrMod The module handle.
+ * @param enmDigest Which kind of digest.
+ * @param pszDigest Where to store the image digest.
+ * @param cbDigest Size of the buffer @a pszDigest points at.
*/
- DECLCALLBACKMEMBER(int, pfnDestroy)(PRTLDRREADER pReader);
+ DECLCALLBACKMEMBER(int, pfnHashImage)(PRTLDRMODINTERNAL pMod, RTDIGESTTYPE enmDigest, char *pszDigest, size_t cbDigest);
-} RTLDRREADER;
+ /** Dummy entry to make sure we've initialized it all. */
+ RTUINT uDummy;
+} RTLDROPS;
+typedef RTLDROPS *PRTLDROPS;
+typedef const RTLDROPS *PCRTLDROPS;
/**
@@ -465,8 +414,6 @@ DECLINLINE(bool) rtldrIsValid(RTLDRMOD hLdrMod)
&& ((PRTLDRMODINTERNAL)hLdrMod)->u32Magic == RTLDRMOD_MAGIC;
}
-int rtldrOpenWithReader(PRTLDRREADER pReader, uint32_t fFlags, RTLDRARCH enmArch, PRTLDRMOD phMod);
-
/**
* Native loader module.
@@ -510,9 +457,9 @@ int rtldrNativeLoad(const char *pszFilename, uintptr_t *phHandle, uint32_t fFlag
*/
int rtldrNativeLoadSystem(const char *pszFilename, const char *pszExt, uint32_t fFlags, PRTLDRMOD phLdrMod);
-int rtldrPEOpen(PRTLDRREADER pReader, uint32_t fFlags, RTLDRARCH enmArch, RTFOFF offNtHdrs, PRTLDRMOD phLdrMod);
-int rtldrELFOpen(PRTLDRREADER pReader, uint32_t fFlags, RTLDRARCH enmArch, PRTLDRMOD phLdrMod);
-int rtldrkLdrOpen(PRTLDRREADER pReader, uint32_t fFlags, RTLDRARCH enmArch, PRTLDRMOD phLdrMod);
+int rtldrPEOpen(PRTLDRREADER pReader, uint32_t fFlags, RTLDRARCH enmArch, RTFOFF offNtHdrs, PRTLDRMOD phLdrMod, PRTERRINFO pErrInfo);
+int rtldrELFOpen(PRTLDRREADER pReader, uint32_t fFlags, RTLDRARCH enmArch, PRTLDRMOD phLdrMod, PRTERRINFO pErrInfo);
+int rtldrkLdrOpen(PRTLDRREADER pReader, uint32_t fFlags, RTLDRARCH enmArch, PRTLDRMOD phLdrMod, PRTERRINFO pErrInfo);
/*int rtldrLXOpen(PRTLDRREADER pReader, uint32_t fFlags, RTLDRARCH enmArch, RTFOFF offLX, PRTLDRMOD phLdrMod);
int rtldrMachoOpen(PRTLDRREADER pReader, uint32_t fFlags, RTLDRARCH enmArch, RTFOFF offSomething, PRTLDRMOD phLdrMod);*/
diff --git a/src/VBox/Runtime/include/internal/ldrPE.h b/src/VBox/Runtime/include/internal/ldrPE.h
index c83ec470802..d130907a4d4 100644
--- a/src/VBox/Runtime/include/internal/ldrPE.h
+++ b/src/VBox/Runtime/include/internal/ldrPE.h
@@ -72,15 +72,22 @@
#define IMAGE_SUBSYSTEM_OS2_CUI 0x5
#define IMAGE_SUBSYSTEM_POSIX_CUI 0x7
-#define IMAGE_LIBRARY_PROCESS_INIT 0x0001
-#define IMAGE_LIBRARY_PROCESS_TERM 0x0002
-#define IMAGE_LIBRARY_THREAD_INIT 0x0004
-#define IMAGE_LIBRARY_THREAD_TERM 0x0008
-#define IMAGE_DLLCHARACTERISTICS_NO_ISOLATION 0x0200
-#define IMAGE_DLLCHARACTERISTICS_NO_SEH 0x0400
-#define IMAGE_DLLCHARACTERISTICS_NO_BIND 0x0800
-#define IMAGE_DLLCHARACTERISTICS_WDM_DRIVER 0x2000
-#define IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE 0x8000
+#define IMAGE_LIBRARY_PROCESS_INIT 0x0001
+#define IMAGE_LIBRARY_PROCESS_TERM 0x0002
+#define IMAGE_LIBRARY_THREAD_INIT 0x0004
+#define IMAGE_LIBRARY_THREAD_TERM 0x0008
+#define IMAGE_DLLCHARACTERISTICS_RESERVED 0x0010
+#define IMAGE_DLLCHARACTERISTICS_HIGH_ENTROPY_VA 0x0020
+#define IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE 0x0040
+#define IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY 0x0080
+#define IMAGE_DLLCHARACTERISTICS_NX_COMPAT 0x0100
+#define IMAGE_DLLCHARACTERISTICS_NO_ISOLATION 0x0200
+#define IMAGE_DLLCHARACTERISTICS_NO_SEH 0x0400
+#define IMAGE_DLLCHARACTERISTICS_NO_BIND 0x0800
+#define IMAGE_DLLCHARACTERISTICS_APPCONTAINER 0x1000
+#define IMAGE_DLLCHARACTERISTICS_WDM_DRIVER 0x2000
+#define IMAGE_DLLCHARACTERISTICS_GUARD_CF 0x4000
+#define IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE 0x8000
#define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 0x10
@@ -207,6 +214,9 @@
#define WIN_CERT_TYPE_EFI_PKCS115 UINT16_C(0x0ef0)
#define WIN_CERT_TYPE_EFI_GUID UINT16_C(0x0ef1)
+/** The alignment of the certificate table.
+ * @remarks Found thru signtool experiments. */
+#define WIN_CERTIFICATE_ALIGNMENT 8
/* For .DBG files. */
#define IMAGE_SEPARATE_DEBUG_SIGNATURE UINT16_C(0x4944)
@@ -516,7 +526,46 @@ typedef IMAGE_THUNK_DATA32 *PIMAGE_THUNK_DATA32;
typedef IMAGE_THUNK_DATA32 const *PCIMAGE_THUNK_DATA32;
-typedef struct _IMAGE_LOAD_CONFIG_DIRECTORY32
+
+/* WARNING! NO MORE PRAGMA PACK 4 from here on. Assert size of all new types. */
+/* WARNING! NO MORE PRAGMA PACK 4 from here on. Assert size of all new types. */
+/* WARNING! NO MORE PRAGMA PACK 4 from here on. Assert size of all new types. */
+/* WARNING! NO MORE PRAGMA PACK 4 from here on. Assert size of all new types. */
+/* WARNING! NO MORE PRAGMA PACK 4 from here on. Assert size of all new types. */
+/* WARNING! NO MORE PRAGMA PACK 4 from here on. Assert size of all new types. */
+/* WARNING! NO MORE PRAGMA PACK 4 from here on. Assert size of all new types. */
+/* WARNING! NO MORE PRAGMA PACK 4 from here on. Assert size of all new types. */
+/* WARNING! NO MORE PRAGMA PACK 4 from here on. Assert size of all new types. */
+#pragma pack()
+
+
+
+typedef struct _IMAGE_LOAD_CONFIG_DIRECTORY32_V1
+{
+ uint32_t Size;
+ uint32_t TimeDateStamp;
+ uint16_t MajorVersion;
+ uint16_t MinorVersion;
+ uint32_t GlobalFlagsClear;
+ uint32_t GlobalFlagsSet;
+ uint32_t CriticalSectionDefaultTimeout;
+ uint32_t DeCommitFreeBlockThreshold;
+ uint32_t DeCommitTotalFreeThreshold;
+ uint32_t LockPrefixTable;
+ uint32_t MaximumAllocationSize;
+ uint32_t VirtualMemoryThreshold;
+ uint32_t ProcessHeapFlags;
+ uint32_t ProcessAffinityMask;
+ uint16_t CSDVersion;
+ uint16_t Reserved1;
+ uint32_t EditList;
+ uint32_t SecurityCookie;
+} IMAGE_LOAD_CONFIG_DIRECTORY32_V1;
+AssertCompileSize(IMAGE_LOAD_CONFIG_DIRECTORY32_V1, 0x40);
+typedef IMAGE_LOAD_CONFIG_DIRECTORY32_V1 *PIMAGE_LOAD_CONFIG_DIRECTORY32_V1;
+typedef IMAGE_LOAD_CONFIG_DIRECTORY32_V1 const *PCIMAGE_LOAD_CONFIG_DIRECTORY32_V1;
+
+typedef struct _IMAGE_LOAD_CONFIG_DIRECTORY32_V2
{
uint32_t Size;
uint32_t TimeDateStamp;
@@ -538,11 +587,50 @@ typedef struct _IMAGE_LOAD_CONFIG_DIRECTORY32
uint32_t SecurityCookie;
uint32_t SEHandlerTable;
uint32_t SEHandlerCount;
-} IMAGE_LOAD_CONFIG_DIRECTORY32;
-typedef IMAGE_LOAD_CONFIG_DIRECTORY32 *PIMAGE_LOAD_CONFIG_DIRECTORY32;
-typedef IMAGE_LOAD_CONFIG_DIRECTORY32 const *PCIMAGE_LOAD_CONFIG_DIRECTORY32;
+} IMAGE_LOAD_CONFIG_DIRECTORY32_V2;
+AssertCompileSize(IMAGE_LOAD_CONFIG_DIRECTORY32_V2, 0x48);
+typedef IMAGE_LOAD_CONFIG_DIRECTORY32_V2 *PIMAGE_LOAD_CONFIG_DIRECTORY32_V2;
+typedef IMAGE_LOAD_CONFIG_DIRECTORY32_V2 const *PCIMAGE_LOAD_CONFIG_DIRECTORY32_V2;
-typedef struct _IMAGE_LOAD_CONFIG_DIRECTORY64
+typedef struct _IMAGE_LOAD_CONFIG_DIRECTORY32_V3
+{
+ uint32_t Size;
+ uint32_t TimeDateStamp;
+ uint16_t MajorVersion;
+ uint16_t MinorVersion;
+ uint32_t GlobalFlagsClear;
+ uint32_t GlobalFlagsSet;
+ uint32_t CriticalSectionDefaultTimeout;
+ uint32_t DeCommitFreeBlockThreshold;
+ uint32_t DeCommitTotalFreeThreshold;
+ uint32_t LockPrefixTable;
+ uint32_t MaximumAllocationSize;
+ uint32_t VirtualMemoryThreshold;
+ uint32_t ProcessHeapFlags;
+ uint32_t ProcessAffinityMask;
+ uint16_t CSDVersion;
+ uint16_t Reserved1;
+ uint32_t EditList;
+ uint32_t SecurityCookie;
+ uint32_t SEHandlerTable;
+ uint32_t SEHandlerCount;
+ uint32_t GuardCFCCheckFunctionPointer;
+ uint32_t Reserved2;
+ uint32_t GuardCFFunctionTable;
+ uint32_t GuardCFFunctionCount;
+ uint32_t GuardFlags;
+} IMAGE_LOAD_CONFIG_DIRECTORY32_V3;
+AssertCompileSize(IMAGE_LOAD_CONFIG_DIRECTORY32_V3, 0x5c);
+typedef IMAGE_LOAD_CONFIG_DIRECTORY32_V3 *PIMAGE_LOAD_CONFIG_DIRECTORY32_V3;
+typedef IMAGE_LOAD_CONFIG_DIRECTORY32_V3 const *PCIMAGE_LOAD_CONFIG_DIRECTORY32_V3;
+
+typedef IMAGE_LOAD_CONFIG_DIRECTORY32_V3 IMAGE_LOAD_CONFIG_DIRECTORY32;
+typedef PIMAGE_LOAD_CONFIG_DIRECTORY32_V3 PIMAGE_LOAD_CONFIG_DIRECTORY32;
+typedef PCIMAGE_LOAD_CONFIG_DIRECTORY32_V3 PCIMAGE_LOAD_CONFIG_DIRECTORY32;
+
+/* No _IMAGE_LOAD_CONFIG_DIRECTORY64_V1 exists. */
+
+typedef struct _IMAGE_LOAD_CONFIG_DIRECTORY64_V2
{
uint32_t Size;
uint32_t TimeDateStamp;
@@ -564,10 +652,48 @@ typedef struct _IMAGE_LOAD_CONFIG_DIRECTORY64
uint64_t SecurityCookie;
uint64_t SEHandlerTable;
uint64_t SEHandlerCount;
-} IMAGE_LOAD_CONFIG_DIRECTORY64;
-typedef IMAGE_LOAD_CONFIG_DIRECTORY64 *PIMAGE_LOAD_CONFIG_DIRECTORY64;
-typedef IMAGE_LOAD_CONFIG_DIRECTORY64 const *PCIMAGE_LOAD_CONFIG_DIRECTORY64;
+} IMAGE_LOAD_CONFIG_DIRECTORY64_V2;
+AssertCompileSize(IMAGE_LOAD_CONFIG_DIRECTORY64_V2, 0x70);
+typedef IMAGE_LOAD_CONFIG_DIRECTORY64_V2 *PIMAGE_LOAD_CONFIG_DIRECTORY64_V2;
+typedef IMAGE_LOAD_CONFIG_DIRECTORY64_V2 const *PCIMAGE_LOAD_CONFIG_DIRECTORY64_V2;
+#pragma pack(4) /* Why not 8 byte alignment, baka microsofties?!? */
+typedef struct _IMAGE_LOAD_CONFIG_DIRECTORY64_V3
+{
+ uint32_t Size;
+ uint32_t TimeDateStamp;
+ uint16_t MajorVersion;
+ uint16_t MinorVersion;
+ uint32_t GlobalFlagsClear;
+ uint32_t GlobalFlagsSet;
+ uint32_t CriticalSectionDefaultTimeout;
+ uint64_t DeCommitFreeBlockThreshold;
+ uint64_t DeCommitTotalFreeThreshold;
+ uint64_t LockPrefixTable;
+ uint64_t MaximumAllocationSize;
+ uint64_t VirtualMemoryThreshold;
+ uint64_t ProcessAffinityMask;
+ uint32_t ProcessHeapFlags;
+ uint16_t CSDVersion;
+ uint16_t Reserved1;
+ uint64_t EditList;
+ uint64_t SecurityCookie;
+ uint64_t SEHandlerTable;
+ uint64_t SEHandlerCount;
+ uint64_t GuardCFCCheckFunctionPointer;
+ uint64_t Reserved2;
+ uint64_t GuardCFFunctionTable;
+ uint64_t GuardCFFunctionCount;
+ uint32_t GuardFlags;
+} IMAGE_LOAD_CONFIG_DIRECTORY64_V3;
+#pragma pack()
+AssertCompileSize(IMAGE_LOAD_CONFIG_DIRECTORY64_V3, 0x94);
+typedef IMAGE_LOAD_CONFIG_DIRECTORY64_V3 *PIMAGE_LOAD_CONFIG_DIRECTORY64_V3;
+typedef IMAGE_LOAD_CONFIG_DIRECTORY64_V3 const *PCIMAGE_LOAD_CONFIG_DIRECTORY64_V3;
+
+typedef IMAGE_LOAD_CONFIG_DIRECTORY64_V3 IMAGE_LOAD_CONFIG_DIRECTORY64;
+typedef PIMAGE_LOAD_CONFIG_DIRECTORY64_V3 PIMAGE_LOAD_CONFIG_DIRECTORY64;
+typedef PCIMAGE_LOAD_CONFIG_DIRECTORY64_V3 PCIMAGE_LOAD_CONFIG_DIRECTORY64;
typedef struct _IMAGE_DEBUG_DIRECTORY
{
@@ -580,6 +706,7 @@ typedef struct _IMAGE_DEBUG_DIRECTORY
uint32_t AddressOfRawData;
uint32_t PointerToRawData;
} IMAGE_DEBUG_DIRECTORY;
+AssertCompileSize(IMAGE_DEBUG_DIRECTORY, 28);
typedef IMAGE_DEBUG_DIRECTORY *PIMAGE_DEBUG_DIRECTORY;
typedef IMAGE_DEBUG_DIRECTORY const *PCIMAGE_DEBUG_DIRECTORY;
@@ -591,6 +718,7 @@ typedef struct _IMAGE_DEBUG_MISC
uint8_t Reserved[3];
uint8_t Data[1];
} IMAGE_DEBUG_MISC;
+AssertCompileSize(IMAGE_DEBUG_MISC, 16);
typedef IMAGE_DEBUG_MISC *PIMAGE_DEBUG_MISC;
typedef IMAGE_DEBUG_MISC const *PCIMAGE_DEBUG_MISC;
@@ -602,27 +730,11 @@ typedef struct WIN_CERTIFICATE
uint16_t wCertificateType;
uint8_t bCertificate[8];
} WIN_CERTIFICATE;
+AssertCompileSize(WIN_CERTIFICATE, 16);
typedef WIN_CERTIFICATE *PWIN_CERTIFICATE;
typedef WIN_CERTIFICATE const *PCWIN_CERTIFICATE;
-
-
-/* WARNING! NO MORE PRAGMA PACK 4 from here on. Assert size of all new types. */
-/* WARNING! NO MORE PRAGMA PACK 4 from here on. Assert size of all new types. */
-/* WARNING! NO MORE PRAGMA PACK 4 from here on. Assert size of all new types. */
-/* WARNING! NO MORE PRAGMA PACK 4 from here on. Assert size of all new types. */
-/* WARNING! NO MORE PRAGMA PACK 4 from here on. Assert size of all new types. */
-/* WARNING! NO MORE PRAGMA PACK 4 from here on. Assert size of all new types. */
-/* WARNING! NO MORE PRAGMA PACK 4 from here on. Assert size of all new types. */
-/* WARNING! NO MORE PRAGMA PACK 4 from here on. Assert size of all new types. */
-/* WARNING! NO MORE PRAGMA PACK 4 from here on. Assert size of all new types. */
-#pragma pack()
-
-
-
-
-
/** The header of a .DBG file (NT4). */
typedef struct _IMAGE_SEPARATE_DEBUG_HEADER
{
diff --git a/src/VBox/Runtime/nt/RTErrConvertFromNtStatus.cpp b/src/VBox/Runtime/nt/RTErrConvertFromNtStatus.cpp
index f1c45dcb0bd..45220a68d9c 100644
--- a/src/VBox/Runtime/nt/RTErrConvertFromNtStatus.cpp
+++ b/src/VBox/Runtime/nt/RTErrConvertFromNtStatus.cpp
@@ -48,6 +48,7 @@ RTDECL(int) RTErrConvertFromNtStatus(long lNativeCode)
case STATUS_DATATYPE_MISALIGNMENT: return VERR_INVALID_POINTER;
case STATUS_NO_MORE_FILES: return VERR_NO_MORE_FILES;
case STATUS_NO_MORE_ENTRIES: return VERR_NO_MORE_FILES;
+ case STATUS_NO_MEMORY: return VERR_NO_MEMORY;
case STATUS_INVALID_HANDLE: return VERR_INVALID_HANDLE;
case STATUS_INVALID_PARAMETER: return VERR_INVALID_PARAMETER;
@@ -60,6 +61,7 @@ RTDECL(int) RTErrConvertFromNtStatus(long lNativeCode)
case STATUS_OBJECT_NAME_NOT_FOUND: return VERR_FILE_NOT_FOUND;
case STATUS_OBJECT_PATH_INVALID: return VERR_INVALID_NAME;
case STATUS_OBJECT_PATH_NOT_FOUND: return VERR_PATH_NOT_FOUND;
+ case STATUS_OBJECT_PATH_SYNTAX_BAD: return VERR_INVALID_NAME;
case STATUS_BAD_NETWORK_PATH: return VERR_NET_PATH_NOT_FOUND;
case STATUS_NOT_A_DIRECTORY: return VERR_NOT_A_DIRECTORY;
}
diff --git a/src/VBox/Runtime/r0drv/nt/toxic-chkstk-r0drv-nt.asm b/src/VBox/Runtime/r0drv/nt/toxic-chkstk-r0drv-nt.asm
new file mode 100644
index 00000000000..23247831f4a
--- /dev/null
+++ b/src/VBox/Runtime/r0drv/nt/toxic-chkstk-r0drv-nt.asm
@@ -0,0 +1,42 @@
+; $Id$
+;; @file
+; IPRT - Toxic _chkstk symbol.
+;
+
+;
+; Copyright (C) 2006-2014 Oracle Corporation
+;
+; This file is part of VirtualBox Open Source Edition (OSE), as
+; available from http://www.virtualbox.org. This file is free software;
+; you can redistribute it and/or modify it under the terms of the GNU
+; General Public License (GPL) as published by the Free Software
+; Foundation, in version 2 as it comes in the "COPYING" file of the
+; VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+; hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+;
+; The contents of this file may alternatively be used under the terms
+; of the Common Development and Distribution License Version 1.0
+; (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+; VirtualBox OSE distribution, in which case the provisions of the
+; CDDL are applicable instead of those of the GPL.
+;
+; You may elect to license modified versions of this file under the
+; terms and conditions of either the GPL or the CDDL or both.
+;
+
+;*******************************************************************************
+;* Header Files *
+;*******************************************************************************
+%include "iprt/asmdefs.mac"
+
+BEGINCODE
+
+;;
+; Bad function to drag into kernel code as you're eating up too much stack.
+;
+BEGINPROC _chkstk
+%define MY_SYM _chkstk_is_considered_toxic_in_kernel_code__you_should_locate_code_using_too_much_stack_and_change_it_to_use_heap
+ extern MY_SYM
+ jmp MY_SYM
+ENDPROC _chkstk
+
diff --git a/src/VBox/Runtime/r3/nt/RTProcQueryParent-r3-nt.cpp b/src/VBox/Runtime/r3/nt/RTProcQueryParent-r3-nt.cpp
new file mode 100644
index 00000000000..841e5f35e56
--- /dev/null
+++ b/src/VBox/Runtime/r3/nt/RTProcQueryParent-r3-nt.cpp
@@ -0,0 +1,93 @@
+/* $Id$ */
+/** @file
+ * IPRT - Process, Windows.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#define LOG_GROUP RTLOGGROUP_PROCESS
+#include <iprt/nt/nt.h>
+
+#include <iprt/process.h>
+#include "internal/iprt.h"
+
+#include <iprt/assert.h>
+#include <iprt/err.h>
+
+
+
+RTR3DECL(int) RTProcQueryParent(RTPROCESS hProcess, PRTPROCESS phParent)
+{
+ NTSTATUS rcNt;
+ HANDLE hClose = RTNT_INVALID_HANDLE_VALUE;
+ HANDLE hNtProc;
+
+ /*
+ * Open the process. We take a shortcut if it's the current process.
+ */
+ if (hProcess == RTProcSelf())
+ hNtProc = NtCurrentProcess();
+ else
+ {
+ CLIENT_ID ClientId;
+ ClientId.UniqueProcess = (HANDLE)hProcess;
+ ClientId.UniqueThread = NULL;
+
+ OBJECT_ATTRIBUTES ObjAttrs;
+ InitializeObjectAttributes(&ObjAttrs, NULL, OBJ_CASE_INSENSITIVE, NULL, NULL);
+
+ rcNt = NtOpenProcess(&hClose, PROCESS_QUERY_LIMITED_INFORMATION, &ObjAttrs, &ClientId);
+ if (!NT_SUCCESS(rcNt))
+ rcNt = NtOpenProcess(&hClose, PROCESS_QUERY_INFORMATION, &ObjAttrs, &ClientId);
+ if (!NT_SUCCESS(rcNt))
+ return RTErrConvertFromNtStatus(rcNt);
+ hNtProc = hClose;
+ }
+
+ /*
+ * Query the information.
+ */
+ int rc;
+ PROCESS_BASIC_INFORMATION BasicInfo;
+ ULONG cbIgn;
+ rcNt = NtQueryInformationProcess(hNtProc, ProcessBasicInformation, &BasicInfo, sizeof(BasicInfo), &cbIgn);
+ if (NT_SUCCESS(rcNt))
+ {
+ *phParent = BasicInfo.InheritedFromUniqueProcessId;
+ rc = VINF_SUCCESS;
+ }
+ else
+ rc = RTErrConvertFromNtStatus(rcNt);
+
+ /*
+ * Clean up.
+ */
+ if (hClose != RTNT_INVALID_HANDLE_VALUE)
+ NtClose(hClose);
+
+ return rc;
+}
+
diff --git a/src/VBox/Runtime/r3/posix/process-posix.cpp b/src/VBox/Runtime/r3/posix/process-posix.cpp
index af057e196b0..76afd001841 100644
--- a/src/VBox/Runtime/r3/posix/process-posix.cpp
+++ b/src/VBox/Runtime/r3/posix/process-posix.cpp
@@ -147,6 +147,17 @@ RTR3DECL(uint64_t) RTProcGetAffinityMask(void)
}
+RTR3DECL(int) RTProcQueryParent(RTPROCESS hProcess, PRTPROCESS phParent)
+{
+ if (hProcess == RTProcSelf())
+ {
+ *phParent = getppid();
+ return VINF_SUCCESS;
+ }
+ return VERR_NOT_SUPPORTED;
+}
+
+
RTR3DECL(int) RTProcQueryUsername(RTPROCESS hProcess, char *pszUser, size_t cbUser,
size_t *pcbUser)
{
diff --git a/src/VBox/Runtime/r3/stream.cpp b/src/VBox/Runtime/r3/stream.cpp
index f4c7766c242..4e08601d1fa 100644
--- a/src/VBox/Runtime/r3/stream.cpp
+++ b/src/VBox/Runtime/r3/stream.cpp
@@ -1092,6 +1092,19 @@ RTR3DECL(int) RTStrmPrintf(PRTSTREAM pStream, const char *pszFormat, ...)
/**
+ * Dumper vprintf-like function outputting to a stream.
+ *
+ * @param pvUser The stream to print to. NULL means standard output.
+ * @param pszFormat Runtime format string.
+ * @param va Arguments specified by pszFormat.
+ */
+RTDECL(void) RTStrmDumpPrintfV(void *pvUser, const char *pszFormat, va_list va)
+{
+ RTStrmPrintfV(pvUser ? (PRTSTREAM)pvUser : g_pStdOut, pszFormat, va);
+}
+
+
+/**
* Prints a formatted string to the standard output stream (g_pStdOut).
*
* @returns Number of bytes printed.
diff --git a/src/VBox/Runtime/r3/win/ntdll-mini-implib.c b/src/VBox/Runtime/r3/win/ntdll-mini-implib.c
deleted file mode 100644
index ac43a304f10..00000000000
--- a/src/VBox/Runtime/r3/win/ntdll-mini-implib.c
+++ /dev/null
@@ -1,180 +0,0 @@
-/* $Id$ */
-/** @file
- * IPRT - Minimal NTDLL import library defintion file.
- */
-
-/*
- * Copyright (C) 2010-2013 Oracle Corporation
- *
- * This file is part of VirtualBox Open Source Edition (OSE), as
- * available from http://www.virtualbox.org. This file is free software;
- * you can redistribute it and/or modify it under the terms of the GNU
- * General Public License (GPL) as published by the Free Software
- * Foundation, in version 2 as it comes in the "COPYING" file of the
- * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
- * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
- *
- * The contents of this file may alternatively be used under the terms
- * of the Common Development and Distribution License Version 1.0
- * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
- * VirtualBox OSE distribution, in which case the provisions of the
- * CDDL are applicable instead of those of the GPL.
- *
- * You may elect to license modified versions of this file under the
- * terms and conditions of either the GPL or the CDDL or both.
- */
-
-
-#include <Windows.h>
-
-#undef NTSYSAPI
-#define NTSYSAPI __declspec(dllexport)
-
-typedef LONG NTSTATUS;
-typedef PVOID PIO_STATUS_BLOCK;
-typedef INT FILE_INFORMATION_CLASS;
-typedef INT FS_INFORMATION_CLASS;
-typedef INT MEMORY_INFORMATION_CLASS;
-typedef INT PROCESSINFOCLASS;
-typedef PVOID POBJECT_ATTRIBUTES;
-typedef PVOID PIO_APC_ROUTINE;
-typedef PVOID PUNICODE_STRING;
-
-
-/* Error/status conversion: */
-
-NTSYSAPI ULONG NTAPI RtlNtStatusToDosError(IN NTSTATUS Status)
-{
- return 1;
-}
-
-
-/* Queries: */
-
-NTSYSAPI LONG NTAPI NtQueryTimerResolution(OUT PULONG MaximumResolution,
- OUT PULONG MinimumResolution,
- OUT PULONG CurrentResolution)
-{
- return -1;
-}
-
-NTSYSAPI LONG NTAPI NtQueryDirectoryFile(IN HANDLE FileHandle,
- IN HANDLE Event OPTIONAL,
- IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
- IN PVOID ApcContext OPTIONAL,
- OUT PIO_STATUS_BLOCK IoStatusBlock,
- OUT PVOID FileInformation,
- IN ULONG Length,
- IN FILE_INFORMATION_CLASS FileInformationClass,
- IN BOOLEAN ReturnSingleEntry,
- IN PUNICODE_STRING FileName OPTIONAL,
- IN BOOLEAN RestartScan)
-{
- return -1;
-}
-
-NTSYSAPI LONG NTAPI NtQueryDirectoryObject(IN HANDLE ObjectHandle,
- OUT PVOID Buffer,
- IN ULONG Length,
- IN BOOLEAN ReturnSingleEntry,
- IN BOOLEAN RestartScan,
- IN OUT PULONG Context,
- OUT PULONG ReturneLength)
-{
- return -1;
-}
-
-NTSYSAPI NTSTATUS WINAPI NtQueryInformationFile(IN HANDLE h,
- OUT PIO_STATUS_BLOCK b,
- OUT PVOID pvBuf,
- IN LONG cbBuf,
- IN FILE_INFORMATION_CLASS e)
-{
- return -1;
-}
-
-NTSYSAPI NTSTATUS NTAPI NtQueryInformationProcess(IN HANDLE hProcess,
- IN PROCESSINFOCLASS enmProcInfo,
- OUT PVOID pvBuf,
- IN SIZE_T cbBuf,
- OUT PSIZE_T pcbReturned OPTIONAL)
-{
- return -1;
-}
-
-NTSYSAPI NTSTATUS NTAPI NtQueryVolumeInformationFile(IN HANDLE hFile,
- OUT PIO_STATUS_BLOCK IoStatusBlock,
- OUT PVOID pvBuf,
- IN ULONG cbBuf,
- IN FS_INFORMATION_CLASS FsInformationClass)
-{
- return -1;
-}
-
-NTSYSAPI NTSTATUS NTAPI NtQueryVirtualMemory(IN HANDLE hProcess,
- IN LPCVOID pvWhere,
- IN MEMORY_INFORMATION_CLASS MemoryInfo,
- OUT PVOID pvBuf,
- IN SIZE_T cbBuf,
- OUT PSIZE_T pcbReturned OPTIONAL)
-{
- return -1;
-}
-
-
-/* Setters: */
-
-NTSYSAPI NTSTATUS NTAPI NtSetInformationFile(IN HANDLE FileHandle,
- OUT PIO_STATUS_BLOCK IoStatusBlock,
- IN PVOID FileInformation,
- IN ULONG Length,
- IN FILE_INFORMATION_CLASS FileInformationClass)
-{
- return -1;
-}
-
-NTSYSAPI LONG NTAPI NtSetTimerResolution(IN ULONG DesiredResolution,
- IN BOOLEAN SetResolution,
- OUT PULONG CurrentResolution)
-{
- return -1;
-}
-
-
-
-/* Handles: */
-
-NTSYSAPI NTSTATUS NTAPI NtCreateFile(OUT PHANDLE FileHandle,
- IN ACCESS_MASK DesiredAccess,
- IN POBJECT_ATTRIBUTES ObjectAttributes,
- OUT PIO_STATUS_BLOCK IoStatusBlock,
- IN PLARGE_INTEGER AllocationSize OPTIONAL,
- IN ULONG FileAttributes,
- IN ULONG ShareAccess,
- IN ULONG CreateDisposition,
- IN ULONG CreateOptions,
- IN PVOID EaBuffer,
- IN ULONG EaLength)
-{
- return -1;
-}
-
-NTSYSAPI NTSTATUS NTAPI NtOpenDirectoryObject(OUT PHANDLE ObjectHandle,
- IN ACCESS_MASK DesiredAccess,
- IN POBJECT_ATTRIBUTES ObjectAttributes)
-{
- return -1;
-}
-
-NTSYSAPI NTSTATUS NTAPI NtClose(IN HANDLE Handle)
-{
- return -1;
-}
-
-NTSYSAPI NTSTATUS NTAPI NtDeviceIoControlFile(HANDLE FileHandle, HANDLE Event, PIO_APC_ROUTINE ApcRoutine, PVOID ApcContext,
- PIO_STATUS_BLOCK IoStatusBlock, ULONG IoControlCode, PVOID InputBuffer,
- LONG InputBufferLength, PVOID OutputBuffer, ULONG OutputBufferLength)
-{
- return -1;
-}
-
diff --git a/src/VBox/Runtime/r3/win/ntdll-mini-implib.def b/src/VBox/Runtime/r3/win/ntdll-mini-implib.def
index 62b082a26ec..2e58b32c299 100644
--- a/src/VBox/Runtime/r3/win/ntdll-mini-implib.def
+++ b/src/VBox/Runtime/r3/win/ntdll-mini-implib.def
@@ -4,7 +4,7 @@
;
;
-; Copyright (C) 2010-2013 Oracle Corporation
+; Copyright (C) 2010-2014 Oracle Corporation
;
; This file is part of VirtualBox Open Source Edition (OSE), as
; available from http://www.virtualbox.org. This file is free software;
@@ -26,18 +26,46 @@
LIBRARY ntdll.dll
EXPORTS
- RtlNtStatusToDosError
- NtQueryTimerResolution
- NtQueryDirectoryFile
- NtQueryDirectoryObject
- NtQueryInformationFile
- NtQueryInformationProcess
- NtSetInformationFile
- NtSetTimerResolution
- NtQueryVolumeInformationFile
- NtQueryVirtualMemory
- NtCreateFile
- NtClose
- NtOpenDirectoryObject
- NtDeviceIoControlFile
+ ; Exported name - The name x86 name sought by the linker.
+ ; - This needs to be defined as a symbol, we generate assembly.
+ NtClose ;;= _NtClose@4
+ NtCreateFile ;;= _NtCreateFile@44
+ NtCreateSection ;;= _NtCreateSection@28
+ NtDelayExecution ;;= _NtDelayExecution@8
+ NtDeviceIoControlFile ;;= _NtDeviceIoControlFile@40
+ NtDuplicateObject ;;= _NtDuplicateObject@28
+ NtOpenDirectoryObject ;;= _NtOpenDirectoryObject@12
+ NtOpenProcess ;;= _NtOpenProcess@16
+ NtOpenProcessToken ;;= _NtOpenProcessToken@12
+ NtOpenThreadToken ;;= _NtOpenThreadToken@16
+ NtQueryDirectoryFile ;;= _NtQueryDirectoryFile@44
+ NtQueryDirectoryObject ;;= _NtQueryDirectoryObject@28
+ NtQueryInformationFile ;;= _NtQueryInformationFile@20
+ NtQueryInformationProcess ;;= _NtQueryInformationProcess@20
+ NtQueryInformationThread ;;= _NtQueryInformationThread@20
+ NtQueryInformationToken ;;= _NtQueryInformationToken@20
+ NtQueryObject ;;= _NtQueryObject@20
+ NtQueryTimerResolution ;;= _NtQueryTimerResolution@12
+ NtQueryVirtualMemory ;;= _NtQueryVirtualMemory@24
+ NtQueryVolumeInformationFile ;;= _NtQueryVolumeInformationFile@20
+ NtReadFile ;;= _NtReadFile@36
+ NtReadVirtualMemory ;;= _NtReadVirtualMemory@20
+ NtSetInformationFile ;;= _NtSetInformationFile@20
+ NtSetInformationObject ;;= _NtSetInformationObject@16
+ NtSetInformationThread ;;= _NtSetInformationThread@16
+ NtSetTimerResolution ;;= _NtSetTimerResolution@12
+ NtWriteFile ;;= _NtWriteFile@36
+ NtWriteVirtualMemory ;;= _NtWriteVirtualMemory@20
+ NtYieldExecution ;;= _NtYieldExecution@0
+ ;;
+ RtlAddAccessAllowedAce ;;= _RtlAddAccessAllowedAce@16
+ RtlAddAccessDeniedAce ;;= _RtlAddAccessDeniedAce@16
+ RtlCopySid ;;= _RtlCopySid@12
+ RtlCreateAcl ;;= _RtlCreateAcl@12
+ RtlCreateSecurityDescriptor ;;= _RtlCreateSecurityDescriptor@8
+ RtlGetVersion ;;= _RtlGetVersion@4
+ RtlInitializeSid ;;= _RtlInitializeSid@12
+ RtlNtStatusToDosError ;;= _RtlNtStatusToDosError@4
+ RtlSetDaclSecurityDescriptor ;;= _RtlSetDaclSecurityDescriptor@16
+ RtlSubAuthoritySid ;;= _RtlSubAuthoritySid@8
diff --git a/src/VBox/Runtime/testcase/Makefile.kmk b/src/VBox/Runtime/testcase/Makefile.kmk
index 8f618f4ce25..c766c943236 100644
--- a/src/VBox/Runtime/testcase/Makefile.kmk
+++ b/src/VBox/Runtime/testcase/Makefile.kmk
@@ -48,6 +48,7 @@ PROGRAMS += \
tstRTAvl \
tstRTBase64 \
tstRTBitOperations \
+ tstRTBigNum \
tstRTCidr \
tstRTCritSect \
tstRTCritSectRw \
@@ -78,6 +79,7 @@ PROGRAMS += \
tstIprtMiniString \
tstLdr \
tstLdrLoad \
+ tstRTLdrVerifyPeImage \
tstRTList \
tstRTLockValidator \
tstLog \
@@ -206,6 +208,9 @@ tstRTAvl_SOURCES = tstRTAvl.cpp
tstRTBase64_TEMPLATE = VBOXR3TSTEXE
tstRTBase64_SOURCES = tstRTBase64.cpp
+tstRTBigNum_TEMPLATE = VBOXR3TSTEXE
+tstRTBigNum_SOURCES = tstRTBigNum.cpp
+
tstRTBitOperations_TEMPLATE = VBOXR3TSTEXE
tstRTBitOperations_SOURCES = tstRTBitOperations.cpp
@@ -398,6 +403,9 @@ tstLdr-4_LIBS = \
tstLdrLoad_TEMPLATE = VBOXR3TSTEXE
tstLdrLoad_SOURCES = tstLdrLoad.cpp
+tstRTLdrVerifyPeImage_TEMPLATE = VBOXR3TSTEXE
+tstRTLdrVerifyPeImage_SOURCES = tstRTLdrVerifyPeImage.cpp
+
tstRTList_TEMPLATE = VBOXR3TSTEXE
tstRTList_SOURCES = tstRTList.cpp
diff --git a/src/VBox/Runtime/testcase/tstRTBigNum.cpp b/src/VBox/Runtime/testcase/tstRTBigNum.cpp
new file mode 100644
index 00000000000..69639a9e0d3
--- /dev/null
+++ b/src/VBox/Runtime/testcase/tstRTBigNum.cpp
@@ -0,0 +1,852 @@
+/* $Id$ */
+/** @file
+ * IPRT - Testcase for the RTBigNum* functions.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include <iprt/bignum.h>
+
+#include <iprt/test.h>
+#include <iprt/string.h>
+
+
+/*******************************************************************************
+* Global Variables *
+*******************************************************************************/
+static RTTEST g_hTest;
+
+
+static uint8_t const g_abLargePositive[] =
+{
+ 0x67,0xcd,0xd6,0x60,0x4e,0xaa,0xe9,0x8e,0x06,0x99,0xde,0xb2,0xf5,0x1c,0xc3,0xfc,
+ 0xf5,0x17,0x41,0xec,0x42,0x68,0xf0,0xab,0x0e,0xe6,0x79,0xa8,0x32,0x97,0x55,0x00,
+ 0x49,0x21,0x2b,0x72,0x4b,0x34,0x33,0xe1,0xe2,0xfe,0xa2,0xb8,0x39,0x7a,0x2f,0x17,
+ 0xae,0x1f,0xbb,0xdb,0x46,0xbc,0x59,0x8b,0x13,0x05,0x28,0x96,0xf6,0xfd,0xc1,0xa4
+};
+static RTBIGNUM g_LargePositive;
+static RTBIGNUM g_LargePositive2; /**< Smaller than g_LargePositive. */
+
+static uint8_t const g_abLargePositiveMinus1[] =
+{
+ 0x67,0xcd,0xd6,0x60,0x4e,0xaa,0xe9,0x8e,0x06,0x99,0xde,0xb2,0xf5,0x1c,0xc3,0xfc,
+ 0xf5,0x17,0x41,0xec,0x42,0x68,0xf0,0xab,0x0e,0xe6,0x79,0xa8,0x32,0x97,0x55,0x00,
+ 0x49,0x21,0x2b,0x72,0x4b,0x34,0x33,0xe1,0xe2,0xfe,0xa2,0xb8,0x39,0x7a,0x2f,0x17,
+ 0xae,0x1f,0xbb,0xdb,0x46,0xbc,0x59,0x8b,0x13,0x05,0x28,0x96,0xf6,0xfd,0xc1,0xa3
+};
+static RTBIGNUM g_LargePositiveMinus1; /**< g_LargePositive - 1 */
+
+
+static uint8_t const g_abLargeNegative[] =
+{
+ 0xf2,0xde,0xbd,0xaf,0x43,0x9e,0x1e,0x88,0xdc,0x64,0x37,0xa9,0xdb,0xb7,0x26,0x31,
+ 0x92,0x1d,0xf5,0x43,0x4c,0xb0,0x21,0x2b,0x07,0x4e,0xf5,0x94,0x9e,0xce,0x15,0x79,
+ 0x13,0x0c,0x70,0x68,0x49,0x46,0xcf,0x72,0x2b,0xc5,0x8f,0xab,0x7c,0x88,0x2d,0x1e,
+ 0x3b,0x43,0x5b,0xdb,0x47,0x45,0x7a,0x25,0x74,0x46,0x1d,0x87,0x24,0xaa,0xab,0x0d,
+ 0x3e,0xdf,0xd1,0xd8,0x44,0x6f,0x01,0x84,0x01,0x36,0xe0,0x84,0x6e,0x6f,0x41,0xbb,
+ 0xae,0x1a,0x31,0xef,0x42,0x23,0xfd,0xda,0xda,0x0f,0x7d,0x88,0x8f,0xf5,0x63,0x72,
+ 0x36,0x9f,0xa9,0xa4,0x4f,0xa0,0xa6,0xb1,0x3b,0xbe,0x0d,0x9d,0x62,0x88,0x98,0x8b
+};
+static RTBIGNUM g_LargeNegative;
+static RTBIGNUM g_LargeNegative2; /**< A few digits less than g_LargeNegative, i.e. larger value. */
+
+static uint8_t const g_abLargeNegativePluss1[] =
+{
+ 0xf2,0xde,0xbd,0xaf,0x43,0x9e,0x1e,0x88,0xdc,0x64,0x37,0xa9,0xdb,0xb7,0x26,0x31,
+ 0x92,0x1d,0xf5,0x43,0x4c,0xb0,0x21,0x2b,0x07,0x4e,0xf5,0x94,0x9e,0xce,0x15,0x79,
+ 0x13,0x0c,0x70,0x68,0x49,0x46,0xcf,0x72,0x2b,0xc5,0x8f,0xab,0x7c,0x88,0x2d,0x1e,
+ 0x3b,0x43,0x5b,0xdb,0x47,0x45,0x7a,0x25,0x74,0x46,0x1d,0x87,0x24,0xaa,0xab,0x0d,
+ 0x3e,0xdf,0xd1,0xd8,0x44,0x6f,0x01,0x84,0x01,0x36,0xe0,0x84,0x6e,0x6f,0x41,0xbb,
+ 0xae,0x1a,0x31,0xef,0x42,0x23,0xfd,0xda,0xda,0x0f,0x7d,0x88,0x8f,0xf5,0x63,0x72,
+ 0x36,0x9f,0xa9,0xa4,0x4f,0xa0,0xa6,0xb1,0x3b,0xbe,0x0d,0x9d,0x62,0x88,0x98,0x8c
+};
+static RTBIGNUM g_LargeNegativePluss1; /**< g_LargeNegative + 1 */
+
+
+static uint8_t const g_ab64BitPositive1[] = { 0x53, 0xe0, 0xdf, 0x11, 0x85, 0x93, 0x06, 0x21 };
+static uint64_t g_u64BitPositive1 = UINT64_C(0x53e0df1185930621);
+static RTBIGNUM g_64BitPositive1;
+
+
+static RTBIGNUM g_Zero;
+static RTBIGNUM g_One;
+static RTBIGNUM g_Two;
+static RTBIGNUM g_Three;
+static RTBIGNUM g_Four;
+static RTBIGNUM g_Five;
+static RTBIGNUM g_Ten;
+static RTBIGNUM g_FourtyTwo;
+
+static uint8_t const g_abMinus1[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
+static int64_t g_iBitMinus1 = -1;
+static RTBIGNUM g_Minus1;
+
+
+
+static void testInitOneLittleEndian(uint8_t const *pb, size_t cb, PRTBIGNUM pBigNum)
+{
+ uint8_t abLittleEndian[sizeof(g_abLargePositive) + sizeof(g_abLargeNegative)];
+ RTTESTI_CHECK_RETV(cb <= sizeof(abLittleEndian));
+
+ size_t cbLeft = cb;
+ uint8_t *pbDst = abLittleEndian + cb - 1;
+ uint8_t const *pbSrc = pb;
+ while (cbLeft-- > 0)
+ *pbDst-- = *pbSrc++;
+
+ RTBIGNUM Num;
+ RTTESTI_CHECK_RC_RETV(RTBigNumInit(&Num, RTBIGNUMINIT_F_ENDIAN_LITTLE | RTBIGNUMINIT_F_SIGNED,
+ abLittleEndian, cb), VINF_SUCCESS);
+ RTTESTI_CHECK(Num.fNegative == pBigNum->fNegative);
+ RTTESTI_CHECK(Num.cUsed == pBigNum->cUsed);
+ RTTESTI_CHECK(RTBigNumCompare(&Num, pBigNum) == 0);
+ RTTESTI_CHECK_RC(RTBigNumDestroy(&Num), VINF_SUCCESS);
+
+ RTTESTI_CHECK_RC_RETV(RTBigNumInit(&Num, RTBIGNUMINIT_F_ENDIAN_LITTLE | RTBIGNUMINIT_F_SIGNED | RTBIGNUMINIT_F_SENSITIVE,
+ abLittleEndian, cb), VINF_SUCCESS);
+ RTTESTI_CHECK(Num.fNegative == pBigNum->fNegative);
+ RTTESTI_CHECK(Num.cUsed == pBigNum->cUsed);
+ RTTESTI_CHECK(RTBigNumCompare(&Num, pBigNum) == 0);
+ RTTESTI_CHECK_RC(RTBigNumDestroy(&Num), VINF_SUCCESS);
+}
+
+static void testMoreInit(void)
+{
+ RTTESTI_CHECK(!g_LargePositive.fNegative);
+ RTTESTI_CHECK(!g_LargePositive.fSensitive);
+ RTTESTI_CHECK(!g_LargePositive2.fNegative);
+ RTTESTI_CHECK(!g_LargePositive2.fSensitive);
+ RTTESTI_CHECK(g_LargeNegative.fNegative);
+ RTTESTI_CHECK(!g_LargeNegative.fSensitive);
+ RTTESTI_CHECK(g_LargeNegative2.fNegative);
+ RTTESTI_CHECK(!g_LargeNegative2.fSensitive);
+
+ RTTESTI_CHECK(!g_Zero.fNegative);
+ RTTESTI_CHECK(!g_Zero.fSensitive);
+ RTTESTI_CHECK(g_Zero.cUsed == 0);
+
+ RTTESTI_CHECK(g_Minus1.fNegative);
+ RTTESTI_CHECK(!g_Minus1.fSensitive);
+ RTTESTI_CHECK(g_Minus1.cUsed == 1);
+ RTTESTI_CHECK(g_Minus1.pauElements[0] == 1);
+
+ RTTESTI_CHECK(g_One.cUsed == 1 && g_One.pauElements[0] == 1);
+ RTTESTI_CHECK(g_Two.cUsed == 1 && g_Two.pauElements[0] == 2);
+ RTTESTI_CHECK(g_Three.cUsed == 1 && g_Three.pauElements[0] == 3);
+ RTTESTI_CHECK(g_Four.cUsed == 1 && g_Four.pauElements[0] == 4);
+ RTTESTI_CHECK(g_Ten.cUsed == 1 && g_Ten.pauElements[0] == 10);
+ RTTESTI_CHECK(g_FourtyTwo.cUsed == 1 && g_FourtyTwo.pauElements[0] == 42);
+
+ /* Test big endian initialization w/ sensitive variation. */
+ testInitOneLittleEndian(g_abLargePositive, sizeof(g_abLargePositive), &g_LargePositive);
+ testInitOneLittleEndian(g_abLargePositive, sizeof(g_abLargePositive) - 11, &g_LargePositive2);
+
+ testInitOneLittleEndian(g_abLargeNegative, sizeof(g_abLargeNegative), &g_LargeNegative);
+ testInitOneLittleEndian(g_abLargeNegative, sizeof(g_abLargeNegative) - 9, &g_LargeNegative2);
+
+ RTTESTI_CHECK(g_Minus1.cUsed == 1);
+ testInitOneLittleEndian(g_abMinus1, sizeof(g_abMinus1), &g_Minus1);
+ testInitOneLittleEndian(g_abMinus1, 1, &g_Minus1);
+ testInitOneLittleEndian(g_abMinus1, 4, &g_Minus1);
+
+}
+
+
+static void testCompare(void)
+{
+ RTTestSub(g_hTest, "RTBigNumCompare*");
+ RTTESTI_CHECK(RTBigNumCompare(&g_LargePositive, &g_LargePositive) == 0);
+ RTTESTI_CHECK(RTBigNumCompare(&g_LargePositive2, &g_LargePositive) == -1);
+ RTTESTI_CHECK(RTBigNumCompare(&g_LargePositive, &g_LargePositive2) == 1);
+ RTTESTI_CHECK(RTBigNumCompare(&g_Zero, &g_LargePositive) == -1);
+ RTTESTI_CHECK(RTBigNumCompare(&g_LargePositive, &g_Zero) == 1);
+ RTTESTI_CHECK(RTBigNumCompare(&g_LargePositive2, &g_Zero) == 1);
+ RTTESTI_CHECK(RTBigNumCompare(&g_LargePositive, &g_LargePositiveMinus1) == 1);
+ RTTESTI_CHECK(RTBigNumCompare(&g_LargePositiveMinus1, &g_LargePositive) == -1);
+
+ RTTESTI_CHECK(RTBigNumCompare(&g_LargeNegative, &g_LargeNegative) == 0);
+ RTTESTI_CHECK(RTBigNumCompare(&g_LargeNegative, &g_LargeNegative2) == -1);
+ RTTESTI_CHECK(RTBigNumCompare(&g_LargeNegative2, &g_LargeNegative) == 1);
+ RTTESTI_CHECK(RTBigNumCompare(&g_Zero, &g_LargeNegative) == 1);
+ RTTESTI_CHECK(RTBigNumCompare(&g_LargeNegative, &g_Zero) == -1);
+ RTTESTI_CHECK(RTBigNumCompare(&g_LargeNegative2, &g_Zero) == -1);
+ RTTESTI_CHECK(RTBigNumCompare(&g_LargeNegative, &g_LargeNegativePluss1) == -1);
+ RTTESTI_CHECK(RTBigNumCompare(&g_LargeNegativePluss1, &g_LargeNegative) == 1);
+
+ RTTESTI_CHECK(RTBigNumCompare(&g_LargeNegative, &g_LargePositive) == -1);
+ RTTESTI_CHECK(RTBigNumCompare(&g_LargePositive, &g_LargeNegative) == 1);
+ RTTESTI_CHECK(RTBigNumCompare(&g_LargeNegative2, &g_LargePositive) == -1);
+ RTTESTI_CHECK(RTBigNumCompare(&g_LargePositive, &g_LargeNegative2) == 1);
+ RTTESTI_CHECK(RTBigNumCompare(&g_LargeNegative2, &g_LargePositive2) == -1);
+ RTTESTI_CHECK(RTBigNumCompare(&g_LargePositive2, &g_LargeNegative2) == 1);
+
+ RTTESTI_CHECK(RTBigNumCompareWithU64(&g_Zero, 0) == 0);
+ RTTESTI_CHECK(RTBigNumCompareWithU64(&g_Zero, 1) == -1);
+ RTTESTI_CHECK(RTBigNumCompareWithU64(&g_Zero, UINT32_MAX) == -1);
+ RTTESTI_CHECK(RTBigNumCompareWithU64(&g_Zero, UINT64_MAX) == -1);
+ RTTESTI_CHECK(RTBigNumCompareWithU64(&g_LargePositive, UINT64_MAX) == 1);
+ RTTESTI_CHECK(RTBigNumCompareWithU64(&g_LargePositive2, 0x7213593) == 1);
+ RTTESTI_CHECK(RTBigNumCompareWithU64(&g_LargeNegative, 0) == -1);
+ RTTESTI_CHECK(RTBigNumCompareWithU64(&g_LargeNegative, 1) == -1);
+ RTTESTI_CHECK(RTBigNumCompareWithU64(&g_LargeNegative, UINT64_MAX) == -1);
+ RTTESTI_CHECK(RTBigNumCompareWithU64(&g_LargeNegative, 0x80034053) == -1);
+ RTTESTI_CHECK(RTBigNumCompareWithU64(&g_64BitPositive1, g_u64BitPositive1) == 0);
+ RTTESTI_CHECK(RTBigNumCompareWithU64(&g_64BitPositive1, g_u64BitPositive1 - 1) == 1);
+ RTTESTI_CHECK(RTBigNumCompareWithU64(&g_64BitPositive1, g_u64BitPositive1 + 1) == -1);
+
+ RTTESTI_CHECK(RTBigNumCompareWithS64(&g_Zero, 0) == 0);
+ RTTESTI_CHECK(RTBigNumCompareWithS64(&g_Zero, 1) == -1);
+ RTTESTI_CHECK(RTBigNumCompareWithS64(&g_Zero, -1) == 1);
+ RTTESTI_CHECK(RTBigNumCompareWithS64(&g_Zero, INT32_MAX) == -1);
+ RTTESTI_CHECK(RTBigNumCompareWithS64(&g_LargeNegative, INT32_MIN) == -1);
+ RTTESTI_CHECK(RTBigNumCompareWithS64(&g_LargeNegative, INT64_MIN) == -1);
+ RTTESTI_CHECK(g_u64BitPositive1 < (uint64_t)INT64_MAX);
+ RTTESTI_CHECK(RTBigNumCompareWithS64(&g_64BitPositive1, g_u64BitPositive1) == 0);
+ RTTESTI_CHECK(RTBigNumCompareWithS64(&g_64BitPositive1, g_u64BitPositive1 - 1) == 1);
+ RTTESTI_CHECK(RTBigNumCompareWithS64(&g_64BitPositive1, g_u64BitPositive1 + 1) == -1);
+ RTTESTI_CHECK(RTBigNumCompareWithS64(&g_64BitPositive1, INT64_MIN) == 1);
+ RTTESTI_CHECK(RTBigNumCompareWithS64(&g_64BitPositive1, INT64_MAX) == -1);
+ RTTESTI_CHECK(RTBigNumCompareWithS64(&g_Minus1, -1) == 0);
+ RTTESTI_CHECK(RTBigNumCompareWithS64(&g_Minus1, -2) == 1);
+ RTTESTI_CHECK(RTBigNumCompareWithS64(&g_Minus1, 0) == -1);
+}
+
+
+static void testSubtraction(void)
+{
+ RTTestSub(g_hTest, "RTBigNumSubtract");
+
+ for (uint32_t fFlags = 0; fFlags <= RTBIGNUMINIT_F_SENSITIVE; fFlags += RTBIGNUMINIT_F_SENSITIVE)
+ {
+ RTBIGNUM Result;
+ RTTESTI_CHECK_RC_RETV(RTBigNumInitZero(&Result, fFlags), VINF_SUCCESS);
+ RTBIGNUM Result2;
+ RTTESTI_CHECK_RC_RETV(RTBigNumInitZero(&Result2, fFlags), VINF_SUCCESS);
+
+ RTTESTI_CHECK_RC(RTBigNumSubtract(&Result, &g_Minus1, &g_Minus1), VINF_SUCCESS);
+ RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 0) == 0);
+
+ RTTESTI_CHECK_RC(RTBigNumSubtract(&Result, &g_Zero, &g_Minus1), VINF_SUCCESS);
+ RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 1) == 0);
+
+ RTTESTI_CHECK_RC(RTBigNumSubtract(&Result, &g_Minus1, &g_Zero), VINF_SUCCESS);
+ RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, -1) == 0);
+
+ RTTESTI_CHECK_RC(RTBigNumSubtract(&Result, &g_64BitPositive1, &g_Minus1), VINF_SUCCESS);
+ RTTESTI_CHECK(RTBigNumCompareWithU64(&Result, g_u64BitPositive1 + 1) == 0);
+
+ RTTESTI_CHECK_RC(RTBigNumSubtract(&Result, &g_Minus1, &g_64BitPositive1), VINF_SUCCESS);
+ RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, INT64_C(-1) - g_u64BitPositive1) == 0);
+
+ RTTESTI_CHECK_RC(RTBigNumSubtract(&Result, &g_LargePositive, &g_LargePositiveMinus1), VINF_SUCCESS);
+ RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 1) == 0);
+ RTTESTI_CHECK(Result.cUsed == 1);
+
+ RTTESTI_CHECK_RC(RTBigNumSubtract(&Result, &g_LargePositiveMinus1, &g_LargePositive), VINF_SUCCESS);
+ RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, -1) == 0);
+ RTTESTI_CHECK(Result.cUsed == 1);
+
+ RTTESTI_CHECK(RTBigNumCompare(&g_LargeNegative, &g_LargeNegativePluss1) < 0);
+ RTTESTI_CHECK_RC(RTBigNumSubtract(&Result, &g_LargeNegative, &g_LargeNegativePluss1), VINF_SUCCESS);
+ RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, -1) == 0);
+ RTTESTI_CHECK(Result.cUsed == 1);
+
+ RTTESTI_CHECK_RC(RTBigNumSubtract(&Result, &g_LargeNegativePluss1, &g_LargeNegative), VINF_SUCCESS);
+ RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 1) == 0);
+ RTTESTI_CHECK(Result.cUsed == 1);
+
+ RTTESTI_CHECK_RC(RTBigNumSubtract(&Result, &g_LargeNegativePluss1, &g_LargeNegativePluss1), VINF_SUCCESS);
+ RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 0) == 0);
+ RTTESTI_CHECK(Result.cUsed == 0);
+
+ RTTESTI_CHECK_RC(RTBigNumDestroy(&Result), VINF_SUCCESS);
+ RTTESTI_CHECK_RC(RTBigNumDestroy(&Result2), VINF_SUCCESS);
+ }
+}
+
+
+static void testAddition(void)
+{
+ RTTestSub(g_hTest, "RTBigNumAdd");
+
+ for (uint32_t fFlags = 0; fFlags <= RTBIGNUMINIT_F_SENSITIVE; fFlags += RTBIGNUMINIT_F_SENSITIVE)
+ {
+ RTBIGNUM Result;
+ RTTESTI_CHECK_RC_RETV(RTBigNumInitZero(&Result, fFlags), VINF_SUCCESS);
+ RTBIGNUM Result2;
+ RTTESTI_CHECK_RC_RETV(RTBigNumInitZero(&Result2, fFlags), VINF_SUCCESS);
+
+ RTTESTI_CHECK_RC(RTBigNumAdd(&Result, &g_Minus1, &g_Minus1), VINF_SUCCESS);
+ RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, -2) == 0);
+
+ RTTESTI_CHECK_RC(RTBigNumAdd(&Result, &g_Zero, &g_Minus1), VINF_SUCCESS);
+ RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, -1) == 0);
+
+ RTTESTI_CHECK_RC(RTBigNumAdd(&Result, &g_Zero, &g_64BitPositive1), VINF_SUCCESS);
+ RTTESTI_CHECK(RTBigNumCompareWithU64(&Result, g_u64BitPositive1) == 0);
+
+ RTTESTI_CHECK_RC(RTBigNumAdd(&Result, &g_Minus1, &g_64BitPositive1), VINF_SUCCESS);
+ RTTESTI_CHECK(RTBigNumCompareWithU64(&Result, g_u64BitPositive1 - 1) == 0);
+
+ RTTESTI_CHECK(g_u64BitPositive1 * 2 > g_u64BitPositive1);
+ RTTESTI_CHECK_RC(RTBigNumAdd(&Result, &g_64BitPositive1, &g_64BitPositive1), VINF_SUCCESS);
+ RTTESTI_CHECK(RTBigNumCompareWithU64(&Result, g_u64BitPositive1 * 2) == 0);
+
+
+ RTTESTI_CHECK_RC(RTBigNumAssign(&Result2, &g_LargePositive), VINF_SUCCESS);
+ RTTESTI_CHECK_RC(RTBigNumNegateThis(&Result2), VINF_SUCCESS);
+
+ RTTESTI_CHECK_RC(RTBigNumAdd(&Result, &g_LargePositive, &Result2), VINF_SUCCESS);
+ RTTESTI_CHECK(RTBigNumCompareWithU64(&Result, 0) == 0);
+
+ RTTESTI_CHECK_RC(RTBigNumAdd(&Result, &Result2, &g_LargePositive), VINF_SUCCESS);
+ RTTESTI_CHECK(RTBigNumCompareWithU64(&Result, 0) == 0);
+
+ RTTESTI_CHECK_RC(RTBigNumAdd(&Result, &g_LargePositiveMinus1, &Result2), VINF_SUCCESS);
+ RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, -1) == 0);
+
+ RTTESTI_CHECK_RC(RTBigNumAdd(&Result, &Result2, &g_LargePositiveMinus1), VINF_SUCCESS);
+ RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, -1) == 0);
+
+
+ RTTESTI_CHECK_RC(RTBigNumAdd(&Result, &g_LargePositive, &g_LargePositiveMinus1), VINF_SUCCESS);
+ RTTESTI_CHECK(RTBigNumCompare(&Result, &g_LargePositive) > 0);
+ RTTESTI_CHECK_RC(RTBigNumSubtract(&Result2, &Result, &g_LargePositiveMinus1), VINF_SUCCESS);
+ RTTESTI_CHECK(RTBigNumCompare(&Result2, &g_LargePositive) == 0);
+ RTTESTI_CHECK_RC(RTBigNumSubtract(&Result2, &Result, &g_LargePositive), VINF_SUCCESS);
+ RTTESTI_CHECK(RTBigNumCompare(&Result2, &g_LargePositiveMinus1) == 0);
+
+ RTTESTI_CHECK_RC(RTBigNumAdd(&Result, &g_LargePositive, &g_LargeNegative), VINF_SUCCESS);
+ RTTESTI_CHECK(RTBigNumCompare(&Result, &g_LargeNegative) > 0);
+ RTTESTI_CHECK(RTBigNumCompare(&Result, &g_LargePositive) < 0);
+ RTTESTI_CHECK_RC(RTBigNumSubtract(&Result2, &Result, &g_LargePositive), VINF_SUCCESS);
+ RTTESTI_CHECK(RTBigNumCompare(&Result2, &g_LargeNegative) == 0);
+ RTTESTI_CHECK_RC(RTBigNumSubtract(&Result2, &Result, &g_LargeNegative), VINF_SUCCESS);
+ RTTESTI_CHECK(RTBigNumCompare(&Result2, &g_LargePositive) == 0);
+
+ RTTESTI_CHECK_RC(RTBigNumAdd(&Result, &g_LargeNegativePluss1, &g_LargeNegative), VINF_SUCCESS);
+ RTTESTI_CHECK(RTBigNumCompare(&Result, &g_LargeNegative) < 0);
+ RTTESTI_CHECK_RC(RTBigNumSubtract(&Result2, &Result, &g_LargeNegative), VINF_SUCCESS);
+ RTTESTI_CHECK(RTBigNumCompare(&Result2, &g_LargeNegativePluss1) == 0);
+
+ RTTESTI_CHECK_RC(RTBigNumDestroy(&Result), VINF_SUCCESS);
+ RTTESTI_CHECK_RC(RTBigNumDestroy(&Result2), VINF_SUCCESS);
+ }
+}
+
+static bool testHexStringToNum(PRTBIGNUM pBigNum, const char *pszHex, uint32_t fFlags)
+{
+ uint8_t abBuf[_4K];
+ size_t cbHex = strlen(pszHex);
+ RTTESTI_CHECK_RET(!(cbHex & 1), false);
+ cbHex /= 2;
+ RTTESTI_CHECK_RET(cbHex < sizeof(abBuf), false);
+ RTTESTI_CHECK_RC_RET(RTStrConvertHexBytes(pszHex, abBuf, cbHex, 0), VINF_SUCCESS, false);
+ RTTESTI_CHECK_RC_RET(RTBigNumInit(pBigNum, RTBIGNUMINIT_F_ENDIAN_BIG | fFlags, abBuf, cbHex), VINF_SUCCESS, false);
+ return true;
+}
+
+static void testMultiplication(void)
+{
+ RTTestSub(g_hTest, "RTBigNumMultiply");
+
+ for (uint32_t fFlags = 0; fFlags <= RTBIGNUMINIT_F_SENSITIVE; fFlags += RTBIGNUMINIT_F_SENSITIVE)
+ {
+ RTBIGNUM Result;
+ RTTESTI_CHECK_RC_RETV(RTBigNumInitZero(&Result, fFlags), VINF_SUCCESS);
+ RTBIGNUM Result2;
+ RTTESTI_CHECK_RC_RETV(RTBigNumInitZero(&Result2, fFlags), VINF_SUCCESS);
+
+ RTTESTI_CHECK_RC(RTBigNumMultiply(&Result, &g_Minus1, &g_Minus1), VINF_SUCCESS);
+ RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 1) == 0);
+
+ RTTESTI_CHECK_RC(RTBigNumMultiply(&Result, &g_Zero, &g_Minus1), VINF_SUCCESS);
+ RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 0) == 0);
+ RTTESTI_CHECK_RC(RTBigNumMultiply(&Result, &g_Minus1, &g_Zero), VINF_SUCCESS);
+ RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 0) == 0);
+
+ RTTESTI_CHECK_RC(RTBigNumMultiply(&Result, &g_Minus1, &g_64BitPositive1), VINF_SUCCESS);
+ RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, -(int64_t)g_u64BitPositive1) == 0);
+ RTTESTI_CHECK_RC(RTBigNumMultiply(&Result, &g_64BitPositive1, &g_Minus1), VINF_SUCCESS);
+ RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, -(int64_t)g_u64BitPositive1) == 0);
+
+
+ static struct
+ {
+ const char *pszF1, *pszF2, *pszResult;
+ } s_aTests[] =
+ {
+ {
+ "29865DBFA717181B9DD4B515BD072DE10A5A314385F6DED735AC553FCD307D30C499",
+ "4DD65692F7365B90C55F63988E5B6C448653E7DB9DD941507586BD8CF71398287C",
+ "0CA02E8FFDB0EEA37264338A4AAA91C8974E162DDFCBCF804B434A11955671B89B3645AAB75423D60CA3459B0B4F3F28978DA768779FB54CF362FD61924637582F221C"
+ },
+ {
+ "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
+ "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
+ "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0000000000000000000000000000000000000001"
+ }
+ };
+ for (uint32_t i = 0; i < RT_ELEMENTS(s_aTests); i++)
+ {
+ RTBIGNUM F1, F2, Expected;
+ if ( testHexStringToNum(&F1, s_aTests[i].pszF1, RTBIGNUMINIT_F_UNSIGNED | fFlags)
+ && testHexStringToNum(&F2, s_aTests[i].pszF2, RTBIGNUMINIT_F_UNSIGNED | fFlags)
+ && testHexStringToNum(&Expected, s_aTests[i].pszResult, RTBIGNUMINIT_F_UNSIGNED | fFlags))
+ {
+ RTTESTI_CHECK_RC(RTBigNumMultiply(&Result, &F1, &F2), VINF_SUCCESS);
+ RTTESTI_CHECK(RTBigNumCompare(&Result, &Expected) == 0);
+ RTTESTI_CHECK_RC(RTBigNumDestroy(&F1), VINF_SUCCESS);
+ RTTESTI_CHECK_RC(RTBigNumDestroy(&F2), VINF_SUCCESS);
+ RTTESTI_CHECK_RC(RTBigNumDestroy(&Expected), VINF_SUCCESS);
+ }
+ }
+ RTTESTI_CHECK_RC(RTBigNumDestroy(&Result), VINF_SUCCESS);
+ RTTESTI_CHECK_RC(RTBigNumDestroy(&Result2), VINF_SUCCESS);
+ }
+}
+
+
+static void testDivision(void)
+{
+ RTTestSub(g_hTest, "RTBigNumDivide");
+
+ for (uint32_t fFlags = 0; fFlags <= RTBIGNUMINIT_F_SENSITIVE; fFlags += RTBIGNUMINIT_F_SENSITIVE)
+ {
+ RTBIGNUM Quotient;
+ RTTESTI_CHECK_RC_RETV(RTBigNumInitZero(&Quotient, fFlags), VINF_SUCCESS);
+ RTBIGNUM Remainder;
+ RTTESTI_CHECK_RC_RETV(RTBigNumInitZero(&Remainder, fFlags), VINF_SUCCESS);
+
+ RTTESTI_CHECK_RC(RTBigNumDivide(&Quotient, &Remainder, &g_Minus1, &g_Minus1), VINF_SUCCESS);
+ RTTESTI_CHECK(RTBigNumCompareWithS64(&Quotient, 1) == 0);
+ RTTESTI_CHECK(RTBigNumCompareWithS64(&Remainder, 0) == 0);
+
+ RTTESTI_CHECK_RC(RTBigNumDivide(&Quotient, &Remainder, &g_Zero, &g_Minus1), VINF_SUCCESS);
+ RTTESTI_CHECK(RTBigNumCompareWithS64(&Quotient, 0) == 0);
+ RTTESTI_CHECK(RTBigNumCompareWithS64(&Remainder, 0) == 0);
+
+ RTTESTI_CHECK_RC(RTBigNumDivide(&Quotient, &Remainder, &g_Minus1, &g_Zero), VERR_BIGNUM_DIV_BY_ZERO);
+ RTTESTI_CHECK_RC(RTBigNumDivide(&Quotient, &Remainder, &g_LargeNegative, &g_Zero), VERR_BIGNUM_DIV_BY_ZERO);
+ RTTESTI_CHECK_RC(RTBigNumDivide(&Quotient, &Remainder, &g_LargePositive, &g_Zero), VERR_BIGNUM_DIV_BY_ZERO);
+
+ RTTESTI_CHECK_RC(RTBigNumDivide(&Quotient, &Remainder, &g_Four, &g_Two), VINF_SUCCESS);
+ RTTESTI_CHECK(RTBigNumCompareWithS64(&Quotient, 2) == 0);
+ RTTESTI_CHECK(RTBigNumCompareWithS64(&Remainder, 0) == 0);
+
+ RTTESTI_CHECK_RC(RTBigNumDivide(&Quotient, &Remainder, &g_Three, &g_Two), VINF_SUCCESS);
+ RTTESTI_CHECK(RTBigNumCompareWithS64(&Quotient, 1) == 0);
+ RTTESTI_CHECK(RTBigNumCompareWithS64(&Remainder, 1) == 0);
+
+ RTTESTI_CHECK_RC(RTBigNumDivide(&Quotient, &Remainder, &g_Ten, &g_Two), VINF_SUCCESS);
+ RTTESTI_CHECK(RTBigNumCompareWithS64(&Quotient, 5) == 0);
+ RTTESTI_CHECK(RTBigNumCompareWithS64(&Remainder, 0) == 0);
+
+
+ RTTESTI_CHECK_RC(RTBigNumDivide(&Quotient, &Remainder, &g_LargePositive, &g_LargePositiveMinus1), VINF_SUCCESS);
+ RTTESTI_CHECK(RTBigNumCompareWithS64(&Quotient, 1) == 0);
+ RTTESTI_CHECK(RTBigNumCompareWithS64(&Remainder, 1) == 0);
+
+ RTTESTI_CHECK_RC(RTBigNumDivide(&Quotient, &Remainder, &g_LargeNegative, &g_LargeNegativePluss1), VINF_SUCCESS);
+ RTTESTI_CHECK(RTBigNumCompareWithS64(&Quotient, 1) == 0);
+ RTTESTI_CHECK(RTBigNumCompareWithS64(&Remainder, -1) == 0);
+
+
+#if 0
+ static struct
+ {
+ const char *pszF1, *pszF2, *pszQuotient, *pszRemainder;
+ } s_aTests[] =
+ {
+ {
+ "29865DBFA717181B9DD4B515BD072DE10A5A314385F6DED735AC553FCD307D30C499",
+ "4DD65692F7365B90C55F63988E5B6C448653E7DB9DD941507586BD8CF71398287C",
+ "0CA02E8FFDB0EEA37264338A4AAA91C8974E162DDFCBCF804B434A11955671B89B3645AAB75423D60CA3459B0B4F3F28978DA768779FB54CF362FD61924637582F221C"
+ },
+ {
+ "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
+ "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
+ "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0000000000000000000000000000000000000001"
+ }
+ };
+ for (uint32_t i = 0; i < RT_ELEMENTS(s_aTests); i++)
+ {
+ RTBIGNUM F1, F2, Expected;
+ if ( testHexStringToNum(&F1, s_aTests[i].pszF1, RTBIGNUMINIT_F_UNSIGNED | fFlags)
+ && testHexStringToNum(&F2, s_aTests[i].pszF2, RTBIGNUMINIT_F_UNSIGNED | fFlags)
+ && testHexStringToNum(&Expected, s_aTests[i].pszResult, RTBIGNUMINIT_F_UNSIGNED | fFlags))
+ {
+ RTTESTI_CHECK_RC(RTBigNumDivide(&Quotient, &Remainder, &F1, &F2), VINF_SUCCESS);
+ RTTESTI_CHECK(RTBigNumCompare(&Quotient, &Expected) == 0);
+ RTTESTI_CHECK_RC(RTBigNumDestroy(&F1), VINF_SUCCESS);
+ RTTESTI_CHECK_RC(RTBigNumDestroy(&F2), VINF_SUCCESS);
+ RTTESTI_CHECK_RC(RTBigNumDestroy(&Expected), VINF_SUCCESS);
+ }
+ }
+#endif
+ RTTESTI_CHECK_RC(RTBigNumDestroy(&Quotient), VINF_SUCCESS);
+ RTTESTI_CHECK_RC(RTBigNumDestroy(&Remainder), VINF_SUCCESS);
+ }
+}
+
+
+static void testModulo(void)
+{
+ RTTestSub(g_hTest, "RTBigNumModulo");
+
+ for (uint32_t fFlags = 0; fFlags <= RTBIGNUMINIT_F_SENSITIVE; fFlags += RTBIGNUMINIT_F_SENSITIVE)
+ {
+ RTBIGNUM Result;
+ RTTESTI_CHECK_RC_RETV(RTBigNumInitZero(&Result, fFlags), VINF_SUCCESS);
+ RTBIGNUM Tmp;
+ RTTESTI_CHECK_RC_RETV(RTBigNumInitZero(&Tmp, fFlags), VINF_SUCCESS);
+
+ RTTESTI_CHECK_RC(RTBigNumModulo(&Result, &g_Minus1, &g_Minus1), VINF_SUCCESS);
+ RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 0) == 0);
+
+ RTTESTI_CHECK_RC(RTBigNumModulo(&Result, &g_Zero, &g_Minus1), VINF_SUCCESS);
+ RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 0) == 0);
+
+ RTTESTI_CHECK_RC(RTBigNumModulo(&Result, &g_Minus1, &g_Zero), VERR_BIGNUM_DIV_BY_ZERO);
+ RTTESTI_CHECK_RC(RTBigNumModulo(&Result, &g_LargeNegative, &g_Zero), VERR_BIGNUM_DIV_BY_ZERO);
+ RTTESTI_CHECK_RC(RTBigNumModulo(&Result, &g_LargePositive, &g_Zero), VERR_BIGNUM_DIV_BY_ZERO);
+
+ RTTESTI_CHECK_RC(RTBigNumModulo(&Result, &g_Four, &g_Two), VINF_SUCCESS);
+ RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 0) == 0);
+
+ RTTESTI_CHECK_RC(RTBigNumModulo(&Result, &g_Three, &g_Two), VINF_SUCCESS);
+ RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 1) == 0);
+
+ RTTESTI_CHECK_RC(RTBigNumModulo(&Result, &g_Ten, &g_Two), VINF_SUCCESS);
+ RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 0) == 0);
+
+ RTTESTI_CHECK_RC(RTBigNumModulo(&Result, &g_LargePositive, &g_LargePositiveMinus1), VINF_SUCCESS);
+ RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 1) == 0);
+
+ RTTESTI_CHECK_RC(RTBigNumModulo(&Result, &g_LargePositiveMinus1, &g_LargePositive), VINF_SUCCESS);
+ RTTESTI_CHECK(RTBigNumCompare(&Result, &g_LargePositiveMinus1) == 0);
+
+ RTTESTI_CHECK_RC(RTBigNumAdd(&Result, &g_LargePositiveMinus1, &g_LargePositive), VINF_SUCCESS);
+ RTTESTI_CHECK_RC(RTBigNumAdd(&Tmp, &g_LargePositive, &Result), VINF_SUCCESS);
+ RTTESTI_CHECK_RC(RTBigNumModulo(&Result, &Tmp, &g_LargePositiveMinus1), VINF_SUCCESS);
+ RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 2) == 0);
+ RTTESTI_CHECK_RC(RTBigNumModulo(&Result, &Tmp, &g_LargePositive), VINF_SUCCESS);
+ RTTESTI_CHECK(RTBigNumCompare(&Result, &g_LargePositiveMinus1) == 0);
+
+ RTTESTI_CHECK_RC(RTBigNumModulo(&Result, &g_LargeNegative, &g_LargeNegativePluss1), VINF_SUCCESS);
+ RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, -1) == 0);
+
+ RTTESTI_CHECK_RC(RTBigNumDestroy(&Result), VINF_SUCCESS);
+ }
+}
+
+
+static void testExponentiation(void)
+{
+ RTTestSub(g_hTest, "RTBigNumExponentiate");
+
+ for (uint32_t fFlags = 0; fFlags <= RTBIGNUMINIT_F_SENSITIVE; fFlags += RTBIGNUMINIT_F_SENSITIVE)
+ {
+ RTBIGNUM Result;
+ RTTESTI_CHECK_RC_RETV(RTBigNumInitZero(&Result, fFlags), VINF_SUCCESS);
+ RTBIGNUM Result2;
+ RTTESTI_CHECK_RC_RETV(RTBigNumInitZero(&Result2, fFlags), VINF_SUCCESS);
+
+ RTTESTI_CHECK_RC(RTBigNumExponentiate(&Result, &g_One, &g_One), VINF_SUCCESS);
+ RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 1) == 0);
+
+ RTTESTI_CHECK_RC(RTBigNumExponentiate(&Result, &g_Two, &g_One), VINF_SUCCESS);
+ RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 2) == 0);
+
+ RTTESTI_CHECK_RC(RTBigNumExponentiate(&Result, &g_Two, &g_Two), VINF_SUCCESS);
+ RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 4) == 0);
+
+ RTTESTI_CHECK_RC(RTBigNumExponentiate(&Result, &g_Two, &g_Ten), VINF_SUCCESS);
+ RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 1024) == 0);
+
+ RTTESTI_CHECK_RC(RTBigNumExponentiate(&Result, &g_Five, &g_Five), VINF_SUCCESS);
+ RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 3125) == 0);
+
+ RTTESTI_CHECK_RC(RTBigNumExponentiate(&Result, &g_Five, &g_Ten), VINF_SUCCESS);
+ RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 9765625) == 0);
+
+ static struct
+ {
+ const char *pszBase, *pszExponent, *pszResult;
+ } s_aTests[] =
+ {
+ {
+ "180DB4284A119D6133AE4BB0C27C27D1", /*^*/ "3A", /* = */
+ "04546412B9E39476F10009F62608F614774C5AE475482434F138C3EA976583ECE09E58F1F03CE41F821A1D5DA59B69D031290B0AC7F7D5058E3AFA2CA3DAA7261D1620CA"
+ "D050576C0AFDF51ADBFCB9073B9D8324E816EA6BE4648DF68092F6617ED609045E6BE9D5410AE2CFF725832414E67656233F4DFA952461D321282426D50E2AF524D779EC"
+ "0744547E8A4F0768C2C49AF3A5A89D129430CA58456BE4534BC53C67523506C7A8B5770D88CF28B6B3EEBE73F3EA71BA2CE27C4C89BE0D699922B1A1EB20143CB0830A43"
+ "D864DDFFF026BA781614C2D55F3EDEA7257B93A0F40824E57D6EDFCFFB4611C316374D0D15698E6584851F1898DCAE75FC4D180908763DDB2FF93766EF144D091274AFE5"
+ "6980A1F4F574D577DAD833EA9486A4B499BFCA9C08225D7BDB2C632B4D9B53EF51C02ED419F22657D626064BCC2B083CD664E1A8D68F82F33233A833AC98AA0282B8B88D"
+ "A430CF2E581A1C7C4A1D646CA42760ED10C398F7C032A94D53964E6885B5C1CA884EC15081D4C010978627C85767FEC6F93364044EA86567F9610ABFB837808CC995FB5F"
+ "710B21CE198E0D4AD9F73C3BD56CB9965C85C790BF3F4B326B5245BFA81783126217BF80687C4A8AA3AE80969A4407191B4F90E71A0ABCCB5FEDD40477CE9D10FBAEF103"
+ "8457AB19BD793CECDFF8B29A96F12F590BFED544E08F834A44DEEF461281C40024EFE9388689AAC69BCBAB3D06434172D9319F30754756E1CF77B300679215BEBD27FC20"
+ "A2F1D2029BC767D4894A5F7B21BD784CD1DD4F41697839969CB6D2AA1E0AFA5D3D644A792586F681EB36475CAE59EB457E55D6AC2E286E196BFAC000C7389A96C514552D"
+ "5D9D3DD962F72DAE4A7575A9A67856646239560A39E50826BB2523598C8F8FF0EC8D09618378E9F362A8FBFE842B55CD1855A95D8A5E93B8B91D31EB8FBBF57113F06171"
+ "BB69B81C4240EC4C7D1AC67EA1CE4CEBEE71828917EC1CF500E1AD2F09535F5498CD6E613383810A840A265AED5DD20AE58FFF2D0DEB8EF99FA494B22714F520E8E8B684"
+ "5E8521966A7B1699236998A730FDF9F049CE2A4EA44D1EBC3B9754908848540D0DEE64A6D60E2BFBC3362B659C10543BDC20C1BAD3D68B173442C100C2C366CB885E8490"
+ "EDB977E49E9D51D4427B73B3B999AF4BA17685387182C3918D20808197A2E3FCDD0F66ECDEC05542C23A08B94C83BDF93606A49E9A0645B002CFCA1EAE1917BEED0D6542"
+ "9A0EF00E5FB5F70D61C8C4DF1F1E9DA58188A221"
+ },
+ {
+ "03", /*^*/ "164b", /* = */
+ "29ABEC229C2B15C41573F8608D4DCD2DADAACA94CA3C40B42FFAD32D6202E228E16F61E050FF97EC5D45F24A4EB057C2D1A5DA72DFC5944E6941DBEDDE70EF56702BEC35"
+ "A3150EFE84E87185E3CBAB1D73F434EB820E41298BDD4F3941230DFFD8DFF1D2E2F3C5D0CB5088505B9C78507A81AAD8073C28B8FA70771C3E04110344328C6B3F38E55A"
+ "32B009F4DDA1813232C3FF422DF4E4D12545C803C63D0BE67E2E773B2BAC41CC69D895787B217D7BE9CE80BD4B500AE630AA21B50A06E0A74953F8011E9F23863CA79885"
+ "35D5FF0214DBD9B25756BE3D43008A15C018348E6A7C3355F4BECF37595BD530E5AC1AD3B14182862E47AD002097465F6B78F435B0D6365E18490567F508CD3CAAAD340A"
+ "E76A218FE8B517F923FE9CCDE61CB35409590CDBC606D89BA33B32A3862DEE7AB99DFBE103D02D2BED6D418B949E6B3C51CAB8AB5BE93AA104FA10D3A02D4CAD6700CD0F"
+ "83922EAAB18705915198DE51C1C562984E2B7571F36A4D756C459B61E0A4B7DE268A74E807311273DD51C2863771AB72504044C870E2498F13BF1DE92C13D93008E304D2"
+ "879C5D8A646DB5BF7BC64D96BB9E2FBA2EA6BF55CD825ABD995762F661C327133BE01F9A9F298CA096B3CE61CBBD8047A003870B218AC505D72ED6C7BF3B37BE5877B6A1"
+ "606A713EE86509C99B2A3627FD74AE7E81FE7F69C34B40E01A6F8B18A328E0F9D18A7911E5645331540538AA76B6D5D591F14313D730CFE30728089A245EE91058748F0C"
+ "E3E6CE4DE51D23E233BFF9007E0065AEBAA3FB0D0FACE62A4757FE1C9C7075E2214071197D5074C92AF1E6D853F7DE782F32F1E40507CB981A1C10AC6B1C23AC46C07EF1"
+ "EDE857C444902B936771DF75E0EE6C2CB3F0F9DBB387BAD0658E98F42A7338DE45E2F1B012B530FFD66861F74137C041D7558408A4A23B83FBDDE494381D9F9FF0326D44"
+ "302F75DE68B91A54CFF6E3C2821D09F2664CA74783C29AF98E2F1D3D84CAC49EAE55BABE3D2CBE8833D50517109E19CB5C63D1DE26E308ACC213D1CBCCF7C3AAE05B06D9"
+ "909AB0A1AEFD02A193CFADC7F724D377E1F4E78DC21012BE26D910548CDF55B0AB9CB64756045FF48C3B858E954553267C4087EC5A9C860CFA56CF5CFBB442BDDA298230"
+ "D6C000A6A6010D87FB4C3859C3AFAF15C37BCE03EBC392E8149056C489508841110060A991F1EEAF1E7CCF0B279AB2B35F3DAC0FAB4F4A107794E67D305E6D61A27C8FEB"
+ "DEA00C3334C888B2092E740DD3EFF7A69F06CE12EF511126EB23D80902D1D54BF4AEE04DF9457D59E8859AA83D6229481E1B1BC7C3ED96F6F7C1CEEF7B904268FD00BE51"
+ "1EF69692D593F8A9F7CCC053C343306940A4054A55DBA94D95FF6D02B7A73E110C2DBE6CA29C01B5921420B5BC9C92DAA9D82003829C6AE772FF12135C2E138C6725DC47"
+ "7938F3062264575EBBB1CBB359E496DD7A38AE0E33D1B1D9C16BDD87E6DE44DFB832286AE01D00AA14B423DBF7ECCC34A0A06A249707B75C2BA931D7F4F513FDF0F6E516"
+ "345B8DA85FEFD218B390828AECADF0C47916FAF44CB29010B0BB2BBA8E120B6DAFB2CC90B9D1B8659C2AFB"
+ }
+ };
+ for (uint32_t i = 0; i < RT_ELEMENTS(s_aTests); i++)
+ {
+ RTBIGNUM Base, Exponent, Expected;
+ if ( testHexStringToNum(&Base, s_aTests[i].pszBase, RTBIGNUMINIT_F_UNSIGNED | fFlags)
+ && testHexStringToNum(&Exponent, s_aTests[i].pszExponent, RTBIGNUMINIT_F_UNSIGNED | fFlags)
+ && testHexStringToNum(&Expected, s_aTests[i].pszResult, RTBIGNUMINIT_F_UNSIGNED | fFlags))
+ {
+ RTTESTI_CHECK_RC(RTBigNumExponentiate(&Result, &Base, &Exponent), VINF_SUCCESS);
+ RTTESTI_CHECK(RTBigNumCompare(&Result, &Expected) == 0);
+ RTTESTI_CHECK_RC(RTBigNumDestroy(&Base), VINF_SUCCESS);
+ RTTESTI_CHECK_RC(RTBigNumDestroy(&Exponent), VINF_SUCCESS);
+ RTTESTI_CHECK_RC(RTBigNumDestroy(&Expected), VINF_SUCCESS);
+ }
+ }
+ RTTESTI_CHECK_RC(RTBigNumDestroy(&Result), VINF_SUCCESS);
+ RTTESTI_CHECK_RC(RTBigNumDestroy(&Result2), VINF_SUCCESS);
+ }
+}
+
+
+static void testModExp(void)
+{
+ RTTestSub(g_hTest, "RTBigNumModExp");
+
+ for (uint32_t fFlags = 0; fFlags <= RTBIGNUMINIT_F_SENSITIVE; fFlags += RTBIGNUMINIT_F_SENSITIVE)
+ {
+ RTBIGNUM Result;
+ RTTESTI_CHECK_RC_RETV(RTBigNumInitZero(&Result, fFlags), VINF_SUCCESS);
+
+ RTTESTI_CHECK_RC(RTBigNumModExp(&Result, &g_One, &g_One, &g_One), VINF_SUCCESS);
+ RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 0) == 0);
+ RTTESTI_CHECK_RC(RTBigNumModExp(&Result, &g_LargePositive, &g_One, &g_One), VINF_SUCCESS);
+ RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 0) == 0);
+ RTTESTI_CHECK_RC(RTBigNumModExp(&Result, &g_LargePositive, &g_LargePositive, &g_One), VINF_SUCCESS);
+ RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 0) == 0);
+
+ RTTESTI_CHECK_RC(RTBigNumModExp(&Result, &g_One, &g_Zero, &g_Five), VINF_SUCCESS);
+ RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 0) == 1);
+ RTTESTI_CHECK_RC(RTBigNumModExp(&Result, &g_LargePositive, &g_Zero, &g_Five), VINF_SUCCESS);
+ RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 0) == 1);
+ RTTESTI_CHECK_RC(RTBigNumModExp(&Result, &g_LargePositive, &g_Zero, &g_One), VINF_SUCCESS);
+ RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 0) == 0);
+ RTTESTI_CHECK_RC(RTBigNumModExp(&Result, &g_LargePositive, &g_Zero, &g_LargePositive), VINF_SUCCESS);
+ RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 0) == 1);
+
+ RTTESTI_CHECK_RC(RTBigNumModExp(&Result, &g_Zero, &g_Zero, &g_Zero), VERR_BIGNUM_DIV_BY_ZERO);
+ RTTESTI_CHECK_RC(RTBigNumModExp(&Result, &g_LargePositive, &g_Zero, &g_Zero), VERR_BIGNUM_DIV_BY_ZERO);
+ RTTESTI_CHECK_RC(RTBigNumModExp(&Result, &g_LargePositive, &g_LargePositive, &g_Zero), VERR_BIGNUM_DIV_BY_ZERO);
+
+ RTTESTI_CHECK_RC(RTBigNumModExp(&Result, &g_Two, &g_Four, &g_Five), VINF_SUCCESS);
+ RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 1) == 0);
+
+ RTTESTI_CHECK_RC(RTBigNumModExp(&Result, &g_Two, &g_Four, &g_Three), VINF_SUCCESS);
+ RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 1) == 0);
+
+ RTTESTI_CHECK_RC(RTBigNumModExp(&Result, &g_Three, &g_Three, &g_Three), VINF_SUCCESS);
+ RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 0) == 0);
+
+ RTTESTI_CHECK_RC(RTBigNumModExp(&Result, &g_Three, &g_Three, &g_Five), VINF_SUCCESS);
+ RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 2) == 0);
+
+ RTTESTI_CHECK_RC(RTBigNumModExp(&Result, &g_Three, &g_Five, &g_Five), VINF_SUCCESS);
+ RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 3) == 0);
+
+ RTTESTI_CHECK_RC(RTBigNumModExp(&Result, &g_Three, &g_Five, &g_Four), VINF_SUCCESS);
+ RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 3) == 0);
+
+#if 0
+ static struct
+ {
+ const char *pszBase, *pszExponent, *pszModulus, *pszResult;
+ } s_aTests[] =
+ {
+ {
+ "180DB4284A119D6133AE4BB0C27C27D1", /*^*/ "3A", /*mod */ " ", /* = */
+ },
+ };
+ for (uint32_t i = 0; i < RT_ELEMENTS(s_aTests); i++)
+ {
+ RTBIGNUM Base, Exponent, Expected, Modulus;
+ if ( testHexStringToNum(&Base, s_aTests[i].pszBase, RTBIGNUMINIT_F_UNSIGNED | fFlags)
+ && testHexStringToNum(&Exponent, s_aTests[i].pszExponent, RTBIGNUMINIT_F_UNSIGNED | fFlags)
+ && testHexStringToNum(&Modulus, s_aTests[i].pszModulus, RTBIGNUMINIT_F_UNSIGNED | fFlags)
+ && testHexStringToNum(&Expected, s_aTests[i].pszResult, RTBIGNUMINIT_F_UNSIGNED | fFlags))
+ {
+ RTTESTI_CHECK_RC(RTBigNumModExp(&Result, &Base, &Exponent, &Modulus), VINF_SUCCESS);
+ RTTESTI_CHECK(RTBigNumCompare(&Result, &Expected) == 0);
+ RTTESTI_CHECK_RC(RTBigNumDestroy(&Base), VINF_SUCCESS);
+ RTTESTI_CHECK_RC(RTBigNumDestroy(&Exponent), VINF_SUCCESS);
+ RTTESTI_CHECK_RC(RTBigNumDestroy(&Expected), VINF_SUCCESS);
+ RTTESTI_CHECK_RC(RTBigNumDestroy(&Modulus), VINF_SUCCESS);
+ }
+ }
+#endif
+
+ RTTESTI_CHECK_RC(RTBigNumDestroy(&Result), VINF_SUCCESS);
+ }
+}
+
+
+static void testToBytes(void)
+{
+ RTTestSub(g_hTest, "RTBigNumToBytes*Endian");
+ uint8_t abBuf[sizeof(g_abLargePositive) + sizeof(g_abLargeNegative)];
+
+ memset(abBuf, 0xcc, sizeof(abBuf));
+ RTTESTI_CHECK_RC(RTBigNumToBytesBigEndian(&g_Zero, abBuf, 1), VINF_SUCCESS);
+ RTTESTI_CHECK(abBuf[0] == 0 && abBuf[1] == 0xcc);
+
+ memset(abBuf, 0xcc, sizeof(abBuf));
+ RTTESTI_CHECK_RC(RTBigNumToBytesBigEndian(&g_Zero, abBuf, 2), VINF_SUCCESS);
+ RTTESTI_CHECK(abBuf[0] == 0 && abBuf[1] == 0 && abBuf[2] == 0xcc);
+
+ memset(abBuf, 0xcc, sizeof(abBuf));
+ RTTESTI_CHECK_RC(RTBigNumToBytesBigEndian(&g_Zero, abBuf, 3), VINF_SUCCESS);
+ RTTESTI_CHECK(abBuf[0] == 0 && abBuf[1] == 0 && abBuf[2] == 0 && abBuf[3] == 0xcc);
+
+ memset(abBuf, 0xcc, sizeof(abBuf));
+ RTTESTI_CHECK_RC(RTBigNumToBytesBigEndian(&g_Zero, abBuf, 4), VINF_SUCCESS);
+ RTTESTI_CHECK(abBuf[0] == 0 && abBuf[1] == 0 && abBuf[2] == 0 && abBuf[3] == 0 && abBuf[4] == 0xcc);
+
+
+ memset(abBuf, 0xcc, sizeof(abBuf));
+ RTTESTI_CHECK_RC(RTBigNumToBytesBigEndian(&g_Minus1, abBuf, 1), VINF_SUCCESS);
+ RTTESTI_CHECK(abBuf[0] == 0xff && abBuf[1] == 0xcc && abBuf[2] == 0xcc && abBuf[3] == 0xcc && abBuf[4] == 0xcc);
+
+ memset(abBuf, 0xcc, sizeof(abBuf));
+ RTTESTI_CHECK_RC(RTBigNumToBytesBigEndian(&g_Minus1, abBuf, 2), VINF_SUCCESS);
+ RTTESTI_CHECK(abBuf[0] == 0xff && abBuf[1] == 0xff && abBuf[2] == 0xcc && abBuf[3] == 0xcc && abBuf[4] == 0xcc);
+
+ memset(abBuf, 0xcc, sizeof(abBuf));
+ RTTESTI_CHECK_RC(RTBigNumToBytesBigEndian(&g_Minus1, abBuf, 3), VINF_SUCCESS);
+ RTTESTI_CHECK(abBuf[0] == 0xff && abBuf[1] == 0xff && abBuf[2] == 0xff && abBuf[3] == 0xcc && abBuf[4] == 0xcc);
+
+ memset(abBuf, 0xcc, sizeof(abBuf));
+ RTTESTI_CHECK_RC(RTBigNumToBytesBigEndian(&g_Minus1, abBuf, 4), VINF_SUCCESS);
+ RTTESTI_CHECK(abBuf[0] == 0xff && abBuf[1] == 0xff && abBuf[2] == 0xff && abBuf[3] == 0xff && abBuf[4] == 0xcc);
+
+
+ memset(abBuf, 0xcc, sizeof(abBuf));
+ RTTESTI_CHECK_RC(RTBigNumToBytesBigEndian(&g_LargePositive, abBuf, sizeof(g_abLargePositive)), VINF_SUCCESS);
+ RTTESTI_CHECK(memcmp(abBuf, g_abLargePositive, sizeof(g_abLargePositive)) == 0);
+ RTTESTI_CHECK(abBuf[sizeof(g_abLargePositive)] == 0xcc);
+
+ memset(abBuf, 0xcc, sizeof(abBuf));
+ RTTESTI_CHECK_RC(RTBigNumToBytesBigEndian(&g_LargePositive, abBuf, sizeof(g_abLargePositive) -1 ), VERR_BUFFER_OVERFLOW);
+ RTTESTI_CHECK(memcmp(abBuf, &g_abLargePositive[1], sizeof(g_abLargePositive) - 1) == 0);
+ RTTESTI_CHECK(abBuf[sizeof(g_abLargePositive) - 1] == 0xcc);
+
+}
+
+
+int main()
+{
+ RTEXITCODE rcExit = RTTestInitAndCreate("tstRTBigNum", &g_hTest);
+ if (rcExit != RTEXITCODE_SUCCESS)
+ return rcExit;
+ RTTestBanner(g_hTest);
+
+ /* Init fixed integers. */
+ RTTestSub(g_hTest, "RTBigNumInit");
+ RTTESTI_CHECK_RC(RTBigNumInit(&g_LargePositive, RTBIGNUMINIT_F_ENDIAN_BIG | RTBIGNUMINIT_F_SIGNED,
+ g_abLargePositive, sizeof(g_abLargePositive)), VINF_SUCCESS);
+ RTTESTI_CHECK_RC(RTBigNumInit(&g_LargePositive2, RTBIGNUMINIT_F_ENDIAN_BIG | RTBIGNUMINIT_F_SIGNED,
+ g_abLargePositive, sizeof(g_abLargePositive) - 11), VINF_SUCCESS);
+ RTTESTI_CHECK_RC(RTBigNumInit(&g_LargePositiveMinus1, RTBIGNUMINIT_F_ENDIAN_BIG | RTBIGNUMINIT_F_SIGNED,
+ g_abLargePositiveMinus1, sizeof(g_abLargePositiveMinus1)), VINF_SUCCESS);
+ RTTESTI_CHECK_RC(RTBigNumInit(&g_LargeNegative, RTBIGNUMINIT_F_ENDIAN_BIG | RTBIGNUMINIT_F_SIGNED,
+ g_abLargeNegative, sizeof(g_abLargeNegative)), VINF_SUCCESS);
+ RTTESTI_CHECK_RC(RTBigNumInit(&g_LargeNegative2, RTBIGNUMINIT_F_ENDIAN_BIG | RTBIGNUMINIT_F_SIGNED,
+ g_abLargeNegative, sizeof(g_abLargeNegative) - 9), VINF_SUCCESS);
+ RTTESTI_CHECK_RC(RTBigNumInit(&g_LargeNegativePluss1, RTBIGNUMINIT_F_ENDIAN_BIG | RTBIGNUMINIT_F_SIGNED,
+ g_abLargeNegativePluss1, sizeof(g_abLargeNegativePluss1)), VINF_SUCCESS);
+ RTTESTI_CHECK_RC(RTBigNumInit(&g_64BitPositive1, RTBIGNUMINIT_F_ENDIAN_BIG | RTBIGNUMINIT_F_SIGNED,
+ g_ab64BitPositive1, sizeof(g_ab64BitPositive1)), VINF_SUCCESS);
+
+ RTTESTI_CHECK_RC(RTBigNumInitZero(&g_Zero, 0), VINF_SUCCESS);
+ RTTESTI_CHECK_RC(RTBigNumInit(&g_One, RTBIGNUMINIT_F_ENDIAN_BIG | RTBIGNUMINIT_F_SIGNED, "\x01", 1), VINF_SUCCESS);
+ RTTESTI_CHECK_RC(RTBigNumInit(&g_Two, RTBIGNUMINIT_F_ENDIAN_BIG | RTBIGNUMINIT_F_SIGNED, "\x02", 1), VINF_SUCCESS);
+ RTTESTI_CHECK_RC(RTBigNumInit(&g_Three, RTBIGNUMINIT_F_ENDIAN_BIG | RTBIGNUMINIT_F_SIGNED, "\x03", 1), VINF_SUCCESS);
+ RTTESTI_CHECK_RC(RTBigNumInit(&g_Four, RTBIGNUMINIT_F_ENDIAN_BIG | RTBIGNUMINIT_F_SIGNED, "\x04", 1), VINF_SUCCESS);
+ RTTESTI_CHECK_RC(RTBigNumInit(&g_Five, RTBIGNUMINIT_F_ENDIAN_BIG | RTBIGNUMINIT_F_SIGNED, "\x05", 1), VINF_SUCCESS);
+ RTTESTI_CHECK_RC(RTBigNumInit(&g_Ten, RTBIGNUMINIT_F_ENDIAN_BIG | RTBIGNUMINIT_F_SIGNED, "\x0a", 1), VINF_SUCCESS);
+ RTTESTI_CHECK_RC(RTBigNumInit(&g_FourtyTwo, RTBIGNUMINIT_F_ENDIAN_BIG | RTBIGNUMINIT_F_SIGNED, "\x2a", 1), VINF_SUCCESS);
+
+ RTTESTI_CHECK_RC(RTBigNumInit(&g_Minus1, RTBIGNUMINIT_F_ENDIAN_BIG | RTBIGNUMINIT_F_SIGNED,
+ g_abMinus1, sizeof(g_abMinus1)), VINF_SUCCESS);
+ testMoreInit();
+
+ if (RTTestIErrorCount() == 0)
+ {
+ /* Do testing. */
+ testCompare();
+ testSubtraction();
+ testAddition();
+ testMultiplication();
+ testDivision();
+ testModulo();
+ testExponentiation();
+ testModExp();
+ testToBytes();
+
+ /* Cleanups. */
+ RTTestSub(g_hTest, "RTBigNumDestroy");
+ RTTESTI_CHECK_RC(RTBigNumDestroy(&g_LargePositive), VINF_SUCCESS);
+ RTTESTI_CHECK_RC(RTBigNumDestroy(&g_LargePositive2), VINF_SUCCESS);
+ RTTESTI_CHECK_RC(RTBigNumDestroy(&g_LargeNegative), VINF_SUCCESS);
+ RTTESTI_CHECK_RC(RTBigNumDestroy(&g_LargeNegative2), VINF_SUCCESS);
+ RTTESTI_CHECK_RC(RTBigNumDestroy(&g_Zero), VINF_SUCCESS);
+ RTTESTI_CHECK_RC(RTBigNumDestroy(&g_64BitPositive1), VINF_SUCCESS);
+ }
+
+ return RTTestSummaryAndDestroy(g_hTest);
+}
+
diff --git a/src/VBox/Runtime/testcase/tstRTLdrVerifyPeImage.cpp b/src/VBox/Runtime/testcase/tstRTLdrVerifyPeImage.cpp
new file mode 100644
index 00000000000..3d434c901b7
--- /dev/null
+++ b/src/VBox/Runtime/testcase/tstRTLdrVerifyPeImage.cpp
@@ -0,0 +1,101 @@
+/* $Id$ */
+/** @file
+ * SUP Testcase - Testing the Authenticode signature verification code.
+ */
+
+/*
+ * Copyright (C) 2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include <iprt/test.h>
+#include <iprt/mem.h>
+#include <iprt/ldr.h>
+#include <iprt/path.h>
+#include <iprt/stream.h>
+#include <iprt/string.h>
+
+
+static DECLCALLBACK(int) TestCallback(RTLDRMOD hLdrMod, RTLDRSIGNATURETYPE enmSignature,
+ void const *pvSignature, size_t cbSignature,
+ PRTERRINFO pErrInfo, void *pvUser)
+{
+ return VINF_SUCCESS;
+}
+
+
+
+int main(int argc, char **argv)
+{
+ RTTEST hTest;
+ RTEXITCODE rcExit = RTTestInitAndCreate("tstAuthenticode", &hTest);
+ if (rcExit != RTEXITCODE_SUCCESS)
+ return rcExit;
+ RTTestBanner(hTest);
+
+ /*
+ * Process input.
+ */
+ for (int i = 1; i < argc; i++)
+ {
+ const char *pszFullName = argv[i];
+ const char *pszFilename = RTPathFilename(pszFullName);
+ RTTestSub(hTest, pszFilename);
+
+ RTLDRMOD hLdrMod;
+ int rc = RTLdrOpen(pszFullName, RTLDR_O_FOR_VALIDATION, RTLDRARCH_WHATEVER, &hLdrMod);
+ if (RT_SUCCESS(rc))
+ {
+ int rc;
+ char szDigest[512];
+
+ RTTESTI_CHECK_RC(rc = RTLdrHashImage(hLdrMod, RTDIGESTTYPE_MD5, szDigest, sizeof(szDigest)), VINF_SUCCESS);
+ if (RT_SUCCESS(rc))
+ RTTestPrintf(hTest, RTTESTLVL_ALWAYS, "md5=%s\n", szDigest);
+ RTTESTI_CHECK_RC(rc = RTLdrHashImage(hLdrMod, RTDIGESTTYPE_SHA1, szDigest, sizeof(szDigest)), VINF_SUCCESS);
+ if (RT_SUCCESS(rc))
+ RTTestPrintf(hTest, RTTESTLVL_ALWAYS, "sha1=%s\n", szDigest);
+ RTTESTI_CHECK_RC(rc = RTLdrHashImage(hLdrMod, RTDIGESTTYPE_SHA256, szDigest, sizeof(szDigest)), VINF_SUCCESS);
+ if (RT_SUCCESS(rc))
+ RTTestPrintf(hTest, RTTESTLVL_ALWAYS, "sha256=%s\n", szDigest);
+ RTTESTI_CHECK_RC(rc = RTLdrHashImage(hLdrMod, RTDIGESTTYPE_SHA512, szDigest, sizeof(szDigest)), VINF_SUCCESS);
+ if (RT_SUCCESS(rc))
+ RTTestPrintf(hTest, RTTESTLVL_ALWAYS, "sha512=%s\n", szDigest);
+
+ if (rc != VERR_NOT_SUPPORTED)
+ {
+ RTERRINFOSTATIC ErrInfo;
+ RTErrInfoInitStatic(&ErrInfo);
+ rc = RTLdrVerifySignature(hLdrMod, TestCallback, (void *)(uintptr_t)main, &ErrInfo.Core);
+ if (RT_FAILURE(rc))
+ RTTestFailed(hTest, "%s: %s (rc=%Rrc)", pszFilename, ErrInfo.Core.pszMsg, rc);
+ }
+ RTLdrClose(hLdrMod);
+ }
+ else
+ RTTestFailed(hTest, "Error opening '%s': %Rrc\n", pszFullName, rc);
+ }
+
+ return RTTestSummaryAndDestroy(hTest);
+}
+
diff --git a/src/VBox/Runtime/tools/Makefile.kmk b/src/VBox/Runtime/tools/Makefile.kmk
index cf7baf0472e..8aba6b3b5e7 100644
--- a/src/VBox/Runtime/tools/Makefile.kmk
+++ b/src/VBox/Runtime/tools/Makefile.kmk
@@ -4,7 +4,7 @@
#
#
-# Copyright (C) 2006-2013 Oracle Corporation
+# Copyright (C) 2006-2014 Oracle Corporation
#
# This file is part of VirtualBox Open Source Edition (OSE), as
# available from http://www.virtualbox.org. This file is free software;
@@ -33,6 +33,13 @@ BLDPROGS += bldRTManifest
bldRTManifest_TEMPLATE = VBoxAdvBldProg
bldRTManifest_SOURCES = RTManifest.cpp
+# RTSignTool - Signing utility - build version. Signed on windows so we can get the certificate from it.
+BLDPROGS += bldRTSignTool
+bldRTSignTool_TEMPLATE = VBoxAdvBldProg
+bldRTSignTool_SOURCES = RTSignTool.cpp
+bldRTSignTool_DEFS = IPRT_IN_BUILD_TOOL
+bldRTSignTool_POST_CMDS.win = $(VBOX_SIGN_IMAGE_CMDS)
+
ifndef VBOX_ONLY_EXTPACKS_USE_IMPLIBS
# RTManifest is a tool for creating and verifying manifest files.
@@ -80,6 +87,12 @@ ifndef VBOX_ONLY_EXTPACKS_USE_IMPLIBS
RTDbgSymCache_TEMPLATE = VBoxR3Tool
RTDbgSymCache_SOURCES = RTDbgSymCache.cpp
+ # RTSignTool - Signing utility.
+ PROGRAMS += RTSignTool
+ RTSignTool_TEMPLATE = VBoxR3Tool
+ RTSignTool_SOURCES = RTSignTool.cpp
+ RTSignTool_LIBS = $(PATH_STAGE_LIB)/SUPR3$(VBOX_SUFF_LIB)
+
endif # !VBOX_ONLY_EXTPACKS_USE_IMPLIBS
include $(FILE_KBUILD_SUB_FOOTER)
diff --git a/src/VBox/Runtime/tools/RTSignTool.cpp b/src/VBox/Runtime/tools/RTSignTool.cpp
new file mode 100644
index 00000000000..ce654bf8a8a
--- /dev/null
+++ b/src/VBox/Runtime/tools/RTSignTool.cpp
@@ -0,0 +1,895 @@
+/* $Id$ */
+/** @file
+ * IPRT - Signing Tool.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include <iprt/assert.h>
+#include <iprt/buildconfig.h>
+#include <iprt/err.h>
+#include <iprt/getopt.h>
+#include <iprt/file.h>
+#include <iprt/initterm.h>
+#include <iprt/ldr.h>
+#include <iprt/message.h>
+#include <iprt/mem.h>
+#include <iprt/path.h>
+#include <iprt/stream.h>
+#include <iprt/string.h>
+#include <iprt/crypto/x509.h>
+#include <iprt/crypto/pkcs7.h>
+#include <iprt/crypto/store.h>
+#ifdef VBOX
+# include <VBox/sup.h> /* Certificates */
+#endif
+
+
+/*******************************************************************************
+* Structures and Typedefs *
+*******************************************************************************/
+/** Help detail levels. */
+typedef enum RTSIGNTOOLHELP
+{
+ RTSIGNTOOLHELP_USAGE,
+ RTSIGNTOOLHELP_FULL
+} RTSIGNTOOLHELP;
+
+
+/*******************************************************************************
+* Internal Functions *
+*******************************************************************************/
+static RTEXITCODE HandleHelp(int cArgs, char **papszArgs);
+static RTEXITCODE HelpHelp(PRTSTREAM pStrm, RTSIGNTOOLHELP enmLevel);
+static RTEXITCODE HandleVersion(int cArgs, char **papszArgs);
+
+
+
+
+/*
+ * The 'extract-exe-signer-cert' command.
+ */
+static RTEXITCODE HelpExtractExeSignerCert(PRTSTREAM pStrm, RTSIGNTOOLHELP enmLevel)
+{
+ RTStrmPrintf(pStrm, "extract-exe-signer-cert [--ber|--cer|--der] [--exe|-e] <exe> [--output|-o] <outfile.cer>\n");
+ return RTEXITCODE_SUCCESS;
+}
+
+static RTEXITCODE HandleExtractExeSignerCert(int cArgs, char **papszArgs)
+{
+ /*
+ * Parse arguments.
+ */
+ static const RTGETOPTDEF s_aOptions[] =
+ {
+ { "--ber", 'b', RTGETOPT_REQ_NOTHING },
+ { "--cer", 'c', RTGETOPT_REQ_NOTHING },
+ { "--der", 'd', RTGETOPT_REQ_NOTHING },
+ { "--exe", 'e', RTGETOPT_REQ_STRING },
+ { "--output", 'o', RTGETOPT_REQ_STRING },
+ };
+
+ const char *pszExe = NULL;
+ const char *pszOut = NULL;
+ RTLDRARCH enmLdrArch = RTLDRARCH_WHATEVER;
+ uint32_t fCursorFlags = RTASN1CURSOR_FLAGS_DER;
+
+ RTGETOPTSTATE GetState;
+ int rc = RTGetOptInit(&GetState, cArgs, papszArgs, s_aOptions, RT_ELEMENTS(s_aOptions), 1, RTGETOPTINIT_FLAGS_OPTS_FIRST);
+ AssertRCReturn(rc, RTEXITCODE_FAILURE);
+ RTGETOPTUNION ValueUnion;
+ int ch;
+ while ((ch = RTGetOpt(&GetState, &ValueUnion)))
+ {
+ switch (ch)
+ {
+ case 'e': pszExe = ValueUnion.psz; break;
+ case 'o': pszOut = ValueUnion.psz; break;
+ case 'b': fCursorFlags = 0; break;
+ case 'c': fCursorFlags = RTASN1CURSOR_FLAGS_CER; break;
+ case 'd': fCursorFlags = RTASN1CURSOR_FLAGS_DER; break;
+ case 'V': return HandleVersion(cArgs, papszArgs);
+ case 'h': return HelpExtractExeSignerCert(g_pStdOut, RTSIGNTOOLHELP_FULL);
+
+ case VINF_GETOPT_NOT_OPTION:
+ if (!pszExe)
+ pszExe = ValueUnion.psz;
+ else if (!pszOut)
+ pszOut = ValueUnion.psz;
+ else
+ return RTMsgErrorExit(RTEXITCODE_FAILURE, "Too many file arguments: %s", ValueUnion.psz);
+ break;
+
+ default:
+ return RTGetOptPrintError(ch, &ValueUnion);
+ }
+ }
+ if (!pszExe)
+ return RTMsgErrorExit(RTEXITCODE_FAILURE, "No executable given.");
+ if (!pszOut)
+ return RTMsgErrorExit(RTEXITCODE_FAILURE, "No output file given.");
+ if (RTPathExists(pszOut))
+ return RTMsgErrorExit(RTEXITCODE_FAILURE, "The output file '%s' exists.", pszOut);
+
+ /*
+ * Do it.
+ */
+
+ /* Open the executable image and query the PKCS7 info. */
+ RTLDRMOD hLdrMod;
+ rc = RTLdrOpen(pszExe, RTLDR_O_FOR_VALIDATION, enmLdrArch, &hLdrMod);
+ if (RT_FAILURE(rc))
+ return RTMsgErrorExit(RTEXITCODE_FAILURE, "Error opening executable image '%s': %Rrc", pszExe, rc);
+
+ RTEXITCODE rcExit = RTEXITCODE_FAILURE;
+#ifdef DEBUG
+ size_t cbBuf = 64;
+#else
+ size_t cbBuf = _512K;
+#endif
+ void *pvBuf = RTMemAlloc(cbBuf);
+ size_t cbRet = 0;
+ rc = RTLdrQueryPropEx(hLdrMod, RTLDRPROP_PKCS7_SIGNED_DATA, pvBuf, cbBuf, &cbRet);
+ if (rc == VERR_BUFFER_OVERFLOW && cbRet < _4M && cbRet > 0)
+ {
+ RTMemFree(pvBuf);
+ cbBuf = cbRet;
+ pvBuf = RTMemAlloc(cbBuf);
+ rc = RTLdrQueryPropEx(hLdrMod, RTLDRPROP_PKCS7_SIGNED_DATA, pvBuf, cbBuf, &cbRet);
+ }
+ if (RT_SUCCESS(rc))
+ {
+ static RTERRINFOSTATIC s_StaticErrInfo;
+ RTErrInfoInitStatic(&s_StaticErrInfo);
+
+ /*
+ * Decode the output.
+ */
+ RTASN1CURSORPRIMARY PrimaryCursor;
+ RTAsn1CursorInitPrimary(&PrimaryCursor, pvBuf, (uint32_t)cbRet, &s_StaticErrInfo.Core,
+ &g_RTAsn1DefaultAllocator, fCursorFlags, "exe");
+ RTCRPKCS7CONTENTINFO Pkcs7Ci;
+ rc = RTCrPkcs7ContentInfo_DecodeAsn1(&PrimaryCursor.Cursor, 0, &Pkcs7Ci, "pkcs7");
+ if (RT_SUCCESS(rc))
+ {
+ if (RTCrPkcs7ContentInfo_IsSignedData(&Pkcs7Ci))
+ {
+ PCRTCRPKCS7SIGNEDDATA pSd = Pkcs7Ci.u.pSignedData;
+ if (pSd->SignerInfos.cItems == 1)
+ {
+ PCRTCRPKCS7ISSUERANDSERIALNUMBER pISN = &pSd->SignerInfos.paItems[0].IssuerAndSerialNumber;
+ PCRTCRX509CERTIFICATE pCert;
+ pCert = RTCrX509Certificates_FindByIssuerAndSerialNumber(&pSd->Certificates,
+ &pISN->Name, &pISN->SerialNumber);
+ if (pCert)
+ {
+ /*
+ * Write it out.
+ */
+ RTFILE hFile;
+ rc = RTFileOpen(&hFile, pszOut, RTFILE_O_WRITE | RTFILE_O_DENY_WRITE | RTFILE_O_CREATE);
+ if (RT_SUCCESS(rc))
+ {
+ uint32_t cbCert = pCert->SeqCore.Asn1Core.cbHdr + pCert->SeqCore.Asn1Core.cb;
+ rc = RTFileWrite(hFile, pCert->SeqCore.Asn1Core.uData.pu8 - pCert->SeqCore.Asn1Core.cbHdr,
+ cbCert, NULL);
+ if (RT_SUCCESS(rc))
+ {
+ rc = RTFileClose(hFile);
+ if (RT_SUCCESS(rc))
+ {
+ hFile = NIL_RTFILE;
+ rcExit = RTEXITCODE_SUCCESS;
+ RTMsgInfo("Successfully wrote %u bytes to '%s'", cbCert, pszOut);
+ }
+ else
+ RTMsgError("RTFileClose failed: %Rrc", rc);
+ }
+ else
+ RTMsgError("RTFileWrite failed: %Rrc", rc);
+ RTFileClose(hFile);
+ }
+ else
+ RTMsgError("Error opening '%s': %Rrc", pszOut, rc);
+ }
+ else
+ RTMsgError("Certificate not found.");
+ }
+ else
+ RTMsgError("SignerInfo count: %u", pSd->SignerInfos.cItems);
+ }
+ else
+ RTMsgError("No PKCS7 content: ContentType=%s", Pkcs7Ci.ContentType.szObjId);
+ RTAsn1VtDelete(&Pkcs7Ci.SeqCore.Asn1Core);
+ }
+ else
+ RTMsgError("RTPkcs7ContentInfoDecodeAsn1 failed: %Rrc - %s", rc, s_StaticErrInfo.szMsg);
+ }
+ else
+ RTMsgError("RTLDRPROP_PKCS7_SIGNED_DATA failed on '%s': %Rrc", pszExe, rc);
+ RTMemFree(pvBuf);
+ rc = RTLdrClose(hLdrMod);
+ if (RT_FAILURE(rc))
+ rcExit = RTMsgErrorExit(RTEXITCODE_FAILURE, "RTLdrClose failed: %Rrc\n", rc);
+ return rcExit;
+}
+
+#ifndef IPRT_IN_BUILD_TOOL
+
+/*
+ * The 'verify-exe' command.
+ */
+static RTEXITCODE HelpVerifyExe(PRTSTREAM pStrm, RTSIGNTOOLHELP enmLevel)
+{
+ RTStrmPrintf(pStrm,
+ "verify-exe [--verbose|--quiet] [--kernel] [--root <root-cert.der>] [--additional <supp-cert.der>]\n"
+ " [--type <win|osx>] <exe1> [exe2 [..]]\n");
+ return RTEXITCODE_SUCCESS;
+}
+
+typedef struct VERIFYEXESTATE
+{
+ RTCRSTORE hRootStore;
+ RTCRSTORE hKernelRootStore;
+ RTCRSTORE hAdditionalStore;
+ bool fKernel;
+ int cVerbose;
+ enum { kSignType_Windows, kSignType_OSX } enmSignType;
+ uint64_t uTimestamp;
+} VERIFYEXESTATE;
+
+
+/**
+ * @callback_method_impl{RTCRPKCS7VERIFYCERTCALLBACK,
+ * Standard code signing. Use this for Microsoft SPC.}
+ */
+static DECLCALLBACK(int) VerifyExecCertVerifyCallback(PCRTCRX509CERTIFICATE pCert, RTCRX509CERTPATHS hCertPaths,
+ void *pvUser, PRTERRINFO pErrInfo)
+{
+ VERIFYEXESTATE *pState = (VERIFYEXESTATE *)pvUser;
+ uint32_t cPaths = hCertPaths != NIL_RTCRX509CERTPATHS ? RTCrX509CertPathsGetPathCount(hCertPaths) : 0;
+
+ /*
+ * Dump all the paths.
+ */
+ if (pState->cVerbose > 0)
+ {
+ for (uint32_t iPath = 0; iPath < cPaths; iPath++)
+ {
+ RTPrintf("---\n");
+ RTCrX509CertPathsDumpOne(hCertPaths, iPath, pState->cVerbose, RTStrmDumpPrintfV, g_pStdOut);
+ *pErrInfo->pszMsg = '\0';
+ }
+ RTPrintf("---\n");
+ }
+
+ /*
+ * Test signing certificates normally doesn't have all the necessary
+ * features required below. So, treat them as special cases.
+ */
+ if ( hCertPaths == NIL_RTCRX509CERTPATHS
+ && RTCrX509Name_Compare(&pCert->TbsCertificate.Issuer, &pCert->TbsCertificate.Subject) == 0)
+ {
+ RTMsgInfo("Test signed.\n");
+ return VINF_SUCCESS;
+ }
+
+ if (hCertPaths == NIL_RTCRX509CERTPATHS)
+ RTMsgInfo("Signed by trusted certificate.\n");
+
+ /*
+ * Standard code signing capabilites required.
+ */
+ int rc = RTCrPkcs7VerifyCertCallbackCodeSigning(pCert, hCertPaths, NULL, pErrInfo);
+ if (RT_SUCCESS(rc))
+ {
+ /*
+ * If kernel signing, a valid certificate path must be anchored by the
+ * microsoft kernel signing root certificate. The only alternative is
+ * test signing.
+ */
+ if (pState->fKernel && hCertPaths != NIL_RTCRX509CERTPATHS)
+ {
+ uint32_t cFound = 0;
+ uint32_t cValid = 0;
+ for (uint32_t iPath = 0; iPath < cPaths; iPath++)
+ {
+ bool fTrusted;
+ PCRTCRX509NAME pSubject;
+ PCRTCRX509SUBJECTPUBLICKEYINFO pPublicKeyInfo;
+ int rcVerify;
+ rc = RTCrX509CertPathsQueryPathInfo(hCertPaths, iPath, &fTrusted, NULL /*pcNodes*/, &pSubject, &pPublicKeyInfo,
+ NULL, NULL /*pCertCtx*/, &rcVerify);
+ AssertRCBreak(rc);
+
+ if (RT_SUCCESS(rcVerify))
+ {
+ Assert(fTrusted);
+ cValid++;
+
+ /* Search the kernel signing root store for a matching anchor. */
+ RTCRSTORECERTSEARCH Search;
+ rc = RTCrStoreCertFindBySubjectOrAltSubjectByRfc5280(pState->hKernelRootStore, pSubject, &Search);
+ AssertRCBreak(rc);
+ PCRTCRCERTCTX pCertCtx;
+ while ((pCertCtx = RTCrStoreCertSearchNext(pState->hKernelRootStore, &Search)) != NULL)
+ {
+ if (RTCrX509SubjectPublicKeyInfo_Compare(&pCertCtx->pCert->TbsCertificate.SubjectPublicKeyInfo,
+ pPublicKeyInfo) == 0)
+ cFound++;
+ RTCrCertCtxRelease(pCertCtx);
+ }
+
+ int rc2 = RTCrStoreCertSearchDestroy(pState->hKernelRootStore, &Search); AssertRC(rc2);
+ }
+ }
+ if (RT_SUCCESS(rc) && cFound == 0)
+ rc = RTErrInfoSetF(pErrInfo, VERR_GENERAL_FAILURE, "Not valid kernel code signature.");
+ if (RT_SUCCESS(rc) && cValid != 2)
+ RTMsgWarning("%u valid paths, expected 2", cValid);
+ }
+ }
+
+ return rc;
+}
+
+
+/** @callback_method_impl{FNRTLDRVALIDATESIGNEDDATA} */
+static DECLCALLBACK(int) VerifyExeCallback(RTLDRMOD hLdrMod, RTLDRSIGNATURETYPE enmSignature,
+ void const *pvSignature, size_t cbSignature,
+ PRTERRINFO pErrInfo, void *pvUser)
+{
+ VERIFYEXESTATE *pState = (VERIFYEXESTATE *)pvUser;
+ switch (enmSignature)
+ {
+ case RTLDRSIGNATURETYPE_PKCS7_SIGNED_DATA:
+ {
+ PCRTCRPKCS7CONTENTINFO pContentInfo = (PCRTCRPKCS7CONTENTINFO)pvSignature;
+
+ RTTIMESPEC ValidationTime;
+ RTTimeSpecSetSeconds(&ValidationTime, pState->uTimestamp);
+
+ /*
+ * Dump the signed data if so requested.
+ */
+ if (pState->cVerbose)
+ RTAsn1Dump(&pContentInfo->SeqCore.Asn1Core, 0, 0, RTStrmDumpPrintfV, g_pStdOut);
+
+
+ /*
+ * Do the actual verification. Will have to modify this so it takes
+ * the authenticode policies into account.
+ */
+ return RTCrPkcs7VerifySignedData(pContentInfo, 0, pState->hAdditionalStore, pState->hRootStore, &ValidationTime,
+ VerifyExecCertVerifyCallback, pState, pErrInfo);
+ }
+
+ default:
+ return RTErrInfoSetF(pErrInfo, VERR_NOT_SUPPORTED, "Unsupported signature type: %d", enmSignature);
+ }
+ return VINF_SUCCESS;
+}
+
+static RTEXITCODE HandleVerifyExe(int cArgs, char **papszArgs)
+{
+ RTERRINFOSTATIC StaticErrInfo;
+
+ /* Note! This code does not try to clean up the crypto stores on failure.
+ This is intentional as the code is only expected to be used in a
+ one-command-per-process environment where we do exit() upon
+ returning from this function. */
+
+ /*
+ * Parse arguments.
+ */
+ static const RTGETOPTDEF s_aOptions[] =
+ {
+ { "--kernel", 'k', RTGETOPT_REQ_NOTHING },
+ { "--root", 'r', RTGETOPT_REQ_STRING },
+ { "--additional", 'a', RTGETOPT_REQ_STRING },
+ { "--add", 'a', RTGETOPT_REQ_STRING },
+ { "--type", 't', RTGETOPT_REQ_STRING },
+ { "--verbose", 'v', RTGETOPT_REQ_NOTHING },
+ { "--quiet", 'q', RTGETOPT_REQ_NOTHING },
+ };
+
+ RTLDRARCH enmLdrArch = RTLDRARCH_WHATEVER;
+ VERIFYEXESTATE State = { NIL_RTCRSTORE, NIL_RTCRSTORE, NIL_RTCRSTORE, false, false, VERIFYEXESTATE::kSignType_Windows };
+ int rc = RTCrStoreCreateInMem(&State.hRootStore, 0);
+ if (RT_SUCCESS(rc))
+ rc = RTCrStoreCreateInMem(&State.hKernelRootStore, 0);
+ if (RT_SUCCESS(rc))
+ rc = RTCrStoreCreateInMem(&State.hAdditionalStore, 0);
+ if (RT_FAILURE(rc))
+ return RTMsgErrorExit(RTEXITCODE_FAILURE, "Error creating in-memory certificate store: %Rrc", rc);
+
+ RTGETOPTSTATE GetState;
+ rc = RTGetOptInit(&GetState, cArgs, papszArgs, s_aOptions, RT_ELEMENTS(s_aOptions), 1, RTGETOPTINIT_FLAGS_OPTS_FIRST);
+ AssertRCReturn(rc, RTEXITCODE_FAILURE);
+ RTGETOPTUNION ValueUnion;
+ int ch;
+ while ((ch = RTGetOpt(&GetState, &ValueUnion)) && ch != VINF_GETOPT_NOT_OPTION)
+ {
+ switch (ch)
+ {
+ case 'r': case 'a':
+ rc = RTCrStoreCertAddFromFile(ch == 'r' ? State.hRootStore : State.hAdditionalStore, 0, ValueUnion.psz,
+ RTErrInfoInitStatic(&StaticErrInfo));
+ if (RT_FAILURE(rc))
+ return RTMsgErrorExit(RTEXITCODE_FAILURE, "Error loading certificate '%s': %Rrc - %s",
+ ValueUnion.psz, rc, StaticErrInfo.szMsg);
+ break;
+
+ case 't':
+ if (!strcmp(ValueUnion.psz, "win") || !strcmp(ValueUnion.psz, "windows"))
+ State.enmSignType = VERIFYEXESTATE::kSignType_Windows;
+ else if (!strcmp(ValueUnion.psz, "osx") || !strcmp(ValueUnion.psz, "apple"))
+ State.enmSignType = VERIFYEXESTATE::kSignType_OSX;
+ else
+ return RTMsgErrorExit(RTEXITCODE_SYNTAX, "Unknown signing type: '%s'", ValueUnion.psz);
+ break;
+
+ case 'k': State.fKernel = true; break;
+ case 'v': State.cVerbose++; break;
+ case 'q': State.cVerbose = 0; break;
+ case 'V': return HandleVersion(cArgs, papszArgs);
+ case 'h': return HelpVerifyExe(g_pStdOut, RTSIGNTOOLHELP_FULL);
+ default: return RTGetOptPrintError(ch, &ValueUnion);
+ }
+ }
+ if (ch != VINF_GETOPT_NOT_OPTION)
+ return RTMsgErrorExit(RTEXITCODE_FAILURE, "No executable given.");
+
+ /*
+ * Populate the certificate stores according to the signing type.
+ */
+#ifdef VBOX
+ unsigned cSets = 0;
+ struct { RTCRSTORE hStore; PCSUPTAENTRY paTAs; unsigned cTAs; } aSets[6];
+#endif
+
+ switch (State.enmSignType)
+ {
+ case VERIFYEXESTATE::kSignType_Windows:
+#ifdef VBOX
+ aSets[cSets].hStore = State.hRootStore;
+ aSets[cSets].paTAs = g_aSUPTimestampTAs;
+ aSets[cSets].cTAs = g_cSUPTimestampTAs;
+ cSets++;
+ aSets[cSets].hStore = State.hRootStore;
+ aSets[cSets].paTAs = g_aSUPSpcRootTAs;
+ aSets[cSets].cTAs = g_cSUPSpcRootTAs;
+ cSets++;
+ aSets[cSets].hStore = State.hRootStore;
+ aSets[cSets].paTAs = g_aSUPNtKernelRootTAs;
+ aSets[cSets].cTAs = g_cSUPNtKernelRootTAs;
+ cSets++;
+ aSets[cSets].hStore = State.hKernelRootStore;
+ aSets[cSets].paTAs = g_aSUPNtKernelRootTAs;
+ aSets[cSets].cTAs = g_cSUPNtKernelRootTAs;
+ cSets++;
+#endif
+ break;
+
+ case VERIFYEXESTATE::kSignType_OSX:
+ return RTMsgErrorExit(RTEXITCODE_FAILURE, "Mac OS X executable signing is not implemented.");
+ }
+
+#ifdef VBOX
+ for (unsigned i = 0; i < cSets; i++)
+ for (unsigned j = 0; j < aSets[i].cTAs; j++)
+ {
+ rc = RTCrStoreCertAddEncoded(aSets[i].hStore, RTCRCERTCTX_F_ENC_TAF_DER, aSets[i].paTAs[j].pch,
+ aSets[i].paTAs[j].cb, RTErrInfoInitStatic(&StaticErrInfo));
+ if (RT_FAILURE(rc))
+ return RTMsgErrorExit(RTEXITCODE_FAILURE, "RTCrStoreCertAddEncoded failed (%u/%u): %s",
+ i, j, StaticErrInfo.szMsg);
+ }
+#endif
+
+ /*
+ * Do it.
+ */
+ for (;;)
+ {
+ /*
+ * Open the executable image and verify it.
+ */
+ RTLDRMOD hLdrMod;
+ rc = RTLdrOpen(ValueUnion.psz, RTLDR_O_FOR_VALIDATION, enmLdrArch, &hLdrMod);
+ if (RT_FAILURE(rc))
+ return RTMsgErrorExit(RTEXITCODE_FAILURE, "Error opening executable image '%s': %Rrc", ValueUnion.psz, rc);
+
+
+ rc = RTLdrQueryProp(hLdrMod, RTLDRPROP_TIMESTAMP_SECONDS, &State.uTimestamp, sizeof(State.uTimestamp));
+ if (RT_SUCCESS(rc))
+ {
+ rc = RTLdrVerifySignature(hLdrMod, VerifyExeCallback, &State, RTErrInfoInitStatic(&StaticErrInfo));
+ if (RT_SUCCESS(rc))
+ RTMsgInfo("'%s' is valid.\n", ValueUnion.psz);
+ else
+ RTMsgError("RTLdrVerifySignature failed on '%s': %Rrc - %s\n", ValueUnion.psz, rc, StaticErrInfo.szMsg);
+ }
+ else
+ RTMsgError("RTLdrQueryProp/RTLDRPROP_TIMESTAMP_SECONDS failed on '%s': %Rrc\n", ValueUnion.psz, rc);
+
+ int rc2 = RTLdrClose(hLdrMod);
+ if (RT_FAILURE(rc2))
+ return RTMsgErrorExit(RTEXITCODE_FAILURE, "RTLdrClose failed: %Rrc\n", rc2);
+ if (RT_FAILURE(rc))
+ return rc != VERR_LDRVI_NOT_SIGNED ? RTEXITCODE_FAILURE : RTEXITCODE_SKIPPED;
+
+ /*
+ * Next file
+ */
+ ch = RTGetOpt(&GetState, &ValueUnion);
+ if (ch == 0)
+ return RTEXITCODE_SUCCESS;
+ if (ch != VINF_GETOPT_NOT_OPTION)
+ return RTGetOptPrintError(ch, &ValueUnion);
+ }
+}
+
+#endif /* !IPRT_IN_BUILD_TOOL */
+
+/*
+ * The 'make-tainfo' command.
+ */
+static RTEXITCODE HelpMakeTaInfo(PRTSTREAM pStrm, RTSIGNTOOLHELP enmLevel)
+{
+ RTStrmPrintf(pStrm,
+ "make-tainfo [--verbose|--quiet] [--cert <cert.der>] [-o|--output] <tainfo.der>\n");
+ return RTEXITCODE_SUCCESS;
+}
+
+
+typedef struct MAKETAINFOSTATE
+{
+ int cVerbose;
+ const char *pszCert;
+ const char *pszOutput;
+} MAKETAINFOSTATE;
+
+
+/** @callback_method_impl{FNRTASN1ENCODEWRITER} */
+static DECLCALLBACK(int) handleMakeTaInfoWriter(const void *pvBuf, size_t cbToWrite, void *pvUser, PRTERRINFO pErrInfo)
+{
+ return RTStrmWrite((PRTSTREAM)pvUser, pvBuf, cbToWrite);
+}
+
+
+static RTEXITCODE HandleMakeTaInfo(int cArgs, char **papszArgs)
+{
+ /*
+ * Parse arguments.
+ */
+ static const RTGETOPTDEF s_aOptions[] =
+ {
+ { "--cert", 'c', RTGETOPT_REQ_STRING },
+ { "--output", 'o', RTGETOPT_REQ_STRING },
+ { "--verbose", 'v', RTGETOPT_REQ_NOTHING },
+ { "--quiet", 'q', RTGETOPT_REQ_NOTHING },
+ };
+
+ RTLDRARCH enmLdrArch = RTLDRARCH_WHATEVER;
+ MAKETAINFOSTATE State = { 0, NULL, NULL };
+
+ RTGETOPTSTATE GetState;
+ int rc = RTGetOptInit(&GetState, cArgs, papszArgs, s_aOptions, RT_ELEMENTS(s_aOptions), 1, RTGETOPTINIT_FLAGS_OPTS_FIRST);
+ AssertRCReturn(rc, RTEXITCODE_FAILURE);
+ RTGETOPTUNION ValueUnion;
+ int ch;
+ while ((ch = RTGetOpt(&GetState, &ValueUnion)) != 0)
+ {
+ switch (ch)
+ {
+ case 'c':
+ if (State.pszCert)
+ return RTMsgErrorExit(RTEXITCODE_FAILURE, "The --cert option can only be used once.");
+ State.pszCert = ValueUnion.psz;
+ break;
+
+ case 'o':
+ case VINF_GETOPT_NOT_OPTION:
+ if (State.pszOutput)
+ return RTMsgErrorExit(RTEXITCODE_FAILURE, "Multiple output files specified.");
+ State.pszOutput = ValueUnion.psz;
+ break;
+
+ case 'v': State.cVerbose++; break;
+ case 'q': State.cVerbose = 0; break;
+ case 'V': return HandleVersion(cArgs, papszArgs);
+ case 'h': return HelpMakeTaInfo(g_pStdOut, RTSIGNTOOLHELP_FULL);
+ default: return RTGetOptPrintError(ch, &ValueUnion);
+ }
+ }
+ if (!State.pszCert)
+ return RTMsgErrorExit(RTEXITCODE_FAILURE, "No input certificate was specified.");
+ if (!State.pszOutput)
+ return RTMsgErrorExit(RTEXITCODE_FAILURE, "No output file was specified.");
+
+ /*
+ * Read the certificate.
+ */
+ RTERRINFOSTATIC StaticErrInfo;
+ RTCRX509CERTIFICATE Certificate;
+ rc = RTCrX509Certificate_ReadFromFile(&Certificate, State.pszCert, 0, &g_RTAsn1DefaultAllocator,
+ RTErrInfoInitStatic(&StaticErrInfo));
+ if (RT_FAILURE(rc))
+ return RTMsgErrorExit(RTEXITCODE_FAILURE, "Error reading certificate from %s: %Rrc - %s",
+ State.pszCert, rc, StaticErrInfo.szMsg);
+ /*
+ * Construct the trust anchor information.
+ */
+ RTCRTAFTRUSTANCHORINFO TrustAnchor;
+ rc = RTCrTafTrustAnchorInfo_Init(&TrustAnchor, &g_RTAsn1DefaultAllocator);
+ if (RT_SUCCESS(rc))
+ {
+ /* Public key. */
+ Assert(RTCrX509SubjectPublicKeyInfo_IsPresent(&TrustAnchor.PubKey));
+ RTCrX509SubjectPublicKeyInfo_Delete(&TrustAnchor.PubKey);
+ rc = RTCrX509SubjectPublicKeyInfo_Clone(&TrustAnchor.PubKey, &Certificate.TbsCertificate.SubjectPublicKeyInfo,
+ &g_RTAsn1DefaultAllocator);
+ if (RT_FAILURE(rc))
+ RTMsgError("RTCrX509SubjectPublicKeyInfo_Clone failed: %Rrc", rc);
+ RTAsn1Core_ResetImplict(RTCrX509SubjectPublicKeyInfo_GetAsn1Core(&TrustAnchor.PubKey)); /* temporary hack. */
+
+ /* Key Identifier. */
+ PCRTASN1OCTETSTRING pKeyIdentifier = NULL;
+ if (Certificate.TbsCertificate.T3.fFlags & RTCRX509TBSCERTIFICATE_F_PRESENT_SUBJECT_KEY_IDENTIFIER)
+ pKeyIdentifier = Certificate.TbsCertificate.T3.pSubjectKeyIdentifier;
+ else if ( (Certificate.TbsCertificate.T3.fFlags & RTCRX509TBSCERTIFICATE_F_PRESENT_AUTHORITY_KEY_IDENTIFIER)
+ && RTCrX509Certificate_IsSelfSigned(&Certificate)
+ && RTAsn1OctetString_IsPresent(&Certificate.TbsCertificate.T3.pAuthorityKeyIdentifier->KeyIdentifier) )
+ pKeyIdentifier = &Certificate.TbsCertificate.T3.pAuthorityKeyIdentifier->KeyIdentifier;
+ else if ( (Certificate.TbsCertificate.T3.fFlags & RTCRX509TBSCERTIFICATE_F_PRESENT_OLD_AUTHORITY_KEY_IDENTIFIER)
+ && RTCrX509Certificate_IsSelfSigned(&Certificate)
+ && RTAsn1OctetString_IsPresent(&Certificate.TbsCertificate.T3.pOldAuthorityKeyIdentifier->KeyIdentifier) )
+ pKeyIdentifier = &Certificate.TbsCertificate.T3.pOldAuthorityKeyIdentifier->KeyIdentifier;
+ if (pKeyIdentifier && pKeyIdentifier->Asn1Core.cb > 0)
+ {
+ Assert(RTAsn1OctetString_IsPresent(&TrustAnchor.KeyIdentifier));
+ RTAsn1OctetString_Delete(&TrustAnchor.KeyIdentifier);
+ rc = RTAsn1OctetString_Clone(&TrustAnchor.KeyIdentifier, pKeyIdentifier, &g_RTAsn1DefaultAllocator);
+ if (RT_FAILURE(rc))
+ RTMsgError("RTAsn1OctetString_Clone failed: %Rrc", rc);
+ RTAsn1Core_ResetImplict(RTAsn1OctetString_GetAsn1Core(&TrustAnchor.KeyIdentifier)); /* temporary hack. */
+ }
+ else
+ RTMsgWarning("No key identifier found or has zero length.");
+
+ /* Subject */
+ if (RT_SUCCESS(rc))
+ {
+ Assert(!RTCrTafCertPathControls_IsPresent(&TrustAnchor.CertPath));
+ rc = RTCrTafCertPathControls_Init(&TrustAnchor.CertPath, &g_RTAsn1DefaultAllocator);
+ if (RT_SUCCESS(rc))
+ {
+ Assert(RTCrX509Name_IsPresent(&TrustAnchor.CertPath.TaName));
+ RTCrX509Name_Delete(&TrustAnchor.CertPath.TaName);
+ rc = RTCrX509Name_Clone(&TrustAnchor.CertPath.TaName, &Certificate.TbsCertificate.Subject,
+ &g_RTAsn1DefaultAllocator);
+ if (RT_SUCCESS(rc))
+ {
+ RTAsn1Core_ResetImplict(RTCrX509Name_GetAsn1Core(&TrustAnchor.CertPath.TaName)); /* temporary hack. */
+ rc = RTCrX509Name_RecodeAsUtf8(&TrustAnchor.CertPath.TaName, &g_RTAsn1DefaultAllocator);
+ if (RT_FAILURE(rc))
+ RTMsgError("RTCrX509Name_RecodeAsUtf8 failed: %Rrc", rc);
+ }
+ else
+ RTMsgError("RTCrX509Name_Clone failed: %Rrc", rc);
+ }
+ else
+ RTMsgError("RTCrTafCertPathControls_Init failed: %Rrc", rc);
+ }
+
+ /* Check that what we've constructed makes some sense. */
+ if (RT_SUCCESS(rc))
+ {
+ rc = RTCrTafTrustAnchorInfo_CheckSanity(&TrustAnchor, 0, RTErrInfoInitStatic(&StaticErrInfo), "TAI");
+ if (RT_FAILURE(rc))
+ RTMsgError("RTCrTafTrustAnchorInfo_CheckSanity failed: %Rrc - %s", rc, StaticErrInfo.szMsg);
+ }
+
+ if (RT_SUCCESS(rc))
+ {
+ /*
+ * Encode it and write it to the output file.
+ */
+ uint32_t cbEncoded;
+ rc = RTAsn1EncodePrepare(RTCrTafTrustAnchorInfo_GetAsn1Core(&TrustAnchor), RTASN1ENCODE_F_DER, &cbEncoded,
+ RTErrInfoInitStatic(&StaticErrInfo));
+ if (RT_SUCCESS(rc))
+ {
+ if (State.cVerbose >= 1)
+ RTAsn1Dump(RTCrTafTrustAnchorInfo_GetAsn1Core(&TrustAnchor), 0, 0, RTStrmDumpPrintfV, g_pStdOut);
+
+ PRTSTREAM pStrm;
+ rc = RTStrmOpen(State.pszOutput, "wb", &pStrm);
+ if (RT_SUCCESS(rc))
+ {
+ rc = RTAsn1EncodeWrite(RTCrTafTrustAnchorInfo_GetAsn1Core(&TrustAnchor), RTASN1ENCODE_F_DER,
+ handleMakeTaInfoWriter, pStrm, RTErrInfoInitStatic(&StaticErrInfo));
+ if (RT_SUCCESS(rc))
+ {
+ rc = RTStrmClose(pStrm);
+ if (RT_SUCCESS(rc))
+ RTMsgInfo("Successfully wrote TrustedAnchorInfo to '%s'.", State.pszOutput);
+ else
+ RTMsgError("RTStrmClose failed: %Rrc");
+ }
+ else
+ {
+ RTMsgError("RTAsn1EncodeWrite failed: %Rrc - %s", rc, StaticErrInfo.szMsg);
+ RTStrmClose(pStrm);
+ }
+ }
+ else
+ RTMsgError("Error opening '%s' for writing: %Rrcs", State.pszOutput, rc);
+ }
+ else
+ RTMsgError("RTAsn1EncodePrepare failed: %Rrc - %s", rc, StaticErrInfo.szMsg);
+ }
+
+ RTCrTafTrustAnchorInfo_Delete(&TrustAnchor);
+ }
+ else
+ RTMsgError("RTCrTafTrustAnchorInfo_Init failed: %Rrc", rc);
+
+ RTCrX509Certificate_Delete(&Certificate);
+ return RT_SUCCESS(rc) ? RTEXITCODE_SUCCESS : RTEXITCODE_FAILURE;
+}
+
+
+
+/*
+ * The 'version' command.
+ */
+static RTEXITCODE HelpVersion(PRTSTREAM pStrm, RTSIGNTOOLHELP enmLevel)
+{
+ RTStrmPrintf(pStrm, "version\n");
+ return RTEXITCODE_SUCCESS;
+}
+
+static RTEXITCODE HandleVersion(int cArgs, char **papszArgs)
+{
+ RTPrintf("%s\n", RTBldCfgVersion());
+ return RTEXITCODE_SUCCESS;
+}
+
+
+
+/**
+ * Command mapping.
+ */
+static struct
+{
+ /** The command. */
+ const char *pszCmd;
+ /**
+ * Handle the command.
+ * @returns Program exit code.
+ * @param cArgs Number of arguments.
+ * @param papszArgs The argument vector, starting with the command name.
+ */
+ RTEXITCODE (*pfnHandler)(int cArgs, char **papszArgs);
+ /**
+ * Produce help.
+ * @returns RTEXITCODE_SUCCESS to simplify handling '--help' in the handler.
+ * @param pStrm Where to send help text.
+ * @param enmLevel The level of the help information.
+ */
+ RTEXITCODE (*pfnHelp)(PRTSTREAM pStrm, RTSIGNTOOLHELP enmLevel);
+}
+/** Mapping commands to handler and helper functions. */
+const g_aCommands[] =
+{
+ { "extract-exe-signer-cert", HandleExtractExeSignerCert, HelpExtractExeSignerCert },
+#ifndef IPRT_IN_BUILD_TOOL
+ { "verify-exe", HandleVerifyExe, HelpVerifyExe },
+#endif
+ { "make-tainfo", HandleMakeTaInfo, HelpMakeTaInfo },
+ { "help", HandleHelp, HelpHelp },
+ { "--help", HandleHelp, NULL },
+ { "-h", HandleHelp, NULL },
+ { "version", HandleVersion, HelpVersion },
+ { "--version", HandleVersion, NULL },
+ { "-V", HandleVersion, NULL },
+};
+
+
+/*
+ * The 'help' command.
+ */
+static RTEXITCODE HelpHelp(PRTSTREAM pStrm, RTSIGNTOOLHELP enmLevel)
+{
+ RTStrmPrintf(pStrm, "help [cmd-patterns]\n");
+ return RTEXITCODE_SUCCESS;
+}
+
+static RTEXITCODE HandleHelp(int cArgs, char **papszArgs)
+{
+ RTSIGNTOOLHELP enmLevel = cArgs <= 1 ? RTSIGNTOOLHELP_USAGE : RTSIGNTOOLHELP_FULL;
+ uint32_t cShowed = 0;
+ for (uint32_t iCmd = 0; iCmd < RT_ELEMENTS(g_aCommands); iCmd++)
+ {
+ if (g_aCommands[iCmd].pfnHelp)
+ {
+ bool fShow;
+ if (cArgs <= 1)
+ fShow = true;
+ else
+ {
+ for (int iArg = 1; iArg < cArgs; iArg++)
+ if (RTStrSimplePatternMultiMatch(papszArgs[iArg], RTSTR_MAX, g_aCommands[iCmd].pszCmd, RTSTR_MAX, NULL))
+ {
+ fShow = true;
+ break;
+ }
+ }
+ if (fShow)
+ {
+ g_aCommands[iCmd].pfnHelp(g_pStdOut, enmLevel);
+ cShowed++;
+ }
+ }
+ }
+ return cShowed ? RTEXITCODE_SUCCESS : RTEXITCODE_FAILURE;
+}
+
+
+
+int main(int argc, char **argv)
+{
+ int rc = RTR3InitExe(argc, &argv, 0);
+ if (RT_FAILURE(rc))
+ return RTMsgInitFailure(rc);
+
+ /*
+ * Parse global arguments.
+ */
+ int iArg = 1;
+ /* none presently. */
+
+ /*
+ * Command dispatcher.
+ */
+ if (iArg < argc)
+ {
+ const char *pszCmd = argv[iArg];
+ uint32_t i = RT_ELEMENTS(g_aCommands);
+ while (i-- > 0)
+ if (!strcmp(g_aCommands[i].pszCmd, pszCmd))
+ return g_aCommands[i].pfnHandler(argc - iArg, &argv[iArg]);
+ RTMsgError("Unknown command '%s'.", pszCmd);
+ }
+ else
+ RTMsgError("No command given. (try --help)");
+
+ return RTEXITCODE_SYNTAX;
+}
+
+
diff --git a/src/VBox/Runtime/win/RTErrConvertFromWin32.cpp b/src/VBox/Runtime/win/RTErrConvertFromWin32.cpp
index 37b79d00d3a..8080df2588c 100644
--- a/src/VBox/Runtime/win/RTErrConvertFromWin32.cpp
+++ b/src/VBox/Runtime/win/RTErrConvertFromWin32.cpp
@@ -412,6 +412,7 @@ RTR3DECL(int) RTErrConvertFromWin32(unsigned uNativeCode)
#endif
case ERROR_NOT_A_REPARSE_POINT: return VERR_NOT_SYMLINK;
+ case NTE_BAD_ALGID: return VERR_CR_PKIX_UNKNOWN_DIGEST_TYPE;
}
/* unknown error. */
diff --git a/src/VBox/Runtime/win/errmsgwin.cpp b/src/VBox/Runtime/win/errmsgwin.cpp
index e7c5507b5f9..63c6e900157 100644
--- a/src/VBox/Runtime/win/errmsgwin.cpp
+++ b/src/VBox/Runtime/win/errmsgwin.cpp
@@ -43,9 +43,13 @@
*/
static const RTWINERRMSG g_aStatusMsgs[] =
{
-#include "errmsgcomdata.h"
-#if defined(VBOX) && !defined(IN_GUEST)
-# include "errmsgvboxcomdata.h"
+#ifndef IPRT_NO_ERROR_DATA
+# include "errmsgcomdata.h"
+# if defined(VBOX) && !defined(IN_GUEST)
+# include "errmsgvboxcomdata.h"
+# endif
+#else
+ { "Success.", "ERROR_SUCCESS", 0 },
#endif
{ NULL, NULL, 0 }
};
@@ -76,7 +80,7 @@ static volatile uint32_t g_iUnknownMsgs;
RTDECL(PCRTWINERRMSG) RTErrWinGet(long rc)
{
unsigned i;
- for (i = 0; i < RT_ELEMENTS(g_aStatusMsgs); i++)
+ for (i = 0; i < RT_ELEMENTS(g_aStatusMsgs) - 1U; i++)
if (g_aStatusMsgs[i].iCode == rc)
return &g_aStatusMsgs[i];
@@ -85,7 +89,7 @@ RTDECL(PCRTWINERRMSG) RTErrWinGet(long rc)
* was no exact match. Try to find a non-exact match, and include the
* actual value in case we pick the wrong entry. Better than always using
* the "Unknown Status" case. */
- for (i = 0; i < RT_ELEMENTS(g_aStatusMsgs); i++)
+ for (i = 0; i < RT_ELEMENTS(g_aStatusMsgs) - 1U; i++)
if (g_aStatusMsgs[i].iCode == HRESULT_CODE(rc))
{
int32_t iMsg = (ASMAtomicIncU32(&g_iUnknownMsgs) - 1) % RT_ELEMENTS(g_aUnknownMsgs);
diff --git a/src/bldprogs/bin2c.c b/src/bldprogs/bin2c.c
index bc63524e9b6..9e7f06d96b5 100644
--- a/src/bldprogs/bin2c.c
+++ b/src/bldprogs/bin2c.c
@@ -56,8 +56,10 @@ static int usage(const char *argv0)
" -mask <n> check if size of binaryfile is <n>-aligned\n"
" -width <n> number of bytes per line (default: 16)\n"
" -break <n> break every <n> lines (default: -1)\n"
- " -ascii show ASCII representation of binary as comment\n",
- argv0);
+ " -ascii show ASCII representation of binary as comment\n"
+ " -export emit DECLEXPORT\n"
+ " --append append to the output file (default: truncate)\n"
+ , argv0);
return 1;
}
@@ -71,6 +73,7 @@ int main(int argc, char *argv[])
size_t cbMax = ~0U;
size_t uMask = 0;
int fAscii = 0;
+ int fAppend = 0;
int fExport = 0;
long iBreakEvery = -1;
unsigned char abLine[32];
@@ -104,13 +107,11 @@ int main(int argc, char *argv[])
uMask = strtoul(argv[iArg], NULL, 0);
}
else if (!strcmp(argv[iArg], "-ascii"))
- {
fAscii = 1;
- }
+ else if (!strcmp(argv[iArg], "--append"))
+ fAppend = 1;
else if (!strcmp(argv[iArg], "-export"))
- {
fExport = 1;
- }
else if (!strcmp(argv[iArg], "-width"))
{
if (++iArg >= argc)
@@ -152,7 +153,7 @@ int main(int argc, char *argv[])
return 1;
}
- pFileOut = fopen(argv[iArg+2], "wb");
+ pFileOut = fopen(argv[iArg+2], fAppend ? "a" : "w"); /* no b! */
if (!pFileOut)
{
fprintf(stderr, "Error: failed to open output file '%s'!\n", argv[iArg+2]);
diff --git a/src/recompiler/Makefile.kmk b/src/recompiler/Makefile.kmk
index 60c3f4d0024..5ea8b9051ed 100644
--- a/src/recompiler/Makefile.kmk
+++ b/src/recompiler/Makefile.kmk
@@ -142,7 +142,14 @@ VBoxRemPrimary_CLEAN = \
endif
VBoxRemPrimary_LDFLAGS.solaris = -mimpure-text
-VBoxRemPrimary_POST_CMDS = $(VBOX_SIGN_IMAGE_CMDS)
+ifdef VBOX_WITH_HARDENING
+ VBoxRemPrimary_POST_CMDS = \
+ $(VBOX_VCC_EDITBIN) /LargeAddressAware /DynamicBase /NxCompat /Release /IntegrityCheck \
+ /Version:$(VBOX_VERSION_MAJOR)0$(VBOX_VERSION_MINOR).$(VBOX_VERSION_BUILD) "$(out)" \
+ $$(NLTAB)$(VBOX_SIGN_IMAGE_CMDS)
+else
+ VBoxRemPrimary_POST_CMDS = $(VBOX_SIGN_IMAGE_CMDS)
+endif
if "$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)" == "win.amd64" && !defined(VBOX_USE_MINGWW64)
diff --git a/tools/bin/gen-slickedit-workspace.sh b/tools/bin/gen-slickedit-workspace.sh
index 3307fdd2692..8020c398193 100755
--- a/tools/bin/gen-slickedit-workspace.sh
+++ b/tools/bin/gen-slickedit-workspace.sh
@@ -162,10 +162,16 @@ my_file()
#
# @param $1 The output file name base.
# @param $2 The wildcard spec.
+# @param $3 Optional folder override.
my_wildcard()
{
+ if test -n "$3"; then
+ MY_FOLDER="$1-$3.lst"
+ else
+ MY_FOLDER="$1-All.lst"
+ fi
EXCLUDES="*.log;*.kup;*~;*.pyc;*.exe;*.sys;*.dll;*.o;*.obj;*.lib;*.a;*.ko;*.class;*.cvsignore;*.done;*.project;*.actionScriptProperties;*.scm-settings;.svn/*"
- echo ' <F N="'"${2}"'/*" Recurse="1" Excludes="'"${EXCLUDES}"'"/>' >> "$1-All.lst"
+ echo ' <F N="'"${2}"'/*" Recurse="1" Excludes="'"${EXCLUDES}"'"/>' >> "${MY_FOLDER}"
}
##
@@ -230,7 +236,8 @@ my_generate_folder()
else
case "${f}" in
${MY_ROOT_DIR}/include*)
- my_sub_tree "${MY_FILE}" "${f}" "Headers"
+ #my_sub_tree "${MY_FILE}" "${f}" "Headers"
+ my_wildcard "${MY_FILE}" "${f}" "Headers"
;;
*) my_wildcard "${MY_FILE}" "${f}"
;;
@@ -616,6 +623,12 @@ EOF
#define IEM_MC_LOCAL(a_Type, a_Name) a_Type a_Name
#define IEM_MC_ARG(a_Type, a_Name, a_iArg) a_Type a_Name
#define IEM_MC_ARG_CONST(a_Type, a_Name, a_Value, a_iArg) a_Type const a_Name = a_Value
+
+#define RTASN1_IMPL_GEN_SEQ_OF_TYPEDEFS_AND_PROTOS(a_SeqOfType, a_ItemType, a_DeclMacro, a_ImplExtNm) typedef struct a_SeqOfType { RTASN1SEQUENCECORE SeqCore; RTASN1ALLOCATION Allocation; uint32_t cItems; RT_CONCAT(P,a_ItemType) paItems; } a_SeqOfType; typedef a_SeqOfType *P##a_SeqOfType, const *PC##a_SeqOfType; int a_ImplExtNm##_DecodeAsn1(struct RTASN1CURSOR *pCursor, uint32_t fFlags, P##a_SeqOfType pThis, const char *pszErrorTag); int a_ImplExtNm##_Compare(PC##a_SeqOfType pLeft, PC##a_SeqOfType pRight)
+#define RTASN1_IMPL_GEN_SET_OF_TYPEDEFS_AND_PROTOS(a_SetOfType, a_ItemType, a_DeclMacro, a_ImplExtNm) typedef struct a_SetOfType { RTASN1SETCORE SetCore; RTASN1ALLOCATION Allocation; uint32_t cItems; RT_CONCAT(P,a_ItemType) paItems; } a_SetOfType; typedef a_SetOfType *P##a_SetOfType, const *PC##a_SetOfType; int a_ImplExtNm##_DecodeAsn1(struct RTASN1CURSOR *pCursor, uint32_t fFlags, P##a_SetOfType pThis, const char *pszErrorTag); int a_ImplExtNm##_Compare(PC##a_SetOfType pLeft, PC##a_SetOfType pRight)
+#define RTASN1TYPE_STANDARD_PROTOTYPES_NO_GET_CORE(a_TypeNm, a_DeclMacro, a_ImplExtNm) int a_ImplExtNm##_Init(P##a_TypeNm pThis, PCRTASN1ALLOCATORVTABLE pAllocator); int a_ImplExtNm##_Clone(P##a_TypeNm pThis, PC##a_TypeNm) pSrc, PCRTASN1ALLOCATORVTABLE pAllocator); void a_ImplExtNm##_Delete(P##a_TypeNm pThis); int a_ImplExtNm##_Enum(P##a_TypeNm pThis, PFNRTASN1ENUMCALLBACK pfnCallback, uint32_t uDepth, void *pvUser); int a_ImplExtNm##_Compare(PC##a_TypeNm) pLeft, PC##a_TypeNm pRight); int a_ImplExtNm##_DecodeAsn1(PRTASN1CURSOR pCursor, uint32_t fFlags, P##a_TypeNm pThis, const char *pszErrorTag); int a_ImplExtNm##_CheckSanity(PC##a_TypeNm pThis, uint32_t fFlags, PRTERRINFO pErrInfo, const char *pszErrorTag)
+#define RTASN1TYPE_STANDARD_PROTOTYPES(a_TypeNm, a_DeclMacro, a_ImplExtNm, a_Asn1CoreNm) inline PRTASN1CORE a_ImplExtNm##_GetAsn1Core(PC##a_TypeNm pThis) { return (PRTASN1CORE)&pThis->a_Asn1CoreNm; } inline bool a_ImplExtNm##_IsPresent(PC##a_TypeNm pThis) { return pThis && RTASN1CORE_IS_PRESENT(&pThis->a_Asn1CoreNm); } RTASN1TYPE_STANDARD_PROTOTYPES_NO_GET_CORE(a_TypeNm, a_DeclMacro, a_ImplExtNm)
+
EOF
MY_HDR_FILES=` echo ${MY_ROOT_DIR}/include/VBox/*.h ${MY_ROOT_DIR}/include/VBox/vmm/*.h \