1 // Generated by scripts/mapgen.py
2 // 2019-08-31
3 
4 use super::fold::Fold;
5 
6 use core::char;
lookup(orig: char) -> Fold7 pub fn lookup(orig: char) -> Fold {
8     // The code below is is intended to reduce the binary size from that of a simple 1:1 lookup table.
9     // It exploits two facts:
10     // 1. Many of the mappings form ranges mapped to other ranges.
11     //    To benefit from this, we match on ranges instead of single numbers.
12     //    Alone, this decreases the binary size but results in performance regression over the simple 1:1 lookup.
13     // 2. Most of the mappings are from relatively small chars (0 - 0x2CFF).
14     //    To benefit from this, we use a jump table based on the high byte for this range.
15     //    This more than recovers the performance regression from exploting fact #1, at least in the tested benchmark.
16     let from = orig as u32;
17     if from <= 0x2CFF {
18         let from = from as u16;
19         let high_byte = (from >> 8) as u8;
20         let low_byte = (from & 0xff) as u8;
21         let single_char: u16 = match high_byte {
22             0x00 => {
23                 match low_byte {
24                     x @ _ if 0x41 <= x && x <= 0x5a  => from.wrapping_add(0x0020),
25                     0xb5 => 0x03bc,
26                     x @ _ if 0xc0 <= x && x <= 0xd6  => from.wrapping_add(0x0020),
27                     x @ _ if 0xd8 <= x && x <= 0xde  => from.wrapping_add(0x0020),
28                     0xdf => return Fold::Two('\u{0073}', '\u{0073}',),
29                     _ => from
30                 }
31             }
32             0x01 => {
33                 match low_byte {
34                     x @ _ if x <= 0x2e  => (from | 1),
35                     0x30 => return Fold::Two('\u{0069}', '\u{0307}',),
36                     x @ _ if 0x32 <= x && x <= 0x36  => (from | 1),
37                     x @ _ if 0x39 <= x && x <= 0x47  => ((from+1) & !1),
38                     0x49 => return Fold::Two('\u{02bc}', '\u{006e}',),
39                     x @ _ if 0x4a <= x && x <= 0x76  => (from | 1),
40                     0x78 => 0x00ff,
41                     x @ _ if 0x79 <= x && x <= 0x7d  => ((from+1) & !1),
42                     0x7f => 0x0073,
43                     0x81 => 0x0253,
44                     x @ _ if 0x82 <= x && x <= 0x84  => (from | 1),
45                     0x86 => 0x0254,
46                     0x87 => 0x0188,
47                     x @ _ if 0x89 <= x && x <= 0x8a  => from.wrapping_add(0x00cd),
48                     0x8b => 0x018c,
49                     0x8e => 0x01dd,
50                     0x8f => 0x0259,
51                     0x90 => 0x025b,
52                     0x91 => 0x0192,
53                     0x93 => 0x0260,
54                     0x94 => 0x0263,
55                     0x96 => 0x0269,
56                     0x97 => 0x0268,
57                     0x98 => 0x0199,
58                     0x9c => 0x026f,
59                     0x9d => 0x0272,
60                     0x9f => 0x0275,
61                     x @ _ if 0xa0 <= x && x <= 0xa4  => (from | 1),
62                     0xa6 => 0x0280,
63                     0xa7 => 0x01a8,
64                     0xa9 => 0x0283,
65                     0xac => 0x01ad,
66                     0xae => 0x0288,
67                     0xaf => 0x01b0,
68                     x @ _ if 0xb1 <= x && x <= 0xb2  => from.wrapping_add(0x00d9),
69                     x @ _ if 0xb3 <= x && x <= 0xb5  => ((from+1) & !1),
70                     0xb7 => 0x0292,
71                     0xb8 => 0x01b9,
72                     0xbc => 0x01bd,
73                     0xc4 => 0x01c6,
74                     0xc5 => 0x01c6,
75                     0xc7 => 0x01c9,
76                     0xc8 => 0x01c9,
77                     0xca => 0x01cc,
78                     x @ _ if 0xcb <= x && x <= 0xdb  => ((from+1) & !1),
79                     x @ _ if 0xde <= x && x <= 0xee  => (from | 1),
80                     0xf0 => return Fold::Two('\u{006a}', '\u{030c}',),
81                     0xf1 => 0x01f3,
82                     x @ _ if 0xf2 <= x && x <= 0xf4  => (from | 1),
83                     0xf6 => 0x0195,
84                     0xf7 => 0x01bf,
85                     x @ _ if 0xf8 <= x  => (from | 1),
86                     _ => from
87                 }
88             }
89             0x02 => {
90                 match low_byte {
91                     x @ _ if x <= 0x1e  => (from | 1),
92                     0x20 => 0x019e,
93                     x @ _ if 0x22 <= x && x <= 0x32  => (from | 1),
94                     0x3a => 0x2c65,
95                     0x3b => 0x023c,
96                     0x3d => 0x019a,
97                     0x3e => 0x2c66,
98                     0x41 => 0x0242,
99                     0x43 => 0x0180,
100                     0x44 => 0x0289,
101                     0x45 => 0x028c,
102                     x @ _ if 0x46 <= x && x <= 0x4e  => (from | 1),
103                     _ => from
104                 }
105             }
106             0x03 => {
107                 match low_byte {
108                     0x45 => 0x03b9,
109                     x @ _ if 0x70 <= x && x <= 0x72  => (from | 1),
110                     0x76 => 0x0377,
111                     0x7f => 0x03f3,
112                     0x86 => 0x03ac,
113                     x @ _ if 0x88 <= x && x <= 0x8a  => from.wrapping_add(0x0025),
114                     0x8c => 0x03cc,
115                     x @ _ if 0x8e <= x && x <= 0x8f  => from.wrapping_add(0x003f),
116                     0x90 => return Fold::Three('\u{03b9}', '\u{0308}', '\u{0301}',),
117                     x @ _ if 0x91 <= x && x <= 0xa1  => from.wrapping_add(0x0020),
118                     x @ _ if 0xa3 <= x && x <= 0xab  => from.wrapping_add(0x0020),
119                     0xb0 => return Fold::Three('\u{03c5}', '\u{0308}', '\u{0301}',),
120                     0xc2 => 0x03c3,
121                     0xcf => 0x03d7,
122                     0xd0 => 0x03b2,
123                     0xd1 => 0x03b8,
124                     0xd5 => 0x03c6,
125                     0xd6 => 0x03c0,
126                     x @ _ if 0xd8 <= x && x <= 0xee  => (from | 1),
127                     0xf0 => 0x03ba,
128                     0xf1 => 0x03c1,
129                     0xf4 => 0x03b8,
130                     0xf5 => 0x03b5,
131                     0xf7 => 0x03f8,
132                     0xf9 => 0x03f2,
133                     0xfa => 0x03fb,
134                     x @ _ if 0xfd <= x  => from.wrapping_sub(0x0082),
135                     _ => from
136                 }
137             }
138             0x04 => {
139                 match low_byte {
140                     x @ _ if x <= 0x0f  => from.wrapping_add(0x0050),
141                     x @ _ if 0x10 <= x && x <= 0x2f  => from.wrapping_add(0x0020),
142                     x @ _ if 0x60 <= x && x <= 0x80  => (from | 1),
143                     x @ _ if 0x8a <= x && x <= 0xbe  => (from | 1),
144                     0xc0 => 0x04cf,
145                     x @ _ if 0xc1 <= x && x <= 0xcd  => ((from+1) & !1),
146                     x @ _ if 0xd0 <= x  => (from | 1),
147                     _ => from
148                 }
149             }
150             0x05 => {
151                 match low_byte {
152                     x @ _ if x <= 0x2e  => (from | 1),
153                     x @ _ if 0x31 <= x && x <= 0x56  => from.wrapping_add(0x0030),
154                     0x87 => return Fold::Two('\u{0565}', '\u{0582}',),
155                     _ => from
156                 }
157             }
158             0x06 => {
159                 from
160             }
161             0x07 => {
162                 from
163             }
164             0x08 => {
165                 from
166             }
167             0x09 => {
168                 from
169             }
170             0x0a => {
171                 from
172             }
173             0x0b => {
174                 from
175             }
176             0x0c => {
177                 from
178             }
179             0x0d => {
180                 from
181             }
182             0x0e => {
183                 from
184             }
185             0x0f => {
186                 from
187             }
188             0x10 => {
189                 match low_byte {
190                     x @ _ if 0xa0 <= x && x <= 0xc5  => from.wrapping_add(0x1c60),
191                     0xc7 => 0x2d27,
192                     0xcd => 0x2d2d,
193                     _ => from
194                 }
195             }
196             0x11 => {
197                 from
198             }
199             0x12 => {
200                 from
201             }
202             0x13 => {
203                 match low_byte {
204                     x @ _ if 0xf8 <= x && x <= 0xfd  => from.wrapping_sub(0x0008),
205                     _ => from
206                 }
207             }
208             0x14 => {
209                 from
210             }
211             0x15 => {
212                 from
213             }
214             0x16 => {
215                 from
216             }
217             0x17 => {
218                 from
219             }
220             0x18 => {
221                 from
222             }
223             0x19 => {
224                 from
225             }
226             0x1a => {
227                 from
228             }
229             0x1b => {
230                 from
231             }
232             0x1c => {
233                 match low_byte {
234                     0x80 => 0x0432,
235                     0x81 => 0x0434,
236                     0x82 => 0x043e,
237                     x @ _ if 0x83 <= x && x <= 0x84  => from.wrapping_sub(0x1842),
238                     0x85 => 0x0442,
239                     0x86 => 0x044a,
240                     0x87 => 0x0463,
241                     0x88 => 0xa64b,
242                     x @ _ if 0x90 <= x && x <= 0xba  => from.wrapping_sub(0x0bc0),
243                     x @ _ if 0xbd <= x && x <= 0xbf  => from.wrapping_sub(0x0bc0),
244                     _ => from
245                 }
246             }
247             0x1d => {
248                 from
249             }
250             0x1e => {
251                 match low_byte {
252                     x @ _ if x <= 0x94  => (from | 1),
253                     0x96 => return Fold::Two('\u{0068}', '\u{0331}',),
254                     0x97 => return Fold::Two('\u{0074}', '\u{0308}',),
255                     0x98 => return Fold::Two('\u{0077}', '\u{030a}',),
256                     0x99 => return Fold::Two('\u{0079}', '\u{030a}',),
257                     0x9a => return Fold::Two('\u{0061}', '\u{02be}',),
258                     0x9b => 0x1e61,
259                     0x9e => return Fold::Two('\u{0073}', '\u{0073}',),
260                     x @ _ if 0xa0 <= x && x <= 0xfe  => (from | 1),
261                     _ => from
262                 }
263             }
264             0x1f => {
265                 match low_byte {
266                     x @ _ if 0x08 <= x && x <= 0x0f  => from.wrapping_sub(0x0008),
267                     x @ _ if 0x18 <= x && x <= 0x1d  => from.wrapping_sub(0x0008),
268                     x @ _ if 0x28 <= x && x <= 0x2f  => from.wrapping_sub(0x0008),
269                     x @ _ if 0x38 <= x && x <= 0x3f  => from.wrapping_sub(0x0008),
270                     x @ _ if 0x48 <= x && x <= 0x4d  => from.wrapping_sub(0x0008),
271                     0x50 => return Fold::Two('\u{03c5}', '\u{0313}',),
272                     0x52 => return Fold::Three('\u{03c5}', '\u{0313}', '\u{0300}',),
273                     0x54 => return Fold::Three('\u{03c5}', '\u{0313}', '\u{0301}',),
274                     0x56 => return Fold::Three('\u{03c5}', '\u{0313}', '\u{0342}',),
275                     x @ _ if 0x59 <= x && x <= 0x5f  => if (from & 1) == 1 { from.wrapping_sub(0x0008) } else { from },
276                     x @ _ if 0x68 <= x && x <= 0x6f  => from.wrapping_sub(0x0008),
277                     0x80 => return Fold::Two('\u{1f00}', '\u{03b9}',),
278                     0x81 => return Fold::Two('\u{1f01}', '\u{03b9}',),
279                     0x82 => return Fold::Two('\u{1f02}', '\u{03b9}',),
280                     0x83 => return Fold::Two('\u{1f03}', '\u{03b9}',),
281                     0x84 => return Fold::Two('\u{1f04}', '\u{03b9}',),
282                     0x85 => return Fold::Two('\u{1f05}', '\u{03b9}',),
283                     0x86 => return Fold::Two('\u{1f06}', '\u{03b9}',),
284                     0x87 => return Fold::Two('\u{1f07}', '\u{03b9}',),
285                     0x88 => return Fold::Two('\u{1f00}', '\u{03b9}',),
286                     0x89 => return Fold::Two('\u{1f01}', '\u{03b9}',),
287                     0x8a => return Fold::Two('\u{1f02}', '\u{03b9}',),
288                     0x8b => return Fold::Two('\u{1f03}', '\u{03b9}',),
289                     0x8c => return Fold::Two('\u{1f04}', '\u{03b9}',),
290                     0x8d => return Fold::Two('\u{1f05}', '\u{03b9}',),
291                     0x8e => return Fold::Two('\u{1f06}', '\u{03b9}',),
292                     0x8f => return Fold::Two('\u{1f07}', '\u{03b9}',),
293                     0x90 => return Fold::Two('\u{1f20}', '\u{03b9}',),
294                     0x91 => return Fold::Two('\u{1f21}', '\u{03b9}',),
295                     0x92 => return Fold::Two('\u{1f22}', '\u{03b9}',),
296                     0x93 => return Fold::Two('\u{1f23}', '\u{03b9}',),
297                     0x94 => return Fold::Two('\u{1f24}', '\u{03b9}',),
298                     0x95 => return Fold::Two('\u{1f25}', '\u{03b9}',),
299                     0x96 => return Fold::Two('\u{1f26}', '\u{03b9}',),
300                     0x97 => return Fold::Two('\u{1f27}', '\u{03b9}',),
301                     0x98 => return Fold::Two('\u{1f20}', '\u{03b9}',),
302                     0x99 => return Fold::Two('\u{1f21}', '\u{03b9}',),
303                     0x9a => return Fold::Two('\u{1f22}', '\u{03b9}',),
304                     0x9b => return Fold::Two('\u{1f23}', '\u{03b9}',),
305                     0x9c => return Fold::Two('\u{1f24}', '\u{03b9}',),
306                     0x9d => return Fold::Two('\u{1f25}', '\u{03b9}',),
307                     0x9e => return Fold::Two('\u{1f26}', '\u{03b9}',),
308                     0x9f => return Fold::Two('\u{1f27}', '\u{03b9}',),
309                     0xa0 => return Fold::Two('\u{1f60}', '\u{03b9}',),
310                     0xa1 => return Fold::Two('\u{1f61}', '\u{03b9}',),
311                     0xa2 => return Fold::Two('\u{1f62}', '\u{03b9}',),
312                     0xa3 => return Fold::Two('\u{1f63}', '\u{03b9}',),
313                     0xa4 => return Fold::Two('\u{1f64}', '\u{03b9}',),
314                     0xa5 => return Fold::Two('\u{1f65}', '\u{03b9}',),
315                     0xa6 => return Fold::Two('\u{1f66}', '\u{03b9}',),
316                     0xa7 => return Fold::Two('\u{1f67}', '\u{03b9}',),
317                     0xa8 => return Fold::Two('\u{1f60}', '\u{03b9}',),
318                     0xa9 => return Fold::Two('\u{1f61}', '\u{03b9}',),
319                     0xaa => return Fold::Two('\u{1f62}', '\u{03b9}',),
320                     0xab => return Fold::Two('\u{1f63}', '\u{03b9}',),
321                     0xac => return Fold::Two('\u{1f64}', '\u{03b9}',),
322                     0xad => return Fold::Two('\u{1f65}', '\u{03b9}',),
323                     0xae => return Fold::Two('\u{1f66}', '\u{03b9}',),
324                     0xaf => return Fold::Two('\u{1f67}', '\u{03b9}',),
325                     0xb2 => return Fold::Two('\u{1f70}', '\u{03b9}',),
326                     0xb3 => return Fold::Two('\u{03b1}', '\u{03b9}',),
327                     0xb4 => return Fold::Two('\u{03ac}', '\u{03b9}',),
328                     0xb6 => return Fold::Two('\u{03b1}', '\u{0342}',),
329                     0xb7 => return Fold::Three('\u{03b1}', '\u{0342}', '\u{03b9}',),
330                     x @ _ if 0xb8 <= x && x <= 0xb9  => from.wrapping_sub(0x0008),
331                     x @ _ if 0xba <= x && x <= 0xbb  => from.wrapping_sub(0x004a),
332                     0xbc => return Fold::Two('\u{03b1}', '\u{03b9}',),
333                     0xbe => 0x03b9,
334                     0xc2 => return Fold::Two('\u{1f74}', '\u{03b9}',),
335                     0xc3 => return Fold::Two('\u{03b7}', '\u{03b9}',),
336                     0xc4 => return Fold::Two('\u{03ae}', '\u{03b9}',),
337                     0xc6 => return Fold::Two('\u{03b7}', '\u{0342}',),
338                     0xc7 => return Fold::Three('\u{03b7}', '\u{0342}', '\u{03b9}',),
339                     x @ _ if 0xc8 <= x && x <= 0xcb  => from.wrapping_sub(0x0056),
340                     0xcc => return Fold::Two('\u{03b7}', '\u{03b9}',),
341                     0xd2 => return Fold::Three('\u{03b9}', '\u{0308}', '\u{0300}',),
342                     0xd3 => return Fold::Three('\u{03b9}', '\u{0308}', '\u{0301}',),
343                     0xd6 => return Fold::Two('\u{03b9}', '\u{0342}',),
344                     0xd7 => return Fold::Three('\u{03b9}', '\u{0308}', '\u{0342}',),
345                     x @ _ if 0xd8 <= x && x <= 0xd9  => from.wrapping_sub(0x0008),
346                     x @ _ if 0xda <= x && x <= 0xdb  => from.wrapping_sub(0x0064),
347                     0xe2 => return Fold::Three('\u{03c5}', '\u{0308}', '\u{0300}',),
348                     0xe3 => return Fold::Three('\u{03c5}', '\u{0308}', '\u{0301}',),
349                     0xe4 => return Fold::Two('\u{03c1}', '\u{0313}',),
350                     0xe6 => return Fold::Two('\u{03c5}', '\u{0342}',),
351                     0xe7 => return Fold::Three('\u{03c5}', '\u{0308}', '\u{0342}',),
352                     x @ _ if 0xe8 <= x && x <= 0xe9  => from.wrapping_sub(0x0008),
353                     x @ _ if 0xea <= x && x <= 0xeb  => from.wrapping_sub(0x0070),
354                     0xec => 0x1fe5,
355                     0xf2 => return Fold::Two('\u{1f7c}', '\u{03b9}',),
356                     0xf3 => return Fold::Two('\u{03c9}', '\u{03b9}',),
357                     0xf4 => return Fold::Two('\u{03ce}', '\u{03b9}',),
358                     0xf6 => return Fold::Two('\u{03c9}', '\u{0342}',),
359                     0xf7 => return Fold::Three('\u{03c9}', '\u{0342}', '\u{03b9}',),
360                     x @ _ if 0xf8 <= x && x <= 0xf9  => from.wrapping_sub(0x0080),
361                     x @ _ if 0xfa <= x && x <= 0xfb  => from.wrapping_sub(0x007e),
362                     0xfc => return Fold::Two('\u{03c9}', '\u{03b9}',),
363                     _ => from
364                 }
365             }
366             0x20 => {
367                 from
368             }
369             0x21 => {
370                 match low_byte {
371                     0x26 => 0x03c9,
372                     0x2a => 0x006b,
373                     0x2b => 0x00e5,
374                     0x32 => 0x214e,
375                     x @ _ if 0x60 <= x && x <= 0x6f  => from.wrapping_add(0x0010),
376                     0x83 => 0x2184,
377                     _ => from
378                 }
379             }
380             0x22 => {
381                 from
382             }
383             0x23 => {
384                 from
385             }
386             0x24 => {
387                 match low_byte {
388                     x @ _ if 0xb6 <= x && x <= 0xcf  => from.wrapping_add(0x001a),
389                     _ => from
390                 }
391             }
392             0x25 => {
393                 from
394             }
395             0x26 => {
396                 from
397             }
398             0x27 => {
399                 from
400             }
401             0x28 => {
402                 from
403             }
404             0x29 => {
405                 from
406             }
407             0x2a => {
408                 from
409             }
410             0x2b => {
411                 from
412             }
413             0x2c => {
414                 match low_byte {
415                     x @ _ if x <= 0x2e  => from.wrapping_add(0x0030),
416                     0x60 => 0x2c61,
417                     0x62 => 0x026b,
418                     0x63 => 0x1d7d,
419                     0x64 => 0x027d,
420                     x @ _ if 0x67 <= x && x <= 0x6b  => ((from+1) & !1),
421                     0x6d => 0x0251,
422                     0x6e => 0x0271,
423                     0x6f => 0x0250,
424                     0x70 => 0x0252,
425                     0x72 => 0x2c73,
426                     0x75 => 0x2c76,
427                     x @ _ if 0x7e <= x && x <= 0x7f  => from.wrapping_sub(0x2a3f),
428                     x @ _ if 0x80 <= x && x <= 0xe2  => (from | 1),
429                     x @ _ if 0xeb <= x && x <= 0xed  => ((from+1) & !1),
430                     0xf2 => 0x2cf3,
431                     _ => from
432                 }
433             }
434             _ => from
435         };
436         Fold::One( char::from_u32(single_char as u32).unwrap_or(orig) )
437     } else {
438         let single_char: u32 = match from {
439             x @ _ if 0xa640 <= x && x <= 0xa66c  => (from | 1),
440             x @ _ if 0xa680 <= x && x <= 0xa69a  => (from | 1),
441             x @ _ if 0xa722 <= x && x <= 0xa72e  => (from | 1),
442             x @ _ if 0xa732 <= x && x <= 0xa76e  => (from | 1),
443             x @ _ if 0xa779 <= x && x <= 0xa77b  => ((from+1) & !1),
444             0xa77d => 0x1d79,
445             x @ _ if 0xa77e <= x && x <= 0xa786  => (from | 1),
446             0xa78b => 0xa78c,
447             0xa78d => 0x0265,
448             x @ _ if 0xa790 <= x && x <= 0xa792  => (from | 1),
449             x @ _ if 0xa796 <= x && x <= 0xa7a8  => (from | 1),
450             0xa7aa => 0x0266,
451             0xa7ab => 0x025c,
452             0xa7ac => 0x0261,
453             0xa7ad => 0x026c,
454             0xa7ae => 0x026a,
455             0xa7b0 => 0x029e,
456             0xa7b1 => 0x0287,
457             0xa7b2 => 0x029d,
458             0xa7b3 => 0xab53,
459             x @ _ if 0xa7b4 <= x && x <= 0xa7be  => (from | 1),
460             0xa7c2 => 0xa7c3,
461             0xa7c4 => 0xa794,
462             0xa7c5 => 0x0282,
463             0xa7c6 => 0x1d8e,
464             x @ _ if 0xab70 <= x && x <= 0xabbf  => from.wrapping_sub(0x97d0),
465             0xfb00 => return Fold::Two('\u{0066}', '\u{0066}',),
466             0xfb01 => return Fold::Two('\u{0066}', '\u{0069}',),
467             0xfb02 => return Fold::Two('\u{0066}', '\u{006c}',),
468             0xfb03 => return Fold::Three('\u{0066}', '\u{0066}', '\u{0069}',),
469             0xfb04 => return Fold::Three('\u{0066}', '\u{0066}', '\u{006c}',),
470             0xfb05 => return Fold::Two('\u{0073}', '\u{0074}',),
471             0xfb06 => return Fold::Two('\u{0073}', '\u{0074}',),
472             0xfb13 => return Fold::Two('\u{0574}', '\u{0576}',),
473             0xfb14 => return Fold::Two('\u{0574}', '\u{0565}',),
474             0xfb15 => return Fold::Two('\u{0574}', '\u{056b}',),
475             0xfb16 => return Fold::Two('\u{057e}', '\u{0576}',),
476             0xfb17 => return Fold::Two('\u{0574}', '\u{056d}',),
477             x @ _ if 0xff21 <= x && x <= 0xff3a  => from.wrapping_add(0x0020),
478             x @ _ if 0x10400 <= x && x <= 0x10427  => from.wrapping_add(0x0028),
479             x @ _ if 0x104b0 <= x && x <= 0x104d3  => from.wrapping_add(0x0028),
480             x @ _ if 0x10c80 <= x && x <= 0x10cb2  => from.wrapping_add(0x0040),
481             x @ _ if 0x118a0 <= x && x <= 0x118bf  => from.wrapping_add(0x0020),
482             x @ _ if 0x16e40 <= x && x <= 0x16e5f  => from.wrapping_add(0x0020),
483             x @ _ if 0x1e900 <= x && x <= 0x1e921  => from.wrapping_add(0x0022),
484             _ => from
485         };
486         Fold::One( char::from_u32(single_char).unwrap_or(orig) )
487     }
488 }
489 
490 #[test]
lookup_consistency()491 fn lookup_consistency() {
492     fn lookup_naive(orig: char) -> Fold {
493         let single_char = match orig as u32 {
494             0x0041 => 0x0061,
495             0x0042 => 0x0062,
496             0x0043 => 0x0063,
497             0x0044 => 0x0064,
498             0x0045 => 0x0065,
499             0x0046 => 0x0066,
500             0x0047 => 0x0067,
501             0x0048 => 0x0068,
502             0x0049 => 0x0069,
503             0x004a => 0x006a,
504             0x004b => 0x006b,
505             0x004c => 0x006c,
506             0x004d => 0x006d,
507             0x004e => 0x006e,
508             0x004f => 0x006f,
509             0x0050 => 0x0070,
510             0x0051 => 0x0071,
511             0x0052 => 0x0072,
512             0x0053 => 0x0073,
513             0x0054 => 0x0074,
514             0x0055 => 0x0075,
515             0x0056 => 0x0076,
516             0x0057 => 0x0077,
517             0x0058 => 0x0078,
518             0x0059 => 0x0079,
519             0x005a => 0x007a,
520             0x00b5 => 0x03bc,
521             0x00c0 => 0x00e0,
522             0x00c1 => 0x00e1,
523             0x00c2 => 0x00e2,
524             0x00c3 => 0x00e3,
525             0x00c4 => 0x00e4,
526             0x00c5 => 0x00e5,
527             0x00c6 => 0x00e6,
528             0x00c7 => 0x00e7,
529             0x00c8 => 0x00e8,
530             0x00c9 => 0x00e9,
531             0x00ca => 0x00ea,
532             0x00cb => 0x00eb,
533             0x00cc => 0x00ec,
534             0x00cd => 0x00ed,
535             0x00ce => 0x00ee,
536             0x00cf => 0x00ef,
537             0x00d0 => 0x00f0,
538             0x00d1 => 0x00f1,
539             0x00d2 => 0x00f2,
540             0x00d3 => 0x00f3,
541             0x00d4 => 0x00f4,
542             0x00d5 => 0x00f5,
543             0x00d6 => 0x00f6,
544             0x00d8 => 0x00f8,
545             0x00d9 => 0x00f9,
546             0x00da => 0x00fa,
547             0x00db => 0x00fb,
548             0x00dc => 0x00fc,
549             0x00dd => 0x00fd,
550             0x00de => 0x00fe,
551             0x00df => return Fold::Two('\u{0073}', '\u{0073}',),
552             0x0100 => 0x0101,
553             0x0102 => 0x0103,
554             0x0104 => 0x0105,
555             0x0106 => 0x0107,
556             0x0108 => 0x0109,
557             0x010a => 0x010b,
558             0x010c => 0x010d,
559             0x010e => 0x010f,
560             0x0110 => 0x0111,
561             0x0112 => 0x0113,
562             0x0114 => 0x0115,
563             0x0116 => 0x0117,
564             0x0118 => 0x0119,
565             0x011a => 0x011b,
566             0x011c => 0x011d,
567             0x011e => 0x011f,
568             0x0120 => 0x0121,
569             0x0122 => 0x0123,
570             0x0124 => 0x0125,
571             0x0126 => 0x0127,
572             0x0128 => 0x0129,
573             0x012a => 0x012b,
574             0x012c => 0x012d,
575             0x012e => 0x012f,
576             0x0130 => return Fold::Two('\u{0069}', '\u{0307}',),
577             0x0132 => 0x0133,
578             0x0134 => 0x0135,
579             0x0136 => 0x0137,
580             0x0139 => 0x013a,
581             0x013b => 0x013c,
582             0x013d => 0x013e,
583             0x013f => 0x0140,
584             0x0141 => 0x0142,
585             0x0143 => 0x0144,
586             0x0145 => 0x0146,
587             0x0147 => 0x0148,
588             0x0149 => return Fold::Two('\u{02bc}', '\u{006e}',),
589             0x014a => 0x014b,
590             0x014c => 0x014d,
591             0x014e => 0x014f,
592             0x0150 => 0x0151,
593             0x0152 => 0x0153,
594             0x0154 => 0x0155,
595             0x0156 => 0x0157,
596             0x0158 => 0x0159,
597             0x015a => 0x015b,
598             0x015c => 0x015d,
599             0x015e => 0x015f,
600             0x0160 => 0x0161,
601             0x0162 => 0x0163,
602             0x0164 => 0x0165,
603             0x0166 => 0x0167,
604             0x0168 => 0x0169,
605             0x016a => 0x016b,
606             0x016c => 0x016d,
607             0x016e => 0x016f,
608             0x0170 => 0x0171,
609             0x0172 => 0x0173,
610             0x0174 => 0x0175,
611             0x0176 => 0x0177,
612             0x0178 => 0x00ff,
613             0x0179 => 0x017a,
614             0x017b => 0x017c,
615             0x017d => 0x017e,
616             0x017f => 0x0073,
617             0x0181 => 0x0253,
618             0x0182 => 0x0183,
619             0x0184 => 0x0185,
620             0x0186 => 0x0254,
621             0x0187 => 0x0188,
622             0x0189 => 0x0256,
623             0x018a => 0x0257,
624             0x018b => 0x018c,
625             0x018e => 0x01dd,
626             0x018f => 0x0259,
627             0x0190 => 0x025b,
628             0x0191 => 0x0192,
629             0x0193 => 0x0260,
630             0x0194 => 0x0263,
631             0x0196 => 0x0269,
632             0x0197 => 0x0268,
633             0x0198 => 0x0199,
634             0x019c => 0x026f,
635             0x019d => 0x0272,
636             0x019f => 0x0275,
637             0x01a0 => 0x01a1,
638             0x01a2 => 0x01a3,
639             0x01a4 => 0x01a5,
640             0x01a6 => 0x0280,
641             0x01a7 => 0x01a8,
642             0x01a9 => 0x0283,
643             0x01ac => 0x01ad,
644             0x01ae => 0x0288,
645             0x01af => 0x01b0,
646             0x01b1 => 0x028a,
647             0x01b2 => 0x028b,
648             0x01b3 => 0x01b4,
649             0x01b5 => 0x01b6,
650             0x01b7 => 0x0292,
651             0x01b8 => 0x01b9,
652             0x01bc => 0x01bd,
653             0x01c4 => 0x01c6,
654             0x01c5 => 0x01c6,
655             0x01c7 => 0x01c9,
656             0x01c8 => 0x01c9,
657             0x01ca => 0x01cc,
658             0x01cb => 0x01cc,
659             0x01cd => 0x01ce,
660             0x01cf => 0x01d0,
661             0x01d1 => 0x01d2,
662             0x01d3 => 0x01d4,
663             0x01d5 => 0x01d6,
664             0x01d7 => 0x01d8,
665             0x01d9 => 0x01da,
666             0x01db => 0x01dc,
667             0x01de => 0x01df,
668             0x01e0 => 0x01e1,
669             0x01e2 => 0x01e3,
670             0x01e4 => 0x01e5,
671             0x01e6 => 0x01e7,
672             0x01e8 => 0x01e9,
673             0x01ea => 0x01eb,
674             0x01ec => 0x01ed,
675             0x01ee => 0x01ef,
676             0x01f0 => return Fold::Two('\u{006a}', '\u{030c}',),
677             0x01f1 => 0x01f3,
678             0x01f2 => 0x01f3,
679             0x01f4 => 0x01f5,
680             0x01f6 => 0x0195,
681             0x01f7 => 0x01bf,
682             0x01f8 => 0x01f9,
683             0x01fa => 0x01fb,
684             0x01fc => 0x01fd,
685             0x01fe => 0x01ff,
686             0x0200 => 0x0201,
687             0x0202 => 0x0203,
688             0x0204 => 0x0205,
689             0x0206 => 0x0207,
690             0x0208 => 0x0209,
691             0x020a => 0x020b,
692             0x020c => 0x020d,
693             0x020e => 0x020f,
694             0x0210 => 0x0211,
695             0x0212 => 0x0213,
696             0x0214 => 0x0215,
697             0x0216 => 0x0217,
698             0x0218 => 0x0219,
699             0x021a => 0x021b,
700             0x021c => 0x021d,
701             0x021e => 0x021f,
702             0x0220 => 0x019e,
703             0x0222 => 0x0223,
704             0x0224 => 0x0225,
705             0x0226 => 0x0227,
706             0x0228 => 0x0229,
707             0x022a => 0x022b,
708             0x022c => 0x022d,
709             0x022e => 0x022f,
710             0x0230 => 0x0231,
711             0x0232 => 0x0233,
712             0x023a => 0x2c65,
713             0x023b => 0x023c,
714             0x023d => 0x019a,
715             0x023e => 0x2c66,
716             0x0241 => 0x0242,
717             0x0243 => 0x0180,
718             0x0244 => 0x0289,
719             0x0245 => 0x028c,
720             0x0246 => 0x0247,
721             0x0248 => 0x0249,
722             0x024a => 0x024b,
723             0x024c => 0x024d,
724             0x024e => 0x024f,
725             0x0345 => 0x03b9,
726             0x0370 => 0x0371,
727             0x0372 => 0x0373,
728             0x0376 => 0x0377,
729             0x037f => 0x03f3,
730             0x0386 => 0x03ac,
731             0x0388 => 0x03ad,
732             0x0389 => 0x03ae,
733             0x038a => 0x03af,
734             0x038c => 0x03cc,
735             0x038e => 0x03cd,
736             0x038f => 0x03ce,
737             0x0390 => return Fold::Three('\u{03b9}', '\u{0308}', '\u{0301}',),
738             0x0391 => 0x03b1,
739             0x0392 => 0x03b2,
740             0x0393 => 0x03b3,
741             0x0394 => 0x03b4,
742             0x0395 => 0x03b5,
743             0x0396 => 0x03b6,
744             0x0397 => 0x03b7,
745             0x0398 => 0x03b8,
746             0x0399 => 0x03b9,
747             0x039a => 0x03ba,
748             0x039b => 0x03bb,
749             0x039c => 0x03bc,
750             0x039d => 0x03bd,
751             0x039e => 0x03be,
752             0x039f => 0x03bf,
753             0x03a0 => 0x03c0,
754             0x03a1 => 0x03c1,
755             0x03a3 => 0x03c3,
756             0x03a4 => 0x03c4,
757             0x03a5 => 0x03c5,
758             0x03a6 => 0x03c6,
759             0x03a7 => 0x03c7,
760             0x03a8 => 0x03c8,
761             0x03a9 => 0x03c9,
762             0x03aa => 0x03ca,
763             0x03ab => 0x03cb,
764             0x03b0 => return Fold::Three('\u{03c5}', '\u{0308}', '\u{0301}',),
765             0x03c2 => 0x03c3,
766             0x03cf => 0x03d7,
767             0x03d0 => 0x03b2,
768             0x03d1 => 0x03b8,
769             0x03d5 => 0x03c6,
770             0x03d6 => 0x03c0,
771             0x03d8 => 0x03d9,
772             0x03da => 0x03db,
773             0x03dc => 0x03dd,
774             0x03de => 0x03df,
775             0x03e0 => 0x03e1,
776             0x03e2 => 0x03e3,
777             0x03e4 => 0x03e5,
778             0x03e6 => 0x03e7,
779             0x03e8 => 0x03e9,
780             0x03ea => 0x03eb,
781             0x03ec => 0x03ed,
782             0x03ee => 0x03ef,
783             0x03f0 => 0x03ba,
784             0x03f1 => 0x03c1,
785             0x03f4 => 0x03b8,
786             0x03f5 => 0x03b5,
787             0x03f7 => 0x03f8,
788             0x03f9 => 0x03f2,
789             0x03fa => 0x03fb,
790             0x03fd => 0x037b,
791             0x03fe => 0x037c,
792             0x03ff => 0x037d,
793             0x0400 => 0x0450,
794             0x0401 => 0x0451,
795             0x0402 => 0x0452,
796             0x0403 => 0x0453,
797             0x0404 => 0x0454,
798             0x0405 => 0x0455,
799             0x0406 => 0x0456,
800             0x0407 => 0x0457,
801             0x0408 => 0x0458,
802             0x0409 => 0x0459,
803             0x040a => 0x045a,
804             0x040b => 0x045b,
805             0x040c => 0x045c,
806             0x040d => 0x045d,
807             0x040e => 0x045e,
808             0x040f => 0x045f,
809             0x0410 => 0x0430,
810             0x0411 => 0x0431,
811             0x0412 => 0x0432,
812             0x0413 => 0x0433,
813             0x0414 => 0x0434,
814             0x0415 => 0x0435,
815             0x0416 => 0x0436,
816             0x0417 => 0x0437,
817             0x0418 => 0x0438,
818             0x0419 => 0x0439,
819             0x041a => 0x043a,
820             0x041b => 0x043b,
821             0x041c => 0x043c,
822             0x041d => 0x043d,
823             0x041e => 0x043e,
824             0x041f => 0x043f,
825             0x0420 => 0x0440,
826             0x0421 => 0x0441,
827             0x0422 => 0x0442,
828             0x0423 => 0x0443,
829             0x0424 => 0x0444,
830             0x0425 => 0x0445,
831             0x0426 => 0x0446,
832             0x0427 => 0x0447,
833             0x0428 => 0x0448,
834             0x0429 => 0x0449,
835             0x042a => 0x044a,
836             0x042b => 0x044b,
837             0x042c => 0x044c,
838             0x042d => 0x044d,
839             0x042e => 0x044e,
840             0x042f => 0x044f,
841             0x0460 => 0x0461,
842             0x0462 => 0x0463,
843             0x0464 => 0x0465,
844             0x0466 => 0x0467,
845             0x0468 => 0x0469,
846             0x046a => 0x046b,
847             0x046c => 0x046d,
848             0x046e => 0x046f,
849             0x0470 => 0x0471,
850             0x0472 => 0x0473,
851             0x0474 => 0x0475,
852             0x0476 => 0x0477,
853             0x0478 => 0x0479,
854             0x047a => 0x047b,
855             0x047c => 0x047d,
856             0x047e => 0x047f,
857             0x0480 => 0x0481,
858             0x048a => 0x048b,
859             0x048c => 0x048d,
860             0x048e => 0x048f,
861             0x0490 => 0x0491,
862             0x0492 => 0x0493,
863             0x0494 => 0x0495,
864             0x0496 => 0x0497,
865             0x0498 => 0x0499,
866             0x049a => 0x049b,
867             0x049c => 0x049d,
868             0x049e => 0x049f,
869             0x04a0 => 0x04a1,
870             0x04a2 => 0x04a3,
871             0x04a4 => 0x04a5,
872             0x04a6 => 0x04a7,
873             0x04a8 => 0x04a9,
874             0x04aa => 0x04ab,
875             0x04ac => 0x04ad,
876             0x04ae => 0x04af,
877             0x04b0 => 0x04b1,
878             0x04b2 => 0x04b3,
879             0x04b4 => 0x04b5,
880             0x04b6 => 0x04b7,
881             0x04b8 => 0x04b9,
882             0x04ba => 0x04bb,
883             0x04bc => 0x04bd,
884             0x04be => 0x04bf,
885             0x04c0 => 0x04cf,
886             0x04c1 => 0x04c2,
887             0x04c3 => 0x04c4,
888             0x04c5 => 0x04c6,
889             0x04c7 => 0x04c8,
890             0x04c9 => 0x04ca,
891             0x04cb => 0x04cc,
892             0x04cd => 0x04ce,
893             0x04d0 => 0x04d1,
894             0x04d2 => 0x04d3,
895             0x04d4 => 0x04d5,
896             0x04d6 => 0x04d7,
897             0x04d8 => 0x04d9,
898             0x04da => 0x04db,
899             0x04dc => 0x04dd,
900             0x04de => 0x04df,
901             0x04e0 => 0x04e1,
902             0x04e2 => 0x04e3,
903             0x04e4 => 0x04e5,
904             0x04e6 => 0x04e7,
905             0x04e8 => 0x04e9,
906             0x04ea => 0x04eb,
907             0x04ec => 0x04ed,
908             0x04ee => 0x04ef,
909             0x04f0 => 0x04f1,
910             0x04f2 => 0x04f3,
911             0x04f4 => 0x04f5,
912             0x04f6 => 0x04f7,
913             0x04f8 => 0x04f9,
914             0x04fa => 0x04fb,
915             0x04fc => 0x04fd,
916             0x04fe => 0x04ff,
917             0x0500 => 0x0501,
918             0x0502 => 0x0503,
919             0x0504 => 0x0505,
920             0x0506 => 0x0507,
921             0x0508 => 0x0509,
922             0x050a => 0x050b,
923             0x050c => 0x050d,
924             0x050e => 0x050f,
925             0x0510 => 0x0511,
926             0x0512 => 0x0513,
927             0x0514 => 0x0515,
928             0x0516 => 0x0517,
929             0x0518 => 0x0519,
930             0x051a => 0x051b,
931             0x051c => 0x051d,
932             0x051e => 0x051f,
933             0x0520 => 0x0521,
934             0x0522 => 0x0523,
935             0x0524 => 0x0525,
936             0x0526 => 0x0527,
937             0x0528 => 0x0529,
938             0x052a => 0x052b,
939             0x052c => 0x052d,
940             0x052e => 0x052f,
941             0x0531 => 0x0561,
942             0x0532 => 0x0562,
943             0x0533 => 0x0563,
944             0x0534 => 0x0564,
945             0x0535 => 0x0565,
946             0x0536 => 0x0566,
947             0x0537 => 0x0567,
948             0x0538 => 0x0568,
949             0x0539 => 0x0569,
950             0x053a => 0x056a,
951             0x053b => 0x056b,
952             0x053c => 0x056c,
953             0x053d => 0x056d,
954             0x053e => 0x056e,
955             0x053f => 0x056f,
956             0x0540 => 0x0570,
957             0x0541 => 0x0571,
958             0x0542 => 0x0572,
959             0x0543 => 0x0573,
960             0x0544 => 0x0574,
961             0x0545 => 0x0575,
962             0x0546 => 0x0576,
963             0x0547 => 0x0577,
964             0x0548 => 0x0578,
965             0x0549 => 0x0579,
966             0x054a => 0x057a,
967             0x054b => 0x057b,
968             0x054c => 0x057c,
969             0x054d => 0x057d,
970             0x054e => 0x057e,
971             0x054f => 0x057f,
972             0x0550 => 0x0580,
973             0x0551 => 0x0581,
974             0x0552 => 0x0582,
975             0x0553 => 0x0583,
976             0x0554 => 0x0584,
977             0x0555 => 0x0585,
978             0x0556 => 0x0586,
979             0x0587 => return Fold::Two('\u{0565}', '\u{0582}',),
980             0x10a0 => 0x2d00,
981             0x10a1 => 0x2d01,
982             0x10a2 => 0x2d02,
983             0x10a3 => 0x2d03,
984             0x10a4 => 0x2d04,
985             0x10a5 => 0x2d05,
986             0x10a6 => 0x2d06,
987             0x10a7 => 0x2d07,
988             0x10a8 => 0x2d08,
989             0x10a9 => 0x2d09,
990             0x10aa => 0x2d0a,
991             0x10ab => 0x2d0b,
992             0x10ac => 0x2d0c,
993             0x10ad => 0x2d0d,
994             0x10ae => 0x2d0e,
995             0x10af => 0x2d0f,
996             0x10b0 => 0x2d10,
997             0x10b1 => 0x2d11,
998             0x10b2 => 0x2d12,
999             0x10b3 => 0x2d13,
1000             0x10b4 => 0x2d14,
1001             0x10b5 => 0x2d15,
1002             0x10b6 => 0x2d16,
1003             0x10b7 => 0x2d17,
1004             0x10b8 => 0x2d18,
1005             0x10b9 => 0x2d19,
1006             0x10ba => 0x2d1a,
1007             0x10bb => 0x2d1b,
1008             0x10bc => 0x2d1c,
1009             0x10bd => 0x2d1d,
1010             0x10be => 0x2d1e,
1011             0x10bf => 0x2d1f,
1012             0x10c0 => 0x2d20,
1013             0x10c1 => 0x2d21,
1014             0x10c2 => 0x2d22,
1015             0x10c3 => 0x2d23,
1016             0x10c4 => 0x2d24,
1017             0x10c5 => 0x2d25,
1018             0x10c7 => 0x2d27,
1019             0x10cd => 0x2d2d,
1020             0x13f8 => 0x13f0,
1021             0x13f9 => 0x13f1,
1022             0x13fa => 0x13f2,
1023             0x13fb => 0x13f3,
1024             0x13fc => 0x13f4,
1025             0x13fd => 0x13f5,
1026             0x1c80 => 0x0432,
1027             0x1c81 => 0x0434,
1028             0x1c82 => 0x043e,
1029             0x1c83 => 0x0441,
1030             0x1c84 => 0x0442,
1031             0x1c85 => 0x0442,
1032             0x1c86 => 0x044a,
1033             0x1c87 => 0x0463,
1034             0x1c88 => 0xa64b,
1035             0x1c90 => 0x10d0,
1036             0x1c91 => 0x10d1,
1037             0x1c92 => 0x10d2,
1038             0x1c93 => 0x10d3,
1039             0x1c94 => 0x10d4,
1040             0x1c95 => 0x10d5,
1041             0x1c96 => 0x10d6,
1042             0x1c97 => 0x10d7,
1043             0x1c98 => 0x10d8,
1044             0x1c99 => 0x10d9,
1045             0x1c9a => 0x10da,
1046             0x1c9b => 0x10db,
1047             0x1c9c => 0x10dc,
1048             0x1c9d => 0x10dd,
1049             0x1c9e => 0x10de,
1050             0x1c9f => 0x10df,
1051             0x1ca0 => 0x10e0,
1052             0x1ca1 => 0x10e1,
1053             0x1ca2 => 0x10e2,
1054             0x1ca3 => 0x10e3,
1055             0x1ca4 => 0x10e4,
1056             0x1ca5 => 0x10e5,
1057             0x1ca6 => 0x10e6,
1058             0x1ca7 => 0x10e7,
1059             0x1ca8 => 0x10e8,
1060             0x1ca9 => 0x10e9,
1061             0x1caa => 0x10ea,
1062             0x1cab => 0x10eb,
1063             0x1cac => 0x10ec,
1064             0x1cad => 0x10ed,
1065             0x1cae => 0x10ee,
1066             0x1caf => 0x10ef,
1067             0x1cb0 => 0x10f0,
1068             0x1cb1 => 0x10f1,
1069             0x1cb2 => 0x10f2,
1070             0x1cb3 => 0x10f3,
1071             0x1cb4 => 0x10f4,
1072             0x1cb5 => 0x10f5,
1073             0x1cb6 => 0x10f6,
1074             0x1cb7 => 0x10f7,
1075             0x1cb8 => 0x10f8,
1076             0x1cb9 => 0x10f9,
1077             0x1cba => 0x10fa,
1078             0x1cbd => 0x10fd,
1079             0x1cbe => 0x10fe,
1080             0x1cbf => 0x10ff,
1081             0x1e00 => 0x1e01,
1082             0x1e02 => 0x1e03,
1083             0x1e04 => 0x1e05,
1084             0x1e06 => 0x1e07,
1085             0x1e08 => 0x1e09,
1086             0x1e0a => 0x1e0b,
1087             0x1e0c => 0x1e0d,
1088             0x1e0e => 0x1e0f,
1089             0x1e10 => 0x1e11,
1090             0x1e12 => 0x1e13,
1091             0x1e14 => 0x1e15,
1092             0x1e16 => 0x1e17,
1093             0x1e18 => 0x1e19,
1094             0x1e1a => 0x1e1b,
1095             0x1e1c => 0x1e1d,
1096             0x1e1e => 0x1e1f,
1097             0x1e20 => 0x1e21,
1098             0x1e22 => 0x1e23,
1099             0x1e24 => 0x1e25,
1100             0x1e26 => 0x1e27,
1101             0x1e28 => 0x1e29,
1102             0x1e2a => 0x1e2b,
1103             0x1e2c => 0x1e2d,
1104             0x1e2e => 0x1e2f,
1105             0x1e30 => 0x1e31,
1106             0x1e32 => 0x1e33,
1107             0x1e34 => 0x1e35,
1108             0x1e36 => 0x1e37,
1109             0x1e38 => 0x1e39,
1110             0x1e3a => 0x1e3b,
1111             0x1e3c => 0x1e3d,
1112             0x1e3e => 0x1e3f,
1113             0x1e40 => 0x1e41,
1114             0x1e42 => 0x1e43,
1115             0x1e44 => 0x1e45,
1116             0x1e46 => 0x1e47,
1117             0x1e48 => 0x1e49,
1118             0x1e4a => 0x1e4b,
1119             0x1e4c => 0x1e4d,
1120             0x1e4e => 0x1e4f,
1121             0x1e50 => 0x1e51,
1122             0x1e52 => 0x1e53,
1123             0x1e54 => 0x1e55,
1124             0x1e56 => 0x1e57,
1125             0x1e58 => 0x1e59,
1126             0x1e5a => 0x1e5b,
1127             0x1e5c => 0x1e5d,
1128             0x1e5e => 0x1e5f,
1129             0x1e60 => 0x1e61,
1130             0x1e62 => 0x1e63,
1131             0x1e64 => 0x1e65,
1132             0x1e66 => 0x1e67,
1133             0x1e68 => 0x1e69,
1134             0x1e6a => 0x1e6b,
1135             0x1e6c => 0x1e6d,
1136             0x1e6e => 0x1e6f,
1137             0x1e70 => 0x1e71,
1138             0x1e72 => 0x1e73,
1139             0x1e74 => 0x1e75,
1140             0x1e76 => 0x1e77,
1141             0x1e78 => 0x1e79,
1142             0x1e7a => 0x1e7b,
1143             0x1e7c => 0x1e7d,
1144             0x1e7e => 0x1e7f,
1145             0x1e80 => 0x1e81,
1146             0x1e82 => 0x1e83,
1147             0x1e84 => 0x1e85,
1148             0x1e86 => 0x1e87,
1149             0x1e88 => 0x1e89,
1150             0x1e8a => 0x1e8b,
1151             0x1e8c => 0x1e8d,
1152             0x1e8e => 0x1e8f,
1153             0x1e90 => 0x1e91,
1154             0x1e92 => 0x1e93,
1155             0x1e94 => 0x1e95,
1156             0x1e96 => return Fold::Two('\u{0068}', '\u{0331}',),
1157             0x1e97 => return Fold::Two('\u{0074}', '\u{0308}',),
1158             0x1e98 => return Fold::Two('\u{0077}', '\u{030a}',),
1159             0x1e99 => return Fold::Two('\u{0079}', '\u{030a}',),
1160             0x1e9a => return Fold::Two('\u{0061}', '\u{02be}',),
1161             0x1e9b => 0x1e61,
1162             0x1e9e => return Fold::Two('\u{0073}', '\u{0073}',),
1163             0x1ea0 => 0x1ea1,
1164             0x1ea2 => 0x1ea3,
1165             0x1ea4 => 0x1ea5,
1166             0x1ea6 => 0x1ea7,
1167             0x1ea8 => 0x1ea9,
1168             0x1eaa => 0x1eab,
1169             0x1eac => 0x1ead,
1170             0x1eae => 0x1eaf,
1171             0x1eb0 => 0x1eb1,
1172             0x1eb2 => 0x1eb3,
1173             0x1eb4 => 0x1eb5,
1174             0x1eb6 => 0x1eb7,
1175             0x1eb8 => 0x1eb9,
1176             0x1eba => 0x1ebb,
1177             0x1ebc => 0x1ebd,
1178             0x1ebe => 0x1ebf,
1179             0x1ec0 => 0x1ec1,
1180             0x1ec2 => 0x1ec3,
1181             0x1ec4 => 0x1ec5,
1182             0x1ec6 => 0x1ec7,
1183             0x1ec8 => 0x1ec9,
1184             0x1eca => 0x1ecb,
1185             0x1ecc => 0x1ecd,
1186             0x1ece => 0x1ecf,
1187             0x1ed0 => 0x1ed1,
1188             0x1ed2 => 0x1ed3,
1189             0x1ed4 => 0x1ed5,
1190             0x1ed6 => 0x1ed7,
1191             0x1ed8 => 0x1ed9,
1192             0x1eda => 0x1edb,
1193             0x1edc => 0x1edd,
1194             0x1ede => 0x1edf,
1195             0x1ee0 => 0x1ee1,
1196             0x1ee2 => 0x1ee3,
1197             0x1ee4 => 0x1ee5,
1198             0x1ee6 => 0x1ee7,
1199             0x1ee8 => 0x1ee9,
1200             0x1eea => 0x1eeb,
1201             0x1eec => 0x1eed,
1202             0x1eee => 0x1eef,
1203             0x1ef0 => 0x1ef1,
1204             0x1ef2 => 0x1ef3,
1205             0x1ef4 => 0x1ef5,
1206             0x1ef6 => 0x1ef7,
1207             0x1ef8 => 0x1ef9,
1208             0x1efa => 0x1efb,
1209             0x1efc => 0x1efd,
1210             0x1efe => 0x1eff,
1211             0x1f08 => 0x1f00,
1212             0x1f09 => 0x1f01,
1213             0x1f0a => 0x1f02,
1214             0x1f0b => 0x1f03,
1215             0x1f0c => 0x1f04,
1216             0x1f0d => 0x1f05,
1217             0x1f0e => 0x1f06,
1218             0x1f0f => 0x1f07,
1219             0x1f18 => 0x1f10,
1220             0x1f19 => 0x1f11,
1221             0x1f1a => 0x1f12,
1222             0x1f1b => 0x1f13,
1223             0x1f1c => 0x1f14,
1224             0x1f1d => 0x1f15,
1225             0x1f28 => 0x1f20,
1226             0x1f29 => 0x1f21,
1227             0x1f2a => 0x1f22,
1228             0x1f2b => 0x1f23,
1229             0x1f2c => 0x1f24,
1230             0x1f2d => 0x1f25,
1231             0x1f2e => 0x1f26,
1232             0x1f2f => 0x1f27,
1233             0x1f38 => 0x1f30,
1234             0x1f39 => 0x1f31,
1235             0x1f3a => 0x1f32,
1236             0x1f3b => 0x1f33,
1237             0x1f3c => 0x1f34,
1238             0x1f3d => 0x1f35,
1239             0x1f3e => 0x1f36,
1240             0x1f3f => 0x1f37,
1241             0x1f48 => 0x1f40,
1242             0x1f49 => 0x1f41,
1243             0x1f4a => 0x1f42,
1244             0x1f4b => 0x1f43,
1245             0x1f4c => 0x1f44,
1246             0x1f4d => 0x1f45,
1247             0x1f50 => return Fold::Two('\u{03c5}', '\u{0313}',),
1248             0x1f52 => return Fold::Three('\u{03c5}', '\u{0313}', '\u{0300}',),
1249             0x1f54 => return Fold::Three('\u{03c5}', '\u{0313}', '\u{0301}',),
1250             0x1f56 => return Fold::Three('\u{03c5}', '\u{0313}', '\u{0342}',),
1251             0x1f59 => 0x1f51,
1252             0x1f5b => 0x1f53,
1253             0x1f5d => 0x1f55,
1254             0x1f5f => 0x1f57,
1255             0x1f68 => 0x1f60,
1256             0x1f69 => 0x1f61,
1257             0x1f6a => 0x1f62,
1258             0x1f6b => 0x1f63,
1259             0x1f6c => 0x1f64,
1260             0x1f6d => 0x1f65,
1261             0x1f6e => 0x1f66,
1262             0x1f6f => 0x1f67,
1263             0x1f80 => return Fold::Two('\u{1f00}', '\u{03b9}',),
1264             0x1f81 => return Fold::Two('\u{1f01}', '\u{03b9}',),
1265             0x1f82 => return Fold::Two('\u{1f02}', '\u{03b9}',),
1266             0x1f83 => return Fold::Two('\u{1f03}', '\u{03b9}',),
1267             0x1f84 => return Fold::Two('\u{1f04}', '\u{03b9}',),
1268             0x1f85 => return Fold::Two('\u{1f05}', '\u{03b9}',),
1269             0x1f86 => return Fold::Two('\u{1f06}', '\u{03b9}',),
1270             0x1f87 => return Fold::Two('\u{1f07}', '\u{03b9}',),
1271             0x1f88 => return Fold::Two('\u{1f00}', '\u{03b9}',),
1272             0x1f89 => return Fold::Two('\u{1f01}', '\u{03b9}',),
1273             0x1f8a => return Fold::Two('\u{1f02}', '\u{03b9}',),
1274             0x1f8b => return Fold::Two('\u{1f03}', '\u{03b9}',),
1275             0x1f8c => return Fold::Two('\u{1f04}', '\u{03b9}',),
1276             0x1f8d => return Fold::Two('\u{1f05}', '\u{03b9}',),
1277             0x1f8e => return Fold::Two('\u{1f06}', '\u{03b9}',),
1278             0x1f8f => return Fold::Two('\u{1f07}', '\u{03b9}',),
1279             0x1f90 => return Fold::Two('\u{1f20}', '\u{03b9}',),
1280             0x1f91 => return Fold::Two('\u{1f21}', '\u{03b9}',),
1281             0x1f92 => return Fold::Two('\u{1f22}', '\u{03b9}',),
1282             0x1f93 => return Fold::Two('\u{1f23}', '\u{03b9}',),
1283             0x1f94 => return Fold::Two('\u{1f24}', '\u{03b9}',),
1284             0x1f95 => return Fold::Two('\u{1f25}', '\u{03b9}',),
1285             0x1f96 => return Fold::Two('\u{1f26}', '\u{03b9}',),
1286             0x1f97 => return Fold::Two('\u{1f27}', '\u{03b9}',),
1287             0x1f98 => return Fold::Two('\u{1f20}', '\u{03b9}',),
1288             0x1f99 => return Fold::Two('\u{1f21}', '\u{03b9}',),
1289             0x1f9a => return Fold::Two('\u{1f22}', '\u{03b9}',),
1290             0x1f9b => return Fold::Two('\u{1f23}', '\u{03b9}',),
1291             0x1f9c => return Fold::Two('\u{1f24}', '\u{03b9}',),
1292             0x1f9d => return Fold::Two('\u{1f25}', '\u{03b9}',),
1293             0x1f9e => return Fold::Two('\u{1f26}', '\u{03b9}',),
1294             0x1f9f => return Fold::Two('\u{1f27}', '\u{03b9}',),
1295             0x1fa0 => return Fold::Two('\u{1f60}', '\u{03b9}',),
1296             0x1fa1 => return Fold::Two('\u{1f61}', '\u{03b9}',),
1297             0x1fa2 => return Fold::Two('\u{1f62}', '\u{03b9}',),
1298             0x1fa3 => return Fold::Two('\u{1f63}', '\u{03b9}',),
1299             0x1fa4 => return Fold::Two('\u{1f64}', '\u{03b9}',),
1300             0x1fa5 => return Fold::Two('\u{1f65}', '\u{03b9}',),
1301             0x1fa6 => return Fold::Two('\u{1f66}', '\u{03b9}',),
1302             0x1fa7 => return Fold::Two('\u{1f67}', '\u{03b9}',),
1303             0x1fa8 => return Fold::Two('\u{1f60}', '\u{03b9}',),
1304             0x1fa9 => return Fold::Two('\u{1f61}', '\u{03b9}',),
1305             0x1faa => return Fold::Two('\u{1f62}', '\u{03b9}',),
1306             0x1fab => return Fold::Two('\u{1f63}', '\u{03b9}',),
1307             0x1fac => return Fold::Two('\u{1f64}', '\u{03b9}',),
1308             0x1fad => return Fold::Two('\u{1f65}', '\u{03b9}',),
1309             0x1fae => return Fold::Two('\u{1f66}', '\u{03b9}',),
1310             0x1faf => return Fold::Two('\u{1f67}', '\u{03b9}',),
1311             0x1fb2 => return Fold::Two('\u{1f70}', '\u{03b9}',),
1312             0x1fb3 => return Fold::Two('\u{03b1}', '\u{03b9}',),
1313             0x1fb4 => return Fold::Two('\u{03ac}', '\u{03b9}',),
1314             0x1fb6 => return Fold::Two('\u{03b1}', '\u{0342}',),
1315             0x1fb7 => return Fold::Three('\u{03b1}', '\u{0342}', '\u{03b9}',),
1316             0x1fb8 => 0x1fb0,
1317             0x1fb9 => 0x1fb1,
1318             0x1fba => 0x1f70,
1319             0x1fbb => 0x1f71,
1320             0x1fbc => return Fold::Two('\u{03b1}', '\u{03b9}',),
1321             0x1fbe => 0x03b9,
1322             0x1fc2 => return Fold::Two('\u{1f74}', '\u{03b9}',),
1323             0x1fc3 => return Fold::Two('\u{03b7}', '\u{03b9}',),
1324             0x1fc4 => return Fold::Two('\u{03ae}', '\u{03b9}',),
1325             0x1fc6 => return Fold::Two('\u{03b7}', '\u{0342}',),
1326             0x1fc7 => return Fold::Three('\u{03b7}', '\u{0342}', '\u{03b9}',),
1327             0x1fc8 => 0x1f72,
1328             0x1fc9 => 0x1f73,
1329             0x1fca => 0x1f74,
1330             0x1fcb => 0x1f75,
1331             0x1fcc => return Fold::Two('\u{03b7}', '\u{03b9}',),
1332             0x1fd2 => return Fold::Three('\u{03b9}', '\u{0308}', '\u{0300}',),
1333             0x1fd3 => return Fold::Three('\u{03b9}', '\u{0308}', '\u{0301}',),
1334             0x1fd6 => return Fold::Two('\u{03b9}', '\u{0342}',),
1335             0x1fd7 => return Fold::Three('\u{03b9}', '\u{0308}', '\u{0342}',),
1336             0x1fd8 => 0x1fd0,
1337             0x1fd9 => 0x1fd1,
1338             0x1fda => 0x1f76,
1339             0x1fdb => 0x1f77,
1340             0x1fe2 => return Fold::Three('\u{03c5}', '\u{0308}', '\u{0300}',),
1341             0x1fe3 => return Fold::Three('\u{03c5}', '\u{0308}', '\u{0301}',),
1342             0x1fe4 => return Fold::Two('\u{03c1}', '\u{0313}',),
1343             0x1fe6 => return Fold::Two('\u{03c5}', '\u{0342}',),
1344             0x1fe7 => return Fold::Three('\u{03c5}', '\u{0308}', '\u{0342}',),
1345             0x1fe8 => 0x1fe0,
1346             0x1fe9 => 0x1fe1,
1347             0x1fea => 0x1f7a,
1348             0x1feb => 0x1f7b,
1349             0x1fec => 0x1fe5,
1350             0x1ff2 => return Fold::Two('\u{1f7c}', '\u{03b9}',),
1351             0x1ff3 => return Fold::Two('\u{03c9}', '\u{03b9}',),
1352             0x1ff4 => return Fold::Two('\u{03ce}', '\u{03b9}',),
1353             0x1ff6 => return Fold::Two('\u{03c9}', '\u{0342}',),
1354             0x1ff7 => return Fold::Three('\u{03c9}', '\u{0342}', '\u{03b9}',),
1355             0x1ff8 => 0x1f78,
1356             0x1ff9 => 0x1f79,
1357             0x1ffa => 0x1f7c,
1358             0x1ffb => 0x1f7d,
1359             0x1ffc => return Fold::Two('\u{03c9}', '\u{03b9}',),
1360             0x2126 => 0x03c9,
1361             0x212a => 0x006b,
1362             0x212b => 0x00e5,
1363             0x2132 => 0x214e,
1364             0x2160 => 0x2170,
1365             0x2161 => 0x2171,
1366             0x2162 => 0x2172,
1367             0x2163 => 0x2173,
1368             0x2164 => 0x2174,
1369             0x2165 => 0x2175,
1370             0x2166 => 0x2176,
1371             0x2167 => 0x2177,
1372             0x2168 => 0x2178,
1373             0x2169 => 0x2179,
1374             0x216a => 0x217a,
1375             0x216b => 0x217b,
1376             0x216c => 0x217c,
1377             0x216d => 0x217d,
1378             0x216e => 0x217e,
1379             0x216f => 0x217f,
1380             0x2183 => 0x2184,
1381             0x24b6 => 0x24d0,
1382             0x24b7 => 0x24d1,
1383             0x24b8 => 0x24d2,
1384             0x24b9 => 0x24d3,
1385             0x24ba => 0x24d4,
1386             0x24bb => 0x24d5,
1387             0x24bc => 0x24d6,
1388             0x24bd => 0x24d7,
1389             0x24be => 0x24d8,
1390             0x24bf => 0x24d9,
1391             0x24c0 => 0x24da,
1392             0x24c1 => 0x24db,
1393             0x24c2 => 0x24dc,
1394             0x24c3 => 0x24dd,
1395             0x24c4 => 0x24de,
1396             0x24c5 => 0x24df,
1397             0x24c6 => 0x24e0,
1398             0x24c7 => 0x24e1,
1399             0x24c8 => 0x24e2,
1400             0x24c9 => 0x24e3,
1401             0x24ca => 0x24e4,
1402             0x24cb => 0x24e5,
1403             0x24cc => 0x24e6,
1404             0x24cd => 0x24e7,
1405             0x24ce => 0x24e8,
1406             0x24cf => 0x24e9,
1407             0x2c00 => 0x2c30,
1408             0x2c01 => 0x2c31,
1409             0x2c02 => 0x2c32,
1410             0x2c03 => 0x2c33,
1411             0x2c04 => 0x2c34,
1412             0x2c05 => 0x2c35,
1413             0x2c06 => 0x2c36,
1414             0x2c07 => 0x2c37,
1415             0x2c08 => 0x2c38,
1416             0x2c09 => 0x2c39,
1417             0x2c0a => 0x2c3a,
1418             0x2c0b => 0x2c3b,
1419             0x2c0c => 0x2c3c,
1420             0x2c0d => 0x2c3d,
1421             0x2c0e => 0x2c3e,
1422             0x2c0f => 0x2c3f,
1423             0x2c10 => 0x2c40,
1424             0x2c11 => 0x2c41,
1425             0x2c12 => 0x2c42,
1426             0x2c13 => 0x2c43,
1427             0x2c14 => 0x2c44,
1428             0x2c15 => 0x2c45,
1429             0x2c16 => 0x2c46,
1430             0x2c17 => 0x2c47,
1431             0x2c18 => 0x2c48,
1432             0x2c19 => 0x2c49,
1433             0x2c1a => 0x2c4a,
1434             0x2c1b => 0x2c4b,
1435             0x2c1c => 0x2c4c,
1436             0x2c1d => 0x2c4d,
1437             0x2c1e => 0x2c4e,
1438             0x2c1f => 0x2c4f,
1439             0x2c20 => 0x2c50,
1440             0x2c21 => 0x2c51,
1441             0x2c22 => 0x2c52,
1442             0x2c23 => 0x2c53,
1443             0x2c24 => 0x2c54,
1444             0x2c25 => 0x2c55,
1445             0x2c26 => 0x2c56,
1446             0x2c27 => 0x2c57,
1447             0x2c28 => 0x2c58,
1448             0x2c29 => 0x2c59,
1449             0x2c2a => 0x2c5a,
1450             0x2c2b => 0x2c5b,
1451             0x2c2c => 0x2c5c,
1452             0x2c2d => 0x2c5d,
1453             0x2c2e => 0x2c5e,
1454             0x2c60 => 0x2c61,
1455             0x2c62 => 0x026b,
1456             0x2c63 => 0x1d7d,
1457             0x2c64 => 0x027d,
1458             0x2c67 => 0x2c68,
1459             0x2c69 => 0x2c6a,
1460             0x2c6b => 0x2c6c,
1461             0x2c6d => 0x0251,
1462             0x2c6e => 0x0271,
1463             0x2c6f => 0x0250,
1464             0x2c70 => 0x0252,
1465             0x2c72 => 0x2c73,
1466             0x2c75 => 0x2c76,
1467             0x2c7e => 0x023f,
1468             0x2c7f => 0x0240,
1469             0x2c80 => 0x2c81,
1470             0x2c82 => 0x2c83,
1471             0x2c84 => 0x2c85,
1472             0x2c86 => 0x2c87,
1473             0x2c88 => 0x2c89,
1474             0x2c8a => 0x2c8b,
1475             0x2c8c => 0x2c8d,
1476             0x2c8e => 0x2c8f,
1477             0x2c90 => 0x2c91,
1478             0x2c92 => 0x2c93,
1479             0x2c94 => 0x2c95,
1480             0x2c96 => 0x2c97,
1481             0x2c98 => 0x2c99,
1482             0x2c9a => 0x2c9b,
1483             0x2c9c => 0x2c9d,
1484             0x2c9e => 0x2c9f,
1485             0x2ca0 => 0x2ca1,
1486             0x2ca2 => 0x2ca3,
1487             0x2ca4 => 0x2ca5,
1488             0x2ca6 => 0x2ca7,
1489             0x2ca8 => 0x2ca9,
1490             0x2caa => 0x2cab,
1491             0x2cac => 0x2cad,
1492             0x2cae => 0x2caf,
1493             0x2cb0 => 0x2cb1,
1494             0x2cb2 => 0x2cb3,
1495             0x2cb4 => 0x2cb5,
1496             0x2cb6 => 0x2cb7,
1497             0x2cb8 => 0x2cb9,
1498             0x2cba => 0x2cbb,
1499             0x2cbc => 0x2cbd,
1500             0x2cbe => 0x2cbf,
1501             0x2cc0 => 0x2cc1,
1502             0x2cc2 => 0x2cc3,
1503             0x2cc4 => 0x2cc5,
1504             0x2cc6 => 0x2cc7,
1505             0x2cc8 => 0x2cc9,
1506             0x2cca => 0x2ccb,
1507             0x2ccc => 0x2ccd,
1508             0x2cce => 0x2ccf,
1509             0x2cd0 => 0x2cd1,
1510             0x2cd2 => 0x2cd3,
1511             0x2cd4 => 0x2cd5,
1512             0x2cd6 => 0x2cd7,
1513             0x2cd8 => 0x2cd9,
1514             0x2cda => 0x2cdb,
1515             0x2cdc => 0x2cdd,
1516             0x2cde => 0x2cdf,
1517             0x2ce0 => 0x2ce1,
1518             0x2ce2 => 0x2ce3,
1519             0x2ceb => 0x2cec,
1520             0x2ced => 0x2cee,
1521             0x2cf2 => 0x2cf3,
1522             0xa640 => 0xa641,
1523             0xa642 => 0xa643,
1524             0xa644 => 0xa645,
1525             0xa646 => 0xa647,
1526             0xa648 => 0xa649,
1527             0xa64a => 0xa64b,
1528             0xa64c => 0xa64d,
1529             0xa64e => 0xa64f,
1530             0xa650 => 0xa651,
1531             0xa652 => 0xa653,
1532             0xa654 => 0xa655,
1533             0xa656 => 0xa657,
1534             0xa658 => 0xa659,
1535             0xa65a => 0xa65b,
1536             0xa65c => 0xa65d,
1537             0xa65e => 0xa65f,
1538             0xa660 => 0xa661,
1539             0xa662 => 0xa663,
1540             0xa664 => 0xa665,
1541             0xa666 => 0xa667,
1542             0xa668 => 0xa669,
1543             0xa66a => 0xa66b,
1544             0xa66c => 0xa66d,
1545             0xa680 => 0xa681,
1546             0xa682 => 0xa683,
1547             0xa684 => 0xa685,
1548             0xa686 => 0xa687,
1549             0xa688 => 0xa689,
1550             0xa68a => 0xa68b,
1551             0xa68c => 0xa68d,
1552             0xa68e => 0xa68f,
1553             0xa690 => 0xa691,
1554             0xa692 => 0xa693,
1555             0xa694 => 0xa695,
1556             0xa696 => 0xa697,
1557             0xa698 => 0xa699,
1558             0xa69a => 0xa69b,
1559             0xa722 => 0xa723,
1560             0xa724 => 0xa725,
1561             0xa726 => 0xa727,
1562             0xa728 => 0xa729,
1563             0xa72a => 0xa72b,
1564             0xa72c => 0xa72d,
1565             0xa72e => 0xa72f,
1566             0xa732 => 0xa733,
1567             0xa734 => 0xa735,
1568             0xa736 => 0xa737,
1569             0xa738 => 0xa739,
1570             0xa73a => 0xa73b,
1571             0xa73c => 0xa73d,
1572             0xa73e => 0xa73f,
1573             0xa740 => 0xa741,
1574             0xa742 => 0xa743,
1575             0xa744 => 0xa745,
1576             0xa746 => 0xa747,
1577             0xa748 => 0xa749,
1578             0xa74a => 0xa74b,
1579             0xa74c => 0xa74d,
1580             0xa74e => 0xa74f,
1581             0xa750 => 0xa751,
1582             0xa752 => 0xa753,
1583             0xa754 => 0xa755,
1584             0xa756 => 0xa757,
1585             0xa758 => 0xa759,
1586             0xa75a => 0xa75b,
1587             0xa75c => 0xa75d,
1588             0xa75e => 0xa75f,
1589             0xa760 => 0xa761,
1590             0xa762 => 0xa763,
1591             0xa764 => 0xa765,
1592             0xa766 => 0xa767,
1593             0xa768 => 0xa769,
1594             0xa76a => 0xa76b,
1595             0xa76c => 0xa76d,
1596             0xa76e => 0xa76f,
1597             0xa779 => 0xa77a,
1598             0xa77b => 0xa77c,
1599             0xa77d => 0x1d79,
1600             0xa77e => 0xa77f,
1601             0xa780 => 0xa781,
1602             0xa782 => 0xa783,
1603             0xa784 => 0xa785,
1604             0xa786 => 0xa787,
1605             0xa78b => 0xa78c,
1606             0xa78d => 0x0265,
1607             0xa790 => 0xa791,
1608             0xa792 => 0xa793,
1609             0xa796 => 0xa797,
1610             0xa798 => 0xa799,
1611             0xa79a => 0xa79b,
1612             0xa79c => 0xa79d,
1613             0xa79e => 0xa79f,
1614             0xa7a0 => 0xa7a1,
1615             0xa7a2 => 0xa7a3,
1616             0xa7a4 => 0xa7a5,
1617             0xa7a6 => 0xa7a7,
1618             0xa7a8 => 0xa7a9,
1619             0xa7aa => 0x0266,
1620             0xa7ab => 0x025c,
1621             0xa7ac => 0x0261,
1622             0xa7ad => 0x026c,
1623             0xa7ae => 0x026a,
1624             0xa7b0 => 0x029e,
1625             0xa7b1 => 0x0287,
1626             0xa7b2 => 0x029d,
1627             0xa7b3 => 0xab53,
1628             0xa7b4 => 0xa7b5,
1629             0xa7b6 => 0xa7b7,
1630             0xa7b8 => 0xa7b9,
1631             0xa7ba => 0xa7bb,
1632             0xa7bc => 0xa7bd,
1633             0xa7be => 0xa7bf,
1634             0xa7c2 => 0xa7c3,
1635             0xa7c4 => 0xa794,
1636             0xa7c5 => 0x0282,
1637             0xa7c6 => 0x1d8e,
1638             0xab70 => 0x13a0,
1639             0xab71 => 0x13a1,
1640             0xab72 => 0x13a2,
1641             0xab73 => 0x13a3,
1642             0xab74 => 0x13a4,
1643             0xab75 => 0x13a5,
1644             0xab76 => 0x13a6,
1645             0xab77 => 0x13a7,
1646             0xab78 => 0x13a8,
1647             0xab79 => 0x13a9,
1648             0xab7a => 0x13aa,
1649             0xab7b => 0x13ab,
1650             0xab7c => 0x13ac,
1651             0xab7d => 0x13ad,
1652             0xab7e => 0x13ae,
1653             0xab7f => 0x13af,
1654             0xab80 => 0x13b0,
1655             0xab81 => 0x13b1,
1656             0xab82 => 0x13b2,
1657             0xab83 => 0x13b3,
1658             0xab84 => 0x13b4,
1659             0xab85 => 0x13b5,
1660             0xab86 => 0x13b6,
1661             0xab87 => 0x13b7,
1662             0xab88 => 0x13b8,
1663             0xab89 => 0x13b9,
1664             0xab8a => 0x13ba,
1665             0xab8b => 0x13bb,
1666             0xab8c => 0x13bc,
1667             0xab8d => 0x13bd,
1668             0xab8e => 0x13be,
1669             0xab8f => 0x13bf,
1670             0xab90 => 0x13c0,
1671             0xab91 => 0x13c1,
1672             0xab92 => 0x13c2,
1673             0xab93 => 0x13c3,
1674             0xab94 => 0x13c4,
1675             0xab95 => 0x13c5,
1676             0xab96 => 0x13c6,
1677             0xab97 => 0x13c7,
1678             0xab98 => 0x13c8,
1679             0xab99 => 0x13c9,
1680             0xab9a => 0x13ca,
1681             0xab9b => 0x13cb,
1682             0xab9c => 0x13cc,
1683             0xab9d => 0x13cd,
1684             0xab9e => 0x13ce,
1685             0xab9f => 0x13cf,
1686             0xaba0 => 0x13d0,
1687             0xaba1 => 0x13d1,
1688             0xaba2 => 0x13d2,
1689             0xaba3 => 0x13d3,
1690             0xaba4 => 0x13d4,
1691             0xaba5 => 0x13d5,
1692             0xaba6 => 0x13d6,
1693             0xaba7 => 0x13d7,
1694             0xaba8 => 0x13d8,
1695             0xaba9 => 0x13d9,
1696             0xabaa => 0x13da,
1697             0xabab => 0x13db,
1698             0xabac => 0x13dc,
1699             0xabad => 0x13dd,
1700             0xabae => 0x13de,
1701             0xabaf => 0x13df,
1702             0xabb0 => 0x13e0,
1703             0xabb1 => 0x13e1,
1704             0xabb2 => 0x13e2,
1705             0xabb3 => 0x13e3,
1706             0xabb4 => 0x13e4,
1707             0xabb5 => 0x13e5,
1708             0xabb6 => 0x13e6,
1709             0xabb7 => 0x13e7,
1710             0xabb8 => 0x13e8,
1711             0xabb9 => 0x13e9,
1712             0xabba => 0x13ea,
1713             0xabbb => 0x13eb,
1714             0xabbc => 0x13ec,
1715             0xabbd => 0x13ed,
1716             0xabbe => 0x13ee,
1717             0xabbf => 0x13ef,
1718             0xfb00 => return Fold::Two('\u{0066}', '\u{0066}',),
1719             0xfb01 => return Fold::Two('\u{0066}', '\u{0069}',),
1720             0xfb02 => return Fold::Two('\u{0066}', '\u{006c}',),
1721             0xfb03 => return Fold::Three('\u{0066}', '\u{0066}', '\u{0069}',),
1722             0xfb04 => return Fold::Three('\u{0066}', '\u{0066}', '\u{006c}',),
1723             0xfb05 => return Fold::Two('\u{0073}', '\u{0074}',),
1724             0xfb06 => return Fold::Two('\u{0073}', '\u{0074}',),
1725             0xfb13 => return Fold::Two('\u{0574}', '\u{0576}',),
1726             0xfb14 => return Fold::Two('\u{0574}', '\u{0565}',),
1727             0xfb15 => return Fold::Two('\u{0574}', '\u{056b}',),
1728             0xfb16 => return Fold::Two('\u{057e}', '\u{0576}',),
1729             0xfb17 => return Fold::Two('\u{0574}', '\u{056d}',),
1730             0xff21 => 0xff41,
1731             0xff22 => 0xff42,
1732             0xff23 => 0xff43,
1733             0xff24 => 0xff44,
1734             0xff25 => 0xff45,
1735             0xff26 => 0xff46,
1736             0xff27 => 0xff47,
1737             0xff28 => 0xff48,
1738             0xff29 => 0xff49,
1739             0xff2a => 0xff4a,
1740             0xff2b => 0xff4b,
1741             0xff2c => 0xff4c,
1742             0xff2d => 0xff4d,
1743             0xff2e => 0xff4e,
1744             0xff2f => 0xff4f,
1745             0xff30 => 0xff50,
1746             0xff31 => 0xff51,
1747             0xff32 => 0xff52,
1748             0xff33 => 0xff53,
1749             0xff34 => 0xff54,
1750             0xff35 => 0xff55,
1751             0xff36 => 0xff56,
1752             0xff37 => 0xff57,
1753             0xff38 => 0xff58,
1754             0xff39 => 0xff59,
1755             0xff3a => 0xff5a,
1756             0x10400 => 0x10428,
1757             0x10401 => 0x10429,
1758             0x10402 => 0x1042a,
1759             0x10403 => 0x1042b,
1760             0x10404 => 0x1042c,
1761             0x10405 => 0x1042d,
1762             0x10406 => 0x1042e,
1763             0x10407 => 0x1042f,
1764             0x10408 => 0x10430,
1765             0x10409 => 0x10431,
1766             0x1040a => 0x10432,
1767             0x1040b => 0x10433,
1768             0x1040c => 0x10434,
1769             0x1040d => 0x10435,
1770             0x1040e => 0x10436,
1771             0x1040f => 0x10437,
1772             0x10410 => 0x10438,
1773             0x10411 => 0x10439,
1774             0x10412 => 0x1043a,
1775             0x10413 => 0x1043b,
1776             0x10414 => 0x1043c,
1777             0x10415 => 0x1043d,
1778             0x10416 => 0x1043e,
1779             0x10417 => 0x1043f,
1780             0x10418 => 0x10440,
1781             0x10419 => 0x10441,
1782             0x1041a => 0x10442,
1783             0x1041b => 0x10443,
1784             0x1041c => 0x10444,
1785             0x1041d => 0x10445,
1786             0x1041e => 0x10446,
1787             0x1041f => 0x10447,
1788             0x10420 => 0x10448,
1789             0x10421 => 0x10449,
1790             0x10422 => 0x1044a,
1791             0x10423 => 0x1044b,
1792             0x10424 => 0x1044c,
1793             0x10425 => 0x1044d,
1794             0x10426 => 0x1044e,
1795             0x10427 => 0x1044f,
1796             0x104b0 => 0x104d8,
1797             0x104b1 => 0x104d9,
1798             0x104b2 => 0x104da,
1799             0x104b3 => 0x104db,
1800             0x104b4 => 0x104dc,
1801             0x104b5 => 0x104dd,
1802             0x104b6 => 0x104de,
1803             0x104b7 => 0x104df,
1804             0x104b8 => 0x104e0,
1805             0x104b9 => 0x104e1,
1806             0x104ba => 0x104e2,
1807             0x104bb => 0x104e3,
1808             0x104bc => 0x104e4,
1809             0x104bd => 0x104e5,
1810             0x104be => 0x104e6,
1811             0x104bf => 0x104e7,
1812             0x104c0 => 0x104e8,
1813             0x104c1 => 0x104e9,
1814             0x104c2 => 0x104ea,
1815             0x104c3 => 0x104eb,
1816             0x104c4 => 0x104ec,
1817             0x104c5 => 0x104ed,
1818             0x104c6 => 0x104ee,
1819             0x104c7 => 0x104ef,
1820             0x104c8 => 0x104f0,
1821             0x104c9 => 0x104f1,
1822             0x104ca => 0x104f2,
1823             0x104cb => 0x104f3,
1824             0x104cc => 0x104f4,
1825             0x104cd => 0x104f5,
1826             0x104ce => 0x104f6,
1827             0x104cf => 0x104f7,
1828             0x104d0 => 0x104f8,
1829             0x104d1 => 0x104f9,
1830             0x104d2 => 0x104fa,
1831             0x104d3 => 0x104fb,
1832             0x10c80 => 0x10cc0,
1833             0x10c81 => 0x10cc1,
1834             0x10c82 => 0x10cc2,
1835             0x10c83 => 0x10cc3,
1836             0x10c84 => 0x10cc4,
1837             0x10c85 => 0x10cc5,
1838             0x10c86 => 0x10cc6,
1839             0x10c87 => 0x10cc7,
1840             0x10c88 => 0x10cc8,
1841             0x10c89 => 0x10cc9,
1842             0x10c8a => 0x10cca,
1843             0x10c8b => 0x10ccb,
1844             0x10c8c => 0x10ccc,
1845             0x10c8d => 0x10ccd,
1846             0x10c8e => 0x10cce,
1847             0x10c8f => 0x10ccf,
1848             0x10c90 => 0x10cd0,
1849             0x10c91 => 0x10cd1,
1850             0x10c92 => 0x10cd2,
1851             0x10c93 => 0x10cd3,
1852             0x10c94 => 0x10cd4,
1853             0x10c95 => 0x10cd5,
1854             0x10c96 => 0x10cd6,
1855             0x10c97 => 0x10cd7,
1856             0x10c98 => 0x10cd8,
1857             0x10c99 => 0x10cd9,
1858             0x10c9a => 0x10cda,
1859             0x10c9b => 0x10cdb,
1860             0x10c9c => 0x10cdc,
1861             0x10c9d => 0x10cdd,
1862             0x10c9e => 0x10cde,
1863             0x10c9f => 0x10cdf,
1864             0x10ca0 => 0x10ce0,
1865             0x10ca1 => 0x10ce1,
1866             0x10ca2 => 0x10ce2,
1867             0x10ca3 => 0x10ce3,
1868             0x10ca4 => 0x10ce4,
1869             0x10ca5 => 0x10ce5,
1870             0x10ca6 => 0x10ce6,
1871             0x10ca7 => 0x10ce7,
1872             0x10ca8 => 0x10ce8,
1873             0x10ca9 => 0x10ce9,
1874             0x10caa => 0x10cea,
1875             0x10cab => 0x10ceb,
1876             0x10cac => 0x10cec,
1877             0x10cad => 0x10ced,
1878             0x10cae => 0x10cee,
1879             0x10caf => 0x10cef,
1880             0x10cb0 => 0x10cf0,
1881             0x10cb1 => 0x10cf1,
1882             0x10cb2 => 0x10cf2,
1883             0x118a0 => 0x118c0,
1884             0x118a1 => 0x118c1,
1885             0x118a2 => 0x118c2,
1886             0x118a3 => 0x118c3,
1887             0x118a4 => 0x118c4,
1888             0x118a5 => 0x118c5,
1889             0x118a6 => 0x118c6,
1890             0x118a7 => 0x118c7,
1891             0x118a8 => 0x118c8,
1892             0x118a9 => 0x118c9,
1893             0x118aa => 0x118ca,
1894             0x118ab => 0x118cb,
1895             0x118ac => 0x118cc,
1896             0x118ad => 0x118cd,
1897             0x118ae => 0x118ce,
1898             0x118af => 0x118cf,
1899             0x118b0 => 0x118d0,
1900             0x118b1 => 0x118d1,
1901             0x118b2 => 0x118d2,
1902             0x118b3 => 0x118d3,
1903             0x118b4 => 0x118d4,
1904             0x118b5 => 0x118d5,
1905             0x118b6 => 0x118d6,
1906             0x118b7 => 0x118d7,
1907             0x118b8 => 0x118d8,
1908             0x118b9 => 0x118d9,
1909             0x118ba => 0x118da,
1910             0x118bb => 0x118db,
1911             0x118bc => 0x118dc,
1912             0x118bd => 0x118dd,
1913             0x118be => 0x118de,
1914             0x118bf => 0x118df,
1915             0x16e40 => 0x16e60,
1916             0x16e41 => 0x16e61,
1917             0x16e42 => 0x16e62,
1918             0x16e43 => 0x16e63,
1919             0x16e44 => 0x16e64,
1920             0x16e45 => 0x16e65,
1921             0x16e46 => 0x16e66,
1922             0x16e47 => 0x16e67,
1923             0x16e48 => 0x16e68,
1924             0x16e49 => 0x16e69,
1925             0x16e4a => 0x16e6a,
1926             0x16e4b => 0x16e6b,
1927             0x16e4c => 0x16e6c,
1928             0x16e4d => 0x16e6d,
1929             0x16e4e => 0x16e6e,
1930             0x16e4f => 0x16e6f,
1931             0x16e50 => 0x16e70,
1932             0x16e51 => 0x16e71,
1933             0x16e52 => 0x16e72,
1934             0x16e53 => 0x16e73,
1935             0x16e54 => 0x16e74,
1936             0x16e55 => 0x16e75,
1937             0x16e56 => 0x16e76,
1938             0x16e57 => 0x16e77,
1939             0x16e58 => 0x16e78,
1940             0x16e59 => 0x16e79,
1941             0x16e5a => 0x16e7a,
1942             0x16e5b => 0x16e7b,
1943             0x16e5c => 0x16e7c,
1944             0x16e5d => 0x16e7d,
1945             0x16e5e => 0x16e7e,
1946             0x16e5f => 0x16e7f,
1947             0x1e900 => 0x1e922,
1948             0x1e901 => 0x1e923,
1949             0x1e902 => 0x1e924,
1950             0x1e903 => 0x1e925,
1951             0x1e904 => 0x1e926,
1952             0x1e905 => 0x1e927,
1953             0x1e906 => 0x1e928,
1954             0x1e907 => 0x1e929,
1955             0x1e908 => 0x1e92a,
1956             0x1e909 => 0x1e92b,
1957             0x1e90a => 0x1e92c,
1958             0x1e90b => 0x1e92d,
1959             0x1e90c => 0x1e92e,
1960             0x1e90d => 0x1e92f,
1961             0x1e90e => 0x1e930,
1962             0x1e90f => 0x1e931,
1963             0x1e910 => 0x1e932,
1964             0x1e911 => 0x1e933,
1965             0x1e912 => 0x1e934,
1966             0x1e913 => 0x1e935,
1967             0x1e914 => 0x1e936,
1968             0x1e915 => 0x1e937,
1969             0x1e916 => 0x1e938,
1970             0x1e917 => 0x1e939,
1971             0x1e918 => 0x1e93a,
1972             0x1e919 => 0x1e93b,
1973             0x1e91a => 0x1e93c,
1974             0x1e91b => 0x1e93d,
1975             0x1e91c => 0x1e93e,
1976             0x1e91d => 0x1e93f,
1977             0x1e91e => 0x1e940,
1978             0x1e91f => 0x1e941,
1979             0x1e920 => 0x1e942,
1980             0x1e921 => 0x1e943,
1981             _ => orig as u32
1982         };
1983         Fold::One( char::from_u32(single_char).unwrap() )
1984     }
1985 
1986     for c_index in 0..126217 {
1987         if let Some(c) = char::from_u32(c_index) {
1988             let reference: Vec<char> = lookup_naive(c).collect();
1989             let actual: Vec<char> = lookup(c).collect();
1990             if actual != reference {
1991                 assert!(false, "case-folding {:?} (#0x{:04x}) failed: Expected {:?}, got {:?}", c, c_index, reference, actual);
1992             }
1993         }
1994     }
1995 }
1996