@orkestrel/browser 0.0.15 → 0.0.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -18
- package/dist/src/core/index.cjs +132 -101
- package/dist/src/core/index.cjs.map +1 -1
- package/dist/src/core/index.d.cts +463 -102
- package/dist/src/core/index.d.ts +463 -102
- package/dist/src/core/index.js +133 -102
- package/dist/src/core/index.js.map +1 -1
- package/dist/src/server/index.cjs +93 -31
- package/dist/src/server/index.cjs.map +1 -1
- package/dist/src/server/index.d.cts +154 -56
- package/dist/src/server/index.d.ts +154 -56
- package/dist/src/server/index.js +93 -31
- package/dist/src/server/index.js.map +1 -1
- package/package.json +16 -17
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../src/core/constants.ts","../../../src/core/errors.ts","../../../src/core/parsers.ts","../../../src/core/helpers.ts","../../../src/core/compilers.ts","../../../src/core/BrowserTransition.ts","../../../src/core/CDPClient.ts","../../../src/core/BrowserAccessibility.ts","../../../src/core/BrowserClock.ts","../../../src/core/BrowserCoverage.ts","../../../src/core/BrowserCookieManager.ts","../../../src/core/BrowserEmulationManager.ts","../../../src/core/BrowserCodegen.ts","../../../src/core/BrowserPerformance.ts","../../../src/core/BrowserProfiler.ts","../../../src/core/BrowserTracing.ts","../../../src/core/BrowserDiagnostics.ts","../../../src/core/BrowserDialog.ts","../../../src/core/BrowserDownload.ts","../../../src/core/BrowserHandle.ts","../../../src/core/BrowserKeyboard.ts","../../../src/core/BrowserMouse.ts","../../../src/core/BrowserLocator.ts","../../../src/core/BrowserSelectorManager.ts","../../../src/core/BrowserTouch.ts","../../../src/core/BrowserFrame.ts","../../../src/core/BrowserFileChooser.ts","../../../src/core/BrowserHARManager.ts","../../../src/core/BrowserRoute.ts","../../../src/core/BrowserWebSocket.ts","../../../src/core/BrowserNetworkManager.ts","../../../src/core/BrowserNavigationManager.ts","../../../src/core/BrowserScriptManager.ts","../../../src/core/BrowserSnapshot.ts","../../../src/core/BrowserWorker.ts","../../../src/core/BrowserPage.ts","../../../src/core/BrowserPermissionManager.ts","../../../src/core/BrowserStorageManager.ts","../../../src/core/BrowserContext.ts","../../../src/core/factories.ts"],"sourcesContent":["import type { BrowserMouseButton } from './types.js'\n\n// === Base64\n//\n// The lookup table is written out rather than computed from BASE64_CHARS at module scope:\n// constants.ts holds data, and a module-scope callback here is a placement violation the fleet\n// policy sweep rejects. Entry n of the table is BASE64_CHARS[n], and the whole-alphabet\n// round-trip in tests/src/core/helpers.test.ts fails on any single-entry disagreement.\n\n/** Holds the index-ordered base64 alphabet used to build {@link BASE64_LOOKUP}. */\nexport const BASE64_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\n\n/** Maps each base64 character to its 6-bit value, derived from {@link BASE64_CHARS}. */\nexport const BASE64_LOOKUP: Readonly<Record<string, number>> = Object.freeze({\n\tA: 0,\n\tB: 1,\n\tC: 2,\n\tD: 3,\n\tE: 4,\n\tF: 5,\n\tG: 6,\n\tH: 7,\n\tI: 8,\n\tJ: 9,\n\tK: 10,\n\tL: 11,\n\tM: 12,\n\tN: 13,\n\tO: 14,\n\tP: 15,\n\tQ: 16,\n\tR: 17,\n\tS: 18,\n\tT: 19,\n\tU: 20,\n\tV: 21,\n\tW: 22,\n\tX: 23,\n\tY: 24,\n\tZ: 25,\n\ta: 26,\n\tb: 27,\n\tc: 28,\n\td: 29,\n\te: 30,\n\tf: 31,\n\tg: 32,\n\th: 33,\n\ti: 34,\n\tj: 35,\n\tk: 36,\n\tl: 37,\n\tm: 38,\n\tn: 39,\n\to: 40,\n\tp: 41,\n\tq: 42,\n\tr: 43,\n\ts: 44,\n\tt: 45,\n\tu: 46,\n\tv: 47,\n\tw: 48,\n\tx: 49,\n\ty: 50,\n\tz: 51,\n\t'0': 52,\n\t'1': 53,\n\t'2': 54,\n\t'3': 55,\n\t'4': 56,\n\t'5': 57,\n\t'6': 58,\n\t'7': 59,\n\t'8': 60,\n\t'9': 61,\n\t'+': 62,\n\t'/': 63,\n})\n\n// === Browser\n\n/** Sets the default timeout in milliseconds for browser connection, requests, and navigation. */\nexport const BROWSER_DEFAULT_TIMEOUT_MS = 30_000\n\n/**\n * Caps the serialized-character length for an `evaluate()`/`content()` result,\n * enforced IN-PAGE before the result is returned to CDP.\n *\n * @remarks\n * This counts UTF-16 STRING LENGTH (`String#length`), not transport BYTES —\n * the actual CDP frame is UTF-8 encoded (up to 3 bytes/char for common\n * multibyte content) and carries additional JSON/CDP framing overhead on top\n * of the raw content. A `Runtime.evaluate` result above this size, once\n * framed as a CDP JSON response, overflows the native WebSocket inbound frame\n * limit and closes the whole CDP connection — a page-level failure with no\n * clean error. The limit is set well under the observed ~3-4MB transport\n * ceiling (rather than at it) to leave headroom for the length-vs-bytes gap\n * and framing overhead. The cap is enforced by stringifying the candidate\n * result in-page and throwing a recognizable sentinel error (see\n * {@link BROWSER_RESULT_LIMIT_SENTINEL_PREFIX}) before the oversized frame is\n * ever produced, so the caller gets a coded error instead of a dropped\n * connection.\n */\nexport const BROWSER_RESULT_LIMIT = 2_500_000\n\n/**\n * Names the distinctive prefix for the in-page result-limit sentinel error, immediately\n * followed by the serialized length.\n *\n * @remarks\n * Deliberately unlikely to appear in a page's own thrown error text (unlike\n * a plain `BROWSER_RESULT_LIMIT: ` label), so {@link BROWSER_RESULT_LIMIT_PATTERN}\n * can distinguish the guard's own throw from a page error that merely\n * mentions similar text.\n */\nexport const BROWSER_RESULT_LIMIT_SENTINEL_PREFIX = '[[ORKESTREL_BROWSER_RESULT_LIMIT]]'\n\n/**\n * Matches the in-page result-limit sentinel error message, anchored\n * immediately after the `Error: ` (optionally `Uncaught Error: `) prefix that\n * Chromium prepends to a thrown error's description — so the guard's own\n * throw is recognized only at the message START, not wherever the substring\n * happens to occur.\n */\nexport const BROWSER_RESULT_LIMIT_PATTERN = new RegExp(\n\t`^(?:Uncaught )?Error: \\\\[\\\\[ORKESTREL_BROWSER_RESULT_LIMIT\\\\]\\\\](\\\\d+)`,\n)\n\n/** Sets the poll interval in milliseconds while waiting for a selector to appear. */\nexport const BROWSER_WAIT_POLL_INTERVAL_MS = 100\n\n/** Sets the default maximum node count accepted from a decoded CDP DOM snapshot. */\nexport const BROWSER_SNAPSHOT_NODE_LIMIT = 100_000\n\n/** Names the isolated world used for iframe evaluation. */\nexport const BROWSER_FRAME_WORLD_NAME = '__orkestrelBrowserFrame'\n\n/** Names the attribute the semantic test-id selector uses. */\nexport const BROWSER_TEST_ID_ATTRIBUTE = 'data-testid'\n\n/** Sets the number of animation frames whose element bounds must agree before trusted input. */\nexport const BROWSER_STABLE_FRAME_COUNT = 2\n\n/**\n * Holds the in-page visibility predicate source, over a `style` computed style and a\n * `rect` bounding box already in scope at the interpolation site.\n *\n * @remarks\n * Every compiled expression that decides whether an element is visible\n * interpolates this one source, so what \"visible\" means has a single\n * definition rather than one copy per compiler.\n */\nexport const BROWSER_VISIBILITY_SOURCE =\n\t\"style.display !== 'none' && style.visibility !== 'hidden' && style.visibility !== 'collapse' && rect.width > 0 && rect.height > 0\"\n\n/** Maps a canonical modifier name to its CDP Input modifier bit value. */\nexport const BROWSER_KEY_MODIFIERS: Readonly<Record<string, number>> = Object.freeze({\n\tAlt: 1,\n\tControl: 2,\n\tMeta: 4,\n\tShift: 8,\n})\n\n/** Maps each public mouse button to its CDP Input pressed-button bit value. */\nexport const BROWSER_MOUSE_BUTTON_MASKS: Readonly<Record<BrowserMouseButton, number>> =\n\tObject.freeze({\n\t\tleft: 1,\n\t\tright: 2,\n\t\tmiddle: 4,\n\t\tback: 8,\n\t\tforward: 16,\n\t})\n\n/**\n * Names the tool identity embedded in HAR 1.2 documents.\n *\n * @remarks\n * `version` is this package's own released version. A parity test in\n * `tests/src/core/BrowserHARManager.test.ts` compares it against the manifest,\n * so the archive stamp cannot drift away from the release that wrote it.\n */\nexport const BROWSER_HAR_CREATOR = Object.freeze({\n\tname: '@orkestrel/browser',\n\tversion: '0.0.15',\n})\n\n/** Names the attribute that tags temporary screenshot styles and masks. */\nexport const BROWSER_SCREENSHOT_ATTRIBUTE = 'data-orkestrel-screenshot'\n\n/**\n * Bounds (in milliseconds) the best-effort `Page.stopLoading` call issued\n * after a failed `navigate()`.\n *\n * @remarks\n * A wedged renderer can make the underlying CDP call hang for the full\n * per-call timeout; capping it to a small fixed bound keeps a navigate\n * failure's total latency close to the original timeout instead of doubling\n * it. Best-effort only — never masks the original navigate error.\n */\nexport const BROWSER_STOP_LOADING_TIMEOUT_MS = 1_000\n\n/** Sets the default viewport width in pixels. */\nexport const BROWSER_DEFAULT_VIEWPORT_WIDTH = 1280\n\n/** Sets the default viewport height in pixels. */\nexport const BROWSER_DEFAULT_VIEWPORT_HEIGHT = 720\n\n// === Browser codegen\n\n/** Names the CDP runtime binding the codegen recorder script calls into. */\nexport const BROWSER_CODEGEN_BINDING_NAME = '__orkestrelBrowserCodegen'\n\n/**\n * Holds the in-page recorder script injected through `Page.addScriptToEvaluateOnNewDocument`\n * and `Runtime.evaluate`.\n *\n * @remarks\n * Attaches capturing-phase listeners for `click`, `input` (fill), and\n * `change` (select) on `document`, builds a stable CSS selector for the\n * target element, and forwards each action to the CDP binding\n * ({@link BROWSER_CODEGEN_BINDING_NAME}) as a JSON string payload. Guarded to\n * install exactly once per document (`window[name]` sentinel) so repeated\n * injection on every new document is idempotent.\n */\nexport const BROWSER_CODEGEN_SOURCE = `(() => {\n\tconst bindingName = ${JSON.stringify(BROWSER_CODEGEN_BINDING_NAME)}\n\tif (window[bindingName + '__installed']) return\n\twindow[bindingName + '__installed'] = true\n\n\tconst selectorFor = (el) => {\n\t\tif (el.id) return '#' + CSS.escape(el.id)\n\t\tconst parts = []\n\t\tlet node = el\n\t\twhile (node && node.nodeType === 1 && parts.length < 8) {\n\t\t\tlet part = node.tagName.toLowerCase()\n\t\t\tif (node.classList && node.classList.length > 0) {\n\t\t\t\tpart += '.' + Array.from(node.classList).map((cls) => CSS.escape(cls)).join('.')\n\t\t\t}\n\t\t\tconst parent = node.parentElement\n\t\t\tif (parent) {\n\t\t\t\tconst siblings = Array.from(parent.children).filter((c) => c.tagName === node.tagName)\n\t\t\t\tif (siblings.length > 1) {\n\t\t\t\t\tpart += ':nth-of-type(' + (siblings.indexOf(node) + 1) + ')'\n\t\t\t\t}\n\t\t\t}\n\t\t\tparts.unshift(part)\n\t\t\tnode = parent\n\t\t}\n\t\treturn parts.join(' > ')\n\t}\n\n\tconst send = (payload) => {\n\t\tif (typeof window[bindingName] === 'function') {\n\t\t\twindow[bindingName](JSON.stringify(payload))\n\t\t}\n\t}\n\n\tdocument.addEventListener(\n\t\t'click',\n\t\t(event) => {\n\t\t\tconst target = event.target\n\t\t\tif (!target || target.nodeType !== 1) return\n\t\t\tsend({ action: 'click', selector: selectorFor(target) })\n\t\t},\n\t\ttrue,\n\t)\n\n\tconst fillableTypes = new Set([\n\t\t'text',\n\t\t'search',\n\t\t'url',\n\t\t'tel',\n\t\t'email',\n\t\t'password',\n\t\t'number',\n\t])\n\n\tdocument.addEventListener(\n\t\t'input',\n\t\t(event) => {\n\t\t\tconst target = event.target\n\t\t\tif (!target || target.nodeType !== 1) return\n\n\t\t\tif (target.isContentEditable) {\n\t\t\t\tsend({ action: 'fill', selector: selectorFor(target), value: target.textContent || '' })\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif (typeof target.value !== 'string') return\n\t\t\tconst tag = target.tagName\n\t\t\tif (tag === 'TEXTAREA') {\n\t\t\t\tsend({ action: 'fill', selector: selectorFor(target), value: target.value })\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (tag === 'INPUT' && fillableTypes.has((target.type || 'text').toLowerCase())) {\n\t\t\t\tsend({ action: 'fill', selector: selectorFor(target), value: target.value })\n\t\t\t}\n\t\t},\n\t\ttrue,\n\t)\n\n\tdocument.addEventListener(\n\t\t'change',\n\t\t(event) => {\n\t\t\tconst target = event.target\n\t\t\tif (!target || target.tagName !== 'SELECT') return\n\t\t\tconst values = Array.from(target.selectedOptions || []).map((option) => option.value)\n\t\t\tsend({ action: 'select', selector: selectorFor(target), values })\n\t\t},\n\t\ttrue,\n\t)\n})()`\n","import { isInstance } from '@orkestrel/contract'\n\n// === Browser errors\n\n/**\n * Represents the base error for all browser automation operations.\n *\n * @remarks\n * Carries a machine-readable `code` and optional `context` so\n * callers can branch in a `catch` without parsing message strings.\n */\nexport class BrowserError extends Error {\n\treadonly code: string\n\treadonly context: Readonly<Record<string, unknown>> | undefined\n\n\tconstructor(\n\t\tmessage: string,\n\t\tcode = 'BROWSER_ERROR',\n\t\tcontext?: Readonly<Record<string, unknown>>,\n\t) {\n\t\tsuper(message)\n\t\tthis.name = 'BrowserError'\n\t\tthis.code = code\n\t\tthis.context = context\n\t}\n}\n\n/**\n * Reports that a selector-based lookup or wait timed out without the element appearing.\n */\nexport class BrowserSelectorError extends BrowserError {\n\tconstructor(message: string, context?: Readonly<Record<string, unknown>>) {\n\t\tsuper(message, 'BROWSER_SELECTOR_ERROR', context)\n\t\tthis.name = 'BrowserSelectorError'\n\t}\n}\n\n/**\n * Reports that a CDP request received an error response from the remote endpoint.\n *\n * @remarks\n * Carries the originating `method` plus the CDP error's own `code`,\n * `message`, and `data` (when present) in `context`, so callers can branch\n * on the protocol-level error instead of parsing the message string.\n */\nexport class CDPError extends BrowserError {\n\tconstructor(message: string, context?: Readonly<Record<string, unknown>>) {\n\t\tsuper(message, 'BROWSER_CDP_ERROR', context)\n\t\tthis.name = 'CDPError'\n\t}\n}\n\n/**\n * Reports that a CDP request could not be sent or completed because the client was not in\n * a connectable state (not connected, closed while connecting, or the\n * connection dropped mid-request).\n */\nexport class CDPConnectionError extends BrowserError {\n\tconstructor(message: string, context?: Readonly<Record<string, unknown>>) {\n\t\tsuper(message, 'BROWSER_CDP_CONNECTION_ERROR', context)\n\t\tthis.name = 'CDPConnectionError'\n\t}\n}\n\n/**\n * Reports that a pending CDP request was not answered within its timeout window.\n */\nexport class CDPTimeoutError extends BrowserError {\n\tconstructor(message: string, context?: Readonly<Record<string, unknown>>) {\n\t\tsuper(message, 'BROWSER_CDP_TIMEOUT_ERROR', context)\n\t\tthis.name = 'CDPTimeoutError'\n\t}\n}\n\n/**\n * Reports that an `evaluate()`/`content()` result exceeded {@link BROWSER_RESULT_LIMIT}\n * and was rejected in-page before it could overflow the CDP transport frame.\n */\nexport class BrowserResultLimitError extends BrowserError {\n\tconstructor(message: string, context?: Readonly<Record<string, unknown>>) {\n\t\tsuper(message, 'BROWSER_RESULT_LIMIT_ERROR', context)\n\t\tthis.name = 'BrowserResultLimitError'\n\t}\n}\n\n// === Browser type guards\n\n/**\n * Narrows an unknown value to BrowserError.\n *\n * @param value - Value to check\n * @returns True if value is a BrowserError instance; false otherwise\n */\nexport function isBrowserError(value: unknown): value is BrowserError {\n\treturn isInstance(value, BrowserError)\n}\n\n/**\n * Narrows an unknown value to BrowserSelectorError.\n *\n * @param value - Value to check\n * @returns True if value is a BrowserSelectorError instance; false otherwise\n */\nexport function isBrowserSelectorError(value: unknown): value is BrowserSelectorError {\n\treturn isInstance(value, BrowserSelectorError)\n}\n\n/**\n * Narrows an unknown value to CDPError.\n *\n * @param value - Value to check\n * @returns True if value is a CDPError instance; false otherwise\n */\nexport function isCDPError(value: unknown): value is CDPError {\n\treturn isInstance(value, CDPError)\n}\n\n/**\n * Narrows an unknown value to CDPConnectionError.\n *\n * @param value - Value to check\n * @returns True if value is a CDPConnectionError instance; false otherwise\n */\nexport function isCDPConnectionError(value: unknown): value is CDPConnectionError {\n\treturn isInstance(value, CDPConnectionError)\n}\n\n/**\n * Narrows an unknown value to CDPTimeoutError.\n *\n * @param value - Value to check\n * @returns True if value is a CDPTimeoutError instance; false otherwise\n */\nexport function isCDPTimeoutError(value: unknown): value is CDPTimeoutError {\n\treturn isInstance(value, CDPTimeoutError)\n}\n\n/**\n * Narrows an unknown value to BrowserResultLimitError.\n *\n * @param value - Value to check\n * @returns True if value is a BrowserResultLimitError instance; false otherwise\n */\nexport function isBrowserResultLimitError(value: unknown): value is BrowserResultLimitError {\n\treturn isInstance(value, BrowserResultLimitError)\n}\n","import type {\n\tBrowserBindingCall,\n\tBrowserCodegenAction,\n\tBrowserConsoleMessage,\n\tBrowserCookiePartition,\n\tBrowserDownloadProgress,\n\tBrowserDownloadStart,\n\tBrowserPageError,\n\tBrowserRect,\n\tBrowserRequest,\n\tBrowserRequestFailure,\n\tBrowserResponse,\n\tBrowserSecurity,\n\tBrowserTiming,\n\tBrowserTimingRange,\n\tBrowserWebSocketFrame,\n} from './types.js'\nimport {\n\tattempt,\n\tisArray,\n\tisBoolean,\n\tisFiniteNumber,\n\tisInteger,\n\tisRecord,\n\tisString,\n\tparseArray,\n\tparseEnum,\n\tparseJSON,\n} from '@orkestrel/contract'\nimport {\n\treadBrowserAXValue,\n\treadBrowserHeaders,\n\treadBrowserRemoteValue,\n\treadBrowserStack,\n} from './helpers.js'\n\n/**\n * Coerces one `Network.requestWillBeSent` or `Fetch.requestPaused` event to a\n * `BrowserRequest`, or `undefined` off-shape.\n *\n * @param value - Unknown event parameters\n * @returns Request or undefined\n */\nexport function parseBrowserRequest(value: unknown): BrowserRequest | undefined {\n\tif (!isRecord(value) || !isString(value['requestId']) || !isRecord(value['request'])) {\n\t\treturn undefined\n\t}\n\tconst request = value['request']\n\tif (!isString(request['url']) || !isString(request['method'])) {\n\t\treturn undefined\n\t}\n\tconst timestamp = isFiniteNumber(value['timestamp']) ? value['timestamp'] : undefined\n\tconst walltime = isFiniteNumber(value['wallTime']) ? value['wallTime'] : undefined\n\treturn {\n\t\tid: value['requestId'],\n\t\tloader: isString(value['loaderId']) ? value['loaderId'] : undefined,\n\t\tframe: isString(value['frameId']) ? value['frameId'] : undefined,\n\t\turl: request['url'],\n\t\tmethod: request['method'],\n\t\theaders: readBrowserHeaders(request['headers']),\n\t\tpost: isString(request['postData']) ? request['postData'] : undefined,\n\t\tresource: isString(value['type'])\n\t\t\t? value['type']\n\t\t\t: isString(value['resourceType'])\n\t\t\t\t? value['resourceType']\n\t\t\t\t: undefined,\n\t\ttimestamp,\n\t\twalltime,\n\t\tredirect: parseBrowserResponseRecord(\n\t\t\tvalue['redirectResponse'],\n\t\t\tvalue['requestId'],\n\t\t\tisString(value['loaderId']) ? value['loaderId'] : '',\n\t\t\tisString(value['frameId']) ? value['frameId'] : undefined,\n\t\t\ttimestamp ?? 0,\n\t\t),\n\t}\n}\n\n/**\n * Coerces one `Network.responseReceived` event to a `BrowserResponse`, or\n * `undefined` off-shape.\n *\n * @param value - Unknown event parameters\n * @returns Response or undefined\n */\nexport function parseBrowserResponse(value: unknown): BrowserResponse | undefined {\n\tif (\n\t\t!isRecord(value) ||\n\t\t!isString(value['requestId']) ||\n\t\t!isString(value['loaderId']) ||\n\t\t!isFiniteNumber(value['timestamp'])\n\t) {\n\t\treturn undefined\n\t}\n\treturn parseBrowserResponseRecord(\n\t\tvalue['response'],\n\t\tvalue['requestId'],\n\t\tvalue['loaderId'],\n\t\tisString(value['frameId']) ? value['frameId'] : undefined,\n\t\tvalue['timestamp'],\n\t)\n}\n\n/**\n * Coerces one Chromium response object plus its event identity to a\n * `BrowserResponse`, or `undefined` off-shape.\n *\n * @param value - Unknown response object\n * @param id - Request id\n * @param loader - Loader id\n * @param frame - Optional frame id\n * @param timestamp - Monotonic event timestamp\n * @returns Response or undefined\n */\nexport function parseBrowserResponseRecord(\n\tvalue: unknown,\n\tid: string,\n\tloader: string,\n\tframe: string | undefined,\n\ttimestamp: number,\n): BrowserResponse | undefined {\n\tif (\n\t\t!isRecord(value) ||\n\t\t!isString(value['url']) ||\n\t\t!isFiniteNumber(value['status']) ||\n\t\t!isString(value['statusText']) ||\n\t\t!isString(value['mimeType']) ||\n\t\t!isString(value['protocol']) ||\n\t\t!isFiniteNumber(timestamp)\n\t) {\n\t\treturn undefined\n\t}\n\treturn {\n\t\tid,\n\t\tloader,\n\t\tframe,\n\t\turl: value['url'],\n\t\tstatus: value['status'],\n\t\tphrase: value['statusText'],\n\t\theaders: readBrowserHeaders(value['headers']),\n\t\tmime: value['mimeType'],\n\t\tprotocol: value['protocol'],\n\t\taddress: isString(value['remoteIPAddress']) ? value['remoteIPAddress'] : undefined,\n\t\tport: isFiniteNumber(value['remotePort']) ? value['remotePort'] : undefined,\n\t\tcached: value['fromDiskCache'] === true || value['fromPrefetchCache'] === true,\n\t\tworker: value['fromServiceWorker'] === true,\n\t\ttimestamp,\n\t\ttiming: parseBrowserTiming(value['timing']),\n\t\tsecurity: parseBrowserSecurity(value['securityDetails']),\n\t}\n}\n\n/**\n * Coerces Chromium response timing to a `BrowserTiming`, or `undefined`\n * off-shape.\n *\n * @param value - Unknown timing object\n * @returns Timing or undefined\n */\nexport function parseBrowserTiming(value: unknown): BrowserTiming | undefined {\n\tif (!isRecord(value) || !isFiniteNumber(value['requestTime']) || value['requestTime'] < 0) {\n\t\treturn undefined\n\t}\n\tconst receive = value['receiveHeadersEnd']\n\treturn {\n\t\trequest: value['requestTime'],\n\t\tproxy: parseBrowserTimingRange(value, 'proxyStart', 'proxyEnd'),\n\t\tdns: parseBrowserTimingRange(value, 'dnsStart', 'dnsEnd'),\n\t\tconnect: parseBrowserTimingRange(value, 'connectStart', 'connectEnd'),\n\t\tssl: parseBrowserTimingRange(value, 'sslStart', 'sslEnd'),\n\t\tsend: parseBrowserTimingRange(value, 'sendStart', 'sendEnd'),\n\t\treceive: isFiniteNumber(receive) && receive >= 0 ? receive : undefined,\n\t}\n}\n\n/**\n * Coerces one named start/end pair of Chromium network timing to a\n * `BrowserTimingRange`, or `undefined` off-shape.\n *\n * @param value - Unknown timing object\n * @param start - Start field\n * @param end - End field\n * @returns Timing range or undefined\n */\nexport function parseBrowserTimingRange(\n\tvalue: unknown,\n\tstart: string,\n\tend: string,\n): BrowserTimingRange | undefined {\n\tif (!isRecord(value)) return undefined\n\tconst startValue = value[start]\n\tconst endValue = value[end]\n\tif (\n\t\t!isFiniteNumber(startValue) ||\n\t\tstartValue < 0 ||\n\t\t!isFiniteNumber(endValue) ||\n\t\tendValue < startValue\n\t) {\n\t\treturn undefined\n\t}\n\treturn { start: startValue, end: endValue }\n}\n\n/**\n * Coerces Chromium TLS security details to a `BrowserSecurity`, or `undefined`\n * off-shape.\n *\n * @param value - Unknown security details\n * @returns Security metadata or undefined\n */\nexport function parseBrowserSecurity(value: unknown): BrowserSecurity | undefined {\n\tif (\n\t\t!isRecord(value) ||\n\t\t!isString(value['protocol']) ||\n\t\t!isString(value['issuer']) ||\n\t\t!isFiniteNumber(value['validFrom']) ||\n\t\t!isFiniteNumber(value['validTo']) ||\n\t\tvalue['validTo'] < value['validFrom']\n\t) {\n\t\treturn undefined\n\t}\n\treturn {\n\t\tprotocol: value['protocol'],\n\t\tissuer: value['issuer'],\n\t\tfrom: value['validFrom'],\n\t\tto: value['validTo'],\n\t}\n}\n\n/**\n * Coerces one `Network.loadingFailed` event to a `BrowserRequestFailure`, or\n * `undefined` off-shape.\n *\n * @param value - Unknown event parameters\n * @returns Failure or undefined\n */\nexport function parseBrowserRequestFailure(value: unknown): BrowserRequestFailure | undefined {\n\tif (!isRecord(value) || !isString(value['requestId']) || !isString(value['errorText'])) {\n\t\treturn undefined\n\t}\n\treturn {\n\t\tid: value['requestId'],\n\t\terror: value['errorText'],\n\t\tcancelled: value['canceled'] === true,\n\t\tblocked: isString(value['blockedReason']) ? value['blockedReason'] : undefined,\n\t}\n}\n\n/**\n * Coerces one WebSocket frame event to a `BrowserWebSocketFrame`, or\n * `undefined` off-shape.\n *\n * @param value - Unknown event parameters\n * @returns Frame or undefined\n */\nexport function parseBrowserWebSocketFrame(value: unknown): BrowserWebSocketFrame | undefined {\n\tif (!isRecord(value) || !isRecord(value['response']) || !isFiniteNumber(value['timestamp'])) {\n\t\treturn undefined\n\t}\n\tconst frame = value['response']\n\tif (!isInteger(frame['opcode']) || frame['opcode'] < 0 || !isString(frame['payloadData'])) {\n\t\treturn undefined\n\t}\n\treturn {\n\t\topcode: frame['opcode'],\n\t\tdata: frame['payloadData'],\n\t\tmasked: frame['mask'] === true,\n\t\ttimestamp: value['timestamp'],\n\t}\n}\n\n/**\n * Coerces one Runtime binding invocation to a `BrowserBindingCall`, or\n * `undefined` off-shape.\n *\n * @param value - Unknown `Runtime.bindingCalled` parameters\n * @returns Valid call or undefined\n */\nexport function parseBrowserBindingCall(value: unknown): BrowserBindingCall | undefined {\n\tif (\n\t\t!isRecord(value) ||\n\t\t!isString(value['name']) ||\n\t\t!isString(value['payload']) ||\n\t\t!isInteger(value['executionContextId'])\n\t) {\n\t\treturn undefined\n\t}\n\tconst payload = parseJSON(value['payload'])\n\tif (\n\t\t!isRecord(payload) ||\n\t\t!isString(payload['id']) ||\n\t\t!isString(payload['name']) ||\n\t\t!isArray(payload['args']) ||\n\t\tpayload['name'] !== value['name']\n\t) {\n\t\treturn undefined\n\t}\n\treturn {\n\t\tid: payload['id'],\n\t\tname: payload['name'],\n\t\targs: payload['args'],\n\t\tcontext: value['executionContextId'],\n\t}\n}\n\n/**\n * Coerces a string-valued Accessibility-domain AXValue to a string, or\n * `undefined` off-shape.\n *\n * @param value - Unknown AX value\n * @returns String or undefined\n */\nexport function parseBrowserAXString(value: unknown): string | undefined {\n\tconst decoded = readBrowserAXValue(value)\n\treturn isString(decoded) ? decoded : undefined\n}\n\n/**\n * Coerces an optional Chromium cookie partition key to a\n * `BrowserCookiePartition`, or `undefined` off-shape.\n *\n * @param value - Unknown partition value\n * @returns Partition key or undefined\n */\nexport function parseBrowserCookiePartition(value: unknown): BrowserCookiePartition | undefined {\n\tif (!isRecord(value) || !isString(value['topLevelSite'])) return undefined\n\treturn {\n\t\tsite: value['topLevelSite'],\n\t\t...(isBoolean(value['hasCrossSiteAncestor'])\n\t\t\t? { ancestor: value['hasCrossSiteAncestor'] }\n\t\t\t: {}),\n\t}\n}\n\n/**\n * Coerces one `Runtime.consoleAPICalled` event to a `BrowserConsoleMessage`, or\n * `undefined` off-shape.\n *\n * @param value - Unknown event parameters\n * @returns Console message or undefined\n */\nexport function parseBrowserConsoleMessage(value: unknown): BrowserConsoleMessage | undefined {\n\tif (\n\t\t!isRecord(value) ||\n\t\t!isString(value['type']) ||\n\t\t!isFiniteNumber(value['timestamp']) ||\n\t\t!isArray(value['args'])\n\t) {\n\t\treturn undefined\n\t}\n\tconst values = value['args'].map(readBrowserRemoteValue)\n\treturn {\n\t\tlevel: value['type'],\n\t\ttext: values\n\t\t\t.map((entry) => {\n\t\t\t\tif (isString(entry)) return entry\n\t\t\t\tconst serialized = attempt<unknown>(() => JSON.stringify(entry))\n\t\t\t\treturn serialized.success && isString(serialized.value) ? serialized.value : String(entry)\n\t\t\t})\n\t\t\t.join(' '),\n\t\tvalues,\n\t\ttimestamp: value['timestamp'],\n\t\tstack: readBrowserStack(value['stackTrace']),\n\t}\n}\n\n/**\n * Coerces one `Runtime.exceptionThrown` event to a `BrowserPageError`, or\n * `undefined` off-shape.\n *\n * @param value - Unknown event parameters\n * @returns Page error or undefined\n */\nexport function parseBrowserPageError(value: unknown): BrowserPageError | undefined {\n\tif (!isRecord(value) || !isRecord(value['exceptionDetails'])) return undefined\n\tconst details = value['exceptionDetails']\n\tconst timestamp = isFiniteNumber(value['timestamp']) ? value['timestamp'] : Date.now()\n\tconst exception = readBrowserRemoteValue(details['exception'])\n\tconst message = isString(exception)\n\t\t? exception\n\t\t: isString(details['text'])\n\t\t\t? details['text']\n\t\t\t: 'Uncaught page exception'\n\treturn {\n\t\tmessage,\n\t\tstack: readBrowserStack(details['stackTrace']),\n\t\ttimestamp,\n\t}\n}\n\n/**\n * Coerces one `Browser.downloadWillBegin` event to a `BrowserDownloadStart`, or\n * `undefined` off-shape.\n *\n * @param value - Unknown event parameters\n * @returns Download start or undefined\n */\nexport function parseBrowserDownloadStart(value: unknown): BrowserDownloadStart | undefined {\n\tif (\n\t\t!isRecord(value) ||\n\t\t!isString(value['guid']) ||\n\t\t!isString(value['url']) ||\n\t\t!isString(value['suggestedFilename']) ||\n\t\t!isString(value['frameId'])\n\t) {\n\t\treturn undefined\n\t}\n\treturn {\n\t\tid: value['guid'],\n\t\turl: value['url'],\n\t\tname: value['suggestedFilename'],\n\t\tframe: value['frameId'],\n\t}\n}\n\n/**\n * Coerces one `Browser.downloadProgress` event to a `BrowserDownloadProgress`,\n * or `undefined` off-shape.\n *\n * @param value - Unknown event parameters\n * @returns Download id and progress, or undefined\n */\nexport function parseBrowserDownloadProgress(\n\tvalue: unknown,\n): readonly [id: string, progress: BrowserDownloadProgress] | undefined {\n\tif (\n\t\t!isRecord(value) ||\n\t\t!isString(value['guid']) ||\n\t\t!isFiniteNumber(value['receivedBytes']) ||\n\t\tvalue['receivedBytes'] < 0 ||\n\t\t!isFiniteNumber(value['totalBytes']) ||\n\t\tvalue['totalBytes'] < 0\n\t) {\n\t\treturn undefined\n\t}\n\tconst state = parseEnum(value['state'], ['completed', 'canceled', 'inProgress'])\n\tconst status =\n\t\tstate === 'completed'\n\t\t\t? 'complete'\n\t\t\t: state === 'canceled'\n\t\t\t\t? 'cancelled'\n\t\t\t\t: state === 'inProgress'\n\t\t\t\t\t? 'pending'\n\t\t\t\t\t: undefined\n\tif (status === undefined) return undefined\n\treturn [\n\t\tvalue['guid'],\n\t\t{\n\t\t\tstatus,\n\t\t\treceived: value['receivedBytes'],\n\t\t\ttotal: value['totalBytes'],\n\t\t\t...(isString(value['filePath']) ? { path: value['filePath'] } : {}),\n\t\t},\n\t]\n}\n\n/**\n * Coerces a codegen binding payload string to a `BrowserCodegenAction`, or\n * `undefined` off-shape.\n *\n * @remarks\n * The in-page recorder script calls the CDP binding with a JSON string\n * payload shaped like a {@link BrowserCodegenAction}. Returns `undefined`\n * when the payload is not valid JSON or does not match a known action shape.\n *\n * @param payload - Raw binding call payload (the CDP `payload` param)\n * @returns The parsed action, or `undefined` when the payload is malformed\n */\nexport function parseCodegenActionPayload(payload: unknown): BrowserCodegenAction | undefined {\n\tif (!isString(payload)) return undefined\n\tconst parsed = parseJSON(payload)\n\tif (!isRecord(parsed)) return undefined\n\n\tconst action = parseEnum(parsed['action'], ['click', 'fill', 'select'])\n\tconst selector = parsed['selector']\n\n\tif (action === 'click' && isString(selector)) {\n\t\treturn { action: 'click', selector }\n\t}\n\n\tif (action === 'fill' && isString(selector) && isString(parsed['value'])) {\n\t\treturn { action: 'fill', selector, value: parsed['value'] }\n\t}\n\n\tif (action === 'select' && isString(selector)) {\n\t\tconst values = parseArray(parsed['values'], isString)\n\t\tif (values !== undefined) return { action: 'select', selector, values }\n\t}\n\n\treturn undefined\n}\n\n/**\n * Coerces a `Page.frameNavigated` CDP event to a `navigate` codegen action, or\n * `undefined` off-shape.\n *\n * @remarks\n * Only the top-level (main) frame's navigation is recorded — a frame\n * carrying a `parentId` is a sub-frame and is ignored.\n *\n * @param params - The CDP `Page.frameNavigated` event params\n * @returns A `navigate` action, or `undefined` when the event is not a\n * top-level navigation with a resolvable URL\n */\nexport function parseCodegenNavigateAction(\n\tparams: Readonly<Record<string, unknown>>,\n): BrowserCodegenAction | undefined {\n\tconst frame = params['frame']\n\tif (!isRecord(frame)) return undefined\n\tif ('parentId' in frame) return undefined\n\tif (!isString(frame['url'])) return undefined\n\n\treturn { action: 'navigate', url: frame['url'] }\n}\n\n/**\n * Coerces an unknown value to an all-number array, or `undefined` off-shape.\n *\n * @param value - Candidate value\n * @returns The number array, or undefined\n */\nexport function parseNumberArray(value: unknown): readonly number[] | undefined {\n\tif (!isArray(value) || !value.every(isFiniteNumber)) {\n\t\treturn undefined\n\t}\n\treturn value\n}\n\n/**\n * Coerces one CDP snapshot string-table index to its string, or `undefined`\n * off-shape.\n *\n * @param strings - Snapshot string table\n * @param index - Candidate string index\n * @returns The resolved string, or undefined\n */\nexport function parseSnapshotString(\n\tstrings: readonly string[],\n\tindex: unknown,\n): string | undefined {\n\tif (!isInteger(index)) return undefined\n\treturn strings[index]\n}\n\n/**\n * Coerces a CDP snapshot rectangle to a `BrowserRect`, or `undefined`\n * off-shape.\n *\n * @param value - Candidate four-number array\n * @returns A rectangle, or undefined\n */\nexport function parseBrowserRect(value: unknown): BrowserRect | undefined {\n\tconst numbers = parseNumberArray(value)\n\tif (numbers === undefined || numbers.length !== 4) return undefined\n\tconst x = numbers[0]\n\tconst y = numbers[1]\n\tconst width = numbers[2]\n\tconst height = numbers[3]\n\tif (x === undefined || y === undefined || width === undefined || height === undefined) {\n\t\treturn undefined\n\t}\n\treturn [x, y, width, height]\n}\n","import type {\n\tBrowserCodegenAction,\n\tBrowserChord,\n\tBrowserCookie,\n\tBrowserCookieInput,\n\tBrowserContextOptions,\n\tBrowserCoverageRange,\n\tBrowserDocument,\n\tBrowserEmulationOptions,\n\tBrowserFrameInfo,\n\tBrowserFunctionCoverage,\n\tBrowserHAR,\n\tBrowserHAREntry,\n\tBrowserHARPending,\n\tBrowserHARValue,\n\tBrowserLayout,\n\tBrowserMetric,\n\tBrowserOperationOptions,\n\tBrowserAccessibilityOptions,\n\tBrowserAccessibilitySnapshot,\n\tBrowserAXNode,\n\tBrowserKey,\n\tBrowserNode,\n\tBrowserNodePredicate,\n\tBrowserNodeQuery,\n\tBrowserProfile,\n\tBrowserProfileFrame,\n\tBrowserProfileNode,\n\tBrowserMouseButton,\n\tBrowserPoint,\n\tBrowserPDFOptions,\n\tBrowserMedia,\n\tBrowserRequest,\n\tBrowserRouteQuery,\n\tBrowserQuad,\n\tBrowserSnapshotInput,\n\tBrowserScriptCoverage,\n\tBrowserScreenshotOptions,\n\tBrowserStorageEntry,\n\tBrowserStorageOrigin,\n\tBrowserStreamChunk,\n\tBrowserStackFrame,\n\tBrowserStyleCoverage,\n\tBrowserTeardownFunction,\n\tBrowserViewport,\n} from './types.js'\nimport {\n\tattempt,\n\tisArray,\n\tisBoolean,\n\tisFiniteNumber,\n\tisFunction,\n\tisInteger,\n\tisRecord,\n\tisString,\n\tparseArray,\n\tparseEnum,\n} from '@orkestrel/contract'\nimport {\n\tBASE64_CHARS,\n\tBASE64_LOOKUP,\n\tBROWSER_RESULT_LIMIT,\n\tBROWSER_RESULT_LIMIT_PATTERN,\n\tBROWSER_SNAPSHOT_NODE_LIMIT,\n\tBROWSER_KEY_MODIFIERS,\n\tBROWSER_MOUSE_BUTTON_MASKS,\n} from './constants.js'\nimport { BrowserError, BrowserResultLimitError } from './errors.js'\nimport {\n\tparseBrowserAXString,\n\tparseBrowserCookiePartition,\n\tparseBrowserRect,\n\tparseNumberArray,\n\tparseSnapshotString,\n} from './parsers.js'\n\n/**\n * Decodes a base64-encoded string into raw bytes.\n *\n * @remarks\n * Pure JS implementation — no `Buffer`, no `atob` (DOM-only) — so it runs\n * identically in Node and browser environments. Whitespace and `=` padding\n * are ignored; invalid characters are skipped.\n *\n * @param text - Base64-encoded input string\n * @returns Decoded bytes\n *\n * @example\n * ```ts\n * decodeBase64('aGVsbG8=') // Uint8Array [104, 101, 108, 108, 111]\n * ```\n */\nexport function decodeBase64(text: string): Uint8Array {\n\tconst clean = text.replace(/[^A-Za-z0-9+/]/g, '')\n\tconst bytes: number[] = []\n\n\tlet buffer = 0\n\tlet bits = 0\n\n\tfor (const char of clean) {\n\t\tconst value = BASE64_LOOKUP[char]\n\t\tif (value === undefined) continue\n\n\t\tbuffer = (buffer << 6) | value\n\t\tbits += 6\n\n\t\tif (bits >= 8) {\n\t\t\tbits -= 8\n\t\t\tbytes.push((buffer >> bits) & 0xff)\n\t\t}\n\t}\n\n\treturn new Uint8Array(bytes)\n}\n\n/**\n * Encodes raw bytes as base64 without relying on Node or DOM globals.\n *\n * @param bytes - Raw input bytes\n * @returns Base64 text\n */\nexport function encodeBase64(bytes: Uint8Array): string {\n\tlet result = ''\n\tfor (let index = 0; index < bytes.length; index += 3) {\n\t\tconst first = bytes[index]\n\t\tconst second = bytes[index + 1]\n\t\tconst third = bytes[index + 2]\n\t\tif (first === undefined) break\n\t\tconst value = (first << 16) | ((second ?? 0) << 8) | (third ?? 0)\n\t\tresult += BASE64_CHARS[(value >> 18) & 63] ?? ''\n\t\tresult += BASE64_CHARS[(value >> 12) & 63] ?? ''\n\t\tresult += second === undefined ? '=' : (BASE64_CHARS[(value >> 6) & 63] ?? '')\n\t\tresult += third === undefined ? '=' : (BASE64_CHARS[value & 63] ?? '')\n\t}\n\treturn result\n}\n\n/** Encodes UTF-8 text as bytes. */\nexport function textToBytes(value: string): Uint8Array {\n\treturn new TextEncoder().encode(value)\n}\n\n/** Decodes UTF-8 bytes as text. */\nexport function bytesToText(value: Uint8Array): string {\n\treturn new TextDecoder().decode(value)\n}\n\n/**\n * Converts a header record to Fetch-domain name/value entries.\n *\n * @param headers - Header record\n * @returns Protocol header entries\n */\nexport function browserHeadersToProtocol(\n\theaders: Readonly<Record<string, string>>,\n): ReadonlyArray<Readonly<Record<string, string>>> {\n\treturn Object.entries(headers).map(([name, value]) => ({ name, value }))\n}\n\n/**\n * Decodes a Chromium Headers object into string values.\n *\n * @param value - Unknown headers\n * @returns Frozen-compatible header record\n */\nexport function readBrowserHeaders(value: unknown): Readonly<Record<string, string>> {\n\tif (!isRecord(value)) return {}\n\tconst headers: Record<string, string> = {}\n\tfor (const [name, entry] of Object.entries(value)) {\n\t\tif (isString(entry) || isFiniteNumber(entry)) headers[name] = String(entry)\n\t}\n\treturn headers\n}\n\n/**\n * Builds a standards-shaped HAR 1.2 entry from one observed exchange.\n *\n * @param pending - Request and optional response captured by the recorder\n * @param duration - Whole exchange duration in milliseconds\n * @param body - Optional decoded response body\n * @param error - Optional request failure description\n * @returns HAR 1.2 entry\n */\nexport function createBrowserHAREntry(\n\tpending: BrowserHARPending,\n\tduration: number,\n\tbody?: Uint8Array,\n\terror?: string,\n): BrowserHAREntry {\n\tconst response = pending.response\n\tconst requestHeaders: BrowserHARValue[] = Object.entries(pending.request.headers).map(\n\t\t([name, value]) => ({ name, value }),\n\t)\n\tconst responseHeaders: BrowserHARValue[] =\n\t\tresponse === undefined\n\t\t\t? []\n\t\t\t: Object.entries(response.headers).map(([name, value]) => ({ name, value }))\n\tconst query: BrowserHARValue[] = []\n\tif (URL.canParse(pending.request.url)) {\n\t\tfor (const [name, value] of new URL(pending.request.url).searchParams) {\n\t\t\tquery.push({ name, value })\n\t\t}\n\t}\n\tconst post = pending.request.post\n\tconst requestMime =\n\t\tObject.entries(pending.request.headers).find(\n\t\t\t([name]) => name.toLowerCase() === 'content-type',\n\t\t)?.[1] ?? 'application/octet-stream'\n\tconst redirect =\n\t\tresponse === undefined\n\t\t\t? ''\n\t\t\t: (Object.entries(response.headers).find(\n\t\t\t\t\t([name]) => name.toLowerCase() === 'location',\n\t\t\t\t)?.[1] ?? '')\n\tconst timing = response?.timing\n\tconst dns = timing?.dns === undefined ? -1 : Math.max(0, timing.dns.end - timing.dns.start)\n\tconst connect =\n\t\ttiming?.connect === undefined ? -1 : Math.max(0, timing.connect.end - timing.connect.start)\n\tconst send = timing?.send === undefined ? 0 : Math.max(0, timing.send.end - timing.send.start)\n\tconst wait =\n\t\ttiming?.receive === undefined\n\t\t\t? Math.max(0, duration)\n\t\t\t: Math.max(0, timing.receive - (timing.send?.end ?? 0))\n\tconst ssl = timing?.ssl === undefined ? -1 : Math.max(0, timing.ssl.end - timing.ssl.start)\n\tconst text = body === undefined ? undefined : encodeBase64(body)\n\tconst size = body?.byteLength ?? (response === undefined ? 0 : -1)\n\n\treturn {\n\t\tstartedDateTime: new Date(pending.started).toISOString(),\n\t\ttime: Math.max(0, duration),\n\t\trequest: {\n\t\t\tmethod: pending.request.method,\n\t\t\turl: pending.request.url,\n\t\t\thttpVersion: response?.protocol ?? 'HTTP/0.0',\n\t\t\tcookies: [],\n\t\t\theaders: requestHeaders,\n\t\t\tqueryString: query,\n\t\t\t...(post !== undefined\n\t\t\t\t? {\n\t\t\t\t\t\tpostData: {\n\t\t\t\t\t\t\tmimeType: requestMime,\n\t\t\t\t\t\t\ttext: post,\n\t\t\t\t\t\t},\n\t\t\t\t\t}\n\t\t\t\t: {}),\n\t\t\theadersSize: -1,\n\t\t\tbodySize: post === undefined ? 0 : textToBytes(post).byteLength,\n\t\t},\n\t\tresponse: {\n\t\t\tstatus: response?.status ?? 0,\n\t\t\tstatusText: response?.phrase ?? error ?? 'Request failed',\n\t\t\thttpVersion: response?.protocol ?? 'HTTP/0.0',\n\t\t\tcookies: [],\n\t\t\theaders: responseHeaders,\n\t\t\tcontent: {\n\t\t\t\tsize,\n\t\t\t\tmimeType: response?.mime ?? 'application/octet-stream',\n\t\t\t\t...(text !== undefined ? { text, encoding: 'base64' } : {}),\n\t\t\t},\n\t\t\tredirectURL: redirect,\n\t\t\theadersSize: -1,\n\t\t\tbodySize: size,\n\t\t},\n\t\tcache: {},\n\t\ttimings: {\n\t\t\tblocked: -1,\n\t\t\tdns,\n\t\t\tconnect,\n\t\t\tsend,\n\t\t\twait,\n\t\t\treceive: Math.max(0, duration - wait - send),\n\t\t\tssl,\n\t\t},\n\t}\n}\n\n/**\n * Converts HAR name/value headers into a Fetch-domain header record.\n *\n * @param headers - HAR header entries\n * @returns Header record with later duplicate names replacing earlier values\n */\nexport function browserHARHeadersToRecord(\n\theaders: readonly BrowserHARValue[],\n): Readonly<Record<string, string>> {\n\tconst result: Record<string, string> = {}\n\tfor (const header of headers) {\n\t\tObject.defineProperty(result, header.name, {\n\t\t\tvalue: header.value,\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\t\t\twritable: true,\n\t\t})\n\t}\n\treturn result\n}\n\n/**\n * Validates the HAR 1.2 fields required for deterministic replay.\n *\n * @param value - Candidate archive\n */\nexport function validateBrowserHAR(value: unknown): asserts value is BrowserHAR {\n\tif (\n\t\t!isRecord(value) ||\n\t\t!isRecord(value['log']) ||\n\t\tvalue['log']['version'] !== '1.2' ||\n\t\t!isRecord(value['log']['creator']) ||\n\t\t!isString(value['log']['creator']['name']) ||\n\t\t!isString(value['log']['creator']['version']) ||\n\t\t!isArray(value['log']['entries'])\n\t) {\n\t\tthrow new BrowserError('Browser HAR document is malformed')\n\t}\n\tfor (const [index, entry] of value['log']['entries'].entries()) {\n\t\tif (\n\t\t\t!isRecord(entry) ||\n\t\t\t!isString(entry['startedDateTime']) ||\n\t\t\t!isFiniteNumber(Date.parse(entry['startedDateTime'])) ||\n\t\t\t!isFiniteNumber(entry['time']) ||\n\t\t\tentry['time'] < 0 ||\n\t\t\t!isRecord(entry['request']) ||\n\t\t\t!isString(entry['request']['url']) ||\n\t\t\t!URL.canParse(entry['request']['url']) ||\n\t\t\t!isString(entry['request']['method']) ||\n\t\t\t!isString(entry['request']['httpVersion']) ||\n\t\t\t!isArray(entry['request']['cookies']) ||\n\t\t\t!isArray(entry['request']['headers']) ||\n\t\t\t!isArray(entry['request']['queryString']) ||\n\t\t\t!isInteger(entry['request']['headersSize']) ||\n\t\t\tentry['request']['headersSize'] < -1 ||\n\t\t\t!isInteger(entry['request']['bodySize']) ||\n\t\t\tentry['request']['bodySize'] < -1 ||\n\t\t\t!isRecord(entry['response']) ||\n\t\t\t!isInteger(entry['response']['status']) ||\n\t\t\tentry['response']['status'] < 0 ||\n\t\t\tentry['response']['status'] > 999 ||\n\t\t\t!isString(entry['response']['statusText']) ||\n\t\t\t!isString(entry['response']['httpVersion']) ||\n\t\t\t!isArray(entry['response']['cookies']) ||\n\t\t\t!isArray(entry['response']['headers']) ||\n\t\t\t!isRecord(entry['response']['content']) ||\n\t\t\t!isString(entry['response']['redirectURL']) ||\n\t\t\t!isInteger(entry['response']['headersSize']) ||\n\t\t\tentry['response']['headersSize'] < -1 ||\n\t\t\t!isInteger(entry['response']['bodySize']) ||\n\t\t\tentry['response']['bodySize'] < -1 ||\n\t\t\t!isRecord(entry['cache']) ||\n\t\t\t!isRecord(entry['timings'])\n\t\t) {\n\t\t\tthrow new BrowserError('Browser HAR entry is malformed', undefined, { index })\n\t\t}\n\t\tfor (const [cookieIndex, cookie] of entry['request']['cookies'].entries()) {\n\t\t\tif (\n\t\t\t\t!isRecord(cookie) ||\n\t\t\t\t!isString(cookie['name']) ||\n\t\t\t\t!isString(cookie['value']) ||\n\t\t\t\t(cookie['path'] !== undefined && !isString(cookie['path'])) ||\n\t\t\t\t(cookie['domain'] !== undefined && !isString(cookie['domain'])) ||\n\t\t\t\t(cookie['expires'] !== undefined && !isString(cookie['expires'])) ||\n\t\t\t\t(cookie['httpOnly'] !== undefined && !isBoolean(cookie['httpOnly'])) ||\n\t\t\t\t(cookie['secure'] !== undefined && !isBoolean(cookie['secure']))\n\t\t\t) {\n\t\t\t\tthrow new BrowserError('Browser HAR request cookie is malformed', undefined, {\n\t\t\t\t\tindex,\n\t\t\t\t\tcookie: cookieIndex,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t\tfor (const [headerIndex, header] of entry['request']['headers'].entries()) {\n\t\t\tif (!isRecord(header) || !isString(header['name']) || !isString(header['value'])) {\n\t\t\t\tthrow new BrowserError('Browser HAR request header is malformed', undefined, {\n\t\t\t\t\tindex,\n\t\t\t\t\theader: headerIndex,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t\tfor (const [queryIndex, query] of entry['request']['queryString'].entries()) {\n\t\t\tif (!isRecord(query) || !isString(query['name']) || !isString(query['value'])) {\n\t\t\t\tthrow new BrowserError('Browser HAR query value is malformed', undefined, {\n\t\t\t\t\tindex,\n\t\t\t\t\tquery: queryIndex,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t\tconst post = entry['request']['postData']\n\t\tif (\n\t\t\tpost !== undefined &&\n\t\t\t(!isRecord(post) || !isString(post['mimeType']) || !isString(post['text']))\n\t\t) {\n\t\t\tthrow new BrowserError('Browser HAR request body is malformed', undefined, { index })\n\t\t}\n\t\tfor (const [cookieIndex, cookie] of entry['response']['cookies'].entries()) {\n\t\t\tif (\n\t\t\t\t!isRecord(cookie) ||\n\t\t\t\t!isString(cookie['name']) ||\n\t\t\t\t!isString(cookie['value']) ||\n\t\t\t\t(cookie['path'] !== undefined && !isString(cookie['path'])) ||\n\t\t\t\t(cookie['domain'] !== undefined && !isString(cookie['domain'])) ||\n\t\t\t\t(cookie['expires'] !== undefined && !isString(cookie['expires'])) ||\n\t\t\t\t(cookie['httpOnly'] !== undefined && !isBoolean(cookie['httpOnly'])) ||\n\t\t\t\t(cookie['secure'] !== undefined && !isBoolean(cookie['secure']))\n\t\t\t) {\n\t\t\t\tthrow new BrowserError('Browser HAR response cookie is malformed', undefined, {\n\t\t\t\t\tindex,\n\t\t\t\t\tcookie: cookieIndex,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t\tfor (const [headerIndex, header] of entry['response']['headers'].entries()) {\n\t\t\tif (!isRecord(header) || !isString(header['name']) || !isString(header['value'])) {\n\t\t\t\tthrow new BrowserError('Browser HAR response header is malformed', undefined, {\n\t\t\t\t\tindex,\n\t\t\t\t\theader: headerIndex,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t\tconst text = entry['response']['content']['text']\n\t\tconst encoding = entry['response']['content']['encoding']\n\t\tif (\n\t\t\t!isInteger(entry['response']['content']['size']) ||\n\t\t\tentry['response']['content']['size'] < -1 ||\n\t\t\t!isString(entry['response']['content']['mimeType']) ||\n\t\t\t(text !== undefined && !isString(text)) ||\n\t\t\t(encoding !== undefined && encoding !== 'base64') ||\n\t\t\t(encoding === 'base64' &&\n\t\t\t\t(text === undefined ||\n\t\t\t\t\t!/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(text)))\n\t\t) {\n\t\t\tthrow new BrowserError('Browser HAR response content is malformed', undefined, { index })\n\t\t}\n\t\tfor (const name of ['blocked', 'dns', 'connect', 'send', 'wait', 'receive', 'ssl']) {\n\t\t\tconst timing = entry['timings'][name]\n\t\t\tif (!isFiniteNumber(timing) || timing < -1) {\n\t\t\t\tthrow new BrowserError('Browser HAR timing is malformed', undefined, {\n\t\t\t\t\tindex,\n\t\t\t\t\ttiming: name,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * Matches a request against route criteria.\n *\n * @param request - Observed request\n * @param query - Match criteria\n * @returns True if every supplied criterion matches; false otherwise\n */\nexport function matchesBrowserRoute(request: BrowserRequest, query: BrowserRouteQuery): boolean {\n\tif (query.method !== undefined && request.method !== query.method) return false\n\tif (query.resource !== undefined && request.resource !== query.resource) return false\n\tif (query.url === undefined) return true\n\treturn matchesBrowserURL(request.url, query.url)\n}\n\n/**\n * Matches a URL using Chromium-style `*` and `**` glob segments.\n *\n * @param url - Candidate URL\n * @param pattern - Glob pattern\n * @returns True if the whole URL matches; false otherwise\n */\nexport function matchesBrowserURL(url: string, pattern: string): boolean {\n\tconst source = pattern\n\t\t.replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&')\n\t\t.replace(/\\*\\*/g, '[[DOUBLE_STAR]]')\n\t\t.replace(/\\*/g, '[^/]*')\n\t\t.replace(/\\[\\[DOUBLE_STAR\\]\\]/g, '.*')\n\treturn new RegExp(`^${source}$`).test(url)\n}\n\n/**\n * Decodes the `Page.addScriptToEvaluateOnNewDocument` result.\n *\n * @param value - Unknown protocol result\n * @returns Script identifier\n */\nexport function readBrowserScriptIdentifier(value: unknown): string {\n\tif (!isRecord(value) || !isString(value['identifier'])) {\n\t\tthrow new BrowserError('Browser init script identifier is malformed')\n\t}\n\treturn value['identifier']\n}\n\n/**\n * Validates viewport input coordinates.\n *\n * @param point - Candidate point\n */\nexport function validateBrowserPoint(point: BrowserPoint): void {\n\tif (!isFiniteNumber(point.x) || !isFiniteNumber(point.y)) {\n\t\tthrow new BrowserError('Browser input coordinates must be finite', undefined, { point })\n\t}\n}\n\n/**\n * Validates the bounded keys of one trusted-input operation.\n *\n * @remarks\n * The parameter is `BrowserOperationOptions`, so one validator answers for a\n * locator click, a locator drag, a mouse click, a mouse drag, and keyboard\n * entry alike.\n *\n * @param options - Candidate input options\n */\nexport function validateBrowserInputOptions(options?: BrowserOperationOptions): void {\n\tif (options?.delay !== undefined && (!isFiniteNumber(options.delay) || options.delay < 0)) {\n\t\tthrow new BrowserError('Browser input delay must be non-negative and finite', undefined, {\n\t\t\tdelay: options.delay,\n\t\t})\n\t}\n\tif (options?.count !== undefined && (!isInteger(options.count) || options.count <= 0)) {\n\t\tthrow new BrowserError('Browser click count must be a positive integer', undefined, {\n\t\t\tcount: options.count,\n\t\t})\n\t}\n\tif (options?.steps !== undefined && (!isInteger(options.steps) || options.steps <= 0)) {\n\t\tthrow new BrowserError('Browser drag steps must be a positive integer', undefined, {\n\t\t\tsteps: options.steps,\n\t\t})\n\t}\n\tif (options?.position !== undefined) validateBrowserPoint(options.position)\n}\n\n/**\n * Validates a public browser timeout before protocol work begins.\n *\n * @param timeout - Timeout in milliseconds\n */\nexport function validateBrowserTimeout(timeout: number): void {\n\tif (!isFiniteNumber(timeout) || timeout < 0) {\n\t\tthrow new BrowserError('Browser timeout must be a non-negative finite number', undefined, {\n\t\t\ttimeout,\n\t\t})\n\t}\n}\n\n/**\n * Validates Chromium viewport metrics.\n *\n * @param viewport - Public viewport configuration\n */\nexport function validateBrowserViewport(viewport: BrowserViewport): void {\n\tif (\n\t\t!isInteger(viewport.width) ||\n\t\tviewport.width <= 0 ||\n\t\t!isInteger(viewport.height) ||\n\t\tviewport.height <= 0\n\t) {\n\t\tthrow new BrowserError('Browser viewport dimensions must be positive integers', undefined, {\n\t\t\tviewport,\n\t\t})\n\t}\n\tif (viewport.scale !== undefined && (!isFiniteNumber(viewport.scale) || viewport.scale <= 0)) {\n\t\tthrow new BrowserError('Browser viewport scale must be positive and finite', undefined, {\n\t\t\tscale: viewport.scale,\n\t\t})\n\t}\n}\n\n/**\n * Validates context emulation boundaries before partial application.\n *\n * @param options - Public emulation configuration\n */\nexport function validateBrowserEmulationOptions(options: BrowserEmulationOptions): void {\n\tif (options.viewport !== undefined) validateBrowserViewport(options.viewport)\n\tif (options.user !== undefined && options.user.value.length === 0) {\n\t\tthrow new BrowserError('Browser user agent cannot be empty')\n\t}\n\tif (options.locale !== undefined && options.locale.length === 0) {\n\t\tthrow new BrowserError('Browser locale cannot be empty')\n\t}\n\tif (options.timezone !== undefined && options.timezone.length === 0) {\n\t\tthrow new BrowserError('Browser timezone cannot be empty')\n\t}\n\tif (options.geolocation !== undefined) {\n\t\tconst location = options.geolocation\n\t\tif (\n\t\t\t!isFiniteNumber(location.latitude) ||\n\t\t\tlocation.latitude < -90 ||\n\t\t\tlocation.latitude > 90 ||\n\t\t\t!isFiniteNumber(location.longitude) ||\n\t\t\tlocation.longitude < -180 ||\n\t\t\tlocation.longitude > 180 ||\n\t\t\t(location.accuracy !== undefined &&\n\t\t\t\t(!isFiniteNumber(location.accuracy) || location.accuracy < 0))\n\t\t) {\n\t\t\tthrow new BrowserError('Browser geolocation is outside valid coordinate bounds', undefined, {\n\t\t\t\tlocation,\n\t\t\t})\n\t\t}\n\t}\n\tfor (const name of Object.keys(options.headers ?? {})) {\n\t\tif (name.length === 0) throw new BrowserError('Browser header name cannot be empty')\n\t}\n}\n\n/**\n * Validates isolated-context options before creating remote state.\n *\n * @param options - Public context configuration\n */\nexport function validateBrowserContextOptions(options?: BrowserContextOptions): void {\n\tif (options === undefined) return\n\tif (options.emulation !== undefined) validateBrowserEmulationOptions(options.emulation)\n\tif (options.proxy !== undefined) {\n\t\tif (options.proxy.server.length === 0) {\n\t\t\tthrow new BrowserError('Browser proxy server cannot be empty')\n\t\t}\n\t\tif (options.proxy.bypass?.some((entry) => entry.length === 0) === true) {\n\t\t\tthrow new BrowserError('Browser proxy bypass entries cannot be empty')\n\t\t}\n\t}\n\tfor (const origin of options.origins ?? []) {\n\t\tconst result = attempt(() => new URL(origin))\n\t\tif (!result.success) {\n\t\t\tthrow new BrowserError('Browser context origin must be valid', undefined, { origin })\n\t\t}\n\t\tconst url = result.value\n\t\tif (\n\t\t\t(url.protocol !== 'http:' && url.protocol !== 'https:') ||\n\t\t\turl.origin !== origin.replace(/\\/$/, '')\n\t\t) {\n\t\t\tthrow new BrowserError(\n\t\t\t\t'Browser context origin must be an absolute HTTP(S) origin',\n\t\t\t\tundefined,\n\t\t\t\t{\n\t\t\t\t\torigin,\n\t\t\t\t},\n\t\t\t)\n\t\t}\n\t}\n\tif (options.downloads !== undefined && options.downloads.path.length === 0) {\n\t\tthrow new BrowserError('Browser download path cannot be empty')\n\t}\n}\n\n/**\n * Validates Accessibility-domain snapshot bounds.\n *\n * @param options - Public accessibility snapshot options\n */\nexport function validateBrowserAccessibilityOptions(options?: BrowserAccessibilityOptions): void {\n\tif (options?.root !== undefined && (!isInteger(options.root) || options.root <= 0)) {\n\t\tthrow new BrowserError('Browser accessibility root must be a positive integer', undefined, {\n\t\t\troot: options.root,\n\t\t})\n\t}\n\tif (options?.depth !== undefined && (!isInteger(options.depth) || options.depth < 0)) {\n\t\tthrow new BrowserError(\n\t\t\t'Browser accessibility depth must be a non-negative integer',\n\t\t\tundefined,\n\t\t\t{ depth: options.depth },\n\t\t)\n\t}\n}\n\n/**\n * Validates and compiles Page.printToPDF parameters.\n *\n * @param options - Public PDF options\n * @returns Protocol parameter record\n */\nexport function browserPDFToParams(options?: BrowserPDFOptions): Readonly<Record<string, unknown>> {\n\tconst params: Record<string, unknown> = {\n\t\tlandscape: options?.landscape ?? false,\n\t\tprintBackground: options?.background ?? false,\n\t\tdisplayHeaderFooter: options?.header !== undefined || options?.footer !== undefined,\n\t\tgenerateTaggedPDF: options?.tagged ?? false,\n\t\tgenerateDocumentOutline: options?.outline ?? false,\n\t}\n\tif (options?.scale !== undefined) {\n\t\tvalidateBrowserRange(options.scale, 'PDF scale', 0.1, 2)\n\t\tparams['scale'] = options.scale\n\t}\n\tif (options?.width !== undefined) {\n\t\tvalidateBrowserRange(options.width, 'PDF width', 0, Number.MAX_VALUE, false)\n\t\tparams['paperWidth'] = options.width\n\t}\n\tif (options?.height !== undefined) {\n\t\tvalidateBrowserRange(options.height, 'PDF height', 0, Number.MAX_VALUE, false)\n\t\tparams['paperHeight'] = options.height\n\t}\n\tif (options?.ranges !== undefined) params['pageRanges'] = options.ranges\n\tif (options?.header !== undefined) params['headerTemplate'] = options.header\n\tif (options?.footer !== undefined) params['footerTemplate'] = options.footer\n\tfor (const [name, value] of Object.entries(options?.margin ?? {})) {\n\t\tif (!isFiniteNumber(value)) continue\n\t\tvalidateBrowserRange(value, `PDF ${name} margin`, 0, Number.MAX_VALUE)\n\t\tparams[`margin${name[0]?.toUpperCase()}${name.slice(1)}`] = value\n\t}\n\treturn params\n}\n\n/**\n * Validates and compiles basic Page.captureScreenshot parameters.\n *\n * @param options - Public screenshot options\n * @returns Protocol parameter record\n */\nexport function browserScreenshotToParams(\n\toptions?: BrowserScreenshotOptions,\n): Readonly<Record<string, unknown>> {\n\tconst format = options?.format ?? 'png'\n\tif (options?.quality !== undefined) {\n\t\tif (format !== 'jpeg') {\n\t\t\tthrow new BrowserError('Browser screenshot quality is only valid for JPEG')\n\t\t}\n\t\tif (!isInteger(options.quality) || options.quality < 0 || options.quality > 100) {\n\t\t\tthrow new BrowserError('Browser screenshot quality must be an integer from 0 to 100')\n\t\t}\n\t}\n\tif (options?.full === true && options.clip !== undefined) {\n\t\tthrow new BrowserError('Browser screenshot cannot combine full-page and clip capture')\n\t}\n\tconst params: Record<string, unknown> = {\n\t\tformat,\n\t\tfromSurface: true,\n\t}\n\tif (options?.quality !== undefined) params['quality'] = options.quality\n\tif (options?.clip !== undefined) {\n\t\tconst [x, y, width, height] = options.clip\n\t\tvalidateBrowserRange(x, 'Screenshot clip x', -Number.MAX_VALUE, Number.MAX_VALUE)\n\t\tvalidateBrowserRange(y, 'Screenshot clip y', -Number.MAX_VALUE, Number.MAX_VALUE)\n\t\tvalidateBrowserRange(width, 'Screenshot clip width', 0, Number.MAX_VALUE, false)\n\t\tvalidateBrowserRange(height, 'Screenshot clip height', 0, Number.MAX_VALUE, false)\n\t\tparams['clip'] = { x, y, width, height, scale: 1 }\n\t\tparams['captureBeyondViewport'] = true\n\t}\n\treturn params\n}\n\n/**\n * Validates a finite numeric range.\n *\n * @param value - Candidate number\n * @param field - Diagnostic field\n * @param minimum - Inclusive lower bound\n * @param maximum - Inclusive upper bound\n * @param inclusive - Whether the lower bound is inclusive\n */\nexport function validateBrowserRange(\n\tvalue: number,\n\tfield: string,\n\tminimum: number,\n\tmaximum: number,\n\tinclusive = true,\n): void {\n\tif (\n\t\t!isFiniteNumber(value) ||\n\t\t(inclusive ? value < minimum : value <= minimum) ||\n\t\tvalue > maximum\n\t) {\n\t\tthrow new BrowserError(`${field} is outside its valid range`, undefined, {\n\t\t\tvalue,\n\t\t\tminimum,\n\t\t\tmaximum,\n\t\t\tinclusive,\n\t\t})\n\t}\n}\n\n/**\n * Decodes Accessibility-domain nodes into a flat serializable tree.\n *\n * @param value - Unknown full or partial AX-tree result\n * @returns Valid accessibility snapshot\n */\nexport function readBrowserAccessibility(value: unknown): BrowserAccessibilitySnapshot {\n\tif (!isRecord(value) || !isArray(value['nodes'])) {\n\t\tthrow new BrowserError('Browser accessibility tree is malformed')\n\t}\n\tconst nodes: BrowserAXNode[] = []\n\tfor (const [index, candidate] of value['nodes'].entries()) {\n\t\tif (!isRecord(candidate) || !isString(candidate['nodeId'])) {\n\t\t\tthrow new BrowserError('Browser accessibility node is malformed', undefined, { index })\n\t\t}\n\t\tconst children = isArray(candidate['childIds']) ? candidate['childIds'].filter(isString) : []\n\t\tconst properties: Record<string, unknown> = {}\n\t\tif (isArray(candidate['properties'])) {\n\t\t\tfor (const property of candidate['properties']) {\n\t\t\t\tif (!isRecord(property) || !isString(property['name'])) continue\n\t\t\t\tproperties[property['name']] = readBrowserAXValue(property['value'])\n\t\t\t}\n\t\t}\n\t\tnodes.push({\n\t\t\tid: candidate['nodeId'],\n\t\t\tparent: isString(candidate['parentId']) ? candidate['parentId'] : undefined,\n\t\t\tchildren,\n\t\t\tbackend: isInteger(candidate['backendDOMNodeId']) ? candidate['backendDOMNodeId'] : undefined,\n\t\t\tframe: isString(candidate['frameId']) ? candidate['frameId'] : undefined,\n\t\t\tignored: candidate['ignored'] === true,\n\t\t\trole: parseBrowserAXString(candidate['role']),\n\t\t\tname: parseBrowserAXString(candidate['name']),\n\t\t\tdescription: parseBrowserAXString(candidate['description']),\n\t\t\tvalue: readBrowserAXValue(candidate['value']),\n\t\t\tproperties,\n\t\t})\n\t}\n\treturn {\n\t\troots: nodes.filter((node) => node.parent === undefined).map((node) => node.id),\n\t\tnodes,\n\t}\n}\n\n/**\n * Decodes an Accessibility-domain AXValue.\n *\n * @param value - Unknown AX value\n * @returns Underlying value\n */\nexport function readBrowserAXValue(value: unknown): unknown {\n\treturn isRecord(value) && 'value' in value ? value['value'] : undefined\n}\n\n/**\n * Concatenates byte chunks without Node-specific buffers.\n *\n * @param chunks - Byte arrays in source order\n * @returns Combined bytes\n */\nexport function concatBytes(chunks: readonly Uint8Array[]): Uint8Array {\n\tconst count = chunks.reduce((total, chunk) => total + chunk.byteLength, 0)\n\tconst result = new Uint8Array(count)\n\tlet offset = 0\n\tfor (const chunk of chunks) {\n\t\tresult.set(chunk, offset)\n\t\toffset += chunk.byteLength\n\t}\n\treturn result\n}\n\n/**\n * Decodes one `IO.read` response.\n *\n * @param value - Unknown protocol result\n * @returns Valid stream chunk\n */\nexport function readBrowserStreamChunk(value: unknown): BrowserStreamChunk {\n\tif (!isRecord(value) || !isString(value['data'])) {\n\t\tthrow new BrowserError('Browser IO stream chunk is malformed')\n\t}\n\treturn {\n\t\tbytes:\n\t\t\tvalue['base64Encoded'] === true ? decodeBase64(value['data']) : textToBytes(value['data']),\n\t\teof: value['eof'] === true,\n\t}\n}\n\n/**\n * Decodes JavaScript precise coverage.\n *\n * @param value - Unknown `Profiler.takePreciseCoverage` result\n * @returns Script coverage\n */\nexport function readBrowserScriptCoverage(value: unknown): readonly BrowserScriptCoverage[] {\n\tif (!isRecord(value) || !isArray(value['result'])) {\n\t\tthrow new BrowserError('Browser JavaScript coverage is malformed')\n\t}\n\treturn value['result'].map((script, index) => {\n\t\tif (\n\t\t\t!isRecord(script) ||\n\t\t\t!isString(script['scriptId']) ||\n\t\t\t!isString(script['url']) ||\n\t\t\t!isArray(script['functions'])\n\t\t) {\n\t\t\tthrow new BrowserError('Browser script coverage entry is malformed', undefined, { index })\n\t\t}\n\t\tconst functions: BrowserFunctionCoverage[] = script['functions'].map((entry, functionIndex) => {\n\t\t\tif (!isRecord(entry) || !isString(entry['functionName']) || !isArray(entry['ranges'])) {\n\t\t\t\tthrow new BrowserError('Browser function coverage entry is malformed', undefined, {\n\t\t\t\t\tindex,\n\t\t\t\t\tfunction: functionIndex,\n\t\t\t\t})\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tname: entry['functionName'],\n\t\t\t\tranges: readBrowserCoverageRanges(entry['ranges'], index),\n\t\t\t\tblock: entry['isBlockCoverage'] === true,\n\t\t\t}\n\t\t})\n\t\treturn {\n\t\t\tid: script['scriptId'],\n\t\t\turl: script['url'],\n\t\t\tfunctions,\n\t\t}\n\t})\n}\n\n/**\n * Decodes CSS rule usage.\n *\n * @param value - Unknown `CSS.stopRuleUsageTracking` result\n * @returns Stylesheet coverage\n */\nexport function readBrowserStyleCoverage(value: unknown): readonly BrowserStyleCoverage[] {\n\tif (!isRecord(value) || !isArray(value['ruleUsage'])) {\n\t\tthrow new BrowserError('Browser CSS coverage is malformed')\n\t}\n\tconst styles = new Map<string, BrowserCoverageRange[]>()\n\tfor (const [index, entry] of value['ruleUsage'].entries()) {\n\t\tif (\n\t\t\t!isRecord(entry) ||\n\t\t\t!isString(entry['styleSheetId']) ||\n\t\t\t!isInteger(entry['startOffset']) ||\n\t\t\tentry['startOffset'] < 0 ||\n\t\t\t!isInteger(entry['endOffset']) ||\n\t\t\tentry['endOffset'] < entry['startOffset']\n\t\t) {\n\t\t\tthrow new BrowserError('Browser CSS coverage entry is malformed', undefined, { index })\n\t\t}\n\t\tconst ranges = styles.get(entry['styleSheetId']) ?? []\n\t\tranges.push({\n\t\t\tstart: entry['startOffset'],\n\t\t\tend: entry['endOffset'],\n\t\t\tcount: entry['used'] === true ? 1 : 0,\n\t\t})\n\t\tstyles.set(entry['styleSheetId'], ranges)\n\t}\n\treturn [...styles].map(([id, ranges]) => ({ id, ranges }))\n}\n\n/**\n * Decodes coverage ranges.\n *\n * @param value - Unknown ranges\n * @param script - Script index for diagnostics\n * @returns Valid ranges\n */\nexport function readBrowserCoverageRanges(\n\tvalue: unknown,\n\tscript: number,\n): readonly BrowserCoverageRange[] {\n\tif (!isArray(value)) {\n\t\tthrow new BrowserError('Browser coverage ranges are malformed', undefined, { script })\n\t}\n\treturn value.map((range, index) => {\n\t\tif (\n\t\t\t!isRecord(range) ||\n\t\t\t!isInteger(range['startOffset']) ||\n\t\t\trange['startOffset'] < 0 ||\n\t\t\t!isInteger(range['endOffset']) ||\n\t\t\trange['endOffset'] < range['startOffset'] ||\n\t\t\t!isInteger(range['count']) ||\n\t\t\trange['count'] < 0\n\t\t) {\n\t\t\tthrow new BrowserError('Browser coverage range is malformed', undefined, {\n\t\t\t\tscript,\n\t\t\t\tindex,\n\t\t\t})\n\t\t}\n\t\treturn {\n\t\t\tstart: range['startOffset'],\n\t\t\tend: range['endOffset'],\n\t\t\tcount: range['count'],\n\t\t}\n\t})\n}\n\n/**\n * Decodes Performance-domain metrics.\n *\n * @param value - Unknown metrics result\n * @returns Valid metrics\n */\nexport function readBrowserMetrics(value: unknown): readonly BrowserMetric[] {\n\tif (!isRecord(value) || !isArray(value['metrics'])) {\n\t\tthrow new BrowserError('Browser performance metrics are malformed')\n\t}\n\treturn value['metrics'].map((metric, index) => {\n\t\tif (!isRecord(metric) || !isString(metric['name']) || !isFiniteNumber(metric['value'])) {\n\t\t\tthrow new BrowserError('Browser performance metric is malformed', undefined, { index })\n\t\t}\n\t\treturn { name: metric['name'], value: metric['value'] }\n\t})\n}\n\n/**\n * Decodes one CPU profile.\n *\n * @param value - Unknown `Profiler.stop` result\n * @returns Valid profile\n */\nexport function readBrowserProfile(value: unknown): BrowserProfile {\n\tif (!isRecord(value) || !isRecord(value['profile'])) {\n\t\tthrow new BrowserError('Browser CPU profile is malformed')\n\t}\n\tconst profile = value['profile']\n\tif (\n\t\t!isFiniteNumber(profile['startTime']) ||\n\t\t!isFiniteNumber(profile['endTime']) ||\n\t\tprofile['endTime'] < profile['startTime'] ||\n\t\t!isArray(profile['nodes'])\n\t) {\n\t\tthrow new BrowserError('Browser CPU profile metadata is malformed')\n\t}\n\tconst nodes: BrowserProfileNode[] = profile['nodes'].map((node, index) => {\n\t\tif (\n\t\t\t!isRecord(node) ||\n\t\t\t!isInteger(node['id']) ||\n\t\t\tnode['id'] < 0 ||\n\t\t\t(node['hitCount'] !== undefined && (!isInteger(node['hitCount']) || node['hitCount'] < 0))\n\t\t) {\n\t\t\tthrow new BrowserError('Browser CPU profile node is malformed', undefined, { index })\n\t\t}\n\t\tconst children = node['children'] === undefined ? [] : parseArray(node['children'], isInteger)\n\t\tif (children === undefined || children.some((child) => child < 0)) {\n\t\t\tthrow new BrowserError('Browser CPU profile node is malformed', undefined, { index })\n\t\t}\n\t\treturn {\n\t\t\tid: node['id'],\n\t\t\tframe: readBrowserProfileFrame(node['callFrame'], index),\n\t\t\thit: isInteger(node['hitCount']) ? node['hitCount'] : undefined,\n\t\t\tchildren,\n\t\t}\n\t})\n\tconst samples = profile['samples'] === undefined ? [] : parseArray(profile['samples'], isInteger)\n\tif (samples === undefined || samples.some((sample) => sample < 0)) {\n\t\tthrow new BrowserError('Browser CPU profile samples are malformed')\n\t}\n\tconst deltas =\n\t\tprofile['timeDeltas'] === undefined ? [] : parseArray(profile['timeDeltas'], isFiniteNumber)\n\tif (deltas === undefined || deltas.some((delta) => delta < 0)) {\n\t\tthrow new BrowserError('Browser CPU profile deltas are malformed')\n\t}\n\treturn {\n\t\tstart: profile['startTime'],\n\t\tend: profile['endTime'],\n\t\tnodes,\n\t\tsamples,\n\t\tdeltas,\n\t}\n}\n\n/**\n * Decodes a CPU profile call frame.\n *\n * @param value - Unknown call frame\n * @param node - Node index for diagnostics\n * @returns Valid call frame\n */\nexport function readBrowserProfileFrame(value: unknown, node: number): BrowserProfileFrame {\n\tif (\n\t\t!isRecord(value) ||\n\t\t!isString(value['functionName']) ||\n\t\t!isString(value['scriptId']) ||\n\t\t!isString(value['url']) ||\n\t\t!isInteger(value['lineNumber']) ||\n\t\t!isInteger(value['columnNumber'])\n\t) {\n\t\tthrow new BrowserError('Browser CPU profile call frame is malformed', undefined, { node })\n\t}\n\treturn {\n\t\tfunction: value['functionName'],\n\t\tscript: value['scriptId'],\n\t\turl: value['url'],\n\t\tline: value['lineNumber'],\n\t\tcolumn: value['columnNumber'],\n\t}\n}\n\n/**\n * Converts a typed cookie input into Chromium protocol fields.\n *\n * @param cookie - Validated public cookie input\n * @returns Protocol cookie record\n */\nexport function cookieToProtocol(cookie: BrowserCookieInput): Readonly<Record<string, unknown>> {\n\tif (cookie.name.length === 0) throw new BrowserError('Browser cookie name cannot be empty')\n\tif (cookie.url === undefined && (cookie.domain === undefined || cookie.path === undefined)) {\n\t\tthrow new BrowserError('Browser cookie requires either url or domain with path', undefined, {\n\t\t\tname: cookie.name,\n\t\t})\n\t}\n\tif (cookie.url !== undefined && !URL.canParse(cookie.url)) {\n\t\tthrow new BrowserError('Browser cookie URL must be valid', undefined, {\n\t\t\tname: cookie.name,\n\t\t\turl: cookie.url,\n\t\t})\n\t}\n\tif (cookie.expires !== undefined && !isFiniteNumber(cookie.expires)) {\n\t\tthrow new BrowserError('Browser cookie expiry must be finite', undefined, {\n\t\t\tname: cookie.name,\n\t\t\texpires: cookie.expires,\n\t\t})\n\t}\n\tconst result: Record<string, unknown> = {\n\t\tname: cookie.name,\n\t\tvalue: cookie.value,\n\t}\n\tif (cookie.url !== undefined) result['url'] = cookie.url\n\tif (cookie.domain !== undefined) result['domain'] = cookie.domain\n\tif (cookie.path !== undefined) result['path'] = cookie.path\n\tif (cookie.expires !== undefined) result['expires'] = cookie.expires\n\tif (cookie.http !== undefined) result['httpOnly'] = cookie.http\n\tif (cookie.secure !== undefined) result['secure'] = cookie.secure\n\tif (cookie.site !== undefined) result['sameSite'] = cookie.site\n\tif (cookie.priority !== undefined) result['priority'] = cookie.priority\n\tif (cookie.partition !== undefined) {\n\t\tresult['partitionKey'] = {\n\t\t\ttopLevelSite: cookie.partition.site,\n\t\t\thasCrossSiteAncestor: cookie.partition.ancestor ?? false,\n\t\t}\n\t}\n\treturn result\n}\n\n/**\n * Decodes cookies returned by `Storage.getCookies`.\n *\n * @param value - Unknown protocol result\n * @returns Valid cookies\n */\nexport function readBrowserCookies(value: unknown): readonly BrowserCookie[] {\n\tif (!isRecord(value) || !isArray(value['cookies'])) {\n\t\tthrow new BrowserError('Browser cookie result is malformed')\n\t}\n\treturn value['cookies'].map((candidate, index) => readBrowserCookie(candidate, index))\n}\n\n/**\n * Decodes one Chromium cookie.\n *\n * @param value - Unknown cookie record\n * @param index - Source array position for diagnostics\n * @returns Valid cookie\n */\nexport function readBrowserCookie(value: unknown, index: number): BrowserCookie {\n\tif (\n\t\t!isRecord(value) ||\n\t\t!isString(value['name']) ||\n\t\t!isString(value['value']) ||\n\t\t!isString(value['domain']) ||\n\t\t!isString(value['path']) ||\n\t\t!isFiniteNumber(value['expires']) ||\n\t\t!isBoolean(value['httpOnly']) ||\n\t\t!isBoolean(value['secure'])\n\t) {\n\t\tthrow new BrowserError('Browser cookie is malformed', undefined, { index })\n\t}\n\tconst sameSite = parseEnum(value['sameSite'], ['Strict', 'Lax', 'None'])\n\tif (value['sameSite'] !== undefined && sameSite === undefined) {\n\t\tthrow new BrowserError('Browser cookie same-site policy is malformed', undefined, { index })\n\t}\n\treturn {\n\t\tname: value['name'],\n\t\tvalue: value['value'],\n\t\tdomain: value['domain'],\n\t\tpath: value['path'],\n\t\texpires: value['expires'],\n\t\thttp: value['httpOnly'],\n\t\tsecure: value['secure'],\n\t\tsite: sameSite,\n\t\tpartition: parseBrowserCookiePartition(value['partitionKey']),\n\t}\n}\n\n/**\n * Matches a decoded cookie against one request URL.\n *\n * @param cookie - Decoded context cookie\n * @param value - Candidate absolute URL\n * @returns True if domain, path, and secure constraints match; false otherwise\n */\nexport function matchesBrowserCookieURL(cookie: BrowserCookie, value: string): boolean {\n\tconst result = attempt(() => new URL(value))\n\tif (!result.success) {\n\t\tthrow new BrowserError('Browser cookie URL must be valid', undefined, { url: value })\n\t}\n\tconst url = result.value\n\tconst domain = cookie.domain.startsWith('.') ? cookie.domain.slice(1) : cookie.domain\n\tconst domainMatches = url.hostname === domain || url.hostname.endsWith(`.${domain}`)\n\tconst pathMatches =\n\t\turl.pathname === cookie.path ||\n\t\t(url.pathname.startsWith(cookie.path) &&\n\t\t\t(cookie.path.endsWith('/') || url.pathname[cookie.path.length] === '/'))\n\tconst secureMatches = !cookie.secure || url.protocol === 'https:' || url.protocol === 'wss:'\n\treturn domainMatches && pathMatches && secureMatches\n}\n\n/**\n * Decodes one in-page web-storage snapshot.\n *\n * @param value - Unknown evaluation result\n * @param origin - Origin represented by the result\n * @returns Valid origin storage\n */\nexport function readBrowserStorageOrigin(value: unknown, origin: string): BrowserStorageOrigin {\n\tif (!isRecord(value))\n\t\tthrow new BrowserError('Browser storage result is malformed', undefined, { origin })\n\treturn {\n\t\torigin,\n\t\tlocal: readBrowserStorageEntries(value['local'], origin, 'local'),\n\t\tsession: readBrowserStorageEntries(value['session'], origin, 'session'),\n\t}\n}\n\n/**\n * Decodes a list of web-storage entries.\n *\n * @param value - Unknown entry list\n * @param origin - Origin used for diagnostics\n * @param storage - Storage family used for diagnostics\n * @returns Valid key/value entries\n */\nexport function readBrowserStorageEntries(\n\tvalue: unknown,\n\torigin: string,\n\tstorage: 'local' | 'session',\n): readonly BrowserStorageEntry[] {\n\tif (!isArray(value)) {\n\t\tthrow new BrowserError('Browser storage entries are malformed', undefined, { origin, storage })\n\t}\n\treturn value.map((entry, index) => {\n\t\tif (!isRecord(entry) || !isString(entry['name']) || !isString(entry['value'])) {\n\t\t\tthrow new BrowserError('Browser storage entry is malformed', undefined, {\n\t\t\t\torigin,\n\t\t\t\tstorage,\n\t\t\t\tindex,\n\t\t\t})\n\t\t}\n\t\treturn { name: entry['name'], value: entry['value'] }\n\t})\n}\n\n/**\n * Converts typed media preferences to Chromium emulated media features.\n *\n * @param media - Public media configuration\n * @returns Protocol feature records\n */\nexport function mediaToFeatures(\n\tmedia: BrowserMedia,\n): ReadonlyArray<Readonly<Record<string, string>>> {\n\tconst features: Array<Readonly<Record<string, string>>> = []\n\tif (media.scheme !== undefined) {\n\t\tfeatures.push({ name: 'prefers-color-scheme', value: media.scheme })\n\t}\n\tif (media.contrast !== undefined) {\n\t\tfeatures.push({ name: 'prefers-contrast', value: media.contrast })\n\t}\n\tif (media.motion !== undefined) {\n\t\tfeatures.push({ name: 'prefers-reduced-motion', value: media.motion })\n\t}\n\tif (media.colors !== undefined) {\n\t\tfeatures.push({ name: 'forced-colors', value: media.colors })\n\t}\n\treturn features\n}\n\n/**\n * Decodes a Chromium runtime stack trace.\n *\n * @param value - Unknown stack trace or call-frame list\n * @returns Valid stack frames\n */\nexport function readBrowserStack(value: unknown): readonly BrowserStackFrame[] {\n\tconst frames = isRecord(value) ? value['callFrames'] : value\n\tif (!isArray(frames)) return []\n\tconst stack: BrowserStackFrame[] = []\n\tfor (const frame of frames) {\n\t\tif (\n\t\t\t!isRecord(frame) ||\n\t\t\t!isString(frame['url']) ||\n\t\t\t!isString(frame['functionName']) ||\n\t\t\t!isInteger(frame['lineNumber']) ||\n\t\t\t!isInteger(frame['columnNumber'])\n\t\t) {\n\t\t\tcontinue\n\t\t}\n\t\tstack.push({\n\t\t\turl: frame['url'],\n\t\t\tfunction: frame['functionName'],\n\t\t\tline: frame['lineNumber'],\n\t\t\tcolumn: frame['columnNumber'],\n\t\t})\n\t}\n\treturn stack\n}\n\n/**\n * Decodes a Runtime remote object's printable value.\n *\n * @param value - Unknown remote object\n * @returns By-value data or a description\n */\nexport function readBrowserRemoteValue(value: unknown): unknown {\n\tif (!isRecord(value)) return undefined\n\tif ('value' in value) return value['value']\n\tif (isString(value['unserializableValue'])) return value['unserializableValue']\n\tif (isString(value['description'])) return value['description']\n\treturn undefined\n}\n\n/**\n * Decodes one CDP `Runtime.evaluate` result.\n *\n * @param value - Unknown CDP result\n * @returns The returned by-value payload, or undefined\n */\nexport function readEvaluationResult(value: unknown): unknown {\n\tif (!isRecord(value)) return undefined\n\n\tif (isRecord(value['exceptionDetails'])) {\n\t\tconst details = value['exceptionDetails']\n\t\tif (isRecord(details['exception']) && isString(details['exception']['description'])) {\n\t\t\tconst description = details['exception']['description']\n\t\t\tconst limitMatch = BROWSER_RESULT_LIMIT_PATTERN.exec(description)\n\t\t\tif (limitMatch !== null) {\n\t\t\t\tthrow new BrowserResultLimitError('Evaluation result exceeds BROWSER_RESULT_LIMIT', {\n\t\t\t\t\tlength: Number(limitMatch[1]),\n\t\t\t\t\tlimit: BROWSER_RESULT_LIMIT,\n\t\t\t\t})\n\t\t\t}\n\t\t\tthrow new BrowserError(description)\n\t\t}\n\t\tthrow new BrowserError('JavaScript evaluation failed')\n\t}\n\n\tconst remoteObject = value['result']\n\tif (!isRecord(remoteObject)) return undefined\n\treturn 'value' in remoteObject ? remoteObject['value'] : undefined\n}\n\n/**\n * Requires an evaluated browser value to be a string.\n *\n * @param value - Candidate evaluated value\n * @param field - Human-readable field name used in the error\n * @returns The narrowed string\n */\nexport function requireBrowserString(value: unknown, field: string): string {\n\tif (isString(value)) return value\n\tthrow new BrowserError(`${field} failed: no string value returned`)\n}\n\n/**\n * Normalizes a raw list of recorded codegen actions.\n *\n * @remarks\n * Collapses consecutive `fill` actions on the same selector into the latest\n * value (a text input fires one `input` event per keystroke) so the\n * compiled script reflects the final typed value rather than every\n * intermediate keystroke.\n *\n * @param actions - Raw recorded actions, in capture order\n * @returns Normalized actions, in the same order\n */\nexport function normalizeCodegenActions(\n\tactions: readonly BrowserCodegenAction[],\n): readonly BrowserCodegenAction[] {\n\tconst result: BrowserCodegenAction[] = []\n\n\tfor (const action of actions) {\n\t\tconst previous = result[result.length - 1]\n\t\tif (\n\t\t\tprevious !== undefined &&\n\t\t\tprevious.action === 'fill' &&\n\t\t\taction.action === 'fill' &&\n\t\t\tprevious.selector === action.selector\n\t\t) {\n\t\t\tresult[result.length - 1] = action\n\t\t\tcontinue\n\t\t}\n\t\tresult.push(action)\n\t}\n\n\treturn result\n}\n\n/**\n * Decodes a flattened CDP `Page.getFrameTree` result.\n *\n * @param value - Unknown CDP result\n * @returns Frame metadata in depth-first, main-frame-first order\n */\nexport function readBrowserFrames(value: unknown): readonly BrowserFrameInfo[] {\n\tif (!isRecord(value) || !isRecord(value['frameTree'])) return []\n\n\tconst frames: BrowserFrameInfo[] = []\n\tconst stack: Array<Readonly<Record<string, unknown>>> = [value['frameTree']]\n\n\twhile (stack.length > 0) {\n\t\tconst node = stack.pop()\n\t\tif (node === undefined) break\n\t\tconst frame = node['frame']\n\n\t\tif (isRecord(frame) && isString(frame['id']) && isString(frame['url'])) {\n\t\t\tframes.push({\n\t\t\t\tid: frame['id'],\n\t\t\t\tparent: isString(frame['parentId']) ? frame['parentId'] : undefined,\n\t\t\t\tname: isString(frame['name']) && frame['name'] !== '' ? frame['name'] : undefined,\n\t\t\t\turl: frame['url'],\n\t\t\t})\n\t\t}\n\n\t\tconst children = node['childFrames']\n\t\tif (!isArray(children)) continue\n\t\tfor (let index = children.length - 1; index >= 0; index -= 1) {\n\t\t\tconst child = children[index]\n\t\t\tif (isRecord(child)) stack.push(child)\n\t\t}\n\t}\n\n\treturn frames\n}\n\n/**\n * Decodes the first `DOM.getContentQuads` quad and its center.\n *\n * @param value - Unknown CDP result\n * @returns Decoded quad\n */\nexport function readBrowserQuad(value: unknown): BrowserQuad {\n\tif (!isRecord(value) || !isArray(value['quads'])) {\n\t\tthrow new BrowserError('Element has no content quad')\n\t}\n\tconst points = parseNumberArray(value['quads'][0])\n\tif (points === undefined || points.length !== 8) {\n\t\tthrow new BrowserError('Element has a malformed content quad')\n\t}\n\tconst x1 = points[0]\n\tconst y1 = points[1]\n\tconst x2 = points[2]\n\tconst y2 = points[3]\n\tconst x3 = points[4]\n\tconst y3 = points[5]\n\tconst x4 = points[6]\n\tconst y4 = points[7]\n\tif (\n\t\tx1 === undefined ||\n\t\ty1 === undefined ||\n\t\tx2 === undefined ||\n\t\ty2 === undefined ||\n\t\tx3 === undefined ||\n\t\ty3 === undefined ||\n\t\tx4 === undefined ||\n\t\ty4 === undefined\n\t) {\n\t\tthrow new BrowserError('Element has a malformed content quad')\n\t}\n\treturn {\n\t\tpoints: [x1, y1, x2, y2, x3, y3, x4, y4],\n\t\tcenter: {\n\t\t\tx: (x1 + x2 + x3 + x4) / 4,\n\t\t\ty: (y1 + y2 + y3 + y4) / 4,\n\t\t},\n\t}\n}\n\n/**\n * Extracts a keyboard chord such as `Control+Shift+P` into its parts.\n *\n * @param value - Chord source\n * @returns Canonical modifiers and terminal key\n * @throws Thrown when the chord is empty or names an unsupported modifier.\n */\nexport function extractBrowserChord(value: string): BrowserChord {\n\tconst parts = value.split('+').filter((part) => part.length > 0)\n\tconst key = parts.pop()\n\tif (key === undefined) throw new BrowserError('Browser key chord is empty')\n\tconst modifiers = parts.map((modifier) => {\n\t\tswitch (modifier) {\n\t\t\tcase 'Ctrl':\n\t\t\t\treturn 'Control'\n\t\t\tcase 'Cmd':\n\t\t\tcase 'Command':\n\t\t\t\treturn 'Meta'\n\t\t\tdefault:\n\t\t\t\treturn modifier\n\t\t}\n\t})\n\tfor (const modifier of modifiers) {\n\t\tif (BROWSER_KEY_MODIFIERS[modifier] === undefined) {\n\t\t\tthrow new BrowserError(`Unsupported browser key modifier: ${modifier}`)\n\t\t}\n\t}\n\treturn { modifiers, key }\n}\n\n/**\n * Computes the CDP Input modifier bitmask.\n *\n * @param modifiers - Canonical modifier names\n * @returns Combined CDP modifier mask\n */\nexport function computeBrowserModifiers(modifiers: readonly string[]): number {\n\tlet mask = 0\n\tfor (const modifier of modifiers) mask |= BROWSER_KEY_MODIFIERS[modifier] ?? 0\n\treturn mask\n}\n\n/**\n * Computes the CDP Input pressed-button bitmask.\n *\n * @param buttons - Currently pressed public mouse buttons\n * @returns Combined CDP pressed-button mask\n */\nexport function computeBrowserButtons(buttons: readonly BrowserMouseButton[]): number {\n\tlet mask = 0\n\tfor (const button of buttons) mask |= BROWSER_MOUSE_BUTTON_MASKS[button]\n\treturn mask\n}\n\n/**\n * Normalizes one key to CDP keyboard event data.\n *\n * @param value - Key value or canonical key name\n * @returns Normalized key data\n */\nexport function keyToBrowserInput(value: string): BrowserKey {\n\tconst named: Readonly<Record<string, BrowserKey>> = {\n\t\tBackspace: { key: 'Backspace', code: 'Backspace', text: undefined, number: 8 },\n\t\tTab: { key: 'Tab', code: 'Tab', text: '\\t', number: 9 },\n\t\tEnter: { key: 'Enter', code: 'Enter', text: '\\r', number: 13 },\n\t\tShift: { key: 'Shift', code: 'ShiftLeft', text: undefined, number: 16 },\n\t\tControl: { key: 'Control', code: 'ControlLeft', text: undefined, number: 17 },\n\t\tAlt: { key: 'Alt', code: 'AltLeft', text: undefined, number: 18 },\n\t\tEscape: { key: 'Escape', code: 'Escape', text: undefined, number: 27 },\n\t\tSpace: { key: ' ', code: 'Space', text: ' ', number: 32 },\n\t\tPageUp: { key: 'PageUp', code: 'PageUp', text: undefined, number: 33 },\n\t\tPageDown: { key: 'PageDown', code: 'PageDown', text: undefined, number: 34 },\n\t\tEnd: { key: 'End', code: 'End', text: undefined, number: 35 },\n\t\tHome: { key: 'Home', code: 'Home', text: undefined, number: 36 },\n\t\tArrowLeft: { key: 'ArrowLeft', code: 'ArrowLeft', text: undefined, number: 37 },\n\t\tArrowUp: { key: 'ArrowUp', code: 'ArrowUp', text: undefined, number: 38 },\n\t\tArrowRight: { key: 'ArrowRight', code: 'ArrowRight', text: undefined, number: 39 },\n\t\tArrowDown: { key: 'ArrowDown', code: 'ArrowDown', text: undefined, number: 40 },\n\t\tDelete: { key: 'Delete', code: 'Delete', text: undefined, number: 46 },\n\t\tMeta: { key: 'Meta', code: 'MetaLeft', text: undefined, number: 91 },\n\t}\n\tconst matched = named[value]\n\tif (matched !== undefined) return matched\n\tif ([...value].length !== 1) throw new BrowserError(`Unsupported browser key: ${value}`)\n\tconst character = [...value][0]\n\tif (character === undefined) throw new BrowserError('Browser key is empty')\n\tconst upper = character.toUpperCase()\n\tconst letter = /^[A-Z]$/.test(upper)\n\tconst digit = /^[0-9]$/.test(character)\n\treturn {\n\t\tkey: character,\n\t\tcode: letter ? `Key${upper}` : digit ? `Digit${character}` : '',\n\t\ttext: character,\n\t\tnumber: upper.charCodeAt(0),\n\t}\n}\n\n/**\n * Decodes CDP snapshot sparse string data.\n *\n * @param value - Sparse `{ index, value }` record\n * @param strings - Snapshot string table\n * @returns Node-index to string map\n */\nexport function readRareStringData(\n\tvalue: unknown,\n\tstrings: readonly string[],\n): ReadonlyMap<number, string> {\n\tconst decoded = new Map<number, string>()\n\tif (!isRecord(value)) return decoded\n\tconst indexes = parseNumberArray(value['index'])\n\tconst values = parseNumberArray(value['value'])\n\tif (indexes === undefined || values === undefined) return decoded\n\n\tfor (let index = 0; index < indexes.length; index += 1) {\n\t\tconst node = indexes[index]\n\t\tconst text = parseSnapshotString(strings, values[index])\n\t\tif (node !== undefined && text !== undefined) decoded.set(node, text)\n\t}\n\treturn decoded\n}\n\n/**\n * Decodes CDP snapshot sparse boolean data.\n *\n * @param value - Sparse `{ index }` record\n * @returns Set of node indexes whose value is true\n */\nexport function readRareBooleanData(value: unknown): ReadonlySet<number> {\n\tif (!isRecord(value)) return new Set()\n\treturn new Set(parseNumberArray(value['index']) ?? [])\n}\n\n/**\n * Decodes CDP snapshot sparse integer data.\n *\n * @param value - Sparse `{ index, value }` record\n * @returns Node-index to integer map\n */\nexport function readRareIntegerData(value: unknown): ReadonlyMap<number, number> {\n\tconst decoded = new Map<number, number>()\n\tif (!isRecord(value)) return decoded\n\tconst indexes = parseNumberArray(value['index'])\n\tconst values = parseNumberArray(value['value'])\n\tif (indexes === undefined || values === undefined) return decoded\n\n\tfor (let index = 0; index < indexes.length; index += 1) {\n\t\tconst node = indexes[index]\n\t\tconst integer = values[index]\n\t\tif (node !== undefined && integer !== undefined) decoded.set(node, integer)\n\t}\n\treturn decoded\n}\n\n/**\n * Decodes flattened CDP node attributes.\n *\n * @param value - Candidate string-index array\n * @param strings - Snapshot string table\n * @returns Frozen attribute record\n */\nexport function readBrowserAttributes(\n\tvalue: unknown,\n\tstrings: readonly string[],\n): Readonly<Record<string, string>> {\n\tconst indexes = parseNumberArray(value)\n\tconst attributes: Record<string, string> = {}\n\tif (indexes === undefined) return Object.freeze(attributes)\n\n\tfor (let index = 0; index < indexes.length; index += 2) {\n\t\tconst name = parseSnapshotString(strings, indexes[index])\n\t\tconst attribute = parseSnapshotString(strings, indexes[index + 1])\n\t\tif (name !== undefined && attribute !== undefined) attributes[name] = attribute\n\t}\n\treturn Object.freeze(attributes)\n}\n\n/**\n * Decodes a CDP `DOMSnapshot.captureSnapshot` result.\n *\n * @param value - Unknown CDP result\n * @param styles - Requested computed-style names, in protocol order\n * @param limit - Maximum accepted node count\n * @returns A typed serializable browser snapshot\n */\nexport function readBrowserSnapshot(\n\tvalue: unknown,\n\tstyles: readonly string[] = [],\n\tlimit = BROWSER_SNAPSHOT_NODE_LIMIT,\n): BrowserSnapshotInput {\n\tif (!isInteger(limit) || limit < 0) {\n\t\tthrow new BrowserError('Browser snapshot limit must be a non-negative integer', undefined, {\n\t\t\tlimit,\n\t\t})\n\t}\n\tif (!isRecord(value) || !isArray(value['strings']) || !isArray(value['documents'])) {\n\t\tthrow new BrowserError('Malformed DOMSnapshot.captureSnapshot result')\n\t}\n\tif (!value['strings'].every(isString)) {\n\t\tthrow new BrowserError('Malformed DOMSnapshot string table')\n\t}\n\n\tconst strings: readonly string[] = value['strings']\n\tlet count = 0\n\tfor (const document of value['documents']) {\n\t\tif (!isRecord(document) || !isRecord(document['nodes'])) continue\n\t\tcount += parseNumberArray(document['nodes']['nodeType'])?.length ?? 0\n\t}\n\tif (count > limit) {\n\t\tthrow new BrowserResultLimitError('DOM snapshot exceeds the configured node limit', {\n\t\t\tlength: count,\n\t\t\tlimit,\n\t\t})\n\t}\n\n\tconst documents: BrowserDocument[] = []\n\tfor (let documentIndex = 0; documentIndex < value['documents'].length; documentIndex += 1) {\n\t\tconst rawDocument = value['documents'][documentIndex]\n\t\tif (!isRecord(rawDocument) || !isRecord(rawDocument['nodes'])) {\n\t\t\tthrow new BrowserError('Malformed DOM snapshot document', undefined, {\n\t\t\t\tdocument: documentIndex,\n\t\t\t})\n\t\t}\n\n\t\tconst rawNodes = rawDocument['nodes']\n\t\tconst frame = parseSnapshotString(strings, rawDocument['frameId'])\n\t\tconst url = parseSnapshotString(strings, rawDocument['documentURL'])\n\t\tconst title =\n\t\t\trawDocument['title'] === -1 ? '' : parseSnapshotString(strings, rawDocument['title'])\n\t\tif (frame === undefined || url === undefined || title === undefined) {\n\t\t\tthrow new BrowserError('Malformed DOM snapshot document metadata', undefined, {\n\t\t\t\tdocument: documentIndex,\n\t\t\t})\n\t\t}\n\t\tconst types = parseNumberArray(rawNodes['nodeType'])\n\t\tconst names = parseNumberArray(rawNodes['nodeName'])\n\t\tconst values = parseNumberArray(rawNodes['nodeValue'])\n\t\tif (types === undefined || names === undefined || values === undefined) {\n\t\t\tthrow new BrowserError('Malformed DOM snapshot node table', undefined, {\n\t\t\t\tdocument: documentIndex,\n\t\t\t})\n\t\t}\n\n\t\tconst parents = parseNumberArray(rawNodes['parentIndex']) ?? []\n\t\tconst ids = parseNumberArray(rawNodes['backendNodeId']) ?? []\n\t\tconst rawAttributes = isArray(rawNodes['attributes']) ? rawNodes['attributes'] : []\n\t\tconst texts = readRareStringData(rawNodes['textValue'], strings)\n\t\tconst inputs = readRareStringData(rawNodes['inputValue'], strings)\n\t\tconst checked = readRareBooleanData(rawNodes['inputChecked'])\n\t\tconst selected = readRareBooleanData(rawNodes['optionSelected'])\n\t\tconst clickable = readRareBooleanData(rawNodes['isClickable'])\n\t\tconst shadows = readRareStringData(rawNodes['shadowRootType'], strings)\n\t\tconst contents = readRareIntegerData(rawNodes['contentDocumentIndex'])\n\t\tconst pseudos = readRareStringData(rawNodes['pseudoType'], strings)\n\t\tconst sources = readRareStringData(rawNodes['currentSourceURL'], strings)\n\t\tconst origins = readRareStringData(rawNodes['originURL'], strings)\n\t\tconst layouts = new Map<number, BrowserLayout>()\n\n\t\tif (isRecord(rawDocument['layout'])) {\n\t\t\tconst rawLayout = rawDocument['layout']\n\t\t\tconst nodeIndexes = parseNumberArray(rawLayout['nodeIndex']) ?? []\n\t\t\tconst rawStyles = isArray(rawLayout['styles']) ? rawLayout['styles'] : []\n\t\t\tconst rawBounds = isArray(rawLayout['bounds']) ? rawLayout['bounds'] : []\n\t\t\tconst rawTexts = parseNumberArray(rawLayout['text']) ?? []\n\t\t\tconst paints = parseNumberArray(rawLayout['paintOrders']) ?? []\n\t\t\tconst rawOffsets = isArray(rawLayout['offsetRects']) ? rawLayout['offsetRects'] : []\n\t\t\tconst rawScrolls = isArray(rawLayout['scrollRects']) ? rawLayout['scrollRects'] : []\n\t\t\tconst rawClients = isArray(rawLayout['clientRects']) ? rawLayout['clientRects'] : []\n\n\t\t\tfor (let layoutIndex = 0; layoutIndex < nodeIndexes.length; layoutIndex += 1) {\n\t\t\t\tconst nodeIndex = nodeIndexes[layoutIndex]\n\t\t\t\tif (nodeIndex === undefined) continue\n\t\t\t\tconst styleIndexes = parseNumberArray(rawStyles[layoutIndex]) ?? []\n\t\t\t\tconst computed: Record<string, string> = {}\n\t\t\t\tfor (let styleIndex = 0; styleIndex < styles.length; styleIndex += 1) {\n\t\t\t\t\tconst name = styles[styleIndex]\n\t\t\t\t\tconst style = parseSnapshotString(strings, styleIndexes[styleIndex])\n\t\t\t\t\tif (name !== undefined && style !== undefined) computed[name] = style\n\t\t\t\t}\n\t\t\t\tlayouts.set(nodeIndex, {\n\t\t\t\t\tbounds: parseBrowserRect(rawBounds[layoutIndex]),\n\t\t\t\t\tstyles: Object.freeze(computed),\n\t\t\t\t\ttext: parseSnapshotString(strings, rawTexts[layoutIndex]),\n\t\t\t\t\tpaint: paints[layoutIndex],\n\t\t\t\t\toffset: parseBrowserRect(rawOffsets[layoutIndex]),\n\t\t\t\t\tscroll: parseBrowserRect(rawScrolls[layoutIndex]),\n\t\t\t\t\tclient: parseBrowserRect(rawClients[layoutIndex]),\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\tconst nodes: BrowserNode[] = []\n\t\tfor (let nodeIndex = 0; nodeIndex < types.length; nodeIndex += 1) {\n\t\t\tconst category = types[nodeIndex]\n\t\t\tconst name = parseSnapshotString(strings, names[nodeIndex])\n\t\t\tconst nodeValue =\n\t\t\t\tvalues[nodeIndex] === -1 ? '' : parseSnapshotString(strings, values[nodeIndex])\n\t\t\tif (category === undefined || name === undefined || nodeValue === undefined) {\n\t\t\t\tthrow new BrowserError('Malformed DOM snapshot node', undefined, {\n\t\t\t\t\tdocument: documentIndex,\n\t\t\t\t\tindex: nodeIndex,\n\t\t\t\t})\n\t\t\t}\n\t\t\tconst parent = parents[nodeIndex]\n\t\t\tnodes.push({\n\t\t\t\tdocument: documentIndex,\n\t\t\t\tframe,\n\t\t\t\tindex: nodeIndex,\n\t\t\t\tid: ids[nodeIndex],\n\t\t\t\tparent: parent === undefined || parent < 0 ? undefined : parent,\n\t\t\t\tcategory,\n\t\t\t\tname,\n\t\t\t\tvalue: nodeValue,\n\t\t\t\tattributes: readBrowserAttributes(rawAttributes[nodeIndex], strings),\n\t\t\t\ttext: texts.get(nodeIndex),\n\t\t\t\tinput: inputs.get(nodeIndex),\n\t\t\t\tchecked: checked.has(nodeIndex) ? true : undefined,\n\t\t\t\tselected: selected.has(nodeIndex) ? true : undefined,\n\t\t\t\tclickable: clickable.has(nodeIndex) ? true : undefined,\n\t\t\t\tshadow: shadows.get(nodeIndex),\n\t\t\t\tcontent: contents.get(nodeIndex),\n\t\t\t\tpseudo: pseudos.get(nodeIndex),\n\t\t\t\tsource: sources.get(nodeIndex),\n\t\t\t\torigin: origins.get(nodeIndex),\n\t\t\t\tlayout: layouts.get(nodeIndex),\n\t\t\t})\n\t\t}\n\n\t\tdocuments.push({\n\t\t\tindex: documentIndex,\n\t\t\tframe,\n\t\t\turl,\n\t\t\ttitle,\n\t\t\tnodes,\n\t\t\tscroll: [\n\t\t\t\tisFiniteNumber(rawDocument['scrollOffsetX']) ? rawDocument['scrollOffsetX'] : undefined,\n\t\t\t\tisFiniteNumber(rawDocument['scrollOffsetY']) ? rawDocument['scrollOffsetY'] : undefined,\n\t\t\t],\n\t\t\twidth: isFiniteNumber(rawDocument['contentWidth']) ? rawDocument['contentWidth'] : undefined,\n\t\t\theight: isFiniteNumber(rawDocument['contentHeight'])\n\t\t\t\t? rawDocument['contentHeight']\n\t\t\t\t: undefined,\n\t\t})\n\t}\n\n\treturn { documents, styles: [...styles] }\n}\n\n/**\n * Tests whether a browser-node matcher is a declarative query.\n *\n * @param value - Browser-node query or predicate\n * @returns True if the matcher is a declarative query; false otherwise\n *\n * @example\n * ```ts\n * import { isBrowserNodeQuery } from '@orkestrel/browser'\n *\n * isBrowserNodeQuery({ name: 'main' }) // true\n * isBrowserNodeQuery(() => true) // false\n * ```\n */\nexport function isBrowserNodeQuery(\n\tvalue: BrowserNodeQuery | BrowserNodePredicate,\n): value is BrowserNodeQuery {\n\treturn !isFunction(value)\n}\n\n/**\n * Tests a captured node against a declarative query.\n *\n * @param node - Captured browser node\n * @param query - Fields every candidate must satisfy\n * @returns True if the node matches; false otherwise\n */\nexport function matchesBrowserNode(node: BrowserNode, query: BrowserNodeQuery): boolean {\n\tif (query.name !== undefined && node.name.toLowerCase() !== query.name.toLowerCase()) return false\n\tif (\n\t\tquery.text !== undefined &&\n\t\t!node.value.includes(query.text) &&\n\t\tnode.text?.includes(query.text) !== true\n\t) {\n\t\treturn false\n\t}\n\tif (query.frame !== undefined && node.frame !== query.frame) return false\n\tif (query.clickable !== undefined && (node.clickable === true) !== query.clickable) return false\n\tif (query.visible !== undefined && isBrowserNodeVisible(node) !== query.visible) return false\n\tif (query.attributes !== undefined) {\n\t\tfor (const [name, value] of Object.entries(query.attributes)) {\n\t\t\tif (node.attributes[name] !== value) return false\n\t\t}\n\t}\n\treturn true\n}\n\n/**\n * Tests whether a captured node has a non-empty rendered layout box.\n *\n * @param node - Captured browser node\n * @returns True if the snapshot reports a visible layout box; false otherwise\n */\nexport function isBrowserNodeVisible(node: BrowserNode): boolean {\n\tconst bounds = node.layout?.bounds\n\treturn bounds !== undefined && bounds[2] > 0 && bounds[3] > 0\n}\n\n/**\n * Awaits every teardown step in order and returns the first failure.\n *\n * @remarks\n * A teardown runs every step even after one of them fails, so a later release\n * is never skipped by an earlier fault, and the failure the caller reports is\n * the first one. The failure is returned rather than thrown, so the caller\n * keeps the cleanup that must still run after the steps and decides where the\n * throw belongs. A step may throw any value, `undefined` and `null` included,\n * so the first throw is retained by a separate flag rather than by testing the\n * retained value.\n *\n * @param steps - The teardown steps, in the order they must run\n * @returns The value the first failing step threw, or undefined when no step threw\n *\n * @example\n * ```ts\n * import { settleBrowserTeardown } from '@orkestrel/browser'\n *\n * const failure = await settleBrowserTeardown(\n * \t() => client.close(),\n * \t() => transport.close(),\n * )\n * if (failure !== undefined) throw failure\n * ```\n */\nexport async function settleBrowserTeardown(\n\t...steps: readonly BrowserTeardownFunction[]\n): Promise<unknown> {\n\tlet failure: unknown\n\tlet settled = false\n\tfor (const step of steps) {\n\t\ttry {\n\t\t\tawait step()\n\t\t} catch (error) {\n\t\t\tif (!settled) {\n\t\t\t\tfailure = error\n\t\t\t\tsettled = true\n\t\t\t}\n\t\t}\n\t}\n\treturn failure\n}\n","import type {\n\tBrowserActionabilityOptions,\n\tBrowserCodegenAction,\n\tBrowserCodegenScriptOptions,\n\tBrowserQuery,\n\tBrowserScreenshotOptions,\n\tBrowserStorageOrigin,\n} from './types.js'\nimport {\n\tBROWSER_RESULT_LIMIT_SENTINEL_PREFIX,\n\tBROWSER_SCREENSHOT_ATTRIBUTE,\n\tBROWSER_STABLE_FRAME_COUNT,\n\tBROWSER_TEST_ID_ATTRIBUTE,\n\tBROWSER_VISIBILITY_SOURCE,\n\tBROWSER_WAIT_POLL_INTERVAL_MS,\n} from './constants.js'\n\n/**\n * Compiles an auto-retrying in-page predicate wait.\n *\n * @param expression - Value or function expression\n * @param timeout - Maximum wait in milliseconds\n * @returns Promise expression resolving to the first truthy value or false\n */\nexport function compileFunctionWaitExpression(expression: string, timeout: number): string {\n\treturn `new Promise((resolve, reject) => {\n\tconst deadline = performance.now() + ${timeout}\n\tconst predicate = (${expression})\n\tconst check = async () => {\n\t\ttry {\n\t\t\tconst value = typeof predicate === 'function' ? await predicate() : await predicate\n\t\t\tif (value) {\n\t\t\t\tresolve(value)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (performance.now() >= deadline) {\n\t\t\t\tresolve(false)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tsetTimeout(check, ${BROWSER_WAIT_POLL_INTERVAL_MS})\n\t\t} catch (error) {\n\t\t\treject(error)\n\t\t}\n\t}\n\tvoid check()\n})`\n}\n\n/**\n * Compiles the page-side promise facade for one Runtime binding.\n *\n * @param name - Binding identifier\n * @returns Self-installing script source\n */\nexport function compileBrowserBindingSource(name: string): string {\n\tconst binding = JSON.stringify(name)\n\tconst state = JSON.stringify(`__orkestrelBinding_${name}`)\n\treturn `(() => {\n\tconst name = ${binding}\n\tconst key = ${state}\n\tif (globalThis[key]) return\n\tconst send = globalThis[name]\n\tif (typeof send !== 'function') throw new Error('Browser binding transport is unavailable')\n\tconst pending = new Map()\n\tlet sequence = 0\n\tglobalThis[key] = {\n\t\tresolve(id, success, value) {\n\t\t\tconst entry = pending.get(id)\n\t\t\tif (!entry) return\n\t\t\tpending.delete(id)\n\t\t\tif (success) entry.resolve(value)\n\t\t\telse entry.reject(new Error(String(value)))\n\t\t},\n\t}\n\tglobalThis[name] = (...args) => new Promise((resolve, reject) => {\n\t\tsequence += 1\n\t\tconst id = String(sequence)\n\t\tpending.set(id, { resolve, reject })\n\t\tsend(JSON.stringify({ id, name, args }))\n\t})\n})()`\n}\n\n/**\n * Compiles delivery of a host binding result to one execution context.\n *\n * @param name - Binding identifier\n * @param id - Call identifier\n * @param success - Resolve rather than reject\n * @param value - Serializable result or error\n * @returns Runtime expression\n */\nexport function compileBrowserBindingResult(\n\tname: string,\n\tid: string,\n\tsuccess: boolean,\n\tvalue: unknown,\n): string {\n\treturn `globalThis[${JSON.stringify(`__orkestrelBinding_${name}`)}]?.resolve(${JSON.stringify(id)}, ${JSON.stringify(success)}, ${JSON.stringify(value)})`\n}\n\n/**\n * Compiles current-document cleanup for one page-side host binding facade.\n *\n * @param name - Binding identifier\n * @returns Runtime cleanup expression\n */\nexport function compileBrowserBindingCleanup(name: string): string {\n\treturn `(() => {\n\tdelete globalThis[${JSON.stringify(name)}]\n\tdelete globalThis[${JSON.stringify(`__orkestrelBinding_${name}`)}]\n\treturn true\n})()`\n}\n\n/**\n * Compiles temporary animation, caret, and mask setup for a screenshot.\n *\n * @param options - Screenshot controls\n * @returns Setup expression or undefined when no preparation is required\n */\nexport function compileScreenshotPreparationExpression(\n\toptions?: BrowserScreenshotOptions,\n): string | undefined {\n\tconst masks = options?.mask ?? []\n\tif (options?.animations !== false && options?.caret !== false && masks.length === 0) {\n\t\treturn undefined\n\t}\n\tconst queries = masks.map((locator) => compileLocatorListExpression(locator.query))\n\treturn `(() => {\n\tconst attribute = ${JSON.stringify(BROWSER_SCREENSHOT_ATTRIBUTE)}\n\tconst sequence = (globalThis.__orkestrelScreenshotSequence ?? 0) + 1\n\tglobalThis.__orkestrelScreenshotSequence = sequence\n\tconst token = String(sequence)\n\tif (${JSON.stringify(options?.animations === false || options?.caret === false)}) {\n\t\tconst style = document.createElement('style')\n\t\tstyle.setAttribute(attribute, token)\n\t\tstyle.textContent = ${JSON.stringify(\n\t\t\t`${options?.animations === false ? '*,*::before,*::after{animation:none!important;transition:none!important;scroll-behavior:auto!important}' : ''}${options?.caret === false ? '*{caret-color:transparent!important}' : ''}`,\n\t\t)}\n\t\tdocument.documentElement.appendChild(style)\n\t}\n\tconst groups = [${queries.join(',')}]\n\tfor (const group of groups) {\n\t\tfor (const element of group) {\n\t\t\tconst rect = element.getBoundingClientRect()\n\t\t\tconst mask = document.createElement('div')\n\t\t\tmask.setAttribute(attribute, token)\n\t\t\tmask.style.cssText = 'position:fixed;pointer-events:none;z-index:2147483647;' +\n\t\t\t\t'left:' + rect.left + 'px;top:' + rect.top + 'px;width:' + rect.width + 'px;height:' + rect.height + 'px;' +\n\t\t\t\t'background:' + ${JSON.stringify(options?.color ?? '#ff00ff')}\n\t\t\tdocument.documentElement.appendChild(mask)\n\t\t}\n\t}\n\treturn token\n})()`\n}\n\n/**\n * Compiles cleanup for temporary screenshot styles and masks.\n *\n * @param token - Preparation token\n * @returns Cleanup expression\n */\nexport function compileScreenshotCleanupExpression(token: string): string {\n\treturn `(() => {\n\tconst attribute = ${JSON.stringify(BROWSER_SCREENSHOT_ATTRIBUTE)}\n\tfor (const element of document.querySelectorAll('[' + attribute + ']')) {\n\t\tif (element.getAttribute(attribute) === ${JSON.stringify(token)}) element.remove()\n\t}\n\treturn true\n})()`\n}\n\n/**\n * Compiles an expression that serializes local and session storage.\n *\n * @returns In-page storage expression\n */\nexport function compileStorageReadExpression(): string {\n\treturn `({\n\tlocal: Array.from({ length: localStorage.length }, (_, index) => {\n\t\tconst name = localStorage.key(index)\n\t\treturn { name, value: name === null ? '' : localStorage.getItem(name) ?? '' }\n\t}),\n\tsession: Array.from({ length: sessionStorage.length }, (_, index) => {\n\t\tconst name = sessionStorage.key(index)\n\t\treturn { name, value: name === null ? '' : sessionStorage.getItem(name) ?? '' }\n\t}),\n})`\n}\n\n/**\n * Compiles an expression that restores one origin's web storage.\n *\n * @param origin - Storage values to restore\n * @returns In-page restore expression\n */\nexport function compileStorageRestoreExpression(origin: BrowserStorageOrigin): string {\n\treturn `(() => {\n\tconst state = ${JSON.stringify({ local: origin.local, session: origin.session })}\n\tlocalStorage.clear()\n\tsessionStorage.clear()\n\tfor (const entry of state.local) localStorage.setItem(entry.name, entry.value)\n\tfor (const entry of state.session) sessionStorage.setItem(entry.name, entry.value)\n\treturn true\n})()`\n}\n\n/**\n * Compiles an expression that clears local and session storage.\n *\n * @returns In-page clear expression\n */\nexport function compileStorageClearExpression(): string {\n\treturn `(() => {\n\tlocalStorage.clear()\n\tsessionStorage.clear()\n\treturn true\n})()`\n}\n\n/**\n * Compiles a `Runtime.evaluate` expression so the IN-PAGE code stringifies\n * its own result and throws a recognizable error before an oversized result\n * would overflow the CDP transport frame.\n *\n * @remarks\n * A result whose `JSON.stringify` length exceeds `limit` throws\n * `Error('BROWSER_RESULT_LIMIT: <length>')` inside the page instead of being\n * returned — the caller maps that sentinel to a coded\n * {@link BrowserResultLimitError}. A non-serializable result (`undefined`,\n * a function, a symbol) makes `JSON.stringify` return `undefined`, so the\n * length check is skipped and today's undefined-passthrough behavior is\n * unchanged.\n *\n * The expression is placed on its own line inside the wrapper (rather than\n * inline with the guard code) so a trailing `//` line comment in the\n * expression cannot swallow the closing guard syntax that follows it.\n *\n * @param expression - The candidate JavaScript expression to evaluate\n * @param limit - Maximum serialized-character length (see {@link BROWSER_RESULT_LIMIT})\n * @returns The wrapped, guarded expression\n */\nexport function compileGuardedEvaluateExpression(expression: string, limit: number): string {\n\treturn `(() => { const r = (\n${expression}\n); const s = JSON.stringify(r); if (typeof s === 'string' && s.length > ${limit}) throw new Error(${JSON.stringify(BROWSER_RESULT_LIMIT_SENTINEL_PREFIX)} + s.length); return r })()`\n}\n\n/**\n * Compiles recorded codegen actions into a replayable script.\n *\n * @remarks\n * Emits one statement per action against a `page` object shaped like\n * {@link BrowserPageInterface} (`page.navigate(...)`, `page.click(...)`, …).\n * Both target languages emit an `async function run(page)` body whose\n * statements are `await`-ed; `language` only toggles whether the `page`\n * parameter carries a TypeScript type annotation (default `'javascript'`).\n *\n * @param actions - Normalized actions to compile\n * @param options - Compilation options (target language)\n * @returns The compiled script source\n */\nexport function compileCodegenScript(\n\tactions: readonly BrowserCodegenAction[],\n\toptions?: BrowserCodegenScriptOptions,\n): string {\n\tconst language = options?.language ?? 'javascript'\n\n\tconst lines = actions.map((action) => {\n\t\tswitch (action.action) {\n\t\t\tcase 'navigate':\n\t\t\t\treturn `await page.navigate(${JSON.stringify(action.url)})`\n\t\t\tcase 'click':\n\t\t\t\treturn `await page.click(${JSON.stringify(action.selector)})`\n\t\t\tcase 'fill':\n\t\t\t\treturn `await page.fill(${JSON.stringify(action.selector)}, ${JSON.stringify(action.value)})`\n\t\t\tcase 'select':\n\t\t\t\treturn `await page.select(${JSON.stringify(action.selector)}, ${JSON.stringify(action.values)})`\n\t\t}\n\t})\n\n\tif (language === 'typescript') {\n\t\treturn [\n\t\t\t`async function run(page: import('@orkestrel/browser').BrowserPageInterface): Promise<void> {`,\n\t\t\t...lines.map((line) => `\\t${line}`),\n\t\t\t`}`,\n\t\t].join('\\n')\n\t}\n\n\treturn [`async function run(page) {`, ...lines.map((line) => `\\t${line}`), `}`].join('\\n')\n}\n\n/**\n * Compiles a deep, shadow-aware locator query returning every match.\n *\n * @param query - Serializable locator query\n * @returns Runtime expression returning an element array\n */\nexport function compileLocatorListExpression(query: BrowserQuery): string {\n\treturn `(() => {\n\tconst query = ${JSON.stringify(query)}\n\tconst normalize = (value) => String(value ?? '').replace(/\\\\s+/g, ' ').trim()\n\tconst matchesText = (actual, expected, exact) => exact ? normalize(actual) === normalize(expected) : normalize(actual).includes(normalize(expected))\n\tconst elements = (root) => {\n\t\tconst found = []\n\t\tconst stack = []\n\t\tif (root instanceof Document || root instanceof ShadowRoot) {\n\t\t\tfor (let index = root.children.length - 1; index >= 0; index -= 1) stack.push(root.children[index])\n\t\t} else {\n\t\t\tfor (let index = root.children.length - 1; index >= 0; index -= 1) stack.push(root.children[index])\n\t\t}\n\t\twhile (stack.length > 0) {\n\t\t\tconst element = stack.pop()\n\t\t\tif (!(element instanceof Element)) continue\n\t\t\tfound.push(element)\n\t\t\tif (element.shadowRoot) {\n\t\t\t\tfor (let index = element.shadowRoot.children.length - 1; index >= 0; index -= 1) stack.push(element.shadowRoot.children[index])\n\t\t\t}\n\t\t\tfor (let index = element.children.length - 1; index >= 0; index -= 1) stack.push(element.children[index])\n\t\t}\n\t\treturn found\n\t}\n\tconst roleOf = (element) => {\n\t\tconst explicit = element.getAttribute('role')\n\t\tif (explicit) return explicit.split(/\\\\s+/)[0]\n\t\tconst tag = element.tagName.toLowerCase()\n\t\tif (tag === 'a' && element.hasAttribute('href')) return 'link'\n\t\tif (tag === 'button') return 'button'\n\t\tif (tag === 'textarea') return 'textbox'\n\t\tif (tag === 'select') return element.multiple ? 'listbox' : 'combobox'\n\t\tif (tag === 'option') return 'option'\n\t\tif (tag === 'img') return 'img'\n\t\tif (tag === 'nav') return 'navigation'\n\t\tif (tag === 'main') return 'main'\n\t\tif (tag === 'header') return 'banner'\n\t\tif (tag === 'footer') return 'contentinfo'\n\t\tif (tag === 'aside') return 'complementary'\n\t\tif (tag === 'article') return 'article'\n\t\tif (tag === 'form') return 'form'\n\t\tif (tag === 'table') return 'table'\n\t\tif (tag === 'tr') return 'row'\n\t\tif (tag === 'th') return 'columnheader'\n\t\tif (tag === 'td') return 'cell'\n\t\tif (tag === 'ul' || tag === 'ol') return 'list'\n\t\tif (tag === 'li') return 'listitem'\n\t\tif (/^h[1-6]$/.test(tag)) return 'heading'\n\t\tif (tag === 'input') {\n\t\t\tconst type = (element.getAttribute('type') || 'text').toLowerCase()\n\t\t\tif (type === 'checkbox') return 'checkbox'\n\t\t\tif (type === 'radio') return 'radio'\n\t\t\tif (type === 'range') return 'slider'\n\t\t\tif (type === 'number') return 'spinbutton'\n\t\t\tif (type === 'button' || type === 'submit' || type === 'reset') return 'button'\n\t\t\tif (type !== 'hidden') return 'textbox'\n\t\t}\n\t\treturn undefined\n\t}\n\tconst labelOf = (element) => {\n\t\tconst labelled = element.getAttribute('aria-labelledby')\n\t\tif (labelled) {\n\t\t\tconst text = labelled.split(/\\\\s+/).map((id) => element.ownerDocument.getElementById(id)?.textContent || '').join(' ')\n\t\t\tif (normalize(text)) return normalize(text)\n\t\t}\n\t\tif (element.hasAttribute('aria-label')) return normalize(element.getAttribute('aria-label'))\n\t\tif ('labels' in element && element.labels && element.labels.length > 0) {\n\t\t\tconst text = Array.from(element.labels, (label) => label.textContent || '').join(' ')\n\t\t\treturn normalize(text)\n\t\t}\n\t\treturn undefined\n\t}\n\tconst nameOf = (element) => {\n\t\tconst label = labelOf(element)\n\t\tif (label !== undefined) return label\n\t\tconst alt = element.getAttribute('alt')\n\t\tif (alt) return normalize(alt)\n\t\tconst title = element.getAttribute('title')\n\t\tif (title) return normalize(title)\n\t\tif (element instanceof HTMLInputElement && ['button', 'submit', 'reset'].includes(element.type)) return normalize(element.value)\n\t\treturn normalize(element.textContent)\n\t}\n\tconst visible = (element) => {\n\t\tconst style = getComputedStyle(element)\n\t\tconst rect = element.getBoundingClientRect()\n\t\treturn ${BROWSER_VISIBILITY_SOURCE}\n\t}\n\tconst resolve = (candidate) => {\n\t\tconst roots = candidate.parent ? resolve(candidate.parent) : [document]\n\t\tlet found = []\n\t\tfor (const root of roots) {\n\t\t\tconst candidates = elements(root)\n\t\t\tswitch (candidate.selector) {\n\t\t\t\tcase 'css':\n\t\t\t\t\tfound.push(...candidates.filter((element) => element.matches(candidate.value)))\n\t\t\t\t\tbreak\n\t\t\t\tcase 'role':\n\t\t\t\t\tfound.push(...candidates.filter((element) => roleOf(element) === candidate.value && (candidate.name === undefined || matchesText(nameOf(element), candidate.name, candidate.exact === true))))\n\t\t\t\t\tbreak\n\t\t\t\tcase 'text':\n\t\t\t\t\tfound.push(...candidates.filter((element) => matchesText(element.textContent, candidate.value, candidate.exact === true) && !Array.from(element.children).some((child) => matchesText(child.textContent, candidate.value, candidate.exact === true))))\n\t\t\t\t\tbreak\n\t\t\t\tcase 'label':\n\t\t\t\t\tfound.push(...candidates.filter((element) => {\n\t\t\t\t\t\tconst label = labelOf(element)\n\t\t\t\t\t\treturn label !== undefined && matchesText(label, candidate.value, candidate.exact === true)\n\t\t\t\t\t}))\n\t\t\t\t\tbreak\n\t\t\t\tcase 'placeholder':\n\t\t\t\t\tfound.push(...candidates.filter((element) => matchesText(element.getAttribute('placeholder'), candidate.value, candidate.exact === true)))\n\t\t\t\t\tbreak\n\t\t\t\tcase 'testId':\n\t\t\t\t\tfound.push(...candidates.filter((element) => element.getAttribute(${JSON.stringify(BROWSER_TEST_ID_ATTRIBUTE)}) === candidate.value))\n\t\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tfound = found.filter((element, index) => found.indexOf(element) === index)\n\t\tif (candidate.filter?.text !== undefined) found = found.filter((element) => matchesText(element.textContent, candidate.filter.text, candidate.filter.exact === true))\n\t\tif (candidate.filter?.visible !== undefined) found = found.filter((element) => visible(element) === candidate.filter.visible)\n\t\tif (candidate.index !== undefined) {\n\t\t\tconst index = candidate.index < 0 ? found.length + candidate.index : candidate.index\n\t\t\treturn found[index] ? [found[index]] : []\n\t\t}\n\t\treturn found\n\t}\n\treturn resolve(query)\n})()`\n}\n\n/**\n * Compiles a deep locator query returning its first match.\n *\n * @param query - Serializable locator query\n * @returns Runtime expression returning one element or undefined\n */\nexport function compileLocatorExpression(query: BrowserQuery): string {\n\treturn `(${compileLocatorListExpression(query)})[0]`\n}\n\n/**\n * Compiles an attached-state locator wait.\n */\nexport function compileAttachedLocatorWaitExpression(\n\tquery: BrowserQuery,\n\tstrict: boolean,\n\ttimeout: number,\n): string {\n\treturn `new Promise((resolve, reject) => {\n\tconst deadline = performance.now() + ${timeout}\n\tconst check = () => {\n\t\tconst matches = ${compileLocatorListExpression(query)}\n\t\tif (${JSON.stringify(strict)} && matches.length > 1) {\n\t\t\treject(new Error('Strict locator matched ' + matches.length + ' elements'))\n\t\t\treturn true\n\t\t}\n\t\tif (matches.length > 0) {\n\t\t\tresolve(true)\n\t\t\treturn true\n\t\t}\n\t\tif (performance.now() >= deadline) {\n\t\t\tresolve(false)\n\t\t\treturn true\n\t\t}\n\t\treturn false\n\t}\n\tif (check()) return\n\tconst timer = setInterval(() => {\n\t\tif (!check()) return\n\t\tclearInterval(timer)\n\t}, ${BROWSER_WAIT_POLL_INTERVAL_MS})\n})`\n}\n\n/**\n * Compiles a detached-state locator wait.\n */\nexport function compileDetachedLocatorWaitExpression(\n\tquery: BrowserQuery,\n\tstrict: boolean,\n\ttimeout: number,\n): string {\n\treturn `new Promise((resolve, reject) => {\n\tconst deadline = performance.now() + ${timeout}\n\tconst check = () => {\n\t\tconst matches = ${compileLocatorListExpression(query)}\n\t\tif (${JSON.stringify(strict)} && matches.length > 1) {\n\t\t\treject(new Error('Strict locator matched ' + matches.length + ' elements'))\n\t\t\treturn true\n\t\t}\n\t\tif (matches.length === 0) {\n\t\t\tresolve(true)\n\t\t\treturn true\n\t\t}\n\t\tif (performance.now() >= deadline) {\n\t\t\tresolve(false)\n\t\t\treturn true\n\t\t}\n\t\treturn false\n\t}\n\tif (check()) return\n\tconst timer = setInterval(() => {\n\t\tif (!check()) return\n\t\tclearInterval(timer)\n\t}, ${BROWSER_WAIT_POLL_INTERVAL_MS})\n})`\n}\n\n/**\n * Compiles a visible-state locator wait.\n */\nexport function compileVisibleLocatorWaitExpression(\n\tquery: BrowserQuery,\n\tstrict: boolean,\n\ttimeout: number,\n): string {\n\treturn `new Promise((resolve, reject) => {\n\tconst deadline = performance.now() + ${timeout}\n\tconst visible = (element) => {\n\t\tconst style = getComputedStyle(element)\n\t\tconst rect = element.getBoundingClientRect()\n\t\treturn ${BROWSER_VISIBILITY_SOURCE}\n\t}\n\tconst check = () => {\n\t\tconst matches = ${compileLocatorListExpression(query)}\n\t\tif (${JSON.stringify(strict)} && matches.length > 1) {\n\t\t\treject(new Error('Strict locator matched ' + matches.length + ' elements'))\n\t\t\treturn true\n\t\t}\n\t\tif (matches.length > 0 && visible(matches[0])) {\n\t\t\tresolve(true)\n\t\t\treturn true\n\t\t}\n\t\tif (performance.now() >= deadline) {\n\t\t\tresolve(false)\n\t\t\treturn true\n\t\t}\n\t\treturn false\n\t}\n\tif (check()) return\n\tconst timer = setInterval(() => {\n\t\tif (!check()) return\n\t\tclearInterval(timer)\n\t}, ${BROWSER_WAIT_POLL_INTERVAL_MS})\n})`\n}\n\n/**\n * Compiles a hidden-state locator wait.\n */\nexport function compileHiddenLocatorWaitExpression(\n\tquery: BrowserQuery,\n\tstrict: boolean,\n\ttimeout: number,\n): string {\n\treturn `new Promise((resolve, reject) => {\n\tconst deadline = performance.now() + ${timeout}\n\tconst visible = (element) => {\n\t\tconst style = getComputedStyle(element)\n\t\tconst rect = element.getBoundingClientRect()\n\t\treturn ${BROWSER_VISIBILITY_SOURCE}\n\t}\n\tconst check = () => {\n\t\tconst matches = ${compileLocatorListExpression(query)}\n\t\tif (${JSON.stringify(strict)} && matches.length > 1) {\n\t\t\treject(new Error('Strict locator matched ' + matches.length + ' elements'))\n\t\t\treturn true\n\t\t}\n\t\tif (matches.length === 0 || matches.every((element) => !visible(element))) {\n\t\t\tresolve(true)\n\t\t\treturn true\n\t\t}\n\t\tif (performance.now() >= deadline) {\n\t\t\tresolve(false)\n\t\t\treturn true\n\t\t}\n\t\treturn false\n\t}\n\tif (check()) return\n\tconst timer = setInterval(() => {\n\t\tif (!check()) return\n\t\tclearInterval(timer)\n\t}, ${BROWSER_WAIT_POLL_INTERVAL_MS})\n})`\n}\n\n/**\n * Compiles the element-side actionability pass used before trusted input.\n *\n * @param options - Checks required for the action\n * @returns Async `Runtime.callFunctionOn` function declaration\n */\nexport function compileActionabilityFunction(options: BrowserActionabilityOptions): string {\n\treturn `async function() {\n\tif (!(this instanceof Element) || !this.isConnected) throw new Error('Element is detached')\n\tthis.scrollIntoView({ block: 'center', inline: 'center', behavior: 'instant' })\n\tconst visible = () => {\n\t\tconst style = getComputedStyle(this)\n\t\tconst rect = this.getBoundingClientRect()\n\t\treturn ${BROWSER_VISIBILITY_SOURCE}\n\t}\n\tif (${JSON.stringify(options.visible === true)} && !visible()) throw new Error('Element is not visible')\n\tif (${JSON.stringify(options.enabled === true)} && this.matches(':disabled')) throw new Error('Element is disabled')\n\tif (${JSON.stringify(options.editable === true)} && (this.matches('[readonly]') || (!this.isContentEditable && !('value' in this)))) throw new Error('Element is not editable')\n\tlet previous\n\tfor (let index = 0; index < ${BROWSER_STABLE_FRAME_COUNT}; index += 1) {\n\t\tawait new Promise((resolve) => requestAnimationFrame(resolve))\n\t\tconst rect = this.getBoundingClientRect()\n\t\tconst current = [rect.x, rect.y, rect.width, rect.height]\n\t\tif (${JSON.stringify(options.stable === true)} && previous && current.some((value, part) => value !== previous[part])) {\n\t\t\tindex = 0\n\t\t}\n\t\tprevious = current\n\t}\n\tif (${JSON.stringify(options.events === true)}) {\n\t\tconst rect = this.getBoundingClientRect()\n\t\tconst position = ${JSON.stringify(options.position)}\n\t\tconst x = rect.x + (position?.x ?? rect.width / 2)\n\t\tconst y = rect.y + (position?.y ?? rect.height / 2)\n\t\tconst target = this.ownerDocument.elementFromPoint(x, y)\n\t\tif (target !== this && !this.contains(target)) throw new Error('Element does not receive pointer events')\n\t}\n\treturn true\n}`\n}\n\n/**\n * Compiles an in-page wait for an attached selector.\n *\n * @param selector - CSS selector\n * @param strict - Whether more than one match is an error\n * @param timeout - Maximum wait in milliseconds\n * @returns Runtime expression resolving to whether the state was reached\n */\nexport function compileAttachedWaitExpression(\n\tselector: string,\n\tstrict: boolean,\n\ttimeout: number,\n): string {\n\treturn `new Promise((resolve, reject) => {\n\tconst selector = ${JSON.stringify(selector)}\n\tconst strict = ${JSON.stringify(strict)}\n\tconst check = () => {\n\t\tconst matches = document.querySelectorAll(selector)\n\t\tif (strict && matches.length > 1) {\n\t\t\treject(new Error('Strict selector matched ' + matches.length + ' elements: ' + selector))\n\t\t\treturn true\n\t\t}\n\t\tif (matches.length > 0) {\n\t\t\tresolve(true)\n\t\t\treturn true\n\t\t}\n\t\treturn false\n\t}\n\tif (check()) return\n\tconst observer = new MutationObserver(() => {\n\t\tif (!check()) return\n\t\tobserver.disconnect()\n\t\tclearTimeout(timer)\n\t})\n\tconst timer = setTimeout(() => {\n\t\tobserver.disconnect()\n\t\tresolve(false)\n\t}, ${timeout})\n\tobserver.observe(document, { childList: true, subtree: true, attributes: true })\n})`\n}\n\n/**\n * Compiles an in-page wait for a detached selector.\n *\n * @param selector - CSS selector\n * @param strict - Whether more than one match is an error\n * @param timeout - Maximum wait in milliseconds\n * @returns Runtime expression resolving to whether the state was reached\n */\nexport function compileDetachedWaitExpression(\n\tselector: string,\n\tstrict: boolean,\n\ttimeout: number,\n): string {\n\treturn `new Promise((resolve, reject) => {\n\tconst selector = ${JSON.stringify(selector)}\n\tconst strict = ${JSON.stringify(strict)}\n\tconst check = () => {\n\t\tconst matches = document.querySelectorAll(selector)\n\t\tif (strict && matches.length > 1) {\n\t\t\treject(new Error('Strict selector matched ' + matches.length + ' elements: ' + selector))\n\t\t\treturn true\n\t\t}\n\t\tif (matches.length === 0) {\n\t\t\tresolve(true)\n\t\t\treturn true\n\t\t}\n\t\treturn false\n\t}\n\tif (check()) return\n\tconst observer = new MutationObserver(() => {\n\t\tif (!check()) return\n\t\tobserver.disconnect()\n\t\tclearTimeout(timer)\n\t})\n\tconst timer = setTimeout(() => {\n\t\tobserver.disconnect()\n\t\tresolve(false)\n\t}, ${timeout})\n\tobserver.observe(document, { childList: true, subtree: true, attributes: true })\n})`\n}\n\n/**\n * Compiles an in-page wait for a visible selector.\n *\n * @param selector - CSS selector\n * @param strict - Whether more than one match is an error\n * @param timeout - Maximum wait in milliseconds\n * @returns Runtime expression resolving to whether the state was reached\n */\nexport function compileVisibleWaitExpression(\n\tselector: string,\n\tstrict: boolean,\n\ttimeout: number,\n): string {\n\treturn `new Promise((resolve, reject) => {\n\tconst selector = ${JSON.stringify(selector)}\n\tconst strict = ${JSON.stringify(strict)}\n\tconst visible = (element) => {\n\t\tconst style = getComputedStyle(element)\n\t\tconst rect = element.getBoundingClientRect()\n\t\treturn ${BROWSER_VISIBILITY_SOURCE}\n\t}\n\tconst check = () => {\n\t\tconst matches = document.querySelectorAll(selector)\n\t\tif (strict && matches.length > 1) {\n\t\t\treject(new Error('Strict selector matched ' + matches.length + ' elements: ' + selector))\n\t\t\treturn true\n\t\t}\n\t\tif (matches.length > 0 && visible(matches[0])) {\n\t\t\tresolve(true)\n\t\t\treturn true\n\t\t}\n\t\treturn false\n\t}\n\tif (check()) return\n\tconst observer = new MutationObserver(() => {\n\t\tif (!check()) return\n\t\tobserver.disconnect()\n\t\tclearTimeout(timer)\n\t})\n\tconst timer = setTimeout(() => {\n\t\tobserver.disconnect()\n\t\tresolve(false)\n\t}, ${timeout})\n\tobserver.observe(document, { childList: true, subtree: true, attributes: true })\n})`\n}\n\n/**\n * Compiles an in-page wait for a hidden selector.\n *\n * @param selector - CSS selector\n * @param strict - Whether more than one match is an error\n * @param timeout - Maximum wait in milliseconds\n * @returns Runtime expression resolving to whether the state was reached\n */\nexport function compileHiddenWaitExpression(\n\tselector: string,\n\tstrict: boolean,\n\ttimeout: number,\n): string {\n\treturn `new Promise((resolve, reject) => {\n\tconst selector = ${JSON.stringify(selector)}\n\tconst strict = ${JSON.stringify(strict)}\n\tconst visible = (element) => {\n\t\tconst style = getComputedStyle(element)\n\t\tconst rect = element.getBoundingClientRect()\n\t\treturn ${BROWSER_VISIBILITY_SOURCE}\n\t}\n\tconst check = () => {\n\t\tconst matches = document.querySelectorAll(selector)\n\t\tif (strict && matches.length > 1) {\n\t\t\treject(new Error('Strict selector matched ' + matches.length + ' elements: ' + selector))\n\t\t\treturn true\n\t\t}\n\t\tif (matches.length === 0 || Array.from(matches).every((element) => !visible(element))) {\n\t\t\tresolve(true)\n\t\t\treturn true\n\t\t}\n\t\treturn false\n\t}\n\tif (check()) return\n\tconst observer = new MutationObserver(() => {\n\t\tif (!check()) return\n\t\tobserver.disconnect()\n\t\tclearTimeout(timer)\n\t})\n\tconst timer = setTimeout(() => {\n\t\tobserver.disconnect()\n\t\tresolve(false)\n\t}, ${timeout})\n\tobserver.observe(document, { childList: true, subtree: true, attributes: true })\n})`\n}\n\n/**\n * Compiles a strict, visibility-checked click expression.\n *\n * @param selector - CSS selector\n * @param strict - Whether more than one match is an error\n * @returns Runtime expression\n */\nexport function compileClickExpression(selector: string, strict: boolean): string {\n\treturn `(() => {\n\tconst selector = ${JSON.stringify(selector)}\n\tconst matches = document.querySelectorAll(selector)\n\tif (${JSON.stringify(strict)} && matches.length !== 1) throw new Error('Strict selector matched ' + matches.length + ' elements: ' + selector)\n\tconst el = matches[0]\n\tif (!el) throw new Error('Element not found: ' + selector)\n\tconst style = getComputedStyle(el)\n\tconst rect = el.getBoundingClientRect()\n\tif (!(${BROWSER_VISIBILITY_SOURCE})) throw new Error('Element is not visible: ' + selector)\n\tif (el.matches(':disabled')) throw new Error('Element is disabled: ' + selector)\n\tel.scrollIntoView({ block: 'center', inline: 'center' })\n\tel.click()\n})()`\n}\n\n/**\n * Compiles a strict, editable fill expression.\n *\n * @param selector - CSS selector\n * @param value - Value to assign\n * @param strict - Whether more than one match is an error\n * @returns Runtime expression\n */\nexport function compileFillExpression(selector: string, value: string, strict: boolean): string {\n\treturn `(() => {\n\tconst selector = ${JSON.stringify(selector)}\n\tconst matches = document.querySelectorAll(selector)\n\tif (${JSON.stringify(strict)} && matches.length !== 1) throw new Error('Strict selector matched ' + matches.length + ' elements: ' + selector)\n\tconst el = matches[0]\n\tif (!el) throw new Error('Element not found: ' + selector)\n\tconst style = getComputedStyle(el)\n\tconst rect = el.getBoundingClientRect()\n\tif (!(${BROWSER_VISIBILITY_SOURCE})) throw new Error('Element is not visible: ' + selector)\n\tif (el.matches(':disabled') || el.matches('[readonly]')) throw new Error('Element is not editable: ' + selector)\n\tif (!el.isContentEditable && !('value' in el)) throw new Error('Element cannot be filled: ' + selector)\n\tel.focus()\n\tif (el.isContentEditable) {\n\t\tel.textContent = ${JSON.stringify(value)}\n\t} else {\n\t\tel.value = ${JSON.stringify(value)}\n\t}\n\tel.dispatchEvent(new InputEvent('input', { bubbles: true, inputType: 'insertText', data: ${JSON.stringify(value)} }))\n\tel.dispatchEvent(new Event('change', { bubbles: true }))\n})()`\n}\n\n/**\n * Compiles a strict select expression.\n *\n * @param selector - CSS selector\n * @param values - Option values to select\n * @param strict - Whether more than one match is an error\n * @returns Runtime expression\n */\nexport function compileSelectExpression(\n\tselector: string,\n\tvalues: readonly string[],\n\tstrict: boolean,\n): string {\n\treturn `(() => {\n\tconst selector = ${JSON.stringify(selector)}\n\tconst matches = document.querySelectorAll(selector)\n\tif (${JSON.stringify(strict)} && matches.length !== 1) throw new Error('Strict selector matched ' + matches.length + ' elements: ' + selector)\n\tconst el = matches[0]\n\tif (!el) throw new Error('Element not found: ' + selector)\n\tif (!(el instanceof HTMLSelectElement)) throw new Error('Element is not a select: ' + selector)\n\tif (el.disabled) throw new Error('Element is disabled: ' + selector)\n\tconst values = ${JSON.stringify([...values])}\n\tif (!el.multiple && values.length > 1) throw new Error('Single select cannot accept multiple values: ' + selector)\n\tconst available = new Set(Array.from(el.options, (option) => option.value))\n\tconst missing = values.filter((value) => !available.has(value))\n\tif (missing.length > 0) throw new Error('Select options not found: ' + missing.join(', '))\n\tfor (const opt of el.options) opt.selected = values.includes(opt.value)\n\tel.dispatchEvent(new Event('input', { bubbles: true }))\n\tel.dispatchEvent(new Event('change', { bubbles: true }))\n})()`\n}\n","import type { BrowserTransitionFunction, BrowserTransitionInterface } from './types.js'\n\n/**\n * Runs one asynchronous transition at a time, shared by every caller that joins it.\n *\n * @remarks\n * An entity with a lifecycle runs the same guard around every transition: take\n * the promise already in flight when one exists, otherwise start the work, hold\n * its promise, and release the field afterwards only when it is still this\n * run's. Holding that guard in one place keeps the identity check — the part a\n * hand-written copy drops — identical at every site. The entry guards stay with\n * each entity, because what makes a transition unnecessary is the entity's own\n * state.\n *\n * @example\n * ```ts\n * import { BrowserTransition } from '@orkestrel/browser'\n *\n * const starting = new BrowserTransition()\n * await starting.execute(() => transport.start())\n * const joined = starting.pending // the in-flight promise, or undefined\n * ```\n */\nexport class BrowserTransition<T = void> implements BrowserTransitionInterface<T> {\n\t#pending: Promise<T> | undefined\n\n\tget pending(): Promise<T> | undefined {\n\t\treturn this.#pending\n\t}\n\n\tasync execute(work: BrowserTransitionFunction<T>): Promise<T> {\n\t\tconst active = this.#pending\n\t\tif (active !== undefined) return await active\n\n\t\tconst started = work()\n\t\tthis.#pending = started\n\t\ttry {\n\t\t\treturn await started\n\t\t} finally {\n\t\t\tif (this.#pending === started) this.#pending = undefined\n\t\t}\n\t}\n}\n","import type {\n\tCDPClientEventMap,\n\tCDPClientInterface,\n\tCDPClientOptions,\n\tCDPHandler,\n\tCDPSendOptions,\n\tCDPTransportInterface,\n} from './types.js'\nimport type { EmitterErrorHandler, EmitterInterface } from '@orkestrel/emitter'\nimport { BrowserTransition } from './BrowserTransition.js'\nimport { BROWSER_DEFAULT_TIMEOUT_MS } from './constants.js'\nimport { CDPConnectionError, CDPError, CDPTimeoutError } from './errors.js'\nimport { Emitter } from '@orkestrel/emitter'\nimport { isInteger, isRecord, isString, parseJSON } from '@orkestrel/contract'\n\n// === CDPClient\n\n/**\n * Provides a lightweight Chrome DevTools Protocol client over a {@link CDPTransportInterface}.\n *\n * @remarks\n * Sends JSON-RPC messages over the injected transport and dispatches\n * responses and events. The transport owns the connection itself\n * (WebSocket, pipe, or any other duplex channel); this class owns only\n * the JSON-RPC framing and id/session correlation.\n *\n * Supports session-scoped event subscriptions: a subscription registered\n * without a session id receives the event whatever session carries it, and a\n * session-scoped subscription receives only its own session's events.\n *\n * @example\n * ```ts\n * import { CDPClient } from '@orkestrel/browser'\n *\n * const client = new CDPClient({ transport })\n * await client.connect()\n * const targets = await client.send('Target.getTargets')\n * await client.close()\n * ```\n */\nexport class CDPClient implements CDPClientInterface {\n\treadonly #emitter: Emitter<CDPClientEventMap>\n\treadonly #transport: CDPTransportInterface\n\t#messageId = 0\n\treadonly #pending: Map<\n\t\tnumber,\n\t\t{\n\t\t\tmethod: string\n\t\t\tresolve: (value: unknown) => void\n\t\t\treject: (reason: unknown) => void\n\t\t\ttimer: ReturnType<typeof setTimeout>\n\t\t}\n\t> = new Map()\n\treadonly #subscriptions: Map<string | undefined, Map<string, Set<CDPHandler>>> = new Map()\n\t#connected = false\n\t#active = false\n\t#wired = false\n\treadonly #timeout: number\n\treadonly #error: EmitterErrorHandler | undefined\n\treadonly #connecting: BrowserTransition = new BrowserTransition()\n\treadonly #closing: BrowserTransition = new BrowserTransition()\n\t#closeRequested = false\n\t// Set while this client is the one closing the transport, so the transport\n\t// `close` a teardown produces reports `close` rather than `drop`.\n\t#expected = false\n\n\tconstructor(options: CDPClientOptions) {\n\t\tthis.#transport = options.transport\n\t\tthis.#timeout = options.timeout ?? BROWSER_DEFAULT_TIMEOUT_MS\n\t\tthis.#error = options.error\n\t\tthis.#emitter = new Emitter({\n\t\t\t...(options.on !== undefined ? { on: options.on } : {}),\n\t\t\t...(options.error !== undefined ? { error: options.error } : {}),\n\t\t})\n\t}\n\n\tget emitter(): EmitterInterface<CDPClientEventMap> {\n\t\treturn this.#emitter\n\t}\n\n\tget connected(): boolean {\n\t\treturn this.#connected\n\t}\n\n\tasync connect(): Promise<void> {\n\t\tconst closing = this.#closing.pending\n\t\tif (closing !== undefined) await closing\n\t\tif (this.#connected) return\n\t\tconst active = this.#connecting.pending\n\t\tif (active !== undefined) return await active\n\n\t\tthis.#closeRequested = false\n\t\tthis.#expected = false\n\t\tawait this.#connecting.execute(() => this.#connect())\n\t}\n\n\t/**\n\t * Closes the transport and re-establishes a fresh connection.\n\t *\n\t * @remarks\n\t * Client-level subscriptions (`subscribe`/`unsubscribe` registrations)\n\t * survive `close()` and remain active after the reconnect — only pending\n\t * in-flight requests are rejected. This lets a caller reconnect a dropped\n\t * transport without re-registering every handler.\n\t */\n\tasync reconnect(): Promise<void> {\n\t\tawait this.close()\n\t\tawait this.connect()\n\t}\n\n\tasync send(\n\t\tmethod: string,\n\t\tparams?: Readonly<Record<string, unknown>>,\n\t\toptions?: CDPSendOptions,\n\t): Promise<unknown> {\n\t\tif (!this.#connected) {\n\t\t\tthrow new CDPConnectionError('CDP client is not connected', { method })\n\t\t}\n\n\t\tconst id = this.#nextId()\n\t\tconst message: Record<string, unknown> = { id, method }\n\n\t\tif (params !== undefined) {\n\t\t\tmessage['params'] = params\n\t\t}\n\t\tif (options?.session !== undefined) {\n\t\t\tmessage['sessionId'] = options.session\n\t\t}\n\n\t\tconst serialized = JSON.stringify(message)\n\t\tconst effectiveTimeout = options?.timeout ?? this.#timeout\n\n\t\treturn new Promise<unknown>((resolve, reject) => {\n\t\t\tconst timer = setTimeout(() => {\n\t\t\t\tthis.#pending.delete(id)\n\t\t\t\treject(\n\t\t\t\t\tnew CDPTimeoutError(`CDP request timed out: ${method}`, {\n\t\t\t\t\t\tmethod,\n\t\t\t\t\t\ttimeout: effectiveTimeout,\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t}, effectiveTimeout)\n\n\t\t\tthis.#pending.set(id, { method, resolve, reject, timer })\n\n\t\t\tthis.#transport.send(serialized).catch((thrown: unknown) => {\n\t\t\t\tthis.#pending.delete(id)\n\t\t\t\tclearTimeout(timer)\n\t\t\t\treject(thrown)\n\t\t\t})\n\t\t})\n\t}\n\n\tsubscribe(method: string, handler: CDPHandler, session?: string): void {\n\t\tlet methods = this.#subscriptions.get(session)\n\t\tif (methods === undefined) {\n\t\t\tmethods = new Map()\n\t\t\tthis.#subscriptions.set(session, methods)\n\t\t}\n\t\tlet handlers = methods.get(method)\n\t\tif (handlers === undefined) {\n\t\t\thandlers = new Set()\n\t\t\tmethods.set(method, handlers)\n\t\t}\n\t\thandlers.add(handler)\n\t}\n\n\tunsubscribe(method: string, handler: CDPHandler, session?: string): void {\n\t\tconst methods = this.#subscriptions.get(session)\n\t\tif (methods === undefined) return\n\t\tconst handlers = methods.get(method)\n\t\tif (handlers !== undefined) {\n\t\t\thandlers.delete(handler)\n\t\t\tif (handlers.size === 0) methods.delete(method)\n\t\t}\n\t\tif (methods.size === 0) this.#subscriptions.delete(session)\n\t}\n\n\t/**\n\t * Closes the transport and rejects all pending requests.\n\t *\n\t * @remarks\n\t * Subscriptions registered through `subscribe()` are client-level\n\t * registrations, not connection-level state — they survive `close()`\n\t * (and a subsequent `reconnect()`/`connect()`) and keep firing once the\n\t * transport is active again. Only pending requests are rejected here.\n\t * If `close()` is called while `connect()` is still awaiting\n\t * `transport.start()`, the in-flight connect is rejected and the\n\t * transport is closed deterministically once `start()` resolves.\n\t */\n\tasync close(): Promise<void> {\n\t\tawait this.#closing.execute(() => this.#close())\n\t}\n\n\t// === Private helpers\n\n\tasync #connect(): Promise<void> {\n\t\tif (!this.#wired) {\n\t\t\tthis.#transport.emitter.on('message', (data) => this.#onMessage(data))\n\t\t\tthis.#transport.emitter.on('close', () => this.#onClose())\n\t\t\tthis.#transport.emitter.on('error', (error) => this.#onError(error))\n\t\t\tthis.#wired = true\n\t\t}\n\n\t\tawait this.#transport.start()\n\t\tthis.#active = true\n\n\t\tif (this.#closeRequested) {\n\t\t\tthis.#closeRequested = false\n\t\t\tthis.#expected = true\n\t\t\ttry {\n\t\t\t\tawait this.#transport.close()\n\t\t\t} finally {\n\t\t\t\tthis.#active = false\n\t\t\t}\n\t\t\tthis.#emitter.emit('close')\n\t\t\tthrow new CDPConnectionError('CDP client was closed while connecting', {\n\t\t\t\tmethod: 'connect',\n\t\t\t})\n\t\t}\n\n\t\tthis.#connected = true\n\t\tthis.#emitter.emit('connect')\n\t}\n\n\tasync #close(): Promise<void> {\n\t\tconst connecting = this.#connecting.pending\n\t\tif (connecting !== undefined) {\n\t\t\tthis.#closeRequested = true\n\t\t\tawait connecting.catch(() => undefined)\n\t\t\t// The in-flight attempt may have already flipped #connected to\n\t\t\t// true before observing #closeRequested (race between the\n\t\t\t// attempt's final steps and #closeRequested being set here).\n\t\t\t// Fall through to the normal connected-close path instead of\n\t\t\t// returning early, or the close would be silently lost.\n\t\t}\n\n\t\tif (!this.#connected && !this.#active) return\n\n\t\tthis.#connected = false\n\n\t\t// Reject all pending requests\n\t\tfor (const [id, entry] of this.#pending) {\n\t\t\tclearTimeout(entry.timer)\n\t\t\tentry.reject(new CDPConnectionError('CDP connection closed', { method: entry.method }))\n\t\t\tthis.#pending.delete(id)\n\t\t}\n\n\t\tthis.#expected = true\n\t\ttry {\n\t\t\tawait this.#transport.close()\n\t\t} finally {\n\t\t\tthis.#active = false\n\t\t}\n\t\tthis.#emitter.emit('close')\n\t}\n\n\t#nextId(): number {\n\t\tthis.#messageId += 1\n\t\treturn this.#messageId\n\t}\n\n\t#onClose(): void {\n\t\tthis.#connected = false\n\t\tthis.#active = false\n\n\t\t// Reject all pending requests\n\t\tfor (const [id, entry] of this.#pending) {\n\t\t\tclearTimeout(entry.timer)\n\t\t\tentry.reject(new CDPConnectionError('CDP connection closed', { method: entry.method }))\n\t\t\tthis.#pending.delete(id)\n\t\t}\n\t\tif (!this.#expected) this.#emitter.emit('drop')\n\t}\n\n\t#onError(error: unknown): void {\n\t\tthis.#connected = false\n\t\tfor (const [id, entry] of this.#pending) {\n\t\t\tclearTimeout(entry.timer)\n\t\t\tentry.reject(\n\t\t\t\tnew CDPConnectionError(`CDP connection failed: ${String(error)}`, {\n\t\t\t\t\tmethod: entry.method,\n\t\t\t\t\terror,\n\t\t\t\t}),\n\t\t\t)\n\t\t\tthis.#pending.delete(id)\n\t\t}\n\t\tthis.#emitter.emit('error', error)\n\t}\n\n\t#onMessage(data: string): void {\n\t\tconst parsed = parseJSON(data)\n\t\tif (!isRecord(parsed)) return\n\n\t\t// Response to a pending request\n\t\tif (isInteger(parsed['id'])) {\n\t\t\tconst id = parsed['id']\n\t\t\tconst entry = this.#pending.get(id)\n\t\t\tif (entry !== undefined) {\n\t\t\t\tthis.#pending.delete(id)\n\t\t\t\tclearTimeout(entry.timer)\n\n\t\t\t\tconst errorValue = parsed['error']\n\t\t\t\tif (isRecord(errorValue)) {\n\t\t\t\t\tconst message = isString(errorValue['message']) ? errorValue['message'] : 'CDP error'\n\t\t\t\t\tconst context: Record<string, unknown> = { method: entry.method }\n\t\t\t\t\tif ('code' in errorValue) context['code'] = errorValue['code']\n\t\t\t\t\tcontext['message'] = message\n\t\t\t\t\tif ('data' in errorValue) context['data'] = errorValue['data']\n\t\t\t\t\tentry.reject(new CDPError(message, context))\n\t\t\t\t} else {\n\t\t\t\t\tentry.resolve('result' in parsed ? parsed['result'] : undefined)\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn\n\t\t}\n\n\t\t// CDP event\n\t\tif (isString(parsed['method'])) {\n\t\t\tconst method = parsed['method']\n\t\t\tconst rawParams = parsed['params']\n\t\t\tconst params: Readonly<Record<string, unknown>> = isRecord(rawParams)\n\t\t\t\t? rawParams\n\t\t\t\t: Object.freeze({})\n\n\t\t\tconst global = this.#subscriptions.get(undefined)?.get(method)\n\t\t\tif (global !== undefined) this.#dispatch(global, method, params)\n\n\t\t\tconst session = parsed['sessionId']\n\t\t\tif (isString(session)) {\n\t\t\t\tconst scoped = this.#subscriptions.get(session)?.get(method)\n\t\t\t\tif (scoped !== undefined) this.#dispatch(scoped, method, params)\n\t\t\t}\n\t\t}\n\t}\n\n\t#dispatch(\n\t\thandlers: ReadonlySet<CDPHandler>,\n\t\tmethod: string,\n\t\tparams: Readonly<Record<string, unknown>>,\n\t): void {\n\t\tfor (const handler of [...handlers]) {\n\t\t\ttry {\n\t\t\t\thandler(params)\n\t\t\t} catch (thrown) {\n\t\t\t\t// One observer must not prevent sibling observers from receiving the\n\t\t\t\t// event, so the throw is reported rather than propagated.\n\t\t\t\tthis.#error?.(thrown, method)\n\t\t\t}\n\t\t}\n\t}\n}\n","import type {\n\tBrowserAccessibilityInterface,\n\tBrowserAccessibilityOptions,\n\tBrowserAccessibilitySnapshot,\n\tBrowserFrameInterface,\n} from './types.js'\nimport { readBrowserAccessibility, validateBrowserAccessibilityOptions } from './helpers.js'\n\n/**\n * Captures Chromium Accessibility-domain snapshots for one page.\n *\n * @example\n * ```ts\n * import { BrowserAccessibility } from '@orkestrel/browser'\n *\n * const accessibility = new BrowserAccessibility(page)\n * const tree = await accessibility.snapshot({ depth: 3 }) // { roots, nodes }\n * ```\n */\nexport class BrowserAccessibility implements BrowserAccessibilityInterface {\n\treadonly #frame: BrowserFrameInterface\n\n\tconstructor(frame: BrowserFrameInterface) {\n\t\tthis.#frame = frame\n\t}\n\n\tasync snapshot(options?: BrowserAccessibilityOptions): Promise<BrowserAccessibilitySnapshot> {\n\t\tvalidateBrowserAccessibilityOptions(options)\n\t\tawait this.#frame.send('Accessibility.enable')\n\t\ttry {\n\t\t\tconst result =\n\t\t\t\toptions?.root === undefined\n\t\t\t\t\t? await this.#frame.send('Accessibility.getFullAXTree', {\n\t\t\t\t\t\t\tdepth: options?.depth,\n\t\t\t\t\t\t\tframeId: this.#frame.id,\n\t\t\t\t\t\t})\n\t\t\t\t\t: await this.#frame.send('Accessibility.getPartialAXTree', {\n\t\t\t\t\t\t\tbackendNodeId: options.root,\n\t\t\t\t\t\t\tfetchRelatives: true,\n\t\t\t\t\t\t})\n\t\t\treturn readBrowserAccessibility(result)\n\t\t} finally {\n\t\t\tawait this.#frame.send('Accessibility.disable').catch(() => undefined)\n\t\t}\n\t}\n}\n","import type { BrowserClockInterface, BrowserFrameInterface } from './types.js'\nimport { BROWSER_DEFAULT_TIMEOUT_MS } from './constants.js'\nimport { BrowserError } from './errors.js'\nimport { settleBrowserTeardown } from './helpers.js'\nimport { isFiniteNumber } from '@orkestrel/contract'\n\n/**\n * Controls the Chromium virtual-time budget for deterministic page timers.\n *\n * @example\n * ```ts\n * import { BrowserClock } from '@orkestrel/browser'\n *\n * const clock = new BrowserClock(page)\n * await clock.install(Date.UTC(2026, 0, 1))\n * await clock.advance(5_000)\n * await clock.uninstall()\n * ```\n */\nexport class BrowserClock implements BrowserClockInterface {\n\treadonly #frame: BrowserFrameInterface\n\t#installed = false\n\t#advancing = false\n\t#budgetResolve: (() => void) | undefined\n\treadonly #budgetHandler = this.#handleBudget.bind(this)\n\n\tconstructor(frame: BrowserFrameInterface) {\n\t\tthis.#frame = frame\n\t}\n\n\tget installed(): boolean {\n\t\treturn this.#installed\n\t}\n\n\tasync install(time = Date.now()): Promise<void> {\n\t\tif (this.#installed) throw new BrowserError('Browser clock is already installed')\n\t\tif (!isFiniteNumber(time) || time < 0) {\n\t\t\tthrow new BrowserError('Browser clock time must be a non-negative finite epoch', undefined, {\n\t\t\t\ttime,\n\t\t\t})\n\t\t}\n\t\tawait this.#frame.send('Emulation.setVirtualTimePolicy', {\n\t\t\tpolicy: 'pause',\n\t\t\tinitialVirtualTime: time / 1000,\n\t\t})\n\t\tthis.#installed = true\n\t}\n\n\tasync pause(): Promise<void> {\n\t\tthis.#assert()\n\t\tthis.#idle()\n\t\tawait this.#frame.send('Emulation.setVirtualTimePolicy', { policy: 'pause' })\n\t}\n\n\tasync resume(): Promise<void> {\n\t\tthis.#assert()\n\t\tthis.#idle()\n\t\tawait this.#frame.send('Emulation.setVirtualTimePolicy', {\n\t\t\tpolicy: 'advance',\n\t\t\tmaxVirtualTimeTaskStarvationCount: 10_000,\n\t\t})\n\t}\n\n\tasync advance(ms: number): Promise<void> {\n\t\tthis.#assert()\n\t\tthis.#idle()\n\t\tif (!isFiniteNumber(ms) || ms < 0) {\n\t\t\tthrow new BrowserError('Browser clock advance must be non-negative and finite', undefined, {\n\t\t\t\tms,\n\t\t\t})\n\t\t}\n\t\tif (ms === 0) {\n\t\t\tawait this.pause()\n\t\t\treturn\n\t\t}\n\t\tconst deferred = Promise.withResolvers<void>()\n\t\tthis.#advancing = true\n\t\tthis.#budgetResolve = deferred.resolve\n\t\ttry {\n\t\t\tawait this.#frame.subscribe('Emulation.virtualTimeBudgetExpired', this.#budgetHandler)\n\t\t} catch (error) {\n\t\t\tthis.#budgetResolve = undefined\n\t\t\tthis.#advancing = false\n\t\t\tthrow error\n\t\t}\n\t\tconst timer = setTimeout(() => {\n\t\t\tdeferred.reject(new BrowserError('Browser virtual-time budget timed out'))\n\t\t}, BROWSER_DEFAULT_TIMEOUT_MS)\n\t\tlet failure: unknown\n\t\ttry {\n\t\t\tawait this.#frame.send('Emulation.setVirtualTimePolicy', {\n\t\t\t\tpolicy: 'advance',\n\t\t\t\tbudget: ms,\n\t\t\t\tmaxVirtualTimeTaskStarvationCount: 10_000,\n\t\t\t})\n\t\t\tawait deferred.promise\n\t\t} catch (error) {\n\t\t\tfailure = error\n\t\t} finally {\n\t\t\tclearTimeout(timer)\n\t\t\tthis.#budgetResolve = undefined\n\t\t\tconst settled = await settleBrowserTeardown(\n\t\t\t\t() => this.#frame.unsubscribe('Emulation.virtualTimeBudgetExpired', this.#budgetHandler),\n\t\t\t\t() => this.#frame.send('Emulation.setVirtualTimePolicy', { policy: 'pause' }),\n\t\t\t)\n\t\t\tfailure ??= settled\n\t\t\tthis.#advancing = false\n\t\t}\n\t\tif (failure !== undefined) throw failure\n\t}\n\n\tasync uninstall(): Promise<void> {\n\t\tif (!this.#installed) return\n\t\tthis.#idle()\n\t\tawait this.#frame.send('Emulation.setVirtualTimePolicy', {\n\t\t\tpolicy: 'advance',\n\t\t\tmaxVirtualTimeTaskStarvationCount: 10_000,\n\t\t})\n\t\tthis.#installed = false\n\t}\n\n\t#assert(): void {\n\t\tif (!this.#installed) throw new BrowserError('Browser clock is not installed')\n\t}\n\n\t#idle(): void {\n\t\tif (this.#advancing) throw new BrowserError('Browser clock advance is already active')\n\t}\n\n\t#handleBudget(): void {\n\t\tthis.#budgetResolve?.()\n\t}\n}\n","import type {\n\tBrowserCoverageInterface,\n\tBrowserCoverageOptions,\n\tBrowserCoverageResult,\n\tBrowserFrameInterface,\n} from './types.js'\nimport {\n\treadBrowserScriptCoverage,\n\treadBrowserStyleCoverage,\n\tsettleBrowserTeardown,\n} from './helpers.js'\nimport { BrowserError } from './errors.js'\n\n/**\n * Collects JavaScript precise coverage and CSS rule usage for one page target.\n *\n * @example\n * ```ts\n * import { BrowserCoverage } from '@orkestrel/browser'\n *\n * const coverage = new BrowserCoverage(page)\n * await coverage.start({ javascript: true, css: true })\n * const usage = await coverage.stop() // { scripts, styles }\n * ```\n */\nexport class BrowserCoverage implements BrowserCoverageInterface {\n\treadonly #frame: BrowserFrameInterface\n\t#active = false\n\t#options: BrowserCoverageOptions | undefined\n\n\tconstructor(frame: BrowserFrameInterface) {\n\t\tthis.#frame = frame\n\t}\n\n\tget active(): boolean {\n\t\treturn this.#active\n\t}\n\n\tasync start(options?: BrowserCoverageOptions): Promise<void> {\n\t\tif (this.#active) throw new BrowserError('Browser coverage is already active')\n\t\tconst javascript = options?.javascript ?? true\n\t\tconst css = options?.css ?? true\n\t\tif (!javascript && !css) {\n\t\t\tthrow new BrowserError('Browser coverage requires JavaScript, CSS, or both')\n\t\t}\n\t\tlet profiler = false\n\t\tlet precise = false\n\t\tlet dom = false\n\t\tlet styles = false\n\t\tlet rules = false\n\t\ttry {\n\t\t\tif (javascript) {\n\t\t\t\tawait this.#frame.send('Profiler.enable')\n\t\t\t\tprofiler = true\n\t\t\t\tawait this.#frame.send('Profiler.startPreciseCoverage', {\n\t\t\t\t\tcallCount: true,\n\t\t\t\t\tdetailed: options?.detailed ?? true,\n\t\t\t\t\tallowTriggeredUpdates: false,\n\t\t\t\t})\n\t\t\t\tprecise = true\n\t\t\t}\n\t\t\tif (css) {\n\t\t\t\tawait this.#frame.send('DOM.enable')\n\t\t\t\tdom = true\n\t\t\t\tawait this.#frame.send('CSS.enable')\n\t\t\t\tstyles = true\n\t\t\t\tawait this.#frame.send('CSS.startRuleUsageTracking')\n\t\t\t\trules = true\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tif (rules) {\n\t\t\t\tawait this.#frame.send('CSS.stopRuleUsageTracking').catch(() => undefined)\n\t\t\t}\n\t\t\tif (styles) await this.#frame.send('CSS.disable').catch(() => undefined)\n\t\t\tif (dom) await this.#frame.send('DOM.disable').catch(() => undefined)\n\t\t\tif (precise) {\n\t\t\t\tawait this.#frame.send('Profiler.stopPreciseCoverage').catch(() => undefined)\n\t\t\t}\n\t\t\tif (profiler) await this.#frame.send('Profiler.disable').catch(() => undefined)\n\t\t\tthrow error\n\t\t}\n\t\tthis.#options = options\n\t\tthis.#active = true\n\t}\n\n\tasync stop(): Promise<BrowserCoverageResult> {\n\t\tif (!this.#active) throw new BrowserError('Browser coverage is not active')\n\t\tthis.#active = false\n\t\tconst javascript = this.#options?.javascript ?? true\n\t\tconst css = this.#options?.css ?? true\n\t\tlet scripts: BrowserCoverageResult['scripts'] = []\n\t\tlet styles: BrowserCoverageResult['styles'] = []\n\t\tconst failure = await settleBrowserTeardown(\n\t\t\tasync () => {\n\t\t\t\tif (javascript) scripts = await this.#stopJavaScript()\n\t\t\t},\n\t\t\tasync () => {\n\t\t\t\tif (css) styles = await this.#stopCSS()\n\t\t\t},\n\t\t)\n\t\tthis.#options = undefined\n\t\tif (failure !== undefined) throw failure\n\t\treturn { scripts, styles }\n\t}\n\n\tasync destroy(): Promise<void> {\n\t\tif (!this.#active) return\n\t\tawait this.stop().catch(() => undefined)\n\t}\n\n\tasync #stopJavaScript(): Promise<BrowserCoverageResult['scripts']> {\n\t\tlet result: unknown\n\t\tconst failure = await settleBrowserTeardown(\n\t\t\tasync () => {\n\t\t\t\tresult = await this.#frame.send('Profiler.takePreciseCoverage')\n\t\t\t},\n\t\t\t() => this.#frame.send('Profiler.stopPreciseCoverage'),\n\t\t\t() => this.#frame.send('Profiler.disable'),\n\t\t)\n\t\tif (failure !== undefined) throw failure\n\t\treturn readBrowserScriptCoverage(result)\n\t}\n\n\tasync #stopCSS(): Promise<BrowserCoverageResult['styles']> {\n\t\tlet result: unknown\n\t\tconst failure = await settleBrowserTeardown(\n\t\t\tasync () => {\n\t\t\t\tresult = await this.#frame.send('CSS.stopRuleUsageTracking')\n\t\t\t},\n\t\t\t() => this.#frame.send('CSS.disable'),\n\t\t\t() => this.#frame.send('DOM.disable'),\n\t\t)\n\t\tif (failure !== undefined) throw failure\n\t\treturn readBrowserStyleCoverage(result)\n\t}\n}\n","import type {\n\tBrowserCookie,\n\tBrowserCookieFilter,\n\tBrowserCookieInput,\n\tBrowserCookieManagerInterface,\n\tCDPClientInterface,\n} from './types.js'\nimport { cookieToProtocol, matchesBrowserCookieURL, readBrowserCookies } from './helpers.js'\nimport { isRecord } from '@orkestrel/contract'\nimport { BrowserError } from './errors.js'\n\n/**\n * Performs cookie operations isolated to one browser context.\n *\n * @example\n * ```ts\n * import { BrowserCookieManager } from '@orkestrel/browser'\n *\n * const cookies = new BrowserCookieManager(client)\n * await cookies.set([{ name: 'session', value: 'value', url: 'https://example.com/' }])\n * const current = await cookies.cookies(['https://example.com/'])\n * ```\n */\nexport class BrowserCookieManager implements BrowserCookieManagerInterface {\n\treadonly #client: CDPClientInterface\n\treadonly #context: string | undefined\n\n\tconstructor(client: CDPClientInterface, context?: string) {\n\t\tthis.#client = client\n\t\tthis.#context = context\n\t}\n\n\tasync cookies(urls?: readonly string[]): Promise<readonly BrowserCookie[]> {\n\t\tconst params: Record<string, unknown> = {}\n\t\tif (this.#context !== undefined) params['browserContextId'] = this.#context\n\t\tconst result = await this.#client.send('Storage.getCookies', params)\n\t\tconst cookies = readBrowserCookies(result)\n\t\tif (urls === undefined || urls.length === 0) return cookies\n\n\t\treturn cookies.filter((cookie) => urls.some((value) => matchesBrowserCookieURL(cookie, value)))\n\t}\n\n\tasync set(cookies: readonly BrowserCookieInput[]): Promise<void> {\n\t\tif (cookies.length === 0) return\n\t\tconst params: Record<string, unknown> = {\n\t\t\tcookies: cookies.map(cookieToProtocol),\n\t\t}\n\t\tif (this.#context !== undefined) params['browserContextId'] = this.#context\n\t\tawait this.#client.send('Storage.setCookies', params)\n\t}\n\n\tasync clear(filter?: BrowserCookieFilter): Promise<void> {\n\t\tconst params: Record<string, unknown> = {}\n\t\tif (this.#context !== undefined) params['browserContextId'] = this.#context\n\t\tif (filter === undefined) {\n\t\t\tawait this.#client.send('Storage.clearCookies', params)\n\t\t\treturn\n\t\t}\n\n\t\tconst retained = (await this.cookies()).filter((cookie) => {\n\t\t\tif (filter.name !== undefined && cookie.name !== filter.name) return true\n\t\t\tif (filter.domain !== undefined && cookie.domain !== filter.domain) return true\n\t\t\tif (filter.path !== undefined && cookie.path !== filter.path) return true\n\t\t\treturn false\n\t\t})\n\t\tawait this.#client.send('Storage.clearCookies', params)\n\t\tif (retained.length === 0) return\n\t\tconst cookies = retained.map((cookie) =>\n\t\t\tcookieToProtocol({\n\t\t\t\tname: cookie.name,\n\t\t\t\tvalue: cookie.value,\n\t\t\t\tdomain: cookie.domain,\n\t\t\t\tpath: cookie.path,\n\t\t\t\texpires: cookie.expires,\n\t\t\t\thttp: cookie.http,\n\t\t\t\tsecure: cookie.secure,\n\t\t\t\t...(cookie.site !== undefined ? { site: cookie.site } : {}),\n\t\t\t\t...(cookie.partition !== undefined ? { partition: cookie.partition } : {}),\n\t\t\t}),\n\t\t)\n\t\tconst restore: Record<string, unknown> = { cookies }\n\t\tif (this.#context !== undefined) restore['browserContextId'] = this.#context\n\t\tconst result = await this.#client.send('Storage.setCookies', restore)\n\t\tif (result !== undefined && !isRecord(result)) {\n\t\t\tthrow new BrowserError('Browser cookie restore returned a malformed result')\n\t\t}\n\t}\n}\n","import type {\n\tBrowserEmulationManagerInterface,\n\tBrowserEmulationOptions,\n\tBrowserPageInterface,\n\tBrowserPagesFunction,\n} from './types.js'\nimport { mediaToFeatures, validateBrowserEmulationOptions } from './helpers.js'\n\n/**\n * Applies rendering, identity, location, and network emulation for context pages.\n *\n * @example\n * ```ts\n * import { BrowserEmulationManager } from '@orkestrel/browser'\n *\n * const emulation = new BrowserEmulationManager(() => context.pages())\n * await emulation.apply({ locale: 'en-US', media: { scheme: 'dark' } })\n * await emulation.clear()\n * ```\n */\nexport class BrowserEmulationManager implements BrowserEmulationManagerInterface {\n\treadonly #pages: BrowserPagesFunction\n\t#options: BrowserEmulationOptions | undefined\n\n\tconstructor(pages: BrowserPagesFunction, options?: BrowserEmulationOptions) {\n\t\tif (options !== undefined) validateBrowserEmulationOptions(options)\n\t\tthis.#pages = pages\n\t\tthis.#options = options\n\t}\n\n\tasync apply(options: BrowserEmulationOptions): Promise<void> {\n\t\tvalidateBrowserEmulationOptions(options)\n\t\tconst previous = this.#options\n\t\tconst changed: BrowserPageInterface[] = []\n\t\ttry {\n\t\t\tfor (const page of this.#pages()) {\n\t\t\t\tchanged.push(page)\n\t\t\t\tif (previous !== undefined) await this.#clearPage(page, previous)\n\t\t\t\tawait this.#configurePage(page, options)\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tfor (const page of changed.reverse()) {\n\t\t\t\tawait this.#clearPage(page, options).catch(() => undefined)\n\t\t\t\tif (previous !== undefined) {\n\t\t\t\t\tawait this.#configurePage(page, previous).catch(() => undefined)\n\t\t\t\t}\n\t\t\t}\n\t\t\tthrow error\n\t\t}\n\t\tthis.#options = options\n\t}\n\n\tasync clear(): Promise<void> {\n\t\tconst previous = this.#options\n\t\tif (previous === undefined) return\n\t\tconst changed: BrowserPageInterface[] = []\n\t\ttry {\n\t\t\tfor (const page of this.#pages()) {\n\t\t\t\tchanged.push(page)\n\t\t\t\tawait this.#clearPage(page, previous)\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tfor (const page of changed.reverse()) {\n\t\t\t\tawait this.#clearPage(page, previous).catch(() => undefined)\n\t\t\t\tawait this.#configurePage(page, previous).catch(() => undefined)\n\t\t\t}\n\t\t\tthrow error\n\t\t}\n\t\tthis.#options = undefined\n\t}\n\n\tasync attach(page: BrowserPageInterface): Promise<void> {\n\t\tconst options = this.#options\n\t\tif (options === undefined) return\n\t\ttry {\n\t\t\tawait this.#configurePage(page, options)\n\t\t} catch (error) {\n\t\t\tawait this.#clearPage(page, options).catch(() => undefined)\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync #configurePage(\n\t\tpage: BrowserPageInterface,\n\t\toptions: BrowserEmulationOptions,\n\t): Promise<void> {\n\t\tif (options.viewport !== undefined) {\n\t\t\tawait page.send('Emulation.setDeviceMetricsOverride', {\n\t\t\t\twidth: options.viewport.width,\n\t\t\t\theight: options.viewport.height,\n\t\t\t\tdeviceScaleFactor: options.viewport.scale ?? 1,\n\t\t\t\tmobile: options.viewport.mobile ?? false,\n\t\t\t\tscreenOrientation:\n\t\t\t\t\toptions.viewport.landscape === undefined\n\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\ttype: options.viewport.landscape ? 'landscapePrimary' : 'portraitPrimary',\n\t\t\t\t\t\t\t\tangle: options.viewport.landscape ? 90 : 0,\n\t\t\t\t\t\t\t},\n\t\t\t})\n\t\t\tawait page.send('Emulation.setTouchEmulationEnabled', {\n\t\t\t\tenabled: options.viewport.touch ?? false,\n\t\t\t})\n\t\t}\n\t\tif (options.user !== undefined) {\n\t\t\tawait page.send('Emulation.setUserAgentOverride', {\n\t\t\t\tuserAgent: options.user.value,\n\t\t\t\tacceptLanguage: options.user.language,\n\t\t\t\tplatform: options.user.platform,\n\t\t\t})\n\t\t}\n\t\tif (options.locale !== undefined) {\n\t\t\tawait page.send('Emulation.setLocaleOverride', { locale: options.locale })\n\t\t}\n\t\tif (options.timezone !== undefined) {\n\t\t\tawait page.send('Emulation.setTimezoneOverride', { timezoneId: options.timezone })\n\t\t}\n\t\tif (options.geolocation !== undefined) {\n\t\t\tawait page.send('Emulation.setGeolocationOverride', {\n\t\t\t\tlatitude: options.geolocation.latitude,\n\t\t\t\tlongitude: options.geolocation.longitude,\n\t\t\t\taccuracy: options.geolocation.accuracy,\n\t\t\t})\n\t\t}\n\t\tif (options.media !== undefined) {\n\t\t\tawait page.send('Emulation.setEmulatedMedia', {\n\t\t\t\tmedia: options.media.output ?? '',\n\t\t\t\tfeatures: mediaToFeatures(options.media),\n\t\t\t})\n\t\t}\n\t\tif (options.offline !== undefined) {\n\t\t\tawait page.network.offline(options.offline)\n\t\t}\n\t\tif (options.headers !== undefined) {\n\t\t\tawait page.network.headers(options.headers)\n\t\t}\n\t\tif (options.credentials !== undefined) {\n\t\t\tawait page.network.credentials(options.credentials)\n\t\t}\n\t}\n\n\tasync #clearPage(page: BrowserPageInterface, options: BrowserEmulationOptions): Promise<void> {\n\t\tif (options.viewport !== undefined) {\n\t\t\tawait page.send('Emulation.clearDeviceMetricsOverride')\n\t\t\tawait page.send('Emulation.setTouchEmulationEnabled', { enabled: false })\n\t\t}\n\t\tif (options.user !== undefined) {\n\t\t\tawait page.send('Emulation.setUserAgentOverride', { userAgent: '' })\n\t\t}\n\t\tif (options.locale !== undefined) {\n\t\t\tawait page.send('Emulation.setLocaleOverride', { locale: '' })\n\t\t}\n\t\tif (options.timezone !== undefined) {\n\t\t\tawait page.send('Emulation.setTimezoneOverride', { timezoneId: '' })\n\t\t}\n\t\tif (options.geolocation !== undefined) {\n\t\t\tawait page.send('Emulation.clearGeolocationOverride')\n\t\t}\n\t\tif (options.media !== undefined) {\n\t\t\tawait page.send('Emulation.setEmulatedMedia', { media: '', features: [] })\n\t\t}\n\t\tif (options.offline !== undefined) {\n\t\t\tawait page.network.offline(false)\n\t\t}\n\t\tif (options.headers !== undefined) {\n\t\t\tawait page.network.headers({})\n\t\t}\n\t\tif (options.credentials !== undefined) await page.network.credentials(undefined)\n\t}\n}\n","import type {\n\tBrowserCodegenAction,\n\tBrowserCodegenEventMap,\n\tBrowserCodegenInterface,\n\tBrowserCodegenOptions,\n\tBrowserCodegenScriptOptions,\n\tCDPClientInterface,\n} from './types.js'\nimport type { EmitterInterface } from '@orkestrel/emitter'\nimport { BROWSER_CODEGEN_BINDING_NAME, BROWSER_CODEGEN_SOURCE } from './constants.js'\nimport { BrowserTransition } from './BrowserTransition.js'\nimport { compileCodegenScript } from './compilers.js'\nimport { normalizeCodegenActions } from './helpers.js'\nimport { parseCodegenActionPayload, parseCodegenNavigateAction } from './parsers.js'\nimport { Emitter } from '@orkestrel/emitter'\n\n// === BrowserCodegen\n\n/**\n * Records page navigation and form interactions and compiles replayable scripts.\n *\n * @example\n * ```ts\n * import { BrowserCodegen } from '@orkestrel/browser'\n *\n * const codegen = new BrowserCodegen(client, 'session-1')\n * await codegen.start()\n * const actions = await codegen.stop()\n * const script = codegen.script({ language: 'typescript' })\n * ```\n */\nexport class BrowserCodegen implements BrowserCodegenInterface {\n\treadonly #client: CDPClientInterface\n\treadonly #session: string\n\t#actions: BrowserCodegenAction[] = []\n\t#started = false\n\t#destroyed = false\n\treadonly #starting: BrowserTransition = new BrowserTransition()\n\treadonly #stopping: BrowserTransition<readonly BrowserCodegenAction[]> = new BrowserTransition()\n\t#shutdown: Promise<void> | undefined\n\treadonly #emitter: Emitter<BrowserCodegenEventMap>\n\treadonly #bindingCalledHandler = this.#handleBindingCalled.bind(this)\n\treadonly #frameNavigatedHandler = this.#handleFrameNavigated.bind(this)\n\n\tconstructor(client: CDPClientInterface, session: string, options?: BrowserCodegenOptions) {\n\t\tthis.#client = client\n\t\tthis.#session = session\n\t\tthis.#emitter = new Emitter({\n\t\t\t...(options?.on !== undefined ? { on: options.on } : {}),\n\t\t\t...(options?.error !== undefined ? { error: options.error } : {}),\n\t\t})\n\t}\n\n\t// === Property accessors\n\n\tget emitter(): EmitterInterface<BrowserCodegenEventMap> {\n\t\treturn this.#emitter\n\t}\n\n\tget started(): boolean {\n\t\treturn this.#started\n\t}\n\n\t// === Public API\n\n\tasync start(): Promise<void> {\n\t\tif (this.#destroyed) return\n\t\tconst stopping = this.#stopping.pending\n\t\tif (stopping !== undefined) await stopping\n\t\tif (this.#destroyed) return\n\t\tif (this.#started) return\n\t\tconst active = this.#starting.pending\n\t\tif (active !== undefined) {\n\t\t\tawait active\n\t\t\treturn\n\t\t}\n\n\t\tawait this.#starting.execute(() => this.#start())\n\t}\n\n\tasync stop(): Promise<readonly BrowserCodegenAction[]> {\n\t\tawait this.#starting.pending?.catch(() => undefined)\n\t\tif (!this.#started) return this.actions()\n\t\tconst active = this.#stopping.pending\n\t\tif (active !== undefined) return await active\n\n\t\treturn await this.#stopping.execute(() => this.#stop())\n\t}\n\n\tactions(): readonly BrowserCodegenAction[] {\n\t\treturn normalizeCodegenActions(this.#actions)\n\t}\n\n\tscript(options?: BrowserCodegenScriptOptions): string {\n\t\treturn compileCodegenScript(this.actions(), options)\n\t}\n\n\tclear(): void {\n\t\tthis.#actions = []\n\t\tthis.#emitter.emit('clear')\n\t}\n\n\tdestroy(): Promise<void> {\n\t\tconst active = this.#shutdown\n\t\tif (active !== undefined) return active\n\t\tif (this.#destroyed) return Promise.resolve()\n\n\t\tthis.#destroyed = true\n\t\tconst shutdown = this.#destroy()\n\t\tthis.#shutdown = shutdown\n\t\treturn shutdown\n\t}\n\n\t// === Private helpers\n\n\tasync #start(): Promise<void> {\n\t\tthis.#client.subscribe('Runtime.bindingCalled', this.#bindingCalledHandler, this.#session)\n\t\tthis.#client.subscribe('Page.frameNavigated', this.#frameNavigatedHandler, this.#session)\n\n\t\ttry {\n\t\t\tawait this.#client.send('Runtime.enable', undefined, { session: this.#session })\n\t\t\tawait this.#client.send(\n\t\t\t\t'Runtime.addBinding',\n\t\t\t\t{ name: BROWSER_CODEGEN_BINDING_NAME },\n\t\t\t\t{ session: this.#session },\n\t\t\t)\n\t\t\tawait this.#client.send(\n\t\t\t\t'Page.addScriptToEvaluateOnNewDocument',\n\t\t\t\t{ source: BROWSER_CODEGEN_SOURCE },\n\t\t\t\t{ session: this.#session },\n\t\t\t)\n\t\t\tawait this.#client.send(\n\t\t\t\t'Runtime.evaluate',\n\t\t\t\t{ expression: BROWSER_CODEGEN_SOURCE, awaitPromise: true },\n\t\t\t\t{ session: this.#session },\n\t\t\t)\n\t\t\tif (this.#destroyed) {\n\t\t\t\tthis.#unsubscribe()\n\t\t\t\treturn\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthis.#unsubscribe()\n\t\t\tthrow error\n\t\t}\n\n\t\tthis.#started = true\n\t\tthis.#emitter.emit('start')\n\t}\n\n\tasync #stop(): Promise<readonly BrowserCodegenAction[]> {\n\t\tthis.#unsubscribe()\n\t\tthis.#started = false\n\n\t\tconst snapshot = this.actions()\n\t\tthis.#emitter.emit('stop', snapshot)\n\t\treturn snapshot\n\t}\n\n\tasync #destroy(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.stop()\n\t\t} catch {\n\t\t\t// Swallow teardown errors — the underlying session may already be gone\n\t\t}\n\n\t\tthis.#actions = []\n\t\tthis.#emitter.destroy()\n\t}\n\n\t#handleBindingCalled(params: Readonly<Record<string, unknown>>): void {\n\t\tif (params['name'] !== BROWSER_CODEGEN_BINDING_NAME) return\n\n\t\tconst action = parseCodegenActionPayload(params['payload'])\n\t\tif (action === undefined) return\n\n\t\tthis.#actions.push(action)\n\t\tthis.#emitter.emit('action', action)\n\t}\n\n\t#handleFrameNavigated(params: Readonly<Record<string, unknown>>): void {\n\t\tconst action = parseCodegenNavigateAction(params)\n\t\tif (action === undefined) return\n\n\t\tthis.#actions.push(action)\n\t\tthis.#emitter.emit('action', action)\n\t}\n\n\t#unsubscribe(): void {\n\t\tthis.#client.unsubscribe('Runtime.bindingCalled', this.#bindingCalledHandler, this.#session)\n\t\tthis.#client.unsubscribe('Page.frameNavigated', this.#frameNavigatedHandler, this.#session)\n\t}\n}\n","import type { BrowserFrameInterface, BrowserMetric, BrowserPerformanceInterface } from './types.js'\nimport { readBrowserMetrics } from './helpers.js'\n\n/**\n * Reads Performance-domain metrics for one frame.\n *\n * @example\n * ```ts\n * import { BrowserPerformance } from '@orkestrel/browser'\n *\n * const performance = new BrowserPerformance(page)\n * const metrics = await performance.metrics() // readonly BrowserMetric[]\n * ```\n */\nexport class BrowserPerformance implements BrowserPerformanceInterface {\n\treadonly #frame: BrowserFrameInterface\n\n\tconstructor(frame: BrowserFrameInterface) {\n\t\tthis.#frame = frame\n\t}\n\n\tasync metrics(): Promise<readonly BrowserMetric[]> {\n\t\tawait this.#frame.send('Performance.enable')\n\t\ttry {\n\t\t\treturn readBrowserMetrics(await this.#frame.send('Performance.getMetrics'))\n\t\t} finally {\n\t\t\tawait this.#frame.send('Performance.disable').catch(() => undefined)\n\t\t}\n\t}\n}\n","import type { BrowserFrameInterface, BrowserProfile, BrowserProfilerInterface } from './types.js'\nimport { readBrowserProfile } from './helpers.js'\nimport { BrowserError } from './errors.js'\nimport { isInteger } from '@orkestrel/contract'\n\n/**\n * Records sampled JavaScript CPU profiles over one frame's Profiler domain.\n *\n * @example\n * ```ts\n * import { BrowserProfiler } from '@orkestrel/browser'\n *\n * const profiler = new BrowserProfiler(page)\n * await profiler.start(100)\n * const profile = await profiler.stop() // { start, end, nodes, samples, deltas }\n * ```\n */\nexport class BrowserProfiler implements BrowserProfilerInterface {\n\treadonly #frame: BrowserFrameInterface\n\t#active = false\n\n\tconstructor(frame: BrowserFrameInterface) {\n\t\tthis.#frame = frame\n\t}\n\n\tget active(): boolean {\n\t\treturn this.#active\n\t}\n\n\tasync start(interval?: number): Promise<void> {\n\t\tif (this.#active) throw new BrowserError('Browser CPU profiling is already active')\n\t\tif (interval !== undefined) {\n\t\t\tif (!isInteger(interval) || interval <= 0) {\n\t\t\t\tthrow new BrowserError(\n\t\t\t\t\t'Browser CPU sampling interval must be a positive integer',\n\t\t\t\t\tundefined,\n\t\t\t\t\t{\n\t\t\t\t\t\tinterval,\n\t\t\t\t\t},\n\t\t\t\t)\n\t\t\t}\n\t\t\tawait this.#frame.send('Profiler.setSamplingInterval', { interval })\n\t\t}\n\t\tawait this.#frame.send('Profiler.enable')\n\t\ttry {\n\t\t\tawait this.#frame.send('Profiler.start')\n\t\t\tthis.#active = true\n\t\t} catch (error) {\n\t\t\tawait this.#frame.send('Profiler.disable').catch(() => undefined)\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync stop(): Promise<BrowserProfile> {\n\t\tif (!this.#active) throw new BrowserError('Browser CPU profiling is not active')\n\t\tthis.#active = false\n\t\tlet result: unknown\n\t\ttry {\n\t\t\tresult = await this.#frame.send('Profiler.stop')\n\t\t} finally {\n\t\t\tawait this.#frame.send('Profiler.disable').catch(() => undefined)\n\t\t}\n\t\treturn readBrowserProfile(result)\n\t}\n\n\tasync destroy(): Promise<void> {\n\t\tif (!this.#active) return\n\t\tawait this.stop().catch(() => undefined)\n\t}\n}\n","import type {\n\tBrowserFrameInterface,\n\tBrowserTracingInterface,\n\tBrowserTracingOptions,\n\tBrowserTracingResult,\n\tBrowserWriterInterface,\n} from './types.js'\nimport { BROWSER_DEFAULT_TIMEOUT_MS } from './constants.js'\nimport { concatBytes, readBrowserStreamChunk } from './helpers.js'\nimport { BrowserError } from './errors.js'\nimport { isString } from '@orkestrel/contract'\n\n/**\n * Captures Chromium traces streamed through the IO domain.\n *\n * @example\n * ```ts\n * import { BrowserTracing } from '@orkestrel/browser'\n *\n * const tracing = new BrowserTracing(page)\n * await tracing.start({ screenshots: true })\n * const trace = await tracing.stop() // { bytes, path }\n * ```\n */\nexport class BrowserTracing implements BrowserTracingInterface {\n\treadonly #frame: BrowserFrameInterface\n\treadonly #writer: BrowserWriterInterface | undefined\n\t#active = false\n\t#options: BrowserTracingOptions | undefined\n\t#completion: PromiseWithResolvers<string> | undefined\n\treadonly #completeHandler = this.#handleComplete.bind(this)\n\n\tconstructor(frame: BrowserFrameInterface, writer?: BrowserWriterInterface) {\n\t\tthis.#frame = frame\n\t\tthis.#writer = writer\n\t}\n\n\tget active(): boolean {\n\t\treturn this.#active\n\t}\n\n\tasync start(options?: BrowserTracingOptions): Promise<void> {\n\t\tif (this.#active) throw new BrowserError('Browser tracing is already active')\n\t\tconst categories = [...(options?.categories ?? ['devtools.timeline', 'v8.execute'])]\n\t\tif (options?.screenshots === true) {\n\t\t\tcategories.push('disabled-by-default-devtools.screenshot')\n\t\t}\n\t\tif (options?.sampling === true) {\n\t\t\tcategories.push('disabled-by-default-v8.cpu_profiler')\n\t\t}\n\t\tthis.#options = options\n\t\tthis.#completion = Promise.withResolvers<string>()\n\t\ttry {\n\t\t\tawait this.#frame.subscribe('Tracing.tracingComplete', this.#completeHandler)\n\t\t\tawait this.#frame.send('Tracing.start', {\n\t\t\t\ttransferMode: 'ReturnAsStream',\n\t\t\t\ttraceConfig: {\n\t\t\t\t\tincludedCategories: categories,\n\t\t\t\t},\n\t\t\t})\n\t\t\tthis.#active = true\n\t\t} catch (error) {\n\t\t\tawait this.#frame\n\t\t\t\t.unsubscribe('Tracing.tracingComplete', this.#completeHandler)\n\t\t\t\t.catch(() => undefined)\n\t\t\tthis.#options = undefined\n\t\t\tthis.#completion = undefined\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync stop(): Promise<BrowserTracingResult> {\n\t\tif (!this.#active || this.#completion === undefined) {\n\t\t\tthrow new BrowserError('Browser tracing is not active')\n\t\t}\n\t\tconst completion = this.#completion\n\t\tconst options = this.#options\n\t\tthis.#active = false\n\t\tlet stream: string | undefined\n\t\tconst chunks: Uint8Array[] = []\n\t\ttry {\n\t\t\tawait this.#frame.send('Tracing.end')\n\t\t\tstream = await this.#wait(completion.promise)\n\t\t\twhile (true) {\n\t\t\t\tconst chunk = readBrowserStreamChunk(await this.#frame.send('IO.read', { handle: stream }))\n\t\t\t\tchunks.push(chunk.bytes)\n\t\t\t\tif (chunk.eof) break\n\t\t\t}\n\t\t} finally {\n\t\t\tif (stream !== undefined) {\n\t\t\t\tawait this.#frame.send('IO.close', { handle: stream }).catch(() => undefined)\n\t\t\t}\n\t\t\tawait this.#frame\n\t\t\t\t.unsubscribe('Tracing.tracingComplete', this.#completeHandler)\n\t\t\t\t.catch(() => undefined)\n\t\t\tthis.#options = undefined\n\t\t\tthis.#completion = undefined\n\t\t}\n\t\tconst bytes = concatBytes(chunks)\n\t\tif (options?.path !== undefined) {\n\t\t\tif (this.#writer === undefined) {\n\t\t\t\tthrow new BrowserError('Browser trace path requires a configured writer')\n\t\t\t}\n\t\t\tawait this.#writer.write(options.path, bytes)\n\t\t}\n\t\treturn { bytes, path: options?.path }\n\t}\n\n\tasync destroy(): Promise<void> {\n\t\tif (!this.#active) return\n\t\tawait this.stop().catch(() => undefined)\n\t}\n\n\tasync #wait(promise: Promise<string>): Promise<string> {\n\t\tconst deferred = Promise.withResolvers<string>()\n\t\tconst timer = setTimeout(() => {\n\t\t\tdeferred.reject(new BrowserError('Browser trace completion timed out'))\n\t\t}, BROWSER_DEFAULT_TIMEOUT_MS)\n\t\tvoid promise.then(deferred.resolve, deferred.reject)\n\t\ttry {\n\t\t\treturn await deferred.promise\n\t\t} finally {\n\t\t\tclearTimeout(timer)\n\t\t}\n\t}\n\n\t#handleComplete(params: Readonly<Record<string, unknown>>): void {\n\t\tconst completion = this.#completion\n\t\tif (completion === undefined) return\n\t\tif (isString(params['stream'])) completion.resolve(params['stream'])\n\t\telse completion.reject(new BrowserError('Browser trace did not return an IO stream'))\n\t}\n}\n","import type {\n\tBrowserCoverageInterface,\n\tBrowserDiagnosticsInterface,\n\tBrowserFrameInterface,\n\tBrowserPerformanceInterface,\n\tBrowserProfilerInterface,\n\tBrowserTracingInterface,\n\tBrowserWriterInterface,\n} from './types.js'\nimport { BrowserCoverage } from './BrowserCoverage.js'\nimport { BrowserPerformance } from './BrowserPerformance.js'\nimport { BrowserProfiler } from './BrowserProfiler.js'\nimport { BrowserTracing } from './BrowserTracing.js'\n\n/**\n * Groups the diagnostic subentities beneath one page.\n *\n * @example\n * ```ts\n * import { BrowserDiagnostics } from '@orkestrel/browser'\n *\n * const diagnostics = new BrowserDiagnostics(page)\n * const metrics = await diagnostics.performance.metrics()\n * await diagnostics.destroy()\n * ```\n */\nexport class BrowserDiagnostics implements BrowserDiagnosticsInterface {\n\treadonly #tracing: BrowserTracing\n\treadonly #coverage: BrowserCoverage\n\treadonly #performance: BrowserPerformance\n\treadonly #profiler: BrowserProfiler\n\n\tconstructor(frame: BrowserFrameInterface, writer?: BrowserWriterInterface) {\n\t\tthis.#tracing = new BrowserTracing(frame, writer)\n\t\tthis.#coverage = new BrowserCoverage(frame)\n\t\tthis.#performance = new BrowserPerformance(frame)\n\t\tthis.#profiler = new BrowserProfiler(frame)\n\t}\n\n\tget tracing(): BrowserTracingInterface {\n\t\treturn this.#tracing\n\t}\n\n\tget coverage(): BrowserCoverageInterface {\n\t\treturn this.#coverage\n\t}\n\n\tget performance(): BrowserPerformanceInterface {\n\t\treturn this.#performance\n\t}\n\n\tget profiler(): BrowserProfilerInterface {\n\t\treturn this.#profiler\n\t}\n\n\tasync destroy(): Promise<void> {\n\t\tawait this.#tracing.destroy()\n\t\tawait this.#coverage.destroy()\n\t\tawait this.#profiler.destroy()\n\t}\n}\n","import type {\n\tBrowserDialogCategory,\n\tBrowserDialogInterface,\n\tBrowserFrameInterface,\n} from './types.js'\nimport { BrowserError } from './errors.js'\n\n/**\n * Represents one JavaScript dialog awaiting a user decision.\n */\nexport class BrowserDialog implements BrowserDialogInterface {\n\treadonly #frame: BrowserFrameInterface\n\treadonly #category: BrowserDialogCategory\n\treadonly #message: string\n\treadonly #default: string\n\t#handled = false\n\t#handling = false\n\n\tconstructor(\n\t\tframe: BrowserFrameInterface,\n\t\tcategory: BrowserDialogCategory,\n\t\tmessage: string,\n\t\tvalue: string,\n\t) {\n\t\tthis.#frame = frame\n\t\tthis.#category = category\n\t\tthis.#message = message\n\t\tthis.#default = value\n\t}\n\n\tget category(): BrowserDialogCategory {\n\t\treturn this.#category\n\t}\n\n\tget message(): string {\n\t\treturn this.#message\n\t}\n\n\tget default(): string {\n\t\treturn this.#default\n\t}\n\n\tasync accept(value?: string): Promise<void> {\n\t\tthis.#assert()\n\t\tthis.#handling = true\n\t\ttry {\n\t\t\tawait this.#frame.send('Page.handleJavaScriptDialog', {\n\t\t\t\taccept: true,\n\t\t\t\tpromptText: value,\n\t\t\t})\n\t\t\tthis.#handled = true\n\t\t} finally {\n\t\t\tthis.#handling = false\n\t\t}\n\t}\n\n\tasync dismiss(): Promise<void> {\n\t\tthis.#assert()\n\t\tthis.#handling = true\n\t\ttry {\n\t\t\tawait this.#frame.send('Page.handleJavaScriptDialog', { accept: false })\n\t\t\tthis.#handled = true\n\t\t} finally {\n\t\t\tthis.#handling = false\n\t\t}\n\t}\n\n\t#assert(): void {\n\t\tif (this.#handled || this.#handling) {\n\t\t\tthrow new BrowserError('Browser dialog is already handled')\n\t\t}\n\t}\n}\n","import type {\n\tBrowserDownloadEventMap,\n\tBrowserDownloadInterface,\n\tBrowserDownloadProgress,\n\tBrowserDownloadStatus,\n\tCDPClientInterface,\n} from './types.js'\nimport type { EmitterInterface } from '@orkestrel/emitter'\nimport { Emitter } from '@orkestrel/emitter'\n\n/**\n * Represents one Chromium download and its progress lifecycle.\n */\nexport class BrowserDownload implements BrowserDownloadInterface {\n\treadonly #client: CDPClientInterface\n\treadonly #context: string | undefined\n\treadonly #emitter: Emitter<BrowserDownloadEventMap>\n\treadonly #id: string\n\treadonly #url: string\n\treadonly #name: string\n\t#status: BrowserDownloadStatus = 'pending'\n\t#received = 0\n\t#total = 0\n\t#path: string | undefined\n\n\tconstructor(client: CDPClientInterface, id: string, url: string, name: string, context?: string) {\n\t\tthis.#client = client\n\t\tthis.#context = context\n\t\tthis.#id = id\n\t\tthis.#url = url\n\t\tthis.#name = name\n\t\tthis.#emitter = new Emitter()\n\t}\n\n\tget emitter(): EmitterInterface<BrowserDownloadEventMap> {\n\t\treturn this.#emitter\n\t}\n\n\tget id(): string {\n\t\treturn this.#id\n\t}\n\n\tget url(): string {\n\t\treturn this.#url\n\t}\n\n\tget name(): string {\n\t\treturn this.#name\n\t}\n\n\tget status(): BrowserDownloadStatus {\n\t\treturn this.#status\n\t}\n\n\tget received(): number {\n\t\treturn this.#received\n\t}\n\n\tget total(): number {\n\t\treturn this.#total\n\t}\n\n\tget path(): string | undefined {\n\t\treturn this.#path\n\t}\n\n\tasync cancel(): Promise<void> {\n\t\tif (this.#status !== 'pending') return\n\t\tconst params: Record<string, unknown> = { guid: this.#id }\n\t\tif (this.#context !== undefined) params['browserContextId'] = this.#context\n\t\tawait this.#client.send('Browser.cancelDownload', params)\n\t}\n\n\tupdate(progress: BrowserDownloadProgress): void {\n\t\tif (this.#status !== 'pending') return\n\t\tthis.#received = progress.received\n\t\tthis.#total = progress.total\n\t\tthis.#path = progress.path\n\t\tthis.#emitter.emit('progress', this.#received, this.#total)\n\t\tif (progress.status === 'complete') {\n\t\t\tthis.#status = 'complete'\n\t\t\tthis.#emitter.emit('complete', this.#path)\n\t\t\tthis.#emitter.destroy()\n\t\t} else if (progress.status === 'cancelled') {\n\t\t\tthis.#status = 'cancelled'\n\t\t\tthis.#emitter.emit('cancel')\n\t\t\tthis.#emitter.destroy()\n\t\t}\n\t}\n}\n","import type { BrowserHandleInterface, CDPClientInterface } from './types.js'\nimport { BrowserError } from './errors.js'\nimport { readEvaluationResult } from './helpers.js'\nimport { isRecord, isString } from '@orkestrel/contract'\n\n/**\n * Represents one retained remote object in a frame execution context.\n */\nexport class BrowserHandle implements BrowserHandleInterface {\n\treadonly #client: CDPClientInterface\n\treadonly #session: string\n\treadonly #id: string\n\t#disposed = false\n\n\tconstructor(client: CDPClientInterface, session: string, id: string) {\n\t\tthis.#client = client\n\t\tthis.#session = session\n\t\tthis.#id = id\n\t}\n\n\tget id(): string {\n\t\treturn this.#id\n\t}\n\n\tasync value(): Promise<unknown> {\n\t\treturn await this.call('function() { return this }')\n\t}\n\n\tasync call(declaration: string, args?: readonly unknown[]): Promise<unknown> {\n\t\tthis.#assert()\n\t\tconst result = await this.#client.send(\n\t\t\t'Runtime.callFunctionOn',\n\t\t\t{\n\t\t\t\tobjectId: this.#id,\n\t\t\t\tfunctionDeclaration: declaration,\n\t\t\t\targuments: args?.map((value) => ({ value })),\n\t\t\t\tawaitPromise: true,\n\t\t\t\treturnByValue: true,\n\t\t\t},\n\t\t\t{ session: this.#session },\n\t\t)\n\t\treturn readEvaluationResult(result)\n\t}\n\n\tasync property(name: string): Promise<BrowserHandleInterface | undefined> {\n\t\tthis.#assert()\n\t\tconst result = await this.#client.send(\n\t\t\t'Runtime.callFunctionOn',\n\t\t\t{\n\t\t\t\tobjectId: this.#id,\n\t\t\t\tfunctionDeclaration: 'function(name) { return this[name] }',\n\t\t\t\targuments: [{ value: name }],\n\t\t\t\tawaitPromise: true,\n\t\t\t\treturnByValue: false,\n\t\t\t},\n\t\t\t{ session: this.#session },\n\t\t)\n\t\tif (!isRecord(result) || !isRecord(result['result'])) return undefined\n\t\tconst id = result['result']['objectId']\n\t\treturn isString(id) ? new BrowserHandle(this.#client, this.#session, id) : undefined\n\t}\n\n\tasync properties(): Promise<Readonly<Record<string, unknown>>> {\n\t\tconst value = await this.call(\n\t\t\t'function() { const values = {}; for (const key of Object.keys(this)) values[key] = this[key]; return values }',\n\t\t)\n\t\tif (!isRecord(value)) {\n\t\t\tthrow new BrowserError('Browser handle properties did not resolve to an object')\n\t\t}\n\t\treturn value\n\t}\n\n\tasync dispose(): Promise<void> {\n\t\tif (this.#disposed) return\n\t\tthis.#disposed = true\n\t\tif (!this.#client.connected) return\n\t\ttry {\n\t\t\tawait this.#client.send(\n\t\t\t\t'Runtime.releaseObject',\n\t\t\t\t{ objectId: this.#id },\n\t\t\t\t{\n\t\t\t\t\tsession: this.#session,\n\t\t\t\t},\n\t\t\t)\n\t\t} catch {\n\t\t\t// The execution context may already be gone.\n\t\t}\n\t}\n\n\t#assert(): void {\n\t\tif (this.#disposed) throw new BrowserError('Browser handle is disposed')\n\t\tif (!this.#client.connected) throw new BrowserError('Browser handle is disconnected')\n\t}\n}\n","import type {\n\tBrowserFrameInterface,\n\tBrowserInputOptions,\n\tBrowserKeyboardInterface,\n} from './types.js'\nimport {\n\tcomputeBrowserModifiers,\n\textractBrowserChord,\n\tkeyToBrowserInput,\n\tvalidateBrowserInputOptions,\n} from './helpers.js'\n\n/**\n * Sends trusted keyboard input through Chromium's CDP Input domain.\n *\n * @example\n * ```ts\n * import { BrowserKeyboard } from '@orkestrel/browser'\n *\n * const keyboard = new BrowserKeyboard(page)\n * await keyboard.type('orkestrel', { delay: 10 })\n * await keyboard.press('Control+Enter')\n * ```\n */\nexport class BrowserKeyboard implements BrowserKeyboardInterface {\n\treadonly #frame: BrowserFrameInterface\n\treadonly #modifiers = new Set<string>()\n\n\tconstructor(frame: BrowserFrameInterface) {\n\t\tthis.#frame = frame\n\t}\n\n\tasync down(value: string): Promise<void> {\n\t\tconst key = keyToBrowserInput(value)\n\t\tconst modifier = ['Alt', 'Control', 'Meta', 'Shift'].includes(key.key)\n\t\tconst modifiers = computeBrowserModifiers([...this.#modifiers, ...(modifier ? [key.key] : [])])\n\t\tconst text = modifiers === 0 || modifiers === 8 ? key.text : undefined\n\t\tawait this.#frame.send('Input.dispatchKeyEvent', {\n\t\t\ttype: 'keyDown',\n\t\t\tkey: key.key,\n\t\t\tcode: key.code,\n\t\t\ttext,\n\t\t\tunmodifiedText: key.text,\n\t\t\twindowsVirtualKeyCode: key.number,\n\t\t\tnativeVirtualKeyCode: key.number,\n\t\t\tmodifiers,\n\t\t})\n\t\tif (modifier) this.#modifiers.add(key.key)\n\t}\n\n\tasync up(value: string): Promise<void> {\n\t\tconst key = keyToBrowserInput(value)\n\t\ttry {\n\t\t\tawait this.#frame.send('Input.dispatchKeyEvent', {\n\t\t\t\ttype: 'keyUp',\n\t\t\t\tkey: key.key,\n\t\t\t\tcode: key.code,\n\t\t\t\twindowsVirtualKeyCode: key.number,\n\t\t\t\tnativeVirtualKeyCode: key.number,\n\t\t\t\tmodifiers: computeBrowserModifiers([...this.#modifiers]),\n\t\t\t})\n\t\t} finally {\n\t\t\tthis.#modifiers.delete(key.key)\n\t\t}\n\t}\n\n\tasync press(value: string, options?: BrowserInputOptions): Promise<void> {\n\t\tvalidateBrowserInputOptions(options)\n\t\tconst chord = extractBrowserChord(value)\n\t\tfor (const modifier of chord.modifiers) await this.down(modifier)\n\t\ttry {\n\t\t\tawait this.down(chord.key)\n\t\t\tif (options?.delay !== undefined && options.delay > 0) {\n\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, options.delay))\n\t\t\t}\n\t\t\tawait this.up(chord.key)\n\t\t} finally {\n\t\t\tfor (const modifier of [...chord.modifiers].reverse()) await this.up(modifier)\n\t\t}\n\t}\n\n\tasync type(value: string, options?: BrowserInputOptions): Promise<void> {\n\t\tvalidateBrowserInputOptions(options)\n\t\tfor (const character of value) {\n\t\t\tawait this.down(character)\n\t\t\tawait this.up(character)\n\t\t\tif (options?.delay !== undefined && options.delay > 0) {\n\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, options.delay))\n\t\t\t}\n\t\t}\n\t}\n\n\tasync insert(value: string): Promise<void> {\n\t\tawait this.#frame.send('Input.insertText', { text: value })\n\t}\n}\n","import type {\n\tBrowserClickOptions,\n\tBrowserDragOptions,\n\tBrowserFrameInterface,\n\tBrowserMouseButton,\n\tBrowserMouseInterface,\n\tBrowserPoint,\n} from './types.js'\nimport {\n\tcomputeBrowserButtons,\n\tvalidateBrowserInputOptions,\n\tvalidateBrowserPoint,\n} from './helpers.js'\n\n/**\n * Sends trusted mouse input through Chromium's CDP Input domain.\n *\n * @example\n * ```ts\n * import { BrowserMouse } from '@orkestrel/browser'\n *\n * const mouse = new BrowserMouse(page)\n * await mouse.click({ x: 50, y: 20 }, { button: 'left', count: 2 })\n * await mouse.drag({ x: 10, y: 10 }, { x: 90, y: 90 }, { steps: 20 })\n * ```\n */\nexport class BrowserMouse implements BrowserMouseInterface {\n\treadonly #frame: BrowserFrameInterface\n\treadonly #buttons = new Set<BrowserMouseButton>()\n\t#point: BrowserPoint = { x: 0, y: 0 }\n\n\tconstructor(frame: BrowserFrameInterface) {\n\t\tthis.#frame = frame\n\t}\n\n\tasync move(point: BrowserPoint): Promise<void> {\n\t\tvalidateBrowserPoint(point)\n\t\tthis.#point = point\n\t\tawait this.#frame.send('Input.dispatchMouseEvent', {\n\t\t\ttype: 'mouseMoved',\n\t\t\tx: point.x,\n\t\t\ty: point.y,\n\t\t\tbutton: 'none',\n\t\t\tbuttons: computeBrowserButtons([...this.#buttons]),\n\t\t})\n\t}\n\n\tasync down(button: BrowserMouseButton = 'left', count = 1): Promise<void> {\n\t\tvalidateBrowserInputOptions({ count })\n\t\tconst buttons = new Set(this.#buttons)\n\t\tbuttons.add(button)\n\t\tawait this.#frame.send('Input.dispatchMouseEvent', {\n\t\t\ttype: 'mousePressed',\n\t\t\tx: this.#point.x,\n\t\t\ty: this.#point.y,\n\t\t\tbutton,\n\t\t\tbuttons: computeBrowserButtons([...buttons]),\n\t\t\tclickCount: count,\n\t\t})\n\t\tthis.#buttons.add(button)\n\t}\n\n\tasync up(button: BrowserMouseButton = 'left', count = 1): Promise<void> {\n\t\tvalidateBrowserInputOptions({ count })\n\t\tconst buttons = new Set(this.#buttons)\n\t\tbuttons.delete(button)\n\t\ttry {\n\t\t\tawait this.#frame.send('Input.dispatchMouseEvent', {\n\t\t\t\ttype: 'mouseReleased',\n\t\t\t\tx: this.#point.x,\n\t\t\t\ty: this.#point.y,\n\t\t\t\tbutton,\n\t\t\t\tbuttons: computeBrowserButtons([...buttons]),\n\t\t\t\tclickCount: count,\n\t\t\t})\n\t\t} finally {\n\t\t\tthis.#buttons.delete(button)\n\t\t}\n\t}\n\n\tasync click(point: BrowserPoint, options?: BrowserClickOptions): Promise<void> {\n\t\tvalidateBrowserInputOptions(options)\n\t\tconst button = options?.button ?? 'left'\n\t\tconst count = options?.count ?? 1\n\t\tawait this.move(point)\n\t\tawait this.down(button, count)\n\t\tif (options?.delay !== undefined && options.delay > 0) {\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, options.delay))\n\t\t}\n\t\tawait this.up(button, count)\n\t}\n\n\tasync drag(start: BrowserPoint, end: BrowserPoint, options?: BrowserDragOptions): Promise<void> {\n\t\tvalidateBrowserInputOptions(options)\n\t\tvalidateBrowserPoint(start)\n\t\tvalidateBrowserPoint(end)\n\t\tconst steps = options?.steps ?? 10\n\t\tawait this.move(start)\n\t\tawait this.down(options?.button ?? 'left', 1)\n\t\ttry {\n\t\t\tfor (let step = 1; step <= steps; step += 1) {\n\t\t\t\tawait this.move({\n\t\t\t\t\tx: start.x + ((end.x - start.x) * step) / steps,\n\t\t\t\t\ty: start.y + ((end.y - start.y) * step) / steps,\n\t\t\t\t})\n\t\t\t\tif (options?.delay !== undefined && options.delay > 0) {\n\t\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, options.delay))\n\t\t\t\t}\n\t\t\t}\n\t\t} finally {\n\t\t\tawait this.up(options?.button ?? 'left', 1)\n\t\t}\n\t}\n\n\tasync wheel(delta: BrowserPoint): Promise<void> {\n\t\tvalidateBrowserPoint(delta)\n\t\tawait this.#frame.send('Input.dispatchMouseEvent', {\n\t\t\ttype: 'mouseWheel',\n\t\t\tx: this.#point.x,\n\t\t\ty: this.#point.y,\n\t\t\tdeltaX: delta.x,\n\t\t\tdeltaY: delta.y,\n\t\t\tbuttons: computeBrowserButtons([...this.#buttons]),\n\t\t})\n\t}\n}\n","import type {\n\tBrowserActionOptions,\n\tBrowserActionabilityOptions,\n\tBrowserFrameInterface,\n\tBrowserHandleInterface,\n\tBrowserLocatorClickOptions,\n\tBrowserLocatorDragOptions,\n\tBrowserLocatorFilter,\n\tBrowserLocatorInterface,\n\tBrowserLocatorTypeOptions,\n\tBrowserOperationOptions,\n\tBrowserPointerOptions,\n\tBrowserPoint,\n\tBrowserQuery,\n\tBrowserScreenshotOptions,\n\tBrowserScreenshotResult,\n\tBrowserUploadOptions,\n\tBrowserWaitOptions,\n\tBrowserWaitState,\n} from './types.js'\nimport { BROWSER_DEFAULT_TIMEOUT_MS, BROWSER_WAIT_POLL_INTERVAL_MS } from './constants.js'\nimport {\n\tcompileActionabilityFunction,\n\tcompileAttachedLocatorWaitExpression,\n\tcompileDetachedLocatorWaitExpression,\n\tcompileHiddenLocatorWaitExpression,\n\tcompileLocatorExpression,\n\tcompileLocatorListExpression,\n\tcompileScreenshotCleanupExpression,\n\tcompileScreenshotPreparationExpression,\n\tcompileVisibleLocatorWaitExpression,\n} from './compilers.js'\nimport {\n\tbrowserScreenshotToParams,\n\tdecodeBase64,\n\treadBrowserQuad,\n\trequireBrowserString,\n\tvalidateBrowserInputOptions,\n} from './helpers.js'\nimport { BrowserError, BrowserSelectorError } from './errors.js'\nimport { isArray, isFiniteNumber, isInteger, isRecord, isString } from '@orkestrel/contract'\n\n/**\n * Represents a reusable strict semantic locator over one frame.\n *\n * @example\n * ```ts\n * import { BrowserLocator } from '@orkestrel/browser'\n *\n * const save = new BrowserLocator(page, { selector: 'role', value: 'button', name: 'Save' })\n * await save.click({ count: 2 })\n * const label = await save.text()\n * ```\n */\nexport class BrowserLocator implements BrowserLocatorInterface {\n\treadonly #frame: BrowserFrameInterface\n\treadonly #query: BrowserQuery\n\n\tconstructor(frame: BrowserFrameInterface, query: BrowserQuery) {\n\t\tthis.#frame = frame\n\t\tthis.#query = query\n\t}\n\n\tget frame(): BrowserFrameInterface {\n\t\treturn this.#frame\n\t}\n\n\tget query(): BrowserQuery {\n\t\treturn this.#query\n\t}\n\n\tlocator(selector: string): BrowserLocatorInterface {\n\t\treturn new BrowserLocator(this.#frame, {\n\t\t\tselector: 'css',\n\t\t\tvalue: selector,\n\t\t\tparent: this.#query,\n\t\t})\n\t}\n\n\tfilter(options: BrowserLocatorFilter): BrowserLocatorInterface {\n\t\treturn new BrowserLocator(this.#frame, { ...this.#query, filter: options })\n\t}\n\n\tfirst(): BrowserLocatorInterface {\n\t\treturn this.item(0)\n\t}\n\n\tlast(): BrowserLocatorInterface {\n\t\treturn this.item(-1)\n\t}\n\n\titem(index: number): BrowserLocatorInterface {\n\t\tif (!isInteger(index)) throw new BrowserError('Browser locator index must be an integer')\n\t\treturn new BrowserLocator(this.#frame, { ...this.#query, index })\n\t}\n\n\tasync count(): Promise<number> {\n\t\tconst value = await this.#frame.evaluate(\n\t\t\t`(${compileLocatorListExpression(this.#query)}).length`,\n\t\t)\n\t\tif (!isInteger(value) || value < 0) {\n\t\t\tthrow new BrowserError('Browser locator count did not resolve to a non-negative integer')\n\t\t}\n\t\treturn value\n\t}\n\n\tasync all(): Promise<readonly BrowserLocatorInterface[]> {\n\t\tconst count = await this.count()\n\t\tconst locators: BrowserLocatorInterface[] = []\n\t\tfor (let index = 0; index < count; index += 1) {\n\t\t\tlocators.push(this.item(index))\n\t\t}\n\t\treturn locators\n\t}\n\n\tasync click(options?: BrowserLocatorClickOptions): Promise<void> {\n\t\tconst handle = await this.#resolve(options, 'visible')\n\t\ttry {\n\t\t\tconst point = await this.#point(handle, options, {\n\t\t\t\tvisible: true,\n\t\t\t\tstable: true,\n\t\t\t\tevents: true,\n\t\t\t\tenabled: true,\n\t\t\t})\n\t\t\tif (options?.trial === true) return\n\t\t\tawait this.#frame.mouse.click(point, options)\n\t\t} finally {\n\t\t\tawait handle.dispose()\n\t\t}\n\t}\n\n\tasync fill(value: string, options?: BrowserActionOptions): Promise<void> {\n\t\tconst handle = await this.#resolve(options, 'visible')\n\t\ttry {\n\t\t\tif (options?.force !== true) {\n\t\t\t\tawait handle.call(\n\t\t\t\t\tcompileActionabilityFunction({\n\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\tstable: true,\n\t\t\t\t\t\tevents: false,\n\t\t\t\t\t\tenabled: true,\n\t\t\t\t\t\teditable: true,\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t}\n\t\t\tif (options?.trial === true) return\n\t\t\tawait handle.call(`function() {\n\t\t\t\tthis.focus()\n\t\t\t\tif (this.isContentEditable) {\n\t\t\t\t\tconst selection = this.ownerDocument.getSelection()\n\t\t\t\t\tconst range = this.ownerDocument.createRange()\n\t\t\t\t\trange.selectNodeContents(this)\n\t\t\t\t\tselection.removeAllRanges()\n\t\t\t\t\tselection.addRange(range)\n\t\t\t\t} else {\n\t\t\t\t\tthis.select()\n\t\t\t\t}\n\t\t\t}`)\n\t\t\tawait this.#frame.keyboard.insert(value)\n\t\t} finally {\n\t\t\tawait handle.dispose()\n\t\t}\n\t}\n\n\tasync select(values: readonly string[], options?: BrowserActionOptions): Promise<void> {\n\t\tconst handle = await this.#resolve(options, 'visible')\n\t\ttry {\n\t\t\tif (options?.force !== true) {\n\t\t\t\tawait handle.call(\n\t\t\t\t\tcompileActionabilityFunction({\n\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\tstable: true,\n\t\t\t\t\t\tevents: false,\n\t\t\t\t\t\tenabled: true,\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t}\n\t\t\tif (options?.trial === true) return\n\t\t\tawait handle.call(\n\t\t\t\t`function(values) {\n\t\t\t\t\tif (!(this instanceof HTMLSelectElement)) throw new Error('Element is not a select')\n\t\t\t\t\tif (!this.multiple && values.length > 1) throw new Error('Single select cannot accept multiple values')\n\t\t\t\t\tconst available = new Set(Array.from(this.options, (option) => option.value))\n\t\t\t\t\tconst missing = values.filter((value) => !available.has(value))\n\t\t\t\t\tif (missing.length > 0) throw new Error('Select options not found: ' + missing.join(', '))\n\t\t\t\t\tfor (const option of this.options) option.selected = values.includes(option.value)\n\t\t\t\t\tthis.dispatchEvent(new Event('input', { bubbles: true }))\n\t\t\t\t\tthis.dispatchEvent(new Event('change', { bubbles: true }))\n\t\t\t\t}`,\n\t\t\t\t[[...values]],\n\t\t\t)\n\t\t} finally {\n\t\t\tawait handle.dispose()\n\t\t}\n\t}\n\n\tasync check(options?: BrowserLocatorClickOptions): Promise<void> {\n\t\tif ((await this.#boolean('checked')) === true) return\n\t\tawait this.click(options)\n\t\tif ((await this.#boolean('checked')) !== true) {\n\t\t\tthrow new BrowserError('Browser locator did not become checked')\n\t\t}\n\t}\n\n\tasync uncheck(options?: BrowserLocatorClickOptions): Promise<void> {\n\t\tif ((await this.#boolean('checked')) === false) return\n\t\tawait this.click(options)\n\t\tif ((await this.#boolean('checked')) !== false) {\n\t\t\tthrow new BrowserError('Browser locator did not become unchecked')\n\t\t}\n\t}\n\n\tasync hover(options?: BrowserPointerOptions): Promise<void> {\n\t\tconst handle = await this.#resolve(options, 'visible')\n\t\ttry {\n\t\t\tconst point = await this.#point(handle, options, {\n\t\t\t\tvisible: true,\n\t\t\t\tstable: true,\n\t\t\t\tevents: true,\n\t\t\t})\n\t\t\tif (options?.trial !== true) await this.#frame.mouse.move(point)\n\t\t} finally {\n\t\t\tawait handle.dispose()\n\t\t}\n\t}\n\n\tasync focus(options?: BrowserActionOptions): Promise<void> {\n\t\tconst handle = await this.#resolve(options, 'attached')\n\t\ttry {\n\t\t\tif (options?.trial !== true) await handle.call('function() { this.focus() }')\n\t\t} finally {\n\t\t\tawait handle.dispose()\n\t\t}\n\t}\n\n\tasync press(key: string, options?: BrowserLocatorTypeOptions): Promise<void> {\n\t\tawait this.focus(options)\n\t\tif (options?.trial !== true) await this.#frame.keyboard.press(key, options)\n\t}\n\n\tasync type(value: string, options?: BrowserLocatorTypeOptions): Promise<void> {\n\t\tawait this.focus(options)\n\t\tif (options?.trial !== true) await this.#frame.keyboard.type(value, options)\n\t}\n\n\tasync clear(options?: BrowserActionOptions): Promise<void> {\n\t\tconst handle = await this.#resolve(options, 'visible')\n\t\ttry {\n\t\t\tif (options?.trial === true) return\n\t\t\tawait handle.call(`function() {\n\t\t\t\tthis.focus()\n\t\t\t\tif (this.isContentEditable) {\n\t\t\t\t\tthis.textContent = ''\n\t\t\t\t} else if ('value' in this) {\n\t\t\t\t\tthis.value = ''\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error('Element is not editable')\n\t\t\t\t}\n\t\t\t\tthis.dispatchEvent(new InputEvent('input', { bubbles: true, inputType: 'deleteContentBackward' }))\n\t\t\t\tthis.dispatchEvent(new Event('change', { bubbles: true }))\n\t\t\t}`)\n\t\t} finally {\n\t\t\tawait handle.dispose()\n\t\t}\n\t}\n\n\tasync wait(options?: BrowserWaitOptions): Promise<void> {\n\t\tconst timeout = options?.timeout ?? BROWSER_DEFAULT_TIMEOUT_MS\n\t\tif (!isFiniteNumber(timeout) || timeout < 0) {\n\t\t\tthrow new BrowserError(\n\t\t\t\t'Browser wait timeout must be a non-negative finite number',\n\t\t\t\tundefined,\n\t\t\t\t{\n\t\t\t\t\ttimeout,\n\t\t\t\t},\n\t\t\t)\n\t\t}\n\t\tconst state = options?.state ?? 'attached'\n\t\tconst expression = this.#waitExpression(state, options?.strict ?? true, timeout)\n\t\tlet found: unknown\n\t\ttry {\n\t\t\tfound = await this.#frame.evaluate(expression, timeout + BROWSER_WAIT_POLL_INTERVAL_MS)\n\t\t} catch (error) {\n\t\t\tthrow new BrowserSelectorError('Browser locator wait failed', {\n\t\t\t\tquery: this.#query,\n\t\t\t\tstate,\n\t\t\t\ttimeout,\n\t\t\t\tframe: this.#frame.id,\n\t\t\t\terror,\n\t\t\t})\n\t\t}\n\t\tif (found === true) return\n\t\tthrow new BrowserSelectorError('Timeout waiting for browser locator', {\n\t\t\tquery: this.#query,\n\t\t\tstate,\n\t\t\ttimeout,\n\t\t\tframe: this.#frame.id,\n\t\t})\n\t}\n\n\tasync text(): Promise<string> {\n\t\tconst value = await this.#frame.evaluate(\n\t\t\t`(${compileLocatorExpression(this.#query)})?.innerText`,\n\t\t)\n\t\treturn requireBrowserString(value, 'Browser locator text')\n\t}\n\n\tasync texts(): Promise<readonly string[]> {\n\t\tconst value = await this.#frame.evaluate(\n\t\t\t`(${compileLocatorListExpression(this.#query)}).map((element) => element.innerText)`,\n\t\t)\n\t\tif (!isArray(value) || !value.every(isString)) {\n\t\t\tthrow new BrowserError('Browser locator text list is malformed')\n\t\t}\n\t\treturn value\n\t}\n\n\tasync html(): Promise<string> {\n\t\treturn await this.#string('outerHTML', 'Browser locator HTML')\n\t}\n\n\tasync value(): Promise<string> {\n\t\tconst value = await this.#frame.evaluate(\n\t\t\t`(() => { const element = ${compileLocatorExpression(this.#query)}; return element && 'value' in element ? element.value : element?.textContent })()`,\n\t\t)\n\t\treturn requireBrowserString(value, 'Browser locator value')\n\t}\n\n\tasync attribute(name: string): Promise<string | undefined> {\n\t\tconst value = await this.#frame.evaluate(\n\t\t\t`(${compileLocatorExpression(this.#query)})?.getAttribute(${JSON.stringify(name)})`,\n\t\t)\n\t\treturn isString(value) ? value : undefined\n\t}\n\n\tasync visible(): Promise<boolean> {\n\t\treturn await this.#boolean('visible')\n\t}\n\n\tasync enabled(): Promise<boolean> {\n\t\treturn await this.#boolean('enabled')\n\t}\n\n\tasync editable(): Promise<boolean> {\n\t\treturn await this.#boolean('editable')\n\t}\n\n\tasync screenshot(options?: BrowserScreenshotOptions): Promise<BrowserScreenshotResult> {\n\t\tif (options?.full === true || options?.clip !== undefined) {\n\t\t\tthrow new BrowserError('Browser locator screenshot cannot use full-page or custom clip')\n\t\t}\n\t\tconst handle = await this.#resolve(undefined, 'visible')\n\t\tlet token: string | undefined\n\t\ttry {\n\t\t\tawait handle.call(\n\t\t\t\tcompileActionabilityFunction({\n\t\t\t\t\tvisible: true,\n\t\t\t\t\tstable: true,\n\t\t\t\t\tevents: false,\n\t\t\t\t\tenabled: false,\n\t\t\t\t}),\n\t\t\t)\n\t\t\tconst quad = await this.#quad(handle)\n\t\t\tconst xs = [quad.points[0], quad.points[2], quad.points[4], quad.points[6]]\n\t\t\tconst ys = [quad.points[1], quad.points[3], quad.points[5], quad.points[7]]\n\t\t\tconst x = Math.min(...xs)\n\t\t\tconst y = Math.min(...ys)\n\t\t\tconst width = Math.max(...xs) - x\n\t\t\tconst height = Math.max(...ys) - y\n\t\t\tconst params: Record<string, unknown> = {\n\t\t\t\t...browserScreenshotToParams(options),\n\t\t\t\tclip: { x, y, width, height, scale: 1 },\n\t\t\t\tcaptureBeyondViewport: true,\n\t\t\t}\n\t\t\tif (options?.scale === 'device') {\n\t\t\t\tconst ratio = await this.#frame.evaluate('devicePixelRatio')\n\t\t\t\tif (!isFiniteNumber(ratio) || ratio <= 0) {\n\t\t\t\t\tthrow new BrowserError('Browser screenshot device scale is malformed')\n\t\t\t\t}\n\t\t\t\tparams['clip'] = { x, y, width, height, scale: ratio }\n\t\t\t}\n\t\t\tconst preparation = compileScreenshotPreparationExpression(options)\n\t\t\tif (preparation !== undefined) {\n\t\t\t\tconst value = await this.#frame.evaluate(preparation)\n\t\t\t\tif (!isString(value)) throw new BrowserError('Browser screenshot preparation failed')\n\t\t\t\ttoken = value\n\t\t\t}\n\t\t\tif (options?.transparent === true) {\n\t\t\t\tawait this.#frame.send('Emulation.setDefaultBackgroundColorOverride', {\n\t\t\t\t\tcolor: { r: 0, g: 0, b: 0, a: 0 },\n\t\t\t\t})\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst result = await this.#frame.send('Page.captureScreenshot', params)\n\t\t\t\tif (!isRecord(result) || !isString(result['data'])) {\n\t\t\t\t\tthrow new BrowserError('Locator screenshot failed: no data returned')\n\t\t\t\t}\n\t\t\t\tconst bytes = decodeBase64(result['data'])\n\t\t\t\tif (options?.path !== undefined) await this.#frame.save(options.path, bytes)\n\t\t\t\treturn { bytes, path: options?.path }\n\t\t\t} finally {\n\t\t\t\tif (options?.transparent === true) {\n\t\t\t\t\tawait this.#frame\n\t\t\t\t\t\t.send('Emulation.setDefaultBackgroundColorOverride')\n\t\t\t\t\t\t.catch(() => undefined)\n\t\t\t\t}\n\t\t\t}\n\t\t} finally {\n\t\t\tif (token !== undefined) {\n\t\t\t\tawait this.#frame.evaluate(compileScreenshotCleanupExpression(token)).catch(() => undefined)\n\t\t\t}\n\t\t\tawait handle.dispose()\n\t\t}\n\t}\n\n\tasync upload(options: BrowserUploadOptions): Promise<void> {\n\t\tconst handle = await this.#resolve(options, 'attached')\n\t\ttry {\n\t\t\tif (options.trial === true) return\n\t\t\tawait this.#frame.send('DOM.setFileInputFiles', {\n\t\t\t\tobjectId: handle.id,\n\t\t\t\tfiles: [...options.files],\n\t\t\t})\n\t\t} finally {\n\t\t\tawait handle.dispose()\n\t\t}\n\t}\n\n\tasync drag(target: BrowserLocatorInterface, options?: BrowserLocatorDragOptions): Promise<void> {\n\t\tif (target.frame.id !== this.#frame.id) {\n\t\t\tthrow new BrowserError('Browser drag target must belong to the same frame')\n\t\t}\n\t\tconst sourceHandle = await this.#resolve(options, 'visible')\n\t\tlet targetHandle: BrowserHandleInterface | undefined\n\t\ttry {\n\t\t\tawait target.wait({\n\t\t\t\t...(options?.timeout !== undefined ? { timeout: options.timeout } : {}),\n\t\t\t\t...(options?.strict !== undefined ? { strict: options.strict } : {}),\n\t\t\t\tstate: 'visible',\n\t\t\t})\n\t\t\ttargetHandle = await target.frame.handle(compileLocatorExpression(target.query))\n\t\t\tconst source = await this.#point(sourceHandle, options, {\n\t\t\t\tvisible: true,\n\t\t\t\tstable: true,\n\t\t\t\tevents: true,\n\t\t\t})\n\t\t\tconst destination = await this.#point(targetHandle, undefined, {\n\t\t\t\tvisible: true,\n\t\t\t\tstable: true,\n\t\t\t\tevents: true,\n\t\t\t})\n\t\t\tif (options?.trial !== true) {\n\t\t\t\tawait this.#frame.mouse.drag(source, destination, options)\n\t\t\t}\n\t\t} finally {\n\t\t\tawait sourceHandle.dispose()\n\t\t\tawait targetHandle?.dispose()\n\t\t}\n\t}\n\n\tasync #resolve(\n\t\toptions: BrowserOperationOptions | undefined,\n\t\tstate: 'attached' | 'visible',\n\t): Promise<BrowserHandleInterface> {\n\t\tvalidateBrowserInputOptions(options)\n\t\tawait this.wait({\n\t\t\t...(options?.timeout !== undefined ? { timeout: options.timeout } : {}),\n\t\t\t...(options?.strict !== undefined ? { strict: options.strict } : {}),\n\t\t\tstate,\n\t\t})\n\t\treturn await this.#frame.handle(compileLocatorExpression(this.#query))\n\t}\n\n\tasync #point(\n\t\thandle: BrowserHandleInterface,\n\t\toptions: BrowserPointerOptions | undefined,\n\t\tactionability: BrowserActionabilityOptions,\n\t): Promise<BrowserPoint> {\n\t\tif (options?.force !== true) {\n\t\t\tawait handle.call(\n\t\t\t\tcompileActionabilityFunction({\n\t\t\t\t\t...actionability,\n\t\t\t\t\t...(options?.position !== undefined ? { position: options.position } : {}),\n\t\t\t\t}),\n\t\t\t)\n\t\t}\n\t\tconst quad = await this.#quad(handle)\n\t\tif (options?.position === undefined) return quad.center\n\t\tconst xs = [quad.points[0], quad.points[2], quad.points[4], quad.points[6]]\n\t\tconst ys = [quad.points[1], quad.points[3], quad.points[5], quad.points[7]]\n\t\treturn {\n\t\t\tx: Math.min(...xs) + options.position.x,\n\t\t\ty: Math.min(...ys) + options.position.y,\n\t\t}\n\t}\n\n\tasync #quad(handle: BrowserHandleInterface): Promise<ReturnType<typeof readBrowserQuad>> {\n\t\treturn readBrowserQuad(await this.#frame.send('DOM.getContentQuads', { objectId: handle.id }))\n\t}\n\n\tasync #string(property: string, field: string): Promise<string> {\n\t\tconst value = await this.#frame.evaluate(\n\t\t\t`(${compileLocatorExpression(this.#query)})?.[${JSON.stringify(property)}]`,\n\t\t)\n\t\treturn requireBrowserString(value, field)\n\t}\n\n\tasync #boolean(property: 'checked' | 'visible' | 'enabled' | 'editable'): Promise<boolean> {\n\t\tlet expression: string\n\t\tswitch (property) {\n\t\t\tcase 'checked':\n\t\t\t\texpression = `Boolean((${compileLocatorExpression(this.#query)})?.checked)`\n\t\t\t\tbreak\n\t\t\tcase 'visible':\n\t\t\t\texpression = `(() => { const element = ${compileLocatorExpression(this.#query)}; if (!element) return false; const style = getComputedStyle(element); const rect = element.getBoundingClientRect(); return style.display !== 'none' && style.visibility !== 'hidden' && style.visibility !== 'collapse' && rect.width > 0 && rect.height > 0 })()`\n\t\t\t\tbreak\n\t\t\tcase 'enabled':\n\t\t\t\texpression = `(() => { const element = ${compileLocatorExpression(this.#query)}; return Boolean(element && !element.matches(':disabled')) })()`\n\t\t\t\tbreak\n\t\t\tcase 'editable':\n\t\t\t\texpression = `(() => { const element = ${compileLocatorExpression(this.#query)}; return Boolean(element && !element.matches(':disabled,[readonly]') && (element.isContentEditable || 'value' in element)) })()`\n\t\t\t\tbreak\n\t\t}\n\t\treturn (await this.#frame.evaluate(expression)) === true\n\t}\n\n\t#waitExpression(state: BrowserWaitState, strict: boolean, timeout: number): string {\n\t\tswitch (state) {\n\t\t\tcase 'attached':\n\t\t\t\treturn compileAttachedLocatorWaitExpression(this.#query, strict, timeout)\n\t\t\tcase 'detached':\n\t\t\t\treturn compileDetachedLocatorWaitExpression(this.#query, strict, timeout)\n\t\t\tcase 'visible':\n\t\t\t\treturn compileVisibleLocatorWaitExpression(this.#query, strict, timeout)\n\t\t\tcase 'hidden':\n\t\t\t\treturn compileHiddenLocatorWaitExpression(this.#query, strict, timeout)\n\t\t}\n\t}\n}\n","import type {\n\tBrowserFrameInterface,\n\tBrowserLocatorInterface,\n\tBrowserRoleOptions,\n\tBrowserSelectorManagerInterface,\n\tBrowserTextOptions,\n} from './types.js'\nimport { BrowserLocator } from './BrowserLocator.js'\n\n/**\n * Creates semantic locators for one frame.\n *\n * @example\n * ```ts\n * import { BrowserSelectorManager } from '@orkestrel/browser'\n *\n * const selectors = new BrowserSelectorManager(page)\n * await selectors.role('button', { name: 'Save' }).click()\n * await selectors.testId('checkout').click()\n * ```\n */\nexport class BrowserSelectorManager implements BrowserSelectorManagerInterface {\n\treadonly #frame: BrowserFrameInterface\n\n\tconstructor(frame: BrowserFrameInterface) {\n\t\tthis.#frame = frame\n\t}\n\n\tcss(value: string): BrowserLocatorInterface {\n\t\treturn new BrowserLocator(this.#frame, { selector: 'css', value })\n\t}\n\n\trole(value: string, options?: BrowserRoleOptions): BrowserLocatorInterface {\n\t\treturn new BrowserLocator(this.#frame, {\n\t\t\tselector: 'role',\n\t\t\tvalue,\n\t\t\t...(options?.name !== undefined ? { name: options.name } : {}),\n\t\t\t...(options?.exact !== undefined ? { exact: options.exact } : {}),\n\t\t})\n\t}\n\n\ttext(value: string, options?: BrowserTextOptions): BrowserLocatorInterface {\n\t\treturn new BrowserLocator(this.#frame, {\n\t\t\tselector: 'text',\n\t\t\tvalue,\n\t\t\t...(options?.exact !== undefined ? { exact: options.exact } : {}),\n\t\t})\n\t}\n\n\tlabel(value: string, options?: BrowserTextOptions): BrowserLocatorInterface {\n\t\treturn new BrowserLocator(this.#frame, {\n\t\t\tselector: 'label',\n\t\t\tvalue,\n\t\t\t...(options?.exact !== undefined ? { exact: options.exact } : {}),\n\t\t})\n\t}\n\n\tplaceholder(value: string, options?: BrowserTextOptions): BrowserLocatorInterface {\n\t\treturn new BrowserLocator(this.#frame, {\n\t\t\tselector: 'placeholder',\n\t\t\tvalue,\n\t\t\t...(options?.exact !== undefined ? { exact: options.exact } : {}),\n\t\t})\n\t}\n\n\ttestId(value: string): BrowserLocatorInterface {\n\t\treturn new BrowserLocator(this.#frame, { selector: 'testId', value })\n\t}\n}\n","import type { BrowserFrameInterface, BrowserPoint, BrowserTouchInterface } from './types.js'\nimport { validateBrowserPoint } from './helpers.js'\n\n/**\n * Sends trusted touch input through Chromium's CDP Input domain.\n *\n * @example\n * ```ts\n * import { BrowserTouch } from '@orkestrel/browser'\n *\n * const touch = new BrowserTouch(page)\n * await touch.tap({ x: 120, y: 240 })\n * ```\n */\nexport class BrowserTouch implements BrowserTouchInterface {\n\treadonly #frame: BrowserFrameInterface\n\n\tconstructor(frame: BrowserFrameInterface) {\n\t\tthis.#frame = frame\n\t}\n\n\tasync tap(point: BrowserPoint): Promise<void> {\n\t\tvalidateBrowserPoint(point)\n\t\tconst touch = { x: point.x, y: point.y }\n\t\tawait this.#frame.send('Input.dispatchTouchEvent', {\n\t\t\ttype: 'touchStart',\n\t\t\ttouchPoints: [touch],\n\t\t})\n\t\ttry {\n\t\t\tawait this.#frame.send('Input.dispatchTouchEvent', {\n\t\t\t\ttype: 'touchEnd',\n\t\t\t\ttouchPoints: [],\n\t\t\t})\n\t\t} catch (error) {\n\t\t\tawait this.#frame\n\t\t\t\t.send('Input.dispatchTouchEvent', {\n\t\t\t\t\ttype: 'touchCancel',\n\t\t\t\t\ttouchPoints: [],\n\t\t\t\t})\n\t\t\t\t.catch(() => undefined)\n\t\t\tthrow error\n\t\t}\n\t}\n}\n","import type {\n\tBrowserActionOptions,\n\tBrowserContentResult,\n\tBrowserFrameInterface,\n\tBrowserHandleInterface,\n\tBrowserKeyboardInterface,\n\tBrowserMouseInterface,\n\tBrowserSelectorManagerInterface,\n\tBrowserSendOptions,\n\tBrowserSessionFunction,\n\tBrowserTouchInterface,\n\tBrowserWaitOptions,\n\tCDPHandler,\n\tCDPClientInterface,\n} from './types.js'\nimport { BrowserHandle } from './BrowserHandle.js'\nimport { BrowserKeyboard } from './BrowserKeyboard.js'\nimport { BrowserMouse } from './BrowserMouse.js'\nimport { BrowserSelectorManager } from './BrowserSelectorManager.js'\nimport { BrowserTouch } from './BrowserTouch.js'\nimport { BROWSER_FRAME_WORLD_NAME, BROWSER_RESULT_LIMIT } from './constants.js'\nimport { compileGuardedEvaluateExpression } from './compilers.js'\nimport { readEvaluationResult, requireBrowserString } from './helpers.js'\nimport { BrowserError } from './errors.js'\nimport { isInteger, isRecord, isString } from '@orkestrel/contract'\nimport { createHTML, renderText } from '@orkestrel/html'\n\n/**\n * Represents one attached document frame, evaluated through its own CDP execution world.\n *\n * @example\n * ```ts\n * import { BrowserFrame } from '@orkestrel/browser'\n *\n * const frame = new BrowserFrame(client, 'session-1', 'frame-1', 'https://example.com')\n * await frame.fill('[name=email]', 'ada@example.com')\n * const title = await frame.title()\n * ```\n */\nexport class BrowserFrame implements BrowserFrameInterface {\n\treadonly #client: CDPClientInterface\n\treadonly #session: string | BrowserSessionFunction\n\treadonly #id: string\n\treadonly #parent: string | undefined\n\treadonly #name: string | undefined\n\treadonly #isolated: boolean\n\treadonly #selectors: BrowserSelectorManager\n\treadonly #keyboard: BrowserKeyboard\n\treadonly #mouse: BrowserMouse\n\treadonly #touch: BrowserTouch\n\t#url: string\n\n\tconstructor(\n\t\tclient: CDPClientInterface,\n\t\tsession: string | BrowserSessionFunction,\n\t\tid: string,\n\t\turl: string,\n\t\tparent?: string,\n\t\tname?: string,\n\t\tisolated = true,\n\t) {\n\t\tthis.#client = client\n\t\tthis.#session = session\n\t\tthis.#id = id\n\t\tthis.#url = url\n\t\tthis.#parent = parent\n\t\tthis.#name = name\n\t\tthis.#isolated = isolated\n\t\tthis.#selectors = new BrowserSelectorManager(this)\n\t\tthis.#keyboard = new BrowserKeyboard(this)\n\t\tthis.#mouse = new BrowserMouse(this)\n\t\tthis.#touch = new BrowserTouch(this)\n\t}\n\n\tget id(): string {\n\t\treturn this.#id\n\t}\n\n\tget parent(): string | undefined {\n\t\treturn this.#parent\n\t}\n\n\tget name(): string | undefined {\n\t\treturn this.#name\n\t}\n\n\tget url(): string {\n\t\treturn this.#url\n\t}\n\n\tget selectors(): BrowserSelectorManagerInterface {\n\t\treturn this.#selectors\n\t}\n\n\tget keyboard(): BrowserKeyboardInterface {\n\t\treturn this.#keyboard\n\t}\n\n\tget mouse(): BrowserMouseInterface {\n\t\treturn this.#mouse\n\t}\n\n\tget touch(): BrowserTouchInterface {\n\t\treturn this.#touch\n\t}\n\n\tasync title(): Promise<string> {\n\t\tthis.assert()\n\t\tconst result = await this.#evaluate('document.title')\n\t\treturn requireBrowserString(result, 'Document title')\n\t}\n\n\tasync content(): Promise<BrowserContentResult> {\n\t\tthis.assert()\n\t\tconst [title, html, text, currentUrl] = await Promise.all([\n\t\t\tthis.#evaluate('document.title'),\n\t\t\tthis.#captureHTML(),\n\t\t\tthis.#evaluate(\n\t\t\t\tcompileGuardedEvaluateExpression(\n\t\t\t\t\t'document.body ? document.body.innerText : \"\"',\n\t\t\t\t\tBROWSER_RESULT_LIMIT,\n\t\t\t\t),\n\t\t\t),\n\t\t\tthis.#evaluate('location.href'),\n\t\t])\n\n\t\tconst url = requireBrowserString(currentUrl, 'Document URL')\n\t\tthis.#url = url\n\t\treturn {\n\t\t\turl,\n\t\t\ttitle: requireBrowserString(title, 'Document title'),\n\t\t\thtml: requireBrowserString(html, 'Document HTML'),\n\t\t\ttext: requireBrowserString(text, 'Document text'),\n\t\t}\n\t}\n\n\tasync article(): Promise<string> {\n\t\tthis.assert()\n\t\tconst html = requireBrowserString(await this.#captureHTML(), 'Document HTML')\n\t\treturn renderText(createHTML(html).distill().document)\n\t}\n\n\tasync click(selector: string, options?: BrowserActionOptions): Promise<void> {\n\t\tthis.assert()\n\t\tawait this.#selectors.css(selector).click(options)\n\t}\n\n\tasync fill(selector: string, value: string, options?: BrowserActionOptions): Promise<void> {\n\t\tthis.assert()\n\t\tawait this.#selectors.css(selector).fill(value, options)\n\t}\n\n\tasync select(\n\t\tselector: string,\n\t\tvalues: readonly string[],\n\t\toptions?: BrowserActionOptions,\n\t): Promise<void> {\n\t\tthis.assert()\n\t\tawait this.#selectors.css(selector).select(values, options)\n\t}\n\n\tasync evaluate(expression: string, timeout?: number): Promise<unknown> {\n\t\tthis.assert()\n\t\treturn await this.#evaluate(\n\t\t\tcompileGuardedEvaluateExpression(expression, BROWSER_RESULT_LIMIT),\n\t\t\ttimeout,\n\t\t)\n\t}\n\n\tasync handle(expression: string): Promise<BrowserHandleInterface> {\n\t\tthis.assert()\n\t\tconst session = await this.#sessionId()\n\t\tconst params: Record<string, unknown> = {\n\t\t\texpression,\n\t\t\treturnByValue: false,\n\t\t\tawaitPromise: true,\n\t\t}\n\t\tconst context = await this.#context(session)\n\t\tif (context !== undefined) params['contextId'] = context\n\t\tconst result = await this.#client.send('Runtime.evaluate', params, { session })\n\t\tif (\n\t\t\t!isRecord(result) ||\n\t\t\t!isRecord(result['result']) ||\n\t\t\t!isString(result['result']['objectId'])\n\t\t) {\n\t\t\tthrow new BrowserError('Browser expression did not resolve to an object handle', undefined, {\n\t\t\t\tframe: this.#id,\n\t\t\t})\n\t\t}\n\t\treturn new BrowserHandle(this.#client, session, result['result']['objectId'])\n\t}\n\n\tasync wait(selector: string, options?: BrowserWaitOptions): Promise<void> {\n\t\tthis.assert()\n\t\tawait this.#selectors.css(selector).wait(options)\n\t}\n\n\tasync send(\n\t\tmethod: string,\n\t\tparams?: Readonly<Record<string, unknown>>,\n\t\toptions?: BrowserSendOptions,\n\t): Promise<unknown> {\n\t\tthis.assert()\n\t\treturn await this.#client.send(method, params, {\n\t\t\tsession: await this.#sessionId(),\n\t\t\t...(options?.timeout !== undefined ? { timeout: options.timeout } : {}),\n\t\t})\n\t}\n\n\tasync subscribe(method: string, handler: CDPHandler): Promise<void> {\n\t\tthis.assert()\n\t\tthis.#client.subscribe(method, handler, await this.#sessionId())\n\t}\n\n\tasync unsubscribe(method: string, handler: CDPHandler): Promise<void> {\n\t\tthis.#client.unsubscribe(method, handler, await this.#sessionId())\n\t}\n\n\tasync save(path: string, _bytes: Uint8Array): Promise<void> {\n\t\t// Frames satisfy the persistence contract, but only top-level pages receive a writer.\n\t\tthrow new BrowserError('Browser frame has no configured file writer', undefined, { path })\n\t}\n\n\tassert(): void {\n\t\tif (!this.#client.connected) {\n\t\t\tthrow new BrowserError('Browser frame is disconnected', undefined, { frame: this.#id })\n\t\t}\n\t}\n\n\tupdate(url: string): void {\n\t\tthis.#url = url\n\t}\n\n\tasync #captureHTML(): Promise<unknown> {\n\t\treturn await this.#evaluate(\n\t\t\tcompileGuardedEvaluateExpression('document.documentElement.outerHTML', BROWSER_RESULT_LIMIT),\n\t\t)\n\t}\n\n\tasync #evaluate(expression: string, timeout?: number): Promise<unknown> {\n\t\tconst session = await this.#sessionId()\n\t\tconst params: Record<string, unknown> = {\n\t\t\texpression,\n\t\t\treturnByValue: true,\n\t\t\tawaitPromise: true,\n\t\t}\n\n\t\tconst context = await this.#context(session, timeout)\n\t\tif (context !== undefined) params['contextId'] = context\n\n\t\tconst result = await this.#client.send('Runtime.evaluate', params, {\n\t\t\tsession,\n\t\t\t...(timeout !== undefined ? { timeout } : {}),\n\t\t})\n\t\treturn readEvaluationResult(result)\n\t}\n\n\tasync #context(session: string, timeout?: number): Promise<number | undefined> {\n\t\tif (!this.#isolated) return undefined\n\t\tconst world = await this.#client.send(\n\t\t\t'Page.createIsolatedWorld',\n\t\t\t{ frameId: this.#id, worldName: BROWSER_FRAME_WORLD_NAME },\n\t\t\t{ session, ...(timeout !== undefined ? { timeout } : {}) },\n\t\t)\n\t\tif (!isRecord(world) || !isInteger(world['executionContextId'])) {\n\t\t\tthrow new BrowserError('Failed to create frame execution context', undefined, {\n\t\t\t\tframe: this.#id,\n\t\t\t})\n\t\t}\n\t\treturn world['executionContextId']\n\t}\n\n\tasync #sessionId(): Promise<string> {\n\t\tif (isString(this.#session)) return this.#session\n\t\treturn await this.#session(this.#id)\n\t}\n}\n","import type { BrowserFileChooserInterface, BrowserFrameInterface } from './types.js'\nimport { BrowserError } from './errors.js'\n\n/**\n * Represents one intercepted file input selection.\n */\nexport class BrowserFileChooser implements BrowserFileChooserInterface {\n\treadonly #frame: BrowserFrameInterface\n\treadonly #backend: number\n\treadonly #multiple: boolean\n\t#handled = false\n\t#handling = false\n\n\tconstructor(frame: BrowserFrameInterface, backend: number, multiple: boolean) {\n\t\tthis.#frame = frame\n\t\tthis.#backend = backend\n\t\tthis.#multiple = multiple\n\t}\n\n\tget multiple(): boolean {\n\t\treturn this.#multiple\n\t}\n\n\tasync upload(files: readonly string[]): Promise<void> {\n\t\tthis.#assert()\n\t\tif (!this.#multiple && files.length > 1) {\n\t\t\tthrow new BrowserError('Single file chooser cannot accept multiple files')\n\t\t}\n\t\tthis.#handling = true\n\t\ttry {\n\t\t\tawait this.#frame.send('DOM.setFileInputFiles', {\n\t\t\t\tbackendNodeId: this.#backend,\n\t\t\t\tfiles: [...files],\n\t\t\t})\n\t\t\tthis.#handled = true\n\t\t} finally {\n\t\t\tthis.#handling = false\n\t\t}\n\t}\n\n\tasync cancel(): Promise<void> {\n\t\tthis.#assert()\n\t\tthis.#handling = true\n\t\ttry {\n\t\t\tawait this.#frame.send('DOM.setFileInputFiles', {\n\t\t\t\tbackendNodeId: this.#backend,\n\t\t\t\tfiles: [],\n\t\t\t})\n\t\t\tthis.#handled = true\n\t\t} finally {\n\t\t\tthis.#handling = false\n\t\t}\n\t}\n\n\t#assert(): void {\n\t\tif (this.#handled || this.#handling) {\n\t\t\tthrow new BrowserError('Browser file chooser is already handled')\n\t\t}\n\t}\n}\n","import type {\n\tBrowserHAR,\n\tBrowserHAREntry,\n\tBrowserHARManagerInterface,\n\tBrowserHAROptions,\n\tBrowserHARPending,\n\tBrowserHARReplayOptions,\n\tBrowserNetworkManagerInterface,\n\tBrowserRequest,\n\tBrowserRequestFailure,\n\tBrowserResponse,\n\tBrowserRouteHandler,\n\tBrowserWriterInterface,\n} from './types.js'\nimport { BROWSER_HAR_CREATOR } from './constants.js'\nimport {\n\tbrowserHARHeadersToRecord,\n\tcreateBrowserHAREntry,\n\tdecodeBase64,\n\ttextToBytes,\n\tvalidateBrowserHAR,\n} from './helpers.js'\nimport { BrowserError } from './errors.js'\n\n/**\n * Records and replays HTTP archives over one page network manager.\n *\n * @example\n * ```ts\n * import { BrowserHARManager } from '@orkestrel/browser'\n *\n * const har = new BrowserHARManager(page.network)\n * await har.start({ content: true })\n * const archive = await har.stop() // { log: { version: '1.2', creator, entries } }\n * ```\n */\nexport class BrowserHARManager implements BrowserHARManagerInterface {\n\treadonly #network: BrowserNetworkManagerInterface\n\treadonly #writer: BrowserWriterInterface | undefined\n\treadonly #pending: Map<string, BrowserHARPending> = new Map()\n\treadonly #entries: BrowserHAREntry[] = []\n\treadonly #tasks: Set<Promise<void>> = new Set()\n\t#options: BrowserHAROptions | undefined\n\t#recording = false\n\t#failure: unknown\n\t#archive: BrowserHAR | undefined\n\t#fallback = false\n\treadonly #requestHandler = this.#handleRequest.bind(this)\n\treadonly #responseHandler = this.#handleResponse.bind(this)\n\treadonly #failureHandler = this.#handleFailure.bind(this)\n\treadonly #finishHandler = this.#handleFinish.bind(this)\n\treadonly #replayHandler: BrowserRouteHandler = this.#handleReplay.bind(this)\n\n\tconstructor(network: BrowserNetworkManagerInterface, writer?: BrowserWriterInterface) {\n\t\tthis.#network = network\n\t\tthis.#writer = writer\n\t}\n\n\tget recording(): boolean {\n\t\treturn this.#recording\n\t}\n\n\tasync start(options?: BrowserHAROptions): Promise<void> {\n\t\tif (this.#recording) return\n\t\tthis.#options = options\n\t\tthis.#entries.length = 0\n\t\tthis.#pending.clear()\n\t\tthis.#failure = undefined\n\t\tthis.#network.emitter.on('request', this.#requestHandler)\n\t\tthis.#network.emitter.on('response', this.#responseHandler)\n\t\tthis.#network.emitter.on('failure', this.#failureHandler)\n\t\tthis.#network.emitter.on('finish', this.#finishHandler)\n\t\tthis.#recording = true\n\t\ttry {\n\t\t\tawait this.#network.start()\n\t\t} catch (error) {\n\t\t\tthis.#recording = false\n\t\t\tthis.#network.emitter.off('request', this.#requestHandler)\n\t\t\tthis.#network.emitter.off('response', this.#responseHandler)\n\t\t\tthis.#network.emitter.off('failure', this.#failureHandler)\n\t\t\tthis.#network.emitter.off('finish', this.#finishHandler)\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync stop(): Promise<BrowserHAR> {\n\t\tif (this.#recording) {\n\t\t\tthis.#recording = false\n\t\t\tthis.#network.emitter.off('request', this.#requestHandler)\n\t\t\tthis.#network.emitter.off('response', this.#responseHandler)\n\t\t\tthis.#network.emitter.off('failure', this.#failureHandler)\n\t\t\tthis.#network.emitter.off('finish', this.#finishHandler)\n\t\t\tawait Promise.allSettled([...this.#tasks])\n\t\t\tfor (const id of [...this.#pending.keys()]) {\n\t\t\t\tconst pending = this.#pending.get(id)\n\t\t\t\tif (pending === undefined) continue\n\t\t\t\tthis.#pending.delete(id)\n\t\t\t\tthis.#entries.push(\n\t\t\t\t\tcreateBrowserHAREntry(\n\t\t\t\t\t\tpending,\n\t\t\t\t\t\tMath.max(0, Date.now() - pending.started),\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t'Request was incomplete when recording stopped',\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\t\tif (this.#failure !== undefined) {\n\t\t\tthrow new BrowserError('Browser HAR recording failed', 'BROWSER_HAR_ERROR', {\n\t\t\t\terror: this.#failure,\n\t\t\t})\n\t\t}\n\t\tconst har: BrowserHAR = {\n\t\t\tlog: {\n\t\t\t\tversion: '1.2',\n\t\t\t\tcreator: BROWSER_HAR_CREATOR,\n\t\t\t\tentries: [...this.#entries],\n\t\t\t},\n\t\t}\n\t\tif (this.#options?.path !== undefined) {\n\t\t\tif (this.#writer === undefined) {\n\t\t\t\tthrow new BrowserError('Browser HAR path requires a configured writer')\n\t\t\t}\n\t\t\tawait this.#writer.write(this.#options.path, textToBytes(JSON.stringify(har, undefined, 2)))\n\t\t}\n\t\treturn har\n\t}\n\n\tasync replay(har: BrowserHAR, options?: BrowserHARReplayOptions): Promise<void> {\n\t\tvalidateBrowserHAR(har)\n\t\tif (this.#archive !== undefined) await this.#network.unroute(this.#replayHandler)\n\t\tthis.#archive = har\n\t\tthis.#fallback = options?.fallback === true\n\t\ttry {\n\t\t\tawait this.#network.route({}, this.#replayHandler)\n\t\t} catch (error) {\n\t\t\tthis.#archive = undefined\n\t\t\tthis.#fallback = false\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync clear(): Promise<void> {\n\t\tif (this.#recording) await this.stop()\n\t\tconst replaying = this.#archive !== undefined\n\t\tthis.#archive = undefined\n\t\tthis.#fallback = false\n\t\tif (replaying) await this.#network.unroute(this.#replayHandler)\n\t\tthis.#entries.length = 0\n\t\tthis.#pending.clear()\n\t}\n\n\t#handleRequest(request: BrowserRequest): void {\n\t\tif (!this.#recording) return\n\t\tthis.#pending.set(request.id, {\n\t\t\trequest,\n\t\t\tstarted: request.walltime === undefined ? Date.now() : request.walltime * 1000,\n\t\t\tresponse: undefined,\n\t\t})\n\t}\n\n\t#handleResponse(response: BrowserResponse): void {\n\t\tconst pending = this.#pending.get(response.id)\n\t\tif (pending === undefined) return\n\t\tthis.#pending.set(response.id, {\n\t\t\trequest: pending.request,\n\t\t\tstarted: pending.started,\n\t\t\tresponse,\n\t\t})\n\t}\n\n\t#handleFailure(failure: BrowserRequestFailure): void {\n\t\tconst pending = this.#pending.get(failure.id)\n\t\tif (pending === undefined) return\n\t\tthis.#pending.delete(failure.id)\n\t\tthis.#entries.push(\n\t\t\tcreateBrowserHAREntry(\n\t\t\t\tpending,\n\t\t\t\tMath.max(0, Date.now() - pending.started),\n\t\t\t\tundefined,\n\t\t\t\tfailure.error,\n\t\t\t),\n\t\t)\n\t}\n\n\t#handleFinish(id: string): void {\n\t\tthis.#track(this.#complete(id))\n\t}\n\n\tasync #handleReplay(route: Parameters<BrowserRouteHandler>[0]): Promise<void> {\n\t\tconst entry = this.#archive?.log.entries.find(\n\t\t\t(candidate) =>\n\t\t\t\tcandidate.request.url === route.request.url &&\n\t\t\t\tcandidate.request.method === route.request.method,\n\t\t)\n\t\tif (entry === undefined || entry.response.status === 0) {\n\t\t\tif (this.#fallback) await route.continue()\n\t\t\telse await route.abort('Failed')\n\t\t\treturn\n\t\t}\n\t\tconst body =\n\t\t\tentry.response.content.text === undefined\n\t\t\t\t? undefined\n\t\t\t\t: entry.response.content.encoding === 'base64'\n\t\t\t\t\t? decodeBase64(entry.response.content.text)\n\t\t\t\t\t: entry.response.content.text\n\t\tawait route.fulfill({\n\t\t\tstatus: entry.response.status,\n\t\t\tphrase: entry.response.statusText,\n\t\t\theaders: browserHARHeadersToRecord(entry.response.headers),\n\t\t\t...(body !== undefined ? { body } : {}),\n\t\t})\n\t}\n\n\tasync #complete(id: string): Promise<void> {\n\t\tconst pending = this.#pending.get(id)\n\t\tif (pending === undefined) return\n\t\tthis.#pending.delete(id)\n\t\tlet body: Uint8Array | undefined\n\t\tif (this.#options?.content === true && pending.response !== undefined) {\n\t\t\ttry {\n\t\t\t\tbody = await this.#network.body(id)\n\t\t\t} catch {\n\t\t\t\t// Some redirects, cached resources, and protocol errors have no retrievable body.\n\t\t\t}\n\t\t}\n\t\tthis.#entries.push(\n\t\t\tcreateBrowserHAREntry(pending, Math.max(0, Date.now() - pending.started), body),\n\t\t)\n\t}\n\n\t#track(task: Promise<void>): void {\n\t\tthis.#tasks.add(task)\n\t\tvoid task\n\t\t\t.catch((error: unknown) => {\n\t\t\t\tif (this.#failure === undefined) this.#failure = error\n\t\t\t})\n\t\t\t.finally(() => this.#tasks.delete(task))\n\t}\n}\n","import type {\n\tBrowserFrameInterface,\n\tBrowserRequest,\n\tBrowserRouteContinueOptions,\n\tBrowserRouteFulfillOptions,\n\tBrowserRouteInterface,\n} from './types.js'\nimport { browserHeadersToProtocol, encodeBase64, textToBytes } from './helpers.js'\nimport { BrowserError } from './errors.js'\nimport { isInteger, isString } from '@orkestrel/contract'\n\n/**\n * Represents one paused request that can be aborted, continued, or fulfilled exactly once.\n */\nexport class BrowserRoute implements BrowserRouteInterface {\n\treadonly #frame: BrowserFrameInterface\n\treadonly #id: string\n\treadonly #request: BrowserRequest\n\t#handled = false\n\t#handling = false\n\n\tconstructor(frame: BrowserFrameInterface, id: string, request: BrowserRequest) {\n\t\tthis.#frame = frame\n\t\tthis.#id = id\n\t\tthis.#request = request\n\t}\n\n\tget id(): string {\n\t\treturn this.#id\n\t}\n\n\tget request(): BrowserRequest {\n\t\treturn this.#request\n\t}\n\n\tget handled(): boolean {\n\t\treturn this.#handled\n\t}\n\n\tasync abort(reason = 'Failed'): Promise<void> {\n\t\tthis.#assert()\n\t\tthis.#handling = true\n\t\ttry {\n\t\t\tawait this.#frame.send('Fetch.failRequest', {\n\t\t\t\trequestId: this.#id,\n\t\t\t\terrorReason: reason,\n\t\t\t})\n\t\t\tthis.#handled = true\n\t\t} finally {\n\t\t\tthis.#handling = false\n\t\t}\n\t}\n\n\tasync continue(options?: BrowserRouteContinueOptions): Promise<void> {\n\t\tthis.#assert()\n\t\tconst params: Record<string, unknown> = { requestId: this.#id }\n\t\tif (options?.url !== undefined) params['url'] = options.url\n\t\tif (options?.method !== undefined) params['method'] = options.method\n\t\tif (options?.headers !== undefined) {\n\t\t\tparams['headers'] = browserHeadersToProtocol(options.headers)\n\t\t}\n\t\tif (options?.post !== undefined) {\n\t\t\tparams['postData'] = encodeBase64(textToBytes(options.post))\n\t\t}\n\t\tthis.#handling = true\n\t\ttry {\n\t\t\tawait this.#frame.send('Fetch.continueRequest', params)\n\t\t\tthis.#handled = true\n\t\t} finally {\n\t\t\tthis.#handling = false\n\t\t}\n\t}\n\n\tasync fulfill(options: BrowserRouteFulfillOptions): Promise<void> {\n\t\tthis.#assert()\n\t\tconst status = options.status ?? 200\n\t\tif (!isInteger(status) || status < 100 || status > 999) {\n\t\t\tthrow new BrowserError('Browser route status must be an integer from 100 to 999', undefined, {\n\t\t\t\tstatus,\n\t\t\t})\n\t\t}\n\t\tconst params: Record<string, unknown> = {\n\t\t\trequestId: this.#id,\n\t\t\tresponseCode: status,\n\t\t}\n\t\tif (options.phrase !== undefined) params['responsePhrase'] = options.phrase\n\t\tif (options.headers !== undefined) {\n\t\t\tparams['responseHeaders'] = browserHeadersToProtocol(options.headers)\n\t\t}\n\t\tif (options.body !== undefined) {\n\t\t\tparams['body'] = encodeBase64(\n\t\t\t\tisString(options.body) ? textToBytes(options.body) : options.body,\n\t\t\t)\n\t\t}\n\t\tthis.#handling = true\n\t\ttry {\n\t\t\tawait this.#frame.send('Fetch.fulfillRequest', params)\n\t\t\tthis.#handled = true\n\t\t} finally {\n\t\t\tthis.#handling = false\n\t\t}\n\t}\n\n\t#assert(): void {\n\t\tif (this.#handled || this.#handling) throw new BrowserError('Browser route is already handled')\n\t}\n}\n","import type {\n\tBrowserWebSocketEventMap,\n\tBrowserWebSocketFrame,\n\tBrowserWebSocketInterface,\n} from './types.js'\nimport type { EmitterInterface } from '@orkestrel/emitter'\nimport { Emitter } from '@orkestrel/emitter'\n\n/**\n * Represents an observable WebSocket connection reconstructed from Network-domain events.\n *\n * @example\n * ```ts\n * import { BrowserWebSocket } from '@orkestrel/browser'\n *\n * const socket = new BrowserWebSocket('request-1', 'wss://example.com/live')\n * socket.emitter.on('receive', (frame) => log(frame.data))\n * ```\n */\nexport class BrowserWebSocket implements BrowserWebSocketInterface {\n\treadonly #emitter: Emitter<BrowserWebSocketEventMap>\n\treadonly #id: string\n\treadonly #url: string\n\t#closed = false\n\n\tconstructor(id: string, url: string) {\n\t\tthis.#id = id\n\t\tthis.#url = url\n\t\tthis.#emitter = new Emitter()\n\t}\n\n\tget emitter(): EmitterInterface<BrowserWebSocketEventMap> {\n\t\treturn this.#emitter\n\t}\n\n\tget id(): string {\n\t\treturn this.#id\n\t}\n\n\tget url(): string {\n\t\treturn this.#url\n\t}\n\n\treceive(frame: BrowserWebSocketFrame): void {\n\t\tif (!this.#closed) this.#emitter.emit('receive', frame)\n\t}\n\n\ttransmit(frame: BrowserWebSocketFrame): void {\n\t\tif (!this.#closed) this.#emitter.emit('transmit', frame)\n\t}\n\n\tfail(message: string): void {\n\t\tif (!this.#closed) this.#emitter.emit('error', message)\n\t}\n\n\tclose(timestamp: number): void {\n\t\tif (this.#closed) return\n\t\tthis.#closed = true\n\t\tthis.#emitter.emit('close', timestamp)\n\t\tthis.#emitter.destroy()\n\t}\n}\n","import type {\n\tBrowserCredentials,\n\tBrowserFrameInterface,\n\tBrowserHARManagerInterface,\n\tBrowserNetworkEventMap,\n\tBrowserNetworkManagerInterface,\n\tBrowserRouteDefinition,\n\tBrowserRouteHandler,\n\tBrowserRouteQuery,\n\tBrowserWriterInterface,\n} from './types.js'\nimport type { EmitterInterface } from '@orkestrel/emitter'\nimport { BrowserTransition } from './BrowserTransition.js'\nimport { BrowserHARManager } from './BrowserHARManager.js'\nimport { BrowserRoute } from './BrowserRoute.js'\nimport { BrowserWebSocket } from './BrowserWebSocket.js'\nimport {\n\tbytesToText,\n\tdecodeBase64,\n\tmatchesBrowserRoute,\n\tsettleBrowserTeardown,\n\ttextToBytes,\n} from './helpers.js'\nimport {\n\tparseBrowserRequest,\n\tparseBrowserRequestFailure,\n\tparseBrowserResponse,\n\tparseBrowserWebSocketFrame,\n} from './parsers.js'\nimport { BrowserError } from './errors.js'\nimport { attempt, isFiniteNumber, isRecord, isString } from '@orkestrel/contract'\nimport { Emitter } from '@orkestrel/emitter'\n\n/**\n * Drives the page-scoped Network and Fetch domain lifecycle.\n *\n * @example\n * ```ts\n * import { BrowserNetworkManager } from '@orkestrel/browser'\n *\n * const network = new BrowserNetworkManager(page)\n * await network.start()\n * network.emitter.on('response', (response) => log(response.status))\n * await network.destroy()\n * ```\n */\nexport class BrowserNetworkManager implements BrowserNetworkManagerInterface {\n\treadonly #frame: BrowserFrameInterface\n\treadonly #emitter: Emitter<BrowserNetworkEventMap>\n\treadonly #har: BrowserHARManager\n\treadonly #routes: BrowserRouteDefinition[] = []\n\treadonly #sockets: Map<string, BrowserWebSocket> = new Map()\n\t#credentials: BrowserCredentials | undefined\n\t#started = false\n\t#intercepting = false\n\t#destroyed = false\n\treadonly #starting: BrowserTransition = new BrowserTransition()\n\treadonly #requestHandler = this.#handleRequest.bind(this)\n\treadonly #responseHandler = this.#handleResponse.bind(this)\n\treadonly #failureHandler = this.#handleFailure.bind(this)\n\treadonly #finishHandler = this.#handleFinish.bind(this)\n\treadonly #pausedHandler = this.#handlePause.bind(this)\n\treadonly #authHandler = this.#handleAuth.bind(this)\n\treadonly #socketHandler = this.#handleSocket.bind(this)\n\treadonly #socketReceiveHandler = this.#handleSocketReceive.bind(this)\n\treadonly #socketTransmitHandler = this.#handleSocketTransmit.bind(this)\n\treadonly #socketErrorHandler = this.#handleSocketError.bind(this)\n\treadonly #socketCloseHandler = this.#handleSocketClose.bind(this)\n\n\tconstructor(frame: BrowserFrameInterface, writer?: BrowserWriterInterface) {\n\t\tthis.#frame = frame\n\t\tthis.#emitter = new Emitter()\n\t\tthis.#har = new BrowserHARManager(this, writer)\n\t}\n\n\tget emitter(): EmitterInterface<BrowserNetworkEventMap> {\n\t\treturn this.#emitter\n\t}\n\n\tget har(): BrowserHARManagerInterface {\n\t\treturn this.#har\n\t}\n\n\tasync start(): Promise<void> {\n\t\tif (this.#destroyed) throw new BrowserError('Browser network manager is destroyed')\n\t\tif (this.#started) return\n\t\tconst active = this.#starting.pending\n\t\tif (active !== undefined) {\n\t\t\tawait active\n\t\t\treturn\n\t\t}\n\t\tawait this.#starting.execute(() => this.#start())\n\t}\n\n\tasync body(id: string): Promise<Uint8Array> {\n\t\tawait this.start()\n\t\tconst result = await this.#frame.send('Network.getResponseBody', { requestId: id })\n\t\tif (!isRecord(result) || !isString(result['body'])) {\n\t\t\tthrow new BrowserError('Browser response body is malformed', undefined, { id })\n\t\t}\n\t\treturn result['base64Encoded'] === true\n\t\t\t? decodeBase64(result['body'])\n\t\t\t: textToBytes(result['body'])\n\t}\n\n\tasync text(id: string): Promise<string> {\n\t\treturn bytesToText(await this.body(id))\n\t}\n\n\tasync json(id: string): Promise<unknown> {\n\t\tconst text = await this.text(id)\n\t\tconst result = attempt<unknown>(() => JSON.parse(text))\n\t\tif (result.success) return result.value\n\t\tthrow new BrowserError('Browser response body is not valid JSON', 'BROWSER_JSON_ERROR', {\n\t\t\tid,\n\t\t\terror: result.error,\n\t\t})\n\t}\n\n\tasync route(query: BrowserRouteQuery, handler: BrowserRouteHandler): Promise<void> {\n\t\tawait this.start()\n\t\tconst definition = { query, handler }\n\t\tthis.#routes.push(definition)\n\t\ttry {\n\t\t\tawait this.#configure()\n\t\t} catch (error) {\n\t\t\tthis.#routes.splice(this.#routes.indexOf(definition), 1)\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync unroute(handler?: BrowserRouteHandler): Promise<void> {\n\t\tif (handler === undefined) {\n\t\t\tthis.#routes.length = 0\n\t\t} else {\n\t\t\tfor (let index = this.#routes.length - 1; index >= 0; index -= 1) {\n\t\t\t\tif (this.#routes[index]?.handler === handler) this.#routes.splice(index, 1)\n\t\t\t}\n\t\t}\n\t\tif (this.#started && !this.#destroyed) await this.#configure()\n\t}\n\n\tasync headers(headers: Readonly<Record<string, string>>): Promise<void> {\n\t\tawait this.start()\n\t\tawait this.#frame.send('Network.setExtraHTTPHeaders', { headers })\n\t}\n\n\tasync offline(offline: boolean): Promise<void> {\n\t\tawait this.start()\n\t\tawait this.#frame.send('Network.emulateNetworkConditions', {\n\t\t\toffline,\n\t\t\tlatency: 0,\n\t\t\tdownloadThroughput: -1,\n\t\t\tuploadThroughput: -1,\n\t\t})\n\t}\n\n\tasync credentials(credentials?: BrowserCredentials): Promise<void> {\n\t\tawait this.start()\n\t\tconst previous = this.#credentials\n\t\tthis.#credentials = credentials\n\t\ttry {\n\t\t\tawait this.#configure()\n\t\t} catch (error) {\n\t\t\tthis.#credentials = previous\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync destroy(): Promise<void> {\n\t\tif (this.#destroyed) return\n\t\tthis.#destroyed = true\n\t\tconst failure = await settleBrowserTeardown(\n\t\t\t() => this.#har.clear(),\n\t\t\tasync () => {\n\t\t\t\tif (this.#intercepting) await this.#frame.send('Fetch.disable')\n\t\t\t},\n\t\t\tasync () => {\n\t\t\t\tif (this.#started) await this.#frame.send('Network.disable')\n\t\t\t},\n\t\t\t() => this.#unsubscribe(),\n\t\t)\n\t\tfor (const socket of this.#sockets.values()) socket.close(Date.now() / 1000)\n\t\tthis.#sockets.clear()\n\t\tthis.#routes.length = 0\n\t\tthis.#emitter.destroy()\n\t\tif (failure !== undefined) throw failure\n\t}\n\n\t#handleRequest(params: Readonly<Record<string, unknown>>): void {\n\t\tconst request = parseBrowserRequest(params)\n\t\tif (request !== undefined) this.#emitter.emit('request', request)\n\t}\n\n\t#handleResponse(params: Readonly<Record<string, unknown>>): void {\n\t\tconst response = parseBrowserResponse(params)\n\t\tif (response !== undefined) this.#emitter.emit('response', response)\n\t}\n\n\t#handleFailure(params: Readonly<Record<string, unknown>>): void {\n\t\tconst failure = parseBrowserRequestFailure(params)\n\t\tif (failure !== undefined) this.#emitter.emit('failure', failure)\n\t}\n\n\t#handleFinish(params: Readonly<Record<string, unknown>>): void {\n\t\tif (isString(params['requestId'])) this.#emitter.emit('finish', params['requestId'])\n\t}\n\n\t#handlePause(params: Readonly<Record<string, unknown>>): void {\n\t\tvoid this.#route(params).catch(() => undefined)\n\t}\n\n\t#handleAuth(params: Readonly<Record<string, unknown>>): void {\n\t\tvoid this.#authenticate(params).catch(() => undefined)\n\t}\n\n\t#handleSocket(params: Readonly<Record<string, unknown>>): void {\n\t\tif (!isString(params['requestId']) || !isString(params['url'])) return\n\t\tconst socket = new BrowserWebSocket(params['requestId'], params['url'])\n\t\tthis.#sockets.set(socket.id, socket)\n\t\tthis.#emitter.emit('socket', socket)\n\t}\n\n\t#handleSocketReceive(params: Readonly<Record<string, unknown>>): void {\n\t\tconst socket = isString(params['requestId'])\n\t\t\t? this.#sockets.get(params['requestId'])\n\t\t\t: undefined\n\t\tconst frame = parseBrowserWebSocketFrame(params)\n\t\tif (socket !== undefined && frame !== undefined) socket.receive(frame)\n\t}\n\n\t#handleSocketTransmit(params: Readonly<Record<string, unknown>>): void {\n\t\tconst socket = isString(params['requestId'])\n\t\t\t? this.#sockets.get(params['requestId'])\n\t\t\t: undefined\n\t\tconst frame = parseBrowserWebSocketFrame(params)\n\t\tif (socket !== undefined && frame !== undefined) socket.transmit(frame)\n\t}\n\n\t#handleSocketError(params: Readonly<Record<string, unknown>>): void {\n\t\tconst socket = isString(params['requestId'])\n\t\t\t? this.#sockets.get(params['requestId'])\n\t\t\t: undefined\n\t\tif (socket !== undefined && isString(params['errorMessage']))\n\t\t\tsocket.fail(params['errorMessage'])\n\t}\n\n\t#handleSocketClose(params: Readonly<Record<string, unknown>>): void {\n\t\tif (!isString(params['requestId'])) return\n\t\tconst socket = this.#sockets.get(params['requestId'])\n\t\tif (socket === undefined) return\n\t\tthis.#sockets.delete(params['requestId'])\n\t\tsocket.close(isFiniteNumber(params['timestamp']) ? params['timestamp'] : Date.now() / 1000)\n\t}\n\n\tasync #start(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.#subscribe()\n\t\t\tawait this.#frame.send('Network.enable')\n\t\t\tthis.#started = true\n\t\t\tawait this.#configure()\n\t\t} catch (error) {\n\t\t\tthis.#started = false\n\t\t\tthis.#intercepting = false\n\t\t\tawait this.#frame.send('Fetch.disable').catch(() => undefined)\n\t\t\tawait this.#frame.send('Network.disable').catch(() => undefined)\n\t\t\tawait this.#unsubscribe().catch(() => undefined)\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync #configure(): Promise<void> {\n\t\tconst enabled = this.#routes.length > 0 || this.#credentials !== undefined\n\t\tif (!enabled) {\n\t\t\tif (this.#intercepting) {\n\t\t\t\tawait this.#frame.send('Fetch.disable')\n\t\t\t\tthis.#intercepting = false\n\t\t\t}\n\t\t\treturn\n\t\t}\n\t\tawait this.#frame.send('Fetch.enable', {\n\t\t\tpatterns: this.#routes.map((definition) => ({\n\t\t\t\turlPattern: definition.query.url ?? '*',\n\t\t\t\tresourceType: definition.query.resource,\n\t\t\t\trequestStage: 'Request',\n\t\t\t})),\n\t\t\thandleAuthRequests: this.#credentials !== undefined,\n\t\t})\n\t\tthis.#intercepting = true\n\t}\n\n\tasync #route(params: Readonly<Record<string, unknown>>): Promise<void> {\n\t\tconst request = parseBrowserRequest(params)\n\t\tif (request === undefined) {\n\t\t\tif (isString(params['requestId'])) {\n\t\t\t\tawait this.#frame.send('Fetch.failRequest', {\n\t\t\t\t\trequestId: params['requestId'],\n\t\t\t\t\terrorReason: 'Failed',\n\t\t\t\t})\n\t\t\t}\n\t\t\treturn\n\t\t}\n\t\tconst definition = this.#routes.find((candidate) =>\n\t\t\tmatchesBrowserRoute(request, candidate.query),\n\t\t)\n\t\tif (definition === undefined) {\n\t\t\tawait this.#frame.send('Fetch.continueRequest', { requestId: request.id })\n\t\t\treturn\n\t\t}\n\t\tconst route = new BrowserRoute(this.#frame, request.id, request)\n\t\ttry {\n\t\t\tawait definition.handler(route)\n\t\t\tif (!route.handled) await route.continue()\n\t\t} catch {\n\t\t\tif (!route.handled) await route.abort('Failed').catch(() => undefined)\n\t\t}\n\t}\n\n\tasync #authenticate(params: Readonly<Record<string, unknown>>): Promise<void> {\n\t\tconst id = params['requestId']\n\t\tif (!isString(id)) return\n\t\tconst credentials = this.#credentials\n\t\tawait this.#frame.send('Fetch.continueWithAuth', {\n\t\t\trequestId: id,\n\t\t\tauthChallengeResponse:\n\t\t\t\tcredentials === undefined\n\t\t\t\t\t? { response: 'Default' }\n\t\t\t\t\t: {\n\t\t\t\t\t\t\tresponse: 'ProvideCredentials',\n\t\t\t\t\t\t\tusername: credentials.username,\n\t\t\t\t\t\t\tpassword: credentials.password,\n\t\t\t\t\t\t},\n\t\t})\n\t}\n\n\tasync #subscribe(): Promise<void> {\n\t\tawait this.#frame.subscribe('Network.requestWillBeSent', this.#requestHandler)\n\t\tawait this.#frame.subscribe('Network.responseReceived', this.#responseHandler)\n\t\tawait this.#frame.subscribe('Network.loadingFailed', this.#failureHandler)\n\t\tawait this.#frame.subscribe('Network.loadingFinished', this.#finishHandler)\n\t\tawait this.#frame.subscribe('Fetch.requestPaused', this.#pausedHandler)\n\t\tawait this.#frame.subscribe('Fetch.authRequired', this.#authHandler)\n\t\tawait this.#frame.subscribe('Network.webSocketCreated', this.#socketHandler)\n\t\tawait this.#frame.subscribe('Network.webSocketFrameReceived', this.#socketReceiveHandler)\n\t\tawait this.#frame.subscribe('Network.webSocketFrameSent', this.#socketTransmitHandler)\n\t\tawait this.#frame.subscribe('Network.webSocketFrameError', this.#socketErrorHandler)\n\t\tawait this.#frame.subscribe('Network.webSocketClosed', this.#socketCloseHandler)\n\t}\n\n\tasync #unsubscribe(): Promise<void> {\n\t\tawait this.#frame.unsubscribe('Network.requestWillBeSent', this.#requestHandler)\n\t\tawait this.#frame.unsubscribe('Network.responseReceived', this.#responseHandler)\n\t\tawait this.#frame.unsubscribe('Network.loadingFailed', this.#failureHandler)\n\t\tawait this.#frame.unsubscribe('Network.loadingFinished', this.#finishHandler)\n\t\tawait this.#frame.unsubscribe('Fetch.requestPaused', this.#pausedHandler)\n\t\tawait this.#frame.unsubscribe('Fetch.authRequired', this.#authHandler)\n\t\tawait this.#frame.unsubscribe('Network.webSocketCreated', this.#socketHandler)\n\t\tawait this.#frame.unsubscribe('Network.webSocketFrameReceived', this.#socketReceiveHandler)\n\t\tawait this.#frame.unsubscribe('Network.webSocketFrameSent', this.#socketTransmitHandler)\n\t\tawait this.#frame.unsubscribe('Network.webSocketFrameError', this.#socketErrorHandler)\n\t\tawait this.#frame.unsubscribe('Network.webSocketClosed', this.#socketCloseHandler)\n\t}\n}\n","import type {\n\tBrowserNavigationManagerInterface,\n\tBrowserNavigationWait,\n\tBrowserNavigationWaitOptions,\n\tBrowserPageInterface,\n} from './types.js'\nimport { BROWSER_DEFAULT_TIMEOUT_MS, BROWSER_WAIT_POLL_INTERVAL_MS } from './constants.js'\nimport { compileFunctionWaitExpression } from './compilers.js'\nimport { matchesBrowserURL, validateBrowserTimeout } from './helpers.js'\nimport { BrowserError } from './errors.js'\n\n/**\n * Runs URL and page-predicate waits resilient to ordinary navigation events.\n *\n * @example\n * ```ts\n * import { BrowserNavigationManager } from '@orkestrel/browser'\n *\n * const navigation = new BrowserNavigationManager(page)\n * const url = await navigation.wait('https://example.com/checkout', { timeout: 5_000 })\n * await navigation.until('document.readyState === \"complete\"')\n * ```\n */\nexport class BrowserNavigationManager implements BrowserNavigationManagerInterface {\n\treadonly #page: BrowserPageInterface\n\treadonly #waits: Map<symbol, BrowserNavigationWait> = new Map()\n\treadonly #navigateHandler = this.#handleNavigate.bind(this)\n\treadonly #closeHandler = this.#handleClose.bind(this)\n\n\tconstructor(page: BrowserPageInterface) {\n\t\tthis.#page = page\n\t\tthis.#page.emitter.on('navigate', this.#navigateHandler)\n\t\tthis.#page.emitter.on('close', this.#closeHandler)\n\t}\n\n\tasync wait(pattern: string, options?: BrowserNavigationWaitOptions): Promise<string> {\n\t\tconst timeout = this.#timeout(options)\n\t\tif (matchesBrowserURL(this.#page.url, pattern)) return this.#page.url\n\t\tconst deferred = Promise.withResolvers<string>()\n\t\tconst id = Symbol(pattern)\n\t\tconst timer = setTimeout(() => {\n\t\t\tthis.#waits.delete(id)\n\t\t\tdeferred.reject(\n\t\t\t\tnew BrowserError('Browser URL wait timed out', 'BROWSER_NAVIGATION_TIMEOUT', {\n\t\t\t\t\tpattern,\n\t\t\t\t\ttimeout,\n\t\t\t\t}),\n\t\t\t)\n\t\t}, timeout)\n\t\tthis.#waits.set(id, {\n\t\t\tpattern,\n\t\t\ttimer,\n\t\t\tresolve: deferred.resolve,\n\t\t\treject: deferred.reject,\n\t\t})\n\t\treturn await deferred.promise\n\t}\n\n\tasync until(expression: string, options?: BrowserNavigationWaitOptions): Promise<unknown> {\n\t\tconst timeout = this.#timeout(options)\n\t\tconst result = await this.#page.evaluate(\n\t\t\tcompileFunctionWaitExpression(expression, timeout),\n\t\t\ttimeout + BROWSER_WAIT_POLL_INTERVAL_MS,\n\t\t)\n\t\tif (result !== false) return result\n\t\tthrow new BrowserError('Browser predicate wait timed out', 'BROWSER_NAVIGATION_TIMEOUT', {\n\t\t\texpression,\n\t\t\ttimeout,\n\t\t})\n\t}\n\n\t#handleNavigate(url: string): void {\n\t\tfor (const [id, wait] of this.#waits) {\n\t\t\tif (!matchesBrowserURL(url, wait.pattern)) continue\n\t\t\tclearTimeout(wait.timer)\n\t\t\tthis.#waits.delete(id)\n\t\t\twait.resolve(url)\n\t\t}\n\t}\n\n\t#handleClose(): void {\n\t\tfor (const [id, wait] of this.#waits) {\n\t\t\tclearTimeout(wait.timer)\n\t\t\tthis.#waits.delete(id)\n\t\t\twait.reject(new BrowserError('Browser URL wait ended because the page closed'))\n\t\t}\n\t}\n\n\t#timeout(options?: BrowserNavigationWaitOptions): number {\n\t\tconst timeout = options?.timeout ?? BROWSER_DEFAULT_TIMEOUT_MS\n\t\tvalidateBrowserTimeout(timeout)\n\t\treturn timeout\n\t}\n}\n","import type {\n\tBrowserBindingHandler,\n\tBrowserFrameInterface,\n\tBrowserScriptEntry,\n\tBrowserScriptManagerInterface,\n} from './types.js'\nimport {\n\tcompileBrowserBindingCleanup,\n\tcompileBrowserBindingResult,\n\tcompileBrowserBindingSource,\n} from './compilers.js'\nimport { readBrowserScriptIdentifier } from './helpers.js'\nimport { parseBrowserBindingCall } from './parsers.js'\nimport { BrowserError } from './errors.js'\n\n/**\n * Installs new-document scripts and promise-based host functions for one page.\n *\n * @example\n * ```ts\n * import { BrowserScriptManager } from '@orkestrel/browser'\n *\n * const scripts = new BrowserScriptManager(page)\n * const id = await scripts.add('window.__ready = true')\n * await scripts.remove(id)\n * ```\n */\nexport class BrowserScriptManager implements BrowserScriptManagerInterface {\n\treadonly #frame: BrowserFrameInterface\n\treadonly #bindings: Map<string, BrowserBindingHandler> = new Map()\n\treadonly #scripts: Map<string, BrowserScriptEntry> = new Map()\n\t#subscribed = false\n\t#destroyed = false\n\treadonly #bindingHandler = this.#handleBinding.bind(this)\n\n\tconstructor(frame: BrowserFrameInterface) {\n\t\tthis.#frame = frame\n\t}\n\n\tasync add(source: string): Promise<string> {\n\t\tthis.#assert()\n\t\tconst result = await this.#frame.send('Page.addScriptToEvaluateOnNewDocument', { source })\n\t\tconst id = readBrowserScriptIdentifier(result)\n\t\tthis.#scripts.set(id, { source, binding: undefined })\n\t\ttry {\n\t\t\tawait this.#frame.evaluate(`(() => { ${source}\\n })()`)\n\t\t\treturn id\n\t\t} catch (error) {\n\t\t\tawait this.#frame\n\t\t\t\t.send('Page.removeScriptToEvaluateOnNewDocument', { identifier: id })\n\t\t\t\t.catch(() => undefined)\n\t\t\tthis.#scripts.delete(id)\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync remove(id: string): Promise<void> {\n\t\tthis.#assert()\n\t\tif (!this.#scripts.has(id)) return\n\t\tawait this.#frame.send('Page.removeScriptToEvaluateOnNewDocument', { identifier: id })\n\t\tthis.#scripts.delete(id)\n\t}\n\n\tasync expose(name: string, handler: BrowserBindingHandler): Promise<void> {\n\t\tthis.#assert()\n\t\tif (!/^[$A-Z_a-z][$\\w]*$/.test(name)) {\n\t\t\tthrow new BrowserError(\n\t\t\t\t'Browser binding name must be a valid JavaScript identifier',\n\t\t\t\tundefined,\n\t\t\t\t{\n\t\t\t\t\tname,\n\t\t\t\t},\n\t\t\t)\n\t\t}\n\t\tif (this.#bindings.has(name)) {\n\t\t\tthrow new BrowserError('Browser binding already exists', undefined, { name })\n\t\t}\n\t\tconst subscribed = this.#subscribed\n\t\tif (!subscribed) {\n\t\t\tawait this.#frame.subscribe('Runtime.bindingCalled', this.#bindingHandler)\n\t\t\tthis.#subscribed = true\n\t\t}\n\t\tlet added = false\n\t\ttry {\n\t\t\tawait this.#frame.send('Runtime.addBinding', { name })\n\t\t\tadded = true\n\t\t\tconst id = await this.add(compileBrowserBindingSource(name))\n\t\t\tconst entry = this.#scripts.get(id)\n\t\t\tif (entry === undefined) {\n\t\t\t\tthrow new BrowserError('Browser binding script registration was lost', undefined, {\n\t\t\t\t\tname,\n\t\t\t\t})\n\t\t\t}\n\t\t\tthis.#scripts.set(id, { source: entry.source, binding: name })\n\t\t\tthis.#bindings.set(name, handler)\n\t\t} catch (error) {\n\t\t\tif (added) {\n\t\t\t\tawait this.#frame.send('Runtime.removeBinding', { name }).catch(() => undefined)\n\t\t\t}\n\t\t\tif (!subscribed && this.#bindings.size === 0) {\n\t\t\t\tawait this.#frame\n\t\t\t\t\t.unsubscribe('Runtime.bindingCalled', this.#bindingHandler)\n\t\t\t\t\t.catch(() => undefined)\n\t\t\t\tthis.#subscribed = false\n\t\t\t}\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync revoke(name: string): Promise<void> {\n\t\tthis.#assert()\n\t\tif (!this.#bindings.has(name)) return\n\t\tfor (const [id, entry] of this.#scripts) {\n\t\t\tif (entry.binding !== name) continue\n\t\t\tawait this.#frame.send('Page.removeScriptToEvaluateOnNewDocument', { identifier: id })\n\t\t\tthis.#scripts.delete(id)\n\t\t}\n\t\tawait this.#frame.evaluate(compileBrowserBindingCleanup(name))\n\t\tawait this.#frame.send('Runtime.removeBinding', { name })\n\t\tthis.#bindings.delete(name)\n\t}\n\n\tasync destroy(): Promise<void> {\n\t\tif (this.#destroyed) return\n\t\tfor (const name of [...this.#bindings.keys()]) {\n\t\t\tawait this.revoke(name).catch(() => undefined)\n\t\t}\n\t\tfor (const id of [...this.#scripts.keys()]) {\n\t\t\tawait this.remove(id).catch(() => undefined)\n\t\t}\n\t\tif (this.#subscribed) {\n\t\t\tawait this.#frame\n\t\t\t\t.unsubscribe('Runtime.bindingCalled', this.#bindingHandler)\n\t\t\t\t.catch(() => undefined)\n\t\t}\n\t\tthis.#subscribed = false\n\t\tthis.#destroyed = true\n\t}\n\n\tasync #call(params: Readonly<Record<string, unknown>>): Promise<void> {\n\t\tconst call = parseBrowserBindingCall(params)\n\t\tif (call === undefined) return\n\t\tconst handler = this.#bindings.get(call.name)\n\t\tif (handler === undefined) return\n\t\ttry {\n\t\t\tconst value = await handler(...call.args)\n\t\t\tawait this.#frame.send('Runtime.evaluate', {\n\t\t\t\texpression: compileBrowserBindingResult(call.name, call.id, true, value),\n\t\t\t\tcontextId: call.context,\n\t\t\t\tawaitPromise: true,\n\t\t\t})\n\t\t} catch (error) {\n\t\t\tawait this.#frame.send('Runtime.evaluate', {\n\t\t\t\texpression: compileBrowserBindingResult(call.name, call.id, false, String(error)),\n\t\t\t\tcontextId: call.context,\n\t\t\t\tawaitPromise: true,\n\t\t\t})\n\t\t}\n\t}\n\n\t#handleBinding(params: Readonly<Record<string, unknown>>): void {\n\t\tvoid this.#call(params).catch(() => undefined)\n\t}\n\n\t#assert(): void {\n\t\tif (this.#destroyed) throw new BrowserError('Browser script manager is destroyed')\n\t}\n}\n","import type {\n\tBrowserDocument,\n\tBrowserNode,\n\tBrowserNodePredicate,\n\tBrowserNodeQuery,\n\tBrowserSiblingRelation,\n\tBrowserSnapshotInput,\n\tBrowserSnapshotInterface,\n\tBrowserWalkOptions,\n} from './types.js'\nimport { isInteger } from '@orkestrel/contract'\nimport { BrowserError } from './errors.js'\nimport { isBrowserNodeQuery, matchesBrowserNode } from './helpers.js'\n\n/**\n * Represents a navigable, serializable browser DOM snapshot.\n *\n * @example\n * ```ts\n * import { BrowserSnapshot } from '@orkestrel/browser'\n *\n * const snapshot = new BrowserSnapshot({ documents, styles: ['display'] })\n * const main = snapshot.find({ name: 'main', visible: true })\n * ```\n */\nexport class BrowserSnapshot implements BrowserSnapshotInterface {\n\t// Documents are fixed and frozen at construction, so the derived owner index cannot go stale.\n\t#owners: ReadonlyMap<number, BrowserNode> | undefined\n\treadonly documents: readonly BrowserDocument[]\n\treadonly styles: readonly string[]\n\n\tconstructor(input: BrowserSnapshotInput) {\n\t\tthis.documents = Object.freeze([...input.documents])\n\t\tthis.styles = Object.freeze([...input.styles])\n\t}\n\n\twalk(options?: BrowserWalkOptions): Generator<BrowserNode, void, unknown> {\n\t\treturn options?.order === 'breadth' ? this.#breadth(options.root) : this.#depth(options?.root)\n\t}\n\n\t*descendants(node: BrowserNode): Generator<BrowserNode, void, unknown> {\n\t\tlet first = true\n\t\tfor (const descendant of this.#depth(node)) {\n\t\t\tif (first) {\n\t\t\t\tfirst = false\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tyield descendant\n\t\t}\n\t}\n\n\tdocument(node: BrowserNode): BrowserDocument | undefined {\n\t\treturn this.documents.find((document) => document.index === node.document)\n\t}\n\n\tchildren(node: BrowserNode): readonly BrowserNode[] {\n\t\tconst document = this.document(node)\n\t\tif (document === undefined) return []\n\t\tconst children = document.nodes.filter((candidate) => candidate.parent === node.index)\n\t\tif (node.content === undefined) return children\n\t\tconst content = this.documents.find((candidate) => candidate.index === node.content)\n\t\tif (content === undefined) return children\n\t\treturn [...children, ...content.nodes.filter((candidate) => candidate.parent === undefined)]\n\t}\n\n\tparent(node: BrowserNode): BrowserNode | undefined {\n\t\tconst document = this.document(node)\n\t\tif (document === undefined) return undefined\n\t\treturn node.parent === undefined ? this.#owner(node.document) : document.nodes[node.parent]\n\t}\n\n\tsiblings(node: BrowserNode, relation?: BrowserSiblingRelation): readonly BrowserNode[] {\n\t\tconst candidates = this.#candidates(node)\n\t\tconst index = candidates.findIndex(\n\t\t\t(candidate) => candidate.document === node.document && candidate.index === node.index,\n\t\t)\n\t\tif (relation === 'preceding') return index < 0 ? [] : candidates.slice(0, index)\n\t\tif (relation === 'following') return index < 0 ? [] : candidates.slice(index + 1)\n\t\treturn candidates.filter(\n\t\t\t(candidate) => candidate.document !== node.document || candidate.index !== node.index,\n\t\t)\n\t}\n\n\tancestors(node: BrowserNode): readonly BrowserNode[] {\n\t\tconst ancestors: BrowserNode[] = []\n\t\tconst visited = new Set<string>()\n\t\tlet current = node\n\n\t\twhile (true) {\n\t\t\tconst parent = this.parent(current)\n\t\t\tif (parent === undefined) break\n\t\t\tconst identity = this.#identity(parent)\n\t\t\tif (visited.has(identity)) break\n\t\t\tvisited.add(identity)\n\t\t\tancestors.push(parent)\n\t\t\tcurrent = parent\n\t\t}\n\t\treturn ancestors\n\t}\n\n\tcommon(first: BrowserNode, second: BrowserNode): BrowserNode | undefined {\n\t\tconst firstAncestors = this.#chain(first)\n\t\tconst secondAncestors = this.#chain(second)\n\t\tconst identities = new Set(firstAncestors.map((node) => this.#identity(node)))\n\t\treturn secondAncestors.find((node) => identities.has(this.#identity(node)))\n\t}\n\n\tdistance(first: BrowserNode, second: BrowserNode): number | undefined {\n\t\tconst common = this.common(first, second)\n\t\tif (common === undefined) return undefined\n\t\tconst identity = this.#identity(common)\n\t\tconst firstDistance = this.#chain(first).findIndex((node) => this.#identity(node) === identity)\n\t\tconst secondDistance = this.#chain(second).findIndex(\n\t\t\t(node) => this.#identity(node) === identity,\n\t\t)\n\t\tif (firstDistance < 0 || secondDistance < 0) return undefined\n\t\treturn firstDistance + secondDistance\n\t}\n\n\tfind(query: BrowserNodeQuery | BrowserNodePredicate): BrowserNode | undefined {\n\t\tfor (const node of this.walk()) {\n\t\t\tif (this.#match(node, query)) return node\n\t\t}\n\t\treturn undefined\n\t}\n\n\tfilter(query: BrowserNodeQuery | BrowserNodePredicate, limit?: number): readonly BrowserNode[] {\n\t\tif (limit !== undefined && (!isInteger(limit) || limit < 0)) {\n\t\t\tthrow new BrowserError(\n\t\t\t\t'Browser node result limit must be a non-negative integer',\n\t\t\t\tundefined,\n\t\t\t\t{\n\t\t\t\t\tlimit,\n\t\t\t\t},\n\t\t\t)\n\t\t}\n\t\tif (limit === 0) return []\n\t\tconst found: BrowserNode[] = []\n\t\tfor (const node of this.walk()) {\n\t\t\tif (!this.#match(node, query)) continue\n\t\t\tfound.push(node)\n\t\t\tif (limit !== undefined && found.length >= limit) break\n\t\t}\n\t\treturn found\n\t}\n\n\tclosest(\n\t\tnode: BrowserNode,\n\t\tquery: BrowserNodeQuery | BrowserNodePredicate,\n\t): BrowserNode | undefined {\n\t\tif (this.#match(node, query)) return node\n\t\tfor (const ancestor of this.ancestors(node)) {\n\t\t\tif (this.#match(ancestor, query)) return ancestor\n\t\t}\n\t\treturn undefined\n\t}\n\n\tpath(node: BrowserNode): string {\n\t\tconst document = this.document(node)\n\t\tif (document === undefined) return `document:${node.document} > node:${node.index}`\n\t\tconst chain = [...this.ancestors(node)].reverse()\n\t\tchain.push(node)\n\t\tconst segments: string[] = []\n\n\t\tfor (const current of chain) {\n\t\t\tif (current.category !== 1) {\n\t\t\t\tsegments.push(`${current.name.toLowerCase()}:${current.index}`)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tlet ordinal = 1\n\t\t\tif (current.parent !== undefined) {\n\t\t\t\tconst owner = this.document(current)\n\t\t\t\tfor (const sibling of owner?.nodes ?? []) {\n\t\t\t\t\tif (sibling.index >= current.index) break\n\t\t\t\t\tif (sibling.parent === current.parent && sibling.name === current.name) ordinal += 1\n\t\t\t\t}\n\t\t\t}\n\t\t\tsegments.push(`${current.name.toLowerCase()}:${ordinal}`)\n\t\t}\n\n\t\treturn `frame(${JSON.stringify(document.frame)}) > ${segments.join(' > ')}`\n\t}\n\n\t#roots(): readonly BrowserNode[] {\n\t\tconst roots: BrowserNode[] = []\n\t\tfor (const document of this.documents) {\n\t\t\troots.push(...document.nodes.filter((node) => node.parent === undefined))\n\t\t}\n\t\tfor (const document of this.documents) roots.push(...document.nodes)\n\t\treturn roots\n\t}\n\n\t#owner(document: number): BrowserNode | undefined {\n\t\tconst owners = this.#owners\n\t\tif (owners !== undefined) return owners.get(document)\n\t\tconst index = new Map<number, BrowserNode>()\n\t\tfor (const node of this.walk()) {\n\t\t\tif (node.content !== undefined && !index.has(node.content)) index.set(node.content, node)\n\t\t}\n\t\tthis.#owners = index\n\t\treturn index.get(document)\n\t}\n\n\t*#depth(root?: BrowserNode): Generator<BrowserNode, void, unknown> {\n\t\tconst visited = new Set<string>()\n\t\tfor (const seed of root === undefined ? this.#roots() : [root]) {\n\t\t\tconst stack: BrowserNode[] = [seed]\n\t\t\twhile (stack.length > 0) {\n\t\t\t\tconst node = stack.pop()\n\t\t\t\tif (node === undefined) break\n\t\t\t\tconst identity = this.#identity(node)\n\t\t\t\tif (visited.has(identity)) continue\n\t\t\t\tvisited.add(identity)\n\t\t\t\tyield node\n\n\t\t\t\tconst children = this.children(node)\n\t\t\t\tfor (let index = children.length - 1; index >= 0; index -= 1) {\n\t\t\t\t\tconst child = children[index]\n\t\t\t\t\tif (child !== undefined) stack.push(child)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t*#breadth(root?: BrowserNode): Generator<BrowserNode, void, unknown> {\n\t\tconst visited = new Set<string>()\n\t\tfor (const seed of root === undefined ? this.#roots() : [root]) {\n\t\t\tconst queue: BrowserNode[] = [seed]\n\t\t\tlet cursor = 0\n\t\t\twhile (cursor < queue.length) {\n\t\t\t\tconst node = queue[cursor]\n\t\t\t\tcursor += 1\n\t\t\t\tif (node === undefined) continue\n\t\t\t\tconst identity = this.#identity(node)\n\t\t\t\tif (visited.has(identity)) continue\n\t\t\t\tvisited.add(identity)\n\t\t\t\tyield node\n\t\t\t\tqueue.push(...this.children(node))\n\t\t\t}\n\t\t}\n\t}\n\n\t#candidates(node: BrowserNode): readonly BrowserNode[] {\n\t\tconst parent = this.parent(node)\n\t\treturn parent === undefined\n\t\t\t? (this.document(node)?.nodes.filter((candidate) => candidate.parent === undefined) ?? [])\n\t\t\t: this.children(parent)\n\t}\n\n\t#chain(node: BrowserNode): readonly BrowserNode[] {\n\t\treturn [node, ...this.ancestors(node)]\n\t}\n\n\t#match(node: BrowserNode, query: BrowserNodeQuery | BrowserNodePredicate): boolean {\n\t\treturn isBrowserNodeQuery(query) ? matchesBrowserNode(node, query) : query(node)\n\t}\n\n\t#identity(node: BrowserNode): string {\n\t\treturn `${node.document}:${node.index}`\n\t}\n}\n","import type { BrowserWorkerCategory, BrowserWorkerInterface, CDPClientInterface } from './types.js'\nimport { BROWSER_RESULT_LIMIT } from './constants.js'\nimport { compileGuardedEvaluateExpression } from './compilers.js'\nimport { readEvaluationResult } from './helpers.js'\nimport { BrowserError } from './errors.js'\n\n/**\n * Represents a dedicated, shared, or service worker attached through a flattened target session.\n */\nexport class BrowserWorker implements BrowserWorkerInterface {\n\treadonly #client: CDPClientInterface\n\treadonly #session: string\n\treadonly #id: string\n\treadonly #url: string\n\treadonly #category: BrowserWorkerCategory\n\t#closed = false\n\n\tconstructor(\n\t\tclient: CDPClientInterface,\n\t\tsession: string,\n\t\tid: string,\n\t\turl: string,\n\t\tcategory: BrowserWorkerCategory,\n\t) {\n\t\tthis.#client = client\n\t\tthis.#session = session\n\t\tthis.#id = id\n\t\tthis.#url = url\n\t\tthis.#category = category\n\t}\n\n\tget id(): string {\n\t\treturn this.#id\n\t}\n\n\tget url(): string {\n\t\treturn this.#url\n\t}\n\n\tget category(): BrowserWorkerCategory {\n\t\treturn this.#category\n\t}\n\n\tasync evaluate(expression: string, timeout?: number): Promise<unknown> {\n\t\tthis.#assert()\n\t\treturn readEvaluationResult(\n\t\t\tawait this.#client.send(\n\t\t\t\t'Runtime.evaluate',\n\t\t\t\t{\n\t\t\t\t\texpression: compileGuardedEvaluateExpression(expression, BROWSER_RESULT_LIMIT),\n\t\t\t\t\treturnByValue: true,\n\t\t\t\t\tawaitPromise: true,\n\t\t\t\t},\n\t\t\t\t{ session: this.#session, ...(timeout !== undefined ? { timeout } : {}) },\n\t\t\t),\n\t\t)\n\t}\n\n\tasync send(method: string, params?: Readonly<Record<string, unknown>>): Promise<unknown> {\n\t\tthis.#assert()\n\t\treturn await this.#client.send(method, params, { session: this.#session })\n\t}\n\n\tdetach(): void {\n\t\tthis.#closed = true\n\t}\n\n\tasync close(): Promise<void> {\n\t\tif (this.#closed) return\n\t\tthis.#closed = true\n\t\ttry {\n\t\t\tawait this.#client.send('Target.closeTarget', { targetId: this.#id })\n\t\t} catch {\n\t\t\t// The worker may already have terminated.\n\t\t}\n\t}\n\n\t#assert(): void {\n\t\tif (this.#closed) throw new BrowserError('Browser worker is closed')\n\t\tif (!this.#client.connected) throw new BrowserError('Browser worker is disconnected')\n\t}\n}\n","import type {\n\tBrowserCodegenInterface,\n\tBrowserCodegenOptions,\n\tBrowserClockInterface,\n\tBrowserDiagnosticsInterface,\n\tBrowserFrameInfo,\n\tBrowserFrameInterface,\n\tBrowserNavigationOptions,\n\tBrowserNavigationManagerInterface,\n\tBrowserNavigationResult,\n\tBrowserNavigationWatch,\n\tBrowserNetworkManagerInterface,\n\tBrowserPDFOptions,\n\tBrowserPDFResult,\n\tBrowserPageInterface,\n\tBrowserPageEventMap,\n\tBrowserPageOptions,\n\tBrowserResponse,\n\tBrowserScreenshotOptions,\n\tBrowserScreenshotResult,\n\tBrowserScriptManagerInterface,\n\tBrowserSnapshotInterface,\n\tBrowserSnapshotOptions,\n\tBrowserWaitUntil,\n\tBrowserWorkerCategory,\n\tBrowserAccessibilityInterface,\n\tCDPClientInterface,\n\tBrowserWriterInterface,\n} from './types.js'\nimport type { EmitterInterface } from '@orkestrel/emitter'\nimport { BrowserCodegen } from './BrowserCodegen.js'\nimport { BrowserTransition } from './BrowserTransition.js'\nimport { BrowserAccessibility } from './BrowserAccessibility.js'\nimport { BrowserClock } from './BrowserClock.js'\nimport { BrowserDiagnostics } from './BrowserDiagnostics.js'\nimport { BrowserDialog } from './BrowserDialog.js'\nimport { BrowserDownload } from './BrowserDownload.js'\nimport { BrowserFrame } from './BrowserFrame.js'\nimport { BrowserFileChooser } from './BrowserFileChooser.js'\nimport { BrowserNetworkManager } from './BrowserNetworkManager.js'\nimport { BrowserNavigationManager } from './BrowserNavigationManager.js'\nimport { BrowserScriptManager } from './BrowserScriptManager.js'\nimport { BrowserSnapshot } from './BrowserSnapshot.js'\nimport { BrowserWorker } from './BrowserWorker.js'\nimport { BrowserError } from './errors.js'\nimport {\n\tBROWSER_DEFAULT_TIMEOUT_MS,\n\tBROWSER_SNAPSHOT_NODE_LIMIT,\n\tBROWSER_STOP_LOADING_TIMEOUT_MS,\n} from './constants.js'\nimport {\n\tcompileScreenshotCleanupExpression,\n\tcompileScreenshotPreparationExpression,\n} from './compilers.js'\nimport {\n\tdecodeBase64,\n\treadBrowserSnapshot,\n\tbrowserPDFToParams,\n\tbrowserScreenshotToParams,\n\treadBrowserFrames,\n\trequireBrowserString,\n\tvalidateBrowserTimeout,\n} from './helpers.js'\nimport {\n\tparseBrowserConsoleMessage,\n\tparseBrowserDownloadProgress,\n\tparseBrowserDownloadStart,\n\tparseBrowserPageError,\n} from './parsers.js'\nimport { isArray, isFiniteNumber, isInteger, isRecord, isString } from '@orkestrel/contract'\nimport { Emitter } from '@orkestrel/emitter'\n\n/**\n * Represents a top-level browser page, including its target lifecycle and child frames.\n *\n * @example\n * ```ts\n * import { BrowserPage } from '@orkestrel/browser'\n *\n * const page = new BrowserPage(client, 'target-1', 'session-1')\n * await page.navigate('https://example.com')\n * const shot = await page.screenshot({ format: 'png' })\n * await page.close()\n * ```\n */\nexport class BrowserPage extends BrowserFrame implements BrowserPageInterface {\n\treadonly #client: CDPClientInterface\n\treadonly #targetId: string\n\treadonly #sessionId: string\n\treadonly #writer: BrowserWriterInterface | undefined\n\treadonly #contextId: string | undefined\n\treadonly #opener: BrowserPageInterface | undefined\n\treadonly #emitter: Emitter<BrowserPageEventMap>\n\treadonly #network: BrowserNetworkManager\n\treadonly #navigationManager: BrowserNavigationManager\n\treadonly #scripts: BrowserScriptManager\n\treadonly #accessibility: BrowserAccessibility\n\treadonly #diagnostics: BrowserDiagnostics\n\treadonly #clock: BrowserClock\n\treadonly #frameSessions: Map<string, Promise<string>> = new Map()\n\treadonly #frameIds: Map<string, string> = new Map()\n\treadonly #downloads: Map<string, BrowserDownload> = new Map()\n\treadonly #workers: Map<string, BrowserWorker> = new Map()\n\treadonly #popups: Map<string, BrowserPage> = new Map()\n\t#closed = false\n\t#codegen: BrowserCodegen | undefined\n\treadonly #codegenStart: BrowserTransition<BrowserCodegen> = new BrowserTransition()\n\t#navigation: Promise<BrowserNavigationResult> | undefined\n\t#closing: Promise<void> | undefined\n\t#releasing: Promise<void> | undefined\n\t#loadEvents: readonly string[] = []\n\t#sameDocument = false\n\t#loadTimer: ReturnType<typeof setTimeout> | undefined\n\t#loadResolve: (() => void) | undefined\n\t#loadReject: ((error: unknown) => void) | undefined\n\t#responses: BrowserResponse[] | undefined\n\treadonly #navigationResponseHandler = this.#handleNavigationResponse.bind(this)\n\treadonly #destroyHandler = this.#handleDestroy.bind(this)\n\treadonly #loadHandler = this.#handleLoad.bind(this)\n\treadonly #frameAttachedHandler = this.#handleFrameAttached.bind(this)\n\treadonly #frameNavigatedHandler = this.#handleFrameNavigated.bind(this)\n\treadonly #frameDetachedHandler = this.#handleFrameDetached.bind(this)\n\treadonly #dialogHandler = this.#handleDialog.bind(this)\n\treadonly #chooserHandler = this.#handleChooser.bind(this)\n\treadonly #consoleHandler = this.#handleConsole.bind(this)\n\treadonly #errorHandler = this.#handleError.bind(this)\n\treadonly #crashHandler = this.#handleCrash.bind(this)\n\treadonly #downloadHandler = this.#handleDownload.bind(this)\n\treadonly #downloadProgressHandler = this.#handleDownloadProgress.bind(this)\n\treadonly #attachedHandler = this.#handleAttached.bind(this)\n\treadonly #detachedHandler = this.#handleDetached.bind(this)\n\n\tconstructor(\n\t\tclient: CDPClientInterface,\n\t\ttargetId: string,\n\t\tsessionId: string,\n\t\twriter?: BrowserWriterInterface,\n\t\turl?: string,\n\t\tframeId?: string,\n\t\tcontextId?: string,\n\t\topener?: BrowserPageInterface,\n\t\toptions?: BrowserPageOptions,\n\t) {\n\t\tsuper(client, sessionId, frameId ?? targetId, url ?? 'about:blank', undefined, undefined, false)\n\t\tthis.#client = client\n\t\tthis.#targetId = targetId\n\t\tthis.#sessionId = sessionId\n\t\tthis.#writer = writer\n\t\tthis.#contextId = contextId\n\t\tthis.#opener = opener\n\t\tthis.#emitter = new Emitter({\n\t\t\t...(options?.on !== undefined ? { on: options.on } : {}),\n\t\t\t...(options?.error !== undefined ? { error: options.error } : {}),\n\t\t})\n\t\tthis.#network = new BrowserNetworkManager(this, writer)\n\t\tthis.#navigationManager = new BrowserNavigationManager(this)\n\t\tthis.#scripts = new BrowserScriptManager(this)\n\t\tthis.#accessibility = new BrowserAccessibility(this)\n\t\tthis.#diagnostics = new BrowserDiagnostics(this, writer)\n\t\tthis.#clock = new BrowserClock(this)\n\t\tthis.#network.emitter.on('request', (request) => this.#emitter.emit('request', request))\n\t\tthis.#network.emitter.on('response', (response) => this.#emitter.emit('response', response))\n\t\tthis.#network.emitter.on('failure', (failure) => this.#emitter.emit('failure', failure))\n\t\tthis.#network.emitter.on('socket', (socket) => this.#emitter.emit('socket', socket))\n\n\t\tthis.#client.subscribe('Target.targetDestroyed', this.#destroyHandler)\n\t\tthis.#client.subscribe('Target.attachedToTarget', this.#attachedHandler, this.#sessionId)\n\t\tthis.#client.subscribe('Target.detachedFromTarget', this.#detachedHandler, this.#sessionId)\n\t\tthis.#client.subscribe('Page.frameAttached', this.#frameAttachedHandler, this.#sessionId)\n\t\tthis.#client.subscribe('Page.frameNavigated', this.#frameNavigatedHandler, this.#sessionId)\n\t\tthis.#client.subscribe('Page.frameDetached', this.#frameDetachedHandler, this.#sessionId)\n\t\tthis.#client.subscribe('Page.javascriptDialogOpening', this.#dialogHandler, this.#sessionId)\n\t\tthis.#client.subscribe('Page.fileChooserOpened', this.#chooserHandler, this.#sessionId)\n\t\tthis.#client.subscribe('Runtime.consoleAPICalled', this.#consoleHandler, this.#sessionId)\n\t\tthis.#client.subscribe('Runtime.exceptionThrown', this.#errorHandler, this.#sessionId)\n\t\tthis.#client.subscribe('Inspector.targetCrashed', this.#crashHandler, this.#sessionId)\n\t\tthis.#client.subscribe('Browser.downloadWillBegin', this.#downloadHandler)\n\t\tthis.#client.subscribe('Browser.downloadProgress', this.#downloadProgressHandler)\n\t}\n\n\tget emitter(): EmitterInterface<BrowserPageEventMap> {\n\t\treturn this.#emitter\n\t}\n\n\tget network(): BrowserNetworkManagerInterface {\n\t\treturn this.#network\n\t}\n\n\tget navigation(): BrowserNavigationManagerInterface {\n\t\treturn this.#navigationManager\n\t}\n\n\tget scripts(): BrowserScriptManagerInterface {\n\t\treturn this.#scripts\n\t}\n\n\tget accessibility(): BrowserAccessibilityInterface {\n\t\treturn this.#accessibility\n\t}\n\n\tget diagnostics(): BrowserDiagnosticsInterface {\n\t\treturn this.#diagnostics\n\t}\n\n\tget clock(): BrowserClockInterface {\n\t\treturn this.#clock\n\t}\n\n\tget opener(): BrowserPageInterface | undefined {\n\t\treturn this.#opener\n\t}\n\n\tget target(): string {\n\t\treturn this.#targetId\n\t}\n\n\tget closed(): boolean {\n\t\treturn this.#closed\n\t}\n\n\tasync navigate(\n\t\turl: string,\n\t\toptions?: BrowserNavigationOptions,\n\t): Promise<BrowserNavigationResult> {\n\t\tthis.assert()\n\t\twhile (this.#navigation !== undefined) {\n\t\t\tawait this.#navigation.catch(() => undefined)\n\t\t}\n\t\tthis.assert()\n\t\tconst navigation = this.#navigate(url, options)\n\t\tthis.#navigation = navigation\n\n\t\ttry {\n\t\t\treturn await navigation\n\t\t} finally {\n\t\t\tif (this.#navigation === navigation) this.#navigation = undefined\n\t\t}\n\t}\n\n\tasync reload(options?: BrowserNavigationOptions): Promise<BrowserNavigationResult> {\n\t\tthis.assert()\n\t\twhile (this.#navigation !== undefined) {\n\t\t\tawait this.#navigation.catch(() => undefined)\n\t\t}\n\t\tthis.assert()\n\t\tconst navigation = this.#reload(options)\n\t\tthis.#navigation = navigation\n\n\t\ttry {\n\t\t\treturn await navigation\n\t\t} finally {\n\t\t\tif (this.#navigation === navigation) this.#navigation = undefined\n\t\t}\n\t}\n\n\tasync back(options?: BrowserNavigationOptions): Promise<BrowserNavigationResult> {\n\t\treturn await this.#history(-1, options)\n\t}\n\n\tasync forward(options?: BrowserNavigationOptions): Promise<BrowserNavigationResult> {\n\t\treturn await this.#history(1, options)\n\t}\n\n\tasync screenshot(options?: BrowserScreenshotOptions): Promise<BrowserScreenshotResult> {\n\t\tthis.assert()\n\t\tconst params: Record<string, unknown> = { ...browserScreenshotToParams(options) }\n\n\t\tif (options?.full === true) {\n\t\t\tconst metrics = await this.send('Page.getLayoutMetrics')\n\t\t\tconst size =\n\t\t\t\tisRecord(metrics) && isRecord(metrics['cssContentSize'])\n\t\t\t\t\t? metrics['cssContentSize']\n\t\t\t\t\t: isRecord(metrics) && isRecord(metrics['contentSize'])\n\t\t\t\t\t\t? metrics['contentSize']\n\t\t\t\t\t\t: undefined\n\t\t\tconst width = size?.['width']\n\t\t\tconst height = size?.['height']\n\t\t\tif (!isFiniteNumber(width) || width <= 0 || !isFiniteNumber(height) || height <= 0) {\n\t\t\t\tthrow new BrowserError('Browser full-page screenshot metrics are malformed')\n\t\t\t}\n\t\t\tparams['clip'] = { x: 0, y: 0, width, height, scale: 1 }\n\t\t\tparams['captureBeyondViewport'] = true\n\t\t}\n\n\t\tif (options?.scale !== undefined) {\n\t\t\tconst ratio = options.scale === 'css' ? 1 : await this.evaluate('devicePixelRatio')\n\t\t\tif (!isFiniteNumber(ratio) || ratio <= 0) {\n\t\t\t\tthrow new BrowserError('Browser screenshot device scale is malformed')\n\t\t\t}\n\t\t\tif (!isRecord(params['clip'])) {\n\t\t\t\tconst metrics = await this.send('Page.getLayoutMetrics')\n\t\t\t\tconst viewport =\n\t\t\t\t\tisRecord(metrics) && isRecord(metrics['cssVisualViewport'])\n\t\t\t\t\t\t? metrics['cssVisualViewport']\n\t\t\t\t\t\t: undefined\n\t\t\t\tif (\n\t\t\t\t\tviewport === undefined ||\n\t\t\t\t\t!isFiniteNumber(viewport['pageX']) ||\n\t\t\t\t\t!isFiniteNumber(viewport['pageY']) ||\n\t\t\t\t\t!isFiniteNumber(viewport['clientWidth']) ||\n\t\t\t\t\tviewport['clientWidth'] <= 0 ||\n\t\t\t\t\t!isFiniteNumber(viewport['clientHeight']) ||\n\t\t\t\t\tviewport['clientHeight'] <= 0\n\t\t\t\t) {\n\t\t\t\t\tthrow new BrowserError('Browser screenshot viewport metrics are malformed')\n\t\t\t\t}\n\t\t\t\tparams['clip'] = {\n\t\t\t\t\tx: viewport['pageX'],\n\t\t\t\t\ty: viewport['pageY'],\n\t\t\t\t\twidth: viewport['clientWidth'],\n\t\t\t\t\theight: viewport['clientHeight'],\n\t\t\t\t\tscale: ratio,\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tparams['clip']['scale'] = ratio\n\t\t\t}\n\t\t}\n\n\t\tlet token: string | undefined\n\t\tlet transparent = false\n\t\ttry {\n\t\t\tconst preparation = compileScreenshotPreparationExpression(options)\n\t\t\tif (preparation !== undefined) {\n\t\t\t\tconst value = await this.evaluate(preparation)\n\t\t\t\tif (!isString(value)) throw new BrowserError('Browser screenshot preparation failed')\n\t\t\t\ttoken = value\n\t\t\t}\n\t\t\tif (options?.transparent === true) {\n\t\t\t\tawait this.send('Emulation.setDefaultBackgroundColorOverride', {\n\t\t\t\t\tcolor: { r: 0, g: 0, b: 0, a: 0 },\n\t\t\t\t})\n\t\t\t\ttransparent = true\n\t\t\t}\n\t\t\tconst result = await this.send('Page.captureScreenshot', params)\n\t\t\tif (!isRecord(result) || !isString(result['data'])) {\n\t\t\t\tthrow new BrowserError('Screenshot failed: no data returned')\n\t\t\t}\n\n\t\t\tconst bytes = decodeBase64(result['data'])\n\t\t\tif (options?.path !== undefined) await this.save(options.path, bytes)\n\t\t\treturn { bytes, path: options?.path }\n\t\t} finally {\n\t\t\tif (transparent) {\n\t\t\t\tawait this.send('Emulation.setDefaultBackgroundColorOverride').catch(() => undefined)\n\t\t\t}\n\t\t\tif (token !== undefined) {\n\t\t\t\tawait this.evaluate(compileScreenshotCleanupExpression(token)).catch(() => undefined)\n\t\t\t}\n\t\t}\n\t}\n\n\tasync pdf(options?: BrowserPDFOptions): Promise<BrowserPDFResult> {\n\t\tthis.assert()\n\t\tconst result = await this.send('Page.printToPDF', browserPDFToParams(options))\n\t\tif (!isRecord(result) || !isString(result['data'])) {\n\t\t\tthrow new BrowserError('PDF failed: no data returned')\n\t\t}\n\t\tconst bytes = decodeBase64(result['data'])\n\t\tif (options?.path !== undefined) await this.save(options.path, bytes)\n\t\treturn { bytes, path: options?.path }\n\t}\n\n\toverride async save(path: string, bytes: Uint8Array): Promise<void> {\n\t\tif (this.#writer === undefined) {\n\t\t\tthrow new BrowserError('Browser page has no configured file writer', undefined, { path })\n\t\t}\n\t\tawait this.#writer.write(path, bytes)\n\t}\n\n\tasync frame(name: string): Promise<BrowserFrameInterface | undefined> {\n\t\tconst frames = await this.frames()\n\t\treturn frames.find((frame) => frame.name === name || frame.url === name)\n\t}\n\n\tasync frames(): Promise<readonly BrowserFrameInterface[]> {\n\t\tthis.assert()\n\t\tconst result = await this.send('Page.getFrameTree')\n\t\treturn readBrowserFrames(result).map((frame) => this.#frame(frame))\n\t}\n\n\tasync snapshot(options?: BrowserSnapshotOptions): Promise<BrowserSnapshotInterface> {\n\t\tthis.assert()\n\t\tconst styles = options?.styles ?? []\n\t\tconst result = await this.send('DOMSnapshot.captureSnapshot', {\n\t\t\tcomputedStyles: [...styles],\n\t\t\tincludePaintOrder: options?.paint ?? false,\n\t\t\tincludeDOMRects: options?.rects ?? false,\n\t\t})\n\t\treturn new BrowserSnapshot(\n\t\t\treadBrowserSnapshot(result, styles, options?.limit ?? BROWSER_SNAPSHOT_NODE_LIMIT),\n\t\t)\n\t}\n\n\tasync codegen(options?: BrowserCodegenOptions): Promise<BrowserCodegenInterface> {\n\t\tthis.assert()\n\t\tif (this.#codegen !== undefined) return this.#codegen\n\t\tconst active = this.#codegenStart.pending\n\t\tif (active !== undefined) return await active\n\n\t\treturn await this.#codegenStart.execute(() => this.#startCodegen(options))\n\t}\n\n\tdestroy(): Promise<void> {\n\t\tconst active = this.#closing\n\t\tif (active !== undefined) return active\n\n\t\tthis.#closed = true\n\t\tconst closing = this.#destroy()\n\t\tthis.#closing = closing\n\t\treturn closing\n\t}\n\n\tclose(): Promise<void> {\n\t\tconst active = this.#closing\n\t\tif (active !== undefined) return active\n\n\t\tif (this.#closed) {\n\t\t\tconst closing = this.#release()\n\t\t\tthis.#closing = closing\n\t\t\treturn closing\n\t\t}\n\n\t\tthis.#closed = true\n\t\tconst closing = this.#close()\n\t\tthis.#closing = closing\n\t\treturn closing\n\t}\n\n\toverride assert(): void {\n\t\tsuper.assert()\n\t\tif (this.#closed) throw new BrowserError('Browser page is closed')\n\t}\n\n\tasync #navigate(\n\t\turl: string,\n\t\toptions?: BrowserNavigationOptions,\n\t): Promise<BrowserNavigationResult> {\n\t\tconst timeout = options?.timeout ?? BROWSER_DEFAULT_TIMEOUT_MS\n\t\tvalidateBrowserTimeout(timeout)\n\t\tconst watch = this.#watchNavigation()\n\t\tconst condition = options?.condition ?? 'load'\n\t\tconst wait = this.#waitForLoadEvent(condition, timeout)\n\t\tvoid wait.catch(() => undefined)\n\t\tlet loader: string | undefined\n\n\t\ttry {\n\t\t\tconst result = await this.send('Page.navigate', { url }, { timeout })\n\t\t\tif (isRecord(result) && isString(result['errorText'])) {\n\t\t\t\tthrow new BrowserError(`Navigation failed: ${result['errorText']}`)\n\t\t\t}\n\t\t\tif (isRecord(result) && isString(result['loaderId'])) loader = result['loaderId']\n\t\t\tawait wait\n\t\t} catch (error) {\n\t\t\tthis.#clearNavigationWatch(watch)\n\t\t\tthis.#cancelLoad()\n\t\t\tawait this.#stopLoading(Math.min(timeout, BROWSER_STOP_LOADING_TIMEOUT_MS))\n\t\t\tthrow error\n\t\t}\n\n\t\treturn await this.#completeNavigation(watch, loader)\n\t}\n\n\tasync #reload(options?: BrowserNavigationOptions): Promise<BrowserNavigationResult> {\n\t\tconst timeout = options?.timeout ?? BROWSER_DEFAULT_TIMEOUT_MS\n\t\tvalidateBrowserTimeout(timeout)\n\t\tconst watch = this.#watchNavigation()\n\t\tconst wait = this.#waitForLoadEvent(options?.condition ?? 'load', timeout)\n\t\tvoid wait.catch(() => undefined)\n\n\t\ttry {\n\t\t\tawait this.send('Page.reload', undefined, { timeout })\n\t\t\tawait wait\n\t\t} catch (error) {\n\t\t\tthis.#clearNavigationWatch(watch)\n\t\t\tthis.#cancelLoad()\n\t\t\tawait this.#stopLoading(Math.min(timeout, BROWSER_STOP_LOADING_TIMEOUT_MS))\n\t\t\tthrow error\n\t\t}\n\n\t\treturn await this.#completeNavigation(watch)\n\t}\n\n\tasync #history(\n\t\toffset: -1 | 1,\n\t\toptions?: BrowserNavigationOptions,\n\t): Promise<BrowserNavigationResult> {\n\t\tthis.assert()\n\t\twhile (this.#navigation !== undefined) {\n\t\t\tawait this.#navigation.catch(() => undefined)\n\t\t}\n\t\tthis.assert()\n\t\tconst navigation = this.#navigateHistory(offset, options)\n\t\tthis.#navigation = navigation\n\n\t\ttry {\n\t\t\treturn await navigation\n\t\t} finally {\n\t\t\tif (this.#navigation === navigation) this.#navigation = undefined\n\t\t}\n\t}\n\n\tasync #navigateHistory(\n\t\toffset: -1 | 1,\n\t\toptions?: BrowserNavigationOptions,\n\t): Promise<BrowserNavigationResult> {\n\t\tconst timeout = options?.timeout ?? BROWSER_DEFAULT_TIMEOUT_MS\n\t\tvalidateBrowserTimeout(timeout)\n\t\tconst history = await this.send('Page.getNavigationHistory')\n\t\tif (!isRecord(history) || !isInteger(history['currentIndex']) || !isArray(history['entries'])) {\n\t\t\tthrow new BrowserError('Navigation history is malformed')\n\t\t}\n\t\tconst entry = history['entries'][history['currentIndex'] + offset]\n\t\tif (!isRecord(entry) || !isInteger(entry['id'])) {\n\t\t\treturn { url: this.url, response: undefined, same: false }\n\t\t}\n\n\t\tconst watch = this.#watchNavigation()\n\t\tconst wait = this.#waitForLoadEvent(options?.condition ?? 'load', timeout)\n\t\tvoid wait.catch(() => undefined)\n\t\ttry {\n\t\t\tawait this.send('Page.navigateToHistoryEntry', { entryId: entry['id'] }, { timeout })\n\t\t\tawait wait\n\t\t} catch (error) {\n\t\t\tthis.#clearNavigationWatch(watch)\n\t\t\tthis.#cancelLoad()\n\t\t\tawait this.#stopLoading(Math.min(timeout, BROWSER_STOP_LOADING_TIMEOUT_MS))\n\t\t\tthrow error\n\t\t}\n\n\t\treturn await this.#completeNavigation(watch)\n\t}\n\n\t#watchNavigation(): BrowserNavigationWatch {\n\t\tconst responses: BrowserResponse[] = []\n\t\tthis.#responses = responses\n\t\tthis.#network.emitter.on('response', this.#navigationResponseHandler)\n\t\treturn { responses }\n\t}\n\n\t#clearNavigationWatch(watch: BrowserNavigationWatch): void {\n\t\tthis.#network.emitter.off('response', this.#navigationResponseHandler)\n\t\tif (this.#responses === watch.responses) this.#responses = undefined\n\t}\n\n\t#navigationResult(\n\t\twatch: BrowserNavigationWatch,\n\t\turl: string,\n\t\tloader?: string,\n\t): BrowserNavigationResult {\n\t\tthis.#clearNavigationWatch(watch)\n\t\tconst response =\n\t\t\tloader === undefined\n\t\t\t\t? watch.responses.findLast((candidate) => candidate.url === url)\n\t\t\t\t: watch.responses.findLast((candidate) => candidate.loader === loader)\n\t\treturn {\n\t\t\turl,\n\t\t\tresponse,\n\t\t\tsame: this.#sameDocument,\n\t\t}\n\t}\n\n\tasync #completeNavigation(\n\t\twatch: BrowserNavigationWatch,\n\t\tloader?: string,\n\t): Promise<BrowserNavigationResult> {\n\t\ttry {\n\t\t\tconst currentUrl = await this.evaluate('location.href')\n\t\t\tconst resolved = requireBrowserString(currentUrl, 'Navigation URL')\n\t\t\tthis.update(resolved)\n\t\t\treturn this.#navigationResult(watch, resolved, loader)\n\t\t} catch (error) {\n\t\t\tthis.#clearNavigationWatch(watch)\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync #startCodegen(options?: BrowserCodegenOptions): Promise<BrowserCodegen> {\n\t\tconst codegen = new BrowserCodegen(this.#client, this.#sessionId, options)\n\t\tawait codegen.start()\n\t\tif (this.#closed) {\n\t\t\tawait codegen.destroy()\n\t\t\tthrow new BrowserError('Browser page is closed')\n\t\t}\n\t\tthis.#codegen = codegen\n\t\treturn codegen\n\t}\n\n\tasync #destroy(): Promise<void> {\n\t\tawait this.#release()\n\t\ttry {\n\t\t\tawait this.#client.send('Target.detachFromTarget', { sessionId: this.#sessionId })\n\t\t} catch {\n\t\t\t// The session may already be detached.\n\t\t}\n\t}\n\n\tasync #close(): Promise<void> {\n\t\tawait this.#release()\n\t\ttry {\n\t\t\tawait this.#client.send('Target.closeTarget', { targetId: this.#targetId })\n\t\t} catch {\n\t\t\t// The target may already be closed.\n\t\t}\n\t}\n\n\t#release(): Promise<void> {\n\t\tconst active = this.#releasing\n\t\tif (active !== undefined) return active\n\t\tconst release = this.#releaseResources()\n\t\tthis.#releasing = release\n\t\treturn release\n\t}\n\n\tasync #releaseResources(): Promise<void> {\n\t\tthis.#cancelLoad()\n\t\tawait this.#codegenStart.pending?.catch(() => undefined)\n\t\tawait this.#scripts.destroy().catch(() => undefined)\n\t\tawait this.#diagnostics.destroy().catch(() => undefined)\n\t\tawait this.#clock.uninstall().catch(() => undefined)\n\t\tawait this.#network.destroy().catch(() => undefined)\n\n\t\tif (this.#codegen !== undefined) {\n\t\t\ttry {\n\t\t\t\tawait this.#codegen.destroy()\n\t\t\t} catch {\n\t\t\t\t// The recorder's session may already be unavailable.\n\t\t\t}\n\t\t\tthis.#codegen = undefined\n\t\t}\n\n\t\tthis.#frameSessions.clear()\n\t\tthis.#frameIds.clear()\n\t\tfor (const worker of this.#workers.values()) worker.detach()\n\t\tthis.#workers.clear()\n\t\tthis.#popups.clear()\n\t\tthis.#downloads.clear()\n\t\tthis.#client.unsubscribe('Target.targetDestroyed', this.#destroyHandler)\n\t\tthis.#client.unsubscribe('Target.attachedToTarget', this.#attachedHandler, this.#sessionId)\n\t\tthis.#client.unsubscribe('Target.detachedFromTarget', this.#detachedHandler, this.#sessionId)\n\t\tthis.#client.unsubscribe('Page.frameAttached', this.#frameAttachedHandler, this.#sessionId)\n\t\tthis.#client.unsubscribe('Page.frameNavigated', this.#frameNavigatedHandler, this.#sessionId)\n\t\tthis.#client.unsubscribe('Page.frameDetached', this.#frameDetachedHandler, this.#sessionId)\n\t\tthis.#client.unsubscribe('Page.javascriptDialogOpening', this.#dialogHandler, this.#sessionId)\n\t\tthis.#client.unsubscribe('Page.fileChooserOpened', this.#chooserHandler, this.#sessionId)\n\t\tthis.#client.unsubscribe('Runtime.consoleAPICalled', this.#consoleHandler, this.#sessionId)\n\t\tthis.#client.unsubscribe('Runtime.exceptionThrown', this.#errorHandler, this.#sessionId)\n\t\tthis.#client.unsubscribe('Inspector.targetCrashed', this.#crashHandler, this.#sessionId)\n\t\tthis.#client.unsubscribe('Browser.downloadWillBegin', this.#downloadHandler)\n\t\tthis.#client.unsubscribe('Browser.downloadProgress', this.#downloadProgressHandler)\n\t\tif (!this.#emitter.destroyed) {\n\t\t\tthis.#emitter.emit('close')\n\t\t\tthis.#emitter.destroy()\n\t\t}\n\t}\n\n\t#frame(frame: BrowserFrameInfo): BrowserFrameInterface {\n\t\treturn new BrowserFrame(\n\t\t\tthis.#client,\n\t\t\t(id) => this.#resolveFrameSession(id),\n\t\t\tframe.id,\n\t\t\tframe.url,\n\t\t\tframe.parent,\n\t\t\tframe.name,\n\t\t)\n\t}\n\n\tasync #resolveFrameSession(frame: string): Promise<string> {\n\t\tconst session = this.#frameSessions.get(frame)\n\t\treturn session === undefined ? this.#sessionId : await session\n\t}\n\n\tasync #enableFrameSession(session: string): Promise<string> {\n\t\tawait this.#client.send('Page.enable', undefined, { session })\n\t\tawait this.#client.send('Runtime.enable', undefined, { session })\n\t\treturn session\n\t}\n\n\tasync #attachWorker(\n\t\tsession: string,\n\t\tid: string,\n\t\turl: string,\n\t\tcategory: BrowserWorkerCategory,\n\t): Promise<void> {\n\t\ttry {\n\t\t\tawait this.#client.send('Runtime.enable', undefined, { session })\n\t\t\tif (this.#closed) {\n\t\t\t\tawait this.#detachChild(session)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst worker = new BrowserWorker(this.#client, session, id, url, category)\n\t\t\tthis.#workers.set(id, worker)\n\t\t\tthis.#emitter.emit('worker', worker)\n\t\t} catch {\n\t\t\t// A worker can terminate before its session is enabled.\n\t\t\tawait this.#detachChild(session)\n\t\t}\n\t}\n\n\tasync #attachPopup(session: string, id: string, url: string): Promise<void> {\n\t\tlet popup: BrowserPage | undefined\n\t\ttry {\n\t\t\tawait this.#client.send('Page.enable', undefined, { session })\n\t\t\tawait this.#client.send('Runtime.enable', undefined, { session })\n\t\t\tconst result = await this.#client.send('Page.getFrameTree', undefined, { session })\n\t\t\tconst frame = readBrowserFrames(result)[0]\n\t\t\tif (frame === undefined || this.#closed) {\n\t\t\t\tawait this.#detachChild(session)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tpopup = new BrowserPage(\n\t\t\t\tthis.#client,\n\t\t\t\tid,\n\t\t\t\tsession,\n\t\t\t\tthis.#writer,\n\t\t\t\turl,\n\t\t\t\tframe.id,\n\t\t\t\tthis.#contextId,\n\t\t\t\tthis,\n\t\t\t)\n\t\t\tawait popup.send('Target.setAutoAttach', {\n\t\t\t\tautoAttach: true,\n\t\t\t\twaitForDebuggerOnStart: false,\n\t\t\t\tflatten: true,\n\t\t\t})\n\t\t\tawait popup.send('Page.setInterceptFileChooserDialog', { enabled: true })\n\t\t\tawait popup.network.start()\n\t\t\tif (this.#closed) {\n\t\t\t\tawait popup.destroy()\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.#popups.set(id, popup)\n\t\t\tthis.#emitter.emit('popup', popup)\n\t\t} catch {\n\t\t\t// A popup can close before its session initialization completes.\n\t\t\tif (popup !== undefined) await popup.destroy()\n\t\t\telse await this.#detachChild(session)\n\t\t}\n\t}\n\n\tasync #detachChild(session: string): Promise<void> {\n\t\tawait this.#client\n\t\t\t.send('Target.detachFromTarget', { sessionId: session })\n\t\t\t.catch(() => undefined)\n\t}\n\n\tasync #stopLoading(timeout: number): Promise<void> {\n\t\ttry {\n\t\t\tawait this.send('Page.stopLoading', undefined, { timeout })\n\t\t} catch {\n\t\t\t// Best-effort only — the original navigation error wins.\n\t\t}\n\t}\n\n\t#handleNavigationResponse(response: BrowserResponse): void {\n\t\tif (response.frame === this.id) this.#responses?.push(response)\n\t}\n\n\t#handleDestroy(params: Readonly<Record<string, unknown>>): void {\n\t\tif (!isString(params['targetId']) || params['targetId'] !== this.#targetId) return\n\t\tthis.#closed = true\n\t\tvoid this.#release().catch(() => undefined)\n\t}\n\n\t#handleLoad(params: Readonly<Record<string, unknown>>): void {\n\t\tif (this.#loadEvents.includes('Page.navigatedWithinDocument')) {\n\t\t\tconst frame = params['frameId']\n\t\t\tif (isString(frame) && frame === this.id) {\n\t\t\t\tthis.#sameDocument = true\n\t\t\t\tthis.#resolveLoad()\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t\tif (this.#loadEvents.includes('Page.frameNavigated')) {\n\t\t\tconst frame = params['frame']\n\t\t\tif (isRecord(frame) && frame['id'] === this.id) this.#resolveLoad()\n\t\t\treturn\n\t\t}\n\t\tif (\n\t\t\tthis.#loadEvents.includes('Page.loadEventFired') ||\n\t\t\tthis.#loadEvents.includes('Page.domContentEventFired')\n\t\t) {\n\t\t\tthis.#resolveLoad()\n\t\t}\n\t}\n\n\t#handleFrameAttached(params: Readonly<Record<string, unknown>>): void {\n\t\tconst frame = params['frameId']\n\t\tconst parent = params['parentFrameId']\n\t\tif (!isString(frame)) return\n\t\tthis.#emitter.emit(\n\t\t\t'attach',\n\t\t\tnew BrowserFrame(\n\t\t\t\tthis.#client,\n\t\t\t\t(id) => this.#resolveFrameSession(id),\n\t\t\t\tframe,\n\t\t\t\t'about:blank',\n\t\t\t\tisString(parent) ? parent : undefined,\n\t\t\t),\n\t\t)\n\t}\n\n\t#handleFrameNavigated(params: Readonly<Record<string, unknown>>): void {\n\t\tconst frame = params['frame']\n\t\tif (!isRecord(frame) || !isString(frame['id']) || !isString(frame['url'])) return\n\t\tif (frame['id'] === this.id) {\n\t\t\tthis.update(frame['url'])\n\t\t\tthis.#emitter.emit('navigate', frame['url'])\n\t\t}\n\t}\n\n\t#handleFrameDetached(params: Readonly<Record<string, unknown>>): void {\n\t\tconst frame = params['frameId']\n\t\tif (!isString(frame)) return\n\t\tthis.#frameSessions.delete(frame)\n\t\tthis.#emitter.emit('detach', frame)\n\t}\n\n\t#handleDialog(params: Readonly<Record<string, unknown>>): void {\n\t\tconst category = params['type']\n\t\tif (\n\t\t\t(category !== 'alert' &&\n\t\t\t\tcategory !== 'confirm' &&\n\t\t\t\tcategory !== 'prompt' &&\n\t\t\t\tcategory !== 'beforeunload') ||\n\t\t\t!isString(params['message'])\n\t\t) {\n\t\t\treturn\n\t\t}\n\t\tthis.#emitter.emit(\n\t\t\t'dialog',\n\t\t\tnew BrowserDialog(\n\t\t\t\tthis,\n\t\t\t\tcategory,\n\t\t\t\tparams['message'],\n\t\t\t\tisString(params['defaultPrompt']) ? params['defaultPrompt'] : '',\n\t\t\t),\n\t\t)\n\t}\n\n\t#handleChooser(params: Readonly<Record<string, unknown>>): void {\n\t\tconst backend = params['backendNodeId']\n\t\tconst mode = params['mode']\n\t\tif (!isInteger(backend)) return\n\t\tthis.#emitter.emit('chooser', new BrowserFileChooser(this, backend, mode === 'selectMultiple'))\n\t}\n\n\t#handleConsole(params: Readonly<Record<string, unknown>>): void {\n\t\tconst message = parseBrowserConsoleMessage(params)\n\t\tif (message !== undefined) this.#emitter.emit('console', message)\n\t}\n\n\t#handleError(params: Readonly<Record<string, unknown>>): void {\n\t\tconst error = parseBrowserPageError(params)\n\t\tif (error !== undefined) this.#emitter.emit('error', error)\n\t}\n\n\t#handleCrash(): void {\n\t\tthis.#emitter.emit('crash')\n\t}\n\n\t#handleDownload(params: Readonly<Record<string, unknown>>): void {\n\t\tconst start = parseBrowserDownloadStart(params)\n\t\tif (start === undefined || (start.frame !== this.id && !this.#frameSessions.has(start.frame))) {\n\t\t\treturn\n\t\t}\n\t\tconst download = new BrowserDownload(\n\t\t\tthis.#client,\n\t\t\tstart.id,\n\t\t\tstart.url,\n\t\t\tstart.name,\n\t\t\tthis.#contextId,\n\t\t)\n\t\tthis.#downloads.set(start.id, download)\n\t\tthis.#emitter.emit('download', download)\n\t}\n\n\t#handleDownloadProgress(params: Readonly<Record<string, unknown>>): void {\n\t\tconst decoded = parseBrowserDownloadProgress(params)\n\t\tif (decoded === undefined) return\n\t\tconst [id, progress] = decoded\n\t\tconst download = this.#downloads.get(id)\n\t\tif (download === undefined) return\n\t\tdownload.update(progress)\n\t\tif (progress.status !== 'pending') this.#downloads.delete(id)\n\t}\n\n\t#handleAttached(params: Readonly<Record<string, unknown>>): void {\n\t\tconst target = params['targetInfo']\n\t\tconst session = params['sessionId']\n\t\tif (!isRecord(target) || !isString(target['targetId']) || !isString(session)) {\n\t\t\treturn\n\t\t}\n\n\t\tconst category = target['type']\n\t\tif (category === 'worker' || category === 'service_worker' || category === 'shared_worker') {\n\t\t\tvoid this.#attachWorker(\n\t\t\t\tsession,\n\t\t\t\ttarget['targetId'],\n\t\t\t\tisString(target['url']) ? target['url'] : '',\n\t\t\t\tcategory,\n\t\t\t)\n\t\t\treturn\n\t\t}\n\t\tif (category === 'page') {\n\t\t\tvoid this.#attachPopup(\n\t\t\t\tsession,\n\t\t\t\ttarget['targetId'],\n\t\t\t\tisString(target['url']) ? target['url'] : 'about:blank',\n\t\t\t)\n\t\t\treturn\n\t\t}\n\t\tif (category !== 'iframe') return\n\n\t\tconst frame = target['targetId']\n\t\tconst attempt = this.#enableFrameSession(session)\n\t\tthis.#frameSessions.set(frame, attempt)\n\t\tthis.#frameIds.set(session, frame)\n\t\tvoid attempt.catch(() => {\n\t\t\tif (this.#frameSessions.get(frame) === attempt) this.#frameSessions.delete(frame)\n\t\t\tif (this.#frameIds.get(session) === frame) this.#frameIds.delete(session)\n\t\t\tvoid this.#detachChild(session)\n\t\t})\n\t}\n\n\t#handleDetached(params: Readonly<Record<string, unknown>>): void {\n\t\tconst session = params['sessionId']\n\t\tconst target = params['targetId']\n\t\tif (isString(target)) {\n\t\t\tconst worker = this.#workers.get(target)\n\t\t\tif (worker !== undefined) {\n\t\t\t\tworker.detach()\n\t\t\t\tthis.#workers.delete(target)\n\t\t\t}\n\t\t\tconst popup = this.#popups.get(target)\n\t\t\tif (popup !== undefined) {\n\t\t\t\tthis.#popups.delete(target)\n\t\t\t\tvoid popup.destroy().catch(() => undefined)\n\t\t\t}\n\t\t}\n\t\tconst frame = isString(target)\n\t\t\t? target\n\t\t\t: isString(session)\n\t\t\t\t? this.#frameIds.get(session)\n\t\t\t\t: undefined\n\t\tif (frame !== undefined) this.#frameSessions.delete(frame)\n\t\tif (isString(session)) this.#frameIds.delete(session)\n\t}\n\n\t#waitForLoadEvent(condition: BrowserWaitUntil, timeout: number): Promise<void> {\n\t\tconst eventName =\n\t\t\tcondition === 'commit'\n\t\t\t\t? 'Page.frameNavigated'\n\t\t\t\t: condition === 'domcontentloaded'\n\t\t\t\t\t? 'Page.domContentEventFired'\n\t\t\t\t\t: 'Page.loadEventFired'\n\t\tconst deferred = Promise.withResolvers<void>()\n\t\tthis.#sameDocument = false\n\t\tthis.#loadEvents = [eventName, 'Page.navigatedWithinDocument']\n\t\tthis.#loadResolve = deferred.resolve\n\t\tthis.#loadReject = deferred.reject\n\t\tthis.#loadTimer = setTimeout(() => {\n\t\t\tthis.#rejectLoad(new BrowserError(`Navigation timeout after ${timeout}ms`))\n\t\t}, timeout)\n\t\tfor (const event of this.#loadEvents) {\n\t\t\tthis.#client.subscribe(event, this.#loadHandler, this.#sessionId)\n\t\t}\n\t\treturn deferred.promise\n\t}\n\n\t#resolveLoad(): void {\n\t\tconst resolve = this.#loadResolve\n\t\tthis.#clearLoad()\n\t\tresolve?.()\n\t}\n\n\t#rejectLoad(error: unknown): void {\n\t\tconst reject = this.#loadReject\n\t\tthis.#clearLoad()\n\t\treject?.(error)\n\t}\n\n\t#cancelLoad(): void {\n\t\tthis.#rejectLoad(new BrowserError('Navigation cancelled'))\n\t}\n\n\t#clearLoad(): void {\n\t\tif (this.#loadTimer !== undefined) clearTimeout(this.#loadTimer)\n\t\tfor (const event of this.#loadEvents) {\n\t\t\tthis.#client.unsubscribe(event, this.#loadHandler, this.#sessionId)\n\t\t}\n\t\tthis.#loadEvents = []\n\t\tthis.#loadTimer = undefined\n\t\tthis.#loadResolve = undefined\n\t\tthis.#loadReject = undefined\n\t}\n}\n","import type { BrowserPermissionManagerInterface, CDPClientInterface } from './types.js'\n\n/**\n * Applies permission overrides isolated to one browser context.\n *\n * @example\n * ```ts\n * import { BrowserPermissionManager } from '@orkestrel/browser'\n *\n * const permissions = new BrowserPermissionManager(client)\n * await permissions.grant(['geolocation'], 'https://example.com')\n * await permissions.clear()\n * ```\n */\nexport class BrowserPermissionManager implements BrowserPermissionManagerInterface {\n\treadonly #client: CDPClientInterface\n\treadonly #context: string | undefined\n\n\tconstructor(client: CDPClientInterface, context?: string) {\n\t\tthis.#client = client\n\t\tthis.#context = context\n\t}\n\n\tasync grant(permissions: readonly string[], origin?: string): Promise<void> {\n\t\tawait this.#set(permissions, 'granted', origin)\n\t}\n\n\tasync deny(permissions: readonly string[], origin?: string): Promise<void> {\n\t\tawait this.#set(permissions, 'denied', origin)\n\t}\n\n\tasync clear(): Promise<void> {\n\t\tconst params: Record<string, unknown> = {}\n\t\tif (this.#context !== undefined) params['browserContextId'] = this.#context\n\t\tawait this.#client.send('Browser.resetPermissions', params)\n\t}\n\n\tasync #set(\n\t\tpermissions: readonly string[],\n\t\tsetting: 'granted' | 'denied',\n\t\torigin?: string,\n\t): Promise<void> {\n\t\tfor (const name of permissions) {\n\t\t\tconst params: Record<string, unknown> = {\n\t\t\t\tpermission: { name },\n\t\t\t\tsetting,\n\t\t\t}\n\t\t\tif (origin !== undefined) params['origin'] = origin\n\t\t\tif (this.#context !== undefined) params['browserContextId'] = this.#context\n\t\t\tawait this.#client.send('Browser.setPermission', params)\n\t\t}\n\t}\n}\n","import type {\n\tBrowserCookieInput,\n\tBrowserCookieManagerInterface,\n\tBrowserPagesFunction,\n\tBrowserStorageManagerInterface,\n\tBrowserStorageOptions,\n\tBrowserStorageOrigin,\n\tBrowserStorageState,\n} from './types.js'\nimport {\n\tcompileStorageClearExpression,\n\tcompileStorageReadExpression,\n\tcompileStorageRestoreExpression,\n} from './compilers.js'\nimport { readBrowserStorageOrigin } from './helpers.js'\nimport { BrowserError } from './errors.js'\nimport { attempt } from '@orkestrel/contract'\n\n/**\n * Imports, exports, and clears cookie and web-storage state for one browser context.\n *\n * @example\n * ```ts\n * import { BrowserStorageManager } from '@orkestrel/browser'\n *\n * const storage = new BrowserStorageManager(context.cookies, () => context.pages())\n * const state = await storage.state({ origins: ['https://example.com'] })\n * await storage.restore(state)\n * ```\n */\nexport class BrowserStorageManager implements BrowserStorageManagerInterface {\n\treadonly #cookies: BrowserCookieManagerInterface\n\treadonly #pages: BrowserPagesFunction\n\n\tconstructor(cookies: BrowserCookieManagerInterface, pages: BrowserPagesFunction) {\n\t\tthis.#cookies = cookies\n\t\tthis.#pages = pages\n\t}\n\n\tasync state(options?: BrowserStorageOptions): Promise<BrowserStorageState> {\n\t\tconst pages = this.#pages()\n\t\tconst requested = options?.origins\n\t\tconst origins =\n\t\t\trequested === undefined\n\t\t\t\t? [\n\t\t\t\t\t\t...new Set(\n\t\t\t\t\t\t\tpages.map((page) => this.#origin(page.url)).filter((origin) => origin !== undefined),\n\t\t\t\t\t\t),\n\t\t\t\t\t]\n\t\t\t\t: [...new Set(requested.map((origin) => this.#validate(origin)))]\n\t\tconst storage: BrowserStorageOrigin[] = []\n\n\t\tfor (const origin of origins) {\n\t\t\tconst page = pages.find((candidate) => this.#origin(candidate.url) === origin)\n\t\t\tif (page === undefined) {\n\t\t\t\tthrow new BrowserError('Storage origin has no attached page', undefined, { origin })\n\t\t\t}\n\t\t\tstorage.push(\n\t\t\t\treadBrowserStorageOrigin(await page.evaluate(compileStorageReadExpression()), origin),\n\t\t\t)\n\t\t}\n\n\t\tconst cookies: BrowserCookieInput[] = (await this.#cookies.cookies()).map((cookie) => ({\n\t\t\tname: cookie.name,\n\t\t\tvalue: cookie.value,\n\t\t\tdomain: cookie.domain,\n\t\t\tpath: cookie.path,\n\t\t\texpires: cookie.expires,\n\t\t\thttp: cookie.http,\n\t\t\tsecure: cookie.secure,\n\t\t\t...(cookie.site !== undefined ? { site: cookie.site } : {}),\n\t\t\t...(cookie.partition !== undefined ? { partition: cookie.partition } : {}),\n\t\t}))\n\t\treturn { cookies, origins: storage }\n\t}\n\n\tasync restore(state: BrowserStorageState): Promise<void> {\n\t\tconst pages = this.#pages()\n\t\tfor (const origin of state.origins) {\n\t\t\tconst normalized = this.#validate(origin.origin)\n\t\t\tconst page = pages.find((candidate) => this.#origin(candidate.url) === normalized)\n\t\t\tif (page === undefined) {\n\t\t\t\tthrow new BrowserError('Storage origin has no attached page', undefined, {\n\t\t\t\t\torigin: normalized,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t\tawait this.#cookies.set(state.cookies)\n\t\tfor (const origin of state.origins) {\n\t\t\tconst normalized = this.#validate(origin.origin)\n\t\t\tconst page = pages.find((candidate) => this.#origin(candidate.url) === normalized)\n\t\t\tif (page === undefined) {\n\t\t\t\tthrow new BrowserError('Storage origin disappeared during restore', undefined, {\n\t\t\t\t\torigin: normalized,\n\t\t\t\t})\n\t\t\t}\n\t\t\tawait page.evaluate(compileStorageRestoreExpression(origin))\n\t\t}\n\t}\n\n\tasync clear(origin?: string): Promise<void> {\n\t\tawait this.#cookies.clear()\n\t\tconst normalized = origin === undefined ? undefined : this.#validate(origin)\n\t\tfor (const page of this.#pages()) {\n\t\t\tif (normalized !== undefined && this.#origin(page.url) !== normalized) continue\n\t\t\tawait page.evaluate(compileStorageClearExpression())\n\t\t}\n\t}\n\n\t#origin(value: string): string | undefined {\n\t\tconst result = attempt(() => new URL(value))\n\t\tif (!result.success) return undefined\n\t\tif (result.value.protocol !== 'http:' && result.value.protocol !== 'https:') return undefined\n\t\treturn result.value.origin\n\t}\n\n\t#validate(value: string): string {\n\t\tconst origin = this.#origin(value)\n\t\tif (origin === undefined) {\n\t\t\tthrow new BrowserError(\n\t\t\t\t'Browser storage origin must be an absolute HTTP(S) origin',\n\t\t\t\tundefined,\n\t\t\t\t{\n\t\t\t\t\torigin: value,\n\t\t\t\t},\n\t\t\t)\n\t\t}\n\t\treturn origin\n\t}\n}\n","import type {\n\tBrowserContextEventMap,\n\tBrowserContextInterface,\n\tBrowserContextOptions,\n\tBrowserCookieManagerInterface,\n\tBrowserDownloadOptions,\n\tBrowserEmulationManagerInterface,\n\tBrowserEmulationOptions,\n\tBrowserPageInterface,\n\tBrowserPageOptions,\n\tBrowserPermissionManagerInterface,\n\tBrowserStorageManagerInterface,\n\tBrowserViewport,\n\tCDPClientInterface,\n\tCDPTarget,\n\tBrowserWriterInterface,\n} from './types.js'\nimport type { EmitterInterface } from '@orkestrel/emitter'\nimport { BrowserCookieManager } from './BrowserCookieManager.js'\nimport { BrowserTransition } from './BrowserTransition.js'\nimport { BrowserEmulationManager } from './BrowserEmulationManager.js'\nimport { BrowserPage } from './BrowserPage.js'\nimport { BrowserPermissionManager } from './BrowserPermissionManager.js'\nimport { BrowserStorageManager } from './BrowserStorageManager.js'\nimport { BrowserError } from './errors.js'\nimport { readBrowserFrames, settleBrowserTeardown, validateBrowserViewport } from './helpers.js'\nimport { instanceOf, isRecord, isString } from '@orkestrel/contract'\nimport { Emitter } from '@orkestrel/emitter'\n\n// === BrowserContext\n\n/**\n * Owns pages and shared state inside one Chromium browser context.\n *\n * @example\n * ```ts\n * import { BrowserContext } from '@orkestrel/browser'\n *\n * const context = new BrowserContext(client)\n * const page = await context.create({ url: 'https://example.com' })\n * await context.destroy()\n * ```\n */\nexport class BrowserContext implements BrowserContextInterface {\n\treadonly #client: CDPClientInterface\n\treadonly #id: string | undefined\n\treadonly #viewport: BrowserViewport | undefined\n\treadonly #writer: BrowserWriterInterface | undefined\n\treadonly #downloads: BrowserDownloadOptions | undefined\n\treadonly #emitter: Emitter<BrowserContextEventMap>\n\treadonly #cookies: BrowserCookieManager\n\treadonly #permissions: BrowserPermissionManager\n\treadonly #storage: BrowserStorageManager\n\treadonly #emulation: BrowserEmulationManager\n\treadonly #pages: Map<string, BrowserPage> = new Map()\n\treadonly #creating: Set<Promise<BrowserPage>> = new Set()\n\treadonly #syncing: BrowserTransition = new BrowserTransition()\n\t#shutdown: Promise<void> | undefined\n\n\tconstructor(\n\t\tclient: CDPClientInterface,\n\t\tid?: string,\n\t\tviewport?: BrowserViewport,\n\t\twriter?: BrowserWriterInterface,\n\t\temulation?: BrowserEmulationOptions,\n\t\tdownloads?: BrowserDownloadOptions,\n\t\toptions?: BrowserContextOptions,\n\t) {\n\t\tthis.#client = client\n\t\tif (viewport !== undefined) validateBrowserViewport(viewport)\n\t\tthis.#id = id\n\t\tthis.#viewport = viewport\n\t\tthis.#writer = writer\n\t\tthis.#downloads = downloads\n\t\tthis.#emitter = new Emitter({\n\t\t\t...(options?.on !== undefined ? { on: options.on } : {}),\n\t\t\t...(options?.error !== undefined ? { error: options.error } : {}),\n\t\t})\n\t\tthis.#cookies = new BrowserCookieManager(client, id)\n\t\tthis.#permissions = new BrowserPermissionManager(client, id)\n\t\tthis.#storage = new BrowserStorageManager(this.#cookies, () => this.pages())\n\t\tthis.#emulation = new BrowserEmulationManager(() => this.pages(), emulation)\n\t}\n\n\tget emitter(): EmitterInterface<BrowserContextEventMap> {\n\t\treturn this.#emitter\n\t}\n\n\tget id(): string | undefined {\n\t\treturn this.#id\n\t}\n\n\tget cookies(): BrowserCookieManagerInterface {\n\t\treturn this.#cookies\n\t}\n\n\tget permissions(): BrowserPermissionManagerInterface {\n\t\treturn this.#permissions\n\t}\n\n\tget storage(): BrowserStorageManagerInterface {\n\t\treturn this.#storage\n\t}\n\n\tget emulation(): BrowserEmulationManagerInterface {\n\t\treturn this.#emulation\n\t}\n\n\tpage(index?: number): BrowserPageInterface | undefined {\n\t\tconst i = index ?? 0\n\t\tconst pages = [...this.#pages.values()]\n\t\treturn i >= 0 && i < pages.length ? pages[i] : undefined\n\t}\n\n\tpages(): readonly BrowserPageInterface[] {\n\t\treturn [...this.#pages.values()]\n\t}\n\n\tasync create(options?: BrowserPageOptions): Promise<BrowserPageInterface> {\n\t\tif (this.#shutdown !== undefined) throw new BrowserError('Browser context is closed')\n\n\t\tconst attempt = this.#create(options)\n\t\tthis.#creating.add(attempt)\n\t\ttry {\n\t\t\treturn await attempt\n\t\t} finally {\n\t\t\tthis.#creating.delete(attempt)\n\t\t}\n\t}\n\n\tasync sync(targets: readonly CDPTarget[]): Promise<void> {\n\t\tlet active = this.#syncing.pending\n\t\twhile (active !== undefined) {\n\t\t\tawait active\n\t\t\tactive = this.#syncing.pending\n\t\t}\n\t\tif (this.#shutdown !== undefined) throw new BrowserError('Browser context is closed')\n\n\t\tawait this.#syncing.execute(() => this.#sync(targets))\n\t}\n\n\tdestroy(): Promise<void> {\n\t\tconst active = this.#shutdown\n\t\tif (active !== undefined) return active\n\n\t\tconst shutdown = this.#destroyResources()\n\t\tthis.#shutdown = shutdown\n\t\treturn shutdown\n\t}\n\n\tclose(): Promise<void> {\n\t\tconst active = this.#shutdown\n\t\tif (active !== undefined) return active\n\n\t\tconst shutdown = this.#closeResources()\n\t\tthis.#shutdown = shutdown\n\t\treturn shutdown\n\t}\n\n\t// === Private helpers\n\n\tasync #create(options?: BrowserPageOptions): Promise<BrowserPage> {\n\t\tif (options?.viewport !== undefined) validateBrowserViewport(options.viewport)\n\t\tconst result: unknown = await this.#client.send('Target.createTarget', {\n\t\t\turl: 'about:blank',\n\t\t\t...(this.#id === undefined ? {} : { browserContextId: this.#id }),\n\t\t})\n\n\t\tif (!isRecord(result) || !isString(result['targetId'])) {\n\t\t\tthrow new BrowserError('Failed to create new browser target')\n\t\t}\n\n\t\tconst targetId = result['targetId']\n\t\tlet page: BrowserPage | undefined\n\n\t\ttry {\n\t\t\tconst viewport = options?.viewport ?? this.#viewport\n\t\t\tpage = await this.#attach(targetId, options?.url ?? 'about:blank', viewport, options)\n\n\t\t\tif (options?.url !== undefined && options.url !== 'about:blank') {\n\t\t\t\tawait page.navigate(options.url, {\n\t\t\t\t\t...(options.timeout !== undefined ? { timeout: options.timeout } : {}),\n\t\t\t\t})\n\t\t\t}\n\t\t\tif (this.#shutdown !== undefined) {\n\t\t\t\tthrow new BrowserError('Browser context closed during page creation')\n\t\t\t}\n\n\t\t\tthis.#pages.set(targetId, page)\n\t\t\tthis.#emitter.emit('page', page)\n\t\t\treturn page\n\t\t} catch (error) {\n\t\t\tif (page !== undefined) {\n\t\t\t\tawait page.close()\n\t\t\t} else {\n\t\t\t\tawait this.#closeTarget(targetId)\n\t\t\t}\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync #sync(targets: readonly CDPTarget[]): Promise<void> {\n\t\tconst pageTargets = targets.filter((target) => target.category === 'page')\n\t\tconst targetIds = new Set(pageTargets.map((target) => target.id))\n\n\t\tfor (const [id, page] of this.#pages) {\n\t\t\tif (targetIds.has(id)) continue\n\t\t\tawait page.destroy()\n\t\t\tthis.#pages.delete(id)\n\t\t}\n\n\t\tfor (const target of pageTargets) {\n\t\t\tif (this.#shutdown !== undefined || this.#pages.has(target.id)) continue\n\n\t\t\ttry {\n\t\t\t\tconst page = await this.#reattach(target.id, target.url, this.#viewport)\n\t\t\t\tif (this.#shutdown !== undefined) {\n\t\t\t\t\tawait page.destroy()\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tthis.#pages.set(target.id, page)\n\t\t\t\tthis.#emitter.emit('page', page)\n\t\t\t} catch {\n\t\t\t\t// A disappearing or unsupported target does not invalidate its siblings.\n\t\t\t}\n\t\t}\n\t}\n\n\tasync #attach(\n\t\ttargetId: string,\n\t\turl: string,\n\t\tviewport: BrowserViewport | undefined,\n\t\toptions?: BrowserPageOptions,\n\t): Promise<BrowserPage> {\n\t\tlet sessionId: string | undefined\n\t\tlet page: BrowserPage | undefined\n\n\t\ttry {\n\t\t\tsessionId = await this.#openSession(targetId)\n\t\t\tawait this.#enableSession(sessionId)\n\t\t\tconst frameId = await this.#mainFrame(sessionId)\n\t\t\tpage = new BrowserPage(\n\t\t\t\tthis.#client,\n\t\t\t\ttargetId,\n\t\t\t\tsessionId,\n\t\t\t\tthis.#writer,\n\t\t\t\turl,\n\t\t\t\tframeId,\n\t\t\t\tthis.#id,\n\t\t\t\tundefined,\n\t\t\t\toptions,\n\t\t\t)\n\t\t\tawait this.#configurePage(page)\n\t\t\tawait this.#emulation.attach(page)\n\t\t\tif (viewport !== undefined) await this.#applyViewport(sessionId, viewport)\n\t\t\tthis.#observe(page)\n\n\t\t\treturn page\n\t\t} catch (error) {\n\t\t\tif (page !== undefined) await page.destroy().catch(() => undefined)\n\t\t\telse if (sessionId !== undefined) await this.#detachSession(sessionId)\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync #reattach(\n\t\ttargetId: string,\n\t\turl: string,\n\t\tviewport: BrowserViewport | undefined,\n\t): Promise<BrowserPage> {\n\t\tlet sessionId: string | undefined\n\t\tlet page: BrowserPage | undefined\n\n\t\ttry {\n\t\t\tsessionId = await this.#openSession(targetId)\n\t\t\tawait this.#enableSession(sessionId)\n\t\t\tconst frameId = await this.#mainFrame(sessionId)\n\t\t\tpage = new BrowserPage(\n\t\t\t\tthis.#client,\n\t\t\t\ttargetId,\n\t\t\t\tsessionId,\n\t\t\t\tthis.#writer,\n\t\t\t\turl,\n\t\t\t\tframeId,\n\t\t\t\tthis.#id,\n\t\t\t)\n\t\t\tawait this.#configurePage(page)\n\t\t\tawait this.#emulation.attach(page)\n\t\t\tif (viewport !== undefined) await this.#tryViewport(sessionId, viewport)\n\t\t\tthis.#observe(page)\n\n\t\t\treturn page\n\t\t} catch (error) {\n\t\t\tif (page !== undefined) await page.destroy().catch(() => undefined)\n\t\t\telse if (sessionId !== undefined) await this.#detachSession(sessionId)\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync #destroyResources(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.#settle()\n\t\t\tconst failure = await settleBrowserTeardown(\n\t\t\t\t...[...this.#pages.values()].map((page) => () => page.destroy()),\n\t\t\t)\n\t\t\tthis.#pages.clear()\n\t\t\tif (failure !== undefined) throw failure\n\t\t} finally {\n\t\t\tthis.#finish()\n\t\t}\n\t}\n\n\tasync #closeResources(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.#settle()\n\t\t\tlet failure = await settleBrowserTeardown(\n\t\t\t\t...[...this.#pages.values()].map((page) => () => page.close()),\n\t\t\t)\n\t\t\tthis.#pages.clear()\n\n\t\t\tconst id = this.#id\n\t\t\tif (id !== undefined) {\n\t\t\t\tconst settled = await settleBrowserTeardown(() =>\n\t\t\t\t\tthis.#client.send('Target.disposeBrowserContext', { browserContextId: id }),\n\t\t\t\t)\n\t\t\t\tfailure ??= settled\n\t\t\t}\n\t\t\tif (failure !== undefined) throw failure\n\t\t} finally {\n\t\t\tthis.#finish()\n\t\t}\n\t}\n\n\tasync #settle(): Promise<void> {\n\t\tawait Promise.allSettled([...this.#creating])\n\t\tawait this.#syncing.pending?.catch(() => undefined)\n\t}\n\n\tasync #openSession(targetId: string): Promise<string> {\n\t\tconst result: unknown = await this.#client.send('Target.attachToTarget', {\n\t\t\ttargetId,\n\t\t\tflatten: true,\n\t\t})\n\t\tif (!isRecord(result) || !isString(result['sessionId'])) {\n\t\t\tthrow new BrowserError('Failed to attach to browser target')\n\t\t}\n\t\treturn result['sessionId']\n\t}\n\n\tasync #enableSession(sessionId: string): Promise<void> {\n\t\tawait this.#client.send('Page.enable', undefined, { session: sessionId })\n\t\tawait this.#client.send('Runtime.enable', undefined, { session: sessionId })\n\t}\n\n\tasync #mainFrame(sessionId: string): Promise<string> {\n\t\tconst result = await this.#client.send('Page.getFrameTree', undefined, { session: sessionId })\n\t\tconst frame = readBrowserFrames(result)[0]\n\t\tif (frame === undefined) throw new BrowserError('Failed to resolve the main browser frame')\n\t\treturn frame.id\n\t}\n\n\tasync #configurePage(page: BrowserPage): Promise<void> {\n\t\tawait page.send('Target.setAutoAttach', {\n\t\t\tautoAttach: true,\n\t\t\twaitForDebuggerOnStart: false,\n\t\t\tflatten: true,\n\t\t})\n\t\tawait page.send('Page.setInterceptFileChooserDialog', { enabled: true })\n\t\tconst download: Record<string, unknown> = {\n\t\t\tbehavior:\n\t\t\t\tthis.#downloads === undefined\n\t\t\t\t\t? 'default'\n\t\t\t\t\t: this.#downloads.named === true\n\t\t\t\t\t\t? 'allowAndName'\n\t\t\t\t\t\t: 'allow',\n\t\t\teventsEnabled: true,\n\t\t}\n\t\tif (this.#id !== undefined) download['browserContextId'] = this.#id\n\t\tif (this.#downloads !== undefined) download['downloadPath'] = this.#downloads.path\n\t\tawait this.#client.send('Browser.setDownloadBehavior', download)\n\t\tawait page.network.start()\n\t}\n\n\tasync #applyViewport(sessionId: string, viewport: BrowserViewport): Promise<void> {\n\t\tawait this.#client.send(\n\t\t\t'Emulation.setDeviceMetricsOverride',\n\t\t\t{\n\t\t\t\twidth: viewport.width,\n\t\t\t\theight: viewport.height,\n\t\t\t\tdeviceScaleFactor: viewport.scale ?? 1,\n\t\t\t\tmobile: viewport.mobile ?? false,\n\t\t\t\tscreenOrientation:\n\t\t\t\t\tviewport.landscape === undefined\n\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\ttype: viewport.landscape ? 'landscapePrimary' : 'portraitPrimary',\n\t\t\t\t\t\t\t\tangle: viewport.landscape ? 90 : 0,\n\t\t\t\t\t\t\t},\n\t\t\t},\n\t\t\t{ session: sessionId },\n\t\t)\n\t\tawait this.#client.send(\n\t\t\t'Emulation.setTouchEmulationEnabled',\n\t\t\t{ enabled: viewport.touch ?? false },\n\t\t\t{ session: sessionId },\n\t\t)\n\t}\n\n\tasync #tryViewport(sessionId: string, viewport: BrowserViewport): Promise<void> {\n\t\ttry {\n\t\t\tawait this.#applyViewport(sessionId, viewport)\n\t\t} catch {\n\t\t\t// Reattached targets may not support viewport emulation.\n\t\t}\n\t}\n\n\tasync #closeTarget(targetId: string): Promise<void> {\n\t\ttry {\n\t\t\tawait this.#client.send('Target.closeTarget', { targetId })\n\t\t} catch {\n\t\t\t// The target may already be gone.\n\t\t}\n\t}\n\n\tasync #detachSession(sessionId: string): Promise<void> {\n\t\ttry {\n\t\t\tawait this.#client.send('Target.detachFromTarget', { sessionId })\n\t\t} catch {\n\t\t\t// The session may already be detached.\n\t\t}\n\t}\n\n\t#observe(page: BrowserPage): void {\n\t\tpage.emitter.on('popup', (popup) => {\n\t\t\tif (this.#shutdown !== undefined) {\n\t\t\t\tvoid popup.destroy().catch(() => undefined)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (instanceOf(BrowserPage)(popup)) {\n\t\t\t\tvoid this.#adoptPopup(popup)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.#emitter.emit('page', popup)\n\t\t})\n\t\tpage.emitter.on('close', () => {\n\t\t\tif (this.#pages.get(page.target) === page) this.#pages.delete(page.target)\n\t\t})\n\t}\n\n\tasync #adoptPopup(popup: BrowserPage): Promise<void> {\n\t\ttry {\n\t\t\tawait this.#emulation.attach(popup)\n\t\t\tif (this.#shutdown !== undefined) {\n\t\t\t\tawait popup.destroy()\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.#pages.set(popup.target, popup)\n\t\t\tthis.#observe(popup)\n\t\t\tthis.#emitter.emit('page', popup)\n\t\t} catch {\n\t\t\tawait popup.destroy().catch(() => undefined)\n\t\t}\n\t}\n\n\t#finish(): void {\n\t\tif (this.#emitter.destroyed) return\n\t\tthis.#emitter.emit('close')\n\t\tthis.#emitter.destroy()\n\t}\n}\n","import type {\n\tBrowserSnapshotInput,\n\tBrowserSnapshotInterface,\n\tCDPClientInterface,\n\tCDPClientOptions,\n} from './types.js'\nimport { BrowserSnapshot } from './BrowserSnapshot.js'\nimport { CDPClient } from './CDPClient.js'\n\n/**\n * Creates a CDP client bound to the given transport.\n *\n * @param options - The transport (and optional timeout) the client uses\n * @returns A {@link CDPClientInterface}\n *\n * @example\n * ```ts\n * import { createCDPClient } from '@orkestrel/browser'\n *\n * const client = createCDPClient({ transport })\n * await client.connect()\n * ```\n */\nexport function createCDPClient(options: CDPClientOptions): CDPClientInterface {\n\treturn new CDPClient(options)\n}\n\n/**\n * Creates a navigable browser snapshot from decoded serializable data.\n *\n * @param input - Captured documents and computed-style names\n * @returns A {@link BrowserSnapshotInterface}\n *\n * @example\n * ```ts\n * import { createBrowserSnapshot, readBrowserSnapshot } from '@orkestrel/browser'\n *\n * const snapshot = createBrowserSnapshot(readBrowserSnapshot(captured, ['display']))\n * snapshot.find({ name: 'main' })\n * ```\n */\nexport function createBrowserSnapshot(input: BrowserSnapshotInput): BrowserSnapshotInterface {\n\treturn new BrowserSnapshot(input)\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../src/core/constants.ts","../../../src/core/errors.ts","../../../src/core/parsers.ts","../../../src/core/helpers.ts","../../../src/core/compilers.ts","../../../src/core/BrowserTransition.ts","../../../src/core/CDPClient.ts","../../../src/core/BrowserAccessibility.ts","../../../src/core/BrowserClock.ts","../../../src/core/BrowserCoverage.ts","../../../src/core/BrowserCookieManager.ts","../../../src/core/BrowserEmulationManager.ts","../../../src/core/BrowserCodegen.ts","../../../src/core/BrowserPerformance.ts","../../../src/core/BrowserProfiler.ts","../../../src/core/BrowserTracing.ts","../../../src/core/BrowserDiagnostics.ts","../../../src/core/BrowserDialog.ts","../../../src/core/BrowserDownload.ts","../../../src/core/BrowserHandle.ts","../../../src/core/BrowserKeyboard.ts","../../../src/core/BrowserMouse.ts","../../../src/core/BrowserLocator.ts","../../../src/core/BrowserSelectorManager.ts","../../../src/core/BrowserTouch.ts","../../../src/core/BrowserFrame.ts","../../../src/core/BrowserFileChooser.ts","../../../src/core/BrowserHARManager.ts","../../../src/core/BrowserRoute.ts","../../../src/core/BrowserWebSocket.ts","../../../src/core/BrowserNetworkManager.ts","../../../src/core/BrowserNavigationManager.ts","../../../src/core/BrowserScriptManager.ts","../../../src/core/BrowserSnapshot.ts","../../../src/core/BrowserWorker.ts","../../../src/core/BrowserPage.ts","../../../src/core/BrowserPermissionManager.ts","../../../src/core/BrowserStorageManager.ts","../../../src/core/BrowserContext.ts","../../../src/core/factories.ts"],"sourcesContent":["import type { BrowserMouseButton } from './types.js'\n\n// === Base64\n//\n// The lookup table is written out rather than computed from BASE64_CHARS at module scope:\n// constants.ts holds data, and a module-scope callback here is a placement violation the fleet\n// policy sweep rejects. Entry n of the table is BASE64_CHARS[n], and the whole-alphabet\n// round-trip in tests/src/core/helpers.test.ts fails on any single-entry disagreement.\n\n/** Holds the index-ordered base64 alphabet used to build {@link BASE64_LOOKUP}. */\nexport const BASE64_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\n\n/** Maps each base64 character to its 6-bit value, derived from {@link BASE64_CHARS}. */\nexport const BASE64_LOOKUP: Readonly<Record<string, number>> = Object.freeze({\n\tA: 0,\n\tB: 1,\n\tC: 2,\n\tD: 3,\n\tE: 4,\n\tF: 5,\n\tG: 6,\n\tH: 7,\n\tI: 8,\n\tJ: 9,\n\tK: 10,\n\tL: 11,\n\tM: 12,\n\tN: 13,\n\tO: 14,\n\tP: 15,\n\tQ: 16,\n\tR: 17,\n\tS: 18,\n\tT: 19,\n\tU: 20,\n\tV: 21,\n\tW: 22,\n\tX: 23,\n\tY: 24,\n\tZ: 25,\n\ta: 26,\n\tb: 27,\n\tc: 28,\n\td: 29,\n\te: 30,\n\tf: 31,\n\tg: 32,\n\th: 33,\n\ti: 34,\n\tj: 35,\n\tk: 36,\n\tl: 37,\n\tm: 38,\n\tn: 39,\n\to: 40,\n\tp: 41,\n\tq: 42,\n\tr: 43,\n\ts: 44,\n\tt: 45,\n\tu: 46,\n\tv: 47,\n\tw: 48,\n\tx: 49,\n\ty: 50,\n\tz: 51,\n\t'0': 52,\n\t'1': 53,\n\t'2': 54,\n\t'3': 55,\n\t'4': 56,\n\t'5': 57,\n\t'6': 58,\n\t'7': 59,\n\t'8': 60,\n\t'9': 61,\n\t'+': 62,\n\t'/': 63,\n})\n\n// === Browser\n\n/**\n * Sets the default timeout for browser connection, requests, and navigation, `30_000`\n * milliseconds.\n */\nexport const BROWSER_DEFAULT_TIMEOUT_MS = 30_000\n\n/**\n * Caps the serialized-character length for an `evaluate()`/`content()` result at `2_500_000`,\n * enforced in-page before the result is returned to CDP.\n *\n * @remarks\n * This counts UTF-16 string length (`String#length`), not transport bytes —\n * the actual CDP frame is UTF-8 encoded (up to 3 bytes/char for common\n * multibyte content) and carries additional JSON/CDP framing overhead on top\n * of the raw content. A `Runtime.evaluate` result above this size, once\n * framed as a CDP JSON response, overflows the native WebSocket inbound frame\n * limit and closes the whole CDP connection — a page-level failure with no\n * clean error. The limit is set well under the observed ~3-4MB transport\n * ceiling (rather than at it) to leave headroom for the length-vs-bytes gap\n * and framing overhead. The cap is enforced by stringifying the candidate\n * result in-page and throwing a recognizable sentinel error (see\n * {@link BROWSER_RESULT_LIMIT_SENTINEL_PREFIX}) before the oversized frame is\n * ever produced, so the caller gets a coded error instead of a dropped\n * connection.\n */\nexport const BROWSER_RESULT_LIMIT = 2_500_000\n\n/**\n * Names the distinctive prefix for the in-page result-limit sentinel error,\n * `'[[ORKESTREL_BROWSER_RESULT_LIMIT]]'`, immediately followed by the serialized length.\n *\n * @remarks\n * Deliberately unlikely to appear in a page's own thrown error text (unlike\n * a plain `BROWSER_RESULT_LIMIT: ` label), so {@link BROWSER_RESULT_LIMIT_PATTERN}\n * can distinguish the guard's own throw from a page error that merely\n * mentions similar text.\n */\nexport const BROWSER_RESULT_LIMIT_SENTINEL_PREFIX = '[[ORKESTREL_BROWSER_RESULT_LIMIT]]'\n\n/**\n * Matches the in-page result-limit sentinel error message, anchored immediately after the\n * `Error:` (optionally `Uncaught Error:`) prefix Chromium prepends to a thrown error's\n * description, `/^(?:Uncaught )?Error: \\[\\[ORKESTREL_BROWSER_RESULT_LIMIT\\]\\](\\d+)/`.\n *\n * @remarks\n * The anchor matches the guard's own throw only at the start of the message, rather than\n * wherever the substring happens to occur.\n */\nexport const BROWSER_RESULT_LIMIT_PATTERN = new RegExp(\n\t`^(?:Uncaught )?Error: \\\\[\\\\[ORKESTREL_BROWSER_RESULT_LIMIT\\\\]\\\\](\\\\d+)`,\n)\n\n/**\n * Sets the poll interval while waiting for a selector to appear, `100` milliseconds.\n *\n * @remarks\n * A wait adds the same interval as slack to its own CDP call timeout, so the in-page poll\n * expires before the call carrying it. Host-side CDP readiness probes wait it out between\n * attempts.\n */\nexport const BROWSER_WAIT_POLL_INTERVAL_MS = 100\n\n/**\n * Sets the default maximum node count accepted from a decoded CDP DOM snapshot, `100_000`.\n */\nexport const BROWSER_SNAPSHOT_NODE_LIMIT = 100_000\n\n/** Names the isolated world used for iframe evaluation, `'__orkestrelBrowserFrame'`. */\nexport const BROWSER_FRAME_WORLD_NAME = '__orkestrelBrowserFrame'\n\n/** Names the attribute the semantic test-id selector uses. */\nexport const BROWSER_TEST_ID_ATTRIBUTE = 'data-testid'\n\n/** Sets the number of animation frames whose element bounds must agree before trusted input. */\nexport const BROWSER_STABLE_FRAME_COUNT = 2\n\n/**\n * Holds the in-page visibility predicate source, over a `style` computed style and a\n * `rect` bounding box already in scope at the interpolation site.\n *\n * @remarks\n * Every compiled expression that decides whether an element is visible\n * interpolates this one source, so what \"visible\" means has a single\n * definition rather than one copy per compiler.\n */\nexport const BROWSER_VISIBILITY_SOURCE =\n\t\"style.display !== 'none' && style.visibility !== 'hidden' && style.visibility !== 'collapse' && rect.width > 0 && rect.height > 0\"\n\n/** Maps a canonical modifier name to its CDP Input modifier bit value. */\nexport const BROWSER_KEY_MODIFIERS: Readonly<Record<string, number>> = Object.freeze({\n\tAlt: 1,\n\tControl: 2,\n\tMeta: 4,\n\tShift: 8,\n})\n\n/** Maps each public mouse button to its CDP Input pressed-button bit value. */\nexport const BROWSER_MOUSE_BUTTON_MASKS: Readonly<Record<BrowserMouseButton, number>> =\n\tObject.freeze({\n\t\tleft: 1,\n\t\tright: 2,\n\t\tmiddle: 4,\n\t\tback: 8,\n\t\tforward: 16,\n\t})\n\n/**\n * Names the tool identity embedded in HAR 1.2 documents.\n *\n * @remarks\n * `version` is this package's own released version. A parity test in\n * `tests/src/core/BrowserHARManager.test.ts` compares it against the manifest,\n * so the archive stamp cannot drift away from the release that wrote it.\n */\nexport const BROWSER_HAR_CREATOR = Object.freeze({\n\tname: '@orkestrel/browser',\n\tversion: '0.0.17',\n})\n\n/** Names the attribute that tags temporary screenshot styles and masks. */\nexport const BROWSER_SCREENSHOT_ATTRIBUTE = 'data-orkestrel-screenshot'\n\n/**\n * Bounds the best-effort `Page.stopLoading` call issued after a failed `navigate()` at `1_000`\n * milliseconds.\n *\n * @remarks\n * A wedged renderer can make the underlying CDP call hang for the full\n * per-call timeout; capping it to a small fixed bound keeps a navigate\n * failure's total latency close to the original timeout instead of doubling\n * it. Best-effort only — never masks the original navigate error.\n */\nexport const BROWSER_STOP_LOADING_TIMEOUT_MS = 1_000\n\n/** Sets the default viewport width, `1280` pixels. */\nexport const BROWSER_DEFAULT_VIEWPORT_WIDTH = 1280\n\n/** Sets the default viewport height, `720` pixels. */\nexport const BROWSER_DEFAULT_VIEWPORT_HEIGHT = 720\n\n// === Browser codegen\n\n/**\n * Names the CDP runtime binding the codegen recorder script calls into,\n * `'__orkestrelBrowserCodegen'`.\n */\nexport const BROWSER_CODEGEN_BINDING_NAME = '__orkestrelBrowserCodegen'\n\n/**\n * Holds the in-page recorder script injected through `Page.addScriptToEvaluateOnNewDocument`\n * and `Runtime.evaluate`.\n *\n * @remarks\n * Attaches capturing-phase listeners for `click`, `input` (fill), and `change` (select) on\n * `document`, builds a stable CSS selector for the target element, and forwards each action\n * to the CDP binding ({@link BROWSER_CODEGEN_BINDING_NAME}) as a JSON string payload. A\n * `contenteditable` fill is captured through `input` events, the same way an input or a\n * textarea is. Guarded to install exactly once per document (`window[name]` sentinel) so\n * repeated injection on every new document is idempotent.\n */\nexport const BROWSER_CODEGEN_SOURCE = `(() => {\n\tconst bindingName = ${JSON.stringify(BROWSER_CODEGEN_BINDING_NAME)}\n\tif (window[bindingName + '__installed']) return\n\twindow[bindingName + '__installed'] = true\n\n\tconst selectorFor = (el) => {\n\t\tif (el.id) return '#' + CSS.escape(el.id)\n\t\tconst parts = []\n\t\tlet node = el\n\t\twhile (node && node.nodeType === 1 && parts.length < 8) {\n\t\t\tlet part = node.tagName.toLowerCase()\n\t\t\tif (node.classList && node.classList.length > 0) {\n\t\t\t\tpart += '.' + Array.from(node.classList).map((cls) => CSS.escape(cls)).join('.')\n\t\t\t}\n\t\t\tconst parent = node.parentElement\n\t\t\tif (parent) {\n\t\t\t\tconst siblings = Array.from(parent.children).filter((c) => c.tagName === node.tagName)\n\t\t\t\tif (siblings.length > 1) {\n\t\t\t\t\tpart += ':nth-of-type(' + (siblings.indexOf(node) + 1) + ')'\n\t\t\t\t}\n\t\t\t}\n\t\t\tparts.unshift(part)\n\t\t\tnode = parent\n\t\t}\n\t\treturn parts.join(' > ')\n\t}\n\n\tconst send = (payload) => {\n\t\tif (typeof window[bindingName] === 'function') {\n\t\t\twindow[bindingName](JSON.stringify(payload))\n\t\t}\n\t}\n\n\tdocument.addEventListener(\n\t\t'click',\n\t\t(event) => {\n\t\t\tconst target = event.target\n\t\t\tif (!target || target.nodeType !== 1) return\n\t\t\tsend({ action: 'click', selector: selectorFor(target) })\n\t\t},\n\t\ttrue,\n\t)\n\n\tconst fillableTypes = new Set([\n\t\t'text',\n\t\t'search',\n\t\t'url',\n\t\t'tel',\n\t\t'email',\n\t\t'password',\n\t\t'number',\n\t])\n\n\tdocument.addEventListener(\n\t\t'input',\n\t\t(event) => {\n\t\t\tconst target = event.target\n\t\t\tif (!target || target.nodeType !== 1) return\n\n\t\t\tif (target.isContentEditable) {\n\t\t\t\tsend({ action: 'fill', selector: selectorFor(target), value: target.textContent || '' })\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif (typeof target.value !== 'string') return\n\t\t\tconst tag = target.tagName\n\t\t\tif (tag === 'TEXTAREA') {\n\t\t\t\tsend({ action: 'fill', selector: selectorFor(target), value: target.value })\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (tag === 'INPUT' && fillableTypes.has((target.type || 'text').toLowerCase())) {\n\t\t\t\tsend({ action: 'fill', selector: selectorFor(target), value: target.value })\n\t\t\t}\n\t\t},\n\t\ttrue,\n\t)\n\n\tdocument.addEventListener(\n\t\t'change',\n\t\t(event) => {\n\t\t\tconst target = event.target\n\t\t\tif (!target || target.tagName !== 'SELECT') return\n\t\t\tconst values = Array.from(target.selectedOptions || []).map((option) => option.value)\n\t\t\tsend({ action: 'select', selector: selectorFor(target), values })\n\t\t},\n\t\ttrue,\n\t)\n})()`\n","import { isInstance } from '@orkestrel/contract'\n\n// === Browser errors\n\n/**\n * Represents the base error for all browser automation operations, carrying the code\n * `BROWSER_ERROR` and a `context` record.\n *\n * @remarks\n * A caller branches in a `catch` on the `code` rather than parsing message strings.\n */\nexport class BrowserError extends Error {\n\treadonly code: string\n\treadonly context: Readonly<Record<string, unknown>> | undefined\n\n\tconstructor(\n\t\tmessage: string,\n\t\tcode = 'BROWSER_ERROR',\n\t\tcontext?: Readonly<Record<string, unknown>>,\n\t) {\n\t\tsuper(message)\n\t\tthis.name = 'BrowserError'\n\t\tthis.code = code\n\t\tthis.context = context\n\t}\n}\n\n/**\n * Reports that a selector-based lookup or wait timed out without the element appearing, under\n * the code `BROWSER_SELECTOR_ERROR`.\n */\nexport class BrowserSelectorError extends BrowserError {\n\tconstructor(message: string, context?: Readonly<Record<string, unknown>>) {\n\t\tsuper(message, 'BROWSER_SELECTOR_ERROR', context)\n\t\tthis.name = 'BrowserSelectorError'\n\t}\n}\n\n/**\n * Reports that a CDP request received an error response from the remote endpoint, under the\n * code `BROWSER_CDP_ERROR`, with the `method`, the CDP `code`, the `message`, and any `data`\n * in its context.\n *\n * @remarks\n * Branch on the protocol-level error in `context` instead of parsing the message string.\n */\nexport class CDPError extends BrowserError {\n\tconstructor(message: string, context?: Readonly<Record<string, unknown>>) {\n\t\tsuper(message, 'BROWSER_CDP_ERROR', context)\n\t\tthis.name = 'CDPError'\n\t}\n}\n\n/**\n * Reports that a CDP request could not be sent or completed because the client was not in a\n * connectable state — not connected, closed while connecting, or the connection dropped\n * mid-request — under the code `BROWSER_CDP_CONNECTION_ERROR`.\n */\nexport class CDPConnectionError extends BrowserError {\n\tconstructor(message: string, context?: Readonly<Record<string, unknown>>) {\n\t\tsuper(message, 'BROWSER_CDP_CONNECTION_ERROR', context)\n\t\tthis.name = 'CDPConnectionError'\n\t}\n}\n\n/**\n * Reports that a pending CDP request was not answered within its timeout window, under the\n * code `BROWSER_CDP_TIMEOUT_ERROR`.\n */\nexport class CDPTimeoutError extends BrowserError {\n\tconstructor(message: string, context?: Readonly<Record<string, unknown>>) {\n\t\tsuper(message, 'BROWSER_CDP_TIMEOUT_ERROR', context)\n\t\tthis.name = 'CDPTimeoutError'\n\t}\n}\n\n/**\n * Reports that an `evaluate()`/`content()` result exceeded {@link BROWSER_RESULT_LIMIT} and\n * was rejected in-page before it could overflow the CDP transport frame, under the code\n * `BROWSER_RESULT_LIMIT_ERROR`.\n */\nexport class BrowserResultLimitError extends BrowserError {\n\tconstructor(message: string, context?: Readonly<Record<string, unknown>>) {\n\t\tsuper(message, 'BROWSER_RESULT_LIMIT_ERROR', context)\n\t\tthis.name = 'BrowserResultLimitError'\n\t}\n}\n\n// === Browser type guards\n\n/**\n * Narrows an unknown value to a `BrowserError`.\n *\n * @param value - Value to check\n * @returns True if value is a BrowserError instance; false otherwise\n */\nexport function isBrowserError(value: unknown): value is BrowserError {\n\treturn isInstance(value, BrowserError)\n}\n\n/**\n * Narrows an unknown value to a `BrowserSelectorError`.\n *\n * @param value - Value to check\n * @returns True if value is a BrowserSelectorError instance; false otherwise\n */\nexport function isBrowserSelectorError(value: unknown): value is BrowserSelectorError {\n\treturn isInstance(value, BrowserSelectorError)\n}\n\n/**\n * Narrows an unknown value to a `CDPError`.\n *\n * @param value - Value to check\n * @returns True if value is a CDPError instance; false otherwise\n */\nexport function isCDPError(value: unknown): value is CDPError {\n\treturn isInstance(value, CDPError)\n}\n\n/**\n * Narrows an unknown value to a `CDPConnectionError`.\n *\n * @param value - Value to check\n * @returns True if value is a CDPConnectionError instance; false otherwise\n */\nexport function isCDPConnectionError(value: unknown): value is CDPConnectionError {\n\treturn isInstance(value, CDPConnectionError)\n}\n\n/**\n * Narrows an unknown value to a `CDPTimeoutError`.\n *\n * @param value - Value to check\n * @returns True if value is a CDPTimeoutError instance; false otherwise\n */\nexport function isCDPTimeoutError(value: unknown): value is CDPTimeoutError {\n\treturn isInstance(value, CDPTimeoutError)\n}\n\n/**\n * Narrows an unknown value to a `BrowserResultLimitError`.\n *\n * @param value - Value to check\n * @returns True if value is a BrowserResultLimitError instance; false otherwise\n */\nexport function isBrowserResultLimitError(value: unknown): value is BrowserResultLimitError {\n\treturn isInstance(value, BrowserResultLimitError)\n}\n","import type {\n\tBrowserBindingCall,\n\tBrowserCodegenAction,\n\tBrowserConsoleMessage,\n\tBrowserCookiePartition,\n\tBrowserDownloadProgress,\n\tBrowserDownloadStart,\n\tBrowserPageError,\n\tBrowserRect,\n\tBrowserRequest,\n\tBrowserRequestFailure,\n\tBrowserResponse,\n\tBrowserSecurity,\n\tBrowserTiming,\n\tBrowserTimingRange,\n\tBrowserWebSocketFrame,\n} from './types.js'\nimport {\n\tattempt,\n\tisArray,\n\tisBoolean,\n\tisFiniteNumber,\n\tisInteger,\n\tisRecord,\n\tisString,\n\tparseArray,\n\tparseEnum,\n\tparseJSONAs,\n} from '@orkestrel/contract'\nimport {\n\treadBrowserAXValue,\n\treadBrowserHeaders,\n\treadBrowserRemoteValue,\n\treadBrowserStack,\n} from './helpers.js'\n\n/**\n * Coerces one `Network.requestWillBeSent` or `Fetch.requestPaused` event to a\n * `BrowserRequest`, or `undefined` off-shape.\n *\n * @param value - Unknown event parameters\n * @returns Request or undefined\n */\nexport function parseBrowserRequest(value: unknown): BrowserRequest | undefined {\n\tif (!isRecord(value) || !isString(value['requestId']) || !isRecord(value['request'])) {\n\t\treturn undefined\n\t}\n\tconst request = value['request']\n\tif (!isString(request['url']) || !isString(request['method'])) {\n\t\treturn undefined\n\t}\n\tconst timestamp = isFiniteNumber(value['timestamp']) ? value['timestamp'] : undefined\n\tconst walltime = isFiniteNumber(value['wallTime']) ? value['wallTime'] : undefined\n\treturn {\n\t\tid: value['requestId'],\n\t\tloader: isString(value['loaderId']) ? value['loaderId'] : undefined,\n\t\tframe: isString(value['frameId']) ? value['frameId'] : undefined,\n\t\turl: request['url'],\n\t\tmethod: request['method'],\n\t\theaders: readBrowserHeaders(request['headers']),\n\t\tpost: isString(request['postData']) ? request['postData'] : undefined,\n\t\tresource: isString(value['type'])\n\t\t\t? value['type']\n\t\t\t: isString(value['resourceType'])\n\t\t\t\t? value['resourceType']\n\t\t\t\t: undefined,\n\t\ttimestamp,\n\t\twalltime,\n\t\tredirect: parseBrowserResponseRecord(\n\t\t\tvalue['redirectResponse'],\n\t\t\tvalue['requestId'],\n\t\t\tisString(value['loaderId']) ? value['loaderId'] : '',\n\t\t\tisString(value['frameId']) ? value['frameId'] : undefined,\n\t\t\ttimestamp ?? 0,\n\t\t),\n\t}\n}\n\n/**\n * Coerces one `Network.responseReceived` event to a `BrowserResponse`, or\n * `undefined` off-shape.\n *\n * @param value - Unknown event parameters\n * @returns Response or undefined\n */\nexport function parseBrowserResponse(value: unknown): BrowserResponse | undefined {\n\tif (\n\t\t!isRecord(value) ||\n\t\t!isString(value['requestId']) ||\n\t\t!isString(value['loaderId']) ||\n\t\t!isFiniteNumber(value['timestamp'])\n\t) {\n\t\treturn undefined\n\t}\n\treturn parseBrowserResponseRecord(\n\t\tvalue['response'],\n\t\tvalue['requestId'],\n\t\tvalue['loaderId'],\n\t\tisString(value['frameId']) ? value['frameId'] : undefined,\n\t\tvalue['timestamp'],\n\t)\n}\n\n/**\n * Coerces one Chromium response object plus its event identity to a\n * `BrowserResponse`, or `undefined` off-shape.\n *\n * @param value - Unknown response object\n * @param id - Request id\n * @param loader - Loader id\n * @param frame - Optional frame id\n * @param timestamp - Monotonic event timestamp\n * @returns Response or undefined\n */\nexport function parseBrowserResponseRecord(\n\tvalue: unknown,\n\tid: string,\n\tloader: string,\n\tframe: string | undefined,\n\ttimestamp: number,\n): BrowserResponse | undefined {\n\tif (\n\t\t!isRecord(value) ||\n\t\t!isString(value['url']) ||\n\t\t!isFiniteNumber(value['status']) ||\n\t\t!isString(value['statusText']) ||\n\t\t!isString(value['mimeType']) ||\n\t\t!isString(value['protocol']) ||\n\t\t!isFiniteNumber(timestamp)\n\t) {\n\t\treturn undefined\n\t}\n\treturn {\n\t\tid,\n\t\tloader,\n\t\tframe,\n\t\turl: value['url'],\n\t\tstatus: value['status'],\n\t\tphrase: value['statusText'],\n\t\theaders: readBrowserHeaders(value['headers']),\n\t\tmime: value['mimeType'],\n\t\tprotocol: value['protocol'],\n\t\taddress: isString(value['remoteIPAddress']) ? value['remoteIPAddress'] : undefined,\n\t\tport: isFiniteNumber(value['remotePort']) ? value['remotePort'] : undefined,\n\t\tcached: value['fromDiskCache'] === true || value['fromPrefetchCache'] === true,\n\t\tworker: value['fromServiceWorker'] === true,\n\t\ttimestamp,\n\t\ttiming: parseBrowserTiming(value['timing']),\n\t\tsecurity: parseBrowserSecurity(value['securityDetails']),\n\t}\n}\n\n/**\n * Coerces Chromium response timing to a `BrowserTiming`, or `undefined`\n * off-shape.\n *\n * @param value - Unknown timing object\n * @returns Timing or undefined\n */\nexport function parseBrowserTiming(value: unknown): BrowserTiming | undefined {\n\tif (!isRecord(value) || !isFiniteNumber(value['requestTime']) || value['requestTime'] < 0) {\n\t\treturn undefined\n\t}\n\tconst receive = value['receiveHeadersEnd']\n\treturn {\n\t\trequest: value['requestTime'],\n\t\tproxy: parseBrowserTimingRange(value, 'proxyStart', 'proxyEnd'),\n\t\tdns: parseBrowserTimingRange(value, 'dnsStart', 'dnsEnd'),\n\t\tconnect: parseBrowserTimingRange(value, 'connectStart', 'connectEnd'),\n\t\tssl: parseBrowserTimingRange(value, 'sslStart', 'sslEnd'),\n\t\tsend: parseBrowserTimingRange(value, 'sendStart', 'sendEnd'),\n\t\treceive: isFiniteNumber(receive) && receive >= 0 ? receive : undefined,\n\t}\n}\n\n/**\n * Coerces one named start/end pair of Chromium network timing to a\n * `BrowserTimingRange`, or `undefined` off-shape.\n *\n * @param value - Unknown timing object\n * @param start - Start field\n * @param end - End field\n * @returns Timing range or undefined\n */\nexport function parseBrowserTimingRange(\n\tvalue: unknown,\n\tstart: string,\n\tend: string,\n): BrowserTimingRange | undefined {\n\tif (!isRecord(value)) return undefined\n\tconst startValue = value[start]\n\tconst endValue = value[end]\n\tif (\n\t\t!isFiniteNumber(startValue) ||\n\t\tstartValue < 0 ||\n\t\t!isFiniteNumber(endValue) ||\n\t\tendValue < startValue\n\t) {\n\t\treturn undefined\n\t}\n\treturn { start: startValue, end: endValue }\n}\n\n/**\n * Coerces Chromium TLS security details to a `BrowserSecurity`, or `undefined`\n * off-shape.\n *\n * @param value - Unknown security details\n * @returns Security metadata or undefined\n */\nexport function parseBrowserSecurity(value: unknown): BrowserSecurity | undefined {\n\tif (\n\t\t!isRecord(value) ||\n\t\t!isString(value['protocol']) ||\n\t\t!isString(value['issuer']) ||\n\t\t!isFiniteNumber(value['validFrom']) ||\n\t\t!isFiniteNumber(value['validTo']) ||\n\t\tvalue['validTo'] < value['validFrom']\n\t) {\n\t\treturn undefined\n\t}\n\treturn {\n\t\tprotocol: value['protocol'],\n\t\tissuer: value['issuer'],\n\t\tfrom: value['validFrom'],\n\t\tto: value['validTo'],\n\t}\n}\n\n/**\n * Coerces one `Network.loadingFailed` event to a `BrowserRequestFailure`, or\n * `undefined` off-shape.\n *\n * @param value - Unknown event parameters\n * @returns Failure or undefined\n */\nexport function parseBrowserRequestFailure(value: unknown): BrowserRequestFailure | undefined {\n\tif (!isRecord(value) || !isString(value['requestId']) || !isString(value['errorText'])) {\n\t\treturn undefined\n\t}\n\treturn {\n\t\tid: value['requestId'],\n\t\terror: value['errorText'],\n\t\tcancelled: value['canceled'] === true,\n\t\tblocked: isString(value['blockedReason']) ? value['blockedReason'] : undefined,\n\t}\n}\n\n/**\n * Coerces one WebSocket frame event to a `BrowserWebSocketFrame`, or\n * `undefined` off-shape.\n *\n * @param value - Unknown event parameters\n * @returns Frame or undefined\n */\nexport function parseBrowserWebSocketFrame(value: unknown): BrowserWebSocketFrame | undefined {\n\tif (!isRecord(value) || !isRecord(value['response']) || !isFiniteNumber(value['timestamp'])) {\n\t\treturn undefined\n\t}\n\tconst frame = value['response']\n\tif (!isInteger(frame['opcode']) || frame['opcode'] < 0 || !isString(frame['payloadData'])) {\n\t\treturn undefined\n\t}\n\treturn {\n\t\topcode: frame['opcode'],\n\t\tdata: frame['payloadData'],\n\t\tmasked: frame['mask'] === true,\n\t\ttimestamp: value['timestamp'],\n\t}\n}\n\n/**\n * Coerces one Runtime binding invocation to a `BrowserBindingCall`, or\n * `undefined` off-shape.\n *\n * @param value - Unknown `Runtime.bindingCalled` parameters\n * @returns Valid call or undefined\n */\nexport function parseBrowserBindingCall(value: unknown): BrowserBindingCall | undefined {\n\tif (\n\t\t!isRecord(value) ||\n\t\t!isString(value['name']) ||\n\t\t!isString(value['payload']) ||\n\t\t!isInteger(value['executionContextId'])\n\t) {\n\t\treturn undefined\n\t}\n\tconst payload = parseJSONAs(value['payload'], isRecord)\n\tif (\n\t\tpayload === undefined ||\n\t\t!isString(payload['id']) ||\n\t\t!isString(payload['name']) ||\n\t\t!isArray(payload['args']) ||\n\t\tpayload['name'] !== value['name']\n\t) {\n\t\treturn undefined\n\t}\n\treturn {\n\t\tid: payload['id'],\n\t\tname: payload['name'],\n\t\targs: payload['args'],\n\t\tcontext: value['executionContextId'],\n\t}\n}\n\n/**\n * Coerces a string-valued Accessibility-domain AXValue to a string, or\n * `undefined` off-shape.\n *\n * @param value - Unknown AX value\n * @returns String or undefined\n */\nexport function parseBrowserAXString(value: unknown): string | undefined {\n\tconst decoded = readBrowserAXValue(value)\n\treturn isString(decoded) ? decoded : undefined\n}\n\n/**\n * Coerces an optional Chromium cookie partition key to a\n * `BrowserCookiePartition`, or `undefined` off-shape.\n *\n * @param value - Unknown partition value\n * @returns Partition key or undefined\n */\nexport function parseBrowserCookiePartition(value: unknown): BrowserCookiePartition | undefined {\n\tif (!isRecord(value) || !isString(value['topLevelSite'])) return undefined\n\treturn {\n\t\tsite: value['topLevelSite'],\n\t\t...(isBoolean(value['hasCrossSiteAncestor'])\n\t\t\t? { ancestor: value['hasCrossSiteAncestor'] }\n\t\t\t: {}),\n\t}\n}\n\n/**\n * Coerces one `Runtime.consoleAPICalled` event to a `BrowserConsoleMessage`, or\n * `undefined` off-shape.\n *\n * @param value - Unknown event parameters\n * @returns Console message or undefined\n */\nexport function parseBrowserConsoleMessage(value: unknown): BrowserConsoleMessage | undefined {\n\tif (\n\t\t!isRecord(value) ||\n\t\t!isString(value['type']) ||\n\t\t!isFiniteNumber(value['timestamp']) ||\n\t\t!isArray(value['args'])\n\t) {\n\t\treturn undefined\n\t}\n\tconst values = value['args'].map(readBrowserRemoteValue)\n\treturn {\n\t\tlevel: value['type'],\n\t\ttext: values\n\t\t\t.map((entry) => {\n\t\t\t\tif (isString(entry)) return entry\n\t\t\t\tconst serialized = attempt<unknown>(() => JSON.stringify(entry))\n\t\t\t\treturn serialized.success && isString(serialized.value) ? serialized.value : String(entry)\n\t\t\t})\n\t\t\t.join(' '),\n\t\tvalues,\n\t\ttimestamp: value['timestamp'],\n\t\tstack: readBrowserStack(value['stackTrace']),\n\t}\n}\n\n/**\n * Coerces one `Runtime.exceptionThrown` event to a `BrowserPageError`, or\n * `undefined` off-shape.\n *\n * @param value - Unknown event parameters\n * @returns Page error or undefined\n */\nexport function parseBrowserPageError(value: unknown): BrowserPageError | undefined {\n\tif (!isRecord(value) || !isRecord(value['exceptionDetails'])) return undefined\n\tconst details = value['exceptionDetails']\n\tconst timestamp = isFiniteNumber(value['timestamp']) ? value['timestamp'] : Date.now()\n\tconst exception = readBrowserRemoteValue(details['exception'])\n\tconst message = isString(exception)\n\t\t? exception\n\t\t: isString(details['text'])\n\t\t\t? details['text']\n\t\t\t: 'Uncaught page exception'\n\treturn {\n\t\tmessage,\n\t\tstack: readBrowserStack(details['stackTrace']),\n\t\ttimestamp,\n\t}\n}\n\n/**\n * Coerces one `Browser.downloadWillBegin` event to a `BrowserDownloadStart`, or\n * `undefined` off-shape.\n *\n * @param value - Unknown event parameters\n * @returns Download start or undefined\n */\nexport function parseBrowserDownloadStart(value: unknown): BrowserDownloadStart | undefined {\n\tif (\n\t\t!isRecord(value) ||\n\t\t!isString(value['guid']) ||\n\t\t!isString(value['url']) ||\n\t\t!isString(value['suggestedFilename']) ||\n\t\t!isString(value['frameId'])\n\t) {\n\t\treturn undefined\n\t}\n\treturn {\n\t\tid: value['guid'],\n\t\turl: value['url'],\n\t\tname: value['suggestedFilename'],\n\t\tframe: value['frameId'],\n\t}\n}\n\n/**\n * Coerces one `Browser.downloadProgress` event to a `BrowserDownloadProgress`,\n * or `undefined` off-shape.\n *\n * @param value - Unknown event parameters\n * @returns Download id and progress, or undefined\n */\nexport function parseBrowserDownloadProgress(\n\tvalue: unknown,\n): readonly [id: string, progress: BrowserDownloadProgress] | undefined {\n\tif (\n\t\t!isRecord(value) ||\n\t\t!isString(value['guid']) ||\n\t\t!isFiniteNumber(value['receivedBytes']) ||\n\t\tvalue['receivedBytes'] < 0 ||\n\t\t!isFiniteNumber(value['totalBytes']) ||\n\t\tvalue['totalBytes'] < 0\n\t) {\n\t\treturn undefined\n\t}\n\tconst state = parseEnum(value['state'], ['completed', 'canceled', 'inProgress'])\n\tconst status =\n\t\tstate === 'completed'\n\t\t\t? 'complete'\n\t\t\t: state === 'canceled'\n\t\t\t\t? 'cancelled'\n\t\t\t\t: state === 'inProgress'\n\t\t\t\t\t? 'pending'\n\t\t\t\t\t: undefined\n\tif (status === undefined) return undefined\n\treturn [\n\t\tvalue['guid'],\n\t\t{\n\t\t\tstatus,\n\t\t\treceived: value['receivedBytes'],\n\t\t\ttotal: value['totalBytes'],\n\t\t\t...(isString(value['filePath']) ? { path: value['filePath'] } : {}),\n\t\t},\n\t]\n}\n\n/**\n * Coerces a codegen binding payload string to a `BrowserCodegenAction`, or\n * `undefined` off-shape.\n *\n * @remarks\n * The in-page recorder script calls the CDP binding with a JSON string\n * payload shaped like a {@link BrowserCodegenAction}. Returns `undefined`\n * when the payload is not valid JSON or does not match a known action shape.\n *\n * @param payload - Raw binding call payload (the CDP `payload` param)\n * @returns The parsed action, or `undefined` when the payload is malformed\n */\nexport function parseCodegenActionPayload(payload: unknown): BrowserCodegenAction | undefined {\n\tif (!isString(payload)) return undefined\n\tconst parsed = parseJSONAs(payload, isRecord)\n\tif (parsed === undefined) return undefined\n\n\tconst action = parseEnum(parsed['action'], ['click', 'fill', 'select'])\n\tconst selector = parsed['selector']\n\n\tif (action === 'click' && isString(selector)) {\n\t\treturn { action: 'click', selector }\n\t}\n\n\tif (action === 'fill' && isString(selector) && isString(parsed['value'])) {\n\t\treturn { action: 'fill', selector, value: parsed['value'] }\n\t}\n\n\tif (action === 'select' && isString(selector)) {\n\t\tconst values = parseArray(parsed['values'], isString)\n\t\tif (values !== undefined) return { action: 'select', selector, values }\n\t}\n\n\treturn undefined\n}\n\n/**\n * Coerces a `Page.frameNavigated` CDP event to a `navigate` codegen action, or `undefined`\n * off-shape and for every frame but the top-level one.\n *\n * @remarks\n * Only the top-level (main) frame's navigation is recorded — a frame\n * carrying a `parentId` is a sub-frame and is ignored.\n *\n * @param params - The CDP `Page.frameNavigated` event params\n * @returns A `navigate` action, or `undefined` when the event is not a\n * top-level navigation with a resolvable URL\n */\nexport function parseCodegenNavigateAction(\n\tparams: Readonly<Record<string, unknown>>,\n): BrowserCodegenAction | undefined {\n\tconst frame = params['frame']\n\tif (!isRecord(frame)) return undefined\n\tif ('parentId' in frame) return undefined\n\tif (!isString(frame['url'])) return undefined\n\n\treturn { action: 'navigate', url: frame['url'] }\n}\n\n/**\n * Coerces an unknown value to an all-number array, or `undefined` off-shape.\n *\n * @param value - Candidate value\n * @returns The number array, or undefined\n */\nexport function parseNumberArray(value: unknown): readonly number[] | undefined {\n\treturn parseArray(value, isFiniteNumber)\n}\n\n/**\n * Coerces one CDP snapshot string-table index to its string, or `undefined`\n * off-shape.\n *\n * @param strings - Snapshot string table\n * @param index - Candidate string index\n * @returns The resolved string, or undefined\n */\nexport function parseSnapshotString(\n\tstrings: readonly string[],\n\tindex: unknown,\n): string | undefined {\n\tif (!isInteger(index)) return undefined\n\treturn strings[index]\n}\n\n/**\n * Coerces a four-number CSS-pixel rectangle to a `BrowserRect`, or `undefined` off-shape.\n *\n * @param value - Candidate four-number array\n * @returns A rectangle, or undefined\n */\nexport function parseBrowserRect(value: unknown): BrowserRect | undefined {\n\tconst numbers = parseNumberArray(value)\n\tif (numbers === undefined || numbers.length !== 4) return undefined\n\tconst x = numbers[0]\n\tconst y = numbers[1]\n\tconst width = numbers[2]\n\tconst height = numbers[3]\n\tif (x === undefined || y === undefined || width === undefined || height === undefined) {\n\t\treturn undefined\n\t}\n\treturn [x, y, width, height]\n}\n","import type {\n\tBrowserCodegenAction,\n\tBrowserChord,\n\tBrowserCookie,\n\tBrowserCookieInput,\n\tBrowserContextOptions,\n\tBrowserCoverageRange,\n\tBrowserDocument,\n\tBrowserEmulationOptions,\n\tBrowserFrameInfo,\n\tBrowserFunctionCoverage,\n\tBrowserHAR,\n\tBrowserHAREntry,\n\tBrowserHARPending,\n\tBrowserHARValue,\n\tBrowserLayout,\n\tBrowserMetric,\n\tBrowserOperationOptions,\n\tBrowserAccessibilityOptions,\n\tBrowserAccessibilitySnapshot,\n\tBrowserAXNode,\n\tBrowserKey,\n\tBrowserNode,\n\tBrowserNodePredicate,\n\tBrowserNodeQuery,\n\tBrowserProfile,\n\tBrowserProfileFrame,\n\tBrowserProfileNode,\n\tBrowserMouseButton,\n\tBrowserPoint,\n\tBrowserPDFOptions,\n\tBrowserMedia,\n\tBrowserRequest,\n\tBrowserRouteQuery,\n\tBrowserQuad,\n\tBrowserSnapshotInput,\n\tBrowserScriptCoverage,\n\tBrowserScreenshotOptions,\n\tBrowserStorageEntry,\n\tBrowserStorageOrigin,\n\tBrowserStreamChunk,\n\tBrowserStackFrame,\n\tBrowserStyleCoverage,\n\tBrowserTeardownFunction,\n\tBrowserViewport,\n} from './types.js'\nimport {\n\tattempt,\n\tisArray,\n\tisBoolean,\n\tisFiniteNumber,\n\tisFunction,\n\tisInteger,\n\tisRecord,\n\tisString,\n\tparseArray,\n\tparseEnum,\n} from '@orkestrel/contract'\nimport {\n\tBASE64_CHARS,\n\tBASE64_LOOKUP,\n\tBROWSER_RESULT_LIMIT,\n\tBROWSER_RESULT_LIMIT_PATTERN,\n\tBROWSER_SNAPSHOT_NODE_LIMIT,\n\tBROWSER_KEY_MODIFIERS,\n\tBROWSER_MOUSE_BUTTON_MASKS,\n} from './constants.js'\nimport { BrowserError, BrowserResultLimitError } from './errors.js'\nimport {\n\tparseBrowserAXString,\n\tparseBrowserCookiePartition,\n\tparseBrowserRect,\n\tparseNumberArray,\n\tparseSnapshotString,\n} from './parsers.js'\n\n/**\n * Decodes a base64-encoded string into raw bytes.\n *\n * @remarks\n * Pure JS implementation — no `Buffer`, no `atob` (DOM-only) — so it runs\n * identically in Node and browser environments. Whitespace and `=` padding\n * are ignored; invalid characters are skipped.\n *\n * @param text - Base64-encoded input string\n * @returns Decoded bytes\n *\n * @example\n * ```ts\n * decodeBase64('aGVsbG8=') // Uint8Array [104, 101, 108, 108, 111]\n * ```\n */\nexport function decodeBase64(text: string): Uint8Array {\n\tconst clean = text.replace(/[^A-Za-z0-9+/]/g, '')\n\tconst bytes: number[] = []\n\n\tlet buffer = 0\n\tlet bits = 0\n\n\tfor (const char of clean) {\n\t\tconst value = BASE64_LOOKUP[char]\n\t\tif (value === undefined) continue\n\n\t\tbuffer = (buffer << 6) | value\n\t\tbits += 6\n\n\t\tif (bits >= 8) {\n\t\t\tbits -= 8\n\t\t\tbytes.push((buffer >> bits) & 0xff)\n\t\t}\n\t}\n\n\treturn new Uint8Array(bytes)\n}\n\n/**\n * Encodes raw bytes as base64 without relying on Node or DOM globals.\n *\n * @param bytes - Raw input bytes\n * @returns Base64 text\n */\nexport function encodeBase64(bytes: Uint8Array): string {\n\tlet result = ''\n\tfor (let index = 0; index < bytes.length; index += 3) {\n\t\tconst first = bytes[index]\n\t\tconst second = bytes[index + 1]\n\t\tconst third = bytes[index + 2]\n\t\tif (first === undefined) break\n\t\tconst value = (first << 16) | ((second ?? 0) << 8) | (third ?? 0)\n\t\tresult += BASE64_CHARS[(value >> 18) & 63] ?? ''\n\t\tresult += BASE64_CHARS[(value >> 12) & 63] ?? ''\n\t\tresult += second === undefined ? '=' : (BASE64_CHARS[(value >> 6) & 63] ?? '')\n\t\tresult += third === undefined ? '=' : (BASE64_CHARS[value & 63] ?? '')\n\t}\n\treturn result\n}\n\n/** Encodes UTF-8 text as bytes. */\nexport function textToBytes(value: string): Uint8Array {\n\treturn new TextEncoder().encode(value)\n}\n\n/** Decodes UTF-8 bytes as text. */\nexport function bytesToText(value: Uint8Array): string {\n\treturn new TextDecoder().decode(value)\n}\n\n/**\n * Converts a header record to Fetch-domain name/value entries.\n *\n * @param headers - Header record\n * @returns Protocol header entries\n */\nexport function browserHeadersToProtocol(\n\theaders: Readonly<Record<string, string>>,\n): ReadonlyArray<Readonly<Record<string, string>>> {\n\treturn Object.entries(headers).map(([name, value]) => ({ name, value }))\n}\n\n/**\n * Decodes a Chromium Headers object into string values, skipping every entry that is neither a\n * string nor a finite number.\n *\n * @param value - Unknown headers\n * @returns Frozen-compatible header record\n */\nexport function readBrowserHeaders(value: unknown): Readonly<Record<string, string>> {\n\tif (!isRecord(value)) return {}\n\tconst headers: Record<string, string> = {}\n\tfor (const [name, entry] of Object.entries(value)) {\n\t\tif (isString(entry) || isFiniteNumber(entry)) headers[name] = String(entry)\n\t}\n\treturn headers\n}\n\n/**\n * Builds a standards-shaped HAR 1.2 entry from one observed exchange.\n *\n * @param pending - Request and optional response captured by the recorder\n * @param duration - Whole exchange duration in milliseconds\n * @param body - Optional decoded response body\n * @param error - Optional request failure description\n * @returns HAR 1.2 entry\n */\nexport function createBrowserHAREntry(\n\tpending: BrowserHARPending,\n\tduration: number,\n\tbody?: Uint8Array,\n\terror?: string,\n): BrowserHAREntry {\n\tconst response = pending.response\n\tconst requestHeaders: BrowserHARValue[] = Object.entries(pending.request.headers).map(\n\t\t([name, value]) => ({ name, value }),\n\t)\n\tconst responseHeaders: BrowserHARValue[] =\n\t\tresponse === undefined\n\t\t\t? []\n\t\t\t: Object.entries(response.headers).map(([name, value]) => ({ name, value }))\n\tconst query: BrowserHARValue[] = []\n\tif (URL.canParse(pending.request.url)) {\n\t\tfor (const [name, value] of new URL(pending.request.url).searchParams) {\n\t\t\tquery.push({ name, value })\n\t\t}\n\t}\n\tconst post = pending.request.post\n\tconst requestMime =\n\t\tObject.entries(pending.request.headers).find(\n\t\t\t([name]) => name.toLowerCase() === 'content-type',\n\t\t)?.[1] ?? 'application/octet-stream'\n\tconst redirect =\n\t\tresponse === undefined\n\t\t\t? ''\n\t\t\t: (Object.entries(response.headers).find(\n\t\t\t\t\t([name]) => name.toLowerCase() === 'location',\n\t\t\t\t)?.[1] ?? '')\n\tconst timing = response?.timing\n\tconst dns = timing?.dns === undefined ? -1 : Math.max(0, timing.dns.end - timing.dns.start)\n\tconst connect =\n\t\ttiming?.connect === undefined ? -1 : Math.max(0, timing.connect.end - timing.connect.start)\n\tconst send = timing?.send === undefined ? 0 : Math.max(0, timing.send.end - timing.send.start)\n\tconst wait =\n\t\ttiming?.receive === undefined\n\t\t\t? Math.max(0, duration)\n\t\t\t: Math.max(0, timing.receive - (timing.send?.end ?? 0))\n\tconst ssl = timing?.ssl === undefined ? -1 : Math.max(0, timing.ssl.end - timing.ssl.start)\n\tconst text = body === undefined ? undefined : encodeBase64(body)\n\tconst size = body?.byteLength ?? (response === undefined ? 0 : -1)\n\n\treturn {\n\t\tstartedDateTime: new Date(pending.started).toISOString(),\n\t\ttime: Math.max(0, duration),\n\t\trequest: {\n\t\t\tmethod: pending.request.method,\n\t\t\turl: pending.request.url,\n\t\t\thttpVersion: response?.protocol ?? 'HTTP/0.0',\n\t\t\tcookies: [],\n\t\t\theaders: requestHeaders,\n\t\t\tqueryString: query,\n\t\t\t...(post !== undefined\n\t\t\t\t? {\n\t\t\t\t\t\tpostData: {\n\t\t\t\t\t\t\tmimeType: requestMime,\n\t\t\t\t\t\t\ttext: post,\n\t\t\t\t\t\t},\n\t\t\t\t\t}\n\t\t\t\t: {}),\n\t\t\theadersSize: -1,\n\t\t\tbodySize: post === undefined ? 0 : textToBytes(post).byteLength,\n\t\t},\n\t\tresponse: {\n\t\t\tstatus: response?.status ?? 0,\n\t\t\tstatusText: response?.phrase ?? error ?? 'Request failed',\n\t\t\thttpVersion: response?.protocol ?? 'HTTP/0.0',\n\t\t\tcookies: [],\n\t\t\theaders: responseHeaders,\n\t\t\tcontent: {\n\t\t\t\tsize,\n\t\t\t\tmimeType: response?.mime ?? 'application/octet-stream',\n\t\t\t\t...(text !== undefined ? { text, encoding: 'base64' } : {}),\n\t\t\t},\n\t\t\tredirectURL: redirect,\n\t\t\theadersSize: -1,\n\t\t\tbodySize: size,\n\t\t},\n\t\tcache: {},\n\t\ttimings: {\n\t\t\tblocked: -1,\n\t\t\tdns,\n\t\t\tconnect,\n\t\t\tsend,\n\t\t\twait,\n\t\t\treceive: Math.max(0, duration - wait - send),\n\t\t\tssl,\n\t\t},\n\t}\n}\n\n/**\n * Converts HAR name/value headers into a Fetch-domain header record.\n *\n * @param headers - HAR header entries\n * @returns Header record with later duplicate names replacing earlier values\n */\nexport function browserHARHeadersToRecord(\n\theaders: readonly BrowserHARValue[],\n): Readonly<Record<string, string>> {\n\tconst result: Record<string, string> = {}\n\tfor (const header of headers) {\n\t\tObject.defineProperty(result, header.name, {\n\t\t\tvalue: header.value,\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\t\t\twritable: true,\n\t\t})\n\t}\n\treturn result\n}\n\n/**\n * Validates the HAR 1.2 fields required for deterministic replay.\n *\n * @param value - Candidate archive\n */\nexport function validateBrowserHAR(value: unknown): asserts value is BrowserHAR {\n\tif (\n\t\t!isRecord(value) ||\n\t\t!isRecord(value['log']) ||\n\t\tvalue['log']['version'] !== '1.2' ||\n\t\t!isRecord(value['log']['creator']) ||\n\t\t!isString(value['log']['creator']['name']) ||\n\t\t!isString(value['log']['creator']['version']) ||\n\t\t!isArray(value['log']['entries'])\n\t) {\n\t\tthrow new BrowserError('Browser HAR document is malformed')\n\t}\n\tfor (const [index, entry] of value['log']['entries'].entries()) {\n\t\tif (\n\t\t\t!isRecord(entry) ||\n\t\t\t!isString(entry['startedDateTime']) ||\n\t\t\t!isFiniteNumber(Date.parse(entry['startedDateTime'])) ||\n\t\t\t!isFiniteNumber(entry['time']) ||\n\t\t\tentry['time'] < 0 ||\n\t\t\t!isRecord(entry['request']) ||\n\t\t\t!isString(entry['request']['url']) ||\n\t\t\t!URL.canParse(entry['request']['url']) ||\n\t\t\t!isString(entry['request']['method']) ||\n\t\t\t!isString(entry['request']['httpVersion']) ||\n\t\t\t!isArray(entry['request']['cookies']) ||\n\t\t\t!isArray(entry['request']['headers']) ||\n\t\t\t!isArray(entry['request']['queryString']) ||\n\t\t\t!isInteger(entry['request']['headersSize']) ||\n\t\t\tentry['request']['headersSize'] < -1 ||\n\t\t\t!isInteger(entry['request']['bodySize']) ||\n\t\t\tentry['request']['bodySize'] < -1 ||\n\t\t\t!isRecord(entry['response']) ||\n\t\t\t!isInteger(entry['response']['status']) ||\n\t\t\tentry['response']['status'] < 0 ||\n\t\t\tentry['response']['status'] > 999 ||\n\t\t\t!isString(entry['response']['statusText']) ||\n\t\t\t!isString(entry['response']['httpVersion']) ||\n\t\t\t!isArray(entry['response']['cookies']) ||\n\t\t\t!isArray(entry['response']['headers']) ||\n\t\t\t!isRecord(entry['response']['content']) ||\n\t\t\t!isString(entry['response']['redirectURL']) ||\n\t\t\t!isInteger(entry['response']['headersSize']) ||\n\t\t\tentry['response']['headersSize'] < -1 ||\n\t\t\t!isInteger(entry['response']['bodySize']) ||\n\t\t\tentry['response']['bodySize'] < -1 ||\n\t\t\t!isRecord(entry['cache']) ||\n\t\t\t!isRecord(entry['timings'])\n\t\t) {\n\t\t\tthrow new BrowserError('Browser HAR entry is malformed', undefined, { index })\n\t\t}\n\t\tfor (const [cookieIndex, cookie] of entry['request']['cookies'].entries()) {\n\t\t\tif (\n\t\t\t\t!isRecord(cookie) ||\n\t\t\t\t!isString(cookie['name']) ||\n\t\t\t\t!isString(cookie['value']) ||\n\t\t\t\t(cookie['path'] !== undefined && !isString(cookie['path'])) ||\n\t\t\t\t(cookie['domain'] !== undefined && !isString(cookie['domain'])) ||\n\t\t\t\t(cookie['expires'] !== undefined && !isString(cookie['expires'])) ||\n\t\t\t\t(cookie['httpOnly'] !== undefined && !isBoolean(cookie['httpOnly'])) ||\n\t\t\t\t(cookie['secure'] !== undefined && !isBoolean(cookie['secure']))\n\t\t\t) {\n\t\t\t\tthrow new BrowserError('Browser HAR request cookie is malformed', undefined, {\n\t\t\t\t\tindex,\n\t\t\t\t\tcookie: cookieIndex,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t\tfor (const [headerIndex, header] of entry['request']['headers'].entries()) {\n\t\t\tif (!isRecord(header) || !isString(header['name']) || !isString(header['value'])) {\n\t\t\t\tthrow new BrowserError('Browser HAR request header is malformed', undefined, {\n\t\t\t\t\tindex,\n\t\t\t\t\theader: headerIndex,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t\tfor (const [queryIndex, query] of entry['request']['queryString'].entries()) {\n\t\t\tif (!isRecord(query) || !isString(query['name']) || !isString(query['value'])) {\n\t\t\t\tthrow new BrowserError('Browser HAR query value is malformed', undefined, {\n\t\t\t\t\tindex,\n\t\t\t\t\tquery: queryIndex,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t\tconst post = entry['request']['postData']\n\t\tif (\n\t\t\tpost !== undefined &&\n\t\t\t(!isRecord(post) || !isString(post['mimeType']) || !isString(post['text']))\n\t\t) {\n\t\t\tthrow new BrowserError('Browser HAR request body is malformed', undefined, { index })\n\t\t}\n\t\tfor (const [cookieIndex, cookie] of entry['response']['cookies'].entries()) {\n\t\t\tif (\n\t\t\t\t!isRecord(cookie) ||\n\t\t\t\t!isString(cookie['name']) ||\n\t\t\t\t!isString(cookie['value']) ||\n\t\t\t\t(cookie['path'] !== undefined && !isString(cookie['path'])) ||\n\t\t\t\t(cookie['domain'] !== undefined && !isString(cookie['domain'])) ||\n\t\t\t\t(cookie['expires'] !== undefined && !isString(cookie['expires'])) ||\n\t\t\t\t(cookie['httpOnly'] !== undefined && !isBoolean(cookie['httpOnly'])) ||\n\t\t\t\t(cookie['secure'] !== undefined && !isBoolean(cookie['secure']))\n\t\t\t) {\n\t\t\t\tthrow new BrowserError('Browser HAR response cookie is malformed', undefined, {\n\t\t\t\t\tindex,\n\t\t\t\t\tcookie: cookieIndex,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t\tfor (const [headerIndex, header] of entry['response']['headers'].entries()) {\n\t\t\tif (!isRecord(header) || !isString(header['name']) || !isString(header['value'])) {\n\t\t\t\tthrow new BrowserError('Browser HAR response header is malformed', undefined, {\n\t\t\t\t\tindex,\n\t\t\t\t\theader: headerIndex,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t\tconst text = entry['response']['content']['text']\n\t\tconst encoding = entry['response']['content']['encoding']\n\t\tif (\n\t\t\t!isInteger(entry['response']['content']['size']) ||\n\t\t\tentry['response']['content']['size'] < -1 ||\n\t\t\t!isString(entry['response']['content']['mimeType']) ||\n\t\t\t(text !== undefined && !isString(text)) ||\n\t\t\t(encoding !== undefined && encoding !== 'base64') ||\n\t\t\t(encoding === 'base64' &&\n\t\t\t\t(text === undefined ||\n\t\t\t\t\t!/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(text)))\n\t\t) {\n\t\t\tthrow new BrowserError('Browser HAR response content is malformed', undefined, { index })\n\t\t}\n\t\tfor (const name of ['blocked', 'dns', 'connect', 'send', 'wait', 'receive', 'ssl']) {\n\t\t\tconst timing = entry['timings'][name]\n\t\t\tif (!isFiniteNumber(timing) || timing < -1) {\n\t\t\t\tthrow new BrowserError('Browser HAR timing is malformed', undefined, {\n\t\t\t\t\tindex,\n\t\t\t\t\ttiming: name,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * Matches a request against route criteria.\n *\n * @param request - Observed request\n * @param query - Match criteria\n * @returns True if every supplied criterion matches; false otherwise\n */\nexport function matchesBrowserRoute(request: BrowserRequest, query: BrowserRouteQuery): boolean {\n\tif (query.method !== undefined && request.method !== query.method) return false\n\tif (query.resource !== undefined && request.resource !== query.resource) return false\n\tif (query.url === undefined) return true\n\treturn matchesBrowserURL(request.url, query.url)\n}\n\n/**\n * Matches a URL using Chromium-style `*` and `**` glob segments.\n *\n * @param url - Candidate URL\n * @param pattern - Glob pattern\n * @returns True if the whole URL matches; false otherwise\n */\nexport function matchesBrowserURL(url: string, pattern: string): boolean {\n\tconst source = pattern\n\t\t.replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&')\n\t\t.replace(/\\*\\*/g, '[[DOUBLE_STAR]]')\n\t\t.replace(/\\*/g, '[^/]*')\n\t\t.replace(/\\[\\[DOUBLE_STAR\\]\\]/g, '.*')\n\treturn new RegExp(`^${source}$`).test(url)\n}\n\n/**\n * Decodes the `Page.addScriptToEvaluateOnNewDocument` result, throwing a `BrowserError`\n * off-shape.\n *\n * @param value - Unknown protocol result\n * @returns Script identifier\n */\nexport function readBrowserScriptIdentifier(value: unknown): string {\n\tif (!isRecord(value) || !isString(value['identifier'])) {\n\t\tthrow new BrowserError('Browser init script identifier is malformed')\n\t}\n\treturn value['identifier']\n}\n\n/**\n * Validates viewport input coordinates.\n *\n * @param point - Candidate point\n */\nexport function validateBrowserPoint(point: BrowserPoint): void {\n\tif (!isFiniteNumber(point.x) || !isFiniteNumber(point.y)) {\n\t\tthrow new BrowserError('Browser input coordinates must be finite', undefined, { point })\n\t}\n}\n\n/**\n * Validates the bounded delay, count, steps, and position of one trusted-input operation.\n *\n * @remarks\n * The parameter is `BrowserOperationOptions`, so one validator answers for a\n * locator click, a locator drag, a mouse click, a mouse drag, and keyboard\n * entry alike.\n *\n * @param options - Candidate input options\n */\nexport function validateBrowserInputOptions(options?: BrowserOperationOptions): void {\n\tif (options?.delay !== undefined && (!isFiniteNumber(options.delay) || options.delay < 0)) {\n\t\tthrow new BrowserError('Browser input delay must be non-negative and finite', undefined, {\n\t\t\tdelay: options.delay,\n\t\t})\n\t}\n\tif (options?.count !== undefined && (!isInteger(options.count) || options.count <= 0)) {\n\t\tthrow new BrowserError('Browser click count must be a positive integer', undefined, {\n\t\t\tcount: options.count,\n\t\t})\n\t}\n\tif (options?.steps !== undefined && (!isInteger(options.steps) || options.steps <= 0)) {\n\t\tthrow new BrowserError('Browser drag steps must be a positive integer', undefined, {\n\t\t\tsteps: options.steps,\n\t\t})\n\t}\n\tif (options?.position !== undefined) validateBrowserPoint(options.position)\n}\n\n/**\n * Validates a public browser timeout before protocol work begins.\n *\n * @param timeout - Timeout in milliseconds\n */\nexport function validateBrowserTimeout(timeout: number): void {\n\tif (!isFiniteNumber(timeout) || timeout < 0) {\n\t\tthrow new BrowserError('Browser timeout must be a non-negative finite number', undefined, {\n\t\t\ttimeout,\n\t\t})\n\t}\n}\n\n/**\n * Validates Chromium viewport metrics.\n *\n * @param viewport - Public viewport configuration\n */\nexport function validateBrowserViewport(viewport: BrowserViewport): void {\n\tif (\n\t\t!isInteger(viewport.width) ||\n\t\tviewport.width <= 0 ||\n\t\t!isInteger(viewport.height) ||\n\t\tviewport.height <= 0\n\t) {\n\t\tthrow new BrowserError('Browser viewport dimensions must be positive integers', undefined, {\n\t\t\tviewport,\n\t\t})\n\t}\n\tif (viewport.scale !== undefined && (!isFiniteNumber(viewport.scale) || viewport.scale <= 0)) {\n\t\tthrow new BrowserError('Browser viewport scale must be positive and finite', undefined, {\n\t\t\tscale: viewport.scale,\n\t\t})\n\t}\n}\n\n/**\n * Validates context emulation boundaries before partial application.\n *\n * @param options - Public emulation configuration\n */\nexport function validateBrowserEmulationOptions(options: BrowserEmulationOptions): void {\n\tif (options.viewport !== undefined) validateBrowserViewport(options.viewport)\n\tif (options.user !== undefined && options.user.value.length === 0) {\n\t\tthrow new BrowserError('Browser user agent cannot be empty')\n\t}\n\tif (options.locale !== undefined && options.locale.length === 0) {\n\t\tthrow new BrowserError('Browser locale cannot be empty')\n\t}\n\tif (options.timezone !== undefined && options.timezone.length === 0) {\n\t\tthrow new BrowserError('Browser timezone cannot be empty')\n\t}\n\tif (options.geolocation !== undefined) {\n\t\tconst location = options.geolocation\n\t\tif (\n\t\t\t!isFiniteNumber(location.latitude) ||\n\t\t\tlocation.latitude < -90 ||\n\t\t\tlocation.latitude > 90 ||\n\t\t\t!isFiniteNumber(location.longitude) ||\n\t\t\tlocation.longitude < -180 ||\n\t\t\tlocation.longitude > 180 ||\n\t\t\t(location.accuracy !== undefined &&\n\t\t\t\t(!isFiniteNumber(location.accuracy) || location.accuracy < 0))\n\t\t) {\n\t\t\tthrow new BrowserError('Browser geolocation is outside valid coordinate bounds', undefined, {\n\t\t\t\tlocation,\n\t\t\t})\n\t\t}\n\t}\n\tfor (const name of Object.keys(options.headers ?? {})) {\n\t\tif (name.length === 0) throw new BrowserError('Browser header name cannot be empty')\n\t}\n}\n\n/**\n * Validates isolated-context options before creating remote state.\n *\n * @param options - Public context configuration\n */\nexport function validateBrowserContextOptions(options?: BrowserContextOptions): void {\n\tif (options === undefined) return\n\tif (options.emulation !== undefined) validateBrowserEmulationOptions(options.emulation)\n\tif (options.proxy !== undefined) {\n\t\tif (options.proxy.server.length === 0) {\n\t\t\tthrow new BrowserError('Browser proxy server cannot be empty')\n\t\t}\n\t\tif (options.proxy.bypass?.some((entry) => entry.length === 0) === true) {\n\t\t\tthrow new BrowserError('Browser proxy bypass entries cannot be empty')\n\t\t}\n\t}\n\tfor (const origin of options.origins ?? []) {\n\t\tconst result = attempt(() => new URL(origin))\n\t\tif (!result.success) {\n\t\t\tthrow new BrowserError('Browser context origin must be valid', undefined, { origin })\n\t\t}\n\t\tconst url = result.value\n\t\tif (\n\t\t\t(url.protocol !== 'http:' && url.protocol !== 'https:') ||\n\t\t\turl.origin !== origin.replace(/\\/$/, '')\n\t\t) {\n\t\t\tthrow new BrowserError(\n\t\t\t\t'Browser context origin must be an absolute HTTP(S) origin',\n\t\t\t\tundefined,\n\t\t\t\t{\n\t\t\t\t\torigin,\n\t\t\t\t},\n\t\t\t)\n\t\t}\n\t}\n\tif (options.downloads !== undefined && options.downloads.path.length === 0) {\n\t\tthrow new BrowserError('Browser download path cannot be empty')\n\t}\n}\n\n/**\n * Validates Accessibility-domain snapshot bounds.\n *\n * @param options - Public accessibility snapshot options\n */\nexport function validateBrowserAccessibilityOptions(options?: BrowserAccessibilityOptions): void {\n\tif (options?.root !== undefined && (!isInteger(options.root) || options.root <= 0)) {\n\t\tthrow new BrowserError('Browser accessibility root must be a positive integer', undefined, {\n\t\t\troot: options.root,\n\t\t})\n\t}\n\tif (options?.depth !== undefined && (!isInteger(options.depth) || options.depth < 0)) {\n\t\tthrow new BrowserError(\n\t\t\t'Browser accessibility depth must be a non-negative integer',\n\t\t\tundefined,\n\t\t\t{ depth: options.depth },\n\t\t)\n\t}\n}\n\n/**\n * Validates and compiles Page.printToPDF parameters.\n *\n * @param options - Public PDF options\n * @returns Protocol parameter record\n */\nexport function browserPDFToParams(options?: BrowserPDFOptions): Readonly<Record<string, unknown>> {\n\tconst params: Record<string, unknown> = {\n\t\tlandscape: options?.landscape ?? false,\n\t\tprintBackground: options?.background ?? false,\n\t\tdisplayHeaderFooter: options?.header !== undefined || options?.footer !== undefined,\n\t\tgenerateTaggedPDF: options?.tagged ?? false,\n\t\tgenerateDocumentOutline: options?.outline ?? false,\n\t}\n\tif (options?.scale !== undefined) {\n\t\tvalidateBrowserRange(options.scale, 'PDF scale', 0.1, 2)\n\t\tparams['scale'] = options.scale\n\t}\n\tif (options?.width !== undefined) {\n\t\tvalidateBrowserRange(options.width, 'PDF width', 0, Number.MAX_VALUE, false)\n\t\tparams['paperWidth'] = options.width\n\t}\n\tif (options?.height !== undefined) {\n\t\tvalidateBrowserRange(options.height, 'PDF height', 0, Number.MAX_VALUE, false)\n\t\tparams['paperHeight'] = options.height\n\t}\n\tif (options?.ranges !== undefined) params['pageRanges'] = options.ranges\n\tif (options?.header !== undefined) params['headerTemplate'] = options.header\n\tif (options?.footer !== undefined) params['footerTemplate'] = options.footer\n\tfor (const [name, value] of Object.entries(options?.margin ?? {})) {\n\t\tif (!isFiniteNumber(value)) continue\n\t\tvalidateBrowserRange(value, `PDF ${name} margin`, 0, Number.MAX_VALUE)\n\t\tparams[`margin${name[0]?.toUpperCase()}${name.slice(1)}`] = value\n\t}\n\treturn params\n}\n\n/**\n * Validates and compiles basic Page.captureScreenshot parameters.\n *\n * @param options - Public screenshot options\n * @returns Protocol parameter record\n */\nexport function browserScreenshotToParams(\n\toptions?: BrowserScreenshotOptions,\n): Readonly<Record<string, unknown>> {\n\tconst format = options?.format ?? 'png'\n\tif (options?.quality !== undefined) {\n\t\tif (format !== 'jpeg') {\n\t\t\tthrow new BrowserError('Browser screenshot quality is only valid for JPEG')\n\t\t}\n\t\tif (!isInteger(options.quality) || options.quality < 0 || options.quality > 100) {\n\t\t\tthrow new BrowserError('Browser screenshot quality must be an integer from 0 to 100')\n\t\t}\n\t}\n\tif (options?.full === true && options.clip !== undefined) {\n\t\tthrow new BrowserError('Browser screenshot cannot combine full-page and clip capture')\n\t}\n\tconst params: Record<string, unknown> = {\n\t\tformat,\n\t\tfromSurface: true,\n\t}\n\tif (options?.quality !== undefined) params['quality'] = options.quality\n\tif (options?.clip !== undefined) {\n\t\tconst [x, y, width, height] = options.clip\n\t\tvalidateBrowserRange(x, 'Screenshot clip x', -Number.MAX_VALUE, Number.MAX_VALUE)\n\t\tvalidateBrowserRange(y, 'Screenshot clip y', -Number.MAX_VALUE, Number.MAX_VALUE)\n\t\tvalidateBrowserRange(width, 'Screenshot clip width', 0, Number.MAX_VALUE, false)\n\t\tvalidateBrowserRange(height, 'Screenshot clip height', 0, Number.MAX_VALUE, false)\n\t\tparams['clip'] = { x, y, width, height, scale: 1 }\n\t\tparams['captureBeyondViewport'] = true\n\t}\n\treturn params\n}\n\n/**\n * Validates a finite numeric range.\n *\n * @param value - Candidate number\n * @param field - Diagnostic field\n * @param minimum - Inclusive lower bound\n * @param maximum - Inclusive upper bound\n * @param inclusive - Whether the lower bound is inclusive\n */\nexport function validateBrowserRange(\n\tvalue: number,\n\tfield: string,\n\tminimum: number,\n\tmaximum: number,\n\tinclusive = true,\n): void {\n\tif (\n\t\t!isFiniteNumber(value) ||\n\t\t(inclusive ? value < minimum : value <= minimum) ||\n\t\tvalue > maximum\n\t) {\n\t\tthrow new BrowserError(`${field} is outside its valid range`, undefined, {\n\t\t\tvalue,\n\t\t\tminimum,\n\t\t\tmaximum,\n\t\t\tinclusive,\n\t\t})\n\t}\n}\n\n/**\n * Decodes Accessibility-domain nodes into a flat serializable tree, throwing a `BrowserError`\n * off-shape.\n *\n * @param value - Unknown full or partial AX-tree result\n * @returns Valid accessibility snapshot\n */\nexport function readBrowserAccessibility(value: unknown): BrowserAccessibilitySnapshot {\n\tif (!isRecord(value) || !isArray(value['nodes'])) {\n\t\tthrow new BrowserError('Browser accessibility tree is malformed')\n\t}\n\tconst nodes: BrowserAXNode[] = []\n\tfor (const [index, candidate] of value['nodes'].entries()) {\n\t\tif (!isRecord(candidate) || !isString(candidate['nodeId'])) {\n\t\t\tthrow new BrowserError('Browser accessibility node is malformed', undefined, { index })\n\t\t}\n\t\tconst children = isArray(candidate['childIds']) ? candidate['childIds'].filter(isString) : []\n\t\tconst properties: Record<string, unknown> = {}\n\t\tif (isArray(candidate['properties'])) {\n\t\t\tfor (const property of candidate['properties']) {\n\t\t\t\tif (!isRecord(property) || !isString(property['name'])) continue\n\t\t\t\tproperties[property['name']] = readBrowserAXValue(property['value'])\n\t\t\t}\n\t\t}\n\t\tnodes.push({\n\t\t\tid: candidate['nodeId'],\n\t\t\tparent: isString(candidate['parentId']) ? candidate['parentId'] : undefined,\n\t\t\tchildren,\n\t\t\tbackend: isInteger(candidate['backendDOMNodeId']) ? candidate['backendDOMNodeId'] : undefined,\n\t\t\tframe: isString(candidate['frameId']) ? candidate['frameId'] : undefined,\n\t\t\tignored: candidate['ignored'] === true,\n\t\t\trole: parseBrowserAXString(candidate['role']),\n\t\t\tname: parseBrowserAXString(candidate['name']),\n\t\t\tdescription: parseBrowserAXString(candidate['description']),\n\t\t\tvalue: readBrowserAXValue(candidate['value']),\n\t\t\tproperties,\n\t\t})\n\t}\n\treturn {\n\t\troots: nodes.filter((node) => node.parent === undefined).map((node) => node.id),\n\t\tnodes,\n\t}\n}\n\n/**\n * Decodes an Accessibility-domain AXValue, or `undefined` when the record carries none.\n *\n * @param value - Unknown AX value\n * @returns Underlying value\n */\nexport function readBrowserAXValue(value: unknown): unknown {\n\treturn isRecord(value) && 'value' in value ? value['value'] : undefined\n}\n\n/**\n * Concatenates byte chunks without Node-specific buffers.\n *\n * @param chunks - Byte arrays in source order\n * @returns Combined bytes\n */\nexport function concatBytes(chunks: readonly Uint8Array[]): Uint8Array {\n\tconst count = chunks.reduce((total, chunk) => total + chunk.byteLength, 0)\n\tconst result = new Uint8Array(count)\n\tlet offset = 0\n\tfor (const chunk of chunks) {\n\t\tresult.set(chunk, offset)\n\t\toffset += chunk.byteLength\n\t}\n\treturn result\n}\n\n/**\n * Decodes one `IO.read` response, throwing a `BrowserError` off-shape.\n *\n * @param value - Unknown protocol result\n * @returns Valid stream chunk\n */\nexport function readBrowserStreamChunk(value: unknown): BrowserStreamChunk {\n\tif (!isRecord(value) || !isString(value['data'])) {\n\t\tthrow new BrowserError('Browser IO stream chunk is malformed')\n\t}\n\treturn {\n\t\tbytes:\n\t\t\tvalue['base64Encoded'] === true ? decodeBase64(value['data']) : textToBytes(value['data']),\n\t\teof: value['eof'] === true,\n\t}\n}\n\n/**\n * Decodes JavaScript precise coverage, throwing a `BrowserError` off-shape.\n *\n * @param value - Unknown `Profiler.takePreciseCoverage` result\n * @returns Script coverage\n */\nexport function readBrowserScriptCoverage(value: unknown): readonly BrowserScriptCoverage[] {\n\tif (!isRecord(value) || !isArray(value['result'])) {\n\t\tthrow new BrowserError('Browser JavaScript coverage is malformed')\n\t}\n\treturn value['result'].map((script, index) => {\n\t\tif (\n\t\t\t!isRecord(script) ||\n\t\t\t!isString(script['scriptId']) ||\n\t\t\t!isString(script['url']) ||\n\t\t\t!isArray(script['functions'])\n\t\t) {\n\t\t\tthrow new BrowserError('Browser script coverage entry is malformed', undefined, { index })\n\t\t}\n\t\tconst functions: BrowserFunctionCoverage[] = script['functions'].map((entry, functionIndex) => {\n\t\t\tif (!isRecord(entry) || !isString(entry['functionName']) || !isArray(entry['ranges'])) {\n\t\t\t\tthrow new BrowserError('Browser function coverage entry is malformed', undefined, {\n\t\t\t\t\tindex,\n\t\t\t\t\tfunction: functionIndex,\n\t\t\t\t})\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tname: entry['functionName'],\n\t\t\t\tranges: readBrowserCoverageRanges(entry['ranges'], index),\n\t\t\t\tblock: entry['isBlockCoverage'] === true,\n\t\t\t}\n\t\t})\n\t\treturn {\n\t\t\tid: script['scriptId'],\n\t\t\turl: script['url'],\n\t\t\tfunctions,\n\t\t}\n\t})\n}\n\n/**\n * Decodes CSS rule usage, throwing a `BrowserError` off-shape.\n *\n * @param value - Unknown `CSS.stopRuleUsageTracking` result\n * @returns Stylesheet coverage\n */\nexport function readBrowserStyleCoverage(value: unknown): readonly BrowserStyleCoverage[] {\n\tif (!isRecord(value) || !isArray(value['ruleUsage'])) {\n\t\tthrow new BrowserError('Browser CSS coverage is malformed')\n\t}\n\tconst styles = new Map<string, BrowserCoverageRange[]>()\n\tfor (const [index, entry] of value['ruleUsage'].entries()) {\n\t\tif (\n\t\t\t!isRecord(entry) ||\n\t\t\t!isString(entry['styleSheetId']) ||\n\t\t\t!isInteger(entry['startOffset']) ||\n\t\t\tentry['startOffset'] < 0 ||\n\t\t\t!isInteger(entry['endOffset']) ||\n\t\t\tentry['endOffset'] < entry['startOffset']\n\t\t) {\n\t\t\tthrow new BrowserError('Browser CSS coverage entry is malformed', undefined, { index })\n\t\t}\n\t\tconst ranges = styles.get(entry['styleSheetId']) ?? []\n\t\tranges.push({\n\t\t\tstart: entry['startOffset'],\n\t\t\tend: entry['endOffset'],\n\t\t\tcount: entry['used'] === true ? 1 : 0,\n\t\t})\n\t\tstyles.set(entry['styleSheetId'], ranges)\n\t}\n\treturn [...styles].map(([id, ranges]) => ({ id, ranges }))\n}\n\n/**\n * Decodes and normalizes coverage ranges, throwing a `BrowserError` off-shape.\n *\n * @param value - Unknown ranges\n * @param script - Script index for diagnostics\n * @returns Valid ranges\n */\nexport function readBrowserCoverageRanges(\n\tvalue: unknown,\n\tscript: number,\n): readonly BrowserCoverageRange[] {\n\tif (!isArray(value)) {\n\t\tthrow new BrowserError('Browser coverage ranges are malformed', undefined, { script })\n\t}\n\treturn value.map((range, index) => {\n\t\tif (\n\t\t\t!isRecord(range) ||\n\t\t\t!isInteger(range['startOffset']) ||\n\t\t\trange['startOffset'] < 0 ||\n\t\t\t!isInteger(range['endOffset']) ||\n\t\t\trange['endOffset'] < range['startOffset'] ||\n\t\t\t!isInteger(range['count']) ||\n\t\t\trange['count'] < 0\n\t\t) {\n\t\t\tthrow new BrowserError('Browser coverage range is malformed', undefined, {\n\t\t\t\tscript,\n\t\t\t\tindex,\n\t\t\t})\n\t\t}\n\t\treturn {\n\t\t\tstart: range['startOffset'],\n\t\t\tend: range['endOffset'],\n\t\t\tcount: range['count'],\n\t\t}\n\t})\n}\n\n/**\n * Decodes Performance-domain metrics, throwing a `BrowserError` off-shape.\n *\n * @param value - Unknown metrics result\n * @returns Valid metrics\n */\nexport function readBrowserMetrics(value: unknown): readonly BrowserMetric[] {\n\tif (!isRecord(value) || !isArray(value['metrics'])) {\n\t\tthrow new BrowserError('Browser performance metrics are malformed')\n\t}\n\treturn value['metrics'].map((metric, index) => {\n\t\tif (!isRecord(metric) || !isString(metric['name']) || !isFiniteNumber(metric['value'])) {\n\t\t\tthrow new BrowserError('Browser performance metric is malformed', undefined, { index })\n\t\t}\n\t\treturn { name: metric['name'], value: metric['value'] }\n\t})\n}\n\n/**\n * Decodes one CPU profile, throwing a `BrowserError` off-shape.\n *\n * @param value - Unknown `Profiler.stop` result\n * @returns Valid profile\n */\nexport function readBrowserProfile(value: unknown): BrowserProfile {\n\tif (!isRecord(value) || !isRecord(value['profile'])) {\n\t\tthrow new BrowserError('Browser CPU profile is malformed')\n\t}\n\tconst profile = value['profile']\n\tif (\n\t\t!isFiniteNumber(profile['startTime']) ||\n\t\t!isFiniteNumber(profile['endTime']) ||\n\t\tprofile['endTime'] < profile['startTime'] ||\n\t\t!isArray(profile['nodes'])\n\t) {\n\t\tthrow new BrowserError('Browser CPU profile metadata is malformed')\n\t}\n\tconst nodes: BrowserProfileNode[] = profile['nodes'].map((node, index) => {\n\t\tif (\n\t\t\t!isRecord(node) ||\n\t\t\t!isInteger(node['id']) ||\n\t\t\tnode['id'] < 0 ||\n\t\t\t(node['hitCount'] !== undefined && (!isInteger(node['hitCount']) || node['hitCount'] < 0))\n\t\t) {\n\t\t\tthrow new BrowserError('Browser CPU profile node is malformed', undefined, { index })\n\t\t}\n\t\tconst children = node['children'] === undefined ? [] : parseArray(node['children'], isInteger)\n\t\tif (children === undefined || children.some((child) => child < 0)) {\n\t\t\tthrow new BrowserError('Browser CPU profile node is malformed', undefined, { index })\n\t\t}\n\t\treturn {\n\t\t\tid: node['id'],\n\t\t\tframe: readBrowserProfileFrame(node['callFrame'], index),\n\t\t\thit: isInteger(node['hitCount']) ? node['hitCount'] : undefined,\n\t\t\tchildren,\n\t\t}\n\t})\n\tconst samples = profile['samples'] === undefined ? [] : parseArray(profile['samples'], isInteger)\n\tif (samples === undefined || samples.some((sample) => sample < 0)) {\n\t\tthrow new BrowserError('Browser CPU profile samples are malformed')\n\t}\n\tconst deltas =\n\t\tprofile['timeDeltas'] === undefined ? [] : parseArray(profile['timeDeltas'], isFiniteNumber)\n\tif (deltas === undefined || deltas.some((delta) => delta < 0)) {\n\t\tthrow new BrowserError('Browser CPU profile deltas are malformed')\n\t}\n\treturn {\n\t\tstart: profile['startTime'],\n\t\tend: profile['endTime'],\n\t\tnodes,\n\t\tsamples,\n\t\tdeltas,\n\t}\n}\n\n/**\n * Decodes a CPU profile call frame, throwing a `BrowserError` off-shape.\n *\n * @param value - Unknown call frame\n * @param node - Node index for diagnostics\n * @returns Valid call frame\n */\nexport function readBrowserProfileFrame(value: unknown, node: number): BrowserProfileFrame {\n\tif (\n\t\t!isRecord(value) ||\n\t\t!isString(value['functionName']) ||\n\t\t!isString(value['scriptId']) ||\n\t\t!isString(value['url']) ||\n\t\t!isInteger(value['lineNumber']) ||\n\t\t!isInteger(value['columnNumber'])\n\t) {\n\t\tthrow new BrowserError('Browser CPU profile call frame is malformed', undefined, { node })\n\t}\n\treturn {\n\t\tfunction: value['functionName'],\n\t\tscript: value['scriptId'],\n\t\turl: value['url'],\n\t\tline: value['lineNumber'],\n\t\tcolumn: value['columnNumber'],\n\t}\n}\n\n/**\n * Converts a typed cookie input into Chromium protocol fields.\n *\n * @param cookie - Validated public cookie input\n * @returns Protocol cookie record\n */\nexport function cookieToProtocol(cookie: BrowserCookieInput): Readonly<Record<string, unknown>> {\n\tif (cookie.name.length === 0) throw new BrowserError('Browser cookie name cannot be empty')\n\tif (cookie.url === undefined && (cookie.domain === undefined || cookie.path === undefined)) {\n\t\tthrow new BrowserError('Browser cookie requires either url or domain with path', undefined, {\n\t\t\tname: cookie.name,\n\t\t})\n\t}\n\tif (cookie.url !== undefined && !URL.canParse(cookie.url)) {\n\t\tthrow new BrowserError('Browser cookie URL must be valid', undefined, {\n\t\t\tname: cookie.name,\n\t\t\turl: cookie.url,\n\t\t})\n\t}\n\tif (cookie.expires !== undefined && !isFiniteNumber(cookie.expires)) {\n\t\tthrow new BrowserError('Browser cookie expiry must be finite', undefined, {\n\t\t\tname: cookie.name,\n\t\t\texpires: cookie.expires,\n\t\t})\n\t}\n\tconst result: Record<string, unknown> = {\n\t\tname: cookie.name,\n\t\tvalue: cookie.value,\n\t}\n\tif (cookie.url !== undefined) result['url'] = cookie.url\n\tif (cookie.domain !== undefined) result['domain'] = cookie.domain\n\tif (cookie.path !== undefined) result['path'] = cookie.path\n\tif (cookie.expires !== undefined) result['expires'] = cookie.expires\n\tif (cookie.http !== undefined) result['httpOnly'] = cookie.http\n\tif (cookie.secure !== undefined) result['secure'] = cookie.secure\n\tif (cookie.site !== undefined) result['sameSite'] = cookie.site\n\tif (cookie.priority !== undefined) result['priority'] = cookie.priority\n\tif (cookie.partition !== undefined) {\n\t\tresult['partitionKey'] = {\n\t\t\ttopLevelSite: cookie.partition.site,\n\t\t\thasCrossSiteAncestor: cookie.partition.ancestor ?? false,\n\t\t}\n\t}\n\treturn result\n}\n\n/**\n * Decodes the cookies `Storage.getCookies` returns, throwing a `BrowserError` off-shape.\n *\n * @param value - Unknown protocol result\n * @returns Valid cookies\n */\nexport function readBrowserCookies(value: unknown): readonly BrowserCookie[] {\n\tif (!isRecord(value) || !isArray(value['cookies'])) {\n\t\tthrow new BrowserError('Browser cookie result is malformed')\n\t}\n\treturn value['cookies'].map((candidate, index) => readBrowserCookie(candidate, index))\n}\n\n/**\n * Decodes one Chromium cookie, throwing a `BrowserError` off-shape.\n *\n * @param value - Unknown cookie record\n * @param index - Source array position for diagnostics\n * @returns Valid cookie\n */\nexport function readBrowserCookie(value: unknown, index: number): BrowserCookie {\n\tif (\n\t\t!isRecord(value) ||\n\t\t!isString(value['name']) ||\n\t\t!isString(value['value']) ||\n\t\t!isString(value['domain']) ||\n\t\t!isString(value['path']) ||\n\t\t!isFiniteNumber(value['expires']) ||\n\t\t!isBoolean(value['httpOnly']) ||\n\t\t!isBoolean(value['secure'])\n\t) {\n\t\tthrow new BrowserError('Browser cookie is malformed', undefined, { index })\n\t}\n\tconst sameSite = parseEnum(value['sameSite'], ['Strict', 'Lax', 'None'])\n\tif (value['sameSite'] !== undefined && sameSite === undefined) {\n\t\tthrow new BrowserError('Browser cookie same-site policy is malformed', undefined, { index })\n\t}\n\treturn {\n\t\tname: value['name'],\n\t\tvalue: value['value'],\n\t\tdomain: value['domain'],\n\t\tpath: value['path'],\n\t\texpires: value['expires'],\n\t\thttp: value['httpOnly'],\n\t\tsecure: value['secure'],\n\t\tsite: sameSite,\n\t\tpartition: parseBrowserCookiePartition(value['partitionKey']),\n\t}\n}\n\n/**\n * Matches a decoded cookie against one request URL.\n *\n * @param cookie - Decoded context cookie\n * @param value - Candidate absolute URL\n * @returns True if domain, path, and secure constraints match; false otherwise\n */\nexport function matchesBrowserCookieURL(cookie: BrowserCookie, value: string): boolean {\n\tconst result = attempt(() => new URL(value))\n\tif (!result.success) {\n\t\tthrow new BrowserError('Browser cookie URL must be valid', undefined, { url: value })\n\t}\n\tconst url = result.value\n\tconst domain = cookie.domain.startsWith('.') ? cookie.domain.slice(1) : cookie.domain\n\tconst domainMatches = url.hostname === domain || url.hostname.endsWith(`.${domain}`)\n\tconst pathMatches =\n\t\turl.pathname === cookie.path ||\n\t\t(url.pathname.startsWith(cookie.path) &&\n\t\t\t(cookie.path.endsWith('/') || url.pathname[cookie.path.length] === '/'))\n\tconst secureMatches = !cookie.secure || url.protocol === 'https:' || url.protocol === 'wss:'\n\treturn domainMatches && pathMatches && secureMatches\n}\n\n/**\n * Decodes one in-page web-storage snapshot, throwing a `BrowserError` off-shape.\n *\n * @param value - Unknown evaluation result\n * @param origin - Origin represented by the result\n * @returns Valid origin storage\n */\nexport function readBrowserStorageOrigin(value: unknown, origin: string): BrowserStorageOrigin {\n\tif (!isRecord(value))\n\t\tthrow new BrowserError('Browser storage result is malformed', undefined, { origin })\n\treturn {\n\t\torigin,\n\t\tlocal: readBrowserStorageEntries(value['local'], origin, 'local'),\n\t\tsession: readBrowserStorageEntries(value['session'], origin, 'session'),\n\t}\n}\n\n/**\n * Decodes a list of web-storage entries, throwing a `BrowserError` off-shape.\n *\n * @param value - Unknown entry list\n * @param origin - Origin used for diagnostics\n * @param storage - Storage family used for diagnostics\n * @returns Valid key/value entries\n */\nexport function readBrowserStorageEntries(\n\tvalue: unknown,\n\torigin: string,\n\tstorage: 'local' | 'session',\n): readonly BrowserStorageEntry[] {\n\tif (!isArray(value)) {\n\t\tthrow new BrowserError('Browser storage entries are malformed', undefined, { origin, storage })\n\t}\n\treturn value.map((entry, index) => {\n\t\tif (!isRecord(entry) || !isString(entry['name']) || !isString(entry['value'])) {\n\t\t\tthrow new BrowserError('Browser storage entry is malformed', undefined, {\n\t\t\t\torigin,\n\t\t\t\tstorage,\n\t\t\t\tindex,\n\t\t\t})\n\t\t}\n\t\treturn { name: entry['name'], value: entry['value'] }\n\t})\n}\n\n/**\n * Converts typed media preferences to Chromium emulated media features.\n *\n * @param media - Public media configuration\n * @returns Protocol feature records\n */\nexport function mediaToFeatures(\n\tmedia: BrowserMedia,\n): ReadonlyArray<Readonly<Record<string, string>>> {\n\tconst features: Array<Readonly<Record<string, string>>> = []\n\tif (media.scheme !== undefined) {\n\t\tfeatures.push({ name: 'prefers-color-scheme', value: media.scheme })\n\t}\n\tif (media.contrast !== undefined) {\n\t\tfeatures.push({ name: 'prefers-contrast', value: media.contrast })\n\t}\n\tif (media.motion !== undefined) {\n\t\tfeatures.push({ name: 'prefers-reduced-motion', value: media.motion })\n\t}\n\tif (media.colors !== undefined) {\n\t\tfeatures.push({ name: 'forced-colors', value: media.colors })\n\t}\n\treturn features\n}\n\n/**\n * Decodes a Chromium runtime stack trace, skipping every off-shape call frame.\n *\n * @param value - Unknown stack trace or call-frame list\n * @returns Valid stack frames\n */\nexport function readBrowserStack(value: unknown): readonly BrowserStackFrame[] {\n\tconst frames = isRecord(value) ? value['callFrames'] : value\n\tif (!isArray(frames)) return []\n\tconst stack: BrowserStackFrame[] = []\n\tfor (const frame of frames) {\n\t\tif (\n\t\t\t!isRecord(frame) ||\n\t\t\t!isString(frame['url']) ||\n\t\t\t!isString(frame['functionName']) ||\n\t\t\t!isInteger(frame['lineNumber']) ||\n\t\t\t!isInteger(frame['columnNumber'])\n\t\t) {\n\t\t\tcontinue\n\t\t}\n\t\tstack.push({\n\t\t\turl: frame['url'],\n\t\t\tfunction: frame['functionName'],\n\t\t\tline: frame['lineNumber'],\n\t\t\tcolumn: frame['columnNumber'],\n\t\t})\n\t}\n\treturn stack\n}\n\n/**\n * Decodes a Runtime remote object's printable value, falling back to its unserializable form\n * and then its description, or `undefined` when it carries none.\n *\n * @param value - Unknown remote object\n * @returns By-value data or a description\n */\nexport function readBrowserRemoteValue(value: unknown): unknown {\n\tif (!isRecord(value)) return undefined\n\tif ('value' in value) return value['value']\n\tif (isString(value['unserializableValue'])) return value['unserializableValue']\n\tif (isString(value['description'])) return value['description']\n\treturn undefined\n}\n\n/**\n * Decodes one CDP `Runtime.evaluate` result, throwing a `BrowserError` on a failed evaluation\n * and a `BrowserResultLimitError` past the guarded result size.\n *\n * @param value - Unknown CDP result\n * @returns The returned by-value payload, or undefined\n */\nexport function readEvaluationResult(value: unknown): unknown {\n\tif (!isRecord(value)) return undefined\n\n\tif (isRecord(value['exceptionDetails'])) {\n\t\tconst details = value['exceptionDetails']\n\t\tif (isRecord(details['exception']) && isString(details['exception']['description'])) {\n\t\t\tconst description = details['exception']['description']\n\t\t\tconst limitMatch = BROWSER_RESULT_LIMIT_PATTERN.exec(description)\n\t\t\tif (limitMatch !== null) {\n\t\t\t\tthrow new BrowserResultLimitError('Evaluation result exceeds BROWSER_RESULT_LIMIT', {\n\t\t\t\t\tlength: Number(limitMatch[1]),\n\t\t\t\t\tlimit: BROWSER_RESULT_LIMIT,\n\t\t\t\t})\n\t\t\t}\n\t\t\tthrow new BrowserError(description)\n\t\t}\n\t\tthrow new BrowserError('JavaScript evaluation failed')\n\t}\n\n\tconst remoteObject = value['result']\n\tif (!isRecord(remoteObject)) return undefined\n\treturn 'value' in remoteObject ? remoteObject['value'] : undefined\n}\n\n/**\n * Requires an evaluated browser value to be a string.\n *\n * @param value - Candidate evaluated value\n * @param field - Human-readable field name used in the error\n * @returns The narrowed string\n */\nexport function requireBrowserString(value: unknown, field: string): string {\n\tif (isString(value)) return value\n\tthrow new BrowserError(`${field} failed: no string value returned`)\n}\n\n/**\n * Normalizes recorded codegen actions, collapsing consecutive `fill` actions on the same\n * selector into the latest value.\n *\n * @remarks\n * A text input fires one `input` event per keystroke, so the compiled script reflects\n * the final typed value rather than every intermediate keystroke.\n *\n * @param actions - Raw recorded actions, in capture order\n * @returns Normalized actions, in the same order\n */\nexport function normalizeCodegenActions(\n\tactions: readonly BrowserCodegenAction[],\n): readonly BrowserCodegenAction[] {\n\tconst result: BrowserCodegenAction[] = []\n\n\tfor (const action of actions) {\n\t\tconst previous = result[result.length - 1]\n\t\tif (\n\t\t\tprevious !== undefined &&\n\t\t\tprevious.action === 'fill' &&\n\t\t\taction.action === 'fill' &&\n\t\t\tprevious.selector === action.selector\n\t\t) {\n\t\t\tresult[result.length - 1] = action\n\t\t\tcontinue\n\t\t}\n\t\tresult.push(action)\n\t}\n\n\treturn result\n}\n\n/**\n * Decodes a flattened CDP `Page.getFrameTree` result into depth-first frame metadata, skipping\n * every off-shape frame.\n *\n * @param value - Unknown CDP result\n * @returns Frame metadata in depth-first, main-frame-first order\n */\nexport function readBrowserFrames(value: unknown): readonly BrowserFrameInfo[] {\n\tif (!isRecord(value) || !isRecord(value['frameTree'])) return []\n\n\tconst frames: BrowserFrameInfo[] = []\n\tconst stack: Array<Readonly<Record<string, unknown>>> = [value['frameTree']]\n\n\twhile (stack.length > 0) {\n\t\tconst node = stack.pop()\n\t\tif (node === undefined) break\n\t\tconst frame = node['frame']\n\n\t\tif (isRecord(frame) && isString(frame['id']) && isString(frame['url'])) {\n\t\t\tframes.push({\n\t\t\t\tid: frame['id'],\n\t\t\t\tparent: isString(frame['parentId']) ? frame['parentId'] : undefined,\n\t\t\t\tname: isString(frame['name']) && frame['name'] !== '' ? frame['name'] : undefined,\n\t\t\t\turl: frame['url'],\n\t\t\t})\n\t\t}\n\n\t\tconst children = node['childFrames']\n\t\tif (!isArray(children)) continue\n\t\tfor (let index = children.length - 1; index >= 0; index -= 1) {\n\t\t\tconst child = children[index]\n\t\t\tif (isRecord(child)) stack.push(child)\n\t\t}\n\t}\n\n\treturn frames\n}\n\n/**\n * Decodes the first `DOM.getContentQuads` quad and its center, throwing a `BrowserError`\n * off-shape.\n *\n * @param value - Unknown CDP result\n * @returns Decoded quad\n */\nexport function readBrowserQuad(value: unknown): BrowserQuad {\n\tif (!isRecord(value) || !isArray(value['quads'])) {\n\t\tthrow new BrowserError('Element has no content quad')\n\t}\n\tconst points = parseNumberArray(value['quads'][0])\n\tif (points === undefined || points.length !== 8) {\n\t\tthrow new BrowserError('Element has a malformed content quad')\n\t}\n\tconst x1 = points[0]\n\tconst y1 = points[1]\n\tconst x2 = points[2]\n\tconst y2 = points[3]\n\tconst x3 = points[4]\n\tconst y3 = points[5]\n\tconst x4 = points[6]\n\tconst y4 = points[7]\n\tif (\n\t\tx1 === undefined ||\n\t\ty1 === undefined ||\n\t\tx2 === undefined ||\n\t\ty2 === undefined ||\n\t\tx3 === undefined ||\n\t\ty3 === undefined ||\n\t\tx4 === undefined ||\n\t\ty4 === undefined\n\t) {\n\t\tthrow new BrowserError('Element has a malformed content quad')\n\t}\n\treturn {\n\t\tpoints: [x1, y1, x2, y2, x3, y3, x4, y4],\n\t\tcenter: {\n\t\t\tx: (x1 + x2 + x3 + x4) / 4,\n\t\t\ty: (y1 + y2 + y3 + y4) / 4,\n\t\t},\n\t}\n}\n\n/**\n * Extracts a keyboard chord such as `Control+Shift+P` into its parts, throwing a\n * `BrowserError` on an empty chord or an unsupported modifier.\n *\n * @param value - Chord source\n * @returns Canonical modifiers and terminal key\n * @throws Thrown when the chord is empty or names an unsupported modifier.\n */\nexport function extractBrowserChord(value: string): BrowserChord {\n\tconst parts = value.split('+').filter((part) => part.length > 0)\n\tconst key = parts.pop()\n\tif (key === undefined) throw new BrowserError('Browser key chord is empty')\n\tconst modifiers = parts.map((modifier) => {\n\t\tswitch (modifier) {\n\t\t\tcase 'Ctrl':\n\t\t\t\treturn 'Control'\n\t\t\tcase 'Cmd':\n\t\t\tcase 'Command':\n\t\t\t\treturn 'Meta'\n\t\t\tdefault:\n\t\t\t\treturn modifier\n\t\t}\n\t})\n\tfor (const modifier of modifiers) {\n\t\tif (BROWSER_KEY_MODIFIERS[modifier] === undefined) {\n\t\t\tthrow new BrowserError(`Unsupported browser key modifier: ${modifier}`)\n\t\t}\n\t}\n\treturn { modifiers, key }\n}\n\n/**\n * Computes the CDP Input modifier bitmask.\n *\n * @param modifiers - Canonical modifier names\n * @returns Combined CDP modifier mask\n */\nexport function computeBrowserModifiers(modifiers: readonly string[]): number {\n\tlet mask = 0\n\tfor (const modifier of modifiers) mask |= BROWSER_KEY_MODIFIERS[modifier] ?? 0\n\treturn mask\n}\n\n/**\n * Computes the CDP Input pressed-button bitmask.\n *\n * @param buttons - Pressed public mouse buttons\n * @returns Combined CDP pressed-button mask\n */\nexport function computeBrowserButtons(buttons: readonly BrowserMouseButton[]): number {\n\tlet mask = 0\n\tfor (const button of buttons) mask |= BROWSER_MOUSE_BUTTON_MASKS[button]\n\treturn mask\n}\n\n/**\n * Normalizes one key to CDP keyboard event data.\n *\n * @param value - Key value or canonical key name\n * @returns Normalized key data\n */\nexport function keyToBrowserInput(value: string): BrowserKey {\n\tconst named: Readonly<Record<string, BrowserKey>> = {\n\t\tBackspace: { key: 'Backspace', code: 'Backspace', text: undefined, number: 8 },\n\t\tTab: { key: 'Tab', code: 'Tab', text: '\\t', number: 9 },\n\t\tEnter: { key: 'Enter', code: 'Enter', text: '\\r', number: 13 },\n\t\tShift: { key: 'Shift', code: 'ShiftLeft', text: undefined, number: 16 },\n\t\tControl: { key: 'Control', code: 'ControlLeft', text: undefined, number: 17 },\n\t\tAlt: { key: 'Alt', code: 'AltLeft', text: undefined, number: 18 },\n\t\tEscape: { key: 'Escape', code: 'Escape', text: undefined, number: 27 },\n\t\tSpace: { key: ' ', code: 'Space', text: ' ', number: 32 },\n\t\tPageUp: { key: 'PageUp', code: 'PageUp', text: undefined, number: 33 },\n\t\tPageDown: { key: 'PageDown', code: 'PageDown', text: undefined, number: 34 },\n\t\tEnd: { key: 'End', code: 'End', text: undefined, number: 35 },\n\t\tHome: { key: 'Home', code: 'Home', text: undefined, number: 36 },\n\t\tArrowLeft: { key: 'ArrowLeft', code: 'ArrowLeft', text: undefined, number: 37 },\n\t\tArrowUp: { key: 'ArrowUp', code: 'ArrowUp', text: undefined, number: 38 },\n\t\tArrowRight: { key: 'ArrowRight', code: 'ArrowRight', text: undefined, number: 39 },\n\t\tArrowDown: { key: 'ArrowDown', code: 'ArrowDown', text: undefined, number: 40 },\n\t\tDelete: { key: 'Delete', code: 'Delete', text: undefined, number: 46 },\n\t\tMeta: { key: 'Meta', code: 'MetaLeft', text: undefined, number: 91 },\n\t}\n\tconst matched = named[value]\n\tif (matched !== undefined) return matched\n\tif ([...value].length !== 1) throw new BrowserError(`Unsupported browser key: ${value}`)\n\tconst character = [...value][0]\n\tif (character === undefined) throw new BrowserError('Browser key is empty')\n\tconst upper = character.toUpperCase()\n\tconst letter = /^[A-Z]$/.test(upper)\n\tconst digit = /^[0-9]$/.test(character)\n\treturn {\n\t\tkey: character,\n\t\tcode: letter ? `Key${upper}` : digit ? `Digit${character}` : '',\n\t\ttext: character,\n\t\tnumber: upper.charCodeAt(0),\n\t}\n}\n\n/**\n * Decodes CDP snapshot sparse string data into a node-index map, skipping every off-shape\n * entry.\n *\n * @param value - Sparse `{ index, value }` record\n * @param strings - Snapshot string table\n * @returns Node-index to string map\n */\nexport function readRareStringData(\n\tvalue: unknown,\n\tstrings: readonly string[],\n): ReadonlyMap<number, string> {\n\tconst decoded = new Map<number, string>()\n\tif (!isRecord(value)) return decoded\n\tconst indexes = parseNumberArray(value['index'])\n\tconst values = parseNumberArray(value['value'])\n\tif (indexes === undefined || values === undefined) return decoded\n\n\tfor (let index = 0; index < indexes.length; index += 1) {\n\t\tconst node = indexes[index]\n\t\tconst text = parseSnapshotString(strings, values[index])\n\t\tif (node !== undefined && text !== undefined) decoded.set(node, text)\n\t}\n\treturn decoded\n}\n\n/**\n * Decodes CDP snapshot sparse boolean data into a set of node indexes, skipping every\n * off-shape entry.\n *\n * @param value - Sparse `{ index }` record\n * @returns Set of node indexes whose value is true\n */\nexport function readRareBooleanData(value: unknown): ReadonlySet<number> {\n\tif (!isRecord(value)) return new Set()\n\treturn new Set(parseNumberArray(value['index']) ?? [])\n}\n\n/**\n * Decodes CDP snapshot sparse integer data into a node-index map, skipping every off-shape\n * entry.\n *\n * @param value - Sparse `{ index, value }` record\n * @returns Node-index to integer map\n */\nexport function readRareIntegerData(value: unknown): ReadonlyMap<number, number> {\n\tconst decoded = new Map<number, number>()\n\tif (!isRecord(value)) return decoded\n\tconst indexes = parseNumberArray(value['index'])\n\tconst values = parseNumberArray(value['value'])\n\tif (indexes === undefined || values === undefined) return decoded\n\n\tfor (let index = 0; index < indexes.length; index += 1) {\n\t\tconst node = indexes[index]\n\t\tconst integer = values[index]\n\t\tif (node !== undefined && integer !== undefined) decoded.set(node, integer)\n\t}\n\treturn decoded\n}\n\n/**\n * Decodes flattened CDP node attributes into a frozen record, skipping every off-shape pair.\n *\n * @param value - Candidate string-index array\n * @param strings - Snapshot string table\n * @returns Frozen attribute record\n */\nexport function readBrowserAttributes(\n\tvalue: unknown,\n\tstrings: readonly string[],\n): Readonly<Record<string, string>> {\n\tconst indexes = parseNumberArray(value)\n\tconst attributes: Record<string, string> = {}\n\tif (indexes === undefined) return Object.freeze(attributes)\n\n\tfor (let index = 0; index < indexes.length; index += 2) {\n\t\tconst name = parseSnapshotString(strings, indexes[index])\n\t\tconst attribute = parseSnapshotString(strings, indexes[index + 1])\n\t\tif (name !== undefined && attribute !== undefined) attributes[name] = attribute\n\t}\n\treturn Object.freeze(attributes)\n}\n\n/**\n * Decodes a CDP `DOMSnapshot.captureSnapshot` result into a serializable\n * `BrowserSnapshotInput`, throwing a `BrowserError` off-shape and a `BrowserResultLimitError`\n * past the configured node limit.\n *\n * @param value - Unknown CDP result\n * @param styles - Requested computed-style names, in protocol order\n * @param limit - Maximum accepted node count\n * @returns A typed serializable browser snapshot\n */\nexport function readBrowserSnapshot(\n\tvalue: unknown,\n\tstyles: readonly string[] = [],\n\tlimit = BROWSER_SNAPSHOT_NODE_LIMIT,\n): BrowserSnapshotInput {\n\tif (!isInteger(limit) || limit < 0) {\n\t\tthrow new BrowserError('Browser snapshot limit must be a non-negative integer', undefined, {\n\t\t\tlimit,\n\t\t})\n\t}\n\tif (!isRecord(value) || !isArray(value['strings']) || !isArray(value['documents'])) {\n\t\tthrow new BrowserError('Malformed DOMSnapshot.captureSnapshot result')\n\t}\n\tconst strings = parseArray(value['strings'], isString)\n\tif (strings === undefined) {\n\t\tthrow new BrowserError('Malformed DOMSnapshot string table')\n\t}\n\tlet count = 0\n\tfor (const document of value['documents']) {\n\t\tif (!isRecord(document) || !isRecord(document['nodes'])) continue\n\t\tcount += parseNumberArray(document['nodes']['nodeType'])?.length ?? 0\n\t}\n\tif (count > limit) {\n\t\tthrow new BrowserResultLimitError('DOM snapshot exceeds the configured node limit', {\n\t\t\tlength: count,\n\t\t\tlimit,\n\t\t})\n\t}\n\n\tconst documents: BrowserDocument[] = []\n\tfor (let documentIndex = 0; documentIndex < value['documents'].length; documentIndex += 1) {\n\t\tconst rawDocument = value['documents'][documentIndex]\n\t\tif (!isRecord(rawDocument) || !isRecord(rawDocument['nodes'])) {\n\t\t\tthrow new BrowserError('Malformed DOM snapshot document', undefined, {\n\t\t\t\tdocument: documentIndex,\n\t\t\t})\n\t\t}\n\n\t\tconst rawNodes = rawDocument['nodes']\n\t\tconst frame = parseSnapshotString(strings, rawDocument['frameId'])\n\t\tconst url = parseSnapshotString(strings, rawDocument['documentURL'])\n\t\tconst title =\n\t\t\trawDocument['title'] === -1 ? '' : parseSnapshotString(strings, rawDocument['title'])\n\t\tif (frame === undefined || url === undefined || title === undefined) {\n\t\t\tthrow new BrowserError('Malformed DOM snapshot document metadata', undefined, {\n\t\t\t\tdocument: documentIndex,\n\t\t\t})\n\t\t}\n\t\tconst types = parseNumberArray(rawNodes['nodeType'])\n\t\tconst names = parseNumberArray(rawNodes['nodeName'])\n\t\tconst values = parseNumberArray(rawNodes['nodeValue'])\n\t\tif (types === undefined || names === undefined || values === undefined) {\n\t\t\tthrow new BrowserError('Malformed DOM snapshot node table', undefined, {\n\t\t\t\tdocument: documentIndex,\n\t\t\t})\n\t\t}\n\n\t\tconst parents = parseNumberArray(rawNodes['parentIndex']) ?? []\n\t\tconst ids = parseNumberArray(rawNodes['backendNodeId']) ?? []\n\t\tconst rawAttributes = isArray(rawNodes['attributes']) ? rawNodes['attributes'] : []\n\t\tconst texts = readRareStringData(rawNodes['textValue'], strings)\n\t\tconst inputs = readRareStringData(rawNodes['inputValue'], strings)\n\t\tconst checked = readRareBooleanData(rawNodes['inputChecked'])\n\t\tconst selected = readRareBooleanData(rawNodes['optionSelected'])\n\t\tconst clickable = readRareBooleanData(rawNodes['isClickable'])\n\t\tconst shadows = readRareStringData(rawNodes['shadowRootType'], strings)\n\t\tconst contents = readRareIntegerData(rawNodes['contentDocumentIndex'])\n\t\tconst pseudos = readRareStringData(rawNodes['pseudoType'], strings)\n\t\tconst sources = readRareStringData(rawNodes['currentSourceURL'], strings)\n\t\tconst origins = readRareStringData(rawNodes['originURL'], strings)\n\t\tconst layouts = new Map<number, BrowserLayout>()\n\n\t\tif (isRecord(rawDocument['layout'])) {\n\t\t\tconst rawLayout = rawDocument['layout']\n\t\t\tconst nodeIndexes = parseNumberArray(rawLayout['nodeIndex']) ?? []\n\t\t\tconst rawStyles = isArray(rawLayout['styles']) ? rawLayout['styles'] : []\n\t\t\tconst rawBounds = isArray(rawLayout['bounds']) ? rawLayout['bounds'] : []\n\t\t\tconst rawTexts = parseNumberArray(rawLayout['text']) ?? []\n\t\t\tconst paints = parseNumberArray(rawLayout['paintOrders']) ?? []\n\t\t\tconst rawOffsets = isArray(rawLayout['offsetRects']) ? rawLayout['offsetRects'] : []\n\t\t\tconst rawScrolls = isArray(rawLayout['scrollRects']) ? rawLayout['scrollRects'] : []\n\t\t\tconst rawClients = isArray(rawLayout['clientRects']) ? rawLayout['clientRects'] : []\n\n\t\t\tfor (let layoutIndex = 0; layoutIndex < nodeIndexes.length; layoutIndex += 1) {\n\t\t\t\tconst nodeIndex = nodeIndexes[layoutIndex]\n\t\t\t\tif (nodeIndex === undefined) continue\n\t\t\t\tconst styleIndexes = parseNumberArray(rawStyles[layoutIndex]) ?? []\n\t\t\t\tconst computed: Record<string, string> = {}\n\t\t\t\tfor (let styleIndex = 0; styleIndex < styles.length; styleIndex += 1) {\n\t\t\t\t\tconst name = styles[styleIndex]\n\t\t\t\t\tconst style = parseSnapshotString(strings, styleIndexes[styleIndex])\n\t\t\t\t\tif (name !== undefined && style !== undefined) computed[name] = style\n\t\t\t\t}\n\t\t\t\tlayouts.set(nodeIndex, {\n\t\t\t\t\tbounds: parseBrowserRect(rawBounds[layoutIndex]),\n\t\t\t\t\tstyles: Object.freeze(computed),\n\t\t\t\t\ttext: parseSnapshotString(strings, rawTexts[layoutIndex]),\n\t\t\t\t\tpaint: paints[layoutIndex],\n\t\t\t\t\toffset: parseBrowserRect(rawOffsets[layoutIndex]),\n\t\t\t\t\tscroll: parseBrowserRect(rawScrolls[layoutIndex]),\n\t\t\t\t\tclient: parseBrowserRect(rawClients[layoutIndex]),\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\tconst nodes: BrowserNode[] = []\n\t\tfor (let nodeIndex = 0; nodeIndex < types.length; nodeIndex += 1) {\n\t\t\tconst category = types[nodeIndex]\n\t\t\tconst name = parseSnapshotString(strings, names[nodeIndex])\n\t\t\tconst nodeValue =\n\t\t\t\tvalues[nodeIndex] === -1 ? '' : parseSnapshotString(strings, values[nodeIndex])\n\t\t\tif (category === undefined || name === undefined || nodeValue === undefined) {\n\t\t\t\tthrow new BrowserError('Malformed DOM snapshot node', undefined, {\n\t\t\t\t\tdocument: documentIndex,\n\t\t\t\t\tindex: nodeIndex,\n\t\t\t\t})\n\t\t\t}\n\t\t\tconst parent = parents[nodeIndex]\n\t\t\tnodes.push({\n\t\t\t\tdocument: documentIndex,\n\t\t\t\tframe,\n\t\t\t\tindex: nodeIndex,\n\t\t\t\tid: ids[nodeIndex],\n\t\t\t\tparent: parent === undefined || parent < 0 ? undefined : parent,\n\t\t\t\tcategory,\n\t\t\t\tname,\n\t\t\t\tvalue: nodeValue,\n\t\t\t\tattributes: readBrowserAttributes(rawAttributes[nodeIndex], strings),\n\t\t\t\ttext: texts.get(nodeIndex),\n\t\t\t\tinput: inputs.get(nodeIndex),\n\t\t\t\tchecked: checked.has(nodeIndex) ? true : undefined,\n\t\t\t\tselected: selected.has(nodeIndex) ? true : undefined,\n\t\t\t\tclickable: clickable.has(nodeIndex) ? true : undefined,\n\t\t\t\tshadow: shadows.get(nodeIndex),\n\t\t\t\tcontent: contents.get(nodeIndex),\n\t\t\t\tpseudo: pseudos.get(nodeIndex),\n\t\t\t\tsource: sources.get(nodeIndex),\n\t\t\t\torigin: origins.get(nodeIndex),\n\t\t\t\tlayout: layouts.get(nodeIndex),\n\t\t\t})\n\t\t}\n\n\t\tdocuments.push({\n\t\t\tindex: documentIndex,\n\t\t\tframe,\n\t\t\turl,\n\t\t\ttitle,\n\t\t\tnodes,\n\t\t\tscroll: [\n\t\t\t\tisFiniteNumber(rawDocument['scrollOffsetX']) ? rawDocument['scrollOffsetX'] : undefined,\n\t\t\t\tisFiniteNumber(rawDocument['scrollOffsetY']) ? rawDocument['scrollOffsetY'] : undefined,\n\t\t\t],\n\t\t\twidth: isFiniteNumber(rawDocument['contentWidth']) ? rawDocument['contentWidth'] : undefined,\n\t\t\theight: isFiniteNumber(rawDocument['contentHeight'])\n\t\t\t\t? rawDocument['contentHeight']\n\t\t\t\t: undefined,\n\t\t})\n\t}\n\n\treturn { documents, styles: [...styles] }\n}\n\n/**\n * Tests whether a browser-node matcher is a declarative query rather than a predicate.\n *\n * @param value - Browser-node query or predicate\n * @returns True if the matcher is a declarative query; false otherwise\n *\n * @example\n * ```ts\n * import { isBrowserNodeQuery } from '@orkestrel/browser'\n *\n * isBrowserNodeQuery({ name: 'main' }) // true\n * isBrowserNodeQuery(() => true) // false\n * ```\n */\nexport function isBrowserNodeQuery(\n\tvalue: BrowserNodeQuery | BrowserNodePredicate,\n): value is BrowserNodeQuery {\n\treturn !isFunction(value)\n}\n\n/**\n * Tests a captured node against a declarative query.\n *\n * @param node - Captured browser node\n * @param query - Fields every candidate must satisfy\n * @returns True if the node matches; false otherwise\n */\nexport function matchesBrowserNode(node: BrowserNode, query: BrowserNodeQuery): boolean {\n\tif (query.name !== undefined && node.name.toLowerCase() !== query.name.toLowerCase()) return false\n\tif (\n\t\tquery.text !== undefined &&\n\t\t!node.value.includes(query.text) &&\n\t\tnode.text?.includes(query.text) !== true\n\t) {\n\t\treturn false\n\t}\n\tif (query.frame !== undefined && node.frame !== query.frame) return false\n\tif (query.clickable !== undefined && (node.clickable === true) !== query.clickable) return false\n\tif (query.visible !== undefined && isBrowserNodeVisible(node) !== query.visible) return false\n\tif (query.attributes !== undefined) {\n\t\tfor (const [name, value] of Object.entries(query.attributes)) {\n\t\t\tif (node.attributes[name] !== value) return false\n\t\t}\n\t}\n\treturn true\n}\n\n/**\n * Tests whether a captured node has a non-empty rendered layout box.\n *\n * @param node - Captured browser node\n * @returns True if the snapshot reports a visible layout box; false otherwise\n */\nexport function isBrowserNodeVisible(node: BrowserNode): boolean {\n\tconst bounds = node.layout?.bounds\n\treturn bounds !== undefined && bounds[2] > 0 && bounds[3] > 0\n}\n\n/**\n * Awaits every teardown step in order and returns the first failure.\n *\n * @remarks\n * A teardown runs every step even after one of them fails, so a later release\n * is never skipped by an earlier fault, and the failure the caller reports is\n * the first one. The failure is returned rather than thrown, so the caller\n * keeps the cleanup that must still run after the steps and decides where the\n * throw belongs. A step may throw any value, `undefined` and `null` included,\n * so the first throw is retained by a separate flag rather than by testing the\n * retained value.\n *\n * @param steps - The teardown steps, in the order they must run\n * @returns The value the first failing step threw, or undefined when no step threw\n *\n * @example\n * ```ts\n * import { settleBrowserTeardown } from '@orkestrel/browser'\n *\n * const failure = await settleBrowserTeardown(\n * \t() => client.close(),\n * \t() => transport.close(),\n * )\n * if (failure !== undefined) throw failure\n * ```\n */\nexport async function settleBrowserTeardown(\n\t...steps: readonly BrowserTeardownFunction[]\n): Promise<unknown> {\n\tlet failure: unknown\n\tlet settled = false\n\tfor (const step of steps) {\n\t\ttry {\n\t\t\tawait step()\n\t\t} catch (error) {\n\t\t\tif (!settled) {\n\t\t\t\tfailure = error\n\t\t\t\tsettled = true\n\t\t\t}\n\t\t}\n\t}\n\treturn failure\n}\n","import type {\n\tBrowserActionabilityOptions,\n\tBrowserCodegenAction,\n\tBrowserCodegenScriptOptions,\n\tBrowserQuery,\n\tBrowserScreenshotOptions,\n\tBrowserStorageOrigin,\n} from './types.js'\nimport {\n\tBROWSER_RESULT_LIMIT_SENTINEL_PREFIX,\n\tBROWSER_SCREENSHOT_ATTRIBUTE,\n\tBROWSER_STABLE_FRAME_COUNT,\n\tBROWSER_TEST_ID_ATTRIBUTE,\n\tBROWSER_VISIBILITY_SOURCE,\n\tBROWSER_WAIT_POLL_INTERVAL_MS,\n} from './constants.js'\n\n/**\n * Compiles an auto-retrying in-page predicate wait.\n *\n * @param expression - Value or function expression\n * @param timeout - Maximum wait in milliseconds\n * @returns Promise expression resolving to the first truthy value or false\n */\nexport function compileFunctionWaitExpression(expression: string, timeout: number): string {\n\treturn `new Promise((resolve, reject) => {\n\tconst deadline = performance.now() + ${timeout}\n\tconst predicate = (${expression})\n\tconst check = async () => {\n\t\ttry {\n\t\t\tconst value = typeof predicate === 'function' ? await predicate() : await predicate\n\t\t\tif (value) {\n\t\t\t\tresolve(value)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (performance.now() >= deadline) {\n\t\t\t\tresolve(false)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tsetTimeout(check, ${BROWSER_WAIT_POLL_INTERVAL_MS})\n\t\t} catch (error) {\n\t\t\treject(error)\n\t\t}\n\t}\n\tvoid check()\n})`\n}\n\n/**\n * Compiles the page-side promise facade for one Runtime binding.\n *\n * @param name - Binding identifier\n * @returns Self-installing script source\n */\nexport function compileBrowserBindingSource(name: string): string {\n\tconst binding = JSON.stringify(name)\n\tconst state = JSON.stringify(`__orkestrelBinding_${name}`)\n\treturn `(() => {\n\tconst name = ${binding}\n\tconst key = ${state}\n\tif (globalThis[key]) return\n\tconst send = globalThis[name]\n\tif (typeof send !== 'function') throw new Error('Browser binding transport is unavailable')\n\tconst pending = new Map()\n\tlet sequence = 0\n\tglobalThis[key] = {\n\t\tresolve(id, success, value) {\n\t\t\tconst entry = pending.get(id)\n\t\t\tif (!entry) return\n\t\t\tpending.delete(id)\n\t\t\tif (success) entry.resolve(value)\n\t\t\telse entry.reject(new Error(String(value)))\n\t\t},\n\t}\n\tglobalThis[name] = (...args) => new Promise((resolve, reject) => {\n\t\tsequence += 1\n\t\tconst id = String(sequence)\n\t\tpending.set(id, { resolve, reject })\n\t\tsend(JSON.stringify({ id, name, args }))\n\t})\n})()`\n}\n\n/**\n * Compiles delivery of a host binding result to one execution context.\n *\n * @param name - Binding identifier\n * @param id - Call identifier\n * @param success - Resolve rather than reject\n * @param value - Serializable result or error\n * @returns Runtime expression\n */\nexport function compileBrowserBindingResult(\n\tname: string,\n\tid: string,\n\tsuccess: boolean,\n\tvalue: unknown,\n): string {\n\treturn `globalThis[${JSON.stringify(`__orkestrelBinding_${name}`)}]?.resolve(${JSON.stringify(id)}, ${JSON.stringify(success)}, ${JSON.stringify(value)})`\n}\n\n/**\n * Compiles current-document cleanup for one page-side host binding facade.\n *\n * @param name - Binding identifier\n * @returns Runtime cleanup expression\n */\nexport function compileBrowserBindingCleanup(name: string): string {\n\treturn `(() => {\n\tdelete globalThis[${JSON.stringify(name)}]\n\tdelete globalThis[${JSON.stringify(`__orkestrelBinding_${name}`)}]\n\treturn true\n})()`\n}\n\n/**\n * Compiles temporary animation, caret, and mask setup for a screenshot.\n *\n * @param options - Screenshot controls\n * @returns Setup expression or undefined when no preparation is required\n */\nexport function compileScreenshotPreparationExpression(\n\toptions?: BrowserScreenshotOptions,\n): string | undefined {\n\tconst masks = options?.mask ?? []\n\tif (options?.animations !== false && options?.caret !== false && masks.length === 0) {\n\t\treturn undefined\n\t}\n\tconst queries = masks.map((locator) => compileLocatorListExpression(locator.query))\n\treturn `(() => {\n\tconst attribute = ${JSON.stringify(BROWSER_SCREENSHOT_ATTRIBUTE)}\n\tconst sequence = (globalThis.__orkestrelScreenshotSequence ?? 0) + 1\n\tglobalThis.__orkestrelScreenshotSequence = sequence\n\tconst token = String(sequence)\n\tif (${JSON.stringify(options?.animations === false || options?.caret === false)}) {\n\t\tconst style = document.createElement('style')\n\t\tstyle.setAttribute(attribute, token)\n\t\tstyle.textContent = ${JSON.stringify(\n\t\t\t`${options?.animations === false ? '*,*::before,*::after{animation:none!important;transition:none!important;scroll-behavior:auto!important}' : ''}${options?.caret === false ? '*{caret-color:transparent!important}' : ''}`,\n\t\t)}\n\t\tdocument.documentElement.appendChild(style)\n\t}\n\tconst groups = [${queries.join(',')}]\n\tfor (const group of groups) {\n\t\tfor (const element of group) {\n\t\t\tconst rect = element.getBoundingClientRect()\n\t\t\tconst mask = document.createElement('div')\n\t\t\tmask.setAttribute(attribute, token)\n\t\t\tmask.style.cssText = 'position:fixed;pointer-events:none;z-index:2147483647;' +\n\t\t\t\t'left:' + rect.left + 'px;top:' + rect.top + 'px;width:' + rect.width + 'px;height:' + rect.height + 'px;' +\n\t\t\t\t'background:' + ${JSON.stringify(options?.color ?? '#ff00ff')}\n\t\t\tdocument.documentElement.appendChild(mask)\n\t\t}\n\t}\n\treturn token\n})()`\n}\n\n/**\n * Compiles cleanup for temporary screenshot styles and masks.\n *\n * @param token - Preparation token\n * @returns Cleanup expression\n */\nexport function compileScreenshotCleanupExpression(token: string): string {\n\treturn `(() => {\n\tconst attribute = ${JSON.stringify(BROWSER_SCREENSHOT_ATTRIBUTE)}\n\tfor (const element of document.querySelectorAll('[' + attribute + ']')) {\n\t\tif (element.getAttribute(attribute) === ${JSON.stringify(token)}) element.remove()\n\t}\n\treturn true\n})()`\n}\n\n/**\n * Compiles an expression that serializes local and session storage.\n *\n * @returns In-page storage expression\n */\nexport function compileStorageReadExpression(): string {\n\treturn `({\n\tlocal: Array.from({ length: localStorage.length }, (_, index) => {\n\t\tconst name = localStorage.key(index)\n\t\treturn { name, value: name === null ? '' : localStorage.getItem(name) ?? '' }\n\t}),\n\tsession: Array.from({ length: sessionStorage.length }, (_, index) => {\n\t\tconst name = sessionStorage.key(index)\n\t\treturn { name, value: name === null ? '' : sessionStorage.getItem(name) ?? '' }\n\t}),\n})`\n}\n\n/**\n * Compiles an expression that restores one origin's web storage.\n *\n * @param origin - Storage values to restore\n * @returns In-page restore expression\n */\nexport function compileStorageRestoreExpression(origin: BrowserStorageOrigin): string {\n\treturn `(() => {\n\tconst state = ${JSON.stringify({ local: origin.local, session: origin.session })}\n\tlocalStorage.clear()\n\tsessionStorage.clear()\n\tfor (const entry of state.local) localStorage.setItem(entry.name, entry.value)\n\tfor (const entry of state.session) sessionStorage.setItem(entry.name, entry.value)\n\treturn true\n})()`\n}\n\n/**\n * Compiles an expression that clears local and session storage.\n *\n * @returns In-page clear expression\n */\nexport function compileStorageClearExpression(): string {\n\treturn `(() => {\n\tlocalStorage.clear()\n\tsessionStorage.clear()\n\treturn true\n})()`\n}\n\n/**\n * Compiles a `Runtime.evaluate` expression so the in-page code stringifies its own result and\n * throws a recognizable sentinel error before an oversized result would overflow the CDP\n * transport frame.\n *\n * @remarks\n * A result whose `JSON.stringify` length exceeds `limit` throws\n * `Error('BROWSER_RESULT_LIMIT: <length>')` inside the page instead of being\n * returned — the caller maps that sentinel to a coded\n * {@link BrowserResultLimitError}. A non-serializable result (`undefined`,\n * a function, a symbol) makes `JSON.stringify` return `undefined`, so the\n * length check is skipped and today's undefined-passthrough behavior is\n * unchanged.\n *\n * The expression is placed on its own line inside the wrapper (rather than\n * inline with the guard code) so a trailing `//` line comment in the\n * expression cannot swallow the closing guard syntax that follows it.\n *\n * @param expression - The candidate JavaScript expression to evaluate\n * @param limit - Maximum serialized-character length (see {@link BROWSER_RESULT_LIMIT})\n * @returns The wrapped, guarded expression\n */\nexport function compileGuardedEvaluateExpression(expression: string, limit: number): string {\n\treturn `(() => { const r = (\n${expression}\n); const s = JSON.stringify(r); if (typeof s === 'string' && s.length > ${limit}) throw new Error(${JSON.stringify(BROWSER_RESULT_LIMIT_SENTINEL_PREFIX)} + s.length); return r })()`\n}\n\n/**\n * Compiles recorded codegen actions into a replayable JavaScript or TypeScript script.\n *\n * @remarks\n * Emits one statement per action against a `page` object shaped like\n * {@link BrowserPageInterface} (`page.navigate(...)`, `page.click(...)`, …).\n * Both target languages emit an `async function run(page)` body whose\n * statements are `await`-ed; `language` only toggles whether the `page`\n * parameter carries a TypeScript type annotation (default `'javascript'`).\n *\n * @param actions - Normalized actions to compile\n * @param options - Compilation options (target language)\n * @returns The compiled script source\n */\nexport function compileCodegenScript(\n\tactions: readonly BrowserCodegenAction[],\n\toptions?: BrowserCodegenScriptOptions,\n): string {\n\tconst language = options?.language ?? 'javascript'\n\n\tconst lines = actions.map((action) => {\n\t\tswitch (action.action) {\n\t\t\tcase 'navigate':\n\t\t\t\treturn `await page.navigate(${JSON.stringify(action.url)})`\n\t\t\tcase 'click':\n\t\t\t\treturn `await page.click(${JSON.stringify(action.selector)})`\n\t\t\tcase 'fill':\n\t\t\t\treturn `await page.fill(${JSON.stringify(action.selector)}, ${JSON.stringify(action.value)})`\n\t\t\tcase 'select':\n\t\t\t\treturn `await page.select(${JSON.stringify(action.selector)}, ${JSON.stringify(action.values)})`\n\t\t}\n\t})\n\n\tif (language === 'typescript') {\n\t\treturn [\n\t\t\t`async function run(page: import('@orkestrel/browser').BrowserPageInterface): Promise<void> {`,\n\t\t\t...lines.map((line) => `\\t${line}`),\n\t\t\t`}`,\n\t\t].join('\\n')\n\t}\n\n\treturn [`async function run(page) {`, ...lines.map((line) => `\\t${line}`), `}`].join('\\n')\n}\n\n/**\n * Compiles a deep, shadow-aware locator query returning every match.\n *\n * @param query - Serializable locator query\n * @returns Runtime expression returning an element array\n */\nexport function compileLocatorListExpression(query: BrowserQuery): string {\n\treturn `(() => {\n\tconst query = ${JSON.stringify(query)}\n\tconst normalize = (value) => String(value ?? '').replace(/\\\\s+/g, ' ').trim()\n\tconst matchesText = (actual, expected, exact) => exact ? normalize(actual) === normalize(expected) : normalize(actual).includes(normalize(expected))\n\tconst elements = (root) => {\n\t\tconst found = []\n\t\tconst stack = []\n\t\tif (root instanceof Document || root instanceof ShadowRoot) {\n\t\t\tfor (let index = root.children.length - 1; index >= 0; index -= 1) stack.push(root.children[index])\n\t\t} else {\n\t\t\tfor (let index = root.children.length - 1; index >= 0; index -= 1) stack.push(root.children[index])\n\t\t}\n\t\twhile (stack.length > 0) {\n\t\t\tconst element = stack.pop()\n\t\t\tif (!(element instanceof Element)) continue\n\t\t\tfound.push(element)\n\t\t\tif (element.shadowRoot) {\n\t\t\t\tfor (let index = element.shadowRoot.children.length - 1; index >= 0; index -= 1) stack.push(element.shadowRoot.children[index])\n\t\t\t}\n\t\t\tfor (let index = element.children.length - 1; index >= 0; index -= 1) stack.push(element.children[index])\n\t\t}\n\t\treturn found\n\t}\n\tconst roleOf = (element) => {\n\t\tconst explicit = element.getAttribute('role')\n\t\tif (explicit) return explicit.split(/\\\\s+/)[0]\n\t\tconst tag = element.tagName.toLowerCase()\n\t\tif (tag === 'a' && element.hasAttribute('href')) return 'link'\n\t\tif (tag === 'button') return 'button'\n\t\tif (tag === 'textarea') return 'textbox'\n\t\tif (tag === 'select') return element.multiple ? 'listbox' : 'combobox'\n\t\tif (tag === 'option') return 'option'\n\t\tif (tag === 'img') return 'img'\n\t\tif (tag === 'nav') return 'navigation'\n\t\tif (tag === 'main') return 'main'\n\t\tif (tag === 'header') return 'banner'\n\t\tif (tag === 'footer') return 'contentinfo'\n\t\tif (tag === 'aside') return 'complementary'\n\t\tif (tag === 'article') return 'article'\n\t\tif (tag === 'form') return 'form'\n\t\tif (tag === 'table') return 'table'\n\t\tif (tag === 'tr') return 'row'\n\t\tif (tag === 'th') return 'columnheader'\n\t\tif (tag === 'td') return 'cell'\n\t\tif (tag === 'ul' || tag === 'ol') return 'list'\n\t\tif (tag === 'li') return 'listitem'\n\t\tif (/^h[1-6]$/.test(tag)) return 'heading'\n\t\tif (tag === 'input') {\n\t\t\tconst type = (element.getAttribute('type') || 'text').toLowerCase()\n\t\t\tif (type === 'checkbox') return 'checkbox'\n\t\t\tif (type === 'radio') return 'radio'\n\t\t\tif (type === 'range') return 'slider'\n\t\t\tif (type === 'number') return 'spinbutton'\n\t\t\tif (type === 'button' || type === 'submit' || type === 'reset') return 'button'\n\t\t\tif (type !== 'hidden') return 'textbox'\n\t\t}\n\t\treturn undefined\n\t}\n\tconst labelOf = (element) => {\n\t\tconst labelled = element.getAttribute('aria-labelledby')\n\t\tif (labelled) {\n\t\t\tconst text = labelled.split(/\\\\s+/).map((id) => element.ownerDocument.getElementById(id)?.textContent || '').join(' ')\n\t\t\tif (normalize(text)) return normalize(text)\n\t\t}\n\t\tif (element.hasAttribute('aria-label')) return normalize(element.getAttribute('aria-label'))\n\t\tif ('labels' in element && element.labels && element.labels.length > 0) {\n\t\t\tconst text = Array.from(element.labels, (label) => label.textContent || '').join(' ')\n\t\t\treturn normalize(text)\n\t\t}\n\t\treturn undefined\n\t}\n\tconst nameOf = (element) => {\n\t\tconst label = labelOf(element)\n\t\tif (label !== undefined) return label\n\t\tconst alt = element.getAttribute('alt')\n\t\tif (alt) return normalize(alt)\n\t\tconst title = element.getAttribute('title')\n\t\tif (title) return normalize(title)\n\t\tif (element instanceof HTMLInputElement && ['button', 'submit', 'reset'].includes(element.type)) return normalize(element.value)\n\t\treturn normalize(element.textContent)\n\t}\n\tconst visible = (element) => {\n\t\tconst style = getComputedStyle(element)\n\t\tconst rect = element.getBoundingClientRect()\n\t\treturn ${BROWSER_VISIBILITY_SOURCE}\n\t}\n\tconst resolve = (candidate) => {\n\t\tconst roots = candidate.parent ? resolve(candidate.parent) : [document]\n\t\tlet found = []\n\t\tfor (const root of roots) {\n\t\t\tconst candidates = elements(root)\n\t\t\tswitch (candidate.selector) {\n\t\t\t\tcase 'css':\n\t\t\t\t\tfound.push(...candidates.filter((element) => element.matches(candidate.value)))\n\t\t\t\t\tbreak\n\t\t\t\tcase 'role':\n\t\t\t\t\tfound.push(...candidates.filter((element) => roleOf(element) === candidate.value && (candidate.name === undefined || matchesText(nameOf(element), candidate.name, candidate.exact === true))))\n\t\t\t\t\tbreak\n\t\t\t\tcase 'text':\n\t\t\t\t\tfound.push(...candidates.filter((element) => matchesText(element.textContent, candidate.value, candidate.exact === true) && !Array.from(element.children).some((child) => matchesText(child.textContent, candidate.value, candidate.exact === true))))\n\t\t\t\t\tbreak\n\t\t\t\tcase 'label':\n\t\t\t\t\tfound.push(...candidates.filter((element) => {\n\t\t\t\t\t\tconst label = labelOf(element)\n\t\t\t\t\t\treturn label !== undefined && matchesText(label, candidate.value, candidate.exact === true)\n\t\t\t\t\t}))\n\t\t\t\t\tbreak\n\t\t\t\tcase 'placeholder':\n\t\t\t\t\tfound.push(...candidates.filter((element) => matchesText(element.getAttribute('placeholder'), candidate.value, candidate.exact === true)))\n\t\t\t\t\tbreak\n\t\t\t\tcase 'testId':\n\t\t\t\t\tfound.push(...candidates.filter((element) => element.getAttribute(${JSON.stringify(BROWSER_TEST_ID_ATTRIBUTE)}) === candidate.value))\n\t\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tfound = found.filter((element, index) => found.indexOf(element) === index)\n\t\tif (candidate.filter?.text !== undefined) found = found.filter((element) => matchesText(element.textContent, candidate.filter.text, candidate.filter.exact === true))\n\t\tif (candidate.filter?.visible !== undefined) found = found.filter((element) => visible(element) === candidate.filter.visible)\n\t\tif (candidate.index !== undefined) {\n\t\t\tconst index = candidate.index < 0 ? found.length + candidate.index : candidate.index\n\t\t\treturn found[index] ? [found[index]] : []\n\t\t}\n\t\treturn found\n\t}\n\treturn resolve(query)\n})()`\n}\n\n/**\n * Compiles a deep locator query returning its first match.\n *\n * @param query - Serializable locator query\n * @returns Runtime expression returning one element or undefined\n */\nexport function compileLocatorExpression(query: BrowserQuery): string {\n\treturn `(${compileLocatorListExpression(query)})[0]`\n}\n\n/**\n * Compiles an attached-state locator wait.\n */\nexport function compileAttachedLocatorWaitExpression(\n\tquery: BrowserQuery,\n\tstrict: boolean,\n\ttimeout: number,\n): string {\n\treturn `new Promise((resolve, reject) => {\n\tconst deadline = performance.now() + ${timeout}\n\tconst check = () => {\n\t\tconst matches = ${compileLocatorListExpression(query)}\n\t\tif (${JSON.stringify(strict)} && matches.length > 1) {\n\t\t\treject(new Error('Strict locator matched ' + matches.length + ' elements'))\n\t\t\treturn true\n\t\t}\n\t\tif (matches.length > 0) {\n\t\t\tresolve(true)\n\t\t\treturn true\n\t\t}\n\t\tif (performance.now() >= deadline) {\n\t\t\tresolve(false)\n\t\t\treturn true\n\t\t}\n\t\treturn false\n\t}\n\tif (check()) return\n\tconst timer = setInterval(() => {\n\t\tif (!check()) return\n\t\tclearInterval(timer)\n\t}, ${BROWSER_WAIT_POLL_INTERVAL_MS})\n})`\n}\n\n/**\n * Compiles a detached-state locator wait.\n */\nexport function compileDetachedLocatorWaitExpression(\n\tquery: BrowserQuery,\n\tstrict: boolean,\n\ttimeout: number,\n): string {\n\treturn `new Promise((resolve, reject) => {\n\tconst deadline = performance.now() + ${timeout}\n\tconst check = () => {\n\t\tconst matches = ${compileLocatorListExpression(query)}\n\t\tif (${JSON.stringify(strict)} && matches.length > 1) {\n\t\t\treject(new Error('Strict locator matched ' + matches.length + ' elements'))\n\t\t\treturn true\n\t\t}\n\t\tif (matches.length === 0) {\n\t\t\tresolve(true)\n\t\t\treturn true\n\t\t}\n\t\tif (performance.now() >= deadline) {\n\t\t\tresolve(false)\n\t\t\treturn true\n\t\t}\n\t\treturn false\n\t}\n\tif (check()) return\n\tconst timer = setInterval(() => {\n\t\tif (!check()) return\n\t\tclearInterval(timer)\n\t}, ${BROWSER_WAIT_POLL_INTERVAL_MS})\n})`\n}\n\n/**\n * Compiles a visible-state locator wait.\n */\nexport function compileVisibleLocatorWaitExpression(\n\tquery: BrowserQuery,\n\tstrict: boolean,\n\ttimeout: number,\n): string {\n\treturn `new Promise((resolve, reject) => {\n\tconst deadline = performance.now() + ${timeout}\n\tconst visible = (element) => {\n\t\tconst style = getComputedStyle(element)\n\t\tconst rect = element.getBoundingClientRect()\n\t\treturn ${BROWSER_VISIBILITY_SOURCE}\n\t}\n\tconst check = () => {\n\t\tconst matches = ${compileLocatorListExpression(query)}\n\t\tif (${JSON.stringify(strict)} && matches.length > 1) {\n\t\t\treject(new Error('Strict locator matched ' + matches.length + ' elements'))\n\t\t\treturn true\n\t\t}\n\t\tif (matches.length > 0 && visible(matches[0])) {\n\t\t\tresolve(true)\n\t\t\treturn true\n\t\t}\n\t\tif (performance.now() >= deadline) {\n\t\t\tresolve(false)\n\t\t\treturn true\n\t\t}\n\t\treturn false\n\t}\n\tif (check()) return\n\tconst timer = setInterval(() => {\n\t\tif (!check()) return\n\t\tclearInterval(timer)\n\t}, ${BROWSER_WAIT_POLL_INTERVAL_MS})\n})`\n}\n\n/**\n * Compiles a hidden-state locator wait.\n */\nexport function compileHiddenLocatorWaitExpression(\n\tquery: BrowserQuery,\n\tstrict: boolean,\n\ttimeout: number,\n): string {\n\treturn `new Promise((resolve, reject) => {\n\tconst deadline = performance.now() + ${timeout}\n\tconst visible = (element) => {\n\t\tconst style = getComputedStyle(element)\n\t\tconst rect = element.getBoundingClientRect()\n\t\treturn ${BROWSER_VISIBILITY_SOURCE}\n\t}\n\tconst check = () => {\n\t\tconst matches = ${compileLocatorListExpression(query)}\n\t\tif (${JSON.stringify(strict)} && matches.length > 1) {\n\t\t\treject(new Error('Strict locator matched ' + matches.length + ' elements'))\n\t\t\treturn true\n\t\t}\n\t\tif (matches.length === 0 || matches.every((element) => !visible(element))) {\n\t\t\tresolve(true)\n\t\t\treturn true\n\t\t}\n\t\tif (performance.now() >= deadline) {\n\t\t\tresolve(false)\n\t\t\treturn true\n\t\t}\n\t\treturn false\n\t}\n\tif (check()) return\n\tconst timer = setInterval(() => {\n\t\tif (!check()) return\n\t\tclearInterval(timer)\n\t}, ${BROWSER_WAIT_POLL_INTERVAL_MS})\n})`\n}\n\n/**\n * Compiles the element-side actionability pass used before trusted input.\n *\n * @param options - Checks required for the action\n * @returns Async `Runtime.callFunctionOn` function declaration\n */\nexport function compileActionabilityFunction(options: BrowserActionabilityOptions): string {\n\treturn `async function() {\n\tif (!(this instanceof Element) || !this.isConnected) throw new Error('Element is detached')\n\tthis.scrollIntoView({ block: 'center', inline: 'center', behavior: 'instant' })\n\tconst visible = () => {\n\t\tconst style = getComputedStyle(this)\n\t\tconst rect = this.getBoundingClientRect()\n\t\treturn ${BROWSER_VISIBILITY_SOURCE}\n\t}\n\tif (${JSON.stringify(options.visible === true)} && !visible()) throw new Error('Element is not visible')\n\tif (${JSON.stringify(options.enabled === true)} && this.matches(':disabled')) throw new Error('Element is disabled')\n\tif (${JSON.stringify(options.editable === true)} && (this.matches('[readonly]') || (!this.isContentEditable && !('value' in this)))) throw new Error('Element is not editable')\n\tlet previous\n\tfor (let index = 0; index < ${BROWSER_STABLE_FRAME_COUNT}; index += 1) {\n\t\tawait new Promise((resolve) => requestAnimationFrame(resolve))\n\t\tconst rect = this.getBoundingClientRect()\n\t\tconst current = [rect.x, rect.y, rect.width, rect.height]\n\t\tif (${JSON.stringify(options.stable === true)} && previous && current.some((value, part) => value !== previous[part])) {\n\t\t\tindex = 0\n\t\t}\n\t\tprevious = current\n\t}\n\tif (${JSON.stringify(options.events === true)}) {\n\t\tconst rect = this.getBoundingClientRect()\n\t\tconst position = ${JSON.stringify(options.position)}\n\t\tconst x = rect.x + (position?.x ?? rect.width / 2)\n\t\tconst y = rect.y + (position?.y ?? rect.height / 2)\n\t\tconst target = this.ownerDocument.elementFromPoint(x, y)\n\t\tif (target !== this && !this.contains(target)) throw new Error('Element does not receive pointer events')\n\t}\n\treturn true\n}`\n}\n\n/**\n * Compiles an in-page wait for an attached selector.\n *\n * @param selector - CSS selector\n * @param strict - Whether more than one match is an error\n * @param timeout - Maximum wait in milliseconds\n * @returns Runtime expression resolving to whether the state was reached\n */\nexport function compileAttachedWaitExpression(\n\tselector: string,\n\tstrict: boolean,\n\ttimeout: number,\n): string {\n\treturn `new Promise((resolve, reject) => {\n\tconst selector = ${JSON.stringify(selector)}\n\tconst strict = ${JSON.stringify(strict)}\n\tconst check = () => {\n\t\tconst matches = document.querySelectorAll(selector)\n\t\tif (strict && matches.length > 1) {\n\t\t\treject(new Error('Strict selector matched ' + matches.length + ' elements: ' + selector))\n\t\t\treturn true\n\t\t}\n\t\tif (matches.length > 0) {\n\t\t\tresolve(true)\n\t\t\treturn true\n\t\t}\n\t\treturn false\n\t}\n\tif (check()) return\n\tconst observer = new MutationObserver(() => {\n\t\tif (!check()) return\n\t\tobserver.disconnect()\n\t\tclearTimeout(timer)\n\t})\n\tconst timer = setTimeout(() => {\n\t\tobserver.disconnect()\n\t\tresolve(false)\n\t}, ${timeout})\n\tobserver.observe(document, { childList: true, subtree: true, attributes: true })\n})`\n}\n\n/**\n * Compiles an in-page wait for a detached selector.\n *\n * @param selector - CSS selector\n * @param strict - Whether more than one match is an error\n * @param timeout - Maximum wait in milliseconds\n * @returns Runtime expression resolving to whether the state was reached\n */\nexport function compileDetachedWaitExpression(\n\tselector: string,\n\tstrict: boolean,\n\ttimeout: number,\n): string {\n\treturn `new Promise((resolve, reject) => {\n\tconst selector = ${JSON.stringify(selector)}\n\tconst strict = ${JSON.stringify(strict)}\n\tconst check = () => {\n\t\tconst matches = document.querySelectorAll(selector)\n\t\tif (strict && matches.length > 1) {\n\t\t\treject(new Error('Strict selector matched ' + matches.length + ' elements: ' + selector))\n\t\t\treturn true\n\t\t}\n\t\tif (matches.length === 0) {\n\t\t\tresolve(true)\n\t\t\treturn true\n\t\t}\n\t\treturn false\n\t}\n\tif (check()) return\n\tconst observer = new MutationObserver(() => {\n\t\tif (!check()) return\n\t\tobserver.disconnect()\n\t\tclearTimeout(timer)\n\t})\n\tconst timer = setTimeout(() => {\n\t\tobserver.disconnect()\n\t\tresolve(false)\n\t}, ${timeout})\n\tobserver.observe(document, { childList: true, subtree: true, attributes: true })\n})`\n}\n\n/**\n * Compiles an in-page wait for a visible selector.\n *\n * @param selector - CSS selector\n * @param strict - Whether more than one match is an error\n * @param timeout - Maximum wait in milliseconds\n * @returns Runtime expression resolving to whether the state was reached\n */\nexport function compileVisibleWaitExpression(\n\tselector: string,\n\tstrict: boolean,\n\ttimeout: number,\n): string {\n\treturn `new Promise((resolve, reject) => {\n\tconst selector = ${JSON.stringify(selector)}\n\tconst strict = ${JSON.stringify(strict)}\n\tconst visible = (element) => {\n\t\tconst style = getComputedStyle(element)\n\t\tconst rect = element.getBoundingClientRect()\n\t\treturn ${BROWSER_VISIBILITY_SOURCE}\n\t}\n\tconst check = () => {\n\t\tconst matches = document.querySelectorAll(selector)\n\t\tif (strict && matches.length > 1) {\n\t\t\treject(new Error('Strict selector matched ' + matches.length + ' elements: ' + selector))\n\t\t\treturn true\n\t\t}\n\t\tif (matches.length > 0 && visible(matches[0])) {\n\t\t\tresolve(true)\n\t\t\treturn true\n\t\t}\n\t\treturn false\n\t}\n\tif (check()) return\n\tconst observer = new MutationObserver(() => {\n\t\tif (!check()) return\n\t\tobserver.disconnect()\n\t\tclearTimeout(timer)\n\t})\n\tconst timer = setTimeout(() => {\n\t\tobserver.disconnect()\n\t\tresolve(false)\n\t}, ${timeout})\n\tobserver.observe(document, { childList: true, subtree: true, attributes: true })\n})`\n}\n\n/**\n * Compiles an in-page wait for a hidden selector.\n *\n * @param selector - CSS selector\n * @param strict - Whether more than one match is an error\n * @param timeout - Maximum wait in milliseconds\n * @returns Runtime expression resolving to whether the state was reached\n */\nexport function compileHiddenWaitExpression(\n\tselector: string,\n\tstrict: boolean,\n\ttimeout: number,\n): string {\n\treturn `new Promise((resolve, reject) => {\n\tconst selector = ${JSON.stringify(selector)}\n\tconst strict = ${JSON.stringify(strict)}\n\tconst visible = (element) => {\n\t\tconst style = getComputedStyle(element)\n\t\tconst rect = element.getBoundingClientRect()\n\t\treturn ${BROWSER_VISIBILITY_SOURCE}\n\t}\n\tconst check = () => {\n\t\tconst matches = document.querySelectorAll(selector)\n\t\tif (strict && matches.length > 1) {\n\t\t\treject(new Error('Strict selector matched ' + matches.length + ' elements: ' + selector))\n\t\t\treturn true\n\t\t}\n\t\tif (matches.length === 0 || Array.from(matches).every((element) => !visible(element))) {\n\t\t\tresolve(true)\n\t\t\treturn true\n\t\t}\n\t\treturn false\n\t}\n\tif (check()) return\n\tconst observer = new MutationObserver(() => {\n\t\tif (!check()) return\n\t\tobserver.disconnect()\n\t\tclearTimeout(timer)\n\t})\n\tconst timer = setTimeout(() => {\n\t\tobserver.disconnect()\n\t\tresolve(false)\n\t}, ${timeout})\n\tobserver.observe(document, { childList: true, subtree: true, attributes: true })\n})`\n}\n\n/**\n * Compiles a strict, visibility-checked click expression.\n *\n * @param selector - CSS selector\n * @param strict - Whether more than one match is an error\n * @returns Runtime expression\n */\nexport function compileClickExpression(selector: string, strict: boolean): string {\n\treturn `(() => {\n\tconst selector = ${JSON.stringify(selector)}\n\tconst matches = document.querySelectorAll(selector)\n\tif (${JSON.stringify(strict)} && matches.length !== 1) throw new Error('Strict selector matched ' + matches.length + ' elements: ' + selector)\n\tconst el = matches[0]\n\tif (!el) throw new Error('Element not found: ' + selector)\n\tconst style = getComputedStyle(el)\n\tconst rect = el.getBoundingClientRect()\n\tif (!(${BROWSER_VISIBILITY_SOURCE})) throw new Error('Element is not visible: ' + selector)\n\tif (el.matches(':disabled')) throw new Error('Element is disabled: ' + selector)\n\tel.scrollIntoView({ block: 'center', inline: 'center' })\n\tel.click()\n})()`\n}\n\n/**\n * Compiles a strict, editable fill expression.\n *\n * @param selector - CSS selector\n * @param value - Value to assign\n * @param strict - Whether more than one match is an error\n * @returns Runtime expression\n */\nexport function compileFillExpression(selector: string, value: string, strict: boolean): string {\n\treturn `(() => {\n\tconst selector = ${JSON.stringify(selector)}\n\tconst matches = document.querySelectorAll(selector)\n\tif (${JSON.stringify(strict)} && matches.length !== 1) throw new Error('Strict selector matched ' + matches.length + ' elements: ' + selector)\n\tconst el = matches[0]\n\tif (!el) throw new Error('Element not found: ' + selector)\n\tconst style = getComputedStyle(el)\n\tconst rect = el.getBoundingClientRect()\n\tif (!(${BROWSER_VISIBILITY_SOURCE})) throw new Error('Element is not visible: ' + selector)\n\tif (el.matches(':disabled') || el.matches('[readonly]')) throw new Error('Element is not editable: ' + selector)\n\tif (!el.isContentEditable && !('value' in el)) throw new Error('Element cannot be filled: ' + selector)\n\tel.focus()\n\tif (el.isContentEditable) {\n\t\tel.textContent = ${JSON.stringify(value)}\n\t} else {\n\t\tel.value = ${JSON.stringify(value)}\n\t}\n\tel.dispatchEvent(new InputEvent('input', { bubbles: true, inputType: 'insertText', data: ${JSON.stringify(value)} }))\n\tel.dispatchEvent(new Event('change', { bubbles: true }))\n})()`\n}\n\n/**\n * Compiles a strict select expression.\n *\n * @param selector - CSS selector\n * @param values - Option values to select\n * @param strict - Whether more than one match is an error\n * @returns Runtime expression\n */\nexport function compileSelectExpression(\n\tselector: string,\n\tvalues: readonly string[],\n\tstrict: boolean,\n): string {\n\treturn `(() => {\n\tconst selector = ${JSON.stringify(selector)}\n\tconst matches = document.querySelectorAll(selector)\n\tif (${JSON.stringify(strict)} && matches.length !== 1) throw new Error('Strict selector matched ' + matches.length + ' elements: ' + selector)\n\tconst el = matches[0]\n\tif (!el) throw new Error('Element not found: ' + selector)\n\tif (!(el instanceof HTMLSelectElement)) throw new Error('Element is not a select: ' + selector)\n\tif (el.disabled) throw new Error('Element is disabled: ' + selector)\n\tconst values = ${JSON.stringify([...values])}\n\tif (!el.multiple && values.length > 1) throw new Error('Single select cannot accept multiple values: ' + selector)\n\tconst available = new Set(Array.from(el.options, (option) => option.value))\n\tconst missing = values.filter((value) => !available.has(value))\n\tif (missing.length > 0) throw new Error('Select options not found: ' + missing.join(', '))\n\tfor (const opt of el.options) opt.selected = values.includes(opt.value)\n\tel.dispatchEvent(new Event('input', { bubbles: true }))\n\tel.dispatchEvent(new Event('change', { bubbles: true }))\n})()`\n}\n","import type { BrowserTransitionFunction, BrowserTransitionInterface } from './types.js'\n\n/**\n * Runs one asynchronous transition at a time, shared by every caller that joins it.\n *\n * @remarks\n * An entity with a lifecycle runs the same guard around every transition: take\n * the promise already in flight when one exists, otherwise start the work, hold\n * its promise, and release the field afterwards only when it is still this\n * run's. Holding that guard in one place keeps the identity check — the part a\n * hand-written copy drops — identical at every site. The entry guards stay with\n * each entity, because what makes a transition unnecessary is the entity's own\n * state.\n *\n * @example\n * ```ts\n * import { BrowserTransition } from '@orkestrel/browser'\n *\n * const starting = new BrowserTransition()\n * await starting.execute(() => transport.start())\n * const joined = starting.pending // the in-flight promise, or undefined\n * ```\n */\nexport class BrowserTransition<T = void> implements BrowserTransitionInterface<T> {\n\t#pending: Promise<T> | undefined\n\n\tget pending(): Promise<T> | undefined {\n\t\treturn this.#pending\n\t}\n\n\tasync execute(work: BrowserTransitionFunction<T>): Promise<T> {\n\t\tconst active = this.#pending\n\t\tif (active !== undefined) return await active\n\n\t\tconst started = work()\n\t\tthis.#pending = started\n\t\ttry {\n\t\t\treturn await started\n\t\t} finally {\n\t\t\tif (this.#pending === started) this.#pending = undefined\n\t\t}\n\t}\n}\n","import type {\n\tCDPClientEventMap,\n\tCDPClientInterface,\n\tCDPClientOptions,\n\tCDPHandler,\n\tCDPSendOptions,\n\tCDPTransportInterface,\n} from './types.js'\nimport type { EmitterErrorHandler, EmitterInterface } from '@orkestrel/emitter'\nimport { BrowserTransition } from './BrowserTransition.js'\nimport { BROWSER_DEFAULT_TIMEOUT_MS } from './constants.js'\nimport { CDPConnectionError, CDPError, CDPTimeoutError } from './errors.js'\nimport { Emitter } from '@orkestrel/emitter'\nimport { isInteger, isRecord, isString, parseJSON } from '@orkestrel/contract'\n\n// === CDPClient\n\n/**\n * Provides a lightweight Chrome DevTools Protocol client over a {@link CDPTransportInterface}.\n *\n * @remarks\n * Sends JSON-RPC messages over the injected transport and dispatches\n * responses and events. The transport owns the connection itself\n * (WebSocket, pipe, or any other duplex channel); this class owns only\n * the JSON-RPC framing and id/session correlation.\n *\n * Supports session-scoped event subscriptions: a subscription registered\n * without a session id receives the event whatever session carries it, and a\n * session-scoped subscription receives only its own session's events.\n *\n * @example\n * ```ts\n * import { CDPClient } from '@orkestrel/browser'\n *\n * const client = new CDPClient({ transport })\n * await client.connect()\n * const targets = await client.send('Target.getTargets')\n * await client.close()\n * ```\n */\nexport class CDPClient implements CDPClientInterface {\n\treadonly #emitter: Emitter<CDPClientEventMap>\n\treadonly #transport: CDPTransportInterface\n\t#messageId = 0\n\treadonly #pending: Map<\n\t\tnumber,\n\t\t{\n\t\t\tmethod: string\n\t\t\tresolve: (value: unknown) => void\n\t\t\treject: (reason: unknown) => void\n\t\t\ttimer: ReturnType<typeof setTimeout>\n\t\t}\n\t> = new Map()\n\treadonly #subscriptions: Map<string | undefined, Map<string, Set<CDPHandler>>> = new Map()\n\t#connected = false\n\t#active = false\n\t#wired = false\n\treadonly #timeout: number\n\treadonly #error: EmitterErrorHandler | undefined\n\treadonly #connecting: BrowserTransition = new BrowserTransition()\n\treadonly #closing: BrowserTransition = new BrowserTransition()\n\t#closeRequested = false\n\t// Set while this client is the one closing the transport, so the transport\n\t// `close` a teardown produces reports `close` rather than `drop`.\n\t#expected = false\n\n\tconstructor(options: CDPClientOptions) {\n\t\tthis.#transport = options.transport\n\t\tthis.#timeout = options.timeout ?? BROWSER_DEFAULT_TIMEOUT_MS\n\t\tthis.#error = options.error\n\t\tthis.#emitter = new Emitter({\n\t\t\t...(options.on !== undefined ? { on: options.on } : {}),\n\t\t\t...(options.error !== undefined ? { error: options.error } : {}),\n\t\t})\n\t}\n\n\tget emitter(): EmitterInterface<CDPClientEventMap> {\n\t\treturn this.#emitter\n\t}\n\n\tget connected(): boolean {\n\t\treturn this.#connected\n\t}\n\n\tasync connect(): Promise<void> {\n\t\tconst closing = this.#closing.pending\n\t\tif (closing !== undefined) await closing\n\t\tif (this.#connected) return\n\t\tconst active = this.#connecting.pending\n\t\tif (active !== undefined) return await active\n\n\t\tthis.#closeRequested = false\n\t\tthis.#expected = false\n\t\tawait this.#connecting.execute(() => this.#connect())\n\t}\n\n\t/**\n\t * Closes the transport and re-establishes a fresh connection.\n\t *\n\t * @remarks\n\t * Client-level subscriptions (`subscribe`/`unsubscribe` registrations)\n\t * survive `close()` and remain active after the reconnect — only pending\n\t * in-flight requests are rejected. This lets a caller reconnect a dropped\n\t * transport without re-registering every handler.\n\t */\n\tasync reconnect(): Promise<void> {\n\t\tawait this.close()\n\t\tawait this.connect()\n\t}\n\n\tasync send(\n\t\tmethod: string,\n\t\tparams?: Readonly<Record<string, unknown>>,\n\t\toptions?: CDPSendOptions,\n\t): Promise<unknown> {\n\t\tif (!this.#connected) {\n\t\t\tthrow new CDPConnectionError('CDP client is not connected', { method })\n\t\t}\n\n\t\tconst id = this.#nextId()\n\t\tconst message: Record<string, unknown> = { id, method }\n\n\t\tif (params !== undefined) {\n\t\t\tmessage['params'] = params\n\t\t}\n\t\tif (options?.session !== undefined) {\n\t\t\tmessage['sessionId'] = options.session\n\t\t}\n\n\t\tconst serialized = JSON.stringify(message)\n\t\tconst effectiveTimeout = options?.timeout ?? this.#timeout\n\n\t\treturn new Promise<unknown>((resolve, reject) => {\n\t\t\tconst timer = setTimeout(() => {\n\t\t\t\tthis.#pending.delete(id)\n\t\t\t\treject(\n\t\t\t\t\tnew CDPTimeoutError(`CDP request timed out: ${method}`, {\n\t\t\t\t\t\tmethod,\n\t\t\t\t\t\ttimeout: effectiveTimeout,\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t}, effectiveTimeout)\n\n\t\t\tthis.#pending.set(id, { method, resolve, reject, timer })\n\n\t\t\tthis.#transport.send(serialized).catch((thrown: unknown) => {\n\t\t\t\tthis.#pending.delete(id)\n\t\t\t\tclearTimeout(timer)\n\t\t\t\treject(thrown)\n\t\t\t})\n\t\t})\n\t}\n\n\tsubscribe(method: string, handler: CDPHandler, session?: string): void {\n\t\tlet methods = this.#subscriptions.get(session)\n\t\tif (methods === undefined) {\n\t\t\tmethods = new Map()\n\t\t\tthis.#subscriptions.set(session, methods)\n\t\t}\n\t\tlet handlers = methods.get(method)\n\t\tif (handlers === undefined) {\n\t\t\thandlers = new Set()\n\t\t\tmethods.set(method, handlers)\n\t\t}\n\t\thandlers.add(handler)\n\t}\n\n\tunsubscribe(method: string, handler: CDPHandler, session?: string): void {\n\t\tconst methods = this.#subscriptions.get(session)\n\t\tif (methods === undefined) return\n\t\tconst handlers = methods.get(method)\n\t\tif (handlers !== undefined) {\n\t\t\thandlers.delete(handler)\n\t\t\tif (handlers.size === 0) methods.delete(method)\n\t\t}\n\t\tif (methods.size === 0) this.#subscriptions.delete(session)\n\t}\n\n\t/**\n\t * Closes the transport and rejects all pending requests.\n\t *\n\t * @remarks\n\t * Subscriptions registered through `subscribe()` are client-level\n\t * registrations, not connection-level state — they survive `close()`\n\t * (and a subsequent `reconnect()`/`connect()`) and keep firing once the\n\t * transport is active again. Only pending requests are rejected here.\n\t * If `close()` is called while `connect()` is still awaiting\n\t * `transport.start()`, the in-flight connect is rejected and the\n\t * transport is closed deterministically once `start()` resolves.\n\t */\n\tasync close(): Promise<void> {\n\t\tawait this.#closing.execute(() => this.#close())\n\t}\n\n\t// === Private helpers\n\n\tasync #connect(): Promise<void> {\n\t\tif (!this.#wired) {\n\t\t\tthis.#transport.emitter.on('message', (data) => this.#onMessage(data))\n\t\t\tthis.#transport.emitter.on('close', () => this.#onClose())\n\t\t\tthis.#transport.emitter.on('error', (error) => this.#onError(error))\n\t\t\tthis.#wired = true\n\t\t}\n\n\t\tawait this.#transport.start()\n\t\tthis.#active = true\n\n\t\tif (this.#closeRequested) {\n\t\t\tthis.#closeRequested = false\n\t\t\tthis.#expected = true\n\t\t\ttry {\n\t\t\t\tawait this.#transport.close()\n\t\t\t} finally {\n\t\t\t\tthis.#active = false\n\t\t\t}\n\t\t\tthis.#emitter.emit('close')\n\t\t\tthrow new CDPConnectionError('CDP client was closed while connecting', {\n\t\t\t\tmethod: 'connect',\n\t\t\t})\n\t\t}\n\n\t\tthis.#connected = true\n\t\tthis.#emitter.emit('connect')\n\t}\n\n\tasync #close(): Promise<void> {\n\t\tconst connecting = this.#connecting.pending\n\t\tif (connecting !== undefined) {\n\t\t\tthis.#closeRequested = true\n\t\t\tawait connecting.catch(() => undefined)\n\t\t\t// The in-flight attempt may have already flipped #connected to\n\t\t\t// true before observing #closeRequested (race between the\n\t\t\t// attempt's final steps and #closeRequested being set here).\n\t\t\t// Fall through to the normal connected-close path instead of\n\t\t\t// returning early, or the close would be silently lost.\n\t\t}\n\n\t\tif (!this.#connected && !this.#active) return\n\n\t\tthis.#connected = false\n\n\t\t// Reject all pending requests\n\t\tfor (const [id, entry] of this.#pending) {\n\t\t\tclearTimeout(entry.timer)\n\t\t\tentry.reject(new CDPConnectionError('CDP connection closed', { method: entry.method }))\n\t\t\tthis.#pending.delete(id)\n\t\t}\n\n\t\tthis.#expected = true\n\t\ttry {\n\t\t\tawait this.#transport.close()\n\t\t} finally {\n\t\t\tthis.#active = false\n\t\t}\n\t\tthis.#emitter.emit('close')\n\t}\n\n\t#nextId(): number {\n\t\tthis.#messageId += 1\n\t\treturn this.#messageId\n\t}\n\n\t#onClose(): void {\n\t\tthis.#connected = false\n\t\tthis.#active = false\n\n\t\t// Reject all pending requests\n\t\tfor (const [id, entry] of this.#pending) {\n\t\t\tclearTimeout(entry.timer)\n\t\t\tentry.reject(new CDPConnectionError('CDP connection closed', { method: entry.method }))\n\t\t\tthis.#pending.delete(id)\n\t\t}\n\t\tif (!this.#expected) this.#emitter.emit('drop')\n\t}\n\n\t#onError(error: unknown): void {\n\t\tthis.#connected = false\n\t\tfor (const [id, entry] of this.#pending) {\n\t\t\tclearTimeout(entry.timer)\n\t\t\tentry.reject(\n\t\t\t\tnew CDPConnectionError(`CDP connection failed: ${String(error)}`, {\n\t\t\t\t\tmethod: entry.method,\n\t\t\t\t\terror,\n\t\t\t\t}),\n\t\t\t)\n\t\t\tthis.#pending.delete(id)\n\t\t}\n\t\tthis.#emitter.emit('error', error)\n\t}\n\n\t#onMessage(data: string): void {\n\t\tconst parsed = parseJSON(data)\n\t\tif (!isRecord(parsed)) return\n\n\t\t// Response to a pending request\n\t\tif (isInteger(parsed['id'])) {\n\t\t\tconst id = parsed['id']\n\t\t\tconst entry = this.#pending.get(id)\n\t\t\tif (entry !== undefined) {\n\t\t\t\tthis.#pending.delete(id)\n\t\t\t\tclearTimeout(entry.timer)\n\n\t\t\t\tconst errorValue = parsed['error']\n\t\t\t\tif (isRecord(errorValue)) {\n\t\t\t\t\tconst message = isString(errorValue['message']) ? errorValue['message'] : 'CDP error'\n\t\t\t\t\tconst context: Record<string, unknown> = { method: entry.method }\n\t\t\t\t\tif ('code' in errorValue) context['code'] = errorValue['code']\n\t\t\t\t\tcontext['message'] = message\n\t\t\t\t\tif ('data' in errorValue) context['data'] = errorValue['data']\n\t\t\t\t\tentry.reject(new CDPError(message, context))\n\t\t\t\t} else {\n\t\t\t\t\tentry.resolve('result' in parsed ? parsed['result'] : undefined)\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn\n\t\t}\n\n\t\t// CDP event\n\t\tif (isString(parsed['method'])) {\n\t\t\tconst method = parsed['method']\n\t\t\tconst rawParams = parsed['params']\n\t\t\tconst params: Readonly<Record<string, unknown>> = isRecord(rawParams)\n\t\t\t\t? rawParams\n\t\t\t\t: Object.freeze({})\n\n\t\t\tconst global = this.#subscriptions.get(undefined)?.get(method)\n\t\t\tif (global !== undefined) this.#dispatch(global, method, params)\n\n\t\t\tconst session = parsed['sessionId']\n\t\t\tif (isString(session)) {\n\t\t\t\tconst scoped = this.#subscriptions.get(session)?.get(method)\n\t\t\t\tif (scoped !== undefined) this.#dispatch(scoped, method, params)\n\t\t\t}\n\t\t}\n\t}\n\n\t#dispatch(\n\t\thandlers: ReadonlySet<CDPHandler>,\n\t\tmethod: string,\n\t\tparams: Readonly<Record<string, unknown>>,\n\t): void {\n\t\tfor (const handler of [...handlers]) {\n\t\t\ttry {\n\t\t\t\thandler(params)\n\t\t\t} catch (thrown) {\n\t\t\t\t// One observer must not prevent sibling observers from receiving the\n\t\t\t\t// event, so the throw is reported rather than propagated.\n\t\t\t\tthis.#error?.(thrown, method)\n\t\t\t}\n\t\t}\n\t}\n}\n","import type {\n\tBrowserAccessibilityInterface,\n\tBrowserAccessibilityOptions,\n\tBrowserAccessibilitySnapshot,\n\tBrowserFrameInterface,\n} from './types.js'\nimport { readBrowserAccessibility, validateBrowserAccessibilityOptions } from './helpers.js'\n\n/**\n * Captures Chromium Accessibility-domain snapshots for one page.\n *\n * @example\n * ```ts\n * import { BrowserAccessibility } from '@orkestrel/browser'\n *\n * const accessibility = new BrowserAccessibility(page)\n * const tree = await accessibility.snapshot({ depth: 3 }) // { roots, nodes }\n * ```\n */\nexport class BrowserAccessibility implements BrowserAccessibilityInterface {\n\treadonly #frame: BrowserFrameInterface\n\n\tconstructor(frame: BrowserFrameInterface) {\n\t\tthis.#frame = frame\n\t}\n\n\tasync snapshot(options?: BrowserAccessibilityOptions): Promise<BrowserAccessibilitySnapshot> {\n\t\tvalidateBrowserAccessibilityOptions(options)\n\t\tawait this.#frame.send('Accessibility.enable')\n\t\ttry {\n\t\t\tconst result =\n\t\t\t\toptions?.root === undefined\n\t\t\t\t\t? await this.#frame.send('Accessibility.getFullAXTree', {\n\t\t\t\t\t\t\tdepth: options?.depth,\n\t\t\t\t\t\t\tframeId: this.#frame.id,\n\t\t\t\t\t\t})\n\t\t\t\t\t: await this.#frame.send('Accessibility.getPartialAXTree', {\n\t\t\t\t\t\t\tbackendNodeId: options.root,\n\t\t\t\t\t\t\tfetchRelatives: true,\n\t\t\t\t\t\t})\n\t\t\treturn readBrowserAccessibility(result)\n\t\t} finally {\n\t\t\tawait this.#frame.send('Accessibility.disable').catch(() => undefined)\n\t\t}\n\t}\n}\n","import type { BrowserClockInterface, BrowserFrameInterface } from './types.js'\nimport { BROWSER_DEFAULT_TIMEOUT_MS } from './constants.js'\nimport { BrowserError } from './errors.js'\nimport { settleBrowserTeardown } from './helpers.js'\nimport { isFiniteNumber } from '@orkestrel/contract'\n\n/**\n * Controls the Chromium virtual-time budget for deterministic page timers.\n *\n * @example\n * ```ts\n * import { BrowserClock } from '@orkestrel/browser'\n *\n * const clock = new BrowserClock(page)\n * await clock.install(Date.UTC(2026, 0, 1))\n * await clock.advance(5_000)\n * await clock.uninstall()\n * ```\n */\nexport class BrowserClock implements BrowserClockInterface {\n\treadonly #frame: BrowserFrameInterface\n\t#installed = false\n\t#advancing = false\n\t#budgetResolve: (() => void) | undefined\n\treadonly #budgetHandler = this.#handleBudget.bind(this)\n\n\tconstructor(frame: BrowserFrameInterface) {\n\t\tthis.#frame = frame\n\t}\n\n\tget installed(): boolean {\n\t\treturn this.#installed\n\t}\n\n\tasync install(time = Date.now()): Promise<void> {\n\t\tif (this.#installed) throw new BrowserError('Browser clock is already installed')\n\t\tif (!isFiniteNumber(time) || time < 0) {\n\t\t\tthrow new BrowserError('Browser clock time must be a non-negative finite epoch', undefined, {\n\t\t\t\ttime,\n\t\t\t})\n\t\t}\n\t\tawait this.#frame.send('Emulation.setVirtualTimePolicy', {\n\t\t\tpolicy: 'pause',\n\t\t\tinitialVirtualTime: time / 1000,\n\t\t})\n\t\tthis.#installed = true\n\t}\n\n\tasync pause(): Promise<void> {\n\t\tthis.#assert()\n\t\tthis.#idle()\n\t\tawait this.#frame.send('Emulation.setVirtualTimePolicy', { policy: 'pause' })\n\t}\n\n\tasync resume(): Promise<void> {\n\t\tthis.#assert()\n\t\tthis.#idle()\n\t\tawait this.#frame.send('Emulation.setVirtualTimePolicy', {\n\t\t\tpolicy: 'advance',\n\t\t\tmaxVirtualTimeTaskStarvationCount: 10_000,\n\t\t})\n\t}\n\n\tasync advance(ms: number): Promise<void> {\n\t\tthis.#assert()\n\t\tthis.#idle()\n\t\tif (!isFiniteNumber(ms) || ms < 0) {\n\t\t\tthrow new BrowserError('Browser clock advance must be non-negative and finite', undefined, {\n\t\t\t\tms,\n\t\t\t})\n\t\t}\n\t\tif (ms === 0) {\n\t\t\tawait this.pause()\n\t\t\treturn\n\t\t}\n\t\tconst deferred = Promise.withResolvers<void>()\n\t\tthis.#advancing = true\n\t\tthis.#budgetResolve = deferred.resolve\n\t\ttry {\n\t\t\tawait this.#frame.subscribe('Emulation.virtualTimeBudgetExpired', this.#budgetHandler)\n\t\t} catch (error) {\n\t\t\tthis.#budgetResolve = undefined\n\t\t\tthis.#advancing = false\n\t\t\tthrow error\n\t\t}\n\t\tconst timer = setTimeout(() => {\n\t\t\tdeferred.reject(new BrowserError('Browser virtual-time budget timed out'))\n\t\t}, BROWSER_DEFAULT_TIMEOUT_MS)\n\t\tlet failure: unknown\n\t\ttry {\n\t\t\tawait this.#frame.send('Emulation.setVirtualTimePolicy', {\n\t\t\t\tpolicy: 'advance',\n\t\t\t\tbudget: ms,\n\t\t\t\tmaxVirtualTimeTaskStarvationCount: 10_000,\n\t\t\t})\n\t\t\tawait deferred.promise\n\t\t} catch (error) {\n\t\t\tfailure = error\n\t\t} finally {\n\t\t\tclearTimeout(timer)\n\t\t\tthis.#budgetResolve = undefined\n\t\t\tconst settled = await settleBrowserTeardown(\n\t\t\t\t() => this.#frame.unsubscribe('Emulation.virtualTimeBudgetExpired', this.#budgetHandler),\n\t\t\t\t() => this.#frame.send('Emulation.setVirtualTimePolicy', { policy: 'pause' }),\n\t\t\t)\n\t\t\tfailure ??= settled\n\t\t\tthis.#advancing = false\n\t\t}\n\t\tif (failure !== undefined) throw failure\n\t}\n\n\tasync uninstall(): Promise<void> {\n\t\tif (!this.#installed) return\n\t\tthis.#idle()\n\t\tawait this.#frame.send('Emulation.setVirtualTimePolicy', {\n\t\t\tpolicy: 'advance',\n\t\t\tmaxVirtualTimeTaskStarvationCount: 10_000,\n\t\t})\n\t\tthis.#installed = false\n\t}\n\n\t#assert(): void {\n\t\tif (!this.#installed) throw new BrowserError('Browser clock is not installed')\n\t}\n\n\t#idle(): void {\n\t\tif (this.#advancing) throw new BrowserError('Browser clock advance is already active')\n\t}\n\n\t#handleBudget(): void {\n\t\tthis.#budgetResolve?.()\n\t}\n}\n","import type {\n\tBrowserCoverageInterface,\n\tBrowserCoverageOptions,\n\tBrowserCoverageResult,\n\tBrowserFrameInterface,\n} from './types.js'\nimport {\n\treadBrowserScriptCoverage,\n\treadBrowserStyleCoverage,\n\tsettleBrowserTeardown,\n} from './helpers.js'\nimport { BrowserError } from './errors.js'\n\n/**\n * Collects JavaScript precise coverage and CSS rule usage for one page target.\n *\n * @example\n * ```ts\n * import { BrowserCoverage } from '@orkestrel/browser'\n *\n * const coverage = new BrowserCoverage(page)\n * await coverage.start({ javascript: true, css: true })\n * const usage = await coverage.stop() // { scripts, styles }\n * ```\n */\nexport class BrowserCoverage implements BrowserCoverageInterface {\n\treadonly #frame: BrowserFrameInterface\n\t#active = false\n\t#options: BrowserCoverageOptions | undefined\n\n\tconstructor(frame: BrowserFrameInterface) {\n\t\tthis.#frame = frame\n\t}\n\n\tget active(): boolean {\n\t\treturn this.#active\n\t}\n\n\tasync start(options?: BrowserCoverageOptions): Promise<void> {\n\t\tif (this.#active) throw new BrowserError('Browser coverage is already active')\n\t\tconst javascript = options?.javascript ?? true\n\t\tconst css = options?.css ?? true\n\t\tif (!javascript && !css) {\n\t\t\tthrow new BrowserError('Browser coverage requires JavaScript, CSS, or both')\n\t\t}\n\t\tlet profiler = false\n\t\tlet precise = false\n\t\tlet dom = false\n\t\tlet styles = false\n\t\tlet rules = false\n\t\ttry {\n\t\t\tif (javascript) {\n\t\t\t\tawait this.#frame.send('Profiler.enable')\n\t\t\t\tprofiler = true\n\t\t\t\tawait this.#frame.send('Profiler.startPreciseCoverage', {\n\t\t\t\t\tcallCount: true,\n\t\t\t\t\tdetailed: options?.detailed ?? true,\n\t\t\t\t\tallowTriggeredUpdates: false,\n\t\t\t\t})\n\t\t\t\tprecise = true\n\t\t\t}\n\t\t\tif (css) {\n\t\t\t\tawait this.#frame.send('DOM.enable')\n\t\t\t\tdom = true\n\t\t\t\tawait this.#frame.send('CSS.enable')\n\t\t\t\tstyles = true\n\t\t\t\tawait this.#frame.send('CSS.startRuleUsageTracking')\n\t\t\t\trules = true\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tif (rules) {\n\t\t\t\tawait this.#frame.send('CSS.stopRuleUsageTracking').catch(() => undefined)\n\t\t\t}\n\t\t\tif (styles) await this.#frame.send('CSS.disable').catch(() => undefined)\n\t\t\tif (dom) await this.#frame.send('DOM.disable').catch(() => undefined)\n\t\t\tif (precise) {\n\t\t\t\tawait this.#frame.send('Profiler.stopPreciseCoverage').catch(() => undefined)\n\t\t\t}\n\t\t\tif (profiler) await this.#frame.send('Profiler.disable').catch(() => undefined)\n\t\t\tthrow error\n\t\t}\n\t\tthis.#options = options\n\t\tthis.#active = true\n\t}\n\n\tasync stop(): Promise<BrowserCoverageResult> {\n\t\tif (!this.#active) throw new BrowserError('Browser coverage is not active')\n\t\tthis.#active = false\n\t\tconst javascript = this.#options?.javascript ?? true\n\t\tconst css = this.#options?.css ?? true\n\t\tlet scripts: BrowserCoverageResult['scripts'] = []\n\t\tlet styles: BrowserCoverageResult['styles'] = []\n\t\tconst failure = await settleBrowserTeardown(\n\t\t\tasync () => {\n\t\t\t\tif (javascript) scripts = await this.#stopJavaScript()\n\t\t\t},\n\t\t\tasync () => {\n\t\t\t\tif (css) styles = await this.#stopCSS()\n\t\t\t},\n\t\t)\n\t\tthis.#options = undefined\n\t\tif (failure !== undefined) throw failure\n\t\treturn { scripts, styles }\n\t}\n\n\tasync destroy(): Promise<void> {\n\t\tif (!this.#active) return\n\t\tawait this.stop().catch(() => undefined)\n\t}\n\n\tasync #stopJavaScript(): Promise<BrowserCoverageResult['scripts']> {\n\t\tlet result: unknown\n\t\tconst failure = await settleBrowserTeardown(\n\t\t\tasync () => {\n\t\t\t\tresult = await this.#frame.send('Profiler.takePreciseCoverage')\n\t\t\t},\n\t\t\t() => this.#frame.send('Profiler.stopPreciseCoverage'),\n\t\t\t() => this.#frame.send('Profiler.disable'),\n\t\t)\n\t\tif (failure !== undefined) throw failure\n\t\treturn readBrowserScriptCoverage(result)\n\t}\n\n\tasync #stopCSS(): Promise<BrowserCoverageResult['styles']> {\n\t\tlet result: unknown\n\t\tconst failure = await settleBrowserTeardown(\n\t\t\tasync () => {\n\t\t\t\tresult = await this.#frame.send('CSS.stopRuleUsageTracking')\n\t\t\t},\n\t\t\t() => this.#frame.send('CSS.disable'),\n\t\t\t() => this.#frame.send('DOM.disable'),\n\t\t)\n\t\tif (failure !== undefined) throw failure\n\t\treturn readBrowserStyleCoverage(result)\n\t}\n}\n","import type {\n\tBrowserCookie,\n\tBrowserCookieFilter,\n\tBrowserCookieInput,\n\tBrowserCookieManagerInterface,\n\tCDPClientInterface,\n} from './types.js'\nimport { cookieToProtocol, matchesBrowserCookieURL, readBrowserCookies } from './helpers.js'\nimport { isRecord } from '@orkestrel/contract'\nimport { BrowserError } from './errors.js'\n\n/**\n * Performs cookie operations isolated to one browser context.\n *\n * @example\n * ```ts\n * import { BrowserCookieManager } from '@orkestrel/browser'\n *\n * const cookies = new BrowserCookieManager(client)\n * await cookies.set([{ name: 'session', value: 'value', url: 'https://example.com/' }])\n * const current = await cookies.cookies(['https://example.com/'])\n * ```\n */\nexport class BrowserCookieManager implements BrowserCookieManagerInterface {\n\treadonly #client: CDPClientInterface\n\treadonly #context: string | undefined\n\n\tconstructor(client: CDPClientInterface, context?: string) {\n\t\tthis.#client = client\n\t\tthis.#context = context\n\t}\n\n\tasync cookies(urls?: readonly string[]): Promise<readonly BrowserCookie[]> {\n\t\tconst params: Record<string, unknown> = {}\n\t\tif (this.#context !== undefined) params['browserContextId'] = this.#context\n\t\tconst result = await this.#client.send('Storage.getCookies', params)\n\t\tconst cookies = readBrowserCookies(result)\n\t\tif (urls === undefined || urls.length === 0) return cookies\n\n\t\treturn cookies.filter((cookie) => urls.some((value) => matchesBrowserCookieURL(cookie, value)))\n\t}\n\n\tasync set(cookies: readonly BrowserCookieInput[]): Promise<void> {\n\t\tif (cookies.length === 0) return\n\t\tconst params: Record<string, unknown> = {\n\t\t\tcookies: cookies.map(cookieToProtocol),\n\t\t}\n\t\tif (this.#context !== undefined) params['browserContextId'] = this.#context\n\t\tawait this.#client.send('Storage.setCookies', params)\n\t}\n\n\tasync clear(filter?: BrowserCookieFilter): Promise<void> {\n\t\tconst params: Record<string, unknown> = {}\n\t\tif (this.#context !== undefined) params['browserContextId'] = this.#context\n\t\tif (filter === undefined) {\n\t\t\tawait this.#client.send('Storage.clearCookies', params)\n\t\t\treturn\n\t\t}\n\n\t\tconst retained = (await this.cookies()).filter((cookie) => {\n\t\t\tif (filter.name !== undefined && cookie.name !== filter.name) return true\n\t\t\tif (filter.domain !== undefined && cookie.domain !== filter.domain) return true\n\t\t\tif (filter.path !== undefined && cookie.path !== filter.path) return true\n\t\t\treturn false\n\t\t})\n\t\tawait this.#client.send('Storage.clearCookies', params)\n\t\tif (retained.length === 0) return\n\t\tconst cookies = retained.map((cookie) =>\n\t\t\tcookieToProtocol({\n\t\t\t\tname: cookie.name,\n\t\t\t\tvalue: cookie.value,\n\t\t\t\tdomain: cookie.domain,\n\t\t\t\tpath: cookie.path,\n\t\t\t\texpires: cookie.expires,\n\t\t\t\thttp: cookie.http,\n\t\t\t\tsecure: cookie.secure,\n\t\t\t\t...(cookie.site !== undefined ? { site: cookie.site } : {}),\n\t\t\t\t...(cookie.partition !== undefined ? { partition: cookie.partition } : {}),\n\t\t\t}),\n\t\t)\n\t\tconst restore: Record<string, unknown> = { cookies }\n\t\tif (this.#context !== undefined) restore['browserContextId'] = this.#context\n\t\tconst result = await this.#client.send('Storage.setCookies', restore)\n\t\tif (result !== undefined && !isRecord(result)) {\n\t\t\tthrow new BrowserError('Browser cookie restore returned a malformed result')\n\t\t}\n\t}\n}\n","import type {\n\tBrowserEmulationManagerInterface,\n\tBrowserEmulationOptions,\n\tBrowserPageInterface,\n\tBrowserPagesFunction,\n} from './types.js'\nimport { mediaToFeatures, validateBrowserEmulationOptions } from './helpers.js'\n\n/**\n * Applies rendering, identity, location, and network emulation for context pages.\n *\n * @example\n * ```ts\n * import { BrowserEmulationManager } from '@orkestrel/browser'\n *\n * const emulation = new BrowserEmulationManager(() => context.pages())\n * await emulation.apply({ locale: 'en-US', media: { scheme: 'dark' } })\n * await emulation.clear()\n * ```\n */\nexport class BrowserEmulationManager implements BrowserEmulationManagerInterface {\n\treadonly #pages: BrowserPagesFunction\n\t#options: BrowserEmulationOptions | undefined\n\n\tconstructor(pages: BrowserPagesFunction, options?: BrowserEmulationOptions) {\n\t\tif (options !== undefined) validateBrowserEmulationOptions(options)\n\t\tthis.#pages = pages\n\t\tthis.#options = options\n\t}\n\n\tasync apply(options: BrowserEmulationOptions): Promise<void> {\n\t\tvalidateBrowserEmulationOptions(options)\n\t\tconst previous = this.#options\n\t\tconst changed: BrowserPageInterface[] = []\n\t\ttry {\n\t\t\tfor (const page of this.#pages()) {\n\t\t\t\tchanged.push(page)\n\t\t\t\tif (previous !== undefined) await this.#clearPage(page, previous)\n\t\t\t\tawait this.#configurePage(page, options)\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tfor (const page of changed.reverse()) {\n\t\t\t\tawait this.#clearPage(page, options).catch(() => undefined)\n\t\t\t\tif (previous !== undefined) {\n\t\t\t\t\tawait this.#configurePage(page, previous).catch(() => undefined)\n\t\t\t\t}\n\t\t\t}\n\t\t\tthrow error\n\t\t}\n\t\tthis.#options = options\n\t}\n\n\tasync clear(): Promise<void> {\n\t\tconst previous = this.#options\n\t\tif (previous === undefined) return\n\t\tconst changed: BrowserPageInterface[] = []\n\t\ttry {\n\t\t\tfor (const page of this.#pages()) {\n\t\t\t\tchanged.push(page)\n\t\t\t\tawait this.#clearPage(page, previous)\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tfor (const page of changed.reverse()) {\n\t\t\t\tawait this.#clearPage(page, previous).catch(() => undefined)\n\t\t\t\tawait this.#configurePage(page, previous).catch(() => undefined)\n\t\t\t}\n\t\t\tthrow error\n\t\t}\n\t\tthis.#options = undefined\n\t}\n\n\tasync attach(page: BrowserPageInterface): Promise<void> {\n\t\tconst options = this.#options\n\t\tif (options === undefined) return\n\t\ttry {\n\t\t\tawait this.#configurePage(page, options)\n\t\t} catch (error) {\n\t\t\tawait this.#clearPage(page, options).catch(() => undefined)\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync #configurePage(\n\t\tpage: BrowserPageInterface,\n\t\toptions: BrowserEmulationOptions,\n\t): Promise<void> {\n\t\tif (options.viewport !== undefined) {\n\t\t\tawait page.send('Emulation.setDeviceMetricsOverride', {\n\t\t\t\twidth: options.viewport.width,\n\t\t\t\theight: options.viewport.height,\n\t\t\t\tdeviceScaleFactor: options.viewport.scale ?? 1,\n\t\t\t\tmobile: options.viewport.mobile ?? false,\n\t\t\t\tscreenOrientation:\n\t\t\t\t\toptions.viewport.landscape === undefined\n\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\ttype: options.viewport.landscape ? 'landscapePrimary' : 'portraitPrimary',\n\t\t\t\t\t\t\t\tangle: options.viewport.landscape ? 90 : 0,\n\t\t\t\t\t\t\t},\n\t\t\t})\n\t\t\tawait page.send('Emulation.setTouchEmulationEnabled', {\n\t\t\t\tenabled: options.viewport.touch ?? false,\n\t\t\t})\n\t\t}\n\t\tif (options.user !== undefined) {\n\t\t\tawait page.send('Emulation.setUserAgentOverride', {\n\t\t\t\tuserAgent: options.user.value,\n\t\t\t\tacceptLanguage: options.user.language,\n\t\t\t\tplatform: options.user.platform,\n\t\t\t})\n\t\t}\n\t\tif (options.locale !== undefined) {\n\t\t\tawait page.send('Emulation.setLocaleOverride', { locale: options.locale })\n\t\t}\n\t\tif (options.timezone !== undefined) {\n\t\t\tawait page.send('Emulation.setTimezoneOverride', { timezoneId: options.timezone })\n\t\t}\n\t\tif (options.geolocation !== undefined) {\n\t\t\tawait page.send('Emulation.setGeolocationOverride', {\n\t\t\t\tlatitude: options.geolocation.latitude,\n\t\t\t\tlongitude: options.geolocation.longitude,\n\t\t\t\taccuracy: options.geolocation.accuracy,\n\t\t\t})\n\t\t}\n\t\tif (options.media !== undefined) {\n\t\t\tawait page.send('Emulation.setEmulatedMedia', {\n\t\t\t\tmedia: options.media.output ?? '',\n\t\t\t\tfeatures: mediaToFeatures(options.media),\n\t\t\t})\n\t\t}\n\t\tif (options.offline !== undefined) {\n\t\t\tawait page.network.offline(options.offline)\n\t\t}\n\t\tif (options.headers !== undefined) {\n\t\t\tawait page.network.headers(options.headers)\n\t\t}\n\t\tif (options.credentials !== undefined) {\n\t\t\tawait page.network.credentials(options.credentials)\n\t\t}\n\t}\n\n\tasync #clearPage(page: BrowserPageInterface, options: BrowserEmulationOptions): Promise<void> {\n\t\tif (options.viewport !== undefined) {\n\t\t\tawait page.send('Emulation.clearDeviceMetricsOverride')\n\t\t\tawait page.send('Emulation.setTouchEmulationEnabled', { enabled: false })\n\t\t}\n\t\tif (options.user !== undefined) {\n\t\t\tawait page.send('Emulation.setUserAgentOverride', { userAgent: '' })\n\t\t}\n\t\tif (options.locale !== undefined) {\n\t\t\tawait page.send('Emulation.setLocaleOverride', { locale: '' })\n\t\t}\n\t\tif (options.timezone !== undefined) {\n\t\t\tawait page.send('Emulation.setTimezoneOverride', { timezoneId: '' })\n\t\t}\n\t\tif (options.geolocation !== undefined) {\n\t\t\tawait page.send('Emulation.clearGeolocationOverride')\n\t\t}\n\t\tif (options.media !== undefined) {\n\t\t\tawait page.send('Emulation.setEmulatedMedia', { media: '', features: [] })\n\t\t}\n\t\tif (options.offline !== undefined) {\n\t\t\tawait page.network.offline(false)\n\t\t}\n\t\tif (options.headers !== undefined) {\n\t\t\tawait page.network.headers({})\n\t\t}\n\t\tif (options.credentials !== undefined) await page.network.credentials(undefined)\n\t}\n}\n","import type {\n\tBrowserCodegenAction,\n\tBrowserCodegenEventMap,\n\tBrowserCodegenInterface,\n\tBrowserCodegenOptions,\n\tBrowserCodegenScriptOptions,\n\tCDPClientInterface,\n} from './types.js'\nimport type { EmitterInterface } from '@orkestrel/emitter'\nimport { BROWSER_CODEGEN_BINDING_NAME, BROWSER_CODEGEN_SOURCE } from './constants.js'\nimport { BrowserTransition } from './BrowserTransition.js'\nimport { compileCodegenScript } from './compilers.js'\nimport { normalizeCodegenActions } from './helpers.js'\nimport { parseCodegenActionPayload, parseCodegenNavigateAction } from './parsers.js'\nimport { Emitter } from '@orkestrel/emitter'\n\n// === BrowserCodegen\n\n/**\n * Records page navigation and form interactions and compiles replayable scripts.\n *\n * @example\n * ```ts\n * import { BrowserCodegen } from '@orkestrel/browser'\n *\n * const codegen = new BrowserCodegen(client, 'session-1')\n * await codegen.start()\n * const actions = await codegen.stop()\n * const script = codegen.script({ language: 'typescript' })\n * ```\n */\nexport class BrowserCodegen implements BrowserCodegenInterface {\n\treadonly #client: CDPClientInterface\n\treadonly #session: string\n\t#actions: BrowserCodegenAction[] = []\n\t#started = false\n\t#destroyed = false\n\treadonly #starting: BrowserTransition = new BrowserTransition()\n\treadonly #stopping: BrowserTransition<readonly BrowserCodegenAction[]> = new BrowserTransition()\n\t#shutdown: Promise<void> | undefined\n\treadonly #emitter: Emitter<BrowserCodegenEventMap>\n\treadonly #bindingCalledHandler = this.#handleBindingCalled.bind(this)\n\treadonly #frameNavigatedHandler = this.#handleFrameNavigated.bind(this)\n\n\tconstructor(client: CDPClientInterface, session: string, options?: BrowserCodegenOptions) {\n\t\tthis.#client = client\n\t\tthis.#session = session\n\t\tthis.#emitter = new Emitter({\n\t\t\t...(options?.on !== undefined ? { on: options.on } : {}),\n\t\t\t...(options?.error !== undefined ? { error: options.error } : {}),\n\t\t})\n\t}\n\n\t// === Property accessors\n\n\tget emitter(): EmitterInterface<BrowserCodegenEventMap> {\n\t\treturn this.#emitter\n\t}\n\n\tget started(): boolean {\n\t\treturn this.#started\n\t}\n\n\t// === Public API\n\n\tasync start(): Promise<void> {\n\t\tif (this.#destroyed) return\n\t\tconst stopping = this.#stopping.pending\n\t\tif (stopping !== undefined) await stopping\n\t\tif (this.#destroyed) return\n\t\tif (this.#started) return\n\t\tconst active = this.#starting.pending\n\t\tif (active !== undefined) {\n\t\t\tawait active\n\t\t\treturn\n\t\t}\n\n\t\tawait this.#starting.execute(() => this.#start())\n\t}\n\n\tasync stop(): Promise<readonly BrowserCodegenAction[]> {\n\t\tawait this.#starting.pending?.catch(() => undefined)\n\t\tif (!this.#started) return this.actions()\n\t\tconst active = this.#stopping.pending\n\t\tif (active !== undefined) return await active\n\n\t\treturn await this.#stopping.execute(() => this.#stop())\n\t}\n\n\tactions(): readonly BrowserCodegenAction[] {\n\t\treturn normalizeCodegenActions(this.#actions)\n\t}\n\n\tscript(options?: BrowserCodegenScriptOptions): string {\n\t\treturn compileCodegenScript(this.actions(), options)\n\t}\n\n\tclear(): void {\n\t\tthis.#actions = []\n\t\tthis.#emitter.emit('clear')\n\t}\n\n\tdestroy(): Promise<void> {\n\t\tconst active = this.#shutdown\n\t\tif (active !== undefined) return active\n\t\tif (this.#destroyed) return Promise.resolve()\n\n\t\tthis.#destroyed = true\n\t\tconst shutdown = this.#destroy()\n\t\tthis.#shutdown = shutdown\n\t\treturn shutdown\n\t}\n\n\t// === Private helpers\n\n\tasync #start(): Promise<void> {\n\t\tthis.#client.subscribe('Runtime.bindingCalled', this.#bindingCalledHandler, this.#session)\n\t\tthis.#client.subscribe('Page.frameNavigated', this.#frameNavigatedHandler, this.#session)\n\n\t\ttry {\n\t\t\tawait this.#client.send('Runtime.enable', undefined, { session: this.#session })\n\t\t\tawait this.#client.send(\n\t\t\t\t'Runtime.addBinding',\n\t\t\t\t{ name: BROWSER_CODEGEN_BINDING_NAME },\n\t\t\t\t{ session: this.#session },\n\t\t\t)\n\t\t\tawait this.#client.send(\n\t\t\t\t'Page.addScriptToEvaluateOnNewDocument',\n\t\t\t\t{ source: BROWSER_CODEGEN_SOURCE },\n\t\t\t\t{ session: this.#session },\n\t\t\t)\n\t\t\tawait this.#client.send(\n\t\t\t\t'Runtime.evaluate',\n\t\t\t\t{ expression: BROWSER_CODEGEN_SOURCE, awaitPromise: true },\n\t\t\t\t{ session: this.#session },\n\t\t\t)\n\t\t\tif (this.#destroyed) {\n\t\t\t\tthis.#unsubscribe()\n\t\t\t\treturn\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthis.#unsubscribe()\n\t\t\tthrow error\n\t\t}\n\n\t\tthis.#started = true\n\t\tthis.#emitter.emit('start')\n\t}\n\n\tasync #stop(): Promise<readonly BrowserCodegenAction[]> {\n\t\tthis.#unsubscribe()\n\t\tthis.#started = false\n\n\t\tconst snapshot = this.actions()\n\t\tthis.#emitter.emit('stop', snapshot)\n\t\treturn snapshot\n\t}\n\n\tasync #destroy(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.stop()\n\t\t} catch {\n\t\t\t// Swallow teardown errors — the underlying session may already be gone\n\t\t}\n\n\t\tthis.#actions = []\n\t\tthis.#emitter.destroy()\n\t}\n\n\t#handleBindingCalled(params: Readonly<Record<string, unknown>>): void {\n\t\tif (params['name'] !== BROWSER_CODEGEN_BINDING_NAME) return\n\n\t\tconst action = parseCodegenActionPayload(params['payload'])\n\t\tif (action === undefined) return\n\n\t\tthis.#actions.push(action)\n\t\tthis.#emitter.emit('action', action)\n\t}\n\n\t#handleFrameNavigated(params: Readonly<Record<string, unknown>>): void {\n\t\tconst action = parseCodegenNavigateAction(params)\n\t\tif (action === undefined) return\n\n\t\tthis.#actions.push(action)\n\t\tthis.#emitter.emit('action', action)\n\t}\n\n\t#unsubscribe(): void {\n\t\tthis.#client.unsubscribe('Runtime.bindingCalled', this.#bindingCalledHandler, this.#session)\n\t\tthis.#client.unsubscribe('Page.frameNavigated', this.#frameNavigatedHandler, this.#session)\n\t}\n}\n","import type { BrowserFrameInterface, BrowserMetric, BrowserPerformanceInterface } from './types.js'\nimport { readBrowserMetrics } from './helpers.js'\n\n/**\n * Reads Performance-domain metrics for one frame.\n *\n * @example\n * ```ts\n * import { BrowserPerformance } from '@orkestrel/browser'\n *\n * const performance = new BrowserPerformance(page)\n * const metrics = await performance.metrics() // readonly BrowserMetric[]\n * ```\n */\nexport class BrowserPerformance implements BrowserPerformanceInterface {\n\treadonly #frame: BrowserFrameInterface\n\n\tconstructor(frame: BrowserFrameInterface) {\n\t\tthis.#frame = frame\n\t}\n\n\tasync metrics(): Promise<readonly BrowserMetric[]> {\n\t\tawait this.#frame.send('Performance.enable')\n\t\ttry {\n\t\t\treturn readBrowserMetrics(await this.#frame.send('Performance.getMetrics'))\n\t\t} finally {\n\t\t\tawait this.#frame.send('Performance.disable').catch(() => undefined)\n\t\t}\n\t}\n}\n","import type { BrowserFrameInterface, BrowserProfile, BrowserProfilerInterface } from './types.js'\nimport { readBrowserProfile } from './helpers.js'\nimport { BrowserError } from './errors.js'\nimport { isInteger } from '@orkestrel/contract'\n\n/**\n * Records sampled JavaScript CPU profiles over one frame's Profiler domain.\n *\n * @example\n * ```ts\n * import { BrowserProfiler } from '@orkestrel/browser'\n *\n * const profiler = new BrowserProfiler(page)\n * await profiler.start(100)\n * const profile = await profiler.stop() // { start, end, nodes, samples, deltas }\n * ```\n */\nexport class BrowserProfiler implements BrowserProfilerInterface {\n\treadonly #frame: BrowserFrameInterface\n\t#active = false\n\n\tconstructor(frame: BrowserFrameInterface) {\n\t\tthis.#frame = frame\n\t}\n\n\tget active(): boolean {\n\t\treturn this.#active\n\t}\n\n\tasync start(interval?: number): Promise<void> {\n\t\tif (this.#active) throw new BrowserError('Browser CPU profiling is already active')\n\t\tif (interval !== undefined) {\n\t\t\tif (!isInteger(interval) || interval <= 0) {\n\t\t\t\tthrow new BrowserError(\n\t\t\t\t\t'Browser CPU sampling interval must be a positive integer',\n\t\t\t\t\tundefined,\n\t\t\t\t\t{\n\t\t\t\t\t\tinterval,\n\t\t\t\t\t},\n\t\t\t\t)\n\t\t\t}\n\t\t\tawait this.#frame.send('Profiler.setSamplingInterval', { interval })\n\t\t}\n\t\tawait this.#frame.send('Profiler.enable')\n\t\ttry {\n\t\t\tawait this.#frame.send('Profiler.start')\n\t\t\tthis.#active = true\n\t\t} catch (error) {\n\t\t\tawait this.#frame.send('Profiler.disable').catch(() => undefined)\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync stop(): Promise<BrowserProfile> {\n\t\tif (!this.#active) throw new BrowserError('Browser CPU profiling is not active')\n\t\tthis.#active = false\n\t\tlet result: unknown\n\t\ttry {\n\t\t\tresult = await this.#frame.send('Profiler.stop')\n\t\t} finally {\n\t\t\tawait this.#frame.send('Profiler.disable').catch(() => undefined)\n\t\t}\n\t\treturn readBrowserProfile(result)\n\t}\n\n\tasync destroy(): Promise<void> {\n\t\tif (!this.#active) return\n\t\tawait this.stop().catch(() => undefined)\n\t}\n}\n","import type {\n\tBrowserFrameInterface,\n\tBrowserTracingInterface,\n\tBrowserTracingOptions,\n\tBrowserTracingResult,\n\tBrowserWriterInterface,\n} from './types.js'\nimport { BROWSER_DEFAULT_TIMEOUT_MS } from './constants.js'\nimport { concatBytes, readBrowserStreamChunk } from './helpers.js'\nimport { BrowserError } from './errors.js'\nimport { isString } from '@orkestrel/contract'\n\n/**\n * Captures Chromium traces streamed through the IO domain.\n *\n * @example\n * ```ts\n * import { BrowserTracing } from '@orkestrel/browser'\n *\n * const tracing = new BrowserTracing(page)\n * await tracing.start({ screenshots: true })\n * const trace = await tracing.stop() // { bytes, path }\n * ```\n */\nexport class BrowserTracing implements BrowserTracingInterface {\n\treadonly #frame: BrowserFrameInterface\n\treadonly #writer: BrowserWriterInterface | undefined\n\t#active = false\n\t#options: BrowserTracingOptions | undefined\n\t#completion: PromiseWithResolvers<string> | undefined\n\treadonly #completeHandler = this.#handleComplete.bind(this)\n\n\tconstructor(frame: BrowserFrameInterface, writer?: BrowserWriterInterface) {\n\t\tthis.#frame = frame\n\t\tthis.#writer = writer\n\t}\n\n\tget active(): boolean {\n\t\treturn this.#active\n\t}\n\n\tasync start(options?: BrowserTracingOptions): Promise<void> {\n\t\tif (this.#active) throw new BrowserError('Browser tracing is already active')\n\t\tconst categories = [...(options?.categories ?? ['devtools.timeline', 'v8.execute'])]\n\t\tif (options?.screenshots === true) {\n\t\t\tcategories.push('disabled-by-default-devtools.screenshot')\n\t\t}\n\t\tif (options?.sampling === true) {\n\t\t\tcategories.push('disabled-by-default-v8.cpu_profiler')\n\t\t}\n\t\tthis.#options = options\n\t\tthis.#completion = Promise.withResolvers<string>()\n\t\ttry {\n\t\t\tawait this.#frame.subscribe('Tracing.tracingComplete', this.#completeHandler)\n\t\t\tawait this.#frame.send('Tracing.start', {\n\t\t\t\ttransferMode: 'ReturnAsStream',\n\t\t\t\ttraceConfig: {\n\t\t\t\t\tincludedCategories: categories,\n\t\t\t\t},\n\t\t\t})\n\t\t\tthis.#active = true\n\t\t} catch (error) {\n\t\t\tawait this.#frame\n\t\t\t\t.unsubscribe('Tracing.tracingComplete', this.#completeHandler)\n\t\t\t\t.catch(() => undefined)\n\t\t\tthis.#options = undefined\n\t\t\tthis.#completion = undefined\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync stop(): Promise<BrowserTracingResult> {\n\t\tif (!this.#active || this.#completion === undefined) {\n\t\t\tthrow new BrowserError('Browser tracing is not active')\n\t\t}\n\t\tconst completion = this.#completion\n\t\tconst options = this.#options\n\t\tthis.#active = false\n\t\tlet stream: string | undefined\n\t\tconst chunks: Uint8Array[] = []\n\t\ttry {\n\t\t\tawait this.#frame.send('Tracing.end')\n\t\t\tstream = await this.#wait(completion.promise)\n\t\t\twhile (true) {\n\t\t\t\tconst chunk = readBrowserStreamChunk(await this.#frame.send('IO.read', { handle: stream }))\n\t\t\t\tchunks.push(chunk.bytes)\n\t\t\t\tif (chunk.eof) break\n\t\t\t}\n\t\t} finally {\n\t\t\tif (stream !== undefined) {\n\t\t\t\tawait this.#frame.send('IO.close', { handle: stream }).catch(() => undefined)\n\t\t\t}\n\t\t\tawait this.#frame\n\t\t\t\t.unsubscribe('Tracing.tracingComplete', this.#completeHandler)\n\t\t\t\t.catch(() => undefined)\n\t\t\tthis.#options = undefined\n\t\t\tthis.#completion = undefined\n\t\t}\n\t\tconst bytes = concatBytes(chunks)\n\t\tif (options?.path !== undefined) {\n\t\t\tif (this.#writer === undefined) {\n\t\t\t\tthrow new BrowserError('Browser trace path requires a configured writer')\n\t\t\t}\n\t\t\tawait this.#writer.write(options.path, bytes)\n\t\t}\n\t\treturn { bytes, path: options?.path }\n\t}\n\n\tasync destroy(): Promise<void> {\n\t\tif (!this.#active) return\n\t\tawait this.stop().catch(() => undefined)\n\t}\n\n\tasync #wait(promise: Promise<string>): Promise<string> {\n\t\tconst deferred = Promise.withResolvers<string>()\n\t\tconst timer = setTimeout(() => {\n\t\t\tdeferred.reject(new BrowserError('Browser trace completion timed out'))\n\t\t}, BROWSER_DEFAULT_TIMEOUT_MS)\n\t\tvoid promise.then(deferred.resolve, deferred.reject)\n\t\ttry {\n\t\t\treturn await deferred.promise\n\t\t} finally {\n\t\t\tclearTimeout(timer)\n\t\t}\n\t}\n\n\t#handleComplete(params: Readonly<Record<string, unknown>>): void {\n\t\tconst completion = this.#completion\n\t\tif (completion === undefined) return\n\t\tif (isString(params['stream'])) completion.resolve(params['stream'])\n\t\telse completion.reject(new BrowserError('Browser trace did not return an IO stream'))\n\t}\n}\n","import type {\n\tBrowserCoverageInterface,\n\tBrowserDiagnosticsInterface,\n\tBrowserFrameInterface,\n\tBrowserPerformanceInterface,\n\tBrowserProfilerInterface,\n\tBrowserTracingInterface,\n\tBrowserWriterInterface,\n} from './types.js'\nimport { BrowserCoverage } from './BrowserCoverage.js'\nimport { BrowserPerformance } from './BrowserPerformance.js'\nimport { BrowserProfiler } from './BrowserProfiler.js'\nimport { BrowserTracing } from './BrowserTracing.js'\n\n/**\n * Groups the tracing, coverage, performance, and profiler classes beneath one page.\n *\n * @example\n * ```ts\n * import { BrowserDiagnostics } from '@orkestrel/browser'\n *\n * const diagnostics = new BrowserDiagnostics(page)\n * const metrics = await diagnostics.performance.metrics()\n * await diagnostics.destroy()\n * ```\n */\nexport class BrowserDiagnostics implements BrowserDiagnosticsInterface {\n\treadonly #tracing: BrowserTracing\n\treadonly #coverage: BrowserCoverage\n\treadonly #performance: BrowserPerformance\n\treadonly #profiler: BrowserProfiler\n\n\tconstructor(frame: BrowserFrameInterface, writer?: BrowserWriterInterface) {\n\t\tthis.#tracing = new BrowserTracing(frame, writer)\n\t\tthis.#coverage = new BrowserCoverage(frame)\n\t\tthis.#performance = new BrowserPerformance(frame)\n\t\tthis.#profiler = new BrowserProfiler(frame)\n\t}\n\n\tget tracing(): BrowserTracingInterface {\n\t\treturn this.#tracing\n\t}\n\n\tget coverage(): BrowserCoverageInterface {\n\t\treturn this.#coverage\n\t}\n\n\tget performance(): BrowserPerformanceInterface {\n\t\treturn this.#performance\n\t}\n\n\tget profiler(): BrowserProfilerInterface {\n\t\treturn this.#profiler\n\t}\n\n\tasync destroy(): Promise<void> {\n\t\tawait this.#tracing.destroy()\n\t\tawait this.#coverage.destroy()\n\t\tawait this.#profiler.destroy()\n\t}\n}\n","import type {\n\tBrowserDialogCategory,\n\tBrowserDialogInterface,\n\tBrowserFrameInterface,\n} from './types.js'\nimport { BrowserError } from './errors.js'\n\n/**\n * Represents one JavaScript dialog awaiting a user decision.\n */\nexport class BrowserDialog implements BrowserDialogInterface {\n\treadonly #frame: BrowserFrameInterface\n\treadonly #category: BrowserDialogCategory\n\treadonly #message: string\n\treadonly #default: string\n\t#handled = false\n\t#handling = false\n\n\tconstructor(\n\t\tframe: BrowserFrameInterface,\n\t\tcategory: BrowserDialogCategory,\n\t\tmessage: string,\n\t\tvalue: string,\n\t) {\n\t\tthis.#frame = frame\n\t\tthis.#category = category\n\t\tthis.#message = message\n\t\tthis.#default = value\n\t}\n\n\tget category(): BrowserDialogCategory {\n\t\treturn this.#category\n\t}\n\n\tget message(): string {\n\t\treturn this.#message\n\t}\n\n\tget default(): string {\n\t\treturn this.#default\n\t}\n\n\tasync accept(value?: string): Promise<void> {\n\t\tthis.#assert()\n\t\tthis.#handling = true\n\t\ttry {\n\t\t\tawait this.#frame.send('Page.handleJavaScriptDialog', {\n\t\t\t\taccept: true,\n\t\t\t\tpromptText: value,\n\t\t\t})\n\t\t\tthis.#handled = true\n\t\t} finally {\n\t\t\tthis.#handling = false\n\t\t}\n\t}\n\n\tasync dismiss(): Promise<void> {\n\t\tthis.#assert()\n\t\tthis.#handling = true\n\t\ttry {\n\t\t\tawait this.#frame.send('Page.handleJavaScriptDialog', { accept: false })\n\t\t\tthis.#handled = true\n\t\t} finally {\n\t\t\tthis.#handling = false\n\t\t}\n\t}\n\n\t#assert(): void {\n\t\tif (this.#handled || this.#handling) {\n\t\t\tthrow new BrowserError('Browser dialog is already handled')\n\t\t}\n\t}\n}\n","import type {\n\tBrowserDownloadEventMap,\n\tBrowserDownloadInterface,\n\tBrowserDownloadProgress,\n\tBrowserDownloadStatus,\n\tCDPClientInterface,\n} from './types.js'\nimport type { EmitterInterface } from '@orkestrel/emitter'\nimport { Emitter } from '@orkestrel/emitter'\n\n/**\n * Represents one Chromium download and its progress lifecycle.\n */\nexport class BrowserDownload implements BrowserDownloadInterface {\n\treadonly #client: CDPClientInterface\n\treadonly #context: string | undefined\n\treadonly #emitter: Emitter<BrowserDownloadEventMap>\n\treadonly #id: string\n\treadonly #url: string\n\treadonly #name: string\n\t#status: BrowserDownloadStatus = 'pending'\n\t#received = 0\n\t#total = 0\n\t#path: string | undefined\n\n\tconstructor(client: CDPClientInterface, id: string, url: string, name: string, context?: string) {\n\t\tthis.#client = client\n\t\tthis.#context = context\n\t\tthis.#id = id\n\t\tthis.#url = url\n\t\tthis.#name = name\n\t\tthis.#emitter = new Emitter()\n\t}\n\n\tget emitter(): EmitterInterface<BrowserDownloadEventMap> {\n\t\treturn this.#emitter\n\t}\n\n\tget id(): string {\n\t\treturn this.#id\n\t}\n\n\tget url(): string {\n\t\treturn this.#url\n\t}\n\n\tget name(): string {\n\t\treturn this.#name\n\t}\n\n\tget status(): BrowserDownloadStatus {\n\t\treturn this.#status\n\t}\n\n\tget received(): number {\n\t\treturn this.#received\n\t}\n\n\tget total(): number {\n\t\treturn this.#total\n\t}\n\n\tget path(): string | undefined {\n\t\treturn this.#path\n\t}\n\n\tasync cancel(): Promise<void> {\n\t\tif (this.#status !== 'pending') return\n\t\tconst params: Record<string, unknown> = { guid: this.#id }\n\t\tif (this.#context !== undefined) params['browserContextId'] = this.#context\n\t\tawait this.#client.send('Browser.cancelDownload', params)\n\t}\n\n\tupdate(progress: BrowserDownloadProgress): void {\n\t\tif (this.#status !== 'pending') return\n\t\tthis.#received = progress.received\n\t\tthis.#total = progress.total\n\t\tthis.#path = progress.path\n\t\tthis.#emitter.emit('progress', this.#received, this.#total)\n\t\tif (progress.status === 'complete') {\n\t\t\tthis.#status = 'complete'\n\t\t\tthis.#emitter.emit('complete', this.#path)\n\t\t\tthis.#emitter.destroy()\n\t\t} else if (progress.status === 'cancelled') {\n\t\t\tthis.#status = 'cancelled'\n\t\t\tthis.#emitter.emit('cancel')\n\t\t\tthis.#emitter.destroy()\n\t\t}\n\t}\n}\n","import type { BrowserHandleInterface, CDPClientInterface } from './types.js'\nimport { BrowserError } from './errors.js'\nimport { readEvaluationResult } from './helpers.js'\nimport { isRecord, isString } from '@orkestrel/contract'\n\n/**\n * Represents one retained remote object in a frame execution context.\n */\nexport class BrowserHandle implements BrowserHandleInterface {\n\treadonly #client: CDPClientInterface\n\treadonly #session: string\n\treadonly #id: string\n\t#disposed = false\n\n\tconstructor(client: CDPClientInterface, session: string, id: string) {\n\t\tthis.#client = client\n\t\tthis.#session = session\n\t\tthis.#id = id\n\t}\n\n\tget id(): string {\n\t\treturn this.#id\n\t}\n\n\tasync value(): Promise<unknown> {\n\t\treturn await this.call('function() { return this }')\n\t}\n\n\tasync call(declaration: string, args?: readonly unknown[]): Promise<unknown> {\n\t\tthis.#assert()\n\t\tconst result = await this.#client.send(\n\t\t\t'Runtime.callFunctionOn',\n\t\t\t{\n\t\t\t\tobjectId: this.#id,\n\t\t\t\tfunctionDeclaration: declaration,\n\t\t\t\targuments: args?.map((value) => ({ value })),\n\t\t\t\tawaitPromise: true,\n\t\t\t\treturnByValue: true,\n\t\t\t},\n\t\t\t{ session: this.#session },\n\t\t)\n\t\treturn readEvaluationResult(result)\n\t}\n\n\tasync property(name: string): Promise<BrowserHandleInterface | undefined> {\n\t\tthis.#assert()\n\t\tconst result = await this.#client.send(\n\t\t\t'Runtime.callFunctionOn',\n\t\t\t{\n\t\t\t\tobjectId: this.#id,\n\t\t\t\tfunctionDeclaration: 'function(name) { return this[name] }',\n\t\t\t\targuments: [{ value: name }],\n\t\t\t\tawaitPromise: true,\n\t\t\t\treturnByValue: false,\n\t\t\t},\n\t\t\t{ session: this.#session },\n\t\t)\n\t\tif (!isRecord(result) || !isRecord(result['result'])) return undefined\n\t\tconst id = result['result']['objectId']\n\t\treturn isString(id) ? new BrowserHandle(this.#client, this.#session, id) : undefined\n\t}\n\n\tasync properties(): Promise<Readonly<Record<string, unknown>>> {\n\t\tconst value = await this.call(\n\t\t\t'function() { const values = {}; for (const key of Object.keys(this)) values[key] = this[key]; return values }',\n\t\t)\n\t\tif (!isRecord(value)) {\n\t\t\tthrow new BrowserError('Browser handle properties did not resolve to an object')\n\t\t}\n\t\treturn value\n\t}\n\n\tasync dispose(): Promise<void> {\n\t\tif (this.#disposed) return\n\t\tthis.#disposed = true\n\t\tif (!this.#client.connected) return\n\t\ttry {\n\t\t\tawait this.#client.send(\n\t\t\t\t'Runtime.releaseObject',\n\t\t\t\t{ objectId: this.#id },\n\t\t\t\t{\n\t\t\t\t\tsession: this.#session,\n\t\t\t\t},\n\t\t\t)\n\t\t} catch {\n\t\t\t// The execution context may already be gone.\n\t\t}\n\t}\n\n\t#assert(): void {\n\t\tif (this.#disposed) throw new BrowserError('Browser handle is disposed')\n\t\tif (!this.#client.connected) throw new BrowserError('Browser handle is disconnected')\n\t}\n}\n","import type {\n\tBrowserFrameInterface,\n\tBrowserInputOptions,\n\tBrowserKeyboardInterface,\n} from './types.js'\nimport {\n\tcomputeBrowserModifiers,\n\textractBrowserChord,\n\tkeyToBrowserInput,\n\tvalidateBrowserInputOptions,\n} from './helpers.js'\n\n/**\n * Sends trusted keyboard input through Chromium's CDP Input domain.\n *\n * @example\n * ```ts\n * import { BrowserKeyboard } from '@orkestrel/browser'\n *\n * const keyboard = new BrowserKeyboard(page)\n * await keyboard.type('orkestrel', { delay: 10 })\n * await keyboard.press('Control+Enter')\n * ```\n */\nexport class BrowserKeyboard implements BrowserKeyboardInterface {\n\treadonly #frame: BrowserFrameInterface\n\treadonly #modifiers = new Set<string>()\n\n\tconstructor(frame: BrowserFrameInterface) {\n\t\tthis.#frame = frame\n\t}\n\n\tasync down(value: string): Promise<void> {\n\t\tconst key = keyToBrowserInput(value)\n\t\tconst modifier = ['Alt', 'Control', 'Meta', 'Shift'].includes(key.key)\n\t\tconst modifiers = computeBrowserModifiers([...this.#modifiers, ...(modifier ? [key.key] : [])])\n\t\tconst text = modifiers === 0 || modifiers === 8 ? key.text : undefined\n\t\tawait this.#frame.send('Input.dispatchKeyEvent', {\n\t\t\ttype: 'keyDown',\n\t\t\tkey: key.key,\n\t\t\tcode: key.code,\n\t\t\ttext,\n\t\t\tunmodifiedText: key.text,\n\t\t\twindowsVirtualKeyCode: key.number,\n\t\t\tnativeVirtualKeyCode: key.number,\n\t\t\tmodifiers,\n\t\t})\n\t\tif (modifier) this.#modifiers.add(key.key)\n\t}\n\n\tasync up(value: string): Promise<void> {\n\t\tconst key = keyToBrowserInput(value)\n\t\ttry {\n\t\t\tawait this.#frame.send('Input.dispatchKeyEvent', {\n\t\t\t\ttype: 'keyUp',\n\t\t\t\tkey: key.key,\n\t\t\t\tcode: key.code,\n\t\t\t\twindowsVirtualKeyCode: key.number,\n\t\t\t\tnativeVirtualKeyCode: key.number,\n\t\t\t\tmodifiers: computeBrowserModifiers([...this.#modifiers]),\n\t\t\t})\n\t\t} finally {\n\t\t\tthis.#modifiers.delete(key.key)\n\t\t}\n\t}\n\n\tasync press(value: string, options?: BrowserInputOptions): Promise<void> {\n\t\tvalidateBrowserInputOptions(options)\n\t\tconst chord = extractBrowserChord(value)\n\t\tfor (const modifier of chord.modifiers) await this.down(modifier)\n\t\ttry {\n\t\t\tawait this.down(chord.key)\n\t\t\tif (options?.delay !== undefined && options.delay > 0) {\n\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, options.delay))\n\t\t\t}\n\t\t\tawait this.up(chord.key)\n\t\t} finally {\n\t\t\tfor (const modifier of [...chord.modifiers].reverse()) await this.up(modifier)\n\t\t}\n\t}\n\n\tasync type(value: string, options?: BrowserInputOptions): Promise<void> {\n\t\tvalidateBrowserInputOptions(options)\n\t\tfor (const character of value) {\n\t\t\tawait this.down(character)\n\t\t\tawait this.up(character)\n\t\t\tif (options?.delay !== undefined && options.delay > 0) {\n\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, options.delay))\n\t\t\t}\n\t\t}\n\t}\n\n\tasync insert(value: string): Promise<void> {\n\t\tawait this.#frame.send('Input.insertText', { text: value })\n\t}\n}\n","import type {\n\tBrowserClickOptions,\n\tBrowserDragOptions,\n\tBrowserFrameInterface,\n\tBrowserMouseButton,\n\tBrowserMouseInterface,\n\tBrowserPoint,\n} from './types.js'\nimport {\n\tcomputeBrowserButtons,\n\tvalidateBrowserInputOptions,\n\tvalidateBrowserPoint,\n} from './helpers.js'\n\n/**\n * Sends trusted mouse input through Chromium's CDP Input domain.\n *\n * @example\n * ```ts\n * import { BrowserMouse } from '@orkestrel/browser'\n *\n * const mouse = new BrowserMouse(page)\n * await mouse.click({ x: 50, y: 20 }, { button: 'left', count: 2 })\n * await mouse.drag({ x: 10, y: 10 }, { x: 90, y: 90 }, { steps: 20 })\n * ```\n */\nexport class BrowserMouse implements BrowserMouseInterface {\n\treadonly #frame: BrowserFrameInterface\n\treadonly #buttons = new Set<BrowserMouseButton>()\n\t#point: BrowserPoint = { x: 0, y: 0 }\n\n\tconstructor(frame: BrowserFrameInterface) {\n\t\tthis.#frame = frame\n\t}\n\n\tasync move(point: BrowserPoint): Promise<void> {\n\t\tvalidateBrowserPoint(point)\n\t\tthis.#point = point\n\t\tawait this.#frame.send('Input.dispatchMouseEvent', {\n\t\t\ttype: 'mouseMoved',\n\t\t\tx: point.x,\n\t\t\ty: point.y,\n\t\t\tbutton: 'none',\n\t\t\tbuttons: computeBrowserButtons([...this.#buttons]),\n\t\t})\n\t}\n\n\tasync down(button: BrowserMouseButton = 'left', count = 1): Promise<void> {\n\t\tvalidateBrowserInputOptions({ count })\n\t\tconst buttons = new Set(this.#buttons)\n\t\tbuttons.add(button)\n\t\tawait this.#frame.send('Input.dispatchMouseEvent', {\n\t\t\ttype: 'mousePressed',\n\t\t\tx: this.#point.x,\n\t\t\ty: this.#point.y,\n\t\t\tbutton,\n\t\t\tbuttons: computeBrowserButtons([...buttons]),\n\t\t\tclickCount: count,\n\t\t})\n\t\tthis.#buttons.add(button)\n\t}\n\n\tasync up(button: BrowserMouseButton = 'left', count = 1): Promise<void> {\n\t\tvalidateBrowserInputOptions({ count })\n\t\tconst buttons = new Set(this.#buttons)\n\t\tbuttons.delete(button)\n\t\ttry {\n\t\t\tawait this.#frame.send('Input.dispatchMouseEvent', {\n\t\t\t\ttype: 'mouseReleased',\n\t\t\t\tx: this.#point.x,\n\t\t\t\ty: this.#point.y,\n\t\t\t\tbutton,\n\t\t\t\tbuttons: computeBrowserButtons([...buttons]),\n\t\t\t\tclickCount: count,\n\t\t\t})\n\t\t} finally {\n\t\t\tthis.#buttons.delete(button)\n\t\t}\n\t}\n\n\tasync click(point: BrowserPoint, options?: BrowserClickOptions): Promise<void> {\n\t\tvalidateBrowserInputOptions(options)\n\t\tconst button = options?.button ?? 'left'\n\t\tconst count = options?.count ?? 1\n\t\tawait this.move(point)\n\t\tawait this.down(button, count)\n\t\tif (options?.delay !== undefined && options.delay > 0) {\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, options.delay))\n\t\t}\n\t\tawait this.up(button, count)\n\t}\n\n\tasync drag(start: BrowserPoint, end: BrowserPoint, options?: BrowserDragOptions): Promise<void> {\n\t\tvalidateBrowserInputOptions(options)\n\t\tvalidateBrowserPoint(start)\n\t\tvalidateBrowserPoint(end)\n\t\tconst steps = options?.steps ?? 10\n\t\tawait this.move(start)\n\t\tawait this.down(options?.button ?? 'left', 1)\n\t\ttry {\n\t\t\tfor (let step = 1; step <= steps; step += 1) {\n\t\t\t\tawait this.move({\n\t\t\t\t\tx: start.x + ((end.x - start.x) * step) / steps,\n\t\t\t\t\ty: start.y + ((end.y - start.y) * step) / steps,\n\t\t\t\t})\n\t\t\t\tif (options?.delay !== undefined && options.delay > 0) {\n\t\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, options.delay))\n\t\t\t\t}\n\t\t\t}\n\t\t} finally {\n\t\t\tawait this.up(options?.button ?? 'left', 1)\n\t\t}\n\t}\n\n\tasync wheel(delta: BrowserPoint): Promise<void> {\n\t\tvalidateBrowserPoint(delta)\n\t\tawait this.#frame.send('Input.dispatchMouseEvent', {\n\t\t\ttype: 'mouseWheel',\n\t\t\tx: this.#point.x,\n\t\t\ty: this.#point.y,\n\t\t\tdeltaX: delta.x,\n\t\t\tdeltaY: delta.y,\n\t\t\tbuttons: computeBrowserButtons([...this.#buttons]),\n\t\t})\n\t}\n}\n","import type {\n\tBrowserActionOptions,\n\tBrowserActionabilityOptions,\n\tBrowserFrameInterface,\n\tBrowserHandleInterface,\n\tBrowserLocatorClickOptions,\n\tBrowserLocatorDragOptions,\n\tBrowserLocatorFilter,\n\tBrowserLocatorInterface,\n\tBrowserLocatorTypeOptions,\n\tBrowserOperationOptions,\n\tBrowserPointerOptions,\n\tBrowserPoint,\n\tBrowserQuery,\n\tBrowserScreenshotOptions,\n\tBrowserScreenshotResult,\n\tBrowserUploadOptions,\n\tBrowserWaitOptions,\n\tBrowserWaitState,\n} from './types.js'\nimport { BROWSER_DEFAULT_TIMEOUT_MS, BROWSER_WAIT_POLL_INTERVAL_MS } from './constants.js'\nimport {\n\tcompileActionabilityFunction,\n\tcompileAttachedLocatorWaitExpression,\n\tcompileDetachedLocatorWaitExpression,\n\tcompileHiddenLocatorWaitExpression,\n\tcompileLocatorExpression,\n\tcompileLocatorListExpression,\n\tcompileScreenshotCleanupExpression,\n\tcompileScreenshotPreparationExpression,\n\tcompileVisibleLocatorWaitExpression,\n} from './compilers.js'\nimport {\n\tbrowserScreenshotToParams,\n\tdecodeBase64,\n\treadBrowserQuad,\n\trequireBrowserString,\n\tvalidateBrowserInputOptions,\n} from './helpers.js'\nimport { BrowserError, BrowserSelectorError } from './errors.js'\nimport { isFiniteNumber, isInteger, isRecord, isString, parseArray } from '@orkestrel/contract'\n\n/**\n * Represents a reusable strict semantic locator over one frame.\n *\n * @example\n * ```ts\n * import { BrowserLocator } from '@orkestrel/browser'\n *\n * const save = new BrowserLocator(page, { selector: 'role', value: 'button', name: 'Save' })\n * await save.click({ count: 2 })\n * const label = await save.text()\n * ```\n */\nexport class BrowserLocator implements BrowserLocatorInterface {\n\treadonly #frame: BrowserFrameInterface\n\treadonly #query: BrowserQuery\n\n\tconstructor(frame: BrowserFrameInterface, query: BrowserQuery) {\n\t\tthis.#frame = frame\n\t\tthis.#query = query\n\t}\n\n\tget frame(): BrowserFrameInterface {\n\t\treturn this.#frame\n\t}\n\n\tget query(): BrowserQuery {\n\t\treturn this.#query\n\t}\n\n\tlocator(selector: string): BrowserLocatorInterface {\n\t\treturn new BrowserLocator(this.#frame, {\n\t\t\tselector: 'css',\n\t\t\tvalue: selector,\n\t\t\tparent: this.#query,\n\t\t})\n\t}\n\n\tfilter(options: BrowserLocatorFilter): BrowserLocatorInterface {\n\t\treturn new BrowserLocator(this.#frame, { ...this.#query, filter: options })\n\t}\n\n\tfirst(): BrowserLocatorInterface {\n\t\treturn this.item(0)\n\t}\n\n\tlast(): BrowserLocatorInterface {\n\t\treturn this.item(-1)\n\t}\n\n\titem(index: number): BrowserLocatorInterface {\n\t\tif (!isInteger(index)) throw new BrowserError('Browser locator index must be an integer')\n\t\treturn new BrowserLocator(this.#frame, { ...this.#query, index })\n\t}\n\n\tasync count(): Promise<number> {\n\t\tconst value = await this.#frame.evaluate(\n\t\t\t`(${compileLocatorListExpression(this.#query)}).length`,\n\t\t)\n\t\tif (!isInteger(value) || value < 0) {\n\t\t\tthrow new BrowserError('Browser locator count did not resolve to a non-negative integer')\n\t\t}\n\t\treturn value\n\t}\n\n\tasync all(): Promise<readonly BrowserLocatorInterface[]> {\n\t\tconst count = await this.count()\n\t\tconst locators: BrowserLocatorInterface[] = []\n\t\tfor (let index = 0; index < count; index += 1) {\n\t\t\tlocators.push(this.item(index))\n\t\t}\n\t\treturn locators\n\t}\n\n\tasync click(options?: BrowserLocatorClickOptions): Promise<void> {\n\t\tconst handle = await this.#resolve(options, 'visible')\n\t\ttry {\n\t\t\tconst point = await this.#point(handle, options, {\n\t\t\t\tvisible: true,\n\t\t\t\tstable: true,\n\t\t\t\tevents: true,\n\t\t\t\tenabled: true,\n\t\t\t})\n\t\t\tif (options?.trial === true) return\n\t\t\tawait this.#frame.mouse.click(point, options)\n\t\t} finally {\n\t\t\tawait handle.dispose()\n\t\t}\n\t}\n\n\tasync fill(value: string, options?: BrowserActionOptions): Promise<void> {\n\t\tconst handle = await this.#resolve(options, 'visible')\n\t\ttry {\n\t\t\tif (options?.force !== true) {\n\t\t\t\tawait handle.call(\n\t\t\t\t\tcompileActionabilityFunction({\n\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\tstable: true,\n\t\t\t\t\t\tevents: false,\n\t\t\t\t\t\tenabled: true,\n\t\t\t\t\t\teditable: true,\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t}\n\t\t\tif (options?.trial === true) return\n\t\t\tawait handle.call(`function() {\n\t\t\t\tthis.focus()\n\t\t\t\tif (this.isContentEditable) {\n\t\t\t\t\tconst selection = this.ownerDocument.getSelection()\n\t\t\t\t\tconst range = this.ownerDocument.createRange()\n\t\t\t\t\trange.selectNodeContents(this)\n\t\t\t\t\tselection.removeAllRanges()\n\t\t\t\t\tselection.addRange(range)\n\t\t\t\t} else {\n\t\t\t\t\tthis.select()\n\t\t\t\t}\n\t\t\t}`)\n\t\t\tawait this.#frame.keyboard.insert(value)\n\t\t} finally {\n\t\t\tawait handle.dispose()\n\t\t}\n\t}\n\n\tasync select(values: readonly string[], options?: BrowserActionOptions): Promise<void> {\n\t\tconst handle = await this.#resolve(options, 'visible')\n\t\ttry {\n\t\t\tif (options?.force !== true) {\n\t\t\t\tawait handle.call(\n\t\t\t\t\tcompileActionabilityFunction({\n\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\tstable: true,\n\t\t\t\t\t\tevents: false,\n\t\t\t\t\t\tenabled: true,\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t}\n\t\t\tif (options?.trial === true) return\n\t\t\tawait handle.call(\n\t\t\t\t`function(values) {\n\t\t\t\t\tif (!(this instanceof HTMLSelectElement)) throw new Error('Element is not a select')\n\t\t\t\t\tif (!this.multiple && values.length > 1) throw new Error('Single select cannot accept multiple values')\n\t\t\t\t\tconst available = new Set(Array.from(this.options, (option) => option.value))\n\t\t\t\t\tconst missing = values.filter((value) => !available.has(value))\n\t\t\t\t\tif (missing.length > 0) throw new Error('Select options not found: ' + missing.join(', '))\n\t\t\t\t\tfor (const option of this.options) option.selected = values.includes(option.value)\n\t\t\t\t\tthis.dispatchEvent(new Event('input', { bubbles: true }))\n\t\t\t\t\tthis.dispatchEvent(new Event('change', { bubbles: true }))\n\t\t\t\t}`,\n\t\t\t\t[[...values]],\n\t\t\t)\n\t\t} finally {\n\t\t\tawait handle.dispose()\n\t\t}\n\t}\n\n\tasync check(options?: BrowserLocatorClickOptions): Promise<void> {\n\t\tif ((await this.#boolean('checked')) === true) return\n\t\tawait this.click(options)\n\t\tif ((await this.#boolean('checked')) !== true) {\n\t\t\tthrow new BrowserError('Browser locator did not become checked')\n\t\t}\n\t}\n\n\tasync uncheck(options?: BrowserLocatorClickOptions): Promise<void> {\n\t\tif ((await this.#boolean('checked')) === false) return\n\t\tawait this.click(options)\n\t\tif ((await this.#boolean('checked')) !== false) {\n\t\t\tthrow new BrowserError('Browser locator did not become unchecked')\n\t\t}\n\t}\n\n\tasync hover(options?: BrowserPointerOptions): Promise<void> {\n\t\tconst handle = await this.#resolve(options, 'visible')\n\t\ttry {\n\t\t\tconst point = await this.#point(handle, options, {\n\t\t\t\tvisible: true,\n\t\t\t\tstable: true,\n\t\t\t\tevents: true,\n\t\t\t})\n\t\t\tif (options?.trial !== true) await this.#frame.mouse.move(point)\n\t\t} finally {\n\t\t\tawait handle.dispose()\n\t\t}\n\t}\n\n\tasync focus(options?: BrowserActionOptions): Promise<void> {\n\t\tconst handle = await this.#resolve(options, 'attached')\n\t\ttry {\n\t\t\tif (options?.trial !== true) await handle.call('function() { this.focus() }')\n\t\t} finally {\n\t\t\tawait handle.dispose()\n\t\t}\n\t}\n\n\tasync press(key: string, options?: BrowserLocatorTypeOptions): Promise<void> {\n\t\tawait this.focus(options)\n\t\tif (options?.trial !== true) await this.#frame.keyboard.press(key, options)\n\t}\n\n\tasync type(value: string, options?: BrowserLocatorTypeOptions): Promise<void> {\n\t\tawait this.focus(options)\n\t\tif (options?.trial !== true) await this.#frame.keyboard.type(value, options)\n\t}\n\n\tasync clear(options?: BrowserActionOptions): Promise<void> {\n\t\tconst handle = await this.#resolve(options, 'visible')\n\t\ttry {\n\t\t\tif (options?.trial === true) return\n\t\t\tawait handle.call(`function() {\n\t\t\t\tthis.focus()\n\t\t\t\tif (this.isContentEditable) {\n\t\t\t\t\tthis.textContent = ''\n\t\t\t\t} else if ('value' in this) {\n\t\t\t\t\tthis.value = ''\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error('Element is not editable')\n\t\t\t\t}\n\t\t\t\tthis.dispatchEvent(new InputEvent('input', { bubbles: true, inputType: 'deleteContentBackward' }))\n\t\t\t\tthis.dispatchEvent(new Event('change', { bubbles: true }))\n\t\t\t}`)\n\t\t} finally {\n\t\t\tawait handle.dispose()\n\t\t}\n\t}\n\n\tasync wait(options?: BrowserWaitOptions): Promise<void> {\n\t\tconst timeout = options?.timeout ?? BROWSER_DEFAULT_TIMEOUT_MS\n\t\tif (!isFiniteNumber(timeout) || timeout < 0) {\n\t\t\tthrow new BrowserError(\n\t\t\t\t'Browser wait timeout must be a non-negative finite number',\n\t\t\t\tundefined,\n\t\t\t\t{\n\t\t\t\t\ttimeout,\n\t\t\t\t},\n\t\t\t)\n\t\t}\n\t\tconst state = options?.state ?? 'attached'\n\t\tconst expression = this.#waitExpression(state, options?.strict ?? true, timeout)\n\t\tlet found: unknown\n\t\ttry {\n\t\t\tfound = await this.#frame.evaluate(expression, timeout + BROWSER_WAIT_POLL_INTERVAL_MS)\n\t\t} catch (error) {\n\t\t\tthrow new BrowserSelectorError('Browser locator wait failed', {\n\t\t\t\tquery: this.#query,\n\t\t\t\tstate,\n\t\t\t\ttimeout,\n\t\t\t\tframe: this.#frame.id,\n\t\t\t\terror,\n\t\t\t})\n\t\t}\n\t\tif (found === true) return\n\t\tthrow new BrowserSelectorError('Timeout waiting for browser locator', {\n\t\t\tquery: this.#query,\n\t\t\tstate,\n\t\t\ttimeout,\n\t\t\tframe: this.#frame.id,\n\t\t})\n\t}\n\n\tasync text(): Promise<string> {\n\t\tconst value = await this.#frame.evaluate(\n\t\t\t`(${compileLocatorExpression(this.#query)})?.innerText`,\n\t\t)\n\t\treturn requireBrowserString(value, 'Browser locator text')\n\t}\n\n\tasync texts(): Promise<readonly string[]> {\n\t\tconst value = await this.#frame.evaluate(\n\t\t\t`(${compileLocatorListExpression(this.#query)}).map((element) => element.innerText)`,\n\t\t)\n\t\tconst texts = parseArray(value, isString)\n\t\tif (texts === undefined) {\n\t\t\tthrow new BrowserError('Browser locator text list is malformed')\n\t\t}\n\t\treturn texts\n\t}\n\n\tasync html(): Promise<string> {\n\t\treturn await this.#string('outerHTML', 'Browser locator HTML')\n\t}\n\n\tasync value(): Promise<string> {\n\t\tconst value = await this.#frame.evaluate(\n\t\t\t`(() => { const element = ${compileLocatorExpression(this.#query)}; return element && 'value' in element ? element.value : element?.textContent })()`,\n\t\t)\n\t\treturn requireBrowserString(value, 'Browser locator value')\n\t}\n\n\tasync attribute(name: string): Promise<string | undefined> {\n\t\tconst value = await this.#frame.evaluate(\n\t\t\t`(${compileLocatorExpression(this.#query)})?.getAttribute(${JSON.stringify(name)})`,\n\t\t)\n\t\treturn isString(value) ? value : undefined\n\t}\n\n\tasync visible(): Promise<boolean> {\n\t\treturn await this.#boolean('visible')\n\t}\n\n\tasync enabled(): Promise<boolean> {\n\t\treturn await this.#boolean('enabled')\n\t}\n\n\tasync editable(): Promise<boolean> {\n\t\treturn await this.#boolean('editable')\n\t}\n\n\tasync screenshot(options?: BrowserScreenshotOptions): Promise<BrowserScreenshotResult> {\n\t\tif (options?.full === true || options?.clip !== undefined) {\n\t\t\tthrow new BrowserError('Browser locator screenshot cannot use full-page or custom clip')\n\t\t}\n\t\tconst handle = await this.#resolve(undefined, 'visible')\n\t\tlet token: string | undefined\n\t\ttry {\n\t\t\tawait handle.call(\n\t\t\t\tcompileActionabilityFunction({\n\t\t\t\t\tvisible: true,\n\t\t\t\t\tstable: true,\n\t\t\t\t\tevents: false,\n\t\t\t\t\tenabled: false,\n\t\t\t\t}),\n\t\t\t)\n\t\t\tconst quad = await this.#quad(handle)\n\t\t\tconst xs = [quad.points[0], quad.points[2], quad.points[4], quad.points[6]]\n\t\t\tconst ys = [quad.points[1], quad.points[3], quad.points[5], quad.points[7]]\n\t\t\tconst x = Math.min(...xs)\n\t\t\tconst y = Math.min(...ys)\n\t\t\tconst width = Math.max(...xs) - x\n\t\t\tconst height = Math.max(...ys) - y\n\t\t\tconst params: Record<string, unknown> = {\n\t\t\t\t...browserScreenshotToParams(options),\n\t\t\t\tclip: { x, y, width, height, scale: 1 },\n\t\t\t\tcaptureBeyondViewport: true,\n\t\t\t}\n\t\t\tif (options?.scale === 'device') {\n\t\t\t\tconst ratio = await this.#frame.evaluate('devicePixelRatio')\n\t\t\t\tif (!isFiniteNumber(ratio) || ratio <= 0) {\n\t\t\t\t\tthrow new BrowserError('Browser screenshot device scale is malformed')\n\t\t\t\t}\n\t\t\t\tparams['clip'] = { x, y, width, height, scale: ratio }\n\t\t\t}\n\t\t\tconst preparation = compileScreenshotPreparationExpression(options)\n\t\t\tif (preparation !== undefined) {\n\t\t\t\tconst value = await this.#frame.evaluate(preparation)\n\t\t\t\tif (!isString(value)) throw new BrowserError('Browser screenshot preparation failed')\n\t\t\t\ttoken = value\n\t\t\t}\n\t\t\tif (options?.transparent === true) {\n\t\t\t\tawait this.#frame.send('Emulation.setDefaultBackgroundColorOverride', {\n\t\t\t\t\tcolor: { r: 0, g: 0, b: 0, a: 0 },\n\t\t\t\t})\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst result = await this.#frame.send('Page.captureScreenshot', params)\n\t\t\t\tif (!isRecord(result) || !isString(result['data'])) {\n\t\t\t\t\tthrow new BrowserError('Locator screenshot failed: no data returned')\n\t\t\t\t}\n\t\t\t\tconst bytes = decodeBase64(result['data'])\n\t\t\t\tif (options?.path !== undefined) await this.#frame.save(options.path, bytes)\n\t\t\t\treturn { bytes, path: options?.path }\n\t\t\t} finally {\n\t\t\t\tif (options?.transparent === true) {\n\t\t\t\t\tawait this.#frame\n\t\t\t\t\t\t.send('Emulation.setDefaultBackgroundColorOverride')\n\t\t\t\t\t\t.catch(() => undefined)\n\t\t\t\t}\n\t\t\t}\n\t\t} finally {\n\t\t\tif (token !== undefined) {\n\t\t\t\tawait this.#frame.evaluate(compileScreenshotCleanupExpression(token)).catch(() => undefined)\n\t\t\t}\n\t\t\tawait handle.dispose()\n\t\t}\n\t}\n\n\tasync upload(options: BrowserUploadOptions): Promise<void> {\n\t\tconst handle = await this.#resolve(options, 'attached')\n\t\ttry {\n\t\t\tif (options.trial === true) return\n\t\t\tawait this.#frame.send('DOM.setFileInputFiles', {\n\t\t\t\tobjectId: handle.id,\n\t\t\t\tfiles: [...options.files],\n\t\t\t})\n\t\t} finally {\n\t\t\tawait handle.dispose()\n\t\t}\n\t}\n\n\tasync drag(target: BrowserLocatorInterface, options?: BrowserLocatorDragOptions): Promise<void> {\n\t\tif (target.frame.id !== this.#frame.id) {\n\t\t\tthrow new BrowserError('Browser drag target must belong to the same frame')\n\t\t}\n\t\tconst sourceHandle = await this.#resolve(options, 'visible')\n\t\tlet targetHandle: BrowserHandleInterface | undefined\n\t\ttry {\n\t\t\tawait target.wait({\n\t\t\t\t...(options?.timeout !== undefined ? { timeout: options.timeout } : {}),\n\t\t\t\t...(options?.strict !== undefined ? { strict: options.strict } : {}),\n\t\t\t\tstate: 'visible',\n\t\t\t})\n\t\t\ttargetHandle = await target.frame.handle(compileLocatorExpression(target.query))\n\t\t\tconst source = await this.#point(sourceHandle, options, {\n\t\t\t\tvisible: true,\n\t\t\t\tstable: true,\n\t\t\t\tevents: true,\n\t\t\t})\n\t\t\tconst destination = await this.#point(targetHandle, undefined, {\n\t\t\t\tvisible: true,\n\t\t\t\tstable: true,\n\t\t\t\tevents: true,\n\t\t\t})\n\t\t\tif (options?.trial !== true) {\n\t\t\t\tawait this.#frame.mouse.drag(source, destination, options)\n\t\t\t}\n\t\t} finally {\n\t\t\tawait sourceHandle.dispose()\n\t\t\tawait targetHandle?.dispose()\n\t\t}\n\t}\n\n\tasync #resolve(\n\t\toptions: BrowserOperationOptions | undefined,\n\t\tstate: 'attached' | 'visible',\n\t): Promise<BrowserHandleInterface> {\n\t\tvalidateBrowserInputOptions(options)\n\t\tawait this.wait({\n\t\t\t...(options?.timeout !== undefined ? { timeout: options.timeout } : {}),\n\t\t\t...(options?.strict !== undefined ? { strict: options.strict } : {}),\n\t\t\tstate,\n\t\t})\n\t\treturn await this.#frame.handle(compileLocatorExpression(this.#query))\n\t}\n\n\tasync #point(\n\t\thandle: BrowserHandleInterface,\n\t\toptions: BrowserPointerOptions | undefined,\n\t\tactionability: BrowserActionabilityOptions,\n\t): Promise<BrowserPoint> {\n\t\tif (options?.force !== true) {\n\t\t\tawait handle.call(\n\t\t\t\tcompileActionabilityFunction({\n\t\t\t\t\t...actionability,\n\t\t\t\t\t...(options?.position !== undefined ? { position: options.position } : {}),\n\t\t\t\t}),\n\t\t\t)\n\t\t}\n\t\tconst quad = await this.#quad(handle)\n\t\tif (options?.position === undefined) return quad.center\n\t\tconst xs = [quad.points[0], quad.points[2], quad.points[4], quad.points[6]]\n\t\tconst ys = [quad.points[1], quad.points[3], quad.points[5], quad.points[7]]\n\t\treturn {\n\t\t\tx: Math.min(...xs) + options.position.x,\n\t\t\ty: Math.min(...ys) + options.position.y,\n\t\t}\n\t}\n\n\tasync #quad(handle: BrowserHandleInterface): Promise<ReturnType<typeof readBrowserQuad>> {\n\t\treturn readBrowserQuad(await this.#frame.send('DOM.getContentQuads', { objectId: handle.id }))\n\t}\n\n\tasync #string(property: string, field: string): Promise<string> {\n\t\tconst value = await this.#frame.evaluate(\n\t\t\t`(${compileLocatorExpression(this.#query)})?.[${JSON.stringify(property)}]`,\n\t\t)\n\t\treturn requireBrowserString(value, field)\n\t}\n\n\tasync #boolean(property: 'checked' | 'visible' | 'enabled' | 'editable'): Promise<boolean> {\n\t\tlet expression: string\n\t\tswitch (property) {\n\t\t\tcase 'checked':\n\t\t\t\texpression = `Boolean((${compileLocatorExpression(this.#query)})?.checked)`\n\t\t\t\tbreak\n\t\t\tcase 'visible':\n\t\t\t\texpression = `(() => { const element = ${compileLocatorExpression(this.#query)}; if (!element) return false; const style = getComputedStyle(element); const rect = element.getBoundingClientRect(); return style.display !== 'none' && style.visibility !== 'hidden' && style.visibility !== 'collapse' && rect.width > 0 && rect.height > 0 })()`\n\t\t\t\tbreak\n\t\t\tcase 'enabled':\n\t\t\t\texpression = `(() => { const element = ${compileLocatorExpression(this.#query)}; return Boolean(element && !element.matches(':disabled')) })()`\n\t\t\t\tbreak\n\t\t\tcase 'editable':\n\t\t\t\texpression = `(() => { const element = ${compileLocatorExpression(this.#query)}; return Boolean(element && !element.matches(':disabled,[readonly]') && (element.isContentEditable || 'value' in element)) })()`\n\t\t\t\tbreak\n\t\t}\n\t\treturn (await this.#frame.evaluate(expression)) === true\n\t}\n\n\t#waitExpression(state: BrowserWaitState, strict: boolean, timeout: number): string {\n\t\tswitch (state) {\n\t\t\tcase 'attached':\n\t\t\t\treturn compileAttachedLocatorWaitExpression(this.#query, strict, timeout)\n\t\t\tcase 'detached':\n\t\t\t\treturn compileDetachedLocatorWaitExpression(this.#query, strict, timeout)\n\t\t\tcase 'visible':\n\t\t\t\treturn compileVisibleLocatorWaitExpression(this.#query, strict, timeout)\n\t\t\tcase 'hidden':\n\t\t\t\treturn compileHiddenLocatorWaitExpression(this.#query, strict, timeout)\n\t\t}\n\t}\n}\n","import type {\n\tBrowserFrameInterface,\n\tBrowserLocatorInterface,\n\tBrowserRoleOptions,\n\tBrowserSelectorManagerInterface,\n\tBrowserTextOptions,\n} from './types.js'\nimport { BrowserLocator } from './BrowserLocator.js'\n\n/**\n * Creates semantic locators for one frame.\n *\n * @example\n * ```ts\n * import { BrowserSelectorManager } from '@orkestrel/browser'\n *\n * const selectors = new BrowserSelectorManager(page)\n * await selectors.role('button', { name: 'Save' }).click()\n * await selectors.testId('checkout').click()\n * ```\n */\nexport class BrowserSelectorManager implements BrowserSelectorManagerInterface {\n\treadonly #frame: BrowserFrameInterface\n\n\tconstructor(frame: BrowserFrameInterface) {\n\t\tthis.#frame = frame\n\t}\n\n\tcss(value: string): BrowserLocatorInterface {\n\t\treturn new BrowserLocator(this.#frame, { selector: 'css', value })\n\t}\n\n\trole(value: string, options?: BrowserRoleOptions): BrowserLocatorInterface {\n\t\treturn new BrowserLocator(this.#frame, {\n\t\t\tselector: 'role',\n\t\t\tvalue,\n\t\t\t...(options?.name !== undefined ? { name: options.name } : {}),\n\t\t\t...(options?.exact !== undefined ? { exact: options.exact } : {}),\n\t\t})\n\t}\n\n\ttext(value: string, options?: BrowserTextOptions): BrowserLocatorInterface {\n\t\treturn new BrowserLocator(this.#frame, {\n\t\t\tselector: 'text',\n\t\t\tvalue,\n\t\t\t...(options?.exact !== undefined ? { exact: options.exact } : {}),\n\t\t})\n\t}\n\n\tlabel(value: string, options?: BrowserTextOptions): BrowserLocatorInterface {\n\t\treturn new BrowserLocator(this.#frame, {\n\t\t\tselector: 'label',\n\t\t\tvalue,\n\t\t\t...(options?.exact !== undefined ? { exact: options.exact } : {}),\n\t\t})\n\t}\n\n\tplaceholder(value: string, options?: BrowserTextOptions): BrowserLocatorInterface {\n\t\treturn new BrowserLocator(this.#frame, {\n\t\t\tselector: 'placeholder',\n\t\t\tvalue,\n\t\t\t...(options?.exact !== undefined ? { exact: options.exact } : {}),\n\t\t})\n\t}\n\n\ttestId(value: string): BrowserLocatorInterface {\n\t\treturn new BrowserLocator(this.#frame, { selector: 'testId', value })\n\t}\n}\n","import type { BrowserFrameInterface, BrowserPoint, BrowserTouchInterface } from './types.js'\nimport { validateBrowserPoint } from './helpers.js'\n\n/**\n * Sends trusted touch input through Chromium's CDP Input domain.\n *\n * @example\n * ```ts\n * import { BrowserTouch } from '@orkestrel/browser'\n *\n * const touch = new BrowserTouch(page)\n * await touch.tap({ x: 120, y: 240 })\n * ```\n */\nexport class BrowserTouch implements BrowserTouchInterface {\n\treadonly #frame: BrowserFrameInterface\n\n\tconstructor(frame: BrowserFrameInterface) {\n\t\tthis.#frame = frame\n\t}\n\n\tasync tap(point: BrowserPoint): Promise<void> {\n\t\tvalidateBrowserPoint(point)\n\t\tconst touch = { x: point.x, y: point.y }\n\t\tawait this.#frame.send('Input.dispatchTouchEvent', {\n\t\t\ttype: 'touchStart',\n\t\t\ttouchPoints: [touch],\n\t\t})\n\t\ttry {\n\t\t\tawait this.#frame.send('Input.dispatchTouchEvent', {\n\t\t\t\ttype: 'touchEnd',\n\t\t\t\ttouchPoints: [],\n\t\t\t})\n\t\t} catch (error) {\n\t\t\tawait this.#frame\n\t\t\t\t.send('Input.dispatchTouchEvent', {\n\t\t\t\t\ttype: 'touchCancel',\n\t\t\t\t\ttouchPoints: [],\n\t\t\t\t})\n\t\t\t\t.catch(() => undefined)\n\t\t\tthrow error\n\t\t}\n\t}\n}\n","import type {\n\tBrowserActionOptions,\n\tBrowserContentResult,\n\tBrowserFrameInterface,\n\tBrowserHandleInterface,\n\tBrowserKeyboardInterface,\n\tBrowserMouseInterface,\n\tBrowserSelectorManagerInterface,\n\tBrowserSendOptions,\n\tBrowserSessionFunction,\n\tBrowserTouchInterface,\n\tBrowserWaitOptions,\n\tCDPHandler,\n\tCDPClientInterface,\n} from './types.js'\nimport { BrowserHandle } from './BrowserHandle.js'\nimport { BrowserKeyboard } from './BrowserKeyboard.js'\nimport { BrowserMouse } from './BrowserMouse.js'\nimport { BrowserSelectorManager } from './BrowserSelectorManager.js'\nimport { BrowserTouch } from './BrowserTouch.js'\nimport { BROWSER_FRAME_WORLD_NAME, BROWSER_RESULT_LIMIT } from './constants.js'\nimport { compileGuardedEvaluateExpression } from './compilers.js'\nimport { readEvaluationResult, requireBrowserString } from './helpers.js'\nimport { BrowserError } from './errors.js'\nimport { isInteger, isRecord, isString } from '@orkestrel/contract'\nimport { createHTML, renderText } from '@orkestrel/html'\n\n/**\n * Represents one attached document frame, evaluated through its own CDP execution world.\n *\n * @example\n * ```ts\n * import { BrowserFrame } from '@orkestrel/browser'\n *\n * const frame = new BrowserFrame(client, 'session-1', 'frame-1', 'https://example.com')\n * await frame.fill('[name=email]', 'ada@example.com')\n * const title = await frame.title()\n * ```\n */\nexport class BrowserFrame implements BrowserFrameInterface {\n\treadonly #client: CDPClientInterface\n\treadonly #session: string | BrowserSessionFunction\n\treadonly #id: string\n\treadonly #parent: string | undefined\n\treadonly #name: string | undefined\n\treadonly #isolated: boolean\n\treadonly #selectors: BrowserSelectorManager\n\treadonly #keyboard: BrowserKeyboard\n\treadonly #mouse: BrowserMouse\n\treadonly #touch: BrowserTouch\n\t#url: string\n\n\tconstructor(\n\t\tclient: CDPClientInterface,\n\t\tsession: string | BrowserSessionFunction,\n\t\tid: string,\n\t\turl: string,\n\t\tparent?: string,\n\t\tname?: string,\n\t\tisolated = true,\n\t) {\n\t\tthis.#client = client\n\t\tthis.#session = session\n\t\tthis.#id = id\n\t\tthis.#url = url\n\t\tthis.#parent = parent\n\t\tthis.#name = name\n\t\tthis.#isolated = isolated\n\t\tthis.#selectors = new BrowserSelectorManager(this)\n\t\tthis.#keyboard = new BrowserKeyboard(this)\n\t\tthis.#mouse = new BrowserMouse(this)\n\t\tthis.#touch = new BrowserTouch(this)\n\t}\n\n\tget id(): string {\n\t\treturn this.#id\n\t}\n\n\tget parent(): string | undefined {\n\t\treturn this.#parent\n\t}\n\n\tget name(): string | undefined {\n\t\treturn this.#name\n\t}\n\n\tget url(): string {\n\t\treturn this.#url\n\t}\n\n\tget selectors(): BrowserSelectorManagerInterface {\n\t\treturn this.#selectors\n\t}\n\n\tget keyboard(): BrowserKeyboardInterface {\n\t\treturn this.#keyboard\n\t}\n\n\tget mouse(): BrowserMouseInterface {\n\t\treturn this.#mouse\n\t}\n\n\tget touch(): BrowserTouchInterface {\n\t\treturn this.#touch\n\t}\n\n\tasync title(): Promise<string> {\n\t\tthis.assert()\n\t\tconst result = await this.#evaluate('document.title')\n\t\treturn requireBrowserString(result, 'Document title')\n\t}\n\n\tasync content(): Promise<BrowserContentResult> {\n\t\tthis.assert()\n\t\tconst [title, html, text, currentUrl] = await Promise.all([\n\t\t\tthis.#evaluate('document.title'),\n\t\t\tthis.#captureHTML(),\n\t\t\tthis.#evaluate(\n\t\t\t\tcompileGuardedEvaluateExpression(\n\t\t\t\t\t'document.body ? document.body.innerText : \"\"',\n\t\t\t\t\tBROWSER_RESULT_LIMIT,\n\t\t\t\t),\n\t\t\t),\n\t\t\tthis.#evaluate('location.href'),\n\t\t])\n\n\t\tconst url = requireBrowserString(currentUrl, 'Document URL')\n\t\tthis.#url = url\n\t\treturn {\n\t\t\turl,\n\t\t\ttitle: requireBrowserString(title, 'Document title'),\n\t\t\thtml: requireBrowserString(html, 'Document HTML'),\n\t\t\ttext: requireBrowserString(text, 'Document text'),\n\t\t}\n\t}\n\n\tasync article(): Promise<string> {\n\t\tthis.assert()\n\t\tconst html = requireBrowserString(await this.#captureHTML(), 'Document HTML')\n\t\treturn renderText(createHTML(html).distill().document)\n\t}\n\n\tasync click(selector: string, options?: BrowserActionOptions): Promise<void> {\n\t\tthis.assert()\n\t\tawait this.#selectors.css(selector).click(options)\n\t}\n\n\tasync fill(selector: string, value: string, options?: BrowserActionOptions): Promise<void> {\n\t\tthis.assert()\n\t\tawait this.#selectors.css(selector).fill(value, options)\n\t}\n\n\tasync select(\n\t\tselector: string,\n\t\tvalues: readonly string[],\n\t\toptions?: BrowserActionOptions,\n\t): Promise<void> {\n\t\tthis.assert()\n\t\tawait this.#selectors.css(selector).select(values, options)\n\t}\n\n\tasync evaluate(expression: string, timeout?: number): Promise<unknown> {\n\t\tthis.assert()\n\t\treturn await this.#evaluate(\n\t\t\tcompileGuardedEvaluateExpression(expression, BROWSER_RESULT_LIMIT),\n\t\t\ttimeout,\n\t\t)\n\t}\n\n\tasync handle(expression: string): Promise<BrowserHandleInterface> {\n\t\tthis.assert()\n\t\tconst session = await this.#sessionId()\n\t\tconst params: Record<string, unknown> = {\n\t\t\texpression,\n\t\t\treturnByValue: false,\n\t\t\tawaitPromise: true,\n\t\t}\n\t\tconst context = await this.#context(session)\n\t\tif (context !== undefined) params['contextId'] = context\n\t\tconst result = await this.#client.send('Runtime.evaluate', params, { session })\n\t\tif (\n\t\t\t!isRecord(result) ||\n\t\t\t!isRecord(result['result']) ||\n\t\t\t!isString(result['result']['objectId'])\n\t\t) {\n\t\t\tthrow new BrowserError('Browser expression did not resolve to an object handle', undefined, {\n\t\t\t\tframe: this.#id,\n\t\t\t})\n\t\t}\n\t\treturn new BrowserHandle(this.#client, session, result['result']['objectId'])\n\t}\n\n\tasync wait(selector: string, options?: BrowserWaitOptions): Promise<void> {\n\t\tthis.assert()\n\t\tawait this.#selectors.css(selector).wait(options)\n\t}\n\n\tasync send(\n\t\tmethod: string,\n\t\tparams?: Readonly<Record<string, unknown>>,\n\t\toptions?: BrowserSendOptions,\n\t): Promise<unknown> {\n\t\tthis.assert()\n\t\treturn await this.#client.send(method, params, {\n\t\t\tsession: await this.#sessionId(),\n\t\t\t...(options?.timeout !== undefined ? { timeout: options.timeout } : {}),\n\t\t})\n\t}\n\n\tasync subscribe(method: string, handler: CDPHandler): Promise<void> {\n\t\tthis.assert()\n\t\tthis.#client.subscribe(method, handler, await this.#sessionId())\n\t}\n\n\tasync unsubscribe(method: string, handler: CDPHandler): Promise<void> {\n\t\tthis.#client.unsubscribe(method, handler, await this.#sessionId())\n\t}\n\n\tasync save(path: string, _bytes: Uint8Array): Promise<void> {\n\t\t// Frames satisfy the persistence contract, but only top-level pages receive a writer.\n\t\tthrow new BrowserError('Browser frame has no configured file writer', undefined, { path })\n\t}\n\n\tassert(): void {\n\t\tif (!this.#client.connected) {\n\t\t\tthrow new BrowserError('Browser frame is disconnected', undefined, { frame: this.#id })\n\t\t}\n\t}\n\n\tupdate(url: string): void {\n\t\tthis.#url = url\n\t}\n\n\tasync #captureHTML(): Promise<unknown> {\n\t\treturn await this.#evaluate(\n\t\t\tcompileGuardedEvaluateExpression('document.documentElement.outerHTML', BROWSER_RESULT_LIMIT),\n\t\t)\n\t}\n\n\tasync #evaluate(expression: string, timeout?: number): Promise<unknown> {\n\t\tconst session = await this.#sessionId()\n\t\tconst params: Record<string, unknown> = {\n\t\t\texpression,\n\t\t\treturnByValue: true,\n\t\t\tawaitPromise: true,\n\t\t}\n\n\t\tconst context = await this.#context(session, timeout)\n\t\tif (context !== undefined) params['contextId'] = context\n\n\t\tconst result = await this.#client.send('Runtime.evaluate', params, {\n\t\t\tsession,\n\t\t\t...(timeout !== undefined ? { timeout } : {}),\n\t\t})\n\t\treturn readEvaluationResult(result)\n\t}\n\n\tasync #context(session: string, timeout?: number): Promise<number | undefined> {\n\t\tif (!this.#isolated) return undefined\n\t\tconst world = await this.#client.send(\n\t\t\t'Page.createIsolatedWorld',\n\t\t\t{ frameId: this.#id, worldName: BROWSER_FRAME_WORLD_NAME },\n\t\t\t{ session, ...(timeout !== undefined ? { timeout } : {}) },\n\t\t)\n\t\tif (!isRecord(world) || !isInteger(world['executionContextId'])) {\n\t\t\tthrow new BrowserError('Failed to create frame execution context', undefined, {\n\t\t\t\tframe: this.#id,\n\t\t\t})\n\t\t}\n\t\treturn world['executionContextId']\n\t}\n\n\tasync #sessionId(): Promise<string> {\n\t\tif (isString(this.#session)) return this.#session\n\t\treturn await this.#session(this.#id)\n\t}\n}\n","import type { BrowserFileChooserInterface, BrowserFrameInterface } from './types.js'\nimport { BrowserError } from './errors.js'\n\n/**\n * Represents one intercepted file input selection.\n */\nexport class BrowserFileChooser implements BrowserFileChooserInterface {\n\treadonly #frame: BrowserFrameInterface\n\treadonly #backend: number\n\treadonly #multiple: boolean\n\t#handled = false\n\t#handling = false\n\n\tconstructor(frame: BrowserFrameInterface, backend: number, multiple: boolean) {\n\t\tthis.#frame = frame\n\t\tthis.#backend = backend\n\t\tthis.#multiple = multiple\n\t}\n\n\tget multiple(): boolean {\n\t\treturn this.#multiple\n\t}\n\n\tasync upload(files: readonly string[]): Promise<void> {\n\t\tthis.#assert()\n\t\tif (!this.#multiple && files.length > 1) {\n\t\t\tthrow new BrowserError('Single file chooser cannot accept multiple files')\n\t\t}\n\t\tthis.#handling = true\n\t\ttry {\n\t\t\tawait this.#frame.send('DOM.setFileInputFiles', {\n\t\t\t\tbackendNodeId: this.#backend,\n\t\t\t\tfiles: [...files],\n\t\t\t})\n\t\t\tthis.#handled = true\n\t\t} finally {\n\t\t\tthis.#handling = false\n\t\t}\n\t}\n\n\tasync cancel(): Promise<void> {\n\t\tthis.#assert()\n\t\tthis.#handling = true\n\t\ttry {\n\t\t\tawait this.#frame.send('DOM.setFileInputFiles', {\n\t\t\t\tbackendNodeId: this.#backend,\n\t\t\t\tfiles: [],\n\t\t\t})\n\t\t\tthis.#handled = true\n\t\t} finally {\n\t\t\tthis.#handling = false\n\t\t}\n\t}\n\n\t#assert(): void {\n\t\tif (this.#handled || this.#handling) {\n\t\t\tthrow new BrowserError('Browser file chooser is already handled')\n\t\t}\n\t}\n}\n","import type {\n\tBrowserHAR,\n\tBrowserHAREntry,\n\tBrowserHARManagerInterface,\n\tBrowserHAROptions,\n\tBrowserHARPending,\n\tBrowserHARReplayOptions,\n\tBrowserNetworkManagerInterface,\n\tBrowserRequest,\n\tBrowserRequestFailure,\n\tBrowserResponse,\n\tBrowserRouteHandler,\n\tBrowserWriterInterface,\n} from './types.js'\nimport { BROWSER_HAR_CREATOR } from './constants.js'\nimport {\n\tbrowserHARHeadersToRecord,\n\tcreateBrowserHAREntry,\n\tdecodeBase64,\n\ttextToBytes,\n\tvalidateBrowserHAR,\n} from './helpers.js'\nimport { BrowserError } from './errors.js'\n\n/**\n * Records and replays HTTP archives over one page network manager.\n *\n * @example\n * ```ts\n * import { BrowserHARManager } from '@orkestrel/browser'\n *\n * const har = new BrowserHARManager(page.network)\n * await har.start({ content: true })\n * const archive = await har.stop() // { log: { version: '1.2', creator, entries } }\n * ```\n */\nexport class BrowserHARManager implements BrowserHARManagerInterface {\n\treadonly #network: BrowserNetworkManagerInterface\n\treadonly #writer: BrowserWriterInterface | undefined\n\treadonly #pending: Map<string, BrowserHARPending> = new Map()\n\treadonly #entries: BrowserHAREntry[] = []\n\treadonly #tasks: Set<Promise<void>> = new Set()\n\t#options: BrowserHAROptions | undefined\n\t#recording = false\n\t#failure: unknown\n\t#archive: BrowserHAR | undefined\n\t#fallback = false\n\treadonly #requestHandler = this.#handleRequest.bind(this)\n\treadonly #responseHandler = this.#handleResponse.bind(this)\n\treadonly #failureHandler = this.#handleFailure.bind(this)\n\treadonly #finishHandler = this.#handleFinish.bind(this)\n\treadonly #replayHandler: BrowserRouteHandler = this.#handleReplay.bind(this)\n\n\tconstructor(network: BrowserNetworkManagerInterface, writer?: BrowserWriterInterface) {\n\t\tthis.#network = network\n\t\tthis.#writer = writer\n\t}\n\n\tget recording(): boolean {\n\t\treturn this.#recording\n\t}\n\n\tasync start(options?: BrowserHAROptions): Promise<void> {\n\t\tif (this.#recording) return\n\t\tthis.#options = options\n\t\tthis.#entries.length = 0\n\t\tthis.#pending.clear()\n\t\tthis.#failure = undefined\n\t\tthis.#network.emitter.on('request', this.#requestHandler)\n\t\tthis.#network.emitter.on('response', this.#responseHandler)\n\t\tthis.#network.emitter.on('failure', this.#failureHandler)\n\t\tthis.#network.emitter.on('finish', this.#finishHandler)\n\t\tthis.#recording = true\n\t\ttry {\n\t\t\tawait this.#network.start()\n\t\t} catch (error) {\n\t\t\tthis.#recording = false\n\t\t\tthis.#network.emitter.off('request', this.#requestHandler)\n\t\t\tthis.#network.emitter.off('response', this.#responseHandler)\n\t\t\tthis.#network.emitter.off('failure', this.#failureHandler)\n\t\t\tthis.#network.emitter.off('finish', this.#finishHandler)\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync stop(): Promise<BrowserHAR> {\n\t\tif (this.#recording) {\n\t\t\tthis.#recording = false\n\t\t\tthis.#network.emitter.off('request', this.#requestHandler)\n\t\t\tthis.#network.emitter.off('response', this.#responseHandler)\n\t\t\tthis.#network.emitter.off('failure', this.#failureHandler)\n\t\t\tthis.#network.emitter.off('finish', this.#finishHandler)\n\t\t\tawait Promise.allSettled([...this.#tasks])\n\t\t\tfor (const id of [...this.#pending.keys()]) {\n\t\t\t\tconst pending = this.#pending.get(id)\n\t\t\t\tif (pending === undefined) continue\n\t\t\t\tthis.#pending.delete(id)\n\t\t\t\tthis.#entries.push(\n\t\t\t\t\tcreateBrowserHAREntry(\n\t\t\t\t\t\tpending,\n\t\t\t\t\t\tMath.max(0, Date.now() - pending.started),\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t'Request was incomplete when recording stopped',\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\t\tif (this.#failure !== undefined) {\n\t\t\tthrow new BrowserError('Browser HAR recording failed', 'BROWSER_HAR_ERROR', {\n\t\t\t\terror: this.#failure,\n\t\t\t})\n\t\t}\n\t\tconst har: BrowserHAR = {\n\t\t\tlog: {\n\t\t\t\tversion: '1.2',\n\t\t\t\tcreator: BROWSER_HAR_CREATOR,\n\t\t\t\tentries: [...this.#entries],\n\t\t\t},\n\t\t}\n\t\tif (this.#options?.path !== undefined) {\n\t\t\tif (this.#writer === undefined) {\n\t\t\t\tthrow new BrowserError('Browser HAR path requires a configured writer')\n\t\t\t}\n\t\t\tawait this.#writer.write(this.#options.path, textToBytes(JSON.stringify(har, undefined, 2)))\n\t\t}\n\t\treturn har\n\t}\n\n\tasync replay(har: BrowserHAR, options?: BrowserHARReplayOptions): Promise<void> {\n\t\tvalidateBrowserHAR(har)\n\t\tif (this.#archive !== undefined) await this.#network.unroute(this.#replayHandler)\n\t\tthis.#archive = har\n\t\tthis.#fallback = options?.fallback === true\n\t\ttry {\n\t\t\tawait this.#network.route({}, this.#replayHandler)\n\t\t} catch (error) {\n\t\t\tthis.#archive = undefined\n\t\t\tthis.#fallback = false\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync clear(): Promise<void> {\n\t\tif (this.#recording) await this.stop()\n\t\tconst replaying = this.#archive !== undefined\n\t\tthis.#archive = undefined\n\t\tthis.#fallback = false\n\t\tif (replaying) await this.#network.unroute(this.#replayHandler)\n\t\tthis.#entries.length = 0\n\t\tthis.#pending.clear()\n\t}\n\n\t#handleRequest(request: BrowserRequest): void {\n\t\tif (!this.#recording) return\n\t\tthis.#pending.set(request.id, {\n\t\t\trequest,\n\t\t\tstarted: request.walltime === undefined ? Date.now() : request.walltime * 1000,\n\t\t\tresponse: undefined,\n\t\t})\n\t}\n\n\t#handleResponse(response: BrowserResponse): void {\n\t\tconst pending = this.#pending.get(response.id)\n\t\tif (pending === undefined) return\n\t\tthis.#pending.set(response.id, {\n\t\t\trequest: pending.request,\n\t\t\tstarted: pending.started,\n\t\t\tresponse,\n\t\t})\n\t}\n\n\t#handleFailure(failure: BrowserRequestFailure): void {\n\t\tconst pending = this.#pending.get(failure.id)\n\t\tif (pending === undefined) return\n\t\tthis.#pending.delete(failure.id)\n\t\tthis.#entries.push(\n\t\t\tcreateBrowserHAREntry(\n\t\t\t\tpending,\n\t\t\t\tMath.max(0, Date.now() - pending.started),\n\t\t\t\tundefined,\n\t\t\t\tfailure.error,\n\t\t\t),\n\t\t)\n\t}\n\n\t#handleFinish(id: string): void {\n\t\tthis.#track(this.#complete(id))\n\t}\n\n\tasync #handleReplay(route: Parameters<BrowserRouteHandler>[0]): Promise<void> {\n\t\tconst entry = this.#archive?.log.entries.find(\n\t\t\t(candidate) =>\n\t\t\t\tcandidate.request.url === route.request.url &&\n\t\t\t\tcandidate.request.method === route.request.method,\n\t\t)\n\t\tif (entry === undefined || entry.response.status === 0) {\n\t\t\tif (this.#fallback) await route.continue()\n\t\t\telse await route.abort('Failed')\n\t\t\treturn\n\t\t}\n\t\tconst body =\n\t\t\tentry.response.content.text === undefined\n\t\t\t\t? undefined\n\t\t\t\t: entry.response.content.encoding === 'base64'\n\t\t\t\t\t? decodeBase64(entry.response.content.text)\n\t\t\t\t\t: entry.response.content.text\n\t\tawait route.fulfill({\n\t\t\tstatus: entry.response.status,\n\t\t\tphrase: entry.response.statusText,\n\t\t\theaders: browserHARHeadersToRecord(entry.response.headers),\n\t\t\t...(body !== undefined ? { body } : {}),\n\t\t})\n\t}\n\n\tasync #complete(id: string): Promise<void> {\n\t\tconst pending = this.#pending.get(id)\n\t\tif (pending === undefined) return\n\t\tthis.#pending.delete(id)\n\t\tlet body: Uint8Array | undefined\n\t\tif (this.#options?.content === true && pending.response !== undefined) {\n\t\t\ttry {\n\t\t\t\tbody = await this.#network.body(id)\n\t\t\t} catch {\n\t\t\t\t// Some redirects, cached resources, and protocol errors have no retrievable body.\n\t\t\t}\n\t\t}\n\t\tthis.#entries.push(\n\t\t\tcreateBrowserHAREntry(pending, Math.max(0, Date.now() - pending.started), body),\n\t\t)\n\t}\n\n\t#track(task: Promise<void>): void {\n\t\tthis.#tasks.add(task)\n\t\tvoid task\n\t\t\t.catch((error: unknown) => {\n\t\t\t\tif (this.#failure === undefined) this.#failure = error\n\t\t\t})\n\t\t\t.finally(() => this.#tasks.delete(task))\n\t}\n}\n","import type {\n\tBrowserFrameInterface,\n\tBrowserRequest,\n\tBrowserRouteContinueOptions,\n\tBrowserRouteFulfillOptions,\n\tBrowserRouteInterface,\n} from './types.js'\nimport { browserHeadersToProtocol, encodeBase64, textToBytes } from './helpers.js'\nimport { BrowserError } from './errors.js'\nimport { isInteger, isString } from '@orkestrel/contract'\n\n/**\n * Represents one paused request that can be aborted, continued, or fulfilled exactly once.\n */\nexport class BrowserRoute implements BrowserRouteInterface {\n\treadonly #frame: BrowserFrameInterface\n\treadonly #id: string\n\treadonly #request: BrowserRequest\n\t#handled = false\n\t#handling = false\n\n\tconstructor(frame: BrowserFrameInterface, id: string, request: BrowserRequest) {\n\t\tthis.#frame = frame\n\t\tthis.#id = id\n\t\tthis.#request = request\n\t}\n\n\tget id(): string {\n\t\treturn this.#id\n\t}\n\n\tget request(): BrowserRequest {\n\t\treturn this.#request\n\t}\n\n\tget handled(): boolean {\n\t\treturn this.#handled\n\t}\n\n\tasync abort(reason = 'Failed'): Promise<void> {\n\t\tthis.#assert()\n\t\tthis.#handling = true\n\t\ttry {\n\t\t\tawait this.#frame.send('Fetch.failRequest', {\n\t\t\t\trequestId: this.#id,\n\t\t\t\terrorReason: reason,\n\t\t\t})\n\t\t\tthis.#handled = true\n\t\t} finally {\n\t\t\tthis.#handling = false\n\t\t}\n\t}\n\n\tasync continue(options?: BrowserRouteContinueOptions): Promise<void> {\n\t\tthis.#assert()\n\t\tconst params: Record<string, unknown> = { requestId: this.#id }\n\t\tif (options?.url !== undefined) params['url'] = options.url\n\t\tif (options?.method !== undefined) params['method'] = options.method\n\t\tif (options?.headers !== undefined) {\n\t\t\tparams['headers'] = browserHeadersToProtocol(options.headers)\n\t\t}\n\t\tif (options?.post !== undefined) {\n\t\t\tparams['postData'] = encodeBase64(textToBytes(options.post))\n\t\t}\n\t\tthis.#handling = true\n\t\ttry {\n\t\t\tawait this.#frame.send('Fetch.continueRequest', params)\n\t\t\tthis.#handled = true\n\t\t} finally {\n\t\t\tthis.#handling = false\n\t\t}\n\t}\n\n\tasync fulfill(options: BrowserRouteFulfillOptions): Promise<void> {\n\t\tthis.#assert()\n\t\tconst status = options.status ?? 200\n\t\tif (!isInteger(status) || status < 100 || status > 999) {\n\t\t\tthrow new BrowserError('Browser route status must be an integer from 100 to 999', undefined, {\n\t\t\t\tstatus,\n\t\t\t})\n\t\t}\n\t\tconst params: Record<string, unknown> = {\n\t\t\trequestId: this.#id,\n\t\t\tresponseCode: status,\n\t\t}\n\t\tif (options.phrase !== undefined) params['responsePhrase'] = options.phrase\n\t\tif (options.headers !== undefined) {\n\t\t\tparams['responseHeaders'] = browserHeadersToProtocol(options.headers)\n\t\t}\n\t\tif (options.body !== undefined) {\n\t\t\tparams['body'] = encodeBase64(\n\t\t\t\tisString(options.body) ? textToBytes(options.body) : options.body,\n\t\t\t)\n\t\t}\n\t\tthis.#handling = true\n\t\ttry {\n\t\t\tawait this.#frame.send('Fetch.fulfillRequest', params)\n\t\t\tthis.#handled = true\n\t\t} finally {\n\t\t\tthis.#handling = false\n\t\t}\n\t}\n\n\t#assert(): void {\n\t\tif (this.#handled || this.#handling) throw new BrowserError('Browser route is already handled')\n\t}\n}\n","import type {\n\tBrowserWebSocketEventMap,\n\tBrowserWebSocketFrame,\n\tBrowserWebSocketInterface,\n} from './types.js'\nimport type { EmitterInterface } from '@orkestrel/emitter'\nimport { Emitter } from '@orkestrel/emitter'\n\n/**\n * Represents an observable WebSocket connection reconstructed from Network-domain events.\n *\n * @example\n * ```ts\n * import { BrowserWebSocket } from '@orkestrel/browser'\n *\n * const socket = new BrowserWebSocket('request-1', 'wss://example.com/live')\n * socket.emitter.on('receive', (frame) => log(frame.data))\n * ```\n */\nexport class BrowserWebSocket implements BrowserWebSocketInterface {\n\treadonly #emitter: Emitter<BrowserWebSocketEventMap>\n\treadonly #id: string\n\treadonly #url: string\n\t#closed = false\n\n\tconstructor(id: string, url: string) {\n\t\tthis.#id = id\n\t\tthis.#url = url\n\t\tthis.#emitter = new Emitter()\n\t}\n\n\tget emitter(): EmitterInterface<BrowserWebSocketEventMap> {\n\t\treturn this.#emitter\n\t}\n\n\tget id(): string {\n\t\treturn this.#id\n\t}\n\n\tget url(): string {\n\t\treturn this.#url\n\t}\n\n\treceive(frame: BrowserWebSocketFrame): void {\n\t\tif (!this.#closed) this.#emitter.emit('receive', frame)\n\t}\n\n\ttransmit(frame: BrowserWebSocketFrame): void {\n\t\tif (!this.#closed) this.#emitter.emit('transmit', frame)\n\t}\n\n\tfail(message: string): void {\n\t\tif (!this.#closed) this.#emitter.emit('error', message)\n\t}\n\n\tclose(timestamp: number): void {\n\t\tif (this.#closed) return\n\t\tthis.#closed = true\n\t\tthis.#emitter.emit('close', timestamp)\n\t\tthis.#emitter.destroy()\n\t}\n}\n","import type {\n\tBrowserCredentials,\n\tBrowserFrameInterface,\n\tBrowserHARManagerInterface,\n\tBrowserNetworkEventMap,\n\tBrowserNetworkManagerInterface,\n\tBrowserRouteDefinition,\n\tBrowserRouteHandler,\n\tBrowserRouteQuery,\n\tBrowserWriterInterface,\n} from './types.js'\nimport type { EmitterInterface } from '@orkestrel/emitter'\nimport { BrowserTransition } from './BrowserTransition.js'\nimport { BrowserHARManager } from './BrowserHARManager.js'\nimport { BrowserRoute } from './BrowserRoute.js'\nimport { BrowserWebSocket } from './BrowserWebSocket.js'\nimport {\n\tbytesToText,\n\tdecodeBase64,\n\tmatchesBrowserRoute,\n\tsettleBrowserTeardown,\n\ttextToBytes,\n} from './helpers.js'\nimport {\n\tparseBrowserRequest,\n\tparseBrowserRequestFailure,\n\tparseBrowserResponse,\n\tparseBrowserWebSocketFrame,\n} from './parsers.js'\nimport { BrowserError } from './errors.js'\nimport { attempt, isFiniteNumber, isRecord, isString } from '@orkestrel/contract'\nimport { Emitter } from '@orkestrel/emitter'\n\n/**\n * Drives the page-scoped Network and Fetch domain lifecycle.\n *\n * @example\n * ```ts\n * import { BrowserNetworkManager } from '@orkestrel/browser'\n *\n * const network = new BrowserNetworkManager(page)\n * await network.start()\n * network.emitter.on('response', (response) => log(response.status))\n * await network.destroy()\n * ```\n */\nexport class BrowserNetworkManager implements BrowserNetworkManagerInterface {\n\treadonly #frame: BrowserFrameInterface\n\treadonly #emitter: Emitter<BrowserNetworkEventMap>\n\treadonly #har: BrowserHARManager\n\treadonly #routes: BrowserRouteDefinition[] = []\n\treadonly #sockets: Map<string, BrowserWebSocket> = new Map()\n\t#credentials: BrowserCredentials | undefined\n\t#started = false\n\t#intercepting = false\n\t#destroyed = false\n\treadonly #starting: BrowserTransition = new BrowserTransition()\n\treadonly #requestHandler = this.#handleRequest.bind(this)\n\treadonly #responseHandler = this.#handleResponse.bind(this)\n\treadonly #failureHandler = this.#handleFailure.bind(this)\n\treadonly #finishHandler = this.#handleFinish.bind(this)\n\treadonly #pausedHandler = this.#handlePause.bind(this)\n\treadonly #authHandler = this.#handleAuth.bind(this)\n\treadonly #socketHandler = this.#handleSocket.bind(this)\n\treadonly #socketReceiveHandler = this.#handleSocketReceive.bind(this)\n\treadonly #socketTransmitHandler = this.#handleSocketTransmit.bind(this)\n\treadonly #socketErrorHandler = this.#handleSocketError.bind(this)\n\treadonly #socketCloseHandler = this.#handleSocketClose.bind(this)\n\n\tconstructor(frame: BrowserFrameInterface, writer?: BrowserWriterInterface) {\n\t\tthis.#frame = frame\n\t\tthis.#emitter = new Emitter()\n\t\tthis.#har = new BrowserHARManager(this, writer)\n\t}\n\n\tget emitter(): EmitterInterface<BrowserNetworkEventMap> {\n\t\treturn this.#emitter\n\t}\n\n\tget har(): BrowserHARManagerInterface {\n\t\treturn this.#har\n\t}\n\n\tasync start(): Promise<void> {\n\t\tif (this.#destroyed) throw new BrowserError('Browser network manager is destroyed')\n\t\tif (this.#started) return\n\t\tconst active = this.#starting.pending\n\t\tif (active !== undefined) {\n\t\t\tawait active\n\t\t\treturn\n\t\t}\n\t\tawait this.#starting.execute(() => this.#start())\n\t}\n\n\tasync body(id: string): Promise<Uint8Array> {\n\t\tawait this.start()\n\t\tconst result = await this.#frame.send('Network.getResponseBody', { requestId: id })\n\t\tif (!isRecord(result) || !isString(result['body'])) {\n\t\t\tthrow new BrowserError('Browser response body is malformed', undefined, { id })\n\t\t}\n\t\treturn result['base64Encoded'] === true\n\t\t\t? decodeBase64(result['body'])\n\t\t\t: textToBytes(result['body'])\n\t}\n\n\tasync text(id: string): Promise<string> {\n\t\treturn bytesToText(await this.body(id))\n\t}\n\n\tasync json(id: string): Promise<unknown> {\n\t\tconst text = await this.text(id)\n\t\tconst result = attempt<unknown>(() => JSON.parse(text))\n\t\tif (result.success) return result.value\n\t\tthrow new BrowserError('Browser response body is not valid JSON', 'BROWSER_JSON_ERROR', {\n\t\t\tid,\n\t\t\terror: result.error,\n\t\t})\n\t}\n\n\tasync route(query: BrowserRouteQuery, handler: BrowserRouteHandler): Promise<void> {\n\t\tawait this.start()\n\t\tconst definition = { query, handler }\n\t\tthis.#routes.push(definition)\n\t\ttry {\n\t\t\tawait this.#configure()\n\t\t} catch (error) {\n\t\t\tthis.#routes.splice(this.#routes.indexOf(definition), 1)\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync unroute(handler?: BrowserRouteHandler): Promise<void> {\n\t\tif (handler === undefined) {\n\t\t\tthis.#routes.length = 0\n\t\t} else {\n\t\t\tfor (let index = this.#routes.length - 1; index >= 0; index -= 1) {\n\t\t\t\tif (this.#routes[index]?.handler === handler) this.#routes.splice(index, 1)\n\t\t\t}\n\t\t}\n\t\tif (this.#started && !this.#destroyed) await this.#configure()\n\t}\n\n\tasync headers(headers: Readonly<Record<string, string>>): Promise<void> {\n\t\tawait this.start()\n\t\tawait this.#frame.send('Network.setExtraHTTPHeaders', { headers })\n\t}\n\n\tasync offline(offline: boolean): Promise<void> {\n\t\tawait this.start()\n\t\tawait this.#frame.send('Network.emulateNetworkConditions', {\n\t\t\toffline,\n\t\t\tlatency: 0,\n\t\t\tdownloadThroughput: -1,\n\t\t\tuploadThroughput: -1,\n\t\t})\n\t}\n\n\tasync credentials(credentials?: BrowserCredentials): Promise<void> {\n\t\tawait this.start()\n\t\tconst previous = this.#credentials\n\t\tthis.#credentials = credentials\n\t\ttry {\n\t\t\tawait this.#configure()\n\t\t} catch (error) {\n\t\t\tthis.#credentials = previous\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync destroy(): Promise<void> {\n\t\tif (this.#destroyed) return\n\t\tthis.#destroyed = true\n\t\tconst failure = await settleBrowserTeardown(\n\t\t\t() => this.#har.clear(),\n\t\t\tasync () => {\n\t\t\t\tif (this.#intercepting) await this.#frame.send('Fetch.disable')\n\t\t\t},\n\t\t\tasync () => {\n\t\t\t\tif (this.#started) await this.#frame.send('Network.disable')\n\t\t\t},\n\t\t\t() => this.#unsubscribe(),\n\t\t)\n\t\tfor (const socket of this.#sockets.values()) socket.close(Date.now() / 1000)\n\t\tthis.#sockets.clear()\n\t\tthis.#routes.length = 0\n\t\tthis.#emitter.destroy()\n\t\tif (failure !== undefined) throw failure\n\t}\n\n\t#handleRequest(params: Readonly<Record<string, unknown>>): void {\n\t\tconst request = parseBrowserRequest(params)\n\t\tif (request !== undefined) this.#emitter.emit('request', request)\n\t}\n\n\t#handleResponse(params: Readonly<Record<string, unknown>>): void {\n\t\tconst response = parseBrowserResponse(params)\n\t\tif (response !== undefined) this.#emitter.emit('response', response)\n\t}\n\n\t#handleFailure(params: Readonly<Record<string, unknown>>): void {\n\t\tconst failure = parseBrowserRequestFailure(params)\n\t\tif (failure !== undefined) this.#emitter.emit('failure', failure)\n\t}\n\n\t#handleFinish(params: Readonly<Record<string, unknown>>): void {\n\t\tif (isString(params['requestId'])) this.#emitter.emit('finish', params['requestId'])\n\t}\n\n\t#handlePause(params: Readonly<Record<string, unknown>>): void {\n\t\tvoid this.#route(params).catch(() => undefined)\n\t}\n\n\t#handleAuth(params: Readonly<Record<string, unknown>>): void {\n\t\tvoid this.#authenticate(params).catch(() => undefined)\n\t}\n\n\t#handleSocket(params: Readonly<Record<string, unknown>>): void {\n\t\tif (!isString(params['requestId']) || !isString(params['url'])) return\n\t\tconst socket = new BrowserWebSocket(params['requestId'], params['url'])\n\t\tthis.#sockets.set(socket.id, socket)\n\t\tthis.#emitter.emit('socket', socket)\n\t}\n\n\t#handleSocketReceive(params: Readonly<Record<string, unknown>>): void {\n\t\tconst socket = isString(params['requestId'])\n\t\t\t? this.#sockets.get(params['requestId'])\n\t\t\t: undefined\n\t\tconst frame = parseBrowserWebSocketFrame(params)\n\t\tif (socket !== undefined && frame !== undefined) socket.receive(frame)\n\t}\n\n\t#handleSocketTransmit(params: Readonly<Record<string, unknown>>): void {\n\t\tconst socket = isString(params['requestId'])\n\t\t\t? this.#sockets.get(params['requestId'])\n\t\t\t: undefined\n\t\tconst frame = parseBrowserWebSocketFrame(params)\n\t\tif (socket !== undefined && frame !== undefined) socket.transmit(frame)\n\t}\n\n\t#handleSocketError(params: Readonly<Record<string, unknown>>): void {\n\t\tconst socket = isString(params['requestId'])\n\t\t\t? this.#sockets.get(params['requestId'])\n\t\t\t: undefined\n\t\tif (socket !== undefined && isString(params['errorMessage']))\n\t\t\tsocket.fail(params['errorMessage'])\n\t}\n\n\t#handleSocketClose(params: Readonly<Record<string, unknown>>): void {\n\t\tif (!isString(params['requestId'])) return\n\t\tconst socket = this.#sockets.get(params['requestId'])\n\t\tif (socket === undefined) return\n\t\tthis.#sockets.delete(params['requestId'])\n\t\tsocket.close(isFiniteNumber(params['timestamp']) ? params['timestamp'] : Date.now() / 1000)\n\t}\n\n\tasync #start(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.#subscribe()\n\t\t\tawait this.#frame.send('Network.enable')\n\t\t\tthis.#started = true\n\t\t\tawait this.#configure()\n\t\t} catch (error) {\n\t\t\tthis.#started = false\n\t\t\tthis.#intercepting = false\n\t\t\tawait this.#frame.send('Fetch.disable').catch(() => undefined)\n\t\t\tawait this.#frame.send('Network.disable').catch(() => undefined)\n\t\t\tawait this.#unsubscribe().catch(() => undefined)\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync #configure(): Promise<void> {\n\t\tconst enabled = this.#routes.length > 0 || this.#credentials !== undefined\n\t\tif (!enabled) {\n\t\t\tif (this.#intercepting) {\n\t\t\t\tawait this.#frame.send('Fetch.disable')\n\t\t\t\tthis.#intercepting = false\n\t\t\t}\n\t\t\treturn\n\t\t}\n\t\tawait this.#frame.send('Fetch.enable', {\n\t\t\tpatterns: this.#routes.map((definition) => ({\n\t\t\t\turlPattern: definition.query.url ?? '*',\n\t\t\t\tresourceType: definition.query.resource,\n\t\t\t\trequestStage: 'Request',\n\t\t\t})),\n\t\t\thandleAuthRequests: this.#credentials !== undefined,\n\t\t})\n\t\tthis.#intercepting = true\n\t}\n\n\tasync #route(params: Readonly<Record<string, unknown>>): Promise<void> {\n\t\tconst request = parseBrowserRequest(params)\n\t\tif (request === undefined) {\n\t\t\tif (isString(params['requestId'])) {\n\t\t\t\tawait this.#frame.send('Fetch.failRequest', {\n\t\t\t\t\trequestId: params['requestId'],\n\t\t\t\t\terrorReason: 'Failed',\n\t\t\t\t})\n\t\t\t}\n\t\t\treturn\n\t\t}\n\t\tconst definition = this.#routes.find((candidate) =>\n\t\t\tmatchesBrowserRoute(request, candidate.query),\n\t\t)\n\t\tif (definition === undefined) {\n\t\t\tawait this.#frame.send('Fetch.continueRequest', { requestId: request.id })\n\t\t\treturn\n\t\t}\n\t\tconst route = new BrowserRoute(this.#frame, request.id, request)\n\t\ttry {\n\t\t\tawait definition.handler(route)\n\t\t\tif (!route.handled) await route.continue()\n\t\t} catch {\n\t\t\tif (!route.handled) await route.abort('Failed').catch(() => undefined)\n\t\t}\n\t}\n\n\tasync #authenticate(params: Readonly<Record<string, unknown>>): Promise<void> {\n\t\tconst id = params['requestId']\n\t\tif (!isString(id)) return\n\t\tconst credentials = this.#credentials\n\t\tawait this.#frame.send('Fetch.continueWithAuth', {\n\t\t\trequestId: id,\n\t\t\tauthChallengeResponse:\n\t\t\t\tcredentials === undefined\n\t\t\t\t\t? { response: 'Default' }\n\t\t\t\t\t: {\n\t\t\t\t\t\t\tresponse: 'ProvideCredentials',\n\t\t\t\t\t\t\tusername: credentials.username,\n\t\t\t\t\t\t\tpassword: credentials.password,\n\t\t\t\t\t\t},\n\t\t})\n\t}\n\n\tasync #subscribe(): Promise<void> {\n\t\tawait this.#frame.subscribe('Network.requestWillBeSent', this.#requestHandler)\n\t\tawait this.#frame.subscribe('Network.responseReceived', this.#responseHandler)\n\t\tawait this.#frame.subscribe('Network.loadingFailed', this.#failureHandler)\n\t\tawait this.#frame.subscribe('Network.loadingFinished', this.#finishHandler)\n\t\tawait this.#frame.subscribe('Fetch.requestPaused', this.#pausedHandler)\n\t\tawait this.#frame.subscribe('Fetch.authRequired', this.#authHandler)\n\t\tawait this.#frame.subscribe('Network.webSocketCreated', this.#socketHandler)\n\t\tawait this.#frame.subscribe('Network.webSocketFrameReceived', this.#socketReceiveHandler)\n\t\tawait this.#frame.subscribe('Network.webSocketFrameSent', this.#socketTransmitHandler)\n\t\tawait this.#frame.subscribe('Network.webSocketFrameError', this.#socketErrorHandler)\n\t\tawait this.#frame.subscribe('Network.webSocketClosed', this.#socketCloseHandler)\n\t}\n\n\tasync #unsubscribe(): Promise<void> {\n\t\tawait this.#frame.unsubscribe('Network.requestWillBeSent', this.#requestHandler)\n\t\tawait this.#frame.unsubscribe('Network.responseReceived', this.#responseHandler)\n\t\tawait this.#frame.unsubscribe('Network.loadingFailed', this.#failureHandler)\n\t\tawait this.#frame.unsubscribe('Network.loadingFinished', this.#finishHandler)\n\t\tawait this.#frame.unsubscribe('Fetch.requestPaused', this.#pausedHandler)\n\t\tawait this.#frame.unsubscribe('Fetch.authRequired', this.#authHandler)\n\t\tawait this.#frame.unsubscribe('Network.webSocketCreated', this.#socketHandler)\n\t\tawait this.#frame.unsubscribe('Network.webSocketFrameReceived', this.#socketReceiveHandler)\n\t\tawait this.#frame.unsubscribe('Network.webSocketFrameSent', this.#socketTransmitHandler)\n\t\tawait this.#frame.unsubscribe('Network.webSocketFrameError', this.#socketErrorHandler)\n\t\tawait this.#frame.unsubscribe('Network.webSocketClosed', this.#socketCloseHandler)\n\t}\n}\n","import type {\n\tBrowserNavigationManagerInterface,\n\tBrowserNavigationWait,\n\tBrowserNavigationWaitOptions,\n\tBrowserPageInterface,\n} from './types.js'\nimport { BROWSER_DEFAULT_TIMEOUT_MS, BROWSER_WAIT_POLL_INTERVAL_MS } from './constants.js'\nimport { compileFunctionWaitExpression } from './compilers.js'\nimport { matchesBrowserURL, validateBrowserTimeout } from './helpers.js'\nimport { BrowserError } from './errors.js'\n\n/**\n * Runs URL and page-predicate waits resilient to ordinary navigation events.\n *\n * @example\n * ```ts\n * import { BrowserNavigationManager } from '@orkestrel/browser'\n *\n * const navigation = new BrowserNavigationManager(page)\n * const url = await navigation.wait('https://example.com/checkout', { timeout: 5_000 })\n * await navigation.until('document.readyState === \"complete\"')\n * ```\n */\nexport class BrowserNavigationManager implements BrowserNavigationManagerInterface {\n\treadonly #page: BrowserPageInterface\n\treadonly #waits: Map<symbol, BrowserNavigationWait> = new Map()\n\treadonly #navigateHandler = this.#handleNavigate.bind(this)\n\treadonly #closeHandler = this.#handleClose.bind(this)\n\n\tconstructor(page: BrowserPageInterface) {\n\t\tthis.#page = page\n\t\tthis.#page.emitter.on('navigate', this.#navigateHandler)\n\t\tthis.#page.emitter.on('close', this.#closeHandler)\n\t}\n\n\tasync wait(pattern: string, options?: BrowserNavigationWaitOptions): Promise<string> {\n\t\tconst timeout = this.#timeout(options)\n\t\tif (matchesBrowserURL(this.#page.url, pattern)) return this.#page.url\n\t\tconst deferred = Promise.withResolvers<string>()\n\t\tconst id = Symbol(pattern)\n\t\tconst timer = setTimeout(() => {\n\t\t\tthis.#waits.delete(id)\n\t\t\tdeferred.reject(\n\t\t\t\tnew BrowserError('Browser URL wait timed out', 'BROWSER_NAVIGATION_TIMEOUT', {\n\t\t\t\t\tpattern,\n\t\t\t\t\ttimeout,\n\t\t\t\t}),\n\t\t\t)\n\t\t}, timeout)\n\t\tthis.#waits.set(id, {\n\t\t\tpattern,\n\t\t\ttimer,\n\t\t\tresolve: deferred.resolve,\n\t\t\treject: deferred.reject,\n\t\t})\n\t\treturn await deferred.promise\n\t}\n\n\tasync until(expression: string, options?: BrowserNavigationWaitOptions): Promise<unknown> {\n\t\tconst timeout = this.#timeout(options)\n\t\tconst result = await this.#page.evaluate(\n\t\t\tcompileFunctionWaitExpression(expression, timeout),\n\t\t\ttimeout + BROWSER_WAIT_POLL_INTERVAL_MS,\n\t\t)\n\t\tif (result !== false) return result\n\t\tthrow new BrowserError('Browser predicate wait timed out', 'BROWSER_NAVIGATION_TIMEOUT', {\n\t\t\texpression,\n\t\t\ttimeout,\n\t\t})\n\t}\n\n\t#handleNavigate(url: string): void {\n\t\tfor (const [id, wait] of this.#waits) {\n\t\t\tif (!matchesBrowserURL(url, wait.pattern)) continue\n\t\t\tclearTimeout(wait.timer)\n\t\t\tthis.#waits.delete(id)\n\t\t\twait.resolve(url)\n\t\t}\n\t}\n\n\t#handleClose(): void {\n\t\tfor (const [id, wait] of this.#waits) {\n\t\t\tclearTimeout(wait.timer)\n\t\t\tthis.#waits.delete(id)\n\t\t\twait.reject(new BrowserError('Browser URL wait ended because the page closed'))\n\t\t}\n\t}\n\n\t#timeout(options?: BrowserNavigationWaitOptions): number {\n\t\tconst timeout = options?.timeout ?? BROWSER_DEFAULT_TIMEOUT_MS\n\t\tvalidateBrowserTimeout(timeout)\n\t\treturn timeout\n\t}\n}\n","import type {\n\tBrowserBindingHandler,\n\tBrowserFrameInterface,\n\tBrowserScriptEntry,\n\tBrowserScriptManagerInterface,\n} from './types.js'\nimport {\n\tcompileBrowserBindingCleanup,\n\tcompileBrowserBindingResult,\n\tcompileBrowserBindingSource,\n} from './compilers.js'\nimport { readBrowserScriptIdentifier } from './helpers.js'\nimport { parseBrowserBindingCall } from './parsers.js'\nimport { BrowserError } from './errors.js'\n\n/**\n * Installs new-document scripts and promise-based host functions for one page.\n *\n * @example\n * ```ts\n * import { BrowserScriptManager } from '@orkestrel/browser'\n *\n * const scripts = new BrowserScriptManager(page)\n * const id = await scripts.add('window.__ready = true')\n * await scripts.remove(id)\n * ```\n */\nexport class BrowserScriptManager implements BrowserScriptManagerInterface {\n\treadonly #frame: BrowserFrameInterface\n\treadonly #bindings: Map<string, BrowserBindingHandler> = new Map()\n\treadonly #scripts: Map<string, BrowserScriptEntry> = new Map()\n\t#subscribed = false\n\t#destroyed = false\n\treadonly #bindingHandler = this.#handleBinding.bind(this)\n\n\tconstructor(frame: BrowserFrameInterface) {\n\t\tthis.#frame = frame\n\t}\n\n\tasync add(source: string): Promise<string> {\n\t\tthis.#assert()\n\t\tconst result = await this.#frame.send('Page.addScriptToEvaluateOnNewDocument', { source })\n\t\tconst id = readBrowserScriptIdentifier(result)\n\t\tthis.#scripts.set(id, { source, binding: undefined })\n\t\ttry {\n\t\t\tawait this.#frame.evaluate(`(() => { ${source}\\n })()`)\n\t\t\treturn id\n\t\t} catch (error) {\n\t\t\tawait this.#frame\n\t\t\t\t.send('Page.removeScriptToEvaluateOnNewDocument', { identifier: id })\n\t\t\t\t.catch(() => undefined)\n\t\t\tthis.#scripts.delete(id)\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync remove(id: string): Promise<void> {\n\t\tthis.#assert()\n\t\tif (!this.#scripts.has(id)) return\n\t\tawait this.#frame.send('Page.removeScriptToEvaluateOnNewDocument', { identifier: id })\n\t\tthis.#scripts.delete(id)\n\t}\n\n\tasync expose(name: string, handler: BrowserBindingHandler): Promise<void> {\n\t\tthis.#assert()\n\t\tif (!/^[$A-Z_a-z][$\\w]*$/.test(name)) {\n\t\t\tthrow new BrowserError(\n\t\t\t\t'Browser binding name must be a valid JavaScript identifier',\n\t\t\t\tundefined,\n\t\t\t\t{\n\t\t\t\t\tname,\n\t\t\t\t},\n\t\t\t)\n\t\t}\n\t\tif (this.#bindings.has(name)) {\n\t\t\tthrow new BrowserError('Browser binding already exists', undefined, { name })\n\t\t}\n\t\tconst subscribed = this.#subscribed\n\t\tif (!subscribed) {\n\t\t\tawait this.#frame.subscribe('Runtime.bindingCalled', this.#bindingHandler)\n\t\t\tthis.#subscribed = true\n\t\t}\n\t\tlet added = false\n\t\ttry {\n\t\t\tawait this.#frame.send('Runtime.addBinding', { name })\n\t\t\tadded = true\n\t\t\tconst id = await this.add(compileBrowserBindingSource(name))\n\t\t\tconst entry = this.#scripts.get(id)\n\t\t\tif (entry === undefined) {\n\t\t\t\tthrow new BrowserError('Browser binding script registration was lost', undefined, {\n\t\t\t\t\tname,\n\t\t\t\t})\n\t\t\t}\n\t\t\tthis.#scripts.set(id, { source: entry.source, binding: name })\n\t\t\tthis.#bindings.set(name, handler)\n\t\t} catch (error) {\n\t\t\tif (added) {\n\t\t\t\tawait this.#frame.send('Runtime.removeBinding', { name }).catch(() => undefined)\n\t\t\t}\n\t\t\tif (!subscribed && this.#bindings.size === 0) {\n\t\t\t\tawait this.#frame\n\t\t\t\t\t.unsubscribe('Runtime.bindingCalled', this.#bindingHandler)\n\t\t\t\t\t.catch(() => undefined)\n\t\t\t\tthis.#subscribed = false\n\t\t\t}\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync revoke(name: string): Promise<void> {\n\t\tthis.#assert()\n\t\tif (!this.#bindings.has(name)) return\n\t\tfor (const [id, entry] of this.#scripts) {\n\t\t\tif (entry.binding !== name) continue\n\t\t\tawait this.#frame.send('Page.removeScriptToEvaluateOnNewDocument', { identifier: id })\n\t\t\tthis.#scripts.delete(id)\n\t\t}\n\t\tawait this.#frame.evaluate(compileBrowserBindingCleanup(name))\n\t\tawait this.#frame.send('Runtime.removeBinding', { name })\n\t\tthis.#bindings.delete(name)\n\t}\n\n\tasync destroy(): Promise<void> {\n\t\tif (this.#destroyed) return\n\t\tfor (const name of [...this.#bindings.keys()]) {\n\t\t\tawait this.revoke(name).catch(() => undefined)\n\t\t}\n\t\tfor (const id of [...this.#scripts.keys()]) {\n\t\t\tawait this.remove(id).catch(() => undefined)\n\t\t}\n\t\tif (this.#subscribed) {\n\t\t\tawait this.#frame\n\t\t\t\t.unsubscribe('Runtime.bindingCalled', this.#bindingHandler)\n\t\t\t\t.catch(() => undefined)\n\t\t}\n\t\tthis.#subscribed = false\n\t\tthis.#destroyed = true\n\t}\n\n\tasync #call(params: Readonly<Record<string, unknown>>): Promise<void> {\n\t\tconst call = parseBrowserBindingCall(params)\n\t\tif (call === undefined) return\n\t\tconst handler = this.#bindings.get(call.name)\n\t\tif (handler === undefined) return\n\t\ttry {\n\t\t\tconst value = await handler(...call.args)\n\t\t\tawait this.#frame.send('Runtime.evaluate', {\n\t\t\t\texpression: compileBrowserBindingResult(call.name, call.id, true, value),\n\t\t\t\tcontextId: call.context,\n\t\t\t\tawaitPromise: true,\n\t\t\t})\n\t\t} catch (error) {\n\t\t\tawait this.#frame.send('Runtime.evaluate', {\n\t\t\t\texpression: compileBrowserBindingResult(call.name, call.id, false, String(error)),\n\t\t\t\tcontextId: call.context,\n\t\t\t\tawaitPromise: true,\n\t\t\t})\n\t\t}\n\t}\n\n\t#handleBinding(params: Readonly<Record<string, unknown>>): void {\n\t\tvoid this.#call(params).catch(() => undefined)\n\t}\n\n\t#assert(): void {\n\t\tif (this.#destroyed) throw new BrowserError('Browser script manager is destroyed')\n\t}\n}\n","import type {\n\tBrowserDocument,\n\tBrowserNode,\n\tBrowserNodePredicate,\n\tBrowserNodeQuery,\n\tBrowserSiblingRelation,\n\tBrowserSnapshotInput,\n\tBrowserSnapshotInterface,\n\tBrowserWalkOptions,\n} from './types.js'\nimport { isInteger } from '@orkestrel/contract'\nimport { BrowserError } from './errors.js'\nimport { isBrowserNodeQuery, matchesBrowserNode } from './helpers.js'\n\n/**\n * Represents a navigable, serializable browser DOM snapshot.\n *\n * @example\n * ```ts\n * import { BrowserSnapshot } from '@orkestrel/browser'\n *\n * const snapshot = new BrowserSnapshot({ documents, styles: ['display'] })\n * const main = snapshot.find({ name: 'main', visible: true })\n * ```\n */\nexport class BrowserSnapshot implements BrowserSnapshotInterface {\n\t// Documents are fixed and frozen at construction, so the derived owner index cannot go stale.\n\t#owners: ReadonlyMap<number, BrowserNode> | undefined\n\treadonly documents: readonly BrowserDocument[]\n\treadonly styles: readonly string[]\n\n\tconstructor(input: BrowserSnapshotInput) {\n\t\tthis.documents = Object.freeze([...input.documents])\n\t\tthis.styles = Object.freeze([...input.styles])\n\t}\n\n\twalk(options?: BrowserWalkOptions): Generator<BrowserNode, void, unknown> {\n\t\treturn options?.order === 'breadth' ? this.#breadth(options.root) : this.#depth(options?.root)\n\t}\n\n\t*descendants(node: BrowserNode): Generator<BrowserNode, void, unknown> {\n\t\tlet first = true\n\t\tfor (const descendant of this.#depth(node)) {\n\t\t\tif (first) {\n\t\t\t\tfirst = false\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tyield descendant\n\t\t}\n\t}\n\n\tdocument(node: BrowserNode): BrowserDocument | undefined {\n\t\treturn this.documents.find((document) => document.index === node.document)\n\t}\n\n\tchildren(node: BrowserNode): readonly BrowserNode[] {\n\t\tconst document = this.document(node)\n\t\tif (document === undefined) return []\n\t\tconst children = document.nodes.filter((candidate) => candidate.parent === node.index)\n\t\tif (node.content === undefined) return children\n\t\tconst content = this.documents.find((candidate) => candidate.index === node.content)\n\t\tif (content === undefined) return children\n\t\treturn [...children, ...content.nodes.filter((candidate) => candidate.parent === undefined)]\n\t}\n\n\tparent(node: BrowserNode): BrowserNode | undefined {\n\t\tconst document = this.document(node)\n\t\tif (document === undefined) return undefined\n\t\treturn node.parent === undefined ? this.#owner(node.document) : document.nodes[node.parent]\n\t}\n\n\tsiblings(node: BrowserNode, relation?: BrowserSiblingRelation): readonly BrowserNode[] {\n\t\tconst candidates = this.#candidates(node)\n\t\tconst index = candidates.findIndex(\n\t\t\t(candidate) => candidate.document === node.document && candidate.index === node.index,\n\t\t)\n\t\tif (relation === 'preceding') return index < 0 ? [] : candidates.slice(0, index)\n\t\tif (relation === 'following') return index < 0 ? [] : candidates.slice(index + 1)\n\t\treturn candidates.filter(\n\t\t\t(candidate) => candidate.document !== node.document || candidate.index !== node.index,\n\t\t)\n\t}\n\n\tancestors(node: BrowserNode): readonly BrowserNode[] {\n\t\tconst ancestors: BrowserNode[] = []\n\t\tconst visited = new Set<string>()\n\t\tlet current = node\n\n\t\twhile (true) {\n\t\t\tconst parent = this.parent(current)\n\t\t\tif (parent === undefined) break\n\t\t\tconst identity = this.#identity(parent)\n\t\t\tif (visited.has(identity)) break\n\t\t\tvisited.add(identity)\n\t\t\tancestors.push(parent)\n\t\t\tcurrent = parent\n\t\t}\n\t\treturn ancestors\n\t}\n\n\tcommon(first: BrowserNode, second: BrowserNode): BrowserNode | undefined {\n\t\tconst firstAncestors = this.#chain(first)\n\t\tconst secondAncestors = this.#chain(second)\n\t\tconst identities = new Set(firstAncestors.map((node) => this.#identity(node)))\n\t\treturn secondAncestors.find((node) => identities.has(this.#identity(node)))\n\t}\n\n\tdistance(first: BrowserNode, second: BrowserNode): number | undefined {\n\t\tconst common = this.common(first, second)\n\t\tif (common === undefined) return undefined\n\t\tconst identity = this.#identity(common)\n\t\tconst firstDistance = this.#chain(first).findIndex((node) => this.#identity(node) === identity)\n\t\tconst secondDistance = this.#chain(second).findIndex(\n\t\t\t(node) => this.#identity(node) === identity,\n\t\t)\n\t\tif (firstDistance < 0 || secondDistance < 0) return undefined\n\t\treturn firstDistance + secondDistance\n\t}\n\n\tfind(query: BrowserNodeQuery | BrowserNodePredicate): BrowserNode | undefined {\n\t\tfor (const node of this.walk()) {\n\t\t\tif (this.#match(node, query)) return node\n\t\t}\n\t\treturn undefined\n\t}\n\n\tfilter(query: BrowserNodeQuery | BrowserNodePredicate, limit?: number): readonly BrowserNode[] {\n\t\tif (limit !== undefined && (!isInteger(limit) || limit < 0)) {\n\t\t\tthrow new BrowserError(\n\t\t\t\t'Browser node result limit must be a non-negative integer',\n\t\t\t\tundefined,\n\t\t\t\t{\n\t\t\t\t\tlimit,\n\t\t\t\t},\n\t\t\t)\n\t\t}\n\t\tif (limit === 0) return []\n\t\tconst found: BrowserNode[] = []\n\t\tfor (const node of this.walk()) {\n\t\t\tif (!this.#match(node, query)) continue\n\t\t\tfound.push(node)\n\t\t\tif (limit !== undefined && found.length >= limit) break\n\t\t}\n\t\treturn found\n\t}\n\n\tclosest(\n\t\tnode: BrowserNode,\n\t\tquery: BrowserNodeQuery | BrowserNodePredicate,\n\t): BrowserNode | undefined {\n\t\tif (this.#match(node, query)) return node\n\t\tfor (const ancestor of this.ancestors(node)) {\n\t\t\tif (this.#match(ancestor, query)) return ancestor\n\t\t}\n\t\treturn undefined\n\t}\n\n\tpath(node: BrowserNode): string {\n\t\tconst document = this.document(node)\n\t\tif (document === undefined) return `document:${node.document} > node:${node.index}`\n\t\tconst chain = [...this.ancestors(node)].reverse()\n\t\tchain.push(node)\n\t\tconst segments: string[] = []\n\n\t\tfor (const current of chain) {\n\t\t\tif (current.category !== 1) {\n\t\t\t\tsegments.push(`${current.name.toLowerCase()}:${current.index}`)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tlet ordinal = 1\n\t\t\tif (current.parent !== undefined) {\n\t\t\t\tconst owner = this.document(current)\n\t\t\t\tfor (const sibling of owner?.nodes ?? []) {\n\t\t\t\t\tif (sibling.index >= current.index) break\n\t\t\t\t\tif (sibling.parent === current.parent && sibling.name === current.name) ordinal += 1\n\t\t\t\t}\n\t\t\t}\n\t\t\tsegments.push(`${current.name.toLowerCase()}:${ordinal}`)\n\t\t}\n\n\t\treturn `frame(${JSON.stringify(document.frame)}) > ${segments.join(' > ')}`\n\t}\n\n\t#roots(): readonly BrowserNode[] {\n\t\tconst roots: BrowserNode[] = []\n\t\tfor (const document of this.documents) {\n\t\t\troots.push(...document.nodes.filter((node) => node.parent === undefined))\n\t\t}\n\t\tfor (const document of this.documents) roots.push(...document.nodes)\n\t\treturn roots\n\t}\n\n\t#owner(document: number): BrowserNode | undefined {\n\t\tconst owners = this.#owners\n\t\tif (owners !== undefined) return owners.get(document)\n\t\tconst index = new Map<number, BrowserNode>()\n\t\tfor (const node of this.walk()) {\n\t\t\tif (node.content !== undefined && !index.has(node.content)) index.set(node.content, node)\n\t\t}\n\t\tthis.#owners = index\n\t\treturn index.get(document)\n\t}\n\n\t*#depth(root?: BrowserNode): Generator<BrowserNode, void, unknown> {\n\t\tconst visited = new Set<string>()\n\t\tfor (const seed of root === undefined ? this.#roots() : [root]) {\n\t\t\tconst stack: BrowserNode[] = [seed]\n\t\t\twhile (stack.length > 0) {\n\t\t\t\tconst node = stack.pop()\n\t\t\t\tif (node === undefined) break\n\t\t\t\tconst identity = this.#identity(node)\n\t\t\t\tif (visited.has(identity)) continue\n\t\t\t\tvisited.add(identity)\n\t\t\t\tyield node\n\n\t\t\t\tconst children = this.children(node)\n\t\t\t\tfor (let index = children.length - 1; index >= 0; index -= 1) {\n\t\t\t\t\tconst child = children[index]\n\t\t\t\t\tif (child !== undefined) stack.push(child)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t*#breadth(root?: BrowserNode): Generator<BrowserNode, void, unknown> {\n\t\tconst visited = new Set<string>()\n\t\tfor (const seed of root === undefined ? this.#roots() : [root]) {\n\t\t\tconst queue: BrowserNode[] = [seed]\n\t\t\tlet cursor = 0\n\t\t\twhile (cursor < queue.length) {\n\t\t\t\tconst node = queue[cursor]\n\t\t\t\tcursor += 1\n\t\t\t\tif (node === undefined) continue\n\t\t\t\tconst identity = this.#identity(node)\n\t\t\t\tif (visited.has(identity)) continue\n\t\t\t\tvisited.add(identity)\n\t\t\t\tyield node\n\t\t\t\tqueue.push(...this.children(node))\n\t\t\t}\n\t\t}\n\t}\n\n\t#candidates(node: BrowserNode): readonly BrowserNode[] {\n\t\tconst parent = this.parent(node)\n\t\treturn parent === undefined\n\t\t\t? (this.document(node)?.nodes.filter((candidate) => candidate.parent === undefined) ?? [])\n\t\t\t: this.children(parent)\n\t}\n\n\t#chain(node: BrowserNode): readonly BrowserNode[] {\n\t\treturn [node, ...this.ancestors(node)]\n\t}\n\n\t#match(node: BrowserNode, query: BrowserNodeQuery | BrowserNodePredicate): boolean {\n\t\treturn isBrowserNodeQuery(query) ? matchesBrowserNode(node, query) : query(node)\n\t}\n\n\t#identity(node: BrowserNode): string {\n\t\treturn `${node.document}:${node.index}`\n\t}\n}\n","import type { BrowserWorkerCategory, BrowserWorkerInterface, CDPClientInterface } from './types.js'\nimport { BROWSER_RESULT_LIMIT } from './constants.js'\nimport { compileGuardedEvaluateExpression } from './compilers.js'\nimport { readEvaluationResult } from './helpers.js'\nimport { BrowserError } from './errors.js'\n\n/**\n * Represents a dedicated, shared, or service worker attached through a flattened target session.\n */\nexport class BrowserWorker implements BrowserWorkerInterface {\n\treadonly #client: CDPClientInterface\n\treadonly #session: string\n\treadonly #id: string\n\treadonly #url: string\n\treadonly #category: BrowserWorkerCategory\n\t#closed = false\n\n\tconstructor(\n\t\tclient: CDPClientInterface,\n\t\tsession: string,\n\t\tid: string,\n\t\turl: string,\n\t\tcategory: BrowserWorkerCategory,\n\t) {\n\t\tthis.#client = client\n\t\tthis.#session = session\n\t\tthis.#id = id\n\t\tthis.#url = url\n\t\tthis.#category = category\n\t}\n\n\tget id(): string {\n\t\treturn this.#id\n\t}\n\n\tget url(): string {\n\t\treturn this.#url\n\t}\n\n\tget category(): BrowserWorkerCategory {\n\t\treturn this.#category\n\t}\n\n\tasync evaluate(expression: string, timeout?: number): Promise<unknown> {\n\t\tthis.#assert()\n\t\treturn readEvaluationResult(\n\t\t\tawait this.#client.send(\n\t\t\t\t'Runtime.evaluate',\n\t\t\t\t{\n\t\t\t\t\texpression: compileGuardedEvaluateExpression(expression, BROWSER_RESULT_LIMIT),\n\t\t\t\t\treturnByValue: true,\n\t\t\t\t\tawaitPromise: true,\n\t\t\t\t},\n\t\t\t\t{ session: this.#session, ...(timeout !== undefined ? { timeout } : {}) },\n\t\t\t),\n\t\t)\n\t}\n\n\tasync send(method: string, params?: Readonly<Record<string, unknown>>): Promise<unknown> {\n\t\tthis.#assert()\n\t\treturn await this.#client.send(method, params, { session: this.#session })\n\t}\n\n\tdetach(): void {\n\t\tthis.#closed = true\n\t}\n\n\tasync close(): Promise<void> {\n\t\tif (this.#closed) return\n\t\tthis.#closed = true\n\t\ttry {\n\t\t\tawait this.#client.send('Target.closeTarget', { targetId: this.#id })\n\t\t} catch {\n\t\t\t// The worker may already have terminated.\n\t\t}\n\t}\n\n\t#assert(): void {\n\t\tif (this.#closed) throw new BrowserError('Browser worker is closed')\n\t\tif (!this.#client.connected) throw new BrowserError('Browser worker is disconnected')\n\t}\n}\n","import type {\n\tBrowserCodegenInterface,\n\tBrowserCodegenOptions,\n\tBrowserClockInterface,\n\tBrowserDiagnosticsInterface,\n\tBrowserFrameInfo,\n\tBrowserFrameInterface,\n\tBrowserNavigationOptions,\n\tBrowserNavigationManagerInterface,\n\tBrowserNavigationResult,\n\tBrowserNavigationWatch,\n\tBrowserNetworkManagerInterface,\n\tBrowserPDFOptions,\n\tBrowserPDFResult,\n\tBrowserPageInterface,\n\tBrowserPageEventMap,\n\tBrowserPageOptions,\n\tBrowserResponse,\n\tBrowserScreenshotOptions,\n\tBrowserScreenshotResult,\n\tBrowserScriptManagerInterface,\n\tBrowserSnapshotInterface,\n\tBrowserSnapshotOptions,\n\tBrowserWaitUntil,\n\tBrowserWorkerCategory,\n\tBrowserAccessibilityInterface,\n\tCDPClientInterface,\n\tBrowserWriterInterface,\n} from './types.js'\nimport type { EmitterInterface } from '@orkestrel/emitter'\nimport { BrowserCodegen } from './BrowserCodegen.js'\nimport { BrowserTransition } from './BrowserTransition.js'\nimport { BrowserAccessibility } from './BrowserAccessibility.js'\nimport { BrowserClock } from './BrowserClock.js'\nimport { BrowserDiagnostics } from './BrowserDiagnostics.js'\nimport { BrowserDialog } from './BrowserDialog.js'\nimport { BrowserDownload } from './BrowserDownload.js'\nimport { BrowserFrame } from './BrowserFrame.js'\nimport { BrowserFileChooser } from './BrowserFileChooser.js'\nimport { BrowserNetworkManager } from './BrowserNetworkManager.js'\nimport { BrowserNavigationManager } from './BrowserNavigationManager.js'\nimport { BrowserScriptManager } from './BrowserScriptManager.js'\nimport { BrowserSnapshot } from './BrowserSnapshot.js'\nimport { BrowserWorker } from './BrowserWorker.js'\nimport { BrowserError } from './errors.js'\nimport {\n\tBROWSER_DEFAULT_TIMEOUT_MS,\n\tBROWSER_SNAPSHOT_NODE_LIMIT,\n\tBROWSER_STOP_LOADING_TIMEOUT_MS,\n} from './constants.js'\nimport {\n\tcompileScreenshotCleanupExpression,\n\tcompileScreenshotPreparationExpression,\n} from './compilers.js'\nimport {\n\tdecodeBase64,\n\treadBrowserSnapshot,\n\tbrowserPDFToParams,\n\tbrowserScreenshotToParams,\n\treadBrowserFrames,\n\trequireBrowserString,\n\tvalidateBrowserTimeout,\n} from './helpers.js'\nimport {\n\tparseBrowserConsoleMessage,\n\tparseBrowserDownloadProgress,\n\tparseBrowserDownloadStart,\n\tparseBrowserPageError,\n} from './parsers.js'\nimport { isArray, isFiniteNumber, isInteger, isRecord, isString } from '@orkestrel/contract'\nimport { Emitter } from '@orkestrel/emitter'\n\n/**\n * Represents a top-level browser page, including its target lifecycle and child frames.\n *\n * @example\n * ```ts\n * import { BrowserPage } from '@orkestrel/browser'\n *\n * const page = new BrowserPage(client, 'target-1', 'session-1')\n * await page.navigate('https://example.com')\n * const shot = await page.screenshot({ format: 'png' })\n * await page.close()\n * ```\n */\nexport class BrowserPage extends BrowserFrame implements BrowserPageInterface {\n\treadonly #client: CDPClientInterface\n\treadonly #targetId: string\n\treadonly #sessionId: string\n\treadonly #writer: BrowserWriterInterface | undefined\n\treadonly #contextId: string | undefined\n\treadonly #opener: BrowserPageInterface | undefined\n\treadonly #emitter: Emitter<BrowserPageEventMap>\n\treadonly #network: BrowserNetworkManager\n\treadonly #navigationManager: BrowserNavigationManager\n\treadonly #scripts: BrowserScriptManager\n\treadonly #accessibility: BrowserAccessibility\n\treadonly #diagnostics: BrowserDiagnostics\n\treadonly #clock: BrowserClock\n\treadonly #frameSessions: Map<string, Promise<string>> = new Map()\n\treadonly #frameIds: Map<string, string> = new Map()\n\treadonly #downloads: Map<string, BrowserDownload> = new Map()\n\treadonly #workers: Map<string, BrowserWorker> = new Map()\n\treadonly #popups: Map<string, BrowserPage> = new Map()\n\t#closed = false\n\t#codegen: BrowserCodegen | undefined\n\treadonly #codegenStart: BrowserTransition<BrowserCodegen> = new BrowserTransition()\n\t#navigation: Promise<BrowserNavigationResult> | undefined\n\t#closing: Promise<void> | undefined\n\t#releasing: Promise<void> | undefined\n\t#loadEvents: readonly string[] = []\n\t#sameDocument = false\n\t#loadTimer: ReturnType<typeof setTimeout> | undefined\n\t#loadResolve: (() => void) | undefined\n\t#loadReject: ((error: unknown) => void) | undefined\n\t#responses: BrowserResponse[] | undefined\n\treadonly #navigationResponseHandler = this.#handleNavigationResponse.bind(this)\n\treadonly #destroyHandler = this.#handleDestroy.bind(this)\n\treadonly #loadHandler = this.#handleLoad.bind(this)\n\treadonly #frameAttachedHandler = this.#handleFrameAttached.bind(this)\n\treadonly #frameNavigatedHandler = this.#handleFrameNavigated.bind(this)\n\treadonly #frameDetachedHandler = this.#handleFrameDetached.bind(this)\n\treadonly #dialogHandler = this.#handleDialog.bind(this)\n\treadonly #chooserHandler = this.#handleChooser.bind(this)\n\treadonly #consoleHandler = this.#handleConsole.bind(this)\n\treadonly #errorHandler = this.#handleError.bind(this)\n\treadonly #crashHandler = this.#handleCrash.bind(this)\n\treadonly #downloadHandler = this.#handleDownload.bind(this)\n\treadonly #downloadProgressHandler = this.#handleDownloadProgress.bind(this)\n\treadonly #attachedHandler = this.#handleAttached.bind(this)\n\treadonly #detachedHandler = this.#handleDetached.bind(this)\n\n\tconstructor(\n\t\tclient: CDPClientInterface,\n\t\ttargetId: string,\n\t\tsessionId: string,\n\t\twriter?: BrowserWriterInterface,\n\t\turl?: string,\n\t\tframeId?: string,\n\t\tcontextId?: string,\n\t\topener?: BrowserPageInterface,\n\t\toptions?: BrowserPageOptions,\n\t) {\n\t\tsuper(client, sessionId, frameId ?? targetId, url ?? 'about:blank', undefined, undefined, false)\n\t\tthis.#client = client\n\t\tthis.#targetId = targetId\n\t\tthis.#sessionId = sessionId\n\t\tthis.#writer = writer\n\t\tthis.#contextId = contextId\n\t\tthis.#opener = opener\n\t\tthis.#emitter = new Emitter({\n\t\t\t...(options?.on !== undefined ? { on: options.on } : {}),\n\t\t\t...(options?.error !== undefined ? { error: options.error } : {}),\n\t\t})\n\t\tthis.#network = new BrowserNetworkManager(this, writer)\n\t\tthis.#navigationManager = new BrowserNavigationManager(this)\n\t\tthis.#scripts = new BrowserScriptManager(this)\n\t\tthis.#accessibility = new BrowserAccessibility(this)\n\t\tthis.#diagnostics = new BrowserDiagnostics(this, writer)\n\t\tthis.#clock = new BrowserClock(this)\n\t\tthis.#network.emitter.on('request', (request) => this.#emitter.emit('request', request))\n\t\tthis.#network.emitter.on('response', (response) => this.#emitter.emit('response', response))\n\t\tthis.#network.emitter.on('failure', (failure) => this.#emitter.emit('failure', failure))\n\t\tthis.#network.emitter.on('socket', (socket) => this.#emitter.emit('socket', socket))\n\n\t\tthis.#client.subscribe('Target.targetDestroyed', this.#destroyHandler)\n\t\tthis.#client.subscribe('Target.attachedToTarget', this.#attachedHandler, this.#sessionId)\n\t\tthis.#client.subscribe('Target.detachedFromTarget', this.#detachedHandler, this.#sessionId)\n\t\tthis.#client.subscribe('Page.frameAttached', this.#frameAttachedHandler, this.#sessionId)\n\t\tthis.#client.subscribe('Page.frameNavigated', this.#frameNavigatedHandler, this.#sessionId)\n\t\tthis.#client.subscribe('Page.frameDetached', this.#frameDetachedHandler, this.#sessionId)\n\t\tthis.#client.subscribe('Page.javascriptDialogOpening', this.#dialogHandler, this.#sessionId)\n\t\tthis.#client.subscribe('Page.fileChooserOpened', this.#chooserHandler, this.#sessionId)\n\t\tthis.#client.subscribe('Runtime.consoleAPICalled', this.#consoleHandler, this.#sessionId)\n\t\tthis.#client.subscribe('Runtime.exceptionThrown', this.#errorHandler, this.#sessionId)\n\t\tthis.#client.subscribe('Inspector.targetCrashed', this.#crashHandler, this.#sessionId)\n\t\tthis.#client.subscribe('Browser.downloadWillBegin', this.#downloadHandler)\n\t\tthis.#client.subscribe('Browser.downloadProgress', this.#downloadProgressHandler)\n\t}\n\n\tget emitter(): EmitterInterface<BrowserPageEventMap> {\n\t\treturn this.#emitter\n\t}\n\n\tget network(): BrowserNetworkManagerInterface {\n\t\treturn this.#network\n\t}\n\n\tget navigation(): BrowserNavigationManagerInterface {\n\t\treturn this.#navigationManager\n\t}\n\n\tget scripts(): BrowserScriptManagerInterface {\n\t\treturn this.#scripts\n\t}\n\n\tget accessibility(): BrowserAccessibilityInterface {\n\t\treturn this.#accessibility\n\t}\n\n\tget diagnostics(): BrowserDiagnosticsInterface {\n\t\treturn this.#diagnostics\n\t}\n\n\tget clock(): BrowserClockInterface {\n\t\treturn this.#clock\n\t}\n\n\tget opener(): BrowserPageInterface | undefined {\n\t\treturn this.#opener\n\t}\n\n\tget target(): string {\n\t\treturn this.#targetId\n\t}\n\n\tget closed(): boolean {\n\t\treturn this.#closed\n\t}\n\n\tasync navigate(\n\t\turl: string,\n\t\toptions?: BrowserNavigationOptions,\n\t): Promise<BrowserNavigationResult> {\n\t\tthis.assert()\n\t\twhile (this.#navigation !== undefined) {\n\t\t\tawait this.#navigation.catch(() => undefined)\n\t\t}\n\t\tthis.assert()\n\t\tconst navigation = this.#navigate(url, options)\n\t\tthis.#navigation = navigation\n\n\t\ttry {\n\t\t\treturn await navigation\n\t\t} finally {\n\t\t\tif (this.#navigation === navigation) this.#navigation = undefined\n\t\t}\n\t}\n\n\tasync reload(options?: BrowserNavigationOptions): Promise<BrowserNavigationResult> {\n\t\tthis.assert()\n\t\twhile (this.#navigation !== undefined) {\n\t\t\tawait this.#navigation.catch(() => undefined)\n\t\t}\n\t\tthis.assert()\n\t\tconst navigation = this.#reload(options)\n\t\tthis.#navigation = navigation\n\n\t\ttry {\n\t\t\treturn await navigation\n\t\t} finally {\n\t\t\tif (this.#navigation === navigation) this.#navigation = undefined\n\t\t}\n\t}\n\n\tasync back(options?: BrowserNavigationOptions): Promise<BrowserNavigationResult> {\n\t\treturn await this.#history(-1, options)\n\t}\n\n\tasync forward(options?: BrowserNavigationOptions): Promise<BrowserNavigationResult> {\n\t\treturn await this.#history(1, options)\n\t}\n\n\tasync screenshot(options?: BrowserScreenshotOptions): Promise<BrowserScreenshotResult> {\n\t\tthis.assert()\n\t\tconst params: Record<string, unknown> = { ...browserScreenshotToParams(options) }\n\n\t\tif (options?.full === true) {\n\t\t\tconst metrics = await this.send('Page.getLayoutMetrics')\n\t\t\tconst size =\n\t\t\t\tisRecord(metrics) && isRecord(metrics['cssContentSize'])\n\t\t\t\t\t? metrics['cssContentSize']\n\t\t\t\t\t: isRecord(metrics) && isRecord(metrics['contentSize'])\n\t\t\t\t\t\t? metrics['contentSize']\n\t\t\t\t\t\t: undefined\n\t\t\tconst width = size?.['width']\n\t\t\tconst height = size?.['height']\n\t\t\tif (!isFiniteNumber(width) || width <= 0 || !isFiniteNumber(height) || height <= 0) {\n\t\t\t\tthrow new BrowserError('Browser full-page screenshot metrics are malformed')\n\t\t\t}\n\t\t\tparams['clip'] = { x: 0, y: 0, width, height, scale: 1 }\n\t\t\tparams['captureBeyondViewport'] = true\n\t\t}\n\n\t\tif (options?.scale !== undefined) {\n\t\t\tconst ratio = options.scale === 'css' ? 1 : await this.evaluate('devicePixelRatio')\n\t\t\tif (!isFiniteNumber(ratio) || ratio <= 0) {\n\t\t\t\tthrow new BrowserError('Browser screenshot device scale is malformed')\n\t\t\t}\n\t\t\tif (!isRecord(params['clip'])) {\n\t\t\t\tconst metrics = await this.send('Page.getLayoutMetrics')\n\t\t\t\tconst viewport =\n\t\t\t\t\tisRecord(metrics) && isRecord(metrics['cssVisualViewport'])\n\t\t\t\t\t\t? metrics['cssVisualViewport']\n\t\t\t\t\t\t: undefined\n\t\t\t\tif (\n\t\t\t\t\tviewport === undefined ||\n\t\t\t\t\t!isFiniteNumber(viewport['pageX']) ||\n\t\t\t\t\t!isFiniteNumber(viewport['pageY']) ||\n\t\t\t\t\t!isFiniteNumber(viewport['clientWidth']) ||\n\t\t\t\t\tviewport['clientWidth'] <= 0 ||\n\t\t\t\t\t!isFiniteNumber(viewport['clientHeight']) ||\n\t\t\t\t\tviewport['clientHeight'] <= 0\n\t\t\t\t) {\n\t\t\t\t\tthrow new BrowserError('Browser screenshot viewport metrics are malformed')\n\t\t\t\t}\n\t\t\t\tparams['clip'] = {\n\t\t\t\t\tx: viewport['pageX'],\n\t\t\t\t\ty: viewport['pageY'],\n\t\t\t\t\twidth: viewport['clientWidth'],\n\t\t\t\t\theight: viewport['clientHeight'],\n\t\t\t\t\tscale: ratio,\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tparams['clip']['scale'] = ratio\n\t\t\t}\n\t\t}\n\n\t\tlet token: string | undefined\n\t\tlet transparent = false\n\t\ttry {\n\t\t\tconst preparation = compileScreenshotPreparationExpression(options)\n\t\t\tif (preparation !== undefined) {\n\t\t\t\tconst value = await this.evaluate(preparation)\n\t\t\t\tif (!isString(value)) throw new BrowserError('Browser screenshot preparation failed')\n\t\t\t\ttoken = value\n\t\t\t}\n\t\t\tif (options?.transparent === true) {\n\t\t\t\tawait this.send('Emulation.setDefaultBackgroundColorOverride', {\n\t\t\t\t\tcolor: { r: 0, g: 0, b: 0, a: 0 },\n\t\t\t\t})\n\t\t\t\ttransparent = true\n\t\t\t}\n\t\t\tconst result = await this.send('Page.captureScreenshot', params)\n\t\t\tif (!isRecord(result) || !isString(result['data'])) {\n\t\t\t\tthrow new BrowserError('Screenshot failed: no data returned')\n\t\t\t}\n\n\t\t\tconst bytes = decodeBase64(result['data'])\n\t\t\tif (options?.path !== undefined) await this.save(options.path, bytes)\n\t\t\treturn { bytes, path: options?.path }\n\t\t} finally {\n\t\t\tif (transparent) {\n\t\t\t\tawait this.send('Emulation.setDefaultBackgroundColorOverride').catch(() => undefined)\n\t\t\t}\n\t\t\tif (token !== undefined) {\n\t\t\t\tawait this.evaluate(compileScreenshotCleanupExpression(token)).catch(() => undefined)\n\t\t\t}\n\t\t}\n\t}\n\n\tasync pdf(options?: BrowserPDFOptions): Promise<BrowserPDFResult> {\n\t\tthis.assert()\n\t\tconst result = await this.send('Page.printToPDF', browserPDFToParams(options))\n\t\tif (!isRecord(result) || !isString(result['data'])) {\n\t\t\tthrow new BrowserError('PDF failed: no data returned')\n\t\t}\n\t\tconst bytes = decodeBase64(result['data'])\n\t\tif (options?.path !== undefined) await this.save(options.path, bytes)\n\t\treturn { bytes, path: options?.path }\n\t}\n\n\toverride async save(path: string, bytes: Uint8Array): Promise<void> {\n\t\tif (this.#writer === undefined) {\n\t\t\tthrow new BrowserError('Browser page has no configured file writer', undefined, { path })\n\t\t}\n\t\tawait this.#writer.write(path, bytes)\n\t}\n\n\tasync frame(name: string): Promise<BrowserFrameInterface | undefined> {\n\t\tconst frames = await this.frames()\n\t\treturn frames.find((frame) => frame.name === name || frame.url === name)\n\t}\n\n\tasync frames(): Promise<readonly BrowserFrameInterface[]> {\n\t\tthis.assert()\n\t\tconst result = await this.send('Page.getFrameTree')\n\t\treturn readBrowserFrames(result).map((frame) => this.#frame(frame))\n\t}\n\n\tasync snapshot(options?: BrowserSnapshotOptions): Promise<BrowserSnapshotInterface> {\n\t\tthis.assert()\n\t\tconst styles = options?.styles ?? []\n\t\tconst result = await this.send('DOMSnapshot.captureSnapshot', {\n\t\t\tcomputedStyles: [...styles],\n\t\t\tincludePaintOrder: options?.paint ?? false,\n\t\t\tincludeDOMRects: options?.rects ?? false,\n\t\t})\n\t\treturn new BrowserSnapshot(\n\t\t\treadBrowserSnapshot(result, styles, options?.limit ?? BROWSER_SNAPSHOT_NODE_LIMIT),\n\t\t)\n\t}\n\n\tasync codegen(options?: BrowserCodegenOptions): Promise<BrowserCodegenInterface> {\n\t\tthis.assert()\n\t\tif (this.#codegen !== undefined) return this.#codegen\n\t\tconst active = this.#codegenStart.pending\n\t\tif (active !== undefined) return await active\n\n\t\treturn await this.#codegenStart.execute(() => this.#startCodegen(options))\n\t}\n\n\tdestroy(): Promise<void> {\n\t\tconst active = this.#closing\n\t\tif (active !== undefined) return active\n\n\t\tthis.#closed = true\n\t\tconst closing = this.#destroy()\n\t\tthis.#closing = closing\n\t\treturn closing\n\t}\n\n\tclose(): Promise<void> {\n\t\tconst active = this.#closing\n\t\tif (active !== undefined) return active\n\n\t\tif (this.#closed) {\n\t\t\tconst closing = this.#release()\n\t\t\tthis.#closing = closing\n\t\t\treturn closing\n\t\t}\n\n\t\tthis.#closed = true\n\t\tconst closing = this.#close()\n\t\tthis.#closing = closing\n\t\treturn closing\n\t}\n\n\toverride assert(): void {\n\t\tsuper.assert()\n\t\tif (this.#closed) throw new BrowserError('Browser page is closed')\n\t}\n\n\tasync #navigate(\n\t\turl: string,\n\t\toptions?: BrowserNavigationOptions,\n\t): Promise<BrowserNavigationResult> {\n\t\tconst timeout = options?.timeout ?? BROWSER_DEFAULT_TIMEOUT_MS\n\t\tvalidateBrowserTimeout(timeout)\n\t\tconst watch = this.#watchNavigation()\n\t\tconst condition = options?.condition ?? 'load'\n\t\tconst wait = this.#waitForLoadEvent(condition, timeout)\n\t\tvoid wait.catch(() => undefined)\n\t\tlet loader: string | undefined\n\n\t\ttry {\n\t\t\tconst result = await this.send('Page.navigate', { url }, { timeout })\n\t\t\tif (isRecord(result) && isString(result['errorText'])) {\n\t\t\t\tthrow new BrowserError(`Navigation failed: ${result['errorText']}`)\n\t\t\t}\n\t\t\tif (isRecord(result) && isString(result['loaderId'])) loader = result['loaderId']\n\t\t\tawait wait\n\t\t} catch (error) {\n\t\t\tthis.#clearNavigationWatch(watch)\n\t\t\tthis.#cancelLoad()\n\t\t\tawait this.#stopLoading(Math.min(timeout, BROWSER_STOP_LOADING_TIMEOUT_MS))\n\t\t\tthrow error\n\t\t}\n\n\t\treturn await this.#completeNavigation(watch, loader)\n\t}\n\n\tasync #reload(options?: BrowserNavigationOptions): Promise<BrowserNavigationResult> {\n\t\tconst timeout = options?.timeout ?? BROWSER_DEFAULT_TIMEOUT_MS\n\t\tvalidateBrowserTimeout(timeout)\n\t\tconst watch = this.#watchNavigation()\n\t\tconst wait = this.#waitForLoadEvent(options?.condition ?? 'load', timeout)\n\t\tvoid wait.catch(() => undefined)\n\n\t\ttry {\n\t\t\tawait this.send('Page.reload', undefined, { timeout })\n\t\t\tawait wait\n\t\t} catch (error) {\n\t\t\tthis.#clearNavigationWatch(watch)\n\t\t\tthis.#cancelLoad()\n\t\t\tawait this.#stopLoading(Math.min(timeout, BROWSER_STOP_LOADING_TIMEOUT_MS))\n\t\t\tthrow error\n\t\t}\n\n\t\treturn await this.#completeNavigation(watch)\n\t}\n\n\tasync #history(\n\t\toffset: -1 | 1,\n\t\toptions?: BrowserNavigationOptions,\n\t): Promise<BrowserNavigationResult> {\n\t\tthis.assert()\n\t\twhile (this.#navigation !== undefined) {\n\t\t\tawait this.#navigation.catch(() => undefined)\n\t\t}\n\t\tthis.assert()\n\t\tconst navigation = this.#navigateHistory(offset, options)\n\t\tthis.#navigation = navigation\n\n\t\ttry {\n\t\t\treturn await navigation\n\t\t} finally {\n\t\t\tif (this.#navigation === navigation) this.#navigation = undefined\n\t\t}\n\t}\n\n\tasync #navigateHistory(\n\t\toffset: -1 | 1,\n\t\toptions?: BrowserNavigationOptions,\n\t): Promise<BrowserNavigationResult> {\n\t\tconst timeout = options?.timeout ?? BROWSER_DEFAULT_TIMEOUT_MS\n\t\tvalidateBrowserTimeout(timeout)\n\t\tconst history = await this.send('Page.getNavigationHistory')\n\t\tif (!isRecord(history) || !isInteger(history['currentIndex']) || !isArray(history['entries'])) {\n\t\t\tthrow new BrowserError('Navigation history is malformed')\n\t\t}\n\t\tconst entry = history['entries'][history['currentIndex'] + offset]\n\t\tif (!isRecord(entry) || !isInteger(entry['id'])) {\n\t\t\treturn { url: this.url, response: undefined, same: false }\n\t\t}\n\n\t\tconst watch = this.#watchNavigation()\n\t\tconst wait = this.#waitForLoadEvent(options?.condition ?? 'load', timeout)\n\t\tvoid wait.catch(() => undefined)\n\t\ttry {\n\t\t\tawait this.send('Page.navigateToHistoryEntry', { entryId: entry['id'] }, { timeout })\n\t\t\tawait wait\n\t\t} catch (error) {\n\t\t\tthis.#clearNavigationWatch(watch)\n\t\t\tthis.#cancelLoad()\n\t\t\tawait this.#stopLoading(Math.min(timeout, BROWSER_STOP_LOADING_TIMEOUT_MS))\n\t\t\tthrow error\n\t\t}\n\n\t\treturn await this.#completeNavigation(watch)\n\t}\n\n\t#watchNavigation(): BrowserNavigationWatch {\n\t\tconst responses: BrowserResponse[] = []\n\t\tthis.#responses = responses\n\t\tthis.#network.emitter.on('response', this.#navigationResponseHandler)\n\t\treturn { responses }\n\t}\n\n\t#clearNavigationWatch(watch: BrowserNavigationWatch): void {\n\t\tthis.#network.emitter.off('response', this.#navigationResponseHandler)\n\t\tif (this.#responses === watch.responses) this.#responses = undefined\n\t}\n\n\t#navigationResult(\n\t\twatch: BrowserNavigationWatch,\n\t\turl: string,\n\t\tloader?: string,\n\t): BrowserNavigationResult {\n\t\tthis.#clearNavigationWatch(watch)\n\t\tconst response =\n\t\t\tloader === undefined\n\t\t\t\t? watch.responses.findLast((candidate) => candidate.url === url)\n\t\t\t\t: watch.responses.findLast((candidate) => candidate.loader === loader)\n\t\treturn {\n\t\t\turl,\n\t\t\tresponse,\n\t\t\tsame: this.#sameDocument,\n\t\t}\n\t}\n\n\tasync #completeNavigation(\n\t\twatch: BrowserNavigationWatch,\n\t\tloader?: string,\n\t): Promise<BrowserNavigationResult> {\n\t\ttry {\n\t\t\tconst currentUrl = await this.evaluate('location.href')\n\t\t\tconst resolved = requireBrowserString(currentUrl, 'Navigation URL')\n\t\t\tthis.update(resolved)\n\t\t\treturn this.#navigationResult(watch, resolved, loader)\n\t\t} catch (error) {\n\t\t\tthis.#clearNavigationWatch(watch)\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync #startCodegen(options?: BrowserCodegenOptions): Promise<BrowserCodegen> {\n\t\tconst codegen = new BrowserCodegen(this.#client, this.#sessionId, options)\n\t\tawait codegen.start()\n\t\tif (this.#closed) {\n\t\t\tawait codegen.destroy()\n\t\t\tthrow new BrowserError('Browser page is closed')\n\t\t}\n\t\tthis.#codegen = codegen\n\t\treturn codegen\n\t}\n\n\tasync #destroy(): Promise<void> {\n\t\tawait this.#release()\n\t\ttry {\n\t\t\tawait this.#client.send('Target.detachFromTarget', { sessionId: this.#sessionId })\n\t\t} catch {\n\t\t\t// The session may already be detached.\n\t\t}\n\t}\n\n\tasync #close(): Promise<void> {\n\t\tawait this.#release()\n\t\ttry {\n\t\t\tawait this.#client.send('Target.closeTarget', { targetId: this.#targetId })\n\t\t} catch {\n\t\t\t// The target may already be closed.\n\t\t}\n\t}\n\n\t#release(): Promise<void> {\n\t\tconst active = this.#releasing\n\t\tif (active !== undefined) return active\n\t\tconst release = this.#releaseResources()\n\t\tthis.#releasing = release\n\t\treturn release\n\t}\n\n\tasync #releaseResources(): Promise<void> {\n\t\tthis.#cancelLoad()\n\t\tawait this.#codegenStart.pending?.catch(() => undefined)\n\t\tawait this.#scripts.destroy().catch(() => undefined)\n\t\tawait this.#diagnostics.destroy().catch(() => undefined)\n\t\tawait this.#clock.uninstall().catch(() => undefined)\n\t\tawait this.#network.destroy().catch(() => undefined)\n\n\t\tif (this.#codegen !== undefined) {\n\t\t\ttry {\n\t\t\t\tawait this.#codegen.destroy()\n\t\t\t} catch {\n\t\t\t\t// The recorder's session may already be unavailable.\n\t\t\t}\n\t\t\tthis.#codegen = undefined\n\t\t}\n\n\t\tthis.#frameSessions.clear()\n\t\tthis.#frameIds.clear()\n\t\tfor (const worker of this.#workers.values()) worker.detach()\n\t\tthis.#workers.clear()\n\t\tthis.#popups.clear()\n\t\tthis.#downloads.clear()\n\t\tthis.#client.unsubscribe('Target.targetDestroyed', this.#destroyHandler)\n\t\tthis.#client.unsubscribe('Target.attachedToTarget', this.#attachedHandler, this.#sessionId)\n\t\tthis.#client.unsubscribe('Target.detachedFromTarget', this.#detachedHandler, this.#sessionId)\n\t\tthis.#client.unsubscribe('Page.frameAttached', this.#frameAttachedHandler, this.#sessionId)\n\t\tthis.#client.unsubscribe('Page.frameNavigated', this.#frameNavigatedHandler, this.#sessionId)\n\t\tthis.#client.unsubscribe('Page.frameDetached', this.#frameDetachedHandler, this.#sessionId)\n\t\tthis.#client.unsubscribe('Page.javascriptDialogOpening', this.#dialogHandler, this.#sessionId)\n\t\tthis.#client.unsubscribe('Page.fileChooserOpened', this.#chooserHandler, this.#sessionId)\n\t\tthis.#client.unsubscribe('Runtime.consoleAPICalled', this.#consoleHandler, this.#sessionId)\n\t\tthis.#client.unsubscribe('Runtime.exceptionThrown', this.#errorHandler, this.#sessionId)\n\t\tthis.#client.unsubscribe('Inspector.targetCrashed', this.#crashHandler, this.#sessionId)\n\t\tthis.#client.unsubscribe('Browser.downloadWillBegin', this.#downloadHandler)\n\t\tthis.#client.unsubscribe('Browser.downloadProgress', this.#downloadProgressHandler)\n\t\tif (!this.#emitter.destroyed) {\n\t\t\tthis.#emitter.emit('close')\n\t\t\tthis.#emitter.destroy()\n\t\t}\n\t}\n\n\t#frame(frame: BrowserFrameInfo): BrowserFrameInterface {\n\t\treturn new BrowserFrame(\n\t\t\tthis.#client,\n\t\t\t(id) => this.#resolveFrameSession(id),\n\t\t\tframe.id,\n\t\t\tframe.url,\n\t\t\tframe.parent,\n\t\t\tframe.name,\n\t\t)\n\t}\n\n\tasync #resolveFrameSession(frame: string): Promise<string> {\n\t\tconst session = this.#frameSessions.get(frame)\n\t\treturn session === undefined ? this.#sessionId : await session\n\t}\n\n\tasync #enableFrameSession(session: string): Promise<string> {\n\t\tawait this.#client.send('Page.enable', undefined, { session })\n\t\tawait this.#client.send('Runtime.enable', undefined, { session })\n\t\treturn session\n\t}\n\n\tasync #attachWorker(\n\t\tsession: string,\n\t\tid: string,\n\t\turl: string,\n\t\tcategory: BrowserWorkerCategory,\n\t): Promise<void> {\n\t\ttry {\n\t\t\tawait this.#client.send('Runtime.enable', undefined, { session })\n\t\t\tif (this.#closed) {\n\t\t\t\tawait this.#detachChild(session)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst worker = new BrowserWorker(this.#client, session, id, url, category)\n\t\t\tthis.#workers.set(id, worker)\n\t\t\tthis.#emitter.emit('worker', worker)\n\t\t} catch {\n\t\t\t// A worker can terminate before its session is enabled.\n\t\t\tawait this.#detachChild(session)\n\t\t}\n\t}\n\n\tasync #attachPopup(session: string, id: string, url: string): Promise<void> {\n\t\tlet popup: BrowserPage | undefined\n\t\ttry {\n\t\t\tawait this.#client.send('Page.enable', undefined, { session })\n\t\t\tawait this.#client.send('Runtime.enable', undefined, { session })\n\t\t\tconst result = await this.#client.send('Page.getFrameTree', undefined, { session })\n\t\t\tconst frame = readBrowserFrames(result)[0]\n\t\t\tif (frame === undefined || this.#closed) {\n\t\t\t\tawait this.#detachChild(session)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tpopup = new BrowserPage(\n\t\t\t\tthis.#client,\n\t\t\t\tid,\n\t\t\t\tsession,\n\t\t\t\tthis.#writer,\n\t\t\t\turl,\n\t\t\t\tframe.id,\n\t\t\t\tthis.#contextId,\n\t\t\t\tthis,\n\t\t\t)\n\t\t\tawait popup.send('Target.setAutoAttach', {\n\t\t\t\tautoAttach: true,\n\t\t\t\twaitForDebuggerOnStart: false,\n\t\t\t\tflatten: true,\n\t\t\t})\n\t\t\tawait popup.send('Page.setInterceptFileChooserDialog', { enabled: true })\n\t\t\tawait popup.network.start()\n\t\t\tif (this.#closed) {\n\t\t\t\tawait popup.destroy()\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.#popups.set(id, popup)\n\t\t\tthis.#emitter.emit('popup', popup)\n\t\t} catch {\n\t\t\t// A popup can close before its session initialization completes.\n\t\t\tif (popup !== undefined) await popup.destroy()\n\t\t\telse await this.#detachChild(session)\n\t\t}\n\t}\n\n\tasync #detachChild(session: string): Promise<void> {\n\t\tawait this.#client\n\t\t\t.send('Target.detachFromTarget', { sessionId: session })\n\t\t\t.catch(() => undefined)\n\t}\n\n\tasync #stopLoading(timeout: number): Promise<void> {\n\t\ttry {\n\t\t\tawait this.send('Page.stopLoading', undefined, { timeout })\n\t\t} catch {\n\t\t\t// Best-effort only — the original navigation error wins.\n\t\t}\n\t}\n\n\t#handleNavigationResponse(response: BrowserResponse): void {\n\t\tif (response.frame === this.id) this.#responses?.push(response)\n\t}\n\n\t#handleDestroy(params: Readonly<Record<string, unknown>>): void {\n\t\tif (!isString(params['targetId']) || params['targetId'] !== this.#targetId) return\n\t\tthis.#closed = true\n\t\tvoid this.#release().catch(() => undefined)\n\t}\n\n\t#handleLoad(params: Readonly<Record<string, unknown>>): void {\n\t\tif (this.#loadEvents.includes('Page.navigatedWithinDocument')) {\n\t\t\tconst frame = params['frameId']\n\t\t\tif (isString(frame) && frame === this.id) {\n\t\t\t\tthis.#sameDocument = true\n\t\t\t\tthis.#resolveLoad()\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t\tif (this.#loadEvents.includes('Page.frameNavigated')) {\n\t\t\tconst frame = params['frame']\n\t\t\tif (isRecord(frame) && frame['id'] === this.id) this.#resolveLoad()\n\t\t\treturn\n\t\t}\n\t\tif (\n\t\t\tthis.#loadEvents.includes('Page.loadEventFired') ||\n\t\t\tthis.#loadEvents.includes('Page.domContentEventFired')\n\t\t) {\n\t\t\tthis.#resolveLoad()\n\t\t}\n\t}\n\n\t#handleFrameAttached(params: Readonly<Record<string, unknown>>): void {\n\t\tconst frame = params['frameId']\n\t\tconst parent = params['parentFrameId']\n\t\tif (!isString(frame)) return\n\t\tthis.#emitter.emit(\n\t\t\t'attach',\n\t\t\tnew BrowserFrame(\n\t\t\t\tthis.#client,\n\t\t\t\t(id) => this.#resolveFrameSession(id),\n\t\t\t\tframe,\n\t\t\t\t'about:blank',\n\t\t\t\tisString(parent) ? parent : undefined,\n\t\t\t),\n\t\t)\n\t}\n\n\t#handleFrameNavigated(params: Readonly<Record<string, unknown>>): void {\n\t\tconst frame = params['frame']\n\t\tif (!isRecord(frame) || !isString(frame['id']) || !isString(frame['url'])) return\n\t\tif (frame['id'] === this.id) {\n\t\t\tthis.update(frame['url'])\n\t\t\tthis.#emitter.emit('navigate', frame['url'])\n\t\t}\n\t}\n\n\t#handleFrameDetached(params: Readonly<Record<string, unknown>>): void {\n\t\tconst frame = params['frameId']\n\t\tif (!isString(frame)) return\n\t\tthis.#frameSessions.delete(frame)\n\t\tthis.#emitter.emit('detach', frame)\n\t}\n\n\t#handleDialog(params: Readonly<Record<string, unknown>>): void {\n\t\tconst category = params['type']\n\t\tif (\n\t\t\t(category !== 'alert' &&\n\t\t\t\tcategory !== 'confirm' &&\n\t\t\t\tcategory !== 'prompt' &&\n\t\t\t\tcategory !== 'beforeunload') ||\n\t\t\t!isString(params['message'])\n\t\t) {\n\t\t\treturn\n\t\t}\n\t\tthis.#emitter.emit(\n\t\t\t'dialog',\n\t\t\tnew BrowserDialog(\n\t\t\t\tthis,\n\t\t\t\tcategory,\n\t\t\t\tparams['message'],\n\t\t\t\tisString(params['defaultPrompt']) ? params['defaultPrompt'] : '',\n\t\t\t),\n\t\t)\n\t}\n\n\t#handleChooser(params: Readonly<Record<string, unknown>>): void {\n\t\tconst backend = params['backendNodeId']\n\t\tconst mode = params['mode']\n\t\tif (!isInteger(backend)) return\n\t\tthis.#emitter.emit('chooser', new BrowserFileChooser(this, backend, mode === 'selectMultiple'))\n\t}\n\n\t#handleConsole(params: Readonly<Record<string, unknown>>): void {\n\t\tconst message = parseBrowserConsoleMessage(params)\n\t\tif (message !== undefined) this.#emitter.emit('console', message)\n\t}\n\n\t#handleError(params: Readonly<Record<string, unknown>>): void {\n\t\tconst error = parseBrowserPageError(params)\n\t\tif (error !== undefined) this.#emitter.emit('error', error)\n\t}\n\n\t#handleCrash(): void {\n\t\tthis.#emitter.emit('crash')\n\t}\n\n\t#handleDownload(params: Readonly<Record<string, unknown>>): void {\n\t\tconst start = parseBrowserDownloadStart(params)\n\t\tif (start === undefined || (start.frame !== this.id && !this.#frameSessions.has(start.frame))) {\n\t\t\treturn\n\t\t}\n\t\tconst download = new BrowserDownload(\n\t\t\tthis.#client,\n\t\t\tstart.id,\n\t\t\tstart.url,\n\t\t\tstart.name,\n\t\t\tthis.#contextId,\n\t\t)\n\t\tthis.#downloads.set(start.id, download)\n\t\tthis.#emitter.emit('download', download)\n\t}\n\n\t#handleDownloadProgress(params: Readonly<Record<string, unknown>>): void {\n\t\tconst decoded = parseBrowserDownloadProgress(params)\n\t\tif (decoded === undefined) return\n\t\tconst [id, progress] = decoded\n\t\tconst download = this.#downloads.get(id)\n\t\tif (download === undefined) return\n\t\tdownload.update(progress)\n\t\tif (progress.status !== 'pending') this.#downloads.delete(id)\n\t}\n\n\t#handleAttached(params: Readonly<Record<string, unknown>>): void {\n\t\tconst target = params['targetInfo']\n\t\tconst session = params['sessionId']\n\t\tif (!isRecord(target) || !isString(target['targetId']) || !isString(session)) {\n\t\t\treturn\n\t\t}\n\n\t\tconst category = target['type']\n\t\tif (category === 'worker' || category === 'service_worker' || category === 'shared_worker') {\n\t\t\tvoid this.#attachWorker(\n\t\t\t\tsession,\n\t\t\t\ttarget['targetId'],\n\t\t\t\tisString(target['url']) ? target['url'] : '',\n\t\t\t\tcategory,\n\t\t\t)\n\t\t\treturn\n\t\t}\n\t\tif (category === 'page') {\n\t\t\tvoid this.#attachPopup(\n\t\t\t\tsession,\n\t\t\t\ttarget['targetId'],\n\t\t\t\tisString(target['url']) ? target['url'] : 'about:blank',\n\t\t\t)\n\t\t\treturn\n\t\t}\n\t\tif (category !== 'iframe') return\n\n\t\tconst frame = target['targetId']\n\t\tconst attempt = this.#enableFrameSession(session)\n\t\tthis.#frameSessions.set(frame, attempt)\n\t\tthis.#frameIds.set(session, frame)\n\t\tvoid attempt.catch(() => {\n\t\t\tif (this.#frameSessions.get(frame) === attempt) this.#frameSessions.delete(frame)\n\t\t\tif (this.#frameIds.get(session) === frame) this.#frameIds.delete(session)\n\t\t\tvoid this.#detachChild(session)\n\t\t})\n\t}\n\n\t#handleDetached(params: Readonly<Record<string, unknown>>): void {\n\t\tconst session = params['sessionId']\n\t\tconst target = params['targetId']\n\t\tif (isString(target)) {\n\t\t\tconst worker = this.#workers.get(target)\n\t\t\tif (worker !== undefined) {\n\t\t\t\tworker.detach()\n\t\t\t\tthis.#workers.delete(target)\n\t\t\t}\n\t\t\tconst popup = this.#popups.get(target)\n\t\t\tif (popup !== undefined) {\n\t\t\t\tthis.#popups.delete(target)\n\t\t\t\tvoid popup.destroy().catch(() => undefined)\n\t\t\t}\n\t\t}\n\t\tconst frame = isString(target)\n\t\t\t? target\n\t\t\t: isString(session)\n\t\t\t\t? this.#frameIds.get(session)\n\t\t\t\t: undefined\n\t\tif (frame !== undefined) this.#frameSessions.delete(frame)\n\t\tif (isString(session)) this.#frameIds.delete(session)\n\t}\n\n\t#waitForLoadEvent(condition: BrowserWaitUntil, timeout: number): Promise<void> {\n\t\tconst eventName =\n\t\t\tcondition === 'commit'\n\t\t\t\t? 'Page.frameNavigated'\n\t\t\t\t: condition === 'domcontentloaded'\n\t\t\t\t\t? 'Page.domContentEventFired'\n\t\t\t\t\t: 'Page.loadEventFired'\n\t\tconst deferred = Promise.withResolvers<void>()\n\t\tthis.#sameDocument = false\n\t\tthis.#loadEvents = [eventName, 'Page.navigatedWithinDocument']\n\t\tthis.#loadResolve = deferred.resolve\n\t\tthis.#loadReject = deferred.reject\n\t\tthis.#loadTimer = setTimeout(() => {\n\t\t\tthis.#rejectLoad(new BrowserError(`Navigation timeout after ${timeout}ms`))\n\t\t}, timeout)\n\t\tfor (const event of this.#loadEvents) {\n\t\t\tthis.#client.subscribe(event, this.#loadHandler, this.#sessionId)\n\t\t}\n\t\treturn deferred.promise\n\t}\n\n\t#resolveLoad(): void {\n\t\tconst resolve = this.#loadResolve\n\t\tthis.#clearLoad()\n\t\tresolve?.()\n\t}\n\n\t#rejectLoad(error: unknown): void {\n\t\tconst reject = this.#loadReject\n\t\tthis.#clearLoad()\n\t\treject?.(error)\n\t}\n\n\t#cancelLoad(): void {\n\t\tthis.#rejectLoad(new BrowserError('Navigation cancelled'))\n\t}\n\n\t#clearLoad(): void {\n\t\tif (this.#loadTimer !== undefined) clearTimeout(this.#loadTimer)\n\t\tfor (const event of this.#loadEvents) {\n\t\t\tthis.#client.unsubscribe(event, this.#loadHandler, this.#sessionId)\n\t\t}\n\t\tthis.#loadEvents = []\n\t\tthis.#loadTimer = undefined\n\t\tthis.#loadResolve = undefined\n\t\tthis.#loadReject = undefined\n\t}\n}\n","import type { BrowserPermissionManagerInterface, CDPClientInterface } from './types.js'\n\n/**\n * Applies permission overrides isolated to one browser context.\n *\n * @example\n * ```ts\n * import { BrowserPermissionManager } from '@orkestrel/browser'\n *\n * const permissions = new BrowserPermissionManager(client)\n * await permissions.grant(['geolocation'], 'https://example.com')\n * await permissions.clear()\n * ```\n */\nexport class BrowserPermissionManager implements BrowserPermissionManagerInterface {\n\treadonly #client: CDPClientInterface\n\treadonly #context: string | undefined\n\n\tconstructor(client: CDPClientInterface, context?: string) {\n\t\tthis.#client = client\n\t\tthis.#context = context\n\t}\n\n\tasync grant(permissions: readonly string[], origin?: string): Promise<void> {\n\t\tawait this.#set(permissions, 'granted', origin)\n\t}\n\n\tasync deny(permissions: readonly string[], origin?: string): Promise<void> {\n\t\tawait this.#set(permissions, 'denied', origin)\n\t}\n\n\tasync clear(): Promise<void> {\n\t\tconst params: Record<string, unknown> = {}\n\t\tif (this.#context !== undefined) params['browserContextId'] = this.#context\n\t\tawait this.#client.send('Browser.resetPermissions', params)\n\t}\n\n\tasync #set(\n\t\tpermissions: readonly string[],\n\t\tsetting: 'granted' | 'denied',\n\t\torigin?: string,\n\t): Promise<void> {\n\t\tfor (const name of permissions) {\n\t\t\tconst params: Record<string, unknown> = {\n\t\t\t\tpermission: { name },\n\t\t\t\tsetting,\n\t\t\t}\n\t\t\tif (origin !== undefined) params['origin'] = origin\n\t\t\tif (this.#context !== undefined) params['browserContextId'] = this.#context\n\t\t\tawait this.#client.send('Browser.setPermission', params)\n\t\t}\n\t}\n}\n","import type {\n\tBrowserCookieInput,\n\tBrowserCookieManagerInterface,\n\tBrowserPagesFunction,\n\tBrowserStorageManagerInterface,\n\tBrowserStorageOptions,\n\tBrowserStorageOrigin,\n\tBrowserStorageState,\n} from './types.js'\nimport {\n\tcompileStorageClearExpression,\n\tcompileStorageReadExpression,\n\tcompileStorageRestoreExpression,\n} from './compilers.js'\nimport { readBrowserStorageOrigin } from './helpers.js'\nimport { BrowserError } from './errors.js'\nimport { attempt } from '@orkestrel/contract'\n\n/**\n * Imports, exports, and clears cookie and web-storage state for one browser context.\n *\n * @example\n * ```ts\n * import { BrowserStorageManager } from '@orkestrel/browser'\n *\n * const storage = new BrowserStorageManager(context.cookies, () => context.pages())\n * const state = await storage.state({ origins: ['https://example.com'] })\n * await storage.restore(state)\n * ```\n */\nexport class BrowserStorageManager implements BrowserStorageManagerInterface {\n\treadonly #cookies: BrowserCookieManagerInterface\n\treadonly #pages: BrowserPagesFunction\n\n\tconstructor(cookies: BrowserCookieManagerInterface, pages: BrowserPagesFunction) {\n\t\tthis.#cookies = cookies\n\t\tthis.#pages = pages\n\t}\n\n\tasync state(options?: BrowserStorageOptions): Promise<BrowserStorageState> {\n\t\tconst pages = this.#pages()\n\t\tconst requested = options?.origins\n\t\tconst origins =\n\t\t\trequested === undefined\n\t\t\t\t? [\n\t\t\t\t\t\t...new Set(\n\t\t\t\t\t\t\tpages.map((page) => this.#origin(page.url)).filter((origin) => origin !== undefined),\n\t\t\t\t\t\t),\n\t\t\t\t\t]\n\t\t\t\t: [...new Set(requested.map((origin) => this.#validate(origin)))]\n\t\tconst storage: BrowserStorageOrigin[] = []\n\n\t\tfor (const origin of origins) {\n\t\t\tconst page = pages.find((candidate) => this.#origin(candidate.url) === origin)\n\t\t\tif (page === undefined) {\n\t\t\t\tthrow new BrowserError('Storage origin has no attached page', undefined, { origin })\n\t\t\t}\n\t\t\tstorage.push(\n\t\t\t\treadBrowserStorageOrigin(await page.evaluate(compileStorageReadExpression()), origin),\n\t\t\t)\n\t\t}\n\n\t\tconst cookies: BrowserCookieInput[] = (await this.#cookies.cookies()).map((cookie) => ({\n\t\t\tname: cookie.name,\n\t\t\tvalue: cookie.value,\n\t\t\tdomain: cookie.domain,\n\t\t\tpath: cookie.path,\n\t\t\texpires: cookie.expires,\n\t\t\thttp: cookie.http,\n\t\t\tsecure: cookie.secure,\n\t\t\t...(cookie.site !== undefined ? { site: cookie.site } : {}),\n\t\t\t...(cookie.partition !== undefined ? { partition: cookie.partition } : {}),\n\t\t}))\n\t\treturn { cookies, origins: storage }\n\t}\n\n\tasync restore(state: BrowserStorageState): Promise<void> {\n\t\tconst pages = this.#pages()\n\t\tfor (const origin of state.origins) {\n\t\t\tconst normalized = this.#validate(origin.origin)\n\t\t\tconst page = pages.find((candidate) => this.#origin(candidate.url) === normalized)\n\t\t\tif (page === undefined) {\n\t\t\t\tthrow new BrowserError('Storage origin has no attached page', undefined, {\n\t\t\t\t\torigin: normalized,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t\tawait this.#cookies.set(state.cookies)\n\t\tfor (const origin of state.origins) {\n\t\t\tconst normalized = this.#validate(origin.origin)\n\t\t\tconst page = pages.find((candidate) => this.#origin(candidate.url) === normalized)\n\t\t\tif (page === undefined) {\n\t\t\t\tthrow new BrowserError('Storage origin disappeared during restore', undefined, {\n\t\t\t\t\torigin: normalized,\n\t\t\t\t})\n\t\t\t}\n\t\t\tawait page.evaluate(compileStorageRestoreExpression(origin))\n\t\t}\n\t}\n\n\tasync clear(origin?: string): Promise<void> {\n\t\tawait this.#cookies.clear()\n\t\tconst normalized = origin === undefined ? undefined : this.#validate(origin)\n\t\tfor (const page of this.#pages()) {\n\t\t\tif (normalized !== undefined && this.#origin(page.url) !== normalized) continue\n\t\t\tawait page.evaluate(compileStorageClearExpression())\n\t\t}\n\t}\n\n\t#origin(value: string): string | undefined {\n\t\tconst result = attempt(() => new URL(value))\n\t\tif (!result.success) return undefined\n\t\tif (result.value.protocol !== 'http:' && result.value.protocol !== 'https:') return undefined\n\t\treturn result.value.origin\n\t}\n\n\t#validate(value: string): string {\n\t\tconst origin = this.#origin(value)\n\t\tif (origin === undefined) {\n\t\t\tthrow new BrowserError(\n\t\t\t\t'Browser storage origin must be an absolute HTTP(S) origin',\n\t\t\t\tundefined,\n\t\t\t\t{\n\t\t\t\t\torigin: value,\n\t\t\t\t},\n\t\t\t)\n\t\t}\n\t\treturn origin\n\t}\n}\n","import type {\n\tBrowserContextEventMap,\n\tBrowserContextInterface,\n\tBrowserContextOptions,\n\tBrowserCookieManagerInterface,\n\tBrowserDownloadOptions,\n\tBrowserEmulationManagerInterface,\n\tBrowserEmulationOptions,\n\tBrowserPageInterface,\n\tBrowserPageOptions,\n\tBrowserPermissionManagerInterface,\n\tBrowserStorageManagerInterface,\n\tBrowserViewport,\n\tCDPClientInterface,\n\tCDPTarget,\n\tBrowserWriterInterface,\n} from './types.js'\nimport type { EmitterInterface } from '@orkestrel/emitter'\nimport { BrowserCookieManager } from './BrowserCookieManager.js'\nimport { BrowserTransition } from './BrowserTransition.js'\nimport { BrowserEmulationManager } from './BrowserEmulationManager.js'\nimport { BrowserPage } from './BrowserPage.js'\nimport { BrowserPermissionManager } from './BrowserPermissionManager.js'\nimport { BrowserStorageManager } from './BrowserStorageManager.js'\nimport { BrowserError } from './errors.js'\nimport { readBrowserFrames, settleBrowserTeardown, validateBrowserViewport } from './helpers.js'\nimport { instanceOf, isRecord, isString } from '@orkestrel/contract'\nimport { Emitter } from '@orkestrel/emitter'\n\n// === BrowserContext\n\n/**\n * Owns pages and shared state inside one Chromium browser context.\n *\n * @example\n * ```ts\n * import { BrowserContext } from '@orkestrel/browser'\n *\n * const context = new BrowserContext(client)\n * const page = await context.create({ url: 'https://example.com' })\n * await context.destroy()\n * ```\n */\nexport class BrowserContext implements BrowserContextInterface {\n\treadonly #client: CDPClientInterface\n\treadonly #id: string | undefined\n\treadonly #viewport: BrowserViewport | undefined\n\treadonly #writer: BrowserWriterInterface | undefined\n\treadonly #downloads: BrowserDownloadOptions | undefined\n\treadonly #emitter: Emitter<BrowserContextEventMap>\n\treadonly #cookies: BrowserCookieManager\n\treadonly #permissions: BrowserPermissionManager\n\treadonly #storage: BrowserStorageManager\n\treadonly #emulation: BrowserEmulationManager\n\treadonly #pages: Map<string, BrowserPage> = new Map()\n\treadonly #creating: Set<Promise<BrowserPage>> = new Set()\n\treadonly #syncing: BrowserTransition = new BrowserTransition()\n\t#shutdown: Promise<void> | undefined\n\n\tconstructor(\n\t\tclient: CDPClientInterface,\n\t\tid?: string,\n\t\tviewport?: BrowserViewport,\n\t\twriter?: BrowserWriterInterface,\n\t\temulation?: BrowserEmulationOptions,\n\t\tdownloads?: BrowserDownloadOptions,\n\t\toptions?: BrowserContextOptions,\n\t) {\n\t\tthis.#client = client\n\t\tif (viewport !== undefined) validateBrowserViewport(viewport)\n\t\tthis.#id = id\n\t\tthis.#viewport = viewport\n\t\tthis.#writer = writer\n\t\tthis.#downloads = downloads\n\t\tthis.#emitter = new Emitter({\n\t\t\t...(options?.on !== undefined ? { on: options.on } : {}),\n\t\t\t...(options?.error !== undefined ? { error: options.error } : {}),\n\t\t})\n\t\tthis.#cookies = new BrowserCookieManager(client, id)\n\t\tthis.#permissions = new BrowserPermissionManager(client, id)\n\t\tthis.#storage = new BrowserStorageManager(this.#cookies, () => this.pages())\n\t\tthis.#emulation = new BrowserEmulationManager(() => this.pages(), emulation)\n\t}\n\n\tget emitter(): EmitterInterface<BrowserContextEventMap> {\n\t\treturn this.#emitter\n\t}\n\n\tget id(): string | undefined {\n\t\treturn this.#id\n\t}\n\n\tget cookies(): BrowserCookieManagerInterface {\n\t\treturn this.#cookies\n\t}\n\n\tget permissions(): BrowserPermissionManagerInterface {\n\t\treturn this.#permissions\n\t}\n\n\tget storage(): BrowserStorageManagerInterface {\n\t\treturn this.#storage\n\t}\n\n\tget emulation(): BrowserEmulationManagerInterface {\n\t\treturn this.#emulation\n\t}\n\n\tpage(index?: number): BrowserPageInterface | undefined {\n\t\tconst i = index ?? 0\n\t\tconst pages = [...this.#pages.values()]\n\t\treturn i >= 0 && i < pages.length ? pages[i] : undefined\n\t}\n\n\tpages(): readonly BrowserPageInterface[] {\n\t\treturn [...this.#pages.values()]\n\t}\n\n\tasync create(options?: BrowserPageOptions): Promise<BrowserPageInterface> {\n\t\tif (this.#shutdown !== undefined) throw new BrowserError('Browser context is closed')\n\n\t\tconst attempt = this.#create(options)\n\t\tthis.#creating.add(attempt)\n\t\ttry {\n\t\t\treturn await attempt\n\t\t} finally {\n\t\t\tthis.#creating.delete(attempt)\n\t\t}\n\t}\n\n\tasync sync(targets: readonly CDPTarget[]): Promise<void> {\n\t\tlet active = this.#syncing.pending\n\t\twhile (active !== undefined) {\n\t\t\tawait active\n\t\t\tactive = this.#syncing.pending\n\t\t}\n\t\tif (this.#shutdown !== undefined) throw new BrowserError('Browser context is closed')\n\n\t\tawait this.#syncing.execute(() => this.#sync(targets))\n\t}\n\n\tdestroy(): Promise<void> {\n\t\tconst active = this.#shutdown\n\t\tif (active !== undefined) return active\n\n\t\tconst shutdown = this.#destroyResources()\n\t\tthis.#shutdown = shutdown\n\t\treturn shutdown\n\t}\n\n\tclose(): Promise<void> {\n\t\tconst active = this.#shutdown\n\t\tif (active !== undefined) return active\n\n\t\tconst shutdown = this.#closeResources()\n\t\tthis.#shutdown = shutdown\n\t\treturn shutdown\n\t}\n\n\t// === Private helpers\n\n\tasync #create(options?: BrowserPageOptions): Promise<BrowserPage> {\n\t\tif (options?.viewport !== undefined) validateBrowserViewport(options.viewport)\n\t\tconst result: unknown = await this.#client.send('Target.createTarget', {\n\t\t\turl: 'about:blank',\n\t\t\t...(this.#id === undefined ? {} : { browserContextId: this.#id }),\n\t\t})\n\n\t\tif (!isRecord(result) || !isString(result['targetId'])) {\n\t\t\tthrow new BrowserError('Failed to create new browser target')\n\t\t}\n\n\t\tconst targetId = result['targetId']\n\t\tlet page: BrowserPage | undefined\n\n\t\ttry {\n\t\t\tconst viewport = options?.viewport ?? this.#viewport\n\t\t\tpage = await this.#attach(targetId, options?.url ?? 'about:blank', viewport, options)\n\n\t\t\tif (options?.url !== undefined && options.url !== 'about:blank') {\n\t\t\t\tawait page.navigate(options.url, {\n\t\t\t\t\t...(options.timeout !== undefined ? { timeout: options.timeout } : {}),\n\t\t\t\t})\n\t\t\t}\n\t\t\tif (this.#shutdown !== undefined) {\n\t\t\t\tthrow new BrowserError('Browser context closed during page creation')\n\t\t\t}\n\n\t\t\tthis.#pages.set(targetId, page)\n\t\t\tthis.#emitter.emit('page', page)\n\t\t\treturn page\n\t\t} catch (error) {\n\t\t\tif (page !== undefined) {\n\t\t\t\tawait page.close()\n\t\t\t} else {\n\t\t\t\tawait this.#closeTarget(targetId)\n\t\t\t}\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync #sync(targets: readonly CDPTarget[]): Promise<void> {\n\t\tconst pageTargets = targets.filter((target) => target.category === 'page')\n\t\tconst targetIds = new Set(pageTargets.map((target) => target.id))\n\n\t\tfor (const [id, page] of this.#pages) {\n\t\t\tif (targetIds.has(id)) continue\n\t\t\tawait page.destroy()\n\t\t\tthis.#pages.delete(id)\n\t\t}\n\n\t\tfor (const target of pageTargets) {\n\t\t\tif (this.#shutdown !== undefined || this.#pages.has(target.id)) continue\n\n\t\t\ttry {\n\t\t\t\tconst page = await this.#reattach(target.id, target.url, this.#viewport)\n\t\t\t\tif (this.#shutdown !== undefined) {\n\t\t\t\t\tawait page.destroy()\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tthis.#pages.set(target.id, page)\n\t\t\t\tthis.#emitter.emit('page', page)\n\t\t\t} catch {\n\t\t\t\t// A disappearing or unsupported target does not invalidate its siblings.\n\t\t\t}\n\t\t}\n\t}\n\n\tasync #attach(\n\t\ttargetId: string,\n\t\turl: string,\n\t\tviewport: BrowserViewport | undefined,\n\t\toptions?: BrowserPageOptions,\n\t): Promise<BrowserPage> {\n\t\tlet sessionId: string | undefined\n\t\tlet page: BrowserPage | undefined\n\n\t\ttry {\n\t\t\tsessionId = await this.#openSession(targetId)\n\t\t\tawait this.#enableSession(sessionId)\n\t\t\tconst frameId = await this.#mainFrame(sessionId)\n\t\t\tpage = new BrowserPage(\n\t\t\t\tthis.#client,\n\t\t\t\ttargetId,\n\t\t\t\tsessionId,\n\t\t\t\tthis.#writer,\n\t\t\t\turl,\n\t\t\t\tframeId,\n\t\t\t\tthis.#id,\n\t\t\t\tundefined,\n\t\t\t\toptions,\n\t\t\t)\n\t\t\tawait this.#configurePage(page)\n\t\t\tawait this.#emulation.attach(page)\n\t\t\tif (viewport !== undefined) await this.#applyViewport(sessionId, viewport)\n\t\t\tthis.#observe(page)\n\n\t\t\treturn page\n\t\t} catch (error) {\n\t\t\tif (page !== undefined) await page.destroy().catch(() => undefined)\n\t\t\telse if (sessionId !== undefined) await this.#detachSession(sessionId)\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync #reattach(\n\t\ttargetId: string,\n\t\turl: string,\n\t\tviewport: BrowserViewport | undefined,\n\t): Promise<BrowserPage> {\n\t\tlet sessionId: string | undefined\n\t\tlet page: BrowserPage | undefined\n\n\t\ttry {\n\t\t\tsessionId = await this.#openSession(targetId)\n\t\t\tawait this.#enableSession(sessionId)\n\t\t\tconst frameId = await this.#mainFrame(sessionId)\n\t\t\tpage = new BrowserPage(\n\t\t\t\tthis.#client,\n\t\t\t\ttargetId,\n\t\t\t\tsessionId,\n\t\t\t\tthis.#writer,\n\t\t\t\turl,\n\t\t\t\tframeId,\n\t\t\t\tthis.#id,\n\t\t\t)\n\t\t\tawait this.#configurePage(page)\n\t\t\tawait this.#emulation.attach(page)\n\t\t\tif (viewport !== undefined) await this.#tryViewport(sessionId, viewport)\n\t\t\tthis.#observe(page)\n\n\t\t\treturn page\n\t\t} catch (error) {\n\t\t\tif (page !== undefined) await page.destroy().catch(() => undefined)\n\t\t\telse if (sessionId !== undefined) await this.#detachSession(sessionId)\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync #destroyResources(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.#settle()\n\t\t\tconst failure = await settleBrowserTeardown(\n\t\t\t\t...[...this.#pages.values()].map((page) => () => page.destroy()),\n\t\t\t)\n\t\t\tthis.#pages.clear()\n\t\t\tif (failure !== undefined) throw failure\n\t\t} finally {\n\t\t\tthis.#finish()\n\t\t}\n\t}\n\n\tasync #closeResources(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.#settle()\n\t\t\tlet failure = await settleBrowserTeardown(\n\t\t\t\t...[...this.#pages.values()].map((page) => () => page.close()),\n\t\t\t)\n\t\t\tthis.#pages.clear()\n\n\t\t\tconst id = this.#id\n\t\t\tif (id !== undefined) {\n\t\t\t\tconst settled = await settleBrowserTeardown(() =>\n\t\t\t\t\tthis.#client.send('Target.disposeBrowserContext', { browserContextId: id }),\n\t\t\t\t)\n\t\t\t\tfailure ??= settled\n\t\t\t}\n\t\t\tif (failure !== undefined) throw failure\n\t\t} finally {\n\t\t\tthis.#finish()\n\t\t}\n\t}\n\n\tasync #settle(): Promise<void> {\n\t\tawait Promise.allSettled([...this.#creating])\n\t\tawait this.#syncing.pending?.catch(() => undefined)\n\t}\n\n\tasync #openSession(targetId: string): Promise<string> {\n\t\tconst result: unknown = await this.#client.send('Target.attachToTarget', {\n\t\t\ttargetId,\n\t\t\tflatten: true,\n\t\t})\n\t\tif (!isRecord(result) || !isString(result['sessionId'])) {\n\t\t\tthrow new BrowserError('Failed to attach to browser target')\n\t\t}\n\t\treturn result['sessionId']\n\t}\n\n\tasync #enableSession(sessionId: string): Promise<void> {\n\t\tawait this.#client.send('Page.enable', undefined, { session: sessionId })\n\t\tawait this.#client.send('Runtime.enable', undefined, { session: sessionId })\n\t}\n\n\tasync #mainFrame(sessionId: string): Promise<string> {\n\t\tconst result = await this.#client.send('Page.getFrameTree', undefined, { session: sessionId })\n\t\tconst frame = readBrowserFrames(result)[0]\n\t\tif (frame === undefined) throw new BrowserError('Failed to resolve the main browser frame')\n\t\treturn frame.id\n\t}\n\n\tasync #configurePage(page: BrowserPage): Promise<void> {\n\t\tawait page.send('Target.setAutoAttach', {\n\t\t\tautoAttach: true,\n\t\t\twaitForDebuggerOnStart: false,\n\t\t\tflatten: true,\n\t\t})\n\t\tawait page.send('Page.setInterceptFileChooserDialog', { enabled: true })\n\t\tconst download: Record<string, unknown> = {\n\t\t\tbehavior:\n\t\t\t\tthis.#downloads === undefined\n\t\t\t\t\t? 'default'\n\t\t\t\t\t: this.#downloads.named === true\n\t\t\t\t\t\t? 'allowAndName'\n\t\t\t\t\t\t: 'allow',\n\t\t\teventsEnabled: true,\n\t\t}\n\t\tif (this.#id !== undefined) download['browserContextId'] = this.#id\n\t\tif (this.#downloads !== undefined) download['downloadPath'] = this.#downloads.path\n\t\tawait this.#client.send('Browser.setDownloadBehavior', download)\n\t\tawait page.network.start()\n\t}\n\n\tasync #applyViewport(sessionId: string, viewport: BrowserViewport): Promise<void> {\n\t\tawait this.#client.send(\n\t\t\t'Emulation.setDeviceMetricsOverride',\n\t\t\t{\n\t\t\t\twidth: viewport.width,\n\t\t\t\theight: viewport.height,\n\t\t\t\tdeviceScaleFactor: viewport.scale ?? 1,\n\t\t\t\tmobile: viewport.mobile ?? false,\n\t\t\t\tscreenOrientation:\n\t\t\t\t\tviewport.landscape === undefined\n\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\ttype: viewport.landscape ? 'landscapePrimary' : 'portraitPrimary',\n\t\t\t\t\t\t\t\tangle: viewport.landscape ? 90 : 0,\n\t\t\t\t\t\t\t},\n\t\t\t},\n\t\t\t{ session: sessionId },\n\t\t)\n\t\tawait this.#client.send(\n\t\t\t'Emulation.setTouchEmulationEnabled',\n\t\t\t{ enabled: viewport.touch ?? false },\n\t\t\t{ session: sessionId },\n\t\t)\n\t}\n\n\tasync #tryViewport(sessionId: string, viewport: BrowserViewport): Promise<void> {\n\t\ttry {\n\t\t\tawait this.#applyViewport(sessionId, viewport)\n\t\t} catch {\n\t\t\t// Reattached targets may not support viewport emulation.\n\t\t}\n\t}\n\n\tasync #closeTarget(targetId: string): Promise<void> {\n\t\ttry {\n\t\t\tawait this.#client.send('Target.closeTarget', { targetId })\n\t\t} catch {\n\t\t\t// The target may already be gone.\n\t\t}\n\t}\n\n\tasync #detachSession(sessionId: string): Promise<void> {\n\t\ttry {\n\t\t\tawait this.#client.send('Target.detachFromTarget', { sessionId })\n\t\t} catch {\n\t\t\t// The session may already be detached.\n\t\t}\n\t}\n\n\t#observe(page: BrowserPage): void {\n\t\tpage.emitter.on('popup', (popup) => {\n\t\t\tif (this.#shutdown !== undefined) {\n\t\t\t\tvoid popup.destroy().catch(() => undefined)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (instanceOf(BrowserPage)(popup)) {\n\t\t\t\tvoid this.#adoptPopup(popup)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.#emitter.emit('page', popup)\n\t\t})\n\t\tpage.emitter.on('close', () => {\n\t\t\tif (this.#pages.get(page.target) === page) this.#pages.delete(page.target)\n\t\t})\n\t}\n\n\tasync #adoptPopup(popup: BrowserPage): Promise<void> {\n\t\ttry {\n\t\t\tawait this.#emulation.attach(popup)\n\t\t\tif (this.#shutdown !== undefined) {\n\t\t\t\tawait popup.destroy()\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.#pages.set(popup.target, popup)\n\t\t\tthis.#observe(popup)\n\t\t\tthis.#emitter.emit('page', popup)\n\t\t} catch {\n\t\t\tawait popup.destroy().catch(() => undefined)\n\t\t}\n\t}\n\n\t#finish(): void {\n\t\tif (this.#emitter.destroyed) return\n\t\tthis.#emitter.emit('close')\n\t\tthis.#emitter.destroy()\n\t}\n}\n","import type {\n\tBrowserSnapshotInput,\n\tBrowserSnapshotInterface,\n\tCDPClientInterface,\n\tCDPClientOptions,\n} from './types.js'\nimport { BrowserSnapshot } from './BrowserSnapshot.js'\nimport { CDPClient } from './CDPClient.js'\n\n/**\n * Creates a `CDPClientInterface` bound to the given `CDPTransportInterface`.\n *\n * @param options - The transport (and optional timeout) the client uses\n * @returns A {@link CDPClientInterface}\n *\n * @example\n * ```ts\n * import { createCDPClient } from '@orkestrel/browser'\n *\n * const client = createCDPClient({ transport })\n * await client.connect()\n * ```\n */\nexport function createCDPClient(options: CDPClientOptions): CDPClientInterface {\n\treturn new CDPClient(options)\n}\n\n/**\n * Creates a navigable `BrowserSnapshotInterface` over decoded `BrowserSnapshotInput` data.\n *\n * @param input - Captured documents and computed-style names\n * @returns A {@link BrowserSnapshotInterface}\n *\n * @example\n * ```ts\n * import { createBrowserSnapshot, readBrowserSnapshot } from '@orkestrel/browser'\n *\n * const snapshot = createBrowserSnapshot(readBrowserSnapshot(captured, ['display']))\n * snapshot.find({ name: 'main' })\n * ```\n */\nexport function createBrowserSnapshot(input: BrowserSnapshotInput): BrowserSnapshotInterface {\n\treturn new BrowserSnapshot(input)\n}\n"],"mappings":";;;;;AAUA,IAAa,eAAe;;AAG5B,IAAa,gBAAkD,OAAO,OAAO;CAC5E,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;AACN,CAAC;;;;;AAQD,IAAa,6BAA6B;;;;;;;;;;;;;;;;;;;;AAqB1C,IAAa,uBAAuB;;;;;;;;;;;AAYpC,IAAa,uCAAuC;;;;;;;;;;AAWpD,IAAa,+BAA+B,IAAI,OAC/C,wEACD;;;;;;;;;AAUA,IAAa,gCAAgC;;;;AAK7C,IAAa,8BAA8B;;AAG3C,IAAa,2BAA2B;;AAGxC,IAAa,4BAA4B;;AAGzC,IAAa,6BAA6B;;;;;;;;;;AAW1C,IAAa,4BACZ;;AAGD,IAAa,wBAA0D,OAAO,OAAO;CACpF,KAAK;CACL,SAAS;CACT,MAAM;CACN,OAAO;AACR,CAAC;;AAGD,IAAa,6BACZ,OAAO,OAAO;CACb,MAAM;CACN,OAAO;CACP,QAAQ;CACR,MAAM;CACN,SAAS;AACV,CAAC;;;;;;;;;AAUF,IAAa,sBAAsB,OAAO,OAAO;CAChD,MAAM;CACN,SAAS;AACV,CAAC;;AAGD,IAAa,+BAA+B;;;;;;;;;;;AAY5C,IAAa,kCAAkC;;AAG/C,IAAa,iCAAiC;;AAG9C,IAAa,kCAAkC;;;;;AAQ/C,IAAa,+BAA+B;;;;;;;;;;;;;AAc5C,IAAa,yBAAyB;uBACf,KAAK,UAAU,4BAA4B,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACxOpE,IAAa,eAAb,cAAkC,MAAM;CACvC;CACA;CAEA,YACC,SACA,OAAO,iBACP,SACC;EACD,MAAM,OAAO;EACb,KAAK,OAAO;EACZ,KAAK,OAAO;EACZ,KAAK,UAAU;CAChB;AACD;;;;;AAMA,IAAa,uBAAb,cAA0C,aAAa;CACtD,YAAY,SAAiB,SAA6C;EACzE,MAAM,SAAS,0BAA0B,OAAO;EAChD,KAAK,OAAO;CACb;AACD;;;;;;;;;AAUA,IAAa,WAAb,cAA8B,aAAa;CAC1C,YAAY,SAAiB,SAA6C;EACzE,MAAM,SAAS,qBAAqB,OAAO;EAC3C,KAAK,OAAO;CACb;AACD;;;;;;AAOA,IAAa,qBAAb,cAAwC,aAAa;CACpD,YAAY,SAAiB,SAA6C;EACzE,MAAM,SAAS,gCAAgC,OAAO;EACtD,KAAK,OAAO;CACb;AACD;;;;;AAMA,IAAa,kBAAb,cAAqC,aAAa;CACjD,YAAY,SAAiB,SAA6C;EACzE,MAAM,SAAS,6BAA6B,OAAO;EACnD,KAAK,OAAO;CACb;AACD;;;;;;AAOA,IAAa,0BAAb,cAA6C,aAAa;CACzD,YAAY,SAAiB,SAA6C;EACzE,MAAM,SAAS,8BAA8B,OAAO;EACpD,KAAK,OAAO;CACb;AACD;;;;;;;AAUA,SAAgB,eAAe,OAAuC;CACrE,OAAO,WAAW,OAAO,YAAY;AACtC;;;;;;;AAQA,SAAgB,uBAAuB,OAA+C;CACrF,OAAO,WAAW,OAAO,oBAAoB;AAC9C;;;;;;;AAQA,SAAgB,WAAW,OAAmC;CAC7D,OAAO,WAAW,OAAO,QAAQ;AAClC;;;;;;;AAQA,SAAgB,qBAAqB,OAA6C;CACjF,OAAO,WAAW,OAAO,kBAAkB;AAC5C;;;;;;;AAQA,SAAgB,kBAAkB,OAA0C;CAC3E,OAAO,WAAW,OAAO,eAAe;AACzC;;;;;;;AAQA,SAAgB,0BAA0B,OAAkD;CAC3F,OAAO,WAAW,OAAO,uBAAuB;AACjD;;;;;;;;;;ACzGA,SAAgB,oBAAoB,OAA4C;CAC/E,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,MAAM,YAAY,KAAK,CAAC,SAAS,MAAM,UAAU,GAClF;CAED,MAAM,UAAU,MAAM;CACtB,IAAI,CAAC,SAAS,QAAQ,MAAM,KAAK,CAAC,SAAS,QAAQ,SAAS,GAC3D;CAED,MAAM,YAAY,eAAe,MAAM,YAAY,IAAI,MAAM,eAAe,KAAA;CAC5E,MAAM,WAAW,eAAe,MAAM,WAAW,IAAI,MAAM,cAAc,KAAA;CACzE,OAAO;EACN,IAAI,MAAM;EACV,QAAQ,SAAS,MAAM,WAAW,IAAI,MAAM,cAAc,KAAA;EAC1D,OAAO,SAAS,MAAM,UAAU,IAAI,MAAM,aAAa,KAAA;EACvD,KAAK,QAAQ;EACb,QAAQ,QAAQ;EAChB,SAAS,mBAAmB,QAAQ,UAAU;EAC9C,MAAM,SAAS,QAAQ,WAAW,IAAI,QAAQ,cAAc,KAAA;EAC5D,UAAU,SAAS,MAAM,OAAO,IAC7B,MAAM,UACN,SAAS,MAAM,eAAe,IAC7B,MAAM,kBACN,KAAA;EACJ;EACA;EACA,UAAU,2BACT,MAAM,qBACN,MAAM,cACN,SAAS,MAAM,WAAW,IAAI,MAAM,cAAc,IAClD,SAAS,MAAM,UAAU,IAAI,MAAM,aAAa,KAAA,GAChD,aAAa,CACd;CACD;AACD;;;;;;;;AASA,SAAgB,qBAAqB,OAA6C;CACjF,IACC,CAAC,SAAS,KAAK,KACf,CAAC,SAAS,MAAM,YAAY,KAC5B,CAAC,SAAS,MAAM,WAAW,KAC3B,CAAC,eAAe,MAAM,YAAY,GAElC;CAED,OAAO,2BACN,MAAM,aACN,MAAM,cACN,MAAM,aACN,SAAS,MAAM,UAAU,IAAI,MAAM,aAAa,KAAA,GAChD,MAAM,YACP;AACD;;;;;;;;;;;;AAaA,SAAgB,2BACf,OACA,IACA,QACA,OACA,WAC8B;CAC9B,IACC,CAAC,SAAS,KAAK,KACf,CAAC,SAAS,MAAM,MAAM,KACtB,CAAC,eAAe,MAAM,SAAS,KAC/B,CAAC,SAAS,MAAM,aAAa,KAC7B,CAAC,SAAS,MAAM,WAAW,KAC3B,CAAC,SAAS,MAAM,WAAW,KAC3B,CAAC,eAAe,SAAS,GAEzB;CAED,OAAO;EACN;EACA;EACA;EACA,KAAK,MAAM;EACX,QAAQ,MAAM;EACd,QAAQ,MAAM;EACd,SAAS,mBAAmB,MAAM,UAAU;EAC5C,MAAM,MAAM;EACZ,UAAU,MAAM;EAChB,SAAS,SAAS,MAAM,kBAAkB,IAAI,MAAM,qBAAqB,KAAA;EACzE,MAAM,eAAe,MAAM,aAAa,IAAI,MAAM,gBAAgB,KAAA;EAClE,QAAQ,MAAM,qBAAqB,QAAQ,MAAM,yBAAyB;EAC1E,QAAQ,MAAM,yBAAyB;EACvC;EACA,QAAQ,mBAAmB,MAAM,SAAS;EAC1C,UAAU,qBAAqB,MAAM,kBAAkB;CACxD;AACD;;;;;;;;AASA,SAAgB,mBAAmB,OAA2C;CAC7E,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,eAAe,MAAM,cAAc,KAAK,MAAM,iBAAiB,GACvF;CAED,MAAM,UAAU,MAAM;CACtB,OAAO;EACN,SAAS,MAAM;EACf,OAAO,wBAAwB,OAAO,cAAc,UAAU;EAC9D,KAAK,wBAAwB,OAAO,YAAY,QAAQ;EACxD,SAAS,wBAAwB,OAAO,gBAAgB,YAAY;EACpE,KAAK,wBAAwB,OAAO,YAAY,QAAQ;EACxD,MAAM,wBAAwB,OAAO,aAAa,SAAS;EAC3D,SAAS,eAAe,OAAO,KAAK,WAAW,IAAI,UAAU,KAAA;CAC9D;AACD;;;;;;;;;;AAWA,SAAgB,wBACf,OACA,OACA,KACiC;CACjC,IAAI,CAAC,SAAS,KAAK,GAAG,OAAO,KAAA;CAC7B,MAAM,aAAa,MAAM;CACzB,MAAM,WAAW,MAAM;CACvB,IACC,CAAC,eAAe,UAAU,KAC1B,aAAa,KACb,CAAC,eAAe,QAAQ,KACxB,WAAW,YAEX;CAED,OAAO;EAAE,OAAO;EAAY,KAAK;CAAS;AAC3C;;;;;;;;AASA,SAAgB,qBAAqB,OAA6C;CACjF,IACC,CAAC,SAAS,KAAK,KACf,CAAC,SAAS,MAAM,WAAW,KAC3B,CAAC,SAAS,MAAM,SAAS,KACzB,CAAC,eAAe,MAAM,YAAY,KAClC,CAAC,eAAe,MAAM,UAAU,KAChC,MAAM,aAAa,MAAM,cAEzB;CAED,OAAO;EACN,UAAU,MAAM;EAChB,QAAQ,MAAM;EACd,MAAM,MAAM;EACZ,IAAI,MAAM;CACX;AACD;;;;;;;;AASA,SAAgB,2BAA2B,OAAmD;CAC7F,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,MAAM,YAAY,KAAK,CAAC,SAAS,MAAM,YAAY,GACpF;CAED,OAAO;EACN,IAAI,MAAM;EACV,OAAO,MAAM;EACb,WAAW,MAAM,gBAAgB;EACjC,SAAS,SAAS,MAAM,gBAAgB,IAAI,MAAM,mBAAmB,KAAA;CACtE;AACD;;;;;;;;AASA,SAAgB,2BAA2B,OAAmD;CAC7F,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,MAAM,WAAW,KAAK,CAAC,eAAe,MAAM,YAAY,GACzF;CAED,MAAM,QAAQ,MAAM;CACpB,IAAI,CAAC,UAAU,MAAM,SAAS,KAAK,MAAM,YAAY,KAAK,CAAC,SAAS,MAAM,cAAc,GACvF;CAED,OAAO;EACN,QAAQ,MAAM;EACd,MAAM,MAAM;EACZ,QAAQ,MAAM,YAAY;EAC1B,WAAW,MAAM;CAClB;AACD;;;;;;;;AASA,SAAgB,wBAAwB,OAAgD;CACvF,IACC,CAAC,SAAS,KAAK,KACf,CAAC,SAAS,MAAM,OAAO,KACvB,CAAC,SAAS,MAAM,UAAU,KAC1B,CAAC,UAAU,MAAM,qBAAqB,GAEtC;CAED,MAAM,UAAU,YAAY,MAAM,YAAY,QAAQ;CACtD,IACC,YAAY,KAAA,KACZ,CAAC,SAAS,QAAQ,KAAK,KACvB,CAAC,SAAS,QAAQ,OAAO,KACzB,CAAC,QAAQ,QAAQ,OAAO,KACxB,QAAQ,YAAY,MAAM,SAE1B;CAED,OAAO;EACN,IAAI,QAAQ;EACZ,MAAM,QAAQ;EACd,MAAM,QAAQ;EACd,SAAS,MAAM;CAChB;AACD;;;;;;;;AASA,SAAgB,qBAAqB,OAAoC;CACxE,MAAM,UAAU,mBAAmB,KAAK;CACxC,OAAO,SAAS,OAAO,IAAI,UAAU,KAAA;AACtC;;;;;;;;AASA,SAAgB,4BAA4B,OAAoD;CAC/F,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,MAAM,eAAe,GAAG,OAAO,KAAA;CACjE,OAAO;EACN,MAAM,MAAM;EACZ,GAAI,UAAU,MAAM,uBAAuB,IACxC,EAAE,UAAU,MAAM,wBAAwB,IAC1C,CAAC;CACL;AACD;;;;;;;;AASA,SAAgB,2BAA2B,OAAmD;CAC7F,IACC,CAAC,SAAS,KAAK,KACf,CAAC,SAAS,MAAM,OAAO,KACvB,CAAC,eAAe,MAAM,YAAY,KAClC,CAAC,QAAQ,MAAM,OAAO,GAEtB;CAED,MAAM,SAAS,MAAM,OAAO,CAAC,IAAI,sBAAsB;CACvD,OAAO;EACN,OAAO,MAAM;EACb,MAAM,OACJ,KAAK,UAAU;GACf,IAAI,SAAS,KAAK,GAAG,OAAO;GAC5B,MAAM,aAAa,cAAuB,KAAK,UAAU,KAAK,CAAC;GAC/D,OAAO,WAAW,WAAW,SAAS,WAAW,KAAK,IAAI,WAAW,QAAQ,OAAO,KAAK;EAC1F,CAAC,CAAC,CACD,KAAK,GAAG;EACV;EACA,WAAW,MAAM;EACjB,OAAO,iBAAiB,MAAM,aAAa;CAC5C;AACD;;;;;;;;AASA,SAAgB,sBAAsB,OAA8C;CACnF,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,MAAM,mBAAmB,GAAG,OAAO,KAAA;CACrE,MAAM,UAAU,MAAM;CACtB,MAAM,YAAY,eAAe,MAAM,YAAY,IAAI,MAAM,eAAe,KAAK,IAAI;CACrF,MAAM,YAAY,uBAAuB,QAAQ,YAAY;CAM7D,OAAO;EACN,SANe,SAAS,SAAS,IAC/B,YACA,SAAS,QAAQ,OAAO,IACvB,QAAQ,UACR;EAGH,OAAO,iBAAiB,QAAQ,aAAa;EAC7C;CACD;AACD;;;;;;;;AASA,SAAgB,0BAA0B,OAAkD;CAC3F,IACC,CAAC,SAAS,KAAK,KACf,CAAC,SAAS,MAAM,OAAO,KACvB,CAAC,SAAS,MAAM,MAAM,KACtB,CAAC,SAAS,MAAM,oBAAoB,KACpC,CAAC,SAAS,MAAM,UAAU,GAE1B;CAED,OAAO;EACN,IAAI,MAAM;EACV,KAAK,MAAM;EACX,MAAM,MAAM;EACZ,OAAO,MAAM;CACd;AACD;;;;;;;;AASA,SAAgB,6BACf,OACuE;CACvE,IACC,CAAC,SAAS,KAAK,KACf,CAAC,SAAS,MAAM,OAAO,KACvB,CAAC,eAAe,MAAM,gBAAgB,KACtC,MAAM,mBAAmB,KACzB,CAAC,eAAe,MAAM,aAAa,KACnC,MAAM,gBAAgB,GAEtB;CAED,MAAM,QAAQ,UAAU,MAAM,UAAU;EAAC;EAAa;EAAY;CAAY,CAAC;CAC/E,MAAM,SACL,UAAU,cACP,aACA,UAAU,aACT,cACA,UAAU,eACT,YACA,KAAA;CACN,IAAI,WAAW,KAAA,GAAW,OAAO,KAAA;CACjC,OAAO,CACN,MAAM,SACN;EACC;EACA,UAAU,MAAM;EAChB,OAAO,MAAM;EACb,GAAI,SAAS,MAAM,WAAW,IAAI,EAAE,MAAM,MAAM,YAAY,IAAI,CAAC;CAClE,CACD;AACD;;;;;;;;;;;;;AAcA,SAAgB,0BAA0B,SAAoD;CAC7F,IAAI,CAAC,SAAS,OAAO,GAAG,OAAO,KAAA;CAC/B,MAAM,SAAS,YAAY,SAAS,QAAQ;CAC5C,IAAI,WAAW,KAAA,GAAW,OAAO,KAAA;CAEjC,MAAM,SAAS,UAAU,OAAO,WAAW;EAAC;EAAS;EAAQ;CAAQ,CAAC;CACtE,MAAM,WAAW,OAAO;CAExB,IAAI,WAAW,WAAW,SAAS,QAAQ,GAC1C,OAAO;EAAE,QAAQ;EAAS;CAAS;CAGpC,IAAI,WAAW,UAAU,SAAS,QAAQ,KAAK,SAAS,OAAO,QAAQ,GACtE,OAAO;EAAE,QAAQ;EAAQ;EAAU,OAAO,OAAO;CAAS;CAG3D,IAAI,WAAW,YAAY,SAAS,QAAQ,GAAG;EAC9C,MAAM,SAAS,WAAW,OAAO,WAAW,QAAQ;EACpD,IAAI,WAAW,KAAA,GAAW,OAAO;GAAE,QAAQ;GAAU;GAAU;EAAO;CACvE;AAGD;;;;;;;;;;;;;AAcA,SAAgB,2BACf,QACmC;CACnC,MAAM,QAAQ,OAAO;CACrB,IAAI,CAAC,SAAS,KAAK,GAAG,OAAO,KAAA;CAC7B,IAAI,cAAc,OAAO,OAAO,KAAA;CAChC,IAAI,CAAC,SAAS,MAAM,MAAM,GAAG,OAAO,KAAA;CAEpC,OAAO;EAAE,QAAQ;EAAY,KAAK,MAAM;CAAO;AAChD;;;;;;;AAQA,SAAgB,iBAAiB,OAA+C;CAC/E,OAAO,WAAW,OAAO,cAAc;AACxC;;;;;;;;;AAUA,SAAgB,oBACf,SACA,OACqB;CACrB,IAAI,CAAC,UAAU,KAAK,GAAG,OAAO,KAAA;CAC9B,OAAO,QAAQ;AAChB;;;;;;;AAQA,SAAgB,iBAAiB,OAAyC;CACzE,MAAM,UAAU,iBAAiB,KAAK;CACtC,IAAI,YAAY,KAAA,KAAa,QAAQ,WAAW,GAAG,OAAO,KAAA;CAC1D,MAAM,IAAI,QAAQ;CAClB,MAAM,IAAI,QAAQ;CAClB,MAAM,QAAQ,QAAQ;CACtB,MAAM,SAAS,QAAQ;CACvB,IAAI,MAAM,KAAA,KAAa,MAAM,KAAA,KAAa,UAAU,KAAA,KAAa,WAAW,KAAA,GAC3E;CAED,OAAO;EAAC;EAAG;EAAG;EAAO;CAAM;AAC5B;;;;;;;;;;;;;;;;;;;ACldA,SAAgB,aAAa,MAA0B;CACtD,MAAM,QAAQ,KAAK,QAAQ,mBAAmB,EAAE;CAChD,MAAM,QAAkB,CAAC;CAEzB,IAAI,SAAS;CACb,IAAI,OAAO;CAEX,KAAK,MAAM,QAAQ,OAAO;EACzB,MAAM,QAAQ,cAAc;EAC5B,IAAI,UAAU,KAAA,GAAW;EAEzB,SAAU,UAAU,IAAK;EACzB,QAAQ;EAER,IAAI,QAAQ,GAAG;GACd,QAAQ;GACR,MAAM,KAAM,UAAU,OAAQ,GAAI;EACnC;CACD;CAEA,OAAO,IAAI,WAAW,KAAK;AAC5B;;;;;;;AAQA,SAAgB,aAAa,OAA2B;CACvD,IAAI,SAAS;CACb,KAAK,IAAI,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS,GAAG;EACrD,MAAM,QAAQ,MAAM;EACpB,MAAM,SAAS,MAAM,QAAQ;EAC7B,MAAM,QAAQ,MAAM,QAAQ;EAC5B,IAAI,UAAU,KAAA,GAAW;EACzB,MAAM,QAAS,SAAS,MAAQ,UAAU,MAAM,KAAM,SAAS;EAC/D,UAAA,mEAAwB,SAAS,KAAM,OAAO;EAC9C,UAAA,mEAAwB,SAAS,KAAM,OAAO;EAC9C,UAAU,WAAW,KAAA,IAAY,MAAA,mEAAqB,SAAS,IAAK,OAAO;EAC3E,UAAU,UAAU,KAAA,IAAY,MAAA,mEAAoB,QAAQ,OAAO;CACpE;CACA,OAAO;AACR;;AAGA,SAAgB,YAAY,OAA2B;CACtD,OAAO,IAAI,YAAY,CAAC,CAAC,OAAO,KAAK;AACtC;;AAGA,SAAgB,YAAY,OAA2B;CACtD,OAAO,IAAI,YAAY,CAAC,CAAC,OAAO,KAAK;AACtC;;;;;;;AAQA,SAAgB,yBACf,SACkD;CAClD,OAAO,OAAO,QAAQ,OAAO,CAAC,CAAC,KAAK,CAAC,MAAM,YAAY;EAAE;EAAM;CAAM,EAAE;AACxE;;;;;;;;AASA,SAAgB,mBAAmB,OAAkD;CACpF,IAAI,CAAC,SAAS,KAAK,GAAG,OAAO,CAAC;CAC9B,MAAM,UAAkC,CAAC;CACzC,KAAK,MAAM,CAAC,MAAM,UAAU,OAAO,QAAQ,KAAK,GAC/C,IAAI,SAAS,KAAK,KAAK,eAAe,KAAK,GAAG,QAAQ,QAAQ,OAAO,KAAK;CAE3E,OAAO;AACR;;;;;;;;;;AAWA,SAAgB,sBACf,SACA,UACA,MACA,OACkB;CAClB,MAAM,WAAW,QAAQ;CACzB,MAAM,iBAAoC,OAAO,QAAQ,QAAQ,QAAQ,OAAO,CAAC,CAAC,KAChF,CAAC,MAAM,YAAY;EAAE;EAAM;CAAM,EACnC;CACA,MAAM,kBACL,aAAa,KAAA,IACV,CAAC,IACD,OAAO,QAAQ,SAAS,OAAO,CAAC,CAAC,KAAK,CAAC,MAAM,YAAY;EAAE;EAAM;CAAM,EAAE;CAC7E,MAAM,QAA2B,CAAC;CAClC,IAAI,IAAI,SAAS,QAAQ,QAAQ,GAAG,GACnC,KAAK,MAAM,CAAC,MAAM,UAAU,IAAI,IAAI,QAAQ,QAAQ,GAAG,CAAC,CAAC,cACxD,MAAM,KAAK;EAAE;EAAM;CAAM,CAAC;CAG5B,MAAM,OAAO,QAAQ,QAAQ;CAC7B,MAAM,cACL,OAAO,QAAQ,QAAQ,QAAQ,OAAO,CAAC,CAAC,MACtC,CAAC,UAAU,KAAK,YAAY,MAAM,cACpC,CAAC,GAAG,MAAM;CACX,MAAM,WACL,aAAa,KAAA,IACV,KACC,OAAO,QAAQ,SAAS,OAAO,CAAC,CAAC,MACjC,CAAC,UAAU,KAAK,YAAY,MAAM,UACpC,CAAC,GAAG,MAAM;CACb,MAAM,SAAS,UAAU;CACzB,MAAM,MAAM,QAAQ,QAAQ,KAAA,IAAY,KAAK,KAAK,IAAI,GAAG,OAAO,IAAI,MAAM,OAAO,IAAI,KAAK;CAC1F,MAAM,UACL,QAAQ,YAAY,KAAA,IAAY,KAAK,KAAK,IAAI,GAAG,OAAO,QAAQ,MAAM,OAAO,QAAQ,KAAK;CAC3F,MAAM,OAAO,QAAQ,SAAS,KAAA,IAAY,IAAI,KAAK,IAAI,GAAG,OAAO,KAAK,MAAM,OAAO,KAAK,KAAK;CAC7F,MAAM,OACL,QAAQ,YAAY,KAAA,IACjB,KAAK,IAAI,GAAG,QAAQ,IACpB,KAAK,IAAI,GAAG,OAAO,WAAW,OAAO,MAAM,OAAO,EAAE;CACxD,MAAM,MAAM,QAAQ,QAAQ,KAAA,IAAY,KAAK,KAAK,IAAI,GAAG,OAAO,IAAI,MAAM,OAAO,IAAI,KAAK;CAC1F,MAAM,OAAO,SAAS,KAAA,IAAY,KAAA,IAAY,aAAa,IAAI;CAC/D,MAAM,OAAO,MAAM,eAAe,aAAa,KAAA,IAAY,IAAI;CAE/D,OAAO;EACN,iBAAiB,IAAI,KAAK,QAAQ,OAAO,CAAC,CAAC,YAAY;EACvD,MAAM,KAAK,IAAI,GAAG,QAAQ;EAC1B,SAAS;GACR,QAAQ,QAAQ,QAAQ;GACxB,KAAK,QAAQ,QAAQ;GACrB,aAAa,UAAU,YAAY;GACnC,SAAS,CAAC;GACV,SAAS;GACT,aAAa;GACb,GAAI,SAAS,KAAA,IACV,EACA,UAAU;IACT,UAAU;IACV,MAAM;GACP,EACD,IACC,CAAC;GACJ,aAAa;GACb,UAAU,SAAS,KAAA,IAAY,IAAI,YAAY,IAAI,CAAC,CAAC;EACtD;EACA,UAAU;GACT,QAAQ,UAAU,UAAU;GAC5B,YAAY,UAAU,UAAU,SAAS;GACzC,aAAa,UAAU,YAAY;GACnC,SAAS,CAAC;GACV,SAAS;GACT,SAAS;IACR;IACA,UAAU,UAAU,QAAQ;IAC5B,GAAI,SAAS,KAAA,IAAY;KAAE;KAAM,UAAU;IAAS,IAAI,CAAC;GAC1D;GACA,aAAa;GACb,aAAa;GACb,UAAU;EACX;EACA,OAAO,CAAC;EACR,SAAS;GACR,SAAS;GACT;GACA;GACA;GACA;GACA,SAAS,KAAK,IAAI,GAAG,WAAW,OAAO,IAAI;GAC3C;EACD;CACD;AACD;;;;;;;AAQA,SAAgB,0BACf,SACmC;CACnC,MAAM,SAAiC,CAAC;CACxC,KAAK,MAAM,UAAU,SACpB,OAAO,eAAe,QAAQ,OAAO,MAAM;EAC1C,OAAO,OAAO;EACd,YAAY;EACZ,cAAc;EACd,UAAU;CACX,CAAC;CAEF,OAAO;AACR;;;;;;AAOA,SAAgB,mBAAmB,OAA6C;CAC/E,IACC,CAAC,SAAS,KAAK,KACf,CAAC,SAAS,MAAM,MAAM,KACtB,MAAM,MAAM,CAAC,eAAe,SAC5B,CAAC,SAAS,MAAM,MAAM,CAAC,UAAU,KACjC,CAAC,SAAS,MAAM,MAAM,CAAC,UAAU,CAAC,OAAO,KACzC,CAAC,SAAS,MAAM,MAAM,CAAC,UAAU,CAAC,UAAU,KAC5C,CAAC,QAAQ,MAAM,MAAM,CAAC,UAAU,GAEhC,MAAM,IAAI,aAAa,mCAAmC;CAE3D,KAAK,MAAM,CAAC,OAAO,UAAU,MAAM,MAAM,CAAC,UAAU,CAAC,QAAQ,GAAG;EAC/D,IACC,CAAC,SAAS,KAAK,KACf,CAAC,SAAS,MAAM,kBAAkB,KAClC,CAAC,eAAe,KAAK,MAAM,MAAM,kBAAkB,CAAC,KACpD,CAAC,eAAe,MAAM,OAAO,KAC7B,MAAM,UAAU,KAChB,CAAC,SAAS,MAAM,UAAU,KAC1B,CAAC,SAAS,MAAM,UAAU,CAAC,MAAM,KACjC,CAAC,IAAI,SAAS,MAAM,UAAU,CAAC,MAAM,KACrC,CAAC,SAAS,MAAM,UAAU,CAAC,SAAS,KACpC,CAAC,SAAS,MAAM,UAAU,CAAC,cAAc,KACzC,CAAC,QAAQ,MAAM,UAAU,CAAC,UAAU,KACpC,CAAC,QAAQ,MAAM,UAAU,CAAC,UAAU,KACpC,CAAC,QAAQ,MAAM,UAAU,CAAC,cAAc,KACxC,CAAC,UAAU,MAAM,UAAU,CAAC,cAAc,KAC1C,MAAM,UAAU,CAAC,iBAAiB,MAClC,CAAC,UAAU,MAAM,UAAU,CAAC,WAAW,KACvC,MAAM,UAAU,CAAC,cAAc,MAC/B,CAAC,SAAS,MAAM,WAAW,KAC3B,CAAC,UAAU,MAAM,WAAW,CAAC,SAAS,KACtC,MAAM,WAAW,CAAC,YAAY,KAC9B,MAAM,WAAW,CAAC,YAAY,OAC9B,CAAC,SAAS,MAAM,WAAW,CAAC,aAAa,KACzC,CAAC,SAAS,MAAM,WAAW,CAAC,cAAc,KAC1C,CAAC,QAAQ,MAAM,WAAW,CAAC,UAAU,KACrC,CAAC,QAAQ,MAAM,WAAW,CAAC,UAAU,KACrC,CAAC,SAAS,MAAM,WAAW,CAAC,UAAU,KACtC,CAAC,SAAS,MAAM,WAAW,CAAC,cAAc,KAC1C,CAAC,UAAU,MAAM,WAAW,CAAC,cAAc,KAC3C,MAAM,WAAW,CAAC,iBAAiB,MACnC,CAAC,UAAU,MAAM,WAAW,CAAC,WAAW,KACxC,MAAM,WAAW,CAAC,cAAc,MAChC,CAAC,SAAS,MAAM,QAAQ,KACxB,CAAC,SAAS,MAAM,UAAU,GAE1B,MAAM,IAAI,aAAa,kCAAkC,KAAA,GAAW,EAAE,MAAM,CAAC;EAE9E,KAAK,MAAM,CAAC,aAAa,WAAW,MAAM,UAAU,CAAC,UAAU,CAAC,QAAQ,GACvE,IACC,CAAC,SAAS,MAAM,KAChB,CAAC,SAAS,OAAO,OAAO,KACxB,CAAC,SAAS,OAAO,QAAQ,KACxB,OAAO,YAAY,KAAA,KAAa,CAAC,SAAS,OAAO,OAAO,KACxD,OAAO,cAAc,KAAA,KAAa,CAAC,SAAS,OAAO,SAAS,KAC5D,OAAO,eAAe,KAAA,KAAa,CAAC,SAAS,OAAO,UAAU,KAC9D,OAAO,gBAAgB,KAAA,KAAa,CAAC,UAAU,OAAO,WAAW,KACjE,OAAO,cAAc,KAAA,KAAa,CAAC,UAAU,OAAO,SAAS,GAE9D,MAAM,IAAI,aAAa,2CAA2C,KAAA,GAAW;GAC5E;GACA,QAAQ;EACT,CAAC;EAGH,KAAK,MAAM,CAAC,aAAa,WAAW,MAAM,UAAU,CAAC,UAAU,CAAC,QAAQ,GACvE,IAAI,CAAC,SAAS,MAAM,KAAK,CAAC,SAAS,OAAO,OAAO,KAAK,CAAC,SAAS,OAAO,QAAQ,GAC9E,MAAM,IAAI,aAAa,2CAA2C,KAAA,GAAW;GAC5E;GACA,QAAQ;EACT,CAAC;EAGH,KAAK,MAAM,CAAC,YAAY,UAAU,MAAM,UAAU,CAAC,cAAc,CAAC,QAAQ,GACzE,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,MAAM,OAAO,KAAK,CAAC,SAAS,MAAM,QAAQ,GAC3E,MAAM,IAAI,aAAa,wCAAwC,KAAA,GAAW;GACzE;GACA,OAAO;EACR,CAAC;EAGH,MAAM,OAAO,MAAM,UAAU,CAAC;EAC9B,IACC,SAAS,KAAA,MACR,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,KAAK,WAAW,KAAK,CAAC,SAAS,KAAK,OAAO,IAEzE,MAAM,IAAI,aAAa,yCAAyC,KAAA,GAAW,EAAE,MAAM,CAAC;EAErF,KAAK,MAAM,CAAC,aAAa,WAAW,MAAM,WAAW,CAAC,UAAU,CAAC,QAAQ,GACxE,IACC,CAAC,SAAS,MAAM,KAChB,CAAC,SAAS,OAAO,OAAO,KACxB,CAAC,SAAS,OAAO,QAAQ,KACxB,OAAO,YAAY,KAAA,KAAa,CAAC,SAAS,OAAO,OAAO,KACxD,OAAO,cAAc,KAAA,KAAa,CAAC,SAAS,OAAO,SAAS,KAC5D,OAAO,eAAe,KAAA,KAAa,CAAC,SAAS,OAAO,UAAU,KAC9D,OAAO,gBAAgB,KAAA,KAAa,CAAC,UAAU,OAAO,WAAW,KACjE,OAAO,cAAc,KAAA,KAAa,CAAC,UAAU,OAAO,SAAS,GAE9D,MAAM,IAAI,aAAa,4CAA4C,KAAA,GAAW;GAC7E;GACA,QAAQ;EACT,CAAC;EAGH,KAAK,MAAM,CAAC,aAAa,WAAW,MAAM,WAAW,CAAC,UAAU,CAAC,QAAQ,GACxE,IAAI,CAAC,SAAS,MAAM,KAAK,CAAC,SAAS,OAAO,OAAO,KAAK,CAAC,SAAS,OAAO,QAAQ,GAC9E,MAAM,IAAI,aAAa,4CAA4C,KAAA,GAAW;GAC7E;GACA,QAAQ;EACT,CAAC;EAGH,MAAM,OAAO,MAAM,WAAW,CAAC,UAAU,CAAC;EAC1C,MAAM,WAAW,MAAM,WAAW,CAAC,UAAU,CAAC;EAC9C,IACC,CAAC,UAAU,MAAM,WAAW,CAAC,UAAU,CAAC,OAAO,KAC/C,MAAM,WAAW,CAAC,UAAU,CAAC,UAAU,MACvC,CAAC,SAAS,MAAM,WAAW,CAAC,UAAU,CAAC,WAAW,KACjD,SAAS,KAAA,KAAa,CAAC,SAAS,IAAI,KACpC,aAAa,KAAA,KAAa,aAAa,YACvC,aAAa,aACZ,SAAS,KAAA,KACT,CAAC,mEAAmE,KAAK,IAAI,IAE/E,MAAM,IAAI,aAAa,6CAA6C,KAAA,GAAW,EAAE,MAAM,CAAC;EAEzF,KAAK,MAAM,QAAQ;GAAC;GAAW;GAAO;GAAW;GAAQ;GAAQ;GAAW;EAAK,GAAG;GACnF,MAAM,SAAS,MAAM,UAAU,CAAC;GAChC,IAAI,CAAC,eAAe,MAAM,KAAK,SAAS,IACvC,MAAM,IAAI,aAAa,mCAAmC,KAAA,GAAW;IACpE;IACA,QAAQ;GACT,CAAC;EAEH;CACD;AACD;;;;;;;;AASA,SAAgB,oBAAoB,SAAyB,OAAmC;CAC/F,IAAI,MAAM,WAAW,KAAA,KAAa,QAAQ,WAAW,MAAM,QAAQ,OAAO;CAC1E,IAAI,MAAM,aAAa,KAAA,KAAa,QAAQ,aAAa,MAAM,UAAU,OAAO;CAChF,IAAI,MAAM,QAAQ,KAAA,GAAW,OAAO;CACpC,OAAO,kBAAkB,QAAQ,KAAK,MAAM,GAAG;AAChD;;;;;;;;AASA,SAAgB,kBAAkB,KAAa,SAA0B;CACxE,MAAM,SAAS,QACb,QAAQ,sBAAsB,MAAM,CAAC,CACrC,QAAQ,SAAS,iBAAiB,CAAC,CACnC,QAAQ,OAAO,OAAO,CAAC,CACvB,QAAQ,wBAAwB,IAAI;CACtC,OAAO,IAAI,OAAO,IAAI,OAAO,EAAE,CAAC,CAAC,KAAK,GAAG;AAC1C;;;;;;;;AASA,SAAgB,4BAA4B,OAAwB;CACnE,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,MAAM,aAAa,GACpD,MAAM,IAAI,aAAa,6CAA6C;CAErE,OAAO,MAAM;AACd;;;;;;AAOA,SAAgB,qBAAqB,OAA2B;CAC/D,IAAI,CAAC,eAAe,MAAM,CAAC,KAAK,CAAC,eAAe,MAAM,CAAC,GACtD,MAAM,IAAI,aAAa,4CAA4C,KAAA,GAAW,EAAE,MAAM,CAAC;AAEzF;;;;;;;;;;;AAYA,SAAgB,4BAA4B,SAAyC;CACpF,IAAI,SAAS,UAAU,KAAA,MAAc,CAAC,eAAe,QAAQ,KAAK,KAAK,QAAQ,QAAQ,IACtF,MAAM,IAAI,aAAa,uDAAuD,KAAA,GAAW,EACxF,OAAO,QAAQ,MAChB,CAAC;CAEF,IAAI,SAAS,UAAU,KAAA,MAAc,CAAC,UAAU,QAAQ,KAAK,KAAK,QAAQ,SAAS,IAClF,MAAM,IAAI,aAAa,kDAAkD,KAAA,GAAW,EACnF,OAAO,QAAQ,MAChB,CAAC;CAEF,IAAI,SAAS,UAAU,KAAA,MAAc,CAAC,UAAU,QAAQ,KAAK,KAAK,QAAQ,SAAS,IAClF,MAAM,IAAI,aAAa,iDAAiD,KAAA,GAAW,EAClF,OAAO,QAAQ,MAChB,CAAC;CAEF,IAAI,SAAS,aAAa,KAAA,GAAW,qBAAqB,QAAQ,QAAQ;AAC3E;;;;;;AAOA,SAAgB,uBAAuB,SAAuB;CAC7D,IAAI,CAAC,eAAe,OAAO,KAAK,UAAU,GACzC,MAAM,IAAI,aAAa,wDAAwD,KAAA,GAAW,EACzF,QACD,CAAC;AAEH;;;;;;AAOA,SAAgB,wBAAwB,UAAiC;CACxE,IACC,CAAC,UAAU,SAAS,KAAK,KACzB,SAAS,SAAS,KAClB,CAAC,UAAU,SAAS,MAAM,KAC1B,SAAS,UAAU,GAEnB,MAAM,IAAI,aAAa,yDAAyD,KAAA,GAAW,EAC1F,SACD,CAAC;CAEF,IAAI,SAAS,UAAU,KAAA,MAAc,CAAC,eAAe,SAAS,KAAK,KAAK,SAAS,SAAS,IACzF,MAAM,IAAI,aAAa,sDAAsD,KAAA,GAAW,EACvF,OAAO,SAAS,MACjB,CAAC;AAEH;;;;;;AAOA,SAAgB,gCAAgC,SAAwC;CACvF,IAAI,QAAQ,aAAa,KAAA,GAAW,wBAAwB,QAAQ,QAAQ;CAC5E,IAAI,QAAQ,SAAS,KAAA,KAAa,QAAQ,KAAK,MAAM,WAAW,GAC/D,MAAM,IAAI,aAAa,oCAAoC;CAE5D,IAAI,QAAQ,WAAW,KAAA,KAAa,QAAQ,OAAO,WAAW,GAC7D,MAAM,IAAI,aAAa,gCAAgC;CAExD,IAAI,QAAQ,aAAa,KAAA,KAAa,QAAQ,SAAS,WAAW,GACjE,MAAM,IAAI,aAAa,kCAAkC;CAE1D,IAAI,QAAQ,gBAAgB,KAAA,GAAW;EACtC,MAAM,WAAW,QAAQ;EACzB,IACC,CAAC,eAAe,SAAS,QAAQ,KACjC,SAAS,WAAW,OACpB,SAAS,WAAW,MACpB,CAAC,eAAe,SAAS,SAAS,KAClC,SAAS,YAAY,QACrB,SAAS,YAAY,OACpB,SAAS,aAAa,KAAA,MACrB,CAAC,eAAe,SAAS,QAAQ,KAAK,SAAS,WAAW,IAE5D,MAAM,IAAI,aAAa,0DAA0D,KAAA,GAAW,EAC3F,SACD,CAAC;CAEH;CACA,KAAK,MAAM,QAAQ,OAAO,KAAK,QAAQ,WAAW,CAAC,CAAC,GACnD,IAAI,KAAK,WAAW,GAAG,MAAM,IAAI,aAAa,qCAAqC;AAErF;;;;;;AAOA,SAAgB,8BAA8B,SAAuC;CACpF,IAAI,YAAY,KAAA,GAAW;CAC3B,IAAI,QAAQ,cAAc,KAAA,GAAW,gCAAgC,QAAQ,SAAS;CACtF,IAAI,QAAQ,UAAU,KAAA,GAAW;EAChC,IAAI,QAAQ,MAAM,OAAO,WAAW,GACnC,MAAM,IAAI,aAAa,sCAAsC;EAE9D,IAAI,QAAQ,MAAM,QAAQ,MAAM,UAAU,MAAM,WAAW,CAAC,MAAM,MACjE,MAAM,IAAI,aAAa,8CAA8C;CAEvE;CACA,KAAK,MAAM,UAAU,QAAQ,WAAW,CAAC,GAAG;EAC3C,MAAM,SAAS,cAAc,IAAI,IAAI,MAAM,CAAC;EAC5C,IAAI,CAAC,OAAO,SACX,MAAM,IAAI,aAAa,wCAAwC,KAAA,GAAW,EAAE,OAAO,CAAC;EAErF,MAAM,MAAM,OAAO;EACnB,IACE,IAAI,aAAa,WAAW,IAAI,aAAa,YAC9C,IAAI,WAAW,OAAO,QAAQ,OAAO,EAAE,GAEvC,MAAM,IAAI,aACT,6DACA,KAAA,GACA,EACC,OACD,CACD;CAEF;CACA,IAAI,QAAQ,cAAc,KAAA,KAAa,QAAQ,UAAU,KAAK,WAAW,GACxE,MAAM,IAAI,aAAa,uCAAuC;AAEhE;;;;;;AAOA,SAAgB,oCAAoC,SAA6C;CAChG,IAAI,SAAS,SAAS,KAAA,MAAc,CAAC,UAAU,QAAQ,IAAI,KAAK,QAAQ,QAAQ,IAC/E,MAAM,IAAI,aAAa,yDAAyD,KAAA,GAAW,EAC1F,MAAM,QAAQ,KACf,CAAC;CAEF,IAAI,SAAS,UAAU,KAAA,MAAc,CAAC,UAAU,QAAQ,KAAK,KAAK,QAAQ,QAAQ,IACjF,MAAM,IAAI,aACT,8DACA,KAAA,GACA,EAAE,OAAO,QAAQ,MAAM,CACxB;AAEF;;;;;;;AAQA,SAAgB,mBAAmB,SAAgE;CAClG,MAAM,SAAkC;EACvC,WAAW,SAAS,aAAa;EACjC,iBAAiB,SAAS,cAAc;EACxC,qBAAqB,SAAS,WAAW,KAAA,KAAa,SAAS,WAAW,KAAA;EAC1E,mBAAmB,SAAS,UAAU;EACtC,yBAAyB,SAAS,WAAW;CAC9C;CACA,IAAI,SAAS,UAAU,KAAA,GAAW;EACjC,qBAAqB,QAAQ,OAAO,aAAa,IAAK,CAAC;EACvD,OAAO,WAAW,QAAQ;CAC3B;CACA,IAAI,SAAS,UAAU,KAAA,GAAW;EACjC,qBAAqB,QAAQ,OAAO,aAAa,GAAG,OAAO,WAAW,KAAK;EAC3E,OAAO,gBAAgB,QAAQ;CAChC;CACA,IAAI,SAAS,WAAW,KAAA,GAAW;EAClC,qBAAqB,QAAQ,QAAQ,cAAc,GAAG,OAAO,WAAW,KAAK;EAC7E,OAAO,iBAAiB,QAAQ;CACjC;CACA,IAAI,SAAS,WAAW,KAAA,GAAW,OAAO,gBAAgB,QAAQ;CAClE,IAAI,SAAS,WAAW,KAAA,GAAW,OAAO,oBAAoB,QAAQ;CACtE,IAAI,SAAS,WAAW,KAAA,GAAW,OAAO,oBAAoB,QAAQ;CACtE,KAAK,MAAM,CAAC,MAAM,UAAU,OAAO,QAAQ,SAAS,UAAU,CAAC,CAAC,GAAG;EAClE,IAAI,CAAC,eAAe,KAAK,GAAG;EAC5B,qBAAqB,OAAO,OAAO,KAAK,UAAU,GAAG,OAAO,SAAS;EACrE,OAAO,SAAS,KAAK,EAAE,EAAE,YAAY,IAAI,KAAK,MAAM,CAAC,OAAO;CAC7D;CACA,OAAO;AACR;;;;;;;AAQA,SAAgB,0BACf,SACoC;CACpC,MAAM,SAAS,SAAS,UAAU;CAClC,IAAI,SAAS,YAAY,KAAA,GAAW;EACnC,IAAI,WAAW,QACd,MAAM,IAAI,aAAa,mDAAmD;EAE3E,IAAI,CAAC,UAAU,QAAQ,OAAO,KAAK,QAAQ,UAAU,KAAK,QAAQ,UAAU,KAC3E,MAAM,IAAI,aAAa,6DAA6D;CAEtF;CACA,IAAI,SAAS,SAAS,QAAQ,QAAQ,SAAS,KAAA,GAC9C,MAAM,IAAI,aAAa,8DAA8D;CAEtF,MAAM,SAAkC;EACvC;EACA,aAAa;CACd;CACA,IAAI,SAAS,YAAY,KAAA,GAAW,OAAO,aAAa,QAAQ;CAChE,IAAI,SAAS,SAAS,KAAA,GAAW;EAChC,MAAM,CAAC,GAAG,GAAG,OAAO,UAAU,QAAQ;EACtC,qBAAqB,GAAG,qBAAqB,CAAC,OAAO,WAAW,OAAO,SAAS;EAChF,qBAAqB,GAAG,qBAAqB,CAAC,OAAO,WAAW,OAAO,SAAS;EAChF,qBAAqB,OAAO,yBAAyB,GAAG,OAAO,WAAW,KAAK;EAC/E,qBAAqB,QAAQ,0BAA0B,GAAG,OAAO,WAAW,KAAK;EACjF,OAAO,UAAU;GAAE;GAAG;GAAG;GAAO;GAAQ,OAAO;EAAE;EACjD,OAAO,2BAA2B;CACnC;CACA,OAAO;AACR;;;;;;;;;;AAWA,SAAgB,qBACf,OACA,OACA,SACA,SACA,YAAY,MACL;CACP,IACC,CAAC,eAAe,KAAK,MACpB,YAAY,QAAQ,UAAU,SAAS,YACxC,QAAQ,SAER,MAAM,IAAI,aAAa,GAAG,MAAM,8BAA8B,KAAA,GAAW;EACxE;EACA;EACA;EACA;CACD,CAAC;AAEH;;;;;;;;AASA,SAAgB,yBAAyB,OAA8C;CACtF,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,QAAQ,MAAM,QAAQ,GAC9C,MAAM,IAAI,aAAa,yCAAyC;CAEjE,MAAM,QAAyB,CAAC;CAChC,KAAK,MAAM,CAAC,OAAO,cAAc,MAAM,QAAQ,CAAC,QAAQ,GAAG;EAC1D,IAAI,CAAC,SAAS,SAAS,KAAK,CAAC,SAAS,UAAU,SAAS,GACxD,MAAM,IAAI,aAAa,2CAA2C,KAAA,GAAW,EAAE,MAAM,CAAC;EAEvF,MAAM,WAAW,QAAQ,UAAU,WAAW,IAAI,UAAU,WAAW,CAAC,OAAO,QAAQ,IAAI,CAAC;EAC5F,MAAM,aAAsC,CAAC;EAC7C,IAAI,QAAQ,UAAU,aAAa,GAClC,KAAK,MAAM,YAAY,UAAU,eAAe;GAC/C,IAAI,CAAC,SAAS,QAAQ,KAAK,CAAC,SAAS,SAAS,OAAO,GAAG;GACxD,WAAW,SAAS,WAAW,mBAAmB,SAAS,QAAQ;EACpE;EAED,MAAM,KAAK;GACV,IAAI,UAAU;GACd,QAAQ,SAAS,UAAU,WAAW,IAAI,UAAU,cAAc,KAAA;GAClE;GACA,SAAS,UAAU,UAAU,mBAAmB,IAAI,UAAU,sBAAsB,KAAA;GACpF,OAAO,SAAS,UAAU,UAAU,IAAI,UAAU,aAAa,KAAA;GAC/D,SAAS,UAAU,eAAe;GAClC,MAAM,qBAAqB,UAAU,OAAO;GAC5C,MAAM,qBAAqB,UAAU,OAAO;GAC5C,aAAa,qBAAqB,UAAU,cAAc;GAC1D,OAAO,mBAAmB,UAAU,QAAQ;GAC5C;EACD,CAAC;CACF;CACA,OAAO;EACN,OAAO,MAAM,QAAQ,SAAS,KAAK,WAAW,KAAA,CAAS,CAAC,CAAC,KAAK,SAAS,KAAK,EAAE;EAC9E;CACD;AACD;;;;;;;AAQA,SAAgB,mBAAmB,OAAyB;CAC3D,OAAO,SAAS,KAAK,KAAK,WAAW,QAAQ,MAAM,WAAW,KAAA;AAC/D;;;;;;;AAQA,SAAgB,YAAY,QAA2C;CACtE,MAAM,QAAQ,OAAO,QAAQ,OAAO,UAAU,QAAQ,MAAM,YAAY,CAAC;CACzE,MAAM,SAAS,IAAI,WAAW,KAAK;CACnC,IAAI,SAAS;CACb,KAAK,MAAM,SAAS,QAAQ;EAC3B,OAAO,IAAI,OAAO,MAAM;EACxB,UAAU,MAAM;CACjB;CACA,OAAO;AACR;;;;;;;AAQA,SAAgB,uBAAuB,OAAoC;CAC1E,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,MAAM,OAAO,GAC9C,MAAM,IAAI,aAAa,sCAAsC;CAE9D,OAAO;EACN,OACC,MAAM,qBAAqB,OAAO,aAAa,MAAM,OAAO,IAAI,YAAY,MAAM,OAAO;EAC1F,KAAK,MAAM,WAAW;CACvB;AACD;;;;;;;AAQA,SAAgB,0BAA0B,OAAkD;CAC3F,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,QAAQ,MAAM,SAAS,GAC/C,MAAM,IAAI,aAAa,0CAA0C;CAElE,OAAO,MAAM,SAAS,CAAC,KAAK,QAAQ,UAAU;EAC7C,IACC,CAAC,SAAS,MAAM,KAChB,CAAC,SAAS,OAAO,WAAW,KAC5B,CAAC,SAAS,OAAO,MAAM,KACvB,CAAC,QAAQ,OAAO,YAAY,GAE5B,MAAM,IAAI,aAAa,8CAA8C,KAAA,GAAW,EAAE,MAAM,CAAC;EAE1F,MAAM,YAAuC,OAAO,YAAY,CAAC,KAAK,OAAO,kBAAkB;GAC9F,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,MAAM,eAAe,KAAK,CAAC,QAAQ,MAAM,SAAS,GACnF,MAAM,IAAI,aAAa,gDAAgD,KAAA,GAAW;IACjF;IACA,UAAU;GACX,CAAC;GAEF,OAAO;IACN,MAAM,MAAM;IACZ,QAAQ,0BAA0B,MAAM,WAAW,KAAK;IACxD,OAAO,MAAM,uBAAuB;GACrC;EACD,CAAC;EACD,OAAO;GACN,IAAI,OAAO;GACX,KAAK,OAAO;GACZ;EACD;CACD,CAAC;AACF;;;;;;;AAQA,SAAgB,yBAAyB,OAAiD;CACzF,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,QAAQ,MAAM,YAAY,GAClD,MAAM,IAAI,aAAa,mCAAmC;CAE3D,MAAM,yBAAS,IAAI,IAAoC;CACvD,KAAK,MAAM,CAAC,OAAO,UAAU,MAAM,YAAY,CAAC,QAAQ,GAAG;EAC1D,IACC,CAAC,SAAS,KAAK,KACf,CAAC,SAAS,MAAM,eAAe,KAC/B,CAAC,UAAU,MAAM,cAAc,KAC/B,MAAM,iBAAiB,KACvB,CAAC,UAAU,MAAM,YAAY,KAC7B,MAAM,eAAe,MAAM,gBAE3B,MAAM,IAAI,aAAa,2CAA2C,KAAA,GAAW,EAAE,MAAM,CAAC;EAEvF,MAAM,SAAS,OAAO,IAAI,MAAM,eAAe,KAAK,CAAC;EACrD,OAAO,KAAK;GACX,OAAO,MAAM;GACb,KAAK,MAAM;GACX,OAAO,MAAM,YAAY,OAAO,IAAI;EACrC,CAAC;EACD,OAAO,IAAI,MAAM,iBAAiB,MAAM;CACzC;CACA,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC,KAAK,CAAC,IAAI,aAAa;EAAE;EAAI;CAAO,EAAE;AAC1D;;;;;;;;AASA,SAAgB,0BACf,OACA,QACkC;CAClC,IAAI,CAAC,QAAQ,KAAK,GACjB,MAAM,IAAI,aAAa,yCAAyC,KAAA,GAAW,EAAE,OAAO,CAAC;CAEtF,OAAO,MAAM,KAAK,OAAO,UAAU;EAClC,IACC,CAAC,SAAS,KAAK,KACf,CAAC,UAAU,MAAM,cAAc,KAC/B,MAAM,iBAAiB,KACvB,CAAC,UAAU,MAAM,YAAY,KAC7B,MAAM,eAAe,MAAM,kBAC3B,CAAC,UAAU,MAAM,QAAQ,KACzB,MAAM,WAAW,GAEjB,MAAM,IAAI,aAAa,uCAAuC,KAAA,GAAW;GACxE;GACA;EACD,CAAC;EAEF,OAAO;GACN,OAAO,MAAM;GACb,KAAK,MAAM;GACX,OAAO,MAAM;EACd;CACD,CAAC;AACF;;;;;;;AAQA,SAAgB,mBAAmB,OAA0C;CAC5E,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,QAAQ,MAAM,UAAU,GAChD,MAAM,IAAI,aAAa,2CAA2C;CAEnE,OAAO,MAAM,UAAU,CAAC,KAAK,QAAQ,UAAU;EAC9C,IAAI,CAAC,SAAS,MAAM,KAAK,CAAC,SAAS,OAAO,OAAO,KAAK,CAAC,eAAe,OAAO,QAAQ,GACpF,MAAM,IAAI,aAAa,2CAA2C,KAAA,GAAW,EAAE,MAAM,CAAC;EAEvF,OAAO;GAAE,MAAM,OAAO;GAAS,OAAO,OAAO;EAAS;CACvD,CAAC;AACF;;;;;;;AAQA,SAAgB,mBAAmB,OAAgC;CAClE,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,MAAM,UAAU,GACjD,MAAM,IAAI,aAAa,kCAAkC;CAE1D,MAAM,UAAU,MAAM;CACtB,IACC,CAAC,eAAe,QAAQ,YAAY,KACpC,CAAC,eAAe,QAAQ,UAAU,KAClC,QAAQ,aAAa,QAAQ,gBAC7B,CAAC,QAAQ,QAAQ,QAAQ,GAEzB,MAAM,IAAI,aAAa,2CAA2C;CAEnE,MAAM,QAA8B,QAAQ,QAAQ,CAAC,KAAK,MAAM,UAAU;EACzE,IACC,CAAC,SAAS,IAAI,KACd,CAAC,UAAU,KAAK,KAAK,KACrB,KAAK,QAAQ,KACZ,KAAK,gBAAgB,KAAA,MAAc,CAAC,UAAU,KAAK,WAAW,KAAK,KAAK,cAAc,IAEvF,MAAM,IAAI,aAAa,yCAAyC,KAAA,GAAW,EAAE,MAAM,CAAC;EAErF,MAAM,WAAW,KAAK,gBAAgB,KAAA,IAAY,CAAC,IAAI,WAAW,KAAK,aAAa,SAAS;EAC7F,IAAI,aAAa,KAAA,KAAa,SAAS,MAAM,UAAU,QAAQ,CAAC,GAC/D,MAAM,IAAI,aAAa,yCAAyC,KAAA,GAAW,EAAE,MAAM,CAAC;EAErF,OAAO;GACN,IAAI,KAAK;GACT,OAAO,wBAAwB,KAAK,cAAc,KAAK;GACvD,KAAK,UAAU,KAAK,WAAW,IAAI,KAAK,cAAc,KAAA;GACtD;EACD;CACD,CAAC;CACD,MAAM,UAAU,QAAQ,eAAe,KAAA,IAAY,CAAC,IAAI,WAAW,QAAQ,YAAY,SAAS;CAChG,IAAI,YAAY,KAAA,KAAa,QAAQ,MAAM,WAAW,SAAS,CAAC,GAC/D,MAAM,IAAI,aAAa,2CAA2C;CAEnE,MAAM,SACL,QAAQ,kBAAkB,KAAA,IAAY,CAAC,IAAI,WAAW,QAAQ,eAAe,cAAc;CAC5F,IAAI,WAAW,KAAA,KAAa,OAAO,MAAM,UAAU,QAAQ,CAAC,GAC3D,MAAM,IAAI,aAAa,0CAA0C;CAElE,OAAO;EACN,OAAO,QAAQ;EACf,KAAK,QAAQ;EACb;EACA;EACA;CACD;AACD;;;;;;;;AASA,SAAgB,wBAAwB,OAAgB,MAAmC;CAC1F,IACC,CAAC,SAAS,KAAK,KACf,CAAC,SAAS,MAAM,eAAe,KAC/B,CAAC,SAAS,MAAM,WAAW,KAC3B,CAAC,SAAS,MAAM,MAAM,KACtB,CAAC,UAAU,MAAM,aAAa,KAC9B,CAAC,UAAU,MAAM,eAAe,GAEhC,MAAM,IAAI,aAAa,+CAA+C,KAAA,GAAW,EAAE,KAAK,CAAC;CAE1F,OAAO;EACN,UAAU,MAAM;EAChB,QAAQ,MAAM;EACd,KAAK,MAAM;EACX,MAAM,MAAM;EACZ,QAAQ,MAAM;CACf;AACD;;;;;;;AAQA,SAAgB,iBAAiB,QAA+D;CAC/F,IAAI,OAAO,KAAK,WAAW,GAAG,MAAM,IAAI,aAAa,qCAAqC;CAC1F,IAAI,OAAO,QAAQ,KAAA,MAAc,OAAO,WAAW,KAAA,KAAa,OAAO,SAAS,KAAA,IAC/E,MAAM,IAAI,aAAa,0DAA0D,KAAA,GAAW,EAC3F,MAAM,OAAO,KACd,CAAC;CAEF,IAAI,OAAO,QAAQ,KAAA,KAAa,CAAC,IAAI,SAAS,OAAO,GAAG,GACvD,MAAM,IAAI,aAAa,oCAAoC,KAAA,GAAW;EACrE,MAAM,OAAO;EACb,KAAK,OAAO;CACb,CAAC;CAEF,IAAI,OAAO,YAAY,KAAA,KAAa,CAAC,eAAe,OAAO,OAAO,GACjE,MAAM,IAAI,aAAa,wCAAwC,KAAA,GAAW;EACzE,MAAM,OAAO;EACb,SAAS,OAAO;CACjB,CAAC;CAEF,MAAM,SAAkC;EACvC,MAAM,OAAO;EACb,OAAO,OAAO;CACf;CACA,IAAI,OAAO,QAAQ,KAAA,GAAW,OAAO,SAAS,OAAO;CACrD,IAAI,OAAO,WAAW,KAAA,GAAW,OAAO,YAAY,OAAO;CAC3D,IAAI,OAAO,SAAS,KAAA,GAAW,OAAO,UAAU,OAAO;CACvD,IAAI,OAAO,YAAY,KAAA,GAAW,OAAO,aAAa,OAAO;CAC7D,IAAI,OAAO,SAAS,KAAA,GAAW,OAAO,cAAc,OAAO;CAC3D,IAAI,OAAO,WAAW,KAAA,GAAW,OAAO,YAAY,OAAO;CAC3D,IAAI,OAAO,SAAS,KAAA,GAAW,OAAO,cAAc,OAAO;CAC3D,IAAI,OAAO,aAAa,KAAA,GAAW,OAAO,cAAc,OAAO;CAC/D,IAAI,OAAO,cAAc,KAAA,GACxB,OAAO,kBAAkB;EACxB,cAAc,OAAO,UAAU;EAC/B,sBAAsB,OAAO,UAAU,YAAY;CACpD;CAED,OAAO;AACR;;;;;;;AAQA,SAAgB,mBAAmB,OAA0C;CAC5E,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,QAAQ,MAAM,UAAU,GAChD,MAAM,IAAI,aAAa,oCAAoC;CAE5D,OAAO,MAAM,UAAU,CAAC,KAAK,WAAW,UAAU,kBAAkB,WAAW,KAAK,CAAC;AACtF;;;;;;;;AASA,SAAgB,kBAAkB,OAAgB,OAA8B;CAC/E,IACC,CAAC,SAAS,KAAK,KACf,CAAC,SAAS,MAAM,OAAO,KACvB,CAAC,SAAS,MAAM,QAAQ,KACxB,CAAC,SAAS,MAAM,SAAS,KACzB,CAAC,SAAS,MAAM,OAAO,KACvB,CAAC,eAAe,MAAM,UAAU,KAChC,CAAC,UAAU,MAAM,WAAW,KAC5B,CAAC,UAAU,MAAM,SAAS,GAE1B,MAAM,IAAI,aAAa,+BAA+B,KAAA,GAAW,EAAE,MAAM,CAAC;CAE3E,MAAM,WAAW,UAAU,MAAM,aAAa;EAAC;EAAU;EAAO;CAAM,CAAC;CACvE,IAAI,MAAM,gBAAgB,KAAA,KAAa,aAAa,KAAA,GACnD,MAAM,IAAI,aAAa,gDAAgD,KAAA,GAAW,EAAE,MAAM,CAAC;CAE5F,OAAO;EACN,MAAM,MAAM;EACZ,OAAO,MAAM;EACb,QAAQ,MAAM;EACd,MAAM,MAAM;EACZ,SAAS,MAAM;EACf,MAAM,MAAM;EACZ,QAAQ,MAAM;EACd,MAAM;EACN,WAAW,4BAA4B,MAAM,eAAe;CAC7D;AACD;;;;;;;;AASA,SAAgB,wBAAwB,QAAuB,OAAwB;CACtF,MAAM,SAAS,cAAc,IAAI,IAAI,KAAK,CAAC;CAC3C,IAAI,CAAC,OAAO,SACX,MAAM,IAAI,aAAa,oCAAoC,KAAA,GAAW,EAAE,KAAK,MAAM,CAAC;CAErF,MAAM,MAAM,OAAO;CACnB,MAAM,SAAS,OAAO,OAAO,WAAW,GAAG,IAAI,OAAO,OAAO,MAAM,CAAC,IAAI,OAAO;CAC/E,MAAM,gBAAgB,IAAI,aAAa,UAAU,IAAI,SAAS,SAAS,IAAI,QAAQ;CACnF,MAAM,cACL,IAAI,aAAa,OAAO,QACvB,IAAI,SAAS,WAAW,OAAO,IAAI,MAClC,OAAO,KAAK,SAAS,GAAG,KAAK,IAAI,SAAS,OAAO,KAAK,YAAY;CACrE,MAAM,gBAAgB,CAAC,OAAO,UAAU,IAAI,aAAa,YAAY,IAAI,aAAa;CACtF,OAAO,iBAAiB,eAAe;AACxC;;;;;;;;AASA,SAAgB,yBAAyB,OAAgB,QAAsC;CAC9F,IAAI,CAAC,SAAS,KAAK,GAClB,MAAM,IAAI,aAAa,uCAAuC,KAAA,GAAW,EAAE,OAAO,CAAC;CACpF,OAAO;EACN;EACA,OAAO,0BAA0B,MAAM,UAAU,QAAQ,OAAO;EAChE,SAAS,0BAA0B,MAAM,YAAY,QAAQ,SAAS;CACvE;AACD;;;;;;;;;AAUA,SAAgB,0BACf,OACA,QACA,SACiC;CACjC,IAAI,CAAC,QAAQ,KAAK,GACjB,MAAM,IAAI,aAAa,yCAAyC,KAAA,GAAW;EAAE;EAAQ;CAAQ,CAAC;CAE/F,OAAO,MAAM,KAAK,OAAO,UAAU;EAClC,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,MAAM,OAAO,KAAK,CAAC,SAAS,MAAM,QAAQ,GAC3E,MAAM,IAAI,aAAa,sCAAsC,KAAA,GAAW;GACvE;GACA;GACA;EACD,CAAC;EAEF,OAAO;GAAE,MAAM,MAAM;GAAS,OAAO,MAAM;EAAS;CACrD,CAAC;AACF;;;;;;;AAQA,SAAgB,gBACf,OACkD;CAClD,MAAM,WAAoD,CAAC;CAC3D,IAAI,MAAM,WAAW,KAAA,GACpB,SAAS,KAAK;EAAE,MAAM;EAAwB,OAAO,MAAM;CAAO,CAAC;CAEpE,IAAI,MAAM,aAAa,KAAA,GACtB,SAAS,KAAK;EAAE,MAAM;EAAoB,OAAO,MAAM;CAAS,CAAC;CAElE,IAAI,MAAM,WAAW,KAAA,GACpB,SAAS,KAAK;EAAE,MAAM;EAA0B,OAAO,MAAM;CAAO,CAAC;CAEtE,IAAI,MAAM,WAAW,KAAA,GACpB,SAAS,KAAK;EAAE,MAAM;EAAiB,OAAO,MAAM;CAAO,CAAC;CAE7D,OAAO;AACR;;;;;;;AAQA,SAAgB,iBAAiB,OAA8C;CAC9E,MAAM,SAAS,SAAS,KAAK,IAAI,MAAM,gBAAgB;CACvD,IAAI,CAAC,QAAQ,MAAM,GAAG,OAAO,CAAC;CAC9B,MAAM,QAA6B,CAAC;CACpC,KAAK,MAAM,SAAS,QAAQ;EAC3B,IACC,CAAC,SAAS,KAAK,KACf,CAAC,SAAS,MAAM,MAAM,KACtB,CAAC,SAAS,MAAM,eAAe,KAC/B,CAAC,UAAU,MAAM,aAAa,KAC9B,CAAC,UAAU,MAAM,eAAe,GAEhC;EAED,MAAM,KAAK;GACV,KAAK,MAAM;GACX,UAAU,MAAM;GAChB,MAAM,MAAM;GACZ,QAAQ,MAAM;EACf,CAAC;CACF;CACA,OAAO;AACR;;;;;;;;AASA,SAAgB,uBAAuB,OAAyB;CAC/D,IAAI,CAAC,SAAS,KAAK,GAAG,OAAO,KAAA;CAC7B,IAAI,WAAW,OAAO,OAAO,MAAM;CACnC,IAAI,SAAS,MAAM,sBAAsB,GAAG,OAAO,MAAM;CACzD,IAAI,SAAS,MAAM,cAAc,GAAG,OAAO,MAAM;AAElD;;;;;;;;AASA,SAAgB,qBAAqB,OAAyB;CAC7D,IAAI,CAAC,SAAS,KAAK,GAAG,OAAO,KAAA;CAE7B,IAAI,SAAS,MAAM,mBAAmB,GAAG;EACxC,MAAM,UAAU,MAAM;EACtB,IAAI,SAAS,QAAQ,YAAY,KAAK,SAAS,QAAQ,YAAY,CAAC,cAAc,GAAG;GACpF,MAAM,cAAc,QAAQ,YAAY,CAAC;GACzC,MAAM,aAAa,6BAA6B,KAAK,WAAW;GAChE,IAAI,eAAe,MAClB,MAAM,IAAI,wBAAwB,kDAAkD;IACnF,QAAQ,OAAO,WAAW,EAAE;IAC5B,OAAO;GACR,CAAC;GAEF,MAAM,IAAI,aAAa,WAAW;EACnC;EACA,MAAM,IAAI,aAAa,8BAA8B;CACtD;CAEA,MAAM,eAAe,MAAM;CAC3B,IAAI,CAAC,SAAS,YAAY,GAAG,OAAO,KAAA;CACpC,OAAO,WAAW,eAAe,aAAa,WAAW,KAAA;AAC1D;;;;;;;;AASA,SAAgB,qBAAqB,OAAgB,OAAuB;CAC3E,IAAI,SAAS,KAAK,GAAG,OAAO;CAC5B,MAAM,IAAI,aAAa,GAAG,MAAM,kCAAkC;AACnE;;;;;;;;;;;;AAaA,SAAgB,wBACf,SACkC;CAClC,MAAM,SAAiC,CAAC;CAExC,KAAK,MAAM,UAAU,SAAS;EAC7B,MAAM,WAAW,OAAO,OAAO,SAAS;EACxC,IACC,aAAa,KAAA,KACb,SAAS,WAAW,UACpB,OAAO,WAAW,UAClB,SAAS,aAAa,OAAO,UAC5B;GACD,OAAO,OAAO,SAAS,KAAK;GAC5B;EACD;EACA,OAAO,KAAK,MAAM;CACnB;CAEA,OAAO;AACR;;;;;;;;AASA,SAAgB,kBAAkB,OAA6C;CAC9E,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,MAAM,YAAY,GAAG,OAAO,CAAC;CAE/D,MAAM,SAA6B,CAAC;CACpC,MAAM,QAAkD,CAAC,MAAM,YAAY;CAE3E,OAAO,MAAM,SAAS,GAAG;EACxB,MAAM,OAAO,MAAM,IAAI;EACvB,IAAI,SAAS,KAAA,GAAW;EACxB,MAAM,QAAQ,KAAK;EAEnB,IAAI,SAAS,KAAK,KAAK,SAAS,MAAM,KAAK,KAAK,SAAS,MAAM,MAAM,GACpE,OAAO,KAAK;GACX,IAAI,MAAM;GACV,QAAQ,SAAS,MAAM,WAAW,IAAI,MAAM,cAAc,KAAA;GAC1D,MAAM,SAAS,MAAM,OAAO,KAAK,MAAM,YAAY,KAAK,MAAM,UAAU,KAAA;GACxE,KAAK,MAAM;EACZ,CAAC;EAGF,MAAM,WAAW,KAAK;EACtB,IAAI,CAAC,QAAQ,QAAQ,GAAG;EACxB,KAAK,IAAI,QAAQ,SAAS,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG;GAC7D,MAAM,QAAQ,SAAS;GACvB,IAAI,SAAS,KAAK,GAAG,MAAM,KAAK,KAAK;EACtC;CACD;CAEA,OAAO;AACR;;;;;;;;AASA,SAAgB,gBAAgB,OAA6B;CAC5D,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,QAAQ,MAAM,QAAQ,GAC9C,MAAM,IAAI,aAAa,6BAA6B;CAErD,MAAM,SAAS,iBAAiB,MAAM,QAAQ,CAAC,EAAE;CACjD,IAAI,WAAW,KAAA,KAAa,OAAO,WAAW,GAC7C,MAAM,IAAI,aAAa,sCAAsC;CAE9D,MAAM,KAAK,OAAO;CAClB,MAAM,KAAK,OAAO;CAClB,MAAM,KAAK,OAAO;CAClB,MAAM,KAAK,OAAO;CAClB,MAAM,KAAK,OAAO;CAClB,MAAM,KAAK,OAAO;CAClB,MAAM,KAAK,OAAO;CAClB,MAAM,KAAK,OAAO;CAClB,IACC,OAAO,KAAA,KACP,OAAO,KAAA,KACP,OAAO,KAAA,KACP,OAAO,KAAA,KACP,OAAO,KAAA,KACP,OAAO,KAAA,KACP,OAAO,KAAA,KACP,OAAO,KAAA,GAEP,MAAM,IAAI,aAAa,sCAAsC;CAE9D,OAAO;EACN,QAAQ;GAAC;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;EAAE;EACvC,QAAQ;GACP,IAAI,KAAK,KAAK,KAAK,MAAM;GACzB,IAAI,KAAK,KAAK,KAAK,MAAM;EAC1B;CACD;AACD;;;;;;;;;AAUA,SAAgB,oBAAoB,OAA6B;CAChE,MAAM,QAAQ,MAAM,MAAM,GAAG,CAAC,CAAC,QAAQ,SAAS,KAAK,SAAS,CAAC;CAC/D,MAAM,MAAM,MAAM,IAAI;CACtB,IAAI,QAAQ,KAAA,GAAW,MAAM,IAAI,aAAa,4BAA4B;CAC1E,MAAM,YAAY,MAAM,KAAK,aAAa;EACzC,QAAQ,UAAR;GACC,KAAK,QACJ,OAAO;GACR,KAAK;GACL,KAAK,WACJ,OAAO;GACR,SACC,OAAO;EACT;CACD,CAAC;CACD,KAAK,MAAM,YAAY,WACtB,IAAI,sBAAsB,cAAc,KAAA,GACvC,MAAM,IAAI,aAAa,qCAAqC,UAAU;CAGxE,OAAO;EAAE;EAAW;CAAI;AACzB;;;;;;;AAQA,SAAgB,wBAAwB,WAAsC;CAC7E,IAAI,OAAO;CACX,KAAK,MAAM,YAAY,WAAW,QAAQ,sBAAsB,aAAa;CAC7E,OAAO;AACR;;;;;;;AAQA,SAAgB,sBAAsB,SAAgD;CACrF,IAAI,OAAO;CACX,KAAK,MAAM,UAAU,SAAS,QAAQ,2BAA2B;CACjE,OAAO;AACR;;;;;;;AAQA,SAAgB,kBAAkB,OAA2B;CAqB5D,MAAM,UAAU;EAnBf,WAAW;GAAE,KAAK;GAAa,MAAM;GAAa,MAAM,KAAA;GAAW,QAAQ;EAAE;EAC7E,KAAK;GAAE,KAAK;GAAO,MAAM;GAAO,MAAM;GAAM,QAAQ;EAAE;EACtD,OAAO;GAAE,KAAK;GAAS,MAAM;GAAS,MAAM;GAAM,QAAQ;EAAG;EAC7D,OAAO;GAAE,KAAK;GAAS,MAAM;GAAa,MAAM,KAAA;GAAW,QAAQ;EAAG;EACtE,SAAS;GAAE,KAAK;GAAW,MAAM;GAAe,MAAM,KAAA;GAAW,QAAQ;EAAG;EAC5E,KAAK;GAAE,KAAK;GAAO,MAAM;GAAW,MAAM,KAAA;GAAW,QAAQ;EAAG;EAChE,QAAQ;GAAE,KAAK;GAAU,MAAM;GAAU,MAAM,KAAA;GAAW,QAAQ;EAAG;EACrE,OAAO;GAAE,KAAK;GAAK,MAAM;GAAS,MAAM;GAAK,QAAQ;EAAG;EACxD,QAAQ;GAAE,KAAK;GAAU,MAAM;GAAU,MAAM,KAAA;GAAW,QAAQ;EAAG;EACrE,UAAU;GAAE,KAAK;GAAY,MAAM;GAAY,MAAM,KAAA;GAAW,QAAQ;EAAG;EAC3E,KAAK;GAAE,KAAK;GAAO,MAAM;GAAO,MAAM,KAAA;GAAW,QAAQ;EAAG;EAC5D,MAAM;GAAE,KAAK;GAAQ,MAAM;GAAQ,MAAM,KAAA;GAAW,QAAQ;EAAG;EAC/D,WAAW;GAAE,KAAK;GAAa,MAAM;GAAa,MAAM,KAAA;GAAW,QAAQ;EAAG;EAC9E,SAAS;GAAE,KAAK;GAAW,MAAM;GAAW,MAAM,KAAA;GAAW,QAAQ;EAAG;EACxE,YAAY;GAAE,KAAK;GAAc,MAAM;GAAc,MAAM,KAAA;GAAW,QAAQ;EAAG;EACjF,WAAW;GAAE,KAAK;GAAa,MAAM;GAAa,MAAM,KAAA;GAAW,QAAQ;EAAG;EAC9E,QAAQ;GAAE,KAAK;GAAU,MAAM;GAAU,MAAM,KAAA;GAAW,QAAQ;EAAG;EACrE,MAAM;GAAE,KAAK;GAAQ,MAAM;GAAY,MAAM,KAAA;GAAW,QAAQ;EAAG;CAEpD,EAAM;CACtB,IAAI,YAAY,KAAA,GAAW,OAAO;CAClC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,WAAW,GAAG,MAAM,IAAI,aAAa,4BAA4B,OAAO;CACvF,MAAM,YAAY,CAAC,GAAG,KAAK,CAAC,CAAC;CAC7B,IAAI,cAAc,KAAA,GAAW,MAAM,IAAI,aAAa,sBAAsB;CAC1E,MAAM,QAAQ,UAAU,YAAY;CACpC,MAAM,SAAS,UAAU,KAAK,KAAK;CACnC,MAAM,QAAQ,UAAU,KAAK,SAAS;CACtC,OAAO;EACN,KAAK;EACL,MAAM,SAAS,MAAM,UAAU,QAAQ,QAAQ,cAAc;EAC7D,MAAM;EACN,QAAQ,MAAM,WAAW,CAAC;CAC3B;AACD;;;;;;;;;AAUA,SAAgB,mBACf,OACA,SAC8B;CAC9B,MAAM,0BAAU,IAAI,IAAoB;CACxC,IAAI,CAAC,SAAS,KAAK,GAAG,OAAO;CAC7B,MAAM,UAAU,iBAAiB,MAAM,QAAQ;CAC/C,MAAM,SAAS,iBAAiB,MAAM,QAAQ;CAC9C,IAAI,YAAY,KAAA,KAAa,WAAW,KAAA,GAAW,OAAO;CAE1D,KAAK,IAAI,QAAQ,GAAG,QAAQ,QAAQ,QAAQ,SAAS,GAAG;EACvD,MAAM,OAAO,QAAQ;EACrB,MAAM,OAAO,oBAAoB,SAAS,OAAO,MAAM;EACvD,IAAI,SAAS,KAAA,KAAa,SAAS,KAAA,GAAW,QAAQ,IAAI,MAAM,IAAI;CACrE;CACA,OAAO;AACR;;;;;;;;AASA,SAAgB,oBAAoB,OAAqC;CACxE,IAAI,CAAC,SAAS,KAAK,GAAG,uBAAO,IAAI,IAAI;CACrC,OAAO,IAAI,IAAI,iBAAiB,MAAM,QAAQ,KAAK,CAAC,CAAC;AACtD;;;;;;;;AASA,SAAgB,oBAAoB,OAA6C;CAChF,MAAM,0BAAU,IAAI,IAAoB;CACxC,IAAI,CAAC,SAAS,KAAK,GAAG,OAAO;CAC7B,MAAM,UAAU,iBAAiB,MAAM,QAAQ;CAC/C,MAAM,SAAS,iBAAiB,MAAM,QAAQ;CAC9C,IAAI,YAAY,KAAA,KAAa,WAAW,KAAA,GAAW,OAAO;CAE1D,KAAK,IAAI,QAAQ,GAAG,QAAQ,QAAQ,QAAQ,SAAS,GAAG;EACvD,MAAM,OAAO,QAAQ;EACrB,MAAM,UAAU,OAAO;EACvB,IAAI,SAAS,KAAA,KAAa,YAAY,KAAA,GAAW,QAAQ,IAAI,MAAM,OAAO;CAC3E;CACA,OAAO;AACR;;;;;;;;AASA,SAAgB,sBACf,OACA,SACmC;CACnC,MAAM,UAAU,iBAAiB,KAAK;CACtC,MAAM,aAAqC,CAAC;CAC5C,IAAI,YAAY,KAAA,GAAW,OAAO,OAAO,OAAO,UAAU;CAE1D,KAAK,IAAI,QAAQ,GAAG,QAAQ,QAAQ,QAAQ,SAAS,GAAG;EACvD,MAAM,OAAO,oBAAoB,SAAS,QAAQ,MAAM;EACxD,MAAM,YAAY,oBAAoB,SAAS,QAAQ,QAAQ,EAAE;EACjE,IAAI,SAAS,KAAA,KAAa,cAAc,KAAA,GAAW,WAAW,QAAQ;CACvE;CACA,OAAO,OAAO,OAAO,UAAU;AAChC;;;;;;;;;;;AAYA,SAAgB,oBACf,OACA,SAA4B,CAAC,GAC7B,QAAQ,6BACe;CACvB,IAAI,CAAC,UAAU,KAAK,KAAK,QAAQ,GAChC,MAAM,IAAI,aAAa,yDAAyD,KAAA,GAAW,EAC1F,MACD,CAAC;CAEF,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,QAAQ,MAAM,UAAU,KAAK,CAAC,QAAQ,MAAM,YAAY,GAChF,MAAM,IAAI,aAAa,8CAA8C;CAEtE,MAAM,UAAU,WAAW,MAAM,YAAY,QAAQ;CACrD,IAAI,YAAY,KAAA,GACf,MAAM,IAAI,aAAa,oCAAoC;CAE5D,IAAI,QAAQ;CACZ,KAAK,MAAM,YAAY,MAAM,cAAc;EAC1C,IAAI,CAAC,SAAS,QAAQ,KAAK,CAAC,SAAS,SAAS,QAAQ,GAAG;EACzD,SAAS,iBAAiB,SAAS,QAAQ,CAAC,WAAW,CAAC,EAAE,UAAU;CACrE;CACA,IAAI,QAAQ,OACX,MAAM,IAAI,wBAAwB,kDAAkD;EACnF,QAAQ;EACR;CACD,CAAC;CAGF,MAAM,YAA+B,CAAC;CACtC,KAAK,IAAI,gBAAgB,GAAG,gBAAgB,MAAM,YAAY,CAAC,QAAQ,iBAAiB,GAAG;EAC1F,MAAM,cAAc,MAAM,YAAY,CAAC;EACvC,IAAI,CAAC,SAAS,WAAW,KAAK,CAAC,SAAS,YAAY,QAAQ,GAC3D,MAAM,IAAI,aAAa,mCAAmC,KAAA,GAAW,EACpE,UAAU,cACX,CAAC;EAGF,MAAM,WAAW,YAAY;EAC7B,MAAM,QAAQ,oBAAoB,SAAS,YAAY,UAAU;EACjE,MAAM,MAAM,oBAAoB,SAAS,YAAY,cAAc;EACnE,MAAM,QACL,YAAY,aAAa,KAAK,KAAK,oBAAoB,SAAS,YAAY,QAAQ;EACrF,IAAI,UAAU,KAAA,KAAa,QAAQ,KAAA,KAAa,UAAU,KAAA,GACzD,MAAM,IAAI,aAAa,4CAA4C,KAAA,GAAW,EAC7E,UAAU,cACX,CAAC;EAEF,MAAM,QAAQ,iBAAiB,SAAS,WAAW;EACnD,MAAM,QAAQ,iBAAiB,SAAS,WAAW;EACnD,MAAM,SAAS,iBAAiB,SAAS,YAAY;EACrD,IAAI,UAAU,KAAA,KAAa,UAAU,KAAA,KAAa,WAAW,KAAA,GAC5D,MAAM,IAAI,aAAa,qCAAqC,KAAA,GAAW,EACtE,UAAU,cACX,CAAC;EAGF,MAAM,UAAU,iBAAiB,SAAS,cAAc,KAAK,CAAC;EAC9D,MAAM,MAAM,iBAAiB,SAAS,gBAAgB,KAAK,CAAC;EAC5D,MAAM,gBAAgB,QAAQ,SAAS,aAAa,IAAI,SAAS,gBAAgB,CAAC;EAClF,MAAM,QAAQ,mBAAmB,SAAS,cAAc,OAAO;EAC/D,MAAM,SAAS,mBAAmB,SAAS,eAAe,OAAO;EACjE,MAAM,UAAU,oBAAoB,SAAS,eAAe;EAC5D,MAAM,WAAW,oBAAoB,SAAS,iBAAiB;EAC/D,MAAM,YAAY,oBAAoB,SAAS,cAAc;EAC7D,MAAM,UAAU,mBAAmB,SAAS,mBAAmB,OAAO;EACtE,MAAM,WAAW,oBAAoB,SAAS,uBAAuB;EACrE,MAAM,UAAU,mBAAmB,SAAS,eAAe,OAAO;EAClE,MAAM,UAAU,mBAAmB,SAAS,qBAAqB,OAAO;EACxE,MAAM,UAAU,mBAAmB,SAAS,cAAc,OAAO;EACjE,MAAM,0BAAU,IAAI,IAA2B;EAE/C,IAAI,SAAS,YAAY,SAAS,GAAG;GACpC,MAAM,YAAY,YAAY;GAC9B,MAAM,cAAc,iBAAiB,UAAU,YAAY,KAAK,CAAC;GACjE,MAAM,YAAY,QAAQ,UAAU,SAAS,IAAI,UAAU,YAAY,CAAC;GACxE,MAAM,YAAY,QAAQ,UAAU,SAAS,IAAI,UAAU,YAAY,CAAC;GACxE,MAAM,WAAW,iBAAiB,UAAU,OAAO,KAAK,CAAC;GACzD,MAAM,SAAS,iBAAiB,UAAU,cAAc,KAAK,CAAC;GAC9D,MAAM,aAAa,QAAQ,UAAU,cAAc,IAAI,UAAU,iBAAiB,CAAC;GACnF,MAAM,aAAa,QAAQ,UAAU,cAAc,IAAI,UAAU,iBAAiB,CAAC;GACnF,MAAM,aAAa,QAAQ,UAAU,cAAc,IAAI,UAAU,iBAAiB,CAAC;GAEnF,KAAK,IAAI,cAAc,GAAG,cAAc,YAAY,QAAQ,eAAe,GAAG;IAC7E,MAAM,YAAY,YAAY;IAC9B,IAAI,cAAc,KAAA,GAAW;IAC7B,MAAM,eAAe,iBAAiB,UAAU,YAAY,KAAK,CAAC;IAClE,MAAM,WAAmC,CAAC;IAC1C,KAAK,IAAI,aAAa,GAAG,aAAa,OAAO,QAAQ,cAAc,GAAG;KACrE,MAAM,OAAO,OAAO;KACpB,MAAM,QAAQ,oBAAoB,SAAS,aAAa,WAAW;KACnE,IAAI,SAAS,KAAA,KAAa,UAAU,KAAA,GAAW,SAAS,QAAQ;IACjE;IACA,QAAQ,IAAI,WAAW;KACtB,QAAQ,iBAAiB,UAAU,YAAY;KAC/C,QAAQ,OAAO,OAAO,QAAQ;KAC9B,MAAM,oBAAoB,SAAS,SAAS,YAAY;KACxD,OAAO,OAAO;KACd,QAAQ,iBAAiB,WAAW,YAAY;KAChD,QAAQ,iBAAiB,WAAW,YAAY;KAChD,QAAQ,iBAAiB,WAAW,YAAY;IACjD,CAAC;GACF;EACD;EAEA,MAAM,QAAuB,CAAC;EAC9B,KAAK,IAAI,YAAY,GAAG,YAAY,MAAM,QAAQ,aAAa,GAAG;GACjE,MAAM,WAAW,MAAM;GACvB,MAAM,OAAO,oBAAoB,SAAS,MAAM,UAAU;GAC1D,MAAM,YACL,OAAO,eAAe,KAAK,KAAK,oBAAoB,SAAS,OAAO,UAAU;GAC/E,IAAI,aAAa,KAAA,KAAa,SAAS,KAAA,KAAa,cAAc,KAAA,GACjE,MAAM,IAAI,aAAa,+BAA+B,KAAA,GAAW;IAChE,UAAU;IACV,OAAO;GACR,CAAC;GAEF,MAAM,SAAS,QAAQ;GACvB,MAAM,KAAK;IACV,UAAU;IACV;IACA,OAAO;IACP,IAAI,IAAI;IACR,QAAQ,WAAW,KAAA,KAAa,SAAS,IAAI,KAAA,IAAY;IACzD;IACA;IACA,OAAO;IACP,YAAY,sBAAsB,cAAc,YAAY,OAAO;IACnE,MAAM,MAAM,IAAI,SAAS;IACzB,OAAO,OAAO,IAAI,SAAS;IAC3B,SAAS,QAAQ,IAAI,SAAS,IAAI,OAAO,KAAA;IACzC,UAAU,SAAS,IAAI,SAAS,IAAI,OAAO,KAAA;IAC3C,WAAW,UAAU,IAAI,SAAS,IAAI,OAAO,KAAA;IAC7C,QAAQ,QAAQ,IAAI,SAAS;IAC7B,SAAS,SAAS,IAAI,SAAS;IAC/B,QAAQ,QAAQ,IAAI,SAAS;IAC7B,QAAQ,QAAQ,IAAI,SAAS;IAC7B,QAAQ,QAAQ,IAAI,SAAS;IAC7B,QAAQ,QAAQ,IAAI,SAAS;GAC9B,CAAC;EACF;EAEA,UAAU,KAAK;GACd,OAAO;GACP;GACA;GACA;GACA;GACA,QAAQ,CACP,eAAe,YAAY,gBAAgB,IAAI,YAAY,mBAAmB,KAAA,GAC9E,eAAe,YAAY,gBAAgB,IAAI,YAAY,mBAAmB,KAAA,CAC/E;GACA,OAAO,eAAe,YAAY,eAAe,IAAI,YAAY,kBAAkB,KAAA;GACnF,QAAQ,eAAe,YAAY,gBAAgB,IAChD,YAAY,mBACZ,KAAA;EACJ,CAAC;CACF;CAEA,OAAO;EAAE;EAAW,QAAQ,CAAC,GAAG,MAAM;CAAE;AACzC;;;;;;;;;;;;;;;AAgBA,SAAgB,mBACf,OAC4B;CAC5B,OAAO,CAAC,WAAW,KAAK;AACzB;;;;;;;;AASA,SAAgB,mBAAmB,MAAmB,OAAkC;CACvF,IAAI,MAAM,SAAS,KAAA,KAAa,KAAK,KAAK,YAAY,MAAM,MAAM,KAAK,YAAY,GAAG,OAAO;CAC7F,IACC,MAAM,SAAS,KAAA,KACf,CAAC,KAAK,MAAM,SAAS,MAAM,IAAI,KAC/B,KAAK,MAAM,SAAS,MAAM,IAAI,MAAM,MAEpC,OAAO;CAER,IAAI,MAAM,UAAU,KAAA,KAAa,KAAK,UAAU,MAAM,OAAO,OAAO;CACpE,IAAI,MAAM,cAAc,KAAA,KAAc,KAAK,cAAc,SAAU,MAAM,WAAW,OAAO;CAC3F,IAAI,MAAM,YAAY,KAAA,KAAa,qBAAqB,IAAI,MAAM,MAAM,SAAS,OAAO;CACxF,IAAI,MAAM,eAAe,KAAA,GACnB;OAAA,MAAM,CAAC,MAAM,UAAU,OAAO,QAAQ,MAAM,UAAU,GAC1D,IAAI,KAAK,WAAW,UAAU,OAAO,OAAO;CAAA;CAG9C,OAAO;AACR;;;;;;;AAQA,SAAgB,qBAAqB,MAA4B;CAChE,MAAM,SAAS,KAAK,QAAQ;CAC5B,OAAO,WAAW,KAAA,KAAa,OAAO,KAAK,KAAK,OAAO,KAAK;AAC7D;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BA,eAAsB,sBACrB,GAAG,OACgB;CACnB,IAAI;CACJ,IAAI,UAAU;CACd,KAAK,MAAM,QAAQ,OAClB,IAAI;EACH,MAAM,KAAK;CACZ,SAAS,OAAO;EACf,IAAI,CAAC,SAAS;GACb,UAAU;GACV,UAAU;EACX;CACD;CAED,OAAO;AACR;;;;;;;;;;ACh2DA,SAAgB,8BAA8B,YAAoB,SAAyB;CAC1F,OAAO;wCACgC,QAAQ;sBAC1B,WAAW;;;;;;;;;;;;;;;;;;;AAmBjC;;;;;;;AAQA,SAAgB,4BAA4B,MAAsB;CAGjE,OAAO;gBAFS,KAAK,UAAU,IAGhB,EAAQ;eAFT,KAAK,UAAU,sBAAsB,MAGrC,EAAM;;;;;;;;;;;;;;;;;;;;;;AAsBrB;;;;;;;;;;AAWA,SAAgB,4BACf,MACA,IACA,SACA,OACS;CACT,OAAO,cAAc,KAAK,UAAU,sBAAsB,MAAM,EAAE,aAAa,KAAK,UAAU,EAAE,EAAE,IAAI,KAAK,UAAU,OAAO,EAAE,IAAI,KAAK,UAAU,KAAK,EAAE;AACzJ;;;;;;;AAQA,SAAgB,6BAA6B,MAAsB;CAClE,OAAO;qBACa,KAAK,UAAU,IAAI,EAAE;qBACrB,KAAK,UAAU,sBAAsB,MAAM,EAAE;;;AAGlE;;;;;;;AAQA,SAAgB,uCACf,SACqB;CACrB,MAAM,QAAQ,SAAS,QAAQ,CAAC;CAChC,IAAI,SAAS,eAAe,SAAS,SAAS,UAAU,SAAS,MAAM,WAAW,GACjF;CAED,MAAM,UAAU,MAAM,KAAK,YAAY,6BAA6B,QAAQ,KAAK,CAAC;CAClF,OAAO;qBACa,KAAK,UAAU,4BAA4B,EAAE;;;;OAI3D,KAAK,UAAU,SAAS,eAAe,SAAS,SAAS,UAAU,KAAK,EAAE;;;wBAGzD,KAAK,UAC1B,GAAG,SAAS,eAAe,QAAQ,4GAA4G,KAAK,SAAS,UAAU,QAAQ,yCAAyC,IACzN,EAAE;;;mBAGe,QAAQ,KAAK,GAAG,EAAE;;;;;;;;sBAQf,KAAK,UAAU,SAAS,SAAS,SAAS,EAAE;;;;;;AAMlE;;;;;;;AAQA,SAAgB,mCAAmC,OAAuB;CACzE,OAAO;qBACa,KAAK,UAAU,4BAA4B,EAAE;;4CAEtB,KAAK,UAAU,KAAK,EAAE;;;;AAIlE;;;;;;AAOA,SAAgB,+BAAuC;CACtD,OAAO;;;;;;;;;;AAUR;;;;;;;AAQA,SAAgB,gCAAgC,QAAsC;CACrF,OAAO;iBACS,KAAK,UAAU;EAAE,OAAO,OAAO;EAAO,SAAS,OAAO;CAAQ,CAAC,EAAE;;;;;;;AAOlF;;;;;;AAOA,SAAgB,gCAAwC;CACvD,OAAO;;;;;AAKR;;;;;;;;;;;;;;;;;;;;;;;AAwBA,SAAgB,iCAAiC,YAAoB,OAAuB;CAC3F,OAAO;EACN,WAAW;0EAC6D,MAAM,oBAAoB,KAAK,UAAU,oCAAoC,EAAE;AACzJ;;;;;;;;;;;;;;;AAgBA,SAAgB,qBACf,SACA,SACS;CACT,MAAM,WAAW,SAAS,YAAY;CAEtC,MAAM,QAAQ,QAAQ,KAAK,WAAW;EACrC,QAAQ,OAAO,QAAf;GACC,KAAK,YACJ,OAAO,uBAAuB,KAAK,UAAU,OAAO,GAAG,EAAE;GAC1D,KAAK,SACJ,OAAO,oBAAoB,KAAK,UAAU,OAAO,QAAQ,EAAE;GAC5D,KAAK,QACJ,OAAO,mBAAmB,KAAK,UAAU,OAAO,QAAQ,EAAE,IAAI,KAAK,UAAU,OAAO,KAAK,EAAE;GAC5F,KAAK,UACJ,OAAO,qBAAqB,KAAK,UAAU,OAAO,QAAQ,EAAE,IAAI,KAAK,UAAU,OAAO,MAAM,EAAE;EAChG;CACD,CAAC;CAED,IAAI,aAAa,cAChB,OAAO;EACN;EACA,GAAG,MAAM,KAAK,SAAS,KAAK,MAAM;EAClC;CACD,CAAC,CAAC,KAAK,IAAI;CAGZ,OAAO;EAAC;EAA8B,GAAG,MAAM,KAAK,SAAS,KAAK,MAAM;EAAG;CAAG,CAAC,CAAC,KAAK,IAAI;AAC1F;;;;;;;AAQA,SAAgB,6BAA6B,OAA6B;CACzE,OAAO;iBACS,KAAK,UAAU,KAAK,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WAmF5B,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;yEA2BoC,KAAK,UAAU,yBAAyB,EAAE;;;;;;;;;;;;;;;AAenH;;;;;;;AAQA,SAAgB,yBAAyB,OAA6B;CACrE,OAAO,IAAI,6BAA6B,KAAK,EAAE;AAChD;;;;AAKA,SAAgB,qCACf,OACA,QACA,SACS;CACT,OAAO;wCACgC,QAAQ;;oBAE5B,6BAA6B,KAAK,EAAE;QAChD,KAAK,UAAU,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;AAoB/B;;;;AAKA,SAAgB,qCACf,OACA,QACA,SACS;CACT,OAAO;wCACgC,QAAQ;;oBAE5B,6BAA6B,KAAK,EAAE;QAChD,KAAK,UAAU,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;AAoB/B;;;;AAKA,SAAgB,oCACf,OACA,QACA,SACS;CACT,OAAO;wCACgC,QAAQ;;;;WAIrC,0BAA0B;;;oBAGjB,6BAA6B,KAAK,EAAE;QAChD,KAAK,UAAU,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;AAoB/B;;;;AAKA,SAAgB,mCACf,OACA,QACA,SACS;CACT,OAAO;wCACgC,QAAQ;;;;WAIrC,0BAA0B;;;oBAGjB,6BAA6B,KAAK,EAAE;QAChD,KAAK,UAAU,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;AAoB/B;;;;;;;AAQA,SAAgB,6BAA6B,SAA8C;CAC1F,OAAO;;;;;;WAMG,0BAA0B;;OAE9B,KAAK,UAAU,QAAQ,YAAY,IAAI,EAAE;OACzC,KAAK,UAAU,QAAQ,YAAY,IAAI,EAAE;OACzC,KAAK,UAAU,QAAQ,aAAa,IAAI,EAAE;;;;;;QAMzC,KAAK,UAAU,QAAQ,WAAW,IAAI,EAAE;;;;;OAKzC,KAAK,UAAU,QAAQ,WAAW,IAAI,EAAE;;qBAE1B,KAAK,UAAU,QAAQ,QAAQ,EAAE;;;;;;;;AAQtD;;;;;;;;;AAUA,SAAgB,8BACf,UACA,QACA,SACS;CACT,OAAO;oBACY,KAAK,UAAU,QAAQ,EAAE;kBAC3B,KAAK,UAAU,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;MAsBnC,QAAQ;;;AAGd;;;;;;;;;AAUA,SAAgB,8BACf,UACA,QACA,SACS;CACT,OAAO;oBACY,KAAK,UAAU,QAAQ,EAAE;kBAC3B,KAAK,UAAU,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;MAsBnC,QAAQ;;;AAGd;;;;;;;;;AAUA,SAAgB,6BACf,UACA,QACA,SACS;CACT,OAAO;oBACY,KAAK,UAAU,QAAQ,EAAE;kBAC3B,KAAK,UAAU,MAAM,EAAE;;;;WAI9B,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;MAuB/B,QAAQ;;;AAGd;;;;;;;;;AAUA,SAAgB,4BACf,UACA,QACA,SACS;CACT,OAAO;oBACY,KAAK,UAAU,QAAQ,EAAE;kBAC3B,KAAK,UAAU,MAAM,EAAE;;;;WAI9B,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;MAuB/B,QAAQ;;;AAGd;;;;;;;;AASA,SAAgB,uBAAuB,UAAkB,QAAyB;CACjF,OAAO;oBACY,KAAK,UAAU,QAAQ,EAAE;;OAEtC,KAAK,UAAU,MAAM,EAAE;;;;;SAKrB,0BAA0B;;;;;AAKnC;;;;;;;;;AAUA,SAAgB,sBAAsB,UAAkB,OAAe,QAAyB;CAC/F,OAAO;oBACY,KAAK,UAAU,QAAQ,EAAE;;OAEtC,KAAK,UAAU,MAAM,EAAE;;;;;SAKrB,0BAA0B;;;;;qBAKd,KAAK,UAAU,KAAK,EAAE;;eAE5B,KAAK,UAAU,KAAK,EAAE;;4FAEuD,KAAK,UAAU,KAAK,EAAE;;;AAGlH;;;;;;;;;AAUA,SAAgB,wBACf,UACA,QACA,QACS;CACT,OAAO;oBACY,KAAK,UAAU,QAAQ,EAAE;;OAEtC,KAAK,UAAU,MAAM,EAAE;;;;;kBAKZ,KAAK,UAAU,CAAC,GAAG,MAAM,CAAC,EAAE;;;;;;;;;AAS9C;;;;;;;;;;;;;;;;;;;;;;;;ACh2BA,IAAa,oBAAb,MAAkF;CACjF;CAEA,IAAI,UAAkC;EACrC,OAAO,KAAK;CACb;CAEA,MAAM,QAAQ,MAAgD;EAC7D,MAAM,SAAS,KAAK;EACpB,IAAI,WAAW,KAAA,GAAW,OAAO,MAAM;EAEvC,MAAM,UAAU,KAAK;EACrB,KAAK,WAAW;EAChB,IAAI;GACH,OAAO,MAAM;EACd,UAAU;GACT,IAAI,KAAK,aAAa,SAAS,KAAK,WAAW,KAAA;EAChD;CACD;AACD;;;;;;;;;;;;;;;;;;;;;;;;;;ACFA,IAAa,YAAb,MAAqD;CACpD;CACA;CACA,aAAa;CACb,2BAQI,IAAI,IAAI;CACZ,iCAAiF,IAAI,IAAI;CACzF,aAAa;CACb,UAAU;CACV,SAAS;CACT;CACA;CACA,cAA0C,IAAI,kBAAkB;CAChE,WAAuC,IAAI,kBAAkB;CAC7D,kBAAkB;CAGlB,YAAY;CAEZ,YAAY,SAA2B;EACtC,KAAK,aAAa,QAAQ;EAC1B,KAAK,WAAW,QAAQ,WAAA;EACxB,KAAK,SAAS,QAAQ;EACtB,KAAK,WAAW,IAAI,QAAQ;GAC3B,GAAI,QAAQ,OAAO,KAAA,IAAY,EAAE,IAAI,QAAQ,GAAG,IAAI,CAAC;GACrD,GAAI,QAAQ,UAAU,KAAA,IAAY,EAAE,OAAO,QAAQ,MAAM,IAAI,CAAC;EAC/D,CAAC;CACF;CAEA,IAAI,UAA+C;EAClD,OAAO,KAAK;CACb;CAEA,IAAI,YAAqB;EACxB,OAAO,KAAK;CACb;CAEA,MAAM,UAAyB;EAC9B,MAAM,UAAU,KAAK,SAAS;EAC9B,IAAI,YAAY,KAAA,GAAW,MAAM;EACjC,IAAI,KAAK,YAAY;EACrB,MAAM,SAAS,KAAK,YAAY;EAChC,IAAI,WAAW,KAAA,GAAW,OAAO,MAAM;EAEvC,KAAK,kBAAkB;EACvB,KAAK,YAAY;EACjB,MAAM,KAAK,YAAY,cAAc,KAAK,SAAS,CAAC;CACrD;;;;;;;;;;CAWA,MAAM,YAA2B;EAChC,MAAM,KAAK,MAAM;EACjB,MAAM,KAAK,QAAQ;CACpB;CAEA,MAAM,KACL,QACA,QACA,SACmB;EACnB,IAAI,CAAC,KAAK,YACT,MAAM,IAAI,mBAAmB,+BAA+B,EAAE,OAAO,CAAC;EAGvE,MAAM,KAAK,KAAK,QAAQ;EACxB,MAAM,UAAmC;GAAE;GAAI;EAAO;EAEtD,IAAI,WAAW,KAAA,GACd,QAAQ,YAAY;EAErB,IAAI,SAAS,YAAY,KAAA,GACxB,QAAQ,eAAe,QAAQ;EAGhC,MAAM,aAAa,KAAK,UAAU,OAAO;EACzC,MAAM,mBAAmB,SAAS,WAAW,KAAK;EAElD,OAAO,IAAI,SAAkB,SAAS,WAAW;GAChD,MAAM,QAAQ,iBAAiB;IAC9B,KAAK,SAAS,OAAO,EAAE;IACvB,OACC,IAAI,gBAAgB,0BAA0B,UAAU;KACvD;KACA,SAAS;IACV,CAAC,CACF;GACD,GAAG,gBAAgB;GAEnB,KAAK,SAAS,IAAI,IAAI;IAAE;IAAQ;IAAS;IAAQ;GAAM,CAAC;GAExD,KAAK,WAAW,KAAK,UAAU,CAAC,CAAC,OAAO,WAAoB;IAC3D,KAAK,SAAS,OAAO,EAAE;IACvB,aAAa,KAAK;IAClB,OAAO,MAAM;GACd,CAAC;EACF,CAAC;CACF;CAEA,UAAU,QAAgB,SAAqB,SAAwB;EACtE,IAAI,UAAU,KAAK,eAAe,IAAI,OAAO;EAC7C,IAAI,YAAY,KAAA,GAAW;GAC1B,0BAAU,IAAI,IAAI;GAClB,KAAK,eAAe,IAAI,SAAS,OAAO;EACzC;EACA,IAAI,WAAW,QAAQ,IAAI,MAAM;EACjC,IAAI,aAAa,KAAA,GAAW;GAC3B,2BAAW,IAAI,IAAI;GACnB,QAAQ,IAAI,QAAQ,QAAQ;EAC7B;EACA,SAAS,IAAI,OAAO;CACrB;CAEA,YAAY,QAAgB,SAAqB,SAAwB;EACxE,MAAM,UAAU,KAAK,eAAe,IAAI,OAAO;EAC/C,IAAI,YAAY,KAAA,GAAW;EAC3B,MAAM,WAAW,QAAQ,IAAI,MAAM;EACnC,IAAI,aAAa,KAAA,GAAW;GAC3B,SAAS,OAAO,OAAO;GACvB,IAAI,SAAS,SAAS,GAAG,QAAQ,OAAO,MAAM;EAC/C;EACA,IAAI,QAAQ,SAAS,GAAG,KAAK,eAAe,OAAO,OAAO;CAC3D;;;;;;;;;;;;;CAcA,MAAM,QAAuB;EAC5B,MAAM,KAAK,SAAS,cAAc,KAAK,OAAO,CAAC;CAChD;CAIA,MAAM,WAA0B;EAC/B,IAAI,CAAC,KAAK,QAAQ;GACjB,KAAK,WAAW,QAAQ,GAAG,YAAY,SAAS,KAAK,WAAW,IAAI,CAAC;GACrE,KAAK,WAAW,QAAQ,GAAG,eAAe,KAAK,SAAS,CAAC;GACzD,KAAK,WAAW,QAAQ,GAAG,UAAU,UAAU,KAAK,SAAS,KAAK,CAAC;GACnE,KAAK,SAAS;EACf;EAEA,MAAM,KAAK,WAAW,MAAM;EAC5B,KAAK,UAAU;EAEf,IAAI,KAAK,iBAAiB;GACzB,KAAK,kBAAkB;GACvB,KAAK,YAAY;GACjB,IAAI;IACH,MAAM,KAAK,WAAW,MAAM;GAC7B,UAAU;IACT,KAAK,UAAU;GAChB;GACA,KAAK,SAAS,KAAK,OAAO;GAC1B,MAAM,IAAI,mBAAmB,0CAA0C,EACtE,QAAQ,UACT,CAAC;EACF;EAEA,KAAK,aAAa;EAClB,KAAK,SAAS,KAAK,SAAS;CAC7B;CAEA,MAAM,SAAwB;EAC7B,MAAM,aAAa,KAAK,YAAY;EACpC,IAAI,eAAe,KAAA,GAAW;GAC7B,KAAK,kBAAkB;GACvB,MAAM,WAAW,YAAY,KAAA,CAAS;EAMvC;EAEA,IAAI,CAAC,KAAK,cAAc,CAAC,KAAK,SAAS;EAEvC,KAAK,aAAa;EAGlB,KAAK,MAAM,CAAC,IAAI,UAAU,KAAK,UAAU;GACxC,aAAa,MAAM,KAAK;GACxB,MAAM,OAAO,IAAI,mBAAmB,yBAAyB,EAAE,QAAQ,MAAM,OAAO,CAAC,CAAC;GACtF,KAAK,SAAS,OAAO,EAAE;EACxB;EAEA,KAAK,YAAY;EACjB,IAAI;GACH,MAAM,KAAK,WAAW,MAAM;EAC7B,UAAU;GACT,KAAK,UAAU;EAChB;EACA,KAAK,SAAS,KAAK,OAAO;CAC3B;CAEA,UAAkB;EACjB,KAAK,cAAc;EACnB,OAAO,KAAK;CACb;CAEA,WAAiB;EAChB,KAAK,aAAa;EAClB,KAAK,UAAU;EAGf,KAAK,MAAM,CAAC,IAAI,UAAU,KAAK,UAAU;GACxC,aAAa,MAAM,KAAK;GACxB,MAAM,OAAO,IAAI,mBAAmB,yBAAyB,EAAE,QAAQ,MAAM,OAAO,CAAC,CAAC;GACtF,KAAK,SAAS,OAAO,EAAE;EACxB;EACA,IAAI,CAAC,KAAK,WAAW,KAAK,SAAS,KAAK,MAAM;CAC/C;CAEA,SAAS,OAAsB;EAC9B,KAAK,aAAa;EAClB,KAAK,MAAM,CAAC,IAAI,UAAU,KAAK,UAAU;GACxC,aAAa,MAAM,KAAK;GACxB,MAAM,OACL,IAAI,mBAAmB,0BAA0B,OAAO,KAAK,KAAK;IACjE,QAAQ,MAAM;IACd;GACD,CAAC,CACF;GACA,KAAK,SAAS,OAAO,EAAE;EACxB;EACA,KAAK,SAAS,KAAK,SAAS,KAAK;CAClC;CAEA,WAAW,MAAoB;EAC9B,MAAM,SAAS,UAAU,IAAI;EAC7B,IAAI,CAAC,SAAS,MAAM,GAAG;EAGvB,IAAI,UAAU,OAAO,KAAK,GAAG;GAC5B,MAAM,KAAK,OAAO;GAClB,MAAM,QAAQ,KAAK,SAAS,IAAI,EAAE;GAClC,IAAI,UAAU,KAAA,GAAW;IACxB,KAAK,SAAS,OAAO,EAAE;IACvB,aAAa,MAAM,KAAK;IAExB,MAAM,aAAa,OAAO;IAC1B,IAAI,SAAS,UAAU,GAAG;KACzB,MAAM,UAAU,SAAS,WAAW,UAAU,IAAI,WAAW,aAAa;KAC1E,MAAM,UAAmC,EAAE,QAAQ,MAAM,OAAO;KAChE,IAAI,UAAU,YAAY,QAAQ,UAAU,WAAW;KACvD,QAAQ,aAAa;KACrB,IAAI,UAAU,YAAY,QAAQ,UAAU,WAAW;KACvD,MAAM,OAAO,IAAI,SAAS,SAAS,OAAO,CAAC;IAC5C,OACC,MAAM,QAAQ,YAAY,SAAS,OAAO,YAAY,KAAA,CAAS;GAEjE;GACA;EACD;EAGA,IAAI,SAAS,OAAO,SAAS,GAAG;GAC/B,MAAM,SAAS,OAAO;GACtB,MAAM,YAAY,OAAO;GACzB,MAAM,SAA4C,SAAS,SAAS,IACjE,YACA,OAAO,OAAO,CAAC,CAAC;GAEnB,MAAM,SAAS,KAAK,eAAe,IAAI,KAAA,CAAS,CAAC,EAAE,IAAI,MAAM;GAC7D,IAAI,WAAW,KAAA,GAAW,KAAK,UAAU,QAAQ,QAAQ,MAAM;GAE/D,MAAM,UAAU,OAAO;GACvB,IAAI,SAAS,OAAO,GAAG;IACtB,MAAM,SAAS,KAAK,eAAe,IAAI,OAAO,CAAC,EAAE,IAAI,MAAM;IAC3D,IAAI,WAAW,KAAA,GAAW,KAAK,UAAU,QAAQ,QAAQ,MAAM;GAChE;EACD;CACD;CAEA,UACC,UACA,QACA,QACO;EACP,KAAK,MAAM,WAAW,CAAC,GAAG,QAAQ,GACjC,IAAI;GACH,QAAQ,MAAM;EACf,SAAS,QAAQ;GAGhB,KAAK,SAAS,QAAQ,MAAM;EAC7B;CAEF;AACD;;;;;;;;;;;;;;AC5UA,IAAa,uBAAb,MAA2E;CAC1E;CAEA,YAAY,OAA8B;EACzC,KAAK,SAAS;CACf;CAEA,MAAM,SAAS,SAA8E;EAC5F,oCAAoC,OAAO;EAC3C,MAAM,KAAK,OAAO,KAAK,sBAAsB;EAC7C,IAAI;GAWH,OAAO,yBATN,SAAS,SAAS,KAAA,IACf,MAAM,KAAK,OAAO,KAAK,+BAA+B;IACtD,OAAO,SAAS;IAChB,SAAS,KAAK,OAAO;GACtB,CAAC,IACA,MAAM,KAAK,OAAO,KAAK,kCAAkC;IACzD,eAAe,QAAQ;IACvB,gBAAgB;GACjB,CAAC,CACkC;EACvC,UAAU;GACT,MAAM,KAAK,OAAO,KAAK,uBAAuB,CAAC,CAAC,YAAY,KAAA,CAAS;EACtE;CACD;AACD;;;;;;;;;;;;;;;;AC1BA,IAAa,eAAb,MAA2D;CAC1D;CACA,aAAa;CACb,aAAa;CACb;CACA,iBAA0B,KAAK,cAAc,KAAK,IAAI;CAEtD,YAAY,OAA8B;EACzC,KAAK,SAAS;CACf;CAEA,IAAI,YAAqB;EACxB,OAAO,KAAK;CACb;CAEA,MAAM,QAAQ,OAAO,KAAK,IAAI,GAAkB;EAC/C,IAAI,KAAK,YAAY,MAAM,IAAI,aAAa,oCAAoC;EAChF,IAAI,CAAC,eAAe,IAAI,KAAK,OAAO,GACnC,MAAM,IAAI,aAAa,0DAA0D,KAAA,GAAW,EAC3F,KACD,CAAC;EAEF,MAAM,KAAK,OAAO,KAAK,kCAAkC;GACxD,QAAQ;GACR,oBAAoB,OAAO;EAC5B,CAAC;EACD,KAAK,aAAa;CACnB;CAEA,MAAM,QAAuB;EAC5B,KAAK,QAAQ;EACb,KAAK,MAAM;EACX,MAAM,KAAK,OAAO,KAAK,kCAAkC,EAAE,QAAQ,QAAQ,CAAC;CAC7E;CAEA,MAAM,SAAwB;EAC7B,KAAK,QAAQ;EACb,KAAK,MAAM;EACX,MAAM,KAAK,OAAO,KAAK,kCAAkC;GACxD,QAAQ;GACR,mCAAmC;EACpC,CAAC;CACF;CAEA,MAAM,QAAQ,IAA2B;EACxC,KAAK,QAAQ;EACb,KAAK,MAAM;EACX,IAAI,CAAC,eAAe,EAAE,KAAK,KAAK,GAC/B,MAAM,IAAI,aAAa,yDAAyD,KAAA,GAAW,EAC1F,GACD,CAAC;EAEF,IAAI,OAAO,GAAG;GACb,MAAM,KAAK,MAAM;GACjB;EACD;EACA,MAAM,WAAW,QAAQ,cAAoB;EAC7C,KAAK,aAAa;EAClB,KAAK,iBAAiB,SAAS;EAC/B,IAAI;GACH,MAAM,KAAK,OAAO,UAAU,sCAAsC,KAAK,cAAc;EACtF,SAAS,OAAO;GACf,KAAK,iBAAiB,KAAA;GACtB,KAAK,aAAa;GAClB,MAAM;EACP;EACA,MAAM,QAAQ,iBAAiB;GAC9B,SAAS,OAAO,IAAI,aAAa,uCAAuC,CAAC;EAC1E,GAAG,0BAA0B;EAC7B,IAAI;EACJ,IAAI;GACH,MAAM,KAAK,OAAO,KAAK,kCAAkC;IACxD,QAAQ;IACR,QAAQ;IACR,mCAAmC;GACpC,CAAC;GACD,MAAM,SAAS;EAChB,SAAS,OAAO;GACf,UAAU;EACX,UAAU;GACT,aAAa,KAAK;GAClB,KAAK,iBAAiB,KAAA;GACtB,MAAM,UAAU,MAAM,4BACf,KAAK,OAAO,YAAY,sCAAsC,KAAK,cAAc,SACjF,KAAK,OAAO,KAAK,kCAAkC,EAAE,QAAQ,QAAQ,CAAC,CAC7E;GACA,YAAY;GACZ,KAAK,aAAa;EACnB;EACA,IAAI,YAAY,KAAA,GAAW,MAAM;CAClC;CAEA,MAAM,YAA2B;EAChC,IAAI,CAAC,KAAK,YAAY;EACtB,KAAK,MAAM;EACX,MAAM,KAAK,OAAO,KAAK,kCAAkC;GACxD,QAAQ;GACR,mCAAmC;EACpC,CAAC;EACD,KAAK,aAAa;CACnB;CAEA,UAAgB;EACf,IAAI,CAAC,KAAK,YAAY,MAAM,IAAI,aAAa,gCAAgC;CAC9E;CAEA,QAAc;EACb,IAAI,KAAK,YAAY,MAAM,IAAI,aAAa,yCAAyC;CACtF;CAEA,gBAAsB;EACrB,KAAK,iBAAiB;CACvB;AACD;;;;;;;;;;;;;;;AC3GA,IAAa,kBAAb,MAAiE;CAChE;CACA,UAAU;CACV;CAEA,YAAY,OAA8B;EACzC,KAAK,SAAS;CACf;CAEA,IAAI,SAAkB;EACrB,OAAO,KAAK;CACb;CAEA,MAAM,MAAM,SAAiD;EAC5D,IAAI,KAAK,SAAS,MAAM,IAAI,aAAa,oCAAoC;EAC7E,MAAM,aAAa,SAAS,cAAc;EAC1C,MAAM,MAAM,SAAS,OAAO;EAC5B,IAAI,CAAC,cAAc,CAAC,KACnB,MAAM,IAAI,aAAa,oDAAoD;EAE5E,IAAI,WAAW;EACf,IAAI,UAAU;EACd,IAAI,MAAM;EACV,IAAI,SAAS;EACb,IAAI,QAAQ;EACZ,IAAI;GACH,IAAI,YAAY;IACf,MAAM,KAAK,OAAO,KAAK,iBAAiB;IACxC,WAAW;IACX,MAAM,KAAK,OAAO,KAAK,iCAAiC;KACvD,WAAW;KACX,UAAU,SAAS,YAAY;KAC/B,uBAAuB;IACxB,CAAC;IACD,UAAU;GACX;GACA,IAAI,KAAK;IACR,MAAM,KAAK,OAAO,KAAK,YAAY;IACnC,MAAM;IACN,MAAM,KAAK,OAAO,KAAK,YAAY;IACnC,SAAS;IACT,MAAM,KAAK,OAAO,KAAK,4BAA4B;IACnD,QAAQ;GACT;EACD,SAAS,OAAO;GACf,IAAI,OACH,MAAM,KAAK,OAAO,KAAK,2BAA2B,CAAC,CAAC,YAAY,KAAA,CAAS;GAE1E,IAAI,QAAQ,MAAM,KAAK,OAAO,KAAK,aAAa,CAAC,CAAC,YAAY,KAAA,CAAS;GACvE,IAAI,KAAK,MAAM,KAAK,OAAO,KAAK,aAAa,CAAC,CAAC,YAAY,KAAA,CAAS;GACpE,IAAI,SACH,MAAM,KAAK,OAAO,KAAK,8BAA8B,CAAC,CAAC,YAAY,KAAA,CAAS;GAE7E,IAAI,UAAU,MAAM,KAAK,OAAO,KAAK,kBAAkB,CAAC,CAAC,YAAY,KAAA,CAAS;GAC9E,MAAM;EACP;EACA,KAAK,WAAW;EAChB,KAAK,UAAU;CAChB;CAEA,MAAM,OAAuC;EAC5C,IAAI,CAAC,KAAK,SAAS,MAAM,IAAI,aAAa,gCAAgC;EAC1E,KAAK,UAAU;EACf,MAAM,aAAa,KAAK,UAAU,cAAc;EAChD,MAAM,MAAM,KAAK,UAAU,OAAO;EAClC,IAAI,UAA4C,CAAC;EACjD,IAAI,SAA0C,CAAC;EAC/C,MAAM,UAAU,MAAM,sBACrB,YAAY;GACX,IAAI,YAAY,UAAU,MAAM,KAAK,gBAAgB;EACtD,GACA,YAAY;GACX,IAAI,KAAK,SAAS,MAAM,KAAK,SAAS;EACvC,CACD;EACA,KAAK,WAAW,KAAA;EAChB,IAAI,YAAY,KAAA,GAAW,MAAM;EACjC,OAAO;GAAE;GAAS;EAAO;CAC1B;CAEA,MAAM,UAAyB;EAC9B,IAAI,CAAC,KAAK,SAAS;EACnB,MAAM,KAAK,KAAK,CAAC,CAAC,YAAY,KAAA,CAAS;CACxC;CAEA,MAAM,kBAA6D;EAClE,IAAI;EACJ,MAAM,UAAU,MAAM,sBACrB,YAAY;GACX,SAAS,MAAM,KAAK,OAAO,KAAK,8BAA8B;EAC/D,SACM,KAAK,OAAO,KAAK,8BAA8B,SAC/C,KAAK,OAAO,KAAK,kBAAkB,CAC1C;EACA,IAAI,YAAY,KAAA,GAAW,MAAM;EACjC,OAAO,0BAA0B,MAAM;CACxC;CAEA,MAAM,WAAqD;EAC1D,IAAI;EACJ,MAAM,UAAU,MAAM,sBACrB,YAAY;GACX,SAAS,MAAM,KAAK,OAAO,KAAK,2BAA2B;EAC5D,SACM,KAAK,OAAO,KAAK,aAAa,SAC9B,KAAK,OAAO,KAAK,aAAa,CACrC;EACA,IAAI,YAAY,KAAA,GAAW,MAAM;EACjC,OAAO,yBAAyB,MAAM;CACvC;AACD;;;;;;;;;;;;;;;AChHA,IAAa,uBAAb,MAA2E;CAC1E;CACA;CAEA,YAAY,QAA4B,SAAkB;EACzD,KAAK,UAAU;EACf,KAAK,WAAW;CACjB;CAEA,MAAM,QAAQ,MAA6D;EAC1E,MAAM,SAAkC,CAAC;EACzC,IAAI,KAAK,aAAa,KAAA,GAAW,OAAO,sBAAsB,KAAK;EAEnE,MAAM,UAAU,mBAAmB,MADd,KAAK,QAAQ,KAAK,sBAAsB,MAAM,CAC1B;EACzC,IAAI,SAAS,KAAA,KAAa,KAAK,WAAW,GAAG,OAAO;EAEpD,OAAO,QAAQ,QAAQ,WAAW,KAAK,MAAM,UAAU,wBAAwB,QAAQ,KAAK,CAAC,CAAC;CAC/F;CAEA,MAAM,IAAI,SAAuD;EAChE,IAAI,QAAQ,WAAW,GAAG;EAC1B,MAAM,SAAkC,EACvC,SAAS,QAAQ,IAAI,gBAAgB,EACtC;EACA,IAAI,KAAK,aAAa,KAAA,GAAW,OAAO,sBAAsB,KAAK;EACnE,MAAM,KAAK,QAAQ,KAAK,sBAAsB,MAAM;CACrD;CAEA,MAAM,MAAM,QAA6C;EACxD,MAAM,SAAkC,CAAC;EACzC,IAAI,KAAK,aAAa,KAAA,GAAW,OAAO,sBAAsB,KAAK;EACnE,IAAI,WAAW,KAAA,GAAW;GACzB,MAAM,KAAK,QAAQ,KAAK,wBAAwB,MAAM;GACtD;EACD;EAEA,MAAM,YAAY,MAAM,KAAK,QAAQ,EAAA,CAAG,QAAQ,WAAW;GAC1D,IAAI,OAAO,SAAS,KAAA,KAAa,OAAO,SAAS,OAAO,MAAM,OAAO;GACrE,IAAI,OAAO,WAAW,KAAA,KAAa,OAAO,WAAW,OAAO,QAAQ,OAAO;GAC3E,IAAI,OAAO,SAAS,KAAA,KAAa,OAAO,SAAS,OAAO,MAAM,OAAO;GACrE,OAAO;EACR,CAAC;EACD,MAAM,KAAK,QAAQ,KAAK,wBAAwB,MAAM;EACtD,IAAI,SAAS,WAAW,GAAG;EAc3B,MAAM,UAAmC,EAAE,SAb3B,SAAS,KAAK,WAC7B,iBAAiB;GAChB,MAAM,OAAO;GACb,OAAO,OAAO;GACd,QAAQ,OAAO;GACf,MAAM,OAAO;GACb,SAAS,OAAO;GAChB,MAAM,OAAO;GACb,QAAQ,OAAO;GACf,GAAI,OAAO,SAAS,KAAA,IAAY,EAAE,MAAM,OAAO,KAAK,IAAI,CAAC;GACzD,GAAI,OAAO,cAAc,KAAA,IAAY,EAAE,WAAW,OAAO,UAAU,IAAI,CAAC;EACzE,CAAC,CAEyC,EAAQ;EACnD,IAAI,KAAK,aAAa,KAAA,GAAW,QAAQ,sBAAsB,KAAK;EACpE,MAAM,SAAS,MAAM,KAAK,QAAQ,KAAK,sBAAsB,OAAO;EACpE,IAAI,WAAW,KAAA,KAAa,CAAC,SAAS,MAAM,GAC3C,MAAM,IAAI,aAAa,oDAAoD;CAE7E;AACD;;;;;;;;;;;;;;;ACnEA,IAAa,0BAAb,MAAiF;CAChF;CACA;CAEA,YAAY,OAA6B,SAAmC;EAC3E,IAAI,YAAY,KAAA,GAAW,gCAAgC,OAAO;EAClE,KAAK,SAAS;EACd,KAAK,WAAW;CACjB;CAEA,MAAM,MAAM,SAAiD;EAC5D,gCAAgC,OAAO;EACvC,MAAM,WAAW,KAAK;EACtB,MAAM,UAAkC,CAAC;EACzC,IAAI;GACH,KAAK,MAAM,QAAQ,KAAK,OAAO,GAAG;IACjC,QAAQ,KAAK,IAAI;IACjB,IAAI,aAAa,KAAA,GAAW,MAAM,KAAK,WAAW,MAAM,QAAQ;IAChE,MAAM,KAAK,eAAe,MAAM,OAAO;GACxC;EACD,SAAS,OAAO;GACf,KAAK,MAAM,QAAQ,QAAQ,QAAQ,GAAG;IACrC,MAAM,KAAK,WAAW,MAAM,OAAO,CAAC,CAAC,YAAY,KAAA,CAAS;IAC1D,IAAI,aAAa,KAAA,GAChB,MAAM,KAAK,eAAe,MAAM,QAAQ,CAAC,CAAC,YAAY,KAAA,CAAS;GAEjE;GACA,MAAM;EACP;EACA,KAAK,WAAW;CACjB;CAEA,MAAM,QAAuB;EAC5B,MAAM,WAAW,KAAK;EACtB,IAAI,aAAa,KAAA,GAAW;EAC5B,MAAM,UAAkC,CAAC;EACzC,IAAI;GACH,KAAK,MAAM,QAAQ,KAAK,OAAO,GAAG;IACjC,QAAQ,KAAK,IAAI;IACjB,MAAM,KAAK,WAAW,MAAM,QAAQ;GACrC;EACD,SAAS,OAAO;GACf,KAAK,MAAM,QAAQ,QAAQ,QAAQ,GAAG;IACrC,MAAM,KAAK,WAAW,MAAM,QAAQ,CAAC,CAAC,YAAY,KAAA,CAAS;IAC3D,MAAM,KAAK,eAAe,MAAM,QAAQ,CAAC,CAAC,YAAY,KAAA,CAAS;GAChE;GACA,MAAM;EACP;EACA,KAAK,WAAW,KAAA;CACjB;CAEA,MAAM,OAAO,MAA2C;EACvD,MAAM,UAAU,KAAK;EACrB,IAAI,YAAY,KAAA,GAAW;EAC3B,IAAI;GACH,MAAM,KAAK,eAAe,MAAM,OAAO;EACxC,SAAS,OAAO;GACf,MAAM,KAAK,WAAW,MAAM,OAAO,CAAC,CAAC,YAAY,KAAA,CAAS;GAC1D,MAAM;EACP;CACD;CAEA,MAAM,eACL,MACA,SACgB;EAChB,IAAI,QAAQ,aAAa,KAAA,GAAW;GACnC,MAAM,KAAK,KAAK,sCAAsC;IACrD,OAAO,QAAQ,SAAS;IACxB,QAAQ,QAAQ,SAAS;IACzB,mBAAmB,QAAQ,SAAS,SAAS;IAC7C,QAAQ,QAAQ,SAAS,UAAU;IACnC,mBACC,QAAQ,SAAS,cAAc,KAAA,IAC5B,KAAA,IACA;KACA,MAAM,QAAQ,SAAS,YAAY,qBAAqB;KACxD,OAAO,QAAQ,SAAS,YAAY,KAAK;IAC1C;GACJ,CAAC;GACD,MAAM,KAAK,KAAK,sCAAsC,EACrD,SAAS,QAAQ,SAAS,SAAS,MACpC,CAAC;EACF;EACA,IAAI,QAAQ,SAAS,KAAA,GACpB,MAAM,KAAK,KAAK,kCAAkC;GACjD,WAAW,QAAQ,KAAK;GACxB,gBAAgB,QAAQ,KAAK;GAC7B,UAAU,QAAQ,KAAK;EACxB,CAAC;EAEF,IAAI,QAAQ,WAAW,KAAA,GACtB,MAAM,KAAK,KAAK,+BAA+B,EAAE,QAAQ,QAAQ,OAAO,CAAC;EAE1E,IAAI,QAAQ,aAAa,KAAA,GACxB,MAAM,KAAK,KAAK,iCAAiC,EAAE,YAAY,QAAQ,SAAS,CAAC;EAElF,IAAI,QAAQ,gBAAgB,KAAA,GAC3B,MAAM,KAAK,KAAK,oCAAoC;GACnD,UAAU,QAAQ,YAAY;GAC9B,WAAW,QAAQ,YAAY;GAC/B,UAAU,QAAQ,YAAY;EAC/B,CAAC;EAEF,IAAI,QAAQ,UAAU,KAAA,GACrB,MAAM,KAAK,KAAK,8BAA8B;GAC7C,OAAO,QAAQ,MAAM,UAAU;GAC/B,UAAU,gBAAgB,QAAQ,KAAK;EACxC,CAAC;EAEF,IAAI,QAAQ,YAAY,KAAA,GACvB,MAAM,KAAK,QAAQ,QAAQ,QAAQ,OAAO;EAE3C,IAAI,QAAQ,YAAY,KAAA,GACvB,MAAM,KAAK,QAAQ,QAAQ,QAAQ,OAAO;EAE3C,IAAI,QAAQ,gBAAgB,KAAA,GAC3B,MAAM,KAAK,QAAQ,YAAY,QAAQ,WAAW;CAEpD;CAEA,MAAM,WAAW,MAA4B,SAAiD;EAC7F,IAAI,QAAQ,aAAa,KAAA,GAAW;GACnC,MAAM,KAAK,KAAK,sCAAsC;GACtD,MAAM,KAAK,KAAK,sCAAsC,EAAE,SAAS,MAAM,CAAC;EACzE;EACA,IAAI,QAAQ,SAAS,KAAA,GACpB,MAAM,KAAK,KAAK,kCAAkC,EAAE,WAAW,GAAG,CAAC;EAEpE,IAAI,QAAQ,WAAW,KAAA,GACtB,MAAM,KAAK,KAAK,+BAA+B,EAAE,QAAQ,GAAG,CAAC;EAE9D,IAAI,QAAQ,aAAa,KAAA,GACxB,MAAM,KAAK,KAAK,iCAAiC,EAAE,YAAY,GAAG,CAAC;EAEpE,IAAI,QAAQ,gBAAgB,KAAA,GAC3B,MAAM,KAAK,KAAK,oCAAoC;EAErD,IAAI,QAAQ,UAAU,KAAA,GACrB,MAAM,KAAK,KAAK,8BAA8B;GAAE,OAAO;GAAI,UAAU,CAAC;EAAE,CAAC;EAE1E,IAAI,QAAQ,YAAY,KAAA,GACvB,MAAM,KAAK,QAAQ,QAAQ,KAAK;EAEjC,IAAI,QAAQ,YAAY,KAAA,GACvB,MAAM,KAAK,QAAQ,QAAQ,CAAC,CAAC;EAE9B,IAAI,QAAQ,gBAAgB,KAAA,GAAW,MAAM,KAAK,QAAQ,YAAY,KAAA,CAAS;CAChF;AACD;;;;;;;;;;;;;;;;AC1IA,IAAa,iBAAb,MAA+D;CAC9D;CACA;CACA,WAAmC,CAAC;CACpC,WAAW;CACX,aAAa;CACb,YAAwC,IAAI,kBAAkB;CAC9D,YAAyE,IAAI,kBAAkB;CAC/F;CACA;CACA,wBAAiC,KAAK,qBAAqB,KAAK,IAAI;CACpE,yBAAkC,KAAK,sBAAsB,KAAK,IAAI;CAEtE,YAAY,QAA4B,SAAiB,SAAiC;EACzF,KAAK,UAAU;EACf,KAAK,WAAW;EAChB,KAAK,WAAW,IAAI,QAAQ;GAC3B,GAAI,SAAS,OAAO,KAAA,IAAY,EAAE,IAAI,QAAQ,GAAG,IAAI,CAAC;GACtD,GAAI,SAAS,UAAU,KAAA,IAAY,EAAE,OAAO,QAAQ,MAAM,IAAI,CAAC;EAChE,CAAC;CACF;CAIA,IAAI,UAAoD;EACvD,OAAO,KAAK;CACb;CAEA,IAAI,UAAmB;EACtB,OAAO,KAAK;CACb;CAIA,MAAM,QAAuB;EAC5B,IAAI,KAAK,YAAY;EACrB,MAAM,WAAW,KAAK,UAAU;EAChC,IAAI,aAAa,KAAA,GAAW,MAAM;EAClC,IAAI,KAAK,YAAY;EACrB,IAAI,KAAK,UAAU;EACnB,MAAM,SAAS,KAAK,UAAU;EAC9B,IAAI,WAAW,KAAA,GAAW;GACzB,MAAM;GACN;EACD;EAEA,MAAM,KAAK,UAAU,cAAc,KAAK,OAAO,CAAC;CACjD;CAEA,MAAM,OAAiD;EACtD,MAAM,KAAK,UAAU,SAAS,YAAY,KAAA,CAAS;EACnD,IAAI,CAAC,KAAK,UAAU,OAAO,KAAK,QAAQ;EACxC,MAAM,SAAS,KAAK,UAAU;EAC9B,IAAI,WAAW,KAAA,GAAW,OAAO,MAAM;EAEvC,OAAO,MAAM,KAAK,UAAU,cAAc,KAAK,MAAM,CAAC;CACvD;CAEA,UAA2C;EAC1C,OAAO,wBAAwB,KAAK,QAAQ;CAC7C;CAEA,OAAO,SAA+C;EACrD,OAAO,qBAAqB,KAAK,QAAQ,GAAG,OAAO;CACpD;CAEA,QAAc;EACb,KAAK,WAAW,CAAC;EACjB,KAAK,SAAS,KAAK,OAAO;CAC3B;CAEA,UAAyB;EACxB,MAAM,SAAS,KAAK;EACpB,IAAI,WAAW,KAAA,GAAW,OAAO;EACjC,IAAI,KAAK,YAAY,OAAO,QAAQ,QAAQ;EAE5C,KAAK,aAAa;EAClB,MAAM,WAAW,KAAK,SAAS;EAC/B,KAAK,YAAY;EACjB,OAAO;CACR;CAIA,MAAM,SAAwB;EAC7B,KAAK,QAAQ,UAAU,yBAAyB,KAAK,uBAAuB,KAAK,QAAQ;EACzF,KAAK,QAAQ,UAAU,uBAAuB,KAAK,wBAAwB,KAAK,QAAQ;EAExF,IAAI;GACH,MAAM,KAAK,QAAQ,KAAK,kBAAkB,KAAA,GAAW,EAAE,SAAS,KAAK,SAAS,CAAC;GAC/E,MAAM,KAAK,QAAQ,KAClB,sBACA,EAAE,MAAM,6BAA6B,GACrC,EAAE,SAAS,KAAK,SAAS,CAC1B;GACA,MAAM,KAAK,QAAQ,KAClB,yCACA,EAAE,QAAQ,uBAAuB,GACjC,EAAE,SAAS,KAAK,SAAS,CAC1B;GACA,MAAM,KAAK,QAAQ,KAClB,oBACA;IAAE,YAAY;IAAwB,cAAc;GAAK,GACzD,EAAE,SAAS,KAAK,SAAS,CAC1B;GACA,IAAI,KAAK,YAAY;IACpB,KAAK,aAAa;IAClB;GACD;EACD,SAAS,OAAO;GACf,KAAK,aAAa;GAClB,MAAM;EACP;EAEA,KAAK,WAAW;EAChB,KAAK,SAAS,KAAK,OAAO;CAC3B;CAEA,MAAM,QAAkD;EACvD,KAAK,aAAa;EAClB,KAAK,WAAW;EAEhB,MAAM,WAAW,KAAK,QAAQ;EAC9B,KAAK,SAAS,KAAK,QAAQ,QAAQ;EACnC,OAAO;CACR;CAEA,MAAM,WAA0B;EAC/B,IAAI;GACH,MAAM,KAAK,KAAK;EACjB,QAAQ,CAER;EAEA,KAAK,WAAW,CAAC;EACjB,KAAK,SAAS,QAAQ;CACvB;CAEA,qBAAqB,QAAiD;EACrE,IAAI,OAAO,YAAA,6BAA0C;EAErD,MAAM,SAAS,0BAA0B,OAAO,UAAU;EAC1D,IAAI,WAAW,KAAA,GAAW;EAE1B,KAAK,SAAS,KAAK,MAAM;EACzB,KAAK,SAAS,KAAK,UAAU,MAAM;CACpC;CAEA,sBAAsB,QAAiD;EACtE,MAAM,SAAS,2BAA2B,MAAM;EAChD,IAAI,WAAW,KAAA,GAAW;EAE1B,KAAK,SAAS,KAAK,MAAM;EACzB,KAAK,SAAS,KAAK,UAAU,MAAM;CACpC;CAEA,eAAqB;EACpB,KAAK,QAAQ,YAAY,yBAAyB,KAAK,uBAAuB,KAAK,QAAQ;EAC3F,KAAK,QAAQ,YAAY,uBAAuB,KAAK,wBAAwB,KAAK,QAAQ;CAC3F;AACD;;;;;;;;;;;;;;ACjLA,IAAa,qBAAb,MAAuE;CACtE;CAEA,YAAY,OAA8B;EACzC,KAAK,SAAS;CACf;CAEA,MAAM,UAA6C;EAClD,MAAM,KAAK,OAAO,KAAK,oBAAoB;EAC3C,IAAI;GACH,OAAO,mBAAmB,MAAM,KAAK,OAAO,KAAK,wBAAwB,CAAC;EAC3E,UAAU;GACT,MAAM,KAAK,OAAO,KAAK,qBAAqB,CAAC,CAAC,YAAY,KAAA,CAAS;EACpE;CACD;AACD;;;;;;;;;;;;;;;ACZA,IAAa,kBAAb,MAAiE;CAChE;CACA,UAAU;CAEV,YAAY,OAA8B;EACzC,KAAK,SAAS;CACf;CAEA,IAAI,SAAkB;EACrB,OAAO,KAAK;CACb;CAEA,MAAM,MAAM,UAAkC;EAC7C,IAAI,KAAK,SAAS,MAAM,IAAI,aAAa,yCAAyC;EAClF,IAAI,aAAa,KAAA,GAAW;GAC3B,IAAI,CAAC,UAAU,QAAQ,KAAK,YAAY,GACvC,MAAM,IAAI,aACT,4DACA,KAAA,GACA,EACC,SACD,CACD;GAED,MAAM,KAAK,OAAO,KAAK,gCAAgC,EAAE,SAAS,CAAC;EACpE;EACA,MAAM,KAAK,OAAO,KAAK,iBAAiB;EACxC,IAAI;GACH,MAAM,KAAK,OAAO,KAAK,gBAAgB;GACvC,KAAK,UAAU;EAChB,SAAS,OAAO;GACf,MAAM,KAAK,OAAO,KAAK,kBAAkB,CAAC,CAAC,YAAY,KAAA,CAAS;GAChE,MAAM;EACP;CACD;CAEA,MAAM,OAAgC;EACrC,IAAI,CAAC,KAAK,SAAS,MAAM,IAAI,aAAa,qCAAqC;EAC/E,KAAK,UAAU;EACf,IAAI;EACJ,IAAI;GACH,SAAS,MAAM,KAAK,OAAO,KAAK,eAAe;EAChD,UAAU;GACT,MAAM,KAAK,OAAO,KAAK,kBAAkB,CAAC,CAAC,YAAY,KAAA,CAAS;EACjE;EACA,OAAO,mBAAmB,MAAM;CACjC;CAEA,MAAM,UAAyB;EAC9B,IAAI,CAAC,KAAK,SAAS;EACnB,MAAM,KAAK,KAAK,CAAC,CAAC,YAAY,KAAA,CAAS;CACxC;AACD;;;;;;;;;;;;;;;AC7CA,IAAa,iBAAb,MAA+D;CAC9D;CACA;CACA,UAAU;CACV;CACA;CACA,mBAA4B,KAAK,gBAAgB,KAAK,IAAI;CAE1D,YAAY,OAA8B,QAAiC;EAC1E,KAAK,SAAS;EACd,KAAK,UAAU;CAChB;CAEA,IAAI,SAAkB;EACrB,OAAO,KAAK;CACb;CAEA,MAAM,MAAM,SAAgD;EAC3D,IAAI,KAAK,SAAS,MAAM,IAAI,aAAa,mCAAmC;EAC5E,MAAM,aAAa,CAAC,GAAI,SAAS,cAAc,CAAC,qBAAqB,YAAY,CAAE;EACnF,IAAI,SAAS,gBAAgB,MAC5B,WAAW,KAAK,yCAAyC;EAE1D,IAAI,SAAS,aAAa,MACzB,WAAW,KAAK,qCAAqC;EAEtD,KAAK,WAAW;EAChB,KAAK,cAAc,QAAQ,cAAsB;EACjD,IAAI;GACH,MAAM,KAAK,OAAO,UAAU,2BAA2B,KAAK,gBAAgB;GAC5E,MAAM,KAAK,OAAO,KAAK,iBAAiB;IACvC,cAAc;IACd,aAAa,EACZ,oBAAoB,WACrB;GACD,CAAC;GACD,KAAK,UAAU;EAChB,SAAS,OAAO;GACf,MAAM,KAAK,OACT,YAAY,2BAA2B,KAAK,gBAAgB,CAAC,CAC7D,YAAY,KAAA,CAAS;GACvB,KAAK,WAAW,KAAA;GAChB,KAAK,cAAc,KAAA;GACnB,MAAM;EACP;CACD;CAEA,MAAM,OAAsC;EAC3C,IAAI,CAAC,KAAK,WAAW,KAAK,gBAAgB,KAAA,GACzC,MAAM,IAAI,aAAa,+BAA+B;EAEvD,MAAM,aAAa,KAAK;EACxB,MAAM,UAAU,KAAK;EACrB,KAAK,UAAU;EACf,IAAI;EACJ,MAAM,SAAuB,CAAC;EAC9B,IAAI;GACH,MAAM,KAAK,OAAO,KAAK,aAAa;GACpC,SAAS,MAAM,KAAK,MAAM,WAAW,OAAO;GAC5C,OAAO,MAAM;IACZ,MAAM,QAAQ,uBAAuB,MAAM,KAAK,OAAO,KAAK,WAAW,EAAE,QAAQ,OAAO,CAAC,CAAC;IAC1F,OAAO,KAAK,MAAM,KAAK;IACvB,IAAI,MAAM,KAAK;GAChB;EACD,UAAU;GACT,IAAI,WAAW,KAAA,GACd,MAAM,KAAK,OAAO,KAAK,YAAY,EAAE,QAAQ,OAAO,CAAC,CAAC,CAAC,YAAY,KAAA,CAAS;GAE7E,MAAM,KAAK,OACT,YAAY,2BAA2B,KAAK,gBAAgB,CAAC,CAC7D,YAAY,KAAA,CAAS;GACvB,KAAK,WAAW,KAAA;GAChB,KAAK,cAAc,KAAA;EACpB;EACA,MAAM,QAAQ,YAAY,MAAM;EAChC,IAAI,SAAS,SAAS,KAAA,GAAW;GAChC,IAAI,KAAK,YAAY,KAAA,GACpB,MAAM,IAAI,aAAa,iDAAiD;GAEzE,MAAM,KAAK,QAAQ,MAAM,QAAQ,MAAM,KAAK;EAC7C;EACA,OAAO;GAAE;GAAO,MAAM,SAAS;EAAK;CACrC;CAEA,MAAM,UAAyB;EAC9B,IAAI,CAAC,KAAK,SAAS;EACnB,MAAM,KAAK,KAAK,CAAC,CAAC,YAAY,KAAA,CAAS;CACxC;CAEA,MAAM,MAAM,SAA2C;EACtD,MAAM,WAAW,QAAQ,cAAsB;EAC/C,MAAM,QAAQ,iBAAiB;GAC9B,SAAS,OAAO,IAAI,aAAa,oCAAoC,CAAC;EACvE,GAAG,0BAA0B;EAC7B,QAAa,KAAK,SAAS,SAAS,SAAS,MAAM;EACnD,IAAI;GACH,OAAO,MAAM,SAAS;EACvB,UAAU;GACT,aAAa,KAAK;EACnB;CACD;CAEA,gBAAgB,QAAiD;EAChE,MAAM,aAAa,KAAK;EACxB,IAAI,eAAe,KAAA,GAAW;EAC9B,IAAI,SAAS,OAAO,SAAS,GAAG,WAAW,QAAQ,OAAO,SAAS;OAC9D,WAAW,OAAO,IAAI,aAAa,2CAA2C,CAAC;CACrF;AACD;;;;;;;;;;;;;;;AC1GA,IAAa,qBAAb,MAAuE;CACtE;CACA;CACA;CACA;CAEA,YAAY,OAA8B,QAAiC;EAC1E,KAAK,WAAW,IAAI,eAAe,OAAO,MAAM;EAChD,KAAK,YAAY,IAAI,gBAAgB,KAAK;EAC1C,KAAK,eAAe,IAAI,mBAAmB,KAAK;EAChD,KAAK,YAAY,IAAI,gBAAgB,KAAK;CAC3C;CAEA,IAAI,UAAmC;EACtC,OAAO,KAAK;CACb;CAEA,IAAI,WAAqC;EACxC,OAAO,KAAK;CACb;CAEA,IAAI,cAA2C;EAC9C,OAAO,KAAK;CACb;CAEA,IAAI,WAAqC;EACxC,OAAO,KAAK;CACb;CAEA,MAAM,UAAyB;EAC9B,MAAM,KAAK,SAAS,QAAQ;EAC5B,MAAM,KAAK,UAAU,QAAQ;EAC7B,MAAM,KAAK,UAAU,QAAQ;CAC9B;AACD;;;;;;AClDA,IAAa,gBAAb,MAA6D;CAC5D;CACA;CACA;CACA;CACA,WAAW;CACX,YAAY;CAEZ,YACC,OACA,UACA,SACA,OACC;EACD,KAAK,SAAS;EACd,KAAK,YAAY;EACjB,KAAK,WAAW;EAChB,KAAK,WAAW;CACjB;CAEA,IAAI,WAAkC;EACrC,OAAO,KAAK;CACb;CAEA,IAAI,UAAkB;EACrB,OAAO,KAAK;CACb;CAEA,IAAI,UAAkB;EACrB,OAAO,KAAK;CACb;CAEA,MAAM,OAAO,OAA+B;EAC3C,KAAK,QAAQ;EACb,KAAK,YAAY;EACjB,IAAI;GACH,MAAM,KAAK,OAAO,KAAK,+BAA+B;IACrD,QAAQ;IACR,YAAY;GACb,CAAC;GACD,KAAK,WAAW;EACjB,UAAU;GACT,KAAK,YAAY;EAClB;CACD;CAEA,MAAM,UAAyB;EAC9B,KAAK,QAAQ;EACb,KAAK,YAAY;EACjB,IAAI;GACH,MAAM,KAAK,OAAO,KAAK,+BAA+B,EAAE,QAAQ,MAAM,CAAC;GACvE,KAAK,WAAW;EACjB,UAAU;GACT,KAAK,YAAY;EAClB;CACD;CAEA,UAAgB;EACf,IAAI,KAAK,YAAY,KAAK,WACzB,MAAM,IAAI,aAAa,mCAAmC;CAE5D;AACD;;;;;;AC3DA,IAAa,kBAAb,MAAiE;CAChE;CACA;CACA;CACA;CACA;CACA;CACA,UAAiC;CACjC,YAAY;CACZ,SAAS;CACT;CAEA,YAAY,QAA4B,IAAY,KAAa,MAAc,SAAkB;EAChG,KAAK,UAAU;EACf,KAAK,WAAW;EAChB,KAAK,MAAM;EACX,KAAK,OAAO;EACZ,KAAK,QAAQ;EACb,KAAK,WAAW,IAAI,QAAQ;CAC7B;CAEA,IAAI,UAAqD;EACxD,OAAO,KAAK;CACb;CAEA,IAAI,KAAa;EAChB,OAAO,KAAK;CACb;CAEA,IAAI,MAAc;EACjB,OAAO,KAAK;CACb;CAEA,IAAI,OAAe;EAClB,OAAO,KAAK;CACb;CAEA,IAAI,SAAgC;EACnC,OAAO,KAAK;CACb;CAEA,IAAI,WAAmB;EACtB,OAAO,KAAK;CACb;CAEA,IAAI,QAAgB;EACnB,OAAO,KAAK;CACb;CAEA,IAAI,OAA2B;EAC9B,OAAO,KAAK;CACb;CAEA,MAAM,SAAwB;EAC7B,IAAI,KAAK,YAAY,WAAW;EAChC,MAAM,SAAkC,EAAE,MAAM,KAAK,IAAI;EACzD,IAAI,KAAK,aAAa,KAAA,GAAW,OAAO,sBAAsB,KAAK;EACnE,MAAM,KAAK,QAAQ,KAAK,0BAA0B,MAAM;CACzD;CAEA,OAAO,UAAyC;EAC/C,IAAI,KAAK,YAAY,WAAW;EAChC,KAAK,YAAY,SAAS;EAC1B,KAAK,SAAS,SAAS;EACvB,KAAK,QAAQ,SAAS;EACtB,KAAK,SAAS,KAAK,YAAY,KAAK,WAAW,KAAK,MAAM;EAC1D,IAAI,SAAS,WAAW,YAAY;GACnC,KAAK,UAAU;GACf,KAAK,SAAS,KAAK,YAAY,KAAK,KAAK;GACzC,KAAK,SAAS,QAAQ;EACvB,OAAO,IAAI,SAAS,WAAW,aAAa;GAC3C,KAAK,UAAU;GACf,KAAK,SAAS,KAAK,QAAQ;GAC3B,KAAK,SAAS,QAAQ;EACvB;CACD;AACD;;;;;;ACjFA,IAAa,gBAAb,MAAa,cAAgD;CAC5D;CACA;CACA;CACA,YAAY;CAEZ,YAAY,QAA4B,SAAiB,IAAY;EACpE,KAAK,UAAU;EACf,KAAK,WAAW;EAChB,KAAK,MAAM;CACZ;CAEA,IAAI,KAAa;EAChB,OAAO,KAAK;CACb;CAEA,MAAM,QAA0B;EAC/B,OAAO,MAAM,KAAK,KAAK,4BAA4B;CACpD;CAEA,MAAM,KAAK,aAAqB,MAA6C;EAC5E,KAAK,QAAQ;EAYb,OAAO,qBAAqB,MAXP,KAAK,QAAQ,KACjC,0BACA;GACC,UAAU,KAAK;GACf,qBAAqB;GACrB,WAAW,MAAM,KAAK,WAAW,EAAE,MAAM,EAAE;GAC3C,cAAc;GACd,eAAe;EAChB,GACA,EAAE,SAAS,KAAK,SAAS,CAC1B,CACkC;CACnC;CAEA,MAAM,SAAS,MAA2D;EACzE,KAAK,QAAQ;EACb,MAAM,SAAS,MAAM,KAAK,QAAQ,KACjC,0BACA;GACC,UAAU,KAAK;GACf,qBAAqB;GACrB,WAAW,CAAC,EAAE,OAAO,KAAK,CAAC;GAC3B,cAAc;GACd,eAAe;EAChB,GACA,EAAE,SAAS,KAAK,SAAS,CAC1B;EACA,IAAI,CAAC,SAAS,MAAM,KAAK,CAAC,SAAS,OAAO,SAAS,GAAG,OAAO,KAAA;EAC7D,MAAM,KAAK,OAAO,SAAS,CAAC;EAC5B,OAAO,SAAS,EAAE,IAAI,IAAI,cAAc,KAAK,SAAS,KAAK,UAAU,EAAE,IAAI,KAAA;CAC5E;CAEA,MAAM,aAAyD;EAC9D,MAAM,QAAQ,MAAM,KAAK,KACxB,+GACD;EACA,IAAI,CAAC,SAAS,KAAK,GAClB,MAAM,IAAI,aAAa,wDAAwD;EAEhF,OAAO;CACR;CAEA,MAAM,UAAyB;EAC9B,IAAI,KAAK,WAAW;EACpB,KAAK,YAAY;EACjB,IAAI,CAAC,KAAK,QAAQ,WAAW;EAC7B,IAAI;GACH,MAAM,KAAK,QAAQ,KAClB,yBACA,EAAE,UAAU,KAAK,IAAI,GACrB,EACC,SAAS,KAAK,SACf,CACD;EACD,QAAQ,CAER;CACD;CAEA,UAAgB;EACf,IAAI,KAAK,WAAW,MAAM,IAAI,aAAa,4BAA4B;EACvE,IAAI,CAAC,KAAK,QAAQ,WAAW,MAAM,IAAI,aAAa,gCAAgC;CACrF;AACD;;;;;;;;;;;;;;;ACrEA,IAAa,kBAAb,MAAiE;CAChE;CACA,6BAAsB,IAAI,IAAY;CAEtC,YAAY,OAA8B;EACzC,KAAK,SAAS;CACf;CAEA,MAAM,KAAK,OAA8B;EACxC,MAAM,MAAM,kBAAkB,KAAK;EACnC,MAAM,WAAW;GAAC;GAAO;GAAW;GAAQ;EAAO,CAAC,CAAC,SAAS,IAAI,GAAG;EACrE,MAAM,YAAY,wBAAwB,CAAC,GAAG,KAAK,YAAY,GAAI,WAAW,CAAC,IAAI,GAAG,IAAI,CAAC,CAAE,CAAC;EAC9F,MAAM,OAAO,cAAc,KAAK,cAAc,IAAI,IAAI,OAAO,KAAA;EAC7D,MAAM,KAAK,OAAO,KAAK,0BAA0B;GAChD,MAAM;GACN,KAAK,IAAI;GACT,MAAM,IAAI;GACV;GACA,gBAAgB,IAAI;GACpB,uBAAuB,IAAI;GAC3B,sBAAsB,IAAI;GAC1B;EACD,CAAC;EACD,IAAI,UAAU,KAAK,WAAW,IAAI,IAAI,GAAG;CAC1C;CAEA,MAAM,GAAG,OAA8B;EACtC,MAAM,MAAM,kBAAkB,KAAK;EACnC,IAAI;GACH,MAAM,KAAK,OAAO,KAAK,0BAA0B;IAChD,MAAM;IACN,KAAK,IAAI;IACT,MAAM,IAAI;IACV,uBAAuB,IAAI;IAC3B,sBAAsB,IAAI;IAC1B,WAAW,wBAAwB,CAAC,GAAG,KAAK,UAAU,CAAC;GACxD,CAAC;EACF,UAAU;GACT,KAAK,WAAW,OAAO,IAAI,GAAG;EAC/B;CACD;CAEA,MAAM,MAAM,OAAe,SAA8C;EACxE,4BAA4B,OAAO;EACnC,MAAM,QAAQ,oBAAoB,KAAK;EACvC,KAAK,MAAM,YAAY,MAAM,WAAW,MAAM,KAAK,KAAK,QAAQ;EAChE,IAAI;GACH,MAAM,KAAK,KAAK,MAAM,GAAG;GACzB,IAAI,SAAS,UAAU,KAAA,KAAa,QAAQ,QAAQ,GACnD,MAAM,IAAI,SAAS,YAAY,WAAW,SAAS,QAAQ,KAAK,CAAC;GAElE,MAAM,KAAK,GAAG,MAAM,GAAG;EACxB,UAAU;GACT,KAAK,MAAM,YAAY,CAAC,GAAG,MAAM,SAAS,CAAC,CAAC,QAAQ,GAAG,MAAM,KAAK,GAAG,QAAQ;EAC9E;CACD;CAEA,MAAM,KAAK,OAAe,SAA8C;EACvE,4BAA4B,OAAO;EACnC,KAAK,MAAM,aAAa,OAAO;GAC9B,MAAM,KAAK,KAAK,SAAS;GACzB,MAAM,KAAK,GAAG,SAAS;GACvB,IAAI,SAAS,UAAU,KAAA,KAAa,QAAQ,QAAQ,GACnD,MAAM,IAAI,SAAS,YAAY,WAAW,SAAS,QAAQ,KAAK,CAAC;EAEnE;CACD;CAEA,MAAM,OAAO,OAA8B;EAC1C,MAAM,KAAK,OAAO,KAAK,oBAAoB,EAAE,MAAM,MAAM,CAAC;CAC3D;AACD;;;;;;;;;;;;;;;ACrEA,IAAa,eAAb,MAA2D;CAC1D;CACA,2BAAoB,IAAI,IAAwB;CAChD,SAAuB;EAAE,GAAG;EAAG,GAAG;CAAE;CAEpC,YAAY,OAA8B;EACzC,KAAK,SAAS;CACf;CAEA,MAAM,KAAK,OAAoC;EAC9C,qBAAqB,KAAK;EAC1B,KAAK,SAAS;EACd,MAAM,KAAK,OAAO,KAAK,4BAA4B;GAClD,MAAM;GACN,GAAG,MAAM;GACT,GAAG,MAAM;GACT,QAAQ;GACR,SAAS,sBAAsB,CAAC,GAAG,KAAK,QAAQ,CAAC;EAClD,CAAC;CACF;CAEA,MAAM,KAAK,SAA6B,QAAQ,QAAQ,GAAkB;EACzE,4BAA4B,EAAE,MAAM,CAAC;EACrC,MAAM,UAAU,IAAI,IAAI,KAAK,QAAQ;EACrC,QAAQ,IAAI,MAAM;EAClB,MAAM,KAAK,OAAO,KAAK,4BAA4B;GAClD,MAAM;GACN,GAAG,KAAK,OAAO;GACf,GAAG,KAAK,OAAO;GACf;GACA,SAAS,sBAAsB,CAAC,GAAG,OAAO,CAAC;GAC3C,YAAY;EACb,CAAC;EACD,KAAK,SAAS,IAAI,MAAM;CACzB;CAEA,MAAM,GAAG,SAA6B,QAAQ,QAAQ,GAAkB;EACvE,4BAA4B,EAAE,MAAM,CAAC;EACrC,MAAM,UAAU,IAAI,IAAI,KAAK,QAAQ;EACrC,QAAQ,OAAO,MAAM;EACrB,IAAI;GACH,MAAM,KAAK,OAAO,KAAK,4BAA4B;IAClD,MAAM;IACN,GAAG,KAAK,OAAO;IACf,GAAG,KAAK,OAAO;IACf;IACA,SAAS,sBAAsB,CAAC,GAAG,OAAO,CAAC;IAC3C,YAAY;GACb,CAAC;EACF,UAAU;GACT,KAAK,SAAS,OAAO,MAAM;EAC5B;CACD;CAEA,MAAM,MAAM,OAAqB,SAA8C;EAC9E,4BAA4B,OAAO;EACnC,MAAM,SAAS,SAAS,UAAU;EAClC,MAAM,QAAQ,SAAS,SAAS;EAChC,MAAM,KAAK,KAAK,KAAK;EACrB,MAAM,KAAK,KAAK,QAAQ,KAAK;EAC7B,IAAI,SAAS,UAAU,KAAA,KAAa,QAAQ,QAAQ,GACnD,MAAM,IAAI,SAAS,YAAY,WAAW,SAAS,QAAQ,KAAK,CAAC;EAElE,MAAM,KAAK,GAAG,QAAQ,KAAK;CAC5B;CAEA,MAAM,KAAK,OAAqB,KAAmB,SAA6C;EAC/F,4BAA4B,OAAO;EACnC,qBAAqB,KAAK;EAC1B,qBAAqB,GAAG;EACxB,MAAM,QAAQ,SAAS,SAAS;EAChC,MAAM,KAAK,KAAK,KAAK;EACrB,MAAM,KAAK,KAAK,SAAS,UAAU,QAAQ,CAAC;EAC5C,IAAI;GACH,KAAK,IAAI,OAAO,GAAG,QAAQ,OAAO,QAAQ,GAAG;IAC5C,MAAM,KAAK,KAAK;KACf,GAAG,MAAM,KAAM,IAAI,IAAI,MAAM,KAAK,OAAQ;KAC1C,GAAG,MAAM,KAAM,IAAI,IAAI,MAAM,KAAK,OAAQ;IAC3C,CAAC;IACD,IAAI,SAAS,UAAU,KAAA,KAAa,QAAQ,QAAQ,GACnD,MAAM,IAAI,SAAS,YAAY,WAAW,SAAS,QAAQ,KAAK,CAAC;GAEnE;EACD,UAAU;GACT,MAAM,KAAK,GAAG,SAAS,UAAU,QAAQ,CAAC;EAC3C;CACD;CAEA,MAAM,MAAM,OAAoC;EAC/C,qBAAqB,KAAK;EAC1B,MAAM,KAAK,OAAO,KAAK,4BAA4B;GAClD,MAAM;GACN,GAAG,KAAK,OAAO;GACf,GAAG,KAAK,OAAO;GACf,QAAQ,MAAM;GACd,QAAQ,MAAM;GACd,SAAS,sBAAsB,CAAC,GAAG,KAAK,QAAQ,CAAC;EAClD,CAAC;CACF;AACD;;;;;;;;;;;;;;;ACvEA,IAAa,iBAAb,MAAa,eAAkD;CAC9D;CACA;CAEA,YAAY,OAA8B,OAAqB;EAC9D,KAAK,SAAS;EACd,KAAK,SAAS;CACf;CAEA,IAAI,QAA+B;EAClC,OAAO,KAAK;CACb;CAEA,IAAI,QAAsB;EACzB,OAAO,KAAK;CACb;CAEA,QAAQ,UAA2C;EAClD,OAAO,IAAI,eAAe,KAAK,QAAQ;GACtC,UAAU;GACV,OAAO;GACP,QAAQ,KAAK;EACd,CAAC;CACF;CAEA,OAAO,SAAwD;EAC9D,OAAO,IAAI,eAAe,KAAK,QAAQ;GAAE,GAAG,KAAK;GAAQ,QAAQ;EAAQ,CAAC;CAC3E;CAEA,QAAiC;EAChC,OAAO,KAAK,KAAK,CAAC;CACnB;CAEA,OAAgC;EAC/B,OAAO,KAAK,KAAK,EAAE;CACpB;CAEA,KAAK,OAAwC;EAC5C,IAAI,CAAC,UAAU,KAAK,GAAG,MAAM,IAAI,aAAa,0CAA0C;EACxF,OAAO,IAAI,eAAe,KAAK,QAAQ;GAAE,GAAG,KAAK;GAAQ;EAAM,CAAC;CACjE;CAEA,MAAM,QAAyB;EAC9B,MAAM,QAAQ,MAAM,KAAK,OAAO,SAC/B,IAAI,6BAA6B,KAAK,MAAM,EAAE,SAC/C;EACA,IAAI,CAAC,UAAU,KAAK,KAAK,QAAQ,GAChC,MAAM,IAAI,aAAa,iEAAiE;EAEzF,OAAO;CACR;CAEA,MAAM,MAAmD;EACxD,MAAM,QAAQ,MAAM,KAAK,MAAM;EAC/B,MAAM,WAAsC,CAAC;EAC7C,KAAK,IAAI,QAAQ,GAAG,QAAQ,OAAO,SAAS,GAC3C,SAAS,KAAK,KAAK,KAAK,KAAK,CAAC;EAE/B,OAAO;CACR;CAEA,MAAM,MAAM,SAAqD;EAChE,MAAM,SAAS,MAAM,KAAK,SAAS,SAAS,SAAS;EACrD,IAAI;GACH,MAAM,QAAQ,MAAM,KAAK,OAAO,QAAQ,SAAS;IAChD,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,SAAS;GACV,CAAC;GACD,IAAI,SAAS,UAAU,MAAM;GAC7B,MAAM,KAAK,OAAO,MAAM,MAAM,OAAO,OAAO;EAC7C,UAAU;GACT,MAAM,OAAO,QAAQ;EACtB;CACD;CAEA,MAAM,KAAK,OAAe,SAA+C;EACxE,MAAM,SAAS,MAAM,KAAK,SAAS,SAAS,SAAS;EACrD,IAAI;GACH,IAAI,SAAS,UAAU,MACtB,MAAM,OAAO,KACZ,6BAA6B;IAC5B,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,UAAU;GACX,CAAC,CACF;GAED,IAAI,SAAS,UAAU,MAAM;GAC7B,MAAM,OAAO,KAAK;;;;;;;;;;;KAWhB;GACF,MAAM,KAAK,OAAO,SAAS,OAAO,KAAK;EACxC,UAAU;GACT,MAAM,OAAO,QAAQ;EACtB;CACD;CAEA,MAAM,OAAO,QAA2B,SAA+C;EACtF,MAAM,SAAS,MAAM,KAAK,SAAS,SAAS,SAAS;EACrD,IAAI;GACH,IAAI,SAAS,UAAU,MACtB,MAAM,OAAO,KACZ,6BAA6B;IAC5B,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,SAAS;GACV,CAAC,CACF;GAED,IAAI,SAAS,UAAU,MAAM;GAC7B,MAAM,OAAO,KACZ;;;;;;;;;QAUA,CAAC,CAAC,GAAG,MAAM,CAAC,CACb;EACD,UAAU;GACT,MAAM,OAAO,QAAQ;EACtB;CACD;CAEA,MAAM,MAAM,SAAqD;EAChE,IAAK,MAAM,KAAK,SAAS,SAAS,MAAO,MAAM;EAC/C,MAAM,KAAK,MAAM,OAAO;EACxB,IAAK,MAAM,KAAK,SAAS,SAAS,MAAO,MACxC,MAAM,IAAI,aAAa,wCAAwC;CAEjE;CAEA,MAAM,QAAQ,SAAqD;EAClE,IAAK,MAAM,KAAK,SAAS,SAAS,MAAO,OAAO;EAChD,MAAM,KAAK,MAAM,OAAO;EACxB,IAAK,MAAM,KAAK,SAAS,SAAS,MAAO,OACxC,MAAM,IAAI,aAAa,0CAA0C;CAEnE;CAEA,MAAM,MAAM,SAAgD;EAC3D,MAAM,SAAS,MAAM,KAAK,SAAS,SAAS,SAAS;EACrD,IAAI;GACH,MAAM,QAAQ,MAAM,KAAK,OAAO,QAAQ,SAAS;IAChD,SAAS;IACT,QAAQ;IACR,QAAQ;GACT,CAAC;GACD,IAAI,SAAS,UAAU,MAAM,MAAM,KAAK,OAAO,MAAM,KAAK,KAAK;EAChE,UAAU;GACT,MAAM,OAAO,QAAQ;EACtB;CACD;CAEA,MAAM,MAAM,SAA+C;EAC1D,MAAM,SAAS,MAAM,KAAK,SAAS,SAAS,UAAU;EACtD,IAAI;GACH,IAAI,SAAS,UAAU,MAAM,MAAM,OAAO,KAAK,6BAA6B;EAC7E,UAAU;GACT,MAAM,OAAO,QAAQ;EACtB;CACD;CAEA,MAAM,MAAM,KAAa,SAAoD;EAC5E,MAAM,KAAK,MAAM,OAAO;EACxB,IAAI,SAAS,UAAU,MAAM,MAAM,KAAK,OAAO,SAAS,MAAM,KAAK,OAAO;CAC3E;CAEA,MAAM,KAAK,OAAe,SAAoD;EAC7E,MAAM,KAAK,MAAM,OAAO;EACxB,IAAI,SAAS,UAAU,MAAM,MAAM,KAAK,OAAO,SAAS,KAAK,OAAO,OAAO;CAC5E;CAEA,MAAM,MAAM,SAA+C;EAC1D,MAAM,SAAS,MAAM,KAAK,SAAS,SAAS,SAAS;EACrD,IAAI;GACH,IAAI,SAAS,UAAU,MAAM;GAC7B,MAAM,OAAO,KAAK;;;;;;;;;;;KAWhB;EACH,UAAU;GACT,MAAM,OAAO,QAAQ;EACtB;CACD;CAEA,MAAM,KAAK,SAA6C;EACvD,MAAM,UAAU,SAAS,WAAA;EACzB,IAAI,CAAC,eAAe,OAAO,KAAK,UAAU,GACzC,MAAM,IAAI,aACT,6DACA,KAAA,GACA,EACC,QACD,CACD;EAED,MAAM,QAAQ,SAAS,SAAS;EAChC,MAAM,aAAa,KAAK,gBAAgB,OAAO,SAAS,UAAU,MAAM,OAAO;EAC/E,IAAI;EACJ,IAAI;GACH,QAAQ,MAAM,KAAK,OAAO,SAAS,YAAY,UAAA,GAAuC;EACvF,SAAS,OAAO;GACf,MAAM,IAAI,qBAAqB,+BAA+B;IAC7D,OAAO,KAAK;IACZ;IACA;IACA,OAAO,KAAK,OAAO;IACnB;GACD,CAAC;EACF;EACA,IAAI,UAAU,MAAM;EACpB,MAAM,IAAI,qBAAqB,uCAAuC;GACrE,OAAO,KAAK;GACZ;GACA;GACA,OAAO,KAAK,OAAO;EACpB,CAAC;CACF;CAEA,MAAM,OAAwB;EAI7B,OAAO,qBAAqB,MAHR,KAAK,OAAO,SAC/B,IAAI,yBAAyB,KAAK,MAAM,EAAE,aAC3C,GACmC,sBAAsB;CAC1D;CAEA,MAAM,QAAoC;EACzC,MAAM,QAAQ,MAAM,KAAK,OAAO,SAC/B,IAAI,6BAA6B,KAAK,MAAM,EAAE,sCAC/C;EACA,MAAM,QAAQ,WAAW,OAAO,QAAQ;EACxC,IAAI,UAAU,KAAA,GACb,MAAM,IAAI,aAAa,wCAAwC;EAEhE,OAAO;CACR;CAEA,MAAM,OAAwB;EAC7B,OAAO,MAAM,KAAK,QAAQ,aAAa,sBAAsB;CAC9D;CAEA,MAAM,QAAyB;EAI9B,OAAO,qBAAqB,MAHR,KAAK,OAAO,SAC/B,4BAA4B,yBAAyB,KAAK,MAAM,EAAE,mFACnE,GACmC,uBAAuB;CAC3D;CAEA,MAAM,UAAU,MAA2C;EAC1D,MAAM,QAAQ,MAAM,KAAK,OAAO,SAC/B,IAAI,yBAAyB,KAAK,MAAM,EAAE,kBAAkB,KAAK,UAAU,IAAI,EAAE,EAClF;EACA,OAAO,SAAS,KAAK,IAAI,QAAQ,KAAA;CAClC;CAEA,MAAM,UAA4B;EACjC,OAAO,MAAM,KAAK,SAAS,SAAS;CACrC;CAEA,MAAM,UAA4B;EACjC,OAAO,MAAM,KAAK,SAAS,SAAS;CACrC;CAEA,MAAM,WAA6B;EAClC,OAAO,MAAM,KAAK,SAAS,UAAU;CACtC;CAEA,MAAM,WAAW,SAAsE;EACtF,IAAI,SAAS,SAAS,QAAQ,SAAS,SAAS,KAAA,GAC/C,MAAM,IAAI,aAAa,gEAAgE;EAExF,MAAM,SAAS,MAAM,KAAK,SAAS,KAAA,GAAW,SAAS;EACvD,IAAI;EACJ,IAAI;GACH,MAAM,OAAO,KACZ,6BAA6B;IAC5B,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,SAAS;GACV,CAAC,CACF;GACA,MAAM,OAAO,MAAM,KAAK,MAAM,MAAM;GACpC,MAAM,KAAK;IAAC,KAAK,OAAO;IAAI,KAAK,OAAO;IAAI,KAAK,OAAO;IAAI,KAAK,OAAO;GAAE;GAC1E,MAAM,KAAK;IAAC,KAAK,OAAO;IAAI,KAAK,OAAO;IAAI,KAAK,OAAO;IAAI,KAAK,OAAO;GAAE;GAC1E,MAAM,IAAI,KAAK,IAAI,GAAG,EAAE;GACxB,MAAM,IAAI,KAAK,IAAI,GAAG,EAAE;GACxB,MAAM,QAAQ,KAAK,IAAI,GAAG,EAAE,IAAI;GAChC,MAAM,SAAS,KAAK,IAAI,GAAG,EAAE,IAAI;GACjC,MAAM,SAAkC;IACvC,GAAG,0BAA0B,OAAO;IACpC,MAAM;KAAE;KAAG;KAAG;KAAO;KAAQ,OAAO;IAAE;IACtC,uBAAuB;GACxB;GACA,IAAI,SAAS,UAAU,UAAU;IAChC,MAAM,QAAQ,MAAM,KAAK,OAAO,SAAS,kBAAkB;IAC3D,IAAI,CAAC,eAAe,KAAK,KAAK,SAAS,GACtC,MAAM,IAAI,aAAa,8CAA8C;IAEtE,OAAO,UAAU;KAAE;KAAG;KAAG;KAAO;KAAQ,OAAO;IAAM;GACtD;GACA,MAAM,cAAc,uCAAuC,OAAO;GAClE,IAAI,gBAAgB,KAAA,GAAW;IAC9B,MAAM,QAAQ,MAAM,KAAK,OAAO,SAAS,WAAW;IACpD,IAAI,CAAC,SAAS,KAAK,GAAG,MAAM,IAAI,aAAa,uCAAuC;IACpF,QAAQ;GACT;GACA,IAAI,SAAS,gBAAgB,MAC5B,MAAM,KAAK,OAAO,KAAK,+CAA+C,EACrE,OAAO;IAAE,GAAG;IAAG,GAAG;IAAG,GAAG;IAAG,GAAG;GAAE,EACjC,CAAC;GAEF,IAAI;IACH,MAAM,SAAS,MAAM,KAAK,OAAO,KAAK,0BAA0B,MAAM;IACtE,IAAI,CAAC,SAAS,MAAM,KAAK,CAAC,SAAS,OAAO,OAAO,GAChD,MAAM,IAAI,aAAa,6CAA6C;IAErE,MAAM,QAAQ,aAAa,OAAO,OAAO;IACzC,IAAI,SAAS,SAAS,KAAA,GAAW,MAAM,KAAK,OAAO,KAAK,QAAQ,MAAM,KAAK;IAC3E,OAAO;KAAE;KAAO,MAAM,SAAS;IAAK;GACrC,UAAU;IACT,IAAI,SAAS,gBAAgB,MAC5B,MAAM,KAAK,OACT,KAAK,6CAA6C,CAAC,CACnD,YAAY,KAAA,CAAS;GAEzB;EACD,UAAU;GACT,IAAI,UAAU,KAAA,GACb,MAAM,KAAK,OAAO,SAAS,mCAAmC,KAAK,CAAC,CAAC,CAAC,YAAY,KAAA,CAAS;GAE5F,MAAM,OAAO,QAAQ;EACtB;CACD;CAEA,MAAM,OAAO,SAA8C;EAC1D,MAAM,SAAS,MAAM,KAAK,SAAS,SAAS,UAAU;EACtD,IAAI;GACH,IAAI,QAAQ,UAAU,MAAM;GAC5B,MAAM,KAAK,OAAO,KAAK,yBAAyB;IAC/C,UAAU,OAAO;IACjB,OAAO,CAAC,GAAG,QAAQ,KAAK;GACzB,CAAC;EACF,UAAU;GACT,MAAM,OAAO,QAAQ;EACtB;CACD;CAEA,MAAM,KAAK,QAAiC,SAAoD;EAC/F,IAAI,OAAO,MAAM,OAAO,KAAK,OAAO,IACnC,MAAM,IAAI,aAAa,mDAAmD;EAE3E,MAAM,eAAe,MAAM,KAAK,SAAS,SAAS,SAAS;EAC3D,IAAI;EACJ,IAAI;GACH,MAAM,OAAO,KAAK;IACjB,GAAI,SAAS,YAAY,KAAA,IAAY,EAAE,SAAS,QAAQ,QAAQ,IAAI,CAAC;IACrE,GAAI,SAAS,WAAW,KAAA,IAAY,EAAE,QAAQ,QAAQ,OAAO,IAAI,CAAC;IAClE,OAAO;GACR,CAAC;GACD,eAAe,MAAM,OAAO,MAAM,OAAO,yBAAyB,OAAO,KAAK,CAAC;GAC/E,MAAM,SAAS,MAAM,KAAK,OAAO,cAAc,SAAS;IACvD,SAAS;IACT,QAAQ;IACR,QAAQ;GACT,CAAC;GACD,MAAM,cAAc,MAAM,KAAK,OAAO,cAAc,KAAA,GAAW;IAC9D,SAAS;IACT,QAAQ;IACR,QAAQ;GACT,CAAC;GACD,IAAI,SAAS,UAAU,MACtB,MAAM,KAAK,OAAO,MAAM,KAAK,QAAQ,aAAa,OAAO;EAE3D,UAAU;GACT,MAAM,aAAa,QAAQ;GAC3B,MAAM,cAAc,QAAQ;EAC7B;CACD;CAEA,MAAM,SACL,SACA,OACkC;EAClC,4BAA4B,OAAO;EACnC,MAAM,KAAK,KAAK;GACf,GAAI,SAAS,YAAY,KAAA,IAAY,EAAE,SAAS,QAAQ,QAAQ,IAAI,CAAC;GACrE,GAAI,SAAS,WAAW,KAAA,IAAY,EAAE,QAAQ,QAAQ,OAAO,IAAI,CAAC;GAClE;EACD,CAAC;EACD,OAAO,MAAM,KAAK,OAAO,OAAO,yBAAyB,KAAK,MAAM,CAAC;CACtE;CAEA,MAAM,OACL,QACA,SACA,eACwB;EACxB,IAAI,SAAS,UAAU,MACtB,MAAM,OAAO,KACZ,6BAA6B;GAC5B,GAAG;GACH,GAAI,SAAS,aAAa,KAAA,IAAY,EAAE,UAAU,QAAQ,SAAS,IAAI,CAAC;EACzE,CAAC,CACF;EAED,MAAM,OAAO,MAAM,KAAK,MAAM,MAAM;EACpC,IAAI,SAAS,aAAa,KAAA,GAAW,OAAO,KAAK;EACjD,MAAM,KAAK;GAAC,KAAK,OAAO;GAAI,KAAK,OAAO;GAAI,KAAK,OAAO;GAAI,KAAK,OAAO;EAAE;EAC1E,MAAM,KAAK;GAAC,KAAK,OAAO;GAAI,KAAK,OAAO;GAAI,KAAK,OAAO;GAAI,KAAK,OAAO;EAAE;EAC1E,OAAO;GACN,GAAG,KAAK,IAAI,GAAG,EAAE,IAAI,QAAQ,SAAS;GACtC,GAAG,KAAK,IAAI,GAAG,EAAE,IAAI,QAAQ,SAAS;EACvC;CACD;CAEA,MAAM,MAAM,QAA6E;EACxF,OAAO,gBAAgB,MAAM,KAAK,OAAO,KAAK,uBAAuB,EAAE,UAAU,OAAO,GAAG,CAAC,CAAC;CAC9F;CAEA,MAAM,QAAQ,UAAkB,OAAgC;EAI/D,OAAO,qBAAqB,MAHR,KAAK,OAAO,SAC/B,IAAI,yBAAyB,KAAK,MAAM,EAAE,MAAM,KAAK,UAAU,QAAQ,EAAE,EAC1E,GACmC,KAAK;CACzC;CAEA,MAAM,SAAS,UAA4E;EAC1F,IAAI;EACJ,QAAQ,UAAR;GACC,KAAK;IACJ,aAAa,YAAY,yBAAyB,KAAK,MAAM,EAAE;IAC/D;GACD,KAAK;IACJ,aAAa,4BAA4B,yBAAyB,KAAK,MAAM,EAAE;IAC/E;GACD,KAAK;IACJ,aAAa,4BAA4B,yBAAyB,KAAK,MAAM,EAAE;IAC/E;GACD,KAAK,YACJ,aAAa,4BAA4B,yBAAyB,KAAK,MAAM,EAAE;EAEjF;EACA,OAAQ,MAAM,KAAK,OAAO,SAAS,UAAU,MAAO;CACrD;CAEA,gBAAgB,OAAyB,QAAiB,SAAyB;EAClF,QAAQ,OAAR;GACC,KAAK,YACJ,OAAO,qCAAqC,KAAK,QAAQ,QAAQ,OAAO;GACzE,KAAK,YACJ,OAAO,qCAAqC,KAAK,QAAQ,QAAQ,OAAO;GACzE,KAAK,WACJ,OAAO,oCAAoC,KAAK,QAAQ,QAAQ,OAAO;GACxE,KAAK,UACJ,OAAO,mCAAmC,KAAK,QAAQ,QAAQ,OAAO;EACxE;CACD;AACD;;;;;;;;;;;;;;;ACtgBA,IAAa,yBAAb,MAA+E;CAC9E;CAEA,YAAY,OAA8B;EACzC,KAAK,SAAS;CACf;CAEA,IAAI,OAAwC;EAC3C,OAAO,IAAI,eAAe,KAAK,QAAQ;GAAE,UAAU;GAAO;EAAM,CAAC;CAClE;CAEA,KAAK,OAAe,SAAuD;EAC1E,OAAO,IAAI,eAAe,KAAK,QAAQ;GACtC,UAAU;GACV;GACA,GAAI,SAAS,SAAS,KAAA,IAAY,EAAE,MAAM,QAAQ,KAAK,IAAI,CAAC;GAC5D,GAAI,SAAS,UAAU,KAAA,IAAY,EAAE,OAAO,QAAQ,MAAM,IAAI,CAAC;EAChE,CAAC;CACF;CAEA,KAAK,OAAe,SAAuD;EAC1E,OAAO,IAAI,eAAe,KAAK,QAAQ;GACtC,UAAU;GACV;GACA,GAAI,SAAS,UAAU,KAAA,IAAY,EAAE,OAAO,QAAQ,MAAM,IAAI,CAAC;EAChE,CAAC;CACF;CAEA,MAAM,OAAe,SAAuD;EAC3E,OAAO,IAAI,eAAe,KAAK,QAAQ;GACtC,UAAU;GACV;GACA,GAAI,SAAS,UAAU,KAAA,IAAY,EAAE,OAAO,QAAQ,MAAM,IAAI,CAAC;EAChE,CAAC;CACF;CAEA,YAAY,OAAe,SAAuD;EACjF,OAAO,IAAI,eAAe,KAAK,QAAQ;GACtC,UAAU;GACV;GACA,GAAI,SAAS,UAAU,KAAA,IAAY,EAAE,OAAO,QAAQ,MAAM,IAAI,CAAC;EAChE,CAAC;CACF;CAEA,OAAO,OAAwC;EAC9C,OAAO,IAAI,eAAe,KAAK,QAAQ;GAAE,UAAU;GAAU;EAAM,CAAC;CACrE;AACD;;;;;;;;;;;;;;ACtDA,IAAa,eAAb,MAA2D;CAC1D;CAEA,YAAY,OAA8B;EACzC,KAAK,SAAS;CACf;CAEA,MAAM,IAAI,OAAoC;EAC7C,qBAAqB,KAAK;EAC1B,MAAM,QAAQ;GAAE,GAAG,MAAM;GAAG,GAAG,MAAM;EAAE;EACvC,MAAM,KAAK,OAAO,KAAK,4BAA4B;GAClD,MAAM;GACN,aAAa,CAAC,KAAK;EACpB,CAAC;EACD,IAAI;GACH,MAAM,KAAK,OAAO,KAAK,4BAA4B;IAClD,MAAM;IACN,aAAa,CAAC;GACf,CAAC;EACF,SAAS,OAAO;GACf,MAAM,KAAK,OACT,KAAK,4BAA4B;IACjC,MAAM;IACN,aAAa,CAAC;GACf,CAAC,CAAC,CACD,YAAY,KAAA,CAAS;GACvB,MAAM;EACP;CACD;AACD;;;;;;;;;;;;;;;ACJA,IAAa,eAAb,MAA2D;CAC1D;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAEA,YACC,QACA,SACA,IACA,KACA,QACA,MACA,WAAW,MACV;EACD,KAAK,UAAU;EACf,KAAK,WAAW;EAChB,KAAK,MAAM;EACX,KAAK,OAAO;EACZ,KAAK,UAAU;EACf,KAAK,QAAQ;EACb,KAAK,YAAY;EACjB,KAAK,aAAa,IAAI,uBAAuB,IAAI;EACjD,KAAK,YAAY,IAAI,gBAAgB,IAAI;EACzC,KAAK,SAAS,IAAI,aAAa,IAAI;EACnC,KAAK,SAAS,IAAI,aAAa,IAAI;CACpC;CAEA,IAAI,KAAa;EAChB,OAAO,KAAK;CACb;CAEA,IAAI,SAA6B;EAChC,OAAO,KAAK;CACb;CAEA,IAAI,OAA2B;EAC9B,OAAO,KAAK;CACb;CAEA,IAAI,MAAc;EACjB,OAAO,KAAK;CACb;CAEA,IAAI,YAA6C;EAChD,OAAO,KAAK;CACb;CAEA,IAAI,WAAqC;EACxC,OAAO,KAAK;CACb;CAEA,IAAI,QAA+B;EAClC,OAAO,KAAK;CACb;CAEA,IAAI,QAA+B;EAClC,OAAO,KAAK;CACb;CAEA,MAAM,QAAyB;EAC9B,KAAK,OAAO;EAEZ,OAAO,qBAAqB,MADP,KAAK,UAAU,gBAAgB,GAChB,gBAAgB;CACrD;CAEA,MAAM,UAAyC;EAC9C,KAAK,OAAO;EACZ,MAAM,CAAC,OAAO,MAAM,MAAM,cAAc,MAAM,QAAQ,IAAI;GACzD,KAAK,UAAU,gBAAgB;GAC/B,KAAK,aAAa;GAClB,KAAK,UACJ,iCACC,kDACA,oBACD,CACD;GACA,KAAK,UAAU,eAAe;EAC/B,CAAC;EAED,MAAM,MAAM,qBAAqB,YAAY,cAAc;EAC3D,KAAK,OAAO;EACZ,OAAO;GACN;GACA,OAAO,qBAAqB,OAAO,gBAAgB;GACnD,MAAM,qBAAqB,MAAM,eAAe;GAChD,MAAM,qBAAqB,MAAM,eAAe;EACjD;CACD;CAEA,MAAM,UAA2B;EAChC,KAAK,OAAO;EACZ,MAAM,OAAO,qBAAqB,MAAM,KAAK,aAAa,GAAG,eAAe;EAC5E,OAAO,WAAW,WAAW,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,QAAQ;CACtD;CAEA,MAAM,MAAM,UAAkB,SAA+C;EAC5E,KAAK,OAAO;EACZ,MAAM,KAAK,WAAW,IAAI,QAAQ,CAAC,CAAC,MAAM,OAAO;CAClD;CAEA,MAAM,KAAK,UAAkB,OAAe,SAA+C;EAC1F,KAAK,OAAO;EACZ,MAAM,KAAK,WAAW,IAAI,QAAQ,CAAC,CAAC,KAAK,OAAO,OAAO;CACxD;CAEA,MAAM,OACL,UACA,QACA,SACgB;EAChB,KAAK,OAAO;EACZ,MAAM,KAAK,WAAW,IAAI,QAAQ,CAAC,CAAC,OAAO,QAAQ,OAAO;CAC3D;CAEA,MAAM,SAAS,YAAoB,SAAoC;EACtE,KAAK,OAAO;EACZ,OAAO,MAAM,KAAK,UACjB,iCAAiC,YAAY,oBAAoB,GACjE,OACD;CACD;CAEA,MAAM,OAAO,YAAqD;EACjE,KAAK,OAAO;EACZ,MAAM,UAAU,MAAM,KAAK,WAAW;EACtC,MAAM,SAAkC;GACvC;GACA,eAAe;GACf,cAAc;EACf;EACA,MAAM,UAAU,MAAM,KAAK,SAAS,OAAO;EAC3C,IAAI,YAAY,KAAA,GAAW,OAAO,eAAe;EACjD,MAAM,SAAS,MAAM,KAAK,QAAQ,KAAK,oBAAoB,QAAQ,EAAE,QAAQ,CAAC;EAC9E,IACC,CAAC,SAAS,MAAM,KAChB,CAAC,SAAS,OAAO,SAAS,KAC1B,CAAC,SAAS,OAAO,SAAS,CAAC,WAAW,GAEtC,MAAM,IAAI,aAAa,0DAA0D,KAAA,GAAW,EAC3F,OAAO,KAAK,IACb,CAAC;EAEF,OAAO,IAAI,cAAc,KAAK,SAAS,SAAS,OAAO,SAAS,CAAC,WAAW;CAC7E;CAEA,MAAM,KAAK,UAAkB,SAA6C;EACzE,KAAK,OAAO;EACZ,MAAM,KAAK,WAAW,IAAI,QAAQ,CAAC,CAAC,KAAK,OAAO;CACjD;CAEA,MAAM,KACL,QACA,QACA,SACmB;EACnB,KAAK,OAAO;EACZ,OAAO,MAAM,KAAK,QAAQ,KAAK,QAAQ,QAAQ;GAC9C,SAAS,MAAM,KAAK,WAAW;GAC/B,GAAI,SAAS,YAAY,KAAA,IAAY,EAAE,SAAS,QAAQ,QAAQ,IAAI,CAAC;EACtE,CAAC;CACF;CAEA,MAAM,UAAU,QAAgB,SAAoC;EACnE,KAAK,OAAO;EACZ,KAAK,QAAQ,UAAU,QAAQ,SAAS,MAAM,KAAK,WAAW,CAAC;CAChE;CAEA,MAAM,YAAY,QAAgB,SAAoC;EACrE,KAAK,QAAQ,YAAY,QAAQ,SAAS,MAAM,KAAK,WAAW,CAAC;CAClE;CAEA,MAAM,KAAK,MAAc,QAAmC;EAE3D,MAAM,IAAI,aAAa,+CAA+C,KAAA,GAAW,EAAE,KAAK,CAAC;CAC1F;CAEA,SAAe;EACd,IAAI,CAAC,KAAK,QAAQ,WACjB,MAAM,IAAI,aAAa,iCAAiC,KAAA,GAAW,EAAE,OAAO,KAAK,IAAI,CAAC;CAExF;CAEA,OAAO,KAAmB;EACzB,KAAK,OAAO;CACb;CAEA,MAAM,eAAiC;EACtC,OAAO,MAAM,KAAK,UACjB,iCAAiC,sCAAsC,oBAAoB,CAC5F;CACD;CAEA,MAAM,UAAU,YAAoB,SAAoC;EACvE,MAAM,UAAU,MAAM,KAAK,WAAW;EACtC,MAAM,SAAkC;GACvC;GACA,eAAe;GACf,cAAc;EACf;EAEA,MAAM,UAAU,MAAM,KAAK,SAAS,SAAS,OAAO;EACpD,IAAI,YAAY,KAAA,GAAW,OAAO,eAAe;EAMjD,OAAO,qBAAqB,MAJP,KAAK,QAAQ,KAAK,oBAAoB,QAAQ;GAClE;GACA,GAAI,YAAY,KAAA,IAAY,EAAE,QAAQ,IAAI,CAAC;EAC5C,CAAC,CACiC;CACnC;CAEA,MAAM,SAAS,SAAiB,SAA+C;EAC9E,IAAI,CAAC,KAAK,WAAW,OAAO,KAAA;EAC5B,MAAM,QAAQ,MAAM,KAAK,QAAQ,KAChC,4BACA;GAAE,SAAS,KAAK;GAAK,WAAW;EAAyB,GACzD;GAAE;GAAS,GAAI,YAAY,KAAA,IAAY,EAAE,QAAQ,IAAI,CAAC;EAAG,CAC1D;EACA,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,UAAU,MAAM,qBAAqB,GAC7D,MAAM,IAAI,aAAa,4CAA4C,KAAA,GAAW,EAC7E,OAAO,KAAK,IACb,CAAC;EAEF,OAAO,MAAM;CACd;CAEA,MAAM,aAA8B;EACnC,IAAI,SAAS,KAAK,QAAQ,GAAG,OAAO,KAAK;EACzC,OAAO,MAAM,KAAK,SAAS,KAAK,GAAG;CACpC;AACD;;;;;;AC9QA,IAAa,qBAAb,MAAuE;CACtE;CACA;CACA;CACA,WAAW;CACX,YAAY;CAEZ,YAAY,OAA8B,SAAiB,UAAmB;EAC7E,KAAK,SAAS;EACd,KAAK,WAAW;EAChB,KAAK,YAAY;CAClB;CAEA,IAAI,WAAoB;EACvB,OAAO,KAAK;CACb;CAEA,MAAM,OAAO,OAAyC;EACrD,KAAK,QAAQ;EACb,IAAI,CAAC,KAAK,aAAa,MAAM,SAAS,GACrC,MAAM,IAAI,aAAa,kDAAkD;EAE1E,KAAK,YAAY;EACjB,IAAI;GACH,MAAM,KAAK,OAAO,KAAK,yBAAyB;IAC/C,eAAe,KAAK;IACpB,OAAO,CAAC,GAAG,KAAK;GACjB,CAAC;GACD,KAAK,WAAW;EACjB,UAAU;GACT,KAAK,YAAY;EAClB;CACD;CAEA,MAAM,SAAwB;EAC7B,KAAK,QAAQ;EACb,KAAK,YAAY;EACjB,IAAI;GACH,MAAM,KAAK,OAAO,KAAK,yBAAyB;IAC/C,eAAe,KAAK;IACpB,OAAO,CAAC;GACT,CAAC;GACD,KAAK,WAAW;EACjB,UAAU;GACT,KAAK,YAAY;EAClB;CACD;CAEA,UAAgB;EACf,IAAI,KAAK,YAAY,KAAK,WACzB,MAAM,IAAI,aAAa,yCAAyC;CAElE;AACD;;;;;;;;;;;;;;;ACvBA,IAAa,oBAAb,MAAqE;CACpE;CACA;CACA,2BAAoD,IAAI,IAAI;CAC5D,WAAuC,CAAC;CACxC,yBAAsC,IAAI,IAAI;CAC9C;CACA,aAAa;CACb;CACA;CACA,YAAY;CACZ,kBAA2B,KAAK,eAAe,KAAK,IAAI;CACxD,mBAA4B,KAAK,gBAAgB,KAAK,IAAI;CAC1D,kBAA2B,KAAK,eAAe,KAAK,IAAI;CACxD,iBAA0B,KAAK,cAAc,KAAK,IAAI;CACtD,iBAA+C,KAAK,cAAc,KAAK,IAAI;CAE3E,YAAY,SAAyC,QAAiC;EACrF,KAAK,WAAW;EAChB,KAAK,UAAU;CAChB;CAEA,IAAI,YAAqB;EACxB,OAAO,KAAK;CACb;CAEA,MAAM,MAAM,SAA4C;EACvD,IAAI,KAAK,YAAY;EACrB,KAAK,WAAW;EAChB,KAAK,SAAS,SAAS;EACvB,KAAK,SAAS,MAAM;EACpB,KAAK,WAAW,KAAA;EAChB,KAAK,SAAS,QAAQ,GAAG,WAAW,KAAK,eAAe;EACxD,KAAK,SAAS,QAAQ,GAAG,YAAY,KAAK,gBAAgB;EAC1D,KAAK,SAAS,QAAQ,GAAG,WAAW,KAAK,eAAe;EACxD,KAAK,SAAS,QAAQ,GAAG,UAAU,KAAK,cAAc;EACtD,KAAK,aAAa;EAClB,IAAI;GACH,MAAM,KAAK,SAAS,MAAM;EAC3B,SAAS,OAAO;GACf,KAAK,aAAa;GAClB,KAAK,SAAS,QAAQ,IAAI,WAAW,KAAK,eAAe;GACzD,KAAK,SAAS,QAAQ,IAAI,YAAY,KAAK,gBAAgB;GAC3D,KAAK,SAAS,QAAQ,IAAI,WAAW,KAAK,eAAe;GACzD,KAAK,SAAS,QAAQ,IAAI,UAAU,KAAK,cAAc;GACvD,MAAM;EACP;CACD;CAEA,MAAM,OAA4B;EACjC,IAAI,KAAK,YAAY;GACpB,KAAK,aAAa;GAClB,KAAK,SAAS,QAAQ,IAAI,WAAW,KAAK,eAAe;GACzD,KAAK,SAAS,QAAQ,IAAI,YAAY,KAAK,gBAAgB;GAC3D,KAAK,SAAS,QAAQ,IAAI,WAAW,KAAK,eAAe;GACzD,KAAK,SAAS,QAAQ,IAAI,UAAU,KAAK,cAAc;GACvD,MAAM,QAAQ,WAAW,CAAC,GAAG,KAAK,MAAM,CAAC;GACzC,KAAK,MAAM,MAAM,CAAC,GAAG,KAAK,SAAS,KAAK,CAAC,GAAG;IAC3C,MAAM,UAAU,KAAK,SAAS,IAAI,EAAE;IACpC,IAAI,YAAY,KAAA,GAAW;IAC3B,KAAK,SAAS,OAAO,EAAE;IACvB,KAAK,SAAS,KACb,sBACC,SACA,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,QAAQ,OAAO,GACxC,KAAA,GACA,+CACD,CACD;GACD;EACD;EACA,IAAI,KAAK,aAAa,KAAA,GACrB,MAAM,IAAI,aAAa,gCAAgC,qBAAqB,EAC3E,OAAO,KAAK,SACb,CAAC;EAEF,MAAM,MAAkB,EACvB,KAAK;GACJ,SAAS;GACT,SAAS;GACT,SAAS,CAAC,GAAG,KAAK,QAAQ;EAC3B,EACD;EACA,IAAI,KAAK,UAAU,SAAS,KAAA,GAAW;GACtC,IAAI,KAAK,YAAY,KAAA,GACpB,MAAM,IAAI,aAAa,+CAA+C;GAEvE,MAAM,KAAK,QAAQ,MAAM,KAAK,SAAS,MAAM,YAAY,KAAK,UAAU,KAAK,KAAA,GAAW,CAAC,CAAC,CAAC;EAC5F;EACA,OAAO;CACR;CAEA,MAAM,OAAO,KAAiB,SAAkD;EAC/E,mBAAmB,GAAG;EACtB,IAAI,KAAK,aAAa,KAAA,GAAW,MAAM,KAAK,SAAS,QAAQ,KAAK,cAAc;EAChF,KAAK,WAAW;EAChB,KAAK,YAAY,SAAS,aAAa;EACvC,IAAI;GACH,MAAM,KAAK,SAAS,MAAM,CAAC,GAAG,KAAK,cAAc;EAClD,SAAS,OAAO;GACf,KAAK,WAAW,KAAA;GAChB,KAAK,YAAY;GACjB,MAAM;EACP;CACD;CAEA,MAAM,QAAuB;EAC5B,IAAI,KAAK,YAAY,MAAM,KAAK,KAAK;EACrC,MAAM,YAAY,KAAK,aAAa,KAAA;EACpC,KAAK,WAAW,KAAA;EAChB,KAAK,YAAY;EACjB,IAAI,WAAW,MAAM,KAAK,SAAS,QAAQ,KAAK,cAAc;EAC9D,KAAK,SAAS,SAAS;EACvB,KAAK,SAAS,MAAM;CACrB;CAEA,eAAe,SAA+B;EAC7C,IAAI,CAAC,KAAK,YAAY;EACtB,KAAK,SAAS,IAAI,QAAQ,IAAI;GAC7B;GACA,SAAS,QAAQ,aAAa,KAAA,IAAY,KAAK,IAAI,IAAI,QAAQ,WAAW;GAC1E,UAAU,KAAA;EACX,CAAC;CACF;CAEA,gBAAgB,UAAiC;EAChD,MAAM,UAAU,KAAK,SAAS,IAAI,SAAS,EAAE;EAC7C,IAAI,YAAY,KAAA,GAAW;EAC3B,KAAK,SAAS,IAAI,SAAS,IAAI;GAC9B,SAAS,QAAQ;GACjB,SAAS,QAAQ;GACjB;EACD,CAAC;CACF;CAEA,eAAe,SAAsC;EACpD,MAAM,UAAU,KAAK,SAAS,IAAI,QAAQ,EAAE;EAC5C,IAAI,YAAY,KAAA,GAAW;EAC3B,KAAK,SAAS,OAAO,QAAQ,EAAE;EAC/B,KAAK,SAAS,KACb,sBACC,SACA,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,QAAQ,OAAO,GACxC,KAAA,GACA,QAAQ,KACT,CACD;CACD;CAEA,cAAc,IAAkB;EAC/B,KAAK,OAAO,KAAK,UAAU,EAAE,CAAC;CAC/B;CAEA,MAAM,cAAc,OAA0D;EAC7E,MAAM,QAAQ,KAAK,UAAU,IAAI,QAAQ,MACvC,cACA,UAAU,QAAQ,QAAQ,MAAM,QAAQ,OACxC,UAAU,QAAQ,WAAW,MAAM,QAAQ,MAC7C;EACA,IAAI,UAAU,KAAA,KAAa,MAAM,SAAS,WAAW,GAAG;GACvD,IAAI,KAAK,WAAW,MAAM,MAAM,SAAS;QACpC,MAAM,MAAM,MAAM,QAAQ;GAC/B;EACD;EACA,MAAM,OACL,MAAM,SAAS,QAAQ,SAAS,KAAA,IAC7B,KAAA,IACA,MAAM,SAAS,QAAQ,aAAa,WACnC,aAAa,MAAM,SAAS,QAAQ,IAAI,IACxC,MAAM,SAAS,QAAQ;EAC5B,MAAM,MAAM,QAAQ;GACnB,QAAQ,MAAM,SAAS;GACvB,QAAQ,MAAM,SAAS;GACvB,SAAS,0BAA0B,MAAM,SAAS,OAAO;GACzD,GAAI,SAAS,KAAA,IAAY,EAAE,KAAK,IAAI,CAAC;EACtC,CAAC;CACF;CAEA,MAAM,UAAU,IAA2B;EAC1C,MAAM,UAAU,KAAK,SAAS,IAAI,EAAE;EACpC,IAAI,YAAY,KAAA,GAAW;EAC3B,KAAK,SAAS,OAAO,EAAE;EACvB,IAAI;EACJ,IAAI,KAAK,UAAU,YAAY,QAAQ,QAAQ,aAAa,KAAA,GAC3D,IAAI;GACH,OAAO,MAAM,KAAK,SAAS,KAAK,EAAE;EACnC,QAAQ,CAER;EAED,KAAK,SAAS,KACb,sBAAsB,SAAS,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,QAAQ,OAAO,GAAG,IAAI,CAC/E;CACD;CAEA,OAAO,MAA2B;EACjC,KAAK,OAAO,IAAI,IAAI;EACpB,KACE,OAAO,UAAmB;GAC1B,IAAI,KAAK,aAAa,KAAA,GAAW,KAAK,WAAW;EAClD,CAAC,CAAC,CACD,cAAc,KAAK,OAAO,OAAO,IAAI,CAAC;CACzC;AACD;;;;;;ACjOA,IAAa,eAAb,MAA2D;CAC1D;CACA;CACA;CACA,WAAW;CACX,YAAY;CAEZ,YAAY,OAA8B,IAAY,SAAyB;EAC9E,KAAK,SAAS;EACd,KAAK,MAAM;EACX,KAAK,WAAW;CACjB;CAEA,IAAI,KAAa;EAChB,OAAO,KAAK;CACb;CAEA,IAAI,UAA0B;EAC7B,OAAO,KAAK;CACb;CAEA,IAAI,UAAmB;EACtB,OAAO,KAAK;CACb;CAEA,MAAM,MAAM,SAAS,UAAyB;EAC7C,KAAK,QAAQ;EACb,KAAK,YAAY;EACjB,IAAI;GACH,MAAM,KAAK,OAAO,KAAK,qBAAqB;IAC3C,WAAW,KAAK;IAChB,aAAa;GACd,CAAC;GACD,KAAK,WAAW;EACjB,UAAU;GACT,KAAK,YAAY;EAClB;CACD;CAEA,MAAM,SAAS,SAAsD;EACpE,KAAK,QAAQ;EACb,MAAM,SAAkC,EAAE,WAAW,KAAK,IAAI;EAC9D,IAAI,SAAS,QAAQ,KAAA,GAAW,OAAO,SAAS,QAAQ;EACxD,IAAI,SAAS,WAAW,KAAA,GAAW,OAAO,YAAY,QAAQ;EAC9D,IAAI,SAAS,YAAY,KAAA,GACxB,OAAO,aAAa,yBAAyB,QAAQ,OAAO;EAE7D,IAAI,SAAS,SAAS,KAAA,GACrB,OAAO,cAAc,aAAa,YAAY,QAAQ,IAAI,CAAC;EAE5D,KAAK,YAAY;EACjB,IAAI;GACH,MAAM,KAAK,OAAO,KAAK,yBAAyB,MAAM;GACtD,KAAK,WAAW;EACjB,UAAU;GACT,KAAK,YAAY;EAClB;CACD;CAEA,MAAM,QAAQ,SAAoD;EACjE,KAAK,QAAQ;EACb,MAAM,SAAS,QAAQ,UAAU;EACjC,IAAI,CAAC,UAAU,MAAM,KAAK,SAAS,OAAO,SAAS,KAClD,MAAM,IAAI,aAAa,2DAA2D,KAAA,GAAW,EAC5F,OACD,CAAC;EAEF,MAAM,SAAkC;GACvC,WAAW,KAAK;GAChB,cAAc;EACf;EACA,IAAI,QAAQ,WAAW,KAAA,GAAW,OAAO,oBAAoB,QAAQ;EACrE,IAAI,QAAQ,YAAY,KAAA,GACvB,OAAO,qBAAqB,yBAAyB,QAAQ,OAAO;EAErE,IAAI,QAAQ,SAAS,KAAA,GACpB,OAAO,UAAU,aAChB,SAAS,QAAQ,IAAI,IAAI,YAAY,QAAQ,IAAI,IAAI,QAAQ,IAC9D;EAED,KAAK,YAAY;EACjB,IAAI;GACH,MAAM,KAAK,OAAO,KAAK,wBAAwB,MAAM;GACrD,KAAK,WAAW;EACjB,UAAU;GACT,KAAK,YAAY;EAClB;CACD;CAEA,UAAgB;EACf,IAAI,KAAK,YAAY,KAAK,WAAW,MAAM,IAAI,aAAa,kCAAkC;CAC/F;AACD;;;;;;;;;;;;;;ACvFA,IAAa,mBAAb,MAAmE;CAClE;CACA;CACA;CACA,UAAU;CAEV,YAAY,IAAY,KAAa;EACpC,KAAK,MAAM;EACX,KAAK,OAAO;EACZ,KAAK,WAAW,IAAI,QAAQ;CAC7B;CAEA,IAAI,UAAsD;EACzD,OAAO,KAAK;CACb;CAEA,IAAI,KAAa;EAChB,OAAO,KAAK;CACb;CAEA,IAAI,MAAc;EACjB,OAAO,KAAK;CACb;CAEA,QAAQ,OAAoC;EAC3C,IAAI,CAAC,KAAK,SAAS,KAAK,SAAS,KAAK,WAAW,KAAK;CACvD;CAEA,SAAS,OAAoC;EAC5C,IAAI,CAAC,KAAK,SAAS,KAAK,SAAS,KAAK,YAAY,KAAK;CACxD;CAEA,KAAK,SAAuB;EAC3B,IAAI,CAAC,KAAK,SAAS,KAAK,SAAS,KAAK,SAAS,OAAO;CACvD;CAEA,MAAM,WAAyB;EAC9B,IAAI,KAAK,SAAS;EAClB,KAAK,UAAU;EACf,KAAK,SAAS,KAAK,SAAS,SAAS;EACrC,KAAK,SAAS,QAAQ;CACvB;AACD;;;;;;;;;;;;;;;;ACfA,IAAa,wBAAb,MAA6E;CAC5E;CACA;CACA;CACA,UAA6C,CAAC;CAC9C,2BAAmD,IAAI,IAAI;CAC3D;CACA,WAAW;CACX,gBAAgB;CAChB,aAAa;CACb,YAAwC,IAAI,kBAAkB;CAC9D,kBAA2B,KAAK,eAAe,KAAK,IAAI;CACxD,mBAA4B,KAAK,gBAAgB,KAAK,IAAI;CAC1D,kBAA2B,KAAK,eAAe,KAAK,IAAI;CACxD,iBAA0B,KAAK,cAAc,KAAK,IAAI;CACtD,iBAA0B,KAAK,aAAa,KAAK,IAAI;CACrD,eAAwB,KAAK,YAAY,KAAK,IAAI;CAClD,iBAA0B,KAAK,cAAc,KAAK,IAAI;CACtD,wBAAiC,KAAK,qBAAqB,KAAK,IAAI;CACpE,yBAAkC,KAAK,sBAAsB,KAAK,IAAI;CACtE,sBAA+B,KAAK,mBAAmB,KAAK,IAAI;CAChE,sBAA+B,KAAK,mBAAmB,KAAK,IAAI;CAEhE,YAAY,OAA8B,QAAiC;EAC1E,KAAK,SAAS;EACd,KAAK,WAAW,IAAI,QAAQ;EAC5B,KAAK,OAAO,IAAI,kBAAkB,MAAM,MAAM;CAC/C;CAEA,IAAI,UAAoD;EACvD,OAAO,KAAK;CACb;CAEA,IAAI,MAAkC;EACrC,OAAO,KAAK;CACb;CAEA,MAAM,QAAuB;EAC5B,IAAI,KAAK,YAAY,MAAM,IAAI,aAAa,sCAAsC;EAClF,IAAI,KAAK,UAAU;EACnB,MAAM,SAAS,KAAK,UAAU;EAC9B,IAAI,WAAW,KAAA,GAAW;GACzB,MAAM;GACN;EACD;EACA,MAAM,KAAK,UAAU,cAAc,KAAK,OAAO,CAAC;CACjD;CAEA,MAAM,KAAK,IAAiC;EAC3C,MAAM,KAAK,MAAM;EACjB,MAAM,SAAS,MAAM,KAAK,OAAO,KAAK,2BAA2B,EAAE,WAAW,GAAG,CAAC;EAClF,IAAI,CAAC,SAAS,MAAM,KAAK,CAAC,SAAS,OAAO,OAAO,GAChD,MAAM,IAAI,aAAa,sCAAsC,KAAA,GAAW,EAAE,GAAG,CAAC;EAE/E,OAAO,OAAO,qBAAqB,OAChC,aAAa,OAAO,OAAO,IAC3B,YAAY,OAAO,OAAO;CAC9B;CAEA,MAAM,KAAK,IAA6B;EACvC,OAAO,YAAY,MAAM,KAAK,KAAK,EAAE,CAAC;CACvC;CAEA,MAAM,KAAK,IAA8B;EACxC,MAAM,OAAO,MAAM,KAAK,KAAK,EAAE;EAC/B,MAAM,SAAS,cAAuB,KAAK,MAAM,IAAI,CAAC;EACtD,IAAI,OAAO,SAAS,OAAO,OAAO;EAClC,MAAM,IAAI,aAAa,2CAA2C,sBAAsB;GACvF;GACA,OAAO,OAAO;EACf,CAAC;CACF;CAEA,MAAM,MAAM,OAA0B,SAA6C;EAClF,MAAM,KAAK,MAAM;EACjB,MAAM,aAAa;GAAE;GAAO;EAAQ;EACpC,KAAK,QAAQ,KAAK,UAAU;EAC5B,IAAI;GACH,MAAM,KAAK,WAAW;EACvB,SAAS,OAAO;GACf,KAAK,QAAQ,OAAO,KAAK,QAAQ,QAAQ,UAAU,GAAG,CAAC;GACvD,MAAM;EACP;CACD;CAEA,MAAM,QAAQ,SAA8C;EAC3D,IAAI,YAAY,KAAA,GACf,KAAK,QAAQ,SAAS;OAEtB,KAAK,IAAI,QAAQ,KAAK,QAAQ,SAAS,GAAG,SAAS,GAAG,SAAS,GAC9D,IAAI,KAAK,QAAQ,MAAM,EAAE,YAAY,SAAS,KAAK,QAAQ,OAAO,OAAO,CAAC;EAG5E,IAAI,KAAK,YAAY,CAAC,KAAK,YAAY,MAAM,KAAK,WAAW;CAC9D;CAEA,MAAM,QAAQ,SAA0D;EACvE,MAAM,KAAK,MAAM;EACjB,MAAM,KAAK,OAAO,KAAK,+BAA+B,EAAE,QAAQ,CAAC;CAClE;CAEA,MAAM,QAAQ,SAAiC;EAC9C,MAAM,KAAK,MAAM;EACjB,MAAM,KAAK,OAAO,KAAK,oCAAoC;GAC1D;GACA,SAAS;GACT,oBAAoB;GACpB,kBAAkB;EACnB,CAAC;CACF;CAEA,MAAM,YAAY,aAAiD;EAClE,MAAM,KAAK,MAAM;EACjB,MAAM,WAAW,KAAK;EACtB,KAAK,eAAe;EACpB,IAAI;GACH,MAAM,KAAK,WAAW;EACvB,SAAS,OAAO;GACf,KAAK,eAAe;GACpB,MAAM;EACP;CACD;CAEA,MAAM,UAAyB;EAC9B,IAAI,KAAK,YAAY;EACrB,KAAK,aAAa;EAClB,MAAM,UAAU,MAAM,4BACf,KAAK,KAAK,MAAM,GACtB,YAAY;GACX,IAAI,KAAK,eAAe,MAAM,KAAK,OAAO,KAAK,eAAe;EAC/D,GACA,YAAY;GACX,IAAI,KAAK,UAAU,MAAM,KAAK,OAAO,KAAK,iBAAiB;EAC5D,SACM,KAAK,aAAa,CACzB;EACA,KAAK,MAAM,UAAU,KAAK,SAAS,OAAO,GAAG,OAAO,MAAM,KAAK,IAAI,IAAI,GAAI;EAC3E,KAAK,SAAS,MAAM;EACpB,KAAK,QAAQ,SAAS;EACtB,KAAK,SAAS,QAAQ;EACtB,IAAI,YAAY,KAAA,GAAW,MAAM;CAClC;CAEA,eAAe,QAAiD;EAC/D,MAAM,UAAU,oBAAoB,MAAM;EAC1C,IAAI,YAAY,KAAA,GAAW,KAAK,SAAS,KAAK,WAAW,OAAO;CACjE;CAEA,gBAAgB,QAAiD;EAChE,MAAM,WAAW,qBAAqB,MAAM;EAC5C,IAAI,aAAa,KAAA,GAAW,KAAK,SAAS,KAAK,YAAY,QAAQ;CACpE;CAEA,eAAe,QAAiD;EAC/D,MAAM,UAAU,2BAA2B,MAAM;EACjD,IAAI,YAAY,KAAA,GAAW,KAAK,SAAS,KAAK,WAAW,OAAO;CACjE;CAEA,cAAc,QAAiD;EAC9D,IAAI,SAAS,OAAO,YAAY,GAAG,KAAK,SAAS,KAAK,UAAU,OAAO,YAAY;CACpF;CAEA,aAAa,QAAiD;EAC7D,KAAU,OAAO,MAAM,CAAC,CAAC,YAAY,KAAA,CAAS;CAC/C;CAEA,YAAY,QAAiD;EAC5D,KAAU,cAAc,MAAM,CAAC,CAAC,YAAY,KAAA,CAAS;CACtD;CAEA,cAAc,QAAiD;EAC9D,IAAI,CAAC,SAAS,OAAO,YAAY,KAAK,CAAC,SAAS,OAAO,MAAM,GAAG;EAChE,MAAM,SAAS,IAAI,iBAAiB,OAAO,cAAc,OAAO,MAAM;EACtE,KAAK,SAAS,IAAI,OAAO,IAAI,MAAM;EACnC,KAAK,SAAS,KAAK,UAAU,MAAM;CACpC;CAEA,qBAAqB,QAAiD;EACrE,MAAM,SAAS,SAAS,OAAO,YAAY,IACxC,KAAK,SAAS,IAAI,OAAO,YAAY,IACrC,KAAA;EACH,MAAM,QAAQ,2BAA2B,MAAM;EAC/C,IAAI,WAAW,KAAA,KAAa,UAAU,KAAA,GAAW,OAAO,QAAQ,KAAK;CACtE;CAEA,sBAAsB,QAAiD;EACtE,MAAM,SAAS,SAAS,OAAO,YAAY,IACxC,KAAK,SAAS,IAAI,OAAO,YAAY,IACrC,KAAA;EACH,MAAM,QAAQ,2BAA2B,MAAM;EAC/C,IAAI,WAAW,KAAA,KAAa,UAAU,KAAA,GAAW,OAAO,SAAS,KAAK;CACvE;CAEA,mBAAmB,QAAiD;EACnE,MAAM,SAAS,SAAS,OAAO,YAAY,IACxC,KAAK,SAAS,IAAI,OAAO,YAAY,IACrC,KAAA;EACH,IAAI,WAAW,KAAA,KAAa,SAAS,OAAO,eAAe,GAC1D,OAAO,KAAK,OAAO,eAAe;CACpC;CAEA,mBAAmB,QAAiD;EACnE,IAAI,CAAC,SAAS,OAAO,YAAY,GAAG;EACpC,MAAM,SAAS,KAAK,SAAS,IAAI,OAAO,YAAY;EACpD,IAAI,WAAW,KAAA,GAAW;EAC1B,KAAK,SAAS,OAAO,OAAO,YAAY;EACxC,OAAO,MAAM,eAAe,OAAO,YAAY,IAAI,OAAO,eAAe,KAAK,IAAI,IAAI,GAAI;CAC3F;CAEA,MAAM,SAAwB;EAC7B,IAAI;GACH,MAAM,KAAK,WAAW;GACtB,MAAM,KAAK,OAAO,KAAK,gBAAgB;GACvC,KAAK,WAAW;GAChB,MAAM,KAAK,WAAW;EACvB,SAAS,OAAO;GACf,KAAK,WAAW;GAChB,KAAK,gBAAgB;GACrB,MAAM,KAAK,OAAO,KAAK,eAAe,CAAC,CAAC,YAAY,KAAA,CAAS;GAC7D,MAAM,KAAK,OAAO,KAAK,iBAAiB,CAAC,CAAC,YAAY,KAAA,CAAS;GAC/D,MAAM,KAAK,aAAa,CAAC,CAAC,YAAY,KAAA,CAAS;GAC/C,MAAM;EACP;CACD;CAEA,MAAM,aAA4B;EAEjC,IAAI,EADY,KAAK,QAAQ,SAAS,KAAK,KAAK,iBAAiB,KAAA,IACnD;GACb,IAAI,KAAK,eAAe;IACvB,MAAM,KAAK,OAAO,KAAK,eAAe;IACtC,KAAK,gBAAgB;GACtB;GACA;EACD;EACA,MAAM,KAAK,OAAO,KAAK,gBAAgB;GACtC,UAAU,KAAK,QAAQ,KAAK,gBAAgB;IAC3C,YAAY,WAAW,MAAM,OAAO;IACpC,cAAc,WAAW,MAAM;IAC/B,cAAc;GACf,EAAE;GACF,oBAAoB,KAAK,iBAAiB,KAAA;EAC3C,CAAC;EACD,KAAK,gBAAgB;CACtB;CAEA,MAAM,OAAO,QAA0D;EACtE,MAAM,UAAU,oBAAoB,MAAM;EAC1C,IAAI,YAAY,KAAA,GAAW;GAC1B,IAAI,SAAS,OAAO,YAAY,GAC/B,MAAM,KAAK,OAAO,KAAK,qBAAqB;IAC3C,WAAW,OAAO;IAClB,aAAa;GACd,CAAC;GAEF;EACD;EACA,MAAM,aAAa,KAAK,QAAQ,MAAM,cACrC,oBAAoB,SAAS,UAAU,KAAK,CAC7C;EACA,IAAI,eAAe,KAAA,GAAW;GAC7B,MAAM,KAAK,OAAO,KAAK,yBAAyB,EAAE,WAAW,QAAQ,GAAG,CAAC;GACzE;EACD;EACA,MAAM,QAAQ,IAAI,aAAa,KAAK,QAAQ,QAAQ,IAAI,OAAO;EAC/D,IAAI;GACH,MAAM,WAAW,QAAQ,KAAK;GAC9B,IAAI,CAAC,MAAM,SAAS,MAAM,MAAM,SAAS;EAC1C,QAAQ;GACP,IAAI,CAAC,MAAM,SAAS,MAAM,MAAM,MAAM,QAAQ,CAAC,CAAC,YAAY,KAAA,CAAS;EACtE;CACD;CAEA,MAAM,cAAc,QAA0D;EAC7E,MAAM,KAAK,OAAO;EAClB,IAAI,CAAC,SAAS,EAAE,GAAG;EACnB,MAAM,cAAc,KAAK;EACzB,MAAM,KAAK,OAAO,KAAK,0BAA0B;GAChD,WAAW;GACX,uBACC,gBAAgB,KAAA,IACb,EAAE,UAAU,UAAU,IACtB;IACA,UAAU;IACV,UAAU,YAAY;IACtB,UAAU,YAAY;GACvB;EACJ,CAAC;CACF;CAEA,MAAM,aAA4B;EACjC,MAAM,KAAK,OAAO,UAAU,6BAA6B,KAAK,eAAe;EAC7E,MAAM,KAAK,OAAO,UAAU,4BAA4B,KAAK,gBAAgB;EAC7E,MAAM,KAAK,OAAO,UAAU,yBAAyB,KAAK,eAAe;EACzE,MAAM,KAAK,OAAO,UAAU,2BAA2B,KAAK,cAAc;EAC1E,MAAM,KAAK,OAAO,UAAU,uBAAuB,KAAK,cAAc;EACtE,MAAM,KAAK,OAAO,UAAU,sBAAsB,KAAK,YAAY;EACnE,MAAM,KAAK,OAAO,UAAU,4BAA4B,KAAK,cAAc;EAC3E,MAAM,KAAK,OAAO,UAAU,kCAAkC,KAAK,qBAAqB;EACxF,MAAM,KAAK,OAAO,UAAU,8BAA8B,KAAK,sBAAsB;EACrF,MAAM,KAAK,OAAO,UAAU,+BAA+B,KAAK,mBAAmB;EACnF,MAAM,KAAK,OAAO,UAAU,2BAA2B,KAAK,mBAAmB;CAChF;CAEA,MAAM,eAA8B;EACnC,MAAM,KAAK,OAAO,YAAY,6BAA6B,KAAK,eAAe;EAC/E,MAAM,KAAK,OAAO,YAAY,4BAA4B,KAAK,gBAAgB;EAC/E,MAAM,KAAK,OAAO,YAAY,yBAAyB,KAAK,eAAe;EAC3E,MAAM,KAAK,OAAO,YAAY,2BAA2B,KAAK,cAAc;EAC5E,MAAM,KAAK,OAAO,YAAY,uBAAuB,KAAK,cAAc;EACxE,MAAM,KAAK,OAAO,YAAY,sBAAsB,KAAK,YAAY;EACrE,MAAM,KAAK,OAAO,YAAY,4BAA4B,KAAK,cAAc;EAC7E,MAAM,KAAK,OAAO,YAAY,kCAAkC,KAAK,qBAAqB;EAC1F,MAAM,KAAK,OAAO,YAAY,8BAA8B,KAAK,sBAAsB;EACvF,MAAM,KAAK,OAAO,YAAY,+BAA+B,KAAK,mBAAmB;EACrF,MAAM,KAAK,OAAO,YAAY,2BAA2B,KAAK,mBAAmB;CAClF;AACD;;;;;;;;;;;;;;;ACnVA,IAAa,2BAAb,MAAmF;CAClF;CACA,yBAAsD,IAAI,IAAI;CAC9D,mBAA4B,KAAK,gBAAgB,KAAK,IAAI;CAC1D,gBAAyB,KAAK,aAAa,KAAK,IAAI;CAEpD,YAAY,MAA4B;EACvC,KAAK,QAAQ;EACb,KAAK,MAAM,QAAQ,GAAG,YAAY,KAAK,gBAAgB;EACvD,KAAK,MAAM,QAAQ,GAAG,SAAS,KAAK,aAAa;CAClD;CAEA,MAAM,KAAK,SAAiB,SAAyD;EACpF,MAAM,UAAU,KAAK,SAAS,OAAO;EACrC,IAAI,kBAAkB,KAAK,MAAM,KAAK,OAAO,GAAG,OAAO,KAAK,MAAM;EAClE,MAAM,WAAW,QAAQ,cAAsB;EAC/C,MAAM,KAAK,OAAO,OAAO;EACzB,MAAM,QAAQ,iBAAiB;GAC9B,KAAK,OAAO,OAAO,EAAE;GACrB,SAAS,OACR,IAAI,aAAa,8BAA8B,8BAA8B;IAC5E;IACA;GACD,CAAC,CACF;EACD,GAAG,OAAO;EACV,KAAK,OAAO,IAAI,IAAI;GACnB;GACA;GACA,SAAS,SAAS;GAClB,QAAQ,SAAS;EAClB,CAAC;EACD,OAAO,MAAM,SAAS;CACvB;CAEA,MAAM,MAAM,YAAoB,SAA0D;EACzF,MAAM,UAAU,KAAK,SAAS,OAAO;EACrC,MAAM,SAAS,MAAM,KAAK,MAAM,SAC/B,8BAA8B,YAAY,OAAO,GACjD,UAAA,GACD;EACA,IAAI,WAAW,OAAO,OAAO;EAC7B,MAAM,IAAI,aAAa,oCAAoC,8BAA8B;GACxF;GACA;EACD,CAAC;CACF;CAEA,gBAAgB,KAAmB;EAClC,KAAK,MAAM,CAAC,IAAI,SAAS,KAAK,QAAQ;GACrC,IAAI,CAAC,kBAAkB,KAAK,KAAK,OAAO,GAAG;GAC3C,aAAa,KAAK,KAAK;GACvB,KAAK,OAAO,OAAO,EAAE;GACrB,KAAK,QAAQ,GAAG;EACjB;CACD;CAEA,eAAqB;EACpB,KAAK,MAAM,CAAC,IAAI,SAAS,KAAK,QAAQ;GACrC,aAAa,KAAK,KAAK;GACvB,KAAK,OAAO,OAAO,EAAE;GACrB,KAAK,OAAO,IAAI,aAAa,gDAAgD,CAAC;EAC/E;CACD;CAEA,SAAS,SAAgD;EACxD,MAAM,UAAU,SAAS,WAAA;EACzB,uBAAuB,OAAO;EAC9B,OAAO;CACR;AACD;;;;;;;;;;;;;;;AClEA,IAAa,uBAAb,MAA2E;CAC1E;CACA,4BAAyD,IAAI,IAAI;CACjE,2BAAqD,IAAI,IAAI;CAC7D,cAAc;CACd,aAAa;CACb,kBAA2B,KAAK,eAAe,KAAK,IAAI;CAExD,YAAY,OAA8B;EACzC,KAAK,SAAS;CACf;CAEA,MAAM,IAAI,QAAiC;EAC1C,KAAK,QAAQ;EAEb,MAAM,KAAK,4BAA4B,MADlB,KAAK,OAAO,KAAK,yCAAyC,EAAE,OAAO,CAAC,CAC5C;EAC7C,KAAK,SAAS,IAAI,IAAI;GAAE;GAAQ,SAAS,KAAA;EAAU,CAAC;EACpD,IAAI;GACH,MAAM,KAAK,OAAO,SAAS,YAAY,OAAO,QAAQ;GACtD,OAAO;EACR,SAAS,OAAO;GACf,MAAM,KAAK,OACT,KAAK,4CAA4C,EAAE,YAAY,GAAG,CAAC,CAAC,CACpE,YAAY,KAAA,CAAS;GACvB,KAAK,SAAS,OAAO,EAAE;GACvB,MAAM;EACP;CACD;CAEA,MAAM,OAAO,IAA2B;EACvC,KAAK,QAAQ;EACb,IAAI,CAAC,KAAK,SAAS,IAAI,EAAE,GAAG;EAC5B,MAAM,KAAK,OAAO,KAAK,4CAA4C,EAAE,YAAY,GAAG,CAAC;EACrF,KAAK,SAAS,OAAO,EAAE;CACxB;CAEA,MAAM,OAAO,MAAc,SAA+C;EACzE,KAAK,QAAQ;EACb,IAAI,CAAC,qBAAqB,KAAK,IAAI,GAClC,MAAM,IAAI,aACT,8DACA,KAAA,GACA,EACC,KACD,CACD;EAED,IAAI,KAAK,UAAU,IAAI,IAAI,GAC1B,MAAM,IAAI,aAAa,kCAAkC,KAAA,GAAW,EAAE,KAAK,CAAC;EAE7E,MAAM,aAAa,KAAK;EACxB,IAAI,CAAC,YAAY;GAChB,MAAM,KAAK,OAAO,UAAU,yBAAyB,KAAK,eAAe;GACzE,KAAK,cAAc;EACpB;EACA,IAAI,QAAQ;EACZ,IAAI;GACH,MAAM,KAAK,OAAO,KAAK,sBAAsB,EAAE,KAAK,CAAC;GACrD,QAAQ;GACR,MAAM,KAAK,MAAM,KAAK,IAAI,4BAA4B,IAAI,CAAC;GAC3D,MAAM,QAAQ,KAAK,SAAS,IAAI,EAAE;GAClC,IAAI,UAAU,KAAA,GACb,MAAM,IAAI,aAAa,gDAAgD,KAAA,GAAW,EACjF,KACD,CAAC;GAEF,KAAK,SAAS,IAAI,IAAI;IAAE,QAAQ,MAAM;IAAQ,SAAS;GAAK,CAAC;GAC7D,KAAK,UAAU,IAAI,MAAM,OAAO;EACjC,SAAS,OAAO;GACf,IAAI,OACH,MAAM,KAAK,OAAO,KAAK,yBAAyB,EAAE,KAAK,CAAC,CAAC,CAAC,YAAY,KAAA,CAAS;GAEhF,IAAI,CAAC,cAAc,KAAK,UAAU,SAAS,GAAG;IAC7C,MAAM,KAAK,OACT,YAAY,yBAAyB,KAAK,eAAe,CAAC,CAC1D,YAAY,KAAA,CAAS;IACvB,KAAK,cAAc;GACpB;GACA,MAAM;EACP;CACD;CAEA,MAAM,OAAO,MAA6B;EACzC,KAAK,QAAQ;EACb,IAAI,CAAC,KAAK,UAAU,IAAI,IAAI,GAAG;EAC/B,KAAK,MAAM,CAAC,IAAI,UAAU,KAAK,UAAU;GACxC,IAAI,MAAM,YAAY,MAAM;GAC5B,MAAM,KAAK,OAAO,KAAK,4CAA4C,EAAE,YAAY,GAAG,CAAC;GACrF,KAAK,SAAS,OAAO,EAAE;EACxB;EACA,MAAM,KAAK,OAAO,SAAS,6BAA6B,IAAI,CAAC;EAC7D,MAAM,KAAK,OAAO,KAAK,yBAAyB,EAAE,KAAK,CAAC;EACxD,KAAK,UAAU,OAAO,IAAI;CAC3B;CAEA,MAAM,UAAyB;EAC9B,IAAI,KAAK,YAAY;EACrB,KAAK,MAAM,QAAQ,CAAC,GAAG,KAAK,UAAU,KAAK,CAAC,GAC3C,MAAM,KAAK,OAAO,IAAI,CAAC,CAAC,YAAY,KAAA,CAAS;EAE9C,KAAK,MAAM,MAAM,CAAC,GAAG,KAAK,SAAS,KAAK,CAAC,GACxC,MAAM,KAAK,OAAO,EAAE,CAAC,CAAC,YAAY,KAAA,CAAS;EAE5C,IAAI,KAAK,aACR,MAAM,KAAK,OACT,YAAY,yBAAyB,KAAK,eAAe,CAAC,CAC1D,YAAY,KAAA,CAAS;EAExB,KAAK,cAAc;EACnB,KAAK,aAAa;CACnB;CAEA,MAAM,MAAM,QAA0D;EACrE,MAAM,OAAO,wBAAwB,MAAM;EAC3C,IAAI,SAAS,KAAA,GAAW;EACxB,MAAM,UAAU,KAAK,UAAU,IAAI,KAAK,IAAI;EAC5C,IAAI,YAAY,KAAA,GAAW;EAC3B,IAAI;GACH,MAAM,QAAQ,MAAM,QAAQ,GAAG,KAAK,IAAI;GACxC,MAAM,KAAK,OAAO,KAAK,oBAAoB;IAC1C,YAAY,4BAA4B,KAAK,MAAM,KAAK,IAAI,MAAM,KAAK;IACvE,WAAW,KAAK;IAChB,cAAc;GACf,CAAC;EACF,SAAS,OAAO;GACf,MAAM,KAAK,OAAO,KAAK,oBAAoB;IAC1C,YAAY,4BAA4B,KAAK,MAAM,KAAK,IAAI,OAAO,OAAO,KAAK,CAAC;IAChF,WAAW,KAAK;IAChB,cAAc;GACf,CAAC;EACF;CACD;CAEA,eAAe,QAAiD;EAC/D,KAAU,MAAM,MAAM,CAAC,CAAC,YAAY,KAAA,CAAS;CAC9C;CAEA,UAAgB;EACf,IAAI,KAAK,YAAY,MAAM,IAAI,aAAa,qCAAqC;CAClF;AACD;;;;;;;;;;;;;;AC9IA,IAAa,kBAAb,MAAiE;CAEhE;CACA;CACA;CAEA,YAAY,OAA6B;EACxC,KAAK,YAAY,OAAO,OAAO,CAAC,GAAG,MAAM,SAAS,CAAC;EACnD,KAAK,SAAS,OAAO,OAAO,CAAC,GAAG,MAAM,MAAM,CAAC;CAC9C;CAEA,KAAK,SAAqE;EACzE,OAAO,SAAS,UAAU,YAAY,KAAK,SAAS,QAAQ,IAAI,IAAI,KAAK,OAAO,SAAS,IAAI;CAC9F;CAEA,CAAC,YAAY,MAA0D;EACtE,IAAI,QAAQ;EACZ,KAAK,MAAM,cAAc,KAAK,OAAO,IAAI,GAAG;GAC3C,IAAI,OAAO;IACV,QAAQ;IACR;GACD;GACA,MAAM;EACP;CACD;CAEA,SAAS,MAAgD;EACxD,OAAO,KAAK,UAAU,MAAM,aAAa,SAAS,UAAU,KAAK,QAAQ;CAC1E;CAEA,SAAS,MAA2C;EACnD,MAAM,WAAW,KAAK,SAAS,IAAI;EACnC,IAAI,aAAa,KAAA,GAAW,OAAO,CAAC;EACpC,MAAM,WAAW,SAAS,MAAM,QAAQ,cAAc,UAAU,WAAW,KAAK,KAAK;EACrF,IAAI,KAAK,YAAY,KAAA,GAAW,OAAO;EACvC,MAAM,UAAU,KAAK,UAAU,MAAM,cAAc,UAAU,UAAU,KAAK,OAAO;EACnF,IAAI,YAAY,KAAA,GAAW,OAAO;EAClC,OAAO,CAAC,GAAG,UAAU,GAAG,QAAQ,MAAM,QAAQ,cAAc,UAAU,WAAW,KAAA,CAAS,CAAC;CAC5F;CAEA,OAAO,MAA4C;EAClD,MAAM,WAAW,KAAK,SAAS,IAAI;EACnC,IAAI,aAAa,KAAA,GAAW,OAAO,KAAA;EACnC,OAAO,KAAK,WAAW,KAAA,IAAY,KAAK,OAAO,KAAK,QAAQ,IAAI,SAAS,MAAM,KAAK;CACrF;CAEA,SAAS,MAAmB,UAA2D;EACtF,MAAM,aAAa,KAAK,YAAY,IAAI;EACxC,MAAM,QAAQ,WAAW,WACvB,cAAc,UAAU,aAAa,KAAK,YAAY,UAAU,UAAU,KAAK,KACjF;EACA,IAAI,aAAa,aAAa,OAAO,QAAQ,IAAI,CAAC,IAAI,WAAW,MAAM,GAAG,KAAK;EAC/E,IAAI,aAAa,aAAa,OAAO,QAAQ,IAAI,CAAC,IAAI,WAAW,MAAM,QAAQ,CAAC;EAChF,OAAO,WAAW,QAChB,cAAc,UAAU,aAAa,KAAK,YAAY,UAAU,UAAU,KAAK,KACjF;CACD;CAEA,UAAU,MAA2C;EACpD,MAAM,YAA2B,CAAC;EAClC,MAAM,0BAAU,IAAI,IAAY;EAChC,IAAI,UAAU;EAEd,OAAO,MAAM;GACZ,MAAM,SAAS,KAAK,OAAO,OAAO;GAClC,IAAI,WAAW,KAAA,GAAW;GAC1B,MAAM,WAAW,KAAK,UAAU,MAAM;GACtC,IAAI,QAAQ,IAAI,QAAQ,GAAG;GAC3B,QAAQ,IAAI,QAAQ;GACpB,UAAU,KAAK,MAAM;GACrB,UAAU;EACX;EACA,OAAO;CACR;CAEA,OAAO,OAAoB,QAA8C;EACxE,MAAM,iBAAiB,KAAK,OAAO,KAAK;EACxC,MAAM,kBAAkB,KAAK,OAAO,MAAM;EAC1C,MAAM,aAAa,IAAI,IAAI,eAAe,KAAK,SAAS,KAAK,UAAU,IAAI,CAAC,CAAC;EAC7E,OAAO,gBAAgB,MAAM,SAAS,WAAW,IAAI,KAAK,UAAU,IAAI,CAAC,CAAC;CAC3E;CAEA,SAAS,OAAoB,QAAyC;EACrE,MAAM,SAAS,KAAK,OAAO,OAAO,MAAM;EACxC,IAAI,WAAW,KAAA,GAAW,OAAO,KAAA;EACjC,MAAM,WAAW,KAAK,UAAU,MAAM;EACtC,MAAM,gBAAgB,KAAK,OAAO,KAAK,CAAC,CAAC,WAAW,SAAS,KAAK,UAAU,IAAI,MAAM,QAAQ;EAC9F,MAAM,iBAAiB,KAAK,OAAO,MAAM,CAAC,CAAC,WACzC,SAAS,KAAK,UAAU,IAAI,MAAM,QACpC;EACA,IAAI,gBAAgB,KAAK,iBAAiB,GAAG,OAAO,KAAA;EACpD,OAAO,gBAAgB;CACxB;CAEA,KAAK,OAAyE;EAC7E,KAAK,MAAM,QAAQ,KAAK,KAAK,GAC5B,IAAI,KAAK,OAAO,MAAM,KAAK,GAAG,OAAO;CAGvC;CAEA,OAAO,OAAgD,OAAwC;EAC9F,IAAI,UAAU,KAAA,MAAc,CAAC,UAAU,KAAK,KAAK,QAAQ,IACxD,MAAM,IAAI,aACT,4DACA,KAAA,GACA,EACC,MACD,CACD;EAED,IAAI,UAAU,GAAG,OAAO,CAAC;EACzB,MAAM,QAAuB,CAAC;EAC9B,KAAK,MAAM,QAAQ,KAAK,KAAK,GAAG;GAC/B,IAAI,CAAC,KAAK,OAAO,MAAM,KAAK,GAAG;GAC/B,MAAM,KAAK,IAAI;GACf,IAAI,UAAU,KAAA,KAAa,MAAM,UAAU,OAAO;EACnD;EACA,OAAO;CACR;CAEA,QACC,MACA,OAC0B;EAC1B,IAAI,KAAK,OAAO,MAAM,KAAK,GAAG,OAAO;EACrC,KAAK,MAAM,YAAY,KAAK,UAAU,IAAI,GACzC,IAAI,KAAK,OAAO,UAAU,KAAK,GAAG,OAAO;CAG3C;CAEA,KAAK,MAA2B;EAC/B,MAAM,WAAW,KAAK,SAAS,IAAI;EACnC,IAAI,aAAa,KAAA,GAAW,OAAO,YAAY,KAAK,SAAS,UAAU,KAAK;EAC5E,MAAM,QAAQ,CAAC,GAAG,KAAK,UAAU,IAAI,CAAC,CAAC,CAAC,QAAQ;EAChD,MAAM,KAAK,IAAI;EACf,MAAM,WAAqB,CAAC;EAE5B,KAAK,MAAM,WAAW,OAAO;GAC5B,IAAI,QAAQ,aAAa,GAAG;IAC3B,SAAS,KAAK,GAAG,QAAQ,KAAK,YAAY,EAAE,GAAG,QAAQ,OAAO;IAC9D;GACD;GACA,IAAI,UAAU;GACd,IAAI,QAAQ,WAAW,KAAA,GAAW;IACjC,MAAM,QAAQ,KAAK,SAAS,OAAO;IACnC,KAAK,MAAM,WAAW,OAAO,SAAS,CAAC,GAAG;KACzC,IAAI,QAAQ,SAAS,QAAQ,OAAO;KACpC,IAAI,QAAQ,WAAW,QAAQ,UAAU,QAAQ,SAAS,QAAQ,MAAM,WAAW;IACpF;GACD;GACA,SAAS,KAAK,GAAG,QAAQ,KAAK,YAAY,EAAE,GAAG,SAAS;EACzD;EAEA,OAAO,SAAS,KAAK,UAAU,SAAS,KAAK,EAAE,MAAM,SAAS,KAAK,KAAK;CACzE;CAEA,SAAiC;EAChC,MAAM,QAAuB,CAAC;EAC9B,KAAK,MAAM,YAAY,KAAK,WAC3B,MAAM,KAAK,GAAG,SAAS,MAAM,QAAQ,SAAS,KAAK,WAAW,KAAA,CAAS,CAAC;EAEzE,KAAK,MAAM,YAAY,KAAK,WAAW,MAAM,KAAK,GAAG,SAAS,KAAK;EACnE,OAAO;CACR;CAEA,OAAO,UAA2C;EACjD,MAAM,SAAS,KAAK;EACpB,IAAI,WAAW,KAAA,GAAW,OAAO,OAAO,IAAI,QAAQ;EACpD,MAAM,wBAAQ,IAAI,IAAyB;EAC3C,KAAK,MAAM,QAAQ,KAAK,KAAK,GAC5B,IAAI,KAAK,YAAY,KAAA,KAAa,CAAC,MAAM,IAAI,KAAK,OAAO,GAAG,MAAM,IAAI,KAAK,SAAS,IAAI;EAEzF,KAAK,UAAU;EACf,OAAO,MAAM,IAAI,QAAQ;CAC1B;CAEA,CAAC,OAAO,MAA2D;EAClE,MAAM,0BAAU,IAAI,IAAY;EAChC,KAAK,MAAM,QAAQ,SAAS,KAAA,IAAY,KAAK,OAAO,IAAI,CAAC,IAAI,GAAG;GAC/D,MAAM,QAAuB,CAAC,IAAI;GAClC,OAAO,MAAM,SAAS,GAAG;IACxB,MAAM,OAAO,MAAM,IAAI;IACvB,IAAI,SAAS,KAAA,GAAW;IACxB,MAAM,WAAW,KAAK,UAAU,IAAI;IACpC,IAAI,QAAQ,IAAI,QAAQ,GAAG;IAC3B,QAAQ,IAAI,QAAQ;IACpB,MAAM;IAEN,MAAM,WAAW,KAAK,SAAS,IAAI;IACnC,KAAK,IAAI,QAAQ,SAAS,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG;KAC7D,MAAM,QAAQ,SAAS;KACvB,IAAI,UAAU,KAAA,GAAW,MAAM,KAAK,KAAK;IAC1C;GACD;EACD;CACD;CAEA,CAAC,SAAS,MAA2D;EACpE,MAAM,0BAAU,IAAI,IAAY;EAChC,KAAK,MAAM,QAAQ,SAAS,KAAA,IAAY,KAAK,OAAO,IAAI,CAAC,IAAI,GAAG;GAC/D,MAAM,QAAuB,CAAC,IAAI;GAClC,IAAI,SAAS;GACb,OAAO,SAAS,MAAM,QAAQ;IAC7B,MAAM,OAAO,MAAM;IACnB,UAAU;IACV,IAAI,SAAS,KAAA,GAAW;IACxB,MAAM,WAAW,KAAK,UAAU,IAAI;IACpC,IAAI,QAAQ,IAAI,QAAQ,GAAG;IAC3B,QAAQ,IAAI,QAAQ;IACpB,MAAM;IACN,MAAM,KAAK,GAAG,KAAK,SAAS,IAAI,CAAC;GAClC;EACD;CACD;CAEA,YAAY,MAA2C;EACtD,MAAM,SAAS,KAAK,OAAO,IAAI;EAC/B,OAAO,WAAW,KAAA,IACd,KAAK,SAAS,IAAI,CAAC,EAAE,MAAM,QAAQ,cAAc,UAAU,WAAW,KAAA,CAAS,KAAK,CAAC,IACtF,KAAK,SAAS,MAAM;CACxB;CAEA,OAAO,MAA2C;EACjD,OAAO,CAAC,MAAM,GAAG,KAAK,UAAU,IAAI,CAAC;CACtC;CAEA,OAAO,MAAmB,OAAyD;EAClF,OAAO,mBAAmB,KAAK,IAAI,mBAAmB,MAAM,KAAK,IAAI,MAAM,IAAI;CAChF;CAEA,UAAU,MAA2B;EACpC,OAAO,GAAG,KAAK,SAAS,GAAG,KAAK;CACjC;AACD;;;;;;AC3PA,IAAa,gBAAb,MAA6D;CAC5D;CACA;CACA;CACA;CACA;CACA,UAAU;CAEV,YACC,QACA,SACA,IACA,KACA,UACC;EACD,KAAK,UAAU;EACf,KAAK,WAAW;EAChB,KAAK,MAAM;EACX,KAAK,OAAO;EACZ,KAAK,YAAY;CAClB;CAEA,IAAI,KAAa;EAChB,OAAO,KAAK;CACb;CAEA,IAAI,MAAc;EACjB,OAAO,KAAK;CACb;CAEA,IAAI,WAAkC;EACrC,OAAO,KAAK;CACb;CAEA,MAAM,SAAS,YAAoB,SAAoC;EACtE,KAAK,QAAQ;EACb,OAAO,qBACN,MAAM,KAAK,QAAQ,KAClB,oBACA;GACC,YAAY,iCAAiC,YAAY,oBAAoB;GAC7E,eAAe;GACf,cAAc;EACf,GACA;GAAE,SAAS,KAAK;GAAU,GAAI,YAAY,KAAA,IAAY,EAAE,QAAQ,IAAI,CAAC;EAAG,CACzE,CACD;CACD;CAEA,MAAM,KAAK,QAAgB,QAA8D;EACxF,KAAK,QAAQ;EACb,OAAO,MAAM,KAAK,QAAQ,KAAK,QAAQ,QAAQ,EAAE,SAAS,KAAK,SAAS,CAAC;CAC1E;CAEA,SAAe;EACd,KAAK,UAAU;CAChB;CAEA,MAAM,QAAuB;EAC5B,IAAI,KAAK,SAAS;EAClB,KAAK,UAAU;EACf,IAAI;GACH,MAAM,KAAK,QAAQ,KAAK,sBAAsB,EAAE,UAAU,KAAK,IAAI,CAAC;EACrE,QAAQ,CAER;CACD;CAEA,UAAgB;EACf,IAAI,KAAK,SAAS,MAAM,IAAI,aAAa,0BAA0B;EACnE,IAAI,CAAC,KAAK,QAAQ,WAAW,MAAM,IAAI,aAAa,gCAAgC;CACrF;AACD;;;;;;;;;;;;;;;;ACIA,IAAa,cAAb,MAAa,oBAAoB,aAA6C;CAC7E;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA,iCAAwD,IAAI,IAAI;CAChE,4BAA0C,IAAI,IAAI;CAClD,6BAAoD,IAAI,IAAI;CAC5D,2BAAgD,IAAI,IAAI;CACxD,0BAA6C,IAAI,IAAI;CACrD,UAAU;CACV;CACA,gBAA4D,IAAI,kBAAkB;CAClF;CACA;CACA;CACA,cAAiC,CAAC;CAClC,gBAAgB;CAChB;CACA;CACA;CACA;CACA,6BAAsC,KAAK,0BAA0B,KAAK,IAAI;CAC9E,kBAA2B,KAAK,eAAe,KAAK,IAAI;CACxD,eAAwB,KAAK,YAAY,KAAK,IAAI;CAClD,wBAAiC,KAAK,qBAAqB,KAAK,IAAI;CACpE,yBAAkC,KAAK,sBAAsB,KAAK,IAAI;CACtE,wBAAiC,KAAK,qBAAqB,KAAK,IAAI;CACpE,iBAA0B,KAAK,cAAc,KAAK,IAAI;CACtD,kBAA2B,KAAK,eAAe,KAAK,IAAI;CACxD,kBAA2B,KAAK,eAAe,KAAK,IAAI;CACxD,gBAAyB,KAAK,aAAa,KAAK,IAAI;CACpD,gBAAyB,KAAK,aAAa,KAAK,IAAI;CACpD,mBAA4B,KAAK,gBAAgB,KAAK,IAAI;CAC1D,2BAAoC,KAAK,wBAAwB,KAAK,IAAI;CAC1E,mBAA4B,KAAK,gBAAgB,KAAK,IAAI;CAC1D,mBAA4B,KAAK,gBAAgB,KAAK,IAAI;CAE1D,YACC,QACA,UACA,WACA,QACA,KACA,SACA,WACA,QACA,SACC;EACD,MAAM,QAAQ,WAAW,WAAW,UAAU,OAAO,eAAe,KAAA,GAAW,KAAA,GAAW,KAAK;EAC/F,KAAK,UAAU;EACf,KAAK,YAAY;EACjB,KAAK,aAAa;EAClB,KAAK,UAAU;EACf,KAAK,aAAa;EAClB,KAAK,UAAU;EACf,KAAK,WAAW,IAAI,QAAQ;GAC3B,GAAI,SAAS,OAAO,KAAA,IAAY,EAAE,IAAI,QAAQ,GAAG,IAAI,CAAC;GACtD,GAAI,SAAS,UAAU,KAAA,IAAY,EAAE,OAAO,QAAQ,MAAM,IAAI,CAAC;EAChE,CAAC;EACD,KAAK,WAAW,IAAI,sBAAsB,MAAM,MAAM;EACtD,KAAK,qBAAqB,IAAI,yBAAyB,IAAI;EAC3D,KAAK,WAAW,IAAI,qBAAqB,IAAI;EAC7C,KAAK,iBAAiB,IAAI,qBAAqB,IAAI;EACnD,KAAK,eAAe,IAAI,mBAAmB,MAAM,MAAM;EACvD,KAAK,SAAS,IAAI,aAAa,IAAI;EACnC,KAAK,SAAS,QAAQ,GAAG,YAAY,YAAY,KAAK,SAAS,KAAK,WAAW,OAAO,CAAC;EACvF,KAAK,SAAS,QAAQ,GAAG,aAAa,aAAa,KAAK,SAAS,KAAK,YAAY,QAAQ,CAAC;EAC3F,KAAK,SAAS,QAAQ,GAAG,YAAY,YAAY,KAAK,SAAS,KAAK,WAAW,OAAO,CAAC;EACvF,KAAK,SAAS,QAAQ,GAAG,WAAW,WAAW,KAAK,SAAS,KAAK,UAAU,MAAM,CAAC;EAEnF,KAAK,QAAQ,UAAU,0BAA0B,KAAK,eAAe;EACrE,KAAK,QAAQ,UAAU,2BAA2B,KAAK,kBAAkB,KAAK,UAAU;EACxF,KAAK,QAAQ,UAAU,6BAA6B,KAAK,kBAAkB,KAAK,UAAU;EAC1F,KAAK,QAAQ,UAAU,sBAAsB,KAAK,uBAAuB,KAAK,UAAU;EACxF,KAAK,QAAQ,UAAU,uBAAuB,KAAK,wBAAwB,KAAK,UAAU;EAC1F,KAAK,QAAQ,UAAU,sBAAsB,KAAK,uBAAuB,KAAK,UAAU;EACxF,KAAK,QAAQ,UAAU,gCAAgC,KAAK,gBAAgB,KAAK,UAAU;EAC3F,KAAK,QAAQ,UAAU,0BAA0B,KAAK,iBAAiB,KAAK,UAAU;EACtF,KAAK,QAAQ,UAAU,4BAA4B,KAAK,iBAAiB,KAAK,UAAU;EACxF,KAAK,QAAQ,UAAU,2BAA2B,KAAK,eAAe,KAAK,UAAU;EACrF,KAAK,QAAQ,UAAU,2BAA2B,KAAK,eAAe,KAAK,UAAU;EACrF,KAAK,QAAQ,UAAU,6BAA6B,KAAK,gBAAgB;EACzE,KAAK,QAAQ,UAAU,4BAA4B,KAAK,wBAAwB;CACjF;CAEA,IAAI,UAAiD;EACpD,OAAO,KAAK;CACb;CAEA,IAAI,UAA0C;EAC7C,OAAO,KAAK;CACb;CAEA,IAAI,aAAgD;EACnD,OAAO,KAAK;CACb;CAEA,IAAI,UAAyC;EAC5C,OAAO,KAAK;CACb;CAEA,IAAI,gBAA+C;EAClD,OAAO,KAAK;CACb;CAEA,IAAI,cAA2C;EAC9C,OAAO,KAAK;CACb;CAEA,IAAI,QAA+B;EAClC,OAAO,KAAK;CACb;CAEA,IAAI,SAA2C;EAC9C,OAAO,KAAK;CACb;CAEA,IAAI,SAAiB;EACpB,OAAO,KAAK;CACb;CAEA,IAAI,SAAkB;EACrB,OAAO,KAAK;CACb;CAEA,MAAM,SACL,KACA,SACmC;EACnC,KAAK,OAAO;EACZ,OAAO,KAAK,gBAAgB,KAAA,GAC3B,MAAM,KAAK,YAAY,YAAY,KAAA,CAAS;EAE7C,KAAK,OAAO;EACZ,MAAM,aAAa,KAAK,UAAU,KAAK,OAAO;EAC9C,KAAK,cAAc;EAEnB,IAAI;GACH,OAAO,MAAM;EACd,UAAU;GACT,IAAI,KAAK,gBAAgB,YAAY,KAAK,cAAc,KAAA;EACzD;CACD;CAEA,MAAM,OAAO,SAAsE;EAClF,KAAK,OAAO;EACZ,OAAO,KAAK,gBAAgB,KAAA,GAC3B,MAAM,KAAK,YAAY,YAAY,KAAA,CAAS;EAE7C,KAAK,OAAO;EACZ,MAAM,aAAa,KAAK,QAAQ,OAAO;EACvC,KAAK,cAAc;EAEnB,IAAI;GACH,OAAO,MAAM;EACd,UAAU;GACT,IAAI,KAAK,gBAAgB,YAAY,KAAK,cAAc,KAAA;EACzD;CACD;CAEA,MAAM,KAAK,SAAsE;EAChF,OAAO,MAAM,KAAK,SAAS,IAAI,OAAO;CACvC;CAEA,MAAM,QAAQ,SAAsE;EACnF,OAAO,MAAM,KAAK,SAAS,GAAG,OAAO;CACtC;CAEA,MAAM,WAAW,SAAsE;EACtF,KAAK,OAAO;EACZ,MAAM,SAAkC,EAAE,GAAG,0BAA0B,OAAO,EAAE;EAEhF,IAAI,SAAS,SAAS,MAAM;GAC3B,MAAM,UAAU,MAAM,KAAK,KAAK,uBAAuB;GACvD,MAAM,OACL,SAAS,OAAO,KAAK,SAAS,QAAQ,iBAAiB,IACpD,QAAQ,oBACR,SAAS,OAAO,KAAK,SAAS,QAAQ,cAAc,IACnD,QAAQ,iBACR,KAAA;GACL,MAAM,QAAQ,OAAO;GACrB,MAAM,SAAS,OAAO;GACtB,IAAI,CAAC,eAAe,KAAK,KAAK,SAAS,KAAK,CAAC,eAAe,MAAM,KAAK,UAAU,GAChF,MAAM,IAAI,aAAa,oDAAoD;GAE5E,OAAO,UAAU;IAAE,GAAG;IAAG,GAAG;IAAG;IAAO;IAAQ,OAAO;GAAE;GACvD,OAAO,2BAA2B;EACnC;EAEA,IAAI,SAAS,UAAU,KAAA,GAAW;GACjC,MAAM,QAAQ,QAAQ,UAAU,QAAQ,IAAI,MAAM,KAAK,SAAS,kBAAkB;GAClF,IAAI,CAAC,eAAe,KAAK,KAAK,SAAS,GACtC,MAAM,IAAI,aAAa,8CAA8C;GAEtE,IAAI,CAAC,SAAS,OAAO,OAAO,GAAG;IAC9B,MAAM,UAAU,MAAM,KAAK,KAAK,uBAAuB;IACvD,MAAM,WACL,SAAS,OAAO,KAAK,SAAS,QAAQ,oBAAoB,IACvD,QAAQ,uBACR,KAAA;IACJ,IACC,aAAa,KAAA,KACb,CAAC,eAAe,SAAS,QAAQ,KACjC,CAAC,eAAe,SAAS,QAAQ,KACjC,CAAC,eAAe,SAAS,cAAc,KACvC,SAAS,kBAAkB,KAC3B,CAAC,eAAe,SAAS,eAAe,KACxC,SAAS,mBAAmB,GAE5B,MAAM,IAAI,aAAa,mDAAmD;IAE3E,OAAO,UAAU;KAChB,GAAG,SAAS;KACZ,GAAG,SAAS;KACZ,OAAO,SAAS;KAChB,QAAQ,SAAS;KACjB,OAAO;IACR;GACD,OACC,OAAO,OAAO,CAAC,WAAW;EAE5B;EAEA,IAAI;EACJ,IAAI,cAAc;EAClB,IAAI;GACH,MAAM,cAAc,uCAAuC,OAAO;GAClE,IAAI,gBAAgB,KAAA,GAAW;IAC9B,MAAM,QAAQ,MAAM,KAAK,SAAS,WAAW;IAC7C,IAAI,CAAC,SAAS,KAAK,GAAG,MAAM,IAAI,aAAa,uCAAuC;IACpF,QAAQ;GACT;GACA,IAAI,SAAS,gBAAgB,MAAM;IAClC,MAAM,KAAK,KAAK,+CAA+C,EAC9D,OAAO;KAAE,GAAG;KAAG,GAAG;KAAG,GAAG;KAAG,GAAG;IAAE,EACjC,CAAC;IACD,cAAc;GACf;GACA,MAAM,SAAS,MAAM,KAAK,KAAK,0BAA0B,MAAM;GAC/D,IAAI,CAAC,SAAS,MAAM,KAAK,CAAC,SAAS,OAAO,OAAO,GAChD,MAAM,IAAI,aAAa,qCAAqC;GAG7D,MAAM,QAAQ,aAAa,OAAO,OAAO;GACzC,IAAI,SAAS,SAAS,KAAA,GAAW,MAAM,KAAK,KAAK,QAAQ,MAAM,KAAK;GACpE,OAAO;IAAE;IAAO,MAAM,SAAS;GAAK;EACrC,UAAU;GACT,IAAI,aACH,MAAM,KAAK,KAAK,6CAA6C,CAAC,CAAC,YAAY,KAAA,CAAS;GAErF,IAAI,UAAU,KAAA,GACb,MAAM,KAAK,SAAS,mCAAmC,KAAK,CAAC,CAAC,CAAC,YAAY,KAAA,CAAS;EAEtF;CACD;CAEA,MAAM,IAAI,SAAwD;EACjE,KAAK,OAAO;EACZ,MAAM,SAAS,MAAM,KAAK,KAAK,mBAAmB,mBAAmB,OAAO,CAAC;EAC7E,IAAI,CAAC,SAAS,MAAM,KAAK,CAAC,SAAS,OAAO,OAAO,GAChD,MAAM,IAAI,aAAa,8BAA8B;EAEtD,MAAM,QAAQ,aAAa,OAAO,OAAO;EACzC,IAAI,SAAS,SAAS,KAAA,GAAW,MAAM,KAAK,KAAK,QAAQ,MAAM,KAAK;EACpE,OAAO;GAAE;GAAO,MAAM,SAAS;EAAK;CACrC;CAEA,MAAe,KAAK,MAAc,OAAkC;EACnE,IAAI,KAAK,YAAY,KAAA,GACpB,MAAM,IAAI,aAAa,8CAA8C,KAAA,GAAW,EAAE,KAAK,CAAC;EAEzF,MAAM,KAAK,QAAQ,MAAM,MAAM,KAAK;CACrC;CAEA,MAAM,MAAM,MAA0D;EAErE,QAAO,MADc,KAAK,OAAO,EAAA,CACnB,MAAM,UAAU,MAAM,SAAS,QAAQ,MAAM,QAAQ,IAAI;CACxE;CAEA,MAAM,SAAoD;EACzD,KAAK,OAAO;EAEZ,OAAO,kBAAkB,MADJ,KAAK,KAAK,mBAAmB,CACnB,CAAC,CAAC,KAAK,UAAU,KAAK,OAAO,KAAK,CAAC;CACnE;CAEA,MAAM,SAAS,SAAqE;EACnF,KAAK,OAAO;EACZ,MAAM,SAAS,SAAS,UAAU,CAAC;EAMnC,OAAO,IAAI,gBACV,oBAAoB,MANA,KAAK,KAAK,+BAA+B;GAC7D,gBAAgB,CAAC,GAAG,MAAM;GAC1B,mBAAmB,SAAS,SAAS;GACrC,iBAAiB,SAAS,SAAS;EACpC,CAAC,GAE4B,QAAQ,SAAS,SAAA,GAAoC,CAClF;CACD;CAEA,MAAM,QAAQ,SAAmE;EAChF,KAAK,OAAO;EACZ,IAAI,KAAK,aAAa,KAAA,GAAW,OAAO,KAAK;EAC7C,MAAM,SAAS,KAAK,cAAc;EAClC,IAAI,WAAW,KAAA,GAAW,OAAO,MAAM;EAEvC,OAAO,MAAM,KAAK,cAAc,cAAc,KAAK,cAAc,OAAO,CAAC;CAC1E;CAEA,UAAyB;EACxB,MAAM,SAAS,KAAK;EACpB,IAAI,WAAW,KAAA,GAAW,OAAO;EAEjC,KAAK,UAAU;EACf,MAAM,UAAU,KAAK,SAAS;EAC9B,KAAK,WAAW;EAChB,OAAO;CACR;CAEA,QAAuB;EACtB,MAAM,SAAS,KAAK;EACpB,IAAI,WAAW,KAAA,GAAW,OAAO;EAEjC,IAAI,KAAK,SAAS;GACjB,MAAM,UAAU,KAAK,SAAS;GAC9B,KAAK,WAAW;GAChB,OAAO;EACR;EAEA,KAAK,UAAU;EACf,MAAM,UAAU,KAAK,OAAO;EAC5B,KAAK,WAAW;EAChB,OAAO;CACR;CAEA,SAAwB;EACvB,MAAM,OAAO;EACb,IAAI,KAAK,SAAS,MAAM,IAAI,aAAa,wBAAwB;CAClE;CAEA,MAAM,UACL,KACA,SACmC;EACnC,MAAM,UAAU,SAAS,WAAA;EACzB,uBAAuB,OAAO;EAC9B,MAAM,QAAQ,KAAK,iBAAiB;EACpC,MAAM,YAAY,SAAS,aAAa;EACxC,MAAM,OAAO,KAAK,kBAAkB,WAAW,OAAO;EACtD,KAAU,YAAY,KAAA,CAAS;EAC/B,IAAI;EAEJ,IAAI;GACH,MAAM,SAAS,MAAM,KAAK,KAAK,iBAAiB,EAAE,IAAI,GAAG,EAAE,QAAQ,CAAC;GACpE,IAAI,SAAS,MAAM,KAAK,SAAS,OAAO,YAAY,GACnD,MAAM,IAAI,aAAa,sBAAsB,OAAO,cAAc;GAEnE,IAAI,SAAS,MAAM,KAAK,SAAS,OAAO,WAAW,GAAG,SAAS,OAAO;GACtE,MAAM;EACP,SAAS,OAAO;GACf,KAAK,sBAAsB,KAAK;GAChC,KAAK,YAAY;GACjB,MAAM,KAAK,aAAa,KAAK,IAAI,SAAS,+BAA+B,CAAC;GAC1E,MAAM;EACP;EAEA,OAAO,MAAM,KAAK,oBAAoB,OAAO,MAAM;CACpD;CAEA,MAAM,QAAQ,SAAsE;EACnF,MAAM,UAAU,SAAS,WAAA;EACzB,uBAAuB,OAAO;EAC9B,MAAM,QAAQ,KAAK,iBAAiB;EACpC,MAAM,OAAO,KAAK,kBAAkB,SAAS,aAAa,QAAQ,OAAO;EACzE,KAAU,YAAY,KAAA,CAAS;EAE/B,IAAI;GACH,MAAM,KAAK,KAAK,eAAe,KAAA,GAAW,EAAE,QAAQ,CAAC;GACrD,MAAM;EACP,SAAS,OAAO;GACf,KAAK,sBAAsB,KAAK;GAChC,KAAK,YAAY;GACjB,MAAM,KAAK,aAAa,KAAK,IAAI,SAAS,+BAA+B,CAAC;GAC1E,MAAM;EACP;EAEA,OAAO,MAAM,KAAK,oBAAoB,KAAK;CAC5C;CAEA,MAAM,SACL,QACA,SACmC;EACnC,KAAK,OAAO;EACZ,OAAO,KAAK,gBAAgB,KAAA,GAC3B,MAAM,KAAK,YAAY,YAAY,KAAA,CAAS;EAE7C,KAAK,OAAO;EACZ,MAAM,aAAa,KAAK,iBAAiB,QAAQ,OAAO;EACxD,KAAK,cAAc;EAEnB,IAAI;GACH,OAAO,MAAM;EACd,UAAU;GACT,IAAI,KAAK,gBAAgB,YAAY,KAAK,cAAc,KAAA;EACzD;CACD;CAEA,MAAM,iBACL,QACA,SACmC;EACnC,MAAM,UAAU,SAAS,WAAA;EACzB,uBAAuB,OAAO;EAC9B,MAAM,UAAU,MAAM,KAAK,KAAK,2BAA2B;EAC3D,IAAI,CAAC,SAAS,OAAO,KAAK,CAAC,UAAU,QAAQ,eAAe,KAAK,CAAC,QAAQ,QAAQ,UAAU,GAC3F,MAAM,IAAI,aAAa,iCAAiC;EAEzD,MAAM,QAAQ,QAAQ,UAAU,CAAC,QAAQ,kBAAkB;EAC3D,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,UAAU,MAAM,KAAK,GAC7C,OAAO;GAAE,KAAK,KAAK;GAAK,UAAU,KAAA;GAAW,MAAM;EAAM;EAG1D,MAAM,QAAQ,KAAK,iBAAiB;EACpC,MAAM,OAAO,KAAK,kBAAkB,SAAS,aAAa,QAAQ,OAAO;EACzE,KAAU,YAAY,KAAA,CAAS;EAC/B,IAAI;GACH,MAAM,KAAK,KAAK,+BAA+B,EAAE,SAAS,MAAM,MAAM,GAAG,EAAE,QAAQ,CAAC;GACpF,MAAM;EACP,SAAS,OAAO;GACf,KAAK,sBAAsB,KAAK;GAChC,KAAK,YAAY;GACjB,MAAM,KAAK,aAAa,KAAK,IAAI,SAAS,+BAA+B,CAAC;GAC1E,MAAM;EACP;EAEA,OAAO,MAAM,KAAK,oBAAoB,KAAK;CAC5C;CAEA,mBAA2C;EAC1C,MAAM,YAA+B,CAAC;EACtC,KAAK,aAAa;EAClB,KAAK,SAAS,QAAQ,GAAG,YAAY,KAAK,0BAA0B;EACpE,OAAO,EAAE,UAAU;CACpB;CAEA,sBAAsB,OAAqC;EAC1D,KAAK,SAAS,QAAQ,IAAI,YAAY,KAAK,0BAA0B;EACrE,IAAI,KAAK,eAAe,MAAM,WAAW,KAAK,aAAa,KAAA;CAC5D;CAEA,kBACC,OACA,KACA,QAC0B;EAC1B,KAAK,sBAAsB,KAAK;EAKhC,OAAO;GACN;GACA,UALA,WAAW,KAAA,IACR,MAAM,UAAU,UAAU,cAAc,UAAU,QAAQ,GAAG,IAC7D,MAAM,UAAU,UAAU,cAAc,UAAU,WAAW,MAAM;GAItE,MAAM,KAAK;EACZ;CACD;CAEA,MAAM,oBACL,OACA,QACmC;EACnC,IAAI;GAEH,MAAM,WAAW,qBAAqB,MADb,KAAK,SAAS,eAAe,GACJ,gBAAgB;GAClE,KAAK,OAAO,QAAQ;GACpB,OAAO,KAAK,kBAAkB,OAAO,UAAU,MAAM;EACtD,SAAS,OAAO;GACf,KAAK,sBAAsB,KAAK;GAChC,MAAM;EACP;CACD;CAEA,MAAM,cAAc,SAA0D;EAC7E,MAAM,UAAU,IAAI,eAAe,KAAK,SAAS,KAAK,YAAY,OAAO;EACzE,MAAM,QAAQ,MAAM;EACpB,IAAI,KAAK,SAAS;GACjB,MAAM,QAAQ,QAAQ;GACtB,MAAM,IAAI,aAAa,wBAAwB;EAChD;EACA,KAAK,WAAW;EAChB,OAAO;CACR;CAEA,MAAM,WAA0B;EAC/B,MAAM,KAAK,SAAS;EACpB,IAAI;GACH,MAAM,KAAK,QAAQ,KAAK,2BAA2B,EAAE,WAAW,KAAK,WAAW,CAAC;EAClF,QAAQ,CAER;CACD;CAEA,MAAM,SAAwB;EAC7B,MAAM,KAAK,SAAS;EACpB,IAAI;GACH,MAAM,KAAK,QAAQ,KAAK,sBAAsB,EAAE,UAAU,KAAK,UAAU,CAAC;EAC3E,QAAQ,CAER;CACD;CAEA,WAA0B;EACzB,MAAM,SAAS,KAAK;EACpB,IAAI,WAAW,KAAA,GAAW,OAAO;EACjC,MAAM,UAAU,KAAK,kBAAkB;EACvC,KAAK,aAAa;EAClB,OAAO;CACR;CAEA,MAAM,oBAAmC;EACxC,KAAK,YAAY;EACjB,MAAM,KAAK,cAAc,SAAS,YAAY,KAAA,CAAS;EACvD,MAAM,KAAK,SAAS,QAAQ,CAAC,CAAC,YAAY,KAAA,CAAS;EACnD,MAAM,KAAK,aAAa,QAAQ,CAAC,CAAC,YAAY,KAAA,CAAS;EACvD,MAAM,KAAK,OAAO,UAAU,CAAC,CAAC,YAAY,KAAA,CAAS;EACnD,MAAM,KAAK,SAAS,QAAQ,CAAC,CAAC,YAAY,KAAA,CAAS;EAEnD,IAAI,KAAK,aAAa,KAAA,GAAW;GAChC,IAAI;IACH,MAAM,KAAK,SAAS,QAAQ;GAC7B,QAAQ,CAER;GACA,KAAK,WAAW,KAAA;EACjB;EAEA,KAAK,eAAe,MAAM;EAC1B,KAAK,UAAU,MAAM;EACrB,KAAK,MAAM,UAAU,KAAK,SAAS,OAAO,GAAG,OAAO,OAAO;EAC3D,KAAK,SAAS,MAAM;EACpB,KAAK,QAAQ,MAAM;EACnB,KAAK,WAAW,MAAM;EACtB,KAAK,QAAQ,YAAY,0BAA0B,KAAK,eAAe;EACvE,KAAK,QAAQ,YAAY,2BAA2B,KAAK,kBAAkB,KAAK,UAAU;EAC1F,KAAK,QAAQ,YAAY,6BAA6B,KAAK,kBAAkB,KAAK,UAAU;EAC5F,KAAK,QAAQ,YAAY,sBAAsB,KAAK,uBAAuB,KAAK,UAAU;EAC1F,KAAK,QAAQ,YAAY,uBAAuB,KAAK,wBAAwB,KAAK,UAAU;EAC5F,KAAK,QAAQ,YAAY,sBAAsB,KAAK,uBAAuB,KAAK,UAAU;EAC1F,KAAK,QAAQ,YAAY,gCAAgC,KAAK,gBAAgB,KAAK,UAAU;EAC7F,KAAK,QAAQ,YAAY,0BAA0B,KAAK,iBAAiB,KAAK,UAAU;EACxF,KAAK,QAAQ,YAAY,4BAA4B,KAAK,iBAAiB,KAAK,UAAU;EAC1F,KAAK,QAAQ,YAAY,2BAA2B,KAAK,eAAe,KAAK,UAAU;EACvF,KAAK,QAAQ,YAAY,2BAA2B,KAAK,eAAe,KAAK,UAAU;EACvF,KAAK,QAAQ,YAAY,6BAA6B,KAAK,gBAAgB;EAC3E,KAAK,QAAQ,YAAY,4BAA4B,KAAK,wBAAwB;EAClF,IAAI,CAAC,KAAK,SAAS,WAAW;GAC7B,KAAK,SAAS,KAAK,OAAO;GAC1B,KAAK,SAAS,QAAQ;EACvB;CACD;CAEA,OAAO,OAAgD;EACtD,OAAO,IAAI,aACV,KAAK,UACJ,OAAO,KAAK,qBAAqB,EAAE,GACpC,MAAM,IACN,MAAM,KACN,MAAM,QACN,MAAM,IACP;CACD;CAEA,MAAM,qBAAqB,OAAgC;EAC1D,MAAM,UAAU,KAAK,eAAe,IAAI,KAAK;EAC7C,OAAO,YAAY,KAAA,IAAY,KAAK,aAAa,MAAM;CACxD;CAEA,MAAM,oBAAoB,SAAkC;EAC3D,MAAM,KAAK,QAAQ,KAAK,eAAe,KAAA,GAAW,EAAE,QAAQ,CAAC;EAC7D,MAAM,KAAK,QAAQ,KAAK,kBAAkB,KAAA,GAAW,EAAE,QAAQ,CAAC;EAChE,OAAO;CACR;CAEA,MAAM,cACL,SACA,IACA,KACA,UACgB;EAChB,IAAI;GACH,MAAM,KAAK,QAAQ,KAAK,kBAAkB,KAAA,GAAW,EAAE,QAAQ,CAAC;GAChE,IAAI,KAAK,SAAS;IACjB,MAAM,KAAK,aAAa,OAAO;IAC/B;GACD;GACA,MAAM,SAAS,IAAI,cAAc,KAAK,SAAS,SAAS,IAAI,KAAK,QAAQ;GACzE,KAAK,SAAS,IAAI,IAAI,MAAM;GAC5B,KAAK,SAAS,KAAK,UAAU,MAAM;EACpC,QAAQ;GAEP,MAAM,KAAK,aAAa,OAAO;EAChC;CACD;CAEA,MAAM,aAAa,SAAiB,IAAY,KAA4B;EAC3E,IAAI;EACJ,IAAI;GACH,MAAM,KAAK,QAAQ,KAAK,eAAe,KAAA,GAAW,EAAE,QAAQ,CAAC;GAC7D,MAAM,KAAK,QAAQ,KAAK,kBAAkB,KAAA,GAAW,EAAE,QAAQ,CAAC;GAEhE,MAAM,QAAQ,kBAAkB,MADX,KAAK,QAAQ,KAAK,qBAAqB,KAAA,GAAW,EAAE,QAAQ,CAAC,CAC5C,CAAC,CAAC;GACxC,IAAI,UAAU,KAAA,KAAa,KAAK,SAAS;IACxC,MAAM,KAAK,aAAa,OAAO;IAC/B;GACD;GACA,QAAQ,IAAI,YACX,KAAK,SACL,IACA,SACA,KAAK,SACL,KACA,MAAM,IACN,KAAK,YACL,IACD;GACA,MAAM,MAAM,KAAK,wBAAwB;IACxC,YAAY;IACZ,wBAAwB;IACxB,SAAS;GACV,CAAC;GACD,MAAM,MAAM,KAAK,sCAAsC,EAAE,SAAS,KAAK,CAAC;GACxE,MAAM,MAAM,QAAQ,MAAM;GAC1B,IAAI,KAAK,SAAS;IACjB,MAAM,MAAM,QAAQ;IACpB;GACD;GACA,KAAK,QAAQ,IAAI,IAAI,KAAK;GAC1B,KAAK,SAAS,KAAK,SAAS,KAAK;EAClC,QAAQ;GAEP,IAAI,UAAU,KAAA,GAAW,MAAM,MAAM,QAAQ;QACxC,MAAM,KAAK,aAAa,OAAO;EACrC;CACD;CAEA,MAAM,aAAa,SAAgC;EAClD,MAAM,KAAK,QACT,KAAK,2BAA2B,EAAE,WAAW,QAAQ,CAAC,CAAC,CACvD,YAAY,KAAA,CAAS;CACxB;CAEA,MAAM,aAAa,SAAgC;EAClD,IAAI;GACH,MAAM,KAAK,KAAK,oBAAoB,KAAA,GAAW,EAAE,QAAQ,CAAC;EAC3D,QAAQ,CAER;CACD;CAEA,0BAA0B,UAAiC;EAC1D,IAAI,SAAS,UAAU,KAAK,IAAI,KAAK,YAAY,KAAK,QAAQ;CAC/D;CAEA,eAAe,QAAiD;EAC/D,IAAI,CAAC,SAAS,OAAO,WAAW,KAAK,OAAO,gBAAgB,KAAK,WAAW;EAC5E,KAAK,UAAU;EACf,KAAU,SAAS,CAAC,CAAC,YAAY,KAAA,CAAS;CAC3C;CAEA,YAAY,QAAiD;EAC5D,IAAI,KAAK,YAAY,SAAS,8BAA8B,GAAG;GAC9D,MAAM,QAAQ,OAAO;GACrB,IAAI,SAAS,KAAK,KAAK,UAAU,KAAK,IAAI;IACzC,KAAK,gBAAgB;IACrB,KAAK,aAAa;IAClB;GACD;EACD;EACA,IAAI,KAAK,YAAY,SAAS,qBAAqB,GAAG;GACrD,MAAM,QAAQ,OAAO;GACrB,IAAI,SAAS,KAAK,KAAK,MAAM,UAAU,KAAK,IAAI,KAAK,aAAa;GAClE;EACD;EACA,IACC,KAAK,YAAY,SAAS,qBAAqB,KAC/C,KAAK,YAAY,SAAS,2BAA2B,GAErD,KAAK,aAAa;CAEpB;CAEA,qBAAqB,QAAiD;EACrE,MAAM,QAAQ,OAAO;EACrB,MAAM,SAAS,OAAO;EACtB,IAAI,CAAC,SAAS,KAAK,GAAG;EACtB,KAAK,SAAS,KACb,UACA,IAAI,aACH,KAAK,UACJ,OAAO,KAAK,qBAAqB,EAAE,GACpC,OACA,eACA,SAAS,MAAM,IAAI,SAAS,KAAA,CAC7B,CACD;CACD;CAEA,sBAAsB,QAAiD;EACtE,MAAM,QAAQ,OAAO;EACrB,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,MAAM,KAAK,KAAK,CAAC,SAAS,MAAM,MAAM,GAAG;EAC3E,IAAI,MAAM,UAAU,KAAK,IAAI;GAC5B,KAAK,OAAO,MAAM,MAAM;GACxB,KAAK,SAAS,KAAK,YAAY,MAAM,MAAM;EAC5C;CACD;CAEA,qBAAqB,QAAiD;EACrE,MAAM,QAAQ,OAAO;EACrB,IAAI,CAAC,SAAS,KAAK,GAAG;EACtB,KAAK,eAAe,OAAO,KAAK;EAChC,KAAK,SAAS,KAAK,UAAU,KAAK;CACnC;CAEA,cAAc,QAAiD;EAC9D,MAAM,WAAW,OAAO;EACxB,IACE,aAAa,WACb,aAAa,aACb,aAAa,YACb,aAAa,kBACd,CAAC,SAAS,OAAO,UAAU,GAE3B;EAED,KAAK,SAAS,KACb,UACA,IAAI,cACH,MACA,UACA,OAAO,YACP,SAAS,OAAO,gBAAgB,IAAI,OAAO,mBAAmB,EAC/D,CACD;CACD;CAEA,eAAe,QAAiD;EAC/D,MAAM,UAAU,OAAO;EACvB,MAAM,OAAO,OAAO;EACpB,IAAI,CAAC,UAAU,OAAO,GAAG;EACzB,KAAK,SAAS,KAAK,WAAW,IAAI,mBAAmB,MAAM,SAAS,SAAS,gBAAgB,CAAC;CAC/F;CAEA,eAAe,QAAiD;EAC/D,MAAM,UAAU,2BAA2B,MAAM;EACjD,IAAI,YAAY,KAAA,GAAW,KAAK,SAAS,KAAK,WAAW,OAAO;CACjE;CAEA,aAAa,QAAiD;EAC7D,MAAM,QAAQ,sBAAsB,MAAM;EAC1C,IAAI,UAAU,KAAA,GAAW,KAAK,SAAS,KAAK,SAAS,KAAK;CAC3D;CAEA,eAAqB;EACpB,KAAK,SAAS,KAAK,OAAO;CAC3B;CAEA,gBAAgB,QAAiD;EAChE,MAAM,QAAQ,0BAA0B,MAAM;EAC9C,IAAI,UAAU,KAAA,KAAc,MAAM,UAAU,KAAK,MAAM,CAAC,KAAK,eAAe,IAAI,MAAM,KAAK,GAC1F;EAED,MAAM,WAAW,IAAI,gBACpB,KAAK,SACL,MAAM,IACN,MAAM,KACN,MAAM,MACN,KAAK,UACN;EACA,KAAK,WAAW,IAAI,MAAM,IAAI,QAAQ;EACtC,KAAK,SAAS,KAAK,YAAY,QAAQ;CACxC;CAEA,wBAAwB,QAAiD;EACxE,MAAM,UAAU,6BAA6B,MAAM;EACnD,IAAI,YAAY,KAAA,GAAW;EAC3B,MAAM,CAAC,IAAI,YAAY;EACvB,MAAM,WAAW,KAAK,WAAW,IAAI,EAAE;EACvC,IAAI,aAAa,KAAA,GAAW;EAC5B,SAAS,OAAO,QAAQ;EACxB,IAAI,SAAS,WAAW,WAAW,KAAK,WAAW,OAAO,EAAE;CAC7D;CAEA,gBAAgB,QAAiD;EAChE,MAAM,SAAS,OAAO;EACtB,MAAM,UAAU,OAAO;EACvB,IAAI,CAAC,SAAS,MAAM,KAAK,CAAC,SAAS,OAAO,WAAW,KAAK,CAAC,SAAS,OAAO,GAC1E;EAGD,MAAM,WAAW,OAAO;EACxB,IAAI,aAAa,YAAY,aAAa,oBAAoB,aAAa,iBAAiB;GAC3F,KAAU,cACT,SACA,OAAO,aACP,SAAS,OAAO,MAAM,IAAI,OAAO,SAAS,IAC1C,QACD;GACA;EACD;EACA,IAAI,aAAa,QAAQ;GACxB,KAAU,aACT,SACA,OAAO,aACP,SAAS,OAAO,MAAM,IAAI,OAAO,SAAS,aAC3C;GACA;EACD;EACA,IAAI,aAAa,UAAU;EAE3B,MAAM,QAAQ,OAAO;EACrB,MAAM,UAAU,KAAK,oBAAoB,OAAO;EAChD,KAAK,eAAe,IAAI,OAAO,OAAO;EACtC,KAAK,UAAU,IAAI,SAAS,KAAK;EACjC,QAAa,YAAY;GACxB,IAAI,KAAK,eAAe,IAAI,KAAK,MAAM,SAAS,KAAK,eAAe,OAAO,KAAK;GAChF,IAAI,KAAK,UAAU,IAAI,OAAO,MAAM,OAAO,KAAK,UAAU,OAAO,OAAO;GACxE,KAAU,aAAa,OAAO;EAC/B,CAAC;CACF;CAEA,gBAAgB,QAAiD;EAChE,MAAM,UAAU,OAAO;EACvB,MAAM,SAAS,OAAO;EACtB,IAAI,SAAS,MAAM,GAAG;GACrB,MAAM,SAAS,KAAK,SAAS,IAAI,MAAM;GACvC,IAAI,WAAW,KAAA,GAAW;IACzB,OAAO,OAAO;IACd,KAAK,SAAS,OAAO,MAAM;GAC5B;GACA,MAAM,QAAQ,KAAK,QAAQ,IAAI,MAAM;GACrC,IAAI,UAAU,KAAA,GAAW;IACxB,KAAK,QAAQ,OAAO,MAAM;IAC1B,MAAW,QAAQ,CAAC,CAAC,YAAY,KAAA,CAAS;GAC3C;EACD;EACA,MAAM,QAAQ,SAAS,MAAM,IAC1B,SACA,SAAS,OAAO,IACf,KAAK,UAAU,IAAI,OAAO,IAC1B,KAAA;EACJ,IAAI,UAAU,KAAA,GAAW,KAAK,eAAe,OAAO,KAAK;EACzD,IAAI,SAAS,OAAO,GAAG,KAAK,UAAU,OAAO,OAAO;CACrD;CAEA,kBAAkB,WAA6B,SAAgC;EAC9E,MAAM,YACL,cAAc,WACX,wBACA,cAAc,qBACb,8BACA;EACL,MAAM,WAAW,QAAQ,cAAoB;EAC7C,KAAK,gBAAgB;EACrB,KAAK,cAAc,CAAC,WAAW,8BAA8B;EAC7D,KAAK,eAAe,SAAS;EAC7B,KAAK,cAAc,SAAS;EAC5B,KAAK,aAAa,iBAAiB;GAClC,KAAK,YAAY,IAAI,aAAa,4BAA4B,QAAQ,GAAG,CAAC;EAC3E,GAAG,OAAO;EACV,KAAK,MAAM,SAAS,KAAK,aACxB,KAAK,QAAQ,UAAU,OAAO,KAAK,cAAc,KAAK,UAAU;EAEjE,OAAO,SAAS;CACjB;CAEA,eAAqB;EACpB,MAAM,UAAU,KAAK;EACrB,KAAK,WAAW;EAChB,UAAU;CACX;CAEA,YAAY,OAAsB;EACjC,MAAM,SAAS,KAAK;EACpB,KAAK,WAAW;EAChB,SAAS,KAAK;CACf;CAEA,cAAoB;EACnB,KAAK,YAAY,IAAI,aAAa,sBAAsB,CAAC;CAC1D;CAEA,aAAmB;EAClB,IAAI,KAAK,eAAe,KAAA,GAAW,aAAa,KAAK,UAAU;EAC/D,KAAK,MAAM,SAAS,KAAK,aACxB,KAAK,QAAQ,YAAY,OAAO,KAAK,cAAc,KAAK,UAAU;EAEnE,KAAK,cAAc,CAAC;EACpB,KAAK,aAAa,KAAA;EAClB,KAAK,eAAe,KAAA;EACpB,KAAK,cAAc,KAAA;CACpB;AACD;;;;;;;;;;;;;;;ACr9BA,IAAa,2BAAb,MAAmF;CAClF;CACA;CAEA,YAAY,QAA4B,SAAkB;EACzD,KAAK,UAAU;EACf,KAAK,WAAW;CACjB;CAEA,MAAM,MAAM,aAAgC,QAAgC;EAC3E,MAAM,KAAK,KAAK,aAAa,WAAW,MAAM;CAC/C;CAEA,MAAM,KAAK,aAAgC,QAAgC;EAC1E,MAAM,KAAK,KAAK,aAAa,UAAU,MAAM;CAC9C;CAEA,MAAM,QAAuB;EAC5B,MAAM,SAAkC,CAAC;EACzC,IAAI,KAAK,aAAa,KAAA,GAAW,OAAO,sBAAsB,KAAK;EACnE,MAAM,KAAK,QAAQ,KAAK,4BAA4B,MAAM;CAC3D;CAEA,MAAM,KACL,aACA,SACA,QACgB;EAChB,KAAK,MAAM,QAAQ,aAAa;GAC/B,MAAM,SAAkC;IACvC,YAAY,EAAE,KAAK;IACnB;GACD;GACA,IAAI,WAAW,KAAA,GAAW,OAAO,YAAY;GAC7C,IAAI,KAAK,aAAa,KAAA,GAAW,OAAO,sBAAsB,KAAK;GACnE,MAAM,KAAK,QAAQ,KAAK,yBAAyB,MAAM;EACxD;CACD;AACD;;;;;;;;;;;;;;;ACtBA,IAAa,wBAAb,MAA6E;CAC5E;CACA;CAEA,YAAY,SAAwC,OAA6B;EAChF,KAAK,WAAW;EAChB,KAAK,SAAS;CACf;CAEA,MAAM,MAAM,SAA+D;EAC1E,MAAM,QAAQ,KAAK,OAAO;EAC1B,MAAM,YAAY,SAAS;EAC3B,MAAM,UACL,cAAc,KAAA,IACX,CACA,GAAG,IAAI,IACN,MAAM,KAAK,SAAS,KAAK,QAAQ,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,WAAW,WAAW,KAAA,CAAS,CACpF,CACD,IACC,CAAC,GAAG,IAAI,IAAI,UAAU,KAAK,WAAW,KAAK,UAAU,MAAM,CAAC,CAAC,CAAC;EAClE,MAAM,UAAkC,CAAC;EAEzC,KAAK,MAAM,UAAU,SAAS;GAC7B,MAAM,OAAO,MAAM,MAAM,cAAc,KAAK,QAAQ,UAAU,GAAG,MAAM,MAAM;GAC7E,IAAI,SAAS,KAAA,GACZ,MAAM,IAAI,aAAa,uCAAuC,KAAA,GAAW,EAAE,OAAO,CAAC;GAEpF,QAAQ,KACP,yBAAyB,MAAM,KAAK,SAAS,6BAA6B,CAAC,GAAG,MAAM,CACrF;EACD;EAaA,OAAO;GAAE,UAX8B,MAAM,KAAK,SAAS,QAAQ,EAAA,CAAG,KAAK,YAAY;IACtF,MAAM,OAAO;IACb,OAAO,OAAO;IACd,QAAQ,OAAO;IACf,MAAM,OAAO;IACb,SAAS,OAAO;IAChB,MAAM,OAAO;IACb,QAAQ,OAAO;IACf,GAAI,OAAO,SAAS,KAAA,IAAY,EAAE,MAAM,OAAO,KAAK,IAAI,CAAC;IACzD,GAAI,OAAO,cAAc,KAAA,IAAY,EAAE,WAAW,OAAO,UAAU,IAAI,CAAC;GACzE,EACS;GAAS,SAAS;EAAQ;CACpC;CAEA,MAAM,QAAQ,OAA2C;EACxD,MAAM,QAAQ,KAAK,OAAO;EAC1B,KAAK,MAAM,UAAU,MAAM,SAAS;GACnC,MAAM,aAAa,KAAK,UAAU,OAAO,MAAM;GAE/C,IADa,MAAM,MAAM,cAAc,KAAK,QAAQ,UAAU,GAAG,MAAM,UACnE,MAAS,KAAA,GACZ,MAAM,IAAI,aAAa,uCAAuC,KAAA,GAAW,EACxE,QAAQ,WACT,CAAC;EAEH;EACA,MAAM,KAAK,SAAS,IAAI,MAAM,OAAO;EACrC,KAAK,MAAM,UAAU,MAAM,SAAS;GACnC,MAAM,aAAa,KAAK,UAAU,OAAO,MAAM;GAC/C,MAAM,OAAO,MAAM,MAAM,cAAc,KAAK,QAAQ,UAAU,GAAG,MAAM,UAAU;GACjF,IAAI,SAAS,KAAA,GACZ,MAAM,IAAI,aAAa,6CAA6C,KAAA,GAAW,EAC9E,QAAQ,WACT,CAAC;GAEF,MAAM,KAAK,SAAS,gCAAgC,MAAM,CAAC;EAC5D;CACD;CAEA,MAAM,MAAM,QAAgC;EAC3C,MAAM,KAAK,SAAS,MAAM;EAC1B,MAAM,aAAa,WAAW,KAAA,IAAY,KAAA,IAAY,KAAK,UAAU,MAAM;EAC3E,KAAK,MAAM,QAAQ,KAAK,OAAO,GAAG;GACjC,IAAI,eAAe,KAAA,KAAa,KAAK,QAAQ,KAAK,GAAG,MAAM,YAAY;GACvE,MAAM,KAAK,SAAS,8BAA8B,CAAC;EACpD;CACD;CAEA,QAAQ,OAAmC;EAC1C,MAAM,SAAS,cAAc,IAAI,IAAI,KAAK,CAAC;EAC3C,IAAI,CAAC,OAAO,SAAS,OAAO,KAAA;EAC5B,IAAI,OAAO,MAAM,aAAa,WAAW,OAAO,MAAM,aAAa,UAAU,OAAO,KAAA;EACpF,OAAO,OAAO,MAAM;CACrB;CAEA,UAAU,OAAuB;EAChC,MAAM,SAAS,KAAK,QAAQ,KAAK;EACjC,IAAI,WAAW,KAAA,GACd,MAAM,IAAI,aACT,6DACA,KAAA,GACA,EACC,QAAQ,MACT,CACD;EAED,OAAO;CACR;AACD;;;;;;;;;;;;;;;ACtFA,IAAa,iBAAb,MAA+D;CAC9D;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA,yBAA4C,IAAI,IAAI;CACpD,4BAAgD,IAAI,IAAI;CACxD,WAAuC,IAAI,kBAAkB;CAC7D;CAEA,YACC,QACA,IACA,UACA,QACA,WACA,WACA,SACC;EACD,KAAK,UAAU;EACf,IAAI,aAAa,KAAA,GAAW,wBAAwB,QAAQ;EAC5D,KAAK,MAAM;EACX,KAAK,YAAY;EACjB,KAAK,UAAU;EACf,KAAK,aAAa;EAClB,KAAK,WAAW,IAAI,QAAQ;GAC3B,GAAI,SAAS,OAAO,KAAA,IAAY,EAAE,IAAI,QAAQ,GAAG,IAAI,CAAC;GACtD,GAAI,SAAS,UAAU,KAAA,IAAY,EAAE,OAAO,QAAQ,MAAM,IAAI,CAAC;EAChE,CAAC;EACD,KAAK,WAAW,IAAI,qBAAqB,QAAQ,EAAE;EACnD,KAAK,eAAe,IAAI,yBAAyB,QAAQ,EAAE;EAC3D,KAAK,WAAW,IAAI,sBAAsB,KAAK,gBAAgB,KAAK,MAAM,CAAC;EAC3E,KAAK,aAAa,IAAI,8BAA8B,KAAK,MAAM,GAAG,SAAS;CAC5E;CAEA,IAAI,UAAoD;EACvD,OAAO,KAAK;CACb;CAEA,IAAI,KAAyB;EAC5B,OAAO,KAAK;CACb;CAEA,IAAI,UAAyC;EAC5C,OAAO,KAAK;CACb;CAEA,IAAI,cAAiD;EACpD,OAAO,KAAK;CACb;CAEA,IAAI,UAA0C;EAC7C,OAAO,KAAK;CACb;CAEA,IAAI,YAA8C;EACjD,OAAO,KAAK;CACb;CAEA,KAAK,OAAkD;EACtD,MAAM,IAAI,SAAS;EACnB,MAAM,QAAQ,CAAC,GAAG,KAAK,OAAO,OAAO,CAAC;EACtC,OAAO,KAAK,KAAK,IAAI,MAAM,SAAS,MAAM,KAAK,KAAA;CAChD;CAEA,QAAyC;EACxC,OAAO,CAAC,GAAG,KAAK,OAAO,OAAO,CAAC;CAChC;CAEA,MAAM,OAAO,SAA6D;EACzE,IAAI,KAAK,cAAc,KAAA,GAAW,MAAM,IAAI,aAAa,2BAA2B;EAEpF,MAAM,UAAU,KAAK,QAAQ,OAAO;EACpC,KAAK,UAAU,IAAI,OAAO;EAC1B,IAAI;GACH,OAAO,MAAM;EACd,UAAU;GACT,KAAK,UAAU,OAAO,OAAO;EAC9B;CACD;CAEA,MAAM,KAAK,SAA8C;EACxD,IAAI,SAAS,KAAK,SAAS;EAC3B,OAAO,WAAW,KAAA,GAAW;GAC5B,MAAM;GACN,SAAS,KAAK,SAAS;EACxB;EACA,IAAI,KAAK,cAAc,KAAA,GAAW,MAAM,IAAI,aAAa,2BAA2B;EAEpF,MAAM,KAAK,SAAS,cAAc,KAAK,MAAM,OAAO,CAAC;CACtD;CAEA,UAAyB;EACxB,MAAM,SAAS,KAAK;EACpB,IAAI,WAAW,KAAA,GAAW,OAAO;EAEjC,MAAM,WAAW,KAAK,kBAAkB;EACxC,KAAK,YAAY;EACjB,OAAO;CACR;CAEA,QAAuB;EACtB,MAAM,SAAS,KAAK;EACpB,IAAI,WAAW,KAAA,GAAW,OAAO;EAEjC,MAAM,WAAW,KAAK,gBAAgB;EACtC,KAAK,YAAY;EACjB,OAAO;CACR;CAIA,MAAM,QAAQ,SAAoD;EACjE,IAAI,SAAS,aAAa,KAAA,GAAW,wBAAwB,QAAQ,QAAQ;EAC7E,MAAM,SAAkB,MAAM,KAAK,QAAQ,KAAK,uBAAuB;GACtE,KAAK;GACL,GAAI,KAAK,QAAQ,KAAA,IAAY,CAAC,IAAI,EAAE,kBAAkB,KAAK,IAAI;EAChE,CAAC;EAED,IAAI,CAAC,SAAS,MAAM,KAAK,CAAC,SAAS,OAAO,WAAW,GACpD,MAAM,IAAI,aAAa,qCAAqC;EAG7D,MAAM,WAAW,OAAO;EACxB,IAAI;EAEJ,IAAI;GACH,MAAM,WAAW,SAAS,YAAY,KAAK;GAC3C,OAAO,MAAM,KAAK,QAAQ,UAAU,SAAS,OAAO,eAAe,UAAU,OAAO;GAEpF,IAAI,SAAS,QAAQ,KAAA,KAAa,QAAQ,QAAQ,eACjD,MAAM,KAAK,SAAS,QAAQ,KAAK,EAChC,GAAI,QAAQ,YAAY,KAAA,IAAY,EAAE,SAAS,QAAQ,QAAQ,IAAI,CAAC,EACrE,CAAC;GAEF,IAAI,KAAK,cAAc,KAAA,GACtB,MAAM,IAAI,aAAa,6CAA6C;GAGrE,KAAK,OAAO,IAAI,UAAU,IAAI;GAC9B,KAAK,SAAS,KAAK,QAAQ,IAAI;GAC/B,OAAO;EACR,SAAS,OAAO;GACf,IAAI,SAAS,KAAA,GACZ,MAAM,KAAK,MAAM;QAEjB,MAAM,KAAK,aAAa,QAAQ;GAEjC,MAAM;EACP;CACD;CAEA,MAAM,MAAM,SAA8C;EACzD,MAAM,cAAc,QAAQ,QAAQ,WAAW,OAAO,aAAa,MAAM;EACzE,MAAM,YAAY,IAAI,IAAI,YAAY,KAAK,WAAW,OAAO,EAAE,CAAC;EAEhE,KAAK,MAAM,CAAC,IAAI,SAAS,KAAK,QAAQ;GACrC,IAAI,UAAU,IAAI,EAAE,GAAG;GACvB,MAAM,KAAK,QAAQ;GACnB,KAAK,OAAO,OAAO,EAAE;EACtB;EAEA,KAAK,MAAM,UAAU,aAAa;GACjC,IAAI,KAAK,cAAc,KAAA,KAAa,KAAK,OAAO,IAAI,OAAO,EAAE,GAAG;GAEhE,IAAI;IACH,MAAM,OAAO,MAAM,KAAK,UAAU,OAAO,IAAI,OAAO,KAAK,KAAK,SAAS;IACvE,IAAI,KAAK,cAAc,KAAA,GAAW;KACjC,MAAM,KAAK,QAAQ;KACnB;IACD;IACA,KAAK,OAAO,IAAI,OAAO,IAAI,IAAI;IAC/B,KAAK,SAAS,KAAK,QAAQ,IAAI;GAChC,QAAQ,CAER;EACD;CACD;CAEA,MAAM,QACL,UACA,KACA,UACA,SACuB;EACvB,IAAI;EACJ,IAAI;EAEJ,IAAI;GACH,YAAY,MAAM,KAAK,aAAa,QAAQ;GAC5C,MAAM,KAAK,eAAe,SAAS;GACnC,MAAM,UAAU,MAAM,KAAK,WAAW,SAAS;GAC/C,OAAO,IAAI,YACV,KAAK,SACL,UACA,WACA,KAAK,SACL,KACA,SACA,KAAK,KACL,KAAA,GACA,OACD;GACA,MAAM,KAAK,eAAe,IAAI;GAC9B,MAAM,KAAK,WAAW,OAAO,IAAI;GACjC,IAAI,aAAa,KAAA,GAAW,MAAM,KAAK,eAAe,WAAW,QAAQ;GACzE,KAAK,SAAS,IAAI;GAElB,OAAO;EACR,SAAS,OAAO;GACf,IAAI,SAAS,KAAA,GAAW,MAAM,KAAK,QAAQ,CAAC,CAAC,YAAY,KAAA,CAAS;QAC7D,IAAI,cAAc,KAAA,GAAW,MAAM,KAAK,eAAe,SAAS;GACrE,MAAM;EACP;CACD;CAEA,MAAM,UACL,UACA,KACA,UACuB;EACvB,IAAI;EACJ,IAAI;EAEJ,IAAI;GACH,YAAY,MAAM,KAAK,aAAa,QAAQ;GAC5C,MAAM,KAAK,eAAe,SAAS;GACnC,MAAM,UAAU,MAAM,KAAK,WAAW,SAAS;GAC/C,OAAO,IAAI,YACV,KAAK,SACL,UACA,WACA,KAAK,SACL,KACA,SACA,KAAK,GACN;GACA,MAAM,KAAK,eAAe,IAAI;GAC9B,MAAM,KAAK,WAAW,OAAO,IAAI;GACjC,IAAI,aAAa,KAAA,GAAW,MAAM,KAAK,aAAa,WAAW,QAAQ;GACvE,KAAK,SAAS,IAAI;GAElB,OAAO;EACR,SAAS,OAAO;GACf,IAAI,SAAS,KAAA,GAAW,MAAM,KAAK,QAAQ,CAAC,CAAC,YAAY,KAAA,CAAS;QAC7D,IAAI,cAAc,KAAA,GAAW,MAAM,KAAK,eAAe,SAAS;GACrE,MAAM;EACP;CACD;CAEA,MAAM,oBAAmC;EACxC,IAAI;GACH,MAAM,KAAK,QAAQ;GACnB,MAAM,UAAU,MAAM,sBACrB,GAAG,CAAC,GAAG,KAAK,OAAO,OAAO,CAAC,CAAC,CAAC,KAAK,eAAe,KAAK,QAAQ,CAAC,CAChE;GACA,KAAK,OAAO,MAAM;GAClB,IAAI,YAAY,KAAA,GAAW,MAAM;EAClC,UAAU;GACT,KAAK,QAAQ;EACd;CACD;CAEA,MAAM,kBAAiC;EACtC,IAAI;GACH,MAAM,KAAK,QAAQ;GACnB,IAAI,UAAU,MAAM,sBACnB,GAAG,CAAC,GAAG,KAAK,OAAO,OAAO,CAAC,CAAC,CAAC,KAAK,eAAe,KAAK,MAAM,CAAC,CAC9D;GACA,KAAK,OAAO,MAAM;GAElB,MAAM,KAAK,KAAK;GAChB,IAAI,OAAO,KAAA,GAAW;IACrB,MAAM,UAAU,MAAM,4BACrB,KAAK,QAAQ,KAAK,gCAAgC,EAAE,kBAAkB,GAAG,CAAC,CAC3E;IACA,YAAY;GACb;GACA,IAAI,YAAY,KAAA,GAAW,MAAM;EAClC,UAAU;GACT,KAAK,QAAQ;EACd;CACD;CAEA,MAAM,UAAyB;EAC9B,MAAM,QAAQ,WAAW,CAAC,GAAG,KAAK,SAAS,CAAC;EAC5C,MAAM,KAAK,SAAS,SAAS,YAAY,KAAA,CAAS;CACnD;CAEA,MAAM,aAAa,UAAmC;EACrD,MAAM,SAAkB,MAAM,KAAK,QAAQ,KAAK,yBAAyB;GACxE;GACA,SAAS;EACV,CAAC;EACD,IAAI,CAAC,SAAS,MAAM,KAAK,CAAC,SAAS,OAAO,YAAY,GACrD,MAAM,IAAI,aAAa,oCAAoC;EAE5D,OAAO,OAAO;CACf;CAEA,MAAM,eAAe,WAAkC;EACtD,MAAM,KAAK,QAAQ,KAAK,eAAe,KAAA,GAAW,EAAE,SAAS,UAAU,CAAC;EACxE,MAAM,KAAK,QAAQ,KAAK,kBAAkB,KAAA,GAAW,EAAE,SAAS,UAAU,CAAC;CAC5E;CAEA,MAAM,WAAW,WAAoC;EAEpD,MAAM,QAAQ,kBAAkB,MADX,KAAK,QAAQ,KAAK,qBAAqB,KAAA,GAAW,EAAE,SAAS,UAAU,CAAC,CACvD,CAAC,CAAC;EACxC,IAAI,UAAU,KAAA,GAAW,MAAM,IAAI,aAAa,0CAA0C;EAC1F,OAAO,MAAM;CACd;CAEA,MAAM,eAAe,MAAkC;EACtD,MAAM,KAAK,KAAK,wBAAwB;GACvC,YAAY;GACZ,wBAAwB;GACxB,SAAS;EACV,CAAC;EACD,MAAM,KAAK,KAAK,sCAAsC,EAAE,SAAS,KAAK,CAAC;EACvE,MAAM,WAAoC;GACzC,UACC,KAAK,eAAe,KAAA,IACjB,YACA,KAAK,WAAW,UAAU,OACzB,iBACA;GACL,eAAe;EAChB;EACA,IAAI,KAAK,QAAQ,KAAA,GAAW,SAAS,sBAAsB,KAAK;EAChE,IAAI,KAAK,eAAe,KAAA,GAAW,SAAS,kBAAkB,KAAK,WAAW;EAC9E,MAAM,KAAK,QAAQ,KAAK,+BAA+B,QAAQ;EAC/D,MAAM,KAAK,QAAQ,MAAM;CAC1B;CAEA,MAAM,eAAe,WAAmB,UAA0C;EACjF,MAAM,KAAK,QAAQ,KAClB,sCACA;GACC,OAAO,SAAS;GAChB,QAAQ,SAAS;GACjB,mBAAmB,SAAS,SAAS;GACrC,QAAQ,SAAS,UAAU;GAC3B,mBACC,SAAS,cAAc,KAAA,IACpB,KAAA,IACA;IACA,MAAM,SAAS,YAAY,qBAAqB;IAChD,OAAO,SAAS,YAAY,KAAK;GAClC;EACJ,GACA,EAAE,SAAS,UAAU,CACtB;EACA,MAAM,KAAK,QAAQ,KAClB,sCACA,EAAE,SAAS,SAAS,SAAS,MAAM,GACnC,EAAE,SAAS,UAAU,CACtB;CACD;CAEA,MAAM,aAAa,WAAmB,UAA0C;EAC/E,IAAI;GACH,MAAM,KAAK,eAAe,WAAW,QAAQ;EAC9C,QAAQ,CAER;CACD;CAEA,MAAM,aAAa,UAAiC;EACnD,IAAI;GACH,MAAM,KAAK,QAAQ,KAAK,sBAAsB,EAAE,SAAS,CAAC;EAC3D,QAAQ,CAER;CACD;CAEA,MAAM,eAAe,WAAkC;EACtD,IAAI;GACH,MAAM,KAAK,QAAQ,KAAK,2BAA2B,EAAE,UAAU,CAAC;EACjE,QAAQ,CAER;CACD;CAEA,SAAS,MAAyB;EACjC,KAAK,QAAQ,GAAG,UAAU,UAAU;GACnC,IAAI,KAAK,cAAc,KAAA,GAAW;IACjC,MAAW,QAAQ,CAAC,CAAC,YAAY,KAAA,CAAS;IAC1C;GACD;GACA,IAAI,WAAW,WAAW,CAAC,CAAC,KAAK,GAAG;IACnC,KAAU,YAAY,KAAK;IAC3B;GACD;GACA,KAAK,SAAS,KAAK,QAAQ,KAAK;EACjC,CAAC;EACD,KAAK,QAAQ,GAAG,eAAe;GAC9B,IAAI,KAAK,OAAO,IAAI,KAAK,MAAM,MAAM,MAAM,KAAK,OAAO,OAAO,KAAK,MAAM;EAC1E,CAAC;CACF;CAEA,MAAM,YAAY,OAAmC;EACpD,IAAI;GACH,MAAM,KAAK,WAAW,OAAO,KAAK;GAClC,IAAI,KAAK,cAAc,KAAA,GAAW;IACjC,MAAM,MAAM,QAAQ;IACpB;GACD;GACA,KAAK,OAAO,IAAI,MAAM,QAAQ,KAAK;GACnC,KAAK,SAAS,KAAK;GACnB,KAAK,SAAS,KAAK,QAAQ,KAAK;EACjC,QAAQ;GACP,MAAM,MAAM,QAAQ,CAAC,CAAC,YAAY,KAAA,CAAS;EAC5C;CACD;CAEA,UAAgB;EACf,IAAI,KAAK,SAAS,WAAW;EAC7B,KAAK,SAAS,KAAK,OAAO;EAC1B,KAAK,SAAS,QAAQ;CACvB;AACD;;;;;;;;;;;;;;;;;AC9bA,SAAgB,gBAAgB,SAA+C;CAC9E,OAAO,IAAI,UAAU,OAAO;AAC7B;;;;;;;;;;;;;;;AAgBA,SAAgB,sBAAsB,OAAuD;CAC5F,OAAO,IAAI,gBAAgB,KAAK;AACjC"}
|