flappa-doormal 2.17.1 → 2.19.0
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.
- package/AGENTS.md +16 -39
- package/README.md +114 -63
- package/dist/index.d.mts +227 -76
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +1034 -1147
- package/dist/index.mjs.map +1 -1
- package/package.json +9 -9
package/dist/index.d.mts
CHANGED
|
@@ -259,6 +259,73 @@ type LineStartsAfterPattern = {
|
|
|
259
259
|
type LineEndsWithPattern = {
|
|
260
260
|
/** Array of patterns that mark line endings. Brackets `()[]` are auto-escaped. */lineEndsWith: string[];
|
|
261
261
|
};
|
|
262
|
+
/**
|
|
263
|
+
* Dictionary entry pattern options for Arabic lexicon-style headword matching.
|
|
264
|
+
*
|
|
265
|
+
* This captures authoring intent in a serializable shape and is compiled into
|
|
266
|
+
* a regex internally by the rule compiler.
|
|
267
|
+
*/
|
|
268
|
+
interface DictionaryEntryPatternOptions {
|
|
269
|
+
/**
|
|
270
|
+
* Words that should never be treated as lemmas when followed by a colon.
|
|
271
|
+
*
|
|
272
|
+
* Matching is Arabic-normalized, diacritic-insensitive, and exact. Callers
|
|
273
|
+
* should provide canonical forms only; vocalized variants do not need to be
|
|
274
|
+
* listed separately.
|
|
275
|
+
*/
|
|
276
|
+
stopWords: string[];
|
|
277
|
+
/**
|
|
278
|
+
* Allow balanced parenthesized headwords like `(عنبر):` or `(عنبر) :`.
|
|
279
|
+
* @default false
|
|
280
|
+
*/
|
|
281
|
+
allowParenthesized?: boolean;
|
|
282
|
+
/**
|
|
283
|
+
* Allow optional whitespace before the trailing colon.
|
|
284
|
+
* @default false
|
|
285
|
+
*/
|
|
286
|
+
allowWhitespaceBeforeColon?: boolean;
|
|
287
|
+
/**
|
|
288
|
+
* Allow comma-separated headword lists like `سبد، دبس:`.
|
|
289
|
+
* @default false
|
|
290
|
+
*/
|
|
291
|
+
allowCommaSeparated?: boolean;
|
|
292
|
+
/**
|
|
293
|
+
* Allow conservative mid-line subentries that begin with `و`.
|
|
294
|
+
* Disable this when the rule should only split true line/page starts.
|
|
295
|
+
* @default true
|
|
296
|
+
*/
|
|
297
|
+
midLineSubentries?: boolean;
|
|
298
|
+
/**
|
|
299
|
+
* Named capture key for the matched lemma metadata.
|
|
300
|
+
* @default 'lemma'
|
|
301
|
+
*/
|
|
302
|
+
captureName?: string;
|
|
303
|
+
/**
|
|
304
|
+
* Minimum number of Arabic base letters in a lemma.
|
|
305
|
+
* @default 2
|
|
306
|
+
*/
|
|
307
|
+
minLetters?: number;
|
|
308
|
+
/**
|
|
309
|
+
* Maximum number of Arabic base letters in a lemma.
|
|
310
|
+
* @default 10
|
|
311
|
+
*/
|
|
312
|
+
maxLetters?: number;
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Arabic dictionary entry pattern rule - serializable headword matcher compiled internally.
|
|
316
|
+
*
|
|
317
|
+
* @example
|
|
318
|
+
* {
|
|
319
|
+
* dictionaryEntry: {
|
|
320
|
+
* stopWords: ['قال', 'وقيل'],
|
|
321
|
+
* allowCommaSeparated: true,
|
|
322
|
+
* },
|
|
323
|
+
* meta: { type: 'entry' }
|
|
324
|
+
* }
|
|
325
|
+
*/
|
|
326
|
+
type DictionaryEntryPattern = {
|
|
327
|
+
dictionaryEntry: DictionaryEntryPatternOptions;
|
|
328
|
+
};
|
|
262
329
|
/**
|
|
263
330
|
* Union of all pattern types for split rules.
|
|
264
331
|
*
|
|
@@ -268,8 +335,9 @@ type LineEndsWithPattern = {
|
|
|
268
335
|
* - `lineStartsWith` - Match line beginnings (marker included)
|
|
269
336
|
* - `lineStartsAfter` - Match line beginnings (marker excluded)
|
|
270
337
|
* - `lineEndsWith` - Match line endings
|
|
338
|
+
* - `dictionaryEntry` - Arabic dictionary headword matching
|
|
271
339
|
*/
|
|
272
|
-
type PatternType = RegexPattern | TemplatePattern | LineStartsWithPattern | LineStartsAfterPattern | LineEndsWithPattern;
|
|
340
|
+
type PatternType = RegexPattern | TemplatePattern | LineStartsWithPattern | LineStartsAfterPattern | LineEndsWithPattern | DictionaryEntryPattern;
|
|
273
341
|
/**
|
|
274
342
|
* Pattern type key names for split rules.
|
|
275
343
|
*
|
|
@@ -285,7 +353,7 @@ type PatternType = RegexPattern | TemplatePattern | LineStartsWithPattern | Line
|
|
|
285
353
|
* const validateKey = (k: string): k is PatternTypeKey =>
|
|
286
354
|
* (PATTERN_TYPE_KEYS as readonly string[]).includes(k);
|
|
287
355
|
*/
|
|
288
|
-
declare const PATTERN_TYPE_KEYS: readonly ["lineStartsWith", "lineStartsAfter", "lineEndsWith", "template", "regex"];
|
|
356
|
+
declare const PATTERN_TYPE_KEYS: readonly ["lineStartsWith", "lineStartsAfter", "lineEndsWith", "template", "regex", "dictionaryEntry"];
|
|
289
357
|
/**
|
|
290
358
|
* String union of pattern type key names.
|
|
291
359
|
*
|
|
@@ -372,13 +440,52 @@ type RuleConstraints = PageRangeConstraintWithExclude & {
|
|
|
372
440
|
* { lineStartsWith: ['{{naql}}'], fuzzy: true, pageStartGuard: '{{tarqim}}' }
|
|
373
441
|
*/
|
|
374
442
|
pageStartGuard?: string;
|
|
443
|
+
/**
|
|
444
|
+
* Suppress page-start matches when the previous page's last Arabic word
|
|
445
|
+
* is in this stoplist, unless that page ends with strong sentence punctuation.
|
|
446
|
+
*
|
|
447
|
+
* This is useful for dictionary-like content where a page break can split
|
|
448
|
+
* a phrase such as `قال` / `العجاج:` across two pages, causing a false entry
|
|
449
|
+
* start at the top of the next page.
|
|
450
|
+
*
|
|
451
|
+
* Notes:
|
|
452
|
+
* - Applies ONLY at page starts, not to mid-page matches.
|
|
453
|
+
* - Matching is exact after Arabic normalization:
|
|
454
|
+
* diacritics are ignored and common variants like ا/أ/إ/آ are tolerated.
|
|
455
|
+
*
|
|
456
|
+
* @example
|
|
457
|
+
* {
|
|
458
|
+
* regex: '^(?<lemma>[ء-غف-ي]+):',
|
|
459
|
+
* pageStartPrevWordStoplist: ['قال', 'وقيل', 'ويقال']
|
|
460
|
+
* }
|
|
461
|
+
*/
|
|
462
|
+
pageStartPrevWordStoplist?: string[];
|
|
463
|
+
/**
|
|
464
|
+
* Suppress matches when the immediately previous Arabic word on the SAME page
|
|
465
|
+
* is in this stoplist.
|
|
466
|
+
*
|
|
467
|
+
* This is useful for dictionary-like content where phrases such as
|
|
468
|
+
* `جلّ وعزّ:` should not be treated as a new entry starting at `وعزّ:`.
|
|
469
|
+
*
|
|
470
|
+
* Notes:
|
|
471
|
+
* - Applies only to non-page-start matches.
|
|
472
|
+
* - Matching is exact after Arabic normalization:
|
|
473
|
+
* diacritics are ignored and common variants like ا/أ/إ/آ are tolerated.
|
|
474
|
+
*
|
|
475
|
+
* @example
|
|
476
|
+
* {
|
|
477
|
+
* regex: '(?<lemma>وعزّ):',
|
|
478
|
+
* samePagePrevWordStoplist: ['جل']
|
|
479
|
+
* }
|
|
480
|
+
*/
|
|
481
|
+
samePagePrevWordStoplist?: string[];
|
|
375
482
|
};
|
|
376
483
|
/**
|
|
377
484
|
* A complete split rule combining pattern, behavior, and constraints.
|
|
378
485
|
*
|
|
379
486
|
* Each rule must specify:
|
|
380
487
|
* - **Pattern** (exactly one): `regex`, `template`, `lineStartsWith`,
|
|
381
|
-
* `lineStartsAfter`, or `
|
|
488
|
+
* `lineStartsAfter`, `lineEndsWith`, or `dictionaryEntry`
|
|
382
489
|
* - **Split behavior**: `split` (optional, defaults to `'at'`), `occurrence`, `fuzzy`
|
|
383
490
|
* - **Constraints** (optional): `min`, `max`, `meta`
|
|
384
491
|
*
|
|
@@ -633,7 +740,7 @@ type SegmentationOptions = {
|
|
|
633
740
|
* - `\\n` - Break at line breaks (useful for OCR content)
|
|
634
741
|
* - `''` - Break at page boundary (always works)
|
|
635
742
|
*
|
|
636
|
-
*
|
|
743
|
+
* Applied to segments that exceed `maxPages` or `maxContentLength`.
|
|
637
744
|
*
|
|
638
745
|
* @example
|
|
639
746
|
* // Simple patterns (backward compatible)
|
|
@@ -1082,67 +1189,57 @@ declare const fixTrailingWaw: (text: string) => string;
|
|
|
1082
1189
|
*/
|
|
1083
1190
|
declare const applyPreprocessToPage: (content: string, pageId: number, transforms: PreprocessTransform[]) => string;
|
|
1084
1191
|
//#endregion
|
|
1085
|
-
//#region src/
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
}
|
|
1136
|
-
report: MarkerRecoveryReport;
|
|
1137
|
-
segments: Segment[];
|
|
1138
|
-
};
|
|
1139
|
-
declare function recoverMistakenMarkersForRuns(runs: MarkerRecoveryRun[], opts?: {
|
|
1140
|
-
mode?: 'rerun_only' | 'best_effort_then_rerun';
|
|
1141
|
-
normalizeCompare?: NormalizeCompareMode;
|
|
1142
|
-
}): {
|
|
1143
|
-
report: MarkerRecoveryReport;
|
|
1144
|
-
segments: Segment[];
|
|
1145
|
-
};
|
|
1192
|
+
//#region src/segmentation/arabic-dictionary-rule.d.ts
|
|
1193
|
+
interface ArabicDictionaryEntryRuleOptions extends DictionaryEntryPatternOptions {
|
|
1194
|
+
/**
|
|
1195
|
+
* Suppress page-start matches when the previous page's last Arabic word
|
|
1196
|
+
* is in this stoplist, unless that page ends with strong sentence punctuation.
|
|
1197
|
+
*/
|
|
1198
|
+
pageStartPrevWordStoplist?: string[];
|
|
1199
|
+
/**
|
|
1200
|
+
* Suppress non-page-start matches when the immediately previous Arabic word
|
|
1201
|
+
* on the same page is in this stoplist.
|
|
1202
|
+
*/
|
|
1203
|
+
samePagePrevWordStoplist?: string[];
|
|
1204
|
+
/**
|
|
1205
|
+
* Static metadata merged into matching segments.
|
|
1206
|
+
*/
|
|
1207
|
+
meta?: Record<string, unknown>;
|
|
1208
|
+
}
|
|
1209
|
+
/**
|
|
1210
|
+
* Creates a reusable split rule for Arabic dictionary entries.
|
|
1211
|
+
*
|
|
1212
|
+
* The returned rule preserves authoring intent as a serializable
|
|
1213
|
+
* `{ dictionaryEntry: ... }` pattern rather than eagerly compiling to a raw
|
|
1214
|
+
* regex string.
|
|
1215
|
+
*
|
|
1216
|
+
* @example
|
|
1217
|
+
* createArabicDictionaryEntryRule({
|
|
1218
|
+
* stopWords: ['وقيل', 'ويقال', 'قال'],
|
|
1219
|
+
* pageStartPrevWordStoplist: ['قال', 'وقيل', 'ويقال'],
|
|
1220
|
+
* })
|
|
1221
|
+
*
|
|
1222
|
+
* @example
|
|
1223
|
+
* createArabicDictionaryEntryRule({
|
|
1224
|
+
* allowParenthesized: true,
|
|
1225
|
+
* allowWhitespaceBeforeColon: true,
|
|
1226
|
+
* allowCommaSeparated: true,
|
|
1227
|
+
* stopWords: ['الليث', 'العجاج'],
|
|
1228
|
+
* })
|
|
1229
|
+
*/
|
|
1230
|
+
declare const createArabicDictionaryEntryRule: ({
|
|
1231
|
+
allowCommaSeparated,
|
|
1232
|
+
allowParenthesized,
|
|
1233
|
+
allowWhitespaceBeforeColon,
|
|
1234
|
+
captureName,
|
|
1235
|
+
maxLetters,
|
|
1236
|
+
meta,
|
|
1237
|
+
midLineSubentries,
|
|
1238
|
+
minLetters,
|
|
1239
|
+
pageStartPrevWordStoplist,
|
|
1240
|
+
samePagePrevWordStoplist,
|
|
1241
|
+
stopWords
|
|
1242
|
+
}: ArabicDictionaryEntryRuleOptions) => SplitRule;
|
|
1146
1243
|
//#endregion
|
|
1147
1244
|
//#region src/segmentation/breakpoint-utils.d.ts
|
|
1148
1245
|
/**
|
|
@@ -1199,7 +1296,7 @@ declare const getSegmentDebugReason: (segment: Segment, options?: DebugReasonOpt
|
|
|
1199
1296
|
/**
|
|
1200
1297
|
* Types of validation issues that can be detected.
|
|
1201
1298
|
*/
|
|
1202
|
-
type ValidationIssueType = 'missing_braces' | 'unknown_token' | 'duplicate' | 'empty_pattern';
|
|
1299
|
+
type ValidationIssueType = 'missing_braces' | 'unknown_token' | 'duplicate' | 'empty_pattern' | 'invalid_regex' | 'invalid_option';
|
|
1203
1300
|
/**
|
|
1204
1301
|
* A validation issue found in a pattern.
|
|
1205
1302
|
*/
|
|
@@ -1219,6 +1316,8 @@ type RuleValidationResult = {
|
|
|
1219
1316
|
lineStartsAfter?: (ValidationIssue | undefined)[];
|
|
1220
1317
|
lineEndsWith?: (ValidationIssue | undefined)[];
|
|
1221
1318
|
template?: ValidationIssue;
|
|
1319
|
+
regex?: ValidationIssue;
|
|
1320
|
+
dictionaryEntry?: Partial<Record<keyof DictionaryEntryPatternOptions, ValidationIssue>>;
|
|
1222
1321
|
};
|
|
1223
1322
|
/**
|
|
1224
1323
|
* Validates split rules for common pattern issues.
|
|
@@ -1301,6 +1400,26 @@ declare const formatValidationReport: (results: (RuleValidationResult | undefine
|
|
|
1301
1400
|
declare const segmentPages: (pages: Page[], options: SegmentationOptions) => Segment[];
|
|
1302
1401
|
//#endregion
|
|
1303
1402
|
//#region src/segmentation/tokens.d.ts
|
|
1403
|
+
/**
|
|
1404
|
+
* Arabic base letters used by low-level dictionary-style regex helpers.
|
|
1405
|
+
*
|
|
1406
|
+
* This is intentionally broader than `{{harf}}`:
|
|
1407
|
+
* - includes standalone hamza `ء`
|
|
1408
|
+
* - stays as a raw regex fragment rather than a template token
|
|
1409
|
+
*/
|
|
1410
|
+
declare const ARABIC_BASE_LETTER_CLASS = "[\u0621-\u063A\u0641-\u064A]";
|
|
1411
|
+
/**
|
|
1412
|
+
* Arabic combining marks / annotation signs used by low-level regex helpers.
|
|
1413
|
+
*/
|
|
1414
|
+
declare const ARABIC_MARKS_CLASS = "[\\u0610-\\u061A\\u0640\\u064B-\\u065F\\u0670\\u06D6-\\u06ED]";
|
|
1415
|
+
/**
|
|
1416
|
+
* A single Arabic base letter followed by zero or more combining marks.
|
|
1417
|
+
*/
|
|
1418
|
+
declare const ARABIC_LETTER_WITH_OPTIONAL_MARKS_PATTERN = "[\u0621-\u063A\u0641-\u064A][\\u0610-\\u061A\\u0640\\u064B-\\u065F\\u0670\\u06D6-\\u06ED]*";
|
|
1419
|
+
/**
|
|
1420
|
+
* One or more Arabic letters, where each letter may carry combining marks.
|
|
1421
|
+
*/
|
|
1422
|
+
declare const ARABIC_WORD_WITH_OPTIONAL_MARKS_PATTERN = "(?:[\u0621-\u063A\u0641-\u064A][\\u0610-\\u061A\\u0640\\u064B-\\u065F\\u0670\\u06D6-\\u06ED]*)+";
|
|
1304
1423
|
/** Pre-defined token constants for use in patterns. */
|
|
1305
1424
|
declare const Token: {
|
|
1306
1425
|
/** Chapter marker - باب */readonly BAB: "{{bab}}"; /** Basmala - بسم الله */
|
|
@@ -1308,7 +1427,7 @@ declare const Token: {
|
|
|
1308
1427
|
readonly BULLET: "{{bullet}}"; /** Dash variants (hyphen, en-dash, em-dash, tatweel) */
|
|
1309
1428
|
readonly DASH: "{{dash}}"; /** Section marker - فصل / مسألة */
|
|
1310
1429
|
readonly FASL: "{{fasl}}"; /** Single Arabic letter */
|
|
1311
|
-
readonly HARF: "{{harf}}"; /** Multiple Arabic letters separated by spaces */
|
|
1430
|
+
readonly HARF: "{{harf}}"; /** Multiple Arabic letters separated by spaces, allowing marks/tatweel on each isolated letter */
|
|
1312
1431
|
readonly HARFS: "{{harfs}}"; /** Horizontal rule / separator (repeated dashes) */
|
|
1313
1432
|
readonly HR: "{{hr}}"; /** Book marker - كتاب */
|
|
1314
1433
|
readonly KITAB: "{{kitab}}"; /** Hadith transmission phrases */
|
|
@@ -1326,6 +1445,10 @@ declare const Token: {
|
|
|
1326
1445
|
* Type representing valid token constant keys.
|
|
1327
1446
|
*/
|
|
1328
1447
|
type TokenKey = keyof typeof Token;
|
|
1448
|
+
/**
|
|
1449
|
+
* Type representing valid token pattern names for `getTokenPattern()`.
|
|
1450
|
+
*/
|
|
1451
|
+
type TokenPatternName = keyof typeof TOKEN_PATTERNS;
|
|
1329
1452
|
/** Wraps a token constant with a named capture: `{{token}}` → `{{token:name}}`. */
|
|
1330
1453
|
declare const withCapture: (token: string, name: string) => string;
|
|
1331
1454
|
/** Expands composite tokens (e.g. `{{numbered}}`) to their underlying template form. */
|
|
@@ -1355,7 +1478,25 @@ declare const expandCompositeTokensInTemplate: (template: string) => string;
|
|
|
1355
1478
|
* // Using the numbered convenience token
|
|
1356
1479
|
* { lineStartsAfter: ['{{numbered}}'], split: 'at' }
|
|
1357
1480
|
*/
|
|
1358
|
-
declare const TOKEN_PATTERNS:
|
|
1481
|
+
declare const TOKEN_PATTERNS: {
|
|
1482
|
+
/** Chapter marker (باب). */readonly bab: "باب"; /** Basmala (بسم الله). Also matches ﷽. */
|
|
1483
|
+
readonly basmalah: string; /** Bullet point variants: `•`, `*`, `°`. */
|
|
1484
|
+
readonly bullet: "[•*°]"; /** Dash variants: `-` (U+002D), `–` (U+2013), `—` (U+2014), `ـ` (tatweel U+0640). */
|
|
1485
|
+
readonly dash: "[-–—ـ]"; /** Section marker (فصل / مسألة). */
|
|
1486
|
+
readonly fasl: string; /** Single Arabic letter (أ-ي). Does NOT include diacritics. */
|
|
1487
|
+
readonly harf: "[أ-ي]"; /** One or more single Arabic letters separated by spaces, allowing marks/tatweel on each isolated letter (e.g. `د ت س`, `هـ ث`). For multi-letter codes use `{{rumuz}}`. */
|
|
1488
|
+
readonly harfs: "[أ-غف-ي][\\u0610-\\u061A\\u0640\\u064B-\\u065F\\u0670\\u06D6-\\u06ED]*(?:\\s+[أ-غف-ي][\\u0610-\\u061A\\u0640\\u064B-\\u065F\\u0670\\u06D6-\\u06ED]*)*"; /** Horizontal rule / separator: 5+ repeated dashes, underscores, equals, or tatweels. Mixed allowed. */
|
|
1489
|
+
readonly hr: "[-–—ـ_=]{5,}"; /** Book marker (كتاب). */
|
|
1490
|
+
readonly kitab: "كتاب"; /** Hadith transmission phrases (حدثنا, أخبرنا, حدثني, etc.). */
|
|
1491
|
+
readonly naql: string; /** Newline character. Useful for breakpoints that split on line boundaries. */
|
|
1492
|
+
readonly newline: "\\n"; /** Single ASCII digit (0-9). */
|
|
1493
|
+
readonly num: "\\d"; /** One or more ASCII digits (0-9)+. */
|
|
1494
|
+
readonly nums: "\\d+"; /** Single Arabic-Indic digit (٠-٩, U+0660-U+0669). */
|
|
1495
|
+
readonly raqm: "[\\u0660-\\u0669]"; /** One or more Arabic-Indic digits (٠-٩)+. */
|
|
1496
|
+
readonly raqms: "[\\u0660-\\u0669]+"; /** Rijāl/takhrīj source abbreviations. Matches one or more codes separated by whitespace. */
|
|
1497
|
+
readonly rumuz: string; /** Arabic/common punctuation: `.`, `!`, `?`, `؟`, `؛`. */
|
|
1498
|
+
readonly tarqim: "[.!?؟؛]";
|
|
1499
|
+
};
|
|
1359
1500
|
/**
|
|
1360
1501
|
* Checks if a query string contains template tokens.
|
|
1361
1502
|
*
|
|
@@ -1487,28 +1628,28 @@ declare const templateToRegex: (template: string) => RegExp | null;
|
|
|
1487
1628
|
* Useful for documentation, validation, or building user interfaces
|
|
1488
1629
|
* that show available tokens.
|
|
1489
1630
|
*
|
|
1490
|
-
* @returns Array of token names (e.g., `['bab', '
|
|
1631
|
+
* @returns Array of token names (e.g., `['bab', 'basmalah', 'bullet', ...]`)
|
|
1491
1632
|
*
|
|
1492
1633
|
* @example
|
|
1493
1634
|
* getAvailableTokens()
|
|
1494
|
-
* // → ['bab', '
|
|
1635
|
+
* // → ['bab', 'basmalah', 'bullet', 'dash', 'harf', 'kitab', 'naql', 'raqm', 'raqms']
|
|
1495
1636
|
*/
|
|
1496
|
-
declare const getAvailableTokens: () =>
|
|
1637
|
+
declare const getAvailableTokens: () => TokenPatternName[];
|
|
1497
1638
|
/**
|
|
1498
1639
|
* Gets the regex pattern for a specific token name.
|
|
1499
1640
|
*
|
|
1500
1641
|
* Returns the raw pattern string as defined in `TOKEN_PATTERNS`,
|
|
1501
1642
|
* without any expansion or capture group wrapping.
|
|
1502
1643
|
*
|
|
1503
|
-
* @param tokenName - The token name to look up (e.g., 'raqms'
|
|
1504
|
-
* @returns The regex pattern string
|
|
1644
|
+
* @param tokenName - The token name to look up (e.g., `'raqms'`, `'dash'`, `'harfs'`)
|
|
1645
|
+
* @returns The regex pattern string for that known token
|
|
1505
1646
|
*
|
|
1506
1647
|
* @example
|
|
1507
1648
|
* getTokenPattern('raqms') // → '[\\u0660-\\u0669]+'
|
|
1508
1649
|
* getTokenPattern('dash') // → '[-–—ـ]'
|
|
1509
|
-
* getTokenPattern('
|
|
1650
|
+
* getTokenPattern('harfs') // → pattern for spaced isolated Arabic letter codes
|
|
1510
1651
|
*/
|
|
1511
|
-
declare const getTokenPattern: (tokenName:
|
|
1652
|
+
declare const getTokenPattern: (tokenName: TokenPatternName) => string;
|
|
1512
1653
|
/**
|
|
1513
1654
|
* Checks if a pattern (or array of patterns) contains tokens that should
|
|
1514
1655
|
* default to fuzzy matching.
|
|
@@ -1606,6 +1747,16 @@ declare const escapeTemplateBrackets: (pattern: string) => string;
|
|
|
1606
1747
|
* escapeRegex('a+b*c?') // → 'a\\+b\\*c\\?'
|
|
1607
1748
|
*/
|
|
1608
1749
|
declare const escapeRegex: (s: string) => string;
|
|
1750
|
+
/**
|
|
1751
|
+
* Normalizes Arabic text for exact comparisons while tolerating common variants.
|
|
1752
|
+
*
|
|
1753
|
+
* This removes Arabic diacritics, collapses whitespace, removes joiners, and
|
|
1754
|
+
* maps common equivalent letters to a shared canonical form:
|
|
1755
|
+
* - ا/آ/أ/إ -> ا
|
|
1756
|
+
* - ة/ه -> ه
|
|
1757
|
+
* - ى/ي -> ي
|
|
1758
|
+
*/
|
|
1759
|
+
declare const normalizeArabicForComparison: (text: string) => string;
|
|
1609
1760
|
declare const makeDiacriticInsensitive: (text: string) => string;
|
|
1610
1761
|
//#endregion
|
|
1611
1762
|
//#region src/validation/validate-segments.d.ts
|
|
@@ -1633,5 +1784,5 @@ type ValidationOptions = {
|
|
|
1633
1784
|
*/
|
|
1634
1785
|
declare const validateSegments: (pages: Page[], options: SegmentationOptions, segments: Segment[], validationOptions?: ValidationOptions) => SegmentValidationReport;
|
|
1635
1786
|
//#endregion
|
|
1636
|
-
export {
|
|
1787
|
+
export { ARABIC_BASE_LETTER_CLASS, ARABIC_LETTER_WITH_OPTIONAL_MARKS_PATTERN, ARABIC_MARKS_CLASS, ARABIC_WORD_WITH_OPTIONAL_MARKS_PATTERN, type ArabicDictionaryEntryRuleOptions, type Breakpoint, type BreakpointRule, type CommonLineStartPattern, type CondenseEllipsisRule, type DetectedPattern, type DictionaryEntryPatternOptions, type ExpandResult, type FixTrailingWawRule, type LineStartAnalysisOptions, type LineStartPatternExample, type Logger, type OptimizeResult, PATTERN_TYPE_KEYS, type Page, type PageRange, type PageRangeConstraint, type PageRangeConstraintWithExclude, type PatternProcessor, type PatternTypeKey, type PreprocessTransform, type RemoveZeroWidthRule, type RepeatingSequenceExample, type RepeatingSequenceOptions, type RepeatingSequencePattern, type RuleValidationResult, type Segment, type SegmentValidationIssue, type SegmentValidationIssueSeverity, type SegmentValidationIssueType, type SegmentValidationReport, type SegmentationOptions, type SplitRule, TOKEN_PATTERNS, Token, type TokenKey, type TokenMapping, type TokenPatternName, type ValidationIssue, type ValidationIssueType, type ValidationOptions, analyzeCommonLineStarts, analyzeRepeatingSequences, analyzeTextForRule, applyPreprocessToPage, applyTokenMappings, condenseEllipsis, containsTokens, createArabicDictionaryEntryRule, detectTokenPatterns, escapeRegex, escapeTemplateBrackets, escapeWordsOutsideTokens, expandCompositeTokensInTemplate, expandTokens, expandTokensWithCaptures, fixTrailingWaw, formatValidationReport, generateTemplateFromText, getAvailableTokens, getDebugReason, getSegmentDebugReason, getTokenPattern, makeDiacriticInsensitive, normalizeArabicForComparison, optimizeRules, removeZeroWidth, segmentPages, shouldDefaultToFuzzy, stripTokenMappings, suggestPatternConfig, templateToRegex, validateRules, validateSegments, withCapture };
|
|
1637
1788
|
//# sourceMappingURL=index.d.mts.map
|
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/types/breakpoints.ts","../src/types/rules.ts","../src/types/options.ts","../src/types/validation.ts","../src/types/index.ts","../src/analysis/line-starts.ts","../src/analysis/repeating-sequences.ts","../src/detection.ts","../src/optimization/optimize-rules.ts","../src/preprocessing/transforms.ts","../src/
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/types/breakpoints.ts","../src/types/rules.ts","../src/types/options.ts","../src/types/validation.ts","../src/types/index.ts","../src/analysis/line-starts.ts","../src/analysis/repeating-sequences.ts","../src/detection.ts","../src/optimization/optimize-rules.ts","../src/preprocessing/transforms.ts","../src/segmentation/arabic-dictionary-rule.ts","../src/segmentation/breakpoint-utils.ts","../src/segmentation/debug-meta.ts","../src/segmentation/pattern-validator.ts","../src/segmentation/segmenter.ts","../src/segmentation/tokens.ts","../src/utils/textUtils.ts","../src/validation/validate-segments.ts"],"mappings":";AAqBA;;;;;;;;;;;;AA2GA;;;;;;;AA3GA,KAAY,cAAA,GAAiB,8BAAA;ECOxB;;;;;AAEI;;;;;AA4BG;EDzBR,OAAA;;;;ACuDc;;;;;AAiCC;;;;;AAiCnB;EDzGI,KAAA;;;;;;;;;;;;;AC6JH;;;;;AAeiD;;;;;;;;;;;ED9I9C,KAAA;EC8JE;;;;;;;AAqBN;;;EDvKI,KAAA;EC8KM;AAOV;;;;;AAAgE;;;;;;;;;AA0CvD;;;ED3ML,QAAA;AAAA;;;;;;;;ACgUJ;;;;;;;KD/SY,UAAA,YAAsB,cAAA;;;AA3GlC;;;;;;;;;;;;AA2GA;;;;;;;;AChIiE;;;;;AA8BxD;ADTT,KCOK,YAAA;wEAED,KAAA;AAAA;AA4BQ;;;;;AA8BM;;;;;AAiCC;;;;;AAiCnB;;;;;;;;AAhGY,KAFP,eAAA;EAyID,2GAvIA,QAAA;AAAA;;;AAoJH;;;;;AAeiD;;;;;;;;;;;;;;;;;;KAvI7C,qBAAA;EA4KQ,kHA1KT,cAAA;AAAA;;;AAwLJ;;;;;AAAgE;;;;;;;;;AA0CvD;;;;;;;;;;;;KAnMJ,sBAAA;EAwTgB,oHAtTjB,eAAA;AAAA;;;;;;;;;;;;;AC/FJ;;;;;;;KDqHK,mBAAA;EC5GG,kFD8GJ,YAAA;AAAA;;;;AC9DJ;;;UDuEiB,6BAAA;ECtET;AAqBR;;;;;;EDyDI,SAAA;ECnDoB;;;;EDyDpB,kBAAA;ECzDoB;AA0BxB;;;EDqCI,0BAAA;ECnCA;;;;EDyCA,mBAAA;ECvC6B;;;;;ED8C7B,iBAAA;EC1C6B;;;;EDgD7B,WAAA;EC9CgC;AAmCpC;;;EDiBI,UAAA;ECQoB;;;;EDFpB,UAAA;AAAA;;;;;;;;;;;;;KAeC,sBAAA;EACD,eAAA,EAAiB,6BAAA;AAAA;;;;;;;AE7NrB;;;;;KF2OK,WAAA,GACC,YAAA,GACA,eAAA,GACA,qBAAA,GACA,sBAAA,GACA,mBAAA,GACA,sBAAA;;;;;AEzON;;;;;;;;;;;cF0Pa,iBAAA;;;;;;KAcD,cAAA,WAAyB,iBAAA;;;;;;;KAUhC,aAAA;EE3PG;;AAGR;;;;EF+PI,KAAA;EE7PA;;;;;;;;EFuQA,UAAA;EEhQ8B;;;;AC7BlC;;;;;;;;;EH4SI,KAAA;AAAA;AGhQJ;;;;;AA2BA;;;AA3BA,KH2QK,eAAA,GAAkB,8BAAA;EGhPF;AAgBrB;;;;;AAwBA;;;;;EHoNI,IAAA,GAAO,MAAA;EGpMG;;;;;;AC1Hd;;;;;;;;;;;;;;EJoVI,cAAA;EI1UA;;;;;AAIJ;;;;;AAEA;;;;;;;;;EJyVI,yBAAA;EI/ES;;;;;;;;;;;;;;;;;;EJmGT,wBAAA;AAAA;;;;;;;;;;;;;;;AK1WJ;;;;;;;;;;AAOA;;KLkYY,SAAA,GAAY,WAAA,GAAc,aAAA,GAAgB,eAAA;;;;;;;;;;;;;AD/StD;;;;;;;;AChIiE;;;;KC0BrD,mBAAA,GAAsB,mBAAA;EAC9B,IAAA;ED6BgB;;;;AAER;;;ECvBR,IAAA;AAAA;ADqDc;;;;;AAiCC;;;;;AAiCnB;;;;;;;;;;AAlEkB,KC9BN,oBAAA,GAAuB,mBAAA;EAC/B,IAAA;AAAA;;ADmJH;;;;;AAeiD;;;;;;;;;;;;;;;KC1ItC,kBAAA,GAAqB,mBAAA;EAC7B,IAAA;AAAA;;AD8KJ;;;;;AAcA;;;;;AAAgE;;;;;;;KCvKpD,mBAAA,+DAIN,mBAAA,GACA,oBAAA,GACA,kBAAA;;AD2MG;;;;;;;;;;;;AAqHT;;;;;;;;;;;UCtSiB,MAAA;EDsSoD;ECpSjE,KAAA,IAAS,OAAA,aAAoB,IAAA;;EAE7B,KAAA,IAAS,OAAA,aAAoB,IAAA;EAnHrB;EAqHR,IAAA,IAAQ,OAAA,aAAoB,IAAA;;EAE5B,KAAA,IAAS,OAAA,aAAoB,IAAA;EAvHC;EAyH9B,IAAA,IAAQ,OAAA,aAAoB,IAAA;AAAA;;;AAzFhC;;;;;AAyBA;;;;;AAsBA;;;;;;;;;;;;;AAgCA;;;;;;;KA6CY,mBAAA;EAzCC;;;;;;;EAiDT,KAAA,GAAQ,SAAA;EA3CR;;;;;AAmCJ;;;;EAmBI,KAAA;IAkEc,4DA9DJ,OAAA,WAgJG;IA9IH,OAAA,GAAU,KAAA;EAAA;EAjBpB;;;;;;;;;;;;;;EAkCA,QAAA;EA6Ha;;;;;;AC7VjB;;;;;ED6OI,gBAAA;EC3OkC;;;;AAMtC;;;;;;;;;;;;;;;;;;;;;;;;EDmQI,WAAA,GAAc,UAAA;EC5OV;;AAGR;;;;;EDkPI,MAAA;EC/OI;;;;;;;;;;;;ED6PJ,UAAA;EEpRe;;;;;;;;;;AA4CnB;;;;;AA2BA;;;;;AAgBA;;;;;AAwBA;;;;;;EFsMI,MAAA,GAAS,MAAA;EEtLU;;;;;AC1HvB;;;;;;;;;;;;;;;;;;;EH0UI,UAAA,GAAa,mBAAA;AAAA;;;KC7VL,8BAAA;AAAA,KAEA,0BAAA;AAAA,KAMA,sBAAA;EACR,IAAA,EAAM,0BAAA;EACN,QAAA,EAAU,8BAAA;EACV,YAAA;EACA,OAAA;IACI,IAAA;IACA,EAAA;IACA,cAAA;EAAA;EAEJ,QAAA;IACI,IAAA;IACA,EAAA;EAAA;EAEJ,MAAA;IACI,IAAA;IACA,EAAA;EAAA;EAEJ,WAAA;IACI,MAAA;IACA,WAAA;IACA,UAAA;EAAA;EAEJ,QAAA;EACA,IAAA;AAAA;AAAA,KAGQ,uBAAA;EACR,EAAA;EACA,OAAA;IACI,YAAA;IACA,SAAA;IACA,MAAA;IACA,MAAA;IACA,QAAA;EAAA;EAEJ,MAAA,EAAQ,sBAAA;AAAA;;;;AHtBZ;;;;;;;;;;;;AA2GA;KIlHY,OAAA;;;;;;;EAOR,OAAA;EHOa;;;EGFb,IAAA;EH8BC;;;;;AAEO;EGxBR,EAAA;;;;AHsDc;;;;EG7Cd,IAAA,GAAO,MAAA;AAAA;;;;;AH+GX;;;;;;;;KGhGY,IAAA;EHuIR;;;;;EGjIA,EAAA;EH4JuB;;;;AACuB;;EGrJ9C,OAAA;AAAA;;;;;;;;;;;KAaQ,SAAA;;;;;AH6KZ;;;;;AAcA;;;;;KG3KY,mBAAA;EHqLM;;;;EGhLd,GAAA;EHgNA;;;AAAK;EG1ML,GAAA;AAAA;;;;;;;;;;AH+TJ;KGlTY,8BAAA,GAAiC,mBAAA;;;;;;;;;;;;;;;AFnG7C;EEmHI,OAAA,GAAU,SAAA;AAAA;;;KC1HF,wBAAA;EACR,IAAA;EACA,WAAA;EACA,aAAA;EACA,QAAA;EACA,WAAA;EACA,wBAAA;EACA,yBAAA;EACA,MAAA;EACA,UAAA,IAAc,IAAA,UAAc,MAAA;EAC5B,cAAA,GAAiB,MAAA;EACjB,UAAA;AAAA;AAAA,KAGQ,uBAAA;EAA4B,IAAA;EAAc,MAAA;AAAA;AAAA,KAE1C,sBAAA;EACR,OAAA;EACA,KAAA;EACA,QAAA,EAAU,uBAAA;AAAA;;;;cAuQD,uBAAA,GACT,KAAA,EAAO,IAAA,IACP,OAAA,GAAS,wBAAA,KACV,sBAAA;;;KCvRS,wBAAA;EACR,WAAA;EACA,WAAA;EACA,QAAA;EACA,IAAA;EACA,yBAAA;EACA,YAAA;EACA,UAAA;EACA,WAAA;EACA,YAAA;EACA,iBAAA;AAAA;AAAA,KAGQ,wBAAA;EACR,IAAA;EACA,OAAA;EACA,MAAA;EACA,YAAA;AAAA;AAAA,KAGQ,wBAAA;EACR,OAAA;EACA,KAAA;EACA,QAAA,EAAU,wBAAA;AAAA;;ALwCI;;;;;cK6LL,yBAAA,GACT,KAAA,EAAO,IAAA,IACP,OAAA,GAAU,wBAAA,KACX,wBAAA;;;;ANnQH;;KOhBY,eAAA;EPgB+C,6DOdvD,KAAA,UP0BA;EOxBA,KAAA,UPsEA;EOpEA,KAAA,UPoGA;EOlGA,QAAA;AAAA;APmHJ;;;;;;;;AChIiE;;;;;AA8BxD;;ADkGT,cO5Ca,mBAAA,GAAuB,IAAA,aAAY,eAAA;;;AN1BpC;;;;;AA8BM;;;;;AAiCC;cM2BN,wBAAA,GAA4B,IAAA,UAAc,QAAA,EAAU,eAAA;;;;ANMjE;;;cMiBa,oBAAA,GACT,QAAA,EAAU,eAAA;EACT,WAAA;EAAmD,KAAA;EAAgB,QAAA;AAAA;;;;;;;cA+B3D,kBAAA,GACT,IAAA;EAEA,QAAA;EACA,WAAA;EACA,KAAA;EACA,QAAA;EACA,QAAA,EAAU,eAAA;AAAA;;;AP9Ld;;;AAAA,KQbY,cAAA;ERaiB,yDQXzB,KAAA,EAAO,SAAA,IRuCP;EQrCA,WAAA;AAAA;AAAA,cAqES,aAAA,GAAiB,KAAA,EAAO,SAAA;;SAAA,SAAA;AAAA;;;;;AR+CrC;;;;;cShGa,eAAA,GAAmB,IAAA,UAAc,IAAA;;;ARhCmB;;;;;AA8BxD;;cQkCI,gBAAA,GAAoB,IAAA;;;ARNrB;;;;;AA8BM;cQdL,cAAA,GAAkB,IAAA;;;;AR+CZ;;;;;AAiCnB;;;cQrCa,qBAAA,GAAyB,OAAA,UAAiB,MAAA,UAAgB,UAAA,EAAY,mBAAA;;;UCjHlE,gCAAA,SAAyC,6BAAA;EViBhC;;;;EUZtB,yBAAA;EVwCA;;;;EUlCA,wBAAA;EVgGQ;AAiBZ;;EU5GI,IAAA,GAAO,MAAA;AAAA;;;;;ATUF;;;;;AA4BG;;;;;AA8BM;;;;;AAiCC;;cSgEN,+BAAA;EAAmC,mBAAA;EAAA,kBAAA;EAAA,0BAAA;EAAA,WAAA;EAAA,UAAA;EAAA,IAAA;EAAA,iBAAA;EAAA,UAAA;EAAA,yBAAA;EAAA,wBAAA;EAAA;AAAA,GAY7C,gCAAA,KAAmC,SAAA;;;AVrEtC;;;;;;;;AChIiE;;;;;AA8BxD;;;;;AA4BG;;;;ADsEZ,cWnFa,wBAAA,GAA4B,IAAA;ATazC;AAAA,KS6JY,gBAAA,IAAoB,OAAA;;;;;;KCnIpB,kBAAA;EXsEK;;;;EWjEb,OAAA;AAAA;;;;;;cAyDS,cAAA,GAAkB,IAAA,EAAM,MAAA,2BAAiC,OAAA,GAAU,kBAAA;;;AX4D/E;;;cWhCY,qBAAA,GAAyB,OAAA,EAAS,OAAA,EAAS,OAAA,GAAU,kBAAA;;;;;;KCjKtD,mBAAA;;;AbmHZ;KaxGY,eAAA;EACR,IAAA,EAAM,mBAAA;EACN,OAAA;EACA,UAAA;EAEA,KAAA;EAEA,OAAA;AAAA;;;;AZDK;KYQG,oBAAA;EACR,cAAA,IAAkB,eAAA;EAClB,eAAA,IAAmB,eAAA;EACnB,YAAA,IAAgB,eAAA;EAChB,QAAA,GAAW,eAAA;EACX,KAAA,GAAQ,eAAA;EACR,eAAA,GAAkB,OAAA,CAAQ,MAAA,OAAa,6BAAA,EAA+B,eAAA;AAAA;;AZ4CxD;;;;;AAiCC;;;;;AAiCnB;;;;;;;;cY0Ga,aAAA,GAAiB,KAAA,EAAO,SAAA,QAAW,oBAAA;;;;;;AZtD/C;;;;;AAeiD;;;cYuErC,sBAAA,GAA0B,OAAA,GAAU,oBAAA;;;;;;;;AZpSgB;;;;;AA8BxD;;;;;AA4BG;;;;;AA8BM;;;;;AAiCC;;;;;AAiCnB;;;;;;;;;;;;ca8Ka,YAAA,GAAgB,KAAA,EAAO,IAAA,IAAQ,OAAA,EAAS,mBAAA,KAAmB,OAAA;;;;AdnTxE;;;;;;ceda,wBAAA;;;;cAKA,kBAAA;;AfoHb;;ce/Ga,yCAAA;;;;cAKA,uCAAA;;cAiHA,KAAA;Ed3GI,oDAEb;EAAA,mCA0BC;EAAA;6BAEO;EAAA,2BA4Bc;EAAA,2BAEtB;EAAA,6BA+BC;EAAA;+BAEc;EAAA,2BAsBK;EAAA,iCAEpB;EAAA,yBASa;EAAA;6BAQb;EAAA,2BAYA;EAAA,6BAaA;EAAA,6BAYA;EAAA;;;AAOH;;Kc7BW,QAAA,gBAAwB,KAAA;;;Ad4Cc;KcvCtC,gBAAA,gBAAgC,cAAA;;cAG/B,WAAA,GAAe,KAAA,UAAe,IAAA;;cAiB9B,+BAAA,GAAmC,QAAA;;;;;;;;;;;;;;AdwDhD;;;;;AAcA;;;;;AAAgE;;cctBnD,cAAA;EdgCK,iDAiBd;EAAA,2BAeK;EAAA,0BAWJ;EAAA;yBAAkB;EAAA,wBAYZ;EAAA,yKA2CP;EAAA,6BAoBwB;EAAA,wBA+BhB;EAAA;2BAA0B;EAAA,qBAA+B;EAAA,uBAA7C;EAAA,oCAA8B;EAAA,sCAAe;EAAA;;;;;;;;;;;ACrXrE;;;;;AAyBA;;cakNa,cAAA,GAAkB,KAAA;;;Ab5L/B;;;;KauMY,YAAA;EbjMN;;;;;EauMF,OAAA;EbvMoB;;AA0BxB;;;EaoLI,YAAA;EblLA;;;;;EayLA,WAAA;AAAA;;;;;;;;;;;Ab9IJ;;;;;;;;;;;;;;;;;;;;;;;;;;ca4Qa,wBAAA,GACT,KAAA,UACA,cAAA,IAAkB,OAAA,qBAClB,aAAA;;;;;AZrcJ;;;;;AAEA;;;;;AAMA;;;;;;;;;AARA,cYgfa,YAAA,GAAgB,KAAA;;;;;;;;;;;;;;;;;;AZ9c7B;;;;cYqea,eAAA,GAAmB,QAAA,aAAgB,MAAA;;;;;;;;;;;;;cAqBnC,kBAAA,QAAyB,gBAAA;AX9gBtC;;;;;;;;;;;AA4CA;;;AA5CA,cW8hBa,eAAA,GAAmB,SAAA,EAAW,gBAAA;;AXvd3C;;;;;AAgBA;;;;;AAwBA;;;cW6ca,oBAAA,GAAwB,QAAA;;;;KAWzB,YAAA;EAAiB,KAAA;EAAe,IAAA;AAAA;;AVlkB5C;;;;;;;;;;;;;;;;;cUslBa,kBAAA,GAAsB,QAAA,UAAkB,QAAA,EAAU,YAAA;;;AVxkB/D;;;;;AAEA;;;;;;;;cUmmBa,kBAAA,GAAsB,QAAA;;;;;;AftgBnC;;;;;;;;AChIiE;;;;;AA8BxD;;;;;AA4BG;;cenBC,sBAAA,GAA0B,OAAA;;;AfiDrB;;;;;AAiCC;;;;;AAiCnB;ce1Da,WAAA,GAAe,CAAA;;;;;;;;;;cAwBf,4BAAA,GAAgC,IAAA;AAAA,cAiBhC,wBAAA,GAA4B,IAAA;;;KCzC7B,iBAAA;EjB3E+C;;;;;EiBiFvD,mBAAA;AAAA;;;AjB0BJ;;;;;;;;AChIiE;;;;cgB0iBpD,gBAAA,GACT,KAAA,EAAO,IAAA,IACP,OAAA,EAAS,mBAAA,EACT,QAAA,EAAU,OAAA,IACV,iBAAA,GAAoB,iBAAA,KACrB,uBAAA"}
|