@nexface/tools 0.1.5 → 0.1.6

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.
Files changed (46) hide show
  1. package/dist/browser/actions.d.ts +8 -0
  2. package/dist/browser/actions.js +73 -0
  3. package/dist/browser/actions.js.map +1 -0
  4. package/dist/browser/controller.d.ts +1 -1
  5. package/dist/browser/controller.js +49 -8
  6. package/dist/browser/controller.js.map +1 -1
  7. package/dist/browser/diagnostics.d.ts +1 -0
  8. package/dist/browser/diagnostics.js +20 -0
  9. package/dist/browser/diagnostics.js.map +1 -0
  10. package/dist/browser/dom.js +12 -4
  11. package/dist/browser/dom.js.map +1 -1
  12. package/dist/browser/focus.d.ts +2 -0
  13. package/dist/browser/focus.js +14 -0
  14. package/dist/browser/focus.js.map +1 -1
  15. package/dist/browser/prompt.d.ts +1 -1
  16. package/dist/browser/prompt.generated.d.ts +1 -1
  17. package/dist/browser/prompt.generated.js +9 -2
  18. package/dist/browser/prompt.generated.js.map +1 -1
  19. package/dist/browser/snapshot.d.ts +2 -2
  20. package/dist/browser/snapshot.js +11 -3
  21. package/dist/browser/snapshot.js.map +1 -1
  22. package/dist/browser/toolset.d.ts +4 -1
  23. package/dist/browser/toolset.js +164 -70
  24. package/dist/browser/toolset.js.map +1 -1
  25. package/dist/browser/types.d.ts +21 -2
  26. package/dist/browser/types.js.map +1 -1
  27. package/dist/definition.js +3 -5
  28. package/dist/definition.js.map +1 -1
  29. package/dist/errors.d.ts +1 -1
  30. package/dist/errors.js +1 -0
  31. package/dist/errors.js.map +1 -1
  32. package/dist/internal.d.ts +1 -1
  33. package/dist/internal.js +1 -1
  34. package/dist/internal.js.map +1 -1
  35. package/dist/operation-lock.js +3 -1
  36. package/dist/operation-lock.js.map +1 -1
  37. package/dist/operation-surface.js +49 -3
  38. package/dist/operation-surface.js.map +1 -1
  39. package/dist/operation-view.d.ts +2 -1
  40. package/dist/operation-view.js +54 -33
  41. package/dist/operation-view.js.map +1 -1
  42. package/dist/runtime.d.ts +2 -0
  43. package/dist/runtime.js +27 -6
  44. package/dist/runtime.js.map +1 -1
  45. package/dist/styles.css +3 -0
  46. package/package.json +1 -1
@@ -0,0 +1,8 @@
1
+ import type { PageActionCandidate, PageCommand, SemanticState } from "./types.js";
2
+ export interface ObservedAction {
3
+ candidate: PageActionCandidate;
4
+ command: Pick<PageCommand, "target" | "method" | "args">;
5
+ optionElement?: HTMLOptionElement;
6
+ }
7
+ export declare function collectElementActions(actions: Map<string, ObservedAction>, ref: string, element: Element, role: string, label: string, state: SemanticState, scrollable: boolean): void;
8
+ export declare function collectPageActions(actions: Map<string, ObservedAction>): void;
@@ -0,0 +1,73 @@
1
+ import { computeName } from "./dom.js";
2
+ export function collectElementActions(actions, ref, element, role, label, state, scrollable) {
3
+ const target = { type: "ref", ref };
4
+ const add = (operation, method, args, option, optionElement) => {
5
+ if (actions.size >= 240)
6
+ return;
7
+ const id = `a${actions.size + 1}`;
8
+ actions.set(id, {
9
+ candidate: { id, operation, ref, role, label: (optionElement ? `${label} / ${option}` : label).slice(0, 500), state, ...(option === undefined ? {} : { option: option.slice(0, 500) }) },
10
+ command: { target, method, args },
11
+ ...(optionElement ? { optionElement } : {}),
12
+ });
13
+ };
14
+ if (state.disabled || element.closest('[inert],[aria-disabled="true"]') || element.matches(":disabled"))
15
+ return;
16
+ if (scrollable) {
17
+ if (element.scrollTop > 0)
18
+ add("scrollUp", "scrollBy", [{ y: -560 }]);
19
+ if (element.scrollTop + element.clientHeight < element.scrollHeight - 1)
20
+ add("scrollDown", "scrollBy", [{ y: 560 }]);
21
+ return;
22
+ }
23
+ if (element instanceof HTMLInputElement && ["password", "file", "hidden"].includes(element.type))
24
+ return;
25
+ if (element instanceof HTMLOptionElement)
26
+ return;
27
+ if (element instanceof HTMLSelectElement) {
28
+ const counts = new Map();
29
+ for (const option of element.options)
30
+ counts.set(option.value, (counts.get(option.value) ?? 0) + 1);
31
+ for (const option of element.options) {
32
+ if (element.multiple) {
33
+ if (counts.get(option.value) === 1 && !option.disabled && !option.closest("optgroup[disabled]")) {
34
+ add(option.selected ? "uncheck" : "check", "setOptionSelected", [option.value, !option.selected, option.label], option.label, option);
35
+ }
36
+ continue;
37
+ }
38
+ if (counts.get(option.value) === 1 && !(element.required && option.value === "") && !option.disabled && !option.selected && !option.closest("optgroup[disabled]"))
39
+ add("select", "selectOption", [option.value], option.label);
40
+ }
41
+ return;
42
+ }
43
+ if (role === "option" && element.closest('[role="listbox"]')?.getAttribute("aria-multiselectable") === "true"
44
+ && ["true", "false"].includes(element.getAttribute("aria-selected") ?? "")) {
45
+ const field = computeName(element.closest('[role="listbox"]'));
46
+ label = field ? `${field} / ${label}` : label;
47
+ add(state.selected ? "uncheck" : "check", state.selected ? "uncheck" : "check", []);
48
+ return;
49
+ }
50
+ if (role === "checkbox" || role === "switch" || role === "radio") {
51
+ if (state.checked !== true)
52
+ add("check", "check", []);
53
+ else if (role !== "radio")
54
+ add("uncheck", "uncheck", []);
55
+ return;
56
+ }
57
+ const editable = element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement || (element instanceof HTMLElement && element.isContentEditable);
58
+ if (editable && !("readOnly" in element && element.readOnly) && element.getAttribute("aria-readonly") !== "true" && ["textbox", "searchbox", "combobox", "spinbutton"].includes(role)) {
59
+ add("fill", "fill", []);
60
+ }
61
+ add("click", "click", []);
62
+ }
63
+ export function collectPageActions(actions) {
64
+ const add = (id, operation, method, args) => {
65
+ actions.set(id, { candidate: { id, operation, label: operation, role: "page", state: {} }, command: { target: { type: "page" }, method, args } });
66
+ };
67
+ if (window.scrollY > 0)
68
+ add("pageUp", "scrollUp", "scrollBy", [{ y: -560 }]);
69
+ if (window.scrollY + window.innerHeight < document.documentElement.scrollHeight - 1)
70
+ add("pageDown", "scrollDown", "scrollBy", [{ y: 560 }]);
71
+ add("wait", "wait", "waitForTimeout", [100]);
72
+ }
73
+ //# sourceMappingURL=actions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actions.js","sourceRoot":"","sources":["../../src/browser/actions.ts"],"names":[],"mappings":"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","sourcesContent":["import type { PageActionCandidate, PageCommand, SemanticState } from \"./types.js\";\nimport { computeName } from \"./dom.js\";\n\nexport interface ObservedAction {\n candidate: PageActionCandidate;\n command: Pick<PageCommand, \"target\" | \"method\" | \"args\">;\n optionElement?: HTMLOptionElement;\n}\n\nexport function collectElementActions(\n actions: Map<string, ObservedAction>,\n ref: string,\n element: Element,\n role: string,\n label: string,\n state: SemanticState,\n scrollable: boolean,\n): void {\n const target = { type: \"ref\", ref } as const;\n const add = (operation: PageActionCandidate[\"operation\"], method: PageCommand[\"method\"], args: unknown[], option?: string, optionElement?: HTMLOptionElement): void => {\n if (actions.size >= 240) return;\n const id = `a${actions.size + 1}`;\n actions.set(id, {\n candidate: { id, operation, ref, role, label: (optionElement ? `${label} / ${option}` : label).slice(0, 500), state, ...(option === undefined ? {} : { option: option.slice(0, 500) }) },\n command: { target, method, args },\n ...(optionElement ? { optionElement } : {}),\n });\n };\n if (state.disabled || element.closest('[inert],[aria-disabled=\"true\"]') || element.matches(\":disabled\")) return;\n if (scrollable) {\n if (element.scrollTop > 0) add(\"scrollUp\", \"scrollBy\", [{ y: -560 }]);\n if (element.scrollTop + element.clientHeight < element.scrollHeight - 1) add(\"scrollDown\", \"scrollBy\", [{ y: 560 }]);\n return;\n }\n if (element instanceof HTMLInputElement && [\"password\", \"file\", \"hidden\"].includes(element.type)) return;\n if (element instanceof HTMLOptionElement) return;\n if (element instanceof HTMLSelectElement) {\n const counts = new Map<string, number>();\n for (const option of element.options) counts.set(option.value, (counts.get(option.value) ?? 0) + 1);\n for (const option of element.options) {\n if (element.multiple) {\n if (counts.get(option.value) === 1 && !option.disabled && !option.closest(\"optgroup[disabled]\")) {\n add(option.selected ? \"uncheck\" : \"check\", \"setOptionSelected\", [option.value, !option.selected, option.label], option.label, option);\n }\n continue;\n }\n if (counts.get(option.value) === 1 && !(element.required && option.value === \"\") && !option.disabled && !option.selected && !option.closest(\"optgroup[disabled]\")) add(\"select\", \"selectOption\", [option.value], option.label);\n }\n return;\n }\n if (role === \"option\" && element.closest('[role=\"listbox\"]')?.getAttribute(\"aria-multiselectable\") === \"true\"\n && [\"true\", \"false\"].includes(element.getAttribute(\"aria-selected\") ?? \"\")) {\n const field = computeName(element.closest('[role=\"listbox\"]')!);\n label = field ? `${field} / ${label}` : label;\n add(state.selected ? \"uncheck\" : \"check\", state.selected ? \"uncheck\" : \"check\", []);\n return;\n }\n if (role === \"checkbox\" || role === \"switch\" || role === \"radio\") {\n if (state.checked !== true) add(\"check\", \"check\", []);\n else if (role !== \"radio\") add(\"uncheck\", \"uncheck\", []);\n return;\n }\n const editable = element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement || (element instanceof HTMLElement && element.isContentEditable);\n if (editable && !(\"readOnly\" in element && element.readOnly) && element.getAttribute(\"aria-readonly\") !== \"true\" && [\"textbox\", \"searchbox\", \"combobox\", \"spinbutton\"].includes(role)) {\n add(\"fill\", \"fill\", []);\n }\n add(\"click\", \"click\", []);\n}\n\nexport function collectPageActions(actions: Map<string, ObservedAction>): void {\n const add = (id: string, operation: PageActionCandidate[\"operation\"], method: PageCommand[\"method\"], args: unknown[]): void => {\n actions.set(id, { candidate: { id, operation, label: operation, role: \"page\", state: {} }, command: { target: { type: \"page\" }, method, args } });\n };\n if (window.scrollY > 0) add(\"pageUp\", \"scrollUp\", \"scrollBy\", [{ y: -560 }]);\n if (window.scrollY + window.innerHeight < document.documentElement.scrollHeight - 1) add(\"pageDown\", \"scrollDown\", \"scrollBy\", [{ y: 560 }]);\n add(\"wait\", \"wait\", \"waitForTimeout\", [100]);\n}\n"]}
@@ -19,7 +19,7 @@ export declare class PageController {
19
19
  completeExecution(executionId: string): ExecutionReceipt;
20
20
  private requireActive;
21
21
  private validateCommand;
22
- execute(command: PageCommand): Promise<CommandResponse>;
22
+ execute(command: PageCommand, beforeAction?: () => Promise<void>): Promise<CommandResponse>;
23
23
  private executePage;
24
24
  private resolveRef;
25
25
  private locator;
@@ -1,4 +1,5 @@
1
- import { focusForAgent } from "./focus.js";
1
+ import { measurePagePhase } from "./diagnostics.js";
2
+ import { focusForAgent, withAgentActivation } from "./focus.js";
2
3
  import { createIdentity, createScrollableIdentity, getElementScrollability, normalizeText, } from "./dom.js";
3
4
  import { PageCommandError, findElementHitTarget, prepareLocatorForAction, prepareRefForAction, requireUnique, requireValidRef, resolveLocator, waitForLocator, } from "./locator.js";
4
5
  const LOCATOR_METHODS = new Set([
@@ -8,6 +9,7 @@ const LOCATOR_METHODS = new Set([
8
9
  "check",
9
10
  "uncheck",
10
11
  "selectOption",
12
+ "setOptionSelected",
11
13
  "hover",
12
14
  "focus",
13
15
  "blur",
@@ -32,6 +34,7 @@ const ACTION_METHODS = new Set([
32
34
  "check",
33
35
  "uncheck",
34
36
  "selectOption",
37
+ "setOptionSelected",
35
38
  "hover",
36
39
  "focus",
37
40
  "blur",
@@ -101,7 +104,7 @@ function dispatchClickSequence(element) {
101
104
  }));
102
105
  hitTarget.dispatchEvent(new MouseEvent("mouseup", { ...init, buttons: 0 }));
103
106
  if (hitTarget instanceof HTMLElement) {
104
- hitTarget.click();
107
+ withAgentActivation(() => hitTarget.click());
105
108
  return;
106
109
  }
107
110
  hitTarget.dispatchEvent(new MouseEvent("click", { ...init, buttons: 0 }));
@@ -201,6 +204,10 @@ function validateArgs(command, maxChars) {
201
204
  throw invalidCommand("selectOption() array values must be strings.");
202
205
  }
203
206
  }
207
+ if (command.method === "setOptionSelected" && (command.args.length !== 3
208
+ || typeof command.args[0] !== "string" || typeof command.args[1] !== "boolean" || typeof command.args[2] !== "string")) {
209
+ throw invalidCommand("Invalid observed option selection.");
210
+ }
204
211
  if (command.method === "waitFor") {
205
212
  const options = command.args[0];
206
213
  if (command.args.length > 1 ||
@@ -379,13 +386,22 @@ export class PageController {
379
386
  }
380
387
  validateArgs(command, this.limits.maxArgumentChars);
381
388
  }
382
- async execute(command) {
389
+ async execute(command, beforeAction) {
383
390
  let record = this.executions.get(command.executionId);
391
+ let presentationFailed = false;
384
392
  try {
385
393
  record = this.requireActive(command);
386
394
  const value = command.target.type === "page"
387
395
  ? await this.executePage(command, record)
388
- : await this.executeTarget(command, record);
396
+ : await this.executeTarget(command, record, beforeAction && (async () => {
397
+ try {
398
+ await beforeAction();
399
+ }
400
+ catch (error) {
401
+ presentationFailed = true;
402
+ throw error;
403
+ }
404
+ }));
389
405
  if (ACTION_METHODS.has(command.method) &&
390
406
  !record.completedActions.some((action) => action.callIndex === command.commandSeq)) {
391
407
  this.recordCompletedAction(record, command);
@@ -401,13 +417,15 @@ export class PageController {
401
417
  ...(target ? { target } : {}),
402
418
  };
403
419
  }
420
+ if (presentationFailed)
421
+ throw error;
404
422
  if (error instanceof PageCommandError) {
405
423
  return { ok: false, error: error.detail };
406
424
  }
407
425
  return {
408
426
  ok: false,
409
427
  error: {
410
- code: "UNSUPPORTED_OPERATION",
428
+ code: "EXECUTION_OUTCOME_UNKNOWN",
411
429
  message: error instanceof Error ? error.message : String(error),
412
430
  },
413
431
  };
@@ -426,7 +444,7 @@ export class PageController {
426
444
  if (command.method === "waitForTimeout") {
427
445
  const requested = Number(command.args[0] ?? 0);
428
446
  const duration = Math.max(0, Math.min(requested, this.limits.singleActionTimeoutMs));
429
- await new Promise((resolve, reject) => {
447
+ await measurePagePhase("explicit-wait", () => new Promise((resolve, reject) => {
430
448
  const onAbort = () => {
431
449
  window.clearTimeout(timer);
432
450
  reject(new PageCommandError({
@@ -441,7 +459,7 @@ export class PageController {
441
459
  record.abortController.signal.addEventListener("abort", onAbort, {
442
460
  once: true,
443
461
  });
444
- });
462
+ }));
445
463
  return null;
446
464
  }
447
465
  if (command.method === "waitForURL") {
@@ -503,7 +521,7 @@ export class PageController {
503
521
  ? command.target.locator
504
522
  : undefined;
505
523
  }
506
- async executeTarget(command, record) {
524
+ async executeTarget(command, record, beforeAction) {
507
525
  const signal = record.abortController.signal;
508
526
  const ref = this.resolveRef(command, record);
509
527
  const locator = this.locator(command);
@@ -656,6 +674,8 @@ export class PageController {
656
674
  if (!element)
657
675
  throw invalidCommand("Target is missing.");
658
676
  this.requireStillActive(record);
677
+ await beforeAction?.();
678
+ this.requireStillActive(record);
659
679
  this.animator.before(command.method, element);
660
680
  this.requireStillActive(record);
661
681
  const result = this.performAction(element, command);
@@ -716,6 +736,13 @@ export class PageController {
716
736
  }
717
737
  if (command.method === "check" || command.method === "uncheck") {
718
738
  const checked = command.method === "check";
739
+ if (element.getAttribute("role") === "option"
740
+ && element.closest('[role="listbox"]')?.getAttribute("aria-multiselectable") === "true"
741
+ && ["true", "false"].includes(element.getAttribute("aria-selected") ?? "")) {
742
+ if ((element.getAttribute("aria-selected") === "true") !== checked)
743
+ dispatchClickSequence(element);
744
+ return null;
745
+ }
719
746
  if (element instanceof HTMLInputElement &&
720
747
  ["checkbox", "radio"].includes(element.type)) {
721
748
  if (element.type === "radio" && !checked) {
@@ -740,6 +767,20 @@ export class PageController {
740
767
  message: `${command.method}() target is not checkable.`,
741
768
  });
742
769
  }
770
+ if (command.method === "setOptionSelected") {
771
+ const [value, selected, label] = command.args;
772
+ const options = element instanceof HTMLSelectElement && element.multiple
773
+ ? [...element.options].filter((option) => option.value === value) : [];
774
+ const option = options[0];
775
+ if (options.length !== 1 || !option || option.label !== label || option.disabled || option.closest("optgroup[disabled]")) {
776
+ throw invalidCommand("The observed multiple-select option is no longer available.");
777
+ }
778
+ if (option.selected !== selected) {
779
+ option.selected = selected;
780
+ dispatchInput(element);
781
+ }
782
+ return null;
783
+ }
743
784
  if (command.method === "selectOption") {
744
785
  if (!(element instanceof HTMLSelectElement)) {
745
786
  throw new PageCommandError({
@@ -1 +1 @@
1
- {"version":3,"file":"controller.js","sourceRoot":"","sources":["../../src/browser/controller.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,OAAO,EACL,cAAc,EACd,wBAAwB,EACxB,uBAAuB,EACvB,aAAa,GACd,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,uBAAuB,EACvB,mBAAmB,EACnB,aAAa,EACb,eAAe,EACf,cAAc,EACd,cAAc,GACf,MAAM,cAAc,CAAC;AAmCtB,MAAM,eAAe,GAAG,IAAI,GAAG,CAAgB;IAC7C,OAAO;IACP,MAAM;IACN,OAAO;IACP,OAAO;IACP,SAAS;IACT,cAAc;IACd,OAAO;IACP,OAAO;IACP,MAAM;IACN,UAAU;IACV,UAAU;IACV,gBAAgB;IAChB,QAAQ;IACR,MAAM;IACN,SAAS;CACV,CAAC,CAAC;AAEH,MAAM,YAAY,GAAG,IAAI,GAAG,CAAa;IACvC,UAAU;IACV,gBAAgB;IAChB,YAAY;CACb,CAAC,CAAC;AACH,MAAM,uBAAuB,GAAG,KAAK,CAAC;AACtC,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAChC,MAAM,cAAc,GAAG,IAAI,GAAG,CAA6B;IACzD,OAAO;IACP,MAAM;IACN,OAAO;IACP,OAAO;IACP,SAAS;IACT,cAAc;IACd,OAAO;IACP,OAAO;IACP,MAAM;IACN,gBAAgB;IAChB,UAAU;IACV,UAAU;CACX,CAAC,CAAC;AAEH,SAAS,aAAa,CAAC,OAAgB;IACrC,OAAO,CAAC,aAAa,CACnB,IAAI,UAAU,CAAC,OAAO,EAAE;QACtB,OAAO,EAAE,IAAI;QACb,SAAS,EAAE,YAAY;KACxB,CAAC,CACH,CAAC;IACF,OAAO,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AAChE,CAAC;AAED,SAAS,cAAc,CACrB,OAA+C,EAC/C,KAAa;IAEb,MAAM,SAAS,GACb,OAAO,YAAY,gBAAgB;QACjC,CAAC,CAAC,gBAAgB,CAAC,SAAS;QAC5B,CAAC,CAAC,mBAAmB,CAAC,SAAS,CAAC;IACpC,MAAM,MAAM,GAAG,MAAM,CAAC,wBAAwB,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,GAAG,CAAC;IACxE,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC7B,aAAa,CAAC,OAAO,CAAC,CAAC;AACzB,CAAC;AAED,SAAS,qBAAqB,CAAC,OAAgB;IAC7C,MAAM,GAAG,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAC1C,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,gBAAgB,CAAC;YACzB,IAAI,EAAE,iBAAiB;YACvB,OAAO,EAAE,oDAAoD;SAC9D,CAAC,CAAC;IACL,CAAC;IACD,MAAM,EACJ,OAAO,EAAE,SAAS,EAClB,OAAO,EACP,OAAO,GACR,GAAG,GAAG,CAAC;IAER,MAAM,IAAI,GAAmB;QAC3B,OAAO,EAAE,IAAI;QACb,UAAU,EAAE,IAAI;QAChB,QAAQ,EAAE,IAAI;QACd,IAAI,EAAE,MAAM;QACZ,OAAO;QACP,OAAO;QACP,MAAM,EAAE,CAAC;QACT,MAAM,EAAE,CAAC;KACV,CAAC;IAEF,SAAS,CAAC,aAAa,CACrB,IAAI,YAAY,CAAC,aAAa,EAAE;QAC9B,GAAG,IAAI;QACP,OAAO,EAAE,CAAC;QACV,SAAS,EAAE,CAAC;QACZ,WAAW,EAAE,OAAO;QACpB,SAAS,EAAE,IAAI;KAChB,CAAC,CACH,CAAC;IACF,MAAM,WAAW,GAAG,SAAS,CAAC,aAAa,CACzC,IAAI,UAAU,CAAC,WAAW,EAAE,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CACrD,CAAC;IACF,IACE,WAAW;QACX,OAAO,YAAY,WAAW;QAC9B,OAAO,CAAC,aAAa,CAAC,aAAa,KAAK,OAAO,EAC/C,CAAC;QACD,aAAa,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC;QACnD,MAAM,IAAI,gBAAgB,CAAC;YACzB,IAAI,EAAE,mBAAmB;YACzB,OAAO,EAAE,uCAAuC;SACjD,CAAC,CAAC;IACL,CAAC;IACD,SAAS,CAAC,aAAa,CACrB,IAAI,YAAY,CAAC,WAAW,EAAE;QAC5B,GAAG,IAAI;QACP,OAAO,EAAE,CAAC;QACV,SAAS,EAAE,CAAC;QACZ,WAAW,EAAE,OAAO;QACpB,SAAS,EAAE,IAAI;KAChB,CAAC,CACH,CAAC;IACF,SAAS,CAAC,aAAa,CACrB,IAAI,UAAU,CAAC,SAAS,EAAE,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CACnD,CAAC;IACF,IAAI,SAAS,YAAY,WAAW,EAAE,CAAC;QACrC,SAAS,CAAC,KAAK,EAAE,CAAC;QAClB,OAAO;IACT,CAAC;IACD,SAAS,CAAC,aAAa,CACrB,IAAI,UAAU,CAAC,OAAO,EAAE,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CACjD,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,OAAoB;IACvC,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,KAAK;QAAE,OAAO,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC;IAC7D,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QACtC,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC9D,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,cAAc,CAAC,OAAe;IACrC,OAAO,IAAI,gBAAgB,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,CAAC,CAAC;AACpE,CAAC;AAED,SAAS,eAAe,CAAC,KAAc,EAAE,QAAgB;IACvD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,IAAI,KAAK,CAAC,MAAM,GAAG,QAAQ;YAAE,MAAM,cAAc,CAAC,sBAAsB,CAAC,CAAC;QAC1E,OAAO;IACT,CAAC;IACD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACxC,MAAM,cAAc,CAAC,+CAA+C,CAAC,CAAC;IACxE,CAAC;IACD,MAAM,KAAK,GAAG,KAA8C,CAAC;IAC7D,IACE,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ;QAChC,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,QAAQ;QAC9B,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ;QAC/B,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAClC,CAAC;QACD,MAAM,cAAc,CAAC,2BAA2B,CAAC,CAAC;IACpD,CAAC;IACD,IAAI,CAAC;QACH,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,cAAc,CAAC,sCAAsC,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CACtB,UAA6B,EAC7B,QAAgB;IAEhB,IACE,CAAC,UAAU;QACX,OAAO,UAAU,KAAK,QAAQ;QAC9B,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC;QAChC,UAAU,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAC7B,CAAC;QACD,MAAM,cAAc,CAAC,yCAAyC,CAAC,CAAC;IAClE,CAAC;IACD,IAAI,UAAU,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QACjC,MAAM,cAAc,CAAC,kCAAkC,CAAC,CAAC;IAC3D,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;QACpC,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;gBACxC,MAAM,cAAc,CAAC,0BAA0B,CAAC,CAAC;YACnD,CAAC;YACD,IAAI,IAAI,CAAC,OAAO,EAAE,IAAI,KAAK,SAAS,EAAE,CAAC;gBACrC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YAC/C,CAAC;YACD,SAAS;QACX,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAClD,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YACrC,SAAS;QACX,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC3B,eAAe,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YACxC,SAAS;QACX,CAAC;QACD,MAAM,cAAc,CAAC,uCAAuC,CAAC,CAAC;IAChE,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,OAAoB,EAAE,QAAgB;IAC1D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACjC,MAAM,cAAc,CAAC,gCAAgC,CAAC,CAAC;IACzD,CAAC;IACD,IAAI,UAAkB,CAAC;IACvB,IAAI,CAAC;QACH,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,cAAc,CAAC,oCAAoC,CAAC,CAAC;IAC7D,CAAC;IACD,IAAI,UAAU,CAAC,MAAM,GAAG,QAAQ,EAAE,CAAC;QACjC,MAAM,cAAc,CAAC,6BAA6B,CAAC,CAAC;IACtD,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,IAAI,OAAO,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;QAC5D,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;YACrE,MAAM,cAAc,CAAC,GAAG,OAAO,CAAC,MAAM,kCAAkC,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,KAAK,cAAc,EAAE,CAAC;QACtC,IACE,OAAO,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;YACzB,CAAC,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ;gBAClC,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAClC,CAAC;YACD,MAAM,cAAc,CAAC,mDAAmD,CAAC,CAAC;QAC5E,CAAC;QACD,IACE,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC9B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,EACxD,CAAC;YACD,MAAM,cAAc,CAAC,8CAA8C,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChC,IACE,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC;YACvB,CAAC,OAAO,KAAK,SAAS;gBACpB,CAAC,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAC9E,CAAC;YACD,MAAM,cAAc,CAAC,gCAAgC,CAAC,CAAC;QACzD,CAAC;QACD,MAAM,KAAK,GAAG,OAA6D,CAAC;QAC5E,IACE,KAAK,EAAE,KAAK,KAAK,SAAS;YAC1B,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAChE,CAAC;YACD,MAAM,cAAc,CAAC,6BAA6B,CAAC,CAAC;QACtD,CAAC;QACD,IACE,KAAK,EAAE,OAAO,KAAK,SAAS;YAC5B,CAAC,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ;gBAChC,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC;gBAC/B,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,EACpB,CAAC;YACD,MAAM,cAAc,CAAC,+BAA+B,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,KAAK,gBAAgB,EAAE,CAAC;QACxC,IACE,OAAO,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;YACzB,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ;YACnC,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACjC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,EACnB,CAAC;YACD,MAAM,cAAc,CAAC,oDAAoD,CAAC,CAAC;QAC7E,CAAC;IACH,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC;QACpC,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChC,IACE,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC;YACvB,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC;YACvB,OAAO,QAAQ,KAAK,QAAQ;YAC5B,QAAQ,CAAC,MAAM,KAAK,CAAC;YACrB,CAAC,OAAO,KAAK,SAAS;gBACpB,CAAC,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAC9E,CAAC;YACD,MAAM,cAAc,CAClB,kEAAkE,CACnE,CAAC;QACJ,CAAC;QACD,MAAM,KAAK,GAAG,OAA4C,CAAC;QAC3D,IACE,KAAK;YACL,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,SAAS,CAAC;gBAClD,CAAC,KAAK,CAAC,OAAO,KAAK,SAAS;oBAC1B,CAAC,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ;wBAChC,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC;wBAC/B,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,EAC1B,CAAC;YACD,MAAM,cAAc,CAAC,mCAAmC,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;QAClC,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAA6C,CAAC;QAC1E,IACE,OAAO,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;YACzB,CAAC,KAAK;YACN,OAAO,KAAK,KAAK,QAAQ;YACzB,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YACpB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC;YAC/B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC3D,CAAC,KAAK,CAAC,CAAC,KAAK,SAAS;gBACpB,CAAC,OAAO,KAAK,CAAC,CAAC,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7D,CAAC,KAAK,CAAC,CAAC,KAAK,SAAS;gBACpB,CAAC,OAAO,KAAK,CAAC,CAAC,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAC7D,CAAC;YACD,MAAM,cAAc,CAAC,gDAAgD,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;QAClC,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAkD,CAAC;QAC/E,IACE,OAAO,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;YACzB,CAAC,KAAK;YACN,OAAO,KAAK,KAAK,QAAQ;YACzB,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YACpB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC;YAC/B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAChE,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS;gBACvB,CAAC,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YACnE,CAAC,KAAK,CAAC,GAAG,KAAK,SAAS;gBACtB,CAAC,OAAO,KAAK,CAAC,GAAG,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EACjE,CAAC;YACD,MAAM,cAAc,CAAC,qDAAqD,CAAC,CAAC;QAC9E,CAAC;IACH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,mBAAmB,CAChC,KAAa,EACb,MAAmB;IAEnB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAC9C,MAAM,CAAC,cAAc,EAAE,CAAC;QACxB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,qBAAqB,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAC/E,CAAC;IACD,MAAM,CAAC,cAAc,EAAE,CAAC;AAC1B,CAAC;AAED,MAAM,OAAO,cAAc;IAIN;IACA;IAJF,UAAU,GAAG,IAAI,GAAG,EAA2B,CAAC;IAEjE,YACmB,MAAuB,EACvB,QAAwB;QADxB,WAAM,GAAN,MAAM,CAAiB;QACvB,aAAQ,GAAR,QAAQ,CAAgB;IACxC,CAAC;IAEJ,cAAc,CACZ,WAAmB,EACnB,QAA0B;QAE1B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,WAAW,EAAE;YAC/B,eAAe,EAAE,IAAI,eAAe,EAAE;YACtC,SAAS,EAAE,CAAC;YACZ,gBAAgB,EAAE,EAAE;YACpB,OAAO,EAAE,CAAC;YACV,QAAQ;YACR,MAAM,EAAE,SAAS;SAClB,CAAC,CAAC;IACL,CAAC;IAED,eAAe,CAAC,WAAmB;QACjC,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAChD,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,MAAM,CAAC,MAAM,GAAG,WAAW,CAAC;QAC5B,MAAM,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;IACjC,CAAC;IAED,iBAAiB,CAAC,WAAmB;QACnC,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAChD,IAAI,CAAC,MAAM;YAAE,OAAO,EAAE,gBAAgB,EAAE,EAAE,EAAE,CAAC;QAC7C,MAAM,CAAC,MAAM,GAAG,WAAW,CAAC;QAC5B,MAAM,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;QAC/B,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QACpC,OAAO;YACL,gBAAgB,EAAE,CAAC,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC,IAAI,CACjD,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CACpC;YACD,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAChE,CAAC;IACJ,CAAC;IAEO,aAAa,CAAC,OAAoB;QACxC,IACE,CAAC,OAAO;YACR,OAAO,OAAO,KAAK,QAAQ;YAC3B,OAAO,OAAO,CAAC,WAAW,KAAK,QAAQ;YACvC,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,UAAU,CAAC;YACzC,OAAO,CAAC,UAAU,IAAI,CAAC,EACvB,CAAC;YACD,MAAM,cAAc,CAAC,8BAA8B,CAAC,CAAC;QACvD,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QACxD,IACE,CAAC,MAAM;YACP,MAAM,CAAC,MAAM,KAAK,SAAS;YAC3B,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,EACrC,CAAC;YACD,MAAM,IAAI,gBAAgB,CAAC;gBACzB,IAAI,EAAE,qBAAqB;gBAC3B,OAAO,EAAE,oCAAoC;aAC9C,CAAC,CAAC;QACL,CAAC;QACD,IAAI,OAAO,CAAC,UAAU,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACzC,MAAM,cAAc,CAAC,+CAA+C,CAAC,CAAC;QACxE,CAAC;QACD,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC;QACpC,MAAM,CAAC,SAAS,IAAI,CAAC,CAAC;QACtB,IAAI,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;YAChD,MAAM,cAAc,CAClB,kCAAkC,IAAI,CAAC,MAAM,CAAC,YAAY,IAAI,CAC/D,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAC9B,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,eAAe,CAAC,OAAoB;QAC1C,IACE,CAAC,OAAO,CAAC,MAAM;YACf,OAAO,OAAO,CAAC,MAAM,KAAK,QAAQ;YAClC,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;YACzD,OAAO,OAAO,CAAC,MAAM,KAAK,QAAQ,EAClC,CAAC;YACD,MAAM,cAAc,CAAC,sCAAsC,CAAC,CAAC;QAC/D,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACnC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,MAAoB,CAAC,EAAE,CAAC;gBACpD,MAAM,cAAc,CAAC,4BAA4B,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;YACrE,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,MAAuB,CAAC,EAAE,CAAC;gBAC1D,MAAM,cAAc,CAAC,+BAA+B,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;YACxE,CAAC;YACD,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;gBAClC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;oBACvC,MAAM,cAAc,CAAC,0BAA0B,CAAC,CAAC;gBACnD,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,eAAe,CACb,OAAO,CAAC,MAAM,CAAC,OAAO,EACtB,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAC7B,CAAC;YACJ,CAAC;QACH,CAAC;QACD,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAAoB;QAChC,IAAI,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QACtD,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YACrC,MAAM,KAAK,GACT,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,MAAM;gBAC5B,CAAC,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC;gBACzC,CAAC,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAChD,IACE,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC;gBAClC,CAAC,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAC3B,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,KAAK,OAAO,CAAC,UAAU,CACpD,EACD,CAAC;gBACD,IAAI,CAAC,qBAAqB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAC9C,CAAC;YACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;QAC7B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;gBACjC,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;gBACpC,MAAM,CAAC,UAAU,GAAG;oBAClB,SAAS,EAAE,OAAO,CAAC,UAAU;oBAC7B,MAAM,EAAE,OAAO,CAAC,MAAM;oBACtB,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBAC9B,CAAC;YACJ,CAAC;YACD,IAAI,KAAK,YAAY,gBAAgB,EAAE,CAAC;gBACtC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;YAC5C,CAAC;YACD,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE;oBACL,IAAI,EAAE,uBAAuB;oBAC7B,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;iBAChE;aACF,CAAC;QACJ,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,WAAW,CACvB,OAAoB,EACpB,MAAuB;QAEvB,IAAI,OAAO,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YAClC,MAAM,KAAK,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAA+B,CAAC;YACpE,MAAM,CAAC,QAAQ,CAAC;gBACd,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC;gBAC1B,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC;gBACzB,QAAQ,EAAE,MAAM;aACjB,CAAC,CAAC;YACH,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,KAAK,gBAAgB,EAAE,CAAC;YACxC,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CACvB,CAAC,EACD,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAAC,CACvD,CAAC;YACF,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBAC1C,MAAM,OAAO,GAAG,GAAS,EAAE;oBACzB,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;oBAC3B,MAAM,CACJ,IAAI,gBAAgB,CAAC;wBACnB,IAAI,EAAE,qBAAqB;wBAC3B,OAAO,EAAE,wCAAwC;qBAClD,CAAC,CACH,CAAC;gBACJ,CAAC,CAAC;gBACF,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE;oBACnC,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;oBACpE,OAAO,EAAE,CAAC;gBACZ,CAAC,EAAE,QAAQ,CAAC,CAAC;gBACb,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE;oBAC/D,IAAI,EAAE,IAAI;iBACX,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YACH,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC;YACpC,IAAI,WAAmB,CAAC;YACxB,IAAI,CAAC;gBACH,WAAW,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;YACrE,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,cAAc,CAAC,8BAA8B,CAAC,CAAC;YACvD,CAAC;YACD,MAAM,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAyB,CAAC;YAChE,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CACtB,OAAO,CAAC,OAAO,IAAI,uBAAuB,EAC1C,uBAAuB,EACvB,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAClC,CAAC;YACF,IAAI,QAAQ,CAAC,IAAI,KAAK,WAAW;gBAAE,OAAO,IAAI,CAAC;YAC/C,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBAC1C,IAAI,OAAO,GAAG,KAAK,CAAC;gBACpB,MAAM,OAAO,GAAG,GAAS,EAAE;oBACzB,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;oBAC/B,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;oBAC3B,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBACtE,CAAC,CAAC;gBACF,MAAM,MAAM,GAAG,CAAC,KAAwB,EAAQ,EAAE;oBAChD,IAAI,OAAO;wBAAE,OAAO;oBACpB,OAAO,GAAG,IAAI,CAAC;oBACf,OAAO,EAAE,CAAC;oBACV,IAAI,KAAK;wBAAE,MAAM,CAAC,KAAK,CAAC,CAAC;;wBACpB,OAAO,EAAE,CAAC;gBACjB,CAAC,CAAC;gBACF,MAAM,OAAO,GAAG,GAAS,EAAE,CAAC,MAAM,CAAC,IAAI,gBAAgB,CAAC;oBACtD,IAAI,EAAE,qBAAqB;oBAC3B,OAAO,EAAE,oDAAoD;iBAC9D,CAAC,CAAC,CAAC;gBACJ,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE;oBACvC,IAAI,QAAQ,CAAC,IAAI,KAAK,WAAW;wBAAE,MAAM,EAAE,CAAC;gBAC9C,CAAC,EAAE,oBAAoB,CAAC,CAAC;gBACzB,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,gBAAgB,CAAC;oBAChE,IAAI,EAAE,gBAAgB;oBACtB,OAAO,EAAE,sBAAsB,WAAW,WAAW,OAAO,KAAK;iBAClE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;gBACd,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE;oBAC/D,IAAI,EAAE,IAAI;iBACX,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YACH,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,cAAc,CAAC,4BAA4B,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACrE,CAAC;IAEO,UAAU,CAChB,OAAoB,EACpB,MAAuB;QAEvB,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,KAAK;YAAE,OAAO,SAAS,CAAC;QACpD,OAAO,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACtD,CAAC;IAEO,OAAO,CAAC,OAAoB;QAClC,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS;YACtC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO;YACxB,CAAC,CAAC,SAAS,CAAC;IAChB,CAAC;IAEO,KAAK,CAAC,aAAa,CACzB,OAAoB,EACpB,MAAuB;QAEvB,MAAM,MAAM,GAAG,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC;QAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAEtC,IAAI,OAAO,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YAChC,IAAI,GAAG,EAAE,CAAC;gBACR,IAAI,CAAC;oBACH,eAAe,CAAC,GAAG,CAAC,CAAC;oBACrB,OAAO,IAAI,CAAC;gBACd,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,KAAK,CAAC;gBACf,CAAC;YACH,CAAC;YACD,OAAO,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QAC9D,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACjC,MAAM,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAGrC,CAAC;YACF,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,eAAe,CAAC,GAAG,CAAC,CAAC;gBACrB,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,cAAc,CAClB,OAAO,EACP,OAAO,CAAC,KAAK,IAAI,SAAS,EAC1B,IAAI,CAAC,GAAG,CACN,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,qBAAqB,EACpD,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAClC,EACD,MAAM,CACP,CAAC;YACF,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC9B,MAAM,OAAO,GAAG,GAAG;gBACjB,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC;gBACtB,CAAC,CAAC,OAAO;oBACP,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC;oBACxB,CAAC,CAAC,SAAS,CAAC;YAChB,IAAI,CAAC,OAAO;gBAAE,MAAM,cAAc,CAAC,oBAAoB,CAAC,CAAC;YACzD,IACE,OAAO,YAAY,gBAAgB;gBACnC,OAAO,YAAY,mBAAmB;gBACtC,OAAO,YAAY,iBAAiB,EACpC,CAAC;gBACD,OAAO,OAAO,CAAC,KAAK,CAAC;YACvB,CAAC;YACD,OAAO,aAAa,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAC5C,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,KAAK,gBAAgB,EAAE,CAAC;YACxC,MAAM,OAAO,GAAG,GAAG;gBACjB,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC;gBACtB,CAAC,CAAC,OAAO;oBACP,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC;oBACxB,CAAC,CAAC,SAAS,CAAC;YAChB,IAAI,CAAC,OAAO;gBAAE,MAAM,cAAc,CAAC,oBAAoB,CAAC,CAAC;YACzD,MAAM,cAAc,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;YAC/C,OAAO,CAAC,cAAc,CAAC;gBACrB,KAAK,EAAE,QAAQ;gBACf,MAAM,EAAE,SAAS;gBACjB,QAAQ,EAAE,MAAM;aACjB,CAAC,CAAC;YACH,IAAI,CAAC,qBAAqB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAC5C,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAClC,qBAAqB,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CACvC,CAAC;YACF,MAAM,CAAC,cAAc,EAAE,CAAC;YACxB,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,cAAc,CAAC,OAAO,CAAC,KAAK,cAAc,EAAE,CAAC;gBACvE,MAAM,IAAI,gBAAgB,CAAC;oBACzB,IAAI,EAAE,mBAAmB;oBACzB,OAAO,EAAE,iCAAiC;iBAC3C,CAAC,CAAC;YACL,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,KAAK,UAAU,IAAI,OAAO,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YACnE,MAAM,OAAO,GAAG,GAAG;gBACjB,CAAC,CAAC,GAAG,CAAC,OAAO;gBACb,CAAC,CAAC,OAAO;oBACP,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC;oBACxB,CAAC,CAAC,SAAS,CAAC;YAChB,IAAI,CAAC,CAAC,OAAO,YAAY,WAAW,CAAC,EAAE,CAAC;gBACtC,MAAM,IAAI,gBAAgB,CAAC;oBACzB,IAAI,EAAE,uBAAuB;oBAC7B,OAAO,EAAE,uCAAuC;iBACjD,CAAC,CAAC;YACL,CAAC;YACD,IAAI,GAAG,EAAE,IAAI,KAAK,YAAY,EAAE,CAAC;gBAC/B,IAAI,GAAG,EAAE,CAAC;oBACR,MAAM,IAAI,gBAAgB,CAAC;wBACzB,IAAI,EAAE,uBAAuB;wBAC7B,OAAO,EAAE,6CAA6C;qBACvD,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YACD,MAAM,QAAQ,GAAG,wBAAwB,CAAC,OAAO,CAAC,CAAC;YACnD,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,CAAC,GAAG,IAAI,QAAQ,KAAK,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC/D,MAAM,IAAI,gBAAgB,CAAC;oBACzB,IAAI,EAAE,mBAAmB;oBACzB,OAAO,EAAE,+CAA+C;iBACzD,CAAC,CAAC;YACL,CAAC;YACD,MAAM,aAAa,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAC;YACvD,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,MAAM,IAAI,gBAAgB,CAAC;oBACzB,IAAI,EAAE,uBAAuB;oBAC7B,OAAO,EAAE,gDAAgD;iBAC1D,CAAC,CAAC;YACL,CAAC;YAED,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;YAChC,IAAI,OAAO,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;gBAClC,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAA+B,CAAC;gBAC5D,IACE,CAAC,KAAK,CAAC,CAAC,KAAK,SAAS,IAAI,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;oBAC5D,CAAC,KAAK,CAAC,CAAC,KAAK,SAAS,IAAI,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,EAC5D,CAAC;oBACD,MAAM,IAAI,gBAAgB,CAAC;wBACzB,IAAI,EAAE,uBAAuB;wBAC7B,OAAO,EAAE,8CAA8C;qBACxD,CAAC,CAAC;gBACL,CAAC;gBACD,OAAO,CAAC,QAAQ,CAAC;oBACf,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC;oBAC1B,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC;oBACzB,QAAQ,EAAE,MAAM;iBACjB,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAoC,CAAC;gBACjE,IACE,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS;oBACvB,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,UAAU;oBACjC,CAAC,aAAa,CAAC,CAAC,CAAC;oBACnB,CAAC,KAAK,CAAC,GAAG,KAAK,SAAS;wBACtB,KAAK,CAAC,GAAG,KAAK,OAAO,CAAC,SAAS;wBAC/B,CAAC,aAAa,CAAC,CAAC,CAAC,EACnB,CAAC;oBACD,MAAM,IAAI,gBAAgB,CAAC;wBACzB,IAAI,EAAE,uBAAuB;wBAC7B,OAAO,EAAE,8CAA8C;qBACxD,CAAC,CAAC;gBACL,CAAC;gBACD,OAAO,CAAC,QAAQ,CAAC;oBACf,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,OAAO,CAAC,UAAU,CAAC;oBAC9C,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,SAAS,CAAC;oBAC3C,QAAQ,EAAE,MAAM;iBACjB,CAAC,CAAC;YACL,CAAC;YACD,IAAI,CAAC,qBAAqB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAC5C,MAAM,mBAAmB,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;YACrC,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,wBAAwB,CAAC,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;gBAC3E,MAAM,IAAI,gBAAgB,CAAC;oBACzB,IAAI,EAAE,mBAAmB;oBACzB,OAAO,EAAE,4CAA4C;iBACtD,CAAC,CAAC;YACL,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,OAAO,GAAG,GAAG;YACjB,CAAC,CAAC,MAAM,mBAAmB,CAAC,GAAG,EAAE,MAAM,CAAC;YACxC,CAAC,CAAC,OAAO;gBACP,CAAC,CAAC,CAAC,MAAM,cAAc,CACnB,OAAO,EACP,SAAS,EACT,IAAI,CAAC,MAAM,CAAC,qBAAqB,EACjC,MAAM,CACP;oBACD,MAAM,uBAAuB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;gBACjD,CAAC,CAAC,SAAS,CAAC;QAChB,IAAI,CAAC,OAAO;YAAE,MAAM,cAAc,CAAC,oBAAoB,CAAC,CAAC;QAEzD,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAChC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC9C,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAChC,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACpD,IAAI,CAAC,qBAAqB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC5C,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACpC,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,qBAAqB,CAC3B,MAAuB,EACvB,OAAoB;QAEpB,IAAI,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAC9B,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,KAAK,OAAO,CAAC,UAAU,CACpD,EAAE,CAAC;YACF,OAAO;QACT,CAAC;QACD,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;QACpC,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC;YAC3B,SAAS,EAAE,OAAO,CAAC,UAAU;YAC7B,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9B,CAAC,CAAC;IACL,CAAC;IAEO,kBAAkB,CAAC,MAAuB;QAChD,IACE,MAAM,CAAC,MAAM,KAAK,SAAS;YAC3B,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,EACrC,CAAC;YACD,MAAM,IAAI,gBAAgB,CAAC;gBACzB,IAAI,EAAE,qBAAqB;gBAC3B,OAAO,EAAE,gDAAgD;aAC1D,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAEO,aAAa,CACnB,OAAgB,EAChB,OAAoB;QAEpB,IAAI,OAAO,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;YAC/B,qBAAqB,CAAC,OAAO,CAAC,CAAC;YAC/B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC9B,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YAC5C,IACE,CAAC,OAAO,YAAY,gBAAgB;gBAClC,OAAO,YAAY,mBAAmB,CAAC;gBACzC,CAAC,OAAO,CAAC,QAAQ,EACjB,CAAC;gBACD,aAAa,CAAC,OAAO,CAAC,CAAC;gBACvB,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;gBAC/B,OAAO,IAAI,CAAC;YACd,CAAC;YACD,IAAI,OAAO,YAAY,WAAW,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;gBAChE,aAAa,CAAC,OAAO,CAAC,CAAC;gBACvB,OAAO,CAAC,WAAW,GAAG,KAAK,CAAC;gBAC5B,aAAa,CAAC,OAAO,CAAC,CAAC;gBACvB,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,IAAI,gBAAgB,CAAC;gBACzB,IAAI,EAAE,cAAc;gBACpB,OAAO,EAAE,gCAAgC;aAC1C,CAAC,CAAC;QACL,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;YAC/B,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YAC1C,OAAO,CAAC,aAAa,CACnB,IAAI,aAAa,CAAC,SAAS,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CACrD,CAAC;YACF,OAAO,CAAC,aAAa,CACnB,IAAI,aAAa,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CACnD,CAAC;YACF,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,KAAK,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC/D,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,KAAK,OAAO,CAAC;YAC3C,IACE,OAAO,YAAY,gBAAgB;gBACnC,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,EAC5C,CAAC;gBACD,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;oBACzC,MAAM,IAAI,gBAAgB,CAAC;wBACzB,IAAI,EAAE,uBAAuB;wBAC7B,OAAO,EAAE,qDAAqD;qBAC/D,CAAC,CAAC;gBACL,CAAC;gBACD,IAAI,OAAO,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;oBAChC,qBAAqB,CAAC,OAAO,CAAC,CAAC;gBACjC,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC;YACD,IAAI,OAAO,CAAC,YAAY,CAAC,cAAc,CAAC,KAAK,IAAI,EAAE,CAAC;gBAClD,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,cAAc,CAAC,KAAK,MAAM,CAAC;gBAChE,IAAI,OAAO,KAAK,OAAO;oBAAE,qBAAqB,CAAC,OAAO,CAAC,CAAC;gBACxD,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,IAAI,gBAAgB,CAAC;gBACzB,IAAI,EAAE,uBAAuB;gBAC7B,OAAO,EAAE,GAAG,OAAO,CAAC,MAAM,6BAA6B;aACxD,CAAC,CAAC;QACL,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,KAAK,cAAc,EAAE,CAAC;YACtC,IAAI,CAAC,CAAC,OAAO,YAAY,iBAAiB,CAAC,EAAE,CAAC;gBAC5C,MAAM,IAAI,gBAAgB,CAAC;oBACzB,IAAI,EAAE,uBAAuB;oBAC7B,OAAO,EAAE,2DAA2D;iBACrE,CAAC,CAAC;YACL,CAAC;YACD,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClC,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC;gBACrC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC;gBACvB,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,CAAC;YAC9B,MAAM,eAAe,GAAG,IAAI,GAAG,CAC7B,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CACtD,CAAC;YACF,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;YACtE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,MAAM,IAAI,gBAAgB,CAAC;oBACzB,IAAI,EAAE,WAAW;oBACjB,OAAO,EAAE,yCAAyC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;iBACvE,CAAC,CAAC;YACL,CAAC;YACD,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBACrC,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAClD,CAAC;YACD,aAAa,CAAC,OAAO,CAAC,CAAC;YACvB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;YAC/B,OAAO,CAAC,aAAa,CACnB,IAAI,UAAU,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAC/D,CAAC;YACF,OAAO,CAAC,aAAa,CACnB,IAAI,UAAU,CAAC,YAAY,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CACjE,CAAC;YACF,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;YAC/B,aAAa,CAAC,OAAsB,CAAC,CAAC;YACtC,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC7B,OAAuB,CAAC,IAAI,EAAE,CAAC;YAChC,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,cAAc,CAAC,+BAA+B,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACxE,CAAC;CACF","sourcesContent":["import { focusForAgent } from \"./focus.js\";\nimport { ActionFeedback } from \"./feedback.js\";\nimport {\n createIdentity,\n createScrollableIdentity,\n getElementScrollability,\n normalizeText,\n} from \"./dom.js\";\nimport {\n PageCommandError,\n findElementHitTarget,\n prepareLocatorForAction,\n prepareRefForAction,\n requireUnique,\n requireValidRef,\n resolveLocator,\n waitForLocator,\n} from \"./locator.js\";\nimport type {\n CommandError,\n CompletedAction,\n ExecutionLimits,\n FailedCall,\n LocatorDescriptor,\n LocatorMethod,\n PageCommand,\n PageMethod,\n RefTarget,\n SnapshotRegistry,\n} from \"./types.js\";\n\ninterface ExecutionRecord {\n abortController: AbortController;\n callCount: number;\n completedActions: CompletedAction[];\n failedCall?: FailedCall;\n lastSeq: number;\n registry: SnapshotRegistry;\n status: \"running\" | \"cancelled\" | \"completed\";\n}\n\nexport interface ExecutionReceipt {\n completedActions: CompletedAction[];\n failedCall?: FailedCall;\n}\n\nexport interface CommandResponse {\n ok: boolean;\n value?: unknown;\n error?: CommandError;\n}\n\nconst LOCATOR_METHODS = new Set<LocatorMethod>([\n \"click\",\n \"fill\",\n \"press\",\n \"check\",\n \"uncheck\",\n \"selectOption\",\n \"hover\",\n \"focus\",\n \"blur\",\n \"scrollBy\",\n \"scrollTo\",\n \"scrollIntoView\",\n \"exists\",\n \"text\",\n \"waitFor\",\n]);\n\nconst PAGE_METHODS = new Set<PageMethod>([\n \"scrollBy\",\n \"waitForTimeout\",\n \"waitForURL\",\n]);\nconst WAIT_FOR_URL_TIMEOUT_MS = 3_000;\nconst URL_POLL_INTERVAL_MS = 50;\nconst ACTION_METHODS = new Set<LocatorMethod | PageMethod>([\n \"click\",\n \"fill\",\n \"press\",\n \"check\",\n \"uncheck\",\n \"selectOption\",\n \"hover\",\n \"focus\",\n \"blur\",\n \"scrollIntoView\",\n \"scrollBy\",\n \"scrollTo\",\n]);\n\nfunction dispatchInput(element: Element): void {\n element.dispatchEvent(\n new InputEvent(\"input\", {\n bubbles: true,\n inputType: \"insertText\",\n }),\n );\n element.dispatchEvent(new Event(\"change\", { bubbles: true }));\n}\n\nfunction setNativeValue(\n element: HTMLInputElement | HTMLTextAreaElement,\n value: string,\n): void {\n const prototype =\n element instanceof HTMLInputElement\n ? HTMLInputElement.prototype\n : HTMLTextAreaElement.prototype;\n const setter = Object.getOwnPropertyDescriptor(prototype, \"value\")?.set;\n setter?.call(element, value);\n dispatchInput(element);\n}\n\nfunction dispatchClickSequence(element: Element): void {\n const hit = findElementHitTarget(element);\n if (!hit) {\n throw new PageCommandError({\n code: \"ELEMENT_COVERED\",\n message: \"Click target does not have an uncovered hit point.\",\n });\n }\n const {\n element: hitTarget,\n clientX,\n clientY,\n } = hit;\n\n const init: MouseEventInit = {\n bubbles: true,\n cancelable: true,\n composed: true,\n view: window,\n clientX,\n clientY,\n button: 0,\n detail: 1,\n };\n\n hitTarget.dispatchEvent(\n new PointerEvent(\"pointerdown\", {\n ...init,\n buttons: 1,\n pointerId: 1,\n pointerType: \"mouse\",\n isPrimary: true,\n }),\n );\n const shouldFocus = hitTarget.dispatchEvent(\n new MouseEvent(\"mousedown\", { ...init, buttons: 1 }),\n );\n if (\n shouldFocus &&\n element instanceof HTMLElement &&\n element.ownerDocument.activeElement !== element\n ) {\n focusForAgent(element);\n }\n if (!element.isConnected || !hitTarget.isConnected) {\n throw new PageCommandError({\n code: \"REF_ACTION_FAILED\",\n message: \"Click target changed after mousedown.\",\n });\n }\n hitTarget.dispatchEvent(\n new PointerEvent(\"pointerup\", {\n ...init,\n buttons: 0,\n pointerId: 1,\n pointerType: \"mouse\",\n isPrimary: true,\n }),\n );\n hitTarget.dispatchEvent(\n new MouseEvent(\"mouseup\", { ...init, buttons: 0 }),\n );\n if (hitTarget instanceof HTMLElement) {\n hitTarget.click();\n return;\n }\n hitTarget.dispatchEvent(\n new MouseEvent(\"click\", { ...init, buttons: 0 }),\n );\n}\n\nfunction targetLabel(command: PageCommand): string | undefined {\n if (command.target.type === \"ref\") return command.target.ref;\n if (command.target.type === \"locator\") {\n return JSON.stringify(command.target.locator).slice(0, 500);\n }\n return \"page\";\n}\n\nfunction invalidCommand(message: string): PageCommandError {\n return new PageCommandError({ code: \"INVALID_COMMAND\", message });\n}\n\nfunction validateMatcher(value: unknown, maxChars: number): void {\n if (typeof value === \"string\") {\n if (value.length > maxChars) throw invalidCommand(\"Matcher is too long.\");\n return;\n }\n if (!value || typeof value !== \"object\") {\n throw invalidCommand(\"Matcher must be a string or normalized regex.\");\n }\n const regex = value as { source?: unknown; flags?: unknown };\n if (\n typeof regex.source !== \"string\" ||\n regex.source.length > maxChars ||\n typeof regex.flags !== \"string\" ||\n !/^[dgimsuvy]*$/.test(regex.flags)\n ) {\n throw invalidCommand(\"Regex matcher is invalid.\");\n }\n try {\n new RegExp(regex.source, regex.flags);\n } catch {\n throw invalidCommand(\"Regex matcher could not be compiled.\");\n }\n}\n\nfunction validateLocator(\n descriptor: LocatorDescriptor,\n maxChars: number,\n): void {\n if (\n !descriptor ||\n typeof descriptor !== \"object\" ||\n !Array.isArray(descriptor.steps) ||\n descriptor.steps.length === 0\n ) {\n throw invalidCommand(\"Locator must contain at least one step.\");\n }\n if (descriptor.steps.length > 12) {\n throw invalidCommand(\"Locator contains too many steps.\");\n }\n for (const step of descriptor.steps) {\n if (step.kind === \"role\") {\n if (!step.role || step.role.length > 80) {\n throw invalidCommand(\"Locator role is invalid.\");\n }\n if (step.options?.name !== undefined) {\n validateMatcher(step.options.name, maxChars);\n }\n continue;\n }\n if (step.kind === \"text\" || step.kind === \"label\") {\n validateMatcher(step.text, maxChars);\n continue;\n }\n if (step.kind === \"filter\") {\n validateMatcher(step.hasText, maxChars);\n continue;\n }\n throw invalidCommand(\"Locator contains an unsupported step.\");\n }\n}\n\nfunction validateArgs(command: PageCommand, maxChars: number): void {\n if (!Array.isArray(command.args)) {\n throw invalidCommand(\"Command args must be an array.\");\n }\n let serialized: string;\n try {\n serialized = JSON.stringify(command.args);\n } catch {\n throw invalidCommand(\"Command args must be serializable.\");\n }\n if (serialized.length > maxChars) {\n throw invalidCommand(\"Command args are too large.\");\n }\n\n if (command.method === \"fill\" || command.method === \"press\") {\n if (command.args.length !== 1 || typeof command.args[0] !== \"string\") {\n throw invalidCommand(`${command.method}() requires one string argument.`);\n }\n }\n if (command.method === \"selectOption\") {\n if (\n command.args.length !== 1 ||\n (typeof command.args[0] !== \"string\" &&\n !Array.isArray(command.args[0]))\n ) {\n throw invalidCommand(\"selectOption() requires a string or string array.\");\n }\n if (\n Array.isArray(command.args[0]) &&\n command.args[0].some((item) => typeof item !== \"string\")\n ) {\n throw invalidCommand(\"selectOption() array values must be strings.\");\n }\n }\n if (command.method === \"waitFor\") {\n const options = command.args[0];\n if (\n command.args.length > 1 ||\n (options !== undefined &&\n (typeof options !== \"object\" || options === null || Array.isArray(options)))\n ) {\n throw invalidCommand(\"waitFor() options are invalid.\");\n }\n const value = options as { state?: unknown; timeout?: unknown } | undefined;\n if (\n value?.state !== undefined &&\n ![\"visible\", \"hidden\", \"attached\"].includes(String(value.state))\n ) {\n throw invalidCommand(\"waitFor() state is invalid.\");\n }\n if (\n value?.timeout !== undefined &&\n (typeof value.timeout !== \"number\" ||\n !Number.isFinite(value.timeout) ||\n value.timeout < 0)\n ) {\n throw invalidCommand(\"waitFor() timeout is invalid.\");\n }\n }\n if (command.method === \"waitForTimeout\") {\n if (\n command.args.length !== 1 ||\n typeof command.args[0] !== \"number\" ||\n !Number.isFinite(command.args[0]) ||\n command.args[0] < 0\n ) {\n throw invalidCommand(\"waitForTimeout() requires one non-negative number.\");\n }\n }\n if (command.method === \"waitForURL\") {\n const expected = command.args[0];\n const options = command.args[1];\n if (\n command.args.length < 1 ||\n command.args.length > 2 ||\n typeof expected !== \"string\" ||\n expected.length === 0 ||\n (options !== undefined &&\n (typeof options !== \"object\" || options === null || Array.isArray(options)))\n ) {\n throw invalidCommand(\n \"waitForURL() requires a URL string and optional timeout options.\",\n );\n }\n const value = options as { timeout?: unknown } | undefined;\n if (\n value &&\n (Object.keys(value).some((key) => key !== \"timeout\") ||\n (value.timeout !== undefined &&\n (typeof value.timeout !== \"number\" ||\n !Number.isFinite(value.timeout) ||\n value.timeout < 0)))\n ) {\n throw invalidCommand(\"waitForURL() options are invalid.\");\n }\n }\n if (command.method === \"scrollBy\") {\n const value = command.args[0] as { x?: unknown; y?: unknown } | undefined;\n if (\n command.args.length !== 1 ||\n !value ||\n typeof value !== \"object\" ||\n Array.isArray(value) ||\n Object.keys(value).length === 0 ||\n Object.keys(value).some((key) => ![\"x\", \"y\"].includes(key)) ||\n (value.x !== undefined &&\n (typeof value.x !== \"number\" || !Number.isFinite(value.x))) ||\n (value.y !== undefined &&\n (typeof value.y !== \"number\" || !Number.isFinite(value.y)))\n ) {\n throw invalidCommand(\"scrollBy() requires finite numeric x/y values.\");\n }\n }\n if (command.method === \"scrollTo\") {\n const value = command.args[0] as { left?: unknown; top?: unknown } | undefined;\n if (\n command.args.length !== 1 ||\n !value ||\n typeof value !== \"object\" ||\n Array.isArray(value) ||\n Object.keys(value).length === 0 ||\n Object.keys(value).some((key) => ![\"left\", \"top\"].includes(key)) ||\n (value.left !== undefined &&\n (typeof value.left !== \"number\" || !Number.isFinite(value.left))) ||\n (value.top !== undefined &&\n (typeof value.top !== \"number\" || !Number.isFinite(value.top)))\n ) {\n throw invalidCommand(\"scrollTo() requires finite numeric left/top values.\");\n }\n }\n}\n\nasync function waitAnimationFrames(\n count: number,\n signal: AbortSignal,\n): Promise<void> {\n for (let index = 0; index < count; index += 1) {\n signal.throwIfAborted();\n await new Promise<void>((resolve) => requestAnimationFrame(() => resolve()));\n }\n signal.throwIfAborted();\n}\n\nexport class PageController {\n private readonly executions = new Map<string, ExecutionRecord>();\n\n constructor(\n private readonly limits: ExecutionLimits,\n private readonly animator: ActionFeedback,\n ) {}\n\n beginExecution(\n executionId: string,\n registry: SnapshotRegistry,\n ): void {\n this.executions.set(executionId, {\n abortController: new AbortController(),\n callCount: 0,\n completedActions: [],\n lastSeq: 0,\n registry,\n status: \"running\",\n });\n }\n\n cancelExecution(executionId: string): void {\n const record = this.executions.get(executionId);\n if (!record) return;\n record.status = \"cancelled\";\n record.abortController.abort();\n }\n\n completeExecution(executionId: string): ExecutionReceipt {\n const record = this.executions.get(executionId);\n if (!record) return { completedActions: [] };\n record.status = \"completed\";\n record.abortController.abort();\n this.executions.delete(executionId);\n return {\n completedActions: [...record.completedActions].sort(\n (a, b) => a.callIndex - b.callIndex,\n ),\n ...(record.failedCall ? { failedCall: record.failedCall } : {}),\n };\n }\n\n private requireActive(command: PageCommand): ExecutionRecord {\n if (\n !command ||\n typeof command !== \"object\" ||\n typeof command.executionId !== \"string\" ||\n !Number.isSafeInteger(command.commandSeq) ||\n command.commandSeq <= 0\n ) {\n throw invalidCommand(\"Command envelope is invalid.\");\n }\n const record = this.executions.get(command.executionId);\n if (\n !record ||\n record.status !== \"running\" ||\n record.abortController.signal.aborted\n ) {\n throw new PageCommandError({\n code: \"EXECUTION_CANCELLED\",\n message: \"The execution is no longer active.\",\n });\n }\n if (command.commandSeq <= record.lastSeq) {\n throw invalidCommand(\"Command sequence must be strictly increasing.\");\n }\n record.lastSeq = command.commandSeq;\n record.callCount += 1;\n if (record.callCount > this.limits.maxPageCalls) {\n throw invalidCommand(\n `Page API call budget exceeded (${this.limits.maxPageCalls}).`,\n );\n }\n this.validateCommand(command);\n return record;\n }\n\n private validateCommand(command: PageCommand): void {\n if (\n !command.target ||\n typeof command.target !== \"object\" ||\n ![\"page\", \"ref\", \"locator\"].includes(command.target.type) ||\n typeof command.method !== \"string\"\n ) {\n throw invalidCommand(\"Command target or method is invalid.\");\n }\n if (command.target.type === \"page\") {\n if (!PAGE_METHODS.has(command.method as PageMethod)) {\n throw invalidCommand(`Unsupported page method: ${command.method}`);\n }\n } else {\n if (!LOCATOR_METHODS.has(command.method as LocatorMethod)) {\n throw invalidCommand(`Unsupported locator method: ${command.method}`);\n }\n if (command.target.type === \"ref\") {\n if (!/^@\\d+$/.test(command.target.ref)) {\n throw invalidCommand(\"Snapshot ref is invalid.\");\n }\n } else {\n validateLocator(\n command.target.locator,\n this.limits.maxArgumentChars,\n );\n }\n }\n validateArgs(command, this.limits.maxArgumentChars);\n }\n\n async execute(command: PageCommand): Promise<CommandResponse> {\n let record = this.executions.get(command.executionId);\n try {\n record = this.requireActive(command);\n const value =\n command.target.type === \"page\"\n ? await this.executePage(command, record)\n : await this.executeTarget(command, record);\n if (\n ACTION_METHODS.has(command.method) &&\n !record.completedActions.some(\n (action) => action.callIndex === command.commandSeq,\n )\n ) {\n this.recordCompletedAction(record, command);\n }\n return { ok: true, value };\n } catch (error) {\n if (record && !record.failedCall) {\n const target = targetLabel(command);\n record.failedCall = {\n callIndex: command.commandSeq,\n method: command.method,\n ...(target ? { target } : {}),\n };\n }\n if (error instanceof PageCommandError) {\n return { ok: false, error: error.detail };\n }\n return {\n ok: false,\n error: {\n code: \"UNSUPPORTED_OPERATION\",\n message: error instanceof Error ? error.message : String(error),\n },\n };\n }\n }\n\n private async executePage(\n command: PageCommand,\n record: ExecutionRecord,\n ): Promise<unknown> {\n if (command.method === \"scrollBy\") {\n const value = (command.args[0] ?? {}) as { x?: number; y?: number };\n window.scrollBy({\n left: Number(value.x ?? 0),\n top: Number(value.y ?? 0),\n behavior: \"auto\",\n });\n return null;\n }\n if (command.method === \"waitForTimeout\") {\n const requested = Number(command.args[0] ?? 0);\n const duration = Math.max(\n 0,\n Math.min(requested, this.limits.singleActionTimeoutMs),\n );\n await new Promise<void>((resolve, reject) => {\n const onAbort = (): void => {\n window.clearTimeout(timer);\n reject(\n new PageCommandError({\n code: \"EXECUTION_CANCELLED\",\n message: \"Execution was cancelled while waiting.\",\n }),\n );\n };\n const timer = window.setTimeout(() => {\n record.abortController.signal.removeEventListener(\"abort\", onAbort);\n resolve();\n }, duration);\n record.abortController.signal.addEventListener(\"abort\", onAbort, {\n once: true,\n });\n });\n return null;\n }\n if (command.method === \"waitForURL\") {\n let expectedUrl: string;\n try {\n expectedUrl = new URL(String(command.args[0]), location.href).href;\n } catch {\n throw invalidCommand(\"waitForURL() URL is invalid.\");\n }\n const options = (command.args[1] ?? {}) as { timeout?: number };\n const timeout = Math.min(\n options.timeout ?? WAIT_FOR_URL_TIMEOUT_MS,\n WAIT_FOR_URL_TIMEOUT_MS,\n this.limits.singleActionTimeoutMs,\n );\n if (location.href === expectedUrl) return null;\n await new Promise<void>((resolve, reject) => {\n let settled = false;\n const cleanup = (): void => {\n window.clearInterval(interval);\n window.clearTimeout(timer);\n record.abortController.signal.removeEventListener(\"abort\", onAbort);\n };\n const settle = (error?: PageCommandError): void => {\n if (settled) return;\n settled = true;\n cleanup();\n if (error) reject(error);\n else resolve();\n };\n const onAbort = (): void => settle(new PageCommandError({\n code: \"EXECUTION_CANCELLED\",\n message: \"Execution was cancelled while waiting for the URL.\",\n }));\n const interval = window.setInterval(() => {\n if (location.href === expectedUrl) settle();\n }, URL_POLL_INTERVAL_MS);\n const timer = window.setTimeout(() => settle(new PageCommandError({\n code: \"ACTION_TIMEOUT\",\n message: `URL did not become ${expectedUrl} within ${timeout}ms.`,\n })), timeout);\n record.abortController.signal.addEventListener(\"abort\", onAbort, {\n once: true,\n });\n });\n return null;\n }\n throw invalidCommand(`Unsupported page method: ${command.method}`);\n }\n\n private resolveRef(\n command: PageCommand,\n record: ExecutionRecord,\n ): RefTarget | undefined {\n if (command.target.type !== \"ref\") return undefined;\n return record.registry.refs.get(command.target.ref);\n }\n\n private locator(command: PageCommand): LocatorDescriptor | undefined {\n return command.target.type === \"locator\"\n ? command.target.locator\n : undefined;\n }\n\n private async executeTarget(\n command: PageCommand,\n record: ExecutionRecord,\n ): Promise<unknown> {\n const signal = record.abortController.signal;\n const ref = this.resolveRef(command, record);\n const locator = this.locator(command);\n\n if (command.method === \"exists\") {\n if (ref) {\n try {\n requireValidRef(ref);\n return true;\n } catch {\n return false;\n }\n }\n return locator ? resolveLocator(locator).length > 0 : false;\n }\n\n if (command.method === \"waitFor\") {\n const options = (command.args[0] ?? {}) as {\n state?: \"visible\" | \"hidden\" | \"attached\";\n timeout?: number;\n };\n if (!locator) {\n requireValidRef(ref);\n return null;\n }\n await waitForLocator(\n locator,\n options.state ?? \"visible\",\n Math.min(\n options.timeout ?? this.limits.singleActionTimeoutMs,\n this.limits.singleActionTimeoutMs,\n ),\n signal,\n );\n return null;\n }\n\n if (command.method === \"text\") {\n const element = ref\n ? requireValidRef(ref)\n : locator\n ? requireUnique(locator)\n : undefined;\n if (!element) throw invalidCommand(\"Target is missing.\");\n if (\n element instanceof HTMLInputElement ||\n element instanceof HTMLTextAreaElement ||\n element instanceof HTMLSelectElement\n ) {\n return element.value;\n }\n return normalizeText(element.textContent);\n }\n\n if (command.method === \"scrollIntoView\") {\n const element = ref\n ? requireValidRef(ref)\n : locator\n ? requireUnique(locator)\n : undefined;\n if (!element) throw invalidCommand(\"Target is missing.\");\n const beforeIdentity = createIdentity(element);\n element.scrollIntoView({\n block: \"center\",\n inline: \"nearest\",\n behavior: \"auto\",\n });\n this.recordCompletedAction(record, command);\n await new Promise<void>((resolve) =>\n requestAnimationFrame(() => resolve()),\n );\n signal.throwIfAborted();\n if (!element.isConnected || createIdentity(element) !== beforeIdentity) {\n throw new PageCommandError({\n code: \"REF_ACTION_FAILED\",\n message: \"Target changed while scrolling.\",\n });\n }\n return null;\n }\n\n if (command.method === \"scrollBy\" || command.method === \"scrollTo\") {\n const element = ref\n ? ref.element\n : locator\n ? requireUnique(locator)\n : undefined;\n if (!(element instanceof HTMLElement)) {\n throw new PageCommandError({\n code: \"UNSUPPORTED_OPERATION\",\n message: \"Scroll target is not an HTML element.\",\n });\n }\n if (ref?.kind !== \"scrollable\") {\n if (ref) {\n throw new PageCommandError({\n code: \"UNSUPPORTED_OPERATION\",\n message: \"Snapshot ref is not a scrollable container.\",\n });\n }\n }\n const identity = createScrollableIdentity(element);\n if (!element.isConnected || (ref && identity !== ref.identity)) {\n throw new PageCommandError({\n code: \"REF_ACTION_FAILED\",\n message: \"Scrollable target changed after the snapshot.\",\n });\n }\n const scrollability = getElementScrollability(element);\n if (!scrollability) {\n throw new PageCommandError({\n code: \"UNSUPPORTED_OPERATION\",\n message: \"Target does not currently have a scroll range.\",\n });\n }\n\n this.requireStillActive(record);\n if (command.method === \"scrollBy\") {\n const value = command.args[0] as { x?: number; y?: number };\n if (\n (value.x !== undefined && value.x !== 0 && !scrollability.x) ||\n (value.y !== undefined && value.y !== 0 && !scrollability.y)\n ) {\n throw new PageCommandError({\n code: \"UNSUPPORTED_OPERATION\",\n message: \"Requested axis does not have a scroll range.\",\n });\n }\n element.scrollBy({\n left: Number(value.x ?? 0),\n top: Number(value.y ?? 0),\n behavior: \"auto\",\n });\n } else {\n const value = command.args[0] as { left?: number; top?: number };\n if (\n (value.left !== undefined &&\n value.left !== element.scrollLeft &&\n !scrollability.x) ||\n (value.top !== undefined &&\n value.top !== element.scrollTop &&\n !scrollability.y)\n ) {\n throw new PageCommandError({\n code: \"UNSUPPORTED_OPERATION\",\n message: \"Requested axis does not have a scroll range.\",\n });\n }\n element.scrollTo({\n left: Number(value.left ?? element.scrollLeft),\n top: Number(value.top ?? element.scrollTop),\n behavior: \"auto\",\n });\n }\n this.recordCompletedAction(record, command);\n await waitAnimationFrames(2, signal);\n if (!element.isConnected || createScrollableIdentity(element) !== identity) {\n throw new PageCommandError({\n code: \"REF_ACTION_FAILED\",\n message: \"Scrollable target changed while scrolling.\",\n });\n }\n return null;\n }\n\n const element = ref\n ? await prepareRefForAction(ref, signal)\n : locator\n ? (await waitForLocator(\n locator,\n \"visible\",\n this.limits.singleActionTimeoutMs,\n signal,\n ),\n await prepareLocatorForAction(locator, signal))\n : undefined;\n if (!element) throw invalidCommand(\"Target is missing.\");\n\n this.requireStillActive(record);\n this.animator.before(command.method, element);\n this.requireStillActive(record);\n const result = this.performAction(element, command);\n this.recordCompletedAction(record, command);\n this.animator.after(command.method);\n return result;\n }\n\n private recordCompletedAction(\n record: ExecutionRecord,\n command: PageCommand,\n ): void {\n if (record.completedActions.some(\n (action) => action.callIndex === command.commandSeq,\n )) {\n return;\n }\n const target = targetLabel(command);\n record.completedActions.push({\n callIndex: command.commandSeq,\n method: command.method,\n ...(target ? { target } : {}),\n });\n }\n\n private requireStillActive(record: ExecutionRecord): void {\n if (\n record.status !== \"running\" ||\n record.abortController.signal.aborted\n ) {\n throw new PageCommandError({\n code: \"EXECUTION_CANCELLED\",\n message: \"Execution was cancelled before the DOM action.\",\n });\n }\n }\n\n private performAction(\n element: Element,\n command: PageCommand,\n ): unknown {\n if (command.method === \"click\") {\n dispatchClickSequence(element);\n return null;\n }\n if (command.method === \"fill\") {\n const value = String(command.args[0] ?? \"\");\n if (\n (element instanceof HTMLInputElement ||\n element instanceof HTMLTextAreaElement) &&\n !element.readOnly\n ) {\n focusForAgent(element);\n setNativeValue(element, value);\n return null;\n }\n if (element instanceof HTMLElement && element.isContentEditable) {\n focusForAgent(element);\n element.textContent = value;\n dispatchInput(element);\n return null;\n }\n throw new PageCommandError({\n code: \"NOT_EDITABLE\",\n message: \"fill() target is not editable.\",\n });\n }\n if (command.method === \"press\") {\n const key = String(command.args[0] ?? \"\");\n element.dispatchEvent(\n new KeyboardEvent(\"keydown\", { key, bubbles: true }),\n );\n element.dispatchEvent(\n new KeyboardEvent(\"keyup\", { key, bubbles: true }),\n );\n return null;\n }\n if (command.method === \"check\" || command.method === \"uncheck\") {\n const checked = command.method === \"check\";\n if (\n element instanceof HTMLInputElement &&\n [\"checkbox\", \"radio\"].includes(element.type)\n ) {\n if (element.type === \"radio\" && !checked) {\n throw new PageCommandError({\n code: \"UNSUPPORTED_OPERATION\",\n message: \"Native radio elements cannot be unchecked directly.\",\n });\n }\n if (element.checked !== checked) {\n dispatchClickSequence(element);\n }\n return null;\n }\n if (element.getAttribute(\"aria-checked\") !== null) {\n const current = element.getAttribute(\"aria-checked\") === \"true\";\n if (current !== checked) dispatchClickSequence(element);\n return null;\n }\n throw new PageCommandError({\n code: \"UNSUPPORTED_OPERATION\",\n message: `${command.method}() target is not checkable.`,\n });\n }\n if (command.method === \"selectOption\") {\n if (!(element instanceof HTMLSelectElement)) {\n throw new PageCommandError({\n code: \"UNSUPPORTED_OPERATION\",\n message: \"selectOption() currently supports native select elements.\",\n });\n }\n const requested = command.args[0];\n const values = Array.isArray(requested)\n ? requested.map(String)\n : [String(requested ?? \"\")];\n const availableValues = new Set(\n Array.from(element.options, (option) => option.value),\n );\n const missing = values.filter((value) => !availableValues.has(value));\n if (missing.length > 0) {\n throw new PageCommandError({\n code: \"NOT_FOUND\",\n message: `selectOption() values were not found: ${missing.join(\", \")}`,\n });\n }\n for (const option of element.options) {\n option.selected = values.includes(option.value);\n }\n dispatchInput(element);\n return null;\n }\n if (command.method === \"hover\") {\n element.dispatchEvent(\n new MouseEvent(\"mouseover\", { bubbles: true, composed: true }),\n );\n element.dispatchEvent(\n new MouseEvent(\"mouseenter\", { bubbles: false, composed: true }),\n );\n return null;\n }\n if (command.method === \"focus\") {\n focusForAgent(element as HTMLElement);\n return null;\n }\n if (command.method === \"blur\") {\n (element as HTMLElement).blur();\n return null;\n }\n throw invalidCommand(`Unsupported locator method: ${command.method}`);\n }\n}\n"]}
1
+ {"version":3,"file":"controller.js","sourceRoot":"","sources":["../../src/browser/controller.ts"],"names":[],"mappings":"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","sourcesContent":["import { measurePagePhase } from \"./diagnostics.js\";\nimport { focusForAgent, withAgentActivation } from \"./focus.js\";\nimport { ActionFeedback } from \"./feedback.js\";\nimport {\n createIdentity,\n createScrollableIdentity,\n getElementScrollability,\n normalizeText,\n} from \"./dom.js\";\nimport {\n PageCommandError,\n findElementHitTarget,\n prepareLocatorForAction,\n prepareRefForAction,\n requireUnique,\n requireValidRef,\n resolveLocator,\n waitForLocator,\n} from \"./locator.js\";\nimport type {\n CommandError,\n CompletedAction,\n ExecutionLimits,\n FailedCall,\n LocatorDescriptor,\n LocatorMethod,\n PageCommand,\n PageMethod,\n RefTarget,\n SnapshotRegistry,\n} from \"./types.js\";\n\ninterface ExecutionRecord {\n abortController: AbortController;\n callCount: number;\n completedActions: CompletedAction[];\n failedCall?: FailedCall;\n lastSeq: number;\n registry: SnapshotRegistry;\n status: \"running\" | \"cancelled\" | \"completed\";\n}\n\nexport interface ExecutionReceipt {\n completedActions: CompletedAction[];\n failedCall?: FailedCall;\n}\n\nexport interface CommandResponse {\n ok: boolean;\n value?: unknown;\n error?: CommandError;\n}\n\nconst LOCATOR_METHODS = new Set<LocatorMethod>([\n \"click\",\n \"fill\",\n \"press\",\n \"check\",\n \"uncheck\",\n \"selectOption\",\n \"setOptionSelected\",\n \"hover\",\n \"focus\",\n \"blur\",\n \"scrollBy\",\n \"scrollTo\",\n \"scrollIntoView\",\n \"exists\",\n \"text\",\n \"waitFor\",\n]);\n\nconst PAGE_METHODS = new Set<PageMethod>([\n \"scrollBy\",\n \"waitForTimeout\",\n \"waitForURL\",\n]);\nconst WAIT_FOR_URL_TIMEOUT_MS = 3_000;\nconst URL_POLL_INTERVAL_MS = 50;\nconst ACTION_METHODS = new Set<LocatorMethod | PageMethod>([\n \"click\",\n \"fill\",\n \"press\",\n \"check\",\n \"uncheck\",\n \"selectOption\",\n \"setOptionSelected\",\n \"hover\",\n \"focus\",\n \"blur\",\n \"scrollIntoView\",\n \"scrollBy\",\n \"scrollTo\",\n]);\n\nfunction dispatchInput(element: Element): void {\n element.dispatchEvent(\n new InputEvent(\"input\", {\n bubbles: true,\n inputType: \"insertText\",\n }),\n );\n element.dispatchEvent(new Event(\"change\", { bubbles: true }));\n}\n\nfunction setNativeValue(\n element: HTMLInputElement | HTMLTextAreaElement,\n value: string,\n): void {\n const prototype =\n element instanceof HTMLInputElement\n ? HTMLInputElement.prototype\n : HTMLTextAreaElement.prototype;\n const setter = Object.getOwnPropertyDescriptor(prototype, \"value\")?.set;\n setter?.call(element, value);\n dispatchInput(element);\n}\n\nfunction dispatchClickSequence(element: Element): void {\n const hit = findElementHitTarget(element);\n if (!hit) {\n throw new PageCommandError({\n code: \"ELEMENT_COVERED\",\n message: \"Click target does not have an uncovered hit point.\",\n });\n }\n const {\n element: hitTarget,\n clientX,\n clientY,\n } = hit;\n\n const init: MouseEventInit = {\n bubbles: true,\n cancelable: true,\n composed: true,\n view: window,\n clientX,\n clientY,\n button: 0,\n detail: 1,\n };\n\n hitTarget.dispatchEvent(\n new PointerEvent(\"pointerdown\", {\n ...init,\n buttons: 1,\n pointerId: 1,\n pointerType: \"mouse\",\n isPrimary: true,\n }),\n );\n const shouldFocus = hitTarget.dispatchEvent(\n new MouseEvent(\"mousedown\", { ...init, buttons: 1 }),\n );\n if (\n shouldFocus &&\n element instanceof HTMLElement &&\n element.ownerDocument.activeElement !== element\n ) {\n focusForAgent(element);\n }\n if (!element.isConnected || !hitTarget.isConnected) {\n throw new PageCommandError({\n code: \"REF_ACTION_FAILED\",\n message: \"Click target changed after mousedown.\",\n });\n }\n hitTarget.dispatchEvent(\n new PointerEvent(\"pointerup\", {\n ...init,\n buttons: 0,\n pointerId: 1,\n pointerType: \"mouse\",\n isPrimary: true,\n }),\n );\n hitTarget.dispatchEvent(\n new MouseEvent(\"mouseup\", { ...init, buttons: 0 }),\n );\n if (hitTarget instanceof HTMLElement) {\n withAgentActivation(() => hitTarget.click());\n return;\n }\n hitTarget.dispatchEvent(\n new MouseEvent(\"click\", { ...init, buttons: 0 }),\n );\n}\n\nfunction targetLabel(command: PageCommand): string | undefined {\n if (command.target.type === \"ref\") return command.target.ref;\n if (command.target.type === \"locator\") {\n return JSON.stringify(command.target.locator).slice(0, 500);\n }\n return \"page\";\n}\n\nfunction invalidCommand(message: string): PageCommandError {\n return new PageCommandError({ code: \"INVALID_COMMAND\", message });\n}\n\nfunction validateMatcher(value: unknown, maxChars: number): void {\n if (typeof value === \"string\") {\n if (value.length > maxChars) throw invalidCommand(\"Matcher is too long.\");\n return;\n }\n if (!value || typeof value !== \"object\") {\n throw invalidCommand(\"Matcher must be a string or normalized regex.\");\n }\n const regex = value as { source?: unknown; flags?: unknown };\n if (\n typeof regex.source !== \"string\" ||\n regex.source.length > maxChars ||\n typeof regex.flags !== \"string\" ||\n !/^[dgimsuvy]*$/.test(regex.flags)\n ) {\n throw invalidCommand(\"Regex matcher is invalid.\");\n }\n try {\n new RegExp(regex.source, regex.flags);\n } catch {\n throw invalidCommand(\"Regex matcher could not be compiled.\");\n }\n}\n\nfunction validateLocator(\n descriptor: LocatorDescriptor,\n maxChars: number,\n): void {\n if (\n !descriptor ||\n typeof descriptor !== \"object\" ||\n !Array.isArray(descriptor.steps) ||\n descriptor.steps.length === 0\n ) {\n throw invalidCommand(\"Locator must contain at least one step.\");\n }\n if (descriptor.steps.length > 12) {\n throw invalidCommand(\"Locator contains too many steps.\");\n }\n for (const step of descriptor.steps) {\n if (step.kind === \"role\") {\n if (!step.role || step.role.length > 80) {\n throw invalidCommand(\"Locator role is invalid.\");\n }\n if (step.options?.name !== undefined) {\n validateMatcher(step.options.name, maxChars);\n }\n continue;\n }\n if (step.kind === \"text\" || step.kind === \"label\") {\n validateMatcher(step.text, maxChars);\n continue;\n }\n if (step.kind === \"filter\") {\n validateMatcher(step.hasText, maxChars);\n continue;\n }\n throw invalidCommand(\"Locator contains an unsupported step.\");\n }\n}\n\nfunction validateArgs(command: PageCommand, maxChars: number): void {\n if (!Array.isArray(command.args)) {\n throw invalidCommand(\"Command args must be an array.\");\n }\n let serialized: string;\n try {\n serialized = JSON.stringify(command.args);\n } catch {\n throw invalidCommand(\"Command args must be serializable.\");\n }\n if (serialized.length > maxChars) {\n throw invalidCommand(\"Command args are too large.\");\n }\n\n if (command.method === \"fill\" || command.method === \"press\") {\n if (command.args.length !== 1 || typeof command.args[0] !== \"string\") {\n throw invalidCommand(`${command.method}() requires one string argument.`);\n }\n }\n if (command.method === \"selectOption\") {\n if (\n command.args.length !== 1 ||\n (typeof command.args[0] !== \"string\" &&\n !Array.isArray(command.args[0]))\n ) {\n throw invalidCommand(\"selectOption() requires a string or string array.\");\n }\n if (\n Array.isArray(command.args[0]) &&\n command.args[0].some((item) => typeof item !== \"string\")\n ) {\n throw invalidCommand(\"selectOption() array values must be strings.\");\n }\n }\n if (command.method === \"setOptionSelected\" && (command.args.length !== 3\n || typeof command.args[0] !== \"string\" || typeof command.args[1] !== \"boolean\" || typeof command.args[2] !== \"string\")) {\n throw invalidCommand(\"Invalid observed option selection.\");\n }\n if (command.method === \"waitFor\") {\n const options = command.args[0];\n if (\n command.args.length > 1 ||\n (options !== undefined &&\n (typeof options !== \"object\" || options === null || Array.isArray(options)))\n ) {\n throw invalidCommand(\"waitFor() options are invalid.\");\n }\n const value = options as { state?: unknown; timeout?: unknown } | undefined;\n if (\n value?.state !== undefined &&\n ![\"visible\", \"hidden\", \"attached\"].includes(String(value.state))\n ) {\n throw invalidCommand(\"waitFor() state is invalid.\");\n }\n if (\n value?.timeout !== undefined &&\n (typeof value.timeout !== \"number\" ||\n !Number.isFinite(value.timeout) ||\n value.timeout < 0)\n ) {\n throw invalidCommand(\"waitFor() timeout is invalid.\");\n }\n }\n if (command.method === \"waitForTimeout\") {\n if (\n command.args.length !== 1 ||\n typeof command.args[0] !== \"number\" ||\n !Number.isFinite(command.args[0]) ||\n command.args[0] < 0\n ) {\n throw invalidCommand(\"waitForTimeout() requires one non-negative number.\");\n }\n }\n if (command.method === \"waitForURL\") {\n const expected = command.args[0];\n const options = command.args[1];\n if (\n command.args.length < 1 ||\n command.args.length > 2 ||\n typeof expected !== \"string\" ||\n expected.length === 0 ||\n (options !== undefined &&\n (typeof options !== \"object\" || options === null || Array.isArray(options)))\n ) {\n throw invalidCommand(\n \"waitForURL() requires a URL string and optional timeout options.\",\n );\n }\n const value = options as { timeout?: unknown } | undefined;\n if (\n value &&\n (Object.keys(value).some((key) => key !== \"timeout\") ||\n (value.timeout !== undefined &&\n (typeof value.timeout !== \"number\" ||\n !Number.isFinite(value.timeout) ||\n value.timeout < 0)))\n ) {\n throw invalidCommand(\"waitForURL() options are invalid.\");\n }\n }\n if (command.method === \"scrollBy\") {\n const value = command.args[0] as { x?: unknown; y?: unknown } | undefined;\n if (\n command.args.length !== 1 ||\n !value ||\n typeof value !== \"object\" ||\n Array.isArray(value) ||\n Object.keys(value).length === 0 ||\n Object.keys(value).some((key) => ![\"x\", \"y\"].includes(key)) ||\n (value.x !== undefined &&\n (typeof value.x !== \"number\" || !Number.isFinite(value.x))) ||\n (value.y !== undefined &&\n (typeof value.y !== \"number\" || !Number.isFinite(value.y)))\n ) {\n throw invalidCommand(\"scrollBy() requires finite numeric x/y values.\");\n }\n }\n if (command.method === \"scrollTo\") {\n const value = command.args[0] as { left?: unknown; top?: unknown } | undefined;\n if (\n command.args.length !== 1 ||\n !value ||\n typeof value !== \"object\" ||\n Array.isArray(value) ||\n Object.keys(value).length === 0 ||\n Object.keys(value).some((key) => ![\"left\", \"top\"].includes(key)) ||\n (value.left !== undefined &&\n (typeof value.left !== \"number\" || !Number.isFinite(value.left))) ||\n (value.top !== undefined &&\n (typeof value.top !== \"number\" || !Number.isFinite(value.top)))\n ) {\n throw invalidCommand(\"scrollTo() requires finite numeric left/top values.\");\n }\n }\n}\n\nasync function waitAnimationFrames(\n count: number,\n signal: AbortSignal,\n): Promise<void> {\n for (let index = 0; index < count; index += 1) {\n signal.throwIfAborted();\n await new Promise<void>((resolve) => requestAnimationFrame(() => resolve()));\n }\n signal.throwIfAborted();\n}\n\nexport class PageController {\n private readonly executions = new Map<string, ExecutionRecord>();\n\n constructor(\n private readonly limits: ExecutionLimits,\n private readonly animator: ActionFeedback,\n ) {}\n\n beginExecution(\n executionId: string,\n registry: SnapshotRegistry,\n ): void {\n this.executions.set(executionId, {\n abortController: new AbortController(),\n callCount: 0,\n completedActions: [],\n lastSeq: 0,\n registry,\n status: \"running\",\n });\n }\n\n cancelExecution(executionId: string): void {\n const record = this.executions.get(executionId);\n if (!record) return;\n record.status = \"cancelled\";\n record.abortController.abort();\n }\n\n completeExecution(executionId: string): ExecutionReceipt {\n const record = this.executions.get(executionId);\n if (!record) return { completedActions: [] };\n record.status = \"completed\";\n record.abortController.abort();\n this.executions.delete(executionId);\n return {\n completedActions: [...record.completedActions].sort(\n (a, b) => a.callIndex - b.callIndex,\n ),\n ...(record.failedCall ? { failedCall: record.failedCall } : {}),\n };\n }\n\n private requireActive(command: PageCommand): ExecutionRecord {\n if (\n !command ||\n typeof command !== \"object\" ||\n typeof command.executionId !== \"string\" ||\n !Number.isSafeInteger(command.commandSeq) ||\n command.commandSeq <= 0\n ) {\n throw invalidCommand(\"Command envelope is invalid.\");\n }\n const record = this.executions.get(command.executionId);\n if (\n !record ||\n record.status !== \"running\" ||\n record.abortController.signal.aborted\n ) {\n throw new PageCommandError({\n code: \"EXECUTION_CANCELLED\",\n message: \"The execution is no longer active.\",\n });\n }\n if (command.commandSeq <= record.lastSeq) {\n throw invalidCommand(\"Command sequence must be strictly increasing.\");\n }\n record.lastSeq = command.commandSeq;\n record.callCount += 1;\n if (record.callCount > this.limits.maxPageCalls) {\n throw invalidCommand(\n `Page API call budget exceeded (${this.limits.maxPageCalls}).`,\n );\n }\n this.validateCommand(command);\n return record;\n }\n\n private validateCommand(command: PageCommand): void {\n if (\n !command.target ||\n typeof command.target !== \"object\" ||\n ![\"page\", \"ref\", \"locator\"].includes(command.target.type) ||\n typeof command.method !== \"string\"\n ) {\n throw invalidCommand(\"Command target or method is invalid.\");\n }\n if (command.target.type === \"page\") {\n if (!PAGE_METHODS.has(command.method as PageMethod)) {\n throw invalidCommand(`Unsupported page method: ${command.method}`);\n }\n } else {\n if (!LOCATOR_METHODS.has(command.method as LocatorMethod)) {\n throw invalidCommand(`Unsupported locator method: ${command.method}`);\n }\n if (command.target.type === \"ref\") {\n if (!/^@\\d+$/.test(command.target.ref)) {\n throw invalidCommand(\"Snapshot ref is invalid.\");\n }\n } else {\n validateLocator(\n command.target.locator,\n this.limits.maxArgumentChars,\n );\n }\n }\n validateArgs(command, this.limits.maxArgumentChars);\n }\n\n async execute(command: PageCommand, beforeAction?: () => Promise<void>): Promise<CommandResponse> {\n let record = this.executions.get(command.executionId);\n let presentationFailed = false;\n try {\n record = this.requireActive(command);\n const value =\n command.target.type === \"page\"\n ? await this.executePage(command, record)\n : await this.executeTarget(command, record, beforeAction && (async () => {\n try { await beforeAction(); }\n catch (error) { presentationFailed = true; throw error; }\n }));\n if (\n ACTION_METHODS.has(command.method) &&\n !record.completedActions.some(\n (action) => action.callIndex === command.commandSeq,\n )\n ) {\n this.recordCompletedAction(record, command);\n }\n return { ok: true, value };\n } catch (error) {\n if (record && !record.failedCall) {\n const target = targetLabel(command);\n record.failedCall = {\n callIndex: command.commandSeq,\n method: command.method,\n ...(target ? { target } : {}),\n };\n }\n if (presentationFailed) throw error;\n if (error instanceof PageCommandError) {\n return { ok: false, error: error.detail };\n }\n return {\n ok: false,\n error: {\n code: \"EXECUTION_OUTCOME_UNKNOWN\",\n message: error instanceof Error ? error.message : String(error),\n },\n };\n }\n }\n\n private async executePage(\n command: PageCommand,\n record: ExecutionRecord,\n ): Promise<unknown> {\n if (command.method === \"scrollBy\") {\n const value = (command.args[0] ?? {}) as { x?: number; y?: number };\n window.scrollBy({\n left: Number(value.x ?? 0),\n top: Number(value.y ?? 0),\n behavior: \"auto\",\n });\n return null;\n }\n if (command.method === \"waitForTimeout\") {\n const requested = Number(command.args[0] ?? 0);\n const duration = Math.max(\n 0,\n Math.min(requested, this.limits.singleActionTimeoutMs),\n );\n await measurePagePhase(\"explicit-wait\", () => new Promise<void>((resolve, reject) => {\n const onAbort = (): void => {\n window.clearTimeout(timer);\n reject(\n new PageCommandError({\n code: \"EXECUTION_CANCELLED\",\n message: \"Execution was cancelled while waiting.\",\n }),\n );\n };\n const timer = window.setTimeout(() => {\n record.abortController.signal.removeEventListener(\"abort\", onAbort);\n resolve();\n }, duration);\n record.abortController.signal.addEventListener(\"abort\", onAbort, {\n once: true,\n });\n }));\n return null;\n }\n if (command.method === \"waitForURL\") {\n let expectedUrl: string;\n try {\n expectedUrl = new URL(String(command.args[0]), location.href).href;\n } catch {\n throw invalidCommand(\"waitForURL() URL is invalid.\");\n }\n const options = (command.args[1] ?? {}) as { timeout?: number };\n const timeout = Math.min(\n options.timeout ?? WAIT_FOR_URL_TIMEOUT_MS,\n WAIT_FOR_URL_TIMEOUT_MS,\n this.limits.singleActionTimeoutMs,\n );\n if (location.href === expectedUrl) return null;\n await new Promise<void>((resolve, reject) => {\n let settled = false;\n const cleanup = (): void => {\n window.clearInterval(interval);\n window.clearTimeout(timer);\n record.abortController.signal.removeEventListener(\"abort\", onAbort);\n };\n const settle = (error?: PageCommandError): void => {\n if (settled) return;\n settled = true;\n cleanup();\n if (error) reject(error);\n else resolve();\n };\n const onAbort = (): void => settle(new PageCommandError({\n code: \"EXECUTION_CANCELLED\",\n message: \"Execution was cancelled while waiting for the URL.\",\n }));\n const interval = window.setInterval(() => {\n if (location.href === expectedUrl) settle();\n }, URL_POLL_INTERVAL_MS);\n const timer = window.setTimeout(() => settle(new PageCommandError({\n code: \"ACTION_TIMEOUT\",\n message: `URL did not become ${expectedUrl} within ${timeout}ms.`,\n })), timeout);\n record.abortController.signal.addEventListener(\"abort\", onAbort, {\n once: true,\n });\n });\n return null;\n }\n throw invalidCommand(`Unsupported page method: ${command.method}`);\n }\n\n private resolveRef(\n command: PageCommand,\n record: ExecutionRecord,\n ): RefTarget | undefined {\n if (command.target.type !== \"ref\") return undefined;\n return record.registry.refs.get(command.target.ref);\n }\n\n private locator(command: PageCommand): LocatorDescriptor | undefined {\n return command.target.type === \"locator\"\n ? command.target.locator\n : undefined;\n }\n\n private async executeTarget(\n command: PageCommand,\n record: ExecutionRecord,\n beforeAction?: () => Promise<void>,\n ): Promise<unknown> {\n const signal = record.abortController.signal;\n const ref = this.resolveRef(command, record);\n const locator = this.locator(command);\n\n if (command.method === \"exists\") {\n if (ref) {\n try {\n requireValidRef(ref);\n return true;\n } catch {\n return false;\n }\n }\n return locator ? resolveLocator(locator).length > 0 : false;\n }\n\n if (command.method === \"waitFor\") {\n const options = (command.args[0] ?? {}) as {\n state?: \"visible\" | \"hidden\" | \"attached\";\n timeout?: number;\n };\n if (!locator) {\n requireValidRef(ref);\n return null;\n }\n await waitForLocator(\n locator,\n options.state ?? \"visible\",\n Math.min(\n options.timeout ?? this.limits.singleActionTimeoutMs,\n this.limits.singleActionTimeoutMs,\n ),\n signal,\n );\n return null;\n }\n\n if (command.method === \"text\") {\n const element = ref\n ? requireValidRef(ref)\n : locator\n ? requireUnique(locator)\n : undefined;\n if (!element) throw invalidCommand(\"Target is missing.\");\n if (\n element instanceof HTMLInputElement ||\n element instanceof HTMLTextAreaElement ||\n element instanceof HTMLSelectElement\n ) {\n return element.value;\n }\n return normalizeText(element.textContent);\n }\n\n if (command.method === \"scrollIntoView\") {\n const element = ref\n ? requireValidRef(ref)\n : locator\n ? requireUnique(locator)\n : undefined;\n if (!element) throw invalidCommand(\"Target is missing.\");\n const beforeIdentity = createIdentity(element);\n element.scrollIntoView({\n block: \"center\",\n inline: \"nearest\",\n behavior: \"auto\",\n });\n this.recordCompletedAction(record, command);\n await new Promise<void>((resolve) =>\n requestAnimationFrame(() => resolve()),\n );\n signal.throwIfAborted();\n if (!element.isConnected || createIdentity(element) !== beforeIdentity) {\n throw new PageCommandError({\n code: \"REF_ACTION_FAILED\",\n message: \"Target changed while scrolling.\",\n });\n }\n return null;\n }\n\n if (command.method === \"scrollBy\" || command.method === \"scrollTo\") {\n const element = ref\n ? ref.element\n : locator\n ? requireUnique(locator)\n : undefined;\n if (!(element instanceof HTMLElement)) {\n throw new PageCommandError({\n code: \"UNSUPPORTED_OPERATION\",\n message: \"Scroll target is not an HTML element.\",\n });\n }\n if (ref?.kind !== \"scrollable\") {\n if (ref) {\n throw new PageCommandError({\n code: \"UNSUPPORTED_OPERATION\",\n message: \"Snapshot ref is not a scrollable container.\",\n });\n }\n }\n const identity = createScrollableIdentity(element);\n if (!element.isConnected || (ref && identity !== ref.identity)) {\n throw new PageCommandError({\n code: \"REF_ACTION_FAILED\",\n message: \"Scrollable target changed after the snapshot.\",\n });\n }\n const scrollability = getElementScrollability(element);\n if (!scrollability) {\n throw new PageCommandError({\n code: \"UNSUPPORTED_OPERATION\",\n message: \"Target does not currently have a scroll range.\",\n });\n }\n\n this.requireStillActive(record);\n if (command.method === \"scrollBy\") {\n const value = command.args[0] as { x?: number; y?: number };\n if (\n (value.x !== undefined && value.x !== 0 && !scrollability.x) ||\n (value.y !== undefined && value.y !== 0 && !scrollability.y)\n ) {\n throw new PageCommandError({\n code: \"UNSUPPORTED_OPERATION\",\n message: \"Requested axis does not have a scroll range.\",\n });\n }\n element.scrollBy({\n left: Number(value.x ?? 0),\n top: Number(value.y ?? 0),\n behavior: \"auto\",\n });\n } else {\n const value = command.args[0] as { left?: number; top?: number };\n if (\n (value.left !== undefined &&\n value.left !== element.scrollLeft &&\n !scrollability.x) ||\n (value.top !== undefined &&\n value.top !== element.scrollTop &&\n !scrollability.y)\n ) {\n throw new PageCommandError({\n code: \"UNSUPPORTED_OPERATION\",\n message: \"Requested axis does not have a scroll range.\",\n });\n }\n element.scrollTo({\n left: Number(value.left ?? element.scrollLeft),\n top: Number(value.top ?? element.scrollTop),\n behavior: \"auto\",\n });\n }\n this.recordCompletedAction(record, command);\n await waitAnimationFrames(2, signal);\n if (!element.isConnected || createScrollableIdentity(element) !== identity) {\n throw new PageCommandError({\n code: \"REF_ACTION_FAILED\",\n message: \"Scrollable target changed while scrolling.\",\n });\n }\n return null;\n }\n\n const element = ref\n ? await prepareRefForAction(ref, signal)\n : locator\n ? (await waitForLocator(\n locator,\n \"visible\",\n this.limits.singleActionTimeoutMs,\n signal,\n ),\n await prepareLocatorForAction(locator, signal))\n : undefined;\n if (!element) throw invalidCommand(\"Target is missing.\");\n\n this.requireStillActive(record);\n await beforeAction?.();\n this.requireStillActive(record);\n this.animator.before(command.method, element);\n this.requireStillActive(record);\n const result = this.performAction(element, command);\n this.recordCompletedAction(record, command);\n this.animator.after(command.method);\n return result;\n }\n\n private recordCompletedAction(\n record: ExecutionRecord,\n command: PageCommand,\n ): void {\n if (record.completedActions.some(\n (action) => action.callIndex === command.commandSeq,\n )) {\n return;\n }\n const target = targetLabel(command);\n record.completedActions.push({\n callIndex: command.commandSeq,\n method: command.method,\n ...(target ? { target } : {}),\n });\n }\n\n private requireStillActive(record: ExecutionRecord): void {\n if (\n record.status !== \"running\" ||\n record.abortController.signal.aborted\n ) {\n throw new PageCommandError({\n code: \"EXECUTION_CANCELLED\",\n message: \"Execution was cancelled before the DOM action.\",\n });\n }\n }\n\n private performAction(\n element: Element,\n command: PageCommand,\n ): unknown {\n if (command.method === \"click\") {\n dispatchClickSequence(element);\n return null;\n }\n if (command.method === \"fill\") {\n const value = String(command.args[0] ?? \"\");\n if (\n (element instanceof HTMLInputElement ||\n element instanceof HTMLTextAreaElement) &&\n !element.readOnly\n ) {\n focusForAgent(element);\n setNativeValue(element, value);\n return null;\n }\n if (element instanceof HTMLElement && element.isContentEditable) {\n focusForAgent(element);\n element.textContent = value;\n dispatchInput(element);\n return null;\n }\n throw new PageCommandError({\n code: \"NOT_EDITABLE\",\n message: \"fill() target is not editable.\",\n });\n }\n if (command.method === \"press\") {\n const key = String(command.args[0] ?? \"\");\n element.dispatchEvent(\n new KeyboardEvent(\"keydown\", { key, bubbles: true }),\n );\n element.dispatchEvent(\n new KeyboardEvent(\"keyup\", { key, bubbles: true }),\n );\n return null;\n }\n if (command.method === \"check\" || command.method === \"uncheck\") {\n const checked = command.method === \"check\";\n if (element.getAttribute(\"role\") === \"option\"\n && element.closest('[role=\"listbox\"]')?.getAttribute(\"aria-multiselectable\") === \"true\"\n && [\"true\", \"false\"].includes(element.getAttribute(\"aria-selected\") ?? \"\")) {\n if ((element.getAttribute(\"aria-selected\") === \"true\") !== checked) dispatchClickSequence(element);\n return null;\n }\n if (\n element instanceof HTMLInputElement &&\n [\"checkbox\", \"radio\"].includes(element.type)\n ) {\n if (element.type === \"radio\" && !checked) {\n throw new PageCommandError({\n code: \"UNSUPPORTED_OPERATION\",\n message: \"Native radio elements cannot be unchecked directly.\",\n });\n }\n if (element.checked !== checked) {\n dispatchClickSequence(element);\n }\n return null;\n }\n if (element.getAttribute(\"aria-checked\") !== null) {\n const current = element.getAttribute(\"aria-checked\") === \"true\";\n if (current !== checked) dispatchClickSequence(element);\n return null;\n }\n throw new PageCommandError({\n code: \"UNSUPPORTED_OPERATION\",\n message: `${command.method}() target is not checkable.`,\n });\n }\n if (command.method === \"setOptionSelected\") {\n const [value, selected, label] = command.args;\n const options = element instanceof HTMLSelectElement && element.multiple\n ? [...element.options].filter((option) => option.value === value) : [];\n const option = options[0];\n if (options.length !== 1 || !option || option.label !== label || option.disabled || option.closest(\"optgroup[disabled]\")) {\n throw invalidCommand(\"The observed multiple-select option is no longer available.\");\n }\n if (option.selected !== selected) {\n option.selected = selected as boolean;\n dispatchInput(element);\n }\n return null;\n }\n if (command.method === \"selectOption\") {\n if (!(element instanceof HTMLSelectElement)) {\n throw new PageCommandError({\n code: \"UNSUPPORTED_OPERATION\",\n message: \"selectOption() currently supports native select elements.\",\n });\n }\n const requested = command.args[0];\n const values = Array.isArray(requested)\n ? requested.map(String)\n : [String(requested ?? \"\")];\n const availableValues = new Set(\n Array.from(element.options, (option) => option.value),\n );\n const missing = values.filter((value) => !availableValues.has(value));\n if (missing.length > 0) {\n throw new PageCommandError({\n code: \"NOT_FOUND\",\n message: `selectOption() values were not found: ${missing.join(\", \")}`,\n });\n }\n for (const option of element.options) {\n option.selected = values.includes(option.value);\n }\n dispatchInput(element);\n return null;\n }\n if (command.method === \"hover\") {\n element.dispatchEvent(\n new MouseEvent(\"mouseover\", { bubbles: true, composed: true }),\n );\n element.dispatchEvent(\n new MouseEvent(\"mouseenter\", { bubbles: false, composed: true }),\n );\n return null;\n }\n if (command.method === \"focus\") {\n focusForAgent(element as HTMLElement);\n return null;\n }\n if (command.method === \"blur\") {\n (element as HTMLElement).blur();\n return null;\n }\n throw invalidCommand(`Unsupported locator method: ${command.method}`);\n }\n}\n"]}
@@ -0,0 +1 @@
1
+ export declare function measurePagePhase<T>(phase: string, execute: () => Promise<T>): Promise<T>;
@@ -0,0 +1,20 @@
1
+ // Internal User Timing entries are consumed by local diagnostic tooling.
2
+ export async function measurePagePhase(phase, execute) {
3
+ const start = performance.now();
4
+ let status = "completed";
5
+ try {
6
+ return await execute();
7
+ }
8
+ catch (error) {
9
+ status = "error";
10
+ throw error;
11
+ }
12
+ finally {
13
+ try {
14
+ performance.measure("nexface.browser.phase", { start, end: performance.now(), detail: { phase, status } });
15
+ performance.clearMeasures("nexface.browser.phase");
16
+ }
17
+ catch { /* Diagnostics must never interrupt execution. */ }
18
+ }
19
+ }
20
+ //# sourceMappingURL=diagnostics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../src/browser/diagnostics.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAI,KAAa,EAAE,OAAyB;IAChF,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IAChC,IAAI,MAAM,GAAG,WAAW,CAAC;IACzB,IAAI,CAAC;QAAC,OAAO,MAAM,OAAO,EAAE,CAAC;IAAC,CAAC;IAC/B,OAAO,KAAK,EAAE,CAAC;QAAC,MAAM,GAAG,OAAO,CAAC;QAAC,MAAM,KAAK,CAAC;IAAC,CAAC;YACxC,CAAC;QACP,IAAI,CAAC;YACH,WAAW,CAAC,OAAO,CAAC,uBAAuB,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,WAAW,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;YAC3G,WAAW,CAAC,aAAa,CAAC,uBAAuB,CAAC,CAAC;QACrD,CAAC;QAAC,MAAM,CAAC,CAAC,iDAAiD,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC","sourcesContent":["// Internal User Timing entries are consumed by local diagnostic tooling.\nexport async function measurePagePhase<T>(phase: string, execute: () => Promise<T>): Promise<T> {\n const start = performance.now();\n let status = \"completed\";\n try { return await execute(); }\n catch (error) { status = \"error\"; throw error; }\n finally {\n try {\n performance.measure(\"nexface.browser.phase\", { start, end: performance.now(), detail: { phase, status } });\n performance.clearMeasures(\"nexface.browser.phase\");\n } catch { /* Diagnostics must never interrupt execution. */ }\n }\n}\n"]}