ax-grep 0.1.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.
- package/LICENSE +21 -0
- package/README.md +71 -119
- package/dist/browser.d.ts +1 -1
- package/dist/browser.js +1 -1
- package/dist/{chunk-U3GDKPLQ.js → chunk-HPZ32BKV.js} +37 -3
- package/dist/chunk-HPZ32BKV.js.map +1 -0
- package/dist/{chunk-Z7V6PIPH.js → chunk-ZXTURCRT.js} +214 -24
- package/dist/chunk-ZXTURCRT.js.map +1 -0
- package/dist/cli.d.ts +10 -0
- package/dist/cli.js +22364 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.js +38 -4
- package/dist/index.js.map +1 -1
- package/dist/static.d.ts +1 -1
- package/dist/static.js +1 -1
- package/dist/types-gwHWhYmw.d.ts +3660 -0
- package/docs/README.md +19 -0
- package/docs/agent-handoff.md +95 -0
- package/docs/agent-readiness.md +38 -0
- package/docs/assets/ax-grep-benchmark.png +0 -0
- package/docs/assets/ax-grep-og.png +0 -0
- package/docs/assets/ax-grep-search.png +0 -0
- package/docs/benchmarks.md +123 -0
- package/docs/cli-agent.md +194 -0
- package/docs/comparison-baseline.md +625 -0
- package/docs/features.md +28 -0
- package/docs/library-api.md +211 -0
- package/docs/progress.md +1306 -0
- package/package.json +33 -3
- package/skills/ax-grep-cli/SKILL.md +89 -0
- package/skills.sh +24 -0
- package/dist/chunk-U3GDKPLQ.js.map +0 -1
- package/dist/chunk-Z7V6PIPH.js.map +0 -1
- package/dist/types-dgf3brcf.d.ts +0 -74
|
@@ -77,8 +77,10 @@ function extractStaticSemanticTree(html, options = {}) {
|
|
|
77
77
|
options: resolveStaticOptions(document.children, html, options),
|
|
78
78
|
nextId: 1,
|
|
79
79
|
ids: /* @__PURE__ */ new Map(),
|
|
80
|
+
referencedIds: /* @__PURE__ */ new Set(),
|
|
80
81
|
collapsedControlledIds: /* @__PURE__ */ new Set(),
|
|
81
|
-
labelsByFor: /* @__PURE__ */ new Map()
|
|
82
|
+
labelsByFor: /* @__PURE__ */ new Map(),
|
|
83
|
+
slotAssignments: void 0
|
|
82
84
|
};
|
|
83
85
|
indexDocument(document.children, context);
|
|
84
86
|
const root = findElement(document.children, "body") ?? findElement(document.children, "html") ?? fragmentRoot(document.children);
|
|
@@ -132,6 +134,9 @@ function indexDocument(nodes, context) {
|
|
|
132
134
|
if (!isElement(node)) continue;
|
|
133
135
|
const id = attr(node, "id");
|
|
134
136
|
if (id) context.ids.set(id, node);
|
|
137
|
+
for (const referencedId of referencedIds(node)) {
|
|
138
|
+
context.referencedIds.add(referencedId);
|
|
139
|
+
}
|
|
135
140
|
if (attr(node, "aria-expanded") === "false") {
|
|
136
141
|
for (const controlledId of (attr(node, "aria-controls") ?? "").split(/\s+/)) {
|
|
137
142
|
if (controlledId) context.collapsedControlledIds.add(controlledId);
|
|
@@ -139,11 +144,30 @@ function indexDocument(nodes, context) {
|
|
|
139
144
|
}
|
|
140
145
|
if (node.name === "label") {
|
|
141
146
|
const target = attr(node, "for");
|
|
142
|
-
if (target) context.labelsByFor.set(target,
|
|
147
|
+
if (target) context.labelsByFor.set(target, node);
|
|
143
148
|
}
|
|
144
149
|
indexDocument(node.children, context);
|
|
145
150
|
}
|
|
146
151
|
}
|
|
152
|
+
function referencedIds(element) {
|
|
153
|
+
return [
|
|
154
|
+
attr(element, "aria-labelledby"),
|
|
155
|
+
attr(element, "aria-describedby"),
|
|
156
|
+
attr(element, "aria-details"),
|
|
157
|
+
attr(element, "aria-errormessage"),
|
|
158
|
+
attr(element, "aria-controls"),
|
|
159
|
+
attr(element, "aria-owns"),
|
|
160
|
+
attr(element, "aria-flowto"),
|
|
161
|
+
attr(element, "aria-activedescendant")
|
|
162
|
+
].filter((value) => Boolean(value)).flatMap((value) => value.split(/\s+/).map((item) => item.trim()).filter(Boolean));
|
|
163
|
+
}
|
|
164
|
+
function descriptionReferenceIds(element) {
|
|
165
|
+
return new Set([
|
|
166
|
+
attr(element, "aria-describedby"),
|
|
167
|
+
attr(element, "aria-details"),
|
|
168
|
+
attr(element, "aria-errormessage")
|
|
169
|
+
].filter((value) => Boolean(value)).flatMap((value) => value.split(/\s+/).map((item) => item.trim()).filter(Boolean)));
|
|
170
|
+
}
|
|
147
171
|
function walkElement(element, context) {
|
|
148
172
|
if (!element) return null;
|
|
149
173
|
if (shouldSkipElement(element, context)) return null;
|
|
@@ -160,9 +184,15 @@ function walkElement(element, context) {
|
|
|
160
184
|
const name = role ? computeName(element, role, context) : "";
|
|
161
185
|
const tag = element.name;
|
|
162
186
|
const children = shouldSkipChildrenForCollapsedElement(element, context) ? [] : collectChildren(element, context);
|
|
187
|
+
if (tag === "iframe" && children.length === 0 && attr(element, "src") && !attr(element, "srcdoc")) {
|
|
188
|
+
children.push(unavailableNode(context, "iframe", "iframe content unavailable in static HTML"));
|
|
189
|
+
}
|
|
163
190
|
if (context.options.mode === "interactive" && !interactive) {
|
|
164
191
|
return children.length > 0 ? containerNode(context, tag, children) : null;
|
|
165
192
|
}
|
|
193
|
+
if (shouldPruneCustomElementWrapper(element, role, name, interactive, children, context)) {
|
|
194
|
+
return children.length === 1 ? children[0] ?? null : containerNode(context, "fragment", children);
|
|
195
|
+
}
|
|
166
196
|
if (shouldPruneListItemWrapper(role, children, context)) {
|
|
167
197
|
return children.length === 1 ? children[0] ?? null : containerNode(context, tag, children);
|
|
168
198
|
}
|
|
@@ -181,6 +211,8 @@ function walkElement(element, context) {
|
|
|
181
211
|
xpath: getXPath(element),
|
|
182
212
|
children
|
|
183
213
|
};
|
|
214
|
+
const description = computeDescription(element, context);
|
|
215
|
+
if (description) node.description = description;
|
|
184
216
|
const text = directText(element, context.options.maxTextLength);
|
|
185
217
|
if (text) node.text = text;
|
|
186
218
|
const value = getValue(element);
|
|
@@ -193,21 +225,56 @@ function collectChildren(element, context) {
|
|
|
193
225
|
const children = [];
|
|
194
226
|
const repeatedSignatures = /* @__PURE__ */ new Map();
|
|
195
227
|
let omitted = 0;
|
|
228
|
+
const shadowTemplate = element.children.find((child) => isElement(child) && isDeclarativeShadowTemplate(child));
|
|
229
|
+
if (shadowTemplate) {
|
|
230
|
+
const previousAssignments = context.slotAssignments;
|
|
231
|
+
context.slotAssignments = collectSlotAssignments(element);
|
|
232
|
+
for (const child of shadowTemplate.children) {
|
|
233
|
+
if (!isElement(child)) continue;
|
|
234
|
+
const semanticChild = walkElement(child, context);
|
|
235
|
+
omitted += appendSemanticChild(element, semanticChild, children, repeatedSignatures, context);
|
|
236
|
+
}
|
|
237
|
+
context.slotAssignments = previousAssignments;
|
|
238
|
+
const linkFarmSummary2 = summarizeLikelyLinkFarmChildren(element, children, context);
|
|
239
|
+
if (linkFarmSummary2.omitted > 0) {
|
|
240
|
+
children.splice(0, children.length, ...linkFarmSummary2.children);
|
|
241
|
+
omitted += linkFarmSummary2.omitted;
|
|
242
|
+
}
|
|
243
|
+
if (omitted > 0) children.push(omittedNode(context, omitted));
|
|
244
|
+
return children;
|
|
245
|
+
}
|
|
246
|
+
if (element.name === "slot" && context.slotAssignments) {
|
|
247
|
+
const slotName = attr(element, "name") ?? "";
|
|
248
|
+
const assignedChildren = context.slotAssignments.get(slotName) ?? [];
|
|
249
|
+
const projectedChildren = assignedChildren.length > 0 ? assignedChildren : element.children.filter(isElement);
|
|
250
|
+
for (const child of projectedChildren) {
|
|
251
|
+
if (isElement(child)) {
|
|
252
|
+
const semanticChild = walkElement(child, context);
|
|
253
|
+
omitted += appendSemanticChild(element, semanticChild, children, repeatedSignatures, context);
|
|
254
|
+
} else if (context.options.includeTextNodes && isText(child)) {
|
|
255
|
+
const text = normalizeText(child.data, context.options.maxTextLength);
|
|
256
|
+
if (text) {
|
|
257
|
+
children.push({
|
|
258
|
+
id: nextId(context),
|
|
259
|
+
tag: "#text",
|
|
260
|
+
role: "text",
|
|
261
|
+
name: text,
|
|
262
|
+
text,
|
|
263
|
+
interactive: false,
|
|
264
|
+
focusable: false,
|
|
265
|
+
children: []
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
if (omitted > 0) children.push(omittedNode(context, omitted));
|
|
271
|
+
return children;
|
|
272
|
+
}
|
|
196
273
|
for (const child of element.children) {
|
|
197
274
|
if (isElement(child)) {
|
|
198
275
|
if (!context.options.includeSelectOptions && element.name === "select") continue;
|
|
199
276
|
const semanticChild = walkElement(child, context);
|
|
200
|
-
|
|
201
|
-
if (shouldSummarizeRepeatedChild(element, semanticChild, repeatedSignatures, context)) {
|
|
202
|
-
omitted += countSemanticNodes(semanticChild);
|
|
203
|
-
continue;
|
|
204
|
-
}
|
|
205
|
-
if (shouldSummarizeMoreChildren(element, children, context)) {
|
|
206
|
-
omitted += countSemanticNodes(semanticChild);
|
|
207
|
-
} else {
|
|
208
|
-
children.push(semanticChild);
|
|
209
|
-
}
|
|
210
|
-
}
|
|
277
|
+
omitted += appendSemanticChild(element, semanticChild, children, repeatedSignatures, context);
|
|
211
278
|
} else if (context.options.includeTextNodes && isText(child)) {
|
|
212
279
|
const text = normalizeText(child.data, context.options.maxTextLength);
|
|
213
280
|
if (text) {
|
|
@@ -237,12 +304,45 @@ function collectChildren(element, context) {
|
|
|
237
304
|
if (omitted > 0) children.push(omittedNode(context, omitted));
|
|
238
305
|
return children;
|
|
239
306
|
}
|
|
307
|
+
function collectSlotAssignments(host) {
|
|
308
|
+
const assignments = /* @__PURE__ */ new Map();
|
|
309
|
+
for (const child of host.children) {
|
|
310
|
+
if (!isUsefulSlotAssignment(child)) continue;
|
|
311
|
+
const slotName = isElement(child) ? attr(child, "slot") ?? "" : "";
|
|
312
|
+
const assigned = assignments.get(slotName) ?? [];
|
|
313
|
+
assigned.push(child);
|
|
314
|
+
assignments.set(slotName, assigned);
|
|
315
|
+
}
|
|
316
|
+
return assignments;
|
|
317
|
+
}
|
|
318
|
+
function isUsefulSlotAssignment(node) {
|
|
319
|
+
if (isText(node)) return normalizeText(node.data, 120) !== "";
|
|
320
|
+
if (!isElement(node)) return false;
|
|
321
|
+
return !isDeclarativeShadowTemplate(node);
|
|
322
|
+
}
|
|
323
|
+
function appendSemanticChild(parent, child, children, repeatedSignatures, context) {
|
|
324
|
+
if (!child) return 0;
|
|
325
|
+
if (shouldSummarizeRepeatedChild(parent, child, repeatedSignatures, context)) {
|
|
326
|
+
return countSemanticNodes(child);
|
|
327
|
+
}
|
|
328
|
+
if (shouldSummarizeMoreChildren(parent, children, context)) {
|
|
329
|
+
return countSemanticNodes(child);
|
|
330
|
+
}
|
|
331
|
+
children.push(child);
|
|
332
|
+
return 0;
|
|
333
|
+
}
|
|
240
334
|
function shouldSkipElement(element, context) {
|
|
241
335
|
if (context.options.mode === "full") return false;
|
|
336
|
+
if (isDeclarativeShadowTemplate(element)) return false;
|
|
242
337
|
if (nonSemanticTags.has(element.name)) return true;
|
|
243
338
|
if (element.name === "noscript") return true;
|
|
244
339
|
return false;
|
|
245
340
|
}
|
|
341
|
+
function isDeclarativeShadowTemplate(element) {
|
|
342
|
+
if (element.name !== "template") return false;
|
|
343
|
+
const mode = attr(element, "shadowrootmode") ?? attr(element, "shadowroot");
|
|
344
|
+
return mode === "open" || mode === "closed";
|
|
345
|
+
}
|
|
246
346
|
function shouldSummarizeMoreChildren(element, children, context) {
|
|
247
347
|
if (!context.options.summarizeLargeSubtrees || context.options.mode === "full") return false;
|
|
248
348
|
if (!isLargeSubtreeCandidate(element)) return false;
|
|
@@ -393,15 +493,38 @@ function shouldPrune(element, role, name, interactive, children, context) {
|
|
|
393
493
|
if (interactive) return false;
|
|
394
494
|
if (role && role !== "generic") return false;
|
|
395
495
|
if (name) return false;
|
|
496
|
+
if (isReferencedIdTarget(element, context)) return false;
|
|
396
497
|
if (children.length === 0) return true;
|
|
397
498
|
if (attr(element, "id") || attr(element, "aria-label") || attr(element, "aria-labelledby")) return false;
|
|
398
499
|
return children.length > 0;
|
|
399
500
|
}
|
|
501
|
+
function isReferencedIdTarget(element, context) {
|
|
502
|
+
const id = attr(element, "id");
|
|
503
|
+
return Boolean(id && context.referencedIds.has(id));
|
|
504
|
+
}
|
|
400
505
|
function shouldPruneListItemWrapper(role, children, context) {
|
|
401
506
|
if (context.options.mode === "full") return false;
|
|
402
507
|
if (role !== "listitem") return false;
|
|
403
508
|
return children.some((child) => child.role === "link" || child.role === "button");
|
|
404
509
|
}
|
|
510
|
+
function shouldPruneCustomElementWrapper(element, role, name, interactive, children, context) {
|
|
511
|
+
if (context.options.mode === "full") return false;
|
|
512
|
+
if (!isCustomElement(element)) return false;
|
|
513
|
+
if (interactive) return false;
|
|
514
|
+
if (role && role !== "generic") return false;
|
|
515
|
+
if (name) return false;
|
|
516
|
+
if (children.length === 0) return false;
|
|
517
|
+
if (hasUsefulHostSignal(element)) return false;
|
|
518
|
+
return true;
|
|
519
|
+
}
|
|
520
|
+
function isCustomElement(element) {
|
|
521
|
+
return element.name.includes("-");
|
|
522
|
+
}
|
|
523
|
+
function hasUsefulHostSignal(element) {
|
|
524
|
+
return Boolean(
|
|
525
|
+
attr(element, "id") || attr(element, "aria-label") || attr(element, "aria-labelledby") || attr(element, "aria-describedby") || attr(element, "aria-controls") || attr(element, "aria-expanded") || attr(element, "aria-selected") || attr(element, "aria-current") || attr(element, "tabindex")
|
|
526
|
+
);
|
|
527
|
+
}
|
|
405
528
|
function getRole(element) {
|
|
406
529
|
const explicit = firstToken(attr(element, "role"));
|
|
407
530
|
if (explicit) return explicit;
|
|
@@ -416,6 +539,7 @@ function getRole(element) {
|
|
|
416
539
|
if (tag === "dialog") return "dialog";
|
|
417
540
|
if (tag === "figure") return "figure";
|
|
418
541
|
if (tag === "form") return "form";
|
|
542
|
+
if (tag === "iframe") return "iframe";
|
|
419
543
|
if (tag === "img") return "img";
|
|
420
544
|
if (tag === "input") return inputRole(element);
|
|
421
545
|
if (tag === "li") return "listitem";
|
|
@@ -447,7 +571,7 @@ function inputRole(element) {
|
|
|
447
571
|
function computeName(element, role, context) {
|
|
448
572
|
const labelledBy = attr(element, "aria-labelledby");
|
|
449
573
|
if (labelledBy) {
|
|
450
|
-
const value = labelledBy.split(/\s+/).map((id) => context.ids.get(id)).filter((item) => Boolean(item)).map((item) => descendantText(item)).join(" ");
|
|
574
|
+
const value = labelledBy.split(/\s+/).map((id) => context.ids.get(id)).filter((item) => Boolean(item)).map((item) => descendantText(item, context)).join(" ");
|
|
451
575
|
const normalized = normalizeText(value, context.options.maxTextLength);
|
|
452
576
|
if (normalized) return normalized;
|
|
453
577
|
}
|
|
@@ -462,7 +586,7 @@ function computeName(element, role, context) {
|
|
|
462
586
|
if (alt) return alt;
|
|
463
587
|
}
|
|
464
588
|
if (rolesNamedFromContents.has(role)) {
|
|
465
|
-
const contents = normalizeText(descendantText(element), context.options.maxTextLength);
|
|
589
|
+
const contents = normalizeText(descendantText(element, context, { excludeIds: descriptionReferenceIds(element) }), context.options.maxTextLength);
|
|
466
590
|
if (contents) return contents;
|
|
467
591
|
}
|
|
468
592
|
const title = normalizeText(attr(element, "title") ?? "", context.options.maxTextLength);
|
|
@@ -472,11 +596,14 @@ function computeName(element, role, context) {
|
|
|
472
596
|
function labelName(element, context) {
|
|
473
597
|
const id = attr(element, "id");
|
|
474
598
|
if (id) {
|
|
475
|
-
const
|
|
476
|
-
if (
|
|
599
|
+
const label2 = context.labelsByFor.get(id);
|
|
600
|
+
if (label2) {
|
|
601
|
+
const value = normalizeText(descendantText(label2, context), context.options.maxTextLength);
|
|
602
|
+
if (value) return value;
|
|
603
|
+
}
|
|
477
604
|
}
|
|
478
605
|
const label = findClosestLabel(element);
|
|
479
|
-
return label ? normalizeText(descendantText(label), context.options.maxTextLength) : "";
|
|
606
|
+
return label ? normalizeText(descendantText(label, context), context.options.maxTextLength) : "";
|
|
480
607
|
}
|
|
481
608
|
function findClosestLabel(element) {
|
|
482
609
|
let parent = element.parent;
|
|
@@ -496,6 +623,19 @@ function elementValueName(element) {
|
|
|
496
623
|
function getState(element) {
|
|
497
624
|
const state = {};
|
|
498
625
|
if (attr(element, "disabled") !== null || attr(element, "aria-disabled") === "true") state.disabled = true;
|
|
626
|
+
const busy = attr(element, "aria-busy");
|
|
627
|
+
if (busy === "true") state.busy = true;
|
|
628
|
+
if (busy === "false") state.busy = false;
|
|
629
|
+
const multiselectable = attr(element, "aria-multiselectable");
|
|
630
|
+
if (multiselectable === "true") state.multiselectable = true;
|
|
631
|
+
if (multiselectable === "false") state.multiselectable = false;
|
|
632
|
+
const sort = attr(element, "aria-sort");
|
|
633
|
+
if (sort) state.sort = normalizeText(sort, 40);
|
|
634
|
+
const grabbed = attr(element, "aria-grabbed");
|
|
635
|
+
if (grabbed === "true") state.grabbed = true;
|
|
636
|
+
if (grabbed === "false") state.grabbed = false;
|
|
637
|
+
const dropEffect = attr(element, "aria-dropeffect");
|
|
638
|
+
if (dropEffect) state.dropEffect = normalizeText(dropEffect, 80);
|
|
499
639
|
if (attr(element, "required") !== null || attr(element, "aria-required") === "true") state.required = true;
|
|
500
640
|
if (attr(element, "readonly") !== null || attr(element, "aria-readonly") === "true") state.readonly = true;
|
|
501
641
|
const checked = attr(element, "aria-checked") ?? (attr(element, "checked") !== null ? "true" : null);
|
|
@@ -512,8 +652,32 @@ function getState(element) {
|
|
|
512
652
|
if (pressed === "mixed") state.pressed = "mixed";
|
|
513
653
|
const invalid = attr(element, "aria-invalid");
|
|
514
654
|
if (invalid && invalid !== "false") state.invalid = invalid === "true" ? true : invalid;
|
|
655
|
+
const current = attr(element, "aria-current");
|
|
656
|
+
if (current && current !== "false") state.current = current === "true" ? true : current;
|
|
657
|
+
const haspopup = attr(element, "aria-haspopup");
|
|
658
|
+
if (haspopup && haspopup !== "false") state.haspopup = haspopup === "true" ? true : haspopup;
|
|
659
|
+
const controls = attr(element, "aria-controls");
|
|
660
|
+
if (controls) state.controls = normalizeText(controls, 120);
|
|
661
|
+
const live = attr(element, "aria-live");
|
|
662
|
+
if (live) state.live = normalizeText(live, 120);
|
|
663
|
+
if (attr(element, "aria-modal") === "true") state.modal = true;
|
|
664
|
+
const orientation = attr(element, "aria-orientation");
|
|
665
|
+
if (orientation) state.orientation = normalizeText(orientation, 40);
|
|
666
|
+
const valueMin = ariaNumber(attr(element, "aria-valuemin"));
|
|
667
|
+
if (typeof valueMin === "number") state.valueMin = valueMin;
|
|
668
|
+
const valueMax = ariaNumber(attr(element, "aria-valuemax"));
|
|
669
|
+
if (typeof valueMax === "number") state.valueMax = valueMax;
|
|
670
|
+
const valueNow = ariaNumber(attr(element, "aria-valuenow"));
|
|
671
|
+
if (typeof valueNow === "number") state.valueNow = valueNow;
|
|
672
|
+
const valueText = attr(element, "aria-valuetext");
|
|
673
|
+
if (valueText) state.valueText = normalizeText(valueText, 120);
|
|
515
674
|
return state;
|
|
516
675
|
}
|
|
676
|
+
function ariaNumber(value) {
|
|
677
|
+
if (value === null || value.trim() === "") return void 0;
|
|
678
|
+
const parsed = Number(value);
|
|
679
|
+
return Number.isFinite(parsed) ? parsed : void 0;
|
|
680
|
+
}
|
|
517
681
|
function isInteractive(element, role, focusable) {
|
|
518
682
|
if (role && interactiveRoles.has(role)) return true;
|
|
519
683
|
if (focusable) return true;
|
|
@@ -595,6 +759,8 @@ function collectFlattenedBoilerplateItems(element, context) {
|
|
|
595
759
|
xpath: getXPath(child),
|
|
596
760
|
children: []
|
|
597
761
|
};
|
|
762
|
+
const description = computeDescription(child, context);
|
|
763
|
+
if (description) node.description = description;
|
|
598
764
|
const value = getValue(child);
|
|
599
765
|
if (value) node.value = value;
|
|
600
766
|
const state = getState(child);
|
|
@@ -616,28 +782,52 @@ function directText(element, maxLength) {
|
|
|
616
782
|
maxLength
|
|
617
783
|
);
|
|
618
784
|
}
|
|
619
|
-
function descendantText(element) {
|
|
785
|
+
function descendantText(element, context, options = {}) {
|
|
620
786
|
const parts = [];
|
|
621
|
-
|
|
787
|
+
const shadowTemplate = element.children.find((child) => isElement(child) && isDeclarativeShadowTemplate(child));
|
|
788
|
+
if (shadowTemplate && context) {
|
|
789
|
+
const previousAssignments = context.slotAssignments;
|
|
790
|
+
context.slotAssignments = collectSlotAssignments(element);
|
|
791
|
+
collectDescendantText(shadowTemplate.children, parts, context, options);
|
|
792
|
+
context.slotAssignments = previousAssignments;
|
|
793
|
+
return parts.join(" ");
|
|
794
|
+
}
|
|
795
|
+
collectDescendantText(element.children, parts, context, options);
|
|
622
796
|
return parts.join(" ");
|
|
623
797
|
}
|
|
624
|
-
function collectDescendantText(nodes, parts) {
|
|
798
|
+
function collectDescendantText(nodes, parts, context, options = {}) {
|
|
625
799
|
for (const node of nodes) {
|
|
626
800
|
if (isText(node)) {
|
|
627
801
|
parts.push(node.data);
|
|
628
802
|
continue;
|
|
629
803
|
}
|
|
630
804
|
if (!isElement(node)) continue;
|
|
805
|
+
const nodeId = attr(node, "id");
|
|
806
|
+
if (nodeId && options.excludeIds?.has(nodeId)) continue;
|
|
807
|
+
if (node.name === "slot" && context?.slotAssignments) {
|
|
808
|
+
const slotName = attr(node, "name") ?? "";
|
|
809
|
+
const assigned = context.slotAssignments.get(slotName) ?? [];
|
|
810
|
+
collectDescendantText(assigned.length > 0 ? assigned : node.children, parts, context, options);
|
|
811
|
+
continue;
|
|
812
|
+
}
|
|
631
813
|
if (nonSemanticTags.has(node.name) || node.name === "noscript") continue;
|
|
632
|
-
collectDescendantText(node.children, parts);
|
|
814
|
+
collectDescendantText(node.children, parts, context, options);
|
|
633
815
|
}
|
|
634
816
|
}
|
|
635
817
|
function normalizeText(value, maxLength) {
|
|
636
818
|
const normalized = value.replace(/\s+/g, " ").trim();
|
|
637
819
|
return normalized.length > maxLength ? `${normalized.slice(0, maxLength - 1)}...` : normalized;
|
|
638
820
|
}
|
|
821
|
+
function computeDescription(element, context) {
|
|
822
|
+
const describedBy = attr(element, "aria-describedby");
|
|
823
|
+
if (describedBy) {
|
|
824
|
+
const text = describedBy.split(/\s+/).map((id) => context.ids.get(id)).filter((item) => Boolean(item)).map((item) => descendantText(item, context)).filter(Boolean).join(" ");
|
|
825
|
+
if (text) return normalizeText(text, context.options.maxTextLength);
|
|
826
|
+
}
|
|
827
|
+
return normalizeText(attr(element, "title") ?? "", context.options.maxTextLength);
|
|
828
|
+
}
|
|
639
829
|
function getValue(element) {
|
|
640
|
-
return normalizeText(attr(element, "value") ?? "", 240);
|
|
830
|
+
return normalizeText(attr(element, "value") ?? attr(element, "aria-valuetext") ?? attr(element, "aria-valuenow") ?? "", 240);
|
|
641
831
|
}
|
|
642
832
|
function getSelector(element) {
|
|
643
833
|
const id = attr(element, "id");
|
|
@@ -732,4 +922,4 @@ function fragmentRoot(children) {
|
|
|
732
922
|
export {
|
|
733
923
|
extractStaticSemanticTree
|
|
734
924
|
};
|
|
735
|
-
//# sourceMappingURL=chunk-
|
|
925
|
+
//# sourceMappingURL=chunk-ZXTURCRT.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/static.ts"],"sourcesContent":["import { DomUtils, parseDocument } from \"htmlparser2\";\nimport { Element as DomElement } from \"domhandler\";\nimport type { AnyNode, Element, Text } from \"domhandler\";\nimport type { SemanticNode, SemanticNodeState, SemanticTreeOptions } from \"./types\";\n\ntype DescendantTextOptions = {\n excludeIds?: Set<string>;\n};\n\ntype StaticContext = {\n options: Required<Pick<\n SemanticTreeOptions,\n \"excludeLikelyAds\" | \"excludeLikelyBoilerplate\" | \"includeAttributes\" | \"includeHidden\" | \"includeSelectOptions\" | \"includeTextNodes\" | \"maxChildrenPerNode\" | \"maxLinkFarmChildren\" | \"maxRepeatedSubtreeInstances\" | \"maxTextLength\" | \"mode\" | \"pruneCollapsedSubtrees\" | \"pruneLikelyClosedOverlays\" | \"summarizeLargeSubtrees\" | \"summarizeLikelyLinkFarms\" | \"summarizeRepeatedSubtrees\"\n >>;\n nextId: number;\n ids: Map<string, Element>;\n referencedIds: Set<string>;\n collapsedControlledIds: Set<string>;\n labelsByFor: Map<string, Element>;\n slotAssignments: Map<string, AnyNode[]> | undefined;\n};\n\nconst defaultOptions = {\n includeAttributes: true,\n excludeLikelyAds: false,\n includeHidden: false,\n includeSelectOptions: true,\n includeTextNodes: false,\n maxTextLength: 240,\n mode: \"compact\",\n excludeLikelyBoilerplate: false,\n maxChildrenPerNode: 80,\n maxLinkFarmChildren: 24,\n maxRepeatedSubtreeInstances: 3,\n pruneCollapsedSubtrees: true,\n pruneLikelyClosedOverlays: true,\n summarizeLargeSubtrees: true,\n summarizeLikelyLinkFarms: true,\n summarizeRepeatedSubtrees: true,\n} satisfies StaticContext[\"options\"];\n\nconst interactiveRoles = new Set([\n \"button\",\n \"checkbox\",\n \"combobox\",\n \"link\",\n \"listbox\",\n \"menuitem\",\n \"menuitemcheckbox\",\n \"menuitemradio\",\n \"option\",\n \"radio\",\n \"searchbox\",\n \"slider\",\n \"spinbutton\",\n \"switch\",\n \"tab\",\n \"textbox\",\n \"treeitem\",\n]);\n\nconst landmarkTags: Record<string, string> = {\n article: \"article\",\n aside: \"complementary\",\n footer: \"contentinfo\",\n header: \"banner\",\n main: \"main\",\n nav: \"navigation\",\n section: \"region\",\n};\n\nconst rolesNamedFromContents = new Set([\n \"button\",\n \"cell\",\n \"checkbox\",\n \"columnheader\",\n \"heading\",\n \"link\",\n \"listitem\",\n \"menuitem\",\n \"menuitemcheckbox\",\n \"menuitemradio\",\n \"option\",\n \"radio\",\n \"rowheader\",\n \"switch\",\n \"tab\",\n \"treeitem\",\n]);\n\nconst hiddenStylePattern = /(?:^|;)\\s*(display\\s*:\\s*none|visibility\\s*:\\s*hidden|content-visibility\\s*:\\s*hidden|opacity\\s*:\\s*0(?:\\.0+)?)(?:;|$)/i;\nconst nonSemanticTags = new Set([\"head\", \"link\", \"meta\", \"script\", \"style\", \"template\"]);\n\nexport type StaticSemanticTreeOptions = Pick<\n SemanticTreeOptions,\n \"excludeLikelyAds\" | \"excludeLikelyBoilerplate\" | \"includeAttributes\" | \"includeHidden\" | \"includeSelectOptions\" | \"includeTextNodes\" | \"maxChildrenPerNode\" | \"maxLinkFarmChildren\" | \"maxRepeatedSubtreeInstances\" | \"maxTextLength\" | \"mode\" | \"pruneCollapsedSubtrees\" | \"pruneLikelyClosedOverlays\" | \"summarizeLargeSubtrees\" | \"summarizeLikelyLinkFarms\" | \"summarizeRepeatedSubtrees\"\n>;\n\nexport function extractStaticSemanticTree(html: string, options: StaticSemanticTreeOptions = {}): SemanticNode {\n const document = parseDocument(html, {\n lowerCaseAttributeNames: true,\n lowerCaseTags: true,\n recognizeSelfClosing: true,\n });\n const context: StaticContext = {\n options: resolveStaticOptions(document.children, html, options),\n nextId: 1,\n ids: new Map(),\n referencedIds: new Set(),\n collapsedControlledIds: new Set(),\n labelsByFor: new Map(),\n slotAssignments: undefined,\n };\n indexDocument(document.children, context);\n const root = findElement(document.children, \"body\") ?? findElement(document.children, \"html\") ?? fragmentRoot(document.children);\n return walkElement(root, context) ?? unavailableNode(context, \"document\", \"HTML has no inspectable root\");\n}\n\nexport { extractStaticSemanticTree as extract };\n\nfunction resolveStaticOptions(nodes: AnyNode[], html: string, options: StaticSemanticTreeOptions): StaticContext[\"options\"] {\n const inferred = inferStaticSourceProfile(nodes, html);\n const resolved = { ...defaultOptions };\n\n if (inferred.wikiLike) {\n resolved.maxChildrenPerNode = 400;\n resolved.maxLinkFarmChildren = 80;\n }\n if (inferred.forumLike) {\n resolved.maxLinkFarmChildren = 19;\n }\n\n return { ...resolved, ...options };\n}\n\nfunction inferStaticSourceProfile(nodes: AnyNode[], html: string): { wikiLike: boolean; forumLike: boolean } {\n const root = findElement(nodes, \"html\") ?? fragmentRoot(nodes);\n const body = findElement(nodes, \"body\");\n const profileText = [\n attr(root, \"class\"),\n attr(root, \"id\"),\n body ? attr(body, \"class\") : \"\",\n body ? attr(body, \"id\") : \"\",\n firstMetaContent(root, \"generator\"),\n firstMetaContent(root, \"application-name\"),\n firstMetaContent(root, \"twitter:site\"),\n ].filter(Boolean).join(\" \").toLowerCase();\n\n return {\n wikiLike: /\\b(mediawiki|mw-parser-output|wikipedia|wikimedia)\\b/.test(profileText)\n || /\\b(?:id|class)=[\"'][^\"']*\\bmw-parser-output\\b/i.test(html),\n forumLike: /\\b(5ch|2ch|dcinside|ruliweb|clien|bbs|board|forum|gallery|gall|thread|subback)\\b/.test(profileText)\n || /\\b(?:id|class)=[\"'][^\"']*\\b(?:gall_list|threadlist|thread-list|board-list|article-list|subback|bbs|forum)\\b/i.test(html)\n || /(?:갤러리|게시판|댓글|개념글|스레드|レス|話題度)/.test(html),\n };\n}\n\nfunction firstMetaContent(root: Element | undefined, name: string): string {\n /* v8 ignore next -- internal callers pass a fragment fallback when html is absent. */\n if (!root) return \"\";\n const stack = [...root.children];\n while (stack.length > 0) {\n const node = stack.shift();\n /* v8 ignore next -- guarded for noUncheckedIndexedAccess; loop condition prevents this. */\n if (!node) continue;\n if (!isElement(node)) continue;\n if (node.name === \"meta\" && (attr(node, \"name\") === name || attr(node, \"property\") === name)) {\n return attr(node, \"content\") ?? \"\";\n }\n stack.unshift(...node.children);\n }\n return \"\";\n}\n\nfunction indexDocument(nodes: AnyNode[], context: StaticContext): void {\n for (const node of nodes) {\n if (!isElement(node)) continue;\n const id = attr(node, \"id\");\n if (id) context.ids.set(id, node);\n for (const referencedId of referencedIds(node)) {\n context.referencedIds.add(referencedId);\n }\n if (attr(node, \"aria-expanded\") === \"false\") {\n for (const controlledId of (attr(node, \"aria-controls\") ?? \"\").split(/\\s+/)) {\n if (controlledId) context.collapsedControlledIds.add(controlledId);\n }\n }\n if (node.name === \"label\") {\n const target = attr(node, \"for\");\n if (target) context.labelsByFor.set(target, node);\n }\n indexDocument(node.children, context);\n }\n}\n\nfunction referencedIds(element: Element): string[] {\n return [\n attr(element, \"aria-labelledby\"),\n attr(element, \"aria-describedby\"),\n attr(element, \"aria-details\"),\n attr(element, \"aria-errormessage\"),\n attr(element, \"aria-controls\"),\n attr(element, \"aria-owns\"),\n attr(element, \"aria-flowto\"),\n attr(element, \"aria-activedescendant\"),\n ]\n .filter((value): value is string => Boolean(value))\n .flatMap((value) => value.split(/\\s+/).map((item) => item.trim()).filter(Boolean));\n}\n\nfunction descriptionReferenceIds(element: Element): Set<string> {\n return new Set([\n attr(element, \"aria-describedby\"),\n attr(element, \"aria-details\"),\n attr(element, \"aria-errormessage\"),\n ]\n .filter((value): value is string => Boolean(value))\n .flatMap((value) => value.split(/\\s+/).map((item) => item.trim()).filter(Boolean)));\n}\n\nfunction walkElement(element: Element | undefined, context: StaticContext): SemanticNode | null {\n /* v8 ignore next -- public extraction always supplies body/html or a fragment root. */\n if (!element) return null;\n if (shouldSkipElement(element, context)) return null;\n if (!context.options.includeHidden && isHidden(element)) return null;\n if (context.options.excludeLikelyAds && isLikelyAd(element)) return null;\n if (context.options.excludeLikelyBoilerplate && isLikelyBoilerplateTable(element)) return flattenBoilerplateTable(element, context);\n if (context.options.excludeLikelyBoilerplate && isLikelyBoilerplate(element)) return null;\n if (!context.options.includeHidden && isCollapsedControlledElement(element, context)) return null;\n if (!context.options.includeHidden && isLikelyClosedOverlay(element, context)) return null;\n\n const role = getRole(element);\n const state = getState(element);\n const focusable = isFocusable(element, role);\n const interactive = isInteractive(element, role, focusable);\n const name = role ? computeName(element, role, context) : \"\";\n const tag = element.name;\n const children = shouldSkipChildrenForCollapsedElement(element, context) ? [] : collectChildren(element, context);\n if (tag === \"iframe\" && children.length === 0 && attr(element, \"src\") && !attr(element, \"srcdoc\")) {\n children.push(unavailableNode(context, \"iframe\", \"iframe content unavailable in static HTML\"));\n }\n\n if (context.options.mode === \"interactive\" && !interactive) {\n return children.length > 0 ? containerNode(context, tag, children) : null;\n }\n if (shouldPruneCustomElementWrapper(element, role, name, interactive, children, context)) {\n return children.length === 1 ? children[0] ?? null : containerNode(context, \"fragment\", children);\n }\n if (shouldPruneListItemWrapper(role, children, context)) {\n return children.length === 1 ? children[0] ?? null : containerNode(context, tag, children);\n }\n if (shouldPrune(element, role, name, interactive, children, context)) {\n if (children.length === 0) return null;\n return children.length === 1 ? children[0] ?? null : containerNode(context, tag, children);\n }\n\n const node: SemanticNode = {\n id: nextId(context),\n tag,\n role,\n name,\n interactive,\n focusable,\n selector: getSelector(element),\n xpath: getXPath(element),\n children,\n };\n const description = computeDescription(element, context);\n if (description) node.description = description;\n const text = directText(element, context.options.maxTextLength);\n if (text) node.text = text;\n const value = getValue(element);\n if (value) node.value = value;\n if (Object.keys(state).length > 0) node.state = state;\n if (context.options.includeAttributes) node.attributes = { ...element.attribs };\n return node;\n}\n\nfunction collectChildren(element: Element, context: StaticContext): SemanticNode[] {\n const children: SemanticNode[] = [];\n const repeatedSignatures = new Map<string, number>();\n let omitted = 0;\n const shadowTemplate = element.children.find((child): child is Element => isElement(child) && isDeclarativeShadowTemplate(child));\n if (shadowTemplate) {\n const previousAssignments = context.slotAssignments;\n context.slotAssignments = collectSlotAssignments(element);\n for (const child of shadowTemplate.children) {\n if (!isElement(child)) continue;\n const semanticChild = walkElement(child, context);\n omitted += appendSemanticChild(element, semanticChild, children, repeatedSignatures, context);\n }\n context.slotAssignments = previousAssignments;\n const linkFarmSummary = summarizeLikelyLinkFarmChildren(element, children, context);\n if (linkFarmSummary.omitted > 0) {\n children.splice(0, children.length, ...linkFarmSummary.children);\n omitted += linkFarmSummary.omitted;\n }\n if (omitted > 0) children.push(omittedNode(context, omitted));\n return children;\n }\n\n if (element.name === \"slot\" && context.slotAssignments) {\n const slotName = attr(element, \"name\") ?? \"\";\n const assignedChildren = context.slotAssignments.get(slotName) ?? [];\n const projectedChildren = assignedChildren.length > 0 ? assignedChildren : element.children.filter(isElement);\n for (const child of projectedChildren) {\n if (isElement(child)) {\n const semanticChild = walkElement(child, context);\n omitted += appendSemanticChild(element, semanticChild, children, repeatedSignatures, context);\n } else if (context.options.includeTextNodes && isText(child)) {\n const text = normalizeText(child.data, context.options.maxTextLength);\n if (text) {\n children.push({\n id: nextId(context),\n tag: \"#text\",\n role: \"text\",\n name: text,\n text,\n interactive: false,\n focusable: false,\n children: [],\n });\n }\n }\n }\n if (omitted > 0) children.push(omittedNode(context, omitted));\n return children;\n }\n\n for (const child of element.children) {\n if (isElement(child)) {\n if (!context.options.includeSelectOptions && element.name === \"select\") continue;\n const semanticChild = walkElement(child, context);\n omitted += appendSemanticChild(element, semanticChild, children, repeatedSignatures, context);\n } else if (context.options.includeTextNodes && isText(child)) {\n const text = normalizeText(child.data, context.options.maxTextLength);\n if (text) {\n const textNode: SemanticNode = {\n id: nextId(context),\n tag: \"#text\",\n role: \"text\",\n name: text,\n text,\n interactive: false,\n focusable: false,\n children: [],\n };\n if (shouldSummarizeMoreChildren(element, children, context)) {\n omitted += 1;\n } else {\n children.push(textNode);\n }\n }\n }\n }\n const linkFarmSummary = summarizeLikelyLinkFarmChildren(element, children, context);\n if (linkFarmSummary.omitted > 0) {\n children.splice(0, children.length, ...linkFarmSummary.children);\n omitted += linkFarmSummary.omitted;\n }\n if (omitted > 0) children.push(omittedNode(context, omitted));\n return children;\n}\n\nfunction collectSlotAssignments(host: Element): Map<string, AnyNode[]> {\n const assignments = new Map<string, AnyNode[]>();\n for (const child of host.children) {\n if (!isUsefulSlotAssignment(child)) continue;\n const slotName = isElement(child) ? attr(child, \"slot\") ?? \"\" : \"\";\n const assigned = assignments.get(slotName) ?? [];\n assigned.push(child);\n assignments.set(slotName, assigned);\n }\n return assignments;\n}\n\nfunction isUsefulSlotAssignment(node: AnyNode): boolean {\n if (isText(node)) return normalizeText(node.data, 120) !== \"\";\n if (!isElement(node)) return false;\n return !isDeclarativeShadowTemplate(node);\n}\n\nfunction appendSemanticChild(\n parent: Element,\n child: SemanticNode | null,\n children: SemanticNode[],\n repeatedSignatures: Map<string, number>,\n context: StaticContext,\n): number {\n if (!child) return 0;\n if (shouldSummarizeRepeatedChild(parent, child, repeatedSignatures, context)) {\n return countSemanticNodes(child);\n }\n if (shouldSummarizeMoreChildren(parent, children, context)) {\n return countSemanticNodes(child);\n }\n children.push(child);\n return 0;\n}\n\nfunction shouldSkipElement(element: Element, context: StaticContext): boolean {\n if (context.options.mode === \"full\") return false;\n if (isDeclarativeShadowTemplate(element)) return false;\n if (nonSemanticTags.has(element.name)) return true;\n if (element.name === \"noscript\") return true;\n return false;\n}\n\nfunction isDeclarativeShadowTemplate(element: Element): boolean {\n if (element.name !== \"template\") return false;\n const mode = attr(element, \"shadowrootmode\") ?? attr(element, \"shadowroot\");\n return mode === \"open\" || mode === \"closed\";\n}\n\nfunction shouldSummarizeMoreChildren(element: Element, children: SemanticNode[], context: StaticContext): boolean {\n if (!context.options.summarizeLargeSubtrees || context.options.mode === \"full\") return false;\n if (!isLargeSubtreeCandidate(element)) return false;\n return children.length >= context.options.maxChildrenPerNode;\n}\n\nfunction isLargeSubtreeCandidate(element: Element): boolean {\n return [\"nav\", \"ul\", \"ol\", \"div\", \"section\", \"footer\", \"header\", \"main\"].includes(element.name);\n}\n\nfunction summarizeLikelyLinkFarmChildren(\n element: Element,\n children: SemanticNode[],\n context: StaticContext,\n): { children: SemanticNode[]; omitted: number } {\n if (!context.options.summarizeLikelyLinkFarms || context.options.mode === \"full\") return { children, omitted: 0 };\n if (children.length <= context.options.maxLinkFarmChildren) return { children, omitted: 0 };\n if (!isLikelyLinkFarmContainer(element)) return { children, omitted: 0 };\n const stats = childLinkFarmStats(children);\n if (stats.linkishChildren < Math.max(8, Math.floor(children.length * 0.65))) return { children, omitted: 0 };\n if (stats.contentRichChildren > Math.max(2, Math.floor(children.length * 0.2))) return { children, omitted: 0 };\n\n const kept: SemanticNode[] = [];\n let omitted = 0;\n let keptLinkish = 0;\n for (const child of children) {\n /* v8 ignore next 4 -- covered by link-farm tests, but V8 maps this continue branch unreliably through TS output. */\n if (!isLinkishSummaryChild(child)) {\n kept.push(child);\n continue;\n }\n if (keptLinkish < context.options.maxLinkFarmChildren) {\n kept.push(child);\n keptLinkish += 1;\n } else {\n omitted += countSemanticNodes(child);\n }\n }\n return omitted > 0 ? { children: kept, omitted } : { children, omitted: 0 };\n}\n\nfunction isLikelyLinkFarmContainer(element: Element): boolean {\n if ([\"nav\", \"ul\", \"ol\", \"aside\", \"footer\", \"header\"].includes(element.name)) return true;\n if (![\"div\", \"section\"].includes(element.name)) return false;\n const value = [\n attr(element, \"id\"),\n attr(element, \"class\"),\n attr(element, \"role\"),\n attr(element, \"aria-label\"),\n attr(element, \"title\"),\n ].filter(Boolean).join(\" \").toLowerCase();\n if (/\\b(article|body|content|contents|entry|main|post|story|text|view)\\b/.test(value)) return false;\n return /\\b(board|category|comment|footer|gallery|gnb|header|issue|list|menu|nav|popular|recent|recommend|related|reply|sidebar|tab)\\b/.test(value)\n || /갤러리|댓글|개념글|관련|목록|베스트|인기|최근|추천|카테고리/.test(value);\n}\n\nfunction childLinkFarmStats(children: SemanticNode[]): { linkishChildren: number; contentRichChildren: number } {\n let linkishChildren = 0;\n let contentRichChildren = 0;\n for (const child of children) {\n if (isLinkishSummaryChild(child)) linkishChildren += 1;\n if (isContentRichSummaryChild(child)) contentRichChildren += 1;\n }\n return { linkishChildren, contentRichChildren };\n}\n\nfunction isLinkishSummaryChild(node: SemanticNode): boolean {\n const stats = semanticRoleStats(node);\n return stats.links > 0\n && stats.formControls === 0\n && stats.tables === 0\n && stats.paragraphs <= 1\n && stats.contentContainers === 0;\n}\n\nfunction isContentRichSummaryChild(node: SemanticNode): boolean {\n const stats = semanticRoleStats(node);\n return stats.paragraphs > 1 || stats.tables > 0 || stats.contentContainers > 0 || stats.formControls > 0;\n}\n\nfunction semanticRoleStats(node: SemanticNode): {\n links: number;\n paragraphs: number;\n tables: number;\n formControls: number;\n contentContainers: number;\n} {\n const role = node.role ?? node.tag;\n const stats = {\n links: role === \"link\" ? 1 : 0,\n paragraphs: role === \"p\" || role === \"text\" ? 1 : 0,\n tables: role === \"table\" || role === \"row\" || role === \"cell\" ? 1 : 0,\n formControls: role === \"textbox\" || role === \"searchbox\" || role === \"combobox\" || role === \"listbox\" || role === \"checkbox\" || role === \"radio\" || role === \"slider\" || role === \"spinbutton\" || role === \"switch\" ? 1 : 0,\n contentContainers: role === \"article\" || role === \"main\" ? 1 : 0,\n };\n for (const child of node.children) {\n const childStats = semanticRoleStats(child);\n stats.links += childStats.links;\n stats.paragraphs += childStats.paragraphs;\n stats.tables += childStats.tables;\n stats.formControls += childStats.formControls;\n stats.contentContainers += childStats.contentContainers;\n }\n return stats;\n}\n\nfunction shouldSummarizeRepeatedChild(\n parent: Element,\n child: SemanticNode,\n signatures: Map<string, number>,\n context: StaticContext,\n): boolean {\n if (!context.options.summarizeRepeatedSubtrees || context.options.mode === \"full\") return false;\n if (!isRepeatedSubtreeCandidate(parent)) return false;\n const signature = semanticSignature(child);\n const count = signatures.get(signature) ?? 0;\n signatures.set(signature, count + 1);\n return count >= context.options.maxRepeatedSubtreeInstances;\n}\n\nfunction isRepeatedSubtreeCandidate(element: Element): boolean {\n return [\"body\", \"main\", \"nav\", \"ul\", \"ol\", \"div\", \"section\", \"footer\", \"header\", \"aside\"].includes(element.name);\n}\n\nfunction semanticSignature(node: SemanticNode): string {\n const childSignatures = node.children.map(semanticSignature).join(\",\");\n return `${node.tag}|${node.role ?? \"\"}|${node.name}|${node.text ?? \"\"}|${node.value ?? \"\"}|${node.interactive ? \"i\" : \"\"}[${childSignatures}]`;\n}\n\nfunction countSemanticNodes(node: SemanticNode): number {\n let count = 1;\n for (const child of node.children) count += countSemanticNodes(child);\n return count;\n}\n\nfunction shouldSkipChildrenForCollapsedElement(element: Element, context: StaticContext): boolean {\n if (!context.options.pruneCollapsedSubtrees || context.options.includeHidden) return false;\n if (attr(element, \"aria-expanded\") === \"false\") return true;\n if (element.name === \"details\" && attr(element, \"open\") === null) return true;\n if (element.name === \"dialog\" && attr(element, \"open\") === null) return true;\n if (attr(element, \"popover\") !== null && attr(element, \"open\") === null) return true;\n return false;\n}\n\nfunction isCollapsedControlledElement(element: Element, context: StaticContext): boolean {\n const id = attr(element, \"id\");\n return Boolean(id && context.options.pruneCollapsedSubtrees && context.collapsedControlledIds.has(id));\n}\n\nfunction isLikelyClosedOverlay(element: Element, context: StaticContext): boolean {\n if (!context.options.pruneLikelyClosedOverlays || context.options.mode === \"full\") return false;\n if (hasUsefulOpenSignal(element)) return false;\n if (!hasOverlaySignal(element)) return false;\n if (hasDirectFocusableIntent(element)) return false;\n return hasOffscreenOrClosedStyle(element) || hasClosedClassSignal(element) || hasInertSignal(element);\n}\n\nfunction hasUsefulOpenSignal(element: Element): boolean {\n return attr(element, \"open\") !== null\n || attr(element, \"aria-expanded\") === \"true\"\n || attr(element, \"aria-modal\") === \"true\"\n || attr(element, \"data-open\") === \"true\"\n || attr(element, \"data-state\") === \"open\";\n}\n\nfunction hasOverlaySignal(element: Element): boolean {\n const value = [element.name, attr(element, \"id\"), attr(element, \"class\"), attr(element, \"role\"), attr(element, \"aria-label\")]\n .filter(Boolean)\n .join(\" \")\n .toLowerCase();\n return /\\b(drawer|modal|dialog|popover|overlay|hamburger|menu|sidebar|sheet|flyout|dropdown)\\b/.test(value);\n}\n\nfunction hasDirectFocusableIntent(element: Element): boolean {\n const tabindex = attr(element, \"tabindex\");\n return tabindex !== null && Number(tabindex) >= 0;\n}\n\nfunction hasInertSignal(element: Element): boolean {\n return attr(element, \"inert\") !== null || attr(element, \"aria-hidden\") === \"true\";\n}\n\nfunction hasClosedClassSignal(element: Element): boolean {\n const className = attr(element, \"class\") ?? \"\";\n return /\\b(closed|collapsed|hidden|inactive|is-closed|is-hidden)\\b/i.test(className);\n}\n\nfunction hasOffscreenOrClosedStyle(element: Element): boolean {\n const style = attr(element, \"style\") ?? \"\";\n if (!style) return false;\n const normalized = style.replace(/\\s+/g, \"\").toLowerCase();\n return /(?:^|;)(?:left|right|top|bottom):-\\d{2,}(?:px|rem|em|vw|vh|%)/.test(normalized)\n || /(?:^|;)transform:translate[xy]?\\(-[1-9]\\d*%/.test(normalized)\n || /(?:^|;)(?:max-height|height):0(?:px|rem|em|%)?/.test(normalized)\n || /(?:^|;)pointer-events:none/.test(normalized);\n}\n\nfunction shouldPrune(\n element: Element,\n role: string | null,\n name: string,\n interactive: boolean,\n children: SemanticNode[],\n context: StaticContext,\n): boolean {\n if (context.options.mode === \"full\") return false;\n if (role === \"none\" || role === \"presentation\") return true;\n if (interactive) return false;\n if (role && role !== \"generic\") return false;\n if (name) return false;\n if (isReferencedIdTarget(element, context)) return false;\n if (children.length === 0) return true;\n if (attr(element, \"id\") || attr(element, \"aria-label\") || attr(element, \"aria-labelledby\")) return false;\n return children.length > 0;\n}\n\nfunction isReferencedIdTarget(element: Element, context: StaticContext): boolean {\n const id = attr(element, \"id\");\n return Boolean(id && context.referencedIds.has(id));\n}\n\nfunction shouldPruneListItemWrapper(role: string | null, children: SemanticNode[], context: StaticContext): boolean {\n if (context.options.mode === \"full\") return false;\n if (role !== \"listitem\") return false;\n return children.some((child) => child.role === \"link\" || child.role === \"button\");\n}\n\nfunction shouldPruneCustomElementWrapper(\n element: Element,\n role: string | null,\n name: string,\n interactive: boolean,\n children: SemanticNode[],\n context: StaticContext,\n): boolean {\n if (context.options.mode === \"full\") return false;\n if (!isCustomElement(element)) return false;\n if (interactive) return false;\n if (role && role !== \"generic\") return false;\n if (name) return false;\n if (children.length === 0) return false;\n if (hasUsefulHostSignal(element)) return false;\n return true;\n}\n\nfunction isCustomElement(element: Element): boolean {\n return element.name.includes(\"-\");\n}\n\nfunction hasUsefulHostSignal(element: Element): boolean {\n return Boolean(\n attr(element, \"id\")\n || attr(element, \"aria-label\")\n || attr(element, \"aria-labelledby\")\n || attr(element, \"aria-describedby\")\n || attr(element, \"aria-controls\")\n || attr(element, \"aria-expanded\")\n || attr(element, \"aria-selected\")\n || attr(element, \"aria-current\")\n || attr(element, \"tabindex\")\n );\n}\n\nfunction getRole(element: Element): string | null {\n const explicit = firstToken(attr(element, \"role\"));\n if (explicit) return explicit;\n const tag = element.name;\n if (tag === \"section\" && !hasExplicitNameSource(element)) return null;\n if (tag === \"form\" && !hasExplicitNameSource(element)) return null;\n if (tag in landmarkTags) return landmarkTags[tag] ?? null;\n if (/^h[1-6]$/.test(tag)) return \"heading\";\n if (tag === \"a\" || tag === \"area\") return attr(element, \"href\") ? \"link\" : null;\n if (tag === \"button\") return \"button\";\n if (tag === \"details\" || tag === \"fieldset\") return \"group\";\n if (tag === \"dialog\") return \"dialog\";\n if (tag === \"figure\") return \"figure\";\n if (tag === \"form\") return \"form\";\n if (tag === \"iframe\") return \"iframe\";\n if (tag === \"img\") return \"img\";\n if (tag === \"input\") return inputRole(element);\n if (tag === \"li\") return \"listitem\";\n if (tag === \"ol\" || tag === \"ul\") return \"list\";\n if (tag === \"option\") return \"option\";\n if (tag === \"p\") return \"p\";\n if (tag === \"progress\") return \"progressbar\";\n if (tag === \"select\") return attr(element, \"multiple\") !== null ? \"listbox\" : \"combobox\";\n if (tag === \"summary\") return \"button\";\n if (tag === \"table\") return \"table\";\n if (tag === \"td\") return \"cell\";\n if (tag === \"textarea\") return \"textbox\";\n if (tag === \"th\") return attr(element, \"scope\") === \"row\" ? \"rowheader\" : \"columnheader\";\n if (tag === \"tr\") return \"row\";\n return null;\n}\n\nfunction inputRole(element: Element): string | null {\n const type = (attr(element, \"type\") ?? \"text\").toLowerCase();\n if (type === \"hidden\") return null;\n if (type === \"button\" || type === \"submit\" || type === \"reset\") return \"button\";\n if (type === \"checkbox\") return \"checkbox\";\n if (type === \"image\") return \"button\";\n if (type === \"radio\") return \"radio\";\n if (type === \"range\") return \"slider\";\n if (type === \"search\") return \"searchbox\";\n if (type === \"number\") return \"spinbutton\";\n return \"textbox\";\n}\n\nfunction computeName(element: Element, role: string, context: StaticContext): string {\n const labelledBy = attr(element, \"aria-labelledby\");\n if (labelledBy) {\n const value = labelledBy\n .split(/\\s+/)\n .map((id) => context.ids.get(id))\n .filter((item): item is Element => Boolean(item))\n .map((item) => descendantText(item, context))\n .join(\" \");\n const normalized = normalizeText(value, context.options.maxTextLength);\n if (normalized) return normalized;\n }\n\n const ariaLabel = normalizeText(attr(element, \"aria-label\") ?? \"\", context.options.maxTextLength);\n if (ariaLabel) return ariaLabel;\n\n const labelled = labelName(element, context);\n if (labelled) return labelled;\n\n const valueName = elementValueName(element);\n if (valueName) return normalizeText(valueName, context.options.maxTextLength);\n\n if (role === \"img\") {\n const alt = normalizeText(attr(element, \"alt\") ?? \"\", context.options.maxTextLength);\n if (alt) return alt;\n }\n\n if (rolesNamedFromContents.has(role)) {\n const contents = normalizeText(descendantText(element, context, { excludeIds: descriptionReferenceIds(element) }), context.options.maxTextLength);\n if (contents) return contents;\n }\n\n const title = normalizeText(attr(element, \"title\") ?? \"\", context.options.maxTextLength);\n if (title) return title;\n\n return \"\";\n}\n\nfunction labelName(element: Element, context: StaticContext): string {\n const id = attr(element, \"id\");\n if (id) {\n const label = context.labelsByFor.get(id);\n if (label) {\n const value = normalizeText(descendantText(label, context), context.options.maxTextLength);\n if (value) return value;\n }\n }\n const label = findClosestLabel(element);\n return label ? normalizeText(descendantText(label, context), context.options.maxTextLength) : \"\";\n}\n\nfunction findClosestLabel(element: Element): Element | null {\n let parent = element.parent;\n while (parent) {\n if (isElement(parent) && parent.name === \"label\") return parent;\n parent = parent.parent;\n }\n return null;\n}\n\nfunction elementValueName(element: Element): string {\n if (element.name === \"input\") {\n const type = (attr(element, \"type\") ?? \"text\").toLowerCase();\n if (type === \"button\" || type === \"submit\" || type === \"reset\") return attr(element, \"value\") ?? \"\";\n }\n return \"\";\n}\n\nfunction getState(element: Element): SemanticNodeState {\n const state: SemanticNodeState = {};\n if (attr(element, \"disabled\") !== null || attr(element, \"aria-disabled\") === \"true\") state.disabled = true;\n const busy = attr(element, \"aria-busy\");\n if (busy === \"true\") state.busy = true;\n if (busy === \"false\") state.busy = false;\n const multiselectable = attr(element, \"aria-multiselectable\");\n if (multiselectable === \"true\") state.multiselectable = true;\n if (multiselectable === \"false\") state.multiselectable = false;\n const sort = attr(element, \"aria-sort\");\n if (sort) state.sort = normalizeText(sort, 40);\n const grabbed = attr(element, \"aria-grabbed\");\n if (grabbed === \"true\") state.grabbed = true;\n if (grabbed === \"false\") state.grabbed = false;\n const dropEffect = attr(element, \"aria-dropeffect\");\n if (dropEffect) state.dropEffect = normalizeText(dropEffect, 80);\n if (attr(element, \"required\") !== null || attr(element, \"aria-required\") === \"true\") state.required = true;\n if (attr(element, \"readonly\") !== null || attr(element, \"aria-readonly\") === \"true\") state.readonly = true;\n const checked = attr(element, \"aria-checked\") ?? (attr(element, \"checked\") !== null ? \"true\" : null);\n if (checked === \"true\") state.checked = true;\n if (checked === \"false\") state.checked = false;\n if (checked === \"mixed\") state.checked = \"mixed\";\n if (attr(element, \"selected\") !== null || attr(element, \"aria-selected\") === \"true\") state.selected = true;\n const expanded = attr(element, \"aria-expanded\");\n if (expanded === \"true\") state.expanded = true;\n if (expanded === \"false\") state.expanded = false;\n const pressed = attr(element, \"aria-pressed\");\n if (pressed === \"true\") state.pressed = true;\n if (pressed === \"false\") state.pressed = false;\n if (pressed === \"mixed\") state.pressed = \"mixed\";\n const invalid = attr(element, \"aria-invalid\");\n if (invalid && invalid !== \"false\") state.invalid = invalid === \"true\" ? true : invalid;\n const current = attr(element, \"aria-current\");\n if (current && current !== \"false\") state.current = current === \"true\" ? true : current;\n const haspopup = attr(element, \"aria-haspopup\");\n if (haspopup && haspopup !== \"false\") state.haspopup = haspopup === \"true\" ? true : haspopup;\n const controls = attr(element, \"aria-controls\");\n if (controls) state.controls = normalizeText(controls, 120);\n const live = attr(element, \"aria-live\");\n if (live) state.live = normalizeText(live, 120);\n if (attr(element, \"aria-modal\") === \"true\") state.modal = true;\n const orientation = attr(element, \"aria-orientation\");\n if (orientation) state.orientation = normalizeText(orientation, 40);\n const valueMin = ariaNumber(attr(element, \"aria-valuemin\"));\n if (typeof valueMin === \"number\") state.valueMin = valueMin;\n const valueMax = ariaNumber(attr(element, \"aria-valuemax\"));\n if (typeof valueMax === \"number\") state.valueMax = valueMax;\n const valueNow = ariaNumber(attr(element, \"aria-valuenow\"));\n if (typeof valueNow === \"number\") state.valueNow = valueNow;\n const valueText = attr(element, \"aria-valuetext\");\n if (valueText) state.valueText = normalizeText(valueText, 120);\n return state;\n}\n\nfunction ariaNumber(value: string | null): number | undefined {\n if (value === null || value.trim() === \"\") return undefined;\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : undefined;\n}\n\nfunction isInteractive(element: Element, role: string | null, focusable: boolean): boolean {\n if (role && interactiveRoles.has(role)) return true;\n if (focusable) return true;\n return [\"button\", \"input\", \"select\", \"textarea\"].includes(element.name);\n}\n\nfunction isFocusable(element: Element, role: string | null): boolean {\n if (attr(element, \"disabled\") !== null) return false;\n const tabindex = attr(element, \"tabindex\");\n if (tabindex !== null && Number(tabindex) >= 0) return true;\n if (role && interactiveRoles.has(role)) return true;\n return element.name === \"a\" && attr(element, \"href\") !== null;\n}\n\nfunction isHidden(element: Element): boolean {\n if (attr(element, \"hidden\") !== null) return true;\n if (attr(element, \"aria-hidden\") === \"true\") return true;\n const style = attr(element, \"style\");\n return style ? hiddenStylePattern.test(style) : false;\n}\n\nfunction isLikelyAd(element: Element): boolean {\n const value = [\n attr(element, \"id\"),\n attr(element, \"class\"),\n attr(element, \"aria-label\"),\n attr(element, \"title\"),\n attr(element, \"data-testid\"),\n ].filter(Boolean).join(\" \").toLowerCase();\n return /\\b(ad|ads|advert|advertisement|banner|sponsor|sponsored|promotion|promoted|powerlink)\\b/.test(value)\n || /파워링크|광고|직접홍보|홍보/.test(value);\n}\n\nfunction isLikelyBoilerplate(element: Element): boolean {\n if (element.name === \"footer\") return true;\n if (element.name === \"main\" || element.name === \"article\") return false;\n const role = firstToken(attr(element, \"role\"));\n if (role === \"main\" || role === \"article\") return false;\n const value = [\n attr(element, \"id\"),\n attr(element, \"class\"),\n attr(element, \"aria-label\"),\n attr(element, \"title\"),\n ].filter(Boolean).join(\" \").toLowerCase();\n if (!value) return false;\n if (/\\b(content|contents|entry|post-body|article-body|story-body|view-content)\\b/.test(value)) return false;\n return /\\b(footer|sidebar)\\b/.test(value) || /푸터/.test(value);\n}\n\nfunction isLikelyBoilerplateTable(element: Element): boolean {\n if (element.name !== \"table\") return false;\n const value = [\n attr(element, \"id\"),\n attr(element, \"class\"),\n attr(element, \"aria-label\"),\n attr(element, \"title\"),\n ].filter(Boolean).join(\" \").toLowerCase();\n return /\\bgall[_-]?list\\b/.test(value) || /\\bbottom[_-]?list\\w*\\b/.test(value);\n}\n\nfunction flattenBoilerplateTable(element: Element, context: StaticContext): SemanticNode | null {\n const children = collectFlattenedBoilerplateItems(element, context);\n if (children.length === 0) return null;\n return containerNode(context, element.name, children);\n}\n\nfunction collectFlattenedBoilerplateItems(element: Element, context: StaticContext): SemanticNode[] {\n const children: SemanticNode[] = [];\n for (const child of element.children) {\n if (!isElement(child)) continue;\n if (shouldSkipElement(child, context)) continue;\n if (!context.options.includeHidden && isHidden(child)) continue;\n if (context.options.excludeLikelyAds && isLikelyAd(child)) continue;\n const role = getRole(child);\n const focusable = isFocusable(child, role);\n const interactive = isInteractive(child, role, focusable);\n const name = role ? computeName(child, role, context) : \"\";\n if (role && name && (interactive || role === \"heading\" || role === \"img\")) {\n const node: SemanticNode = {\n id: nextId(context),\n tag: child.name,\n role,\n name,\n interactive,\n focusable,\n selector: getSelector(child),\n xpath: getXPath(child),\n children: [],\n };\n const description = computeDescription(child, context);\n if (description) node.description = description;\n const value = getValue(child);\n if (value) node.value = value;\n const state = getState(child);\n if (Object.keys(state).length > 0) node.state = state;\n if (context.options.includeAttributes) node.attributes = { ...child.attribs };\n children.push(node);\n continue;\n }\n children.push(...collectFlattenedBoilerplateItems(child, context));\n }\n return children;\n}\n\nfunction hasExplicitNameSource(element: Element): boolean {\n return attr(element, \"aria-label\") !== null || attr(element, \"aria-labelledby\") !== null || attr(element, \"title\") !== null;\n}\n\nfunction directText(element: Element, maxLength: number): string {\n return normalizeText(\n element.children\n .filter(isText)\n .map((node) => node.data)\n .join(\" \"),\n maxLength,\n );\n}\n\nfunction descendantText(element: Element, context?: StaticContext, options: DescendantTextOptions = {}): string {\n const parts: string[] = [];\n const shadowTemplate = element.children.find((child): child is Element => isElement(child) && isDeclarativeShadowTemplate(child));\n if (shadowTemplate && context) {\n const previousAssignments = context.slotAssignments;\n context.slotAssignments = collectSlotAssignments(element);\n collectDescendantText(shadowTemplate.children, parts, context, options);\n context.slotAssignments = previousAssignments;\n return parts.join(\" \");\n }\n collectDescendantText(element.children, parts, context, options);\n return parts.join(\" \");\n}\n\nfunction collectDescendantText(nodes: AnyNode[], parts: string[], context?: StaticContext, options: DescendantTextOptions = {}): void {\n for (const node of nodes) {\n if (isText(node)) {\n parts.push(node.data);\n continue;\n }\n if (!isElement(node)) continue;\n const nodeId = attr(node, \"id\");\n if (nodeId && options.excludeIds?.has(nodeId)) continue;\n if (node.name === \"slot\" && context?.slotAssignments) {\n const slotName = attr(node, \"name\") ?? \"\";\n const assigned = context.slotAssignments.get(slotName) ?? [];\n collectDescendantText(assigned.length > 0 ? assigned : node.children, parts, context, options);\n continue;\n }\n if (nonSemanticTags.has(node.name) || node.name === \"noscript\") continue;\n collectDescendantText(node.children, parts, context, options);\n }\n}\n\nfunction normalizeText(value: string, maxLength: number): string {\n const normalized = value.replace(/\\s+/g, \" \").trim();\n return normalized.length > maxLength ? `${normalized.slice(0, maxLength - 1)}...` : normalized;\n}\n\nfunction computeDescription(element: Element, context: StaticContext): string {\n const describedBy = attr(element, \"aria-describedby\");\n if (describedBy) {\n const text = describedBy\n .split(/\\s+/)\n .map((id) => context.ids.get(id))\n .filter((item): item is Element => Boolean(item))\n .map((item) => descendantText(item, context))\n .filter(Boolean)\n .join(\" \");\n if (text) return normalizeText(text, context.options.maxTextLength);\n }\n return normalizeText(attr(element, \"title\") ?? \"\", context.options.maxTextLength);\n}\n\nfunction getValue(element: Element): string {\n return normalizeText(attr(element, \"value\") ?? attr(element, \"aria-valuetext\") ?? attr(element, \"aria-valuenow\") ?? \"\", 240);\n}\n\nfunction getSelector(element: Element): string {\n const id = attr(element, \"id\");\n if (id) return `#${cssEscape(id)}`;\n const parent = element.parent;\n if (!parent || !(\"children\" in parent)) return element.name;\n const siblings = parent.children.filter((node): node is Element => isElement(node) && node.name === element.name);\n const index = siblings.indexOf(element);\n return index > 0 ? `${element.name}:nth-of-type(${index + 1})` : element.name;\n}\n\nfunction getXPath(element: Element): string {\n const parts: string[] = [];\n let current: Element | null = element;\n while (current) {\n const parent: AnyNode | null = current.parent;\n /* v8 ignore next 4 -- htmlparser2 assigns parents for nodes returned by the public extract API. */\n if (!parent || !(\"children\" in parent)) {\n parts.unshift(current.name);\n break;\n }\n const siblings = parent.children.filter((node): node is Element => isElement(node) && node.name === current?.name);\n const index = siblings.indexOf(current) + 1;\n parts.unshift(`${current.name}[${index}]`);\n current = isElement(parent) ? parent : null;\n }\n return `/${parts.join(\"/\")}`;\n}\n\nfunction containerNode(context: StaticContext, tag: string, children: SemanticNode[]): SemanticNode {\n return {\n id: nextId(context),\n tag,\n role: null,\n name: \"\",\n interactive: false,\n focusable: false,\n children,\n };\n}\n\n/* v8 ignore start -- defensive fallback for impossible parser roots. */\nfunction unavailableNode(context: StaticContext, tag: string, unavailableReason: string): SemanticNode {\n return {\n id: nextId(context),\n tag,\n role: null,\n name: \"\",\n interactive: false,\n focusable: false,\n children: [],\n unavailableReason,\n };\n}\n/* v8 ignore stop */\n\nfunction omittedNode(context: StaticContext, omitted: number): SemanticNode {\n return {\n id: nextId(context),\n tag: \"omitted\",\n role: \"note\",\n name: `${omitted} static nodes omitted`,\n interactive: false,\n focusable: false,\n children: [],\n };\n}\n\nfunction nextId(context: StaticContext): string {\n return `static-${context.nextId++}`;\n}\n\nfunction attr(element: Element, name: string): string | null {\n return Object.prototype.hasOwnProperty.call(element.attribs, name) ? element.attribs[name] ?? \"\" : null;\n}\n\nfunction firstToken(value: string | null): string | null {\n return value?.trim().split(/\\s+/)[0] || null;\n}\n\nfunction cssEscape(value: string): string {\n return value.replace(/[^a-zA-Z0-9_-]/g, (char) => `\\\\${char}`);\n}\n\nfunction isElement(node: AnyNode): node is Element {\n return node.type === \"tag\" || node.type === \"script\" || node.type === \"style\";\n}\n\nfunction isText(node: AnyNode): node is Text {\n return node.type === \"text\";\n}\n\nfunction findElement(nodes: AnyNode[], name: string): Element | undefined {\n for (const node of nodes) {\n if (!isElement(node)) continue;\n if (node.name === name) return node;\n const child = findElement(node.children, name);\n if (child) return child;\n }\n return undefined;\n}\n\nfunction fragmentRoot(children: AnyNode[]): Element {\n return new DomElement(\"fragment\", {}, children);\n}\n"],"mappings":";AAAA,SAAmB,qBAAqB;AACxC,SAAS,WAAW,kBAAkB;AAqBtC,IAAM,iBAAiB;AAAA,EACrB,mBAAmB;AAAA,EACnB,kBAAkB;AAAA,EAClB,eAAe;AAAA,EACf,sBAAsB;AAAA,EACtB,kBAAkB;AAAA,EAClB,eAAe;AAAA,EACf,MAAM;AAAA,EACN,0BAA0B;AAAA,EAC1B,oBAAoB;AAAA,EACpB,qBAAqB;AAAA,EACrB,6BAA6B;AAAA,EAC7B,wBAAwB;AAAA,EACxB,2BAA2B;AAAA,EAC3B,wBAAwB;AAAA,EACxB,0BAA0B;AAAA,EAC1B,2BAA2B;AAC7B;AAEA,IAAM,mBAAmB,oBAAI,IAAI;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,eAAuC;AAAA,EAC3C,SAAS;AAAA,EACT,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,KAAK;AAAA,EACL,SAAS;AACX;AAEA,IAAM,yBAAyB,oBAAI,IAAI;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,qBAAqB;AAC3B,IAAM,kBAAkB,oBAAI,IAAI,CAAC,QAAQ,QAAQ,QAAQ,UAAU,SAAS,UAAU,CAAC;AAOhF,SAAS,0BAA0B,MAAc,UAAqC,CAAC,GAAiB;AAC7G,QAAM,WAAW,cAAc,MAAM;AAAA,IACnC,yBAAyB;AAAA,IACzB,eAAe;AAAA,IACf,sBAAsB;AAAA,EACxB,CAAC;AACD,QAAM,UAAyB;AAAA,IAC7B,SAAS,qBAAqB,SAAS,UAAU,MAAM,OAAO;AAAA,IAC9D,QAAQ;AAAA,IACR,KAAK,oBAAI,IAAI;AAAA,IACb,eAAe,oBAAI,IAAI;AAAA,IACvB,wBAAwB,oBAAI,IAAI;AAAA,IAChC,aAAa,oBAAI,IAAI;AAAA,IACrB,iBAAiB;AAAA,EACnB;AACA,gBAAc,SAAS,UAAU,OAAO;AACxC,QAAM,OAAO,YAAY,SAAS,UAAU,MAAM,KAAK,YAAY,SAAS,UAAU,MAAM,KAAK,aAAa,SAAS,QAAQ;AAC/H,SAAO,YAAY,MAAM,OAAO,KAAK,gBAAgB,SAAS,YAAY,8BAA8B;AAC1G;AAIA,SAAS,qBAAqB,OAAkB,MAAc,SAA8D;AAC1H,QAAM,WAAW,yBAAyB,OAAO,IAAI;AACrD,QAAM,WAAW,EAAE,GAAG,eAAe;AAErC,MAAI,SAAS,UAAU;AACrB,aAAS,qBAAqB;AAC9B,aAAS,sBAAsB;AAAA,EACjC;AACA,MAAI,SAAS,WAAW;AACtB,aAAS,sBAAsB;AAAA,EACjC;AAEA,SAAO,EAAE,GAAG,UAAU,GAAG,QAAQ;AACnC;AAEA,SAAS,yBAAyB,OAAkB,MAAyD;AAC3G,QAAM,OAAO,YAAY,OAAO,MAAM,KAAK,aAAa,KAAK;AAC7D,QAAM,OAAO,YAAY,OAAO,MAAM;AACtC,QAAM,cAAc;AAAA,IAClB,KAAK,MAAM,OAAO;AAAA,IAClB,KAAK,MAAM,IAAI;AAAA,IACf,OAAO,KAAK,MAAM,OAAO,IAAI;AAAA,IAC7B,OAAO,KAAK,MAAM,IAAI,IAAI;AAAA,IAC1B,iBAAiB,MAAM,WAAW;AAAA,IAClC,iBAAiB,MAAM,kBAAkB;AAAA,IACzC,iBAAiB,MAAM,cAAc;AAAA,EACvC,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,EAAE,YAAY;AAExC,SAAO;AAAA,IACL,UAAU,uDAAuD,KAAK,WAAW,KAC5E,iDAAiD,KAAK,IAAI;AAAA,IAC/D,WAAW,mFAAmF,KAAK,WAAW,KACzG,+GAA+G,KAAK,IAAI,KACxH,gCAAgC,KAAK,IAAI;AAAA,EAChD;AACF;AAEA,SAAS,iBAAiB,MAA2B,MAAsB;AAEzE,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,QAAQ,CAAC,GAAG,KAAK,QAAQ;AAC/B,SAAO,MAAM,SAAS,GAAG;AACvB,UAAM,OAAO,MAAM,MAAM;AAEzB,QAAI,CAAC,KAAM;AACX,QAAI,CAAC,UAAU,IAAI,EAAG;AACtB,QAAI,KAAK,SAAS,WAAW,KAAK,MAAM,MAAM,MAAM,QAAQ,KAAK,MAAM,UAAU,MAAM,OAAO;AAC5F,aAAO,KAAK,MAAM,SAAS,KAAK;AAAA,IAClC;AACA,UAAM,QAAQ,GAAG,KAAK,QAAQ;AAAA,EAChC;AACA,SAAO;AACT;AAEA,SAAS,cAAc,OAAkB,SAA8B;AACrE,aAAW,QAAQ,OAAO;AACxB,QAAI,CAAC,UAAU,IAAI,EAAG;AACtB,UAAM,KAAK,KAAK,MAAM,IAAI;AAC1B,QAAI,GAAI,SAAQ,IAAI,IAAI,IAAI,IAAI;AAChC,eAAW,gBAAgB,cAAc,IAAI,GAAG;AAC9C,cAAQ,cAAc,IAAI,YAAY;AAAA,IACxC;AACA,QAAI,KAAK,MAAM,eAAe,MAAM,SAAS;AAC3C,iBAAW,iBAAiB,KAAK,MAAM,eAAe,KAAK,IAAI,MAAM,KAAK,GAAG;AAC3E,YAAI,aAAc,SAAQ,uBAAuB,IAAI,YAAY;AAAA,MACnE;AAAA,IACF;AACA,QAAI,KAAK,SAAS,SAAS;AACzB,YAAM,SAAS,KAAK,MAAM,KAAK;AAC/B,UAAI,OAAQ,SAAQ,YAAY,IAAI,QAAQ,IAAI;AAAA,IAClD;AACA,kBAAc,KAAK,UAAU,OAAO;AAAA,EACtC;AACF;AAEA,SAAS,cAAc,SAA4B;AACjD,SAAO;AAAA,IACL,KAAK,SAAS,iBAAiB;AAAA,IAC/B,KAAK,SAAS,kBAAkB;AAAA,IAChC,KAAK,SAAS,cAAc;AAAA,IAC5B,KAAK,SAAS,mBAAmB;AAAA,IACjC,KAAK,SAAS,eAAe;AAAA,IAC7B,KAAK,SAAS,WAAW;AAAA,IACzB,KAAK,SAAS,aAAa;AAAA,IAC3B,KAAK,SAAS,uBAAuB;AAAA,EACvC,EACG,OAAO,CAAC,UAA2B,QAAQ,KAAK,CAAC,EACjD,QAAQ,CAAC,UAAU,MAAM,MAAM,KAAK,EAAE,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EAAE,OAAO,OAAO,CAAC;AACrF;AAEA,SAAS,wBAAwB,SAA+B;AAC9D,SAAO,IAAI,IAAI;AAAA,IACb,KAAK,SAAS,kBAAkB;AAAA,IAChC,KAAK,SAAS,cAAc;AAAA,IAC5B,KAAK,SAAS,mBAAmB;AAAA,EACnC,EACG,OAAO,CAAC,UAA2B,QAAQ,KAAK,CAAC,EACjD,QAAQ,CAAC,UAAU,MAAM,MAAM,KAAK,EAAE,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EAAE,OAAO,OAAO,CAAC,CAAC;AACtF;AAEA,SAAS,YAAY,SAA8B,SAA6C;AAE9F,MAAI,CAAC,QAAS,QAAO;AACrB,MAAI,kBAAkB,SAAS,OAAO,EAAG,QAAO;AAChD,MAAI,CAAC,QAAQ,QAAQ,iBAAiB,SAAS,OAAO,EAAG,QAAO;AAChE,MAAI,QAAQ,QAAQ,oBAAoB,WAAW,OAAO,EAAG,QAAO;AACpE,MAAI,QAAQ,QAAQ,4BAA4B,yBAAyB,OAAO,EAAG,QAAO,wBAAwB,SAAS,OAAO;AAClI,MAAI,QAAQ,QAAQ,4BAA4B,oBAAoB,OAAO,EAAG,QAAO;AACrF,MAAI,CAAC,QAAQ,QAAQ,iBAAiB,6BAA6B,SAAS,OAAO,EAAG,QAAO;AAC7F,MAAI,CAAC,QAAQ,QAAQ,iBAAiB,sBAAsB,SAAS,OAAO,EAAG,QAAO;AAEtF,QAAM,OAAO,QAAQ,OAAO;AAC5B,QAAM,QAAQ,SAAS,OAAO;AAC9B,QAAM,YAAY,YAAY,SAAS,IAAI;AAC3C,QAAM,cAAc,cAAc,SAAS,MAAM,SAAS;AAC1D,QAAM,OAAO,OAAO,YAAY,SAAS,MAAM,OAAO,IAAI;AAC1D,QAAM,MAAM,QAAQ;AACpB,QAAM,WAAW,sCAAsC,SAAS,OAAO,IAAI,CAAC,IAAI,gBAAgB,SAAS,OAAO;AAChH,MAAI,QAAQ,YAAY,SAAS,WAAW,KAAK,KAAK,SAAS,KAAK,KAAK,CAAC,KAAK,SAAS,QAAQ,GAAG;AACjG,aAAS,KAAK,gBAAgB,SAAS,UAAU,2CAA2C,CAAC;AAAA,EAC/F;AAEA,MAAI,QAAQ,QAAQ,SAAS,iBAAiB,CAAC,aAAa;AAC1D,WAAO,SAAS,SAAS,IAAI,cAAc,SAAS,KAAK,QAAQ,IAAI;AAAA,EACvE;AACA,MAAI,gCAAgC,SAAS,MAAM,MAAM,aAAa,UAAU,OAAO,GAAG;AACxF,WAAO,SAAS,WAAW,IAAI,SAAS,CAAC,KAAK,OAAO,cAAc,SAAS,YAAY,QAAQ;AAAA,EAClG;AACA,MAAI,2BAA2B,MAAM,UAAU,OAAO,GAAG;AACvD,WAAO,SAAS,WAAW,IAAI,SAAS,CAAC,KAAK,OAAO,cAAc,SAAS,KAAK,QAAQ;AAAA,EAC3F;AACA,MAAI,YAAY,SAAS,MAAM,MAAM,aAAa,UAAU,OAAO,GAAG;AACpE,QAAI,SAAS,WAAW,EAAG,QAAO;AAClC,WAAO,SAAS,WAAW,IAAI,SAAS,CAAC,KAAK,OAAO,cAAc,SAAS,KAAK,QAAQ;AAAA,EAC3F;AAEA,QAAM,OAAqB;AAAA,IACzB,IAAI,OAAO,OAAO;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU,YAAY,OAAO;AAAA,IAC7B,OAAO,SAAS,OAAO;AAAA,IACvB;AAAA,EACF;AACA,QAAM,cAAc,mBAAmB,SAAS,OAAO;AACvD,MAAI,YAAa,MAAK,cAAc;AACpC,QAAM,OAAO,WAAW,SAAS,QAAQ,QAAQ,aAAa;AAC9D,MAAI,KAAM,MAAK,OAAO;AACtB,QAAM,QAAQ,SAAS,OAAO;AAC9B,MAAI,MAAO,MAAK,QAAQ;AACxB,MAAI,OAAO,KAAK,KAAK,EAAE,SAAS,EAAG,MAAK,QAAQ;AAChD,MAAI,QAAQ,QAAQ,kBAAmB,MAAK,aAAa,EAAE,GAAG,QAAQ,QAAQ;AAC9E,SAAO;AACT;AAEA,SAAS,gBAAgB,SAAkB,SAAwC;AACjF,QAAM,WAA2B,CAAC;AAClC,QAAM,qBAAqB,oBAAI,IAAoB;AACnD,MAAI,UAAU;AACd,QAAM,iBAAiB,QAAQ,SAAS,KAAK,CAAC,UAA4B,UAAU,KAAK,KAAK,4BAA4B,KAAK,CAAC;AAChI,MAAI,gBAAgB;AAClB,UAAM,sBAAsB,QAAQ;AACpC,YAAQ,kBAAkB,uBAAuB,OAAO;AACxD,eAAW,SAAS,eAAe,UAAU;AAC3C,UAAI,CAAC,UAAU,KAAK,EAAG;AACvB,YAAM,gBAAgB,YAAY,OAAO,OAAO;AAChD,iBAAW,oBAAoB,SAAS,eAAe,UAAU,oBAAoB,OAAO;AAAA,IAC9F;AACA,YAAQ,kBAAkB;AAC1B,UAAMA,mBAAkB,gCAAgC,SAAS,UAAU,OAAO;AAClF,QAAIA,iBAAgB,UAAU,GAAG;AAC/B,eAAS,OAAO,GAAG,SAAS,QAAQ,GAAGA,iBAAgB,QAAQ;AAC/D,iBAAWA,iBAAgB;AAAA,IAC7B;AACA,QAAI,UAAU,EAAG,UAAS,KAAK,YAAY,SAAS,OAAO,CAAC;AAC5D,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ,SAAS,UAAU,QAAQ,iBAAiB;AACtD,UAAM,WAAW,KAAK,SAAS,MAAM,KAAK;AAC1C,UAAM,mBAAmB,QAAQ,gBAAgB,IAAI,QAAQ,KAAK,CAAC;AACnE,UAAM,oBAAoB,iBAAiB,SAAS,IAAI,mBAAmB,QAAQ,SAAS,OAAO,SAAS;AAC5G,eAAW,SAAS,mBAAmB;AACrC,UAAI,UAAU,KAAK,GAAG;AACpB,cAAM,gBAAgB,YAAY,OAAO,OAAO;AAChD,mBAAW,oBAAoB,SAAS,eAAe,UAAU,oBAAoB,OAAO;AAAA,MAC9F,WAAW,QAAQ,QAAQ,oBAAoB,OAAO,KAAK,GAAG;AAC5D,cAAM,OAAO,cAAc,MAAM,MAAM,QAAQ,QAAQ,aAAa;AACpE,YAAI,MAAM;AACR,mBAAS,KAAK;AAAA,YACZ,IAAI,OAAO,OAAO;AAAA,YAClB,KAAK;AAAA,YACL,MAAM;AAAA,YACN,MAAM;AAAA,YACN;AAAA,YACA,aAAa;AAAA,YACb,WAAW;AAAA,YACX,UAAU,CAAC;AAAA,UACb,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AACA,QAAI,UAAU,EAAG,UAAS,KAAK,YAAY,SAAS,OAAO,CAAC;AAC5D,WAAO;AAAA,EACT;AAEA,aAAW,SAAS,QAAQ,UAAU;AACpC,QAAI,UAAU,KAAK,GAAG;AACpB,UAAI,CAAC,QAAQ,QAAQ,wBAAwB,QAAQ,SAAS,SAAU;AACxE,YAAM,gBAAgB,YAAY,OAAO,OAAO;AAChD,iBAAW,oBAAoB,SAAS,eAAe,UAAU,oBAAoB,OAAO;AAAA,IAC9F,WAAW,QAAQ,QAAQ,oBAAoB,OAAO,KAAK,GAAG;AAC5D,YAAM,OAAO,cAAc,MAAM,MAAM,QAAQ,QAAQ,aAAa;AACpE,UAAI,MAAM;AACR,cAAM,WAAyB;AAAA,UAC7B,IAAI,OAAO,OAAO;AAAA,UAClB,KAAK;AAAA,UACL,MAAM;AAAA,UACN,MAAM;AAAA,UACN;AAAA,UACA,aAAa;AAAA,UACb,WAAW;AAAA,UACX,UAAU,CAAC;AAAA,QACb;AACA,YAAI,4BAA4B,SAAS,UAAU,OAAO,GAAG;AAC3D,qBAAW;AAAA,QACb,OAAO;AACL,mBAAS,KAAK,QAAQ;AAAA,QACxB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,QAAM,kBAAkB,gCAAgC,SAAS,UAAU,OAAO;AAClF,MAAI,gBAAgB,UAAU,GAAG;AAC/B,aAAS,OAAO,GAAG,SAAS,QAAQ,GAAG,gBAAgB,QAAQ;AAC/D,eAAW,gBAAgB;AAAA,EAC7B;AACA,MAAI,UAAU,EAAG,UAAS,KAAK,YAAY,SAAS,OAAO,CAAC;AAC5D,SAAO;AACT;AAEA,SAAS,uBAAuB,MAAuC;AACrE,QAAM,cAAc,oBAAI,IAAuB;AAC/C,aAAW,SAAS,KAAK,UAAU;AACjC,QAAI,CAAC,uBAAuB,KAAK,EAAG;AACpC,UAAM,WAAW,UAAU,KAAK,IAAI,KAAK,OAAO,MAAM,KAAK,KAAK;AAChE,UAAM,WAAW,YAAY,IAAI,QAAQ,KAAK,CAAC;AAC/C,aAAS,KAAK,KAAK;AACnB,gBAAY,IAAI,UAAU,QAAQ;AAAA,EACpC;AACA,SAAO;AACT;AAEA,SAAS,uBAAuB,MAAwB;AACtD,MAAI,OAAO,IAAI,EAAG,QAAO,cAAc,KAAK,MAAM,GAAG,MAAM;AAC3D,MAAI,CAAC,UAAU,IAAI,EAAG,QAAO;AAC7B,SAAO,CAAC,4BAA4B,IAAI;AAC1C;AAEA,SAAS,oBACP,QACA,OACA,UACA,oBACA,SACQ;AACR,MAAI,CAAC,MAAO,QAAO;AACnB,MAAI,6BAA6B,QAAQ,OAAO,oBAAoB,OAAO,GAAG;AAC5E,WAAO,mBAAmB,KAAK;AAAA,EACjC;AACA,MAAI,4BAA4B,QAAQ,UAAU,OAAO,GAAG;AAC1D,WAAO,mBAAmB,KAAK;AAAA,EACjC;AACA,WAAS,KAAK,KAAK;AACnB,SAAO;AACT;AAEA,SAAS,kBAAkB,SAAkB,SAAiC;AAC5E,MAAI,QAAQ,QAAQ,SAAS,OAAQ,QAAO;AAC5C,MAAI,4BAA4B,OAAO,EAAG,QAAO;AACjD,MAAI,gBAAgB,IAAI,QAAQ,IAAI,EAAG,QAAO;AAC9C,MAAI,QAAQ,SAAS,WAAY,QAAO;AACxC,SAAO;AACT;AAEA,SAAS,4BAA4B,SAA2B;AAC9D,MAAI,QAAQ,SAAS,WAAY,QAAO;AACxC,QAAM,OAAO,KAAK,SAAS,gBAAgB,KAAK,KAAK,SAAS,YAAY;AAC1E,SAAO,SAAS,UAAU,SAAS;AACrC;AAEA,SAAS,4BAA4B,SAAkB,UAA0B,SAAiC;AAChH,MAAI,CAAC,QAAQ,QAAQ,0BAA0B,QAAQ,QAAQ,SAAS,OAAQ,QAAO;AACvF,MAAI,CAAC,wBAAwB,OAAO,EAAG,QAAO;AAC9C,SAAO,SAAS,UAAU,QAAQ,QAAQ;AAC5C;AAEA,SAAS,wBAAwB,SAA2B;AAC1D,SAAO,CAAC,OAAO,MAAM,MAAM,OAAO,WAAW,UAAU,UAAU,MAAM,EAAE,SAAS,QAAQ,IAAI;AAChG;AAEA,SAAS,gCACP,SACA,UACA,SAC+C;AAC/C,MAAI,CAAC,QAAQ,QAAQ,4BAA4B,QAAQ,QAAQ,SAAS,OAAQ,QAAO,EAAE,UAAU,SAAS,EAAE;AAChH,MAAI,SAAS,UAAU,QAAQ,QAAQ,oBAAqB,QAAO,EAAE,UAAU,SAAS,EAAE;AAC1F,MAAI,CAAC,0BAA0B,OAAO,EAAG,QAAO,EAAE,UAAU,SAAS,EAAE;AACvE,QAAM,QAAQ,mBAAmB,QAAQ;AACzC,MAAI,MAAM,kBAAkB,KAAK,IAAI,GAAG,KAAK,MAAM,SAAS,SAAS,IAAI,CAAC,EAAG,QAAO,EAAE,UAAU,SAAS,EAAE;AAC3G,MAAI,MAAM,sBAAsB,KAAK,IAAI,GAAG,KAAK,MAAM,SAAS,SAAS,GAAG,CAAC,EAAG,QAAO,EAAE,UAAU,SAAS,EAAE;AAE9G,QAAM,OAAuB,CAAC;AAC9B,MAAI,UAAU;AACd,MAAI,cAAc;AAClB,aAAW,SAAS,UAAU;AAE5B,QAAI,CAAC,sBAAsB,KAAK,GAAG;AACjC,WAAK,KAAK,KAAK;AACf;AAAA,IACF;AACA,QAAI,cAAc,QAAQ,QAAQ,qBAAqB;AACrD,WAAK,KAAK,KAAK;AACf,qBAAe;AAAA,IACjB,OAAO;AACL,iBAAW,mBAAmB,KAAK;AAAA,IACrC;AAAA,EACF;AACA,SAAO,UAAU,IAAI,EAAE,UAAU,MAAM,QAAQ,IAAI,EAAE,UAAU,SAAS,EAAE;AAC5E;AAEA,SAAS,0BAA0B,SAA2B;AAC5D,MAAI,CAAC,OAAO,MAAM,MAAM,SAAS,UAAU,QAAQ,EAAE,SAAS,QAAQ,IAAI,EAAG,QAAO;AACpF,MAAI,CAAC,CAAC,OAAO,SAAS,EAAE,SAAS,QAAQ,IAAI,EAAG,QAAO;AACvD,QAAM,QAAQ;AAAA,IACZ,KAAK,SAAS,IAAI;AAAA,IAClB,KAAK,SAAS,OAAO;AAAA,IACrB,KAAK,SAAS,MAAM;AAAA,IACpB,KAAK,SAAS,YAAY;AAAA,IAC1B,KAAK,SAAS,OAAO;AAAA,EACvB,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,EAAE,YAAY;AACxC,MAAI,sEAAsE,KAAK,KAAK,EAAG,QAAO;AAC9F,SAAO,gIAAgI,KAAK,KAAK,KAC5I,qCAAqC,KAAK,KAAK;AACtD;AAEA,SAAS,mBAAmB,UAAoF;AAC9G,MAAI,kBAAkB;AACtB,MAAI,sBAAsB;AAC1B,aAAW,SAAS,UAAU;AAC5B,QAAI,sBAAsB,KAAK,EAAG,oBAAmB;AACrD,QAAI,0BAA0B,KAAK,EAAG,wBAAuB;AAAA,EAC/D;AACA,SAAO,EAAE,iBAAiB,oBAAoB;AAChD;AAEA,SAAS,sBAAsB,MAA6B;AAC1D,QAAM,QAAQ,kBAAkB,IAAI;AACpC,SAAO,MAAM,QAAQ,KAChB,MAAM,iBAAiB,KACvB,MAAM,WAAW,KACjB,MAAM,cAAc,KACpB,MAAM,sBAAsB;AACnC;AAEA,SAAS,0BAA0B,MAA6B;AAC9D,QAAM,QAAQ,kBAAkB,IAAI;AACpC,SAAO,MAAM,aAAa,KAAK,MAAM,SAAS,KAAK,MAAM,oBAAoB,KAAK,MAAM,eAAe;AACzG;AAEA,SAAS,kBAAkB,MAMzB;AACA,QAAM,OAAO,KAAK,QAAQ,KAAK;AAC/B,QAAM,QAAQ;AAAA,IACZ,OAAO,SAAS,SAAS,IAAI;AAAA,IAC7B,YAAY,SAAS,OAAO,SAAS,SAAS,IAAI;AAAA,IAClD,QAAQ,SAAS,WAAW,SAAS,SAAS,SAAS,SAAS,IAAI;AAAA,IACpE,cAAc,SAAS,aAAa,SAAS,eAAe,SAAS,cAAc,SAAS,aAAa,SAAS,cAAc,SAAS,WAAW,SAAS,YAAY,SAAS,gBAAgB,SAAS,WAAW,IAAI;AAAA,IAC1N,mBAAmB,SAAS,aAAa,SAAS,SAAS,IAAI;AAAA,EACjE;AACA,aAAW,SAAS,KAAK,UAAU;AACjC,UAAM,aAAa,kBAAkB,KAAK;AAC1C,UAAM,SAAS,WAAW;AAC1B,UAAM,cAAc,WAAW;AAC/B,UAAM,UAAU,WAAW;AAC3B,UAAM,gBAAgB,WAAW;AACjC,UAAM,qBAAqB,WAAW;AAAA,EACxC;AACA,SAAO;AACT;AAEA,SAAS,6BACP,QACA,OACA,YACA,SACS;AACT,MAAI,CAAC,QAAQ,QAAQ,6BAA6B,QAAQ,QAAQ,SAAS,OAAQ,QAAO;AAC1F,MAAI,CAAC,2BAA2B,MAAM,EAAG,QAAO;AAChD,QAAM,YAAY,kBAAkB,KAAK;AACzC,QAAM,QAAQ,WAAW,IAAI,SAAS,KAAK;AAC3C,aAAW,IAAI,WAAW,QAAQ,CAAC;AACnC,SAAO,SAAS,QAAQ,QAAQ;AAClC;AAEA,SAAS,2BAA2B,SAA2B;AAC7D,SAAO,CAAC,QAAQ,QAAQ,OAAO,MAAM,MAAM,OAAO,WAAW,UAAU,UAAU,OAAO,EAAE,SAAS,QAAQ,IAAI;AACjH;AAEA,SAAS,kBAAkB,MAA4B;AACrD,QAAM,kBAAkB,KAAK,SAAS,IAAI,iBAAiB,EAAE,KAAK,GAAG;AACrE,SAAO,GAAG,KAAK,GAAG,IAAI,KAAK,QAAQ,EAAE,IAAI,KAAK,IAAI,IAAI,KAAK,QAAQ,EAAE,IAAI,KAAK,SAAS,EAAE,IAAI,KAAK,cAAc,MAAM,EAAE,IAAI,eAAe;AAC7I;AAEA,SAAS,mBAAmB,MAA4B;AACtD,MAAI,QAAQ;AACZ,aAAW,SAAS,KAAK,SAAU,UAAS,mBAAmB,KAAK;AACpE,SAAO;AACT;AAEA,SAAS,sCAAsC,SAAkB,SAAiC;AAChG,MAAI,CAAC,QAAQ,QAAQ,0BAA0B,QAAQ,QAAQ,cAAe,QAAO;AACrF,MAAI,KAAK,SAAS,eAAe,MAAM,QAAS,QAAO;AACvD,MAAI,QAAQ,SAAS,aAAa,KAAK,SAAS,MAAM,MAAM,KAAM,QAAO;AACzE,MAAI,QAAQ,SAAS,YAAY,KAAK,SAAS,MAAM,MAAM,KAAM,QAAO;AACxE,MAAI,KAAK,SAAS,SAAS,MAAM,QAAQ,KAAK,SAAS,MAAM,MAAM,KAAM,QAAO;AAChF,SAAO;AACT;AAEA,SAAS,6BAA6B,SAAkB,SAAiC;AACvF,QAAM,KAAK,KAAK,SAAS,IAAI;AAC7B,SAAO,QAAQ,MAAM,QAAQ,QAAQ,0BAA0B,QAAQ,uBAAuB,IAAI,EAAE,CAAC;AACvG;AAEA,SAAS,sBAAsB,SAAkB,SAAiC;AAChF,MAAI,CAAC,QAAQ,QAAQ,6BAA6B,QAAQ,QAAQ,SAAS,OAAQ,QAAO;AAC1F,MAAI,oBAAoB,OAAO,EAAG,QAAO;AACzC,MAAI,CAAC,iBAAiB,OAAO,EAAG,QAAO;AACvC,MAAI,yBAAyB,OAAO,EAAG,QAAO;AAC9C,SAAO,0BAA0B,OAAO,KAAK,qBAAqB,OAAO,KAAK,eAAe,OAAO;AACtG;AAEA,SAAS,oBAAoB,SAA2B;AACtD,SAAO,KAAK,SAAS,MAAM,MAAM,QAC5B,KAAK,SAAS,eAAe,MAAM,UACnC,KAAK,SAAS,YAAY,MAAM,UAChC,KAAK,SAAS,WAAW,MAAM,UAC/B,KAAK,SAAS,YAAY,MAAM;AACvC;AAEA,SAAS,iBAAiB,SAA2B;AACnD,QAAM,QAAQ,CAAC,QAAQ,MAAM,KAAK,SAAS,IAAI,GAAG,KAAK,SAAS,OAAO,GAAG,KAAK,SAAS,MAAM,GAAG,KAAK,SAAS,YAAY,CAAC,EACzH,OAAO,OAAO,EACd,KAAK,GAAG,EACR,YAAY;AACf,SAAO,yFAAyF,KAAK,KAAK;AAC5G;AAEA,SAAS,yBAAyB,SAA2B;AAC3D,QAAM,WAAW,KAAK,SAAS,UAAU;AACzC,SAAO,aAAa,QAAQ,OAAO,QAAQ,KAAK;AAClD;AAEA,SAAS,eAAe,SAA2B;AACjD,SAAO,KAAK,SAAS,OAAO,MAAM,QAAQ,KAAK,SAAS,aAAa,MAAM;AAC7E;AAEA,SAAS,qBAAqB,SAA2B;AACvD,QAAM,YAAY,KAAK,SAAS,OAAO,KAAK;AAC5C,SAAO,8DAA8D,KAAK,SAAS;AACrF;AAEA,SAAS,0BAA0B,SAA2B;AAC5D,QAAM,QAAQ,KAAK,SAAS,OAAO,KAAK;AACxC,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,aAAa,MAAM,QAAQ,QAAQ,EAAE,EAAE,YAAY;AACzD,SAAO,gEAAgE,KAAK,UAAU,KACjF,8CAA8C,KAAK,UAAU,KAC7D,iDAAiD,KAAK,UAAU,KAChE,6BAA6B,KAAK,UAAU;AACnD;AAEA,SAAS,YACP,SACA,MACA,MACA,aACA,UACA,SACS;AACT,MAAI,QAAQ,QAAQ,SAAS,OAAQ,QAAO;AAC5C,MAAI,SAAS,UAAU,SAAS,eAAgB,QAAO;AACvD,MAAI,YAAa,QAAO;AACxB,MAAI,QAAQ,SAAS,UAAW,QAAO;AACvC,MAAI,KAAM,QAAO;AACjB,MAAI,qBAAqB,SAAS,OAAO,EAAG,QAAO;AACnD,MAAI,SAAS,WAAW,EAAG,QAAO;AAClC,MAAI,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,YAAY,KAAK,KAAK,SAAS,iBAAiB,EAAG,QAAO;AACnG,SAAO,SAAS,SAAS;AAC3B;AAEA,SAAS,qBAAqB,SAAkB,SAAiC;AAC/E,QAAM,KAAK,KAAK,SAAS,IAAI;AAC7B,SAAO,QAAQ,MAAM,QAAQ,cAAc,IAAI,EAAE,CAAC;AACpD;AAEA,SAAS,2BAA2B,MAAqB,UAA0B,SAAiC;AAClH,MAAI,QAAQ,QAAQ,SAAS,OAAQ,QAAO;AAC5C,MAAI,SAAS,WAAY,QAAO;AAChC,SAAO,SAAS,KAAK,CAAC,UAAU,MAAM,SAAS,UAAU,MAAM,SAAS,QAAQ;AAClF;AAEA,SAAS,gCACP,SACA,MACA,MACA,aACA,UACA,SACS;AACT,MAAI,QAAQ,QAAQ,SAAS,OAAQ,QAAO;AAC5C,MAAI,CAAC,gBAAgB,OAAO,EAAG,QAAO;AACtC,MAAI,YAAa,QAAO;AACxB,MAAI,QAAQ,SAAS,UAAW,QAAO;AACvC,MAAI,KAAM,QAAO;AACjB,MAAI,SAAS,WAAW,EAAG,QAAO;AAClC,MAAI,oBAAoB,OAAO,EAAG,QAAO;AACzC,SAAO;AACT;AAEA,SAAS,gBAAgB,SAA2B;AAClD,SAAO,QAAQ,KAAK,SAAS,GAAG;AAClC;AAEA,SAAS,oBAAoB,SAA2B;AACtD,SAAO;AAAA,IACL,KAAK,SAAS,IAAI,KACb,KAAK,SAAS,YAAY,KAC1B,KAAK,SAAS,iBAAiB,KAC/B,KAAK,SAAS,kBAAkB,KAChC,KAAK,SAAS,eAAe,KAC7B,KAAK,SAAS,eAAe,KAC7B,KAAK,SAAS,eAAe,KAC7B,KAAK,SAAS,cAAc,KAC5B,KAAK,SAAS,UAAU;AAAA,EAC/B;AACF;AAEA,SAAS,QAAQ,SAAiC;AAChD,QAAM,WAAW,WAAW,KAAK,SAAS,MAAM,CAAC;AACjD,MAAI,SAAU,QAAO;AACrB,QAAM,MAAM,QAAQ;AACpB,MAAI,QAAQ,aAAa,CAAC,sBAAsB,OAAO,EAAG,QAAO;AACjE,MAAI,QAAQ,UAAU,CAAC,sBAAsB,OAAO,EAAG,QAAO;AAC9D,MAAI,OAAO,aAAc,QAAO,aAAa,GAAG,KAAK;AACrD,MAAI,WAAW,KAAK,GAAG,EAAG,QAAO;AACjC,MAAI,QAAQ,OAAO,QAAQ,OAAQ,QAAO,KAAK,SAAS,MAAM,IAAI,SAAS;AAC3E,MAAI,QAAQ,SAAU,QAAO;AAC7B,MAAI,QAAQ,aAAa,QAAQ,WAAY,QAAO;AACpD,MAAI,QAAQ,SAAU,QAAO;AAC7B,MAAI,QAAQ,SAAU,QAAO;AAC7B,MAAI,QAAQ,OAAQ,QAAO;AAC3B,MAAI,QAAQ,SAAU,QAAO;AAC7B,MAAI,QAAQ,MAAO,QAAO;AAC1B,MAAI,QAAQ,QAAS,QAAO,UAAU,OAAO;AAC7C,MAAI,QAAQ,KAAM,QAAO;AACzB,MAAI,QAAQ,QAAQ,QAAQ,KAAM,QAAO;AACzC,MAAI,QAAQ,SAAU,QAAO;AAC7B,MAAI,QAAQ,IAAK,QAAO;AACxB,MAAI,QAAQ,WAAY,QAAO;AAC/B,MAAI,QAAQ,SAAU,QAAO,KAAK,SAAS,UAAU,MAAM,OAAO,YAAY;AAC9E,MAAI,QAAQ,UAAW,QAAO;AAC9B,MAAI,QAAQ,QAAS,QAAO;AAC5B,MAAI,QAAQ,KAAM,QAAO;AACzB,MAAI,QAAQ,WAAY,QAAO;AAC/B,MAAI,QAAQ,KAAM,QAAO,KAAK,SAAS,OAAO,MAAM,QAAQ,cAAc;AAC1E,MAAI,QAAQ,KAAM,QAAO;AACzB,SAAO;AACT;AAEA,SAAS,UAAU,SAAiC;AAClD,QAAM,QAAQ,KAAK,SAAS,MAAM,KAAK,QAAQ,YAAY;AAC3D,MAAI,SAAS,SAAU,QAAO;AAC9B,MAAI,SAAS,YAAY,SAAS,YAAY,SAAS,QAAS,QAAO;AACvE,MAAI,SAAS,WAAY,QAAO;AAChC,MAAI,SAAS,QAAS,QAAO;AAC7B,MAAI,SAAS,QAAS,QAAO;AAC7B,MAAI,SAAS,QAAS,QAAO;AAC7B,MAAI,SAAS,SAAU,QAAO;AAC9B,MAAI,SAAS,SAAU,QAAO;AAC9B,SAAO;AACT;AAEA,SAAS,YAAY,SAAkB,MAAc,SAAgC;AACnF,QAAM,aAAa,KAAK,SAAS,iBAAiB;AAClD,MAAI,YAAY;AACd,UAAM,QAAQ,WACX,MAAM,KAAK,EACX,IAAI,CAAC,OAAO,QAAQ,IAAI,IAAI,EAAE,CAAC,EAC/B,OAAO,CAAC,SAA0B,QAAQ,IAAI,CAAC,EAC/C,IAAI,CAAC,SAAS,eAAe,MAAM,OAAO,CAAC,EAC3C,KAAK,GAAG;AACX,UAAM,aAAa,cAAc,OAAO,QAAQ,QAAQ,aAAa;AACrE,QAAI,WAAY,QAAO;AAAA,EACzB;AAEA,QAAM,YAAY,cAAc,KAAK,SAAS,YAAY,KAAK,IAAI,QAAQ,QAAQ,aAAa;AAChG,MAAI,UAAW,QAAO;AAEtB,QAAM,WAAW,UAAU,SAAS,OAAO;AAC3C,MAAI,SAAU,QAAO;AAErB,QAAM,YAAY,iBAAiB,OAAO;AAC1C,MAAI,UAAW,QAAO,cAAc,WAAW,QAAQ,QAAQ,aAAa;AAE5E,MAAI,SAAS,OAAO;AAClB,UAAM,MAAM,cAAc,KAAK,SAAS,KAAK,KAAK,IAAI,QAAQ,QAAQ,aAAa;AACnF,QAAI,IAAK,QAAO;AAAA,EAClB;AAEA,MAAI,uBAAuB,IAAI,IAAI,GAAG;AACpC,UAAM,WAAW,cAAc,eAAe,SAAS,SAAS,EAAE,YAAY,wBAAwB,OAAO,EAAE,CAAC,GAAG,QAAQ,QAAQ,aAAa;AAChJ,QAAI,SAAU,QAAO;AAAA,EACvB;AAEA,QAAM,QAAQ,cAAc,KAAK,SAAS,OAAO,KAAK,IAAI,QAAQ,QAAQ,aAAa;AACvF,MAAI,MAAO,QAAO;AAElB,SAAO;AACT;AAEA,SAAS,UAAU,SAAkB,SAAgC;AACnE,QAAM,KAAK,KAAK,SAAS,IAAI;AAC7B,MAAI,IAAI;AACN,UAAMC,SAAQ,QAAQ,YAAY,IAAI,EAAE;AACxC,QAAIA,QAAO;AACT,YAAM,QAAQ,cAAc,eAAeA,QAAO,OAAO,GAAG,QAAQ,QAAQ,aAAa;AACzF,UAAI,MAAO,QAAO;AAAA,IACpB;AAAA,EACF;AACA,QAAM,QAAQ,iBAAiB,OAAO;AACtC,SAAO,QAAQ,cAAc,eAAe,OAAO,OAAO,GAAG,QAAQ,QAAQ,aAAa,IAAI;AAChG;AAEA,SAAS,iBAAiB,SAAkC;AAC1D,MAAI,SAAS,QAAQ;AACrB,SAAO,QAAQ;AACb,QAAI,UAAU,MAAM,KAAK,OAAO,SAAS,QAAS,QAAO;AACzD,aAAS,OAAO;AAAA,EAClB;AACA,SAAO;AACT;AAEA,SAAS,iBAAiB,SAA0B;AAClD,MAAI,QAAQ,SAAS,SAAS;AAC5B,UAAM,QAAQ,KAAK,SAAS,MAAM,KAAK,QAAQ,YAAY;AAC3D,QAAI,SAAS,YAAY,SAAS,YAAY,SAAS,QAAS,QAAO,KAAK,SAAS,OAAO,KAAK;AAAA,EACnG;AACA,SAAO;AACT;AAEA,SAAS,SAAS,SAAqC;AACrD,QAAM,QAA2B,CAAC;AAClC,MAAI,KAAK,SAAS,UAAU,MAAM,QAAQ,KAAK,SAAS,eAAe,MAAM,OAAQ,OAAM,WAAW;AACtG,QAAM,OAAO,KAAK,SAAS,WAAW;AACtC,MAAI,SAAS,OAAQ,OAAM,OAAO;AAClC,MAAI,SAAS,QAAS,OAAM,OAAO;AACnC,QAAM,kBAAkB,KAAK,SAAS,sBAAsB;AAC5D,MAAI,oBAAoB,OAAQ,OAAM,kBAAkB;AACxD,MAAI,oBAAoB,QAAS,OAAM,kBAAkB;AACzD,QAAM,OAAO,KAAK,SAAS,WAAW;AACtC,MAAI,KAAM,OAAM,OAAO,cAAc,MAAM,EAAE;AAC7C,QAAM,UAAU,KAAK,SAAS,cAAc;AAC5C,MAAI,YAAY,OAAQ,OAAM,UAAU;AACxC,MAAI,YAAY,QAAS,OAAM,UAAU;AACzC,QAAM,aAAa,KAAK,SAAS,iBAAiB;AAClD,MAAI,WAAY,OAAM,aAAa,cAAc,YAAY,EAAE;AAC/D,MAAI,KAAK,SAAS,UAAU,MAAM,QAAQ,KAAK,SAAS,eAAe,MAAM,OAAQ,OAAM,WAAW;AACtG,MAAI,KAAK,SAAS,UAAU,MAAM,QAAQ,KAAK,SAAS,eAAe,MAAM,OAAQ,OAAM,WAAW;AACtG,QAAM,UAAU,KAAK,SAAS,cAAc,MAAM,KAAK,SAAS,SAAS,MAAM,OAAO,SAAS;AAC/F,MAAI,YAAY,OAAQ,OAAM,UAAU;AACxC,MAAI,YAAY,QAAS,OAAM,UAAU;AACzC,MAAI,YAAY,QAAS,OAAM,UAAU;AACzC,MAAI,KAAK,SAAS,UAAU,MAAM,QAAQ,KAAK,SAAS,eAAe,MAAM,OAAQ,OAAM,WAAW;AACtG,QAAM,WAAW,KAAK,SAAS,eAAe;AAC9C,MAAI,aAAa,OAAQ,OAAM,WAAW;AAC1C,MAAI,aAAa,QAAS,OAAM,WAAW;AAC3C,QAAM,UAAU,KAAK,SAAS,cAAc;AAC5C,MAAI,YAAY,OAAQ,OAAM,UAAU;AACxC,MAAI,YAAY,QAAS,OAAM,UAAU;AACzC,MAAI,YAAY,QAAS,OAAM,UAAU;AACzC,QAAM,UAAU,KAAK,SAAS,cAAc;AAC5C,MAAI,WAAW,YAAY,QAAS,OAAM,UAAU,YAAY,SAAS,OAAO;AAChF,QAAM,UAAU,KAAK,SAAS,cAAc;AAC5C,MAAI,WAAW,YAAY,QAAS,OAAM,UAAU,YAAY,SAAS,OAAO;AAChF,QAAM,WAAW,KAAK,SAAS,eAAe;AAC9C,MAAI,YAAY,aAAa,QAAS,OAAM,WAAW,aAAa,SAAS,OAAO;AACpF,QAAM,WAAW,KAAK,SAAS,eAAe;AAC9C,MAAI,SAAU,OAAM,WAAW,cAAc,UAAU,GAAG;AAC1D,QAAM,OAAO,KAAK,SAAS,WAAW;AACtC,MAAI,KAAM,OAAM,OAAO,cAAc,MAAM,GAAG;AAC9C,MAAI,KAAK,SAAS,YAAY,MAAM,OAAQ,OAAM,QAAQ;AAC1D,QAAM,cAAc,KAAK,SAAS,kBAAkB;AACpD,MAAI,YAAa,OAAM,cAAc,cAAc,aAAa,EAAE;AAClE,QAAM,WAAW,WAAW,KAAK,SAAS,eAAe,CAAC;AAC1D,MAAI,OAAO,aAAa,SAAU,OAAM,WAAW;AACnD,QAAM,WAAW,WAAW,KAAK,SAAS,eAAe,CAAC;AAC1D,MAAI,OAAO,aAAa,SAAU,OAAM,WAAW;AACnD,QAAM,WAAW,WAAW,KAAK,SAAS,eAAe,CAAC;AAC1D,MAAI,OAAO,aAAa,SAAU,OAAM,WAAW;AACnD,QAAM,YAAY,KAAK,SAAS,gBAAgB;AAChD,MAAI,UAAW,OAAM,YAAY,cAAc,WAAW,GAAG;AAC7D,SAAO;AACT;AAEA,SAAS,WAAW,OAA0C;AAC5D,MAAI,UAAU,QAAQ,MAAM,KAAK,MAAM,GAAI,QAAO;AAClD,QAAM,SAAS,OAAO,KAAK;AAC3B,SAAO,OAAO,SAAS,MAAM,IAAI,SAAS;AAC5C;AAEA,SAAS,cAAc,SAAkB,MAAqB,WAA6B;AACzF,MAAI,QAAQ,iBAAiB,IAAI,IAAI,EAAG,QAAO;AAC/C,MAAI,UAAW,QAAO;AACtB,SAAO,CAAC,UAAU,SAAS,UAAU,UAAU,EAAE,SAAS,QAAQ,IAAI;AACxE;AAEA,SAAS,YAAY,SAAkB,MAA8B;AACnE,MAAI,KAAK,SAAS,UAAU,MAAM,KAAM,QAAO;AAC/C,QAAM,WAAW,KAAK,SAAS,UAAU;AACzC,MAAI,aAAa,QAAQ,OAAO,QAAQ,KAAK,EAAG,QAAO;AACvD,MAAI,QAAQ,iBAAiB,IAAI,IAAI,EAAG,QAAO;AAC/C,SAAO,QAAQ,SAAS,OAAO,KAAK,SAAS,MAAM,MAAM;AAC3D;AAEA,SAAS,SAAS,SAA2B;AAC3C,MAAI,KAAK,SAAS,QAAQ,MAAM,KAAM,QAAO;AAC7C,MAAI,KAAK,SAAS,aAAa,MAAM,OAAQ,QAAO;AACpD,QAAM,QAAQ,KAAK,SAAS,OAAO;AACnC,SAAO,QAAQ,mBAAmB,KAAK,KAAK,IAAI;AAClD;AAEA,SAAS,WAAW,SAA2B;AAC7C,QAAM,QAAQ;AAAA,IACZ,KAAK,SAAS,IAAI;AAAA,IAClB,KAAK,SAAS,OAAO;AAAA,IACrB,KAAK,SAAS,YAAY;AAAA,IAC1B,KAAK,SAAS,OAAO;AAAA,IACrB,KAAK,SAAS,aAAa;AAAA,EAC7B,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,EAAE,YAAY;AACxC,SAAO,0FAA0F,KAAK,KAAK,KACtG,kBAAkB,KAAK,KAAK;AACnC;AAEA,SAAS,oBAAoB,SAA2B;AACtD,MAAI,QAAQ,SAAS,SAAU,QAAO;AACtC,MAAI,QAAQ,SAAS,UAAU,QAAQ,SAAS,UAAW,QAAO;AAClE,QAAM,OAAO,WAAW,KAAK,SAAS,MAAM,CAAC;AAC7C,MAAI,SAAS,UAAU,SAAS,UAAW,QAAO;AAClD,QAAM,QAAQ;AAAA,IACZ,KAAK,SAAS,IAAI;AAAA,IAClB,KAAK,SAAS,OAAO;AAAA,IACrB,KAAK,SAAS,YAAY;AAAA,IAC1B,KAAK,SAAS,OAAO;AAAA,EACvB,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,EAAE,YAAY;AACxC,MAAI,CAAC,MAAO,QAAO;AACnB,MAAI,8EAA8E,KAAK,KAAK,EAAG,QAAO;AACtG,SAAO,uBAAuB,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK;AAC9D;AAEA,SAAS,yBAAyB,SAA2B;AAC3D,MAAI,QAAQ,SAAS,QAAS,QAAO;AACrC,QAAM,QAAQ;AAAA,IACZ,KAAK,SAAS,IAAI;AAAA,IAClB,KAAK,SAAS,OAAO;AAAA,IACrB,KAAK,SAAS,YAAY;AAAA,IAC1B,KAAK,SAAS,OAAO;AAAA,EACvB,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,EAAE,YAAY;AACxC,SAAO,oBAAoB,KAAK,KAAK,KAAK,yBAAyB,KAAK,KAAK;AAC/E;AAEA,SAAS,wBAAwB,SAAkB,SAA6C;AAC9F,QAAM,WAAW,iCAAiC,SAAS,OAAO;AAClE,MAAI,SAAS,WAAW,EAAG,QAAO;AAClC,SAAO,cAAc,SAAS,QAAQ,MAAM,QAAQ;AACtD;AAEA,SAAS,iCAAiC,SAAkB,SAAwC;AAClG,QAAM,WAA2B,CAAC;AAClC,aAAW,SAAS,QAAQ,UAAU;AACpC,QAAI,CAAC,UAAU,KAAK,EAAG;AACvB,QAAI,kBAAkB,OAAO,OAAO,EAAG;AACvC,QAAI,CAAC,QAAQ,QAAQ,iBAAiB,SAAS,KAAK,EAAG;AACvD,QAAI,QAAQ,QAAQ,oBAAoB,WAAW,KAAK,EAAG;AAC3D,UAAM,OAAO,QAAQ,KAAK;AAC1B,UAAM,YAAY,YAAY,OAAO,IAAI;AACzC,UAAM,cAAc,cAAc,OAAO,MAAM,SAAS;AACxD,UAAM,OAAO,OAAO,YAAY,OAAO,MAAM,OAAO,IAAI;AACxD,QAAI,QAAQ,SAAS,eAAe,SAAS,aAAa,SAAS,QAAQ;AACzE,YAAM,OAAqB;AAAA,QACzB,IAAI,OAAO,OAAO;AAAA,QAClB,KAAK,MAAM;AAAA,QACX;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,UAAU,YAAY,KAAK;AAAA,QAC3B,OAAO,SAAS,KAAK;AAAA,QACrB,UAAU,CAAC;AAAA,MACb;AACA,YAAM,cAAc,mBAAmB,OAAO,OAAO;AACrD,UAAI,YAAa,MAAK,cAAc;AACpC,YAAM,QAAQ,SAAS,KAAK;AAC5B,UAAI,MAAO,MAAK,QAAQ;AACxB,YAAM,QAAQ,SAAS,KAAK;AAC5B,UAAI,OAAO,KAAK,KAAK,EAAE,SAAS,EAAG,MAAK,QAAQ;AAChD,UAAI,QAAQ,QAAQ,kBAAmB,MAAK,aAAa,EAAE,GAAG,MAAM,QAAQ;AAC5E,eAAS,KAAK,IAAI;AAClB;AAAA,IACF;AACA,aAAS,KAAK,GAAG,iCAAiC,OAAO,OAAO,CAAC;AAAA,EACnE;AACA,SAAO;AACT;AAEA,SAAS,sBAAsB,SAA2B;AACxD,SAAO,KAAK,SAAS,YAAY,MAAM,QAAQ,KAAK,SAAS,iBAAiB,MAAM,QAAQ,KAAK,SAAS,OAAO,MAAM;AACzH;AAEA,SAAS,WAAW,SAAkB,WAA2B;AAC/D,SAAO;AAAA,IACL,QAAQ,SACL,OAAO,MAAM,EACb,IAAI,CAAC,SAAS,KAAK,IAAI,EACvB,KAAK,GAAG;AAAA,IACX;AAAA,EACF;AACF;AAEA,SAAS,eAAe,SAAkB,SAAyB,UAAiC,CAAC,GAAW;AAC9G,QAAM,QAAkB,CAAC;AACzB,QAAM,iBAAiB,QAAQ,SAAS,KAAK,CAAC,UAA4B,UAAU,KAAK,KAAK,4BAA4B,KAAK,CAAC;AAChI,MAAI,kBAAkB,SAAS;AAC7B,UAAM,sBAAsB,QAAQ;AACpC,YAAQ,kBAAkB,uBAAuB,OAAO;AACxD,0BAAsB,eAAe,UAAU,OAAO,SAAS,OAAO;AACtE,YAAQ,kBAAkB;AAC1B,WAAO,MAAM,KAAK,GAAG;AAAA,EACvB;AACA,wBAAsB,QAAQ,UAAU,OAAO,SAAS,OAAO;AAC/D,SAAO,MAAM,KAAK,GAAG;AACvB;AAEA,SAAS,sBAAsB,OAAkB,OAAiB,SAAyB,UAAiC,CAAC,GAAS;AACpI,aAAW,QAAQ,OAAO;AACxB,QAAI,OAAO,IAAI,GAAG;AAChB,YAAM,KAAK,KAAK,IAAI;AACpB;AAAA,IACF;AACA,QAAI,CAAC,UAAU,IAAI,EAAG;AACtB,UAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,QAAI,UAAU,QAAQ,YAAY,IAAI,MAAM,EAAG;AAC/C,QAAI,KAAK,SAAS,UAAU,SAAS,iBAAiB;AACpD,YAAM,WAAW,KAAK,MAAM,MAAM,KAAK;AACvC,YAAM,WAAW,QAAQ,gBAAgB,IAAI,QAAQ,KAAK,CAAC;AAC3D,4BAAsB,SAAS,SAAS,IAAI,WAAW,KAAK,UAAU,OAAO,SAAS,OAAO;AAC7F;AAAA,IACF;AACA,QAAI,gBAAgB,IAAI,KAAK,IAAI,KAAK,KAAK,SAAS,WAAY;AAChE,0BAAsB,KAAK,UAAU,OAAO,SAAS,OAAO;AAAA,EAC9D;AACF;AAEA,SAAS,cAAc,OAAe,WAA2B;AAC/D,QAAM,aAAa,MAAM,QAAQ,QAAQ,GAAG,EAAE,KAAK;AACnD,SAAO,WAAW,SAAS,YAAY,GAAG,WAAW,MAAM,GAAG,YAAY,CAAC,CAAC,QAAQ;AACtF;AAEA,SAAS,mBAAmB,SAAkB,SAAgC;AAC5E,QAAM,cAAc,KAAK,SAAS,kBAAkB;AACpD,MAAI,aAAa;AACf,UAAM,OAAO,YACV,MAAM,KAAK,EACX,IAAI,CAAC,OAAO,QAAQ,IAAI,IAAI,EAAE,CAAC,EAC/B,OAAO,CAAC,SAA0B,QAAQ,IAAI,CAAC,EAC/C,IAAI,CAAC,SAAS,eAAe,MAAM,OAAO,CAAC,EAC3C,OAAO,OAAO,EACd,KAAK,GAAG;AACX,QAAI,KAAM,QAAO,cAAc,MAAM,QAAQ,QAAQ,aAAa;AAAA,EACpE;AACA,SAAO,cAAc,KAAK,SAAS,OAAO,KAAK,IAAI,QAAQ,QAAQ,aAAa;AAClF;AAEA,SAAS,SAAS,SAA0B;AAC1C,SAAO,cAAc,KAAK,SAAS,OAAO,KAAK,KAAK,SAAS,gBAAgB,KAAK,KAAK,SAAS,eAAe,KAAK,IAAI,GAAG;AAC7H;AAEA,SAAS,YAAY,SAA0B;AAC7C,QAAM,KAAK,KAAK,SAAS,IAAI;AAC7B,MAAI,GAAI,QAAO,IAAI,UAAU,EAAE,CAAC;AAChC,QAAM,SAAS,QAAQ;AACvB,MAAI,CAAC,UAAU,EAAE,cAAc,QAAS,QAAO,QAAQ;AACvD,QAAM,WAAW,OAAO,SAAS,OAAO,CAAC,SAA0B,UAAU,IAAI,KAAK,KAAK,SAAS,QAAQ,IAAI;AAChH,QAAM,QAAQ,SAAS,QAAQ,OAAO;AACtC,SAAO,QAAQ,IAAI,GAAG,QAAQ,IAAI,gBAAgB,QAAQ,CAAC,MAAM,QAAQ;AAC3E;AAEA,SAAS,SAAS,SAA0B;AAC1C,QAAM,QAAkB,CAAC;AACzB,MAAI,UAA0B;AAC9B,SAAO,SAAS;AACd,UAAM,SAAyB,QAAQ;AAEvC,QAAI,CAAC,UAAU,EAAE,cAAc,SAAS;AACtC,YAAM,QAAQ,QAAQ,IAAI;AAC1B;AAAA,IACF;AACA,UAAM,WAAW,OAAO,SAAS,OAAO,CAAC,SAA0B,UAAU,IAAI,KAAK,KAAK,SAAS,SAAS,IAAI;AACjH,UAAM,QAAQ,SAAS,QAAQ,OAAO,IAAI;AAC1C,UAAM,QAAQ,GAAG,QAAQ,IAAI,IAAI,KAAK,GAAG;AACzC,cAAU,UAAU,MAAM,IAAI,SAAS;AAAA,EACzC;AACA,SAAO,IAAI,MAAM,KAAK,GAAG,CAAC;AAC5B;AAEA,SAAS,cAAc,SAAwB,KAAa,UAAwC;AAClG,SAAO;AAAA,IACL,IAAI,OAAO,OAAO;AAAA,IAClB;AAAA,IACA,MAAM;AAAA,IACN,MAAM;AAAA,IACN,aAAa;AAAA,IACb,WAAW;AAAA,IACX;AAAA,EACF;AACF;AAGA,SAAS,gBAAgB,SAAwB,KAAa,mBAAyC;AACrG,SAAO;AAAA,IACL,IAAI,OAAO,OAAO;AAAA,IAClB;AAAA,IACA,MAAM;AAAA,IACN,MAAM;AAAA,IACN,aAAa;AAAA,IACb,WAAW;AAAA,IACX,UAAU,CAAC;AAAA,IACX;AAAA,EACF;AACF;AAGA,SAAS,YAAY,SAAwB,SAA+B;AAC1E,SAAO;AAAA,IACL,IAAI,OAAO,OAAO;AAAA,IAClB,KAAK;AAAA,IACL,MAAM;AAAA,IACN,MAAM,GAAG,OAAO;AAAA,IAChB,aAAa;AAAA,IACb,WAAW;AAAA,IACX,UAAU,CAAC;AAAA,EACb;AACF;AAEA,SAAS,OAAO,SAAgC;AAC9C,SAAO,UAAU,QAAQ,QAAQ;AACnC;AAEA,SAAS,KAAK,SAAkB,MAA6B;AAC3D,SAAO,OAAO,UAAU,eAAe,KAAK,QAAQ,SAAS,IAAI,IAAI,QAAQ,QAAQ,IAAI,KAAK,KAAK;AACrG;AAEA,SAAS,WAAW,OAAqC;AACvD,SAAO,OAAO,KAAK,EAAE,MAAM,KAAK,EAAE,CAAC,KAAK;AAC1C;AAEA,SAAS,UAAU,OAAuB;AACxC,SAAO,MAAM,QAAQ,mBAAmB,CAAC,SAAS,KAAK,IAAI,EAAE;AAC/D;AAEA,SAAS,UAAU,MAAgC;AACjD,SAAO,KAAK,SAAS,SAAS,KAAK,SAAS,YAAY,KAAK,SAAS;AACxE;AAEA,SAAS,OAAO,MAA6B;AAC3C,SAAO,KAAK,SAAS;AACvB;AAEA,SAAS,YAAY,OAAkB,MAAmC;AACxE,aAAW,QAAQ,OAAO;AACxB,QAAI,CAAC,UAAU,IAAI,EAAG;AACtB,QAAI,KAAK,SAAS,KAAM,QAAO;AAC/B,UAAM,QAAQ,YAAY,KAAK,UAAU,IAAI;AAC7C,QAAI,MAAO,QAAO;AAAA,EACpB;AACA,SAAO;AACT;AAEA,SAAS,aAAa,UAA8B;AAClD,SAAO,IAAI,WAAW,YAAY,CAAC,GAAG,QAAQ;AAChD;","names":["linkFarmSummary","label"]}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
type CliIO = {
|
|
3
|
+
fetch?: typeof fetch;
|
|
4
|
+
stdin?: NodeJS.ReadStream;
|
|
5
|
+
stdout?: Pick<NodeJS.WriteStream, "write">;
|
|
6
|
+
stderr?: Pick<NodeJS.WriteStream, "write">;
|
|
7
|
+
};
|
|
8
|
+
declare function runCli(argv: string[], io?: CliIO): Promise<number>;
|
|
9
|
+
|
|
10
|
+
export { runCli };
|