@stll/text-normalize 0.0.1-placeholder.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,513 @@
1
+ /**
2
+ * Latin-script fold table: the characters PostgreSQL `unaccent()` folds that
3
+ * NFD plus combining-mark removal cannot reach, either because the letter has
4
+ * no canonical decomposition (`ł`, `đ`, `ø`, `ß`) or because Unicode
5
+ * classifies it as a diacritic and a mark strip deletes it outright (`ʰ`, `ᴬ`).
6
+ *
7
+ * Generated from the extension's own rules, so the two sides cannot drift by
8
+ * hand:
9
+ *
10
+ * ```sql
11
+ * SELECT cp, unaccent(chr(cp))
12
+ * FROM generate_series(1, 196607) AS cp
13
+ * WHERE NOT (cp BETWEEN 55296 AND 57343)
14
+ * AND unaccent(chr(cp)) IS DISTINCT FROM chr(cp);
15
+ * ```
16
+ *
17
+ * A row becomes an entry below when its character is `\p{Script=Latin}` and its
18
+ * `unaccent` output differs from NFD plus mark removal. Non-Latin scripts stay
19
+ * out of the contract and pass through unchanged; see `foldToAscii`.
20
+ *
21
+ * `apps/api/src/lib/search/ascii-fold-unaccent-parity.db.test.ts` re-runs the
22
+ * query against a live PostgreSQL and asserts both directions, so an extension
23
+ * upgrade that adds, drops, or retargets a rule fails CI instead of silently
24
+ * splitting the query-side fold from the indexed lexemes.
25
+ *
26
+ * Keys are single code points; values are ASCII, which is what makes
27
+ * `foldToAscii` idempotent.
28
+ */
29
+ export const ASCII_FOLD_TABLE = {
30
+ // Latin-1 Supplement
31
+ ª: "a", // U+00AA
32
+ º: "o", // U+00BA
33
+ Æ: "AE", // U+00C6
34
+ Ð: "D", // U+00D0
35
+ Ø: "O", // U+00D8
36
+ Þ: "TH", // U+00DE
37
+ ß: "ss", // U+00DF
38
+ æ: "ae", // U+00E6
39
+ ð: "d", // U+00F0
40
+ ø: "o", // U+00F8
41
+ þ: "th", // U+00FE
42
+ // Latin Extended-A
43
+ Đ: "D", // U+0110
44
+ đ: "d", // U+0111
45
+ Ħ: "H", // U+0126
46
+ ħ: "h", // U+0127
47
+ ı: "i", // U+0131
48
+ IJ: "IJ", // U+0132
49
+ ij: "ij", // U+0133
50
+ ĸ: "q", // U+0138
51
+ Ŀ: "L", // U+013F
52
+ ŀ: "l", // U+0140
53
+ Ł: "L", // U+0141
54
+ ł: "l", // U+0142
55
+ ʼn: "'n", // U+0149
56
+ Ŋ: "N", // U+014A
57
+ ŋ: "n", // U+014B
58
+ Œ: "OE", // U+0152
59
+ œ: "oe", // U+0153
60
+ Ŧ: "T", // U+0166
61
+ ŧ: "t", // U+0167
62
+ ſ: "s", // U+017F
63
+ // Latin Extended-B
64
+ ƀ: "b", // U+0180
65
+ Ɓ: "B", // U+0181
66
+ Ƃ: "B", // U+0182
67
+ ƃ: "b", // U+0183
68
+ Ƈ: "C", // U+0187
69
+ ƈ: "c", // U+0188
70
+ Ɖ: "D", // U+0189
71
+ Ɗ: "D", // U+018A
72
+ Ƌ: "D", // U+018B
73
+ ƌ: "d", // U+018C
74
+ Ɛ: "E", // U+0190
75
+ Ƒ: "F", // U+0191
76
+ ƒ: "f", // U+0192
77
+ Ɠ: "G", // U+0193
78
+ ƕ: "hv", // U+0195
79
+ Ɩ: "I", // U+0196
80
+ Ɨ: "I", // U+0197
81
+ Ƙ: "K", // U+0198
82
+ ƙ: "k", // U+0199
83
+ ƚ: "l", // U+019A
84
+ Ɲ: "N", // U+019D
85
+ ƞ: "n", // U+019E
86
+ Ƣ: "OI", // U+01A2
87
+ ƣ: "oi", // U+01A3
88
+ Ƥ: "P", // U+01A4
89
+ ƥ: "p", // U+01A5
90
+ ƫ: "t", // U+01AB
91
+ Ƭ: "T", // U+01AC
92
+ ƭ: "t", // U+01AD
93
+ Ʈ: "T", // U+01AE
94
+ Ʋ: "V", // U+01B2
95
+ Ƴ: "Y", // U+01B3
96
+ ƴ: "y", // U+01B4
97
+ Ƶ: "Z", // U+01B5
98
+ ƶ: "z", // U+01B6
99
+ DŽ: "DZ", // U+01C4
100
+ Dž: "Dz", // U+01C5
101
+ dž: "dz", // U+01C6
102
+ LJ: "LJ", // U+01C7
103
+ Lj: "Lj", // U+01C8
104
+ lj: "lj", // U+01C9
105
+ NJ: "NJ", // U+01CA
106
+ Nj: "Nj", // U+01CB
107
+ nj: "nj", // U+01CC
108
+ Ǥ: "G", // U+01E4
109
+ ǥ: "g", // U+01E5
110
+ DZ: "DZ", // U+01F1
111
+ Dz: "Dz", // U+01F2
112
+ dz: "dz", // U+01F3
113
+ ȡ: "d", // U+0221
114
+ Ȥ: "Z", // U+0224
115
+ ȥ: "z", // U+0225
116
+ ȴ: "l", // U+0234
117
+ ȵ: "n", // U+0235
118
+ ȶ: "t", // U+0236
119
+ ȷ: "j", // U+0237
120
+ ȸ: "db", // U+0238
121
+ ȹ: "qp", // U+0239
122
+ Ⱥ: "A", // U+023A
123
+ Ȼ: "C", // U+023B
124
+ ȼ: "c", // U+023C
125
+ Ƚ: "L", // U+023D
126
+ Ⱦ: "T", // U+023E
127
+ ȿ: "s", // U+023F
128
+ ɀ: "z", // U+0240
129
+ Ƀ: "B", // U+0243
130
+ Ʉ: "U", // U+0244
131
+ Ɇ: "E", // U+0246
132
+ ɇ: "e", // U+0247
133
+ Ɉ: "J", // U+0248
134
+ ɉ: "j", // U+0249
135
+ Ɍ: "R", // U+024C
136
+ ɍ: "r", // U+024D
137
+ Ɏ: "Y", // U+024E
138
+ ɏ: "y", // U+024F
139
+ // IPA Extensions
140
+ ɓ: "b", // U+0253
141
+ ɕ: "c", // U+0255
142
+ ɖ: "d", // U+0256
143
+ ɗ: "d", // U+0257
144
+ ɛ: "e", // U+025B
145
+ ɟ: "j", // U+025F
146
+ ɠ: "g", // U+0260
147
+ ɡ: "g", // U+0261
148
+ ɢ: "G", // U+0262
149
+ ɦ: "h", // U+0266
150
+ ɧ: "h", // U+0267
151
+ ɨ: "i", // U+0268
152
+ ɪ: "I", // U+026A
153
+ ɫ: "l", // U+026B
154
+ ɬ: "l", // U+026C
155
+ ɭ: "l", // U+026D
156
+ ɱ: "m", // U+0271
157
+ ɲ: "n", // U+0272
158
+ ɳ: "n", // U+0273
159
+ ɴ: "N", // U+0274
160
+ ɶ: "OE", // U+0276
161
+ ɼ: "r", // U+027C
162
+ ɽ: "r", // U+027D
163
+ ɾ: "r", // U+027E
164
+ ʀ: "R", // U+0280
165
+ ʂ: "s", // U+0282
166
+ ʈ: "t", // U+0288
167
+ ʉ: "u", // U+0289
168
+ ʋ: "v", // U+028B
169
+ ʏ: "Y", // U+028F
170
+ ʐ: "z", // U+0290
171
+ ʑ: "z", // U+0291
172
+ ʙ: "B", // U+0299
173
+ ʛ: "G", // U+029B
174
+ ʜ: "H", // U+029C
175
+ ʝ: "j", // U+029D
176
+ ʟ: "L", // U+029F
177
+ ʠ: "q", // U+02A0
178
+ ʣ: "dz", // U+02A3
179
+ ʥ: "dz", // U+02A5
180
+ ʦ: "ts", // U+02A6
181
+ ʪ: "ls", // U+02AA
182
+ ʫ: "lz", // U+02AB
183
+ // Spacing Modifier Letters
184
+ ʰ: "h", // U+02B0
185
+ ʲ: "j", // U+02B2
186
+ ʳ: "r", // U+02B3
187
+ ʷ: "w", // U+02B7
188
+ ʸ: "y", // U+02B8
189
+ ˡ: "l", // U+02E1
190
+ ˢ: "s", // U+02E2
191
+ ˣ: "x", // U+02E3
192
+ // Phonetic Extensions
193
+ ᴀ: "A", // U+1D00
194
+ ᴁ: "AE", // U+1D01
195
+ ᴃ: "B", // U+1D03
196
+ ᴄ: "C", // U+1D04
197
+ ᴅ: "D", // U+1D05
198
+ ᴆ: "D", // U+1D06
199
+ ᴇ: "E", // U+1D07
200
+ ᴊ: "J", // U+1D0A
201
+ ᴋ: "K", // U+1D0B
202
+ ᴌ: "L", // U+1D0C
203
+ ᴍ: "M", // U+1D0D
204
+ ᴏ: "O", // U+1D0F
205
+ ᴘ: "P", // U+1D18
206
+ ᴛ: "T", // U+1D1B
207
+ ᴜ: "U", // U+1D1C
208
+ ᴠ: "V", // U+1D20
209
+ ᴡ: "W", // U+1D21
210
+ ᴢ: "Z", // U+1D22
211
+ ᴬ: "A", // U+1D2C
212
+ ᴮ: "B", // U+1D2E
213
+ ᴰ: "D", // U+1D30
214
+ ᴱ: "E", // U+1D31
215
+ ᴳ: "G", // U+1D33
216
+ ᴴ: "H", // U+1D34
217
+ ᴵ: "I", // U+1D35
218
+ ᴶ: "J", // U+1D36
219
+ ᴷ: "K", // U+1D37
220
+ ᴸ: "L", // U+1D38
221
+ ᴹ: "M", // U+1D39
222
+ ᴺ: "N", // U+1D3A
223
+ ᴼ: "O", // U+1D3C
224
+ ᴾ: "P", // U+1D3E
225
+ ᴿ: "R", // U+1D3F
226
+ ᵀ: "T", // U+1D40
227
+ ᵁ: "U", // U+1D41
228
+ ᵂ: "W", // U+1D42
229
+ ᵃ: "a", // U+1D43
230
+ ᵇ: "b", // U+1D47
231
+ ᵈ: "d", // U+1D48
232
+ ᵉ: "e", // U+1D49
233
+ ᵍ: "g", // U+1D4D
234
+ ᵏ: "k", // U+1D4F
235
+ ᵐ: "m", // U+1D50
236
+ ᵒ: "o", // U+1D52
237
+ ᵖ: "p", // U+1D56
238
+ ᵗ: "t", // U+1D57
239
+ ᵘ: "u", // U+1D58
240
+ ᵛ: "v", // U+1D5B
241
+ ᵢ: "i", // U+1D62
242
+ ᵣ: "r", // U+1D63
243
+ ᵤ: "u", // U+1D64
244
+ ᵥ: "v", // U+1D65
245
+ ᵫ: "ue", // U+1D6B
246
+ ᵬ: "b", // U+1D6C
247
+ ᵭ: "d", // U+1D6D
248
+ ᵮ: "f", // U+1D6E
249
+ ᵯ: "m", // U+1D6F
250
+ ᵰ: "n", // U+1D70
251
+ ᵱ: "p", // U+1D71
252
+ ᵲ: "r", // U+1D72
253
+ ᵳ: "r", // U+1D73
254
+ ᵴ: "s", // U+1D74
255
+ ᵵ: "t", // U+1D75
256
+ ᵶ: "z", // U+1D76
257
+ ᵺ: "th", // U+1D7A
258
+ ᵻ: "I", // U+1D7B
259
+ ᵽ: "p", // U+1D7D
260
+ ᵾ: "U", // U+1D7E
261
+ // Phonetic Extensions Supplement
262
+ ᶀ: "b", // U+1D80
263
+ ᶁ: "d", // U+1D81
264
+ ᶂ: "f", // U+1D82
265
+ ᶃ: "g", // U+1D83
266
+ ᶄ: "k", // U+1D84
267
+ ᶅ: "l", // U+1D85
268
+ ᶆ: "m", // U+1D86
269
+ ᶇ: "n", // U+1D87
270
+ ᶈ: "p", // U+1D88
271
+ ᶉ: "r", // U+1D89
272
+ ᶊ: "s", // U+1D8A
273
+ ᶌ: "v", // U+1D8C
274
+ ᶍ: "x", // U+1D8D
275
+ ᶎ: "z", // U+1D8E
276
+ ᶏ: "a", // U+1D8F
277
+ ᶑ: "d", // U+1D91
278
+ ᶒ: "e", // U+1D92
279
+ ᶓ: "e", // U+1D93
280
+ ᶖ: "i", // U+1D96
281
+ ᶙ: "u", // U+1D99
282
+ ᶜ: "c", // U+1D9C
283
+ ᶠ: "f", // U+1DA0
284
+ ᶻ: "z", // U+1DBB
285
+ // Latin Extended Additional
286
+ ẚ: "a", // U+1E9A
287
+ ẜ: "s", // U+1E9C
288
+ ẝ: "s", // U+1E9D
289
+ ẞ: "SS", // U+1E9E
290
+ Ỻ: "LL", // U+1EFA
291
+ ỻ: "ll", // U+1EFB
292
+ Ỽ: "V", // U+1EFC
293
+ ỽ: "v", // U+1EFD
294
+ Ỿ: "Y", // U+1EFE
295
+ ỿ: "y", // U+1EFF
296
+ // Superscripts and Subscripts
297
+ ⁱ: "i", // U+2071
298
+ ⁿ: "n", // U+207F
299
+ ₐ: "a", // U+2090
300
+ ₑ: "e", // U+2091
301
+ ₒ: "o", // U+2092
302
+ ₓ: "x", // U+2093
303
+ ₕ: "h", // U+2095
304
+ ₖ: "k", // U+2096
305
+ ₗ: "l", // U+2097
306
+ ₘ: "m", // U+2098
307
+ ₙ: "n", // U+2099
308
+ ₚ: "p", // U+209A
309
+ ₛ: "s", // U+209B
310
+ ₜ: "t", // U+209C
311
+ // Number Forms
312
+ Ⅰ: "I", // U+2160
313
+ Ⅱ: "II", // U+2161
314
+ Ⅲ: "III", // U+2162
315
+ Ⅳ: "IV", // U+2163
316
+ Ⅴ: "V", // U+2164
317
+ Ⅵ: "VI", // U+2165
318
+ Ⅶ: "VII", // U+2166
319
+ Ⅷ: "VIII", // U+2167
320
+ Ⅸ: "IX", // U+2168
321
+ Ⅹ: "X", // U+2169
322
+ Ⅺ: "XI", // U+216A
323
+ Ⅻ: "XII", // U+216B
324
+ Ⅼ: "L", // U+216C
325
+ Ⅽ: "C", // U+216D
326
+ Ⅾ: "D", // U+216E
327
+ Ⅿ: "M", // U+216F
328
+ ⅰ: "i", // U+2170
329
+ ⅱ: "ii", // U+2171
330
+ ⅲ: "iii", // U+2172
331
+ ⅳ: "iv", // U+2173
332
+ ⅴ: "v", // U+2174
333
+ ⅵ: "vi", // U+2175
334
+ ⅶ: "vii", // U+2176
335
+ ⅷ: "viii", // U+2177
336
+ ⅸ: "ix", // U+2178
337
+ ⅹ: "x", // U+2179
338
+ ⅺ: "xi", // U+217A
339
+ ⅻ: "xii", // U+217B
340
+ ⅼ: "l", // U+217C
341
+ ⅽ: "c", // U+217D
342
+ ⅾ: "d", // U+217E
343
+ ⅿ: "m", // U+217F
344
+ // Latin Extended-C
345
+ Ⱡ: "L", // U+2C60
346
+ ⱡ: "l", // U+2C61
347
+ Ɫ: "L", // U+2C62
348
+ Ᵽ: "P", // U+2C63
349
+ Ɽ: "R", // U+2C64
350
+ ⱥ: "a", // U+2C65
351
+ ⱦ: "t", // U+2C66
352
+ Ⱨ: "H", // U+2C67
353
+ ⱨ: "h", // U+2C68
354
+ Ⱪ: "K", // U+2C69
355
+ ⱪ: "k", // U+2C6A
356
+ Ⱬ: "Z", // U+2C6B
357
+ ⱬ: "z", // U+2C6C
358
+ Ɱ: "M", // U+2C6E
359
+ ⱱ: "v", // U+2C71
360
+ Ⱳ: "W", // U+2C72
361
+ ⱳ: "w", // U+2C73
362
+ ⱴ: "v", // U+2C74
363
+ ⱸ: "e", // U+2C78
364
+ ⱺ: "o", // U+2C7A
365
+ ⱼ: "j", // U+2C7C
366
+ ⱽ: "V", // U+2C7D
367
+ Ȿ: "S", // U+2C7E
368
+ Ɀ: "Z", // U+2C7F
369
+ // Latin Extended-D
370
+ ꜰ: "F", // U+A730
371
+ ꜱ: "S", // U+A731
372
+ Ꜳ: "AA", // U+A732
373
+ ꜳ: "aa", // U+A733
374
+ Ꜵ: "AO", // U+A734
375
+ ꜵ: "ao", // U+A735
376
+ Ꜷ: "AU", // U+A736
377
+ ꜷ: "au", // U+A737
378
+ Ꜹ: "AV", // U+A738
379
+ ꜹ: "av", // U+A739
380
+ Ꜻ: "AV", // U+A73A
381
+ ꜻ: "av", // U+A73B
382
+ Ꜽ: "AY", // U+A73C
383
+ ꜽ: "ay", // U+A73D
384
+ Ꝁ: "K", // U+A740
385
+ ꝁ: "k", // U+A741
386
+ Ꝃ: "K", // U+A742
387
+ ꝃ: "k", // U+A743
388
+ Ꝅ: "K", // U+A744
389
+ ꝅ: "k", // U+A745
390
+ Ꝇ: "L", // U+A746
391
+ ꝇ: "l", // U+A747
392
+ Ꝉ: "L", // U+A748
393
+ ꝉ: "l", // U+A749
394
+ Ꝋ: "O", // U+A74A
395
+ ꝋ: "o", // U+A74B
396
+ Ꝍ: "O", // U+A74C
397
+ ꝍ: "o", // U+A74D
398
+ Ꝏ: "OO", // U+A74E
399
+ ꝏ: "oo", // U+A74F
400
+ Ꝑ: "P", // U+A750
401
+ ꝑ: "p", // U+A751
402
+ Ꝓ: "P", // U+A752
403
+ ꝓ: "p", // U+A753
404
+ Ꝕ: "P", // U+A754
405
+ ꝕ: "p", // U+A755
406
+ Ꝗ: "Q", // U+A756
407
+ ꝗ: "q", // U+A757
408
+ Ꝙ: "Q", // U+A758
409
+ ꝙ: "q", // U+A759
410
+ Ꝟ: "V", // U+A75E
411
+ ꝟ: "v", // U+A75F
412
+ Ꝡ: "VY", // U+A760
413
+ ꝡ: "vy", // U+A761
414
+ Ꝥ: "TH", // U+A764
415
+ ꝥ: "th", // U+A765
416
+ Ꝧ: "TH", // U+A766
417
+ ꝧ: "th", // U+A767
418
+ ꝱ: "d", // U+A771
419
+ ꝲ: "l", // U+A772
420
+ ꝳ: "m", // U+A773
421
+ ꝴ: "n", // U+A774
422
+ ꝵ: "r", // U+A775
423
+ ꝶ: "R", // U+A776
424
+ ꝷ: "t", // U+A777
425
+ Ꝺ: "D", // U+A779
426
+ ꝺ: "d", // U+A77A
427
+ Ꝼ: "F", // U+A77B
428
+ ꝼ: "f", // U+A77C
429
+ Ꞇ: "T", // U+A786
430
+ ꞇ: "t", // U+A787
431
+ Ꞑ: "N", // U+A790
432
+ ꞑ: "n", // U+A791
433
+ Ꞓ: "C", // U+A792
434
+ ꞓ: "c", // U+A793
435
+ Ꞡ: "G", // U+A7A0
436
+ ꞡ: "g", // U+A7A1
437
+ Ꞣ: "K", // U+A7A2
438
+ ꞣ: "k", // U+A7A3
439
+ Ꞥ: "N", // U+A7A4
440
+ ꞥ: "n", // U+A7A5
441
+ Ꞧ: "R", // U+A7A6
442
+ ꞧ: "r", // U+A7A7
443
+ Ꞩ: "S", // U+A7A8
444
+ ꞩ: "s", // U+A7A9
445
+ Ɦ: "H", // U+A7AA
446
+ ꟲ: "C", // U+A7F2
447
+ ꟳ: "F", // U+A7F3
448
+ ꟴ: "Q", // U+A7F4
449
+ // Alphabetic Presentation Forms
450
+ ff: "ff", // U+FB00
451
+ fi: "fi", // U+FB01
452
+ fl: "fl", // U+FB02
453
+ ffi: "ffi", // U+FB03
454
+ ffl: "ffl", // U+FB04
455
+ ſt: "st", // U+FB05
456
+ st: "st", // U+FB06
457
+ // Halfwidth and Fullwidth Forms
458
+ A: "A", // U+FF21
459
+ B: "B", // U+FF22
460
+ C: "C", // U+FF23
461
+ D: "D", // U+FF24
462
+ E: "E", // U+FF25
463
+ F: "F", // U+FF26
464
+ G: "G", // U+FF27
465
+ H: "H", // U+FF28
466
+ I: "I", // U+FF29
467
+ J: "J", // U+FF2A
468
+ K: "K", // U+FF2B
469
+ L: "L", // U+FF2C
470
+ M: "M", // U+FF2D
471
+ N: "N", // U+FF2E
472
+ O: "O", // U+FF2F
473
+ P: "P", // U+FF30
474
+ Q: "Q", // U+FF31
475
+ R: "R", // U+FF32
476
+ S: "S", // U+FF33
477
+ T: "T", // U+FF34
478
+ U: "U", // U+FF35
479
+ V: "V", // U+FF36
480
+ W: "W", // U+FF37
481
+ X: "X", // U+FF38
482
+ Y: "Y", // U+FF39
483
+ Z: "Z", // U+FF3A
484
+ a: "a", // U+FF41
485
+ b: "b", // U+FF42
486
+ c: "c", // U+FF43
487
+ d: "d", // U+FF44
488
+ e: "e", // U+FF45
489
+ f: "f", // U+FF46
490
+ g: "g", // U+FF47
491
+ h: "h", // U+FF48
492
+ i: "i", // U+FF49
493
+ j: "j", // U+FF4A
494
+ k: "k", // U+FF4B
495
+ l: "l", // U+FF4C
496
+ m: "m", // U+FF4D
497
+ n: "n", // U+FF4E
498
+ o: "o", // U+FF4F
499
+ p: "p", // U+FF50
500
+ q: "q", // U+FF51
501
+ r: "r", // U+FF52
502
+ s: "s", // U+FF53
503
+ t: "t", // U+FF54
504
+ u: "u", // U+FF55
505
+ v: "v", // U+FF56
506
+ w: "w", // U+FF57
507
+ x: "x", // U+FF58
508
+ y: "y", // U+FF59
509
+ z: "z", // U+FF5A
510
+ // Latin Extended-F
511
+ 𐞥: "q", // U+107A5
512
+ };
513
+ //# sourceMappingURL=ascii-fold-table.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ascii-fold-table.js","sourceRoot":"","sources":["../src/ascii-fold-table.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAqC;IAChE,qBAAqB;IACrB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,IAAI,EAAE,SAAS;IAClB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,IAAI,EAAE,SAAS;IAClB,CAAC,EAAE,IAAI,EAAE,SAAS;IAClB,CAAC,EAAE,IAAI,EAAE,SAAS;IAClB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,IAAI,EAAE,SAAS;IAClB,mBAAmB;IACnB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,IAAI,EAAE,SAAS;IAClB,CAAC,EAAE,IAAI,EAAE,SAAS;IAClB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,IAAI,EAAE,SAAS;IAClB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,IAAI,EAAE,SAAS;IAClB,CAAC,EAAE,IAAI,EAAE,SAAS;IAClB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,mBAAmB;IACnB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,IAAI,EAAE,SAAS;IAClB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,IAAI,EAAE,SAAS;IAClB,CAAC,EAAE,IAAI,EAAE,SAAS;IAClB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,IAAI,EAAE,SAAS;IAClB,CAAC,EAAE,IAAI,EAAE,SAAS;IAClB,CAAC,EAAE,IAAI,EAAE,SAAS;IAClB,CAAC,EAAE,IAAI,EAAE,SAAS;IAClB,CAAC,EAAE,IAAI,EAAE,SAAS;IAClB,CAAC,EAAE,IAAI,EAAE,SAAS;IAClB,CAAC,EAAE,IAAI,EAAE,SAAS;IAClB,CAAC,EAAE,IAAI,EAAE,SAAS;IAClB,CAAC,EAAE,IAAI,EAAE,SAAS;IAClB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,IAAI,EAAE,SAAS;IAClB,CAAC,EAAE,IAAI,EAAE,SAAS;IAClB,CAAC,EAAE,IAAI,EAAE,SAAS;IAClB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,IAAI,EAAE,SAAS;IAClB,CAAC,EAAE,IAAI,EAAE,SAAS;IAClB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,iBAAiB;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,IAAI,EAAE,SAAS;IAClB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,IAAI,EAAE,SAAS;IAClB,CAAC,EAAE,IAAI,EAAE,SAAS;IAClB,CAAC,EAAE,IAAI,EAAE,SAAS;IAClB,CAAC,EAAE,IAAI,EAAE,SAAS;IAClB,CAAC,EAAE,IAAI,EAAE,SAAS;IAClB,2BAA2B;IAC3B,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,sBAAsB;IACtB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,IAAI,EAAE,SAAS;IAClB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,IAAI,EAAE,SAAS;IAClB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,IAAI,EAAE,SAAS;IAClB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,iCAAiC;IACjC,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IA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,EAAE,GAAG,EAAE,SAAS;IACjB,mBAAmB;IACnB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,mBAAmB;IACnB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,IAAI,EAAE,SAAS;IAClB,CAAC,EAAE,IAAI,EAAE,SAAS;IAClB,CAAC,EAAE,IAAI,EAAE,SAAS;IAClB,CAAC,EAAE,IAAI,EAAE,SAAS;IAClB,CAAC,EAAE,IAAI,EAAE,SAAS;IAClB,CAAC,EAAE,IAAI,EAAE,SAAS;IAClB,CAAC,EAAE,IAAI,EAAE,SAAS;IAClB,CAAC,EAAE,IAAI,EAAE,SAAS;IAClB,CAAC,EAAE,IAAI,EAAE,SAAS;IAClB,CAAC,EAAE,IAAI,EAAE,SAAS;IAClB,CAAC,EAAE,IAAI,EAAE,SAAS;IAClB,CAAC,EAAE,IAAI,EAAE,SAAS;IAClB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,IAAI,EAAE,SAAS;IAClB,CAAC,EAAE,IAAI,EAAE,SAAS;IAClB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,IAAI,EAAE,SAAS;IAClB,CAAC,EAAE,IAAI,EAAE,SAAS;IAClB,CAAC,EAAE,IAAI,EAAE,SAAS;IAClB,CAAC,EAAE,IAAI,EAAE,SAAS;IAClB,CAAC,EAAE,IAAI,EAAE,SAAS;IAClB,CAAC,EAAE,IAAI,EAAE,SAAS;IAClB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,gCAAgC;IAChC,CAAC,EAAE,IAAI,EAAE,SAAS;IAClB,CAAC,EAAE,IAAI,EAAE,SAAS;IAClB,CAAC,EAAE,IAAI,EAAE,SAAS;IAClB,CAAC,EAAE,KAAK,EAAE,SAAS;IACnB,CAAC,EAAE,KAAK,EAAE,SAAS;IACnB,CAAC,EAAE,IAAI,EAAE,SAAS;IAClB,CAAC,EAAE,IAAI,EAAE,SAAS;IAClB,gCAAgC;IAChC,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,CAAC,EAAE,GAAG,EAAE,SAAS;IACjB,mBAAmB;IACnB,EAAE,EAAE,GAAG,EAAE,UAAU;CACpB,CAAC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Latin-ASCII folding for search keys whose counterpart is a PostgreSQL
3
+ * `unaccent()` index or a Tantivy `ascii_folding` index.
4
+ *
5
+ * `stripDiacritics` decomposes with NFD and drops combining marks, which can
6
+ * only fold letters that have a canonical decomposition. Polish `ł` has none,
7
+ * so it survives a mark strip while `unaccent('łaska')` yields `laska`: a query
8
+ * containing `ł` then under-matches the very lexemes the index stored for it.
9
+ * `foldToAscii` keeps NFD plus mark removal as the base and adds the rules
10
+ * `unaccent` applies that decomposition cannot express.
11
+ */
12
+ /**
13
+ * The replace step of `foldToAscii`, for callers that decompose themselves
14
+ * (`foldSearchMatchText` decomposes with NFKD and per character). The input
15
+ * must already be decomposed or table-only characters would hide inside
16
+ * precomposed letters.
17
+ */
18
+ export declare const applyAsciiFolds: (decomposed: string) => string;
19
+ /**
20
+ * Fold text to its ASCII search key.
21
+ *
22
+ * The contract is parity with `unaccent()` for Latin-script characters: for
23
+ * every rule the extension declares over `\p{Script=Latin}`, this produces the
24
+ * same output. Other scripts are out of contract and keep whatever NFD plus
25
+ * mark removal leaves, so Greek, Cyrillic, and Arabic text passes through with
26
+ * its own diacritics stripped and its letters intact. Output is ASCII wherever
27
+ * the input was Latin, and folding is idempotent.
28
+ */
29
+ export declare const foldToAscii: (text: string) => string;
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Latin-ASCII folding for search keys whose counterpart is a PostgreSQL
3
+ * `unaccent()` index or a Tantivy `ascii_folding` index.
4
+ *
5
+ * `stripDiacritics` decomposes with NFD and drops combining marks, which can
6
+ * only fold letters that have a canonical decomposition. Polish `ł` has none,
7
+ * so it survives a mark strip while `unaccent('łaska')` yields `laska`: a query
8
+ * containing `ł` then under-matches the very lexemes the index stored for it.
9
+ * `foldToAscii` keeps NFD plus mark removal as the base and adds the rules
10
+ * `unaccent` applies that decomposition cannot express.
11
+ */
12
+ import { ASCII_FOLD_TABLE } from "./ascii-fold-table.js";
13
+ // The table is matched before `\p{Diacritic}` so modifier letters that Unicode
14
+ // classifies as diacritics (`ʰ`, `ᴬ`) fold to their base letter the way
15
+ // `unaccent` folds them, instead of being deleted by the mark strip. Every key
16
+ // is a single code point outside the character-class metacharacter set, so the
17
+ // class needs no escaping.
18
+ const ASCII_FOLD_RE = new RegExp(`[${Object.keys(ASCII_FOLD_TABLE).join("")}]|\\p{Diacritic}`, "gu");
19
+ /**
20
+ * The replace step of `foldToAscii`, for callers that decompose themselves
21
+ * (`foldSearchMatchText` decomposes with NFKD and per character). The input
22
+ * must already be decomposed or table-only characters would hide inside
23
+ * precomposed letters.
24
+ */
25
+ export const applyAsciiFolds = (decomposed) => decomposed.replace(ASCII_FOLD_RE, (char) => ASCII_FOLD_TABLE[char] ?? "");
26
+ /**
27
+ * Fold text to its ASCII search key.
28
+ *
29
+ * The contract is parity with `unaccent()` for Latin-script characters: for
30
+ * every rule the extension declares over `\p{Script=Latin}`, this produces the
31
+ * same output. Other scripts are out of contract and keep whatever NFD plus
32
+ * mark removal leaves, so Greek, Cyrillic, and Arabic text passes through with
33
+ * its own diacritics stripped and its letters intact. Output is ASCII wherever
34
+ * the input was Latin, and folding is idempotent.
35
+ */
36
+ export const foldToAscii = (text) => applyAsciiFolds(text.normalize("NFD"));
37
+ //# sourceMappingURL=ascii-fold.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ascii-fold.js","sourceRoot":"","sources":["../src/ascii-fold.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,+EAA+E;AAC/E,wEAAwE;AACxE,+EAA+E;AAC/E,+EAA+E;AAC/E,2BAA2B;AAC3B,MAAM,aAAa,GAAG,IAAI,MAAM,CAC9B,IAAI,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,kBAAkB,EAC5D,IAAI,CACL,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,UAAkB,EAAU,EAAE,CAC5D,UAAU,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;AAE5E;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,IAAY,EAAU,EAAE,CAClD,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Latin/combining-mark diacritic stripping for search keys and slugs.
3
+ *
4
+ * Both variants decompose the input and then remove every character
5
+ * Unicode classifies as a diacritic (`\p{Diacritic}`). `\p{Diacritic}`
6
+ * is deliberate: it covers combining marks in every block, not only the
7
+ * Combining Diacritical Marks block (U+0300–U+036F). A range like
8
+ * `[̀-ͯ]` misses marks in the Extended (U+1AB0–U+1AFF) and
9
+ * Supplement (U+1DC0–U+1DFF) blocks, so two callers using different
10
+ * classes would disagree on the same text.
11
+ *
12
+ * The variants differ only in the decomposition form:
13
+ *
14
+ * - `stripDiacritics` uses NFD (canonical decomposition). Use it for
15
+ * search keys, where compatibility characters must survive unchanged.
16
+ * - `stripDiacriticsForSlug` uses NFKD (compatibility decomposition), so
17
+ * ligatures, full-width forms, superscripts, and similar fold to their
18
+ * ASCII base before the `[a-z0-9]` slug filter runs. Slugs are
19
+ * persisted, public URL segments, so this variant pins the exact form
20
+ * the existing slugs were generated with; do not switch it to NFD.
21
+ */
22
+ /**
23
+ * Strip combining diacritics from search text (NFD). Non-diacritic
24
+ * characters, including compatibility characters, pass through unchanged.
25
+ */
26
+ export declare const stripDiacritics: (text: string) => string;
27
+ /**
28
+ * Strip combining diacritics for slug generation (NFKD). Callers apply
29
+ * their own case folding and `[a-z0-9]` filtering around this; the NFKD
30
+ * form is load-bearing for byte-stable slugs and must not change.
31
+ */
32
+ export declare const stripDiacriticsForSlug: (text: string) => string;