@tokentestai/ais 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.en.md +238 -0
- package/README.fr.md +238 -0
- package/README.ja.md +234 -0
- package/README.ko.md +234 -0
- package/README.md +234 -0
- package/dist/chunk-WVTDLVUU.js +1400 -0
- package/dist/chunk-WVTDLVUU.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +6145 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +547 -0
- package/dist/index.js +5784 -0
- package/dist/index.js.map +1 -0
- package/dist/postinstall.d.ts +27 -0
- package/dist/postinstall.js +54 -0
- package/dist/postinstall.js.map +1 -0
- package/package.json +62 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/package-info.ts","../src/ais/state.ts","../src/vault/types.ts","../src/automation/state.ts","../src/automation/model.ts","../src/ais-runtime.ts","../src/detector/context-detector.ts","../src/detector/entropy-detector.ts","../src/detector/pattern-detector.ts","../src/detector/combined-detector.ts","../src/interceptor/stream-replacer.ts","../src/interceptor/bidirectional.ts","../src/pty/wrapper.ts","../src/proxy/environment.ts","../src/proxy/server.ts","../src/proxy/responses-compat.ts","../src/proxy/websocket-relay.ts","../src/storage/encrypted-vault.ts","../src/storage/keychain.ts","../src/storage/storage-manager.ts","../src/vault/session-vault.ts","../src/config.ts","../src/protect/index.ts"],"sourcesContent":["import { readFileSync } from 'node:fs';\n\nexport interface PackageInfo {\n name: string;\n version: string;\n}\n\nlet cachedPackageInfo: PackageInfo | undefined;\n\nexport function getPackageInfo(): PackageInfo {\n if (cachedPackageInfo) {\n return cachedPackageInfo;\n }\n\n cachedPackageInfo = readPackageInfo();\n return cachedPackageInfo;\n}\n\nexport const PACKAGE_NAME = getPackageInfo().name;\nexport const VERSION = getPackageInfo().version;\n\nfunction readPackageInfo(): PackageInfo {\n let parsed: unknown;\n\n try {\n parsed = JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf8'));\n } catch (error) {\n throw new Error(`Failed to load package info: ${toErrorMessage(error)}`);\n }\n\n if (!isRecord(parsed)) {\n throw new Error('Failed to load package info: package.json root must be an object');\n }\n\n return {\n name: expectString(parsed.name, 'name'),\n version: expectString(parsed.version, 'version'),\n };\n}\n\nfunction expectString(value: unknown, key: string): string {\n if (typeof value !== 'string' || value.trim().length === 0) {\n throw new Error(`Failed to load package info: package.json ${key} must be a non-empty string`);\n }\n\n return value;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction toErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n","import { createHash } from 'node:crypto';\nimport { chmodSync, existsSync } from 'node:fs';\nimport { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { dirname, join } from 'node:path';\n\nimport {\n isSecretSource,\n isSecretType,\n type SecretSource,\n type SecretType,\n} from '../vault/types.js';\n\nconst STATE_FILE_MODE = 0o600;\n\nexport const DEFAULT_AIS_STATE_PATH_DISPLAY = '~/.ais/ais-state.json';\n\nexport interface AisRecentRecord {\n id: string;\n createdAt: number;\n lastSeenAt: number;\n name?: string;\n preview: string;\n seenCount: number;\n source: SecretSource;\n type: SecretType;\n}\n\nexport interface AisState {\n excludedRecordIds: string[];\n excludedTypes: SecretType[];\n recentRecords: AisRecentRecord[];\n}\n\nexport interface AisStoreOptions {\n path?: string;\n recentLimit?: number;\n}\n\nexport interface RecordSecretOptions {\n name?: string;\n source: SecretSource;\n timestamp?: number;\n}\n\nexport function createDefaultAisState(): AisState {\n return {\n excludedRecordIds: [],\n excludedTypes: [],\n recentRecords: [],\n };\n}\n\nexport function buildAisRecordId(secret: string): string {\n return createHash('sha256').update(secret).digest('hex').slice(0, 12);\n}\n\nexport function resolveAisStatePath(path?: string): string {\n return expandHomePath(path ?? DEFAULT_AIS_STATE_PATH_DISPLAY);\n}\n\nexport class AisStore {\n private dirty = false;\n private loaded = false;\n private state = createDefaultAisState();\n\n constructor(private readonly options: AisStoreOptions = {}) {}\n\n async load(): Promise<AisState> {\n if (this.loaded) {\n return this.getState();\n }\n\n const statePath = this.getPath();\n if (!existsSync(statePath)) {\n this.loaded = true;\n return this.getState();\n }\n\n let parsed: unknown;\n\n try {\n parsed = JSON.parse(await readFile(statePath, 'utf8'));\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to load AIS state: ${message}`);\n }\n\n this.state = mergeAisState(parsed);\n this.loaded = true;\n return this.getState();\n }\n\n async save(): Promise<void> {\n if (!this.loaded || !this.dirty) {\n return;\n }\n\n const statePath = this.getPath();\n const payload = `${JSON.stringify(this.state, null, 2)}\\n`;\n await mkdir(dirname(statePath), { recursive: true });\n await writeFile(statePath, payload, { mode: STATE_FILE_MODE });\n chmodSync(statePath, STATE_FILE_MODE);\n this.dirty = false;\n }\n\n getPath(): string {\n return resolveAisStatePath(this.options.path);\n }\n\n getState(): AisState {\n return {\n excludedRecordIds: [...this.state.excludedRecordIds],\n excludedTypes: [...this.state.excludedTypes],\n recentRecords: this.state.recentRecords.map((record) => ({ ...record })),\n };\n }\n\n isExcluded(secret: string, type: SecretType): boolean {\n this.assertLoaded();\n return this.state.excludedTypes.includes(type) || this.state.excludedRecordIds.includes(buildAisRecordId(secret));\n }\n\n recordSecret(secret: string, type: SecretType, options: RecordSecretOptions): AisRecentRecord {\n this.assertLoaded();\n const id = buildAisRecordId(secret);\n const timestamp = options.timestamp ?? Date.now();\n const preview = buildPreview(secret);\n const existing = this.state.recentRecords.find((record) => record.id === id);\n\n if (existing) {\n existing.lastSeenAt = timestamp;\n existing.seenCount += 1;\n existing.type = type;\n existing.source = options.source;\n existing.preview = preview;\n existing.name = normalizeName(options.name) ?? existing.name;\n this.sortRecentRecords();\n this.dirty = true;\n return { ...existing };\n }\n\n const record: AisRecentRecord = {\n id,\n createdAt: timestamp,\n lastSeenAt: timestamp,\n name: normalizeName(options.name),\n preview,\n seenCount: 1,\n source: options.source,\n type,\n };\n this.state.recentRecords.unshift(record);\n this.trimRecentRecords();\n this.sortRecentRecords();\n this.dirty = true;\n return { ...record };\n }\n\n setRecordExcluded(id: string, excluded: boolean): boolean {\n this.assertLoaded();\n const normalizedId = id.trim();\n if (!this.state.recentRecords.some((record) => record.id === normalizedId)) {\n return false;\n }\n\n const nextIds = new Set(this.state.excludedRecordIds);\n const hadValue = nextIds.has(normalizedId);\n if (excluded) {\n nextIds.add(normalizedId);\n } else {\n nextIds.delete(normalizedId);\n }\n\n if (hadValue === excluded) {\n return true;\n }\n\n this.state.excludedRecordIds = Array.from(nextIds).sort();\n this.dirty = true;\n return true;\n }\n\n setTypeExcluded(type: SecretType, excluded: boolean): void {\n this.assertLoaded();\n const nextTypes = new Set(this.state.excludedTypes);\n const hadValue = nextTypes.has(type);\n if (excluded) {\n nextTypes.add(type);\n } else {\n nextTypes.delete(type);\n }\n\n if (hadValue === excluded) {\n return;\n }\n\n this.state.excludedTypes = Array.from(nextTypes).sort();\n this.dirty = true;\n }\n\n private assertLoaded(): void {\n if (!this.loaded) {\n throw new Error('AIS state must be loaded before use.');\n }\n }\n\n private sortRecentRecords(): void {\n this.state.recentRecords.sort((left, right) => right.lastSeenAt - left.lastSeenAt);\n }\n\n private trimRecentRecords(): void {\n const recentLimit = Math.max(1, this.options.recentLimit ?? 20);\n if (this.state.recentRecords.length > recentLimit) {\n this.state.recentRecords.length = recentLimit;\n }\n }\n}\n\nfunction buildPreview(secret: string): string {\n const singleLine = secret.replace(/\\s+/g, ' ').trim();\n if (singleLine.length <= 6) {\n return `${singleLine.slice(0, 1)}***${singleLine.slice(-1)}`;\n }\n\n if (singleLine.length <= 12) {\n return `${singleLine.slice(0, 2)}***${singleLine.slice(-2)}`;\n }\n\n return `${singleLine.slice(0, 4)}***${singleLine.slice(-4)}`;\n}\n\nfunction mergeAisState(raw: unknown): AisState {\n if (!isRecord(raw)) {\n throw new Error('Failed to load AIS state: root must be an object');\n }\n\n const state = createDefaultAisState();\n\n if ('excludedRecordIds' in raw) {\n if (!Array.isArray(raw.excludedRecordIds) || !raw.excludedRecordIds.every((value) => typeof value === 'string')) {\n throw new Error('Failed to load AIS state: excludedRecordIds must be a string array');\n }\n\n state.excludedRecordIds = raw.excludedRecordIds.map((value) => value.trim()).filter(Boolean);\n }\n\n if ('excludedTypes' in raw) {\n if (!Array.isArray(raw.excludedTypes) || !raw.excludedTypes.every(isSecretType)) {\n throw new Error('Failed to load AIS state: excludedTypes must contain valid secret types');\n }\n\n state.excludedTypes = [...raw.excludedTypes];\n }\n\n if ('recentRecords' in raw) {\n if (!Array.isArray(raw.recentRecords)) {\n throw new Error('Failed to load AIS state: recentRecords must be an array');\n }\n\n state.recentRecords = raw.recentRecords.map((value, index) => parseRecentRecord(value, index));\n }\n\n return state;\n}\n\nfunction parseRecentRecord(value: unknown, index: number): AisRecentRecord {\n if (!isRecord(value)) {\n throw new Error(`Failed to load AIS state: recentRecords[${index}] must be an object`);\n }\n\n const id = expectString(value.id, `recentRecords[${index}].id`);\n const createdAt = expectNumber(value.createdAt, `recentRecords[${index}].createdAt`);\n const lastSeenAt = expectNumber(value.lastSeenAt, `recentRecords[${index}].lastSeenAt`);\n const preview = expectString(value.preview, `recentRecords[${index}].preview`);\n const seenCount = expectNumber(value.seenCount, `recentRecords[${index}].seenCount`);\n const source = expectSecretSource(value.source, `recentRecords[${index}].source`);\n const type = expectSecretType(value.type, `recentRecords[${index}].type`);\n\n return {\n id,\n createdAt,\n lastSeenAt,\n name: normalizeName(expectOptionalString(value.name, `recentRecords[${index}].name`)),\n preview,\n seenCount,\n source,\n type,\n };\n}\n\nfunction expectNumber(value: unknown, path: string): number {\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n throw new Error(`Failed to load AIS state: ${path} must be a finite number`);\n }\n\n return value;\n}\n\nfunction expectOptionalString(value: unknown, path: string): string | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n return expectString(value, path);\n}\n\nfunction expectSecretSource(value: unknown, path: string): SecretSource {\n if (!isSecretSource(value)) {\n throw new Error(`Failed to load AIS state: ${path} must be a valid source`);\n }\n\n return value;\n}\n\nfunction expectSecretType(value: unknown, path: string): SecretType {\n if (!isSecretType(value)) {\n throw new Error(`Failed to load AIS state: ${path} must be a valid type`);\n }\n\n return value;\n}\n\nfunction expectString(value: unknown, path: string): string {\n if (typeof value !== 'string') {\n throw new Error(`Failed to load AIS state: ${path} must be a string`);\n }\n\n return value;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction normalizeName(name: string | undefined): string | undefined {\n if (name === undefined) {\n return undefined;\n }\n\n const trimmed = name.trim();\n return trimmed.length === 0 ? undefined : trimmed;\n}\n\nexport function getDefaultAisStatePath(baseDirectory = '~/.ais'): string {\n return join(baseDirectory, 'ais-state.json');\n}\n\nfunction expandHomePath(path: string): string {\n if (path === '~') {\n return homedir();\n }\n\n if (path.startsWith('~/')) {\n return join(homedir(), path.slice(2));\n }\n\n return path;\n}\n","export const SECRET_TYPES = [\n 'PASSWORD',\n 'APIKEY',\n 'DBCONN',\n 'PRIVATE_KEY',\n 'BEARER_TOKEN',\n 'JWT',\n 'GENERIC',\n] as const;\n\nexport type SecretType = (typeof SECRET_TYPES)[number];\n\nexport const SECRET_SOURCES = ['manual', 'argv', 'stdin', 'proxy'] as const;\n\nexport type SecretSource = (typeof SECRET_SOURCES)[number];\n\nexport interface VaultEntry {\n token: string;\n secret: string;\n type: SecretType;\n createdAt: number;\n hitCount: number;\n name?: string;\n source?: SecretSource;\n}\n\nexport type TokenGenerator = (\n secret: string,\n type: SecretType,\n sessionId: string,\n) => string;\n\nexport function isSecretType(value: unknown): value is SecretType {\n return typeof value === 'string' && SECRET_TYPES.includes(value as SecretType);\n}\n\nexport function isSecretSource(value: unknown): value is SecretSource {\n return typeof value === 'string' && SECRET_SOURCES.includes(value as SecretSource);\n}\n","import { chmodSync, existsSync } from 'node:fs';\nimport { mkdir, readFile, rename, writeFile } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { dirname, join } from 'node:path';\n\nimport {\n PROTECT_TOOLS,\n isProtectTool,\n isUpdateChannel,\n type ProtectTool,\n type UpdateChannel,\n} from './model.js';\n\nconst STATE_FILE_MODE = 0o600;\n\nexport const DEFAULT_AUTOMATION_STATE_PATH_DISPLAY = '~/.ais/automation-state.json';\n\nexport type UpdateCheckResult =\n | 'available'\n | 'failed'\n | 'never'\n | 'skipped'\n | 'up-to-date'\n | 'updated';\n\nexport interface ProtectToolRuntimeState {\n backupPath?: string;\n installed: boolean;\n lastChangedAt?: number;\n lastError?: string;\n managedPath?: string;\n originalCommandPath?: string;\n suspended: boolean;\n}\n\nexport interface AutomationState {\n protect: {\n tools: Record<ProtectTool, ProtectToolRuntimeState>;\n };\n update: {\n lastChannel?: UpdateChannel;\n lastCheckedAt?: number;\n lastError?: string;\n lastLocalVersion?: string;\n lastRemoteVersion?: string;\n lastResult: UpdateCheckResult;\n skipNextCheck: boolean;\n };\n}\n\nexport interface LoadedAutomationState {\n exists: boolean;\n path: string;\n recoveredFrom?: string;\n recoveryReason?: string;\n state: AutomationState;\n}\n\nexport function createDefaultAutomationState(): AutomationState {\n return {\n protect: {\n tools: Object.fromEntries(\n PROTECT_TOOLS.map((tool) => [tool, createDefaultProtectToolRuntimeState()]),\n ) as Record<ProtectTool, ProtectToolRuntimeState>,\n },\n update: {\n lastResult: 'never',\n skipNextCheck: false,\n },\n };\n}\n\nexport function createDefaultProtectToolRuntimeState(): ProtectToolRuntimeState {\n return {\n installed: false,\n suspended: false,\n };\n}\n\nexport function resolveAutomationStatePath(path?: string): string {\n return expandHomePath(path ?? DEFAULT_AUTOMATION_STATE_PATH_DISPLAY);\n}\n\nexport async function loadAutomationState(path?: string): Promise<LoadedAutomationState> {\n const resolvedPath = resolveAutomationStatePath(path);\n\n if (!existsSync(resolvedPath)) {\n return {\n exists: false,\n path: resolvedPath,\n state: createDefaultAutomationState(),\n };\n }\n\n let parsed: unknown;\n\n try {\n parsed = JSON.parse(await readFile(resolvedPath, 'utf8'));\n } catch (error) {\n return recoverAutomationState(resolvedPath, error);\n }\n\n try {\n return {\n exists: true,\n path: resolvedPath,\n state: mergeAutomationState(parsed),\n };\n } catch (error) {\n return recoverAutomationState(resolvedPath, error);\n }\n}\n\nexport async function saveAutomationState(state: AutomationState, path?: string): Promise<void> {\n const resolvedPath = resolveAutomationStatePath(path);\n const payload = `${JSON.stringify(state, null, 2)}\\n`;\n\n await mkdir(dirname(resolvedPath), { recursive: true });\n await writeFile(resolvedPath, payload, { mode: STATE_FILE_MODE });\n chmodSync(resolvedPath, STATE_FILE_MODE);\n}\n\nexport function clearProtectRuntimeState(\n state: AutomationState,\n tool?: ProtectTool,\n now = Date.now(),\n): AutomationState {\n const next = cloneAutomationState(state);\n const targets = tool ? [tool] : PROTECT_TOOLS;\n\n for (const currentTool of targets) {\n next.protect.tools[currentTool] = {\n ...createDefaultProtectToolRuntimeState(),\n lastChangedAt: now,\n };\n }\n\n return next;\n}\n\nexport function cloneAutomationState(state: AutomationState): AutomationState {\n return {\n protect: {\n tools: Object.fromEntries(\n PROTECT_TOOLS.map((tool) => [\n tool,\n {\n ...state.protect.tools[tool],\n },\n ]),\n ) as Record<ProtectTool, ProtectToolRuntimeState>,\n },\n update: {\n ...state.update,\n },\n };\n}\n\nfunction mergeAutomationState(raw: unknown): AutomationState {\n if (!isRecord(raw)) {\n throw new Error('Failed to load automation state: root must be an object');\n }\n\n const state = createDefaultAutomationState();\n\n if ('update' in raw) {\n const update = expectObject(raw.update, 'update');\n\n if ('lastResult' in update) {\n state.update.lastResult = expectUpdateCheckResult(update.lastResult, 'update.lastResult');\n }\n\n if ('skipNextCheck' in update) {\n state.update.skipNextCheck = expectBoolean(update.skipNextCheck, 'update.skipNextCheck');\n }\n\n if ('lastCheckedAt' in update) {\n state.update.lastCheckedAt = expectOptionalFiniteNumber(update.lastCheckedAt, 'update.lastCheckedAt');\n }\n\n if ('lastChannel' in update) {\n state.update.lastChannel = expectOptionalUpdateChannel(update.lastChannel, 'update.lastChannel');\n }\n\n if ('lastLocalVersion' in update) {\n state.update.lastLocalVersion = expectOptionalString(update.lastLocalVersion, 'update.lastLocalVersion');\n }\n\n if ('lastRemoteVersion' in update) {\n state.update.lastRemoteVersion = expectOptionalString(update.lastRemoteVersion, 'update.lastRemoteVersion');\n }\n\n if ('lastError' in update) {\n state.update.lastError = expectOptionalString(update.lastError, 'update.lastError');\n }\n }\n\n if ('protect' in raw) {\n const protect = expectObject(raw.protect, 'protect');\n if ('tools' in protect) {\n const tools = expectObject(protect.tools, 'protect.tools');\n for (const [key, value] of Object.entries(tools)) {\n if (!isProtectTool(key)) {\n throw new Error(`Failed to load automation state: protect.tools.${key} is not supported`);\n }\n\n state.protect.tools[key] = parseProtectToolRuntimeState(value, `protect.tools.${key}`);\n }\n }\n }\n\n return state;\n}\n\nfunction parseProtectToolRuntimeState(value: unknown, path: string): ProtectToolRuntimeState {\n const toolState = expectObject(value, path);\n const parsed = createDefaultProtectToolRuntimeState();\n\n if ('installed' in toolState) {\n parsed.installed = expectBoolean(toolState.installed, `${path}.installed`);\n }\n\n if ('suspended' in toolState) {\n parsed.suspended = expectBoolean(toolState.suspended, `${path}.suspended`);\n }\n\n if ('managedPath' in toolState) {\n parsed.managedPath = expectOptionalString(toolState.managedPath, `${path}.managedPath`);\n }\n\n if ('backupPath' in toolState) {\n parsed.backupPath = expectOptionalString(toolState.backupPath, `${path}.backupPath`);\n }\n\n if ('originalCommandPath' in toolState) {\n parsed.originalCommandPath = expectOptionalString(\n toolState.originalCommandPath,\n `${path}.originalCommandPath`,\n );\n }\n\n if ('lastError' in toolState) {\n parsed.lastError = expectOptionalString(toolState.lastError, `${path}.lastError`);\n }\n\n if ('lastChangedAt' in toolState) {\n parsed.lastChangedAt = expectOptionalFiniteNumber(toolState.lastChangedAt, `${path}.lastChangedAt`);\n }\n\n return parsed;\n}\n\nasync function recoverAutomationState(path: string, error: unknown): Promise<LoadedAutomationState> {\n const message = error instanceof Error ? error.message : String(error);\n const backupPath = `${path}.corrupt-${Date.now()}`;\n\n let recoveredFrom: string | undefined;\n try {\n await rename(path, backupPath);\n recoveredFrom = backupPath;\n } catch {\n recoveredFrom = path;\n }\n\n return {\n exists: false,\n path,\n recoveredFrom,\n recoveryReason: message,\n state: createDefaultAutomationState(),\n };\n}\n\nfunction expectUpdateCheckResult(value: unknown, path: string): UpdateCheckResult {\n if (\n value !== 'available' &&\n value !== 'failed' &&\n value !== 'never' &&\n value !== 'skipped' &&\n value !== 'up-to-date' &&\n value !== 'updated'\n ) {\n throw new Error(`Failed to load automation state: ${path} must be a valid update result`);\n }\n\n return value;\n}\n\nfunction expectBoolean(value: unknown, path: string): boolean {\n if (typeof value !== 'boolean') {\n throw new Error(`Failed to load automation state: ${path} must be a boolean`);\n }\n\n return value;\n}\n\nfunction expectObject(value: unknown, path: string): Record<string, unknown> {\n if (!isRecord(value)) {\n throw new Error(`Failed to load automation state: ${path} must be an object`);\n }\n\n return value;\n}\n\nfunction expectOptionalFiniteNumber(value: unknown, path: string): number | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n throw new Error(`Failed to load automation state: ${path} must be a finite number`);\n }\n\n return value;\n}\n\nfunction expectOptionalString(value: unknown, path: string): string | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (typeof value !== 'string') {\n throw new Error(`Failed to load automation state: ${path} must be a string`);\n }\n\n return value;\n}\n\nfunction expectOptionalUpdateChannel(value: unknown, path: string): UpdateChannel | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (typeof value !== 'string' || !isUpdateChannel(value)) {\n throw new Error(`Failed to load automation state: ${path} must be one of ${UPDATE_CHANNELS_LABEL}`);\n }\n\n return value;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction expandHomePath(path: string): string {\n if (path === '~') {\n return homedir();\n }\n\n if (path.startsWith('~/')) {\n return join(homedir(), path.slice(2));\n }\n\n return path;\n}\n\nconst UPDATE_CHANNELS_LABEL = 'latest, next';\n","export const PROTECT_TOOLS = ['claude', 'codex', 'openclaw'] as const;\nexport const UPDATE_CHANNELS = ['latest', 'next'] as const;\n\nexport type ProtectTool = (typeof PROTECT_TOOLS)[number];\nexport type UpdateChannel = (typeof UPDATE_CHANNELS)[number];\n\nexport function isProtectTool(value: string): value is ProtectTool {\n return PROTECT_TOOLS.includes(value as ProtectTool);\n}\n\nexport function isUpdateChannel(value: string): value is UpdateChannel {\n return UPDATE_CHANNELS.includes(value as UpdateChannel);\n}\n","import { appendFileSync, mkdirSync } from 'node:fs';\nimport { dirname } from 'node:path';\n\nimport { AisStore, type AisStoreOptions } from './ais/index.js';\nimport type { AutomationState, ProtectTool, UpdateChannel } from './automation/index.js';\nimport { CombinedDetector, type CombinedDetectorOptions } from './detector/index.js';\nimport { BidirectionalInterceptor } from './interceptor/bidirectional.js';\nimport { createPtyWrapper, type PtyWrapperOptions } from './pty/wrapper.js';\nimport {\n buildProxyEnvironment,\n getDefaultProxyTargets,\n ProxyServer,\n type ProxyOptions,\n} from './proxy/index.js';\nimport { StorageManager, type StorageManagerOptions } from './storage/index.js';\nimport { SessionVault, type SessionVaultOptions } from './vault/session-vault.js';\nimport type { SecretType } from './vault/types.js';\n\nconst DEFAULT_DETECTION_WINDOW = 4096;\nconst VAULT_TOKEN_PATTERN = /__VAULT_[A-Z_]+_[0-9a-f]{8,9}__/g;\n\nfunction toErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\ninterface ReplacementRule {\n source: string;\n target: string;\n}\n\ninterface PlainAnsiView {\n consumedRawLength: number;\n ends: number[];\n plain: string;\n starts: number[];\n}\n\ninterface ReplacementMatch {\n end: number;\n replacement: string;\n start: number;\n}\n\ninterface RestoreResult {\n output: string;\n replacements: number;\n}\n\ninterface RegisteredSecretResult {\n created: boolean;\n token: string;\n}\n\nexport interface RegisterSecretValueOptions {\n name?: string;\n}\n\nexport interface AisStats {\n detectedSecrets: number;\n maskedInputs: number;\n proxyEnabled: boolean;\n proxyPort: number | null;\n registeredSecrets: number;\n restoredOutputs: number;\n}\n\nexport interface AisRuntimeOptions {\n ais?: (AisStoreOptions & { store?: AisStore }) | false;\n automation?: {\n path: string;\n protect: {\n enabled: boolean;\n tools: Record<ProtectTool, boolean>;\n };\n state: AutomationState;\n update: {\n channel: UpdateChannel;\n checkIntervalMinutes: number;\n enabled: boolean;\n silent: boolean;\n skipCheck: boolean;\n };\n };\n cwd?: string;\n debug?: boolean;\n detectionWindow?: number;\n detector?: CombinedDetectorOptions;\n dryRun?: boolean;\n env?: NodeJS.ProcessEnv;\n logFile?: string;\n proxy?: Omit<ProxyOptions, 'vault'>;\n storage?: (StorageManagerOptions & { manager?: StorageManager }) | false;\n stdin?: PtyWrapperOptions['stdin'];\n stdout?: PtyWrapperOptions['stdout'];\n vault?: SessionVaultOptions;\n}\n\nfunction sortReplacementRules(rules: ReplacementRule[]): ReplacementRule[] {\n return rules.sort((left, right) => {\n if (right.source.length !== left.source.length) {\n return right.source.length - left.source.length;\n }\n\n return left.source.localeCompare(right.source);\n });\n}\n\nfunction buildPrefixes(sources: string[]): Set<string> {\n return new Set(\n sources.flatMap((source) =>\n Array.from({ length: Math.max(0, source.length - 1) }, (_, index) => source.slice(0, index + 1)),\n ),\n );\n}\n\nfunction redactSecret(secret: string): string {\n if (secret.length <= 3) {\n return `${secret.slice(0, 1)}***`;\n }\n\n return `${secret.slice(0, 6)}***`;\n}\n\nfunction parseAnsiView(input: string): PlainAnsiView {\n let cursor = 0;\n let plain = '';\n const starts: number[] = [];\n const ends: number[] = [];\n\n while (cursor < input.length) {\n if (input[cursor] !== '\\x1b') {\n starts.push(cursor);\n plain += input[cursor];\n cursor += 1;\n ends.push(cursor);\n continue;\n }\n\n const ansiLength = readAnsiEscapeLength(input, cursor);\n if (ansiLength === 0) {\n break;\n }\n\n cursor += ansiLength;\n }\n\n return {\n plain,\n starts,\n ends,\n consumedRawLength: cursor,\n };\n}\n\nfunction readAnsiEscapeLength(input: string, start: number): number {\n if (input[start] !== '\\x1b' || input[start + 1] !== '[') {\n return 0;\n }\n\n for (let cursor = start + 2; cursor < input.length; cursor += 1) {\n const code = input.charCodeAt(cursor);\n if (code >= 0x40 && code <= 0x7e) {\n return cursor - start + 1;\n }\n }\n\n return 0;\n}\n\nfunction findReplacementMatches(input: string, rules: ReplacementRule[]): ReplacementMatch[] {\n const matches: ReplacementMatch[] = [];\n let cursor = 0;\n\n while (cursor < input.length) {\n const matchedRule = rules.find((rule) => input.startsWith(rule.source, cursor));\n if (!matchedRule) {\n cursor += 1;\n continue;\n }\n\n matches.push({\n start: cursor,\n end: cursor + matchedRule.source.length,\n replacement: matchedRule.target,\n });\n cursor += matchedRule.source.length;\n }\n\n return matches;\n}\n\nfunction replaceKnownValues(input: string, rules: ReplacementRule[]): RestoreResult {\n if (rules.length === 0 || input.length === 0) {\n return { output: input, replacements: 0 };\n }\n\n let output = input;\n let replacements = 0;\n\n for (const rule of rules) {\n let nextOutput = '';\n let lastIndex = 0;\n let matched = false;\n let matchIndex = output.indexOf(rule.source);\n\n while (matchIndex !== -1) {\n matched = true;\n replacements += 1;\n nextOutput += output.slice(lastIndex, matchIndex);\n nextOutput += rule.target;\n lastIndex = matchIndex + rule.source.length;\n matchIndex = output.indexOf(rule.source, lastIndex);\n }\n\n if (matched) {\n nextOutput += output.slice(lastIndex);\n output = nextOutput;\n }\n }\n\n return { output, replacements };\n}\n\nexport function stripVaultArtifacts(input: string): string {\n const sanitized = input.replace(VAULT_TOKEN_PATTERN, '');\n const trailingVaultPrefix = sanitized.lastIndexOf('__VAULT_');\n if (trailingVaultPrefix === -1) {\n return sanitized;\n }\n\n return sanitized.slice(0, trailingVaultPrefix);\n}\n\nfunction normalizeProxyDetectionInput(input: string): string {\n return input\n .replaceAll('\\\\r', '\\r')\n .replaceAll('\\\\n', '\\n')\n .replaceAll('\\\\\"', '\"')\n .replaceAll('\\\\\\\\', '\\\\');\n}\n\nclass StdoutRestorer {\n private buffer = '';\n private prefixes = new Set<string>();\n private rules: ReplacementRule[] = [];\n private syncedRevision = -1;\n\n constructor(private readonly vault: SessionVault) {}\n\n push(chunk: string): RestoreResult {\n this.syncRules();\n\n const input = this.buffer + chunk;\n const view = parseAnsiView(input);\n const processableRaw = input.slice(0, view.consumedRawLength);\n const trailingRaw = input.slice(view.consumedRawLength);\n\n if (this.rules.length === 0) {\n this.buffer = trailingRaw;\n return {\n output: processableRaw,\n replacements: 0,\n };\n }\n\n if (view.plain.length === 0) {\n this.buffer = trailingRaw;\n return {\n output: processableRaw,\n replacements: 0,\n };\n }\n\n const tentativeLimit = view.plain.length - this.getLookbehindLength(view.plain);\n if (tentativeLimit <= 0) {\n this.buffer = input;\n return { output: '', replacements: 0 };\n }\n\n const matches = findReplacementMatches(view.plain, this.rules);\n const safeVisibleLimit = this.getSafeVisibleLimit(matches, tentativeLimit);\n const rawLimit =\n safeVisibleLimit >= view.plain.length\n ? view.consumedRawLength\n : safeVisibleLimit === 0\n ? 0\n : view.ends[safeVisibleLimit - 1];\n\n const replaced = this.replaceRaw(processableRaw, view, matches, safeVisibleLimit, rawLimit);\n this.buffer = input.slice(rawLimit);\n return replaced;\n }\n\n flush(): RestoreResult {\n this.syncRules();\n\n if (this.buffer.length === 0) {\n return { output: '', replacements: 0 };\n }\n\n if (this.rules.length === 0) {\n const remaining = this.buffer;\n this.buffer = '';\n return { output: remaining, replacements: 0 };\n }\n\n const input = this.buffer;\n this.buffer = '';\n const view = parseAnsiView(input);\n const replaced = this.replaceRaw(\n input.slice(0, view.consumedRawLength),\n view,\n findReplacementMatches(view.plain, this.rules),\n view.plain.length,\n view.consumedRawLength,\n );\n\n return {\n output: replaced.output + input.slice(view.consumedRawLength),\n replacements: replaced.replacements,\n };\n }\n\n private getLookbehindLength(input: string): number {\n const longestCandidate = Math.min(\n input.length,\n Math.max(0, ...this.rules.map((rule) => rule.source.length - 1)),\n );\n\n for (let length = longestCandidate; length > 0; length -= 1) {\n if (this.prefixes.has(input.slice(-length))) {\n return length;\n }\n }\n\n return 0;\n }\n\n private getSafeVisibleLimit(matches: ReplacementMatch[], tentativeLimit: number): number {\n let safeLimit = tentativeLimit;\n let changed = true;\n\n while (changed) {\n changed = false;\n\n for (const match of matches) {\n if (match.start >= safeLimit) {\n continue;\n }\n\n if (match.end > safeLimit) {\n safeLimit = match.start;\n changed = true;\n }\n }\n }\n\n return safeLimit;\n }\n\n private replaceRaw(\n raw: string,\n view: PlainAnsiView,\n matches: ReplacementMatch[],\n visibleLimit: number,\n rawLimit: number,\n ): RestoreResult {\n if (raw.length === 0) {\n return { output: '', replacements: 0 };\n }\n\n if (visibleLimit === 0) {\n return {\n output: raw.slice(0, rawLimit),\n replacements: 0,\n };\n }\n\n let cursor = 0;\n let output = '';\n let replacements = 0;\n\n for (const match of matches) {\n if (match.end > visibleLimit) {\n break;\n }\n\n const rawStart = view.starts[match.start];\n const rawEnd = view.ends[match.end - 1];\n\n if (rawStart < cursor || rawEnd > rawLimit) {\n continue;\n }\n\n output += raw.slice(cursor, rawStart);\n output += match.replacement;\n cursor = rawEnd;\n replacements += 1;\n }\n\n output += raw.slice(cursor, rawLimit);\n return { output, replacements };\n }\n\n private syncRules(): void {\n if (this.syncedRevision === this.vault.revision) {\n return;\n }\n\n this.rules = sortReplacementRules(\n this.vault\n .getTokenToSecretPairs()\n .map(([source, target]) => ({\n source,\n target,\n })),\n );\n this.prefixes = buildPrefixes(this.rules.map((rule) => rule.source));\n this.syncedRevision = this.vault.revision;\n }\n}\n\nexport class AisRuntime {\n private readonly argvDetector: CombinedDetector;\n private readonly detector: CombinedDetector;\n private readonly detectionBuffers = {\n proxy: '',\n stdin: '',\n };\n private readonly aisStore?: AisStore;\n private readonly interceptor: BidirectionalInterceptor;\n private proxyPort: number | null = null;\n private readonly proxy: ProxyServer;\n private readonly storageManager?: StorageManager;\n private storageLoaded = false;\n private readonly stdoutRestorer: StdoutRestorer;\n private readonly vault: SessionVault;\n private readonly stats = {\n detectedSecrets: 0,\n maskedInputs: 0,\n restoredOutputs: 0,\n };\n private running = false;\n\n constructor(private readonly options: AisRuntimeOptions = {}) {\n this.vault = new SessionVault(options.vault);\n this.detector = new CombinedDetector(options.detector);\n this.argvDetector = new CombinedDetector({\n ...(options.detector ?? {}),\n enableEntropy: false,\n });\n this.interceptor = new BidirectionalInterceptor(this.vault);\n this.stdoutRestorer = new StdoutRestorer(this.vault);\n const mergedEnv = {\n ...process.env,\n ...(options.env ?? {}),\n };\n\n this.proxy = new ProxyServer({\n ...(options.proxy ?? {}),\n onRequestText: (data) => {\n options.proxy?.onRequestText?.(data);\n this.handleProxyRequestText(data);\n },\n targets: {\n ...getDefaultProxyTargets(mergedEnv),\n ...(options.proxy?.targets ?? {}),\n },\n vault: this.vault,\n });\n this.storageManager =\n options.storage && 'manager' in options.storage && options.storage.manager\n ? options.storage.manager\n : options.storage\n ? new StorageManager(options.storage)\n : undefined;\n this.aisStore =\n options.ais && 'store' in options.ais && options.ais.store\n ? options.ais.store\n : options.ais\n ? new AisStore(options.ais)\n : undefined;\n }\n\n async start(command: string, args: string[]): Promise<void> {\n if (this.running) {\n throw new Error('AIS is already running');\n }\n\n this.running = true;\n this.resetDetectionBuffers();\n let aisSaveError: unknown;\n let startError: unknown;\n let storageSaveError: unknown;\n\n const runtimeEnv = {\n ...process.env,\n ...(this.options.env ?? {}),\n };\n\n try {\n await this.loadAisState();\n await this.loadStoredSecrets();\n const preparedArgs = this.prepareArgs(args);\n let commandEnv = runtimeEnv;\n\n if (this.options.dryRun) {\n this.debug('dry-run enabled, proxy disabled');\n } else {\n try {\n this.proxyPort = await this.proxy.start();\n commandEnv = buildProxyEnvironment(this.proxy.getBaseUrl(), runtimeEnv);\n this.debug(`proxy started on :${this.proxyPort}`);\n } catch (error) {\n this.proxyPort = null;\n this.warn(`proxy failed to start, HTTP API requests are NOT protected (${toErrorMessage(error)})`);\n this.debug(`proxy failed (${toErrorMessage(error)}), fallback to PTY-only mode`);\n }\n }\n\n await createPtyWrapper(command, preparedArgs, {\n cwd: this.options.cwd,\n env: commandEnv,\n stdin: this.options.stdin,\n stdout: this.options.stdout,\n onStdinData: (data) => this.handleStdin(data),\n flushStdinData: () => this.flushStdin(),\n onStdoutData: (data) => this.handleStdout(data),\n flushStdoutData: () => this.flushStdout(),\n });\n } catch (error) {\n startError = error;\n } finally {\n this.running = false;\n this.resetDetectionBuffers();\n this.proxyPort = null;\n await this.proxy.stop().catch(() => undefined);\n\n if (this.storageManager) {\n try {\n await this.storageManager.save(this.vault);\n } catch (error) {\n storageSaveError = error;\n if (startError) {\n this.debug(`storage save failed (${toErrorMessage(error)})`);\n }\n }\n }\n\n if (this.aisStore) {\n try {\n await this.aisStore.save();\n } catch (error) {\n aisSaveError = error;\n if (startError || storageSaveError) {\n this.debug(`ais save failed (${toErrorMessage(error)})`);\n }\n }\n }\n }\n\n if (startError) {\n throw startError;\n }\n\n if (storageSaveError) {\n throw storageSaveError;\n }\n\n if (aisSaveError) {\n throw aisSaveError;\n }\n }\n\n registerSecret(\n secret: string,\n type: SecretType = 'GENERIC',\n options: RegisterSecretValueOptions = {},\n ): string {\n return this.registerSecretValue(secret, type, 'manual', options).token;\n }\n\n getStats(): AisStats {\n return {\n detectedSecrets: this.stats.detectedSecrets,\n maskedInputs: this.stats.maskedInputs,\n proxyEnabled: this.proxyPort !== null,\n proxyPort: this.proxyPort,\n registeredSecrets: this.vault.size,\n restoredOutputs: this.stats.restoredOutputs,\n };\n }\n\n private debug(message: string): void {\n if (!this.options.debug) {\n return;\n }\n\n this.writeMessage(message);\n }\n\n private warn(message: string): void {\n this.writeMessage(`WARNING: ${message}`);\n }\n\n private writeMessage(message: string): void {\n const line = `[AIS] ${message}`;\n process.stderr.write(`${line}\\n`);\n\n if (!this.options.logFile) {\n return;\n }\n\n mkdirSync(dirname(this.options.logFile), { recursive: true });\n appendFileSync(this.options.logFile, `${line}\\n`, 'utf8');\n }\n\n private async loadStoredSecrets(): Promise<void> {\n if (this.storageLoaded || !this.storageManager) {\n return;\n }\n\n const storedVault = await this.storageManager.initialize();\n for (const entry of storedVault.snapshot()) {\n if (this.aisStore?.isExcluded(entry.secret, entry.type)) {\n this.debug(`storage: skipped excluded secret ${redactSecret(entry.secret)}`);\n continue;\n }\n\n this.vault.register(entry.secret, entry.type, {\n createdAt: entry.createdAt,\n hitCount: entry.hitCount,\n name: entry.name,\n source: entry.source,\n token: entry.token,\n });\n }\n\n this.storageLoaded = true;\n }\n\n private async loadAisState(): Promise<void> {\n if (!this.aisStore) {\n return;\n }\n\n await this.aisStore.load();\n }\n\n private detectSecrets(input: string, source: 'argv' | 'stdin' | 'proxy'): void {\n if (input.length === 0) {\n return;\n }\n\n const normalizedInput = source === 'proxy' ? normalizeProxyDetectionInput(input) : input;\n const scanTarget =\n source === 'argv'\n ? stripVaultArtifacts(normalizedInput)\n : source === 'proxy'\n ? stripVaultArtifacts(normalizedInput)\n : (() => {\n const bufferSize = this.options.detectionWindow ?? DEFAULT_DETECTION_WINDOW;\n const nextBuffer = stripVaultArtifacts(`${this.detectionBuffers[source]}${normalizedInput}`);\n this.detectionBuffers[source] = nextBuffer.slice(-bufferSize);\n return this.detectionBuffers[source];\n })();\n\n if (scanTarget.length === 0) {\n return;\n }\n\n const detector = source === 'argv' ? this.argvDetector : this.detector;\n\n for (const detected of detector.detect(scanTarget)) {\n if (detected.value.startsWith('__VAULT_')) {\n continue;\n }\n\n const result = this.registerSecretValue(detected.value, detected.type, source);\n if (result.created) {\n this.stats.detectedSecrets += 1;\n }\n }\n }\n\n private flushStdin(): string {\n if (this.options.dryRun) {\n return '';\n }\n\n return this.interceptor.flush().input;\n }\n\n private flushStdout(): string {\n if (this.options.dryRun) {\n return '';\n }\n\n const restored = this.stdoutRestorer.flush();\n this.stats.restoredOutputs += restored.replacements;\n return restored.output;\n }\n\n private handleStdin(data: string): string {\n this.detectSecrets(data, 'stdin');\n\n if (this.options.dryRun) {\n return data;\n }\n\n const masked = this.interceptor.processInput(data);\n if (masked !== data) {\n this.stats.maskedInputs += 1;\n }\n\n return masked;\n }\n\n private handleStdout(data: string): string {\n if (this.options.dryRun) {\n return data;\n }\n\n const restored = this.stdoutRestorer.push(data);\n this.stats.restoredOutputs += restored.replacements;\n return restored.output;\n }\n\n private handleProxyRequestText(data: string): void {\n this.detectSecrets(data, 'proxy');\n }\n\n private prepareArgs(args: string[]): string[] {\n if (args.length === 0) {\n return args;\n }\n\n const preparedArgs = args.map((arg, index) => {\n if (shouldSkipArgInspection(args[index - 1])) {\n return arg;\n }\n\n this.detectSecrets(arg, 'argv');\n return replaceKnownValues(\n arg,\n this.vault\n .getSecretToTokenPairs()\n .map(([source, target]) => ({\n source,\n target,\n })),\n ).output;\n });\n\n return this.options.dryRun ? args : preparedArgs;\n }\n\n private registerSecretValue(\n secret: string,\n type: SecretType,\n source: 'argv' | 'manual' | 'stdin' | 'proxy',\n options: RegisterSecretValueOptions = {},\n ): RegisteredSecretResult {\n if (source !== 'manual' && this.aisStore?.isExcluded(secret, type)) {\n this.debug(`${source}: skipped excluded secret ${redactSecret(secret)}`);\n return {\n created: false,\n token: secret,\n };\n }\n\n const previousRevision = this.vault.revision;\n const token = this.vault.register(secret, type, {\n name: options.name,\n source,\n });\n const created = this.vault.revision !== previousRevision;\n this.aisStore?.recordSecret(secret, type, {\n name: options.name,\n source,\n });\n\n if (created) {\n this.debug(`${source}: detected secret ${redactSecret(secret)} -> ${token}`);\n }\n\n return { created, token };\n }\n\n private resetDetectionBuffers(): void {\n this.detectionBuffers.proxy = '';\n this.detectionBuffers.stdin = '';\n }\n}\n\nfunction shouldSkipArgInspection(previousArg?: string): boolean {\n return ['-c', '-e', '-lc', '--command', '--eval'].includes(previousArg ?? '');\n}\n","import type { SecretType } from '../vault/types.js';\n\nimport type { DetectedSecret, SecretDetector } from './types.js';\n\ninterface ContextRule {\n id: string;\n expression: RegExp;\n getType(keyword: string): SecretType;\n}\n\nconst INLINE_SPACING = String.raw`[^\\S\\r\\n]*`;\nconst ENGLISH_CONNECTORS = new Set(['and', 'or', 'but']);\nconst HARD_VALUE_BOUNDARIES = new Set(['\\n', '\\r', ',', ';', ',', ';', '、', ')', ']', '}', '\"', '\\'']);\n\nconst CONTEXT_RULES: ContextRule[] = [\n {\n id: 'context_cn_keyword',\n expression: new RegExp(String.raw`(密码|密钥|口令)${INLINE_SPACING}(?:是|为|=|:|:)${INLINE_SPACING}`, 'g'),\n getType(keyword) {\n return keyword === '密钥' ? 'APIKEY' : 'PASSWORD';\n },\n },\n {\n id: 'context_en_keyword',\n expression: new RegExp(\n String.raw`\\b(password|passwd|api[_-]?key|token|secret)\\b${INLINE_SPACING}(?:=|:|:|is)${INLINE_SPACING}`,\n 'gi',\n ),\n getType(keyword) {\n return classifyKeyword(keyword);\n },\n },\n {\n id: 'context_assignment',\n expression: new RegExp(\n String.raw`\\b([A-Za-z_][A-Za-z0-9_]*(?:PASSWORD|PASSWD|API_KEY|TOKEN|SECRET)[A-Za-z0-9_]*)\\b${INLINE_SPACING}=${INLINE_SPACING}`,\n 'g',\n ),\n getType(keyword) {\n return classifyKeyword(keyword);\n },\n },\n];\n\nfunction classifyKeyword(keyword: string): SecretType {\n const normalized = keyword.toLowerCase();\n\n if (normalized.includes('password') || normalized.includes('passwd') || normalized.includes('口令')) {\n return 'PASSWORD';\n }\n\n if (normalized.includes('api_key') || normalized.includes('api-key') || normalized.includes('密钥')) {\n return 'APIKEY';\n }\n\n if (normalized.includes('token')) {\n return 'BEARER_TOKEN';\n }\n\n return 'GENERIC';\n}\n\nfunction isAsciiLetter(character: string): boolean {\n return /[A-Za-z]/.test(character);\n}\n\nfunction isAsciiIdentifierPart(character: string): boolean {\n return /[A-Za-z0-9_-]/.test(character);\n}\n\nfunction isHanCharacter(character: string): boolean {\n return /\\p{Script=Han}/u.test(character);\n}\n\nfunction skipInlineWhitespace(input: string, start: number): number {\n let cursor = start;\n\n while (cursor < input.length) {\n const character = input[cursor];\n if (character === '\\n' || character === '\\r' || !/\\s/.test(character)) {\n break;\n }\n\n cursor += 1;\n }\n\n return cursor;\n}\n\nfunction readConnector(input: string, start: number): number {\n const lowerRest = input.slice(start).toLowerCase();\n\n for (const connector of ENGLISH_CONNECTORS) {\n if (!lowerRest.startsWith(connector)) {\n continue;\n }\n\n const nextCharacter = input[start + connector.length] ?? '';\n if (!isAsciiIdentifierPart(nextCharacter)) {\n return start + connector.length;\n }\n }\n\n return start;\n}\n\nfunction readFieldName(input: string, start: number): number {\n if (start >= input.length) {\n return start;\n }\n\n const firstCharacter = input[start];\n if (isAsciiLetter(firstCharacter) || firstCharacter === '_') {\n let cursor = start + 1;\n while (cursor < input.length && isAsciiIdentifierPart(input[cursor])) {\n cursor += 1;\n }\n\n return cursor;\n }\n\n if (!isHanCharacter(firstCharacter)) {\n return start;\n }\n\n let cursor = start + 1;\n while (cursor < input.length && isHanCharacter(input[cursor])) {\n cursor += 1;\n }\n\n return cursor;\n}\n\nfunction readFieldOperator(input: string, start: number): number {\n const singleCharacterOperator = input[start];\n if (singleCharacterOperator === '=' || singleCharacterOperator === ':' || singleCharacterOperator === ':') {\n return start + 1;\n }\n\n if (singleCharacterOperator === '是' || singleCharacterOperator === '为') {\n return start + 1;\n }\n\n const lowerRest = input.slice(start, start + 2).toLowerCase();\n if (lowerRest === 'is') {\n const nextCharacter = input[start + 2] ?? '';\n if (!isAsciiIdentifierPart(nextCharacter)) {\n return start + 2;\n }\n }\n\n return start;\n}\n\nfunction startsNextField(input: string, start: number): boolean {\n let cursor = skipInlineWhitespace(input, start);\n if (cursor >= input.length || input[cursor] === '\\n' || input[cursor] === '\\r') {\n return false;\n }\n\n const afterConnector = readConnector(input, cursor);\n if (afterConnector > cursor) {\n cursor = skipInlineWhitespace(input, afterConnector);\n }\n\n const afterFieldName = readFieldName(input, cursor);\n if (afterFieldName === cursor) {\n return false;\n }\n\n cursor = skipInlineWhitespace(input, afterFieldName);\n const afterOperator = readFieldOperator(input, cursor);\n\n return afterOperator > cursor;\n}\n\nfunction extractValue(\n input: string,\n start: number,\n): {\n end: number;\n value: string;\n} | null {\n const openingQuote = input[start];\n if (openingQuote === '\"' || openingQuote === '\\'') {\n const closingIndex = input.indexOf(openingQuote, start + 1);\n if (closingIndex <= start + 1) {\n return null;\n }\n\n const quotedValue = input.slice(start + 1, closingIndex);\n if (quotedValue.includes('\\n') || quotedValue.includes('\\r')) {\n return null;\n }\n\n return {\n value: quotedValue,\n end: closingIndex + 1,\n };\n }\n\n let cursor = start;\n while (cursor < input.length) {\n const character = input[cursor];\n if (HARD_VALUE_BOUNDARIES.has(character)) {\n break;\n }\n\n if (/\\s/.test(character) && startsNextField(input, cursor)) {\n break;\n }\n\n cursor += 1;\n }\n\n const rawValue = input.slice(start, cursor).trimEnd();\n if (rawValue.length === 0) {\n return null;\n }\n\n return {\n value: rawValue,\n end: start + rawValue.length,\n };\n}\n\nfunction dedupe(matches: DetectedSecret[]): DetectedSecret[] {\n const seen = new Set<string>();\n\n return matches.filter((match) => {\n const key = `${match.start}:${match.end}:${match.patternId}`;\n if (seen.has(key)) {\n return false;\n }\n\n seen.add(key);\n return true;\n });\n}\n\nexport class ContextDetector implements SecretDetector {\n detect(input: string): DetectedSecret[] {\n const matches: DetectedSecret[] = [];\n\n for (const rule of CONTEXT_RULES) {\n for (const match of input.matchAll(rule.expression)) {\n const keyword = match[1];\n if (!keyword || match.index === undefined) {\n continue;\n }\n\n const start = match.index + match[0].length;\n const value = extractValue(input, start);\n if (!value) {\n continue;\n }\n\n matches.push({\n value: value.value,\n type: rule.getType(keyword),\n confidence: 'medium',\n start,\n end: value.end,\n patternId: rule.id,\n });\n }\n }\n\n return dedupe(matches).sort((left, right) => left.start - right.start || left.end - right.end);\n }\n}\n","import type { DetectedSecret, SecretDetector } from './types.js';\n\nconst MIN_SECRET_LENGTH = 20;\nconst HEX_ENTROPY_THRESHOLD = 3.5;\nconst BASE64_ENTROPY_THRESHOLD = 4.5;\n\nconst HEX_CANDIDATE_REGEX = /(?<![A-Fa-f0-9])([A-Fa-f0-9]{20,})(?![A-Fa-f0-9])/g;\nconst BASE64_CANDIDATE_REGEX = /(?<![A-Za-z0-9+/_-])([A-Za-z0-9+/_-]{20,}={0,2})(?![A-Za-z0-9+/_-])/g;\n\nexport interface EntropyDetectorOptions {\n threshold?: number;\n}\n\nfunction calculateShannonEntropy(value: string): number {\n const counts = new Map<string, number>();\n\n for (const char of value) {\n counts.set(char, (counts.get(char) ?? 0) + 1);\n }\n\n let entropy = 0;\n for (const count of counts.values()) {\n const probability = count / value.length;\n entropy -= probability * Math.log2(probability);\n }\n\n return entropy;\n}\n\nfunction countCharacterGroups(value: string): number {\n return [\n /[a-z]/.test(value),\n /[A-Z]/.test(value),\n /\\d/.test(value),\n /[+/_=-]/.test(value),\n ].filter(Boolean).length;\n}\n\nfunction isUuid(value: string): boolean {\n return /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(value);\n}\n\nfunction isVersion(value: string): boolean {\n return /^v?\\d+(?:\\.\\d+){1,3}(?:[-+][A-Za-z0-9.-]+)?$/.test(value);\n}\n\nfunction isGitSha(value: string): boolean {\n return /^[0-9a-f]{40}$/i.test(value);\n}\n\nfunction isUrl(value: string): boolean {\n return /^[a-z][a-z0-9+.-]*:\\/\\/\\S+$/i.test(value);\n}\n\nfunction isEmail(value: string): boolean {\n return /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value);\n}\n\nfunction isVariableName(value: string): boolean {\n return /^[A-Z_][A-Z0-9_]*$/.test(value) || /^[a-z_][a-z0-9_]*$/.test(value);\n}\n\nfunction isWhitelisted(value: string): boolean {\n return (\n isUuid(value) ||\n isVersion(value) ||\n isGitSha(value) ||\n isUrl(value) ||\n isEmail(value) ||\n isVariableName(value)\n );\n}\n\nfunction detectFromRegex(\n input: string,\n expression: RegExp,\n patternId: string,\n threshold: number,\n isValidCandidate: (value: string) => boolean,\n): DetectedSecret[] {\n const matches: DetectedSecret[] = [];\n\n for (const match of input.matchAll(expression)) {\n const value = match[1];\n if (!value || match.index === undefined) {\n continue;\n }\n\n if (value.length < MIN_SECRET_LENGTH || isWhitelisted(value) || !isValidCandidate(value)) {\n continue;\n }\n\n if (calculateShannonEntropy(value) <= threshold) {\n continue;\n }\n\n const start = match.index + match[0].indexOf(value);\n matches.push({\n value,\n type: 'GENERIC',\n confidence: 'low',\n start,\n end: start + value.length,\n patternId,\n });\n }\n\n return matches;\n}\n\nfunction isHexCandidate(value: string): boolean {\n return /^[A-Fa-f0-9]+$/.test(value) && !isGitSha(value);\n}\n\nfunction isBase64Candidate(value: string): boolean {\n if (!/^[A-Za-z0-9+/_-]+={0,2}$/.test(value)) {\n return false;\n }\n\n return countCharacterGroups(value) >= 3;\n}\n\nfunction dedupe(matches: DetectedSecret[]): DetectedSecret[] {\n const seen = new Set<string>();\n\n return matches.filter((match) => {\n const key = `${match.start}:${match.end}`;\n if (seen.has(key)) {\n return false;\n }\n\n seen.add(key);\n return true;\n });\n}\n\nexport class EntropyDetector implements SecretDetector {\n constructor(private readonly options: EntropyDetectorOptions = {}) {}\n\n detect(input: string): DetectedSecret[] {\n const threshold = this.options.threshold;\n const matches = [\n ...detectFromRegex(\n input,\n HEX_CANDIDATE_REGEX,\n 'entropy_hex',\n threshold ?? HEX_ENTROPY_THRESHOLD,\n isHexCandidate,\n ),\n ...detectFromRegex(\n input,\n BASE64_CANDIDATE_REGEX,\n 'entropy_base64',\n threshold ?? BASE64_ENTROPY_THRESHOLD,\n isBase64Candidate,\n ),\n ];\n\n return dedupe(matches).sort((left, right) => left.start - right.start || left.end - right.end);\n }\n}\n\nexport { calculateShannonEntropy };\n","import type { SecretType } from '../vault/types.js';\n\nimport type { DetectedSecret, SecretDetector } from './types.js';\n\ninterface PatternDefinition {\n extractValue(match: RegExpMatchArray): string | null;\n id: string;\n type: SecretType;\n expression: RegExp;\n}\n\nexport interface CustomPatternDefinition {\n id: string;\n regex: string;\n type: SecretType;\n}\n\nexport interface PatternDetectorOptions {\n customPatterns?: CustomPatternDefinition[];\n}\n\nconst PRIVATE_KEY_BLOCK_PATTERN =\n /(-----BEGIN ((?:RSA |EC |OPENSSH )?PRIVATE KEY)-----[\\s\\S]*?-----END \\2-----|-----BEGIN (?:RSA |EC |OPENSSH )?PRIVATE KEY-----)/g;\nconst AWS_SECRET_VALUE_PATTERN = /[A-Za-z0-9/+=]{40}/;\n\nexport const KNOWN_SECRET_PATTERNS: PatternDefinition[] = [\n {\n extractValue(match) {\n return match[1] ?? null;\n },\n id: 'anthropic_key',\n type: 'APIKEY',\n expression: /(?<![A-Za-z0-9_-])(sk-ant-api\\d{2}-[A-Za-z0-9_-]{80,})(?![A-Za-z0-9_-])/g,\n },\n {\n extractValue(match) {\n return match[1] ?? null;\n },\n id: 'openai_project',\n type: 'APIKEY',\n expression: /(?<![A-Za-z0-9_-])(sk-proj-[A-Za-z0-9_-]{40,})(?![A-Za-z0-9_-])/g,\n },\n {\n extractValue(match) {\n return match[1] ?? null;\n },\n id: 'openai_key',\n type: 'APIKEY',\n expression: /(?<![A-Za-z0-9])(sk-(?!proj-)[A-Za-z0-9]{20,})(?![A-Za-z0-9])/g,\n },\n {\n extractValue(match) {\n return match[1] ?? null;\n },\n id: 'aws_access',\n type: 'APIKEY',\n expression: /(?<![A-Z0-9])((?:AKIA|AGPA|AROA|AIPA)[A-Z0-9]{16})(?![A-Z0-9])/g,\n },\n {\n extractValue(match) {\n return match[1] ?? null;\n },\n id: 'aws_secret',\n type: 'APIKEY',\n expression: new RegExp(\n String.raw`(?:\\bAWS_SECRET_ACCESS_KEY\\b|\\baws_secret_access_key\\b)\\s*[:=]\\s*(${AWS_SECRET_VALUE_PATTERN.source})(?![A-Za-z0-9/+=])`,\n 'g',\n ),\n },\n {\n extractValue(match) {\n return match[1] ?? null;\n },\n id: 'aws_secret',\n type: 'APIKEY',\n expression: new RegExp(\n String.raw`(?:AKIA|AGPA|AROA|AIPA)[A-Z0-9]{16}[=:,\\s]{1,10}(${AWS_SECRET_VALUE_PATTERN.source})(?![A-Za-z0-9/+=])`,\n 'g',\n ),\n },\n {\n extractValue(match) {\n return match[1] ?? null;\n },\n id: 'github_pat',\n type: 'APIKEY',\n expression: /(?<![A-Za-z0-9_])(ghp_[0-9a-zA-Z]{36})(?![A-Za-z0-9_])/g,\n },\n {\n extractValue(match) {\n return match[1] ?? null;\n },\n id: 'stripe_live',\n type: 'APIKEY',\n expression: /(?<![A-Za-z0-9_])(sk_live_[0-9a-zA-Z]{24,})(?![A-Za-z0-9_])/g,\n },\n {\n extractValue(match) {\n return match[1] ?? null;\n },\n id: 'slack_token',\n type: 'APIKEY',\n expression: /(?<![A-Za-z0-9-])(xox[baprs]-[0-9a-zA-Z-]{10,72})(?![A-Za-z0-9-])/g,\n },\n {\n extractValue(match) {\n return match[1] ?? null;\n },\n id: 'jwt_token',\n type: 'JWT',\n expression: /(?<![A-Za-z0-9_-])(eyJ[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+)(?![A-Za-z0-9_-])/g,\n },\n {\n extractValue(match) {\n return match[1] ?? null;\n },\n id: 'rsa_private',\n type: 'PRIVATE_KEY',\n expression: PRIVATE_KEY_BLOCK_PATTERN,\n },\n {\n extractValue(match) {\n return match[1] ?? null;\n },\n id: 'db_connection',\n type: 'DBCONN',\n expression: /((?:mysql|postgres(?:ql)?|mongodb|redis):\\/\\/[^:\\s'\"]+:[^@\\s'\"]+@[^\\s'\"]+)/g,\n },\n];\n\nexport class PatternDetector implements SecretDetector {\n private readonly patterns: PatternDefinition[];\n\n constructor(options: PatternDetectorOptions = {}) {\n this.patterns = [\n ...KNOWN_SECRET_PATTERNS,\n ...buildCustomPatterns(options.customPatterns ?? []),\n ];\n }\n\n detect(input: string): DetectedSecret[] {\n const matches: DetectedSecret[] = [];\n\n for (const pattern of this.patterns) {\n for (const match of input.matchAll(pattern.expression)) {\n const value = pattern.extractValue(match);\n if (!value || match.index === undefined) {\n continue;\n }\n\n const start = match.index + match[0].indexOf(value);\n matches.push({\n value,\n type: pattern.type,\n confidence: 'high',\n start,\n end: start + value.length,\n patternId: pattern.id,\n });\n }\n }\n\n return matches.sort((left, right) => left.start - right.start || left.end - right.end);\n }\n}\n\nfunction buildCustomPatterns(patterns: CustomPatternDefinition[]): PatternDefinition[] {\n return patterns.map((pattern) => ({\n id: pattern.id,\n type: pattern.type,\n expression: new RegExp(pattern.regex, 'g'),\n extractValue(match) {\n return match[0] ?? null;\n },\n }));\n}\n","import { ContextDetector } from './context-detector.js';\nimport { EntropyDetector } from './entropy-detector.js';\nimport { PatternDetector, type CustomPatternDefinition } from './pattern-detector.js';\nimport type { DetectedSecret, SecretDetector } from './types.js';\n\nexport interface CombinedDetectorOptions {\n customPatterns?: CustomPatternDefinition[];\n enablePattern?: boolean;\n enableContext?: boolean;\n enableEntropy?: boolean;\n entropyThreshold?: number;\n}\n\nfunction overlaps(left: DetectedSecret, right: DetectedSecret): boolean {\n return left.start < right.end && right.start < left.end;\n}\n\nexport class CombinedDetector implements SecretDetector {\n private readonly stages: SecretDetector[];\n\n constructor(options: CombinedDetectorOptions = {}) {\n this.stages = [];\n\n if (options.enablePattern !== false) {\n this.stages.push(\n new PatternDetector({\n customPatterns: options.customPatterns,\n }),\n );\n }\n\n if (options.enableContext !== false) {\n this.stages.push(new ContextDetector());\n }\n\n if (options.enableEntropy !== false) {\n this.stages.push(\n new EntropyDetector({\n threshold: options.entropyThreshold,\n }),\n );\n }\n }\n\n detect(input: string): DetectedSecret[] {\n const accepted: DetectedSecret[] = [];\n\n for (const stage of this.stages) {\n for (const match of stage.detect(input)) {\n if (accepted.some((existing) => overlaps(existing, match))) {\n continue;\n }\n\n accepted.push(match);\n }\n }\n\n return accepted.sort((left, right) => left.start - right.start || left.end - right.end);\n }\n}\n","interface ReplacementRule {\n source: string;\n target: string;\n}\n\ninterface ReplacementMatcher {\n findMatches(input: string): Match[];\n}\n\ninterface TrieNode {\n fail: number;\n next: Map<string, number>;\n outputs: number[];\n}\n\ninterface Match {\n end: number;\n replacement: string;\n sourceLength: number;\n start: number;\n}\n\nconst SIMPLE_MATCHER_LIMIT = 10;\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nfunction sortRules(rules: ReplacementRule[]): ReplacementRule[] {\n return rules.sort((left, right) => {\n if (right.source.length !== left.source.length) {\n return right.source.length - left.source.length;\n }\n\n return left.source.localeCompare(right.source);\n });\n}\n\nclass RegexMatcher implements ReplacementMatcher {\n private readonly pattern: RegExp;\n private readonly replacements: Map<string, string>;\n\n constructor(rules: ReplacementRule[]) {\n this.replacements = new Map(rules.map((rule) => [rule.source, rule.target]));\n this.pattern = new RegExp(rules.map((rule) => escapeRegExp(rule.source)).join('|'), 'g');\n }\n\n findMatches(input: string): Match[] {\n if (input.length === 0) {\n return [];\n }\n\n this.pattern.lastIndex = 0;\n\n return Array.from(input.matchAll(this.pattern), (match) => {\n const value = match[0];\n const start = match.index ?? 0;\n\n return {\n start,\n end: start + value.length,\n sourceLength: value.length,\n replacement: this.replacements.get(value) ?? value,\n };\n });\n }\n}\n\nclass SingleRuleMatcher implements ReplacementMatcher {\n constructor(private readonly rule: ReplacementRule) {}\n\n findMatches(input: string): Match[] {\n if (input.length === 0 || this.rule.source.length === 0) {\n return [];\n }\n\n const matches: Match[] = [];\n let start = input.indexOf(this.rule.source);\n\n while (start !== -1) {\n matches.push({\n start,\n end: start + this.rule.source.length,\n sourceLength: this.rule.source.length,\n replacement: this.rule.target,\n });\n start = input.indexOf(this.rule.source, start + this.rule.source.length);\n }\n\n return matches;\n }\n}\n\nclass AhoCorasickMatcher implements ReplacementMatcher {\n private readonly nodes: TrieNode[] = [{ fail: 0, next: new Map(), outputs: [] }];\n private readonly rules: ReplacementRule[];\n\n constructor(rules: ReplacementRule[]) {\n this.rules = rules;\n this.buildTrie();\n this.buildFailureLinks();\n }\n\n findMatches(input: string): Match[] {\n if (input.length === 0) {\n return [];\n }\n\n const matches: Match[] = [];\n let nodeIndex = 0;\n\n for (let position = 0; position < input.length; position += 1) {\n const character = input[position];\n\n while (nodeIndex !== 0 && !this.nodes[nodeIndex].next.has(character)) {\n nodeIndex = this.nodes[nodeIndex].fail;\n }\n\n nodeIndex = this.nodes[nodeIndex].next.get(character) ?? 0;\n\n for (const ruleIndex of this.nodes[nodeIndex].outputs) {\n const rule = this.rules[ruleIndex];\n matches.push({\n start: position - rule.source.length + 1,\n end: position + 1,\n sourceLength: rule.source.length,\n replacement: rule.target,\n });\n }\n }\n\n return matches;\n }\n\n private buildTrie(): void {\n this.rules.forEach((rule, ruleIndex) => {\n let nodeIndex = 0;\n\n for (const character of rule.source) {\n const nextIndex = this.nodes[nodeIndex].next.get(character);\n\n if (nextIndex !== undefined) {\n nodeIndex = nextIndex;\n continue;\n }\n\n const createdIndex = this.nodes.length;\n this.nodes.push({ fail: 0, next: new Map(), outputs: [] });\n this.nodes[nodeIndex].next.set(character, createdIndex);\n nodeIndex = createdIndex;\n }\n\n this.nodes[nodeIndex].outputs.push(ruleIndex);\n });\n }\n\n private buildFailureLinks(): void {\n const queue: number[] = [];\n\n for (const childIndex of this.nodes[0].next.values()) {\n this.nodes[childIndex].fail = 0;\n queue.push(childIndex);\n }\n\n while (queue.length > 0) {\n const currentIndex = queue.shift();\n\n if (currentIndex === undefined) {\n break;\n }\n\n const currentNode = this.nodes[currentIndex];\n\n for (const [character, childIndex] of currentNode.next.entries()) {\n let fallbackIndex = currentNode.fail;\n\n while (fallbackIndex !== 0 && !this.nodes[fallbackIndex].next.has(character)) {\n fallbackIndex = this.nodes[fallbackIndex].fail;\n }\n\n const failureTarget = this.nodes[fallbackIndex].next.get(character) ?? 0;\n this.nodes[childIndex].fail = failureTarget;\n this.nodes[childIndex].outputs.push(...this.nodes[failureTarget].outputs);\n queue.push(childIndex);\n }\n }\n }\n}\n\nfunction createMatcher(rules: ReplacementRule[]): ReplacementMatcher | null {\n if (rules.length === 0) {\n return null;\n }\n\n if (rules.length === 1) {\n return new SingleRuleMatcher(rules[0]);\n }\n\n if (rules.length < SIMPLE_MATCHER_LIMIT) {\n return new RegexMatcher(rules);\n }\n\n return new AhoCorasickMatcher(rules);\n}\n\nfunction normalizeRules(replacements: Map<string, string>): ReplacementRule[] {\n return sortRules(\n Array.from(replacements.entries(), ([source, target]) => ({ source, target })).filter(\n (rule) => rule.source.length > 0,\n ),\n );\n}\n\nfunction sortMatches(matches: Match[]): Match[] {\n if (matches.length < 2) {\n return matches;\n }\n\n return matches.sort((left, right) => {\n if (left.start !== right.start) {\n return left.start - right.start;\n }\n\n if (right.sourceLength !== left.sourceLength) {\n return right.sourceLength - left.sourceLength;\n }\n\n return left.end - right.end;\n });\n}\n\nfunction replaceUpTo(input: string, matches: Match[], limit: number): string {\n if (limit <= 0) {\n return '';\n }\n\n let cursor = 0;\n let result = '';\n\n for (const match of matches) {\n if (match.start >= limit) {\n break;\n }\n\n if (match.start < cursor || match.end > limit) {\n continue;\n }\n\n result += input.slice(cursor, match.start);\n result += match.replacement;\n cursor = match.end;\n }\n\n return result + input.slice(cursor, limit);\n}\n\nexport class StreamReplacer {\n private buffer = '';\n private matcher: ReplacementMatcher | null = null;\n private maxPatternLen = 0;\n private prefixes = new Set<string>();\n\n constructor(replacements: Map<string, string>) {\n this.updateRules(replacements);\n }\n\n push(chunk: string): string {\n const input = this.buffer + chunk;\n\n if (this.matcher === null || this.maxPatternLen === 0) {\n this.buffer = '';\n return input;\n }\n\n const lookbehindLength = this.getLookbehindLength(input);\n const tentativeLimit = input.length - lookbehindLength;\n\n if (tentativeLimit <= 0) {\n this.buffer = input;\n return '';\n }\n\n const matches = sortMatches(this.matcher.findMatches(input));\n const safeLimit = this.getSafeLimit(matches, tentativeLimit);\n\n this.buffer = input.slice(safeLimit);\n return replaceUpTo(input, matches, safeLimit);\n }\n\n flush(): string {\n if (this.buffer.length === 0) {\n return '';\n }\n\n const remaining = this.buffer;\n this.buffer = '';\n\n if (this.matcher === null) {\n return remaining;\n }\n\n return replaceUpTo(remaining, sortMatches(this.matcher.findMatches(remaining)), remaining.length);\n }\n\n updateRules(replacements: Map<string, string>): void {\n const rules = normalizeRules(replacements);\n\n this.maxPatternLen = rules.reduce((currentMax, rule) => Math.max(currentMax, rule.source.length), 0);\n this.prefixes = new Set(\n rules.flatMap((rule) =>\n Array.from({ length: Math.max(0, rule.source.length - 1) }, (_, index) =>\n rule.source.slice(0, index + 1),\n ),\n ),\n );\n this.matcher = createMatcher(rules);\n }\n\n private getLookbehindLength(input: string): number {\n const longestCandidate = Math.min(input.length, Math.max(0, this.maxPatternLen - 1));\n\n for (let length = longestCandidate; length > 0; length -= 1) {\n if (this.prefixes.has(input.slice(-length))) {\n return length;\n }\n }\n\n return 0;\n }\n\n private getSafeLimit(matches: Match[], tentativeLimit: number): number {\n let safeLimit = tentativeLimit;\n let changed = true;\n\n while (changed) {\n changed = false;\n\n for (const match of matches) {\n if (match.start >= safeLimit) {\n continue;\n }\n\n if (match.end > safeLimit) {\n safeLimit = match.start;\n changed = true;\n }\n }\n }\n\n return safeLimit;\n }\n}\n","import { SessionVault } from '../vault/session-vault.js';\n\nimport { StreamReplacer } from './stream-replacer.js';\n\nexport interface BidirectionalFlushResult {\n apiResponse: string;\n input: string;\n output: string;\n}\n\nfunction buildReplacementMap(pairs: Array<[string, string]>): Map<string, string> {\n return new Map(pairs);\n}\n\nexport class BidirectionalInterceptor {\n private readonly apiResponseReplacer = new StreamReplacer(new Map());\n private readonly inputReplacer = new StreamReplacer(new Map());\n private readonly outputReplacer = new StreamReplacer(new Map());\n private syncedRevision = -1;\n\n constructor(private readonly vault: SessionVault) {\n this.updateRules();\n }\n\n processInput(chunk: string): string {\n this.syncRules();\n return this.inputReplacer.push(chunk);\n }\n\n processOutput(chunk: string): string {\n this.syncRules();\n return this.outputReplacer.push(chunk);\n }\n\n processApiResponse(chunk: string): string {\n this.syncRules();\n return this.apiResponseReplacer.push(chunk);\n }\n\n flush(): BidirectionalFlushResult {\n this.syncRules();\n\n return {\n input: this.inputReplacer.flush(),\n output: this.outputReplacer.flush(),\n apiResponse: this.apiResponseReplacer.flush(),\n };\n }\n\n updateRules(): void {\n const secretToToken = buildReplacementMap(this.vault.getSecretToTokenPairs());\n const tokenToSecret = buildReplacementMap(this.vault.getTokenToSecretPairs());\n\n this.inputReplacer.updateRules(secretToToken);\n this.outputReplacer.updateRules(tokenToSecret);\n this.apiResponseReplacer.updateRules(tokenToSecret);\n this.syncedRevision = this.vault.revision;\n }\n\n private syncRules(): void {\n if (this.syncedRevision === this.vault.revision) {\n return;\n }\n\n this.updateRules();\n }\n}\n","import { chmodSync, existsSync, statSync } from 'node:fs';\nimport { createRequire } from 'node:module';\nimport { dirname, join } from 'node:path';\nimport { type Readable, type Writable } from 'node:stream';\n\nimport * as pty from 'node-pty';\n\nexport interface PtyWrapperOptions {\n flushStdinData?: () => string;\n flushStdoutData?: () => string;\n onStdinData?: (data: string) => string;\n onStdoutData?: (data: string) => string;\n stdin?: Readable & {\n isRaw?: boolean;\n isTTY?: boolean;\n setRawMode?: (mode: boolean) => void;\n };\n stdout?: Writable & {\n columns?: number;\n isTTY?: boolean;\n rows?: number;\n };\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n}\n\nconst DEFAULT_COLUMNS = 80;\nconst DEFAULT_ROWS = 24;\nconst require = createRequire(import.meta.url);\nconst nodePtyPackageDirectory = dirname(require.resolve('node-pty/package.json'));\n\nfunction identity(data: string): string {\n return data;\n}\n\nfunction empty(): string {\n return '';\n}\n\nfunction getColumns(stdout: PtyWrapperOptions['stdout']): number {\n return stdout?.columns && stdout.columns > 0 ? stdout.columns : DEFAULT_COLUMNS;\n}\n\nfunction getRows(stdout: PtyWrapperOptions['stdout']): number {\n return stdout?.rows && stdout.rows > 0 ? stdout.rows : DEFAULT_ROWS;\n}\n\nfunction forwardSignal(terminal: pty.IPty, signal: NodeJS.Signals): void {\n if (process.platform === 'win32') {\n terminal.kill();\n return;\n }\n\n terminal.kill(signal);\n}\n\nfunction ensureSpawnHelperExecutable(): void {\n if (process.platform === 'win32') {\n return;\n }\n\n const candidates = [\n join(nodePtyPackageDirectory, 'prebuilds', `${process.platform}-${process.arch}`, 'spawn-helper'),\n join(nodePtyPackageDirectory, 'build', 'Release', 'spawn-helper'),\n join(nodePtyPackageDirectory, 'build', 'Debug', 'spawn-helper'),\n ];\n\n for (const helperPath of candidates) {\n if (!existsSync(helperPath)) {\n continue;\n }\n\n const currentMode = statSync(helperPath).mode & 0o777;\n if ((currentMode & 0o111) !== 0) {\n return;\n }\n\n chmodSync(helperPath, currentMode | 0o755);\n return;\n }\n}\n\nexport async function runPtyCommand(\n command: string,\n args: string[],\n options: PtyWrapperOptions = {},\n): Promise<number> {\n const stdin = options.stdin ?? process.stdin;\n const stdout = options.stdout ?? process.stdout;\n const flushStdinData = options.flushStdinData ?? empty;\n const flushStdoutData = options.flushStdoutData ?? empty;\n const onStdinData = options.onStdinData ?? identity;\n const onStdoutData = options.onStdoutData ?? identity;\n const env = options.env ?? process.env;\n\n ensureSpawnHelperExecutable();\n\n const terminal = pty.spawn(command, args, {\n name: env.TERM ?? 'xterm-color',\n cols: getColumns(stdout),\n rows: getRows(stdout),\n cwd: options.cwd ?? process.cwd(),\n env,\n });\n\n let cleanedUp = false;\n const wasRawModeEnabled = Boolean(stdin.isRaw);\n const canToggleRawMode = Boolean(stdin.isTTY && typeof stdin.setRawMode === 'function');\n\n const syncWindowSize = (): void => {\n try {\n terminal.resize(getColumns(stdout), getRows(stdout));\n } catch {\n // 子进程已退出时,尺寸同步失败可直接忽略。\n }\n };\n\n const handleStdinData = (chunk: string | Buffer): void => {\n const nextData = onStdinData(chunk.toString());\n if (nextData.length > 0) {\n terminal.write(nextData);\n }\n };\n\n const handleStdinEnd = (): void => {\n const nextData = flushStdinData();\n if (nextData.length > 0) {\n terminal.write(nextData);\n }\n };\n\n const handleSigint = (): void => {\n forwardSignal(terminal, 'SIGINT');\n };\n\n const handleSigterm = (): void => {\n forwardSignal(terminal, 'SIGTERM');\n };\n\n const handleSigwinch = (): void => {\n syncWindowSize();\n };\n\n const stdoutDisposable = terminal.onData((data) => {\n const nextData = onStdoutData(data);\n if (nextData.length > 0) {\n stdout.write(nextData);\n }\n });\n\n const cleanup = (): void => {\n if (cleanedUp) {\n return;\n }\n\n cleanedUp = true;\n const finalStdout = flushStdoutData();\n if (finalStdout.length > 0) {\n stdout.write(finalStdout);\n }\n stdoutDisposable.dispose();\n stdin.removeListener('data', handleStdinData);\n stdin.removeListener('end', handleStdinEnd);\n process.removeListener('SIGINT', handleSigint);\n process.removeListener('SIGTERM', handleSigterm);\n process.removeListener('SIGWINCH', handleSigwinch);\n\n if (canToggleRawMode && !wasRawModeEnabled) {\n stdin.setRawMode?.(false);\n }\n\n stdin.pause();\n };\n\n stdin.on('data', handleStdinData);\n stdin.on('end', handleStdinEnd);\n stdin.resume();\n\n if (canToggleRawMode && !wasRawModeEnabled) {\n stdin.setRawMode?.(true);\n }\n\n process.on('SIGINT', handleSigint);\n process.on('SIGTERM', handleSigterm);\n process.on('SIGWINCH', handleSigwinch);\n\n try {\n return await new Promise<number>((resolve) => {\n terminal.onExit(({ exitCode }) => {\n cleanup();\n resolve(exitCode);\n });\n\n syncWindowSize();\n });\n } finally {\n cleanup();\n }\n}\n\nexport async function createPtyWrapper(\n command: string,\n args: string[],\n options?: PtyWrapperOptions,\n): Promise<void> {\n process.exitCode = await runPtyCommand(command, args, options);\n}\n","import type { ProxyTargets } from './types.js';\n\nconst DEFAULT_TARGETS: ProxyTargets = {\n anthropic: 'https://api.anthropic.com',\n openai: 'https://api.openai.com',\n};\n\nfunction trimTrailingSlash(value: string): string {\n return value.endsWith('/') ? value.slice(0, -1) : value;\n}\n\nexport function getDefaultProxyTargets(env: NodeJS.ProcessEnv = process.env): ProxyTargets {\n return {\n anthropic:\n env.__AIS_REAL_ANTHROPIC_URL ?? env.ANTHROPIC_BASE_URL ?? DEFAULT_TARGETS.anthropic,\n openai: env.__AIS_REAL_OPENAI_URL ?? env.OPENAI_BASE_URL ?? DEFAULT_TARGETS.openai,\n };\n}\n\nexport function buildProxyEnvironment(\n proxyBaseUrl: string,\n env: NodeJS.ProcessEnv = process.env,\n): NodeJS.ProcessEnv {\n const resolvedProxyUrl = trimTrailingSlash(proxyBaseUrl);\n\n return {\n ...env,\n ANTHROPIC_BASE_URL: resolvedProxyUrl,\n OPENAI_BASE_URL: resolvedProxyUrl,\n __AIS_REAL_ANTHROPIC_URL:\n env.__AIS_REAL_ANTHROPIC_URL ??\n env.ANTHROPIC_BASE_URL ??\n DEFAULT_TARGETS.anthropic,\n __AIS_REAL_OPENAI_URL:\n env.__AIS_REAL_OPENAI_URL ?? env.OPENAI_BASE_URL ?? DEFAULT_TARGETS.openai,\n };\n}\n\nexport { DEFAULT_TARGETS as DEFAULT_PROXY_TARGETS };\n","import {\n createServer,\n request as createHttpRequest,\n type IncomingHttpHeaders,\n type IncomingMessage,\n type OutgoingHttpHeaders,\n type RequestOptions,\n type Server,\n type ServerResponse,\n STATUS_CODES,\n} from 'node:http';\nimport { randomUUID } from 'node:crypto';\nimport { mkdir, writeFile } from 'node:fs/promises';\nimport { request as createHttpsRequest } from 'node:https';\nimport type { AddressInfo } from 'node:net';\nimport { join } from 'node:path';\nimport type { Duplex } from 'node:stream';\n\nimport { StreamReplacer } from '../interceptor/stream-replacer.js';\nimport { SessionVault } from '../vault/session-vault.js';\n\nimport { getDefaultProxyTargets } from './environment.js';\nimport {\n type ChatMessage,\n createResponsesCompatibilityStatusBody,\n ResponsesCompatibilitySseTransformer,\n ResponsesCompatibilityStore,\n translateChatCompletionJsonToResponses,\n translateResponsesRequest,\n} from './responses-compat.js';\nimport { relayWebSocket } from './websocket-relay.js';\nimport type { ProxyProvider, ProxyTargets } from './types.js';\n\nconst DEFAULT_HOST = '127.0.0.1';\nconst DEFAULT_PORT = 18080;\nconst DEFAULT_PUBLIC_HOST = 'localhost';\nconst DEFAULT_TIMEOUT_MS = 120_000;\nconst DEFAULT_MAX_PORT_ATTEMPTS = 20;\nconst HOP_BY_HOP_HEADERS = new Set([\n 'connection',\n 'keep-alive',\n 'proxy-authenticate',\n 'proxy-authorization',\n 'proxy-connection',\n 'te',\n 'trailer',\n 'transfer-encoding',\n 'upgrade',\n]);\n\nconst WEBSOCKET_REQUEST_HEADERS_TO_DROP = new Set([\n 'content-length',\n 'keep-alive',\n 'proxy-authenticate',\n 'proxy-authorization',\n 'proxy-connection',\n 'sec-websocket-extensions',\n 'te',\n 'trailer',\n 'transfer-encoding',\n]);\n\nconst CAPTURE_REDACTED_HEADERS = new Set([\n 'authorization',\n 'cookie',\n 'proxy-authorization',\n 'set-cookie',\n 'x-api-key',\n]);\n\ninterface TextFieldTemplate {\n apply: (payload: unknown, value: string) => void;\n payload: unknown;\n}\n\ninterface ResolvedTarget {\n provider: ProxyProvider;\n url: URL;\n}\n\ninterface SseTrackedField {\n apply: (value: string) => void;\n key: string;\n template: TextFieldTemplate;\n value: string;\n}\n\nexport interface ProxyOptions {\n captureDir?: string;\n defaultProvider?: ProxyProvider;\n host?: string;\n maxPortAttempts?: number;\n onRequestText?: (body: string) => void;\n port?: number;\n publicHost?: string;\n targetBaseUrl?: string;\n targets?: Partial<ProxyTargets>;\n timeoutMs?: number;\n vault: SessionVault;\n}\n\nfunction cloneJsonValue<T>(value: T): T {\n return JSON.parse(JSON.stringify(value)) as T;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction getFirstHeaderValue(value: string | string[] | undefined): string | undefined {\n if (Array.isArray(value)) {\n return value[0];\n }\n\n return value;\n}\n\nfunction isTextBasedContentType(headers: IncomingHttpHeaders): boolean {\n const contentType = getFirstHeaderValue(headers['content-type'])?.toLowerCase();\n if (!contentType) {\n return true;\n }\n\n return (\n contentType.startsWith('text/') ||\n contentType.includes('application/json') ||\n contentType.includes('+json') ||\n contentType.includes('application/x-ndjson')\n );\n}\n\nfunction isSseResponse(headers: IncomingHttpHeaders): boolean {\n const contentType = getFirstHeaderValue(headers['content-type'])?.toLowerCase();\n return contentType?.includes('text/event-stream') ?? false;\n}\n\nfunction copyHeaders(\n headers: IncomingHttpHeaders,\n options: { preserveUpgradeHeaders?: boolean } = {},\n): OutgoingHttpHeaders {\n const result: OutgoingHttpHeaders = {};\n\n for (const [key, value] of Object.entries(headers)) {\n const normalizedKey = key.toLowerCase();\n const keepUpgradeHeader =\n options.preserveUpgradeHeaders === true &&\n (normalizedKey === 'connection' || normalizedKey === 'upgrade');\n\n if (value === undefined || (HOP_BY_HOP_HEADERS.has(normalizedKey) && !keepUpgradeHeader)) {\n continue;\n }\n\n result[key] = value;\n }\n\n return result;\n}\n\nfunction buildUpstreamHeaders(\n headers: IncomingHttpHeaders,\n targetUrl: URL,\n body: Buffer,\n): OutgoingHttpHeaders {\n const result = copyHeaders(headers);\n result.host = targetUrl.host;\n result['accept-encoding'] = 'identity';\n\n if (body.length > 0) {\n result['content-length'] = String(body.length);\n } else {\n delete result['content-length'];\n }\n\n return result;\n}\n\nfunction stripResponsesCompatibilityHeaders(headers: OutgoingHttpHeaders): OutgoingHttpHeaders {\n const result: OutgoingHttpHeaders = {};\n\n for (const [key, value] of Object.entries(headers)) {\n if (key.toLowerCase() === 'openai-beta') {\n continue;\n }\n\n result[key] = value;\n }\n\n return result;\n}\n\nfunction normalizeHeadersForCapture(\n headers: IncomingHttpHeaders | OutgoingHttpHeaders,\n): Record<string, string | string[]> {\n return Object.fromEntries(\n Object.entries(headers)\n .filter(([, value]) => value !== undefined)\n .map(([key, value]) => {\n if (CAPTURE_REDACTED_HEADERS.has(key.toLowerCase())) {\n return [key, '<redacted>'];\n }\n\n if (Array.isArray(value)) {\n return [key, value.map((entry) => String(entry))];\n }\n\n return [key, String(value)];\n }),\n );\n}\n\nfunction parseJsonForCapture(text: string): unknown {\n if (text.length === 0) {\n return null;\n }\n\n try {\n return JSON.parse(text) as unknown;\n } catch {\n return text;\n }\n}\n\ninterface ResponsesCompatibilityCaptureContext {\n clientHeaders: Record<string, string | string[]>;\n clientPath: string;\n clientRequestBody: unknown;\n translatedRequestBody: unknown;\n translatedRequestHeaders: Record<string, string | string[]>;\n translatedUpstreamUrl: string;\n}\n\nfunction buildUpstreamWebSocketHeaders(headers: IncomingHttpHeaders): OutgoingHttpHeaders {\n const result = copyHeaders(headers, { preserveUpgradeHeaders: true });\n result['accept-encoding'] = 'identity';\n result.connection = getFirstHeaderValue(headers.connection) ?? 'Upgrade';\n result.upgrade = getFirstHeaderValue(headers.upgrade) ?? 'websocket';\n\n for (const key of WEBSOCKET_REQUEST_HEADERS_TO_DROP) {\n delete result[key];\n }\n\n return result;\n}\n\nfunction buildClientHeaders(\n headers: IncomingHttpHeaders,\n contentLength?: number,\n): OutgoingHttpHeaders {\n const result = copyHeaders(headers);\n\n if (contentLength === undefined) {\n delete result['content-length'];\n } else {\n result['content-length'] = String(contentLength);\n }\n\n return result;\n}\n\nfunction formatRawHeaderLines(headers: OutgoingHttpHeaders): string {\n let output = '';\n\n for (const [key, value] of Object.entries(headers)) {\n if (value === undefined) {\n continue;\n }\n\n if (Array.isArray(value)) {\n value.forEach((entry) => {\n output += `${key}: ${entry}\\r\\n`;\n });\n continue;\n }\n\n output += `${key}: ${String(value)}\\r\\n`;\n }\n\n return output;\n}\n\nfunction writeRawHttpResponse(options: {\n body?: Buffer;\n headers?: OutgoingHttpHeaders;\n socket: Duplex;\n statusCode: number;\n statusMessage: string;\n version?: string;\n}): void {\n const {\n body = Buffer.alloc(0),\n headers = {},\n socket,\n statusCode,\n statusMessage,\n version = '1.1',\n } = options;\n const headerBlock = formatRawHeaderLines(headers);\n socket.write(`HTTP/${version} ${statusCode} ${statusMessage}\\r\\n${headerBlock}\\r\\n`);\n if (body.length > 0) {\n socket.write(body);\n }\n}\n\nfunction buildUpstreamUrl(baseUrl: string, requestPath: string): URL {\n const base = new URL(baseUrl);\n const requestUrl = new URL(requestPath, 'http://ais.local');\n const normalizedBasePath = base.pathname.endsWith('/')\n ? base.pathname.slice(0, -1)\n : base.pathname;\n\n base.pathname = `${normalizedBasePath}${requestUrl.pathname}`.replace(/\\/{2,}/g, '/');\n base.search = requestUrl.search;\n\n return base;\n}\n\nfunction normalizeRequestPath(value: string): string {\n if (value.length === 0) {\n return '/';\n }\n\n return value.startsWith('/') ? value : `/${value}`;\n}\n\nfunction isResponsesCompatibilityRoot(path: string): boolean {\n const lowerPath = path.toLowerCase();\n return lowerPath === '/v1/responses' || lowerPath === '/responses';\n}\n\nfunction getResponsesCompatibilityResponseId(path: string): string | null {\n const lowerPath = path.toLowerCase();\n const match = lowerPath.match(/^\\/(?:v1\\/)?responses\\/([^/]+)$/);\n return match ? match[1] : null;\n}\n\nfunction stripProviderPrefix(path: string, provider: ProxyProvider): string {\n const prefix = `/${provider}`;\n\n if (path === prefix) {\n return '/';\n }\n\n if (path.startsWith(`${prefix}/`)) {\n return path.slice(prefix.length);\n }\n\n return path;\n}\n\nfunction resolveConfiguredTargets(options: ProxyOptions): ProxyTargets {\n const targets = {\n ...getDefaultProxyTargets(),\n ...options.targets,\n };\n\n if (options.targetBaseUrl) {\n targets.anthropic = options.targetBaseUrl;\n targets.openai = options.targetBaseUrl;\n }\n\n return targets;\n}\n\nfunction resolveProvider(\n request: IncomingMessage,\n targets: ProxyTargets,\n defaultProvider?: ProxyProvider,\n): ResolvedTarget {\n const requestPath = normalizeRequestPath(request.url ?? '/');\n\n if (requestPath === '/health') {\n throw new Error('Health requests should not be resolved as upstream targets');\n }\n\n const anthropicTarget = stripProviderPrefix(requestPath, 'anthropic') !== requestPath;\n if (anthropicTarget) {\n return {\n provider: 'anthropic',\n url: buildUpstreamUrl(targets.anthropic, stripProviderPrefix(requestPath, 'anthropic')),\n };\n }\n\n const openAiTarget = stripProviderPrefix(requestPath, 'openai') !== requestPath;\n if (openAiTarget) {\n return {\n provider: 'openai',\n url: buildUpstreamUrl(targets.openai, stripProviderPrefix(requestPath, 'openai')),\n };\n }\n\n const lowerPath = requestPath.toLowerCase();\n const anthropicHeadersPresent =\n getFirstHeaderValue(request.headers['anthropic-version']) !== undefined ||\n getFirstHeaderValue(request.headers['x-api-key']) !== undefined;\n const openAiHeadersPresent =\n getFirstHeaderValue(request.headers.authorization) !== undefined ||\n getFirstHeaderValue(request.headers['openai-organization']) !== undefined ||\n getFirstHeaderValue(request.headers['openai-beta']) !== undefined;\n\n if (anthropicHeadersPresent) {\n return {\n provider: 'anthropic',\n url: buildUpstreamUrl(targets.anthropic, requestPath),\n };\n }\n\n if (openAiHeadersPresent) {\n return {\n provider: 'openai',\n url: buildUpstreamUrl(targets.openai, requestPath),\n };\n }\n\n if (lowerPath.startsWith('/v1/messages') || lowerPath.startsWith('/v1/complete')) {\n return {\n provider: 'anthropic',\n url: buildUpstreamUrl(targets.anthropic, requestPath),\n };\n }\n\n if (\n lowerPath.startsWith('/v1/chat/') ||\n lowerPath.startsWith('/v1/completions') ||\n lowerPath.startsWith('/v1/responses') ||\n lowerPath.startsWith('/responses') ||\n lowerPath.startsWith('/v1/embeddings') ||\n lowerPath.startsWith('/v1/audio')\n ) {\n return {\n provider: 'openai',\n url: buildUpstreamUrl(targets.openai, requestPath),\n };\n }\n\n if (defaultProvider) {\n return {\n provider: defaultProvider,\n url: buildUpstreamUrl(targets[defaultProvider], requestPath),\n };\n }\n\n throw new Error(`Unable to determine upstream provider for request path: ${requestPath}`);\n}\n\nfunction applyWholeBodyReplacement(body: Buffer, replacements: Map<string, string>): Buffer {\n if (body.length === 0 || replacements.size === 0) {\n return body;\n }\n\n const replacer = new StreamReplacer(replacements);\n const replaced = replacer.push(body.toString('utf8')) + replacer.flush();\n\n return Buffer.from(replaced, 'utf8');\n}\n\nclass SseFieldReplacer {\n private buffer = '';\n private readonly prefixes: Set<string>;\n private readonly sources: string[];\n\n constructor(private readonly replacements: Map<string, string>) {\n this.sources = Array.from(replacements.keys()).sort((left, right) => {\n if (right.length !== left.length) {\n return right.length - left.length;\n }\n\n return left.localeCompare(right);\n });\n this.prefixes = new Set(\n this.sources.flatMap((source) =>\n Array.from({ length: Math.max(0, source.length - 1) }, (_, index) =>\n source.slice(0, index + 1),\n ),\n ),\n );\n }\n\n push(chunk: string): string {\n const input = this.buffer + chunk;\n\n if (this.sources.length === 0) {\n this.buffer = '';\n return input;\n }\n\n const tentativeLimit = input.length - this.getLookbehindLength(input);\n if (tentativeLimit <= 0) {\n this.buffer = input;\n return '';\n }\n\n const safeLimit = this.getSafeLimit(input, tentativeLimit);\n this.buffer = input.slice(safeLimit);\n\n return this.replaceText(input.slice(0, safeLimit));\n }\n\n flush(): string {\n if (this.buffer.length === 0) {\n return '';\n }\n\n const value = this.replaceText(this.buffer);\n this.buffer = '';\n return value;\n }\n\n private getLookbehindLength(input: string): number {\n const longestCandidate = Math.min(\n input.length,\n Math.max(0, ...this.sources.map((source) => source.length - 1)),\n );\n\n for (let length = longestCandidate; length > 0; length -= 1) {\n if (this.prefixes.has(input.slice(-length))) {\n return length;\n }\n }\n\n return 0;\n }\n\n private getSafeLimit(input: string, tentativeLimit: number): number {\n let safeLimit = tentativeLimit;\n let changed = true;\n\n while (changed) {\n changed = false;\n\n for (const source of this.sources) {\n const searchFrom = Math.min(input.length - 1, Math.max(0, safeLimit - 1));\n const matchStart = input.lastIndexOf(source, searchFrom);\n\n if (matchStart !== -1 && matchStart < safeLimit && matchStart + source.length > safeLimit) {\n safeLimit = matchStart;\n changed = true;\n }\n }\n }\n\n return safeLimit;\n }\n\n private replaceText(value: string): string {\n if (value.length === 0) {\n return '';\n }\n\n return applyWholeBodyReplacement(Buffer.from(value, 'utf8'), this.replacements).toString('utf8');\n }\n}\n\nfunction setAnthropicTrackedField(payload: Record<string, unknown>, field: string, value: string): void {\n if (field === 'completion') {\n payload.completion = value;\n return;\n }\n\n const [containerKey, nestedKey] = field.split('.');\n const container = payload[containerKey];\n if (!isRecord(container)) {\n return;\n }\n\n container[nestedKey] = value;\n}\n\nfunction clearAnthropicTrackedFields(payload: Record<string, unknown>): void {\n if (typeof payload.completion === 'string') {\n payload.completion = '';\n }\n\n if (isRecord(payload.delta) && typeof payload.delta.text === 'string') {\n payload.delta.text = '';\n }\n\n if (isRecord(payload.delta) && typeof payload.delta.partial_json === 'string') {\n payload.delta.partial_json = '';\n }\n\n if (isRecord(payload.content_block) && typeof payload.content_block.text === 'string') {\n payload.content_block.text = '';\n }\n}\n\nfunction createAnthropicFields(payload: Record<string, unknown>): SseTrackedField[] {\n const tracked: SseTrackedField[] = [];\n const index = typeof payload.index === 'number' ? payload.index : 0;\n\n const createTemplate = (field: string): TextFieldTemplate => {\n const templatePayload = cloneJsonValue(payload);\n clearAnthropicTrackedFields(templatePayload);\n\n return {\n payload: templatePayload,\n apply: (draft, value) => {\n if (!isRecord(draft)) {\n return;\n }\n\n setAnthropicTrackedField(draft, field, value);\n },\n };\n };\n\n if (isRecord(payload.delta) && typeof payload.delta.text === 'string') {\n tracked.push({\n key: `anthropic:${index}:delta.text`,\n value: payload.delta.text,\n apply: (value) => {\n if (isRecord(payload.delta)) {\n payload.delta.text = value;\n }\n },\n template: createTemplate('delta.text'),\n });\n }\n\n if (isRecord(payload.delta) && typeof payload.delta.partial_json === 'string') {\n tracked.push({\n key: `anthropic:${index}:delta.partial_json`,\n value: payload.delta.partial_json,\n apply: (value) => {\n if (isRecord(payload.delta)) {\n payload.delta.partial_json = value;\n }\n },\n template: createTemplate('delta.partial_json'),\n });\n }\n\n if (isRecord(payload.content_block) && typeof payload.content_block.text === 'string') {\n tracked.push({\n key: `anthropic:${index}:content_block.text`,\n value: payload.content_block.text,\n apply: (value) => {\n if (isRecord(payload.content_block)) {\n payload.content_block.text = value;\n }\n },\n template: createTemplate('content_block.text'),\n });\n }\n\n if (typeof payload.completion === 'string') {\n tracked.push({\n key: 'anthropic:completion',\n value: payload.completion,\n apply: (value) => {\n payload.completion = value;\n },\n template: createTemplate('completion'),\n });\n }\n\n return tracked;\n}\n\nfunction clearOpenAiTrackedFields(payload: Record<string, unknown>): void {\n if (!Array.isArray(payload.choices)) {\n return;\n }\n\n payload.choices.forEach((choice) => {\n if (!isRecord(choice)) {\n return;\n }\n\n if (typeof choice.text === 'string') {\n choice.text = '';\n }\n\n if (isRecord(choice.delta) && typeof choice.delta.content === 'string') {\n choice.delta.content = '';\n }\n\n if (\n isRecord(choice.delta) &&\n isRecord(choice.delta.function_call) &&\n typeof choice.delta.function_call.arguments === 'string'\n ) {\n choice.delta.function_call.arguments = '';\n }\n\n if (isRecord(choice.delta) && Array.isArray(choice.delta.tool_calls)) {\n choice.delta.tool_calls.forEach((toolCall) => {\n if (!isRecord(toolCall) || !isRecord(toolCall.function)) {\n return;\n }\n\n if (typeof toolCall.function.arguments === 'string') {\n toolCall.function.arguments = '';\n }\n });\n }\n });\n}\n\nfunction setOpenAiTrackedField(\n payload: Record<string, unknown>,\n choiceIndex: number,\n fieldPath: string,\n value: string,\n): void {\n if (!Array.isArray(payload.choices)) {\n return;\n }\n\n const choice = payload.choices.find((item, index) => {\n if (!isRecord(item)) {\n return false;\n }\n\n if (typeof item.index === 'number') {\n return item.index === choiceIndex;\n }\n\n return index === choiceIndex;\n });\n\n if (!isRecord(choice)) {\n return;\n }\n\n if (fieldPath === 'text') {\n choice.text = value;\n return;\n }\n\n if (fieldPath === 'delta.content') {\n if (isRecord(choice.delta)) {\n choice.delta.content = value;\n }\n\n return;\n }\n\n if (fieldPath === 'delta.function_call.arguments') {\n if (isRecord(choice.delta) && isRecord(choice.delta.function_call)) {\n choice.delta.function_call.arguments = value;\n }\n\n return;\n }\n\n const toolCallMatch = fieldPath.match(/^delta\\.tool_calls\\.(\\d+)\\.function\\.arguments$/);\n if (!toolCallMatch) {\n return;\n }\n\n const toolCallIndex = Number(toolCallMatch[1]);\n if (!isRecord(choice.delta) || !Array.isArray(choice.delta.tool_calls)) {\n return;\n }\n\n const toolCall = choice.delta.tool_calls[toolCallIndex];\n if (!isRecord(toolCall) || !isRecord(toolCall.function)) {\n return;\n }\n\n toolCall.function.arguments = value;\n}\n\nfunction createOpenAiFields(payload: Record<string, unknown>): SseTrackedField[] {\n if (!Array.isArray(payload.choices)) {\n return [];\n }\n\n const tracked: SseTrackedField[] = [];\n\n payload.choices.forEach((choice, position) => {\n if (!isRecord(choice)) {\n return;\n }\n\n const choiceIndex = typeof choice.index === 'number' ? choice.index : position;\n const createTemplate = (fieldPath: string): TextFieldTemplate => {\n const templatePayload = cloneJsonValue(payload);\n clearOpenAiTrackedFields(templatePayload);\n\n return {\n payload: templatePayload,\n apply: (draft, value) => {\n if (!isRecord(draft)) {\n return;\n }\n\n setOpenAiTrackedField(draft, choiceIndex, fieldPath, value);\n },\n };\n };\n\n if (typeof choice.text === 'string') {\n tracked.push({\n key: `openai:${choiceIndex}:text`,\n value: choice.text,\n apply: (value) => {\n choice.text = value;\n },\n template: createTemplate('text'),\n });\n }\n\n if (isRecord(choice.delta) && typeof choice.delta.content === 'string') {\n tracked.push({\n key: `openai:${choiceIndex}:delta.content`,\n value: choice.delta.content,\n apply: (value) => {\n if (isRecord(choice.delta)) {\n choice.delta.content = value;\n }\n },\n template: createTemplate('delta.content'),\n });\n }\n\n if (\n isRecord(choice.delta) &&\n isRecord(choice.delta.function_call) &&\n typeof choice.delta.function_call.arguments === 'string'\n ) {\n tracked.push({\n key: `openai:${choiceIndex}:delta.function_call.arguments`,\n value: choice.delta.function_call.arguments,\n apply: (value) => {\n if (isRecord(choice.delta) && isRecord(choice.delta.function_call)) {\n choice.delta.function_call.arguments = value;\n }\n },\n template: createTemplate('delta.function_call.arguments'),\n });\n }\n\n if (isRecord(choice.delta) && Array.isArray(choice.delta.tool_calls)) {\n choice.delta.tool_calls.forEach((toolCall, toolCallIndex) => {\n if (!isRecord(toolCall) || !isRecord(toolCall.function)) {\n return;\n }\n\n if (typeof toolCall.function.arguments !== 'string') {\n return;\n }\n\n tracked.push({\n key: `openai:${choiceIndex}:delta.tool_calls.${toolCallIndex}.function.arguments`,\n value: toolCall.function.arguments,\n apply: (value) => {\n if (\n isRecord(choice.delta) &&\n Array.isArray(choice.delta.tool_calls) &&\n isRecord(choice.delta.tool_calls[toolCallIndex]) &&\n isRecord(choice.delta.tool_calls[toolCallIndex].function)\n ) {\n choice.delta.tool_calls[toolCallIndex].function.arguments = value;\n }\n },\n template: createTemplate(`delta.tool_calls.${toolCallIndex}.function.arguments`),\n });\n });\n }\n });\n\n return tracked;\n}\n\nclass SseTransformer {\n private buffer = '';\n private readonly replacers = new Map<string, SseFieldReplacer>();\n private readonly templates = new Map<string, TextFieldTemplate>();\n\n constructor(\n private readonly provider: ProxyProvider,\n private readonly replacements: Map<string, string>,\n ) {}\n\n push(chunk: string): string {\n const input = this.buffer + chunk;\n const parts = input.split(/(\\r?\\n)/);\n const lastPart = parts.pop();\n this.buffer = lastPart ?? '';\n\n let output = '';\n\n for (let index = 0; index < parts.length; index += 2) {\n const line = parts[index] ?? '';\n const separator = parts[index + 1] ?? '';\n output += this.transformLine(line) + separator;\n }\n\n return output;\n }\n\n flush(): string {\n let output = '';\n\n if (this.buffer.length > 0) {\n output += this.transformLine(this.buffer);\n this.buffer = '';\n }\n\n for (const [key, replacer] of this.replacers.entries()) {\n const remaining = replacer.flush();\n if (remaining.length === 0) {\n continue;\n }\n\n const template = this.templates.get(key);\n if (!template) {\n continue;\n }\n\n const payload = cloneJsonValue(template.payload);\n template.apply(payload, remaining);\n output += `data: ${JSON.stringify(payload)}\\n\\n`;\n }\n\n return output;\n }\n\n private getFields(payload: Record<string, unknown>): SseTrackedField[] {\n if (this.provider === 'anthropic') {\n return createAnthropicFields(payload);\n }\n\n return createOpenAiFields(payload);\n }\n\n private getReplacer(key: string): SseFieldReplacer {\n const existing = this.replacers.get(key);\n if (existing) {\n return existing;\n }\n\n const created = new SseFieldReplacer(this.replacements);\n this.replacers.set(key, created);\n return created;\n }\n\n private transformLine(line: string): string {\n if (!line.startsWith('data:')) {\n return line;\n }\n\n const prefix = line.startsWith('data: ') ? 'data: ' : 'data:';\n const payload = line.slice(prefix.length);\n\n if (payload === '[DONE]') {\n return line;\n }\n\n try {\n const parsed = JSON.parse(payload) as unknown;\n if (!isRecord(parsed)) {\n return line;\n }\n\n const fields = this.getFields(parsed);\n if (fields.length === 0) {\n return line;\n }\n\n fields.forEach((field) => {\n const replacer = this.getReplacer(field.key);\n const replaced = replacer.push(field.value);\n field.apply(replaced);\n this.templates.set(field.key, field.template);\n });\n\n return `${prefix}${JSON.stringify(parsed)}`;\n } catch {\n return line;\n }\n }\n}\n\nasync function readRequestBody(request: IncomingMessage): Promise<Buffer> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n\n request.on('data', (chunk: Buffer | string) => {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n });\n\n request.once('end', () => {\n resolve(Buffer.concat(chunks));\n });\n request.once('error', reject);\n request.once('aborted', () => {\n reject(new Error('Client request was aborted'));\n });\n });\n}\n\nfunction sendProxyError(response: ServerResponse, statusCode: number, message: string): void {\n const body = JSON.stringify({ error: message });\n\n response.writeHead(statusCode, {\n 'content-length': String(Buffer.byteLength(body)),\n 'content-type': 'application/json; charset=utf-8',\n });\n response.end(body);\n}\n\nexport class ProxyServer {\n private activePort: number | null = null;\n private readonly activeUpgradeSockets = new Set<Duplex>();\n private readonly captureDir?: string;\n private readonly defaultProvider?: ProxyProvider;\n private readonly host: string;\n private readonly maxPortAttempts: number;\n private readonly port: number;\n private readonly publicHost: string;\n private readonly responsesCompatibilityStore = new ResponsesCompatibilityStore();\n private server: Server | null = null;\n private readonly targets: ProxyTargets;\n private readonly timeoutMs: number;\n\n constructor(private readonly options: ProxyOptions) {\n this.captureDir = options.captureDir ?? process.env.AIS_PROXY_CAPTURE_DIR;\n this.defaultProvider = options.defaultProvider;\n this.host = options.host ?? DEFAULT_HOST;\n this.maxPortAttempts = options.maxPortAttempts ?? DEFAULT_MAX_PORT_ATTEMPTS;\n this.port = options.port ?? DEFAULT_PORT;\n this.publicHost = options.publicHost ?? DEFAULT_PUBLIC_HOST;\n this.targets = resolveConfiguredTargets(options);\n this.timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n }\n\n getBaseUrl(): string {\n const currentPort = this.activePort ?? this.port;\n return `http://${this.publicHost}:${currentPort}`;\n }\n\n async start(): Promise<number> {\n if (this.server && this.activePort !== null) {\n return this.activePort;\n }\n\n let nextPort = this.port;\n let attemptsRemaining = this.maxPortAttempts;\n\n while (attemptsRemaining > 0) {\n const server = createServer((request, response) => {\n void this.handleRequest(request, response);\n });\n server.on('upgrade', (request, socket, head) => {\n void this.handleUpgrade(request, socket, head);\n });\n\n try {\n const listeningPort = await new Promise<number>((resolve, reject) => {\n const onError = (error: Error & { code?: string }) => {\n server.removeListener('listening', onListening);\n reject(error);\n };\n const onListening = () => {\n server.removeListener('error', onError);\n const address = server.address() as AddressInfo | null;\n resolve(address?.port ?? nextPort);\n };\n\n server.once('error', onError);\n server.once('listening', onListening);\n server.listen(nextPort, this.host);\n });\n\n this.server = server;\n this.activePort = listeningPort;\n return listeningPort;\n } catch (error) {\n await new Promise<void>((resolve) => {\n server.close(() => resolve());\n });\n\n const code = error instanceof Error && 'code' in error ? error.code : undefined;\n if (code !== 'EADDRINUSE') {\n throw error;\n }\n\n attemptsRemaining -= 1;\n nextPort += 1;\n }\n }\n\n throw new Error(`Unable to start proxy after ${this.maxPortAttempts} port attempts`);\n }\n\n async stop(): Promise<void> {\n if (!this.server) {\n return;\n }\n\n const server = this.server;\n this.server = null;\n this.activePort = null;\n\n for (const socket of this.activeUpgradeSockets) {\n socket.destroy();\n }\n this.activeUpgradeSockets.clear();\n this.responsesCompatibilityStore.clear();\n\n await new Promise<void>((resolve, reject) => {\n server.close((error) => {\n if (error) {\n reject(error);\n return;\n }\n\n resolve();\n });\n });\n }\n\n private async handleUpgrade(\n request: IncomingMessage,\n clientSocket: Duplex,\n head: Buffer,\n ): Promise<void> {\n const path = normalizeRequestPath(request.url ?? '/');\n\n if (path === '/health') {\n this.sendUpgradeError(clientSocket, 400, 'Health requests do not support upgrade');\n clientSocket.end();\n return;\n }\n\n let target: ResolvedTarget;\n try {\n target = resolveProvider(request, this.targets, this.defaultProvider);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Failed to resolve upstream target';\n this.sendUpgradeError(clientSocket, 502, message);\n clientSocket.end();\n return;\n }\n\n const requestFactory = target.url.protocol === 'https:' ? createHttpsRequest : createHttpRequest;\n const headers = buildUpstreamWebSocketHeaders(request.headers);\n headers.host = target.url.host;\n\n const requestOptions: RequestOptions = {\n headers,\n hostname: target.url.hostname,\n method: request.method ?? 'GET',\n path: `${target.url.pathname}${target.url.search}`,\n port: target.url.port ? Number(target.url.port) : undefined,\n protocol: target.url.protocol,\n };\n\n clientSocket.once('error', () => undefined);\n\n await new Promise<void>((resolve) => {\n let settled = false;\n const upstreamRequest = requestFactory(requestOptions);\n\n upstreamRequest.setTimeout(this.timeoutMs, () => {\n upstreamRequest.destroy(new Error(`Upstream request timed out after ${this.timeoutMs}ms`));\n });\n\n upstreamRequest.once('upgrade', (upstreamResponse, upstreamSocket, upstreamHead) => {\n if (settled) {\n return;\n }\n\n settled = true;\n this.trackUpgradeSocket(clientSocket);\n this.trackUpgradeSocket(upstreamSocket);\n writeRawHttpResponse({\n headers: copyHeaders(upstreamResponse.headers, { preserveUpgradeHeaders: true }),\n socket: clientSocket,\n statusCode: upstreamResponse.statusCode ?? 101,\n statusMessage:\n upstreamResponse.statusMessage ?? STATUS_CODES[upstreamResponse.statusCode ?? 101] ?? 'Switching Protocols',\n version: upstreamResponse.httpVersion,\n });\n\n relayWebSocket({\n clientHead: head,\n clientSocket,\n clientToUpstreamReplacements: new Map(this.options.vault.getSecretToTokenPairs()),\n upstreamHead,\n upstreamSocket,\n upstreamToClientReplacements: new Map(this.options.vault.getTokenToSecretPairs()),\n });\n resolve();\n });\n\n upstreamRequest.once('response', (upstreamResponse) => {\n if (settled) {\n return;\n }\n\n settled = true;\n void this.forwardUpgradeFallbackResponse(upstreamResponse, clientSocket)\n .catch((error) => {\n if (!clientSocket.destroyed) {\n clientSocket.destroy(error instanceof Error ? error : undefined);\n }\n })\n .finally(resolve);\n });\n\n upstreamRequest.once('error', (error) => {\n if (settled) {\n return;\n }\n\n settled = true;\n const isTimeout = error.message.includes('timed out');\n this.sendUpgradeError(clientSocket, isTimeout ? 504 : 502, error.message);\n clientSocket.end();\n resolve();\n });\n\n upstreamRequest.end();\n });\n }\n\n private async handleRequest(request: IncomingMessage, response: ServerResponse): Promise<void> {\n const path = normalizeRequestPath(request.url ?? '/');\n\n if (path === '/health') {\n const body = JSON.stringify({ ok: true });\n response.writeHead(200, {\n 'content-length': String(Buffer.byteLength(body)),\n 'content-type': 'application/json; charset=utf-8',\n });\n response.end(body);\n return;\n }\n\n let target: ResolvedTarget;\n try {\n target = resolveProvider(request, this.targets, this.defaultProvider);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Failed to resolve upstream target';\n sendProxyError(response, 502, message);\n return;\n }\n\n if (target.provider === 'openai') {\n const handledRead = this.handleResponsesCompatibilityRead(request, response, path);\n if (handledRead) {\n return;\n }\n }\n\n try {\n const originalBody = await readRequestBody(request);\n const requestBody =\n originalBody.length > 0 && isTextBasedContentType(request.headers)\n ? this.inspectAndMaskTextBody(originalBody)\n : originalBody;\n\n if (\n target.provider === 'openai' &&\n request.method === 'POST' &&\n isResponsesCompatibilityRoot(path)\n ) {\n await this.forwardResponsesRequestWithFallback(request, response, target, requestBody);\n return;\n }\n\n await this.forwardRequest(request, response, target, requestBody);\n } catch (error) {\n if (!response.headersSent) {\n const message = error instanceof Error ? error.message : 'Proxy request failed';\n sendProxyError(response, 502, message);\n } else if (!response.writableEnded) {\n response.destroy(error instanceof Error ? error : undefined);\n }\n }\n }\n\n private handleResponsesCompatibilityRead(\n request: IncomingMessage,\n response: ServerResponse,\n path: string,\n ): boolean {\n if (request.method !== 'GET') {\n return false;\n }\n\n if (isResponsesCompatibilityRoot(path)) {\n const body = createResponsesCompatibilityStatusBody();\n response.writeHead(200, {\n 'content-length': String(Buffer.byteLength(body)),\n 'content-type': 'application/json; charset=utf-8',\n });\n response.end(body);\n return true;\n }\n\n const responseId = getResponsesCompatibilityResponseId(path);\n if (!responseId) {\n return false;\n }\n\n const storedResponse = this.responsesCompatibilityStore.getResponse(responseId);\n if (!storedResponse) {\n sendProxyError(response, 404, `Unknown compatibility response id: ${responseId}`);\n return true;\n }\n\n const body = JSON.stringify(storedResponse);\n response.writeHead(200, {\n 'content-length': String(Buffer.byteLength(body)),\n 'content-type': 'application/json; charset=utf-8',\n });\n response.end(body);\n return true;\n }\n\n private async forwardResponsesRequestWithFallback(\n clientRequest: IncomingMessage,\n clientResponse: ServerResponse,\n target: ResolvedTarget,\n body: Buffer,\n ): Promise<void> {\n const requestFactory =\n target.url.protocol === 'https:' ? createHttpsRequest : createHttpRequest;\n const directHeaders = buildUpstreamHeaders(clientRequest.headers, target.url, body);\n\n await new Promise<void>((resolve, reject) => {\n let settled = false;\n const upstreamRequest = requestFactory(\n {\n headers: directHeaders,\n hostname: target.url.hostname,\n method: clientRequest.method,\n path: `${target.url.pathname}${target.url.search}`,\n port: target.url.port ? Number(target.url.port) : undefined,\n protocol: target.url.protocol,\n },\n (upstreamResponse) => {\n const statusCode = upstreamResponse.statusCode ?? 200;\n const shouldFallback =\n statusCode >= 400 && (statusCode === 404 || statusCode === 405 || statusCode === 500);\n\n if (!shouldFallback) {\n void this.forwardResponse(target.provider, upstreamResponse, clientResponse)\n .then(() => {\n settled = true;\n resolve();\n })\n .catch((error) => {\n settled = true;\n reject(error);\n });\n return;\n }\n\n upstreamResponse.resume();\n void this.forwardTranslatedResponsesCompatibilityRequest(\n clientRequest,\n clientResponse,\n target,\n body,\n )\n .then(() => {\n settled = true;\n resolve();\n })\n .catch((error) => {\n settled = true;\n reject(error);\n });\n },\n );\n\n upstreamRequest.setTimeout(this.timeoutMs, () => {\n upstreamRequest.destroy(new Error(`Upstream request timed out after ${this.timeoutMs}ms`));\n });\n\n upstreamRequest.once('error', (error) => {\n if (settled) {\n return;\n }\n\n const isTimeout = error.message.includes('timed out');\n if (!clientResponse.headersSent) {\n sendProxyError(clientResponse, isTimeout ? 504 : 502, error.message);\n }\n\n reject(error);\n });\n\n upstreamRequest.write(body);\n upstreamRequest.end();\n });\n }\n\n private async forwardTranslatedResponsesCompatibilityRequest(\n clientRequest: IncomingMessage,\n clientResponse: ServerResponse,\n target: ResolvedTarget,\n body: Buffer,\n ): Promise<void> {\n const translated = translateResponsesRequest(body.toString('utf8'), this.responsesCompatibilityStore);\n const upstreamUrl = new URL(target.url.toString());\n upstreamUrl.pathname = upstreamUrl.pathname.replace(/\\/responses$/, '/chat/completions');\n upstreamUrl.search = '';\n\n const requestFactory =\n upstreamUrl.protocol === 'https:' ? createHttpsRequest : createHttpRequest;\n const translatedBodyText = JSON.stringify(translated.chatRequest);\n const upstreamBody = Buffer.from(translatedBodyText, 'utf8');\n const headers = stripResponsesCompatibilityHeaders(\n buildUpstreamHeaders(clientRequest.headers, upstreamUrl, upstreamBody),\n );\n const captureContext: ResponsesCompatibilityCaptureContext | undefined = this.captureDir\n ? {\n clientHeaders: normalizeHeadersForCapture(clientRequest.headers),\n clientPath: clientRequest.url ?? '/',\n clientRequestBody: parseJsonForCapture(body.toString('utf8')),\n translatedRequestBody: parseJsonForCapture(translatedBodyText),\n translatedRequestHeaders: normalizeHeadersForCapture(headers),\n translatedUpstreamUrl: upstreamUrl.toString(),\n }\n : undefined;\n\n await new Promise<void>((resolve, reject) => {\n let settled = false;\n const upstreamRequest = requestFactory(\n {\n headers,\n hostname: upstreamUrl.hostname,\n method: 'POST',\n path: upstreamUrl.pathname,\n port: upstreamUrl.port ? Number(upstreamUrl.port) : undefined,\n protocol: upstreamUrl.protocol,\n },\n (upstreamResponse) => {\n void this.forwardResponsesCompatibilityResponse(\n upstreamResponse,\n clientResponse,\n translated.messages,\n typeof translated.chatRequest.model === 'string' ? translated.chatRequest.model : undefined,\n captureContext,\n )\n .then(() => {\n settled = true;\n resolve();\n })\n .catch((error) => {\n settled = true;\n reject(error);\n });\n },\n );\n\n upstreamRequest.setTimeout(this.timeoutMs, () => {\n upstreamRequest.destroy(new Error(`Upstream request timed out after ${this.timeoutMs}ms`));\n });\n\n upstreamRequest.once('error', (error) => {\n if (settled) {\n return;\n }\n\n const isTimeout = error.message.includes('timed out');\n if (!clientResponse.headersSent) {\n sendProxyError(clientResponse, isTimeout ? 504 : 502, error.message);\n }\n\n reject(error);\n });\n\n upstreamRequest.write(upstreamBody);\n upstreamRequest.end();\n });\n }\n\n private async forwardResponsesCompatibilityResponse(\n upstreamResponse: IncomingMessage,\n clientResponse: ServerResponse,\n messages: ChatMessage[],\n model: string | undefined,\n captureContext?: ResponsesCompatibilityCaptureContext,\n ): Promise<void> {\n const upstreamStatusCode = upstreamResponse.statusCode ?? 200;\n const tokenToSecret = new Map(this.options.vault.getTokenToSecretPairs());\n\n if (isSseResponse(upstreamResponse.headers)) {\n const headers = buildClientHeaders(\n {\n ...upstreamResponse.headers,\n 'content-type': 'text/event-stream; charset=utf-8',\n },\n );\n clientResponse.writeHead(upstreamStatusCode, headers);\n\n const restoreTransformer = new SseTransformer('openai', tokenToSecret);\n const transformer = new ResponsesCompatibilitySseTransformer(messages, model);\n clientResponse.write(transformer.start());\n const rawChunks: string[] = [];\n\n await new Promise<void>((resolve, reject) => {\n upstreamResponse.on('data', (chunk: Buffer | string) => {\n const rawChunk = Buffer.isBuffer(chunk) ? chunk.toString('utf8') : chunk;\n rawChunks.push(rawChunk);\n const restoredChunk = restoreTransformer.push(rawChunk);\n const output = restoredChunk.length > 0 ? transformer.push(restoredChunk) : '';\n if (output.length > 0) {\n clientResponse.write(output);\n }\n });\n\n upstreamResponse.once('end', () => {\n void (async () => {\n const restoredTail = restoreTransformer.flush();\n if (restoredTail.length > 0) {\n const restoredOutput = transformer.push(restoredTail);\n if (restoredOutput.length > 0) {\n clientResponse.write(restoredOutput);\n }\n }\n const finalized = transformer.finish();\n if (captureContext) {\n await this.writeResponsesCompatibilityCapture(captureContext, {\n responseBody: rawChunks.join(''),\n responseHeaders: normalizeHeadersForCapture(upstreamResponse.headers),\n responseStatusCode: upstreamStatusCode,\n });\n }\n\n if (finalized.output.length > 0) {\n clientResponse.write(finalized.output);\n }\n this.responsesCompatibilityStore.set(finalized.responseId, {\n messages: finalized.storedMessages,\n response: finalized.response,\n });\n clientResponse.end();\n resolve();\n })().catch(reject);\n });\n upstreamResponse.once('error', reject);\n });\n return;\n }\n\n const chunks: Buffer[] = [];\n await new Promise<void>((resolve, reject) => {\n upstreamResponse.on('data', (chunk: Buffer | string) => {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n });\n upstreamResponse.once('end', resolve);\n upstreamResponse.once('error', reject);\n });\n\n const rawBodyText = Buffer.concat(chunks).toString('utf8');\n if (captureContext) {\n await this.writeResponsesCompatibilityCapture(captureContext, {\n responseBody: rawBodyText,\n responseHeaders: normalizeHeadersForCapture(upstreamResponse.headers),\n responseStatusCode: upstreamStatusCode,\n });\n }\n\n const restoredBodyText = applyWholeBodyReplacement(\n Buffer.from(rawBodyText, 'utf8'),\n tokenToSecret,\n ).toString('utf8');\n\n if (upstreamStatusCode >= 400) {\n clientResponse.writeHead(upstreamStatusCode, {\n 'content-length': String(Buffer.byteLength(restoredBodyText)),\n 'content-type':\n getFirstHeaderValue(upstreamResponse.headers['content-type']) ??\n 'application/json; charset=utf-8',\n });\n clientResponse.end(restoredBodyText);\n return;\n }\n\n const translated = translateChatCompletionJsonToResponses(restoredBodyText, messages);\n this.responsesCompatibilityStore.set(translated.responseId, {\n messages: translated.storedMessages,\n response: translated.response,\n });\n clientResponse.writeHead(upstreamStatusCode, {\n 'content-length': String(Buffer.byteLength(translated.bodyText)),\n 'content-type': 'application/json; charset=utf-8',\n });\n clientResponse.end(translated.bodyText);\n }\n\n private async forwardUpgradeFallbackResponse(\n upstreamResponse: IncomingMessage,\n clientSocket: Duplex,\n ): Promise<void> {\n const chunks: Buffer[] = [];\n await new Promise<void>((resolve, reject) => {\n upstreamResponse.on('data', (chunk: Buffer | string) => {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n });\n upstreamResponse.once('end', resolve);\n upstreamResponse.once('error', reject);\n });\n\n const tokenToSecret = new Map(this.options.vault.getTokenToSecretPairs());\n const body = isTextBasedContentType(upstreamResponse.headers)\n ? applyWholeBodyReplacement(Buffer.concat(chunks), tokenToSecret)\n : Buffer.concat(chunks);\n const headers = buildClientHeaders(upstreamResponse.headers, body.length);\n writeRawHttpResponse({\n body,\n headers,\n socket: clientSocket,\n statusCode: upstreamResponse.statusCode ?? 502,\n statusMessage: upstreamResponse.statusMessage ?? 'Bad Gateway',\n version: upstreamResponse.httpVersion,\n });\n clientSocket.end();\n }\n\n private sendUpgradeError(socket: Duplex, statusCode: number, message: string): void {\n const body = Buffer.from(JSON.stringify({ error: message }), 'utf8');\n writeRawHttpResponse({\n body,\n headers: {\n 'content-length': String(body.length),\n 'content-type': 'application/json; charset=utf-8',\n },\n socket,\n statusCode,\n statusMessage:\n statusCode === 400 ? 'Bad Request' : statusCode === 504 ? 'Gateway Timeout' : 'Bad Gateway',\n });\n }\n\n private trackUpgradeSocket(socket: Duplex): void {\n this.activeUpgradeSockets.add(socket);\n socket.once('close', () => {\n this.activeUpgradeSockets.delete(socket);\n });\n }\n\n private async forwardRequest(\n clientRequest: IncomingMessage,\n clientResponse: ServerResponse,\n target: ResolvedTarget,\n body: Buffer,\n ): Promise<void> {\n const requestFactory = target.url.protocol === 'https:' ? createHttpsRequest : createHttpRequest;\n const headers = buildUpstreamHeaders(clientRequest.headers, target.url, body);\n\n const requestOptions: RequestOptions = {\n headers,\n hostname: target.url.hostname,\n method: clientRequest.method,\n path: `${target.url.pathname}${target.url.search}`,\n port: target.url.port ? Number(target.url.port) : undefined,\n protocol: target.url.protocol,\n };\n\n await new Promise<void>((resolve, reject) => {\n let settled = false;\n const upstreamRequest = requestFactory(requestOptions, (upstreamResponse) => {\n const closeUpstream = () => {\n if (!clientResponse.writableEnded && !upstreamResponse.destroyed) {\n upstreamResponse.destroy();\n }\n };\n\n clientRequest.once('aborted', closeUpstream);\n clientResponse.once('close', closeUpstream);\n\n void this.forwardResponse(target.provider, upstreamResponse, clientResponse)\n .then(() => {\n settled = true;\n resolve();\n })\n .catch((error) => {\n settled = true;\n reject(error);\n });\n });\n\n upstreamRequest.setTimeout(this.timeoutMs, () => {\n upstreamRequest.destroy(new Error(`Upstream request timed out after ${this.timeoutMs}ms`));\n });\n\n upstreamRequest.once('error', (error) => {\n if (settled) {\n return;\n }\n\n const isTimeout = error.message.includes('timed out');\n if (!clientResponse.headersSent) {\n sendProxyError(clientResponse, isTimeout ? 504 : 502, error.message);\n }\n\n reject(error);\n });\n\n if (body.length > 0) {\n upstreamRequest.write(body);\n }\n\n upstreamRequest.end();\n });\n }\n\n private async forwardResponse(\n provider: ProxyProvider,\n upstreamResponse: IncomingMessage,\n clientResponse: ServerResponse,\n ): Promise<void> {\n const tokenToSecret = new Map(this.options.vault.getTokenToSecretPairs());\n\n if (isSseResponse(upstreamResponse.headers)) {\n const headers = buildClientHeaders(upstreamResponse.headers);\n clientResponse.writeHead(upstreamResponse.statusCode ?? 200, headers);\n\n const transformer = new SseTransformer(provider, tokenToSecret);\n await new Promise<void>((resolve, reject) => {\n upstreamResponse.on('data', (chunk: Buffer | string) => {\n const output = transformer.push(Buffer.isBuffer(chunk) ? chunk.toString('utf8') : chunk);\n if (output.length > 0) {\n clientResponse.write(output);\n }\n });\n\n upstreamResponse.once('end', () => {\n const remaining = transformer.flush();\n if (remaining.length > 0) {\n clientResponse.write(remaining);\n }\n\n clientResponse.end();\n resolve();\n });\n upstreamResponse.once('error', reject);\n });\n\n return;\n }\n\n if (!isTextBasedContentType(upstreamResponse.headers)) {\n clientResponse.writeHead(\n upstreamResponse.statusCode ?? 200,\n buildClientHeaders(upstreamResponse.headers),\n );\n\n await new Promise<void>((resolve, reject) => {\n upstreamResponse.on('data', (chunk) => {\n clientResponse.write(chunk);\n });\n upstreamResponse.once('end', () => {\n clientResponse.end();\n resolve();\n });\n upstreamResponse.once('error', reject);\n });\n\n return;\n }\n\n const chunks: Buffer[] = [];\n await new Promise<void>((resolve, reject) => {\n upstreamResponse.on('data', (chunk: Buffer | string) => {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n });\n upstreamResponse.once('end', resolve);\n upstreamResponse.once('error', reject);\n });\n\n const body = applyWholeBodyReplacement(Buffer.concat(chunks), tokenToSecret);\n const headers = buildClientHeaders(upstreamResponse.headers, body.length);\n clientResponse.writeHead(upstreamResponse.statusCode ?? 200, headers);\n clientResponse.end(body);\n }\n\n private inspectAndMaskTextBody(body: Buffer): Buffer {\n const text = body.toString('utf8');\n this.options.onRequestText?.(text);\n\n return applyWholeBodyReplacement(\n Buffer.from(text, 'utf8'),\n new Map(this.options.vault.getSecretToTokenPairs()),\n );\n }\n\n private async writeResponsesCompatibilityCapture(\n context: ResponsesCompatibilityCaptureContext,\n response: {\n responseBody: string;\n responseHeaders: Record<string, string | string[]>;\n responseStatusCode: number;\n },\n ): Promise<void> {\n if (!this.captureDir) {\n return;\n }\n\n try {\n await mkdir(this.captureDir, { recursive: true });\n const outputPath = join(\n this.captureDir,\n `responses-compat-${Date.now()}-${randomUUID().replace(/-/g, '')}.json`,\n );\n const payload = {\n clientHeaders: context.clientHeaders,\n clientPath: context.clientPath,\n clientRequestBody: context.clientRequestBody,\n responseBody: parseJsonForCapture(response.responseBody),\n responseHeaders: response.responseHeaders,\n responseStatusCode: response.responseStatusCode,\n translatedRequestBody: context.translatedRequestBody,\n translatedRequestHeaders: context.translatedRequestHeaders,\n translatedUpstreamUrl: context.translatedUpstreamUrl,\n };\n\n await writeFile(outputPath, `${JSON.stringify(payload, null, 2)}\\n`, 'utf8');\n } catch {\n // 证据落盘失败不能影响真实转发。\n }\n }\n}\n","import { randomUUID } from 'node:crypto';\n\nconst DEFAULT_RESPONSES_FALLBACK_MAX_TOKENS = 4096;\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction cloneValue<T>(value: T): T {\n return JSON.parse(JSON.stringify(value)) as T;\n}\n\ntype ChatMessageRole = 'assistant' | 'system' | 'tool' | 'user';\n\ninterface ChatToolCall {\n function: {\n arguments: string;\n name: string;\n };\n id: string;\n type: 'function';\n}\n\nexport interface ChatMessage {\n content: string | Array<Record<string, unknown>>;\n role: ChatMessageRole;\n tool_call_id?: string;\n tool_calls?: ChatToolCall[];\n}\n\nfunction normalizeChatRole(role: unknown): ChatMessageRole | undefined {\n if (role === 'assistant' || role === 'system' || role === 'tool' || role === 'user') {\n return role;\n }\n\n if (role === 'developer') {\n return 'system';\n }\n\n return undefined;\n}\n\ninterface StoredResponse {\n messages: ChatMessage[];\n response: Record<string, unknown>;\n}\n\nexport class ResponsesCompatibilityStore {\n private readonly responses = new Map<string, StoredResponse>();\n\n getMessages(responseId: string): ChatMessage[] | undefined {\n const stored = this.responses.get(responseId);\n return stored ? cloneValue(stored.messages) : undefined;\n }\n\n getResponse(responseId: string): Record<string, unknown> | undefined {\n const stored = this.responses.get(responseId);\n return stored ? cloneValue(stored.response) : undefined;\n }\n\n set(responseId: string, stored: StoredResponse): void {\n this.responses.set(responseId, {\n messages: cloneValue(stored.messages),\n response: cloneValue(stored.response),\n });\n }\n\n clear(): void {\n this.responses.clear();\n }\n}\n\nexport interface ResponsesCompatibilityRequest {\n chatRequest: Record<string, unknown>;\n messages: ChatMessage[];\n}\n\nexport interface ResponsesCompatibilityJsonResult {\n bodyText: string;\n response: Record<string, unknown>;\n responseId: string;\n storedMessages: ChatMessage[];\n}\n\ninterface ToolState {\n arguments: string;\n callId: string;\n itemId: string;\n name: string;\n outputIndex: number;\n}\n\nfunction toStringValue(value: unknown): string {\n if (typeof value === 'string') {\n return value;\n }\n\n if (value === undefined || value === null) {\n return '';\n }\n\n return JSON.stringify(value);\n}\n\nfunction normalizeContentParts(content: unknown): string | Array<Record<string, unknown>> {\n if (typeof content === 'string') {\n return content;\n }\n\n if (!Array.isArray(content)) {\n return toStringValue(content);\n }\n\n const parts = content.flatMap((entry): Array<Record<string, unknown>> => {\n if (!isRecord(entry)) {\n const text = toStringValue(entry);\n return text.length > 0 ? [{ type: 'text', text }] : [];\n }\n\n const type = typeof entry.type === 'string' ? entry.type : '';\n if (type === 'input_text' || type === 'output_text' || type === 'text') {\n const text = toStringValue(entry.text);\n return text.length > 0 ? [{ type: 'text', text }] : [];\n }\n\n if (type === 'input_image') {\n const imageUrl =\n typeof entry.image_url === 'string'\n ? entry.image_url\n : isRecord(entry.image_url) && typeof entry.image_url.url === 'string'\n ? entry.image_url.url\n : '';\n return imageUrl.length > 0 ? [{ type: 'image_url', image_url: { url: imageUrl } }] : [];\n }\n\n return [];\n });\n\n if (parts.length === 0) {\n return '';\n }\n\n if (parts.every((part) => part.type === 'text')) {\n return parts.map((part) => toStringValue(part.text)).join('');\n }\n\n return parts;\n}\n\nfunction appendChatMessage(messages: ChatMessage[], message: ChatMessage): void {\n const normalizedContent = normalizeContentParts(message.content);\n\n if (normalizedContent === '' || (Array.isArray(normalizedContent) && normalizedContent.length === 0)) {\n return;\n }\n\n messages.push({\n ...message,\n content: normalizedContent,\n });\n}\n\nfunction toJoinedText(content: ChatMessage['content']): string {\n const normalized = normalizeContentParts(content);\n if (typeof normalized === 'string') {\n return normalized;\n }\n\n return normalized\n .map((entry) => (typeof entry.text === 'string' ? entry.text : ''))\n .filter((entry) => entry.length > 0)\n .join('\\n');\n}\n\nfunction mergeAdjacentSystemMessages(messages: ChatMessage[]): ChatMessage[] {\n const merged: ChatMessage[] = [];\n\n messages.forEach((message) => {\n if (message.role !== 'system') {\n merged.push(message);\n return;\n }\n\n const previous = merged[merged.length - 1];\n if (\n !previous ||\n previous.role !== 'system' ||\n previous.tool_call_id !== undefined ||\n previous.tool_calls !== undefined\n ) {\n merged.push(message);\n return;\n }\n\n const combined = [toJoinedText(previous.content), toJoinedText(message.content)]\n .filter((entry) => entry.length > 0)\n .join('\\n\\n');\n\n previous.content = combined;\n });\n\n return merged;\n}\n\nfunction appendResponsesInput(messages: ChatMessage[], input: unknown): void {\n if (typeof input === 'string') {\n appendChatMessage(messages, { role: 'user', content: input });\n return;\n }\n\n if (!Array.isArray(input)) {\n if (input !== undefined && input !== null) {\n appendChatMessage(messages, { role: 'user', content: toStringValue(input) });\n }\n return;\n }\n\n input.forEach((entry) => {\n if (typeof entry === 'string') {\n appendChatMessage(messages, { role: 'user', content: entry });\n return;\n }\n\n if (!isRecord(entry)) {\n appendChatMessage(messages, { role: 'user', content: toStringValue(entry) });\n return;\n }\n\n const role =\n normalizeChatRole(entry.role) ??\n (entry.type === 'message' ? normalizeChatRole(entry.role) : undefined);\n const type = typeof entry.type === 'string' ? entry.type : '';\n\n if (role) {\n appendChatMessage(messages, {\n role,\n content: normalizeContentParts(entry.content ?? ''),\n });\n return;\n }\n\n if (type === 'function_call_output') {\n messages.push({\n role: 'tool',\n tool_call_id:\n typeof entry.call_id === 'string' && entry.call_id.length > 0\n ? entry.call_id\n : `call_${randomUUID().replace(/-/g, '')}`,\n content: toStringValue(entry.output),\n });\n return;\n }\n\n if (type === 'function_call') {\n const name = typeof entry.name === 'string' ? entry.name : 'tool';\n const callId =\n typeof entry.call_id === 'string' && entry.call_id.length > 0\n ? entry.call_id\n : `call_${randomUUID().replace(/-/g, '')}`;\n messages.push({\n role: 'assistant',\n content: '',\n tool_calls: [\n {\n id: callId,\n type: 'function',\n function: {\n name,\n arguments: toStringValue(entry.arguments),\n },\n },\n ],\n });\n return;\n }\n\n if (type === 'input_text' || type === 'input_image') {\n appendChatMessage(messages, {\n role: 'user',\n content: [entry],\n });\n return;\n }\n\n appendChatMessage(messages, {\n role: 'user',\n content: normalizeContentParts(entry.content ?? entry.text ?? entry),\n });\n });\n}\n\nfunction translateTools(tools: unknown): unknown {\n if (!Array.isArray(tools)) {\n return undefined;\n }\n\n const translated = tools.flatMap((entry) => {\n if (!isRecord(entry) || entry.type !== 'function') {\n return [];\n }\n\n const name = typeof entry.name === 'string' ? entry.name : '';\n if (name.length === 0) {\n return [];\n }\n\n return [\n {\n type: 'function',\n function: removeUndefined({\n name,\n description: typeof entry.description === 'string' ? entry.description : undefined,\n parameters: isRecord(entry.parameters) ? entry.parameters : entry.parameters ?? undefined,\n strict: entry.strict === true ? true : undefined,\n }),\n },\n ];\n });\n\n return translated.length > 0 ? translated : undefined;\n}\n\nfunction translateToolChoice(toolChoice: unknown): unknown {\n if (toolChoice === undefined || toolChoice === null) {\n return undefined;\n }\n\n if (typeof toolChoice === 'string') {\n return toolChoice;\n }\n\n if (!isRecord(toolChoice) || toolChoice.type !== 'function') {\n return undefined;\n }\n\n if (typeof toolChoice.name === 'string') {\n return {\n type: 'function',\n function: {\n name: toolChoice.name,\n },\n };\n }\n\n if (isRecord(toolChoice.function) && typeof toolChoice.function.name === 'string') {\n return {\n type: 'function',\n function: {\n name: toolChoice.function.name,\n },\n };\n }\n\n return undefined;\n}\n\nfunction resolveMaxTokens(payload: Record<string, unknown>): number {\n const candidates = [\n payload.max_output_tokens,\n payload.max_completion_tokens,\n payload.max_tokens,\n ];\n\n for (const candidate of candidates) {\n if (typeof candidate === 'number' && Number.isFinite(candidate) && candidate > 0) {\n return candidate;\n }\n }\n\n return DEFAULT_RESPONSES_FALLBACK_MAX_TOKENS;\n}\n\nfunction removeUndefined<T extends Record<string, unknown>>(value: T): T {\n return Object.fromEntries(\n Object.entries(value).filter(([, entry]) => entry !== undefined),\n ) as T;\n}\n\nexport function translateResponsesRequest(\n bodyText: string,\n store: ResponsesCompatibilityStore,\n): ResponsesCompatibilityRequest {\n const payload = JSON.parse(bodyText) as Record<string, unknown>;\n const previousResponseId =\n typeof payload.previous_response_id === 'string' ? payload.previous_response_id : '';\n const messages =\n previousResponseId.length > 0 ? store.getMessages(previousResponseId) ?? [] : [];\n\n if (\n messages.length === 0 &&\n typeof payload.instructions === 'string' &&\n payload.instructions.trim().length > 0\n ) {\n appendChatMessage(messages, {\n role: 'system',\n content: payload.instructions,\n });\n }\n\n appendResponsesInput(messages, payload.input);\n const normalizedMessages = mergeAdjacentSystemMessages(messages);\n const translatedToolChoice = translateToolChoice(payload.tool_choice);\n\n const chatRequest = removeUndefined({\n messages: normalizedMessages,\n model: payload.model,\n max_tokens: resolveMaxTokens(payload),\n parallel_tool_calls: payload.parallel_tool_calls === true ? true : undefined,\n stream: typeof payload.stream === 'boolean' ? payload.stream : undefined,\n temperature: typeof payload.temperature === 'number' ? payload.temperature : undefined,\n tool_choice: translatedToolChoice === 'auto' ? undefined : translatedToolChoice,\n tools: translateTools(payload.tools),\n top_p: typeof payload.top_p === 'number' ? payload.top_p : undefined,\n user: typeof payload.user === 'string' ? payload.user : undefined,\n });\n\n return {\n chatRequest,\n messages: normalizedMessages,\n };\n}\n\nfunction buildResponseMessageItem(content: string, itemId: string): Record<string, unknown> {\n return {\n id: itemId,\n type: 'message',\n role: 'assistant',\n status: 'completed',\n content: [\n {\n type: 'output_text',\n text: content,\n annotations: [],\n },\n ],\n };\n}\n\nfunction buildResponseFunctionCallItem(toolCall: ChatToolCall): Record<string, unknown> {\n return {\n id: `fc_${randomUUID().replace(/-/g, '')}`,\n type: 'function_call',\n call_id: toolCall.id,\n name: toolCall.function.name,\n arguments: toolCall.function.arguments,\n status: 'completed',\n };\n}\n\nfunction getAssistantMessage(\n payload: Record<string, unknown>,\n): { normalizedText: string; responseItems: Array<Record<string, unknown>>; storedMessage: ChatMessage } {\n const choices = Array.isArray(payload.choices) ? payload.choices : [];\n const firstChoice = choices.find(isRecord);\n const message =\n firstChoice && isRecord(firstChoice.message) ? firstChoice.message : ({} as Record<string, unknown>);\n const textContent = normalizeContentParts(message.content ?? '');\n const storedMessage: ChatMessage = {\n role: 'assistant',\n content: textContent,\n };\n\n const responseItems: Array<Record<string, unknown>> = [];\n\n const normalizedText =\n typeof textContent === 'string'\n ? textContent\n : Array.isArray(textContent)\n ? textContent\n .map((entry) => (typeof entry.text === 'string' ? entry.text : ''))\n .filter((entry) => entry.length > 0)\n .join('')\n : '';\n if (normalizedText.length > 0) {\n responseItems.push(buildResponseMessageItem(normalizedText, `msg_${randomUUID().replace(/-/g, '')}`));\n }\n\n const toolCalls = Array.isArray(message.tool_calls)\n ? message.tool_calls.filter(isRecord).flatMap((toolCall) => {\n if (!isRecord(toolCall.function) || typeof toolCall.function.name !== 'string') {\n return [];\n }\n\n return [\n {\n id:\n typeof toolCall.id === 'string' && toolCall.id.length > 0\n ? toolCall.id\n : `call_${randomUUID().replace(/-/g, '')}`,\n type: 'function' as const,\n function: {\n name: toolCall.function.name,\n arguments:\n typeof toolCall.function.arguments === 'string'\n ? toolCall.function.arguments\n : toStringValue(toolCall.function.arguments),\n },\n },\n ];\n })\n : [];\n\n if (toolCalls.length > 0) {\n storedMessage.tool_calls = toolCalls;\n responseItems.push(...toolCalls.map((toolCall) => buildResponseFunctionCallItem(toolCall)));\n }\n\n return {\n normalizedText,\n responseItems,\n storedMessage,\n };\n}\n\nexport function translateChatCompletionJsonToResponses(\n bodyText: string,\n messages: ChatMessage[],\n): ResponsesCompatibilityJsonResult {\n const payload = JSON.parse(bodyText) as Record<string, unknown>;\n const responseId = `resp_${randomUUID().replace(/-/g, '')}`;\n const { normalizedText, responseItems, storedMessage } = getAssistantMessage(payload);\n const response = {\n id: responseId,\n object: 'response',\n created_at: Math.floor(Date.now() / 1000),\n model: typeof payload.model === 'string' ? payload.model : undefined,\n output: responseItems,\n output_text: normalizedText.length > 0 ? normalizedText : undefined,\n status: 'completed',\n };\n\n const storedMessages = cloneValue(messages);\n storedMessages.push(storedMessage);\n\n return {\n bodyText: JSON.stringify(removeUndefined(response)),\n response: removeUndefined(response),\n responseId,\n storedMessages,\n };\n}\n\nfunction createEvent(type: string, extra: Record<string, unknown>): string {\n return `data: ${JSON.stringify({ type, ...extra })}\\n\\n`;\n}\n\nexport class ResponsesCompatibilitySseTransformer {\n private buffer = '';\n private contentPartAdded = false;\n private readonly createdAt = Math.floor(Date.now() / 1000);\n private finalized = false;\n private readonly messageItemId = `msg_${randomUUID().replace(/-/g, '')}`;\n private messageOutputIndex: number | null = null;\n private readonly responseId = `resp_${randomUUID().replace(/-/g, '')}`;\n private text = '';\n private readonly toolStates = new Map<number, ToolState>();\n\n constructor(\n private readonly messages: ChatMessage[],\n private readonly model: string | undefined,\n ) {}\n\n start(): string {\n return createEvent('response.created', {\n response: {\n id: this.responseId,\n object: 'response',\n created_at: this.createdAt,\n model: this.model,\n output: [],\n output_text: '',\n status: 'in_progress',\n },\n });\n }\n\n push(chunk: string): string {\n const input = this.buffer + chunk;\n const parts = input.split(/(\\r?\\n)/);\n const lastPart = parts.pop();\n this.buffer = lastPart ?? '';\n\n let output = '';\n for (let index = 0; index < parts.length; index += 2) {\n const line = parts[index] ?? '';\n output += this.transformLine(line);\n }\n\n return output;\n }\n\n finish(): { output: string; response: Record<string, unknown>; responseId: string; storedMessages: ChatMessage[] } {\n let output = '';\n if (this.buffer.length > 0) {\n output += this.transformLine(this.buffer);\n this.buffer = '';\n }\n output += this.finalize();\n const response = this.buildResponseObject();\n const storedMessages = cloneValue(this.messages);\n storedMessages.push(this.buildAssistantMessage());\n return {\n output,\n response,\n responseId: this.responseId,\n storedMessages,\n };\n }\n\n private transformLine(line: string): string {\n if (!line.startsWith('data: ')) {\n return '';\n }\n\n const payloadText = line.slice(6);\n if (payloadText === '[DONE]') {\n return this.finalize();\n }\n\n let payload: Record<string, unknown>;\n try {\n const parsed = JSON.parse(payloadText) as unknown;\n if (!isRecord(parsed)) {\n return '';\n }\n payload = parsed;\n } catch {\n return '';\n }\n\n const choices = Array.isArray(payload.choices) ? payload.choices : [];\n const choice = choices.find(isRecord);\n if (!choice) {\n return '';\n }\n\n const delta = isRecord(choice.delta) ? choice.delta : {};\n let output = '';\n\n if (typeof delta.content === 'string' && delta.content.length > 0) {\n output += this.pushContent(delta.content);\n }\n\n if (Array.isArray(delta.tool_calls)) {\n delta.tool_calls.filter(isRecord).forEach((toolCall, position) => {\n output += this.pushToolCall(toolCall, position);\n });\n }\n\n if (choice.finish_reason !== undefined && choice.finish_reason !== null) {\n output += this.finalize();\n }\n\n return output;\n }\n\n private pushContent(delta: string): string {\n this.text += delta;\n\n if (this.messageOutputIndex === null) {\n this.messageOutputIndex = 0;\n let output = createEvent('response.output_item.added', {\n item: {\n id: this.messageItemId,\n type: 'message',\n role: 'assistant',\n status: 'in_progress',\n content: [],\n },\n output_index: this.messageOutputIndex,\n });\n output += createEvent('response.content_part.added', {\n content_index: 0,\n item_id: this.messageItemId,\n output_index: this.messageOutputIndex,\n part: {\n type: 'output_text',\n text: '',\n annotations: [],\n },\n });\n this.contentPartAdded = true;\n output += createEvent('response.output_text.delta', {\n content_index: 0,\n delta,\n item_id: this.messageItemId,\n output_index: this.messageOutputIndex,\n });\n return output;\n }\n\n return createEvent('response.output_text.delta', {\n content_index: 0,\n delta,\n item_id: this.messageItemId,\n output_index: this.messageOutputIndex,\n });\n }\n\n private pushToolCall(toolCall: Record<string, unknown>, position: number): string {\n const index = typeof toolCall.index === 'number' ? toolCall.index : position;\n const existing = this.toolStates.get(index);\n const functionPayload = isRecord(toolCall.function) ? toolCall.function : {};\n const state =\n existing ??\n {\n arguments: '',\n callId:\n typeof toolCall.id === 'string' && toolCall.id.length > 0\n ? toolCall.id\n : `call_${randomUUID().replace(/-/g, '')}`,\n itemId: `fc_${randomUUID().replace(/-/g, '')}`,\n name: typeof functionPayload.name === 'string' ? functionPayload.name : 'tool',\n outputIndex:\n (this.messageOutputIndex === null ? 0 : 1) + Array.from(this.toolStates.keys()).length,\n };\n\n if (typeof functionPayload.name === 'string' && functionPayload.name.length > 0) {\n state.name = functionPayload.name;\n }\n\n let output = '';\n if (!existing) {\n output += createEvent('response.output_item.added', {\n item: {\n id: state.itemId,\n type: 'function_call',\n call_id: state.callId,\n name: state.name,\n arguments: '',\n status: 'in_progress',\n },\n output_index: state.outputIndex,\n });\n this.toolStates.set(index, state);\n }\n\n if (typeof functionPayload.arguments === 'string' && functionPayload.arguments.length > 0) {\n state.arguments += functionPayload.arguments;\n output += createEvent('response.function_call_arguments.delta', {\n delta: functionPayload.arguments,\n item_id: state.itemId,\n output_index: state.outputIndex,\n });\n }\n\n return output;\n }\n\n private finalize(): string {\n if (this.finalized) {\n return '';\n }\n\n this.finalized = true;\n let output = '';\n\n if (this.messageOutputIndex !== null && this.contentPartAdded) {\n output += createEvent('response.output_text.done', {\n content_index: 0,\n item_id: this.messageItemId,\n output_index: this.messageOutputIndex,\n text: this.text,\n });\n output += createEvent('response.content_part.done', {\n content_index: 0,\n item_id: this.messageItemId,\n output_index: this.messageOutputIndex,\n part: {\n type: 'output_text',\n text: this.text,\n annotations: [],\n },\n });\n output += createEvent('response.output_item.done', {\n item: buildResponseMessageItem(this.text, this.messageItemId),\n output_index: this.messageOutputIndex,\n });\n }\n\n Array.from(this.toolStates.values())\n .sort((left, right) => left.outputIndex - right.outputIndex)\n .forEach((toolState) => {\n output += createEvent('response.function_call_arguments.done', {\n arguments: toolState.arguments,\n item_id: toolState.itemId,\n output_index: toolState.outputIndex,\n });\n output += createEvent('response.output_item.done', {\n item: {\n id: toolState.itemId,\n type: 'function_call',\n call_id: toolState.callId,\n name: toolState.name,\n arguments: toolState.arguments,\n status: 'completed',\n },\n output_index: toolState.outputIndex,\n });\n });\n\n output += createEvent('response.completed', {\n response: this.buildResponseObject(),\n });\n\n return output;\n }\n\n private buildAssistantMessage(): ChatMessage {\n const toolCalls = Array.from(this.toolStates.values())\n .sort((left, right) => left.outputIndex - right.outputIndex)\n .map((toolState) => ({\n id: toolState.callId,\n type: 'function' as const,\n function: {\n name: toolState.name,\n arguments: toolState.arguments,\n },\n }));\n\n return {\n role: 'assistant',\n content: this.text,\n ...(toolCalls.length > 0 ? { tool_calls: toolCalls } : {}),\n };\n }\n\n private buildResponseObject(): Record<string, unknown> {\n const output: Array<Record<string, unknown>> = [];\n\n if (this.messageOutputIndex !== null && this.text.length > 0) {\n output.push(buildResponseMessageItem(this.text, this.messageItemId));\n }\n\n Array.from(this.toolStates.values())\n .sort((left, right) => left.outputIndex - right.outputIndex)\n .forEach((toolState) => {\n output.push({\n id: toolState.itemId,\n type: 'function_call',\n call_id: toolState.callId,\n name: toolState.name,\n arguments: toolState.arguments,\n status: 'completed',\n });\n });\n\n return removeUndefined({\n id: this.responseId,\n object: 'response',\n created_at: this.createdAt,\n model: this.model,\n output,\n output_text: this.text.length > 0 ? this.text : undefined,\n status: 'completed',\n });\n }\n}\n\nexport function createResponsesCompatibilityStatusBody(): string {\n return JSON.stringify({\n object: 'response_compatibility',\n mode: 'chat_completions',\n status: 'available',\n });\n}\n","import type { Duplex } from 'node:stream';\n\nimport { StreamReplacer } from '../interceptor/stream-replacer.js';\n\ninterface ParsedWebSocketFrame {\n firstByte: number;\n masked: boolean;\n maskingKey?: Buffer;\n opcode: number;\n payload: Buffer;\n rawLength: number;\n}\n\nexport interface WebSocketRelayOptions {\n clientHead?: Buffer;\n clientSocket: Duplex;\n clientToUpstreamReplacements: Map<string, string>;\n upstreamHead?: Buffer;\n upstreamSocket: Duplex;\n upstreamToClientReplacements: Map<string, string>;\n}\n\nfunction applyMask(payload: Buffer, maskingKey: Buffer): void {\n for (let index = 0; index < payload.length; index += 1) {\n payload[index] ^= maskingKey[index % 4];\n }\n}\n\nfunction buildFrame(frame: ParsedWebSocketFrame, payload: Buffer): Buffer {\n let headerLength = 2;\n\n if (payload.length >= 126 && payload.length <= 0xffff) {\n headerLength += 2;\n } else if (payload.length > 0xffff) {\n headerLength += 8;\n }\n\n if (frame.masked) {\n headerLength += 4;\n }\n\n const output = Buffer.alloc(headerLength + payload.length);\n output[0] = frame.firstByte;\n\n let offset = 2;\n if (payload.length < 126) {\n output[1] = (frame.masked ? 0x80 : 0) | payload.length;\n } else if (payload.length <= 0xffff) {\n output[1] = (frame.masked ? 0x80 : 0) | 126;\n output.writeUInt16BE(payload.length, offset);\n offset += 2;\n } else {\n output[1] = (frame.masked ? 0x80 : 0) | 127;\n output.writeBigUInt64BE(BigInt(payload.length), offset);\n offset += 8;\n }\n\n if (frame.masked) {\n const maskingKey = frame.maskingKey ?? Buffer.from([0, 0, 0, 0]);\n maskingKey.copy(output, offset);\n offset += 4;\n }\n\n payload.copy(output, offset);\n if (frame.masked && frame.maskingKey) {\n applyMask(output.subarray(offset), frame.maskingKey);\n }\n\n return output;\n}\n\nfunction parseFrame(input: Buffer): ParsedWebSocketFrame | null {\n if (input.length < 2) {\n return null;\n }\n\n const firstByte = input[0];\n const secondByte = input[1];\n const masked = Boolean(secondByte & 0x80);\n const payloadLengthCode = secondByte & 0x7f;\n let offset = 2;\n let payloadLength = 0;\n\n if (payloadLengthCode < 126) {\n payloadLength = payloadLengthCode;\n } else if (payloadLengthCode === 126) {\n if (input.length < offset + 2) {\n return null;\n }\n\n payloadLength = input.readUInt16BE(offset);\n offset += 2;\n } else {\n if (input.length < offset + 8) {\n return null;\n }\n\n payloadLength = Number(input.readBigUInt64BE(offset));\n offset += 8;\n }\n\n let maskingKey: Buffer | undefined;\n if (masked) {\n if (input.length < offset + 4) {\n return null;\n }\n\n maskingKey = Buffer.from(input.subarray(offset, offset + 4));\n offset += 4;\n }\n\n if (input.length < offset + payloadLength) {\n return null;\n }\n\n const payload = Buffer.from(input.subarray(offset, offset + payloadLength));\n if (maskingKey) {\n applyMask(payload, maskingKey);\n }\n\n return {\n firstByte,\n masked,\n maskingKey,\n opcode: firstByte & 0x0f,\n payload,\n rawLength: offset + payloadLength,\n };\n}\n\nclass TextFrameTransformer {\n private buffer = Buffer.alloc(0);\n private readonly replacer: StreamReplacer;\n private withinTextMessage = false;\n\n constructor(replacements: Map<string, string>) {\n this.replacer = new StreamReplacer(replacements);\n }\n\n push(chunk: Buffer): Buffer {\n this.buffer =\n this.buffer.length === 0 ? Buffer.from(chunk) : Buffer.concat([this.buffer, chunk]);\n\n const output: Buffer[] = [];\n\n while (true) {\n const frame = parseFrame(this.buffer);\n if (!frame) {\n break;\n }\n\n this.buffer = this.buffer.subarray(frame.rawLength);\n output.push(this.transformFrame(frame));\n }\n\n return output.length === 0 ? Buffer.alloc(0) : Buffer.concat(output);\n }\n\n flush(): Buffer {\n this.buffer = Buffer.alloc(0);\n this.withinTextMessage = false;\n this.replacer.flush();\n\n return Buffer.alloc(0);\n }\n\n private transformFrame(frame: ParsedWebSocketFrame): Buffer {\n const textFrame = frame.opcode === 0x1 || (frame.opcode === 0x0 && this.withinTextMessage);\n if (!textFrame) {\n return buildFrame(frame, frame.payload);\n }\n\n const finalChunk = Boolean(frame.firstByte & 0x80);\n let transformed = this.replacer.push(frame.payload.toString('utf8'));\n\n if (finalChunk) {\n transformed += this.replacer.flush();\n this.withinTextMessage = false;\n } else {\n this.withinTextMessage = true;\n }\n\n return buildFrame(frame, Buffer.from(transformed, 'utf8'));\n }\n}\n\nfunction forwardFrames(\n source: Duplex,\n target: Duplex,\n transformer: TextFrameTransformer,\n head?: Buffer,\n): void {\n const writeChunk = (chunk: Buffer) => {\n const output = transformer.push(chunk);\n if (output.length > 0) {\n target.write(output);\n }\n };\n\n if (head && head.length > 0) {\n writeChunk(head);\n }\n\n source.on('data', (chunk: Buffer | string) => {\n writeChunk(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n });\n source.once('end', () => {\n const remaining = transformer.flush();\n if (remaining.length > 0) {\n target.write(remaining);\n }\n\n target.end();\n });\n source.once('close', () => {\n if (!target.destroyed) {\n target.destroy();\n }\n });\n source.once('error', (error) => {\n target.destroy(error);\n });\n}\n\nexport function relayWebSocket(options: WebSocketRelayOptions): void {\n const clientToUpstream = new TextFrameTransformer(options.clientToUpstreamReplacements);\n const upstreamToClient = new TextFrameTransformer(options.upstreamToClientReplacements);\n\n forwardFrames(\n options.clientSocket,\n options.upstreamSocket,\n clientToUpstream,\n options.clientHead,\n );\n forwardFrames(\n options.upstreamSocket,\n options.clientSocket,\n upstreamToClient,\n options.upstreamHead,\n );\n}\n","import {\n createCipheriv,\n createDecipheriv,\n randomBytes,\n scrypt as scryptCallback,\n} from 'node:crypto';\nimport { chmodSync, existsSync } from 'node:fs';\nimport { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { dirname, join } from 'node:path';\n\nimport { isSecretSource, isSecretType, type VaultEntry } from '../vault/types.js';\n\nexport const DEFAULT_VAULT_PATH = join(homedir(), '.ais', 'vault.enc');\nconst AES_ALGORITHM = 'aes-256-gcm';\nconst KEY_LENGTH = 32;\nconst SALT_LENGTH = 16;\nconst IV_LENGTH = 12;\nconst AUTH_TAG_LENGTH = 16;\nconst MIN_PAYLOAD_LENGTH = SALT_LENGTH + IV_LENGTH + AUTH_TAG_LENGTH;\nconst FILE_MODE = 0o600;\nconst SCRYPT_OPTIONS = {\n N: 2 ** 14,\n r: 8,\n p: 1,\n};\n\nfunction isVaultEntry(value: unknown): value is VaultEntry {\n if (!value || typeof value !== 'object') {\n return false;\n }\n\n const entry = value as Partial<VaultEntry>;\n return (\n typeof entry.token === 'string' &&\n typeof entry.secret === 'string' &&\n isSecretType(entry.type) &&\n typeof entry.createdAt === 'number' &&\n Number.isFinite(entry.createdAt) &&\n typeof entry.hitCount === 'number' &&\n Number.isFinite(entry.hitCount) &&\n (entry.name === undefined || typeof entry.name === 'string') &&\n (entry.source === undefined || isSecretSource(entry.source))\n );\n}\n\nfunction parseVaultData(raw: string): Record<string, VaultEntry> {\n let parsed: unknown;\n\n try {\n parsed = JSON.parse(raw);\n } catch {\n throw new Error('Vault file is corrupted');\n }\n\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n throw new Error('Vault file is corrupted');\n }\n\n const result: Record<string, VaultEntry> = {};\n\n for (const [secret, entry] of Object.entries(parsed)) {\n if (!isVaultEntry(entry) || entry.secret !== secret) {\n throw new Error('Vault file is corrupted');\n }\n\n result[secret] = {\n token: entry.token,\n secret: entry.secret,\n type: entry.type,\n createdAt: entry.createdAt,\n hitCount: entry.hitCount,\n name: entry.name,\n source: entry.source,\n };\n }\n\n return result;\n}\n\nasync function deriveKey(password: Buffer, salt: Buffer): Promise<Buffer> {\n return new Promise<Buffer>((resolve, reject) => {\n scryptCallback(password, salt, KEY_LENGTH, SCRYPT_OPTIONS, (error, derivedKey) => {\n if (error) {\n reject(error);\n return;\n }\n\n resolve(Buffer.from(derivedKey));\n });\n });\n}\n\nexport class EncryptedVault {\n static exists(path = DEFAULT_VAULT_PATH): boolean {\n return existsSync(path);\n }\n\n static async save(\n data: Record<string, VaultEntry>,\n password: string,\n path = DEFAULT_VAULT_PATH,\n ): Promise<void> {\n const passwordBuffer = Buffer.from(password, 'utf8');\n const plaintextBuffer = Buffer.from(JSON.stringify(data), 'utf8');\n const salt = randomBytes(SALT_LENGTH);\n const iv = randomBytes(IV_LENGTH);\n let key: Buffer | null = null;\n let ciphertext: Buffer | null = null;\n let authTag: Buffer | null = null;\n\n try {\n key = await deriveKey(passwordBuffer, salt);\n const cipher = createCipheriv(AES_ALGORITHM, key, iv);\n ciphertext = Buffer.concat([cipher.update(plaintextBuffer), cipher.final()]);\n authTag = cipher.getAuthTag();\n const payload = Buffer.concat([salt, iv, authTag, ciphertext]);\n\n await mkdir(dirname(path), { recursive: true });\n await writeFile(path, payload, { mode: FILE_MODE });\n chmodSync(path, FILE_MODE);\n payload.fill(0);\n } finally {\n passwordBuffer.fill(0);\n plaintextBuffer.fill(0);\n salt.fill(0);\n iv.fill(0);\n key?.fill(0);\n ciphertext?.fill(0);\n authTag?.fill(0);\n }\n }\n\n static async load(password: string, path = DEFAULT_VAULT_PATH): Promise<Record<string, VaultEntry>> {\n if (!this.exists(path)) {\n return {};\n }\n\n const payload = await readFile(path);\n if (payload.length < MIN_PAYLOAD_LENGTH) {\n payload.fill(0);\n throw new Error('Vault file is corrupted');\n }\n\n const passwordBuffer = Buffer.from(password, 'utf8');\n const salt = Buffer.from(payload.subarray(0, SALT_LENGTH));\n const iv = Buffer.from(payload.subarray(SALT_LENGTH, SALT_LENGTH + IV_LENGTH));\n const authTag = Buffer.from(\n payload.subarray(SALT_LENGTH + IV_LENGTH, SALT_LENGTH + IV_LENGTH + AUTH_TAG_LENGTH),\n );\n const ciphertext = Buffer.from(payload.subarray(MIN_PAYLOAD_LENGTH));\n let key: Buffer | null = null;\n let plaintext: Buffer | null = null;\n\n try {\n key = await deriveKey(passwordBuffer, salt);\n const decipher = createDecipheriv(AES_ALGORITHM, key, iv);\n decipher.setAuthTag(authTag);\n plaintext = Buffer.concat([decipher.update(ciphertext), decipher.final()]);\n return parseVaultData(plaintext.toString('utf8'));\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(`Failed to decrypt vault: ${error.message}`);\n }\n\n throw new Error('Failed to decrypt vault: invalid password or corrupted file');\n } finally {\n payload.fill(0);\n passwordBuffer.fill(0);\n salt.fill(0);\n iv.fill(0);\n authTag.fill(0);\n ciphertext.fill(0);\n key?.fill(0);\n plaintext?.fill(0);\n }\n }\n}\n","interface KeychainModule {\n deletePassword(service: string, account: string): Promise<boolean>;\n getPassword(service: string, account: string): Promise<string | null>;\n setPassword(service: string, account: string, password: string): Promise<void>;\n}\n\ntype KeychainModuleLoader = () => Promise<KeychainModule | { default: KeychainModule }>;\n\nconst DEFAULT_ACCOUNT = 'vault-password';\nconst defaultLoader: KeychainModuleLoader = async () => import('keytar');\n\nlet keychainModuleLoader: KeychainModuleLoader = defaultLoader;\n\nfunction normalizeKeychainModule(\n module: KeychainModule | { default: KeychainModule },\n): KeychainModule {\n return 'default' in module ? module.default : module;\n}\n\nasync function loadKeychainModule(): Promise<KeychainModule | null> {\n try {\n return normalizeKeychainModule(await keychainModuleLoader());\n } catch {\n return null;\n }\n}\n\nexport function setKeychainModuleLoaderForTesting(loader: KeychainModuleLoader): void {\n keychainModuleLoader = loader;\n}\n\nexport function resetKeychainModuleLoaderForTesting(): void {\n keychainModuleLoader = defaultLoader;\n}\n\nexport class KeychainStore {\n static readonly SERVICE = 'ais';\n private static readonly ACCOUNT = DEFAULT_ACCOUNT;\n\n static async setVaultPassword(password: string): Promise<void> {\n const keychain = await loadKeychainModule();\n if (!keychain) {\n throw new Error('System keychain is not available');\n }\n\n try {\n await keychain.setPassword(this.SERVICE, this.ACCOUNT, password);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`System keychain is not available: ${message}`);\n }\n }\n\n static async getVaultPassword(): Promise<string | null> {\n const keychain = await loadKeychainModule();\n if (!keychain) {\n return null;\n }\n\n try {\n return await keychain.getPassword(this.SERVICE, this.ACCOUNT);\n } catch {\n return null;\n }\n }\n\n static async deleteVaultPassword(): Promise<void> {\n const keychain = await loadKeychainModule();\n if (!keychain) {\n return;\n }\n\n try {\n await keychain.deletePassword(this.SERVICE, this.ACCOUNT);\n } catch {\n // 忽略删除失败,避免在无图形环境下中断主流程。\n }\n }\n\n static async isAvailable(): Promise<boolean> {\n const keychain = await loadKeychainModule();\n if (!keychain) {\n return false;\n }\n\n try {\n await keychain.getPassword(this.SERVICE, this.ACCOUNT);\n return true;\n } catch {\n return false;\n }\n }\n}\n","import { randomBytes } from 'node:crypto';\n\nimport { SessionVault, type SessionVaultOptions } from '../vault/session-vault.js';\nimport { DEFAULT_VAULT_PATH, EncryptedVault } from './encrypted-vault.js';\nimport { KeychainStore } from './keychain.js';\n\nconst PASSWORD_ENV_NAME = 'AIS_VAULT_PASSWORD';\n\ninterface KeychainStoreLike {\n getVaultPassword(): Promise<string | null>;\n isAvailable(): Promise<boolean>;\n setVaultPassword(password: string): Promise<void>;\n}\n\nexport interface StorageManagerOptions {\n env?: NodeJS.ProcessEnv;\n keychain?: KeychainStoreLike;\n persistDetectedSecrets?: boolean;\n vaultOptions?: SessionVaultOptions;\n vaultPassword?: string;\n vaultPath?: string;\n}\n\nfunction buildVaultRecord(vault: SessionVault, persistDetectedSecrets: boolean) {\n return Object.fromEntries(\n vault\n .snapshot()\n .filter((entry) => persistDetectedSecrets || entry.source === 'manual')\n .map((entry) => [entry.secret, entry]),\n );\n}\n\nexport class StorageManager {\n private cachedPassword: string | null = null;\n private readonly env: NodeJS.ProcessEnv;\n private readonly keychain: KeychainStoreLike;\n\n constructor(private readonly options: StorageManagerOptions = {}) {\n this.env = options.env ?? process.env;\n this.keychain = options.keychain ?? KeychainStore;\n }\n\n async initialize(): Promise<SessionVault> {\n const vault = new SessionVault(this.options.vaultOptions);\n const password = await this.getReadablePassword();\n\n if (!password) {\n return vault;\n }\n\n const persistedEntries = await EncryptedVault.load(password, this.options.vaultPath);\n for (const entry of Object.values(persistedEntries)) {\n vault.register(entry.secret, entry.type, {\n createdAt: entry.createdAt,\n hitCount: entry.hitCount,\n name: entry.name,\n source: entry.source ?? 'manual',\n token: entry.token,\n });\n }\n\n return vault;\n }\n\n async save(vault: SessionVault): Promise<void> {\n const password = await this.getWritablePassword();\n await EncryptedVault.save(\n buildVaultRecord(vault, this.options.persistDetectedSecrets !== false),\n password,\n this.options.vaultPath,\n );\n }\n\n async setup(): Promise<boolean> {\n const password = await this.getWritablePassword();\n if (EncryptedVault.exists(this.options.vaultPath)) {\n return false;\n }\n\n await EncryptedVault.save({}, password, this.options.vaultPath);\n return true;\n }\n\n getVaultPath(): string {\n return this.options.vaultPath ?? DEFAULT_VAULT_PATH;\n }\n\n private async getReadablePassword(): Promise<string | null> {\n const directPassword = this.getDirectPassword();\n if (directPassword) {\n this.cachedPassword = directPassword;\n return directPassword;\n }\n\n if (this.cachedPassword) {\n return this.cachedPassword;\n }\n\n const storedPassword = await this.keychain.getVaultPassword();\n if (storedPassword) {\n this.cachedPassword = storedPassword;\n return storedPassword;\n }\n\n if (EncryptedVault.exists(this.options.vaultPath)) {\n throw new Error(\n `Vault password is unavailable. Set ${PASSWORD_ENV_NAME} or enable the system keychain.`,\n );\n }\n\n return null;\n }\n\n private async getWritablePassword(): Promise<string> {\n const directPassword = this.getDirectPassword();\n if (directPassword) {\n this.cachedPassword = directPassword;\n return directPassword;\n }\n\n if (this.cachedPassword) {\n return this.cachedPassword;\n }\n\n const storedPassword = await this.keychain.getVaultPassword();\n if (storedPassword) {\n this.cachedPassword = storedPassword;\n return storedPassword;\n }\n\n if (await this.keychain.isAvailable()) {\n const seed = randomBytes(32);\n const generatedPassword = seed.toString('base64url');\n seed.fill(0);\n await this.keychain.setVaultPassword(generatedPassword);\n this.cachedPassword = generatedPassword;\n return generatedPassword;\n }\n\n throw new Error(\n `Vault password is unavailable. Set ${PASSWORD_ENV_NAME} when the system keychain cannot be used.`,\n );\n }\n\n private getDirectPassword(): string | null {\n return this.options.vaultPassword ?? this.env[PASSWORD_ENV_NAME] ?? null;\n }\n}\n","import { createHash, randomUUID } from 'node:crypto';\n\nimport type { SecretSource, SecretType, TokenGenerator, VaultEntry } from './types.js';\n\nconst TOKEN_PREFIX = '__VAULT_';\nconst TOKEN_SUFFIX = '__';\nconst BASE_HASH_LENGTH = 8;\nconst MAX_HASH_LENGTH = 9;\nconst MAX_COLLISION_SUFFIX = 15;\nconst TOKEN_PATTERN = /^__VAULT_([A-Z_]+)_([0-9a-f]{8,9})__$/;\n\nexport const TOKEN_REGEX = /__VAULT_[A-Z_]+_[0-9a-f]{8,9}__/g;\nexport const TOKEN_MAX_LENGTH = `${TOKEN_PREFIX}PRIVATE_KEY_${'f'.repeat(MAX_HASH_LENGTH)}${TOKEN_SUFFIX}`.length;\n\nexport interface SessionVaultOptions {\n sessionId?: string;\n tokenGenerator?: TokenGenerator;\n}\n\nexport interface RegisterSecretOptions {\n createdAt?: number;\n hitCount?: number;\n name?: string;\n source?: SecretSource;\n token?: string;\n}\n\nfunction buildToken(type: SecretType, hash: string): string {\n return `${TOKEN_PREFIX}${type}_${hash}${TOKEN_SUFFIX}`;\n}\n\nfunction buildCollisionToken(\n secret: string,\n type: SecretType,\n sessionId: string,\n baseToken: string,\n attempt: number,\n): string {\n const match = baseToken.match(TOKEN_PATTERN);\n if (!match) {\n throw new Error(`Invalid vault token format: ${baseToken}`);\n }\n\n if (attempt <= MAX_COLLISION_SUFFIX) {\n return buildToken(type, `${match[2].slice(0, BASE_HASH_LENGTH)}${attempt.toString(16)}`);\n }\n\n const hash = createHash('sha256')\n .update(`${secret}${sessionId}:${attempt}`)\n .digest('hex')\n .slice(0, MAX_HASH_LENGTH);\n\n return buildToken(type, hash);\n}\n\nfunction sortPairsBySourceLength<T extends readonly [string, string]>(pairs: T[]): T[] {\n return pairs.sort((left, right) => {\n if (right[0].length !== left[0].length) {\n return right[0].length - left[0].length;\n }\n\n return left[0].localeCompare(right[0]);\n });\n}\n\nexport function generateToken(secret: string, type: SecretType, sessionId: string): string {\n const hash = createHash('sha256')\n .update(secret + sessionId)\n .digest('hex')\n .slice(0, BASE_HASH_LENGTH);\n\n return buildToken(type, hash);\n}\n\nexport class SessionVault {\n private readonly nameToSecret = new Map<string, string>();\n private revisionNumber = 0;\n private readonly secretToEntry = new Map<string, VaultEntry>();\n private readonly tokenToEntry = new Map<string, VaultEntry>();\n private readonly sessionId: string;\n private readonly tokenGenerator: TokenGenerator;\n\n constructor(options: SessionVaultOptions = {}) {\n this.sessionId = options.sessionId ?? randomUUID();\n this.tokenGenerator = options.tokenGenerator ?? generateToken;\n }\n\n get size(): number {\n return this.secretToEntry.size;\n }\n\n get revision(): number {\n return this.revisionNumber;\n }\n\n register(secret: string, type: SecretType, options: RegisterSecretOptions = {}): string {\n const existingEntry = this.secretToEntry.get(secret);\n if (existingEntry) {\n this.updateExistingEntry(existingEntry, type, options);\n return existingEntry.token;\n }\n\n const createdAt = options.createdAt ?? Date.now();\n const baseToken = options.token ?? this.tokenGenerator(secret, type, this.sessionId);\n let token = baseToken;\n let attempt = 0;\n\n while (true) {\n const entryWithSameToken = this.tokenToEntry.get(token);\n if (!entryWithSameToken) {\n break;\n }\n\n if (entryWithSameToken.secret === secret) {\n return entryWithSameToken.token;\n }\n\n attempt += 1;\n token = buildCollisionToken(secret, type, this.sessionId, baseToken, attempt);\n }\n\n const entry: VaultEntry = {\n token,\n secret,\n type,\n createdAt,\n hitCount: options.hitCount ?? 0,\n name: normalizeEntryName(options.name),\n source: options.source ?? 'manual',\n };\n\n this.assertNameAvailable(entry.name, entry.secret);\n this.secretToEntry.set(secret, entry);\n this.tokenToEntry.set(token, entry);\n if (entry.name) {\n this.nameToSecret.set(entry.name, secret);\n }\n this.revisionNumber += 1;\n\n return token;\n }\n\n findByName(name: string): VaultEntry | null {\n const normalizedName = normalizeEntryName(name);\n if (!normalizedName) {\n return null;\n }\n\n const secret = this.nameToSecret.get(normalizedName);\n if (!secret) {\n return null;\n }\n\n return cloneEntry(this.secretToEntry.get(secret));\n }\n\n resolve(token: string): string | null {\n const entry = this.tokenToEntry.get(token);\n if (!entry) {\n return null;\n }\n\n entry.hitCount += 1;\n return entry.secret;\n }\n\n getSecretToTokenPairs(): Array<[string, string]> {\n return sortPairsBySourceLength(\n Array.from(this.secretToEntry.values(), (entry) => [entry.secret, entry.token] as const),\n ).map(([secret, token]) => [secret, token]);\n }\n\n snapshot(): VaultEntry[] {\n return Array.from(this.secretToEntry.values(), (entry) => ({\n ...entry,\n })).sort((left, right) => left.secret.localeCompare(right.secret));\n }\n\n removeByName(name: string): VaultEntry | null {\n const normalizedName = normalizeEntryName(name);\n if (!normalizedName) {\n return null;\n }\n\n const secret = this.nameToSecret.get(normalizedName);\n if (!secret) {\n return null;\n }\n\n return this.removeBySecret(secret);\n }\n\n getTokenToSecretPairs(): Array<[string, string]> {\n return sortPairsBySourceLength(\n Array.from(this.tokenToEntry.values(), (entry) => [entry.token, entry.secret] as const),\n ).map(([token, secret]) => [token, secret]);\n }\n\n isToken(value: string): boolean {\n return this.tokenToEntry.has(value);\n }\n\n destroy(): void {\n if (this.secretToEntry.size > 0 || this.tokenToEntry.size > 0) {\n this.revisionNumber += 1;\n }\n\n this.nameToSecret.clear();\n this.secretToEntry.clear();\n this.tokenToEntry.clear();\n }\n\n private removeBySecret(secret: string): VaultEntry | null {\n const entry = this.secretToEntry.get(secret);\n if (!entry) {\n return null;\n }\n\n this.secretToEntry.delete(secret);\n this.tokenToEntry.delete(entry.token);\n if (entry.name) {\n this.nameToSecret.delete(entry.name);\n }\n this.revisionNumber += 1;\n\n return {\n ...entry,\n };\n }\n\n private updateExistingEntry(\n entry: VaultEntry,\n type: SecretType,\n options: RegisterSecretOptions,\n ): void {\n let changed = false;\n\n if (entry.type !== type) {\n entry.type = type;\n changed = true;\n }\n\n if (options.createdAt !== undefined && entry.createdAt !== options.createdAt) {\n entry.createdAt = options.createdAt;\n changed = true;\n }\n\n if (options.hitCount !== undefined && entry.hitCount !== options.hitCount) {\n entry.hitCount = options.hitCount;\n changed = true;\n }\n\n if (options.source && entry.source !== options.source) {\n entry.source = options.source;\n changed = true;\n }\n\n const nextName = normalizeEntryName(options.name);\n if (nextName !== undefined && nextName !== entry.name) {\n this.assertNameAvailable(nextName, entry.secret);\n if (entry.name) {\n this.nameToSecret.delete(entry.name);\n }\n\n entry.name = nextName;\n if (nextName) {\n this.nameToSecret.set(nextName, entry.secret);\n }\n changed = true;\n }\n\n if (changed) {\n this.revisionNumber += 1;\n }\n }\n\n private assertNameAvailable(name: string | undefined, secret: string): void {\n if (!name) {\n return;\n }\n\n const existingSecret = this.nameToSecret.get(name);\n if (existingSecret && existingSecret !== secret) {\n throw new Error(`Secret name already exists: ${name}`);\n }\n }\n}\n\nfunction cloneEntry(entry: VaultEntry | undefined): VaultEntry | null {\n if (!entry) {\n return null;\n }\n\n return {\n ...entry,\n };\n}\n\nfunction normalizeEntryName(name: string | undefined): string | undefined {\n if (name === undefined) {\n return undefined;\n }\n\n const trimmed = name.trim();\n return trimmed.length === 0 ? undefined : trimmed;\n}\n","import { chmodSync, existsSync } from 'node:fs';\nimport { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { dirname, join } from 'node:path';\n\nimport { DEFAULT_AIS_STATE_PATH_DISPLAY } from './ais/state.js';\nimport {\n DEFAULT_AUTOMATION_STATE_PATH_DISPLAY,\n isUpdateChannel,\n type UpdateChannel,\n} from './automation/index.js';\nimport { isSecretType, type SecretType } from './vault/types.js';\n\nconst CONFIG_FILE_MODE = 0o600;\nexport const DEFAULT_CONFIG_PATH = join(homedir(), '.ais', 'config.json');\nexport const DEFAULT_VAULT_PATH_DISPLAY = '~/.ais/vault.enc';\n\nexport interface CustomPatternConfig {\n id: string;\n regex: string;\n type: SecretType;\n}\n\nexport interface AisConfig {\n ais: {\n recentLimit: number;\n statePath: string;\n };\n automation: {\n statePath: string;\n };\n customPatterns: CustomPatternConfig[];\n detection: {\n context: boolean;\n entropy: boolean;\n entropyThreshold: number;\n patterns: boolean;\n };\n display: {\n debug: boolean;\n };\n protect: {\n enabled: boolean;\n tools: {\n claude: boolean;\n codex: boolean;\n openclaw: boolean;\n };\n };\n storage: {\n persistSecrets: boolean;\n vaultPath: string;\n };\n update: {\n channel: UpdateChannel;\n checkIntervalMinutes: number;\n enabled: boolean;\n silent: boolean;\n };\n}\n\nexport interface LoadedConfig {\n config: AisConfig;\n exists: boolean;\n path: string;\n}\n\nexport function createDefaultConfig(): AisConfig {\n return {\n ais: {\n recentLimit: 20,\n statePath: DEFAULT_AIS_STATE_PATH_DISPLAY,\n },\n automation: {\n statePath: DEFAULT_AUTOMATION_STATE_PATH_DISPLAY,\n },\n customPatterns: [],\n detection: {\n patterns: true,\n context: true,\n entropy: false,\n entropyThreshold: 4,\n },\n display: {\n debug: false,\n },\n protect: {\n enabled: true,\n tools: {\n claude: true,\n codex: true,\n openclaw: true,\n },\n },\n storage: {\n persistSecrets: false,\n vaultPath: DEFAULT_VAULT_PATH_DISPLAY,\n },\n update: {\n channel: 'latest',\n checkIntervalMinutes: 1440,\n enabled: true,\n silent: true,\n },\n };\n}\n\nexport function expandHomePath(path: string): string {\n if (path === '~') {\n return homedir();\n }\n\n if (path.startsWith('~/')) {\n return join(homedir(), path.slice(2));\n }\n\n return path;\n}\n\nexport function resolveConfigPath(path?: string): string {\n return expandHomePath(path ?? DEFAULT_CONFIG_PATH);\n}\n\nexport async function loadConfig(path?: string): Promise<LoadedConfig> {\n const resolvedPath = resolveConfigPath(path);\n\n if (!existsSync(resolvedPath)) {\n return {\n config: createDefaultConfig(),\n exists: false,\n path: resolvedPath,\n };\n }\n\n let parsed: unknown;\n\n try {\n parsed = JSON.parse(await readFile(resolvedPath, 'utf8'));\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to load config: ${message}`);\n }\n\n return {\n config: mergeConfig(parsed),\n exists: true,\n path: resolvedPath,\n };\n}\n\nexport async function saveConfig(config: AisConfig, path?: string): Promise<void> {\n const resolvedPath = resolveConfigPath(path);\n const payload = `${JSON.stringify(config, null, 2)}\\n`;\n\n await mkdir(dirname(resolvedPath), { recursive: true });\n await writeFile(resolvedPath, payload, { mode: CONFIG_FILE_MODE });\n chmodSync(resolvedPath, CONFIG_FILE_MODE);\n}\n\nfunction mergeConfig(raw: unknown): AisConfig {\n if (!isRecord(raw)) {\n throw new Error('Failed to load config: root must be an object');\n }\n\n const config = createDefaultConfig();\n\n if ('detection' in raw) {\n const detection = expectObject(raw.detection, 'detection');\n\n if ('patterns' in detection) {\n config.detection.patterns = expectBoolean(detection.patterns, 'detection.patterns');\n }\n\n if ('context' in detection) {\n config.detection.context = expectBoolean(detection.context, 'detection.context');\n }\n\n if ('entropy' in detection) {\n config.detection.entropy = expectBoolean(detection.entropy, 'detection.entropy');\n }\n\n if ('entropyThreshold' in detection) {\n config.detection.entropyThreshold = expectFiniteNumber(\n detection.entropyThreshold,\n 'detection.entropyThreshold',\n );\n }\n }\n\n if ('ais' in raw) {\n const ais = expectObject(raw.ais, 'ais');\n\n if ('recentLimit' in ais) {\n config.ais.recentLimit = expectPositiveInteger(ais.recentLimit, 'ais.recentLimit');\n }\n\n if ('statePath' in ais) {\n config.ais.statePath = expectString(ais.statePath, 'ais.statePath');\n }\n }\n\n if ('automation' in raw) {\n const automation = expectObject(raw.automation, 'automation');\n\n if ('statePath' in automation) {\n config.automation.statePath = expectString(automation.statePath, 'automation.statePath');\n }\n }\n\n if ('display' in raw) {\n const display = expectObject(raw.display, 'display');\n\n if ('debug' in display) {\n config.display.debug = expectBoolean(display.debug, 'display.debug');\n }\n }\n\n if ('storage' in raw) {\n const storage = expectObject(raw.storage, 'storage');\n\n if ('persistSecrets' in storage) {\n config.storage.persistSecrets = expectBoolean(storage.persistSecrets, 'storage.persistSecrets');\n }\n\n if ('vaultPath' in storage) {\n config.storage.vaultPath = expectString(storage.vaultPath, 'storage.vaultPath');\n }\n }\n\n if ('update' in raw) {\n const update = expectObject(raw.update, 'update');\n\n if ('enabled' in update) {\n config.update.enabled = expectBoolean(update.enabled, 'update.enabled');\n }\n\n if ('channel' in update) {\n config.update.channel = expectUpdateChannel(update.channel, 'update.channel');\n }\n\n if ('checkIntervalMinutes' in update) {\n config.update.checkIntervalMinutes = expectPositiveInteger(\n update.checkIntervalMinutes,\n 'update.checkIntervalMinutes',\n );\n }\n\n if ('silent' in update) {\n config.update.silent = expectBoolean(update.silent, 'update.silent');\n }\n }\n\n if ('protect' in raw) {\n const protect = expectObject(raw.protect, 'protect');\n\n if ('enabled' in protect) {\n config.protect.enabled = expectBoolean(protect.enabled, 'protect.enabled');\n }\n\n if ('tools' in protect) {\n const tools = expectObject(protect.tools, 'protect.tools');\n\n if ('claude' in tools) {\n config.protect.tools.claude = expectBoolean(tools.claude, 'protect.tools.claude');\n }\n\n if ('codex' in tools) {\n config.protect.tools.codex = expectBoolean(tools.codex, 'protect.tools.codex');\n }\n\n if ('openclaw' in tools) {\n config.protect.tools.openclaw = expectBoolean(tools.openclaw, 'protect.tools.openclaw');\n }\n }\n }\n\n if ('customPatterns' in raw) {\n if (!Array.isArray(raw.customPatterns)) {\n throw new Error('Failed to load config: customPatterns must be an array');\n }\n\n config.customPatterns = raw.customPatterns.map((value, index) => parseCustomPattern(value, index));\n }\n\n return config;\n}\n\nfunction parseCustomPattern(value: unknown, index: number): CustomPatternConfig {\n const pattern = expectObject(value, `customPatterns[${index}]`);\n const id = expectString(pattern.id, `customPatterns[${index}].id`);\n const regex = expectString(pattern.regex, `customPatterns[${index}].regex`);\n const type = expectString(pattern.type, `customPatterns[${index}].type`);\n\n if (!isSecretType(type)) {\n throw new Error(`Failed to load config: customPatterns[${index}].type is invalid`);\n }\n\n try {\n new RegExp(regex, 'g');\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to load config: customPatterns[${index}].regex is invalid: ${message}`);\n }\n\n return {\n id,\n regex,\n type,\n };\n}\n\nfunction expectBoolean(value: unknown, path: string): boolean {\n if (typeof value !== 'boolean') {\n throw new Error(`Failed to load config: ${path} must be a boolean`);\n }\n\n return value;\n}\n\nfunction expectFiniteNumber(value: unknown, path: string): number {\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n throw new Error(`Failed to load config: ${path} must be a finite number`);\n }\n\n return value;\n}\n\nfunction expectPositiveInteger(value: unknown, path: string): number {\n const parsed = expectFiniteNumber(value, path);\n if (!Number.isInteger(parsed) || parsed < 1) {\n throw new Error(`Failed to load config: ${path} must be a positive integer`);\n }\n\n return parsed;\n}\n\nfunction expectUpdateChannel(value: unknown, path: string): UpdateChannel {\n if (typeof value !== 'string' || !isUpdateChannel(value)) {\n throw new Error(`Failed to load config: ${path} must be \"latest\" or \"next\"`);\n }\n\n return value;\n}\n\nfunction expectObject(value: unknown, path: string): Record<string, unknown> {\n if (!isRecord(value)) {\n throw new Error(`Failed to load config: ${path} must be an object`);\n }\n\n return value;\n}\n\nfunction expectString(value: unknown, path: string): string {\n if (typeof value !== 'string') {\n throw new Error(`Failed to load config: ${path} must be a string`);\n }\n\n return value;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object' && !Array.isArray(value);\n}\n","import { spawn } from 'node:child_process';\nimport { constants, existsSync } from 'node:fs';\nimport { access, chmod, lstat, mkdir, readFile, readlink, rename, rm, writeFile } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { basename, delimiter, dirname, join, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport {\n PROTECT_TOOLS,\n cloneAutomationState,\n createDefaultProtectToolRuntimeState,\n type AutomationState,\n type ProtectTool,\n type ProtectToolRuntimeState,\n} from '../automation/index.js';\nimport type { AisConfig } from '../config.js';\n\nconst EXECUTABLE_MODE = 0o755;\nconst MANAGED_WRAPPER_MARKER = '# AIS protect wrapper';\nconst SHELL_BLOCK_START = '# >>> AIS protect >>>';\nconst SHELL_BLOCK_END = '# <<< AIS protect <<<';\n\nexport interface ProtectShellCommandResult {\n exitCode: number;\n stderr: string;\n stdout: string;\n}\n\nexport type ProtectShellRunner = (\n command: string,\n args: string[],\n options: {\n env?: NodeJS.ProcessEnv;\n },\n) => Promise<ProtectShellCommandResult>;\n\nexport interface ProtectRuntimeOptions {\n aisCliPath?: string;\n env?: NodeJS.ProcessEnv;\n homeDir?: string;\n nodePath?: string;\n now?: () => number;\n shellPath?: string;\n shellRunner?: ProtectShellRunner;\n}\n\nexport interface ProtectSyncResult {\n changed: boolean;\n errors: string[];\n state: AutomationState;\n warnings: string[];\n}\n\nexport interface ProtectRestoreResult extends ProtectSyncResult {\n config: AisConfig;\n}\n\ninterface ProtectContext {\n aisCliPath: string;\n backupRootDir: string;\n env: NodeJS.ProcessEnv;\n homeDir: string;\n managedBinDir: string;\n nodePath: string;\n now: () => number;\n shellPath?: string;\n shellRunner: ProtectShellRunner;\n}\n\ninterface ToolCommandInfo {\n collision?: 'alias' | 'function';\n firstPath?: string;\n paths: string[];\n}\n\ninterface ToolOperationResult {\n error?: string;\n runtime: ProtectToolRuntimeState;\n usesManagedBin: boolean;\n warning?: string;\n}\n\nexport async function syncProtectRuntime(\n config: AisConfig,\n state: AutomationState,\n options: ProtectRuntimeOptions = {},\n): Promise<ProtectSyncResult> {\n const context = createContext(options);\n const nextState = cloneAutomationState(state);\n const warnings: string[] = [];\n const errors: string[] = [];\n let managedBinNeeded = false;\n\n for (const tool of PROTECT_TOOLS) {\n const desired = config.protect.enabled && config.protect.tools[tool];\n const result = desired\n ? await installToolTakeover(tool, nextState.protect.tools[tool], context)\n : await removeToolTakeover(tool, nextState.protect.tools[tool], context, true);\n\n nextState.protect.tools[tool] = result.runtime;\n managedBinNeeded ||= result.usesManagedBin;\n if (result.warning) {\n warnings.push(result.warning);\n }\n if (result.error) {\n errors.push(result.error);\n }\n }\n\n const shellChanged = managedBinNeeded\n ? await ensureShellBlock(context)\n : await removeShellBlock(context);\n\n return {\n changed: shellChanged || hasStateChanged(state, nextState),\n errors,\n state: nextState,\n warnings,\n };\n}\n\nexport async function refreshProtectRuntime(\n state: AutomationState,\n options: ProtectRuntimeOptions = {},\n): Promise<ProtectSyncResult> {\n const context = createContext(options);\n const nextState = cloneAutomationState(state);\n const warnings: string[] = [];\n\n for (const tool of PROTECT_TOOLS) {\n const current = nextState.protect.tools[tool];\n const inspection = await inspectToolRuntime(tool, current, context);\n nextState.protect.tools[tool] = inspection.runtime;\n if (inspection.warning) {\n warnings.push(inspection.warning);\n }\n }\n\n return {\n changed: hasStateChanged(state, nextState),\n errors: [],\n state: nextState,\n warnings,\n };\n}\n\nexport async function restoreProtectRuntime(\n config: AisConfig,\n state: AutomationState,\n options: ProtectRuntimeOptions = {},\n): Promise<ProtectRestoreResult> {\n const context = createContext(options);\n const nextState = cloneAutomationState(state);\n const warnings: string[] = [];\n const errors: string[] = [];\n\n for (const tool of PROTECT_TOOLS) {\n const result = await removeToolTakeover(tool, nextState.protect.tools[tool], context, false);\n nextState.protect.tools[tool] = result.runtime;\n if (result.warning) {\n warnings.push(result.warning);\n }\n if (result.error) {\n errors.push(result.error);\n }\n }\n\n const shellChanged = await removeShellBlock(context);\n const nextConfig = structuredClone(config);\n nextConfig.protect.enabled = false;\n nextConfig.protect.tools.claude = false;\n nextConfig.protect.tools.codex = false;\n nextConfig.protect.tools.openclaw = false;\n\n return {\n changed: shellChanged || hasStateChanged(state, nextState) || JSON.stringify(config.protect) !== JSON.stringify(nextConfig.protect),\n config: nextConfig,\n errors,\n state: nextState,\n warnings,\n };\n}\n\nexport async function resolveProtectedCommand(\n command: string,\n env: NodeJS.ProcessEnv = process.env,\n options: Pick<ProtectRuntimeOptions, 'homeDir'> = {},\n): Promise<string> {\n if (\n env.AIS_PROTECT_WRAPPER_ACTIVE !== '1' ||\n env.AIS_PROTECT_TOOL !== command ||\n !PROTECT_TOOLS.includes(command as ProtectTool)\n ) {\n return command;\n }\n\n const explicitCommand = env.AIS_PROTECT_REAL_COMMAND?.trim();\n const wrapperPath = env.AIS_PROTECT_WRAPPER_PATH?.trim();\n if (explicitCommand && explicitCommand !== wrapperPath && (await isExecutablePath(explicitCommand))) {\n return explicitCommand;\n }\n\n const homeDir = options.homeDir ?? env.HOME ?? homedir();\n const managedBinDir = env.AIS_PROTECT_WRAPPER_DIR?.trim() || join(homeDir, '.ais', 'bin');\n const found = await findCommandPaths(command as ProtectTool, env.PATH ?? process.env.PATH ?? '', {\n excludeDirs: [managedBinDir],\n excludePaths: wrapperPath ? [wrapperPath] : [],\n });\n\n if (found.paths[0]) {\n return found.paths[0];\n }\n\n throw new Error(\n `Protected command ${command} does not have a real target yet. Install the original tool first, or run \"ais protect off ${command}\".`,\n );\n}\n\nfunction createContext(options: ProtectRuntimeOptions): ProtectContext {\n const env = options.env ?? process.env;\n const homeDir = options.homeDir ?? env.HOME ?? homedir();\n return {\n aisCliPath: options.aisCliPath ?? resolveManagedCliPath(),\n backupRootDir: join(homeDir, '.ais', 'backups'),\n env,\n homeDir,\n managedBinDir: join(homeDir, '.ais', 'bin'),\n nodePath: options.nodePath ?? process.execPath,\n now: options.now ?? Date.now,\n shellPath: options.shellPath ?? env.SHELL,\n shellRunner: options.shellRunner ?? runShellCommand,\n };\n}\n\nfunction resolveManagedCliPath(): string {\n const candidatePaths = [\n fileURLToPath(new URL('../../dist/cli.js', import.meta.url)),\n fileURLToPath(new URL('../cli.js', import.meta.url)),\n process.argv[1] ? resolve(process.argv[1]) : undefined,\n ].filter((value): value is string => typeof value === 'string' && value.length > 0);\n\n const foundPath = candidatePaths.find((candidatePath) => existsSync(candidatePath));\n if (foundPath) {\n return foundPath;\n }\n\n return resolve(join(process.cwd(), 'dist', 'cli.js'));\n}\n\nasync function installToolTakeover(\n tool: ProtectTool,\n runtime: ProtectToolRuntimeState,\n context: ProtectContext,\n): Promise<ToolOperationResult> {\n const commandInfo = await findCommandPaths(tool, context.env.PATH ?? process.env.PATH ?? '', {\n context,\n excludeDirs: [context.managedBinDir],\n });\n const collisionMessage = formatCollisionMessage(tool, commandInfo.collision);\n\n if (runtime.installed && runtime.managedPath && (await isManagedWrapper(runtime.managedPath))) {\n if (runtime.managedPath.startsWith(context.managedBinDir)) {\n const rewritten = await installPrependTakeover(tool, runtime, commandInfo, context);\n if (collisionMessage && !rewritten.warning) {\n rewritten.warning = collisionMessage;\n }\n return rewritten;\n }\n\n const rewritten = await installInPlaceTakeover(\n tool,\n runtime.managedPath,\n runtime.originalCommandPath ?? runtime.managedPath,\n runtime.backupPath,\n context,\n );\n if (collisionMessage && !rewritten.warning) {\n rewritten.warning = collisionMessage;\n }\n return rewritten;\n }\n\n if (commandInfo.firstPath && (await shouldUseInPlaceTakeover(commandInfo.firstPath, context.homeDir))) {\n const installed = await installInPlaceTakeover(tool, commandInfo.firstPath, commandInfo.firstPath, undefined, context);\n if (collisionMessage && !installed.warning) {\n installed.warning = collisionMessage;\n }\n return installed;\n }\n\n const prepended = await installPrependTakeover(tool, runtime, commandInfo, context);\n if (collisionMessage && !prepended.warning) {\n prepended.warning = collisionMessage;\n }\n return prepended;\n}\n\nasync function installInPlaceTakeover(\n tool: ProtectTool,\n managedPath: string,\n originalCommandPath: string,\n currentBackupPath: string | undefined,\n context: ProtectContext,\n): Promise<ToolOperationResult> {\n const backupPath = currentBackupPath ?? join(context.backupRootDir, tool, basename(originalCommandPath));\n const wrapper = createWrapperScript(tool, managedPath, context, backupPath);\n let warning: string | undefined;\n\n if (currentBackupPath && !existsSync(currentBackupPath)) {\n warning = `${tool}: backup target is missing, fallback lookup will be used until it is rebuilt.`;\n }\n\n if (await isManagedWrapper(managedPath)) {\n await writeExecutableFile(managedPath, wrapper);\n return {\n runtime: buildRuntimeState({\n backupPath,\n installed: true,\n lastError: warning,\n managedPath,\n originalCommandPath,\n suspended: false,\n }, context),\n usesManagedBin: false,\n warning,\n };\n }\n\n await mkdir(dirname(backupPath), { recursive: true });\n if (existsSync(backupPath)) {\n await rm(backupPath, { force: true, recursive: true });\n }\n\n let renamed = false;\n try {\n await rename(managedPath, backupPath);\n renamed = true;\n await writeExecutableFile(managedPath, wrapper);\n\n return {\n runtime: buildRuntimeState({\n backupPath,\n installed: true,\n lastError: warning,\n managedPath,\n originalCommandPath,\n suspended: false,\n }, context),\n usesManagedBin: false,\n warning,\n };\n } catch (error) {\n if (renamed) {\n await rm(managedPath, { force: true }).catch(() => undefined);\n await rename(backupPath, managedPath).catch(() => undefined);\n }\n\n return {\n error: `${tool}: failed to install in-place takeover (${toErrorMessage(error)})`,\n runtime: buildRuntimeState({\n installed: false,\n lastError: `install failed: ${toErrorMessage(error)}`,\n originalCommandPath,\n suspended: false,\n }, context),\n usesManagedBin: false,\n };\n }\n}\n\nasync function installPrependTakeover(\n tool: ProtectTool,\n runtime: ProtectToolRuntimeState,\n commandInfo: ToolCommandInfo,\n context: ProtectContext,\n): Promise<ToolOperationResult> {\n if (runtime.installed && runtime.managedPath && !runtime.managedPath.startsWith(context.managedBinDir)) {\n const removed = await removeToolTakeover(tool, runtime, context, false);\n if (removed.error) {\n return removed;\n }\n }\n\n const managedPath = join(context.managedBinDir, tool);\n await mkdir(context.managedBinDir, { recursive: true });\n await writeExecutableFile(managedPath, createWrapperScript(tool, managedPath, context));\n\n const warningParts: string[] = [];\n if (!commandInfo.firstPath) {\n warningParts.push(`${tool}: original command is not installed yet; AIS will wait for it to appear later.`);\n }\n const collisionMessage = formatCollisionMessage(tool, commandInfo.collision);\n if (collisionMessage) {\n warningParts.push(collisionMessage);\n }\n\n return {\n runtime: buildRuntimeState({\n installed: true,\n lastError: warningParts.length === 0 ? undefined : warningParts.join(' '),\n managedPath,\n originalCommandPath: commandInfo.firstPath,\n suspended: false,\n }, context),\n usesManagedBin: true,\n warning: warningParts.length === 0 ? undefined : warningParts.join(' '),\n };\n}\n\nasync function removeToolTakeover(\n tool: ProtectTool,\n runtime: ProtectToolRuntimeState,\n context: ProtectContext,\n keepSuspended: boolean,\n): Promise<ToolOperationResult> {\n const managedPath = runtime.managedPath;\n const backupPath = runtime.backupPath;\n const originalCommandPath = runtime.originalCommandPath;\n\n if (managedPath && managedPath.startsWith(context.managedBinDir)) {\n if (existsSync(managedPath)) {\n await rm(managedPath, { force: true }).catch(() => undefined);\n }\n\n const commandInfo = await findCommandPaths(tool, context.env.PATH ?? process.env.PATH ?? '', {\n context,\n excludeDirs: [context.managedBinDir],\n });\n\n return {\n runtime: buildRuntimeState({\n installed: false,\n lastError: undefined,\n originalCommandPath: commandInfo.firstPath ?? originalCommandPath,\n suspended: keepSuspended,\n }, context),\n usesManagedBin: false,\n };\n }\n\n if (managedPath && backupPath && existsSync(backupPath)) {\n const managedIsWrapper = await isManagedWrapper(managedPath);\n\n try {\n if (managedIsWrapper) {\n await rm(managedPath, { force: true });\n await rename(backupPath, originalCommandPath ?? managedPath);\n } else if (!existsSync(originalCommandPath ?? managedPath)) {\n await rename(backupPath, originalCommandPath ?? managedPath);\n } else {\n await rm(backupPath, { force: true, recursive: true });\n }\n\n return {\n runtime: buildRuntimeState({\n installed: false,\n lastError: undefined,\n originalCommandPath: originalCommandPath ?? managedPath,\n suspended: keepSuspended,\n }, context),\n usesManagedBin: false,\n };\n } catch (error) {\n return {\n error: `${tool}: failed to restore original command (${toErrorMessage(error)})`,\n runtime: buildRuntimeState({\n backupPath,\n installed: managedIsWrapper,\n lastError: `restore failed: ${toErrorMessage(error)}`,\n managedPath,\n originalCommandPath: originalCommandPath ?? managedPath,\n suspended: keepSuspended,\n }, context),\n usesManagedBin: false,\n };\n }\n }\n\n const commandInfo = await findCommandPaths(tool, context.env.PATH ?? process.env.PATH ?? '', {\n context,\n excludeDirs: [context.managedBinDir],\n });\n\n return {\n runtime: buildRuntimeState({\n installed: false,\n lastError: undefined,\n originalCommandPath: commandInfo.firstPath ?? originalCommandPath,\n suspended: keepSuspended,\n }, context),\n usesManagedBin: false,\n };\n}\n\nasync function inspectToolRuntime(\n tool: ProtectTool,\n runtime: ProtectToolRuntimeState,\n context: ProtectContext,\n): Promise<ToolOperationResult> {\n const nextRuntime = {\n ...runtime,\n };\n\n const commandInfo = await findCommandPaths(tool, context.env.PATH ?? process.env.PATH ?? '', {\n context,\n excludeDirs: [context.managedBinDir],\n excludePaths: runtime.managedPath ? [runtime.managedPath] : [],\n });\n\n if (!runtime.managedPath) {\n nextRuntime.installed = false;\n nextRuntime.originalCommandPath = commandInfo.firstPath;\n nextRuntime.lastError = undefined;\n return {\n runtime: nextRuntime,\n usesManagedBin: false,\n };\n }\n\n const installed = await isManagedWrapper(runtime.managedPath);\n const warningParts: string[] = [];\n const collisionMessage = formatCollisionMessage(tool, commandInfo.collision);\n if (collisionMessage) {\n warningParts.push(collisionMessage);\n }\n if (runtime.managedPath.startsWith(context.managedBinDir) && !commandInfo.firstPath) {\n warningParts.push(`${tool}: original command is not installed yet.`);\n }\n if (!installed) {\n warningParts.push(`${tool}: managed entry is missing or has been replaced.`);\n }\n\n nextRuntime.installed = installed;\n nextRuntime.originalCommandPath = commandInfo.firstPath ?? runtime.originalCommandPath;\n nextRuntime.lastError = warningParts.length === 0 ? undefined : warningParts.join(' ');\n return {\n runtime: nextRuntime,\n usesManagedBin: runtime.managedPath.startsWith(context.managedBinDir),\n warning: warningParts.length === 0 ? undefined : warningParts.join(' '),\n };\n}\n\nasync function shouldUseInPlaceTakeover(commandPath: string, homeDir: string): Promise<boolean> {\n const normalized = resolve(commandPath);\n if (!normalized.startsWith(resolve(homeDir))) {\n return false;\n }\n\n const lower = normalized.toLowerCase();\n if (\n lower.includes('/.npm-global/bin/') ||\n lower.includes('/.npm/bin/') ||\n lower.includes('/node_modules/.bin/')\n ) {\n return true;\n }\n\n try {\n const entry = await lstat(commandPath);\n if (entry.isSymbolicLink()) {\n const linked = resolve(dirname(commandPath), await readlink(commandPath)).toLowerCase();\n return linked.includes('/node_modules/');\n }\n } catch {\n return false;\n }\n\n return false;\n}\n\nasync function findCommandPaths(\n tool: ProtectTool,\n pathValue: string,\n options: {\n context?: ProtectContext;\n excludeDirs?: string[];\n excludePaths?: string[];\n } = {},\n): Promise<ToolCommandInfo> {\n const directories = pathValue\n .split(delimiter)\n .map((entry) => entry.trim())\n .filter(Boolean)\n .map((entry) => resolve(entry));\n const excludeDirs = new Set((options.excludeDirs ?? []).map((entry) => resolve(entry)));\n const excludePaths = new Set((options.excludePaths ?? []).filter(Boolean).map((entry) => resolve(entry)));\n const paths: string[] = [];\n\n for (const directory of directories) {\n if (excludeDirs.has(directory)) {\n continue;\n }\n\n const candidate = resolve(directory, tool);\n if (excludePaths.has(candidate)) {\n continue;\n }\n\n if (!(await isExecutablePath(candidate))) {\n continue;\n }\n\n paths.push(candidate);\n }\n\n const shellInspection = await inspectShellCommand(tool, options.context);\n return {\n collision: shellInspection.collision,\n firstPath: paths[0],\n paths,\n };\n}\n\nasync function inspectShellCommand(\n tool: ProtectTool,\n context?: ProtectContext,\n): Promise<Pick<ToolCommandInfo, 'collision'>> {\n if (!context?.shellPath) {\n return {};\n }\n\n try {\n const result = await context.shellRunner(context.shellPath, ['-lic', `type -a ${tool}`], {\n env: context.env,\n });\n if (result.exitCode !== 0) {\n return {};\n }\n\n const firstLine = result.stdout\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .find((line) => line.length > 0);\n if (!firstLine) {\n return {};\n }\n\n if (/\\b(alias|aliased)\\b/i.test(firstLine)) {\n return { collision: 'alias' };\n }\n\n if (/\\bfunction\\b/i.test(firstLine)) {\n return { collision: 'function' };\n }\n } catch {\n return {};\n }\n\n return {};\n}\n\nasync function ensureShellBlock(context: ProtectContext): Promise<boolean> {\n const targets = await resolveShellTargets(context);\n const block = buildShellBlock();\n let changed = false;\n\n for (const target of targets) {\n const current = existsSync(target) ? await readFile(target, 'utf8') : '';\n const next = stripShellBlock(current).replace(/\\s+$/, '');\n const content = next.length === 0 ? `${block}\\n` : `${next}\\n\\n${block}\\n`;\n\n if (current === content) {\n continue;\n }\n\n await mkdir(dirname(target), { recursive: true });\n await writeFile(target, content, 'utf8');\n changed = true;\n }\n\n return changed;\n}\n\nasync function removeShellBlock(context: ProtectContext): Promise<boolean> {\n const targets = await resolveShellTargets(context, true);\n let changed = false;\n\n for (const target of targets) {\n if (!existsSync(target)) {\n continue;\n }\n\n const current = await readFile(target, 'utf8');\n const next = stripShellBlock(current).replace(/\\s+$/, '');\n const content = next.length === 0 ? '' : `${next}\\n`;\n if (current === content) {\n continue;\n }\n\n await writeFile(target, content, 'utf8');\n changed = true;\n }\n\n return changed;\n}\n\nasync function resolveShellTargets(context: ProtectContext, includeAllExisting = false): Promise<string[]> {\n const candidates = [\n join(context.homeDir, '.zshrc'),\n join(context.homeDir, '.zprofile'),\n join(context.homeDir, '.bashrc'),\n join(context.homeDir, '.bash_profile'),\n ];\n const existing = candidates.filter((target) => existsSync(target));\n if (includeAllExisting) {\n return existing;\n }\n\n if (existing.length > 0) {\n return existing;\n }\n\n const shellPath = context.shellPath ?? '';\n if (shellPath.includes('bash')) {\n return [join(context.homeDir, '.bashrc')];\n }\n\n return [join(context.homeDir, '.zshrc')];\n}\n\nfunction buildShellBlock(): string {\n return [\n SHELL_BLOCK_START,\n 'if [ -d \"$HOME/.ais/bin\" ]; then',\n ' export PATH=\"$HOME/.ais/bin:$PATH\"',\n 'fi',\n SHELL_BLOCK_END,\n ].join('\\n');\n}\n\nfunction stripShellBlock(content: string): string {\n const pattern = new RegExp(`${escapeForRegExp(SHELL_BLOCK_START)}[\\\\s\\\\S]*?${escapeForRegExp(SHELL_BLOCK_END)}\\\\n?`, 'g');\n return content.replace(pattern, '');\n}\n\nfunction escapeForRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nfunction createWrapperScript(\n tool: ProtectTool,\n managedPath: string,\n context: ProtectContext,\n realCommandPath?: string,\n): string {\n return [\n '#!/bin/sh',\n MANAGED_WRAPPER_MARKER,\n `export AIS_PROTECT_WRAPPER_ACTIVE=${quoteForShell('1')}`,\n `export AIS_PROTECT_TOOL=${quoteForShell(tool)}`,\n `export AIS_PROTECT_WRAPPER_PATH=${quoteForShell(managedPath)}`,\n `export AIS_PROTECT_WRAPPER_DIR=${quoteForShell(context.managedBinDir)}`,\n `export AIS_PROTECT_REAL_COMMAND=${quoteForShell(realCommandPath ?? '')}`,\n `exec ${quoteForShell(context.nodePath)} ${quoteForShell(context.aisCliPath)} ${quoteForShell(tool)} \"$@\"`,\n '',\n ].join('\\n');\n}\n\nfunction buildRuntimeState(\n state: Partial<ProtectToolRuntimeState>,\n context: ProtectContext,\n): ProtectToolRuntimeState {\n return {\n ...createDefaultProtectToolRuntimeState(),\n ...state,\n lastChangedAt: context.now(),\n };\n}\n\nfunction formatCollisionMessage(tool: ProtectTool, collision: ToolCommandInfo['collision']): string | undefined {\n if (!collision) {\n return undefined;\n }\n\n return `${tool}: your current shell still has a ${collision} ahead of AIS, so direct launches may keep hitting that ${collision}.`;\n}\n\nfunction quoteForShell(value: string): string {\n return `'${value.replace(/'/g, `'\\\\''`)}'`;\n}\n\nasync function isManagedWrapper(filePath: string): Promise<boolean> {\n if (!existsSync(filePath)) {\n return false;\n }\n\n try {\n const content = await readFile(filePath, 'utf8');\n return content.includes(MANAGED_WRAPPER_MARKER);\n } catch {\n return false;\n }\n}\n\nasync function isExecutablePath(path: string): Promise<boolean> {\n try {\n const stats = await lstat(path);\n if (stats.isDirectory()) {\n return false;\n }\n await access(path, constants.X_OK);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function writeExecutableFile(path: string, content: string): Promise<void> {\n await writeFile(path, content, 'utf8');\n await chmod(path, EXECUTABLE_MODE);\n}\n\nasync function runShellCommand(\n command: string,\n args: string[],\n options: {\n env?: NodeJS.ProcessEnv;\n },\n): Promise<ProtectShellCommandResult> {\n return await new Promise((resolvePromise, reject) => {\n const child = spawn(command, args, {\n env: options.env,\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n let stdout = '';\n let stderr = '';\n\n child.stdout.on('data', (chunk: Buffer | string) => {\n stdout += chunk.toString();\n });\n child.stderr.on('data', (chunk: Buffer | string) => {\n stderr += chunk.toString();\n });\n child.on('error', reject);\n child.on('close', (exitCode) => {\n resolvePromise({\n exitCode: exitCode ?? 1,\n stderr,\n stdout,\n });\n });\n });\n}\n\nfunction hasStateChanged(previous: AutomationState, next: AutomationState): boolean {\n return JSON.stringify(previous) !== JSON.stringify(next);\n}\n\nfunction toErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n"],"mappings":";AAAA,SAAS,oBAAoB;AAO7B,IAAI;AAEG,SAAS,iBAA8B;AAC5C,MAAI,mBAAmB;AACrB,WAAO;AAAA,EACT;AAEA,sBAAoB,gBAAgB;AACpC,SAAO;AACT;AAEO,IAAM,eAAe,eAAe,EAAE;AACtC,IAAM,UAAU,eAAe,EAAE;AAExC,SAAS,kBAA+B;AACtC,MAAI;AAEJ,MAAI;AACF,aAAS,KAAK,MAAM,aAAa,IAAI,IAAI,mBAAmB,YAAY,GAAG,GAAG,MAAM,CAAC;AAAA,EACvF,SAAS,OAAO;AACd,UAAM,IAAI,MAAM,gCAAgC,eAAe,KAAK,CAAC,EAAE;AAAA,EACzE;AAEA,MAAI,CAAC,SAAS,MAAM,GAAG;AACrB,UAAM,IAAI,MAAM,kEAAkE;AAAA,EACpF;AAEA,SAAO;AAAA,IACL,MAAM,aAAa,OAAO,MAAM,MAAM;AAAA,IACtC,SAAS,aAAa,OAAO,SAAS,SAAS;AAAA,EACjD;AACF;AAEA,SAAS,aAAa,OAAgB,KAAqB;AACzD,MAAI,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,WAAW,GAAG;AAC1D,UAAM,IAAI,MAAM,6CAA6C,GAAG,6BAA6B;AAAA,EAC/F;AAEA,SAAO;AACT;AAEA,SAAS,SAAS,OAAkD;AAClE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,eAAe,OAAwB;AAC9C,SAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAC9D;;;ACtDA,SAAS,kBAAkB;AAC3B,SAAS,WAAW,kBAAkB;AACtC,SAAS,OAAO,UAAU,iBAAiB;AAC3C,SAAS,eAAe;AACxB,SAAS,SAAS,YAAY;;;ACJvB,IAAM,eAAe;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAIO,IAAM,iBAAiB,CAAC,UAAU,QAAQ,SAAS,OAAO;AAoB1D,SAAS,aAAa,OAAqC;AAChE,SAAO,OAAO,UAAU,YAAY,aAAa,SAAS,KAAmB;AAC/E;AAEO,SAAS,eAAe,OAAuC;AACpE,SAAO,OAAO,UAAU,YAAY,eAAe,SAAS,KAAqB;AACnF;;;ADzBA,IAAM,kBAAkB;AAEjB,IAAM,iCAAiC;AA8BvC,SAAS,wBAAkC;AAChD,SAAO;AAAA,IACL,mBAAmB,CAAC;AAAA,IACpB,eAAe,CAAC;AAAA,IAChB,eAAe,CAAC;AAAA,EAClB;AACF;AAEO,SAAS,iBAAiB,QAAwB;AACvD,SAAO,WAAW,QAAQ,EAAE,OAAO,MAAM,EAAE,OAAO,KAAK,EAAE,MAAM,GAAG,EAAE;AACtE;AAEO,SAAS,oBAAoB,MAAuB;AACzD,SAAO,eAAe,QAAQ,8BAA8B;AAC9D;AAEO,IAAM,WAAN,MAAe;AAAA,EAKpB,YAA6B,UAA2B,CAAC,GAAG;AAA/B;AAAA,EAAgC;AAAA,EAJrD,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,QAAQ,sBAAsB;AAAA,EAItC,MAAM,OAA0B;AAC9B,QAAI,KAAK,QAAQ;AACf,aAAO,KAAK,SAAS;AAAA,IACvB;AAEA,UAAM,YAAY,KAAK,QAAQ;AAC/B,QAAI,CAAC,WAAW,SAAS,GAAG;AAC1B,WAAK,SAAS;AACd,aAAO,KAAK,SAAS;AAAA,IACvB;AAEA,QAAI;AAEJ,QAAI;AACF,eAAS,KAAK,MAAM,MAAM,SAAS,WAAW,MAAM,CAAC;AAAA,IACvD,SAAS,OAAO;AACd,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,YAAM,IAAI,MAAM,6BAA6B,OAAO,EAAE;AAAA,IACxD;AAEA,SAAK,QAAQ,cAAc,MAAM;AACjC,SAAK,SAAS;AACd,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA,EAEA,MAAM,OAAsB;AAC1B,QAAI,CAAC,KAAK,UAAU,CAAC,KAAK,OAAO;AAC/B;AAAA,IACF;AAEA,UAAM,YAAY,KAAK,QAAQ;AAC/B,UAAM,UAAU,GAAG,KAAK,UAAU,KAAK,OAAO,MAAM,CAAC,CAAC;AAAA;AACtD,UAAM,MAAM,QAAQ,SAAS,GAAG,EAAE,WAAW,KAAK,CAAC;AACnD,UAAM,UAAU,WAAW,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC7D,cAAU,WAAW,eAAe;AACpC,SAAK,QAAQ;AAAA,EACf;AAAA,EAEA,UAAkB;AAChB,WAAO,oBAAoB,KAAK,QAAQ,IAAI;AAAA,EAC9C;AAAA,EAEA,WAAqB;AACnB,WAAO;AAAA,MACL,mBAAmB,CAAC,GAAG,KAAK,MAAM,iBAAiB;AAAA,MACnD,eAAe,CAAC,GAAG,KAAK,MAAM,aAAa;AAAA,MAC3C,eAAe,KAAK,MAAM,cAAc,IAAI,CAAC,YAAY,EAAE,GAAG,OAAO,EAAE;AAAA,IACzE;AAAA,EACF;AAAA,EAEA,WAAW,QAAgB,MAA2B;AACpD,SAAK,aAAa;AAClB,WAAO,KAAK,MAAM,cAAc,SAAS,IAAI,KAAK,KAAK,MAAM,kBAAkB,SAAS,iBAAiB,MAAM,CAAC;AAAA,EAClH;AAAA,EAEA,aAAa,QAAgB,MAAkB,SAA+C;AAC5F,SAAK,aAAa;AAClB,UAAM,KAAK,iBAAiB,MAAM;AAClC,UAAM,YAAY,QAAQ,aAAa,KAAK,IAAI;AAChD,UAAM,UAAU,aAAa,MAAM;AACnC,UAAM,WAAW,KAAK,MAAM,cAAc,KAAK,CAACA,YAAWA,QAAO,OAAO,EAAE;AAE3E,QAAI,UAAU;AACZ,eAAS,aAAa;AACtB,eAAS,aAAa;AACtB,eAAS,OAAO;AAChB,eAAS,SAAS,QAAQ;AAC1B,eAAS,UAAU;AACnB,eAAS,OAAO,cAAc,QAAQ,IAAI,KAAK,SAAS;AACxD,WAAK,kBAAkB;AACvB,WAAK,QAAQ;AACb,aAAO,EAAE,GAAG,SAAS;AAAA,IACvB;AAEA,UAAM,SAA0B;AAAA,MAC9B;AAAA,MACA,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,MAAM,cAAc,QAAQ,IAAI;AAAA,MAChC;AAAA,MACA,WAAW;AAAA,MACX,QAAQ,QAAQ;AAAA,MAChB;AAAA,IACF;AACA,SAAK,MAAM,cAAc,QAAQ,MAAM;AACvC,SAAK,kBAAkB;AACvB,SAAK,kBAAkB;AACvB,SAAK,QAAQ;AACb,WAAO,EAAE,GAAG,OAAO;AAAA,EACrB;AAAA,EAEA,kBAAkB,IAAY,UAA4B;AACxD,SAAK,aAAa;AAClB,UAAM,eAAe,GAAG,KAAK;AAC7B,QAAI,CAAC,KAAK,MAAM,cAAc,KAAK,CAAC,WAAW,OAAO,OAAO,YAAY,GAAG;AAC1E,aAAO;AAAA,IACT;AAEA,UAAM,UAAU,IAAI,IAAI,KAAK,MAAM,iBAAiB;AACpD,UAAM,WAAW,QAAQ,IAAI,YAAY;AACzC,QAAI,UAAU;AACZ,cAAQ,IAAI,YAAY;AAAA,IAC1B,OAAO;AACL,cAAQ,OAAO,YAAY;AAAA,IAC7B;AAEA,QAAI,aAAa,UAAU;AACzB,aAAO;AAAA,IACT;AAEA,SAAK,MAAM,oBAAoB,MAAM,KAAK,OAAO,EAAE,KAAK;AACxD,SAAK,QAAQ;AACb,WAAO;AAAA,EACT;AAAA,EAEA,gBAAgB,MAAkB,UAAyB;AACzD,SAAK,aAAa;AAClB,UAAM,YAAY,IAAI,IAAI,KAAK,MAAM,aAAa;AAClD,UAAM,WAAW,UAAU,IAAI,IAAI;AACnC,QAAI,UAAU;AACZ,gBAAU,IAAI,IAAI;AAAA,IACpB,OAAO;AACL,gBAAU,OAAO,IAAI;AAAA,IACvB;AAEA,QAAI,aAAa,UAAU;AACzB;AAAA,IACF;AAEA,SAAK,MAAM,gBAAgB,MAAM,KAAK,SAAS,EAAE,KAAK;AACtD,SAAK,QAAQ;AAAA,EACf;AAAA,EAEQ,eAAqB;AAC3B,QAAI,CAAC,KAAK,QAAQ;AAChB,YAAM,IAAI,MAAM,sCAAsC;AAAA,IACxD;AAAA,EACF;AAAA,EAEQ,oBAA0B;AAChC,SAAK,MAAM,cAAc,KAAK,CAAC,MAAM,UAAU,MAAM,aAAa,KAAK,UAAU;AAAA,EACnF;AAAA,EAEQ,oBAA0B;AAChC,UAAM,cAAc,KAAK,IAAI,GAAG,KAAK,QAAQ,eAAe,EAAE;AAC9D,QAAI,KAAK,MAAM,cAAc,SAAS,aAAa;AACjD,WAAK,MAAM,cAAc,SAAS;AAAA,IACpC;AAAA,EACF;AACF;AAEA,SAAS,aAAa,QAAwB;AAC5C,QAAM,aAAa,OAAO,QAAQ,QAAQ,GAAG,EAAE,KAAK;AACpD,MAAI,WAAW,UAAU,GAAG;AAC1B,WAAO,GAAG,WAAW,MAAM,GAAG,CAAC,CAAC,MAAM,WAAW,MAAM,EAAE,CAAC;AAAA,EAC5D;AAEA,MAAI,WAAW,UAAU,IAAI;AAC3B,WAAO,GAAG,WAAW,MAAM,GAAG,CAAC,CAAC,MAAM,WAAW,MAAM,EAAE,CAAC;AAAA,EAC5D;AAEA,SAAO,GAAG,WAAW,MAAM,GAAG,CAAC,CAAC,MAAM,WAAW,MAAM,EAAE,CAAC;AAC5D;AAEA,SAAS,cAAc,KAAwB;AAC7C,MAAI,CAACC,UAAS,GAAG,GAAG;AAClB,UAAM,IAAI,MAAM,kDAAkD;AAAA,EACpE;AAEA,QAAM,QAAQ,sBAAsB;AAEpC,MAAI,uBAAuB,KAAK;AAC9B,QAAI,CAAC,MAAM,QAAQ,IAAI,iBAAiB,KAAK,CAAC,IAAI,kBAAkB,MAAM,CAAC,UAAU,OAAO,UAAU,QAAQ,GAAG;AAC/G,YAAM,IAAI,MAAM,oEAAoE;AAAA,IACtF;AAEA,UAAM,oBAAoB,IAAI,kBAAkB,IAAI,CAAC,UAAU,MAAM,KAAK,CAAC,EAAE,OAAO,OAAO;AAAA,EAC7F;AAEA,MAAI,mBAAmB,KAAK;AAC1B,QAAI,CAAC,MAAM,QAAQ,IAAI,aAAa,KAAK,CAAC,IAAI,cAAc,MAAM,YAAY,GAAG;AAC/E,YAAM,IAAI,MAAM,yEAAyE;AAAA,IAC3F;AAEA,UAAM,gBAAgB,CAAC,GAAG,IAAI,aAAa;AAAA,EAC7C;AAEA,MAAI,mBAAmB,KAAK;AAC1B,QAAI,CAAC,MAAM,QAAQ,IAAI,aAAa,GAAG;AACrC,YAAM,IAAI,MAAM,0DAA0D;AAAA,IAC5E;AAEA,UAAM,gBAAgB,IAAI,cAAc,IAAI,CAAC,OAAO,UAAU,kBAAkB,OAAO,KAAK,CAAC;AAAA,EAC/F;AAEA,SAAO;AACT;AAEA,SAAS,kBAAkB,OAAgB,OAAgC;AACzE,MAAI,CAACA,UAAS,KAAK,GAAG;AACpB,UAAM,IAAI,MAAM,2CAA2C,KAAK,qBAAqB;AAAA,EACvF;AAEA,QAAM,KAAKC,cAAa,MAAM,IAAI,iBAAiB,KAAK,MAAM;AAC9D,QAAM,YAAY,aAAa,MAAM,WAAW,iBAAiB,KAAK,aAAa;AACnF,QAAM,aAAa,aAAa,MAAM,YAAY,iBAAiB,KAAK,cAAc;AACtF,QAAM,UAAUA,cAAa,MAAM,SAAS,iBAAiB,KAAK,WAAW;AAC7E,QAAM,YAAY,aAAa,MAAM,WAAW,iBAAiB,KAAK,aAAa;AACnF,QAAM,SAAS,mBAAmB,MAAM,QAAQ,iBAAiB,KAAK,UAAU;AAChF,QAAM,OAAO,iBAAiB,MAAM,MAAM,iBAAiB,KAAK,QAAQ;AAExE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,MAAM,cAAc,qBAAqB,MAAM,MAAM,iBAAiB,KAAK,QAAQ,CAAC;AAAA,IACpF;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,aAAa,OAAgB,MAAsB;AAC1D,MAAI,OAAO,UAAU,YAAY,CAAC,OAAO,SAAS,KAAK,GAAG;AACxD,UAAM,IAAI,MAAM,6BAA6B,IAAI,0BAA0B;AAAA,EAC7E;AAEA,SAAO;AACT;AAEA,SAAS,qBAAqB,OAAgB,MAAkC;AAC9E,MAAI,UAAU,QAAW;AACvB,WAAO;AAAA,EACT;AAEA,SAAOA,cAAa,OAAO,IAAI;AACjC;AAEA,SAAS,mBAAmB,OAAgB,MAA4B;AACtE,MAAI,CAAC,eAAe,KAAK,GAAG;AAC1B,UAAM,IAAI,MAAM,6BAA6B,IAAI,yBAAyB;AAAA,EAC5E;AAEA,SAAO;AACT;AAEA,SAAS,iBAAiB,OAAgB,MAA0B;AAClE,MAAI,CAAC,aAAa,KAAK,GAAG;AACxB,UAAM,IAAI,MAAM,6BAA6B,IAAI,uBAAuB;AAAA,EAC1E;AAEA,SAAO;AACT;AAEA,SAASA,cAAa,OAAgB,MAAsB;AAC1D,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,IAAI,MAAM,6BAA6B,IAAI,mBAAmB;AAAA,EACtE;AAEA,SAAO;AACT;AAEA,SAASD,UAAS,OAAkD;AAClE,SAAO,CAAC,CAAC,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;AACrE;AAEA,SAAS,cAAc,MAA8C;AACnE,MAAI,SAAS,QAAW;AACtB,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,KAAK,KAAK;AAC1B,SAAO,QAAQ,WAAW,IAAI,SAAY;AAC5C;AAMA,SAAS,eAAe,MAAsB;AAC5C,MAAI,SAAS,KAAK;AAChB,WAAO,QAAQ;AAAA,EACjB;AAEA,MAAI,KAAK,WAAW,IAAI,GAAG;AACzB,WAAO,KAAK,QAAQ,GAAG,KAAK,MAAM,CAAC,CAAC;AAAA,EACtC;AAEA,SAAO;AACT;;;AEtWA,SAAS,aAAAE,YAAW,cAAAC,mBAAkB;AACtC,SAAS,SAAAC,QAAO,YAAAC,WAAU,QAAQ,aAAAC,kBAAiB;AACnD,SAAS,WAAAC,gBAAe;AACxB,SAAS,WAAAC,UAAS,QAAAC,aAAY;;;ACHvB,IAAM,gBAAgB,CAAC,UAAU,SAAS,UAAU;AACpD,IAAM,kBAAkB,CAAC,UAAU,MAAM;AAKzC,SAAS,cAAc,OAAqC;AACjE,SAAO,cAAc,SAAS,KAAoB;AACpD;AAEO,SAAS,gBAAgB,OAAuC;AACrE,SAAO,gBAAgB,SAAS,KAAsB;AACxD;;;ADCA,IAAMC,mBAAkB;AAEjB,IAAM,wCAAwC;AA2C9C,SAAS,+BAAgD;AAC9D,SAAO;AAAA,IACL,SAAS;AAAA,MACP,OAAO,OAAO;AAAA,QACZ,cAAc,IAAI,CAAC,SAAS,CAAC,MAAM,qCAAqC,CAAC,CAAC;AAAA,MAC5E;AAAA,IACF;AAAA,IACA,QAAQ;AAAA,MACN,YAAY;AAAA,MACZ,eAAe;AAAA,IACjB;AAAA,EACF;AACF;AAEO,SAAS,uCAAgE;AAC9E,SAAO;AAAA,IACL,WAAW;AAAA,IACX,WAAW;AAAA,EACb;AACF;AAEO,SAAS,2BAA2B,MAAuB;AAChE,SAAOC,gBAAe,QAAQ,qCAAqC;AACrE;AAEA,eAAsB,oBAAoB,MAA+C;AACvF,QAAM,eAAe,2BAA2B,IAAI;AAEpD,MAAI,CAACC,YAAW,YAAY,GAAG;AAC7B,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,OAAO,6BAA6B;AAAA,IACtC;AAAA,EACF;AAEA,MAAI;AAEJ,MAAI;AACF,aAAS,KAAK,MAAM,MAAMC,UAAS,cAAc,MAAM,CAAC;AAAA,EAC1D,SAAS,OAAO;AACd,WAAO,uBAAuB,cAAc,KAAK;AAAA,EACnD;AAEA,MAAI;AACF,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,OAAO,qBAAqB,MAAM;AAAA,IACpC;AAAA,EACF,SAAS,OAAO;AACd,WAAO,uBAAuB,cAAc,KAAK;AAAA,EACnD;AACF;AAEA,eAAsB,oBAAoB,OAAwB,MAA8B;AAC9F,QAAM,eAAe,2BAA2B,IAAI;AACpD,QAAM,UAAU,GAAG,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAAA;AAEjD,QAAMC,OAAMC,SAAQ,YAAY,GAAG,EAAE,WAAW,KAAK,CAAC;AACtD,QAAMC,WAAU,cAAc,SAAS,EAAE,MAAMN,iBAAgB,CAAC;AAChE,EAAAO,WAAU,cAAcP,gBAAe;AACzC;AAEO,SAAS,yBACd,OACA,MACA,MAAM,KAAK,IAAI,GACE;AACjB,QAAM,OAAO,qBAAqB,KAAK;AACvC,QAAM,UAAU,OAAO,CAAC,IAAI,IAAI;AAEhC,aAAW,eAAe,SAAS;AACjC,SAAK,QAAQ,MAAM,WAAW,IAAI;AAAA,MAChC,GAAG,qCAAqC;AAAA,MACxC,eAAe;AAAA,IACjB;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,qBAAqB,OAAyC;AAC5E,SAAO;AAAA,IACL,SAAS;AAAA,MACP,OAAO,OAAO;AAAA,QACZ,cAAc,IAAI,CAAC,SAAS;AAAA,UAC1B;AAAA,UACA;AAAA,YACE,GAAG,MAAM,QAAQ,MAAM,IAAI;AAAA,UAC7B;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IACA,QAAQ;AAAA,MACN,GAAG,MAAM;AAAA,IACX;AAAA,EACF;AACF;AAEA,SAAS,qBAAqB,KAA+B;AAC3D,MAAI,CAACQ,UAAS,GAAG,GAAG;AAClB,UAAM,IAAI,MAAM,yDAAyD;AAAA,EAC3E;AAEA,QAAM,QAAQ,6BAA6B;AAE3C,MAAI,YAAY,KAAK;AACnB,UAAM,SAAS,aAAa,IAAI,QAAQ,QAAQ;AAEhD,QAAI,gBAAgB,QAAQ;AAC1B,YAAM,OAAO,aAAa,wBAAwB,OAAO,YAAY,mBAAmB;AAAA,IAC1F;AAEA,QAAI,mBAAmB,QAAQ;AAC7B,YAAM,OAAO,gBAAgB,cAAc,OAAO,eAAe,sBAAsB;AAAA,IACzF;AAEA,QAAI,mBAAmB,QAAQ;AAC7B,YAAM,OAAO,gBAAgB,2BAA2B,OAAO,eAAe,sBAAsB;AAAA,IACtG;AAEA,QAAI,iBAAiB,QAAQ;AAC3B,YAAM,OAAO,cAAc,4BAA4B,OAAO,aAAa,oBAAoB;AAAA,IACjG;AAEA,QAAI,sBAAsB,QAAQ;AAChC,YAAM,OAAO,mBAAmBC,sBAAqB,OAAO,kBAAkB,yBAAyB;AAAA,IACzG;AAEA,QAAI,uBAAuB,QAAQ;AACjC,YAAM,OAAO,oBAAoBA,sBAAqB,OAAO,mBAAmB,0BAA0B;AAAA,IAC5G;AAEA,QAAI,eAAe,QAAQ;AACzB,YAAM,OAAO,YAAYA,sBAAqB,OAAO,WAAW,kBAAkB;AAAA,IACpF;AAAA,EACF;AAEA,MAAI,aAAa,KAAK;AACpB,UAAM,UAAU,aAAa,IAAI,SAAS,SAAS;AACnD,QAAI,WAAW,SAAS;AACtB,YAAM,QAAQ,aAAa,QAAQ,OAAO,eAAe;AACzD,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAChD,YAAI,CAAC,cAAc,GAAG,GAAG;AACvB,gBAAM,IAAI,MAAM,kDAAkD,GAAG,mBAAmB;AAAA,QAC1F;AAEA,cAAM,QAAQ,MAAM,GAAG,IAAI,6BAA6B,OAAO,iBAAiB,GAAG,EAAE;AAAA,MACvF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,6BAA6B,OAAgB,MAAuC;AAC3F,QAAM,YAAY,aAAa,OAAO,IAAI;AAC1C,QAAM,SAAS,qCAAqC;AAEpD,MAAI,eAAe,WAAW;AAC5B,WAAO,YAAY,cAAc,UAAU,WAAW,GAAG,IAAI,YAAY;AAAA,EAC3E;AAEA,MAAI,eAAe,WAAW;AAC5B,WAAO,YAAY,cAAc,UAAU,WAAW,GAAG,IAAI,YAAY;AAAA,EAC3E;AAEA,MAAI,iBAAiB,WAAW;AAC9B,WAAO,cAAcA,sBAAqB,UAAU,aAAa,GAAG,IAAI,cAAc;AAAA,EACxF;AAEA,MAAI,gBAAgB,WAAW;AAC7B,WAAO,aAAaA,sBAAqB,UAAU,YAAY,GAAG,IAAI,aAAa;AAAA,EACrF;AAEA,MAAI,yBAAyB,WAAW;AACtC,WAAO,sBAAsBA;AAAA,MAC3B,UAAU;AAAA,MACV,GAAG,IAAI;AAAA,IACT;AAAA,EACF;AAEA,MAAI,eAAe,WAAW;AAC5B,WAAO,YAAYA,sBAAqB,UAAU,WAAW,GAAG,IAAI,YAAY;AAAA,EAClF;AAEA,MAAI,mBAAmB,WAAW;AAChC,WAAO,gBAAgB,2BAA2B,UAAU,eAAe,GAAG,IAAI,gBAAgB;AAAA,EACpG;AAEA,SAAO;AACT;AAEA,eAAe,uBAAuB,MAAc,OAAgD;AAClG,QAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,QAAM,aAAa,GAAG,IAAI,YAAY,KAAK,IAAI,CAAC;AAEhD,MAAI;AACJ,MAAI;AACF,UAAM,OAAO,MAAM,UAAU;AAC7B,oBAAgB;AAAA,EAClB,QAAQ;AACN,oBAAgB;AAAA,EAClB;AAEA,SAAO;AAAA,IACL,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA,gBAAgB;AAAA,IAChB,OAAO,6BAA6B;AAAA,EACtC;AACF;AAEA,SAAS,wBAAwB,OAAgB,MAAiC;AAChF,MACE,UAAU,eACV,UAAU,YACV,UAAU,WACV,UAAU,aACV,UAAU,gBACV,UAAU,WACV;AACA,UAAM,IAAI,MAAM,oCAAoC,IAAI,gCAAgC;AAAA,EAC1F;AAEA,SAAO;AACT;AAEA,SAAS,cAAc,OAAgB,MAAuB;AAC5D,MAAI,OAAO,UAAU,WAAW;AAC9B,UAAM,IAAI,MAAM,oCAAoC,IAAI,oBAAoB;AAAA,EAC9E;AAEA,SAAO;AACT;AAEA,SAAS,aAAa,OAAgB,MAAuC;AAC3E,MAAI,CAACD,UAAS,KAAK,GAAG;AACpB,UAAM,IAAI,MAAM,oCAAoC,IAAI,oBAAoB;AAAA,EAC9E;AAEA,SAAO;AACT;AAEA,SAAS,2BAA2B,OAAgB,MAAkC;AACpF,MAAI,UAAU,QAAW;AACvB,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,UAAU,YAAY,CAAC,OAAO,SAAS,KAAK,GAAG;AACxD,UAAM,IAAI,MAAM,oCAAoC,IAAI,0BAA0B;AAAA,EACpF;AAEA,SAAO;AACT;AAEA,SAASC,sBAAqB,OAAgB,MAAkC;AAC9E,MAAI,UAAU,QAAW;AACvB,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,IAAI,MAAM,oCAAoC,IAAI,mBAAmB;AAAA,EAC7E;AAEA,SAAO;AACT;AAEA,SAAS,4BAA4B,OAAgB,MAAyC;AAC5F,MAAI,UAAU,QAAW;AACvB,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,UAAU,YAAY,CAAC,gBAAgB,KAAK,GAAG;AACxD,UAAM,IAAI,MAAM,oCAAoC,IAAI,mBAAmB,qBAAqB,EAAE;AAAA,EACpG;AAEA,SAAO;AACT;AAEA,SAASD,UAAS,OAAkD;AAClE,SAAO,CAAC,CAAC,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;AACrE;AAEA,SAASP,gBAAe,MAAsB;AAC5C,MAAI,SAAS,KAAK;AAChB,WAAOS,SAAQ;AAAA,EACjB;AAEA,MAAI,KAAK,WAAW,IAAI,GAAG;AACzB,WAAOC,MAAKD,SAAQ,GAAG,KAAK,MAAM,CAAC,CAAC;AAAA,EACtC;AAEA,SAAO;AACT;AAEA,IAAM,wBAAwB;;;AEpW9B,SAAS,gBAAgB,iBAAiB;AAC1C,SAAS,WAAAE,gBAAe;;;ACSxB,IAAM,iBAAiB,OAAO;AAC9B,IAAM,qBAAqB,oBAAI,IAAI,CAAC,OAAO,MAAM,KAAK,CAAC;AACvD,IAAM,wBAAwB,oBAAI,IAAI,CAAC,MAAM,MAAM,KAAK,KAAK,UAAK,UAAK,UAAK,KAAK,KAAK,KAAK,KAAK,GAAI,CAAC;AAErG,IAAM,gBAA+B;AAAA,EACnC;AAAA,IACE,IAAI;AAAA,IACJ,YAAY,IAAI,OAAO,OAAO,gBAAgB,cAAc,gBAAgB,cAAc,IAAI,GAAG;AAAA,IACjG,QAAQ,SAAS;AACf,aAAO,YAAY,iBAAO,WAAW;AAAA,IACvC;AAAA,EACF;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,YAAY,IAAI;AAAA,MACd,OAAO,oDAAoD,cAAc,eAAe,cAAc;AAAA,MACtG;AAAA,IACF;AAAA,IACA,QAAQ,SAAS;AACf,aAAO,gBAAgB,OAAO;AAAA,IAChC;AAAA,EACF;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,YAAY,IAAI;AAAA,MACd,OAAO,uFAAuF,cAAc,IAAI,cAAc;AAAA,MAC9H;AAAA,IACF;AAAA,IACA,QAAQ,SAAS;AACf,aAAO,gBAAgB,OAAO;AAAA,IAChC;AAAA,EACF;AACF;AAEA,SAAS,gBAAgB,SAA6B;AACpD,QAAM,aAAa,QAAQ,YAAY;AAEvC,MAAI,WAAW,SAAS,UAAU,KAAK,WAAW,SAAS,QAAQ,KAAK,WAAW,SAAS,cAAI,GAAG;AACjG,WAAO;AAAA,EACT;AAEA,MAAI,WAAW,SAAS,SAAS,KAAK,WAAW,SAAS,SAAS,KAAK,WAAW,SAAS,cAAI,GAAG;AACjG,WAAO;AAAA,EACT;AAEA,MAAI,WAAW,SAAS,OAAO,GAAG;AAChC,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,cAAc,WAA4B;AACjD,SAAO,WAAW,KAAK,SAAS;AAClC;AAEA,SAAS,sBAAsB,WAA4B;AACzD,SAAO,gBAAgB,KAAK,SAAS;AACvC;AAEA,SAAS,eAAe,WAA4B;AAClD,SAAO,kBAAkB,KAAK,SAAS;AACzC;AAEA,SAAS,qBAAqB,OAAe,OAAuB;AAClE,MAAI,SAAS;AAEb,SAAO,SAAS,MAAM,QAAQ;AAC5B,UAAM,YAAY,MAAM,MAAM;AAC9B,QAAI,cAAc,QAAQ,cAAc,QAAQ,CAAC,KAAK,KAAK,SAAS,GAAG;AACrE;AAAA,IACF;AAEA,cAAU;AAAA,EACZ;AAEA,SAAO;AACT;AAEA,SAAS,cAAc,OAAe,OAAuB;AAC3D,QAAM,YAAY,MAAM,MAAM,KAAK,EAAE,YAAY;AAEjD,aAAW,aAAa,oBAAoB;AAC1C,QAAI,CAAC,UAAU,WAAW,SAAS,GAAG;AACpC;AAAA,IACF;AAEA,UAAM,gBAAgB,MAAM,QAAQ,UAAU,MAAM,KAAK;AACzD,QAAI,CAAC,sBAAsB,aAAa,GAAG;AACzC,aAAO,QAAQ,UAAU;AAAA,IAC3B;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,cAAc,OAAe,OAAuB;AAC3D,MAAI,SAAS,MAAM,QAAQ;AACzB,WAAO;AAAA,EACT;AAEA,QAAM,iBAAiB,MAAM,KAAK;AAClC,MAAI,cAAc,cAAc,KAAK,mBAAmB,KAAK;AAC3D,QAAIC,UAAS,QAAQ;AACrB,WAAOA,UAAS,MAAM,UAAU,sBAAsB,MAAMA,OAAM,CAAC,GAAG;AACpE,MAAAA,WAAU;AAAA,IACZ;AAEA,WAAOA;AAAA,EACT;AAEA,MAAI,CAAC,eAAe,cAAc,GAAG;AACnC,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,QAAQ;AACrB,SAAO,SAAS,MAAM,UAAU,eAAe,MAAM,MAAM,CAAC,GAAG;AAC7D,cAAU;AAAA,EACZ;AAEA,SAAO;AACT;AAEA,SAAS,kBAAkB,OAAe,OAAuB;AAC/D,QAAM,0BAA0B,MAAM,KAAK;AAC3C,MAAI,4BAA4B,OAAO,4BAA4B,OAAO,4BAA4B,UAAK;AACzG,WAAO,QAAQ;AAAA,EACjB;AAEA,MAAI,4BAA4B,YAAO,4BAA4B,UAAK;AACtE,WAAO,QAAQ;AAAA,EACjB;AAEA,QAAM,YAAY,MAAM,MAAM,OAAO,QAAQ,CAAC,EAAE,YAAY;AAC5D,MAAI,cAAc,MAAM;AACtB,UAAM,gBAAgB,MAAM,QAAQ,CAAC,KAAK;AAC1C,QAAI,CAAC,sBAAsB,aAAa,GAAG;AACzC,aAAO,QAAQ;AAAA,IACjB;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,gBAAgB,OAAe,OAAwB;AAC9D,MAAI,SAAS,qBAAqB,OAAO,KAAK;AAC9C,MAAI,UAAU,MAAM,UAAU,MAAM,MAAM,MAAM,QAAQ,MAAM,MAAM,MAAM,MAAM;AAC9E,WAAO;AAAA,EACT;AAEA,QAAM,iBAAiB,cAAc,OAAO,MAAM;AAClD,MAAI,iBAAiB,QAAQ;AAC3B,aAAS,qBAAqB,OAAO,cAAc;AAAA,EACrD;AAEA,QAAM,iBAAiB,cAAc,OAAO,MAAM;AAClD,MAAI,mBAAmB,QAAQ;AAC7B,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB,OAAO,cAAc;AACnD,QAAM,gBAAgB,kBAAkB,OAAO,MAAM;AAErD,SAAO,gBAAgB;AACzB;AAEA,SAAS,aACP,OACA,OAIO;AACP,QAAM,eAAe,MAAM,KAAK;AAChC,MAAI,iBAAiB,OAAO,iBAAiB,KAAM;AACjD,UAAM,eAAe,MAAM,QAAQ,cAAc,QAAQ,CAAC;AAC1D,QAAI,gBAAgB,QAAQ,GAAG;AAC7B,aAAO;AAAA,IACT;AAEA,UAAM,cAAc,MAAM,MAAM,QAAQ,GAAG,YAAY;AACvD,QAAI,YAAY,SAAS,IAAI,KAAK,YAAY,SAAS,IAAI,GAAG;AAC5D,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,MACL,OAAO;AAAA,MACP,KAAK,eAAe;AAAA,IACtB;AAAA,EACF;AAEA,MAAI,SAAS;AACb,SAAO,SAAS,MAAM,QAAQ;AAC5B,UAAM,YAAY,MAAM,MAAM;AAC9B,QAAI,sBAAsB,IAAI,SAAS,GAAG;AACxC;AAAA,IACF;AAEA,QAAI,KAAK,KAAK,SAAS,KAAK,gBAAgB,OAAO,MAAM,GAAG;AAC1D;AAAA,IACF;AAEA,cAAU;AAAA,EACZ;AAEA,QAAM,WAAW,MAAM,MAAM,OAAO,MAAM,EAAE,QAAQ;AACpD,MAAI,SAAS,WAAW,GAAG;AACzB,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,OAAO;AAAA,IACP,KAAK,QAAQ,SAAS;AAAA,EACxB;AACF;AAEA,SAAS,OAAO,SAA6C;AAC3D,QAAM,OAAO,oBAAI,IAAY;AAE7B,SAAO,QAAQ,OAAO,CAAC,UAAU;AAC/B,UAAM,MAAM,GAAG,MAAM,KAAK,IAAI,MAAM,GAAG,IAAI,MAAM,SAAS;AAC1D,QAAI,KAAK,IAAI,GAAG,GAAG;AACjB,aAAO;AAAA,IACT;AAEA,SAAK,IAAI,GAAG;AACZ,WAAO;AAAA,EACT,CAAC;AACH;AAEO,IAAM,kBAAN,MAAgD;AAAA,EACrD,OAAO,OAAiC;AACtC,UAAM,UAA4B,CAAC;AAEnC,eAAW,QAAQ,eAAe;AAChC,iBAAW,SAAS,MAAM,SAAS,KAAK,UAAU,GAAG;AACnD,cAAM,UAAU,MAAM,CAAC;AACvB,YAAI,CAAC,WAAW,MAAM,UAAU,QAAW;AACzC;AAAA,QACF;AAEA,cAAM,QAAQ,MAAM,QAAQ,MAAM,CAAC,EAAE;AACrC,cAAM,QAAQ,aAAa,OAAO,KAAK;AACvC,YAAI,CAAC,OAAO;AACV;AAAA,QACF;AAEA,gBAAQ,KAAK;AAAA,UACX,OAAO,MAAM;AAAA,UACb,MAAM,KAAK,QAAQ,OAAO;AAAA,UAC1B,YAAY;AAAA,UACZ;AAAA,UACA,KAAK,MAAM;AAAA,UACX,WAAW,KAAK;AAAA,QAClB,CAAC;AAAA,MACH;AAAA,IACF;AAEA,WAAO,OAAO,OAAO,EAAE,KAAK,CAAC,MAAM,UAAU,KAAK,QAAQ,MAAM,SAAS,KAAK,MAAM,MAAM,GAAG;AAAA,EAC/F;AACF;;;AC5QA,IAAM,oBAAoB;AAC1B,IAAM,wBAAwB;AAC9B,IAAM,2BAA2B;AAEjC,IAAM,sBAAsB;AAC5B,IAAM,yBAAyB;AAM/B,SAAS,wBAAwB,OAAuB;AACtD,QAAM,SAAS,oBAAI,IAAoB;AAEvC,aAAW,QAAQ,OAAO;AACxB,WAAO,IAAI,OAAO,OAAO,IAAI,IAAI,KAAK,KAAK,CAAC;AAAA,EAC9C;AAEA,MAAI,UAAU;AACd,aAAW,SAAS,OAAO,OAAO,GAAG;AACnC,UAAM,cAAc,QAAQ,MAAM;AAClC,eAAW,cAAc,KAAK,KAAK,WAAW;AAAA,EAChD;AAEA,SAAO;AACT;AAEA,SAAS,qBAAqB,OAAuB;AACnD,SAAO;AAAA,IACL,QAAQ,KAAK,KAAK;AAAA,IAClB,QAAQ,KAAK,KAAK;AAAA,IAClB,KAAK,KAAK,KAAK;AAAA,IACf,UAAU,KAAK,KAAK;AAAA,EACtB,EAAE,OAAO,OAAO,EAAE;AACpB;AAEA,SAAS,OAAO,OAAwB;AACtC,SAAO,6EAA6E,KAAK,KAAK;AAChG;AAEA,SAAS,UAAU,OAAwB;AACzC,SAAO,+CAA+C,KAAK,KAAK;AAClE;AAEA,SAAS,SAAS,OAAwB;AACxC,SAAO,kBAAkB,KAAK,KAAK;AACrC;AAEA,SAAS,MAAM,OAAwB;AACrC,SAAO,+BAA+B,KAAK,KAAK;AAClD;AAEA,SAAS,QAAQ,OAAwB;AACvC,SAAO,6BAA6B,KAAK,KAAK;AAChD;AAEA,SAAS,eAAe,OAAwB;AAC9C,SAAO,qBAAqB,KAAK,KAAK,KAAK,qBAAqB,KAAK,KAAK;AAC5E;AAEA,SAAS,cAAc,OAAwB;AAC7C,SACE,OAAO,KAAK,KACZ,UAAU,KAAK,KACf,SAAS,KAAK,KACd,MAAM,KAAK,KACX,QAAQ,KAAK,KACb,eAAe,KAAK;AAExB;AAEA,SAAS,gBACP,OACA,YACA,WACA,WACA,kBACkB;AAClB,QAAM,UAA4B,CAAC;AAEnC,aAAW,SAAS,MAAM,SAAS,UAAU,GAAG;AAC9C,UAAM,QAAQ,MAAM,CAAC;AACrB,QAAI,CAAC,SAAS,MAAM,UAAU,QAAW;AACvC;AAAA,IACF;AAEA,QAAI,MAAM,SAAS,qBAAqB,cAAc,KAAK,KAAK,CAAC,iBAAiB,KAAK,GAAG;AACxF;AAAA,IACF;AAEA,QAAI,wBAAwB,KAAK,KAAK,WAAW;AAC/C;AAAA,IACF;AAEA,UAAM,QAAQ,MAAM,QAAQ,MAAM,CAAC,EAAE,QAAQ,KAAK;AAClD,YAAQ,KAAK;AAAA,MACX;AAAA,MACA,MAAM;AAAA,MACN,YAAY;AAAA,MACZ;AAAA,MACA,KAAK,QAAQ,MAAM;AAAA,MACnB;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,SAAS,eAAe,OAAwB;AAC9C,SAAO,iBAAiB,KAAK,KAAK,KAAK,CAAC,SAAS,KAAK;AACxD;AAEA,SAAS,kBAAkB,OAAwB;AACjD,MAAI,CAAC,2BAA2B,KAAK,KAAK,GAAG;AAC3C,WAAO;AAAA,EACT;AAEA,SAAO,qBAAqB,KAAK,KAAK;AACxC;AAEA,SAASC,QAAO,SAA6C;AAC3D,QAAM,OAAO,oBAAI,IAAY;AAE7B,SAAO,QAAQ,OAAO,CAAC,UAAU;AAC/B,UAAM,MAAM,GAAG,MAAM,KAAK,IAAI,MAAM,GAAG;AACvC,QAAI,KAAK,IAAI,GAAG,GAAG;AACjB,aAAO;AAAA,IACT;AAEA,SAAK,IAAI,GAAG;AACZ,WAAO;AAAA,EACT,CAAC;AACH;AAEO,IAAM,kBAAN,MAAgD;AAAA,EACrD,YAA6B,UAAkC,CAAC,GAAG;AAAtC;AAAA,EAAuC;AAAA,EAEpE,OAAO,OAAiC;AACtC,UAAM,YAAY,KAAK,QAAQ;AAC/B,UAAM,UAAU;AAAA,MACd,GAAG;AAAA,QACD;AAAA,QACA;AAAA,QACA;AAAA,QACA,aAAa;AAAA,QACb;AAAA,MACF;AAAA,MACA,GAAG;AAAA,QACD;AAAA,QACA;AAAA,QACA;AAAA,QACA,aAAa;AAAA,QACb;AAAA,MACF;AAAA,IACF;AAEA,WAAOA,QAAO,OAAO,EAAE,KAAK,CAAC,MAAM,UAAU,KAAK,QAAQ,MAAM,SAAS,KAAK,MAAM,MAAM,GAAG;AAAA,EAC/F;AACF;;;AC3IA,IAAM,4BACJ;AACF,IAAM,2BAA2B;AAE1B,IAAM,wBAA6C;AAAA,EACxD;AAAA,IACE,aAAa,OAAO;AAClB,aAAO,MAAM,CAAC,KAAK;AAAA,IACrB;AAAA,IACA,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,YAAY;AAAA,EACd;AAAA,EACA;AAAA,IACE,aAAa,OAAO;AAClB,aAAO,MAAM,CAAC,KAAK;AAAA,IACrB;AAAA,IACA,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,YAAY;AAAA,EACd;AAAA,EACA;AAAA,IACE,aAAa,OAAO;AAClB,aAAO,MAAM,CAAC,KAAK;AAAA,IACrB;AAAA,IACA,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,YAAY;AAAA,EACd;AAAA,EACA;AAAA,IACE,aAAa,OAAO;AAClB,aAAO,MAAM,CAAC,KAAK;AAAA,IACrB;AAAA,IACA,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,YAAY;AAAA,EACd;AAAA,EACA;AAAA,IACE,aAAa,OAAO;AAClB,aAAO,MAAM,CAAC,KAAK;AAAA,IACrB;AAAA,IACA,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,YAAY,IAAI;AAAA,MACd,OAAO,wEAAwE,yBAAyB,MAAM;AAAA,MAC9G;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,aAAa,OAAO;AAClB,aAAO,MAAM,CAAC,KAAK;AAAA,IACrB;AAAA,IACA,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,YAAY,IAAI;AAAA,MACd,OAAO,uDAAuD,yBAAyB,MAAM;AAAA,MAC7F;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,aAAa,OAAO;AAClB,aAAO,MAAM,CAAC,KAAK;AAAA,IACrB;AAAA,IACA,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,YAAY;AAAA,EACd;AAAA,EACA;AAAA,IACE,aAAa,OAAO;AAClB,aAAO,MAAM,CAAC,KAAK;AAAA,IACrB;AAAA,IACA,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,YAAY;AAAA,EACd;AAAA,EACA;AAAA,IACE,aAAa,OAAO;AAClB,aAAO,MAAM,CAAC,KAAK;AAAA,IACrB;AAAA,IACA,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,YAAY;AAAA,EACd;AAAA,EACA;AAAA,IACE,aAAa,OAAO;AAClB,aAAO,MAAM,CAAC,KAAK;AAAA,IACrB;AAAA,IACA,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,YAAY;AAAA,EACd;AAAA,EACA;AAAA,IACE,aAAa,OAAO;AAClB,aAAO,MAAM,CAAC,KAAK;AAAA,IACrB;AAAA,IACA,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,YAAY;AAAA,EACd;AAAA,EACA;AAAA,IACE,aAAa,OAAO;AAClB,aAAO,MAAM,CAAC,KAAK;AAAA,IACrB;AAAA,IACA,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,YAAY;AAAA,EACd;AACF;AAEO,IAAM,kBAAN,MAAgD;AAAA,EACpC;AAAA,EAEjB,YAAY,UAAkC,CAAC,GAAG;AAChD,SAAK,WAAW;AAAA,MACd,GAAG;AAAA,MACH,GAAG,oBAAoB,QAAQ,kBAAkB,CAAC,CAAC;AAAA,IACrD;AAAA,EACF;AAAA,EAEA,OAAO,OAAiC;AACtC,UAAM,UAA4B,CAAC;AAEnC,eAAW,WAAW,KAAK,UAAU;AACnC,iBAAW,SAAS,MAAM,SAAS,QAAQ,UAAU,GAAG;AACtD,cAAM,QAAQ,QAAQ,aAAa,KAAK;AACxC,YAAI,CAAC,SAAS,MAAM,UAAU,QAAW;AACvC;AAAA,QACF;AAEA,cAAM,QAAQ,MAAM,QAAQ,MAAM,CAAC,EAAE,QAAQ,KAAK;AAClD,gBAAQ,KAAK;AAAA,UACX;AAAA,UACA,MAAM,QAAQ;AAAA,UACd,YAAY;AAAA,UACZ;AAAA,UACA,KAAK,QAAQ,MAAM;AAAA,UACnB,WAAW,QAAQ;AAAA,QACrB,CAAC;AAAA,MACH;AAAA,IACF;AAEA,WAAO,QAAQ,KAAK,CAAC,MAAM,UAAU,KAAK,QAAQ,MAAM,SAAS,KAAK,MAAM,MAAM,GAAG;AAAA,EACvF;AACF;AAEA,SAAS,oBAAoB,UAA0D;AACrF,SAAO,SAAS,IAAI,CAAC,aAAa;AAAA,IAChC,IAAI,QAAQ;AAAA,IACZ,MAAM,QAAQ;AAAA,IACd,YAAY,IAAI,OAAO,QAAQ,OAAO,GAAG;AAAA,IACzC,aAAa,OAAO;AAClB,aAAO,MAAM,CAAC,KAAK;AAAA,IACrB;AAAA,EACF,EAAE;AACJ;;;AClKA,SAAS,SAAS,MAAsB,OAAgC;AACtE,SAAO,KAAK,QAAQ,MAAM,OAAO,MAAM,QAAQ,KAAK;AACtD;AAEO,IAAM,mBAAN,MAAiD;AAAA,EACrC;AAAA,EAEjB,YAAY,UAAmC,CAAC,GAAG;AACjD,SAAK,SAAS,CAAC;AAEf,QAAI,QAAQ,kBAAkB,OAAO;AACnC,WAAK,OAAO;AAAA,QACV,IAAI,gBAAgB;AAAA,UAClB,gBAAgB,QAAQ;AAAA,QAC1B,CAAC;AAAA,MACH;AAAA,IACF;AAEA,QAAI,QAAQ,kBAAkB,OAAO;AACnC,WAAK,OAAO,KAAK,IAAI,gBAAgB,CAAC;AAAA,IACxC;AAEA,QAAI,QAAQ,kBAAkB,OAAO;AACnC,WAAK,OAAO;AAAA,QACV,IAAI,gBAAgB;AAAA,UAClB,WAAW,QAAQ;AAAA,QACrB,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO,OAAiC;AACtC,UAAM,WAA6B,CAAC;AAEpC,eAAW,SAAS,KAAK,QAAQ;AAC/B,iBAAW,SAAS,MAAM,OAAO,KAAK,GAAG;AACvC,YAAI,SAAS,KAAK,CAAC,aAAa,SAAS,UAAU,KAAK,CAAC,GAAG;AAC1D;AAAA,QACF;AAEA,iBAAS,KAAK,KAAK;AAAA,MACrB;AAAA,IACF;AAEA,WAAO,SAAS,KAAK,CAAC,MAAM,UAAU,KAAK,QAAQ,MAAM,SAAS,KAAK,MAAM,MAAM,GAAG;AAAA,EACxF;AACF;;;ACrCA,IAAM,uBAAuB;AAE7B,SAAS,aAAa,OAAuB;AAC3C,SAAO,MAAM,QAAQ,uBAAuB,MAAM;AACpD;AAEA,SAAS,UAAU,OAA6C;AAC9D,SAAO,MAAM,KAAK,CAAC,MAAM,UAAU;AACjC,QAAI,MAAM,OAAO,WAAW,KAAK,OAAO,QAAQ;AAC9C,aAAO,MAAM,OAAO,SAAS,KAAK,OAAO;AAAA,IAC3C;AAEA,WAAO,KAAK,OAAO,cAAc,MAAM,MAAM;AAAA,EAC/C,CAAC;AACH;AAEA,IAAM,eAAN,MAAiD;AAAA,EAC9B;AAAA,EACA;AAAA,EAEjB,YAAY,OAA0B;AACpC,SAAK,eAAe,IAAI,IAAI,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,QAAQ,KAAK,MAAM,CAAC,CAAC;AAC3E,SAAK,UAAU,IAAI,OAAO,MAAM,IAAI,CAAC,SAAS,aAAa,KAAK,MAAM,CAAC,EAAE,KAAK,GAAG,GAAG,GAAG;AAAA,EACzF;AAAA,EAEA,YAAY,OAAwB;AAClC,QAAI,MAAM,WAAW,GAAG;AACtB,aAAO,CAAC;AAAA,IACV;AAEA,SAAK,QAAQ,YAAY;AAEzB,WAAO,MAAM,KAAK,MAAM,SAAS,KAAK,OAAO,GAAG,CAAC,UAAU;AACzD,YAAM,QAAQ,MAAM,CAAC;AACrB,YAAM,QAAQ,MAAM,SAAS;AAE7B,aAAO;AAAA,QACL;AAAA,QACA,KAAK,QAAQ,MAAM;AAAA,QACnB,cAAc,MAAM;AAAA,QACpB,aAAa,KAAK,aAAa,IAAI,KAAK,KAAK;AAAA,MAC/C;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEA,IAAM,oBAAN,MAAsD;AAAA,EACpD,YAA6B,MAAuB;AAAvB;AAAA,EAAwB;AAAA,EAErD,YAAY,OAAwB;AAClC,QAAI,MAAM,WAAW,KAAK,KAAK,KAAK,OAAO,WAAW,GAAG;AACvD,aAAO,CAAC;AAAA,IACV;AAEA,UAAM,UAAmB,CAAC;AAC1B,QAAI,QAAQ,MAAM,QAAQ,KAAK,KAAK,MAAM;AAE1C,WAAO,UAAU,IAAI;AACnB,cAAQ,KAAK;AAAA,QACX;AAAA,QACA,KAAK,QAAQ,KAAK,KAAK,OAAO;AAAA,QAC9B,cAAc,KAAK,KAAK,OAAO;AAAA,QAC/B,aAAa,KAAK,KAAK;AAAA,MACzB,CAAC;AACD,cAAQ,MAAM,QAAQ,KAAK,KAAK,QAAQ,QAAQ,KAAK,KAAK,OAAO,MAAM;AAAA,IACzE;AAEA,WAAO;AAAA,EACT;AACF;AAEA,IAAM,qBAAN,MAAuD;AAAA,EACpC,QAAoB,CAAC,EAAE,MAAM,GAAG,MAAM,oBAAI,IAAI,GAAG,SAAS,CAAC,EAAE,CAAC;AAAA,EAC9D;AAAA,EAEjB,YAAY,OAA0B;AACpC,SAAK,QAAQ;AACb,SAAK,UAAU;AACf,SAAK,kBAAkB;AAAA,EACzB;AAAA,EAEA,YAAY,OAAwB;AAClC,QAAI,MAAM,WAAW,GAAG;AACtB,aAAO,CAAC;AAAA,IACV;AAEA,UAAM,UAAmB,CAAC;AAC1B,QAAI,YAAY;AAEhB,aAAS,WAAW,GAAG,WAAW,MAAM,QAAQ,YAAY,GAAG;AAC7D,YAAM,YAAY,MAAM,QAAQ;AAEhC,aAAO,cAAc,KAAK,CAAC,KAAK,MAAM,SAAS,EAAE,KAAK,IAAI,SAAS,GAAG;AACpE,oBAAY,KAAK,MAAM,SAAS,EAAE;AAAA,MACpC;AAEA,kBAAY,KAAK,MAAM,SAAS,EAAE,KAAK,IAAI,SAAS,KAAK;AAEzD,iBAAW,aAAa,KAAK,MAAM,SAAS,EAAE,SAAS;AACrD,cAAM,OAAO,KAAK,MAAM,SAAS;AACjC,gBAAQ,KAAK;AAAA,UACX,OAAO,WAAW,KAAK,OAAO,SAAS;AAAA,UACvC,KAAK,WAAW;AAAA,UAChB,cAAc,KAAK,OAAO;AAAA,UAC1B,aAAa,KAAK;AAAA,QACpB,CAAC;AAAA,MACH;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,YAAkB;AACxB,SAAK,MAAM,QAAQ,CAAC,MAAM,cAAc;AACtC,UAAI,YAAY;AAEhB,iBAAW,aAAa,KAAK,QAAQ;AACnC,cAAM,YAAY,KAAK,MAAM,SAAS,EAAE,KAAK,IAAI,SAAS;AAE1D,YAAI,cAAc,QAAW;AAC3B,sBAAY;AACZ;AAAA,QACF;AAEA,cAAM,eAAe,KAAK,MAAM;AAChC,aAAK,MAAM,KAAK,EAAE,MAAM,GAAG,MAAM,oBAAI,IAAI,GAAG,SAAS,CAAC,EAAE,CAAC;AACzD,aAAK,MAAM,SAAS,EAAE,KAAK,IAAI,WAAW,YAAY;AACtD,oBAAY;AAAA,MACd;AAEA,WAAK,MAAM,SAAS,EAAE,QAAQ,KAAK,SAAS;AAAA,IAC9C,CAAC;AAAA,EACH;AAAA,EAEQ,oBAA0B;AAChC,UAAM,QAAkB,CAAC;AAEzB,eAAW,cAAc,KAAK,MAAM,CAAC,EAAE,KAAK,OAAO,GAAG;AACpD,WAAK,MAAM,UAAU,EAAE,OAAO;AAC9B,YAAM,KAAK,UAAU;AAAA,IACvB;AAEA,WAAO,MAAM,SAAS,GAAG;AACvB,YAAM,eAAe,MAAM,MAAM;AAEjC,UAAI,iBAAiB,QAAW;AAC9B;AAAA,MACF;AAEA,YAAM,cAAc,KAAK,MAAM,YAAY;AAE3C,iBAAW,CAAC,WAAW,UAAU,KAAK,YAAY,KAAK,QAAQ,GAAG;AAChE,YAAI,gBAAgB,YAAY;AAEhC,eAAO,kBAAkB,KAAK,CAAC,KAAK,MAAM,aAAa,EAAE,KAAK,IAAI,SAAS,GAAG;AAC5E,0BAAgB,KAAK,MAAM,aAAa,EAAE;AAAA,QAC5C;AAEA,cAAM,gBAAgB,KAAK,MAAM,aAAa,EAAE,KAAK,IAAI,SAAS,KAAK;AACvE,aAAK,MAAM,UAAU,EAAE,OAAO;AAC9B,aAAK,MAAM,UAAU,EAAE,QAAQ,KAAK,GAAG,KAAK,MAAM,aAAa,EAAE,OAAO;AACxE,cAAM,KAAK,UAAU;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,cAAc,OAAqD;AAC1E,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO,IAAI,kBAAkB,MAAM,CAAC,CAAC;AAAA,EACvC;AAEA,MAAI,MAAM,SAAS,sBAAsB;AACvC,WAAO,IAAI,aAAa,KAAK;AAAA,EAC/B;AAEA,SAAO,IAAI,mBAAmB,KAAK;AACrC;AAEA,SAAS,eAAe,cAAsD;AAC5E,SAAO;AAAA,IACL,MAAM,KAAK,aAAa,QAAQ,GAAG,CAAC,CAAC,QAAQ,MAAM,OAAO,EAAE,QAAQ,OAAO,EAAE,EAAE;AAAA,MAC7E,CAAC,SAAS,KAAK,OAAO,SAAS;AAAA,IACjC;AAAA,EACF;AACF;AAEA,SAAS,YAAY,SAA2B;AAC9C,MAAI,QAAQ,SAAS,GAAG;AACtB,WAAO;AAAA,EACT;AAEA,SAAO,QAAQ,KAAK,CAAC,MAAM,UAAU;AACnC,QAAI,KAAK,UAAU,MAAM,OAAO;AAC9B,aAAO,KAAK,QAAQ,MAAM;AAAA,IAC5B;AAEA,QAAI,MAAM,iBAAiB,KAAK,cAAc;AAC5C,aAAO,MAAM,eAAe,KAAK;AAAA,IACnC;AAEA,WAAO,KAAK,MAAM,MAAM;AAAA,EAC1B,CAAC;AACH;AAEA,SAAS,YAAY,OAAe,SAAkB,OAAuB;AAC3E,MAAI,SAAS,GAAG;AACd,WAAO;AAAA,EACT;AAEA,MAAI,SAAS;AACb,MAAI,SAAS;AAEb,aAAW,SAAS,SAAS;AAC3B,QAAI,MAAM,SAAS,OAAO;AACxB;AAAA,IACF;AAEA,QAAI,MAAM,QAAQ,UAAU,MAAM,MAAM,OAAO;AAC7C;AAAA,IACF;AAEA,cAAU,MAAM,MAAM,QAAQ,MAAM,KAAK;AACzC,cAAU,MAAM;AAChB,aAAS,MAAM;AAAA,EACjB;AAEA,SAAO,SAAS,MAAM,MAAM,QAAQ,KAAK;AAC3C;AAEO,IAAM,iBAAN,MAAqB;AAAA,EAClB,SAAS;AAAA,EACT,UAAqC;AAAA,EACrC,gBAAgB;AAAA,EAChB,WAAW,oBAAI,IAAY;AAAA,EAEnC,YAAY,cAAmC;AAC7C,SAAK,YAAY,YAAY;AAAA,EAC/B;AAAA,EAEA,KAAK,OAAuB;AAC1B,UAAM,QAAQ,KAAK,SAAS;AAE5B,QAAI,KAAK,YAAY,QAAQ,KAAK,kBAAkB,GAAG;AACrD,WAAK,SAAS;AACd,aAAO;AAAA,IACT;AAEA,UAAM,mBAAmB,KAAK,oBAAoB,KAAK;AACvD,UAAM,iBAAiB,MAAM,SAAS;AAEtC,QAAI,kBAAkB,GAAG;AACvB,WAAK,SAAS;AACd,aAAO;AAAA,IACT;AAEA,UAAM,UAAU,YAAY,KAAK,QAAQ,YAAY,KAAK,CAAC;AAC3D,UAAM,YAAY,KAAK,aAAa,SAAS,cAAc;AAE3D,SAAK,SAAS,MAAM,MAAM,SAAS;AACnC,WAAO,YAAY,OAAO,SAAS,SAAS;AAAA,EAC9C;AAAA,EAEA,QAAgB;AACd,QAAI,KAAK,OAAO,WAAW,GAAG;AAC5B,aAAO;AAAA,IACT;AAEA,UAAM,YAAY,KAAK;AACvB,SAAK,SAAS;AAEd,QAAI,KAAK,YAAY,MAAM;AACzB,aAAO;AAAA,IACT;AAEA,WAAO,YAAY,WAAW,YAAY,KAAK,QAAQ,YAAY,SAAS,CAAC,GAAG,UAAU,MAAM;AAAA,EAClG;AAAA,EAEA,YAAY,cAAyC;AACnD,UAAM,QAAQ,eAAe,YAAY;AAEzC,SAAK,gBAAgB,MAAM,OAAO,CAAC,YAAY,SAAS,KAAK,IAAI,YAAY,KAAK,OAAO,MAAM,GAAG,CAAC;AACnG,SAAK,WAAW,IAAI;AAAA,MAClB,MAAM;AAAA,QAAQ,CAAC,SACb,MAAM;AAAA,UAAK,EAAE,QAAQ,KAAK,IAAI,GAAG,KAAK,OAAO,SAAS,CAAC,EAAE;AAAA,UAAG,CAAC,GAAG,UAC9D,KAAK,OAAO,MAAM,GAAG,QAAQ,CAAC;AAAA,QAChC;AAAA,MACF;AAAA,IACF;AACA,SAAK,UAAU,cAAc,KAAK;AAAA,EACpC;AAAA,EAEQ,oBAAoB,OAAuB;AACjD,UAAM,mBAAmB,KAAK,IAAI,MAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,gBAAgB,CAAC,CAAC;AAEnF,aAAS,SAAS,kBAAkB,SAAS,GAAG,UAAU,GAAG;AAC3D,UAAI,KAAK,SAAS,IAAI,MAAM,MAAM,CAAC,MAAM,CAAC,GAAG;AAC3C,eAAO;AAAA,MACT;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,aAAa,SAAkB,gBAAgC;AACrE,QAAI,YAAY;AAChB,QAAI,UAAU;AAEd,WAAO,SAAS;AACd,gBAAU;AAEV,iBAAW,SAAS,SAAS;AAC3B,YAAI,MAAM,SAAS,WAAW;AAC5B;AAAA,QACF;AAEA,YAAI,MAAM,MAAM,WAAW;AACzB,sBAAY,MAAM;AAClB,oBAAU;AAAA,QACZ;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;;;ACrVA,SAAS,oBAAoB,OAAqD;AAChF,SAAO,IAAI,IAAI,KAAK;AACtB;AAEO,IAAM,2BAAN,MAA+B;AAAA,EAMpC,YAA6B,OAAqB;AAArB;AAC3B,SAAK,YAAY;AAAA,EACnB;AAAA,EAPiB,sBAAsB,IAAI,eAAe,oBAAI,IAAI,CAAC;AAAA,EAClD,gBAAgB,IAAI,eAAe,oBAAI,IAAI,CAAC;AAAA,EAC5C,iBAAiB,IAAI,eAAe,oBAAI,IAAI,CAAC;AAAA,EACtD,iBAAiB;AAAA,EAMzB,aAAa,OAAuB;AAClC,SAAK,UAAU;AACf,WAAO,KAAK,cAAc,KAAK,KAAK;AAAA,EACtC;AAAA,EAEA,cAAc,OAAuB;AACnC,SAAK,UAAU;AACf,WAAO,KAAK,eAAe,KAAK,KAAK;AAAA,EACvC;AAAA,EAEA,mBAAmB,OAAuB;AACxC,SAAK,UAAU;AACf,WAAO,KAAK,oBAAoB,KAAK,KAAK;AAAA,EAC5C;AAAA,EAEA,QAAkC;AAChC,SAAK,UAAU;AAEf,WAAO;AAAA,MACL,OAAO,KAAK,cAAc,MAAM;AAAA,MAChC,QAAQ,KAAK,eAAe,MAAM;AAAA,MAClC,aAAa,KAAK,oBAAoB,MAAM;AAAA,IAC9C;AAAA,EACF;AAAA,EAEA,cAAoB;AAClB,UAAM,gBAAgB,oBAAoB,KAAK,MAAM,sBAAsB,CAAC;AAC5E,UAAM,gBAAgB,oBAAoB,KAAK,MAAM,sBAAsB,CAAC;AAE5E,SAAK,cAAc,YAAY,aAAa;AAC5C,SAAK,eAAe,YAAY,aAAa;AAC7C,SAAK,oBAAoB,YAAY,aAAa;AAClD,SAAK,iBAAiB,KAAK,MAAM;AAAA,EACnC;AAAA,EAEQ,YAAkB;AACxB,QAAI,KAAK,mBAAmB,KAAK,MAAM,UAAU;AAC/C;AAAA,IACF;AAEA,SAAK,YAAY;AAAA,EACnB;AACF;;;AClEA,SAAS,aAAAC,YAAW,cAAAC,aAAY,gBAAgB;AAChD,SAAS,qBAAqB;AAC9B,SAAS,WAAAC,UAAS,QAAAC,aAAY;AAG9B,YAAY,SAAS;AAqBrB,IAAM,kBAAkB;AACxB,IAAM,eAAe;AACrB,IAAMC,WAAU,cAAc,YAAY,GAAG;AAC7C,IAAM,0BAA0BF,SAAQE,SAAQ,QAAQ,uBAAuB,CAAC;AAEhF,SAAS,SAAS,MAAsB;AACtC,SAAO;AACT;AAEA,SAAS,QAAgB;AACvB,SAAO;AACT;AAEA,SAAS,WAAW,QAA6C;AAC/D,SAAO,QAAQ,WAAW,OAAO,UAAU,IAAI,OAAO,UAAU;AAClE;AAEA,SAAS,QAAQ,QAA6C;AAC5D,SAAO,QAAQ,QAAQ,OAAO,OAAO,IAAI,OAAO,OAAO;AACzD;AAEA,SAAS,cAAc,UAAoB,QAA8B;AACvE,MAAI,QAAQ,aAAa,SAAS;AAChC,aAAS,KAAK;AACd;AAAA,EACF;AAEA,WAAS,KAAK,MAAM;AACtB;AAEA,SAAS,8BAAoC;AAC3C,MAAI,QAAQ,aAAa,SAAS;AAChC;AAAA,EACF;AAEA,QAAM,aAAa;AAAA,IACjBD,MAAK,yBAAyB,aAAa,GAAG,QAAQ,QAAQ,IAAI,QAAQ,IAAI,IAAI,cAAc;AAAA,IAChGA,MAAK,yBAAyB,SAAS,WAAW,cAAc;AAAA,IAChEA,MAAK,yBAAyB,SAAS,SAAS,cAAc;AAAA,EAChE;AAEA,aAAW,cAAc,YAAY;AACnC,QAAI,CAACF,YAAW,UAAU,GAAG;AAC3B;AAAA,IACF;AAEA,UAAM,cAAc,SAAS,UAAU,EAAE,OAAO;AAChD,SAAK,cAAc,QAAW,GAAG;AAC/B;AAAA,IACF;AAEA,IAAAD,WAAU,YAAY,cAAc,GAAK;AACzC;AAAA,EACF;AACF;AAEA,eAAsB,cACpB,SACA,MACA,UAA6B,CAAC,GACb;AACjB,QAAM,QAAQ,QAAQ,SAAS,QAAQ;AACvC,QAAM,SAAS,QAAQ,UAAU,QAAQ;AACzC,QAAM,iBAAiB,QAAQ,kBAAkB;AACjD,QAAM,kBAAkB,QAAQ,mBAAmB;AACnD,QAAM,cAAc,QAAQ,eAAe;AAC3C,QAAM,eAAe,QAAQ,gBAAgB;AAC7C,QAAM,MAAM,QAAQ,OAAO,QAAQ;AAEnC,8BAA4B;AAE5B,QAAM,WAAe,UAAM,SAAS,MAAM;AAAA,IACxC,MAAM,IAAI,QAAQ;AAAA,IAClB,MAAM,WAAW,MAAM;AAAA,IACvB,MAAM,QAAQ,MAAM;AAAA,IACpB,KAAK,QAAQ,OAAO,QAAQ,IAAI;AAAA,IAChC;AAAA,EACF,CAAC;AAED,MAAI,YAAY;AAChB,QAAM,oBAAoB,QAAQ,MAAM,KAAK;AAC7C,QAAM,mBAAmB,QAAQ,MAAM,SAAS,OAAO,MAAM,eAAe,UAAU;AAEtF,QAAM,iBAAiB,MAAY;AACjC,QAAI;AACF,eAAS,OAAO,WAAW,MAAM,GAAG,QAAQ,MAAM,CAAC;AAAA,IACrD,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,QAAM,kBAAkB,CAAC,UAAiC;AACxD,UAAM,WAAW,YAAY,MAAM,SAAS,CAAC;AAC7C,QAAI,SAAS,SAAS,GAAG;AACvB,eAAS,MAAM,QAAQ;AAAA,IACzB;AAAA,EACF;AAEA,QAAM,iBAAiB,MAAY;AACjC,UAAM,WAAW,eAAe;AAChC,QAAI,SAAS,SAAS,GAAG;AACvB,eAAS,MAAM,QAAQ;AAAA,IACzB;AAAA,EACF;AAEA,QAAM,eAAe,MAAY;AAC/B,kBAAc,UAAU,QAAQ;AAAA,EAClC;AAEA,QAAM,gBAAgB,MAAY;AAChC,kBAAc,UAAU,SAAS;AAAA,EACnC;AAEA,QAAM,iBAAiB,MAAY;AACjC,mBAAe;AAAA,EACjB;AAEA,QAAM,mBAAmB,SAAS,OAAO,CAAC,SAAS;AACjD,UAAM,WAAW,aAAa,IAAI;AAClC,QAAI,SAAS,SAAS,GAAG;AACvB,aAAO,MAAM,QAAQ;AAAA,IACvB;AAAA,EACF,CAAC;AAED,QAAM,UAAU,MAAY;AAC1B,QAAI,WAAW;AACb;AAAA,IACF;AAEA,gBAAY;AACZ,UAAM,cAAc,gBAAgB;AACpC,QAAI,YAAY,SAAS,GAAG;AAC1B,aAAO,MAAM,WAAW;AAAA,IAC1B;AACA,qBAAiB,QAAQ;AACzB,UAAM,eAAe,QAAQ,eAAe;AAC5C,UAAM,eAAe,OAAO,cAAc;AAC1C,YAAQ,eAAe,UAAU,YAAY;AAC7C,YAAQ,eAAe,WAAW,aAAa;AAC/C,YAAQ,eAAe,YAAY,cAAc;AAEjD,QAAI,oBAAoB,CAAC,mBAAmB;AAC1C,YAAM,aAAa,KAAK;AAAA,IAC1B;AAEA,UAAM,MAAM;AAAA,EACd;AAEA,QAAM,GAAG,QAAQ,eAAe;AAChC,QAAM,GAAG,OAAO,cAAc;AAC9B,QAAM,OAAO;AAEb,MAAI,oBAAoB,CAAC,mBAAmB;AAC1C,UAAM,aAAa,IAAI;AAAA,EACzB;AAEA,UAAQ,GAAG,UAAU,YAAY;AACjC,UAAQ,GAAG,WAAW,aAAa;AACnC,UAAQ,GAAG,YAAY,cAAc;AAErC,MAAI;AACF,WAAO,MAAM,IAAI,QAAgB,CAACK,aAAY;AAC5C,eAAS,OAAO,CAAC,EAAE,SAAS,MAAM;AAChC,gBAAQ;AACR,QAAAA,SAAQ,QAAQ;AAAA,MAClB,CAAC;AAED,qBAAe;AAAA,IACjB,CAAC;AAAA,EACH,UAAE;AACA,YAAQ;AAAA,EACV;AACF;AAEA,eAAsB,iBACpB,SACA,MACA,SACe;AACf,UAAQ,WAAW,MAAM,cAAc,SAAS,MAAM,OAAO;AAC/D;;;AC5MA,IAAM,kBAAgC;AAAA,EACpC,WAAW;AAAA,EACX,QAAQ;AACV;AAEA,SAAS,kBAAkB,OAAuB;AAChD,SAAO,MAAM,SAAS,GAAG,IAAI,MAAM,MAAM,GAAG,EAAE,IAAI;AACpD;AAEO,SAAS,uBAAuB,MAAyB,QAAQ,KAAmB;AACzF,SAAO;AAAA,IACL,WACE,IAAI,4BAA4B,IAAI,sBAAsB,gBAAgB;AAAA,IAC5E,QAAQ,IAAI,yBAAyB,IAAI,mBAAmB,gBAAgB;AAAA,EAC9E;AACF;AAEO,SAAS,sBACd,cACA,MAAyB,QAAQ,KACd;AACnB,QAAM,mBAAmB,kBAAkB,YAAY;AAEvD,SAAO;AAAA,IACL,GAAG;AAAA,IACH,oBAAoB;AAAA,IACpB,iBAAiB;AAAA,IACjB,0BACE,IAAI,4BACJ,IAAI,sBACJ,gBAAgB;AAAA,IAClB,uBACE,IAAI,yBAAyB,IAAI,mBAAmB,gBAAgB;AAAA,EACxE;AACF;;;ACpCA;AAAA,EACE;AAAA,EACA,WAAW;AAAA,EAOX;AAAA,OACK;AACP,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,SAAAC,QAAO,aAAAC,kBAAiB;AACjC,SAAS,WAAW,0BAA0B;AAE9C,SAAS,QAAAC,aAAY;;;ACfrB,SAAS,kBAAkB;AAE3B,IAAM,wCAAwC;AAE9C,SAASC,UAAS,OAAkD;AAClE,SAAO,OAAO,UAAU,YAAY,UAAU;AAChD;AAEA,SAAS,WAAc,OAAa;AAClC,SAAO,KAAK,MAAM,KAAK,UAAU,KAAK,CAAC;AACzC;AAoBA,SAAS,kBAAkB,MAA4C;AACrE,MAAI,SAAS,eAAe,SAAS,YAAY,SAAS,UAAU,SAAS,QAAQ;AACnF,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,aAAa;AACxB,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAOO,IAAM,8BAAN,MAAkC;AAAA,EACtB,YAAY,oBAAI,IAA4B;AAAA,EAE7D,YAAY,YAA+C;AACzD,UAAM,SAAS,KAAK,UAAU,IAAI,UAAU;AAC5C,WAAO,SAAS,WAAW,OAAO,QAAQ,IAAI;AAAA,EAChD;AAAA,EAEA,YAAY,YAAyD;AACnE,UAAM,SAAS,KAAK,UAAU,IAAI,UAAU;AAC5C,WAAO,SAAS,WAAW,OAAO,QAAQ,IAAI;AAAA,EAChD;AAAA,EAEA,IAAI,YAAoB,QAA8B;AACpD,SAAK,UAAU,IAAI,YAAY;AAAA,MAC7B,UAAU,WAAW,OAAO,QAAQ;AAAA,MACpC,UAAU,WAAW,OAAO,QAAQ;AAAA,IACtC,CAAC;AAAA,EACH;AAAA,EAEA,QAAc;AACZ,SAAK,UAAU,MAAM;AAAA,EACvB;AACF;AAsBA,SAAS,cAAc,OAAwB;AAC7C,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,EACT;AAEA,MAAI,UAAU,UAAa,UAAU,MAAM;AACzC,WAAO;AAAA,EACT;AAEA,SAAO,KAAK,UAAU,KAAK;AAC7B;AAEA,SAAS,sBAAsB,SAA2D;AACxF,MAAI,OAAO,YAAY,UAAU;AAC/B,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,MAAM,QAAQ,OAAO,GAAG;AAC3B,WAAO,cAAc,OAAO;AAAA,EAC9B;AAEA,QAAM,QAAQ,QAAQ,QAAQ,CAAC,UAA0C;AACvE,QAAI,CAACA,UAAS,KAAK,GAAG;AACpB,YAAM,OAAO,cAAc,KAAK;AAChC,aAAO,KAAK,SAAS,IAAI,CAAC,EAAE,MAAM,QAAQ,KAAK,CAAC,IAAI,CAAC;AAAA,IACvD;AAEA,UAAM,OAAO,OAAO,MAAM,SAAS,WAAW,MAAM,OAAO;AAC3D,QAAI,SAAS,gBAAgB,SAAS,iBAAiB,SAAS,QAAQ;AACtE,YAAM,OAAO,cAAc,MAAM,IAAI;AACrC,aAAO,KAAK,SAAS,IAAI,CAAC,EAAE,MAAM,QAAQ,KAAK,CAAC,IAAI,CAAC;AAAA,IACvD;AAEA,QAAI,SAAS,eAAe;AAC1B,YAAM,WACJ,OAAO,MAAM,cAAc,WACvB,MAAM,YACNA,UAAS,MAAM,SAAS,KAAK,OAAO,MAAM,UAAU,QAAQ,WAC1D,MAAM,UAAU,MAChB;AACR,aAAO,SAAS,SAAS,IAAI,CAAC,EAAE,MAAM,aAAa,WAAW,EAAE,KAAK,SAAS,EAAE,CAAC,IAAI,CAAC;AAAA,IACxF;AAEA,WAAO,CAAC;AAAA,EACV,CAAC;AAED,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,MAAM,CAAC,SAAS,KAAK,SAAS,MAAM,GAAG;AAC/C,WAAO,MAAM,IAAI,CAAC,SAAS,cAAc,KAAK,IAAI,CAAC,EAAE,KAAK,EAAE;AAAA,EAC9D;AAEA,SAAO;AACT;AAEA,SAAS,kBAAkB,UAAyB,SAA4B;AAC9E,QAAM,oBAAoB,sBAAsB,QAAQ,OAAO;AAE/D,MAAI,sBAAsB,MAAO,MAAM,QAAQ,iBAAiB,KAAK,kBAAkB,WAAW,GAAI;AACpG;AAAA,EACF;AAEA,WAAS,KAAK;AAAA,IACZ,GAAG;AAAA,IACH,SAAS;AAAA,EACX,CAAC;AACH;AAEA,SAAS,aAAa,SAAyC;AAC7D,QAAM,aAAa,sBAAsB,OAAO;AAChD,MAAI,OAAO,eAAe,UAAU;AAClC,WAAO;AAAA,EACT;AAEA,SAAO,WACJ,IAAI,CAAC,UAAW,OAAO,MAAM,SAAS,WAAW,MAAM,OAAO,EAAG,EACjE,OAAO,CAAC,UAAU,MAAM,SAAS,CAAC,EAClC,KAAK,IAAI;AACd;AAEA,SAAS,4BAA4B,UAAwC;AAC3E,QAAM,SAAwB,CAAC;AAE/B,WAAS,QAAQ,CAAC,YAAY;AAC5B,QAAI,QAAQ,SAAS,UAAU;AAC7B,aAAO,KAAK,OAAO;AACnB;AAAA,IACF;AAEA,UAAM,WAAW,OAAO,OAAO,SAAS,CAAC;AACzC,QACE,CAAC,YACD,SAAS,SAAS,YAClB,SAAS,iBAAiB,UAC1B,SAAS,eAAe,QACxB;AACA,aAAO,KAAK,OAAO;AACnB;AAAA,IACF;AAEA,UAAM,WAAW,CAAC,aAAa,SAAS,OAAO,GAAG,aAAa,QAAQ,OAAO,CAAC,EAC5E,OAAO,CAAC,UAAU,MAAM,SAAS,CAAC,EAClC,KAAK,MAAM;AAEd,aAAS,UAAU;AAAA,EACrB,CAAC;AAED,SAAO;AACT;AAEA,SAAS,qBAAqB,UAAyB,OAAsB;AAC3E,MAAI,OAAO,UAAU,UAAU;AAC7B,sBAAkB,UAAU,EAAE,MAAM,QAAQ,SAAS,MAAM,CAAC;AAC5D;AAAA,EACF;AAEA,MAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AACzB,QAAI,UAAU,UAAa,UAAU,MAAM;AACzC,wBAAkB,UAAU,EAAE,MAAM,QAAQ,SAAS,cAAc,KAAK,EAAE,CAAC;AAAA,IAC7E;AACA;AAAA,EACF;AAEA,QAAM,QAAQ,CAAC,UAAU;AACvB,QAAI,OAAO,UAAU,UAAU;AAC7B,wBAAkB,UAAU,EAAE,MAAM,QAAQ,SAAS,MAAM,CAAC;AAC5D;AAAA,IACF;AAEA,QAAI,CAACA,UAAS,KAAK,GAAG;AACpB,wBAAkB,UAAU,EAAE,MAAM,QAAQ,SAAS,cAAc,KAAK,EAAE,CAAC;AAC3E;AAAA,IACF;AAEA,UAAM,OACJ,kBAAkB,MAAM,IAAI,MAC3B,MAAM,SAAS,YAAY,kBAAkB,MAAM,IAAI,IAAI;AAC9D,UAAM,OAAO,OAAO,MAAM,SAAS,WAAW,MAAM,OAAO;AAE3D,QAAI,MAAM;AACR,wBAAkB,UAAU;AAAA,QAC1B;AAAA,QACA,SAAS,sBAAsB,MAAM,WAAW,EAAE;AAAA,MACpD,CAAC;AACD;AAAA,IACF;AAEA,QAAI,SAAS,wBAAwB;AACnC,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,cACE,OAAO,MAAM,YAAY,YAAY,MAAM,QAAQ,SAAS,IACxD,MAAM,UACN,QAAQ,WAAW,EAAE,QAAQ,MAAM,EAAE,CAAC;AAAA,QAC5C,SAAS,cAAc,MAAM,MAAM;AAAA,MACrC,CAAC;AACD;AAAA,IACF;AAEA,QAAI,SAAS,iBAAiB;AAC5B,YAAM,OAAO,OAAO,MAAM,SAAS,WAAW,MAAM,OAAO;AAC3D,YAAM,SACJ,OAAO,MAAM,YAAY,YAAY,MAAM,QAAQ,SAAS,IACxD,MAAM,UACN,QAAQ,WAAW,EAAE,QAAQ,MAAM,EAAE,CAAC;AAC5C,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,YAAY;AAAA,UACV;AAAA,YACE,IAAI;AAAA,YACJ,MAAM;AAAA,YACN,UAAU;AAAA,cACR;AAAA,cACA,WAAW,cAAc,MAAM,SAAS;AAAA,YAC1C;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAC;AACD;AAAA,IACF;AAEA,QAAI,SAAS,gBAAgB,SAAS,eAAe;AACnD,wBAAkB,UAAU;AAAA,QAC1B,MAAM;AAAA,QACN,SAAS,CAAC,KAAK;AAAA,MACjB,CAAC;AACD;AAAA,IACF;AAEA,sBAAkB,UAAU;AAAA,MAC1B,MAAM;AAAA,MACN,SAAS,sBAAsB,MAAM,WAAW,MAAM,QAAQ,KAAK;AAAA,IACrE,CAAC;AAAA,EACH,CAAC;AACH;AAEA,SAAS,eAAe,OAAyB;AAC/C,MAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AACzB,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,MAAM,QAAQ,CAAC,UAAU;AAC1C,QAAI,CAACA,UAAS,KAAK,KAAK,MAAM,SAAS,YAAY;AACjD,aAAO,CAAC;AAAA,IACV;AAEA,UAAM,OAAO,OAAO,MAAM,SAAS,WAAW,MAAM,OAAO;AAC3D,QAAI,KAAK,WAAW,GAAG;AACrB,aAAO,CAAC;AAAA,IACV;AAEA,WAAO;AAAA,MACL;AAAA,QACE,MAAM;AAAA,QACN,UAAU,gBAAgB;AAAA,UACxB;AAAA,UACA,aAAa,OAAO,MAAM,gBAAgB,WAAW,MAAM,cAAc;AAAA,UACzE,YAAYA,UAAS,MAAM,UAAU,IAAI,MAAM,aAAa,MAAM,cAAc;AAAA,UAChF,QAAQ,MAAM,WAAW,OAAO,OAAO;AAAA,QACzC,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF,CAAC;AAED,SAAO,WAAW,SAAS,IAAI,aAAa;AAC9C;AAEA,SAAS,oBAAoB,YAA8B;AACzD,MAAI,eAAe,UAAa,eAAe,MAAM;AACnD,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,eAAe,UAAU;AAClC,WAAO;AAAA,EACT;AAEA,MAAI,CAACA,UAAS,UAAU,KAAK,WAAW,SAAS,YAAY;AAC3D,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,WAAW,SAAS,UAAU;AACvC,WAAO;AAAA,MACL,MAAM;AAAA,MACN,UAAU;AAAA,QACR,MAAM,WAAW;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAEA,MAAIA,UAAS,WAAW,QAAQ,KAAK,OAAO,WAAW,SAAS,SAAS,UAAU;AACjF,WAAO;AAAA,MACL,MAAM;AAAA,MACN,UAAU;AAAA,QACR,MAAM,WAAW,SAAS;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,iBAAiB,SAA0C;AAClE,QAAM,aAAa;AAAA,IACjB,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAEA,aAAW,aAAa,YAAY;AAClC,QAAI,OAAO,cAAc,YAAY,OAAO,SAAS,SAAS,KAAK,YAAY,GAAG;AAChF,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,gBAAmD,OAAa;AACvE,SAAO,OAAO;AAAA,IACZ,OAAO,QAAQ,KAAK,EAAE,OAAO,CAAC,CAAC,EAAE,KAAK,MAAM,UAAU,MAAS;AAAA,EACjE;AACF;AAEO,SAAS,0BACd,UACA,OAC+B;AAC/B,QAAM,UAAU,KAAK,MAAM,QAAQ;AACnC,QAAM,qBACJ,OAAO,QAAQ,yBAAyB,WAAW,QAAQ,uBAAuB;AACpF,QAAM,WACJ,mBAAmB,SAAS,IAAI,MAAM,YAAY,kBAAkB,KAAK,CAAC,IAAI,CAAC;AAEjF,MACE,SAAS,WAAW,KACpB,OAAO,QAAQ,iBAAiB,YAChC,QAAQ,aAAa,KAAK,EAAE,SAAS,GACrC;AACA,sBAAkB,UAAU;AAAA,MAC1B,MAAM;AAAA,MACN,SAAS,QAAQ;AAAA,IACnB,CAAC;AAAA,EACH;AAEA,uBAAqB,UAAU,QAAQ,KAAK;AAC5C,QAAM,qBAAqB,4BAA4B,QAAQ;AAC/D,QAAM,uBAAuB,oBAAoB,QAAQ,WAAW;AAEpE,QAAM,cAAc,gBAAgB;AAAA,IAClC,UAAU;AAAA,IACV,OAAO,QAAQ;AAAA,IACf,YAAY,iBAAiB,OAAO;AAAA,IACpC,qBAAqB,QAAQ,wBAAwB,OAAO,OAAO;AAAA,IACnE,QAAQ,OAAO,QAAQ,WAAW,YAAY,QAAQ,SAAS;AAAA,IAC/D,aAAa,OAAO,QAAQ,gBAAgB,WAAW,QAAQ,cAAc;AAAA,IAC7E,aAAa,yBAAyB,SAAS,SAAY;AAAA,IAC3D,OAAO,eAAe,QAAQ,KAAK;AAAA,IACnC,OAAO,OAAO,QAAQ,UAAU,WAAW,QAAQ,QAAQ;AAAA,IAC3D,MAAM,OAAO,QAAQ,SAAS,WAAW,QAAQ,OAAO;AAAA,EAC1D,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA,UAAU;AAAA,EACZ;AACF;AAEA,SAAS,yBAAyB,SAAiB,QAAyC;AAC1F,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS;AAAA,MACP;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,aAAa,CAAC;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,8BAA8B,UAAiD;AACtF,SAAO;AAAA,IACL,IAAI,MAAM,WAAW,EAAE,QAAQ,MAAM,EAAE,CAAC;AAAA,IACxC,MAAM;AAAA,IACN,SAAS,SAAS;AAAA,IAClB,MAAM,SAAS,SAAS;AAAA,IACxB,WAAW,SAAS,SAAS;AAAA,IAC7B,QAAQ;AAAA,EACV;AACF;AAEA,SAAS,oBACP,SACuG;AACvG,QAAM,UAAU,MAAM,QAAQ,QAAQ,OAAO,IAAI,QAAQ,UAAU,CAAC;AACpE,QAAM,cAAc,QAAQ,KAAKA,SAAQ;AACzC,QAAM,UACJ,eAAeA,UAAS,YAAY,OAAO,IAAI,YAAY,UAAW,CAAC;AACzE,QAAM,cAAc,sBAAsB,QAAQ,WAAW,EAAE;AAC/D,QAAM,gBAA6B;AAAA,IACjC,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAEA,QAAM,gBAAgD,CAAC;AAEvD,QAAM,iBACJ,OAAO,gBAAgB,WACnB,cACA,MAAM,QAAQ,WAAW,IACvB,YACG,IAAI,CAAC,UAAW,OAAO,MAAM,SAAS,WAAW,MAAM,OAAO,EAAG,EACjE,OAAO,CAAC,UAAU,MAAM,SAAS,CAAC,EAClC,KAAK,EAAE,IACV;AACR,MAAI,eAAe,SAAS,GAAG;AAC7B,kBAAc,KAAK,yBAAyB,gBAAgB,OAAO,WAAW,EAAE,QAAQ,MAAM,EAAE,CAAC,EAAE,CAAC;AAAA,EACtG;AAEA,QAAM,YAAY,MAAM,QAAQ,QAAQ,UAAU,IAC9C,QAAQ,WAAW,OAAOA,SAAQ,EAAE,QAAQ,CAAC,aAAa;AACxD,QAAI,CAACA,UAAS,SAAS,QAAQ,KAAK,OAAO,SAAS,SAAS,SAAS,UAAU;AAC9E,aAAO,CAAC;AAAA,IACV;AAEA,WAAO;AAAA,MACL;AAAA,QACE,IACE,OAAO,SAAS,OAAO,YAAY,SAAS,GAAG,SAAS,IACpD,SAAS,KACT,QAAQ,WAAW,EAAE,QAAQ,MAAM,EAAE,CAAC;AAAA,QAC5C,MAAM;AAAA,QACN,UAAU;AAAA,UACR,MAAM,SAAS,SAAS;AAAA,UACxB,WACE,OAAO,SAAS,SAAS,cAAc,WACnC,SAAS,SAAS,YAClB,cAAc,SAAS,SAAS,SAAS;AAAA,QACjD;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC,IACD,CAAC;AAEL,MAAI,UAAU,SAAS,GAAG;AACxB,kBAAc,aAAa;AAC3B,kBAAc,KAAK,GAAG,UAAU,IAAI,CAAC,aAAa,8BAA8B,QAAQ,CAAC,CAAC;AAAA,EAC5F;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,uCACd,UACA,UACkC;AAClC,QAAM,UAAU,KAAK,MAAM,QAAQ;AACnC,QAAM,aAAa,QAAQ,WAAW,EAAE,QAAQ,MAAM,EAAE,CAAC;AACzD,QAAM,EAAE,gBAAgB,eAAe,cAAc,IAAI,oBAAoB,OAAO;AACpF,QAAM,WAAW;AAAA,IACf,IAAI;AAAA,IACJ,QAAQ;AAAA,IACR,YAAY,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI;AAAA,IACxC,OAAO,OAAO,QAAQ,UAAU,WAAW,QAAQ,QAAQ;AAAA,IAC3D,QAAQ;AAAA,IACR,aAAa,eAAe,SAAS,IAAI,iBAAiB;AAAA,IAC1D,QAAQ;AAAA,EACV;AAEA,QAAM,iBAAiB,WAAW,QAAQ;AAC1C,iBAAe,KAAK,aAAa;AAEjC,SAAO;AAAA,IACL,UAAU,KAAK,UAAU,gBAAgB,QAAQ,CAAC;AAAA,IAClD,UAAU,gBAAgB,QAAQ;AAAA,IAClC;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,YAAY,MAAc,OAAwC;AACzE,SAAO,SAAS,KAAK,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;AAAA;AAAA;AACpD;AAEO,IAAM,uCAAN,MAA2C;AAAA,EAWhD,YACmB,UACA,OACjB;AAFiB;AACA;AAAA,EAChB;AAAA,EAbK,SAAS;AAAA,EACT,mBAAmB;AAAA,EACV,YAAY,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI;AAAA,EACjD,YAAY;AAAA,EACH,gBAAgB,OAAO,WAAW,EAAE,QAAQ,MAAM,EAAE,CAAC;AAAA,EAC9D,qBAAoC;AAAA,EAC3B,aAAa,QAAQ,WAAW,EAAE,QAAQ,MAAM,EAAE,CAAC;AAAA,EAC5D,OAAO;AAAA,EACE,aAAa,oBAAI,IAAuB;AAAA,EAOzD,QAAgB;AACd,WAAO,YAAY,oBAAoB;AAAA,MACrC,UAAU;AAAA,QACR,IAAI,KAAK;AAAA,QACT,QAAQ;AAAA,QACR,YAAY,KAAK;AAAA,QACjB,OAAO,KAAK;AAAA,QACZ,QAAQ,CAAC;AAAA,QACT,aAAa;AAAA,QACb,QAAQ;AAAA,MACV;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,KAAK,OAAuB;AAC1B,UAAM,QAAQ,KAAK,SAAS;AAC5B,UAAM,QAAQ,MAAM,MAAM,SAAS;AACnC,UAAM,WAAW,MAAM,IAAI;AAC3B,SAAK,SAAS,YAAY;AAE1B,QAAI,SAAS;AACb,aAAS,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS,GAAG;AACpD,YAAM,OAAO,MAAM,KAAK,KAAK;AAC7B,gBAAU,KAAK,cAAc,IAAI;AAAA,IACnC;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,SAAmH;AACjH,QAAI,SAAS;AACb,QAAI,KAAK,OAAO,SAAS,GAAG;AAC1B,gBAAU,KAAK,cAAc,KAAK,MAAM;AACxC,WAAK,SAAS;AAAA,IAChB;AACA,cAAU,KAAK,SAAS;AACxB,UAAM,WAAW,KAAK,oBAAoB;AAC1C,UAAM,iBAAiB,WAAW,KAAK,QAAQ;AAC/C,mBAAe,KAAK,KAAK,sBAAsB,CAAC;AAChD,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,YAAY,KAAK;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,cAAc,MAAsB;AAC1C,QAAI,CAAC,KAAK,WAAW,QAAQ,GAAG;AAC9B,aAAO;AAAA,IACT;AAEA,UAAM,cAAc,KAAK,MAAM,CAAC;AAChC,QAAI,gBAAgB,UAAU;AAC5B,aAAO,KAAK,SAAS;AAAA,IACvB;AAEA,QAAI;AACJ,QAAI;AACF,YAAM,SAAS,KAAK,MAAM,WAAW;AACrC,UAAI,CAACA,UAAS,MAAM,GAAG;AACrB,eAAO;AAAA,MACT;AACA,gBAAU;AAAA,IACZ,QAAQ;AACN,aAAO;AAAA,IACT;AAEA,UAAM,UAAU,MAAM,QAAQ,QAAQ,OAAO,IAAI,QAAQ,UAAU,CAAC;AACpE,UAAM,SAAS,QAAQ,KAAKA,SAAQ;AACpC,QAAI,CAAC,QAAQ;AACX,aAAO;AAAA,IACT;AAEA,UAAM,QAAQA,UAAS,OAAO,KAAK,IAAI,OAAO,QAAQ,CAAC;AACvD,QAAI,SAAS;AAEb,QAAI,OAAO,MAAM,YAAY,YAAY,MAAM,QAAQ,SAAS,GAAG;AACjE,gBAAU,KAAK,YAAY,MAAM,OAAO;AAAA,IAC1C;AAEA,QAAI,MAAM,QAAQ,MAAM,UAAU,GAAG;AACnC,YAAM,WAAW,OAAOA,SAAQ,EAAE,QAAQ,CAAC,UAAU,aAAa;AAChE,kBAAU,KAAK,aAAa,UAAU,QAAQ;AAAA,MAChD,CAAC;AAAA,IACH;AAEA,QAAI,OAAO,kBAAkB,UAAa,OAAO,kBAAkB,MAAM;AACvE,gBAAU,KAAK,SAAS;AAAA,IAC1B;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,YAAY,OAAuB;AACzC,SAAK,QAAQ;AAEb,QAAI,KAAK,uBAAuB,MAAM;AACpC,WAAK,qBAAqB;AAC1B,UAAI,SAAS,YAAY,8BAA8B;AAAA,QACrD,MAAM;AAAA,UACJ,IAAI,KAAK;AAAA,UACT,MAAM;AAAA,UACN,MAAM;AAAA,UACN,QAAQ;AAAA,UACR,SAAS,CAAC;AAAA,QACZ;AAAA,QACA,cAAc,KAAK;AAAA,MACrB,CAAC;AACD,gBAAU,YAAY,+BAA+B;AAAA,QACnD,eAAe;AAAA,QACf,SAAS,KAAK;AAAA,QACd,cAAc,KAAK;AAAA,QACnB,MAAM;AAAA,UACJ,MAAM;AAAA,UACN,MAAM;AAAA,UACN,aAAa,CAAC;AAAA,QAChB;AAAA,MACF,CAAC;AACD,WAAK,mBAAmB;AACxB,gBAAU,YAAY,8BAA8B;AAAA,QAClD,eAAe;AAAA,QACf;AAAA,QACA,SAAS,KAAK;AAAA,QACd,cAAc,KAAK;AAAA,MACrB,CAAC;AACD,aAAO;AAAA,IACT;AAEA,WAAO,YAAY,8BAA8B;AAAA,MAC/C,eAAe;AAAA,MACf;AAAA,MACA,SAAS,KAAK;AAAA,MACd,cAAc,KAAK;AAAA,IACrB,CAAC;AAAA,EACH;AAAA,EAEQ,aAAa,UAAmC,UAA0B;AAChF,UAAM,QAAQ,OAAO,SAAS,UAAU,WAAW,SAAS,QAAQ;AACpE,UAAM,WAAW,KAAK,WAAW,IAAI,KAAK;AAC1C,UAAM,kBAAkBA,UAAS,SAAS,QAAQ,IAAI,SAAS,WAAW,CAAC;AAC3E,UAAM,QACJ,YACA;AAAA,MACE,WAAW;AAAA,MACX,QACE,OAAO,SAAS,OAAO,YAAY,SAAS,GAAG,SAAS,IACpD,SAAS,KACT,QAAQ,WAAW,EAAE,QAAQ,MAAM,EAAE,CAAC;AAAA,MAC5C,QAAQ,MAAM,WAAW,EAAE,QAAQ,MAAM,EAAE,CAAC;AAAA,MAC5C,MAAM,OAAO,gBAAgB,SAAS,WAAW,gBAAgB,OAAO;AAAA,MACxE,cACG,KAAK,uBAAuB,OAAO,IAAI,KAAK,MAAM,KAAK,KAAK,WAAW,KAAK,CAAC,EAAE;AAAA,IACpF;AAEF,QAAI,OAAO,gBAAgB,SAAS,YAAY,gBAAgB,KAAK,SAAS,GAAG;AAC/E,YAAM,OAAO,gBAAgB;AAAA,IAC/B;AAEA,QAAI,SAAS;AACb,QAAI,CAAC,UAAU;AACb,gBAAU,YAAY,8BAA8B;AAAA,QAClD,MAAM;AAAA,UACJ,IAAI,MAAM;AAAA,UACV,MAAM;AAAA,UACN,SAAS,MAAM;AAAA,UACf,MAAM,MAAM;AAAA,UACZ,WAAW;AAAA,UACX,QAAQ;AAAA,QACV;AAAA,QACA,cAAc,MAAM;AAAA,MACtB,CAAC;AACD,WAAK,WAAW,IAAI,OAAO,KAAK;AAAA,IAClC;AAEA,QAAI,OAAO,gBAAgB,cAAc,YAAY,gBAAgB,UAAU,SAAS,GAAG;AACzF,YAAM,aAAa,gBAAgB;AACnC,gBAAU,YAAY,0CAA0C;AAAA,QAC9D,OAAO,gBAAgB;AAAA,QACvB,SAAS,MAAM;AAAA,QACf,cAAc,MAAM;AAAA,MACtB,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,WAAmB;AACzB,QAAI,KAAK,WAAW;AAClB,aAAO;AAAA,IACT;AAEA,SAAK,YAAY;AACjB,QAAI,SAAS;AAEb,QAAI,KAAK,uBAAuB,QAAQ,KAAK,kBAAkB;AAC7D,gBAAU,YAAY,6BAA6B;AAAA,QACjD,eAAe;AAAA,QACf,SAAS,KAAK;AAAA,QACd,cAAc,KAAK;AAAA,QACnB,MAAM,KAAK;AAAA,MACb,CAAC;AACD,gBAAU,YAAY,8BAA8B;AAAA,QAClD,eAAe;AAAA,QACf,SAAS,KAAK;AAAA,QACd,cAAc,KAAK;AAAA,QACnB,MAAM;AAAA,UACJ,MAAM;AAAA,UACN,MAAM,KAAK;AAAA,UACX,aAAa,CAAC;AAAA,QAChB;AAAA,MACF,CAAC;AACD,gBAAU,YAAY,6BAA6B;AAAA,QACjD,MAAM,yBAAyB,KAAK,MAAM,KAAK,aAAa;AAAA,QAC5D,cAAc,KAAK;AAAA,MACrB,CAAC;AAAA,IACH;AAEA,UAAM,KAAK,KAAK,WAAW,OAAO,CAAC,EAChC,KAAK,CAAC,MAAM,UAAU,KAAK,cAAc,MAAM,WAAW,EAC1D,QAAQ,CAAC,cAAc;AACtB,gBAAU,YAAY,yCAAyC;AAAA,QAC7D,WAAW,UAAU;AAAA,QACrB,SAAS,UAAU;AAAA,QACnB,cAAc,UAAU;AAAA,MAC1B,CAAC;AACD,gBAAU,YAAY,6BAA6B;AAAA,QACjD,MAAM;AAAA,UACJ,IAAI,UAAU;AAAA,UACd,MAAM;AAAA,UACN,SAAS,UAAU;AAAA,UACnB,MAAM,UAAU;AAAA,UAChB,WAAW,UAAU;AAAA,UACrB,QAAQ;AAAA,QACV;AAAA,QACA,cAAc,UAAU;AAAA,MAC1B,CAAC;AAAA,IACH,CAAC;AAEH,cAAU,YAAY,sBAAsB;AAAA,MAC1C,UAAU,KAAK,oBAAoB;AAAA,IACrC,CAAC;AAED,WAAO;AAAA,EACT;AAAA,EAEQ,wBAAqC;AAC3C,UAAM,YAAY,MAAM,KAAK,KAAK,WAAW,OAAO,CAAC,EAClD,KAAK,CAAC,MAAM,UAAU,KAAK,cAAc,MAAM,WAAW,EAC1D,IAAI,CAAC,eAAe;AAAA,MACnB,IAAI,UAAU;AAAA,MACd,MAAM;AAAA,MACN,UAAU;AAAA,QACR,MAAM,UAAU;AAAA,QAChB,WAAW,UAAU;AAAA,MACvB;AAAA,IACF,EAAE;AAEJ,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS,KAAK;AAAA,MACd,GAAI,UAAU,SAAS,IAAI,EAAE,YAAY,UAAU,IAAI,CAAC;AAAA,IAC1D;AAAA,EACF;AAAA,EAEQ,sBAA+C;AACrD,UAAM,SAAyC,CAAC;AAEhD,QAAI,KAAK,uBAAuB,QAAQ,KAAK,KAAK,SAAS,GAAG;AAC5D,aAAO,KAAK,yBAAyB,KAAK,MAAM,KAAK,aAAa,CAAC;AAAA,IACrE;AAEA,UAAM,KAAK,KAAK,WAAW,OAAO,CAAC,EAChC,KAAK,CAAC,MAAM,UAAU,KAAK,cAAc,MAAM,WAAW,EAC1D,QAAQ,CAAC,cAAc;AACtB,aAAO,KAAK;AAAA,QACV,IAAI,UAAU;AAAA,QACd,MAAM;AAAA,QACN,SAAS,UAAU;AAAA,QACnB,MAAM,UAAU;AAAA,QAChB,WAAW,UAAU;AAAA,QACrB,QAAQ;AAAA,MACV,CAAC;AAAA,IACH,CAAC;AAEH,WAAO,gBAAgB;AAAA,MACrB,IAAI,KAAK;AAAA,MACT,QAAQ;AAAA,MACR,YAAY,KAAK;AAAA,MACjB,OAAO,KAAK;AAAA,MACZ;AAAA,MACA,aAAa,KAAK,KAAK,SAAS,IAAI,KAAK,OAAO;AAAA,MAChD,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AACF;AAEO,SAAS,yCAAiD;AAC/D,SAAO,KAAK,UAAU;AAAA,IACpB,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,QAAQ;AAAA,EACV,CAAC;AACH;;;AC30BA,SAAS,UAAU,SAAiB,YAA0B;AAC5D,WAAS,QAAQ,GAAG,QAAQ,QAAQ,QAAQ,SAAS,GAAG;AACtD,YAAQ,KAAK,KAAK,WAAW,QAAQ,CAAC;AAAA,EACxC;AACF;AAEA,SAAS,WAAW,OAA6B,SAAyB;AACxE,MAAI,eAAe;AAEnB,MAAI,QAAQ,UAAU,OAAO,QAAQ,UAAU,OAAQ;AACrD,oBAAgB;AAAA,EAClB,WAAW,QAAQ,SAAS,OAAQ;AAClC,oBAAgB;AAAA,EAClB;AAEA,MAAI,MAAM,QAAQ;AAChB,oBAAgB;AAAA,EAClB;AAEA,QAAM,SAAS,OAAO,MAAM,eAAe,QAAQ,MAAM;AACzD,SAAO,CAAC,IAAI,MAAM;AAElB,MAAI,SAAS;AACb,MAAI,QAAQ,SAAS,KAAK;AACxB,WAAO,CAAC,KAAK,MAAM,SAAS,MAAO,KAAK,QAAQ;AAAA,EAClD,WAAW,QAAQ,UAAU,OAAQ;AACnC,WAAO,CAAC,KAAK,MAAM,SAAS,MAAO,KAAK;AACxC,WAAO,cAAc,QAAQ,QAAQ,MAAM;AAC3C,cAAU;AAAA,EACZ,OAAO;AACL,WAAO,CAAC,KAAK,MAAM,SAAS,MAAO,KAAK;AACxC,WAAO,iBAAiB,OAAO,QAAQ,MAAM,GAAG,MAAM;AACtD,cAAU;AAAA,EACZ;AAEA,MAAI,MAAM,QAAQ;AAChB,UAAM,aAAa,MAAM,cAAc,OAAO,KAAK,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;AAC/D,eAAW,KAAK,QAAQ,MAAM;AAC9B,cAAU;AAAA,EACZ;AAEA,UAAQ,KAAK,QAAQ,MAAM;AAC3B,MAAI,MAAM,UAAU,MAAM,YAAY;AACpC,cAAU,OAAO,SAAS,MAAM,GAAG,MAAM,UAAU;AAAA,EACrD;AAEA,SAAO;AACT;AAEA,SAAS,WAAW,OAA4C;AAC9D,MAAI,MAAM,SAAS,GAAG;AACpB,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,MAAM,CAAC;AACzB,QAAM,aAAa,MAAM,CAAC;AAC1B,QAAM,SAAS,QAAQ,aAAa,GAAI;AACxC,QAAM,oBAAoB,aAAa;AACvC,MAAI,SAAS;AACb,MAAI,gBAAgB;AAEpB,MAAI,oBAAoB,KAAK;AAC3B,oBAAgB;AAAA,EAClB,WAAW,sBAAsB,KAAK;AACpC,QAAI,MAAM,SAAS,SAAS,GAAG;AAC7B,aAAO;AAAA,IACT;AAEA,oBAAgB,MAAM,aAAa,MAAM;AACzC,cAAU;AAAA,EACZ,OAAO;AACL,QAAI,MAAM,SAAS,SAAS,GAAG;AAC7B,aAAO;AAAA,IACT;AAEA,oBAAgB,OAAO,MAAM,gBAAgB,MAAM,CAAC;AACpD,cAAU;AAAA,EACZ;AAEA,MAAI;AACJ,MAAI,QAAQ;AACV,QAAI,MAAM,SAAS,SAAS,GAAG;AAC7B,aAAO;AAAA,IACT;AAEA,iBAAa,OAAO,KAAK,MAAM,SAAS,QAAQ,SAAS,CAAC,CAAC;AAC3D,cAAU;AAAA,EACZ;AAEA,MAAI,MAAM,SAAS,SAAS,eAAe;AACzC,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,OAAO,KAAK,MAAM,SAAS,QAAQ,SAAS,aAAa,CAAC;AAC1E,MAAI,YAAY;AACd,cAAU,SAAS,UAAU;AAAA,EAC/B;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ,YAAY;AAAA,IACpB;AAAA,IACA,WAAW,SAAS;AAAA,EACtB;AACF;AAEA,IAAM,uBAAN,MAA2B;AAAA,EACjB,SAAS,OAAO,MAAM,CAAC;AAAA,EACd;AAAA,EACT,oBAAoB;AAAA,EAE5B,YAAY,cAAmC;AAC7C,SAAK,WAAW,IAAI,eAAe,YAAY;AAAA,EACjD;AAAA,EAEA,KAAK,OAAuB;AAC1B,SAAK,SACH,KAAK,OAAO,WAAW,IAAI,OAAO,KAAK,KAAK,IAAI,OAAO,OAAO,CAAC,KAAK,QAAQ,KAAK,CAAC;AAEpF,UAAM,SAAmB,CAAC;AAE1B,WAAO,MAAM;AACX,YAAM,QAAQ,WAAW,KAAK,MAAM;AACpC,UAAI,CAAC,OAAO;AACV;AAAA,MACF;AAEA,WAAK,SAAS,KAAK,OAAO,SAAS,MAAM,SAAS;AAClD,aAAO,KAAK,KAAK,eAAe,KAAK,CAAC;AAAA,IACxC;AAEA,WAAO,OAAO,WAAW,IAAI,OAAO,MAAM,CAAC,IAAI,OAAO,OAAO,MAAM;AAAA,EACrE;AAAA,EAEA,QAAgB;AACd,SAAK,SAAS,OAAO,MAAM,CAAC;AAC5B,SAAK,oBAAoB;AACzB,SAAK,SAAS,MAAM;AAEpB,WAAO,OAAO,MAAM,CAAC;AAAA,EACvB;AAAA,EAEQ,eAAe,OAAqC;AAC1D,UAAM,YAAY,MAAM,WAAW,KAAQ,MAAM,WAAW,KAAO,KAAK;AACxE,QAAI,CAAC,WAAW;AACd,aAAO,WAAW,OAAO,MAAM,OAAO;AAAA,IACxC;AAEA,UAAM,aAAa,QAAQ,MAAM,YAAY,GAAI;AACjD,QAAI,cAAc,KAAK,SAAS,KAAK,MAAM,QAAQ,SAAS,MAAM,CAAC;AAEnE,QAAI,YAAY;AACd,qBAAe,KAAK,SAAS,MAAM;AACnC,WAAK,oBAAoB;AAAA,IAC3B,OAAO;AACL,WAAK,oBAAoB;AAAA,IAC3B;AAEA,WAAO,WAAW,OAAO,OAAO,KAAK,aAAa,MAAM,CAAC;AAAA,EAC3D;AACF;AAEA,SAAS,cACP,QACA,QACA,aACA,MACM;AACN,QAAM,aAAa,CAAC,UAAkB;AACpC,UAAM,SAAS,YAAY,KAAK,KAAK;AACrC,QAAI,OAAO,SAAS,GAAG;AACrB,aAAO,MAAM,MAAM;AAAA,IACrB;AAAA,EACF;AAEA,MAAI,QAAQ,KAAK,SAAS,GAAG;AAC3B,eAAW,IAAI;AAAA,EACjB;AAEA,SAAO,GAAG,QAAQ,CAAC,UAA2B;AAC5C,eAAW,OAAO,SAAS,KAAK,IAAI,QAAQ,OAAO,KAAK,KAAK,CAAC;AAAA,EAChE,CAAC;AACD,SAAO,KAAK,OAAO,MAAM;AACvB,UAAM,YAAY,YAAY,MAAM;AACpC,QAAI,UAAU,SAAS,GAAG;AACxB,aAAO,MAAM,SAAS;AAAA,IACxB;AAEA,WAAO,IAAI;AAAA,EACb,CAAC;AACD,SAAO,KAAK,SAAS,MAAM;AACzB,QAAI,CAAC,OAAO,WAAW;AACrB,aAAO,QAAQ;AAAA,IACjB;AAAA,EACF,CAAC;AACD,SAAO,KAAK,SAAS,CAAC,UAAU;AAC9B,WAAO,QAAQ,KAAK;AAAA,EACtB,CAAC;AACH;AAEO,SAAS,eAAe,SAAsC;AACnE,QAAM,mBAAmB,IAAI,qBAAqB,QAAQ,4BAA4B;AACtF,QAAM,mBAAmB,IAAI,qBAAqB,QAAQ,4BAA4B;AAEtF;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR;AAAA,IACA,QAAQ;AAAA,EACV;AACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR;AAAA,IACA,QAAQ;AAAA,EACV;AACF;;;AF/MA,IAAM,eAAe;AACrB,IAAM,eAAe;AACrB,IAAM,sBAAsB;AAC5B,IAAM,qBAAqB;AAC3B,IAAM,4BAA4B;AAClC,IAAM,qBAAqB,oBAAI,IAAI;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,oCAAoC,oBAAI,IAAI;AAAA,EAChD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,2BAA2B,oBAAI,IAAI;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAiCD,SAAS,eAAkB,OAAa;AACtC,SAAO,KAAK,MAAM,KAAK,UAAU,KAAK,CAAC;AACzC;AAEA,SAASC,UAAS,OAAkD;AAClE,SAAO,OAAO,UAAU,YAAY,UAAU;AAChD;AAEA,SAAS,oBAAoB,OAA0D;AACrF,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM,CAAC;AAAA,EAChB;AAEA,SAAO;AACT;AAEA,SAAS,uBAAuB,SAAuC;AACrE,QAAM,cAAc,oBAAoB,QAAQ,cAAc,CAAC,GAAG,YAAY;AAC9E,MAAI,CAAC,aAAa;AAChB,WAAO;AAAA,EACT;AAEA,SACE,YAAY,WAAW,OAAO,KAC9B,YAAY,SAAS,kBAAkB,KACvC,YAAY,SAAS,OAAO,KAC5B,YAAY,SAAS,sBAAsB;AAE/C;AAEA,SAAS,cAAc,SAAuC;AAC5D,QAAM,cAAc,oBAAoB,QAAQ,cAAc,CAAC,GAAG,YAAY;AAC9E,SAAO,aAAa,SAAS,mBAAmB,KAAK;AACvD;AAEA,SAAS,YACP,SACA,UAAgD,CAAC,GAC5B;AACrB,QAAM,SAA8B,CAAC;AAErC,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,OAAO,GAAG;AAClD,UAAM,gBAAgB,IAAI,YAAY;AACtC,UAAM,oBACJ,QAAQ,2BAA2B,SAClC,kBAAkB,gBAAgB,kBAAkB;AAEvD,QAAI,UAAU,UAAc,mBAAmB,IAAI,aAAa,KAAK,CAAC,mBAAoB;AACxF;AAAA,IACF;AAEA,WAAO,GAAG,IAAI;AAAA,EAChB;AAEA,SAAO;AACT;AAEA,SAAS,qBACP,SACA,WACA,MACqB;AACrB,QAAM,SAAS,YAAY,OAAO;AAClC,SAAO,OAAO,UAAU;AACxB,SAAO,iBAAiB,IAAI;AAE5B,MAAI,KAAK,SAAS,GAAG;AACnB,WAAO,gBAAgB,IAAI,OAAO,KAAK,MAAM;AAAA,EAC/C,OAAO;AACL,WAAO,OAAO,gBAAgB;AAAA,EAChC;AAEA,SAAO;AACT;AAEA,SAAS,mCAAmC,SAAmD;AAC7F,QAAM,SAA8B,CAAC;AAErC,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,OAAO,GAAG;AAClD,QAAI,IAAI,YAAY,MAAM,eAAe;AACvC;AAAA,IACF;AAEA,WAAO,GAAG,IAAI;AAAA,EAChB;AAEA,SAAO;AACT;AAEA,SAAS,2BACP,SACmC;AACnC,SAAO,OAAO;AAAA,IACZ,OAAO,QAAQ,OAAO,EACnB,OAAO,CAAC,CAAC,EAAE,KAAK,MAAM,UAAU,MAAS,EACzC,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM;AACrB,UAAI,yBAAyB,IAAI,IAAI,YAAY,CAAC,GAAG;AACnD,eAAO,CAAC,KAAK,YAAY;AAAA,MAC3B;AAEA,UAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,eAAO,CAAC,KAAK,MAAM,IAAI,CAAC,UAAU,OAAO,KAAK,CAAC,CAAC;AAAA,MAClD;AAEA,aAAO,CAAC,KAAK,OAAO,KAAK,CAAC;AAAA,IAC5B,CAAC;AAAA,EACL;AACF;AAEA,SAAS,oBAAoB,MAAuB;AAClD,MAAI,KAAK,WAAW,GAAG;AACrB,WAAO;AAAA,EACT;AAEA,MAAI;AACF,WAAO,KAAK,MAAM,IAAI;AAAA,EACxB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAWA,SAAS,8BAA8B,SAAmD;AACxF,QAAM,SAAS,YAAY,SAAS,EAAE,wBAAwB,KAAK,CAAC;AACpE,SAAO,iBAAiB,IAAI;AAC5B,SAAO,aAAa,oBAAoB,QAAQ,UAAU,KAAK;AAC/D,SAAO,UAAU,oBAAoB,QAAQ,OAAO,KAAK;AAEzD,aAAW,OAAO,mCAAmC;AACnD,WAAO,OAAO,GAAG;AAAA,EACnB;AAEA,SAAO;AACT;AAEA,SAAS,mBACP,SACA,eACqB;AACrB,QAAM,SAAS,YAAY,OAAO;AAElC,MAAI,kBAAkB,QAAW;AAC/B,WAAO,OAAO,gBAAgB;AAAA,EAChC,OAAO;AACL,WAAO,gBAAgB,IAAI,OAAO,aAAa;AAAA,EACjD;AAEA,SAAO;AACT;AAEA,SAAS,qBAAqB,SAAsC;AAClE,MAAI,SAAS;AAEb,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,OAAO,GAAG;AAClD,QAAI,UAAU,QAAW;AACvB;AAAA,IACF;AAEA,QAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,YAAM,QAAQ,CAAC,UAAU;AACvB,kBAAU,GAAG,GAAG,KAAK,KAAK;AAAA;AAAA,MAC5B,CAAC;AACD;AAAA,IACF;AAEA,cAAU,GAAG,GAAG,KAAK,OAAO,KAAK,CAAC;AAAA;AAAA,EACpC;AAEA,SAAO;AACT;AAEA,SAAS,qBAAqB,SAOrB;AACP,QAAM;AAAA,IACJ,OAAO,OAAO,MAAM,CAAC;AAAA,IACrB,UAAU,CAAC;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU;AAAA,EACZ,IAAI;AACJ,QAAM,cAAc,qBAAqB,OAAO;AAChD,SAAO,MAAM,QAAQ,OAAO,IAAI,UAAU,IAAI,aAAa;AAAA,EAAO,WAAW;AAAA,CAAM;AACnF,MAAI,KAAK,SAAS,GAAG;AACnB,WAAO,MAAM,IAAI;AAAA,EACnB;AACF;AAEA,SAAS,iBAAiB,SAAiB,aAA0B;AACnE,QAAM,OAAO,IAAI,IAAI,OAAO;AAC5B,QAAM,aAAa,IAAI,IAAI,aAAa,kBAAkB;AAC1D,QAAM,qBAAqB,KAAK,SAAS,SAAS,GAAG,IACjD,KAAK,SAAS,MAAM,GAAG,EAAE,IACzB,KAAK;AAET,OAAK,WAAW,GAAG,kBAAkB,GAAG,WAAW,QAAQ,GAAG,QAAQ,WAAW,GAAG;AACpF,OAAK,SAAS,WAAW;AAEzB,SAAO;AACT;AAEA,SAAS,qBAAqB,OAAuB;AACnD,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO;AAAA,EACT;AAEA,SAAO,MAAM,WAAW,GAAG,IAAI,QAAQ,IAAI,KAAK;AAClD;AAEA,SAAS,6BAA6B,MAAuB;AAC3D,QAAM,YAAY,KAAK,YAAY;AACnC,SAAO,cAAc,mBAAmB,cAAc;AACxD;AAEA,SAAS,oCAAoC,MAA6B;AACxE,QAAM,YAAY,KAAK,YAAY;AACnC,QAAM,QAAQ,UAAU,MAAM,iCAAiC;AAC/D,SAAO,QAAQ,MAAM,CAAC,IAAI;AAC5B;AAEA,SAAS,oBAAoB,MAAc,UAAiC;AAC1E,QAAM,SAAS,IAAI,QAAQ;AAE3B,MAAI,SAAS,QAAQ;AACnB,WAAO;AAAA,EACT;AAEA,MAAI,KAAK,WAAW,GAAG,MAAM,GAAG,GAAG;AACjC,WAAO,KAAK,MAAM,OAAO,MAAM;AAAA,EACjC;AAEA,SAAO;AACT;AAEA,SAAS,yBAAyB,SAAqC;AACrE,QAAM,UAAU;AAAA,IACd,GAAG,uBAAuB;AAAA,IAC1B,GAAG,QAAQ;AAAA,EACb;AAEA,MAAI,QAAQ,eAAe;AACzB,YAAQ,YAAY,QAAQ;AAC5B,YAAQ,SAAS,QAAQ;AAAA,EAC3B;AAEA,SAAO;AACT;AAEA,SAAS,gBACP,SACA,SACA,iBACgB;AAChB,QAAM,cAAc,qBAAqB,QAAQ,OAAO,GAAG;AAE3D,MAAI,gBAAgB,WAAW;AAC7B,UAAM,IAAI,MAAM,4DAA4D;AAAA,EAC9E;AAEA,QAAM,kBAAkB,oBAAoB,aAAa,WAAW,MAAM;AAC1E,MAAI,iBAAiB;AACnB,WAAO;AAAA,MACL,UAAU;AAAA,MACV,KAAK,iBAAiB,QAAQ,WAAW,oBAAoB,aAAa,WAAW,CAAC;AAAA,IACxF;AAAA,EACF;AAEA,QAAM,eAAe,oBAAoB,aAAa,QAAQ,MAAM;AACpE,MAAI,cAAc;AAChB,WAAO;AAAA,MACL,UAAU;AAAA,MACV,KAAK,iBAAiB,QAAQ,QAAQ,oBAAoB,aAAa,QAAQ,CAAC;AAAA,IAClF;AAAA,EACF;AAEA,QAAM,YAAY,YAAY,YAAY;AAC1C,QAAM,0BACJ,oBAAoB,QAAQ,QAAQ,mBAAmB,CAAC,MAAM,UAC9D,oBAAoB,QAAQ,QAAQ,WAAW,CAAC,MAAM;AACxD,QAAM,uBACJ,oBAAoB,QAAQ,QAAQ,aAAa,MAAM,UACvD,oBAAoB,QAAQ,QAAQ,qBAAqB,CAAC,MAAM,UAChE,oBAAoB,QAAQ,QAAQ,aAAa,CAAC,MAAM;AAE1D,MAAI,yBAAyB;AAC3B,WAAO;AAAA,MACL,UAAU;AAAA,MACV,KAAK,iBAAiB,QAAQ,WAAW,WAAW;AAAA,IACtD;AAAA,EACF;AAEA,MAAI,sBAAsB;AACxB,WAAO;AAAA,MACL,UAAU;AAAA,MACV,KAAK,iBAAiB,QAAQ,QAAQ,WAAW;AAAA,IACnD;AAAA,EACF;AAEA,MAAI,UAAU,WAAW,cAAc,KAAK,UAAU,WAAW,cAAc,GAAG;AAChF,WAAO;AAAA,MACL,UAAU;AAAA,MACV,KAAK,iBAAiB,QAAQ,WAAW,WAAW;AAAA,IACtD;AAAA,EACF;AAEA,MACE,UAAU,WAAW,WAAW,KAChC,UAAU,WAAW,iBAAiB,KACtC,UAAU,WAAW,eAAe,KACpC,UAAU,WAAW,YAAY,KACjC,UAAU,WAAW,gBAAgB,KACrC,UAAU,WAAW,WAAW,GAChC;AACA,WAAO;AAAA,MACL,UAAU;AAAA,MACV,KAAK,iBAAiB,QAAQ,QAAQ,WAAW;AAAA,IACnD;AAAA,EACF;AAEA,MAAI,iBAAiB;AACnB,WAAO;AAAA,MACL,UAAU;AAAA,MACV,KAAK,iBAAiB,QAAQ,eAAe,GAAG,WAAW;AAAA,IAC7D;AAAA,EACF;AAEA,QAAM,IAAI,MAAM,2DAA2D,WAAW,EAAE;AAC1F;AAEA,SAAS,0BAA0B,MAAc,cAA2C;AAC1F,MAAI,KAAK,WAAW,KAAK,aAAa,SAAS,GAAG;AAChD,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,IAAI,eAAe,YAAY;AAChD,QAAM,WAAW,SAAS,KAAK,KAAK,SAAS,MAAM,CAAC,IAAI,SAAS,MAAM;AAEvE,SAAO,OAAO,KAAK,UAAU,MAAM;AACrC;AAEA,IAAM,mBAAN,MAAuB;AAAA,EAKrB,YAA6B,cAAmC;AAAnC;AAC3B,SAAK,UAAU,MAAM,KAAK,aAAa,KAAK,CAAC,EAAE,KAAK,CAAC,MAAM,UAAU;AACnE,UAAI,MAAM,WAAW,KAAK,QAAQ;AAChC,eAAO,MAAM,SAAS,KAAK;AAAA,MAC7B;AAEA,aAAO,KAAK,cAAc,KAAK;AAAA,IACjC,CAAC;AACD,SAAK,WAAW,IAAI;AAAA,MAClB,KAAK,QAAQ;AAAA,QAAQ,CAAC,WACpB,MAAM;AAAA,UAAK,EAAE,QAAQ,KAAK,IAAI,GAAG,OAAO,SAAS,CAAC,EAAE;AAAA,UAAG,CAAC,GAAG,UACzD,OAAO,MAAM,GAAG,QAAQ,CAAC;AAAA,QAC3B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAnBQ,SAAS;AAAA,EACA;AAAA,EACA;AAAA,EAmBjB,KAAK,OAAuB;AAC1B,UAAM,QAAQ,KAAK,SAAS;AAE5B,QAAI,KAAK,QAAQ,WAAW,GAAG;AAC7B,WAAK,SAAS;AACd,aAAO;AAAA,IACT;AAEA,UAAM,iBAAiB,MAAM,SAAS,KAAK,oBAAoB,KAAK;AACpE,QAAI,kBAAkB,GAAG;AACvB,WAAK,SAAS;AACd,aAAO;AAAA,IACT;AAEA,UAAM,YAAY,KAAK,aAAa,OAAO,cAAc;AACzD,SAAK,SAAS,MAAM,MAAM,SAAS;AAEnC,WAAO,KAAK,YAAY,MAAM,MAAM,GAAG,SAAS,CAAC;AAAA,EACnD;AAAA,EAEA,QAAgB;AACd,QAAI,KAAK,OAAO,WAAW,GAAG;AAC5B,aAAO;AAAA,IACT;AAEA,UAAM,QAAQ,KAAK,YAAY,KAAK,MAAM;AAC1C,SAAK,SAAS;AACd,WAAO;AAAA,EACT;AAAA,EAEQ,oBAAoB,OAAuB;AACjD,UAAM,mBAAmB,KAAK;AAAA,MAC5B,MAAM;AAAA,MACN,KAAK,IAAI,GAAG,GAAG,KAAK,QAAQ,IAAI,CAAC,WAAW,OAAO,SAAS,CAAC,CAAC;AAAA,IAChE;AAEA,aAAS,SAAS,kBAAkB,SAAS,GAAG,UAAU,GAAG;AAC3D,UAAI,KAAK,SAAS,IAAI,MAAM,MAAM,CAAC,MAAM,CAAC,GAAG;AAC3C,eAAO;AAAA,MACT;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,aAAa,OAAe,gBAAgC;AAClE,QAAI,YAAY;AAChB,QAAI,UAAU;AAEd,WAAO,SAAS;AACd,gBAAU;AAEV,iBAAW,UAAU,KAAK,SAAS;AACjC,cAAM,aAAa,KAAK,IAAI,MAAM,SAAS,GAAG,KAAK,IAAI,GAAG,YAAY,CAAC,CAAC;AACxE,cAAM,aAAa,MAAM,YAAY,QAAQ,UAAU;AAEvD,YAAI,eAAe,MAAM,aAAa,aAAa,aAAa,OAAO,SAAS,WAAW;AACzF,sBAAY;AACZ,oBAAU;AAAA,QACZ;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,YAAY,OAAuB;AACzC,QAAI,MAAM,WAAW,GAAG;AACtB,aAAO;AAAA,IACT;AAEA,WAAO,0BAA0B,OAAO,KAAK,OAAO,MAAM,GAAG,KAAK,YAAY,EAAE,SAAS,MAAM;AAAA,EACjG;AACF;AAEA,SAAS,yBAAyB,SAAkC,OAAe,OAAqB;AACtG,MAAI,UAAU,cAAc;AAC1B,YAAQ,aAAa;AACrB;AAAA,EACF;AAEA,QAAM,CAAC,cAAc,SAAS,IAAI,MAAM,MAAM,GAAG;AACjD,QAAM,YAAY,QAAQ,YAAY;AACtC,MAAI,CAACA,UAAS,SAAS,GAAG;AACxB;AAAA,EACF;AAEA,YAAU,SAAS,IAAI;AACzB;AAEA,SAAS,4BAA4B,SAAwC;AAC3E,MAAI,OAAO,QAAQ,eAAe,UAAU;AAC1C,YAAQ,aAAa;AAAA,EACvB;AAEA,MAAIA,UAAS,QAAQ,KAAK,KAAK,OAAO,QAAQ,MAAM,SAAS,UAAU;AACrE,YAAQ,MAAM,OAAO;AAAA,EACvB;AAEA,MAAIA,UAAS,QAAQ,KAAK,KAAK,OAAO,QAAQ,MAAM,iBAAiB,UAAU;AAC7E,YAAQ,MAAM,eAAe;AAAA,EAC/B;AAEA,MAAIA,UAAS,QAAQ,aAAa,KAAK,OAAO,QAAQ,cAAc,SAAS,UAAU;AACrF,YAAQ,cAAc,OAAO;AAAA,EAC/B;AACF;AAEA,SAAS,sBAAsB,SAAqD;AAClF,QAAM,UAA6B,CAAC;AACpC,QAAM,QAAQ,OAAO,QAAQ,UAAU,WAAW,QAAQ,QAAQ;AAElE,QAAM,iBAAiB,CAAC,UAAqC;AAC3D,UAAM,kBAAkB,eAAe,OAAO;AAC9C,gCAA4B,eAAe;AAE3C,WAAO;AAAA,MACL,SAAS;AAAA,MACT,OAAO,CAAC,OAAO,UAAU;AACvB,YAAI,CAACA,UAAS,KAAK,GAAG;AACpB;AAAA,QACF;AAEA,iCAAyB,OAAO,OAAO,KAAK;AAAA,MAC9C;AAAA,IACF;AAAA,EACF;AAEA,MAAIA,UAAS,QAAQ,KAAK,KAAK,OAAO,QAAQ,MAAM,SAAS,UAAU;AACrE,YAAQ,KAAK;AAAA,MACX,KAAK,aAAa,KAAK;AAAA,MACvB,OAAO,QAAQ,MAAM;AAAA,MACrB,OAAO,CAAC,UAAU;AAChB,YAAIA,UAAS,QAAQ,KAAK,GAAG;AAC3B,kBAAQ,MAAM,OAAO;AAAA,QACvB;AAAA,MACF;AAAA,MACA,UAAU,eAAe,YAAY;AAAA,IACvC,CAAC;AAAA,EACH;AAEA,MAAIA,UAAS,QAAQ,KAAK,KAAK,OAAO,QAAQ,MAAM,iBAAiB,UAAU;AAC7E,YAAQ,KAAK;AAAA,MACX,KAAK,aAAa,KAAK;AAAA,MACvB,OAAO,QAAQ,MAAM;AAAA,MACrB,OAAO,CAAC,UAAU;AAChB,YAAIA,UAAS,QAAQ,KAAK,GAAG;AAC3B,kBAAQ,MAAM,eAAe;AAAA,QAC/B;AAAA,MACF;AAAA,MACA,UAAU,eAAe,oBAAoB;AAAA,IAC/C,CAAC;AAAA,EACH;AAEA,MAAIA,UAAS,QAAQ,aAAa,KAAK,OAAO,QAAQ,cAAc,SAAS,UAAU;AACrF,YAAQ,KAAK;AAAA,MACX,KAAK,aAAa,KAAK;AAAA,MACvB,OAAO,QAAQ,cAAc;AAAA,MAC7B,OAAO,CAAC,UAAU;AAChB,YAAIA,UAAS,QAAQ,aAAa,GAAG;AACnC,kBAAQ,cAAc,OAAO;AAAA,QAC/B;AAAA,MACF;AAAA,MACA,UAAU,eAAe,oBAAoB;AAAA,IAC/C,CAAC;AAAA,EACH;AAEA,MAAI,OAAO,QAAQ,eAAe,UAAU;AAC1C,YAAQ,KAAK;AAAA,MACX,KAAK;AAAA,MACL,OAAO,QAAQ;AAAA,MACf,OAAO,CAAC,UAAU;AAChB,gBAAQ,aAAa;AAAA,MACvB;AAAA,MACA,UAAU,eAAe,YAAY;AAAA,IACvC,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,SAAS,yBAAyB,SAAwC;AACxE,MAAI,CAAC,MAAM,QAAQ,QAAQ,OAAO,GAAG;AACnC;AAAA,EACF;AAEA,UAAQ,QAAQ,QAAQ,CAAC,WAAW;AAClC,QAAI,CAACA,UAAS,MAAM,GAAG;AACrB;AAAA,IACF;AAEA,QAAI,OAAO,OAAO,SAAS,UAAU;AACnC,aAAO,OAAO;AAAA,IAChB;AAEA,QAAIA,UAAS,OAAO,KAAK,KAAK,OAAO,OAAO,MAAM,YAAY,UAAU;AACtE,aAAO,MAAM,UAAU;AAAA,IACzB;AAEA,QACEA,UAAS,OAAO,KAAK,KACrBA,UAAS,OAAO,MAAM,aAAa,KACnC,OAAO,OAAO,MAAM,cAAc,cAAc,UAChD;AACA,aAAO,MAAM,cAAc,YAAY;AAAA,IACzC;AAEA,QAAIA,UAAS,OAAO,KAAK,KAAK,MAAM,QAAQ,OAAO,MAAM,UAAU,GAAG;AACpE,aAAO,MAAM,WAAW,QAAQ,CAAC,aAAa;AAC5C,YAAI,CAACA,UAAS,QAAQ,KAAK,CAACA,UAAS,SAAS,QAAQ,GAAG;AACvD;AAAA,QACF;AAEA,YAAI,OAAO,SAAS,SAAS,cAAc,UAAU;AACnD,mBAAS,SAAS,YAAY;AAAA,QAChC;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AACH;AAEA,SAAS,sBACP,SACA,aACA,WACA,OACM;AACN,MAAI,CAAC,MAAM,QAAQ,QAAQ,OAAO,GAAG;AACnC;AAAA,EACF;AAEA,QAAM,SAAS,QAAQ,QAAQ,KAAK,CAAC,MAAM,UAAU;AACnD,QAAI,CAACA,UAAS,IAAI,GAAG;AACnB,aAAO;AAAA,IACT;AAEA,QAAI,OAAO,KAAK,UAAU,UAAU;AAClC,aAAO,KAAK,UAAU;AAAA,IACxB;AAEA,WAAO,UAAU;AAAA,EACnB,CAAC;AAED,MAAI,CAACA,UAAS,MAAM,GAAG;AACrB;AAAA,EACF;AAEA,MAAI,cAAc,QAAQ;AACxB,WAAO,OAAO;AACd;AAAA,EACF;AAEA,MAAI,cAAc,iBAAiB;AACjC,QAAIA,UAAS,OAAO,KAAK,GAAG;AAC1B,aAAO,MAAM,UAAU;AAAA,IACzB;AAEA;AAAA,EACF;AAEA,MAAI,cAAc,iCAAiC;AACjD,QAAIA,UAAS,OAAO,KAAK,KAAKA,UAAS,OAAO,MAAM,aAAa,GAAG;AAClE,aAAO,MAAM,cAAc,YAAY;AAAA,IACzC;AAEA;AAAA,EACF;AAEA,QAAM,gBAAgB,UAAU,MAAM,iDAAiD;AACvF,MAAI,CAAC,eAAe;AAClB;AAAA,EACF;AAEA,QAAM,gBAAgB,OAAO,cAAc,CAAC,CAAC;AAC7C,MAAI,CAACA,UAAS,OAAO,KAAK,KAAK,CAAC,MAAM,QAAQ,OAAO,MAAM,UAAU,GAAG;AACtE;AAAA,EACF;AAEA,QAAM,WAAW,OAAO,MAAM,WAAW,aAAa;AACtD,MAAI,CAACA,UAAS,QAAQ,KAAK,CAACA,UAAS,SAAS,QAAQ,GAAG;AACvD;AAAA,EACF;AAEA,WAAS,SAAS,YAAY;AAChC;AAEA,SAAS,mBAAmB,SAAqD;AAC/E,MAAI,CAAC,MAAM,QAAQ,QAAQ,OAAO,GAAG;AACnC,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,UAA6B,CAAC;AAEpC,UAAQ,QAAQ,QAAQ,CAAC,QAAQ,aAAa;AAC5C,QAAI,CAACA,UAAS,MAAM,GAAG;AACrB;AAAA,IACF;AAEA,UAAM,cAAc,OAAO,OAAO,UAAU,WAAW,OAAO,QAAQ;AACtE,UAAM,iBAAiB,CAAC,cAAyC;AAC/D,YAAM,kBAAkB,eAAe,OAAO;AAC9C,+BAAyB,eAAe;AAExC,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO,CAAC,OAAO,UAAU;AACvB,cAAI,CAACA,UAAS,KAAK,GAAG;AACpB;AAAA,UACF;AAEA,gCAAsB,OAAO,aAAa,WAAW,KAAK;AAAA,QAC5D;AAAA,MACF;AAAA,IACF;AAEA,QAAI,OAAO,OAAO,SAAS,UAAU;AACnC,cAAQ,KAAK;AAAA,QACX,KAAK,UAAU,WAAW;AAAA,QAC1B,OAAO,OAAO;AAAA,QACd,OAAO,CAAC,UAAU;AAChB,iBAAO,OAAO;AAAA,QAChB;AAAA,QACA,UAAU,eAAe,MAAM;AAAA,MACjC,CAAC;AAAA,IACH;AAEA,QAAIA,UAAS,OAAO,KAAK,KAAK,OAAO,OAAO,MAAM,YAAY,UAAU;AACtE,cAAQ,KAAK;AAAA,QACX,KAAK,UAAU,WAAW;AAAA,QAC1B,OAAO,OAAO,MAAM;AAAA,QACpB,OAAO,CAAC,UAAU;AAChB,cAAIA,UAAS,OAAO,KAAK,GAAG;AAC1B,mBAAO,MAAM,UAAU;AAAA,UACzB;AAAA,QACF;AAAA,QACA,UAAU,eAAe,eAAe;AAAA,MAC1C,CAAC;AAAA,IACH;AAEA,QACEA,UAAS,OAAO,KAAK,KACrBA,UAAS,OAAO,MAAM,aAAa,KACnC,OAAO,OAAO,MAAM,cAAc,cAAc,UAChD;AACA,cAAQ,KAAK;AAAA,QACX,KAAK,UAAU,WAAW;AAAA,QAC1B,OAAO,OAAO,MAAM,cAAc;AAAA,QAClC,OAAO,CAAC,UAAU;AAChB,cAAIA,UAAS,OAAO,KAAK,KAAKA,UAAS,OAAO,MAAM,aAAa,GAAG;AAClE,mBAAO,MAAM,cAAc,YAAY;AAAA,UACzC;AAAA,QACF;AAAA,QACA,UAAU,eAAe,+BAA+B;AAAA,MAC1D,CAAC;AAAA,IACH;AAEA,QAAIA,UAAS,OAAO,KAAK,KAAK,MAAM,QAAQ,OAAO,MAAM,UAAU,GAAG;AACpE,aAAO,MAAM,WAAW,QAAQ,CAAC,UAAU,kBAAkB;AAC3D,YAAI,CAACA,UAAS,QAAQ,KAAK,CAACA,UAAS,SAAS,QAAQ,GAAG;AACvD;AAAA,QACF;AAEA,YAAI,OAAO,SAAS,SAAS,cAAc,UAAU;AACnD;AAAA,QACF;AAEA,gBAAQ,KAAK;AAAA,UACX,KAAK,UAAU,WAAW,qBAAqB,aAAa;AAAA,UAC5D,OAAO,SAAS,SAAS;AAAA,UACzB,OAAO,CAAC,UAAU;AAChB,gBACEA,UAAS,OAAO,KAAK,KACrB,MAAM,QAAQ,OAAO,MAAM,UAAU,KACrCA,UAAS,OAAO,MAAM,WAAW,aAAa,CAAC,KAC/CA,UAAS,OAAO,MAAM,WAAW,aAAa,EAAE,QAAQ,GACxD;AACA,qBAAO,MAAM,WAAW,aAAa,EAAE,SAAS,YAAY;AAAA,YAC9D;AAAA,UACF;AAAA,UACA,UAAU,eAAe,oBAAoB,aAAa,qBAAqB;AAAA,QACjF,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAEA,IAAM,iBAAN,MAAqB;AAAA,EAKnB,YACmB,UACA,cACjB;AAFiB;AACA;AAAA,EAChB;AAAA,EAPK,SAAS;AAAA,EACA,YAAY,oBAAI,IAA8B;AAAA,EAC9C,YAAY,oBAAI,IAA+B;AAAA,EAOhE,KAAK,OAAuB;AAC1B,UAAM,QAAQ,KAAK,SAAS;AAC5B,UAAM,QAAQ,MAAM,MAAM,SAAS;AACnC,UAAM,WAAW,MAAM,IAAI;AAC3B,SAAK,SAAS,YAAY;AAE1B,QAAI,SAAS;AAEb,aAAS,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS,GAAG;AACpD,YAAM,OAAO,MAAM,KAAK,KAAK;AAC7B,YAAM,YAAY,MAAM,QAAQ,CAAC,KAAK;AACtC,gBAAU,KAAK,cAAc,IAAI,IAAI;AAAA,IACvC;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,QAAgB;AACd,QAAI,SAAS;AAEb,QAAI,KAAK,OAAO,SAAS,GAAG;AAC1B,gBAAU,KAAK,cAAc,KAAK,MAAM;AACxC,WAAK,SAAS;AAAA,IAChB;AAEA,eAAW,CAAC,KAAK,QAAQ,KAAK,KAAK,UAAU,QAAQ,GAAG;AACtD,YAAM,YAAY,SAAS,MAAM;AACjC,UAAI,UAAU,WAAW,GAAG;AAC1B;AAAA,MACF;AAEA,YAAM,WAAW,KAAK,UAAU,IAAI,GAAG;AACvC,UAAI,CAAC,UAAU;AACb;AAAA,MACF;AAEA,YAAM,UAAU,eAAe,SAAS,OAAO;AAC/C,eAAS,MAAM,SAAS,SAAS;AACjC,gBAAU,SAAS,KAAK,UAAU,OAAO,CAAC;AAAA;AAAA;AAAA,IAC5C;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,UAAU,SAAqD;AACrE,QAAI,KAAK,aAAa,aAAa;AACjC,aAAO,sBAAsB,OAAO;AAAA,IACtC;AAEA,WAAO,mBAAmB,OAAO;AAAA,EACnC;AAAA,EAEQ,YAAY,KAA+B;AACjD,UAAM,WAAW,KAAK,UAAU,IAAI,GAAG;AACvC,QAAI,UAAU;AACZ,aAAO;AAAA,IACT;AAEA,UAAM,UAAU,IAAI,iBAAiB,KAAK,YAAY;AACtD,SAAK,UAAU,IAAI,KAAK,OAAO;AAC/B,WAAO;AAAA,EACT;AAAA,EAEQ,cAAc,MAAsB;AAC1C,QAAI,CAAC,KAAK,WAAW,OAAO,GAAG;AAC7B,aAAO;AAAA,IACT;AAEA,UAAM,SAAS,KAAK,WAAW,QAAQ,IAAI,WAAW;AACtD,UAAM,UAAU,KAAK,MAAM,OAAO,MAAM;AAExC,QAAI,YAAY,UAAU;AACxB,aAAO;AAAA,IACT;AAEA,QAAI;AACF,YAAM,SAAS,KAAK,MAAM,OAAO;AACjC,UAAI,CAACA,UAAS,MAAM,GAAG;AACrB,eAAO;AAAA,MACT;AAEA,YAAM,SAAS,KAAK,UAAU,MAAM;AACpC,UAAI,OAAO,WAAW,GAAG;AACvB,eAAO;AAAA,MACT;AAEA,aAAO,QAAQ,CAAC,UAAU;AACxB,cAAM,WAAW,KAAK,YAAY,MAAM,GAAG;AAC3C,cAAM,WAAW,SAAS,KAAK,MAAM,KAAK;AAC1C,cAAM,MAAM,QAAQ;AACpB,aAAK,UAAU,IAAI,MAAM,KAAK,MAAM,QAAQ;AAAA,MAC9C,CAAC;AAED,aAAO,GAAG,MAAM,GAAG,KAAK,UAAU,MAAM,CAAC;AAAA,IAC3C,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAEA,eAAe,gBAAgB,SAA2C;AACxE,SAAO,IAAI,QAAQ,CAACC,UAAS,WAAW;AACtC,UAAM,SAAmB,CAAC;AAE1B,YAAQ,GAAG,QAAQ,CAAC,UAA2B;AAC7C,aAAO,KAAK,OAAO,SAAS,KAAK,IAAI,QAAQ,OAAO,KAAK,KAAK,CAAC;AAAA,IACjE,CAAC;AAED,YAAQ,KAAK,OAAO,MAAM;AACxB,MAAAA,SAAQ,OAAO,OAAO,MAAM,CAAC;AAAA,IAC/B,CAAC;AACD,YAAQ,KAAK,SAAS,MAAM;AAC5B,YAAQ,KAAK,WAAW,MAAM;AAC5B,aAAO,IAAI,MAAM,4BAA4B,CAAC;AAAA,IAChD,CAAC;AAAA,EACH,CAAC;AACH;AAEA,SAAS,eAAe,UAA0B,YAAoB,SAAuB;AAC3F,QAAM,OAAO,KAAK,UAAU,EAAE,OAAO,QAAQ,CAAC;AAE9C,WAAS,UAAU,YAAY;AAAA,IAC7B,kBAAkB,OAAO,OAAO,WAAW,IAAI,CAAC;AAAA,IAChD,gBAAgB;AAAA,EAClB,CAAC;AACD,WAAS,IAAI,IAAI;AACnB;AAEO,IAAM,cAAN,MAAkB;AAAA,EAcvB,YAA6B,SAAuB;AAAvB;AAC3B,SAAK,aAAa,QAAQ,cAAc,QAAQ,IAAI;AACpD,SAAK,kBAAkB,QAAQ;AAC/B,SAAK,OAAO,QAAQ,QAAQ;AAC5B,SAAK,kBAAkB,QAAQ,mBAAmB;AAClD,SAAK,OAAO,QAAQ,QAAQ;AAC5B,SAAK,aAAa,QAAQ,cAAc;AACxC,SAAK,UAAU,yBAAyB,OAAO;AAC/C,SAAK,YAAY,QAAQ,aAAa;AAAA,EACxC;AAAA,EAtBQ,aAA4B;AAAA,EACnB,uBAAuB,oBAAI,IAAY;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,8BAA8B,IAAI,4BAA4B;AAAA,EACvE,SAAwB;AAAA,EACf;AAAA,EACA;AAAA,EAajB,aAAqB;AACnB,UAAM,cAAc,KAAK,cAAc,KAAK;AAC5C,WAAO,UAAU,KAAK,UAAU,IAAI,WAAW;AAAA,EACjD;AAAA,EAEA,MAAM,QAAyB;AAC7B,QAAI,KAAK,UAAU,KAAK,eAAe,MAAM;AAC3C,aAAO,KAAK;AAAA,IACd;AAEA,QAAI,WAAW,KAAK;AACpB,QAAI,oBAAoB,KAAK;AAE7B,WAAO,oBAAoB,GAAG;AAC5B,YAAM,SAAS,aAAa,CAAC,SAAS,aAAa;AACjD,aAAK,KAAK,cAAc,SAAS,QAAQ;AAAA,MAC3C,CAAC;AACD,aAAO,GAAG,WAAW,CAAC,SAAS,QAAQ,SAAS;AAC9C,aAAK,KAAK,cAAc,SAAS,QAAQ,IAAI;AAAA,MAC/C,CAAC;AAED,UAAI;AACF,cAAM,gBAAgB,MAAM,IAAI,QAAgB,CAACA,UAAS,WAAW;AACnE,gBAAM,UAAU,CAAC,UAAqC;AACpD,mBAAO,eAAe,aAAa,WAAW;AAC9C,mBAAO,KAAK;AAAA,UACd;AACA,gBAAM,cAAc,MAAM;AACxB,mBAAO,eAAe,SAAS,OAAO;AACtC,kBAAM,UAAU,OAAO,QAAQ;AAC/B,YAAAA,SAAQ,SAAS,QAAQ,QAAQ;AAAA,UACnC;AAEA,iBAAO,KAAK,SAAS,OAAO;AAC5B,iBAAO,KAAK,aAAa,WAAW;AACpC,iBAAO,OAAO,UAAU,KAAK,IAAI;AAAA,QACnC,CAAC;AAED,aAAK,SAAS;AACd,aAAK,aAAa;AAClB,eAAO;AAAA,MACT,SAAS,OAAO;AACd,cAAM,IAAI,QAAc,CAACA,aAAY;AACnC,iBAAO,MAAM,MAAMA,SAAQ,CAAC;AAAA,QAC9B,CAAC;AAED,cAAM,OAAO,iBAAiB,SAAS,UAAU,QAAQ,MAAM,OAAO;AACtE,YAAI,SAAS,cAAc;AACzB,gBAAM;AAAA,QACR;AAEA,6BAAqB;AACrB,oBAAY;AAAA,MACd;AAAA,IACF;AAEA,UAAM,IAAI,MAAM,+BAA+B,KAAK,eAAe,gBAAgB;AAAA,EACrF;AAAA,EAEA,MAAM,OAAsB;AAC1B,QAAI,CAAC,KAAK,QAAQ;AAChB;AAAA,IACF;AAEA,UAAM,SAAS,KAAK;AACpB,SAAK,SAAS;AACd,SAAK,aAAa;AAElB,eAAW,UAAU,KAAK,sBAAsB;AAC9C,aAAO,QAAQ;AAAA,IACjB;AACA,SAAK,qBAAqB,MAAM;AAChC,SAAK,4BAA4B,MAAM;AAEvC,UAAM,IAAI,QAAc,CAACA,UAAS,WAAW;AAC3C,aAAO,MAAM,CAAC,UAAU;AACtB,YAAI,OAAO;AACT,iBAAO,KAAK;AACZ;AAAA,QACF;AAEA,QAAAA,SAAQ;AAAA,MACV,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,cACZ,SACA,cACA,MACe;AACf,UAAM,OAAO,qBAAqB,QAAQ,OAAO,GAAG;AAEpD,QAAI,SAAS,WAAW;AACtB,WAAK,iBAAiB,cAAc,KAAK,wCAAwC;AACjF,mBAAa,IAAI;AACjB;AAAA,IACF;AAEA,QAAI;AACJ,QAAI;AACF,eAAS,gBAAgB,SAAS,KAAK,SAAS,KAAK,eAAe;AAAA,IACtE,SAAS,OAAO;AACd,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AACzD,WAAK,iBAAiB,cAAc,KAAK,OAAO;AAChD,mBAAa,IAAI;AACjB;AAAA,IACF;AAEA,UAAM,iBAAiB,OAAO,IAAI,aAAa,WAAW,qBAAqB;AAC/E,UAAM,UAAU,8BAA8B,QAAQ,OAAO;AAC7D,YAAQ,OAAO,OAAO,IAAI;AAE1B,UAAM,iBAAiC;AAAA,MACrC;AAAA,MACA,UAAU,OAAO,IAAI;AAAA,MACrB,QAAQ,QAAQ,UAAU;AAAA,MAC1B,MAAM,GAAG,OAAO,IAAI,QAAQ,GAAG,OAAO,IAAI,MAAM;AAAA,MAChD,MAAM,OAAO,IAAI,OAAO,OAAO,OAAO,IAAI,IAAI,IAAI;AAAA,MAClD,UAAU,OAAO,IAAI;AAAA,IACvB;AAEA,iBAAa,KAAK,SAAS,MAAM,MAAS;AAE1C,UAAM,IAAI,QAAc,CAACA,aAAY;AACnC,UAAI,UAAU;AACd,YAAM,kBAAkB,eAAe,cAAc;AAErD,sBAAgB,WAAW,KAAK,WAAW,MAAM;AAC/C,wBAAgB,QAAQ,IAAI,MAAM,oCAAoC,KAAK,SAAS,IAAI,CAAC;AAAA,MAC3F,CAAC;AAED,sBAAgB,KAAK,WAAW,CAAC,kBAAkB,gBAAgB,iBAAiB;AAClF,YAAI,SAAS;AACX;AAAA,QACF;AAEA,kBAAU;AACV,aAAK,mBAAmB,YAAY;AACpC,aAAK,mBAAmB,cAAc;AACtC,6BAAqB;AAAA,UACnB,SAAS,YAAY,iBAAiB,SAAS,EAAE,wBAAwB,KAAK,CAAC;AAAA,UAC/E,QAAQ;AAAA,UACR,YAAY,iBAAiB,cAAc;AAAA,UAC3C,eACE,iBAAiB,iBAAiB,aAAa,iBAAiB,cAAc,GAAG,KAAK;AAAA,UACxF,SAAS,iBAAiB;AAAA,QAC5B,CAAC;AAED,uBAAe;AAAA,UACb,YAAY;AAAA,UACZ;AAAA,UACA,8BAA8B,IAAI,IAAI,KAAK,QAAQ,MAAM,sBAAsB,CAAC;AAAA,UAChF;AAAA,UACA;AAAA,UACA,8BAA8B,IAAI,IAAI,KAAK,QAAQ,MAAM,sBAAsB,CAAC;AAAA,QAClF,CAAC;AACD,QAAAA,SAAQ;AAAA,MACV,CAAC;AAED,sBAAgB,KAAK,YAAY,CAAC,qBAAqB;AACrD,YAAI,SAAS;AACX;AAAA,QACF;AAEA,kBAAU;AACV,aAAK,KAAK,+BAA+B,kBAAkB,YAAY,EACpE,MAAM,CAAC,UAAU;AAChB,cAAI,CAAC,aAAa,WAAW;AAC3B,yBAAa,QAAQ,iBAAiB,QAAQ,QAAQ,MAAS;AAAA,UACjE;AAAA,QACF,CAAC,EACA,QAAQA,QAAO;AAAA,MACpB,CAAC;AAED,sBAAgB,KAAK,SAAS,CAAC,UAAU;AACvC,YAAI,SAAS;AACX;AAAA,QACF;AAEA,kBAAU;AACV,cAAM,YAAY,MAAM,QAAQ,SAAS,WAAW;AACpD,aAAK,iBAAiB,cAAc,YAAY,MAAM,KAAK,MAAM,OAAO;AACxE,qBAAa,IAAI;AACjB,QAAAA,SAAQ;AAAA,MACV,CAAC;AAED,sBAAgB,IAAI;AAAA,IACtB,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,cAAc,SAA0B,UAAyC;AAC7F,UAAM,OAAO,qBAAqB,QAAQ,OAAO,GAAG;AAEpD,QAAI,SAAS,WAAW;AACtB,YAAM,OAAO,KAAK,UAAU,EAAE,IAAI,KAAK,CAAC;AACxC,eAAS,UAAU,KAAK;AAAA,QACtB,kBAAkB,OAAO,OAAO,WAAW,IAAI,CAAC;AAAA,QAChD,gBAAgB;AAAA,MAClB,CAAC;AACD,eAAS,IAAI,IAAI;AACjB;AAAA,IACF;AAEA,QAAI;AACJ,QAAI;AACF,eAAS,gBAAgB,SAAS,KAAK,SAAS,KAAK,eAAe;AAAA,IACtE,SAAS,OAAO;AACd,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AACzD,qBAAe,UAAU,KAAK,OAAO;AACrC;AAAA,IACF;AAEA,QAAI,OAAO,aAAa,UAAU;AAChC,YAAM,cAAc,KAAK,iCAAiC,SAAS,UAAU,IAAI;AACjF,UAAI,aAAa;AACf;AAAA,MACF;AAAA,IACF;AAEA,QAAI;AACF,YAAM,eAAe,MAAM,gBAAgB,OAAO;AAClD,YAAM,cACJ,aAAa,SAAS,KAAK,uBAAuB,QAAQ,OAAO,IAC7D,KAAK,uBAAuB,YAAY,IACxC;AAEN,UACE,OAAO,aAAa,YACpB,QAAQ,WAAW,UACnB,6BAA6B,IAAI,GACjC;AACA,cAAM,KAAK,oCAAoC,SAAS,UAAU,QAAQ,WAAW;AACrF;AAAA,MACF;AAEA,YAAM,KAAK,eAAe,SAAS,UAAU,QAAQ,WAAW;AAAA,IAClE,SAAS,OAAO;AACd,UAAI,CAAC,SAAS,aAAa;AACzB,cAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AACzD,uBAAe,UAAU,KAAK,OAAO;AAAA,MACvC,WAAW,CAAC,SAAS,eAAe;AAClC,iBAAS,QAAQ,iBAAiB,QAAQ,QAAQ,MAAS;AAAA,MAC7D;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,iCACN,SACA,UACA,MACS;AACT,QAAI,QAAQ,WAAW,OAAO;AAC5B,aAAO;AAAA,IACT;AAEA,QAAI,6BAA6B,IAAI,GAAG;AACtC,YAAMC,QAAO,uCAAuC;AACpD,eAAS,UAAU,KAAK;AAAA,QACtB,kBAAkB,OAAO,OAAO,WAAWA,KAAI,CAAC;AAAA,QAChD,gBAAgB;AAAA,MAClB,CAAC;AACD,eAAS,IAAIA,KAAI;AACjB,aAAO;AAAA,IACT;AAEA,UAAM,aAAa,oCAAoC,IAAI;AAC3D,QAAI,CAAC,YAAY;AACf,aAAO;AAAA,IACT;AAEA,UAAM,iBAAiB,KAAK,4BAA4B,YAAY,UAAU;AAC9E,QAAI,CAAC,gBAAgB;AACnB,qBAAe,UAAU,KAAK,sCAAsC,UAAU,EAAE;AAChF,aAAO;AAAA,IACT;AAEA,UAAM,OAAO,KAAK,UAAU,cAAc;AAC1C,aAAS,UAAU,KAAK;AAAA,MACtB,kBAAkB,OAAO,OAAO,WAAW,IAAI,CAAC;AAAA,MAChD,gBAAgB;AAAA,IAClB,CAAC;AACD,aAAS,IAAI,IAAI;AACjB,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,oCACZ,eACA,gBACA,QACA,MACe;AACf,UAAM,iBACJ,OAAO,IAAI,aAAa,WAAW,qBAAqB;AAC1D,UAAM,gBAAgB,qBAAqB,cAAc,SAAS,OAAO,KAAK,IAAI;AAElF,UAAM,IAAI,QAAc,CAACD,UAAS,WAAW;AAC3C,UAAI,UAAU;AACd,YAAM,kBAAkB;AAAA,QACtB;AAAA,UACE,SAAS;AAAA,UACT,UAAU,OAAO,IAAI;AAAA,UACrB,QAAQ,cAAc;AAAA,UACtB,MAAM,GAAG,OAAO,IAAI,QAAQ,GAAG,OAAO,IAAI,MAAM;AAAA,UAChD,MAAM,OAAO,IAAI,OAAO,OAAO,OAAO,IAAI,IAAI,IAAI;AAAA,UAClD,UAAU,OAAO,IAAI;AAAA,QACvB;AAAA,QACA,CAAC,qBAAqB;AACpB,gBAAM,aAAa,iBAAiB,cAAc;AAClD,gBAAM,iBACJ,cAAc,QAAQ,eAAe,OAAO,eAAe,OAAO,eAAe;AAEnF,cAAI,CAAC,gBAAgB;AACnB,iBAAK,KAAK,gBAAgB,OAAO,UAAU,kBAAkB,cAAc,EACxE,KAAK,MAAM;AACV,wBAAU;AACV,cAAAA,SAAQ;AAAA,YACV,CAAC,EACA,MAAM,CAAC,UAAU;AAChB,wBAAU;AACV,qBAAO,KAAK;AAAA,YACd,CAAC;AACH;AAAA,UACF;AAEA,2BAAiB,OAAO;AACxB,eAAK,KAAK;AAAA,YACR;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF,EACG,KAAK,MAAM;AACV,sBAAU;AACV,YAAAA,SAAQ;AAAA,UACV,CAAC,EACA,MAAM,CAAC,UAAU;AAChB,sBAAU;AACV,mBAAO,KAAK;AAAA,UACd,CAAC;AAAA,QACL;AAAA,MACF;AAEA,sBAAgB,WAAW,KAAK,WAAW,MAAM;AAC/C,wBAAgB,QAAQ,IAAI,MAAM,oCAAoC,KAAK,SAAS,IAAI,CAAC;AAAA,MAC3F,CAAC;AAED,sBAAgB,KAAK,SAAS,CAAC,UAAU;AACvC,YAAI,SAAS;AACX;AAAA,QACF;AAEA,cAAM,YAAY,MAAM,QAAQ,SAAS,WAAW;AACpD,YAAI,CAAC,eAAe,aAAa;AAC/B,yBAAe,gBAAgB,YAAY,MAAM,KAAK,MAAM,OAAO;AAAA,QACrE;AAEA,eAAO,KAAK;AAAA,MACd,CAAC;AAED,sBAAgB,MAAM,IAAI;AAC1B,sBAAgB,IAAI;AAAA,IACtB,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,+CACZ,eACA,gBACA,QACA,MACe;AACf,UAAM,aAAa,0BAA0B,KAAK,SAAS,MAAM,GAAG,KAAK,2BAA2B;AACpG,UAAM,cAAc,IAAI,IAAI,OAAO,IAAI,SAAS,CAAC;AACjD,gBAAY,WAAW,YAAY,SAAS,QAAQ,gBAAgB,mBAAmB;AACvF,gBAAY,SAAS;AAErB,UAAM,iBACJ,YAAY,aAAa,WAAW,qBAAqB;AAC3D,UAAM,qBAAqB,KAAK,UAAU,WAAW,WAAW;AAChE,UAAM,eAAe,OAAO,KAAK,oBAAoB,MAAM;AAC3D,UAAM,UAAU;AAAA,MACd,qBAAqB,cAAc,SAAS,aAAa,YAAY;AAAA,IACvE;AACA,UAAM,iBAAmE,KAAK,aAC1E;AAAA,MACE,eAAe,2BAA2B,cAAc,OAAO;AAAA,MAC/D,YAAY,cAAc,OAAO;AAAA,MACjC,mBAAmB,oBAAoB,KAAK,SAAS,MAAM,CAAC;AAAA,MAC5D,uBAAuB,oBAAoB,kBAAkB;AAAA,MAC7D,0BAA0B,2BAA2B,OAAO;AAAA,MAC5D,uBAAuB,YAAY,SAAS;AAAA,IAC9C,IACA;AAEJ,UAAM,IAAI,QAAc,CAACA,UAAS,WAAW;AAC3C,UAAI,UAAU;AACd,YAAM,kBAAkB;AAAA,QACtB;AAAA,UACE;AAAA,UACA,UAAU,YAAY;AAAA,UACtB,QAAQ;AAAA,UACR,MAAM,YAAY;AAAA,UAClB,MAAM,YAAY,OAAO,OAAO,YAAY,IAAI,IAAI;AAAA,UACpD,UAAU,YAAY;AAAA,QACxB;AAAA,QACA,CAAC,qBAAqB;AACpB,eAAK,KAAK;AAAA,YACR;AAAA,YACA;AAAA,YACA,WAAW;AAAA,YACX,OAAO,WAAW,YAAY,UAAU,WAAW,WAAW,YAAY,QAAQ;AAAA,YAClF;AAAA,UACF,EACG,KAAK,MAAM;AACV,sBAAU;AACV,YAAAA,SAAQ;AAAA,UACV,CAAC,EACA,MAAM,CAAC,UAAU;AAChB,sBAAU;AACV,mBAAO,KAAK;AAAA,UACd,CAAC;AAAA,QACL;AAAA,MACF;AAEA,sBAAgB,WAAW,KAAK,WAAW,MAAM;AAC/C,wBAAgB,QAAQ,IAAI,MAAM,oCAAoC,KAAK,SAAS,IAAI,CAAC;AAAA,MAC3F,CAAC;AAED,sBAAgB,KAAK,SAAS,CAAC,UAAU;AACvC,YAAI,SAAS;AACX;AAAA,QACF;AAEA,cAAM,YAAY,MAAM,QAAQ,SAAS,WAAW;AACpD,YAAI,CAAC,eAAe,aAAa;AAC/B,yBAAe,gBAAgB,YAAY,MAAM,KAAK,MAAM,OAAO;AAAA,QACrE;AAEA,eAAO,KAAK;AAAA,MACd,CAAC;AAED,sBAAgB,MAAM,YAAY;AAClC,sBAAgB,IAAI;AAAA,IACtB,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,sCACZ,kBACA,gBACA,UACA,OACA,gBACe;AACf,UAAM,qBAAqB,iBAAiB,cAAc;AAC1D,UAAM,gBAAgB,IAAI,IAAI,KAAK,QAAQ,MAAM,sBAAsB,CAAC;AAExE,QAAI,cAAc,iBAAiB,OAAO,GAAG;AAC3C,YAAM,UAAU;AAAA,QACd;AAAA,UACE,GAAG,iBAAiB;AAAA,UACpB,gBAAgB;AAAA,QAClB;AAAA,MACF;AACA,qBAAe,UAAU,oBAAoB,OAAO;AAEpD,YAAM,qBAAqB,IAAI,eAAe,UAAU,aAAa;AACrE,YAAM,cAAc,IAAI,qCAAqC,UAAU,KAAK;AAC5E,qBAAe,MAAM,YAAY,MAAM,CAAC;AACxC,YAAM,YAAsB,CAAC;AAE7B,YAAM,IAAI,QAAc,CAACA,UAAS,WAAW;AAC3C,yBAAiB,GAAG,QAAQ,CAAC,UAA2B;AACtD,gBAAM,WAAW,OAAO,SAAS,KAAK,IAAI,MAAM,SAAS,MAAM,IAAI;AACnE,oBAAU,KAAK,QAAQ;AACvB,gBAAM,gBAAgB,mBAAmB,KAAK,QAAQ;AACtD,gBAAM,SAAS,cAAc,SAAS,IAAI,YAAY,KAAK,aAAa,IAAI;AAC5E,cAAI,OAAO,SAAS,GAAG;AACrB,2BAAe,MAAM,MAAM;AAAA,UAC7B;AAAA,QACF,CAAC;AAED,yBAAiB,KAAK,OAAO,MAAM;AACjC,gBAAM,YAAY;AAChB,kBAAM,eAAe,mBAAmB,MAAM;AAC9C,gBAAI,aAAa,SAAS,GAAG;AAC3B,oBAAM,iBAAiB,YAAY,KAAK,YAAY;AACpD,kBAAI,eAAe,SAAS,GAAG;AAC7B,+BAAe,MAAM,cAAc;AAAA,cACrC;AAAA,YACF;AACA,kBAAM,YAAY,YAAY,OAAO;AACrC,gBAAI,gBAAgB;AAClB,oBAAM,KAAK,mCAAmC,gBAAgB;AAAA,gBAC5D,cAAc,UAAU,KAAK,EAAE;AAAA,gBAC/B,iBAAiB,2BAA2B,iBAAiB,OAAO;AAAA,gBACpE,oBAAoB;AAAA,cACtB,CAAC;AAAA,YACH;AAEA,gBAAI,UAAU,OAAO,SAAS,GAAG;AAC/B,6BAAe,MAAM,UAAU,MAAM;AAAA,YACvC;AACA,iBAAK,4BAA4B,IAAI,UAAU,YAAY;AAAA,cACzD,UAAU,UAAU;AAAA,cACpB,UAAU,UAAU;AAAA,YACtB,CAAC;AACD,2BAAe,IAAI;AACnB,YAAAA,SAAQ;AAAA,UACV,GAAG,EAAE,MAAM,MAAM;AAAA,QACnB,CAAC;AACD,yBAAiB,KAAK,SAAS,MAAM;AAAA,MACvC,CAAC;AACD;AAAA,IACF;AAEA,UAAM,SAAmB,CAAC;AAC1B,UAAM,IAAI,QAAc,CAACA,UAAS,WAAW;AAC3C,uBAAiB,GAAG,QAAQ,CAAC,UAA2B;AACtD,eAAO,KAAK,OAAO,SAAS,KAAK,IAAI,QAAQ,OAAO,KAAK,KAAK,CAAC;AAAA,MACjE,CAAC;AACD,uBAAiB,KAAK,OAAOA,QAAO;AACpC,uBAAiB,KAAK,SAAS,MAAM;AAAA,IACvC,CAAC;AAED,UAAM,cAAc,OAAO,OAAO,MAAM,EAAE,SAAS,MAAM;AACzD,QAAI,gBAAgB;AAClB,YAAM,KAAK,mCAAmC,gBAAgB;AAAA,QAC5D,cAAc;AAAA,QACd,iBAAiB,2BAA2B,iBAAiB,OAAO;AAAA,QACpE,oBAAoB;AAAA,MACtB,CAAC;AAAA,IACH;AAEA,UAAM,mBAAmB;AAAA,MACvB,OAAO,KAAK,aAAa,MAAM;AAAA,MAC/B;AAAA,IACF,EAAE,SAAS,MAAM;AAEjB,QAAI,sBAAsB,KAAK;AAC7B,qBAAe,UAAU,oBAAoB;AAAA,QAC3C,kBAAkB,OAAO,OAAO,WAAW,gBAAgB,CAAC;AAAA,QAC5D,gBACE,oBAAoB,iBAAiB,QAAQ,cAAc,CAAC,KAC5D;AAAA,MACJ,CAAC;AACD,qBAAe,IAAI,gBAAgB;AACnC;AAAA,IACF;AAEA,UAAM,aAAa,uCAAuC,kBAAkB,QAAQ;AACpF,SAAK,4BAA4B,IAAI,WAAW,YAAY;AAAA,MAC1D,UAAU,WAAW;AAAA,MACrB,UAAU,WAAW;AAAA,IACvB,CAAC;AACD,mBAAe,UAAU,oBAAoB;AAAA,MAC3C,kBAAkB,OAAO,OAAO,WAAW,WAAW,QAAQ,CAAC;AAAA,MAC/D,gBAAgB;AAAA,IAClB,CAAC;AACD,mBAAe,IAAI,WAAW,QAAQ;AAAA,EACxC;AAAA,EAEA,MAAc,+BACZ,kBACA,cACe;AACf,UAAM,SAAmB,CAAC;AAC1B,UAAM,IAAI,QAAc,CAACA,UAAS,WAAW;AAC3C,uBAAiB,GAAG,QAAQ,CAAC,UAA2B;AACtD,eAAO,KAAK,OAAO,SAAS,KAAK,IAAI,QAAQ,OAAO,KAAK,KAAK,CAAC;AAAA,MACjE,CAAC;AACD,uBAAiB,KAAK,OAAOA,QAAO;AACpC,uBAAiB,KAAK,SAAS,MAAM;AAAA,IACvC,CAAC;AAED,UAAM,gBAAgB,IAAI,IAAI,KAAK,QAAQ,MAAM,sBAAsB,CAAC;AACxE,UAAM,OAAO,uBAAuB,iBAAiB,OAAO,IACxD,0BAA0B,OAAO,OAAO,MAAM,GAAG,aAAa,IAC9D,OAAO,OAAO,MAAM;AACxB,UAAM,UAAU,mBAAmB,iBAAiB,SAAS,KAAK,MAAM;AACxE,yBAAqB;AAAA,MACnB;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,MACR,YAAY,iBAAiB,cAAc;AAAA,MAC3C,eAAe,iBAAiB,iBAAiB;AAAA,MACjD,SAAS,iBAAiB;AAAA,IAC5B,CAAC;AACD,iBAAa,IAAI;AAAA,EACnB;AAAA,EAEQ,iBAAiB,QAAgB,YAAoB,SAAuB;AAClF,UAAM,OAAO,OAAO,KAAK,KAAK,UAAU,EAAE,OAAO,QAAQ,CAAC,GAAG,MAAM;AACnE,yBAAqB;AAAA,MACnB;AAAA,MACA,SAAS;AAAA,QACP,kBAAkB,OAAO,KAAK,MAAM;AAAA,QACpC,gBAAgB;AAAA,MAClB;AAAA,MACA;AAAA,MACA;AAAA,MACA,eACE,eAAe,MAAM,gBAAgB,eAAe,MAAM,oBAAoB;AAAA,IAClF,CAAC;AAAA,EACH;AAAA,EAEQ,mBAAmB,QAAsB;AAC/C,SAAK,qBAAqB,IAAI,MAAM;AACpC,WAAO,KAAK,SAAS,MAAM;AACzB,WAAK,qBAAqB,OAAO,MAAM;AAAA,IACzC,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,eACZ,eACA,gBACA,QACA,MACe;AACf,UAAM,iBAAiB,OAAO,IAAI,aAAa,WAAW,qBAAqB;AAC/E,UAAM,UAAU,qBAAqB,cAAc,SAAS,OAAO,KAAK,IAAI;AAE5E,UAAM,iBAAiC;AAAA,MACrC;AAAA,MACA,UAAU,OAAO,IAAI;AAAA,MACrB,QAAQ,cAAc;AAAA,MACtB,MAAM,GAAG,OAAO,IAAI,QAAQ,GAAG,OAAO,IAAI,MAAM;AAAA,MAChD,MAAM,OAAO,IAAI,OAAO,OAAO,OAAO,IAAI,IAAI,IAAI;AAAA,MAClD,UAAU,OAAO,IAAI;AAAA,IACvB;AAEA,UAAM,IAAI,QAAc,CAACA,UAAS,WAAW;AAC3C,UAAI,UAAU;AACd,YAAM,kBAAkB,eAAe,gBAAgB,CAAC,qBAAqB;AAC3E,cAAM,gBAAgB,MAAM;AAC1B,cAAI,CAAC,eAAe,iBAAiB,CAAC,iBAAiB,WAAW;AAChE,6BAAiB,QAAQ;AAAA,UAC3B;AAAA,QACF;AAEA,sBAAc,KAAK,WAAW,aAAa;AAC3C,uBAAe,KAAK,SAAS,aAAa;AAE1C,aAAK,KAAK,gBAAgB,OAAO,UAAU,kBAAkB,cAAc,EACxE,KAAK,MAAM;AACV,oBAAU;AACV,UAAAA,SAAQ;AAAA,QACV,CAAC,EACA,MAAM,CAAC,UAAU;AAChB,oBAAU;AACV,iBAAO,KAAK;AAAA,QACd,CAAC;AAAA,MACL,CAAC;AAED,sBAAgB,WAAW,KAAK,WAAW,MAAM;AAC/C,wBAAgB,QAAQ,IAAI,MAAM,oCAAoC,KAAK,SAAS,IAAI,CAAC;AAAA,MAC3F,CAAC;AAED,sBAAgB,KAAK,SAAS,CAAC,UAAU;AACvC,YAAI,SAAS;AACX;AAAA,QACF;AAEA,cAAM,YAAY,MAAM,QAAQ,SAAS,WAAW;AACpD,YAAI,CAAC,eAAe,aAAa;AAC/B,yBAAe,gBAAgB,YAAY,MAAM,KAAK,MAAM,OAAO;AAAA,QACrE;AAEA,eAAO,KAAK;AAAA,MACd,CAAC;AAED,UAAI,KAAK,SAAS,GAAG;AACnB,wBAAgB,MAAM,IAAI;AAAA,MAC5B;AAEA,sBAAgB,IAAI;AAAA,IACtB,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,gBACZ,UACA,kBACA,gBACe;AACf,UAAM,gBAAgB,IAAI,IAAI,KAAK,QAAQ,MAAM,sBAAsB,CAAC;AAExE,QAAI,cAAc,iBAAiB,OAAO,GAAG;AAC3C,YAAME,WAAU,mBAAmB,iBAAiB,OAAO;AAC3D,qBAAe,UAAU,iBAAiB,cAAc,KAAKA,QAAO;AAEpE,YAAM,cAAc,IAAI,eAAe,UAAU,aAAa;AAC9D,YAAM,IAAI,QAAc,CAACF,UAAS,WAAW;AAC3C,yBAAiB,GAAG,QAAQ,CAAC,UAA2B;AACtD,gBAAM,SAAS,YAAY,KAAK,OAAO,SAAS,KAAK,IAAI,MAAM,SAAS,MAAM,IAAI,KAAK;AACvF,cAAI,OAAO,SAAS,GAAG;AACrB,2BAAe,MAAM,MAAM;AAAA,UAC7B;AAAA,QACF,CAAC;AAED,yBAAiB,KAAK,OAAO,MAAM;AACjC,gBAAM,YAAY,YAAY,MAAM;AACpC,cAAI,UAAU,SAAS,GAAG;AACxB,2BAAe,MAAM,SAAS;AAAA,UAChC;AAEA,yBAAe,IAAI;AACnB,UAAAA,SAAQ;AAAA,QACV,CAAC;AACD,yBAAiB,KAAK,SAAS,MAAM;AAAA,MACvC,CAAC;AAED;AAAA,IACF;AAEA,QAAI,CAAC,uBAAuB,iBAAiB,OAAO,GAAG;AACrD,qBAAe;AAAA,QACb,iBAAiB,cAAc;AAAA,QAC/B,mBAAmB,iBAAiB,OAAO;AAAA,MAC7C;AAEA,YAAM,IAAI,QAAc,CAACA,UAAS,WAAW;AAC3C,yBAAiB,GAAG,QAAQ,CAAC,UAAU;AACrC,yBAAe,MAAM,KAAK;AAAA,QAC5B,CAAC;AACD,yBAAiB,KAAK,OAAO,MAAM;AACjC,yBAAe,IAAI;AACnB,UAAAA,SAAQ;AAAA,QACV,CAAC;AACD,yBAAiB,KAAK,SAAS,MAAM;AAAA,MACvC,CAAC;AAED;AAAA,IACF;AAEA,UAAM,SAAmB,CAAC;AAC1B,UAAM,IAAI,QAAc,CAACA,UAAS,WAAW;AAC3C,uBAAiB,GAAG,QAAQ,CAAC,UAA2B;AACtD,eAAO,KAAK,OAAO,SAAS,KAAK,IAAI,QAAQ,OAAO,KAAK,KAAK,CAAC;AAAA,MACjE,CAAC;AACD,uBAAiB,KAAK,OAAOA,QAAO;AACpC,uBAAiB,KAAK,SAAS,MAAM;AAAA,IACvC,CAAC;AAED,UAAM,OAAO,0BAA0B,OAAO,OAAO,MAAM,GAAG,aAAa;AAC3E,UAAM,UAAU,mBAAmB,iBAAiB,SAAS,KAAK,MAAM;AACxE,mBAAe,UAAU,iBAAiB,cAAc,KAAK,OAAO;AACpE,mBAAe,IAAI,IAAI;AAAA,EACzB;AAAA,EAEQ,uBAAuB,MAAsB;AACnD,UAAM,OAAO,KAAK,SAAS,MAAM;AACjC,SAAK,QAAQ,gBAAgB,IAAI;AAEjC,WAAO;AAAA,MACL,OAAO,KAAK,MAAM,MAAM;AAAA,MACxB,IAAI,IAAI,KAAK,QAAQ,MAAM,sBAAsB,CAAC;AAAA,IACpD;AAAA,EACF;AAAA,EAEA,MAAc,mCACZ,SACA,UAKe;AACf,QAAI,CAAC,KAAK,YAAY;AACpB;AAAA,IACF;AAEA,QAAI;AACF,YAAMG,OAAM,KAAK,YAAY,EAAE,WAAW,KAAK,CAAC;AAChD,YAAM,aAAaC;AAAA,QACjB,KAAK;AAAA,QACL,oBAAoB,KAAK,IAAI,CAAC,IAAIC,YAAW,EAAE,QAAQ,MAAM,EAAE,CAAC;AAAA,MAClE;AACA,YAAM,UAAU;AAAA,QACd,eAAe,QAAQ;AAAA,QACvB,YAAY,QAAQ;AAAA,QACpB,mBAAmB,QAAQ;AAAA,QAC3B,cAAc,oBAAoB,SAAS,YAAY;AAAA,QACvD,iBAAiB,SAAS;AAAA,QAC1B,oBAAoB,SAAS;AAAA,QAC7B,uBAAuB,QAAQ;AAAA,QAC/B,0BAA0B,QAAQ;AAAA,QAClC,uBAAuB,QAAQ;AAAA,MACjC;AAEA,YAAMC,WAAU,YAAY,GAAG,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC;AAAA,GAAM,MAAM;AAAA,IAC7E,QAAQ;AAAA,IAER;AAAA,EACF;AACF;;;AG7xDA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,OACL;AACP,SAAS,aAAAC,YAAW,cAAAC,mBAAkB;AACtC,SAAS,SAAAC,QAAO,YAAAC,WAAU,aAAAC,kBAAiB;AAC3C,SAAS,WAAAC,gBAAe;AACxB,SAAS,WAAAC,UAAS,QAAAC,aAAY;AAIvB,IAAM,qBAAqBC,MAAKC,SAAQ,GAAG,QAAQ,WAAW;AACrE,IAAM,gBAAgB;AACtB,IAAM,aAAa;AACnB,IAAM,cAAc;AACpB,IAAM,YAAY;AAClB,IAAM,kBAAkB;AACxB,IAAM,qBAAqB,cAAc,YAAY;AACrD,IAAM,YAAY;AAClB,IAAM,iBAAiB;AAAA,EACrB,GAAG,KAAK;AAAA,EACR,GAAG;AAAA,EACH,GAAG;AACL;AAEA,SAAS,aAAa,OAAqC;AACzD,MAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACvC,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ;AACd,SACE,OAAO,MAAM,UAAU,YACvB,OAAO,MAAM,WAAW,YACxB,aAAa,MAAM,IAAI,KACvB,OAAO,MAAM,cAAc,YAC3B,OAAO,SAAS,MAAM,SAAS,KAC/B,OAAO,MAAM,aAAa,YAC1B,OAAO,SAAS,MAAM,QAAQ,MAC7B,MAAM,SAAS,UAAa,OAAO,MAAM,SAAS,cAClD,MAAM,WAAW,UAAa,eAAe,MAAM,MAAM;AAE9D;AAEA,SAAS,eAAe,KAAyC;AAC/D,MAAI;AAEJ,MAAI;AACF,aAAS,KAAK,MAAM,GAAG;AAAA,EACzB,QAAQ;AACN,UAAM,IAAI,MAAM,yBAAyB;AAAA,EAC3C;AAEA,MAAI,CAAC,UAAU,OAAO,WAAW,YAAY,MAAM,QAAQ,MAAM,GAAG;AAClE,UAAM,IAAI,MAAM,yBAAyB;AAAA,EAC3C;AAEA,QAAM,SAAqC,CAAC;AAE5C,aAAW,CAAC,QAAQ,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACpD,QAAI,CAAC,aAAa,KAAK,KAAK,MAAM,WAAW,QAAQ;AACnD,YAAM,IAAI,MAAM,yBAAyB;AAAA,IAC3C;AAEA,WAAO,MAAM,IAAI;AAAA,MACf,OAAO,MAAM;AAAA,MACb,QAAQ,MAAM;AAAA,MACd,MAAM,MAAM;AAAA,MACZ,WAAW,MAAM;AAAA,MACjB,UAAU,MAAM;AAAA,MAChB,MAAM,MAAM;AAAA,MACZ,QAAQ,MAAM;AAAA,IAChB;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAe,UAAU,UAAkB,MAA+B;AACxE,SAAO,IAAI,QAAgB,CAACC,UAAS,WAAW;AAC9C,mBAAe,UAAU,MAAM,YAAY,gBAAgB,CAAC,OAAO,eAAe;AAChF,UAAI,OAAO;AACT,eAAO,KAAK;AACZ;AAAA,MACF;AAEA,MAAAA,SAAQ,OAAO,KAAK,UAAU,CAAC;AAAA,IACjC,CAAC;AAAA,EACH,CAAC;AACH;AAEO,IAAM,iBAAN,MAAqB;AAAA,EAC1B,OAAO,OAAO,OAAO,oBAA6B;AAChD,WAAOC,YAAW,IAAI;AAAA,EACxB;AAAA,EAEA,aAAa,KACX,MACA,UACA,OAAO,oBACQ;AACf,UAAM,iBAAiB,OAAO,KAAK,UAAU,MAAM;AACnD,UAAM,kBAAkB,OAAO,KAAK,KAAK,UAAU,IAAI,GAAG,MAAM;AAChE,UAAM,OAAO,YAAY,WAAW;AACpC,UAAM,KAAK,YAAY,SAAS;AAChC,QAAI,MAAqB;AACzB,QAAI,aAA4B;AAChC,QAAI,UAAyB;AAE7B,QAAI;AACF,YAAM,MAAM,UAAU,gBAAgB,IAAI;AAC1C,YAAM,SAAS,eAAe,eAAe,KAAK,EAAE;AACpD,mBAAa,OAAO,OAAO,CAAC,OAAO,OAAO,eAAe,GAAG,OAAO,MAAM,CAAC,CAAC;AAC3E,gBAAU,OAAO,WAAW;AAC5B,YAAM,UAAU,OAAO,OAAO,CAAC,MAAM,IAAI,SAAS,UAAU,CAAC;AAE7D,YAAMC,OAAMC,SAAQ,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AAC9C,YAAMC,WAAU,MAAM,SAAS,EAAE,MAAM,UAAU,CAAC;AAClD,MAAAC,WAAU,MAAM,SAAS;AACzB,cAAQ,KAAK,CAAC;AAAA,IAChB,UAAE;AACA,qBAAe,KAAK,CAAC;AACrB,sBAAgB,KAAK,CAAC;AACtB,WAAK,KAAK,CAAC;AACX,SAAG,KAAK,CAAC;AACT,WAAK,KAAK,CAAC;AACX,kBAAY,KAAK,CAAC;AAClB,eAAS,KAAK,CAAC;AAAA,IACjB;AAAA,EACF;AAAA,EAEA,aAAa,KAAK,UAAkB,OAAO,oBAAyD;AAClG,QAAI,CAAC,KAAK,OAAO,IAAI,GAAG;AACtB,aAAO,CAAC;AAAA,IACV;AAEA,UAAM,UAAU,MAAMC,UAAS,IAAI;AACnC,QAAI,QAAQ,SAAS,oBAAoB;AACvC,cAAQ,KAAK,CAAC;AACd,YAAM,IAAI,MAAM,yBAAyB;AAAA,IAC3C;AAEA,UAAM,iBAAiB,OAAO,KAAK,UAAU,MAAM;AACnD,UAAM,OAAO,OAAO,KAAK,QAAQ,SAAS,GAAG,WAAW,CAAC;AACzD,UAAM,KAAK,OAAO,KAAK,QAAQ,SAAS,aAAa,cAAc,SAAS,CAAC;AAC7E,UAAM,UAAU,OAAO;AAAA,MACrB,QAAQ,SAAS,cAAc,WAAW,cAAc,YAAY,eAAe;AAAA,IACrF;AACA,UAAM,aAAa,OAAO,KAAK,QAAQ,SAAS,kBAAkB,CAAC;AACnE,QAAI,MAAqB;AACzB,QAAI,YAA2B;AAE/B,QAAI;AACF,YAAM,MAAM,UAAU,gBAAgB,IAAI;AAC1C,YAAM,WAAW,iBAAiB,eAAe,KAAK,EAAE;AACxD,eAAS,WAAW,OAAO;AAC3B,kBAAY,OAAO,OAAO,CAAC,SAAS,OAAO,UAAU,GAAG,SAAS,MAAM,CAAC,CAAC;AACzE,aAAO,eAAe,UAAU,SAAS,MAAM,CAAC;AAAA,IAClD,SAAS,OAAO;AACd,UAAI,iBAAiB,OAAO;AAC1B,cAAM,IAAI,MAAM,4BAA4B,MAAM,OAAO,EAAE;AAAA,MAC7D;AAEA,YAAM,IAAI,MAAM,6DAA6D;AAAA,IAC/E,UAAE;AACA,cAAQ,KAAK,CAAC;AACd,qBAAe,KAAK,CAAC;AACrB,WAAK,KAAK,CAAC;AACX,SAAG,KAAK,CAAC;AACT,cAAQ,KAAK,CAAC;AACd,iBAAW,KAAK,CAAC;AACjB,WAAK,KAAK,CAAC;AACX,iBAAW,KAAK,CAAC;AAAA,IACnB;AAAA,EACF;AACF;;;ACzKA,IAAM,kBAAkB;AACxB,IAAM,gBAAsC,YAAY,OAAO,QAAQ;AAEvE,IAAI,uBAA6C;AAEjD,SAAS,wBACP,QACgB;AAChB,SAAO,aAAa,SAAS,OAAO,UAAU;AAChD;AAEA,eAAe,qBAAqD;AAClE,MAAI;AACF,WAAO,wBAAwB,MAAM,qBAAqB,CAAC;AAAA,EAC7D,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,kCAAkC,QAAoC;AACpF,yBAAuB;AACzB;AAEO,SAAS,sCAA4C;AAC1D,yBAAuB;AACzB;AAEO,IAAM,gBAAN,MAAoB;AAAA,EACzB,OAAgB,UAAU;AAAA,EAC1B,OAAwB,UAAU;AAAA,EAElC,aAAa,iBAAiB,UAAiC;AAC7D,UAAM,WAAW,MAAM,mBAAmB;AAC1C,QAAI,CAAC,UAAU;AACb,YAAM,IAAI,MAAM,kCAAkC;AAAA,IACpD;AAEA,QAAI;AACF,YAAM,SAAS,YAAY,KAAK,SAAS,KAAK,SAAS,QAAQ;AAAA,IACjE,SAAS,OAAO;AACd,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,YAAM,IAAI,MAAM,qCAAqC,OAAO,EAAE;AAAA,IAChE;AAAA,EACF;AAAA,EAEA,aAAa,mBAA2C;AACtD,UAAM,WAAW,MAAM,mBAAmB;AAC1C,QAAI,CAAC,UAAU;AACb,aAAO;AAAA,IACT;AAEA,QAAI;AACF,aAAO,MAAM,SAAS,YAAY,KAAK,SAAS,KAAK,OAAO;AAAA,IAC9D,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,aAAa,sBAAqC;AAChD,UAAM,WAAW,MAAM,mBAAmB;AAC1C,QAAI,CAAC,UAAU;AACb;AAAA,IACF;AAEA,QAAI;AACF,YAAM,SAAS,eAAe,KAAK,SAAS,KAAK,OAAO;AAAA,IAC1D,QAAQ;AAAA,IAER;AAAA,EACF;AAAA,EAEA,aAAa,cAAgC;AAC3C,UAAM,WAAW,MAAM,mBAAmB;AAC1C,QAAI,CAAC,UAAU;AACb,aAAO;AAAA,IACT;AAEA,QAAI;AACF,YAAM,SAAS,YAAY,KAAK,SAAS,KAAK,OAAO;AACrD,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACF;;;AC5FA,SAAS,eAAAC,oBAAmB;;;ACA5B,SAAS,cAAAC,aAAY,cAAAC,mBAAkB;AAIvC,IAAM,eAAe;AACrB,IAAM,eAAe;AACrB,IAAM,mBAAmB;AACzB,IAAM,kBAAkB;AACxB,IAAM,uBAAuB;AAC7B,IAAM,gBAAgB;AAEf,IAAM,cAAc;AACpB,IAAM,mBAAmB,GAAG,YAAY,eAAe,IAAI,OAAO,eAAe,CAAC,GAAG,YAAY,GAAG;AAe3G,SAAS,WAAW,MAAkB,MAAsB;AAC1D,SAAO,GAAG,YAAY,GAAG,IAAI,IAAI,IAAI,GAAG,YAAY;AACtD;AAEA,SAAS,oBACP,QACA,MACA,WACA,WACA,SACQ;AACR,QAAM,QAAQ,UAAU,MAAM,aAAa;AAC3C,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,+BAA+B,SAAS,EAAE;AAAA,EAC5D;AAEA,MAAI,WAAW,sBAAsB;AACnC,WAAO,WAAW,MAAM,GAAG,MAAM,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAAC,GAAG,QAAQ,SAAS,EAAE,CAAC,EAAE;AAAA,EACzF;AAEA,QAAM,OAAOD,YAAW,QAAQ,EAC7B,OAAO,GAAG,MAAM,GAAG,SAAS,IAAI,OAAO,EAAE,EACzC,OAAO,KAAK,EACZ,MAAM,GAAG,eAAe;AAE3B,SAAO,WAAW,MAAM,IAAI;AAC9B;AAEA,SAAS,wBAA6D,OAAiB;AACrF,SAAO,MAAM,KAAK,CAAC,MAAM,UAAU;AACjC,QAAI,MAAM,CAAC,EAAE,WAAW,KAAK,CAAC,EAAE,QAAQ;AACtC,aAAO,MAAM,CAAC,EAAE,SAAS,KAAK,CAAC,EAAE;AAAA,IACnC;AAEA,WAAO,KAAK,CAAC,EAAE,cAAc,MAAM,CAAC,CAAC;AAAA,EACvC,CAAC;AACH;AAEO,SAAS,cAAc,QAAgB,MAAkB,WAA2B;AACzF,QAAM,OAAOA,YAAW,QAAQ,EAC7B,OAAO,SAAS,SAAS,EACzB,OAAO,KAAK,EACZ,MAAM,GAAG,gBAAgB;AAE5B,SAAO,WAAW,MAAM,IAAI;AAC9B;AAEO,IAAM,eAAN,MAAmB;AAAA,EACP,eAAe,oBAAI,IAAoB;AAAA,EAChD,iBAAiB;AAAA,EACR,gBAAgB,oBAAI,IAAwB;AAAA,EAC5C,eAAe,oBAAI,IAAwB;AAAA,EAC3C;AAAA,EACA;AAAA,EAEjB,YAAY,UAA+B,CAAC,GAAG;AAC7C,SAAK,YAAY,QAAQ,aAAaC,YAAW;AACjD,SAAK,iBAAiB,QAAQ,kBAAkB;AAAA,EAClD;AAAA,EAEA,IAAI,OAAe;AACjB,WAAO,KAAK,cAAc;AAAA,EAC5B;AAAA,EAEA,IAAI,WAAmB;AACrB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,SAAS,QAAgB,MAAkB,UAAiC,CAAC,GAAW;AACtF,UAAM,gBAAgB,KAAK,cAAc,IAAI,MAAM;AACnD,QAAI,eAAe;AACjB,WAAK,oBAAoB,eAAe,MAAM,OAAO;AACrD,aAAO,cAAc;AAAA,IACvB;AAEA,UAAM,YAAY,QAAQ,aAAa,KAAK,IAAI;AAChD,UAAM,YAAY,QAAQ,SAAS,KAAK,eAAe,QAAQ,MAAM,KAAK,SAAS;AACnF,QAAI,QAAQ;AACZ,QAAI,UAAU;AAEd,WAAO,MAAM;AACX,YAAM,qBAAqB,KAAK,aAAa,IAAI,KAAK;AACtD,UAAI,CAAC,oBAAoB;AACvB;AAAA,MACF;AAEA,UAAI,mBAAmB,WAAW,QAAQ;AACxC,eAAO,mBAAmB;AAAA,MAC5B;AAEA,iBAAW;AACX,cAAQ,oBAAoB,QAAQ,MAAM,KAAK,WAAW,WAAW,OAAO;AAAA,IAC9E;AAEA,UAAM,QAAoB;AAAA,MACxB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,UAAU,QAAQ,YAAY;AAAA,MAC9B,MAAM,mBAAmB,QAAQ,IAAI;AAAA,MACrC,QAAQ,QAAQ,UAAU;AAAA,IAC5B;AAEA,SAAK,oBAAoB,MAAM,MAAM,MAAM,MAAM;AACjD,SAAK,cAAc,IAAI,QAAQ,KAAK;AACpC,SAAK,aAAa,IAAI,OAAO,KAAK;AAClC,QAAI,MAAM,MAAM;AACd,WAAK,aAAa,IAAI,MAAM,MAAM,MAAM;AAAA,IAC1C;AACA,SAAK,kBAAkB;AAEvB,WAAO;AAAA,EACT;AAAA,EAEA,WAAW,MAAiC;AAC1C,UAAM,iBAAiB,mBAAmB,IAAI;AAC9C,QAAI,CAAC,gBAAgB;AACnB,aAAO;AAAA,IACT;AAEA,UAAM,SAAS,KAAK,aAAa,IAAI,cAAc;AACnD,QAAI,CAAC,QAAQ;AACX,aAAO;AAAA,IACT;AAEA,WAAO,WAAW,KAAK,cAAc,IAAI,MAAM,CAAC;AAAA,EAClD;AAAA,EAEA,QAAQ,OAA8B;AACpC,UAAM,QAAQ,KAAK,aAAa,IAAI,KAAK;AACzC,QAAI,CAAC,OAAO;AACV,aAAO;AAAA,IACT;AAEA,UAAM,YAAY;AAClB,WAAO,MAAM;AAAA,EACf;AAAA,EAEA,wBAAiD;AAC/C,WAAO;AAAA,MACL,MAAM,KAAK,KAAK,cAAc,OAAO,GAAG,CAAC,UAAU,CAAC,MAAM,QAAQ,MAAM,KAAK,CAAU;AAAA,IACzF,EAAE,IAAI,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ,KAAK,CAAC;AAAA,EAC5C;AAAA,EAEA,WAAyB;AACvB,WAAO,MAAM,KAAK,KAAK,cAAc,OAAO,GAAG,CAAC,WAAW;AAAA,MACzD,GAAG;AAAA,IACL,EAAE,EAAE,KAAK,CAAC,MAAM,UAAU,KAAK,OAAO,cAAc,MAAM,MAAM,CAAC;AAAA,EACnE;AAAA,EAEA,aAAa,MAAiC;AAC5C,UAAM,iBAAiB,mBAAmB,IAAI;AAC9C,QAAI,CAAC,gBAAgB;AACnB,aAAO;AAAA,IACT;AAEA,UAAM,SAAS,KAAK,aAAa,IAAI,cAAc;AACnD,QAAI,CAAC,QAAQ;AACX,aAAO;AAAA,IACT;AAEA,WAAO,KAAK,eAAe,MAAM;AAAA,EACnC;AAAA,EAEA,wBAAiD;AAC/C,WAAO;AAAA,MACL,MAAM,KAAK,KAAK,aAAa,OAAO,GAAG,CAAC,UAAU,CAAC,MAAM,OAAO,MAAM,MAAM,CAAU;AAAA,IACxF,EAAE,IAAI,CAAC,CAAC,OAAO,MAAM,MAAM,CAAC,OAAO,MAAM,CAAC;AAAA,EAC5C;AAAA,EAEA,QAAQ,OAAwB;AAC9B,WAAO,KAAK,aAAa,IAAI,KAAK;AAAA,EACpC;AAAA,EAEA,UAAgB;AACd,QAAI,KAAK,cAAc,OAAO,KAAK,KAAK,aAAa,OAAO,GAAG;AAC7D,WAAK,kBAAkB;AAAA,IACzB;AAEA,SAAK,aAAa,MAAM;AACxB,SAAK,cAAc,MAAM;AACzB,SAAK,aAAa,MAAM;AAAA,EAC1B;AAAA,EAEQ,eAAe,QAAmC;AACxD,UAAM,QAAQ,KAAK,cAAc,IAAI,MAAM;AAC3C,QAAI,CAAC,OAAO;AACV,aAAO;AAAA,IACT;AAEA,SAAK,cAAc,OAAO,MAAM;AAChC,SAAK,aAAa,OAAO,MAAM,KAAK;AACpC,QAAI,MAAM,MAAM;AACd,WAAK,aAAa,OAAO,MAAM,IAAI;AAAA,IACrC;AACA,SAAK,kBAAkB;AAEvB,WAAO;AAAA,MACL,GAAG;AAAA,IACL;AAAA,EACF;AAAA,EAEQ,oBACN,OACA,MACA,SACM;AACN,QAAI,UAAU;AAEd,QAAI,MAAM,SAAS,MAAM;AACvB,YAAM,OAAO;AACb,gBAAU;AAAA,IACZ;AAEA,QAAI,QAAQ,cAAc,UAAa,MAAM,cAAc,QAAQ,WAAW;AAC5E,YAAM,YAAY,QAAQ;AAC1B,gBAAU;AAAA,IACZ;AAEA,QAAI,QAAQ,aAAa,UAAa,MAAM,aAAa,QAAQ,UAAU;AACzE,YAAM,WAAW,QAAQ;AACzB,gBAAU;AAAA,IACZ;AAEA,QAAI,QAAQ,UAAU,MAAM,WAAW,QAAQ,QAAQ;AACrD,YAAM,SAAS,QAAQ;AACvB,gBAAU;AAAA,IACZ;AAEA,UAAM,WAAW,mBAAmB,QAAQ,IAAI;AAChD,QAAI,aAAa,UAAa,aAAa,MAAM,MAAM;AACrD,WAAK,oBAAoB,UAAU,MAAM,MAAM;AAC/C,UAAI,MAAM,MAAM;AACd,aAAK,aAAa,OAAO,MAAM,IAAI;AAAA,MACrC;AAEA,YAAM,OAAO;AACb,UAAI,UAAU;AACZ,aAAK,aAAa,IAAI,UAAU,MAAM,MAAM;AAAA,MAC9C;AACA,gBAAU;AAAA,IACZ;AAEA,QAAI,SAAS;AACX,WAAK,kBAAkB;AAAA,IACzB;AAAA,EACF;AAAA,EAEQ,oBAAoB,MAA0B,QAAsB;AAC1E,QAAI,CAAC,MAAM;AACT;AAAA,IACF;AAEA,UAAM,iBAAiB,KAAK,aAAa,IAAI,IAAI;AACjD,QAAI,kBAAkB,mBAAmB,QAAQ;AAC/C,YAAM,IAAI,MAAM,+BAA+B,IAAI,EAAE;AAAA,IACvD;AAAA,EACF;AACF;AAEA,SAAS,WAAW,OAAkD;AACpE,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,EACL;AACF;AAEA,SAAS,mBAAmB,MAA8C;AACxE,MAAI,SAAS,QAAW;AACtB,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,KAAK,KAAK;AAC1B,SAAO,QAAQ,WAAW,IAAI,SAAY;AAC5C;;;AD3SA,IAAM,oBAAoB;AAiB1B,SAAS,iBAAiB,OAAqB,wBAAiC;AAC9E,SAAO,OAAO;AAAA,IACZ,MACG,SAAS,EACT,OAAO,CAAC,UAAU,0BAA0B,MAAM,WAAW,QAAQ,EACrE,IAAI,CAAC,UAAU,CAAC,MAAM,QAAQ,KAAK,CAAC;AAAA,EACzC;AACF;AAEO,IAAM,iBAAN,MAAqB;AAAA,EAK1B,YAA6B,UAAiC,CAAC,GAAG;AAArC;AAC3B,SAAK,MAAM,QAAQ,OAAO,QAAQ;AAClC,SAAK,WAAW,QAAQ,YAAY;AAAA,EACtC;AAAA,EAPQ,iBAAgC;AAAA,EACvB;AAAA,EACA;AAAA,EAOjB,MAAM,aAAoC;AACxC,UAAM,QAAQ,IAAI,aAAa,KAAK,QAAQ,YAAY;AACxD,UAAM,WAAW,MAAM,KAAK,oBAAoB;AAEhD,QAAI,CAAC,UAAU;AACb,aAAO;AAAA,IACT;AAEA,UAAM,mBAAmB,MAAM,eAAe,KAAK,UAAU,KAAK,QAAQ,SAAS;AACnF,eAAW,SAAS,OAAO,OAAO,gBAAgB,GAAG;AACnD,YAAM,SAAS,MAAM,QAAQ,MAAM,MAAM;AAAA,QACvC,WAAW,MAAM;AAAA,QACjB,UAAU,MAAM;AAAA,QAChB,MAAM,MAAM;AAAA,QACZ,QAAQ,MAAM,UAAU;AAAA,QACxB,OAAO,MAAM;AAAA,MACf,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,KAAK,OAAoC;AAC7C,UAAM,WAAW,MAAM,KAAK,oBAAoB;AAChD,UAAM,eAAe;AAAA,MACnB,iBAAiB,OAAO,KAAK,QAAQ,2BAA2B,KAAK;AAAA,MACrE;AAAA,MACA,KAAK,QAAQ;AAAA,IACf;AAAA,EACF;AAAA,EAEA,MAAM,QAA0B;AAC9B,UAAM,WAAW,MAAM,KAAK,oBAAoB;AAChD,QAAI,eAAe,OAAO,KAAK,QAAQ,SAAS,GAAG;AACjD,aAAO;AAAA,IACT;AAEA,UAAM,eAAe,KAAK,CAAC,GAAG,UAAU,KAAK,QAAQ,SAAS;AAC9D,WAAO;AAAA,EACT;AAAA,EAEA,eAAuB;AACrB,WAAO,KAAK,QAAQ,aAAa;AAAA,EACnC;AAAA,EAEA,MAAc,sBAA8C;AAC1D,UAAM,iBAAiB,KAAK,kBAAkB;AAC9C,QAAI,gBAAgB;AAClB,WAAK,iBAAiB;AACtB,aAAO;AAAA,IACT;AAEA,QAAI,KAAK,gBAAgB;AACvB,aAAO,KAAK;AAAA,IACd;AAEA,UAAM,iBAAiB,MAAM,KAAK,SAAS,iBAAiB;AAC5D,QAAI,gBAAgB;AAClB,WAAK,iBAAiB;AACtB,aAAO;AAAA,IACT;AAEA,QAAI,eAAe,OAAO,KAAK,QAAQ,SAAS,GAAG;AACjD,YAAM,IAAI;AAAA,QACR,sCAAsC,iBAAiB;AAAA,MACzD;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,sBAAuC;AACnD,UAAM,iBAAiB,KAAK,kBAAkB;AAC9C,QAAI,gBAAgB;AAClB,WAAK,iBAAiB;AACtB,aAAO;AAAA,IACT;AAEA,QAAI,KAAK,gBAAgB;AACvB,aAAO,KAAK;AAAA,IACd;AAEA,UAAM,iBAAiB,MAAM,KAAK,SAAS,iBAAiB;AAC5D,QAAI,gBAAgB;AAClB,WAAK,iBAAiB;AACtB,aAAO;AAAA,IACT;AAEA,QAAI,MAAM,KAAK,SAAS,YAAY,GAAG;AACrC,YAAM,OAAOC,aAAY,EAAE;AAC3B,YAAM,oBAAoB,KAAK,SAAS,WAAW;AACnD,WAAK,KAAK,CAAC;AACX,YAAM,KAAK,SAAS,iBAAiB,iBAAiB;AACtD,WAAK,iBAAiB;AACtB,aAAO;AAAA,IACT;AAEA,UAAM,IAAI;AAAA,MACR,sCAAsC,iBAAiB;AAAA,IACzD;AAAA,EACF;AAAA,EAEQ,oBAAmC;AACzC,WAAO,KAAK,QAAQ,iBAAiB,KAAK,IAAI,iBAAiB,KAAK;AAAA,EACtE;AACF;;;AdjIA,IAAM,2BAA2B;AACjC,IAAM,sBAAsB;AAE5B,SAASC,gBAAe,OAAwB;AAC9C,SAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAC9D;AA0EA,SAAS,qBAAqB,OAA6C;AACzE,SAAO,MAAM,KAAK,CAAC,MAAM,UAAU;AACjC,QAAI,MAAM,OAAO,WAAW,KAAK,OAAO,QAAQ;AAC9C,aAAO,MAAM,OAAO,SAAS,KAAK,OAAO;AAAA,IAC3C;AAEA,WAAO,KAAK,OAAO,cAAc,MAAM,MAAM;AAAA,EAC/C,CAAC;AACH;AAEA,SAAS,cAAc,SAAgC;AACrD,SAAO,IAAI;AAAA,IACT,QAAQ;AAAA,MAAQ,CAAC,WACf,MAAM,KAAK,EAAE,QAAQ,KAAK,IAAI,GAAG,OAAO,SAAS,CAAC,EAAE,GAAG,CAAC,GAAG,UAAU,OAAO,MAAM,GAAG,QAAQ,CAAC,CAAC;AAAA,IACjG;AAAA,EACF;AACF;AAEA,SAAS,aAAa,QAAwB;AAC5C,MAAI,OAAO,UAAU,GAAG;AACtB,WAAO,GAAG,OAAO,MAAM,GAAG,CAAC,CAAC;AAAA,EAC9B;AAEA,SAAO,GAAG,OAAO,MAAM,GAAG,CAAC,CAAC;AAC9B;AAEA,SAAS,cAAc,OAA8B;AACnD,MAAI,SAAS;AACb,MAAI,QAAQ;AACZ,QAAM,SAAmB,CAAC;AAC1B,QAAM,OAAiB,CAAC;AAExB,SAAO,SAAS,MAAM,QAAQ;AAC5B,QAAI,MAAM,MAAM,MAAM,QAAQ;AAC5B,aAAO,KAAK,MAAM;AAClB,eAAS,MAAM,MAAM;AACrB,gBAAU;AACV,WAAK,KAAK,MAAM;AAChB;AAAA,IACF;AAEA,UAAM,aAAa,qBAAqB,OAAO,MAAM;AACrD,QAAI,eAAe,GAAG;AACpB;AAAA,IACF;AAEA,cAAU;AAAA,EACZ;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,mBAAmB;AAAA,EACrB;AACF;AAEA,SAAS,qBAAqB,OAAe,OAAuB;AAClE,MAAI,MAAM,KAAK,MAAM,UAAU,MAAM,QAAQ,CAAC,MAAM,KAAK;AACvD,WAAO;AAAA,EACT;AAEA,WAAS,SAAS,QAAQ,GAAG,SAAS,MAAM,QAAQ,UAAU,GAAG;AAC/D,UAAM,OAAO,MAAM,WAAW,MAAM;AACpC,QAAI,QAAQ,MAAQ,QAAQ,KAAM;AAChC,aAAO,SAAS,QAAQ;AAAA,IAC1B;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,uBAAuB,OAAe,OAA8C;AAC3F,QAAM,UAA8B,CAAC;AACrC,MAAI,SAAS;AAEb,SAAO,SAAS,MAAM,QAAQ;AAC5B,UAAM,cAAc,MAAM,KAAK,CAAC,SAAS,MAAM,WAAW,KAAK,QAAQ,MAAM,CAAC;AAC9E,QAAI,CAAC,aAAa;AAChB,gBAAU;AACV;AAAA,IACF;AAEA,YAAQ,KAAK;AAAA,MACX,OAAO;AAAA,MACP,KAAK,SAAS,YAAY,OAAO;AAAA,MACjC,aAAa,YAAY;AAAA,IAC3B,CAAC;AACD,cAAU,YAAY,OAAO;AAAA,EAC/B;AAEA,SAAO;AACT;AAEA,SAAS,mBAAmB,OAAe,OAAyC;AAClF,MAAI,MAAM,WAAW,KAAK,MAAM,WAAW,GAAG;AAC5C,WAAO,EAAE,QAAQ,OAAO,cAAc,EAAE;AAAA,EAC1C;AAEA,MAAI,SAAS;AACb,MAAI,eAAe;AAEnB,aAAW,QAAQ,OAAO;AACxB,QAAI,aAAa;AACjB,QAAI,YAAY;AAChB,QAAI,UAAU;AACd,QAAI,aAAa,OAAO,QAAQ,KAAK,MAAM;AAE3C,WAAO,eAAe,IAAI;AACxB,gBAAU;AACV,sBAAgB;AAChB,oBAAc,OAAO,MAAM,WAAW,UAAU;AAChD,oBAAc,KAAK;AACnB,kBAAY,aAAa,KAAK,OAAO;AACrC,mBAAa,OAAO,QAAQ,KAAK,QAAQ,SAAS;AAAA,IACpD;AAEA,QAAI,SAAS;AACX,oBAAc,OAAO,MAAM,SAAS;AACpC,eAAS;AAAA,IACX;AAAA,EACF;AAEA,SAAO,EAAE,QAAQ,aAAa;AAChC;AAEO,SAAS,oBAAoB,OAAuB;AACzD,QAAM,YAAY,MAAM,QAAQ,qBAAqB,EAAE;AACvD,QAAM,sBAAsB,UAAU,YAAY,UAAU;AAC5D,MAAI,wBAAwB,IAAI;AAC9B,WAAO;AAAA,EACT;AAEA,SAAO,UAAU,MAAM,GAAG,mBAAmB;AAC/C;AAEA,SAAS,6BAA6B,OAAuB;AAC3D,SAAO,MACJ,WAAW,OAAO,IAAI,EACtB,WAAW,OAAO,IAAI,EACtB,WAAW,OAAO,GAAG,EACrB,WAAW,QAAQ,IAAI;AAC5B;AAEA,IAAM,iBAAN,MAAqB;AAAA,EAMnB,YAA6B,OAAqB;AAArB;AAAA,EAAsB;AAAA,EAL3C,SAAS;AAAA,EACT,WAAW,oBAAI,IAAY;AAAA,EAC3B,QAA2B,CAAC;AAAA,EAC5B,iBAAiB;AAAA,EAIzB,KAAK,OAA8B;AACjC,SAAK,UAAU;AAEf,UAAM,QAAQ,KAAK,SAAS;AAC5B,UAAM,OAAO,cAAc,KAAK;AAChC,UAAM,iBAAiB,MAAM,MAAM,GAAG,KAAK,iBAAiB;AAC5D,UAAM,cAAc,MAAM,MAAM,KAAK,iBAAiB;AAEtD,QAAI,KAAK,MAAM,WAAW,GAAG;AAC3B,WAAK,SAAS;AACd,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,cAAc;AAAA,MAChB;AAAA,IACF;AAEA,QAAI,KAAK,MAAM,WAAW,GAAG;AAC3B,WAAK,SAAS;AACd,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,cAAc;AAAA,MAChB;AAAA,IACF;AAEA,UAAM,iBAAiB,KAAK,MAAM,SAAS,KAAK,oBAAoB,KAAK,KAAK;AAC9E,QAAI,kBAAkB,GAAG;AACvB,WAAK,SAAS;AACd,aAAO,EAAE,QAAQ,IAAI,cAAc,EAAE;AAAA,IACvC;AAEA,UAAM,UAAU,uBAAuB,KAAK,OAAO,KAAK,KAAK;AAC7D,UAAM,mBAAmB,KAAK,oBAAoB,SAAS,cAAc;AACzE,UAAM,WACJ,oBAAoB,KAAK,MAAM,SAC3B,KAAK,oBACL,qBAAqB,IACnB,IACA,KAAK,KAAK,mBAAmB,CAAC;AAEtC,UAAM,WAAW,KAAK,WAAW,gBAAgB,MAAM,SAAS,kBAAkB,QAAQ;AAC1F,SAAK,SAAS,MAAM,MAAM,QAAQ;AAClC,WAAO;AAAA,EACT;AAAA,EAEA,QAAuB;AACrB,SAAK,UAAU;AAEf,QAAI,KAAK,OAAO,WAAW,GAAG;AAC5B,aAAO,EAAE,QAAQ,IAAI,cAAc,EAAE;AAAA,IACvC;AAEA,QAAI,KAAK,MAAM,WAAW,GAAG;AAC3B,YAAM,YAAY,KAAK;AACvB,WAAK,SAAS;AACd,aAAO,EAAE,QAAQ,WAAW,cAAc,EAAE;AAAA,IAC9C;AAEA,UAAM,QAAQ,KAAK;AACnB,SAAK,SAAS;AACd,UAAM,OAAO,cAAc,KAAK;AAChC,UAAM,WAAW,KAAK;AAAA,MACpB,MAAM,MAAM,GAAG,KAAK,iBAAiB;AAAA,MACrC;AAAA,MACA,uBAAuB,KAAK,OAAO,KAAK,KAAK;AAAA,MAC7C,KAAK,MAAM;AAAA,MACX,KAAK;AAAA,IACP;AAEA,WAAO;AAAA,MACL,QAAQ,SAAS,SAAS,MAAM,MAAM,KAAK,iBAAiB;AAAA,MAC5D,cAAc,SAAS;AAAA,IACzB;AAAA,EACF;AAAA,EAEQ,oBAAoB,OAAuB;AACjD,UAAM,mBAAmB,KAAK;AAAA,MAC5B,MAAM;AAAA,MACN,KAAK,IAAI,GAAG,GAAG,KAAK,MAAM,IAAI,CAAC,SAAS,KAAK,OAAO,SAAS,CAAC,CAAC;AAAA,IACjE;AAEA,aAAS,SAAS,kBAAkB,SAAS,GAAG,UAAU,GAAG;AAC3D,UAAI,KAAK,SAAS,IAAI,MAAM,MAAM,CAAC,MAAM,CAAC,GAAG;AAC3C,eAAO;AAAA,MACT;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,oBAAoB,SAA6B,gBAAgC;AACvF,QAAI,YAAY;AAChB,QAAI,UAAU;AAEd,WAAO,SAAS;AACd,gBAAU;AAEV,iBAAW,SAAS,SAAS;AAC3B,YAAI,MAAM,SAAS,WAAW;AAC5B;AAAA,QACF;AAEA,YAAI,MAAM,MAAM,WAAW;AACzB,sBAAY,MAAM;AAClB,oBAAU;AAAA,QACZ;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,WACN,KACA,MACA,SACA,cACA,UACe;AACf,QAAI,IAAI,WAAW,GAAG;AACpB,aAAO,EAAE,QAAQ,IAAI,cAAc,EAAE;AAAA,IACvC;AAEA,QAAI,iBAAiB,GAAG;AACtB,aAAO;AAAA,QACL,QAAQ,IAAI,MAAM,GAAG,QAAQ;AAAA,QAC7B,cAAc;AAAA,MAChB;AAAA,IACF;AAEA,QAAI,SAAS;AACb,QAAI,SAAS;AACb,QAAI,eAAe;AAEnB,eAAW,SAAS,SAAS;AAC3B,UAAI,MAAM,MAAM,cAAc;AAC5B;AAAA,MACF;AAEA,YAAM,WAAW,KAAK,OAAO,MAAM,KAAK;AACxC,YAAM,SAAS,KAAK,KAAK,MAAM,MAAM,CAAC;AAEtC,UAAI,WAAW,UAAU,SAAS,UAAU;AAC1C;AAAA,MACF;AAEA,gBAAU,IAAI,MAAM,QAAQ,QAAQ;AACpC,gBAAU,MAAM;AAChB,eAAS;AACT,sBAAgB;AAAA,IAClB;AAEA,cAAU,IAAI,MAAM,QAAQ,QAAQ;AACpC,WAAO,EAAE,QAAQ,aAAa;AAAA,EAChC;AAAA,EAEQ,YAAkB;AACxB,QAAI,KAAK,mBAAmB,KAAK,MAAM,UAAU;AAC/C;AAAA,IACF;AAEA,SAAK,QAAQ;AAAA,MACX,KAAK,MACF,sBAAsB,EACtB,IAAI,CAAC,CAAC,QAAQ,MAAM,OAAO;AAAA,QAC1B;AAAA,QACA;AAAA,MACF,EAAE;AAAA,IACN;AACA,SAAK,WAAW,cAAc,KAAK,MAAM,IAAI,CAAC,SAAS,KAAK,MAAM,CAAC;AACnE,SAAK,iBAAiB,KAAK,MAAM;AAAA,EACnC;AACF;AAEO,IAAM,aAAN,MAAiB;AAAA,EAsBtB,YAA6B,UAA6B,CAAC,GAAG;AAAjC;AAC3B,SAAK,QAAQ,IAAI,aAAa,QAAQ,KAAK;AAC3C,SAAK,WAAW,IAAI,iBAAiB,QAAQ,QAAQ;AACrD,SAAK,eAAe,IAAI,iBAAiB;AAAA,MACvC,GAAI,QAAQ,YAAY,CAAC;AAAA,MACzB,eAAe;AAAA,IACjB,CAAC;AACD,SAAK,cAAc,IAAI,yBAAyB,KAAK,KAAK;AAC1D,SAAK,iBAAiB,IAAI,eAAe,KAAK,KAAK;AACnD,UAAM,YAAY;AAAA,MAChB,GAAG,QAAQ;AAAA,MACX,GAAI,QAAQ,OAAO,CAAC;AAAA,IACtB;AAEA,SAAK,QAAQ,IAAI,YAAY;AAAA,MAC3B,GAAI,QAAQ,SAAS,CAAC;AAAA,MACtB,eAAe,CAAC,SAAS;AACvB,gBAAQ,OAAO,gBAAgB,IAAI;AACnC,aAAK,uBAAuB,IAAI;AAAA,MAClC;AAAA,MACA,SAAS;AAAA,QACP,GAAG,uBAAuB,SAAS;AAAA,QACnC,GAAI,QAAQ,OAAO,WAAW,CAAC;AAAA,MACjC;AAAA,MACA,OAAO,KAAK;AAAA,IACd,CAAC;AACD,SAAK,iBACH,QAAQ,WAAW,aAAa,QAAQ,WAAW,QAAQ,QAAQ,UAC/D,QAAQ,QAAQ,UAChB,QAAQ,UACN,IAAI,eAAe,QAAQ,OAAO,IAClC;AACR,SAAK,WACH,QAAQ,OAAO,WAAW,QAAQ,OAAO,QAAQ,IAAI,QACjD,QAAQ,IAAI,QACZ,QAAQ,MACN,IAAI,SAAS,QAAQ,GAAG,IACxB;AAAA,EACV;AAAA,EA3DiB;AAAA,EACA;AAAA,EACA,mBAAmB;AAAA,IAClC,OAAO;AAAA,IACP,OAAO;AAAA,EACT;AAAA,EACiB;AAAA,EACA;AAAA,EACT,YAA2B;AAAA,EAClB;AAAA,EACA;AAAA,EACT,gBAAgB;AAAA,EACP;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,IACvB,iBAAiB;AAAA,IACjB,cAAc;AAAA,IACd,iBAAiB;AAAA,EACnB;AAAA,EACQ,UAAU;AAAA,EA0ClB,MAAM,MAAM,SAAiB,MAA+B;AAC1D,QAAI,KAAK,SAAS;AAChB,YAAM,IAAI,MAAM,wBAAwB;AAAA,IAC1C;AAEA,SAAK,UAAU;AACf,SAAK,sBAAsB;AAC3B,QAAI;AACJ,QAAI;AACJ,QAAI;AAEJ,UAAM,aAAa;AAAA,MACjB,GAAG,QAAQ;AAAA,MACX,GAAI,KAAK,QAAQ,OAAO,CAAC;AAAA,IAC3B;AAEA,QAAI;AACF,YAAM,KAAK,aAAa;AACxB,YAAM,KAAK,kBAAkB;AAC7B,YAAM,eAAe,KAAK,YAAY,IAAI;AAC1C,UAAI,aAAa;AAEjB,UAAI,KAAK,QAAQ,QAAQ;AACvB,aAAK,MAAM,iCAAiC;AAAA,MAC9C,OAAO;AACL,YAAI;AACF,eAAK,YAAY,MAAM,KAAK,MAAM,MAAM;AACxC,uBAAa,sBAAsB,KAAK,MAAM,WAAW,GAAG,UAAU;AACtE,eAAK,MAAM,qBAAqB,KAAK,SAAS,EAAE;AAAA,QAClD,SAAS,OAAO;AACd,eAAK,YAAY;AACjB,eAAK,KAAK,+DAA+DA,gBAAe,KAAK,CAAC,GAAG;AACjG,eAAK,MAAM,iBAAiBA,gBAAe,KAAK,CAAC,8BAA8B;AAAA,QACjF;AAAA,MACF;AAEA,YAAM,iBAAiB,SAAS,cAAc;AAAA,QAC5C,KAAK,KAAK,QAAQ;AAAA,QAClB,KAAK;AAAA,QACL,OAAO,KAAK,QAAQ;AAAA,QACpB,QAAQ,KAAK,QAAQ;AAAA,QACrB,aAAa,CAAC,SAAS,KAAK,YAAY,IAAI;AAAA,QAC5C,gBAAgB,MAAM,KAAK,WAAW;AAAA,QACtC,cAAc,CAAC,SAAS,KAAK,aAAa,IAAI;AAAA,QAC9C,iBAAiB,MAAM,KAAK,YAAY;AAAA,MAC1C,CAAC;AAAA,IACH,SAAS,OAAO;AACd,mBAAa;AAAA,IACf,UAAE;AACA,WAAK,UAAU;AACf,WAAK,sBAAsB;AAC3B,WAAK,YAAY;AACjB,YAAM,KAAK,MAAM,KAAK,EAAE,MAAM,MAAM,MAAS;AAE7C,UAAI,KAAK,gBAAgB;AACvB,YAAI;AACF,gBAAM,KAAK,eAAe,KAAK,KAAK,KAAK;AAAA,QAC3C,SAAS,OAAO;AACd,6BAAmB;AACnB,cAAI,YAAY;AACd,iBAAK,MAAM,wBAAwBA,gBAAe,KAAK,CAAC,GAAG;AAAA,UAC7D;AAAA,QACF;AAAA,MACF;AAEA,UAAI,KAAK,UAAU;AACjB,YAAI;AACF,gBAAM,KAAK,SAAS,KAAK;AAAA,QAC3B,SAAS,OAAO;AACd,yBAAe;AACf,cAAI,cAAc,kBAAkB;AAClC,iBAAK,MAAM,oBAAoBA,gBAAe,KAAK,CAAC,GAAG;AAAA,UACzD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,QAAI,YAAY;AACd,YAAM;AAAA,IACR;AAEA,QAAI,kBAAkB;AACpB,YAAM;AAAA,IACR;AAEA,QAAI,cAAc;AAChB,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,eACE,QACA,OAAmB,WACnB,UAAsC,CAAC,GAC/B;AACR,WAAO,KAAK,oBAAoB,QAAQ,MAAM,UAAU,OAAO,EAAE;AAAA,EACnE;AAAA,EAEA,WAAqB;AACnB,WAAO;AAAA,MACL,iBAAiB,KAAK,MAAM;AAAA,MAC5B,cAAc,KAAK,MAAM;AAAA,MACzB,cAAc,KAAK,cAAc;AAAA,MACjC,WAAW,KAAK;AAAA,MAChB,mBAAmB,KAAK,MAAM;AAAA,MAC9B,iBAAiB,KAAK,MAAM;AAAA,IAC9B;AAAA,EACF;AAAA,EAEQ,MAAM,SAAuB;AACnC,QAAI,CAAC,KAAK,QAAQ,OAAO;AACvB;AAAA,IACF;AAEA,SAAK,aAAa,OAAO;AAAA,EAC3B;AAAA,EAEQ,KAAK,SAAuB;AAClC,SAAK,aAAa,YAAY,OAAO,EAAE;AAAA,EACzC;AAAA,EAEQ,aAAa,SAAuB;AAC1C,UAAM,OAAO,SAAS,OAAO;AAC7B,YAAQ,OAAO,MAAM,GAAG,IAAI;AAAA,CAAI;AAEhC,QAAI,CAAC,KAAK,QAAQ,SAAS;AACzB;AAAA,IACF;AAEA,cAAUC,SAAQ,KAAK,QAAQ,OAAO,GAAG,EAAE,WAAW,KAAK,CAAC;AAC5D,mBAAe,KAAK,QAAQ,SAAS,GAAG,IAAI;AAAA,GAAM,MAAM;AAAA,EAC1D;AAAA,EAEA,MAAc,oBAAmC;AAC/C,QAAI,KAAK,iBAAiB,CAAC,KAAK,gBAAgB;AAC9C;AAAA,IACF;AAEA,UAAM,cAAc,MAAM,KAAK,eAAe,WAAW;AACzD,eAAW,SAAS,YAAY,SAAS,GAAG;AAC1C,UAAI,KAAK,UAAU,WAAW,MAAM,QAAQ,MAAM,IAAI,GAAG;AACvD,aAAK,MAAM,oCAAoC,aAAa,MAAM,MAAM,CAAC,EAAE;AAC3E;AAAA,MACF;AAEA,WAAK,MAAM,SAAS,MAAM,QAAQ,MAAM,MAAM;AAAA,QAC5C,WAAW,MAAM;AAAA,QACjB,UAAU,MAAM;AAAA,QAChB,MAAM,MAAM;AAAA,QACZ,QAAQ,MAAM;AAAA,QACd,OAAO,MAAM;AAAA,MACf,CAAC;AAAA,IACH;AAEA,SAAK,gBAAgB;AAAA,EACvB;AAAA,EAEA,MAAc,eAA8B;AAC1C,QAAI,CAAC,KAAK,UAAU;AAClB;AAAA,IACF;AAEA,UAAM,KAAK,SAAS,KAAK;AAAA,EAC3B;AAAA,EAEQ,cAAc,OAAe,QAA0C;AAC7E,QAAI,MAAM,WAAW,GAAG;AACtB;AAAA,IACF;AAEA,UAAM,kBAAkB,WAAW,UAAU,6BAA6B,KAAK,IAAI;AACnF,UAAM,aACJ,WAAW,SACP,oBAAoB,eAAe,IACnC,WAAW,UACT,oBAAoB,eAAe,KAClC,MAAM;AACP,YAAM,aAAa,KAAK,QAAQ,mBAAmB;AACnD,YAAM,aAAa,oBAAoB,GAAG,KAAK,iBAAiB,MAAM,CAAC,GAAG,eAAe,EAAE;AAC3F,WAAK,iBAAiB,MAAM,IAAI,WAAW,MAAM,CAAC,UAAU;AAC5D,aAAO,KAAK,iBAAiB,MAAM;AAAA,IACrC,GAAG;AAET,QAAI,WAAW,WAAW,GAAG;AAC3B;AAAA,IACF;AAEA,UAAM,WAAW,WAAW,SAAS,KAAK,eAAe,KAAK;AAE9D,eAAW,YAAY,SAAS,OAAO,UAAU,GAAG;AAClD,UAAI,SAAS,MAAM,WAAW,UAAU,GAAG;AACzC;AAAA,MACF;AAEA,YAAM,SAAS,KAAK,oBAAoB,SAAS,OAAO,SAAS,MAAM,MAAM;AAC7E,UAAI,OAAO,SAAS;AAClB,aAAK,MAAM,mBAAmB;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,aAAqB;AAC3B,QAAI,KAAK,QAAQ,QAAQ;AACvB,aAAO;AAAA,IACT;AAEA,WAAO,KAAK,YAAY,MAAM,EAAE;AAAA,EAClC;AAAA,EAEQ,cAAsB;AAC5B,QAAI,KAAK,QAAQ,QAAQ;AACvB,aAAO;AAAA,IACT;AAEA,UAAM,WAAW,KAAK,eAAe,MAAM;AAC3C,SAAK,MAAM,mBAAmB,SAAS;AACvC,WAAO,SAAS;AAAA,EAClB;AAAA,EAEQ,YAAY,MAAsB;AACxC,SAAK,cAAc,MAAM,OAAO;AAEhC,QAAI,KAAK,QAAQ,QAAQ;AACvB,aAAO;AAAA,IACT;AAEA,UAAM,SAAS,KAAK,YAAY,aAAa,IAAI;AACjD,QAAI,WAAW,MAAM;AACnB,WAAK,MAAM,gBAAgB;AAAA,IAC7B;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,aAAa,MAAsB;AACzC,QAAI,KAAK,QAAQ,QAAQ;AACvB,aAAO;AAAA,IACT;AAEA,UAAM,WAAW,KAAK,eAAe,KAAK,IAAI;AAC9C,SAAK,MAAM,mBAAmB,SAAS;AACvC,WAAO,SAAS;AAAA,EAClB;AAAA,EAEQ,uBAAuB,MAAoB;AACjD,SAAK,cAAc,MAAM,OAAO;AAAA,EAClC;AAAA,EAEQ,YAAY,MAA0B;AAC5C,QAAI,KAAK,WAAW,GAAG;AACrB,aAAO;AAAA,IACT;AAEA,UAAM,eAAe,KAAK,IAAI,CAAC,KAAK,UAAU;AAC5C,UAAI,wBAAwB,KAAK,QAAQ,CAAC,CAAC,GAAG;AAC5C,eAAO;AAAA,MACT;AAEA,WAAK,cAAc,KAAK,MAAM;AAC9B,aAAO;AAAA,QACL;AAAA,QACA,KAAK,MACF,sBAAsB,EACtB,IAAI,CAAC,CAAC,QAAQ,MAAM,OAAO;AAAA,UAC1B;AAAA,UACA;AAAA,QACF,EAAE;AAAA,MACN,EAAE;AAAA,IACJ,CAAC;AAED,WAAO,KAAK,QAAQ,SAAS,OAAO;AAAA,EACtC;AAAA,EAEQ,oBACN,QACA,MACA,QACA,UAAsC,CAAC,GACf;AACxB,QAAI,WAAW,YAAY,KAAK,UAAU,WAAW,QAAQ,IAAI,GAAG;AAClE,WAAK,MAAM,GAAG,MAAM,6BAA6B,aAAa,MAAM,CAAC,EAAE;AACvE,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO;AAAA,MACT;AAAA,IACF;AAEA,UAAM,mBAAmB,KAAK,MAAM;AACpC,UAAM,QAAQ,KAAK,MAAM,SAAS,QAAQ,MAAM;AAAA,MAC9C,MAAM,QAAQ;AAAA,MACd;AAAA,IACF,CAAC;AACD,UAAM,UAAU,KAAK,MAAM,aAAa;AACxC,SAAK,UAAU,aAAa,QAAQ,MAAM;AAAA,MACxC,MAAM,QAAQ;AAAA,MACd;AAAA,IACF,CAAC;AAED,QAAI,SAAS;AACX,WAAK,MAAM,GAAG,MAAM,qBAAqB,aAAa,MAAM,CAAC,OAAO,KAAK,EAAE;AAAA,IAC7E;AAEA,WAAO,EAAE,SAAS,MAAM;AAAA,EAC1B;AAAA,EAEQ,wBAA8B;AACpC,SAAK,iBAAiB,QAAQ;AAC9B,SAAK,iBAAiB,QAAQ;AAAA,EAChC;AACF;AAEA,SAAS,wBAAwB,aAA+B;AAC9D,SAAO,CAAC,MAAM,MAAM,OAAO,aAAa,QAAQ,EAAE,SAAS,eAAe,EAAE;AAC9E;;;AgB7xBA,SAAS,aAAAC,YAAW,cAAAC,mBAAkB;AACtC,SAAS,SAAAC,QAAO,YAAAC,WAAU,aAAAC,kBAAiB;AAC3C,SAAS,WAAAC,gBAAe;AACxB,SAAS,WAAAC,UAAS,QAAAC,aAAY;AAU9B,IAAM,mBAAmB;AAClB,IAAM,sBAAsBC,MAAKC,SAAQ,GAAG,QAAQ,aAAa;AACjE,IAAM,6BAA6B;AAoDnC,SAAS,sBAAiC;AAC/C,SAAO;AAAA,IACL,KAAK;AAAA,MACH,aAAa;AAAA,MACb,WAAW;AAAA,IACb;AAAA,IACA,YAAY;AAAA,MACV,WAAW;AAAA,IACb;AAAA,IACA,gBAAgB,CAAC;AAAA,IACjB,WAAW;AAAA,MACT,UAAU;AAAA,MACV,SAAS;AAAA,MACT,SAAS;AAAA,MACT,kBAAkB;AAAA,IACpB;AAAA,IACA,SAAS;AAAA,MACP,OAAO;AAAA,IACT;AAAA,IACA,SAAS;AAAA,MACP,SAAS;AAAA,MACT,OAAO;AAAA,QACL,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,UAAU;AAAA,MACZ;AAAA,IACF;AAAA,IACA,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,WAAW;AAAA,IACb;AAAA,IACA,QAAQ;AAAA,MACN,SAAS;AAAA,MACT,sBAAsB;AAAA,MACtB,SAAS;AAAA,MACT,QAAQ;AAAA,IACV;AAAA,EACF;AACF;AAEO,SAASC,gBAAe,MAAsB;AACnD,MAAI,SAAS,KAAK;AAChB,WAAOD,SAAQ;AAAA,EACjB;AAEA,MAAI,KAAK,WAAW,IAAI,GAAG;AACzB,WAAOD,MAAKC,SAAQ,GAAG,KAAK,MAAM,CAAC,CAAC;AAAA,EACtC;AAEA,SAAO;AACT;AAEO,SAAS,kBAAkB,MAAuB;AACvD,SAAOC,gBAAe,QAAQ,mBAAmB;AACnD;AAEA,eAAsB,WAAW,MAAsC;AACrE,QAAM,eAAe,kBAAkB,IAAI;AAE3C,MAAI,CAACC,YAAW,YAAY,GAAG;AAC7B,WAAO;AAAA,MACL,QAAQ,oBAAoB;AAAA,MAC5B,QAAQ;AAAA,MACR,MAAM;AAAA,IACR;AAAA,EACF;AAEA,MAAI;AAEJ,MAAI;AACF,aAAS,KAAK,MAAM,MAAMC,UAAS,cAAc,MAAM,CAAC;AAAA,EAC1D,SAAS,OAAO;AACd,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,UAAM,IAAI,MAAM,0BAA0B,OAAO,EAAE;AAAA,EACrD;AAEA,SAAO;AAAA,IACL,QAAQ,YAAY,MAAM;AAAA,IAC1B,QAAQ;AAAA,IACR,MAAM;AAAA,EACR;AACF;AAEA,eAAsB,WAAW,QAAmB,MAA8B;AAChF,QAAM,eAAe,kBAAkB,IAAI;AAC3C,QAAM,UAAU,GAAG,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA;AAElD,QAAMC,OAAMC,SAAQ,YAAY,GAAG,EAAE,WAAW,KAAK,CAAC;AACtD,QAAMC,WAAU,cAAc,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjE,EAAAC,WAAU,cAAc,gBAAgB;AAC1C;AAEA,SAAS,YAAY,KAAyB;AAC5C,MAAI,CAACC,UAAS,GAAG,GAAG;AAClB,UAAM,IAAI,MAAM,+CAA+C;AAAA,EACjE;AAEA,QAAM,SAAS,oBAAoB;AAEnC,MAAI,eAAe,KAAK;AACtB,UAAM,YAAYC,cAAa,IAAI,WAAW,WAAW;AAEzD,QAAI,cAAc,WAAW;AAC3B,aAAO,UAAU,WAAWC,eAAc,UAAU,UAAU,oBAAoB;AAAA,IACpF;AAEA,QAAI,aAAa,WAAW;AAC1B,aAAO,UAAU,UAAUA,eAAc,UAAU,SAAS,mBAAmB;AAAA,IACjF;AAEA,QAAI,aAAa,WAAW;AAC1B,aAAO,UAAU,UAAUA,eAAc,UAAU,SAAS,mBAAmB;AAAA,IACjF;AAEA,QAAI,sBAAsB,WAAW;AACnC,aAAO,UAAU,mBAAmB;AAAA,QAClC,UAAU;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,SAAS,KAAK;AAChB,UAAM,MAAMD,cAAa,IAAI,KAAK,KAAK;AAEvC,QAAI,iBAAiB,KAAK;AACxB,aAAO,IAAI,cAAc,sBAAsB,IAAI,aAAa,iBAAiB;AAAA,IACnF;AAEA,QAAI,eAAe,KAAK;AACtB,aAAO,IAAI,YAAYE,cAAa,IAAI,WAAW,eAAe;AAAA,IACpE;AAAA,EACF;AAEA,MAAI,gBAAgB,KAAK;AACvB,UAAM,aAAaF,cAAa,IAAI,YAAY,YAAY;AAE5D,QAAI,eAAe,YAAY;AAC7B,aAAO,WAAW,YAAYE,cAAa,WAAW,WAAW,sBAAsB;AAAA,IACzF;AAAA,EACF;AAEA,MAAI,aAAa,KAAK;AACpB,UAAM,UAAUF,cAAa,IAAI,SAAS,SAAS;AAEnD,QAAI,WAAW,SAAS;AACtB,aAAO,QAAQ,QAAQC,eAAc,QAAQ,OAAO,eAAe;AAAA,IACrE;AAAA,EACF;AAEA,MAAI,aAAa,KAAK;AACpB,UAAM,UAAUD,cAAa,IAAI,SAAS,SAAS;AAEnD,QAAI,oBAAoB,SAAS;AAC/B,aAAO,QAAQ,iBAAiBC,eAAc,QAAQ,gBAAgB,wBAAwB;AAAA,IAChG;AAEA,QAAI,eAAe,SAAS;AAC1B,aAAO,QAAQ,YAAYC,cAAa,QAAQ,WAAW,mBAAmB;AAAA,IAChF;AAAA,EACF;AAEA,MAAI,YAAY,KAAK;AACnB,UAAM,SAASF,cAAa,IAAI,QAAQ,QAAQ;AAEhD,QAAI,aAAa,QAAQ;AACvB,aAAO,OAAO,UAAUC,eAAc,OAAO,SAAS,gBAAgB;AAAA,IACxE;AAEA,QAAI,aAAa,QAAQ;AACvB,aAAO,OAAO,UAAU,oBAAoB,OAAO,SAAS,gBAAgB;AAAA,IAC9E;AAEA,QAAI,0BAA0B,QAAQ;AACpC,aAAO,OAAO,uBAAuB;AAAA,QACnC,OAAO;AAAA,QACP;AAAA,MACF;AAAA,IACF;AAEA,QAAI,YAAY,QAAQ;AACtB,aAAO,OAAO,SAASA,eAAc,OAAO,QAAQ,eAAe;AAAA,IACrE;AAAA,EACF;AAEA,MAAI,aAAa,KAAK;AACpB,UAAM,UAAUD,cAAa,IAAI,SAAS,SAAS;AAEnD,QAAI,aAAa,SAAS;AACxB,aAAO,QAAQ,UAAUC,eAAc,QAAQ,SAAS,iBAAiB;AAAA,IAC3E;AAEA,QAAI,WAAW,SAAS;AACtB,YAAM,QAAQD,cAAa,QAAQ,OAAO,eAAe;AAEzD,UAAI,YAAY,OAAO;AACrB,eAAO,QAAQ,MAAM,SAASC,eAAc,MAAM,QAAQ,sBAAsB;AAAA,MAClF;AAEA,UAAI,WAAW,OAAO;AACpB,eAAO,QAAQ,MAAM,QAAQA,eAAc,MAAM,OAAO,qBAAqB;AAAA,MAC/E;AAEA,UAAI,cAAc,OAAO;AACvB,eAAO,QAAQ,MAAM,WAAWA,eAAc,MAAM,UAAU,wBAAwB;AAAA,MACxF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,oBAAoB,KAAK;AAC3B,QAAI,CAAC,MAAM,QAAQ,IAAI,cAAc,GAAG;AACtC,YAAM,IAAI,MAAM,wDAAwD;AAAA,IAC1E;AAEA,WAAO,iBAAiB,IAAI,eAAe,IAAI,CAAC,OAAO,UAAU,mBAAmB,OAAO,KAAK,CAAC;AAAA,EACnG;AAEA,SAAO;AACT;AAEA,SAAS,mBAAmB,OAAgB,OAAoC;AAC9E,QAAM,UAAUD,cAAa,OAAO,kBAAkB,KAAK,GAAG;AAC9D,QAAM,KAAKE,cAAa,QAAQ,IAAI,kBAAkB,KAAK,MAAM;AACjE,QAAM,QAAQA,cAAa,QAAQ,OAAO,kBAAkB,KAAK,SAAS;AAC1E,QAAM,OAAOA,cAAa,QAAQ,MAAM,kBAAkB,KAAK,QAAQ;AAEvE,MAAI,CAAC,aAAa,IAAI,GAAG;AACvB,UAAM,IAAI,MAAM,yCAAyC,KAAK,mBAAmB;AAAA,EACnF;AAEA,MAAI;AACF,QAAI,OAAO,OAAO,GAAG;AAAA,EACvB,SAAS,OAAO;AACd,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,UAAM,IAAI,MAAM,yCAAyC,KAAK,uBAAuB,OAAO,EAAE;AAAA,EAChG;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAASD,eAAc,OAAgB,MAAuB;AAC5D,MAAI,OAAO,UAAU,WAAW;AAC9B,UAAM,IAAI,MAAM,0BAA0B,IAAI,oBAAoB;AAAA,EACpE;AAEA,SAAO;AACT;AAEA,SAAS,mBAAmB,OAAgB,MAAsB;AAChE,MAAI,OAAO,UAAU,YAAY,CAAC,OAAO,SAAS,KAAK,GAAG;AACxD,UAAM,IAAI,MAAM,0BAA0B,IAAI,0BAA0B;AAAA,EAC1E;AAEA,SAAO;AACT;AAEA,SAAS,sBAAsB,OAAgB,MAAsB;AACnE,QAAM,SAAS,mBAAmB,OAAO,IAAI;AAC7C,MAAI,CAAC,OAAO,UAAU,MAAM,KAAK,SAAS,GAAG;AAC3C,UAAM,IAAI,MAAM,0BAA0B,IAAI,6BAA6B;AAAA,EAC7E;AAEA,SAAO;AACT;AAEA,SAAS,oBAAoB,OAAgB,MAA6B;AACxE,MAAI,OAAO,UAAU,YAAY,CAAC,gBAAgB,KAAK,GAAG;AACxD,UAAM,IAAI,MAAM,0BAA0B,IAAI,6BAA6B;AAAA,EAC7E;AAEA,SAAO;AACT;AAEA,SAASD,cAAa,OAAgB,MAAuC;AAC3E,MAAI,CAACD,UAAS,KAAK,GAAG;AACpB,UAAM,IAAI,MAAM,0BAA0B,IAAI,oBAAoB;AAAA,EACpE;AAEA,SAAO;AACT;AAEA,SAASG,cAAa,OAAgB,MAAsB;AAC1D,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,IAAI,MAAM,0BAA0B,IAAI,mBAAmB;AAAA,EACnE;AAEA,SAAO;AACT;AAEA,SAASH,UAAS,OAAkD;AAClE,SAAO,CAAC,CAAC,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;AACrE;;;AC1WA,SAAS,SAAAI,cAAa;AACtB,SAAS,WAAW,cAAAC,mBAAkB;AACtC,SAAS,QAAQ,OAAO,OAAO,SAAAC,QAAO,YAAAC,WAAU,UAAU,UAAAC,SAAQ,IAAI,aAAAC,kBAAiB;AACvF,SAAS,WAAAC,gBAAe;AACxB,SAAS,UAAU,WAAW,WAAAC,UAAS,QAAAC,OAAM,eAAe;AAC5D,SAAS,qBAAqB;AAY9B,IAAM,kBAAkB;AACxB,IAAM,yBAAyB;AAC/B,IAAM,oBAAoB;AAC1B,IAAM,kBAAkB;AA8DxB,eAAsB,mBACpB,QACA,OACA,UAAiC,CAAC,GACN;AAC5B,QAAM,UAAU,cAAc,OAAO;AACrC,QAAM,YAAY,qBAAqB,KAAK;AAC5C,QAAM,WAAqB,CAAC;AAC5B,QAAM,SAAmB,CAAC;AAC1B,MAAI,mBAAmB;AAEvB,aAAW,QAAQ,eAAe;AAChC,UAAM,UAAU,OAAO,QAAQ,WAAW,OAAO,QAAQ,MAAM,IAAI;AACnE,UAAM,SAAS,UACX,MAAM,oBAAoB,MAAM,UAAU,QAAQ,MAAM,IAAI,GAAG,OAAO,IACtE,MAAM,mBAAmB,MAAM,UAAU,QAAQ,MAAM,IAAI,GAAG,SAAS,IAAI;AAE/E,cAAU,QAAQ,MAAM,IAAI,IAAI,OAAO;AACvC,yBAAqB,OAAO;AAC5B,QAAI,OAAO,SAAS;AAClB,eAAS,KAAK,OAAO,OAAO;AAAA,IAC9B;AACA,QAAI,OAAO,OAAO;AAChB,aAAO,KAAK,OAAO,KAAK;AAAA,IAC1B;AAAA,EACF;AAEA,QAAM,eAAe,mBACjB,MAAM,iBAAiB,OAAO,IAC9B,MAAM,iBAAiB,OAAO;AAElC,SAAO;AAAA,IACL,SAAS,gBAAgB,gBAAgB,OAAO,SAAS;AAAA,IACzD;AAAA,IACA,OAAO;AAAA,IACP;AAAA,EACF;AACF;AAEA,eAAsB,sBACpB,OACA,UAAiC,CAAC,GACN;AAC5B,QAAM,UAAU,cAAc,OAAO;AACrC,QAAM,YAAY,qBAAqB,KAAK;AAC5C,QAAM,WAAqB,CAAC;AAE5B,aAAW,QAAQ,eAAe;AAChC,UAAM,UAAU,UAAU,QAAQ,MAAM,IAAI;AAC5C,UAAM,aAAa,MAAM,mBAAmB,MAAM,SAAS,OAAO;AAClE,cAAU,QAAQ,MAAM,IAAI,IAAI,WAAW;AAC3C,QAAI,WAAW,SAAS;AACtB,eAAS,KAAK,WAAW,OAAO;AAAA,IAClC;AAAA,EACF;AAEA,SAAO;AAAA,IACL,SAAS,gBAAgB,OAAO,SAAS;AAAA,IACzC,QAAQ,CAAC;AAAA,IACT,OAAO;AAAA,IACP;AAAA,EACF;AACF;AAEA,eAAsB,sBACpB,QACA,OACA,UAAiC,CAAC,GACH;AAC/B,QAAM,UAAU,cAAc,OAAO;AACrC,QAAM,YAAY,qBAAqB,KAAK;AAC5C,QAAM,WAAqB,CAAC;AAC5B,QAAM,SAAmB,CAAC;AAE1B,aAAW,QAAQ,eAAe;AAChC,UAAM,SAAS,MAAM,mBAAmB,MAAM,UAAU,QAAQ,MAAM,IAAI,GAAG,SAAS,KAAK;AAC3F,cAAU,QAAQ,MAAM,IAAI,IAAI,OAAO;AACvC,QAAI,OAAO,SAAS;AAClB,eAAS,KAAK,OAAO,OAAO;AAAA,IAC9B;AACA,QAAI,OAAO,OAAO;AAChB,aAAO,KAAK,OAAO,KAAK;AAAA,IAC1B;AAAA,EACF;AAEA,QAAM,eAAe,MAAM,iBAAiB,OAAO;AACnD,QAAM,aAAa,gBAAgB,MAAM;AACzC,aAAW,QAAQ,UAAU;AAC7B,aAAW,QAAQ,MAAM,SAAS;AAClC,aAAW,QAAQ,MAAM,QAAQ;AACjC,aAAW,QAAQ,MAAM,WAAW;AAEpC,SAAO;AAAA,IACL,SAAS,gBAAgB,gBAAgB,OAAO,SAAS,KAAK,KAAK,UAAU,OAAO,OAAO,MAAM,KAAK,UAAU,WAAW,OAAO;AAAA,IAClI,QAAQ;AAAA,IACR;AAAA,IACA,OAAO;AAAA,IACP;AAAA,EACF;AACF;AAEA,eAAsB,wBACpB,SACA,MAAyB,QAAQ,KACjC,UAAkD,CAAC,GAClC;AACjB,MACE,IAAI,+BAA+B,OACnC,IAAI,qBAAqB,WACzB,CAAC,cAAc,SAAS,OAAsB,GAC9C;AACA,WAAO;AAAA,EACT;AAEA,QAAM,kBAAkB,IAAI,0BAA0B,KAAK;AAC3D,QAAM,cAAc,IAAI,0BAA0B,KAAK;AACvD,MAAI,mBAAmB,oBAAoB,eAAgB,MAAM,iBAAiB,eAAe,GAAI;AACnG,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,QAAQ,WAAW,IAAI,QAAQC,SAAQ;AACvD,QAAM,gBAAgB,IAAI,yBAAyB,KAAK,KAAKC,MAAK,SAAS,QAAQ,KAAK;AACxF,QAAM,QAAQ,MAAM,iBAAiB,SAAwB,IAAI,QAAQ,QAAQ,IAAI,QAAQ,IAAI;AAAA,IAC/F,aAAa,CAAC,aAAa;AAAA,IAC3B,cAAc,cAAc,CAAC,WAAW,IAAI,CAAC;AAAA,EAC/C,CAAC;AAED,MAAI,MAAM,MAAM,CAAC,GAAG;AAClB,WAAO,MAAM,MAAM,CAAC;AAAA,EACtB;AAEA,QAAM,IAAI;AAAA,IACR,qBAAqB,OAAO,8FAA8F,OAAO;AAAA,EACnI;AACF;AAEA,SAAS,cAAc,SAAgD;AACrE,QAAM,MAAM,QAAQ,OAAO,QAAQ;AACnC,QAAM,UAAU,QAAQ,WAAW,IAAI,QAAQD,SAAQ;AACvD,SAAO;AAAA,IACL,YAAY,QAAQ,cAAc,sBAAsB;AAAA,IACxD,eAAeC,MAAK,SAAS,QAAQ,SAAS;AAAA,IAC9C;AAAA,IACA;AAAA,IACA,eAAeA,MAAK,SAAS,QAAQ,KAAK;AAAA,IAC1C,UAAU,QAAQ,YAAY,QAAQ;AAAA,IACtC,KAAK,QAAQ,OAAO,KAAK;AAAA,IACzB,WAAW,QAAQ,aAAa,IAAI;AAAA,IACpC,aAAa,QAAQ,eAAe;AAAA,EACtC;AACF;AAEA,SAAS,wBAAgC;AACvC,QAAM,iBAAiB;AAAA,IACrB,cAAc,IAAI,IAAI,qBAAqB,YAAY,GAAG,CAAC;AAAA,IAC3D,cAAc,IAAI,IAAI,aAAa,YAAY,GAAG,CAAC;AAAA,IACnD,QAAQ,KAAK,CAAC,IAAI,QAAQ,QAAQ,KAAK,CAAC,CAAC,IAAI;AAAA,EAC/C,EAAE,OAAO,CAAC,UAA2B,OAAO,UAAU,YAAY,MAAM,SAAS,CAAC;AAElF,QAAM,YAAY,eAAe,KAAK,CAAC,kBAAkBC,YAAW,aAAa,CAAC;AAClF,MAAI,WAAW;AACb,WAAO;AAAA,EACT;AAEA,SAAO,QAAQD,MAAK,QAAQ,IAAI,GAAG,QAAQ,QAAQ,CAAC;AACtD;AAEA,eAAe,oBACb,MACA,SACA,SAC8B;AAC9B,QAAM,cAAc,MAAM,iBAAiB,MAAM,QAAQ,IAAI,QAAQ,QAAQ,IAAI,QAAQ,IAAI;AAAA,IAC3F;AAAA,IACA,aAAa,CAAC,QAAQ,aAAa;AAAA,EACrC,CAAC;AACD,QAAM,mBAAmB,uBAAuB,MAAM,YAAY,SAAS;AAE3E,MAAI,QAAQ,aAAa,QAAQ,eAAgB,MAAM,iBAAiB,QAAQ,WAAW,GAAI;AAC7F,QAAI,QAAQ,YAAY,WAAW,QAAQ,aAAa,GAAG;AACzD,YAAME,aAAY,MAAM,uBAAuB,MAAM,SAAS,aAAa,OAAO;AAClF,UAAI,oBAAoB,CAACA,WAAU,SAAS;AAC1C,QAAAA,WAAU,UAAU;AAAA,MACtB;AACA,aAAOA;AAAA,IACT;AAEA,UAAM,YAAY,MAAM;AAAA,MACtB;AAAA,MACA,QAAQ;AAAA,MACR,QAAQ,uBAAuB,QAAQ;AAAA,MACvC,QAAQ;AAAA,MACR;AAAA,IACF;AACA,QAAI,oBAAoB,CAAC,UAAU,SAAS;AAC1C,gBAAU,UAAU;AAAA,IACtB;AACA,WAAO;AAAA,EACT;AAEA,MAAI,YAAY,aAAc,MAAM,yBAAyB,YAAY,WAAW,QAAQ,OAAO,GAAI;AACrG,UAAM,YAAY,MAAM,uBAAuB,MAAM,YAAY,WAAW,YAAY,WAAW,QAAW,OAAO;AACrH,QAAI,oBAAoB,CAAC,UAAU,SAAS;AAC1C,gBAAU,UAAU;AAAA,IACtB;AACA,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,MAAM,uBAAuB,MAAM,SAAS,aAAa,OAAO;AAClF,MAAI,oBAAoB,CAAC,UAAU,SAAS;AAC1C,cAAU,UAAU;AAAA,EACtB;AACA,SAAO;AACT;AAEA,eAAe,uBACb,MACA,aACA,qBACA,mBACA,SAC8B;AAC9B,QAAM,aAAa,qBAAqBF,MAAK,QAAQ,eAAe,MAAM,SAAS,mBAAmB,CAAC;AACvG,QAAM,UAAU,oBAAoB,MAAM,aAAa,SAAS,UAAU;AAC1E,MAAI;AAEJ,MAAI,qBAAqB,CAACC,YAAW,iBAAiB,GAAG;AACvD,cAAU,GAAG,IAAI;AAAA,EACnB;AAEA,MAAI,MAAM,iBAAiB,WAAW,GAAG;AACvC,UAAM,oBAAoB,aAAa,OAAO;AAC9C,WAAO;AAAA,MACL,SAAS,kBAAkB;AAAA,QACzB;AAAA,QACA,WAAW;AAAA,QACX,WAAW;AAAA,QACX;AAAA,QACA;AAAA,QACA,WAAW;AAAA,MACb,GAAG,OAAO;AAAA,MACV,gBAAgB;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAEA,QAAME,OAAMC,SAAQ,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AACpD,MAAIH,YAAW,UAAU,GAAG;AAC1B,UAAM,GAAG,YAAY,EAAE,OAAO,MAAM,WAAW,KAAK,CAAC;AAAA,EACvD;AAEA,MAAI,UAAU;AACd,MAAI;AACF,UAAMI,QAAO,aAAa,UAAU;AACpC,cAAU;AACV,UAAM,oBAAoB,aAAa,OAAO;AAE9C,WAAO;AAAA,MACL,SAAS,kBAAkB;AAAA,QACzB;AAAA,QACA,WAAW;AAAA,QACX,WAAW;AAAA,QACX;AAAA,QACA;AAAA,QACA,WAAW;AAAA,MACb,GAAG,OAAO;AAAA,MACV,gBAAgB;AAAA,MAChB;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,QAAI,SAAS;AACX,YAAM,GAAG,aAAa,EAAE,OAAO,KAAK,CAAC,EAAE,MAAM,MAAM,MAAS;AAC5D,YAAMA,QAAO,YAAY,WAAW,EAAE,MAAM,MAAM,MAAS;AAAA,IAC7D;AAEA,WAAO;AAAA,MACL,OAAO,GAAG,IAAI,0CAA0CC,gBAAe,KAAK,CAAC;AAAA,MAC7E,SAAS,kBAAkB;AAAA,QACzB,WAAW;AAAA,QACX,WAAW,mBAAmBA,gBAAe,KAAK,CAAC;AAAA,QACnD;AAAA,QACA,WAAW;AAAA,MACb,GAAG,OAAO;AAAA,MACV,gBAAgB;AAAA,IAClB;AAAA,EACF;AACF;AAEA,eAAe,uBACb,MACA,SACA,aACA,SAC8B;AAC9B,MAAI,QAAQ,aAAa,QAAQ,eAAe,CAAC,QAAQ,YAAY,WAAW,QAAQ,aAAa,GAAG;AACtG,UAAM,UAAU,MAAM,mBAAmB,MAAM,SAAS,SAAS,KAAK;AACtE,QAAI,QAAQ,OAAO;AACjB,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,cAAcN,MAAK,QAAQ,eAAe,IAAI;AACpD,QAAMG,OAAM,QAAQ,eAAe,EAAE,WAAW,KAAK,CAAC;AACtD,QAAM,oBAAoB,aAAa,oBAAoB,MAAM,aAAa,OAAO,CAAC;AAEtF,QAAM,eAAyB,CAAC;AAChC,MAAI,CAAC,YAAY,WAAW;AAC1B,iBAAa,KAAK,GAAG,IAAI,gFAAgF;AAAA,EAC3G;AACA,QAAM,mBAAmB,uBAAuB,MAAM,YAAY,SAAS;AAC3E,MAAI,kBAAkB;AACpB,iBAAa,KAAK,gBAAgB;AAAA,EACpC;AAEA,SAAO;AAAA,IACL,SAAS,kBAAkB;AAAA,MACzB,WAAW;AAAA,MACX,WAAW,aAAa,WAAW,IAAI,SAAY,aAAa,KAAK,GAAG;AAAA,MACxE;AAAA,MACA,qBAAqB,YAAY;AAAA,MACjC,WAAW;AAAA,IACb,GAAG,OAAO;AAAA,IACV,gBAAgB;AAAA,IAChB,SAAS,aAAa,WAAW,IAAI,SAAY,aAAa,KAAK,GAAG;AAAA,EACxE;AACF;AAEA,eAAe,mBACb,MACA,SACA,SACA,eAC8B;AAC9B,QAAM,cAAc,QAAQ;AAC5B,QAAM,aAAa,QAAQ;AAC3B,QAAM,sBAAsB,QAAQ;AAEpC,MAAI,eAAe,YAAY,WAAW,QAAQ,aAAa,GAAG;AAChE,QAAIF,YAAW,WAAW,GAAG;AAC3B,YAAM,GAAG,aAAa,EAAE,OAAO,KAAK,CAAC,EAAE,MAAM,MAAM,MAAS;AAAA,IAC9D;AAEA,UAAMM,eAAc,MAAM,iBAAiB,MAAM,QAAQ,IAAI,QAAQ,QAAQ,IAAI,QAAQ,IAAI;AAAA,MAC3F;AAAA,MACA,aAAa,CAAC,QAAQ,aAAa;AAAA,IACrC,CAAC;AAED,WAAO;AAAA,MACL,SAAS,kBAAkB;AAAA,QACzB,WAAW;AAAA,QACX,WAAW;AAAA,QACX,qBAAqBA,aAAY,aAAa;AAAA,QAC9C,WAAW;AAAA,MACb,GAAG,OAAO;AAAA,MACV,gBAAgB;AAAA,IAClB;AAAA,EACF;AAEA,MAAI,eAAe,cAAcN,YAAW,UAAU,GAAG;AACvD,UAAM,mBAAmB,MAAM,iBAAiB,WAAW;AAE3D,QAAI;AACF,UAAI,kBAAkB;AACpB,cAAM,GAAG,aAAa,EAAE,OAAO,KAAK,CAAC;AACrC,cAAMI,QAAO,YAAY,uBAAuB,WAAW;AAAA,MAC7D,WAAW,CAACJ,YAAW,uBAAuB,WAAW,GAAG;AAC1D,cAAMI,QAAO,YAAY,uBAAuB,WAAW;AAAA,MAC7D,OAAO;AACL,cAAM,GAAG,YAAY,EAAE,OAAO,MAAM,WAAW,KAAK,CAAC;AAAA,MACvD;AAEA,aAAO;AAAA,QACL,SAAS,kBAAkB;AAAA,UACzB,WAAW;AAAA,UACX,WAAW;AAAA,UACX,qBAAqB,uBAAuB;AAAA,UAC5C,WAAW;AAAA,QACb,GAAG,OAAO;AAAA,QACV,gBAAgB;AAAA,MAClB;AAAA,IACF,SAAS,OAAO;AACd,aAAO;AAAA,QACL,OAAO,GAAG,IAAI,yCAAyCC,gBAAe,KAAK,CAAC;AAAA,QAC5E,SAAS,kBAAkB;AAAA,UACzB;AAAA,UACA,WAAW;AAAA,UACX,WAAW,mBAAmBA,gBAAe,KAAK,CAAC;AAAA,UACnD;AAAA,UACA,qBAAqB,uBAAuB;AAAA,UAC5C,WAAW;AAAA,QACb,GAAG,OAAO;AAAA,QACV,gBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,cAAc,MAAM,iBAAiB,MAAM,QAAQ,IAAI,QAAQ,QAAQ,IAAI,QAAQ,IAAI;AAAA,IAC3F;AAAA,IACA,aAAa,CAAC,QAAQ,aAAa;AAAA,EACrC,CAAC;AAED,SAAO;AAAA,IACL,SAAS,kBAAkB;AAAA,MACzB,WAAW;AAAA,MACX,WAAW;AAAA,MACX,qBAAqB,YAAY,aAAa;AAAA,MAC9C,WAAW;AAAA,IACb,GAAG,OAAO;AAAA,IACV,gBAAgB;AAAA,EAClB;AACF;AAEA,eAAe,mBACb,MACA,SACA,SAC8B;AAC9B,QAAM,cAAc;AAAA,IAClB,GAAG;AAAA,EACL;AAEA,QAAM,cAAc,MAAM,iBAAiB,MAAM,QAAQ,IAAI,QAAQ,QAAQ,IAAI,QAAQ,IAAI;AAAA,IAC3F;AAAA,IACA,aAAa,CAAC,QAAQ,aAAa;AAAA,IACnC,cAAc,QAAQ,cAAc,CAAC,QAAQ,WAAW,IAAI,CAAC;AAAA,EAC/D,CAAC;AAED,MAAI,CAAC,QAAQ,aAAa;AACxB,gBAAY,YAAY;AACxB,gBAAY,sBAAsB,YAAY;AAC9C,gBAAY,YAAY;AACxB,WAAO;AAAA,MACL,SAAS;AAAA,MACT,gBAAgB;AAAA,IAClB;AAAA,EACF;AAEA,QAAM,YAAY,MAAM,iBAAiB,QAAQ,WAAW;AAC5D,QAAM,eAAyB,CAAC;AAChC,QAAM,mBAAmB,uBAAuB,MAAM,YAAY,SAAS;AAC3E,MAAI,kBAAkB;AACpB,iBAAa,KAAK,gBAAgB;AAAA,EACpC;AACA,MAAI,QAAQ,YAAY,WAAW,QAAQ,aAAa,KAAK,CAAC,YAAY,WAAW;AACnF,iBAAa,KAAK,GAAG,IAAI,0CAA0C;AAAA,EACrE;AACA,MAAI,CAAC,WAAW;AACd,iBAAa,KAAK,GAAG,IAAI,kDAAkD;AAAA,EAC7E;AAEA,cAAY,YAAY;AACxB,cAAY,sBAAsB,YAAY,aAAa,QAAQ;AACnE,cAAY,YAAY,aAAa,WAAW,IAAI,SAAY,aAAa,KAAK,GAAG;AACrF,SAAO;AAAA,IACL,SAAS;AAAA,IACT,gBAAgB,QAAQ,YAAY,WAAW,QAAQ,aAAa;AAAA,IACpE,SAAS,aAAa,WAAW,IAAI,SAAY,aAAa,KAAK,GAAG;AAAA,EACxE;AACF;AAEA,eAAe,yBAAyB,aAAqB,SAAmC;AAC9F,QAAM,aAAa,QAAQ,WAAW;AACtC,MAAI,CAAC,WAAW,WAAW,QAAQ,OAAO,CAAC,GAAG;AAC5C,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,WAAW,YAAY;AACrC,MACE,MAAM,SAAS,mBAAmB,KAClC,MAAM,SAAS,YAAY,KAC3B,MAAM,SAAS,qBAAqB,GACpC;AACA,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,QAAQ,MAAM,MAAM,WAAW;AACrC,QAAI,MAAM,eAAe,GAAG;AAC1B,YAAM,SAAS,QAAQF,SAAQ,WAAW,GAAG,MAAM,SAAS,WAAW,CAAC,EAAE,YAAY;AACtF,aAAO,OAAO,SAAS,gBAAgB;AAAA,IACzC;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,eAAe,iBACb,MACA,WACA,UAII,CAAC,GACqB;AAC1B,QAAM,cAAc,UACjB,MAAM,SAAS,EACf,IAAI,CAAC,UAAU,MAAM,KAAK,CAAC,EAC3B,OAAO,OAAO,EACd,IAAI,CAAC,UAAU,QAAQ,KAAK,CAAC;AAChC,QAAM,cAAc,IAAI,KAAK,QAAQ,eAAe,CAAC,GAAG,IAAI,CAAC,UAAU,QAAQ,KAAK,CAAC,CAAC;AACtF,QAAM,eAAe,IAAI,KAAK,QAAQ,gBAAgB,CAAC,GAAG,OAAO,OAAO,EAAE,IAAI,CAAC,UAAU,QAAQ,KAAK,CAAC,CAAC;AACxG,QAAM,QAAkB,CAAC;AAEzB,aAAW,aAAa,aAAa;AACnC,QAAI,YAAY,IAAI,SAAS,GAAG;AAC9B;AAAA,IACF;AAEA,UAAM,YAAY,QAAQ,WAAW,IAAI;AACzC,QAAI,aAAa,IAAI,SAAS,GAAG;AAC/B;AAAA,IACF;AAEA,QAAI,CAAE,MAAM,iBAAiB,SAAS,GAAI;AACxC;AAAA,IACF;AAEA,UAAM,KAAK,SAAS;AAAA,EACtB;AAEA,QAAM,kBAAkB,MAAM,oBAAoB,MAAM,QAAQ,OAAO;AACvE,SAAO;AAAA,IACL,WAAW,gBAAgB;AAAA,IAC3B,WAAW,MAAM,CAAC;AAAA,IAClB;AAAA,EACF;AACF;AAEA,eAAe,oBACb,MACA,SAC6C;AAC7C,MAAI,CAAC,SAAS,WAAW;AACvB,WAAO,CAAC;AAAA,EACV;AAEA,MAAI;AACF,UAAM,SAAS,MAAM,QAAQ,YAAY,QAAQ,WAAW,CAAC,QAAQ,WAAW,IAAI,EAAE,GAAG;AAAA,MACvF,KAAK,QAAQ;AAAA,IACf,CAAC;AACD,QAAI,OAAO,aAAa,GAAG;AACzB,aAAO,CAAC;AAAA,IACV;AAEA,UAAM,YAAY,OAAO,OACtB,MAAM,OAAO,EACb,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,KAAK,CAAC,SAAS,KAAK,SAAS,CAAC;AACjC,QAAI,CAAC,WAAW;AACd,aAAO,CAAC;AAAA,IACV;AAEA,QAAI,uBAAuB,KAAK,SAAS,GAAG;AAC1C,aAAO,EAAE,WAAW,QAAQ;AAAA,IAC9B;AAEA,QAAI,gBAAgB,KAAK,SAAS,GAAG;AACnC,aAAO,EAAE,WAAW,WAAW;AAAA,IACjC;AAAA,EACF,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AAEA,SAAO,CAAC;AACV;AAEA,eAAe,iBAAiB,SAA2C;AACzE,QAAM,UAAU,MAAM,oBAAoB,OAAO;AACjD,QAAM,QAAQ,gBAAgB;AAC9B,MAAI,UAAU;AAEd,aAAW,UAAU,SAAS;AAC5B,UAAM,UAAUH,YAAW,MAAM,IAAI,MAAMO,UAAS,QAAQ,MAAM,IAAI;AACtE,UAAM,OAAO,gBAAgB,OAAO,EAAE,QAAQ,QAAQ,EAAE;AACxD,UAAM,UAAU,KAAK,WAAW,IAAI,GAAG,KAAK;AAAA,IAAO,GAAG,IAAI;AAAA;AAAA,EAAO,KAAK;AAAA;AAEtE,QAAI,YAAY,SAAS;AACvB;AAAA,IACF;AAEA,UAAML,OAAMC,SAAQ,MAAM,GAAG,EAAE,WAAW,KAAK,CAAC;AAChD,UAAMK,WAAU,QAAQ,SAAS,MAAM;AACvC,cAAU;AAAA,EACZ;AAEA,SAAO;AACT;AAEA,eAAe,iBAAiB,SAA2C;AACzE,QAAM,UAAU,MAAM,oBAAoB,SAAS,IAAI;AACvD,MAAI,UAAU;AAEd,aAAW,UAAU,SAAS;AAC5B,QAAI,CAACR,YAAW,MAAM,GAAG;AACvB;AAAA,IACF;AAEA,UAAM,UAAU,MAAMO,UAAS,QAAQ,MAAM;AAC7C,UAAM,OAAO,gBAAgB,OAAO,EAAE,QAAQ,QAAQ,EAAE;AACxD,UAAM,UAAU,KAAK,WAAW,IAAI,KAAK,GAAG,IAAI;AAAA;AAChD,QAAI,YAAY,SAAS;AACvB;AAAA,IACF;AAEA,UAAMC,WAAU,QAAQ,SAAS,MAAM;AACvC,cAAU;AAAA,EACZ;AAEA,SAAO;AACT;AAEA,eAAe,oBAAoB,SAAyB,qBAAqB,OAA0B;AACzG,QAAM,aAAa;AAAA,IACjBT,MAAK,QAAQ,SAAS,QAAQ;AAAA,IAC9BA,MAAK,QAAQ,SAAS,WAAW;AAAA,IACjCA,MAAK,QAAQ,SAAS,SAAS;AAAA,IAC/BA,MAAK,QAAQ,SAAS,eAAe;AAAA,EACvC;AACA,QAAM,WAAW,WAAW,OAAO,CAAC,WAAWC,YAAW,MAAM,CAAC;AACjE,MAAI,oBAAoB;AACtB,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,SAAS,GAAG;AACvB,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,QAAQ,aAAa;AACvC,MAAI,UAAU,SAAS,MAAM,GAAG;AAC9B,WAAO,CAACD,MAAK,QAAQ,SAAS,SAAS,CAAC;AAAA,EAC1C;AAEA,SAAO,CAACA,MAAK,QAAQ,SAAS,QAAQ,CAAC;AACzC;AAEA,SAAS,kBAA0B;AACjC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAEA,SAAS,gBAAgB,SAAyB;AAChD,QAAM,UAAU,IAAI,OAAO,GAAG,gBAAgB,iBAAiB,CAAC,aAAa,gBAAgB,eAAe,CAAC,QAAQ,GAAG;AACxH,SAAO,QAAQ,QAAQ,SAAS,EAAE;AACpC;AAEA,SAAS,gBAAgB,OAAuB;AAC9C,SAAO,MAAM,QAAQ,uBAAuB,MAAM;AACpD;AAEA,SAAS,oBACP,MACA,aACA,SACA,iBACQ;AACR,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,qCAAqC,cAAc,GAAG,CAAC;AAAA,IACvD,2BAA2B,cAAc,IAAI,CAAC;AAAA,IAC9C,mCAAmC,cAAc,WAAW,CAAC;AAAA,IAC7D,kCAAkC,cAAc,QAAQ,aAAa,CAAC;AAAA,IACtE,mCAAmC,cAAc,mBAAmB,EAAE,CAAC;AAAA,IACvE,QAAQ,cAAc,QAAQ,QAAQ,CAAC,IAAI,cAAc,QAAQ,UAAU,CAAC,IAAI,cAAc,IAAI,CAAC;AAAA,IACnG;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAEA,SAAS,kBACP,OACA,SACyB;AACzB,SAAO;AAAA,IACL,GAAG,qCAAqC;AAAA,IACxC,GAAG;AAAA,IACH,eAAe,QAAQ,IAAI;AAAA,EAC7B;AACF;AAEA,SAAS,uBAAuB,MAAmB,WAA6D;AAC9G,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,EACT;AAEA,SAAO,GAAG,IAAI,oCAAoC,SAAS,2DAA2D,SAAS;AACjI;AAEA,SAAS,cAAc,OAAuB;AAC5C,SAAO,IAAI,MAAM,QAAQ,MAAM,OAAO,CAAC;AACzC;AAEA,eAAe,iBAAiB,UAAoC;AAClE,MAAI,CAACC,YAAW,QAAQ,GAAG;AACzB,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,UAAU,MAAMO,UAAS,UAAU,MAAM;AAC/C,WAAO,QAAQ,SAAS,sBAAsB;AAAA,EAChD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,iBAAiB,MAAgC;AAC9D,MAAI;AACF,UAAM,QAAQ,MAAM,MAAM,IAAI;AAC9B,QAAI,MAAM,YAAY,GAAG;AACvB,aAAO;AAAA,IACT;AACA,UAAM,OAAO,MAAM,UAAU,IAAI;AACjC,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,oBAAoB,MAAc,SAAgC;AAC/E,QAAMC,WAAU,MAAM,SAAS,MAAM;AACrC,QAAM,MAAM,MAAM,eAAe;AACnC;AAEA,eAAe,gBACb,SACA,MACA,SAGoC;AACpC,SAAO,MAAM,IAAI,QAAQ,CAAC,gBAAgB,WAAW;AACnD,UAAM,QAAQC,OAAM,SAAS,MAAM;AAAA,MACjC,KAAK,QAAQ;AAAA,MACb,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,IAClC,CAAC;AACD,QAAI,SAAS;AACb,QAAI,SAAS;AAEb,UAAM,OAAO,GAAG,QAAQ,CAAC,UAA2B;AAClD,gBAAU,MAAM,SAAS;AAAA,IAC3B,CAAC;AACD,UAAM,OAAO,GAAG,QAAQ,CAAC,UAA2B;AAClD,gBAAU,MAAM,SAAS;AAAA,IAC3B,CAAC;AACD,UAAM,GAAG,SAAS,MAAM;AACxB,UAAM,GAAG,SAAS,CAAC,aAAa;AAC9B,qBAAe;AAAA,QACb,UAAU,YAAY;AAAA,QACtB;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAAA,EACH,CAAC;AACH;AAEA,SAAS,gBAAgB,UAA2B,MAAgC;AAClF,SAAO,KAAK,UAAU,QAAQ,MAAM,KAAK,UAAU,IAAI;AACzD;AAEA,SAASJ,gBAAe,OAAwB;AAC9C,SAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAC9D;","names":["record","isRecord","expectString","chmodSync","existsSync","mkdir","readFile","writeFile","homedir","dirname","join","STATE_FILE_MODE","expandHomePath","existsSync","readFile","mkdir","dirname","writeFile","chmodSync","isRecord","expectOptionalString","homedir","join","dirname","cursor","dedupe","chmodSync","existsSync","dirname","join","require","resolve","randomUUID","mkdir","writeFile","join","isRecord","isRecord","resolve","body","headers","mkdir","join","randomUUID","writeFile","chmodSync","existsSync","mkdir","readFile","writeFile","homedir","dirname","join","join","homedir","resolve","existsSync","mkdir","dirname","writeFile","chmodSync","readFile","randomBytes","createHash","randomUUID","randomBytes","toErrorMessage","dirname","chmodSync","existsSync","mkdir","readFile","writeFile","homedir","dirname","join","join","homedir","expandHomePath","existsSync","readFile","mkdir","dirname","writeFile","chmodSync","isRecord","expectObject","expectBoolean","expectString","spawn","existsSync","mkdir","readFile","rename","writeFile","homedir","dirname","join","homedir","join","existsSync","rewritten","mkdir","dirname","rename","toErrorMessage","commandInfo","readFile","writeFile","spawn"]}
|