tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

Unicode.cpp (233394B)


      1 /* Generated by make_unicode.py DO NOT MODIFY */
      2 /* Unicode version: 17.0.0 */
      3 
      4 /*
      5 * Any copyright is dedicated to the Public Domain.
      6 * http://creativecommons.org/licenses/publicdomain/
      7 */
      8 #include "util/Unicode.h"
      9 
     10 using namespace js;
     11 using namespace js::unicode;
     12 
     13 /*
     14 * So how does indexing work?
     15 * First let's have a look at a char16_t, 16-bits:
     16 *              [................]
     17 * Step 1:
     18 *  Extracting the upper 11 bits from the char16_t.
     19 *   upper = char >>  5 ([***********.....])
     20 * Step 2:
     21 *  Using these bits to get an reduced index from index1.
     22 *   index = index1[upper]
     23 * Step 3:
     24 *  Combining the index and the bottom 5 bits of the original char16_t.
     25 *   real_index = index2[(index << 5) + (char & ((1 << 5) - 1))] ([...********+++++])
     26 *
     27 * The advantage here is that the biggest number in index1 doesn't need 10 bits,
     28 * but 7 and we save some memory.
     29 *
     30 * Step 4:
     31 *  Get the character informations by looking up real_index in js_charinfo.
     32 *
     33 * Pseudocode of generation:
     34 *
     35 * let table be the mapping of char16_t => js_charinfo_index
     36 * let index1 be an empty array
     37 * let index2 be an empty array
     38 * let cache be a hash map
     39 *
     40 * while shift is less then maximal amount you can shift 0xffff before it's 0
     41 *  let chunks be table split in chunks of size 2**shift
     42 *
     43 *  for every chunk in chunks
     44 *   if chunk is in cache
     45 *    let index be cache[chunk]
     46 *   else
     47 *    let index be the max key of index2 + 1
     48 *    for element in chunk
     49 *     push element to index2
     50 *    put index as chunk in cache
     51 *
     52 *   push index >> shift to index1
     53 *
     54 *  increase shift
     55 *  stop if you found the best shift
     56 */
     57 const CharacterInfo unicode::js_charinfo[] = {
     58    { 0, 0, 0 },
     59    { 0, 0, 1 },
     60    { 0, 0, 4 },
     61    { 0, 32, 2 },
     62    { 65504, 0, 2 },
     63    { 0, 0, 2 },
     64    { 743, 0, 2 },
     65    { 121, 0, 2 },
     66    { 0, 1, 2 },
     67    { 65535, 0, 2 },
     68    { 0, 65337, 2 },
     69    { 65304, 0, 2 },
     70    { 0, 65415, 2 },
     71    { 65236, 0, 2 },
     72    { 195, 0, 2 },
     73    { 0, 210, 2 },
     74    { 0, 206, 2 },
     75    { 0, 205, 2 },
     76    { 0, 79, 2 },
     77    { 0, 202, 2 },
     78    { 0, 203, 2 },
     79    { 0, 207, 2 },
     80    { 97, 0, 2 },
     81    { 0, 211, 2 },
     82    { 0, 209, 2 },
     83    { 163, 0, 2 },
     84    { 42561, 0, 2 },
     85    { 0, 213, 2 },
     86    { 130, 0, 2 },
     87    { 0, 214, 2 },
     88    { 0, 218, 2 },
     89    { 0, 217, 2 },
     90    { 0, 219, 2 },
     91    { 56, 0, 2 },
     92    { 0, 2, 2 },
     93    { 65535, 1, 2 },
     94    { 65534, 0, 2 },
     95    { 65457, 0, 2 },
     96    { 0, 65439, 2 },
     97    { 0, 65480, 2 },
     98    { 0, 65406, 2 },
     99    { 0, 10795, 2 },
    100    { 0, 65373, 2 },
    101    { 0, 10792, 2 },
    102    { 10815, 0, 2 },
    103    { 0, 65341, 2 },
    104    { 0, 69, 2 },
    105    { 0, 71, 2 },
    106    { 10783, 0, 2 },
    107    { 10780, 0, 2 },
    108    { 10782, 0, 2 },
    109    { 65326, 0, 2 },
    110    { 65330, 0, 2 },
    111    { 65331, 0, 2 },
    112    { 65334, 0, 2 },
    113    { 65333, 0, 2 },
    114    { 42319, 0, 2 },
    115    { 42315, 0, 2 },
    116    { 65329, 0, 2 },
    117    { 42343, 0, 2 },
    118    { 42280, 0, 2 },
    119    { 42308, 0, 2 },
    120    { 65327, 0, 2 },
    121    { 65325, 0, 2 },
    122    { 10743, 0, 2 },
    123    { 42305, 0, 2 },
    124    { 10749, 0, 2 },
    125    { 65323, 0, 2 },
    126    { 65322, 0, 2 },
    127    { 10727, 0, 2 },
    128    { 65318, 0, 2 },
    129    { 42307, 0, 2 },
    130    { 42282, 0, 2 },
    131    { 65467, 0, 2 },
    132    { 65319, 0, 2 },
    133    { 65465, 0, 2 },
    134    { 65317, 0, 2 },
    135    { 42261, 0, 2 },
    136    { 42258, 0, 2 },
    137    { 84, 0, 4 },
    138    { 0, 116, 2 },
    139    { 0, 38, 2 },
    140    { 0, 37, 2 },
    141    { 0, 64, 2 },
    142    { 0, 63, 2 },
    143    { 65498, 0, 2 },
    144    { 65499, 0, 2 },
    145    { 65505, 0, 2 },
    146    { 65472, 0, 2 },
    147    { 65473, 0, 2 },
    148    { 0, 8, 2 },
    149    { 65474, 0, 2 },
    150    { 65479, 0, 2 },
    151    { 65489, 0, 2 },
    152    { 65482, 0, 2 },
    153    { 65528, 0, 2 },
    154    { 65450, 0, 2 },
    155    { 65456, 0, 2 },
    156    { 7, 0, 2 },
    157    { 65420, 0, 2 },
    158    { 0, 65476, 2 },
    159    { 65440, 0, 2 },
    160    { 0, 65529, 2 },
    161    { 0, 80, 2 },
    162    { 0, 15, 2 },
    163    { 65521, 0, 2 },
    164    { 0, 48, 2 },
    165    { 65488, 0, 2 },
    166    { 0, 7264, 2 },
    167    { 3008, 0, 2 },
    168    { 0, 38864, 2 },
    169    { 59282, 0, 2 },
    170    { 59283, 0, 2 },
    171    { 59292, 0, 2 },
    172    { 59294, 0, 2 },
    173    { 59293, 0, 2 },
    174    { 59300, 0, 2 },
    175    { 59355, 0, 2 },
    176    { 35266, 0, 2 },
    177    { 0, 62528, 2 },
    178    { 35332, 0, 2 },
    179    { 3814, 0, 2 },
    180    { 35384, 0, 2 },
    181    { 65477, 0, 2 },
    182    { 0, 57921, 2 },
    183    { 8, 0, 2 },
    184    { 0, 65528, 2 },
    185    { 74, 0, 2 },
    186    { 86, 0, 2 },
    187    { 100, 0, 2 },
    188    { 128, 0, 2 },
    189    { 112, 0, 2 },
    190    { 126, 0, 2 },
    191    { 9, 0, 2 },
    192    { 0, 65462, 2 },
    193    { 0, 65527, 2 },
    194    { 58331, 0, 2 },
    195    { 0, 65450, 2 },
    196    { 0, 65436, 2 },
    197    { 0, 65424, 2 },
    198    { 0, 65408, 2 },
    199    { 0, 65410, 2 },
    200    { 0, 58019, 2 },
    201    { 0, 57153, 2 },
    202    { 0, 57274, 2 },
    203    { 0, 28, 2 },
    204    { 65508, 0, 2 },
    205    { 0, 16, 2 },
    206    { 65520, 0, 2 },
    207    { 0, 26, 0 },
    208    { 65510, 0, 0 },
    209    { 0, 54793, 2 },
    210    { 0, 61722, 2 },
    211    { 0, 54809, 2 },
    212    { 54741, 0, 2 },
    213    { 54744, 0, 2 },
    214    { 0, 54756, 2 },
    215    { 0, 54787, 2 },
    216    { 0, 54753, 2 },
    217    { 0, 54754, 2 },
    218    { 0, 54721, 2 },
    219    { 58272, 0, 2 },
    220    { 0, 30204, 2 },
    221    { 0, 23256, 2 },
    222    { 48, 0, 2 },
    223    { 0, 23228, 2 },
    224    { 0, 23217, 2 },
    225    { 0, 23221, 2 },
    226    { 0, 23231, 2 },
    227    { 0, 23278, 2 },
    228    { 0, 23254, 2 },
    229    { 0, 23275, 2 },
    230    { 0, 928, 2 },
    231    { 0, 65488, 2 },
    232    { 0, 23229, 2 },
    233    { 0, 30152, 2 },
    234    { 0, 23193, 2 },
    235    { 0, 22975, 2 },
    236    { 64608, 0, 2 },
    237    { 26672, 0, 2 },
    238 };
    239 
    240 const uint8_t unicode::index1[] = {
    241      0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,  16,  17,
    242     18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,  32,  33,  34,  35,
    243     36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,  48,  49,  50,  51,  52,  53,
    244     54,  55,  56,  57,  58,  59,  60,  61,  62,  63,  64,  65,  66,  67,  26,  26,  26,  26,
    245     26,  68,  69,  70,  71,  72,  73,  74,  75,  26,  26,  26,  26,  26,  26,  26,  26,  76,
    246     77,  78,  79,  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,
    247     95,  96,  97,  98,  99, 100, 101, 102,  26, 103, 104,  12, 105, 105, 106, 105, 107, 108,
    248    109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 118, 118, 118, 118, 118, 118, 118, 118,
    249    118, 118, 119, 120, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118,
    250    118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 121, 122, 105, 123,
    251    124, 125, 126, 127, 118, 118, 118, 118, 118, 118, 118, 118, 128,  75, 129, 130, 131,  26,
    252    132, 133, 118, 118, 118, 118, 118, 118, 118, 118,  26,  26,  26,  26,  26,  26,  26,  26,
    253     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
    254     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
    255     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
    256     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
    257     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
    258     26,  26,  26,  26,  26, 118,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
    259     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
    260     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
    261     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
    262     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
    263     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
    264     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
    265     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
    266     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
    267     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
    268     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
    269     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
    270     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
    271     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
    272     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
    273     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
    274     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
    275     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
    276     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
    277     26,  26,  26,  26,  26,  26,  26,  26,  26,  26, 134, 135,  26,  26,  26,  26, 136, 137,
    278    138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155,
    279    156, 157, 158, 159,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
    280     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
    281     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
    282     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
    283     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
    284     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
    285     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
    286     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
    287     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,
    288     26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26,  26, 160, 161,
    289    118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118,
    290    118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118,
    291    118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118,
    292    118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118,
    293    118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118,
    294    118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118,
    295    118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118,
    296    118, 118, 118, 118, 118, 118,  26,  26,  26,  26,  26, 162,  26, 163, 164, 165, 166, 167,
    297     26,  26,  26,  26, 168, 169, 170, 171, 172, 173,  26, 174, 175, 176, 177, 178,
    298 };
    299 
    300 const uint8_t unicode::index2[] = {
    301      0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   1,   1,   1,   1,   0,   0,   0,   0,
    302      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,
    303      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   2,   2,   2,   2,   2,
    304      2,   2,   2,   2,   0,   0,   0,   0,   0,   0,   0,   3,   3,   3,   3,   3,   3,   3,
    305      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
    306      3,   0,   0,   0,   0,   2,   0,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
    307      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   0,   0,   0,
    308      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
    309      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   0,
    310      0,   0,   0,   0,   0,   0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   0,   0,
    311      0,   6,   0,   2,   0,   0,   5,   0,   0,   0,   0,   0,   3,   3,   3,   3,   3,   3,
    312      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   0,
    313      3,   3,   3,   3,   3,   3,   3,   5,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
    314      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   0,   4,   4,   4,   4,
    315      4,   4,   4,   7,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,
    316      8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,
    317      8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,  10,  11,
    318      8,   9,   8,   9,   8,   9,   5,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,
    319      9,   8,   9,   8,   9,   5,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,
    320      8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,
    321      8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,  12,   8,
    322      9,   8,   9,   8,   9,  13,  14,  15,   8,   9,   8,   9,  16,   8,   9,  17,  17,   8,
    323      9,   5,  18,  19,  20,   8,   9,  17,  21,  22,  23,  24,   8,   9,  25,  26,  23,  27,
    324     28,  29,   8,   9,   8,   9,   8,   9,  30,   8,   9,  30,   5,   5,   8,   9,  30,   8,
    325      9,  31,  31,   8,   9,   8,   9,  32,   8,   9,   5,   5,   8,   9,   5,  33,   5,   5,
    326      5,   5,  34,  35,  36,  34,  35,  36,  34,  35,  36,   8,   9,   8,   9,   8,   9,   8,
    327      9,   8,   9,   8,   9,   8,   9,   8,   9,  37,   8,   9,   8,   9,   8,   9,   8,   9,
    328      8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   5,  34,  35,  36,   8,   9,  38,  39,
    329      8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,
    330      8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,
    331      8,   9,   8,   9,  40,   5,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,
    332      8,   9,   8,   9,   8,   9,   5,   5,   5,   5,   5,   5,  41,   8,   9,  42,  43,  44,
    333     44,   8,   9,  45,  46,  47,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,  48,  49,
    334     50,  51,  52,   5,  53,  53,   5,  54,   5,  55,  56,   5,   5,   5,  53,  57,   5,  58,
    335     59,  60,  61,   5,  62,  63,  61,  64,  65,   5,   5,  63,   5,  66,  67,   5,   5,  68,
    336      5,   5,   5,   5,   5,   5,   5,  69,   5,   5,  70,   5,  71,  70,   5,   5,   5,  72,
    337     70,  73,  74,  74,  75,   5,   5,   5,   5,   5,  76,   5,   5,   5,   5,   5,   5,   5,
    338      5,   5,   5,  77,  78,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    339      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    340      5,   5,   5,   5,   0,   0,   0,   0,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    341      5,   5,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   5,   5,
    342      5,   5,   5,   0,   0,   0,   0,   0,   0,   0,   5,   0,   5,   0,   0,   0,   0,   0,
    343      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   2,   2,   2,   2,   2,
    344      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
    345      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
    346      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
    347      2,   2,   2,   2,   2,   2,   2,   2,   2,  79,   2,   2,   2,   2,   2,   2,   2,   2,
    348      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
    349      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   8,   9,
    350      8,   9,   5,   0,   8,   9,   0,   0,   5,  28,  28,  28,   0,  80,   0,   0,   0,   0,
    351      0,   0,  81,   2,  82,  82,  82,   0,  83,   0,  84,  84,   5,   3,   3,   3,   3,   3,
    352      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   0,   3,   3,   3,   3,   3,
    353      3,   3,   3,   3,  85,  86,  86,  86,   5,   4,   4,   4,   4,   4,   4,   4,   4,   4,
    354      4,   4,   4,   4,   4,   4,   4,   4,  87,   4,   4,   4,   4,   4,   4,   4,   4,   4,
    355     88,  89,  89,  90,  91,  92,   5,   5,   5,  93,  94,  95,   8,   9,   8,   9,   8,   9,
    356      8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,
    357     96,  97,  98,  99, 100, 101,   0,   8,   9, 102,   8,   9,   5,  40,  40,  40, 103, 103,
    358    103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103,   3,   3,   3,   3,
    359      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
    360      3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   4,   4,   4,   4,   4,   4,   4,   4,
    361      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
    362      4,   4,   4,   4,   4,   4,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,  97,
    363     97,  97,  97,  97,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,
    364      8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,
    365      8,   9,   0,   2,   2,   2,   2,   2,   0,   0,   8,   9,   8,   9,   8,   9,   8,   9,
    366      8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,
    367      8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,
    368      8,   9,   8,   9,   8,   9,   8,   9,   8,   9, 104,   8,   9,   8,   9,   8,   9,   8,
    369      9,   8,   9,   8,   9,   8,   9, 105,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,
    370      8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,
    371      8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,
    372      8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,
    373      8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,
    374      8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   0, 106, 106, 106,
    375    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106,
    376    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106,   0,
    377      0,   5,   0,   0,   0,   0,   0,   0,   5, 107, 107, 107, 107, 107, 107, 107, 107, 107,
    378    107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107,
    379    107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107,   5,   5,   0,   0,   0,   0,   0,
    380      0,   0,   0,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
    381      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
    382      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   0,   2,   0,   2,   2,   0,
    383      2,   2,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   5,   5,   5,   5,   5,   5,
    384      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    385      5,   5,   5,   0,   0,   0,   0,   5,   5,   5,   5,   0,   0,   0,   0,   0,   0,   0,
    386      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
    387      0,   0,   0,   0,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   0,   0,   0,
    388      0,   0,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    389      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    390      5,   5,   5,   5,   5,   5,   5,   5,   5,   2,   2,   2,   2,   2,   2,   2,   2,   2,
    391      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
    392      2,   2,   2,   2,   0,   0,   0,   0,   5,   5,   2,   5,   5,   5,   5,   5,   5,   5,
    393      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    394      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    395      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    396      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    397      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    398      5,   5,   0,   5,   2,   2,   2,   2,   2,   2,   2,   0,   0,   2,   2,   2,   2,   2,
    399      2,   5,   5,   2,   2,   0,   2,   2,   2,   2,   5,   5,   2,   2,   2,   2,   2,   2,
    400      2,   2,   2,   2,   5,   5,   5,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   0,
    401      0,   0,   0,   0,   0,   0,   0,   0,   5,   2,   5,   5,   5,   5,   5,   5,   5,   5,
    402      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    403      5,   5,   5,   5,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
    404      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   0,   0,   5,   5,   5,
    405      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    406      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    407      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    408      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    409      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   2,   2,   2,   2,
    410      2,   2,   2,   2,   2,   2,   2,   5,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
    411      0,   0,   0,   0,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   5,   5,   5,   5,
    412      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    413      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   2,   2,   2,   2,   2,   2,   2,
    414      2,   2,   5,   5,   0,   0,   0,   0,   5,   0,   0,   2,   0,   0,   5,   5,   5,   5,
    415      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    416      2,   2,   2,   2,   5,   2,   2,   2,   2,   2,   2,   2,   2,   2,   5,   2,   2,   2,
    417      5,   2,   2,   2,   2,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
    418      0,   0,   0,   0,   0,   0,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    419      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   2,   2,   2,   0,   0,
    420      0,   0,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   0,   0,   0,   0,   0,
    421      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    422      5,   5,   5,   5,   5,   5,   0,   5,   5,   5,   5,   5,   5,   5,   0,   0,   0,   0,
    423      0,   0,   0,   2,   2,   2,   2,   2,   2,   2,   2,   2,   5,   5,   5,   5,   5,   5,
    424      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    425      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    426      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
    427      2,   2,   2,   2,   2,   2,   0,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
    428      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
    429      2,   2,   2,   2,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    430      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    431      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    432      5,   5,   5,   5,   2,   2,   2,   5,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
    433      2,   2,   2,   2,   2,   2,   2,   2,   5,   2,   2,   2,   2,   2,   2,   2,   5,   5,
    434      5,   5,   5,   5,   5,   5,   5,   5,   2,   2,   0,   0,   2,   2,   2,   2,   2,   2,
    435      2,   2,   2,   2,   0,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    436      5,   5,   5,   2,   2,   2,   0,   5,   5,   5,   5,   5,   5,   5,   5,   0,   0,   5,
    437      5,   0,   0,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    438      5,   5,   5,   5,   5,   5,   5,   0,   5,   5,   5,   5,   5,   5,   5,   0,   5,   0,
    439      0,   0,   5,   5,   5,   5,   0,   0,   2,   5,   2,   2,   2,   2,   2,   2,   2,   0,
    440      0,   2,   2,   0,   0,   2,   2,   2,   5,   0,   0,   0,   0,   0,   0,   0,   0,   2,
    441      0,   0,   0,   0,   5,   5,   0,   5,   5,   5,   2,   2,   0,   0,   2,   2,   2,   2,
    442      2,   2,   2,   2,   2,   2,   5,   5,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
    443      5,   0,   2,   0,   0,   2,   2,   2,   0,   5,   5,   5,   5,   5,   5,   0,   0,   0,
    444      0,   5,   5,   0,   0,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    445      5,   5,   5,   5,   5,   5,   5,   5,   5,   0,   5,   5,   5,   5,   5,   5,   5,   0,
    446      5,   5,   0,   5,   5,   0,   5,   5,   0,   0,   2,   0,   2,   2,   2,   2,   2,   0,
    447      0,   0,   0,   2,   2,   0,   0,   2,   2,   2,   0,   0,   0,   2,   0,   0,   0,   0,
    448      0,   0,   0,   5,   5,   5,   5,   0,   5,   0,   0,   0,   0,   0,   0,   0,   2,   2,
    449      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   5,   5,   5,   2,   0,   0,   0,   0,
    450      0,   0,   0,   0,   0,   0,   0,   2,   2,   2,   0,   5,   5,   5,   5,   5,   5,   5,
    451      5,   5,   0,   5,   5,   5,   0,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    452      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   0,   5,   5,   5,   5,   5,   5,
    453      5,   0,   5,   5,   0,   5,   5,   5,   5,   5,   0,   0,   2,   5,   2,   2,   2,   2,
    454      2,   2,   2,   2,   0,   2,   2,   2,   0,   2,   2,   2,   0,   0,   5,   0,   0,   0,
    455      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   5,   5,   2,   2,   0,   0,
    456      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   0,   0,   0,   0,   0,   0,   0,   0,
    457      0,   5,   2,   2,   2,   2,   2,   2,   0,   2,   2,   2,   0,   5,   5,   5,   5,   5,
    458      5,   5,   5,   0,   0,   5,   5,   0,   0,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    459      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   0,   5,   5,   5,   5,
    460      5,   5,   5,   0,   5,   5,   0,   5,   5,   5,   5,   5,   0,   0,   2,   5,   2,   2,
    461      2,   2,   2,   2,   2,   0,   0,   2,   2,   0,   0,   2,   2,   2,   0,   0,   0,   0,
    462      0,   0,   0,   2,   2,   2,   0,   0,   0,   0,   5,   5,   0,   5,   5,   5,   2,   2,
    463      0,   0,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   0,   5,   0,   0,   0,   0,
    464      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   5,   0,   5,   5,   5,
    465      5,   5,   5,   0,   0,   0,   5,   5,   5,   0,   5,   5,   5,   5,   0,   0,   0,   5,
    466      5,   0,   5,   0,   5,   5,   0,   0,   0,   5,   5,   0,   0,   0,   5,   5,   5,   0,
    467      0,   0,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   0,   0,   0,   0,
    468      2,   2,   2,   2,   2,   0,   0,   0,   2,   2,   2,   0,   2,   2,   2,   2,   0,   0,
    469      5,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
    470      0,   0,   0,   0,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   0,   0,   0,   0,
    471      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   2,   2,   2,   2,   5,
    472      5,   5,   5,   5,   5,   5,   5,   0,   5,   5,   5,   0,   5,   5,   5,   5,   5,   5,
    473      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   0,
    474      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   0,   0,
    475      2,   5,   2,   2,   2,   2,   2,   2,   2,   0,   2,   2,   2,   0,   2,   2,   2,   2,
    476      0,   0,   0,   0,   0,   0,   0,   2,   2,   0,   5,   5,   5,   0,   5,   5,   0,   0,
    477      5,   5,   2,   2,   0,   0,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   0,   0,
    478      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   5,   2,   2,   2,
    479      0,   5,   5,   5,   5,   5,   5,   5,   5,   0,   5,   5,   5,   0,   5,   5,   5,   5,
    480      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    481      5,   0,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   0,   5,   5,   5,   5,   5,
    482      0,   0,   2,   5,   2,   2,   2,   2,   2,   2,   2,   0,   2,   2,   2,   0,   2,   2,
    483      2,   2,   0,   0,   0,   0,   0,   0,   0,   2,   2,   0,   0,   0,   0,   0,   5,   5,
    484      5,   0,   5,   5,   2,   2,   0,   0,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
    485      0,   5,   5,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   2,
    486      2,   2,   5,   5,   5,   5,   5,   5,   5,   5,   5,   0,   5,   5,   5,   0,   5,   5,
    487      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    488      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    489      5,   5,   5,   2,   2,   5,   2,   2,   2,   2,   2,   2,   2,   0,   2,   2,   2,   0,
    490      2,   2,   2,   2,   5,   0,   0,   0,   0,   0,   5,   5,   5,   2,   0,   0,   0,   0,
    491      0,   0,   0,   5,   5,   5,   2,   2,   0,   0,   2,   2,   2,   2,   2,   2,   2,   2,
    492      2,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   5,   5,   5,   5,   5,   5,
    493      0,   2,   2,   2,   0,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    494      5,   5,   5,   5,   5,   0,   0,   0,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    495      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   0,   5,   5,   5,
    496      5,   5,   5,   5,   5,   5,   0,   5,   0,   0,   5,   5,   5,   5,   5,   5,   5,   0,
    497      0,   0,   2,   0,   0,   0,   0,   2,   2,   2,   2,   2,   2,   0,   2,   0,   2,   2,
    498      2,   2,   2,   2,   2,   2,   0,   0,   0,   0,   0,   0,   2,   2,   2,   2,   2,   2,
    499      2,   2,   2,   2,   0,   0,   2,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
    500      0,   0,   0,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    501      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    502      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   2,   5,   5,
    503      2,   2,   2,   2,   2,   2,   2,   0,   0,   0,   0,   0,   5,   5,   5,   5,   5,   5,
    504      5,   2,   2,   2,   2,   2,   2,   2,   2,   0,   2,   2,   2,   2,   2,   2,   2,   2,
    505      2,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
    506      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
    507      0,   0,   0,   0,   0,   5,   5,   0,   5,   0,   5,   5,   5,   5,   5,   0,   5,   5,
    508      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    509      5,   5,   5,   5,   0,   5,   0,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   2,
    510      5,   5,   2,   2,   2,   2,   2,   2,   2,   2,   2,   5,   0,   0,   5,   5,   5,   5,
    511      5,   0,   5,   0,   2,   2,   2,   2,   2,   2,   2,   0,   2,   2,   2,   2,   2,   2,
    512      2,   2,   2,   2,   0,   0,   5,   5,   5,   5,   0,   0,   0,   0,   0,   0,   0,   0,
    513      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
    514      0,   0,   0,   0,   0,   0,   5,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
    515      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   2,   0,   0,   0,   0,
    516      0,   0,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   0,   0,   0,   0,   0,   0,
    517      0,   0,   0,   0,   0,   2,   0,   2,   0,   2,   0,   0,   0,   0,   2,   2,   5,   5,
    518      5,   5,   5,   5,   5,   5,   0,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    519      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    520      5,   5,   5,   5,   5,   5,   5,   0,   0,   0,   0,   2,   2,   2,   2,   2,   2,   2,
    521      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   0,   2,   2,   5,   5,
    522      5,   5,   5,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   0,   2,   2,   2,
    523      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
    524      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   0,   0,   0,
    525      0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
    526      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
    527      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
    528      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   5,   5,   5,   5,   5,   5,   5,   5,
    529      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    530      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   2,
    531      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
    532      2,   5,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   0,   0,   0,   0,   0,   0,
    533      5,   5,   5,   5,   5,   5,   2,   2,   2,   2,   5,   5,   5,   5,   2,   2,   2,   5,
    534      2,   2,   2,   5,   5,   2,   2,   2,   2,   2,   2,   2,   5,   5,   5,   2,   2,   2,
    535      2,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   2,   2,   2,   2,
    536      2,   2,   2,   2,   2,   2,   2,   2,   5,   2,   2,   2,   2,   2,   2,   2,   2,   2,
    537      2,   2,   2,   2,   2,   2,   0,   0, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108,
    538    108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108,
    539    108, 108, 108, 108, 108, 108, 108, 108, 108, 108,   0, 108,   0,   0,   0,   0,   0, 108,
    540      0,   0, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
    541    109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109,
    542    109, 109, 109, 109, 109, 109, 109, 109, 109,   0,   5, 109, 109, 109,   5,   5,   5,   5,
    543      5,   5,   5,   5,   5,   0,   5,   5,   5,   5,   0,   0,   5,   5,   5,   5,   5,   5,
    544      5,   0,   5,   0,   5,   5,   5,   5,   0,   0,   5,   5,   5,   5,   5,   5,   5,   5,
    545      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    546      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   0,   5,   5,
    547      5,   5,   0,   0,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    548      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    549      5,   0,   5,   5,   5,   5,   0,   0,   5,   5,   5,   5,   5,   5,   5,   0,   5,   0,
    550      5,   5,   5,   5,   0,   0,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    551      5,   5,   5,   0,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    552      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    553      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    554      5,   5,   5,   5,   5,   5,   5,   0,   5,   5,   5,   5,   0,   0,   5,   5,   5,   5,
    555      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    556      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    557      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    558      5,   5,   5,   5,   5,   5,   5,   5,   5,   0,   0,   2,   2,   2,   0,   0,   0,   0,
    559      0,   0,   0,   0,   0,   2,   2,   2,   2,   2,   2,   2,   2,   2,   0,   0,   0,   0,
    560      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   5,   5,   5,   5,   5,   5,   5,   5,
    561      5,   5,   5,   5,   5,   5,   5,   5,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
    562      0,   0,   0,   0,   0,   0, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110,
    563    110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110,
    564    110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110,
    565    110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110,
    566    110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110,  90,  90,  90,  90,
    567     90,  90,   0,   0,  95,  95,  95,  95,  95,  95,   0,   0,   0,   5,   5,   5,   5,   5,
    568      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    569      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    570      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    571      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    572      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    573      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   0,   0,   5,   5,   5,
    574      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   1,   5,   5,   5,
    575      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    576      5,   5,   5,   5,   5,   0,   0,   0,   0,   0,   5,   5,   5,   5,   5,   5,   5,   5,
    577      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    578      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    579      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    580      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   0,   0,   0,   5,   5,
    581      5,   5,   5,   5,   5,   5,   5,   5,   5,   0,   0,   0,   0,   0,   0,   0,   5,   5,
    582      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   2,   2,
    583      2,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   5,   5,   5,   5,   5,   5,   5,
    584      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   2,   2,   2,   0,   0,   0,
    585      0,   0,   0,   0,   0,   0,   0,   0,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    586      5,   5,   5,   5,   5,   5,   5,   5,   2,   2,   0,   0,   0,   0,   0,   0,   0,   0,
    587      0,   0,   0,   0,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   0,
    588      5,   5,   5,   0,   2,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
    589      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    590      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    591      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   2,   2,
    592      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
    593      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   0,   0,   0,   5,   0,   0,
    594      0,   0,   5,   2,   0,   0,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   0,   0,
    595      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
    596      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   2,   2,   0,   2,
    597      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   0,   0,   0,   0,   0,   0,   5,   5,
    598      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    599      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    600      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    601      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    602      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   0,   0,   0,
    603      0,   0,   0,   0,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    604      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    605      5,   5,   5,   5,   5,   5,   5,   5,   5,   2,   5,   0,   0,   0,   0,   0,   5,   5,
    606      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    607      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    608      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    609      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   0,   0,   0,   0,
    610      0,   0,   0,   0,   0,   0,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    611      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    612      5,   0,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   0,   0,   0,   0,
    613      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   0,   0,   0,   0,   0,   0,
    614      0,   0,   0,   0,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   5,   5,   5,   5,
    615      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    616      5,   5,   5,   5,   5,   5,   5,   5,   0,   0,   5,   5,   5,   5,   5,   0,   0,   0,
    617      0,   0,   0,   0,   0,   0,   0,   0,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    618      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    619      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   0,   0,
    620      0,   0,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    621      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   0,   0,   0,   0,   0,   0,   2,   2,
    622      2,   2,   2,   2,   2,   2,   2,   2,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,
    623      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
    624      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   5,   5,   5,   5,   5,   5,   5,   5,
    625      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   2,   2,   2,
    626      2,   2,   0,   0,   0,   0,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    627      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    628      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    629      5,   5,   5,   5,   5,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   0,   2,   2,
    630      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
    631      2,   2,   2,   2,   2,   2,   2,   2,   2,   0,   0,   2,   2,   2,   2,   2,   2,   2,
    632      2,   2,   2,   2,   0,   0,   0,   0,   0,   0,   2,   2,   2,   2,   2,   2,   2,   2,
    633      2,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   5,   0,   0,
    634      0,   0,   0,   0,   0,   0,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
    635      2,   2,   0,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
    636      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   0,   0,
    637      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   0,   0,   0,   0,   0,   0,
    638      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   2,   2,   2,
    639      2,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    640      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    641      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   2,   2,   2,   2,   2,   2,
    642      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   5,   5,   5,   5,   5,   5,   5,
    643      5,   0,   0,   0,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   0,   0,   0,   0,
    644      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   2,   2,   2,   2,
    645      2,   2,   2,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   2,
    646      2,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    647      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   2,   2,   2,   2,   2,
    648      2,   2,   2,   2,   2,   2,   2,   2,   5,   5,   2,   2,   2,   2,   2,   2,   2,   2,
    649      2,   2,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    650      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    651      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   2,   2,   2,   2,   2,   2,   2,   2,
    652      2,   2,   2,   2,   2,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
    653      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    654      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    655      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
    656      2,   2,   0,   0,   0,   0,   0,   0,   0,   0,   2,   2,   2,   2,   2,   2,   2,   2,
    657      2,   2,   0,   0,   0,   5,   5,   5,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
    658      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    659      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    660      0,   0, 111, 112, 113, 114, 114, 115, 116, 117, 118,   8,   9,   0,   0,   0,   0,   0,
    661    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119,
    662    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119,
    663    119, 119, 119, 119, 119, 119, 119,   0,   0, 119, 119, 119,   0,   0,   0,   0,   0,   0,
    664      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   2,   2,   0,   2,   2,   2,   2,
    665      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   5,
    666      5,   5,   5,   2,   5,   5,   5,   5,   5,   5,   2,   5,   5,   2,   2,   2,   5,   0,
    667      0,   0,   0,   0,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    668      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    669      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    670      5,   5,   5,   5,   5,   5,   5, 120,   5,   5,   5, 121,   5,   5,   5,   5,   5,   5,
    671      5,   5,   5,   5,   5,   5,   5,   5,   5,   5, 122,   5,   5,   5,   5,   5,   5,   5,
    672      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    673      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    674      5,   5,   5,   5,   5,   5,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,
    675      8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,
    676      8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,
    677      8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,
    678      8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,
    679      8,   9,   5,   5,   5,   5,   5, 123,   5,   5, 124,   5,   8,   9,   8,   9,   8,   9,
    680      8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,
    681      8,   9,   8,   9,   8,   9,   8,   9, 125, 125, 125, 125, 125, 125, 125, 125, 126, 126,
    682    126, 126, 126, 126, 126, 126, 125, 125, 125, 125, 125, 125,   0,   0, 126, 126, 126, 126,
    683    126, 126,   0,   0, 125, 125, 125, 125, 125, 125, 125, 125, 126, 126, 126, 126, 126, 126,
    684    126, 126, 125, 125, 125, 125, 125, 125, 125, 125, 126, 126, 126, 126, 126, 126, 126, 126,
    685    125, 125, 125, 125, 125, 125,   0,   0, 126, 126, 126, 126, 126, 126,   0,   0,   5, 125,
    686      5, 125,   5, 125,   5, 125,   0, 126,   0, 126,   0, 126,   0, 126, 125, 125, 125, 125,
    687    125, 125, 125, 125, 126, 126, 126, 126, 126, 126, 126, 126, 127, 127, 128, 128, 128, 128,
    688    129, 129, 130, 130, 131, 131, 132, 132,   0,   0, 125, 125, 125, 125, 125, 125, 125, 125,
    689    126, 126, 126, 126, 126, 126, 126, 126, 125, 125, 125, 125, 125, 125, 125, 125, 126, 126,
    690    126, 126, 126, 126, 126, 126, 125, 125, 125, 125, 125, 125, 125, 125, 126, 126, 126, 126,
    691    126, 126, 126, 126, 125, 125,   5, 133,   5,   0,   5,   5, 126, 126, 134, 134, 135,   0,
    692    136,   0,   0,   0,   5, 133,   5,   0,   5,   5, 137, 137, 137, 137, 135,   0,   0,   0,
    693    125, 125,   5,   5,   0,   0,   5,   5, 126, 126, 138, 138,   0,   0,   0,   0, 125, 125,
    694      5,   5,   5,  98,   5,   5, 126, 126, 139, 139, 102,   0,   0,   0,   0,   0,   5, 133,
    695      5,   0,   5,   5, 140, 140, 141, 141, 135,   0,   0,   0,   1,   1,   1,   1,   1,   1,
    696      1,   1,   1,   1,   1,   0,   2,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
    697      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   1,
    698      0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
    699      0,   0,   0,   2,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
    700      0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,
    701      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   5,
    702      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   5,   0,   0,   0,   0,
    703      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   5,   5,   5,   5,   5,   5,
    704      5,   5,   5,   5,   5,   5,   5,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
    705      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
    706      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
    707      0,   0,   0,   0,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   0,
    708      0,   0,   0,   2,   0,   0,   0,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
    709      2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
    710      5,   0,   0,   0,   0,   5,   0,   0,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    711      0,   5,   0,   0,   5,   5,   5,   5,   5,   5,   0,   0,   0,   0,   0,   0,   5,   0,
    712    142,   0,   5,   0, 143, 144,   5,   5,   5,   5,   5,   5, 145,   5,   5,   5,   5,   5,
    713      5,   5,   0,   0,   5,   5,   5,   5,   0,   0,   0,   0,   0,   5,   5,   5,   5,   5,
    714      0,   0,   0,   0, 146,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
    715      0,   0,   0,   0, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147,
    716    147, 147, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148,
    717      5,   5,   5,   8,   9,   5,   5,   5,   5,   0,   0,   0,   0,   0,   0,   0,   0,   0,
    718      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
    719      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
    720      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
    721      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
    722      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
    723      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
    724      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
    725      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
    726      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
    727      0,   0, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149,
    728    149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 150, 150, 150, 150, 150, 150, 150, 150,
    729    150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
    730      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
    731      0,   0,   0,   0, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106,
    732    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106,
    733    106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 107, 107,
    734    107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107,
    735    107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107,
    736    107, 107, 107, 107, 107, 107, 107, 107, 107, 107,   8,   9, 151, 152, 153, 154, 155,   8,
    737      9,   8,   9,   8,   9, 156, 157, 158, 159,   5,   8,   9,   5,   8,   9,   5,   5,   5,
    738      5,   5,   5,   5, 160, 160,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,
    739      8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,
    740      8,   9,   8,   9,   8,   9,   5,   0,   0,   0,   0,   0,   0,   8,   9,   8,   9,   2,
    741      2,   2,   8,   9,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 161, 161,
    742    161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
    743    161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
    744      0, 161,   0,   0,   0,   0,   0, 161,   0,   0,   5,   5,   5,   5,   5,   5,   5,   5,
    745      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    746      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    747      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   0,   0,   0,   0,   0,   0,
    748      0,   5,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,
    749      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    750      5,   5,   5,   5,   5,   0,   0,   0,   0,   0,   0,   0,   0,   0,   5,   5,   5,   5,
    751      5,   5,   5,   0,   5,   5,   5,   5,   5,   5,   5,   0,   5,   5,   5,   5,   5,   5,
    752      5,   0,   5,   5,   5,   5,   5,   5,   5,   0,   5,   5,   5,   5,   5,   5,   5,   0,
    753      5,   5,   5,   5,   5,   5,   5,   0,   5,   5,   5,   5,   5,   5,   5,   0,   5,   5,
    754      5,   5,   5,   5,   5,   0,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
    755      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
    756      2,   2,   1,   0,   0,   0,   0,   5,   5,   5,   0,   0,   0,   0,   0,   0,   0,   0,
    757      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   5,
    758      5,   5,   5,   5,   5,   5,   5,   5,   2,   2,   2,   2,   2,   2,   0,   5,   5,   5,
    759      5,   5,   0,   0,   5,   5,   5,   5,   5,   0,   0,   0,   5,   5,   5,   5,   5,   5,
    760      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   0,
    761      0,   2,   2,   5,   5,   5,   5,   5,   0,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    762      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    763      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    764      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    765      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    766      5,   5,   5,   5,   5,   5,   5,   5,   5,   2,   5,   5,   5,   5,   0,   0,   0,   0,
    767      0,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    768      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    769      5,   5,   5,   5,   5,   5,   5,   5,   0,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    770      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    771      5,   5,   5,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
    772      0,   0,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    773      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   0,   0,
    774      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
    775      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
    776      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   5,   5,   5,   5,   5,   5,   5,   5,
    777      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    778      5,   5,   5,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
    779      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
    780      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
    781      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   5,   5,
    782      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    783      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    784      5,   5,   5,   5,   5,   5,   5,   5,   0,   0,   5,   5,   5,   5,   5,   5,   5,   5,
    785      5,   5,   5,   5,   5,   0,   0,   0,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    786      5,   5,   5,   5,   5,   5,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   5,   5,
    787      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
    788      0,   0,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,
    789      8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,
    790      8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   5,   2,   0,   0,   0,   0,
    791      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   0,   5,   8,   9,   8,   9,   8,   9,
    792      8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,
    793      8,   9,   8,   9,   5,   5,   2,   2,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    794      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    795      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    796      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    797      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   2,   2,
    798      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
    799      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
    800      0,   5,   5,   5,   5,   5,   5,   5,   5,   5,   0,   0,   8,   9,   8,   9,   8,   9,
    801      8,   9,   8,   9,   8,   9,   8,   9,   5,   5,   8,   9,   8,   9,   8,   9,   8,   9,
    802      8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,
    803      8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,
    804      8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,
    805      5,   5,   5,   5,   5,   5,   5,   5,   5,   8,   9,   8,   9, 162,   8,   9,   8,   9,
    806      8,   9,   8,   9,   8,   9,   5,   0,   0,   8,   9, 163,   5,   5,   8,   9,   8,   9,
    807    164,   5,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,
    808      8,   9,   8,   9, 165, 166, 167, 168, 165,   5, 169, 170, 171, 172,   8,   9,   8,   9,
    809      8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9, 173, 174, 175,   8,   9,   8,
    810      9, 176,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,   8,   9,
    811    177,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
    812      0,   0,   0,   5,   5,   5,   5,   8,   9,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    813      5,   5,   2,   5,   5,   5,   2,   5,   5,   5,   5,   2,   5,   5,   5,   5,   5,   5,
    814      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   2,
    815      2,   2,   2,   2,   0,   0,   0,   0,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,
    816      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   5,   5,   5,   5,   5,   5,   5,   5,
    817      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    818      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    819      5,   5,   5,   5,   5,   5,   5,   5,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
    820      0,   0,   2,   2,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    821      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    822      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    823      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
    824      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   2,   2,   2,   2,   2,   2,   2,
    825      2,   2,   0,   0,   0,   0,   0,   0,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
    826      2,   2,   2,   2,   2,   2,   2,   2,   5,   5,   5,   5,   5,   5,   0,   0,   0,   5,
    827      0,   5,   5,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   5,   5,   5,   5,
    828      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    829      5,   5,   5,   5,   5,   5,   2,   2,   2,   2,   2,   2,   2,   2,   0,   0,   5,   5,
    830      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    831      5,   5,   5,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   0,   0,
    832      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   5,   5,   5,   5,   5,   5,   5,   5,
    833      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    834      5,   5,   5,   0,   0,   0,   2,   2,   2,   2,   5,   5,   5,   5,   5,   5,   5,   5,
    835      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    836      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    837      5,   5,   5,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   0,
    838      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   5,   2,   2,   2,   2,
    839      2,   2,   2,   2,   2,   2,   0,   0,   0,   0,   0,   0,   5,   5,   5,   5,   5,   2,
    840      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   2,   2,   2,   2,   2,   2,   2,   2,
    841      2,   2,   5,   5,   5,   5,   5,   0,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    842      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    843      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   2,   2,   2,   2,   2,
    844      2,   2,   2,   2,   2,   2,   2,   2,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,
    845      5,   5,   5,   2,   5,   5,   5,   5,   5,   5,   5,   5,   2,   2,   0,   0,   2,   2,
    846      2,   2,   2,   2,   2,   2,   2,   2,   0,   0,   0,   0,   0,   0,   5,   5,   5,   5,
    847      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    848      5,   0,   0,   0,   5,   2,   2,   2,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    849      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    850      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    851      5,   5,   5,   5,   2,   5,   2,   2,   2,   5,   5,   2,   2,   5,   5,   5,   5,   5,
    852      2,   2,   5,   2,   5,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
    853      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   5,   5,   5,   0,   0,   5,   5,
    854      5,   5,   5,   5,   5,   5,   5,   5,   5,   2,   2,   2,   2,   2,   0,   0,   5,   5,
    855      5,   2,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   5,   5,   5,   5,   5,
    856      5,   0,   0,   5,   5,   5,   5,   5,   5,   0,   0,   5,   5,   5,   5,   5,   5,   0,
    857      0,   0,   0,   0,   0,   0,   0,   0,   5,   5,   5,   5,   5,   5,   5,   0,   5,   5,
    858      5,   5,   5,   5,   5,   0,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    859      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    860      5,   5,   5,   5,   5, 178,   5,   5,   5,   5,   5,   5,   5,   0,   5,   5,   5,   5,
    861      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   0,   0,   0,   0,   0,   0, 179, 179,
    862    179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179,
    863    179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179,
    864    179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179,
    865    179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179,
    866    179, 179, 179, 179, 179, 179,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    867      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    868      5,   5,   5,   5,   5,   2,   2,   2,   2,   2,   2,   2,   2,   0,   2,   2,   0,   0,
    869      2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   0,   0,   0,   0,   0,   0,   5,   5,
    870      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    871      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   0,   0,
    872      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   5,   5,   5,   5,   5,   5,   5,   5,
    873      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   0,   0,   0,
    874      0,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    875      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    876      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   0,   0,   0,   0,
    877      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    878      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    879      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   0,   0,   5,   5,   5,   5,   5,   5,
    880      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    881      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    882      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
    883      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
    884      0,   0,   5,   5,   5,   5,   5,   5,   5,   0,   0,   0,   0,   0,   0,   0,   0,   0,
    885      0,   0,   0,   5,   5,   5,   5,   5,   0,   0,   0,   0,   0,   5,   2,   5,   5,   5,
    886      5,   5,   5,   5,   5,   5,   5,   0,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    887      5,   5,   5,   0,   5,   5,   5,   5,   5,   0,   5,   0,   5,   5,   0,   5,   5,   0,
    888      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    889      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    890      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    891      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    892      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    893      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    894      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
    895      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   5,   5,   5,
    896      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    897      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    898      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    899      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    900      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    901      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   0,   0,   0,   0,
    902      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   5,   5,   5,   5,
    903      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    904      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    905      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    906      5,   5,   5,   5,   5,   5,   0,   0,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    907      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    908      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    909      5,   5,   5,   5,   5,   5,   5,   5,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
    910      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
    911      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   5,   5,   5,   5,   5,   5,
    912      5,   5,   5,   5,   5,   5,   0,   0,   0,   0,   2,   2,   2,   2,   2,   2,   2,   2,
    913      2,   2,   2,   2,   2,   2,   2,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
    914      0,   0,   0,   0,   0,   0,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,
    915      2,   2,   2,   2,   0,   0,   0,   2,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,
    916      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   2,   2,
    917      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
    918      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   5,   5,   5,   5,
    919      5,   0,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    920      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    921      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    922      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    923      5,   0,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
    924      0,   0,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   0,   0,   0,   0,   0,   0,
    925      0,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
    926      3,   3,   3,   3,   3,   3,   3,   3,   3,   0,   0,   0,   0,   2,   0,   4,   4,   4,
    927      4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   4,
    928      4,   4,   4,   4,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   5,   5,
    929      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    930      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    931      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    932      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,
    933      5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   0,   0,   0,
    934      5,   5,   5,   5,   5,   5,   0,   0,   5,   5,   5,   5,   5,   5,   0,   0,   5,   5,
    935      5,   5,   5,   5,   0,   0,   5,   5,   5,   0,   0,   0,   0,   0,   0,   0,   0,   0,
    936      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
    937      0,   0,   0,   0,   0,   0,   0,   0,
    938 };
    939 
    940 const FoldingInfo unicode::js_foldinfo[] = {
    941    { 0 },
    942    { 32 },
    943    { 775 },
    944    { 1 },
    945    { 65415 },
    946    { 65268 },
    947    { 210 },
    948    { 206 },
    949    { 205 },
    950    { 79 },
    951    { 202 },
    952    { 203 },
    953    { 207 },
    954    { 211 },
    955    { 209 },
    956    { 213 },
    957    { 214 },
    958    { 218 },
    959    { 217 },
    960    { 219 },
    961    { 2 },
    962    { 65439 },
    963    { 65480 },
    964    { 65406 },
    965    { 10795 },
    966    { 65373 },
    967    { 10792 },
    968    { 65341 },
    969    { 69 },
    970    { 71 },
    971    { 116 },
    972    { 38 },
    973    { 37 },
    974    { 64 },
    975    { 63 },
    976    { 8 },
    977    { 65506 },
    978    { 65511 },
    979    { 65521 },
    980    { 65514 },
    981    { 65482 },
    982    { 65488 },
    983    { 65476 },
    984    { 65472 },
    985    { 65529 },
    986    { 80 },
    987    { 15 },
    988    { 48 },
    989    { 7264 },
    990    { 65528 },
    991    { 59314 },
    992    { 59315 },
    993    { 59324 },
    994    { 59326 },
    995    { 59325 },
    996    { 59332 },
    997    { 59356 },
    998    { 35267 },
    999    { 62528 },
   1000    { 65478 },
   1001    { 57921 },
   1002    { 65462 },
   1003    { 65527 },
   1004    { 58363 },
   1005    { 65450 },
   1006    { 58301 },
   1007    { 65436 },
   1008    { 58317 },
   1009    { 65424 },
   1010    { 65408 },
   1011    { 65410 },
   1012    { 58019 },
   1013    { 57153 },
   1014    { 57274 },
   1015    { 28 },
   1016    { 16 },
   1017    { 26 },
   1018    { 54793 },
   1019    { 61722 },
   1020    { 54809 },
   1021    { 54756 },
   1022    { 54787 },
   1023    { 54753 },
   1024    { 54754 },
   1025    { 54721 },
   1026    { 30204 },
   1027    { 23256 },
   1028    { 23228 },
   1029    { 23217 },
   1030    { 23221 },
   1031    { 23231 },
   1032    { 23278 },
   1033    { 23254 },
   1034    { 23275 },
   1035    { 928 },
   1036    { 23229 },
   1037    { 30152 },
   1038    { 23193 },
   1039    { 22975 },
   1040    { 26672 },
   1041 };
   1042 
   1043 const uint8_t unicode::folding_index1[] = {
   1044      0,   0,   1,   0,   0,   2,   3,   0,   4,   5,   6,   7,   8,   9,  10,  11,   4,  12,
   1045     13,   0,   0,   0,   0,   0,   0,   0,  14,  15,  16,  17,  18,  19,  20,  21,   0,   4,
   1046     22,   4,  23,   4,   4,  24,  25,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1047      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1048      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1049      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1050      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1051      0,   0,   0,   0,   0,   0,   0,  26,  27,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1052      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  28,   0,   0,
   1053      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1054      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1055      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1056      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  29,  30,   0,   0,   0,   0,
   1057      0,   0,   0,   0,   0,   0,   4,   4,   4,   4,  31,   4,   4,   4,  32,  33,  34,  35,
   1058     33,  36,  37,  38,   0,   0,   0,   0,   0,   0,   0,   0,   0,  39,   0,  40,  41,   0,
   1059      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1060      0,   0,   0,   0,   0,  42,  43,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1061      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1062      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1063      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  44,  45,   0,  46,   4,   4,   4,  47,
   1064      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1065      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1066      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1067      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1068      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1069      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1070      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1071      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1072      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1073      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1074      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1075      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1076      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1077      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1078      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1079      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1080      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1081      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1082      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1083      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1084      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1085      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1086      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1087      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1088      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1089      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1090      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1091      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1092      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1093      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1094      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1095      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1096      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1097      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1098      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1099      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1100      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1101      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1102      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1103      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1104      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1105      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1106      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1107      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1108      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1109      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1110      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1111      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1112      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1113      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1114      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1115      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1116      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1117      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   4,  48,
   1118     49,   0,   0,   0,   0,  50,   4,  51,  52,  53,  54,  55,   0,   0,   0,   0,   0,   0,
   1119      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1120      0,   0,   0,  56,  57,  57,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1121      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1122      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1123      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1124      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1125      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1126      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1127      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1128      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1129      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1130      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1131      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1132      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1133      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1134      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1135      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1136      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1137      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1138      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1139      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1140      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1141      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1142      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1143      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1144      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1145      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1146      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1147      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1148      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1149      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1150      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1151      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1152      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1153      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1154      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1155      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  58,   0,   0,   0,   0,   0,   0,   0,
   1156      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1157      0,   0,   0,   0,   0,   0,   0,   1,   0,   0,   0,   0,   0,   0,
   1158 };
   1159 
   1160 const uint8_t unicode::folding_index2[] = {
   1161      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1162      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   1,   1,
   1163      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
   1164      1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1165      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   2,   0,   0,   0,   0,
   1166      0,   0,   0,   0,   0,   0,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
   1167      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   1,   1,   1,   1,   1,   1,
   1168      1,   0,   3,   0,   3,   0,   3,   0,   3,   0,   3,   0,   3,   0,   3,   0,   3,   0,
   1169      3,   0,   3,   0,   3,   0,   3,   0,   3,   0,   3,   0,   3,   0,   3,   0,   3,   0,
   1170      3,   0,   3,   0,   3,   0,   3,   0,   3,   0,   3,   0,   3,   0,   0,   0,   3,   0,
   1171      3,   0,   3,   0,   0,   3,   0,   3,   0,   3,   0,   3,   0,   3,   0,   3,   0,   3,
   1172      0,   3,   0,   0,   3,   0,   3,   0,   3,   0,   3,   0,   3,   0,   3,   0,   3,   0,
   1173      3,   0,   3,   0,   3,   0,   3,   0,   3,   0,   3,   0,   3,   0,   3,   0,   3,   0,
   1174      3,   0,   3,   0,   3,   0,   3,   0,   3,   0,   3,   0,   3,   0,   4,   3,   0,   3,
   1175      0,   3,   0,   5,   0,   6,   3,   0,   3,   0,   7,   3,   0,   8,   8,   3,   0,   0,
   1176      9,  10,  11,   3,   0,   8,  12,   0,  13,  14,   3,   0,   0,   0,  13,  15,   0,  16,
   1177      3,   0,   3,   0,   3,   0,  17,   3,   0,  17,   0,   0,   3,   0,  17,   3,   0,  18,
   1178     18,   3,   0,   3,   0,  19,   3,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,
   1179     20,   3,   0,  20,   3,   0,  20,   3,   0,   3,   0,   3,   0,   3,   0,   3,   0,   3,
   1180      0,   3,   0,   3,   0,   3,   0,   0,   3,   0,   3,   0,   3,   0,   3,   0,   3,   0,
   1181      3,   0,   3,   0,   3,   0,   3,   0,   0,  20,   3,   0,   3,   0,  21,  22,   3,   0,
   1182      3,   0,   3,   0,   3,   0,  23,   0,   3,   0,   3,   0,   3,   0,   3,   0,   3,   0,
   1183      3,   0,   3,   0,   3,   0,   3,   0,   0,   0,   0,   0,   0,   0,  24,   3,   0,  25,
   1184     26,   0,   0,   3,   0,  27,  28,  29,   3,   0,   3,   0,   3,   0,   3,   0,   3,   0,
   1185      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1186      0,   0,   0,  30,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1187      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1188      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   3,   0,   0,   0,   3,   0,
   1189      0,   0,   0,   0,   0,   0,   0,  30,   0,   0,   0,   0,   0,   0,  31,   0,  32,  32,
   1190     32,   0,  33,   0,  34,  34,   0,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
   1191      1,   1,   1,   1,   1,   1,   0,   1,   1,   1,   1,   1,   1,   1,   1,   1,   0,   0,
   1192      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1193      0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  35,  36,  37,
   1194      0,   0,   0,  38,  39,   0,   3,   0,   3,   0,   3,   0,   3,   0,   3,   0,   3,   0,
   1195      3,   0,   3,   0,   3,   0,   3,   0,   3,   0,   3,   0,  40,  41,   0,   0,  42,  43,
   1196      0,   3,   0,  44,   3,   0,   0,  23,  23,  23,  45,  45,  45,  45,  45,  45,  45,  45,
   1197     45,  45,  45,  45,  45,  45,  45,  45,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
   1198      1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
   1199      1,   1,   1,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1200      0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   3,   0,   3,   0,
   1201      3,   0,   3,   0,   3,   0,   3,   0,   3,   0,   3,   0,   3,   0,   3,   0,  46,   3,
   1202      0,   3,   0,   3,   0,   3,   0,   3,   0,   3,   0,   3,   0,   0,   3,   0,   3,   0,
   1203      3,   0,   3,   0,   3,   0,   3,   0,   3,   0,   3,   0,   3,   0,   3,   0,   3,   0,
   1204      3,   0,   3,   0,   3,   0,   3,   0,   3,   0,   0,  47,  47,  47,  47,  47,  47,  47,
   1205     47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,
   1206     47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,   0,   0,   0,   0,   0,
   1207      0,   0,   0,   0,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
   1208     48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,  48,
   1209     48,  48,  48,  48,  48,  48,   0,  48,   0,   0,   0,   0,   0,  48,   0,   0,   0,   0,
   1210      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1211      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1212      0,   0,  49,  49,  49,  49,  49,  49,   0,   0,  50,  51,  52,  53,  53,  54,  55,  56,
   1213     57,   3,   0,   0,   0,   0,   0,   0,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,
   1214     58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,
   1215     58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,  58,   0,   0,  58,
   1216     58,  58,   3,   0,   3,   0,   3,   0,   3,   0,   3,   0,   3,   0,   3,   0,   3,   0,
   1217      3,   0,   3,   0,   3,   0,   0,   0,   0,   0,   0,  59,   0,   0,  60,   0,   0,   0,
   1218      0,   0,   0,   0,   0,   0,  49,  49,  49,  49,  49,  49,  49,  49,   0,   0,   0,   0,
   1219      0,   0,   0,   0,  49,  49,  49,  49,  49,  49,   0,   0,   0,   0,   0,   0,   0,   0,
   1220      0,   0,  49,  49,  49,  49,  49,  49,  49,  49,   0,   0,   0,   0,   0,   0,   0,   0,
   1221     49,  49,  49,  49,  49,  49,  49,  49,   0,   0,   0,   0,   0,   0,   0,   0,  49,  49,
   1222     49,  49,  49,  49,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  49,   0,  49,
   1223      0,  49,   0,  49,   0,   0,   0,   0,   0,   0,   0,   0,  49,  49,  49,  49,  49,  49,
   1224     49,  49,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1225      0,   0,   0,   0,   0,   0,   0,   0,  49,  49,  49,  49,  49,  49,  49,  49,   0,   0,
   1226      0,   0,   0,   0,   0,   0,  49,  49,  61,  61,  62,   0,  63,   0,   0,   0,   0,   0,
   1227      0,   0,   0,   0,  64,  64,  64,  64,  62,   0,   0,   0,   0,   0,   0,  65,   0,   0,
   1228      0,   0,  49,  49,  66,  66,   0,   0,   0,   0,   0,   0,   0,  67,   0,   0,   0,   0,
   1229     49,  49,  68,  68,  44,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  69,  69,
   1230     70,  70,  62,   0,   0,   0,   0,   0,   0,   0,   0,   0,  71,   0,   0,   0,  72,  73,
   1231      0,   0,   0,   0,   0,   0,  74,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1232      0,   0,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,  75,
   1233      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1234      0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1235      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1236      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  76,  76,
   1237     76,  76,  76,  76,  76,  76,  76,  76,  76,  76,  76,  76,  76,  76,  76,  76,  76,  76,
   1238     76,  76,  76,  76,  76,  76,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1239      0,   0,   0,   0,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,
   1240     47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,
   1241     47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,  47,   0,   0,
   1242      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,  77,  78,
   1243     79,   0,   0,   3,   0,   3,   0,   3,   0,  80,  81,  82,  83,   0,   3,   0,   0,   3,
   1244      0,   0,   0,   0,   0,   0,   0,   0,  84,  84,   3,   0,   3,   0,   0,   0,   0,   0,
   1245      0,   0,   0,   3,   0,   3,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,
   1246      0,   0,   0,   0,   0,   0,   3,   0,   3,   0,   3,   0,   3,   0,   3,   0,   3,   0,
   1247      3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1248      0,   0,   3,   0,   3,   0,   3,   0,   3,   0,   3,   0,   3,   0,   3,   0,   3,   0,
   1249      3,   0,   3,   0,   3,   0,   3,   0,   3,   0,   3,   0,   0,   0,   0,   0,   0,   0,
   1250      3,   0,   3,   0,   3,   0,   3,   0,   3,   0,   3,   0,   3,   0,   0,   0,   3,   0,
   1251      3,   0,   3,   0,   3,   0,   3,   0,   3,   0,   3,   0,   3,   0,   3,   0,   3,   0,
   1252      3,   0,   3,   0,   3,   0,   3,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1253      0,   3,   0,   3,   0,  85,   3,   0,   3,   0,   3,   0,   3,   0,   3,   0,   0,   0,
   1254      0,   3,   0,  86,   0,   0,   3,   0,   3,   0,   0,   0,   3,   0,   3,   0,   3,   0,
   1255      3,   0,   3,   0,   3,   0,   3,   0,   3,   0,   3,   0,   3,   0,  87,  88,  89,  90,
   1256     87,   0,  91,  92,  93,  94,   3,   0,   3,   0,   3,   0,   3,   0,   3,   0,   3,   0,
   1257      3,   0,   3,   0,  41,  95,  96,   3,   0,   3,   0,  97,   3,   0,   3,   0,   3,   0,
   1258      3,   0,   3,   0,   3,   0,   3,   0,   3,   0,  98,   0,   0,   0,   0,   0,   0,   0,
   1259      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,
   1260      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1261      0,   0,   0,   0,   0,   0,   0,   0,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,
   1262     99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,
   1263     99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,  99,
   1264     99,  99,   0,   0,   0,   0,   0,   3,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1265      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   1266 };
   1267 
   1268 bool
   1269 js::unicode::IsIdentifierStartNonBMP(char32_t codePoint)
   1270 {
   1271    if (codePoint >= 0x10000 && codePoint <= 0x1000B) { // LINEAR B SYLLABLE B008 A .. LINEAR B SYLLABLE B046 JE
   1272        return true;
   1273    }
   1274    if (codePoint >= 0x1000D && codePoint <= 0x10026) { // LINEAR B SYLLABLE B036 JO .. LINEAR B SYLLABLE B032 QO
   1275        return true;
   1276    }
   1277    if (codePoint >= 0x10028 && codePoint <= 0x1003A) { // LINEAR B SYLLABLE B060 RA .. LINEAR B SYLLABLE B042 WO
   1278        return true;
   1279    }
   1280    if (codePoint >= 0x1003C && codePoint <= 0x1003D) { // LINEAR B SYLLABLE B017 ZA .. LINEAR B SYLLABLE B074 ZE
   1281        return true;
   1282    }
   1283    if (codePoint >= 0x1003F && codePoint <= 0x1004D) { // LINEAR B SYLLABLE B020 ZO .. LINEAR B SYLLABLE B091 TWO
   1284        return true;
   1285    }
   1286    if (codePoint >= 0x10050 && codePoint <= 0x1005D) { // LINEAR B SYMBOL B018 .. LINEAR B SYMBOL B089
   1287        return true;
   1288    }
   1289    if (codePoint >= 0x10080 && codePoint <= 0x100FA) { // LINEAR B IDEOGRAM B100 MAN .. LINEAR B IDEOGRAM VESSEL B305
   1290        return true;
   1291    }
   1292    if (codePoint >= 0x10140 && codePoint <= 0x10174) { // GREEK ACROPHONIC ATTIC ONE QUARTER .. GREEK ACROPHONIC STRATIAN FIFTY MNAS
   1293        return true;
   1294    }
   1295    if (codePoint >= 0x10280 && codePoint <= 0x1029C) { // LYCIAN LETTER A .. LYCIAN LETTER X
   1296        return true;
   1297    }
   1298    if (codePoint >= 0x102A0 && codePoint <= 0x102D0) { // CARIAN LETTER A .. CARIAN LETTER UUU3
   1299        return true;
   1300    }
   1301    if (codePoint >= 0x10300 && codePoint <= 0x1031F) { // OLD ITALIC LETTER A .. OLD ITALIC LETTER ESS
   1302        return true;
   1303    }
   1304    if (codePoint >= 0x1032D && codePoint <= 0x1034A) { // OLD ITALIC LETTER YE .. GOTHIC LETTER NINE HUNDRED
   1305        return true;
   1306    }
   1307    if (codePoint >= 0x10350 && codePoint <= 0x10375) { // OLD PERMIC LETTER AN .. OLD PERMIC LETTER IA
   1308        return true;
   1309    }
   1310    if (codePoint >= 0x10380 && codePoint <= 0x1039D) { // UGARITIC LETTER ALPA .. UGARITIC LETTER SSU
   1311        return true;
   1312    }
   1313    if (codePoint >= 0x103A0 && codePoint <= 0x103C3) { // OLD PERSIAN SIGN A .. OLD PERSIAN SIGN HA
   1314        return true;
   1315    }
   1316    if (codePoint >= 0x103C8 && codePoint <= 0x103CF) { // OLD PERSIAN SIGN AURAMAZDAA .. OLD PERSIAN SIGN BUUMISH
   1317        return true;
   1318    }
   1319    if (codePoint >= 0x103D1 && codePoint <= 0x103D5) { // OLD PERSIAN NUMBER ONE .. OLD PERSIAN NUMBER HUNDRED
   1320        return true;
   1321    }
   1322    if (codePoint >= 0x10400 && codePoint <= 0x1049D) { // DESERET CAPITAL LETTER LONG I .. OSMANYA LETTER OO
   1323        return true;
   1324    }
   1325    if (codePoint >= 0x104B0 && codePoint <= 0x104D3) { // OSAGE CAPITAL LETTER A .. OSAGE CAPITAL LETTER ZHA
   1326        return true;
   1327    }
   1328    if (codePoint >= 0x104D8 && codePoint <= 0x104FB) { // OSAGE SMALL LETTER A .. OSAGE SMALL LETTER ZHA
   1329        return true;
   1330    }
   1331    if (codePoint >= 0x10500 && codePoint <= 0x10527) { // ELBASAN LETTER A .. ELBASAN LETTER KHE
   1332        return true;
   1333    }
   1334    if (codePoint >= 0x10530 && codePoint <= 0x10563) { // CAUCASIAN ALBANIAN LETTER ALT .. CAUCASIAN ALBANIAN LETTER KIW
   1335        return true;
   1336    }
   1337    if (codePoint >= 0x10570 && codePoint <= 0x1057A) { // VITHKUQI CAPITAL LETTER A .. VITHKUQI CAPITAL LETTER GA
   1338        return true;
   1339    }
   1340    if (codePoint >= 0x1057C && codePoint <= 0x1058A) { // VITHKUQI CAPITAL LETTER HA .. VITHKUQI CAPITAL LETTER RE
   1341        return true;
   1342    }
   1343    if (codePoint >= 0x1058C && codePoint <= 0x10592) { // VITHKUQI CAPITAL LETTER SE .. VITHKUQI CAPITAL LETTER XE
   1344        return true;
   1345    }
   1346    if (codePoint >= 0x10594 && codePoint <= 0x10595) { // VITHKUQI CAPITAL LETTER Y .. VITHKUQI CAPITAL LETTER ZE
   1347        return true;
   1348    }
   1349    if (codePoint >= 0x10597 && codePoint <= 0x105A1) { // VITHKUQI SMALL LETTER A .. VITHKUQI SMALL LETTER GA
   1350        return true;
   1351    }
   1352    if (codePoint >= 0x105A3 && codePoint <= 0x105B1) { // VITHKUQI SMALL LETTER HA .. VITHKUQI SMALL LETTER RE
   1353        return true;
   1354    }
   1355    if (codePoint >= 0x105B3 && codePoint <= 0x105B9) { // VITHKUQI SMALL LETTER SE .. VITHKUQI SMALL LETTER XE
   1356        return true;
   1357    }
   1358    if (codePoint >= 0x105BB && codePoint <= 0x105BC) { // VITHKUQI SMALL LETTER Y .. VITHKUQI SMALL LETTER ZE
   1359        return true;
   1360    }
   1361    if (codePoint >= 0x105C0 && codePoint <= 0x105F3) { // TODHRI LETTER A .. TODHRI LETTER OO
   1362        return true;
   1363    }
   1364    if (codePoint >= 0x10600 && codePoint <= 0x10736) { // LINEAR A SIGN AB001 .. LINEAR A SIGN A664
   1365        return true;
   1366    }
   1367    if (codePoint >= 0x10740 && codePoint <= 0x10755) { // LINEAR A SIGN A701 A .. LINEAR A SIGN A732 JE
   1368        return true;
   1369    }
   1370    if (codePoint >= 0x10760 && codePoint <= 0x10767) { // LINEAR A SIGN A800 .. LINEAR A SIGN A807
   1371        return true;
   1372    }
   1373    if (codePoint >= 0x10780 && codePoint <= 0x10785) { // MODIFIER LETTER SMALL CAPITAL AA .. MODIFIER LETTER SMALL B WITH HOOK
   1374        return true;
   1375    }
   1376    if (codePoint >= 0x10787 && codePoint <= 0x107B0) { // MODIFIER LETTER SMALL DZ DIGRAPH .. MODIFIER LETTER SMALL V WITH RIGHT HOOK
   1377        return true;
   1378    }
   1379    if (codePoint >= 0x107B2 && codePoint <= 0x107BA) { // MODIFIER LETTER SMALL CAPITAL Y .. MODIFIER LETTER SMALL S WITH CURL
   1380        return true;
   1381    }
   1382    if (codePoint >= 0x10800 && codePoint <= 0x10805) { // CYPRIOT SYLLABLE A .. CYPRIOT SYLLABLE JA
   1383        return true;
   1384    }
   1385    if (codePoint >= 0x10808 && codePoint <= 0x10808) { // CYPRIOT SYLLABLE JO .. CYPRIOT SYLLABLE JO
   1386        return true;
   1387    }
   1388    if (codePoint >= 0x1080A && codePoint <= 0x10835) { // CYPRIOT SYLLABLE KA .. CYPRIOT SYLLABLE WO
   1389        return true;
   1390    }
   1391    if (codePoint >= 0x10837 && codePoint <= 0x10838) { // CYPRIOT SYLLABLE XA .. CYPRIOT SYLLABLE XE
   1392        return true;
   1393    }
   1394    if (codePoint >= 0x1083C && codePoint <= 0x1083C) { // CYPRIOT SYLLABLE ZA .. CYPRIOT SYLLABLE ZA
   1395        return true;
   1396    }
   1397    if (codePoint >= 0x1083F && codePoint <= 0x10855) { // CYPRIOT SYLLABLE ZO .. IMPERIAL ARAMAIC LETTER TAW
   1398        return true;
   1399    }
   1400    if (codePoint >= 0x10860 && codePoint <= 0x10876) { // PALMYRENE LETTER ALEPH .. PALMYRENE LETTER TAW
   1401        return true;
   1402    }
   1403    if (codePoint >= 0x10880 && codePoint <= 0x1089E) { // NABATAEAN LETTER FINAL ALEPH .. NABATAEAN LETTER TAW
   1404        return true;
   1405    }
   1406    if (codePoint >= 0x108E0 && codePoint <= 0x108F2) { // HATRAN LETTER ALEPH .. HATRAN LETTER QOPH
   1407        return true;
   1408    }
   1409    if (codePoint >= 0x108F4 && codePoint <= 0x108F5) { // HATRAN LETTER SHIN .. HATRAN LETTER TAW
   1410        return true;
   1411    }
   1412    if (codePoint >= 0x10900 && codePoint <= 0x10915) { // PHOENICIAN LETTER ALF .. PHOENICIAN LETTER TAU
   1413        return true;
   1414    }
   1415    if (codePoint >= 0x10920 && codePoint <= 0x10939) { // LYDIAN LETTER A .. LYDIAN LETTER C
   1416        return true;
   1417    }
   1418    if (codePoint >= 0x10940 && codePoint <= 0x10959) { // SIDETIC LETTER N01 .. SIDETIC LETTER N26
   1419        return true;
   1420    }
   1421    if (codePoint >= 0x10980 && codePoint <= 0x109B7) { // MEROITIC HIEROGLYPHIC LETTER A .. MEROITIC CURSIVE LETTER DA
   1422        return true;
   1423    }
   1424    if (codePoint >= 0x109BE && codePoint <= 0x109BF) { // MEROITIC CURSIVE LOGOGRAM RMT .. MEROITIC CURSIVE LOGOGRAM IMN
   1425        return true;
   1426    }
   1427    if (codePoint >= 0x10A00 && codePoint <= 0x10A00) { // KHAROSHTHI LETTER A .. KHAROSHTHI LETTER A
   1428        return true;
   1429    }
   1430    if (codePoint >= 0x10A10 && codePoint <= 0x10A13) { // KHAROSHTHI LETTER KA .. KHAROSHTHI LETTER GHA
   1431        return true;
   1432    }
   1433    if (codePoint >= 0x10A15 && codePoint <= 0x10A17) { // KHAROSHTHI LETTER CA .. KHAROSHTHI LETTER JA
   1434        return true;
   1435    }
   1436    if (codePoint >= 0x10A19 && codePoint <= 0x10A35) { // KHAROSHTHI LETTER NYA .. KHAROSHTHI LETTER VHA
   1437        return true;
   1438    }
   1439    if (codePoint >= 0x10A60 && codePoint <= 0x10A7C) { // OLD SOUTH ARABIAN LETTER HE .. OLD SOUTH ARABIAN LETTER THETH
   1440        return true;
   1441    }
   1442    if (codePoint >= 0x10A80 && codePoint <= 0x10A9C) { // OLD NORTH ARABIAN LETTER HEH .. OLD NORTH ARABIAN LETTER ZAH
   1443        return true;
   1444    }
   1445    if (codePoint >= 0x10AC0 && codePoint <= 0x10AC7) { // MANICHAEAN LETTER ALEPH .. MANICHAEAN LETTER WAW
   1446        return true;
   1447    }
   1448    if (codePoint >= 0x10AC9 && codePoint <= 0x10AE4) { // MANICHAEAN LETTER ZAYIN .. MANICHAEAN LETTER TAW
   1449        return true;
   1450    }
   1451    if (codePoint >= 0x10B00 && codePoint <= 0x10B35) { // AVESTAN LETTER A .. AVESTAN LETTER HE
   1452        return true;
   1453    }
   1454    if (codePoint >= 0x10B40 && codePoint <= 0x10B55) { // INSCRIPTIONAL PARTHIAN LETTER ALEPH .. INSCRIPTIONAL PARTHIAN LETTER TAW
   1455        return true;
   1456    }
   1457    if (codePoint >= 0x10B60 && codePoint <= 0x10B72) { // INSCRIPTIONAL PAHLAVI LETTER ALEPH .. INSCRIPTIONAL PAHLAVI LETTER TAW
   1458        return true;
   1459    }
   1460    if (codePoint >= 0x10B80 && codePoint <= 0x10B91) { // PSALTER PAHLAVI LETTER ALEPH .. PSALTER PAHLAVI LETTER TAW
   1461        return true;
   1462    }
   1463    if (codePoint >= 0x10C00 && codePoint <= 0x10C48) { // OLD TURKIC LETTER ORKHON A .. OLD TURKIC LETTER ORKHON BASH
   1464        return true;
   1465    }
   1466    if (codePoint >= 0x10C80 && codePoint <= 0x10CB2) { // OLD HUNGARIAN CAPITAL LETTER A .. OLD HUNGARIAN CAPITAL LETTER US
   1467        return true;
   1468    }
   1469    if (codePoint >= 0x10CC0 && codePoint <= 0x10CF2) { // OLD HUNGARIAN SMALL LETTER A .. OLD HUNGARIAN SMALL LETTER US
   1470        return true;
   1471    }
   1472    if (codePoint >= 0x10D00 && codePoint <= 0x10D23) { // HANIFI ROHINGYA LETTER A .. HANIFI ROHINGYA MARK NA KHONNA
   1473        return true;
   1474    }
   1475    if (codePoint >= 0x10D4A && codePoint <= 0x10D65) { // GARAY VOWEL SIGN A .. GARAY CAPITAL LETTER OLD NA
   1476        return true;
   1477    }
   1478    if (codePoint >= 0x10D6F && codePoint <= 0x10D85) { // GARAY REDUPLICATION MARK .. GARAY SMALL LETTER OLD NA
   1479        return true;
   1480    }
   1481    if (codePoint >= 0x10E80 && codePoint <= 0x10EA9) { // YEZIDI LETTER ELIF .. YEZIDI LETTER ET
   1482        return true;
   1483    }
   1484    if (codePoint >= 0x10EB0 && codePoint <= 0x10EB1) { // YEZIDI LETTER LAM WITH DOT ABOVE .. YEZIDI LETTER YOT WITH CIRCUMFLEX ABOVE
   1485        return true;
   1486    }
   1487    if (codePoint >= 0x10EC2 && codePoint <= 0x10EC7) { // ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW .. ARABIC LETTER YEH WITH FOUR DOTS BELOW
   1488        return true;
   1489    }
   1490    if (codePoint >= 0x10F00 && codePoint <= 0x10F1C) { // OLD SOGDIAN LETTER ALEPH .. OLD SOGDIAN LETTER FINAL TAW WITH VERTICAL TAIL
   1491        return true;
   1492    }
   1493    if (codePoint >= 0x10F27 && codePoint <= 0x10F27) { // OLD SOGDIAN LIGATURE AYIN-DALETH .. OLD SOGDIAN LIGATURE AYIN-DALETH
   1494        return true;
   1495    }
   1496    if (codePoint >= 0x10F30 && codePoint <= 0x10F45) { // SOGDIAN LETTER ALEPH .. SOGDIAN INDEPENDENT SHIN
   1497        return true;
   1498    }
   1499    if (codePoint >= 0x10F70 && codePoint <= 0x10F81) { // OLD UYGHUR LETTER ALEPH .. OLD UYGHUR LETTER LESH
   1500        return true;
   1501    }
   1502    if (codePoint >= 0x10FB0 && codePoint <= 0x10FC4) { // CHORASMIAN LETTER ALEPH .. CHORASMIAN LETTER TAW
   1503        return true;
   1504    }
   1505    if (codePoint >= 0x10FE0 && codePoint <= 0x10FF6) { // ELYMAIC LETTER ALEPH .. ELYMAIC LIGATURE ZAYIN-YODH
   1506        return true;
   1507    }
   1508    if (codePoint >= 0x11003 && codePoint <= 0x11037) { // BRAHMI SIGN JIHVAMULIYA .. BRAHMI LETTER OLD TAMIL NNNA
   1509        return true;
   1510    }
   1511    if (codePoint >= 0x11071 && codePoint <= 0x11072) { // BRAHMI LETTER OLD TAMIL SHORT E .. BRAHMI LETTER OLD TAMIL SHORT O
   1512        return true;
   1513    }
   1514    if (codePoint >= 0x11075 && codePoint <= 0x11075) { // BRAHMI LETTER OLD TAMIL LLA .. BRAHMI LETTER OLD TAMIL LLA
   1515        return true;
   1516    }
   1517    if (codePoint >= 0x11083 && codePoint <= 0x110AF) { // KAITHI LETTER A .. KAITHI LETTER HA
   1518        return true;
   1519    }
   1520    if (codePoint >= 0x110D0 && codePoint <= 0x110E8) { // SORA SOMPENG LETTER SAH .. SORA SOMPENG LETTER MAE
   1521        return true;
   1522    }
   1523    if (codePoint >= 0x11103 && codePoint <= 0x11126) { // CHAKMA LETTER AA .. CHAKMA LETTER HAA
   1524        return true;
   1525    }
   1526    if (codePoint >= 0x11144 && codePoint <= 0x11144) { // CHAKMA LETTER LHAA .. CHAKMA LETTER LHAA
   1527        return true;
   1528    }
   1529    if (codePoint >= 0x11147 && codePoint <= 0x11147) { // CHAKMA LETTER VAA .. CHAKMA LETTER VAA
   1530        return true;
   1531    }
   1532    if (codePoint >= 0x11150 && codePoint <= 0x11172) { // MAHAJANI LETTER A .. MAHAJANI LETTER RRA
   1533        return true;
   1534    }
   1535    if (codePoint >= 0x11176 && codePoint <= 0x11176) { // MAHAJANI LIGATURE SHRI .. MAHAJANI LIGATURE SHRI
   1536        return true;
   1537    }
   1538    if (codePoint >= 0x11183 && codePoint <= 0x111B2) { // SHARADA LETTER A .. SHARADA LETTER HA
   1539        return true;
   1540    }
   1541    if (codePoint >= 0x111C1 && codePoint <= 0x111C4) { // SHARADA SIGN AVAGRAHA .. SHARADA OM
   1542        return true;
   1543    }
   1544    if (codePoint >= 0x111DA && codePoint <= 0x111DA) { // SHARADA EKAM .. SHARADA EKAM
   1545        return true;
   1546    }
   1547    if (codePoint >= 0x111DC && codePoint <= 0x111DC) { // SHARADA HEADSTROKE .. SHARADA HEADSTROKE
   1548        return true;
   1549    }
   1550    if (codePoint >= 0x11200 && codePoint <= 0x11211) { // KHOJKI LETTER A .. KHOJKI LETTER JJA
   1551        return true;
   1552    }
   1553    if (codePoint >= 0x11213 && codePoint <= 0x1122B) { // KHOJKI LETTER NYA .. KHOJKI LETTER LLA
   1554        return true;
   1555    }
   1556    if (codePoint >= 0x1123F && codePoint <= 0x11240) { // KHOJKI LETTER QA .. KHOJKI LETTER SHORT I
   1557        return true;
   1558    }
   1559    if (codePoint >= 0x11280 && codePoint <= 0x11286) { // MULTANI LETTER A .. MULTANI LETTER GA
   1560        return true;
   1561    }
   1562    if (codePoint >= 0x11288 && codePoint <= 0x11288) { // MULTANI LETTER GHA .. MULTANI LETTER GHA
   1563        return true;
   1564    }
   1565    if (codePoint >= 0x1128A && codePoint <= 0x1128D) { // MULTANI LETTER CA .. MULTANI LETTER JJA
   1566        return true;
   1567    }
   1568    if (codePoint >= 0x1128F && codePoint <= 0x1129D) { // MULTANI LETTER NYA .. MULTANI LETTER BA
   1569        return true;
   1570    }
   1571    if (codePoint >= 0x1129F && codePoint <= 0x112A8) { // MULTANI LETTER BHA .. MULTANI LETTER RHA
   1572        return true;
   1573    }
   1574    if (codePoint >= 0x112B0 && codePoint <= 0x112DE) { // KHUDAWADI LETTER A .. KHUDAWADI LETTER HA
   1575        return true;
   1576    }
   1577    if (codePoint >= 0x11305 && codePoint <= 0x1130C) { // GRANTHA LETTER A .. GRANTHA LETTER VOCALIC L
   1578        return true;
   1579    }
   1580    if (codePoint >= 0x1130F && codePoint <= 0x11310) { // GRANTHA LETTER EE .. GRANTHA LETTER AI
   1581        return true;
   1582    }
   1583    if (codePoint >= 0x11313 && codePoint <= 0x11328) { // GRANTHA LETTER OO .. GRANTHA LETTER NA
   1584        return true;
   1585    }
   1586    if (codePoint >= 0x1132A && codePoint <= 0x11330) { // GRANTHA LETTER PA .. GRANTHA LETTER RA
   1587        return true;
   1588    }
   1589    if (codePoint >= 0x11332 && codePoint <= 0x11333) { // GRANTHA LETTER LA .. GRANTHA LETTER LLA
   1590        return true;
   1591    }
   1592    if (codePoint >= 0x11335 && codePoint <= 0x11339) { // GRANTHA LETTER VA .. GRANTHA LETTER HA
   1593        return true;
   1594    }
   1595    if (codePoint >= 0x1133D && codePoint <= 0x1133D) { // GRANTHA SIGN AVAGRAHA .. GRANTHA SIGN AVAGRAHA
   1596        return true;
   1597    }
   1598    if (codePoint >= 0x11350 && codePoint <= 0x11350) { // GRANTHA OM .. GRANTHA OM
   1599        return true;
   1600    }
   1601    if (codePoint >= 0x1135D && codePoint <= 0x11361) { // GRANTHA SIGN PLUTA .. GRANTHA LETTER VOCALIC LL
   1602        return true;
   1603    }
   1604    if (codePoint >= 0x11380 && codePoint <= 0x11389) { // TULU-TIGALARI LETTER A .. TULU-TIGALARI LETTER VOCALIC LL
   1605        return true;
   1606    }
   1607    if (codePoint >= 0x1138B && codePoint <= 0x1138B) { // TULU-TIGALARI LETTER EE .. TULU-TIGALARI LETTER EE
   1608        return true;
   1609    }
   1610    if (codePoint >= 0x1138E && codePoint <= 0x1138E) { // TULU-TIGALARI LETTER AI .. TULU-TIGALARI LETTER AI
   1611        return true;
   1612    }
   1613    if (codePoint >= 0x11390 && codePoint <= 0x113B5) { // TULU-TIGALARI LETTER OO .. TULU-TIGALARI LETTER LLLA
   1614        return true;
   1615    }
   1616    if (codePoint >= 0x113B7 && codePoint <= 0x113B7) { // TULU-TIGALARI SIGN AVAGRAHA .. TULU-TIGALARI SIGN AVAGRAHA
   1617        return true;
   1618    }
   1619    if (codePoint >= 0x113D1 && codePoint <= 0x113D1) { // TULU-TIGALARI REPHA .. TULU-TIGALARI REPHA
   1620        return true;
   1621    }
   1622    if (codePoint >= 0x113D3 && codePoint <= 0x113D3) { // TULU-TIGALARI SIGN PLUTA .. TULU-TIGALARI SIGN PLUTA
   1623        return true;
   1624    }
   1625    if (codePoint >= 0x11400 && codePoint <= 0x11434) { // NEWA LETTER A .. NEWA LETTER HA
   1626        return true;
   1627    }
   1628    if (codePoint >= 0x11447 && codePoint <= 0x1144A) { // NEWA SIGN AVAGRAHA .. NEWA SIDDHI
   1629        return true;
   1630    }
   1631    if (codePoint >= 0x1145F && codePoint <= 0x11461) { // NEWA LETTER VEDIC ANUSVARA .. NEWA SIGN UPADHMANIYA
   1632        return true;
   1633    }
   1634    if (codePoint >= 0x11480 && codePoint <= 0x114AF) { // TIRHUTA ANJI .. TIRHUTA LETTER HA
   1635        return true;
   1636    }
   1637    if (codePoint >= 0x114C4 && codePoint <= 0x114C5) { // TIRHUTA SIGN AVAGRAHA .. TIRHUTA GVANG
   1638        return true;
   1639    }
   1640    if (codePoint >= 0x114C7 && codePoint <= 0x114C7) { // TIRHUTA OM .. TIRHUTA OM
   1641        return true;
   1642    }
   1643    if (codePoint >= 0x11580 && codePoint <= 0x115AE) { // SIDDHAM LETTER A .. SIDDHAM LETTER HA
   1644        return true;
   1645    }
   1646    if (codePoint >= 0x115D8 && codePoint <= 0x115DB) { // SIDDHAM LETTER THREE-CIRCLE ALTERNATE I .. SIDDHAM LETTER ALTERNATE U
   1647        return true;
   1648    }
   1649    if (codePoint >= 0x11600 && codePoint <= 0x1162F) { // MODI LETTER A .. MODI LETTER LLA
   1650        return true;
   1651    }
   1652    if (codePoint >= 0x11644 && codePoint <= 0x11644) { // MODI SIGN HUVA .. MODI SIGN HUVA
   1653        return true;
   1654    }
   1655    if (codePoint >= 0x11680 && codePoint <= 0x116AA) { // TAKRI LETTER A .. TAKRI LETTER RRA
   1656        return true;
   1657    }
   1658    if (codePoint >= 0x116B8 && codePoint <= 0x116B8) { // TAKRI LETTER ARCHAIC KHA .. TAKRI LETTER ARCHAIC KHA
   1659        return true;
   1660    }
   1661    if (codePoint >= 0x11700 && codePoint <= 0x1171A) { // AHOM LETTER KA .. AHOM LETTER ALTERNATE BA
   1662        return true;
   1663    }
   1664    if (codePoint >= 0x11740 && codePoint <= 0x11746) { // AHOM LETTER CA .. AHOM LETTER LLA
   1665        return true;
   1666    }
   1667    if (codePoint >= 0x11800 && codePoint <= 0x1182B) { // DOGRA LETTER A .. DOGRA LETTER RRA
   1668        return true;
   1669    }
   1670    if (codePoint >= 0x118A0 && codePoint <= 0x118DF) { // WARANG CITI CAPITAL LETTER NGAA .. WARANG CITI SMALL LETTER VIYO
   1671        return true;
   1672    }
   1673    if (codePoint >= 0x118FF && codePoint <= 0x11906) { // WARANG CITI OM .. DIVES AKURU LETTER E
   1674        return true;
   1675    }
   1676    if (codePoint >= 0x11909 && codePoint <= 0x11909) { // DIVES AKURU LETTER O .. DIVES AKURU LETTER O
   1677        return true;
   1678    }
   1679    if (codePoint >= 0x1190C && codePoint <= 0x11913) { // DIVES AKURU LETTER KA .. DIVES AKURU LETTER JA
   1680        return true;
   1681    }
   1682    if (codePoint >= 0x11915 && codePoint <= 0x11916) { // DIVES AKURU LETTER NYA .. DIVES AKURU LETTER TTA
   1683        return true;
   1684    }
   1685    if (codePoint >= 0x11918 && codePoint <= 0x1192F) { // DIVES AKURU LETTER DDA .. DIVES AKURU LETTER ZA
   1686        return true;
   1687    }
   1688    if (codePoint >= 0x1193F && codePoint <= 0x1193F) { // DIVES AKURU PREFIXED NASAL SIGN .. DIVES AKURU PREFIXED NASAL SIGN
   1689        return true;
   1690    }
   1691    if (codePoint >= 0x11941 && codePoint <= 0x11941) { // DIVES AKURU INITIAL RA .. DIVES AKURU INITIAL RA
   1692        return true;
   1693    }
   1694    if (codePoint >= 0x119A0 && codePoint <= 0x119A7) { // NANDINAGARI LETTER A .. NANDINAGARI LETTER VOCALIC RR
   1695        return true;
   1696    }
   1697    if (codePoint >= 0x119AA && codePoint <= 0x119D0) { // NANDINAGARI LETTER E .. NANDINAGARI LETTER RRA
   1698        return true;
   1699    }
   1700    if (codePoint >= 0x119E1 && codePoint <= 0x119E1) { // NANDINAGARI SIGN AVAGRAHA .. NANDINAGARI SIGN AVAGRAHA
   1701        return true;
   1702    }
   1703    if (codePoint >= 0x119E3 && codePoint <= 0x119E3) { // NANDINAGARI HEADSTROKE .. NANDINAGARI HEADSTROKE
   1704        return true;
   1705    }
   1706    if (codePoint >= 0x11A00 && codePoint <= 0x11A00) { // ZANABAZAR SQUARE LETTER A .. ZANABAZAR SQUARE LETTER A
   1707        return true;
   1708    }
   1709    if (codePoint >= 0x11A0B && codePoint <= 0x11A32) { // ZANABAZAR SQUARE LETTER KA .. ZANABAZAR SQUARE LETTER KSSA
   1710        return true;
   1711    }
   1712    if (codePoint >= 0x11A3A && codePoint <= 0x11A3A) { // ZANABAZAR SQUARE CLUSTER-INITIAL LETTER RA .. ZANABAZAR SQUARE CLUSTER-INITIAL LETTER RA
   1713        return true;
   1714    }
   1715    if (codePoint >= 0x11A50 && codePoint <= 0x11A50) { // SOYOMBO LETTER A .. SOYOMBO LETTER A
   1716        return true;
   1717    }
   1718    if (codePoint >= 0x11A5C && codePoint <= 0x11A89) { // SOYOMBO LETTER KA .. SOYOMBO CLUSTER-INITIAL LETTER SA
   1719        return true;
   1720    }
   1721    if (codePoint >= 0x11A9D && codePoint <= 0x11A9D) { // SOYOMBO MARK PLUTA .. SOYOMBO MARK PLUTA
   1722        return true;
   1723    }
   1724    if (codePoint >= 0x11AB0 && codePoint <= 0x11AF8) { // CANADIAN SYLLABICS NATTILIK HI .. PAU CIN HAU GLOTTAL STOP FINAL
   1725        return true;
   1726    }
   1727    if (codePoint >= 0x11BC0 && codePoint <= 0x11BE0) { // SUNUWAR LETTER DEVI .. SUNUWAR LETTER KLOKO
   1728        return true;
   1729    }
   1730    if (codePoint >= 0x11C00 && codePoint <= 0x11C08) { // BHAIKSUKI LETTER A .. BHAIKSUKI LETTER VOCALIC L
   1731        return true;
   1732    }
   1733    if (codePoint >= 0x11C0A && codePoint <= 0x11C2E) { // BHAIKSUKI LETTER E .. BHAIKSUKI LETTER HA
   1734        return true;
   1735    }
   1736    if (codePoint >= 0x11C40 && codePoint <= 0x11C40) { // BHAIKSUKI SIGN AVAGRAHA .. BHAIKSUKI SIGN AVAGRAHA
   1737        return true;
   1738    }
   1739    if (codePoint >= 0x11C72 && codePoint <= 0x11C8F) { // MARCHEN LETTER KA .. MARCHEN LETTER A
   1740        return true;
   1741    }
   1742    if (codePoint >= 0x11D00 && codePoint <= 0x11D06) { // MASARAM GONDI LETTER A .. MASARAM GONDI LETTER E
   1743        return true;
   1744    }
   1745    if (codePoint >= 0x11D08 && codePoint <= 0x11D09) { // MASARAM GONDI LETTER AI .. MASARAM GONDI LETTER O
   1746        return true;
   1747    }
   1748    if (codePoint >= 0x11D0B && codePoint <= 0x11D30) { // MASARAM GONDI LETTER AU .. MASARAM GONDI LETTER TRA
   1749        return true;
   1750    }
   1751    if (codePoint >= 0x11D46 && codePoint <= 0x11D46) { // MASARAM GONDI REPHA .. MASARAM GONDI REPHA
   1752        return true;
   1753    }
   1754    if (codePoint >= 0x11D60 && codePoint <= 0x11D65) { // GUNJALA GONDI LETTER A .. GUNJALA GONDI LETTER UU
   1755        return true;
   1756    }
   1757    if (codePoint >= 0x11D67 && codePoint <= 0x11D68) { // GUNJALA GONDI LETTER EE .. GUNJALA GONDI LETTER AI
   1758        return true;
   1759    }
   1760    if (codePoint >= 0x11D6A && codePoint <= 0x11D89) { // GUNJALA GONDI LETTER OO .. GUNJALA GONDI LETTER SA
   1761        return true;
   1762    }
   1763    if (codePoint >= 0x11D98 && codePoint <= 0x11D98) { // GUNJALA GONDI OM .. GUNJALA GONDI OM
   1764        return true;
   1765    }
   1766    if (codePoint >= 0x11DB0 && codePoint <= 0x11DDB) { // TOLONG SIKI LETTER I .. TOLONG SIKI UNGGA
   1767        return true;
   1768    }
   1769    if (codePoint >= 0x11EE0 && codePoint <= 0x11EF2) { // MAKASAR LETTER KA .. MAKASAR ANGKA
   1770        return true;
   1771    }
   1772    if (codePoint >= 0x11F02 && codePoint <= 0x11F02) { // KAWI SIGN REPHA .. KAWI SIGN REPHA
   1773        return true;
   1774    }
   1775    if (codePoint >= 0x11F04 && codePoint <= 0x11F10) { // KAWI LETTER A .. KAWI LETTER O
   1776        return true;
   1777    }
   1778    if (codePoint >= 0x11F12 && codePoint <= 0x11F33) { // KAWI LETTER KA .. KAWI LETTER JNYA
   1779        return true;
   1780    }
   1781    if (codePoint >= 0x11FB0 && codePoint <= 0x11FB0) { // LISU LETTER YHA .. LISU LETTER YHA
   1782        return true;
   1783    }
   1784    if (codePoint >= 0x12000 && codePoint <= 0x12399) { // CUNEIFORM SIGN A .. CUNEIFORM SIGN U U
   1785        return true;
   1786    }
   1787    if (codePoint >= 0x12400 && codePoint <= 0x1246E) { // CUNEIFORM NUMERIC SIGN TWO ASH .. CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM
   1788        return true;
   1789    }
   1790    if (codePoint >= 0x12480 && codePoint <= 0x12543) { // CUNEIFORM SIGN AB TIMES NUN TENU .. CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU
   1791        return true;
   1792    }
   1793    if (codePoint >= 0x12F90 && codePoint <= 0x12FF0) { // CYPRO-MINOAN SIGN CM001 .. CYPRO-MINOAN SIGN CM114
   1794        return true;
   1795    }
   1796    if (codePoint >= 0x13000 && codePoint <= 0x1342F) { // EGYPTIAN HIEROGLYPH A001 .. EGYPTIAN HIEROGLYPH V011D
   1797        return true;
   1798    }
   1799    if (codePoint >= 0x13441 && codePoint <= 0x13446) { // EGYPTIAN HIEROGLYPH FULL BLANK .. EGYPTIAN HIEROGLYPH WIDE LOST SIGN
   1800        return true;
   1801    }
   1802    if (codePoint >= 0x13460 && codePoint <= 0x143FA) { // EGYPTIAN HIEROGLYPH-13460 .. EGYPTIAN HIEROGLYPH-143FA
   1803        return true;
   1804    }
   1805    if (codePoint >= 0x14400 && codePoint <= 0x14646) { // ANATOLIAN HIEROGLYPH A001 .. ANATOLIAN HIEROGLYPH A530
   1806        return true;
   1807    }
   1808    if (codePoint >= 0x16100 && codePoint <= 0x1611D) { // GURUNG KHEMA LETTER A .. GURUNG KHEMA LETTER SA
   1809        return true;
   1810    }
   1811    if (codePoint >= 0x16800 && codePoint <= 0x16A38) { // BAMUM LETTER PHASE-A NGKUE MFON .. BAMUM LETTER PHASE-F VUEQ
   1812        return true;
   1813    }
   1814    if (codePoint >= 0x16A40 && codePoint <= 0x16A5E) { // MRO LETTER TA .. MRO LETTER TEK
   1815        return true;
   1816    }
   1817    if (codePoint >= 0x16A70 && codePoint <= 0x16ABE) { // TANGSA LETTER OZ .. TANGSA LETTER ZA
   1818        return true;
   1819    }
   1820    if (codePoint >= 0x16AD0 && codePoint <= 0x16AED) { // BASSA VAH LETTER ENNI .. BASSA VAH LETTER I
   1821        return true;
   1822    }
   1823    if (codePoint >= 0x16B00 && codePoint <= 0x16B2F) { // PAHAWH HMONG VOWEL KEEB .. PAHAWH HMONG CONSONANT CAU
   1824        return true;
   1825    }
   1826    if (codePoint >= 0x16B40 && codePoint <= 0x16B43) { // PAHAWH HMONG SIGN VOS SEEV .. PAHAWH HMONG SIGN IB YAM
   1827        return true;
   1828    }
   1829    if (codePoint >= 0x16B63 && codePoint <= 0x16B77) { // PAHAWH HMONG SIGN VOS LUB .. PAHAWH HMONG SIGN CIM NRES TOS
   1830        return true;
   1831    }
   1832    if (codePoint >= 0x16B7D && codePoint <= 0x16B8F) { // PAHAWH HMONG CLAN SIGN TSHEEJ .. PAHAWH HMONG CLAN SIGN VWJ
   1833        return true;
   1834    }
   1835    if (codePoint >= 0x16D40 && codePoint <= 0x16D6C) { // KIRAT RAI SIGN ANUSVARA .. KIRAT RAI SIGN SAAT
   1836        return true;
   1837    }
   1838    if (codePoint >= 0x16E40 && codePoint <= 0x16E7F) { // MEDEFAIDRIN CAPITAL LETTER M .. MEDEFAIDRIN SMALL LETTER Y
   1839        return true;
   1840    }
   1841    if (codePoint >= 0x16EA0 && codePoint <= 0x16EB8) { // BERIA ERFE CAPITAL LETTER ARKAB .. BERIA ERFE CAPITAL LETTER AY
   1842        return true;
   1843    }
   1844    if (codePoint >= 0x16EBB && codePoint <= 0x16ED3) { // BERIA ERFE SMALL LETTER ARKAB .. BERIA ERFE SMALL LETTER AY
   1845        return true;
   1846    }
   1847    if (codePoint >= 0x16F00 && codePoint <= 0x16F4A) { // MIAO LETTER PA .. MIAO LETTER RTE
   1848        return true;
   1849    }
   1850    if (codePoint >= 0x16F50 && codePoint <= 0x16F50) { // MIAO LETTER NASALIZATION .. MIAO LETTER NASALIZATION
   1851        return true;
   1852    }
   1853    if (codePoint >= 0x16F93 && codePoint <= 0x16F9F) { // MIAO LETTER TONE-2 .. MIAO LETTER REFORMED TONE-8
   1854        return true;
   1855    }
   1856    if (codePoint >= 0x16FE0 && codePoint <= 0x16FE1) { // TANGUT ITERATION MARK .. NUSHU ITERATION MARK
   1857        return true;
   1858    }
   1859    if (codePoint >= 0x16FE3 && codePoint <= 0x16FE3) { // OLD CHINESE ITERATION MARK .. OLD CHINESE ITERATION MARK
   1860        return true;
   1861    }
   1862    if (codePoint >= 0x16FF2 && codePoint <= 0x16FF6) { // CHINESE SMALL SIMPLIFIED ER .. YANGQIN SIGN SLOW TWO BEATS
   1863        return true;
   1864    }
   1865    if (codePoint >= 0x17000 && codePoint <= 0x18CD5) { // Tangut Ideograph .. KHITAN SMALL SCRIPT CHARACTER-18CD5
   1866        return true;
   1867    }
   1868    if (codePoint >= 0x18CFF && codePoint <= 0x18D1E) { // KHITAN SMALL SCRIPT CHARACTER-18CFF .. Tangut Ideograph Supplement
   1869        return true;
   1870    }
   1871    if (codePoint >= 0x18D80 && codePoint <= 0x18DF2) { // TANGUT COMPONENT-769 .. TANGUT COMPONENT-883
   1872        return true;
   1873    }
   1874    if (codePoint >= 0x1AFF0 && codePoint <= 0x1AFF3) { // KATAKANA LETTER MINNAN TONE-2 .. KATAKANA LETTER MINNAN TONE-5
   1875        return true;
   1876    }
   1877    if (codePoint >= 0x1AFF5 && codePoint <= 0x1AFFB) { // KATAKANA LETTER MINNAN TONE-7 .. KATAKANA LETTER MINNAN NASALIZED TONE-5
   1878        return true;
   1879    }
   1880    if (codePoint >= 0x1AFFD && codePoint <= 0x1AFFE) { // KATAKANA LETTER MINNAN NASALIZED TONE-7 .. KATAKANA LETTER MINNAN NASALIZED TONE-8
   1881        return true;
   1882    }
   1883    if (codePoint >= 0x1B000 && codePoint <= 0x1B122) { // KATAKANA LETTER ARCHAIC E .. KATAKANA LETTER ARCHAIC WU
   1884        return true;
   1885    }
   1886    if (codePoint >= 0x1B132 && codePoint <= 0x1B132) { // HIRAGANA LETTER SMALL KO .. HIRAGANA LETTER SMALL KO
   1887        return true;
   1888    }
   1889    if (codePoint >= 0x1B150 && codePoint <= 0x1B152) { // HIRAGANA LETTER SMALL WI .. HIRAGANA LETTER SMALL WO
   1890        return true;
   1891    }
   1892    if (codePoint >= 0x1B155 && codePoint <= 0x1B155) { // KATAKANA LETTER SMALL KO .. KATAKANA LETTER SMALL KO
   1893        return true;
   1894    }
   1895    if (codePoint >= 0x1B164 && codePoint <= 0x1B167) { // KATAKANA LETTER SMALL WI .. KATAKANA LETTER SMALL N
   1896        return true;
   1897    }
   1898    if (codePoint >= 0x1B170 && codePoint <= 0x1B2FB) { // NUSHU CHARACTER-1B170 .. NUSHU CHARACTER-1B2FB
   1899        return true;
   1900    }
   1901    if (codePoint >= 0x1BC00 && codePoint <= 0x1BC6A) { // DUPLOYAN LETTER H .. DUPLOYAN LETTER VOCALIC M
   1902        return true;
   1903    }
   1904    if (codePoint >= 0x1BC70 && codePoint <= 0x1BC7C) { // DUPLOYAN AFFIX LEFT HORIZONTAL SECANT .. DUPLOYAN AFFIX ATTACHED TANGENT HOOK
   1905        return true;
   1906    }
   1907    if (codePoint >= 0x1BC80 && codePoint <= 0x1BC88) { // DUPLOYAN AFFIX HIGH ACUTE .. DUPLOYAN AFFIX HIGH VERTICAL
   1908        return true;
   1909    }
   1910    if (codePoint >= 0x1BC90 && codePoint <= 0x1BC99) { // DUPLOYAN AFFIX LOW ACUTE .. DUPLOYAN AFFIX LOW ARROW
   1911        return true;
   1912    }
   1913    if (codePoint >= 0x1D400 && codePoint <= 0x1D454) { // MATHEMATICAL BOLD CAPITAL A .. MATHEMATICAL ITALIC SMALL G
   1914        return true;
   1915    }
   1916    if (codePoint >= 0x1D456 && codePoint <= 0x1D49C) { // MATHEMATICAL ITALIC SMALL I .. MATHEMATICAL SCRIPT CAPITAL A
   1917        return true;
   1918    }
   1919    if (codePoint >= 0x1D49E && codePoint <= 0x1D49F) { // MATHEMATICAL SCRIPT CAPITAL C .. MATHEMATICAL SCRIPT CAPITAL D
   1920        return true;
   1921    }
   1922    if (codePoint >= 0x1D4A2 && codePoint <= 0x1D4A2) { // MATHEMATICAL SCRIPT CAPITAL G .. MATHEMATICAL SCRIPT CAPITAL G
   1923        return true;
   1924    }
   1925    if (codePoint >= 0x1D4A5 && codePoint <= 0x1D4A6) { // MATHEMATICAL SCRIPT CAPITAL J .. MATHEMATICAL SCRIPT CAPITAL K
   1926        return true;
   1927    }
   1928    if (codePoint >= 0x1D4A9 && codePoint <= 0x1D4AC) { // MATHEMATICAL SCRIPT CAPITAL N .. MATHEMATICAL SCRIPT CAPITAL Q
   1929        return true;
   1930    }
   1931    if (codePoint >= 0x1D4AE && codePoint <= 0x1D4B9) { // MATHEMATICAL SCRIPT CAPITAL S .. MATHEMATICAL SCRIPT SMALL D
   1932        return true;
   1933    }
   1934    if (codePoint >= 0x1D4BB && codePoint <= 0x1D4BB) { // MATHEMATICAL SCRIPT SMALL F .. MATHEMATICAL SCRIPT SMALL F
   1935        return true;
   1936    }
   1937    if (codePoint >= 0x1D4BD && codePoint <= 0x1D4C3) { // MATHEMATICAL SCRIPT SMALL H .. MATHEMATICAL SCRIPT SMALL N
   1938        return true;
   1939    }
   1940    if (codePoint >= 0x1D4C5 && codePoint <= 0x1D505) { // MATHEMATICAL SCRIPT SMALL P .. MATHEMATICAL FRAKTUR CAPITAL B
   1941        return true;
   1942    }
   1943    if (codePoint >= 0x1D507 && codePoint <= 0x1D50A) { // MATHEMATICAL FRAKTUR CAPITAL D .. MATHEMATICAL FRAKTUR CAPITAL G
   1944        return true;
   1945    }
   1946    if (codePoint >= 0x1D50D && codePoint <= 0x1D514) { // MATHEMATICAL FRAKTUR CAPITAL J .. MATHEMATICAL FRAKTUR CAPITAL Q
   1947        return true;
   1948    }
   1949    if (codePoint >= 0x1D516 && codePoint <= 0x1D51C) { // MATHEMATICAL FRAKTUR CAPITAL S .. MATHEMATICAL FRAKTUR CAPITAL Y
   1950        return true;
   1951    }
   1952    if (codePoint >= 0x1D51E && codePoint <= 0x1D539) { // MATHEMATICAL FRAKTUR SMALL A .. MATHEMATICAL DOUBLE-STRUCK CAPITAL B
   1953        return true;
   1954    }
   1955    if (codePoint >= 0x1D53B && codePoint <= 0x1D53E) { // MATHEMATICAL DOUBLE-STRUCK CAPITAL D .. MATHEMATICAL DOUBLE-STRUCK CAPITAL G
   1956        return true;
   1957    }
   1958    if (codePoint >= 0x1D540 && codePoint <= 0x1D544) { // MATHEMATICAL DOUBLE-STRUCK CAPITAL I .. MATHEMATICAL DOUBLE-STRUCK CAPITAL M
   1959        return true;
   1960    }
   1961    if (codePoint >= 0x1D546 && codePoint <= 0x1D546) { // MATHEMATICAL DOUBLE-STRUCK CAPITAL O .. MATHEMATICAL DOUBLE-STRUCK CAPITAL O
   1962        return true;
   1963    }
   1964    if (codePoint >= 0x1D54A && codePoint <= 0x1D550) { // MATHEMATICAL DOUBLE-STRUCK CAPITAL S .. MATHEMATICAL DOUBLE-STRUCK CAPITAL Y
   1965        return true;
   1966    }
   1967    if (codePoint >= 0x1D552 && codePoint <= 0x1D6A5) { // MATHEMATICAL DOUBLE-STRUCK SMALL A .. MATHEMATICAL ITALIC SMALL DOTLESS J
   1968        return true;
   1969    }
   1970    if (codePoint >= 0x1D6A8 && codePoint <= 0x1D6C0) { // MATHEMATICAL BOLD CAPITAL ALPHA .. MATHEMATICAL BOLD CAPITAL OMEGA
   1971        return true;
   1972    }
   1973    if (codePoint >= 0x1D6C2 && codePoint <= 0x1D6DA) { // MATHEMATICAL BOLD SMALL ALPHA .. MATHEMATICAL BOLD SMALL OMEGA
   1974        return true;
   1975    }
   1976    if (codePoint >= 0x1D6DC && codePoint <= 0x1D6FA) { // MATHEMATICAL BOLD EPSILON SYMBOL .. MATHEMATICAL ITALIC CAPITAL OMEGA
   1977        return true;
   1978    }
   1979    if (codePoint >= 0x1D6FC && codePoint <= 0x1D714) { // MATHEMATICAL ITALIC SMALL ALPHA .. MATHEMATICAL ITALIC SMALL OMEGA
   1980        return true;
   1981    }
   1982    if (codePoint >= 0x1D716 && codePoint <= 0x1D734) { // MATHEMATICAL ITALIC EPSILON SYMBOL .. MATHEMATICAL BOLD ITALIC CAPITAL OMEGA
   1983        return true;
   1984    }
   1985    if (codePoint >= 0x1D736 && codePoint <= 0x1D74E) { // MATHEMATICAL BOLD ITALIC SMALL ALPHA .. MATHEMATICAL BOLD ITALIC SMALL OMEGA
   1986        return true;
   1987    }
   1988    if (codePoint >= 0x1D750 && codePoint <= 0x1D76E) { // MATHEMATICAL BOLD ITALIC EPSILON SYMBOL .. MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA
   1989        return true;
   1990    }
   1991    if (codePoint >= 0x1D770 && codePoint <= 0x1D788) { // MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA .. MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA
   1992        return true;
   1993    }
   1994    if (codePoint >= 0x1D78A && codePoint <= 0x1D7A8) { // MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL .. MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA
   1995        return true;
   1996    }
   1997    if (codePoint >= 0x1D7AA && codePoint <= 0x1D7C2) { // MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA .. MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA
   1998        return true;
   1999    }
   2000    if (codePoint >= 0x1D7C4 && codePoint <= 0x1D7CB) { // MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL .. MATHEMATICAL BOLD SMALL DIGAMMA
   2001        return true;
   2002    }
   2003    if (codePoint >= 0x1DF00 && codePoint <= 0x1DF1E) { // LATIN SMALL LETTER FENG DIGRAPH WITH TRILL .. LATIN SMALL LETTER S WITH CURL
   2004        return true;
   2005    }
   2006    if (codePoint >= 0x1DF25 && codePoint <= 0x1DF2A) { // LATIN SMALL LETTER D WITH MID-HEIGHT LEFT HOOK .. LATIN SMALL LETTER T WITH MID-HEIGHT LEFT HOOK
   2007        return true;
   2008    }
   2009    if (codePoint >= 0x1E030 && codePoint <= 0x1E06D) { // MODIFIER LETTER CYRILLIC SMALL A .. MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE
   2010        return true;
   2011    }
   2012    if (codePoint >= 0x1E100 && codePoint <= 0x1E12C) { // NYIAKENG PUACHUE HMONG LETTER MA .. NYIAKENG PUACHUE HMONG LETTER W
   2013        return true;
   2014    }
   2015    if (codePoint >= 0x1E137 && codePoint <= 0x1E13D) { // NYIAKENG PUACHUE HMONG SIGN FOR PERSON .. NYIAKENG PUACHUE HMONG SYLLABLE LENGTHENER
   2016        return true;
   2017    }
   2018    if (codePoint >= 0x1E14E && codePoint <= 0x1E14E) { // NYIAKENG PUACHUE HMONG LOGOGRAM NYAJ .. NYIAKENG PUACHUE HMONG LOGOGRAM NYAJ
   2019        return true;
   2020    }
   2021    if (codePoint >= 0x1E290 && codePoint <= 0x1E2AD) { // TOTO LETTER PA .. TOTO LETTER A
   2022        return true;
   2023    }
   2024    if (codePoint >= 0x1E2C0 && codePoint <= 0x1E2EB) { // WANCHO LETTER AA .. WANCHO LETTER YIH
   2025        return true;
   2026    }
   2027    if (codePoint >= 0x1E4D0 && codePoint <= 0x1E4EB) { // NAG MUNDARI LETTER O .. NAG MUNDARI SIGN OJOD
   2028        return true;
   2029    }
   2030    if (codePoint >= 0x1E5D0 && codePoint <= 0x1E5ED) { // OL ONAL LETTER O .. OL ONAL LETTER EG
   2031        return true;
   2032    }
   2033    if (codePoint >= 0x1E5F0 && codePoint <= 0x1E5F0) { // OL ONAL SIGN HODDOND .. OL ONAL SIGN HODDOND
   2034        return true;
   2035    }
   2036    if (codePoint >= 0x1E6C0 && codePoint <= 0x1E6DE) { // TAI YO LETTER LOW KO .. TAI YO LETTER HIGH KVO
   2037        return true;
   2038    }
   2039    if (codePoint >= 0x1E6E0 && codePoint <= 0x1E6E2) { // TAI YO LETTER AA .. TAI YO LETTER UE
   2040        return true;
   2041    }
   2042    if (codePoint >= 0x1E6E4 && codePoint <= 0x1E6E5) { // TAI YO LETTER U .. TAI YO LETTER AE
   2043        return true;
   2044    }
   2045    if (codePoint >= 0x1E6E7 && codePoint <= 0x1E6ED) { // TAI YO LETTER O .. TAI YO LETTER AUE
   2046        return true;
   2047    }
   2048    if (codePoint >= 0x1E6F0 && codePoint <= 0x1E6F4) { // TAI YO LETTER AN .. TAI YO LETTER AP
   2049        return true;
   2050    }
   2051    if (codePoint >= 0x1E6FE && codePoint <= 0x1E6FF) { // TAI YO SYMBOL MUEANG .. TAI YO XAM LAI
   2052        return true;
   2053    }
   2054    if (codePoint >= 0x1E7E0 && codePoint <= 0x1E7E6) { // ETHIOPIC SYLLABLE HHYA .. ETHIOPIC SYLLABLE HHYO
   2055        return true;
   2056    }
   2057    if (codePoint >= 0x1E7E8 && codePoint <= 0x1E7EB) { // ETHIOPIC SYLLABLE GURAGE HHWA .. ETHIOPIC SYLLABLE HHWE
   2058        return true;
   2059    }
   2060    if (codePoint >= 0x1E7ED && codePoint <= 0x1E7EE) { // ETHIOPIC SYLLABLE GURAGE MWI .. ETHIOPIC SYLLABLE GURAGE MWEE
   2061        return true;
   2062    }
   2063    if (codePoint >= 0x1E7F0 && codePoint <= 0x1E7FE) { // ETHIOPIC SYLLABLE GURAGE QWI .. ETHIOPIC SYLLABLE GURAGE PWEE
   2064        return true;
   2065    }
   2066    if (codePoint >= 0x1E800 && codePoint <= 0x1E8C4) { // MENDE KIKAKUI SYLLABLE M001 KI .. MENDE KIKAKUI SYLLABLE M060 NYON
   2067        return true;
   2068    }
   2069    if (codePoint >= 0x1E900 && codePoint <= 0x1E943) { // ADLAM CAPITAL LETTER ALIF .. ADLAM SMALL LETTER SHA
   2070        return true;
   2071    }
   2072    if (codePoint >= 0x1E94B && codePoint <= 0x1E94B) { // ADLAM NASALIZATION MARK .. ADLAM NASALIZATION MARK
   2073        return true;
   2074    }
   2075    if (codePoint >= 0x1EE00 && codePoint <= 0x1EE03) { // ARABIC MATHEMATICAL ALEF .. ARABIC MATHEMATICAL DAL
   2076        return true;
   2077    }
   2078    if (codePoint >= 0x1EE05 && codePoint <= 0x1EE1F) { // ARABIC MATHEMATICAL WAW .. ARABIC MATHEMATICAL DOTLESS QAF
   2079        return true;
   2080    }
   2081    if (codePoint >= 0x1EE21 && codePoint <= 0x1EE22) { // ARABIC MATHEMATICAL INITIAL BEH .. ARABIC MATHEMATICAL INITIAL JEEM
   2082        return true;
   2083    }
   2084    if (codePoint >= 0x1EE24 && codePoint <= 0x1EE24) { // ARABIC MATHEMATICAL INITIAL HEH .. ARABIC MATHEMATICAL INITIAL HEH
   2085        return true;
   2086    }
   2087    if (codePoint >= 0x1EE27 && codePoint <= 0x1EE27) { // ARABIC MATHEMATICAL INITIAL HAH .. ARABIC MATHEMATICAL INITIAL HAH
   2088        return true;
   2089    }
   2090    if (codePoint >= 0x1EE29 && codePoint <= 0x1EE32) { // ARABIC MATHEMATICAL INITIAL YEH .. ARABIC MATHEMATICAL INITIAL QAF
   2091        return true;
   2092    }
   2093    if (codePoint >= 0x1EE34 && codePoint <= 0x1EE37) { // ARABIC MATHEMATICAL INITIAL SHEEN .. ARABIC MATHEMATICAL INITIAL KHAH
   2094        return true;
   2095    }
   2096    if (codePoint >= 0x1EE39 && codePoint <= 0x1EE39) { // ARABIC MATHEMATICAL INITIAL DAD .. ARABIC MATHEMATICAL INITIAL DAD
   2097        return true;
   2098    }
   2099    if (codePoint >= 0x1EE3B && codePoint <= 0x1EE3B) { // ARABIC MATHEMATICAL INITIAL GHAIN .. ARABIC MATHEMATICAL INITIAL GHAIN
   2100        return true;
   2101    }
   2102    if (codePoint >= 0x1EE42 && codePoint <= 0x1EE42) { // ARABIC MATHEMATICAL TAILED JEEM .. ARABIC MATHEMATICAL TAILED JEEM
   2103        return true;
   2104    }
   2105    if (codePoint >= 0x1EE47 && codePoint <= 0x1EE47) { // ARABIC MATHEMATICAL TAILED HAH .. ARABIC MATHEMATICAL TAILED HAH
   2106        return true;
   2107    }
   2108    if (codePoint >= 0x1EE49 && codePoint <= 0x1EE49) { // ARABIC MATHEMATICAL TAILED YEH .. ARABIC MATHEMATICAL TAILED YEH
   2109        return true;
   2110    }
   2111    if (codePoint >= 0x1EE4B && codePoint <= 0x1EE4B) { // ARABIC MATHEMATICAL TAILED LAM .. ARABIC MATHEMATICAL TAILED LAM
   2112        return true;
   2113    }
   2114    if (codePoint >= 0x1EE4D && codePoint <= 0x1EE4F) { // ARABIC MATHEMATICAL TAILED NOON .. ARABIC MATHEMATICAL TAILED AIN
   2115        return true;
   2116    }
   2117    if (codePoint >= 0x1EE51 && codePoint <= 0x1EE52) { // ARABIC MATHEMATICAL TAILED SAD .. ARABIC MATHEMATICAL TAILED QAF
   2118        return true;
   2119    }
   2120    if (codePoint >= 0x1EE54 && codePoint <= 0x1EE54) { // ARABIC MATHEMATICAL TAILED SHEEN .. ARABIC MATHEMATICAL TAILED SHEEN
   2121        return true;
   2122    }
   2123    if (codePoint >= 0x1EE57 && codePoint <= 0x1EE57) { // ARABIC MATHEMATICAL TAILED KHAH .. ARABIC MATHEMATICAL TAILED KHAH
   2124        return true;
   2125    }
   2126    if (codePoint >= 0x1EE59 && codePoint <= 0x1EE59) { // ARABIC MATHEMATICAL TAILED DAD .. ARABIC MATHEMATICAL TAILED DAD
   2127        return true;
   2128    }
   2129    if (codePoint >= 0x1EE5B && codePoint <= 0x1EE5B) { // ARABIC MATHEMATICAL TAILED GHAIN .. ARABIC MATHEMATICAL TAILED GHAIN
   2130        return true;
   2131    }
   2132    if (codePoint >= 0x1EE5D && codePoint <= 0x1EE5D) { // ARABIC MATHEMATICAL TAILED DOTLESS NOON .. ARABIC MATHEMATICAL TAILED DOTLESS NOON
   2133        return true;
   2134    }
   2135    if (codePoint >= 0x1EE5F && codePoint <= 0x1EE5F) { // ARABIC MATHEMATICAL TAILED DOTLESS QAF .. ARABIC MATHEMATICAL TAILED DOTLESS QAF
   2136        return true;
   2137    }
   2138    if (codePoint >= 0x1EE61 && codePoint <= 0x1EE62) { // ARABIC MATHEMATICAL STRETCHED BEH .. ARABIC MATHEMATICAL STRETCHED JEEM
   2139        return true;
   2140    }
   2141    if (codePoint >= 0x1EE64 && codePoint <= 0x1EE64) { // ARABIC MATHEMATICAL STRETCHED HEH .. ARABIC MATHEMATICAL STRETCHED HEH
   2142        return true;
   2143    }
   2144    if (codePoint >= 0x1EE67 && codePoint <= 0x1EE6A) { // ARABIC MATHEMATICAL STRETCHED HAH .. ARABIC MATHEMATICAL STRETCHED KAF
   2145        return true;
   2146    }
   2147    if (codePoint >= 0x1EE6C && codePoint <= 0x1EE72) { // ARABIC MATHEMATICAL STRETCHED MEEM .. ARABIC MATHEMATICAL STRETCHED QAF
   2148        return true;
   2149    }
   2150    if (codePoint >= 0x1EE74 && codePoint <= 0x1EE77) { // ARABIC MATHEMATICAL STRETCHED SHEEN .. ARABIC MATHEMATICAL STRETCHED KHAH
   2151        return true;
   2152    }
   2153    if (codePoint >= 0x1EE79 && codePoint <= 0x1EE7C) { // ARABIC MATHEMATICAL STRETCHED DAD .. ARABIC MATHEMATICAL STRETCHED DOTLESS BEH
   2154        return true;
   2155    }
   2156    if (codePoint >= 0x1EE7E && codePoint <= 0x1EE7E) { // ARABIC MATHEMATICAL STRETCHED DOTLESS FEH .. ARABIC MATHEMATICAL STRETCHED DOTLESS FEH
   2157        return true;
   2158    }
   2159    if (codePoint >= 0x1EE80 && codePoint <= 0x1EE89) { // ARABIC MATHEMATICAL LOOPED ALEF .. ARABIC MATHEMATICAL LOOPED YEH
   2160        return true;
   2161    }
   2162    if (codePoint >= 0x1EE8B && codePoint <= 0x1EE9B) { // ARABIC MATHEMATICAL LOOPED LAM .. ARABIC MATHEMATICAL LOOPED GHAIN
   2163        return true;
   2164    }
   2165    if (codePoint >= 0x1EEA1 && codePoint <= 0x1EEA3) { // ARABIC MATHEMATICAL DOUBLE-STRUCK BEH .. ARABIC MATHEMATICAL DOUBLE-STRUCK DAL
   2166        return true;
   2167    }
   2168    if (codePoint >= 0x1EEA5 && codePoint <= 0x1EEA9) { // ARABIC MATHEMATICAL DOUBLE-STRUCK WAW .. ARABIC MATHEMATICAL DOUBLE-STRUCK YEH
   2169        return true;
   2170    }
   2171    if (codePoint >= 0x1EEAB && codePoint <= 0x1EEBB) { // ARABIC MATHEMATICAL DOUBLE-STRUCK LAM .. ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN
   2172        return true;
   2173    }
   2174    if (codePoint >= 0x20000 && codePoint <= 0x2A6DF) { // CJK Ideograph Extension B .. CJK Ideograph Extension B
   2175        return true;
   2176    }
   2177    if (codePoint >= 0x2A700 && codePoint <= 0x2B81D) { // CJK Ideograph Extension C .. CJK Ideograph Extension D
   2178        return true;
   2179    }
   2180    if (codePoint >= 0x2B820 && codePoint <= 0x2CEAD) { // CJK Ideograph Extension E .. CJK Ideograph Extension E
   2181        return true;
   2182    }
   2183    if (codePoint >= 0x2CEB0 && codePoint <= 0x2EBE0) { // CJK Ideograph Extension F .. CJK Ideograph Extension F
   2184        return true;
   2185    }
   2186    if (codePoint >= 0x2EBF0 && codePoint <= 0x2EE5D) { // CJK Ideograph Extension I .. CJK Ideograph Extension I
   2187        return true;
   2188    }
   2189    if (codePoint >= 0x2F800 && codePoint <= 0x2FA1D) { // CJK COMPATIBILITY IDEOGRAPH-2F800 .. CJK COMPATIBILITY IDEOGRAPH-2FA1D
   2190        return true;
   2191    }
   2192    if (codePoint >= 0x30000 && codePoint <= 0x3134A) { // CJK Ideograph Extension G .. CJK Ideograph Extension G
   2193        return true;
   2194    }
   2195    if (codePoint >= 0x31350 && codePoint <= 0x33479) { // CJK Ideograph Extension H .. CJK Ideograph Extension J
   2196        return true;
   2197    }
   2198    return false;
   2199 }
   2200 
   2201 bool
   2202 js::unicode::IsIdentifierPartNonBMP(char32_t codePoint)
   2203 {
   2204    if (codePoint >= 0x10000 && codePoint <= 0x1000B) { // LINEAR B SYLLABLE B008 A .. LINEAR B SYLLABLE B046 JE
   2205        return true;
   2206    }
   2207    if (codePoint >= 0x1000D && codePoint <= 0x10026) { // LINEAR B SYLLABLE B036 JO .. LINEAR B SYLLABLE B032 QO
   2208        return true;
   2209    }
   2210    if (codePoint >= 0x10028 && codePoint <= 0x1003A) { // LINEAR B SYLLABLE B060 RA .. LINEAR B SYLLABLE B042 WO
   2211        return true;
   2212    }
   2213    if (codePoint >= 0x1003C && codePoint <= 0x1003D) { // LINEAR B SYLLABLE B017 ZA .. LINEAR B SYLLABLE B074 ZE
   2214        return true;
   2215    }
   2216    if (codePoint >= 0x1003F && codePoint <= 0x1004D) { // LINEAR B SYLLABLE B020 ZO .. LINEAR B SYLLABLE B091 TWO
   2217        return true;
   2218    }
   2219    if (codePoint >= 0x10050 && codePoint <= 0x1005D) { // LINEAR B SYMBOL B018 .. LINEAR B SYMBOL B089
   2220        return true;
   2221    }
   2222    if (codePoint >= 0x10080 && codePoint <= 0x100FA) { // LINEAR B IDEOGRAM B100 MAN .. LINEAR B IDEOGRAM VESSEL B305
   2223        return true;
   2224    }
   2225    if (codePoint >= 0x10140 && codePoint <= 0x10174) { // GREEK ACROPHONIC ATTIC ONE QUARTER .. GREEK ACROPHONIC STRATIAN FIFTY MNAS
   2226        return true;
   2227    }
   2228    if (codePoint >= 0x101FD && codePoint <= 0x101FD) { // PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE .. PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE
   2229        return true;
   2230    }
   2231    if (codePoint >= 0x10280 && codePoint <= 0x1029C) { // LYCIAN LETTER A .. LYCIAN LETTER X
   2232        return true;
   2233    }
   2234    if (codePoint >= 0x102A0 && codePoint <= 0x102D0) { // CARIAN LETTER A .. CARIAN LETTER UUU3
   2235        return true;
   2236    }
   2237    if (codePoint >= 0x102E0 && codePoint <= 0x102E0) { // COPTIC EPACT THOUSANDS MARK .. COPTIC EPACT THOUSANDS MARK
   2238        return true;
   2239    }
   2240    if (codePoint >= 0x10300 && codePoint <= 0x1031F) { // OLD ITALIC LETTER A .. OLD ITALIC LETTER ESS
   2241        return true;
   2242    }
   2243    if (codePoint >= 0x1032D && codePoint <= 0x1034A) { // OLD ITALIC LETTER YE .. GOTHIC LETTER NINE HUNDRED
   2244        return true;
   2245    }
   2246    if (codePoint >= 0x10350 && codePoint <= 0x1037A) { // OLD PERMIC LETTER AN .. COMBINING OLD PERMIC LETTER SII
   2247        return true;
   2248    }
   2249    if (codePoint >= 0x10380 && codePoint <= 0x1039D) { // UGARITIC LETTER ALPA .. UGARITIC LETTER SSU
   2250        return true;
   2251    }
   2252    if (codePoint >= 0x103A0 && codePoint <= 0x103C3) { // OLD PERSIAN SIGN A .. OLD PERSIAN SIGN HA
   2253        return true;
   2254    }
   2255    if (codePoint >= 0x103C8 && codePoint <= 0x103CF) { // OLD PERSIAN SIGN AURAMAZDAA .. OLD PERSIAN SIGN BUUMISH
   2256        return true;
   2257    }
   2258    if (codePoint >= 0x103D1 && codePoint <= 0x103D5) { // OLD PERSIAN NUMBER ONE .. OLD PERSIAN NUMBER HUNDRED
   2259        return true;
   2260    }
   2261    if (codePoint >= 0x10400 && codePoint <= 0x1049D) { // DESERET CAPITAL LETTER LONG I .. OSMANYA LETTER OO
   2262        return true;
   2263    }
   2264    if (codePoint >= 0x104A0 && codePoint <= 0x104A9) { // OSMANYA DIGIT ZERO .. OSMANYA DIGIT NINE
   2265        return true;
   2266    }
   2267    if (codePoint >= 0x104B0 && codePoint <= 0x104D3) { // OSAGE CAPITAL LETTER A .. OSAGE CAPITAL LETTER ZHA
   2268        return true;
   2269    }
   2270    if (codePoint >= 0x104D8 && codePoint <= 0x104FB) { // OSAGE SMALL LETTER A .. OSAGE SMALL LETTER ZHA
   2271        return true;
   2272    }
   2273    if (codePoint >= 0x10500 && codePoint <= 0x10527) { // ELBASAN LETTER A .. ELBASAN LETTER KHE
   2274        return true;
   2275    }
   2276    if (codePoint >= 0x10530 && codePoint <= 0x10563) { // CAUCASIAN ALBANIAN LETTER ALT .. CAUCASIAN ALBANIAN LETTER KIW
   2277        return true;
   2278    }
   2279    if (codePoint >= 0x10570 && codePoint <= 0x1057A) { // VITHKUQI CAPITAL LETTER A .. VITHKUQI CAPITAL LETTER GA
   2280        return true;
   2281    }
   2282    if (codePoint >= 0x1057C && codePoint <= 0x1058A) { // VITHKUQI CAPITAL LETTER HA .. VITHKUQI CAPITAL LETTER RE
   2283        return true;
   2284    }
   2285    if (codePoint >= 0x1058C && codePoint <= 0x10592) { // VITHKUQI CAPITAL LETTER SE .. VITHKUQI CAPITAL LETTER XE
   2286        return true;
   2287    }
   2288    if (codePoint >= 0x10594 && codePoint <= 0x10595) { // VITHKUQI CAPITAL LETTER Y .. VITHKUQI CAPITAL LETTER ZE
   2289        return true;
   2290    }
   2291    if (codePoint >= 0x10597 && codePoint <= 0x105A1) { // VITHKUQI SMALL LETTER A .. VITHKUQI SMALL LETTER GA
   2292        return true;
   2293    }
   2294    if (codePoint >= 0x105A3 && codePoint <= 0x105B1) { // VITHKUQI SMALL LETTER HA .. VITHKUQI SMALL LETTER RE
   2295        return true;
   2296    }
   2297    if (codePoint >= 0x105B3 && codePoint <= 0x105B9) { // VITHKUQI SMALL LETTER SE .. VITHKUQI SMALL LETTER XE
   2298        return true;
   2299    }
   2300    if (codePoint >= 0x105BB && codePoint <= 0x105BC) { // VITHKUQI SMALL LETTER Y .. VITHKUQI SMALL LETTER ZE
   2301        return true;
   2302    }
   2303    if (codePoint >= 0x105C0 && codePoint <= 0x105F3) { // TODHRI LETTER A .. TODHRI LETTER OO
   2304        return true;
   2305    }
   2306    if (codePoint >= 0x10600 && codePoint <= 0x10736) { // LINEAR A SIGN AB001 .. LINEAR A SIGN A664
   2307        return true;
   2308    }
   2309    if (codePoint >= 0x10740 && codePoint <= 0x10755) { // LINEAR A SIGN A701 A .. LINEAR A SIGN A732 JE
   2310        return true;
   2311    }
   2312    if (codePoint >= 0x10760 && codePoint <= 0x10767) { // LINEAR A SIGN A800 .. LINEAR A SIGN A807
   2313        return true;
   2314    }
   2315    if (codePoint >= 0x10780 && codePoint <= 0x10785) { // MODIFIER LETTER SMALL CAPITAL AA .. MODIFIER LETTER SMALL B WITH HOOK
   2316        return true;
   2317    }
   2318    if (codePoint >= 0x10787 && codePoint <= 0x107B0) { // MODIFIER LETTER SMALL DZ DIGRAPH .. MODIFIER LETTER SMALL V WITH RIGHT HOOK
   2319        return true;
   2320    }
   2321    if (codePoint >= 0x107B2 && codePoint <= 0x107BA) { // MODIFIER LETTER SMALL CAPITAL Y .. MODIFIER LETTER SMALL S WITH CURL
   2322        return true;
   2323    }
   2324    if (codePoint >= 0x10800 && codePoint <= 0x10805) { // CYPRIOT SYLLABLE A .. CYPRIOT SYLLABLE JA
   2325        return true;
   2326    }
   2327    if (codePoint >= 0x10808 && codePoint <= 0x10808) { // CYPRIOT SYLLABLE JO .. CYPRIOT SYLLABLE JO
   2328        return true;
   2329    }
   2330    if (codePoint >= 0x1080A && codePoint <= 0x10835) { // CYPRIOT SYLLABLE KA .. CYPRIOT SYLLABLE WO
   2331        return true;
   2332    }
   2333    if (codePoint >= 0x10837 && codePoint <= 0x10838) { // CYPRIOT SYLLABLE XA .. CYPRIOT SYLLABLE XE
   2334        return true;
   2335    }
   2336    if (codePoint >= 0x1083C && codePoint <= 0x1083C) { // CYPRIOT SYLLABLE ZA .. CYPRIOT SYLLABLE ZA
   2337        return true;
   2338    }
   2339    if (codePoint >= 0x1083F && codePoint <= 0x10855) { // CYPRIOT SYLLABLE ZO .. IMPERIAL ARAMAIC LETTER TAW
   2340        return true;
   2341    }
   2342    if (codePoint >= 0x10860 && codePoint <= 0x10876) { // PALMYRENE LETTER ALEPH .. PALMYRENE LETTER TAW
   2343        return true;
   2344    }
   2345    if (codePoint >= 0x10880 && codePoint <= 0x1089E) { // NABATAEAN LETTER FINAL ALEPH .. NABATAEAN LETTER TAW
   2346        return true;
   2347    }
   2348    if (codePoint >= 0x108E0 && codePoint <= 0x108F2) { // HATRAN LETTER ALEPH .. HATRAN LETTER QOPH
   2349        return true;
   2350    }
   2351    if (codePoint >= 0x108F4 && codePoint <= 0x108F5) { // HATRAN LETTER SHIN .. HATRAN LETTER TAW
   2352        return true;
   2353    }
   2354    if (codePoint >= 0x10900 && codePoint <= 0x10915) { // PHOENICIAN LETTER ALF .. PHOENICIAN LETTER TAU
   2355        return true;
   2356    }
   2357    if (codePoint >= 0x10920 && codePoint <= 0x10939) { // LYDIAN LETTER A .. LYDIAN LETTER C
   2358        return true;
   2359    }
   2360    if (codePoint >= 0x10940 && codePoint <= 0x10959) { // SIDETIC LETTER N01 .. SIDETIC LETTER N26
   2361        return true;
   2362    }
   2363    if (codePoint >= 0x10980 && codePoint <= 0x109B7) { // MEROITIC HIEROGLYPHIC LETTER A .. MEROITIC CURSIVE LETTER DA
   2364        return true;
   2365    }
   2366    if (codePoint >= 0x109BE && codePoint <= 0x109BF) { // MEROITIC CURSIVE LOGOGRAM RMT .. MEROITIC CURSIVE LOGOGRAM IMN
   2367        return true;
   2368    }
   2369    if (codePoint >= 0x10A00 && codePoint <= 0x10A03) { // KHAROSHTHI LETTER A .. KHAROSHTHI VOWEL SIGN VOCALIC R
   2370        return true;
   2371    }
   2372    if (codePoint >= 0x10A05 && codePoint <= 0x10A06) { // KHAROSHTHI VOWEL SIGN E .. KHAROSHTHI VOWEL SIGN O
   2373        return true;
   2374    }
   2375    if (codePoint >= 0x10A0C && codePoint <= 0x10A13) { // KHAROSHTHI VOWEL LENGTH MARK .. KHAROSHTHI LETTER GHA
   2376        return true;
   2377    }
   2378    if (codePoint >= 0x10A15 && codePoint <= 0x10A17) { // KHAROSHTHI LETTER CA .. KHAROSHTHI LETTER JA
   2379        return true;
   2380    }
   2381    if (codePoint >= 0x10A19 && codePoint <= 0x10A35) { // KHAROSHTHI LETTER NYA .. KHAROSHTHI LETTER VHA
   2382        return true;
   2383    }
   2384    if (codePoint >= 0x10A38 && codePoint <= 0x10A3A) { // KHAROSHTHI SIGN BAR ABOVE .. KHAROSHTHI SIGN DOT BELOW
   2385        return true;
   2386    }
   2387    if (codePoint >= 0x10A3F && codePoint <= 0x10A3F) { // KHAROSHTHI VIRAMA .. KHAROSHTHI VIRAMA
   2388        return true;
   2389    }
   2390    if (codePoint >= 0x10A60 && codePoint <= 0x10A7C) { // OLD SOUTH ARABIAN LETTER HE .. OLD SOUTH ARABIAN LETTER THETH
   2391        return true;
   2392    }
   2393    if (codePoint >= 0x10A80 && codePoint <= 0x10A9C) { // OLD NORTH ARABIAN LETTER HEH .. OLD NORTH ARABIAN LETTER ZAH
   2394        return true;
   2395    }
   2396    if (codePoint >= 0x10AC0 && codePoint <= 0x10AC7) { // MANICHAEAN LETTER ALEPH .. MANICHAEAN LETTER WAW
   2397        return true;
   2398    }
   2399    if (codePoint >= 0x10AC9 && codePoint <= 0x10AE6) { // MANICHAEAN LETTER ZAYIN .. MANICHAEAN ABBREVIATION MARK BELOW
   2400        return true;
   2401    }
   2402    if (codePoint >= 0x10B00 && codePoint <= 0x10B35) { // AVESTAN LETTER A .. AVESTAN LETTER HE
   2403        return true;
   2404    }
   2405    if (codePoint >= 0x10B40 && codePoint <= 0x10B55) { // INSCRIPTIONAL PARTHIAN LETTER ALEPH .. INSCRIPTIONAL PARTHIAN LETTER TAW
   2406        return true;
   2407    }
   2408    if (codePoint >= 0x10B60 && codePoint <= 0x10B72) { // INSCRIPTIONAL PAHLAVI LETTER ALEPH .. INSCRIPTIONAL PAHLAVI LETTER TAW
   2409        return true;
   2410    }
   2411    if (codePoint >= 0x10B80 && codePoint <= 0x10B91) { // PSALTER PAHLAVI LETTER ALEPH .. PSALTER PAHLAVI LETTER TAW
   2412        return true;
   2413    }
   2414    if (codePoint >= 0x10C00 && codePoint <= 0x10C48) { // OLD TURKIC LETTER ORKHON A .. OLD TURKIC LETTER ORKHON BASH
   2415        return true;
   2416    }
   2417    if (codePoint >= 0x10C80 && codePoint <= 0x10CB2) { // OLD HUNGARIAN CAPITAL LETTER A .. OLD HUNGARIAN CAPITAL LETTER US
   2418        return true;
   2419    }
   2420    if (codePoint >= 0x10CC0 && codePoint <= 0x10CF2) { // OLD HUNGARIAN SMALL LETTER A .. OLD HUNGARIAN SMALL LETTER US
   2421        return true;
   2422    }
   2423    if (codePoint >= 0x10D00 && codePoint <= 0x10D27) { // HANIFI ROHINGYA LETTER A .. HANIFI ROHINGYA SIGN TASSI
   2424        return true;
   2425    }
   2426    if (codePoint >= 0x10D30 && codePoint <= 0x10D39) { // HANIFI ROHINGYA DIGIT ZERO .. HANIFI ROHINGYA DIGIT NINE
   2427        return true;
   2428    }
   2429    if (codePoint >= 0x10D40 && codePoint <= 0x10D65) { // GARAY DIGIT ZERO .. GARAY CAPITAL LETTER OLD NA
   2430        return true;
   2431    }
   2432    if (codePoint >= 0x10D69 && codePoint <= 0x10D6D) { // GARAY VOWEL SIGN E .. GARAY CONSONANT NASALIZATION MARK
   2433        return true;
   2434    }
   2435    if (codePoint >= 0x10D6F && codePoint <= 0x10D85) { // GARAY REDUPLICATION MARK .. GARAY SMALL LETTER OLD NA
   2436        return true;
   2437    }
   2438    if (codePoint >= 0x10E80 && codePoint <= 0x10EA9) { // YEZIDI LETTER ELIF .. YEZIDI LETTER ET
   2439        return true;
   2440    }
   2441    if (codePoint >= 0x10EAB && codePoint <= 0x10EAC) { // YEZIDI COMBINING HAMZA MARK .. YEZIDI COMBINING MADDA MARK
   2442        return true;
   2443    }
   2444    if (codePoint >= 0x10EB0 && codePoint <= 0x10EB1) { // YEZIDI LETTER LAM WITH DOT ABOVE .. YEZIDI LETTER YOT WITH CIRCUMFLEX ABOVE
   2445        return true;
   2446    }
   2447    if (codePoint >= 0x10EC2 && codePoint <= 0x10EC7) { // ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW .. ARABIC LETTER YEH WITH FOUR DOTS BELOW
   2448        return true;
   2449    }
   2450    if (codePoint >= 0x10EFA && codePoint <= 0x10F1C) { // ARABIC DOUBLE VERTICAL BAR BELOW .. OLD SOGDIAN LETTER FINAL TAW WITH VERTICAL TAIL
   2451        return true;
   2452    }
   2453    if (codePoint >= 0x10F27 && codePoint <= 0x10F27) { // OLD SOGDIAN LIGATURE AYIN-DALETH .. OLD SOGDIAN LIGATURE AYIN-DALETH
   2454        return true;
   2455    }
   2456    if (codePoint >= 0x10F30 && codePoint <= 0x10F50) { // SOGDIAN LETTER ALEPH .. SOGDIAN COMBINING STROKE BELOW
   2457        return true;
   2458    }
   2459    if (codePoint >= 0x10F70 && codePoint <= 0x10F85) { // OLD UYGHUR LETTER ALEPH .. OLD UYGHUR COMBINING TWO DOTS BELOW
   2460        return true;
   2461    }
   2462    if (codePoint >= 0x10FB0 && codePoint <= 0x10FC4) { // CHORASMIAN LETTER ALEPH .. CHORASMIAN LETTER TAW
   2463        return true;
   2464    }
   2465    if (codePoint >= 0x10FE0 && codePoint <= 0x10FF6) { // ELYMAIC LETTER ALEPH .. ELYMAIC LIGATURE ZAYIN-YODH
   2466        return true;
   2467    }
   2468    if (codePoint >= 0x11000 && codePoint <= 0x11046) { // BRAHMI SIGN CANDRABINDU .. BRAHMI VIRAMA
   2469        return true;
   2470    }
   2471    if (codePoint >= 0x11066 && codePoint <= 0x11075) { // BRAHMI DIGIT ZERO .. BRAHMI LETTER OLD TAMIL LLA
   2472        return true;
   2473    }
   2474    if (codePoint >= 0x1107F && codePoint <= 0x110BA) { // BRAHMI NUMBER JOINER .. KAITHI SIGN NUKTA
   2475        return true;
   2476    }
   2477    if (codePoint >= 0x110C2 && codePoint <= 0x110C2) { // KAITHI VOWEL SIGN VOCALIC R .. KAITHI VOWEL SIGN VOCALIC R
   2478        return true;
   2479    }
   2480    if (codePoint >= 0x110D0 && codePoint <= 0x110E8) { // SORA SOMPENG LETTER SAH .. SORA SOMPENG LETTER MAE
   2481        return true;
   2482    }
   2483    if (codePoint >= 0x110F0 && codePoint <= 0x110F9) { // SORA SOMPENG DIGIT ZERO .. SORA SOMPENG DIGIT NINE
   2484        return true;
   2485    }
   2486    if (codePoint >= 0x11100 && codePoint <= 0x11134) { // CHAKMA SIGN CANDRABINDU .. CHAKMA MAAYYAA
   2487        return true;
   2488    }
   2489    if (codePoint >= 0x11136 && codePoint <= 0x1113F) { // CHAKMA DIGIT ZERO .. CHAKMA DIGIT NINE
   2490        return true;
   2491    }
   2492    if (codePoint >= 0x11144 && codePoint <= 0x11147) { // CHAKMA LETTER LHAA .. CHAKMA LETTER VAA
   2493        return true;
   2494    }
   2495    if (codePoint >= 0x11150 && codePoint <= 0x11173) { // MAHAJANI LETTER A .. MAHAJANI SIGN NUKTA
   2496        return true;
   2497    }
   2498    if (codePoint >= 0x11176 && codePoint <= 0x11176) { // MAHAJANI LIGATURE SHRI .. MAHAJANI LIGATURE SHRI
   2499        return true;
   2500    }
   2501    if (codePoint >= 0x11180 && codePoint <= 0x111C4) { // SHARADA SIGN CANDRABINDU .. SHARADA OM
   2502        return true;
   2503    }
   2504    if (codePoint >= 0x111C9 && codePoint <= 0x111CC) { // SHARADA SANDHI MARK .. SHARADA EXTRA SHORT VOWEL MARK
   2505        return true;
   2506    }
   2507    if (codePoint >= 0x111CE && codePoint <= 0x111DA) { // SHARADA VOWEL SIGN PRISHTHAMATRA E .. SHARADA EKAM
   2508        return true;
   2509    }
   2510    if (codePoint >= 0x111DC && codePoint <= 0x111DC) { // SHARADA HEADSTROKE .. SHARADA HEADSTROKE
   2511        return true;
   2512    }
   2513    if (codePoint >= 0x11200 && codePoint <= 0x11211) { // KHOJKI LETTER A .. KHOJKI LETTER JJA
   2514        return true;
   2515    }
   2516    if (codePoint >= 0x11213 && codePoint <= 0x11237) { // KHOJKI LETTER NYA .. KHOJKI SIGN SHADDA
   2517        return true;
   2518    }
   2519    if (codePoint >= 0x1123E && codePoint <= 0x11241) { // KHOJKI SIGN SUKUN .. KHOJKI VOWEL SIGN VOCALIC R
   2520        return true;
   2521    }
   2522    if (codePoint >= 0x11280 && codePoint <= 0x11286) { // MULTANI LETTER A .. MULTANI LETTER GA
   2523        return true;
   2524    }
   2525    if (codePoint >= 0x11288 && codePoint <= 0x11288) { // MULTANI LETTER GHA .. MULTANI LETTER GHA
   2526        return true;
   2527    }
   2528    if (codePoint >= 0x1128A && codePoint <= 0x1128D) { // MULTANI LETTER CA .. MULTANI LETTER JJA
   2529        return true;
   2530    }
   2531    if (codePoint >= 0x1128F && codePoint <= 0x1129D) { // MULTANI LETTER NYA .. MULTANI LETTER BA
   2532        return true;
   2533    }
   2534    if (codePoint >= 0x1129F && codePoint <= 0x112A8) { // MULTANI LETTER BHA .. MULTANI LETTER RHA
   2535        return true;
   2536    }
   2537    if (codePoint >= 0x112B0 && codePoint <= 0x112EA) { // KHUDAWADI LETTER A .. KHUDAWADI SIGN VIRAMA
   2538        return true;
   2539    }
   2540    if (codePoint >= 0x112F0 && codePoint <= 0x112F9) { // KHUDAWADI DIGIT ZERO .. KHUDAWADI DIGIT NINE
   2541        return true;
   2542    }
   2543    if (codePoint >= 0x11300 && codePoint <= 0x11303) { // GRANTHA SIGN COMBINING ANUSVARA ABOVE .. GRANTHA SIGN VISARGA
   2544        return true;
   2545    }
   2546    if (codePoint >= 0x11305 && codePoint <= 0x1130C) { // GRANTHA LETTER A .. GRANTHA LETTER VOCALIC L
   2547        return true;
   2548    }
   2549    if (codePoint >= 0x1130F && codePoint <= 0x11310) { // GRANTHA LETTER EE .. GRANTHA LETTER AI
   2550        return true;
   2551    }
   2552    if (codePoint >= 0x11313 && codePoint <= 0x11328) { // GRANTHA LETTER OO .. GRANTHA LETTER NA
   2553        return true;
   2554    }
   2555    if (codePoint >= 0x1132A && codePoint <= 0x11330) { // GRANTHA LETTER PA .. GRANTHA LETTER RA
   2556        return true;
   2557    }
   2558    if (codePoint >= 0x11332 && codePoint <= 0x11333) { // GRANTHA LETTER LA .. GRANTHA LETTER LLA
   2559        return true;
   2560    }
   2561    if (codePoint >= 0x11335 && codePoint <= 0x11339) { // GRANTHA LETTER VA .. GRANTHA LETTER HA
   2562        return true;
   2563    }
   2564    if (codePoint >= 0x1133B && codePoint <= 0x11344) { // COMBINING BINDU BELOW .. GRANTHA VOWEL SIGN VOCALIC RR
   2565        return true;
   2566    }
   2567    if (codePoint >= 0x11347 && codePoint <= 0x11348) { // GRANTHA VOWEL SIGN EE .. GRANTHA VOWEL SIGN AI
   2568        return true;
   2569    }
   2570    if (codePoint >= 0x1134B && codePoint <= 0x1134D) { // GRANTHA VOWEL SIGN OO .. GRANTHA SIGN VIRAMA
   2571        return true;
   2572    }
   2573    if (codePoint >= 0x11350 && codePoint <= 0x11350) { // GRANTHA OM .. GRANTHA OM
   2574        return true;
   2575    }
   2576    if (codePoint >= 0x11357 && codePoint <= 0x11357) { // GRANTHA AU LENGTH MARK .. GRANTHA AU LENGTH MARK
   2577        return true;
   2578    }
   2579    if (codePoint >= 0x1135D && codePoint <= 0x11363) { // GRANTHA SIGN PLUTA .. GRANTHA VOWEL SIGN VOCALIC LL
   2580        return true;
   2581    }
   2582    if (codePoint >= 0x11366 && codePoint <= 0x1136C) { // COMBINING GRANTHA DIGIT ZERO .. COMBINING GRANTHA DIGIT SIX
   2583        return true;
   2584    }
   2585    if (codePoint >= 0x11370 && codePoint <= 0x11374) { // COMBINING GRANTHA LETTER A .. COMBINING GRANTHA LETTER PA
   2586        return true;
   2587    }
   2588    if (codePoint >= 0x11380 && codePoint <= 0x11389) { // TULU-TIGALARI LETTER A .. TULU-TIGALARI LETTER VOCALIC LL
   2589        return true;
   2590    }
   2591    if (codePoint >= 0x1138B && codePoint <= 0x1138B) { // TULU-TIGALARI LETTER EE .. TULU-TIGALARI LETTER EE
   2592        return true;
   2593    }
   2594    if (codePoint >= 0x1138E && codePoint <= 0x1138E) { // TULU-TIGALARI LETTER AI .. TULU-TIGALARI LETTER AI
   2595        return true;
   2596    }
   2597    if (codePoint >= 0x11390 && codePoint <= 0x113B5) { // TULU-TIGALARI LETTER OO .. TULU-TIGALARI LETTER LLLA
   2598        return true;
   2599    }
   2600    if (codePoint >= 0x113B7 && codePoint <= 0x113C0) { // TULU-TIGALARI SIGN AVAGRAHA .. TULU-TIGALARI VOWEL SIGN VOCALIC LL
   2601        return true;
   2602    }
   2603    if (codePoint >= 0x113C2 && codePoint <= 0x113C2) { // TULU-TIGALARI VOWEL SIGN EE .. TULU-TIGALARI VOWEL SIGN EE
   2604        return true;
   2605    }
   2606    if (codePoint >= 0x113C5 && codePoint <= 0x113C5) { // TULU-TIGALARI VOWEL SIGN AI .. TULU-TIGALARI VOWEL SIGN AI
   2607        return true;
   2608    }
   2609    if (codePoint >= 0x113C7 && codePoint <= 0x113CA) { // TULU-TIGALARI VOWEL SIGN OO .. TULU-TIGALARI SIGN CANDRA ANUNASIKA
   2610        return true;
   2611    }
   2612    if (codePoint >= 0x113CC && codePoint <= 0x113D3) { // TULU-TIGALARI SIGN ANUSVARA .. TULU-TIGALARI SIGN PLUTA
   2613        return true;
   2614    }
   2615    if (codePoint >= 0x113E1 && codePoint <= 0x113E2) { // TULU-TIGALARI VEDIC TONE SVARITA .. TULU-TIGALARI VEDIC TONE ANUDATTA
   2616        return true;
   2617    }
   2618    if (codePoint >= 0x11400 && codePoint <= 0x1144A) { // NEWA LETTER A .. NEWA SIDDHI
   2619        return true;
   2620    }
   2621    if (codePoint >= 0x11450 && codePoint <= 0x11459) { // NEWA DIGIT ZERO .. NEWA DIGIT NINE
   2622        return true;
   2623    }
   2624    if (codePoint >= 0x1145E && codePoint <= 0x11461) { // NEWA SANDHI MARK .. NEWA SIGN UPADHMANIYA
   2625        return true;
   2626    }
   2627    if (codePoint >= 0x11480 && codePoint <= 0x114C5) { // TIRHUTA ANJI .. TIRHUTA GVANG
   2628        return true;
   2629    }
   2630    if (codePoint >= 0x114C7 && codePoint <= 0x114C7) { // TIRHUTA OM .. TIRHUTA OM
   2631        return true;
   2632    }
   2633    if (codePoint >= 0x114D0 && codePoint <= 0x114D9) { // TIRHUTA DIGIT ZERO .. TIRHUTA DIGIT NINE
   2634        return true;
   2635    }
   2636    if (codePoint >= 0x11580 && codePoint <= 0x115B5) { // SIDDHAM LETTER A .. SIDDHAM VOWEL SIGN VOCALIC RR
   2637        return true;
   2638    }
   2639    if (codePoint >= 0x115B8 && codePoint <= 0x115C0) { // SIDDHAM VOWEL SIGN E .. SIDDHAM SIGN NUKTA
   2640        return true;
   2641    }
   2642    if (codePoint >= 0x115D8 && codePoint <= 0x115DD) { // SIDDHAM LETTER THREE-CIRCLE ALTERNATE I .. SIDDHAM VOWEL SIGN ALTERNATE UU
   2643        return true;
   2644    }
   2645    if (codePoint >= 0x11600 && codePoint <= 0x11640) { // MODI LETTER A .. MODI SIGN ARDHACANDRA
   2646        return true;
   2647    }
   2648    if (codePoint >= 0x11644 && codePoint <= 0x11644) { // MODI SIGN HUVA .. MODI SIGN HUVA
   2649        return true;
   2650    }
   2651    if (codePoint >= 0x11650 && codePoint <= 0x11659) { // MODI DIGIT ZERO .. MODI DIGIT NINE
   2652        return true;
   2653    }
   2654    if (codePoint >= 0x11680 && codePoint <= 0x116B8) { // TAKRI LETTER A .. TAKRI LETTER ARCHAIC KHA
   2655        return true;
   2656    }
   2657    if (codePoint >= 0x116C0 && codePoint <= 0x116C9) { // TAKRI DIGIT ZERO .. TAKRI DIGIT NINE
   2658        return true;
   2659    }
   2660    if (codePoint >= 0x116D0 && codePoint <= 0x116E3) { // MYANMAR PAO DIGIT ZERO .. MYANMAR EASTERN PWO KAREN DIGIT NINE
   2661        return true;
   2662    }
   2663    if (codePoint >= 0x11700 && codePoint <= 0x1171A) { // AHOM LETTER KA .. AHOM LETTER ALTERNATE BA
   2664        return true;
   2665    }
   2666    if (codePoint >= 0x1171D && codePoint <= 0x1172B) { // AHOM CONSONANT SIGN MEDIAL LA .. AHOM SIGN KILLER
   2667        return true;
   2668    }
   2669    if (codePoint >= 0x11730 && codePoint <= 0x11739) { // AHOM DIGIT ZERO .. AHOM DIGIT NINE
   2670        return true;
   2671    }
   2672    if (codePoint >= 0x11740 && codePoint <= 0x11746) { // AHOM LETTER CA .. AHOM LETTER LLA
   2673        return true;
   2674    }
   2675    if (codePoint >= 0x11800 && codePoint <= 0x1183A) { // DOGRA LETTER A .. DOGRA SIGN NUKTA
   2676        return true;
   2677    }
   2678    if (codePoint >= 0x118A0 && codePoint <= 0x118E9) { // WARANG CITI CAPITAL LETTER NGAA .. WARANG CITI DIGIT NINE
   2679        return true;
   2680    }
   2681    if (codePoint >= 0x118FF && codePoint <= 0x11906) { // WARANG CITI OM .. DIVES AKURU LETTER E
   2682        return true;
   2683    }
   2684    if (codePoint >= 0x11909 && codePoint <= 0x11909) { // DIVES AKURU LETTER O .. DIVES AKURU LETTER O
   2685        return true;
   2686    }
   2687    if (codePoint >= 0x1190C && codePoint <= 0x11913) { // DIVES AKURU LETTER KA .. DIVES AKURU LETTER JA
   2688        return true;
   2689    }
   2690    if (codePoint >= 0x11915 && codePoint <= 0x11916) { // DIVES AKURU LETTER NYA .. DIVES AKURU LETTER TTA
   2691        return true;
   2692    }
   2693    if (codePoint >= 0x11918 && codePoint <= 0x11935) { // DIVES AKURU LETTER DDA .. DIVES AKURU VOWEL SIGN E
   2694        return true;
   2695    }
   2696    if (codePoint >= 0x11937 && codePoint <= 0x11938) { // DIVES AKURU VOWEL SIGN AI .. DIVES AKURU VOWEL SIGN O
   2697        return true;
   2698    }
   2699    if (codePoint >= 0x1193B && codePoint <= 0x11943) { // DIVES AKURU SIGN ANUSVARA .. DIVES AKURU SIGN NUKTA
   2700        return true;
   2701    }
   2702    if (codePoint >= 0x11950 && codePoint <= 0x11959) { // DIVES AKURU DIGIT ZERO .. DIVES AKURU DIGIT NINE
   2703        return true;
   2704    }
   2705    if (codePoint >= 0x119A0 && codePoint <= 0x119A7) { // NANDINAGARI LETTER A .. NANDINAGARI LETTER VOCALIC RR
   2706        return true;
   2707    }
   2708    if (codePoint >= 0x119AA && codePoint <= 0x119D7) { // NANDINAGARI LETTER E .. NANDINAGARI VOWEL SIGN VOCALIC RR
   2709        return true;
   2710    }
   2711    if (codePoint >= 0x119DA && codePoint <= 0x119E1) { // NANDINAGARI VOWEL SIGN E .. NANDINAGARI SIGN AVAGRAHA
   2712        return true;
   2713    }
   2714    if (codePoint >= 0x119E3 && codePoint <= 0x119E4) { // NANDINAGARI HEADSTROKE .. NANDINAGARI VOWEL SIGN PRISHTHAMATRA E
   2715        return true;
   2716    }
   2717    if (codePoint >= 0x11A00 && codePoint <= 0x11A3E) { // ZANABAZAR SQUARE LETTER A .. ZANABAZAR SQUARE CLUSTER-FINAL LETTER VA
   2718        return true;
   2719    }
   2720    if (codePoint >= 0x11A47 && codePoint <= 0x11A47) { // ZANABAZAR SQUARE SUBJOINER .. ZANABAZAR SQUARE SUBJOINER
   2721        return true;
   2722    }
   2723    if (codePoint >= 0x11A50 && codePoint <= 0x11A99) { // SOYOMBO LETTER A .. SOYOMBO SUBJOINER
   2724        return true;
   2725    }
   2726    if (codePoint >= 0x11A9D && codePoint <= 0x11A9D) { // SOYOMBO MARK PLUTA .. SOYOMBO MARK PLUTA
   2727        return true;
   2728    }
   2729    if (codePoint >= 0x11AB0 && codePoint <= 0x11AF8) { // CANADIAN SYLLABICS NATTILIK HI .. PAU CIN HAU GLOTTAL STOP FINAL
   2730        return true;
   2731    }
   2732    if (codePoint >= 0x11B60 && codePoint <= 0x11B67) { // SHARADA VOWEL SIGN OE .. SHARADA VOWEL SIGN CANDRA O
   2733        return true;
   2734    }
   2735    if (codePoint >= 0x11BC0 && codePoint <= 0x11BE0) { // SUNUWAR LETTER DEVI .. SUNUWAR LETTER KLOKO
   2736        return true;
   2737    }
   2738    if (codePoint >= 0x11BF0 && codePoint <= 0x11BF9) { // SUNUWAR DIGIT ZERO .. SUNUWAR DIGIT NINE
   2739        return true;
   2740    }
   2741    if (codePoint >= 0x11C00 && codePoint <= 0x11C08) { // BHAIKSUKI LETTER A .. BHAIKSUKI LETTER VOCALIC L
   2742        return true;
   2743    }
   2744    if (codePoint >= 0x11C0A && codePoint <= 0x11C36) { // BHAIKSUKI LETTER E .. BHAIKSUKI VOWEL SIGN VOCALIC L
   2745        return true;
   2746    }
   2747    if (codePoint >= 0x11C38 && codePoint <= 0x11C40) { // BHAIKSUKI VOWEL SIGN E .. BHAIKSUKI SIGN AVAGRAHA
   2748        return true;
   2749    }
   2750    if (codePoint >= 0x11C50 && codePoint <= 0x11C59) { // BHAIKSUKI DIGIT ZERO .. BHAIKSUKI DIGIT NINE
   2751        return true;
   2752    }
   2753    if (codePoint >= 0x11C72 && codePoint <= 0x11C8F) { // MARCHEN LETTER KA .. MARCHEN LETTER A
   2754        return true;
   2755    }
   2756    if (codePoint >= 0x11C92 && codePoint <= 0x11CA7) { // MARCHEN SUBJOINED LETTER KA .. MARCHEN SUBJOINED LETTER ZA
   2757        return true;
   2758    }
   2759    if (codePoint >= 0x11CA9 && codePoint <= 0x11CB6) { // MARCHEN SUBJOINED LETTER YA .. MARCHEN SIGN CANDRABINDU
   2760        return true;
   2761    }
   2762    if (codePoint >= 0x11D00 && codePoint <= 0x11D06) { // MASARAM GONDI LETTER A .. MASARAM GONDI LETTER E
   2763        return true;
   2764    }
   2765    if (codePoint >= 0x11D08 && codePoint <= 0x11D09) { // MASARAM GONDI LETTER AI .. MASARAM GONDI LETTER O
   2766        return true;
   2767    }
   2768    if (codePoint >= 0x11D0B && codePoint <= 0x11D36) { // MASARAM GONDI LETTER AU .. MASARAM GONDI VOWEL SIGN VOCALIC R
   2769        return true;
   2770    }
   2771    if (codePoint >= 0x11D3A && codePoint <= 0x11D3A) { // MASARAM GONDI VOWEL SIGN E .. MASARAM GONDI VOWEL SIGN E
   2772        return true;
   2773    }
   2774    if (codePoint >= 0x11D3C && codePoint <= 0x11D3D) { // MASARAM GONDI VOWEL SIGN AI .. MASARAM GONDI VOWEL SIGN O
   2775        return true;
   2776    }
   2777    if (codePoint >= 0x11D3F && codePoint <= 0x11D47) { // MASARAM GONDI VOWEL SIGN AU .. MASARAM GONDI RA-KARA
   2778        return true;
   2779    }
   2780    if (codePoint >= 0x11D50 && codePoint <= 0x11D59) { // MASARAM GONDI DIGIT ZERO .. MASARAM GONDI DIGIT NINE
   2781        return true;
   2782    }
   2783    if (codePoint >= 0x11D60 && codePoint <= 0x11D65) { // GUNJALA GONDI LETTER A .. GUNJALA GONDI LETTER UU
   2784        return true;
   2785    }
   2786    if (codePoint >= 0x11D67 && codePoint <= 0x11D68) { // GUNJALA GONDI LETTER EE .. GUNJALA GONDI LETTER AI
   2787        return true;
   2788    }
   2789    if (codePoint >= 0x11D6A && codePoint <= 0x11D8E) { // GUNJALA GONDI LETTER OO .. GUNJALA GONDI VOWEL SIGN UU
   2790        return true;
   2791    }
   2792    if (codePoint >= 0x11D90 && codePoint <= 0x11D91) { // GUNJALA GONDI VOWEL SIGN EE .. GUNJALA GONDI VOWEL SIGN AI
   2793        return true;
   2794    }
   2795    if (codePoint >= 0x11D93 && codePoint <= 0x11D98) { // GUNJALA GONDI VOWEL SIGN OO .. GUNJALA GONDI OM
   2796        return true;
   2797    }
   2798    if (codePoint >= 0x11DA0 && codePoint <= 0x11DA9) { // GUNJALA GONDI DIGIT ZERO .. GUNJALA GONDI DIGIT NINE
   2799        return true;
   2800    }
   2801    if (codePoint >= 0x11DB0 && codePoint <= 0x11DDB) { // TOLONG SIKI LETTER I .. TOLONG SIKI UNGGA
   2802        return true;
   2803    }
   2804    if (codePoint >= 0x11DE0 && codePoint <= 0x11DE9) { // TOLONG SIKI DIGIT ZERO .. TOLONG SIKI DIGIT NINE
   2805        return true;
   2806    }
   2807    if (codePoint >= 0x11EE0 && codePoint <= 0x11EF6) { // MAKASAR LETTER KA .. MAKASAR VOWEL SIGN O
   2808        return true;
   2809    }
   2810    if (codePoint >= 0x11F00 && codePoint <= 0x11F10) { // KAWI SIGN CANDRABINDU .. KAWI LETTER O
   2811        return true;
   2812    }
   2813    if (codePoint >= 0x11F12 && codePoint <= 0x11F3A) { // KAWI LETTER KA .. KAWI VOWEL SIGN VOCALIC R
   2814        return true;
   2815    }
   2816    if (codePoint >= 0x11F3E && codePoint <= 0x11F42) { // KAWI VOWEL SIGN E .. KAWI CONJOINER
   2817        return true;
   2818    }
   2819    if (codePoint >= 0x11F50 && codePoint <= 0x11F5A) { // KAWI DIGIT ZERO .. KAWI SIGN NUKTA
   2820        return true;
   2821    }
   2822    if (codePoint >= 0x11FB0 && codePoint <= 0x11FB0) { // LISU LETTER YHA .. LISU LETTER YHA
   2823        return true;
   2824    }
   2825    if (codePoint >= 0x12000 && codePoint <= 0x12399) { // CUNEIFORM SIGN A .. CUNEIFORM SIGN U U
   2826        return true;
   2827    }
   2828    if (codePoint >= 0x12400 && codePoint <= 0x1246E) { // CUNEIFORM NUMERIC SIGN TWO ASH .. CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM
   2829        return true;
   2830    }
   2831    if (codePoint >= 0x12480 && codePoint <= 0x12543) { // CUNEIFORM SIGN AB TIMES NUN TENU .. CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU
   2832        return true;
   2833    }
   2834    if (codePoint >= 0x12F90 && codePoint <= 0x12FF0) { // CYPRO-MINOAN SIGN CM001 .. CYPRO-MINOAN SIGN CM114
   2835        return true;
   2836    }
   2837    if (codePoint >= 0x13000 && codePoint <= 0x1342F) { // EGYPTIAN HIEROGLYPH A001 .. EGYPTIAN HIEROGLYPH V011D
   2838        return true;
   2839    }
   2840    if (codePoint >= 0x13440 && codePoint <= 0x13455) { // EGYPTIAN HIEROGLYPH MIRROR HORIZONTALLY .. EGYPTIAN HIEROGLYPH MODIFIER DAMAGED
   2841        return true;
   2842    }
   2843    if (codePoint >= 0x13460 && codePoint <= 0x143FA) { // EGYPTIAN HIEROGLYPH-13460 .. EGYPTIAN HIEROGLYPH-143FA
   2844        return true;
   2845    }
   2846    if (codePoint >= 0x14400 && codePoint <= 0x14646) { // ANATOLIAN HIEROGLYPH A001 .. ANATOLIAN HIEROGLYPH A530
   2847        return true;
   2848    }
   2849    if (codePoint >= 0x16100 && codePoint <= 0x16139) { // GURUNG KHEMA LETTER A .. GURUNG KHEMA DIGIT NINE
   2850        return true;
   2851    }
   2852    if (codePoint >= 0x16800 && codePoint <= 0x16A38) { // BAMUM LETTER PHASE-A NGKUE MFON .. BAMUM LETTER PHASE-F VUEQ
   2853        return true;
   2854    }
   2855    if (codePoint >= 0x16A40 && codePoint <= 0x16A5E) { // MRO LETTER TA .. MRO LETTER TEK
   2856        return true;
   2857    }
   2858    if (codePoint >= 0x16A60 && codePoint <= 0x16A69) { // MRO DIGIT ZERO .. MRO DIGIT NINE
   2859        return true;
   2860    }
   2861    if (codePoint >= 0x16A70 && codePoint <= 0x16ABE) { // TANGSA LETTER OZ .. TANGSA LETTER ZA
   2862        return true;
   2863    }
   2864    if (codePoint >= 0x16AC0 && codePoint <= 0x16AC9) { // TANGSA DIGIT ZERO .. TANGSA DIGIT NINE
   2865        return true;
   2866    }
   2867    if (codePoint >= 0x16AD0 && codePoint <= 0x16AED) { // BASSA VAH LETTER ENNI .. BASSA VAH LETTER I
   2868        return true;
   2869    }
   2870    if (codePoint >= 0x16AF0 && codePoint <= 0x16AF4) { // BASSA VAH COMBINING HIGH TONE .. BASSA VAH COMBINING HIGH-LOW TONE
   2871        return true;
   2872    }
   2873    if (codePoint >= 0x16B00 && codePoint <= 0x16B36) { // PAHAWH HMONG VOWEL KEEB .. PAHAWH HMONG MARK CIM TAUM
   2874        return true;
   2875    }
   2876    if (codePoint >= 0x16B40 && codePoint <= 0x16B43) { // PAHAWH HMONG SIGN VOS SEEV .. PAHAWH HMONG SIGN IB YAM
   2877        return true;
   2878    }
   2879    if (codePoint >= 0x16B50 && codePoint <= 0x16B59) { // PAHAWH HMONG DIGIT ZERO .. PAHAWH HMONG DIGIT NINE
   2880        return true;
   2881    }
   2882    if (codePoint >= 0x16B63 && codePoint <= 0x16B77) { // PAHAWH HMONG SIGN VOS LUB .. PAHAWH HMONG SIGN CIM NRES TOS
   2883        return true;
   2884    }
   2885    if (codePoint >= 0x16B7D && codePoint <= 0x16B8F) { // PAHAWH HMONG CLAN SIGN TSHEEJ .. PAHAWH HMONG CLAN SIGN VWJ
   2886        return true;
   2887    }
   2888    if (codePoint >= 0x16D40 && codePoint <= 0x16D6C) { // KIRAT RAI SIGN ANUSVARA .. KIRAT RAI SIGN SAAT
   2889        return true;
   2890    }
   2891    if (codePoint >= 0x16D70 && codePoint <= 0x16D79) { // KIRAT RAI DIGIT ZERO .. KIRAT RAI DIGIT NINE
   2892        return true;
   2893    }
   2894    if (codePoint >= 0x16E40 && codePoint <= 0x16E7F) { // MEDEFAIDRIN CAPITAL LETTER M .. MEDEFAIDRIN SMALL LETTER Y
   2895        return true;
   2896    }
   2897    if (codePoint >= 0x16EA0 && codePoint <= 0x16EB8) { // BERIA ERFE CAPITAL LETTER ARKAB .. BERIA ERFE CAPITAL LETTER AY
   2898        return true;
   2899    }
   2900    if (codePoint >= 0x16EBB && codePoint <= 0x16ED3) { // BERIA ERFE SMALL LETTER ARKAB .. BERIA ERFE SMALL LETTER AY
   2901        return true;
   2902    }
   2903    if (codePoint >= 0x16F00 && codePoint <= 0x16F4A) { // MIAO LETTER PA .. MIAO LETTER RTE
   2904        return true;
   2905    }
   2906    if (codePoint >= 0x16F4F && codePoint <= 0x16F87) { // MIAO SIGN CONSONANT MODIFIER BAR .. MIAO VOWEL SIGN UI
   2907        return true;
   2908    }
   2909    if (codePoint >= 0x16F8F && codePoint <= 0x16F9F) { // MIAO TONE RIGHT .. MIAO LETTER REFORMED TONE-8
   2910        return true;
   2911    }
   2912    if (codePoint >= 0x16FE0 && codePoint <= 0x16FE1) { // TANGUT ITERATION MARK .. NUSHU ITERATION MARK
   2913        return true;
   2914    }
   2915    if (codePoint >= 0x16FE3 && codePoint <= 0x16FE4) { // OLD CHINESE ITERATION MARK .. KHITAN SMALL SCRIPT FILLER
   2916        return true;
   2917    }
   2918    if (codePoint >= 0x16FF0 && codePoint <= 0x16FF6) { // VIETNAMESE ALTERNATE READING MARK CA .. YANGQIN SIGN SLOW TWO BEATS
   2919        return true;
   2920    }
   2921    if (codePoint >= 0x17000 && codePoint <= 0x18CD5) { // Tangut Ideograph .. KHITAN SMALL SCRIPT CHARACTER-18CD5
   2922        return true;
   2923    }
   2924    if (codePoint >= 0x18CFF && codePoint <= 0x18D1E) { // KHITAN SMALL SCRIPT CHARACTER-18CFF .. Tangut Ideograph Supplement
   2925        return true;
   2926    }
   2927    if (codePoint >= 0x18D80 && codePoint <= 0x18DF2) { // TANGUT COMPONENT-769 .. TANGUT COMPONENT-883
   2928        return true;
   2929    }
   2930    if (codePoint >= 0x1AFF0 && codePoint <= 0x1AFF3) { // KATAKANA LETTER MINNAN TONE-2 .. KATAKANA LETTER MINNAN TONE-5
   2931        return true;
   2932    }
   2933    if (codePoint >= 0x1AFF5 && codePoint <= 0x1AFFB) { // KATAKANA LETTER MINNAN TONE-7 .. KATAKANA LETTER MINNAN NASALIZED TONE-5
   2934        return true;
   2935    }
   2936    if (codePoint >= 0x1AFFD && codePoint <= 0x1AFFE) { // KATAKANA LETTER MINNAN NASALIZED TONE-7 .. KATAKANA LETTER MINNAN NASALIZED TONE-8
   2937        return true;
   2938    }
   2939    if (codePoint >= 0x1B000 && codePoint <= 0x1B122) { // KATAKANA LETTER ARCHAIC E .. KATAKANA LETTER ARCHAIC WU
   2940        return true;
   2941    }
   2942    if (codePoint >= 0x1B132 && codePoint <= 0x1B132) { // HIRAGANA LETTER SMALL KO .. HIRAGANA LETTER SMALL KO
   2943        return true;
   2944    }
   2945    if (codePoint >= 0x1B150 && codePoint <= 0x1B152) { // HIRAGANA LETTER SMALL WI .. HIRAGANA LETTER SMALL WO
   2946        return true;
   2947    }
   2948    if (codePoint >= 0x1B155 && codePoint <= 0x1B155) { // KATAKANA LETTER SMALL KO .. KATAKANA LETTER SMALL KO
   2949        return true;
   2950    }
   2951    if (codePoint >= 0x1B164 && codePoint <= 0x1B167) { // KATAKANA LETTER SMALL WI .. KATAKANA LETTER SMALL N
   2952        return true;
   2953    }
   2954    if (codePoint >= 0x1B170 && codePoint <= 0x1B2FB) { // NUSHU CHARACTER-1B170 .. NUSHU CHARACTER-1B2FB
   2955        return true;
   2956    }
   2957    if (codePoint >= 0x1BC00 && codePoint <= 0x1BC6A) { // DUPLOYAN LETTER H .. DUPLOYAN LETTER VOCALIC M
   2958        return true;
   2959    }
   2960    if (codePoint >= 0x1BC70 && codePoint <= 0x1BC7C) { // DUPLOYAN AFFIX LEFT HORIZONTAL SECANT .. DUPLOYAN AFFIX ATTACHED TANGENT HOOK
   2961        return true;
   2962    }
   2963    if (codePoint >= 0x1BC80 && codePoint <= 0x1BC88) { // DUPLOYAN AFFIX HIGH ACUTE .. DUPLOYAN AFFIX HIGH VERTICAL
   2964        return true;
   2965    }
   2966    if (codePoint >= 0x1BC90 && codePoint <= 0x1BC99) { // DUPLOYAN AFFIX LOW ACUTE .. DUPLOYAN AFFIX LOW ARROW
   2967        return true;
   2968    }
   2969    if (codePoint >= 0x1BC9D && codePoint <= 0x1BC9E) { // DUPLOYAN THICK LETTER SELECTOR .. DUPLOYAN DOUBLE MARK
   2970        return true;
   2971    }
   2972    if (codePoint >= 0x1CCF0 && codePoint <= 0x1CCF9) { // OUTLINED DIGIT ZERO .. OUTLINED DIGIT NINE
   2973        return true;
   2974    }
   2975    if (codePoint >= 0x1CF00 && codePoint <= 0x1CF2D) { // ZNAMENNY COMBINING MARK GORAZDO NIZKO S KRYZHEM ON LEFT .. ZNAMENNY COMBINING MARK KRYZH ON LEFT
   2976        return true;
   2977    }
   2978    if (codePoint >= 0x1CF30 && codePoint <= 0x1CF46) { // ZNAMENNY COMBINING TONAL RANGE MARK MRACHNO .. ZNAMENNY PRIZNAK MODIFIER ROG
   2979        return true;
   2980    }
   2981    if (codePoint >= 0x1D165 && codePoint <= 0x1D169) { // MUSICAL SYMBOL COMBINING STEM .. MUSICAL SYMBOL COMBINING TREMOLO-3
   2982        return true;
   2983    }
   2984    if (codePoint >= 0x1D16D && codePoint <= 0x1D172) { // MUSICAL SYMBOL COMBINING AUGMENTATION DOT .. MUSICAL SYMBOL COMBINING FLAG-5
   2985        return true;
   2986    }
   2987    if (codePoint >= 0x1D17B && codePoint <= 0x1D182) { // MUSICAL SYMBOL COMBINING ACCENT .. MUSICAL SYMBOL COMBINING LOURE
   2988        return true;
   2989    }
   2990    if (codePoint >= 0x1D185 && codePoint <= 0x1D18B) { // MUSICAL SYMBOL COMBINING DOIT .. MUSICAL SYMBOL COMBINING TRIPLE TONGUE
   2991        return true;
   2992    }
   2993    if (codePoint >= 0x1D1AA && codePoint <= 0x1D1AD) { // MUSICAL SYMBOL COMBINING DOWN BOW .. MUSICAL SYMBOL COMBINING SNAP PIZZICATO
   2994        return true;
   2995    }
   2996    if (codePoint >= 0x1D242 && codePoint <= 0x1D244) { // COMBINING GREEK MUSICAL TRISEME .. COMBINING GREEK MUSICAL PENTASEME
   2997        return true;
   2998    }
   2999    if (codePoint >= 0x1D400 && codePoint <= 0x1D454) { // MATHEMATICAL BOLD CAPITAL A .. MATHEMATICAL ITALIC SMALL G
   3000        return true;
   3001    }
   3002    if (codePoint >= 0x1D456 && codePoint <= 0x1D49C) { // MATHEMATICAL ITALIC SMALL I .. MATHEMATICAL SCRIPT CAPITAL A
   3003        return true;
   3004    }
   3005    if (codePoint >= 0x1D49E && codePoint <= 0x1D49F) { // MATHEMATICAL SCRIPT CAPITAL C .. MATHEMATICAL SCRIPT CAPITAL D
   3006        return true;
   3007    }
   3008    if (codePoint >= 0x1D4A2 && codePoint <= 0x1D4A2) { // MATHEMATICAL SCRIPT CAPITAL G .. MATHEMATICAL SCRIPT CAPITAL G
   3009        return true;
   3010    }
   3011    if (codePoint >= 0x1D4A5 && codePoint <= 0x1D4A6) { // MATHEMATICAL SCRIPT CAPITAL J .. MATHEMATICAL SCRIPT CAPITAL K
   3012        return true;
   3013    }
   3014    if (codePoint >= 0x1D4A9 && codePoint <= 0x1D4AC) { // MATHEMATICAL SCRIPT CAPITAL N .. MATHEMATICAL SCRIPT CAPITAL Q
   3015        return true;
   3016    }
   3017    if (codePoint >= 0x1D4AE && codePoint <= 0x1D4B9) { // MATHEMATICAL SCRIPT CAPITAL S .. MATHEMATICAL SCRIPT SMALL D
   3018        return true;
   3019    }
   3020    if (codePoint >= 0x1D4BB && codePoint <= 0x1D4BB) { // MATHEMATICAL SCRIPT SMALL F .. MATHEMATICAL SCRIPT SMALL F
   3021        return true;
   3022    }
   3023    if (codePoint >= 0x1D4BD && codePoint <= 0x1D4C3) { // MATHEMATICAL SCRIPT SMALL H .. MATHEMATICAL SCRIPT SMALL N
   3024        return true;
   3025    }
   3026    if (codePoint >= 0x1D4C5 && codePoint <= 0x1D505) { // MATHEMATICAL SCRIPT SMALL P .. MATHEMATICAL FRAKTUR CAPITAL B
   3027        return true;
   3028    }
   3029    if (codePoint >= 0x1D507 && codePoint <= 0x1D50A) { // MATHEMATICAL FRAKTUR CAPITAL D .. MATHEMATICAL FRAKTUR CAPITAL G
   3030        return true;
   3031    }
   3032    if (codePoint >= 0x1D50D && codePoint <= 0x1D514) { // MATHEMATICAL FRAKTUR CAPITAL J .. MATHEMATICAL FRAKTUR CAPITAL Q
   3033        return true;
   3034    }
   3035    if (codePoint >= 0x1D516 && codePoint <= 0x1D51C) { // MATHEMATICAL FRAKTUR CAPITAL S .. MATHEMATICAL FRAKTUR CAPITAL Y
   3036        return true;
   3037    }
   3038    if (codePoint >= 0x1D51E && codePoint <= 0x1D539) { // MATHEMATICAL FRAKTUR SMALL A .. MATHEMATICAL DOUBLE-STRUCK CAPITAL B
   3039        return true;
   3040    }
   3041    if (codePoint >= 0x1D53B && codePoint <= 0x1D53E) { // MATHEMATICAL DOUBLE-STRUCK CAPITAL D .. MATHEMATICAL DOUBLE-STRUCK CAPITAL G
   3042        return true;
   3043    }
   3044    if (codePoint >= 0x1D540 && codePoint <= 0x1D544) { // MATHEMATICAL DOUBLE-STRUCK CAPITAL I .. MATHEMATICAL DOUBLE-STRUCK CAPITAL M
   3045        return true;
   3046    }
   3047    if (codePoint >= 0x1D546 && codePoint <= 0x1D546) { // MATHEMATICAL DOUBLE-STRUCK CAPITAL O .. MATHEMATICAL DOUBLE-STRUCK CAPITAL O
   3048        return true;
   3049    }
   3050    if (codePoint >= 0x1D54A && codePoint <= 0x1D550) { // MATHEMATICAL DOUBLE-STRUCK CAPITAL S .. MATHEMATICAL DOUBLE-STRUCK CAPITAL Y
   3051        return true;
   3052    }
   3053    if (codePoint >= 0x1D552 && codePoint <= 0x1D6A5) { // MATHEMATICAL DOUBLE-STRUCK SMALL A .. MATHEMATICAL ITALIC SMALL DOTLESS J
   3054        return true;
   3055    }
   3056    if (codePoint >= 0x1D6A8 && codePoint <= 0x1D6C0) { // MATHEMATICAL BOLD CAPITAL ALPHA .. MATHEMATICAL BOLD CAPITAL OMEGA
   3057        return true;
   3058    }
   3059    if (codePoint >= 0x1D6C2 && codePoint <= 0x1D6DA) { // MATHEMATICAL BOLD SMALL ALPHA .. MATHEMATICAL BOLD SMALL OMEGA
   3060        return true;
   3061    }
   3062    if (codePoint >= 0x1D6DC && codePoint <= 0x1D6FA) { // MATHEMATICAL BOLD EPSILON SYMBOL .. MATHEMATICAL ITALIC CAPITAL OMEGA
   3063        return true;
   3064    }
   3065    if (codePoint >= 0x1D6FC && codePoint <= 0x1D714) { // MATHEMATICAL ITALIC SMALL ALPHA .. MATHEMATICAL ITALIC SMALL OMEGA
   3066        return true;
   3067    }
   3068    if (codePoint >= 0x1D716 && codePoint <= 0x1D734) { // MATHEMATICAL ITALIC EPSILON SYMBOL .. MATHEMATICAL BOLD ITALIC CAPITAL OMEGA
   3069        return true;
   3070    }
   3071    if (codePoint >= 0x1D736 && codePoint <= 0x1D74E) { // MATHEMATICAL BOLD ITALIC SMALL ALPHA .. MATHEMATICAL BOLD ITALIC SMALL OMEGA
   3072        return true;
   3073    }
   3074    if (codePoint >= 0x1D750 && codePoint <= 0x1D76E) { // MATHEMATICAL BOLD ITALIC EPSILON SYMBOL .. MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA
   3075        return true;
   3076    }
   3077    if (codePoint >= 0x1D770 && codePoint <= 0x1D788) { // MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA .. MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA
   3078        return true;
   3079    }
   3080    if (codePoint >= 0x1D78A && codePoint <= 0x1D7A8) { // MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL .. MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA
   3081        return true;
   3082    }
   3083    if (codePoint >= 0x1D7AA && codePoint <= 0x1D7C2) { // MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA .. MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA
   3084        return true;
   3085    }
   3086    if (codePoint >= 0x1D7C4 && codePoint <= 0x1D7CB) { // MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL .. MATHEMATICAL BOLD SMALL DIGAMMA
   3087        return true;
   3088    }
   3089    if (codePoint >= 0x1D7CE && codePoint <= 0x1D7FF) { // MATHEMATICAL BOLD DIGIT ZERO .. MATHEMATICAL MONOSPACE DIGIT NINE
   3090        return true;
   3091    }
   3092    if (codePoint >= 0x1DA00 && codePoint <= 0x1DA36) { // SIGNWRITING HEAD RIM .. SIGNWRITING AIR SUCKING IN
   3093        return true;
   3094    }
   3095    if (codePoint >= 0x1DA3B && codePoint <= 0x1DA6C) { // SIGNWRITING MOUTH CLOSED NEUTRAL .. SIGNWRITING EXCITEMENT
   3096        return true;
   3097    }
   3098    if (codePoint >= 0x1DA75 && codePoint <= 0x1DA75) { // SIGNWRITING UPPER BODY TILTING FROM HIP JOINTS .. SIGNWRITING UPPER BODY TILTING FROM HIP JOINTS
   3099        return true;
   3100    }
   3101    if (codePoint >= 0x1DA84 && codePoint <= 0x1DA84) { // SIGNWRITING LOCATION HEAD NECK .. SIGNWRITING LOCATION HEAD NECK
   3102        return true;
   3103    }
   3104    if (codePoint >= 0x1DA9B && codePoint <= 0x1DA9F) { // SIGNWRITING FILL MODIFIER-2 .. SIGNWRITING FILL MODIFIER-6
   3105        return true;
   3106    }
   3107    if (codePoint >= 0x1DAA1 && codePoint <= 0x1DAAF) { // SIGNWRITING ROTATION MODIFIER-2 .. SIGNWRITING ROTATION MODIFIER-16
   3108        return true;
   3109    }
   3110    if (codePoint >= 0x1DF00 && codePoint <= 0x1DF1E) { // LATIN SMALL LETTER FENG DIGRAPH WITH TRILL .. LATIN SMALL LETTER S WITH CURL
   3111        return true;
   3112    }
   3113    if (codePoint >= 0x1DF25 && codePoint <= 0x1DF2A) { // LATIN SMALL LETTER D WITH MID-HEIGHT LEFT HOOK .. LATIN SMALL LETTER T WITH MID-HEIGHT LEFT HOOK
   3114        return true;
   3115    }
   3116    if (codePoint >= 0x1E000 && codePoint <= 0x1E006) { // COMBINING GLAGOLITIC LETTER AZU .. COMBINING GLAGOLITIC LETTER ZHIVETE
   3117        return true;
   3118    }
   3119    if (codePoint >= 0x1E008 && codePoint <= 0x1E018) { // COMBINING GLAGOLITIC LETTER ZEMLJA .. COMBINING GLAGOLITIC LETTER HERU
   3120        return true;
   3121    }
   3122    if (codePoint >= 0x1E01B && codePoint <= 0x1E021) { // COMBINING GLAGOLITIC LETTER SHTA .. COMBINING GLAGOLITIC LETTER YATI
   3123        return true;
   3124    }
   3125    if (codePoint >= 0x1E023 && codePoint <= 0x1E024) { // COMBINING GLAGOLITIC LETTER YU .. COMBINING GLAGOLITIC LETTER SMALL YUS
   3126        return true;
   3127    }
   3128    if (codePoint >= 0x1E026 && codePoint <= 0x1E02A) { // COMBINING GLAGOLITIC LETTER YO .. COMBINING GLAGOLITIC LETTER FITA
   3129        return true;
   3130    }
   3131    if (codePoint >= 0x1E030 && codePoint <= 0x1E06D) { // MODIFIER LETTER CYRILLIC SMALL A .. MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE
   3132        return true;
   3133    }
   3134    if (codePoint >= 0x1E08F && codePoint <= 0x1E08F) { // COMBINING CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I .. COMBINING CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
   3135        return true;
   3136    }
   3137    if (codePoint >= 0x1E100 && codePoint <= 0x1E12C) { // NYIAKENG PUACHUE HMONG LETTER MA .. NYIAKENG PUACHUE HMONG LETTER W
   3138        return true;
   3139    }
   3140    if (codePoint >= 0x1E130 && codePoint <= 0x1E13D) { // NYIAKENG PUACHUE HMONG TONE-B .. NYIAKENG PUACHUE HMONG SYLLABLE LENGTHENER
   3141        return true;
   3142    }
   3143    if (codePoint >= 0x1E140 && codePoint <= 0x1E149) { // NYIAKENG PUACHUE HMONG DIGIT ZERO .. NYIAKENG PUACHUE HMONG DIGIT NINE
   3144        return true;
   3145    }
   3146    if (codePoint >= 0x1E14E && codePoint <= 0x1E14E) { // NYIAKENG PUACHUE HMONG LOGOGRAM NYAJ .. NYIAKENG PUACHUE HMONG LOGOGRAM NYAJ
   3147        return true;
   3148    }
   3149    if (codePoint >= 0x1E290 && codePoint <= 0x1E2AE) { // TOTO LETTER PA .. TOTO SIGN RISING TONE
   3150        return true;
   3151    }
   3152    if (codePoint >= 0x1E2C0 && codePoint <= 0x1E2F9) { // WANCHO LETTER AA .. WANCHO DIGIT NINE
   3153        return true;
   3154    }
   3155    if (codePoint >= 0x1E4D0 && codePoint <= 0x1E4F9) { // NAG MUNDARI LETTER O .. NAG MUNDARI DIGIT NINE
   3156        return true;
   3157    }
   3158    if (codePoint >= 0x1E5D0 && codePoint <= 0x1E5FA) { // OL ONAL LETTER O .. OL ONAL DIGIT NINE
   3159        return true;
   3160    }
   3161    if (codePoint >= 0x1E6C0 && codePoint <= 0x1E6DE) { // TAI YO LETTER LOW KO .. TAI YO LETTER HIGH KVO
   3162        return true;
   3163    }
   3164    if (codePoint >= 0x1E6E0 && codePoint <= 0x1E6F5) { // TAI YO LETTER AA .. TAI YO SIGN OM
   3165        return true;
   3166    }
   3167    if (codePoint >= 0x1E6FE && codePoint <= 0x1E6FF) { // TAI YO SYMBOL MUEANG .. TAI YO XAM LAI
   3168        return true;
   3169    }
   3170    if (codePoint >= 0x1E7E0 && codePoint <= 0x1E7E6) { // ETHIOPIC SYLLABLE HHYA .. ETHIOPIC SYLLABLE HHYO
   3171        return true;
   3172    }
   3173    if (codePoint >= 0x1E7E8 && codePoint <= 0x1E7EB) { // ETHIOPIC SYLLABLE GURAGE HHWA .. ETHIOPIC SYLLABLE HHWE
   3174        return true;
   3175    }
   3176    if (codePoint >= 0x1E7ED && codePoint <= 0x1E7EE) { // ETHIOPIC SYLLABLE GURAGE MWI .. ETHIOPIC SYLLABLE GURAGE MWEE
   3177        return true;
   3178    }
   3179    if (codePoint >= 0x1E7F0 && codePoint <= 0x1E7FE) { // ETHIOPIC SYLLABLE GURAGE QWI .. ETHIOPIC SYLLABLE GURAGE PWEE
   3180        return true;
   3181    }
   3182    if (codePoint >= 0x1E800 && codePoint <= 0x1E8C4) { // MENDE KIKAKUI SYLLABLE M001 KI .. MENDE KIKAKUI SYLLABLE M060 NYON
   3183        return true;
   3184    }
   3185    if (codePoint >= 0x1E8D0 && codePoint <= 0x1E8D6) { // MENDE KIKAKUI COMBINING NUMBER TEENS .. MENDE KIKAKUI COMBINING NUMBER MILLIONS
   3186        return true;
   3187    }
   3188    if (codePoint >= 0x1E900 && codePoint <= 0x1E94B) { // ADLAM CAPITAL LETTER ALIF .. ADLAM NASALIZATION MARK
   3189        return true;
   3190    }
   3191    if (codePoint >= 0x1E950 && codePoint <= 0x1E959) { // ADLAM DIGIT ZERO .. ADLAM DIGIT NINE
   3192        return true;
   3193    }
   3194    if (codePoint >= 0x1EE00 && codePoint <= 0x1EE03) { // ARABIC MATHEMATICAL ALEF .. ARABIC MATHEMATICAL DAL
   3195        return true;
   3196    }
   3197    if (codePoint >= 0x1EE05 && codePoint <= 0x1EE1F) { // ARABIC MATHEMATICAL WAW .. ARABIC MATHEMATICAL DOTLESS QAF
   3198        return true;
   3199    }
   3200    if (codePoint >= 0x1EE21 && codePoint <= 0x1EE22) { // ARABIC MATHEMATICAL INITIAL BEH .. ARABIC MATHEMATICAL INITIAL JEEM
   3201        return true;
   3202    }
   3203    if (codePoint >= 0x1EE24 && codePoint <= 0x1EE24) { // ARABIC MATHEMATICAL INITIAL HEH .. ARABIC MATHEMATICAL INITIAL HEH
   3204        return true;
   3205    }
   3206    if (codePoint >= 0x1EE27 && codePoint <= 0x1EE27) { // ARABIC MATHEMATICAL INITIAL HAH .. ARABIC MATHEMATICAL INITIAL HAH
   3207        return true;
   3208    }
   3209    if (codePoint >= 0x1EE29 && codePoint <= 0x1EE32) { // ARABIC MATHEMATICAL INITIAL YEH .. ARABIC MATHEMATICAL INITIAL QAF
   3210        return true;
   3211    }
   3212    if (codePoint >= 0x1EE34 && codePoint <= 0x1EE37) { // ARABIC MATHEMATICAL INITIAL SHEEN .. ARABIC MATHEMATICAL INITIAL KHAH
   3213        return true;
   3214    }
   3215    if (codePoint >= 0x1EE39 && codePoint <= 0x1EE39) { // ARABIC MATHEMATICAL INITIAL DAD .. ARABIC MATHEMATICAL INITIAL DAD
   3216        return true;
   3217    }
   3218    if (codePoint >= 0x1EE3B && codePoint <= 0x1EE3B) { // ARABIC MATHEMATICAL INITIAL GHAIN .. ARABIC MATHEMATICAL INITIAL GHAIN
   3219        return true;
   3220    }
   3221    if (codePoint >= 0x1EE42 && codePoint <= 0x1EE42) { // ARABIC MATHEMATICAL TAILED JEEM .. ARABIC MATHEMATICAL TAILED JEEM
   3222        return true;
   3223    }
   3224    if (codePoint >= 0x1EE47 && codePoint <= 0x1EE47) { // ARABIC MATHEMATICAL TAILED HAH .. ARABIC MATHEMATICAL TAILED HAH
   3225        return true;
   3226    }
   3227    if (codePoint >= 0x1EE49 && codePoint <= 0x1EE49) { // ARABIC MATHEMATICAL TAILED YEH .. ARABIC MATHEMATICAL TAILED YEH
   3228        return true;
   3229    }
   3230    if (codePoint >= 0x1EE4B && codePoint <= 0x1EE4B) { // ARABIC MATHEMATICAL TAILED LAM .. ARABIC MATHEMATICAL TAILED LAM
   3231        return true;
   3232    }
   3233    if (codePoint >= 0x1EE4D && codePoint <= 0x1EE4F) { // ARABIC MATHEMATICAL TAILED NOON .. ARABIC MATHEMATICAL TAILED AIN
   3234        return true;
   3235    }
   3236    if (codePoint >= 0x1EE51 && codePoint <= 0x1EE52) { // ARABIC MATHEMATICAL TAILED SAD .. ARABIC MATHEMATICAL TAILED QAF
   3237        return true;
   3238    }
   3239    if (codePoint >= 0x1EE54 && codePoint <= 0x1EE54) { // ARABIC MATHEMATICAL TAILED SHEEN .. ARABIC MATHEMATICAL TAILED SHEEN
   3240        return true;
   3241    }
   3242    if (codePoint >= 0x1EE57 && codePoint <= 0x1EE57) { // ARABIC MATHEMATICAL TAILED KHAH .. ARABIC MATHEMATICAL TAILED KHAH
   3243        return true;
   3244    }
   3245    if (codePoint >= 0x1EE59 && codePoint <= 0x1EE59) { // ARABIC MATHEMATICAL TAILED DAD .. ARABIC MATHEMATICAL TAILED DAD
   3246        return true;
   3247    }
   3248    if (codePoint >= 0x1EE5B && codePoint <= 0x1EE5B) { // ARABIC MATHEMATICAL TAILED GHAIN .. ARABIC MATHEMATICAL TAILED GHAIN
   3249        return true;
   3250    }
   3251    if (codePoint >= 0x1EE5D && codePoint <= 0x1EE5D) { // ARABIC MATHEMATICAL TAILED DOTLESS NOON .. ARABIC MATHEMATICAL TAILED DOTLESS NOON
   3252        return true;
   3253    }
   3254    if (codePoint >= 0x1EE5F && codePoint <= 0x1EE5F) { // ARABIC MATHEMATICAL TAILED DOTLESS QAF .. ARABIC MATHEMATICAL TAILED DOTLESS QAF
   3255        return true;
   3256    }
   3257    if (codePoint >= 0x1EE61 && codePoint <= 0x1EE62) { // ARABIC MATHEMATICAL STRETCHED BEH .. ARABIC MATHEMATICAL STRETCHED JEEM
   3258        return true;
   3259    }
   3260    if (codePoint >= 0x1EE64 && codePoint <= 0x1EE64) { // ARABIC MATHEMATICAL STRETCHED HEH .. ARABIC MATHEMATICAL STRETCHED HEH
   3261        return true;
   3262    }
   3263    if (codePoint >= 0x1EE67 && codePoint <= 0x1EE6A) { // ARABIC MATHEMATICAL STRETCHED HAH .. ARABIC MATHEMATICAL STRETCHED KAF
   3264        return true;
   3265    }
   3266    if (codePoint >= 0x1EE6C && codePoint <= 0x1EE72) { // ARABIC MATHEMATICAL STRETCHED MEEM .. ARABIC MATHEMATICAL STRETCHED QAF
   3267        return true;
   3268    }
   3269    if (codePoint >= 0x1EE74 && codePoint <= 0x1EE77) { // ARABIC MATHEMATICAL STRETCHED SHEEN .. ARABIC MATHEMATICAL STRETCHED KHAH
   3270        return true;
   3271    }
   3272    if (codePoint >= 0x1EE79 && codePoint <= 0x1EE7C) { // ARABIC MATHEMATICAL STRETCHED DAD .. ARABIC MATHEMATICAL STRETCHED DOTLESS BEH
   3273        return true;
   3274    }
   3275    if (codePoint >= 0x1EE7E && codePoint <= 0x1EE7E) { // ARABIC MATHEMATICAL STRETCHED DOTLESS FEH .. ARABIC MATHEMATICAL STRETCHED DOTLESS FEH
   3276        return true;
   3277    }
   3278    if (codePoint >= 0x1EE80 && codePoint <= 0x1EE89) { // ARABIC MATHEMATICAL LOOPED ALEF .. ARABIC MATHEMATICAL LOOPED YEH
   3279        return true;
   3280    }
   3281    if (codePoint >= 0x1EE8B && codePoint <= 0x1EE9B) { // ARABIC MATHEMATICAL LOOPED LAM .. ARABIC MATHEMATICAL LOOPED GHAIN
   3282        return true;
   3283    }
   3284    if (codePoint >= 0x1EEA1 && codePoint <= 0x1EEA3) { // ARABIC MATHEMATICAL DOUBLE-STRUCK BEH .. ARABIC MATHEMATICAL DOUBLE-STRUCK DAL
   3285        return true;
   3286    }
   3287    if (codePoint >= 0x1EEA5 && codePoint <= 0x1EEA9) { // ARABIC MATHEMATICAL DOUBLE-STRUCK WAW .. ARABIC MATHEMATICAL DOUBLE-STRUCK YEH
   3288        return true;
   3289    }
   3290    if (codePoint >= 0x1EEAB && codePoint <= 0x1EEBB) { // ARABIC MATHEMATICAL DOUBLE-STRUCK LAM .. ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN
   3291        return true;
   3292    }
   3293    if (codePoint >= 0x1FBF0 && codePoint <= 0x1FBF9) { // SEGMENTED DIGIT ZERO .. SEGMENTED DIGIT NINE
   3294        return true;
   3295    }
   3296    if (codePoint >= 0x20000 && codePoint <= 0x2A6DF) { // CJK Ideograph Extension B .. CJK Ideograph Extension B
   3297        return true;
   3298    }
   3299    if (codePoint >= 0x2A700 && codePoint <= 0x2B81D) { // CJK Ideograph Extension C .. CJK Ideograph Extension D
   3300        return true;
   3301    }
   3302    if (codePoint >= 0x2B820 && codePoint <= 0x2CEAD) { // CJK Ideograph Extension E .. CJK Ideograph Extension E
   3303        return true;
   3304    }
   3305    if (codePoint >= 0x2CEB0 && codePoint <= 0x2EBE0) { // CJK Ideograph Extension F .. CJK Ideograph Extension F
   3306        return true;
   3307    }
   3308    if (codePoint >= 0x2EBF0 && codePoint <= 0x2EE5D) { // CJK Ideograph Extension I .. CJK Ideograph Extension I
   3309        return true;
   3310    }
   3311    if (codePoint >= 0x2F800 && codePoint <= 0x2FA1D) { // CJK COMPATIBILITY IDEOGRAPH-2F800 .. CJK COMPATIBILITY IDEOGRAPH-2FA1D
   3312        return true;
   3313    }
   3314    if (codePoint >= 0x30000 && codePoint <= 0x3134A) { // CJK Ideograph Extension G .. CJK Ideograph Extension G
   3315        return true;
   3316    }
   3317    if (codePoint >= 0x31350 && codePoint <= 0x33479) { // CJK Ideograph Extension H .. CJK Ideograph Extension J
   3318        return true;
   3319    }
   3320    if (codePoint >= 0xE0100 && codePoint <= 0xE01EF) { // VARIATION SELECTOR-17 .. VARIATION SELECTOR-256
   3321        return true;
   3322    }
   3323    return false;
   3324 }
   3325 
   3326 bool
   3327 js::unicode::ChangesWhenUpperCasedSpecialCasing(char16_t ch)
   3328 {
   3329    if (ch < 0x00DF || ch > 0xFB17) {
   3330        return false;
   3331    }
   3332    if (ch <= 0x0587) {
   3333        // U+00DF LATIN SMALL LETTER SHARP S
   3334        // U+0149 LATIN SMALL LETTER N PRECEDED BY APOSTROPHE (LATIN SMALL LETTER APOSTROPHE N)
   3335        // U+01F0 LATIN SMALL LETTER J WITH CARON (LATIN SMALL LETTER J HACEK)
   3336        // U+0390 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS (GREEK SMALL LETTER IOTA DIAERESIS TONOS)
   3337        // U+03B0 GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS (GREEK SMALL LETTER UPSILON DIAERESIS TONOS)
   3338        // U+0587 ARMENIAN SMALL LIGATURE ECH YIWN
   3339        return ch == 0x00DF || ch == 0x0149 || ch == 0x01F0 || ch == 0x0390 || ch == 0x03B0 ||
   3340               ch == 0x0587;
   3341    }
   3342    if (ch <= 0x1FFC) {
   3343        // U+1E96 LATIN SMALL LETTER H WITH LINE BELOW .. U+1E9A LATIN SMALL LETTER A WITH RIGHT HALF RING
   3344        if (ch <= 0x1E9A) {
   3345            return ch >= 0x1E96;
   3346        }
   3347        if (ch < 0x1F50) {
   3348            return false;
   3349        }
   3350        // U+1F50 GREEK SMALL LETTER UPSILON WITH PSILI
   3351        // U+1F52 GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA
   3352        // U+1F54 GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA
   3353        // U+1F56 GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI
   3354        // U+1F80 GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI .. U+1FAF GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
   3355        // U+1FB2 GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI .. U+1FB4 GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
   3356        // U+1FB6 GREEK SMALL LETTER ALPHA WITH PERISPOMENI .. U+1FB7 GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI
   3357        // U+1FBC GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI
   3358        // U+1FC2 GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI .. U+1FC4 GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
   3359        // U+1FC6 GREEK SMALL LETTER ETA WITH PERISPOMENI .. U+1FC7 GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI
   3360        // U+1FCC GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI
   3361        // U+1FD2 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA .. U+1FD3 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA
   3362        // U+1FD6 GREEK SMALL LETTER IOTA WITH PERISPOMENI .. U+1FD7 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI
   3363        // U+1FE2 GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA .. U+1FE4 GREEK SMALL LETTER RHO WITH PSILI
   3364        // U+1FE6 GREEK SMALL LETTER UPSILON WITH PERISPOMENI .. U+1FE7 GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI
   3365        // U+1FF2 GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI .. U+1FF4 GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
   3366        // U+1FF6 GREEK SMALL LETTER OMEGA WITH PERISPOMENI .. U+1FF7 GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI
   3367        // U+1FFC GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
   3368        return ch == 0x1F50 || ch == 0x1F52 || ch == 0x1F54 || ch == 0x1F56 ||
   3369               (ch >= 0x1F80 && ch <= 0x1FAF) || (ch >= 0x1FB2 && ch <= 0x1FB4) ||
   3370               (ch >= 0x1FB6 && ch <= 0x1FB7) || ch == 0x1FBC || (ch >= 0x1FC2 && ch <= 0x1FC4) ||
   3371               (ch >= 0x1FC6 && ch <= 0x1FC7) || ch == 0x1FCC || (ch >= 0x1FD2 && ch <= 0x1FD3) ||
   3372               (ch >= 0x1FD6 && ch <= 0x1FD7) || (ch >= 0x1FE2 && ch <= 0x1FE4) ||
   3373               (ch >= 0x1FE6 && ch <= 0x1FE7) || (ch >= 0x1FF2 && ch <= 0x1FF4) ||
   3374               (ch >= 0x1FF6 && ch <= 0x1FF7) || ch == 0x1FFC;
   3375    }
   3376    if (ch < 0xFB00) {
   3377        return false;
   3378    }
   3379    // U+FB00 LATIN SMALL LIGATURE FF .. U+FB06 LATIN SMALL LIGATURE ST
   3380    // U+FB13 ARMENIAN SMALL LIGATURE MEN NOW .. U+FB17 ARMENIAN SMALL LIGATURE MEN XEH
   3381    return (ch >= 0xFB00 && ch <= 0xFB06) || (ch >= 0xFB13 && ch <= 0xFB17);
   3382 }
   3383 
   3384 size_t
   3385 js::unicode::LengthUpperCaseSpecialCasing(char16_t ch)
   3386 {
   3387    switch(ch) {
   3388      case 0x00DF: return 2; // LATIN SMALL LETTER SHARP S
   3389      case 0x0149: return 2; // LATIN SMALL LETTER N PRECEDED BY APOSTROPHE (LATIN SMALL LETTER APOSTROPHE N)
   3390      case 0x01F0: return 2; // LATIN SMALL LETTER J WITH CARON (LATIN SMALL LETTER J HACEK)
   3391      case 0x0390: return 3; // GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS (GREEK SMALL LETTER IOTA DIAERESIS TONOS)
   3392      case 0x03B0: return 3; // GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS (GREEK SMALL LETTER UPSILON DIAERESIS TONOS)
   3393      case 0x0587: return 2; // ARMENIAN SMALL LIGATURE ECH YIWN
   3394      case 0x1E96: return 2; // LATIN SMALL LETTER H WITH LINE BELOW
   3395      case 0x1E97: return 2; // LATIN SMALL LETTER T WITH DIAERESIS
   3396      case 0x1E98: return 2; // LATIN SMALL LETTER W WITH RING ABOVE
   3397      case 0x1E99: return 2; // LATIN SMALL LETTER Y WITH RING ABOVE
   3398      case 0x1E9A: return 2; // LATIN SMALL LETTER A WITH RIGHT HALF RING
   3399      case 0x1F50: return 2; // GREEK SMALL LETTER UPSILON WITH PSILI
   3400      case 0x1F52: return 3; // GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA
   3401      case 0x1F54: return 3; // GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA
   3402      case 0x1F56: return 3; // GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI
   3403      case 0x1F80: return 2; // GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI
   3404      case 0x1F81: return 2; // GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI
   3405      case 0x1F82: return 2; // GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI
   3406      case 0x1F83: return 2; // GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI
   3407      case 0x1F84: return 2; // GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI
   3408      case 0x1F85: return 2; // GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI
   3409      case 0x1F86: return 2; // GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
   3410      case 0x1F87: return 2; // GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
   3411      case 0x1F88: return 2; // GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI
   3412      case 0x1F89: return 2; // GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI
   3413      case 0x1F8A: return 2; // GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI
   3414      case 0x1F8B: return 2; // GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI
   3415      case 0x1F8C: return 2; // GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
   3416      case 0x1F8D: return 2; // GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
   3417      case 0x1F8E: return 2; // GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
   3418      case 0x1F8F: return 2; // GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
   3419      case 0x1F90: return 2; // GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI
   3420      case 0x1F91: return 2; // GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI
   3421      case 0x1F92: return 2; // GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI
   3422      case 0x1F93: return 2; // GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI
   3423      case 0x1F94: return 2; // GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI
   3424      case 0x1F95: return 2; // GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI
   3425      case 0x1F96: return 2; // GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
   3426      case 0x1F97: return 2; // GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
   3427      case 0x1F98: return 2; // GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI
   3428      case 0x1F99: return 2; // GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI
   3429      case 0x1F9A: return 2; // GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI
   3430      case 0x1F9B: return 2; // GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI
   3431      case 0x1F9C: return 2; // GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
   3432      case 0x1F9D: return 2; // GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
   3433      case 0x1F9E: return 2; // GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
   3434      case 0x1F9F: return 2; // GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
   3435      case 0x1FA0: return 2; // GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI
   3436      case 0x1FA1: return 2; // GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI
   3437      case 0x1FA2: return 2; // GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI
   3438      case 0x1FA3: return 2; // GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI
   3439      case 0x1FA4: return 2; // GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI
   3440      case 0x1FA5: return 2; // GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
   3441      case 0x1FA6: return 2; // GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
   3442      case 0x1FA7: return 2; // GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
   3443      case 0x1FA8: return 2; // GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI
   3444      case 0x1FA9: return 2; // GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI
   3445      case 0x1FAA: return 2; // GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI
   3446      case 0x1FAB: return 2; // GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI
   3447      case 0x1FAC: return 2; // GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
   3448      case 0x1FAD: return 2; // GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
   3449      case 0x1FAE: return 2; // GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
   3450      case 0x1FAF: return 2; // GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
   3451      case 0x1FB2: return 2; // GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI
   3452      case 0x1FB3: return 2; // GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI
   3453      case 0x1FB4: return 2; // GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
   3454      case 0x1FB6: return 2; // GREEK SMALL LETTER ALPHA WITH PERISPOMENI
   3455      case 0x1FB7: return 3; // GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI
   3456      case 0x1FBC: return 2; // GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI
   3457      case 0x1FC2: return 2; // GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI
   3458      case 0x1FC3: return 2; // GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI
   3459      case 0x1FC4: return 2; // GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
   3460      case 0x1FC6: return 2; // GREEK SMALL LETTER ETA WITH PERISPOMENI
   3461      case 0x1FC7: return 3; // GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI
   3462      case 0x1FCC: return 2; // GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI
   3463      case 0x1FD2: return 3; // GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA
   3464      case 0x1FD3: return 3; // GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA
   3465      case 0x1FD6: return 2; // GREEK SMALL LETTER IOTA WITH PERISPOMENI
   3466      case 0x1FD7: return 3; // GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI
   3467      case 0x1FE2: return 3; // GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA
   3468      case 0x1FE3: return 3; // GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA
   3469      case 0x1FE4: return 2; // GREEK SMALL LETTER RHO WITH PSILI
   3470      case 0x1FE6: return 2; // GREEK SMALL LETTER UPSILON WITH PERISPOMENI
   3471      case 0x1FE7: return 3; // GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI
   3472      case 0x1FF2: return 2; // GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI
   3473      case 0x1FF3: return 2; // GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI
   3474      case 0x1FF4: return 2; // GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
   3475      case 0x1FF6: return 2; // GREEK SMALL LETTER OMEGA WITH PERISPOMENI
   3476      case 0x1FF7: return 3; // GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI
   3477      case 0x1FFC: return 2; // GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
   3478      case 0xFB00: return 2; // LATIN SMALL LIGATURE FF
   3479      case 0xFB01: return 2; // LATIN SMALL LIGATURE FI
   3480      case 0xFB02: return 2; // LATIN SMALL LIGATURE FL
   3481      case 0xFB03: return 3; // LATIN SMALL LIGATURE FFI
   3482      case 0xFB04: return 3; // LATIN SMALL LIGATURE FFL
   3483      case 0xFB05: return 2; // LATIN SMALL LIGATURE LONG S T
   3484      case 0xFB06: return 2; // LATIN SMALL LIGATURE ST
   3485      case 0xFB13: return 2; // ARMENIAN SMALL LIGATURE MEN NOW
   3486      case 0xFB14: return 2; // ARMENIAN SMALL LIGATURE MEN ECH
   3487      case 0xFB15: return 2; // ARMENIAN SMALL LIGATURE MEN INI
   3488      case 0xFB16: return 2; // ARMENIAN SMALL LIGATURE VEW NOW
   3489      case 0xFB17: return 2; // ARMENIAN SMALL LIGATURE MEN XEH
   3490    }
   3491 
   3492    MOZ_ASSERT_UNREACHABLE("Bad character input.");
   3493    return 0;
   3494 }
   3495 
   3496 void
   3497 js::unicode::AppendUpperCaseSpecialCasing(char16_t ch, char16_t* elements, size_t* index)
   3498 {
   3499    switch(ch) {
   3500      case 0x00DF: // LATIN SMALL LETTER SHARP S
   3501        elements[(*index)++] = 0x0053; // LATIN CAPITAL LETTER S
   3502        elements[(*index)++] = 0x0053; // LATIN CAPITAL LETTER S
   3503        return;
   3504      case 0x0149: // LATIN SMALL LETTER N PRECEDED BY APOSTROPHE (LATIN SMALL LETTER APOSTROPHE N)
   3505        elements[(*index)++] = 0x02BC; // MODIFIER LETTER APOSTROPHE
   3506        elements[(*index)++] = 0x004E; // LATIN CAPITAL LETTER N
   3507        return;
   3508      case 0x01F0: // LATIN SMALL LETTER J WITH CARON (LATIN SMALL LETTER J HACEK)
   3509        elements[(*index)++] = 0x004A; // LATIN CAPITAL LETTER J
   3510        elements[(*index)++] = 0x030C; // COMBINING CARON (NON-SPACING HACEK)
   3511        return;
   3512      case 0x0390: // GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS (GREEK SMALL LETTER IOTA DIAERESIS TONOS)
   3513        elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
   3514        elements[(*index)++] = 0x0308; // COMBINING DIAERESIS (NON-SPACING DIAERESIS)
   3515        elements[(*index)++] = 0x0301; // COMBINING ACUTE ACCENT (NON-SPACING ACUTE)
   3516        return;
   3517      case 0x03B0: // GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS (GREEK SMALL LETTER UPSILON DIAERESIS TONOS)
   3518        elements[(*index)++] = 0x03A5; // GREEK CAPITAL LETTER UPSILON
   3519        elements[(*index)++] = 0x0308; // COMBINING DIAERESIS (NON-SPACING DIAERESIS)
   3520        elements[(*index)++] = 0x0301; // COMBINING ACUTE ACCENT (NON-SPACING ACUTE)
   3521        return;
   3522      case 0x0587: // ARMENIAN SMALL LIGATURE ECH YIWN
   3523        elements[(*index)++] = 0x0535; // ARMENIAN CAPITAL LETTER ECH
   3524        elements[(*index)++] = 0x0552; // ARMENIAN CAPITAL LETTER YIWN
   3525        return;
   3526      case 0x1E96: // LATIN SMALL LETTER H WITH LINE BELOW
   3527        elements[(*index)++] = 0x0048; // LATIN CAPITAL LETTER H
   3528        elements[(*index)++] = 0x0331; // COMBINING MACRON BELOW (NON-SPACING MACRON BELOW)
   3529        return;
   3530      case 0x1E97: // LATIN SMALL LETTER T WITH DIAERESIS
   3531        elements[(*index)++] = 0x0054; // LATIN CAPITAL LETTER T
   3532        elements[(*index)++] = 0x0308; // COMBINING DIAERESIS (NON-SPACING DIAERESIS)
   3533        return;
   3534      case 0x1E98: // LATIN SMALL LETTER W WITH RING ABOVE
   3535        elements[(*index)++] = 0x0057; // LATIN CAPITAL LETTER W
   3536        elements[(*index)++] = 0x030A; // COMBINING RING ABOVE (NON-SPACING RING ABOVE)
   3537        return;
   3538      case 0x1E99: // LATIN SMALL LETTER Y WITH RING ABOVE
   3539        elements[(*index)++] = 0x0059; // LATIN CAPITAL LETTER Y
   3540        elements[(*index)++] = 0x030A; // COMBINING RING ABOVE (NON-SPACING RING ABOVE)
   3541        return;
   3542      case 0x1E9A: // LATIN SMALL LETTER A WITH RIGHT HALF RING
   3543        elements[(*index)++] = 0x0041; // LATIN CAPITAL LETTER A
   3544        elements[(*index)++] = 0x02BE; // MODIFIER LETTER RIGHT HALF RING
   3545        return;
   3546      case 0x1F50: // GREEK SMALL LETTER UPSILON WITH PSILI
   3547        elements[(*index)++] = 0x03A5; // GREEK CAPITAL LETTER UPSILON
   3548        elements[(*index)++] = 0x0313; // COMBINING COMMA ABOVE (NON-SPACING COMMA ABOVE)
   3549        return;
   3550      case 0x1F52: // GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA
   3551        elements[(*index)++] = 0x03A5; // GREEK CAPITAL LETTER UPSILON
   3552        elements[(*index)++] = 0x0313; // COMBINING COMMA ABOVE (NON-SPACING COMMA ABOVE)
   3553        elements[(*index)++] = 0x0300; // COMBINING GRAVE ACCENT (NON-SPACING GRAVE)
   3554        return;
   3555      case 0x1F54: // GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA
   3556        elements[(*index)++] = 0x03A5; // GREEK CAPITAL LETTER UPSILON
   3557        elements[(*index)++] = 0x0313; // COMBINING COMMA ABOVE (NON-SPACING COMMA ABOVE)
   3558        elements[(*index)++] = 0x0301; // COMBINING ACUTE ACCENT (NON-SPACING ACUTE)
   3559        return;
   3560      case 0x1F56: // GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI
   3561        elements[(*index)++] = 0x03A5; // GREEK CAPITAL LETTER UPSILON
   3562        elements[(*index)++] = 0x0313; // COMBINING COMMA ABOVE (NON-SPACING COMMA ABOVE)
   3563        elements[(*index)++] = 0x0342; // COMBINING GREEK PERISPOMENI
   3564        return;
   3565      case 0x1F80: // GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI
   3566        elements[(*index)++] = 0x1F08; // GREEK CAPITAL LETTER ALPHA WITH PSILI
   3567        elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
   3568        return;
   3569      case 0x1F81: // GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI
   3570        elements[(*index)++] = 0x1F09; // GREEK CAPITAL LETTER ALPHA WITH DASIA
   3571        elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
   3572        return;
   3573      case 0x1F82: // GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI
   3574        elements[(*index)++] = 0x1F0A; // GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA
   3575        elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
   3576        return;
   3577      case 0x1F83: // GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI
   3578        elements[(*index)++] = 0x1F0B; // GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA
   3579        elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
   3580        return;
   3581      case 0x1F84: // GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI
   3582        elements[(*index)++] = 0x1F0C; // GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA
   3583        elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
   3584        return;
   3585      case 0x1F85: // GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI
   3586        elements[(*index)++] = 0x1F0D; // GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA
   3587        elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
   3588        return;
   3589      case 0x1F86: // GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
   3590        elements[(*index)++] = 0x1F0E; // GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI
   3591        elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
   3592        return;
   3593      case 0x1F87: // GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
   3594        elements[(*index)++] = 0x1F0F; // GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI
   3595        elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
   3596        return;
   3597      case 0x1F88: // GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI
   3598        elements[(*index)++] = 0x1F08; // GREEK CAPITAL LETTER ALPHA WITH PSILI
   3599        elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
   3600        return;
   3601      case 0x1F89: // GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI
   3602        elements[(*index)++] = 0x1F09; // GREEK CAPITAL LETTER ALPHA WITH DASIA
   3603        elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
   3604        return;
   3605      case 0x1F8A: // GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI
   3606        elements[(*index)++] = 0x1F0A; // GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA
   3607        elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
   3608        return;
   3609      case 0x1F8B: // GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI
   3610        elements[(*index)++] = 0x1F0B; // GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA
   3611        elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
   3612        return;
   3613      case 0x1F8C: // GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
   3614        elements[(*index)++] = 0x1F0C; // GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA
   3615        elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
   3616        return;
   3617      case 0x1F8D: // GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
   3618        elements[(*index)++] = 0x1F0D; // GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA
   3619        elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
   3620        return;
   3621      case 0x1F8E: // GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
   3622        elements[(*index)++] = 0x1F0E; // GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI
   3623        elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
   3624        return;
   3625      case 0x1F8F: // GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
   3626        elements[(*index)++] = 0x1F0F; // GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI
   3627        elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
   3628        return;
   3629      case 0x1F90: // GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI
   3630        elements[(*index)++] = 0x1F28; // GREEK CAPITAL LETTER ETA WITH PSILI
   3631        elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
   3632        return;
   3633      case 0x1F91: // GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI
   3634        elements[(*index)++] = 0x1F29; // GREEK CAPITAL LETTER ETA WITH DASIA
   3635        elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
   3636        return;
   3637      case 0x1F92: // GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI
   3638        elements[(*index)++] = 0x1F2A; // GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA
   3639        elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
   3640        return;
   3641      case 0x1F93: // GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI
   3642        elements[(*index)++] = 0x1F2B; // GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA
   3643        elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
   3644        return;
   3645      case 0x1F94: // GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI
   3646        elements[(*index)++] = 0x1F2C; // GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA
   3647        elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
   3648        return;
   3649      case 0x1F95: // GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI
   3650        elements[(*index)++] = 0x1F2D; // GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA
   3651        elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
   3652        return;
   3653      case 0x1F96: // GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
   3654        elements[(*index)++] = 0x1F2E; // GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI
   3655        elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
   3656        return;
   3657      case 0x1F97: // GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
   3658        elements[(*index)++] = 0x1F2F; // GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI
   3659        elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
   3660        return;
   3661      case 0x1F98: // GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI
   3662        elements[(*index)++] = 0x1F28; // GREEK CAPITAL LETTER ETA WITH PSILI
   3663        elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
   3664        return;
   3665      case 0x1F99: // GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI
   3666        elements[(*index)++] = 0x1F29; // GREEK CAPITAL LETTER ETA WITH DASIA
   3667        elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
   3668        return;
   3669      case 0x1F9A: // GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI
   3670        elements[(*index)++] = 0x1F2A; // GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA
   3671        elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
   3672        return;
   3673      case 0x1F9B: // GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI
   3674        elements[(*index)++] = 0x1F2B; // GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA
   3675        elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
   3676        return;
   3677      case 0x1F9C: // GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
   3678        elements[(*index)++] = 0x1F2C; // GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA
   3679        elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
   3680        return;
   3681      case 0x1F9D: // GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
   3682        elements[(*index)++] = 0x1F2D; // GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA
   3683        elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
   3684        return;
   3685      case 0x1F9E: // GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
   3686        elements[(*index)++] = 0x1F2E; // GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI
   3687        elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
   3688        return;
   3689      case 0x1F9F: // GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
   3690        elements[(*index)++] = 0x1F2F; // GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI
   3691        elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
   3692        return;
   3693      case 0x1FA0: // GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI
   3694        elements[(*index)++] = 0x1F68; // GREEK CAPITAL LETTER OMEGA WITH PSILI
   3695        elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
   3696        return;
   3697      case 0x1FA1: // GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI
   3698        elements[(*index)++] = 0x1F69; // GREEK CAPITAL LETTER OMEGA WITH DASIA
   3699        elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
   3700        return;
   3701      case 0x1FA2: // GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI
   3702        elements[(*index)++] = 0x1F6A; // GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA
   3703        elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
   3704        return;
   3705      case 0x1FA3: // GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI
   3706        elements[(*index)++] = 0x1F6B; // GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA
   3707        elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
   3708        return;
   3709      case 0x1FA4: // GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI
   3710        elements[(*index)++] = 0x1F6C; // GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA
   3711        elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
   3712        return;
   3713      case 0x1FA5: // GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
   3714        elements[(*index)++] = 0x1F6D; // GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA
   3715        elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
   3716        return;
   3717      case 0x1FA6: // GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
   3718        elements[(*index)++] = 0x1F6E; // GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI
   3719        elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
   3720        return;
   3721      case 0x1FA7: // GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
   3722        elements[(*index)++] = 0x1F6F; // GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI
   3723        elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
   3724        return;
   3725      case 0x1FA8: // GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI
   3726        elements[(*index)++] = 0x1F68; // GREEK CAPITAL LETTER OMEGA WITH PSILI
   3727        elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
   3728        return;
   3729      case 0x1FA9: // GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI
   3730        elements[(*index)++] = 0x1F69; // GREEK CAPITAL LETTER OMEGA WITH DASIA
   3731        elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
   3732        return;
   3733      case 0x1FAA: // GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI
   3734        elements[(*index)++] = 0x1F6A; // GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA
   3735        elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
   3736        return;
   3737      case 0x1FAB: // GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI
   3738        elements[(*index)++] = 0x1F6B; // GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA
   3739        elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
   3740        return;
   3741      case 0x1FAC: // GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
   3742        elements[(*index)++] = 0x1F6C; // GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA
   3743        elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
   3744        return;
   3745      case 0x1FAD: // GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
   3746        elements[(*index)++] = 0x1F6D; // GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA
   3747        elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
   3748        return;
   3749      case 0x1FAE: // GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
   3750        elements[(*index)++] = 0x1F6E; // GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI
   3751        elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
   3752        return;
   3753      case 0x1FAF: // GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
   3754        elements[(*index)++] = 0x1F6F; // GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI
   3755        elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
   3756        return;
   3757      case 0x1FB2: // GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI
   3758        elements[(*index)++] = 0x1FBA; // GREEK CAPITAL LETTER ALPHA WITH VARIA
   3759        elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
   3760        return;
   3761      case 0x1FB3: // GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI
   3762        elements[(*index)++] = 0x0391; // GREEK CAPITAL LETTER ALPHA
   3763        elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
   3764        return;
   3765      case 0x1FB4: // GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
   3766        elements[(*index)++] = 0x0386; // GREEK CAPITAL LETTER ALPHA WITH TONOS (GREEK CAPITAL LETTER ALPHA TONOS)
   3767        elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
   3768        return;
   3769      case 0x1FB6: // GREEK SMALL LETTER ALPHA WITH PERISPOMENI
   3770        elements[(*index)++] = 0x0391; // GREEK CAPITAL LETTER ALPHA
   3771        elements[(*index)++] = 0x0342; // COMBINING GREEK PERISPOMENI
   3772        return;
   3773      case 0x1FB7: // GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI
   3774        elements[(*index)++] = 0x0391; // GREEK CAPITAL LETTER ALPHA
   3775        elements[(*index)++] = 0x0342; // COMBINING GREEK PERISPOMENI
   3776        elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
   3777        return;
   3778      case 0x1FBC: // GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI
   3779        elements[(*index)++] = 0x0391; // GREEK CAPITAL LETTER ALPHA
   3780        elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
   3781        return;
   3782      case 0x1FC2: // GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI
   3783        elements[(*index)++] = 0x1FCA; // GREEK CAPITAL LETTER ETA WITH VARIA
   3784        elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
   3785        return;
   3786      case 0x1FC3: // GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI
   3787        elements[(*index)++] = 0x0397; // GREEK CAPITAL LETTER ETA
   3788        elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
   3789        return;
   3790      case 0x1FC4: // GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
   3791        elements[(*index)++] = 0x0389; // GREEK CAPITAL LETTER ETA WITH TONOS (GREEK CAPITAL LETTER ETA TONOS)
   3792        elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
   3793        return;
   3794      case 0x1FC6: // GREEK SMALL LETTER ETA WITH PERISPOMENI
   3795        elements[(*index)++] = 0x0397; // GREEK CAPITAL LETTER ETA
   3796        elements[(*index)++] = 0x0342; // COMBINING GREEK PERISPOMENI
   3797        return;
   3798      case 0x1FC7: // GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI
   3799        elements[(*index)++] = 0x0397; // GREEK CAPITAL LETTER ETA
   3800        elements[(*index)++] = 0x0342; // COMBINING GREEK PERISPOMENI
   3801        elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
   3802        return;
   3803      case 0x1FCC: // GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI
   3804        elements[(*index)++] = 0x0397; // GREEK CAPITAL LETTER ETA
   3805        elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
   3806        return;
   3807      case 0x1FD2: // GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA
   3808        elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
   3809        elements[(*index)++] = 0x0308; // COMBINING DIAERESIS (NON-SPACING DIAERESIS)
   3810        elements[(*index)++] = 0x0300; // COMBINING GRAVE ACCENT (NON-SPACING GRAVE)
   3811        return;
   3812      case 0x1FD3: // GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA
   3813        elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
   3814        elements[(*index)++] = 0x0308; // COMBINING DIAERESIS (NON-SPACING DIAERESIS)
   3815        elements[(*index)++] = 0x0301; // COMBINING ACUTE ACCENT (NON-SPACING ACUTE)
   3816        return;
   3817      case 0x1FD6: // GREEK SMALL LETTER IOTA WITH PERISPOMENI
   3818        elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
   3819        elements[(*index)++] = 0x0342; // COMBINING GREEK PERISPOMENI
   3820        return;
   3821      case 0x1FD7: // GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI
   3822        elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
   3823        elements[(*index)++] = 0x0308; // COMBINING DIAERESIS (NON-SPACING DIAERESIS)
   3824        elements[(*index)++] = 0x0342; // COMBINING GREEK PERISPOMENI
   3825        return;
   3826      case 0x1FE2: // GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA
   3827        elements[(*index)++] = 0x03A5; // GREEK CAPITAL LETTER UPSILON
   3828        elements[(*index)++] = 0x0308; // COMBINING DIAERESIS (NON-SPACING DIAERESIS)
   3829        elements[(*index)++] = 0x0300; // COMBINING GRAVE ACCENT (NON-SPACING GRAVE)
   3830        return;
   3831      case 0x1FE3: // GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA
   3832        elements[(*index)++] = 0x03A5; // GREEK CAPITAL LETTER UPSILON
   3833        elements[(*index)++] = 0x0308; // COMBINING DIAERESIS (NON-SPACING DIAERESIS)
   3834        elements[(*index)++] = 0x0301; // COMBINING ACUTE ACCENT (NON-SPACING ACUTE)
   3835        return;
   3836      case 0x1FE4: // GREEK SMALL LETTER RHO WITH PSILI
   3837        elements[(*index)++] = 0x03A1; // GREEK CAPITAL LETTER RHO
   3838        elements[(*index)++] = 0x0313; // COMBINING COMMA ABOVE (NON-SPACING COMMA ABOVE)
   3839        return;
   3840      case 0x1FE6: // GREEK SMALL LETTER UPSILON WITH PERISPOMENI
   3841        elements[(*index)++] = 0x03A5; // GREEK CAPITAL LETTER UPSILON
   3842        elements[(*index)++] = 0x0342; // COMBINING GREEK PERISPOMENI
   3843        return;
   3844      case 0x1FE7: // GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI
   3845        elements[(*index)++] = 0x03A5; // GREEK CAPITAL LETTER UPSILON
   3846        elements[(*index)++] = 0x0308; // COMBINING DIAERESIS (NON-SPACING DIAERESIS)
   3847        elements[(*index)++] = 0x0342; // COMBINING GREEK PERISPOMENI
   3848        return;
   3849      case 0x1FF2: // GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI
   3850        elements[(*index)++] = 0x1FFA; // GREEK CAPITAL LETTER OMEGA WITH VARIA
   3851        elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
   3852        return;
   3853      case 0x1FF3: // GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI
   3854        elements[(*index)++] = 0x03A9; // GREEK CAPITAL LETTER OMEGA
   3855        elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
   3856        return;
   3857      case 0x1FF4: // GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
   3858        elements[(*index)++] = 0x038F; // GREEK CAPITAL LETTER OMEGA WITH TONOS (GREEK CAPITAL LETTER OMEGA TONOS)
   3859        elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
   3860        return;
   3861      case 0x1FF6: // GREEK SMALL LETTER OMEGA WITH PERISPOMENI
   3862        elements[(*index)++] = 0x03A9; // GREEK CAPITAL LETTER OMEGA
   3863        elements[(*index)++] = 0x0342; // COMBINING GREEK PERISPOMENI
   3864        return;
   3865      case 0x1FF7: // GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI
   3866        elements[(*index)++] = 0x03A9; // GREEK CAPITAL LETTER OMEGA
   3867        elements[(*index)++] = 0x0342; // COMBINING GREEK PERISPOMENI
   3868        elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
   3869        return;
   3870      case 0x1FFC: // GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
   3871        elements[(*index)++] = 0x03A9; // GREEK CAPITAL LETTER OMEGA
   3872        elements[(*index)++] = 0x0399; // GREEK CAPITAL LETTER IOTA
   3873        return;
   3874      case 0xFB00: // LATIN SMALL LIGATURE FF
   3875        elements[(*index)++] = 0x0046; // LATIN CAPITAL LETTER F
   3876        elements[(*index)++] = 0x0046; // LATIN CAPITAL LETTER F
   3877        return;
   3878      case 0xFB01: // LATIN SMALL LIGATURE FI
   3879        elements[(*index)++] = 0x0046; // LATIN CAPITAL LETTER F
   3880        elements[(*index)++] = 0x0049; // LATIN CAPITAL LETTER I
   3881        return;
   3882      case 0xFB02: // LATIN SMALL LIGATURE FL
   3883        elements[(*index)++] = 0x0046; // LATIN CAPITAL LETTER F
   3884        elements[(*index)++] = 0x004C; // LATIN CAPITAL LETTER L
   3885        return;
   3886      case 0xFB03: // LATIN SMALL LIGATURE FFI
   3887        elements[(*index)++] = 0x0046; // LATIN CAPITAL LETTER F
   3888        elements[(*index)++] = 0x0046; // LATIN CAPITAL LETTER F
   3889        elements[(*index)++] = 0x0049; // LATIN CAPITAL LETTER I
   3890        return;
   3891      case 0xFB04: // LATIN SMALL LIGATURE FFL
   3892        elements[(*index)++] = 0x0046; // LATIN CAPITAL LETTER F
   3893        elements[(*index)++] = 0x0046; // LATIN CAPITAL LETTER F
   3894        elements[(*index)++] = 0x004C; // LATIN CAPITAL LETTER L
   3895        return;
   3896      case 0xFB05: // LATIN SMALL LIGATURE LONG S T
   3897        elements[(*index)++] = 0x0053; // LATIN CAPITAL LETTER S
   3898        elements[(*index)++] = 0x0054; // LATIN CAPITAL LETTER T
   3899        return;
   3900      case 0xFB06: // LATIN SMALL LIGATURE ST
   3901        elements[(*index)++] = 0x0053; // LATIN CAPITAL LETTER S
   3902        elements[(*index)++] = 0x0054; // LATIN CAPITAL LETTER T
   3903        return;
   3904      case 0xFB13: // ARMENIAN SMALL LIGATURE MEN NOW
   3905        elements[(*index)++] = 0x0544; // ARMENIAN CAPITAL LETTER MEN
   3906        elements[(*index)++] = 0x0546; // ARMENIAN CAPITAL LETTER NOW
   3907        return;
   3908      case 0xFB14: // ARMENIAN SMALL LIGATURE MEN ECH
   3909        elements[(*index)++] = 0x0544; // ARMENIAN CAPITAL LETTER MEN
   3910        elements[(*index)++] = 0x0535; // ARMENIAN CAPITAL LETTER ECH
   3911        return;
   3912      case 0xFB15: // ARMENIAN SMALL LIGATURE MEN INI
   3913        elements[(*index)++] = 0x0544; // ARMENIAN CAPITAL LETTER MEN
   3914        elements[(*index)++] = 0x053B; // ARMENIAN CAPITAL LETTER INI
   3915        return;
   3916      case 0xFB16: // ARMENIAN SMALL LIGATURE VEW NOW
   3917        elements[(*index)++] = 0x054E; // ARMENIAN CAPITAL LETTER VEW
   3918        elements[(*index)++] = 0x0546; // ARMENIAN CAPITAL LETTER NOW
   3919        return;
   3920      case 0xFB17: // ARMENIAN SMALL LIGATURE MEN XEH
   3921        elements[(*index)++] = 0x0544; // ARMENIAN CAPITAL LETTER MEN
   3922        elements[(*index)++] = 0x053D; // ARMENIAN CAPITAL LETTER XEH
   3923        return;
   3924    }
   3925 
   3926    MOZ_ASSERT_UNREACHABLE("Bad character input.");
   3927 }
   3928 
   3929 #define ____ false
   3930 
   3931 /*
   3932 * Identifier start chars:
   3933 * -      36:    $
   3934 * -  65..90: A..Z
   3935 * -      95:    _
   3936 * - 97..122: a..z
   3937 */
   3938 const bool unicode::js_isidstart[] = {
   3939 /*       0     1     2     3     4     5     6     7     8     9  */
   3940 /*  0 */ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____,
   3941 /*  1 */ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____,
   3942 /*  2 */ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____,
   3943 /*  3 */ ____, ____, ____, ____, ____, ____, true, ____, ____, ____,
   3944 /*  4 */ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____,
   3945 /*  5 */ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____,
   3946 /*  6 */ ____, ____, ____, ____, ____, true, true, true, true, true,
   3947 /*  7 */ true, true, true, true, true, true, true, true, true, true,
   3948 /*  8 */ true, true, true, true, true, true, true, true, true, true,
   3949 /*  9 */ true, ____, ____, ____, ____, true, ____, true, true, true,
   3950 /* 10 */ true, true, true, true, true, true, true, true, true, true,
   3951 /* 11 */ true, true, true, true, true, true, true, true, true, true,
   3952 /* 12 */ true, true, true, ____, ____, ____, ____, ____,
   3953 };
   3954 
   3955 /*
   3956 * Identifier chars:
   3957 * -      36:    $
   3958 * -  48..57: 0..9
   3959 * -  65..90: A..Z
   3960 * -      95:    _
   3961 * - 97..122: a..z
   3962 */
   3963 const bool unicode::js_isident[] = {
   3964 /*       0     1     2     3     4     5     6     7     8     9  */
   3965 /*  0 */ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____,
   3966 /*  1 */ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____,
   3967 /*  2 */ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____,
   3968 /*  3 */ ____, ____, ____, ____, ____, ____, true, ____, ____, ____,
   3969 /*  4 */ ____, ____, ____, ____, ____, ____, ____, ____, true, true,
   3970 /*  5 */ true, true, true, true, true, true, true, true, ____, ____,
   3971 /*  6 */ ____, ____, ____, ____, ____, true, true, true, true, true,
   3972 /*  7 */ true, true, true, true, true, true, true, true, true, true,
   3973 /*  8 */ true, true, true, true, true, true, true, true, true, true,
   3974 /*  9 */ true, ____, ____, ____, ____, true, ____, true, true, true,
   3975 /* 10 */ true, true, true, true, true, true, true, true, true, true,
   3976 /* 11 */ true, true, true, true, true, true, true, true, true, true,
   3977 /* 12 */ true, true, true, ____, ____, ____, ____, ____,
   3978 };
   3979 
   3980 /* Whitespace chars: '\t', '\n', '\v', '\f', '\r', ' '. */
   3981 const bool unicode::js_isspace[] = {
   3982 /*       0     1     2     3     4     5     6     7     8     9  */
   3983 /*  0 */ ____, ____, ____, ____, ____, ____, ____, ____, ____, true,
   3984 /*  1 */ true, true, true, true, ____, ____, ____, ____, ____, ____,
   3985 /*  2 */ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____,
   3986 /*  3 */ ____, ____, true, ____, ____, ____, ____, ____, ____, ____,
   3987 /*  4 */ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____,
   3988 /*  5 */ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____,
   3989 /*  6 */ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____,
   3990 /*  7 */ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____,
   3991 /*  8 */ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____,
   3992 /*  9 */ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____,
   3993 /* 10 */ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____,
   3994 /* 11 */ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____,
   3995 /* 12 */ ____, ____, ____, ____, ____, ____, ____, ____,
   3996 };
   3997 
   3998 #undef ____
   3999 
   4000 const JS::Latin1Char unicode::latin1ToLowerCaseTable[] = {
   4001 /*       0     1     2     3     4     5     6     7     8     9     10    11    12    13    14    15  */
   4002 /*  0 */ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
   4003 /*  1 */ 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
   4004 /*  2 */ 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,
   4005 /*  3 */ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,
   4006 /*  4 */ 0x40, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
   4007 /*  5 */ 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F,
   4008 /*  6 */ 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
   4009 /*  7 */ 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F,
   4010 /*  8 */ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F,
   4011 /*  9 */ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F,
   4012 /* 10 */ 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF,
   4013 /* 11 */ 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF,
   4014 /* 12 */ 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,
   4015 /* 13 */ 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xD7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xDF,
   4016 /* 14 */ 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,
   4017 /* 15 */ 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF,
   4018 };