/ Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 13175d138fddd041d389068cafa0d9957ac837f2:


/*
** 2012 May 03
**
** The author disclaims copyright to this source code.  In place of
** a legal notice, here is a blessing:
**
**    May you do good and not evil.
**    May you find forgiveness for yourself and forgive others.
**    May you share freely, never taking more than you give.
**
******************************************************************************
**
** Implementation of the "translit" full-text-search tokenizer.
**
** This tokenizer looks for tokens composed of any Latin, Greek, Cyrillic,
** and/or Hebrew characters and apostrophy.  All other characters are
** considered to be token separators.  All characters are transliterated
** into ASCII for indexing.  The maximum token length is limited to
** MX_TRANSLIT characters.
*/

/*
** The code in this file is only compiled if:
**
**     * The FTS3 module is being built as an extension
**       (in which case SQLITE_CORE is not defined), or
**
**     * The FTS3 module is being built into the core of
**       SQLite (in which case SQLITE_ENABLE_FTS3 is defined).
*/
#include "fts3Int.h"
#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3)

#include <assert.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#include "fts3_tokenizer.h"

/*
** The following constant is a concatenation (with overlap) of all
** possible generated transliterations.
*/
static const char zTranslit[] =
   "psshchhvvyylsthwiaaedzhoeueoijhnghljnjouphtstcfelslz'bkmqrxkhiu";
/*   123456789 123456789 123456789 123456789 123456789 123456789 123 */

/* Given a unicode character U, that value is translated into an offset
** into the following table by skipping the following ranges:
**
**      u0000-u0025 
**      u02ae-u0385
**      u0460-u05b0
**
** Let the table value be T.  Then the transliteration is ((T-1)%4)+1
** characters in length and begins at an offset of (T-1)/4 in zTranslit[].
*  Or if T is zero, then the character is a delimiter.
*/
static const unsigned char aTranslate[] = {
  0,                                       /* 0 */
  (52*4 + 1),    /* u0027 (')  ->  '    */ /* 1 */
  0,                                       /* 2 */
  0,                                       /* 3 */
  0,                                       /* 4 */
  0,                                       /* 5 */
  0,                                       /* 6 */
  0,                                       /* 7 */
  0,                                       /* 8 */
  0,                                       /* 9 */
  0,                                       /* 10 */
  0,                                       /* 11 */
  0,                                       /* 12 */
  0,                                       /* 13 */
  0,                                       /* 14 */
  0,                                       /* 15 */
  0,                                       /* 16 */
  0,                                       /* 17 */
  0,                                       /* 18 */
  0,                                       /* 19 */
  0,                                       /* 20 */
  0,                                       /* 21 */
  0,                                       /* 22 */
  0,                                       /* 23 */
  0,                                       /* 24 */
  0,                                       /* 25 */
  0,                                       /* 26 */
  (17*4 + 1),    /* u0041 (A)  ->  a    */ /* 27 */
  (53*4 + 1),    /* u0042 (B)  ->  b    */ /* 28 */
  ( 4*4 + 1),    /* u0043 (C)  ->  c    */ /* 29 */
  (20*4 + 1),    /* u0044 (D)  ->  d    */ /* 30 */
  (19*4 + 1),    /* u0045 (E)  ->  e    */ /* 31 */
  (46*4 + 1),    /* u0046 (F)  ->  f    */ /* 32 */
  (32*4 + 1),    /* u0047 (G)  ->  g    */ /* 33 */
  ( 3*4 + 1),    /* u0048 (H)  ->  h    */ /* 34 */
  (16*4 + 1),    /* u0049 (I)  ->  i    */ /* 35 */
  (29*4 + 1),    /* u004A (J)  ->  j    */ /* 36 */
  (54*4 + 1),    /* u004B (K)  ->  k    */ /* 37 */
  (11*4 + 1),    /* u004C (L)  ->  l    */ /* 38 */
  (55*4 + 1),    /* u004D (M)  ->  m    */ /* 39 */
  (31*4 + 1),    /* u004E (N)  ->  n    */ /* 40 */
  (23*4 + 1),    /* u004F (O)  ->  o    */ /* 41 */
  ( 0*4 + 1),    /* u0050 (P)  ->  p    */ /* 42 */
  (56*4 + 1),    /* u0051 (Q)  ->  q    */ /* 43 */
  (57*4 + 1),    /* u0052 (R)  ->  r    */ /* 44 */
  ( 1*4 + 1),    /* u0053 (S)  ->  s    */ /* 45 */
  (13*4 + 1),    /* u0054 (T)  ->  t    */ /* 46 */
  (25*4 + 1),    /* u0055 (U)  ->  u    */ /* 47 */
  ( 7*4 + 1),    /* u0056 (V)  ->  v    */ /* 48 */
  (15*4 + 1),    /* u0057 (W)  ->  w    */ /* 49 */
  (15*4 + 1),    /* u0058 (X)  ->  w    */ /* 50 */
  ( 9*4 + 1),    /* u0059 (Y)  ->  y    */ /* 51 */
  (21*4 + 1),    /* u005A (Z)  ->  z    */ /* 52 */
  0,                                       /* 53 */
  0,                                       /* 54 */
  0,                                       /* 55 */
  0,                                       /* 56 */
  0,                                       /* 57 */
  0,                                       /* 58 */
  (17*4 + 1),    /* u0061 (a)  ->  a    */ /* 59 */
  (53*4 + 1),    /* u0062 (b)  ->  b    */ /* 60 */
  ( 4*4 + 1),    /* u0063 (c)  ->  c    */ /* 61 */
  (20*4 + 1),    /* u0064 (d)  ->  d    */ /* 62 */
  (19*4 + 1),    /* u0065 (e)  ->  e    */ /* 63 */
  (46*4 + 1),    /* u0066 (f)  ->  f    */ /* 64 */
  (32*4 + 1),    /* u0067 (g)  ->  g    */ /* 65 */
  ( 3*4 + 1),    /* u0068 (h)  ->  h    */ /* 66 */
  (16*4 + 1),    /* u0069 (i)  ->  i    */ /* 67 */
  (29*4 + 1),    /* u006A (j)  ->  j    */ /* 68 */
  (54*4 + 1),    /* u006B (k)  ->  k    */ /* 69 */
  (11*4 + 1),    /* u006C (l)  ->  l    */ /* 70 */
  (55*4 + 1),    /* u006D (m)  ->  m    */ /* 71 */
  (31*4 + 1),    /* u006E (n)  ->  n    */ /* 72 */
  (23*4 + 1),    /* u006F (o)  ->  o    */ /* 73 */
  ( 0*4 + 1),    /* u0070 (p)  ->  p    */ /* 74 */
  (56*4 + 1),    /* u0071 (q)  ->  q    */ /* 75 */
  (57*4 + 1),    /* u0072 (r)  ->  r    */ /* 76 */
  ( 1*4 + 1),    /* u0073 (s)  ->  s    */ /* 77 */
  (13*4 + 1),    /* u0074 (t)  ->  t    */ /* 78 */
  (25*4 + 1),    /* u0075 (u)  ->  u    */ /* 79 */
  ( 7*4 + 1),    /* u0076 (v)  ->  v    */ /* 80 */
  (15*4 + 1),    /* u0077 (w)  ->  w    */ /* 81 */
  (58*4 + 1),    /* u0078 (x)  ->  x    */ /* 82 */
  ( 9*4 + 1),    /* u0079 (y)  ->  y    */ /* 83 */
  (21*4 + 1),    /* u007A (z)  ->  z    */ /* 84 */
  0,                                       /* 85 */
  0,                                       /* 86 */
  0,                                       /* 87 */
  0,                                       /* 88 */
  0,                                       /* 89 */
  0,                                       /* 90 */
  0,                                       /* 91 */
  0,                                       /* 92 */
  0,                                       /* 93 */
  0,                                       /* 94 */
  0,                                       /* 95 */
  0,                                       /* 96 */
  0,                                       /* 97 */
  0,                                       /* 98 */
  0,                                       /* 99 */
  0,                                       /* 100 */
  0,                                       /* 101 */
  0,                                       /* 102 */
  0,                                       /* 103 */
  0,                                       /* 104 */
  0,                                       /* 105 */
  0,                                       /* 106 */
  0,                                       /* 107 */
  0,                                       /* 108 */
  0,                                       /* 109 */
  0,                                       /* 110 */
  0,                                       /* 111 */
  0,                                       /* 112 */
  0,                                       /* 113 */
  0,                                       /* 114 */
  0,                                       /* 115 */
  0,                                       /* 116 */
  0,                                       /* 117 */
  0,                                       /* 118 */
  0,                                       /* 119 */
  0,                                       /* 120 */
  0,                                       /* 121 */
  0,                                       /* 122 */
  0,                                       /* 123 */
  0,                                       /* 124 */
  0,                                       /* 125 */
  0,                                       /* 126 */
  0,                                       /* 127 */
  0,                                       /* 128 */
  0,                                       /* 129 */
  0,                                       /* 130 */
  0,                                       /* 131 */
  0,                                       /* 132 */
  0,                                       /* 133 */
  0,                                       /* 134 */
  0,                                       /* 135 */
  0,                                       /* 136 */
  0,                                       /* 137 */
  0,                                       /* 138 */
  0,                                       /* 139 */
  0,                                       /* 140 */
  0,                                       /* 141 */
  0,                                       /* 142 */
  0,                                       /* 143 */
  0,                                       /* 144 */
  0,                                       /* 145 */
  0,                                       /* 146 */
  0,                                       /* 147 */
  0,                                       /* 148 */
  0,                                       /* 149 */
  0,                                       /* 150 */
  0,                                       /* 151 */
  0,                                       /* 152 */
  0,                                       /* 153 */
  (17*4 + 1),    /* u00C0 (À)  ->  a    */ /* 154 */
  (17*4 + 1),    /* u00C1 (Á)  ->  a    */ /* 155 */
  (17*4 + 1),    /* u00C2 (Â)  ->  a    */ /* 156 */
  (17*4 + 1),    /* u00C3 (Ã)  ->  a    */ /* 157 */
  (18*4 + 2),    /* u00C4 (Ä)  ->  ae   */ /* 158 */
  (17*4 + 2),    /* u00C5 (Å)  ->  aa   */ /* 159 */
  (18*4 + 2),    /* u00C6 (Æ)  ->  ae   */ /* 160 */
  ( 4*4 + 1),    /* u00C7 (Ç)  ->  c    */ /* 161 */
  (19*4 + 1),    /* u00C8 (È)  ->  e    */ /* 162 */
  (19*4 + 1),    /* u00C9 (É)  ->  e    */ /* 163 */
  (19*4 + 1),    /* u00CA (Ê)  ->  e    */ /* 164 */
  (19*4 + 1),    /* u00CB (Ë)  ->  e    */ /* 165 */
  (16*4 + 1),    /* u00CC (Ì)  ->  i    */ /* 166 */
  (16*4 + 1),    /* u00CD (Í)  ->  i    */ /* 167 */
  (16*4 + 1),    /* u00CE (Î)  ->  i    */ /* 168 */
  (16*4 + 1),    /* u00CF (Ï)  ->  i    */ /* 169 */
  (20*4 + 1),    /* u00D0 (Ð)  ->  d    */ /* 170 */
  (31*4 + 1),    /* u00D1 (Ñ)  ->  n    */ /* 171 */
  (23*4 + 1),    /* u00D2 (Ò)  ->  o    */ /* 172 */
  (23*4 + 1),    /* u00D3 (Ó)  ->  o    */ /* 173 */
  (23*4 + 1),    /* u00D4 (Ô)  ->  o    */ /* 174 */
  (23*4 + 1),    /* u00D5 (Õ)  ->  o    */ /* 175 */
  (23*4 + 2),    /* u00D6 (Ö)  ->  oe   */ /* 176 */
  0,                                       /* 177 */
  (23*4 + 1),    /* u00D8 (Ø)  ->  o    */ /* 178 */
  (25*4 + 1),    /* u00D9 (Ù)  ->  u    */ /* 179 */
  (25*4 + 1),    /* u00DA (Ú)  ->  u    */ /* 180 */
  (25*4 + 1),    /* u00DB (Û)  ->  u    */ /* 181 */
  (25*4 + 2),    /* u00DC (Ü)  ->  ue   */ /* 182 */
  ( 9*4 + 1),    /* u00DD (Ý)  ->  y    */ /* 183 */
  (13*4 + 2),    /* u00DE (Þ)  ->  th   */ /* 184 */
  ( 1*4 + 2),    /* u00DF (ß)  ->  ss   */ /* 185 */
  (17*4 + 1),    /* u00E0 (à)  ->  a    */ /* 186 */
  (17*4 + 1),    /* u00E1 (á)  ->  a    */ /* 187 */
  (17*4 + 1),    /* u00E2 (â)  ->  a    */ /* 188 */
  (17*4 + 1),    /* u00E3 (ã)  ->  a    */ /* 189 */
  (18*4 + 2),    /* u00E4 (ä)  ->  ae   */ /* 190 */
  (17*4 + 2),    /* u00E5 (å)  ->  aa   */ /* 191 */
  (18*4 + 2),    /* u00E6 (æ)  ->  ae   */ /* 192 */
  ( 4*4 + 1),    /* u00E7 (ç)  ->  c    */ /* 193 */
  (19*4 + 1),    /* u00E8 (è)  ->  e    */ /* 194 */
  (19*4 + 1),    /* u00E9 (é)  ->  e    */ /* 195 */
  (19*4 + 1),    /* u00EA (ê)  ->  e    */ /* 196 */
  (19*4 + 1),    /* u00EB (ë)  ->  e    */ /* 197 */
  (16*4 + 1),    /* u00EC (ì)  ->  i    */ /* 198 */
  (16*4 + 1),    /* u00ED (í)  ->  i    */ /* 199 */
  (16*4 + 1),    /* u00EE (î)  ->  i    */ /* 200 */
  (16*4 + 1),    /* u00EF (ï)  ->  i    */ /* 201 */
  (20*4 + 1),    /* u00F0 (ð)  ->  d    */ /* 202 */
  (31*4 + 1),    /* u00F1 (ñ)  ->  n    */ /* 203 */
  (23*4 + 1),    /* u00F2 (ò)  ->  o    */ /* 204 */
  (23*4 + 1),    /* u00F3 (ó)  ->  o    */ /* 205 */
  (23*4 + 1),    /* u00F4 (ô)  ->  o    */ /* 206 */
  (23*4 + 1),    /* u00F5 (õ)  ->  o    */ /* 207 */
  (23*4 + 2),    /* u00F6 (ö)  ->  oe   */ /* 208 */
  0,                                       /* 209 */
  (23*4 + 1),    /* u00F8 (ø)  ->  o    */ /* 210 */
  (25*4 + 1),    /* u00F9 (ù)  ->  u    */ /* 211 */
  (25*4 + 1),    /* u00FA (ú)  ->  u    */ /* 212 */
  (25*4 + 1),    /* u00FB (û)  ->  u    */ /* 213 */
  (25*4 + 2),    /* u00FC (ü)  ->  ue   */ /* 214 */
  ( 9*4 + 1),    /* u00FD (ý)  ->  y    */ /* 215 */
  (13*4 + 2),    /* u00FE (þ)  ->  th   */ /* 216 */
  ( 9*4 + 1),    /* u00FF (ÿ)  ->  y    */ /* 217 */
  (17*4 + 1),    /* u0100 (Ā)  ->  a    */ /* 218 */
  (17*4 + 1),    /* u0101 (ā)  ->  a    */ /* 219 */
  (17*4 + 1),    /* u0102 (Ă)  ->  a    */ /* 220 */
  (17*4 + 1),    /* u0103 (ă)  ->  a    */ /* 221 */
  (17*4 + 1),    /* u0104 (Ą)  ->  a    */ /* 222 */
  (17*4 + 1),    /* u0105 (ą)  ->  a    */ /* 223 */
  ( 4*4 + 1),    /* u0106 (Ć)  ->  c    */ /* 224 */
  ( 4*4 + 1),    /* u0107 (ć)  ->  c    */ /* 225 */
  ( 4*4 + 2),    /* u0108 (Ĉ)  ->  ch   */ /* 226 */
  ( 4*4 + 2),    /* u0109 (ĉ)  ->  ch   */ /* 227 */
  ( 4*4 + 1),    /* u010A (Ċ)  ->  c    */ /* 228 */
  ( 4*4 + 1),    /* u010B (ċ)  ->  c    */ /* 229 */
  ( 4*4 + 1),    /* u010C (Č)  ->  c    */ /* 230 */
  ( 4*4 + 1),    /* u010D (č)  ->  c    */ /* 231 */
  (20*4 + 1),    /* u010E (Ď)  ->  d    */ /* 232 */
  ( 4*4 + 1),    /* u010F (ď)  ->  c    */ /* 233 */
  (20*4 + 1),    /* u0110 (Đ)  ->  d    */ /* 234 */
  (20*4 + 1),    /* u0111 (đ)  ->  d    */ /* 235 */
  (19*4 + 1),    /* u0112 (Ē)  ->  e    */ /* 236 */
  (19*4 + 1),    /* u0113 (ē)  ->  e    */ /* 237 */
  (19*4 + 1),    /* u0114 (Ĕ)  ->  e    */ /* 238 */
  (19*4 + 1),    /* u0115 (ĕ)  ->  e    */ /* 239 */
  (19*4 + 1),    /* u0116 (Ė)  ->  e    */ /* 240 */
  (19*4 + 1),    /* u0117 (ė)  ->  e    */ /* 241 */
  (19*4 + 1),    /* u0118 (Ę)  ->  e    */ /* 242 */
  (19*4 + 1),    /* u0119 (ę)  ->  e    */ /* 243 */
  (19*4 + 1),    /* u011A (Ě)  ->  e    */ /* 244 */
  (19*4 + 1),    /* u011B (ě)  ->  e    */ /* 245 */
  (32*4 + 2),    /* u011C (Ĝ)  ->  gh   */ /* 246 */
  (32*4 + 2),    /* u011D (ĝ)  ->  gh   */ /* 247 */
  (32*4 + 1),    /* u011E (Ğ)  ->  g    */ /* 248 */
  (32*4 + 1),    /* u011F (ğ)  ->  g    */ /* 249 */
  (32*4 + 1),    /* u0120 (Ġ)  ->  g    */ /* 250 */
  (32*4 + 1),    /* u0121 (ġ)  ->  g    */ /* 251 */
  (32*4 + 1),    /* u0122 (Ģ)  ->  g    */ /* 252 */
  (32*4 + 1),    /* u0123 (ģ)  ->  g    */ /* 253 */
  ( 5*4 + 2),    /* u0124 (Ĥ)  ->  hh   */ /* 254 */
  ( 5*4 + 2),    /* u0125 (ĥ)  ->  hh   */ /* 255 */
  ( 3*4 + 1),    /* u0126 (Ħ)  ->  h    */ /* 256 */
  ( 3*4 + 1),    /* u0127 (ħ)  ->  h    */ /* 257 */
  (16*4 + 1),    /* u0128 (Ĩ)  ->  i    */ /* 258 */
  (16*4 + 1),    /* u0129 (ĩ)  ->  i    */ /* 259 */
  (16*4 + 1),    /* u012A (Ī)  ->  i    */ /* 260 */
  (16*4 + 1),    /* u012B (ī)  ->  i    */ /* 261 */
  (16*4 + 1),    /* u012C (Ĭ)  ->  i    */ /* 262 */
  (16*4 + 1),    /* u012D (ĭ)  ->  i    */ /* 263 */
  (16*4 + 1),    /* u012E (Į)  ->  i    */ /* 264 */
  (16*4 + 1),    /* u012F (į)  ->  i    */ /* 265 */
  (16*4 + 1),    /* u0130 (İ)  ->  i    */ /* 266 */
  (16*4 + 1),    /* u0131 (ı)  ->  i    */ /* 267 */
  (28*4 + 2),    /* u0132 (IJ)  ->  ij   */ /* 268 */
  (28*4 + 2),    /* u0133 (ij)  ->  ij   */ /* 269 */
  (29*4 + 2),    /* u0134 (Ĵ)  ->  jh   */ /* 270 */
  (29*4 + 2),    /* u0135 (ĵ)  ->  jh   */ /* 271 */
  (54*4 + 1),    /* u0136 (Ķ)  ->  k    */ /* 272 */
  (54*4 + 1),    /* u0137 (ķ)  ->  k    */ /* 273 */
  (54*4 + 1),    /* u0138 (ĸ)  ->  k    */ /* 274 */
  (11*4 + 1),    /* u0139 (Ĺ)  ->  l    */ /* 275 */
  (11*4 + 1),    /* u013A (ĺ)  ->  l    */ /* 276 */
  (11*4 + 1),    /* u013B (Ļ)  ->  l    */ /* 277 */
  (11*4 + 1),    /* u013C (ļ)  ->  l    */ /* 278 */
  (11*4 + 1),    /* u013D (Ľ)  ->  l    */ /* 279 */
  (11*4 + 1),    /* u013E (ľ)  ->  l    */ /* 280 */
  (11*4 + 1),    /* u013F (Ŀ)  ->  l    */ /* 281 */
  (11*4 + 1),    /* u0140 (ŀ)  ->  l    */ /* 282 */
  (11*4 + 1),    /* u0141 (Ł)  ->  l    */ /* 283 */
  (11*4 + 1),    /* u0142 (ł)  ->  l    */ /* 284 */
  (31*4 + 1),    /* u0143 (Ń)  ->  n    */ /* 285 */
  (31*4 + 1),    /* u0144 (ń)  ->  n    */ /* 286 */
  (31*4 + 1),    /* u0145 (Ņ)  ->  n    */ /* 287 */
  (31*4 + 1),    /* u0146 (ņ)  ->  n    */ /* 288 */
  (31*4 + 1),    /* u0147 (Ň)  ->  n    */ /* 289 */
  (31*4 + 1),    /* u0148 (ň)  ->  n    */ /* 290 */
  (31*4 + 1),    /* u0149 (ʼn)  ->  n    */ /* 291 */
  (31*4 + 2),    /* u014A (Ŋ)  ->  ng   */ /* 292 */
  (31*4 + 2),    /* u014B (ŋ)  ->  ng   */ /* 293 */
  (23*4 + 1),    /* u014C (Ō)  ->  o    */ /* 294 */
  (23*4 + 1),    /* u014D (ō)  ->  o    */ /* 295 */
  (23*4 + 1),    /* u014E (Ŏ)  ->  o    */ /* 296 */
  (23*4 + 1),    /* u014F (ŏ)  ->  o    */ /* 297 */
  (23*4 + 1),    /* u0150 (Ő)  ->  o    */ /* 298 */
  (23*4 + 1),    /* u0151 (ő)  ->  o    */ /* 299 */
  (23*4 + 2),    /* u0152 (Œ)  ->  oe   */ /* 300 */
  (23*4 + 2),    /* u0153 (œ)  ->  oe   */ /* 301 */
  (57*4 + 1),    /* u0154 (Ŕ)  ->  r    */ /* 302 */
  (57*4 + 1),    /* u0155 (ŕ)  ->  r    */ /* 303 */
  (57*4 + 1),    /* u0156 (Ŗ)  ->  r    */ /* 304 */
  (57*4 + 1),    /* u0157 (ŗ)  ->  r    */ /* 305 */
  (57*4 + 1),    /* u0158 (Ř)  ->  r    */ /* 306 */
  (57*4 + 1),    /* u0159 (ř)  ->  r    */ /* 307 */
  ( 1*4 + 1),    /* u015A (Ś)  ->  s    */ /* 308 */
  ( 1*4 + 1),    /* u015B (ś)  ->  s    */ /* 309 */
  ( 2*4 + 2),    /* u015C (Ŝ)  ->  sh   */ /* 310 */
  ( 2*4 + 2),    /* u015D (ŝ)  ->  sh   */ /* 311 */
  ( 1*4 + 1),    /* u015E (Ş)  ->  s    */ /* 312 */
  ( 1*4 + 1),    /* u015F (ş)  ->  s    */ /* 313 */
  ( 1*4 + 1),    /* u0160 (Š)  ->  s    */ /* 314 */
  ( 1*4 + 1),    /* u0161 (š)  ->  s    */ /* 315 */
  (13*4 + 1),    /* u0162 (Ţ)  ->  t    */ /* 316 */
  (13*4 + 1),    /* u0163 (ţ)  ->  t    */ /* 317 */
  (13*4 + 1),    /* u0164 (Ť)  ->  t    */ /* 318 */
  (13*4 + 1),    /* u0165 (ť)  ->  t    */ /* 319 */
  (13*4 + 1),    /* u0166 (Ŧ)  ->  t    */ /* 320 */
  (13*4 + 1),    /* u0167 (ŧ)  ->  t    */ /* 321 */
  (25*4 + 1),    /* u0168 (Ũ)  ->  u    */ /* 322 */
  (25*4 + 1),    /* u0169 (ũ)  ->  u    */ /* 323 */
  (25*4 + 1),    /* u016A (Ū)  ->  u    */ /* 324 */
  (25*4 + 1),    /* u016B (ū)  ->  u    */ /* 325 */
  (25*4 + 1),    /* u016C (Ŭ)  ->  u    */ /* 326 */
  (25*4 + 1),    /* u016D (ŭ)  ->  u    */ /* 327 */
  (25*4 + 1),    /* u016E (Ů)  ->  u    */ /* 328 */
  (25*4 + 1),    /* u016F (ů)  ->  u    */ /* 329 */
  (25*4 + 1),    /* u0170 (Ű)  ->  u    */ /* 330 */
  (25*4 + 1),    /* u0171 (ű)  ->  u    */ /* 331 */
  (25*4 + 1),    /* u0172 (Ų)  ->  u    */ /* 332 */
  (25*4 + 1),    /* u0173 (ų)  ->  u    */ /* 333 */
  (15*4 + 1),    /* u0174 (Ŵ)  ->  w    */ /* 334 */
  (15*4 + 1),    /* u0175 (ŵ)  ->  w    */ /* 335 */
  ( 9*4 + 1),    /* u0176 (Ŷ)  ->  y    */ /* 336 */
  ( 9*4 + 1),    /* u0177 (ŷ)  ->  y    */ /* 337 */
  ( 9*4 + 1),    /* u0178 (Ÿ)  ->  y    */ /* 338 */
  (21*4 + 1),    /* u0179 (Ź)  ->  z    */ /* 339 */
  (21*4 + 1),    /* u017A (ź)  ->  z    */ /* 340 */
  (21*4 + 1),    /* u017B (Ż)  ->  z    */ /* 341 */
  (21*4 + 1),    /* u017C (ż)  ->  z    */ /* 342 */
  (21*4 + 1),    /* u017D (Ž)  ->  z    */ /* 343 */
  (21*4 + 1),    /* u017E (ž)  ->  z    */ /* 344 */
  ( 1*4 + 1),    /* u017F (ſ)  ->  s    */ /* 345 */
  (53*4 + 1),    /* u0180 (ƀ)  ->  b    */ /* 346 */
  (53*4 + 1),    /* u0181 (Ɓ)  ->  b    */ /* 347 */
  (53*4 + 1),    /* u0182 (Ƃ)  ->  b    */ /* 348 */
  (53*4 + 1),    /* u0183 (ƃ)  ->  b    */ /* 349 */
  0,                                       /* 350 */
  0,                                       /* 351 */
  (23*4 + 1),    /* u0186 (Ɔ)  ->  o    */ /* 352 */
  ( 4*4 + 1),    /* u0187 (Ƈ)  ->  c    */ /* 353 */
  ( 4*4 + 1),    /* u0188 (ƈ)  ->  c    */ /* 354 */
  (20*4 + 1),    /* u0189 (Ɖ)  ->  d    */ /* 355 */
  (20*4 + 1),    /* u018A (Ɗ)  ->  d    */ /* 356 */
  (20*4 + 1),    /* u018B (Ƌ)  ->  d    */ /* 357 */
  (20*4 + 1),    /* u018C (ƌ)  ->  d    */ /* 358 */
  (20*4 + 1),    /* u018D (ƍ)  ->  d    */ /* 359 */
  (19*4 + 1),    /* u018E (Ǝ)  ->  e    */ /* 360 */
  (19*4 + 1),    /* u018F (Ə)  ->  e    */ /* 361 */
  (19*4 + 1),    /* u0190 (Ɛ)  ->  e    */ /* 362 */
  (46*4 + 1),    /* u0191 (Ƒ)  ->  f    */ /* 363 */
  (46*4 + 1),    /* u0192 (ƒ)  ->  f    */ /* 364 */
  (32*4 + 1),    /* u0193 (Ɠ)  ->  g    */ /* 365 */
  (32*4 + 1),    /* u0194 (Ɣ)  ->  g    */ /* 366 */
  ( 3*4 + 1),    /* u0195 (ƕ)  ->  h    */ /* 367 */
  (16*4 + 1),    /* u0196 (Ɩ)  ->  i    */ /* 368 */
  (16*4 + 1),    /* u0197 (Ɨ)  ->  i    */ /* 369 */
  (54*4 + 1),    /* u0198 (Ƙ)  ->  k    */ /* 370 */
  (54*4 + 1),    /* u0199 (ƙ)  ->  k    */ /* 371 */
  (11*4 + 1),    /* u019A (ƚ)  ->  l    */ /* 372 */
  (11*4 + 1),    /* u019B (ƛ)  ->  l    */ /* 373 */
  (55*4 + 1),    /* u019C (Ɯ)  ->  m    */ /* 374 */
  (31*4 + 1),    /* u019D (Ɲ)  ->  n    */ /* 375 */
  (31*4 + 1),    /* u019E (ƞ)  ->  n    */ /* 376 */
  (23*4 + 1),    /* u019F (Ɵ)  ->  o    */ /* 377 */
  (23*4 + 1),    /* u01A0 (Ơ)  ->  o    */ /* 378 */
  (23*4 + 1),    /* u01A1 (ơ)  ->  o    */ /* 379 */
  (27*4 + 2),    /* u01A2 (Ƣ)  ->  oi   */ /* 380 */
  (27*4 + 2),    /* u01A3 (ƣ)  ->  oi   */ /* 381 */
  ( 0*4 + 1),    /* u01A4 (Ƥ)  ->  p    */ /* 382 */
  ( 0*4 + 1),    /* u01A5 (ƥ)  ->  p    */ /* 383 */
  (57*4 + 1),    /* u01A6 (Ʀ)  ->  r    */ /* 384 */
  0,                                       /* 385 */
  0,                                       /* 386 */
  ( 1*4 + 1),    /* u01A9 (Ʃ)  ->  s    */ /* 387 */
  ( 1*4 + 1),    /* u01AA (ƪ)  ->  s    */ /* 388 */
  (13*4 + 1),    /* u01AB (ƫ)  ->  t    */ /* 389 */
  (13*4 + 1),    /* u01AC (Ƭ)  ->  t    */ /* 390 */
  (13*4 + 1),    /* u01AD (ƭ)  ->  t    */ /* 391 */
  (13*4 + 1),    /* u01AE (Ʈ)  ->  t    */ /* 392 */
  (25*4 + 1),    /* u01AF (Ư)  ->  u    */ /* 393 */
  (25*4 + 1),    /* u01B0 (ư)  ->  u    */ /* 394 */
  (25*4 + 1),    /* u01B1 (Ʊ)  ->  u    */ /* 395 */
  ( 7*4 + 1),    /* u01B2 (Ʋ)  ->  v    */ /* 396 */
  ( 9*4 + 1),    /* u01B3 (Ƴ)  ->  y    */ /* 397 */
  ( 9*4 + 1),    /* u01B4 (ƴ)  ->  y    */ /* 398 */
  (21*4 + 1),    /* u01B5 (Ƶ)  ->  z    */ /* 399 */
  (21*4 + 1),    /* u01B6 (ƶ)  ->  z    */ /* 400 */
  ( 1*4 + 1),    /* u01B7 (Ʒ)  ->  s    */ /* 401 */
  ( 1*4 + 1),    /* u01B8 (Ƹ)  ->  s    */ /* 402 */
  ( 1*4 + 1),    /* u01B9 (ƹ)  ->  s    */ /* 403 */
  ( 1*4 + 1),    /* u01BA (ƺ)  ->  s    */ /* 404 */
  0,                                       /* 405 */
  0,                                       /* 406 */
  0,                                       /* 407 */
  (52*4 + 1),    /* u01BE (ƾ)  ->  '    */ /* 408 */
  (15*4 + 1),    /* u01BF (ƿ)  ->  w    */ /* 409 */
  ( 4*4 + 1),    /* u01C0 (ǀ)  ->  c    */ /* 410 */
  (58*4 + 1),    /* u01C1 (ǁ)  ->  x    */ /* 411 */
  (56*4 + 1),    /* u01C2 (ǂ)  ->  q    */ /* 412 */
  (58*4 + 1),    /* u01C3 (ǃ)  ->  x    */ /* 413 */
  (20*4 + 2),    /* u01C4 (DŽ)  ->  dz   */ /* 414 */
  (20*4 + 2),    /* u01C5 (Dž)  ->  dz   */ /* 415 */
  (20*4 + 2),    /* u01C6 (dž)  ->  dz   */ /* 416 */
  (34*4 + 2),    /* u01C7 (LJ)  ->  lj   */ /* 417 */
  (34*4 + 2),    /* u01C8 (Lj)  ->  lj   */ /* 418 */
  (34*4 + 2),    /* u01C9 (lj)  ->  lj   */ /* 419 */
  (36*4 + 2),    /* u01CA (NJ)  ->  nj   */ /* 420 */
  (36*4 + 2),    /* u01CB (Nj)  ->  nj   */ /* 421 */
  (36*4 + 2),    /* u01CC (nj)  ->  nj   */ /* 422 */
  (17*4 + 1),    /* u01CD (Ǎ)  ->  a    */ /* 423 */
  (17*4 + 1),    /* u01CE (ǎ)  ->  a    */ /* 424 */
  (16*4 + 1),    /* u01CF (Ǐ)  ->  i    */ /* 425 */
  (16*4 + 1),    /* u01D0 (ǐ)  ->  i    */ /* 426 */
  (23*4 + 1),    /* u01D1 (Ǒ)  ->  o    */ /* 427 */
  (23*4 + 1),    /* u01D2 (ǒ)  ->  o    */ /* 428 */
  (25*4 + 1),    /* u01D3 (Ǔ)  ->  u    */ /* 429 */
  (25*4 + 1),    /* u01D4 (ǔ)  ->  u    */ /* 430 */
  (25*4 + 2),    /* u01D5 (Ǖ)  ->  ue   */ /* 431 */
  (25*4 + 2),    /* u01D6 (ǖ)  ->  ue   */ /* 432 */
  (25*4 + 2),    /* u01D7 (Ǘ)  ->  ue   */ /* 433 */
  (25*4 + 2),    /* u01D8 (ǘ)  ->  ue   */ /* 434 */
  (25*4 + 2),    /* u01D9 (Ǚ)  ->  ue   */ /* 435 */
  (25*4 + 2),    /* u01DA (ǚ)  ->  ue   */ /* 436 */
  (25*4 + 2),    /* u01DB (Ǜ)  ->  ue   */ /* 437 */
  (25*4 + 2),    /* u01DC (ǜ)  ->  ue   */ /* 438 */
  (19*4 + 1),    /* u01DD (ǝ)  ->  e    */ /* 439 */
  (18*4 + 2),    /* u01DE (Ǟ)  ->  ae   */ /* 440 */
  (18*4 + 2),    /* u01DF (ǟ)  ->  ae   */ /* 441 */
  (17*4 + 1),    /* u01E0 (Ǡ)  ->  a    */ /* 442 */
  (17*4 + 1),    /* u01E1 (ǡ)  ->  a    */ /* 443 */
  (17*4 + 1),    /* u01E2 (Ǣ)  ->  a    */ /* 444 */
  (18*4 + 2),    /* u01E3 (ǣ)  ->  ae   */ /* 445 */
  (32*4 + 1),    /* u01E4 (Ǥ)  ->  g    */ /* 446 */
  (32*4 + 1),    /* u01E5 (ǥ)  ->  g    */ /* 447 */
  (32*4 + 1),    /* u01E6 (Ǧ)  ->  g    */ /* 448 */
  (32*4 + 1),    /* u01E7 (ǧ)  ->  g    */ /* 449 */
  (54*4 + 1),    /* u01E8 (Ǩ)  ->  k    */ /* 450 */
  (54*4 + 1),    /* u01E9 (ǩ)  ->  k    */ /* 451 */
  (23*4 + 1),    /* u01EA (Ǫ)  ->  o    */ /* 452 */
  (23*4 + 1),    /* u01EB (ǫ)  ->  o    */ /* 453 */
  (23*4 + 1),    /* u01EC (Ǭ)  ->  o    */ /* 454 */
  (23*4 + 1),    /* u01ED (ǭ)  ->  o    */ /* 455 */
  ( 1*4 + 1),    /* u01EE (Ǯ)  ->  s    */ /* 456 */
  ( 1*4 + 1),    /* u01EF (ǯ)  ->  s    */ /* 457 */
  (29*4 + 1),    /* u01F0 (ǰ)  ->  j    */ /* 458 */
  (20*4 + 2),    /* u01F1 (DZ)  ->  dz   */ /* 459 */
  (20*4 + 2),    /* u01F2 (Dz)  ->  dz   */ /* 460 */
  (20*4 + 2),    /* u01F3 (dz)  ->  dz   */ /* 461 */
  (32*4 + 1),    /* u01F4 (Ǵ)  ->  g    */ /* 462 */
  (32*4 + 1),    /* u01F5 (ǵ)  ->  g    */ /* 463 */
  (14*4 + 2),    /* u01F6 (Ƕ)  ->  hw   */ /* 464 */
  (15*4 + 1),    /* u01F7 (Ƿ)  ->  w    */ /* 465 */
  (31*4 + 1),    /* u01F8 (Ǹ)  ->  n    */ /* 466 */
  (31*4 + 1),    /* u01F9 (ǹ)  ->  n    */ /* 467 */
  (17*4 + 1),    /* u01FA (Ǻ)  ->  a    */ /* 468 */
  (17*4 + 1),    /* u01FB (ǻ)  ->  a    */ /* 469 */
  (18*4 + 2),    /* u01FC (Ǽ)  ->  ae   */ /* 470 */
  (18*4 + 2),    /* u01FD (ǽ)  ->  ae   */ /* 471 */
  (23*4 + 1),    /* u01FE (Ǿ)  ->  o    */ /* 472 */
  (23*4 + 1),    /* u01FF (ǿ)  ->  o    */ /* 473 */
  (17*4 + 1),    /* u0200 (Ȁ)  ->  a    */ /* 474 */
  (17*4 + 1),    /* u0201 (ȁ)  ->  a    */ /* 475 */
  (17*4 + 1),    /* u0202 (Ȃ)  ->  a    */ /* 476 */
  (17*4 + 1),    /* u0203 (ȃ)  ->  a    */ /* 477 */
  (19*4 + 1),    /* u0204 (Ȅ)  ->  e    */ /* 478 */
  (19*4 + 1),    /* u0205 (ȅ)  ->  e    */ /* 479 */
  (19*4 + 1),    /* u0206 (Ȇ)  ->  e    */ /* 480 */
  (19*4 + 1),    /* u0207 (ȇ)  ->  e    */ /* 481 */
  (16*4 + 1),    /* u0208 (Ȉ)  ->  i    */ /* 482 */
  (16*4 + 1),    /* u0209 (ȉ)  ->  i    */ /* 483 */
  (16*4 + 1),    /* u020A (Ȋ)  ->  i    */ /* 484 */
  (16*4 + 1),    /* u020B (ȋ)  ->  i    */ /* 485 */
  (23*4 + 1),    /* u020C (Ȍ)  ->  o    */ /* 486 */
  (23*4 + 1),    /* u020D (ȍ)  ->  o    */ /* 487 */
  (23*4 + 1),    /* u020E (Ȏ)  ->  o    */ /* 488 */
  (23*4 + 1),    /* u020F (ȏ)  ->  o    */ /* 489 */
  (57*4 + 1),    /* u0210 (Ȑ)  ->  r    */ /* 490 */
  (57*4 + 1),    /* u0211 (ȑ)  ->  r    */ /* 491 */
  (57*4 + 1),    /* u0212 (Ȓ)  ->  r    */ /* 492 */
  (57*4 + 1),    /* u0213 (ȓ)  ->  r    */ /* 493 */
  (25*4 + 1),    /* u0214 (Ȕ)  ->  u    */ /* 494 */
  (25*4 + 1),    /* u0215 (ȕ)  ->  u    */ /* 495 */
  (25*4 + 1),    /* u0216 (Ȗ)  ->  u    */ /* 496 */
  (25*4 + 1),    /* u0217 (ȗ)  ->  u    */ /* 497 */
  ( 1*4 + 1),    /* u0218 (Ș)  ->  s    */ /* 498 */
  ( 1*4 + 1),    /* u0219 (ș)  ->  s    */ /* 499 */
  (13*4 + 1),    /* u021A (Ț)  ->  t    */ /* 500 */
  (13*4 + 1),    /* u021B (ț)  ->  t    */ /* 501 */
  (29*4 + 1),    /* u021C (Ȝ)  ->  j    */ /* 502 */
  (29*4 + 1),    /* u021D (ȝ)  ->  j    */ /* 503 */
  ( 3*4 + 1),    /* u021E (Ȟ)  ->  h    */ /* 504 */
  ( 3*4 + 1),    /* u021F (ȟ)  ->  h    */ /* 505 */
  (31*4 + 1),    /* u0220 (Ƞ)  ->  n    */ /* 506 */
  0,                                       /* 507 */
  (38*4 + 2),    /* u0222 (Ȣ)  ->  ou   */ /* 508 */
  (38*4 + 2),    /* u0223 (ȣ)  ->  ou   */ /* 509 */
  (21*4 + 1),    /* u0224 (Ȥ)  ->  z    */ /* 510 */
  (21*4 + 1),    /* u0225 (ȥ)  ->  z    */ /* 511 */
  (17*4 + 1),    /* u0226 (Ȧ)  ->  a    */ /* 512 */
  (17*4 + 1),    /* u0227 (ȧ)  ->  a    */ /* 513 */
  (19*4 + 1),    /* u0228 (Ȩ)  ->  e    */ /* 514 */
  (19*4 + 1),    /* u0229 (ȩ)  ->  e    */ /* 515 */
  (23*4 + 2),    /* u022A (Ȫ)  ->  oe   */ /* 516 */
  (23*4 + 2),    /* u022B (ȫ)  ->  oe   */ /* 517 */
  (23*4 + 1),    /* u022C (Ȭ)  ->  o    */ /* 518 */
  (23*4 + 1),    /* u022D (ȭ)  ->  o    */ /* 519 */
  (23*4 + 1),    /* u022E (Ȯ)  ->  o    */ /* 520 */
  (23*4 + 1),    /* u022F (ȯ)  ->  o    */ /* 521 */
  (23*4 + 1),    /* u0230 (Ȱ)  ->  o    */ /* 522 */
  (23*4 + 1),    /* u0231 (ȱ)  ->  o    */ /* 523 */
  ( 9*4 + 1),    /* u0232 (Ȳ)  ->  y    */ /* 524 */
  ( 9*4 + 1),    /* u0233 (ȳ)  ->  y    */ /* 525 */
  0,                                       /* 526 */
  0,                                       /* 527 */
  0,                                       /* 528 */
  0,                                       /* 529 */
  0,                                       /* 530 */
  0,                                       /* 531 */
  0,                                       /* 532 */
  0,                                       /* 533 */
  0,                                       /* 534 */
  0,                                       /* 535 */
  0,                                       /* 536 */
  0,                                       /* 537 */
  0,                                       /* 538 */
  0,                                       /* 539 */
  0,                                       /* 540 */
  0,                                       /* 541 */
  0,                                       /* 542 */
  0,                                       /* 543 */
  0,                                       /* 544 */
  0,                                       /* 545 */
  0,                                       /* 546 */
  0,                                       /* 547 */
  0,                                       /* 548 */
  0,                                       /* 549 */
  0,                                       /* 550 */
  0,                                       /* 551 */
  0,                                       /* 552 */
  0,                                       /* 553 */
  (17*4 + 1),    /* u0250 (ɐ)  ->  a    */ /* 554 */
  (17*4 + 1),    /* u0251 (ɑ)  ->  a    */ /* 555 */
  (17*4 + 1),    /* u0252 (ɒ)  ->  a    */ /* 556 */
  (53*4 + 1),    /* u0253 (ɓ)  ->  b    */ /* 557 */
  (23*4 + 1),    /* u0254 (ɔ)  ->  o    */ /* 558 */
  ( 4*4 + 1),    /* u0255 (ɕ)  ->  c    */ /* 559 */
  (20*4 + 1),    /* u0256 (ɖ)  ->  d    */ /* 560 */
  (20*4 + 1),    /* u0257 (ɗ)  ->  d    */ /* 561 */
  (19*4 + 1),    /* u0258 (ɘ)  ->  e    */ /* 562 */
  (19*4 + 1),    /* u0259 (ə)  ->  e    */ /* 563 */
  (19*4 + 1),    /* u025A (ɚ)  ->  e    */ /* 564 */
  (19*4 + 1),    /* u025B (ɛ)  ->  e    */ /* 565 */
  (19*4 + 1),    /* u025C (ɜ)  ->  e    */ /* 566 */
  (19*4 + 1),    /* u025D (ɝ)  ->  e    */ /* 567 */
  (19*4 + 1),    /* u025E (ɞ)  ->  e    */ /* 568 */
  (29*4 + 1),    /* u025F (ɟ)  ->  j    */ /* 569 */
  (32*4 + 1),    /* u0260 (ɠ)  ->  g    */ /* 570 */
  (32*4 + 1),    /* u0261 (ɡ)  ->  g    */ /* 571 */
  (32*4 + 1),    /* u0262 (ɢ)  ->  g    */ /* 572 */
  (32*4 + 1),    /* u0263 (ɣ)  ->  g    */ /* 573 */
  (23*4 + 1),    /* u0264 (ɤ)  ->  o    */ /* 574 */
  ( 3*4 + 1),    /* u0265 (ɥ)  ->  h    */ /* 575 */
  ( 3*4 + 1),    /* u0266 (ɦ)  ->  h    */ /* 576 */
  ( 3*4 + 1),    /* u0267 (ɧ)  ->  h    */ /* 577 */
  (16*4 + 1),    /* u0268 (ɨ)  ->  i    */ /* 578 */
  (16*4 + 1),    /* u0269 (ɩ)  ->  i    */ /* 579 */
  (16*4 + 1),    /* u026A (ɪ)  ->  i    */ /* 580 */
  (11*4 + 1),    /* u026B (ɫ)  ->  l    */ /* 581 */
  (11*4 + 1),    /* u026C (ɬ)  ->  l    */ /* 582 */
  (11*4 + 1),    /* u026D (ɭ)  ->  l    */ /* 583 */
  (11*4 + 1),    /* u026E (ɮ)  ->  l    */ /* 584 */
  (55*4 + 1),    /* u026F (ɯ)  ->  m    */ /* 585 */
  (55*4 + 1),    /* u0270 (ɰ)  ->  m    */ /* 586 */
  (55*4 + 1),    /* u0271 (ɱ)  ->  m    */ /* 587 */
  (31*4 + 1),    /* u0272 (ɲ)  ->  n    */ /* 588 */
  (31*4 + 1),    /* u0273 (ɳ)  ->  n    */ /* 589 */
  (31*4 + 1),    /* u0274 (ɴ)  ->  n    */ /* 590 */
  (23*4 + 1),    /* u0275 (ɵ)  ->  o    */ /* 591 */
  (23*4 + 2),    /* u0276 (ɶ)  ->  oe   */ /* 592 */
  (23*4 + 1),    /* u0277 (ɷ)  ->  o    */ /* 593 */
  (40*4 + 2),    /* u0278 (ɸ)  ->  ph   */ /* 594 */
  (57*4 + 1),    /* u0279 (ɹ)  ->  r    */ /* 595 */
  (57*4 + 1),    /* u027A (ɺ)  ->  r    */ /* 596 */
  (57*4 + 1),    /* u027B (ɻ)  ->  r    */ /* 597 */
  (57*4 + 1),    /* u027C (ɼ)  ->  r    */ /* 598 */
  (57*4 + 1),    /* u027D (ɽ)  ->  r    */ /* 599 */
  (57*4 + 1),    /* u027E (ɾ)  ->  r    */ /* 600 */
  (57*4 + 1),    /* u027F (ɿ)  ->  r    */ /* 601 */
  (57*4 + 1),    /* u0280 (ʀ)  ->  r    */ /* 602 */
  (57*4 + 1),    /* u0281 (ʁ)  ->  r    */ /* 603 */
  ( 1*4 + 1),    /* u0282 (ʂ)  ->  s    */ /* 604 */
  ( 1*4 + 1),    /* u0283 (ʃ)  ->  s    */ /* 605 */
  (29*4 + 1),    /* u0284 (ʄ)  ->  j    */ /* 606 */
  ( 1*4 + 1),    /* u0285 (ʅ)  ->  s    */ /* 607 */
  ( 1*4 + 1),    /* u0286 (ʆ)  ->  s    */ /* 608 */
  (13*4 + 1),    /* u0287 (ʇ)  ->  t    */ /* 609 */
  (13*4 + 1),    /* u0288 (ʈ)  ->  t    */ /* 610 */
  (25*4 + 1),    /* u0289 (ʉ)  ->  u    */ /* 611 */
  (25*4 + 1),    /* u028A (ʊ)  ->  u    */ /* 612 */
  ( 7*4 + 1),    /* u028B (ʋ)  ->  v    */ /* 613 */
  ( 7*4 + 1),    /* u028C (ʌ)  ->  v    */ /* 614 */
  (15*4 + 1),    /* u028D (ʍ)  ->  w    */ /* 615 */
  ( 9*4 + 1),    /* u028E (ʎ)  ->  y    */ /* 616 */
  ( 9*4 + 1),    /* u028F (ʏ)  ->  y    */ /* 617 */
  (21*4 + 1),    /* u0290 (ʐ)  ->  z    */ /* 618 */
  (21*4 + 1),    /* u0291 (ʑ)  ->  z    */ /* 619 */
  (21*4 + 1),    /* u0292 (ʒ)  ->  z    */ /* 620 */
  (21*4 + 1),    /* u0293 (ʓ)  ->  z    */ /* 621 */
  (58*4 + 1),    /* u0294 (ʔ)  ->  x    */ /* 622 */
  (58*4 + 1),    /* u0295 (ʕ)  ->  x    */ /* 623 */
  (58*4 + 1),    /* u0296 (ʖ)  ->  x    */ /* 624 */
  ( 4*4 + 1),    /* u0297 (ʗ)  ->  c    */ /* 625 */
  ( 4*4 + 1),    /* u0298 (ʘ)  ->  c    */ /* 626 */
  (53*4 + 1),    /* u0299 (ʙ)  ->  b    */ /* 627 */
  (19*4 + 1),    /* u029A (ʚ)  ->  e    */ /* 628 */
  (32*4 + 1),    /* u029B (ʛ)  ->  g    */ /* 629 */
  ( 3*4 + 1),    /* u029C (ʜ)  ->  h    */ /* 630 */
  (29*4 + 1),    /* u029D (ʝ)  ->  j    */ /* 631 */
  (54*4 + 1),    /* u029E (ʞ)  ->  k    */ /* 632 */
  (11*4 + 1),    /* u029F (ʟ)  ->  l    */ /* 633 */
  (56*4 + 1),    /* u02A0 (ʠ)  ->  q    */ /* 634 */
  (52*4 + 1),    /* u02A1 (ʡ)  ->  '    */ /* 635 */
  (52*4 + 1),    /* u02A2 (ʢ)  ->  '    */ /* 636 */
  (20*4 + 2),    /* u02A3 (ʣ)  ->  dz   */ /* 637 */
  (20*4 + 2),    /* u02A4 (ʤ)  ->  dz   */ /* 638 */
  (20*4 + 2),    /* u02A5 (ʥ)  ->  dz   */ /* 639 */
  (42*4 + 2),    /* u02A6 (ʦ)  ->  ts   */ /* 640 */
  (42*4 + 2),    /* u02A7 (ʧ)  ->  ts   */ /* 641 */
  (44*4 + 2),    /* u02A8 (ʨ)  ->  tc   */ /* 642 */
  (46*4 + 2),    /* u02A9 (ʩ)  ->  fe   */ /* 643 */
  (11*4 + 2),    /* u02AA (ʪ)  ->  ls   */ /* 644 */
  (50*4 + 2),    /* u02AB (ʫ)  ->  lz   */ /* 645 */
  (53*4 + 1),    /* u02AC (ʬ)  ->  b    */ /* 646 */
  (20*4 + 1),    /* u02AD (ʭ)  ->  d    */ /* 647 */
  (17*4 + 1),    /* u0386 (Ά)  ->  a    */ /* 648 */
  0,                                       /* 649 */
  (19*4 + 1),    /* u0388 (Έ)  ->  e    */ /* 650 */
  (16*4 + 1),    /* u0389 (Ή)  ->  i    */ /* 651 */
  (16*4 + 1),    /* u038A (Ί)  ->  i    */ /* 652 */
  0,                                       /* 653 */
  (23*4 + 1),    /* u038C (Ό)  ->  o    */ /* 654 */
  0,                                       /* 655 */
  ( 9*4 + 1),    /* u038E (Ύ)  ->  y    */ /* 656 */
  (23*4 + 1),    /* u038F (Ώ)  ->  o    */ /* 657 */
  (16*4 + 1),    /* u0390 (ΐ)  ->  i    */ /* 658 */
  (17*4 + 1),    /* u0391 (Α)  ->  a    */ /* 659 */
  (53*4 + 1),    /* u0392 (Β)  ->  b    */ /* 660 */
  (32*4 + 1),    /* u0393 (Γ)  ->  g    */ /* 661 */
  (20*4 + 1),    /* u0394 (Δ)  ->  d    */ /* 662 */
  (19*4 + 1),    /* u0395 (Ε)  ->  e    */ /* 663 */
  (21*4 + 1),    /* u0396 (Ζ)  ->  z    */ /* 664 */
  (16*4 + 1),    /* u0397 (Η)  ->  i    */ /* 665 */
  (13*4 + 2),    /* u0398 (Θ)  ->  th   */ /* 666 */
  (16*4 + 1),    /* u0399 (Ι)  ->  i    */ /* 667 */
  (54*4 + 1),    /* u039A (Κ)  ->  k    */ /* 668 */
  (11*4 + 1),    /* u039B (Λ)  ->  l    */ /* 669 */
  (55*4 + 1),    /* u039C (Μ)  ->  m    */ /* 670 */
  (31*4 + 1),    /* u039D (Ν)  ->  n    */ /* 671 */
  (58*4 + 1),    /* u039E (Ξ)  ->  x    */ /* 672 */
  (23*4 + 1),    /* u039F (Ο)  ->  o    */ /* 673 */
  ( 0*4 + 1),    /* u03A0 (Π)  ->  p    */ /* 674 */
  (57*4 + 1),    /* u03A1 (Ρ)  ->  r    */ /* 675 */
  0,                                       /* 676 */
  ( 1*4 + 1),    /* u03A3 (Σ)  ->  s    */ /* 677 */
  (13*4 + 1),    /* u03A4 (Τ)  ->  t    */ /* 678 */
  ( 9*4 + 1),    /* u03A5 (Υ)  ->  y    */ /* 679 */
  (46*4 + 1),    /* u03A6 (Φ)  ->  f    */ /* 680 */
  ( 4*4 + 2),    /* u03A7 (Χ)  ->  ch   */ /* 681 */
  ( 0*4 + 2),    /* u03A8 (Ψ)  ->  ps   */ /* 682 */
  (23*4 + 1),    /* u03A9 (Ω)  ->  o    */ /* 683 */
  (16*4 + 1),    /* u03AA (Ϊ)  ->  i    */ /* 684 */
  ( 9*4 + 1),    /* u03AB (Ϋ)  ->  y    */ /* 685 */
  (17*4 + 1),    /* u03AC (ά)  ->  a    */ /* 686 */
  (19*4 + 1),    /* u03AD (έ)  ->  e    */ /* 687 */
  (16*4 + 1),    /* u03AE (ή)  ->  i    */ /* 688 */
  (16*4 + 1),    /* u03AF (ί)  ->  i    */ /* 689 */
  ( 9*4 + 1),    /* u03B0 (ΰ)  ->  y    */ /* 690 */
  (17*4 + 1),    /* u03B1 (α)  ->  a    */ /* 691 */
  (53*4 + 1),    /* u03B2 (β)  ->  b    */ /* 692 */
  (32*4 + 1),    /* u03B3 (γ)  ->  g    */ /* 693 */
  (20*4 + 1),    /* u03B4 (δ)  ->  d    */ /* 694 */
  (19*4 + 1),    /* u03B5 (ε)  ->  e    */ /* 695 */
  (21*4 + 1),    /* u03B6 (ζ)  ->  z    */ /* 696 */
  (16*4 + 1),    /* u03B7 (η)  ->  i    */ /* 697 */
  (13*4 + 2),    /* u03B8 (θ)  ->  th   */ /* 698 */
  (16*4 + 1),    /* u03B9 (ι)  ->  i    */ /* 699 */
  (54*4 + 1),    /* u03BA (κ)  ->  k    */ /* 700 */
  (11*4 + 1),    /* u03BB (λ)  ->  l    */ /* 701 */
  (55*4 + 1),    /* u03BC (μ)  ->  m    */ /* 702 */
  (31*4 + 1),    /* u03BD (ν)  ->  n    */ /* 703 */
  (58*4 + 1),    /* u03BE (ξ)  ->  x    */ /* 704 */
  (23*4 + 1),    /* u03BF (ο)  ->  o    */ /* 705 */
  ( 0*4 + 1),    /* u03C0 (π)  ->  p    */ /* 706 */
  (57*4 + 1),    /* u03C1 (ρ)  ->  r    */ /* 707 */
  ( 1*4 + 1),    /* u03C2 (ς)  ->  s    */ /* 708 */
  ( 1*4 + 1),    /* u03C3 (σ)  ->  s    */ /* 709 */
  (13*4 + 1),    /* u03C4 (τ)  ->  t    */ /* 710 */
  ( 9*4 + 1),    /* u03C5 (υ)  ->  y    */ /* 711 */
  (46*4 + 1),    /* u03C6 (φ)  ->  f    */ /* 712 */
  ( 4*4 + 2),    /* u03C7 (χ)  ->  ch   */ /* 713 */
  ( 0*4 + 2),    /* u03C8 (ψ)  ->  ps   */ /* 714 */
  (23*4 + 1),    /* u03C9 (ω)  ->  o    */ /* 715 */
  (16*4 + 1),    /* u03CA (ϊ)  ->  i    */ /* 716 */
  ( 9*4 + 1),    /* u03CB (ϋ)  ->  y    */ /* 717 */
  (23*4 + 1),    /* u03CC (ό)  ->  o    */ /* 718 */
  ( 9*4 + 1),    /* u03CD (ύ)  ->  y    */ /* 719 */
  (23*4 + 1),    /* u03CE (ώ)  ->  o    */ /* 720 */
  0,                                       /* 721 */
  0,                                       /* 722 */
  0,                                       /* 723 */
  0,                                       /* 724 */
  0,                                       /* 725 */
  0,                                       /* 726 */
  0,                                       /* 727 */
  0,                                       /* 728 */
  0,                                       /* 729 */
  (54*4 + 1),    /* u03D8 (Ϙ)  ->  k    */ /* 730 */
  (54*4 + 1),    /* u03D9 (ϙ)  ->  k    */ /* 731 */
  (12*4 + 2),    /* u03DA (Ϛ)  ->  st   */ /* 732 */
  (12*4 + 2),    /* u03DB (ϛ)  ->  st   */ /* 733 */
  (15*4 + 1),    /* u03DC (Ϝ)  ->  w    */ /* 734 */
  (15*4 + 1),    /* u03DD (ϝ)  ->  w    */ /* 735 */
  (54*4 + 1),    /* u03DE (Ϟ)  ->  k    */ /* 736 */
  (54*4 + 1),    /* u03DF (ϟ)  ->  k    */ /* 737 */
  (42*4 + 2),    /* u03E0 (Ϡ)  ->  ts   */ /* 738 */
  (42*4 + 2),    /* u03E1 (ϡ)  ->  ts   */ /* 739 */
  0,                                       /* 740 */
  0,                                       /* 741 */
  0,                                       /* 742 */
  0,                                       /* 743 */
  0,                                       /* 744 */
  0,                                       /* 745 */
  0,                                       /* 746 */
  0,                                       /* 747 */
  0,                                       /* 748 */
  0,                                       /* 749 */
  0,                                       /* 750 */
  0,                                       /* 751 */
  0,                                       /* 752 */
  0,                                       /* 753 */
  0,                                       /* 754 */
  0,                                       /* 755 */
  0,                                       /* 756 */
  0,                                       /* 757 */
  0,                                       /* 758 */
  0,                                       /* 759 */
  0,                                       /* 760 */
  0,                                       /* 761 */
  0,                                       /* 762 */
  0,                                       /* 763 */
  0,                                       /* 764 */
  0,                                       /* 765 */
  0,                                       /* 766 */
  0,                                       /* 767 */
  0,                                       /* 768 */
  0,                                       /* 769 */
  (19*4 + 1),    /* u0400 (Ѐ)  ->  e    */ /* 770 */
  (19*4 + 1),    /* u0401 (Ё)  ->  e    */ /* 771 */
  (20*4 + 1),    /* u0402 (Ђ)  ->  d    */ /* 772 */
  (32*4 + 1),    /* u0403 (Ѓ)  ->  g    */ /* 773 */
  (19*4 + 1),    /* u0404 (Є)  ->  e    */ /* 774 */
  (21*4 + 1),    /* u0405 (Ѕ)  ->  z    */ /* 775 */
  (16*4 + 1),    /* u0406 (І)  ->  i    */ /* 776 */
  (16*4 + 1),    /* u0407 (Ї)  ->  i    */ /* 777 */
  (29*4 + 1),    /* u0408 (Ј)  ->  j    */ /* 778 */
  (16*4 + 1),    /* u0409 (Љ)  ->  i    */ /* 779 */
  (31*4 + 1),    /* u040A (Њ)  ->  n    */ /* 780 */
  (20*4 + 1),    /* u040B (Ћ)  ->  d    */ /* 781 */
  (54*4 + 1),    /* u040C (Ќ)  ->  k    */ /* 782 */
  (16*4 + 1),    /* u040D (Ѝ)  ->  i    */ /* 783 */
  (25*4 + 1),    /* u040E (Ў)  ->  u    */ /* 784 */
  (20*4 + 1),    /* u040F (Џ)  ->  d    */ /* 785 */
  (17*4 + 1),    /* u0410 (А)  ->  a    */ /* 786 */
  (53*4 + 1),    /* u0411 (Б)  ->  b    */ /* 787 */
  ( 7*4 + 1),    /* u0412 (В)  ->  v    */ /* 788 */
  (32*4 + 1),    /* u0413 (Г)  ->  g    */ /* 789 */
  (20*4 + 1),    /* u0414 (Д)  ->  d    */ /* 790 */
  (19*4 + 1),    /* u0415 (Е)  ->  e    */ /* 791 */
  (21*4 + 2),    /* u0416 (Ж)  ->  zh   */ /* 792 */
  (21*4 + 1),    /* u0417 (З)  ->  z    */ /* 793 */
  (16*4 + 1),    /* u0418 (И)  ->  i    */ /* 794 */
  (16*4 + 1),    /* u0419 (Й)  ->  i    */ /* 795 */
  (54*4 + 1),    /* u041A (К)  ->  k    */ /* 796 */
  (11*4 + 1),    /* u041B (Л)  ->  l    */ /* 797 */
  (55*4 + 1),    /* u041C (М)  ->  m    */ /* 798 */
  (31*4 + 1),    /* u041D (Н)  ->  n    */ /* 799 */
  (23*4 + 1),    /* u041E (О)  ->  o    */ /* 800 */
  ( 0*4 + 1),    /* u041F (П)  ->  p    */ /* 801 */
  (57*4 + 1),    /* u0420 (Р)  ->  r    */ /* 802 */
  ( 1*4 + 1),    /* u0421 (С)  ->  s    */ /* 803 */
  (13*4 + 1),    /* u0422 (Т)  ->  t    */ /* 804 */
  (25*4 + 1),    /* u0423 (У)  ->  u    */ /* 805 */
  (46*4 + 1),    /* u0424 (Ф)  ->  f    */ /* 806 */
  (59*4 + 2),    /* u0425 (Х)  ->  kh   */ /* 807 */
  (44*4 + 2),    /* u0426 (Ц)  ->  tc   */ /* 808 */
  ( 4*4 + 2),    /* u0427 (Ч)  ->  ch   */ /* 809 */
  ( 2*4 + 2),    /* u0428 (Ш)  ->  sh   */ /* 810 */
  ( 2*4 + 4),    /* u0429 (Щ)  ->  shch */ /* 811 */
  (17*4 + 1),    /* u042A (Ъ)  ->  a    */ /* 812 */
  ( 9*4 + 1),    /* u042B (Ы)  ->  y    */ /* 813 */
  ( 9*4 + 1),    /* u042C (Ь)  ->  y    */ /* 814 */
  (19*4 + 1),    /* u042D (Э)  ->  e    */ /* 815 */
  (61*4 + 2),    /* u042E (Ю)  ->  iu   */ /* 816 */
  (16*4 + 2),    /* u042F (Я)  ->  ia   */ /* 817 */
  (17*4 + 1),    /* u0430 (а)  ->  a    */ /* 818 */
  (53*4 + 1),    /* u0431 (б)  ->  b    */ /* 819 */
  ( 7*4 + 1),    /* u0432 (в)  ->  v    */ /* 820 */
  (32*4 + 1),    /* u0433 (г)  ->  g    */ /* 821 */
  (20*4 + 1),    /* u0434 (д)  ->  d    */ /* 822 */
  (19*4 + 1),    /* u0435 (е)  ->  e    */ /* 823 */
  (21*4 + 2),    /* u0436 (ж)  ->  zh   */ /* 824 */
  (21*4 + 1),    /* u0437 (з)  ->  z    */ /* 825 */
  (16*4 + 1),    /* u0438 (и)  ->  i    */ /* 826 */
  (16*4 + 1),    /* u0439 (й)  ->  i    */ /* 827 */
  (54*4 + 1),    /* u043A (к)  ->  k    */ /* 828 */
  (11*4 + 1),    /* u043B (л)  ->  l    */ /* 829 */
  (55*4 + 1),    /* u043C (м)  ->  m    */ /* 830 */
  (31*4 + 1),    /* u043D (н)  ->  n    */ /* 831 */
  (23*4 + 1),    /* u043E (о)  ->  o    */ /* 832 */
  ( 0*4 + 1),    /* u043F (п)  ->  p    */ /* 833 */
  (57*4 + 1),    /* u0440 (р)  ->  r    */ /* 834 */
  ( 1*4 + 1),    /* u0441 (с)  ->  s    */ /* 835 */
  (13*4 + 1),    /* u0442 (т)  ->  t    */ /* 836 */
  (25*4 + 1),    /* u0443 (у)  ->  u    */ /* 837 */
  (46*4 + 1),    /* u0444 (ф)  ->  f    */ /* 838 */
  (59*4 + 2),    /* u0445 (х)  ->  kh   */ /* 839 */
  (44*4 + 2),    /* u0446 (ц)  ->  tc   */ /* 840 */
  ( 4*4 + 2),    /* u0447 (ч)  ->  ch   */ /* 841 */
  ( 2*4 + 2),    /* u0448 (ш)  ->  sh   */ /* 842 */
  ( 2*4 + 4),    /* u0449 (щ)  ->  shch */ /* 843 */
  (17*4 + 1),    /* u044A (ъ)  ->  a    */ /* 844 */
  ( 9*4 + 1),    /* u044B (ы)  ->  y    */ /* 845 */
  ( 9*4 + 1),    /* u044C (ь)  ->  y    */ /* 846 */
  (19*4 + 1),    /* u044D (э)  ->  e    */ /* 847 */
  (61*4 + 2),    /* u044E (ю)  ->  iu   */ /* 848 */
  (16*4 + 2),    /* u044F (я)  ->  ia   */ /* 849 */
  (19*4 + 1),    /* u0450 (ѐ)  ->  e    */ /* 850 */
  (19*4 + 1),    /* u0451 (ё)  ->  e    */ /* 851 */
  (20*4 + 1),    /* u0452 (ђ)  ->  d    */ /* 852 */
  (32*4 + 1),    /* u0453 (ѓ)  ->  g    */ /* 853 */
  (19*4 + 1),    /* u0454 (є)  ->  e    */ /* 854 */
  (21*4 + 1),    /* u0455 (ѕ)  ->  z    */ /* 855 */
  (16*4 + 1),    /* u0456 (і)  ->  i    */ /* 856 */
  (16*4 + 1),    /* u0457 (ї)  ->  i    */ /* 857 */
  (29*4 + 1),    /* u0458 (ј)  ->  j    */ /* 858 */
  (16*4 + 1),    /* u0459 (љ)  ->  i    */ /* 859 */
  (31*4 + 1),    /* u045A (њ)  ->  n    */ /* 860 */
  (20*4 + 1),    /* u045B (ћ)  ->  d    */ /* 861 */
  (54*4 + 1),    /* u045C (ќ)  ->  k    */ /* 862 */
  (16*4 + 1),    /* u045D (ѝ)  ->  i    */ /* 863 */
  (25*4 + 1),    /* u045E (ў)  ->  u    */ /* 864 */
  (20*4 + 1),    /* u045F (џ)  ->  d    */ /* 865 */
  (19*4 + 1),    /* u05B0 (ְ)  ->  e    */ /* 866 */
  (19*4 + 1),    /* u05B1 (ֱ)  ->  e    */ /* 867 */
  (17*4 + 1),    /* u05B2 (ֲ)  ->  a    */ /* 868 */
  (23*4 + 1),    /* u05B3 (ֳ)  ->  o    */ /* 869 */
  (16*4 + 1),    /* u05B4 (ִ)  ->  i    */ /* 870 */
  (19*4 + 1),    /* u05B5 (ֵ)  ->  e    */ /* 871 */
  (19*4 + 1),    /* u05B6 (ֶ)  ->  e    */ /* 872 */
  (17*4 + 1),    /* u05B7 (ַ)  ->  a    */ /* 873 */
  (17*4 + 1),    /* u05B8 (ָ)  ->  a    */ /* 874 */
  (23*4 + 1),    /* u05B9 (ֹ)  ->  o    */ /* 875 */
  0,                                       /* 876 */
  (25*4 + 1),    /* u05BB (ֻ)  ->  u    */ /* 877 */
  (17*4 + 1),    /* u05BC (ּ)  ->  a    */ /* 878 */
  ( 1*4 + 0),    /* u05BD (ֽ)  ->       */ /* 879 */
  ( 1*4 + 0),    /* u05BE (־)  ->       */ /* 880 */
  (19*4 + 1),    /* u05BF (ֿ)  ->  e    */ /* 881 */
  0,                                       /* 882 */
  ( 2*4 + 2),    /* u05C1 (ׁ)  ->  sh   */ /* 883 */
  ( 1*4 + 1),    /* u05C2 (ׂ)  ->  s    */ /* 884 */
  0,                                       /* 885 */
  ( 1*4 + 0),    /* u05C4 (ׄ)  ->       */ /* 886 */
  0,                                       /* 887 */
  0,                                       /* 888 */
  0,                                       /* 889 */
  0,                                       /* 890 */
  0,                                       /* 891 */
  0,                                       /* 892 */
  0,                                       /* 893 */
  0,                                       /* 894 */
  0,                                       /* 895 */
  0,                                       /* 896 */
  0,                                       /* 897 */
  ( 1*4 + 0),    /* u05D0 (א)  ->       */ /* 898 */
  (53*4 + 1),    /* u05D1 (ב)  ->  b    */ /* 899 */
  (32*4 + 1),    /* u05D2 (ג)  ->  g    */ /* 900 */
  (20*4 + 1),    /* u05D3 (ד)  ->  d    */ /* 901 */
  ( 3*4 + 1),    /* u05D4 (ה)  ->  h    */ /* 902 */
  ( 7*4 + 1),    /* u05D5 (ו)  ->  v    */ /* 903 */
  (21*4 + 1),    /* u05D6 (ז)  ->  z    */ /* 904 */
  ( 3*4 + 1),    /* u05D7 (ח)  ->  h    */ /* 905 */
  (13*4 + 1),    /* u05D8 (ט)  ->  t    */ /* 906 */
  ( 9*4 + 1),    /* u05D9 (י)  ->  y    */ /* 907 */
  (54*4 + 1),    /* u05DA (ך)  ->  k    */ /* 908 */
  (54*4 + 1),    /* u05DB (כ)  ->  k    */ /* 909 */
  (11*4 + 1),    /* u05DC (ל)  ->  l    */ /* 910 */
  (55*4 + 1),    /* u05DD (ם)  ->  m    */ /* 911 */
  (55*4 + 1),    /* u05DE (מ)  ->  m    */ /* 912 */
  (31*4 + 1),    /* u05DF (ן)  ->  n    */ /* 913 */
  (31*4 + 1),    /* u05E0 (נ)  ->  n    */ /* 914 */
  ( 1*4 + 1),    /* u05E1 (ס)  ->  s    */ /* 915 */
  ( 1*4 + 0),    /* u05E2 (ע)  ->       */ /* 916 */
  ( 0*4 + 1),    /* u05E3 (ף)  ->  p    */ /* 917 */
  ( 0*4 + 1),    /* u05E4 (פ)  ->  p    */ /* 918 */
  (42*4 + 2),    /* u05E5 (ץ)  ->  ts   */ /* 919 */
  (42*4 + 2),    /* u05E6 (צ)  ->  ts   */ /* 920 */
  (56*4 + 1),    /* u05E7 (ק)  ->  q    */ /* 921 */
  (57*4 + 1),    /* u05E8 (ר)  ->  r    */ /* 922 */
  ( 2*4 + 2),    /* u05E9 (ש)  ->  sh   */ /* 923 */
  (13*4 + 1),    /* u05EA (ת)  ->  t    */ /* 924 */
  0,                                       /* 925 */
  0,                                       /* 926 */
  0,                                       /* 927 */
  0,                                       /* 928 */
  0,                                       /* 929 */
  ( 7*4 + 2),    /* u05F0 (װ)  ->  vv   */ /* 930 */
  ( 8*4 + 2),    /* u05F1 (ױ)  ->  vy   */ /* 931 */
  ( 9*4 + 2),    /* u05F2 (ײ)  ->  yy   */ /* 932 */
};

/* Maximum token length.  Longer tokens are truncated */
#define MX_TRANSLIT  40

/* The cursor object for the translit tokenizer */
typedef struct translit_tokenizer_cursor {
  sqlite3_tokenizer_cursor base;  /* Base class.  Must be first */
  const unsigned char *zInput;    /* input we are tokenizing */
  int nBytes;                     /* size of the input */
  int iOffset;                    /* current position in pInput */
  int iToken;                     /* index of next token to be returned */
  char zToken[MX_TRANSLIT+1];     /* storage for current token */
} translit_tokenizer_cursor;

/*
** Create a new tokenizer instance.
*/
static int translitCreate(
  int argc, const char * const *argv,
  sqlite3_tokenizer **ppTokenizer
){
  sqlite3_tokenizer *p;
  *ppTokenizer = p = (sqlite3_tokenizer*)sqlite3_malloc(sizeof(*p));
  if( p==NULL ) return SQLITE_NOMEM;
  memset(p, 0, sizeof(*p));
  return SQLITE_OK;
}

/*
** Destroy a tokenizer
*/
static int translitDestroy(sqlite3_tokenizer *pTokenizer){
  sqlite3_free(pTokenizer);
  return SQLITE_OK;
}

/*
** Prepare to begin tokenizing a particular string.  The input
** string to be tokenized is pInput[0..nBytes-1].  A cursor
** used to incrementally tokenize this string is returned in 
** *ppCursor.
*/
static int translitOpen(
  sqlite3_tokenizer *pTokenizer,         /* The tokenizer */
  const char *zInput, int nBytes,        /* String to be tokenized */
  sqlite3_tokenizer_cursor **ppCursor    /* OUT: Tokenization cursor */
){
  translit_tokenizer_cursor *pCur;

  UNUSED_PARAMETER(pTokenizer);

  pCur = (translit_tokenizer_cursor *) sqlite3_malloc(sizeof(*pCur));
  if( pCur==NULL ) return SQLITE_NOMEM;
  memset(pCur, 0, sizeof(*pCur));

  pCur->zInput = (const unsigned char*)zInput;
  if( zInput==0 ){
    pCur->nBytes = 0;
  }else if( nBytes<0 ){
    pCur->nBytes = (int)strlen(zInput);
  }else{
    pCur->nBytes = nBytes;
  }
  pCur->iOffset = 0;                 /* start tokenizing at the beginning */
  pCur->iToken = 0;
  *ppCursor = &pCur->base;
  return SQLITE_OK;
}

/*
** Close a tokenization cursor previously opened by a call to
** translitOpen() above.
*/
static int translitClose(sqlite3_tokenizer_cursor *pCursor){
  sqlite3_free(pCursor);
  return SQLITE_OK;
}


/*
** Extract the next token from a tokenization cursor.  The cursor must
** have been opened by a prior call to translitOpen().
*/
static int translitNext(
  sqlite3_tokenizer_cursor *pCursor,  /* Cursor returned by translitOpen */
  const char **ppToken,               /* OUT: *ppToken is the token text */
  int *pnBytes,                       /* OUT: Number of bytes in token */
  int *piStartOffset,                 /* OUT: Starting offset of token */
  int *piEndOffset,                   /* OUT: Ending offset of token */
  int *piPosition                     /* OUT: Position integer of token */
){
  translit_tokenizer_cursor *pCur = (translit_tokenizer_cursor *) pCursor;
  int n = 0;              /* Number of characters in the generated token */
  int u = 0;              /* Unicode value of the next input character */
  int i;                  /* Index of transliteration of u in aTranslat[] */
  unsigned char c;        /* Next input character */
  unsigned char t;        /* aTranslat[u] - 1 */
  int j, k;               /* Loop counters */
  

  *ppToken = pCur->zToken;
  while( pCur->iOffset<pCur->nBytes ){
    if( n==0 ) *piStartOffset = pCur->iOffset;
    c = pCur->zInput[pCur->iOffset++];
    u = c;
    if( (c&0x80)==0 ){
      i = c;
    }else{
      i = 0;
      if( pCur->iOffset<pCur->nBytes ){
        u = ((int)(c&0x3f)<<6);
        c = pCur->zInput[pCur->iOffset++];
        if( (c&0xc0)!=0x80 ){
          i = 0;
        }else{
          u |= c&0x3f;
          i = u;
          while( pCur->iOffset<pCur->nBytes
              && (pCur->zInput[pCur->iOffset]&0xc0)==0x80 ){
            pCur->iOffset++;
            u = 0x0300;  /* Assume a combining accent character */
          }
          if( u>=0x02ae ){
            if( u<=0x0385 ){
              if( u>=0x0300 && u<=0x036f ){
                continue; /* Skip Combining accents */
              }
              i = 0;
            }else{
              i -= 0x0386 - 0x02ae;
              if( u>=0x0460 ){
                if( u<0x0591 ){
                  i = 0;
                }else if( u>=0x05b0 && u<0x05f2 ){
                  i -= 0x05b0 - 0x0460;
                }else{
                  continue;  /* Assume a combining accent character */
                }
              }
            }
          }
        }
      }
    }
    if( i ) i -= 0x0026;
    assert( i>=0 && i<sizeof(aTranslate) );
    t = aTranslate[i];
    if( t==0 ){
      if( n==0 ){
        continue;  /* Skip leading delimiters */
      }else{
        break;     /* Stop at the first delimiter */
      }
    }else{
      t--;
      j = (t%4) + 1;
      k = t/4;
      while( n<MX_TRANSLIT && (j--)>0 ) pCur->zToken[n++] = zTranslit[k++];
    }
  }
  pCur->zToken[n] = 0;
  *pnBytes = n;
  *piEndOffset = pCur->iOffset;
  *piPosition = pCur->iToken;
  if( n ){
    pCur->iToken++;
    return SQLITE_OK;
  }else{
    return SQLITE_DONE;
  }
}

/*
** The set of routines that implement the translit tokenizer
*/
static const sqlite3_tokenizer_module translitTokenizerModule = {
  0,
  translitCreate,
  translitDestroy,
  translitOpen,
  translitClose,
  translitNext,
  0,
};

/*
** Allocate a new translit tokenizer.  Return a pointer to the new
** tokenizer in *ppModule
*/
void sqlite3Fts3TranslitTokenizerModule(
  sqlite3_tokenizer_module const**ppModule
){
  *ppModule = &translitTokenizerModule;
}

#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) */