this repo has no description
1//! generated by scripts/gen_tokenizer_data.py — do not edit.
2//! tokenizer pattern data compiled from spaCy en_core_web_sm.
3
4const std = @import("std");
5
6// ── utf-8 helpers ──
7
8pub const Codepoint = struct { value: u21, len: u3 };
9
10pub fn decodeUtf8(bytes: []const u8) ?Codepoint {
11 if (bytes.len == 0) return null;
12 const b0 = bytes[0];
13 if (b0 < 0x80) return .{ .value = b0, .len = 1 };
14 if (b0 & 0xE0 == 0xC0 and bytes.len >= 2)
15 return .{ .value = (@as(u21, b0 & 0x1F) << 6) | (bytes[1] & 0x3F), .len = 2 };
16 if (b0 & 0xF0 == 0xE0 and bytes.len >= 3)
17 return .{ .value = (@as(u21, b0 & 0x0F) << 12) | (@as(u21, bytes[1] & 0x3F) << 6) | (bytes[2] & 0x3F), .len = 3 };
18 if (b0 & 0xF8 == 0xF0 and bytes.len >= 4)
19 return .{ .value = (@as(u21, b0 & 0x07) << 18) | (@as(u21, bytes[1] & 0x3F) << 12) | (@as(u21, bytes[2] & 0x3F) << 6) | (bytes[3] & 0x3F), .len = 4 };
20 return .{ .value = 0xFFFD, .len = 1 }; // replacement char
21}
22
23pub fn lastCodepoint(text: []const u8) ?Codepoint {
24 if (text.len == 0) return null;
25 var i = text.len - 1;
26 while (i > 0 and text[i] & 0xC0 == 0x80) : (i -= 1) {}
27 return decodeUtf8(text[i..]);
28}
29
30// ── range search ──
31
32fn rangeContains(ranges: []const [2]u21, c: u21) bool {
33 var lo: usize = 0;
34 var hi: usize = ranges.len;
35 while (lo < hi) {
36 const mid = lo + (hi - lo) / 2;
37 if (c > ranges[mid][1]) { lo = mid + 1; }
38 else if (c < ranges[mid][0]) { hi = mid; }
39 else return true;
40 }
41 return false;
42}
43
44// ── symbol class (So/Sc unicode categories) ──
45
46pub const isSymbol_ranges = [_][2]u21{
47 .{ 0x00A6, 0x00A6 },
48 .{ 0x00A9, 0x00A9 },
49 .{ 0x00AE, 0x00AE },
50 .{ 0x00B0, 0x00B0 },
51 .{ 0x0482, 0x0482 },
52 .{ 0x058D, 0x058E },
53 .{ 0x060E, 0x060F },
54 .{ 0x06DE, 0x06DE },
55 .{ 0x06E9, 0x06E9 },
56 .{ 0x06FD, 0x06FE },
57 .{ 0x07F6, 0x07F6 },
58 .{ 0x09FA, 0x09FA },
59 .{ 0x0B70, 0x0B70 },
60 .{ 0x0BF3, 0x0BF8 },
61 .{ 0x0BFA, 0x0BFA },
62 .{ 0x0C7F, 0x0C7F },
63 .{ 0x0D4F, 0x0D4F },
64 .{ 0x0D79, 0x0D79 },
65 .{ 0x0F01, 0x0F03 },
66 .{ 0x0F13, 0x0F13 },
67 .{ 0x0F15, 0x0F17 },
68 .{ 0x0F1A, 0x0F1F },
69 .{ 0x0F34, 0x0F34 },
70 .{ 0x0F36, 0x0F36 },
71 .{ 0x0F38, 0x0F38 },
72 .{ 0x0FBE, 0x0FC5 },
73 .{ 0x0FC7, 0x0FCC },
74 .{ 0x0FCE, 0x0FCF },
75 .{ 0x0FD5, 0x0FD8 },
76 .{ 0x109E, 0x109F },
77 .{ 0x1390, 0x1399 },
78 .{ 0x1940, 0x1940 },
79 .{ 0x19DE, 0x19FF },
80 .{ 0x1B61, 0x1B6A },
81 .{ 0x1B74, 0x1B7C },
82 .{ 0x2100, 0x2101 },
83 .{ 0x2103, 0x2106 },
84 .{ 0x2108, 0x2109 },
85 .{ 0x2114, 0x2114 },
86 .{ 0x2116, 0x2117 },
87 .{ 0x211E, 0x2123 },
88 .{ 0x2125, 0x2125 },
89 .{ 0x2127, 0x2127 },
90 .{ 0x2129, 0x2129 },
91 .{ 0x212E, 0x212E },
92 .{ 0x213A, 0x213B },
93 .{ 0x214A, 0x214A },
94 .{ 0x214C, 0x214D },
95 .{ 0x214F, 0x214F },
96 .{ 0x218A, 0x218B },
97 .{ 0x2195, 0x2199 },
98 .{ 0x219C, 0x219F },
99 .{ 0x21A1, 0x21A2 },
100 .{ 0x21A4, 0x21A5 },
101 .{ 0x21A7, 0x21AD },
102 .{ 0x21AF, 0x21CD },
103 .{ 0x21D0, 0x21D1 },
104 .{ 0x21D3, 0x21D3 },
105 .{ 0x21D5, 0x21F3 },
106 .{ 0x2300, 0x2307 },
107 .{ 0x230C, 0x231F },
108 .{ 0x2322, 0x2328 },
109 .{ 0x232B, 0x237B },
110 .{ 0x237D, 0x239A },
111 .{ 0x23B4, 0x23DB },
112 .{ 0x23E2, 0x2426 },
113 .{ 0x2440, 0x244A },
114 .{ 0x249C, 0x24E9 },
115 .{ 0x2500, 0x25B6 },
116 .{ 0x25B8, 0x25C0 },
117 .{ 0x25C2, 0x25F7 },
118 .{ 0x2600, 0x266E },
119 .{ 0x2670, 0x2767 },
120 .{ 0x2794, 0x27BF },
121 .{ 0x2800, 0x28FF },
122 .{ 0x2B00, 0x2B2F },
123 .{ 0x2B45, 0x2B46 },
124 .{ 0x2B4D, 0x2B73 },
125 .{ 0x2B76, 0x2B95 },
126 .{ 0x2B98, 0x2BC8 },
127 .{ 0x2BCA, 0x2BFE },
128 .{ 0x2CE5, 0x2CEA },
129 .{ 0x2E80, 0x2E99 },
130 .{ 0x2E9B, 0x2EF3 },
131 .{ 0x2F00, 0x2FD5 },
132 .{ 0x2FF0, 0x2FFB },
133 .{ 0x3004, 0x3004 },
134 .{ 0x3012, 0x3013 },
135 .{ 0x3020, 0x3020 },
136 .{ 0x3036, 0x3037 },
137 .{ 0x303E, 0x303F },
138 .{ 0x3190, 0x3191 },
139 .{ 0x3196, 0x319F },
140 .{ 0x31C0, 0x31E3 },
141 .{ 0x3200, 0x321E },
142 .{ 0x322A, 0x3247 },
143 .{ 0x3250, 0x3250 },
144 .{ 0x3260, 0x327F },
145 .{ 0x328A, 0x32B0 },
146 .{ 0x32C0, 0x32FE },
147 .{ 0x3300, 0x33FF },
148 .{ 0x4DC0, 0x4DFF },
149 .{ 0xA490, 0xA4C6 },
150 .{ 0xA828, 0xA82B },
151 .{ 0xA836, 0xA837 },
152 .{ 0xA839, 0xA839 },
153 .{ 0xAA77, 0xAA79 },
154 .{ 0xFDFD, 0xFDFD },
155 .{ 0xFFE4, 0xFFE4 },
156 .{ 0xFFE8, 0xFFE8 },
157 .{ 0xFFED, 0xFFEE },
158 .{ 0xFFFC, 0xFFFD },
159 .{ 0x10137, 0x1013F },
160 .{ 0x10179, 0x10189 },
161 .{ 0x1018C, 0x1018E },
162 .{ 0x10190, 0x1019B },
163 .{ 0x101A0, 0x101A0 },
164 .{ 0x101D0, 0x101FC },
165 .{ 0x10877, 0x10878 },
166 .{ 0x10AC8, 0x10AC8 },
167 .{ 0x1173F, 0x1173F },
168 .{ 0x16B3C, 0x16B3F },
169 .{ 0x16B45, 0x16B45 },
170 .{ 0x1BC9C, 0x1BC9C },
171 .{ 0x1D000, 0x1D0F5 },
172 .{ 0x1D100, 0x1D126 },
173 .{ 0x1D129, 0x1D164 },
174 .{ 0x1D16A, 0x1D16C },
175 .{ 0x1D183, 0x1D184 },
176 .{ 0x1D18C, 0x1D1A9 },
177 .{ 0x1D1AE, 0x1D1E8 },
178 .{ 0x1D200, 0x1D241 },
179 .{ 0x1D245, 0x1D245 },
180 .{ 0x1D300, 0x1D356 },
181 .{ 0x1D800, 0x1D9FF },
182 .{ 0x1DA37, 0x1DA3A },
183 .{ 0x1DA6D, 0x1DA74 },
184 .{ 0x1DA76, 0x1DA83 },
185 .{ 0x1DA85, 0x1DA86 },
186 .{ 0x1ECAC, 0x1ECAC },
187 .{ 0x1F000, 0x1F02B },
188 .{ 0x1F030, 0x1F093 },
189 .{ 0x1F0A0, 0x1F0AE },
190 .{ 0x1F0B1, 0x1F0BF },
191 .{ 0x1F0C1, 0x1F0CF },
192 .{ 0x1F0D1, 0x1F0F5 },
193 .{ 0x1F110, 0x1F16B },
194 .{ 0x1F170, 0x1F1AC },
195 .{ 0x1F1E6, 0x1F202 },
196 .{ 0x1F210, 0x1F23B },
197 .{ 0x1F240, 0x1F248 },
198 .{ 0x1F250, 0x1F251 },
199 .{ 0x1F260, 0x1F265 },
200 .{ 0x1F300, 0x1F3FA },
201 .{ 0x1F400, 0x1F6D4 },
202 .{ 0x1F6E0, 0x1F6EC },
203 .{ 0x1F6F0, 0x1F6F9 },
204 .{ 0x1F700, 0x1F773 },
205 .{ 0x1F780, 0x1F7D8 },
206 .{ 0x1F800, 0x1F80B },
207 .{ 0x1F810, 0x1F847 },
208 .{ 0x1F850, 0x1F859 },
209 .{ 0x1F860, 0x1F887 },
210 .{ 0x1F890, 0x1F8AD },
211 .{ 0x1F900, 0x1F90B },
212 .{ 0x1F910, 0x1F93E },
213 .{ 0x1F940, 0x1F970 },
214 .{ 0x1F973, 0x1F976 },
215 .{ 0x1F97A, 0x1F97A },
216 .{ 0x1F97C, 0x1F9A2 },
217 .{ 0x1F9B0, 0x1F9B9 },
218 .{ 0x1F9C0, 0x1F9C2 },
219 .{ 0x1F9D0, 0x1F9FF },
220 .{ 0x1FA60, 0x1FA6D },
221};
222
223pub fn isSymbol(c: u21) bool {
224 return rangeContains(&isSymbol_ranges, c);
225}
226
227// ── prefix data ──
228
229pub fn isPrefixChar(c: u21) bool {
230 return switch (c) {
231 '!'...'*' => true,
232 ',' => true,
233 ':'...'?' => true,
234 '[' => true,
235 ']' => true,
236 '_'...'`' => true,
237 '{' => true,
238 '}' => true,
239 0x00A1 => true,
240 0x00A3 => true,
241 0x00A5 => true,
242 0x00A7 => true,
243 0x00AB => true,
244 0x00B4 => true,
245 0x00B7 => true,
246 0x00BB => true,
247 0x00BF => true,
248 0x060C => true,
249 0x061B => true,
250 0x061F => true,
251 0x066A => true,
252 0x06D4 => true,
253 0x0964 => true,
254 0x0E3F => true,
255 0x2013...0x2014 => true,
256 0x2018...0x201A => true,
257 0x201C...0x201E => true,
258 0x2026 => true,
259 0x20A0...0x20BF => true,
260 0x2329...0x232A => true,
261 0x27E6...0x27E7 => true,
262 0x3001...0x3002 => true,
263 0x3008...0x3011 => true,
264 0x3014...0x3015 => true,
265 0xFDFC => true,
266 0xFF01 => true,
267 0xFF08...0xFF09 => true,
268 0xFF0C => true,
269 0xFF1A...0xFF1B => true,
270 0xFF1F => true,
271 0xFF5E => true,
272 else => false,
273 };
274}
275
276pub const prefix_multi_literals = [_][]const u8{
277 "US$",
278 "\xe2\x80\xa6\xe2\x80\xa6",
279 "C$",
280 "A$",
281};
282
283pub fn isPrefixUnlessDigit(c: u21) bool {
284 return switch (c) {
285 '+' => true,
286 else => false,
287 };
288}
289
290// ── suffix data ──
291
292pub fn isSuffixChar(c: u21) bool {
293 return switch (c) {
294 '!'...'#' => true,
295 '&'...'*' => true,
296 ',' => true,
297 ':'...'<' => true,
298 '>'...'?' => true,
299 '[' => true,
300 ']' => true,
301 '_'...'`' => true,
302 '{' => true,
303 '}' => true,
304 0x00A1 => true,
305 0x00AB => true,
306 0x00B4 => true,
307 0x00B7 => true,
308 0x00BB => true,
309 0x00BF => true,
310 0x060C => true,
311 0x061B => true,
312 0x061F => true,
313 0x066A => true,
314 0x06D4 => true,
315 0x0964 => true,
316 0x2013...0x2014 => true,
317 0x2018...0x201A => true,
318 0x201C...0x201E => true,
319 0x2026 => true,
320 0x2329...0x232A => true,
321 0x27E6...0x27E7 => true,
322 0x3001...0x3002 => true,
323 0x3008...0x3011 => true,
324 0x3014...0x3015 => true,
325 0xFF01 => true,
326 0xFF08...0xFF09 => true,
327 0xFF0C => true,
328 0xFF1A...0xFF1B => true,
329 0xFF1F => true,
330 0xFF5E => true,
331 else => false,
332 };
333}
334
335pub const suffix_multi_literals = [_][]const u8{
336 "\xe2\x80\xa6\xe2\x80\xa6",
337 "'s",
338 "'S",
339 "\xe2\x80\x99s",
340 "\xe2\x80\x99S",
341};
342
343// ── suffix lookbehind helpers ──
344
345const lookbehind_class_0_ranges = [_][2]u21{
346 .{ 0x0030, 0x0039 },
347};
348
349pub fn matchLookbehind0(c: u21) bool {
350 return rangeContains(&lookbehind_class_0_ranges, c);
351}
352
353const lookbehind_class_1_ranges = [_][2]u21{
354 .{ 0x0043, 0x0043 },
355 .{ 0x0046, 0x0046 },
356 .{ 0x004B, 0x004B },
357 .{ 0x0063, 0x0063 },
358 .{ 0x0066, 0x0066 },
359 .{ 0x006B, 0x006B },
360};
361
362pub fn matchLookbehind1(c: u21) bool {
363 return rangeContains(&lookbehind_class_1_ranges, c);
364}
365
366const lookbehind_class_2_ranges = [_][2]u21{
367 .{ 0x0021, 0x0023 },
368 .{ 0x0025, 0x002D },
369 .{ 0x0030, 0x003C },
370 .{ 0x003E, 0x003F },
371 .{ 0x005B, 0x005B },
372 .{ 0x005D, 0x005D },
373 .{ 0x005F, 0x007D },
374 .{ 0x00A1, 0x00A1 },
375 .{ 0x00AB, 0x00AB },
376 .{ 0x00B2, 0x00B2 },
377 .{ 0x00B4, 0x00B4 },
378 .{ 0x00B7, 0x00B7 },
379 .{ 0x00BB, 0x00BB },
380 .{ 0x00BF, 0x00BF },
381 .{ 0x00DF, 0x00F6 },
382 .{ 0x00F8, 0x00FF },
383 .{ 0x0101, 0x0101 },
384 .{ 0x0103, 0x0103 },
385 .{ 0x0105, 0x0105 },
386 .{ 0x0107, 0x0107 },
387 .{ 0x0109, 0x0109 },
388 .{ 0x010B, 0x010B },
389 .{ 0x010D, 0x010D },
390 .{ 0x010F, 0x010F },
391 .{ 0x0111, 0x0111 },
392 .{ 0x0113, 0x0113 },
393 .{ 0x0115, 0x0115 },
394 .{ 0x0117, 0x0117 },
395 .{ 0x0119, 0x0119 },
396 .{ 0x011B, 0x011B },
397 .{ 0x011D, 0x011D },
398 .{ 0x011F, 0x011F },
399 .{ 0x0121, 0x0121 },
400 .{ 0x0123, 0x0123 },
401 .{ 0x0125, 0x0125 },
402 .{ 0x0127, 0x0127 },
403 .{ 0x0129, 0x0129 },
404 .{ 0x012B, 0x012B },
405 .{ 0x012D, 0x012D },
406 .{ 0x012F, 0x012F },
407 .{ 0x0131, 0x0131 },
408 .{ 0x0133, 0x0133 },
409 .{ 0x0135, 0x0135 },
410 .{ 0x0137, 0x0138 },
411 .{ 0x013A, 0x013A },
412 .{ 0x013C, 0x013C },
413 .{ 0x013E, 0x013E },
414 .{ 0x0140, 0x0140 },
415 .{ 0x0142, 0x0142 },
416 .{ 0x0144, 0x0144 },
417 .{ 0x0146, 0x0146 },
418 .{ 0x0148, 0x0149 },
419 .{ 0x014B, 0x014B },
420 .{ 0x014D, 0x014D },
421 .{ 0x014F, 0x014F },
422 .{ 0x0151, 0x0151 },
423 .{ 0x0153, 0x0153 },
424 .{ 0x0155, 0x0155 },
425 .{ 0x0157, 0x0157 },
426 .{ 0x0159, 0x0159 },
427 .{ 0x015B, 0x015B },
428 .{ 0x015D, 0x015D },
429 .{ 0x015F, 0x015F },
430 .{ 0x0161, 0x0161 },
431 .{ 0x0163, 0x0163 },
432 .{ 0x0165, 0x0165 },
433 .{ 0x0167, 0x0167 },
434 .{ 0x0169, 0x0169 },
435 .{ 0x016B, 0x016B },
436 .{ 0x016D, 0x016D },
437 .{ 0x016F, 0x016F },
438 .{ 0x0171, 0x0171 },
439 .{ 0x0173, 0x0173 },
440 .{ 0x0175, 0x0175 },
441 .{ 0x0177, 0x0177 },
442 .{ 0x017A, 0x017A },
443 .{ 0x017C, 0x017C },
444 .{ 0x017E, 0x0180 },
445 .{ 0x0183, 0x0183 },
446 .{ 0x0185, 0x0185 },
447 .{ 0x0188, 0x0188 },
448 .{ 0x018C, 0x018D },
449 .{ 0x0192, 0x0192 },
450 .{ 0x0195, 0x0195 },
451 .{ 0x0199, 0x019B },
452 .{ 0x019E, 0x019E },
453 .{ 0x01A1, 0x01A1 },
454 .{ 0x01A3, 0x01A3 },
455 .{ 0x01A5, 0x01A5 },
456 .{ 0x01A8, 0x01A8 },
457 .{ 0x01AA, 0x01AB },
458 .{ 0x01AD, 0x01AD },
459 .{ 0x01B0, 0x01B0 },
460 .{ 0x01B4, 0x01B4 },
461 .{ 0x01B6, 0x01B6 },
462 .{ 0x01B9, 0x01BA },
463 .{ 0x01BD, 0x01BF },
464 .{ 0x01C6, 0x01C6 },
465 .{ 0x01C9, 0x01C9 },
466 .{ 0x01CC, 0x01CC },
467 .{ 0x01CE, 0x01CE },
468 .{ 0x01D0, 0x01D0 },
469 .{ 0x01D2, 0x01D2 },
470 .{ 0x01D4, 0x01D4 },
471 .{ 0x01D6, 0x01D6 },
472 .{ 0x01D8, 0x01D8 },
473 .{ 0x01DA, 0x01DA },
474 .{ 0x01DC, 0x01DD },
475 .{ 0x01DF, 0x01DF },
476 .{ 0x01E1, 0x01E1 },
477 .{ 0x01E3, 0x01E3 },
478 .{ 0x01E5, 0x01E5 },
479 .{ 0x01E7, 0x01E7 },
480 .{ 0x01E9, 0x01E9 },
481 .{ 0x01EB, 0x01EB },
482 .{ 0x01ED, 0x01ED },
483 .{ 0x01EF, 0x01F0 },
484 .{ 0x01F3, 0x01F3 },
485 .{ 0x01F5, 0x01F5 },
486 .{ 0x01F9, 0x01F9 },
487 .{ 0x01FB, 0x01FB },
488 .{ 0x01FD, 0x01FD },
489 .{ 0x01FF, 0x01FF },
490 .{ 0x0201, 0x0201 },
491 .{ 0x0203, 0x0203 },
492 .{ 0x0205, 0x0205 },
493 .{ 0x0207, 0x0207 },
494 .{ 0x0209, 0x0209 },
495 .{ 0x020B, 0x020B },
496 .{ 0x020D, 0x020D },
497 .{ 0x020F, 0x020F },
498 .{ 0x0211, 0x0211 },
499 .{ 0x0213, 0x0213 },
500 .{ 0x0215, 0x0215 },
501 .{ 0x0217, 0x0217 },
502 .{ 0x0219, 0x0219 },
503 .{ 0x021B, 0x021B },
504 .{ 0x021D, 0x021D },
505 .{ 0x021F, 0x021F },
506 .{ 0x0221, 0x0221 },
507 .{ 0x0223, 0x0223 },
508 .{ 0x0225, 0x0225 },
509 .{ 0x0227, 0x0227 },
510 .{ 0x0229, 0x0229 },
511 .{ 0x022B, 0x022B },
512 .{ 0x022D, 0x022D },
513 .{ 0x022F, 0x022F },
514 .{ 0x0231, 0x0231 },
515 .{ 0x0233, 0x0239 },
516 .{ 0x023C, 0x023C },
517 .{ 0x023F, 0x0240 },
518 .{ 0x0242, 0x0242 },
519 .{ 0x0247, 0x0247 },
520 .{ 0x0249, 0x0249 },
521 .{ 0x024B, 0x024B },
522 .{ 0x024D, 0x024D },
523 .{ 0x024F, 0x02AF },
524 .{ 0x03AC, 0x03AF },
525 .{ 0x03B1, 0x03C9 },
526 .{ 0x03CC, 0x03CE },
527 .{ 0x0430, 0x0451 },
528 .{ 0x0453, 0x045A },
529 .{ 0x045C, 0x045D },
530 .{ 0x0491, 0x0491 },
531 .{ 0x0497, 0x0497 },
532 .{ 0x04A3, 0x04A3 },
533 .{ 0x04AF, 0x04AF },
534 .{ 0x04BB, 0x04BB },
535 .{ 0x04D9, 0x04D9 },
536 .{ 0x04E9, 0x04E9 },
537 .{ 0x0591, 0x05F4 },
538 .{ 0x060C, 0x060C },
539 .{ 0x061B, 0x061B },
540 .{ 0x061F, 0x064A },
541 .{ 0x066A, 0x066A },
542 .{ 0x066E, 0x06D5 },
543 .{ 0x06E5, 0x06FF },
544 .{ 0x0750, 0x077F },
545 .{ 0x08A0, 0x08BD },
546 .{ 0x0900, 0x09FF },
547 .{ 0x0B80, 0x0CFF },
548 .{ 0x0D80, 0x0DFF },
549 .{ 0x1100, 0x137F },
550 .{ 0x1D00, 0x1D25 },
551 .{ 0x1D6B, 0x1D77 },
552 .{ 0x1D79, 0x1D9A },
553 .{ 0x1E01, 0x1E01 },
554 .{ 0x1E03, 0x1E03 },
555 .{ 0x1E05, 0x1E05 },
556 .{ 0x1E07, 0x1E07 },
557 .{ 0x1E09, 0x1E09 },
558 .{ 0x1E0B, 0x1E0B },
559 .{ 0x1E0D, 0x1E0D },
560 .{ 0x1E0F, 0x1E0F },
561 .{ 0x1E11, 0x1E11 },
562 .{ 0x1E13, 0x1E13 },
563 .{ 0x1E15, 0x1E15 },
564 .{ 0x1E17, 0x1E17 },
565 .{ 0x1E19, 0x1E19 },
566 .{ 0x1E1B, 0x1E1B },
567 .{ 0x1E1D, 0x1E1D },
568 .{ 0x1E1F, 0x1E1F },
569 .{ 0x1E21, 0x1E21 },
570 .{ 0x1E23, 0x1E23 },
571 .{ 0x1E25, 0x1E25 },
572 .{ 0x1E27, 0x1E27 },
573 .{ 0x1E29, 0x1E29 },
574 .{ 0x1E2B, 0x1E2B },
575 .{ 0x1E2D, 0x1E2D },
576 .{ 0x1E2F, 0x1E2F },
577 .{ 0x1E31, 0x1E31 },
578 .{ 0x1E33, 0x1E33 },
579 .{ 0x1E35, 0x1E35 },
580 .{ 0x1E37, 0x1E37 },
581 .{ 0x1E39, 0x1E39 },
582 .{ 0x1E3B, 0x1E3B },
583 .{ 0x1E3D, 0x1E3D },
584 .{ 0x1E3F, 0x1E3F },
585 .{ 0x1E41, 0x1E41 },
586 .{ 0x1E43, 0x1E43 },
587 .{ 0x1E45, 0x1E45 },
588 .{ 0x1E47, 0x1E47 },
589 .{ 0x1E49, 0x1E49 },
590 .{ 0x1E4B, 0x1E4B },
591 .{ 0x1E4D, 0x1E4D },
592 .{ 0x1E4F, 0x1E4F },
593 .{ 0x1E51, 0x1E51 },
594 .{ 0x1E53, 0x1E53 },
595 .{ 0x1E55, 0x1E55 },
596 .{ 0x1E57, 0x1E57 },
597 .{ 0x1E59, 0x1E59 },
598 .{ 0x1E5B, 0x1E5B },
599 .{ 0x1E5D, 0x1E5D },
600 .{ 0x1E5F, 0x1E5F },
601 .{ 0x1E61, 0x1E61 },
602 .{ 0x1E63, 0x1E63 },
603 .{ 0x1E65, 0x1E65 },
604 .{ 0x1E67, 0x1E67 },
605 .{ 0x1E69, 0x1E69 },
606 .{ 0x1E6B, 0x1E6B },
607 .{ 0x1E6D, 0x1E6D },
608 .{ 0x1E6F, 0x1E6F },
609 .{ 0x1E71, 0x1E71 },
610 .{ 0x1E73, 0x1E73 },
611 .{ 0x1E75, 0x1E75 },
612 .{ 0x1E77, 0x1E77 },
613 .{ 0x1E79, 0x1E79 },
614 .{ 0x1E7B, 0x1E7B },
615 .{ 0x1E7D, 0x1E7D },
616 .{ 0x1E7F, 0x1E7F },
617 .{ 0x1E81, 0x1E81 },
618 .{ 0x1E83, 0x1E83 },
619 .{ 0x1E85, 0x1E85 },
620 .{ 0x1E87, 0x1E87 },
621 .{ 0x1E89, 0x1E89 },
622 .{ 0x1E8B, 0x1E8B },
623 .{ 0x1E8D, 0x1E8D },
624 .{ 0x1E8F, 0x1E8F },
625 .{ 0x1E91, 0x1E91 },
626 .{ 0x1E93, 0x1E93 },
627 .{ 0x1E95, 0x1E9D },
628 .{ 0x1E9F, 0x1E9F },
629 .{ 0x1EA1, 0x1EA1 },
630 .{ 0x1EA3, 0x1EA3 },
631 .{ 0x1EA5, 0x1EA5 },
632 .{ 0x1EA7, 0x1EA7 },
633 .{ 0x1EA9, 0x1EA9 },
634 .{ 0x1EAB, 0x1EAB },
635 .{ 0x1EAD, 0x1EAD },
636 .{ 0x1EAF, 0x1EAF },
637 .{ 0x1EB1, 0x1EB1 },
638 .{ 0x1EB3, 0x1EB3 },
639 .{ 0x1EB5, 0x1EB5 },
640 .{ 0x1EB7, 0x1EB7 },
641 .{ 0x1EB9, 0x1EB9 },
642 .{ 0x1EBB, 0x1EBB },
643 .{ 0x1EBD, 0x1EBD },
644 .{ 0x1EBF, 0x1EBF },
645 .{ 0x1EC1, 0x1EC1 },
646 .{ 0x1EC3, 0x1EC3 },
647 .{ 0x1EC5, 0x1EC5 },
648 .{ 0x1EC7, 0x1EC7 },
649 .{ 0x1EC9, 0x1EC9 },
650 .{ 0x1ECB, 0x1ECB },
651 .{ 0x1ECD, 0x1ECD },
652 .{ 0x1ECF, 0x1ECF },
653 .{ 0x1ED1, 0x1ED1 },
654 .{ 0x1ED3, 0x1ED3 },
655 .{ 0x1ED5, 0x1ED5 },
656 .{ 0x1ED7, 0x1ED7 },
657 .{ 0x1ED9, 0x1ED9 },
658 .{ 0x1EDB, 0x1EDB },
659 .{ 0x1EDD, 0x1EDD },
660 .{ 0x1EDF, 0x1EDF },
661 .{ 0x1EE1, 0x1EE1 },
662 .{ 0x1EE3, 0x1EE3 },
663 .{ 0x1EE5, 0x1EE5 },
664 .{ 0x1EE7, 0x1EE7 },
665 .{ 0x1EE9, 0x1EE9 },
666 .{ 0x1EEB, 0x1EEB },
667 .{ 0x1EED, 0x1EED },
668 .{ 0x1EEF, 0x1EEF },
669 .{ 0x1EF1, 0x1EF1 },
670 .{ 0x1EF3, 0x1EF3 },
671 .{ 0x1EF5, 0x1EF5 },
672 .{ 0x1EF7, 0x1EF7 },
673 .{ 0x1EF9, 0x1EF9 },
674 .{ 0x1EFB, 0x1EFB },
675 .{ 0x1EFD, 0x1EFD },
676 .{ 0x1EFF, 0x1EFF },
677 .{ 0x2018, 0x201A },
678 .{ 0x201C, 0x201E },
679 .{ 0x2026, 0x2026 },
680 .{ 0x2329, 0x232A },
681 .{ 0x27E6, 0x27E7 },
682 .{ 0x2C61, 0x2C61 },
683 .{ 0x2C65, 0x2C66 },
684 .{ 0x2C68, 0x2C68 },
685 .{ 0x2C6A, 0x2C6A },
686 .{ 0x2C6C, 0x2C6C },
687 .{ 0x2C71, 0x2C71 },
688 .{ 0x2C73, 0x2C74 },
689 .{ 0x2C76, 0x2C7B },
690 .{ 0x2E80, 0x2FDF },
691 .{ 0x2FF0, 0x30FF },
692 .{ 0x31C0, 0x31EF },
693 .{ 0x3200, 0x4DBF },
694 .{ 0x4E00, 0x9FFF },
695 .{ 0xA723, 0xA723 },
696 .{ 0xA725, 0xA725 },
697 .{ 0xA727, 0xA727 },
698 .{ 0xA729, 0xA729 },
699 .{ 0xA72B, 0xA72B },
700 .{ 0xA72D, 0xA72D },
701 .{ 0xA72F, 0xA731 },
702 .{ 0xA733, 0xA733 },
703 .{ 0xA735, 0xA735 },
704 .{ 0xA737, 0xA737 },
705 .{ 0xA739, 0xA739 },
706 .{ 0xA73B, 0xA73B },
707 .{ 0xA73D, 0xA73D },
708 .{ 0xA73F, 0xA73F },
709 .{ 0xA741, 0xA741 },
710 .{ 0xA743, 0xA743 },
711 .{ 0xA745, 0xA745 },
712 .{ 0xA747, 0xA747 },
713 .{ 0xA749, 0xA749 },
714 .{ 0xA74B, 0xA74B },
715 .{ 0xA74D, 0xA74D },
716 .{ 0xA74F, 0xA74F },
717 .{ 0xA751, 0xA751 },
718 .{ 0xA753, 0xA753 },
719 .{ 0xA755, 0xA755 },
720 .{ 0xA757, 0xA757 },
721 .{ 0xA759, 0xA759 },
722 .{ 0xA75B, 0xA75B },
723 .{ 0xA75D, 0xA75D },
724 .{ 0xA75F, 0xA75F },
725 .{ 0xA761, 0xA761 },
726 .{ 0xA763, 0xA763 },
727 .{ 0xA765, 0xA765 },
728 .{ 0xA767, 0xA767 },
729 .{ 0xA769, 0xA769 },
730 .{ 0xA76B, 0xA76B },
731 .{ 0xA76D, 0xA76D },
732 .{ 0xA76F, 0xA76F },
733 .{ 0xA771, 0xA778 },
734 .{ 0xA77A, 0xA77A },
735 .{ 0xA77C, 0xA77C },
736 .{ 0xA77F, 0xA77F },
737 .{ 0xA781, 0xA781 },
738 .{ 0xA783, 0xA783 },
739 .{ 0xA785, 0xA785 },
740 .{ 0xA787, 0xA787 },
741 .{ 0xA78C, 0xA78C },
742 .{ 0xA78E, 0xA78E },
743 .{ 0xA791, 0xA791 },
744 .{ 0xA793, 0xA795 },
745 .{ 0xA797, 0xA797 },
746 .{ 0xA799, 0xA799 },
747 .{ 0xA79B, 0xA79B },
748 .{ 0xA79D, 0xA79D },
749 .{ 0xA79F, 0xA79F },
750 .{ 0xA7A1, 0xA7A1 },
751 .{ 0xA7A3, 0xA7A3 },
752 .{ 0xA7A5, 0xA7A5 },
753 .{ 0xA7A7, 0xA7A7 },
754 .{ 0xA7A9, 0xA7A9 },
755 .{ 0xA7AF, 0xA7AF },
756 .{ 0xA7B5, 0xA7B5 },
757 .{ 0xA7B7, 0xA7B7 },
758 .{ 0xA7B9, 0xA7B9 },
759 .{ 0xA7FA, 0xA7FA },
760 .{ 0xAB30, 0xAB5A },
761 .{ 0xAB60, 0xAB64 },
762 .{ 0xAC00, 0xD7AF },
763 .{ 0xF900, 0xFAFF },
764 .{ 0xFB1D, 0xFBB1 },
765 .{ 0xFBD3, 0xFD3D },
766 .{ 0xFD50, 0xFDC7 },
767 .{ 0xFDF0, 0xFDFB },
768 .{ 0xFE30, 0xFE4F },
769 .{ 0xFE70, 0xFEFC },
770 .{ 0xFF01, 0xFF01 },
771 .{ 0xFF08, 0xFF09 },
772 .{ 0xFF0C, 0xFF0C },
773 .{ 0xFF1A, 0xFF1B },
774 .{ 0xFF1F, 0xFF1F },
775 .{ 0xFF41, 0xFF5A },
776 .{ 0xFF5E, 0xFF5E },
777 .{ 0x1EE00, 0x1EEBB },
778 .{ 0x1F200, 0x1F2FF },
779 .{ 0x20000, 0x2A6DF },
780 .{ 0x2A700, 0x2EBEF },
781 .{ 0x2F800, 0x2FA1F },
782};
783
784pub fn matchLookbehind2(c: u21) bool {
785 return rangeContains(&lookbehind_class_2_ranges, c);
786}
787
788const lookbehind_class_3_ranges = [_][2]u21{
789 .{ 0x0041, 0x005A },
790 .{ 0x00C0, 0x00D6 },
791 .{ 0x00D8, 0x00DE },
792 .{ 0x0100, 0x0100 },
793 .{ 0x0102, 0x0102 },
794 .{ 0x0104, 0x0104 },
795 .{ 0x0106, 0x0106 },
796 .{ 0x0108, 0x0108 },
797 .{ 0x010A, 0x010A },
798 .{ 0x010C, 0x010C },
799 .{ 0x010E, 0x010E },
800 .{ 0x0110, 0x0110 },
801 .{ 0x0112, 0x0112 },
802 .{ 0x0114, 0x0114 },
803 .{ 0x0116, 0x0116 },
804 .{ 0x0118, 0x0118 },
805 .{ 0x011A, 0x011A },
806 .{ 0x011C, 0x011C },
807 .{ 0x011E, 0x011E },
808 .{ 0x0120, 0x0120 },
809 .{ 0x0122, 0x0122 },
810 .{ 0x0124, 0x0124 },
811 .{ 0x0126, 0x0126 },
812 .{ 0x0128, 0x0128 },
813 .{ 0x012A, 0x012A },
814 .{ 0x012C, 0x012C },
815 .{ 0x012E, 0x012E },
816 .{ 0x0130, 0x0130 },
817 .{ 0x0132, 0x0132 },
818 .{ 0x0134, 0x0134 },
819 .{ 0x0136, 0x0136 },
820 .{ 0x0139, 0x0139 },
821 .{ 0x013B, 0x013B },
822 .{ 0x013D, 0x013D },
823 .{ 0x013F, 0x013F },
824 .{ 0x0141, 0x0141 },
825 .{ 0x0143, 0x0143 },
826 .{ 0x0145, 0x0145 },
827 .{ 0x0147, 0x0147 },
828 .{ 0x014A, 0x014A },
829 .{ 0x014C, 0x014C },
830 .{ 0x014E, 0x014E },
831 .{ 0x0150, 0x0150 },
832 .{ 0x0152, 0x0152 },
833 .{ 0x0154, 0x0154 },
834 .{ 0x0156, 0x0156 },
835 .{ 0x0158, 0x0158 },
836 .{ 0x015A, 0x015A },
837 .{ 0x015C, 0x015C },
838 .{ 0x015E, 0x015E },
839 .{ 0x0160, 0x0160 },
840 .{ 0x0162, 0x0162 },
841 .{ 0x0164, 0x0164 },
842 .{ 0x0166, 0x0166 },
843 .{ 0x0168, 0x0168 },
844 .{ 0x016A, 0x016A },
845 .{ 0x016C, 0x016C },
846 .{ 0x016E, 0x016E },
847 .{ 0x0170, 0x0170 },
848 .{ 0x0172, 0x0172 },
849 .{ 0x0174, 0x0174 },
850 .{ 0x0176, 0x0176 },
851 .{ 0x0178, 0x0179 },
852 .{ 0x017B, 0x017B },
853 .{ 0x017D, 0x017D },
854 .{ 0x0181, 0x0182 },
855 .{ 0x0184, 0x0184 },
856 .{ 0x0186, 0x0187 },
857 .{ 0x0189, 0x018B },
858 .{ 0x018E, 0x0191 },
859 .{ 0x0193, 0x0194 },
860 .{ 0x0196, 0x0198 },
861 .{ 0x019C, 0x019D },
862 .{ 0x019F, 0x01A0 },
863 .{ 0x01A2, 0x01A2 },
864 .{ 0x01A4, 0x01A4 },
865 .{ 0x01A6, 0x01A7 },
866 .{ 0x01A9, 0x01A9 },
867 .{ 0x01AC, 0x01AC },
868 .{ 0x01AE, 0x01AF },
869 .{ 0x01B1, 0x01B3 },
870 .{ 0x01B5, 0x01B5 },
871 .{ 0x01B7, 0x01B8 },
872 .{ 0x01BC, 0x01BC },
873 .{ 0x01C4, 0x01C4 },
874 .{ 0x01C7, 0x01C7 },
875 .{ 0x01CA, 0x01CA },
876 .{ 0x01CD, 0x01CD },
877 .{ 0x01CF, 0x01CF },
878 .{ 0x01D1, 0x01D1 },
879 .{ 0x01D3, 0x01D3 },
880 .{ 0x01D5, 0x01D5 },
881 .{ 0x01D7, 0x01D7 },
882 .{ 0x01D9, 0x01D9 },
883 .{ 0x01DB, 0x01DB },
884 .{ 0x01DE, 0x01DE },
885 .{ 0x01E0, 0x01E0 },
886 .{ 0x01E2, 0x01E2 },
887 .{ 0x01E4, 0x01E4 },
888 .{ 0x01E6, 0x01E6 },
889 .{ 0x01E8, 0x01E8 },
890 .{ 0x01EA, 0x01EA },
891 .{ 0x01EC, 0x01EC },
892 .{ 0x01EE, 0x01EE },
893 .{ 0x01F1, 0x01F1 },
894 .{ 0x01F4, 0x01F4 },
895 .{ 0x01F6, 0x01F8 },
896 .{ 0x01FA, 0x01FA },
897 .{ 0x01FC, 0x01FC },
898 .{ 0x01FE, 0x01FE },
899 .{ 0x0200, 0x0200 },
900 .{ 0x0202, 0x0202 },
901 .{ 0x0204, 0x0204 },
902 .{ 0x0206, 0x0206 },
903 .{ 0x0208, 0x0208 },
904 .{ 0x020A, 0x020A },
905 .{ 0x020C, 0x020C },
906 .{ 0x020E, 0x020E },
907 .{ 0x0210, 0x0210 },
908 .{ 0x0212, 0x0212 },
909 .{ 0x0214, 0x0214 },
910 .{ 0x0216, 0x0216 },
911 .{ 0x0218, 0x0218 },
912 .{ 0x021A, 0x021A },
913 .{ 0x021C, 0x021C },
914 .{ 0x021E, 0x021E },
915 .{ 0x0220, 0x0220 },
916 .{ 0x0222, 0x0222 },
917 .{ 0x0224, 0x0224 },
918 .{ 0x0226, 0x0226 },
919 .{ 0x0228, 0x0228 },
920 .{ 0x022A, 0x022A },
921 .{ 0x022C, 0x022C },
922 .{ 0x022E, 0x022E },
923 .{ 0x0230, 0x0230 },
924 .{ 0x0232, 0x0232 },
925 .{ 0x023A, 0x023B },
926 .{ 0x023D, 0x023E },
927 .{ 0x0241, 0x0241 },
928 .{ 0x0243, 0x0246 },
929 .{ 0x0248, 0x0248 },
930 .{ 0x024A, 0x024A },
931 .{ 0x024C, 0x024C },
932 .{ 0x024E, 0x024E },
933 .{ 0x0386, 0x0386 },
934 .{ 0x0388, 0x038A },
935 .{ 0x038C, 0x038C },
936 .{ 0x038E, 0x038F },
937 .{ 0x0391, 0x03A9 },
938 .{ 0x0400, 0x0401 },
939 .{ 0x0403, 0x040A },
940 .{ 0x040C, 0x040D },
941 .{ 0x0410, 0x042F },
942 .{ 0x0490, 0x0490 },
943 .{ 0x0496, 0x0496 },
944 .{ 0x04A2, 0x04A2 },
945 .{ 0x04AE, 0x04AE },
946 .{ 0x04BA, 0x04BA },
947 .{ 0x04D8, 0x04D8 },
948 .{ 0x04E8, 0x04E8 },
949 .{ 0x0591, 0x05F4 },
950 .{ 0x0620, 0x064A },
951 .{ 0x066E, 0x06D5 },
952 .{ 0x06E5, 0x06FF },
953 .{ 0x0750, 0x077F },
954 .{ 0x08A0, 0x08BD },
955 .{ 0x0900, 0x09FF },
956 .{ 0x0B80, 0x0CFF },
957 .{ 0x0D80, 0x0DFF },
958 .{ 0x1100, 0x137F },
959 .{ 0x1E00, 0x1E00 },
960 .{ 0x1E02, 0x1E02 },
961 .{ 0x1E04, 0x1E04 },
962 .{ 0x1E06, 0x1E06 },
963 .{ 0x1E08, 0x1E08 },
964 .{ 0x1E0A, 0x1E0A },
965 .{ 0x1E0C, 0x1E0C },
966 .{ 0x1E0E, 0x1E0E },
967 .{ 0x1E10, 0x1E10 },
968 .{ 0x1E12, 0x1E12 },
969 .{ 0x1E14, 0x1E14 },
970 .{ 0x1E16, 0x1E16 },
971 .{ 0x1E18, 0x1E18 },
972 .{ 0x1E1A, 0x1E1A },
973 .{ 0x1E1C, 0x1E1C },
974 .{ 0x1E1E, 0x1E1E },
975 .{ 0x1E20, 0x1E20 },
976 .{ 0x1E22, 0x1E22 },
977 .{ 0x1E24, 0x1E24 },
978 .{ 0x1E26, 0x1E26 },
979 .{ 0x1E28, 0x1E28 },
980 .{ 0x1E2A, 0x1E2A },
981 .{ 0x1E2C, 0x1E2C },
982 .{ 0x1E2E, 0x1E2E },
983 .{ 0x1E30, 0x1E30 },
984 .{ 0x1E32, 0x1E32 },
985 .{ 0x1E34, 0x1E34 },
986 .{ 0x1E36, 0x1E36 },
987 .{ 0x1E38, 0x1E38 },
988 .{ 0x1E3A, 0x1E3A },
989 .{ 0x1E3C, 0x1E3C },
990 .{ 0x1E3E, 0x1E3E },
991 .{ 0x1E40, 0x1E40 },
992 .{ 0x1E42, 0x1E42 },
993 .{ 0x1E44, 0x1E44 },
994 .{ 0x1E46, 0x1E46 },
995 .{ 0x1E48, 0x1E48 },
996 .{ 0x1E4A, 0x1E4A },
997 .{ 0x1E4C, 0x1E4C },
998 .{ 0x1E4E, 0x1E4E },
999 .{ 0x1E50, 0x1E50 },
1000 .{ 0x1E52, 0x1E52 },
1001 .{ 0x1E54, 0x1E54 },
1002 .{ 0x1E56, 0x1E56 },
1003 .{ 0x1E58, 0x1E58 },
1004 .{ 0x1E5A, 0x1E5A },
1005 .{ 0x1E5C, 0x1E5C },
1006 .{ 0x1E5E, 0x1E5E },
1007 .{ 0x1E60, 0x1E60 },
1008 .{ 0x1E62, 0x1E62 },
1009 .{ 0x1E64, 0x1E64 },
1010 .{ 0x1E66, 0x1E66 },
1011 .{ 0x1E68, 0x1E68 },
1012 .{ 0x1E6A, 0x1E6A },
1013 .{ 0x1E6C, 0x1E6C },
1014 .{ 0x1E6E, 0x1E6E },
1015 .{ 0x1E70, 0x1E70 },
1016 .{ 0x1E72, 0x1E72 },
1017 .{ 0x1E74, 0x1E74 },
1018 .{ 0x1E76, 0x1E76 },
1019 .{ 0x1E78, 0x1E78 },
1020 .{ 0x1E7A, 0x1E7A },
1021 .{ 0x1E7C, 0x1E7C },
1022 .{ 0x1E7E, 0x1E7E },
1023 .{ 0x1E80, 0x1E80 },
1024 .{ 0x1E82, 0x1E82 },
1025 .{ 0x1E84, 0x1E84 },
1026 .{ 0x1E86, 0x1E86 },
1027 .{ 0x1E88, 0x1E88 },
1028 .{ 0x1E8A, 0x1E8A },
1029 .{ 0x1E8C, 0x1E8C },
1030 .{ 0x1E8E, 0x1E8E },
1031 .{ 0x1E90, 0x1E90 },
1032 .{ 0x1E92, 0x1E92 },
1033 .{ 0x1E94, 0x1E94 },
1034 .{ 0x1E9E, 0x1E9E },
1035 .{ 0x1EA0, 0x1EA0 },
1036 .{ 0x1EA2, 0x1EA2 },
1037 .{ 0x1EA4, 0x1EA4 },
1038 .{ 0x1EA6, 0x1EA6 },
1039 .{ 0x1EA8, 0x1EA8 },
1040 .{ 0x1EAA, 0x1EAA },
1041 .{ 0x1EAC, 0x1EAC },
1042 .{ 0x1EAE, 0x1EAE },
1043 .{ 0x1EB0, 0x1EB0 },
1044 .{ 0x1EB2, 0x1EB2 },
1045 .{ 0x1EB4, 0x1EB4 },
1046 .{ 0x1EB6, 0x1EB6 },
1047 .{ 0x1EB8, 0x1EB8 },
1048 .{ 0x1EBA, 0x1EBA },
1049 .{ 0x1EBC, 0x1EBC },
1050 .{ 0x1EBE, 0x1EBE },
1051 .{ 0x1EC0, 0x1EC0 },
1052 .{ 0x1EC2, 0x1EC2 },
1053 .{ 0x1EC4, 0x1EC4 },
1054 .{ 0x1EC6, 0x1EC6 },
1055 .{ 0x1EC8, 0x1EC8 },
1056 .{ 0x1ECA, 0x1ECA },
1057 .{ 0x1ECC, 0x1ECC },
1058 .{ 0x1ECE, 0x1ECE },
1059 .{ 0x1ED0, 0x1ED0 },
1060 .{ 0x1ED2, 0x1ED2 },
1061 .{ 0x1ED4, 0x1ED4 },
1062 .{ 0x1ED6, 0x1ED6 },
1063 .{ 0x1ED8, 0x1ED8 },
1064 .{ 0x1EDA, 0x1EDA },
1065 .{ 0x1EDC, 0x1EDC },
1066 .{ 0x1EDE, 0x1EDE },
1067 .{ 0x1EE0, 0x1EE0 },
1068 .{ 0x1EE2, 0x1EE2 },
1069 .{ 0x1EE4, 0x1EE4 },
1070 .{ 0x1EE6, 0x1EE6 },
1071 .{ 0x1EE8, 0x1EE8 },
1072 .{ 0x1EEA, 0x1EEA },
1073 .{ 0x1EEC, 0x1EEC },
1074 .{ 0x1EEE, 0x1EEE },
1075 .{ 0x1EF0, 0x1EF0 },
1076 .{ 0x1EF2, 0x1EF2 },
1077 .{ 0x1EF4, 0x1EF4 },
1078 .{ 0x1EF6, 0x1EF6 },
1079 .{ 0x1EF8, 0x1EF8 },
1080 .{ 0x1EFA, 0x1EFA },
1081 .{ 0x1EFC, 0x1EFC },
1082 .{ 0x1EFE, 0x1EFE },
1083 .{ 0x2C60, 0x2C60 },
1084 .{ 0x2C62, 0x2C64 },
1085 .{ 0x2C67, 0x2C67 },
1086 .{ 0x2C69, 0x2C69 },
1087 .{ 0x2C6B, 0x2C6B },
1088 .{ 0x2C6D, 0x2C70 },
1089 .{ 0x2C72, 0x2C72 },
1090 .{ 0x2C75, 0x2C75 },
1091 .{ 0x2C7E, 0x2C7F },
1092 .{ 0x2E80, 0x2FDF },
1093 .{ 0x2FF0, 0x30FF },
1094 .{ 0x31C0, 0x31EF },
1095 .{ 0x3200, 0x4DBF },
1096 .{ 0x4E00, 0x9FFF },
1097 .{ 0xA722, 0xA722 },
1098 .{ 0xA724, 0xA724 },
1099 .{ 0xA726, 0xA726 },
1100 .{ 0xA728, 0xA728 },
1101 .{ 0xA72A, 0xA72A },
1102 .{ 0xA72C, 0xA72C },
1103 .{ 0xA72E, 0xA72E },
1104 .{ 0xA732, 0xA732 },
1105 .{ 0xA734, 0xA734 },
1106 .{ 0xA736, 0xA736 },
1107 .{ 0xA738, 0xA738 },
1108 .{ 0xA73A, 0xA73A },
1109 .{ 0xA73C, 0xA73C },
1110 .{ 0xA73E, 0xA73E },
1111 .{ 0xA740, 0xA740 },
1112 .{ 0xA742, 0xA742 },
1113 .{ 0xA744, 0xA744 },
1114 .{ 0xA746, 0xA746 },
1115 .{ 0xA748, 0xA748 },
1116 .{ 0xA74A, 0xA74A },
1117 .{ 0xA74C, 0xA74C },
1118 .{ 0xA74E, 0xA74E },
1119 .{ 0xA750, 0xA750 },
1120 .{ 0xA752, 0xA752 },
1121 .{ 0xA754, 0xA754 },
1122 .{ 0xA756, 0xA756 },
1123 .{ 0xA758, 0xA758 },
1124 .{ 0xA75A, 0xA75A },
1125 .{ 0xA75C, 0xA75C },
1126 .{ 0xA75E, 0xA75E },
1127 .{ 0xA760, 0xA760 },
1128 .{ 0xA762, 0xA762 },
1129 .{ 0xA764, 0xA764 },
1130 .{ 0xA766, 0xA766 },
1131 .{ 0xA768, 0xA768 },
1132 .{ 0xA76A, 0xA76A },
1133 .{ 0xA76C, 0xA76C },
1134 .{ 0xA76E, 0xA76E },
1135 .{ 0xA779, 0xA779 },
1136 .{ 0xA77B, 0xA77B },
1137 .{ 0xA77D, 0xA77E },
1138 .{ 0xA780, 0xA780 },
1139 .{ 0xA782, 0xA782 },
1140 .{ 0xA784, 0xA784 },
1141 .{ 0xA786, 0xA786 },
1142 .{ 0xA78B, 0xA78B },
1143 .{ 0xA78D, 0xA78D },
1144 .{ 0xA790, 0xA790 },
1145 .{ 0xA792, 0xA792 },
1146 .{ 0xA796, 0xA796 },
1147 .{ 0xA798, 0xA798 },
1148 .{ 0xA79A, 0xA79A },
1149 .{ 0xA79C, 0xA79C },
1150 .{ 0xA79E, 0xA79E },
1151 .{ 0xA7A0, 0xA7A0 },
1152 .{ 0xA7A2, 0xA7A2 },
1153 .{ 0xA7A4, 0xA7A4 },
1154 .{ 0xA7A6, 0xA7A6 },
1155 .{ 0xA7A8, 0xA7A8 },
1156 .{ 0xA7AA, 0xA7AE },
1157 .{ 0xA7B0, 0xA7B4 },
1158 .{ 0xA7B6, 0xA7B6 },
1159 .{ 0xA7B8, 0xA7B8 },
1160 .{ 0xAC00, 0xD7AF },
1161 .{ 0xF900, 0xFAFF },
1162 .{ 0xFB1D, 0xFBB1 },
1163 .{ 0xFBD3, 0xFD3D },
1164 .{ 0xFD50, 0xFDC7 },
1165 .{ 0xFDF0, 0xFDFB },
1166 .{ 0xFE30, 0xFE4F },
1167 .{ 0xFE70, 0xFEFC },
1168 .{ 0xFF21, 0xFF3A },
1169 .{ 0x1EE00, 0x1EEBB },
1170 .{ 0x1F200, 0x1F2FF },
1171 .{ 0x20000, 0x2A6DF },
1172 .{ 0x2A700, 0x2EBEF },
1173 .{ 0x2F800, 0x2FA1F },
1174};
1175
1176pub fn matchLookbehind3(c: u21) bool {
1177 return rangeContains(&lookbehind_class_3_ranges, c);
1178}
1179
1180// ── suffix lookbehind rules ──
1181// these are checked by tokenizer.zig matchSuffix()
1182// format: for each rule, check behind condition then try suffix literal(s)
1183
1184pub fn matchSuffixLookbehind(text: []const u8) usize {
1185 if (text.len < 2) return 0;
1186
1187 if (std.mem.endsWith(u8, text, "+") and text.len > 1) {
1188 const before = lastCodepoint(text[0 .. text.len - 1]);
1189 if (before != null and matchLookbehind0(before.?.value)) return 1;
1190 }
1191 if (std.mem.endsWith(u8, text, ".") and text.len > 1) {
1192 const b1 = lastCodepoint(text[0 .. text.len - 1]);
1193 if (b1) |bp1| {
1194 const b2 = lastCodepoint(text[0 .. text.len - 1 - bp1.len]);
1195 if (matchLookbehind1(bp1.value)) {
1196 if (b2) |b2p| {
1197 if (b2p.value == 0x00B0) return 1;
1198 }
1199 }
1200 }
1201 }
1202 if (std.mem.endsWith(u8, text, "\xe2\x82\xac") and text.len > 3) {
1203 const before = lastCodepoint(text[0 .. text.len - 3]);
1204 if (before != null and matchLookbehind0(before.?.value)) return 3;
1205 }
1206 if (std.mem.endsWith(u8, text, "\xe0\xb8\xbf") and text.len > 3) {
1207 const before = lastCodepoint(text[0 .. text.len - 3]);
1208 if (before != null and matchLookbehind0(before.?.value)) return 3;
1209 }
1210 if (std.mem.endsWith(u8, text, "US$") and text.len > 3) {
1211 const before = lastCodepoint(text[0 .. text.len - 3]);
1212 if (before != null and matchLookbehind0(before.?.value)) return 3;
1213 }
1214 if (std.mem.endsWith(u8, text, "\xe2\x82\xbd") and text.len > 3) {
1215 const before = lastCodepoint(text[0 .. text.len - 3]);
1216 if (before != null and matchLookbehind0(before.?.value)) return 3;
1217 }
1218 if (std.mem.endsWith(u8, text, "\xef\xb7\xbc") and text.len > 3) {
1219 const before = lastCodepoint(text[0 .. text.len - 3]);
1220 if (before != null and matchLookbehind0(before.?.value)) return 3;
1221 }
1222 if (std.mem.endsWith(u8, text, "\xe2\x82\xb4") and text.len > 3) {
1223 const before = lastCodepoint(text[0 .. text.len - 3]);
1224 if (before != null and matchLookbehind0(before.?.value)) return 3;
1225 }
1226 if (std.mem.endsWith(u8, text, "\xe2\x82\xa0") and text.len > 3) {
1227 const before = lastCodepoint(text[0 .. text.len - 3]);
1228 if (before != null and matchLookbehind0(before.?.value)) return 3;
1229 }
1230 if (std.mem.endsWith(u8, text, "\xe2\x82\xa1") and text.len > 3) {
1231 const before = lastCodepoint(text[0 .. text.len - 3]);
1232 if (before != null and matchLookbehind0(before.?.value)) return 3;
1233 }
1234 if (std.mem.endsWith(u8, text, "\xe2\x82\xa2") and text.len > 3) {
1235 const before = lastCodepoint(text[0 .. text.len - 3]);
1236 if (before != null and matchLookbehind0(before.?.value)) return 3;
1237 }
1238 if (std.mem.endsWith(u8, text, "\xe2\x82\xa3") and text.len > 3) {
1239 const before = lastCodepoint(text[0 .. text.len - 3]);
1240 if (before != null and matchLookbehind0(before.?.value)) return 3;
1241 }
1242 if (std.mem.endsWith(u8, text, "\xe2\x82\xa4") and text.len > 3) {
1243 const before = lastCodepoint(text[0 .. text.len - 3]);
1244 if (before != null and matchLookbehind0(before.?.value)) return 3;
1245 }
1246 if (std.mem.endsWith(u8, text, "\xe2\x82\xa5") and text.len > 3) {
1247 const before = lastCodepoint(text[0 .. text.len - 3]);
1248 if (before != null and matchLookbehind0(before.?.value)) return 3;
1249 }
1250 if (std.mem.endsWith(u8, text, "\xe2\x82\xa6") and text.len > 3) {
1251 const before = lastCodepoint(text[0 .. text.len - 3]);
1252 if (before != null and matchLookbehind0(before.?.value)) return 3;
1253 }
1254 if (std.mem.endsWith(u8, text, "\xe2\x82\xa7") and text.len > 3) {
1255 const before = lastCodepoint(text[0 .. text.len - 3]);
1256 if (before != null and matchLookbehind0(before.?.value)) return 3;
1257 }
1258 if (std.mem.endsWith(u8, text, "\xe2\x82\xa8") and text.len > 3) {
1259 const before = lastCodepoint(text[0 .. text.len - 3]);
1260 if (before != null and matchLookbehind0(before.?.value)) return 3;
1261 }
1262 if (std.mem.endsWith(u8, text, "\xe2\x82\xa9") and text.len > 3) {
1263 const before = lastCodepoint(text[0 .. text.len - 3]);
1264 if (before != null and matchLookbehind0(before.?.value)) return 3;
1265 }
1266 if (std.mem.endsWith(u8, text, "\xe2\x82\xaa") and text.len > 3) {
1267 const before = lastCodepoint(text[0 .. text.len - 3]);
1268 if (before != null and matchLookbehind0(before.?.value)) return 3;
1269 }
1270 if (std.mem.endsWith(u8, text, "\xe2\x82\xab") and text.len > 3) {
1271 const before = lastCodepoint(text[0 .. text.len - 3]);
1272 if (before != null and matchLookbehind0(before.?.value)) return 3;
1273 }
1274 if (std.mem.endsWith(u8, text, "\xe2\x82\xac") and text.len > 3) {
1275 const before = lastCodepoint(text[0 .. text.len - 3]);
1276 if (before != null and matchLookbehind0(before.?.value)) return 3;
1277 }
1278 if (std.mem.endsWith(u8, text, "\xe2\x82\xad") and text.len > 3) {
1279 const before = lastCodepoint(text[0 .. text.len - 3]);
1280 if (before != null and matchLookbehind0(before.?.value)) return 3;
1281 }
1282 if (std.mem.endsWith(u8, text, "\xe2\x82\xae") and text.len > 3) {
1283 const before = lastCodepoint(text[0 .. text.len - 3]);
1284 if (before != null and matchLookbehind0(before.?.value)) return 3;
1285 }
1286 if (std.mem.endsWith(u8, text, "\xe2\x82\xaf") and text.len > 3) {
1287 const before = lastCodepoint(text[0 .. text.len - 3]);
1288 if (before != null and matchLookbehind0(before.?.value)) return 3;
1289 }
1290 if (std.mem.endsWith(u8, text, "\xe2\x82\xb0") and text.len > 3) {
1291 const before = lastCodepoint(text[0 .. text.len - 3]);
1292 if (before != null and matchLookbehind0(before.?.value)) return 3;
1293 }
1294 if (std.mem.endsWith(u8, text, "\xe2\x82\xb1") and text.len > 3) {
1295 const before = lastCodepoint(text[0 .. text.len - 3]);
1296 if (before != null and matchLookbehind0(before.?.value)) return 3;
1297 }
1298 if (std.mem.endsWith(u8, text, "\xe2\x82\xb2") and text.len > 3) {
1299 const before = lastCodepoint(text[0 .. text.len - 3]);
1300 if (before != null and matchLookbehind0(before.?.value)) return 3;
1301 }
1302 if (std.mem.endsWith(u8, text, "\xe2\x82\xb3") and text.len > 3) {
1303 const before = lastCodepoint(text[0 .. text.len - 3]);
1304 if (before != null and matchLookbehind0(before.?.value)) return 3;
1305 }
1306 if (std.mem.endsWith(u8, text, "\xe2\x82\xb4") and text.len > 3) {
1307 const before = lastCodepoint(text[0 .. text.len - 3]);
1308 if (before != null and matchLookbehind0(before.?.value)) return 3;
1309 }
1310 if (std.mem.endsWith(u8, text, "\xe2\x82\xb5") and text.len > 3) {
1311 const before = lastCodepoint(text[0 .. text.len - 3]);
1312 if (before != null and matchLookbehind0(before.?.value)) return 3;
1313 }
1314 if (std.mem.endsWith(u8, text, "\xe2\x82\xb6") and text.len > 3) {
1315 const before = lastCodepoint(text[0 .. text.len - 3]);
1316 if (before != null and matchLookbehind0(before.?.value)) return 3;
1317 }
1318 if (std.mem.endsWith(u8, text, "\xe2\x82\xb7") and text.len > 3) {
1319 const before = lastCodepoint(text[0 .. text.len - 3]);
1320 if (before != null and matchLookbehind0(before.?.value)) return 3;
1321 }
1322 if (std.mem.endsWith(u8, text, "\xe2\x82\xb8") and text.len > 3) {
1323 const before = lastCodepoint(text[0 .. text.len - 3]);
1324 if (before != null and matchLookbehind0(before.?.value)) return 3;
1325 }
1326 if (std.mem.endsWith(u8, text, "\xe2\x82\xb9") and text.len > 3) {
1327 const before = lastCodepoint(text[0 .. text.len - 3]);
1328 if (before != null and matchLookbehind0(before.?.value)) return 3;
1329 }
1330 if (std.mem.endsWith(u8, text, "\xe2\x82\xba") and text.len > 3) {
1331 const before = lastCodepoint(text[0 .. text.len - 3]);
1332 if (before != null and matchLookbehind0(before.?.value)) return 3;
1333 }
1334 if (std.mem.endsWith(u8, text, "\xe2\x82\xbb") and text.len > 3) {
1335 const before = lastCodepoint(text[0 .. text.len - 3]);
1336 if (before != null and matchLookbehind0(before.?.value)) return 3;
1337 }
1338 if (std.mem.endsWith(u8, text, "\xe2\x82\xbc") and text.len > 3) {
1339 const before = lastCodepoint(text[0 .. text.len - 3]);
1340 if (before != null and matchLookbehind0(before.?.value)) return 3;
1341 }
1342 if (std.mem.endsWith(u8, text, "\xe2\x82\xbd") and text.len > 3) {
1343 const before = lastCodepoint(text[0 .. text.len - 3]);
1344 if (before != null and matchLookbehind0(before.?.value)) return 3;
1345 }
1346 if (std.mem.endsWith(u8, text, "\xe2\x82\xbe") and text.len > 3) {
1347 const before = lastCodepoint(text[0 .. text.len - 3]);
1348 if (before != null and matchLookbehind0(before.?.value)) return 3;
1349 }
1350 if (std.mem.endsWith(u8, text, "\xe2\x82\xbf") and text.len > 3) {
1351 const before = lastCodepoint(text[0 .. text.len - 3]);
1352 if (before != null and matchLookbehind0(before.?.value)) return 3;
1353 }
1354 if (std.mem.endsWith(u8, text, "\xc2\xa3") and text.len > 2) {
1355 const before = lastCodepoint(text[0 .. text.len - 2]);
1356 if (before != null and matchLookbehind0(before.?.value)) return 2;
1357 }
1358 if (std.mem.endsWith(u8, text, "\xc2\xa5") and text.len > 2) {
1359 const before = lastCodepoint(text[0 .. text.len - 2]);
1360 if (before != null and matchLookbehind0(before.?.value)) return 2;
1361 }
1362 if (std.mem.endsWith(u8, text, "C$") and text.len > 2) {
1363 const before = lastCodepoint(text[0 .. text.len - 2]);
1364 if (before != null and matchLookbehind0(before.?.value)) return 2;
1365 }
1366 if (std.mem.endsWith(u8, text, "A$") and text.len > 2) {
1367 const before = lastCodepoint(text[0 .. text.len - 2]);
1368 if (before != null and matchLookbehind0(before.?.value)) return 2;
1369 }
1370 if (std.mem.endsWith(u8, text, "$") and text.len > 1) {
1371 const before = lastCodepoint(text[0 .. text.len - 1]);
1372 if (before != null and matchLookbehind0(before.?.value)) return 1;
1373 }
1374 if (std.mem.endsWith(u8, text, "\xd8\xa7\xd9\x83\xd9\x88\xd8\xa7\xd8\xa8") and text.len > 10) {
1375 const before = lastCodepoint(text[0 .. text.len - 10]);
1376 if (before != null and matchLookbehind0(before.?.value)) return 10;
1377 }
1378 if (std.mem.endsWith(u8, text, "\xd0\xbc\xd0\xb1\xd0\xb0\xd1\x80") and text.len > 8) {
1379 const before = lastCodepoint(text[0 .. text.len - 8]);
1380 if (before != null and matchLookbehind0(before.?.value)) return 8;
1381 }
1382 if (std.mem.endsWith(u8, text, "\xd1\x82\xd0\xb1\xd9\x83\xd9\x85") and text.len > 8) {
1383 const before = lastCodepoint(text[0 .. text.len - 8]);
1384 if (before != null and matchLookbehind0(before.?.value)) return 8;
1385 }
1386 if (std.mem.endsWith(u8, text, "\xd8\xba\xd8\xb1\xd8\xa7\xd9\x85") and text.len > 8) {
1387 const before = lastCodepoint(text[0 .. text.len - 8]);
1388 if (before != null and matchLookbehind0(before.?.value)) return 8;
1389 }
1390 if (std.mem.endsWith(u8, text, "\xd8\xac\xd8\xb1\xd8\xa7\xd9\x85") and text.len > 8) {
1391 const before = lastCodepoint(text[0 .. text.len - 8]);
1392 if (before != null and matchLookbehind0(before.?.value)) return 8;
1393 }
1394 if (std.mem.endsWith(u8, text, "\xd0\xba\xd0\xbc/\xd1\x87") and text.len > 7) {
1395 const before = lastCodepoint(text[0 .. text.len - 7]);
1396 if (before != null and matchLookbehind0(before.?.value)) return 7;
1397 }
1398 if (std.mem.endsWith(u8, text, "\xd0\xba\xd0\xbc\xc2\xb2") and text.len > 6) {
1399 const before = lastCodepoint(text[0 .. text.len - 6]);
1400 if (before != null and matchLookbehind0(before.?.value)) return 6;
1401 }
1402 if (std.mem.endsWith(u8, text, "\xd0\xba\xd0\xbc\xc2\xb3") and text.len > 6) {
1403 const before = lastCodepoint(text[0 .. text.len - 6]);
1404 if (before != null and matchLookbehind0(before.?.value)) return 6;
1405 }
1406 if (std.mem.endsWith(u8, text, "\xd0\xb4\xd0\xbc\xc2\xb2") and text.len > 6) {
1407 const before = lastCodepoint(text[0 .. text.len - 6]);
1408 if (before != null and matchLookbehind0(before.?.value)) return 6;
1409 }
1410 if (std.mem.endsWith(u8, text, "\xd0\xb4\xd0\xbc\xc2\xb3") and text.len > 6) {
1411 const before = lastCodepoint(text[0 .. text.len - 6]);
1412 if (before != null and matchLookbehind0(before.?.value)) return 6;
1413 }
1414 if (std.mem.endsWith(u8, text, "\xd1\x81\xd0\xbc\xc2\xb2") and text.len > 6) {
1415 const before = lastCodepoint(text[0 .. text.len - 6]);
1416 if (before != null and matchLookbehind0(before.?.value)) return 6;
1417 }
1418 if (std.mem.endsWith(u8, text, "\xd1\x81\xd0\xbc\xc2\xb3") and text.len > 6) {
1419 const before = lastCodepoint(text[0 .. text.len - 6]);
1420 if (before != null and matchLookbehind0(before.?.value)) return 6;
1421 }
1422 if (std.mem.endsWith(u8, text, "\xd0\xbc\xd0\xbc\xc2\xb2") and text.len > 6) {
1423 const before = lastCodepoint(text[0 .. text.len - 6]);
1424 if (before != null and matchLookbehind0(before.?.value)) return 6;
1425 }
1426 if (std.mem.endsWith(u8, text, "\xd0\xbc\xd0\xbc\xc2\xb3") and text.len > 6) {
1427 const before = lastCodepoint(text[0 .. text.len - 6]);
1428 if (before != null and matchLookbehind0(before.?.value)) return 6;
1429 }
1430 if (std.mem.endsWith(u8, text, "\xd0\xba\xd0\x9f\xd0\xb0") and text.len > 6) {
1431 const before = lastCodepoint(text[0 .. text.len - 6]);
1432 if (before != null and matchLookbehind0(before.?.value)) return 6;
1433 }
1434 if (std.mem.endsWith(u8, text, "\xd9\x83\xd9\x85\xc2\xb2") and text.len > 6) {
1435 const before = lastCodepoint(text[0 .. text.len - 6]);
1436 if (before != null and matchLookbehind0(before.?.value)) return 6;
1437 }
1438 if (std.mem.endsWith(u8, text, "\xd9\x83\xd9\x85\xc2\xb3") and text.len > 6) {
1439 const before = lastCodepoint(text[0 .. text.len - 6]);
1440 if (before != null and matchLookbehind0(before.?.value)) return 6;
1441 }
1442 if (std.mem.endsWith(u8, text, "\xd8\xb3\xd9\x85\xc2\xb2") and text.len > 6) {
1443 const before = lastCodepoint(text[0 .. text.len - 6]);
1444 if (before != null and matchLookbehind0(before.?.value)) return 6;
1445 }
1446 if (std.mem.endsWith(u8, text, "\xd8\xb3\xd9\x85\xc2\xb3") and text.len > 6) {
1447 const before = lastCodepoint(text[0 .. text.len - 6]);
1448 if (before != null and matchLookbehind0(before.?.value)) return 6;
1449 }
1450 if (std.mem.endsWith(u8, text, "\xd9\x85\xd9\x85\xc2\xb2") and text.len > 6) {
1451 const before = lastCodepoint(text[0 .. text.len - 6]);
1452 if (before != null and matchLookbehind0(before.?.value)) return 6;
1453 }
1454 if (std.mem.endsWith(u8, text, "\xd9\x85\xd9\x85\xc2\xb3") and text.len > 6) {
1455 const before = lastCodepoint(text[0 .. text.len - 6]);
1456 if (before != null and matchLookbehind0(before.?.value)) return 6;
1457 }
1458 if (std.mem.endsWith(u8, text, "\xd9\x85\xd9\x84\xd8\xba") and text.len > 6) {
1459 const before = lastCodepoint(text[0 .. text.len - 6]);
1460 if (before != null and matchLookbehind0(before.?.value)) return 6;
1461 }
1462 if (std.mem.endsWith(u8, text, "\xd9\x83\xd9\x88\xd8\xa8") and text.len > 6) {
1463 const before = lastCodepoint(text[0 .. text.len - 6]);
1464 if (before != null and matchLookbehind0(before.?.value)) return 6;
1465 }
1466 if (std.mem.endsWith(u8, text, "\xd0\xbc/\xd1\x81") and text.len > 5) {
1467 const before = lastCodepoint(text[0 .. text.len - 5]);
1468 if (before != null and matchLookbehind0(before.?.value)) return 5;
1469 }
1470 if (std.mem.endsWith(u8, text, "km\xc2\xb2") and text.len > 4) {
1471 const before = lastCodepoint(text[0 .. text.len - 4]);
1472 if (before != null and matchLookbehind0(before.?.value)) return 4;
1473 }
1474 if (std.mem.endsWith(u8, text, "km\xc2\xb3") and text.len > 4) {
1475 const before = lastCodepoint(text[0 .. text.len - 4]);
1476 if (before != null and matchLookbehind0(before.?.value)) return 4;
1477 }
1478 if (std.mem.endsWith(u8, text, "dm\xc2\xb2") and text.len > 4) {
1479 const before = lastCodepoint(text[0 .. text.len - 4]);
1480 if (before != null and matchLookbehind0(before.?.value)) return 4;
1481 }
1482 if (std.mem.endsWith(u8, text, "dm\xc2\xb3") and text.len > 4) {
1483 const before = lastCodepoint(text[0 .. text.len - 4]);
1484 if (before != null and matchLookbehind0(before.?.value)) return 4;
1485 }
1486 if (std.mem.endsWith(u8, text, "cm\xc2\xb2") and text.len > 4) {
1487 const before = lastCodepoint(text[0 .. text.len - 4]);
1488 if (before != null and matchLookbehind0(before.?.value)) return 4;
1489 }
1490 if (std.mem.endsWith(u8, text, "cm\xc2\xb3") and text.len > 4) {
1491 const before = lastCodepoint(text[0 .. text.len - 4]);
1492 if (before != null and matchLookbehind0(before.?.value)) return 4;
1493 }
1494 if (std.mem.endsWith(u8, text, "mm\xc2\xb2") and text.len > 4) {
1495 const before = lastCodepoint(text[0 .. text.len - 4]);
1496 if (before != null and matchLookbehind0(before.?.value)) return 4;
1497 }
1498 if (std.mem.endsWith(u8, text, "mm\xc2\xb3") and text.len > 4) {
1499 const before = lastCodepoint(text[0 .. text.len - 4]);
1500 if (before != null and matchLookbehind0(before.?.value)) return 4;
1501 }
1502 if (std.mem.endsWith(u8, text, "km/h") and text.len > 4) {
1503 const before = lastCodepoint(text[0 .. text.len - 4]);
1504 if (before != null and matchLookbehind0(before.?.value)) return 4;
1505 }
1506 if (std.mem.endsWith(u8, text, "mbar") and text.len > 4) {
1507 const before = lastCodepoint(text[0 .. text.len - 4]);
1508 if (before != null and matchLookbehind0(before.?.value)) return 4;
1509 }
1510 if (std.mem.endsWith(u8, text, "\xd0\xba\xd0\xbc") and text.len > 4) {
1511 const before = lastCodepoint(text[0 .. text.len - 4]);
1512 if (before != null and matchLookbehind0(before.?.value)) return 4;
1513 }
1514 if (std.mem.endsWith(u8, text, "\xd0\xbc\xc2\xb2") and text.len > 4) {
1515 const before = lastCodepoint(text[0 .. text.len - 4]);
1516 if (before != null and matchLookbehind0(before.?.value)) return 4;
1517 }
1518 if (std.mem.endsWith(u8, text, "\xd0\xbc\xc2\xb3") and text.len > 4) {
1519 const before = lastCodepoint(text[0 .. text.len - 4]);
1520 if (before != null and matchLookbehind0(before.?.value)) return 4;
1521 }
1522 if (std.mem.endsWith(u8, text, "\xd0\xb4\xd0\xbc") and text.len > 4) {
1523 const before = lastCodepoint(text[0 .. text.len - 4]);
1524 if (before != null and matchLookbehind0(before.?.value)) return 4;
1525 }
1526 if (std.mem.endsWith(u8, text, "\xd1\x81\xd0\xbc") and text.len > 4) {
1527 const before = lastCodepoint(text[0 .. text.len - 4]);
1528 if (before != null and matchLookbehind0(before.?.value)) return 4;
1529 }
1530 if (std.mem.endsWith(u8, text, "\xd0\xbc\xd0\xbc") and text.len > 4) {
1531 const before = lastCodepoint(text[0 .. text.len - 4]);
1532 if (before != null and matchLookbehind0(before.?.value)) return 4;
1533 }
1534 if (std.mem.endsWith(u8, text, "\xd0\xbd\xd0\xbc") and text.len > 4) {
1535 const before = lastCodepoint(text[0 .. text.len - 4]);
1536 if (before != null and matchLookbehind0(before.?.value)) return 4;
1537 }
1538 if (std.mem.endsWith(u8, text, "\xd0\xba\xd0\xb3") and text.len > 4) {
1539 const before = lastCodepoint(text[0 .. text.len - 4]);
1540 if (before != null and matchLookbehind0(before.?.value)) return 4;
1541 }
1542 if (std.mem.endsWith(u8, text, "\xd0\xbc\xd0\xb3") and text.len > 4) {
1543 const before = lastCodepoint(text[0 .. text.len - 4]);
1544 if (before != null and matchLookbehind0(before.?.value)) return 4;
1545 }
1546 if (std.mem.endsWith(u8, text, "\xd0\x9f\xd0\xb0") and text.len > 4) {
1547 const before = lastCodepoint(text[0 .. text.len - 4]);
1548 if (before != null and matchLookbehind0(before.?.value)) return 4;
1549 }
1550 if (std.mem.endsWith(u8, text, "\xd0\x9a\xd0\xb1") and text.len > 4) {
1551 const before = lastCodepoint(text[0 .. text.len - 4]);
1552 if (before != null and matchLookbehind0(before.?.value)) return 4;
1553 }
1554 if (std.mem.endsWith(u8, text, "\xd0\x9a\xd0\x91") and text.len > 4) {
1555 const before = lastCodepoint(text[0 .. text.len - 4]);
1556 if (before != null and matchLookbehind0(before.?.value)) return 4;
1557 }
1558 if (std.mem.endsWith(u8, text, "\xd0\xba\xd0\xb1") and text.len > 4) {
1559 const before = lastCodepoint(text[0 .. text.len - 4]);
1560 if (before != null and matchLookbehind0(before.?.value)) return 4;
1561 }
1562 if (std.mem.endsWith(u8, text, "\xd0\x9c\xd0\xb1") and text.len > 4) {
1563 const before = lastCodepoint(text[0 .. text.len - 4]);
1564 if (before != null and matchLookbehind0(before.?.value)) return 4;
1565 }
1566 if (std.mem.endsWith(u8, text, "\xd0\x9c\xd0\x91") and text.len > 4) {
1567 const before = lastCodepoint(text[0 .. text.len - 4]);
1568 if (before != null and matchLookbehind0(before.?.value)) return 4;
1569 }
1570 if (std.mem.endsWith(u8, text, "\xd0\xbc\xd0\xb1") and text.len > 4) {
1571 const before = lastCodepoint(text[0 .. text.len - 4]);
1572 if (before != null and matchLookbehind0(before.?.value)) return 4;
1573 }
1574 if (std.mem.endsWith(u8, text, "\xd0\x93\xd0\xb1") and text.len > 4) {
1575 const before = lastCodepoint(text[0 .. text.len - 4]);
1576 if (before != null and matchLookbehind0(before.?.value)) return 4;
1577 }
1578 if (std.mem.endsWith(u8, text, "\xd0\x93\xd0\x91") and text.len > 4) {
1579 const before = lastCodepoint(text[0 .. text.len - 4]);
1580 if (before != null and matchLookbehind0(before.?.value)) return 4;
1581 }
1582 if (std.mem.endsWith(u8, text, "\xd0\xb3\xd0\xb1") and text.len > 4) {
1583 const before = lastCodepoint(text[0 .. text.len - 4]);
1584 if (before != null and matchLookbehind0(before.?.value)) return 4;
1585 }
1586 if (std.mem.endsWith(u8, text, "\xd0\xa2\xd0\xb1") and text.len > 4) {
1587 const before = lastCodepoint(text[0 .. text.len - 4]);
1588 if (before != null and matchLookbehind0(before.?.value)) return 4;
1589 }
1590 if (std.mem.endsWith(u8, text, "\xd0\xa2\xd0\x91") and text.len > 4) {
1591 const before = lastCodepoint(text[0 .. text.len - 4]);
1592 if (before != null and matchLookbehind0(before.?.value)) return 4;
1593 }
1594 if (std.mem.endsWith(u8, text, "\xd9\x85\xc2\xb2") and text.len > 4) {
1595 const before = lastCodepoint(text[0 .. text.len - 4]);
1596 if (before != null and matchLookbehind0(before.?.value)) return 4;
1597 }
1598 if (std.mem.endsWith(u8, text, "\xd9\x85\xc2\xb3") and text.len > 4) {
1599 const before = lastCodepoint(text[0 .. text.len - 4]);
1600 if (before != null and matchLookbehind0(before.?.value)) return 4;
1601 }
1602 if (std.mem.endsWith(u8, text, "\xd8\xb3\xd9\x85") and text.len > 4) {
1603 const before = lastCodepoint(text[0 .. text.len - 4]);
1604 if (before != null and matchLookbehind0(before.?.value)) return 4;
1605 }
1606 if (std.mem.endsWith(u8, text, "\xd9\x85\xd9\x85") and text.len > 4) {
1607 const before = lastCodepoint(text[0 .. text.len - 4]);
1608 if (before != null and matchLookbehind0(before.?.value)) return 4;
1609 }
1610 if (std.mem.endsWith(u8, text, "\xd9\x83\xd9\x85") and text.len > 4) {
1611 const before = lastCodepoint(text[0 .. text.len - 4]);
1612 if (before != null and matchLookbehind0(before.?.value)) return 4;
1613 }
1614 if (std.mem.endsWith(u8, text, "\xd8\xac\xd9\x85") and text.len > 4) {
1615 const before = lastCodepoint(text[0 .. text.len - 4]);
1616 if (before != null and matchLookbehind0(before.?.value)) return 4;
1617 }
1618 if (std.mem.endsWith(u8, text, "\xd9\x83\xd8\xba") and text.len > 4) {
1619 const before = lastCodepoint(text[0 .. text.len - 4]);
1620 if (before != null and matchLookbehind0(before.?.value)) return 4;
1621 }
1622 if (std.mem.endsWith(u8, text, "m\xc2\xb2") and text.len > 3) {
1623 const before = lastCodepoint(text[0 .. text.len - 3]);
1624 if (before != null and matchLookbehind0(before.?.value)) return 3;
1625 }
1626 if (std.mem.endsWith(u8, text, "m\xc2\xb3") and text.len > 3) {
1627 const before = lastCodepoint(text[0 .. text.len - 3]);
1628 if (before != null and matchLookbehind0(before.?.value)) return 3;
1629 }
1630 if (std.mem.endsWith(u8, text, "\xc2\xb5m") and text.len > 3) {
1631 const before = lastCodepoint(text[0 .. text.len - 3]);
1632 if (before != null and matchLookbehind0(before.?.value)) return 3;
1633 }
1634 if (std.mem.endsWith(u8, text, "\xc2\xb5g") and text.len > 3) {
1635 const before = lastCodepoint(text[0 .. text.len - 3]);
1636 if (before != null and matchLookbehind0(before.?.value)) return 3;
1637 }
1638 if (std.mem.endsWith(u8, text, "m/s") and text.len > 3) {
1639 const before = lastCodepoint(text[0 .. text.len - 3]);
1640 if (before != null and matchLookbehind0(before.?.value)) return 3;
1641 }
1642 if (std.mem.endsWith(u8, text, "kmh") and text.len > 3) {
1643 const before = lastCodepoint(text[0 .. text.len - 3]);
1644 if (before != null and matchLookbehind0(before.?.value)) return 3;
1645 }
1646 if (std.mem.endsWith(u8, text, "mph") and text.len > 3) {
1647 const before = lastCodepoint(text[0 .. text.len - 3]);
1648 if (before != null and matchLookbehind0(before.?.value)) return 3;
1649 }
1650 if (std.mem.endsWith(u8, text, "hPa") and text.len > 3) {
1651 const before = lastCodepoint(text[0 .. text.len - 3]);
1652 if (before != null and matchLookbehind0(before.?.value)) return 3;
1653 }
1654 if (std.mem.endsWith(u8, text, "km") and text.len > 2) {
1655 const before = lastCodepoint(text[0 .. text.len - 2]);
1656 if (before != null and matchLookbehind0(before.?.value)) return 2;
1657 }
1658 if (std.mem.endsWith(u8, text, "dm") and text.len > 2) {
1659 const before = lastCodepoint(text[0 .. text.len - 2]);
1660 if (before != null and matchLookbehind0(before.?.value)) return 2;
1661 }
1662 if (std.mem.endsWith(u8, text, "cm") and text.len > 2) {
1663 const before = lastCodepoint(text[0 .. text.len - 2]);
1664 if (before != null and matchLookbehind0(before.?.value)) return 2;
1665 }
1666 if (std.mem.endsWith(u8, text, "mm") and text.len > 2) {
1667 const before = lastCodepoint(text[0 .. text.len - 2]);
1668 if (before != null and matchLookbehind0(before.?.value)) return 2;
1669 }
1670 if (std.mem.endsWith(u8, text, "ha") and text.len > 2) {
1671 const before = lastCodepoint(text[0 .. text.len - 2]);
1672 if (before != null and matchLookbehind0(before.?.value)) return 2;
1673 }
1674 if (std.mem.endsWith(u8, text, "nm") and text.len > 2) {
1675 const before = lastCodepoint(text[0 .. text.len - 2]);
1676 if (before != null and matchLookbehind0(before.?.value)) return 2;
1677 }
1678 if (std.mem.endsWith(u8, text, "yd") and text.len > 2) {
1679 const before = lastCodepoint(text[0 .. text.len - 2]);
1680 if (before != null and matchLookbehind0(before.?.value)) return 2;
1681 }
1682 if (std.mem.endsWith(u8, text, "in") and text.len > 2) {
1683 const before = lastCodepoint(text[0 .. text.len - 2]);
1684 if (before != null and matchLookbehind0(before.?.value)) return 2;
1685 }
1686 if (std.mem.endsWith(u8, text, "ft") and text.len > 2) {
1687 const before = lastCodepoint(text[0 .. text.len - 2]);
1688 if (before != null and matchLookbehind0(before.?.value)) return 2;
1689 }
1690 if (std.mem.endsWith(u8, text, "kg") and text.len > 2) {
1691 const before = lastCodepoint(text[0 .. text.len - 2]);
1692 if (before != null and matchLookbehind0(before.?.value)) return 2;
1693 }
1694 if (std.mem.endsWith(u8, text, "mg") and text.len > 2) {
1695 const before = lastCodepoint(text[0 .. text.len - 2]);
1696 if (before != null and matchLookbehind0(before.?.value)) return 2;
1697 }
1698 if (std.mem.endsWith(u8, text, "lb") and text.len > 2) {
1699 const before = lastCodepoint(text[0 .. text.len - 2]);
1700 if (before != null and matchLookbehind0(before.?.value)) return 2;
1701 }
1702 if (std.mem.endsWith(u8, text, "oz") and text.len > 2) {
1703 const before = lastCodepoint(text[0 .. text.len - 2]);
1704 if (before != null and matchLookbehind0(before.?.value)) return 2;
1705 }
1706 if (std.mem.endsWith(u8, text, "Pa") and text.len > 2) {
1707 const before = lastCodepoint(text[0 .. text.len - 2]);
1708 if (before != null and matchLookbehind0(before.?.value)) return 2;
1709 }
1710 if (std.mem.endsWith(u8, text, "mb") and text.len > 2) {
1711 const before = lastCodepoint(text[0 .. text.len - 2]);
1712 if (before != null and matchLookbehind0(before.?.value)) return 2;
1713 }
1714 if (std.mem.endsWith(u8, text, "MB") and text.len > 2) {
1715 const before = lastCodepoint(text[0 .. text.len - 2]);
1716 if (before != null and matchLookbehind0(before.?.value)) return 2;
1717 }
1718 if (std.mem.endsWith(u8, text, "kb") and text.len > 2) {
1719 const before = lastCodepoint(text[0 .. text.len - 2]);
1720 if (before != null and matchLookbehind0(before.?.value)) return 2;
1721 }
1722 if (std.mem.endsWith(u8, text, "KB") and text.len > 2) {
1723 const before = lastCodepoint(text[0 .. text.len - 2]);
1724 if (before != null and matchLookbehind0(before.?.value)) return 2;
1725 }
1726 if (std.mem.endsWith(u8, text, "gb") and text.len > 2) {
1727 const before = lastCodepoint(text[0 .. text.len - 2]);
1728 if (before != null and matchLookbehind0(before.?.value)) return 2;
1729 }
1730 if (std.mem.endsWith(u8, text, "GB") and text.len > 2) {
1731 const before = lastCodepoint(text[0 .. text.len - 2]);
1732 if (before != null and matchLookbehind0(before.?.value)) return 2;
1733 }
1734 if (std.mem.endsWith(u8, text, "tb") and text.len > 2) {
1735 const before = lastCodepoint(text[0 .. text.len - 2]);
1736 if (before != null and matchLookbehind0(before.?.value)) return 2;
1737 }
1738 if (std.mem.endsWith(u8, text, "TB") and text.len > 2) {
1739 const before = lastCodepoint(text[0 .. text.len - 2]);
1740 if (before != null and matchLookbehind0(before.?.value)) return 2;
1741 }
1742 if (std.mem.endsWith(u8, text, "\xd0\xbc") and text.len > 2) {
1743 const before = lastCodepoint(text[0 .. text.len - 2]);
1744 if (before != null and matchLookbehind0(before.?.value)) return 2;
1745 }
1746 if (std.mem.endsWith(u8, text, "\xd0\xb3") and text.len > 2) {
1747 const before = lastCodepoint(text[0 .. text.len - 2]);
1748 if (before != null and matchLookbehind0(before.?.value)) return 2;
1749 }
1750 if (std.mem.endsWith(u8, text, "\xd9\x85") and text.len > 2) {
1751 const before = lastCodepoint(text[0 .. text.len - 2]);
1752 if (before != null and matchLookbehind0(before.?.value)) return 2;
1753 }
1754 if (std.mem.endsWith(u8, text, "m") and text.len > 1) {
1755 const before = lastCodepoint(text[0 .. text.len - 1]);
1756 if (before != null and matchLookbehind0(before.?.value)) return 1;
1757 }
1758 if (std.mem.endsWith(u8, text, "g") and text.len > 1) {
1759 const before = lastCodepoint(text[0 .. text.len - 1]);
1760 if (before != null and matchLookbehind0(before.?.value)) return 1;
1761 }
1762 if (std.mem.endsWith(u8, text, "t") and text.len > 1) {
1763 const before = lastCodepoint(text[0 .. text.len - 1]);
1764 if (before != null and matchLookbehind0(before.?.value)) return 1;
1765 }
1766 if (std.mem.endsWith(u8, text, "T") and text.len > 1) {
1767 const before = lastCodepoint(text[0 .. text.len - 1]);
1768 if (before != null and matchLookbehind0(before.?.value)) return 1;
1769 }
1770 if (std.mem.endsWith(u8, text, "G") and text.len > 1) {
1771 const before = lastCodepoint(text[0 .. text.len - 1]);
1772 if (before != null and matchLookbehind0(before.?.value)) return 1;
1773 }
1774 if (std.mem.endsWith(u8, text, "M") and text.len > 1) {
1775 const before = lastCodepoint(text[0 .. text.len - 1]);
1776 if (before != null and matchLookbehind0(before.?.value)) return 1;
1777 }
1778 if (std.mem.endsWith(u8, text, "K") and text.len > 1) {
1779 const before = lastCodepoint(text[0 .. text.len - 1]);
1780 if (before != null and matchLookbehind0(before.?.value)) return 1;
1781 }
1782 if (std.mem.endsWith(u8, text, "%") and text.len > 1) {
1783 const before = lastCodepoint(text[0 .. text.len - 1]);
1784 if (before != null and matchLookbehind0(before.?.value)) return 1;
1785 }
1786 if (std.mem.endsWith(u8, text, ".") and text.len > 1) {
1787 const before = lastCodepoint(text[0 .. text.len - 1]);
1788 if (before != null and matchLookbehind2(before.?.value)) return 1;
1789 }
1790 if (std.mem.endsWith(u8, text, ".") and text.len > 1) {
1791 const b1 = lastCodepoint(text[0 .. text.len - 1]);
1792 if (b1) |bp1| {
1793 const b2 = lastCodepoint(text[0 .. text.len - 1 - bp1.len]);
1794 if (matchLookbehind3(bp1.value)) {
1795 if (b2) |b2p| {
1796 if (matchLookbehind3(b2p.value)) return 1;
1797 }
1798 }
1799 }
1800 }
1801 return 0;
1802}
1803
1804// ── infix character classes ──
1805
1806pub const is_infix_3_ahead_ranges = [_][2]u21{
1807 .{ 0x002D, 0x002D },
1808 .{ 0x0030, 0x0039 },
1809};
1810
1811pub fn is_infix_3_ahead(c: u21) bool {
1812 return rangeContains(&is_infix_3_ahead_ranges, c);
1813}
1814
1815pub const is_infix_3_behind_ranges = [_][2]u21{
1816 .{ 0x0030, 0x0039 },
1817};
1818
1819pub fn is_infix_3_behind(c: u21) bool {
1820 return rangeContains(&is_infix_3_behind_ranges, c);
1821}
1822
1823pub const is_infix_4_ahead_ranges = [_][2]u21{
1824 .{ 0x0022, 0x0022 },
1825 .{ 0x0027, 0x0027 },
1826 .{ 0x002C, 0x002C },
1827 .{ 0x0041, 0x005A },
1828 .{ 0x0060, 0x0060 },
1829 .{ 0x00AB, 0x00AB },
1830 .{ 0x00B4, 0x00B4 },
1831 .{ 0x00BB, 0x00BB },
1832 .{ 0x00C0, 0x00D6 },
1833 .{ 0x00D8, 0x00DE },
1834 .{ 0x0100, 0x0100 },
1835 .{ 0x0102, 0x0102 },
1836 .{ 0x0104, 0x0104 },
1837 .{ 0x0106, 0x0106 },
1838 .{ 0x0108, 0x0108 },
1839 .{ 0x010A, 0x010A },
1840 .{ 0x010C, 0x010C },
1841 .{ 0x010E, 0x010E },
1842 .{ 0x0110, 0x0110 },
1843 .{ 0x0112, 0x0112 },
1844 .{ 0x0114, 0x0114 },
1845 .{ 0x0116, 0x0116 },
1846 .{ 0x0118, 0x0118 },
1847 .{ 0x011A, 0x011A },
1848 .{ 0x011C, 0x011C },
1849 .{ 0x011E, 0x011E },
1850 .{ 0x0120, 0x0120 },
1851 .{ 0x0122, 0x0122 },
1852 .{ 0x0124, 0x0124 },
1853 .{ 0x0126, 0x0126 },
1854 .{ 0x0128, 0x0128 },
1855 .{ 0x012A, 0x012A },
1856 .{ 0x012C, 0x012C },
1857 .{ 0x012E, 0x012E },
1858 .{ 0x0130, 0x0130 },
1859 .{ 0x0132, 0x0132 },
1860 .{ 0x0134, 0x0134 },
1861 .{ 0x0136, 0x0136 },
1862 .{ 0x0139, 0x0139 },
1863 .{ 0x013B, 0x013B },
1864 .{ 0x013D, 0x013D },
1865 .{ 0x013F, 0x013F },
1866 .{ 0x0141, 0x0141 },
1867 .{ 0x0143, 0x0143 },
1868 .{ 0x0145, 0x0145 },
1869 .{ 0x0147, 0x0147 },
1870 .{ 0x014A, 0x014A },
1871 .{ 0x014C, 0x014C },
1872 .{ 0x014E, 0x014E },
1873 .{ 0x0150, 0x0150 },
1874 .{ 0x0152, 0x0152 },
1875 .{ 0x0154, 0x0154 },
1876 .{ 0x0156, 0x0156 },
1877 .{ 0x0158, 0x0158 },
1878 .{ 0x015A, 0x015A },
1879 .{ 0x015C, 0x015C },
1880 .{ 0x015E, 0x015E },
1881 .{ 0x0160, 0x0160 },
1882 .{ 0x0162, 0x0162 },
1883 .{ 0x0164, 0x0164 },
1884 .{ 0x0166, 0x0166 },
1885 .{ 0x0168, 0x0168 },
1886 .{ 0x016A, 0x016A },
1887 .{ 0x016C, 0x016C },
1888 .{ 0x016E, 0x016E },
1889 .{ 0x0170, 0x0170 },
1890 .{ 0x0172, 0x0172 },
1891 .{ 0x0174, 0x0174 },
1892 .{ 0x0176, 0x0176 },
1893 .{ 0x0178, 0x0179 },
1894 .{ 0x017B, 0x017B },
1895 .{ 0x017D, 0x017D },
1896 .{ 0x0181, 0x0182 },
1897 .{ 0x0184, 0x0184 },
1898 .{ 0x0186, 0x0187 },
1899 .{ 0x0189, 0x018B },
1900 .{ 0x018E, 0x0191 },
1901 .{ 0x0193, 0x0194 },
1902 .{ 0x0196, 0x0198 },
1903 .{ 0x019C, 0x019D },
1904 .{ 0x019F, 0x01A0 },
1905 .{ 0x01A2, 0x01A2 },
1906 .{ 0x01A4, 0x01A4 },
1907 .{ 0x01A6, 0x01A7 },
1908 .{ 0x01A9, 0x01A9 },
1909 .{ 0x01AC, 0x01AC },
1910 .{ 0x01AE, 0x01AF },
1911 .{ 0x01B1, 0x01B3 },
1912 .{ 0x01B5, 0x01B5 },
1913 .{ 0x01B7, 0x01B8 },
1914 .{ 0x01BC, 0x01BC },
1915 .{ 0x01C4, 0x01C4 },
1916 .{ 0x01C7, 0x01C7 },
1917 .{ 0x01CA, 0x01CA },
1918 .{ 0x01CD, 0x01CD },
1919 .{ 0x01CF, 0x01CF },
1920 .{ 0x01D1, 0x01D1 },
1921 .{ 0x01D3, 0x01D3 },
1922 .{ 0x01D5, 0x01D5 },
1923 .{ 0x01D7, 0x01D7 },
1924 .{ 0x01D9, 0x01D9 },
1925 .{ 0x01DB, 0x01DB },
1926 .{ 0x01DE, 0x01DE },
1927 .{ 0x01E0, 0x01E0 },
1928 .{ 0x01E2, 0x01E2 },
1929 .{ 0x01E4, 0x01E4 },
1930 .{ 0x01E6, 0x01E6 },
1931 .{ 0x01E8, 0x01E8 },
1932 .{ 0x01EA, 0x01EA },
1933 .{ 0x01EC, 0x01EC },
1934 .{ 0x01EE, 0x01EE },
1935 .{ 0x01F1, 0x01F1 },
1936 .{ 0x01F4, 0x01F4 },
1937 .{ 0x01F6, 0x01F8 },
1938 .{ 0x01FA, 0x01FA },
1939 .{ 0x01FC, 0x01FC },
1940 .{ 0x01FE, 0x01FE },
1941 .{ 0x0200, 0x0200 },
1942 .{ 0x0202, 0x0202 },
1943 .{ 0x0204, 0x0204 },
1944 .{ 0x0206, 0x0206 },
1945 .{ 0x0208, 0x0208 },
1946 .{ 0x020A, 0x020A },
1947 .{ 0x020C, 0x020C },
1948 .{ 0x020E, 0x020E },
1949 .{ 0x0210, 0x0210 },
1950 .{ 0x0212, 0x0212 },
1951 .{ 0x0214, 0x0214 },
1952 .{ 0x0216, 0x0216 },
1953 .{ 0x0218, 0x0218 },
1954 .{ 0x021A, 0x021A },
1955 .{ 0x021C, 0x021C },
1956 .{ 0x021E, 0x021E },
1957 .{ 0x0220, 0x0220 },
1958 .{ 0x0222, 0x0222 },
1959 .{ 0x0224, 0x0224 },
1960 .{ 0x0226, 0x0226 },
1961 .{ 0x0228, 0x0228 },
1962 .{ 0x022A, 0x022A },
1963 .{ 0x022C, 0x022C },
1964 .{ 0x022E, 0x022E },
1965 .{ 0x0230, 0x0230 },
1966 .{ 0x0232, 0x0232 },
1967 .{ 0x023A, 0x023B },
1968 .{ 0x023D, 0x023E },
1969 .{ 0x0241, 0x0241 },
1970 .{ 0x0243, 0x0246 },
1971 .{ 0x0248, 0x0248 },
1972 .{ 0x024A, 0x024A },
1973 .{ 0x024C, 0x024C },
1974 .{ 0x024E, 0x024E },
1975 .{ 0x0386, 0x0386 },
1976 .{ 0x0388, 0x038A },
1977 .{ 0x038C, 0x038C },
1978 .{ 0x038E, 0x038F },
1979 .{ 0x0391, 0x03A9 },
1980 .{ 0x0400, 0x0401 },
1981 .{ 0x0403, 0x040A },
1982 .{ 0x040C, 0x040D },
1983 .{ 0x0410, 0x042F },
1984 .{ 0x0490, 0x0490 },
1985 .{ 0x0496, 0x0496 },
1986 .{ 0x04A2, 0x04A2 },
1987 .{ 0x04AE, 0x04AE },
1988 .{ 0x04BA, 0x04BA },
1989 .{ 0x04D8, 0x04D8 },
1990 .{ 0x04E8, 0x04E8 },
1991 .{ 0x0591, 0x05F4 },
1992 .{ 0x0620, 0x064A },
1993 .{ 0x066E, 0x06D5 },
1994 .{ 0x06E5, 0x06FF },
1995 .{ 0x0750, 0x077F },
1996 .{ 0x08A0, 0x08BD },
1997 .{ 0x0900, 0x09FF },
1998 .{ 0x0B80, 0x0CFF },
1999 .{ 0x0D80, 0x0DFF },
2000 .{ 0x1100, 0x137F },
2001 .{ 0x1E00, 0x1E00 },
2002 .{ 0x1E02, 0x1E02 },
2003 .{ 0x1E04, 0x1E04 },
2004 .{ 0x1E06, 0x1E06 },
2005 .{ 0x1E08, 0x1E08 },
2006 .{ 0x1E0A, 0x1E0A },
2007 .{ 0x1E0C, 0x1E0C },
2008 .{ 0x1E0E, 0x1E0E },
2009 .{ 0x1E10, 0x1E10 },
2010 .{ 0x1E12, 0x1E12 },
2011 .{ 0x1E14, 0x1E14 },
2012 .{ 0x1E16, 0x1E16 },
2013 .{ 0x1E18, 0x1E18 },
2014 .{ 0x1E1A, 0x1E1A },
2015 .{ 0x1E1C, 0x1E1C },
2016 .{ 0x1E1E, 0x1E1E },
2017 .{ 0x1E20, 0x1E20 },
2018 .{ 0x1E22, 0x1E22 },
2019 .{ 0x1E24, 0x1E24 },
2020 .{ 0x1E26, 0x1E26 },
2021 .{ 0x1E28, 0x1E28 },
2022 .{ 0x1E2A, 0x1E2A },
2023 .{ 0x1E2C, 0x1E2C },
2024 .{ 0x1E2E, 0x1E2E },
2025 .{ 0x1E30, 0x1E30 },
2026 .{ 0x1E32, 0x1E32 },
2027 .{ 0x1E34, 0x1E34 },
2028 .{ 0x1E36, 0x1E36 },
2029 .{ 0x1E38, 0x1E38 },
2030 .{ 0x1E3A, 0x1E3A },
2031 .{ 0x1E3C, 0x1E3C },
2032 .{ 0x1E3E, 0x1E3E },
2033 .{ 0x1E40, 0x1E40 },
2034 .{ 0x1E42, 0x1E42 },
2035 .{ 0x1E44, 0x1E44 },
2036 .{ 0x1E46, 0x1E46 },
2037 .{ 0x1E48, 0x1E48 },
2038 .{ 0x1E4A, 0x1E4A },
2039 .{ 0x1E4C, 0x1E4C },
2040 .{ 0x1E4E, 0x1E4E },
2041 .{ 0x1E50, 0x1E50 },
2042 .{ 0x1E52, 0x1E52 },
2043 .{ 0x1E54, 0x1E54 },
2044 .{ 0x1E56, 0x1E56 },
2045 .{ 0x1E58, 0x1E58 },
2046 .{ 0x1E5A, 0x1E5A },
2047 .{ 0x1E5C, 0x1E5C },
2048 .{ 0x1E5E, 0x1E5E },
2049 .{ 0x1E60, 0x1E60 },
2050 .{ 0x1E62, 0x1E62 },
2051 .{ 0x1E64, 0x1E64 },
2052 .{ 0x1E66, 0x1E66 },
2053 .{ 0x1E68, 0x1E68 },
2054 .{ 0x1E6A, 0x1E6A },
2055 .{ 0x1E6C, 0x1E6C },
2056 .{ 0x1E6E, 0x1E6E },
2057 .{ 0x1E70, 0x1E70 },
2058 .{ 0x1E72, 0x1E72 },
2059 .{ 0x1E74, 0x1E74 },
2060 .{ 0x1E76, 0x1E76 },
2061 .{ 0x1E78, 0x1E78 },
2062 .{ 0x1E7A, 0x1E7A },
2063 .{ 0x1E7C, 0x1E7C },
2064 .{ 0x1E7E, 0x1E7E },
2065 .{ 0x1E80, 0x1E80 },
2066 .{ 0x1E82, 0x1E82 },
2067 .{ 0x1E84, 0x1E84 },
2068 .{ 0x1E86, 0x1E86 },
2069 .{ 0x1E88, 0x1E88 },
2070 .{ 0x1E8A, 0x1E8A },
2071 .{ 0x1E8C, 0x1E8C },
2072 .{ 0x1E8E, 0x1E8E },
2073 .{ 0x1E90, 0x1E90 },
2074 .{ 0x1E92, 0x1E92 },
2075 .{ 0x1E94, 0x1E94 },
2076 .{ 0x1E9E, 0x1E9E },
2077 .{ 0x1EA0, 0x1EA0 },
2078 .{ 0x1EA2, 0x1EA2 },
2079 .{ 0x1EA4, 0x1EA4 },
2080 .{ 0x1EA6, 0x1EA6 },
2081 .{ 0x1EA8, 0x1EA8 },
2082 .{ 0x1EAA, 0x1EAA },
2083 .{ 0x1EAC, 0x1EAC },
2084 .{ 0x1EAE, 0x1EAE },
2085 .{ 0x1EB0, 0x1EB0 },
2086 .{ 0x1EB2, 0x1EB2 },
2087 .{ 0x1EB4, 0x1EB4 },
2088 .{ 0x1EB6, 0x1EB6 },
2089 .{ 0x1EB8, 0x1EB8 },
2090 .{ 0x1EBA, 0x1EBA },
2091 .{ 0x1EBC, 0x1EBC },
2092 .{ 0x1EBE, 0x1EBE },
2093 .{ 0x1EC0, 0x1EC0 },
2094 .{ 0x1EC2, 0x1EC2 },
2095 .{ 0x1EC4, 0x1EC4 },
2096 .{ 0x1EC6, 0x1EC6 },
2097 .{ 0x1EC8, 0x1EC8 },
2098 .{ 0x1ECA, 0x1ECA },
2099 .{ 0x1ECC, 0x1ECC },
2100 .{ 0x1ECE, 0x1ECE },
2101 .{ 0x1ED0, 0x1ED0 },
2102 .{ 0x1ED2, 0x1ED2 },
2103 .{ 0x1ED4, 0x1ED4 },
2104 .{ 0x1ED6, 0x1ED6 },
2105 .{ 0x1ED8, 0x1ED8 },
2106 .{ 0x1EDA, 0x1EDA },
2107 .{ 0x1EDC, 0x1EDC },
2108 .{ 0x1EDE, 0x1EDE },
2109 .{ 0x1EE0, 0x1EE0 },
2110 .{ 0x1EE2, 0x1EE2 },
2111 .{ 0x1EE4, 0x1EE4 },
2112 .{ 0x1EE6, 0x1EE6 },
2113 .{ 0x1EE8, 0x1EE8 },
2114 .{ 0x1EEA, 0x1EEA },
2115 .{ 0x1EEC, 0x1EEC },
2116 .{ 0x1EEE, 0x1EEE },
2117 .{ 0x1EF0, 0x1EF0 },
2118 .{ 0x1EF2, 0x1EF2 },
2119 .{ 0x1EF4, 0x1EF4 },
2120 .{ 0x1EF6, 0x1EF6 },
2121 .{ 0x1EF8, 0x1EF8 },
2122 .{ 0x1EFA, 0x1EFA },
2123 .{ 0x1EFC, 0x1EFC },
2124 .{ 0x1EFE, 0x1EFE },
2125 .{ 0x2018, 0x201A },
2126 .{ 0x201C, 0x201E },
2127 .{ 0x2329, 0x232A },
2128 .{ 0x27E6, 0x27E7 },
2129 .{ 0x2C60, 0x2C60 },
2130 .{ 0x2C62, 0x2C64 },
2131 .{ 0x2C67, 0x2C67 },
2132 .{ 0x2C69, 0x2C69 },
2133 .{ 0x2C6B, 0x2C6B },
2134 .{ 0x2C6D, 0x2C70 },
2135 .{ 0x2C72, 0x2C72 },
2136 .{ 0x2C75, 0x2C75 },
2137 .{ 0x2C7E, 0x2C7F },
2138 .{ 0x2E80, 0x2FDF },
2139 .{ 0x2FF0, 0x30FF },
2140 .{ 0x31C0, 0x31EF },
2141 .{ 0x3200, 0x4DBF },
2142 .{ 0x4E00, 0x9FFF },
2143 .{ 0xA722, 0xA722 },
2144 .{ 0xA724, 0xA724 },
2145 .{ 0xA726, 0xA726 },
2146 .{ 0xA728, 0xA728 },
2147 .{ 0xA72A, 0xA72A },
2148 .{ 0xA72C, 0xA72C },
2149 .{ 0xA72E, 0xA72E },
2150 .{ 0xA732, 0xA732 },
2151 .{ 0xA734, 0xA734 },
2152 .{ 0xA736, 0xA736 },
2153 .{ 0xA738, 0xA738 },
2154 .{ 0xA73A, 0xA73A },
2155 .{ 0xA73C, 0xA73C },
2156 .{ 0xA73E, 0xA73E },
2157 .{ 0xA740, 0xA740 },
2158 .{ 0xA742, 0xA742 },
2159 .{ 0xA744, 0xA744 },
2160 .{ 0xA746, 0xA746 },
2161 .{ 0xA748, 0xA748 },
2162 .{ 0xA74A, 0xA74A },
2163 .{ 0xA74C, 0xA74C },
2164 .{ 0xA74E, 0xA74E },
2165 .{ 0xA750, 0xA750 },
2166 .{ 0xA752, 0xA752 },
2167 .{ 0xA754, 0xA754 },
2168 .{ 0xA756, 0xA756 },
2169 .{ 0xA758, 0xA758 },
2170 .{ 0xA75A, 0xA75A },
2171 .{ 0xA75C, 0xA75C },
2172 .{ 0xA75E, 0xA75E },
2173 .{ 0xA760, 0xA760 },
2174 .{ 0xA762, 0xA762 },
2175 .{ 0xA764, 0xA764 },
2176 .{ 0xA766, 0xA766 },
2177 .{ 0xA768, 0xA768 },
2178 .{ 0xA76A, 0xA76A },
2179 .{ 0xA76C, 0xA76C },
2180 .{ 0xA76E, 0xA76E },
2181 .{ 0xA779, 0xA779 },
2182 .{ 0xA77B, 0xA77B },
2183 .{ 0xA77D, 0xA77E },
2184 .{ 0xA780, 0xA780 },
2185 .{ 0xA782, 0xA782 },
2186 .{ 0xA784, 0xA784 },
2187 .{ 0xA786, 0xA786 },
2188 .{ 0xA78B, 0xA78B },
2189 .{ 0xA78D, 0xA78D },
2190 .{ 0xA790, 0xA790 },
2191 .{ 0xA792, 0xA792 },
2192 .{ 0xA796, 0xA796 },
2193 .{ 0xA798, 0xA798 },
2194 .{ 0xA79A, 0xA79A },
2195 .{ 0xA79C, 0xA79C },
2196 .{ 0xA79E, 0xA79E },
2197 .{ 0xA7A0, 0xA7A0 },
2198 .{ 0xA7A2, 0xA7A2 },
2199 .{ 0xA7A4, 0xA7A4 },
2200 .{ 0xA7A6, 0xA7A6 },
2201 .{ 0xA7A8, 0xA7A8 },
2202 .{ 0xA7AA, 0xA7AE },
2203 .{ 0xA7B0, 0xA7B4 },
2204 .{ 0xA7B6, 0xA7B6 },
2205 .{ 0xA7B8, 0xA7B8 },
2206 .{ 0xAC00, 0xD7AF },
2207 .{ 0xF900, 0xFAFF },
2208 .{ 0xFB1D, 0xFBB1 },
2209 .{ 0xFBD3, 0xFD3D },
2210 .{ 0xFD50, 0xFDC7 },
2211 .{ 0xFDF0, 0xFDFB },
2212 .{ 0xFE30, 0xFE4F },
2213 .{ 0xFE70, 0xFEFC },
2214 .{ 0xFF08, 0xFF09 },
2215 .{ 0xFF21, 0xFF3A },
2216 .{ 0x1EE00, 0x1EEBB },
2217 .{ 0x1F200, 0x1F2FF },
2218 .{ 0x20000, 0x2A6DF },
2219 .{ 0x2A700, 0x2EBEF },
2220 .{ 0x2F800, 0x2FA1F },
2221};
2222
2223pub fn is_infix_4_ahead(c: u21) bool {
2224 return rangeContains(&is_infix_4_ahead_ranges, c);
2225}
2226
2227pub const is_infix_4_behind_ranges = [_][2]u21{
2228 .{ 0x0022, 0x0022 },
2229 .{ 0x0027, 0x0027 },
2230 .{ 0x002C, 0x002C },
2231 .{ 0x0060, 0x007A },
2232 .{ 0x00AB, 0x00AB },
2233 .{ 0x00B4, 0x00B4 },
2234 .{ 0x00BB, 0x00BB },
2235 .{ 0x00DF, 0x00F6 },
2236 .{ 0x00F8, 0x00FF },
2237 .{ 0x0101, 0x0101 },
2238 .{ 0x0103, 0x0103 },
2239 .{ 0x0105, 0x0105 },
2240 .{ 0x0107, 0x0107 },
2241 .{ 0x0109, 0x0109 },
2242 .{ 0x010B, 0x010B },
2243 .{ 0x010D, 0x010D },
2244 .{ 0x010F, 0x010F },
2245 .{ 0x0111, 0x0111 },
2246 .{ 0x0113, 0x0113 },
2247 .{ 0x0115, 0x0115 },
2248 .{ 0x0117, 0x0117 },
2249 .{ 0x0119, 0x0119 },
2250 .{ 0x011B, 0x011B },
2251 .{ 0x011D, 0x011D },
2252 .{ 0x011F, 0x011F },
2253 .{ 0x0121, 0x0121 },
2254 .{ 0x0123, 0x0123 },
2255 .{ 0x0125, 0x0125 },
2256 .{ 0x0127, 0x0127 },
2257 .{ 0x0129, 0x0129 },
2258 .{ 0x012B, 0x012B },
2259 .{ 0x012D, 0x012D },
2260 .{ 0x012F, 0x012F },
2261 .{ 0x0131, 0x0131 },
2262 .{ 0x0133, 0x0133 },
2263 .{ 0x0135, 0x0135 },
2264 .{ 0x0137, 0x0138 },
2265 .{ 0x013A, 0x013A },
2266 .{ 0x013C, 0x013C },
2267 .{ 0x013E, 0x013E },
2268 .{ 0x0140, 0x0140 },
2269 .{ 0x0142, 0x0142 },
2270 .{ 0x0144, 0x0144 },
2271 .{ 0x0146, 0x0146 },
2272 .{ 0x0148, 0x0149 },
2273 .{ 0x014B, 0x014B },
2274 .{ 0x014D, 0x014D },
2275 .{ 0x014F, 0x014F },
2276 .{ 0x0151, 0x0151 },
2277 .{ 0x0153, 0x0153 },
2278 .{ 0x0155, 0x0155 },
2279 .{ 0x0157, 0x0157 },
2280 .{ 0x0159, 0x0159 },
2281 .{ 0x015B, 0x015B },
2282 .{ 0x015D, 0x015D },
2283 .{ 0x015F, 0x015F },
2284 .{ 0x0161, 0x0161 },
2285 .{ 0x0163, 0x0163 },
2286 .{ 0x0165, 0x0165 },
2287 .{ 0x0167, 0x0167 },
2288 .{ 0x0169, 0x0169 },
2289 .{ 0x016B, 0x016B },
2290 .{ 0x016D, 0x016D },
2291 .{ 0x016F, 0x016F },
2292 .{ 0x0171, 0x0171 },
2293 .{ 0x0173, 0x0173 },
2294 .{ 0x0175, 0x0175 },
2295 .{ 0x0177, 0x0177 },
2296 .{ 0x017A, 0x017A },
2297 .{ 0x017C, 0x017C },
2298 .{ 0x017E, 0x0180 },
2299 .{ 0x0183, 0x0183 },
2300 .{ 0x0185, 0x0185 },
2301 .{ 0x0188, 0x0188 },
2302 .{ 0x018C, 0x018D },
2303 .{ 0x0192, 0x0192 },
2304 .{ 0x0195, 0x0195 },
2305 .{ 0x0199, 0x019B },
2306 .{ 0x019E, 0x019E },
2307 .{ 0x01A1, 0x01A1 },
2308 .{ 0x01A3, 0x01A3 },
2309 .{ 0x01A5, 0x01A5 },
2310 .{ 0x01A8, 0x01A8 },
2311 .{ 0x01AA, 0x01AB },
2312 .{ 0x01AD, 0x01AD },
2313 .{ 0x01B0, 0x01B0 },
2314 .{ 0x01B4, 0x01B4 },
2315 .{ 0x01B6, 0x01B6 },
2316 .{ 0x01B9, 0x01BA },
2317 .{ 0x01BD, 0x01BF },
2318 .{ 0x01C6, 0x01C6 },
2319 .{ 0x01C9, 0x01C9 },
2320 .{ 0x01CC, 0x01CC },
2321 .{ 0x01CE, 0x01CE },
2322 .{ 0x01D0, 0x01D0 },
2323 .{ 0x01D2, 0x01D2 },
2324 .{ 0x01D4, 0x01D4 },
2325 .{ 0x01D6, 0x01D6 },
2326 .{ 0x01D8, 0x01D8 },
2327 .{ 0x01DA, 0x01DA },
2328 .{ 0x01DC, 0x01DD },
2329 .{ 0x01DF, 0x01DF },
2330 .{ 0x01E1, 0x01E1 },
2331 .{ 0x01E3, 0x01E3 },
2332 .{ 0x01E5, 0x01E5 },
2333 .{ 0x01E7, 0x01E7 },
2334 .{ 0x01E9, 0x01E9 },
2335 .{ 0x01EB, 0x01EB },
2336 .{ 0x01ED, 0x01ED },
2337 .{ 0x01EF, 0x01F0 },
2338 .{ 0x01F3, 0x01F3 },
2339 .{ 0x01F5, 0x01F5 },
2340 .{ 0x01F9, 0x01F9 },
2341 .{ 0x01FB, 0x01FB },
2342 .{ 0x01FD, 0x01FD },
2343 .{ 0x01FF, 0x01FF },
2344 .{ 0x0201, 0x0201 },
2345 .{ 0x0203, 0x0203 },
2346 .{ 0x0205, 0x0205 },
2347 .{ 0x0207, 0x0207 },
2348 .{ 0x0209, 0x0209 },
2349 .{ 0x020B, 0x020B },
2350 .{ 0x020D, 0x020D },
2351 .{ 0x020F, 0x020F },
2352 .{ 0x0211, 0x0211 },
2353 .{ 0x0213, 0x0213 },
2354 .{ 0x0215, 0x0215 },
2355 .{ 0x0217, 0x0217 },
2356 .{ 0x0219, 0x0219 },
2357 .{ 0x021B, 0x021B },
2358 .{ 0x021D, 0x021D },
2359 .{ 0x021F, 0x021F },
2360 .{ 0x0221, 0x0221 },
2361 .{ 0x0223, 0x0223 },
2362 .{ 0x0225, 0x0225 },
2363 .{ 0x0227, 0x0227 },
2364 .{ 0x0229, 0x0229 },
2365 .{ 0x022B, 0x022B },
2366 .{ 0x022D, 0x022D },
2367 .{ 0x022F, 0x022F },
2368 .{ 0x0231, 0x0231 },
2369 .{ 0x0233, 0x0239 },
2370 .{ 0x023C, 0x023C },
2371 .{ 0x023F, 0x0240 },
2372 .{ 0x0242, 0x0242 },
2373 .{ 0x0247, 0x0247 },
2374 .{ 0x0249, 0x0249 },
2375 .{ 0x024B, 0x024B },
2376 .{ 0x024D, 0x024D },
2377 .{ 0x024F, 0x02AF },
2378 .{ 0x03AC, 0x03AF },
2379 .{ 0x03B1, 0x03C9 },
2380 .{ 0x03CC, 0x03CE },
2381 .{ 0x0430, 0x0451 },
2382 .{ 0x0453, 0x045A },
2383 .{ 0x045C, 0x045D },
2384 .{ 0x0491, 0x0491 },
2385 .{ 0x0497, 0x0497 },
2386 .{ 0x04A3, 0x04A3 },
2387 .{ 0x04AF, 0x04AF },
2388 .{ 0x04BB, 0x04BB },
2389 .{ 0x04D9, 0x04D9 },
2390 .{ 0x04E9, 0x04E9 },
2391 .{ 0x0591, 0x05F4 },
2392 .{ 0x0620, 0x064A },
2393 .{ 0x066E, 0x06D5 },
2394 .{ 0x06E5, 0x06FF },
2395 .{ 0x0750, 0x077F },
2396 .{ 0x08A0, 0x08BD },
2397 .{ 0x0900, 0x09FF },
2398 .{ 0x0B80, 0x0CFF },
2399 .{ 0x0D80, 0x0DFF },
2400 .{ 0x1100, 0x137F },
2401 .{ 0x1D00, 0x1D25 },
2402 .{ 0x1D6B, 0x1D77 },
2403 .{ 0x1D79, 0x1D9A },
2404 .{ 0x1E01, 0x1E01 },
2405 .{ 0x1E03, 0x1E03 },
2406 .{ 0x1E05, 0x1E05 },
2407 .{ 0x1E07, 0x1E07 },
2408 .{ 0x1E09, 0x1E09 },
2409 .{ 0x1E0B, 0x1E0B },
2410 .{ 0x1E0D, 0x1E0D },
2411 .{ 0x1E0F, 0x1E0F },
2412 .{ 0x1E11, 0x1E11 },
2413 .{ 0x1E13, 0x1E13 },
2414 .{ 0x1E15, 0x1E15 },
2415 .{ 0x1E17, 0x1E17 },
2416 .{ 0x1E19, 0x1E19 },
2417 .{ 0x1E1B, 0x1E1B },
2418 .{ 0x1E1D, 0x1E1D },
2419 .{ 0x1E1F, 0x1E1F },
2420 .{ 0x1E21, 0x1E21 },
2421 .{ 0x1E23, 0x1E23 },
2422 .{ 0x1E25, 0x1E25 },
2423 .{ 0x1E27, 0x1E27 },
2424 .{ 0x1E29, 0x1E29 },
2425 .{ 0x1E2B, 0x1E2B },
2426 .{ 0x1E2D, 0x1E2D },
2427 .{ 0x1E2F, 0x1E2F },
2428 .{ 0x1E31, 0x1E31 },
2429 .{ 0x1E33, 0x1E33 },
2430 .{ 0x1E35, 0x1E35 },
2431 .{ 0x1E37, 0x1E37 },
2432 .{ 0x1E39, 0x1E39 },
2433 .{ 0x1E3B, 0x1E3B },
2434 .{ 0x1E3D, 0x1E3D },
2435 .{ 0x1E3F, 0x1E3F },
2436 .{ 0x1E41, 0x1E41 },
2437 .{ 0x1E43, 0x1E43 },
2438 .{ 0x1E45, 0x1E45 },
2439 .{ 0x1E47, 0x1E47 },
2440 .{ 0x1E49, 0x1E49 },
2441 .{ 0x1E4B, 0x1E4B },
2442 .{ 0x1E4D, 0x1E4D },
2443 .{ 0x1E4F, 0x1E4F },
2444 .{ 0x1E51, 0x1E51 },
2445 .{ 0x1E53, 0x1E53 },
2446 .{ 0x1E55, 0x1E55 },
2447 .{ 0x1E57, 0x1E57 },
2448 .{ 0x1E59, 0x1E59 },
2449 .{ 0x1E5B, 0x1E5B },
2450 .{ 0x1E5D, 0x1E5D },
2451 .{ 0x1E5F, 0x1E5F },
2452 .{ 0x1E61, 0x1E61 },
2453 .{ 0x1E63, 0x1E63 },
2454 .{ 0x1E65, 0x1E65 },
2455 .{ 0x1E67, 0x1E67 },
2456 .{ 0x1E69, 0x1E69 },
2457 .{ 0x1E6B, 0x1E6B },
2458 .{ 0x1E6D, 0x1E6D },
2459 .{ 0x1E6F, 0x1E6F },
2460 .{ 0x1E71, 0x1E71 },
2461 .{ 0x1E73, 0x1E73 },
2462 .{ 0x1E75, 0x1E75 },
2463 .{ 0x1E77, 0x1E77 },
2464 .{ 0x1E79, 0x1E79 },
2465 .{ 0x1E7B, 0x1E7B },
2466 .{ 0x1E7D, 0x1E7D },
2467 .{ 0x1E7F, 0x1E7F },
2468 .{ 0x1E81, 0x1E81 },
2469 .{ 0x1E83, 0x1E83 },
2470 .{ 0x1E85, 0x1E85 },
2471 .{ 0x1E87, 0x1E87 },
2472 .{ 0x1E89, 0x1E89 },
2473 .{ 0x1E8B, 0x1E8B },
2474 .{ 0x1E8D, 0x1E8D },
2475 .{ 0x1E8F, 0x1E8F },
2476 .{ 0x1E91, 0x1E91 },
2477 .{ 0x1E93, 0x1E93 },
2478 .{ 0x1E95, 0x1E9D },
2479 .{ 0x1E9F, 0x1E9F },
2480 .{ 0x1EA1, 0x1EA1 },
2481 .{ 0x1EA3, 0x1EA3 },
2482 .{ 0x1EA5, 0x1EA5 },
2483 .{ 0x1EA7, 0x1EA7 },
2484 .{ 0x1EA9, 0x1EA9 },
2485 .{ 0x1EAB, 0x1EAB },
2486 .{ 0x1EAD, 0x1EAD },
2487 .{ 0x1EAF, 0x1EAF },
2488 .{ 0x1EB1, 0x1EB1 },
2489 .{ 0x1EB3, 0x1EB3 },
2490 .{ 0x1EB5, 0x1EB5 },
2491 .{ 0x1EB7, 0x1EB7 },
2492 .{ 0x1EB9, 0x1EB9 },
2493 .{ 0x1EBB, 0x1EBB },
2494 .{ 0x1EBD, 0x1EBD },
2495 .{ 0x1EBF, 0x1EBF },
2496 .{ 0x1EC1, 0x1EC1 },
2497 .{ 0x1EC3, 0x1EC3 },
2498 .{ 0x1EC5, 0x1EC5 },
2499 .{ 0x1EC7, 0x1EC7 },
2500 .{ 0x1EC9, 0x1EC9 },
2501 .{ 0x1ECB, 0x1ECB },
2502 .{ 0x1ECD, 0x1ECD },
2503 .{ 0x1ECF, 0x1ECF },
2504 .{ 0x1ED1, 0x1ED1 },
2505 .{ 0x1ED3, 0x1ED3 },
2506 .{ 0x1ED5, 0x1ED5 },
2507 .{ 0x1ED7, 0x1ED7 },
2508 .{ 0x1ED9, 0x1ED9 },
2509 .{ 0x1EDB, 0x1EDB },
2510 .{ 0x1EDD, 0x1EDD },
2511 .{ 0x1EDF, 0x1EDF },
2512 .{ 0x1EE1, 0x1EE1 },
2513 .{ 0x1EE3, 0x1EE3 },
2514 .{ 0x1EE5, 0x1EE5 },
2515 .{ 0x1EE7, 0x1EE7 },
2516 .{ 0x1EE9, 0x1EE9 },
2517 .{ 0x1EEB, 0x1EEB },
2518 .{ 0x1EED, 0x1EED },
2519 .{ 0x1EEF, 0x1EEF },
2520 .{ 0x1EF1, 0x1EF1 },
2521 .{ 0x1EF3, 0x1EF3 },
2522 .{ 0x1EF5, 0x1EF5 },
2523 .{ 0x1EF7, 0x1EF7 },
2524 .{ 0x1EF9, 0x1EF9 },
2525 .{ 0x1EFB, 0x1EFB },
2526 .{ 0x1EFD, 0x1EFD },
2527 .{ 0x1EFF, 0x1EFF },
2528 .{ 0x2018, 0x201A },
2529 .{ 0x201C, 0x201E },
2530 .{ 0x2329, 0x232A },
2531 .{ 0x27E6, 0x27E7 },
2532 .{ 0x2C61, 0x2C61 },
2533 .{ 0x2C65, 0x2C66 },
2534 .{ 0x2C68, 0x2C68 },
2535 .{ 0x2C6A, 0x2C6A },
2536 .{ 0x2C6C, 0x2C6C },
2537 .{ 0x2C71, 0x2C71 },
2538 .{ 0x2C73, 0x2C74 },
2539 .{ 0x2C76, 0x2C7B },
2540 .{ 0x2E80, 0x2FDF },
2541 .{ 0x2FF0, 0x30FF },
2542 .{ 0x31C0, 0x31EF },
2543 .{ 0x3200, 0x4DBF },
2544 .{ 0x4E00, 0x9FFF },
2545 .{ 0xA723, 0xA723 },
2546 .{ 0xA725, 0xA725 },
2547 .{ 0xA727, 0xA727 },
2548 .{ 0xA729, 0xA729 },
2549 .{ 0xA72B, 0xA72B },
2550 .{ 0xA72D, 0xA72D },
2551 .{ 0xA72F, 0xA731 },
2552 .{ 0xA733, 0xA733 },
2553 .{ 0xA735, 0xA735 },
2554 .{ 0xA737, 0xA737 },
2555 .{ 0xA739, 0xA739 },
2556 .{ 0xA73B, 0xA73B },
2557 .{ 0xA73D, 0xA73D },
2558 .{ 0xA73F, 0xA73F },
2559 .{ 0xA741, 0xA741 },
2560 .{ 0xA743, 0xA743 },
2561 .{ 0xA745, 0xA745 },
2562 .{ 0xA747, 0xA747 },
2563 .{ 0xA749, 0xA749 },
2564 .{ 0xA74B, 0xA74B },
2565 .{ 0xA74D, 0xA74D },
2566 .{ 0xA74F, 0xA74F },
2567 .{ 0xA751, 0xA751 },
2568 .{ 0xA753, 0xA753 },
2569 .{ 0xA755, 0xA755 },
2570 .{ 0xA757, 0xA757 },
2571 .{ 0xA759, 0xA759 },
2572 .{ 0xA75B, 0xA75B },
2573 .{ 0xA75D, 0xA75D },
2574 .{ 0xA75F, 0xA75F },
2575 .{ 0xA761, 0xA761 },
2576 .{ 0xA763, 0xA763 },
2577 .{ 0xA765, 0xA765 },
2578 .{ 0xA767, 0xA767 },
2579 .{ 0xA769, 0xA769 },
2580 .{ 0xA76B, 0xA76B },
2581 .{ 0xA76D, 0xA76D },
2582 .{ 0xA76F, 0xA76F },
2583 .{ 0xA771, 0xA778 },
2584 .{ 0xA77A, 0xA77A },
2585 .{ 0xA77C, 0xA77C },
2586 .{ 0xA77F, 0xA77F },
2587 .{ 0xA781, 0xA781 },
2588 .{ 0xA783, 0xA783 },
2589 .{ 0xA785, 0xA785 },
2590 .{ 0xA787, 0xA787 },
2591 .{ 0xA78C, 0xA78C },
2592 .{ 0xA78E, 0xA78E },
2593 .{ 0xA791, 0xA791 },
2594 .{ 0xA793, 0xA795 },
2595 .{ 0xA797, 0xA797 },
2596 .{ 0xA799, 0xA799 },
2597 .{ 0xA79B, 0xA79B },
2598 .{ 0xA79D, 0xA79D },
2599 .{ 0xA79F, 0xA79F },
2600 .{ 0xA7A1, 0xA7A1 },
2601 .{ 0xA7A3, 0xA7A3 },
2602 .{ 0xA7A5, 0xA7A5 },
2603 .{ 0xA7A7, 0xA7A7 },
2604 .{ 0xA7A9, 0xA7A9 },
2605 .{ 0xA7AF, 0xA7AF },
2606 .{ 0xA7B5, 0xA7B5 },
2607 .{ 0xA7B7, 0xA7B7 },
2608 .{ 0xA7B9, 0xA7B9 },
2609 .{ 0xA7FA, 0xA7FA },
2610 .{ 0xAB30, 0xAB5A },
2611 .{ 0xAB60, 0xAB64 },
2612 .{ 0xAC00, 0xD7AF },
2613 .{ 0xF900, 0xFAFF },
2614 .{ 0xFB1D, 0xFBB1 },
2615 .{ 0xFBD3, 0xFD3D },
2616 .{ 0xFD50, 0xFDC7 },
2617 .{ 0xFDF0, 0xFDFB },
2618 .{ 0xFE30, 0xFE4F },
2619 .{ 0xFE70, 0xFEFC },
2620 .{ 0xFF08, 0xFF09 },
2621 .{ 0xFF41, 0xFF5A },
2622 .{ 0x1EE00, 0x1EEBB },
2623 .{ 0x1F200, 0x1F2FF },
2624 .{ 0x20000, 0x2A6DF },
2625 .{ 0x2A700, 0x2EBEF },
2626 .{ 0x2F800, 0x2FA1F },
2627};
2628
2629pub fn is_infix_4_behind(c: u21) bool {
2630 return rangeContains(&is_infix_4_behind_ranges, c);
2631}
2632
2633pub const is_infix_5_ahead_ranges = [_][2]u21{
2634 .{ 0x0041, 0x005A },
2635 .{ 0x0061, 0x007A },
2636 .{ 0x00C0, 0x00D6 },
2637 .{ 0x00D8, 0x00F6 },
2638 .{ 0x00F8, 0x01BF },
2639 .{ 0x01C4, 0x02AF },
2640 .{ 0x0386, 0x0386 },
2641 .{ 0x0388, 0x038A },
2642 .{ 0x038C, 0x038C },
2643 .{ 0x038E, 0x038F },
2644 .{ 0x0391, 0x03A9 },
2645 .{ 0x03AC, 0x03AF },
2646 .{ 0x03B1, 0x03C9 },
2647 .{ 0x03CC, 0x03CE },
2648 .{ 0x0400, 0x0401 },
2649 .{ 0x0403, 0x040A },
2650 .{ 0x040C, 0x040D },
2651 .{ 0x0410, 0x0451 },
2652 .{ 0x0453, 0x045A },
2653 .{ 0x045C, 0x045D },
2654 .{ 0x0490, 0x0491 },
2655 .{ 0x0496, 0x0497 },
2656 .{ 0x04A2, 0x04A3 },
2657 .{ 0x04AE, 0x04AF },
2658 .{ 0x04BA, 0x04BB },
2659 .{ 0x04D8, 0x04D9 },
2660 .{ 0x04E8, 0x04E9 },
2661 .{ 0x0591, 0x05F4 },
2662 .{ 0x0620, 0x064A },
2663 .{ 0x066E, 0x06D5 },
2664 .{ 0x06E5, 0x06FF },
2665 .{ 0x0750, 0x077F },
2666 .{ 0x08A0, 0x08BD },
2667 .{ 0x0900, 0x09FF },
2668 .{ 0x0B80, 0x0CFF },
2669 .{ 0x0D80, 0x0DFF },
2670 .{ 0x1100, 0x137F },
2671 .{ 0x1D00, 0x1D25 },
2672 .{ 0x1D6B, 0x1D77 },
2673 .{ 0x1D79, 0x1D9A },
2674 .{ 0x1E00, 0x1EFF },
2675 .{ 0x2C60, 0x2C7B },
2676 .{ 0x2C7E, 0x2C7F },
2677 .{ 0x2E80, 0x2FDF },
2678 .{ 0x2FF0, 0x30FF },
2679 .{ 0x31C0, 0x31EF },
2680 .{ 0x3200, 0x4DBF },
2681 .{ 0x4E00, 0x9FFF },
2682 .{ 0xA722, 0xA76F },
2683 .{ 0xA771, 0xA787 },
2684 .{ 0xA78B, 0xA78E },
2685 .{ 0xA790, 0xA7B9 },
2686 .{ 0xA7FA, 0xA7FA },
2687 .{ 0xAB30, 0xAB5A },
2688 .{ 0xAB60, 0xAB64 },
2689 .{ 0xAC00, 0xD7AF },
2690 .{ 0xF900, 0xFAFF },
2691 .{ 0xFB1D, 0xFBB1 },
2692 .{ 0xFBD3, 0xFD3D },
2693 .{ 0xFD50, 0xFDC7 },
2694 .{ 0xFDF0, 0xFDFB },
2695 .{ 0xFE30, 0xFE4F },
2696 .{ 0xFE70, 0xFEFC },
2697 .{ 0xFF21, 0xFF3A },
2698 .{ 0xFF41, 0xFF5A },
2699 .{ 0x1EE00, 0x1EEBB },
2700 .{ 0x1F200, 0x1F2FF },
2701 .{ 0x20000, 0x2A6DF },
2702 .{ 0x2A700, 0x2EBEF },
2703 .{ 0x2F800, 0x2FA1F },
2704};
2705
2706pub fn is_infix_5_ahead(c: u21) bool {
2707 return rangeContains(&is_infix_5_ahead_ranges, c);
2708}
2709
2710pub const is_infix_5_behind_ranges = [_][2]u21{
2711 .{ 0x0041, 0x005A },
2712 .{ 0x0061, 0x007A },
2713 .{ 0x00C0, 0x00D6 },
2714 .{ 0x00D8, 0x00F6 },
2715 .{ 0x00F8, 0x01BF },
2716 .{ 0x01C4, 0x02AF },
2717 .{ 0x0386, 0x0386 },
2718 .{ 0x0388, 0x038A },
2719 .{ 0x038C, 0x038C },
2720 .{ 0x038E, 0x038F },
2721 .{ 0x0391, 0x03A9 },
2722 .{ 0x03AC, 0x03AF },
2723 .{ 0x03B1, 0x03C9 },
2724 .{ 0x03CC, 0x03CE },
2725 .{ 0x0400, 0x0401 },
2726 .{ 0x0403, 0x040A },
2727 .{ 0x040C, 0x040D },
2728 .{ 0x0410, 0x0451 },
2729 .{ 0x0453, 0x045A },
2730 .{ 0x045C, 0x045D },
2731 .{ 0x0490, 0x0491 },
2732 .{ 0x0496, 0x0497 },
2733 .{ 0x04A2, 0x04A3 },
2734 .{ 0x04AE, 0x04AF },
2735 .{ 0x04BA, 0x04BB },
2736 .{ 0x04D8, 0x04D9 },
2737 .{ 0x04E8, 0x04E9 },
2738 .{ 0x0591, 0x05F4 },
2739 .{ 0x0620, 0x064A },
2740 .{ 0x066E, 0x06D5 },
2741 .{ 0x06E5, 0x06FF },
2742 .{ 0x0750, 0x077F },
2743 .{ 0x08A0, 0x08BD },
2744 .{ 0x0900, 0x09FF },
2745 .{ 0x0B80, 0x0CFF },
2746 .{ 0x0D80, 0x0DFF },
2747 .{ 0x1100, 0x137F },
2748 .{ 0x1D00, 0x1D25 },
2749 .{ 0x1D6B, 0x1D77 },
2750 .{ 0x1D79, 0x1D9A },
2751 .{ 0x1E00, 0x1EFF },
2752 .{ 0x2C60, 0x2C7B },
2753 .{ 0x2C7E, 0x2C7F },
2754 .{ 0x2E80, 0x2FDF },
2755 .{ 0x2FF0, 0x30FF },
2756 .{ 0x31C0, 0x31EF },
2757 .{ 0x3200, 0x4DBF },
2758 .{ 0x4E00, 0x9FFF },
2759 .{ 0xA722, 0xA76F },
2760 .{ 0xA771, 0xA787 },
2761 .{ 0xA78B, 0xA78E },
2762 .{ 0xA790, 0xA7B9 },
2763 .{ 0xA7FA, 0xA7FA },
2764 .{ 0xAB30, 0xAB5A },
2765 .{ 0xAB60, 0xAB64 },
2766 .{ 0xAC00, 0xD7AF },
2767 .{ 0xF900, 0xFAFF },
2768 .{ 0xFB1D, 0xFBB1 },
2769 .{ 0xFBD3, 0xFD3D },
2770 .{ 0xFD50, 0xFDC7 },
2771 .{ 0xFDF0, 0xFDFB },
2772 .{ 0xFE30, 0xFE4F },
2773 .{ 0xFE70, 0xFEFC },
2774 .{ 0xFF21, 0xFF3A },
2775 .{ 0xFF41, 0xFF5A },
2776 .{ 0x1EE00, 0x1EEBB },
2777 .{ 0x1F200, 0x1F2FF },
2778 .{ 0x20000, 0x2A6DF },
2779 .{ 0x2A700, 0x2EBEF },
2780 .{ 0x2F800, 0x2FA1F },
2781};
2782
2783pub fn is_infix_5_behind(c: u21) bool {
2784 return rangeContains(&is_infix_5_behind_ranges, c);
2785}
2786
2787pub const is_infix_6_ahead_ranges = [_][2]u21{
2788 .{ 0x0041, 0x005A },
2789 .{ 0x0061, 0x007A },
2790 .{ 0x00C0, 0x00D6 },
2791 .{ 0x00D8, 0x00F6 },
2792 .{ 0x00F8, 0x01BF },
2793 .{ 0x01C4, 0x02AF },
2794 .{ 0x0386, 0x0386 },
2795 .{ 0x0388, 0x038A },
2796 .{ 0x038C, 0x038C },
2797 .{ 0x038E, 0x038F },
2798 .{ 0x0391, 0x03A9 },
2799 .{ 0x03AC, 0x03AF },
2800 .{ 0x03B1, 0x03C9 },
2801 .{ 0x03CC, 0x03CE },
2802 .{ 0x0400, 0x0401 },
2803 .{ 0x0403, 0x040A },
2804 .{ 0x040C, 0x040D },
2805 .{ 0x0410, 0x0451 },
2806 .{ 0x0453, 0x045A },
2807 .{ 0x045C, 0x045D },
2808 .{ 0x0490, 0x0491 },
2809 .{ 0x0496, 0x0497 },
2810 .{ 0x04A2, 0x04A3 },
2811 .{ 0x04AE, 0x04AF },
2812 .{ 0x04BA, 0x04BB },
2813 .{ 0x04D8, 0x04D9 },
2814 .{ 0x04E8, 0x04E9 },
2815 .{ 0x0591, 0x05F4 },
2816 .{ 0x0620, 0x064A },
2817 .{ 0x066E, 0x06D5 },
2818 .{ 0x06E5, 0x06FF },
2819 .{ 0x0750, 0x077F },
2820 .{ 0x08A0, 0x08BD },
2821 .{ 0x0900, 0x09FF },
2822 .{ 0x0B80, 0x0CFF },
2823 .{ 0x0D80, 0x0DFF },
2824 .{ 0x1100, 0x137F },
2825 .{ 0x1D00, 0x1D25 },
2826 .{ 0x1D6B, 0x1D77 },
2827 .{ 0x1D79, 0x1D9A },
2828 .{ 0x1E00, 0x1EFF },
2829 .{ 0x2C60, 0x2C7B },
2830 .{ 0x2C7E, 0x2C7F },
2831 .{ 0x2E80, 0x2FDF },
2832 .{ 0x2FF0, 0x30FF },
2833 .{ 0x31C0, 0x31EF },
2834 .{ 0x3200, 0x4DBF },
2835 .{ 0x4E00, 0x9FFF },
2836 .{ 0xA722, 0xA76F },
2837 .{ 0xA771, 0xA787 },
2838 .{ 0xA78B, 0xA78E },
2839 .{ 0xA790, 0xA7B9 },
2840 .{ 0xA7FA, 0xA7FA },
2841 .{ 0xAB30, 0xAB5A },
2842 .{ 0xAB60, 0xAB64 },
2843 .{ 0xAC00, 0xD7AF },
2844 .{ 0xF900, 0xFAFF },
2845 .{ 0xFB1D, 0xFBB1 },
2846 .{ 0xFBD3, 0xFD3D },
2847 .{ 0xFD50, 0xFDC7 },
2848 .{ 0xFDF0, 0xFDFB },
2849 .{ 0xFE30, 0xFE4F },
2850 .{ 0xFE70, 0xFEFC },
2851 .{ 0xFF21, 0xFF3A },
2852 .{ 0xFF41, 0xFF5A },
2853 .{ 0x1EE00, 0x1EEBB },
2854 .{ 0x1F200, 0x1F2FF },
2855 .{ 0x20000, 0x2A6DF },
2856 .{ 0x2A700, 0x2EBEF },
2857 .{ 0x2F800, 0x2FA1F },
2858};
2859
2860pub fn is_infix_6_ahead(c: u21) bool {
2861 return rangeContains(&is_infix_6_ahead_ranges, c);
2862}
2863
2864pub const is_infix_6_behind_ranges = [_][2]u21{
2865 .{ 0x0030, 0x0039 },
2866 .{ 0x0041, 0x005A },
2867 .{ 0x0061, 0x007A },
2868 .{ 0x00C0, 0x00D6 },
2869 .{ 0x00D8, 0x00F6 },
2870 .{ 0x00F8, 0x01BF },
2871 .{ 0x01C4, 0x02AF },
2872 .{ 0x0386, 0x0386 },
2873 .{ 0x0388, 0x038A },
2874 .{ 0x038C, 0x038C },
2875 .{ 0x038E, 0x038F },
2876 .{ 0x0391, 0x03A9 },
2877 .{ 0x03AC, 0x03AF },
2878 .{ 0x03B1, 0x03C9 },
2879 .{ 0x03CC, 0x03CE },
2880 .{ 0x0400, 0x0401 },
2881 .{ 0x0403, 0x040A },
2882 .{ 0x040C, 0x040D },
2883 .{ 0x0410, 0x0451 },
2884 .{ 0x0453, 0x045A },
2885 .{ 0x045C, 0x045D },
2886 .{ 0x0490, 0x0491 },
2887 .{ 0x0496, 0x0497 },
2888 .{ 0x04A2, 0x04A3 },
2889 .{ 0x04AE, 0x04AF },
2890 .{ 0x04BA, 0x04BB },
2891 .{ 0x04D8, 0x04D9 },
2892 .{ 0x04E8, 0x04E9 },
2893 .{ 0x0591, 0x05F4 },
2894 .{ 0x0620, 0x064A },
2895 .{ 0x066E, 0x06D5 },
2896 .{ 0x06E5, 0x06FF },
2897 .{ 0x0750, 0x077F },
2898 .{ 0x08A0, 0x08BD },
2899 .{ 0x0900, 0x09FF },
2900 .{ 0x0B80, 0x0CFF },
2901 .{ 0x0D80, 0x0DFF },
2902 .{ 0x1100, 0x137F },
2903 .{ 0x1D00, 0x1D25 },
2904 .{ 0x1D6B, 0x1D77 },
2905 .{ 0x1D79, 0x1D9A },
2906 .{ 0x1E00, 0x1EFF },
2907 .{ 0x2C60, 0x2C7B },
2908 .{ 0x2C7E, 0x2C7F },
2909 .{ 0x2E80, 0x2FDF },
2910 .{ 0x2FF0, 0x30FF },
2911 .{ 0x31C0, 0x31EF },
2912 .{ 0x3200, 0x4DBF },
2913 .{ 0x4E00, 0x9FFF },
2914 .{ 0xA722, 0xA76F },
2915 .{ 0xA771, 0xA787 },
2916 .{ 0xA78B, 0xA78E },
2917 .{ 0xA790, 0xA7B9 },
2918 .{ 0xA7FA, 0xA7FA },
2919 .{ 0xAB30, 0xAB5A },
2920 .{ 0xAB60, 0xAB64 },
2921 .{ 0xAC00, 0xD7AF },
2922 .{ 0xF900, 0xFAFF },
2923 .{ 0xFB1D, 0xFBB1 },
2924 .{ 0xFBD3, 0xFD3D },
2925 .{ 0xFD50, 0xFDC7 },
2926 .{ 0xFDF0, 0xFDFB },
2927 .{ 0xFE30, 0xFE4F },
2928 .{ 0xFE70, 0xFEFC },
2929 .{ 0xFF21, 0xFF3A },
2930 .{ 0xFF41, 0xFF5A },
2931 .{ 0x1EE00, 0x1EEBB },
2932 .{ 0x1F200, 0x1F2FF },
2933 .{ 0x20000, 0x2A6DF },
2934 .{ 0x2A700, 0x2EBEF },
2935 .{ 0x2F800, 0x2FA1F },
2936};
2937
2938pub fn is_infix_6_behind(c: u21) bool {
2939 return rangeContains(&is_infix_6_behind_ranges, c);
2940}
2941
2942pub const is_infix_7_ahead_ranges = [_][2]u21{
2943 .{ 0x0041, 0x005A },
2944 .{ 0x0061, 0x007A },
2945 .{ 0x00C0, 0x00D6 },
2946 .{ 0x00D8, 0x00F6 },
2947 .{ 0x00F8, 0x01BF },
2948 .{ 0x01C4, 0x02AF },
2949 .{ 0x0386, 0x0386 },
2950 .{ 0x0388, 0x038A },
2951 .{ 0x038C, 0x038C },
2952 .{ 0x038E, 0x038F },
2953 .{ 0x0391, 0x03A9 },
2954 .{ 0x03AC, 0x03AF },
2955 .{ 0x03B1, 0x03C9 },
2956 .{ 0x03CC, 0x03CE },
2957 .{ 0x0400, 0x0401 },
2958 .{ 0x0403, 0x040A },
2959 .{ 0x040C, 0x040D },
2960 .{ 0x0410, 0x0451 },
2961 .{ 0x0453, 0x045A },
2962 .{ 0x045C, 0x045D },
2963 .{ 0x0490, 0x0491 },
2964 .{ 0x0496, 0x0497 },
2965 .{ 0x04A2, 0x04A3 },
2966 .{ 0x04AE, 0x04AF },
2967 .{ 0x04BA, 0x04BB },
2968 .{ 0x04D8, 0x04D9 },
2969 .{ 0x04E8, 0x04E9 },
2970 .{ 0x0591, 0x05F4 },
2971 .{ 0x0620, 0x064A },
2972 .{ 0x066E, 0x06D5 },
2973 .{ 0x06E5, 0x06FF },
2974 .{ 0x0750, 0x077F },
2975 .{ 0x08A0, 0x08BD },
2976 .{ 0x0900, 0x09FF },
2977 .{ 0x0B80, 0x0CFF },
2978 .{ 0x0D80, 0x0DFF },
2979 .{ 0x1100, 0x137F },
2980 .{ 0x1D00, 0x1D25 },
2981 .{ 0x1D6B, 0x1D77 },
2982 .{ 0x1D79, 0x1D9A },
2983 .{ 0x1E00, 0x1EFF },
2984 .{ 0x2C60, 0x2C7B },
2985 .{ 0x2C7E, 0x2C7F },
2986 .{ 0x2E80, 0x2FDF },
2987 .{ 0x2FF0, 0x30FF },
2988 .{ 0x31C0, 0x31EF },
2989 .{ 0x3200, 0x4DBF },
2990 .{ 0x4E00, 0x9FFF },
2991 .{ 0xA722, 0xA76F },
2992 .{ 0xA771, 0xA787 },
2993 .{ 0xA78B, 0xA78E },
2994 .{ 0xA790, 0xA7B9 },
2995 .{ 0xA7FA, 0xA7FA },
2996 .{ 0xAB30, 0xAB5A },
2997 .{ 0xAB60, 0xAB64 },
2998 .{ 0xAC00, 0xD7AF },
2999 .{ 0xF900, 0xFAFF },
3000 .{ 0xFB1D, 0xFBB1 },
3001 .{ 0xFBD3, 0xFD3D },
3002 .{ 0xFD50, 0xFDC7 },
3003 .{ 0xFDF0, 0xFDFB },
3004 .{ 0xFE30, 0xFE4F },
3005 .{ 0xFE70, 0xFEFC },
3006 .{ 0xFF21, 0xFF3A },
3007 .{ 0xFF41, 0xFF5A },
3008 .{ 0x1EE00, 0x1EEBB },
3009 .{ 0x1F200, 0x1F2FF },
3010 .{ 0x20000, 0x2A6DF },
3011 .{ 0x2A700, 0x2EBEF },
3012 .{ 0x2F800, 0x2FA1F },
3013};
3014
3015pub fn is_infix_7_ahead(c: u21) bool {
3016 return rangeContains(&is_infix_7_ahead_ranges, c);
3017}
3018
3019pub const is_infix_7_behind_ranges = [_][2]u21{
3020 .{ 0x0030, 0x0039 },
3021 .{ 0x0041, 0x005A },
3022 .{ 0x0061, 0x007A },
3023 .{ 0x00C0, 0x00D6 },
3024 .{ 0x00D8, 0x00F6 },
3025 .{ 0x00F8, 0x01BF },
3026 .{ 0x01C4, 0x02AF },
3027 .{ 0x0386, 0x0386 },
3028 .{ 0x0388, 0x038A },
3029 .{ 0x038C, 0x038C },
3030 .{ 0x038E, 0x038F },
3031 .{ 0x0391, 0x03A9 },
3032 .{ 0x03AC, 0x03AF },
3033 .{ 0x03B1, 0x03C9 },
3034 .{ 0x03CC, 0x03CE },
3035 .{ 0x0400, 0x0401 },
3036 .{ 0x0403, 0x040A },
3037 .{ 0x040C, 0x040D },
3038 .{ 0x0410, 0x0451 },
3039 .{ 0x0453, 0x045A },
3040 .{ 0x045C, 0x045D },
3041 .{ 0x0490, 0x0491 },
3042 .{ 0x0496, 0x0497 },
3043 .{ 0x04A2, 0x04A3 },
3044 .{ 0x04AE, 0x04AF },
3045 .{ 0x04BA, 0x04BB },
3046 .{ 0x04D8, 0x04D9 },
3047 .{ 0x04E8, 0x04E9 },
3048 .{ 0x0591, 0x05F4 },
3049 .{ 0x0620, 0x064A },
3050 .{ 0x066E, 0x06D5 },
3051 .{ 0x06E5, 0x06FF },
3052 .{ 0x0750, 0x077F },
3053 .{ 0x08A0, 0x08BD },
3054 .{ 0x0900, 0x09FF },
3055 .{ 0x0B80, 0x0CFF },
3056 .{ 0x0D80, 0x0DFF },
3057 .{ 0x1100, 0x137F },
3058 .{ 0x1D00, 0x1D25 },
3059 .{ 0x1D6B, 0x1D77 },
3060 .{ 0x1D79, 0x1D9A },
3061 .{ 0x1E00, 0x1EFF },
3062 .{ 0x2C60, 0x2C7B },
3063 .{ 0x2C7E, 0x2C7F },
3064 .{ 0x2E80, 0x2FDF },
3065 .{ 0x2FF0, 0x30FF },
3066 .{ 0x31C0, 0x31EF },
3067 .{ 0x3200, 0x4DBF },
3068 .{ 0x4E00, 0x9FFF },
3069 .{ 0xA722, 0xA76F },
3070 .{ 0xA771, 0xA787 },
3071 .{ 0xA78B, 0xA78E },
3072 .{ 0xA790, 0xA7B9 },
3073 .{ 0xA7FA, 0xA7FA },
3074 .{ 0xAB30, 0xAB5A },
3075 .{ 0xAB60, 0xAB64 },
3076 .{ 0xAC00, 0xD7AF },
3077 .{ 0xF900, 0xFAFF },
3078 .{ 0xFB1D, 0xFBB1 },
3079 .{ 0xFBD3, 0xFD3D },
3080 .{ 0xFD50, 0xFDC7 },
3081 .{ 0xFDF0, 0xFDFB },
3082 .{ 0xFE30, 0xFE4F },
3083 .{ 0xFE70, 0xFEFC },
3084 .{ 0xFF21, 0xFF3A },
3085 .{ 0xFF41, 0xFF5A },
3086 .{ 0x1EE00, 0x1EEBB },
3087 .{ 0x1F200, 0x1F2FF },
3088 .{ 0x20000, 0x2A6DF },
3089 .{ 0x2A700, 0x2EBEF },
3090 .{ 0x2F800, 0x2FA1F },
3091};
3092
3093pub fn is_infix_7_behind(c: u21) bool {
3094 return rangeContains(&is_infix_7_behind_ranges, c);
3095}
3096
3097// ── special cases ──
3098
3099pub const SpecialCase = struct {
3100 tokens: [3][]const u8,
3101 len: u8,
3102};
3103
3104pub const specials = std.StaticStringMap(SpecialCase).initComptime(.{
3105 .{ "\t", SpecialCase{ .tokens = .{ "\t", "", "" }, .len = 1 } },
3106 .{ "\n", SpecialCase{ .tokens = .{ "\n", "", "" }, .len = 1 } },
3107 .{ " ", SpecialCase{ .tokens = .{ " ", "", "" }, .len = 1 } },
3108 .{ "'", SpecialCase{ .tokens = .{ "'", "", "" }, .len = 1 } },
3109 .{ "''", SpecialCase{ .tokens = .{ "''", "", "" }, .len = 1 } },
3110 .{ "'Cause", SpecialCase{ .tokens = .{ "'Cause", "", "" }, .len = 1 } },
3111 .{ "'Cos", SpecialCase{ .tokens = .{ "'Cos", "", "" }, .len = 1 } },
3112 .{ "'Coz", SpecialCase{ .tokens = .{ "'Coz", "", "" }, .len = 1 } },
3113 .{ "'Cuz", SpecialCase{ .tokens = .{ "'Cuz", "", "" }, .len = 1 } },
3114 .{ "'S", SpecialCase{ .tokens = .{ "'S", "", "" }, .len = 1 } },
3115 .{ "'bout", SpecialCase{ .tokens = .{ "'bout", "", "" }, .len = 1 } },
3116 .{ "'cause", SpecialCase{ .tokens = .{ "'cause", "", "" }, .len = 1 } },
3117 .{ "'cos", SpecialCase{ .tokens = .{ "'cos", "", "" }, .len = 1 } },
3118 .{ "'coz", SpecialCase{ .tokens = .{ "'coz", "", "" }, .len = 1 } },
3119 .{ "'cuz", SpecialCase{ .tokens = .{ "'cuz", "", "" }, .len = 1 } },
3120 .{ "'d", SpecialCase{ .tokens = .{ "'d", "", "" }, .len = 1 } },
3121 .{ "'em", SpecialCase{ .tokens = .{ "'em", "", "" }, .len = 1 } },
3122 .{ "'ll", SpecialCase{ .tokens = .{ "'ll", "", "" }, .len = 1 } },
3123 .{ "'nuff", SpecialCase{ .tokens = .{ "'nuff", "", "" }, .len = 1 } },
3124 .{ "'re", SpecialCase{ .tokens = .{ "'re", "", "" }, .len = 1 } },
3125 .{ "'s", SpecialCase{ .tokens = .{ "'s", "", "" }, .len = 1 } },
3126 .{ "(*_*)", SpecialCase{ .tokens = .{ "(*_*)", "", "" }, .len = 1 } },
3127 .{ "(-8", SpecialCase{ .tokens = .{ "(-8", "", "" }, .len = 1 } },
3128 .{ "(-:", SpecialCase{ .tokens = .{ "(-:", "", "" }, .len = 1 } },
3129 .{ "(-;", SpecialCase{ .tokens = .{ "(-;", "", "" }, .len = 1 } },
3130 .{ "(-_-)", SpecialCase{ .tokens = .{ "(-_-)", "", "" }, .len = 1 } },
3131 .{ "(._.)", SpecialCase{ .tokens = .{ "(._.)", "", "" }, .len = 1 } },
3132 .{ "(:", SpecialCase{ .tokens = .{ "(:", "", "" }, .len = 1 } },
3133 .{ "(;", SpecialCase{ .tokens = .{ "(;", "", "" }, .len = 1 } },
3134 .{ "(=", SpecialCase{ .tokens = .{ "(=", "", "" }, .len = 1 } },
3135 .{ "(>_<)", SpecialCase{ .tokens = .{ "(>_<)", "", "" }, .len = 1 } },
3136 .{ "(^_^)", SpecialCase{ .tokens = .{ "(^_^)", "", "" }, .len = 1 } },
3137 .{ "(o:", SpecialCase{ .tokens = .{ "(o:", "", "" }, .len = 1 } },
3138 .{ "(\xc2\xac_\xc2\xac)", SpecialCase{ .tokens = .{ "(\xc2\xac_\xc2\xac)", "", "" }, .len = 1 } },
3139 .{ "(\xe0\xb2\xa0_\xe0\xb2\xa0)", SpecialCase{ .tokens = .{ "(\xe0\xb2\xa0_\xe0\xb2\xa0)", "", "" }, .len = 1 } },
3140 .{ "(\xe2\x95\xaf\xc2\xb0\xe2\x96\xa1\xc2\xb0\xef\xbc\x89\xe2\x95\xaf\xef\xb8\xb5\xe2\x94\xbb\xe2\x94\x81\xe2\x94\xbb", SpecialCase{ .tokens = .{ "(\xe2\x95\xaf\xc2\xb0\xe2\x96\xa1\xc2\xb0\xef\xbc\x89\xe2\x95\xaf\xef\xb8\xb5\xe2\x94\xbb\xe2\x94\x81\xe2\x94\xbb", "", "" }, .len = 1 } },
3141 .{ ")-:", SpecialCase{ .tokens = .{ ")-:", "", "" }, .len = 1 } },
3142 .{ "):", SpecialCase{ .tokens = .{ "):", "", "" }, .len = 1 } },
3143 .{ "-_-", SpecialCase{ .tokens = .{ "-_-", "", "" }, .len = 1 } },
3144 .{ "-__-", SpecialCase{ .tokens = .{ "-__-", "", "" }, .len = 1 } },
3145 .{ "._.", SpecialCase{ .tokens = .{ "._.", "", "" }, .len = 1 } },
3146 .{ "0.0", SpecialCase{ .tokens = .{ "0.0", "", "" }, .len = 1 } },
3147 .{ "0.o", SpecialCase{ .tokens = .{ "0.o", "", "" }, .len = 1 } },
3148 .{ "0_0", SpecialCase{ .tokens = .{ "0_0", "", "" }, .len = 1 } },
3149 .{ "0_o", SpecialCase{ .tokens = .{ "0_o", "", "" }, .len = 1 } },
3150 .{ "10a.m.", SpecialCase{ .tokens = .{ "10", "a.m.", "" }, .len = 2 } },
3151 .{ "10am", SpecialCase{ .tokens = .{ "10", "am", "" }, .len = 2 } },
3152 .{ "10p.m.", SpecialCase{ .tokens = .{ "10", "p.m.", "" }, .len = 2 } },
3153 .{ "10pm", SpecialCase{ .tokens = .{ "10", "pm", "" }, .len = 2 } },
3154 .{ "11a.m.", SpecialCase{ .tokens = .{ "11", "a.m.", "" }, .len = 2 } },
3155 .{ "11am", SpecialCase{ .tokens = .{ "11", "am", "" }, .len = 2 } },
3156 .{ "11p.m.", SpecialCase{ .tokens = .{ "11", "p.m.", "" }, .len = 2 } },
3157 .{ "11pm", SpecialCase{ .tokens = .{ "11", "pm", "" }, .len = 2 } },
3158 .{ "12a.m.", SpecialCase{ .tokens = .{ "12", "a.m.", "" }, .len = 2 } },
3159 .{ "12am", SpecialCase{ .tokens = .{ "12", "am", "" }, .len = 2 } },
3160 .{ "12p.m.", SpecialCase{ .tokens = .{ "12", "p.m.", "" }, .len = 2 } },
3161 .{ "12pm", SpecialCase{ .tokens = .{ "12", "pm", "" }, .len = 2 } },
3162 .{ "1a.m.", SpecialCase{ .tokens = .{ "1", "a.m.", "" }, .len = 2 } },
3163 .{ "1am", SpecialCase{ .tokens = .{ "1", "am", "" }, .len = 2 } },
3164 .{ "1p.m.", SpecialCase{ .tokens = .{ "1", "p.m.", "" }, .len = 2 } },
3165 .{ "1pm", SpecialCase{ .tokens = .{ "1", "pm", "" }, .len = 2 } },
3166 .{ "2a.m.", SpecialCase{ .tokens = .{ "2", "a.m.", "" }, .len = 2 } },
3167 .{ "2am", SpecialCase{ .tokens = .{ "2", "am", "" }, .len = 2 } },
3168 .{ "2p.m.", SpecialCase{ .tokens = .{ "2", "p.m.", "" }, .len = 2 } },
3169 .{ "2pm", SpecialCase{ .tokens = .{ "2", "pm", "" }, .len = 2 } },
3170 .{ "3a.m.", SpecialCase{ .tokens = .{ "3", "a.m.", "" }, .len = 2 } },
3171 .{ "3am", SpecialCase{ .tokens = .{ "3", "am", "" }, .len = 2 } },
3172 .{ "3p.m.", SpecialCase{ .tokens = .{ "3", "p.m.", "" }, .len = 2 } },
3173 .{ "3pm", SpecialCase{ .tokens = .{ "3", "pm", "" }, .len = 2 } },
3174 .{ "4a.m.", SpecialCase{ .tokens = .{ "4", "a.m.", "" }, .len = 2 } },
3175 .{ "4am", SpecialCase{ .tokens = .{ "4", "am", "" }, .len = 2 } },
3176 .{ "4p.m.", SpecialCase{ .tokens = .{ "4", "p.m.", "" }, .len = 2 } },
3177 .{ "4pm", SpecialCase{ .tokens = .{ "4", "pm", "" }, .len = 2 } },
3178 .{ "5a.m.", SpecialCase{ .tokens = .{ "5", "a.m.", "" }, .len = 2 } },
3179 .{ "5am", SpecialCase{ .tokens = .{ "5", "am", "" }, .len = 2 } },
3180 .{ "5p.m.", SpecialCase{ .tokens = .{ "5", "p.m.", "" }, .len = 2 } },
3181 .{ "5pm", SpecialCase{ .tokens = .{ "5", "pm", "" }, .len = 2 } },
3182 .{ "6a.m.", SpecialCase{ .tokens = .{ "6", "a.m.", "" }, .len = 2 } },
3183 .{ "6am", SpecialCase{ .tokens = .{ "6", "am", "" }, .len = 2 } },
3184 .{ "6p.m.", SpecialCase{ .tokens = .{ "6", "p.m.", "" }, .len = 2 } },
3185 .{ "6pm", SpecialCase{ .tokens = .{ "6", "pm", "" }, .len = 2 } },
3186 .{ "7a.m.", SpecialCase{ .tokens = .{ "7", "a.m.", "" }, .len = 2 } },
3187 .{ "7am", SpecialCase{ .tokens = .{ "7", "am", "" }, .len = 2 } },
3188 .{ "7p.m.", SpecialCase{ .tokens = .{ "7", "p.m.", "" }, .len = 2 } },
3189 .{ "7pm", SpecialCase{ .tokens = .{ "7", "pm", "" }, .len = 2 } },
3190 .{ "8)", SpecialCase{ .tokens = .{ "8)", "", "" }, .len = 1 } },
3191 .{ "8-)", SpecialCase{ .tokens = .{ "8-)", "", "" }, .len = 1 } },
3192 .{ "8-D", SpecialCase{ .tokens = .{ "8-D", "", "" }, .len = 1 } },
3193 .{ "8D", SpecialCase{ .tokens = .{ "8D", "", "" }, .len = 1 } },
3194 .{ "8a.m.", SpecialCase{ .tokens = .{ "8", "a.m.", "" }, .len = 2 } },
3195 .{ "8am", SpecialCase{ .tokens = .{ "8", "am", "" }, .len = 2 } },
3196 .{ "8p.m.", SpecialCase{ .tokens = .{ "8", "p.m.", "" }, .len = 2 } },
3197 .{ "8pm", SpecialCase{ .tokens = .{ "8", "pm", "" }, .len = 2 } },
3198 .{ "9a.m.", SpecialCase{ .tokens = .{ "9", "a.m.", "" }, .len = 2 } },
3199 .{ "9am", SpecialCase{ .tokens = .{ "9", "am", "" }, .len = 2 } },
3200 .{ "9p.m.", SpecialCase{ .tokens = .{ "9", "p.m.", "" }, .len = 2 } },
3201 .{ "9pm", SpecialCase{ .tokens = .{ "9", "pm", "" }, .len = 2 } },
3202 .{ ":'(", SpecialCase{ .tokens = .{ ":'(", "", "" }, .len = 1 } },
3203 .{ ":')", SpecialCase{ .tokens = .{ ":')", "", "" }, .len = 1 } },
3204 .{ ":'-(", SpecialCase{ .tokens = .{ ":'-(", "", "" }, .len = 1 } },
3205 .{ ":'-)", SpecialCase{ .tokens = .{ ":'-)", "", "" }, .len = 1 } },
3206 .{ ":(", SpecialCase{ .tokens = .{ ":(", "", "" }, .len = 1 } },
3207 .{ ":((", SpecialCase{ .tokens = .{ ":((", "", "" }, .len = 1 } },
3208 .{ ":(((", SpecialCase{ .tokens = .{ ":(((", "", "" }, .len = 1 } },
3209 .{ ":()", SpecialCase{ .tokens = .{ ":()", "", "" }, .len = 1 } },
3210 .{ ":)", SpecialCase{ .tokens = .{ ":)", "", "" }, .len = 1 } },
3211 .{ ":))", SpecialCase{ .tokens = .{ ":))", "", "" }, .len = 1 } },
3212 .{ ":)))", SpecialCase{ .tokens = .{ ":)))", "", "" }, .len = 1 } },
3213 .{ ":*", SpecialCase{ .tokens = .{ ":*", "", "" }, .len = 1 } },
3214 .{ ":-(", SpecialCase{ .tokens = .{ ":-(", "", "" }, .len = 1 } },
3215 .{ ":-((", SpecialCase{ .tokens = .{ ":-((", "", "" }, .len = 1 } },
3216 .{ ":-(((", SpecialCase{ .tokens = .{ ":-(((", "", "" }, .len = 1 } },
3217 .{ ":-)", SpecialCase{ .tokens = .{ ":-)", "", "" }, .len = 1 } },
3218 .{ ":-))", SpecialCase{ .tokens = .{ ":-))", "", "" }, .len = 1 } },
3219 .{ ":-)))", SpecialCase{ .tokens = .{ ":-)))", "", "" }, .len = 1 } },
3220 .{ ":-*", SpecialCase{ .tokens = .{ ":-*", "", "" }, .len = 1 } },
3221 .{ ":-/", SpecialCase{ .tokens = .{ ":-/", "", "" }, .len = 1 } },
3222 .{ ":-0", SpecialCase{ .tokens = .{ ":-0", "", "" }, .len = 1 } },
3223 .{ ":-3", SpecialCase{ .tokens = .{ ":-3", "", "" }, .len = 1 } },
3224 .{ ":->", SpecialCase{ .tokens = .{ ":->", "", "" }, .len = 1 } },
3225 .{ ":-D", SpecialCase{ .tokens = .{ ":-D", "", "" }, .len = 1 } },
3226 .{ ":-O", SpecialCase{ .tokens = .{ ":-O", "", "" }, .len = 1 } },
3227 .{ ":-P", SpecialCase{ .tokens = .{ ":-P", "", "" }, .len = 1 } },
3228 .{ ":-X", SpecialCase{ .tokens = .{ ":-X", "", "" }, .len = 1 } },
3229 .{ ":-]", SpecialCase{ .tokens = .{ ":-]", "", "" }, .len = 1 } },
3230 .{ ":-o", SpecialCase{ .tokens = .{ ":-o", "", "" }, .len = 1 } },
3231 .{ ":-p", SpecialCase{ .tokens = .{ ":-p", "", "" }, .len = 1 } },
3232 .{ ":-x", SpecialCase{ .tokens = .{ ":-x", "", "" }, .len = 1 } },
3233 .{ ":-|", SpecialCase{ .tokens = .{ ":-|", "", "" }, .len = 1 } },
3234 .{ ":-}", SpecialCase{ .tokens = .{ ":-}", "", "" }, .len = 1 } },
3235 .{ ":/", SpecialCase{ .tokens = .{ ":/", "", "" }, .len = 1 } },
3236 .{ ":0", SpecialCase{ .tokens = .{ ":0", "", "" }, .len = 1 } },
3237 .{ ":1", SpecialCase{ .tokens = .{ ":1", "", "" }, .len = 1 } },
3238 .{ ":3", SpecialCase{ .tokens = .{ ":3", "", "" }, .len = 1 } },
3239 .{ ":>", SpecialCase{ .tokens = .{ ":>", "", "" }, .len = 1 } },
3240 .{ ":D", SpecialCase{ .tokens = .{ ":D", "", "" }, .len = 1 } },
3241 .{ ":O", SpecialCase{ .tokens = .{ ":O", "", "" }, .len = 1 } },
3242 .{ ":P", SpecialCase{ .tokens = .{ ":P", "", "" }, .len = 1 } },
3243 .{ ":X", SpecialCase{ .tokens = .{ ":X", "", "" }, .len = 1 } },
3244 .{ ":]", SpecialCase{ .tokens = .{ ":]", "", "" }, .len = 1 } },
3245 .{ ":o", SpecialCase{ .tokens = .{ ":o", "", "" }, .len = 1 } },
3246 .{ ":o)", SpecialCase{ .tokens = .{ ":o)", "", "" }, .len = 1 } },
3247 .{ ":p", SpecialCase{ .tokens = .{ ":p", "", "" }, .len = 1 } },
3248 .{ ":x", SpecialCase{ .tokens = .{ ":x", "", "" }, .len = 1 } },
3249 .{ ":|", SpecialCase{ .tokens = .{ ":|", "", "" }, .len = 1 } },
3250 .{ ":}", SpecialCase{ .tokens = .{ ":}", "", "" }, .len = 1 } },
3251 .{ ":\xe2\x80\x99(", SpecialCase{ .tokens = .{ ":\xe2\x80\x99(", "", "" }, .len = 1 } },
3252 .{ ":\xe2\x80\x99)", SpecialCase{ .tokens = .{ ":\xe2\x80\x99)", "", "" }, .len = 1 } },
3253 .{ ":\xe2\x80\x99-(", SpecialCase{ .tokens = .{ ":\xe2\x80\x99-(", "", "" }, .len = 1 } },
3254 .{ ":\xe2\x80\x99-)", SpecialCase{ .tokens = .{ ":\xe2\x80\x99-)", "", "" }, .len = 1 } },
3255 .{ ";)", SpecialCase{ .tokens = .{ ";)", "", "" }, .len = 1 } },
3256 .{ ";-)", SpecialCase{ .tokens = .{ ";-)", "", "" }, .len = 1 } },
3257 .{ ";-D", SpecialCase{ .tokens = .{ ";-D", "", "" }, .len = 1 } },
3258 .{ ";D", SpecialCase{ .tokens = .{ ";D", "", "" }, .len = 1 } },
3259 .{ ";_;", SpecialCase{ .tokens = .{ ";_;", "", "" }, .len = 1 } },
3260 .{ "<.<", SpecialCase{ .tokens = .{ "<.<", "", "" }, .len = 1 } },
3261 .{ "</3", SpecialCase{ .tokens = .{ "</3", "", "" }, .len = 1 } },
3262 .{ "<3", SpecialCase{ .tokens = .{ "<3", "", "" }, .len = 1 } },
3263 .{ "<33", SpecialCase{ .tokens = .{ "<33", "", "" }, .len = 1 } },
3264 .{ "<333", SpecialCase{ .tokens = .{ "<333", "", "" }, .len = 1 } },
3265 .{ "<space>", SpecialCase{ .tokens = .{ "<space>", "", "" }, .len = 1 } },
3266 .{ "=(", SpecialCase{ .tokens = .{ "=(", "", "" }, .len = 1 } },
3267 .{ "=)", SpecialCase{ .tokens = .{ "=)", "", "" }, .len = 1 } },
3268 .{ "=/", SpecialCase{ .tokens = .{ "=/", "", "" }, .len = 1 } },
3269 .{ "=3", SpecialCase{ .tokens = .{ "=3", "", "" }, .len = 1 } },
3270 .{ "=D", SpecialCase{ .tokens = .{ "=D", "", "" }, .len = 1 } },
3271 .{ "=[", SpecialCase{ .tokens = .{ "=[", "", "" }, .len = 1 } },
3272 .{ "=]", SpecialCase{ .tokens = .{ "=]", "", "" }, .len = 1 } },
3273 .{ "=|", SpecialCase{ .tokens = .{ "=|", "", "" }, .len = 1 } },
3274 .{ ">.<", SpecialCase{ .tokens = .{ ">.<", "", "" }, .len = 1 } },
3275 .{ ">.>", SpecialCase{ .tokens = .{ ">.>", "", "" }, .len = 1 } },
3276 .{ ">:(", SpecialCase{ .tokens = .{ ">:(", "", "" }, .len = 1 } },
3277 .{ ">:o", SpecialCase{ .tokens = .{ ">:o", "", "" }, .len = 1 } },
3278 .{ "><(((*>", SpecialCase{ .tokens = .{ "><(((*>", "", "" }, .len = 1 } },
3279 .{ "@_@", SpecialCase{ .tokens = .{ "@_@", "", "" }, .len = 1 } },
3280 .{ "Adm.", SpecialCase{ .tokens = .{ "Adm.", "", "" }, .len = 1 } },
3281 .{ "Ain't", SpecialCase{ .tokens = .{ "Ai", "n't", "" }, .len = 2 } },
3282 .{ "Aint", SpecialCase{ .tokens = .{ "Ai", "nt", "" }, .len = 2 } },
3283 .{ "Ain\xe2\x80\x99t", SpecialCase{ .tokens = .{ "Ai", "n\xe2\x80\x99t", "" }, .len = 2 } },
3284 .{ "Ak.", SpecialCase{ .tokens = .{ "Ak.", "", "" }, .len = 1 } },
3285 .{ "Ala.", SpecialCase{ .tokens = .{ "Ala.", "", "" }, .len = 1 } },
3286 .{ "Apr.", SpecialCase{ .tokens = .{ "Apr.", "", "" }, .len = 1 } },
3287 .{ "Aren't", SpecialCase{ .tokens = .{ "Are", "n't", "" }, .len = 2 } },
3288 .{ "Arent", SpecialCase{ .tokens = .{ "Are", "nt", "" }, .len = 2 } },
3289 .{ "Aren\xe2\x80\x99t", SpecialCase{ .tokens = .{ "Are", "n\xe2\x80\x99t", "" }, .len = 2 } },
3290 .{ "Ariz.", SpecialCase{ .tokens = .{ "Ariz.", "", "" }, .len = 1 } },
3291 .{ "Ark.", SpecialCase{ .tokens = .{ "Ark.", "", "" }, .len = 1 } },
3292 .{ "Aug.", SpecialCase{ .tokens = .{ "Aug.", "", "" }, .len = 1 } },
3293 .{ "Bros.", SpecialCase{ .tokens = .{ "Bros.", "", "" }, .len = 1 } },
3294 .{ "C'mon", SpecialCase{ .tokens = .{ "C'm", "on", "" }, .len = 2 } },
3295 .{ "C++", SpecialCase{ .tokens = .{ "C++", "", "" }, .len = 1 } },
3296 .{ "Calif.", SpecialCase{ .tokens = .{ "Calif.", "", "" }, .len = 1 } },
3297 .{ "Can't", SpecialCase{ .tokens = .{ "Ca", "n't", "" }, .len = 2 } },
3298 .{ "Can't've", SpecialCase{ .tokens = .{ "Ca", "n't", "'ve" }, .len = 3 } },
3299 .{ "Cannot", SpecialCase{ .tokens = .{ "Can", "not", "" }, .len = 2 } },
3300 .{ "Cant", SpecialCase{ .tokens = .{ "Ca", "nt", "" }, .len = 2 } },
3301 .{ "Cantve", SpecialCase{ .tokens = .{ "Ca", "nt", "ve" }, .len = 3 } },
3302 .{ "Can\xe2\x80\x99t", SpecialCase{ .tokens = .{ "Ca", "n\xe2\x80\x99t", "" }, .len = 2 } },
3303 .{ "Can\xe2\x80\x99t\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "Ca", "n\xe2\x80\x99t", "\xe2\x80\x99ve" }, .len = 3 } },
3304 .{ "Co.", SpecialCase{ .tokens = .{ "Co.", "", "" }, .len = 1 } },
3305 .{ "Colo.", SpecialCase{ .tokens = .{ "Colo.", "", "" }, .len = 1 } },
3306 .{ "Conn.", SpecialCase{ .tokens = .{ "Conn.", "", "" }, .len = 1 } },
3307 .{ "Corp.", SpecialCase{ .tokens = .{ "Corp.", "", "" }, .len = 1 } },
3308 .{ "Could've", SpecialCase{ .tokens = .{ "Could", "'ve", "" }, .len = 2 } },
3309 .{ "Couldn't", SpecialCase{ .tokens = .{ "Could", "n't", "" }, .len = 2 } },
3310 .{ "Couldn't've", SpecialCase{ .tokens = .{ "Could", "n't", "'ve" }, .len = 3 } },
3311 .{ "Couldnt", SpecialCase{ .tokens = .{ "Could", "nt", "" }, .len = 2 } },
3312 .{ "Couldntve", SpecialCase{ .tokens = .{ "Could", "nt", "ve" }, .len = 3 } },
3313 .{ "Couldn\xe2\x80\x99t", SpecialCase{ .tokens = .{ "Could", "n\xe2\x80\x99t", "" }, .len = 2 } },
3314 .{ "Couldn\xe2\x80\x99t\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "Could", "n\xe2\x80\x99t", "\xe2\x80\x99ve" }, .len = 3 } },
3315 .{ "Couldve", SpecialCase{ .tokens = .{ "Could", "ve", "" }, .len = 2 } },
3316 .{ "Could\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "Could", "\xe2\x80\x99ve", "" }, .len = 2 } },
3317 .{ "C\xe2\x80\x99mon", SpecialCase{ .tokens = .{ "C\xe2\x80\x99m", "on", "" }, .len = 2 } },
3318 .{ "D.C.", SpecialCase{ .tokens = .{ "D.C.", "", "" }, .len = 1 } },
3319 .{ "Daren't", SpecialCase{ .tokens = .{ "Dare", "n't", "" }, .len = 2 } },
3320 .{ "Darent", SpecialCase{ .tokens = .{ "Dare", "nt", "" }, .len = 2 } },
3321 .{ "Daren\xe2\x80\x99t", SpecialCase{ .tokens = .{ "Dare", "n\xe2\x80\x99t", "" }, .len = 2 } },
3322 .{ "Dec.", SpecialCase{ .tokens = .{ "Dec.", "", "" }, .len = 1 } },
3323 .{ "Del.", SpecialCase{ .tokens = .{ "Del.", "", "" }, .len = 1 } },
3324 .{ "Didn't", SpecialCase{ .tokens = .{ "Did", "n't", "" }, .len = 2 } },
3325 .{ "Didn't've", SpecialCase{ .tokens = .{ "Did", "n't", "'ve" }, .len = 3 } },
3326 .{ "Didnt", SpecialCase{ .tokens = .{ "Did", "nt", "" }, .len = 2 } },
3327 .{ "Didntve", SpecialCase{ .tokens = .{ "Did", "nt", "ve" }, .len = 3 } },
3328 .{ "Didn\xe2\x80\x99t", SpecialCase{ .tokens = .{ "Did", "n\xe2\x80\x99t", "" }, .len = 2 } },
3329 .{ "Didn\xe2\x80\x99t\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "Did", "n\xe2\x80\x99t", "\xe2\x80\x99ve" }, .len = 3 } },
3330 .{ "Doesn't", SpecialCase{ .tokens = .{ "Does", "n't", "" }, .len = 2 } },
3331 .{ "Doesn't've", SpecialCase{ .tokens = .{ "Does", "n't", "'ve" }, .len = 3 } },
3332 .{ "Doesnt", SpecialCase{ .tokens = .{ "Does", "nt", "" }, .len = 2 } },
3333 .{ "Doesntve", SpecialCase{ .tokens = .{ "Does", "nt", "ve" }, .len = 3 } },
3334 .{ "Doesn\xe2\x80\x99t", SpecialCase{ .tokens = .{ "Does", "n\xe2\x80\x99t", "" }, .len = 2 } },
3335 .{ "Doesn\xe2\x80\x99t\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "Does", "n\xe2\x80\x99t", "\xe2\x80\x99ve" }, .len = 3 } },
3336 .{ "Doin", SpecialCase{ .tokens = .{ "Doin", "", "" }, .len = 1 } },
3337 .{ "Doin'", SpecialCase{ .tokens = .{ "Doin'", "", "" }, .len = 1 } },
3338 .{ "Doin\xe2\x80\x99", SpecialCase{ .tokens = .{ "Doin\xe2\x80\x99", "", "" }, .len = 1 } },
3339 .{ "Don't", SpecialCase{ .tokens = .{ "Do", "n't", "" }, .len = 2 } },
3340 .{ "Don't've", SpecialCase{ .tokens = .{ "Do", "n't", "'ve" }, .len = 3 } },
3341 .{ "Dont", SpecialCase{ .tokens = .{ "Do", "nt", "" }, .len = 2 } },
3342 .{ "Dontve", SpecialCase{ .tokens = .{ "Do", "nt", "ve" }, .len = 3 } },
3343 .{ "Don\xe2\x80\x99t", SpecialCase{ .tokens = .{ "Do", "n\xe2\x80\x99t", "" }, .len = 2 } },
3344 .{ "Don\xe2\x80\x99t\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "Do", "n\xe2\x80\x99t", "\xe2\x80\x99ve" }, .len = 3 } },
3345 .{ "Dr.", SpecialCase{ .tokens = .{ "Dr.", "", "" }, .len = 1 } },
3346 .{ "E.G.", SpecialCase{ .tokens = .{ "E.G.", "", "" }, .len = 1 } },
3347 .{ "E.g.", SpecialCase{ .tokens = .{ "E.g.", "", "" }, .len = 1 } },
3348 .{ "Feb.", SpecialCase{ .tokens = .{ "Feb.", "", "" }, .len = 1 } },
3349 .{ "Fla.", SpecialCase{ .tokens = .{ "Fla.", "", "" }, .len = 1 } },
3350 .{ "Ga.", SpecialCase{ .tokens = .{ "Ga.", "", "" }, .len = 1 } },
3351 .{ "Gen.", SpecialCase{ .tokens = .{ "Gen.", "", "" }, .len = 1 } },
3352 .{ "Goin", SpecialCase{ .tokens = .{ "Goin", "", "" }, .len = 1 } },
3353 .{ "Goin'", SpecialCase{ .tokens = .{ "Goin'", "", "" }, .len = 1 } },
3354 .{ "Goin\xe2\x80\x99", SpecialCase{ .tokens = .{ "Goin\xe2\x80\x99", "", "" }, .len = 1 } },
3355 .{ "Gonna", SpecialCase{ .tokens = .{ "Gon", "na", "" }, .len = 2 } },
3356 .{ "Gotta", SpecialCase{ .tokens = .{ "Got", "ta", "" }, .len = 2 } },
3357 .{ "Gov.", SpecialCase{ .tokens = .{ "Gov.", "", "" }, .len = 1 } },
3358 .{ "Hadn't", SpecialCase{ .tokens = .{ "Had", "n't", "" }, .len = 2 } },
3359 .{ "Hadn't've", SpecialCase{ .tokens = .{ "Had", "n't", "'ve" }, .len = 3 } },
3360 .{ "Hadnt", SpecialCase{ .tokens = .{ "Had", "nt", "" }, .len = 2 } },
3361 .{ "Hadntve", SpecialCase{ .tokens = .{ "Had", "nt", "ve" }, .len = 3 } },
3362 .{ "Hadn\xe2\x80\x99t", SpecialCase{ .tokens = .{ "Had", "n\xe2\x80\x99t", "" }, .len = 2 } },
3363 .{ "Hadn\xe2\x80\x99t\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "Had", "n\xe2\x80\x99t", "\xe2\x80\x99ve" }, .len = 3 } },
3364 .{ "Hasn't", SpecialCase{ .tokens = .{ "Has", "n't", "" }, .len = 2 } },
3365 .{ "Hasnt", SpecialCase{ .tokens = .{ "Has", "nt", "" }, .len = 2 } },
3366 .{ "Hasn\xe2\x80\x99t", SpecialCase{ .tokens = .{ "Has", "n\xe2\x80\x99t", "" }, .len = 2 } },
3367 .{ "Haven't", SpecialCase{ .tokens = .{ "Have", "n't", "" }, .len = 2 } },
3368 .{ "Havent", SpecialCase{ .tokens = .{ "Have", "nt", "" }, .len = 2 } },
3369 .{ "Haven\xe2\x80\x99t", SpecialCase{ .tokens = .{ "Have", "n\xe2\x80\x99t", "" }, .len = 2 } },
3370 .{ "Havin", SpecialCase{ .tokens = .{ "Havin", "", "" }, .len = 1 } },
3371 .{ "Havin'", SpecialCase{ .tokens = .{ "Havin'", "", "" }, .len = 1 } },
3372 .{ "Havin\xe2\x80\x99", SpecialCase{ .tokens = .{ "Havin\xe2\x80\x99", "", "" }, .len = 1 } },
3373 .{ "He'd", SpecialCase{ .tokens = .{ "He", "'d", "" }, .len = 2 } },
3374 .{ "He'd've", SpecialCase{ .tokens = .{ "He", "'d", "'ve" }, .len = 3 } },
3375 .{ "He'll", SpecialCase{ .tokens = .{ "He", "'ll", "" }, .len = 2 } },
3376 .{ "He'll've", SpecialCase{ .tokens = .{ "He", "'ll", "'ve" }, .len = 3 } },
3377 .{ "He's", SpecialCase{ .tokens = .{ "He", "'s", "" }, .len = 2 } },
3378 .{ "Hed", SpecialCase{ .tokens = .{ "He", "d", "" }, .len = 2 } },
3379 .{ "Hedve", SpecialCase{ .tokens = .{ "He", "d", "ve" }, .len = 3 } },
3380 .{ "Hellve", SpecialCase{ .tokens = .{ "He", "ll", "ve" }, .len = 3 } },
3381 .{ "Hes", SpecialCase{ .tokens = .{ "He", "s", "" }, .len = 2 } },
3382 .{ "He\xe2\x80\x99d", SpecialCase{ .tokens = .{ "He", "\xe2\x80\x99d", "" }, .len = 2 } },
3383 .{ "He\xe2\x80\x99d\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "He", "\xe2\x80\x99d", "\xe2\x80\x99ve" }, .len = 3 } },
3384 .{ "He\xe2\x80\x99ll", SpecialCase{ .tokens = .{ "He", "\xe2\x80\x99ll", "" }, .len = 2 } },
3385 .{ "He\xe2\x80\x99ll\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "He", "\xe2\x80\x99ll", "\xe2\x80\x99ve" }, .len = 3 } },
3386 .{ "He\xe2\x80\x99s", SpecialCase{ .tokens = .{ "He", "\xe2\x80\x99s", "" }, .len = 2 } },
3387 .{ "How'd", SpecialCase{ .tokens = .{ "How", "'d", "" }, .len = 2 } },
3388 .{ "How'd've", SpecialCase{ .tokens = .{ "How", "'d", "'ve" }, .len = 3 } },
3389 .{ "How'd'y", SpecialCase{ .tokens = .{ "How", "'d", "'y" }, .len = 3 } },
3390 .{ "How'll", SpecialCase{ .tokens = .{ "How", "'ll", "" }, .len = 2 } },
3391 .{ "How'll've", SpecialCase{ .tokens = .{ "How", "'ll", "'ve" }, .len = 3 } },
3392 .{ "How're", SpecialCase{ .tokens = .{ "How", "'re", "" }, .len = 2 } },
3393 .{ "How's", SpecialCase{ .tokens = .{ "How", "'s", "" }, .len = 2 } },
3394 .{ "How've", SpecialCase{ .tokens = .{ "How", "'ve", "" }, .len = 2 } },
3395 .{ "Howd", SpecialCase{ .tokens = .{ "How", "d", "" }, .len = 2 } },
3396 .{ "Howdve", SpecialCase{ .tokens = .{ "How", "d", "ve" }, .len = 3 } },
3397 .{ "Howll", SpecialCase{ .tokens = .{ "How", "ll", "" }, .len = 2 } },
3398 .{ "Howllve", SpecialCase{ .tokens = .{ "How", "ll", "ve" }, .len = 3 } },
3399 .{ "Howre", SpecialCase{ .tokens = .{ "How", "re", "" }, .len = 2 } },
3400 .{ "Hows", SpecialCase{ .tokens = .{ "How", "s", "" }, .len = 2 } },
3401 .{ "Howve", SpecialCase{ .tokens = .{ "How", "ve", "" }, .len = 2 } },
3402 .{ "How\xe2\x80\x99d", SpecialCase{ .tokens = .{ "How", "\xe2\x80\x99d", "" }, .len = 2 } },
3403 .{ "How\xe2\x80\x99d\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "How", "\xe2\x80\x99d", "\xe2\x80\x99ve" }, .len = 3 } },
3404 .{ "How\xe2\x80\x99d\xe2\x80\x99y", SpecialCase{ .tokens = .{ "How", "\xe2\x80\x99d", "\xe2\x80\x99y" }, .len = 3 } },
3405 .{ "How\xe2\x80\x99ll", SpecialCase{ .tokens = .{ "How", "\xe2\x80\x99ll", "" }, .len = 2 } },
3406 .{ "How\xe2\x80\x99ll\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "How", "\xe2\x80\x99ll", "\xe2\x80\x99ve" }, .len = 3 } },
3407 .{ "How\xe2\x80\x99re", SpecialCase{ .tokens = .{ "How", "\xe2\x80\x99re", "" }, .len = 2 } },
3408 .{ "How\xe2\x80\x99s", SpecialCase{ .tokens = .{ "How", "\xe2\x80\x99s", "" }, .len = 2 } },
3409 .{ "How\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "How", "\xe2\x80\x99ve", "" }, .len = 2 } },
3410 .{ "I'd", SpecialCase{ .tokens = .{ "I", "'d", "" }, .len = 2 } },
3411 .{ "I'd've", SpecialCase{ .tokens = .{ "I", "'d", "'ve" }, .len = 3 } },
3412 .{ "I'll", SpecialCase{ .tokens = .{ "I", "'ll", "" }, .len = 2 } },
3413 .{ "I'll've", SpecialCase{ .tokens = .{ "I", "'ll", "'ve" }, .len = 3 } },
3414 .{ "I'm", SpecialCase{ .tokens = .{ "I", "'m", "" }, .len = 2 } },
3415 .{ "I'ma", SpecialCase{ .tokens = .{ "I", "'m", "a" }, .len = 3 } },
3416 .{ "I've", SpecialCase{ .tokens = .{ "I", "'ve", "" }, .len = 2 } },
3417 .{ "I.E.", SpecialCase{ .tokens = .{ "I.E.", "", "" }, .len = 1 } },
3418 .{ "I.e.", SpecialCase{ .tokens = .{ "I.e.", "", "" }, .len = 1 } },
3419 .{ "Ia.", SpecialCase{ .tokens = .{ "Ia.", "", "" }, .len = 1 } },
3420 .{ "Id", SpecialCase{ .tokens = .{ "I", "d", "" }, .len = 2 } },
3421 .{ "Id.", SpecialCase{ .tokens = .{ "Id.", "", "" }, .len = 1 } },
3422 .{ "Idve", SpecialCase{ .tokens = .{ "I", "d", "ve" }, .len = 3 } },
3423 .{ "Ill.", SpecialCase{ .tokens = .{ "Ill.", "", "" }, .len = 1 } },
3424 .{ "Illve", SpecialCase{ .tokens = .{ "I", "ll", "ve" }, .len = 3 } },
3425 .{ "Im", SpecialCase{ .tokens = .{ "I", "m", "" }, .len = 2 } },
3426 .{ "Ima", SpecialCase{ .tokens = .{ "I", "m", "a" }, .len = 3 } },
3427 .{ "Inc.", SpecialCase{ .tokens = .{ "Inc.", "", "" }, .len = 1 } },
3428 .{ "Ind.", SpecialCase{ .tokens = .{ "Ind.", "", "" }, .len = 1 } },
3429 .{ "Isn't", SpecialCase{ .tokens = .{ "Is", "n't", "" }, .len = 2 } },
3430 .{ "Isnt", SpecialCase{ .tokens = .{ "Is", "nt", "" }, .len = 2 } },
3431 .{ "Isn\xe2\x80\x99t", SpecialCase{ .tokens = .{ "Is", "n\xe2\x80\x99t", "" }, .len = 2 } },
3432 .{ "It'd", SpecialCase{ .tokens = .{ "It", "'d", "" }, .len = 2 } },
3433 .{ "It'd've", SpecialCase{ .tokens = .{ "It", "'d", "'ve" }, .len = 3 } },
3434 .{ "It'll", SpecialCase{ .tokens = .{ "It", "'ll", "" }, .len = 2 } },
3435 .{ "It'll've", SpecialCase{ .tokens = .{ "It", "'ll", "'ve" }, .len = 3 } },
3436 .{ "It's", SpecialCase{ .tokens = .{ "It", "'s", "" }, .len = 2 } },
3437 .{ "Itd", SpecialCase{ .tokens = .{ "It", "d", "" }, .len = 2 } },
3438 .{ "Itdve", SpecialCase{ .tokens = .{ "It", "d", "ve" }, .len = 3 } },
3439 .{ "Itll", SpecialCase{ .tokens = .{ "It", "ll", "" }, .len = 2 } },
3440 .{ "Itllve", SpecialCase{ .tokens = .{ "It", "ll", "ve" }, .len = 3 } },
3441 .{ "It\xe2\x80\x99d", SpecialCase{ .tokens = .{ "It", "\xe2\x80\x99d", "" }, .len = 2 } },
3442 .{ "It\xe2\x80\x99d\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "It", "\xe2\x80\x99d", "\xe2\x80\x99ve" }, .len = 3 } },
3443 .{ "It\xe2\x80\x99ll", SpecialCase{ .tokens = .{ "It", "\xe2\x80\x99ll", "" }, .len = 2 } },
3444 .{ "It\xe2\x80\x99ll\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "It", "\xe2\x80\x99ll", "\xe2\x80\x99ve" }, .len = 3 } },
3445 .{ "It\xe2\x80\x99s", SpecialCase{ .tokens = .{ "It", "\xe2\x80\x99s", "" }, .len = 2 } },
3446 .{ "Ive", SpecialCase{ .tokens = .{ "I", "ve", "" }, .len = 2 } },
3447 .{ "I\xe2\x80\x99d", SpecialCase{ .tokens = .{ "I", "\xe2\x80\x99d", "" }, .len = 2 } },
3448 .{ "I\xe2\x80\x99d\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "I", "\xe2\x80\x99d", "\xe2\x80\x99ve" }, .len = 3 } },
3449 .{ "I\xe2\x80\x99ll", SpecialCase{ .tokens = .{ "I", "\xe2\x80\x99ll", "" }, .len = 2 } },
3450 .{ "I\xe2\x80\x99ll\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "I", "\xe2\x80\x99ll", "\xe2\x80\x99ve" }, .len = 3 } },
3451 .{ "I\xe2\x80\x99m", SpecialCase{ .tokens = .{ "I", "\xe2\x80\x99m", "" }, .len = 2 } },
3452 .{ "I\xe2\x80\x99ma", SpecialCase{ .tokens = .{ "I", "\xe2\x80\x99m", "a" }, .len = 3 } },
3453 .{ "I\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "I", "\xe2\x80\x99ve", "" }, .len = 2 } },
3454 .{ "Jan.", SpecialCase{ .tokens = .{ "Jan.", "", "" }, .len = 1 } },
3455 .{ "Jr.", SpecialCase{ .tokens = .{ "Jr.", "", "" }, .len = 1 } },
3456 .{ "Jul.", SpecialCase{ .tokens = .{ "Jul.", "", "" }, .len = 1 } },
3457 .{ "Jun.", SpecialCase{ .tokens = .{ "Jun.", "", "" }, .len = 1 } },
3458 .{ "Kan.", SpecialCase{ .tokens = .{ "Kan.", "", "" }, .len = 1 } },
3459 .{ "Kans.", SpecialCase{ .tokens = .{ "Kans.", "", "" }, .len = 1 } },
3460 .{ "Ky.", SpecialCase{ .tokens = .{ "Ky.", "", "" }, .len = 1 } },
3461 .{ "La.", SpecialCase{ .tokens = .{ "La.", "", "" }, .len = 1 } },
3462 .{ "Let's", SpecialCase{ .tokens = .{ "Let", "'s", "" }, .len = 2 } },
3463 .{ "Let\xe2\x80\x99s", SpecialCase{ .tokens = .{ "Let", "\xe2\x80\x99s", "" }, .len = 2 } },
3464 .{ "Lovin", SpecialCase{ .tokens = .{ "Lovin", "", "" }, .len = 1 } },
3465 .{ "Lovin'", SpecialCase{ .tokens = .{ "Lovin'", "", "" }, .len = 1 } },
3466 .{ "Lovin\xe2\x80\x99", SpecialCase{ .tokens = .{ "Lovin\xe2\x80\x99", "", "" }, .len = 1 } },
3467 .{ "Ltd.", SpecialCase{ .tokens = .{ "Ltd.", "", "" }, .len = 1 } },
3468 .{ "Ma'am", SpecialCase{ .tokens = .{ "Ma'am", "", "" }, .len = 1 } },
3469 .{ "Mar.", SpecialCase{ .tokens = .{ "Mar.", "", "" }, .len = 1 } },
3470 .{ "Mass.", SpecialCase{ .tokens = .{ "Mass.", "", "" }, .len = 1 } },
3471 .{ "Mayn't", SpecialCase{ .tokens = .{ "May", "n't", "" }, .len = 2 } },
3472 .{ "Mayn't've", SpecialCase{ .tokens = .{ "May", "n't", "'ve" }, .len = 3 } },
3473 .{ "Maynt", SpecialCase{ .tokens = .{ "May", "nt", "" }, .len = 2 } },
3474 .{ "Mayntve", SpecialCase{ .tokens = .{ "May", "nt", "ve" }, .len = 3 } },
3475 .{ "Mayn\xe2\x80\x99t", SpecialCase{ .tokens = .{ "May", "n\xe2\x80\x99t", "" }, .len = 2 } },
3476 .{ "Mayn\xe2\x80\x99t\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "May", "n\xe2\x80\x99t", "\xe2\x80\x99ve" }, .len = 3 } },
3477 .{ "Ma\xe2\x80\x99am", SpecialCase{ .tokens = .{ "Ma\xe2\x80\x99am", "", "" }, .len = 1 } },
3478 .{ "Md.", SpecialCase{ .tokens = .{ "Md.", "", "" }, .len = 1 } },
3479 .{ "Messrs.", SpecialCase{ .tokens = .{ "Messrs.", "", "" }, .len = 1 } },
3480 .{ "Mich.", SpecialCase{ .tokens = .{ "Mich.", "", "" }, .len = 1 } },
3481 .{ "Might've", SpecialCase{ .tokens = .{ "Might", "'ve", "" }, .len = 2 } },
3482 .{ "Mightn't", SpecialCase{ .tokens = .{ "Might", "n't", "" }, .len = 2 } },
3483 .{ "Mightn't've", SpecialCase{ .tokens = .{ "Might", "n't", "'ve" }, .len = 3 } },
3484 .{ "Mightnt", SpecialCase{ .tokens = .{ "Might", "nt", "" }, .len = 2 } },
3485 .{ "Mightntve", SpecialCase{ .tokens = .{ "Might", "nt", "ve" }, .len = 3 } },
3486 .{ "Mightn\xe2\x80\x99t", SpecialCase{ .tokens = .{ "Might", "n\xe2\x80\x99t", "" }, .len = 2 } },
3487 .{ "Mightn\xe2\x80\x99t\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "Might", "n\xe2\x80\x99t", "\xe2\x80\x99ve" }, .len = 3 } },
3488 .{ "Mightve", SpecialCase{ .tokens = .{ "Might", "ve", "" }, .len = 2 } },
3489 .{ "Might\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "Might", "\xe2\x80\x99ve", "" }, .len = 2 } },
3490 .{ "Minn.", SpecialCase{ .tokens = .{ "Minn.", "", "" }, .len = 1 } },
3491 .{ "Miss.", SpecialCase{ .tokens = .{ "Miss.", "", "" }, .len = 1 } },
3492 .{ "Mo.", SpecialCase{ .tokens = .{ "Mo.", "", "" }, .len = 1 } },
3493 .{ "Mont.", SpecialCase{ .tokens = .{ "Mont.", "", "" }, .len = 1 } },
3494 .{ "Mr.", SpecialCase{ .tokens = .{ "Mr.", "", "" }, .len = 1 } },
3495 .{ "Mrs.", SpecialCase{ .tokens = .{ "Mrs.", "", "" }, .len = 1 } },
3496 .{ "Ms.", SpecialCase{ .tokens = .{ "Ms.", "", "" }, .len = 1 } },
3497 .{ "Mt.", SpecialCase{ .tokens = .{ "Mt.", "", "" }, .len = 1 } },
3498 .{ "Must've", SpecialCase{ .tokens = .{ "Must", "'ve", "" }, .len = 2 } },
3499 .{ "Mustn't", SpecialCase{ .tokens = .{ "Must", "n't", "" }, .len = 2 } },
3500 .{ "Mustn't've", SpecialCase{ .tokens = .{ "Must", "n't", "'ve" }, .len = 3 } },
3501 .{ "Mustnt", SpecialCase{ .tokens = .{ "Must", "nt", "" }, .len = 2 } },
3502 .{ "Mustntve", SpecialCase{ .tokens = .{ "Must", "nt", "ve" }, .len = 3 } },
3503 .{ "Mustn\xe2\x80\x99t", SpecialCase{ .tokens = .{ "Must", "n\xe2\x80\x99t", "" }, .len = 2 } },
3504 .{ "Mustn\xe2\x80\x99t\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "Must", "n\xe2\x80\x99t", "\xe2\x80\x99ve" }, .len = 3 } },
3505 .{ "Mustve", SpecialCase{ .tokens = .{ "Must", "ve", "" }, .len = 2 } },
3506 .{ "Must\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "Must", "\xe2\x80\x99ve", "" }, .len = 2 } },
3507 .{ "N.C.", SpecialCase{ .tokens = .{ "N.C.", "", "" }, .len = 1 } },
3508 .{ "N.D.", SpecialCase{ .tokens = .{ "N.D.", "", "" }, .len = 1 } },
3509 .{ "N.H.", SpecialCase{ .tokens = .{ "N.H.", "", "" }, .len = 1 } },
3510 .{ "N.J.", SpecialCase{ .tokens = .{ "N.J.", "", "" }, .len = 1 } },
3511 .{ "N.M.", SpecialCase{ .tokens = .{ "N.M.", "", "" }, .len = 1 } },
3512 .{ "N.Y.", SpecialCase{ .tokens = .{ "N.Y.", "", "" }, .len = 1 } },
3513 .{ "Neb.", SpecialCase{ .tokens = .{ "Neb.", "", "" }, .len = 1 } },
3514 .{ "Nebr.", SpecialCase{ .tokens = .{ "Nebr.", "", "" }, .len = 1 } },
3515 .{ "Needn't", SpecialCase{ .tokens = .{ "Need", "n't", "" }, .len = 2 } },
3516 .{ "Needn't've", SpecialCase{ .tokens = .{ "Need", "n't", "'ve" }, .len = 3 } },
3517 .{ "Neednt", SpecialCase{ .tokens = .{ "Need", "nt", "" }, .len = 2 } },
3518 .{ "Needntve", SpecialCase{ .tokens = .{ "Need", "nt", "ve" }, .len = 3 } },
3519 .{ "Needn\xe2\x80\x99t", SpecialCase{ .tokens = .{ "Need", "n\xe2\x80\x99t", "" }, .len = 2 } },
3520 .{ "Needn\xe2\x80\x99t\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "Need", "n\xe2\x80\x99t", "\xe2\x80\x99ve" }, .len = 3 } },
3521 .{ "Nev.", SpecialCase{ .tokens = .{ "Nev.", "", "" }, .len = 1 } },
3522 .{ "Not've", SpecialCase{ .tokens = .{ "Not", "'ve", "" }, .len = 2 } },
3523 .{ "Nothin", SpecialCase{ .tokens = .{ "Nothin", "", "" }, .len = 1 } },
3524 .{ "Nothin'", SpecialCase{ .tokens = .{ "Nothin'", "", "" }, .len = 1 } },
3525 .{ "Nothin\xe2\x80\x99", SpecialCase{ .tokens = .{ "Nothin\xe2\x80\x99", "", "" }, .len = 1 } },
3526 .{ "Notve", SpecialCase{ .tokens = .{ "Not", "ve", "" }, .len = 2 } },
3527 .{ "Not\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "Not", "\xe2\x80\x99ve", "" }, .len = 2 } },
3528 .{ "Nov.", SpecialCase{ .tokens = .{ "Nov.", "", "" }, .len = 1 } },
3529 .{ "Nuthin", SpecialCase{ .tokens = .{ "Nuthin", "", "" }, .len = 1 } },
3530 .{ "Nuthin'", SpecialCase{ .tokens = .{ "Nuthin'", "", "" }, .len = 1 } },
3531 .{ "Nuthin\xe2\x80\x99", SpecialCase{ .tokens = .{ "Nuthin\xe2\x80\x99", "", "" }, .len = 1 } },
3532 .{ "O'clock", SpecialCase{ .tokens = .{ "O'clock", "", "" }, .len = 1 } },
3533 .{ "O.O", SpecialCase{ .tokens = .{ "O.O", "", "" }, .len = 1 } },
3534 .{ "O.o", SpecialCase{ .tokens = .{ "O.o", "", "" }, .len = 1 } },
3535 .{ "O_O", SpecialCase{ .tokens = .{ "O_O", "", "" }, .len = 1 } },
3536 .{ "O_o", SpecialCase{ .tokens = .{ "O_o", "", "" }, .len = 1 } },
3537 .{ "Oct.", SpecialCase{ .tokens = .{ "Oct.", "", "" }, .len = 1 } },
3538 .{ "Okla.", SpecialCase{ .tokens = .{ "Okla.", "", "" }, .len = 1 } },
3539 .{ "Ol", SpecialCase{ .tokens = .{ "Ol", "", "" }, .len = 1 } },
3540 .{ "Ol'", SpecialCase{ .tokens = .{ "Ol'", "", "" }, .len = 1 } },
3541 .{ "Ol\xe2\x80\x99", SpecialCase{ .tokens = .{ "Ol\xe2\x80\x99", "", "" }, .len = 1 } },
3542 .{ "Ore.", SpecialCase{ .tokens = .{ "Ore.", "", "" }, .len = 1 } },
3543 .{ "Oughtn't", SpecialCase{ .tokens = .{ "Ought", "n't", "" }, .len = 2 } },
3544 .{ "Oughtn't've", SpecialCase{ .tokens = .{ "Ought", "n't", "'ve" }, .len = 3 } },
3545 .{ "Oughtnt", SpecialCase{ .tokens = .{ "Ought", "nt", "" }, .len = 2 } },
3546 .{ "Oughtntve", SpecialCase{ .tokens = .{ "Ought", "nt", "ve" }, .len = 3 } },
3547 .{ "Oughtn\xe2\x80\x99t", SpecialCase{ .tokens = .{ "Ought", "n\xe2\x80\x99t", "" }, .len = 2 } },
3548 .{ "Oughtn\xe2\x80\x99t\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "Ought", "n\xe2\x80\x99t", "\xe2\x80\x99ve" }, .len = 3 } },
3549 .{ "O\xe2\x80\x99clock", SpecialCase{ .tokens = .{ "O\xe2\x80\x99clock", "", "" }, .len = 1 } },
3550 .{ "Pa.", SpecialCase{ .tokens = .{ "Pa.", "", "" }, .len = 1 } },
3551 .{ "Ph.D.", SpecialCase{ .tokens = .{ "Ph.D.", "", "" }, .len = 1 } },
3552 .{ "Prof.", SpecialCase{ .tokens = .{ "Prof.", "", "" }, .len = 1 } },
3553 .{ "Rep.", SpecialCase{ .tokens = .{ "Rep.", "", "" }, .len = 1 } },
3554 .{ "Rev.", SpecialCase{ .tokens = .{ "Rev.", "", "" }, .len = 1 } },
3555 .{ "S.C.", SpecialCase{ .tokens = .{ "S.C.", "", "" }, .len = 1 } },
3556 .{ "Sen.", SpecialCase{ .tokens = .{ "Sen.", "", "" }, .len = 1 } },
3557 .{ "Sep.", SpecialCase{ .tokens = .{ "Sep.", "", "" }, .len = 1 } },
3558 .{ "Sept.", SpecialCase{ .tokens = .{ "Sept.", "", "" }, .len = 1 } },
3559 .{ "Shan't", SpecialCase{ .tokens = .{ "Sha", "n't", "" }, .len = 2 } },
3560 .{ "Shan't've", SpecialCase{ .tokens = .{ "Sha", "n't", "'ve" }, .len = 3 } },
3561 .{ "Shant", SpecialCase{ .tokens = .{ "Sha", "nt", "" }, .len = 2 } },
3562 .{ "Shantve", SpecialCase{ .tokens = .{ "Sha", "nt", "ve" }, .len = 3 } },
3563 .{ "Shan\xe2\x80\x99t", SpecialCase{ .tokens = .{ "Sha", "n\xe2\x80\x99t", "" }, .len = 2 } },
3564 .{ "Shan\xe2\x80\x99t\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "Sha", "n\xe2\x80\x99t", "\xe2\x80\x99ve" }, .len = 3 } },
3565 .{ "She'd", SpecialCase{ .tokens = .{ "She", "'d", "" }, .len = 2 } },
3566 .{ "She'd've", SpecialCase{ .tokens = .{ "She", "'d", "'ve" }, .len = 3 } },
3567 .{ "She'll", SpecialCase{ .tokens = .{ "She", "'ll", "" }, .len = 2 } },
3568 .{ "She'll've", SpecialCase{ .tokens = .{ "She", "'ll", "'ve" }, .len = 3 } },
3569 .{ "She's", SpecialCase{ .tokens = .{ "She", "'s", "" }, .len = 2 } },
3570 .{ "Shedve", SpecialCase{ .tokens = .{ "She", "d", "ve" }, .len = 3 } },
3571 .{ "Shellve", SpecialCase{ .tokens = .{ "She", "ll", "ve" }, .len = 3 } },
3572 .{ "Shes", SpecialCase{ .tokens = .{ "She", "s", "" }, .len = 2 } },
3573 .{ "She\xe2\x80\x99d", SpecialCase{ .tokens = .{ "She", "\xe2\x80\x99d", "" }, .len = 2 } },
3574 .{ "She\xe2\x80\x99d\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "She", "\xe2\x80\x99d", "\xe2\x80\x99ve" }, .len = 3 } },
3575 .{ "She\xe2\x80\x99ll", SpecialCase{ .tokens = .{ "She", "\xe2\x80\x99ll", "" }, .len = 2 } },
3576 .{ "She\xe2\x80\x99ll\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "She", "\xe2\x80\x99ll", "\xe2\x80\x99ve" }, .len = 3 } },
3577 .{ "She\xe2\x80\x99s", SpecialCase{ .tokens = .{ "She", "\xe2\x80\x99s", "" }, .len = 2 } },
3578 .{ "Should've", SpecialCase{ .tokens = .{ "Should", "'ve", "" }, .len = 2 } },
3579 .{ "Shouldn't", SpecialCase{ .tokens = .{ "Should", "n't", "" }, .len = 2 } },
3580 .{ "Shouldn't've", SpecialCase{ .tokens = .{ "Should", "n't", "'ve" }, .len = 3 } },
3581 .{ "Shouldnt", SpecialCase{ .tokens = .{ "Should", "nt", "" }, .len = 2 } },
3582 .{ "Shouldntve", SpecialCase{ .tokens = .{ "Should", "nt", "ve" }, .len = 3 } },
3583 .{ "Shouldn\xe2\x80\x99t", SpecialCase{ .tokens = .{ "Should", "n\xe2\x80\x99t", "" }, .len = 2 } },
3584 .{ "Shouldn\xe2\x80\x99t\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "Should", "n\xe2\x80\x99t", "\xe2\x80\x99ve" }, .len = 3 } },
3585 .{ "Shouldve", SpecialCase{ .tokens = .{ "Should", "ve", "" }, .len = 2 } },
3586 .{ "Should\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "Should", "\xe2\x80\x99ve", "" }, .len = 2 } },
3587 .{ "Somethin", SpecialCase{ .tokens = .{ "Somethin", "", "" }, .len = 1 } },
3588 .{ "Somethin'", SpecialCase{ .tokens = .{ "Somethin'", "", "" }, .len = 1 } },
3589 .{ "Somethin\xe2\x80\x99", SpecialCase{ .tokens = .{ "Somethin\xe2\x80\x99", "", "" }, .len = 1 } },
3590 .{ "St.", SpecialCase{ .tokens = .{ "St.", "", "" }, .len = 1 } },
3591 .{ "Tenn.", SpecialCase{ .tokens = .{ "Tenn.", "", "" }, .len = 1 } },
3592 .{ "That'd", SpecialCase{ .tokens = .{ "That", "'d", "" }, .len = 2 } },
3593 .{ "That'd've", SpecialCase{ .tokens = .{ "That", "'d", "'ve" }, .len = 3 } },
3594 .{ "That'll", SpecialCase{ .tokens = .{ "That", "'ll", "" }, .len = 2 } },
3595 .{ "That'll've", SpecialCase{ .tokens = .{ "That", "'ll", "'ve" }, .len = 3 } },
3596 .{ "That's", SpecialCase{ .tokens = .{ "That", "'s", "" }, .len = 2 } },
3597 .{ "Thatd", SpecialCase{ .tokens = .{ "That", "d", "" }, .len = 2 } },
3598 .{ "Thatdve", SpecialCase{ .tokens = .{ "That", "d", "ve" }, .len = 3 } },
3599 .{ "Thatll", SpecialCase{ .tokens = .{ "That", "ll", "" }, .len = 2 } },
3600 .{ "Thatllve", SpecialCase{ .tokens = .{ "That", "ll", "ve" }, .len = 3 } },
3601 .{ "Thats", SpecialCase{ .tokens = .{ "That", "s", "" }, .len = 2 } },
3602 .{ "That\xe2\x80\x99d", SpecialCase{ .tokens = .{ "That", "\xe2\x80\x99d", "" }, .len = 2 } },
3603 .{ "That\xe2\x80\x99d\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "That", "\xe2\x80\x99d", "\xe2\x80\x99ve" }, .len = 3 } },
3604 .{ "That\xe2\x80\x99ll", SpecialCase{ .tokens = .{ "That", "\xe2\x80\x99ll", "" }, .len = 2 } },
3605 .{ "That\xe2\x80\x99ll\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "That", "\xe2\x80\x99ll", "\xe2\x80\x99ve" }, .len = 3 } },
3606 .{ "That\xe2\x80\x99s", SpecialCase{ .tokens = .{ "That", "\xe2\x80\x99s", "" }, .len = 2 } },
3607 .{ "There'd", SpecialCase{ .tokens = .{ "There", "'d", "" }, .len = 2 } },
3608 .{ "There'd've", SpecialCase{ .tokens = .{ "There", "'d", "'ve" }, .len = 3 } },
3609 .{ "There'll", SpecialCase{ .tokens = .{ "There", "'ll", "" }, .len = 2 } },
3610 .{ "There'll've", SpecialCase{ .tokens = .{ "There", "'ll", "'ve" }, .len = 3 } },
3611 .{ "There're", SpecialCase{ .tokens = .{ "There", "'re", "" }, .len = 2 } },
3612 .{ "There's", SpecialCase{ .tokens = .{ "There", "'s", "" }, .len = 2 } },
3613 .{ "There've", SpecialCase{ .tokens = .{ "There", "'ve", "" }, .len = 2 } },
3614 .{ "Thered", SpecialCase{ .tokens = .{ "There", "d", "" }, .len = 2 } },
3615 .{ "Theredve", SpecialCase{ .tokens = .{ "There", "d", "ve" }, .len = 3 } },
3616 .{ "Therell", SpecialCase{ .tokens = .{ "There", "ll", "" }, .len = 2 } },
3617 .{ "Therellve", SpecialCase{ .tokens = .{ "There", "ll", "ve" }, .len = 3 } },
3618 .{ "Therere", SpecialCase{ .tokens = .{ "There", "re", "" }, .len = 2 } },
3619 .{ "Theres", SpecialCase{ .tokens = .{ "There", "s", "" }, .len = 2 } },
3620 .{ "Thereve", SpecialCase{ .tokens = .{ "There", "ve", "" }, .len = 2 } },
3621 .{ "There\xe2\x80\x99d", SpecialCase{ .tokens = .{ "There", "\xe2\x80\x99d", "" }, .len = 2 } },
3622 .{ "There\xe2\x80\x99d\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "There", "\xe2\x80\x99d", "\xe2\x80\x99ve" }, .len = 3 } },
3623 .{ "There\xe2\x80\x99ll", SpecialCase{ .tokens = .{ "There", "\xe2\x80\x99ll", "" }, .len = 2 } },
3624 .{ "There\xe2\x80\x99ll\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "There", "\xe2\x80\x99ll", "\xe2\x80\x99ve" }, .len = 3 } },
3625 .{ "There\xe2\x80\x99re", SpecialCase{ .tokens = .{ "There", "\xe2\x80\x99re", "" }, .len = 2 } },
3626 .{ "There\xe2\x80\x99s", SpecialCase{ .tokens = .{ "There", "\xe2\x80\x99s", "" }, .len = 2 } },
3627 .{ "There\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "There", "\xe2\x80\x99ve", "" }, .len = 2 } },
3628 .{ "These'd", SpecialCase{ .tokens = .{ "These", "'d", "" }, .len = 2 } },
3629 .{ "These'd've", SpecialCase{ .tokens = .{ "These", "'d", "'ve" }, .len = 3 } },
3630 .{ "These'll", SpecialCase{ .tokens = .{ "These", "'ll", "" }, .len = 2 } },
3631 .{ "These'll've", SpecialCase{ .tokens = .{ "These", "'ll", "'ve" }, .len = 3 } },
3632 .{ "These're", SpecialCase{ .tokens = .{ "These", "'re", "" }, .len = 2 } },
3633 .{ "These've", SpecialCase{ .tokens = .{ "These", "'ve", "" }, .len = 2 } },
3634 .{ "Thesed", SpecialCase{ .tokens = .{ "These", "d", "" }, .len = 2 } },
3635 .{ "Thesedve", SpecialCase{ .tokens = .{ "These", "d", "ve" }, .len = 3 } },
3636 .{ "Thesell", SpecialCase{ .tokens = .{ "These", "ll", "" }, .len = 2 } },
3637 .{ "Thesellve", SpecialCase{ .tokens = .{ "These", "ll", "ve" }, .len = 3 } },
3638 .{ "Thesere", SpecialCase{ .tokens = .{ "These", "re", "" }, .len = 2 } },
3639 .{ "Theseve", SpecialCase{ .tokens = .{ "These", "ve", "" }, .len = 2 } },
3640 .{ "These\xe2\x80\x99d", SpecialCase{ .tokens = .{ "These", "\xe2\x80\x99d", "" }, .len = 2 } },
3641 .{ "These\xe2\x80\x99d\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "These", "\xe2\x80\x99d", "\xe2\x80\x99ve" }, .len = 3 } },
3642 .{ "These\xe2\x80\x99ll", SpecialCase{ .tokens = .{ "These", "\xe2\x80\x99ll", "" }, .len = 2 } },
3643 .{ "These\xe2\x80\x99ll\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "These", "\xe2\x80\x99ll", "\xe2\x80\x99ve" }, .len = 3 } },
3644 .{ "These\xe2\x80\x99re", SpecialCase{ .tokens = .{ "These", "\xe2\x80\x99re", "" }, .len = 2 } },
3645 .{ "These\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "These", "\xe2\x80\x99ve", "" }, .len = 2 } },
3646 .{ "They'd", SpecialCase{ .tokens = .{ "They", "'d", "" }, .len = 2 } },
3647 .{ "They'd've", SpecialCase{ .tokens = .{ "They", "'d", "'ve" }, .len = 3 } },
3648 .{ "They'll", SpecialCase{ .tokens = .{ "They", "'ll", "" }, .len = 2 } },
3649 .{ "They'll've", SpecialCase{ .tokens = .{ "They", "'ll", "'ve" }, .len = 3 } },
3650 .{ "They're", SpecialCase{ .tokens = .{ "They", "'re", "" }, .len = 2 } },
3651 .{ "They've", SpecialCase{ .tokens = .{ "They", "'ve", "" }, .len = 2 } },
3652 .{ "Theyd", SpecialCase{ .tokens = .{ "They", "d", "" }, .len = 2 } },
3653 .{ "Theydve", SpecialCase{ .tokens = .{ "They", "d", "ve" }, .len = 3 } },
3654 .{ "Theyll", SpecialCase{ .tokens = .{ "They", "ll", "" }, .len = 2 } },
3655 .{ "Theyllve", SpecialCase{ .tokens = .{ "They", "ll", "ve" }, .len = 3 } },
3656 .{ "Theyre", SpecialCase{ .tokens = .{ "They", "re", "" }, .len = 2 } },
3657 .{ "Theyve", SpecialCase{ .tokens = .{ "They", "ve", "" }, .len = 2 } },
3658 .{ "They\xe2\x80\x99d", SpecialCase{ .tokens = .{ "They", "\xe2\x80\x99d", "" }, .len = 2 } },
3659 .{ "They\xe2\x80\x99d\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "They", "\xe2\x80\x99d", "\xe2\x80\x99ve" }, .len = 3 } },
3660 .{ "They\xe2\x80\x99ll", SpecialCase{ .tokens = .{ "They", "\xe2\x80\x99ll", "" }, .len = 2 } },
3661 .{ "They\xe2\x80\x99ll\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "They", "\xe2\x80\x99ll", "\xe2\x80\x99ve" }, .len = 3 } },
3662 .{ "They\xe2\x80\x99re", SpecialCase{ .tokens = .{ "They", "\xe2\x80\x99re", "" }, .len = 2 } },
3663 .{ "They\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "They", "\xe2\x80\x99ve", "" }, .len = 2 } },
3664 .{ "This'd", SpecialCase{ .tokens = .{ "This", "'d", "" }, .len = 2 } },
3665 .{ "This'd've", SpecialCase{ .tokens = .{ "This", "'d", "'ve" }, .len = 3 } },
3666 .{ "This'll", SpecialCase{ .tokens = .{ "This", "'ll", "" }, .len = 2 } },
3667 .{ "This'll've", SpecialCase{ .tokens = .{ "This", "'ll", "'ve" }, .len = 3 } },
3668 .{ "This's", SpecialCase{ .tokens = .{ "This", "'s", "" }, .len = 2 } },
3669 .{ "Thisd", SpecialCase{ .tokens = .{ "This", "d", "" }, .len = 2 } },
3670 .{ "Thisdve", SpecialCase{ .tokens = .{ "This", "d", "ve" }, .len = 3 } },
3671 .{ "Thisll", SpecialCase{ .tokens = .{ "This", "ll", "" }, .len = 2 } },
3672 .{ "Thisllve", SpecialCase{ .tokens = .{ "This", "ll", "ve" }, .len = 3 } },
3673 .{ "Thiss", SpecialCase{ .tokens = .{ "This", "s", "" }, .len = 2 } },
3674 .{ "This\xe2\x80\x99d", SpecialCase{ .tokens = .{ "This", "\xe2\x80\x99d", "" }, .len = 2 } },
3675 .{ "This\xe2\x80\x99d\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "This", "\xe2\x80\x99d", "\xe2\x80\x99ve" }, .len = 3 } },
3676 .{ "This\xe2\x80\x99ll", SpecialCase{ .tokens = .{ "This", "\xe2\x80\x99ll", "" }, .len = 2 } },
3677 .{ "This\xe2\x80\x99ll\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "This", "\xe2\x80\x99ll", "\xe2\x80\x99ve" }, .len = 3 } },
3678 .{ "This\xe2\x80\x99s", SpecialCase{ .tokens = .{ "This", "\xe2\x80\x99s", "" }, .len = 2 } },
3679 .{ "Those'd", SpecialCase{ .tokens = .{ "Those", "'d", "" }, .len = 2 } },
3680 .{ "Those'd've", SpecialCase{ .tokens = .{ "Those", "'d", "'ve" }, .len = 3 } },
3681 .{ "Those'll", SpecialCase{ .tokens = .{ "Those", "'ll", "" }, .len = 2 } },
3682 .{ "Those'll've", SpecialCase{ .tokens = .{ "Those", "'ll", "'ve" }, .len = 3 } },
3683 .{ "Those're", SpecialCase{ .tokens = .{ "Those", "'re", "" }, .len = 2 } },
3684 .{ "Those've", SpecialCase{ .tokens = .{ "Those", "'ve", "" }, .len = 2 } },
3685 .{ "Thosed", SpecialCase{ .tokens = .{ "Those", "d", "" }, .len = 2 } },
3686 .{ "Thosedve", SpecialCase{ .tokens = .{ "Those", "d", "ve" }, .len = 3 } },
3687 .{ "Thosell", SpecialCase{ .tokens = .{ "Those", "ll", "" }, .len = 2 } },
3688 .{ "Thosellve", SpecialCase{ .tokens = .{ "Those", "ll", "ve" }, .len = 3 } },
3689 .{ "Thosere", SpecialCase{ .tokens = .{ "Those", "re", "" }, .len = 2 } },
3690 .{ "Thoseve", SpecialCase{ .tokens = .{ "Those", "ve", "" }, .len = 2 } },
3691 .{ "Those\xe2\x80\x99d", SpecialCase{ .tokens = .{ "Those", "\xe2\x80\x99d", "" }, .len = 2 } },
3692 .{ "Those\xe2\x80\x99d\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "Those", "\xe2\x80\x99d", "\xe2\x80\x99ve" }, .len = 3 } },
3693 .{ "Those\xe2\x80\x99ll", SpecialCase{ .tokens = .{ "Those", "\xe2\x80\x99ll", "" }, .len = 2 } },
3694 .{ "Those\xe2\x80\x99ll\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "Those", "\xe2\x80\x99ll", "\xe2\x80\x99ve" }, .len = 3 } },
3695 .{ "Those\xe2\x80\x99re", SpecialCase{ .tokens = .{ "Those", "\xe2\x80\x99re", "" }, .len = 2 } },
3696 .{ "Those\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "Those", "\xe2\x80\x99ve", "" }, .len = 2 } },
3697 .{ "V.V", SpecialCase{ .tokens = .{ "V.V", "", "" }, .len = 1 } },
3698 .{ "V_V", SpecialCase{ .tokens = .{ "V_V", "", "" }, .len = 1 } },
3699 .{ "Va.", SpecialCase{ .tokens = .{ "Va.", "", "" }, .len = 1 } },
3700 .{ "Wash.", SpecialCase{ .tokens = .{ "Wash.", "", "" }, .len = 1 } },
3701 .{ "Wasn't", SpecialCase{ .tokens = .{ "Was", "n't", "" }, .len = 2 } },
3702 .{ "Wasnt", SpecialCase{ .tokens = .{ "Was", "nt", "" }, .len = 2 } },
3703 .{ "Wasn\xe2\x80\x99t", SpecialCase{ .tokens = .{ "Was", "n\xe2\x80\x99t", "" }, .len = 2 } },
3704 .{ "We'd", SpecialCase{ .tokens = .{ "We", "'d", "" }, .len = 2 } },
3705 .{ "We'd've", SpecialCase{ .tokens = .{ "We", "'d", "'ve" }, .len = 3 } },
3706 .{ "We'll", SpecialCase{ .tokens = .{ "We", "'ll", "" }, .len = 2 } },
3707 .{ "We'll've", SpecialCase{ .tokens = .{ "We", "'ll", "'ve" }, .len = 3 } },
3708 .{ "We're", SpecialCase{ .tokens = .{ "We", "'re", "" }, .len = 2 } },
3709 .{ "We've", SpecialCase{ .tokens = .{ "We", "'ve", "" }, .len = 2 } },
3710 .{ "Wed", SpecialCase{ .tokens = .{ "We", "d", "" }, .len = 2 } },
3711 .{ "Wedve", SpecialCase{ .tokens = .{ "We", "d", "ve" }, .len = 3 } },
3712 .{ "Wellve", SpecialCase{ .tokens = .{ "We", "ll", "ve" }, .len = 3 } },
3713 .{ "Weren't", SpecialCase{ .tokens = .{ "Were", "n't", "" }, .len = 2 } },
3714 .{ "Werent", SpecialCase{ .tokens = .{ "Were", "nt", "" }, .len = 2 } },
3715 .{ "Weren\xe2\x80\x99t", SpecialCase{ .tokens = .{ "Were", "n\xe2\x80\x99t", "" }, .len = 2 } },
3716 .{ "Weve", SpecialCase{ .tokens = .{ "We", "ve", "" }, .len = 2 } },
3717 .{ "We\xe2\x80\x99d", SpecialCase{ .tokens = .{ "We", "\xe2\x80\x99d", "" }, .len = 2 } },
3718 .{ "We\xe2\x80\x99d\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "We", "\xe2\x80\x99d", "\xe2\x80\x99ve" }, .len = 3 } },
3719 .{ "We\xe2\x80\x99ll", SpecialCase{ .tokens = .{ "We", "\xe2\x80\x99ll", "" }, .len = 2 } },
3720 .{ "We\xe2\x80\x99ll\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "We", "\xe2\x80\x99ll", "\xe2\x80\x99ve" }, .len = 3 } },
3721 .{ "We\xe2\x80\x99re", SpecialCase{ .tokens = .{ "We", "\xe2\x80\x99re", "" }, .len = 2 } },
3722 .{ "We\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "We", "\xe2\x80\x99ve", "" }, .len = 2 } },
3723 .{ "What'd", SpecialCase{ .tokens = .{ "What", "'d", "" }, .len = 2 } },
3724 .{ "What'd've", SpecialCase{ .tokens = .{ "What", "'d", "'ve" }, .len = 3 } },
3725 .{ "What'll", SpecialCase{ .tokens = .{ "What", "'ll", "" }, .len = 2 } },
3726 .{ "What'll've", SpecialCase{ .tokens = .{ "What", "'ll", "'ve" }, .len = 3 } },
3727 .{ "What're", SpecialCase{ .tokens = .{ "What", "'re", "" }, .len = 2 } },
3728 .{ "What's", SpecialCase{ .tokens = .{ "What", "'s", "" }, .len = 2 } },
3729 .{ "What've", SpecialCase{ .tokens = .{ "What", "'ve", "" }, .len = 2 } },
3730 .{ "Whatd", SpecialCase{ .tokens = .{ "What", "d", "" }, .len = 2 } },
3731 .{ "Whatdve", SpecialCase{ .tokens = .{ "What", "d", "ve" }, .len = 3 } },
3732 .{ "Whatll", SpecialCase{ .tokens = .{ "What", "ll", "" }, .len = 2 } },
3733 .{ "Whatllve", SpecialCase{ .tokens = .{ "What", "ll", "ve" }, .len = 3 } },
3734 .{ "Whatre", SpecialCase{ .tokens = .{ "What", "re", "" }, .len = 2 } },
3735 .{ "Whats", SpecialCase{ .tokens = .{ "What", "s", "" }, .len = 2 } },
3736 .{ "Whatve", SpecialCase{ .tokens = .{ "What", "ve", "" }, .len = 2 } },
3737 .{ "What\xe2\x80\x99d", SpecialCase{ .tokens = .{ "What", "\xe2\x80\x99d", "" }, .len = 2 } },
3738 .{ "What\xe2\x80\x99d\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "What", "\xe2\x80\x99d", "\xe2\x80\x99ve" }, .len = 3 } },
3739 .{ "What\xe2\x80\x99ll", SpecialCase{ .tokens = .{ "What", "\xe2\x80\x99ll", "" }, .len = 2 } },
3740 .{ "What\xe2\x80\x99ll\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "What", "\xe2\x80\x99ll", "\xe2\x80\x99ve" }, .len = 3 } },
3741 .{ "What\xe2\x80\x99re", SpecialCase{ .tokens = .{ "What", "\xe2\x80\x99re", "" }, .len = 2 } },
3742 .{ "What\xe2\x80\x99s", SpecialCase{ .tokens = .{ "What", "\xe2\x80\x99s", "" }, .len = 2 } },
3743 .{ "What\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "What", "\xe2\x80\x99ve", "" }, .len = 2 } },
3744 .{ "When'd", SpecialCase{ .tokens = .{ "When", "'d", "" }, .len = 2 } },
3745 .{ "When'd've", SpecialCase{ .tokens = .{ "When", "'d", "'ve" }, .len = 3 } },
3746 .{ "When'll", SpecialCase{ .tokens = .{ "When", "'ll", "" }, .len = 2 } },
3747 .{ "When'll've", SpecialCase{ .tokens = .{ "When", "'ll", "'ve" }, .len = 3 } },
3748 .{ "When're", SpecialCase{ .tokens = .{ "When", "'re", "" }, .len = 2 } },
3749 .{ "When's", SpecialCase{ .tokens = .{ "When", "'s", "" }, .len = 2 } },
3750 .{ "When've", SpecialCase{ .tokens = .{ "When", "'ve", "" }, .len = 2 } },
3751 .{ "Whend", SpecialCase{ .tokens = .{ "When", "d", "" }, .len = 2 } },
3752 .{ "Whendve", SpecialCase{ .tokens = .{ "When", "d", "ve" }, .len = 3 } },
3753 .{ "Whenll", SpecialCase{ .tokens = .{ "When", "ll", "" }, .len = 2 } },
3754 .{ "Whenllve", SpecialCase{ .tokens = .{ "When", "ll", "ve" }, .len = 3 } },
3755 .{ "Whenre", SpecialCase{ .tokens = .{ "When", "re", "" }, .len = 2 } },
3756 .{ "Whens", SpecialCase{ .tokens = .{ "When", "s", "" }, .len = 2 } },
3757 .{ "Whenve", SpecialCase{ .tokens = .{ "When", "ve", "" }, .len = 2 } },
3758 .{ "When\xe2\x80\x99d", SpecialCase{ .tokens = .{ "When", "\xe2\x80\x99d", "" }, .len = 2 } },
3759 .{ "When\xe2\x80\x99d\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "When", "\xe2\x80\x99d", "\xe2\x80\x99ve" }, .len = 3 } },
3760 .{ "When\xe2\x80\x99ll", SpecialCase{ .tokens = .{ "When", "\xe2\x80\x99ll", "" }, .len = 2 } },
3761 .{ "When\xe2\x80\x99ll\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "When", "\xe2\x80\x99ll", "\xe2\x80\x99ve" }, .len = 3 } },
3762 .{ "When\xe2\x80\x99re", SpecialCase{ .tokens = .{ "When", "\xe2\x80\x99re", "" }, .len = 2 } },
3763 .{ "When\xe2\x80\x99s", SpecialCase{ .tokens = .{ "When", "\xe2\x80\x99s", "" }, .len = 2 } },
3764 .{ "When\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "When", "\xe2\x80\x99ve", "" }, .len = 2 } },
3765 .{ "Where'd", SpecialCase{ .tokens = .{ "Where", "'d", "" }, .len = 2 } },
3766 .{ "Where'd've", SpecialCase{ .tokens = .{ "Where", "'d", "'ve" }, .len = 3 } },
3767 .{ "Where'll", SpecialCase{ .tokens = .{ "Where", "'ll", "" }, .len = 2 } },
3768 .{ "Where'll've", SpecialCase{ .tokens = .{ "Where", "'ll", "'ve" }, .len = 3 } },
3769 .{ "Where're", SpecialCase{ .tokens = .{ "Where", "'re", "" }, .len = 2 } },
3770 .{ "Where's", SpecialCase{ .tokens = .{ "Where", "'s", "" }, .len = 2 } },
3771 .{ "Where've", SpecialCase{ .tokens = .{ "Where", "'ve", "" }, .len = 2 } },
3772 .{ "Whered", SpecialCase{ .tokens = .{ "Where", "d", "" }, .len = 2 } },
3773 .{ "Wheredve", SpecialCase{ .tokens = .{ "Where", "d", "ve" }, .len = 3 } },
3774 .{ "Wherell", SpecialCase{ .tokens = .{ "Where", "ll", "" }, .len = 2 } },
3775 .{ "Wherellve", SpecialCase{ .tokens = .{ "Where", "ll", "ve" }, .len = 3 } },
3776 .{ "Wherere", SpecialCase{ .tokens = .{ "Where", "re", "" }, .len = 2 } },
3777 .{ "Wheres", SpecialCase{ .tokens = .{ "Where", "s", "" }, .len = 2 } },
3778 .{ "Whereve", SpecialCase{ .tokens = .{ "Where", "ve", "" }, .len = 2 } },
3779 .{ "Where\xe2\x80\x99d", SpecialCase{ .tokens = .{ "Where", "\xe2\x80\x99d", "" }, .len = 2 } },
3780 .{ "Where\xe2\x80\x99d\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "Where", "\xe2\x80\x99d", "\xe2\x80\x99ve" }, .len = 3 } },
3781 .{ "Where\xe2\x80\x99ll", SpecialCase{ .tokens = .{ "Where", "\xe2\x80\x99ll", "" }, .len = 2 } },
3782 .{ "Where\xe2\x80\x99ll\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "Where", "\xe2\x80\x99ll", "\xe2\x80\x99ve" }, .len = 3 } },
3783 .{ "Where\xe2\x80\x99re", SpecialCase{ .tokens = .{ "Where", "\xe2\x80\x99re", "" }, .len = 2 } },
3784 .{ "Where\xe2\x80\x99s", SpecialCase{ .tokens = .{ "Where", "\xe2\x80\x99s", "" }, .len = 2 } },
3785 .{ "Where\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "Where", "\xe2\x80\x99ve", "" }, .len = 2 } },
3786 .{ "Who'd", SpecialCase{ .tokens = .{ "Who", "'d", "" }, .len = 2 } },
3787 .{ "Who'd've", SpecialCase{ .tokens = .{ "Who", "'d", "'ve" }, .len = 3 } },
3788 .{ "Who'll", SpecialCase{ .tokens = .{ "Who", "'ll", "" }, .len = 2 } },
3789 .{ "Who'll've", SpecialCase{ .tokens = .{ "Who", "'ll", "'ve" }, .len = 3 } },
3790 .{ "Who're", SpecialCase{ .tokens = .{ "Who", "'re", "" }, .len = 2 } },
3791 .{ "Who's", SpecialCase{ .tokens = .{ "Who", "'s", "" }, .len = 2 } },
3792 .{ "Who've", SpecialCase{ .tokens = .{ "Who", "'ve", "" }, .len = 2 } },
3793 .{ "Whod", SpecialCase{ .tokens = .{ "Who", "d", "" }, .len = 2 } },
3794 .{ "Whodve", SpecialCase{ .tokens = .{ "Who", "d", "ve" }, .len = 3 } },
3795 .{ "Wholl", SpecialCase{ .tokens = .{ "Who", "ll", "" }, .len = 2 } },
3796 .{ "Whollve", SpecialCase{ .tokens = .{ "Who", "ll", "ve" }, .len = 3 } },
3797 .{ "Whos", SpecialCase{ .tokens = .{ "Who", "s", "" }, .len = 2 } },
3798 .{ "Whove", SpecialCase{ .tokens = .{ "Who", "ve", "" }, .len = 2 } },
3799 .{ "Who\xe2\x80\x99d", SpecialCase{ .tokens = .{ "Who", "\xe2\x80\x99d", "" }, .len = 2 } },
3800 .{ "Who\xe2\x80\x99d\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "Who", "\xe2\x80\x99d", "\xe2\x80\x99ve" }, .len = 3 } },
3801 .{ "Who\xe2\x80\x99ll", SpecialCase{ .tokens = .{ "Who", "\xe2\x80\x99ll", "" }, .len = 2 } },
3802 .{ "Who\xe2\x80\x99ll\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "Who", "\xe2\x80\x99ll", "\xe2\x80\x99ve" }, .len = 3 } },
3803 .{ "Who\xe2\x80\x99re", SpecialCase{ .tokens = .{ "Who", "\xe2\x80\x99re", "" }, .len = 2 } },
3804 .{ "Who\xe2\x80\x99s", SpecialCase{ .tokens = .{ "Who", "\xe2\x80\x99s", "" }, .len = 2 } },
3805 .{ "Who\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "Who", "\xe2\x80\x99ve", "" }, .len = 2 } },
3806 .{ "Why'd", SpecialCase{ .tokens = .{ "Why", "'d", "" }, .len = 2 } },
3807 .{ "Why'd've", SpecialCase{ .tokens = .{ "Why", "'d", "'ve" }, .len = 3 } },
3808 .{ "Why'll", SpecialCase{ .tokens = .{ "Why", "'ll", "" }, .len = 2 } },
3809 .{ "Why'll've", SpecialCase{ .tokens = .{ "Why", "'ll", "'ve" }, .len = 3 } },
3810 .{ "Why're", SpecialCase{ .tokens = .{ "Why", "'re", "" }, .len = 2 } },
3811 .{ "Why's", SpecialCase{ .tokens = .{ "Why", "'s", "" }, .len = 2 } },
3812 .{ "Why've", SpecialCase{ .tokens = .{ "Why", "'ve", "" }, .len = 2 } },
3813 .{ "Whyd", SpecialCase{ .tokens = .{ "Why", "d", "" }, .len = 2 } },
3814 .{ "Whydve", SpecialCase{ .tokens = .{ "Why", "d", "ve" }, .len = 3 } },
3815 .{ "Whyll", SpecialCase{ .tokens = .{ "Why", "ll", "" }, .len = 2 } },
3816 .{ "Whyllve", SpecialCase{ .tokens = .{ "Why", "ll", "ve" }, .len = 3 } },
3817 .{ "Whyre", SpecialCase{ .tokens = .{ "Why", "re", "" }, .len = 2 } },
3818 .{ "Whys", SpecialCase{ .tokens = .{ "Why", "s", "" }, .len = 2 } },
3819 .{ "Whyve", SpecialCase{ .tokens = .{ "Why", "ve", "" }, .len = 2 } },
3820 .{ "Why\xe2\x80\x99d", SpecialCase{ .tokens = .{ "Why", "\xe2\x80\x99d", "" }, .len = 2 } },
3821 .{ "Why\xe2\x80\x99d\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "Why", "\xe2\x80\x99d", "\xe2\x80\x99ve" }, .len = 3 } },
3822 .{ "Why\xe2\x80\x99ll", SpecialCase{ .tokens = .{ "Why", "\xe2\x80\x99ll", "" }, .len = 2 } },
3823 .{ "Why\xe2\x80\x99ll\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "Why", "\xe2\x80\x99ll", "\xe2\x80\x99ve" }, .len = 3 } },
3824 .{ "Why\xe2\x80\x99re", SpecialCase{ .tokens = .{ "Why", "\xe2\x80\x99re", "" }, .len = 2 } },
3825 .{ "Why\xe2\x80\x99s", SpecialCase{ .tokens = .{ "Why", "\xe2\x80\x99s", "" }, .len = 2 } },
3826 .{ "Why\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "Why", "\xe2\x80\x99ve", "" }, .len = 2 } },
3827 .{ "Wis.", SpecialCase{ .tokens = .{ "Wis.", "", "" }, .len = 1 } },
3828 .{ "Won't", SpecialCase{ .tokens = .{ "Wo", "n't", "" }, .len = 2 } },
3829 .{ "Won't've", SpecialCase{ .tokens = .{ "Wo", "n't", "'ve" }, .len = 3 } },
3830 .{ "Wont", SpecialCase{ .tokens = .{ "Wo", "nt", "" }, .len = 2 } },
3831 .{ "Wontve", SpecialCase{ .tokens = .{ "Wo", "nt", "ve" }, .len = 3 } },
3832 .{ "Won\xe2\x80\x99t", SpecialCase{ .tokens = .{ "Wo", "n\xe2\x80\x99t", "" }, .len = 2 } },
3833 .{ "Won\xe2\x80\x99t\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "Wo", "n\xe2\x80\x99t", "\xe2\x80\x99ve" }, .len = 3 } },
3834 .{ "Would've", SpecialCase{ .tokens = .{ "Would", "'ve", "" }, .len = 2 } },
3835 .{ "Wouldn't", SpecialCase{ .tokens = .{ "Would", "n't", "" }, .len = 2 } },
3836 .{ "Wouldn't've", SpecialCase{ .tokens = .{ "Would", "n't", "'ve" }, .len = 3 } },
3837 .{ "Wouldnt", SpecialCase{ .tokens = .{ "Would", "nt", "" }, .len = 2 } },
3838 .{ "Wouldntve", SpecialCase{ .tokens = .{ "Would", "nt", "ve" }, .len = 3 } },
3839 .{ "Wouldn\xe2\x80\x99t", SpecialCase{ .tokens = .{ "Would", "n\xe2\x80\x99t", "" }, .len = 2 } },
3840 .{ "Wouldn\xe2\x80\x99t\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "Would", "n\xe2\x80\x99t", "\xe2\x80\x99ve" }, .len = 3 } },
3841 .{ "Wouldve", SpecialCase{ .tokens = .{ "Would", "ve", "" }, .len = 2 } },
3842 .{ "Would\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "Would", "\xe2\x80\x99ve", "" }, .len = 2 } },
3843 .{ "XD", SpecialCase{ .tokens = .{ "XD", "", "" }, .len = 1 } },
3844 .{ "XDD", SpecialCase{ .tokens = .{ "XDD", "", "" }, .len = 1 } },
3845 .{ "You'd", SpecialCase{ .tokens = .{ "You", "'d", "" }, .len = 2 } },
3846 .{ "You'd've", SpecialCase{ .tokens = .{ "You", "'d", "'ve" }, .len = 3 } },
3847 .{ "You'll", SpecialCase{ .tokens = .{ "You", "'ll", "" }, .len = 2 } },
3848 .{ "You'll've", SpecialCase{ .tokens = .{ "You", "'ll", "'ve" }, .len = 3 } },
3849 .{ "You're", SpecialCase{ .tokens = .{ "You", "'re", "" }, .len = 2 } },
3850 .{ "You've", SpecialCase{ .tokens = .{ "You", "'ve", "" }, .len = 2 } },
3851 .{ "Youd", SpecialCase{ .tokens = .{ "You", "d", "" }, .len = 2 } },
3852 .{ "Youdve", SpecialCase{ .tokens = .{ "You", "d", "ve" }, .len = 3 } },
3853 .{ "Youll", SpecialCase{ .tokens = .{ "You", "ll", "" }, .len = 2 } },
3854 .{ "Youllve", SpecialCase{ .tokens = .{ "You", "ll", "ve" }, .len = 3 } },
3855 .{ "Youre", SpecialCase{ .tokens = .{ "You", "re", "" }, .len = 2 } },
3856 .{ "Youve", SpecialCase{ .tokens = .{ "You", "ve", "" }, .len = 2 } },
3857 .{ "You\xe2\x80\x99d", SpecialCase{ .tokens = .{ "You", "\xe2\x80\x99d", "" }, .len = 2 } },
3858 .{ "You\xe2\x80\x99d\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "You", "\xe2\x80\x99d", "\xe2\x80\x99ve" }, .len = 3 } },
3859 .{ "You\xe2\x80\x99ll", SpecialCase{ .tokens = .{ "You", "\xe2\x80\x99ll", "" }, .len = 2 } },
3860 .{ "You\xe2\x80\x99ll\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "You", "\xe2\x80\x99ll", "\xe2\x80\x99ve" }, .len = 3 } },
3861 .{ "You\xe2\x80\x99re", SpecialCase{ .tokens = .{ "You", "\xe2\x80\x99re", "" }, .len = 2 } },
3862 .{ "You\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "You", "\xe2\x80\x99ve", "" }, .len = 2 } },
3863 .{ "[-:", SpecialCase{ .tokens = .{ "[-:", "", "" }, .len = 1 } },
3864 .{ "[:", SpecialCase{ .tokens = .{ "[:", "", "" }, .len = 1 } },
3865 .{ "[=", SpecialCase{ .tokens = .{ "[=", "", "" }, .len = 1 } },
3866 .{ "\\\")", SpecialCase{ .tokens = .{ "\\\")", "", "" }, .len = 1 } },
3867 .{ "\\n", SpecialCase{ .tokens = .{ "\\n", "", "" }, .len = 1 } },
3868 .{ "\\t", SpecialCase{ .tokens = .{ "\\t", "", "" }, .len = 1 } },
3869 .{ "]=", SpecialCase{ .tokens = .{ "]=", "", "" }, .len = 1 } },
3870 .{ "^_^", SpecialCase{ .tokens = .{ "^_^", "", "" }, .len = 1 } },
3871 .{ "^__^", SpecialCase{ .tokens = .{ "^__^", "", "" }, .len = 1 } },
3872 .{ "^___^", SpecialCase{ .tokens = .{ "^___^", "", "" }, .len = 1 } },
3873 .{ "a.", SpecialCase{ .tokens = .{ "a.", "", "" }, .len = 1 } },
3874 .{ "a.m.", SpecialCase{ .tokens = .{ "a.m.", "", "" }, .len = 1 } },
3875 .{ "ain't", SpecialCase{ .tokens = .{ "ai", "n't", "" }, .len = 2 } },
3876 .{ "aint", SpecialCase{ .tokens = .{ "ai", "nt", "" }, .len = 2 } },
3877 .{ "ain\xe2\x80\x99t", SpecialCase{ .tokens = .{ "ai", "n\xe2\x80\x99t", "" }, .len = 2 } },
3878 .{ "and/or", SpecialCase{ .tokens = .{ "and/or", "", "" }, .len = 1 } },
3879 .{ "aren't", SpecialCase{ .tokens = .{ "are", "n't", "" }, .len = 2 } },
3880 .{ "arent", SpecialCase{ .tokens = .{ "are", "nt", "" }, .len = 2 } },
3881 .{ "aren\xe2\x80\x99t", SpecialCase{ .tokens = .{ "are", "n\xe2\x80\x99t", "" }, .len = 2 } },
3882 .{ "b.", SpecialCase{ .tokens = .{ "b.", "", "" }, .len = 1 } },
3883 .{ "c'mon", SpecialCase{ .tokens = .{ "c'm", "on", "" }, .len = 2 } },
3884 .{ "c.", SpecialCase{ .tokens = .{ "c.", "", "" }, .len = 1 } },
3885 .{ "can't", SpecialCase{ .tokens = .{ "ca", "n't", "" }, .len = 2 } },
3886 .{ "can't've", SpecialCase{ .tokens = .{ "ca", "n't", "'ve" }, .len = 3 } },
3887 .{ "cannot", SpecialCase{ .tokens = .{ "can", "not", "" }, .len = 2 } },
3888 .{ "cant", SpecialCase{ .tokens = .{ "ca", "nt", "" }, .len = 2 } },
3889 .{ "cantve", SpecialCase{ .tokens = .{ "ca", "nt", "ve" }, .len = 3 } },
3890 .{ "can\xe2\x80\x99t", SpecialCase{ .tokens = .{ "ca", "n\xe2\x80\x99t", "" }, .len = 2 } },
3891 .{ "can\xe2\x80\x99t\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "ca", "n\xe2\x80\x99t", "\xe2\x80\x99ve" }, .len = 3 } },
3892 .{ "co.", SpecialCase{ .tokens = .{ "co.", "", "" }, .len = 1 } },
3893 .{ "could've", SpecialCase{ .tokens = .{ "could", "'ve", "" }, .len = 2 } },
3894 .{ "couldn't", SpecialCase{ .tokens = .{ "could", "n't", "" }, .len = 2 } },
3895 .{ "couldn't've", SpecialCase{ .tokens = .{ "could", "n't", "'ve" }, .len = 3 } },
3896 .{ "couldnt", SpecialCase{ .tokens = .{ "could", "nt", "" }, .len = 2 } },
3897 .{ "couldntve", SpecialCase{ .tokens = .{ "could", "nt", "ve" }, .len = 3 } },
3898 .{ "couldn\xe2\x80\x99t", SpecialCase{ .tokens = .{ "could", "n\xe2\x80\x99t", "" }, .len = 2 } },
3899 .{ "couldn\xe2\x80\x99t\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "could", "n\xe2\x80\x99t", "\xe2\x80\x99ve" }, .len = 3 } },
3900 .{ "couldve", SpecialCase{ .tokens = .{ "could", "ve", "" }, .len = 2 } },
3901 .{ "could\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "could", "\xe2\x80\x99ve", "" }, .len = 2 } },
3902 .{ "c\xe2\x80\x99mon", SpecialCase{ .tokens = .{ "c\xe2\x80\x99m", "on", "" }, .len = 2 } },
3903 .{ "d.", SpecialCase{ .tokens = .{ "d.", "", "" }, .len = 1 } },
3904 .{ "daren't", SpecialCase{ .tokens = .{ "dare", "n't", "" }, .len = 2 } },
3905 .{ "darent", SpecialCase{ .tokens = .{ "dare", "nt", "" }, .len = 2 } },
3906 .{ "daren\xe2\x80\x99t", SpecialCase{ .tokens = .{ "dare", "n\xe2\x80\x99t", "" }, .len = 2 } },
3907 .{ "didn't", SpecialCase{ .tokens = .{ "did", "n't", "" }, .len = 2 } },
3908 .{ "didn't've", SpecialCase{ .tokens = .{ "did", "n't", "'ve" }, .len = 3 } },
3909 .{ "didnt", SpecialCase{ .tokens = .{ "did", "nt", "" }, .len = 2 } },
3910 .{ "didntve", SpecialCase{ .tokens = .{ "did", "nt", "ve" }, .len = 3 } },
3911 .{ "didn\xe2\x80\x99t", SpecialCase{ .tokens = .{ "did", "n\xe2\x80\x99t", "" }, .len = 2 } },
3912 .{ "didn\xe2\x80\x99t\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "did", "n\xe2\x80\x99t", "\xe2\x80\x99ve" }, .len = 3 } },
3913 .{ "doesn't", SpecialCase{ .tokens = .{ "does", "n't", "" }, .len = 2 } },
3914 .{ "doesn't've", SpecialCase{ .tokens = .{ "does", "n't", "'ve" }, .len = 3 } },
3915 .{ "doesnt", SpecialCase{ .tokens = .{ "does", "nt", "" }, .len = 2 } },
3916 .{ "doesntve", SpecialCase{ .tokens = .{ "does", "nt", "ve" }, .len = 3 } },
3917 .{ "doesn\xe2\x80\x99t", SpecialCase{ .tokens = .{ "does", "n\xe2\x80\x99t", "" }, .len = 2 } },
3918 .{ "doesn\xe2\x80\x99t\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "does", "n\xe2\x80\x99t", "\xe2\x80\x99ve" }, .len = 3 } },
3919 .{ "doin", SpecialCase{ .tokens = .{ "doin", "", "" }, .len = 1 } },
3920 .{ "doin'", SpecialCase{ .tokens = .{ "doin'", "", "" }, .len = 1 } },
3921 .{ "doin\xe2\x80\x99", SpecialCase{ .tokens = .{ "doin\xe2\x80\x99", "", "" }, .len = 1 } },
3922 .{ "don't", SpecialCase{ .tokens = .{ "do", "n't", "" }, .len = 2 } },
3923 .{ "don't've", SpecialCase{ .tokens = .{ "do", "n't", "'ve" }, .len = 3 } },
3924 .{ "dont", SpecialCase{ .tokens = .{ "do", "nt", "" }, .len = 2 } },
3925 .{ "dontve", SpecialCase{ .tokens = .{ "do", "nt", "ve" }, .len = 3 } },
3926 .{ "don\xe2\x80\x99t", SpecialCase{ .tokens = .{ "do", "n\xe2\x80\x99t", "" }, .len = 2 } },
3927 .{ "don\xe2\x80\x99t\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "do", "n\xe2\x80\x99t", "\xe2\x80\x99ve" }, .len = 3 } },
3928 .{ "e.", SpecialCase{ .tokens = .{ "e.", "", "" }, .len = 1 } },
3929 .{ "e.g.", SpecialCase{ .tokens = .{ "e.g.", "", "" }, .len = 1 } },
3930 .{ "em", SpecialCase{ .tokens = .{ "em", "", "" }, .len = 1 } },
3931 .{ "f.", SpecialCase{ .tokens = .{ "f.", "", "" }, .len = 1 } },
3932 .{ "g.", SpecialCase{ .tokens = .{ "g.", "", "" }, .len = 1 } },
3933 .{ "goin", SpecialCase{ .tokens = .{ "goin", "", "" }, .len = 1 } },
3934 .{ "goin'", SpecialCase{ .tokens = .{ "goin'", "", "" }, .len = 1 } },
3935 .{ "goin\xe2\x80\x99", SpecialCase{ .tokens = .{ "goin\xe2\x80\x99", "", "" }, .len = 1 } },
3936 .{ "gonna", SpecialCase{ .tokens = .{ "gon", "na", "" }, .len = 2 } },
3937 .{ "gotta", SpecialCase{ .tokens = .{ "got", "ta", "" }, .len = 2 } },
3938 .{ "h.", SpecialCase{ .tokens = .{ "h.", "", "" }, .len = 1 } },
3939 .{ "hadn't", SpecialCase{ .tokens = .{ "had", "n't", "" }, .len = 2 } },
3940 .{ "hadn't've", SpecialCase{ .tokens = .{ "had", "n't", "'ve" }, .len = 3 } },
3941 .{ "hadnt", SpecialCase{ .tokens = .{ "had", "nt", "" }, .len = 2 } },
3942 .{ "hadntve", SpecialCase{ .tokens = .{ "had", "nt", "ve" }, .len = 3 } },
3943 .{ "hadn\xe2\x80\x99t", SpecialCase{ .tokens = .{ "had", "n\xe2\x80\x99t", "" }, .len = 2 } },
3944 .{ "hadn\xe2\x80\x99t\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "had", "n\xe2\x80\x99t", "\xe2\x80\x99ve" }, .len = 3 } },
3945 .{ "hasn't", SpecialCase{ .tokens = .{ "has", "n't", "" }, .len = 2 } },
3946 .{ "hasnt", SpecialCase{ .tokens = .{ "has", "nt", "" }, .len = 2 } },
3947 .{ "hasn\xe2\x80\x99t", SpecialCase{ .tokens = .{ "has", "n\xe2\x80\x99t", "" }, .len = 2 } },
3948 .{ "haven't", SpecialCase{ .tokens = .{ "have", "n't", "" }, .len = 2 } },
3949 .{ "havent", SpecialCase{ .tokens = .{ "have", "nt", "" }, .len = 2 } },
3950 .{ "haven\xe2\x80\x99t", SpecialCase{ .tokens = .{ "have", "n\xe2\x80\x99t", "" }, .len = 2 } },
3951 .{ "havin", SpecialCase{ .tokens = .{ "havin", "", "" }, .len = 1 } },
3952 .{ "havin'", SpecialCase{ .tokens = .{ "havin'", "", "" }, .len = 1 } },
3953 .{ "havin\xe2\x80\x99", SpecialCase{ .tokens = .{ "havin\xe2\x80\x99", "", "" }, .len = 1 } },
3954 .{ "he'd", SpecialCase{ .tokens = .{ "he", "'d", "" }, .len = 2 } },
3955 .{ "he'd've", SpecialCase{ .tokens = .{ "he", "'d", "'ve" }, .len = 3 } },
3956 .{ "he'll", SpecialCase{ .tokens = .{ "he", "'ll", "" }, .len = 2 } },
3957 .{ "he'll've", SpecialCase{ .tokens = .{ "he", "'ll", "'ve" }, .len = 3 } },
3958 .{ "he's", SpecialCase{ .tokens = .{ "he", "'s", "" }, .len = 2 } },
3959 .{ "hed", SpecialCase{ .tokens = .{ "he", "d", "" }, .len = 2 } },
3960 .{ "hedve", SpecialCase{ .tokens = .{ "he", "d", "ve" }, .len = 3 } },
3961 .{ "hellve", SpecialCase{ .tokens = .{ "he", "ll", "ve" }, .len = 3 } },
3962 .{ "hes", SpecialCase{ .tokens = .{ "he", "s", "" }, .len = 2 } },
3963 .{ "he\xe2\x80\x99d", SpecialCase{ .tokens = .{ "he", "\xe2\x80\x99d", "" }, .len = 2 } },
3964 .{ "he\xe2\x80\x99d\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "he", "\xe2\x80\x99d", "\xe2\x80\x99ve" }, .len = 3 } },
3965 .{ "he\xe2\x80\x99ll", SpecialCase{ .tokens = .{ "he", "\xe2\x80\x99ll", "" }, .len = 2 } },
3966 .{ "he\xe2\x80\x99ll\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "he", "\xe2\x80\x99ll", "\xe2\x80\x99ve" }, .len = 3 } },
3967 .{ "he\xe2\x80\x99s", SpecialCase{ .tokens = .{ "he", "\xe2\x80\x99s", "" }, .len = 2 } },
3968 .{ "how'd", SpecialCase{ .tokens = .{ "how", "'d", "" }, .len = 2 } },
3969 .{ "how'd've", SpecialCase{ .tokens = .{ "how", "'d", "'ve" }, .len = 3 } },
3970 .{ "how'd'y", SpecialCase{ .tokens = .{ "how", "'d", "'y" }, .len = 3 } },
3971 .{ "how'll", SpecialCase{ .tokens = .{ "how", "'ll", "" }, .len = 2 } },
3972 .{ "how'll've", SpecialCase{ .tokens = .{ "how", "'ll", "'ve" }, .len = 3 } },
3973 .{ "how're", SpecialCase{ .tokens = .{ "how", "'re", "" }, .len = 2 } },
3974 .{ "how's", SpecialCase{ .tokens = .{ "how", "'s", "" }, .len = 2 } },
3975 .{ "how've", SpecialCase{ .tokens = .{ "how", "'ve", "" }, .len = 2 } },
3976 .{ "howd", SpecialCase{ .tokens = .{ "how", "d", "" }, .len = 2 } },
3977 .{ "howdve", SpecialCase{ .tokens = .{ "how", "d", "ve" }, .len = 3 } },
3978 .{ "howll", SpecialCase{ .tokens = .{ "how", "ll", "" }, .len = 2 } },
3979 .{ "howllve", SpecialCase{ .tokens = .{ "how", "ll", "ve" }, .len = 3 } },
3980 .{ "howre", SpecialCase{ .tokens = .{ "how", "re", "" }, .len = 2 } },
3981 .{ "hows", SpecialCase{ .tokens = .{ "how", "s", "" }, .len = 2 } },
3982 .{ "howve", SpecialCase{ .tokens = .{ "how", "ve", "" }, .len = 2 } },
3983 .{ "how\xe2\x80\x99d", SpecialCase{ .tokens = .{ "how", "\xe2\x80\x99d", "" }, .len = 2 } },
3984 .{ "how\xe2\x80\x99d\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "how", "\xe2\x80\x99d", "\xe2\x80\x99ve" }, .len = 3 } },
3985 .{ "how\xe2\x80\x99d\xe2\x80\x99y", SpecialCase{ .tokens = .{ "how", "\xe2\x80\x99d", "\xe2\x80\x99y" }, .len = 3 } },
3986 .{ "how\xe2\x80\x99ll", SpecialCase{ .tokens = .{ "how", "\xe2\x80\x99ll", "" }, .len = 2 } },
3987 .{ "how\xe2\x80\x99ll\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "how", "\xe2\x80\x99ll", "\xe2\x80\x99ve" }, .len = 3 } },
3988 .{ "how\xe2\x80\x99re", SpecialCase{ .tokens = .{ "how", "\xe2\x80\x99re", "" }, .len = 2 } },
3989 .{ "how\xe2\x80\x99s", SpecialCase{ .tokens = .{ "how", "\xe2\x80\x99s", "" }, .len = 2 } },
3990 .{ "how\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "how", "\xe2\x80\x99ve", "" }, .len = 2 } },
3991 .{ "i'd", SpecialCase{ .tokens = .{ "i", "'d", "" }, .len = 2 } },
3992 .{ "i'd've", SpecialCase{ .tokens = .{ "i", "'d", "'ve" }, .len = 3 } },
3993 .{ "i'll", SpecialCase{ .tokens = .{ "i", "'ll", "" }, .len = 2 } },
3994 .{ "i'll've", SpecialCase{ .tokens = .{ "i", "'ll", "'ve" }, .len = 3 } },
3995 .{ "i'm", SpecialCase{ .tokens = .{ "i", "'m", "" }, .len = 2 } },
3996 .{ "i'ma", SpecialCase{ .tokens = .{ "i", "'m", "a" }, .len = 3 } },
3997 .{ "i've", SpecialCase{ .tokens = .{ "i", "'ve", "" }, .len = 2 } },
3998 .{ "i.", SpecialCase{ .tokens = .{ "i.", "", "" }, .len = 1 } },
3999 .{ "i.e.", SpecialCase{ .tokens = .{ "i.e.", "", "" }, .len = 1 } },
4000 .{ "id", SpecialCase{ .tokens = .{ "i", "d", "" }, .len = 2 } },
4001 .{ "idve", SpecialCase{ .tokens = .{ "i", "d", "ve" }, .len = 3 } },
4002 .{ "illve", SpecialCase{ .tokens = .{ "i", "ll", "ve" }, .len = 3 } },
4003 .{ "im", SpecialCase{ .tokens = .{ "i", "m", "" }, .len = 2 } },
4004 .{ "ima", SpecialCase{ .tokens = .{ "i", "m", "a" }, .len = 3 } },
4005 .{ "isn't", SpecialCase{ .tokens = .{ "is", "n't", "" }, .len = 2 } },
4006 .{ "isnt", SpecialCase{ .tokens = .{ "is", "nt", "" }, .len = 2 } },
4007 .{ "isn\xe2\x80\x99t", SpecialCase{ .tokens = .{ "is", "n\xe2\x80\x99t", "" }, .len = 2 } },
4008 .{ "it'd", SpecialCase{ .tokens = .{ "it", "'d", "" }, .len = 2 } },
4009 .{ "it'd've", SpecialCase{ .tokens = .{ "it", "'d", "'ve" }, .len = 3 } },
4010 .{ "it'll", SpecialCase{ .tokens = .{ "it", "'ll", "" }, .len = 2 } },
4011 .{ "it'll've", SpecialCase{ .tokens = .{ "it", "'ll", "'ve" }, .len = 3 } },
4012 .{ "it's", SpecialCase{ .tokens = .{ "it", "'s", "" }, .len = 2 } },
4013 .{ "itd", SpecialCase{ .tokens = .{ "it", "d", "" }, .len = 2 } },
4014 .{ "itdve", SpecialCase{ .tokens = .{ "it", "d", "ve" }, .len = 3 } },
4015 .{ "itll", SpecialCase{ .tokens = .{ "it", "ll", "" }, .len = 2 } },
4016 .{ "itllve", SpecialCase{ .tokens = .{ "it", "ll", "ve" }, .len = 3 } },
4017 .{ "it\xe2\x80\x99d", SpecialCase{ .tokens = .{ "it", "\xe2\x80\x99d", "" }, .len = 2 } },
4018 .{ "it\xe2\x80\x99d\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "it", "\xe2\x80\x99d", "\xe2\x80\x99ve" }, .len = 3 } },
4019 .{ "it\xe2\x80\x99ll", SpecialCase{ .tokens = .{ "it", "\xe2\x80\x99ll", "" }, .len = 2 } },
4020 .{ "it\xe2\x80\x99ll\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "it", "\xe2\x80\x99ll", "\xe2\x80\x99ve" }, .len = 3 } },
4021 .{ "it\xe2\x80\x99s", SpecialCase{ .tokens = .{ "it", "\xe2\x80\x99s", "" }, .len = 2 } },
4022 .{ "ive", SpecialCase{ .tokens = .{ "i", "ve", "" }, .len = 2 } },
4023 .{ "i\xe2\x80\x99d", SpecialCase{ .tokens = .{ "i", "\xe2\x80\x99d", "" }, .len = 2 } },
4024 .{ "i\xe2\x80\x99d\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "i", "\xe2\x80\x99d", "\xe2\x80\x99ve" }, .len = 3 } },
4025 .{ "i\xe2\x80\x99ll", SpecialCase{ .tokens = .{ "i", "\xe2\x80\x99ll", "" }, .len = 2 } },
4026 .{ "i\xe2\x80\x99ll\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "i", "\xe2\x80\x99ll", "\xe2\x80\x99ve" }, .len = 3 } },
4027 .{ "i\xe2\x80\x99m", SpecialCase{ .tokens = .{ "i", "\xe2\x80\x99m", "" }, .len = 2 } },
4028 .{ "i\xe2\x80\x99ma", SpecialCase{ .tokens = .{ "i", "\xe2\x80\x99m", "a" }, .len = 3 } },
4029 .{ "i\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "i", "\xe2\x80\x99ve", "" }, .len = 2 } },
4030 .{ "j.", SpecialCase{ .tokens = .{ "j.", "", "" }, .len = 1 } },
4031 .{ "k.", SpecialCase{ .tokens = .{ "k.", "", "" }, .len = 1 } },
4032 .{ "l.", SpecialCase{ .tokens = .{ "l.", "", "" }, .len = 1 } },
4033 .{ "let's", SpecialCase{ .tokens = .{ "let", "'s", "" }, .len = 2 } },
4034 .{ "let\xe2\x80\x99s", SpecialCase{ .tokens = .{ "let", "\xe2\x80\x99s", "" }, .len = 2 } },
4035 .{ "ll", SpecialCase{ .tokens = .{ "ll", "", "" }, .len = 1 } },
4036 .{ "lovin", SpecialCase{ .tokens = .{ "lovin", "", "" }, .len = 1 } },
4037 .{ "lovin'", SpecialCase{ .tokens = .{ "lovin'", "", "" }, .len = 1 } },
4038 .{ "lovin\xe2\x80\x99", SpecialCase{ .tokens = .{ "lovin\xe2\x80\x99", "", "" }, .len = 1 } },
4039 .{ "m.", SpecialCase{ .tokens = .{ "m.", "", "" }, .len = 1 } },
4040 .{ "ma'am", SpecialCase{ .tokens = .{ "ma'am", "", "" }, .len = 1 } },
4041 .{ "mayn't", SpecialCase{ .tokens = .{ "may", "n't", "" }, .len = 2 } },
4042 .{ "mayn't've", SpecialCase{ .tokens = .{ "may", "n't", "'ve" }, .len = 3 } },
4043 .{ "maynt", SpecialCase{ .tokens = .{ "may", "nt", "" }, .len = 2 } },
4044 .{ "mayntve", SpecialCase{ .tokens = .{ "may", "nt", "ve" }, .len = 3 } },
4045 .{ "mayn\xe2\x80\x99t", SpecialCase{ .tokens = .{ "may", "n\xe2\x80\x99t", "" }, .len = 2 } },
4046 .{ "mayn\xe2\x80\x99t\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "may", "n\xe2\x80\x99t", "\xe2\x80\x99ve" }, .len = 3 } },
4047 .{ "ma\xe2\x80\x99am", SpecialCase{ .tokens = .{ "ma\xe2\x80\x99am", "", "" }, .len = 1 } },
4048 .{ "might've", SpecialCase{ .tokens = .{ "might", "'ve", "" }, .len = 2 } },
4049 .{ "mightn't", SpecialCase{ .tokens = .{ "might", "n't", "" }, .len = 2 } },
4050 .{ "mightn't've", SpecialCase{ .tokens = .{ "might", "n't", "'ve" }, .len = 3 } },
4051 .{ "mightnt", SpecialCase{ .tokens = .{ "might", "nt", "" }, .len = 2 } },
4052 .{ "mightntve", SpecialCase{ .tokens = .{ "might", "nt", "ve" }, .len = 3 } },
4053 .{ "mightn\xe2\x80\x99t", SpecialCase{ .tokens = .{ "might", "n\xe2\x80\x99t", "" }, .len = 2 } },
4054 .{ "mightn\xe2\x80\x99t\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "might", "n\xe2\x80\x99t", "\xe2\x80\x99ve" }, .len = 3 } },
4055 .{ "mightve", SpecialCase{ .tokens = .{ "might", "ve", "" }, .len = 2 } },
4056 .{ "might\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "might", "\xe2\x80\x99ve", "" }, .len = 2 } },
4057 .{ "must've", SpecialCase{ .tokens = .{ "must", "'ve", "" }, .len = 2 } },
4058 .{ "mustn't", SpecialCase{ .tokens = .{ "must", "n't", "" }, .len = 2 } },
4059 .{ "mustn't've", SpecialCase{ .tokens = .{ "must", "n't", "'ve" }, .len = 3 } },
4060 .{ "mustnt", SpecialCase{ .tokens = .{ "must", "nt", "" }, .len = 2 } },
4061 .{ "mustntve", SpecialCase{ .tokens = .{ "must", "nt", "ve" }, .len = 3 } },
4062 .{ "mustn\xe2\x80\x99t", SpecialCase{ .tokens = .{ "must", "n\xe2\x80\x99t", "" }, .len = 2 } },
4063 .{ "mustn\xe2\x80\x99t\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "must", "n\xe2\x80\x99t", "\xe2\x80\x99ve" }, .len = 3 } },
4064 .{ "mustve", SpecialCase{ .tokens = .{ "must", "ve", "" }, .len = 2 } },
4065 .{ "must\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "must", "\xe2\x80\x99ve", "" }, .len = 2 } },
4066 .{ "n.", SpecialCase{ .tokens = .{ "n.", "", "" }, .len = 1 } },
4067 .{ "needn't", SpecialCase{ .tokens = .{ "need", "n't", "" }, .len = 2 } },
4068 .{ "needn't've", SpecialCase{ .tokens = .{ "need", "n't", "'ve" }, .len = 3 } },
4069 .{ "neednt", SpecialCase{ .tokens = .{ "need", "nt", "" }, .len = 2 } },
4070 .{ "needntve", SpecialCase{ .tokens = .{ "need", "nt", "ve" }, .len = 3 } },
4071 .{ "needn\xe2\x80\x99t", SpecialCase{ .tokens = .{ "need", "n\xe2\x80\x99t", "" }, .len = 2 } },
4072 .{ "needn\xe2\x80\x99t\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "need", "n\xe2\x80\x99t", "\xe2\x80\x99ve" }, .len = 3 } },
4073 .{ "not've", SpecialCase{ .tokens = .{ "not", "'ve", "" }, .len = 2 } },
4074 .{ "nothin", SpecialCase{ .tokens = .{ "nothin", "", "" }, .len = 1 } },
4075 .{ "nothin'", SpecialCase{ .tokens = .{ "nothin'", "", "" }, .len = 1 } },
4076 .{ "nothin\xe2\x80\x99", SpecialCase{ .tokens = .{ "nothin\xe2\x80\x99", "", "" }, .len = 1 } },
4077 .{ "notve", SpecialCase{ .tokens = .{ "not", "ve", "" }, .len = 2 } },
4078 .{ "not\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "not", "\xe2\x80\x99ve", "" }, .len = 2 } },
4079 .{ "nuff", SpecialCase{ .tokens = .{ "nuff", "", "" }, .len = 1 } },
4080 .{ "nuthin", SpecialCase{ .tokens = .{ "nuthin", "", "" }, .len = 1 } },
4081 .{ "nuthin'", SpecialCase{ .tokens = .{ "nuthin'", "", "" }, .len = 1 } },
4082 .{ "nuthin\xe2\x80\x99", SpecialCase{ .tokens = .{ "nuthin\xe2\x80\x99", "", "" }, .len = 1 } },
4083 .{ "o'clock", SpecialCase{ .tokens = .{ "o'clock", "", "" }, .len = 1 } },
4084 .{ "o.", SpecialCase{ .tokens = .{ "o.", "", "" }, .len = 1 } },
4085 .{ "o.0", SpecialCase{ .tokens = .{ "o.0", "", "" }, .len = 1 } },
4086 .{ "o.O", SpecialCase{ .tokens = .{ "o.O", "", "" }, .len = 1 } },
4087 .{ "o.o", SpecialCase{ .tokens = .{ "o.o", "", "" }, .len = 1 } },
4088 .{ "o_0", SpecialCase{ .tokens = .{ "o_0", "", "" }, .len = 1 } },
4089 .{ "o_O", SpecialCase{ .tokens = .{ "o_O", "", "" }, .len = 1 } },
4090 .{ "o_o", SpecialCase{ .tokens = .{ "o_o", "", "" }, .len = 1 } },
4091 .{ "ol", SpecialCase{ .tokens = .{ "ol", "", "" }, .len = 1 } },
4092 .{ "ol'", SpecialCase{ .tokens = .{ "ol'", "", "" }, .len = 1 } },
4093 .{ "ol\xe2\x80\x99", SpecialCase{ .tokens = .{ "ol\xe2\x80\x99", "", "" }, .len = 1 } },
4094 .{ "oughtn't", SpecialCase{ .tokens = .{ "ought", "n't", "" }, .len = 2 } },
4095 .{ "oughtn't've", SpecialCase{ .tokens = .{ "ought", "n't", "'ve" }, .len = 3 } },
4096 .{ "oughtnt", SpecialCase{ .tokens = .{ "ought", "nt", "" }, .len = 2 } },
4097 .{ "oughtntve", SpecialCase{ .tokens = .{ "ought", "nt", "ve" }, .len = 3 } },
4098 .{ "oughtn\xe2\x80\x99t", SpecialCase{ .tokens = .{ "ought", "n\xe2\x80\x99t", "" }, .len = 2 } },
4099 .{ "oughtn\xe2\x80\x99t\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "ought", "n\xe2\x80\x99t", "\xe2\x80\x99ve" }, .len = 3 } },
4100 .{ "o\xe2\x80\x99clock", SpecialCase{ .tokens = .{ "o\xe2\x80\x99clock", "", "" }, .len = 1 } },
4101 .{ "p.", SpecialCase{ .tokens = .{ "p.", "", "" }, .len = 1 } },
4102 .{ "p.m.", SpecialCase{ .tokens = .{ "p.m.", "", "" }, .len = 1 } },
4103 .{ "q.", SpecialCase{ .tokens = .{ "q.", "", "" }, .len = 1 } },
4104 .{ "r.", SpecialCase{ .tokens = .{ "r.", "", "" }, .len = 1 } },
4105 .{ "s.", SpecialCase{ .tokens = .{ "s.", "", "" }, .len = 1 } },
4106 .{ "shan't", SpecialCase{ .tokens = .{ "sha", "n't", "" }, .len = 2 } },
4107 .{ "shan't've", SpecialCase{ .tokens = .{ "sha", "n't", "'ve" }, .len = 3 } },
4108 .{ "shant", SpecialCase{ .tokens = .{ "sha", "nt", "" }, .len = 2 } },
4109 .{ "shantve", SpecialCase{ .tokens = .{ "sha", "nt", "ve" }, .len = 3 } },
4110 .{ "shan\xe2\x80\x99t", SpecialCase{ .tokens = .{ "sha", "n\xe2\x80\x99t", "" }, .len = 2 } },
4111 .{ "shan\xe2\x80\x99t\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "sha", "n\xe2\x80\x99t", "\xe2\x80\x99ve" }, .len = 3 } },
4112 .{ "she'd", SpecialCase{ .tokens = .{ "she", "'d", "" }, .len = 2 } },
4113 .{ "she'd've", SpecialCase{ .tokens = .{ "she", "'d", "'ve" }, .len = 3 } },
4114 .{ "she'll", SpecialCase{ .tokens = .{ "she", "'ll", "" }, .len = 2 } },
4115 .{ "she'll've", SpecialCase{ .tokens = .{ "she", "'ll", "'ve" }, .len = 3 } },
4116 .{ "she's", SpecialCase{ .tokens = .{ "she", "'s", "" }, .len = 2 } },
4117 .{ "shedve", SpecialCase{ .tokens = .{ "she", "d", "ve" }, .len = 3 } },
4118 .{ "shellve", SpecialCase{ .tokens = .{ "she", "ll", "ve" }, .len = 3 } },
4119 .{ "shes", SpecialCase{ .tokens = .{ "she", "s", "" }, .len = 2 } },
4120 .{ "she\xe2\x80\x99d", SpecialCase{ .tokens = .{ "she", "\xe2\x80\x99d", "" }, .len = 2 } },
4121 .{ "she\xe2\x80\x99d\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "she", "\xe2\x80\x99d", "\xe2\x80\x99ve" }, .len = 3 } },
4122 .{ "she\xe2\x80\x99ll", SpecialCase{ .tokens = .{ "she", "\xe2\x80\x99ll", "" }, .len = 2 } },
4123 .{ "she\xe2\x80\x99ll\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "she", "\xe2\x80\x99ll", "\xe2\x80\x99ve" }, .len = 3 } },
4124 .{ "she\xe2\x80\x99s", SpecialCase{ .tokens = .{ "she", "\xe2\x80\x99s", "" }, .len = 2 } },
4125 .{ "should've", SpecialCase{ .tokens = .{ "should", "'ve", "" }, .len = 2 } },
4126 .{ "shouldn't", SpecialCase{ .tokens = .{ "should", "n't", "" }, .len = 2 } },
4127 .{ "shouldn't've", SpecialCase{ .tokens = .{ "should", "n't", "'ve" }, .len = 3 } },
4128 .{ "shouldnt", SpecialCase{ .tokens = .{ "should", "nt", "" }, .len = 2 } },
4129 .{ "shouldntve", SpecialCase{ .tokens = .{ "should", "nt", "ve" }, .len = 3 } },
4130 .{ "shouldn\xe2\x80\x99t", SpecialCase{ .tokens = .{ "should", "n\xe2\x80\x99t", "" }, .len = 2 } },
4131 .{ "shouldn\xe2\x80\x99t\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "should", "n\xe2\x80\x99t", "\xe2\x80\x99ve" }, .len = 3 } },
4132 .{ "shouldve", SpecialCase{ .tokens = .{ "should", "ve", "" }, .len = 2 } },
4133 .{ "should\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "should", "\xe2\x80\x99ve", "" }, .len = 2 } },
4134 .{ "somethin", SpecialCase{ .tokens = .{ "somethin", "", "" }, .len = 1 } },
4135 .{ "somethin'", SpecialCase{ .tokens = .{ "somethin'", "", "" }, .len = 1 } },
4136 .{ "somethin\xe2\x80\x99", SpecialCase{ .tokens = .{ "somethin\xe2\x80\x99", "", "" }, .len = 1 } },
4137 .{ "t.", SpecialCase{ .tokens = .{ "t.", "", "" }, .len = 1 } },
4138 .{ "that'd", SpecialCase{ .tokens = .{ "that", "'d", "" }, .len = 2 } },
4139 .{ "that'd've", SpecialCase{ .tokens = .{ "that", "'d", "'ve" }, .len = 3 } },
4140 .{ "that'll", SpecialCase{ .tokens = .{ "that", "'ll", "" }, .len = 2 } },
4141 .{ "that'll've", SpecialCase{ .tokens = .{ "that", "'ll", "'ve" }, .len = 3 } },
4142 .{ "that's", SpecialCase{ .tokens = .{ "that", "'s", "" }, .len = 2 } },
4143 .{ "thatd", SpecialCase{ .tokens = .{ "that", "d", "" }, .len = 2 } },
4144 .{ "thatdve", SpecialCase{ .tokens = .{ "that", "d", "ve" }, .len = 3 } },
4145 .{ "thatll", SpecialCase{ .tokens = .{ "that", "ll", "" }, .len = 2 } },
4146 .{ "thatllve", SpecialCase{ .tokens = .{ "that", "ll", "ve" }, .len = 3 } },
4147 .{ "thats", SpecialCase{ .tokens = .{ "that", "s", "" }, .len = 2 } },
4148 .{ "that\xe2\x80\x99d", SpecialCase{ .tokens = .{ "that", "\xe2\x80\x99d", "" }, .len = 2 } },
4149 .{ "that\xe2\x80\x99d\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "that", "\xe2\x80\x99d", "\xe2\x80\x99ve" }, .len = 3 } },
4150 .{ "that\xe2\x80\x99ll", SpecialCase{ .tokens = .{ "that", "\xe2\x80\x99ll", "" }, .len = 2 } },
4151 .{ "that\xe2\x80\x99ll\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "that", "\xe2\x80\x99ll", "\xe2\x80\x99ve" }, .len = 3 } },
4152 .{ "that\xe2\x80\x99s", SpecialCase{ .tokens = .{ "that", "\xe2\x80\x99s", "" }, .len = 2 } },
4153 .{ "there'd", SpecialCase{ .tokens = .{ "there", "'d", "" }, .len = 2 } },
4154 .{ "there'd've", SpecialCase{ .tokens = .{ "there", "'d", "'ve" }, .len = 3 } },
4155 .{ "there'll", SpecialCase{ .tokens = .{ "there", "'ll", "" }, .len = 2 } },
4156 .{ "there'll've", SpecialCase{ .tokens = .{ "there", "'ll", "'ve" }, .len = 3 } },
4157 .{ "there're", SpecialCase{ .tokens = .{ "there", "'re", "" }, .len = 2 } },
4158 .{ "there's", SpecialCase{ .tokens = .{ "there", "'s", "" }, .len = 2 } },
4159 .{ "there've", SpecialCase{ .tokens = .{ "there", "'ve", "" }, .len = 2 } },
4160 .{ "thered", SpecialCase{ .tokens = .{ "there", "d", "" }, .len = 2 } },
4161 .{ "theredve", SpecialCase{ .tokens = .{ "there", "d", "ve" }, .len = 3 } },
4162 .{ "therell", SpecialCase{ .tokens = .{ "there", "ll", "" }, .len = 2 } },
4163 .{ "therellve", SpecialCase{ .tokens = .{ "there", "ll", "ve" }, .len = 3 } },
4164 .{ "therere", SpecialCase{ .tokens = .{ "there", "re", "" }, .len = 2 } },
4165 .{ "theres", SpecialCase{ .tokens = .{ "there", "s", "" }, .len = 2 } },
4166 .{ "thereve", SpecialCase{ .tokens = .{ "there", "ve", "" }, .len = 2 } },
4167 .{ "there\xe2\x80\x99d", SpecialCase{ .tokens = .{ "there", "\xe2\x80\x99d", "" }, .len = 2 } },
4168 .{ "there\xe2\x80\x99d\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "there", "\xe2\x80\x99d", "\xe2\x80\x99ve" }, .len = 3 } },
4169 .{ "there\xe2\x80\x99ll", SpecialCase{ .tokens = .{ "there", "\xe2\x80\x99ll", "" }, .len = 2 } },
4170 .{ "there\xe2\x80\x99ll\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "there", "\xe2\x80\x99ll", "\xe2\x80\x99ve" }, .len = 3 } },
4171 .{ "there\xe2\x80\x99re", SpecialCase{ .tokens = .{ "there", "\xe2\x80\x99re", "" }, .len = 2 } },
4172 .{ "there\xe2\x80\x99s", SpecialCase{ .tokens = .{ "there", "\xe2\x80\x99s", "" }, .len = 2 } },
4173 .{ "there\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "there", "\xe2\x80\x99ve", "" }, .len = 2 } },
4174 .{ "these'd", SpecialCase{ .tokens = .{ "these", "'d", "" }, .len = 2 } },
4175 .{ "these'd've", SpecialCase{ .tokens = .{ "these", "'d", "'ve" }, .len = 3 } },
4176 .{ "these'll", SpecialCase{ .tokens = .{ "these", "'ll", "" }, .len = 2 } },
4177 .{ "these'll've", SpecialCase{ .tokens = .{ "these", "'ll", "'ve" }, .len = 3 } },
4178 .{ "these're", SpecialCase{ .tokens = .{ "these", "'re", "" }, .len = 2 } },
4179 .{ "these've", SpecialCase{ .tokens = .{ "these", "'ve", "" }, .len = 2 } },
4180 .{ "thesed", SpecialCase{ .tokens = .{ "these", "d", "" }, .len = 2 } },
4181 .{ "thesedve", SpecialCase{ .tokens = .{ "these", "d", "ve" }, .len = 3 } },
4182 .{ "thesell", SpecialCase{ .tokens = .{ "these", "ll", "" }, .len = 2 } },
4183 .{ "thesellve", SpecialCase{ .tokens = .{ "these", "ll", "ve" }, .len = 3 } },
4184 .{ "thesere", SpecialCase{ .tokens = .{ "these", "re", "" }, .len = 2 } },
4185 .{ "theseve", SpecialCase{ .tokens = .{ "these", "ve", "" }, .len = 2 } },
4186 .{ "these\xe2\x80\x99d", SpecialCase{ .tokens = .{ "these", "\xe2\x80\x99d", "" }, .len = 2 } },
4187 .{ "these\xe2\x80\x99d\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "these", "\xe2\x80\x99d", "\xe2\x80\x99ve" }, .len = 3 } },
4188 .{ "these\xe2\x80\x99ll", SpecialCase{ .tokens = .{ "these", "\xe2\x80\x99ll", "" }, .len = 2 } },
4189 .{ "these\xe2\x80\x99ll\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "these", "\xe2\x80\x99ll", "\xe2\x80\x99ve" }, .len = 3 } },
4190 .{ "these\xe2\x80\x99re", SpecialCase{ .tokens = .{ "these", "\xe2\x80\x99re", "" }, .len = 2 } },
4191 .{ "these\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "these", "\xe2\x80\x99ve", "" }, .len = 2 } },
4192 .{ "they'd", SpecialCase{ .tokens = .{ "they", "'d", "" }, .len = 2 } },
4193 .{ "they'd've", SpecialCase{ .tokens = .{ "they", "'d", "'ve" }, .len = 3 } },
4194 .{ "they'll", SpecialCase{ .tokens = .{ "they", "'ll", "" }, .len = 2 } },
4195 .{ "they'll've", SpecialCase{ .tokens = .{ "they", "'ll", "'ve" }, .len = 3 } },
4196 .{ "they're", SpecialCase{ .tokens = .{ "they", "'re", "" }, .len = 2 } },
4197 .{ "they've", SpecialCase{ .tokens = .{ "they", "'ve", "" }, .len = 2 } },
4198 .{ "theyd", SpecialCase{ .tokens = .{ "they", "d", "" }, .len = 2 } },
4199 .{ "theydve", SpecialCase{ .tokens = .{ "they", "d", "ve" }, .len = 3 } },
4200 .{ "theyll", SpecialCase{ .tokens = .{ "they", "ll", "" }, .len = 2 } },
4201 .{ "theyllve", SpecialCase{ .tokens = .{ "they", "ll", "ve" }, .len = 3 } },
4202 .{ "theyre", SpecialCase{ .tokens = .{ "they", "re", "" }, .len = 2 } },
4203 .{ "theyve", SpecialCase{ .tokens = .{ "they", "ve", "" }, .len = 2 } },
4204 .{ "they\xe2\x80\x99d", SpecialCase{ .tokens = .{ "they", "\xe2\x80\x99d", "" }, .len = 2 } },
4205 .{ "they\xe2\x80\x99d\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "they", "\xe2\x80\x99d", "\xe2\x80\x99ve" }, .len = 3 } },
4206 .{ "they\xe2\x80\x99ll", SpecialCase{ .tokens = .{ "they", "\xe2\x80\x99ll", "" }, .len = 2 } },
4207 .{ "they\xe2\x80\x99ll\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "they", "\xe2\x80\x99ll", "\xe2\x80\x99ve" }, .len = 3 } },
4208 .{ "they\xe2\x80\x99re", SpecialCase{ .tokens = .{ "they", "\xe2\x80\x99re", "" }, .len = 2 } },
4209 .{ "they\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "they", "\xe2\x80\x99ve", "" }, .len = 2 } },
4210 .{ "this'd", SpecialCase{ .tokens = .{ "this", "'d", "" }, .len = 2 } },
4211 .{ "this'd've", SpecialCase{ .tokens = .{ "this", "'d", "'ve" }, .len = 3 } },
4212 .{ "this'll", SpecialCase{ .tokens = .{ "this", "'ll", "" }, .len = 2 } },
4213 .{ "this'll've", SpecialCase{ .tokens = .{ "this", "'ll", "'ve" }, .len = 3 } },
4214 .{ "this's", SpecialCase{ .tokens = .{ "this", "'s", "" }, .len = 2 } },
4215 .{ "thisd", SpecialCase{ .tokens = .{ "this", "d", "" }, .len = 2 } },
4216 .{ "thisdve", SpecialCase{ .tokens = .{ "this", "d", "ve" }, .len = 3 } },
4217 .{ "thisll", SpecialCase{ .tokens = .{ "this", "ll", "" }, .len = 2 } },
4218 .{ "thisllve", SpecialCase{ .tokens = .{ "this", "ll", "ve" }, .len = 3 } },
4219 .{ "thiss", SpecialCase{ .tokens = .{ "this", "s", "" }, .len = 2 } },
4220 .{ "this\xe2\x80\x99d", SpecialCase{ .tokens = .{ "this", "\xe2\x80\x99d", "" }, .len = 2 } },
4221 .{ "this\xe2\x80\x99d\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "this", "\xe2\x80\x99d", "\xe2\x80\x99ve" }, .len = 3 } },
4222 .{ "this\xe2\x80\x99ll", SpecialCase{ .tokens = .{ "this", "\xe2\x80\x99ll", "" }, .len = 2 } },
4223 .{ "this\xe2\x80\x99ll\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "this", "\xe2\x80\x99ll", "\xe2\x80\x99ve" }, .len = 3 } },
4224 .{ "this\xe2\x80\x99s", SpecialCase{ .tokens = .{ "this", "\xe2\x80\x99s", "" }, .len = 2 } },
4225 .{ "those'd", SpecialCase{ .tokens = .{ "those", "'d", "" }, .len = 2 } },
4226 .{ "those'd've", SpecialCase{ .tokens = .{ "those", "'d", "'ve" }, .len = 3 } },
4227 .{ "those'll", SpecialCase{ .tokens = .{ "those", "'ll", "" }, .len = 2 } },
4228 .{ "those'll've", SpecialCase{ .tokens = .{ "those", "'ll", "'ve" }, .len = 3 } },
4229 .{ "those're", SpecialCase{ .tokens = .{ "those", "'re", "" }, .len = 2 } },
4230 .{ "those've", SpecialCase{ .tokens = .{ "those", "'ve", "" }, .len = 2 } },
4231 .{ "thosed", SpecialCase{ .tokens = .{ "those", "d", "" }, .len = 2 } },
4232 .{ "thosedve", SpecialCase{ .tokens = .{ "those", "d", "ve" }, .len = 3 } },
4233 .{ "thosell", SpecialCase{ .tokens = .{ "those", "ll", "" }, .len = 2 } },
4234 .{ "thosellve", SpecialCase{ .tokens = .{ "those", "ll", "ve" }, .len = 3 } },
4235 .{ "thosere", SpecialCase{ .tokens = .{ "those", "re", "" }, .len = 2 } },
4236 .{ "thoseve", SpecialCase{ .tokens = .{ "those", "ve", "" }, .len = 2 } },
4237 .{ "those\xe2\x80\x99d", SpecialCase{ .tokens = .{ "those", "\xe2\x80\x99d", "" }, .len = 2 } },
4238 .{ "those\xe2\x80\x99d\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "those", "\xe2\x80\x99d", "\xe2\x80\x99ve" }, .len = 3 } },
4239 .{ "those\xe2\x80\x99ll", SpecialCase{ .tokens = .{ "those", "\xe2\x80\x99ll", "" }, .len = 2 } },
4240 .{ "those\xe2\x80\x99ll\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "those", "\xe2\x80\x99ll", "\xe2\x80\x99ve" }, .len = 3 } },
4241 .{ "those\xe2\x80\x99re", SpecialCase{ .tokens = .{ "those", "\xe2\x80\x99re", "" }, .len = 2 } },
4242 .{ "those\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "those", "\xe2\x80\x99ve", "" }, .len = 2 } },
4243 .{ "u.", SpecialCase{ .tokens = .{ "u.", "", "" }, .len = 1 } },
4244 .{ "v.", SpecialCase{ .tokens = .{ "v.", "", "" }, .len = 1 } },
4245 .{ "v.s.", SpecialCase{ .tokens = .{ "v.s.", "", "" }, .len = 1 } },
4246 .{ "v.v", SpecialCase{ .tokens = .{ "v.v", "", "" }, .len = 1 } },
4247 .{ "v_v", SpecialCase{ .tokens = .{ "v_v", "", "" }, .len = 1 } },
4248 .{ "vs.", SpecialCase{ .tokens = .{ "vs.", "", "" }, .len = 1 } },
4249 .{ "w.", SpecialCase{ .tokens = .{ "w.", "", "" }, .len = 1 } },
4250 .{ "w/o", SpecialCase{ .tokens = .{ "w/o", "", "" }, .len = 1 } },
4251 .{ "wasn't", SpecialCase{ .tokens = .{ "was", "n't", "" }, .len = 2 } },
4252 .{ "wasnt", SpecialCase{ .tokens = .{ "was", "nt", "" }, .len = 2 } },
4253 .{ "wasn\xe2\x80\x99t", SpecialCase{ .tokens = .{ "was", "n\xe2\x80\x99t", "" }, .len = 2 } },
4254 .{ "we'd", SpecialCase{ .tokens = .{ "we", "'d", "" }, .len = 2 } },
4255 .{ "we'd've", SpecialCase{ .tokens = .{ "we", "'d", "'ve" }, .len = 3 } },
4256 .{ "we'll", SpecialCase{ .tokens = .{ "we", "'ll", "" }, .len = 2 } },
4257 .{ "we'll've", SpecialCase{ .tokens = .{ "we", "'ll", "'ve" }, .len = 3 } },
4258 .{ "we're", SpecialCase{ .tokens = .{ "we", "'re", "" }, .len = 2 } },
4259 .{ "we've", SpecialCase{ .tokens = .{ "we", "'ve", "" }, .len = 2 } },
4260 .{ "wed", SpecialCase{ .tokens = .{ "we", "d", "" }, .len = 2 } },
4261 .{ "wedve", SpecialCase{ .tokens = .{ "we", "d", "ve" }, .len = 3 } },
4262 .{ "wellve", SpecialCase{ .tokens = .{ "we", "ll", "ve" }, .len = 3 } },
4263 .{ "weren't", SpecialCase{ .tokens = .{ "were", "n't", "" }, .len = 2 } },
4264 .{ "werent", SpecialCase{ .tokens = .{ "were", "nt", "" }, .len = 2 } },
4265 .{ "weren\xe2\x80\x99t", SpecialCase{ .tokens = .{ "were", "n\xe2\x80\x99t", "" }, .len = 2 } },
4266 .{ "weve", SpecialCase{ .tokens = .{ "we", "ve", "" }, .len = 2 } },
4267 .{ "we\xe2\x80\x99d", SpecialCase{ .tokens = .{ "we", "\xe2\x80\x99d", "" }, .len = 2 } },
4268 .{ "we\xe2\x80\x99d\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "we", "\xe2\x80\x99d", "\xe2\x80\x99ve" }, .len = 3 } },
4269 .{ "we\xe2\x80\x99ll", SpecialCase{ .tokens = .{ "we", "\xe2\x80\x99ll", "" }, .len = 2 } },
4270 .{ "we\xe2\x80\x99ll\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "we", "\xe2\x80\x99ll", "\xe2\x80\x99ve" }, .len = 3 } },
4271 .{ "we\xe2\x80\x99re", SpecialCase{ .tokens = .{ "we", "\xe2\x80\x99re", "" }, .len = 2 } },
4272 .{ "we\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "we", "\xe2\x80\x99ve", "" }, .len = 2 } },
4273 .{ "what'd", SpecialCase{ .tokens = .{ "what", "'d", "" }, .len = 2 } },
4274 .{ "what'd've", SpecialCase{ .tokens = .{ "what", "'d", "'ve" }, .len = 3 } },
4275 .{ "what'll", SpecialCase{ .tokens = .{ "what", "'ll", "" }, .len = 2 } },
4276 .{ "what'll've", SpecialCase{ .tokens = .{ "what", "'ll", "'ve" }, .len = 3 } },
4277 .{ "what're", SpecialCase{ .tokens = .{ "what", "'re", "" }, .len = 2 } },
4278 .{ "what's", SpecialCase{ .tokens = .{ "what", "'s", "" }, .len = 2 } },
4279 .{ "what've", SpecialCase{ .tokens = .{ "what", "'ve", "" }, .len = 2 } },
4280 .{ "whatd", SpecialCase{ .tokens = .{ "what", "d", "" }, .len = 2 } },
4281 .{ "whatdve", SpecialCase{ .tokens = .{ "what", "d", "ve" }, .len = 3 } },
4282 .{ "whatll", SpecialCase{ .tokens = .{ "what", "ll", "" }, .len = 2 } },
4283 .{ "whatllve", SpecialCase{ .tokens = .{ "what", "ll", "ve" }, .len = 3 } },
4284 .{ "whatre", SpecialCase{ .tokens = .{ "what", "re", "" }, .len = 2 } },
4285 .{ "whats", SpecialCase{ .tokens = .{ "what", "s", "" }, .len = 2 } },
4286 .{ "whatve", SpecialCase{ .tokens = .{ "what", "ve", "" }, .len = 2 } },
4287 .{ "what\xe2\x80\x99d", SpecialCase{ .tokens = .{ "what", "\xe2\x80\x99d", "" }, .len = 2 } },
4288 .{ "what\xe2\x80\x99d\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "what", "\xe2\x80\x99d", "\xe2\x80\x99ve" }, .len = 3 } },
4289 .{ "what\xe2\x80\x99ll", SpecialCase{ .tokens = .{ "what", "\xe2\x80\x99ll", "" }, .len = 2 } },
4290 .{ "what\xe2\x80\x99ll\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "what", "\xe2\x80\x99ll", "\xe2\x80\x99ve" }, .len = 3 } },
4291 .{ "what\xe2\x80\x99re", SpecialCase{ .tokens = .{ "what", "\xe2\x80\x99re", "" }, .len = 2 } },
4292 .{ "what\xe2\x80\x99s", SpecialCase{ .tokens = .{ "what", "\xe2\x80\x99s", "" }, .len = 2 } },
4293 .{ "what\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "what", "\xe2\x80\x99ve", "" }, .len = 2 } },
4294 .{ "when'd", SpecialCase{ .tokens = .{ "when", "'d", "" }, .len = 2 } },
4295 .{ "when'd've", SpecialCase{ .tokens = .{ "when", "'d", "'ve" }, .len = 3 } },
4296 .{ "when'll", SpecialCase{ .tokens = .{ "when", "'ll", "" }, .len = 2 } },
4297 .{ "when'll've", SpecialCase{ .tokens = .{ "when", "'ll", "'ve" }, .len = 3 } },
4298 .{ "when're", SpecialCase{ .tokens = .{ "when", "'re", "" }, .len = 2 } },
4299 .{ "when's", SpecialCase{ .tokens = .{ "when", "'s", "" }, .len = 2 } },
4300 .{ "when've", SpecialCase{ .tokens = .{ "when", "'ve", "" }, .len = 2 } },
4301 .{ "whend", SpecialCase{ .tokens = .{ "when", "d", "" }, .len = 2 } },
4302 .{ "whendve", SpecialCase{ .tokens = .{ "when", "d", "ve" }, .len = 3 } },
4303 .{ "whenll", SpecialCase{ .tokens = .{ "when", "ll", "" }, .len = 2 } },
4304 .{ "whenllve", SpecialCase{ .tokens = .{ "when", "ll", "ve" }, .len = 3 } },
4305 .{ "whenre", SpecialCase{ .tokens = .{ "when", "re", "" }, .len = 2 } },
4306 .{ "whens", SpecialCase{ .tokens = .{ "when", "s", "" }, .len = 2 } },
4307 .{ "whenve", SpecialCase{ .tokens = .{ "when", "ve", "" }, .len = 2 } },
4308 .{ "when\xe2\x80\x99d", SpecialCase{ .tokens = .{ "when", "\xe2\x80\x99d", "" }, .len = 2 } },
4309 .{ "when\xe2\x80\x99d\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "when", "\xe2\x80\x99d", "\xe2\x80\x99ve" }, .len = 3 } },
4310 .{ "when\xe2\x80\x99ll", SpecialCase{ .tokens = .{ "when", "\xe2\x80\x99ll", "" }, .len = 2 } },
4311 .{ "when\xe2\x80\x99ll\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "when", "\xe2\x80\x99ll", "\xe2\x80\x99ve" }, .len = 3 } },
4312 .{ "when\xe2\x80\x99re", SpecialCase{ .tokens = .{ "when", "\xe2\x80\x99re", "" }, .len = 2 } },
4313 .{ "when\xe2\x80\x99s", SpecialCase{ .tokens = .{ "when", "\xe2\x80\x99s", "" }, .len = 2 } },
4314 .{ "when\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "when", "\xe2\x80\x99ve", "" }, .len = 2 } },
4315 .{ "where'd", SpecialCase{ .tokens = .{ "where", "'d", "" }, .len = 2 } },
4316 .{ "where'd've", SpecialCase{ .tokens = .{ "where", "'d", "'ve" }, .len = 3 } },
4317 .{ "where'll", SpecialCase{ .tokens = .{ "where", "'ll", "" }, .len = 2 } },
4318 .{ "where'll've", SpecialCase{ .tokens = .{ "where", "'ll", "'ve" }, .len = 3 } },
4319 .{ "where're", SpecialCase{ .tokens = .{ "where", "'re", "" }, .len = 2 } },
4320 .{ "where's", SpecialCase{ .tokens = .{ "where", "'s", "" }, .len = 2 } },
4321 .{ "where've", SpecialCase{ .tokens = .{ "where", "'ve", "" }, .len = 2 } },
4322 .{ "whered", SpecialCase{ .tokens = .{ "where", "d", "" }, .len = 2 } },
4323 .{ "wheredve", SpecialCase{ .tokens = .{ "where", "d", "ve" }, .len = 3 } },
4324 .{ "wherell", SpecialCase{ .tokens = .{ "where", "ll", "" }, .len = 2 } },
4325 .{ "wherellve", SpecialCase{ .tokens = .{ "where", "ll", "ve" }, .len = 3 } },
4326 .{ "wherere", SpecialCase{ .tokens = .{ "where", "re", "" }, .len = 2 } },
4327 .{ "wheres", SpecialCase{ .tokens = .{ "where", "s", "" }, .len = 2 } },
4328 .{ "whereve", SpecialCase{ .tokens = .{ "where", "ve", "" }, .len = 2 } },
4329 .{ "where\xe2\x80\x99d", SpecialCase{ .tokens = .{ "where", "\xe2\x80\x99d", "" }, .len = 2 } },
4330 .{ "where\xe2\x80\x99d\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "where", "\xe2\x80\x99d", "\xe2\x80\x99ve" }, .len = 3 } },
4331 .{ "where\xe2\x80\x99ll", SpecialCase{ .tokens = .{ "where", "\xe2\x80\x99ll", "" }, .len = 2 } },
4332 .{ "where\xe2\x80\x99ll\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "where", "\xe2\x80\x99ll", "\xe2\x80\x99ve" }, .len = 3 } },
4333 .{ "where\xe2\x80\x99re", SpecialCase{ .tokens = .{ "where", "\xe2\x80\x99re", "" }, .len = 2 } },
4334 .{ "where\xe2\x80\x99s", SpecialCase{ .tokens = .{ "where", "\xe2\x80\x99s", "" }, .len = 2 } },
4335 .{ "where\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "where", "\xe2\x80\x99ve", "" }, .len = 2 } },
4336 .{ "who'd", SpecialCase{ .tokens = .{ "who", "'d", "" }, .len = 2 } },
4337 .{ "who'd've", SpecialCase{ .tokens = .{ "who", "'d", "'ve" }, .len = 3 } },
4338 .{ "who'll", SpecialCase{ .tokens = .{ "who", "'ll", "" }, .len = 2 } },
4339 .{ "who'll've", SpecialCase{ .tokens = .{ "who", "'ll", "'ve" }, .len = 3 } },
4340 .{ "who're", SpecialCase{ .tokens = .{ "who", "'re", "" }, .len = 2 } },
4341 .{ "who's", SpecialCase{ .tokens = .{ "who", "'s", "" }, .len = 2 } },
4342 .{ "who've", SpecialCase{ .tokens = .{ "who", "'ve", "" }, .len = 2 } },
4343 .{ "whod", SpecialCase{ .tokens = .{ "who", "d", "" }, .len = 2 } },
4344 .{ "whodve", SpecialCase{ .tokens = .{ "who", "d", "ve" }, .len = 3 } },
4345 .{ "wholl", SpecialCase{ .tokens = .{ "who", "ll", "" }, .len = 2 } },
4346 .{ "whollve", SpecialCase{ .tokens = .{ "who", "ll", "ve" }, .len = 3 } },
4347 .{ "whos", SpecialCase{ .tokens = .{ "who", "s", "" }, .len = 2 } },
4348 .{ "whove", SpecialCase{ .tokens = .{ "who", "ve", "" }, .len = 2 } },
4349 .{ "who\xe2\x80\x99d", SpecialCase{ .tokens = .{ "who", "\xe2\x80\x99d", "" }, .len = 2 } },
4350 .{ "who\xe2\x80\x99d\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "who", "\xe2\x80\x99d", "\xe2\x80\x99ve" }, .len = 3 } },
4351 .{ "who\xe2\x80\x99ll", SpecialCase{ .tokens = .{ "who", "\xe2\x80\x99ll", "" }, .len = 2 } },
4352 .{ "who\xe2\x80\x99ll\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "who", "\xe2\x80\x99ll", "\xe2\x80\x99ve" }, .len = 3 } },
4353 .{ "who\xe2\x80\x99re", SpecialCase{ .tokens = .{ "who", "\xe2\x80\x99re", "" }, .len = 2 } },
4354 .{ "who\xe2\x80\x99s", SpecialCase{ .tokens = .{ "who", "\xe2\x80\x99s", "" }, .len = 2 } },
4355 .{ "who\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "who", "\xe2\x80\x99ve", "" }, .len = 2 } },
4356 .{ "why'd", SpecialCase{ .tokens = .{ "why", "'d", "" }, .len = 2 } },
4357 .{ "why'd've", SpecialCase{ .tokens = .{ "why", "'d", "'ve" }, .len = 3 } },
4358 .{ "why'll", SpecialCase{ .tokens = .{ "why", "'ll", "" }, .len = 2 } },
4359 .{ "why'll've", SpecialCase{ .tokens = .{ "why", "'ll", "'ve" }, .len = 3 } },
4360 .{ "why're", SpecialCase{ .tokens = .{ "why", "'re", "" }, .len = 2 } },
4361 .{ "why's", SpecialCase{ .tokens = .{ "why", "'s", "" }, .len = 2 } },
4362 .{ "why've", SpecialCase{ .tokens = .{ "why", "'ve", "" }, .len = 2 } },
4363 .{ "whyd", SpecialCase{ .tokens = .{ "why", "d", "" }, .len = 2 } },
4364 .{ "whydve", SpecialCase{ .tokens = .{ "why", "d", "ve" }, .len = 3 } },
4365 .{ "whyll", SpecialCase{ .tokens = .{ "why", "ll", "" }, .len = 2 } },
4366 .{ "whyllve", SpecialCase{ .tokens = .{ "why", "ll", "ve" }, .len = 3 } },
4367 .{ "whyre", SpecialCase{ .tokens = .{ "why", "re", "" }, .len = 2 } },
4368 .{ "whys", SpecialCase{ .tokens = .{ "why", "s", "" }, .len = 2 } },
4369 .{ "whyve", SpecialCase{ .tokens = .{ "why", "ve", "" }, .len = 2 } },
4370 .{ "why\xe2\x80\x99d", SpecialCase{ .tokens = .{ "why", "\xe2\x80\x99d", "" }, .len = 2 } },
4371 .{ "why\xe2\x80\x99d\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "why", "\xe2\x80\x99d", "\xe2\x80\x99ve" }, .len = 3 } },
4372 .{ "why\xe2\x80\x99ll", SpecialCase{ .tokens = .{ "why", "\xe2\x80\x99ll", "" }, .len = 2 } },
4373 .{ "why\xe2\x80\x99ll\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "why", "\xe2\x80\x99ll", "\xe2\x80\x99ve" }, .len = 3 } },
4374 .{ "why\xe2\x80\x99re", SpecialCase{ .tokens = .{ "why", "\xe2\x80\x99re", "" }, .len = 2 } },
4375 .{ "why\xe2\x80\x99s", SpecialCase{ .tokens = .{ "why", "\xe2\x80\x99s", "" }, .len = 2 } },
4376 .{ "why\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "why", "\xe2\x80\x99ve", "" }, .len = 2 } },
4377 .{ "won't", SpecialCase{ .tokens = .{ "wo", "n't", "" }, .len = 2 } },
4378 .{ "won't've", SpecialCase{ .tokens = .{ "wo", "n't", "'ve" }, .len = 3 } },
4379 .{ "wont", SpecialCase{ .tokens = .{ "wo", "nt", "" }, .len = 2 } },
4380 .{ "wontve", SpecialCase{ .tokens = .{ "wo", "nt", "ve" }, .len = 3 } },
4381 .{ "won\xe2\x80\x99t", SpecialCase{ .tokens = .{ "wo", "n\xe2\x80\x99t", "" }, .len = 2 } },
4382 .{ "won\xe2\x80\x99t\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "wo", "n\xe2\x80\x99t", "\xe2\x80\x99ve" }, .len = 3 } },
4383 .{ "would've", SpecialCase{ .tokens = .{ "would", "'ve", "" }, .len = 2 } },
4384 .{ "wouldn't", SpecialCase{ .tokens = .{ "would", "n't", "" }, .len = 2 } },
4385 .{ "wouldn't've", SpecialCase{ .tokens = .{ "would", "n't", "'ve" }, .len = 3 } },
4386 .{ "wouldnt", SpecialCase{ .tokens = .{ "would", "nt", "" }, .len = 2 } },
4387 .{ "wouldntve", SpecialCase{ .tokens = .{ "would", "nt", "ve" }, .len = 3 } },
4388 .{ "wouldn\xe2\x80\x99t", SpecialCase{ .tokens = .{ "would", "n\xe2\x80\x99t", "" }, .len = 2 } },
4389 .{ "wouldn\xe2\x80\x99t\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "would", "n\xe2\x80\x99t", "\xe2\x80\x99ve" }, .len = 3 } },
4390 .{ "wouldve", SpecialCase{ .tokens = .{ "would", "ve", "" }, .len = 2 } },
4391 .{ "would\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "would", "\xe2\x80\x99ve", "" }, .len = 2 } },
4392 .{ "x.", SpecialCase{ .tokens = .{ "x.", "", "" }, .len = 1 } },
4393 .{ "xD", SpecialCase{ .tokens = .{ "xD", "", "" }, .len = 1 } },
4394 .{ "xDD", SpecialCase{ .tokens = .{ "xDD", "", "" }, .len = 1 } },
4395 .{ "y'all", SpecialCase{ .tokens = .{ "y'", "all", "" }, .len = 2 } },
4396 .{ "y.", SpecialCase{ .tokens = .{ "y.", "", "" }, .len = 1 } },
4397 .{ "yall", SpecialCase{ .tokens = .{ "y", "all", "" }, .len = 2 } },
4398 .{ "you'd", SpecialCase{ .tokens = .{ "you", "'d", "" }, .len = 2 } },
4399 .{ "you'd've", SpecialCase{ .tokens = .{ "you", "'d", "'ve" }, .len = 3 } },
4400 .{ "you'll", SpecialCase{ .tokens = .{ "you", "'ll", "" }, .len = 2 } },
4401 .{ "you'll've", SpecialCase{ .tokens = .{ "you", "'ll", "'ve" }, .len = 3 } },
4402 .{ "you're", SpecialCase{ .tokens = .{ "you", "'re", "" }, .len = 2 } },
4403 .{ "you've", SpecialCase{ .tokens = .{ "you", "'ve", "" }, .len = 2 } },
4404 .{ "youd", SpecialCase{ .tokens = .{ "you", "d", "" }, .len = 2 } },
4405 .{ "youdve", SpecialCase{ .tokens = .{ "you", "d", "ve" }, .len = 3 } },
4406 .{ "youll", SpecialCase{ .tokens = .{ "you", "ll", "" }, .len = 2 } },
4407 .{ "youllve", SpecialCase{ .tokens = .{ "you", "ll", "ve" }, .len = 3 } },
4408 .{ "youre", SpecialCase{ .tokens = .{ "you", "re", "" }, .len = 2 } },
4409 .{ "youve", SpecialCase{ .tokens = .{ "you", "ve", "" }, .len = 2 } },
4410 .{ "you\xe2\x80\x99d", SpecialCase{ .tokens = .{ "you", "\xe2\x80\x99d", "" }, .len = 2 } },
4411 .{ "you\xe2\x80\x99d\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "you", "\xe2\x80\x99d", "\xe2\x80\x99ve" }, .len = 3 } },
4412 .{ "you\xe2\x80\x99ll", SpecialCase{ .tokens = .{ "you", "\xe2\x80\x99ll", "" }, .len = 2 } },
4413 .{ "you\xe2\x80\x99ll\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "you", "\xe2\x80\x99ll", "\xe2\x80\x99ve" }, .len = 3 } },
4414 .{ "you\xe2\x80\x99re", SpecialCase{ .tokens = .{ "you", "\xe2\x80\x99re", "" }, .len = 2 } },
4415 .{ "you\xe2\x80\x99ve", SpecialCase{ .tokens = .{ "you", "\xe2\x80\x99ve", "" }, .len = 2 } },
4416 .{ "y\xe2\x80\x99all", SpecialCase{ .tokens = .{ "y\xe2\x80\x99", "all", "" }, .len = 2 } },
4417 .{ "z.", SpecialCase{ .tokens = .{ "z.", "", "" }, .len = 1 } },
4418 .{ "\xc2\xa0", SpecialCase{ .tokens = .{ "\xc2\xa0", "", "" }, .len = 1 } },
4419 .{ "\xc2\xaf\\(\xe3\x83\x84)/\xc2\xaf", SpecialCase{ .tokens = .{ "\xc2\xaf\\(\xe3\x83\x84)/\xc2\xaf", "", "" }, .len = 1 } },
4420 .{ "\xc2\xb0C.", SpecialCase{ .tokens = .{ "\xc2\xb0", "C", "." }, .len = 3 } },
4421 .{ "\xc2\xb0F.", SpecialCase{ .tokens = .{ "\xc2\xb0", "F", "." }, .len = 3 } },
4422 .{ "\xc2\xb0K.", SpecialCase{ .tokens = .{ "\xc2\xb0", "K", "." }, .len = 3 } },
4423 .{ "\xc2\xb0c.", SpecialCase{ .tokens = .{ "\xc2\xb0", "c", "." }, .len = 3 } },
4424 .{ "\xc2\xb0f.", SpecialCase{ .tokens = .{ "\xc2\xb0", "f", "." }, .len = 3 } },
4425 .{ "\xc2\xb0k.", SpecialCase{ .tokens = .{ "\xc2\xb0", "k", "." }, .len = 3 } },
4426 .{ "\xc3\xa4.", SpecialCase{ .tokens = .{ "\xc3\xa4.", "", "" }, .len = 1 } },
4427 .{ "\xc3\xb6.", SpecialCase{ .tokens = .{ "\xc3\xb6.", "", "" }, .len = 1 } },
4428 .{ "\xc3\xbc.", SpecialCase{ .tokens = .{ "\xc3\xbc.", "", "" }, .len = 1 } },
4429 .{ "\xe0\xb2\xa0_\xe0\xb2\xa0", SpecialCase{ .tokens = .{ "\xe0\xb2\xa0_\xe0\xb2\xa0", "", "" }, .len = 1 } },
4430 .{ "\xe0\xb2\xa0\xef\xb8\xb5\xe0\xb2\xa0", SpecialCase{ .tokens = .{ "\xe0\xb2\xa0\xef\xb8\xb5\xe0\xb2\xa0", "", "" }, .len = 1 } },
4431 .{ "\xe2\x80\x94", SpecialCase{ .tokens = .{ "\xe2\x80\x94", "", "" }, .len = 1 } },
4432 .{ "\xe2\x80\x98S", SpecialCase{ .tokens = .{ "\xe2\x80\x98S", "", "" }, .len = 1 } },
4433 .{ "\xe2\x80\x98s", SpecialCase{ .tokens = .{ "\xe2\x80\x98s", "", "" }, .len = 1 } },
4434 .{ "\xe2\x80\x99", SpecialCase{ .tokens = .{ "\xe2\x80\x99", "", "" }, .len = 1 } },
4435 .{ "\xe2\x80\x99Cause", SpecialCase{ .tokens = .{ "\xe2\x80\x99Cause", "", "" }, .len = 1 } },
4436 .{ "\xe2\x80\x99Cos", SpecialCase{ .tokens = .{ "\xe2\x80\x99Cos", "", "" }, .len = 1 } },
4437 .{ "\xe2\x80\x99Coz", SpecialCase{ .tokens = .{ "\xe2\x80\x99Coz", "", "" }, .len = 1 } },
4438 .{ "\xe2\x80\x99Cuz", SpecialCase{ .tokens = .{ "\xe2\x80\x99Cuz", "", "" }, .len = 1 } },
4439 .{ "\xe2\x80\x99S", SpecialCase{ .tokens = .{ "\xe2\x80\x99S", "", "" }, .len = 1 } },
4440 .{ "\xe2\x80\x99bout", SpecialCase{ .tokens = .{ "\xe2\x80\x99bout", "", "" }, .len = 1 } },
4441 .{ "\xe2\x80\x99cause", SpecialCase{ .tokens = .{ "\xe2\x80\x99cause", "", "" }, .len = 1 } },
4442 .{ "\xe2\x80\x99cos", SpecialCase{ .tokens = .{ "\xe2\x80\x99cos", "", "" }, .len = 1 } },
4443 .{ "\xe2\x80\x99coz", SpecialCase{ .tokens = .{ "\xe2\x80\x99coz", "", "" }, .len = 1 } },
4444 .{ "\xe2\x80\x99cuz", SpecialCase{ .tokens = .{ "\xe2\x80\x99cuz", "", "" }, .len = 1 } },
4445 .{ "\xe2\x80\x99d", SpecialCase{ .tokens = .{ "\xe2\x80\x99d", "", "" }, .len = 1 } },
4446 .{ "\xe2\x80\x99em", SpecialCase{ .tokens = .{ "\xe2\x80\x99em", "", "" }, .len = 1 } },
4447 .{ "\xe2\x80\x99ll", SpecialCase{ .tokens = .{ "\xe2\x80\x99ll", "", "" }, .len = 1 } },
4448 .{ "\xe2\x80\x99nuff", SpecialCase{ .tokens = .{ "\xe2\x80\x99nuff", "", "" }, .len = 1 } },
4449 .{ "\xe2\x80\x99re", SpecialCase{ .tokens = .{ "\xe2\x80\x99re", "", "" }, .len = 1 } },
4450 .{ "\xe2\x80\x99s", SpecialCase{ .tokens = .{ "\xe2\x80\x99s", "", "" }, .len = 1 } },
4451 .{ "\xe2\x80\x99\xe2\x80\x99", SpecialCase{ .tokens = .{ "\xe2\x80\x99\xe2\x80\x99", "", "" }, .len = 1 } },
4452});