From c55319243ed42f8bdcb940d69f03a9c6554cc1d4 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Michal=20Strehovsk=C3=BD?= Date: Thu, 16 May 2019 20:23:04 -0700 Subject: [PATCH] Add support for invariant casing in PAL (#24597) unicodedata.cpp based on UnicodeData.txt v11.0. --- src/pal/inc/pal.h | 3 + src/pal/src/CMakeLists.txt | 1 + src/pal/src/include/pal/unicodedata.h | 32 + src/pal/src/locale/unicode.cpp | 133 ++ src/pal/src/locale/unicodedata.cpp | 2342 ++++++++++++++++++++ src/pal/src/locale/unicodedata.cs | 65 + src/utilcode/sstring.cpp | 14 +- tests/src/Regressions/coreclr/20616/UnicodeBug.il | 103 + .../Regressions/coreclr/20616/UnicodeBug.ilproj | 35 + 9 files changed, 2726 insertions(+), 2 deletions(-) create mode 100644 src/pal/src/include/pal/unicodedata.h create mode 100644 src/pal/src/locale/unicodedata.cpp create mode 100644 src/pal/src/locale/unicodedata.cs create mode 100644 tests/src/Regressions/coreclr/20616/UnicodeBug.il create mode 100644 tests/src/Regressions/coreclr/20616/UnicodeBug.ilproj diff --git a/src/pal/inc/pal.h b/src/pal/inc/pal.h index 1c69c30..97091bf 100644 --- a/src/pal/inc/pal.h +++ b/src/pal/inc/pal.h @@ -4618,6 +4618,9 @@ PALIMPORT DLLEXPORT int __cdecl _putenv(const char *); #define ERANGE 34 +PALIMPORT WCHAR __cdecl PAL_ToUpperInvariant(WCHAR); +PALIMPORT WCHAR __cdecl PAL_ToLowerInvariant(WCHAR); + /******************* PAL-specific I/O completion port *****************/ typedef struct _PAL_IOCP_CPU_INFORMATION { diff --git a/src/pal/src/CMakeLists.txt b/src/pal/src/CMakeLists.txt index d0cf789..28f5bfb 100644 --- a/src/pal/src/CMakeLists.txt +++ b/src/pal/src/CMakeLists.txt @@ -212,6 +212,7 @@ set(SOURCES loader/module.cpp loader/modulename.cpp locale/unicode.cpp + locale/unicodedata.cpp locale/utf8.cpp map/common.cpp map/map.cpp diff --git a/src/pal/src/include/pal/unicodedata.h b/src/pal/src/include/pal/unicodedata.h new file mode 100644 index 0000000..42b4139 --- /dev/null +++ b/src/pal/src/include/pal/unicodedata.h @@ -0,0 +1,32 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +#ifndef _PAL_UNICODEDATA_H_ +#define _PAL_UNICODEDATA_H_ + +#include "pal/palinternal.h" + +#ifdef __cplusplus +extern "C" +{ +#endif // __cplusplus + +#define UPPER_CASE 1 +#define LOWER_CASE 2 + +typedef struct +{ + WCHAR nUnicodeValue; + WORD nFlag; + WCHAR nOpposingCase; +} UnicodeDataRec; + +extern CONST UnicodeDataRec UnicodeData[]; +extern CONST UINT UNICODE_DATA_SIZE; + +#ifdef __cplusplus +} +#endif // __cplusplus + +#endif /* _UNICODE_DATA_H_ */ diff --git a/src/pal/src/locale/unicode.cpp b/src/pal/src/locale/unicode.cpp index 085dbb8..f366b0f 100644 --- a/src/pal/src/locale/unicode.cpp +++ b/src/pal/src/locale/unicode.cpp @@ -29,6 +29,7 @@ Revision History: #include "pal/locale.h" #include "pal/cruntime.h" #include "pal/stackstring.hpp" +#include "pal/unicodedata.h" #if !(HAVE_PTHREAD_RWLOCK_T || HAVE_COREFOUNDATION) #error Either pthread rwlocks or Core Foundation are required for Unicode support @@ -81,6 +82,138 @@ static const UINT PAL_ACP = 65001; /*++ Function: +UnicodeDataComp +This is the comparison function used by the bsearch function to search +for unicode characters in the UnicodeData array. + +Parameter: +pnKey +The unicode character value to search for. +elem +A pointer to a UnicodeDataRec. + +Return value: +<0 if pnKey < elem->nUnicodeValue +0 if pnKey == elem->nUnicodeValue +>0 if pnKey > elem->nUnicodeValue +--*/ +static int UnicodeDataComp(const void *pnKey, const void *elem) +{ + WCHAR uValue = ((UnicodeDataRec*)elem)->nUnicodeValue; + + if (*((INT*)pnKey) < uValue) + { + return -1; + } + else if (*((INT*)pnKey) > uValue) + { + return 1; + } + else + { + return 0; + } +} + +/*++ +Function: +GetUnicodeData +This function is used to get information about a Unicode character. + +Parameters: +nUnicodeValue +The numeric value of the Unicode character to get information about. +pDataRec +The UnicodeDataRec to fill in with the data for the Unicode character. + +Return value: +TRUE if the Unicode character was found. + +--*/ +BOOL GetUnicodeData(INT nUnicodeValue, UnicodeDataRec *pDataRec) +{ + BOOL bRet; + + UnicodeDataRec *dataRec; + INT nNumOfChars = UNICODE_DATA_SIZE; + dataRec = (UnicodeDataRec *) bsearch(&nUnicodeValue, UnicodeData, nNumOfChars, + sizeof(UnicodeDataRec), UnicodeDataComp); + if (dataRec == NULL) + { + bRet = FALSE; + } + else + { + bRet = TRUE; + *pDataRec = *dataRec; + } + return bRet; +} + +wchar_16 +__cdecl +PAL_ToUpperInvariant( wchar_16 c ) +{ + UnicodeDataRec dataRec; + + PERF_ENTRY(PAL_ToUpperInvariant); + ENTRY("PAL_ToUpperInvariant (c=%d)\n", c); + + if (!GetUnicodeData(c, &dataRec)) + { + TRACE( "Unable to retrieve unicode data for the character %c.\n", c ); + LOGEXIT("PAL_ToUpperInvariant returns int %d\n", c ); + PERF_EXIT(PAL_ToUpperInvariant); + return c; + } + + if ( dataRec.nFlag != LOWER_CASE ) + { + LOGEXIT("PAL_ToUpperInvariant returns int %d\n", c ); + PERF_EXIT(PAL_ToUpperInvariant); + return c; + } + else + { + LOGEXIT("PAL_ToUpperInvariant returns int %d\n", dataRec.nOpposingCase ); + PERF_EXIT(PAL_ToUpperInvariant); + return dataRec.nOpposingCase; + } +} + +wchar_16 +__cdecl +PAL_ToLowerInvariant( wchar_16 c ) +{ + UnicodeDataRec dataRec; + + PERF_ENTRY(PAL_ToLowerInvariant); + ENTRY("PAL_ToLowerInvariant (c=%d)\n", c); + + if (!GetUnicodeData(c, &dataRec)) + { + TRACE( "Unable to retrieve unicode data for the character %c.\n", c ); + LOGEXIT("PAL_ToLowerInvariant returns int %d\n", c ); + PERF_EXIT(PAL_ToLowerInvariant); + return c; + } + + if ( dataRec.nFlag != UPPER_CASE ) + { + LOGEXIT("PAL_ToLowerInvariant returns int %d\n", c ); + PERF_EXIT(PAL_ToLowerInvariant); + return c; + } + else + { + LOGEXIT("PAL_ToLowerInvariant returns int %d\n", dataRec.nOpposingCase ); + PERF_EXIT(PAL_ToLowerInvariant); + return dataRec.nOpposingCase; + } +} + +/*++ +Function: CODEPAGEGetData IN UINT CodePage - The code page the caller diff --git a/src/pal/src/locale/unicodedata.cpp b/src/pal/src/locale/unicodedata.cpp new file mode 100644 index 0000000..54b7e14 --- /dev/null +++ b/src/pal/src/locale/unicodedata.cpp @@ -0,0 +1,2342 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +#include "pal/unicodedata.h" + +// +// THIS FILE IS GENERATED. DO NOT HAND EDIT. +// + +CONST UnicodeDataRec UnicodeData[] = { + { 0x41, UPPER_CASE, 0x61 }, + { 0x42, UPPER_CASE, 0x62 }, + { 0x43, UPPER_CASE, 0x63 }, + { 0x44, UPPER_CASE, 0x64 }, + { 0x45, UPPER_CASE, 0x65 }, + { 0x46, UPPER_CASE, 0x66 }, + { 0x47, UPPER_CASE, 0x67 }, + { 0x48, UPPER_CASE, 0x68 }, + { 0x49, UPPER_CASE, 0x69 }, + { 0x4A, UPPER_CASE, 0x6A }, + { 0x4B, UPPER_CASE, 0x6B }, + { 0x4C, UPPER_CASE, 0x6C }, + { 0x4D, UPPER_CASE, 0x6D }, + { 0x4E, UPPER_CASE, 0x6E }, + { 0x4F, UPPER_CASE, 0x6F }, + { 0x50, UPPER_CASE, 0x70 }, + { 0x51, UPPER_CASE, 0x71 }, + { 0x52, UPPER_CASE, 0x72 }, + { 0x53, UPPER_CASE, 0x73 }, + { 0x54, UPPER_CASE, 0x74 }, + { 0x55, UPPER_CASE, 0x75 }, + { 0x56, UPPER_CASE, 0x76 }, + { 0x57, UPPER_CASE, 0x77 }, + { 0x58, UPPER_CASE, 0x78 }, + { 0x59, UPPER_CASE, 0x79 }, + { 0x5A, UPPER_CASE, 0x7A }, + { 0x61, LOWER_CASE, 0x41 }, + { 0x62, LOWER_CASE, 0x42 }, + { 0x63, LOWER_CASE, 0x43 }, + { 0x64, LOWER_CASE, 0x44 }, + { 0x65, LOWER_CASE, 0x45 }, + { 0x66, LOWER_CASE, 0x46 }, + { 0x67, LOWER_CASE, 0x47 }, + { 0x68, LOWER_CASE, 0x48 }, + { 0x69, LOWER_CASE, 0x49 }, + { 0x6A, LOWER_CASE, 0x4A }, + { 0x6B, LOWER_CASE, 0x4B }, + { 0x6C, LOWER_CASE, 0x4C }, + { 0x6D, LOWER_CASE, 0x4D }, + { 0x6E, LOWER_CASE, 0x4E }, + { 0x6F, LOWER_CASE, 0x4F }, + { 0x70, LOWER_CASE, 0x50 }, + { 0x71, LOWER_CASE, 0x51 }, + { 0x72, LOWER_CASE, 0x52 }, + { 0x73, LOWER_CASE, 0x53 }, + { 0x74, LOWER_CASE, 0x54 }, + { 0x75, LOWER_CASE, 0x55 }, + { 0x76, LOWER_CASE, 0x56 }, + { 0x77, LOWER_CASE, 0x57 }, + { 0x78, LOWER_CASE, 0x58 }, + { 0x79, LOWER_CASE, 0x59 }, + { 0x7A, LOWER_CASE, 0x5A }, + { 0xB5, LOWER_CASE, 0x39C }, + { 0xC0, UPPER_CASE, 0xE0 }, + { 0xC1, UPPER_CASE, 0xE1 }, + { 0xC2, UPPER_CASE, 0xE2 }, + { 0xC3, UPPER_CASE, 0xE3 }, + { 0xC4, UPPER_CASE, 0xE4 }, + { 0xC5, UPPER_CASE, 0xE5 }, + { 0xC6, UPPER_CASE, 0xE6 }, + { 0xC7, UPPER_CASE, 0xE7 }, + { 0xC8, UPPER_CASE, 0xE8 }, + { 0xC9, UPPER_CASE, 0xE9 }, + { 0xCA, UPPER_CASE, 0xEA }, + { 0xCB, UPPER_CASE, 0xEB }, + { 0xCC, UPPER_CASE, 0xEC }, + { 0xCD, UPPER_CASE, 0xED }, + { 0xCE, UPPER_CASE, 0xEE }, + { 0xCF, UPPER_CASE, 0xEF }, + { 0xD0, UPPER_CASE, 0xF0 }, + { 0xD1, UPPER_CASE, 0xF1 }, + { 0xD2, UPPER_CASE, 0xF2 }, + { 0xD3, UPPER_CASE, 0xF3 }, + { 0xD4, UPPER_CASE, 0xF4 }, + { 0xD5, UPPER_CASE, 0xF5 }, + { 0xD6, UPPER_CASE, 0xF6 }, + { 0xD8, UPPER_CASE, 0xF8 }, + { 0xD9, UPPER_CASE, 0xF9 }, + { 0xDA, UPPER_CASE, 0xFA }, + { 0xDB, UPPER_CASE, 0xFB }, + { 0xDC, UPPER_CASE, 0xFC }, + { 0xDD, UPPER_CASE, 0xFD }, + { 0xDE, UPPER_CASE, 0xFE }, + { 0xE0, LOWER_CASE, 0xC0 }, + { 0xE1, LOWER_CASE, 0xC1 }, + { 0xE2, LOWER_CASE, 0xC2 }, + { 0xE3, LOWER_CASE, 0xC3 }, + { 0xE4, LOWER_CASE, 0xC4 }, + { 0xE5, LOWER_CASE, 0xC5 }, + { 0xE6, LOWER_CASE, 0xC6 }, + { 0xE7, LOWER_CASE, 0xC7 }, + { 0xE8, LOWER_CASE, 0xC8 }, + { 0xE9, LOWER_CASE, 0xC9 }, + { 0xEA, LOWER_CASE, 0xCA }, + { 0xEB, LOWER_CASE, 0xCB }, + { 0xEC, LOWER_CASE, 0xCC }, + { 0xED, LOWER_CASE, 0xCD }, + { 0xEE, LOWER_CASE, 0xCE }, + { 0xEF, LOWER_CASE, 0xCF }, + { 0xF0, LOWER_CASE, 0xD0 }, + { 0xF1, LOWER_CASE, 0xD1 }, + { 0xF2, LOWER_CASE, 0xD2 }, + { 0xF3, LOWER_CASE, 0xD3 }, + { 0xF4, LOWER_CASE, 0xD4 }, + { 0xF5, LOWER_CASE, 0xD5 }, + { 0xF6, LOWER_CASE, 0xD6 }, + { 0xF8, LOWER_CASE, 0xD8 }, + { 0xF9, LOWER_CASE, 0xD9 }, + { 0xFA, LOWER_CASE, 0xDA }, + { 0xFB, LOWER_CASE, 0xDB }, + { 0xFC, LOWER_CASE, 0xDC }, + { 0xFD, LOWER_CASE, 0xDD }, + { 0xFE, LOWER_CASE, 0xDE }, + { 0xFF, LOWER_CASE, 0x178 }, + { 0x100, UPPER_CASE, 0x101 }, + { 0x101, LOWER_CASE, 0x100 }, + { 0x102, UPPER_CASE, 0x103 }, + { 0x103, LOWER_CASE, 0x102 }, + { 0x104, UPPER_CASE, 0x105 }, + { 0x105, LOWER_CASE, 0x104 }, + { 0x106, UPPER_CASE, 0x107 }, + { 0x107, LOWER_CASE, 0x106 }, + { 0x108, UPPER_CASE, 0x109 }, + { 0x109, LOWER_CASE, 0x108 }, + { 0x10A, UPPER_CASE, 0x10B }, + { 0x10B, LOWER_CASE, 0x10A }, + { 0x10C, UPPER_CASE, 0x10D }, + { 0x10D, LOWER_CASE, 0x10C }, + { 0x10E, UPPER_CASE, 0x10F }, + { 0x10F, LOWER_CASE, 0x10E }, + { 0x110, UPPER_CASE, 0x111 }, + { 0x111, LOWER_CASE, 0x110 }, + { 0x112, UPPER_CASE, 0x113 }, + { 0x113, LOWER_CASE, 0x112 }, + { 0x114, UPPER_CASE, 0x115 }, + { 0x115, LOWER_CASE, 0x114 }, + { 0x116, UPPER_CASE, 0x117 }, + { 0x117, LOWER_CASE, 0x116 }, + { 0x118, UPPER_CASE, 0x119 }, + { 0x119, LOWER_CASE, 0x118 }, + { 0x11A, UPPER_CASE, 0x11B }, + { 0x11B, LOWER_CASE, 0x11A }, + { 0x11C, UPPER_CASE, 0x11D }, + { 0x11D, LOWER_CASE, 0x11C }, + { 0x11E, UPPER_CASE, 0x11F }, + { 0x11F, LOWER_CASE, 0x11E }, + { 0x120, UPPER_CASE, 0x121 }, + { 0x121, LOWER_CASE, 0x120 }, + { 0x122, UPPER_CASE, 0x123 }, + { 0x123, LOWER_CASE, 0x122 }, + { 0x124, UPPER_CASE, 0x125 }, + { 0x125, LOWER_CASE, 0x124 }, + { 0x126, UPPER_CASE, 0x127 }, + { 0x127, LOWER_CASE, 0x126 }, + { 0x128, UPPER_CASE, 0x129 }, + { 0x129, LOWER_CASE, 0x128 }, + { 0x12A, UPPER_CASE, 0x12B }, + { 0x12B, LOWER_CASE, 0x12A }, + { 0x12C, UPPER_CASE, 0x12D }, + { 0x12D, LOWER_CASE, 0x12C }, + { 0x12E, UPPER_CASE, 0x12F }, + { 0x12F, LOWER_CASE, 0x12E }, + { 0x130, UPPER_CASE, 0x69 }, + { 0x131, LOWER_CASE, 0x49 }, + { 0x132, UPPER_CASE, 0x133 }, + { 0x133, LOWER_CASE, 0x132 }, + { 0x134, UPPER_CASE, 0x135 }, + { 0x135, LOWER_CASE, 0x134 }, + { 0x136, UPPER_CASE, 0x137 }, + { 0x137, LOWER_CASE, 0x136 }, + { 0x139, UPPER_CASE, 0x13A }, + { 0x13A, LOWER_CASE, 0x139 }, + { 0x13B, UPPER_CASE, 0x13C }, + { 0x13C, LOWER_CASE, 0x13B }, + { 0x13D, UPPER_CASE, 0x13E }, + { 0x13E, LOWER_CASE, 0x13D }, + { 0x13F, UPPER_CASE, 0x140 }, + { 0x140, LOWER_CASE, 0x13F }, + { 0x141, UPPER_CASE, 0x142 }, + { 0x142, LOWER_CASE, 0x141 }, + { 0x143, UPPER_CASE, 0x144 }, + { 0x144, LOWER_CASE, 0x143 }, + { 0x145, UPPER_CASE, 0x146 }, + { 0x146, LOWER_CASE, 0x145 }, + { 0x147, UPPER_CASE, 0x148 }, + { 0x148, LOWER_CASE, 0x147 }, + { 0x14A, UPPER_CASE, 0x14B }, + { 0x14B, LOWER_CASE, 0x14A }, + { 0x14C, UPPER_CASE, 0x14D }, + { 0x14D, LOWER_CASE, 0x14C }, + { 0x14E, UPPER_CASE, 0x14F }, + { 0x14F, LOWER_CASE, 0x14E }, + { 0x150, UPPER_CASE, 0x151 }, + { 0x151, LOWER_CASE, 0x150 }, + { 0x152, UPPER_CASE, 0x153 }, + { 0x153, LOWER_CASE, 0x152 }, + { 0x154, UPPER_CASE, 0x155 }, + { 0x155, LOWER_CASE, 0x154 }, + { 0x156, UPPER_CASE, 0x157 }, + { 0x157, LOWER_CASE, 0x156 }, + { 0x158, UPPER_CASE, 0x159 }, + { 0x159, LOWER_CASE, 0x158 }, + { 0x15A, UPPER_CASE, 0x15B }, + { 0x15B, LOWER_CASE, 0x15A }, + { 0x15C, UPPER_CASE, 0x15D }, + { 0x15D, LOWER_CASE, 0x15C }, + { 0x15E, UPPER_CASE, 0x15F }, + { 0x15F, LOWER_CASE, 0x15E }, + { 0x160, UPPER_CASE, 0x161 }, + { 0x161, LOWER_CASE, 0x160 }, + { 0x162, UPPER_CASE, 0x163 }, + { 0x163, LOWER_CASE, 0x162 }, + { 0x164, UPPER_CASE, 0x165 }, + { 0x165, LOWER_CASE, 0x164 }, + { 0x166, UPPER_CASE, 0x167 }, + { 0x167, LOWER_CASE, 0x166 }, + { 0x168, UPPER_CASE, 0x169 }, + { 0x169, LOWER_CASE, 0x168 }, + { 0x16A, UPPER_CASE, 0x16B }, + { 0x16B, LOWER_CASE, 0x16A }, + { 0x16C, UPPER_CASE, 0x16D }, + { 0x16D, LOWER_CASE, 0x16C }, + { 0x16E, UPPER_CASE, 0x16F }, + { 0x16F, LOWER_CASE, 0x16E }, + { 0x170, UPPER_CASE, 0x171 }, + { 0x171, LOWER_CASE, 0x170 }, + { 0x172, UPPER_CASE, 0x173 }, + { 0x173, LOWER_CASE, 0x172 }, + { 0x174, UPPER_CASE, 0x175 }, + { 0x175, LOWER_CASE, 0x174 }, + { 0x176, UPPER_CASE, 0x177 }, + { 0x177, LOWER_CASE, 0x176 }, + { 0x178, UPPER_CASE, 0xFF }, + { 0x179, UPPER_CASE, 0x17A }, + { 0x17A, LOWER_CASE, 0x179 }, + { 0x17B, UPPER_CASE, 0x17C }, + { 0x17C, LOWER_CASE, 0x17B }, + { 0x17D, UPPER_CASE, 0x17E }, + { 0x17E, LOWER_CASE, 0x17D }, + { 0x17F, LOWER_CASE, 0x53 }, + { 0x180, LOWER_CASE, 0x243 }, + { 0x181, UPPER_CASE, 0x253 }, + { 0x182, UPPER_CASE, 0x183 }, + { 0x183, LOWER_CASE, 0x182 }, + { 0x184, UPPER_CASE, 0x185 }, + { 0x185, LOWER_CASE, 0x184 }, + { 0x186, UPPER_CASE, 0x254 }, + { 0x187, UPPER_CASE, 0x188 }, + { 0x188, LOWER_CASE, 0x187 }, + { 0x189, UPPER_CASE, 0x256 }, + { 0x18A, UPPER_CASE, 0x257 }, + { 0x18B, UPPER_CASE, 0x18C }, + { 0x18C, LOWER_CASE, 0x18B }, + { 0x18E, UPPER_CASE, 0x1DD }, + { 0x18F, UPPER_CASE, 0x259 }, + { 0x190, UPPER_CASE, 0x25B }, + { 0x191, UPPER_CASE, 0x192 }, + { 0x192, LOWER_CASE, 0x191 }, + { 0x193, UPPER_CASE, 0x260 }, + { 0x194, UPPER_CASE, 0x263 }, + { 0x195, LOWER_CASE, 0x1F6 }, + { 0x196, UPPER_CASE, 0x269 }, + { 0x197, UPPER_CASE, 0x268 }, + { 0x198, UPPER_CASE, 0x199 }, + { 0x199, LOWER_CASE, 0x198 }, + { 0x19A, LOWER_CASE, 0x23D }, + { 0x19C, UPPER_CASE, 0x26F }, + { 0x19D, UPPER_CASE, 0x272 }, + { 0x19E, LOWER_CASE, 0x220 }, + { 0x19F, UPPER_CASE, 0x275 }, + { 0x1A0, UPPER_CASE, 0x1A1 }, + { 0x1A1, LOWER_CASE, 0x1A0 }, + { 0x1A2, UPPER_CASE, 0x1A3 }, + { 0x1A3, LOWER_CASE, 0x1A2 }, + { 0x1A4, UPPER_CASE, 0x1A5 }, + { 0x1A5, LOWER_CASE, 0x1A4 }, + { 0x1A6, UPPER_CASE, 0x280 }, + { 0x1A7, UPPER_CASE, 0x1A8 }, + { 0x1A8, LOWER_CASE, 0x1A7 }, + { 0x1A9, UPPER_CASE, 0x283 }, + { 0x1AC, UPPER_CASE, 0x1AD }, + { 0x1AD, LOWER_CASE, 0x1AC }, + { 0x1AE, UPPER_CASE, 0x288 }, + { 0x1AF, UPPER_CASE, 0x1B0 }, + { 0x1B0, LOWER_CASE, 0x1AF }, + { 0x1B1, UPPER_CASE, 0x28A }, + { 0x1B2, UPPER_CASE, 0x28B }, + { 0x1B3, UPPER_CASE, 0x1B4 }, + { 0x1B4, LOWER_CASE, 0x1B3 }, + { 0x1B5, UPPER_CASE, 0x1B6 }, + { 0x1B6, LOWER_CASE, 0x1B5 }, + { 0x1B7, UPPER_CASE, 0x292 }, + { 0x1B8, UPPER_CASE, 0x1B9 }, + { 0x1B9, LOWER_CASE, 0x1B8 }, + { 0x1BC, UPPER_CASE, 0x1BD }, + { 0x1BD, LOWER_CASE, 0x1BC }, + { 0x1BF, LOWER_CASE, 0x1F7 }, + { 0x1C4, UPPER_CASE, 0x1C6 }, + { 0x1C5, LOWER_CASE, 0x1C4 }, + { 0x1C6, LOWER_CASE, 0x1C4 }, + { 0x1C7, UPPER_CASE, 0x1C9 }, + { 0x1C8, LOWER_CASE, 0x1C7 }, + { 0x1C9, LOWER_CASE, 0x1C7 }, + { 0x1CA, UPPER_CASE, 0x1CC }, + { 0x1CB, LOWER_CASE, 0x1CA }, + { 0x1CC, LOWER_CASE, 0x1CA }, + { 0x1CD, UPPER_CASE, 0x1CE }, + { 0x1CE, LOWER_CASE, 0x1CD }, + { 0x1CF, UPPER_CASE, 0x1D0 }, + { 0x1D0, LOWER_CASE, 0x1CF }, + { 0x1D1, UPPER_CASE, 0x1D2 }, + { 0x1D2, LOWER_CASE, 0x1D1 }, + { 0x1D3, UPPER_CASE, 0x1D4 }, + { 0x1D4, LOWER_CASE, 0x1D3 }, + { 0x1D5, UPPER_CASE, 0x1D6 }, + { 0x1D6, LOWER_CASE, 0x1D5 }, + { 0x1D7, UPPER_CASE, 0x1D8 }, + { 0x1D8, LOWER_CASE, 0x1D7 }, + { 0x1D9, UPPER_CASE, 0x1DA }, + { 0x1DA, LOWER_CASE, 0x1D9 }, + { 0x1DB, UPPER_CASE, 0x1DC }, + { 0x1DC, LOWER_CASE, 0x1DB }, + { 0x1DD, LOWER_CASE, 0x18E }, + { 0x1DE, UPPER_CASE, 0x1DF }, + { 0x1DF, LOWER_CASE, 0x1DE }, + { 0x1E0, UPPER_CASE, 0x1E1 }, + { 0x1E1, LOWER_CASE, 0x1E0 }, + { 0x1E2, UPPER_CASE, 0x1E3 }, + { 0x1E3, LOWER_CASE, 0x1E2 }, + { 0x1E4, UPPER_CASE, 0x1E5 }, + { 0x1E5, LOWER_CASE, 0x1E4 }, + { 0x1E6, UPPER_CASE, 0x1E7 }, + { 0x1E7, LOWER_CASE, 0x1E6 }, + { 0x1E8, UPPER_CASE, 0x1E9 }, + { 0x1E9, LOWER_CASE, 0x1E8 }, + { 0x1EA, UPPER_CASE, 0x1EB }, + { 0x1EB, LOWER_CASE, 0x1EA }, + { 0x1EC, UPPER_CASE, 0x1ED }, + { 0x1ED, LOWER_CASE, 0x1EC }, + { 0x1EE, UPPER_CASE, 0x1EF }, + { 0x1EF, LOWER_CASE, 0x1EE }, + { 0x1F1, UPPER_CASE, 0x1F3 }, + { 0x1F2, LOWER_CASE, 0x1F1 }, + { 0x1F3, LOWER_CASE, 0x1F1 }, + { 0x1F4, UPPER_CASE, 0x1F5 }, + { 0x1F5, LOWER_CASE, 0x1F4 }, + { 0x1F6, UPPER_CASE, 0x195 }, + { 0x1F7, UPPER_CASE, 0x1BF }, + { 0x1F8, UPPER_CASE, 0x1F9 }, + { 0x1F9, LOWER_CASE, 0x1F8 }, + { 0x1FA, UPPER_CASE, 0x1FB }, + { 0x1FB, LOWER_CASE, 0x1FA }, + { 0x1FC, UPPER_CASE, 0x1FD }, + { 0x1FD, LOWER_CASE, 0x1FC }, + { 0x1FE, UPPER_CASE, 0x1FF }, + { 0x1FF, LOWER_CASE, 0x1FE }, + { 0x200, UPPER_CASE, 0x201 }, + { 0x201, LOWER_CASE, 0x200 }, + { 0x202, UPPER_CASE, 0x203 }, + { 0x203, LOWER_CASE, 0x202 }, + { 0x204, UPPER_CASE, 0x205 }, + { 0x205, LOWER_CASE, 0x204 }, + { 0x206, UPPER_CASE, 0x207 }, + { 0x207, LOWER_CASE, 0x206 }, + { 0x208, UPPER_CASE, 0x209 }, + { 0x209, LOWER_CASE, 0x208 }, + { 0x20A, UPPER_CASE, 0x20B }, + { 0x20B, LOWER_CASE, 0x20A }, + { 0x20C, UPPER_CASE, 0x20D }, + { 0x20D, LOWER_CASE, 0x20C }, + { 0x20E, UPPER_CASE, 0x20F }, + { 0x20F, LOWER_CASE, 0x20E }, + { 0x210, UPPER_CASE, 0x211 }, + { 0x211, LOWER_CASE, 0x210 }, + { 0x212, UPPER_CASE, 0x213 }, + { 0x213, LOWER_CASE, 0x212 }, + { 0x214, UPPER_CASE, 0x215 }, + { 0x215, LOWER_CASE, 0x214 }, + { 0x216, UPPER_CASE, 0x217 }, + { 0x217, LOWER_CASE, 0x216 }, + { 0x218, UPPER_CASE, 0x219 }, + { 0x219, LOWER_CASE, 0x218 }, + { 0x21A, UPPER_CASE, 0x21B }, + { 0x21B, LOWER_CASE, 0x21A }, + { 0x21C, UPPER_CASE, 0x21D }, + { 0x21D, LOWER_CASE, 0x21C }, + { 0x21E, UPPER_CASE, 0x21F }, + { 0x21F, LOWER_CASE, 0x21E }, + { 0x220, UPPER_CASE, 0x19E }, + { 0x222, UPPER_CASE, 0x223 }, + { 0x223, LOWER_CASE, 0x222 }, + { 0x224, UPPER_CASE, 0x225 }, + { 0x225, LOWER_CASE, 0x224 }, + { 0x226, UPPER_CASE, 0x227 }, + { 0x227, LOWER_CASE, 0x226 }, + { 0x228, UPPER_CASE, 0x229 }, + { 0x229, LOWER_CASE, 0x228 }, + { 0x22A, UPPER_CASE, 0x22B }, + { 0x22B, LOWER_CASE, 0x22A }, + { 0x22C, UPPER_CASE, 0x22D }, + { 0x22D, LOWER_CASE, 0x22C }, + { 0x22E, UPPER_CASE, 0x22F }, + { 0x22F, LOWER_CASE, 0x22E }, + { 0x230, UPPER_CASE, 0x231 }, + { 0x231, LOWER_CASE, 0x230 }, + { 0x232, UPPER_CASE, 0x233 }, + { 0x233, LOWER_CASE, 0x232 }, + { 0x23A, UPPER_CASE, 0x2C65 }, + { 0x23B, UPPER_CASE, 0x23C }, + { 0x23C, LOWER_CASE, 0x23B }, + { 0x23D, UPPER_CASE, 0x19A }, + { 0x23E, UPPER_CASE, 0x2C66 }, + { 0x23F, LOWER_CASE, 0x2C7E }, + { 0x240, LOWER_CASE, 0x2C7F }, + { 0x241, UPPER_CASE, 0x242 }, + { 0x242, LOWER_CASE, 0x241 }, + { 0x243, UPPER_CASE, 0x180 }, + { 0x244, UPPER_CASE, 0x289 }, + { 0x245, UPPER_CASE, 0x28C }, + { 0x246, UPPER_CASE, 0x247 }, + { 0x247, LOWER_CASE, 0x246 }, + { 0x248, UPPER_CASE, 0x249 }, + { 0x249, LOWER_CASE, 0x248 }, + { 0x24A, UPPER_CASE, 0x24B }, + { 0x24B, LOWER_CASE, 0x24A }, + { 0x24C, UPPER_CASE, 0x24D }, + { 0x24D, LOWER_CASE, 0x24C }, + { 0x24E, UPPER_CASE, 0x24F }, + { 0x24F, LOWER_CASE, 0x24E }, + { 0x250, LOWER_CASE, 0x2C6F }, + { 0x251, LOWER_CASE, 0x2C6D }, + { 0x252, LOWER_CASE, 0x2C70 }, + { 0x253, LOWER_CASE, 0x181 }, + { 0x254, LOWER_CASE, 0x186 }, + { 0x256, LOWER_CASE, 0x189 }, + { 0x257, LOWER_CASE, 0x18A }, + { 0x259, LOWER_CASE, 0x18F }, + { 0x25B, LOWER_CASE, 0x190 }, + { 0x25C, LOWER_CASE, 0xA7AB }, + { 0x260, LOWER_CASE, 0x193 }, + { 0x261, LOWER_CASE, 0xA7AC }, + { 0x263, LOWER_CASE, 0x194 }, + { 0x265, LOWER_CASE, 0xA78D }, + { 0x266, LOWER_CASE, 0xA7AA }, + { 0x268, LOWER_CASE, 0x197 }, + { 0x269, LOWER_CASE, 0x196 }, + { 0x26A, LOWER_CASE, 0xA7AE }, + { 0x26B, LOWER_CASE, 0x2C62 }, + { 0x26C, LOWER_CASE, 0xA7AD }, + { 0x26F, LOWER_CASE, 0x19C }, + { 0x271, LOWER_CASE, 0x2C6E }, + { 0x272, LOWER_CASE, 0x19D }, + { 0x275, LOWER_CASE, 0x19F }, + { 0x27D, LOWER_CASE, 0x2C64 }, + { 0x280, LOWER_CASE, 0x1A6 }, + { 0x283, LOWER_CASE, 0x1A9 }, + { 0x287, LOWER_CASE, 0xA7B1 }, + { 0x288, LOWER_CASE, 0x1AE }, + { 0x289, LOWER_CASE, 0x244 }, + { 0x28A, LOWER_CASE, 0x1B1 }, + { 0x28B, LOWER_CASE, 0x1B2 }, + { 0x28C, LOWER_CASE, 0x245 }, + { 0x292, LOWER_CASE, 0x1B7 }, + { 0x29D, LOWER_CASE, 0xA7B2 }, + { 0x29E, LOWER_CASE, 0xA7B0 }, + { 0x345, LOWER_CASE, 0x399 }, + { 0x370, UPPER_CASE, 0x371 }, + { 0x371, LOWER_CASE, 0x370 }, + { 0x372, UPPER_CASE, 0x373 }, + { 0x373, LOWER_CASE, 0x372 }, + { 0x376, UPPER_CASE, 0x377 }, + { 0x377, LOWER_CASE, 0x376 }, + { 0x37B, LOWER_CASE, 0x3FD }, + { 0x37C, LOWER_CASE, 0x3FE }, + { 0x37D, LOWER_CASE, 0x3FF }, + { 0x37F, UPPER_CASE, 0x3F3 }, + { 0x386, UPPER_CASE, 0x3AC }, + { 0x388, UPPER_CASE, 0x3AD }, + { 0x389, UPPER_CASE, 0x3AE }, + { 0x38A, UPPER_CASE, 0x3AF }, + { 0x38C, UPPER_CASE, 0x3CC }, + { 0x38E, UPPER_CASE, 0x3CD }, + { 0x38F, UPPER_CASE, 0x3CE }, + { 0x391, UPPER_CASE, 0x3B1 }, + { 0x392, UPPER_CASE, 0x3B2 }, + { 0x393, UPPER_CASE, 0x3B3 }, + { 0x394, UPPER_CASE, 0x3B4 }, + { 0x395, UPPER_CASE, 0x3B5 }, + { 0x396, UPPER_CASE, 0x3B6 }, + { 0x397, UPPER_CASE, 0x3B7 }, + { 0x398, UPPER_CASE, 0x3B8 }, + { 0x399, UPPER_CASE, 0x3B9 }, + { 0x39A, UPPER_CASE, 0x3BA }, + { 0x39B, UPPER_CASE, 0x3BB }, + { 0x39C, UPPER_CASE, 0x3BC }, + { 0x39D, UPPER_CASE, 0x3BD }, + { 0x39E, UPPER_CASE, 0x3BE }, + { 0x39F, UPPER_CASE, 0x3BF }, + { 0x3A0, UPPER_CASE, 0x3C0 }, + { 0x3A1, UPPER_CASE, 0x3C1 }, + { 0x3A3, UPPER_CASE, 0x3C3 }, + { 0x3A4, UPPER_CASE, 0x3C4 }, + { 0x3A5, UPPER_CASE, 0x3C5 }, + { 0x3A6, UPPER_CASE, 0x3C6 }, + { 0x3A7, UPPER_CASE, 0x3C7 }, + { 0x3A8, UPPER_CASE, 0x3C8 }, + { 0x3A9, UPPER_CASE, 0x3C9 }, + { 0x3AA, UPPER_CASE, 0x3CA }, + { 0x3AB, UPPER_CASE, 0x3CB }, + { 0x3AC, LOWER_CASE, 0x386 }, + { 0x3AD, LOWER_CASE, 0x388 }, + { 0x3AE, LOWER_CASE, 0x389 }, + { 0x3AF, LOWER_CASE, 0x38A }, + { 0x3B1, LOWER_CASE, 0x391 }, + { 0x3B2, LOWER_CASE, 0x392 }, + { 0x3B3, LOWER_CASE, 0x393 }, + { 0x3B4, LOWER_CASE, 0x394 }, + { 0x3B5, LOWER_CASE, 0x395 }, + { 0x3B6, LOWER_CASE, 0x396 }, + { 0x3B7, LOWER_CASE, 0x397 }, + { 0x3B8, LOWER_CASE, 0x398 }, + { 0x3B9, LOWER_CASE, 0x399 }, + { 0x3BA, LOWER_CASE, 0x39A }, + { 0x3BB, LOWER_CASE, 0x39B }, + { 0x3BC, LOWER_CASE, 0x39C }, + { 0x3BD, LOWER_CASE, 0x39D }, + { 0x3BE, LOWER_CASE, 0x39E }, + { 0x3BF, LOWER_CASE, 0x39F }, + { 0x3C0, LOWER_CASE, 0x3A0 }, + { 0x3C1, LOWER_CASE, 0x3A1 }, + { 0x3C2, LOWER_CASE, 0x3A3 }, + { 0x3C3, LOWER_CASE, 0x3A3 }, + { 0x3C4, LOWER_CASE, 0x3A4 }, + { 0x3C5, LOWER_CASE, 0x3A5 }, + { 0x3C6, LOWER_CASE, 0x3A6 }, + { 0x3C7, LOWER_CASE, 0x3A7 }, + { 0x3C8, LOWER_CASE, 0x3A8 }, + { 0x3C9, LOWER_CASE, 0x3A9 }, + { 0x3CA, LOWER_CASE, 0x3AA }, + { 0x3CB, LOWER_CASE, 0x3AB }, + { 0x3CC, LOWER_CASE, 0x38C }, + { 0x3CD, LOWER_CASE, 0x38E }, + { 0x3CE, LOWER_CASE, 0x38F }, + { 0x3CF, UPPER_CASE, 0x3D7 }, + { 0x3D0, LOWER_CASE, 0x392 }, + { 0x3D1, LOWER_CASE, 0x398 }, + { 0x3D5, LOWER_CASE, 0x3A6 }, + { 0x3D6, LOWER_CASE, 0x3A0 }, + { 0x3D7, LOWER_CASE, 0x3CF }, + { 0x3D8, UPPER_CASE, 0x3D9 }, + { 0x3D9, LOWER_CASE, 0x3D8 }, + { 0x3DA, UPPER_CASE, 0x3DB }, + { 0x3DB, LOWER_CASE, 0x3DA }, + { 0x3DC, UPPER_CASE, 0x3DD }, + { 0x3DD, LOWER_CASE, 0x3DC }, + { 0x3DE, UPPER_CASE, 0x3DF }, + { 0x3DF, LOWER_CASE, 0x3DE }, + { 0x3E0, UPPER_CASE, 0x3E1 }, + { 0x3E1, LOWER_CASE, 0x3E0 }, + { 0x3E2, UPPER_CASE, 0x3E3 }, + { 0x3E3, LOWER_CASE, 0x3E2 }, + { 0x3E4, UPPER_CASE, 0x3E5 }, + { 0x3E5, LOWER_CASE, 0x3E4 }, + { 0x3E6, UPPER_CASE, 0x3E7 }, + { 0x3E7, LOWER_CASE, 0x3E6 }, + { 0x3E8, UPPER_CASE, 0x3E9 }, + { 0x3E9, LOWER_CASE, 0x3E8 }, + { 0x3EA, UPPER_CASE, 0x3EB }, + { 0x3EB, LOWER_CASE, 0x3EA }, + { 0x3EC, UPPER_CASE, 0x3ED }, + { 0x3ED, LOWER_CASE, 0x3EC }, + { 0x3EE, UPPER_CASE, 0x3EF }, + { 0x3EF, LOWER_CASE, 0x3EE }, + { 0x3F0, LOWER_CASE, 0x39A }, + { 0x3F1, LOWER_CASE, 0x3A1 }, + { 0x3F2, LOWER_CASE, 0x3F9 }, + { 0x3F3, LOWER_CASE, 0x37F }, + { 0x3F4, UPPER_CASE, 0x3B8 }, + { 0x3F5, LOWER_CASE, 0x395 }, + { 0x3F7, UPPER_CASE, 0x3F8 }, + { 0x3F8, LOWER_CASE, 0x3F7 }, + { 0x3F9, UPPER_CASE, 0x3F2 }, + { 0x3FA, UPPER_CASE, 0x3FB }, + { 0x3FB, LOWER_CASE, 0x3FA }, + { 0x3FD, UPPER_CASE, 0x37B }, + { 0x3FE, UPPER_CASE, 0x37C }, + { 0x3FF, UPPER_CASE, 0x37D }, + { 0x400, UPPER_CASE, 0x450 }, + { 0x401, UPPER_CASE, 0x451 }, + { 0x402, UPPER_CASE, 0x452 }, + { 0x403, UPPER_CASE, 0x453 }, + { 0x404, UPPER_CASE, 0x454 }, + { 0x405, UPPER_CASE, 0x455 }, + { 0x406, UPPER_CASE, 0x456 }, + { 0x407, UPPER_CASE, 0x457 }, + { 0x408, UPPER_CASE, 0x458 }, + { 0x409, UPPER_CASE, 0x459 }, + { 0x40A, UPPER_CASE, 0x45A }, + { 0x40B, UPPER_CASE, 0x45B }, + { 0x40C, UPPER_CASE, 0x45C }, + { 0x40D, UPPER_CASE, 0x45D }, + { 0x40E, UPPER_CASE, 0x45E }, + { 0x40F, UPPER_CASE, 0x45F }, + { 0x410, UPPER_CASE, 0x430 }, + { 0x411, UPPER_CASE, 0x431 }, + { 0x412, UPPER_CASE, 0x432 }, + { 0x413, UPPER_CASE, 0x433 }, + { 0x414, UPPER_CASE, 0x434 }, + { 0x415, UPPER_CASE, 0x435 }, + { 0x416, UPPER_CASE, 0x436 }, + { 0x417, UPPER_CASE, 0x437 }, + { 0x418, UPPER_CASE, 0x438 }, + { 0x419, UPPER_CASE, 0x439 }, + { 0x41A, UPPER_CASE, 0x43A }, + { 0x41B, UPPER_CASE, 0x43B }, + { 0x41C, UPPER_CASE, 0x43C }, + { 0x41D, UPPER_CASE, 0x43D }, + { 0x41E, UPPER_CASE, 0x43E }, + { 0x41F, UPPER_CASE, 0x43F }, + { 0x420, UPPER_CASE, 0x440 }, + { 0x421, UPPER_CASE, 0x441 }, + { 0x422, UPPER_CASE, 0x442 }, + { 0x423, UPPER_CASE, 0x443 }, + { 0x424, UPPER_CASE, 0x444 }, + { 0x425, UPPER_CASE, 0x445 }, + { 0x426, UPPER_CASE, 0x446 }, + { 0x427, UPPER_CASE, 0x447 }, + { 0x428, UPPER_CASE, 0x448 }, + { 0x429, UPPER_CASE, 0x449 }, + { 0x42A, UPPER_CASE, 0x44A }, + { 0x42B, UPPER_CASE, 0x44B }, + { 0x42C, UPPER_CASE, 0x44C }, + { 0x42D, UPPER_CASE, 0x44D }, + { 0x42E, UPPER_CASE, 0x44E }, + { 0x42F, UPPER_CASE, 0x44F }, + { 0x430, LOWER_CASE, 0x410 }, + { 0x431, LOWER_CASE, 0x411 }, + { 0x432, LOWER_CASE, 0x412 }, + { 0x433, LOWER_CASE, 0x413 }, + { 0x434, LOWER_CASE, 0x414 }, + { 0x435, LOWER_CASE, 0x415 }, + { 0x436, LOWER_CASE, 0x416 }, + { 0x437, LOWER_CASE, 0x417 }, + { 0x438, LOWER_CASE, 0x418 }, + { 0x439, LOWER_CASE, 0x419 }, + { 0x43A, LOWER_CASE, 0x41A }, + { 0x43B, LOWER_CASE, 0x41B }, + { 0x43C, LOWER_CASE, 0x41C }, + { 0x43D, LOWER_CASE, 0x41D }, + { 0x43E, LOWER_CASE, 0x41E }, + { 0x43F, LOWER_CASE, 0x41F }, + { 0x440, LOWER_CASE, 0x420 }, + { 0x441, LOWER_CASE, 0x421 }, + { 0x442, LOWER_CASE, 0x422 }, + { 0x443, LOWER_CASE, 0x423 }, + { 0x444, LOWER_CASE, 0x424 }, + { 0x445, LOWER_CASE, 0x425 }, + { 0x446, LOWER_CASE, 0x426 }, + { 0x447, LOWER_CASE, 0x427 }, + { 0x448, LOWER_CASE, 0x428 }, + { 0x449, LOWER_CASE, 0x429 }, + { 0x44A, LOWER_CASE, 0x42A }, + { 0x44B, LOWER_CASE, 0x42B }, + { 0x44C, LOWER_CASE, 0x42C }, + { 0x44D, LOWER_CASE, 0x42D }, + { 0x44E, LOWER_CASE, 0x42E }, + { 0x44F, LOWER_CASE, 0x42F }, + { 0x450, LOWER_CASE, 0x400 }, + { 0x451, LOWER_CASE, 0x401 }, + { 0x452, LOWER_CASE, 0x402 }, + { 0x453, LOWER_CASE, 0x403 }, + { 0x454, LOWER_CASE, 0x404 }, + { 0x455, LOWER_CASE, 0x405 }, + { 0x456, LOWER_CASE, 0x406 }, + { 0x457, LOWER_CASE, 0x407 }, + { 0x458, LOWER_CASE, 0x408 }, + { 0x459, LOWER_CASE, 0x409 }, + { 0x45A, LOWER_CASE, 0x40A }, + { 0x45B, LOWER_CASE, 0x40B }, + { 0x45C, LOWER_CASE, 0x40C }, + { 0x45D, LOWER_CASE, 0x40D }, + { 0x45E, LOWER_CASE, 0x40E }, + { 0x45F, LOWER_CASE, 0x40F }, + { 0x460, UPPER_CASE, 0x461 }, + { 0x461, LOWER_CASE, 0x460 }, + { 0x462, UPPER_CASE, 0x463 }, + { 0x463, LOWER_CASE, 0x462 }, + { 0x464, UPPER_CASE, 0x465 }, + { 0x465, LOWER_CASE, 0x464 }, + { 0x466, UPPER_CASE, 0x467 }, + { 0x467, LOWER_CASE, 0x466 }, + { 0x468, UPPER_CASE, 0x469 }, + { 0x469, LOWER_CASE, 0x468 }, + { 0x46A, UPPER_CASE, 0x46B }, + { 0x46B, LOWER_CASE, 0x46A }, + { 0x46C, UPPER_CASE, 0x46D }, + { 0x46D, LOWER_CASE, 0x46C }, + { 0x46E, UPPER_CASE, 0x46F }, + { 0x46F, LOWER_CASE, 0x46E }, + { 0x470, UPPER_CASE, 0x471 }, + { 0x471, LOWER_CASE, 0x470 }, + { 0x472, UPPER_CASE, 0x473 }, + { 0x473, LOWER_CASE, 0x472 }, + { 0x474, UPPER_CASE, 0x475 }, + { 0x475, LOWER_CASE, 0x474 }, + { 0x476, UPPER_CASE, 0x477 }, + { 0x477, LOWER_CASE, 0x476 }, + { 0x478, UPPER_CASE, 0x479 }, + { 0x479, LOWER_CASE, 0x478 }, + { 0x47A, UPPER_CASE, 0x47B }, + { 0x47B, LOWER_CASE, 0x47A }, + { 0x47C, UPPER_CASE, 0x47D }, + { 0x47D, LOWER_CASE, 0x47C }, + { 0x47E, UPPER_CASE, 0x47F }, + { 0x47F, LOWER_CASE, 0x47E }, + { 0x480, UPPER_CASE, 0x481 }, + { 0x481, LOWER_CASE, 0x480 }, + { 0x48A, UPPER_CASE, 0x48B }, + { 0x48B, LOWER_CASE, 0x48A }, + { 0x48C, UPPER_CASE, 0x48D }, + { 0x48D, LOWER_CASE, 0x48C }, + { 0x48E, UPPER_CASE, 0x48F }, + { 0x48F, LOWER_CASE, 0x48E }, + { 0x490, UPPER_CASE, 0x491 }, + { 0x491, LOWER_CASE, 0x490 }, + { 0x492, UPPER_CASE, 0x493 }, + { 0x493, LOWER_CASE, 0x492 }, + { 0x494, UPPER_CASE, 0x495 }, + { 0x495, LOWER_CASE, 0x494 }, + { 0x496, UPPER_CASE, 0x497 }, + { 0x497, LOWER_CASE, 0x496 }, + { 0x498, UPPER_CASE, 0x499 }, + { 0x499, LOWER_CASE, 0x498 }, + { 0x49A, UPPER_CASE, 0x49B }, + { 0x49B, LOWER_CASE, 0x49A }, + { 0x49C, UPPER_CASE, 0x49D }, + { 0x49D, LOWER_CASE, 0x49C }, + { 0x49E, UPPER_CASE, 0x49F }, + { 0x49F, LOWER_CASE, 0x49E }, + { 0x4A0, UPPER_CASE, 0x4A1 }, + { 0x4A1, LOWER_CASE, 0x4A0 }, + { 0x4A2, UPPER_CASE, 0x4A3 }, + { 0x4A3, LOWER_CASE, 0x4A2 }, + { 0x4A4, UPPER_CASE, 0x4A5 }, + { 0x4A5, LOWER_CASE, 0x4A4 }, + { 0x4A6, UPPER_CASE, 0x4A7 }, + { 0x4A7, LOWER_CASE, 0x4A6 }, + { 0x4A8, UPPER_CASE, 0x4A9 }, + { 0x4A9, LOWER_CASE, 0x4A8 }, + { 0x4AA, UPPER_CASE, 0x4AB }, + { 0x4AB, LOWER_CASE, 0x4AA }, + { 0x4AC, UPPER_CASE, 0x4AD }, + { 0x4AD, LOWER_CASE, 0x4AC }, + { 0x4AE, UPPER_CASE, 0x4AF }, + { 0x4AF, LOWER_CASE, 0x4AE }, + { 0x4B0, UPPER_CASE, 0x4B1 }, + { 0x4B1, LOWER_CASE, 0x4B0 }, + { 0x4B2, UPPER_CASE, 0x4B3 }, + { 0x4B3, LOWER_CASE, 0x4B2 }, + { 0x4B4, UPPER_CASE, 0x4B5 }, + { 0x4B5, LOWER_CASE, 0x4B4 }, + { 0x4B6, UPPER_CASE, 0x4B7 }, + { 0x4B7, LOWER_CASE, 0x4B6 }, + { 0x4B8, UPPER_CASE, 0x4B9 }, + { 0x4B9, LOWER_CASE, 0x4B8 }, + { 0x4BA, UPPER_CASE, 0x4BB }, + { 0x4BB, LOWER_CASE, 0x4BA }, + { 0x4BC, UPPER_CASE, 0x4BD }, + { 0x4BD, LOWER_CASE, 0x4BC }, + { 0x4BE, UPPER_CASE, 0x4BF }, + { 0x4BF, LOWER_CASE, 0x4BE }, + { 0x4C0, UPPER_CASE, 0x4CF }, + { 0x4C1, UPPER_CASE, 0x4C2 }, + { 0x4C2, LOWER_CASE, 0x4C1 }, + { 0x4C3, UPPER_CASE, 0x4C4 }, + { 0x4C4, LOWER_CASE, 0x4C3 }, + { 0x4C5, UPPER_CASE, 0x4C6 }, + { 0x4C6, LOWER_CASE, 0x4C5 }, + { 0x4C7, UPPER_CASE, 0x4C8 }, + { 0x4C8, LOWER_CASE, 0x4C7 }, + { 0x4C9, UPPER_CASE, 0x4CA }, + { 0x4CA, LOWER_CASE, 0x4C9 }, + { 0x4CB, UPPER_CASE, 0x4CC }, + { 0x4CC, LOWER_CASE, 0x4CB }, + { 0x4CD, UPPER_CASE, 0x4CE }, + { 0x4CE, LOWER_CASE, 0x4CD }, + { 0x4CF, LOWER_CASE, 0x4C0 }, + { 0x4D0, UPPER_CASE, 0x4D1 }, + { 0x4D1, LOWER_CASE, 0x4D0 }, + { 0x4D2, UPPER_CASE, 0x4D3 }, + { 0x4D3, LOWER_CASE, 0x4D2 }, + { 0x4D4, UPPER_CASE, 0x4D5 }, + { 0x4D5, LOWER_CASE, 0x4D4 }, + { 0x4D6, UPPER_CASE, 0x4D7 }, + { 0x4D7, LOWER_CASE, 0x4D6 }, + { 0x4D8, UPPER_CASE, 0x4D9 }, + { 0x4D9, LOWER_CASE, 0x4D8 }, + { 0x4DA, UPPER_CASE, 0x4DB }, + { 0x4DB, LOWER_CASE, 0x4DA }, + { 0x4DC, UPPER_CASE, 0x4DD }, + { 0x4DD, LOWER_CASE, 0x4DC }, + { 0x4DE, UPPER_CASE, 0x4DF }, + { 0x4DF, LOWER_CASE, 0x4DE }, + { 0x4E0, UPPER_CASE, 0x4E1 }, + { 0x4E1, LOWER_CASE, 0x4E0 }, + { 0x4E2, UPPER_CASE, 0x4E3 }, + { 0x4E3, LOWER_CASE, 0x4E2 }, + { 0x4E4, UPPER_CASE, 0x4E5 }, + { 0x4E5, LOWER_CASE, 0x4E4 }, + { 0x4E6, UPPER_CASE, 0x4E7 }, + { 0x4E7, LOWER_CASE, 0x4E6 }, + { 0x4E8, UPPER_CASE, 0x4E9 }, + { 0x4E9, LOWER_CASE, 0x4E8 }, + { 0x4EA, UPPER_CASE, 0x4EB }, + { 0x4EB, LOWER_CASE, 0x4EA }, + { 0x4EC, UPPER_CASE, 0x4ED }, + { 0x4ED, LOWER_CASE, 0x4EC }, + { 0x4EE, UPPER_CASE, 0x4EF }, + { 0x4EF, LOWER_CASE, 0x4EE }, + { 0x4F0, UPPER_CASE, 0x4F1 }, + { 0x4F1, LOWER_CASE, 0x4F0 }, + { 0x4F2, UPPER_CASE, 0x4F3 }, + { 0x4F3, LOWER_CASE, 0x4F2 }, + { 0x4F4, UPPER_CASE, 0x4F5 }, + { 0x4F5, LOWER_CASE, 0x4F4 }, + { 0x4F6, UPPER_CASE, 0x4F7 }, + { 0x4F7, LOWER_CASE, 0x4F6 }, + { 0x4F8, UPPER_CASE, 0x4F9 }, + { 0x4F9, LOWER_CASE, 0x4F8 }, + { 0x4FA, UPPER_CASE, 0x4FB }, + { 0x4FB, LOWER_CASE, 0x4FA }, + { 0x4FC, UPPER_CASE, 0x4FD }, + { 0x4FD, LOWER_CASE, 0x4FC }, + { 0x4FE, UPPER_CASE, 0x4FF }, + { 0x4FF, LOWER_CASE, 0x4FE }, + { 0x500, UPPER_CASE, 0x501 }, + { 0x501, LOWER_CASE, 0x500 }, + { 0x502, UPPER_CASE, 0x503 }, + { 0x503, LOWER_CASE, 0x502 }, + { 0x504, UPPER_CASE, 0x505 }, + { 0x505, LOWER_CASE, 0x504 }, + { 0x506, UPPER_CASE, 0x507 }, + { 0x507, LOWER_CASE, 0x506 }, + { 0x508, UPPER_CASE, 0x509 }, + { 0x509, LOWER_CASE, 0x508 }, + { 0x50A, UPPER_CASE, 0x50B }, + { 0x50B, LOWER_CASE, 0x50A }, + { 0x50C, UPPER_CASE, 0x50D }, + { 0x50D, LOWER_CASE, 0x50C }, + { 0x50E, UPPER_CASE, 0x50F }, + { 0x50F, LOWER_CASE, 0x50E }, + { 0x510, UPPER_CASE, 0x511 }, + { 0x511, LOWER_CASE, 0x510 }, + { 0x512, UPPER_CASE, 0x513 }, + { 0x513, LOWER_CASE, 0x512 }, + { 0x514, UPPER_CASE, 0x515 }, + { 0x515, LOWER_CASE, 0x514 }, + { 0x516, UPPER_CASE, 0x517 }, + { 0x517, LOWER_CASE, 0x516 }, + { 0x518, UPPER_CASE, 0x519 }, + { 0x519, LOWER_CASE, 0x518 }, + { 0x51A, UPPER_CASE, 0x51B }, + { 0x51B, LOWER_CASE, 0x51A }, + { 0x51C, UPPER_CASE, 0x51D }, + { 0x51D, LOWER_CASE, 0x51C }, + { 0x51E, UPPER_CASE, 0x51F }, + { 0x51F, LOWER_CASE, 0x51E }, + { 0x520, UPPER_CASE, 0x521 }, + { 0x521, LOWER_CASE, 0x520 }, + { 0x522, UPPER_CASE, 0x523 }, + { 0x523, LOWER_CASE, 0x522 }, + { 0x524, UPPER_CASE, 0x525 }, + { 0x525, LOWER_CASE, 0x524 }, + { 0x526, UPPER_CASE, 0x527 }, + { 0x527, LOWER_CASE, 0x526 }, + { 0x528, UPPER_CASE, 0x529 }, + { 0x529, LOWER_CASE, 0x528 }, + { 0x52A, UPPER_CASE, 0x52B }, + { 0x52B, LOWER_CASE, 0x52A }, + { 0x52C, UPPER_CASE, 0x52D }, + { 0x52D, LOWER_CASE, 0x52C }, + { 0x52E, UPPER_CASE, 0x52F }, + { 0x52F, LOWER_CASE, 0x52E }, + { 0x531, UPPER_CASE, 0x561 }, + { 0x532, UPPER_CASE, 0x562 }, + { 0x533, UPPER_CASE, 0x563 }, + { 0x534, UPPER_CASE, 0x564 }, + { 0x535, UPPER_CASE, 0x565 }, + { 0x536, UPPER_CASE, 0x566 }, + { 0x537, UPPER_CASE, 0x567 }, + { 0x538, UPPER_CASE, 0x568 }, + { 0x539, UPPER_CASE, 0x569 }, + { 0x53A, UPPER_CASE, 0x56A }, + { 0x53B, UPPER_CASE, 0x56B }, + { 0x53C, UPPER_CASE, 0x56C }, + { 0x53D, UPPER_CASE, 0x56D }, + { 0x53E, UPPER_CASE, 0x56E }, + { 0x53F, UPPER_CASE, 0x56F }, + { 0x540, UPPER_CASE, 0x570 }, + { 0x541, UPPER_CASE, 0x571 }, + { 0x542, UPPER_CASE, 0x572 }, + { 0x543, UPPER_CASE, 0x573 }, + { 0x544, UPPER_CASE, 0x574 }, + { 0x545, UPPER_CASE, 0x575 }, + { 0x546, UPPER_CASE, 0x576 }, + { 0x547, UPPER_CASE, 0x577 }, + { 0x548, UPPER_CASE, 0x578 }, + { 0x549, UPPER_CASE, 0x579 }, + { 0x54A, UPPER_CASE, 0x57A }, + { 0x54B, UPPER_CASE, 0x57B }, + { 0x54C, UPPER_CASE, 0x57C }, + { 0x54D, UPPER_CASE, 0x57D }, + { 0x54E, UPPER_CASE, 0x57E }, + { 0x54F, UPPER_CASE, 0x57F }, + { 0x550, UPPER_CASE, 0x580 }, + { 0x551, UPPER_CASE, 0x581 }, + { 0x552, UPPER_CASE, 0x582 }, + { 0x553, UPPER_CASE, 0x583 }, + { 0x554, UPPER_CASE, 0x584 }, + { 0x555, UPPER_CASE, 0x585 }, + { 0x556, UPPER_CASE, 0x586 }, + { 0x561, LOWER_CASE, 0x531 }, + { 0x562, LOWER_CASE, 0x532 }, + { 0x563, LOWER_CASE, 0x533 }, + { 0x564, LOWER_CASE, 0x534 }, + { 0x565, LOWER_CASE, 0x535 }, + { 0x566, LOWER_CASE, 0x536 }, + { 0x567, LOWER_CASE, 0x537 }, + { 0x568, LOWER_CASE, 0x538 }, + { 0x569, LOWER_CASE, 0x539 }, + { 0x56A, LOWER_CASE, 0x53A }, + { 0x56B, LOWER_CASE, 0x53B }, + { 0x56C, LOWER_CASE, 0x53C }, + { 0x56D, LOWER_CASE, 0x53D }, + { 0x56E, LOWER_CASE, 0x53E }, + { 0x56F, LOWER_CASE, 0x53F }, + { 0x570, LOWER_CASE, 0x540 }, + { 0x571, LOWER_CASE, 0x541 }, + { 0x572, LOWER_CASE, 0x542 }, + { 0x573, LOWER_CASE, 0x543 }, + { 0x574, LOWER_CASE, 0x544 }, + { 0x575, LOWER_CASE, 0x545 }, + { 0x576, LOWER_CASE, 0x546 }, + { 0x577, LOWER_CASE, 0x547 }, + { 0x578, LOWER_CASE, 0x548 }, + { 0x579, LOWER_CASE, 0x549 }, + { 0x57A, LOWER_CASE, 0x54A }, + { 0x57B, LOWER_CASE, 0x54B }, + { 0x57C, LOWER_CASE, 0x54C }, + { 0x57D, LOWER_CASE, 0x54D }, + { 0x57E, LOWER_CASE, 0x54E }, + { 0x57F, LOWER_CASE, 0x54F }, + { 0x580, LOWER_CASE, 0x550 }, + { 0x581, LOWER_CASE, 0x551 }, + { 0x582, LOWER_CASE, 0x552 }, + { 0x583, LOWER_CASE, 0x553 }, + { 0x584, LOWER_CASE, 0x554 }, + { 0x585, LOWER_CASE, 0x555 }, + { 0x586, LOWER_CASE, 0x556 }, + { 0x10A0, UPPER_CASE, 0x2D00 }, + { 0x10A1, UPPER_CASE, 0x2D01 }, + { 0x10A2, UPPER_CASE, 0x2D02 }, + { 0x10A3, UPPER_CASE, 0x2D03 }, + { 0x10A4, UPPER_CASE, 0x2D04 }, + { 0x10A5, UPPER_CASE, 0x2D05 }, + { 0x10A6, UPPER_CASE, 0x2D06 }, + { 0x10A7, UPPER_CASE, 0x2D07 }, + { 0x10A8, UPPER_CASE, 0x2D08 }, + { 0x10A9, UPPER_CASE, 0x2D09 }, + { 0x10AA, UPPER_CASE, 0x2D0A }, + { 0x10AB, UPPER_CASE, 0x2D0B }, + { 0x10AC, UPPER_CASE, 0x2D0C }, + { 0x10AD, UPPER_CASE, 0x2D0D }, + { 0x10AE, UPPER_CASE, 0x2D0E }, + { 0x10AF, UPPER_CASE, 0x2D0F }, + { 0x10B0, UPPER_CASE, 0x2D10 }, + { 0x10B1, UPPER_CASE, 0x2D11 }, + { 0x10B2, UPPER_CASE, 0x2D12 }, + { 0x10B3, UPPER_CASE, 0x2D13 }, + { 0x10B4, UPPER_CASE, 0x2D14 }, + { 0x10B5, UPPER_CASE, 0x2D15 }, + { 0x10B6, UPPER_CASE, 0x2D16 }, + { 0x10B7, UPPER_CASE, 0x2D17 }, + { 0x10B8, UPPER_CASE, 0x2D18 }, + { 0x10B9, UPPER_CASE, 0x2D19 }, + { 0x10BA, UPPER_CASE, 0x2D1A }, + { 0x10BB, UPPER_CASE, 0x2D1B }, + { 0x10BC, UPPER_CASE, 0x2D1C }, + { 0x10BD, UPPER_CASE, 0x2D1D }, + { 0x10BE, UPPER_CASE, 0x2D1E }, + { 0x10BF, UPPER_CASE, 0x2D1F }, + { 0x10C0, UPPER_CASE, 0x2D20 }, + { 0x10C1, UPPER_CASE, 0x2D21 }, + { 0x10C2, UPPER_CASE, 0x2D22 }, + { 0x10C3, UPPER_CASE, 0x2D23 }, + { 0x10C4, UPPER_CASE, 0x2D24 }, + { 0x10C5, UPPER_CASE, 0x2D25 }, + { 0x10C7, UPPER_CASE, 0x2D27 }, + { 0x10CD, UPPER_CASE, 0x2D2D }, + { 0x10D0, LOWER_CASE, 0x1C90 }, + { 0x10D1, LOWER_CASE, 0x1C91 }, + { 0x10D2, LOWER_CASE, 0x1C92 }, + { 0x10D3, LOWER_CASE, 0x1C93 }, + { 0x10D4, LOWER_CASE, 0x1C94 }, + { 0x10D5, LOWER_CASE, 0x1C95 }, + { 0x10D6, LOWER_CASE, 0x1C96 }, + { 0x10D7, LOWER_CASE, 0x1C97 }, + { 0x10D8, LOWER_CASE, 0x1C98 }, + { 0x10D9, LOWER_CASE, 0x1C99 }, + { 0x10DA, LOWER_CASE, 0x1C9A }, + { 0x10DB, LOWER_CASE, 0x1C9B }, + { 0x10DC, LOWER_CASE, 0x1C9C }, + { 0x10DD, LOWER_CASE, 0x1C9D }, + { 0x10DE, LOWER_CASE, 0x1C9E }, + { 0x10DF, LOWER_CASE, 0x1C9F }, + { 0x10E0, LOWER_CASE, 0x1CA0 }, + { 0x10E1, LOWER_CASE, 0x1CA1 }, + { 0x10E2, LOWER_CASE, 0x1CA2 }, + { 0x10E3, LOWER_CASE, 0x1CA3 }, + { 0x10E4, LOWER_CASE, 0x1CA4 }, + { 0x10E5, LOWER_CASE, 0x1CA5 }, + { 0x10E6, LOWER_CASE, 0x1CA6 }, + { 0x10E7, LOWER_CASE, 0x1CA7 }, + { 0x10E8, LOWER_CASE, 0x1CA8 }, + { 0x10E9, LOWER_CASE, 0x1CA9 }, + { 0x10EA, LOWER_CASE, 0x1CAA }, + { 0x10EB, LOWER_CASE, 0x1CAB }, + { 0x10EC, LOWER_CASE, 0x1CAC }, + { 0x10ED, LOWER_CASE, 0x1CAD }, + { 0x10EE, LOWER_CASE, 0x1CAE }, + { 0x10EF, LOWER_CASE, 0x1CAF }, + { 0x10F0, LOWER_CASE, 0x1CB0 }, + { 0x10F1, LOWER_CASE, 0x1CB1 }, + { 0x10F2, LOWER_CASE, 0x1CB2 }, + { 0x10F3, LOWER_CASE, 0x1CB3 }, + { 0x10F4, LOWER_CASE, 0x1CB4 }, + { 0x10F5, LOWER_CASE, 0x1CB5 }, + { 0x10F6, LOWER_CASE, 0x1CB6 }, + { 0x10F7, LOWER_CASE, 0x1CB7 }, + { 0x10F8, LOWER_CASE, 0x1CB8 }, + { 0x10F9, LOWER_CASE, 0x1CB9 }, + { 0x10FA, LOWER_CASE, 0x1CBA }, + { 0x10FD, LOWER_CASE, 0x1CBD }, + { 0x10FE, LOWER_CASE, 0x1CBE }, + { 0x10FF, LOWER_CASE, 0x1CBF }, + { 0x13A0, UPPER_CASE, 0xAB70 }, + { 0x13A1, UPPER_CASE, 0xAB71 }, + { 0x13A2, UPPER_CASE, 0xAB72 }, + { 0x13A3, UPPER_CASE, 0xAB73 }, + { 0x13A4, UPPER_CASE, 0xAB74 }, + { 0x13A5, UPPER_CASE, 0xAB75 }, + { 0x13A6, UPPER_CASE, 0xAB76 }, + { 0x13A7, UPPER_CASE, 0xAB77 }, + { 0x13A8, UPPER_CASE, 0xAB78 }, + { 0x13A9, UPPER_CASE, 0xAB79 }, + { 0x13AA, UPPER_CASE, 0xAB7A }, + { 0x13AB, UPPER_CASE, 0xAB7B }, + { 0x13AC, UPPER_CASE, 0xAB7C }, + { 0x13AD, UPPER_CASE, 0xAB7D }, + { 0x13AE, UPPER_CASE, 0xAB7E }, + { 0x13AF, UPPER_CASE, 0xAB7F }, + { 0x13B0, UPPER_CASE, 0xAB80 }, + { 0x13B1, UPPER_CASE, 0xAB81 }, + { 0x13B2, UPPER_CASE, 0xAB82 }, + { 0x13B3, UPPER_CASE, 0xAB83 }, + { 0x13B4, UPPER_CASE, 0xAB84 }, + { 0x13B5, UPPER_CASE, 0xAB85 }, + { 0x13B6, UPPER_CASE, 0xAB86 }, + { 0x13B7, UPPER_CASE, 0xAB87 }, + { 0x13B8, UPPER_CASE, 0xAB88 }, + { 0x13B9, UPPER_CASE, 0xAB89 }, + { 0x13BA, UPPER_CASE, 0xAB8A }, + { 0x13BB, UPPER_CASE, 0xAB8B }, + { 0x13BC, UPPER_CASE, 0xAB8C }, + { 0x13BD, UPPER_CASE, 0xAB8D }, + { 0x13BE, UPPER_CASE, 0xAB8E }, + { 0x13BF, UPPER_CASE, 0xAB8F }, + { 0x13C0, UPPER_CASE, 0xAB90 }, + { 0x13C1, UPPER_CASE, 0xAB91 }, + { 0x13C2, UPPER_CASE, 0xAB92 }, + { 0x13C3, UPPER_CASE, 0xAB93 }, + { 0x13C4, UPPER_CASE, 0xAB94 }, + { 0x13C5, UPPER_CASE, 0xAB95 }, + { 0x13C6, UPPER_CASE, 0xAB96 }, + { 0x13C7, UPPER_CASE, 0xAB97 }, + { 0x13C8, UPPER_CASE, 0xAB98 }, + { 0x13C9, UPPER_CASE, 0xAB99 }, + { 0x13CA, UPPER_CASE, 0xAB9A }, + { 0x13CB, UPPER_CASE, 0xAB9B }, + { 0x13CC, UPPER_CASE, 0xAB9C }, + { 0x13CD, UPPER_CASE, 0xAB9D }, + { 0x13CE, UPPER_CASE, 0xAB9E }, + { 0x13CF, UPPER_CASE, 0xAB9F }, + { 0x13D0, UPPER_CASE, 0xABA0 }, + { 0x13D1, UPPER_CASE, 0xABA1 }, + { 0x13D2, UPPER_CASE, 0xABA2 }, + { 0x13D3, UPPER_CASE, 0xABA3 }, + { 0x13D4, UPPER_CASE, 0xABA4 }, + { 0x13D5, UPPER_CASE, 0xABA5 }, + { 0x13D6, UPPER_CASE, 0xABA6 }, + { 0x13D7, UPPER_CASE, 0xABA7 }, + { 0x13D8, UPPER_CASE, 0xABA8 }, + { 0x13D9, UPPER_CASE, 0xABA9 }, + { 0x13DA, UPPER_CASE, 0xABAA }, + { 0x13DB, UPPER_CASE, 0xABAB }, + { 0x13DC, UPPER_CASE, 0xABAC }, + { 0x13DD, UPPER_CASE, 0xABAD }, + { 0x13DE, UPPER_CASE, 0xABAE }, + { 0x13DF, UPPER_CASE, 0xABAF }, + { 0x13E0, UPPER_CASE, 0xABB0 }, + { 0x13E1, UPPER_CASE, 0xABB1 }, + { 0x13E2, UPPER_CASE, 0xABB2 }, + { 0x13E3, UPPER_CASE, 0xABB3 }, + { 0x13E4, UPPER_CASE, 0xABB4 }, + { 0x13E5, UPPER_CASE, 0xABB5 }, + { 0x13E6, UPPER_CASE, 0xABB6 }, + { 0x13E7, UPPER_CASE, 0xABB7 }, + { 0x13E8, UPPER_CASE, 0xABB8 }, + { 0x13E9, UPPER_CASE, 0xABB9 }, + { 0x13EA, UPPER_CASE, 0xABBA }, + { 0x13EB, UPPER_CASE, 0xABBB }, + { 0x13EC, UPPER_CASE, 0xABBC }, + { 0x13ED, UPPER_CASE, 0xABBD }, + { 0x13EE, UPPER_CASE, 0xABBE }, + { 0x13EF, UPPER_CASE, 0xABBF }, + { 0x13F0, UPPER_CASE, 0x13F8 }, + { 0x13F1, UPPER_CASE, 0x13F9 }, + { 0x13F2, UPPER_CASE, 0x13FA }, + { 0x13F3, UPPER_CASE, 0x13FB }, + { 0x13F4, UPPER_CASE, 0x13FC }, + { 0x13F5, UPPER_CASE, 0x13FD }, + { 0x13F8, LOWER_CASE, 0x13F0 }, + { 0x13F9, LOWER_CASE, 0x13F1 }, + { 0x13FA, LOWER_CASE, 0x13F2 }, + { 0x13FB, LOWER_CASE, 0x13F3 }, + { 0x13FC, LOWER_CASE, 0x13F4 }, + { 0x13FD, LOWER_CASE, 0x13F5 }, + { 0x1C80, LOWER_CASE, 0x412 }, + { 0x1C81, LOWER_CASE, 0x414 }, + { 0x1C82, LOWER_CASE, 0x41E }, + { 0x1C83, LOWER_CASE, 0x421 }, + { 0x1C84, LOWER_CASE, 0x422 }, + { 0x1C85, LOWER_CASE, 0x422 }, + { 0x1C86, LOWER_CASE, 0x42A }, + { 0x1C87, LOWER_CASE, 0x462 }, + { 0x1C88, LOWER_CASE, 0xA64A }, + { 0x1C90, UPPER_CASE, 0x10D0 }, + { 0x1C91, UPPER_CASE, 0x10D1 }, + { 0x1C92, UPPER_CASE, 0x10D2 }, + { 0x1C93, UPPER_CASE, 0x10D3 }, + { 0x1C94, UPPER_CASE, 0x10D4 }, + { 0x1C95, UPPER_CASE, 0x10D5 }, + { 0x1C96, UPPER_CASE, 0x10D6 }, + { 0x1C97, UPPER_CASE, 0x10D7 }, + { 0x1C98, UPPER_CASE, 0x10D8 }, + { 0x1C99, UPPER_CASE, 0x10D9 }, + { 0x1C9A, UPPER_CASE, 0x10DA }, + { 0x1C9B, UPPER_CASE, 0x10DB }, + { 0x1C9C, UPPER_CASE, 0x10DC }, + { 0x1C9D, UPPER_CASE, 0x10DD }, + { 0x1C9E, UPPER_CASE, 0x10DE }, + { 0x1C9F, UPPER_CASE, 0x10DF }, + { 0x1CA0, UPPER_CASE, 0x10E0 }, + { 0x1CA1, UPPER_CASE, 0x10E1 }, + { 0x1CA2, UPPER_CASE, 0x10E2 }, + { 0x1CA3, UPPER_CASE, 0x10E3 }, + { 0x1CA4, UPPER_CASE, 0x10E4 }, + { 0x1CA5, UPPER_CASE, 0x10E5 }, + { 0x1CA6, UPPER_CASE, 0x10E6 }, + { 0x1CA7, UPPER_CASE, 0x10E7 }, + { 0x1CA8, UPPER_CASE, 0x10E8 }, + { 0x1CA9, UPPER_CASE, 0x10E9 }, + { 0x1CAA, UPPER_CASE, 0x10EA }, + { 0x1CAB, UPPER_CASE, 0x10EB }, + { 0x1CAC, UPPER_CASE, 0x10EC }, + { 0x1CAD, UPPER_CASE, 0x10ED }, + { 0x1CAE, UPPER_CASE, 0x10EE }, + { 0x1CAF, UPPER_CASE, 0x10EF }, + { 0x1CB0, UPPER_CASE, 0x10F0 }, + { 0x1CB1, UPPER_CASE, 0x10F1 }, + { 0x1CB2, UPPER_CASE, 0x10F2 }, + { 0x1CB3, UPPER_CASE, 0x10F3 }, + { 0x1CB4, UPPER_CASE, 0x10F4 }, + { 0x1CB5, UPPER_CASE, 0x10F5 }, + { 0x1CB6, UPPER_CASE, 0x10F6 }, + { 0x1CB7, UPPER_CASE, 0x10F7 }, + { 0x1CB8, UPPER_CASE, 0x10F8 }, + { 0x1CB9, UPPER_CASE, 0x10F9 }, + { 0x1CBA, UPPER_CASE, 0x10FA }, + { 0x1CBD, UPPER_CASE, 0x10FD }, + { 0x1CBE, UPPER_CASE, 0x10FE }, + { 0x1CBF, UPPER_CASE, 0x10FF }, + { 0x1D79, LOWER_CASE, 0xA77D }, + { 0x1D7D, LOWER_CASE, 0x2C63 }, + { 0x1E00, UPPER_CASE, 0x1E01 }, + { 0x1E01, LOWER_CASE, 0x1E00 }, + { 0x1E02, UPPER_CASE, 0x1E03 }, + { 0x1E03, LOWER_CASE, 0x1E02 }, + { 0x1E04, UPPER_CASE, 0x1E05 }, + { 0x1E05, LOWER_CASE, 0x1E04 }, + { 0x1E06, UPPER_CASE, 0x1E07 }, + { 0x1E07, LOWER_CASE, 0x1E06 }, + { 0x1E08, UPPER_CASE, 0x1E09 }, + { 0x1E09, LOWER_CASE, 0x1E08 }, + { 0x1E0A, UPPER_CASE, 0x1E0B }, + { 0x1E0B, LOWER_CASE, 0x1E0A }, + { 0x1E0C, UPPER_CASE, 0x1E0D }, + { 0x1E0D, LOWER_CASE, 0x1E0C }, + { 0x1E0E, UPPER_CASE, 0x1E0F }, + { 0x1E0F, LOWER_CASE, 0x1E0E }, + { 0x1E10, UPPER_CASE, 0x1E11 }, + { 0x1E11, LOWER_CASE, 0x1E10 }, + { 0x1E12, UPPER_CASE, 0x1E13 }, + { 0x1E13, LOWER_CASE, 0x1E12 }, + { 0x1E14, UPPER_CASE, 0x1E15 }, + { 0x1E15, LOWER_CASE, 0x1E14 }, + { 0x1E16, UPPER_CASE, 0x1E17 }, + { 0x1E17, LOWER_CASE, 0x1E16 }, + { 0x1E18, UPPER_CASE, 0x1E19 }, + { 0x1E19, LOWER_CASE, 0x1E18 }, + { 0x1E1A, UPPER_CASE, 0x1E1B }, + { 0x1E1B, LOWER_CASE, 0x1E1A }, + { 0x1E1C, UPPER_CASE, 0x1E1D }, + { 0x1E1D, LOWER_CASE, 0x1E1C }, + { 0x1E1E, UPPER_CASE, 0x1E1F }, + { 0x1E1F, LOWER_CASE, 0x1E1E }, + { 0x1E20, UPPER_CASE, 0x1E21 }, + { 0x1E21, LOWER_CASE, 0x1E20 }, + { 0x1E22, UPPER_CASE, 0x1E23 }, + { 0x1E23, LOWER_CASE, 0x1E22 }, + { 0x1E24, UPPER_CASE, 0x1E25 }, + { 0x1E25, LOWER_CASE, 0x1E24 }, + { 0x1E26, UPPER_CASE, 0x1E27 }, + { 0x1E27, LOWER_CASE, 0x1E26 }, + { 0x1E28, UPPER_CASE, 0x1E29 }, + { 0x1E29, LOWER_CASE, 0x1E28 }, + { 0x1E2A, UPPER_CASE, 0x1E2B }, + { 0x1E2B, LOWER_CASE, 0x1E2A }, + { 0x1E2C, UPPER_CASE, 0x1E2D }, + { 0x1E2D, LOWER_CASE, 0x1E2C }, + { 0x1E2E, UPPER_CASE, 0x1E2F }, + { 0x1E2F, LOWER_CASE, 0x1E2E }, + { 0x1E30, UPPER_CASE, 0x1E31 }, + { 0x1E31, LOWER_CASE, 0x1E30 }, + { 0x1E32, UPPER_CASE, 0x1E33 }, + { 0x1E33, LOWER_CASE, 0x1E32 }, + { 0x1E34, UPPER_CASE, 0x1E35 }, + { 0x1E35, LOWER_CASE, 0x1E34 }, + { 0x1E36, UPPER_CASE, 0x1E37 }, + { 0x1E37, LOWER_CASE, 0x1E36 }, + { 0x1E38, UPPER_CASE, 0x1E39 }, + { 0x1E39, LOWER_CASE, 0x1E38 }, + { 0x1E3A, UPPER_CASE, 0x1E3B }, + { 0x1E3B, LOWER_CASE, 0x1E3A }, + { 0x1E3C, UPPER_CASE, 0x1E3D }, + { 0x1E3D, LOWER_CASE, 0x1E3C }, + { 0x1E3E, UPPER_CASE, 0x1E3F }, + { 0x1E3F, LOWER_CASE, 0x1E3E }, + { 0x1E40, UPPER_CASE, 0x1E41 }, + { 0x1E41, LOWER_CASE, 0x1E40 }, + { 0x1E42, UPPER_CASE, 0x1E43 }, + { 0x1E43, LOWER_CASE, 0x1E42 }, + { 0x1E44, UPPER_CASE, 0x1E45 }, + { 0x1E45, LOWER_CASE, 0x1E44 }, + { 0x1E46, UPPER_CASE, 0x1E47 }, + { 0x1E47, LOWER_CASE, 0x1E46 }, + { 0x1E48, UPPER_CASE, 0x1E49 }, + { 0x1E49, LOWER_CASE, 0x1E48 }, + { 0x1E4A, UPPER_CASE, 0x1E4B }, + { 0x1E4B, LOWER_CASE, 0x1E4A }, + { 0x1E4C, UPPER_CASE, 0x1E4D }, + { 0x1E4D, LOWER_CASE, 0x1E4C }, + { 0x1E4E, UPPER_CASE, 0x1E4F }, + { 0x1E4F, LOWER_CASE, 0x1E4E }, + { 0x1E50, UPPER_CASE, 0x1E51 }, + { 0x1E51, LOWER_CASE, 0x1E50 }, + { 0x1E52, UPPER_CASE, 0x1E53 }, + { 0x1E53, LOWER_CASE, 0x1E52 }, + { 0x1E54, UPPER_CASE, 0x1E55 }, + { 0x1E55, LOWER_CASE, 0x1E54 }, + { 0x1E56, UPPER_CASE, 0x1E57 }, + { 0x1E57, LOWER_CASE, 0x1E56 }, + { 0x1E58, UPPER_CASE, 0x1E59 }, + { 0x1E59, LOWER_CASE, 0x1E58 }, + { 0x1E5A, UPPER_CASE, 0x1E5B }, + { 0x1E5B, LOWER_CASE, 0x1E5A }, + { 0x1E5C, UPPER_CASE, 0x1E5D }, + { 0x1E5D, LOWER_CASE, 0x1E5C }, + { 0x1E5E, UPPER_CASE, 0x1E5F }, + { 0x1E5F, LOWER_CASE, 0x1E5E }, + { 0x1E60, UPPER_CASE, 0x1E61 }, + { 0x1E61, LOWER_CASE, 0x1E60 }, + { 0x1E62, UPPER_CASE, 0x1E63 }, + { 0x1E63, LOWER_CASE, 0x1E62 }, + { 0x1E64, UPPER_CASE, 0x1E65 }, + { 0x1E65, LOWER_CASE, 0x1E64 }, + { 0x1E66, UPPER_CASE, 0x1E67 }, + { 0x1E67, LOWER_CASE, 0x1E66 }, + { 0x1E68, UPPER_CASE, 0x1E69 }, + { 0x1E69, LOWER_CASE, 0x1E68 }, + { 0x1E6A, UPPER_CASE, 0x1E6B }, + { 0x1E6B, LOWER_CASE, 0x1E6A }, + { 0x1E6C, UPPER_CASE, 0x1E6D }, + { 0x1E6D, LOWER_CASE, 0x1E6C }, + { 0x1E6E, UPPER_CASE, 0x1E6F }, + { 0x1E6F, LOWER_CASE, 0x1E6E }, + { 0x1E70, UPPER_CASE, 0x1E71 }, + { 0x1E71, LOWER_CASE, 0x1E70 }, + { 0x1E72, UPPER_CASE, 0x1E73 }, + { 0x1E73, LOWER_CASE, 0x1E72 }, + { 0x1E74, UPPER_CASE, 0x1E75 }, + { 0x1E75, LOWER_CASE, 0x1E74 }, + { 0x1E76, UPPER_CASE, 0x1E77 }, + { 0x1E77, LOWER_CASE, 0x1E76 }, + { 0x1E78, UPPER_CASE, 0x1E79 }, + { 0x1E79, LOWER_CASE, 0x1E78 }, + { 0x1E7A, UPPER_CASE, 0x1E7B }, + { 0x1E7B, LOWER_CASE, 0x1E7A }, + { 0x1E7C, UPPER_CASE, 0x1E7D }, + { 0x1E7D, LOWER_CASE, 0x1E7C }, + { 0x1E7E, UPPER_CASE, 0x1E7F }, + { 0x1E7F, LOWER_CASE, 0x1E7E }, + { 0x1E80, UPPER_CASE, 0x1E81 }, + { 0x1E81, LOWER_CASE, 0x1E80 }, + { 0x1E82, UPPER_CASE, 0x1E83 }, + { 0x1E83, LOWER_CASE, 0x1E82 }, + { 0x1E84, UPPER_CASE, 0x1E85 }, + { 0x1E85, LOWER_CASE, 0x1E84 }, + { 0x1E86, UPPER_CASE, 0x1E87 }, + { 0x1E87, LOWER_CASE, 0x1E86 }, + { 0x1E88, UPPER_CASE, 0x1E89 }, + { 0x1E89, LOWER_CASE, 0x1E88 }, + { 0x1E8A, UPPER_CASE, 0x1E8B }, + { 0x1E8B, LOWER_CASE, 0x1E8A }, + { 0x1E8C, UPPER_CASE, 0x1E8D }, + { 0x1E8D, LOWER_CASE, 0x1E8C }, + { 0x1E8E, UPPER_CASE, 0x1E8F }, + { 0x1E8F, LOWER_CASE, 0x1E8E }, + { 0x1E90, UPPER_CASE, 0x1E91 }, + { 0x1E91, LOWER_CASE, 0x1E90 }, + { 0x1E92, UPPER_CASE, 0x1E93 }, + { 0x1E93, LOWER_CASE, 0x1E92 }, + { 0x1E94, UPPER_CASE, 0x1E95 }, + { 0x1E95, LOWER_CASE, 0x1E94 }, + { 0x1E9B, LOWER_CASE, 0x1E60 }, + { 0x1E9E, UPPER_CASE, 0xDF }, + { 0x1EA0, UPPER_CASE, 0x1EA1 }, + { 0x1EA1, LOWER_CASE, 0x1EA0 }, + { 0x1EA2, UPPER_CASE, 0x1EA3 }, + { 0x1EA3, LOWER_CASE, 0x1EA2 }, + { 0x1EA4, UPPER_CASE, 0x1EA5 }, + { 0x1EA5, LOWER_CASE, 0x1EA4 }, + { 0x1EA6, UPPER_CASE, 0x1EA7 }, + { 0x1EA7, LOWER_CASE, 0x1EA6 }, + { 0x1EA8, UPPER_CASE, 0x1EA9 }, + { 0x1EA9, LOWER_CASE, 0x1EA8 }, + { 0x1EAA, UPPER_CASE, 0x1EAB }, + { 0x1EAB, LOWER_CASE, 0x1EAA }, + { 0x1EAC, UPPER_CASE, 0x1EAD }, + { 0x1EAD, LOWER_CASE, 0x1EAC }, + { 0x1EAE, UPPER_CASE, 0x1EAF }, + { 0x1EAF, LOWER_CASE, 0x1EAE }, + { 0x1EB0, UPPER_CASE, 0x1EB1 }, + { 0x1EB1, LOWER_CASE, 0x1EB0 }, + { 0x1EB2, UPPER_CASE, 0x1EB3 }, + { 0x1EB3, LOWER_CASE, 0x1EB2 }, + { 0x1EB4, UPPER_CASE, 0x1EB5 }, + { 0x1EB5, LOWER_CASE, 0x1EB4 }, + { 0x1EB6, UPPER_CASE, 0x1EB7 }, + { 0x1EB7, LOWER_CASE, 0x1EB6 }, + { 0x1EB8, UPPER_CASE, 0x1EB9 }, + { 0x1EB9, LOWER_CASE, 0x1EB8 }, + { 0x1EBA, UPPER_CASE, 0x1EBB }, + { 0x1EBB, LOWER_CASE, 0x1EBA }, + { 0x1EBC, UPPER_CASE, 0x1EBD }, + { 0x1EBD, LOWER_CASE, 0x1EBC }, + { 0x1EBE, UPPER_CASE, 0x1EBF }, + { 0x1EBF, LOWER_CASE, 0x1EBE }, + { 0x1EC0, UPPER_CASE, 0x1EC1 }, + { 0x1EC1, LOWER_CASE, 0x1EC0 }, + { 0x1EC2, UPPER_CASE, 0x1EC3 }, + { 0x1EC3, LOWER_CASE, 0x1EC2 }, + { 0x1EC4, UPPER_CASE, 0x1EC5 }, + { 0x1EC5, LOWER_CASE, 0x1EC4 }, + { 0x1EC6, UPPER_CASE, 0x1EC7 }, + { 0x1EC7, LOWER_CASE, 0x1EC6 }, + { 0x1EC8, UPPER_CASE, 0x1EC9 }, + { 0x1EC9, LOWER_CASE, 0x1EC8 }, + { 0x1ECA, UPPER_CASE, 0x1ECB }, + { 0x1ECB, LOWER_CASE, 0x1ECA }, + { 0x1ECC, UPPER_CASE, 0x1ECD }, + { 0x1ECD, LOWER_CASE, 0x1ECC }, + { 0x1ECE, UPPER_CASE, 0x1ECF }, + { 0x1ECF, LOWER_CASE, 0x1ECE }, + { 0x1ED0, UPPER_CASE, 0x1ED1 }, + { 0x1ED1, LOWER_CASE, 0x1ED0 }, + { 0x1ED2, UPPER_CASE, 0x1ED3 }, + { 0x1ED3, LOWER_CASE, 0x1ED2 }, + { 0x1ED4, UPPER_CASE, 0x1ED5 }, + { 0x1ED5, LOWER_CASE, 0x1ED4 }, + { 0x1ED6, UPPER_CASE, 0x1ED7 }, + { 0x1ED7, LOWER_CASE, 0x1ED6 }, + { 0x1ED8, UPPER_CASE, 0x1ED9 }, + { 0x1ED9, LOWER_CASE, 0x1ED8 }, + { 0x1EDA, UPPER_CASE, 0x1EDB }, + { 0x1EDB, LOWER_CASE, 0x1EDA }, + { 0x1EDC, UPPER_CASE, 0x1EDD }, + { 0x1EDD, LOWER_CASE, 0x1EDC }, + { 0x1EDE, UPPER_CASE, 0x1EDF }, + { 0x1EDF, LOWER_CASE, 0x1EDE }, + { 0x1EE0, UPPER_CASE, 0x1EE1 }, + { 0x1EE1, LOWER_CASE, 0x1EE0 }, + { 0x1EE2, UPPER_CASE, 0x1EE3 }, + { 0x1EE3, LOWER_CASE, 0x1EE2 }, + { 0x1EE4, UPPER_CASE, 0x1EE5 }, + { 0x1EE5, LOWER_CASE, 0x1EE4 }, + { 0x1EE6, UPPER_CASE, 0x1EE7 }, + { 0x1EE7, LOWER_CASE, 0x1EE6 }, + { 0x1EE8, UPPER_CASE, 0x1EE9 }, + { 0x1EE9, LOWER_CASE, 0x1EE8 }, + { 0x1EEA, UPPER_CASE, 0x1EEB }, + { 0x1EEB, LOWER_CASE, 0x1EEA }, + { 0x1EEC, UPPER_CASE, 0x1EED }, + { 0x1EED, LOWER_CASE, 0x1EEC }, + { 0x1EEE, UPPER_CASE, 0x1EEF }, + { 0x1EEF, LOWER_CASE, 0x1EEE }, + { 0x1EF0, UPPER_CASE, 0x1EF1 }, + { 0x1EF1, LOWER_CASE, 0x1EF0 }, + { 0x1EF2, UPPER_CASE, 0x1EF3 }, + { 0x1EF3, LOWER_CASE, 0x1EF2 }, + { 0x1EF4, UPPER_CASE, 0x1EF5 }, + { 0x1EF5, LOWER_CASE, 0x1EF4 }, + { 0x1EF6, UPPER_CASE, 0x1EF7 }, + { 0x1EF7, LOWER_CASE, 0x1EF6 }, + { 0x1EF8, UPPER_CASE, 0x1EF9 }, + { 0x1EF9, LOWER_CASE, 0x1EF8 }, + { 0x1EFA, UPPER_CASE, 0x1EFB }, + { 0x1EFB, LOWER_CASE, 0x1EFA }, + { 0x1EFC, UPPER_CASE, 0x1EFD }, + { 0x1EFD, LOWER_CASE, 0x1EFC }, + { 0x1EFE, UPPER_CASE, 0x1EFF }, + { 0x1EFF, LOWER_CASE, 0x1EFE }, + { 0x1F00, LOWER_CASE, 0x1F08 }, + { 0x1F01, LOWER_CASE, 0x1F09 }, + { 0x1F02, LOWER_CASE, 0x1F0A }, + { 0x1F03, LOWER_CASE, 0x1F0B }, + { 0x1F04, LOWER_CASE, 0x1F0C }, + { 0x1F05, LOWER_CASE, 0x1F0D }, + { 0x1F06, LOWER_CASE, 0x1F0E }, + { 0x1F07, LOWER_CASE, 0x1F0F }, + { 0x1F08, UPPER_CASE, 0x1F00 }, + { 0x1F09, UPPER_CASE, 0x1F01 }, + { 0x1F0A, UPPER_CASE, 0x1F02 }, + { 0x1F0B, UPPER_CASE, 0x1F03 }, + { 0x1F0C, UPPER_CASE, 0x1F04 }, + { 0x1F0D, UPPER_CASE, 0x1F05 }, + { 0x1F0E, UPPER_CASE, 0x1F06 }, + { 0x1F0F, UPPER_CASE, 0x1F07 }, + { 0x1F10, LOWER_CASE, 0x1F18 }, + { 0x1F11, LOWER_CASE, 0x1F19 }, + { 0x1F12, LOWER_CASE, 0x1F1A }, + { 0x1F13, LOWER_CASE, 0x1F1B }, + { 0x1F14, LOWER_CASE, 0x1F1C }, + { 0x1F15, LOWER_CASE, 0x1F1D }, + { 0x1F18, UPPER_CASE, 0x1F10 }, + { 0x1F19, UPPER_CASE, 0x1F11 }, + { 0x1F1A, UPPER_CASE, 0x1F12 }, + { 0x1F1B, UPPER_CASE, 0x1F13 }, + { 0x1F1C, UPPER_CASE, 0x1F14 }, + { 0x1F1D, UPPER_CASE, 0x1F15 }, + { 0x1F20, LOWER_CASE, 0x1F28 }, + { 0x1F21, LOWER_CASE, 0x1F29 }, + { 0x1F22, LOWER_CASE, 0x1F2A }, + { 0x1F23, LOWER_CASE, 0x1F2B }, + { 0x1F24, LOWER_CASE, 0x1F2C }, + { 0x1F25, LOWER_CASE, 0x1F2D }, + { 0x1F26, LOWER_CASE, 0x1F2E }, + { 0x1F27, LOWER_CASE, 0x1F2F }, + { 0x1F28, UPPER_CASE, 0x1F20 }, + { 0x1F29, UPPER_CASE, 0x1F21 }, + { 0x1F2A, UPPER_CASE, 0x1F22 }, + { 0x1F2B, UPPER_CASE, 0x1F23 }, + { 0x1F2C, UPPER_CASE, 0x1F24 }, + { 0x1F2D, UPPER_CASE, 0x1F25 }, + { 0x1F2E, UPPER_CASE, 0x1F26 }, + { 0x1F2F, UPPER_CASE, 0x1F27 }, + { 0x1F30, LOWER_CASE, 0x1F38 }, + { 0x1F31, LOWER_CASE, 0x1F39 }, + { 0x1F32, LOWER_CASE, 0x1F3A }, + { 0x1F33, LOWER_CASE, 0x1F3B }, + { 0x1F34, LOWER_CASE, 0x1F3C }, + { 0x1F35, LOWER_CASE, 0x1F3D }, + { 0x1F36, LOWER_CASE, 0x1F3E }, + { 0x1F37, LOWER_CASE, 0x1F3F }, + { 0x1F38, UPPER_CASE, 0x1F30 }, + { 0x1F39, UPPER_CASE, 0x1F31 }, + { 0x1F3A, UPPER_CASE, 0x1F32 }, + { 0x1F3B, UPPER_CASE, 0x1F33 }, + { 0x1F3C, UPPER_CASE, 0x1F34 }, + { 0x1F3D, UPPER_CASE, 0x1F35 }, + { 0x1F3E, UPPER_CASE, 0x1F36 }, + { 0x1F3F, UPPER_CASE, 0x1F37 }, + { 0x1F40, LOWER_CASE, 0x1F48 }, + { 0x1F41, LOWER_CASE, 0x1F49 }, + { 0x1F42, LOWER_CASE, 0x1F4A }, + { 0x1F43, LOWER_CASE, 0x1F4B }, + { 0x1F44, LOWER_CASE, 0x1F4C }, + { 0x1F45, LOWER_CASE, 0x1F4D }, + { 0x1F48, UPPER_CASE, 0x1F40 }, + { 0x1F49, UPPER_CASE, 0x1F41 }, + { 0x1F4A, UPPER_CASE, 0x1F42 }, + { 0x1F4B, UPPER_CASE, 0x1F43 }, + { 0x1F4C, UPPER_CASE, 0x1F44 }, + { 0x1F4D, UPPER_CASE, 0x1F45 }, + { 0x1F51, LOWER_CASE, 0x1F59 }, + { 0x1F53, LOWER_CASE, 0x1F5B }, + { 0x1F55, LOWER_CASE, 0x1F5D }, + { 0x1F57, LOWER_CASE, 0x1F5F }, + { 0x1F59, UPPER_CASE, 0x1F51 }, + { 0x1F5B, UPPER_CASE, 0x1F53 }, + { 0x1F5D, UPPER_CASE, 0x1F55 }, + { 0x1F5F, UPPER_CASE, 0x1F57 }, + { 0x1F60, LOWER_CASE, 0x1F68 }, + { 0x1F61, LOWER_CASE, 0x1F69 }, + { 0x1F62, LOWER_CASE, 0x1F6A }, + { 0x1F63, LOWER_CASE, 0x1F6B }, + { 0x1F64, LOWER_CASE, 0x1F6C }, + { 0x1F65, LOWER_CASE, 0x1F6D }, + { 0x1F66, LOWER_CASE, 0x1F6E }, + { 0x1F67, LOWER_CASE, 0x1F6F }, + { 0x1F68, UPPER_CASE, 0x1F60 }, + { 0x1F69, UPPER_CASE, 0x1F61 }, + { 0x1F6A, UPPER_CASE, 0x1F62 }, + { 0x1F6B, UPPER_CASE, 0x1F63 }, + { 0x1F6C, UPPER_CASE, 0x1F64 }, + { 0x1F6D, UPPER_CASE, 0x1F65 }, + { 0x1F6E, UPPER_CASE, 0x1F66 }, + { 0x1F6F, UPPER_CASE, 0x1F67 }, + { 0x1F70, LOWER_CASE, 0x1FBA }, + { 0x1F71, LOWER_CASE, 0x1FBB }, + { 0x1F72, LOWER_CASE, 0x1FC8 }, + { 0x1F73, LOWER_CASE, 0x1FC9 }, + { 0x1F74, LOWER_CASE, 0x1FCA }, + { 0x1F75, LOWER_CASE, 0x1FCB }, + { 0x1F76, LOWER_CASE, 0x1FDA }, + { 0x1F77, LOWER_CASE, 0x1FDB }, + { 0x1F78, LOWER_CASE, 0x1FF8 }, + { 0x1F79, LOWER_CASE, 0x1FF9 }, + { 0x1F7A, LOWER_CASE, 0x1FEA }, + { 0x1F7B, LOWER_CASE, 0x1FEB }, + { 0x1F7C, LOWER_CASE, 0x1FFA }, + { 0x1F7D, LOWER_CASE, 0x1FFB }, + { 0x1F80, LOWER_CASE, 0x1F88 }, + { 0x1F81, LOWER_CASE, 0x1F89 }, + { 0x1F82, LOWER_CASE, 0x1F8A }, + { 0x1F83, LOWER_CASE, 0x1F8B }, + { 0x1F84, LOWER_CASE, 0x1F8C }, + { 0x1F85, LOWER_CASE, 0x1F8D }, + { 0x1F86, LOWER_CASE, 0x1F8E }, + { 0x1F87, LOWER_CASE, 0x1F8F }, + { 0x1F88, UPPER_CASE, 0x1F80 }, + { 0x1F89, UPPER_CASE, 0x1F81 }, + { 0x1F8A, UPPER_CASE, 0x1F82 }, + { 0x1F8B, UPPER_CASE, 0x1F83 }, + { 0x1F8C, UPPER_CASE, 0x1F84 }, + { 0x1F8D, UPPER_CASE, 0x1F85 }, + { 0x1F8E, UPPER_CASE, 0x1F86 }, + { 0x1F8F, UPPER_CASE, 0x1F87 }, + { 0x1F90, LOWER_CASE, 0x1F98 }, + { 0x1F91, LOWER_CASE, 0x1F99 }, + { 0x1F92, LOWER_CASE, 0x1F9A }, + { 0x1F93, LOWER_CASE, 0x1F9B }, + { 0x1F94, LOWER_CASE, 0x1F9C }, + { 0x1F95, LOWER_CASE, 0x1F9D }, + { 0x1F96, LOWER_CASE, 0x1F9E }, + { 0x1F97, LOWER_CASE, 0x1F9F }, + { 0x1F98, UPPER_CASE, 0x1F90 }, + { 0x1F99, UPPER_CASE, 0x1F91 }, + { 0x1F9A, UPPER_CASE, 0x1F92 }, + { 0x1F9B, UPPER_CASE, 0x1F93 }, + { 0x1F9C, UPPER_CASE, 0x1F94 }, + { 0x1F9D, UPPER_CASE, 0x1F95 }, + { 0x1F9E, UPPER_CASE, 0x1F96 }, + { 0x1F9F, UPPER_CASE, 0x1F97 }, + { 0x1FA0, LOWER_CASE, 0x1FA8 }, + { 0x1FA1, LOWER_CASE, 0x1FA9 }, + { 0x1FA2, LOWER_CASE, 0x1FAA }, + { 0x1FA3, LOWER_CASE, 0x1FAB }, + { 0x1FA4, LOWER_CASE, 0x1FAC }, + { 0x1FA5, LOWER_CASE, 0x1FAD }, + { 0x1FA6, LOWER_CASE, 0x1FAE }, + { 0x1FA7, LOWER_CASE, 0x1FAF }, + { 0x1FA8, UPPER_CASE, 0x1FA0 }, + { 0x1FA9, UPPER_CASE, 0x1FA1 }, + { 0x1FAA, UPPER_CASE, 0x1FA2 }, + { 0x1FAB, UPPER_CASE, 0x1FA3 }, + { 0x1FAC, UPPER_CASE, 0x1FA4 }, + { 0x1FAD, UPPER_CASE, 0x1FA5 }, + { 0x1FAE, UPPER_CASE, 0x1FA6 }, + { 0x1FAF, UPPER_CASE, 0x1FA7 }, + { 0x1FB0, LOWER_CASE, 0x1FB8 }, + { 0x1FB1, LOWER_CASE, 0x1FB9 }, + { 0x1FB3, LOWER_CASE, 0x1FBC }, + { 0x1FB8, UPPER_CASE, 0x1FB0 }, + { 0x1FB9, UPPER_CASE, 0x1FB1 }, + { 0x1FBA, UPPER_CASE, 0x1F70 }, + { 0x1FBB, UPPER_CASE, 0x1F71 }, + { 0x1FBC, UPPER_CASE, 0x1FB3 }, + { 0x1FBE, LOWER_CASE, 0x399 }, + { 0x1FC3, LOWER_CASE, 0x1FCC }, + { 0x1FC8, UPPER_CASE, 0x1F72 }, + { 0x1FC9, UPPER_CASE, 0x1F73 }, + { 0x1FCA, UPPER_CASE, 0x1F74 }, + { 0x1FCB, UPPER_CASE, 0x1F75 }, + { 0x1FCC, UPPER_CASE, 0x1FC3 }, + { 0x1FD0, LOWER_CASE, 0x1FD8 }, + { 0x1FD1, LOWER_CASE, 0x1FD9 }, + { 0x1FD8, UPPER_CASE, 0x1FD0 }, + { 0x1FD9, UPPER_CASE, 0x1FD1 }, + { 0x1FDA, UPPER_CASE, 0x1F76 }, + { 0x1FDB, UPPER_CASE, 0x1F77 }, + { 0x1FE0, LOWER_CASE, 0x1FE8 }, + { 0x1FE1, LOWER_CASE, 0x1FE9 }, + { 0x1FE5, LOWER_CASE, 0x1FEC }, + { 0x1FE8, UPPER_CASE, 0x1FE0 }, + { 0x1FE9, UPPER_CASE, 0x1FE1 }, + { 0x1FEA, UPPER_CASE, 0x1F7A }, + { 0x1FEB, UPPER_CASE, 0x1F7B }, + { 0x1FEC, UPPER_CASE, 0x1FE5 }, + { 0x1FF3, LOWER_CASE, 0x1FFC }, + { 0x1FF8, UPPER_CASE, 0x1F78 }, + { 0x1FF9, UPPER_CASE, 0x1F79 }, + { 0x1FFA, UPPER_CASE, 0x1F7C }, + { 0x1FFB, UPPER_CASE, 0x1F7D }, + { 0x1FFC, UPPER_CASE, 0x1FF3 }, + { 0x2126, UPPER_CASE, 0x3C9 }, + { 0x212A, UPPER_CASE, 0x6B }, + { 0x212B, UPPER_CASE, 0xE5 }, + { 0x2132, UPPER_CASE, 0x214E }, + { 0x214E, LOWER_CASE, 0x2132 }, + { 0x2160, UPPER_CASE, 0x2170 }, + { 0x2161, UPPER_CASE, 0x2171 }, + { 0x2162, UPPER_CASE, 0x2172 }, + { 0x2163, UPPER_CASE, 0x2173 }, + { 0x2164, UPPER_CASE, 0x2174 }, + { 0x2165, UPPER_CASE, 0x2175 }, + { 0x2166, UPPER_CASE, 0x2176 }, + { 0x2167, UPPER_CASE, 0x2177 }, + { 0x2168, UPPER_CASE, 0x2178 }, + { 0x2169, UPPER_CASE, 0x2179 }, + { 0x216A, UPPER_CASE, 0x217A }, + { 0x216B, UPPER_CASE, 0x217B }, + { 0x216C, UPPER_CASE, 0x217C }, + { 0x216D, UPPER_CASE, 0x217D }, + { 0x216E, UPPER_CASE, 0x217E }, + { 0x216F, UPPER_CASE, 0x217F }, + { 0x2170, LOWER_CASE, 0x2160 }, + { 0x2171, LOWER_CASE, 0x2161 }, + { 0x2172, LOWER_CASE, 0x2162 }, + { 0x2173, LOWER_CASE, 0x2163 }, + { 0x2174, LOWER_CASE, 0x2164 }, + { 0x2175, LOWER_CASE, 0x2165 }, + { 0x2176, LOWER_CASE, 0x2166 }, + { 0x2177, LOWER_CASE, 0x2167 }, + { 0x2178, LOWER_CASE, 0x2168 }, + { 0x2179, LOWER_CASE, 0x2169 }, + { 0x217A, LOWER_CASE, 0x216A }, + { 0x217B, LOWER_CASE, 0x216B }, + { 0x217C, LOWER_CASE, 0x216C }, + { 0x217D, LOWER_CASE, 0x216D }, + { 0x217E, LOWER_CASE, 0x216E }, + { 0x217F, LOWER_CASE, 0x216F }, + { 0x2183, UPPER_CASE, 0x2184 }, + { 0x2184, LOWER_CASE, 0x2183 }, + { 0x24B6, UPPER_CASE, 0x24D0 }, + { 0x24B7, UPPER_CASE, 0x24D1 }, + { 0x24B8, UPPER_CASE, 0x24D2 }, + { 0x24B9, UPPER_CASE, 0x24D3 }, + { 0x24BA, UPPER_CASE, 0x24D4 }, + { 0x24BB, UPPER_CASE, 0x24D5 }, + { 0x24BC, UPPER_CASE, 0x24D6 }, + { 0x24BD, UPPER_CASE, 0x24D7 }, + { 0x24BE, UPPER_CASE, 0x24D8 }, + { 0x24BF, UPPER_CASE, 0x24D9 }, + { 0x24C0, UPPER_CASE, 0x24DA }, + { 0x24C1, UPPER_CASE, 0x24DB }, + { 0x24C2, UPPER_CASE, 0x24DC }, + { 0x24C3, UPPER_CASE, 0x24DD }, + { 0x24C4, UPPER_CASE, 0x24DE }, + { 0x24C5, UPPER_CASE, 0x24DF }, + { 0x24C6, UPPER_CASE, 0x24E0 }, + { 0x24C7, UPPER_CASE, 0x24E1 }, + { 0x24C8, UPPER_CASE, 0x24E2 }, + { 0x24C9, UPPER_CASE, 0x24E3 }, + { 0x24CA, UPPER_CASE, 0x24E4 }, + { 0x24CB, UPPER_CASE, 0x24E5 }, + { 0x24CC, UPPER_CASE, 0x24E6 }, + { 0x24CD, UPPER_CASE, 0x24E7 }, + { 0x24CE, UPPER_CASE, 0x24E8 }, + { 0x24CF, UPPER_CASE, 0x24E9 }, + { 0x24D0, LOWER_CASE, 0x24B6 }, + { 0x24D1, LOWER_CASE, 0x24B7 }, + { 0x24D2, LOWER_CASE, 0x24B8 }, + { 0x24D3, LOWER_CASE, 0x24B9 }, + { 0x24D4, LOWER_CASE, 0x24BA }, + { 0x24D5, LOWER_CASE, 0x24BB }, + { 0x24D6, LOWER_CASE, 0x24BC }, + { 0x24D7, LOWER_CASE, 0x24BD }, + { 0x24D8, LOWER_CASE, 0x24BE }, + { 0x24D9, LOWER_CASE, 0x24BF }, + { 0x24DA, LOWER_CASE, 0x24C0 }, + { 0x24DB, LOWER_CASE, 0x24C1 }, + { 0x24DC, LOWER_CASE, 0x24C2 }, + { 0x24DD, LOWER_CASE, 0x24C3 }, + { 0x24DE, LOWER_CASE, 0x24C4 }, + { 0x24DF, LOWER_CASE, 0x24C5 }, + { 0x24E0, LOWER_CASE, 0x24C6 }, + { 0x24E1, LOWER_CASE, 0x24C7 }, + { 0x24E2, LOWER_CASE, 0x24C8 }, + { 0x24E3, LOWER_CASE, 0x24C9 }, + { 0x24E4, LOWER_CASE, 0x24CA }, + { 0x24E5, LOWER_CASE, 0x24CB }, + { 0x24E6, LOWER_CASE, 0x24CC }, + { 0x24E7, LOWER_CASE, 0x24CD }, + { 0x24E8, LOWER_CASE, 0x24CE }, + { 0x24E9, LOWER_CASE, 0x24CF }, + { 0x2C00, UPPER_CASE, 0x2C30 }, + { 0x2C01, UPPER_CASE, 0x2C31 }, + { 0x2C02, UPPER_CASE, 0x2C32 }, + { 0x2C03, UPPER_CASE, 0x2C33 }, + { 0x2C04, UPPER_CASE, 0x2C34 }, + { 0x2C05, UPPER_CASE, 0x2C35 }, + { 0x2C06, UPPER_CASE, 0x2C36 }, + { 0x2C07, UPPER_CASE, 0x2C37 }, + { 0x2C08, UPPER_CASE, 0x2C38 }, + { 0x2C09, UPPER_CASE, 0x2C39 }, + { 0x2C0A, UPPER_CASE, 0x2C3A }, + { 0x2C0B, UPPER_CASE, 0x2C3B }, + { 0x2C0C, UPPER_CASE, 0x2C3C }, + { 0x2C0D, UPPER_CASE, 0x2C3D }, + { 0x2C0E, UPPER_CASE, 0x2C3E }, + { 0x2C0F, UPPER_CASE, 0x2C3F }, + { 0x2C10, UPPER_CASE, 0x2C40 }, + { 0x2C11, UPPER_CASE, 0x2C41 }, + { 0x2C12, UPPER_CASE, 0x2C42 }, + { 0x2C13, UPPER_CASE, 0x2C43 }, + { 0x2C14, UPPER_CASE, 0x2C44 }, + { 0x2C15, UPPER_CASE, 0x2C45 }, + { 0x2C16, UPPER_CASE, 0x2C46 }, + { 0x2C17, UPPER_CASE, 0x2C47 }, + { 0x2C18, UPPER_CASE, 0x2C48 }, + { 0x2C19, UPPER_CASE, 0x2C49 }, + { 0x2C1A, UPPER_CASE, 0x2C4A }, + { 0x2C1B, UPPER_CASE, 0x2C4B }, + { 0x2C1C, UPPER_CASE, 0x2C4C }, + { 0x2C1D, UPPER_CASE, 0x2C4D }, + { 0x2C1E, UPPER_CASE, 0x2C4E }, + { 0x2C1F, UPPER_CASE, 0x2C4F }, + { 0x2C20, UPPER_CASE, 0x2C50 }, + { 0x2C21, UPPER_CASE, 0x2C51 }, + { 0x2C22, UPPER_CASE, 0x2C52 }, + { 0x2C23, UPPER_CASE, 0x2C53 }, + { 0x2C24, UPPER_CASE, 0x2C54 }, + { 0x2C25, UPPER_CASE, 0x2C55 }, + { 0x2C26, UPPER_CASE, 0x2C56 }, + { 0x2C27, UPPER_CASE, 0x2C57 }, + { 0x2C28, UPPER_CASE, 0x2C58 }, + { 0x2C29, UPPER_CASE, 0x2C59 }, + { 0x2C2A, UPPER_CASE, 0x2C5A }, + { 0x2C2B, UPPER_CASE, 0x2C5B }, + { 0x2C2C, UPPER_CASE, 0x2C5C }, + { 0x2C2D, UPPER_CASE, 0x2C5D }, + { 0x2C2E, UPPER_CASE, 0x2C5E }, + { 0x2C30, LOWER_CASE, 0x2C00 }, + { 0x2C31, LOWER_CASE, 0x2C01 }, + { 0x2C32, LOWER_CASE, 0x2C02 }, + { 0x2C33, LOWER_CASE, 0x2C03 }, + { 0x2C34, LOWER_CASE, 0x2C04 }, + { 0x2C35, LOWER_CASE, 0x2C05 }, + { 0x2C36, LOWER_CASE, 0x2C06 }, + { 0x2C37, LOWER_CASE, 0x2C07 }, + { 0x2C38, LOWER_CASE, 0x2C08 }, + { 0x2C39, LOWER_CASE, 0x2C09 }, + { 0x2C3A, LOWER_CASE, 0x2C0A }, + { 0x2C3B, LOWER_CASE, 0x2C0B }, + { 0x2C3C, LOWER_CASE, 0x2C0C }, + { 0x2C3D, LOWER_CASE, 0x2C0D }, + { 0x2C3E, LOWER_CASE, 0x2C0E }, + { 0x2C3F, LOWER_CASE, 0x2C0F }, + { 0x2C40, LOWER_CASE, 0x2C10 }, + { 0x2C41, LOWER_CASE, 0x2C11 }, + { 0x2C42, LOWER_CASE, 0x2C12 }, + { 0x2C43, LOWER_CASE, 0x2C13 }, + { 0x2C44, LOWER_CASE, 0x2C14 }, + { 0x2C45, LOWER_CASE, 0x2C15 }, + { 0x2C46, LOWER_CASE, 0x2C16 }, + { 0x2C47, LOWER_CASE, 0x2C17 }, + { 0x2C48, LOWER_CASE, 0x2C18 }, + { 0x2C49, LOWER_CASE, 0x2C19 }, + { 0x2C4A, LOWER_CASE, 0x2C1A }, + { 0x2C4B, LOWER_CASE, 0x2C1B }, + { 0x2C4C, LOWER_CASE, 0x2C1C }, + { 0x2C4D, LOWER_CASE, 0x2C1D }, + { 0x2C4E, LOWER_CASE, 0x2C1E }, + { 0x2C4F, LOWER_CASE, 0x2C1F }, + { 0x2C50, LOWER_CASE, 0x2C20 }, + { 0x2C51, LOWER_CASE, 0x2C21 }, + { 0x2C52, LOWER_CASE, 0x2C22 }, + { 0x2C53, LOWER_CASE, 0x2C23 }, + { 0x2C54, LOWER_CASE, 0x2C24 }, + { 0x2C55, LOWER_CASE, 0x2C25 }, + { 0x2C56, LOWER_CASE, 0x2C26 }, + { 0x2C57, LOWER_CASE, 0x2C27 }, + { 0x2C58, LOWER_CASE, 0x2C28 }, + { 0x2C59, LOWER_CASE, 0x2C29 }, + { 0x2C5A, LOWER_CASE, 0x2C2A }, + { 0x2C5B, LOWER_CASE, 0x2C2B }, + { 0x2C5C, LOWER_CASE, 0x2C2C }, + { 0x2C5D, LOWER_CASE, 0x2C2D }, + { 0x2C5E, LOWER_CASE, 0x2C2E }, + { 0x2C60, UPPER_CASE, 0x2C61 }, + { 0x2C61, LOWER_CASE, 0x2C60 }, + { 0x2C62, UPPER_CASE, 0x26B }, + { 0x2C63, UPPER_CASE, 0x1D7D }, + { 0x2C64, UPPER_CASE, 0x27D }, + { 0x2C65, LOWER_CASE, 0x23A }, + { 0x2C66, LOWER_CASE, 0x23E }, + { 0x2C67, UPPER_CASE, 0x2C68 }, + { 0x2C68, LOWER_CASE, 0x2C67 }, + { 0x2C69, UPPER_CASE, 0x2C6A }, + { 0x2C6A, LOWER_CASE, 0x2C69 }, + { 0x2C6B, UPPER_CASE, 0x2C6C }, + { 0x2C6C, LOWER_CASE, 0x2C6B }, + { 0x2C6D, UPPER_CASE, 0x251 }, + { 0x2C6E, UPPER_CASE, 0x271 }, + { 0x2C6F, UPPER_CASE, 0x250 }, + { 0x2C70, UPPER_CASE, 0x252 }, + { 0x2C72, UPPER_CASE, 0x2C73 }, + { 0x2C73, LOWER_CASE, 0x2C72 }, + { 0x2C75, UPPER_CASE, 0x2C76 }, + { 0x2C76, LOWER_CASE, 0x2C75 }, + { 0x2C7E, UPPER_CASE, 0x23F }, + { 0x2C7F, UPPER_CASE, 0x240 }, + { 0x2C80, UPPER_CASE, 0x2C81 }, + { 0x2C81, LOWER_CASE, 0x2C80 }, + { 0x2C82, UPPER_CASE, 0x2C83 }, + { 0x2C83, LOWER_CASE, 0x2C82 }, + { 0x2C84, UPPER_CASE, 0x2C85 }, + { 0x2C85, LOWER_CASE, 0x2C84 }, + { 0x2C86, UPPER_CASE, 0x2C87 }, + { 0x2C87, LOWER_CASE, 0x2C86 }, + { 0x2C88, UPPER_CASE, 0x2C89 }, + { 0x2C89, LOWER_CASE, 0x2C88 }, + { 0x2C8A, UPPER_CASE, 0x2C8B }, + { 0x2C8B, LOWER_CASE, 0x2C8A }, + { 0x2C8C, UPPER_CASE, 0x2C8D }, + { 0x2C8D, LOWER_CASE, 0x2C8C }, + { 0x2C8E, UPPER_CASE, 0x2C8F }, + { 0x2C8F, LOWER_CASE, 0x2C8E }, + { 0x2C90, UPPER_CASE, 0x2C91 }, + { 0x2C91, LOWER_CASE, 0x2C90 }, + { 0x2C92, UPPER_CASE, 0x2C93 }, + { 0x2C93, LOWER_CASE, 0x2C92 }, + { 0x2C94, UPPER_CASE, 0x2C95 }, + { 0x2C95, LOWER_CASE, 0x2C94 }, + { 0x2C96, UPPER_CASE, 0x2C97 }, + { 0x2C97, LOWER_CASE, 0x2C96 }, + { 0x2C98, UPPER_CASE, 0x2C99 }, + { 0x2C99, LOWER_CASE, 0x2C98 }, + { 0x2C9A, UPPER_CASE, 0x2C9B }, + { 0x2C9B, LOWER_CASE, 0x2C9A }, + { 0x2C9C, UPPER_CASE, 0x2C9D }, + { 0x2C9D, LOWER_CASE, 0x2C9C }, + { 0x2C9E, UPPER_CASE, 0x2C9F }, + { 0x2C9F, LOWER_CASE, 0x2C9E }, + { 0x2CA0, UPPER_CASE, 0x2CA1 }, + { 0x2CA1, LOWER_CASE, 0x2CA0 }, + { 0x2CA2, UPPER_CASE, 0x2CA3 }, + { 0x2CA3, LOWER_CASE, 0x2CA2 }, + { 0x2CA4, UPPER_CASE, 0x2CA5 }, + { 0x2CA5, LOWER_CASE, 0x2CA4 }, + { 0x2CA6, UPPER_CASE, 0x2CA7 }, + { 0x2CA7, LOWER_CASE, 0x2CA6 }, + { 0x2CA8, UPPER_CASE, 0x2CA9 }, + { 0x2CA9, LOWER_CASE, 0x2CA8 }, + { 0x2CAA, UPPER_CASE, 0x2CAB }, + { 0x2CAB, LOWER_CASE, 0x2CAA }, + { 0x2CAC, UPPER_CASE, 0x2CAD }, + { 0x2CAD, LOWER_CASE, 0x2CAC }, + { 0x2CAE, UPPER_CASE, 0x2CAF }, + { 0x2CAF, LOWER_CASE, 0x2CAE }, + { 0x2CB0, UPPER_CASE, 0x2CB1 }, + { 0x2CB1, LOWER_CASE, 0x2CB0 }, + { 0x2CB2, UPPER_CASE, 0x2CB3 }, + { 0x2CB3, LOWER_CASE, 0x2CB2 }, + { 0x2CB4, UPPER_CASE, 0x2CB5 }, + { 0x2CB5, LOWER_CASE, 0x2CB4 }, + { 0x2CB6, UPPER_CASE, 0x2CB7 }, + { 0x2CB7, LOWER_CASE, 0x2CB6 }, + { 0x2CB8, UPPER_CASE, 0x2CB9 }, + { 0x2CB9, LOWER_CASE, 0x2CB8 }, + { 0x2CBA, UPPER_CASE, 0x2CBB }, + { 0x2CBB, LOWER_CASE, 0x2CBA }, + { 0x2CBC, UPPER_CASE, 0x2CBD }, + { 0x2CBD, LOWER_CASE, 0x2CBC }, + { 0x2CBE, UPPER_CASE, 0x2CBF }, + { 0x2CBF, LOWER_CASE, 0x2CBE }, + { 0x2CC0, UPPER_CASE, 0x2CC1 }, + { 0x2CC1, LOWER_CASE, 0x2CC0 }, + { 0x2CC2, UPPER_CASE, 0x2CC3 }, + { 0x2CC3, LOWER_CASE, 0x2CC2 }, + { 0x2CC4, UPPER_CASE, 0x2CC5 }, + { 0x2CC5, LOWER_CASE, 0x2CC4 }, + { 0x2CC6, UPPER_CASE, 0x2CC7 }, + { 0x2CC7, LOWER_CASE, 0x2CC6 }, + { 0x2CC8, UPPER_CASE, 0x2CC9 }, + { 0x2CC9, LOWER_CASE, 0x2CC8 }, + { 0x2CCA, UPPER_CASE, 0x2CCB }, + { 0x2CCB, LOWER_CASE, 0x2CCA }, + { 0x2CCC, UPPER_CASE, 0x2CCD }, + { 0x2CCD, LOWER_CASE, 0x2CCC }, + { 0x2CCE, UPPER_CASE, 0x2CCF }, + { 0x2CCF, LOWER_CASE, 0x2CCE }, + { 0x2CD0, UPPER_CASE, 0x2CD1 }, + { 0x2CD1, LOWER_CASE, 0x2CD0 }, + { 0x2CD2, UPPER_CASE, 0x2CD3 }, + { 0x2CD3, LOWER_CASE, 0x2CD2 }, + { 0x2CD4, UPPER_CASE, 0x2CD5 }, + { 0x2CD5, LOWER_CASE, 0x2CD4 }, + { 0x2CD6, UPPER_CASE, 0x2CD7 }, + { 0x2CD7, LOWER_CASE, 0x2CD6 }, + { 0x2CD8, UPPER_CASE, 0x2CD9 }, + { 0x2CD9, LOWER_CASE, 0x2CD8 }, + { 0x2CDA, UPPER_CASE, 0x2CDB }, + { 0x2CDB, LOWER_CASE, 0x2CDA }, + { 0x2CDC, UPPER_CASE, 0x2CDD }, + { 0x2CDD, LOWER_CASE, 0x2CDC }, + { 0x2CDE, UPPER_CASE, 0x2CDF }, + { 0x2CDF, LOWER_CASE, 0x2CDE }, + { 0x2CE0, UPPER_CASE, 0x2CE1 }, + { 0x2CE1, LOWER_CASE, 0x2CE0 }, + { 0x2CE2, UPPER_CASE, 0x2CE3 }, + { 0x2CE3, LOWER_CASE, 0x2CE2 }, + { 0x2CEB, UPPER_CASE, 0x2CEC }, + { 0x2CEC, LOWER_CASE, 0x2CEB }, + { 0x2CED, UPPER_CASE, 0x2CEE }, + { 0x2CEE, LOWER_CASE, 0x2CED }, + { 0x2CF2, UPPER_CASE, 0x2CF3 }, + { 0x2CF3, LOWER_CASE, 0x2CF2 }, + { 0x2D00, LOWER_CASE, 0x10A0 }, + { 0x2D01, LOWER_CASE, 0x10A1 }, + { 0x2D02, LOWER_CASE, 0x10A2 }, + { 0x2D03, LOWER_CASE, 0x10A3 }, + { 0x2D04, LOWER_CASE, 0x10A4 }, + { 0x2D05, LOWER_CASE, 0x10A5 }, + { 0x2D06, LOWER_CASE, 0x10A6 }, + { 0x2D07, LOWER_CASE, 0x10A7 }, + { 0x2D08, LOWER_CASE, 0x10A8 }, + { 0x2D09, LOWER_CASE, 0x10A9 }, + { 0x2D0A, LOWER_CASE, 0x10AA }, + { 0x2D0B, LOWER_CASE, 0x10AB }, + { 0x2D0C, LOWER_CASE, 0x10AC }, + { 0x2D0D, LOWER_CASE, 0x10AD }, + { 0x2D0E, LOWER_CASE, 0x10AE }, + { 0x2D0F, LOWER_CASE, 0x10AF }, + { 0x2D10, LOWER_CASE, 0x10B0 }, + { 0x2D11, LOWER_CASE, 0x10B1 }, + { 0x2D12, LOWER_CASE, 0x10B2 }, + { 0x2D13, LOWER_CASE, 0x10B3 }, + { 0x2D14, LOWER_CASE, 0x10B4 }, + { 0x2D15, LOWER_CASE, 0x10B5 }, + { 0x2D16, LOWER_CASE, 0x10B6 }, + { 0x2D17, LOWER_CASE, 0x10B7 }, + { 0x2D18, LOWER_CASE, 0x10B8 }, + { 0x2D19, LOWER_CASE, 0x10B9 }, + { 0x2D1A, LOWER_CASE, 0x10BA }, + { 0x2D1B, LOWER_CASE, 0x10BB }, + { 0x2D1C, LOWER_CASE, 0x10BC }, + { 0x2D1D, LOWER_CASE, 0x10BD }, + { 0x2D1E, LOWER_CASE, 0x10BE }, + { 0x2D1F, LOWER_CASE, 0x10BF }, + { 0x2D20, LOWER_CASE, 0x10C0 }, + { 0x2D21, LOWER_CASE, 0x10C1 }, + { 0x2D22, LOWER_CASE, 0x10C2 }, + { 0x2D23, LOWER_CASE, 0x10C3 }, + { 0x2D24, LOWER_CASE, 0x10C4 }, + { 0x2D25, LOWER_CASE, 0x10C5 }, + { 0x2D27, LOWER_CASE, 0x10C7 }, + { 0x2D2D, LOWER_CASE, 0x10CD }, + { 0xA640, UPPER_CASE, 0xA641 }, + { 0xA641, LOWER_CASE, 0xA640 }, + { 0xA642, UPPER_CASE, 0xA643 }, + { 0xA643, LOWER_CASE, 0xA642 }, + { 0xA644, UPPER_CASE, 0xA645 }, + { 0xA645, LOWER_CASE, 0xA644 }, + { 0xA646, UPPER_CASE, 0xA647 }, + { 0xA647, LOWER_CASE, 0xA646 }, + { 0xA648, UPPER_CASE, 0xA649 }, + { 0xA649, LOWER_CASE, 0xA648 }, + { 0xA64A, UPPER_CASE, 0xA64B }, + { 0xA64B, LOWER_CASE, 0xA64A }, + { 0xA64C, UPPER_CASE, 0xA64D }, + { 0xA64D, LOWER_CASE, 0xA64C }, + { 0xA64E, UPPER_CASE, 0xA64F }, + { 0xA64F, LOWER_CASE, 0xA64E }, + { 0xA650, UPPER_CASE, 0xA651 }, + { 0xA651, LOWER_CASE, 0xA650 }, + { 0xA652, UPPER_CASE, 0xA653 }, + { 0xA653, LOWER_CASE, 0xA652 }, + { 0xA654, UPPER_CASE, 0xA655 }, + { 0xA655, LOWER_CASE, 0xA654 }, + { 0xA656, UPPER_CASE, 0xA657 }, + { 0xA657, LOWER_CASE, 0xA656 }, + { 0xA658, UPPER_CASE, 0xA659 }, + { 0xA659, LOWER_CASE, 0xA658 }, + { 0xA65A, UPPER_CASE, 0xA65B }, + { 0xA65B, LOWER_CASE, 0xA65A }, + { 0xA65C, UPPER_CASE, 0xA65D }, + { 0xA65D, LOWER_CASE, 0xA65C }, + { 0xA65E, UPPER_CASE, 0xA65F }, + { 0xA65F, LOWER_CASE, 0xA65E }, + { 0xA660, UPPER_CASE, 0xA661 }, + { 0xA661, LOWER_CASE, 0xA660 }, + { 0xA662, UPPER_CASE, 0xA663 }, + { 0xA663, LOWER_CASE, 0xA662 }, + { 0xA664, UPPER_CASE, 0xA665 }, + { 0xA665, LOWER_CASE, 0xA664 }, + { 0xA666, UPPER_CASE, 0xA667 }, + { 0xA667, LOWER_CASE, 0xA666 }, + { 0xA668, UPPER_CASE, 0xA669 }, + { 0xA669, LOWER_CASE, 0xA668 }, + { 0xA66A, UPPER_CASE, 0xA66B }, + { 0xA66B, LOWER_CASE, 0xA66A }, + { 0xA66C, UPPER_CASE, 0xA66D }, + { 0xA66D, LOWER_CASE, 0xA66C }, + { 0xA680, UPPER_CASE, 0xA681 }, + { 0xA681, LOWER_CASE, 0xA680 }, + { 0xA682, UPPER_CASE, 0xA683 }, + { 0xA683, LOWER_CASE, 0xA682 }, + { 0xA684, UPPER_CASE, 0xA685 }, + { 0xA685, LOWER_CASE, 0xA684 }, + { 0xA686, UPPER_CASE, 0xA687 }, + { 0xA687, LOWER_CASE, 0xA686 }, + { 0xA688, UPPER_CASE, 0xA689 }, + { 0xA689, LOWER_CASE, 0xA688 }, + { 0xA68A, UPPER_CASE, 0xA68B }, + { 0xA68B, LOWER_CASE, 0xA68A }, + { 0xA68C, UPPER_CASE, 0xA68D }, + { 0xA68D, LOWER_CASE, 0xA68C }, + { 0xA68E, UPPER_CASE, 0xA68F }, + { 0xA68F, LOWER_CASE, 0xA68E }, + { 0xA690, UPPER_CASE, 0xA691 }, + { 0xA691, LOWER_CASE, 0xA690 }, + { 0xA692, UPPER_CASE, 0xA693 }, + { 0xA693, LOWER_CASE, 0xA692 }, + { 0xA694, UPPER_CASE, 0xA695 }, + { 0xA695, LOWER_CASE, 0xA694 }, + { 0xA696, UPPER_CASE, 0xA697 }, + { 0xA697, LOWER_CASE, 0xA696 }, + { 0xA698, UPPER_CASE, 0xA699 }, + { 0xA699, LOWER_CASE, 0xA698 }, + { 0xA69A, UPPER_CASE, 0xA69B }, + { 0xA69B, LOWER_CASE, 0xA69A }, + { 0xA722, UPPER_CASE, 0xA723 }, + { 0xA723, LOWER_CASE, 0xA722 }, + { 0xA724, UPPER_CASE, 0xA725 }, + { 0xA725, LOWER_CASE, 0xA724 }, + { 0xA726, UPPER_CASE, 0xA727 }, + { 0xA727, LOWER_CASE, 0xA726 }, + { 0xA728, UPPER_CASE, 0xA729 }, + { 0xA729, LOWER_CASE, 0xA728 }, + { 0xA72A, UPPER_CASE, 0xA72B }, + { 0xA72B, LOWER_CASE, 0xA72A }, + { 0xA72C, UPPER_CASE, 0xA72D }, + { 0xA72D, LOWER_CASE, 0xA72C }, + { 0xA72E, UPPER_CASE, 0xA72F }, + { 0xA72F, LOWER_CASE, 0xA72E }, + { 0xA732, UPPER_CASE, 0xA733 }, + { 0xA733, LOWER_CASE, 0xA732 }, + { 0xA734, UPPER_CASE, 0xA735 }, + { 0xA735, LOWER_CASE, 0xA734 }, + { 0xA736, UPPER_CASE, 0xA737 }, + { 0xA737, LOWER_CASE, 0xA736 }, + { 0xA738, UPPER_CASE, 0xA739 }, + { 0xA739, LOWER_CASE, 0xA738 }, + { 0xA73A, UPPER_CASE, 0xA73B }, + { 0xA73B, LOWER_CASE, 0xA73A }, + { 0xA73C, UPPER_CASE, 0xA73D }, + { 0xA73D, LOWER_CASE, 0xA73C }, + { 0xA73E, UPPER_CASE, 0xA73F }, + { 0xA73F, LOWER_CASE, 0xA73E }, + { 0xA740, UPPER_CASE, 0xA741 }, + { 0xA741, LOWER_CASE, 0xA740 }, + { 0xA742, UPPER_CASE, 0xA743 }, + { 0xA743, LOWER_CASE, 0xA742 }, + { 0xA744, UPPER_CASE, 0xA745 }, + { 0xA745, LOWER_CASE, 0xA744 }, + { 0xA746, UPPER_CASE, 0xA747 }, + { 0xA747, LOWER_CASE, 0xA746 }, + { 0xA748, UPPER_CASE, 0xA749 }, + { 0xA749, LOWER_CASE, 0xA748 }, + { 0xA74A, UPPER_CASE, 0xA74B }, + { 0xA74B, LOWER_CASE, 0xA74A }, + { 0xA74C, UPPER_CASE, 0xA74D }, + { 0xA74D, LOWER_CASE, 0xA74C }, + { 0xA74E, UPPER_CASE, 0xA74F }, + { 0xA74F, LOWER_CASE, 0xA74E }, + { 0xA750, UPPER_CASE, 0xA751 }, + { 0xA751, LOWER_CASE, 0xA750 }, + { 0xA752, UPPER_CASE, 0xA753 }, + { 0xA753, LOWER_CASE, 0xA752 }, + { 0xA754, UPPER_CASE, 0xA755 }, + { 0xA755, LOWER_CASE, 0xA754 }, + { 0xA756, UPPER_CASE, 0xA757 }, + { 0xA757, LOWER_CASE, 0xA756 }, + { 0xA758, UPPER_CASE, 0xA759 }, + { 0xA759, LOWER_CASE, 0xA758 }, + { 0xA75A, UPPER_CASE, 0xA75B }, + { 0xA75B, LOWER_CASE, 0xA75A }, + { 0xA75C, UPPER_CASE, 0xA75D }, + { 0xA75D, LOWER_CASE, 0xA75C }, + { 0xA75E, UPPER_CASE, 0xA75F }, + { 0xA75F, LOWER_CASE, 0xA75E }, + { 0xA760, UPPER_CASE, 0xA761 }, + { 0xA761, LOWER_CASE, 0xA760 }, + { 0xA762, UPPER_CASE, 0xA763 }, + { 0xA763, LOWER_CASE, 0xA762 }, + { 0xA764, UPPER_CASE, 0xA765 }, + { 0xA765, LOWER_CASE, 0xA764 }, + { 0xA766, UPPER_CASE, 0xA767 }, + { 0xA767, LOWER_CASE, 0xA766 }, + { 0xA768, UPPER_CASE, 0xA769 }, + { 0xA769, LOWER_CASE, 0xA768 }, + { 0xA76A, UPPER_CASE, 0xA76B }, + { 0xA76B, LOWER_CASE, 0xA76A }, + { 0xA76C, UPPER_CASE, 0xA76D }, + { 0xA76D, LOWER_CASE, 0xA76C }, + { 0xA76E, UPPER_CASE, 0xA76F }, + { 0xA76F, LOWER_CASE, 0xA76E }, + { 0xA779, UPPER_CASE, 0xA77A }, + { 0xA77A, LOWER_CASE, 0xA779 }, + { 0xA77B, UPPER_CASE, 0xA77C }, + { 0xA77C, LOWER_CASE, 0xA77B }, + { 0xA77D, UPPER_CASE, 0x1D79 }, + { 0xA77E, UPPER_CASE, 0xA77F }, + { 0xA77F, LOWER_CASE, 0xA77E }, + { 0xA780, UPPER_CASE, 0xA781 }, + { 0xA781, LOWER_CASE, 0xA780 }, + { 0xA782, UPPER_CASE, 0xA783 }, + { 0xA783, LOWER_CASE, 0xA782 }, + { 0xA784, UPPER_CASE, 0xA785 }, + { 0xA785, LOWER_CASE, 0xA784 }, + { 0xA786, UPPER_CASE, 0xA787 }, + { 0xA787, LOWER_CASE, 0xA786 }, + { 0xA78B, UPPER_CASE, 0xA78C }, + { 0xA78C, LOWER_CASE, 0xA78B }, + { 0xA78D, UPPER_CASE, 0x265 }, + { 0xA790, UPPER_CASE, 0xA791 }, + { 0xA791, LOWER_CASE, 0xA790 }, + { 0xA792, UPPER_CASE, 0xA793 }, + { 0xA793, LOWER_CASE, 0xA792 }, + { 0xA796, UPPER_CASE, 0xA797 }, + { 0xA797, LOWER_CASE, 0xA796 }, + { 0xA798, UPPER_CASE, 0xA799 }, + { 0xA799, LOWER_CASE, 0xA798 }, + { 0xA79A, UPPER_CASE, 0xA79B }, + { 0xA79B, LOWER_CASE, 0xA79A }, + { 0xA79C, UPPER_CASE, 0xA79D }, + { 0xA79D, LOWER_CASE, 0xA79C }, + { 0xA79E, UPPER_CASE, 0xA79F }, + { 0xA79F, LOWER_CASE, 0xA79E }, + { 0xA7A0, UPPER_CASE, 0xA7A1 }, + { 0xA7A1, LOWER_CASE, 0xA7A0 }, + { 0xA7A2, UPPER_CASE, 0xA7A3 }, + { 0xA7A3, LOWER_CASE, 0xA7A2 }, + { 0xA7A4, UPPER_CASE, 0xA7A5 }, + { 0xA7A5, LOWER_CASE, 0xA7A4 }, + { 0xA7A6, UPPER_CASE, 0xA7A7 }, + { 0xA7A7, LOWER_CASE, 0xA7A6 }, + { 0xA7A8, UPPER_CASE, 0xA7A9 }, + { 0xA7A9, LOWER_CASE, 0xA7A8 }, + { 0xA7AA, UPPER_CASE, 0x266 }, + { 0xA7AB, UPPER_CASE, 0x25C }, + { 0xA7AC, UPPER_CASE, 0x261 }, + { 0xA7AD, UPPER_CASE, 0x26C }, + { 0xA7AE, UPPER_CASE, 0x26A }, + { 0xA7B0, UPPER_CASE, 0x29E }, + { 0xA7B1, UPPER_CASE, 0x287 }, + { 0xA7B2, UPPER_CASE, 0x29D }, + { 0xA7B3, UPPER_CASE, 0xAB53 }, + { 0xA7B4, UPPER_CASE, 0xA7B5 }, + { 0xA7B5, LOWER_CASE, 0xA7B4 }, + { 0xA7B6, UPPER_CASE, 0xA7B7 }, + { 0xA7B7, LOWER_CASE, 0xA7B6 }, + { 0xA7B8, UPPER_CASE, 0xA7B9 }, + { 0xA7B9, LOWER_CASE, 0xA7B8 }, + { 0xAB53, LOWER_CASE, 0xA7B3 }, + { 0xAB70, LOWER_CASE, 0x13A0 }, + { 0xAB71, LOWER_CASE, 0x13A1 }, + { 0xAB72, LOWER_CASE, 0x13A2 }, + { 0xAB73, LOWER_CASE, 0x13A3 }, + { 0xAB74, LOWER_CASE, 0x13A4 }, + { 0xAB75, LOWER_CASE, 0x13A5 }, + { 0xAB76, LOWER_CASE, 0x13A6 }, + { 0xAB77, LOWER_CASE, 0x13A7 }, + { 0xAB78, LOWER_CASE, 0x13A8 }, + { 0xAB79, LOWER_CASE, 0x13A9 }, + { 0xAB7A, LOWER_CASE, 0x13AA }, + { 0xAB7B, LOWER_CASE, 0x13AB }, + { 0xAB7C, LOWER_CASE, 0x13AC }, + { 0xAB7D, LOWER_CASE, 0x13AD }, + { 0xAB7E, LOWER_CASE, 0x13AE }, + { 0xAB7F, LOWER_CASE, 0x13AF }, + { 0xAB80, LOWER_CASE, 0x13B0 }, + { 0xAB81, LOWER_CASE, 0x13B1 }, + { 0xAB82, LOWER_CASE, 0x13B2 }, + { 0xAB83, LOWER_CASE, 0x13B3 }, + { 0xAB84, LOWER_CASE, 0x13B4 }, + { 0xAB85, LOWER_CASE, 0x13B5 }, + { 0xAB86, LOWER_CASE, 0x13B6 }, + { 0xAB87, LOWER_CASE, 0x13B7 }, + { 0xAB88, LOWER_CASE, 0x13B8 }, + { 0xAB89, LOWER_CASE, 0x13B9 }, + { 0xAB8A, LOWER_CASE, 0x13BA }, + { 0xAB8B, LOWER_CASE, 0x13BB }, + { 0xAB8C, LOWER_CASE, 0x13BC }, + { 0xAB8D, LOWER_CASE, 0x13BD }, + { 0xAB8E, LOWER_CASE, 0x13BE }, + { 0xAB8F, LOWER_CASE, 0x13BF }, + { 0xAB90, LOWER_CASE, 0x13C0 }, + { 0xAB91, LOWER_CASE, 0x13C1 }, + { 0xAB92, LOWER_CASE, 0x13C2 }, + { 0xAB93, LOWER_CASE, 0x13C3 }, + { 0xAB94, LOWER_CASE, 0x13C4 }, + { 0xAB95, LOWER_CASE, 0x13C5 }, + { 0xAB96, LOWER_CASE, 0x13C6 }, + { 0xAB97, LOWER_CASE, 0x13C7 }, + { 0xAB98, LOWER_CASE, 0x13C8 }, + { 0xAB99, LOWER_CASE, 0x13C9 }, + { 0xAB9A, LOWER_CASE, 0x13CA }, + { 0xAB9B, LOWER_CASE, 0x13CB }, + { 0xAB9C, LOWER_CASE, 0x13CC }, + { 0xAB9D, LOWER_CASE, 0x13CD }, + { 0xAB9E, LOWER_CASE, 0x13CE }, + { 0xAB9F, LOWER_CASE, 0x13CF }, + { 0xABA0, LOWER_CASE, 0x13D0 }, + { 0xABA1, LOWER_CASE, 0x13D1 }, + { 0xABA2, LOWER_CASE, 0x13D2 }, + { 0xABA3, LOWER_CASE, 0x13D3 }, + { 0xABA4, LOWER_CASE, 0x13D4 }, + { 0xABA5, LOWER_CASE, 0x13D5 }, + { 0xABA6, LOWER_CASE, 0x13D6 }, + { 0xABA7, LOWER_CASE, 0x13D7 }, + { 0xABA8, LOWER_CASE, 0x13D8 }, + { 0xABA9, LOWER_CASE, 0x13D9 }, + { 0xABAA, LOWER_CASE, 0x13DA }, + { 0xABAB, LOWER_CASE, 0x13DB }, + { 0xABAC, LOWER_CASE, 0x13DC }, + { 0xABAD, LOWER_CASE, 0x13DD }, + { 0xABAE, LOWER_CASE, 0x13DE }, + { 0xABAF, LOWER_CASE, 0x13DF }, + { 0xABB0, LOWER_CASE, 0x13E0 }, + { 0xABB1, LOWER_CASE, 0x13E1 }, + { 0xABB2, LOWER_CASE, 0x13E2 }, + { 0xABB3, LOWER_CASE, 0x13E3 }, + { 0xABB4, LOWER_CASE, 0x13E4 }, + { 0xABB5, LOWER_CASE, 0x13E5 }, + { 0xABB6, LOWER_CASE, 0x13E6 }, + { 0xABB7, LOWER_CASE, 0x13E7 }, + { 0xABB8, LOWER_CASE, 0x13E8 }, + { 0xABB9, LOWER_CASE, 0x13E9 }, + { 0xABBA, LOWER_CASE, 0x13EA }, + { 0xABBB, LOWER_CASE, 0x13EB }, + { 0xABBC, LOWER_CASE, 0x13EC }, + { 0xABBD, LOWER_CASE, 0x13ED }, + { 0xABBE, LOWER_CASE, 0x13EE }, + { 0xABBF, LOWER_CASE, 0x13EF }, + { 0xFF21, UPPER_CASE, 0xFF41 }, + { 0xFF22, UPPER_CASE, 0xFF42 }, + { 0xFF23, UPPER_CASE, 0xFF43 }, + { 0xFF24, UPPER_CASE, 0xFF44 }, + { 0xFF25, UPPER_CASE, 0xFF45 }, + { 0xFF26, UPPER_CASE, 0xFF46 }, + { 0xFF27, UPPER_CASE, 0xFF47 }, + { 0xFF28, UPPER_CASE, 0xFF48 }, + { 0xFF29, UPPER_CASE, 0xFF49 }, + { 0xFF2A, UPPER_CASE, 0xFF4A }, + { 0xFF2B, UPPER_CASE, 0xFF4B }, + { 0xFF2C, UPPER_CASE, 0xFF4C }, + { 0xFF2D, UPPER_CASE, 0xFF4D }, + { 0xFF2E, UPPER_CASE, 0xFF4E }, + { 0xFF2F, UPPER_CASE, 0xFF4F }, + { 0xFF30, UPPER_CASE, 0xFF50 }, + { 0xFF31, UPPER_CASE, 0xFF51 }, + { 0xFF32, UPPER_CASE, 0xFF52 }, + { 0xFF33, UPPER_CASE, 0xFF53 }, + { 0xFF34, UPPER_CASE, 0xFF54 }, + { 0xFF35, UPPER_CASE, 0xFF55 }, + { 0xFF36, UPPER_CASE, 0xFF56 }, + { 0xFF37, UPPER_CASE, 0xFF57 }, + { 0xFF38, UPPER_CASE, 0xFF58 }, + { 0xFF39, UPPER_CASE, 0xFF59 }, + { 0xFF3A, UPPER_CASE, 0xFF5A }, + { 0xFF41, LOWER_CASE, 0xFF21 }, + { 0xFF42, LOWER_CASE, 0xFF22 }, + { 0xFF43, LOWER_CASE, 0xFF23 }, + { 0xFF44, LOWER_CASE, 0xFF24 }, + { 0xFF45, LOWER_CASE, 0xFF25 }, + { 0xFF46, LOWER_CASE, 0xFF26 }, + { 0xFF47, LOWER_CASE, 0xFF27 }, + { 0xFF48, LOWER_CASE, 0xFF28 }, + { 0xFF49, LOWER_CASE, 0xFF29 }, + { 0xFF4A, LOWER_CASE, 0xFF2A }, + { 0xFF4B, LOWER_CASE, 0xFF2B }, + { 0xFF4C, LOWER_CASE, 0xFF2C }, + { 0xFF4D, LOWER_CASE, 0xFF2D }, + { 0xFF4E, LOWER_CASE, 0xFF2E }, + { 0xFF4F, LOWER_CASE, 0xFF2F }, + { 0xFF50, LOWER_CASE, 0xFF30 }, + { 0xFF51, LOWER_CASE, 0xFF31 }, + { 0xFF52, LOWER_CASE, 0xFF32 }, + { 0xFF53, LOWER_CASE, 0xFF33 }, + { 0xFF54, LOWER_CASE, 0xFF34 }, + { 0xFF55, LOWER_CASE, 0xFF35 }, + { 0xFF56, LOWER_CASE, 0xFF36 }, + { 0xFF57, LOWER_CASE, 0xFF37 }, + { 0xFF58, LOWER_CASE, 0xFF38 }, + { 0xFF59, LOWER_CASE, 0xFF39 }, + { 0xFF5A, LOWER_CASE, 0xFF3A }, +}; +CONST UINT UNICODE_DATA_SIZE = sizeof(UnicodeData)/sizeof(UnicodeDataRec); diff --git a/src/pal/src/locale/unicodedata.cs b/src/pal/src/locale/unicodedata.cs new file mode 100644 index 0000000..1209495 --- /dev/null +++ b/src/pal/src/locale/unicodedata.cs @@ -0,0 +1,65 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Globalization; +using System.IO; + +class Program +{ + static void Main(string[] args) + { + Console.WriteLine("// Licensed to the .NET Foundation under one or more agreements."); + Console.WriteLine("// The .NET Foundation licenses this file to you under the MIT license."); + Console.WriteLine("// See the LICENSE file in the project root for more information."); + Console.WriteLine(); + + Console.WriteLine("#include \"pal/unicodedata.h\""); + + Console.WriteLine(); + Console.WriteLine("//"); + Console.WriteLine("// THIS FILE IS GENERATED. DO NOT HAND EDIT."); + Console.WriteLine("//"); + Console.WriteLine(); + + Console.WriteLine("CONST UnicodeDataRec UnicodeData[] = {"); + + string sourceFileName = args[0]; + + using (StreamReader sourceFile = File.OpenText(sourceFileName)) + while (sourceFile.ReadLine() is string line) + { + var fields = line.Split(';'); + + var code = int.Parse(fields[0], NumberStyles.HexNumber); + + bool hasUpperCaseMapping = fields[12].Length != 0; + bool hasLowerCaseMapping = fields[13].Length != 0; + + if (!hasLowerCaseMapping && !hasUpperCaseMapping) + continue; + + + int opposingCase = hasUpperCaseMapping ? + int.Parse(fields[12], NumberStyles.HexNumber) : + int.Parse(fields[13], NumberStyles.HexNumber); + + // These won't fit in 16 bits - no point carrying them + if (code > 0xFFFF) + continue; + + Debug.Assert(opposingCase <= 0xFFFF); + + string specifier = hasUpperCaseMapping ? "LOWER_CASE" : "UPPER_CASE"; + + Console.WriteLine($" {{ 0x{code:X}, {specifier}, 0x{opposingCase:X} }},"); + } + + Console.WriteLine("};"); + + Console.WriteLine("CONST UINT UNICODE_DATA_SIZE = sizeof(UnicodeData)/sizeof(UnicodeDataRec);"); + } +} \ No newline at end of file diff --git a/src/utilcode/sstring.cpp b/src/utilcode/sstring.cpp index d045e9b..6a6a332 100644 --- a/src/utilcode/sstring.cpp +++ b/src/utilcode/sstring.cpp @@ -102,12 +102,22 @@ static WCHAR MapChar(WCHAR wc, DWORD dwFlags, LocaleID lcid) if (dwFlags == LCMAP_UPPERCASE) { - wTmp = toupper(wc); + wTmp = +#ifdef SELF_NO_HOST + toupper(wc); +#else + PAL_ToUpperInvariant(wc); +#endif } else { _ASSERTE(dwFlags == LCMAP_LOWERCASE); - wTmp = tolower(wc); + wTmp = +#ifdef SELF_NO_HOST + tolower(wc); +#else + PAL_ToLowerInvariant(wc); +#endif } #endif // !FEATURE_PAL diff --git a/tests/src/Regressions/coreclr/20616/UnicodeBug.il b/tests/src/Regressions/coreclr/20616/UnicodeBug.il new file mode 100644 index 0000000..f6f5ddd --- /dev/null +++ b/tests/src/Regressions/coreclr/20616/UnicodeBug.il @@ -0,0 +1,103 @@ +.assembly extern mscorlib { } + +.assembly UnicodeBug { } + +.method static int32 main() +{ + .entrypoint + + // + // These encode to 2 UTF-8 bytes + // + + // A single Cyrillic character (matching case) + ldstr bytearray (3B 04 ) // л + ldc.i4.1 + ldc.i4.1 + call class [mscorlib]System.Type class [mscorlib]System.Type::GetType(string, bool, bool) + pop + + // A single Cyrillic character (mismatched case) + ldstr bytearray (1B 04 ) // Л + ldc.i4.1 + ldc.i4.1 + call class [mscorlib]System.Type class [mscorlib]System.Type::GetType(string, bool, bool) + pop + + // "Common language runtime" in Russian + ldstr "общеязыковаяиспОлняющаясреда" // "O" in the middle is capital" + ldc.i4.1 + ldc.i4.1 + call class [mscorlib]System.Type class [mscorlib]System.Type::GetType(string, bool, bool) + pop + + // MEETEI MAYEK LETTER KOK + ldstr bytearray (C0 AB ) // ꯀ + ldc.i4.1 + ldc.i4.1 + call class [mscorlib]System.Type class [mscorlib]System.Type::GetType(string, bool, bool) + pop + + ldstr bytearray (41 FF ) // a + ldc.i4.1 + ldc.i4.1 + call class [mscorlib]System.Type class [mscorlib]System.Type::GetType(string, bool, bool) + pop + + ldstr bytearray (42 FF 35 FF 27 FF ) // bUG + ldc.i4.1 + ldc.i4.1 + call class [mscorlib]System.Type class [mscorlib]System.Type::GetType(string, bool, bool) + pop + + // + // These encode to 4 UTF-8 bytes + // + + // + // These actually don't test case-insensitiveness because we don't support that, + // but at least make sure we can find them using the case-insensitive code path + // case-sensitively. + // + + // A single character from the Supplementary unicode plane + ldstr bytearray (01 D8 28 DC ) // 𐐨 + ldc.i4.1 + ldc.i4.1 + call class [mscorlib]System.Type class [mscorlib]System.Type::GetType(string, bool, bool) + pop + + // Two characters from the Supplementary unicode plane + ldstr bytearray (01 D8 29 DC 01 D8 2A DC ) // 𐐩𐐪 + ldc.i4.1 + ldc.i4.1 + call class [mscorlib]System.Type class [mscorlib]System.Type::GetType(string, bool, bool) + pop + + // Two characters from the Supplementary unicode plane with a standard in between + ldstr bytearray (01 D8 2A DC 61 00 01 D8 2A DC ) // 𐐪a𐐪 + ldc.i4.1 + ldc.i4.1 + call class [mscorlib]System.Type class [mscorlib]System.Type::GetType(string, bool, bool) + pop + + // Two characters from the Supplementary unicode plane with z standard in between + ldstr bytearray (01 D8 2A DC 7A 00 01 D8 2A DC ) // 𐐪z𐐪 + ldc.i4.1 + ldc.i4.1 + call class [mscorlib]System.Type class [mscorlib]System.Type::GetType(string, bool, bool) + pop + + ldc.i4 100 + ret +} + +.class 'л' { } +.class 'Общеязыковаяисполняющаясреда' { } // "O" at the beginning is capital +.class 'ꯀ' { } +.class 'A' { } +.class 'Bug' { } +.class '𐐨' { } +.class '𐐩𐐪' { } +.class '𐐪A𐐪' { } +.class '𐐪Z𐐪' { } \ No newline at end of file diff --git a/tests/src/Regressions/coreclr/20616/UnicodeBug.ilproj b/tests/src/Regressions/coreclr/20616/UnicodeBug.ilproj new file mode 100644 index 0000000..c0b034d --- /dev/null +++ b/tests/src/Regressions/coreclr/20616/UnicodeBug.ilproj @@ -0,0 +1,35 @@ + + + + + $(MSBuildProjectName) + Debug + AnyCPU + 2.0 + {85DFC527-4DB1-595E-A7D7-E94EE1F8140D} + 512 + {786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + 7a9bfb7d + true + true + Exe + BuildAndRun + 0 + + + + + False + + + + + + + + + + + + + \ No newline at end of file -- 2.7.4