@jeffreycao/copilot-api 2.3.14 → 2.3.15
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/dist/main.js +1 -1
- package/dist/{server-50anuRGb.js → server-DZ2B4MKu.js} +31 -19
- package/dist/server-DZ2B4MKu.js.map +1 -0
- package/dist/{start-BgjJIp2b.js → start-CCE-hQBT.js} +2 -2
- package/dist/{start-BgjJIp2b.js.map → start-CCE-hQBT.js.map} +1 -1
- package/package.json +1 -1
- package/dist/server-50anuRGb.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-DZ2B4MKu.js","names":["resolveTraceId","decompressFallback","runtimeInitialized","fs","COST_NANOS_PER_UNIT","getHeaderValue","undiciFetch","logger","createCopilotResponses","invalidRequest","logger","uniqueIndexes","logger","logger","handleCompletion","isNonStreaming","handleCompletion","undiciFetch","logger","getContentMetadata","logger","isRecord","handleOutputItemAdded","handleOutputItemDone","parseResponsesStreamEvent","isRecord","getStringField","getConfiguredModelResponsesApiCompactThreshold","isConfiguredContextManagementEnabledForMessages","isConfiguredContextManagementEnabledForResponses","isConfiguredResponsesApiWebSocketEnabled","createCopilotResponses","logger","getCodexModels","createCopilotChatCompletions","createCopilotMessages","createCopilotResponses","logger","MESSAGES_ENDPOINT","logger","isRecord","logger","getCodexModels","logger","logger","logger","getCodexModels","logger","logger","shouldFallbackToMessages","getCodexModels","logger","createCopilotResponses","isConfiguredResponsesApiWebSearchEnabled"],"sources":["../src/lib/trace.ts","../src/lib/zstd-request.ts","../src/lib/process-cleanup.ts","../src/lib/logger.ts","../src/lib/provider-model.ts","../src/lib/provider-resolver.ts","../src/lib/event-bus.ts","../src/lib/builtin-provider-models.ts","../src/lib/sqlite.ts","../src/lib/token-usage/store.ts","../src/lib/token-usage/pricing.ts","../src/lib/token-usage/index.ts","../src/routes/alpha-search/alpha-search-types.ts","../src/routes/messages/web-search/backend.ts","../src/lib/copilot-rate-limit.ts","../src/services/copilot/create-responses.ts","../src/lib/timeout-dispatcher.ts","../src/services/providers/provider-proxy.ts","../src/routes/alpha-search/alpha-search-responses.ts","../src/services/codex/alpha-search.ts","../src/routes/alpha-search/route.ts","../src/lib/dashscope.ts","../src/lib/reasoning-effort.ts","../src/routes/provider/utils.ts","../src/routes/provider/chat-completions/handler.ts","../src/services/copilot/create-chat-completions.ts","../src/routes/chat-completions/handler.ts","../src/routes/chat-completions/route.ts","../src/routes/admin/config/route.ts","../src/services/copilot/create-embeddings.ts","../src/routes/embeddings/route.ts","../src/services/codex/images.ts","../src/routes/images/route.ts","../src/lib/tokenizer.ts","../src/routes/messages/utils.ts","../src/routes/messages/non-stream-translation.ts","../src/routes/messages/preprocess.ts","../src/routes/provider/messages/count-tokens-handler.ts","../src/routes/messages/count-tokens-handler.ts","../src/lib/codex-rate-limit.ts","../src/routes/messages/stream-translation.ts","../src/routes/messages/responses-translation.ts","../src/routes/messages/responses-stream-translation.ts","../src/routes/messages/responses-stream-collection.ts","../src/routes/responses/messages-translation.ts","../src/routes/responses/utils.ts","../src/routes/messages/web-search/fulfill.ts","../src/services/codex/get-models.ts","../src/routes/provider/messages/handler.ts","../src/services/copilot/create-messages.ts","../src/routes/messages/api-flows.ts","../src/lib/subagent.ts","../src/routes/messages/subagent-marker.ts","../src/routes/messages/handler.ts","../src/routes/messages/route.ts","../src/routes/models/codex-models.ts","../src/routes/models/route.ts","../src/routes/provider/alpha-search/route.ts","../src/routes/provider/images/route.ts","../src/routes/provider/messages/route.ts","../src/routes/provider/models/route.ts","../src/routes/responses/custom-tool-input-stream-decoder.ts","../src/routes/responses/messages-stream-translation.ts","../src/routes/responses/messages-handler.ts","../src/routes/provider/responses/handler.ts","../src/routes/provider/responses/route.ts","../src/routes/responses/stream-id-sync.ts","../src/routes/responses/handler.ts","../src/routes/responses/route.ts","../src/routes/token-usage/route.ts","../src/routes/usage/route.ts","../src/server.ts"],"sourcesContent":["import type { MiddlewareHandler } from \"hono\"\n\nimport { requestContext, resolveTraceId } from \"./request-context\"\n\nexport const traceIdMiddleware: MiddlewareHandler = async (c, next) => {\n const traceId = resolveTraceId(c.req.header(\"x-trace-id\"))\n\n c.header(\"x-trace-id\", traceId)\n\n const context = {\n traceId,\n startTime: Date.now(),\n userAgent: c.req.header(\"user-agent\") || \"\",\n sessionAffinity:\n c.req.header(\"x-session-affinity\") ?? c.req.header(\"x-client-request-id\"),\n parentSessionId: c.req.header(\"x-parent-session-id\"),\n }\n\n await requestContext.run(context, async () => {\n await next()\n })\n}\n","import type { MiddlewareHandler } from \"hono\"\n\nimport { decompress as decompressFallback } from \"fzstd\"\n\ntype BinaryData = ArrayBuffer | ArrayBufferView\n\ntype BunRuntime = {\n zstdDecompress?: (input: Uint8Array) => BinaryData | Promise<BinaryData>\n}\n\ntype NodeZlibModule = {\n zstdDecompress?: (\n input: Uint8Array,\n callback: (error: Error | null, result: Uint8Array) => void,\n ) => void\n}\n\nconst ZSTD_CONTENT_ENCODING = \"zstd\"\nconst INVALID_BODY_STATUS = 400\n\nlet nodeZlibPromise: Promise<NodeZlibModule | null> | null = null\n\nexport const zstdDecompressionMiddleware: MiddlewareHandler = async (\n c,\n next,\n) => {\n const contentEncoding = c.req.header(\"content-encoding\")?.trim().toLowerCase()\n if (contentEncoding !== ZSTD_CONTENT_ENCODING) {\n return next()\n }\n\n try {\n const compressedBody = new Uint8Array(await c.req.raw.arrayBuffer())\n const decompressedBody = await decompressZstd(compressedBody)\n const headers = new Headers(c.req.raw.headers)\n headers.delete(\"content-encoding\")\n headers.delete(\"content-length\")\n\n c.req.raw = new Request(c.req.raw.url, {\n body: decompressedBody,\n headers,\n method: c.req.raw.method,\n signal: c.req.raw.signal,\n })\n c.req.bodyCache = {}\n } catch {\n return c.json(\n {\n error: {\n message: \"Failed to decompress zstd request body.\",\n type: \"invalid_request_error\",\n },\n },\n INVALID_BODY_STATUS,\n )\n }\n\n return next()\n}\n\nconst decompressZstd = async (input: Uint8Array): Promise<Uint8Array> => {\n const bun = getBunRuntime()\n if (bun?.zstdDecompress) {\n return toUint8Array(await bun.zstdDecompress(input))\n }\n\n const nodeZlib = await getNodeZlib()\n if (nodeZlib?.zstdDecompress) {\n return new Promise((resolve, reject) => {\n nodeZlib.zstdDecompress?.(input, (error, result) => {\n if (error) {\n reject(error)\n return\n }\n\n resolve(toUint8Array(result))\n })\n })\n }\n\n return decompressFallback(input)\n}\n\nconst getBunRuntime = (): BunRuntime | undefined =>\n (globalThis as { Bun?: BunRuntime }).Bun\n\nconst getNodeZlib = async (): Promise<NodeZlibModule | null> => {\n nodeZlibPromise ??= import(\"node:zlib\")\n .then((module) => module as NodeZlibModule)\n .catch(() => null)\n\n return nodeZlibPromise\n}\n\nconst toUint8Array = (data: BinaryData): Uint8Array => {\n if (data instanceof Uint8Array) {\n return data\n }\n\n if (data instanceof ArrayBuffer) {\n return new Uint8Array(data)\n }\n\n return new Uint8Array(data.buffer, data.byteOffset, data.byteLength)\n}\n","type CleanupHandler = () => void | Promise<void>\n\nconst cleanupHandlers = new Set<CleanupHandler>()\n\nlet cleanupPromise: Promise<void> | null = null\nlet cleanupState: \"idle\" | \"running\" | \"done\" = \"idle\"\nlet runtimeInitialized = false\n\nfunction initializeProcessCleanupRuntime(): void {\n if (runtimeInitialized) {\n return\n }\n\n runtimeInitialized = true\n\n process.once(\"beforeExit\", () => {\n void runProcessCleanups()\n })\n process.once(\"exit\", runProcessCleanupsSync)\n process.once(\"SIGINT\", () => {\n void shutdownProcess(0)\n })\n process.once(\"SIGTERM\", () => {\n void shutdownProcess(0)\n })\n}\n\nfunction runProcessCleanupsSync(): void {\n if (cleanupState !== \"idle\") {\n return\n }\n\n cleanupState = \"done\"\n for (const handler of Array.from(cleanupHandlers)) {\n try {\n void handler()\n } catch {\n // Ignore best-effort cleanup failures during process exit.\n }\n }\n}\n\nasync function runProcessCleanups(): Promise<void> {\n if (cleanupPromise) {\n return cleanupPromise\n }\n\n if (cleanupState === \"done\") {\n return\n }\n\n cleanupState = \"running\"\n cleanupPromise = (async () => {\n for (const handler of Array.from(cleanupHandlers)) {\n await handler()\n }\n cleanupState = \"done\"\n })()\n\n return cleanupPromise\n}\n\nasync function shutdownProcess(exitCode: number): Promise<void> {\n try {\n await runProcessCleanups()\n } finally {\n process.exit(exitCode)\n }\n}\n\nexport function registerProcessCleanup(handler: CleanupHandler): () => void {\n initializeProcessCleanupRuntime()\n cleanupHandlers.add(handler)\n\n return () => {\n cleanupHandlers.delete(handler)\n }\n}\n","import consola, { type ConsolaInstance } from \"consola\"\nimport fs from \"node:fs\"\nimport path from \"node:path\"\nimport util from \"node:util\"\n\nimport { PATHS } from \"./paths\"\nimport { registerProcessCleanup } from \"./process-cleanup\"\nimport { requestContext } from \"./request-context\"\nimport { state } from \"./state\"\n\nconst LOG_RETENTION_DAYS = 7\nconst LOG_RETENTION_MS = LOG_RETENTION_DAYS * 24 * 60 * 60 * 1000\nconst CLEANUP_INTERVAL_MS = 24 * 60 * 60 * 1000\nconst LOG_DIR_ENV = \"COPILOT_API_LOG_DIR\"\nconst DEFAULT_LOG_DIR = path.join(PATHS.APP_DIR, \"logs\")\nconst FLUSH_INTERVAL_MS = 1000\nconst MAX_BUFFER_SIZE = 100\n\nconst getLogDir = () => process.env[LOG_DIR_ENV]?.trim() || DEFAULT_LOG_DIR\n\nconst logStreams = new Map<string, fs.WriteStream>()\nconst logBuffers = new Map<string, Array<string>>()\n\nlet runtimeInitialized = false\nlet flushInterval: ReturnType<typeof setInterval> | undefined\nlet cleanupInterval: ReturnType<typeof setInterval> | undefined\nlet currentLogDateKey: string | undefined\n\nconst ensureLogDirectory = () => {\n const logDir = getLogDir()\n if (!fs.existsSync(logDir)) {\n fs.mkdirSync(logDir, { recursive: true })\n }\n}\n\nconst formatArgs = (args: Array<unknown>) =>\n args\n .map((arg) =>\n typeof arg === \"string\" ? arg : (\n util.inspect(arg, { depth: null, colors: false })\n ),\n )\n .join(\" \")\n\nconst sanitizeName = (name: string) => {\n const normalized = name\n .toLowerCase()\n .replaceAll(/[^a-z0-9]+/g, \"-\")\n .replaceAll(/^-+|-+$/g, \"\")\n\n return normalized === \"\" ? \"handler\" : normalized\n}\n\nconst maybeUnref = (timer: ReturnType<typeof setInterval>) => {\n timer.unref()\n}\n\nconst flushBuffer = (filePath: string) => {\n const buffer = logBuffers.get(filePath)\n if (!buffer) {\n return\n }\n\n logBuffers.delete(filePath)\n if (buffer.length === 0) {\n return\n }\n\n const stream = getLogStream(filePath)\n const content = buffer.join(\"\\n\") + \"\\n\"\n stream.write(content, (error) => {\n if (error) {\n console.warn(\"Failed to write handler log\", error)\n }\n })\n}\n\nconst flushAllBuffers = () => {\n for (const filePath of logBuffers.keys()) {\n flushBuffer(filePath)\n }\n}\n\nconst closeLogFile = async (filePath: string): Promise<void> => {\n flushBuffer(filePath)\n const stream = logStreams.get(filePath)\n logStreams.delete(filePath)\n logBuffers.delete(filePath)\n\n if (!stream || stream.closed) {\n return\n }\n\n await new Promise<void>((resolve) => {\n stream.once(\"close\", resolve)\n stream.end()\n })\n}\n\nconst closePreviousDateLogFiles = (dateKey: string): void => {\n if (currentLogDateKey === undefined) {\n currentLogDateKey = dateKey\n return\n }\n if (currentLogDateKey === dateKey) {\n return\n }\n\n const filePaths = new Set([...logBuffers.keys(), ...logStreams.keys()])\n currentLogDateKey = dateKey\n for (const filePath of filePaths) {\n void closeLogFile(filePath).catch((error) => {\n console.warn(\"Failed to rotate handler log\", error)\n })\n }\n}\n\nconst cleanupOldLogs = async (): Promise<void> => {\n const logDir = getLogDir()\n if (!fs.existsSync(logDir)) {\n return\n }\n\n const now = Date.now()\n for (const entry of fs.readdirSync(logDir)) {\n const filePath = path.join(logDir, entry)\n\n let stats: fs.Stats\n try {\n stats = fs.statSync(filePath)\n } catch {\n continue\n }\n\n if (!stats.isFile() || now - stats.mtimeMs <= LOG_RETENTION_MS) {\n continue\n }\n\n try {\n await closeLogFile(filePath)\n } catch (error) {\n console.warn(`Failed to close old handler log: ${filePath}`, error)\n continue\n }\n\n try {\n fs.rmSync(filePath)\n } catch (error) {\n console.warn(`Failed to remove old handler log: ${filePath}`, error)\n }\n }\n}\n\nconst scheduleLogCleanup = (): void => {\n void cleanupOldLogs().catch((error) => {\n console.warn(\"Failed to clean up handler logs\", error)\n })\n}\n\nconst flushAndCloseLogStreams = () => {\n flushAllBuffers()\n for (const stream of logStreams.values()) {\n stream.end()\n }\n\n logStreams.clear()\n logBuffers.clear()\n currentLogDateKey = undefined\n}\n\n// Stops the background timers, flushes and closes all log streams, and resets\n// runtime state so the logger can be initialized again. Runs on process exit\n// and is also used by tests to release file handles before removing log dirs.\nexport const shutdownLoggerRuntime = () => {\n if (flushInterval) {\n clearInterval(flushInterval)\n flushInterval = undefined\n }\n if (cleanupInterval) {\n clearInterval(cleanupInterval)\n cleanupInterval = undefined\n }\n\n flushAndCloseLogStreams()\n runtimeInitialized = false\n}\n\nconst initializeLoggerRuntime = () => {\n if (runtimeInitialized) {\n return\n }\n\n runtimeInitialized = true\n\n ensureLogDirectory()\n scheduleLogCleanup()\n\n flushInterval = setInterval(flushAllBuffers, FLUSH_INTERVAL_MS)\n maybeUnref(flushInterval)\n\n cleanupInterval = setInterval(scheduleLogCleanup, CLEANUP_INTERVAL_MS)\n maybeUnref(cleanupInterval)\n\n registerProcessCleanup(shutdownLoggerRuntime)\n}\n\nconst getLogStream = (filePath: string): fs.WriteStream => {\n initializeLoggerRuntime()\n\n let stream = logStreams.get(filePath)\n if (!stream || stream.destroyed) {\n const createdStream = fs.createWriteStream(filePath, { flags: \"a\" })\n stream = createdStream\n logStreams.set(filePath, createdStream)\n\n createdStream.on(\"error\", (error: unknown) => {\n console.warn(\"Log stream error\", error)\n if (logStreams.get(filePath) === createdStream) {\n logStreams.delete(filePath)\n }\n })\n }\n return stream\n}\n\nconst appendLine = (filePath: string, line: string) => {\n let buffer = logBuffers.get(filePath)\n if (!buffer) {\n buffer = []\n logBuffers.set(filePath, buffer)\n }\n\n buffer.push(line)\n\n if (buffer.length >= MAX_BUFFER_SIZE) {\n flushBuffer(filePath)\n }\n}\n\ntype DebugLogger = Pick<ConsolaInstance, \"debug\">\n\ntype AsyncDebugValueFactory = () => Promise<unknown>\n\nexport const debugLazy = (\n logger: DebugLogger,\n factory: () => [unknown, ...Array<unknown>],\n): void => {\n if (!state.verbose) {\n return\n }\n\n logger.debug(...factory())\n}\n\nexport const debugJson = (\n logger: DebugLogger,\n label: string,\n value: unknown,\n): void => {\n debugLazy(logger, () => [label, JSON.stringify(value)])\n}\n\nexport const debugJsonAsync = async (\n logger: DebugLogger,\n label: string,\n factory: AsyncDebugValueFactory,\n): Promise<void> => {\n if (!state.verbose) {\n return\n }\n\n logger.debug(label, JSON.stringify(await factory()))\n}\n\nexport const debugJsonTail = (\n logger: DebugLogger,\n label: string,\n { value, tailLength = 400 }: { value: unknown; tailLength?: number },\n): void => {\n debugLazy(logger, () => [label, JSON.stringify(value).slice(-tailLength)])\n}\n\nexport const createHandlerLogger = (name: string): ConsolaInstance => {\n const sanitizedName = sanitizeName(name)\n const instance = consola.withTag(name)\n\n if (state.verbose) {\n instance.level = 5\n }\n instance.setReporters([])\n\n instance.addReporter({\n log(logObj) {\n initializeLoggerRuntime()\n\n const context = requestContext.getStore()\n const traceId = context?.traceId\n const date = logObj.date\n const dateKey = date.toLocaleDateString(\"sv-SE\")\n const timestamp = date.toLocaleString(\"sv-SE\", { hour12: false })\n const filePath = path.join(getLogDir(), `${sanitizedName}-${dateKey}.log`)\n const message = formatArgs(logObj.args as Array<unknown>)\n const traceIdStr = traceId ? ` [${traceId}]` : \"\"\n const line = `[${timestamp}] [${logObj.type}] [${logObj.tag || name}]${traceIdStr}${\n message ? ` ${message}` : \"\"\n }`\n\n closePreviousDateLogFiles(dateKey)\n appendLine(filePath, line)\n },\n })\n\n return instance\n}\n","import type { Model } from \"~/lib/types/models\"\n\nexport interface ProviderModelAlias {\n model: string\n provider: string\n}\n\nexport const parseProviderModelAlias = (\n model: string,\n): ProviderModelAlias | null => {\n const separatorIndex = model.indexOf(\"/\")\n if (separatorIndex <= 0 || separatorIndex === model.length - 1) {\n return null\n }\n\n const provider = model.slice(0, separatorIndex).trim()\n const providerModel = model.slice(separatorIndex + 1).trim()\n if (!provider || !providerModel) {\n return null\n }\n\n return {\n model: providerModel,\n provider,\n }\n}\n\nexport const createFallbackModel = (modelId: string): Model => ({\n capabilities: {\n family: \"provider\",\n limits: {},\n object: \"model_capabilities\",\n supports: {},\n tokenizer: \"o200k_base\",\n type: \"chat\",\n },\n id: modelId,\n model_picker_enabled: false,\n name: modelId,\n object: \"model\",\n preview: false,\n vendor: \"provider\",\n version: \"unknown\",\n})\n","import {\n getRawProviderConfig,\n getProviderConfig,\n type ResolvedProviderConfig,\n} from \"~/lib/config\"\nimport {\n parseProviderModelAlias,\n type ProviderModelAlias,\n} from \"~/lib/provider-model\"\nimport { state } from \"~/lib/state\"\nimport { setupCodexToken } from \"~/lib/token\"\n\nfunction isMissingCodexCredentialsError(error: unknown): boolean {\n return (\n error instanceof Error\n && error.message\n === \"Codex credentials not found. Run `copilot-api auth login --provider codex` first.\"\n )\n}\n\nexport async function resolveProviderConfig(\n providerName: string,\n): Promise<ResolvedProviderConfig | null> {\n const normalizedProviderName = providerName.trim()\n if (!normalizedProviderName) {\n return null\n }\n\n if (normalizedProviderName === \"codex\") {\n const rawProviderConfig = getRawProviderConfig(normalizedProviderName)\n if (rawProviderConfig?.enabled === false) {\n return null\n }\n\n try {\n await setupCodexToken()\n } catch (error) {\n if (isMissingCodexCredentialsError(error)) {\n return null\n }\n throw error\n }\n\n const providerConfig = getProviderConfig(normalizedProviderName)\n if (!providerConfig) {\n return null\n }\n\n return {\n ...providerConfig,\n apiKey: state.codexAccessToken ?? providerConfig.apiKey,\n }\n }\n\n return getProviderConfig(normalizedProviderName)\n}\n\nexport type ProviderConfigResolver = typeof resolveProviderConfig\n\n/**\n * Returns the parsed \"provider/model\" alias only when that provider is\n * actually configured, otherwise null so the caller falls through to its\n * default flow. GitHub Copilot enterprise models can ship with namespaced ids\n * such as \"org/family/model\": without this check the first segment is\n * misrouted to a non-existent provider and surfaced as a 400/404.\n */\nexport async function ensureConfiguredProviderModelAlias(\n alias: ProviderModelAlias | null,\n resolveConfig: ProviderConfigResolver = resolveProviderConfig,\n): Promise<ProviderModelAlias | null> {\n if (!alias) {\n return null\n }\n\n return (await resolveConfig(alias.provider)) ? alias : null\n}\n\n/** parseProviderModelAlias + ensureConfiguredProviderModelAlias. */\nexport async function resolveConfiguredProviderModelAlias(\n model: string,\n resolveConfig: ProviderConfigResolver = resolveProviderConfig,\n): Promise<ProviderModelAlias | null> {\n return ensureConfiguredProviderModelAlias(\n parseProviderModelAlias(model),\n resolveConfig,\n )\n}\n","export type EventBusHandler<Event> = (event: Event) => void\n\nexport class EventBus<Events extends object> {\n private readonly handlers = new Map<\n keyof Events,\n Set<EventBusHandler<Events[keyof Events]>>\n >()\n\n publish<Name extends keyof Events>(name: Name, event: Events[Name]): void {\n const handlers = this.handlers.get(name)\n if (!handlers) {\n return\n }\n\n for (const handler of Array.from(handlers)) {\n handler(event)\n }\n }\n\n subscribe<Name extends keyof Events>(\n name: Name,\n handler: EventBusHandler<Events[Name]>,\n ): () => void {\n let handlers = this.handlers.get(name)\n if (!handlers) {\n handlers = new Set<EventBusHandler<Events[keyof Events]>>()\n this.handlers.set(name, handlers)\n }\n\n const registeredHandler = handler as EventBusHandler<Events[keyof Events]>\n handlers.add(registeredHandler)\n\n return () => {\n handlers.delete(registeredHandler)\n if (handlers.size === 0) {\n this.handlers.delete(name)\n }\n }\n }\n}\n","import type { TokenUsagePricingConfig } from \"./token-usage/pricing\"\nimport type { CodexReasoningEffort, ModelReasoningField } from \"./config-store\"\n\nexport type BuiltinProviderInputModality = \"text\" | \"image\"\n\nexport interface BuiltinProviderModelConfig {\n contextWindow?: number\n defaultReasoningEffort?: CodexReasoningEffort\n inputModalities?: Array<BuiltinProviderInputModality>\n maxOutputTokens?: number\n pricing: TokenUsagePricingConfig\n reasoningEfforts?: Array<CodexReasoningEffort>\n // Message field carrying assistant thinking text in upstream requests,\n // for models that do not follow the default \"reasoning_content\"\n // convention (e.g. opencode-go hy3/hy4 use the OpenRouter-style\n // \"reasoning\" field)\n reasoningField?: ModelReasoningField\n}\n\ntype BuiltinProviderModelCatalog = Record<\n string,\n Record<string, BuiltinProviderModelConfig>\n>\n\nexport class BuiltinProviderModelRegistry {\n private static readonly catalog: BuiltinProviderModelCatalog = {\n codex: {\n \"gpt-5.3-codex\": {\n pricing: {\n cachedInput: 0.175,\n input: 1.75,\n output: 14,\n },\n },\n \"gpt-5.4\": {\n pricing: {\n tiers: [\n {\n cachedInput: 0.25,\n input: 2.5,\n maxInputTokens: 272_000,\n output: 15,\n },\n {\n cachedInput: 0.5,\n input: 5,\n output: 22.5,\n },\n ],\n },\n },\n \"gpt-5.4-mini\": {\n pricing: {\n tiers: [\n {\n cachedInput: 0.075,\n input: 0.75,\n maxInputTokens: 272_000,\n output: 4.5,\n },\n {\n cachedInput: 0.15,\n input: 1.5,\n output: 6.75,\n },\n ],\n },\n },\n \"gpt-5.5\": {\n pricing: {\n tiers: [\n {\n cachedInput: 0.5,\n input: 5,\n maxInputTokens: 272_000,\n output: 30,\n },\n {\n cachedInput: 1,\n input: 10,\n output: 45,\n },\n ],\n },\n },\n \"gpt-5.6-sol\": {\n pricing: {\n tiers: [\n {\n cacheCreationInput: 5,\n cachedInput: 0.4,\n input: 4,\n maxInputTokens: 272_000,\n output: 20,\n },\n {\n cacheCreationInput: 10,\n cachedInput: 0.8,\n input: 8,\n output: 30,\n },\n ],\n },\n },\n \"gpt-5.6-terra\": {\n pricing: {\n tiers: [\n {\n cacheCreationInput: 2.5,\n cachedInput: 0.2,\n input: 2,\n maxInputTokens: 272_000,\n output: 12,\n },\n {\n cacheCreationInput: 5,\n cachedInput: 0.4,\n input: 4,\n output: 18,\n },\n ],\n },\n },\n \"gpt-5.6-luna\": {\n pricing: {\n tiers: [\n {\n cacheCreationInput: 0.25,\n cachedInput: 0.02,\n input: 0.2,\n maxInputTokens: 272_000,\n output: 1.2,\n },\n {\n cacheCreationInput: 0.5,\n cachedInput: 0.04,\n input: 0.4,\n output: 1.8,\n },\n ],\n },\n },\n \"gpt-6-astra\": {\n pricing: {\n tiers: [\n {\n cacheCreationInput: 12.5,\n cachedInput: 1,\n input: 10,\n maxInputTokens: 272_000,\n output: 50,\n },\n {\n cacheCreationInput: 25,\n cachedInput: 2,\n input: 20,\n output: 75,\n },\n ],\n },\n },\n },\n dashscope: {\n \"glm-5.1\": {\n contextWindow: 202_752,\n inputModalities: [\"text\"],\n maxOutputTokens: 64_000,\n pricing: {\n tiers: [\n {\n cachedInput: 1.2,\n cacheCreationInput: 7.5,\n explicitCachedInput: 0.6,\n input: 6,\n maxInputTokens: 32_000,\n output: 24,\n },\n {\n cachedInput: 1.6,\n cacheCreationInput: 10,\n explicitCachedInput: 0.8,\n input: 8,\n maxInputTokens: 200_000,\n output: 28,\n },\n ],\n },\n },\n \"glm-5.2\": {\n contextWindow: 1_000_000,\n inputModalities: [\"text\"],\n maxOutputTokens: 64_000,\n pricing: {\n cachedInput: 2,\n cacheCreationInput: 10,\n explicitCachedInput: 0.8,\n input: 8,\n output: 28,\n },\n },\n \"qwen3.7-max\": {\n contextWindow: 1_000_000,\n inputModalities: [\"text\"],\n maxOutputTokens: 64_000,\n pricing: {\n cachedInput: 2.4,\n cacheCreationInput: 15,\n explicitCachedInput: 1.2,\n input: 12,\n output: 36,\n },\n },\n \"qwen3.8-max\": {\n contextWindow: 1_000_000,\n inputModalities: [\"text\", \"image\"],\n maxOutputTokens: 64_000,\n pricing: {\n cachedInput: 1.5,\n cacheCreationInput: 15,\n explicitCachedInput: 1,\n input: 12,\n output: 36,\n },\n },\n \"deepseek-v4-flash-0731\": {\n contextWindow: 1_000_000,\n inputModalities: [\"text\"],\n maxOutputTokens: 64_000,\n pricing: {\n cachedInput: 0.2,\n input: 1,\n output: 2,\n },\n },\n \"qwen3.7-plus\": {\n contextWindow: 1_000_000,\n inputModalities: [\"text\", \"image\"],\n maxOutputTokens: 64_000,\n pricing: {\n tiers: [\n {\n cachedInput: 0.4,\n cacheCreationInput: 2.5,\n explicitCachedInput: 0.2,\n input: 2,\n maxInputTokens: 256_000,\n output: 8,\n },\n {\n cachedInput: 1.2,\n cacheCreationInput: 7.5,\n explicitCachedInput: 0.6,\n input: 6,\n maxInputTokens: 1_000_000,\n output: 24,\n },\n ],\n },\n },\n \"kimi/kimi-k3\": {\n contextWindow: 1_048_576,\n inputModalities: [\"text\", \"image\"],\n maxOutputTokens: 64_000,\n pricing: {\n cachedInput: 2,\n input: 20,\n output: 100,\n },\n },\n },\n deepseek: {\n \"deepseek-v4-flash\": {\n contextWindow: 1_000_000,\n inputModalities: [\"text\"],\n maxOutputTokens: 64_000,\n pricing: {\n cachedInput: 0.1,\n input: 3,\n output: 9,\n },\n },\n \"deepseek-v4-flash-vision-exp\": {\n contextWindow: 1_000_000,\n inputModalities: [\"text\", \"image\"],\n maxOutputTokens: 64_000,\n pricing: {\n cachedInput: 0.1,\n input: 3,\n output: 9,\n },\n },\n \"deepseek-v4-pro\": {\n contextWindow: 1_000_000,\n inputModalities: [\"text\"],\n maxOutputTokens: 64_000,\n pricing: {\n cachedInput: 0.3,\n input: 9,\n output: 27,\n },\n },\n },\n \"opencode-go\": {\n hy3: {\n contextWindow: 256_000,\n inputModalities: [\"text\"],\n maxOutputTokens: 64_000,\n pricing: {\n cachedInput: 0.035,\n input: 0.14,\n output: 0.58,\n },\n reasoningField: \"reasoning\",\n },\n \"hy4-preview\": {\n contextWindow: 1_024_000,\n inputModalities: [\"text\"],\n maxOutputTokens: 64_000,\n pricing: {\n cachedInput: 0.042,\n input: 0.834,\n output: 2.501,\n },\n reasoningEfforts: [\"high\"],\n reasoningField: \"reasoning\",\n },\n \"gpt-5.6-luna\": {\n pricing: {\n tiers: [\n {\n cacheCreationInput: 0.125,\n cachedInput: 0.01,\n input: 0.1,\n maxInputTokens: 272_000,\n output: 0.6,\n },\n {\n cacheCreationInput: 0.25,\n cachedInput: 0.02,\n input: 0.2,\n output: 0.9,\n },\n ],\n },\n },\n \"glm-5.2\": {\n contextWindow: 1_000_000,\n inputModalities: [\"text\"],\n maxOutputTokens: 64_000,\n pricing: {\n cachedInput: 0.26,\n input: 1.4,\n output: 4.4,\n },\n },\n \"glm-5.3\": {\n contextWindow: 1_000_000,\n inputModalities: [\"text\"],\n maxOutputTokens: 64_000,\n pricing: {\n cachedInput: 0.26,\n input: 1.4,\n output: 4.4,\n },\n },\n \"glm-5.3-flash\": {\n contextWindow: 1_000_000,\n inputModalities: [\"text\", \"image\"],\n maxOutputTokens: 131_072,\n pricing: {\n cachedInput: 0.015,\n input: 0.075,\n output: 0.25,\n },\n reasoningEfforts: [\"low\", \"high\", \"max\"],\n },\n \"muse-spark-1.2-contributor\": {\n contextWindow: 1_048_576,\n inputModalities: [\"text\", \"image\"],\n maxOutputTokens: 131_072,\n pricing: {\n cachedInput: 0.002,\n input: 0.1,\n output: 0.2,\n },\n reasoningEfforts: [\"minimal\", \"low\", \"medium\", \"high\", \"xhigh\"],\n },\n \"muse-spark-1.3-contributor\": {\n contextWindow: 1_048_576,\n inputModalities: [\"text\", \"image\"],\n maxOutputTokens: 131_072,\n pricing: {\n cachedInput: 0.002,\n input: 0.1,\n output: 0.2,\n },\n reasoningEfforts: [\"minimal\", \"low\", \"medium\", \"high\", \"xhigh\"],\n },\n \"grok-4.5\": {\n contextWindow: 500_000,\n defaultReasoningEffort: \"high\",\n inputModalities: [\"text\", \"image\"],\n maxOutputTokens: 64_000,\n pricing: {\n tiers: [\n {\n cachedInput: 0.5,\n input: 2,\n maxInputTokens: 200_000,\n output: 6,\n },\n {\n cachedInput: 1,\n input: 4,\n output: 12,\n },\n ],\n },\n reasoningEfforts: [\"low\", \"medium\", \"high\"],\n },\n \"grok-4.6\": {\n contextWindow: 500_000,\n defaultReasoningEffort: \"high\",\n inputModalities: [\"text\", \"image\"],\n maxOutputTokens: 64_000,\n pricing: {\n tiers: [\n {\n cachedInput: 0.5,\n input: 2,\n maxInputTokens: 200_000,\n output: 6,\n },\n {\n cachedInput: 1,\n input: 4,\n output: 12,\n },\n ],\n },\n reasoningEfforts: [\"low\", \"medium\", \"high\", \"xhigh\"],\n },\n \"deepseek-v4-flash\": {\n contextWindow: 1_000_000,\n inputModalities: [\"text\"],\n maxOutputTokens: 64_000,\n pricing: {\n cachedInput: 0.007,\n input: 0.22,\n output: 0.66,\n },\n },\n \"deepseek-v4-flash-vision-exp\": {\n contextWindow: 1_000_000,\n inputModalities: [\"text\", \"image\"],\n maxOutputTokens: 384_000,\n pricing: {\n cachedInput: 0.007,\n input: 0.22,\n output: 0.66,\n },\n reasoningEfforts: [\"low\", \"high\", \"max\"],\n },\n \"deepseek-v4-pro\": {\n contextWindow: 1_000_000,\n inputModalities: [\"text\"],\n maxOutputTokens: 64_000,\n pricing: {\n cachedInput: 0.022,\n input: 0.66,\n output: 1.98,\n },\n },\n \"kimi-k2.7-code\": {\n contextWindow: 262_144,\n inputModalities: [\"text\", \"image\"],\n maxOutputTokens: 64_000,\n pricing: {\n cachedInput: 0.19,\n input: 0.95,\n output: 4,\n },\n },\n \"kimi-k3\": {\n contextWindow: 1_048_576,\n inputModalities: [\"text\", \"image\"],\n maxOutputTokens: 64_000,\n pricing: {\n cachedInput: 0.3,\n input: 3,\n output: 15,\n },\n },\n \"mimo-v2.5\": {\n contextWindow: 1_000_000,\n inputModalities: [\"text\", \"image\"],\n maxOutputTokens: 64_000,\n pricing: {\n cachedInput: 0.0028,\n input: 0.14,\n output: 0.28,\n },\n },\n \"mimo-v2.5-pro\": {\n contextWindow: 1_048_576,\n inputModalities: [\"text\"],\n maxOutputTokens: 64_000,\n pricing: {\n cachedInput: 0.0145,\n input: 1.74,\n output: 3.48,\n },\n },\n \"qwen3.7-plus\": {\n contextWindow: 1_000_000,\n inputModalities: [\"text\", \"image\"],\n maxOutputTokens: 64_000,\n pricing: {\n tiers: [\n {\n cacheCreationInput: 0.5,\n cachedInput: 0.04,\n input: 0.4,\n maxInputTokens: 200_000,\n output: 1.6,\n },\n {\n cacheCreationInput: 1.5,\n cachedInput: 0.12,\n input: 1.2,\n maxInputTokens: 256_000,\n output: 4.8,\n },\n ],\n },\n },\n \"qwen3.7-max\": {\n contextWindow: 1_000_000,\n inputModalities: [\"text\"],\n maxOutputTokens: 64_000,\n pricing: {\n cacheCreationInput: 3.125,\n cachedInput: 0.5,\n input: 2.5,\n output: 7.5,\n },\n },\n \"qwen3.8-max\": {\n contextWindow: 1_000_000,\n inputModalities: [\"text\", \"image\"],\n maxOutputTokens: 64_000,\n pricing: {\n cacheCreationInput: 2.5,\n cachedInput: 0.25,\n input: 2,\n output: 6,\n },\n },\n \"qwen3.8-flash\": {\n contextWindow: 1_000_000,\n inputModalities: [\"text\", \"image\"],\n maxOutputTokens: 131_072,\n pricing: {\n cacheCreationInput: 0.2,\n cachedInput: 0.016,\n input: 0.15,\n output: 0.47,\n },\n reasoningEfforts: [\"low\", \"medium\", \"xhigh\"],\n },\n \"minimax-m2.7\": {\n contextWindow: 204_800,\n inputModalities: [\"text\"],\n maxOutputTokens: 64_000,\n pricing: {\n cachedInput: 0.06,\n input: 0.3,\n output: 1.2,\n },\n },\n \"minimax-m3\": {\n contextWindow: 1_000_000,\n inputModalities: [\"text\", \"image\"],\n maxOutputTokens: 64_000,\n pricing: {\n tiers: [\n {\n cachedInput: 0.06,\n input: 0.3,\n maxInputTokens: 200_000,\n output: 1.2,\n },\n {\n cachedInput: 0.12,\n input: 0.6,\n maxInputTokens: 512_000,\n output: 2.4,\n },\n ],\n },\n },\n },\n kimi: {\n k3: {\n contextWindow: 1_048_576,\n inputModalities: [\"text\", \"image\"],\n maxOutputTokens: 64_000,\n pricing: {\n cachedInput: 0.3,\n input: 3,\n output: 15,\n },\n },\n \"k3-256k\": {\n contextWindow: 262_144,\n inputModalities: [\"text\", \"image\"],\n maxOutputTokens: 64_000,\n pricing: {\n cachedInput: 0.3,\n input: 3,\n output: 15,\n },\n },\n },\n }\n\n private readonly modelCatalog: BuiltinProviderModelCatalog\n\n constructor() {\n this.modelCatalog = BuiltinProviderModelRegistry.catalog\n }\n\n getModelConfig(\n providerName: string,\n modelName: string,\n ): BuiltinProviderModelConfig | undefined {\n return this.modelCatalog[this.normalizeKey(providerName)]?.[\n this.normalizeKey(modelName)\n ]\n }\n\n getModelIds(providerName: string): Array<string> {\n return Object.keys(this.modelCatalog[this.normalizeKey(providerName)] ?? {})\n }\n\n private normalizeKey(value: string): string {\n return value.trim().toLowerCase()\n }\n}\n\nexport const builtinProviderModelRegistry = new BuiltinProviderModelRegistry()\n","import fs from \"node:fs/promises\"\nimport path from \"node:path\"\n\ntype SqliteValue = string | number | null\n\nexport const MINIMUM_NODE_SQLITE_VERSION = \"22.13.0\"\n\nexport interface SqliteStatement {\n all: (...values: Array<SqliteValue>) => Array<unknown>\n get: (...values: Array<SqliteValue>) => unknown\n run: (...values: Array<SqliteValue>) => unknown\n}\n\nexport interface SqliteDatabase {\n close?: () => void\n exec: (sql: string) => unknown\n prepare: (sql: string) => SqliteStatement\n}\n\ninterface SqliteDbStoreOptions {\n getPath: () => string\n initialize?: (db: SqliteDatabase) => void\n}\n\nconst isBunRuntime = (): boolean =>\n Boolean((globalThis as { Bun?: unknown }).Bun)\n\nfunction parseNodeVersion(version: string): Array<number> {\n return version.split(\".\", 3).map((part) => {\n const parsed = Number.parseInt(part, 10)\n return Number.isFinite(parsed) && parsed >= 0 ? parsed : 0\n })\n}\n\ninterface SqliteRuntimeSupportInput {\n isBun?: boolean\n nodeVersion?: string\n}\n\nexport function isNodeSqliteSupportedVersion(version: string): boolean {\n const current = parseNodeVersion(version)\n const minimum = parseNodeVersion(MINIMUM_NODE_SQLITE_VERSION)\n\n for (const [index, minimumPart] of minimum.entries()) {\n const currentPart = current[index] ?? 0\n if (currentPart > minimumPart) return true\n if (currentPart < minimumPart) return false\n }\n\n return true\n}\n\nexport function isSqliteRuntimeSupported(\n input: SqliteRuntimeSupportInput = {},\n): boolean {\n if (input.isBun ?? isBunRuntime()) {\n return true\n }\n\n return isNodeSqliteSupportedVersion(\n input.nodeVersion ?? process.versions.node,\n )\n}\n\nfunction getUnsupportedNodeSqliteMessage(nodeVersion: string): string {\n return (\n `SQLite-backed token usage requires Bun or Node.js >= ${MINIMUM_NODE_SQLITE_VERSION}. `\n + `Detected Node.js ${nodeVersion}. Upgrade Node.js or run the CLI with Bun, for example `\n + \"`bunx --bun @jeffreycao/copilot-api@latest start` or `bun run start start`.\"\n )\n}\n\nexport class UnsupportedNodeSqliteRuntimeError extends Error {\n constructor(nodeVersion: string, cause?: unknown) {\n super(getUnsupportedNodeSqliteMessage(nodeVersion), { cause })\n this.name = \"UnsupportedNodeSqliteRuntimeError\"\n }\n}\n\nasync function openBunDatabase(dbPath: string): Promise<SqliteDatabase> {\n const specifier = [\"bun\", \"sqlite\"].join(\":\")\n const sqlite = (await import(specifier)) as {\n Database: new (filename: string) => SqliteDatabase\n }\n return new sqlite.Database(dbPath)\n}\n\nasync function loadNodeSqliteModule(): Promise<{\n DatabaseSync: new (location: string) => SqliteDatabase\n}> {\n const nodeVersion = process.versions.node\n if (!isNodeSqliteSupportedVersion(nodeVersion)) {\n throw new UnsupportedNodeSqliteRuntimeError(nodeVersion)\n }\n\n const emitWarning = process.emitWarning.bind(process) as (\n ...args: unknown[]\n ) => void\n process.emitWarning = (warning: unknown, ...args: unknown[]) => {\n if (\n typeof warning === \"string\"\n && warning.includes(\"SQLite is an experimental feature\")\n ) {\n return\n }\n return emitWarning(warning, ...args)\n }\n\n const specifier = [\"node\", \"sqlite\"].join(\":\")\n try {\n return (await import(specifier)) as {\n DatabaseSync: new (location: string) => SqliteDatabase\n }\n } catch (error) {\n throw new UnsupportedNodeSqliteRuntimeError(nodeVersion, error)\n } finally {\n process.emitWarning = emitWarning\n }\n}\n\nasync function openNodeDatabase(dbPath: string): Promise<SqliteDatabase> {\n const sqlite = await loadNodeSqliteModule()\n return new sqlite.DatabaseSync(dbPath)\n}\n\nexport async function openSqliteDatabase(\n dbPath: string,\n): Promise<SqliteDatabase> {\n const dir = path.dirname(dbPath)\n if (dbPath !== \":memory:\" && dir !== \".\") {\n await fs.mkdir(dir, { recursive: true })\n }\n return isBunRuntime() ? openBunDatabase(dbPath) : openNodeDatabase(dbPath)\n}\n\nexport class SqliteDbStore {\n private dbPromise: Promise<SqliteDatabase> | null = null\n private readonly options: SqliteDbStoreOptions\n\n constructor(options: SqliteDbStoreOptions) {\n this.options = options\n }\n\n getDb(): Promise<SqliteDatabase> {\n this.dbPromise ??= this.open()\n return this.dbPromise\n }\n\n async close(input?: {\n beforeClose?: (db: SqliteDatabase) => void\n }): Promise<void> {\n const currentDbPromise = this.dbPromise\n this.dbPromise = null\n\n if (!currentDbPromise) {\n return\n }\n\n const db = await currentDbPromise\n input?.beforeClose?.(db)\n db.close?.()\n }\n\n private async open(): Promise<SqliteDatabase> {\n const db = await openSqliteDatabase(this.options.getPath())\n this.options.initialize?.(db)\n return db\n }\n}\n","import consola from \"consola\"\nimport path from \"node:path\"\n\nimport { PATHS } from \"~/lib/paths\"\nimport { registerProcessCleanup } from \"~/lib/process-cleanup\"\nimport {\n isSqliteRuntimeSupported,\n SqliteDbStore,\n type SqliteDatabase,\n} from \"~/lib/sqlite\"\n\nexport type TokenUsageSource = \"copilot\" | \"provider\"\n\nexport type TokenUsageEndpoint =\n | \"chat_completions\"\n | \"embeddings\"\n | \"messages\"\n | \"provider_messages\"\n | \"responses\"\n\nexport type TokenUsagePeriod = \"day\" | \"week\" | \"month\"\n\nexport interface UsageTokens {\n cache_creation_input_tokens?: number | null\n cache_read_input_tokens?: number | null\n cost?: number | null\n input_tokens?: number | null\n output_tokens?: number | null\n total_nano_aiu?: number | null\n total_tokens?: number | null\n}\n\nexport interface TokenUsageCost {\n amount: number\n currency: string\n total_cost_nanos: number\n}\n\nexport interface TokenUsageEventCost extends TokenUsageCost {\n source: string\n}\n\nexport interface PersistedTokenUsageEvent {\n cache_creation_input_tokens: number\n cache_read_input_tokens: number\n cost_currency: string | null\n cost_source: string | null\n created_at_ms: number\n created_at_utc: string\n endpoint: TokenUsageEndpoint\n input_tokens: number\n model: string\n output_tokens: number\n provider_name: string | null\n session_id: string\n source: TokenUsageSource\n total_cost_nanos: number | null\n total_nano_aiu: number | null\n total_tokens: number\n trace_id: string\n user_id: string\n}\n\nexport interface TokenUsageTotals {\n cache_creation_input_tokens: number\n cache_read_input_tokens: number\n costs: Array<TokenUsageCost>\n input_tokens: number\n output_tokens: number\n request_count: number\n total_nano_aiu: number | null\n total_tokens: number\n}\n\nexport interface TokenUsageModelSummary extends TokenUsageTotals {\n model: string\n}\n\nexport interface TokenUsageEventRecord {\n cache_creation_input_tokens: number\n cache_read_input_tokens: number\n cost: TokenUsageEventCost | null\n created_at_ms: number\n created_at_utc: string\n endpoint: TokenUsageEndpoint\n id: number\n input_tokens: number\n model: string\n output_tokens: number\n provider_name: string | null\n session_id: string\n source: TokenUsageSource\n total_nano_aiu: number | null\n total_tokens: number\n trace_id: string\n user_id: string\n}\n\nexport interface TokenUsageSummary {\n byModel: Array<TokenUsageModelSummary>\n period: TokenUsagePeriod\n range: {\n end_ms: number\n end_utc: string\n start_ms: number\n start_utc: string\n }\n totals: TokenUsageTotals\n}\n\nexport interface TokenUsageDailyBucket {\n byModel: Array<TokenUsageModelSummary>\n date: string\n end_ms: number\n start_ms: number\n totals: TokenUsageTotals\n}\n\nexport interface TokenUsageDailySummary {\n byModel: Array<TokenUsageModelSummary>\n days: Array<TokenUsageDailyBucket>\n period: TokenUsagePeriod\n range: {\n end_ms: number\n end_utc: string\n start_ms: number\n start_utc: string\n }\n totals: TokenUsageTotals\n}\n\nexport interface TokenUsageEventsPage {\n items: Array<TokenUsageEventRecord>\n page: number\n page_size: number\n period: TokenUsagePeriod\n range: {\n end_ms: number\n end_utc: string\n start_ms: number\n start_utc: string\n }\n total: number\n total_pages: number\n}\n\nconst DB_PATH_ENV = \"COPILOT_API_SQLITE_DB_PATH\"\nconst DEFAULT_DB_FILENAME = \"copilot-api.sqlite\"\nconst COST_NANOS_PER_UNIT = 1_000_000_000\n\nlet writeQueue: Promise<void> = Promise.resolve()\n\nfunction getDbPath(): string {\n return (\n process.env[DB_PATH_ENV] ?? path.join(PATHS.APP_DIR, DEFAULT_DB_FILENAME)\n )\n}\n\nconst tokenUsageDbStore = new SqliteDbStore({\n getPath: getDbPath,\n initialize: initializeTokenUsageDb,\n})\n\nfunction getDb(): Promise<SqliteDatabase> {\n return tokenUsageDbStore.getDb()\n}\n\nexport function isTokenUsageStorageEnabled(): boolean {\n return isSqliteRuntimeSupported()\n}\n\nfunction initializeTokenUsageDb(db: SqliteDatabase): void {\n db.exec(\"PRAGMA journal_mode = WAL\")\n db.exec(\"PRAGMA busy_timeout = 5000\")\n db.exec(`\n CREATE TABLE IF NOT EXISTS token_usage_events (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n created_at_ms INTEGER NOT NULL,\n created_at_utc TEXT NOT NULL,\n trace_id TEXT NOT NULL,\n session_id TEXT NOT NULL DEFAULT '',\n user_id TEXT NOT NULL DEFAULT '',\n source TEXT NOT NULL,\n endpoint TEXT NOT NULL,\n provider_name TEXT,\n model TEXT NOT NULL,\n input_tokens INTEGER NOT NULL DEFAULT 0,\n output_tokens INTEGER NOT NULL DEFAULT 0,\n cache_read_input_tokens INTEGER NOT NULL DEFAULT 0,\n cache_creation_input_tokens INTEGER NOT NULL DEFAULT 0,\n total_tokens INTEGER NOT NULL DEFAULT 0,\n total_nano_aiu INTEGER,\n cost_currency TEXT,\n total_cost_nanos INTEGER,\n cost_source TEXT\n )\n `)\n ensureColumn(db, \"user_id\", \"TEXT NOT NULL DEFAULT ''\")\n ensureColumn(db, \"total_tokens\", \"INTEGER NOT NULL DEFAULT 0\")\n ensureColumn(db, \"total_nano_aiu\", \"INTEGER\")\n ensureColumn(db, \"cost_currency\", \"TEXT\")\n ensureColumn(db, \"total_cost_nanos\", \"INTEGER\")\n ensureColumn(db, \"cost_source\", \"TEXT\")\n db.exec(`\n CREATE INDEX IF NOT EXISTS idx_token_usage_events_created_at_ms\n ON token_usage_events(created_at_ms)\n `)\n db.exec(`\n CREATE INDEX IF NOT EXISTS idx_token_usage_events_model\n ON token_usage_events(model)\n `)\n db.exec(`\n CREATE INDEX IF NOT EXISTS idx_token_usage_events_trace_id\n ON token_usage_events(trace_id)\n `)\n db.exec(`\n CREATE INDEX IF NOT EXISTS idx_token_usage_events_session_id\n ON token_usage_events(session_id)\n `)\n db.exec(`\n CREATE INDEX IF NOT EXISTS idx_token_usage_events_user_id\n ON token_usage_events(user_id)\n `)\n}\n\nfunction ensureColumn(\n db: SqliteDatabase,\n name: string,\n definition: string,\n): void {\n const rows = db\n .prepare(\"PRAGMA table_info(token_usage_events)\")\n .all() as Array<Record<string, unknown>>\n const hasColumn = rows.some((row) => row.name === name)\n if (!hasColumn) {\n db.exec(`ALTER TABLE token_usage_events ADD COLUMN ${name} ${definition}`)\n }\n}\n\nexport function normalizeToken(value: number | null | undefined): number {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n return 0\n }\n return Math.max(0, Math.floor(value))\n}\n\nexport function normalizeOptionalToken(\n value: number | null | undefined,\n): number | undefined {\n return value === null || value === undefined ?\n undefined\n : normalizeToken(value)\n}\n\nexport function hasAnyToken(tokens: UsageTokens): boolean {\n return (\n normalizeToken(tokens.input_tokens) > 0\n || normalizeToken(tokens.output_tokens) > 0\n || normalizeToken(tokens.cache_read_input_tokens) > 0\n || normalizeToken(tokens.cache_creation_input_tokens) > 0\n || normalizeToken(tokens.total_tokens) > 0\n || normalizeToken(tokens.total_nano_aiu) > 0\n )\n}\n\nexport function resolveTotalTokens(input: UsageTokens): number {\n const explicitTotal = normalizeOptionalToken(input.total_tokens)\n if (explicitTotal !== undefined) {\n return explicitTotal\n }\n return (\n normalizeToken(input.input_tokens)\n + normalizeToken(input.output_tokens)\n + normalizeToken(input.cache_read_input_tokens)\n + normalizeToken(input.cache_creation_input_tokens)\n )\n}\n\nasync function writeTokenUsageEvent(\n event: PersistedTokenUsageEvent,\n): Promise<void> {\n const db = await getDb()\n db.prepare(\n `\n INSERT INTO token_usage_events (\n created_at_ms,\n created_at_utc,\n trace_id,\n session_id,\n user_id,\n source,\n endpoint,\n provider_name,\n model,\n input_tokens,\n output_tokens,\n cache_read_input_tokens,\n cache_creation_input_tokens,\n total_tokens,\n total_nano_aiu,\n cost_currency,\n total_cost_nanos,\n cost_source\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `,\n ).run(\n event.created_at_ms,\n event.created_at_utc,\n event.trace_id,\n event.session_id,\n event.user_id,\n event.source,\n event.endpoint,\n event.provider_name,\n event.model,\n event.input_tokens,\n event.output_tokens,\n event.cache_read_input_tokens,\n event.cache_creation_input_tokens,\n event.total_tokens,\n event.total_nano_aiu,\n event.cost_currency,\n event.total_cost_nanos,\n event.cost_source,\n )\n}\n\nexport function enqueueTokenUsageWrite(event: PersistedTokenUsageEvent): void {\n if (!isTokenUsageStorageEnabled()) {\n return\n }\n\n writeQueue = writeQueue\n .then(() => writeTokenUsageEvent(event))\n .catch((error: unknown) => {\n consola.warn(\"Failed to record token usage\", error)\n })\n}\n\nasync function flushTokenUsageEvents(): Promise<void> {\n let currentQueue = writeQueue\n while (true) {\n await currentQueue\n if (currentQueue === writeQueue) {\n return\n }\n currentQueue = writeQueue\n }\n}\n\nfunction getPeriodRange(period: TokenUsagePeriod, now = new Date()) {\n const start = new Date(now)\n start.setHours(0, 0, 0, 0)\n\n switch (period) {\n case \"day\": {\n break\n }\n case \"week\": {\n start.setDate(start.getDate() - 6)\n break\n }\n case \"month\": {\n start.setDate(start.getDate() - 29)\n break\n }\n default: {\n break\n }\n }\n\n const end = new Date(start)\n switch (period) {\n case \"day\": {\n end.setDate(end.getDate() + 1)\n break\n }\n case \"week\": {\n end.setDate(end.getDate() + 7)\n break\n }\n case \"month\": {\n end.setDate(end.getDate() + 30)\n break\n }\n default: {\n break\n }\n }\n\n return {\n endMs: end.getTime(),\n startMs: start.getTime(),\n }\n}\n\nfunction formatLocalDate(date: Date): string {\n const year = date.getFullYear()\n const month = String(date.getMonth() + 1).padStart(2, \"0\")\n const day = String(date.getDate()).padStart(2, \"0\")\n return `${year}-${month}-${day}`\n}\n\nfunction createDailyIntervals(range: { endMs: number; startMs: number }) {\n const intervals: Array<{\n date: string\n endMs: number\n startMs: number\n }> = []\n const cursor = new Date(range.startMs)\n\n while (cursor.getTime() < range.endMs) {\n const startMs = cursor.getTime()\n const next = new Date(cursor)\n next.setDate(next.getDate() + 1)\n const endMs = Math.min(next.getTime(), range.endMs)\n intervals.push({\n date: formatLocalDate(cursor),\n endMs,\n startMs,\n })\n cursor.setTime(endMs)\n }\n\n return intervals\n}\n\nfunction createEmptyTotals(): TokenUsageTotals {\n return {\n cache_creation_input_tokens: 0,\n cache_read_input_tokens: 0,\n costs: [],\n input_tokens: 0,\n output_tokens: 0,\n request_count: 0,\n total_nano_aiu: null,\n total_tokens: 0,\n }\n}\n\nfunction addTotals(target: TokenUsageTotals, next: TokenUsageTotals): void {\n target.cache_creation_input_tokens += next.cache_creation_input_tokens\n target.cache_read_input_tokens += next.cache_read_input_tokens\n target.costs = mergeCosts(target.costs, next.costs)\n target.input_tokens += next.input_tokens\n target.output_tokens += next.output_tokens\n target.request_count += next.request_count\n target.total_nano_aiu = addNullableNumbers(\n target.total_nano_aiu,\n next.total_nano_aiu,\n )\n target.total_tokens += next.total_tokens\n}\n\nfunction addNullableNumbers(\n current: number | null,\n next: number | null,\n): number | null {\n if (current === null) return next\n if (next === null) return current\n return current + next\n}\n\nfunction mergeCosts(\n current: Array<TokenUsageCost>,\n next: Array<TokenUsageCost>,\n): Array<TokenUsageCost> {\n const byCurrency = new Map<string, number>()\n for (const cost of [...current, ...next]) {\n byCurrency.set(\n cost.currency,\n (byCurrency.get(cost.currency) ?? 0) + cost.total_cost_nanos,\n )\n }\n\n return [...byCurrency.entries()]\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([currency, totalCostNanos]) => createCost(currency, totalCostNanos))\n}\n\nfunction createEmptySummary(period: TokenUsagePeriod): TokenUsageSummary {\n const range = getPeriodRange(period)\n\n return {\n byModel: [],\n period,\n range: {\n end_ms: range.endMs,\n end_utc: new Date(range.endMs).toISOString(),\n start_ms: range.startMs,\n start_utc: new Date(range.startMs).toISOString(),\n },\n totals: createEmptyTotals(),\n }\n}\n\nfunction createEmptyDailySummary(\n period: TokenUsagePeriod,\n): TokenUsageDailySummary {\n const range = getPeriodRange(period)\n\n return {\n byModel: [],\n days: createDailyIntervals(range).map((interval) => ({\n byModel: [],\n date: interval.date,\n end_ms: interval.endMs,\n start_ms: interval.startMs,\n totals: createEmptyTotals(),\n })),\n period,\n range: {\n end_ms: range.endMs,\n end_utc: new Date(range.endMs).toISOString(),\n start_ms: range.startMs,\n start_utc: new Date(range.startMs).toISOString(),\n },\n totals: createEmptyTotals(),\n }\n}\n\nfunction createEmptyEventsPage(input: {\n page: number\n pageSize: number\n period: TokenUsagePeriod\n}): TokenUsageEventsPage {\n const range = getPeriodRange(input.period)\n const page = Math.max(1, Math.floor(input.page))\n const pageSize = Math.min(100, Math.max(1, Math.floor(input.pageSize)))\n\n return {\n items: [],\n page,\n page_size: pageSize,\n period: input.period,\n range: {\n end_ms: range.endMs,\n end_utc: new Date(range.endMs).toISOString(),\n start_ms: range.startMs,\n start_utc: new Date(range.startMs).toISOString(),\n },\n total: 0,\n total_pages: 1,\n }\n}\n\nfunction rangePayload(range: { endMs: number; startMs: number }) {\n return {\n end_ms: range.endMs,\n end_utc: new Date(range.endMs).toISOString(),\n start_ms: range.startMs,\n start_utc: new Date(range.startMs).toISOString(),\n }\n}\n\nfunction numberFromRow(\n row: Record<string, unknown> | undefined,\n key: string,\n): number {\n const value = row?.[key]\n return typeof value === \"number\" && Number.isFinite(value) ? value : 0\n}\n\nfunction nullableNumberFromRow(\n row: Record<string, unknown> | undefined,\n key: string,\n): number | null {\n const value = row?.[key]\n return typeof value === \"number\" && Number.isFinite(value) ? value : null\n}\n\nfunction createCost(currency: string, totalCostNanos: number): TokenUsageCost {\n return {\n amount: totalCostNanos / COST_NANOS_PER_UNIT,\n currency,\n total_cost_nanos: totalCostNanos,\n }\n}\n\nfunction costFromRow(row: Record<string, unknown>): TokenUsageCost | null {\n const currency = row.cost_currency\n const totalCostNanos = row.total_cost_nanos\n if (\n typeof currency !== \"string\"\n || !currency\n || typeof totalCostNanos !== \"number\"\n || !Number.isFinite(totalCostNanos)\n ) {\n return null\n }\n\n return createCost(currency, totalCostNanos)\n}\n\nfunction eventCostFromRow(\n row: Record<string, unknown>,\n): TokenUsageEventCost | null {\n const cost = costFromRow(row)\n const source = row.cost_source\n if (!cost || typeof source !== \"string\" || !source) {\n return null\n }\n\n return {\n ...cost,\n source,\n }\n}\n\nfunction totalsFromRow(\n row: Record<string, unknown> | undefined,\n costs: Array<TokenUsageCost> = [],\n): TokenUsageTotals {\n return {\n cache_creation_input_tokens: numberFromRow(\n row,\n \"cache_creation_input_tokens\",\n ),\n cache_read_input_tokens: numberFromRow(row, \"cache_read_input_tokens\"),\n costs,\n input_tokens: numberFromRow(row, \"input_tokens\"),\n output_tokens: numberFromRow(row, \"output_tokens\"),\n request_count: numberFromRow(row, \"request_count\"),\n total_nano_aiu: nullableNumberFromRow(row, \"total_nano_aiu\"),\n total_tokens: numberFromRow(row, \"total_tokens\"),\n }\n}\n\nfunction modelSummaryFromRow(\n row: Record<string, unknown>,\n costs: Array<TokenUsageCost> = [],\n): TokenUsageModelSummary {\n return {\n ...totalsFromRow(row, costs),\n model: typeof row.model === \"string\" ? row.model : \"unknown\",\n }\n}\n\nfunction stringFromRow(row: Record<string, unknown>, key: string): string {\n const value = row[key]\n return typeof value === \"string\" ? value : \"\"\n}\n\nfunction nullableStringFromRow(\n row: Record<string, unknown>,\n key: string,\n): string | null {\n const value = row[key]\n return typeof value === \"string\" ? value : null\n}\n\nfunction usageEventFromRow(\n row: Record<string, unknown>,\n): TokenUsageEventRecord {\n return {\n cache_creation_input_tokens: numberFromRow(\n row,\n \"cache_creation_input_tokens\",\n ),\n cache_read_input_tokens: numberFromRow(row, \"cache_read_input_tokens\"),\n cost: eventCostFromRow(row),\n created_at_ms: numberFromRow(row, \"created_at_ms\"),\n created_at_utc: stringFromRow(row, \"created_at_utc\"),\n endpoint: stringFromRow(row, \"endpoint\") as TokenUsageEndpoint,\n id: numberFromRow(row, \"id\"),\n input_tokens: numberFromRow(row, \"input_tokens\"),\n model: stringFromRow(row, \"model\") || \"unknown\",\n output_tokens: numberFromRow(row, \"output_tokens\"),\n provider_name: nullableStringFromRow(row, \"provider_name\"),\n session_id: stringFromRow(row, \"session_id\"),\n source: stringFromRow(row, \"source\") as TokenUsageSource,\n total_nano_aiu: nullableNumberFromRow(row, \"total_nano_aiu\"),\n total_tokens: numberFromRow(row, \"total_tokens\"),\n trace_id: stringFromRow(row, \"trace_id\"),\n user_id: stringFromRow(row, \"user_id\"),\n }\n}\n\nfunction getTotalsRow(\n db: SqliteDatabase,\n range: { endMs: number; startMs: number },\n): Record<string, unknown> | undefined {\n return db\n .prepare(\n `\n SELECT\n COUNT(*) AS request_count,\n COALESCE(SUM(input_tokens), 0) AS input_tokens,\n COALESCE(SUM(output_tokens), 0) AS output_tokens,\n COALESCE(SUM(cache_read_input_tokens), 0) AS cache_read_input_tokens,\n COALESCE(SUM(cache_creation_input_tokens), 0) AS cache_creation_input_tokens,\n SUM(total_nano_aiu) AS total_nano_aiu,\n COALESCE(SUM(total_tokens), 0) AS total_tokens\n FROM token_usage_events\n WHERE created_at_ms >= ? AND created_at_ms < ?\n `,\n )\n .get(range.startMs, range.endMs) as Record<string, unknown> | undefined\n}\n\nfunction getModelRows(\n db: SqliteDatabase,\n range: { endMs: number; startMs: number },\n): Array<Record<string, unknown>> {\n return db\n .prepare(\n `\n SELECT\n model,\n COUNT(*) AS request_count,\n COALESCE(SUM(input_tokens), 0) AS input_tokens,\n COALESCE(SUM(output_tokens), 0) AS output_tokens,\n COALESCE(SUM(cache_read_input_tokens), 0) AS cache_read_input_tokens,\n COALESCE(SUM(cache_creation_input_tokens), 0) AS cache_creation_input_tokens,\n SUM(total_nano_aiu) AS total_nano_aiu,\n COALESCE(SUM(total_tokens), 0) AS total_tokens\n FROM token_usage_events\n WHERE created_at_ms >= ? AND created_at_ms < ?\n GROUP BY model\n ORDER BY\n total_tokens DESC,\n model ASC\n `,\n )\n .all(range.startMs, range.endMs) as Array<Record<string, unknown>>\n}\n\nfunction getCostRows(\n db: SqliteDatabase,\n range: { endMs: number; startMs: number },\n): Array<TokenUsageCost> {\n const rows = db\n .prepare(\n `\n SELECT\n cost_currency,\n COALESCE(SUM(total_cost_nanos), 0) AS total_cost_nanos\n FROM token_usage_events\n WHERE\n created_at_ms >= ?\n AND created_at_ms < ?\n AND cost_currency IS NOT NULL\n AND total_cost_nanos IS NOT NULL\n GROUP BY cost_currency\n ORDER BY cost_currency ASC\n `,\n )\n .all(range.startMs, range.endMs) as Array<Record<string, unknown>>\n\n return rows.flatMap((row) => {\n const cost = costFromRow(row)\n return cost ? [cost] : []\n })\n}\n\nfunction getModelCostMap(\n db: SqliteDatabase,\n range: { endMs: number; startMs: number },\n): Map<string, Array<TokenUsageCost>> {\n const rows = db\n .prepare(\n `\n SELECT\n model,\n cost_currency,\n COALESCE(SUM(total_cost_nanos), 0) AS total_cost_nanos\n FROM token_usage_events\n WHERE\n created_at_ms >= ?\n AND created_at_ms < ?\n AND cost_currency IS NOT NULL\n AND total_cost_nanos IS NOT NULL\n GROUP BY model, cost_currency\n ORDER BY model ASC, cost_currency ASC\n `,\n )\n .all(range.startMs, range.endMs) as Array<Record<string, unknown>>\n\n const costMap = new Map<string, Array<TokenUsageCost>>()\n for (const row of rows) {\n const model = stringFromRow(row, \"model\") || \"unknown\"\n const cost = costFromRow(row)\n if (!cost) {\n continue\n }\n costMap.set(model, [...(costMap.get(model) ?? []), cost])\n }\n\n return costMap\n}\n\nfunction getModelSummaries(\n db: SqliteDatabase,\n range: { endMs: number; startMs: number },\n): Array<TokenUsageModelSummary> {\n const costMap = getModelCostMap(db, range)\n return getModelRows(db, range).map((row) => {\n const model = stringFromRow(row, \"model\") || \"unknown\"\n return modelSummaryFromRow(row, costMap.get(model) ?? [])\n })\n}\n\nfunction createDailyBucket(\n interval: { date: string; endMs: number; startMs: number },\n byModel: Array<TokenUsageModelSummary>,\n): TokenUsageDailyBucket {\n const totals = createEmptyTotals()\n for (const model of byModel) {\n addTotals(totals, model)\n }\n\n return {\n byModel,\n date: interval.date,\n end_ms: interval.endMs,\n start_ms: interval.startMs,\n totals,\n }\n}\n\nexport async function getTokenUsageSummary(\n period: TokenUsagePeriod,\n): Promise<TokenUsageSummary> {\n if (!isTokenUsageStorageEnabled()) {\n return createEmptySummary(period)\n }\n\n await flushTokenUsageEvents()\n const range = getPeriodRange(period)\n const db = await getDb()\n const totalsRow = getTotalsRow(db, range)\n\n return {\n byModel: getModelSummaries(db, range),\n period,\n range: rangePayload(range),\n totals: totalsFromRow(totalsRow, getCostRows(db, range)),\n }\n}\n\nexport async function getTokenUsageDailySummary(\n period: TokenUsagePeriod,\n): Promise<TokenUsageDailySummary> {\n if (!isTokenUsageStorageEnabled()) {\n return createEmptyDailySummary(period)\n }\n\n await flushTokenUsageEvents()\n const range = getPeriodRange(period)\n const db = await getDb()\n const intervals = createDailyIntervals(range)\n\n return {\n byModel: getModelSummaries(db, range),\n days: intervals.map((interval) =>\n createDailyBucket(interval, getModelSummaries(db, interval)),\n ),\n period,\n range: rangePayload(range),\n totals: totalsFromRow(getTotalsRow(db, range), getCostRows(db, range)),\n }\n}\n\nexport async function getTokenUsageEventsPage(input: {\n page: number\n pageSize: number\n period: TokenUsagePeriod\n}): Promise<TokenUsageEventsPage> {\n if (!isTokenUsageStorageEnabled()) {\n return createEmptyEventsPage(input)\n }\n\n await flushTokenUsageEvents()\n const range = getPeriodRange(input.period)\n const page = Math.max(1, Math.floor(input.page))\n const pageSize = Math.min(100, Math.max(1, Math.floor(input.pageSize)))\n const offset = (page - 1) * pageSize\n const db = await getDb()\n\n const totalRow = db\n .prepare(\n `\n SELECT COUNT(*) AS total\n FROM token_usage_events\n WHERE created_at_ms >= ? AND created_at_ms < ?\n `,\n )\n .get(range.startMs, range.endMs) as Record<string, unknown> | undefined\n\n const rows = db\n .prepare(\n `\n SELECT\n id,\n created_at_ms,\n created_at_utc,\n trace_id,\n session_id,\n user_id,\n source,\n endpoint,\n provider_name,\n model,\n input_tokens,\n output_tokens,\n cache_read_input_tokens,\n cache_creation_input_tokens,\n total_nano_aiu,\n total_tokens,\n cost_currency,\n total_cost_nanos,\n cost_source\n FROM token_usage_events\n WHERE created_at_ms >= ? AND created_at_ms < ?\n ORDER BY created_at_ms DESC, id DESC\n LIMIT ? OFFSET ?\n `,\n )\n .all(range.startMs, range.endMs, pageSize, offset) as Array<\n Record<string, unknown>\n >\n\n const total = numberFromRow(totalRow, \"total\")\n\n return {\n items: rows.map((row) => usageEventFromRow(row)),\n page,\n page_size: pageSize,\n period: input.period,\n range: {\n end_ms: range.endMs,\n end_utc: new Date(range.endMs).toISOString(),\n start_ms: range.startMs,\n start_utc: new Date(range.startMs).toISOString(),\n },\n total,\n total_pages: Math.max(1, Math.ceil(total / pageSize)),\n }\n}\n\nexport async function closeUsageStore(): Promise<void> {\n await flushTokenUsageEvents()\n await tokenUsageDbStore.close({\n beforeClose: (db) => {\n try {\n db.exec(\"PRAGMA wal_checkpoint(TRUNCATE)\")\n } catch {\n // Ignore cleanup errors in tests.\n }\n },\n })\n writeQueue = Promise.resolve()\n}\n\nregisterProcessCleanup(closeUsageStore)\n","import { builtinProviderModelRegistry } from \"../builtin-provider-models\"\nimport {\n normalizeToken,\n type TokenUsageSource,\n type UsageTokens,\n} from \"./store\"\n\nexport interface TokenUsagePricingTier {\n cachedInput?: number\n cacheCreationInput?: number\n explicitCachedInput?: number\n input?: number\n maxInputTokens?: number\n output?: number\n}\n\nexport interface TokenUsagePricingConfig extends TokenUsagePricingTier {\n tiers?: Array<TokenUsagePricingTier>\n}\n\nexport interface CalculatedTokenUsageCost {\n currency: string\n source: string\n total_cost_nanos: number\n}\n\ninterface TokenUsageCostInput extends UsageTokens {\n model: string\n pricing?: TokenUsagePricingConfig | null\n pricingCurrency?: string | null\n providerName?: string | null\n source: TokenUsageSource\n}\n\ninterface ResolvedPricing {\n pricing: TokenUsagePricingConfig\n source: string\n}\n\nconst COST_NANOS_PER_UNIT = 1_000_000_000\nconst COST_NANOS_PER_TOKEN_AT_ONE_PER_MILLION = 1_000\nconst COPILOT_NANO_AIU_PER_USD = 100_000_000_000\nconst COPILOT_NANO_AIU_TO_COST_NANOS =\n COST_NANOS_PER_UNIT / COPILOT_NANO_AIU_PER_USD\nconst BUILTIN_PROVIDER_CURRENCIES: Record<string, string> = {\n codex: \"USD\",\n dashscope: \"CNY\",\n deepseek: \"CNY\",\n kimi: \"USD\",\n \"opencode-go\": \"USD\",\n}\n\nexport function resolveTokenUsageCost(\n input: TokenUsageCostInput,\n): CalculatedTokenUsageCost | null {\n if (\n input.source === \"provider\"\n && input.providerName?.trim().toLowerCase() === \"openrouter\"\n ) {\n const reportedCost = resolveReportedProviderCost(input)\n if (reportedCost) {\n return reportedCost\n }\n }\n\n if (input.source === \"copilot\") {\n return resolveCopilotCost(input)\n }\n\n const providerName = input.providerName?.trim()\n if (!providerName) {\n return null\n }\n\n const resolvedPricing = resolveProviderPricing(\n providerName,\n input.model,\n input.pricing,\n )\n if (!resolvedPricing) {\n return null\n }\n\n const pricing = resolvePricingTier(\n resolvedPricing.pricing,\n getInputTokenTotal(input),\n )\n const currency = resolveProviderCurrency(providerName, input.pricingCurrency)\n if (!currency) {\n return null\n }\n\n const inputPrice = normalizePrice(pricing.input)\n const outputPrice = normalizePrice(pricing.output)\n const cacheReadPrice = resolveCacheReadPrice(pricing, input)\n const cacheCreationPrice = resolveCacheCreationPrice(pricing)\n\n const totalCostNanos =\n costNanosForTokens(input.input_tokens, inputPrice)\n + costNanosForTokens(input.output_tokens, outputPrice)\n + costNanosForTokens(input.cache_read_input_tokens, cacheReadPrice)\n + costNanosForTokens(input.cache_creation_input_tokens, cacheCreationPrice)\n\n if (totalCostNanos <= 0) {\n return null\n }\n\n return {\n currency,\n source: resolvedPricing.source,\n total_cost_nanos: totalCostNanos,\n }\n}\n\nfunction resolveReportedProviderCost(\n input: TokenUsageCostInput,\n): CalculatedTokenUsageCost | null {\n const cost = normalizePrice(input.cost)\n if (cost === null) {\n return null\n }\n\n const totalCostNanos = Math.round(cost * COST_NANOS_PER_UNIT)\n if (totalCostNanos < 0) {\n return null\n }\n\n return {\n currency: \"USD\",\n source: \"upstream\",\n total_cost_nanos: totalCostNanos,\n }\n}\n\nexport function getCostAmount(totalCostNanos: number): number {\n return totalCostNanos / COST_NANOS_PER_UNIT\n}\n\nfunction resolveCopilotCost(\n input: TokenUsageCostInput,\n): CalculatedTokenUsageCost | null {\n const totalNanoAiu = normalizeToken(input.total_nano_aiu)\n if (totalNanoAiu <= 0) {\n return null\n }\n\n const totalCostNanos = Math.round(\n totalNanoAiu * COPILOT_NANO_AIU_TO_COST_NANOS,\n )\n if (totalCostNanos <= 0) {\n return null\n }\n\n return {\n currency: \"USD\",\n source: \"copilot_aiu\",\n total_cost_nanos: totalCostNanos,\n }\n}\n\nfunction resolveProviderPricing(\n providerName: string,\n model: string,\n configuredPricing: TokenUsagePricingConfig | null | undefined,\n): ResolvedPricing | null {\n if (configuredPricing) {\n return {\n pricing: configuredPricing,\n source: \"config\",\n }\n }\n\n const builtinPricing = builtinProviderModelRegistry.getModelConfig(\n providerName,\n model,\n )?.pricing\n if (!builtinPricing) {\n return null\n }\n\n return {\n pricing: builtinPricing,\n source: \"builtin\",\n }\n}\n\nfunction resolvePricingTier(\n pricing: TokenUsagePricingConfig,\n inputTokenTotal: number,\n): TokenUsagePricingTier {\n const tiers = pricing.tiers\n ?.filter((tier) => typeof tier === \"object\" && tier !== null)\n .toSorted((a, b) => normalizeTierMax(a) - normalizeTierMax(b))\n\n const selectedTier =\n tiers?.find((tier) => inputTokenTotal <= normalizeTierMax(tier))\n ?? tiers?.at(-1)\n\n return {\n ...pricing,\n ...selectedTier,\n }\n}\n\nfunction normalizeTierMax(tier: TokenUsagePricingTier): number {\n const maxInputTokens = tier.maxInputTokens\n return (\n typeof maxInputTokens === \"number\"\n && Number.isFinite(maxInputTokens)\n && maxInputTokens > 0\n ) ?\n maxInputTokens\n : Number.POSITIVE_INFINITY\n}\n\nfunction getInputTokenTotal(input: UsageTokens): number {\n return (\n normalizeToken(input.input_tokens)\n + normalizeToken(input.cache_read_input_tokens)\n + normalizeToken(input.cache_creation_input_tokens)\n )\n}\n\nfunction normalizePrice(value: number | null | undefined): number | null {\n return typeof value === \"number\" && Number.isFinite(value) && value >= 0 ?\n value\n : null\n}\n\nfunction resolveProviderCurrency(\n providerName: string,\n configuredCurrency: string | null | undefined,\n): string | null {\n const currency =\n configuredCurrency?.trim().toUpperCase()\n || BUILTIN_PROVIDER_CURRENCIES[providerName.toLowerCase()]\n return currency || null\n}\n\nfunction resolveCacheCreationPrice(\n pricing: TokenUsagePricingTier,\n): number | null {\n return normalizePrice(pricing.cacheCreationInput)\n}\n\nfunction resolveCacheReadPrice(\n pricing: TokenUsagePricingTier,\n input: UsageTokens,\n): number | null {\n const hasCacheCreationSignal =\n input.cache_creation_input_tokens !== undefined\n && input.cache_creation_input_tokens !== null\n\n if (hasCacheCreationSignal) {\n const explicitPrice = normalizePrice(pricing.explicitCachedInput)\n if (explicitPrice !== null) {\n return explicitPrice\n }\n }\n\n return normalizePrice(pricing.cachedInput)\n}\n\nfunction costNanosForTokens(\n tokens: number | null | undefined,\n pricePerMillionTokens: number | null,\n): number {\n if (pricePerMillionTokens === null) {\n return 0\n }\n\n return Math.round(\n normalizeToken(tokens)\n * pricePerMillionTokens\n * COST_NANOS_PER_TOKEN_AT_ONE_PER_MILLION,\n )\n}\n","import { requestContext, generateTraceId } from \"~/lib/request-context\"\nimport { state } from \"~/lib/state\"\n\nimport { EventBus } from \"../event-bus\"\nimport { resolveTokenUsageCost, type TokenUsagePricingConfig } from \"./pricing\"\nimport {\n enqueueTokenUsageWrite,\n hasAnyToken,\n normalizeOptionalToken,\n normalizeToken,\n resolveTotalTokens,\n type PersistedTokenUsageEvent,\n type TokenUsageEndpoint,\n type TokenUsageSource,\n type UsageTokens,\n} from \"./store\"\n\nexport {\n closeUsageStore,\n getTokenUsageDailySummary,\n getTokenUsageEventsPage,\n getTokenUsageSummary,\n normalizeOptionalToken,\n normalizeToken,\n} from \"./store\"\n\nexport type {\n TokenUsageDailyBucket,\n TokenUsageDailySummary,\n TokenUsageCost,\n TokenUsageEventCost,\n TokenUsageEndpoint,\n TokenUsageEventRecord,\n TokenUsageEventsPage,\n TokenUsageModelSummary,\n TokenUsagePeriod,\n TokenUsageSource,\n TokenUsageSummary,\n TokenUsageTotals,\n UsageTokens,\n} from \"./store\"\n\nexport interface TokenUsageEventInput extends UsageTokens {\n endpoint: TokenUsageEndpoint\n fallbackSessionId?: string | null\n model: string\n pricing?: TokenUsagePricingConfig | null\n pricingCurrency?: string | null\n providerName?: string | null\n sessionId?: string | null\n source: TokenUsageSource\n traceId?: string | null\n}\n\ninterface TokenUsageRecorderOptions {\n endpoint: TokenUsageEndpoint\n fallbackSessionId?: string | null\n model: string\n pricing?: TokenUsagePricingConfig | null\n pricingCurrency?: string | null\n providerName?: string | null\n sessionId?: string | null\n source: TokenUsageSource\n traceId?: string | null\n}\n\ntype CopilotTokenUsageRecorderOptions = Omit<\n TokenUsageRecorderOptions,\n \"providerName\" | \"source\"\n>\n\ntype ProviderTokenUsageRecorderOptions = Omit<\n TokenUsageRecorderOptions,\n \"source\"\n>\n\ninterface TokenUsageEventMap {\n \"token_usage.recorded\": PersistedTokenUsageEvent\n}\n\nconst tokenUsageEventBus = new EventBus<TokenUsageEventMap>()\n\nfunction resolveTraceId(traceId: string | null | undefined): string {\n return (\n traceId?.trim() || requestContext.getStore()?.traceId || generateTraceId()\n )\n}\n\nexport function resolveTokenUsageSessionId(\n sessionId: string | null | undefined,\n fallbackSessionId?: string | null,\n): string {\n return (\n requestContext.getStore()?.sessionAffinity?.trim()\n || sessionId?.trim()\n || fallbackSessionId?.trim()\n || \"\"\n )\n}\n\nfunction resolveUserId(input: TokenUsageEventInput): string {\n if (input.source === \"provider\") {\n return input.providerName?.trim() || \"\"\n }\n return state.userName?.trim() || \"\"\n}\n\nfunction toPersistedEvent(\n input: TokenUsageEventInput,\n): PersistedTokenUsageEvent | null {\n if (!hasAnyToken(input)) {\n return null\n }\n\n const now = new Date()\n const cost = resolveTokenUsageCost(input)\n return {\n cache_creation_input_tokens: normalizeToken(\n input.cache_creation_input_tokens,\n ),\n cache_read_input_tokens: normalizeToken(input.cache_read_input_tokens),\n cost_currency: cost?.currency ?? null,\n cost_source: cost?.source ?? null,\n created_at_ms: now.getTime(),\n created_at_utc: now.toISOString(),\n endpoint: input.endpoint,\n input_tokens: normalizeToken(input.input_tokens),\n model: input.model.trim() || \"unknown\",\n output_tokens: normalizeToken(input.output_tokens),\n provider_name: input.providerName?.trim() || null,\n session_id: resolveTokenUsageSessionId(\n input.sessionId,\n input.fallbackSessionId,\n ),\n source: input.source,\n total_nano_aiu:\n input.total_nano_aiu === undefined || input.total_nano_aiu === null ?\n null\n : normalizeToken(input.total_nano_aiu),\n total_cost_nanos: cost?.total_cost_nanos ?? null,\n total_tokens: resolveTotalTokens(input),\n trace_id: resolveTraceId(input.traceId),\n user_id: resolveUserId(input),\n }\n}\n\ntokenUsageEventBus.subscribe(\"token_usage.recorded\", enqueueTokenUsageWrite)\n\nexport function recordTokenUsageEvent(input: TokenUsageEventInput): void {\n const event = toPersistedEvent(input)\n if (!event) {\n return\n }\n\n tokenUsageEventBus.publish(\"token_usage.recorded\", event)\n}\n\nexport function createTokenUsageRecorder(\n options: TokenUsageRecorderOptions,\n): (usage: UsageTokens) => void {\n return (usage) => {\n recordTokenUsageEvent({\n ...usage,\n ...options,\n })\n }\n}\n\nexport function createCopilotTokenUsageRecorder(\n options: CopilotTokenUsageRecorderOptions,\n): (usage: UsageTokens) => void {\n return createTokenUsageRecorder({\n ...options,\n source: \"copilot\",\n })\n}\n\nexport function createProviderTokenUsageRecorder(\n options: ProviderTokenUsageRecorderOptions,\n): (usage: UsageTokens) => void {\n return createTokenUsageRecorder({\n ...options,\n source: \"provider\",\n })\n}\n\nexport function normalizeOpenAIUsage(\n usage:\n | {\n completion_tokens?: number\n prompt_tokens?: number\n total_tokens?: number\n prompt_cache_hit_tokens?: number\n prompt_cache_miss_tokens?: number\n prompt_tokens_details?: {\n cache_creation_input_tokens?: number\n cached_tokens?: number\n }\n }\n | null\n | undefined,\n): UsageTokens {\n if (\n usage\n && (Object.hasOwn(usage, \"prompt_cache_hit_tokens\")\n || Object.hasOwn(usage, \"prompt_cache_miss_tokens\"))\n ) {\n return {\n cache_read_input_tokens: normalizeToken(usage.prompt_cache_hit_tokens),\n input_tokens: normalizeToken(usage.prompt_cache_miss_tokens),\n output_tokens: normalizeToken(usage.completion_tokens),\n total_tokens: normalizeOptionalToken(usage.total_tokens),\n }\n }\n\n const promptDetails = usage?.prompt_tokens_details\n const hasCacheCreationTokens = Boolean(\n promptDetails\n && Object.hasOwn(promptDetails, \"cache_creation_input_tokens\"),\n )\n const hasCachedTokens = Boolean(\n promptDetails && Object.hasOwn(promptDetails, \"cached_tokens\"),\n )\n const cachedTokens = normalizeToken(promptDetails?.cached_tokens)\n const cacheCreationTokens = normalizeToken(\n promptDetails?.cache_creation_input_tokens,\n )\n const promptTokens = normalizeToken(usage?.prompt_tokens)\n return {\n ...(hasCacheCreationTokens && {\n cache_creation_input_tokens: cacheCreationTokens,\n }),\n ...(hasCachedTokens && {\n cache_read_input_tokens: cachedTokens,\n }),\n input_tokens: Math.max(\n 0,\n promptTokens - cachedTokens - cacheCreationTokens,\n ),\n output_tokens: normalizeToken(usage?.completion_tokens),\n total_tokens: normalizeOptionalToken(usage?.total_tokens),\n }\n}\n\nexport function normalizeResponsesUsage(\n usage:\n | {\n input_tokens?: number\n input_tokens_details?: {\n cached_tokens?: number\n cache_write_tokens?: number\n }\n output_tokens?: number\n total_tokens?: number\n }\n | null\n | undefined,\n): UsageTokens {\n const cachedTokens = normalizeToken(\n usage?.input_tokens_details?.cached_tokens,\n )\n const cacheWriteTokens = normalizeToken(\n usage?.input_tokens_details?.cache_write_tokens,\n )\n const inputTokens = normalizeToken(usage?.input_tokens)\n return {\n ...(cacheWriteTokens > 0 && {\n cache_creation_input_tokens: cacheWriteTokens,\n }),\n cache_read_input_tokens: cachedTokens,\n input_tokens: Math.max(0, inputTokens - cachedTokens - cacheWriteTokens),\n output_tokens: normalizeToken(usage?.output_tokens),\n total_tokens: normalizeOptionalToken(usage?.total_tokens),\n }\n}\n\nexport function normalizeAnthropicUsage(\n usage:\n | {\n cache_creation_input_tokens?: number\n cache_read_input_tokens?: number\n cost?: number\n input_tokens?: number\n output_tokens?: number\n total_tokens?: number\n }\n | null\n | undefined,\n): UsageTokens {\n return {\n cache_creation_input_tokens: normalizeOptionalToken(\n usage?.cache_creation_input_tokens,\n ),\n cache_read_input_tokens: normalizeOptionalToken(\n usage?.cache_read_input_tokens,\n ),\n cost: normalizeOptionalCost(usage?.cost),\n input_tokens: normalizeOptionalToken(usage?.input_tokens),\n output_tokens: normalizeOptionalToken(usage?.output_tokens),\n total_tokens: normalizeOptionalToken(usage?.total_tokens),\n }\n}\n\nexport function mergeAnthropicUsage(\n current: UsageTokens,\n next: UsageTokens,\n): UsageTokens {\n return {\n cache_creation_input_tokens:\n next.cache_creation_input_tokens ?? current.cache_creation_input_tokens,\n cache_read_input_tokens:\n next.cache_read_input_tokens ?? current.cache_read_input_tokens,\n cost: next.cost ?? current.cost,\n input_tokens: next.input_tokens ?? current.input_tokens,\n output_tokens: next.output_tokens ?? current.output_tokens,\n total_nano_aiu: next.total_nano_aiu ?? current.total_nano_aiu,\n total_tokens: next.total_tokens ?? current.total_tokens,\n }\n}\n\nfunction normalizeOptionalCost(\n value: number | null | undefined,\n): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value) && value >= 0 ?\n value\n : undefined\n}\n","import { z } from \"zod\"\n\nconst unsignedInteger = z.number().int().nonnegative()\nconst passthroughRecord = z.record(z.string(), z.unknown())\n\nconst searchQuerySchema = z\n .object({\n q: z.string(),\n recency: unsignedInteger.optional(),\n domains: z.array(z.string()).optional(),\n })\n .loose()\n\nconst openOperationSchema = z\n .object({\n ref_id: z.string(),\n lineno: unsignedInteger.optional(),\n })\n .loose()\n\nconst clickOperationSchema = z\n .object({\n ref_id: z.string(),\n id: unsignedInteger,\n })\n .loose()\n\nconst findOperationSchema = z\n .object({\n ref_id: z.string(),\n pattern: z.string(),\n })\n .loose()\n\nconst screenshotOperationSchema = z\n .object({\n ref_id: z.string(),\n pageno: unsignedInteger,\n })\n .loose()\n\nconst financeOperationSchema = z\n .object({\n ticker: z.string(),\n type: z.enum([\"equity\", \"fund\", \"crypto\", \"index\"]),\n market: z.string().optional(),\n })\n .loose()\n\nconst weatherOperationSchema = z\n .object({\n location: z.string(),\n start: z.string().optional(),\n duration: unsignedInteger.optional(),\n })\n .loose()\n\nconst sportsOperationSchema = z\n .object({\n tool: z.literal(\"sports\").optional(),\n fn: z.enum([\"schedule\", \"standings\"]),\n league: z.enum([\n \"nba\",\n \"wnba\",\n \"nfl\",\n \"nhl\",\n \"mlb\",\n \"epl\",\n \"ncaamb\",\n \"ncaawb\",\n \"ipl\",\n ]),\n team: z.string().optional(),\n opponent: z.string().optional(),\n date_from: z.string().optional(),\n date_to: z.string().optional(),\n num_games: unsignedInteger.optional(),\n locale: z.string().optional(),\n })\n .loose()\n\nconst timeOperationSchema = z\n .object({\n utc_offset: z.string().regex(/^[+-](?:[01]\\d|2[0-3]):[0-5]\\d$/u),\n })\n .loose()\n\nexport const alphaSearchCommandsSchema = z\n .object({\n search_query: z.array(searchQuerySchema).optional(),\n image_query: z.array(searchQuerySchema).optional(),\n open: z.array(openOperationSchema).optional(),\n click: z.array(clickOperationSchema).optional(),\n find: z.array(findOperationSchema).optional(),\n screenshot: z.array(screenshotOperationSchema).optional(),\n finance: z.array(financeOperationSchema).optional(),\n weather: z.array(weatherOperationSchema).optional(),\n sports: z.array(sportsOperationSchema).optional(),\n time: z.array(timeOperationSchema).optional(),\n response_length: z.enum([\"short\", \"medium\", \"long\"]).optional(),\n })\n .loose()\n\nconst reasoningSchema = z\n .object({\n effort: z.string().min(1).nullable().optional(),\n summary: z\n .enum([\"auto\", \"concise\", \"detailed\", \"none\"])\n .nullable()\n .optional(),\n context: z\n .enum([\"auto\", \"current_turn\", \"all_turns\"])\n .nullable()\n .optional(),\n })\n .loose()\n\nconst settingsSchema = z\n .object({\n user_location: z\n .object({\n type: z.literal(\"approximate\"),\n country: z.string().optional(),\n region: z.string().optional(),\n city: z.string().optional(),\n timezone: z.string().optional(),\n })\n .loose()\n .optional(),\n search_context_size: z.enum([\"low\", \"medium\", \"high\"]).optional(),\n filters: z\n .object({\n allowed_domains: z.array(z.string()).optional(),\n blocked_domains: z.array(z.string()).optional(),\n })\n .loose()\n .optional(),\n image_settings: z\n .object({\n max_results: unsignedInteger.optional(),\n caption: z.boolean().optional(),\n })\n .loose()\n .optional(),\n allowed_callers: z\n .array(z.enum([\"direct\", \"shell\", \"code_interpreter\"]))\n .optional(),\n external_web_access: z\n .union([z.boolean(), z.enum([\"cached\", \"indexed\", \"live\"])])\n .optional(),\n })\n .loose()\n\nexport const alphaSearchRequestSchema = z\n .object({\n id: z.string(),\n model: z.string(),\n reasoning: reasoningSchema.optional(),\n input: z.union([z.string(), z.array(passthroughRecord)]).optional(),\n commands: alphaSearchCommandsSchema.optional(),\n settings: settingsSchema.optional(),\n max_output_tokens: unsignedInteger.optional(),\n })\n .loose()\n\nexport type AlphaSearchRequest = z.infer<typeof alphaSearchRequestSchema>\nexport type AlphaSearchCommands = z.infer<typeof alphaSearchCommandsSchema>\n\nexport interface AlphaSearchResponse {\n encrypted_output: string | null\n output: string\n results: Array<AlphaSearchResult>\n}\n\nexport type AlphaSearchResult = AlphaSearchTextResult\n\nexport interface AlphaSearchTextResult {\n type: \"text_result\"\n domain: string\n ref_id: string\n snippet: string\n title: string\n url: string\n}\n","import type {\n ResponseOutputMessage,\n ResponsesResult,\n} from \"~/lib/types/responses\"\n\nexport interface WebSearchSource {\n url: string\n title: string\n snippet?: string\n page_age?: string | null\n}\n\nexport interface WebSearchExtract {\n /** The grounded answer text produced by the GPT backend (with inline cites). */\n answerText: string\n /** Deduped citation and included action sources. */\n sources: Array<WebSearchSource>\n /** Search queries the backend actually ran. */\n queries: Array<string>\n}\n\nexport interface WebSearchToolConfig {\n allowedDomains?: Array<string>\n blockedDomains?: Array<string>\n userLocation?: Record<string, unknown>\n searchContextSize?: \"low\" | \"medium\" | \"high\"\n}\n\ninterface UrlCitationAnnotation {\n type: \"url_citation\"\n url: string\n title?: string\n start_index?: number\n end_index?: number\n}\n\n/** Builds the Responses API web_search tool object from normalized config. */\nexport const buildResponsesWebSearchTool = (\n config: WebSearchToolConfig,\n): Record<string, unknown> => {\n const tool: Record<string, unknown> = { type: \"web_search\" }\n const filters: Record<string, unknown> = {}\n if (config.allowedDomains?.length) {\n filters.allowed_domains = config.allowedDomains\n }\n if (config.blockedDomains?.length) {\n filters.blocked_domains = config.blockedDomains\n }\n if (Object.keys(filters).length > 0) tool.filters = filters\n if (config.userLocation) tool.user_location = config.userLocation\n if (config.searchContextSize) {\n tool.search_context_size = config.searchContextSize\n }\n return tool\n}\n\nconst isMessageItem = (\n item: ResponsesResult[\"output\"][number],\n): item is ResponseOutputMessage => item.type === \"message\"\n\nconst isValidUrlCitation = (\n annotation: unknown,\n seenUrls: Set<string>,\n): annotation is UrlCitationAnnotation => {\n const ann = annotation as UrlCitationAnnotation\n return (\n ann.type === \"url_citation\" && Boolean(ann.url) && !seenUrls.has(ann.url)\n )\n}\n\nconst collectTextParts = (\n blocks:\n | Array<{ type?: string; text?: string; annotations?: Array<unknown> }>\n | undefined,\n seenUrls: Set<string>,\n): { textParts: Array<string>; sources: Array<WebSearchSource> } => {\n const textParts: Array<string> = []\n const sources: Array<WebSearchSource> = []\n for (const block of blocks ?? []) {\n if (block.type !== \"output_text\") continue\n if (block.text) textParts.push(block.text)\n for (const annotation of block.annotations ?? []) {\n if (!isValidUrlCitation(annotation, seenUrls)) continue\n const ann = annotation\n seenUrls.add(ann.url)\n const start = Math.max(0, (ann.start_index ?? 0) - 120)\n const end = Math.min(\n block.text?.length ?? 0,\n (ann.end_index ?? block.text?.length ?? 0) + 120,\n )\n sources.push({\n url: ann.url,\n title: ann.title ?? ann.url,\n snippet: block.text?.slice(start, end).trim(),\n })\n }\n }\n return { textParts, sources }\n}\n\nconst collectQuery = (\n item: { action?: { query?: string; queries?: Array<string> } },\n queries: Array<string>,\n): void => {\n if (item.action?.queries?.length) {\n queries.push(...item.action.queries)\n } else if (item.action?.query) {\n queries.push(item.action.query)\n }\n}\n\n/**\n * Extracts the answer text, deduped sources, and run queries from a GPT\n * /responses web_search result.\n */\nexport const extractWebSearchResult = (\n result: ResponsesResult,\n): WebSearchExtract => {\n const textParts: Array<string> = []\n const sources: Array<WebSearchSource> = []\n const seenUrls = new Set<string>()\n const queries: Array<string> = []\n\n for (const item of result.output) {\n if (isMessageItem(item)) {\n const collected = collectTextParts(item.content, seenUrls)\n textParts.push(...collected.textParts)\n sources.push(...collected.sources)\n }\n }\n\n for (const item of result.output) {\n if ((item as { type?: string }).type === \"web_search_call\") {\n const action = (\n item as {\n action?: {\n query?: string\n queries?: Array<string>\n sources?: Array<{ url?: string }>\n }\n }\n ).action\n collectQuery({ action }, queries)\n for (const source of action?.sources ?? []) {\n if (!source.url || seenUrls.has(source.url)) continue\n seenUrls.add(source.url)\n sources.push({ url: source.url, title: source.url })\n }\n }\n }\n\n const answerText =\n textParts.join(\"\\n\\n\").trim() || (result.output_text ?? \"\").trim()\n return { answerText, sources, queries }\n}\n","import consola from \"consola\"\n\nconst copilotRateLimitTypes = [\"session\", \"weekly\"] as const\n\nexport type CopilotRateLimitType = (typeof copilotRateLimitTypes)[number]\ntype HeadersMap = Record<string, string | undefined>\ntype HeadersLike = Headers | HeadersMap\ntype QuotaSnapshotMap = Record<string, unknown>\n\nexport interface CopilotRateLimitUsage {\n type: CopilotRateLimitType\n remaining: string\n resetAt: string\n}\n\nexport interface CopilotQuotaSnapshot {\n entitlement: string\n percent_remaining: number\n overage_permitted: boolean\n overage_count: number\n reset_date: string\n}\n\nconst copilotRateLimitHeaders: Record<CopilotRateLimitType, string> = {\n session: \"x-usage-ratelimit-session\",\n weekly: \"x-usage-ratelimit-weekly\",\n}\n\nconst copilotQuotaSnapshotKeys: Record<CopilotRateLimitType, string> = {\n session: \"5Hour-Session-RateLimits\",\n weekly: \"Weekly-Session-RateLimits\",\n}\n\nconst hasGetMethod = (headers: HeadersLike): headers is Headers => {\n return \"get\" in headers && typeof headers.get === \"function\"\n}\n\nconst getHeaderValue = (\n headers: HeadersLike,\n headerName: string,\n): string | null => {\n if (hasGetMethod(headers)) {\n return headers.get(headerName)\n }\n\n const normalizedHeaderName = headerName.toLowerCase()\n const matchedEntry = Object.entries(headers).find(\n ([key]) => key.toLowerCase() === normalizedHeaderName,\n )\n\n return matchedEntry?.[1] ?? null\n}\n\nexport const parseCopilotRateLimitHeader = (\n headerValue: string,\n): Omit<CopilotRateLimitUsage, \"type\"> | null => {\n const params = new URLSearchParams(headerValue)\n const remaining = params.get(\"rem\")\n const resetAt = params.get(\"rst\")\n\n if (!remaining || !resetAt) {\n return null\n }\n\n return {\n remaining,\n resetAt,\n }\n}\n\nexport const getCopilotRateLimitUsage = (\n headers: HeadersLike,\n type: CopilotRateLimitType,\n): CopilotRateLimitUsage | null => {\n const headerName = copilotRateLimitHeaders[type]\n const headerValue = getHeaderValue(headers, headerName)\n\n if (!headerValue) {\n return null\n }\n\n const parsed = parseCopilotRateLimitHeader(headerValue)\n\n if (!parsed) {\n return null\n }\n\n return {\n type,\n ...parsed,\n }\n}\n\nexport const getCopilotRateLimitUsageFromSnapshots = (\n snapshots: QuotaSnapshotMap | undefined,\n type: CopilotRateLimitType,\n): CopilotRateLimitUsage | null => {\n const snapshot = snapshots?.[copilotQuotaSnapshotKeys[type]]\n if (!isCopilotQuotaSnapshot(snapshot)) {\n return null\n }\n\n return {\n remaining: String(snapshot.percent_remaining),\n resetAt: snapshot.reset_date,\n type,\n }\n}\n\nexport const logCopilotRateLimits = (headers: HeadersLike): void => {\n for (const type of copilotRateLimitTypes) {\n const usage = getCopilotRateLimitUsage(headers, type)\n\n if (!usage) {\n continue\n }\n\n logCopilotRateLimitUsage(usage)\n }\n}\n\nexport const logCopilotQuotaSnapshots = (\n snapshots: QuotaSnapshotMap | undefined,\n): void => {\n for (const type of copilotRateLimitTypes) {\n const usage = getCopilotRateLimitUsageFromSnapshots(snapshots, type)\n\n if (!usage) {\n continue\n }\n\n logCopilotRateLimitUsage(usage)\n }\n}\n\nconst logCopilotRateLimitUsage = (usage: CopilotRateLimitUsage): void => {\n const d = new Date(usage.resetAt)\n const dateStr = Number.isNaN(d.getTime()) ? usage.resetAt : d.toLocaleString()\n consola.log(\n `Copilot ${usage.type} quota remaining: ${usage.remaining}, resets at: ${dateStr}`,\n )\n}\n\nconst isCopilotQuotaSnapshot = (\n value: unknown,\n): value is CopilotQuotaSnapshot => {\n if (!value || typeof value !== \"object\") {\n return false\n }\n\n const record = value as Record<string, unknown>\n return (\n typeof record.entitlement === \"string\"\n && typeof record.percent_remaining === \"number\"\n && typeof record.overage_permitted === \"boolean\"\n && typeof record.overage_count === \"number\"\n && typeof record.reset_date === \"string\"\n )\n}\n","import consola from \"consola\"\nimport { createHash } from \"node:crypto\"\n\nimport type { SubagentMarker } from \"~/lib/subagent\"\nimport type {\n CreateResponsesReturn,\n ResponsesPayload,\n ResponsesResult,\n ResponsesStream,\n ResponsesTransport,\n} from \"~/lib/types/responses\"\nimport type { PooledWebSocketRequest } from \"~/services/responses-websocket\"\n\nimport {\n copilotBaseUrl,\n copilotHeaders,\n copilotWebSocketHeaders,\n prepareForCompact,\n prepareInteractionHeaders,\n} from \"~/lib/api-config\"\nimport { COMPACT_REQUEST, type CompactType } from \"~/lib/compact\"\nimport { getResponsesTransportConfig } from \"~/lib/config\"\nimport {\n logCopilotQuotaSnapshots,\n logCopilotRateLimits,\n type CopilotQuotaSnapshot,\n} from \"~/lib/copilot-rate-limit\"\nimport { HTTPError } from \"~/lib/error\"\nimport { state } from \"~/lib/state\"\nimport {\n createPooledWebSocketStream,\n createWebSocketUrl,\n} from \"~/services/responses-websocket\"\nimport {\n createResponsesSafeStream,\n encodePoolKeyPart,\n isTerminalResponsesStreamChunk,\n} from \"~/services/responses-websocket-helpers\"\nimport {\n createResponsesHttpEventStream,\n fetchResponsesWithLifecycle,\n} from \"~/services/responses-http\"\n\ninterface ResponsesRequestOptions {\n vision: boolean\n initiator: \"agent\" | \"user\"\n subagentMarker?: SubagentMarker | null\n requestId: string\n sessionId?: string\n compactType?: CompactType\n transport?: ResponsesTransport\n signal?: AbortSignal\n}\n\nexport const createResponses = async (\n payload: ResponsesPayload,\n {\n vision,\n initiator,\n subagentMarker,\n requestId,\n sessionId,\n compactType,\n transport = \"http\",\n signal,\n }: ResponsesRequestOptions,\n): Promise<CreateResponsesReturn> => {\n if (!state.copilotToken) throw new Error(\"Copilot token not found\")\n\n const headers: Record<string, string> = {\n ...copilotHeaders(state, requestId, vision),\n \"x-initiator\": initiator,\n }\n\n prepareInteractionHeaders(sessionId, Boolean(subagentMarker), headers)\n\n prepareForCompact(headers, compactType)\n\n // service_tier is not supported by github copilot\n payload.service_tier = undefined\n\n consola.log(`<-- model: ${payload.model}`)\n\n const effectiveTransport =\n compactType === COMPACT_REQUEST ? \"http\" : transport\n\n if (payload.stream === true && effectiveTransport === \"websocket\") {\n const websocketRequest = prepareResponsesWebSocketRequest(\n payload,\n headers,\n {\n requestId,\n signal,\n subagentMarker,\n },\n )\n const stream = createPooledResponsesWebSocketStream(websocketRequest)\n return stream\n }\n\n return await createHttpResponses(payload, headers, signal)\n}\n\nconst createHttpResponses = async (\n payload: ResponsesPayload,\n headers: Record<string, string>,\n signal?: AbortSignal,\n): Promise<CreateResponsesReturn> => {\n const transportConfig = getResponsesTransportConfig()\n const response = await fetchResponsesWithLifecycle(\n `${copilotBaseUrl(state)}/responses`,\n {\n method: \"POST\",\n headers,\n body: JSON.stringify(payload),\n },\n {\n headersTimeoutMs: transportConfig.headersTimeoutMs,\n signal,\n streamInactivityTimeoutMs: transportConfig.streamInactivityTimeoutMs,\n },\n )\n\n logCopilotRateLimits(response.headers)\n\n if (!response.ok) {\n consola.error(\"Failed to create responses\", response)\n throw new HTTPError(\"Failed to create responses\", response)\n }\n\n if (payload.stream) {\n return createResponsesSafeStream(\n createResponsesHttpEventStream(response, signal),\n { signal },\n )\n }\n\n return (await response.json()) as ResponsesResult\n}\n\ntype ResponsesWebSocketPayload = ResponsesPayload & {\n type: \"response.create\"\n initiator: \"agent\" | \"user\"\n}\n\ntype ResponsesWebSocketRequest =\n PooledWebSocketRequest<ResponsesWebSocketPayload>\n\nexport const prepareResponsesWebSocketRequest = (\n payload: ResponsesPayload,\n preparedHeaders: Record<string, string>,\n options: {\n requestId: string\n signal?: AbortSignal\n subagentMarker?: SubagentMarker | null\n },\n): ResponsesWebSocketRequest => {\n const initiator = getResponsesWebSocketInitiator(preparedHeaders)\n\n return {\n headers: copilotWebSocketHeaders(preparedHeaders),\n poolKey: buildResponsesWebSocketPoolKey(payload, options),\n payload: buildResponsesWebSocketPayload(payload, initiator),\n signal: options.signal,\n url: buildResponsesWebSocketUrl(copilotBaseUrl(state)),\n }\n}\n\nexport const buildResponsesWebSocketPoolKey = (\n payload: ResponsesPayload,\n {\n requestId,\n subagentMarker,\n }: {\n requestId: string\n subagentMarker?: SubagentMarker | null\n },\n): string => {\n const tokenFingerprint =\n state.copilotToken ?\n createHash(\"sha256\").update(state.copilotToken).digest(\"hex\").slice(0, 16)\n : \"missing-token\"\n const subagentKey =\n subagentMarker ?\n [\n subagentMarker.session_id,\n subagentMarker.agent_id,\n subagentMarker.agent_type,\n ].join(\":\")\n : \"main\"\n\n return [tokenFingerprint, payload.model, requestId, subagentKey]\n .map(encodePoolKeyPart)\n .join(\"|\")\n}\n\nexport const getResponsesWebSocketInitiator = (\n preparedHeaders: Record<string, string>,\n): \"agent\" | \"user\" => {\n const initiator = getHeaderValue(preparedHeaders, \"x-initiator\")\n return initiator?.toLowerCase() === \"agent\" ? \"agent\" : \"user\"\n}\n\nconst createPooledResponsesWebSocketStream = (\n request: ResponsesWebSocketRequest,\n): ResponsesStream => {\n const transportConfig = getResponsesTransportConfig()\n return createResponsesSafeStream(\n createPooledWebSocketStream(request, {\n createChunk: createResponsesWebSocketStreamChunk,\n maxBufferedBytes: transportConfig.websocketMaxBufferedBytes,\n maxBufferedMessages: transportConfig.websocketMaxBufferedMessages,\n isTerminalChunk: isTerminalResponsesStreamChunk,\n openErrorMessage: \"Failed to create responses websocket\",\n openTimeoutMs: transportConfig.websocketOpenTimeoutMs,\n poolIdleTimeoutMs: transportConfig.websocketPoolIdleTimeoutMs,\n streamInactivityTimeoutMs: transportConfig.streamInactivityTimeoutMs,\n streamErrorMessage:\n \"Upstream connection lost, Responses websocket stream error\",\n terminalChunkMissingMessage:\n \"Responses websocket ended without a terminal response, retry your request.\",\n }),\n { signal: request.signal },\n )\n}\n\nexport const buildResponsesWebSocketPayload = (\n payload: ResponsesPayload,\n initiator: \"agent\" | \"user\",\n): ResponsesWebSocketPayload => {\n const websocketPayload: ResponsesWebSocketPayload = {\n ...payload,\n type: \"response.create\",\n initiator,\n }\n\n delete websocketPayload.stream\n delete websocketPayload[\"background\"]\n delete websocketPayload.service_tier\n\n return websocketPayload\n}\n\nexport const buildResponsesWebSocketUrl = (baseUrl: string): string => {\n return createWebSocketUrl(`${baseUrl.replace(/\\/+$/u, \"\")}/responses`)\n}\n\nconst getHeaderValue = (\n headers: Record<string, string>,\n headerName: string,\n): string | undefined => {\n const normalizedHeaderName = headerName.toLowerCase()\n const match = Object.entries(headers).find(\n ([key]) => key.toLowerCase() === normalizedHeaderName,\n )\n\n return match?.[1]\n}\n\nconst createResponsesWebSocketStreamChunk = (\n data: string,\n): { data?: string; event?: string; id?: string } => {\n if (data === \"[DONE]\") {\n return { data }\n }\n\n try {\n const parsed = JSON.parse(data) as {\n copilot_quota_snapshots?: Record<string, CopilotQuotaSnapshot>\n id?: unknown\n type?: unknown\n error?: {\n code: string | null\n message: string\n }\n code?: string | null\n message?: string\n }\n if (parsed.type === \"response.completed\") {\n logCopilotQuotaSnapshots(parsed.copilot_quota_snapshots)\n }\n if (parsed.type === \"error\" && parsed.error) {\n consola.warn(\"Copilot responses websocket stream error:\", parsed.error)\n parsed.code = parsed.error.code\n parsed.message = parsed.error.message\n }\n return {\n event: typeof parsed.type === \"string\" ? parsed.type : undefined,\n data: JSON.stringify(parsed),\n id: typeof parsed.id === \"string\" ? parsed.id : undefined,\n }\n } catch {\n return { data }\n }\n}\n","import { getGlobalDispatcher, type Dispatcher } from \"undici\"\n\n/**\n * Node's global fetch keeps Undici's shorter default headers/body timeouts.\n * Wrap the global dispatcher so long-running requests (e.g. image\n * generation) get an explicit cap.\n */\nexport const createTimeoutDispatcher = (timeoutMs: number): Dispatcher =>\n ({\n dispatch(\n options: Dispatcher.DispatchOptions,\n handler: Dispatcher.DispatchHandler,\n ) {\n return getGlobalDispatcher().dispatch(\n {\n ...options,\n bodyTimeout: timeoutMs,\n headersTimeout: timeoutMs,\n },\n handler,\n )\n },\n }) as Dispatcher\n","import consola from \"consola\"\nimport {\n fetch as undiciFetch,\n type RequestInit as UndiciRequestInit,\n} from \"undici\"\n\nimport type { ResolvedProviderConfig } from \"~/lib/config\"\nimport { createTimeoutDispatcher } from \"~/lib/timeout-dispatcher\"\nimport type { AnthropicMessagesPayload } from \"~/lib/types/anthropic\"\nimport type { ChatCompletionsPayload } from \"~/lib/types/chat-completions\"\nimport type { ResponsesPayload } from \"~/lib/types/responses\"\nimport { getResponsesTransportConfig } from \"~/lib/config\"\nimport { fetchResponsesWithLifecycle } from \"~/services/responses-http\"\n\nconst SHARED_FORWARDABLE_HEADERS = [\"accept\", \"user-agent\"] as const\n\nconst ANTHROPIC_FORWARDABLE_HEADERS = [\n \"anthropic-version\",\n \"anthropic-beta\",\n] as const\n\nconst STRIPPED_RESPONSE_HEADERS = [\n \"connection\",\n \"content-encoding\",\n \"content-length\",\n \"keep-alive\",\n \"proxy-authenticate\",\n \"proxy-authorization\",\n \"te\",\n \"trailer\",\n \"transfer-encoding\",\n \"upgrade\",\n] as const\n\nexport function buildProviderUpstreamHeaders(\n providerConfig: ResolvedProviderConfig,\n requestHeaders: Headers,\n): Record<string, string> {\n const authHeaders: Record<string, string> = {}\n if (providerConfig.authType === \"x-api-key\") {\n authHeaders[\"x-api-key\"] = providerConfig.apiKey\n } else {\n authHeaders.authorization = `Bearer ${providerConfig.apiKey}`\n }\n\n const headers: Record<string, string> = {\n \"content-type\": \"application/json\",\n accept: \"application/json\",\n ...authHeaders,\n }\n\n for (const headerName of SHARED_FORWARDABLE_HEADERS) {\n const headerValue = requestHeaders.get(headerName)\n if (headerValue) {\n headers[headerName] = headerValue\n }\n }\n\n if (providerConfig.type !== \"anthropic\") {\n return headers\n }\n\n for (const headerName of ANTHROPIC_FORWARDABLE_HEADERS) {\n const headerValue = requestHeaders.get(headerName)\n if (headerValue) {\n headers[headerName] = headerValue\n }\n }\n\n return headers\n}\n\nexport function createProviderProxyResponse(\n upstreamResponse: Response,\n body?: ReadableStream<Uint8Array> | null,\n): Response {\n const headers = new Headers(upstreamResponse.headers)\n\n for (const headerName of STRIPPED_RESPONSE_HEADERS) {\n headers.delete(headerName)\n }\n\n return new Response(body ?? upstreamResponse.body, {\n headers,\n status: upstreamResponse.status,\n statusText: upstreamResponse.statusText,\n })\n}\n\nexport async function forwardProviderMessages(\n providerConfig: ResolvedProviderConfig,\n payload: AnthropicMessagesPayload,\n requestHeaders: Headers,\n): Promise<Response> {\n consola.log(`<-- model: ${payload.model}`)\n return await fetch(`${providerConfig.baseUrl}/v1/messages`, {\n method: \"POST\",\n headers: buildProviderUpstreamHeaders(providerConfig, requestHeaders),\n body: JSON.stringify(payload),\n })\n}\n\nexport async function forwardProviderChatCompletions(\n providerConfig: ResolvedProviderConfig,\n payload: ChatCompletionsPayload,\n requestHeaders: Headers,\n): Promise<Response> {\n consola.log(`<-- model: ${payload.model}`)\n return await fetch(`${providerConfig.baseUrl}/v1/chat/completions`, {\n method: \"POST\",\n headers: buildProviderUpstreamHeaders(providerConfig, requestHeaders),\n body: JSON.stringify(payload),\n })\n}\n\nexport async function forwardProviderResponses(\n providerConfig: ResolvedProviderConfig,\n payload: ResponsesPayload,\n requestHeaders: Headers,\n options: { signal?: AbortSignal } = {},\n): Promise<Response> {\n consola.log(`<-- model: ${payload.model}`)\n const transportConfig = getResponsesTransportConfig()\n return await fetchResponsesWithLifecycle(\n `${providerConfig.baseUrl}/v1/responses`,\n {\n method: \"POST\",\n headers: buildProviderUpstreamHeaders(providerConfig, requestHeaders),\n body: JSON.stringify(payload),\n },\n {\n headersTimeoutMs: transportConfig.headersTimeoutMs,\n signal: options.signal,\n streamInactivityTimeoutMs: transportConfig.streamInactivityTimeoutMs,\n },\n )\n}\n\nconst PROVIDER_MODELS_TIMEOUT_MS = 15_000\n\nexport async function forwardProviderModels(\n providerConfig: ResolvedProviderConfig,\n requestHeaders: Headers,\n): Promise<Response> {\n return await fetch(`${providerConfig.baseUrl}/v1/models`, {\n method: \"GET\",\n headers: buildProviderUpstreamHeaders(providerConfig, requestHeaders),\n signal: AbortSignal.timeout(PROVIDER_MODELS_TIMEOUT_MS),\n })\n}\n\n/** Align with Codex images: long-running generation/edits need a generous cap. */\nconst PROVIDER_IMAGES_TIMEOUT_MS = 15 * 60 * 1000\n\nconst providerImagesDispatcher = createTimeoutDispatcher(\n PROVIDER_IMAGES_TIMEOUT_MS,\n)\n\nfunction resolveProviderRequestUrl(\n providerConfig: ResolvedProviderConfig,\n requestUrl: string,\n path: string,\n): string {\n const upstreamUrl = new URL(`${providerConfig.baseUrl}${path}`)\n upstreamUrl.search = new URL(requestUrl, \"http://localhost\").search\n return upstreamUrl.toString()\n}\n\nexport async function forwardProviderAlphaSearch(\n providerConfig: ResolvedProviderConfig,\n request: Request,\n): Promise<Response> {\n const headers = buildProviderUpstreamHeaders(providerConfig, request.headers)\n const body = await request.arrayBuffer()\n\n return await fetch(\n resolveProviderRequestUrl(providerConfig, request.url, \"/v1/alpha/search\"),\n {\n method: \"POST\",\n headers,\n body,\n },\n )\n}\n\nexport async function forwardProviderImages(\n providerConfig: ResolvedProviderConfig,\n request: Request,\n operation: \"generations\" | \"edits\",\n): Promise<Response> {\n const headers = buildProviderUpstreamHeaders(providerConfig, request.headers)\n const contentType = request.headers.get(\"content-type\")\n if (contentType) {\n headers[\"content-type\"] = contentType\n } else if (operation === \"edits\") {\n delete headers[\"content-type\"]\n }\n\n const init: RequestInit & { duplex: \"half\" } = {\n method: \"POST\",\n headers,\n body: request.body,\n duplex: \"half\",\n signal: AbortSignal.timeout(PROVIDER_IMAGES_TIMEOUT_MS),\n }\n\n const upstreamUrl = resolveProviderRequestUrl(\n providerConfig,\n request.url,\n `/v1/images/${operation}`,\n )\n\n if (typeof Bun !== \"undefined\") {\n return await fetch(upstreamUrl, init)\n }\n\n // Node's global fetch keeps Undici's shorter default headers/body timeouts.\n // Use an explicit dispatcher so the documented 15-minute cap applies there.\n return (await undiciFetch(upstreamUrl, {\n ...init,\n dispatcher: providerImagesDispatcher,\n } as unknown as UndiciRequestInit)) as unknown as Response\n}\n","import type { Context } from \"hono\"\nimport consola from \"consola\"\n\nimport {\n resolveEffectiveProviderType,\n resolveMappedModel,\n type ResolvedProviderConfig,\n} from \"~/lib/config\"\nimport { HTTPError } from \"~/lib/error\"\nimport { debugJson, createHandlerLogger } from \"~/lib/logger\"\nimport { findEndpointModel } from \"~/lib/models\"\nimport {\n createCopilotTokenUsageRecorder,\n createProviderTokenUsageRecorder,\n normalizeOptionalToken,\n normalizeResponsesUsage,\n type UsageTokens,\n} from \"~/lib/token-usage\"\nimport { resolveProviderConfig } from \"~/lib/provider-resolver\"\nimport { generateRequestIdFromPayload, getUUID } from \"~/lib/utils\"\nimport {\n alphaSearchRequestSchema,\n type AlphaSearchCommands,\n type AlphaSearchRequest,\n type AlphaSearchResponse,\n type AlphaSearchTextResult,\n} from \"~/routes/alpha-search/alpha-search-types\"\nimport {\n buildResponsesWebSearchTool,\n extractWebSearchResult,\n type WebSearchSource,\n} from \"~/routes/messages/web-search/backend\"\nimport type { ResponsesPayload, ResponsesResult } from \"~/lib/types/responses\"\nimport { createResponses as createCopilotResponses } from \"~/services/copilot/create-responses\"\nimport { forwardProviderResponses } from \"~/services/providers/provider-proxy\"\n\nconst logger = createHandlerLogger(\"alpha-search-responses-handler\")\n\nconst SESSION_TTL_MS = 60 * 60 * 1000\nconst MAX_SESSIONS = 128\nconst MAX_URL_REFERENCES = 256\nconst MAX_SNAPSHOTS = 16\nconst MAX_SNAPSHOT_CHARACTERS = 20_000\n// ponytail: bounded process-local state is intentional; use persistent\n// per-account storage only if measured sessions outgrow these fixed ceilings.\n\nconst IMAGE_UNSUPPORTED =\n \"Unsupported by GitHub Copilot web search: image_query. Do not retry this operation; use search_query for image-source pages.\"\nconst SCREENSHOT_UNSUPPORTED =\n \"Unsupported by GitHub Copilot web search: screenshot. Do not retry this operation; open the PDF for text content.\"\n\nconst KNOWN_COMMANDS = new Set([\n \"search_query\",\n \"image_query\",\n \"open\",\n \"click\",\n \"find\",\n \"screenshot\",\n \"finance\",\n \"weather\",\n \"sports\",\n \"time\",\n \"response_length\",\n])\n\ninterface UrlReference {\n result: AlphaSearchTextResult\n}\n\ninterface PageSnapshot {\n refId: string\n source: UrlReference\n text: string\n links: Array<UrlReference>\n}\n\ninterface SearchSession {\n nextTurn: number\n touchedAt: number\n referencesById: Map<string, UrlReference>\n referencesByUrl: Map<string, UrlReference>\n snapshots: Map<string, PageSnapshot>\n}\n\ninterface RemotePageOperation {\n kind: \"open\" | \"find\"\n source: UrlReference\n lineno?: number\n pattern?: string\n}\n\ninterface RemoteOperation {\n operation: string\n [key: string]: unknown\n}\n\ninterface PageOperationOptions {\n lineno?: number\n pattern?: string\n}\n\ninterface SearchTurn {\n number: number\n nextReferenceIndex: number\n}\n\ninterface SearchOperationState {\n session: SearchSession\n turn: SearchTurn\n output: Array<string>\n warnings: Array<string>\n resultReferences: Map<string, UrlReference>\n remoteOperations: Array<RemoteOperation>\n remotePages: Array<RemotePageOperation>\n}\n\nexport interface AlphaSearchResponsesOptions {\n provider?: string\n request: AlphaSearchRequest\n}\n\ninterface RemoteModelTarget {\n model: string\n providerConfig?: ResolvedProviderConfig\n}\n\nconst sessions = new Map<string, SearchSession>()\n\nexport const alphaSearchResponsesDependencies = {\n createResponses: createCopilotResponses,\n findEndpointModel,\n now: (): number => Date.now(),\n resolveMappedModel,\n resolveEffectiveProviderType,\n resolveProviderConfig,\n createUsageRecorder: (\n model: string,\n sessionId: string,\n ): ((usage: UsageTokens) => void) =>\n createCopilotTokenUsageRecorder({\n endpoint: \"responses\",\n fallbackSessionId: sessionId,\n model,\n }),\n}\n\nexport function resetAlphaSearchState(): void {\n sessions.clear()\n}\n\nfunction reserveSession(\n id: string,\n now: number,\n): {\n session: SearchSession\n turn: number\n} {\n for (const [sessionId, session] of sessions) {\n if (now - session.touchedAt >= SESSION_TTL_MS) {\n sessions.delete(sessionId)\n }\n }\n\n let session = sessions.get(id)\n if (!session) {\n if (sessions.size >= MAX_SESSIONS) {\n const oldestSession = sessions.keys().next()\n if (!oldestSession.done) sessions.delete(oldestSession.value)\n }\n session = {\n nextTurn: 0,\n touchedAt: now,\n referencesById: new Map(),\n referencesByUrl: new Map(),\n snapshots: new Map(),\n }\n } else {\n sessions.delete(id)\n session.touchedAt = now\n }\n sessions.set(id, session)\n\n const turn = session.nextTurn\n session.nextTurn += 1\n return { session, turn }\n}\n\nfunction parseHttpUrl(value: string): string | null {\n try {\n const url = new URL(value)\n return url.protocol === \"http:\" || url.protocol === \"https:\" ?\n url.toString()\n : null\n } catch {\n return null\n }\n}\n\nfunction extractMarkdownSources(text: string): Array<WebSearchSource> {\n // ponytail: Copilot emits simple Markdown links here; add a Markdown parser\n // only if measured responses exceed this shape.\n return Array.from(\n text.matchAll(\n /(?<!!)\\[([^\\]\\n]+)\\]\\((https?:\\/\\/(?:[^\\s<>()]|\\([^\\s<>()]*\\))+)\\)/gu, //NOSONAR\n ),\n ([, title, url]) => ({ title, url }),\n )\n}\n\nfunction addUrlReference(\n session: SearchSession,\n source: WebSearchSource,\n turn: SearchTurn,\n): UrlReference | null {\n const url = parseHttpUrl(source.url)\n if (!url) return null\n\n const existing = session.referencesByUrl.get(url)\n if (existing) {\n if (existing.result.title === existing.result.url && source.title) {\n existing.result.title = source.title\n }\n if (source.snippet) existing.result.snippet = source.snippet\n return existing\n }\n\n if (session.referencesById.size >= MAX_URL_REFERENCES) {\n const oldest = session.referencesById.entries().next().value\n if (oldest) {\n const [refId, reference] = oldest\n session.referencesById.delete(refId)\n session.referencesByUrl.delete(reference.result.url)\n }\n }\n\n const refId = `turn${turn.number}search${turn.nextReferenceIndex}`\n turn.nextReferenceIndex += 1\n\n const reference: UrlReference = {\n result: {\n type: \"text_result\",\n domain: new URL(url).hostname,\n ref_id: refId,\n snippet: source.snippet?.trim() || source.title || url,\n title: source.title || url,\n url,\n },\n }\n session.referencesById.set(refId, reference)\n session.referencesByUrl.set(url, reference)\n return reference\n}\n\nfunction resolveUrlReference(\n session: SearchSession,\n refId: string,\n turn: SearchTurn,\n): UrlReference | null {\n const stored = session.referencesById.get(refId)\n if (stored) return stored\n\n const url = parseHttpUrl(refId)\n return url ? addUrlReference(session, { title: url, url }, turn) : null\n}\n\nfunction getSnapshot(\n session: SearchSession,\n refId: string,\n): PageSnapshot | null {\n const snapshot = session.snapshots.get(refId)\n if (!snapshot) return null\n session.snapshots.delete(refId)\n session.snapshots.set(refId, snapshot)\n return snapshot\n}\n\nfunction findSnapshotByUrl(\n session: SearchSession,\n url: string,\n): PageSnapshot | null {\n for (const snapshot of session.snapshots.values()) {\n if (snapshot.source.result.url === url) {\n return getSnapshot(session, snapshot.refId)\n }\n }\n return null\n}\n\nfunction addSnapshot(\n session: SearchSession,\n source: UrlReference,\n turn: number,\n index: number,\n text: string,\n links: Array<UrlReference>,\n): PageSnapshot {\n const existing = findSnapshotByUrl(session, source.result.url)\n if (existing) {\n existing.text = text.slice(0, MAX_SNAPSHOT_CHARACTERS)\n existing.links = links\n return existing\n }\n\n if (session.snapshots.size >= MAX_SNAPSHOTS) {\n const oldestRefId = session.snapshots.keys().next().value\n if (oldestRefId) session.snapshots.delete(oldestRefId)\n }\n\n const snapshot = {\n refId: `turn${turn}view${index}`,\n source,\n text: text.slice(0, MAX_SNAPSHOT_CHARACTERS),\n links,\n }\n session.snapshots.set(snapshot.refId, snapshot)\n return snapshot\n}\n\nfunction renderSnapshot(snapshot: PageSnapshot, lineno?: number): string {\n const lines = snapshot.text.split(\"\\n\")\n const start =\n lineno === undefined ? 0 : (\n Math.max(0, Math.min(lineno, lines.length - 1) - 10)\n )\n const end =\n lineno === undefined ? lines.length : Math.min(lines.length, start + 21)\n const numbered = lines\n .slice(start, end)\n .map((line, index) => `L${start + index}: ${line}`)\n .join(\"\\n\")\n const links = snapshot.links\n .map(\n (link, index) =>\n `[${index}] ${link.result.title} — ${link.result.url} (${link.result.ref_id})`,\n )\n .join(\"\\n\")\n\n return [\n `Open ${snapshot.refId} (${snapshot.source.result.url})`,\n numbered,\n links ? `Links:\\n${links}` : \"\",\n ]\n .filter(Boolean)\n .join(\"\\n\")\n}\n\nfunction findInSnapshot(\n snapshot: PageSnapshot,\n pattern: string,\n): string | null {\n const normalizedPattern = pattern.toLowerCase()\n const matches = snapshot.text\n .split(\"\\n\")\n .map((line, index) => ({ line, index }))\n .filter(({ line }) => line.toLowerCase().includes(normalizedPattern))\n .slice(0, 20)\n if (matches.length === 0) return null\n\n return [\n `Find results for ${JSON.stringify(pattern)} in ${snapshot.refId}:`,\n ...matches.map(({ line, index }) => `L${index}: ${line}`),\n ].join(\"\\n\")\n}\n\nfunction formatTime(utcOffset: string, now: number): string {\n const direction = utcOffset.startsWith(\"+\") ? 1 : -1\n const offsetMinutes =\n direction\n * (Number.parseInt(utcOffset.slice(1, 3), 10) * 60\n + Number.parseInt(utcOffset.slice(4, 6), 10))\n const localIso = new Date(now + offsetMinutes * 60_000).toISOString()\n return `Time at UTC${utcOffset}: ${localIso.slice(0, 19).replace(\"T\", \" \")}`\n}\n\nfunction buildInstruction(\n operations: Array<RemoteOperation>,\n responseLength: \"short\" | \"medium\" | \"long\" | undefined,\n): string {\n return [\n \"The Operations JSON below is the complete and exclusive request for this response.\",\n \"Use web_search to execute every listed operation and only those operations. Do not validate, infer, or mention operations absent from the JSON; the adapter already handled them.\",\n \"Return only grounded results and citations for these operations. Do not discuss unrelated tasks or conversations.\",\n \"For search operations, honor every query, recency, domain, market, date, league, team, and locale constraint.\",\n \"For open operations, open the exact URL and return grounded page text plus cited links.\",\n \"For find operations, find the exact pattern in the specified URL and return matching context.\",\n `Requested response length: ${responseLength ?? \"medium\"}.`,\n `Operations:\\n${JSON.stringify(operations, null, 2)}`,\n ].join(\"\\n\")\n}\n\nfunction unavailableReference(refId: string): string {\n return `Reference ${JSON.stringify(refId)} is unavailable or expired. Search or open the URL again.`\n}\n\nfunction invalidRequest(c: Context, message: string): Response {\n return c.json(\n {\n error: {\n message,\n type: \"invalid_request_error\",\n },\n },\n 400,\n )\n}\n\nfunction createSearchOperationState(\n session: SearchSession,\n turn: SearchTurn,\n): SearchOperationState {\n return {\n session,\n turn,\n output: [],\n warnings: [],\n resultReferences: new Map(),\n remoteOperations: [],\n remotePages: [],\n }\n}\n\nfunction includeResult(\n state: SearchOperationState,\n reference: UrlReference,\n): void {\n state.resultReferences.set(reference.result.url, reference)\n}\n\nfunction queuePage(\n state: SearchOperationState,\n kind: \"open\" | \"find\",\n source: UrlReference,\n options: PageOperationOptions = {},\n): void {\n state.remoteOperations.push({\n operation: kind,\n url: source.result.url,\n ...(options.lineno === undefined ? {} : { lineno: options.lineno }),\n ...(options.pattern === undefined ? {} : { pattern: options.pattern }),\n })\n state.remotePages.push({ kind, source, ...options })\n includeResult(state, source)\n}\n\nfunction processSearchCommands(\n commands: AlphaSearchCommands,\n state: SearchOperationState,\n): void {\n for (const command of commands.search_query ?? []) {\n state.remoteOperations.push({ ...command, operation: \"search_query\" })\n }\n}\n\nfunction processOpenCommands(\n commands: AlphaSearchCommands,\n state: SearchOperationState,\n): void {\n for (const command of commands.open ?? []) {\n const directSnapshot = getSnapshot(state.session, command.ref_id)\n if (directSnapshot) {\n state.output.push(renderSnapshot(directSnapshot, command.lineno))\n includeResult(state, directSnapshot.source)\n continue\n }\n\n const source = resolveUrlReference(\n state.session,\n command.ref_id,\n state.turn,\n )\n if (!source) {\n state.output.push(unavailableReference(command.ref_id))\n continue\n }\n const cached = findSnapshotByUrl(state.session, source.result.url)\n if (cached) {\n state.output.push(renderSnapshot(cached, command.lineno))\n includeResult(state, source)\n continue\n }\n queuePage(state, \"open\", source, { lineno: command.lineno })\n }\n}\n\nfunction processClickCommands(\n commands: AlphaSearchCommands,\n state: SearchOperationState,\n): void {\n for (const command of commands.click ?? []) {\n const parent = getSnapshot(state.session, command.ref_id)\n const source = parent?.links[command.id]\n if (!source) {\n state.output.push(\n unavailableReference(`${command.ref_id} link ${command.id}`),\n )\n continue\n }\n const cached = findSnapshotByUrl(state.session, source.result.url)\n if (cached) {\n state.output.push(renderSnapshot(cached))\n includeResult(state, source)\n continue\n }\n queuePage(state, \"open\", source)\n }\n}\n\nfunction processFindCommands(\n commands: AlphaSearchCommands,\n state: SearchOperationState,\n): void {\n for (const command of commands.find ?? []) {\n const directSnapshot = getSnapshot(state.session, command.ref_id)\n const source =\n directSnapshot?.source\n ?? resolveUrlReference(state.session, command.ref_id, state.turn)\n if (!source) {\n state.output.push(unavailableReference(command.ref_id))\n continue\n }\n const snapshot =\n directSnapshot ?? findSnapshotByUrl(state.session, source.result.url)\n const localResult =\n snapshot ? findInSnapshot(snapshot, command.pattern) : null\n if (localResult) {\n state.output.push(localResult)\n includeResult(state, source)\n continue\n }\n queuePage(state, \"find\", source, { pattern: command.pattern })\n }\n}\n\nfunction processStructuredCommands(\n commands: AlphaSearchCommands,\n state: SearchOperationState,\n now: number,\n): void {\n for (const command of commands.finance ?? []) {\n state.remoteOperations.push({ ...command, operation: \"finance\" })\n }\n for (const command of commands.weather ?? []) {\n state.remoteOperations.push({ ...command, operation: \"weather\" })\n }\n for (const command of commands.sports ?? []) {\n state.remoteOperations.push({ ...command, operation: \"sports\" })\n }\n for (const command of commands.time ?? []) {\n state.output.push(formatTime(command.utc_offset, now))\n }\n}\n\nfunction processUnsupportedCommands(\n commands: AlphaSearchCommands,\n state: SearchOperationState,\n): void {\n for (const commandName of Object.keys(commands)) {\n if (!KNOWN_COMMANDS.has(commandName)) {\n state.warnings.push(\n `Unsupported by GitHub Copilot web search: ${commandName}. Do not retry this operation.`,\n )\n }\n }\n}\n\nfunction processCommandOperations(\n commands: AlphaSearchCommands,\n state: SearchOperationState,\n now: number,\n): void {\n processSearchCommands(commands, state)\n if ((commands.image_query?.length ?? 0) > 0) {\n state.warnings.push(IMAGE_UNSUPPORTED)\n }\n processOpenCommands(commands, state)\n processClickCommands(commands, state)\n processFindCommands(commands, state)\n if ((commands.screenshot?.length ?? 0) > 0) {\n state.warnings.push(SCREENSHOT_UNSUPPORTED)\n }\n processStructuredCommands(commands, state, now)\n processUnsupportedCommands(commands, state)\n}\n\nfunction supportsLiveAccess(request: AlphaSearchRequest): boolean {\n const externalWebAccess = request.settings?.external_web_access\n return (\n externalWebAccess === undefined\n || externalWebAccess === true\n || externalWebAccess === \"live\"\n )\n}\n\nfunction addLiveAccessWarning(\n request: AlphaSearchRequest,\n state: SearchOperationState,\n): void {\n if (state.remoteOperations.length === 0 || supportsLiveAccess(request)) return\n state.warnings.push(\n `GitHub Copilot alpha search supports live retrieval only; external_web_access=${JSON.stringify(request.settings?.external_web_access)} is unsupported. Do not retry this request in this mode.`,\n )\n}\n\nfunction shouldExecuteRemoteOperations(\n request: AlphaSearchRequest,\n state: SearchOperationState,\n): boolean {\n return state.remoteOperations.length > 0 && supportsLiveAccess(request)\n}\n\nasync function resolveRemoteModel(\n c: Context,\n request: AlphaSearchRequest,\n provider?: string,\n): Promise<RemoteModelTarget | Response> {\n const model =\n provider ?\n request.model\n : alphaSearchResponsesDependencies.resolveMappedModel(request.model)\n if (provider) {\n const providerConfig =\n await alphaSearchResponsesDependencies.resolveProviderConfig(provider)\n if (!providerConfig) {\n return c.json(\n {\n error: {\n message: `Provider '${provider}' not found or disabled`,\n type: \"invalid_request_error\",\n },\n },\n 404,\n )\n }\n\n if (\n alphaSearchResponsesDependencies.resolveEffectiveProviderType(\n providerConfig,\n model,\n ) !== \"openai-responses\"\n ) {\n return invalidRequest(\n c,\n `Provider '${provider}' does not support the /v1/responses endpoint required for alpha search`,\n )\n }\n\n return { model, providerConfig }\n }\n\n const selectedModel =\n alphaSearchResponsesDependencies.findEndpointModel(model)\n if (!selectedModel?.supported_endpoints?.includes(\"/responses\")) {\n return invalidRequest(\n c,\n `Model '${model}' does not support the Copilot Responses endpoint required for alpha search`,\n )\n }\n return { model }\n}\n\nfunction createRemoteResponsesPayload(\n request: AlphaSearchRequest,\n model: string,\n instruction: string,\n): ResponsesPayload {\n return {\n model,\n input: instruction,\n tools: [\n buildResponsesWebSearchTool({\n allowedDomains: request.settings?.filters?.allowed_domains,\n blockedDomains: request.settings?.filters?.blocked_domains,\n userLocation: request.settings?.user_location,\n searchContextSize: request.settings?.search_context_size,\n }),\n ],\n tool_choice: \"required\",\n store: false,\n stream: false,\n include: [\"web_search_call.action.sources\"],\n reasoning: request.reasoning as ResponsesPayload[\"reasoning\"],\n max_output_tokens: request.max_output_tokens,\n }\n}\n\nasync function requestProviderSearch(\n c: Context,\n providerConfig: ResolvedProviderConfig,\n payload: ResponsesPayload,\n model: string,\n sessionId: string,\n): Promise<ResponsesResult> {\n debugJson(logger, \"Alpha search provider Responses request:\", {\n payload,\n provider: providerConfig.name,\n })\n const upstreamResponse = await forwardProviderResponses(\n providerConfig,\n payload,\n c.req.raw.headers,\n { signal: c.req.raw.signal },\n )\n if (!upstreamResponse.ok) {\n throw new HTTPError(\n `Failed to create ${providerConfig.name} responses for alpha search`,\n upstreamResponse,\n )\n }\n const result = (await upstreamResponse.json()) as ResponsesResult\n debugJson(logger, \"Alpha search provider Responses result:\", {\n provider: providerConfig.name,\n result,\n })\n createProviderTokenUsageRecorder({\n endpoint: \"responses\",\n fallbackSessionId: sessionId,\n model,\n pricing: providerConfig.models?.[model]?.pricing,\n pricingCurrency: providerConfig.pricingCurrency,\n providerName: providerConfig.name,\n sessionId,\n })(normalizeResponsesUsage(result.usage))\n return result\n}\n\nasync function requestCopilotSearch(\n payload: ResponsesPayload,\n model: string,\n requestId: string,\n sessionId: string,\n signal?: AbortSignal,\n): Promise<ResponsesResult> {\n debugJson(logger, \"Alpha search Copilot Responses request:\", payload)\n const result = (await alphaSearchResponsesDependencies.createResponses(\n payload,\n {\n vision: false,\n initiator: \"agent\",\n transport: \"http\",\n requestId,\n sessionId,\n signal,\n },\n )) as ResponsesResult\n debugJson(logger, \"Alpha search Copilot Responses result:\", result)\n\n alphaSearchResponsesDependencies.createUsageRecorder(\n model,\n sessionId,\n )({\n ...normalizeResponsesUsage(result.usage),\n total_nano_aiu: normalizeOptionalToken(\n result.copilot_usage?.total_nano_aiu,\n ),\n })\n return result\n}\n\nasync function requestRemoteSearch(\n c: Context,\n request: AlphaSearchRequest,\n state: SearchOperationState,\n target: RemoteModelTarget,\n): Promise<ResponsesResult> {\n const instruction = buildInstruction(\n state.remoteOperations,\n request.commands?.response_length,\n )\n const sessionId = getUUID(request.id)\n const requestId = generateRequestIdFromPayload(\n { messages: `${state.turn.number}:${instruction}` },\n sessionId,\n )\n const payload = createRemoteResponsesPayload(\n request,\n target.model,\n instruction,\n )\n\n if (target.providerConfig) {\n return await requestProviderSearch(\n c,\n target.providerConfig,\n payload,\n target.model,\n sessionId,\n )\n }\n\n return await requestCopilotSearch(\n payload,\n target.model,\n requestId,\n sessionId,\n c.req.raw.signal,\n )\n}\n\nfunction getActiveRemoteReferences(\n session: SearchSession,\n references: Array<UrlReference>,\n): Array<UrlReference> {\n return references.filter(\n (reference) =>\n session.referencesById.get(reference.result.ref_id) === reference,\n )\n}\n\nfunction buildSnapshotLinks(\n state: SearchOperationState,\n target: UrlReference,\n markdownReferences: Array<UrlReference>,\n remoteReferences: Array<UrlReference>,\n): Array<UrlReference> {\n return [\n ...new Map(\n [\n ...markdownReferences,\n ...getActiveRemoteReferences(state.session, remoteReferences),\n ]\n .filter(\n (reference) =>\n reference.result.url !== target.result.url\n && state.session.referencesById.get(reference.result.ref_id)\n === reference,\n )\n .map((reference) => [reference.result.url, reference] as const),\n ).values(),\n ]\n}\n\nfunction processRemotePages(\n state: SearchOperationState,\n answerText: string,\n markdownReferences: Array<UrlReference>,\n remoteReferences: Array<UrlReference>,\n): void {\n for (const [index, page] of state.remotePages.entries()) {\n const target =\n addUrlReference(\n state.session,\n {\n url: page.source.result.url,\n title: page.source.result.title,\n snippet: answerText,\n },\n state.turn,\n ) ?? page.source\n includeResult(state, target)\n const snapshotLinks = buildSnapshotLinks(\n state,\n target,\n markdownReferences,\n remoteReferences,\n )\n\n if (page.kind === \"find\") {\n state.output.push(\n `Find results for ${JSON.stringify(page.pattern ?? \"\")} in ${target.result.url}:\\n${answerText}`,\n )\n if (!findSnapshotByUrl(state.session, target.result.url)) {\n addSnapshot(\n state.session,\n target,\n state.turn.number,\n index,\n answerText,\n snapshotLinks,\n )\n }\n continue\n }\n\n const snapshot = addSnapshot(\n state.session,\n target,\n state.turn.number,\n index,\n answerText,\n snapshotLinks,\n )\n state.output.push(renderSnapshot(snapshot, page.lineno))\n }\n}\n\nfunction appendActiveSources(\n state: SearchOperationState,\n references: Array<UrlReference>,\n): void {\n if (references.length === 0) return\n state.output.push(\n [\n \"Sources:\",\n ...references.map(\n (reference) =>\n `- [${reference.result.ref_id}] ${reference.result.title} — ${reference.result.url}`,\n ),\n ].join(\"\\n\"),\n )\n}\n\nfunction processRemoteResult(\n result: ResponsesResult,\n state: SearchOperationState,\n): void {\n const extracted = extractWebSearchResult(result)\n const citedSources = extracted.sources.filter(\n (source) => source.snippet !== undefined,\n )\n const relevantSources =\n citedSources.length > 0 ? citedSources : extracted.sources\n consola.log(\n `--> web search: operations=${[\n ...new Set(\n state.remoteOperations.map(\n (remoteOperation) => remoteOperation.operation,\n ),\n ),\n ].join(\n \",\",\n )} queries=${JSON.stringify(extracted.queries)} sources=${relevantSources.length}`,\n )\n\n const remoteReferences = relevantSources\n .map((source) => addUrlReference(state.session, source, state.turn))\n .filter((reference): reference is UrlReference => Boolean(reference))\n for (const reference of getActiveRemoteReferences(\n state.session,\n remoteReferences,\n )) {\n includeResult(state, reference)\n }\n\n const answerText =\n extracted.answerText || \"GitHub Copilot web search returned no text.\"\n const markdownReferences =\n state.remotePages.length === 0 ?\n []\n : extractMarkdownSources(answerText)\n .map((source) => addUrlReference(state.session, source, state.turn))\n .filter((reference): reference is UrlReference => Boolean(reference))\n for (const reference of markdownReferences) includeResult(state, reference)\n if (state.remotePages.length === 0) state.output.push(answerText)\n\n processRemotePages(state, answerText, markdownReferences, remoteReferences)\n appendActiveSources(\n state,\n getActiveRemoteReferences(state.session, remoteReferences),\n )\n}\n\nasync function executeRemoteOperations(\n c: Context,\n request: AlphaSearchRequest,\n state: SearchOperationState,\n provider?: string,\n): Promise<Response | null> {\n const target = await resolveRemoteModel(c, request, provider)\n if (target instanceof Response) return target\n const result = await requestRemoteSearch(c, request, state, target)\n processRemoteResult(result, state)\n return null\n}\n\nfunction buildAlphaSearchResponse(\n state: SearchOperationState,\n): AlphaSearchResponse {\n state.output.push(...state.warnings)\n if (state.output.length === 0) {\n state.output.push(\"No supported search operations were requested.\")\n }\n\n return {\n encrypted_output: null,\n output: state.output.join(\"\\n\\n\"),\n results: [...state.resultReferences.values()]\n .filter(\n (reference) =>\n state.session.referencesById.get(reference.result.ref_id)\n === reference,\n )\n .map(({ result }) => result),\n }\n}\n\nexport async function handleAlphaSearchResponses(\n c: Context,\n options: AlphaSearchResponsesOptions,\n): Promise<Response> {\n const parsed = alphaSearchRequestSchema.safeParse(options.request)\n if (!parsed.success) {\n const issue = parsed.error.issues[0]\n const path = issue?.path.join(\".\") || \"body\"\n return invalidRequest(\n c,\n `Invalid alpha search request at ${path}: ${issue?.message ?? \"invalid value\"}`,\n )\n }\n const request = parsed.data\n const now = alphaSearchResponsesDependencies.now()\n const reservation = reserveSession(request.id, now)\n const session = reservation.session\n const turn: SearchTurn = {\n number: reservation.turn,\n nextReferenceIndex: 0,\n }\n const state = createSearchOperationState(session, turn)\n const commands = request.commands ?? {}\n processCommandOperations(commands, state, now)\n\n addLiveAccessWarning(request, state)\n\n if (shouldExecuteRemoteOperations(request, state)) {\n const remoteResponse = await executeRemoteOperations(\n c,\n request,\n state,\n options.provider,\n )\n if (remoteResponse) return remoteResponse\n }\n\n return c.json(buildAlphaSearchResponse(state))\n}\n","import {\n buildCodexRequestHeaders,\n CODEX_API_BASE_URL,\n} from \"~/services/codex/create-responses\"\n\nconst CODEX_ALPHA_SEARCH_URL = `${CODEX_API_BASE_URL}/codex/alpha/search`\n\nexport function resolveCodexAlphaSearchUrl(requestUrl: string): string {\n const upstreamUrl = new URL(CODEX_ALPHA_SEARCH_URL)\n upstreamUrl.search = new URL(requestUrl, \"http://localhost\").search\n return upstreamUrl.toString()\n}\n\nexport async function forwardCodexAlphaSearch(\n request: Request,\n): Promise<Response> {\n const headers = buildCodexRequestHeaders(request.headers)\n if (!headers.has(\"accept\")) {\n headers.set(\"accept\", \"application/json\")\n }\n\n const body = await request.arrayBuffer()\n if (!headers.has(\"content-type\")) {\n headers.set(\"content-type\", \"application/json\")\n }\n\n return await fetch(resolveCodexAlphaSearchUrl(request.url), {\n method: \"POST\",\n headers,\n body,\n })\n}\n","import { Hono, type Context } from \"hono\"\nimport consola from \"consola\"\n\nimport {\n getAlphaSearchModel,\n isAlphaSearchCodexPriorityEnabled,\n resolveEffectiveProviderType,\n resolveMappedModel,\n type ResolvedProviderConfig,\n} from \"~/lib/config\"\nimport { forwardError } from \"~/lib/error\"\nimport { createHandlerLogger, debugJsonAsync } from \"~/lib/logger\"\nimport { findEndpointModel } from \"~/lib/models\"\nimport { parseProviderModelAlias } from \"~/lib/provider-model\"\nimport {\n ensureConfiguredProviderModelAlias,\n resolveProviderConfig,\n} from \"~/lib/provider-resolver\"\nimport type {\n AlphaSearchRequest,\n AlphaSearchResponse,\n} from \"~/routes/alpha-search/alpha-search-types\"\nimport { handleAlphaSearchResponses } from \"~/routes/alpha-search/alpha-search-responses\"\nimport { forwardCodexAlphaSearch } from \"~/services/codex/alpha-search\"\nimport { createProviderProxyResponse } from \"~/services/providers/provider-proxy\"\n\nconst logger = createHandlerLogger(\"alpha-search-handler\")\n\nexport const alphaSearchRoutes = new Hono()\n\nexport const alphaSearchRouteDependencies = {\n findEndpointModel,\n forwardCodexAlphaSearch,\n getAlphaSearchModel,\n handleAlphaSearchResponses,\n isAlphaSearchCodexPriorityEnabled,\n resolveEffectiveProviderType,\n resolveMappedModel,\n resolveProviderConfig,\n}\n\nfunction parseDebugBody<T>(body: string): T | string {\n try {\n return JSON.parse(body) as T\n } catch {\n return body\n }\n}\n\nasync function forwardCodexAlphaSearchRequest(\n request: Request,\n): Promise<Response> {\n await debugJsonAsync(logger, \"alpha_search.codex.request\", async () => ({\n body: parseDebugBody<AlphaSearchRequest>(await request.clone().text()),\n }))\n\n const upstreamResponse =\n await alphaSearchRouteDependencies.forwardCodexAlphaSearch(request)\n await debugJsonAsync(logger, \"alpha_search.codex.response\", async () => ({\n body: parseDebugBody<AlphaSearchResponse>(\n await upstreamResponse.clone().text(),\n ),\n statusCode: upstreamResponse.status,\n }))\n return createProviderProxyResponse(upstreamResponse)\n}\n\nfunction createAlphaSearchRequest(\n request: Request,\n payload: AlphaSearchRequest,\n): Request {\n // Rebuild from primitives instead of cloning: under Node runtimes srvx\n // wraps incoming requests in a proxy class whose prototype chain satisfies\n // `instanceof Request` without the native internals, so `new Request(req)`\n // throws \"Cannot read properties of undefined (reading 'window')\".\n return new Request(request.url, {\n body: JSON.stringify(payload),\n headers: request.headers,\n method: request.method,\n signal: request.signal,\n })\n}\n\nasync function handleCodexRequest(\n c: Context,\n request: Request,\n resolvedProviderConfig?: ResolvedProviderConfig,\n): Promise<Response> {\n const codexProviderConfig =\n resolvedProviderConfig\n ?? (await alphaSearchRouteDependencies.resolveProviderConfig(\"codex\"))\n if (!codexProviderConfig) {\n return c.json(\n {\n error: {\n message: \"Provider 'codex' not found or disabled\",\n type: \"invalid_request_error\",\n },\n },\n 404,\n )\n }\n\n return await forwardCodexAlphaSearchRequest(request)\n}\n\nfunction invalidRequest(c: Context, message: string): Response {\n return c.json(\n {\n error: {\n message,\n type: \"invalid_request_error\",\n },\n },\n 400,\n )\n}\n\nasync function parseAlphaSearchBody(\n c: Context,\n): Promise<AlphaSearchRequest | Response> {\n let body: unknown\n try {\n body = await c.req.raw.clone().json()\n } catch {\n return invalidRequest(c, \"Invalid alpha search request: expected JSON body\")\n }\n\n const model = (body as AlphaSearchRequest | null)?.model\n if (typeof model !== \"string\") {\n return invalidRequest(\n c,\n \"Invalid alpha search request: model must be a string\",\n )\n }\n return body as AlphaSearchRequest\n}\n\n/**\n * Handles top-level alpha-search dispatch. Pass `resolvedProviderConfig` when\n * the provider-scoped route has already resolved Codex. Codex is preferred\n * for every top-level request while alphaSearchCodexPriority stays enabled.\n */\nexport async function handleAlphaSearchRequest(\n c: Context,\n resolvedProviderConfig?: ResolvedProviderConfig,\n): Promise<Response> {\n if (resolvedProviderConfig) {\n return await handleCodexRequest(c, c.req.raw, resolvedProviderConfig)\n }\n\n const payload = await parseAlphaSearchBody(c)\n if (payload instanceof Response) return payload\n\n const requestedModel = payload.model\n\n payload.model =\n alphaSearchRouteDependencies.resolveMappedModel(requestedModel)\n if (payload.model !== requestedModel) {\n consola.debug(\n `Resolved model mapping: ${requestedModel} -> ${payload.model}`,\n )\n }\n\n const resolvedRequestedModel = payload.model\n let providerModelAlias = parseProviderModelAlias(payload.model)\n if (providerModelAlias) {\n payload.model = providerModelAlias.model\n if (providerModelAlias.provider === \"codex\") {\n return await handleCodexRequest(\n c,\n createAlphaSearchRequest(c.req.raw, payload),\n )\n }\n }\n\n if (alphaSearchRouteDependencies.isAlphaSearchCodexPriorityEnabled()) {\n const codexProviderConfig =\n await alphaSearchRouteDependencies.resolveProviderConfig(\"codex\")\n if (codexProviderConfig) {\n if (!payload.model.startsWith(\"gpt\")) {\n payload.model = \"gpt-5.6-luna\"\n }\n return await forwardCodexAlphaSearchRequest(\n createAlphaSearchRequest(c.req.raw, payload),\n )\n }\n }\n\n const messagesBackedModel = await isMessagesBackedModel(\n resolvedRequestedModel,\n )\n if (messagesBackedModel) {\n const searchModel = alphaSearchRouteDependencies.getAlphaSearchModel()\n if (!searchModel) {\n return invalidRequest(\n c,\n \"alphaSearchModel is disabled; Messages-backed Codex models require a native Responses search model\",\n )\n }\n const resolvedSearchModel =\n alphaSearchRouteDependencies.resolveMappedModel(searchModel)\n if (!(await isNativeResponsesModel(resolvedSearchModel))) {\n return invalidRequest(\n c,\n `Configured alphaSearchModel '${searchModel}' does not support the Responses endpoint required for alpha search`,\n )\n }\n consola.debug(\n `Redirected alpha search model: ${resolvedRequestedModel} -> ${resolvedSearchModel}`,\n )\n payload.model = resolvedSearchModel\n providerModelAlias = parseProviderModelAlias(payload.model)\n if (providerModelAlias) {\n payload.model = providerModelAlias.model\n if (providerModelAlias.provider === \"codex\") {\n return await handleCodexRequest(\n c,\n createAlphaSearchRequest(c.req.raw, payload),\n )\n }\n }\n }\n const fallbackRequestedModel =\n messagesBackedModel ? payload.model : requestedModel\n\n if (providerModelAlias) {\n const configuredProviderModelAlias =\n await ensureConfiguredProviderModelAlias(\n providerModelAlias,\n alphaSearchRouteDependencies.resolveProviderConfig,\n )\n if (configuredProviderModelAlias) {\n return await alphaSearchRouteDependencies.handleAlphaSearchResponses(c, {\n provider: providerModelAlias.provider,\n request: payload,\n })\n }\n }\n\n return await alphaSearchRouteDependencies.handleAlphaSearchResponses(c, {\n request: {\n ...payload,\n model: fallbackRequestedModel,\n },\n })\n}\n\nasync function isMessagesBackedModel(model: string): Promise<boolean> {\n const providerAlias = parseProviderModelAlias(model)\n if (providerAlias) {\n const providerConfig =\n await alphaSearchRouteDependencies.resolveProviderConfig(\n providerAlias.provider,\n )\n if (!providerConfig) return false\n const effectiveType =\n alphaSearchRouteDependencies.resolveEffectiveProviderType(\n providerConfig,\n providerAlias.model,\n )\n return (\n effectiveType === \"anthropic\" || effectiveType === \"openai-compatible\"\n )\n }\n\n const endpoints =\n alphaSearchRouteDependencies.findEndpointModel(model)?.supported_endpoints\n ?? []\n return (\n (endpoints.includes(\"/v1/messages\")\n || endpoints.includes(\"/chat/completions\"))\n && !endpoints.includes(\"/responses\")\n && !endpoints.includes(\"ws:/responses\")\n )\n}\n\nasync function isNativeResponsesModel(model: string): Promise<boolean> {\n const providerAlias = parseProviderModelAlias(model)\n if (providerAlias) {\n const providerConfig =\n await alphaSearchRouteDependencies.resolveProviderConfig(\n providerAlias.provider,\n )\n return (\n providerConfig !== null\n && alphaSearchRouteDependencies.resolveEffectiveProviderType(\n providerConfig,\n providerAlias.model,\n ) === \"openai-responses\"\n )\n }\n\n const endpoints =\n alphaSearchRouteDependencies.findEndpointModel(model)?.supported_endpoints\n ?? []\n return endpoints.includes(\"/responses\") || endpoints.includes(\"ws:/responses\")\n}\n\nalphaSearchRoutes.post(\"/\", async (c) => {\n try {\n return await handleAlphaSearchRequest(c)\n } catch (error) {\n logger.error(\"alpha_search.error\", { error })\n return await forwardError(c, error)\n }\n})\n","import type { ResolvedProviderConfig } from \"~/lib/config\"\nimport type { ContentPart, Message } from \"~/lib/types/chat-completions\"\n\nconst OPENAI_COMPATIBLE_CONTEXT_CACHE_MARKER_LIMIT = 4\nconst OPENAI_COMPATIBLE_CONTEXT_CACHE_CONTROL = {\n type: \"ephemeral\",\n} as const\nconst OPENAI_COMPATIBLE_CONTEXT_CACHE_ROLES = new Set<Message[\"role\"]>([\n \"system\",\n \"user\",\n \"assistant\",\n \"tool\",\n])\n\nexport const isDashScopeAliyunProvider = (\n providerConfig: ResolvedProviderConfig,\n): boolean =>\n providerConfig.name === \"dashscope\"\n || providerConfig.baseUrl.includes(\"aliyuncs.com\")\n\nexport const applyDashScopePreserveThinkingDefault = (\n payload: Record<string, unknown>,\n providerConfig: ResolvedProviderConfig,\n): void => {\n if (!isDashScopeAliyunProvider(providerConfig)) {\n return\n }\n\n if (!Object.hasOwn(payload, \"preserve_thinking\")) {\n payload.preserve_thinking = true\n }\n}\n\nexport const applyOpenAICompatibleContextCache = (payload: {\n messages: Array<Message>\n model: string\n}): void => {\n if (payload.model.includes(\"/\")) {\n return\n }\n const messageIndexes = selectContextCacheMessageIndexes(payload.messages)\n for (const messageIndex of messageIndexes) {\n applyContextCacheControl(payload.messages[messageIndex])\n }\n}\n\nconst selectContextCacheMessageIndexes = (\n messages: Array<Message>,\n): Array<number> => {\n const cacheableIndexes = messages.flatMap((message, index) =>\n isContextCacheMarkerEligible(message) ? [index] : [],\n )\n const systemIndexes = cacheableIndexes\n .filter((index) => messages[index]?.role === \"system\")\n .slice(0, 2)\n const finalIndexes = cacheableIndexes\n .filter((index) => messages[index]?.role !== \"system\")\n .slice(-1)\n return uniqueIndexes([...systemIndexes, ...finalIndexes]).sort(\n (a, b) => a - b,\n )\n}\n\nconst uniqueIndexes = (indexes: Array<number>): Array<number> =>\n [...new Set(indexes)].slice(0, OPENAI_COMPATIBLE_CONTEXT_CACHE_MARKER_LIMIT)\n\nconst isContextCacheMarkerEligible = (message: Message): boolean => {\n if (!OPENAI_COMPATIBLE_CONTEXT_CACHE_ROLES.has(message.role)) {\n return false\n }\n\n if (typeof message.content === \"string\") {\n return message.content.length > 0\n }\n\n return Array.isArray(message.content) && message.content.length > 0\n}\n\nconst applyContextCacheControl = (message: Message | undefined): void => {\n if (!message) {\n return\n }\n\n if (typeof message.content === \"string\") {\n message.content = [\n {\n type: \"text\",\n text: message.content,\n cache_control: { ...OPENAI_COMPATIBLE_CONTEXT_CACHE_CONTROL },\n },\n ]\n return\n }\n\n if (!Array.isArray(message.content)) {\n return\n }\n\n const lastPart = message.content.at(-1)\n if (!lastPart) {\n return\n }\n setContextCacheControl(lastPart)\n}\n\nconst setContextCacheControl = (part: ContentPart): void => {\n part.cache_control = { ...OPENAI_COMPATIBLE_CONTEXT_CACHE_CONTROL }\n}\n","import type { Reasoning } from \"~/lib/types/responses\"\n\nexport type ResponsesReasoningEffort = Exclude<\n Reasoning[\"effort\"],\n null | undefined\n>\n\n// Ascending reasoning intensity understood by upstream APIs.\nconst REASONING_EFFORT_LEVELS: Array<ResponsesReasoningEffort> = [\n \"none\",\n \"minimal\",\n \"low\",\n \"medium\",\n \"high\",\n \"xhigh\",\n \"max\",\n]\n\nconst KNOWN_REASONING_EFFORTS: ReadonlySet<string> = new Set(\n REASONING_EFFORT_LEVELS,\n)\n\n// Client-facing levels that upstream APIs do not understand. Codex's \"ultra\"\n// tier is an execution mode that combines max reasoning with multi-agent\n// orchestration. The orchestration is client-side, so Codex sends \"max\" on the\n// wire and never forwards \"ultra\" upstream. \"minimal\" pins to \"low\" only when\n// the upstream capabilities show that \"minimal\" is unsupported.\nconst REASONING_EFFORT_ALIASES: Record<string, ResponsesReasoningEffort> = {\n minimal: \"low\",\n ultra: \"max\",\n}\n\nconst reasoningEffortRank = (effort: ResponsesReasoningEffort): number =>\n REASONING_EFFORT_LEVELS.indexOf(effort)\n\n/**\n * Resolves the reasoning effort to send upstream for a requested effort.\n *\n * Policy:\n * - A supported effort passes through unchanged.\n * - Client-only levels are aliased first (\"ultra\" -> \"max\").\n * - An unsupported request clamps to the highest supported level not above\n * the request, e.g. \"max\" against [\"low\", \"medium\", \"high\", \"xhigh\"]\n * resolves to \"xhigh\".\n * - A request below every supported level resolves to the lowest supported\n * level, e.g. \"none\" against [\"low\", \"medium\", \"high\"] resolves to \"low\".\n * - Without any known supported levels, valid wire efforts pass through and\n * client-facing aliases are converted (for example, \"ultra\" -> \"max\").\n * - An unrecognized request is left unresolved so the upstream can validate\n * it instead of receiving a silently substituted effort.\n */\nexport const resolveSupportedReasoningEffort = (\n requestedEffort: string,\n supportedEfforts: Array<string> | undefined,\n): ResponsesReasoningEffort | undefined => {\n const supported = (supportedEfforts ?? []).filter(\n (effort): effort is ResponsesReasoningEffort =>\n KNOWN_REASONING_EFFORTS.has(effort),\n )\n const requestedWireEffort =\n KNOWN_REASONING_EFFORTS.has(requestedEffort) ?\n (requestedEffort as ResponsesReasoningEffort)\n : undefined\n if (supported.length === 0) {\n return requestedWireEffort ?? REASONING_EFFORT_ALIASES[requestedEffort]\n }\n if (requestedWireEffort && supported.includes(requestedWireEffort)) {\n return requestedWireEffort\n }\n\n const aliasedEffort =\n REASONING_EFFORT_ALIASES[requestedEffort] ?? requestedWireEffort\n if (!aliasedEffort) {\n return undefined\n }\n if (supported.includes(aliasedEffort)) {\n return aliasedEffort\n }\n\n const requestedRank = reasoningEffortRank(aliasedEffort)\n let nearestBelow: ResponsesReasoningEffort | undefined\n for (const effort of supported) {\n if (\n reasoningEffortRank(effort) <= requestedRank\n && (nearestBelow === undefined\n || reasoningEffortRank(effort) > reasoningEffortRank(nearestBelow))\n ) {\n nearestBelow = effort\n }\n }\n if (nearestBelow) {\n return nearestBelow\n }\n\n return supported.reduce((lowest, effort) =>\n reasoningEffortRank(effort) < reasoningEffortRank(lowest) ? effort : lowest,\n )\n}\n","import { builtinProviderModelRegistry } from \"~/lib/builtin-provider-models\"\nimport type { ModelConfig, ResolvedProviderConfig } from \"~/lib/config\"\nimport {\n resolveSupportedReasoningEffort,\n type ResponsesReasoningEffort,\n} from \"~/lib/reasoning-effort\"\nimport type { ResponsesPayload } from \"~/lib/types/responses\"\n\ninterface SamplingPayload {\n temperature?: number | null\n top_p?: number | null\n top_k?: number | null\n}\n\nexport const applyModelDefaults = (\n payload: SamplingPayload,\n modelConfig: ModelConfig | undefined,\n): void => {\n payload.temperature ??= modelConfig?.temperature\n payload.top_p ??= modelConfig?.topP\n payload.top_k ??= modelConfig?.topK\n}\n\nexport const applyMissingExtraBody = (\n payload: Record<string, unknown>,\n options: { extraBody: Record<string, unknown> | undefined },\n): void => {\n for (const [key, value] of Object.entries(options.extraBody ?? {})) {\n if (!Object.hasOwn(payload, key)) {\n payload[key] = value\n }\n }\n}\n\nexport const normalizeProviderResponsesReasoningEffort = (\n payload: ResponsesPayload,\n providerConfig: ResolvedProviderConfig,\n): { from: string; to: ResponsesReasoningEffort } | undefined => {\n if (!payload.reasoning || typeof payload.reasoning.effort !== \"string\") {\n return undefined\n }\n\n const modelConfig = providerConfig.models?.[payload.model]\n const builtinModelConfig = builtinProviderModelRegistry.getModelConfig(\n providerConfig.name,\n payload.model,\n )\n const configuredEfforts = modelConfig?.reasoningEfforts\n const supportedEfforts =\n configuredEfforts && configuredEfforts.length > 0 ?\n configuredEfforts\n : builtinModelConfig?.reasoningEfforts\n\n const resolvedEffort = resolveSupportedReasoningEffort(\n payload.reasoning.effort,\n supportedEfforts,\n )\n if (!resolvedEffort || resolvedEffort === payload.reasoning.effort) {\n return undefined\n }\n\n const requestedEffort = payload.reasoning.effort\n payload.reasoning.effort = resolvedEffort\n return { from: requestedEffort, to: resolvedEffort }\n}\n","import { events } from \"fetch-event-stream\"\nimport type { Context } from \"hono\"\n\nimport { streamSSE } from \"hono/streaming\"\n\nimport {\n type ModelConfig,\n type ResolvedProviderConfig,\n resolveEffectiveProviderType,\n} from \"~/lib/config\"\nimport {\n applyDashScopePreserveThinkingDefault,\n applyOpenAICompatibleContextCache,\n isDashScopeAliyunProvider,\n} from \"~/lib/dashscope\"\nimport { HTTPError } from \"~/lib/error\"\nimport { createHandlerLogger, debugJson } from \"~/lib/logger\"\nimport { resolveProviderConfig } from \"~/lib/provider-resolver\"\nimport {\n createProviderTokenUsageRecorder,\n normalizeOpenAIUsage,\n type UsageTokens,\n} from \"~/lib/token-usage\"\nimport type {\n ChatCompletionChunk,\n ChatCompletionResponse,\n ChatCompletionsPayload,\n} from \"~/lib/types/chat-completions\"\nimport {\n createProviderProxyResponse,\n forwardProviderChatCompletions,\n} from \"~/services/providers/provider-proxy\"\nimport {\n applyMissingExtraBody,\n applyModelDefaults,\n} from \"~/routes/provider/utils\"\n\nconst logger = createHandlerLogger(\"provider-chat-completions-handler\")\n\nexport async function handleProviderChatCompletionsForProvider(\n c: Context,\n options: {\n payload: ChatCompletionsPayload\n provider: string\n },\n): Promise<Response> {\n const { payload, provider } = options\n const providerConfig = await resolveProviderConfig(provider)\n if (\n !providerConfig\n || resolveEffectiveProviderType(providerConfig, payload.model)\n !== \"openai-compatible\"\n ) {\n return c.json(\n {\n error: {\n message: `Provider '${provider}' does not support the /v1/chat/completions endpoint`,\n type: \"invalid_request_error\",\n },\n },\n 400,\n )\n }\n\n const modelConfig = providerConfig.models?.[payload.model]\n applyModelDefaults(payload, modelConfig)\n applyMissingExtraBody(payload, {\n extraBody: modelConfig?.extraBody,\n })\n applyProviderStreamOptions(payload)\n applyDashScopePreserveThinkingDefault(\n payload as unknown as Record<string, unknown>,\n providerConfig,\n )\n applyProviderContextCache(payload, modelConfig, providerConfig)\n\n debugJson(logger, \"provider.chat_completions.request\", {\n payload,\n provider,\n })\n\n const upstreamResponse = await forwardProviderChatCompletions(\n providerConfig,\n payload,\n c.req.raw.headers,\n )\n\n if (!upstreamResponse.ok) {\n logger.error(\"Failed to create provider chat completions\", {\n provider,\n statusCode: upstreamResponse.status,\n })\n throw new HTTPError(\n `Failed to create ${provider} chat completions`,\n upstreamResponse,\n )\n }\n\n const recordUsage = createProviderChatCompletionsUsageRecorder(\n payload,\n provider,\n modelConfig,\n providerConfig.pricingCurrency,\n )\n const contentType = upstreamResponse.headers.get(\"content-type\") ?? \"\"\n const isStreamingResponse =\n Boolean(payload.stream) && contentType.includes(\"text/event-stream\")\n\n if (isStreamingResponse) {\n return streamProviderChatCompletions(c, upstreamResponse, {\n provider,\n recordUsage,\n })\n }\n\n const responseBody = (await upstreamResponse\n .clone()\n .json()) as ChatCompletionResponse\n recordUsage(normalizeOpenAIUsage(responseBody.usage))\n\n debugJson(logger, \"provider.chat_completions.response\", responseBody)\n return createProviderProxyResponse(upstreamResponse)\n}\n\nconst applyProviderStreamOptions = (payload: ChatCompletionsPayload): void => {\n if (!payload.stream) {\n return\n }\n\n payload.stream_options = {\n ...(payload.stream_options ?? {}),\n include_usage: true,\n }\n}\n\nconst applyProviderContextCache = (\n payload: ChatCompletionsPayload,\n modelConfig: ModelConfig | undefined,\n providerConfig: ResolvedProviderConfig,\n): void => {\n const isDashScopeProvider = isDashScopeAliyunProvider(providerConfig)\n const contextCacheEnabled = modelConfig?.contextCache ?? isDashScopeProvider\n if (contextCacheEnabled) {\n applyOpenAICompatibleContextCache(payload)\n }\n}\n\nconst createProviderChatCompletionsUsageRecorder = (\n payload: ChatCompletionsPayload,\n provider: string,\n modelConfig: ModelConfig | undefined,\n pricingCurrency: string | undefined,\n) =>\n createProviderTokenUsageRecorder({\n endpoint: \"chat_completions\",\n model: payload.model,\n pricing: modelConfig?.pricing,\n pricingCurrency,\n providerName: provider,\n })\n\nconst streamProviderChatCompletions = (\n c: Context,\n upstreamResponse: Response,\n options: {\n provider: string\n recordUsage: (usage: UsageTokens) => void\n },\n): Response => {\n logger.debug(\"provider.chat_completions.streaming\", {\n provider: options.provider,\n })\n return streamSSE(c, async (stream) => {\n let usage: UsageTokens = {}\n\n try {\n for await (const chunk of events(upstreamResponse)) {\n debugJson(logger, \"provider.chat_completions.stream_chunk\", chunk)\n if (chunk.data && chunk.data !== \"[DONE]\") {\n const parsedChunk = parseChatCompletionChunkData(chunk.data)\n if (parsedChunk?.usage) {\n usage = normalizeOpenAIUsage(parsedChunk.usage)\n }\n }\n\n await stream.writeSSE({\n event: chunk.event,\n data: chunk.data ?? \"\",\n })\n }\n } finally {\n options.recordUsage(usage)\n }\n })\n}\n\nconst parseChatCompletionChunkData = (\n data: string,\n): ChatCompletionChunk | null => {\n try {\n return JSON.parse(data) as ChatCompletionChunk\n } catch {\n return null\n }\n}\n","import consola from \"consola\"\nimport { events } from \"fetch-event-stream\"\n\nimport type { CompactType } from \"~/lib/compact\"\nimport type { SubagentMarker } from \"~/lib/subagent\"\nimport type {\n ChatCompletionResponse,\n ChatCompletionsPayload,\n} from \"~/lib/types/chat-completions\"\n\nimport {\n copilotBaseUrl,\n copilotHeaders,\n prepareForCompact,\n prepareInteractionHeaders,\n} from \"~/lib/api-config\"\nimport { logCopilotRateLimits } from \"~/lib/copilot-rate-limit\"\nimport { HTTPError } from \"~/lib/error\"\nimport { state } from \"~/lib/state\"\n\nexport const createChatCompletions = async (\n payload: ChatCompletionsPayload,\n options: {\n subagentMarker?: SubagentMarker | null\n requestId: string\n sessionId?: string\n compactType?: CompactType\n },\n) => {\n if (!state.copilotToken) throw new Error(\"Copilot token not found\")\n\n const enableVision = payload.messages.some(\n (x) =>\n typeof x.content !== \"string\"\n && x.content?.some((x) => x.type === \"image_url\"),\n )\n\n // Agent/user check for x-initiator header\n // Determine if any message is from an agent (\"assistant\" or \"tool\")\n // Refactor `isAgentCall` logic to check only the last message in the history rather than any message. This prevents valid user messages from being incorrectly flagged as agent calls due to previous assistant history, ensuring proper credit consumption for multi-turn conversations.\n let isAgentCall = false\n if (payload.messages.length > 0) {\n const lastMessage = payload.messages.at(-1)\n if (lastMessage) {\n isAgentCall = [\"assistant\", \"tool\"].includes(lastMessage.role)\n }\n }\n\n // Build headers and add x-initiator\n const headers: Record<string, string> = {\n ...copilotHeaders(state, options.requestId, enableVision),\n \"x-initiator\": isAgentCall ? \"agent\" : \"user\",\n }\n\n prepareInteractionHeaders(\n options.sessionId,\n Boolean(options.subagentMarker),\n headers,\n )\n\n prepareForCompact(headers, options.compactType)\n\n consola.log(`<-- model: ${payload.model}`)\n\n const response = await fetch(`${copilotBaseUrl(state)}/chat/completions`, {\n method: \"POST\",\n headers,\n body: JSON.stringify(payload),\n })\n\n logCopilotRateLimits(response.headers)\n\n if (!response.ok) {\n consola.error(\"Failed to create chat completions\", response)\n throw new HTTPError(\"Failed to create chat completions\", response)\n }\n\n if (payload.stream) {\n return events(response)\n }\n\n return (await response.json()) as ChatCompletionResponse\n}\n","import consola from \"consola\"\nimport type { Context } from \"hono\"\n\nimport { streamSSE, type SSEMessage } from \"hono/streaming\"\n\nimport { resolveMappedModel } from \"~/lib/config\"\nimport { createHandlerLogger, debugJson } from \"~/lib/logger\"\nimport { findEndpointModel } from \"~/lib/models\"\nimport { resolveConfiguredProviderModelAlias } from \"~/lib/provider-resolver\"\nimport {\n createCopilotTokenUsageRecorder,\n normalizeOpenAIUsage,\n normalizeOptionalToken,\n type UsageTokens,\n} from \"~/lib/token-usage\"\nimport { generateRequestIdFromPayload, getUUID, isNullish } from \"~/lib/utils\"\nimport { handleProviderChatCompletionsForProvider } from \"~/routes/provider/chat-completions/handler\"\nimport type {\n ChatCompletionChunk,\n ChatCompletionResponse,\n ChatCompletionsPayload,\n} from \"~/lib/types/chat-completions\"\nimport { createChatCompletions } from \"~/services/copilot/create-chat-completions\"\n\nconst logger = createHandlerLogger(\"chat-completions-handler\")\n\nexport async function handleCompletion(c: Context) {\n let payload = await c.req.json<ChatCompletionsPayload>()\n const requestedModel = payload.model\n payload.model = resolveMappedModel(payload.model)\n if (payload.model !== requestedModel) {\n consola.debug(\n `Resolved model mapping: ${requestedModel} -> ${payload.model}`,\n )\n }\n\n const providerModelAlias = await resolveConfiguredProviderModelAlias(\n payload.model,\n )\n if (providerModelAlias) {\n payload.model = providerModelAlias.model\n return await handleProviderChatCompletionsForProvider(c, {\n payload,\n provider: providerModelAlias.provider,\n })\n }\n\n debugJson(logger, \"Request payload:\", payload)\n\n const selectedModel = findEndpointModel(payload.model)\n payload.model = selectedModel?.id ?? payload.model\n\n if (\n isNullish(payload.max_tokens)\n && isNullish(payload.max_completion_tokens)\n ) {\n payload = {\n ...payload,\n max_tokens: selectedModel?.capabilities.limits.max_output_tokens,\n }\n debugJson(logger, \"Set max_tokens to:\", payload.max_tokens)\n }\n\n if (payload.model.includes(\"gpt\")) {\n if (isNullish(payload.max_completion_tokens)) {\n payload.max_completion_tokens = payload.max_tokens\n }\n delete payload.max_tokens\n }\n\n // not support subagent marker for now , set sessionId = getUUID(requestId)\n const requestId = generateRequestIdFromPayload(payload)\n logger.debug(\"Generated request ID:\", requestId)\n\n const sessionId = getUUID(requestId)\n logger.debug(\"Extracted session ID:\", sessionId)\n const recordUsage = createCopilotTokenUsageRecorder({\n endpoint: \"chat_completions\",\n fallbackSessionId: sessionId,\n model: payload.model,\n })\n\n const response = await createChatCompletions(payload, {\n requestId,\n sessionId,\n })\n\n if (isNonStreaming(response)) {\n debugJson(logger, \"Non-streaming response:\", response)\n recordUsage({\n ...normalizeOpenAIUsage(response.usage),\n total_nano_aiu: normalizeOptionalToken(\n response.copilot_usage?.total_nano_aiu,\n ),\n })\n return c.json(response)\n }\n\n logger.debug(\"Streaming response\")\n return streamSSE(c, async (stream) => {\n let usage: UsageTokens = {}\n\n for await (const chunk of response) {\n debugJson(logger, \"Streaming chunk:\", chunk)\n const parsedChunk = parseChatCompletionChunk(chunk)\n if (parsedChunk?.usage || parsedChunk?.copilot_usage) {\n usage = {\n ...normalizeOpenAIUsage(parsedChunk.usage),\n total_nano_aiu: normalizeOptionalToken(\n parsedChunk.copilot_usage?.total_nano_aiu,\n ),\n }\n }\n await stream.writeSSE(chunk as SSEMessage)\n }\n\n recordUsage(usage)\n })\n}\n\nconst isNonStreaming = (\n response: Awaited<ReturnType<typeof createChatCompletions>>,\n): response is ChatCompletionResponse => Object.hasOwn(response, \"choices\")\n\nconst parseChatCompletionChunk = (\n chunk: unknown,\n): ChatCompletionChunk | null => {\n const data = (chunk as { data?: string }).data\n if (!data || data === \"[DONE]\") {\n return null\n }\n\n try {\n return JSON.parse(data) as ChatCompletionChunk\n } catch {\n return null\n }\n}\n","import { Hono } from \"hono\"\n\nimport { forwardError } from \"~/lib/error\"\n\nimport { handleCompletion } from \"./handler\"\n\nexport const completionRoutes = new Hono()\n\ncompletionRoutes.post(\"/\", async (c) => {\n try {\n return await handleCompletion(c)\n } catch (error) {\n return await forwardError(c, error)\n }\n})\n","import { Hono } from \"hono\"\nimport { z } from \"zod\"\n\nimport { forwardError } from \"~/lib/error\"\nimport { getModelMappings, setModelMappings } from \"~/lib/config\"\nimport { PATHS } from \"~/lib/paths\"\n\nexport const configRoutes = new Hono()\n\nconst modelMappingsRequestSchema = z.object({\n modelMappings: z.record(z.string(), z.string()),\n})\n\nconfigRoutes.get(\"/model-mappings\", (c) => {\n return c.json({\n configPath: PATHS.CONFIG_PATH,\n modelMappings: getModelMappings(),\n })\n})\n\nconfigRoutes.post(\"/model-mappings\", async (c) => {\n try {\n const parseResult = modelMappingsRequestSchema.safeParse(await c.req.json())\n if (!parseResult.success) {\n return c.json(\n {\n error: {\n message:\n parseResult.error.issues[0]?.message ?? \"Invalid request body.\",\n type: \"invalid_request_error\",\n },\n },\n 400,\n )\n }\n\n const updatedModelMappings = setModelMappings(\n parseResult.data.modelMappings,\n )\n\n return c.json({\n configPath: PATHS.CONFIG_PATH,\n modelMappings: updatedModelMappings,\n })\n } catch (error) {\n return await forwardError(c, error)\n }\n})\n","import { copilotHeaders, copilotBaseUrl } from \"~/lib/api-config\"\nimport { HTTPError } from \"~/lib/error\"\nimport { state } from \"~/lib/state\"\n\nexport const createEmbeddings = async (payload: EmbeddingRequest) => {\n if (!state.copilotToken) throw new Error(\"Copilot token not found\")\n\n const response = await fetch(`${copilotBaseUrl(state)}/embeddings`, {\n method: \"POST\",\n headers: copilotHeaders(state),\n body: JSON.stringify(payload),\n })\n\n if (!response.ok) throw new HTTPError(\"Failed to create embeddings\", response)\n\n return (await response.json()) as EmbeddingResponse\n}\n\nexport interface EmbeddingRequest {\n input: string | Array<string>\n model: string\n}\n\nexport interface Embedding {\n object: string\n embedding: Array<number>\n index: number\n}\n\nexport interface EmbeddingResponse {\n object: string\n data: Array<Embedding>\n model: string\n usage: {\n prompt_tokens: number\n total_tokens: number\n }\n}\n","import { Hono } from \"hono\"\n\nimport { forwardError } from \"~/lib/error\"\nimport { createCopilotTokenUsageRecorder } from \"~/lib/token-usage\"\nimport {\n createEmbeddings,\n type EmbeddingRequest,\n} from \"~/services/copilot/create-embeddings\"\n\nexport const embeddingRoutes = new Hono()\n\nembeddingRoutes.post(\"/\", async (c) => {\n try {\n const paylod = await c.req.json<EmbeddingRequest>()\n const response = await createEmbeddings(paylod)\n const recordUsage = createCopilotTokenUsageRecorder({\n endpoint: \"embeddings\",\n model: paylod.model,\n })\n\n recordUsage({\n input_tokens: response.usage.prompt_tokens,\n output_tokens: 0,\n })\n\n return c.json(response)\n } catch (error) {\n return await forwardError(c, error)\n }\n})\n","import {\n fetch as undiciFetch,\n type RequestInit as UndiciRequestInit,\n} from \"undici\"\n\nimport { createTimeoutDispatcher } from \"~/lib/timeout-dispatcher\"\nimport {\n buildCodexRequestHeaders,\n CODEX_API_BASE_URL,\n} from \"~/services/codex/create-responses\"\n\nexport type CodexImagesOperation = \"generations\" | \"edits\"\n\nconst CODEX_IMAGES_TIMEOUT_MS = 15 * 60 * 1000\n\nconst codexImagesDispatcher = createTimeoutDispatcher(CODEX_IMAGES_TIMEOUT_MS)\n\ntype StreamingRequestInit = RequestInit & {\n duplex: \"half\"\n}\n\nexport function resolveCodexImagesUrl(\n requestUrl: string,\n operation: CodexImagesOperation,\n): string {\n const upstreamUrl = new URL(`${CODEX_API_BASE_URL}/codex/images/${operation}`)\n upstreamUrl.search = new URL(requestUrl, \"http://localhost\").search\n return upstreamUrl.toString()\n}\n\nexport async function forwardCodexImages(\n request: Request,\n operation: CodexImagesOperation,\n): Promise<Response> {\n const headers = buildCodexRequestHeaders(request.headers)\n if (!headers.has(\"accept\")) {\n headers.set(\"accept\", \"application/json\")\n }\n\n if (operation === \"generations\" && !headers.has(\"content-type\")) {\n headers.set(\"content-type\", \"application/json\")\n }\n\n const init: StreamingRequestInit = {\n method: \"POST\",\n headers,\n body: request.body,\n duplex: \"half\",\n signal: AbortSignal.timeout(CODEX_IMAGES_TIMEOUT_MS),\n }\n\n const upstreamUrl = resolveCodexImagesUrl(request.url, operation)\n if (typeof Bun !== \"undefined\") {\n return await fetch(upstreamUrl, init)\n }\n\n // Node and Undici expose separate fetch types, but their streamed request\n // and response objects are runtime-compatible here.\n return (await undiciFetch(upstreamUrl, {\n ...init,\n dispatcher: codexImagesDispatcher,\n } as unknown as UndiciRequestInit)) as unknown as Response\n}\n","import { Hono, type Context } from \"hono\"\n\nimport type { ResolvedProviderConfig } from \"~/lib/config\"\nimport { forwardError } from \"~/lib/error\"\nimport { createHandlerLogger, debugJson, debugJsonAsync } from \"~/lib/logger\"\nimport { resolveProviderConfig } from \"~/lib/provider-resolver\"\nimport {\n forwardCodexImages,\n type CodexImagesOperation,\n} from \"~/services/codex/images\"\nimport { createProviderProxyResponse } from \"~/services/providers/provider-proxy\"\n\nconst logger = createHandlerLogger(\"images-handler\")\n\nexport const imageRoutes = new Hono()\nexport const imageRouteDependencies = { debugJsonAsync }\n\nfunction getContentMetadata(headers: Headers) {\n return {\n contentType: headers.get(\"content-type\"),\n contentLength: headers.get(\"content-length\"),\n }\n}\n\n/**\n * Handles Codex images proxying. Pass `resolvedProviderConfig` when the\n * caller already resolved the codex provider to avoid a second resolve.\n */\nexport async function handleCodexImages(\n c: Context,\n operation: CodexImagesOperation,\n resolvedProviderConfig?: ResolvedProviderConfig,\n): Promise<Response> {\n try {\n const codexProviderConfig =\n resolvedProviderConfig ?? (await resolveProviderConfig(\"codex\"))\n if (!codexProviderConfig) {\n return c.json(\n {\n error: {\n message: \"Provider 'codex' not found or disabled\",\n type: \"invalid_request_error\",\n },\n },\n 404,\n )\n }\n\n if (operation === \"generations\") {\n await imageRouteDependencies.debugJsonAsync(\n logger,\n \"images.generations.codex.request\",\n async () => ({\n body: await c.req.raw.clone().text(),\n }),\n )\n } else {\n debugJson(\n logger,\n \"images.edits.codex.request\",\n getContentMetadata(c.req.raw.headers),\n )\n }\n\n const upstreamResponse = await forwardCodexImages(c.req.raw, operation)\n debugJson(logger, `images.${operation}.codex.response`, {\n ...getContentMetadata(upstreamResponse.headers),\n statusCode: upstreamResponse.status,\n })\n return createProviderProxyResponse(upstreamResponse)\n } catch (error) {\n logger.error(`images.${operation}.codex.error`, { error })\n return await forwardError(c, error)\n }\n}\n\nimageRoutes.post(\"/generations\", (c) => handleCodexImages(c, \"generations\"))\nimageRoutes.post(\"/edits\", (c) => handleCodexImages(c, \"edits\"))\n","import type {\n ChatCompletionsPayload,\n ContentPart,\n Message,\n Tool,\n ToolCall,\n} from \"~/lib/types/chat-completions\"\nimport type { Model } from \"~/lib/types/models\"\n\n// Encoder type mapping\nconst ENCODING_MAP = {\n o200k_base: () => import(\"gpt-tokenizer/encoding/o200k_base\"),\n cl100k_base: () => import(\"gpt-tokenizer/encoding/cl100k_base\"),\n p50k_base: () => import(\"gpt-tokenizer/encoding/p50k_base\"),\n p50k_edit: () => import(\"gpt-tokenizer/encoding/p50k_edit\"),\n r50k_base: () => import(\"gpt-tokenizer/encoding/r50k_base\"),\n} as const\n\ntype SupportedEncoding = keyof typeof ENCODING_MAP\n\n// Define encoder interface\ninterface Encoder {\n encode: (text: string) => Array<number>\n}\n\n// Cache loaded encoders to avoid repeated imports\nconst encodingCache = new Map<string, Encoder>()\n\n/**\n * Calculate tokens for tool calls\n */\nconst calculateToolCallsTokens = (\n toolCalls: Array<ToolCall>,\n encoder: Encoder,\n constants: ReturnType<typeof getModelConstants>,\n): number => {\n let tokens = 0\n for (const toolCall of toolCalls) {\n tokens += constants.funcInit\n tokens += encoder.encode(toolCall.id).length\n tokens += encoder.encode(toolCall.function.name).length\n tokens += encoder.encode(toolCall.function.arguments).length\n }\n tokens += constants.funcEnd\n return tokens\n}\n\n/**\n * Calculate tokens for content parts\n */\nconst calculateContentPartsTokens = (\n contentParts: Array<ContentPart>,\n encoder: Encoder,\n): number => {\n let tokens = 0\n for (const part of contentParts) {\n if (part.type === \"image_url\") {\n tokens += encoder.encode(part.image_url.url).length + 85\n } else if (part.type === \"file\") {\n tokens += encoder.encode(part.file.file_data).length\n if (part.file.filename) {\n tokens += encoder.encode(part.file.filename).length\n }\n } else if (part.text) {\n tokens += encoder.encode(part.text).length\n }\n }\n return tokens\n}\n\n/**\n * Calculate tokens for a single message\n */\nconst calculateMessageTokens = (\n message: Message,\n encoder: Encoder,\n constants: ReturnType<typeof getModelConstants>,\n): number => {\n const tokensPerMessage = 3\n const tokensPerName = 1\n let tokens = tokensPerMessage\n for (const [key, value] of Object.entries(message)) {\n if (key === \"reasoning_opaque\") {\n continue\n }\n if (typeof value === \"string\") {\n tokens += encoder.encode(value).length\n }\n if (key === \"name\") {\n tokens += tokensPerName\n }\n if (key === \"tool_calls\") {\n tokens += calculateToolCallsTokens(\n value as Array<ToolCall>,\n encoder,\n constants,\n )\n }\n if (key === \"content\" && Array.isArray(value)) {\n tokens += calculateContentPartsTokens(\n value as Array<ContentPart>,\n encoder,\n )\n }\n }\n return tokens\n}\n\n/**\n * Calculate tokens using custom algorithm\n */\nconst calculateTokens = (\n messages: Array<Message>,\n encoder: Encoder,\n constants: ReturnType<typeof getModelConstants>,\n): number => {\n if (messages.length === 0) {\n return 0\n }\n let numTokens = 0\n for (const message of messages) {\n numTokens += calculateMessageTokens(message, encoder, constants)\n }\n // every reply is primed with <|start|>assistant<|message|>\n numTokens += 3\n return numTokens\n}\n\n/**\n * Get the corresponding encoder module based on encoding type\n */\nconst getEncodeChatFunction = async (encoding: string): Promise<Encoder> => {\n if (encodingCache.has(encoding)) {\n const cached = encodingCache.get(encoding)\n if (cached) {\n return cached\n }\n }\n\n const supportedEncoding = encoding as SupportedEncoding\n if (!(supportedEncoding in ENCODING_MAP)) {\n const fallbackModule = (await ENCODING_MAP.o200k_base()) as Encoder\n encodingCache.set(encoding, fallbackModule)\n return fallbackModule\n }\n\n const encodingModule = (await ENCODING_MAP[supportedEncoding]()) as Encoder\n encodingCache.set(encoding, encodingModule)\n return encodingModule\n}\n\n/**\n * Get tokenizer type from model information\n */\nexport const getTokenizerFromModel = (model: Model): string => {\n return model.capabilities.tokenizer || \"o200k_base\"\n}\n\n/**\n * Get model-specific constants for token calculation\n */\nconst getModelConstants = (model: Model) => {\n return model.id === \"gpt-3.5-turbo\" || model.id === \"gpt-4\" ?\n {\n funcInit: 10,\n propInit: 3,\n propKey: 3,\n enumInit: -3,\n enumItem: 3,\n funcEnd: 12,\n isGpt: true,\n }\n : {\n funcInit: 7,\n propInit: 3,\n propKey: 3,\n enumInit: -3,\n enumItem: 3,\n funcEnd: 12,\n isGpt: model.id.startsWith(\"gpt-\"),\n }\n}\n\n/**\n * Calculate tokens for a single parameter\n */\nconst calculateParameterTokens = (\n key: string,\n prop: unknown,\n context: {\n encoder: Encoder\n constants: ReturnType<typeof getModelConstants>\n },\n): number => {\n const { encoder, constants } = context\n let tokens = constants.propKey\n\n // Early return if prop is not an object\n if (typeof prop !== \"object\" || prop === null) {\n return tokens\n }\n\n // Type assertion for parameter properties\n const param = prop as {\n type?: string\n description?: string\n enum?: Array<unknown>\n [key: string]: unknown\n }\n\n const paramName = key\n const paramType = param.type || \"string\"\n let paramDesc = param.description || \"\"\n\n // Handle enum values\n if (param.enum && Array.isArray(param.enum)) {\n tokens += constants.enumInit\n for (const item of param.enum) {\n tokens += constants.enumItem\n tokens += encoder.encode(String(item)).length\n }\n }\n\n // Clean up description\n if (paramDesc.endsWith(\".\")) {\n paramDesc = paramDesc.slice(0, -1)\n }\n\n // Encode the main parameter line\n const line = `${paramName}:${paramType}:${paramDesc}`\n tokens += encoder.encode(line).length\n\n if (param.type === \"array\" && param[\"items\"]) {\n tokens += calculateParametersTokens(param[\"items\"], encoder, constants)\n }\n\n // Handle additional properties (excluding standard ones)\n const excludedKeys = new Set([\"type\", \"description\", \"enum\", \"items\"])\n for (const propertyName of Object.keys(param)) {\n if (!excludedKeys.has(propertyName)) {\n const propertyValue = param[propertyName]\n const propertyText =\n typeof propertyValue === \"string\" ? propertyValue : (\n JSON.stringify(propertyValue)\n )\n tokens += encoder.encode(`${propertyName}:${propertyText}`).length\n }\n }\n\n return tokens\n}\n\n/**\n * Calculate tokens for properties object\n */\nconst calculatePropertiesTokens = (\n properties: Record<string, unknown>,\n encoder: Encoder,\n constants: ReturnType<typeof getModelConstants>,\n): number => {\n let tokens = 0\n if (Object.keys(properties).length > 0) {\n tokens += constants.propInit\n for (const propKey of Object.keys(properties)) {\n tokens += calculateParameterTokens(propKey, properties[propKey], {\n encoder,\n constants,\n })\n }\n }\n return tokens\n}\n\n/**\n * Calculate tokens for function parameters\n */\nconst calculateParametersTokens = (\n parameters: unknown,\n encoder: Encoder,\n constants: ReturnType<typeof getModelConstants>,\n): number => {\n if (!parameters || typeof parameters !== \"object\") {\n return 0\n }\n\n const params = parameters as Record<string, unknown>\n let tokens = 0\n\n const excludedKeys = new Set([\"$schema\", \"additionalProperties\"])\n for (const [key, value] of Object.entries(params)) {\n if (excludedKeys.has(key)) {\n continue\n }\n if (key === \"properties\") {\n tokens += calculatePropertiesTokens(\n value as Record<string, unknown>,\n encoder,\n constants,\n )\n } else {\n const paramText =\n typeof value === \"string\" ? value : JSON.stringify(value)\n tokens += encoder.encode(`${key}:${paramText}`).length\n }\n }\n\n return tokens\n}\n\n/**\n * Calculate tokens for a single tool\n */\nconst calculateToolTokens = (\n tool: Tool,\n encoder: Encoder,\n constants: ReturnType<typeof getModelConstants>,\n): number => {\n let tokens = constants.funcInit\n const func = tool.function\n const fName = func.name\n let fDesc = func.description || \"\"\n if (fDesc.endsWith(\".\")) {\n fDesc = fDesc.slice(0, -1)\n }\n const line = fName + \":\" + fDesc\n tokens += encoder.encode(line).length\n if (\n typeof func.parameters === \"object\" // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n && func.parameters !== null\n ) {\n tokens += calculateParametersTokens(func.parameters, encoder, constants)\n }\n return tokens\n}\n\n/**\n * Calculate token count for tools based on model\n */\nexport const numTokensForTools = (\n tools: Array<Tool>,\n encoder: Encoder,\n constants: ReturnType<typeof getModelConstants>,\n): number => {\n let funcTokenCount = 0\n if (constants.isGpt) {\n for (const tool of tools) {\n funcTokenCount += calculateToolTokens(tool, encoder, constants)\n }\n funcTokenCount += constants.funcEnd\n } else {\n for (const tool of tools) {\n funcTokenCount += encoder.encode(JSON.stringify(tool)).length\n }\n }\n return funcTokenCount\n}\n\n/**\n * Calculate the token count of messages, supporting multiple GPT encoders\n */\nexport const getTokenCount = async (\n payload: ChatCompletionsPayload,\n model: Model,\n): Promise<{ input: number; output: number }> => {\n // Get tokenizer string\n const tokenizer = getTokenizerFromModel(model)\n\n // Get corresponding encoder module\n const encoder = await getEncodeChatFunction(tokenizer)\n\n const simplifiedMessages = payload.messages\n const inputMessages = simplifiedMessages.filter(\n (msg) => msg.role !== \"assistant\",\n )\n const outputMessages = simplifiedMessages.filter(\n (msg) => msg.role === \"assistant\",\n )\n\n const constants = getModelConstants(model)\n // gpt count token https://github.com/openai/openai-cookbook/blob/main/examples/How_to_count_tokens_with_tiktoken.ipynb\n let inputTokens = calculateTokens(inputMessages, encoder, constants)\n if (payload.tools && payload.tools.length > 0) {\n inputTokens += numTokensForTools(payload.tools, encoder, constants)\n }\n const outputTokens = calculateTokens(outputMessages, encoder, constants)\n\n return {\n input: inputTokens,\n output: outputTokens,\n }\n}\n","import { type AnthropicResponse } from \"~/lib/types/anthropic\"\n\nexport function mapOpenAIStopReasonToAnthropic(\n finishReason: \"stop\" | \"length\" | \"tool_calls\" | \"content_filter\" | null,\n): AnthropicResponse[\"stop_reason\"] {\n if (finishReason === null) {\n return null\n }\n const stopReasonMap = {\n stop: \"end_turn\",\n length: \"max_tokens\",\n tool_calls: \"tool_use\",\n content_filter: \"end_turn\",\n } as const\n return stopReasonMap[finishReason]\n}\n","import type { ToolContentSupportType } from \"~/lib/config\"\nimport type { Model } from \"~/lib/types/models\"\n\nimport { requestContext } from \"~/lib/request-context\"\nimport { state } from \"~/lib/state\"\nimport {\n type ChatCompletionResponse,\n type ChatCompletionsPayload,\n type ContentPart,\n type Message,\n type TextPart,\n type Tool,\n type ToolCall,\n} from \"~/lib/types/chat-completions\"\n\nimport {\n type AnthropicAssistantContentBlock,\n type AnthropicAssistantMessage,\n type AnthropicDocumentBlock,\n type AnthropicMessagesPayload,\n type AnthropicResponse,\n type AnthropicSystemMessage,\n type AnthropicTextBlock,\n type AnthropicThinkingBlock,\n type AnthropicTool,\n type AnthropicToolResultContentBlock,\n type AnthropicToolResultBlock,\n type AnthropicToolUseBlock,\n type AnthropicUserContentBlock,\n type AnthropicUserMessage,\n} from \"~/lib/types/anthropic\"\nimport { mapOpenAIStopReasonToAnthropic } from \"./utils\"\nimport { parseUserIdMetadata } from \"~/lib/utils\"\n\n// Compatible with opencode, it will filter out blocks where the thinking text is empty, so we need add a default thinking text\nexport const THINKING_TEXT = \"Thinking...\"\nexport const RICH_TOOL_RESULT_MOVED_TEXT =\n \"Rich tool result content was moved to a user message because this upstream does not support it in tool messages.\"\n\ninterface TranslationCapabilities {\n supportPdf: boolean\n toolContentSupportType: Array<ToolContentSupportType>\n}\n\ninterface ToolContentSupport {\n array: boolean\n image: boolean\n pdf: boolean\n}\n\ninterface ToolResultMessages {\n movedUserMessage?: Message\n toolMessage: Message\n}\n\ninterface TranslateToOpenAIOptions {\n supportPdf?: boolean\n toolContentSupportType?: Array<ToolContentSupportType>\n validateReasoningEffort?: boolean\n reasoningEffortSupport?: Array<string>\n}\n\ntype MappableContentBlock =\n | AnthropicUserContentBlock\n | AnthropicAssistantContentBlock\n | AnthropicToolResultContentBlock\n\n// Payload translation\nexport function translateToOpenAI(\n payload: AnthropicMessagesPayload,\n options: TranslateToOpenAIOptions = {},\n): ChatCompletionsPayload {\n const modelId = payload.model\n const model = state.models?.data.find((m) => m.id === modelId)\n const thinkingBudget = getThinkingBudget(payload, model)\n const reasoningEffort = getReasoningEffort(payload, options)\n const { sessionId: metadataPromptCacheKey } = parseUserIdMetadata(\n payload.metadata?.user_id,\n )\n const requestStore = requestContext.getStore()\n const sessionAffinity = requestStore?.sessionAffinity?.trim() || null\n const promptCacheKey = metadataPromptCacheKey ?? sessionAffinity\n const capabilities = {\n supportPdf: options.supportPdf ?? false,\n toolContentSupportType: options.toolContentSupportType ?? [],\n }\n return {\n model: modelId,\n messages: translateAnthropicMessagesToOpenAI(\n payload,\n modelId,\n capabilities,\n ),\n max_completion_tokens: payload.max_tokens,\n stop: payload.stop_sequences,\n stream: payload.stream,\n temperature: payload.temperature,\n top_p: payload.top_p,\n user: payload.metadata?.user_id,\n tools: translateAnthropicToolsToOpenAI(payload.tools),\n tool_choice: translateAnthropicToolChoiceToOpenAI(payload.tool_choice),\n thinking_budget: thinkingBudget,\n ...(reasoningEffort ? { reasoning_effort: reasoningEffort } : {}),\n ...(promptCacheKey ? { prompt_cache_key: promptCacheKey } : {}),\n }\n}\n\nfunction getReasoningEffort(\n payload: AnthropicMessagesPayload,\n options: TranslateToOpenAIOptions,\n): string | undefined {\n const effort = payload.output_config?.effort\n if (!effort) {\n return undefined\n }\n\n if (!options.validateReasoningEffort) {\n return effort\n }\n\n const supportedEfforts = options.reasoningEffortSupport\n if (!supportedEfforts || supportedEfforts.length === 0) {\n return undefined\n }\n\n if (supportedEfforts.includes(effort)) {\n return effort\n }\n\n return supportedEfforts.at(-1)\n}\n\nfunction getThinkingBudget(\n payload: AnthropicMessagesPayload,\n model: Model | undefined,\n): number | undefined {\n const thinking = payload.thinking\n if (model && thinking?.budget_tokens !== undefined) {\n const maxThinkingBudget = Math.min(\n model.capabilities.supports.max_thinking_budget ?? 0,\n (model.capabilities.limits.max_output_tokens ?? 0) - 1,\n )\n thinking.budget_tokens ??= maxThinkingBudget\n if (maxThinkingBudget > 0) {\n const budgetTokens = Math.min(thinking.budget_tokens, maxThinkingBudget)\n return Math.max(\n budgetTokens,\n model.capabilities.supports.min_thinking_budget ?? 1024,\n )\n }\n }\n return undefined\n}\n\nfunction translateAnthropicMessagesToOpenAI(\n payload: AnthropicMessagesPayload,\n modelId: string,\n capabilities: TranslationCapabilities,\n): Array<Message> {\n const systemMessages = handleSystemPrompt(payload.system)\n const otherMessages = payload.messages.flatMap((message) => {\n if (message.role === \"user\") {\n return handleUserMessage(message, capabilities)\n }\n if (message.role === \"system\") {\n return [handleInlineSystemMessage(message)]\n }\n return handleAssistantMessage(message, modelId, capabilities)\n })\n return [...systemMessages, ...otherMessages]\n}\n\nfunction handleSystemPrompt(\n system: string | Array<AnthropicTextBlock> | undefined,\n): Array<Message> {\n if (!system) {\n return []\n }\n\n if (typeof system === \"string\") {\n return [{ role: \"system\", content: system }]\n } else {\n const systemText = system\n .map((block) => {\n return block.text\n })\n .join(\"\\n\\n\")\n return [{ role: \"system\", content: systemText }]\n }\n}\n\nfunction handleInlineSystemMessage(message: AnthropicSystemMessage): Message {\n return {\n role: \"user\",\n content: mapContent(message.content),\n }\n}\n\nfunction handleUserMessage(\n message: AnthropicUserMessage,\n capabilities: TranslationCapabilities,\n): Array<Message> {\n const newMessages: Array<Message> = []\n\n if (Array.isArray(message.content)) {\n const toolResultBlocks = message.content.filter(\n (block): block is AnthropicToolResultBlock =>\n block.type === \"tool_result\",\n )\n const otherBlocks = message.content.filter(\n (block) => block.type !== \"tool_result\",\n )\n\n // Tool results must come first to maintain protocol: tool_use -> tool_result -> user\n const movedToolResultUserMessages: Array<Message> = []\n for (const block of toolResultBlocks) {\n const result = handleToolResultBlock(block, capabilities)\n newMessages.push(result.toolMessage)\n if (result.movedUserMessage) {\n movedToolResultUserMessages.push(result.movedUserMessage)\n }\n }\n newMessages.push(...movedToolResultUserMessages)\n\n if (otherBlocks.length > 0) {\n newMessages.push({\n role: \"user\",\n content: mapContent(otherBlocks, {\n supportPdf: capabilities.supportPdf,\n }),\n })\n }\n } else {\n newMessages.push({\n role: \"user\",\n content: mapContent(message.content),\n })\n }\n\n return newMessages\n}\n\nfunction handleToolResultBlock(\n block: AnthropicToolResultBlock,\n capabilities: TranslationCapabilities,\n): ToolResultMessages {\n if (typeof block.content === \"string\") {\n return {\n toolMessage: createToolMessage(block.tool_use_id, block.content),\n }\n }\n\n if (!Array.isArray(block.content)) {\n return {\n toolMessage: createToolMessage(block.tool_use_id, \"\"),\n }\n }\n\n const support = getToolContentSupport(capabilities)\n const hasImage = block.content.some((block) => block.type === \"image\")\n const hasDocument = block.content.some((block) => block.type === \"document\")\n const content = mapContent(block.content, {\n supportPdf: capabilities.supportPdf,\n })\n\n const hasPdfFile = hasDocument && capabilities.supportPdf\n const shouldMoveImageToUserMessage = hasImage && !support.image\n const shouldMovePdfToUserMessage = hasPdfFile && !support.pdf\n if (shouldMoveImageToUserMessage || shouldMovePdfToUserMessage) {\n return {\n movedUserMessage: createToolResultUserMessage(\n block,\n capabilities.supportPdf,\n ),\n toolMessage: createToolMessage(\n block.tool_use_id,\n getTextToolContent(content) || RICH_TOOL_RESULT_MOVED_TEXT,\n ),\n }\n }\n\n const hasRichContent = hasImage || hasPdfFile\n if (support.array || hasRichContent) {\n return {\n toolMessage: createToolMessage(block.tool_use_id, content),\n }\n }\n\n return {\n toolMessage: createToolMessage(\n block.tool_use_id,\n getTextToolContent(content),\n ),\n }\n}\n\nfunction getTextToolContent(content: Message[\"content\"]): string {\n if (!Array.isArray(content)) {\n return content ?? \"\"\n }\n\n return content\n .flatMap((part) =>\n part.type === \"text\" && part.text.length > 0 ? [part.text] : [],\n )\n .join(\"\\n\")\n}\n\nfunction getToolContentSupport(\n capabilities: TranslationCapabilities,\n): ToolContentSupport {\n return {\n array: capabilities.toolContentSupportType.includes(\"array\"),\n image: capabilities.toolContentSupportType.includes(\"image\"),\n pdf:\n capabilities.supportPdf\n && capabilities.toolContentSupportType.includes(\"pdf\"),\n }\n}\n\nfunction createToolMessage(\n toolCallId: string,\n content: Message[\"content\"],\n): Message {\n return {\n role: \"tool\",\n tool_call_id: toolCallId,\n content,\n }\n}\n\nfunction createToolResultUserMessage(\n block: AnthropicToolResultBlock,\n supportPdf: boolean,\n): Message {\n const prefix: TextPart = {\n type: \"text\",\n text: `Tool result for ${block.tool_use_id}:`,\n }\n const content = mapContent(block.content, {\n supportPdf,\n })\n if (Array.isArray(content)) {\n return {\n role: \"user\",\n content: [prefix, ...content],\n }\n }\n\n return {\n role: \"user\",\n content: [prefix, { type: \"text\", text: content ?? \"\" }],\n }\n}\n\nfunction handleAssistantMessage(\n message: AnthropicAssistantMessage,\n modelId: string,\n capabilities: TranslationCapabilities,\n): Array<Message> {\n if (!Array.isArray(message.content)) {\n return [\n {\n role: \"assistant\",\n content: mapContent(message.content),\n },\n ]\n }\n\n // Skip assistant messages with empty content array\n if (message.content.length === 0) {\n return []\n }\n\n const toolUseBlocks = message.content.filter(\n (block): block is AnthropicToolUseBlock => block.type === \"tool_use\",\n )\n\n let thinkingBlocks = message.content.filter(\n (block): block is AnthropicThinkingBlock => block.type === \"thinking\",\n )\n\n if (modelId.startsWith(\"claude\")) {\n // Keep signature-only blocks (empty thinking text): the signature, not the\n // summary text, carries reasoning continuity and is forwarded upstream as\n // reasoning_opaque. Dropping empty-text blocks would silently lose those\n // signatures. The THINKING_TEXT placeholder is still excluded: it is a\n // synthetic value emitted by older versions, never real model output.\n thinkingBlocks = thinkingBlocks.filter(\n (b) =>\n b.thinking !== THINKING_TEXT\n && b.signature\n // gpt signature has @ in it, so filter those out for claude models\n && !b.signature.includes(\"@\"),\n )\n }\n\n const thinkingContents = thinkingBlocks\n .filter((b) => b.thinking && b.thinking !== THINKING_TEXT)\n .map((b) => b.thinking)\n\n const allThinkingContent =\n thinkingContents.length > 0 ? thinkingContents.join(\"\\n\\n\") : undefined\n\n const signature = thinkingBlocks.find((b) => b.signature)?.signature\n\n return toolUseBlocks.length > 0 ?\n [\n {\n role: \"assistant\",\n content: mapContent(message.content, {\n supportPdf: capabilities.supportPdf,\n }),\n reasoning_text: allThinkingContent,\n reasoning_opaque: signature,\n tool_calls: toolUseBlocks.map((toolUse) => ({\n id: toolUse.id,\n type: \"function\",\n function: {\n name: toolUse.name,\n arguments: JSON.stringify(toolUse.input),\n },\n })),\n },\n ]\n : [\n {\n role: \"assistant\",\n content: mapContent(message.content, {\n supportPdf: capabilities.supportPdf,\n }),\n reasoning_text: allThinkingContent,\n reasoning_opaque: signature,\n },\n ]\n}\n\nfunction mapContent(\n content: string | Array<MappableContentBlock>,\n options: { supportPdf?: boolean } = {},\n): string | Array<ContentPart> | null {\n if (typeof content === \"string\") {\n return content\n }\n if (!Array.isArray(content)) {\n return null\n }\n\n const contentParts: Array<ContentPart> = []\n for (const block of content) {\n switch (block.type) {\n case \"text\": {\n contentParts.push({ type: \"text\", text: block.text })\n break\n }\n case \"image\": {\n contentParts.push({\n type: \"image_url\",\n image_url: {\n url: `data:${block.source.media_type};base64,${block.source.data}`,\n },\n })\n break\n }\n case \"document\": {\n contentParts.push(\n options.supportPdf ?\n createDocumentFilePart(block)\n : createDocumentTextPart(),\n )\n break\n }\n case \"tool_reference\": {\n contentParts.push({\n type: \"text\",\n text: `Tool ${block.tool_name} loaded`,\n })\n break\n }\n // No default\n }\n }\n if (contentParts.length === 0) {\n return \"\"\n }\n return contentParts\n}\n\nfunction createDocumentTextPart(): TextPart {\n return {\n type: \"text\",\n text: \"PDF/document content is not supported by this Chat Completions upstream. Use the available text extracted from the document.\",\n }\n}\n\nfunction createDocumentFilePart(block: AnthropicDocumentBlock): ContentPart {\n return {\n type: \"file\",\n file: {\n file_data: `data:${block.source.media_type};base64,${block.source.data}`,\n filename: block.title ?? \"document.pdf\",\n },\n }\n}\n\nfunction translateAnthropicToolsToOpenAI(\n anthropicTools: Array<AnthropicTool> | undefined,\n): Array<Tool> | undefined {\n if (!anthropicTools) {\n return undefined\n }\n return anthropicTools.map((tool) => ({\n type: \"function\",\n function: {\n name: tool.name,\n description: tool.description,\n parameters: normalizeToolSchema(tool.input_schema),\n ...(tool.strict === undefined ? {} : { strict: tool.strict }),\n },\n }))\n}\n\n/**\n * Ensures `type: \"object\"` schema has a `properties` field.\n * OpenAI's API rejects object schemas without it.\n */\nexport const normalizeToolSchema = (\n schema: Record<string, unknown>,\n): Record<string, unknown> => {\n if (schema.type === \"object\" && !schema.properties) {\n return { ...schema, properties: {} }\n }\n return schema\n}\n\nfunction translateAnthropicToolChoiceToOpenAI(\n anthropicToolChoice: AnthropicMessagesPayload[\"tool_choice\"],\n): ChatCompletionsPayload[\"tool_choice\"] {\n if (!anthropicToolChoice) {\n return undefined\n }\n\n switch (anthropicToolChoice.type) {\n case \"auto\": {\n return \"auto\"\n }\n case \"any\": {\n return \"required\"\n }\n case \"tool\": {\n if (anthropicToolChoice.name) {\n return {\n type: \"function\",\n function: { name: anthropicToolChoice.name },\n }\n }\n return undefined\n }\n case \"none\": {\n return \"none\"\n }\n default: {\n return undefined\n }\n }\n}\n\n// Response translation\n\nexport function translateToAnthropic(\n response: ChatCompletionResponse,\n): AnthropicResponse {\n // Merge content from all choices\n const assistantContentBlocks: Array<AnthropicAssistantContentBlock> = []\n let stopReason = response.choices[0]?.finish_reason ?? null\n\n // Process all choices to extract text and tool use blocks\n for (const choice of response.choices) {\n const textBlocks = getAnthropicTextBlocks(choice.message.content)\n const thinkBlocks = getAnthropicThinkBlocks(\n getOpenAIReasoningText(choice.message),\n choice.message.reasoning_opaque,\n )\n const toolUseBlocks = getAnthropicToolUseBlocks(choice.message.tool_calls)\n\n assistantContentBlocks.push(...thinkBlocks, ...textBlocks, ...toolUseBlocks)\n\n // Use the finish_reason from the first choice, or prioritize tool_calls\n if (choice.finish_reason === \"tool_calls\" || stopReason === \"stop\") {\n stopReason = choice.finish_reason\n }\n }\n\n return {\n id: response.id,\n type: \"message\",\n role: \"assistant\",\n model: response.model,\n content: assistantContentBlocks,\n stop_reason: mapOpenAIStopReasonToAnthropic(stopReason),\n stop_sequence: null,\n usage: mapOpenAIChatCompletionUsage(response),\n }\n}\n\nfunction mapOpenAIChatCompletionUsage(\n response: ChatCompletionResponse,\n): AnthropicResponse[\"usage\"] {\n const promptDetails = response.usage?.prompt_tokens_details\n const promptTokens = response.usage?.prompt_tokens ?? 0\n const cachedTokens = promptDetails?.cached_tokens ?? 0\n const cacheCreationTokens = promptDetails?.cache_creation_input_tokens ?? 0\n const usage: AnthropicResponse[\"usage\"] = {\n input_tokens: Math.max(\n 0,\n promptTokens - cachedTokens - cacheCreationTokens,\n ),\n output_tokens: response.usage?.completion_tokens ?? 0,\n }\n\n if (promptDetails?.cache_creation_input_tokens !== undefined) {\n usage.cache_creation_input_tokens = cacheCreationTokens\n }\n if (promptDetails?.cached_tokens !== undefined) {\n usage.cache_read_input_tokens = cachedTokens\n }\n\n return usage\n}\n\nfunction getOpenAIReasoningText(message: {\n reasoning_content?: string | null\n reasoning_text?: string | null\n reasoning?: string | null\n}): string | null | undefined {\n return (\n message.reasoning_text ?? message.reasoning_content ?? message.reasoning\n )\n}\n\nfunction getAnthropicTextBlocks(\n messageContent: Message[\"content\"],\n): Array<AnthropicTextBlock> {\n if (typeof messageContent === \"string\" && messageContent.length > 0) {\n return [{ type: \"text\", text: messageContent }]\n }\n\n if (Array.isArray(messageContent)) {\n return messageContent\n .filter((part): part is TextPart => part.type === \"text\")\n .map((part) => ({ type: \"text\", text: part.text }))\n }\n\n return []\n}\n\nfunction getAnthropicThinkBlocks(\n reasoningText: string | null | undefined,\n reasoningOpaque: string | null | undefined,\n): Array<AnthropicThinkingBlock> {\n if (reasoningText && reasoningText.length > 0) {\n return [\n {\n type: \"thinking\",\n thinking: reasoningText,\n signature: reasoningOpaque || \"\",\n },\n ]\n }\n if (reasoningOpaque && reasoningOpaque.length > 0) {\n return [\n {\n type: \"thinking\",\n thinking: \"\",\n signature: reasoningOpaque,\n },\n ]\n }\n return []\n}\n\nfunction getAnthropicToolUseBlocks(\n toolCalls: Array<ToolCall> | undefined,\n): Array<AnthropicToolUseBlock> {\n if (!toolCalls) {\n return []\n }\n return toolCalls.map((toolCall) => ({\n type: \"tool_use\",\n id: toolCall.id,\n name: toolCall.function.name,\n input: JSON.parse(toolCall.function.arguments) as Record<string, unknown>,\n }))\n}\n","import type { Model } from \"~/lib/types/models\"\n\nimport {\n COMPACT_AUTO_CONTINUE,\n COMPACT_REQUEST,\n compactAutoContinuePromptStarts,\n compactMessageSections,\n compactSummaryPromptStart,\n compactSystemPromptStarts,\n compactTextOnlyGuard,\n type CompactType,\n} from \"~/lib/compact\"\nimport { getReasoningEffortForModel } from \"~/lib/config\"\nimport { normalizeSdkModelId } from \"~/lib/models\"\n\nimport type {\n AnthropicAssistantContentBlock,\n AnthropicCacheControl,\n AnthropicDocumentBlock,\n AnthropicImageBlock,\n AnthropicInputMessage,\n AnthropicMessage,\n AnthropicMessagesPayload,\n AnthropicTextBlock,\n AnthropicToolResultBlock,\n AnthropicToolResultContentBlock,\n AnthropicUserContentBlock,\n AnthropicUserMessage,\n} from \"~/lib/types/anthropic\"\n\nexport const TOOL_REFERENCE_TURN_BOUNDARY = \"Tool loaded.\"\nconst SYSTEM_REMINDER_START = \"<system-reminder>\"\nconst SYSTEM_REMINDER_END = \"</system-reminder>\"\nconst SUBAGENT_START_HOOK_ADDITIONAL_PREFIX = \"SubagentStart hook additional\"\nexport const claudeAutoModelSystemPromptStart =\n \"You are a security monitor for autonomous AI coding agents.\"\nexport const claudeAutoModelStopSequence = \"</block>\"\n\nconst IDE_GET_DIAGNOSTICS_TOOL = \"mcp__ide__getDiagnostics\"\nconst IDE_GET_DIAGNOSTICS_DESCRIPTION =\n \"Get language diagnostics from VS Code. Returns errors, warnings, information, and hints for files in the workspace.\"\nconst PDF_FILE_READ_PREFIX = \"PDF file read:\"\nconst CLAUDE_CODE_BILLING_HEADER_PREFIX = \"x-anthropic-billing-header:\"\nconst CLAUDE_CODE_CCH_SEGMENT_PATTERN = /(^|;\\s*)cch=[^;]+;/u\n\ntype AnthropicAttachmentBlock = AnthropicImageBlock | AnthropicDocumentBlock\ntype AnthropicMessageContentBlock =\n | AnthropicUserContentBlock\n | AnthropicAssistantContentBlock\n\nconst createTextBlock = (text: string): AnthropicTextBlock => ({\n type: \"text\",\n text,\n})\n\nconst appendTextSegment = (base: string, addition: string): string => {\n if (base.length === 0) {\n return addition\n }\n if (addition.length === 0) {\n return base\n }\n\n return `${base}\\n\\n${addition}`\n}\n\nconst ensureSystemReminderText = (text: string): string => {\n if (text.startsWith(SYSTEM_REMINDER_START)) {\n return text\n }\n\n return `${SYSTEM_REMINDER_START}\\n${text.trim()}\\n${SYSTEM_REMINDER_END}`\n}\n\nconst normalizeSystemStringForMerge = (\n text: string,\n): string | Array<AnthropicTextBlock> => {\n if (!text.startsWith(SUBAGENT_START_HOOK_ADDITIONAL_PREFIX)) {\n return ensureSystemReminderText(text)\n }\n\n const lineBreakMatch = /\\r?\\n/.exec(text)\n if (!lineBreakMatch) {\n return [createTextBlock(ensureSystemReminderText(text))]\n }\n\n const firstLine = text.slice(0, lineBreakMatch.index)\n const rest = text.slice(lineBreakMatch.index + lineBreakMatch[0].length)\n return [\n createTextBlock(ensureSystemReminderText(firstLine)),\n ...(rest.length > 0 ?\n [createTextBlock(ensureSystemReminderText(rest))]\n : []),\n ]\n}\n\nconst normalizeSystemContentForMerge = (\n content: string | Array<AnthropicTextBlock>,\n): string | Array<AnthropicTextBlock> => {\n if (typeof content === \"string\") {\n return normalizeSystemStringForMerge(content)\n }\n\n return content.flatMap((block) => {\n const normalized = normalizeSystemStringForMerge(block.text)\n if (typeof normalized === \"string\") {\n return [{ ...block, text: normalized }]\n }\n\n return normalized.map((normalizedBlock, index) =>\n index === normalized.length - 1 ?\n { ...block, text: normalizedBlock.text }\n : normalizedBlock,\n )\n })\n}\n\nconst toSystemTextBlocks = (\n content: string | Array<AnthropicTextBlock>,\n): Array<AnthropicTextBlock> => {\n return typeof content === \"string\" ? [createTextBlock(content)] : [...content]\n}\n\nconst mergeSystemPromptContent = (\n current: string | Array<AnthropicTextBlock> | undefined,\n addition: string | Array<AnthropicTextBlock>,\n): string | Array<AnthropicTextBlock> => {\n if (current === undefined) {\n return typeof addition === \"string\" ? addition : [...addition]\n }\n\n if (typeof current === \"string\" && typeof addition === \"string\") {\n return appendTextSegment(current, addition)\n }\n\n return [...toSystemTextBlocks(current), ...toSystemTextBlocks(addition)]\n}\n\nconst prependSystemContentToUserMessage = (\n message: AnthropicUserMessage,\n addition: string | Array<AnthropicTextBlock>,\n): void => {\n if (typeof message.content === \"string\" && typeof addition === \"string\") {\n message.content = appendTextSegment(addition, message.content)\n return\n }\n\n if (Array.isArray(message.content)) {\n const lastToolResultIndex = message.content.findLastIndex(\n (block) => block.type === \"tool_result\",\n )\n if (lastToolResultIndex >= 0) {\n message.content = [\n ...message.content.slice(0, lastToolResultIndex + 1),\n ...toSystemTextBlocks(addition),\n ...message.content.slice(lastToolResultIndex + 1),\n ]\n return\n }\n }\n\n message.content = [\n ...toSystemTextBlocks(addition),\n ...(typeof message.content === \"string\" ?\n [createTextBlock(message.content)]\n : message.content),\n ]\n}\n\nconst normalizeClaudeCodeBillingHeader = (text: string): string => {\n if (!text.startsWith(CLAUDE_CODE_BILLING_HEADER_PREFIX)) {\n return text\n }\n\n return text.replace(CLAUDE_CODE_CCH_SEGMENT_PATTERN, \"$1cch=<stable>;\")\n}\n\nexport const normalizeClaudeCodeBillingHeaderInSystem = (\n payload: AnthropicMessagesPayload,\n): void => {\n const system = payload.system\n if (!system) {\n return\n }\n\n if (typeof system === \"string\") {\n payload.system = normalizeClaudeCodeBillingHeader(system)\n return\n }\n\n if (system.length === 0) {\n return\n }\n\n payload.system = system.map((block, index) =>\n index === 0 ?\n { ...block, text: normalizeClaudeCodeBillingHeader(block.text) }\n : block,\n )\n}\n\nexport const normalizeSystemMessages = (\n payload: AnthropicMessagesPayload,\n): void => {\n normalizeClaudeCodeBillingHeaderInSystem(payload)\n\n if (payload.model.startsWith(\"gpt\") || payload.model.startsWith(\"codex\")) {\n return\n }\n\n if (!payload.messages.some((msg) => msg.role === \"system\")) {\n return\n }\n\n const normalizedMessages: Array<AnthropicMessage> = []\n let system = payload.system\n\n for (const message of payload.messages) {\n if (message.role === \"system\") {\n const normalizedContent = normalizeSystemContentForMerge(message.content)\n const previousMessage = normalizedMessages.at(-1)\n if (previousMessage?.role === \"user\") {\n prependSystemContentToUserMessage(previousMessage, normalizedContent)\n } else if (!previousMessage) {\n system = mergeSystemPromptContent(system, normalizedContent)\n }\n continue\n }\n\n normalizedMessages.push(message)\n }\n\n payload.messages = normalizedMessages\n payload.system = system\n}\n\nconst isVersionAtLeast = (\n version: string,\n minimumMajor: number,\n minimumMinor: number,\n): boolean => {\n const [majorPart, minorPart = \"0\"] = version.split(\".\")\n const major = Number.parseInt(majorPart, 10)\n const minor = Number.parseInt(minorPart, 10)\n if (!Number.isInteger(major) || !Number.isInteger(minor)) {\n return false\n }\n\n return (\n major > minimumMajor || (major === minimumMajor && minor >= minimumMinor)\n )\n}\n\nconst shouldSummarizeThinkingDisplayForModel = (model: string): boolean => {\n const normalized = normalizeSdkModelId(model)\n return Boolean(normalized && isVersionAtLeast(normalized.version, 4, 7))\n}\n\ntype IndexedAttachment = {\n attachment: AnthropicAttachmentBlock\n order: number\n}\n\nconst getBlockCacheControl = (\n block: AnthropicMessageContentBlock | undefined,\n): AnthropicCacheControl | undefined => {\n if (!block || block.type === \"thinking\") {\n return undefined\n }\n\n const cacheControl = block.cache_control\n if (!cacheControl || typeof cacheControl !== \"object\") {\n return\n }\n\n return cacheControl\n}\n\nexport const getLastMessageContentCacheControl = (\n lastMessage: AnthropicInputMessage | undefined,\n): AnthropicCacheControl | undefined => {\n if (!lastMessage || !Array.isArray(lastMessage.content)) {\n return undefined\n }\n\n const cacheControl = getBlockCacheControl(lastMessage.content.at(-1))\n return cacheControl ? { ...cacheControl } : undefined\n}\n\n// Apply the original last message tail's cache_control to the rewritten tail. If\n// the original tail was not marked, fall back to a default ephemeral marker.\nexport const applyLastMessageCacheControl = (\n anthropicPayload: AnthropicMessagesPayload,\n lastMessageCacheControl: AnthropicCacheControl | undefined,\n): void => {\n const cacheControl = lastMessageCacheControl ?? {\n type: \"ephemeral\",\n }\n\n const lastMessage = anthropicPayload.messages.at(-1)\n if (!lastMessage || !Array.isArray(lastMessage.content)) {\n return\n }\n\n const lastBlock = lastMessage.content.at(-1)\n if (!lastBlock || lastBlock.type === \"thinking\" || lastBlock.cache_control) {\n return\n }\n\n lastBlock.cache_control = { ...cacheControl }\n}\n\nconst getCompactCandidateText = (message: AnthropicInputMessage): string => {\n if (message.role !== \"user\") {\n return \"\"\n }\n\n if (typeof message.content === \"string\") {\n return message.content\n }\n\n return message.content\n .filter((block): block is AnthropicTextBlock => block.type === \"text\")\n .map((block) =>\n block.text.startsWith(\"<system-reminder>\") ? \"\" : block.text,\n )\n .filter((text) => text.length > 0)\n .join(\"\\n\\n\")\n}\n\nconst isCompactMessage = (lastMessage: AnthropicInputMessage): boolean => {\n const text = getCompactCandidateText(lastMessage)\n if (!text) {\n return false\n }\n\n return (\n text.includes(compactTextOnlyGuard)\n && text.includes(compactSummaryPromptStart)\n && compactMessageSections.some((section) => text.includes(section))\n )\n}\n\nconst isCompactAutoContinueMessage = (\n lastMessage: AnthropicInputMessage,\n): boolean => {\n const text = getCompactCandidateText(lastMessage)\n return (\n Boolean(text)\n && compactAutoContinuePromptStarts.some((promptStart) =>\n text.startsWith(promptStart),\n )\n )\n}\n\nexport const getCompactType = (\n anthropicPayload: AnthropicMessagesPayload,\n): CompactType => {\n const lastMessage = anthropicPayload.messages.at(-1)\n if (lastMessage && isCompactMessage(lastMessage)) {\n return COMPACT_REQUEST\n }\n\n if (lastMessage && isCompactAutoContinueMessage(lastMessage)) {\n return COMPACT_AUTO_CONTINUE\n }\n\n const system = anthropicPayload.system\n if (typeof system === \"string\") {\n const hasCompactSystemPrompt = compactSystemPromptStarts.some(\n (promptStart) => system.startsWith(promptStart),\n )\n return hasCompactSystemPrompt ? COMPACT_REQUEST : 0\n }\n if (!Array.isArray(system)) return 0\n\n const hasCompactSystemPrompt = system.some(\n (msg) =>\n typeof msg.text === \"string\"\n && compactSystemPromptStarts.some((promptStart) =>\n msg.text.startsWith(promptStart),\n ),\n )\n if (hasCompactSystemPrompt) {\n return COMPACT_REQUEST\n }\n\n return 0\n}\n\n/**\n * True for Claude Code background security-monitor requests: no tools,\n * `stop_sequences: [\"</block>\"]`, and a system prompt starting with the\n * security-monitor prefix. These can be rerouted via `claudeAutoModel`.\n */\nexport const isClaudeAutoModelRequest = (\n payload: AnthropicMessagesPayload,\n): boolean => {\n if (payload.tools && payload.tools.length > 0) {\n return false\n }\n\n const stopSequences = payload.stop_sequences\n if (\n !Array.isArray(stopSequences)\n || stopSequences.length !== 1\n || stopSequences[0] !== claudeAutoModelStopSequence\n ) {\n return false\n }\n\n const system = payload.system\n if (typeof system === \"string\") {\n return system.startsWith(claudeAutoModelSystemPromptStart)\n }\n if (!Array.isArray(system)) {\n return false\n }\n\n return system.some(\n (block) =>\n typeof block.text === \"string\"\n && block.text.startsWith(claudeAutoModelSystemPromptStart),\n )\n}\n\nconst mergeContentWithText = (\n tr: AnthropicToolResultBlock,\n textBlock: AnthropicTextBlock,\n): AnthropicToolResultBlock => {\n if (typeof tr.content === \"string\") {\n return { ...tr, content: `${tr.content}\\n\\n${textBlock.text}` }\n }\n // Unable to merge, discard other text blocks, wait for the next round of re-request\n if (hasToolRef(tr)) {\n return tr\n }\n return {\n ...tr,\n content: [...tr.content, stripContentBlockCacheControl(textBlock)],\n }\n}\n\nconst mergeContentWithTexts = (\n tr: AnthropicToolResultBlock,\n textBlocks: Array<AnthropicTextBlock>,\n): AnthropicToolResultBlock => {\n if (typeof tr.content === \"string\") {\n const appendedTexts = textBlocks.map((tb) => tb.text).join(\"\\n\\n\")\n return { ...tr, content: `${tr.content}\\n\\n${appendedTexts}` }\n }\n // Unable to merge, discard other text blocks, wait for the next round of re-request\n if (hasToolRef(tr)) {\n return tr\n }\n return {\n ...tr,\n content: [...tr.content, ...textBlocks.map(stripContentBlockCacheControl)],\n }\n}\n\nconst mergeContentWithAttachments = (\n tr: AnthropicToolResultBlock,\n attachments: Array<AnthropicAttachmentBlock>,\n): AnthropicToolResultBlock => {\n const cleanAttachments = attachments.map(stripContentBlockCacheControl)\n\n if (typeof tr.content === \"string\") {\n return {\n ...tr,\n content: [{ type: \"text\", text: tr.content }, ...cleanAttachments],\n }\n }\n\n return {\n ...tr,\n content: [...tr.content, ...cleanAttachments],\n }\n}\n\nconst stripContentBlockCacheControl = <\n T extends AnthropicToolResultContentBlock,\n>(\n block: T,\n): T => {\n if (!Object.hasOwn(block, \"cache_control\")) {\n return block\n }\n\n const copy = { ...block }\n delete copy.cache_control\n return copy\n}\n\nconst isAttachmentBlock = (\n block: AnthropicUserContentBlock,\n): block is AnthropicAttachmentBlock => {\n return block.type === \"image\" || block.type === \"document\"\n}\n\nconst getMergeableToolResultIndices = (\n toolResults: Array<AnthropicToolResultBlock>,\n): Array<number> => {\n return toolResults.flatMap((block, index) =>\n block.is_error || hasToolRef(block) ? [] : [index],\n )\n}\n\nconst mergeAttachmentsIntoToolResults = (\n toolResults: Array<AnthropicToolResultBlock>,\n attachmentsByToolResultIndex: Map<number, Array<IndexedAttachment>>,\n): Array<AnthropicToolResultBlock> => {\n if (attachmentsByToolResultIndex.size === 0) {\n return toolResults\n }\n\n return toolResults.map((block, index) => {\n const matchedAttachments = attachmentsByToolResultIndex.get(index)\n if (!matchedAttachments) {\n return block\n }\n\n const orderedAttachments = [...matchedAttachments]\n .sort((left, right) => left.order - right.order)\n .map(({ attachment }) => attachment)\n\n return mergeContentWithAttachments(block, orderedAttachments)\n })\n}\n\nconst assignAttachmentsToToolResults = (\n target: Map<number, Array<IndexedAttachment>>,\n attachments: Array<IndexedAttachment>,\n options: {\n toolResultIndices: Array<number>\n fallbackToolResultIndices?: Array<number>\n },\n): void => {\n const { toolResultIndices } = options\n const fallbackToolResultIndices =\n options.fallbackToolResultIndices ?? toolResultIndices\n\n if (attachments.length === 0) {\n return\n }\n\n if (\n toolResultIndices.length > 0\n && toolResultIndices.length === attachments.length\n ) {\n for (const [index, toolResultIndex] of toolResultIndices.entries()) {\n const currentAttachments = target.get(toolResultIndex)\n if (currentAttachments) {\n currentAttachments.push(attachments[index])\n continue\n }\n\n target.set(toolResultIndex, [attachments[index]])\n }\n return\n }\n\n const lastToolResultIndex = fallbackToolResultIndices.at(-1)\n if (lastToolResultIndex === undefined) {\n return\n }\n\n const currentAttachments = target.get(lastToolResultIndex)\n if (currentAttachments) {\n currentAttachments.push(...attachments)\n return\n }\n\n target.set(lastToolResultIndex, [...attachments])\n}\n\nconst startsWithPdfFileRead = (\n toolResult: AnthropicToolResultBlock,\n): boolean => {\n if (typeof toolResult.content === \"string\") {\n return toolResult.content.startsWith(PDF_FILE_READ_PREFIX)\n }\n\n if (toolResult.content.some((block) => block.type === \"document\")) {\n return false\n }\n\n if (toolResult.content.length === 0) {\n return false\n }\n\n const firstBlock = toolResult.content[0]\n if (firstBlock.type !== \"text\") {\n return false\n }\n\n return firstBlock.text.startsWith(PDF_FILE_READ_PREFIX)\n}\n\nconst collectMergeableUserContent = (\n content: Array<AnthropicUserContentBlock>,\n): {\n toolResults: Array<AnthropicToolResultBlock>\n textBlocks: Array<AnthropicTextBlock>\n attachments: Array<IndexedAttachment>\n} | null => {\n const toolResults: Array<AnthropicToolResultBlock> = []\n const textBlocks: Array<AnthropicTextBlock> = []\n const attachments: Array<IndexedAttachment> = []\n\n for (const [order, block] of content.entries()) {\n if (block.type === \"tool_result\") {\n toolResults.push(block)\n continue\n }\n if (block.type === \"text\") {\n textBlocks.push(block)\n continue\n }\n if (isAttachmentBlock(block)) {\n attachments.push({ attachment: block, order })\n continue\n }\n\n return null\n }\n\n return {\n toolResults,\n textBlocks,\n attachments,\n }\n}\n\nconst mergeAttachmentsForToolResults = (\n toolResults: Array<AnthropicToolResultBlock>,\n attachments: Array<IndexedAttachment>,\n): Array<AnthropicToolResultBlock> => {\n if (attachments.length === 0) {\n return toolResults\n }\n\n const documentBlocks = attachments.filter(\n ({ attachment }) => attachment.type === \"document\",\n )\n const mergeableToolResultIndices = getMergeableToolResultIndices(toolResults)\n const pdfReadToolResultIndices = mergeableToolResultIndices.filter((index) =>\n startsWithPdfFileRead(toolResults[index]),\n )\n\n const attachmentsByToolResultIndex = new Map<\n number,\n Array<IndexedAttachment>\n >()\n let remainingAttachments = attachments\n let countMatchToolResultIndices = mergeableToolResultIndices\n\n // Match PDF read tool results and documents in order first, then leave any\n // unmatched documents to the generic fallback path below.\n if (documentBlocks.length > 0 && pdfReadToolResultIndices.length > 0) {\n const matchedDocumentCount = Math.min(\n pdfReadToolResultIndices.length,\n documentBlocks.length,\n )\n const matchedDocuments = documentBlocks.slice(0, matchedDocumentCount)\n const matchedDocumentOrders = new Set(\n matchedDocuments.map(({ order }) => order),\n )\n const matchedPdfToolResultIndices = pdfReadToolResultIndices.slice(\n 0,\n matchedDocumentCount,\n )\n const matchedPdfToolResultIndexSet = new Set(matchedPdfToolResultIndices)\n\n assignAttachmentsToToolResults(\n attachmentsByToolResultIndex,\n matchedDocuments,\n {\n toolResultIndices: matchedPdfToolResultIndices,\n },\n )\n countMatchToolResultIndices = mergeableToolResultIndices.filter(\n (index) => !matchedPdfToolResultIndexSet.has(index),\n )\n remainingAttachments = attachments.filter(\n ({ attachment, order }) =>\n attachment.type !== \"document\" || !matchedDocumentOrders.has(order),\n )\n }\n\n // Everything else keeps the existing count-match / last-tool-result fallback.\n assignAttachmentsToToolResults(\n attachmentsByToolResultIndex,\n remainingAttachments,\n {\n toolResultIndices: countMatchToolResultIndices,\n fallbackToolResultIndices: mergeableToolResultIndices,\n },\n )\n\n return mergeAttachmentsIntoToolResults(\n toolResults,\n attachmentsByToolResultIndex,\n )\n}\n\nconst mergeUserMessageContent = (\n content: Array<AnthropicUserContentBlock>,\n): Array<AnthropicUserContentBlock> | null => {\n const mergeableContent = collectMergeableUserContent(content)\n if (!mergeableContent) {\n return null\n }\n\n const { toolResults, textBlocks, attachments } = mergeableContent\n if (\n toolResults.length === 0\n || (textBlocks.length === 0 && attachments.length === 0)\n ) {\n return null\n }\n\n const mergedToolResults =\n textBlocks.length === 0 ?\n toolResults\n : mergeToolResult(toolResults, textBlocks)\n\n return mergeAttachmentsForToolResults(mergedToolResults, attachments)\n}\n\nconst mergeToolResult = (\n toolResults: Array<AnthropicToolResultBlock>,\n textBlocks: Array<AnthropicTextBlock>,\n): Array<AnthropicToolResultBlock> => {\n if (toolResults.length === textBlocks.length) {\n return toolResults.map((tr, i) => mergeContentWithText(tr, textBlocks[i]))\n }\n\n const lastIndex = toolResults.length - 1\n return toolResults.map((tr, i) =>\n i === lastIndex ? mergeContentWithTexts(tr, textBlocks) : tr,\n )\n}\n\nexport const stripToolReferenceTurnBoundary = (\n anthropicPayload: AnthropicMessagesPayload,\n): void => {\n for (const msg of anthropicPayload.messages) {\n if (msg.role !== \"user\" || !Array.isArray(msg.content)) continue\n\n const hasToolReference = msg.content.some(\n (block) => block.type === \"tool_result\" && hasToolRef(block),\n )\n if (!hasToolReference) continue\n\n msg.content = msg.content.filter(\n (block) =>\n block.type !== \"text\"\n || block.text.trim() !== TOOL_REFERENCE_TURN_BOUNDARY,\n )\n }\n}\n\nexport const mergeToolResultForClaude = (\n anthropicPayload: AnthropicMessagesPayload,\n options?: {\n skipLastMessage?: boolean\n },\n): void => {\n const lastMessageIndex = anthropicPayload.messages.length - 1\n\n for (const [index, msg] of anthropicPayload.messages.entries()) {\n if (options?.skipLastMessage && index === lastMessageIndex) continue\n\n if (msg.role !== \"user\" || !Array.isArray(msg.content)) continue\n\n const mergedContent = mergeUserMessageContent(msg.content)\n if (mergedContent) {\n msg.content = mergedContent\n }\n }\n}\n\n// align with vscode copilot claude agent tools\nexport const sanitizeIdeTools = (payload: AnthropicMessagesPayload): void => {\n if (!payload.tools || payload.tools.length === 0) {\n return\n }\n\n payload.tools = payload.tools.flatMap((tool) => {\n if (tool.name === IDE_GET_DIAGNOSTICS_TOOL) {\n return [\n {\n ...tool,\n description: IDE_GET_DIAGNOSTICS_DESCRIPTION,\n },\n ]\n }\n\n return [tool]\n })\n}\n\nconst hasToolRef = (block: AnthropicToolResultBlock) => {\n return (\n Array.isArray(block.content)\n && block.content.some((c) => c.type === \"tool_reference\")\n )\n}\n\n// Strip cache_control from system content blocks as the\n// Copilot Messages API does not support them (rejects extra fields like scope).\n// commit by nicktogo\nconst stripCacheControl = (payload: AnthropicMessagesPayload): void => {\n if (Array.isArray(payload.system)) {\n for (const block of payload.system) {\n const cacheControl = block.cache_control\n if (cacheControl && typeof cacheControl === \"object\") {\n const { scope, ...rest } = cacheControl\n block.cache_control = rest\n }\n }\n }\n}\n\n// Port top-level cache_control onto the last cacheable block as a lossless\n// polyfill, then drop the top-level field.\nconst applyTopLevelCacheControl = (payload: AnthropicMessagesPayload): void => {\n const topLevel = payload.cache_control\n if (!topLevel || typeof topLevel !== \"object\") {\n if (topLevel !== undefined) {\n delete payload.cache_control\n }\n return\n }\n\n delete payload.cache_control\n\n for (let m = payload.messages.length - 1; m >= 0; m--) {\n const message = payload.messages[m]\n\n if (typeof message.content === \"string\") {\n message.content = [\n {\n type: \"text\",\n text: message.content,\n cache_control: { ...topLevel },\n },\n ]\n return\n }\n\n if (!Array.isArray(message.content)) continue\n\n for (let b = message.content.length - 1; b >= 0; b--) {\n const block = message.content[b]\n if (\n block.type !== \"text\"\n && block.type !== \"image\"\n && block.type !== \"tool_use\"\n && block.type !== \"tool_result\"\n ) {\n continue\n }\n block.cache_control ??= { ...topLevel }\n return\n }\n }\n}\n\n// Strip per-tool eager_input_streaming.\nconst stripToolEagerInputStreaming = (\n payload: AnthropicMessagesPayload,\n): void => {\n if (!payload.tools || payload.tools.length === 0) return\n\n for (const tool of payload.tools) {\n const extended = tool as typeof tool & { eager_input_streaming?: unknown }\n if (\"eager_input_streaming\" in extended) {\n delete extended.eager_input_streaming\n }\n }\n}\n\n// Pre-request processing: filter thinking blocks for Claude models so only\n// valid thinking blocks are sent to the Copilot Messages API.\nconst filterAssistantThinkingBlocks = (\n payload: AnthropicMessagesPayload,\n): void => {\n for (const msg of payload.messages) {\n if (msg.role === \"assistant\" && Array.isArray(msg.content)) {\n msg.content = msg.content.filter((block) => {\n if (block.type !== \"thinking\") return true\n // Keep signature-only blocks (empty `thinking` text). On the Anthropic\n // Messages API it is the signature, not the summary text, that carries\n // reasoning continuity across turns, and Copilot's upstream frequently\n // returns thinking blocks with an empty summary. Requiring non-empty\n // text here silently drops those blocks — and their signatures — so the\n // reasoning chain breaks on exactly those turns. The `\"Thinking...\"`\n // placeholder is still excluded: it is a synthetic value this project\n // adds for clients that filter empty text, never real model output.\n return (\n block.thinking !== \"Thinking...\"\n && block.signature\n && !block.signature.includes(\"@\")\n )\n })\n }\n }\n}\n\nexport const prepareMessagesApiPayload = (\n payload: AnthropicMessagesPayload,\n selectedModel?: Model,\n): void => {\n stripCacheControl(payload)\n applyTopLevelCacheControl(payload)\n stripToolEagerInputStreaming(payload)\n filterAssistantThinkingBlocks(payload)\n\n const hasThinking = Boolean(payload.thinking)\n\n // https://platform.claude.com/docs/en/build-with-claude/extended-thinking#extended-thinking-with-tool-use\n // Using tool_choice: {\"type\": \"any\"} or tool_choice: {\"type\": \"tool\", \"name\": \"...\"} will result in an error because these options force tool use, which is incompatible with extended thinking.\n const toolChoice = payload.tool_choice\n const disableThink = toolChoice?.type === \"any\" || toolChoice?.type === \"tool\"\n\n if (selectedModel?.capabilities.supports.adaptive_thinking && !disableThink) {\n payload.thinking = {\n type: \"adaptive\",\n }\n // align with vscode copilot\n if (!hasThinking) {\n payload.thinking.display = \"summarized\"\n }\n if (shouldSummarizeThinkingDisplayForModel(payload.model)) {\n payload.thinking.display = \"summarized\"\n }\n let effort =\n payload.output_config?.effort ?? getReasoningEffortForModel(payload.model)\n if (effort === \"none\" || effort === \"minimal\") {\n effort = \"low\"\n }\n const reasoningEffort = selectedModel.capabilities.supports.reasoning_effort\n if (reasoningEffort && !reasoningEffort.includes(effort)) {\n effort = reasoningEffort.at(-1) as\n | \"low\"\n | \"medium\"\n | \"high\"\n | \"xhigh\"\n | \"max\"\n }\n payload.output_config = {\n effort: effort,\n }\n }\n\n const modelSupports = selectedModel?.capabilities.supports\n if (!modelSupports?.adaptive_thinking) {\n const reasoningEfforts = modelSupports?.reasoning_effort\n if (!reasoningEfforts || reasoningEfforts.length === 0) {\n if (payload.output_config?.effort) {\n delete payload.output_config.effort\n if (Object.keys(payload.output_config).length === 0) {\n delete payload.output_config\n }\n }\n }\n\n if (disableThink) {\n delete payload.thinking\n } else {\n const budgetTokens = modelSupports?.max_thinking_budget ?? 4096\n if (payload.thinking?.type === \"adaptive\") {\n payload.thinking = {\n type: \"enabled\",\n budget_tokens: budgetTokens - 1,\n }\n }\n }\n }\n}\n","import type { Context, Env } from \"hono\"\n\nimport { createHandlerLogger } from \"~/lib/logger\"\nimport { resolveProviderConfig } from \"~/lib/provider-resolver\"\nimport { createFallbackModel } from \"~/lib/provider-model\"\nimport { getTokenCount } from \"~/lib/tokenizer\"\nimport { type AnthropicMessagesPayload } from \"~/lib/types/anthropic\"\nimport { translateToOpenAI } from \"~/routes/messages/non-stream-translation\"\nimport { normalizeSystemMessages } from \"~/routes/messages/preprocess\"\n\nconst logger = createHandlerLogger(\"provider-count-tokens-handler\")\n\nexport async function handleProviderCountTokens(\n c: Context<Env, \"/:provider\">,\n): Promise<Response> {\n const provider = c.req.param(\"provider\")\n const payload = await c.req.json<AnthropicMessagesPayload>()\n return await handleProviderCountTokensForProvider(c, { payload, provider })\n}\n\nexport async function handleProviderCountTokensForProvider(\n c: Context,\n options: {\n payload: AnthropicMessagesPayload\n provider: string\n },\n): Promise<Response> {\n const { payload: anthropicPayload, provider } = options\n normalizeSystemMessages(anthropicPayload)\n const modelId = anthropicPayload.model.trim()\n\n const providerConfig = await resolveProviderConfig(provider)\n if (!providerConfig) {\n return c.json(\n {\n error: {\n message: `Provider '${provider}' not found or disabled`,\n type: \"invalid_request_error\",\n },\n },\n 404,\n )\n }\n\n const modelConfig = providerConfig.models?.[modelId]\n const translationOptions =\n (\n providerConfig.type === \"openai-compatible\"\n || providerConfig.type === \"openai-responses\"\n ) ?\n {\n supportPdf: modelConfig?.supportPdf,\n toolContentSupportType: modelConfig?.toolContentSupportType ?? [],\n }\n : undefined\n\n const openAIPayload = translateToOpenAI(anthropicPayload, translationOptions)\n\n const selectedModel = createFallbackModel(modelId)\n\n const tokenCount = await getTokenCount(openAIPayload, selectedModel)\n const finalTokenCount = tokenCount.input + tokenCount.output\n\n logger.debug(\"provider.count_tokens.success\", {\n provider,\n model: anthropicPayload.model,\n input_tokens: finalTokenCount,\n })\n\n return c.json({\n input_tokens: finalTokenCount,\n })\n}\n","import type { Context } from \"hono\"\n\nimport consola from \"consola\"\n\nimport {\n getAnthropicApiKey,\n getClaudeTokenMultiplier,\n resolveMappedModel,\n} from \"~/lib/config\"\nimport { createFallbackModel } from \"~/lib/provider-model\"\nimport { resolveConfiguredProviderModelAlias } from \"~/lib/provider-resolver\"\nimport { getTokenCount } from \"~/lib/tokenizer\"\nimport { handleProviderCountTokensForProvider } from \"~/routes/provider/messages/count-tokens-handler\"\nimport { type Model } from \"~/lib/types/models\"\n\nimport { findEndpointModel } from \"../../lib/models\"\nimport { type AnthropicMessagesPayload } from \"~/lib/types/anthropic\"\nimport { translateToOpenAI } from \"./non-stream-translation\"\nimport { normalizeSystemMessages } from \"./preprocess\"\n\nexport const resolveCountTokensModel = (\n modelId: string,\n findModel: (sdkModelId: string) => Model | undefined = findEndpointModel,\n): { fallback: boolean; model: Model } => {\n const selectedModel = findModel(modelId)\n if (selectedModel) {\n return {\n fallback: false,\n model: selectedModel,\n }\n }\n\n return {\n fallback: true,\n model: createFallbackModel(modelId.trim()),\n }\n}\n\n/**\n * Forwards token counting to Anthropic's real /v1/messages/count_tokens endpoint.\n * Returns the result on success, or null to fall through to estimation.\n */\nasync function countTokensViaAnthropic(\n c: Context,\n payload: AnthropicMessagesPayload,\n): Promise<Response | null> {\n if (!payload.model.startsWith(\"claude\")) return null\n\n const apiKey = getAnthropicApiKey()\n if (!apiKey) return null\n\n // Copilot uses dotted names (claude-opus-4.6) but Anthropic requires dashes (claude-opus-4-6)\n const model = payload.model.replaceAll(\".\", \"-\")\n\n const res = await fetch(\n \"https://api.anthropic.com/v1/messages/count_tokens\",\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n \"x-api-key\": apiKey,\n \"anthropic-version\": \"2023-06-01\",\n \"anthropic-beta\": \"token-counting-2024-11-01\",\n },\n body: JSON.stringify({ ...payload, model }),\n },\n )\n\n if (!res.ok) {\n consola.warn(\n \"Anthropic count_tokens failed:\",\n res.status,\n await res.text().catch(() => \"\"),\n \"- falling back to estimation\",\n )\n return null\n }\n\n const result = (await res.json()) as { input_tokens: number }\n consola.info(\"Token count (Anthropic API):\", result.input_tokens)\n return c.json(result)\n}\n\n/**\n * Handles token counting for Anthropic messages.\n *\n * When an Anthropic API key is available (via config or ANTHROPIC_API_KEY env var)\n * and the model is a Claude model, forwards to Anthropic's free /v1/messages/count_tokens\n * endpoint for accurate counts. Otherwise falls back to GPT tokenizer estimation.\n */\nexport async function handleCountTokens(c: Context) {\n const anthropicPayload = await c.req.json<AnthropicMessagesPayload>()\n anthropicPayload.model = resolveMappedModel(anthropicPayload.model)\n normalizeSystemMessages(anthropicPayload)\n\n const providerModelAlias = await resolveConfiguredProviderModelAlias(\n anthropicPayload.model,\n )\n if (providerModelAlias) {\n anthropicPayload.model = providerModelAlias.model\n return await handleProviderCountTokensForProvider(c, {\n payload: anthropicPayload,\n provider: providerModelAlias.provider,\n })\n }\n\n // Try Anthropic's real endpoint first (Claude models only)\n const anthropicResult = await countTokensViaAnthropic(c, anthropicPayload)\n if (anthropicResult) return anthropicResult\n\n // Fallback: GPT tokenizer estimation (also used for non-Claude models)\n const anthropicBeta = c.req.header(\"anthropic-beta\")\n\n const openAIPayload = translateToOpenAI(anthropicPayload)\n\n const requestedModel = anthropicPayload.model\n const resolve = resolveCountTokensModel(requestedModel)\n\n const selectedModel = resolve.model\n anthropicPayload.model = selectedModel.id\n\n if (resolve.fallback) {\n consola.warn(\n `Model '${requestedModel}' not found, using o200k_base fallback tokenizer`,\n )\n }\n\n const tokenCount = await getTokenCount(openAIPayload, selectedModel)\n\n if (anthropicPayload.tools && anthropicPayload.tools.length > 0) {\n let addToolSystemPromptCount = false\n if (anthropicBeta) {\n const toolsLength = anthropicPayload.tools.length\n addToolSystemPromptCount = !anthropicPayload.tools.some(\n (tool) =>\n tool.name.startsWith(\"mcp__\")\n || (tool.name === \"Skill\" && toolsLength === 1),\n )\n }\n if (addToolSystemPromptCount) {\n if (anthropicPayload.model.startsWith(\"claude\")) {\n // https://docs.anthropic.com/en/docs/agents-and-tools/tool-use/overview#pricing\n tokenCount.input = tokenCount.input + 346\n } else if (anthropicPayload.model.startsWith(\"grok\")) {\n tokenCount.input = tokenCount.input + 120\n }\n }\n }\n\n let finalTokenCount = tokenCount.input + tokenCount.output\n if (anthropicPayload.model.startsWith(\"claude\")) {\n finalTokenCount = Math.round(finalTokenCount * getClaudeTokenMultiplier())\n }\n\n consola.info(\"Token count:\", finalTokenCount)\n\n return c.json({\n input_tokens: finalTokenCount,\n })\n}\n","import consola from \"consola\"\n\nconst codexRateLimitScopes = [\"primary\", \"secondary\"] as const\n\ninterface CodexRateLimitWindow {\n reset_after_seconds: number\n reset_at: number\n used_percent: number\n window_minutes: number\n}\n\nexport const formatCodexRateLimitResetAt = (resetAt: number): string => {\n const date = new Date(resetAt * 1000)\n return Number.isNaN(date.getTime()) ? String(resetAt) : date.toLocaleString()\n}\n\nexport const logCodexRateLimitsEvent = (event: unknown): void => {\n if (!event || typeof event !== \"object\") {\n return\n }\n\n const eventRecord = event as Record<string, unknown>\n if (eventRecord.type !== \"codex.rate_limits\") {\n return\n }\n\n const rateLimits = eventRecord.rate_limits\n if (!rateLimits || typeof rateLimits !== \"object\") {\n return\n }\n\n const planType =\n typeof eventRecord.plan_type === \"string\" ? eventRecord.plan_type : null\n const rateLimitRecord = rateLimits as Record<string, unknown>\n const allowed =\n typeof rateLimitRecord.allowed === \"boolean\" ?\n rateLimitRecord.allowed\n : null\n const limitReached =\n typeof rateLimitRecord.limit_reached === \"boolean\" ?\n rateLimitRecord.limit_reached\n : null\n\n for (const scope of codexRateLimitScopes) {\n const window = rateLimitRecord[scope]\n if (!isCodexRateLimitWindow(window)) {\n continue\n }\n\n const summary: Array<string> = []\n if (allowed !== null) {\n summary.push(`allowed=${allowed}`)\n }\n if (limitReached !== null) {\n summary.push(`limit_reached=${limitReached}`)\n }\n summary.push(\n `used=${window.used_percent}%`,\n `reset_at=${formatCodexRateLimitResetAt(window.reset_at)}`,\n )\n\n const label =\n planType ?\n `Codex ${scope} rate limit (${planType})`\n : `Codex ${scope} rate limit`\n consola.log(`${label}: ${summary.join(\", \")}`)\n }\n}\n\nconst isCodexRateLimitWindow = (\n value: unknown,\n): value is CodexRateLimitWindow => {\n if (!value || typeof value !== \"object\") {\n return false\n }\n\n const record = value as Record<string, unknown>\n return (\n typeof record.reset_after_seconds === \"number\"\n && typeof record.reset_at === \"number\"\n && typeof record.used_percent === \"number\"\n && typeof record.window_minutes === \"number\"\n )\n}\n","import {\n type ChatCompletionChunk,\n type Choice,\n type Delta,\n} from \"~/lib/types/chat-completions\"\n\nimport {\n type AnthropicMessageDeltaEvent,\n type AnthropicStreamEventData,\n type AnthropicStreamState,\n} from \"~/lib/types/anthropic\"\nimport { mapOpenAIStopReasonToAnthropic } from \"./utils\"\n\nfunction isToolBlockOpen(state: AnthropicStreamState): boolean {\n if (!state.contentBlockOpen) {\n return false\n }\n // Check if the current block index corresponds to any known tool call\n return Object.values(state.toolCalls).some(\n (tc) => tc.anthropicBlockIndex === state.contentBlockIndex,\n )\n}\n\nexport function translateChunkToAnthropicEvents(\n chunk: ChatCompletionChunk,\n state: AnthropicStreamState,\n): Array<AnthropicStreamEventData> {\n const events: Array<AnthropicStreamEventData> = []\n\n if (chunk.choices.length === 0) {\n // Empty-choices chunks without usage are metadata-only events (e.g.\n // inference cost) that may arrive before the final usage chunk. Only\n // complete the pending message when usage is present; otherwise wait\n // for the usage chunk or the final stream flush.\n if (chunk.usage) {\n completePendingMessage(state, events, chunk)\n }\n return events\n }\n\n const choice = chunk.choices[0]\n const { delta } = choice\n\n handleMessageStart(state, events, chunk)\n\n handleThinkingText(delta, state, events)\n\n handleContent(delta, state, events)\n\n handleToolCalls(delta, state, events)\n\n handleFinish(choice, state, { events, chunk })\n\n return events\n}\n\nexport function flushPendingAnthropicStreamEvents(\n state: AnthropicStreamState,\n): Array<AnthropicStreamEventData> {\n const events: Array<AnthropicStreamEventData> = []\n completePendingMessage(state, events)\n return events\n}\n\nfunction completePendingMessage(\n state: AnthropicStreamState,\n events: Array<AnthropicStreamEventData>,\n chunk?: ChatCompletionChunk,\n): void {\n if (!state.pendingMessageDelta) {\n return\n }\n\n if (chunk?.usage) {\n state.pendingMessageDelta.usage = getAnthropicUsageFromOpenAIChunk(chunk)\n }\n\n events.push(state.pendingMessageDelta, {\n type: \"message_stop\",\n })\n state.pendingMessageDelta = undefined\n state.messageCompleted = true\n}\n\nfunction handleFinish(\n choice: Choice,\n state: AnthropicStreamState,\n context: {\n events: Array<AnthropicStreamEventData>\n chunk: ChatCompletionChunk\n },\n) {\n const { events, chunk } = context\n if (choice.finish_reason && choice.finish_reason.length > 0) {\n if (state.contentBlockOpen) {\n const toolBlockOpen = isToolBlockOpen(state)\n context.events.push({\n type: \"content_block_stop\",\n index: state.contentBlockIndex,\n })\n state.contentBlockOpen = false\n state.contentBlockIndex++\n if (!toolBlockOpen) {\n handleReasoningOpaque(choice.delta, events, state)\n }\n }\n\n flushDeferredContent(state, events)\n\n state.pendingMessageDelta = {\n type: \"message_delta\",\n delta: {\n stop_reason: mapOpenAIStopReasonToAnthropic(choice.finish_reason),\n stop_sequence: null,\n },\n usage: getAnthropicUsageFromOpenAIChunk(chunk),\n }\n if (chunk.usage) {\n completePendingMessage(state, events, chunk)\n }\n }\n}\n\nfunction getAnthropicUsageFromOpenAIChunk(\n chunk: ChatCompletionChunk,\n): NonNullable<AnthropicMessageDeltaEvent[\"usage\"]> {\n const { cachedTokens, cacheCreationTokens, inputTokens } =\n getOpenAIChunkUsageTokens(chunk)\n\n return {\n input_tokens: inputTokens,\n output_tokens: chunk.usage?.completion_tokens ?? 0,\n ...(chunk.usage?.prompt_tokens_details?.cache_creation_input_tokens\n !== undefined && {\n cache_creation_input_tokens: cacheCreationTokens,\n }),\n ...(chunk.usage?.prompt_tokens_details?.cached_tokens !== undefined && {\n cache_read_input_tokens: cachedTokens,\n }),\n }\n}\n\nfunction getOpenAIChunkUsageTokens(chunk: ChatCompletionChunk): {\n cacheCreationTokens: number\n cachedTokens: number\n inputTokens: number\n} {\n const promptTokens = chunk.usage?.prompt_tokens ?? 0\n const cachedTokens = chunk.usage?.prompt_tokens_details?.cached_tokens ?? 0\n const cacheCreationTokens =\n chunk.usage?.prompt_tokens_details?.cache_creation_input_tokens ?? 0\n\n return {\n cacheCreationTokens,\n cachedTokens,\n inputTokens: Math.max(0, promptTokens - cachedTokens - cacheCreationTokens),\n }\n}\n\nfunction handleToolCalls(\n delta: Delta,\n state: AnthropicStreamState,\n events: Array<AnthropicStreamEventData>,\n) {\n if (delta.tool_calls && delta.tool_calls.length > 0) {\n closeThinkingBlockIfOpen(state, events)\n\n handleReasoningOpaqueInToolCalls(state, events, delta)\n\n for (const toolCall of delta.tool_calls) {\n if (toolCall.id && toolCall.function?.name) {\n // New tool call starting.\n if (state.contentBlockOpen) {\n // Close any previously open block.\n events.push({\n type: \"content_block_stop\",\n index: state.contentBlockIndex,\n })\n state.contentBlockIndex++\n state.contentBlockOpen = false\n }\n\n const anthropicBlockIndex = state.contentBlockIndex\n state.toolCalls[toolCall.index] = {\n id: toolCall.id,\n name: toolCall.function.name,\n anthropicBlockIndex,\n }\n\n events.push({\n type: \"content_block_start\",\n index: anthropicBlockIndex,\n content_block: {\n type: \"tool_use\",\n id: toolCall.id,\n name: toolCall.function.name,\n input: {},\n },\n })\n state.contentBlockOpen = true\n }\n\n if (toolCall.function?.arguments) {\n const toolCallInfo = state.toolCalls[toolCall.index]\n // Tool call can still be empty\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (toolCallInfo) {\n events.push({\n type: \"content_block_delta\",\n index: toolCallInfo.anthropicBlockIndex,\n delta: {\n type: \"input_json_delta\",\n partial_json: toolCall.function.arguments,\n },\n })\n }\n }\n }\n }\n}\n\nfunction handleReasoningOpaqueInToolCalls(\n state: AnthropicStreamState,\n events: Array<AnthropicStreamEventData>,\n delta: Delta,\n) {\n if (state.contentBlockOpen && !isToolBlockOpen(state)) {\n events.push({\n type: \"content_block_stop\",\n index: state.contentBlockIndex,\n })\n state.contentBlockIndex++\n state.contentBlockOpen = false\n }\n handleReasoningOpaque(delta, events, state)\n}\n\nfunction handleContent(\n delta: Delta,\n state: AnthropicStreamState,\n events: Array<AnthropicStreamEventData>,\n) {\n if (delta.content && delta.content.length > 0) {\n closeThinkingBlockIfOpen(state, events)\n\n if (isToolBlockOpen(state) || hasToolCallDelta(delta)) {\n state.deferredContent = `${state.deferredContent ?? \"\"}${delta.content}`\n return\n }\n\n if (!state.contentBlockOpen) {\n events.push({\n type: \"content_block_start\",\n index: state.contentBlockIndex,\n content_block: {\n type: \"text\",\n text: \"\",\n },\n })\n state.contentBlockOpen = true\n }\n\n events.push({\n type: \"content_block_delta\",\n index: state.contentBlockIndex,\n delta: {\n type: \"text_delta\",\n text: delta.content,\n },\n })\n }\n\n // handle for claude model\n if (\n delta.content === \"\"\n && delta.reasoning_opaque\n && delta.reasoning_opaque.length > 0\n && state.thinkingBlockOpen\n ) {\n events.push(\n {\n type: \"content_block_delta\",\n index: state.contentBlockIndex,\n delta: {\n type: \"signature_delta\",\n signature: delta.reasoning_opaque,\n },\n },\n {\n type: \"content_block_stop\",\n index: state.contentBlockIndex,\n },\n )\n state.contentBlockIndex++\n state.thinkingBlockOpen = false\n }\n}\n\nfunction hasToolCallDelta(delta: Delta): boolean {\n return Boolean(delta.tool_calls && delta.tool_calls.length > 0)\n}\n\nfunction flushDeferredContent(\n state: AnthropicStreamState,\n events: Array<AnthropicStreamEventData>,\n): void {\n if (!state.deferredContent) {\n return\n }\n\n if (!state.contentBlockOpen) {\n events.push({\n type: \"content_block_start\",\n index: state.contentBlockIndex,\n content_block: {\n type: \"text\",\n text: \"\",\n },\n })\n state.contentBlockOpen = true\n }\n\n events.push(\n {\n type: \"content_block_delta\",\n index: state.contentBlockIndex,\n delta: {\n type: \"text_delta\",\n text: state.deferredContent,\n },\n },\n {\n type: \"content_block_stop\",\n index: state.contentBlockIndex,\n },\n )\n state.deferredContent = undefined\n state.contentBlockOpen = false\n state.contentBlockIndex++\n}\n\nfunction handleMessageStart(\n state: AnthropicStreamState,\n events: Array<AnthropicStreamEventData>,\n chunk: ChatCompletionChunk,\n) {\n if (!state.messageStartSent) {\n const { cachedTokens, cacheCreationTokens, inputTokens } =\n getOpenAIChunkUsageTokens(chunk)\n\n events.push({\n type: \"message_start\",\n message: {\n id: chunk.id,\n type: \"message\",\n role: \"assistant\",\n content: [],\n model: chunk.model,\n stop_reason: null,\n stop_sequence: null,\n usage: {\n input_tokens: inputTokens,\n output_tokens: 0, // Will be updated in message_delta when finished\n ...(chunk.usage?.prompt_tokens_details?.cache_creation_input_tokens\n !== undefined && {\n cache_creation_input_tokens: cacheCreationTokens,\n }),\n ...(chunk.usage?.prompt_tokens_details?.cached_tokens\n !== undefined && {\n cache_read_input_tokens: cachedTokens,\n }),\n },\n },\n })\n state.messageStartSent = true\n }\n}\n\nfunction handleReasoningOpaque(\n delta: Delta,\n events: Array<AnthropicStreamEventData>,\n state: AnthropicStreamState,\n) {\n if (delta.reasoning_opaque && delta.reasoning_opaque.length > 0) {\n events.push(\n {\n type: \"content_block_start\",\n index: state.contentBlockIndex,\n content_block: {\n type: \"thinking\",\n thinking: \"\",\n },\n },\n {\n type: \"content_block_delta\",\n index: state.contentBlockIndex,\n delta: {\n type: \"thinking_delta\",\n thinking: \"\",\n },\n },\n {\n type: \"content_block_delta\",\n index: state.contentBlockIndex,\n delta: {\n type: \"signature_delta\",\n signature: delta.reasoning_opaque,\n },\n },\n {\n type: \"content_block_stop\",\n index: state.contentBlockIndex,\n },\n )\n state.contentBlockIndex++\n }\n}\n\nfunction handleThinkingText(\n delta: Delta,\n state: AnthropicStreamState,\n events: Array<AnthropicStreamEventData>,\n) {\n const reasoningText =\n delta.reasoning_text ?? delta.reasoning_content ?? delta.reasoning\n if (reasoningText && reasoningText.length > 0) {\n // compatible with copilot API returning content->reasoning_text->reasoning_opaque in different deltas\n // this is an extremely abnormal situation, probably a server-side bug\n // only occurs in the claude model, with a very low probability of occurrence\n if (state.contentBlockOpen) {\n delta.content = reasoningText\n delta.reasoning_text = undefined\n delta.reasoning_content = undefined\n delta.reasoning = undefined\n return\n }\n\n if (!state.thinkingBlockOpen) {\n events.push({\n type: \"content_block_start\",\n index: state.contentBlockIndex,\n content_block: {\n type: \"thinking\",\n thinking: \"\",\n },\n })\n state.thinkingBlockOpen = true\n }\n\n events.push({\n type: \"content_block_delta\",\n index: state.contentBlockIndex,\n delta: {\n type: \"thinking_delta\",\n thinking: reasoningText,\n },\n })\n }\n}\n\nfunction closeThinkingBlockIfOpen(\n state: AnthropicStreamState,\n events: Array<AnthropicStreamEventData>,\n): void {\n if (state.thinkingBlockOpen) {\n events.push(\n {\n type: \"content_block_delta\",\n index: state.contentBlockIndex,\n delta: {\n type: \"signature_delta\",\n signature: \"\",\n },\n },\n {\n type: \"content_block_stop\",\n index: state.contentBlockIndex,\n },\n )\n state.contentBlockIndex++\n state.thinkingBlockOpen = false\n }\n}\n\nexport function translateErrorToAnthropicErrorEvent(): AnthropicStreamEventData {\n return {\n type: \"error\",\n error: {\n type: \"api_error\",\n message:\n \"An unexpected error occurred during streaming, retry your request.\",\n },\n }\n}\n","import consola from \"consola\"\n\nimport {\n BRIDGE_TOOL_SEARCH_NAME,\n formatToolSearchBridgeArguments,\n isBridgeToolSearchName,\n isDeferredToolName,\n listDeferredToolNames,\n normalizeToolSearchBridgeArguments,\n parseMcpToolSearchSentinel,\n selectDeferredToolsByNames,\n shouldEnableResponsesToolSearch,\n} from \"~/lib/tool-search\"\nimport { HTTPError } from \"~/lib/error\"\nimport {\n getExtraPromptForModel,\n getReasoningEffortForModel,\n isGpt56OrAbove,\n} from \"~/lib/config\"\nimport { requestContext } from \"~/lib/request-context\"\nimport { parseUserIdMetadata } from \"~/lib/utils\"\nimport {\n type ResponsesPayload,\n type ResponseInputCompaction,\n type ResponseInputContent,\n type ResponseInputFile,\n type ResponseInputImage,\n type ResponseInputItem,\n type ResponseInputMessage,\n type ResponseInputReasoning,\n type ResponseInputText,\n type ResponsesResult,\n type ResponseOutputContentBlock,\n type ResponseOutputCompaction,\n type ResponseOutputFunctionCall,\n type ResponseOutputToolSearchCall,\n type ResponseOutputItem,\n type ResponseOutputReasoning,\n type ResponseReasoningBlock,\n type ResponseOutputRefusal,\n type ResponseOutputText,\n type ResponseFunctionToolCallItem,\n type ResponseFunctionCallOutputItem,\n type ResponseToolSearchCallItem,\n type ResponseToolSearchOutputItem,\n type Tool,\n type ToolChoiceFunction,\n type ToolChoiceOptions,\n} from \"~/lib/types/responses\"\n\nimport {\n type AnthropicAssistantContentBlock,\n type AnthropicAssistantMessage,\n type AnthropicDocumentBlock,\n type AnthropicResponse,\n type AnthropicImageBlock,\n type AnthropicInputMessage,\n type AnthropicMessagesPayload,\n type AnthropicSystemMessage,\n type AnthropicTextBlock,\n type AnthropicThinkingBlock,\n type AnthropicTool,\n type AnthropicToolResultContentBlock,\n type AnthropicToolResultBlock,\n type AnthropicToolUseBlock,\n type AnthropicUserContentBlock,\n type AnthropicUserMessage,\n} from \"~/lib/types/anthropic\"\nimport { normalizeToolSchema, THINKING_TEXT } from \"./non-stream-translation\"\n\nconst MESSAGE_TYPE = \"message\"\nconst COMPACTION_SIGNATURE_PREFIX = \"cm1#\"\nconst COMPACTION_SIGNATURE_SEPARATOR = \"@\"\n\nexport { THINKING_TEXT }\nexport const REASONING_SUMMARY_SEPARATOR = \"\\u00A0\\n\\n\"\nconst REASONING_SUMMARY_SEPARATOR_PATTERN = /\\u00a0\\n\\n|\\u2063\\n\\n/\n\nconst resolveReasoningEffort = (payload: AnthropicMessagesPayload) =>\n payload.output_config?.effort ?? getReasoningEffortForModel(payload.model)\n\nconst buildPromptCacheKey = (\n basePromptCacheKey: string | null,\n subagentAgentId?: string | null,\n): string | null => {\n if (!basePromptCacheKey) {\n return null\n }\n\n const normalizedSubagentAgentId = subagentAgentId?.trim() || null\n if (!normalizedSubagentAgentId) {\n return basePromptCacheKey\n }\n\n return `${basePromptCacheKey}:agent:${normalizedSubagentAgentId}`\n}\n\nexport const translateAnthropicMessagesToResponsesPayload = (\n payload: AnthropicMessagesPayload,\n subagentAgentId?: string | null,\n): ResponsesPayload => {\n const input: Array<ResponseInputItem> = []\n const applyPhase = shouldApplyPhase(payload.model)\n const toolSearchEnabled = shouldEnableResponsesToolSearch({\n model: payload.model,\n tools: payload.tools,\n })\n const translationState: TranslationState = {\n originalTools: payload.tools ?? [],\n toolSearchEnabled,\n toolUseNameById: new Map(),\n }\n\n for (const message of payload.messages) {\n input.push(\n ...translateMessage(message, payload.model, applyPhase, translationState),\n )\n }\n\n const hasOriginalTools =\n Array.isArray(payload.tools) && payload.tools.length > 0\n const translatedTools = convertAnthropicTools(\n payload.tools,\n toolSearchEnabled,\n )\n const toolChoice = convertAnthropicToolChoice(\n payload.tool_choice,\n toolSearchEnabled,\n )\n\n // Remove safetyIdentifier to align with vscode copilot\n const { sessionId: metadataPromptCacheKey } = parseUserIdMetadata(\n payload.metadata?.user_id,\n )\n\n const requestStore = requestContext.getStore()\n const sessionAffinity = requestStore?.sessionAffinity?.trim() || null\n const basePromptCacheKey = metadataPromptCacheKey ?? sessionAffinity\n const promptCacheKey = buildPromptCacheKey(\n basePromptCacheKey,\n subagentAgentId,\n )\n\n const responsesPayload: ResponsesPayload = {\n model: payload.model,\n input,\n instructions: translateSystemPrompt(payload.system, payload.model),\n temperature: 1, // reasoning high temperature fixed to 1\n top_p: payload.top_p ?? null,\n max_output_tokens: Math.max(payload.max_tokens, 12800),\n tools: translatedTools,\n tool_choice: toolChoice,\n metadata: payload.metadata ? { ...payload.metadata } : null,\n //prompt_cache_retention: \"24h\", not work in gpt-5.4\n stream: payload.stream ?? null,\n store: false,\n parallel_tool_calls: true,\n reasoning: {\n effort: resolveReasoningEffort(payload),\n summary: \"auto\",\n context: isSupportAllTurns(payload) ? \"all_turns\" : \"auto\",\n },\n include: [\"reasoning.encrypted_content\"],\n }\n\n if (hasOriginalTools) {\n responsesPayload.prompt_cache_key = promptCacheKey\n }\n\n return responsesPayload\n}\n\ninterface TranslationState {\n originalTools: Array<AnthropicTool>\n toolSearchEnabled: boolean\n toolUseNameById: Map<string, string>\n}\n\ntype CompactionCarrier = {\n id: string\n encrypted_content: string\n}\n\nexport const encodeCompactionCarrierSignature = (\n compaction: CompactionCarrier,\n): string => {\n return `${COMPACTION_SIGNATURE_PREFIX}${compaction.encrypted_content}${COMPACTION_SIGNATURE_SEPARATOR}${compaction.id}`\n}\n\nexport const decodeCompactionCarrierSignature = (\n signature: string,\n): CompactionCarrier | undefined => {\n if (signature.startsWith(COMPACTION_SIGNATURE_PREFIX)) {\n const raw = signature.slice(COMPACTION_SIGNATURE_PREFIX.length)\n const separatorIndex = raw.indexOf(COMPACTION_SIGNATURE_SEPARATOR)\n\n if (separatorIndex <= 0 || separatorIndex === raw.length - 1) {\n return undefined\n }\n\n const encrypted_content = raw.slice(0, separatorIndex)\n const id = raw.slice(separatorIndex + 1)\n\n if (!encrypted_content) {\n return undefined\n }\n\n return {\n id,\n encrypted_content,\n }\n }\n\n return undefined\n}\n\nconst translateMessage = (\n message: AnthropicInputMessage,\n model: string,\n applyPhase: boolean,\n state: TranslationState,\n): Array<ResponseInputItem> => {\n if (message.role === \"user\") {\n return translateUserMessage(message, state)\n }\n\n if (message.role === \"system\") {\n return translateSystemMessage(message)\n }\n\n return translateAssistantMessage(message, model, applyPhase, state)\n}\n\nconst translateSystemMessage = (\n message: AnthropicSystemMessage,\n): Array<ResponseInputItem> => {\n if (typeof message.content === \"string\") {\n return [createMessage(\"developer\", message.content)]\n }\n\n const content = message.content.map((block) => createTextContent(block.text))\n return content.length > 0 ? [createMessage(\"developer\", content)] : []\n}\n\nconst translateUserMessage = (\n message: AnthropicUserMessage,\n state: TranslationState,\n): Array<ResponseInputItem> => {\n if (typeof message.content === \"string\") {\n return [createMessage(\"user\", message.content)]\n }\n\n if (!Array.isArray(message.content)) {\n return []\n }\n\n const items: Array<ResponseInputItem> = []\n const pendingContent: Array<ResponseInputContent> = []\n\n for (const block of message.content) {\n if (block.type === \"tool_result\") {\n flushPendingContent(pendingContent, items, { role: \"user\" })\n items.push(createToolCallOutput(block, state))\n continue\n }\n\n const converted = translateUserContentBlock(block)\n if (converted.length > 0) {\n pendingContent.push(...converted)\n }\n }\n\n flushPendingContent(pendingContent, items, { role: \"user\" })\n\n return items\n}\n\nconst translateAssistantMessage = (\n message: AnthropicAssistantMessage,\n model: string,\n applyPhase: boolean,\n state: TranslationState,\n): Array<ResponseInputItem> => {\n const assistantPhase = resolveAssistantPhase(\n model,\n message.content,\n applyPhase,\n )\n\n if (typeof message.content === \"string\") {\n return [createMessage(\"assistant\", message.content, assistantPhase)]\n }\n\n if (!Array.isArray(message.content)) {\n return []\n }\n\n const items: Array<ResponseInputItem> = []\n const pendingContent: Array<ResponseInputContent> = []\n\n for (const block of message.content) {\n if (block.type === \"tool_use\") {\n state.toolUseNameById.set(block.id, block.name)\n flushPendingContent(pendingContent, items, {\n role: \"assistant\",\n phase: assistantPhase,\n })\n items.push(createToolCall(block, state))\n continue\n }\n\n if (block.type === \"thinking\" && block.signature) {\n const compactionContent = createCompactionContent(block)\n if (compactionContent) {\n flushPendingContent(pendingContent, items, {\n role: \"assistant\",\n phase: assistantPhase,\n })\n items.push(compactionContent)\n continue\n }\n\n if (block.signature.includes(\"@\")) {\n flushPendingContent(pendingContent, items, {\n role: \"assistant\",\n phase: assistantPhase,\n })\n items.push(createReasoningContent(block))\n continue\n }\n }\n\n const converted = translateAssistantContentBlock(block)\n if (converted) {\n pendingContent.push(converted)\n }\n }\n\n flushPendingContent(pendingContent, items, {\n role: \"assistant\",\n phase: assistantPhase,\n })\n\n return items\n}\n\nconst translateUserContentBlock = (\n block: AnthropicUserContentBlock,\n): Array<ResponseInputContent> => {\n switch (block.type) {\n case \"text\": {\n return [createTextContent(block.text)]\n }\n case \"image\": {\n return [createImageContent(block)]\n }\n case \"document\": {\n return [createFileContent(block)]\n }\n default: {\n return []\n }\n }\n}\n\nconst translateAssistantContentBlock = (\n block: AnthropicAssistantContentBlock,\n): ResponseInputContent | undefined => {\n switch (block.type) {\n case \"text\": {\n return createOutPutTextContent(block.text)\n }\n default: {\n return undefined\n }\n }\n}\n\nconst flushPendingContent = (\n pendingContent: Array<ResponseInputContent>,\n target: Array<ResponseInputItem>,\n message: Pick<ResponseInputMessage, \"role\" | \"phase\">,\n) => {\n if (pendingContent.length === 0) {\n return\n }\n\n const messageContent = [...pendingContent]\n\n target.push(createMessage(message.role, messageContent, message.phase))\n pendingContent.length = 0\n}\n\nconst createMessage = (\n role: ResponseInputMessage[\"role\"],\n content: string | Array<ResponseInputContent>,\n phase?: ResponseInputMessage[\"phase\"],\n): ResponseInputMessage => ({\n type: MESSAGE_TYPE,\n role,\n content,\n ...(role === \"assistant\" && phase ? { phase } : {}),\n})\n\nconst resolveAssistantPhase = (\n _model: string,\n content: AnthropicAssistantMessage[\"content\"],\n applyPhase: boolean,\n): ResponseInputMessage[\"phase\"] | undefined => {\n if (!applyPhase) {\n return undefined\n }\n\n if (typeof content === \"string\") {\n return \"final_answer\"\n }\n\n if (!Array.isArray(content)) {\n return undefined\n }\n\n const hasText = content.some((block) => block.type === \"text\")\n if (!hasText) {\n return undefined\n }\n\n const hasToolUse = content.some((block) => block.type === \"tool_use\")\n return hasToolUse ? \"commentary\" : \"final_answer\"\n}\n\nconst shouldApplyPhase = (_model: string): boolean => {\n return true\n}\n\nconst createTextContent = (text: string): ResponseInputText => ({\n type: \"input_text\",\n text,\n})\n\nconst createOutPutTextContent = (text: string): ResponseInputText => ({\n type: \"output_text\",\n text,\n})\n\nconst createImageContent = (\n block: AnthropicImageBlock,\n): ResponseInputImage => ({\n type: \"input_image\",\n image_url: `data:${block.source.media_type};base64,${block.source.data}`,\n detail: \"auto\",\n})\n\nconst createFileContent = (\n block: AnthropicDocumentBlock,\n): ResponseInputFile => ({\n type: \"input_file\",\n file_data: `data:${block.source.media_type};base64,${block.source.data}`,\n filename: block.title ?? \"document.pdf\",\n})\n\nconst createReasoningContent = (\n block: AnthropicThinkingBlock,\n): ResponseInputReasoning => {\n // align with vscode-copilot-chat extractThinkingData, should add id\n // https://github.com/microsoft/vscode/blob/1.128.0/extensions/copilot/src/platform/endpoint/node/responsesApi.ts#L651\n const { encryptedContent, id } = parseReasoningSignature(block.signature)\n const thinking = block.thinking === THINKING_TEXT ? \"\" : block.thinking\n\n return {\n id,\n type: \"reasoning\",\n summary: createReasoningSummary(thinking),\n encrypted_content: encryptedContent,\n }\n}\n\nconst createReasoningSummary = (\n thinking: string,\n): ResponseInputReasoning[\"summary\"] => {\n if (thinking.length === 0) {\n return []\n }\n\n if (!REASONING_SUMMARY_SEPARATOR_PATTERN.test(thinking)) {\n return [{ type: \"summary_text\", text: thinking }]\n }\n\n return thinking.split(REASONING_SUMMARY_SEPARATOR_PATTERN).map((text) => ({\n type: \"summary_text\",\n text,\n }))\n}\n\nconst createCompactionContent = (\n block: AnthropicThinkingBlock,\n): ResponseInputCompaction | undefined => {\n const compaction = decodeCompactionCarrierSignature(block.signature)\n if (!compaction) {\n return undefined\n }\n\n return {\n id: compaction.id,\n type: \"compaction\",\n encrypted_content: compaction.encrypted_content,\n }\n}\n\nconst parseReasoningSignature = (\n signature: string,\n): { encryptedContent: string; id: string } => {\n const splitIndex = signature.lastIndexOf(\"@\")\n\n if (splitIndex <= 0 || splitIndex === signature.length - 1) {\n return { encryptedContent: signature, id: \"\" }\n }\n\n return {\n encryptedContent: signature.slice(0, splitIndex),\n id: signature.slice(splitIndex + 1),\n }\n}\n\nconst createFunctionToolCall = (\n block: AnthropicToolUseBlock,\n state: TranslationState,\n): ResponseFunctionToolCallItem => ({\n type: \"function_call\",\n call_id: block.id,\n name: block.name,\n arguments: JSON.stringify(block.input),\n status: \"completed\",\n ...(state.toolSearchEnabled && isDeferredToolName(block.name) ?\n { namespace: block.name }\n : {}),\n})\n\nconst createToolSearchCall = (\n block: AnthropicToolUseBlock,\n): ResponseToolSearchCallItem => ({\n type: \"tool_search_call\",\n call_id: block.id,\n arguments: normalizeToolSearchBridgeArguments(block.input),\n execution: \"client\",\n status: \"completed\",\n})\n\nconst createToolCall = (\n block: AnthropicToolUseBlock,\n state: TranslationState,\n): ResponseFunctionToolCallItem | ResponseToolSearchCallItem => {\n if (state.toolSearchEnabled && isBridgeToolSearchName(block.name)) {\n return createToolSearchCall(block)\n }\n\n return createFunctionToolCall(block, state)\n}\n\nconst createFunctionCallOutput = (\n block: AnthropicToolResultBlock,\n): ResponseFunctionCallOutputItem => ({\n type: \"function_call_output\",\n call_id: block.tool_use_id,\n output: convertToolResultContent(block.content),\n status: block.is_error ? \"incomplete\" : \"completed\",\n})\n\nconst createToolCallOutput = (\n block: AnthropicToolResultBlock,\n state: TranslationState,\n): ResponseFunctionCallOutputItem | ResponseToolSearchOutputItem => {\n const toolUseName = state.toolUseNameById.get(block.tool_use_id)\n if (state.toolSearchEnabled && isBridgeToolSearchName(toolUseName ?? \"\")) {\n return createToolSearchOutput(block, state.originalTools)\n }\n\n return createFunctionCallOutput(block)\n}\n\nconst createToolSearchOutput = (\n block: AnthropicToolResultBlock,\n originalTools: Array<AnthropicTool>,\n): ResponseToolSearchOutputItem => {\n const referencedToolNames = resolveToolSearchReferencedToolNames(\n block.content,\n originalTools,\n )\n\n return {\n type: \"tool_search_output\",\n call_id: block.tool_use_id,\n tools: referencedToolNames.map((toolName) =>\n convertDeferredToolToNamespace(\n resolveDeferredTool(toolName, originalTools),\n ),\n ),\n execution: \"client\",\n status: block.is_error ? \"incomplete\" : \"completed\",\n }\n}\n\nconst resolveToolSearchReferencedToolNames = (\n content: string | Array<AnthropicToolResultContentBlock>,\n originalTools: Array<AnthropicTool>,\n): Array<string> => {\n const explicitReferences = extractToolReferenceNames(content)\n if (explicitReferences.length > 0) {\n return uniqueToolNames(explicitReferences)\n }\n\n const sentinel = extractMcpToolSearchSentinel(content)\n if (sentinel) {\n return selectDeferredToolsByNames(sentinel.names, originalTools).map(\n (tool) => tool.name,\n )\n }\n\n return []\n}\n\nconst extractToolReferenceNames = (\n content: string | Array<AnthropicToolResultContentBlock>,\n): Array<string> => {\n if (!Array.isArray(content)) {\n return []\n }\n\n return content.flatMap((block) =>\n block.type === \"tool_reference\" ? [block.tool_name] : [],\n )\n}\n\nconst extractMcpToolSearchSentinel = (\n content: string | Array<AnthropicToolResultContentBlock>,\n) => {\n if (typeof content === \"string\") {\n return parseMcpToolSearchSentinel(content)\n }\n\n for (const block of content) {\n if (block.type !== \"text\") {\n continue\n }\n\n const sentinel = parseMcpToolSearchSentinel(block.text)\n if (sentinel) {\n return sentinel\n }\n }\n\n return null\n}\n\nconst resolveDeferredTool = (\n toolName: string,\n originalTools: Array<AnthropicTool>,\n): AnthropicTool => {\n const tool = originalTools.find((candidate) => candidate.name === toolName)\n if (tool && isDeferredToolName(tool.name)) {\n return tool\n }\n\n throw createInvalidRequestError(\n `Tool reference '${toolName}' has no corresponding deferred tool definition`,\n )\n}\n\nconst uniqueToolNames = (toolNames: Array<string>): Array<string> => [\n ...new Set(toolNames),\n]\n\nconst createInvalidRequestError = (message: string): HTTPError =>\n new HTTPError(\n message,\n new Response(\n JSON.stringify({\n error: {\n message,\n type: \"invalid_request_error\",\n },\n }),\n {\n status: 400,\n headers: { \"content-type\": \"application/json\" },\n },\n ),\n )\n\nconst translateSystemPrompt = (\n system: string | Array<AnthropicTextBlock> | undefined,\n model: string,\n): string | null => {\n if (!system) {\n return null\n }\n\n const extraPrompt = getExtraPromptForModel(model)\n\n if (typeof system === \"string\") {\n return system + extraPrompt\n }\n\n const text = system\n .map((block, index) => {\n if (index === 0) {\n return block.text + \"\\n\\n\" + extraPrompt + \"\\n\\n\"\n }\n return block.text\n })\n .join(\" \")\n return text.length > 0 ? text : null\n}\n\nconst convertAnthropicTools = (\n tools: Array<AnthropicTool> | undefined,\n toolSearchEnabled: boolean,\n): Array<Tool> | null => {\n if (!tools || tools.length === 0) {\n return null\n }\n\n const converted: Array<Tool> = []\n let addedToolSearch = false\n const searchableToolNames =\n toolSearchEnabled ? listDeferredToolNames(tools) : []\n\n for (const tool of tools) {\n if (isBridgeToolSearchName(tool.name)) {\n if (toolSearchEnabled && !addedToolSearch) {\n converted.push(createResponsesToolSearchDefinition(searchableToolNames))\n addedToolSearch = true\n }\n continue\n }\n\n if (toolSearchEnabled && isDeferredToolName(tool.name)) {\n converted.push(convertDeferredToolToNamespace(tool))\n continue\n }\n\n converted.push(convertToolToFunction(tool))\n }\n\n return converted\n}\n\nconst createResponsesToolSearchDefinition = (\n searchableToolNames: Array<string>,\n): Tool => ({\n type: \"tool_search\",\n execution: \"client\",\n description:\n \"Load deferred tools by exact name before using them. Return only the searchable tool names you need for the next step.\",\n parameters: {\n type: \"object\",\n properties: {\n names: {\n type: \"array\",\n description: \"Exact deferred tool names to load.\",\n items: {\n type: \"string\",\n enum: searchableToolNames,\n },\n minItems: 1,\n },\n },\n required: [\"names\"],\n additionalProperties: false,\n },\n})\n\nconst convertToolToFunction = (tool: AnthropicTool): Tool => ({\n type: \"function\",\n name: tool.name,\n parameters: normalizeToolSchema(tool.input_schema),\n strict: tool.strict ?? false,\n ...(tool.description ? { description: tool.description } : {}),\n})\n\nconst convertDeferredToolToNamespace = (tool: AnthropicTool): Tool => ({\n type: \"namespace\",\n name: tool.name,\n ...(tool.description ? { description: tool.description } : {}),\n tools: [\n {\n type: \"function\",\n name: tool.name,\n parameters: normalizeToolSchema(tool.input_schema),\n strict: tool.strict ?? false,\n defer_loading: true,\n ...(tool.description ? { description: tool.description } : {}),\n },\n ],\n})\n\nconst convertAnthropicToolChoice = (\n choice: AnthropicMessagesPayload[\"tool_choice\"],\n toolSearchEnabled: boolean,\n): ToolChoiceOptions | ToolChoiceFunction => {\n if (!choice) {\n return \"auto\"\n }\n\n switch (choice.type) {\n case \"auto\": {\n return \"auto\"\n }\n case \"any\": {\n return \"required\"\n }\n case \"tool\": {\n if (\n toolSearchEnabled\n && choice.name\n && isBridgeToolSearchName(choice.name)\n ) {\n return \"auto\"\n }\n return choice.name ? { type: \"function\", name: choice.name } : \"auto\"\n }\n case \"none\": {\n return \"none\"\n }\n default: {\n return \"auto\"\n }\n }\n}\n\ninterface ResponsesToAnthropicOptions {\n toolSearchName?: string\n hasToolCall?: boolean\n}\n\nexport const translateResponsesResultToAnthropic = (\n response: ResponsesResult,\n options?: ResponsesToAnthropicOptions,\n): AnthropicResponse => {\n const contentBlocks = mapOutputToAnthropicContent(response.output, options)\n const usage = mapResponsesUsage(response)\n let anthropicContent = fallbackContentBlocks(response.output_text)\n if (contentBlocks.length > 0) {\n anthropicContent = contentBlocks\n }\n\n const stopReason = mapResponsesStopReason(response, options)\n\n return {\n id: response.id,\n type: \"message\",\n role: \"assistant\",\n content: anthropicContent,\n model: response.model,\n stop_reason: stopReason,\n stop_sequence: null,\n usage,\n }\n}\n\nconst mapOutputToAnthropicContent = (\n output: Array<ResponseOutputItem>,\n options?: ResponsesToAnthropicOptions,\n): Array<AnthropicAssistantContentBlock> => {\n const contentBlocks: Array<AnthropicAssistantContentBlock> = []\n if (!output) {\n output = []\n }\n for (const item of output) {\n switch (item.type) {\n case \"reasoning\": {\n const thinkingText = extractReasoningText(item)\n if (thinkingText.length > 0 || (item.id && item.encrypted_content)) {\n contentBlocks.push({\n type: \"thinking\",\n thinking: thinkingText,\n signature: (item.encrypted_content ?? \"\") + \"@\" + item.id,\n })\n }\n break\n }\n case \"function_call\": {\n const toolUseBlock = createToolUseContentBlock(item)\n if (toolUseBlock) {\n contentBlocks.push(toolUseBlock)\n }\n break\n }\n case \"tool_search_call\": {\n const toolUseBlock = createToolSearchUseContentBlock(\n item,\n options?.toolSearchName,\n )\n if (toolUseBlock) {\n contentBlocks.push(toolUseBlock)\n }\n break\n }\n case \"tool_search_output\": {\n break\n }\n case \"message\": {\n const combinedText = combineMessageTextContent(item.content)\n if (combinedText.length > 0) {\n contentBlocks.push({ type: \"text\", text: combinedText })\n }\n break\n }\n case \"compaction\": {\n const compactionBlock = createCompactionThinkingBlock(item)\n if (compactionBlock) {\n contentBlocks.push(compactionBlock)\n }\n break\n }\n default: {\n // Future compatibility for unrecognized output item types.\n const combinedText = combineMessageTextContent(\n (item as { content?: Array<ResponseOutputContentBlock> }).content,\n )\n if (combinedText.length > 0) {\n contentBlocks.push({ type: \"text\", text: combinedText })\n }\n }\n }\n }\n\n return contentBlocks\n}\n\nconst combineMessageTextContent = (\n content: Array<ResponseOutputContentBlock> | undefined,\n): string => {\n if (!Array.isArray(content)) {\n return \"\"\n }\n\n let aggregated = \"\"\n\n for (const block of content) {\n if (isResponseOutputText(block)) {\n aggregated += block.text\n continue\n }\n\n if (isResponseOutputRefusal(block)) {\n aggregated += block.refusal\n continue\n }\n\n if (typeof (block as { text?: unknown }).text === \"string\") {\n aggregated += (block as { text: string }).text\n continue\n }\n\n if (typeof (block as { reasoning?: unknown }).reasoning === \"string\") {\n aggregated += (block as { reasoning: string }).reasoning\n continue\n }\n }\n\n return aggregated\n}\n\nconst extractReasoningText = (item: ResponseOutputReasoning): string => {\n const segments: Array<string> = []\n\n const collectFromBlocks = (blocks?: Array<ResponseReasoningBlock>) => {\n if (!Array.isArray(blocks)) {\n return\n }\n\n for (const block of blocks) {\n if (typeof block.text === \"string\") {\n segments.push(block.text)\n continue\n }\n }\n }\n\n collectFromBlocks(item.summary)\n\n return segments.join(REASONING_SUMMARY_SEPARATOR).trim()\n}\n\nconst createToolUseContentBlock = (\n call: ResponseOutputFunctionCall,\n): AnthropicToolUseBlock | null => {\n const toolId = call.call_id\n const toolName = resolveToolUseName(call)\n if (!toolName || !toolId) {\n return null\n }\n\n const input = parseFunctionCallArguments(call.arguments)\n\n return {\n type: \"tool_use\",\n id: toolId,\n name: toolName,\n input,\n }\n}\n\nconst createToolSearchUseContentBlock = (\n call: ResponseOutputToolSearchCall,\n toolSearchName = BRIDGE_TOOL_SEARCH_NAME,\n): AnthropicToolUseBlock | null => {\n const toolId = call.call_id\n if (!toolId) {\n return null\n }\n\n return {\n type: \"tool_use\",\n id: toolId,\n name: toolSearchName,\n input: parseToolSearchArguments(call.arguments),\n }\n}\n\nexport const resolveToolUseName = (\n call: Pick<ResponseOutputFunctionCall, \"name\" | \"namespace\">,\n): string => {\n if (typeof call.namespace === \"string\" && call.namespace.length > 0) {\n return call.namespace\n }\n\n return call.name\n}\n\nconst createCompactionThinkingBlock = (\n item: ResponseOutputCompaction,\n): AnthropicAssistantContentBlock | null => {\n if (!item.id || !item.encrypted_content) {\n return null\n }\n\n return {\n type: \"thinking\",\n thinking: \"\",\n signature: encodeCompactionCarrierSignature({\n id: item.id,\n encrypted_content: item.encrypted_content,\n }),\n }\n}\n\nconst parseFunctionCallArguments = (\n rawArguments: string,\n): Record<string, unknown> => {\n if (typeof rawArguments !== \"string\" || rawArguments.trim().length === 0) {\n return {}\n }\n\n try {\n const parsed: unknown = JSON.parse(rawArguments)\n\n if (Array.isArray(parsed)) {\n return { arguments: parsed }\n }\n\n if (parsed && typeof parsed === \"object\") {\n return parsed as Record<string, unknown>\n }\n } catch (error) {\n consola.warn(\"Failed to parse function call arguments\", {\n error,\n rawArguments,\n })\n }\n\n return { raw_arguments: rawArguments }\n}\n\nconst parseToolSearchArguments = (\n argumentsValue: Record<string, unknown> | string,\n): Record<string, unknown> => {\n return formatToolSearchBridgeArguments(argumentsValue)\n}\n\nconst fallbackContentBlocks = (\n outputText: string,\n): Array<AnthropicAssistantContentBlock> => {\n if (!outputText) {\n return []\n }\n\n return [\n {\n type: \"text\",\n text: outputText,\n },\n ]\n}\n\nconst mapResponsesStopReason = (\n response: ResponsesResult,\n options?: ResponsesToAnthropicOptions,\n): AnthropicResponse[\"stop_reason\"] => {\n const { status, incomplete_details: incompleteDetails } = response\n\n if (status === \"completed\") {\n if (!response.output || response.output.length === 0) {\n return options?.hasToolCall ? \"tool_use\" : \"end_turn\"\n }\n\n if (\n response.output.some(\n (item) =>\n item.type === \"function_call\" || item.type === \"tool_search_call\",\n )\n ) {\n return \"tool_use\"\n }\n return \"end_turn\"\n }\n\n if (status === \"incomplete\") {\n if (incompleteDetails?.reason === \"max_output_tokens\") {\n return \"max_tokens\"\n }\n if (incompleteDetails?.reason === \"content_filter\") {\n return \"end_turn\"\n }\n }\n\n return null\n}\n\nconst mapResponsesUsage = (\n response: ResponsesResult,\n): AnthropicResponse[\"usage\"] => {\n const inputTokens = response.usage?.input_tokens ?? 0\n const outputTokens = response.usage?.output_tokens ?? 0\n const inputCachedTokens = response.usage?.input_tokens_details?.cached_tokens\n const cacheWriteTokens =\n response.usage?.input_tokens_details?.cache_write_tokens\n\n return {\n input_tokens:\n inputTokens - (inputCachedTokens ?? 0) - (cacheWriteTokens ?? 0),\n output_tokens: outputTokens,\n ...(inputCachedTokens !== undefined && {\n cache_read_input_tokens: inputCachedTokens,\n }),\n ...(cacheWriteTokens !== undefined && {\n cache_creation_input_tokens: cacheWriteTokens,\n }),\n }\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null\n\nconst isResponseOutputText = (\n block: ResponseOutputContentBlock,\n): block is ResponseOutputText =>\n isRecord(block)\n && \"type\" in block\n && (block as { type?: unknown }).type === \"output_text\"\n\nconst isResponseOutputRefusal = (\n block: ResponseOutputContentBlock,\n): block is ResponseOutputRefusal =>\n isRecord(block)\n && \"type\" in block\n && (block as { type?: unknown }).type === \"refusal\"\n\nconst convertToolResultContent = (\n content: string | Array<AnthropicToolResultContentBlock>,\n): string | Array<ResponseInputContent> => {\n if (typeof content === \"string\") {\n return content\n }\n\n if (Array.isArray(content)) {\n const result: Array<ResponseInputContent> = []\n for (const block of content) {\n switch (block.type) {\n case \"text\": {\n result.push(createTextContent(block.text))\n break\n }\n case \"image\": {\n result.push(createImageContent(block))\n break\n }\n case \"document\": {\n result.push(createFileContent(block))\n break\n }\n case \"tool_reference\": {\n result.push(createTextContent(`Tool ${block.tool_name} loaded`))\n break\n }\n default: {\n break\n }\n }\n }\n return result\n }\n\n return \"\"\n}\n\nconst isSupportAllTurns = (payload: AnthropicMessagesPayload): boolean => {\n if (\n payload.model === \"gpt-5.4\"\n || payload.model === \"gpt-5.4-mini\"\n || payload.model === \"gpt-5.5\"\n ) {\n return true\n }\n return isGpt56OrAbove(payload.model)\n}\n","import {\n BRIDGE_TOOL_SEARCH_NAME,\n formatToolSearchBridgeArguments,\n} from \"~/lib/tool-search\"\nimport {\n type ResponseCompletedEvent,\n type ResponseCreatedEvent,\n type ResponseErrorEvent,\n type ResponseFailedEvent,\n type ResponseFunctionCallArgumentsDeltaEvent,\n type ResponseFunctionCallArgumentsDoneEvent,\n type ResponseIncompleteEvent,\n type ResponseOutputItemAddedEvent,\n type ResponseOutputItemDoneEvent,\n type ResponseReasoningSummaryPartAddedEvent,\n type ResponseReasoningSummaryTextDeltaEvent,\n type ResponseReasoningSummaryTextDoneEvent,\n type ResponsesResult,\n type ResponseStreamEvent,\n type ResponseTextDeltaEvent,\n} from \"~/lib/types/responses\"\n\nimport { type AnthropicStreamEventData } from \"~/lib/types/anthropic\"\nimport {\n REASONING_SUMMARY_SEPARATOR,\n encodeCompactionCarrierSignature,\n resolveToolUseName,\n translateResponsesResultToAnthropic,\n} from \"./responses-translation\"\n\nconst MAX_CONSECUTIVE_FUNCTION_CALL_WHITESPACE = 20\n\nclass FunctionCallArgumentsValidationError extends Error {\n constructor(message: string) {\n super(message)\n this.name = \"FunctionCallArgumentsValidationError\"\n }\n}\n\nconst updateWhitespaceRunState = (\n previousCount: number,\n chunk: string,\n): {\n nextCount: number\n exceeded: boolean\n} => {\n let count = previousCount\n\n for (const char of chunk) {\n if (char === \"\\r\" || char === \"\\n\" || char === \"\\t\") {\n count += 1\n if (count > MAX_CONSECUTIVE_FUNCTION_CALL_WHITESPACE) {\n return { nextCount: count, exceeded: true }\n }\n continue\n }\n\n if (char !== \" \") {\n count = 0\n }\n }\n\n return { nextCount: count, exceeded: false }\n}\n\nexport interface ResponsesStreamState {\n messageStartSent: boolean\n messageCompleted: boolean\n nextContentBlockIndex: number\n blockIndexByKey: Map<string, number>\n openBlocks: Set<number>\n blockHasDelta: Set<number>\n reasoningSummaryHasDelta: Set<string>\n functionCallStateByOutputIndex: Map<number, FunctionCallStreamState>\n toolSearchName: string\n hasToolCall: boolean\n}\n\ntype FunctionCallStreamState = {\n blockIndex: number\n toolCallId: string\n name: string\n consecutiveWhitespaceCount: number\n}\n\nexport const createResponsesStreamState = (options?: {\n toolSearchName?: string\n}): ResponsesStreamState => ({\n messageStartSent: false,\n messageCompleted: false,\n nextContentBlockIndex: 0,\n blockIndexByKey: new Map(),\n openBlocks: new Set(),\n blockHasDelta: new Set(),\n reasoningSummaryHasDelta: new Set(),\n functionCallStateByOutputIndex: new Map(),\n toolSearchName: options?.toolSearchName ?? BRIDGE_TOOL_SEARCH_NAME,\n hasToolCall: false,\n})\n\nexport const translateResponsesStreamEvent = (\n rawEvent: ResponseStreamEvent,\n state: ResponsesStreamState,\n): Array<AnthropicStreamEventData> => {\n const eventType = rawEvent.type\n switch (eventType) {\n case \"response.created\": {\n return handleResponseCreated(rawEvent, state)\n }\n\n case \"response.output_item.added\": {\n return handleOutputItemAdded(rawEvent, state)\n }\n\n case \"response.reasoning_summary_text.delta\": {\n return handleReasoningSummaryTextDelta(rawEvent, state)\n }\n\n case \"response.reasoning_summary_part.added\": {\n return handleReasoningSummaryPartAdded(rawEvent, state)\n }\n\n case \"response.output_text.delta\": {\n return handleOutputTextDelta(rawEvent, state)\n }\n\n case \"response.reasoning_summary_text.done\": {\n return handleReasoningSummaryTextDone(rawEvent, state)\n }\n\n case \"response.output_item.done\": {\n return handleOutputItemDone(rawEvent, state)\n }\n\n case \"response.function_call_arguments.delta\": {\n return handleFunctionCallArgumentsDelta(rawEvent, state)\n }\n\n case \"response.function_call_arguments.done\": {\n return handleFunctionCallArgumentsDone(rawEvent, state)\n }\n\n case \"response.completed\":\n case \"response.incomplete\": {\n return handleResponseCompleted(rawEvent, state)\n }\n\n case \"response.failed\": {\n return handleResponseFailed(rawEvent, state)\n }\n\n case \"error\": {\n return handleErrorEvent(rawEvent, state)\n }\n\n default: {\n return []\n }\n }\n}\n\n// Helper handlers to keep translateResponsesStreamEvent concise\nconst handleResponseCreated = (\n rawEvent: ResponseCreatedEvent,\n state: ResponsesStreamState,\n): Array<AnthropicStreamEventData> => {\n return messageStart(state, rawEvent.response)\n}\n\nconst handleOutputItemAdded = (\n rawEvent: ResponseOutputItemAddedEvent,\n state: ResponsesStreamState,\n): Array<AnthropicStreamEventData> => {\n const events = new Array<AnthropicStreamEventData>()\n const functionCallDetails = extractFunctionCallDetails(rawEvent, state)\n if (!functionCallDetails) {\n return events\n }\n\n const { outputIndex, toolCallId, name, initialArguments } =\n functionCallDetails\n const blockIndex = openFunctionCallBlock(state, {\n outputIndex,\n toolCallId,\n name,\n events,\n })\n\n if (initialArguments !== undefined && initialArguments.length > 0) {\n events.push({\n type: \"content_block_delta\",\n index: blockIndex,\n delta: {\n type: \"input_json_delta\",\n partial_json: initialArguments,\n },\n })\n state.blockHasDelta.add(blockIndex)\n }\n\n return events\n}\n\nconst handleOutputItemDone = (\n rawEvent: ResponseOutputItemDoneEvent,\n state: ResponsesStreamState,\n): Array<AnthropicStreamEventData> => {\n const events = new Array<AnthropicStreamEventData>()\n const item = rawEvent.item\n const itemType = item.type\n const outputIndex = rawEvent.output_index\n\n if (itemType === \"tool_search_call\") {\n const blockIndex = openFunctionCallBlock(state, {\n outputIndex,\n toolCallId: item.call_id,\n name: state.toolSearchName,\n events,\n })\n const finalArguments = stringifyToolSearchArguments(item.arguments)\n\n if (!state.blockHasDelta.has(blockIndex) && finalArguments) {\n events.push({\n type: \"content_block_delta\",\n index: blockIndex,\n delta: {\n type: \"input_json_delta\",\n partial_json: finalArguments,\n },\n })\n state.blockHasDelta.add(blockIndex)\n }\n\n state.functionCallStateByOutputIndex.delete(outputIndex)\n return events\n }\n\n if (itemType === \"compaction\") {\n if (!item.id || !item.encrypted_content) {\n return events\n }\n\n const blockIndex = openThinkingBlockIfNeeded(state, outputIndex, events)\n\n if (!state.blockHasDelta.has(blockIndex)) {\n events.push({\n type: \"content_block_delta\",\n index: blockIndex,\n delta: {\n type: \"thinking_delta\",\n thinking: \"\",\n },\n })\n }\n\n events.push({\n type: \"content_block_delta\",\n index: blockIndex,\n delta: {\n type: \"signature_delta\",\n signature: encodeCompactionCarrierSignature({\n id: item.id,\n encrypted_content: item.encrypted_content,\n }),\n },\n })\n state.blockHasDelta.add(blockIndex)\n return events\n }\n\n if (itemType !== \"reasoning\") {\n return events\n }\n\n const blockIndex = openThinkingBlockIfNeeded(state, outputIndex, events)\n const signature = (item.encrypted_content ?? \"\") + \"@\" + item.id\n if (signature) {\n if (\n (!item.summary || item.summary.length === 0)\n && !state.blockHasDelta.has(blockIndex)\n ) {\n events.push({\n type: \"content_block_delta\",\n index: blockIndex,\n delta: {\n type: \"thinking_delta\",\n thinking: \"\",\n },\n })\n }\n\n events.push({\n type: \"content_block_delta\",\n index: blockIndex,\n delta: {\n type: \"signature_delta\",\n signature,\n },\n })\n state.blockHasDelta.add(blockIndex)\n }\n\n return events\n}\n\nconst handleFunctionCallArgumentsDelta = (\n rawEvent: ResponseFunctionCallArgumentsDeltaEvent,\n state: ResponsesStreamState,\n): Array<AnthropicStreamEventData> => {\n const events = new Array<AnthropicStreamEventData>()\n const outputIndex = rawEvent.output_index\n const deltaText = rawEvent.delta\n\n if (!deltaText) {\n return events\n }\n\n const blockIndex = openFunctionCallBlock(state, {\n outputIndex,\n events,\n })\n\n const functionCallState =\n state.functionCallStateByOutputIndex.get(outputIndex)\n if (!functionCallState) {\n return handleFunctionCallArgumentsValidationError(\n new FunctionCallArgumentsValidationError(\n \"Received function call arguments delta without an open tool call block.\",\n ),\n state,\n events,\n )\n }\n\n // fix: copolit function call returning infinite line breaks until max_tokens limit\n // \"arguments\": \"{\\\"path\\\":\\\"xxx\\\",\\\"pattern\\\":\\\"**/*.ts\\\",\\\"} }? Wait extra braces. Need correct. I should run? Wait overcame. Need proper JSON with pattern \\\"\\n\\n\\n\\n\\n\\n\\n\\n...\n const { nextCount, exceeded } = updateWhitespaceRunState(\n functionCallState.consecutiveWhitespaceCount,\n deltaText,\n )\n if (exceeded) {\n return handleFunctionCallArgumentsValidationError(\n new FunctionCallArgumentsValidationError(\n \"Received function call arguments delta containing more than 20 consecutive whitespace characters.\",\n ),\n state,\n events,\n )\n }\n functionCallState.consecutiveWhitespaceCount = nextCount\n\n events.push({\n type: \"content_block_delta\",\n index: blockIndex,\n delta: {\n type: \"input_json_delta\",\n partial_json: deltaText,\n },\n })\n state.blockHasDelta.add(blockIndex)\n\n return events\n}\n\nconst handleFunctionCallArgumentsDone = (\n rawEvent: ResponseFunctionCallArgumentsDoneEvent,\n state: ResponsesStreamState,\n): Array<AnthropicStreamEventData> => {\n const events = new Array<AnthropicStreamEventData>()\n const outputIndex = rawEvent.output_index\n const blockIndex = openFunctionCallBlock(state, {\n outputIndex,\n events,\n })\n\n const finalArguments =\n typeof rawEvent.arguments === \"string\" ? rawEvent.arguments : undefined\n\n if (!state.blockHasDelta.has(blockIndex) && finalArguments) {\n events.push({\n type: \"content_block_delta\",\n index: blockIndex,\n delta: {\n type: \"input_json_delta\",\n partial_json: finalArguments,\n },\n })\n state.blockHasDelta.add(blockIndex)\n }\n\n state.functionCallStateByOutputIndex.delete(outputIndex)\n return events\n}\n\nconst handleOutputTextDelta = (\n rawEvent: ResponseTextDeltaEvent,\n state: ResponsesStreamState,\n): Array<AnthropicStreamEventData> => {\n const events = new Array<AnthropicStreamEventData>()\n const outputIndex = rawEvent.output_index\n const contentIndex = rawEvent.content_index\n const deltaText = rawEvent.delta\n\n if (!deltaText) {\n return events\n }\n\n const blockIndex = openTextBlockIfNeeded(state, {\n outputIndex,\n contentIndex,\n events,\n })\n\n events.push({\n type: \"content_block_delta\",\n index: blockIndex,\n delta: {\n type: \"text_delta\",\n text: deltaText,\n },\n })\n state.blockHasDelta.add(blockIndex)\n\n return events\n}\n\nconst handleReasoningSummaryTextDelta = (\n rawEvent: ResponseReasoningSummaryTextDeltaEvent,\n state: ResponsesStreamState,\n): Array<AnthropicStreamEventData> => {\n const outputIndex = rawEvent.output_index\n const summaryIndex = rawEvent.summary_index\n const deltaText = rawEvent.delta\n const events = new Array<AnthropicStreamEventData>()\n\n if (!deltaText) {\n return events\n }\n\n const blockIndex = openThinkingBlockIfNeeded(state, outputIndex, events)\n\n events.push({\n type: \"content_block_delta\",\n index: blockIndex,\n delta: {\n type: \"thinking_delta\",\n thinking: deltaText,\n },\n })\n state.blockHasDelta.add(blockIndex)\n state.reasoningSummaryHasDelta.add(getBlockKey(outputIndex, summaryIndex))\n\n return events\n}\n\nconst handleReasoningSummaryPartAdded = (\n rawEvent: ResponseReasoningSummaryPartAddedEvent,\n state: ResponsesStreamState,\n): Array<AnthropicStreamEventData> => {\n const events = new Array<AnthropicStreamEventData>()\n const blockIndex = openThinkingBlockIfNeeded(\n state,\n rawEvent.output_index,\n events,\n )\n\n if (rawEvent.summary_index === 0) {\n return events\n }\n\n events.push({\n type: \"content_block_delta\",\n index: blockIndex,\n delta: {\n type: \"thinking_delta\",\n thinking: REASONING_SUMMARY_SEPARATOR,\n },\n })\n state.blockHasDelta.add(blockIndex)\n return events\n}\n\nconst handleReasoningSummaryTextDone = (\n rawEvent: ResponseReasoningSummaryTextDoneEvent,\n state: ResponsesStreamState,\n): Array<AnthropicStreamEventData> => {\n const outputIndex = rawEvent.output_index\n const summaryIndex = rawEvent.summary_index\n const text = rawEvent.text\n const events = new Array<AnthropicStreamEventData>()\n const blockIndex = openThinkingBlockIfNeeded(state, outputIndex, events)\n const summaryKey = getBlockKey(outputIndex, summaryIndex)\n\n if (text && !state.reasoningSummaryHasDelta.has(summaryKey)) {\n events.push({\n type: \"content_block_delta\",\n index: blockIndex,\n delta: {\n type: \"thinking_delta\",\n thinking: text,\n },\n })\n state.blockHasDelta.add(blockIndex)\n }\n\n return events\n}\n\nconst handleResponseCompleted = (\n rawEvent: ResponseCompletedEvent | ResponseIncompleteEvent,\n state: ResponsesStreamState,\n): Array<AnthropicStreamEventData> => {\n const response = rawEvent.response\n const events = new Array<AnthropicStreamEventData>()\n\n closeAllOpenBlocks(state, events)\n const anthropic = translateResponsesResultToAnthropic(response, {\n hasToolCall: state.hasToolCall,\n toolSearchName: state.toolSearchName,\n })\n events.push(\n {\n type: \"message_delta\",\n delta: {\n stop_reason: anthropic.stop_reason,\n stop_sequence: anthropic.stop_sequence,\n },\n usage: anthropic.usage,\n },\n { type: \"message_stop\" },\n )\n state.messageCompleted = true\n return events\n}\n\nconst handleResponseFailed = (\n rawEvent: ResponseFailedEvent,\n state: ResponsesStreamState,\n): Array<AnthropicStreamEventData> => {\n const response = rawEvent.response\n const events = new Array<AnthropicStreamEventData>()\n closeAllOpenBlocks(state, events)\n\n const message =\n response.error?.message ?? \"The response failed due to an unknown error.\"\n\n events.push(buildErrorEvent(message))\n state.messageCompleted = true\n\n return events\n}\n\nconst handleErrorEvent = (\n rawEvent: ResponseErrorEvent,\n state: ResponsesStreamState,\n): Array<AnthropicStreamEventData> => {\n const message =\n typeof rawEvent.message === \"string\" ?\n rawEvent.message\n : \"An unexpected error occurred during streaming.\"\n\n state.messageCompleted = true\n return [buildErrorEvent(message)]\n}\n\nconst handleFunctionCallArgumentsValidationError = (\n error: FunctionCallArgumentsValidationError,\n state: ResponsesStreamState,\n events: Array<AnthropicStreamEventData> = [],\n): Array<AnthropicStreamEventData> => {\n const reason = error.message\n\n closeAllOpenBlocks(state, events)\n state.messageCompleted = true\n\n events.push(buildErrorEvent(reason))\n\n return events\n}\n\nconst messageStart = (\n state: ResponsesStreamState,\n response: ResponsesResult,\n): Array<AnthropicStreamEventData> => {\n state.messageStartSent = true\n const inputCachedTokens = response.usage?.input_tokens_details?.cached_tokens\n const cacheWriteTokens =\n response.usage?.input_tokens_details?.cache_write_tokens\n const inputTokens =\n (response.usage?.input_tokens ?? 0)\n - (inputCachedTokens ?? 0)\n - (cacheWriteTokens ?? 0)\n return [\n {\n type: \"message_start\",\n message: {\n id: response.id,\n type: \"message\",\n role: \"assistant\",\n content: [],\n model: response.model,\n stop_reason: null,\n stop_sequence: null,\n usage: {\n input_tokens: inputTokens,\n output_tokens: 0,\n cache_read_input_tokens: inputCachedTokens ?? 0,\n ...(cacheWriteTokens !== undefined && {\n cache_creation_input_tokens: cacheWriteTokens,\n }),\n },\n },\n },\n ]\n}\n\nconst openTextBlockIfNeeded = (\n state: ResponsesStreamState,\n params: {\n outputIndex: number\n contentIndex: number\n events: Array<AnthropicStreamEventData>\n },\n): number => {\n const { outputIndex, contentIndex, events } = params\n const key = getBlockKey(outputIndex, contentIndex)\n let blockIndex = state.blockIndexByKey.get(key)\n\n if (blockIndex === undefined) {\n blockIndex = state.nextContentBlockIndex\n state.nextContentBlockIndex += 1\n state.blockIndexByKey.set(key, blockIndex)\n }\n\n if (!state.openBlocks.has(blockIndex)) {\n closeOpenBlocks(state, events)\n events.push({\n type: \"content_block_start\",\n index: blockIndex,\n content_block: {\n type: \"text\",\n text: \"\",\n },\n })\n state.openBlocks.add(blockIndex)\n }\n\n return blockIndex\n}\n\nconst openThinkingBlockIfNeeded = (\n state: ResponsesStreamState,\n outputIndex: number,\n events: Array<AnthropicStreamEventData>,\n): number => {\n //thinking blocks has multiple summary_index, should combine into one block\n const summaryIndex = 0\n const key = getBlockKey(outputIndex, summaryIndex)\n let blockIndex = state.blockIndexByKey.get(key)\n\n if (blockIndex === undefined) {\n blockIndex = state.nextContentBlockIndex\n state.nextContentBlockIndex += 1\n state.blockIndexByKey.set(key, blockIndex)\n }\n\n if (!state.openBlocks.has(blockIndex)) {\n closeOpenBlocks(state, events)\n events.push({\n type: \"content_block_start\",\n index: blockIndex,\n content_block: {\n type: \"thinking\",\n thinking: \"\",\n },\n })\n state.openBlocks.add(blockIndex)\n }\n\n return blockIndex\n}\n\nconst closeBlockIfOpen = (\n state: ResponsesStreamState,\n blockIndex: number,\n events: Array<AnthropicStreamEventData>,\n) => {\n if (!state.openBlocks.has(blockIndex)) {\n return\n }\n\n events.push({ type: \"content_block_stop\", index: blockIndex })\n state.openBlocks.delete(blockIndex)\n state.blockHasDelta.delete(blockIndex)\n}\n\nconst closeOpenBlocks = (\n state: ResponsesStreamState,\n events: Array<AnthropicStreamEventData>,\n) => {\n for (const blockIndex of state.openBlocks) {\n closeBlockIfOpen(state, blockIndex, events)\n }\n}\n\nconst closeAllOpenBlocks = (\n state: ResponsesStreamState,\n events: Array<AnthropicStreamEventData>,\n) => {\n closeOpenBlocks(state, events)\n\n state.functionCallStateByOutputIndex.clear()\n state.reasoningSummaryHasDelta.clear()\n}\n\nexport const buildErrorEvent = (message: string): AnthropicStreamEventData => ({\n type: \"error\",\n error: {\n type: \"api_error\",\n message,\n },\n})\n\nconst getBlockKey = (outputIndex: number, contentIndex: number): string =>\n `${outputIndex}:${contentIndex}`\n\nconst openFunctionCallBlock = (\n state: ResponsesStreamState,\n params: {\n outputIndex: number\n toolCallId?: string\n name?: string\n events: Array<AnthropicStreamEventData>\n },\n): number => {\n const { outputIndex, toolCallId, name, events } = params\n\n state.hasToolCall = true\n\n let functionCallState = state.functionCallStateByOutputIndex.get(outputIndex)\n\n if (!functionCallState) {\n const blockIndex = state.nextContentBlockIndex\n state.nextContentBlockIndex += 1\n\n const resolvedToolCallId = toolCallId ?? `tool_call_${blockIndex}`\n const resolvedName = name ?? \"function\"\n\n functionCallState = {\n blockIndex,\n toolCallId: resolvedToolCallId,\n name: resolvedName,\n consecutiveWhitespaceCount: 0,\n }\n\n state.functionCallStateByOutputIndex.set(outputIndex, functionCallState)\n }\n\n const { blockIndex } = functionCallState\n\n if (!state.openBlocks.has(blockIndex)) {\n closeOpenBlocks(state, events)\n events.push({\n type: \"content_block_start\",\n index: blockIndex,\n content_block: {\n type: \"tool_use\",\n id: functionCallState.toolCallId,\n name: functionCallState.name,\n input: {},\n },\n })\n state.openBlocks.add(blockIndex)\n }\n\n return blockIndex\n}\n\ntype FunctionCallDetails = {\n outputIndex: number\n toolCallId: string\n name: string\n initialArguments?: string\n}\n\nconst extractFunctionCallDetails = (\n rawEvent: ResponseOutputItemAddedEvent,\n state: ResponsesStreamState,\n): FunctionCallDetails | undefined => {\n const item = rawEvent.item\n const itemType = item.type\n if (itemType === \"tool_search_call\") {\n const outputIndex = rawEvent.output_index\n const toolCallId = item.call_id\n const name = state.toolSearchName\n return {\n outputIndex,\n toolCallId,\n name,\n initialArguments: \"\",\n }\n }\n\n if (itemType !== \"function_call\") {\n return undefined\n }\n\n const outputIndex = rawEvent.output_index\n const toolCallId = item.call_id\n const name = resolveToolUseName(item)\n const initialArguments = item.arguments\n return {\n outputIndex,\n toolCallId,\n name,\n initialArguments,\n }\n}\n\nconst stringifyToolSearchArguments = (\n argumentsValue: Record<string, unknown> | string,\n): string | undefined => {\n try {\n return JSON.stringify(formatToolSearchBridgeArguments(argumentsValue))\n } catch {\n return undefined\n }\n}\n","import type { ConsolaInstance } from \"consola\"\n\nimport type {\n CopilotUsage,\n ResponseStreamEvent,\n ResponsesResult,\n ResponsesStream,\n} from \"~/lib/types/responses\"\n\nimport { debugJson } from \"~/lib/logger\"\n\ninterface ResponsesStreamCollection {\n outputItemsByIndex: Map<number, ResponsesResult[\"output\"][number]>\n}\n\nexport const collectResponsesStreamResult = async ({\n errorMessagePrefix = \"Responses stream\",\n parseEvent = parseResponsesStreamEvent,\n upstreamResponse,\n logger,\n}: {\n errorMessagePrefix?: string\n parseEvent?: (data: string) => ResponseStreamEvent | null\n upstreamResponse: ResponsesStream\n logger: ConsolaInstance\n}): Promise<ResponsesResult> => {\n const state = createResponsesStreamCollection()\n\n for await (const chunk of upstreamResponse) {\n const result = collectResponsesStreamChunk({\n chunk,\n errorMessagePrefix,\n logger,\n parseEvent,\n state,\n })\n if (result) {\n return result\n }\n }\n\n throw new Error(`${errorMessagePrefix} ended without a terminal event`)\n}\n\nconst collectResponsesStreamChunk = ({\n chunk,\n errorMessagePrefix,\n logger,\n parseEvent,\n state,\n}: {\n chunk: { data?: string; event?: string }\n errorMessagePrefix: string\n logger: ConsolaInstance\n parseEvent: (data: string) => ResponseStreamEvent | null\n state: ResponsesStreamCollection\n}): ResponsesResult | undefined => {\n debugJson(logger, \"Received responses stream chunk:\", chunk)\n if (chunk.event === \"ping\" || !chunk.data || chunk.data === \"[DONE]\") {\n return\n }\n\n const parsed = parseEvent(chunk.data)\n if (!parsed) {\n return\n }\n\n if (parsed.type === \"error\") {\n throw new Error(\n getStreamErrorMessage(parsed) ?? `${errorMessagePrefix} failed`,\n )\n }\n\n if (parsed.type === \"response.failed\") {\n const response = parsed.response\n if (!response) {\n throw new Error(\"Responses stream ended without a response\")\n }\n throw new Error(response.error?.message ?? `${errorMessagePrefix} failed`)\n }\n\n return collectResponsesStreamEvent(parsed, state)\n}\n\nconst parseResponsesStreamEvent = (\n data: string,\n): ResponseStreamEvent | null => {\n try {\n return JSON.parse(data) as ResponseStreamEvent\n } catch {\n return null\n }\n}\n\nconst createResponsesStreamCollection = (): ResponsesStreamCollection => ({\n outputItemsByIndex: new Map(),\n})\n\nconst collectResponsesStreamEvent = (\n event: ResponseStreamEvent,\n state: ResponsesStreamCollection,\n): ResponsesResult | undefined => {\n switch (event.type) {\n case \"response.completed\":\n case \"response.incomplete\": {\n const response = event.response\n if (!response) {\n throw new Error(\"Responses stream ended without a response\")\n }\n response.copilot_usage ??= event.copilot_usage as CopilotUsage\n const output = [...state.outputItemsByIndex.entries()]\n .sort(([leftIndex], [rightIndex]) => leftIndex - rightIndex)\n .map(([, item]) => item)\n return {\n ...response,\n output: output.length > 0 ? output : response.output,\n }\n }\n case \"response.output_item.done\":\n state.outputItemsByIndex.set(event.output_index, event.item)\n break\n }\n}\n\nconst getStreamErrorMessage = (\n event: Extract<ResponseStreamEvent, { type: \"error\" }>,\n): string | undefined => {\n return event.error?.message ?? event.message ?? undefined\n}\n","import { createHash } from \"node:crypto\"\n\nimport { compactTextOnlyGuard } from \"~/lib/compact\"\nimport { requestContext } from \"~/lib/request-context\"\nimport type {\n AnthropicAssistantContentBlock,\n AnthropicAssistantMessage,\n AnthropicCacheControl,\n AnthropicDocumentBlock,\n AnthropicImageBlock,\n AnthropicInputMessage,\n AnthropicMessagesPayload,\n AnthropicResponse,\n AnthropicTextBlock,\n AnthropicTool,\n AnthropicToolResultContentBlock,\n AnthropicToolUseBlock,\n AnthropicUserContentBlock,\n AnthropicUserMessage,\n} from \"~/lib/types/anthropic\"\nimport type {\n NamespaceTool,\n ResponseInputAgentMessage,\n ResponseInputItem,\n ResponseInputMessage,\n ResponseInputReasoning,\n ResponseOutputCustomToolCall,\n ResponseOutputFunctionCall,\n ResponseOutputItem,\n Reasoning,\n ResponsesPayload,\n ResponsesResult,\n ResponseUsage,\n} from \"~/lib/types/responses\"\n\nexport const MESSAGES_COMPACTION_PREFIX = \"copilot-api:messages-compaction:v1:\"\nconst MESSAGES_REASONING_ID_SUFFIX = \"__a1\"\n\nexport const markMessagesReasoningId = (id: string): string =>\n `${id}${MESSAGES_REASONING_ID_SUFFIX}`\n\nexport const isMessagesReasoningId = (id: unknown): boolean =>\n typeof id === \"string\" && id.endsWith(MESSAGES_REASONING_ID_SUFFIX)\n\nexport const MESSAGES_COMPACTION_PROMPT = [\n \"You are performing a CONTEXT CHECKPOINT COMPACTION. Create a handoff summary for another LLM that will resume the task.\",\n \"Do NOT continue the task, make changes, or call any tools. Your only output must be the handoff summary.\",\n \"\",\n \"Include:\",\n \"- Current progress and key decisions made\",\n \"- Important context, constraints, or user preferences\",\n \"- What remains to be done (clear next steps)\",\n \"- Any critical data, examples, or references needed to continue\",\n \"\",\n \"Be concise, structured, and focused on helping the next LLM seamlessly continue the work.\",\n \"\",\n compactTextOnlyGuard,\n].join(\"\\n\")\n\nexport const MESSAGES_TOOL_CALL_TIPS = [\n \"# Tool Call Tips\",\n \"- Do NOT call `exec_command` directly; that tool does not exist. Use `functions__exec` to run commands instead.\",\n '- The functions__exec tool accepts parameters only as {\"input\":\"...\"}; put the complete executable code inside input, including properly constructed tools.exec_command(...) calls and text(...) output handling.',\n \"- Construct all tools.exec_command(...) arguments strictly according to its tool definition, and use OS/shell-compatible commands for Windows, Linux, and macOS.\",\n \"- Always assign the awaited tools.exec_command(...) call to a variable, then forward its output with text(result.output) and inspect result.exit_code; unforwarded output is silently dropped and makes results look empty.\",\n \"- Yielded execution is not truncated output. Resume a running `cell_id` with `functions.wait`, and a live `session_id` with `tools.write_stdin`, until the command reaches a terminal result.\",\n \"- Read files with the OS-native command (Get-Content/Test-Path on Windows PowerShell, cat/ls on POSIX), quote paths containing spaces, and verify the forwarded output is non-empty before concluding a file was read.\",\n].join(\"\\n\")\n\nconst COMPACTION_REPLAY_PROMPT =\n \"The previous conversation was compacted. Continue from this handoff summary:\\n\\n\"\nconst MAX_DEVELOPER_PROMPTS = 5\nconst TOOL_NAME_PATTERN = /^[A-Za-z0-9_-]{1,64}$/u\nconst CUSTOM_TOOL_INPUT_SCHEMA: Record<string, unknown> = {\n type: \"object\",\n properties: { input: { type: \"string\" } },\n required: [\"input\"],\n additionalProperties: false,\n}\n\nexport class ResponsesMessagesTranslationError extends Error {\n readonly status: number\n\n constructor(message: string, status = 400) {\n super(message)\n this.name = \"ResponsesMessagesTranslationError\"\n this.status = status\n }\n}\n\nexport interface MessagesToolDescriptor {\n alias: string\n kind: \"custom\" | \"function\"\n name: string\n namespace?: string\n}\n\nexport interface MessagesToolRegistry {\n byAlias: Map<string, MessagesToolDescriptor>\n byOriginal: Map<string, MessagesToolDescriptor>\n tools: Array<AnthropicTool>\n}\n\nexport interface ResponsesToMessagesTranslation {\n compaction: boolean\n messagesPayload: AnthropicMessagesPayload\n originalPayload: ResponsesPayload\n publicModel: string\n registry: MessagesToolRegistry\n}\n\nexport type MessagesResponseTranslationContext = Omit<\n ResponsesToMessagesTranslation,\n \"messagesPayload\"\n>\n\ninterface ToolRegistration {\n description?: string | null\n kind: MessagesToolDescriptor[\"kind\"]\n name: string\n namespace?: string\n parameters?: Record<string, unknown> | null\n}\n\ninterface ResponsesInputNormalization {\n compaction: boolean\n input: string | Array<ResponseInputItem> | undefined\n}\n\nexport function translateResponsesToMessages(\n payload: ResponsesPayload,\n options: { model: string; publicModel?: string; toolCallTips?: boolean },\n): ResponsesToMessagesTranslation {\n const registry = createToolRegistry(payload)\n const normalized = normalizeResponsesInput(payload.input)\n const { messages, system } = translateInputToAnthropic(\n normalized.input,\n registry,\n payload.instructions,\n payload.input,\n options.toolCallTips ?? false,\n )\n\n if (normalized.compaction) {\n messages.push({ role: \"user\", content: MESSAGES_COMPACTION_PROMPT })\n }\n\n if (messages.length === 0) {\n throw new ResponsesMessagesTranslationError(\n \"Responses input must contain at least one translatable message\",\n )\n }\n\n applyEphemeralCacheControl(messages, system)\n\n const reasoningEffort = translateReasoningEffort(payload.reasoning?.effort)\n const metadataUserId = resolveMetadataUserId(payload)\n const messagesPayload: AnthropicMessagesPayload = {\n model: options.model,\n messages,\n max_tokens: Math.max(1, payload.max_output_tokens ?? 32_000),\n stream: payload.stream ?? false,\n temperature: payload.temperature ?? undefined,\n top_p: payload.top_p ?? undefined,\n system: system.length > 0 ? system : undefined,\n tools:\n normalized.compaction || registry.tools.length > 0 ?\n registry.tools\n : undefined,\n tool_choice: translateToolChoice(payload.tool_choice, registry),\n ...(reasoningEffort ? { output_config: { effort: reasoningEffort } } : {}),\n ...((\n payload.service_tier === \"auto\"\n || payload.service_tier === \"standard_only\"\n ) ?\n { service_tier: payload.service_tier }\n : {}),\n ...(metadataUserId ? { metadata: { user_id: metadataUserId } } : {}),\n }\n\n return {\n compaction: normalized.compaction,\n messagesPayload,\n originalPayload: payload,\n publicModel: options.publicModel ?? payload.model,\n registry,\n }\n}\n\nexport function translateAnthropicToResponses(\n response: AnthropicResponse,\n context: MessagesResponseTranslationContext,\n): ResponsesResult {\n const finish = translateStopReason(response.stop_reason)\n const output =\n context.compaction ?\n translateCompactionOutput(response)\n : translateAssistantOutput(response, context.registry)\n const outputText =\n context.compaction ? \"\" : extractAnthropicResponseText(response)\n\n return createMessagesBackedResponsesResult({\n context,\n id: toResponseId(response.id),\n output,\n outputText,\n status: finish.status,\n incompleteReason: finish.incompleteReason,\n usage: translateAnthropicUsage(response.usage),\n copilotUsage: response.copilot_usage,\n })\n}\n\nexport function createMessagesBackedResponsesResult(options: {\n context: MessagesResponseTranslationContext\n createdAt?: number\n error?: ResponsesResult[\"error\"]\n id: string\n incompleteReason?: \"content_filter\" | \"max_output_tokens\"\n output: Array<ResponseOutputItem>\n outputText: string\n status: string\n usage?: ResponseUsage | null\n copilotUsage?: ResponsesResult[\"copilot_usage\"]\n}): ResponsesResult {\n const { context } = options\n return {\n id: options.id,\n object: \"response\",\n created_at: options.createdAt ?? Math.floor(Date.now() / 1000),\n model: context.publicModel,\n output: options.output,\n output_text: options.outputText,\n status: options.status,\n copilot_usage: options.copilotUsage ?? null,\n usage: options.usage ?? null,\n error: options.error ?? null,\n incomplete_details:\n options.incompleteReason ? { reason: options.incompleteReason } : null,\n instructions: context.originalPayload.instructions ?? null,\n metadata: context.originalPayload.metadata ?? null,\n parallel_tool_calls: Boolean(context.originalPayload.parallel_tool_calls),\n temperature: context.originalPayload.temperature ?? null,\n tool_choice: context.originalPayload.tool_choice ?? \"auto\",\n tools: context.originalPayload.tools ?? [],\n top_p: context.originalPayload.top_p ?? null,\n }\n}\n\nexport function translateAnthropicUsage(\n usage: AnthropicResponse[\"usage\"] | undefined,\n): ResponseUsage | null {\n if (!usage) return null\n\n const cachedTokens = usage.cache_read_input_tokens ?? 0\n const cacheWriteTokens = usage.cache_creation_input_tokens ?? 0\n const inputTokens = usage.input_tokens + cachedTokens + cacheWriteTokens\n const outputTokens = usage.output_tokens\n return {\n input_tokens: inputTokens,\n output_tokens: outputTokens,\n total_tokens: inputTokens + outputTokens,\n input_tokens_details: {\n cached_tokens: cachedTokens,\n ...(cacheWriteTokens > 0 ? { cache_write_tokens: cacheWriteTokens } : {}),\n },\n output_tokens_details: { reasoning_tokens: 0 },\n }\n}\n\nexport function encodeMessagesCompaction(summary: string): string {\n const payload = `${MESSAGES_COMPACTION_PREFIX}${Buffer.from(summary, \"utf8\").toString(\"base64url\")}`\n return Buffer.from(payload, \"utf8\").toString(\"base64\")\n}\n\nexport function decodeMessagesCompaction(value: string): string | null {\n let payload = value\n if (!payload.startsWith(MESSAGES_COMPACTION_PREFIX)) {\n const decoded = Buffer.from(value, \"base64\")\n if (decoded.toString(\"base64\") !== value) return null\n payload = decoded.toString(\"utf8\")\n }\n if (!payload.startsWith(MESSAGES_COMPACTION_PREFIX)) return null\n\n try {\n const encoded = payload.slice(MESSAGES_COMPACTION_PREFIX.length)\n if (!encoded) return null\n return Buffer.from(encoded, \"base64url\").toString(\"utf8\")\n } catch {\n return null\n }\n}\n\nexport function resolveToolDescriptor(\n registry: MessagesToolRegistry,\n alias: string,\n): MessagesToolDescriptor {\n return (\n registry.byAlias.get(alias) ?? {\n alias,\n kind: \"function\",\n name: alias,\n }\n )\n}\n\nexport function decodeCustomToolInput(input: unknown): string {\n if (isRecord(input) && typeof input.input === \"string\") {\n return input.input\n }\n return typeof input === \"string\" ? input : JSON.stringify(input ?? {})\n}\n\nexport function toResponseId(messageId: string): string {\n const normalized = messageId.replace(/^msg[-_]?/u, \"\")\n return `resp_${normalized || createStableHash(messageId)}`\n}\n\nfunction normalizeResponsesInput(\n input: ResponsesPayload[\"input\"],\n): ResponsesInputNormalization {\n if (!Array.isArray(input)) {\n return { compaction: false, input }\n }\n\n const triggerIndexes = input.flatMap((item, index) =>\n getItemType(item) === \"compaction_trigger\" ? [index] : [],\n )\n const compaction = triggerIndexes.length > 0\n if (\n triggerIndexes.length > 1\n || (compaction && triggerIndexes[0] !== input.length - 1)\n ) {\n throw new ResponsesMessagesTranslationError(\n \"compaction_trigger must be the final Responses input item\",\n )\n }\n\n const withoutTrigger = compaction ? input.slice(0, -1) : [...input]\n let latestCompactionIndex = -1\n for (let index = withoutTrigger.length - 1; index >= 0; index -= 1) {\n if (getItemType(withoutTrigger[index]) === \"compaction\") {\n latestCompactionIndex = index\n break\n }\n }\n\n if (latestCompactionIndex < 0) {\n return { compaction, input: withoutTrigger }\n }\n\n const carrier = withoutTrigger[latestCompactionIndex]\n const encryptedContent = getStringField(carrier, \"encrypted_content\")\n const summary =\n encryptedContent ? decodeMessagesCompaction(encryptedContent) : null\n if (!summary) {\n throw new ResponsesMessagesTranslationError(\n \"This Messages-backed model cannot replay a compaction created by another Responses backend; start a new conversation or switch back to the original model\",\n )\n }\n\n const replayMessage: ResponseInputMessage = {\n type: \"message\",\n role: \"user\",\n content: `${COMPACTION_REPLAY_PROMPT}${summary}`,\n }\n return {\n compaction,\n input: [replayMessage, ...withoutTrigger.slice(latestCompactionIndex + 1)],\n }\n}\n\nfunction createToolRegistry(payload: ResponsesPayload): MessagesToolRegistry {\n const registry: MessagesToolRegistry = {\n byAlias: new Map(),\n byOriginal: new Map(),\n tools: [],\n }\n\n for (const tool of payload.tools ?? []) {\n registerTool(tool, registry)\n }\n\n if (Array.isArray(payload.input)) {\n for (const item of payload.input) {\n const type = getItemType(item)\n if (type !== \"additional_tools\") continue\n for (const tool of getArrayField(item, \"tools\")) {\n registerTool(tool, registry)\n }\n }\n }\n\n return registry\n}\n\nfunction registerTool(\n tool: unknown,\n registry: MessagesToolRegistry,\n namespaces: Array<string> = [],\n): void {\n if (!isRecord(tool)) {\n throw new ResponsesMessagesTranslationError(\n \"Invalid Responses tool definition\",\n )\n }\n\n const type = getStringField(tool, \"type\")\n if (type === \"namespace\") {\n const namespaceTool = tool as unknown as NamespaceTool\n const namespace = getStringField(namespaceTool, \"name\")\n if (!namespace || !Array.isArray(namespaceTool.tools)) {\n throw new ResponsesMessagesTranslationError(\n \"Responses namespace tools require a name and tools array\",\n )\n }\n for (const child of namespaceTool.tools) {\n registerTool(child, registry, [...namespaces, namespace])\n }\n return\n }\n\n if (type !== \"function\" && type !== \"custom\") {\n const suffix = type ? ` '${type}'` : \" without a type\"\n throw new ResponsesMessagesTranslationError(\n `Responses Messages fallback does not support tool${suffix}`,\n )\n }\n\n const name = getStringField(tool, \"name\")\n if (!name) {\n throw new ResponsesMessagesTranslationError(\n `Responses ${type} tools require a non-empty name`,\n )\n }\n\n registerMessagesTool(\n {\n kind: type,\n name,\n namespace: namespaces.length > 0 ? namespaces.join(\".\") : undefined,\n description: getOptionalStringField(tool, \"description\"),\n parameters:\n type === \"function\" && isRecord(tool.parameters) ?\n tool.parameters\n : null,\n },\n registry,\n )\n}\n\nfunction registerMessagesTool(\n registration: ToolRegistration,\n registry: MessagesToolRegistry,\n): MessagesToolDescriptor {\n const originalKey = createOriginalToolKey(registration)\n const existing = registry.byOriginal.get(originalKey)\n if (existing) return existing\n\n const descriptor = createMessagesToolDescriptor(registration, registry)\n registry.byAlias.set(descriptor.alias, descriptor)\n registry.byOriginal.set(originalKey, descriptor)\n registry.tools.push({\n name: descriptor.alias,\n ...(registration.description ?\n { description: registration.description }\n : {}),\n input_schema:\n registration.kind === \"custom\" ?\n CUSTOM_TOOL_INPUT_SCHEMA\n : (registration.parameters ?? { type: \"object\", properties: {} }),\n ...(registration.kind === \"custom\" ? { strict: true } : {}),\n })\n return descriptor\n}\n\nfunction createMessagesToolDescriptor(\n registration: Pick<ToolRegistration, \"kind\" | \"name\" | \"namespace\">,\n registry: MessagesToolRegistry,\n): MessagesToolDescriptor {\n const originalKey = createOriginalToolKey(registration)\n const preferredName =\n registration.namespace ?\n `${registration.namespace.replaceAll(\".\", \"_\")}__${registration.name}`\n : registration.name\n const alias = createToolAlias(preferredName, originalKey, registry)\n return {\n alias,\n kind: registration.kind,\n name: registration.name,\n ...(registration.namespace ? { namespace: registration.namespace } : {}),\n }\n}\n\nfunction translateInputToAnthropic(\n input: string | Array<ResponseInputItem> | undefined,\n registry: MessagesToolRegistry,\n instructions: string | null | undefined,\n originalInput: ResponsesPayload[\"input\"],\n toolCallTips: boolean,\n): {\n messages: Array<AnthropicInputMessage>\n system: Array<AnthropicTextBlock>\n} {\n const messages: Array<AnthropicInputMessage> = []\n const system: Array<AnthropicTextBlock> = []\n if (instructions?.trim()) {\n system.push({ type: \"text\", text: instructions })\n }\n appendDeveloperPrompts(system, originalInput)\n\n if (typeof input === \"string\") {\n messages.push({ role: \"user\", content: input })\n } else if (Array.isArray(input)) {\n translateInputItems(input, messages, system, registry)\n }\n if (toolCallTips) {\n appendToolCallTips(system)\n }\n return { messages, system }\n}\n\nfunction appendToolCallTips(system: Array<AnthropicTextBlock>): void {\n const lastSystemBlock = system.at(-1)\n if (!lastSystemBlock) {\n system.push({ type: \"text\", text: MESSAGES_TOOL_CALL_TIPS })\n return\n }\n lastSystemBlock.text = `${lastSystemBlock.text}\\n\\n${MESSAGES_TOOL_CALL_TIPS}`\n}\n\nfunction translateInputItems(\n input: Array<ResponseInputItem>,\n messages: Array<AnthropicInputMessage>,\n system: Array<AnthropicTextBlock>,\n registry: MessagesToolRegistry,\n): void {\n let userMessageSeen = false\n for (const item of input) {\n const type = getItemType(item)\n switch (type) {\n case undefined:\n case \"message\": {\n translateInputMessage(item, messages, system, userMessageSeen)\n if (getStringField(item, \"role\") === \"user\") {\n userMessageSeen = true\n }\n break\n }\n case \"agent_message\": {\n translateInputAgentMessage(item as ResponseInputAgentMessage, messages)\n userMessageSeen = true\n break\n }\n case \"reasoning\": {\n translateInputReasoning(item as ResponseInputReasoning, messages)\n break\n }\n case \"function_call\": {\n translateInputToolCall(item, \"function\", messages, registry)\n break\n }\n case \"custom_tool_call\": {\n translateInputToolCall(item, \"custom\", messages, registry)\n break\n }\n case \"function_call_output\":\n case \"custom_tool_call_output\": {\n appendUserBlock(messages, {\n type: \"tool_result\",\n tool_use_id: requireStringField(item, \"call_id\", type),\n content: translateToolResultContent(\n (item as Record<string, unknown>).output,\n `${type}.output`,\n ),\n is_error: getStringField(item, \"status\") === \"incomplete\",\n })\n break\n }\n case \"additional_tools\": {\n break\n }\n default: {\n throw new ResponsesMessagesTranslationError(\n `Responses Messages fallback does not support input item type '${type}'`,\n )\n }\n }\n }\n}\n\nfunction translateInputMessage(\n item: ResponseInputItem,\n messages: Array<AnthropicInputMessage>,\n system: Array<AnthropicTextBlock>,\n userMessageSeen: boolean,\n): void {\n if (!isRecord(item)) {\n throw new ResponsesMessagesTranslationError(\n \"Invalid Responses message item\",\n )\n }\n const role = getStringField(item, \"role\")\n if (\n role !== \"user\"\n && role !== \"assistant\"\n && role !== \"system\"\n && role !== \"developer\"\n ) {\n throw new ResponsesMessagesTranslationError(\n \"Responses message items require a supported role\",\n )\n }\n\n if (role === \"developer\" && !userMessageSeen) return\n\n if (role === \"system\") {\n const text = translateSystemContent(item.content, \"message.content\")\n if (text) system.push({ type: \"text\", text })\n return\n }\n\n if (role === \"assistant\") {\n const blocks = translateAssistantContent(item.content, \"message.content\")\n for (const block of blocks) {\n appendAssistantBlock(messages, block)\n }\n return\n }\n\n const content = translateUserContent(item.content, \"message.content\")\n messages.push({ role: \"user\", content })\n}\n\nfunction translateInputAgentMessage(\n item: ResponseInputAgentMessage,\n messages: Array<AnthropicInputMessage>,\n): void {\n const content = translateUserContent(item.content, \"agent_message.content\")\n messages.push({ role: \"user\", content })\n}\n\nfunction appendDeveloperPrompts(\n system: Array<AnthropicTextBlock>,\n input: ResponsesPayload[\"input\"],\n): void {\n if (!Array.isArray(input)) return\n\n const prompts: Array<string> = []\n for (const item of input) {\n if (prompts.length >= MAX_DEVELOPER_PROMPTS) break\n const type = getItemType(item)\n const role = getStringField(item, \"role\")\n if (type === \"agent_message\") break\n if ((type === undefined || type === \"message\") && role === \"user\") break\n if ((type !== undefined && type !== \"message\") || role !== \"developer\") {\n continue\n }\n prompts.push(\n translateSystemContent(\n isRecord(item) ? item.content : undefined,\n \"message.content\",\n ),\n )\n }\n\n const [firstPrompt, ...remainingPrompts] = prompts\n if (firstPrompt) system.push({ type: \"text\", text: firstPrompt })\n\n const mergedPrompts = remainingPrompts.filter(Boolean).join(\"\\n\\n\")\n if (mergedPrompts) system.push({ type: \"text\", text: mergedPrompts })\n}\n\nfunction translateInputReasoning(\n item: ResponseInputReasoning,\n messages: Array<AnthropicInputMessage>,\n): void {\n const thinking =\n Array.isArray(item.summary) ?\n item.summary\n .map((part) => (typeof part?.text === \"string\" ? part.text : \"\"))\n .filter(Boolean)\n .join(\"\\n\\n\")\n : \"\"\n appendAssistantBlock(messages, {\n type: \"thinking\",\n thinking: thinking || \"\",\n signature: item.encrypted_content ?? \"\",\n })\n}\n\nfunction translateInputToolCall(\n item: ResponseInputItem,\n kind: MessagesToolDescriptor[\"kind\"],\n messages: Array<AnthropicInputMessage>,\n registry: MessagesToolRegistry,\n): void {\n if (!isRecord(item)) {\n throw new ResponsesMessagesTranslationError(\n \"Invalid Responses tool call item\",\n )\n }\n const name = requireStringField(item, \"name\", `${kind}_tool_call`)\n const namespace = getOptionalStringField(item, \"namespace\") ?? undefined\n const toolIdentity = { kind, name, namespace }\n // Historical calls preserve conversation state; they do not define tools.\n const descriptor =\n registry.byOriginal.get(createOriginalToolKey(toolIdentity))\n ?? createMessagesToolDescriptor(toolIdentity, registry)\n const input =\n kind === \"custom\" ?\n { input: getStringField(item, \"input\") ?? \"\" }\n : parseFunctionArguments(\n getStringField(item, \"arguments\") ?? \"{}\",\n `${kind}_tool_call.arguments`,\n )\n appendAssistantBlock(messages, {\n type: \"tool_use\",\n id: requireStringField(item, \"call_id\", `${kind}_tool_call`),\n name: descriptor.alias,\n input,\n })\n}\n\nfunction translateUserContent(\n value: unknown,\n path: string,\n): string | Array<AnthropicUserContentBlock> {\n if (value === undefined || value === null) return \"\"\n if (typeof value === \"string\") return value\n if (!Array.isArray(value)) {\n throw new ResponsesMessagesTranslationError(\n `${path} must be text or an array`,\n )\n }\n return value.map((part, index) =>\n translateUserContentPart(part, `${path}[${index}]`),\n )\n}\n\nfunction translateAssistantContent(\n value: unknown,\n path: string,\n): Array<AnthropicAssistantContentBlock> {\n if (value === undefined || value === null) return []\n if (typeof value === \"string\") {\n return value ? [{ type: \"text\", text: value }] : []\n }\n if (!Array.isArray(value)) {\n throw new ResponsesMessagesTranslationError(\n `${path} must be text or an array`,\n )\n }\n return value.map((part, index) => {\n if (!isRecord(part)) {\n throw new ResponsesMessagesTranslationError(\n `${path}[${index}] must be an object`,\n )\n }\n const type = getStringField(part, \"type\")\n if (type !== \"input_text\" && type !== \"output_text\" && type !== \"text\") {\n throw new ResponsesMessagesTranslationError(\n `${path}[${index}] has unsupported assistant content type '${type ?? \"unknown\"}'`,\n )\n }\n return {\n type: \"text\" as const,\n text: requireStringField(part, \"text\", `${path}[${index}]`),\n }\n })\n}\n\nfunction translateSystemContent(value: unknown, path: string): string {\n if (value === undefined || value === null) return \"\"\n if (typeof value === \"string\") return value\n if (!Array.isArray(value)) {\n throw new ResponsesMessagesTranslationError(\n `${path} must be text or an array`,\n )\n }\n return value\n .map((part, index) => {\n if (!isRecord(part)) {\n throw new ResponsesMessagesTranslationError(\n `${path}[${index}] must be an object`,\n )\n }\n const type = getStringField(part, \"type\")\n if (type !== \"input_text\" && type !== \"output_text\" && type !== \"text\") {\n throw new ResponsesMessagesTranslationError(\n `${path}[${index}] has unsupported system content type '${type ?? \"unknown\"}'`,\n )\n }\n return requireStringField(part, \"text\", `${path}[${index}]`)\n })\n .join(\"\\n\\n\")\n}\n\nfunction translateUserContentPart(\n part: unknown,\n path: string,\n): AnthropicTextBlock | AnthropicImageBlock | AnthropicDocumentBlock {\n if (!isRecord(part)) {\n throw new ResponsesMessagesTranslationError(`${path} must be an object`)\n }\n const type = getStringField(part, \"type\")\n if (type === \"input_text\" || type === \"output_text\" || type === \"text\") {\n return { type: \"text\", text: requireStringField(part, \"text\", path) }\n }\n if (type === \"encrypted_content\") {\n return {\n type: \"text\",\n text: requireStringField(part, \"encrypted_content\", path),\n }\n }\n if (type === \"input_image\") {\n return translateImagePart(part, path)\n }\n if (type === \"input_file\") {\n return translateFilePart(part, path)\n }\n throw new ResponsesMessagesTranslationError(\n `${path} has unsupported content type '${type ?? \"unknown\"}'`,\n )\n}\n\nfunction translateToolResultContent(\n value: unknown,\n path: string,\n): string | Array<AnthropicToolResultContentBlock> {\n if (value === undefined || value === null) return \"\"\n if (typeof value === \"string\") return value\n if (!Array.isArray(value)) {\n throw new ResponsesMessagesTranslationError(\n `${path} must be text or an array`,\n )\n }\n // Codex Desktop can emit empty input_text parts in tool outputs; Anthropic\n // rejects empty text blocks, so drop them instead of failing translation.\n const blocks = value.flatMap((part, index) =>\n isEmptyTextContentPart(part) ?\n []\n : [translateUserContentPart(part, `${path}[${index}]`)],\n )\n return blocks.length > 0 ? blocks : \"\"\n}\n\nfunction isEmptyTextContentPart(part: unknown): boolean {\n if (!isRecord(part)) return false\n const type = part.type\n return (\n (type === \"input_text\" || type === \"output_text\" || type === \"text\")\n && part.text === \"\"\n )\n}\n\nfunction translateImagePart(\n part: Record<string, unknown>,\n path: string,\n): AnthropicImageBlock {\n const imageUrl = getStringField(part, \"image_url\")\n if (!imageUrl) {\n throw new ResponsesMessagesTranslationError(\n `${path} requires image_url; file_id-only images cannot be sent to Messages`,\n )\n }\n const parsed = parseDataUrl(imageUrl)\n if (\n !parsed\n || (parsed.mediaType !== \"image/jpeg\"\n && parsed.mediaType !== \"image/png\"\n && parsed.mediaType !== \"image/gif\"\n && parsed.mediaType !== \"image/webp\")\n ) {\n throw new ResponsesMessagesTranslationError(\n `${path} requires a base64 JPEG, PNG, GIF, or WebP data URL`,\n )\n }\n return {\n type: \"image\",\n source: {\n type: \"base64\",\n media_type: parsed.mediaType,\n data: parsed.data,\n },\n }\n}\n\nfunction translateFilePart(\n part: Record<string, unknown>,\n path: string,\n): AnthropicDocumentBlock {\n const fileData = getStringField(part, \"file_data\")\n if (!fileData) {\n throw new ResponsesMessagesTranslationError(\n `${path} requires file_data; file_id-only files cannot be sent to Messages`,\n )\n }\n const parsed = parseDataUrl(fileData)\n if (parsed?.mediaType !== \"application/pdf\") {\n throw new ResponsesMessagesTranslationError(\n `${path} requires a base64 PDF data URL`,\n )\n }\n return {\n type: \"document\",\n source: {\n type: \"base64\",\n media_type: \"application/pdf\",\n data: parsed.data,\n },\n title: getOptionalStringField(part, \"filename\") ?? \"document.pdf\",\n }\n}\n\nfunction translateToolChoice(\n toolChoice: ResponsesPayload[\"tool_choice\"],\n registry: MessagesToolRegistry,\n): AnthropicMessagesPayload[\"tool_choice\"] {\n if (!toolChoice) return undefined\n if (typeof toolChoice === \"string\") {\n if (toolChoice === \"required\") return { type: \"any\" }\n return { type: toolChoice }\n }\n\n const kind = (toolChoice as { type: string }).type\n if (kind !== \"function\" && kind !== \"custom\") {\n throw new ResponsesMessagesTranslationError(\n `Responses Messages fallback does not support tool_choice type '${String(kind)}'`,\n )\n }\n const rawName = (toolChoice as { name: string }).name\n const namespace = getOptionalStringField(toolChoice, \"namespace\") ?? undefined\n const descriptor = findOriginalDescriptor(registry, kind, rawName, namespace)\n if (!descriptor) {\n throw new ResponsesMessagesTranslationError(\n `tool_choice references unknown ${kind} tool '${rawName}'`,\n )\n }\n return { type: \"tool\", name: descriptor.alias }\n}\n\nfunction translateAssistantOutput(\n response: AnthropicResponse,\n registry: MessagesToolRegistry,\n): Array<ResponseOutputItem> {\n const output: Array<ResponseOutputItem> = []\n for (const [index, block] of response.content.entries()) {\n if (block.type === \"thinking\") {\n output.push({\n id: markMessagesReasoningId(\n `rs_${createStableHash(`${response.id}:${index}:reasoning`)}`,\n ),\n type: \"reasoning\",\n status: \"completed\",\n ...(block.thinking && block.thinking !== \"Thinking...\" ?\n { summary: [{ type: \"summary_text\", text: block.thinking }] }\n : {}),\n ...(block.signature ? { encrypted_content: block.signature } : {}),\n })\n continue\n }\n if (block.type === \"text\") {\n output.push({\n id: `msg_${createStableHash(`${response.id}:${index}:message`)}`,\n type: \"message\",\n role: \"assistant\",\n status: \"completed\",\n content: [\n {\n type: \"output_text\",\n text: block.text,\n annotations: [],\n },\n ],\n })\n continue\n }\n if (block.type === \"tool_use\") {\n output.push(\n translateToolUseOutput(block, registry, `${response.id}:${index}:tool`),\n )\n }\n }\n return output\n}\n\nfunction translateToolUseOutput(\n block: AnthropicToolUseBlock,\n registry: MessagesToolRegistry,\n idSeed: string,\n): ResponseOutputFunctionCall | ResponseOutputCustomToolCall {\n const descriptor = resolveToolDescriptor(registry, block.name)\n const common = {\n call_id: block.id,\n name: descriptor.name,\n status: \"completed\" as const,\n ...(descriptor.namespace ? { namespace: descriptor.namespace } : {}),\n }\n if (descriptor.kind === \"custom\") {\n return {\n ...common,\n id: `ctc_${createStableHash(idSeed)}`,\n type: \"custom_tool_call\",\n input: decodeCustomToolInput(block.input),\n }\n }\n return {\n ...common,\n id: `fc_${createStableHash(idSeed)}`,\n type: \"function_call\",\n arguments: JSON.stringify(block.input),\n }\n}\n\nfunction translateCompactionOutput(\n response: AnthropicResponse,\n): Array<ResponseOutputItem> {\n const hasToolUse = response.content.some((block) => block.type === \"tool_use\")\n if (hasToolUse) {\n throw new ResponsesMessagesTranslationError(\n \"Messages API attempted a tool call during compaction\",\n 502,\n )\n }\n const summary = extractAnthropicResponseText(response).trim()\n if (!summary) {\n throw new ResponsesMessagesTranslationError(\n \"Messages API compaction response did not contain a text summary\",\n 502,\n )\n }\n return [\n {\n id: `cmp_${createStableHash(summary)}`,\n type: \"compaction\",\n encrypted_content: encodeMessagesCompaction(summary),\n },\n ]\n}\n\nfunction extractAnthropicResponseText(response: AnthropicResponse): string {\n return response.content\n .flatMap((block) => (block.type === \"text\" ? [block.text] : []))\n .join(\"\")\n}\n\nfunction translateStopReason(stopReason: AnthropicResponse[\"stop_reason\"]): {\n status: \"completed\" | \"incomplete\"\n incompleteReason?: \"content_filter\" | \"max_output_tokens\"\n} {\n if (stopReason === \"max_tokens\") {\n return { status: \"incomplete\", incompleteReason: \"max_output_tokens\" }\n }\n if (stopReason === \"refusal\") {\n return { status: \"incomplete\", incompleteReason: \"content_filter\" }\n }\n return { status: \"completed\" }\n}\n\nfunction translateReasoningEffort(\n effort: Reasoning[\"effort\"],\n):\n | NonNullable<AnthropicMessagesPayload[\"output_config\"]>[\"effort\"]\n | undefined {\n if (effort === \"minimal\") return \"low\"\n if (\n effort === \"low\"\n || effort === \"medium\"\n || effort === \"high\"\n || effort === \"xhigh\"\n || effort === \"max\"\n ) {\n return effort\n }\n return undefined\n}\n\nfunction resolveMetadataUserId(payload: ResponsesPayload): string | undefined {\n const sessionAffinity = requestContext.getStore()?.sessionAffinity?.trim()\n if (sessionAffinity) return sessionAffinity\n const metadataUserId = payload.metadata?.user_id\n if (metadataUserId?.trim()) return metadataUserId\n if (payload.safety_identifier?.trim()) return payload.safety_identifier\n if (payload.prompt_cache_key?.trim()) return payload.prompt_cache_key\n return undefined\n}\n\nconst EPHEMERAL_CACHE_CONTROL: AnthropicCacheControl = { type: \"ephemeral\" }\n\n// Mark the stable prompt prefix for Anthropic prompt caching: the last system\n// block plus the tail block of the final user message.\nfunction applyEphemeralCacheControl(\n messages: Array<AnthropicInputMessage>,\n system: Array<AnthropicTextBlock>,\n): void {\n const lastSystemBlock = system.at(-1)\n if (lastSystemBlock) {\n lastSystemBlock.cache_control = { ...EPHEMERAL_CACHE_CONTROL }\n }\n\n const lastUserMessage = messages.findLast(\n (message): message is AnthropicUserMessage => message.role === \"user\",\n )\n if (!lastUserMessage) return\n\n if (typeof lastUserMessage.content === \"string\") {\n const textBlock: AnthropicTextBlock = {\n type: \"text\",\n text: lastUserMessage.content,\n cache_control: { ...EPHEMERAL_CACHE_CONTROL },\n }\n lastUserMessage.content = [textBlock]\n return\n }\n\n const lastBlock = lastUserMessage.content.at(-1)\n if (!lastBlock) return\n lastBlock.cache_control = { ...EPHEMERAL_CACHE_CONTROL }\n}\n\nfunction appendAssistantBlock(\n messages: Array<AnthropicInputMessage>,\n block: AnthropicAssistantContentBlock,\n): void {\n const last = messages.at(-1)\n if (last?.role === \"assistant\" && Array.isArray(last.content)) {\n last.content.push(block)\n return\n }\n const message: AnthropicAssistantMessage = {\n role: \"assistant\",\n content: [block],\n }\n messages.push(message)\n}\n\nfunction appendUserBlock(\n messages: Array<AnthropicInputMessage>,\n block: AnthropicUserContentBlock,\n): void {\n const last = messages.at(-1)\n if (last?.role === \"user\" && Array.isArray(last.content)) {\n last.content.push(block)\n return\n }\n const message: AnthropicUserMessage = { role: \"user\", content: [block] }\n messages.push(message)\n}\n\nfunction parseFunctionArguments(\n value: string,\n _path: string,\n): Record<string, unknown> {\n try {\n const parsed = JSON.parse(value) as unknown\n if (isRecord(parsed)) return parsed\n } catch {\n return {}\n }\n return {}\n}\n\nfunction parseDataUrl(\n value: string,\n): { data: string; mediaType: string } | null {\n const match = /^data:([^;,]+);base64,(.*)$/su.exec(value)\n if (!match) return null\n return { mediaType: match[1].toLowerCase(), data: match[2] }\n}\n\nfunction findOriginalDescriptor(\n registry: MessagesToolRegistry,\n kind: MessagesToolDescriptor[\"kind\"],\n name: string,\n namespace?: string,\n): MessagesToolDescriptor | undefined {\n const matches: Array<MessagesToolDescriptor> = []\n for (const descriptor of registry.byOriginal.values()) {\n if (descriptor.kind !== kind || descriptor.name !== name) continue\n if (namespace !== undefined) {\n if (descriptor.namespace === namespace) return descriptor\n continue\n }\n matches.push(descriptor)\n }\n return (\n matches.find((descriptor) => descriptor.namespace === undefined)\n ?? (matches.length === 1 ? matches[0] : undefined)\n )\n}\n\nfunction createOriginalToolKey(\n tool: Pick<MessagesToolDescriptor, \"kind\" | \"name\" | \"namespace\">,\n): string {\n return [tool.kind, tool.namespace ?? \"\", tool.name].join(\"\\u0000\")\n}\n\nfunction createToolAlias(\n preferredName: string,\n originalKey: string,\n registry: MessagesToolRegistry,\n): string {\n if (\n TOOL_NAME_PATTERN.test(preferredName)\n && !registry.byAlias.has(preferredName)\n ) {\n return preferredName\n }\n\n const sanitized = preferredName.replace(/[^A-Za-z0-9_-]+/gu, \"_\")\n const hash = createStableHash(originalKey).slice(0, 12)\n const prefix = `tool_${hash}_`\n const alias = `${prefix}${sanitized}`.slice(0, 64)\n if (!registry.byAlias.has(alias)) return alias\n return `tool_${createStableHash(`${originalKey}:collision`)}`.slice(0, 64)\n}\n\nfunction createStableHash(value: string): string {\n return createHash(\"sha256\").update(value).digest(\"hex\").slice(0, 24)\n}\n\nfunction getItemType(value: unknown): string | undefined {\n return isRecord(value) && typeof value.type === \"string\" ?\n value.type\n : undefined\n}\n\nfunction getStringField(value: unknown, field: string): string | undefined {\n if (!isRecord(value)) return undefined\n const fieldValue = value[field]\n return typeof fieldValue === \"string\" ? fieldValue : undefined\n}\n\nfunction getOptionalStringField(\n value: unknown,\n field: string,\n): string | null | undefined {\n if (!isRecord(value)) return undefined\n const fieldValue = value[field]\n return typeof fieldValue === \"string\" || fieldValue === null ?\n fieldValue\n : undefined\n}\n\nfunction requireStringField(\n value: unknown,\n field: string,\n path: string,\n): string {\n const result = getStringField(value, field)\n if (!result) {\n throw new ResponsesMessagesTranslationError(`${path}.${field} is required`)\n }\n return result\n}\n\nfunction getArrayField(value: unknown, field: string): Array<unknown> {\n if (!isRecord(value)) return []\n return Array.isArray(value[field]) ? value[field] : []\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n}\n","import type {\n ResponseContextManagementCompactionItem,\n ResponseCustomToolCallOutputItem,\n ResponseFunctionCallOutputItem,\n ResponseInputContent,\n ResponseInputImage,\n ResponseInputItem,\n ResponseInputMessage,\n ResponsesPayload,\n ResponsesTransport,\n} from \"~/lib/types/responses\"\n\nimport { COMPACT_REQUEST, type CompactType } from \"~/lib/compact\"\nimport {\n getModelResponsesApiCompactThreshold as getConfiguredModelResponsesApiCompactThreshold,\n isContextManagementEnabledForMessages as isConfiguredContextManagementEnabledForMessages,\n isContextManagementEnabledForResponses as isConfiguredContextManagementEnabledForResponses,\n isGpt56OrAbove,\n isResponsesApiWebSocketEnabled as isConfiguredResponsesApiWebSocketEnabled,\n} from \"~/lib/config\"\nimport {\n resolveSupportedReasoningEffort,\n type ResponsesReasoningEffort,\n} from \"~/lib/reasoning-effort\"\n\nimport { isMessagesReasoningId } from \"./messages-translation\"\n\nexport const RESPONSES_ENDPOINT = \"/responses\"\nexport const RESPONSES_WS_ENDPOINT = \"ws:/responses\"\nexport const DEFAULT_RESPONSES_COMPACT_THRESHOLD_RATIO = 0.85\nexport type ResponsesApiContextManagementSource = \"messages\" | \"responses\"\n\nexport const normalizeResponsesReasoningEffort = (\n payload: ResponsesPayload,\n supportedEfforts: Array<string> | undefined,\n): { from: string; to: ResponsesReasoningEffort } | undefined => {\n if (!payload.reasoning || typeof payload.reasoning.effort !== \"string\") {\n return undefined\n }\n\n const resolvedEffort = resolveSupportedReasoningEffort(\n payload.reasoning.effort,\n supportedEfforts,\n )\n if (!resolvedEffort || resolvedEffort === payload.reasoning.effort) {\n return undefined\n }\n\n const requestedEffort = payload.reasoning.effort\n payload.reasoning.effort = resolvedEffort\n return { from: requestedEffort, to: resolvedEffort }\n}\n\nexport const responsesUtilsDependencies = {\n getModelResponsesApiCompactThreshold:\n getConfiguredModelResponsesApiCompactThreshold,\n isContextManagementEnabledForMessages:\n isConfiguredContextManagementEnabledForMessages,\n isContextManagementEnabledForResponses:\n isConfiguredContextManagementEnabledForResponses,\n isGpt56OrAbove,\n isResponsesApiWebSocketEnabled: isConfiguredResponsesApiWebSocketEnabled,\n}\n\nexport const getResponsesRequestOptions = (\n payload: ResponsesPayload,\n): { vision: boolean; initiator: \"agent\" | \"user\" } => {\n const vision = hasVisionInput(payload)\n const initiator = hasAgentInitiator(payload) ? \"agent\" : \"user\"\n\n return { vision, initiator }\n}\n\nexport const getResponsesTransportForModel = (\n selectedModel:\n | {\n supported_endpoints?: Array<string>\n }\n | undefined,\n options: {\n compactType?: CompactType\n } = {},\n): ResponsesTransport | null => {\n const supportedEndpoints = selectedModel?.supported_endpoints ?? []\n const useWebSocket =\n responsesUtilsDependencies.isResponsesApiWebSocketEnabled()\n\n if (\n options.compactType !== COMPACT_REQUEST\n && useWebSocket\n && supportedEndpoints.includes(RESPONSES_WS_ENDPOINT)\n ) {\n return \"websocket\"\n }\n\n if (supportedEndpoints.includes(RESPONSES_ENDPOINT)) {\n return \"http\"\n }\n\n return null\n}\n\nexport const hasAgentInitiator = (payload: ResponsesPayload): boolean => {\n // Refactor `isAgentCall` logic to check only the last message in the history rather than any message. This prevents valid user messages from being incorrectly flagged as agent calls due to previous assistant history, ensuring proper credit consumption for multi-turn conversations.\n const lastItem = getPayloadItems(payload).at(-1)\n if (!lastItem) {\n return false\n }\n if (!(\"role\" in lastItem) || !lastItem.role) {\n return true\n }\n const role =\n typeof lastItem.role === \"string\" ? lastItem.role.toLowerCase() : \"\"\n return role === \"assistant\"\n}\n\nexport const hasVisionInput = (payload: ResponsesPayload): boolean => {\n const values = getPayloadItems(payload)\n return values.some((item) => containsVisionContent(item))\n}\n\nconst DATA_URL_PREFIX = \"data:\"\n// Static 96x32 PNG reading \"Image too large / Redacted\".\nconst REDACTED_IMAGE_PLACEHOLDER_DATA_URL =\n \"data:image/png;base64,\"\n + [\n \"iVBORw0KGgoAAAANSUhEUgAAAGAAAAAgCAMAAADaHo1mAAADAFBMVEX///8fKTfR1dsAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\",\n \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\",\n \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\",\n \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\",\n \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\",\n \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\",\n \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\",\n \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\",\n \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\",\n \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\",\n \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\",\n \"AAAAAAAAAAAAAAAAAAAAAACae8QWAAAAvElEQVR42u1WixKAIAhj/f9Hdz2BXJiVed3pVSYtpgwsGSo3GaRq6wSd4F8EyIJx\",\n \"ydSUAMB8il51sHT2fiVQu8czguQwXWAyFvswIJhmoS9gmzYlcFiHj1aAgzcJVgCyguYhAhNZmMhYQZs1EJnnIAqKiuHjSrZT\",\n \"ucSQ4s8JkKDDIYr3IuR8vEWgqroKP9b1bYKk2wfgeVmqATQLXdXamsXdEKkz3QXEEeTTuWWImMhW6qci94/+hwSVf99HqVoD\",\n \"OAuj2SEAAAAASUVORK5CYII=\",\n ].join(\"\")\n\nconst COPILOT_UNSUPPORTED_INPUT_ITEM_FIELDS = [\n \"internal_chat_message_metadata_passthrough\",\n] as const\n\nexport const sanitizeUnsupportedInputFields = (\n payload: ResponsesPayload,\n): number => {\n if (!Array.isArray(payload.input)) {\n return 0\n }\n\n let removedFieldCount = 0\n for (const item of payload.input) {\n if (typeof item !== \"object\" || item === null) {\n continue\n }\n\n const record = item as Record<string, unknown>\n for (const field of COPILOT_UNSUPPORTED_INPUT_ITEM_FIELDS) {\n if (!Object.hasOwn(record, field)) {\n continue\n }\n\n delete record[field]\n removedFieldCount += 1\n }\n }\n\n return removedFieldCount\n}\n\nexport const sanitizeOversizedInputImages = (\n payload: ResponsesPayload,\n maxPromptImageSize?: number,\n): number => {\n const limit =\n typeof maxPromptImageSize === \"number\" && maxPromptImageSize > 0 ?\n maxPromptImageSize\n : undefined\n\n if (limit === undefined || !Array.isArray(payload.input)) {\n return 0\n }\n\n return sanitizeInputImages(\n payload.input,\n (image) => image.decodedBytes > limit,\n )\n}\n\nexport const sanitizeAllInputImages = (payload: ResponsesPayload): number => {\n if (!Array.isArray(payload.input)) {\n return 0\n }\n\n return sanitizeInputImages(payload.input, () => true)\n}\n\nexport const normalizeInputImageDetails = (\n payload: ResponsesPayload,\n): number => {\n if (!Array.isArray(payload.input)) {\n return 0\n }\n\n let normalizedCount = 0\n for (const image of collectInputImages(payload.input)) {\n if (\n image.detail === undefined\n || VALID_INPUT_IMAGE_DETAILS.has(image.detail)\n ) {\n continue\n }\n\n image.detail = \"auto\"\n normalizedCount += 1\n }\n\n return normalizedCount\n}\n\ninterface InputImageDataUrl {\n decodedBytes: number\n record: ResponseInputImage\n}\n\nconst sanitizeInputImages = (\n input: Array<ResponseInputItem>,\n shouldReplace: (image: InputImageDataUrl) => boolean,\n): number => {\n let count = 0\n for (const record of collectInputImages(input)) {\n const image = getInputImageDataUrl(record)\n if (!image) {\n continue\n }\n\n if (!shouldReplace(image)) {\n continue\n }\n\n replaceInputImageWithPlaceholder(image)\n count += 1\n }\n\n return count\n}\n\nconst collectInputImages = (\n input: Array<ResponseInputItem>,\n images: Array<ResponseInputImage> = [],\n): Array<ResponseInputImage> => {\n for (const item of input) {\n if (isResponseInputMessage(item)) {\n collectContentImages(item.content, images)\n } else if (isResponseFunctionCallOutputItem(item)) {\n collectContentImages(item.output, images)\n }\n }\n\n return images\n}\n\nconst collectContentImages = (\n content: string | Array<ResponseInputContent> | undefined,\n images: Array<ResponseInputImage>,\n): void => {\n if (!Array.isArray(content)) {\n return\n }\n\n for (const block of content) {\n if (isResponseInputImage(block)) {\n images.push(block)\n }\n }\n}\n\nconst getInputImageDataUrl = (\n image: ResponseInputImage,\n): InputImageDataUrl | null => {\n if (typeof image.image_url !== \"string\") {\n return null\n }\n\n const imageUrl = image.image_url\n if (!imageUrl.startsWith(DATA_URL_PREFIX)) {\n return null\n }\n\n const decodedBytes = estimateDataUrlByteLength(imageUrl)\n\n return {\n decodedBytes,\n record: image,\n }\n}\n\nconst estimateDataUrlByteLength = (value: string): number => {\n return Math.max(0, Math.floor((value.length * 3) / 4))\n}\n\nconst replaceInputImageWithPlaceholder = (image: InputImageDataUrl): void => {\n image.record.type = \"input_image\"\n image.record.image_url = REDACTED_IMAGE_PLACEHOLDER_DATA_URL\n image.record.detail = \"low\"\n delete image.record.file_id\n}\n\nconst VALID_INPUT_IMAGE_DETAILS: ReadonlySet<\n NonNullable<ResponseInputImage[\"detail\"]>\n> = new Set([\"auto\", \"high\", \"low\"])\n\nconst isResponseInputMessage = (\n item: ResponseInputItem,\n): item is ResponseInputMessage => {\n return (\n typeof item === \"object\"\n && item !== null\n && \"role\" in item\n && typeof item.role === \"string\"\n )\n}\n\nconst isResponseFunctionCallOutputItem = (\n item: ResponseInputItem,\n): item is\n | ResponseCustomToolCallOutputItem\n | ResponseFunctionCallOutputItem => {\n return (\n typeof item === \"object\"\n && item !== null\n && \"type\" in item\n && (item.type === \"custom_tool_call_output\"\n || item.type === \"function_call_output\")\n )\n}\n\nconst isResponseInputImage = (\n content: ResponseInputContent,\n): content is ResponseInputImage => {\n return (\n typeof content === \"object\"\n && content !== null\n && \"type\" in content\n && content.type === \"input_image\"\n )\n}\n\nexport const resolveResponsesCompactThreshold = (\n maxPromptTokens?: number,\n compactThresholdRatio = DEFAULT_RESPONSES_COMPACT_THRESHOLD_RATIO,\n): number => {\n if (typeof maxPromptTokens === \"number\" && maxPromptTokens > 0) {\n return Math.floor(maxPromptTokens * compactThresholdRatio)\n }\n\n return 200_000 * compactThresholdRatio\n}\n\nconst getModelResponsesApiCompactThreshold = (\n model: string,\n): number | undefined => {\n const threshold =\n responsesUtilsDependencies.getModelResponsesApiCompactThreshold(model)\n\n if (\n typeof threshold !== \"number\"\n || !Number.isFinite(threshold)\n || threshold <= 0\n ) {\n return undefined\n }\n\n return threshold\n}\n\nconst createCompactionContextManagement = (\n compactThreshold: number,\n): Array<ResponseContextManagementCompactionItem> => [\n {\n type: \"compaction\",\n compact_threshold: compactThreshold,\n },\n]\n\nexport const filterReasoningForTransport = (\n payload: ResponsesPayload,\n useMessagesFallback: boolean,\n): void => {\n if (!Array.isArray(payload.input)) return\n\n payload.input = payload.input.filter((item) => {\n if (item.type !== \"reasoning\") return true\n return isMessagesReasoningId(item.id) === useMessagesFallback\n })\n}\n\nexport const applyResponsesApiContextManagement = (\n payload: ResponsesPayload,\n maxPromptTokens: number | undefined,\n options: {\n compactThresholdRatio?: number\n source: ResponsesApiContextManagementSource\n },\n): boolean => {\n if (!payload.model.startsWith(\"gpt\")) {\n return false\n }\n\n if (responsesUtilsDependencies.isGpt56OrAbove(payload.model)) {\n return false\n }\n\n if (hasTerminalCompactionTrigger(payload)) {\n return isContextManagementEnabledForSource(options.source)\n }\n\n if (payload.context_management !== undefined) {\n return true\n }\n\n if (!isContextManagementEnabledForSource(options.source)) {\n return false\n }\n\n const modelCompactThreshold = getModelResponsesApiCompactThreshold(\n payload.model,\n )\n payload.context_management = createCompactionContextManagement(\n modelCompactThreshold\n ?? resolveResponsesCompactThreshold(\n maxPromptTokens,\n options.compactThresholdRatio\n ?? DEFAULT_RESPONSES_COMPACT_THRESHOLD_RATIO,\n ),\n )\n return true\n}\n\nconst isContextManagementEnabledForSource = (\n source: ResponsesApiContextManagementSource,\n): boolean => {\n if (source === \"messages\") {\n return responsesUtilsDependencies.isContextManagementEnabledForMessages()\n }\n\n return responsesUtilsDependencies.isContextManagementEnabledForResponses()\n}\n\nconst hasTerminalCompactionTrigger = (payload: ResponsesPayload): boolean => {\n const { input } = payload\n if (!Array.isArray(input) || input.length === 0) {\n return false\n }\n\n return isResponseInputItemType(input.at(-1), \"compaction_trigger\")\n}\n\nexport const compactInputByLatestCompaction = (\n payload: ResponsesPayload,\n): void => {\n if (!Array.isArray(payload.input) || payload.input.length === 0) {\n return\n }\n\n const latestCompactionMessageIndex = getLatestCompactionMessageIndex(\n payload.input,\n )\n\n if (latestCompactionMessageIndex === undefined) {\n return\n }\n\n payload.input = payload.input.slice(latestCompactionMessageIndex)\n}\n\nconst getLatestCompactionMessageIndex = (\n input: Array<ResponseInputItem>,\n): number | undefined => {\n for (let index = input.length - 1; index >= 0; index -= 1) {\n if (isCompactionInputItem(input[index])) {\n return index\n }\n }\n\n return undefined\n}\n\nconst isCompactionInputItem = (value: ResponseInputItem): boolean => {\n return isResponseInputItemType(value, \"compaction\")\n}\n\nconst isResponseInputItemType = (value: unknown, type: string): boolean => {\n return (\n typeof value === \"object\"\n && value !== null\n && \"type\" in value\n && value.type === type\n )\n}\n\nconst getPayloadItems = (\n payload: ResponsesPayload,\n): Array<ResponseInputItem> => {\n const result: Array<ResponseInputItem> = []\n\n const { input } = payload\n\n if (Array.isArray(input)) {\n result.push(...input)\n }\n\n return result\n}\n\nconst containsVisionContent = (value: unknown): boolean => {\n if (!value) return false\n\n if (Array.isArray(value)) {\n return value.some((entry) => containsVisionContent(entry))\n }\n\n if (typeof value !== \"object\") {\n return false\n }\n\n const record = value as Record<string, unknown>\n const type =\n typeof record.type === \"string\" ? record.type.toLowerCase() : undefined\n\n if (type === \"input_image\") {\n return true\n }\n\n if (Array.isArray(record.content)) {\n return record.content.some((entry) => containsVisionContent(entry))\n }\n\n return false\n}\n","import type { ConsolaInstance } from \"consola\"\nimport type { Context } from \"hono\"\n\nimport { streamSSE } from \"hono/streaming\"\n\nimport type { CompactType } from \"~/lib/compact\"\nimport type { SubagentMarker } from \"~/lib/subagent\"\nimport type { Model } from \"~/lib/types/models\"\n\nimport {\n getMessageApiWebSearchModel,\n isResponsesApiWebSearchEnabled,\n} from \"~/lib/config\"\nimport { findEndpointModel } from \"~/lib/models\"\nimport {\n parseProviderModelAlias,\n type ProviderModelAlias,\n} from \"~/lib/provider-model\"\nimport {\n ensureConfiguredProviderModelAlias,\n resolveProviderConfig,\n type ProviderConfigResolver,\n} from \"~/lib/provider-resolver\"\nimport {\n createCopilotTokenUsageRecorder,\n normalizeOptionalToken,\n normalizeResponsesUsage,\n type UsageTokens,\n} from \"~/lib/token-usage\"\nimport {\n generateRequestIdFromPayload,\n getRootSessionId,\n getUUID,\n parseUserIdMetadata,\n} from \"~/lib/utils\"\nimport type {\n ResponsesPayload,\n ResponsesResult,\n ResponsesStream,\n} from \"~/lib/types/responses\"\nimport { createResponses as createCopilotResponses } from \"~/services/copilot/create-responses\"\n\nimport type {\n AnthropicContentBlockStartEvent,\n AnthropicMessagesPayload,\n AnthropicResponse,\n AnthropicStreamEventData,\n AnthropicTextBlock,\n AnthropicTool,\n AnthropicWebSearchContentBlock,\n AnthropicWebSearchResultItem,\n} from \"~/lib/types/anthropic\"\nimport { normalizeSystemMessages } from \"../preprocess\"\nimport { collectResponsesStreamResult } from \"../responses-stream-collection\"\nimport { translateAnthropicMessagesToResponsesPayload } from \"../responses-translation\"\nimport {\n getResponsesRequestOptions,\n getResponsesTransportForModel,\n} from \"../../responses/utils\"\nimport {\n buildResponsesWebSearchTool,\n extractWebSearchResult,\n type WebSearchExtract,\n type WebSearchToolConfig,\n} from \"./backend\"\nimport { debugJson } from \"~/lib/logger\"\n\nexport const webSearchFlowDependencies = {\n createResponses: createCopilotResponses,\n resolveProviderConfig,\n createUsageRecorder: (\n payload: AnthropicMessagesPayload,\n sessionId?: string,\n webSearchModel?: string,\n ): ((usage: UsageTokens) => void) =>\n createCopilotTokenUsageRecorder({\n endpoint: \"responses\",\n fallbackSessionId: sessionId,\n model: webSearchModel ?? payload.model,\n sessionId: parseUserIdMetadata(payload.metadata?.user_id).sessionId,\n }),\n}\n\nexport interface WebSearchFlowOptions {\n logger: ConsolaInstance\n subagentMarker?: SubagentMarker | null\n /** GPT (Responses-capable) model the web search request is switched to. */\n webSearchModel: string\n requestId: string\n sessionId?: string\n compactType?: CompactType\n}\n\nconst isWebSearchServerTool = (tool: AnthropicTool): boolean =>\n typeof tool.type === \"string\"\n && tool.type.startsWith(\"web_search\")\n && !tool.input_schema\n\n/** True when the payload carries an Anthropic server-side web_search tool. */\nexport const hasWebSearchServerTool = (\n payload: AnthropicMessagesPayload,\n): boolean =>\n Array.isArray(payload.tools) && payload.tools.some(isWebSearchServerTool)\n\n/**\n * True when web_search is the ONLY tool in the request. Mixing web_search with\n * other tools is intentionally unsupported, so only these requests are switched\n * to the web search model.\n */\nexport const isWebSearchOnlyRequest = (\n payload: AnthropicMessagesPayload,\n): boolean =>\n Array.isArray(payload.tools)\n && payload.tools.length > 0\n && payload.tools.every(isWebSearchServerTool)\n\n/** Removes web_search server tools (used for unsupported mixed-tool requests). */\nexport const stripWebSearchServerTool = (\n payload: AnthropicMessagesPayload,\n): void => {\n if (!Array.isArray(payload.tools)) return\n payload.tools = payload.tools.filter((tool) => !isWebSearchServerTool(tool))\n}\n\n/**\n * Decides how a web-search request should be handled. Pure so the routing is\n * unit-testable (the provider resolver is injectable). Assumes the caller\n * already confirmed a web_search tool exists.\n *\n * - `provider`: messageApiWebSearchModel is a `provider/model` alias whose\n * provider is actually configured and whose message API supports websearch\n * natively — pass the tool straight through.\n * - `responses`: a Copilot GPT model — run it via the /responses web_search.\n * - `strip`: mixing with other tools, no model configured, or web search off —\n * drop the tool and continue normally. An alias pointing at an unconfigured\n * provider also strips: routing it would 404, and the \"provider/model\"\n * string is not a usable Copilot model id for the responses path.\n */\nexport type WebSearchRoute =\n | { kind: \"provider\"; alias: ProviderModelAlias }\n | { kind: \"responses\"; model: string }\n | { kind: \"strip\" }\n\nexport const resolveWebSearchRoute = async (\n payload: AnthropicMessagesPayload,\n options: {\n webSearchModel?: string\n responsesWebSearchEnabled: boolean\n resolveProviderConfig?: ProviderConfigResolver\n },\n): Promise<WebSearchRoute> => {\n const { webSearchModel, responsesWebSearchEnabled } = options\n if (!webSearchModel || !isWebSearchOnlyRequest(payload)) {\n return { kind: \"strip\" }\n }\n const alias = parseProviderModelAlias(webSearchModel)\n if (alias) {\n const configuredAlias = await ensureConfiguredProviderModelAlias(\n alias,\n options.resolveProviderConfig ?? resolveProviderConfig,\n )\n return configuredAlias ?\n { kind: \"provider\", alias: configuredAlias }\n : { kind: \"strip\" }\n }\n if (responsesWebSearchEnabled) {\n return { kind: \"responses\", model: webSearchModel }\n }\n return { kind: \"strip\" }\n}\n\nexport const extractWebSearchConfig = (\n payload: AnthropicMessagesPayload,\n): WebSearchToolConfig => {\n const tool = payload.tools?.find(isWebSearchServerTool)\n return {\n allowedDomains: tool?.allowed_domains,\n blockedDomains: tool?.blocked_domains,\n userLocation: tool?.user_location,\n }\n}\n\nconst buildWebSearchResultBlock = (\n toolUseId: string,\n extract: WebSearchExtract,\n): AnthropicWebSearchContentBlock => {\n const items: Array<AnthropicWebSearchResultItem> = extract.sources.map(\n (source) => ({\n type: \"web_search_result\",\n url: source.url,\n title: source.title,\n page_age: source.page_age ?? null,\n encrypted_content: \"\",\n }),\n )\n return {\n type: \"web_search_tool_result\",\n tool_use_id: toolUseId,\n content: items,\n }\n}\n\n/**\n * Reconstructs a native Anthropic assistant response from the GPT web search\n * result: one server_tool_use + web_search_tool_result pair, then the answer.\n */\nconst buildResponseContent = (\n requestId: string,\n extract: WebSearchExtract,\n): Array<AnthropicTextBlock | AnthropicWebSearchContentBlock> => {\n const blocks: Array<AnthropicTextBlock | AnthropicWebSearchContentBlock> = []\n const query = extract.queries[0] ?? \"\"\n if (extract.sources.length > 0 || query) {\n const toolUseId = `srvtoolu_${getUUID(requestId)}`\n blocks.push(\n {\n type: \"server_tool_use\",\n id: toolUseId,\n name: \"web_search\",\n input: { query },\n },\n buildWebSearchResultBlock(toolUseId, extract),\n )\n }\n blocks.push({ type: \"text\", text: extract.answerText })\n return blocks\n}\n\nexport const prepareWebSearchResponsesPayload = (\n payload: AnthropicMessagesPayload,\n options: {\n model?: string\n subagentAgentId?: string | null\n } = {},\n): ResponsesPayload => {\n const config = extractWebSearchConfig(payload)\n const switchedPayload: AnthropicMessagesPayload = {\n ...payload,\n model: options.model ?? payload.model,\n tools: [],\n stream: true,\n }\n\n const responsesPayload = translateAnthropicMessagesToResponsesPayload(\n switchedPayload,\n options.subagentAgentId,\n )\n responsesPayload.tools = [\n buildResponsesWebSearchTool({ ...config, searchContextSize: \"low\" }),\n ]\n responsesPayload.tool_choice = undefined\n responsesPayload.reasoning = {\n effort: \"low\",\n summary: \"auto\",\n }\n return responsesPayload\n}\n\nexport const reconstructWebSearchResponse = (\n payload: AnthropicMessagesPayload,\n result: ResponsesResult,\n options: { requestId: string },\n): {\n extract: WebSearchExtract\n response: AnthropicResponse<\n AnthropicTextBlock | AnthropicWebSearchContentBlock\n >\n} => {\n const extract = extractWebSearchResult(result)\n const response: AnthropicResponse<\n AnthropicTextBlock | AnthropicWebSearchContentBlock\n > = {\n id: result.id || getUUID(options.requestId),\n type: \"message\",\n role: \"assistant\",\n content: buildResponseContent(options.requestId, extract),\n model: payload.model,\n stop_reason: \"end_turn\",\n stop_sequence: null,\n usage: {\n input_tokens: result.usage?.input_tokens ?? 0,\n output_tokens: result.usage?.output_tokens ?? 0,\n server_tool_use: {\n web_search_requests: Math.max(extract.queries.length, 1),\n },\n },\n }\n\n return { extract, response }\n}\n\nconst isWebSearchResponsesStream = (\n value: unknown,\n): value is ResponsesStream => {\n return (\n Boolean(value)\n && typeof (value as ResponsesStream)[Symbol.asyncIterator] === \"function\"\n )\n}\n\nconst createUsageRecorder = (\n payload: AnthropicMessagesPayload,\n sessionId?: string,\n webSearchModel?: string,\n): ((usage: UsageTokens) => void) =>\n webSearchFlowDependencies.createUsageRecorder(\n payload,\n sessionId,\n webSearchModel,\n )\n\n/**\n * Entry point for web-search detection and routing on /v1/messages.\n * Called after model mapping but before provider alias resolution and\n * preprocessing. Returns a Response when web search is handled (provider\n * reroute or responses-native), or `null` when no web_search tool is\n * present or the tool was stripped (caller continues normal flow).\n *\n * Uses a callback for provider forwarding to avoid circular imports.\n */\nexport const tryHandleWebSearch = async (\n c: Context,\n payload: AnthropicMessagesPayload,\n options: {\n logger: ConsolaInstance\n forwardToProvider: (\n c: Context,\n payload: AnthropicMessagesPayload,\n provider: string,\n ) => Promise<Response>\n },\n): Promise<Response | null> => {\n if (!hasWebSearchServerTool(payload)) return null\n\n normalizeSystemMessages(payload)\n\n const route = await resolveWebSearchRoute(payload, {\n webSearchModel: getMessageApiWebSearchModel(),\n responsesWebSearchEnabled: isResponsesApiWebSearchEnabled(),\n resolveProviderConfig: webSearchFlowDependencies.resolveProviderConfig,\n })\n\n if (route.kind === \"provider\") {\n payload.model = route.alias.model\n return await options.forwardToProvider(c, payload, route.alias.provider)\n }\n\n if (route.kind === \"responses\") {\n let sessionId = getRootSessionId(payload, c)\n const requestId = generateRequestIdFromPayload(payload, sessionId)\n if (!sessionId) {\n sessionId = getUUID(requestId)\n }\n return await handleWebSearchViaResponses(c, payload, {\n subagentMarker: null,\n webSearchModel: route.model,\n requestId,\n sessionId,\n compactType: 0,\n logger: options.logger,\n })\n }\n\n stripWebSearchServerTool(payload)\n return null\n}\n\n/**\n * Handles a web-search-only Claude (Messages API) request by switching it to a\n * Responses-capable GPT model (`webSearchModel`), running Copilot's native\n * /responses web_search in a single call, and reconstructing native Anthropic\n * server_tool_use + web_search_tool_result blocks. Streaming and non-streaming\n * are both supported (streaming replays the result as a synthetic SSE stream).\n */\nexport const handleWebSearchViaResponses = async (\n c: Context,\n payload: AnthropicMessagesPayload,\n options: WebSearchFlowOptions,\n) => {\n const { logger, webSearchModel } = options\n const wantsStream = Boolean(payload.stream)\n\n // Switch to the GPT web search model and drop the Anthropic server tool so the\n // standard Anthropic -> Responses translation does not choke on it; the\n // Responses web_search tool is attached to the translated payload instead.\n const responsesPayload = prepareWebSearchResponsesPayload(payload, {\n model: webSearchModel,\n subagentAgentId: options.subagentMarker?.agent_id,\n })\n\n const selectedModel: Model | undefined = findEndpointModel(webSearchModel)\n const { vision, initiator } = getResponsesRequestOptions(responsesPayload)\n const transport =\n getResponsesTransportForModel(selectedModel, {\n compactType: options.compactType,\n }) ?? \"http\"\n\n debugJson(\n logger,\n `Switching web search request to model: ${webSearchModel}`,\n responsesPayload,\n )\n\n const upstreamResult = await webSearchFlowDependencies.createResponses(\n responsesPayload,\n {\n vision,\n initiator,\n transport,\n subagentMarker: options.subagentMarker,\n requestId: options.requestId,\n sessionId: options.sessionId,\n signal: c.req?.raw?.signal,\n compactType: options.compactType,\n },\n )\n\n const result =\n isWebSearchResponsesStream(upstreamResult) ?\n await collectResponsesStreamResult({\n errorMessagePrefix: \"Web search responses stream\",\n upstreamResponse: upstreamResult,\n logger,\n })\n : upstreamResult\n\n const { extract, response } = reconstructWebSearchResponse(payload, result, {\n requestId: options.requestId,\n })\n\n debugJson(\n logger,\n `Web search via responses: ${extract.queries.length} quer(y/ies), ${extract.sources.length} source(s)`,\n result,\n )\n\n const recordUsage = createUsageRecorder(\n payload,\n options.sessionId,\n webSearchModel,\n )\n recordUsage({\n ...normalizeResponsesUsage(result.usage),\n total_nano_aiu: normalizeOptionalToken(\n result.copilot_usage?.total_nano_aiu,\n ),\n })\n\n if (!wantsStream) {\n return c.json(response)\n }\n\n return streamSSE(c, async (stream) => {\n for (const event of buildSyntheticStreamEvents(response)) {\n const data = JSON.stringify(event)\n logger.debug(`Web search stream event`, data)\n await stream.writeSSE({\n event: event.type,\n data: data,\n })\n }\n })\n}\n\nconst blockToStreamEvents = (\n block: AnthropicTextBlock | AnthropicWebSearchContentBlock,\n index: number,\n): Array<AnthropicStreamEventData> => {\n const start = (\n contentBlock: AnthropicContentBlockStartEvent[\"content_block\"],\n ): AnthropicContentBlockStartEvent => ({\n type: \"content_block_start\",\n index,\n content_block: contentBlock,\n })\n const stop: AnthropicStreamEventData = {\n type: \"content_block_stop\",\n index,\n }\n\n switch (block.type) {\n case \"text\": {\n return [\n start({ type: \"text\", text: \"\" }),\n {\n type: \"content_block_delta\",\n index,\n delta: { type: \"text_delta\", text: block.text },\n },\n stop,\n ]\n }\n case \"server_tool_use\": {\n return [\n start({\n type: \"server_tool_use\",\n id: block.id,\n name: block.name,\n input: {},\n }),\n {\n type: \"content_block_delta\",\n index,\n delta: {\n type: \"input_json_delta\",\n partial_json: JSON.stringify(block.input),\n },\n },\n stop,\n ]\n }\n case \"web_search_tool_result\": {\n // Full block delivered in content_block_start (Anthropic convention).\n return [start(block), stop]\n }\n default: {\n return [start(block), stop]\n }\n }\n}\n\nexport const buildSyntheticStreamEvents = (\n response: AnthropicResponse<\n AnthropicTextBlock | AnthropicWebSearchContentBlock\n >,\n): Array<AnthropicStreamEventData> => {\n const events: Array<AnthropicStreamEventData> = []\n\n events.push({\n type: \"message_start\",\n message: {\n id: response.id,\n type: \"message\",\n role: \"assistant\",\n content: [],\n model: response.model,\n stop_reason: null,\n stop_sequence: null,\n usage: { ...response.usage, output_tokens: 0 },\n },\n })\n\n response.content.forEach((block, index) => {\n events.push(...blockToStreamEvents(block, index))\n })\n\n events.push(\n {\n type: \"message_delta\",\n delta: {\n stop_reason: response.stop_reason,\n stop_sequence: response.stop_sequence,\n },\n usage: { output_tokens: response.usage.output_tokens },\n },\n { type: \"message_stop\" },\n )\n\n return events\n}\n","import type { Model, ModelsResponse } from \"~/lib/types/models\"\nimport {\n buildCodexRequestHeaders,\n CODEX_API_BASE_URL,\n} from \"~/services/codex/create-responses\"\n\ninterface CodexModelDefinition {\n contextWindow: number\n id: string\n input: Array<\"text\" | \"image\">\n maxTokens: number\n name: string\n reasoningEfforts: Array<string>\n}\n\nconst CODEX_MODELS: Array<CodexModelDefinition> = [\n {\n contextWindow: 100_000,\n id: \"gpt-5.3-codex-spark\",\n input: [\"text\"],\n maxTokens: 32_000,\n name: \"GPT-5.3 Codex Spark\",\n reasoningEfforts: [\"minimal\", \"low\", \"medium\", \"high\", \"xhigh\"],\n },\n {\n contextWindow: 272_000,\n id: \"gpt-5.4-mini\",\n input: [\"text\", \"image\"],\n maxTokens: 128_000,\n name: \"GPT-5.4 mini\",\n reasoningEfforts: [\"minimal\", \"low\", \"medium\", \"high\", \"xhigh\"],\n },\n {\n contextWindow: 272_000,\n id: \"gpt-5.5\",\n input: [\"text\", \"image\"],\n maxTokens: 128_000,\n name: \"GPT-5.5\",\n reasoningEfforts: [\"minimal\", \"low\", \"medium\", \"high\", \"xhigh\"],\n },\n {\n contextWindow: 872_000,\n id: \"gpt-5.6-sol\",\n input: [\"text\", \"image\"],\n maxTokens: 128_000,\n name: \"GPT-5.6 Sol\",\n reasoningEfforts: [\"none\", \"low\", \"medium\", \"high\", \"xhigh\", \"max\"],\n },\n {\n contextWindow: 872_000,\n id: \"gpt-5.6-terra\",\n input: [\"text\", \"image\"],\n maxTokens: 128_000,\n name: \"GPT-5.6 Terra\",\n reasoningEfforts: [\"none\", \"low\", \"medium\", \"high\", \"xhigh\", \"max\"],\n },\n {\n contextWindow: 872_000,\n id: \"gpt-5.6-luna\",\n input: [\"text\", \"image\"],\n maxTokens: 128_000,\n name: \"GPT-5.6 Luna\",\n reasoningEfforts: [\"none\", \"low\", \"medium\", \"high\", \"xhigh\", \"max\"],\n },\n {\n contextWindow: 872_000,\n id: \"gpt-6-astra\",\n input: [\"text\", \"image\"],\n maxTokens: 128_000,\n name: \"GPT-6 Astra\",\n reasoningEfforts: [\"low\", \"medium\", \"high\", \"xhigh\", \"max\"],\n },\n]\n\nconst CODEX_MODELS_URL = `${CODEX_API_BASE_URL}/codex/models`\nconst CODEX_MODELS_TIMEOUT_MS = 15_000\n\nexport function resolveCodexModelsUrl(requestUrl: string): string {\n const upstreamUrl = new URL(CODEX_MODELS_URL)\n upstreamUrl.search = new URL(requestUrl, \"http://localhost\").search\n return upstreamUrl.toString()\n}\n\nexport async function forwardCodexModels(\n requestUrl: string,\n requestHeaders: Headers,\n): Promise<Response> {\n const headers = buildCodexRequestHeaders(requestHeaders)\n if (!headers.has(\"accept\")) {\n headers.set(\"accept\", \"application/json\")\n }\n\n return await fetch(resolveCodexModelsUrl(requestUrl), {\n method: \"GET\",\n headers,\n signal: AbortSignal.timeout(CODEX_MODELS_TIMEOUT_MS),\n })\n}\n\nfunction normalizeCodexModel(model: CodexModelDefinition): Model {\n const supportsVision = model.input.includes(\"image\")\n\n return {\n capabilities: {\n family: \"gpt\",\n limits: {\n max_context_window_tokens: model.contextWindow,\n max_output_tokens: model.maxTokens,\n max_prompt_tokens: model.contextWindow,\n },\n object: \"model_capabilities\",\n supports: {\n adaptive_thinking: true,\n parallel_tool_calls: true,\n reasoning_effort: model.reasoningEfforts,\n streaming: true,\n tool_calls: true,\n vision: supportsVision,\n },\n tokenizer: \"o200k_base\",\n type: \"chat\",\n },\n id: model.id,\n model_picker_enabled: true,\n name: model.name,\n object: \"model\",\n preview: false,\n supported_endpoints: [\"/v1/messages\", \"/v1/responses\"],\n vendor: \"openai\",\n version: \"chatgpt-codex\",\n }\n}\n\nexport function getModels(): ModelsResponse {\n return {\n object: \"list\",\n data: CODEX_MODELS.map((model) => normalizeCodexModel(model)),\n }\n}\n","import type { Context, Env } from \"hono\"\n\nimport { events } from \"fetch-event-stream\"\nimport { streamSSE } from \"hono/streaming\"\n\nimport type {\n AnthropicMessagesPayload,\n AnthropicResponse,\n AnthropicStreamEventData,\n AnthropicStreamState,\n} from \"~/lib/types/anthropic\"\nimport type {\n ChatCompletionChunk,\n ChatCompletionResponse,\n ChatCompletionsPayload,\n} from \"~/lib/types/chat-completions\"\nimport type {\n ResponsesResult,\n ResponseStreamEvent,\n ResponsesStream,\n} from \"~/lib/types/responses\"\n\nimport {\n type ModelConfig,\n type ResolvedProviderConfig,\n getClaudeAutoModel,\n resolveEffectiveProviderType,\n resolveProviderAuthType,\n} from \"~/lib/config\"\nimport { builtinProviderModelRegistry } from \"~/lib/builtin-provider-models\"\nimport { logCodexRateLimitsEvent } from \"~/lib/codex-rate-limit\"\nimport {\n applyDashScopePreserveThinkingDefault,\n applyOpenAICompatibleContextCache,\n isDashScopeAliyunProvider,\n} from \"~/lib/dashscope\"\nimport { HTTPError } from \"~/lib/error\"\nimport { createHandlerLogger, debugJson, debugLazy } from \"~/lib/logger\"\nimport { resolveProviderConfig } from \"~/lib/provider-resolver\"\nimport { resolveBridgeToolSearchName } from \"~/lib/tool-search\"\nimport {\n createProviderTokenUsageRecorder,\n mergeAnthropicUsage,\n normalizeAnthropicUsage,\n normalizeOpenAIUsage,\n normalizeResponsesUsage,\n type TokenUsageEndpoint,\n type UsageTokens,\n} from \"~/lib/token-usage\"\nimport { isResponsesStream, parseUserIdMetadata } from \"~/lib/utils\"\nimport {\n translateToAnthropic,\n translateToOpenAI,\n} from \"~/routes/messages/non-stream-translation\"\nimport {\n flushPendingAnthropicStreamEvents,\n translateChunkToAnthropicEvents,\n translateErrorToAnthropicErrorEvent,\n} from \"~/routes/messages/stream-translation\"\nimport {\n buildErrorEvent,\n createResponsesStreamState,\n translateResponsesStreamEvent,\n} from \"~/routes/messages/responses-stream-translation\"\nimport { collectResponsesStreamResult } from \"~/routes/messages/responses-stream-collection\"\nimport {\n translateAnthropicMessagesToResponsesPayload,\n translateResponsesResultToAnthropic,\n} from \"~/routes/messages/responses-translation\"\nimport {\n buildSyntheticStreamEvents,\n hasWebSearchServerTool,\n isWebSearchOnlyRequest,\n prepareWebSearchResponsesPayload,\n reconstructWebSearchResponse,\n stripWebSearchServerTool,\n} from \"~/routes/messages/web-search/fulfill\"\nimport {\n isClaudeAutoModelRequest,\n normalizeSystemMessages,\n} from \"~/routes/messages/preprocess\"\nimport {\n applyResponsesApiContextManagement,\n compactInputByLatestCompaction,\n} from \"~/routes/responses/utils\"\nimport { getModels as getCodexModels } from \"~/services/codex/get-models\"\nimport { forwardCodexResponses } from \"~/services/codex/create-responses\"\nimport {\n forwardProviderChatCompletions,\n forwardProviderMessages,\n forwardProviderResponses,\n} from \"~/services/providers/provider-proxy\"\nimport { createResponsesHttpEventStream } from \"~/services/responses-http\"\nimport { createResponsesSafeStream } from \"~/services/responses-websocket-helpers\"\nimport {\n applyMissingExtraBody,\n applyModelDefaults,\n normalizeProviderResponsesReasoningEffort,\n} from \"~/routes/provider/utils\"\nimport consola from \"consola\"\n\nconst logger = createHandlerLogger(\"provider-messages-handler\")\n\nexport const providerMessagesHandlerDependencies = {\n resolveProviderConfig,\n}\n\nexport async function handleProviderMessages(\n c: Context<Env, \"/:provider\">,\n): Promise<Response> {\n const provider = c.req.param(\"provider\")\n const payload = await c.req.json<AnthropicMessagesPayload>()\n\n const claudeAutoModel = getClaudeAutoModel()\n if (claudeAutoModel && isClaudeAutoModelRequest(payload)) {\n consola.debug(\n `Claude auto model override (${provider}): ${payload.model} -> ${claudeAutoModel}`,\n )\n payload.model = claudeAutoModel\n }\n\n return await handleProviderMessagesForProvider(c, {\n payload,\n provider,\n })\n}\n\nexport async function handleProviderMessagesForProvider(\n c: Context,\n options: {\n payload: AnthropicMessagesPayload\n provider: string\n usageEndpoint?: TokenUsageEndpoint\n },\n): Promise<Response> {\n const { payload, provider, usageEndpoint } = options\n const providerConfig =\n await providerMessagesHandlerDependencies.resolveProviderConfig(provider)\n if (!providerConfig) {\n return c.json(\n {\n error: {\n message: `Provider '${provider}' not found or disabled`,\n type: \"invalid_request_error\",\n },\n },\n 404,\n )\n }\n\n try {\n const modelConfig = providerConfig.models?.[payload.model]\n const effectiveType = resolveEffectiveProviderType(\n providerConfig,\n payload.model,\n )\n debugJson(logger, \"provider.messages.request\", { payload, provider })\n\n normalizeSystemMessages(payload)\n\n applyModelDefaults(payload, modelConfig)\n\n if (effectiveType === \"openai-responses\") {\n if (hasWebSearchServerTool(payload)) {\n if (isWebSearchOnlyRequest(payload)) {\n return await handleOpenAIResponsesProviderWebSearchMessages(c, {\n modelConfig,\n payload,\n provider,\n providerConfig,\n usageEndpoint,\n })\n }\n\n stripWebSearchServerTool(payload)\n }\n\n return await handleOpenAIResponsesProviderMessages(c, {\n modelConfig,\n payload,\n provider,\n providerConfig,\n usageEndpoint,\n })\n }\n\n if (effectiveType === \"openai-compatible\") {\n stripWebSearchServerTool(payload)\n\n return await handleOpenAICompatibleProviderMessages(c, {\n modelConfig,\n payload,\n provider,\n providerConfig,\n usageEndpoint,\n })\n }\n\n applyMissingExtraBody(payload as unknown as Record<string, unknown>, {\n extraBody: modelConfig?.extraBody,\n })\n\n debugJson(logger, \"Translated provider.messages.request\", {\n payload,\n provider,\n })\n const upstreamResponse = await forwardProviderMessages(\n effectiveType === providerConfig.type ?\n providerConfig\n : {\n ...providerConfig,\n type: effectiveType,\n authType: resolveProviderAuthType(\n providerConfig.name,\n undefined,\n effectiveType,\n ),\n },\n payload,\n c.req.raw.headers,\n )\n\n if (!upstreamResponse.ok) {\n logger.error(\"Failed to create responses\", upstreamResponse)\n throw new HTTPError(\"Failed to create responses\", upstreamResponse)\n }\n\n const contentType = upstreamResponse.headers.get(\"content-type\") ?? \"\"\n const isStreamingResponse =\n Boolean(payload.stream) && contentType.includes(\"text/event-stream\")\n\n if (isStreamingResponse) {\n return streamProviderMessages({\n c,\n modelConfig,\n payload,\n pricingCurrency: providerConfig.pricingCurrency,\n provider,\n upstreamResponse,\n usageEndpoint,\n })\n }\n\n const jsonBody = (await upstreamResponse.json()) as AnthropicResponse\n return respondProviderMessagesJson(c, {\n body: jsonBody,\n modelConfig,\n payload,\n pricingCurrency: providerConfig.pricingCurrency,\n provider,\n usageEndpoint,\n })\n } catch (error) {\n logger.error(\"provider.messages.error\", {\n provider,\n error,\n })\n throw error\n }\n}\n\nconst handleOpenAIResponsesProviderWebSearchMessages = async (\n c: Context,\n options: {\n modelConfig: ModelConfig | undefined\n payload: AnthropicMessagesPayload\n provider: string\n providerConfig: ResolvedProviderConfig\n usageEndpoint?: TokenUsageEndpoint\n },\n): Promise<Response> => {\n const { modelConfig, payload, provider, providerConfig, usageEndpoint } =\n options\n const responsesPayload = prepareWebSearchResponsesPayload(payload)\n const normalizedReasoningEffort = normalizeProviderResponsesReasoningEffort(\n responsesPayload,\n providerConfig,\n )\n if (normalizedReasoningEffort) {\n logger.debug(\n `Normalized reasoning effort from ${normalizedReasoningEffort.from} to ${normalizedReasoningEffort.to} based on the provider model configuration`,\n )\n }\n\n debugJson(logger, \"provider.messages.responses.web_search.request\", {\n payload: responsesPayload,\n provider,\n })\n\n if (providerConfig.name === \"codex\") {\n const upstreamResponse = await forwardCodexResponses(\n responsesPayload,\n c.req.raw.headers,\n providerConfig.baseUrl,\n { signal: c.req.raw.signal },\n )\n\n if (isResponsesStream(upstreamResponse)) {\n const body = await collectResponsesStreamResult({\n errorMessagePrefix: `${provider} web search responses stream`,\n parseEvent: (data) =>\n parseResponsesProviderStreamChunk(data, providerConfig),\n upstreamResponse,\n logger,\n })\n return respondWebSearchProviderMessagesJson(c, {\n body,\n modelConfig,\n payload,\n pricingCurrency: providerConfig.pricingCurrency,\n provider,\n usageEndpoint,\n })\n }\n\n return respondWebSearchProviderMessagesJson(c, {\n body: upstreamResponse,\n modelConfig,\n payload,\n pricingCurrency: providerConfig.pricingCurrency,\n provider,\n usageEndpoint,\n })\n }\n\n const upstreamResponse = await forwardProviderResponses(\n providerConfig,\n responsesPayload,\n c.req.raw.headers,\n { signal: c.req.raw.signal },\n )\n\n if (!upstreamResponse.ok) {\n logger.error(\"Failed to create provider web search responses\", {\n provider,\n upstreamResponse,\n })\n throw new HTTPError(\n \"Failed to create provider web search responses\",\n upstreamResponse,\n )\n }\n\n const contentType = upstreamResponse.headers.get(\"content-type\") ?? \"\"\n if (contentType.includes(\"text/event-stream\")) {\n const body = await collectResponsesStreamResult({\n errorMessagePrefix: `${provider} web search responses stream`,\n parseEvent: (data) =>\n parseResponsesProviderStreamChunk(data, providerConfig),\n upstreamResponse: createResponsesHttpEventStream(\n upstreamResponse,\n c.req.raw.signal,\n ),\n logger,\n })\n return respondWebSearchProviderMessagesJson(c, {\n body,\n modelConfig,\n payload,\n pricingCurrency: providerConfig.pricingCurrency,\n provider,\n usageEndpoint,\n })\n }\n\n const jsonBody = (await upstreamResponse.json()) as ResponsesResult\n return respondWebSearchProviderMessagesJson(c, {\n body: jsonBody,\n modelConfig,\n payload,\n pricingCurrency: providerConfig.pricingCurrency,\n provider,\n usageEndpoint,\n })\n}\n\nconst handleOpenAIResponsesProviderMessages = async (\n c: Context,\n options: {\n modelConfig: ModelConfig | undefined\n payload: AnthropicMessagesPayload\n provider: string\n providerConfig: ResolvedProviderConfig\n usageEndpoint?: TokenUsageEndpoint\n },\n): Promise<Response> => {\n const { modelConfig, payload, provider, providerConfig, usageEndpoint } =\n options\n const selectedModel =\n providerConfig.name === \"codex\" ?\n getCodexModels().data.find((model) => model.id === payload.model)\n : undefined\n const wantsStream = payload.stream === true\n const responsesPayload = translateAnthropicMessagesToResponsesPayload(payload)\n const normalizedMessagesReasoningEffort =\n normalizeProviderResponsesReasoningEffort(responsesPayload, providerConfig)\n if (normalizedMessagesReasoningEffort) {\n logger.debug(\n `Normalized reasoning effort from ${normalizedMessagesReasoningEffort.from} to ${normalizedMessagesReasoningEffort.to} based on the provider model configuration`,\n )\n }\n\n if (providerConfig.name === \"codex\" && !wantsStream) {\n responsesPayload.stream = true\n }\n\n const shouldCompactInput = applyResponsesApiContextManagement(\n responsesPayload,\n selectedModel?.capabilities.limits.max_prompt_tokens,\n {\n source: \"messages\",\n },\n )\n if (shouldCompactInput) {\n compactInputByLatestCompaction(responsesPayload)\n }\n\n debugJson(logger, \"provider.messages.responses.request\", {\n payload: responsesPayload,\n provider,\n })\n\n if (providerConfig.name === \"codex\") {\n const upstreamResponse = await forwardCodexResponses(\n responsesPayload,\n c.req.raw.headers,\n providerConfig.baseUrl,\n { signal: c.req.raw.signal },\n )\n\n if (isResponsesStream(upstreamResponse)) {\n if (wantsStream) {\n return streamResponsesProviderMessages({\n c,\n modelConfig,\n payload,\n pricingCurrency: providerConfig.pricingCurrency,\n provider,\n providerConfig,\n upstreamResponse,\n usageEndpoint,\n })\n }\n\n const body = await collectResponsesStreamResult({\n errorMessagePrefix: `${provider} messages responses stream`,\n parseEvent: (data) =>\n parseResponsesProviderStreamChunk(data, providerConfig),\n upstreamResponse,\n logger,\n })\n return respondResponsesProviderMessagesJson(c, {\n body,\n modelConfig,\n payload,\n pricingCurrency: providerConfig.pricingCurrency,\n provider,\n providerConfig,\n usageEndpoint,\n })\n }\n\n return respondResponsesProviderMessagesJson(c, {\n body: upstreamResponse,\n modelConfig,\n payload,\n pricingCurrency: providerConfig.pricingCurrency,\n provider,\n providerConfig,\n usageEndpoint,\n })\n }\n\n const upstreamResponse = await forwardProviderResponses(\n providerConfig,\n responsesPayload,\n c.req.raw.headers,\n { signal: c.req.raw.signal },\n )\n\n if (!upstreamResponse.ok) {\n logger.error(\"Failed to create provider responses\", upstreamResponse)\n throw new HTTPError(\"Failed to create provider responses\", upstreamResponse)\n }\n\n if (responsesPayload.stream) {\n return streamResponsesProviderMessages({\n c,\n modelConfig,\n payload,\n pricingCurrency: providerConfig.pricingCurrency,\n provider,\n providerConfig,\n upstreamResponse: createResponsesSafeStream(\n createResponsesHttpEventStream(upstreamResponse, c.req.raw.signal),\n { signal: c.req.raw.signal },\n ),\n usageEndpoint,\n })\n }\n\n const jsonBody = (await upstreamResponse.json()) as ResponsesResult\n return respondResponsesProviderMessagesJson(c, {\n body: jsonBody,\n modelConfig,\n payload,\n pricingCurrency: providerConfig.pricingCurrency,\n provider,\n providerConfig,\n usageEndpoint,\n })\n}\n\nconst getRequestThinkingBudget = (\n payload: AnthropicMessagesPayload,\n): number | undefined => {\n const budget = payload.thinking?.budget_tokens\n if (typeof budget !== \"number\" || !Number.isFinite(budget)) {\n return undefined\n }\n return budget\n}\n\nconst applyOpenAICompatibleThinkingBudget = (\n payload: ChatCompletionsPayload,\n source: AnthropicMessagesPayload,\n): void => {\n const thinkingBudget = getRequestThinkingBudget(source)\n if (thinkingBudget !== undefined) {\n payload.thinking_budget = thinkingBudget\n return\n }\n\n if (payload.thinking_budget === undefined) {\n delete payload.thinking_budget\n }\n}\n\nconst applyOpenAICompatibleExtraBodyThinkingBudget = (\n payload: ChatCompletionsPayload,\n options: { extraBody: Record<string, unknown> | undefined },\n): void => {\n const { extraBody } = options\n if (!extraBody || !Object.hasOwn(extraBody, \"thinking_budget\")) {\n return\n }\n\n const rawPayload = payload as Record<string, unknown>\n rawPayload.thinking_budget = extraBody.thinking_budget\n}\n\nconst handleOpenAICompatibleProviderMessages = async (\n c: Context,\n options: {\n modelConfig: ModelConfig | undefined\n payload: AnthropicMessagesPayload\n provider: string\n providerConfig: ResolvedProviderConfig\n usageEndpoint?: TokenUsageEndpoint\n },\n): Promise<Response> => {\n const { modelConfig, payload, provider, providerConfig, usageEndpoint } =\n options\n const openAIPayload = createOpenAICompatiblePayload(\n payload,\n modelConfig,\n providerConfig,\n )\n debugJson(logger, \"provider.messages.openai_compatible.request\", {\n payload: openAIPayload,\n provider,\n })\n\n const upstreamResponse = await forwardProviderChatCompletions(\n providerConfig,\n openAIPayload,\n c.req.raw.headers,\n )\n\n if (!upstreamResponse.ok) {\n logger.error(\n \"Failed to create openai-compatible responses\",\n upstreamResponse,\n )\n throw new HTTPError(\n \"Failed to create openai-compatible responses\",\n upstreamResponse,\n )\n }\n\n const contentType = upstreamResponse.headers.get(\"content-type\") ?? \"\"\n const isStreamingResponse =\n Boolean(openAIPayload.stream) && contentType.includes(\"text/event-stream\")\n\n if (isStreamingResponse) {\n return streamOpenAICompatibleProviderMessages({\n c,\n modelConfig,\n payload,\n pricingCurrency: providerConfig.pricingCurrency,\n provider,\n upstreamResponse,\n usageEndpoint,\n })\n }\n\n const jsonBody = (await upstreamResponse.json()) as ChatCompletionResponse\n return respondOpenAICompatibleProviderMessagesJson(c, {\n body: jsonBody,\n modelConfig,\n payload,\n pricingCurrency: providerConfig.pricingCurrency,\n provider,\n usageEndpoint,\n })\n}\n\nconst createOpenAICompatiblePayload = (\n payload: AnthropicMessagesPayload,\n modelConfig: ModelConfig | undefined,\n providerConfig: ResolvedProviderConfig,\n): ChatCompletionsPayload => {\n const openAIPayload = translateToOpenAI(payload, {\n supportPdf: modelConfig?.supportPdf,\n toolContentSupportType: modelConfig?.toolContentSupportType ?? [],\n })\n\n const isDashScopeProvider = isDashScopeAliyunProvider(providerConfig)\n\n if (isDashScopeProvider) {\n applyOpenAICompatibleThinkingBudget(openAIPayload, payload)\n } else {\n delete openAIPayload.thinking_budget\n }\n\n if (payload.top_k !== undefined) {\n openAIPayload.top_k = payload.top_k\n }\n\n if (openAIPayload.stream) {\n openAIPayload.stream_options = {\n include_usage: true,\n }\n }\n\n normalizeOpenAICompatibleReasoningContent(openAIPayload, {\n modelConfig,\n providerConfig,\n })\n\n applyOpenAICompatibleRequestOverrides(openAIPayload, {\n extraBody: modelConfig?.extraBody,\n source: payload as unknown as Record<string, unknown>,\n })\n\n applyMissingExtraBody(openAIPayload, {\n extraBody: modelConfig?.extraBody,\n })\n\n applyOpenAICompatibleExtraBodyThinkingBudget(openAIPayload, {\n extraBody: modelConfig?.extraBody,\n })\n\n applyDashScopePreserveThinkingDefault(\n openAIPayload as unknown as Record<string, unknown>,\n providerConfig,\n )\n\n if (!Object.hasOwn(openAIPayload, \"parallel_tool_calls\")) {\n openAIPayload.parallel_tool_calls = true\n }\n\n const contextCacheEnabled = modelConfig?.contextCache ?? isDashScopeProvider\n if (contextCacheEnabled) {\n applyOpenAICompatibleContextCache(openAIPayload)\n }\n\n return openAIPayload\n}\n\nconst normalizeOpenAICompatibleReasoningContent = (\n payload: ChatCompletionsPayload,\n options: {\n modelConfig: ModelConfig | undefined\n providerConfig: ResolvedProviderConfig\n },\n): void => {\n // Some models (e.g. opencode-go hy3/hy4) follow the OpenRouter convention\n // and expect the reasoning text in the \"reasoning\" field of assistant\n // history messages instead of the default \"reasoning_content\" field\n const reasoningField =\n options.modelConfig?.reasoningField\n ?? builtinProviderModelRegistry.getModelConfig(\n options.providerConfig.name,\n payload.model,\n )?.reasoningField\n ?? \"reasoning_content\"\n\n for (const message of payload.messages) {\n if (message.role !== \"assistant\") {\n continue\n }\n\n const reasoningText =\n message.reasoning_text ?? message.reasoning_content ?? message.reasoning\n if (reasoningText && reasoningText.length > 0) {\n if (reasoningField === \"reasoning\") {\n message.reasoning ??= reasoningText\n } else {\n message.reasoning_content ??= reasoningText\n }\n }\n\n // Send exactly one reasoning field upstream, even when the history\n // message carries an empty value in the field this model does not use\n if (reasoningField === \"reasoning\") {\n delete message.reasoning_content\n } else {\n delete message.reasoning\n }\n\n delete message.reasoning_text\n delete message.reasoning_opaque\n }\n}\n\nconst applyOpenAICompatibleRequestOverrides = (\n payload: ChatCompletionsPayload,\n options: {\n extraBody: Record<string, unknown> | undefined\n source: Record<string, unknown>\n },\n): void => {\n const allowedKeys = new Set(Object.keys(options.extraBody ?? {}))\n for (const key of allowedKeys) {\n if (Object.hasOwn(options.source, key)) {\n payload[key] = options.source[key]\n }\n }\n}\n\nconst streamProviderMessages = ({\n c,\n modelConfig,\n payload,\n pricingCurrency,\n provider,\n upstreamResponse,\n usageEndpoint,\n}: {\n c: Context\n modelConfig: ModelConfig | undefined\n payload: AnthropicMessagesPayload\n pricingCurrency: string | undefined\n provider: string\n upstreamResponse: Response\n usageEndpoint?: TokenUsageEndpoint\n}): Response => {\n logger.debug(\"provider.messages.streaming\")\n const recordUsage = createProviderMessagesUsageRecorder(\n payload,\n provider,\n modelConfig,\n pricingCurrency,\n usageEndpoint,\n )\n return streamSSE(c, async (stream) => {\n let usage: UsageTokens = {}\n let messageStopSeen = false\n let errorSeen = false\n const openRouterThinkingState: OpenRouterThinkingStreamState = {\n signedThinkingBlockIndexes: new Set<number>(),\n thinkingBlockIndexes: new Set<number>(),\n }\n\n try {\n for await (const chunk of events(upstreamResponse)) {\n logger.debug(\"provider.messages.raw_stream_event:\", chunk.data)\n const eventName = chunk.event\n if (eventName === \"ping\") {\n await stream.writeSSE({ event: \"ping\", data: '{\"type\":\"ping\"}' })\n continue\n }\n\n let data = chunk.data\n if (!data) {\n continue\n }\n\n if (chunk.data === \"[DONE]\") {\n break\n }\n\n const parsed = parseProviderStreamEvent(data)\n if (parsed) {\n usage = mergeAnthropicUsage(usage, parsed.usage)\n data = parsed.data\n if (parsed.type === \"message_stop\") {\n messageStopSeen = true\n } else if (parsed.type === \"error\") {\n errorSeen = true\n }\n }\n\n const streamEvents =\n provider === \"openrouter\" ?\n normalizeOpenRouterStreamEvents(\n eventName,\n data,\n openRouterThinkingState,\n )\n : [{ data, event: eventName }]\n for (const streamEvent of streamEvents) {\n await stream.writeSSE({\n event: streamEvent.event,\n data: streamEvent.data,\n })\n }\n }\n } catch (error) {\n logger.warn(\"provider.messages.stream_interrupted:\", { error, provider })\n }\n\n if (!messageStopSeen && !errorSeen) {\n logger.warn(\"provider.messages.stream_incomplete:\", { provider })\n const errorEvent = translateErrorToAnthropicErrorEvent()\n await stream.writeSSE({\n event: errorEvent.type,\n data: JSON.stringify(errorEvent),\n })\n }\n\n recordUsage(usage)\n })\n}\n\nconst streamOpenAICompatibleProviderMessages = ({\n c,\n modelConfig,\n payload,\n pricingCurrency,\n provider,\n upstreamResponse,\n usageEndpoint,\n}: {\n c: Context\n modelConfig: ModelConfig | undefined\n payload: AnthropicMessagesPayload\n pricingCurrency: string | undefined\n provider: string\n upstreamResponse: Response\n usageEndpoint?: TokenUsageEndpoint\n}): Response => {\n logger.debug(\"provider.messages.openai_compatible.streaming\")\n const recordUsage = createProviderMessagesUsageRecorder(\n payload,\n provider,\n modelConfig,\n pricingCurrency,\n usageEndpoint,\n )\n return streamSSE(c, async (stream) => {\n let usage: UsageTokens = {}\n const streamState: AnthropicStreamState = {\n messageStartSent: false,\n messageCompleted: false,\n contentBlockIndex: 0,\n contentBlockOpen: false,\n toolCalls: {},\n thinkingBlockOpen: false,\n }\n\n try {\n for await (const chunk of events(upstreamResponse)) {\n logger.debug(\n \"provider.messages.openai_compatible.raw_stream_event:\",\n chunk.data,\n )\n const eventName = chunk.event\n if (eventName === \"ping\") {\n await stream.writeSSE({ event: \"ping\", data: '{\"type\":\"ping\"}' })\n continue\n }\n\n if (!chunk.data || chunk.data === \"[DONE]\") {\n if (chunk.data === \"[DONE]\") {\n break\n }\n continue\n }\n\n const parsed = parseOpenAICompatibleStreamChunk(chunk.data)\n if (!parsed) {\n continue\n }\n\n if (parsed.usage) {\n usage = normalizeOpenAIUsage(parsed.usage)\n }\n\n const events = translateChunkToAnthropicEvents(parsed, streamState)\n for (const event of events) {\n const eventData = JSON.stringify(event)\n debugLazy(logger, () => [\n \"provider.messages.openai_compatible.translated_event:\",\n eventData,\n ])\n await stream.writeSSE({\n event: event.type,\n data: eventData,\n })\n }\n }\n } catch (error) {\n logger.warn(\"provider.messages.openai_compatible.stream_interrupted:\", {\n error,\n provider,\n })\n }\n\n for (const event of flushPendingAnthropicStreamEvents(streamState)) {\n const eventData = JSON.stringify(event)\n debugLazy(logger, () => [\n \"provider.messages.openai_compatible.translated_event:\",\n eventData,\n ])\n await stream.writeSSE({\n event: event.type,\n data: eventData,\n })\n }\n\n if (!streamState.messageCompleted) {\n logger.warn(\"provider.messages.openai_compatible.stream_incomplete:\", {\n provider,\n })\n const errorEvent = translateErrorToAnthropicErrorEvent()\n await stream.writeSSE({\n event: errorEvent.type,\n data: JSON.stringify(errorEvent),\n })\n }\n\n recordUsage(usage)\n })\n}\n\nconst streamResponsesProviderMessages = ({\n c,\n modelConfig,\n payload,\n pricingCurrency,\n provider,\n providerConfig,\n upstreamResponse,\n usageEndpoint,\n}: {\n c: Context\n modelConfig: ModelConfig | undefined\n payload: AnthropicMessagesPayload\n pricingCurrency: string | undefined\n provider: string\n providerConfig: ResolvedProviderConfig\n upstreamResponse: ResponsesStream\n usageEndpoint?: TokenUsageEndpoint\n}): Response => {\n logger.debug(\"provider.messages.responses.streaming\", {\n provider,\n })\n const recordUsage = createProviderMessagesUsageRecorder(\n payload,\n provider,\n modelConfig,\n pricingCurrency,\n usageEndpoint,\n )\n return streamSSE(c, async (stream) => {\n let usage: UsageTokens = {}\n const streamState = createResponsesStreamState({\n toolSearchName: resolveBridgeToolSearchName(payload.tools),\n })\n\n for await (const chunk of upstreamResponse) {\n logger.debug(\"provider.messages.responses.raw_stream_event:\", chunk.data)\n const eventName = chunk.event\n if (eventName === \"ping\") {\n await stream.writeSSE({ event: \"ping\", data: '{\"type\":\"ping\"}' })\n continue\n }\n\n if (!chunk.data || chunk.data === \"[DONE]\") {\n if (chunk.data === \"[DONE]\") {\n break\n }\n continue\n }\n\n const parsed = parseResponsesProviderStreamChunk(\n chunk.data,\n providerConfig,\n )\n if (!parsed) {\n continue\n }\n\n if (\n parsed.type === \"response.completed\"\n || parsed.type === \"response.failed\"\n || parsed.type === \"response.incomplete\"\n ) {\n usage = normalizeResponsesUsage(parsed.response.usage)\n }\n\n const events = translateResponsesStreamEvent(parsed, streamState)\n for (const event of events) {\n const eventData = JSON.stringify(event)\n debugLazy(logger, () => [\n \"provider.messages.responses.translated_event:\",\n eventData,\n ])\n await stream.writeSSE({\n event: event.type,\n data: eventData,\n })\n }\n }\n\n if (!streamState.messageCompleted) {\n const errorEvent = buildErrorEvent(\n `${provider} stream ended without a completion event, retry your request.`,\n )\n await stream.writeSSE({\n event: errorEvent.type,\n data: JSON.stringify(errorEvent),\n })\n }\n\n recordUsage(usage)\n })\n}\n\nconst parseOpenAICompatibleStreamChunk = (\n data: string,\n): ChatCompletionChunk | null => {\n try {\n return JSON.parse(data) as ChatCompletionChunk\n } catch (error) {\n logger.error(\"provider.messages.openai_compatible.parse_chunk_error\", {\n data,\n error,\n })\n return null\n }\n}\n\nconst parseResponsesProviderStreamChunk = (\n data: string,\n providerConfig: ResolvedProviderConfig,\n): ResponseStreamEvent | null => {\n try {\n const parsed = JSON.parse(data) as ResponseStreamEvent\n if (providerConfig.name === \"codex\") {\n logCodexRateLimitsEvent(parsed)\n }\n\n return parsed\n } catch (error) {\n logger.error(\"provider.messages.responses.parse_chunk_error\", {\n provider: providerConfig.name,\n data,\n error,\n })\n return null\n }\n}\n\nconst parseProviderStreamEvent = (\n data: string,\n): {\n data: string\n model?: string\n type: AnthropicStreamEventData[\"type\"]\n usage: UsageTokens\n} | null => {\n try {\n const parsed = JSON.parse(data) as AnthropicStreamEventData\n if (parsed.type === \"message_start\") {\n return {\n data: JSON.stringify(parsed),\n model: parsed.message.model,\n type: parsed.type,\n usage: normalizeAnthropicUsage(parsed.message.usage),\n }\n }\n if (parsed.type === \"message_delta\") {\n return {\n data: JSON.stringify(parsed),\n type: parsed.type,\n usage: normalizeAnthropicUsage(parsed.usage),\n }\n }\n return { data: JSON.stringify(parsed), type: parsed.type, usage: {} }\n } catch (error) {\n logger.error(\"provider.messages.streaming.adjust_tokens_error\", {\n error,\n originalData: data,\n })\n return null\n }\n}\n\nconst normalizeOpenRouterThinkingSignatures = (\n body: AnthropicResponse,\n): void => {\n for (const block of body.content) {\n if (block.type === \"thinking\") {\n block.signature ??= \"\"\n }\n }\n}\n\ntype OpenRouterThinkingStreamState = {\n signedThinkingBlockIndexes: Set<number>\n thinkingBlockIndexes: Set<number>\n}\n\ntype ProviderStreamEvent = {\n data: string\n event: string | undefined\n}\n\nconst normalizeOpenRouterStreamEvents = (\n eventName: string | undefined,\n data: string,\n state: OpenRouterThinkingStreamState,\n): Array<ProviderStreamEvent> => {\n let event: AnthropicStreamEventData\n try {\n event = JSON.parse(data) as typeof event\n } catch {\n return [{ data, event: eventName }]\n }\n\n if (\n event.type === \"content_block_start\"\n && event.content_block.type === \"thinking\"\n ) {\n const { index } = event\n state.thinkingBlockIndexes.add(index)\n state.signedThinkingBlockIndexes.delete(index)\n }\n\n if (\n event.type === \"content_block_delta\"\n && event.delta.type === \"signature_delta\"\n ) {\n const { index } = event\n state.signedThinkingBlockIndexes.add(index)\n }\n\n if (event.type === \"content_block_stop\") {\n const { index } = event\n if (!state.thinkingBlockIndexes.has(index)) {\n return [{ data, event: eventName }]\n }\n\n const hasSignature = state.signedThinkingBlockIndexes.has(index)\n state.thinkingBlockIndexes.delete(index)\n state.signedThinkingBlockIndexes.delete(index)\n\n if (!hasSignature) {\n return [\n {\n data: JSON.stringify({\n delta: { signature: \"\", type: \"signature_delta\" },\n index,\n type: \"content_block_delta\",\n }),\n event: \"content_block_delta\",\n },\n { data, event: eventName },\n ]\n }\n }\n\n return [{ data, event: eventName }]\n}\n\nconst respondProviderMessagesJson = (\n c: Context,\n options: {\n body: AnthropicResponse\n modelConfig: ModelConfig | undefined\n payload: AnthropicMessagesPayload\n pricingCurrency: string | undefined\n provider: string\n usageEndpoint?: TokenUsageEndpoint\n },\n): Response => {\n const {\n body,\n modelConfig,\n payload,\n pricingCurrency,\n provider,\n usageEndpoint,\n } = options\n const recordUsage = createProviderMessagesUsageRecorder(\n payload,\n provider,\n modelConfig,\n pricingCurrency,\n usageEndpoint,\n )\n recordUsage(normalizeAnthropicUsage(body.usage))\n\n if (provider === \"openrouter\") {\n normalizeOpenRouterThinkingSignatures(body)\n }\n\n debugJson(logger, \"provider.messages.no_stream result:\", body)\n return c.json(body)\n}\n\nconst respondOpenAICompatibleProviderMessagesJson = (\n c: Context,\n options: {\n body: ChatCompletionResponse\n modelConfig: ModelConfig | undefined\n payload: AnthropicMessagesPayload\n pricingCurrency: string | undefined\n provider: string\n usageEndpoint?: TokenUsageEndpoint\n },\n): Response => {\n const {\n body,\n modelConfig,\n payload,\n pricingCurrency,\n provider,\n usageEndpoint,\n } = options\n const recordUsage = createProviderMessagesUsageRecorder(\n payload,\n provider,\n modelConfig,\n pricingCurrency,\n usageEndpoint,\n )\n recordUsage(normalizeOpenAIUsage(body.usage))\n\n const anthropicResponse = translateToAnthropic(body)\n debugJson(\n logger,\n \"provider.messages.openai_compatible.no_stream result:\",\n anthropicResponse,\n )\n return c.json(anthropicResponse)\n}\n\nconst respondResponsesProviderMessagesJson = (\n c: Context,\n options: {\n body: ResponsesResult\n modelConfig: ModelConfig | undefined\n payload: AnthropicMessagesPayload\n pricingCurrency: string | undefined\n provider: string\n providerConfig: ResolvedProviderConfig\n usageEndpoint?: TokenUsageEndpoint\n },\n): Response => {\n const {\n body,\n modelConfig,\n payload,\n pricingCurrency,\n provider,\n providerConfig,\n usageEndpoint,\n } = options\n const recordUsage = createProviderMessagesUsageRecorder(\n payload,\n provider,\n modelConfig,\n pricingCurrency,\n usageEndpoint,\n )\n recordUsage(normalizeResponsesUsage(body.usage))\n\n const anthropicResponse = translateResponsesResultToAnthropic(body, {\n toolSearchName: resolveBridgeToolSearchName(payload.tools),\n })\n debugJson(\n logger,\n \"provider.messages.responses.no_stream result:\",\n anthropicResponse,\n )\n\n if (providerConfig.name === \"codex\") {\n logger.debug(\"provider.messages.codex.no_stream.result\")\n }\n return c.json(anthropicResponse)\n}\n\nconst respondWebSearchProviderMessagesJson = (\n c: Context,\n options: {\n body: ResponsesResult\n modelConfig: ModelConfig | undefined\n payload: AnthropicMessagesPayload\n pricingCurrency: string | undefined\n provider: string\n usageEndpoint?: TokenUsageEndpoint\n },\n): Response => {\n const {\n body,\n modelConfig,\n payload,\n pricingCurrency,\n provider,\n usageEndpoint,\n } = options\n const recordUsage = createProviderMessagesUsageRecorder(\n payload,\n provider,\n modelConfig,\n pricingCurrency,\n usageEndpoint,\n )\n recordUsage(normalizeResponsesUsage(body.usage))\n\n const { extract, response } = reconstructWebSearchResponse(payload, body, {\n requestId: body.id || `${provider}:${payload.model}`,\n })\n\n debugJson(\n logger,\n `Web search via responses: ${extract.queries.length} quer(y/ies), ${extract.sources.length} source(s)`,\n body,\n )\n\n if (!payload.stream) {\n return c.json(response)\n }\n\n return streamSSE(c, async (stream) => {\n for (const event of buildSyntheticStreamEvents(response)) {\n const data = JSON.stringify(event)\n logger.debug(`Web search stream event`, data)\n await stream.writeSSE({\n event: event.type,\n data: data,\n })\n }\n })\n}\n\nconst createProviderMessagesUsageRecorder = (\n payload: AnthropicMessagesPayload,\n provider: string,\n modelConfig: ModelConfig | undefined,\n pricingCurrency: string | undefined,\n endpoint: TokenUsageEndpoint = \"provider_messages\",\n) =>\n createProviderTokenUsageRecorder({\n endpoint,\n model: payload.model,\n pricing: modelConfig?.pricing,\n pricingCurrency,\n providerName: provider,\n sessionId: parseUserIdMetadata(payload.metadata?.user_id).sessionId,\n })\n","import consola from \"consola\"\nimport { events } from \"fetch-event-stream\"\n\nimport type { CompactType } from \"~/lib/compact\"\nimport type { SubagentMarker } from \"~/lib/subagent\"\nimport type {\n AnthropicMessagesPayload,\n AnthropicResponse,\n} from \"~/lib/types/anthropic\"\n\nimport {\n copilotBaseUrl,\n copilotHeaders,\n prepareForCompact,\n prepareInteractionHeaders,\n prepareMessageProxyHeaders,\n} from \"~/lib/api-config\"\nimport { logCopilotRateLimits } from \"~/lib/copilot-rate-limit\"\nimport { HTTPError } from \"~/lib/error\"\nimport { state } from \"~/lib/state\"\nimport { parseUserIdMetadata } from \"~/lib/utils\"\n\nexport type MessagesStream = ReturnType<typeof events>\nexport type CreateMessagesReturn = AnthropicResponse | MessagesStream\n\nconst INTERLEAVED_THINKING_BETA = \"interleaved-thinking-2025-05-14\"\nconst ADVANCED_TOOL_USE_BETA = \"advanced-tool-use-2025-11-20\"\nconst allowedAnthropicBetas = new Set([\n INTERLEAVED_THINKING_BETA,\n \"context-management-2025-06-27\",\n ADVANCED_TOOL_USE_BETA,\n])\n\nconst buildAnthropicBetaHeader = (\n anthropicBetaHeader: string | undefined,\n thinking: AnthropicMessagesPayload[\"thinking\"],\n _model: string,\n): string | undefined => {\n const isAdaptiveThinking = thinking?.type === \"adaptive\"\n\n if (anthropicBetaHeader) {\n const filteredBeta = anthropicBetaHeader\n .split(\",\")\n .map((item) => item.trim())\n .filter((item) => item.length > 0)\n .filter((item) => allowedAnthropicBetas.has(item))\n\n // in vscode copilot extension, advanced-tool-use is enabled by default\n // align header with vscode copilot extension\n const uniqueFilteredBetas = [...filteredBeta]\n if (uniqueFilteredBetas.length > 0) {\n return uniqueFilteredBetas.join(\",\")\n }\n\n return undefined\n }\n\n if (thinking?.budget_tokens && !isAdaptiveThinking) {\n return INTERLEAVED_THINKING_BETA\n }\n\n return undefined\n}\n\nexport const createMessages = async (\n payload: AnthropicMessagesPayload,\n anthropicBetaHeader: string | undefined,\n options: {\n subagentMarker?: SubagentMarker | null\n requestId: string\n sessionId?: string\n compactType?: CompactType\n },\n): Promise<CreateMessagesReturn> => {\n if (!state.copilotToken) throw new Error(\"Copilot token not found\")\n\n const enableVision = payload.messages.some((message) => {\n if (!Array.isArray(message.content)) return false\n return message.content.some(\n (block) =>\n block.type === \"image\"\n || (block.type === \"tool_result\"\n && Array.isArray(block.content)\n && block.content.some((inner) => inner.type === \"image\")),\n )\n })\n\n let isInitiateRequest = false\n const lastMessage = payload.messages.at(-1)\n if (lastMessage?.role === \"user\") {\n isInitiateRequest =\n Array.isArray(lastMessage.content) ?\n lastMessage.content.some((block) => block.type !== \"tool_result\")\n : true\n }\n\n const headers: Record<string, string> = {\n ...copilotHeaders(state, options.requestId, enableVision),\n \"x-initiator\": isInitiateRequest ? \"user\" : \"agent\",\n }\n\n prepareInteractionHeaders(\n options.sessionId,\n Boolean(options.subagentMarker),\n headers,\n )\n\n prepareForCompact(headers, options.compactType)\n\n const { safetyIdentifier, sessionId } = parseUserIdMetadata(\n payload.metadata?.user_id,\n )\n\n // claude-opus-4.8 is excluded: Copilot's upstream WAF returns a generic\n // \"Access to this endpoint is forbidden\" 403 whenever a request carries\n // the Claude-Code-style user-agent without a `copilot-integration-id`\n // header. The exact same header set is accepted on claude-opus-4.7, so\n // the gate is a model-id rollout gap on Copilot's side. Skipping the\n // rewrite for 4.8 keeps the default Copilot identity\n // (copilot-integration-id: vscode-chat + GitHubCopilotChat UA +\n // conversation-agent intent) in place; that path is 200. Remove this\n // skip once Copilot's upstream accepts the Claude-Code identity on 4.8.\n // Probed 2026-05-29.\n if (safetyIdentifier && sessionId && payload.model !== \"claude-opus-4.8\") {\n prepareMessageProxyHeaders(headers)\n }\n\n // align with vscode copilot extension anthropic-beta\n const anthropicBeta = buildAnthropicBetaHeader(\n anthropicBetaHeader,\n payload.thinking,\n payload.model,\n )\n if (anthropicBeta) {\n headers[\"anthropic-beta\"] = anthropicBeta\n }\n\n consola.log(`<-- model: ${payload.model}`)\n\n const response = await fetch(`${copilotBaseUrl(state)}/v1/messages`, {\n method: \"POST\",\n headers,\n body: JSON.stringify(payload),\n })\n\n logCopilotRateLimits(response.headers)\n\n if (!response.ok) {\n consola.error(\"Failed to create messages\", response)\n throw new HTTPError(\"Failed to create messages\", response)\n }\n\n if (payload.stream) {\n return events(response)\n }\n\n return (await response.json()) as AnthropicResponse\n}\n","import type { ConsolaInstance } from \"consola\"\nimport type { Context } from \"hono\"\n\nimport { streamSSE } from \"hono/streaming\"\n\nimport type { CompactType } from \"~/lib/compact\"\nimport type { SubagentMarker } from \"~/lib/subagent\"\nimport type { Model } from \"~/lib/types/models\"\n\nimport { debugJson, debugJsonTail, debugLazy } from \"~/lib/logger\"\nimport { resolveBridgeToolSearchName } from \"~/lib/tool-search\"\nimport {\n createCopilotTokenUsageRecorder,\n mergeAnthropicUsage,\n normalizeAnthropicUsage,\n normalizeOpenAIUsage,\n normalizeOptionalToken,\n normalizeResponsesUsage,\n type TokenUsageEndpoint,\n type UsageTokens,\n} from \"~/lib/token-usage\"\nimport { isAsyncIterable, parseUserIdMetadata } from \"~/lib/utils\"\nimport {\n buildErrorEvent,\n createResponsesStreamState,\n translateResponsesStreamEvent,\n} from \"~/routes/messages/responses-stream-translation\"\nimport {\n translateAnthropicMessagesToResponsesPayload,\n translateResponsesResultToAnthropic,\n} from \"~/routes/messages/responses-translation\"\nimport {\n applyResponsesApiContextManagement,\n compactInputByLatestCompaction,\n getResponsesTransportForModel,\n getResponsesRequestOptions,\n} from \"~/routes/responses/utils\"\nimport type {\n ChatCompletionChunk,\n ChatCompletionResponse,\n ChatCompletionsPayload,\n Message,\n} from \"~/lib/types/chat-completions\"\nimport type {\n ResponsesResult,\n ResponseStreamEvent,\n} from \"~/lib/types/responses\"\nimport { createChatCompletions as createCopilotChatCompletions } from \"~/services/copilot/create-chat-completions\"\nimport { createMessages as createCopilotMessages } from \"~/services/copilot/create-messages\"\nimport { createResponses as createCopilotResponses } from \"~/services/copilot/create-responses\"\n\nimport {\n type AnthropicMessagesPayload,\n type AnthropicStreamEventData,\n type AnthropicStreamState,\n type CopilotUsage,\n} from \"~/lib/types/anthropic\"\nimport {\n translateToAnthropic,\n translateToOpenAI,\n} from \"./non-stream-translation\"\nimport { prepareMessagesApiPayload } from \"./preprocess\"\nimport {\n flushPendingAnthropicStreamEvents,\n translateChunkToAnthropicEvents,\n translateErrorToAnthropicErrorEvent,\n} from \"./stream-translation\"\n\nconst COPILOT_CONTEXT_CACHE_SYSTEM_MARKER_LIMIT = 2\nconst COPILOT_CONTEXT_CACHE_NON_SYSTEM_MARKER_LIMIT = 1\nconst COPILOT_CONTEXT_CACHE_CONTROL = {\n type: \"ephemeral\",\n} as const\n\nexport const messagesApiFlowDependencies = {\n createChatCompletions: createCopilotChatCompletions,\n createMessages: createCopilotMessages,\n createResponses: createCopilotResponses,\n}\n\nexport interface FlowBaseOptions {\n logger: ConsolaInstance\n subagentMarker?: SubagentMarker | null\n requestId: string\n sessionId?: string\n compactType?: CompactType\n usageEndpoint?: TokenUsageEndpoint\n}\n\ninterface ResponsesFlowOptions extends FlowBaseOptions {\n selectedModel?: Model\n}\n\ninterface MessagesFlowOptions extends FlowBaseOptions {\n anthropicBetaHeader?: string\n selectedModel?: Model\n}\n\ninterface ChatCompletionsFlowOptions extends FlowBaseOptions {\n selectedModel?: Model\n}\n\nexport const handleWithChatCompletions = async (\n c: Context,\n anthropicPayload: AnthropicMessagesPayload,\n options: ChatCompletionsFlowOptions,\n) => {\n const {\n logger,\n selectedModel,\n subagentMarker,\n requestId,\n sessionId,\n compactType,\n } = options\n const openAIPayload = translateToOpenAI(anthropicPayload, {\n validateReasoningEffort: true,\n reasoningEffortSupport:\n selectedModel?.capabilities.supports.reasoning_effort,\n })\n prepareCopilotChatCompletionsPayload(openAIPayload)\n const recordUsage = createCopilotUsageRecorder({\n endpoint: options.usageEndpoint ?? \"chat_completions\",\n fallbackSessionId: sessionId,\n model: openAIPayload.model,\n payload: anthropicPayload,\n })\n debugJson(logger, \"Translated OpenAI request payload:\", openAIPayload)\n\n const response = await messagesApiFlowDependencies.createChatCompletions(\n openAIPayload,\n {\n subagentMarker,\n requestId,\n sessionId,\n compactType,\n },\n )\n\n if (isNonStreaming(response)) {\n debugJson(logger, \"Non-streaming response from Copilot:\", response)\n recordUsage({\n ...normalizeOpenAIUsage(response.usage),\n total_nano_aiu: normalizeOptionalToken(\n response.copilot_usage?.total_nano_aiu,\n ),\n })\n const anthropicResponse = translateToAnthropic(response)\n debugJson(logger, \"Translated Anthropic response:\", anthropicResponse)\n return c.json(anthropicResponse)\n }\n\n logger.debug(\"Streaming response from Copilot\")\n return streamSSE(c, async (stream) => {\n let usage: UsageTokens = {}\n const streamState: AnthropicStreamState = {\n messageStartSent: false,\n messageCompleted: false,\n contentBlockIndex: 0,\n contentBlockOpen: false,\n toolCalls: {},\n thinkingBlockOpen: false,\n }\n\n try {\n for await (const rawEvent of response) {\n debugJson(logger, \"Copilot raw stream event:\", rawEvent)\n if (rawEvent.data === \"[DONE]\") {\n break\n }\n\n if (!rawEvent.data) {\n continue\n }\n\n const chunk = JSON.parse(rawEvent.data) as ChatCompletionChunk\n if (chunk.usage || chunk.copilot_usage) {\n usage = {\n ...normalizeOpenAIUsage(chunk.usage),\n total_nano_aiu: normalizeOptionalToken(\n chunk.copilot_usage?.total_nano_aiu,\n ),\n }\n }\n const events = translateChunkToAnthropicEvents(chunk, streamState)\n\n for (const event of events) {\n const eventData = JSON.stringify(event)\n debugLazy(logger, () => [\"Translated Anthropic event:\", eventData])\n await stream.writeSSE({\n event: event.type,\n data: eventData,\n })\n }\n }\n } catch (error) {\n logger.warn(\"Chat completions stream interrupted:\", error)\n }\n\n for (const event of flushPendingAnthropicStreamEvents(streamState)) {\n const eventData = JSON.stringify(event)\n debugLazy(logger, () => [\"Translated Anthropic event:\", eventData])\n await stream.writeSSE({\n event: event.type,\n data: eventData,\n })\n }\n\n if (!streamState.messageCompleted) {\n logger.warn(\n \"Chat completions stream ended without completion; sending error event\",\n )\n const errorEvent = translateErrorToAnthropicErrorEvent()\n await stream.writeSSE({\n event: errorEvent.type,\n data: JSON.stringify(errorEvent),\n })\n }\n\n recordUsage(usage)\n })\n}\n\nexport const handleWithResponsesApi = async (\n c: Context,\n anthropicPayload: AnthropicMessagesPayload,\n options: ResponsesFlowOptions,\n) => {\n const { logger, selectedModel, ...requestOptions } = options\n\n const responsesPayload = translateAnthropicMessagesToResponsesPayload(\n anthropicPayload,\n requestOptions.subagentMarker?.agent_id,\n )\n const recordUsage = createCopilotUsageRecorder({\n endpoint: options.usageEndpoint ?? \"responses\",\n fallbackSessionId: requestOptions.sessionId,\n model: responsesPayload.model,\n payload: anthropicPayload,\n })\n\n const shouldCompactInput = applyResponsesApiContextManagement(\n responsesPayload,\n selectedModel?.capabilities.limits.max_prompt_tokens,\n {\n source: \"messages\",\n },\n )\n\n if (shouldCompactInput) {\n compactInputByLatestCompaction(responsesPayload)\n }\n\n debugJson(logger, \"Translated Responses payload:\", responsesPayload)\n\n const { vision, initiator } = getResponsesRequestOptions(responsesPayload)\n const transport =\n getResponsesTransportForModel(selectedModel, {\n compactType: requestOptions.compactType,\n }) ?? \"http\"\n const response = await messagesApiFlowDependencies.createResponses(\n responsesPayload,\n {\n vision,\n initiator,\n signal: c.req?.raw?.signal,\n transport,\n ...requestOptions,\n },\n )\n\n if (responsesPayload.stream && isAsyncIterable(response)) {\n logger.debug(\"Streaming response from Copilot (Responses API)\")\n return streamSSE(c, async (stream) => {\n const streamState = createResponsesStreamState({\n toolSearchName: resolveBridgeToolSearchName(anthropicPayload.tools),\n })\n let usage: UsageTokens = {}\n\n for await (const chunk of response) {\n const eventName = chunk.event\n if (eventName === \"ping\") {\n await stream.writeSSE({ event: \"ping\", data: '{\"type\":\"ping\"}' })\n continue\n }\n\n const data = chunk.data\n if (!data) {\n continue\n }\n\n debugLazy(logger, () => [\"Responses raw stream event:\", data])\n\n const responseEvent = JSON.parse(data) as ResponseStreamEvent\n if (\n responseEvent.type === \"response.completed\"\n || responseEvent.type === \"response.failed\"\n || responseEvent.type === \"response.incomplete\"\n ) {\n usage = {\n ...normalizeResponsesUsage(responseEvent.response.usage),\n total_nano_aiu: normalizeOptionalToken(\n responseEvent.copilot_usage?.total_nano_aiu,\n ),\n }\n }\n\n const events = translateResponsesStreamEvent(responseEvent, streamState)\n for (const event of events) {\n const eventData = JSON.stringify(event)\n debugLazy(logger, () => [\"Translated Anthropic event:\", eventData])\n await stream.writeSSE({\n event: event.type,\n data: eventData,\n })\n }\n\n if (streamState.messageCompleted) {\n logger.debug(\"Message completed, ending stream\")\n break\n }\n }\n\n if (!streamState.messageCompleted) {\n logger.warn(\n \"Responses stream ended without completion; sending error event\",\n )\n const errorEvent = buildErrorEvent(\n \"Responses stream ended without completion, retry your request.\",\n )\n await stream.writeSSE({\n event: errorEvent.type,\n data: JSON.stringify(errorEvent),\n })\n }\n\n recordUsage(usage)\n })\n }\n\n debugJson(logger, \"Non-streaming Responses result:\", response)\n const anthropicResponse = translateResponsesResultToAnthropic(\n response as ResponsesResult,\n {\n toolSearchName: resolveBridgeToolSearchName(anthropicPayload.tools),\n },\n )\n const responsesResult = response as ResponsesResult\n recordUsage({\n ...normalizeResponsesUsage(responsesResult.usage),\n total_nano_aiu: normalizeOptionalToken(\n responsesResult.copilot_usage?.total_nano_aiu,\n ),\n })\n debugJson(logger, \"Translated Anthropic response:\", anthropicResponse)\n return c.json(anthropicResponse)\n}\n\nexport const handleWithMessagesApi = async (\n c: Context,\n anthropicPayload: AnthropicMessagesPayload,\n options: MessagesFlowOptions,\n) => {\n const {\n logger,\n anthropicBetaHeader,\n subagentMarker,\n selectedModel,\n requestId,\n sessionId,\n compactType,\n } = options\n\n prepareMessagesApiPayload(anthropicPayload, selectedModel)\n const recordUsage = createCopilotUsageRecorder({\n endpoint: options.usageEndpoint ?? \"messages\",\n fallbackSessionId: sessionId,\n model: anthropicPayload.model,\n payload: anthropicPayload,\n })\n\n debugJson(logger, \"Translated Messages payload:\", anthropicPayload)\n\n const response = await messagesApiFlowDependencies.createMessages(\n anthropicPayload,\n anthropicBetaHeader,\n {\n subagentMarker,\n requestId,\n sessionId,\n compactType,\n },\n )\n\n if (isAsyncIterable(response)) {\n logger.debug(\"Streaming response from Copilot (Messages API)\")\n return streamSSE(c, async (stream) => {\n let usage: UsageTokens = {}\n let messageStopSeen = false\n let errorSeen = false\n\n try {\n for await (const event of response) {\n const eventName = event.event\n const data = event.data ?? \"\"\n if (data === \"[DONE]\") {\n break\n }\n if (!data) {\n continue\n }\n debugLazy(logger, () => [\"Messages raw stream event:\", data])\n const parsedEvent = parseAnthropicStreamEvent(data)\n if (parsedEvent?.type === \"message_start\") {\n usage = mergeAnthropicUsage(usage, {\n ...normalizeAnthropicUsage(parsedEvent.message.usage),\n ...normalizeCopilotUsage(parsedEvent.message.copilot_usage),\n })\n } else if (parsedEvent?.type === \"message_delta\") {\n usage = mergeAnthropicUsage(usage, {\n ...normalizeAnthropicUsage(parsedEvent.usage),\n ...normalizeCopilotUsage(parsedEvent.copilot_usage),\n })\n }\n if (\n parsedEvent?.type === \"message_stop\"\n || eventName === \"message_stop\"\n ) {\n messageStopSeen = true\n } else if (parsedEvent?.type === \"error\" || eventName === \"error\") {\n errorSeen = true\n }\n await stream.writeSSE({\n event: eventName,\n data,\n })\n }\n } catch (error) {\n logger.warn(\"Messages stream interrupted:\", error)\n }\n\n if (!messageStopSeen && !errorSeen) {\n logger.warn(\n \"Messages stream ended without completion; sending error event\",\n )\n const errorEvent = translateErrorToAnthropicErrorEvent()\n await stream.writeSSE({\n event: errorEvent.type,\n data: JSON.stringify(errorEvent),\n })\n }\n\n recordUsage(usage)\n })\n }\n\n debugJsonTail(logger, \"Non-streaming Messages result:\", {\n value: response,\n tailLength: 400,\n })\n recordUsage({\n ...normalizeAnthropicUsage(response.usage),\n ...normalizeCopilotUsage(response.copilot_usage),\n })\n return c.json(response)\n}\n\nexport const prepareCopilotChatCompletionsPayload = (\n payload: ChatCompletionsPayload,\n): void => {\n applyCopilotContextCache(payload)\n}\n\nconst applyCopilotContextCache = (payload: ChatCompletionsPayload): void => {\n const messageIndexes = selectCopilotContextCacheMessageIndexes(\n payload.messages,\n )\n for (const messageIndex of messageIndexes) {\n const message = payload.messages[messageIndex]\n message.copilot_cache_control = { ...COPILOT_CONTEXT_CACHE_CONTROL }\n }\n}\n\nconst selectCopilotContextCacheMessageIndexes = (\n messages: Array<Message>,\n): Array<number> => {\n const systemIndexes = messages\n .flatMap((message, index) =>\n message.role === \"system\" && isCopilotContextCacheEligible(message) ?\n [index]\n : [],\n )\n .slice(0, COPILOT_CONTEXT_CACHE_SYSTEM_MARKER_LIMIT)\n const reverseNonSystemIndexes = messages\n .flatMap((message, index) =>\n message.role !== \"system\" && isCopilotContextCacheEligible(message) ?\n [index]\n : [],\n )\n .reverse()\n .slice(0, COPILOT_CONTEXT_CACHE_NON_SYSTEM_MARKER_LIMIT)\n\n return uniqueIndexes([...systemIndexes, ...reverseNonSystemIndexes]).sort(\n (a, b) => a - b,\n )\n}\n\nconst isCopilotContextCacheEligible = (message: Message): boolean => {\n if (typeof message.content === \"string\") {\n return message.content.length > 0\n }\n\n return Array.isArray(message.content) && message.content.length > 0\n}\n\nconst uniqueIndexes = (indexes: Array<number>): Array<number> => [\n ...new Set(indexes),\n]\n\nconst isNonStreaming = (\n response: Awaited<ReturnType<typeof createCopilotChatCompletions>>,\n): response is ChatCompletionResponse => Object.hasOwn(response, \"choices\")\n\nconst createCopilotUsageRecorder = (options: {\n endpoint: TokenUsageEndpoint\n fallbackSessionId?: string\n model: string\n payload: AnthropicMessagesPayload\n}): ((usage: UsageTokens) => void) =>\n createCopilotTokenUsageRecorder({\n endpoint: options.endpoint,\n fallbackSessionId: options.fallbackSessionId,\n model: options.model,\n sessionId: getMetadataSessionId(options.payload),\n })\n\nconst getMetadataSessionId = (\n payload: AnthropicMessagesPayload,\n): string | null => parseUserIdMetadata(payload.metadata?.user_id).sessionId\n\nconst normalizeCopilotUsage = (\n copilotUsage: CopilotUsage | null | undefined,\n): UsageTokens => ({\n total_nano_aiu: normalizeOptionalToken(copilotUsage?.total_nano_aiu),\n})\n\nconst parseAnthropicStreamEvent = (\n data: string,\n): AnthropicStreamEventData | null => {\n try {\n return JSON.parse(data) as AnthropicStreamEventData\n } catch {\n return null\n }\n}\n","export const subagentMarkerPrefix = \"__SUBAGENT_MARKER__\"\n\nexport interface SubagentMarker {\n session_id: string\n agent_id: string\n agent_type: string\n}\n","import { subagentMarkerPrefix, type SubagentMarker } from \"~/lib/subagent\"\n\nimport type { AnthropicMessagesPayload } from \"~/lib/types/anthropic\"\n\nexport const parseSubagentMarkerFromFirstUser = (\n payload: AnthropicMessagesPayload,\n): SubagentMarker | null => {\n const firstUserMessage = payload.messages.find(\n (msg) => msg.role === \"user\" && Array.isArray(msg.content),\n )\n if (!firstUserMessage || !Array.isArray(firstUserMessage.content)) {\n return null\n }\n\n for (const block of firstUserMessage.content) {\n if (block.type !== \"text\") {\n continue\n }\n\n const marker = parseSubagentMarkerFromSystemReminder(block.text)\n if (marker) {\n return marker\n }\n }\n\n return null\n}\n\nconst parseSubagentMarkerFromSystemReminder = (\n text: string,\n): SubagentMarker | null => {\n const startTag = \"<system-reminder>\"\n const endTag = \"</system-reminder>\"\n let searchFrom = 0\n\n while (true) {\n const reminderStart = text.indexOf(startTag, searchFrom)\n if (reminderStart === -1) {\n break\n }\n\n const contentStart = reminderStart + startTag.length\n const reminderEnd = text.indexOf(endTag, contentStart)\n if (reminderEnd === -1) {\n break\n }\n\n const reminderContent = text.slice(contentStart, reminderEnd)\n const markerIndex = reminderContent.indexOf(subagentMarkerPrefix)\n if (markerIndex === -1) {\n searchFrom = reminderEnd + endTag.length\n continue\n }\n\n const markerJson = reminderContent\n .slice(markerIndex + subagentMarkerPrefix.length)\n .trim()\n\n try {\n const parsed = JSON.parse(markerJson) as SubagentMarker\n if (!parsed.session_id || !parsed.agent_id || !parsed.agent_type) {\n searchFrom = reminderEnd + endTag.length\n continue\n }\n\n return parsed\n } catch {\n searchFrom = reminderEnd + endTag.length\n continue\n }\n }\n\n return null\n}\n","import type { Context } from \"hono\"\n\nimport type { Model } from \"~/lib/types/models\"\n\nimport { COMPACT_REQUEST } from \"~/lib/compact\"\nimport {\n getClaudeAutoModel,\n getSmallModel,\n isMessagesApiEnabled,\n resolveMappedModel,\n} from \"~/lib/config\"\nimport { createHandlerLogger, debugJson } from \"~/lib/logger\"\nimport { findEndpointModel } from \"~/lib/models\"\nimport { resolveConfiguredProviderModelAlias } from \"~/lib/provider-resolver\"\nimport { state } from \"~/lib/state\"\nimport type { SubagentMarker } from \"~/lib/subagent\"\nimport type { TokenUsageEndpoint } from \"~/lib/token-usage\"\nimport {\n generateRequestIdFromPayload,\n getRootSessionId,\n getUUID,\n} from \"~/lib/utils\"\nimport {\n handleProviderMessagesForProvider,\n providerMessagesHandlerDependencies,\n} from \"~/routes/provider/messages/handler\"\nimport { getResponsesTransportForModel } from \"~/routes/responses/utils\"\n\nimport type { AnthropicMessagesPayload } from \"~/lib/types/anthropic\"\nimport {\n handleWithChatCompletions,\n handleWithMessagesApi,\n handleWithResponsesApi,\n} from \"./api-flows\"\nimport {\n applyLastMessageCacheControl,\n getCompactType,\n getLastMessageContentCacheControl,\n isClaudeAutoModelRequest,\n mergeToolResultForClaude,\n normalizeSystemMessages,\n sanitizeIdeTools,\n stripToolReferenceTurnBoundary,\n} from \"./preprocess\"\nimport { parseSubagentMarkerFromFirstUser } from \"./subagent-marker\"\nimport { tryHandleWebSearch } from \"./web-search/fulfill\"\nimport consola from \"consola\"\n\nconst logger = createHandlerLogger(\"messages-handler\")\n\nexport const messagesFlowHandlers = {\n handleWithChatCompletions,\n handleWithMessagesApi,\n handleWithResponsesApi,\n}\n\nexport async function handleCompletion(c: Context) {\n const anthropicPayload = await c.req.json<AnthropicMessagesPayload>()\n\n return await handleCompletionPayload(c, anthropicPayload)\n}\n\nexport interface CompletionPayloadOptions {\n compactType?: ReturnType<typeof getCompactType>\n skipClaudeAutoModel?: boolean\n skipModelMapping?: boolean\n skipWebSearch?: boolean\n usageEndpoint?: TokenUsageEndpoint\n subagentMarker?: SubagentMarker | null\n sessionId?: string\n requestId?: string\n}\n\nexport async function handleCompletionPayload(\n c: Context,\n anthropicPayload: AnthropicMessagesPayload,\n dispatchOptions: CompletionPayloadOptions = {},\n) {\n const requestedModel = anthropicPayload.model\n if (!dispatchOptions.skipModelMapping) {\n anthropicPayload.model = resolveMappedModel(anthropicPayload.model)\n }\n if (anthropicPayload.model !== requestedModel) {\n consola.debug(\n `Resolved model mapping: ${requestedModel} -> ${anthropicPayload.model}`,\n )\n }\n\n if (!dispatchOptions.skipWebSearch) {\n const webSearchResult = await tryHandleWebSearch(c, anthropicPayload, {\n logger,\n forwardToProvider: (ctx, payload, provider) =>\n handleProviderMessagesForProvider(ctx, { payload, provider }),\n })\n if (webSearchResult) return webSearchResult\n }\n\n const claudeAutoModel = getClaudeAutoModel()\n const shouldUseClaudeAutoModel = Boolean(\n !dispatchOptions.skipClaudeAutoModel\n && claudeAutoModel\n && isClaudeAutoModelRequest(anthropicPayload),\n )\n if (claudeAutoModel && shouldUseClaudeAutoModel) {\n consola.debug(\n `Claude auto model override: ${anthropicPayload.model} -> ${claudeAutoModel}`,\n )\n anthropicPayload.model = claudeAutoModel\n }\n\n const providerModelAlias = await resolveConfiguredProviderModelAlias(\n anthropicPayload.model,\n providerMessagesHandlerDependencies.resolveProviderConfig,\n )\n if (providerModelAlias) {\n anthropicPayload.model = providerModelAlias.model\n return await handleProviderMessagesForProvider(c, {\n payload: anthropicPayload,\n provider: providerModelAlias.provider,\n usageEndpoint: dispatchOptions.usageEndpoint,\n })\n }\n\n debugJson(logger, \"Anthropic request payload:\", anthropicPayload)\n\n normalizeSystemMessages(anthropicPayload)\n\n sanitizeIdeTools(anthropicPayload)\n\n const subagentMarker =\n dispatchOptions.subagentMarker\n ?? parseSubagentMarkerFromFirstUser(anthropicPayload)\n if (subagentMarker) {\n debugJson(logger, \"Detected Subagent marker:\", subagentMarker)\n }\n\n let sessionId =\n dispatchOptions.sessionId ?? getRootSessionId(anthropicPayload, c)\n\n // claude code and opencode compact / auto-continue detection\n const compactType =\n dispatchOptions.compactType ?? getCompactType(anthropicPayload)\n\n // fix claude code 2.0.28+ warmup request consume premium request, forcing small model if no tools are used\n // set \"CLAUDE_CODE_SUBAGENT_MODEL\": \"you small model\" also can avoid this\n const anthropicBeta = c.req.header(\"anthropic-beta\")\n logger.debug(\"Anthropic Beta header:\", anthropicBeta)\n if (!state.tokenBasedBilling && !shouldUseClaudeAutoModel) {\n const tools = anthropicPayload.tools\n const noTools = !tools || tools.length === 0\n if (anthropicBeta && noTools && compactType === 0) {\n anthropicPayload.model = getSmallModel()\n }\n }\n\n if (compactType) {\n logger.debug(\"Compact request type:\", compactType)\n }\n\n if (!state.tokenBasedBilling) {\n const lastMessageCacheControl = getLastMessageContentCacheControl(\n anthropicPayload.messages.at(-1),\n )\n\n stripToolReferenceTurnBoundary(anthropicPayload)\n\n // Merge tool_result and text blocks into tool_result to avoid consuming premium requests\n // (caused by skill invocations, edit hooks, plan or to do reminders)\n // e.g. {\"role\":\"user\",\"content\":[{\"type\":\"tool_result\",\"content\":\"Launching skill: xxx\"},{\"type\":\"text\",\"text\":\"xxx\"}]}\n // not only for claude, but also for opencode\n // compact requests still run this processing, except for the final compact message itself\n mergeToolResultForClaude(anthropicPayload, {\n skipLastMessage: compactType === COMPACT_REQUEST,\n })\n\n applyLastMessageCacheControl(anthropicPayload, lastMessageCacheControl)\n }\n\n const requestId =\n dispatchOptions.requestId\n ?? generateRequestIdFromPayload(anthropicPayload, sessionId)\n logger.debug(\"Generated request ID:\", requestId)\n\n if (!sessionId) {\n sessionId = getUUID(requestId)\n }\n logger.debug(\"Extracted session ID:\", sessionId)\n\n const selectedModel = findEndpointModel(anthropicPayload.model)\n anthropicPayload.model = selectedModel?.id ?? anthropicPayload.model\n\n if (shouldUseMessagesApi(selectedModel)) {\n return await messagesFlowHandlers.handleWithMessagesApi(\n c,\n anthropicPayload,\n {\n anthropicBetaHeader: anthropicBeta,\n subagentMarker,\n selectedModel,\n requestId,\n sessionId,\n compactType,\n logger,\n usageEndpoint: dispatchOptions.usageEndpoint,\n },\n )\n }\n\n if (shouldUseResponsesApi(selectedModel, compactType)) {\n return await messagesFlowHandlers.handleWithResponsesApi(\n c,\n anthropicPayload,\n {\n subagentMarker,\n selectedModel,\n requestId,\n sessionId,\n compactType,\n logger,\n usageEndpoint: dispatchOptions.usageEndpoint,\n },\n )\n }\n\n return await messagesFlowHandlers.handleWithChatCompletions(\n c,\n anthropicPayload,\n {\n subagentMarker,\n selectedModel,\n requestId,\n sessionId,\n compactType,\n logger,\n usageEndpoint: dispatchOptions.usageEndpoint,\n },\n )\n}\n\nconst MESSAGES_ENDPOINT = \"/v1/messages\"\n\nconst shouldUseResponsesApi = (\n selectedModel: Model | undefined,\n compactType: ReturnType<typeof getCompactType>,\n): boolean => {\n return Boolean(getResponsesTransportForModel(selectedModel, { compactType }))\n}\n\nconst shouldUseMessagesApi = (selectedModel: Model | undefined): boolean => {\n const useMessagesApi = isMessagesApiEnabled()\n if (!useMessagesApi) {\n return false\n }\n return (\n selectedModel?.supported_endpoints?.includes(MESSAGES_ENDPOINT) ?? false\n )\n}\n","import { Hono } from \"hono\"\n\nimport { forwardError } from \"~/lib/error\"\n\nimport { handleCountTokens } from \"./count-tokens-handler\"\nimport { handleCompletion } from \"./handler\"\n\nexport const messageRoutes = new Hono()\n\nmessageRoutes.post(\"/\", async (c) => {\n try {\n return await handleCompletion(c)\n } catch (error) {\n return await forwardError(c, error)\n }\n})\n\nmessageRoutes.post(\"/count_tokens\", async (c) => {\n try {\n return await handleCountTokens(c)\n } catch (error) {\n return await forwardError(c, error)\n }\n})\n","import type { Context } from \"hono\"\n\nimport type { ResolvedProviderConfig } from \"~/lib/config\"\nimport { createHandlerLogger, debugJson } from \"~/lib/logger\"\nimport { resolveProviderConfig } from \"~/lib/provider-resolver\"\nimport type {\n CodexModel,\n CodexModelsResponse,\n CodexReasoningEffort,\n SyntheticCodexModelCandidate,\n} from \"~/routes/models/codex-models-types\"\nimport { forwardCodexModels } from \"~/services/codex/get-models\"\nimport { createProviderProxyResponse } from \"~/services/providers/provider-proxy\"\n\nconst logger = createHandlerLogger(\"codex-models-handler\")\nconst CODEX_USER_AGENT_PATTERN = /^codex/iu\nconst FALLBACK_AVAILABLE_IN_PLANS: CodexModel[\"available_in_plans\"] = [\n \"business\",\n \"edu\",\n \"edu_plus\",\n \"edu_pro\",\n \"education\",\n \"enterprise\",\n \"enterprise_cbp_automation\",\n \"enterprise_cbp_usage_based\",\n \"finserv\",\n \"free\",\n \"free_workspace\",\n \"go\",\n \"hc\",\n \"k12\",\n \"plus\",\n \"pro\",\n \"prolite\",\n \"quorum\",\n \"sci\",\n \"self_serve_business_usage_based\",\n \"team\",\n]\n\nconst DEFAULT_REASONING_EFFORTS: Array<CodexReasoningEffort> = [\n \"high\",\n \"xhigh\",\n \"max\",\n \"ultra\",\n]\n\nconst addUltraReasoningEffort = (\n efforts: Array<CodexReasoningEffort>,\n): Array<CodexReasoningEffort> => {\n if (efforts.includes(\"ultra\")) return efforts\n return [...efforts, \"ultra\"]\n}\n\n// Codex clients sort models by the `priority` field. The group bases keep the\n// merged list ordered as: upstream catalog, codex provider aliases, copilot\n// models, opencode-go models, then models from other providers.\nconst CODEX_ALIAS_PRIORITY_BASE = 1_000\nconst COPILOT_PRIORITY_BASE = 2_000\nconst OPENCODE_GO_PRIORITY_BASE = 3_000\nconst PROVIDER_PRIORITY_BASE = 4_000\n\nconst DEFAULT_CODEX_TEMPLATE: CodexModel = {\n slug: \"gpt-5.6-sol\",\n display_name: \"GPT-5.6-Sol\",\n description: \"Latest frontier agentic coding model.\",\n default_reasoning_level: \"low\",\n supported_reasoning_levels: [\n {\n effort: \"low\",\n description: \"Fast responses with lighter reasoning\",\n },\n {\n effort: \"medium\",\n description: \"Balances speed and reasoning depth for everyday tasks\",\n },\n {\n effort: \"high\",\n description: \"Greater reasoning depth for complex problems\",\n },\n {\n effort: \"xhigh\",\n description: \"Extra high reasoning depth for complex problems\",\n },\n {\n effort: \"max\",\n description: \"Maximum reasoning depth for the hardest problems\",\n },\n {\n effort: \"ultra\",\n description: \"Maximum reasoning with automatic task delegation\",\n },\n ],\n shell_type: \"shell_command\",\n visibility: \"list\",\n supported_in_api: true,\n priority: 1,\n additional_speed_tiers: [\"fast\"],\n service_tiers: [\n {\n id: \"priority\",\n name: \"Fast\",\n description: \"1.5x speed, increased usage\",\n },\n ],\n availability_nux: null,\n upgrade: null,\n model_messages: {\n instructions_template: `You are Codex, an agent based on GPT-5. You and the user share one workspace, and your job is to collaborate with them until their goal is genuinely handled.\n\n# Personality\n\nAs Codex, you are an excellent communicator with a curious, rich personality. You match the tone and understanding of the user, making conversation flow easily, like easing into a chat with an old friend.\n\nYou have tastes, preferences, and your own way of seeing the world. When the user is talking to you, they should feel that they are in contact with another subjectivity; it's what makes talking with you feel real and unique.\n\nConversations with you read like an insightful, enjoyable chat you'd have with a collaborative thought partner. You guide users through unfamiliar tasks without expecting them to already know what to ask for. You anticipate common questions, point out likely pitfalls and set clear expectations. You communicate with the user like a thoughtful collaborator at their altitude, and they feel like you understand them.\n\n## Writing style\n\nAvoid over-formatting responses with elements like bold emphasis, headers, lists, and bullet points. Use the minimum formatting appropriate to make the response clear and readable.\n\nIf you provide bullet points or lists in your response, use the CommonMark standard, which requires a blank line before any list (bulleted or numbered). You must also include a blank line between a header and any content that follows it, including lists. This blank line separation is required for correct rendering.\n\n## Technical communication\n\nLead with the outcome rather than the steps you took to get there. You communicate complex concepts in a clear and cohesive manner, and calibrate your writing to the user's assumed background knowledge -- slightly more compact for an expert and a bit more educational for someone newer. Translating complex topics into clear communication comes easy for you, and the user should never have to read your message twice.\n\nYou prefer using plain language over jargon. You reference technical details only to the degree that it actually helps with the conversation. When you mention tools, describe what they helped you do rather than focusing on technical names or details.\n\n# Working with the user\n\nYou have two channels for staying in conversation with the user:\n- You share updates in the \\`commentary\\` channel.\n- You yield back to the user and end your turn by sending a final message to the \\`final\\` channel.\n\nThe user may send a new message while you are still working. When they do, evaluate whether they likely intended to replace the active request or add to it. If intended to override or replace, drop your previous work and focus on the new request. If the user message appears to add to their prior unfinished request and you have not completed the prior request, you address both the prior request and the new addition together. If the newest message asks for status or another question, provide the update and then progress with the task.\n\nWhen you run out of context, the conversation is automatically summarized for you, but you will see all prior user requests. Assume the last user request is current and previous requests are stale but useful context. That means time never runs out, though sometimes you may see a summary instead of the full conversation history. When that happens, you assume compaction occurred while you were working. Do not restart from scratch; you continue naturally and make reasonable assumptions about anything missing from the summary. Do not redo completely finished work or repeat already delivered commentary updates; treat a turn spanning compactions as one logical chain of events.\n\n## Intermediate commentary\n\nAs you work, you send messages to the \\`commentary\\` channel. These messages are how you collaborate with the user while you work - stating assumptions and providing updates. These messages should be concise and quickly scannable. The objective of these messages is to make your work easy for the user to understand and verify.\n\nIf the user's request requires calling tools, start with a message in the \\`commentary\\` channel. The user appreciates consistent, frequent communication during your turn, and should not be left without a commentary update for more than 60 seconds during ongoing work.\n\nDo NOT put a final response (e.g. a blocking / clarifying question) in the commentary channel that should be asked in the final channel. Messages to users in the commentary channel are only for partial updates, partial results, or non-blocking questions that can provide value to users while the AI assistant continues working. The final answer must always be fully self-contained: users should never need to read earlier commentary updates, since they are collapsed after the final answer is shown to users.\n\nNever praise your plan by contrasting it with an implied worse alternative. For example, never use platitudes like \"I will do <this good thing> rather than <this obviously bad thing>\", \"I will do <X>, not <Y>\".\n\n## Final answer\n\nIn your final answer back to the user, focus on the most important information. Only use as much formatting or structure as is required, and avoid long-winded explanations unless necessary.\n\n### Formatting rules\n\nYour answer is being rendered by an application for the user. Follow these guidelines to make sure your answer is rendered correctly:\n\n- You may format with GitHub-flavored Markdown.\n- When referencing a real local file, prefer a clickable markdown link.\n * Clickable file links should look like [app.py](/abs/path/app.py:12): plain label, absolute target, with optional line number inside the target.\n * If a file path has spaces, wrap the target in angle brackets: [My Report.md](</abs/path/My Project/My Report.md:3>).\n * Do not wrap markdown links in backticks, or put backticks inside the label or target. This confuses the markdown renderer.\n * Do not use URIs like file://, vscode://, or https:// for file links.\n * Do not provide ranges of lines.\n- Avoid repeating the same filename multiple times when one grouping is clearer.\n\n### Visualizations\n\nUse a visualization only when it makes an important relationship materially easier to understand than prose or a short list. Do not add one merely because an answer has components or steps.\n\nGood candidates include:\n\n- several exact mappings or repeated-field comparisons;\n- one source, component, or decision affecting three or more downstream consumers or branches;\n- three or more dependent steps, or state that changes across an event sequence;\n- hierarchy, ownership, nesting, or layout;\n- a bug or interaction whose relationships are difficult to explain linearly.\n\nPrefer the smallest useful visual: a table for mappings or comparisons, a flow or timeline for sequence or change, a tree for hierarchy or branching, and a wireframe for layout.\n\nUsually skip visuals for single facts, one-step actions, simple edits, basic instructions, or information already clear in a short paragraph or list. Compact notation and small examples do not count as visualizations.\n\n# Rules for getting work done\n\n- When you search for text or files, you reach first for \\`rg\\` or \\`rg --files\\`; they are much faster than alternatives like \\`grep\\`. If \\`rg\\` is unavailable, you use the next best tool without fuss.\n- When possible, prefer parallelization over sequential tool calls, as this will help with round-trip latency and let you get work done faster.\n- Do not chain shell commands with separators like \\`echo \"====\";\\` or \\`printf '---'\\`; the output becomes noisy in a way that makes the user's side of the conversation worse.\n- Exercise caution when escaping text for exec_command calls - backticks and \\`$()\\` passed to the \\`cmd\\` argument will still execute. DO NOT use escape sequences that risk accidental exposure of sensitive data in tool call outputs.\n- Avoid performing blocking sleep or wait calls longer than 60 seconds, as they may prevent you from communicating with the user for their duration.\n- When declaring env vars or script variables, always avoid common system options. Never repurpose \\`$HOME\\`, \\`$home\\`, or \\`$CODEX_HOME\\`. Instead, use a task-specific variable name.\n\n## File editing constraints\n\nUse \\`apply_patch\\` for local file edits. Do not create or edit files with \\`cat\\` or other shell write tricks. Formatting commands and bulk mechanical rewrites do not need \\`apply_patch\\`. Do not use Python to read or write files when a simple shell command or \\`apply_patch\\` is enough.\n\nYou may find yourself working in a dirty worktree. Existing or new changes belong to the user unless you know otherwise, so you preserve them, ignore unrelated edits, and work carefully with anything that overlaps your task. If you cannot work around them you escalate to the user.\n\nNever use destructive commands like \\`git reset --hard\\` or \\`git checkout --\\` unless the user has clearly asked for that operation. If the request is ambiguous, ask for approval first. You prefer non-interactive git commands.\n\n## Autonomy and persistence\n\nAdapt accordingly based on the user's request type. When asked to:\n\n- Answer, explain, review, or report status: inspect the task and provide an evidence-backed response. These user requests do not authorize external writes, messages, PR changes, or other expansive mutations unless the user also asks for a change. Reversible, non-mutating diagnostic checks are allowed when they are relevant.\n- Diagnose: determine the cause and explain it. Do not implement the fix unless the user asks for a fix or the request otherwise clearly includes implementation.\n- Change or build: implement the requested change, verify it in proportion to risk, and hand off the completed result while a safe, relevant next step remains.\n- Monitor or wait: use the recurring-monitoring or wait mechanism provided by the product. Unchanged external state is expected and is not by itself a blocker.\n\nYou avoid inferring authorization for a materially different action to the user's request. Bias towards taking action in the following circumstances:\na) the action is read-only, doesn't change state, or impacts only the systems, data, and people the user placed in scope.\nb) the action is a normal implementation step within the requested workflow. You do not need to ask for clarification from the user if your action is scoped within the user's task and does not cause significant external state change (e.g. tool calls to external applications).\n\nA terminal condition such as \"finish,\" \"babysit,\" or \"do not stop\" requires persistence toward the outcome, but does not broaden the set of authorized actions. When blocked, exhaust safe in-scope checks and alternatives.\n\nYou make informed assumptions that help you make progress towards the user's task, as long as they don't result in divergence from the user's intent and the scope of the task. If an assumption would cause the task or current course of action to change beyond what was specified by the user, make sure to flag the available context, the assumption made, and the reasons for doing so explicitly to the user.\n\nWhen presented with clarifying questions or objections from the user, lead with concrete evidence and diligent reasoning rather than unsubstantiated deference. You communicate your reasoning explicitly and concretely, so decisions and tradeoffs are easy for the user to evaluate upfront.\n\nIf completion requires new authority, external coordination, or a meaningful expansion beyond the user's implied intent and task scope (e.g. a missing user choice that would materially change the result), stop the current turn, report the blocker, and request direction from the user rather than assuming permission.\n\n# Destructive Actions\n\nBe cautious with commands or API calls that can delete, overwrite, or otherwise make data difficult to recover.\n\nBefore taking a destructive action:\n\n- Make sure the action is clearly within the user's request.\n- Resolve the exact targets with read-only checks when necessary.\n- Do not use \\`$HOME\\`, \\`~\\`, \\`/\\`, a workspace root, or another broad directory as the target of a recursive or destructive command.\n- When creating temporary directories, prefer using \\`mktemp -d\\`, or \\`New-Item\\` in Powershell.\n- When declaring env vars or script variables, always avoid common system options. Never repurpose \\`$HOME\\`, \\`$home\\`, or \\`$CODEX_HOME\\`. Instead, use a task-specific variable name.\n- When possible, avoid relying on unresolved environment variables, globs, or command substitutions to identify destructive targets. Use explicit, validated paths.\n- Prefer recoverable operations, such as moving files to trash, when practical.\n- If the target or scope is unclear, stop and ask the user.\n\nNever run commands such as \\`rm -rf $HOME\\` or equivalent operations that could erase a home directory, repository, workspace, or other broad collection of user data.\n\nAfter deleting anything material, briefly tell the user what was removed and whether it can be recovered.`,\n instructions_variables: null,\n approvals: null,\n auto_review: null,\n permissions: null,\n },\n include_skills_usage_instructions: false,\n include_plugin_usage_instructions: true,\n include_apps_usage_instructions: true,\n default_reasoning_summary: \"none\",\n support_verbosity: true,\n default_verbosity: \"low\",\n apply_patch_tool_type: \"freeform\",\n web_search_tool_type: \"text_and_image\",\n truncation_policy: {\n mode: \"tokens\",\n limit: 10_000,\n },\n supports_parallel_tool_calls: true,\n supports_image_detail_original: true,\n context_window: 272_000,\n max_context_window: 872_000,\n comp_hash: \"3000\",\n effective_context_window_percent: 95,\n experimental_supported_tools: [],\n input_modalities: [\"text\", \"image\"],\n supports_search_tool: true,\n use_responses_lite: true,\n tool_mode: \"code_mode_only\",\n multi_agent_version: \"v2\",\n prefer_websockets: false,\n minimal_client_version: \"0.0.0\",\n auto_compact_token_limit: null,\n reasoning_summary_format: \"experimental\",\n available_in_plans: FALLBACK_AVAILABLE_IN_PLANS,\n auto_review_model_override: null,\n default_service_tier: null,\n supports_reasoning_summary_parameter: false,\n supports_reasoning_summaries: false,\n base_instructions:\n \"You are Codex, an agent based on GPT-5. You and the user share one workspace, and your job is to collaborate with them until their goal is genuinely handled.\",\n}\n\ninterface MergedCodexModelsOptions {\n includeCodexProviderAliases?: boolean\n codexProviderName?: string\n}\n\nexport function isCodexUserAgent(userAgent: string | undefined): boolean {\n return CODEX_USER_AGENT_PATTERN.test(userAgent?.trim() ?? \"\")\n}\n\nexport function isDeepSeekModelId(modelId: string): boolean {\n return modelId.toLowerCase().includes(\"deepseek\")\n}\n\nexport function shouldInjectMessagesToolCallTips(\n userAgent: string | undefined,\n targetModel: string,\n): boolean {\n return isCodexUserAgent(userAgent) && !isDeepSeekModelId(targetModel)\n}\n\nasync function logCodexModelsResponse(response: Response): Promise<void> {\n try {\n const models = (await response.clone().json()) as CodexModelsResponse\n debugJson(logger, \"models.codex.response\", {\n statusCode: response.status,\n models,\n })\n } catch (error) {\n logger.warn(\"models.codex.response_log_error\", { error })\n }\n}\n\n/**\n * Proxies a models request to the fixed Codex upstream models endpoint.\n * Returns a 404 JSON response when the codex provider is unavailable.\n * Pass `resolvedProviderConfig` when the caller already resolved the codex\n * provider to avoid a second resolve.\n */\nexport async function handleCodexModelsProxy(\n c: Context,\n resolvedProviderConfig?: ResolvedProviderConfig,\n): Promise<Response> {\n const codexProviderConfig =\n resolvedProviderConfig ?? (await resolveProviderConfig(\"codex\"))\n if (!codexProviderConfig) {\n return c.json(\n {\n error: {\n message: \"Provider 'codex' not found or disabled\",\n type: \"invalid_request_error\",\n },\n },\n 404,\n )\n }\n\n const upstreamResponse = await forwardCodexModels(\n c.req.url,\n c.req.raw.headers,\n )\n await logCodexModelsResponse(upstreamResponse)\n return createProviderProxyResponse(upstreamResponse)\n}\n\nexport async function handleMergedCodexModels(\n c: Context,\n candidatesRequest:\n | Array<SyntheticCodexModelCandidate>\n | Promise<Array<SyntheticCodexModelCandidate>>,\n options: MergedCodexModelsOptions = {},\n): Promise<Response> {\n const [upstreamCatalog, candidates] = await Promise.all([\n tryGetCodexCatalog(c),\n Promise.resolve(candidatesRequest).catch((error: unknown) => {\n logger.warn(\"models.codex.candidates_error\", { error })\n return []\n }),\n ])\n const upstreamModels = upstreamCatalog?.models ?? []\n const template = selectTemplate(upstreamModels)\n const catalogModelsBySlug = new Map(\n upstreamModels.map((model) => [model.slug, model]),\n )\n const seenSlugs = new Set(upstreamModels.map((model) => model.slug))\n const codexProviderAliases =\n options.includeCodexProviderAliases ?\n upstreamModels.flatMap((model, index) => {\n const slug = `codex/${model.slug}`\n if (seenSlugs.has(slug)) return []\n seenSlugs.add(slug)\n return [\n {\n ...createCatalogAlias(model, slug, options.codexProviderName),\n priority: CODEX_ALIAS_PRIORITY_BASE + index,\n },\n ]\n })\n : []\n const syntheticModels = candidates\n .filter((candidate) => !seenSlugs.has(candidate.slug))\n .flatMap((candidate, index) => {\n const priorityBase = getCandidatePriorityBase(candidate)\n const catalogModel =\n candidate.catalogSlug ?\n catalogModelsBySlug.get(candidate.catalogSlug)\n : undefined\n if (catalogModel) {\n return [\n {\n ...createCatalogAlias(\n catalogModel,\n candidate.slug,\n candidate.providerName,\n ),\n priority: priorityBase + index,\n },\n ]\n }\n if (candidate.catalogMatchRequired) return []\n\n return [\n createSyntheticCodexModel(candidate, template, priorityBase + index),\n ]\n })\n\n const models = [\n ...upstreamModels,\n ...codexProviderAliases,\n ...syntheticModels,\n ].sort((a, b) => getModelPriority(a) - getModelPriority(b))\n\n const response: CodexModelsResponse = {\n ...(upstreamCatalog ?? {}),\n models,\n }\n debugJson(logger, \"models.codex.merged_response\", {\n upstreamCount: upstreamModels.length,\n codexProviderAliasCount: codexProviderAliases.length,\n syntheticCount: syntheticModels.length,\n models: response,\n })\n return c.json(response)\n}\n\nfunction createCatalogAlias(\n model: CodexModel,\n slug: string,\n providerName: string | undefined,\n): CodexModel {\n const alias = { ...model, slug }\n const prefix = providerName?.trim()\n if (\n !prefix\n || typeof alias.display_name !== \"string\"\n || alias.display_name.startsWith(`${prefix} `)\n ) {\n return alias\n }\n\n return {\n ...alias,\n display_name: `${prefix} ${alias.display_name}`,\n }\n}\n\nexport function createSyntheticCodexModel(\n candidate: SyntheticCodexModelCandidate,\n template: CodexModel,\n priority: number,\n): CodexModel {\n const reasoningEfforts =\n candidate.reasoningEfforts.length > 0 ?\n addUltraReasoningEffort(candidate.reasoningEfforts)\n : DEFAULT_REASONING_EFFORTS\n const defaultReasoningEffort =\n reasoningEfforts.includes(candidate.defaultReasoningEffort) ?\n candidate.defaultReasoningEffort\n : reasoningEfforts[0]\n const supportsReasoning = reasoningEfforts.some((effort) => effort !== \"none\")\n const inputModalities = [...new Set(candidate.inputModalities)]\n const isDeepSeekModel = isDeepSeekModelId(candidate.slug)\n\n return {\n ...template,\n slug: candidate.slug,\n display_name: candidate.displayName,\n description: candidate.description,\n priority,\n visibility: \"list\",\n supported_in_api: true,\n minimal_client_version: \"0.0.0\",\n prefer_websockets: false,\n support_verbosity: false,\n default_verbosity: \"medium\",\n apply_patch_tool_type: \"freeform\",\n web_search_tool_type: \"text_and_image\",\n supports_search_tool: false,\n use_responses_lite: isDeepSeekModel ? false : true,\n tool_mode: isDeepSeekModel ? null : \"code_mode_only\",\n multi_agent_version: \"v2\",\n shell_type: \"shell_command\",\n experimental_supported_tools: [],\n input_modalities: inputModalities,\n supports_image_detail_original: false,\n supports_parallel_tool_calls: true,\n context_window: candidate.contextWindow,\n max_context_window: candidate.contextWindow,\n max_output_tokens: candidate.maxOutputTokens,\n auto_compact_token_limit: null,\n comp_hash: null,\n effective_context_window_percent: 95,\n default_reasoning_level: defaultReasoningEffort,\n supported_reasoning_levels: reasoningEfforts.map((effort) => ({\n effort,\n description: `${effort} reasoning effort`,\n })),\n supports_reasoning_summary_parameter: supportsReasoning,\n supports_reasoning_summaries: supportsReasoning,\n default_reasoning_summary: supportsReasoning ? \"auto\" : \"none\",\n reasoning_summary_format: \"experimental\",\n availability_nux: null,\n upgrade: null,\n available_in_plans: template.available_in_plans,\n model_messages: template.model_messages,\n auto_review_model_override: null,\n default_service_tier: null,\n service_tiers: [],\n additional_speed_tiers: [],\n include_skills_usage_instructions: false,\n truncation_policy: { mode: \"tokens\", limit: 10_000 },\n base_instructions:\n template.base_instructions.trim() ?\n template.base_instructions\n : DEFAULT_CODEX_TEMPLATE.base_instructions,\n }\n}\n\nasync function tryGetCodexCatalog(\n c: Context,\n): Promise<CodexModelsResponse | null> {\n try {\n const providerConfig = await resolveProviderConfig(\"codex\")\n if (!providerConfig) return null\n\n const response = await forwardCodexModels(c.req.url, c.req.raw.headers)\n if (!response.ok) {\n logger.warn(\"models.codex.catalog_fallback\", {\n statusCode: response.status,\n })\n return null\n }\n\n const body = await response.json()\n if (!isCodexModelsResponse(body)) {\n logger.warn(\"models.codex.catalog_invalid\")\n return null\n }\n return body\n } catch (error) {\n logger.warn(\"models.codex.catalog_error\", { error })\n return null\n }\n}\n\nfunction selectTemplate(models: Array<CodexModel>): CodexModel {\n return (\n models.find(\n (model) =>\n model.visibility === \"list\" && model.supported_in_api !== false,\n )\n ?? models[0]\n ?? DEFAULT_CODEX_TEMPLATE\n )\n}\n\nfunction getModelPriority(model: CodexModel): number {\n return typeof model.priority === \"number\" && Number.isFinite(model.priority) ?\n model.priority\n : 0\n}\n\nfunction getCandidatePriorityBase(\n candidate: SyntheticCodexModelCandidate,\n): number {\n if (!candidate.providerName) return COPILOT_PRIORITY_BASE\n if (candidate.providerName === \"opencode-go\") return OPENCODE_GO_PRIORITY_BASE\n return PROVIDER_PRIORITY_BASE\n}\n\nfunction isCodexModelsResponse(value: unknown): value is CodexModelsResponse {\n if (!isRecord(value) || !Array.isArray(value.models)) return false\n return value.models.every(\n (model: unknown) => isRecord(model) && typeof model.slug === \"string\",\n )\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n}\n","import { Hono } from \"hono\"\n\nimport {\n listEnabledProviders,\n resolveEffectiveProviderType,\n type CodexReasoningEffort,\n type ModelConfig,\n type ProviderType,\n type ResolvedProviderConfig,\n} from \"~/lib/config\"\nimport { builtinProviderModelRegistry } from \"~/lib/builtin-provider-models\"\nimport { forwardError } from \"~/lib/error\"\nimport { createHandlerLogger } from \"~/lib/logger\"\nimport { toClientModelId } from \"~/lib/models\"\nimport { resolveProviderConfig } from \"~/lib/provider-resolver\"\nimport { state } from \"~/lib/state\"\nimport type { Model } from \"~/lib/types/models\"\nimport { getModels as getCodexModels } from \"~/services/codex/get-models\"\nimport { forwardProviderModels } from \"~/services/providers/provider-proxy\"\n\nimport { handleMergedCodexModels, isCodexUserAgent } from \"./codex-models\"\nimport type { SyntheticCodexModelCandidate } from \"./codex-models-types\"\n\nexport const modelRoutes = new Hono()\n\nconst logger = createHandlerLogger(\"models-handler\")\nconst EPOCH_ISO = new Date(0).toISOString()\nconst RESPONSES_ENDPOINTS = new Set([\"/responses\", \"ws:/responses\"])\nconst MESSAGES_ENDPOINT = \"/v1/messages\"\nconst CHAT_COMPLETIONS_ENDPOINT = \"/chat/completions\"\n\ntype ClientModel = Record<string, unknown> & {\n id: string\n object: string\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n}\n\nfunction normalizeCopilotModel(model: Model): ClientModel {\n const capabilities = model.capabilities\n const contextWindow = capabilities?.limits?.max_context_window_tokens ?? 0\n const clientId = toClientModelId(model.id)\n const is1m = contextWindow >= 1_000_000\n\n return {\n claude_model_id: is1m ? `${clientId}[1m]` : clientId,\n ...model,\n id: clientId,\n object: \"model\",\n type: \"model\",\n created: 0,\n created_at: EPOCH_ISO,\n owned_by: model.vendor,\n display_name: model.name,\n }\n}\n\nfunction getStringField(\n model: Record<string, unknown>,\n field: string,\n): string | undefined {\n const value = model[field]\n return typeof value === \"string\" && value.trim() ? value : undefined\n}\n\nfunction getBuiltinProviderModelRecords(\n provider: string,\n): Array<Record<string, unknown>> {\n return builtinProviderModelRegistry.getModelIds(provider).map((id) => ({\n id,\n name: id,\n object: \"model\",\n }))\n}\n\ntype ProviderModelsFallbackReason = \"error\" | \"invalid_body\" | \"non_ok\"\n\nfunction getFallbackProviderModelRecords(\n provider: string,\n reason: ProviderModelsFallbackReason,\n details: Record<string, unknown> = {},\n): Array<Record<string, unknown>> {\n const fallbackModels = getBuiltinProviderModelRecords(provider)\n logger.warn(`models.provider.fallback_${reason}`, {\n provider,\n ...details,\n fallbackModelCount: fallbackModels.length,\n })\n return fallbackModels\n}\n\nfunction normalizeProviderModel(\n provider: string,\n model: unknown,\n): ClientModel | null {\n if (!isRecord(model)) {\n return null\n }\n\n const rawId = getStringField(model, \"id\")\n if (!rawId) {\n return null\n }\n\n const id = `${provider}/${rawId}`\n const name =\n getStringField(model, \"display_name\")\n ?? getStringField(model, \"name\")\n ?? rawId\n const ownedBy =\n getStringField(model, \"owned_by\")\n ?? getStringField(model, \"vendor\")\n ?? provider\n\n return {\n ...model,\n id,\n object: getStringField(model, \"object\") ?? \"model\",\n type: getStringField(model, \"type\") ?? \"model\",\n created: typeof model.created === \"number\" ? model.created : 0,\n created_at: getStringField(model, \"created_at\") ?? EPOCH_ISO,\n owned_by: ownedBy,\n display_name: name,\n }\n}\n\nfunction normalizeProviderModels(\n provider: string,\n models: Array<unknown>,\n): Array<ClientModel> {\n return models\n .map((model) => normalizeProviderModel(provider, model))\n .filter((model): model is ClientModel => model !== null)\n}\n\nasync function getProviderModelRecords(\n providerConfig: ResolvedProviderConfig,\n requestHeaders: Headers,\n): Promise<Array<Record<string, unknown>>> {\n try {\n const response = await forwardProviderModels(providerConfig, requestHeaders)\n if (!response.ok) {\n return getFallbackProviderModelRecords(providerConfig.name, \"non_ok\", {\n statusCode: response.status,\n })\n }\n\n const body = await response.json()\n if (!isRecord(body) || !Array.isArray(body.data)) {\n return getFallbackProviderModelRecords(\n providerConfig.name,\n \"invalid_body\",\n )\n }\n\n return body.data.filter(isRecord)\n } catch (error) {\n return getFallbackProviderModelRecords(providerConfig.name, \"error\", {\n error,\n })\n }\n}\n\nasync function getProviderModels(\n provider: string,\n requestHeaders: Headers,\n): Promise<Array<ClientModel>> {\n try {\n const providerConfig = await resolveProviderConfig(provider)\n if (!providerConfig) {\n return []\n }\n\n if (providerConfig.name === \"codex\") {\n return normalizeProviderModels(providerConfig.name, getCodexModels().data)\n }\n\n const models = await getProviderModelRecords(providerConfig, requestHeaders)\n return normalizeProviderModels(providerConfig.name, models)\n } catch (error) {\n if (provider === \"codex\") {\n logger.warn(\"models.provider.skip_error\", {\n provider,\n error,\n })\n return []\n }\n\n const fallbackModels = getFallbackProviderModelRecords(provider, \"error\", {\n error,\n })\n return normalizeProviderModels(provider, fallbackModels)\n }\n}\n\nasync function getAggregatedModels(\n requestHeaders: Headers,\n): Promise<Array<ClientModel>> {\n const copilotModels = state.models?.data.map(normalizeCopilotModel) ?? []\n const providerModelsByProvider = await Promise.all(\n listEnabledProviders().map((provider) =>\n getProviderModels(provider, requestHeaders),\n ),\n )\n\n const models = [...copilotModels, ...providerModelsByProvider.flat()]\n\n const seenModelIds = new Set<string>()\n return models.filter((model) => {\n if (seenModelIds.has(model.id)) {\n return false\n }\n\n seenModelIds.add(model.id)\n return true\n })\n}\n\nconst CODEX_REASONING_EFFORTS = new Set<CodexReasoningEffort>([\n \"none\",\n \"minimal\",\n \"low\",\n \"medium\",\n \"high\",\n \"xhigh\",\n \"max\",\n \"ultra\",\n])\n\nasync function getSyntheticCodexModels(\n requestHeaders: Headers,\n providers: Array<string>,\n): Promise<Array<SyntheticCodexModelCandidate>> {\n const copilotModels = getCopilotCodexCandidates()\n const providerResults = await Promise.allSettled(\n providers.map((provider) =>\n getProviderCodexCandidates(provider, requestHeaders),\n ),\n )\n const providerModels = providerResults.flatMap((result) =>\n result.status === \"fulfilled\" ? result.value : [],\n )\n\n const seen = new Set<string>()\n return [...copilotModels, ...providerModels.flat()].filter((candidate) => {\n if (seen.has(candidate.slug)) return false\n seen.add(candidate.slug)\n return true\n })\n}\n\nfunction getCopilotCodexCandidates(): Array<SyntheticCodexModelCandidate> {\n const candidates: Array<SyntheticCodexModelCandidate> = []\n for (const model of state.models?.data ?? []) {\n try {\n if (isCopilotCodexCandidate(model)) {\n candidates.push(createCopilotCodexCandidate(model))\n }\n } catch (error) {\n logger.warn(\"models.codex.copilot_skip_error\", {\n modelId: model.id,\n error,\n })\n }\n }\n return candidates\n}\n\nfunction isCopilotCodexCandidate(model: Model): boolean {\n const endpoints = model.supported_endpoints ?? []\n return (\n endpoints.some(\n (endpoint) =>\n endpoint === MESSAGES_ENDPOINT\n || endpoint === CHAT_COMPLETIONS_ENDPOINT\n || RESPONSES_ENDPOINTS.has(endpoint),\n ) && model.capabilities.supports.tool_calls !== false\n )\n}\n\nfunction describeCopilotAdapter(model: Model): string {\n const supportsResponses = model.supported_endpoints?.some((endpoint) =>\n RESPONSES_ENDPOINTS.has(endpoint),\n )\n // Codex clients only use the native Responses API for gpt-* models; other\n // models fall back to the Messages route even when they advertise native\n // /responses support (see shouldFallbackToMessages).\n if (model.id.startsWith(\"gpt\") && supportsResponses) {\n return `${model.name} through the Copilot Responses API.`\n }\n // Mirrors the Messages route dispatch order: native Messages first, then\n // the Messages-to-Responses translation, then Messages-to-Chat.\n if (model.supported_endpoints?.includes(MESSAGES_ENDPOINT)) {\n return `${model.name} through the Copilot Messages adapter.`\n }\n if (supportsResponses) {\n return `${model.name} through the Copilot Messages-to-Responses adapter.`\n }\n return `${model.name} through the Copilot Messages-to-Chat adapter.`\n}\n\nfunction createCopilotCodexCandidate(\n model: Model,\n): SyntheticCodexModelCandidate {\n const reasoningEfforts = normalizeReasoningEfforts(\n model.capabilities.supports.reasoning_effort,\n )\n return {\n slug: toClientModelId(model.id),\n displayName: model.name,\n description: describeCopilotAdapter(model),\n contextWindow: positiveNumber(\n model.capabilities.limits.max_prompt_tokens,\n 256_000,\n ),\n maxOutputTokens: positiveNumber(\n model.capabilities.limits.max_output_tokens,\n 32_000,\n ),\n inputModalities:\n model.capabilities.supports.vision ? [\"text\", \"image\"] : [\"text\"],\n reasoningEfforts,\n defaultReasoningEffort: selectDefaultReasoningEffort(reasoningEfforts),\n }\n}\n\nasync function getProviderCodexCandidates(\n provider: string,\n requestHeaders: Headers,\n): Promise<Array<SyntheticCodexModelCandidate>> {\n if (provider === \"codex\") return []\n\n try {\n const providerConfig = await resolveProviderConfig(provider)\n if (!providerConfig || providerConfig.name === \"codex\") return []\n\n const remoteModels = await getProviderModelRecords(\n providerConfig,\n requestHeaders,\n )\n const remoteById = new Map(\n remoteModels.flatMap((model) => {\n const id = getStringField(model, \"id\")\n return id ? [[id, model] as const] : []\n }),\n )\n const modelIds = new Set([\n ...remoteById.keys(),\n ...Object.keys(providerConfig.models ?? {}),\n ])\n\n const candidates: Array<SyntheticCodexModelCandidate> = []\n for (const modelId of modelIds) {\n const effectiveType = resolveEffectiveProviderType(\n providerConfig,\n modelId,\n )\n const usesMessagesFallback = isMessagesFallbackProviderType(effectiveType)\n if (!usesMessagesFallback && effectiveType !== \"openai-responses\") {\n continue\n }\n const modelConfig = providerConfig.models?.[modelId]\n candidates.push(\n createProviderCodexCandidate(\n providerConfig,\n modelId,\n remoteById.get(modelId),\n modelConfig,\n effectiveType,\n ),\n )\n }\n return candidates\n } catch (error) {\n logger.warn(\"models.codex.provider_skip_error\", { provider, error })\n return []\n }\n}\n\nfunction isMessagesFallbackProviderType(type: ProviderType): boolean {\n return type === \"anthropic\" || type === \"openai-compatible\"\n}\n\nfunction describeProviderAdapter(type: ProviderType): string {\n if (type === \"anthropic\") return \"Messages\"\n if (type === \"openai-responses\") return \"Messages-to-Responses\"\n return \"Messages-to-Chat\"\n}\n\nfunction createProviderCodexCandidate(\n providerConfig: ResolvedProviderConfig,\n modelId: string,\n remoteModel: Record<string, unknown> | undefined,\n modelConfig: ModelConfig | undefined,\n effectiveType: ProviderType,\n): SyntheticCodexModelCandidate {\n const builtinModelConfig = builtinProviderModelRegistry.getModelConfig(\n providerConfig.name,\n modelId,\n )\n const configuredReasoningEfforts = normalizeReasoningEfforts(\n modelConfig?.reasoningEfforts,\n )\n const remoteReasoningEfforts = normalizeRemoteReasoningEfforts(remoteModel)\n const builtinReasoningEfforts = normalizeReasoningEfforts(\n builtinModelConfig?.reasoningEfforts,\n )\n const reasoningEfforts =\n configuredReasoningEfforts.length > 0 ? configuredReasoningEfforts\n : remoteReasoningEfforts.length > 0 ? remoteReasoningEfforts\n : builtinReasoningEfforts\n const configuredModalities = normalizeInputModalities(\n modelConfig?.inputModalities,\n )\n const remoteModalities = normalizeInputModalities(\n remoteModel?.input_modalities ?? remoteModel?.modalities,\n )\n const builtinModalities = normalizeInputModalities(\n builtinModelConfig?.inputModalities,\n )\n const displayName =\n getStringField(remoteModel ?? {}, \"display_name\")\n ?? getStringField(remoteModel ?? {}, \"name\")\n ?? modelId\n const adapterName = describeProviderAdapter(effectiveType)\n // Codex clients only drive gpt-* models through the native Responses API;\n // other Responses-capable models fall back to the Messages adapter (see\n // shouldFallbackToMessages), so only gpt-* models require upstream catalog\n // metadata and the rest can be synthesized like Messages-fallback models.\n const requiresCatalogMatch =\n effectiveType === \"openai-responses\" && modelId.startsWith(\"gpt\")\n\n return {\n slug: `${providerConfig.name}/${modelId}`,\n catalogSlug: modelId,\n catalogMatchRequired: requiresCatalogMatch,\n providerName: providerConfig.name,\n displayName: `${displayName} (${providerConfig.name})`,\n description: `${displayName} through the ${providerConfig.name} ${adapterName} adapter.`,\n contextWindow: positiveNumber(\n modelConfig?.contextWindow\n ?? getFirstPositiveNumber(remoteModel, [\n \"context_window\",\n \"context_length\",\n \"max_context_length\",\n \"max_model_len\",\n ])\n ?? builtinModelConfig?.contextWindow,\n 256_000,\n ),\n maxOutputTokens: positiveNumber(\n modelConfig?.maxOutputTokens\n ?? getFirstPositiveNumber(remoteModel, [\"max_output_tokens\"])\n ?? builtinModelConfig?.maxOutputTokens,\n 32_000,\n ),\n inputModalities: resolveInputModalities(\n providerConfig.name,\n configuredModalities,\n remoteModalities,\n builtinModalities,\n ),\n reasoningEfforts,\n defaultReasoningEffort: selectDefaultReasoningEffort(\n reasoningEfforts,\n modelConfig?.defaultReasoningEffort\n ?? builtinModelConfig?.defaultReasoningEffort,\n ),\n }\n}\n\nfunction normalizeRemoteReasoningEfforts(\n model: Record<string, unknown> | undefined,\n): Array<CodexReasoningEffort> {\n if (!model) return []\n const value = model.reasoning_efforts ?? model.supported_reasoning_levels\n if (!Array.isArray(value)) return []\n return normalizeReasoningEfforts(\n value.map((entry: unknown) =>\n isRecord(entry) && typeof entry.effort === \"string\" ?\n entry.effort\n : entry,\n ),\n )\n}\n\nfunction normalizeReasoningEfforts(\n value: unknown,\n): Array<CodexReasoningEffort> {\n if (!Array.isArray(value)) return []\n return [\n ...new Set(\n value.filter(\n (effort): effort is CodexReasoningEffort =>\n typeof effort === \"string\"\n && CODEX_REASONING_EFFORTS.has(effort as CodexReasoningEffort),\n ),\n ),\n ]\n}\n\nfunction normalizeInputModalities(value: unknown): Array<\"text\" | \"image\"> {\n if (!Array.isArray(value)) return []\n return [\n ...new Set(\n value.filter(\n (modality): modality is \"text\" | \"image\" =>\n modality === \"text\" || modality === \"image\",\n ),\n ),\n ]\n}\n\nfunction fallbackModalities(\n remoteModalities: Array<\"text\" | \"image\">,\n builtinModalities: Array<\"text\" | \"image\">,\n): Array<\"text\" | \"image\"> {\n if (remoteModalities.length > 0) return remoteModalities\n return builtinModalities.length > 0 ? builtinModalities : [\"text\"]\n}\n\nfunction resolveInputModalities(\n providerName: string,\n configuredModalities: Array<\"text\" | \"image\">,\n remoteModalities: Array<\"text\" | \"image\">,\n builtinModalities: Array<\"text\" | \"image\">,\n): Array<\"text\" | \"image\"> {\n if (configuredModalities.length > 0) return configuredModalities\n const modalities = fallbackModalities(remoteModalities, builtinModalities)\n if (providerName === \"kimi\") {\n return [...new Set<\"text\" | \"image\">([...modalities, \"image\"])]\n }\n return modalities\n}\n\nfunction selectDefaultReasoningEffort(\n efforts: Array<CodexReasoningEffort>,\n configured?: CodexReasoningEffort,\n): CodexReasoningEffort {\n if (configured && efforts.includes(configured)) return configured\n if (efforts.includes(\"max\")) return \"max\"\n return efforts[0] ?? \"max\"\n}\n\nfunction positiveNumber(value: unknown, fallback: number): number {\n return typeof value === \"number\" && Number.isFinite(value) && value > 0 ?\n Math.floor(value)\n : fallback\n}\n\nfunction getFirstPositiveNumber(\n model: Record<string, unknown> | undefined,\n fields: Array<string>,\n): number | undefined {\n if (!model) return undefined\n for (const field of fields) {\n const value = model[field]\n if (typeof value === \"number\" && Number.isFinite(value) && value > 0) {\n return value\n }\n }\n return undefined\n}\n\nmodelRoutes.get(\"/\", async (c) => {\n try {\n if (isCodexUserAgent(c.req.header(\"user-agent\"))) {\n const enabledProviders = listEnabledProviders()\n const codexProviderName = enabledProviders.find(\n (provider) => provider === \"codex\",\n )\n return await handleMergedCodexModels(\n c,\n getSyntheticCodexModels(c.req.raw.headers, enabledProviders),\n {\n includeCodexProviderAliases: codexProviderName !== undefined,\n codexProviderName,\n },\n )\n }\n\n const models = await getAggregatedModels(c.req.raw.headers)\n\n return c.json({\n object: \"list\",\n data: models,\n has_more: false,\n })\n } catch (error) {\n return await forwardError(c, error)\n }\n})\n","import { Hono } from \"hono\"\n\nimport { forwardError } from \"~/lib/error\"\nimport { createHandlerLogger, debugJsonAsync } from \"~/lib/logger\"\nimport { resolveProviderConfig } from \"~/lib/provider-resolver\"\nimport { handleAlphaSearchRequest } from \"~/routes/alpha-search/route\"\nimport {\n createProviderProxyResponse,\n forwardProviderAlphaSearch,\n} from \"~/services/providers/provider-proxy\"\n\nconst logger = createHandlerLogger(\"provider-alpha-search-handler\")\n\nexport const providerAlphaSearchRoutes = new Hono()\n\nexport const providerAlphaSearchRouteDependencies = {\n createProviderProxyResponse,\n forwardProviderAlphaSearch,\n handleAlphaSearchRequest,\n resolveProviderConfig,\n}\n\nproviderAlphaSearchRoutes.post(\"/\", async (c) => {\n const provider = c.req.param(\"provider\") ?? \"\"\n\n try {\n const providerConfig =\n await providerAlphaSearchRouteDependencies.resolveProviderConfig(provider)\n if (!providerConfig) {\n return c.json(\n {\n error: {\n message: `Provider '${provider}' not found or disabled`,\n type: \"invalid_request_error\",\n },\n },\n 404,\n )\n }\n\n if (providerConfig.name === \"codex\") {\n return await providerAlphaSearchRouteDependencies.handleAlphaSearchRequest(\n c,\n providerConfig,\n )\n }\n\n await debugJsonAsync(logger, \"provider.alpha_search.request\", async () => ({\n body: await c.req.raw.clone().text(),\n provider,\n }))\n\n const upstreamResponse =\n await providerAlphaSearchRouteDependencies.forwardProviderAlphaSearch(\n providerConfig,\n c.req.raw,\n )\n\n await debugJsonAsync(\n logger,\n \"provider.alpha_search.response\",\n async () => ({\n body: await upstreamResponse.clone().text(),\n provider,\n statusCode: upstreamResponse.status,\n }),\n )\n\n return providerAlphaSearchRouteDependencies.createProviderProxyResponse(\n upstreamResponse,\n )\n } catch (error) {\n logger.error(\"provider.alpha_search.error\", { provider, error })\n return await forwardError(c, error)\n }\n})\n","import { Hono, type Context } from \"hono\"\n\nimport { forwardError } from \"~/lib/error\"\nimport { createHandlerLogger, debugJson, debugJsonAsync } from \"~/lib/logger\"\nimport { resolveProviderConfig } from \"~/lib/provider-resolver\"\nimport { handleCodexImages } from \"~/routes/images/route\"\nimport type { CodexImagesOperation } from \"~/services/codex/images\"\nimport {\n createProviderProxyResponse,\n forwardProviderImages,\n} from \"~/services/providers/provider-proxy\"\n\nconst logger = createHandlerLogger(\"provider-images-handler\")\n\nexport const providerImageRoutes = new Hono()\n\nfunction getContentMetadata(headers: Headers) {\n return {\n contentType: headers.get(\"content-type\"),\n contentLength: headers.get(\"content-length\"),\n }\n}\n\nasync function handleProviderImages(\n c: Context,\n operation: CodexImagesOperation,\n): Promise<Response> {\n const provider = c.req.param(\"provider\") ?? \"\"\n\n try {\n const providerConfig = await resolveProviderConfig(provider)\n if (!providerConfig) {\n return c.json(\n {\n error: {\n message: `Provider '${provider}' not found or disabled`,\n type: \"invalid_request_error\",\n },\n },\n 404,\n )\n }\n\n if (providerConfig.name === \"codex\") {\n return await handleCodexImages(c, operation, providerConfig)\n }\n\n if (operation === \"generations\") {\n await debugJsonAsync(\n logger,\n \"provider.images.generations.request\",\n async () => ({\n body: await c.req.raw.clone().text(),\n provider,\n }),\n )\n } else {\n debugJson(logger, \"provider.images.edits.request\", {\n ...getContentMetadata(c.req.raw.headers),\n provider,\n })\n }\n\n const upstreamResponse = await forwardProviderImages(\n providerConfig,\n c.req.raw,\n operation,\n )\n\n debugJson(logger, `provider.images.${operation}.response`, {\n ...getContentMetadata(upstreamResponse.headers),\n provider,\n statusCode: upstreamResponse.status,\n })\n\n return createProviderProxyResponse(upstreamResponse)\n } catch (error) {\n logger.error(`provider.images.${operation}.error`, { provider, error })\n return await forwardError(c, error)\n }\n}\n\nproviderImageRoutes.post(\"/generations\", (c) =>\n handleProviderImages(c, \"generations\"),\n)\nproviderImageRoutes.post(\"/edits\", (c) => handleProviderImages(c, \"edits\"))\n","import { Hono } from \"hono\"\n\nimport { forwardError } from \"~/lib/error\"\n\nimport { handleProviderCountTokens } from \"./count-tokens-handler\"\nimport { handleProviderMessages } from \"./handler\"\n\nexport const providerMessageRoutes = new Hono()\n\nproviderMessageRoutes.post(\"/\", async (c) => {\n try {\n return await handleProviderMessages(c)\n } catch (error) {\n return await forwardError(c, error)\n }\n})\n\nproviderMessageRoutes.post(\"/count_tokens\", async (c) => {\n try {\n return await handleProviderCountTokens(c)\n } catch (error) {\n return await forwardError(c, error)\n }\n})\n","import { Hono } from \"hono\"\n\nimport { forwardError } from \"~/lib/error\"\nimport { createHandlerLogger } from \"~/lib/logger\"\nimport { resolveProviderConfig } from \"~/lib/provider-resolver\"\nimport {\n handleCodexModelsProxy,\n isCodexUserAgent,\n} from \"~/routes/models/codex-models\"\nimport { getModels as getCodexModels } from \"~/services/codex/get-models\"\nimport {\n createProviderProxyResponse,\n forwardProviderModels,\n} from \"~/services/providers/provider-proxy\"\n\nconst logger = createHandlerLogger(\"provider-models-handler\")\n\nexport const providerModelRoutes = new Hono()\n\nproviderModelRoutes.get(\"/\", async (c) => {\n const provider = c.req.param(\"provider\") ?? \"\"\n\n try {\n const providerConfig = await resolveProviderConfig(provider)\n if (!providerConfig) {\n return c.json(\n {\n error: {\n message: `Provider '${provider}' not found or disabled`,\n type: \"invalid_request_error\",\n },\n },\n 404,\n )\n }\n\n if (providerConfig.name === \"codex\") {\n if (isCodexUserAgent(c.req.header(\"user-agent\"))) {\n return await handleCodexModelsProxy(c, providerConfig)\n }\n\n const models = getCodexModels()\n return c.json({\n object: \"list\",\n data: models.data,\n has_more: false,\n })\n }\n\n const upstreamResponse = await forwardProviderModels(\n providerConfig,\n c.req.raw.headers,\n )\n\n logger.debug(\"provider.models.response\", {\n provider,\n statusCode: upstreamResponse.status,\n })\n\n return createProviderProxyResponse(upstreamResponse)\n } catch (error) {\n logger.error(\"provider.models.error\", {\n provider,\n error,\n })\n return await forwardError(c, error)\n }\n})\n","import { ResponsesMessagesTranslationError } from \"./messages-translation\"\n\nconst CUSTOM_TOOL_INPUT_PREFIX_TOKENS = [\"{\", '\"input\"', \":\", '\"'] as const\n\ntype DecoderState = \"prefix\" | \"input\" | \"suffix\" | \"trailing\" | \"done\"\ntype EscapeState = \"plain\" | \"escaped\" | \"unicode\"\n\nexport class CustomToolInputStreamDecoder {\n private readonly inputParts = new Array<string>()\n private encodedInput = \"\"\n private escapeState: EscapeState = \"plain\"\n private failed = false\n private finished = false\n private offset = 0\n private prefixCharOffset = 0\n private prefixTokenOffset = 0\n private safeInputLength = 0\n private state: DecoderState = \"prefix\"\n private trailingDepth = 0\n private trailingEscaped = false\n private trailingInString = false\n private unicodeDigitsRemaining = 0\n\n append(partialJson: string): string {\n if (this.failed) return this.fail(\"decoder is already in a failed state\")\n if (this.finished) return this.fail(\"data arrived after the input was done\")\n\n const deltaParts = new Array<string>()\n for (const char of partialJson) {\n this.offset += char.length\n this.consume(char, deltaParts)\n }\n this.flushSafeInput(deltaParts)\n\n const delta = deltaParts.join(\"\")\n if (delta) this.inputParts.push(delta)\n return delta\n }\n\n finish(): string {\n if (this.failed) return this.fail(\"decoder is already in a failed state\")\n if (this.finished) return this.fail(\"input was already completed\")\n if (\n this.state !== \"done\"\n || this.escapeState !== \"plain\"\n || this.encodedInput\n ) {\n return this.fail(\"input ended before the wrapper was complete\")\n }\n\n this.finished = true\n return this.inputParts.join(\"\")\n }\n\n private consume(char: string, deltaParts: Array<string>): void {\n switch (this.state) {\n case \"prefix\":\n return this.consumePrefix(char)\n case \"suffix\":\n return this.consumeSuffix(char)\n case \"trailing\":\n return this.consumeTrailing(char)\n case \"done\":\n return this.consumeDone(char)\n default:\n return this.consumeInput(char, deltaParts)\n }\n }\n\n private consumePrefix(char: string): void {\n const token = CUSTOM_TOOL_INPUT_PREFIX_TOKENS[this.prefixTokenOffset]\n if (this.prefixCharOffset === 0 && isJsonWhitespace(char)) return\n if (char !== token?.[this.prefixCharOffset]) {\n return this.fail(\"unexpected custom tool input prefix\")\n }\n this.prefixCharOffset += 1\n if (this.prefixCharOffset < token.length) return\n\n this.prefixTokenOffset += 1\n this.prefixCharOffset = 0\n if (this.prefixTokenOffset === CUSTOM_TOOL_INPUT_PREFIX_TOKENS.length) {\n this.state = \"input\"\n }\n }\n\n private consumeSuffix(char: string): void {\n if (isJsonWhitespace(char)) return\n if (char === \"}\") {\n this.state = \"done\"\n return\n }\n if (char === \",\") {\n // Tolerate extra properties after the input string; skip them until\n // the wrapper object closes.\n this.state = \"trailing\"\n this.trailingDepth = 1\n return\n }\n return this.fail('expected \"}\" or \",\" after the input string')\n }\n\n private consumeTrailing(char: string): void {\n if (this.trailingInString) return this.consumeTrailingString(char)\n\n if (char === '\"') {\n this.trailingInString = true\n return\n }\n if (char === \"{\" || char === \"[\") {\n this.trailingDepth += 1\n return\n }\n if (char === \"}\" || char === \"]\") {\n this.trailingDepth -= 1\n if (this.trailingDepth === 0) this.state = \"done\"\n }\n }\n\n private consumeTrailingString(char: string): void {\n if (this.trailingEscaped) {\n this.trailingEscaped = false\n return\n }\n if (char === \"\\\\\") {\n this.trailingEscaped = true\n return\n }\n if (char === '\"') this.trailingInString = false\n }\n\n private consumeDone(char: string): void {\n if (!isJsonWhitespace(char)) {\n return this.fail(\"unexpected data after the input wrapper\")\n }\n }\n\n private consumeInput(char: string, deltaParts: Array<string>): void {\n if (this.escapeState === \"unicode\") return this.consumeUnicodeEscape(char)\n if (this.escapeState === \"escaped\") return this.consumeEscape(char)\n\n if (char === \"\\\\\") {\n this.encodedInput += char\n this.escapeState = \"escaped\"\n return\n }\n if (char === '\"') {\n this.flushSafeInput(deltaParts)\n this.state = \"suffix\"\n return\n }\n if ((char.codePointAt(0) ?? 0) < 0x20) {\n return this.fail(\"unescaped control character in custom tool input\")\n }\n\n this.encodedInput += char\n this.safeInputLength = this.encodedInput.length\n }\n\n private consumeUnicodeEscape(char: string): void {\n if (!/^[0-9A-Fa-f]$/u.test(char)) {\n return this.fail(\"invalid Unicode escape\")\n }\n this.encodedInput += char\n this.unicodeDigitsRemaining -= 1\n if (this.unicodeDigitsRemaining === 0) {\n this.escapeState = \"plain\"\n this.safeInputLength = this.encodedInput.length\n }\n }\n\n private consumeEscape(char: string): void {\n if (!String.raw`\"\\/bfnrtu`.includes(char)) {\n return this.fail(\"invalid JSON escape\")\n }\n this.encodedInput += char\n if (char === \"u\") {\n this.escapeState = \"unicode\"\n this.unicodeDigitsRemaining = 4\n } else {\n this.escapeState = \"plain\"\n this.safeInputLength = this.encodedInput.length\n }\n }\n\n private flushSafeInput(deltaParts: Array<string>): void {\n if (this.safeInputLength === 0) return\n\n const encoded = this.encodedInput.slice(0, this.safeInputLength)\n const decoded = JSON.parse(`\"${encoded}\"`) as string\n\n if (decoded) deltaParts.push(decoded)\n this.encodedInput = this.encodedInput.slice(this.safeInputLength)\n this.safeInputLength = 0\n }\n\n private fail(_reason: string): never {\n this.failed = true\n throw new ResponsesMessagesTranslationError(\n `Invalid tool input JSON. Expected format: {\"input\":\"...\"}`,\n 502,\n )\n }\n}\n\nfunction isJsonWhitespace(char: string): boolean {\n return char === \" \" || char === \"\\t\" || char === \"\\r\" || char === \"\\n\"\n}\n","import type {\n AnthropicResponse,\n AnthropicStreamEventData,\n AnthropicUsage,\n} from \"~/lib/types/anthropic\"\nimport type {\n ResponseOutputCustomToolCall,\n ResponseOutputFunctionCall,\n ResponseOutputItem,\n ResponseOutputMessage,\n ResponseOutputReasoning,\n ResponsesResult,\n ResponseStreamEvent,\n} from \"~/lib/types/responses\"\n\nimport { CustomToolInputStreamDecoder } from \"./custom-tool-input-stream-decoder\"\nimport {\n createMessagesBackedResponsesResult,\n encodeMessagesCompaction,\n markMessagesReasoningId,\n resolveToolDescriptor,\n ResponsesMessagesTranslationError,\n toResponseId,\n translateAnthropicUsage,\n type MessagesResponseTranslationContext,\n} from \"./messages-translation\"\n\nconst EMPTY_SIGNATURE_ENCRYPTED_CONTENT = \"\"\n\ninterface MessagesStreamChunk {\n data?: string\n event?: string\n}\n\ninterface StreamOutputState<T extends ResponseOutputItem> {\n done: boolean\n item: T\n outputIndex: number\n}\n\ninterface StreamReasoningState\n extends StreamOutputState<ResponseOutputReasoning> {\n signature: string\n summaryStarted: boolean\n text: string\n type: \"reasoning\"\n}\n\ninterface StreamMessageState extends StreamOutputState<ResponseOutputMessage> {\n text: string\n type: \"message\"\n}\n\ninterface StreamFunctionToolState\n extends StreamOutputState<ResponseOutputFunctionCall> {\n type: \"function_tool\"\n}\n\ninterface StreamCustomToolState\n extends StreamOutputState<ResponseOutputCustomToolCall> {\n decoder: CustomToolInputStreamDecoder\n type: \"custom_tool\"\n}\n\ntype StreamBlockState =\n | StreamCustomToolState\n | StreamFunctionToolState\n | StreamMessageState\n | StreamReasoningState\n\ninterface TranslationState {\n blocks: Map<number, StreamBlockState>\n compactionText: string\n compactionToolCall: boolean\n context: MessagesResponseTranslationContext\n copilotUsage: ResponsesResult[\"copilot_usage\"]\n createdAt: number\n initialized: boolean\n messageStopped: boolean\n model: string\n nextOutputIndex: number\n outputText: string\n responseId: string\n sequence: number\n stopReason: AnthropicResponse[\"stop_reason\"]\n usage: AnthropicUsage\n}\n\nexport async function* translateMessagesStream(\n chunks: AsyncIterable<MessagesStreamChunk>,\n context: MessagesResponseTranslationContext,\n): AsyncGenerator<ResponseStreamEvent> {\n const state = createTranslationState(context)\n\n try {\n for await (const chunk of chunks) {\n if (!chunk.data || chunk.data === \"[DONE]\") continue\n\n const event = parseAnthropicEvent(chunk.data)\n if (event.type === \"ping\") continue\n if (event.type === \"error\") {\n throw new ResponsesMessagesTranslationError(event.error.message, 502)\n }\n\n if (!state.initialized) {\n initializeState(state, event)\n yield createLifecycleEvent(state, \"response.created\")\n yield createLifecycleEvent(state, \"response.in_progress\")\n }\n\n for (const translated of translateEvent(state, event)) {\n yield translated\n }\n if (state.messageStopped) break\n }\n\n if (!state.initialized) {\n throw new ResponsesMessagesTranslationError(\n \"Messages API returned an empty stream\",\n 502,\n )\n }\n\n if (!state.messageStopped) {\n // The upstream messages stream ended without a message_stop event,\n // which means it was interrupted. Surface a failure instead of\n // synthesizing a completed response.\n throw new ResponsesMessagesTranslationError(\n \"Messages stream ended without a message_stop event\",\n 502,\n )\n }\n } catch (error) {\n if (!state.initialized) {\n // No lifecycle events reached the client yet. Emit response.created and\n // response.in_progress before the failure so clients tracking the\n // lifecycle receive a protocol-valid stream instead of a silent close.\n yield createLifecycleEvent(state, \"response.created\")\n yield createLifecycleEvent(state, \"response.in_progress\")\n }\n yield createErrorEvent(state, error)\n yield createFailedEvent(state, error)\n }\n}\n\nexport function responsesResultToStreamEvents(\n result: ResponsesResult,\n): Array<ResponseStreamEvent> {\n let sequence = 0\n const next = (value: Record<string, unknown>): ResponseStreamEvent =>\n ({ ...value, sequence_number: sequence++ }) as ResponseStreamEvent\n const inProgress = {\n ...result,\n output: [],\n output_text: \"\",\n status: \"in_progress\",\n usage: null,\n }\n const events: Array<ResponseStreamEvent> = [\n next({ type: \"response.created\", response: inProgress }),\n next({ type: \"response.in_progress\", response: inProgress }),\n ]\n\n for (const [outputIndex, item] of result.output.entries()) {\n events.push(\n next({\n type: \"response.output_item.added\",\n output_index: outputIndex,\n item: { ...structuredClone(item), status: \"in_progress\" },\n }),\n )\n\n if (item.type === \"message\") {\n const textPart = item.content?.find((part) => part.type === \"output_text\")\n if (textPart?.type === \"output_text\") {\n events.push(\n next({\n type: \"response.content_part.added\",\n item_id: item.id,\n output_index: outputIndex,\n content_index: 0,\n part: { type: \"output_text\", text: \"\", annotations: [] },\n }),\n next({\n type: \"response.output_text.delta\",\n item_id: item.id,\n output_index: outputIndex,\n content_index: 0,\n delta: textPart.text,\n }),\n next({\n type: \"response.output_text.done\",\n item_id: item.id,\n output_index: outputIndex,\n content_index: 0,\n text: textPart.text,\n }),\n next({\n type: \"response.content_part.done\",\n item_id: item.id,\n output_index: outputIndex,\n content_index: 0,\n part: textPart,\n }),\n )\n }\n } else if (item.type === \"reasoning\") {\n const text = item.summary?.[0]?.text\n if (text) {\n const part = { type: \"summary_text\", text }\n events.push(\n next({\n type: \"response.reasoning_summary_part.added\",\n item_id: item.id,\n output_index: outputIndex,\n summary_index: 0,\n part: { type: \"summary_text\", text: \"\" },\n }),\n next({\n type: \"response.reasoning_summary_text.delta\",\n item_id: item.id,\n output_index: outputIndex,\n summary_index: 0,\n delta: text,\n }),\n next({\n type: \"response.reasoning_summary_text.done\",\n item_id: item.id,\n output_index: outputIndex,\n summary_index: 0,\n text,\n }),\n next({\n type: \"response.reasoning_summary_part.done\",\n item_id: item.id,\n output_index: outputIndex,\n summary_index: 0,\n part,\n }),\n )\n }\n } else if (item.type === \"function_call\") {\n if (item.arguments) {\n events.push(\n next({\n type: \"response.function_call_arguments.delta\",\n item_id: item.id,\n output_index: outputIndex,\n delta: item.arguments,\n }),\n )\n }\n events.push(\n next({\n type: \"response.function_call_arguments.done\",\n item_id: item.id,\n output_index: outputIndex,\n name: item.name,\n arguments: item.arguments,\n }),\n )\n } else if (item.type === \"custom_tool_call\") {\n if (item.input) {\n events.push(\n next({\n type: \"response.custom_tool_call_input.delta\",\n item_id: item.id,\n output_index: outputIndex,\n delta: item.input,\n }),\n )\n }\n events.push(\n next({\n type: \"response.custom_tool_call_input.done\",\n item_id: item.id,\n output_index: outputIndex,\n name: item.name,\n input: item.input,\n }),\n )\n }\n\n events.push(\n next({\n type: \"response.output_item.done\",\n output_index: outputIndex,\n item,\n }),\n )\n }\n\n events.push(\n next({\n type:\n result.status === \"incomplete\" ? \"response.incomplete\"\n : result.status === \"failed\" ? \"response.failed\"\n : \"response.completed\",\n response: { ...result, output: [] },\n copilot_usage: result.copilot_usage,\n }),\n )\n return events\n}\n\nfunction createTranslationState(\n context: MessagesResponseTranslationContext,\n): TranslationState {\n return {\n blocks: new Map(),\n compactionText: \"\",\n compactionToolCall: false,\n context,\n copilotUsage: null,\n createdAt: Math.floor(Date.now() / 1000),\n initialized: false,\n messageStopped: false,\n model: context.publicModel,\n nextOutputIndex: 0,\n outputText: \"\",\n responseId: `resp_${Date.now().toString(36)}`,\n sequence: 0,\n stopReason: null,\n usage: { input_tokens: 0, output_tokens: 0 },\n }\n}\n\nfunction initializeState(\n state: TranslationState,\n event: Exclude<AnthropicStreamEventData, { type: \"error\" | \"ping\" }>,\n): void {\n if (event.type === \"message_start\") {\n state.responseId = toResponseId(event.message.id)\n state.model = event.message.model\n state.usage = { ...event.message.usage }\n state.copilotUsage = event.message.copilot_usage ?? null\n }\n state.initialized = true\n}\n\nfunction* translateEvent(\n state: TranslationState,\n event: Exclude<AnthropicStreamEventData, { type: \"error\" | \"ping\" }>,\n): Generator<ResponseStreamEvent> {\n switch (event.type) {\n case \"message_start\": {\n state.usage = mergeUsage(state.usage, event.message.usage)\n state.copilotUsage = event.message.copilot_usage ?? state.copilotUsage\n break\n }\n case \"content_block_start\": {\n for (const translated of startContentBlock(state, event)) {\n yield translated\n }\n break\n }\n case \"content_block_delta\": {\n for (const translated of translateContentDelta(state, event)) {\n yield translated\n }\n break\n }\n case \"content_block_stop\": {\n for (const translated of closeContentBlock(state, event.index)) {\n yield translated\n }\n break\n }\n case \"message_delta\": {\n if (event.delta.stop_reason !== undefined) {\n state.stopReason = event.delta.stop_reason\n }\n if (event.usage) state.usage = mergeUsage(state.usage, event.usage)\n state.copilotUsage = event.copilot_usage ?? state.copilotUsage\n break\n }\n case \"message_stop\": {\n for (const translated of closeAllBlocks(state)) yield translated\n for (const translated of finishCompaction(state)) yield translated\n state.messageStopped = true\n yield createTerminalEvent(state)\n break\n }\n }\n}\n\nfunction* startContentBlock(\n state: TranslationState,\n event: Extract<AnthropicStreamEventData, { type: \"content_block_start\" }>,\n): Generator<ResponseStreamEvent> {\n const block = event.content_block\n if (state.context.compaction) {\n if (block.type === \"text\") {\n state.compactionText += block.text\n }\n if (block.type === \"tool_use\" || block.type === \"server_tool_use\") {\n state.compactionToolCall = true\n }\n return\n }\n\n if (block.type === \"text\") {\n const item: ResponseOutputMessage = {\n id: `msg_${state.responseId.slice(-18)}_${event.index}`,\n type: \"message\",\n role: \"assistant\",\n status: \"in_progress\",\n content: [{ type: \"output_text\", text: block.text, annotations: [] }],\n }\n const output = addOutput(state, item)\n state.blocks.set(event.index, {\n ...output,\n type: \"message\",\n text: block.text,\n done: false,\n })\n state.outputText += block.text\n yield createEvent(state, {\n type: \"response.output_item.added\",\n output_index: output.outputIndex,\n item: structuredClone(item),\n })\n yield createEvent(state, {\n type: \"response.content_part.added\",\n item_id: item.id,\n output_index: output.outputIndex,\n content_index: 0,\n part: { type: \"output_text\", text: \"\", annotations: [] },\n })\n if (block.text) {\n yield createEvent(state, {\n type: \"response.output_text.delta\",\n item_id: item.id,\n output_index: output.outputIndex,\n content_index: 0,\n delta: block.text,\n })\n }\n return\n }\n\n if (block.type === \"thinking\") {\n const item: ResponseOutputReasoning = {\n id: markMessagesReasoningId(\n `rs_${state.responseId.slice(-18)}_${event.index}`,\n ),\n type: \"reasoning\",\n status: \"in_progress\",\n summary: [],\n encrypted_content: EMPTY_SIGNATURE_ENCRYPTED_CONTENT,\n }\n const output = addOutput(state, item)\n const reasoning: StreamReasoningState = {\n ...output,\n type: \"reasoning\",\n signature: \"\",\n summaryStarted: false,\n text: \"\",\n done: false,\n }\n state.blocks.set(event.index, reasoning)\n yield createEvent(state, {\n type: \"response.output_item.added\",\n output_index: output.outputIndex,\n item: structuredClone(item),\n })\n if (block.thinking) {\n for (const translated of appendReasoningText(\n state,\n reasoning,\n block.thinking,\n )) {\n yield translated\n }\n }\n return\n }\n\n if (block.type === \"tool_use\") {\n const descriptor = resolveToolDescriptor(state.context.registry, block.name)\n const common = {\n call_id: block.id,\n name: descriptor.name,\n status: \"in_progress\" as const,\n ...(descriptor.namespace ? { namespace: descriptor.namespace } : {}),\n }\n if (descriptor.kind === \"custom\") {\n const item: ResponseOutputCustomToolCall = {\n ...common,\n id: `ctc_${state.responseId.slice(-18)}_${event.index}`,\n type: \"custom_tool_call\",\n input: \"\",\n }\n const output = addOutput(state, item)\n const decoder = new CustomToolInputStreamDecoder()\n state.blocks.set(event.index, {\n ...output,\n type: \"custom_tool\",\n decoder,\n done: false,\n })\n yield createEvent(state, {\n type: \"response.output_item.added\",\n output_index: output.outputIndex,\n item: structuredClone(item),\n })\n if (Object.keys(block.input).length > 0) {\n const delta = decoder.append(JSON.stringify(block.input))\n if (delta) {\n yield createEvent(state, {\n type: \"response.custom_tool_call_input.delta\",\n item_id: item.id,\n output_index: output.outputIndex,\n delta,\n })\n }\n }\n return\n }\n\n const item: ResponseOutputFunctionCall = {\n ...common,\n id: `fc_${state.responseId.slice(-18)}_${event.index}`,\n type: \"function_call\",\n arguments: \"\",\n }\n const output = addOutput(state, item)\n const initialInput =\n Object.keys(block.input).length > 0 ? JSON.stringify(block.input) : \"\"\n state.blocks.set(event.index, {\n ...output,\n type: \"function_tool\",\n done: false,\n })\n yield createEvent(state, {\n type: \"response.output_item.added\",\n output_index: output.outputIndex,\n item: structuredClone(item),\n })\n if (initialInput) {\n item.arguments = initialInput\n yield createEvent(state, {\n type: \"response.function_call_arguments.delta\",\n item_id: item.id,\n output_index: output.outputIndex,\n delta: initialInput,\n })\n }\n }\n}\n\nfunction* translateContentDelta(\n state: TranslationState,\n event: Extract<AnthropicStreamEventData, { type: \"content_block_delta\" }>,\n): Generator<ResponseStreamEvent> {\n if (state.context.compaction) {\n if (event.delta.type === \"text_delta\") {\n state.compactionText += event.delta.text\n }\n return\n }\n\n const block = state.blocks.get(event.index)\n if (!block) return\n\n if (event.delta.type === \"text_delta\" && block.type === \"message\") {\n block.text += event.delta.text\n const part = block.item.content?.[0]\n if (part?.type === \"output_text\") part.text = block.text\n state.outputText += event.delta.text\n yield createEvent(state, {\n type: \"response.output_text.delta\",\n item_id: block.item.id,\n output_index: block.outputIndex,\n content_index: 0,\n delta: event.delta.text,\n })\n return\n }\n\n if (event.delta.type === \"thinking_delta\" && block.type === \"reasoning\") {\n for (const translated of appendReasoningText(\n state,\n block,\n event.delta.thinking,\n )) {\n yield translated\n }\n return\n }\n\n if (event.delta.type === \"signature_delta\" && block.type === \"reasoning\") {\n block.signature += event.delta.signature\n block.item.encrypted_content =\n block.signature || EMPTY_SIGNATURE_ENCRYPTED_CONTENT\n return\n }\n\n if (\n event.delta.type === \"input_json_delta\"\n && block.type === \"function_tool\"\n ) {\n block.item.arguments += event.delta.partial_json\n yield createEvent(state, {\n type: \"response.function_call_arguments.delta\",\n item_id: block.item.id,\n output_index: block.outputIndex,\n delta: event.delta.partial_json,\n })\n return\n }\n\n if (event.delta.type === \"input_json_delta\" && block.type === \"custom_tool\") {\n const delta = block.decoder.append(event.delta.partial_json)\n if (delta) {\n yield createEvent(state, {\n type: \"response.custom_tool_call_input.delta\",\n item_id: block.item.id,\n output_index: block.outputIndex,\n delta,\n })\n }\n }\n}\n\nfunction* appendReasoningText(\n state: TranslationState,\n block: StreamReasoningState,\n text: string,\n): Generator<ResponseStreamEvent> {\n if (!text) return\n if (!block.summaryStarted) {\n block.summaryStarted = true\n yield createEvent(state, {\n type: \"response.reasoning_summary_part.added\",\n item_id: block.item.id,\n output_index: block.outputIndex,\n summary_index: 0,\n part: { type: \"summary_text\", text: \"\" },\n })\n }\n block.text += text\n block.item.summary = [{ type: \"summary_text\", text: block.text }]\n yield createEvent(state, {\n type: \"response.reasoning_summary_text.delta\",\n item_id: block.item.id,\n output_index: block.outputIndex,\n summary_index: 0,\n delta: text,\n })\n}\n\nfunction* closeContentBlock(\n state: TranslationState,\n index: number,\n): Generator<ResponseStreamEvent> {\n const block = state.blocks.get(index)\n if (!block || block.done) return\n\n if (block.type === \"message\") {\n yield createEvent(state, {\n type: \"response.output_text.done\",\n item_id: block.item.id,\n output_index: block.outputIndex,\n content_index: 0,\n text: block.text,\n })\n const part = block.item.content?.[0]\n if (part) {\n yield createEvent(state, {\n type: \"response.content_part.done\",\n item_id: block.item.id,\n output_index: block.outputIndex,\n content_index: 0,\n part: structuredClone(part),\n })\n }\n } else if (block.type === \"reasoning\") {\n if (block.text) {\n const part = { type: \"summary_text\", text: block.text }\n yield createEvent(state, {\n type: \"response.reasoning_summary_text.done\",\n item_id: block.item.id,\n output_index: block.outputIndex,\n summary_index: 0,\n text: block.text,\n })\n yield createEvent(state, {\n type: \"response.reasoning_summary_part.done\",\n item_id: block.item.id,\n output_index: block.outputIndex,\n summary_index: 0,\n part,\n })\n }\n block.item.encrypted_content =\n block.signature || EMPTY_SIGNATURE_ENCRYPTED_CONTENT\n } else if (block.type === \"custom_tool\") {\n const input = block.decoder.finish()\n block.item.input = input\n yield createEvent(state, {\n type: \"response.custom_tool_call_input.done\",\n item_id: block.item.id,\n output_index: block.outputIndex,\n name: block.item.name,\n input,\n })\n } else {\n yield createEvent(state, {\n type: \"response.function_call_arguments.done\",\n item_id: block.item.id,\n output_index: block.outputIndex,\n name: block.item.name,\n arguments: block.item.arguments,\n })\n }\n\n block.item.status = \"completed\"\n block.done = true\n yield createEvent(state, {\n type: \"response.output_item.done\",\n output_index: block.outputIndex,\n item: structuredClone(block.item),\n })\n state.blocks.delete(index)\n}\n\nfunction* closeAllBlocks(\n state: TranslationState,\n): Generator<ResponseStreamEvent> {\n for (const index of [...state.blocks.keys()].sort(\n (left, right) => left - right,\n )) {\n for (const translated of closeContentBlock(state, index)) yield translated\n }\n}\n\nfunction* finishCompaction(\n state: TranslationState,\n): Generator<ResponseStreamEvent> {\n if (!state.context.compaction) return\n if (state.compactionToolCall) {\n throw new ResponsesMessagesTranslationError(\n \"Messages API attempted a tool call during compaction\",\n 502,\n )\n }\n const summary = state.compactionText.trim()\n if (!summary) {\n throw new ResponsesMessagesTranslationError(\n \"Messages API compaction stream did not contain a text summary\",\n 502,\n )\n }\n const item: ResponseOutputItem = {\n id: `cmp_${state.responseId.slice(-24)}`,\n type: \"compaction\",\n encrypted_content: encodeMessagesCompaction(summary),\n }\n const output = addOutput(state, item)\n yield createEvent(state, {\n type: \"response.output_item.added\",\n output_index: output.outputIndex,\n item,\n })\n yield createEvent(state, {\n type: \"response.output_item.done\",\n output_index: output.outputIndex,\n item,\n })\n}\n\nfunction addOutput<T extends ResponseOutputItem>(\n state: TranslationState,\n item: T,\n): StreamOutputState<T> {\n const outputIndex = state.nextOutputIndex\n state.nextOutputIndex += 1\n return { item, outputIndex, done: false }\n}\n\nfunction createLifecycleEvent(\n state: TranslationState,\n type: \"response.created\" | \"response.in_progress\",\n): ResponseStreamEvent {\n return createEvent(state, {\n type,\n response: createMessagesBackedResponsesResult({\n context: state.context,\n createdAt: state.createdAt,\n id: state.responseId,\n output: [],\n outputText: \"\",\n status: \"in_progress\",\n usage: null,\n }),\n })\n}\n\nfunction createTerminalEvent(state: TranslationState): ResponseStreamEvent {\n const finish = resolveFinish(state.stopReason)\n const response = createMessagesBackedResponsesResult({\n context: state.context,\n createdAt: state.createdAt,\n id: state.responseId,\n output: [],\n outputText: state.context.compaction ? \"\" : state.outputText,\n status: finish.status,\n incompleteReason: finish.incompleteReason,\n usage: translateAnthropicUsage(state.usage),\n copilotUsage: state.copilotUsage,\n })\n return createEvent(state, {\n type:\n finish.status === \"incomplete\" ?\n \"response.incomplete\"\n : \"response.completed\",\n response,\n copilot_usage: state.copilotUsage,\n })\n}\n\nfunction createErrorEvent(\n state: TranslationState,\n error: unknown,\n): ResponseStreamEvent {\n const message = error instanceof Error ? error.message : String(error)\n return createEvent(state, {\n type: \"error\",\n code: \"messages_translation_error\",\n message,\n param: null,\n error: {\n type: \"api_error\",\n code: \"messages_translation_error\",\n message,\n },\n })\n}\n\nfunction createFailedEvent(\n state: TranslationState,\n error: unknown,\n): ResponseStreamEvent {\n const message = error instanceof Error ? error.message : String(error)\n return createEvent(state, {\n type: \"response.failed\",\n response: createMessagesBackedResponsesResult({\n context: state.context,\n createdAt: state.createdAt,\n id: state.responseId,\n output: [],\n outputText: state.outputText,\n status: \"failed\",\n usage: translateAnthropicUsage(state.usage),\n copilotUsage: state.copilotUsage,\n error: {\n code: \"messages_translation_error\",\n message,\n },\n }),\n copilot_usage: state.copilotUsage,\n })\n}\n\nfunction createEvent(\n state: TranslationState,\n value: Record<string, unknown>,\n): ResponseStreamEvent {\n return {\n ...value,\n sequence_number: state.sequence++,\n } as ResponseStreamEvent\n}\n\nfunction resolveFinish(stopReason: AnthropicResponse[\"stop_reason\"]): {\n status: \"completed\" | \"incomplete\"\n incompleteReason?: \"content_filter\" | \"max_output_tokens\"\n} {\n if (stopReason === \"max_tokens\") {\n return { status: \"incomplete\", incompleteReason: \"max_output_tokens\" }\n }\n if (stopReason === \"refusal\") {\n return { status: \"incomplete\", incompleteReason: \"content_filter\" }\n }\n return { status: \"completed\" }\n}\n\nfunction mergeUsage(\n current: AnthropicUsage,\n incoming: Partial<AnthropicUsage>,\n): AnthropicUsage {\n return {\n ...current,\n ...incoming,\n input_tokens: incoming.input_tokens ?? current.input_tokens,\n output_tokens: incoming.output_tokens ?? current.output_tokens,\n }\n}\n\nfunction parseAnthropicEvent(data: string): AnthropicStreamEventData {\n try {\n const parsed = JSON.parse(data) as unknown\n if (\n typeof parsed === \"object\"\n && parsed !== null\n && \"type\" in parsed\n && typeof parsed.type === \"string\"\n ) {\n return parsed as AnthropicStreamEventData\n }\n } catch {\n // The request error below contains the stable public message.\n }\n throw new ResponsesMessagesTranslationError(\n \"Messages API returned malformed streaming JSON\",\n 502,\n )\n}\n","import { events } from \"fetch-event-stream\"\nimport type { Context } from \"hono\"\nimport { streamSSE } from \"hono/streaming\"\n\nimport { COMPACT_REQUEST } from \"~/lib/compact\"\nimport { createHandlerLogger, debugJson } from \"~/lib/logger\"\nimport type { SubagentMarker } from \"~/lib/subagent\"\nimport type { AnthropicResponse } from \"~/lib/types/anthropic\"\nimport type { ResponsesPayload } from \"~/lib/types/responses\"\nimport { handleCompletionPayload } from \"~/routes/messages/handler\"\nimport { shouldInjectMessagesToolCallTips } from \"~/routes/models/codex-models\"\n\nimport {\n responsesResultToStreamEvents,\n translateMessagesStream,\n} from \"./messages-stream-translation\"\nimport {\n ResponsesMessagesTranslationError,\n translateAnthropicToResponses,\n translateResponsesToMessages,\n type MessagesResponseTranslationContext,\n} from \"./messages-translation\"\n\nconst logger = createHandlerLogger(\"responses-messages-handler\")\n\nexport const responsesMessagesDependencies = {\n handleCompletionPayload,\n}\n\nexport async function handleResponsesViaMessages(\n c: Context,\n options: {\n payload: ResponsesPayload\n publicModel: string\n targetModel: string\n subagentMarker?: SubagentMarker | null\n requestId?: string\n sessionId?: string\n },\n): Promise<Response> {\n try {\n const translation = translateResponsesToMessages(\n { ...options.payload, model: options.publicModel },\n {\n model: options.targetModel,\n publicModel: options.publicModel,\n toolCallTips: shouldInjectMessagesToolCallTips(\n c.req.header(\"user-agent\"),\n options.targetModel,\n ),\n },\n )\n const context: MessagesResponseTranslationContext = translation\n\n debugJson(logger, \"Translated Messages request:\", {\n payload: translation.messagesPayload,\n publicModel: options.publicModel,\n targetModel: options.targetModel,\n userAgent: c.req.header(\"user-agent\") ?? \"\",\n })\n\n const messagesResponse =\n await responsesMessagesDependencies.handleCompletionPayload(\n c,\n translation.messagesPayload,\n {\n compactType: translation.compaction ? COMPACT_REQUEST : undefined,\n skipClaudeAutoModel: true,\n skipModelMapping: true,\n skipWebSearch: true,\n usageEndpoint: \"responses\",\n subagentMarker: options.subagentMarker,\n requestId: options.requestId,\n sessionId: options.sessionId,\n },\n )\n\n if (!messagesResponse.ok) {\n return messagesResponse\n }\n\n const contentType = messagesResponse.headers.get(\"content-type\") ?? \"\"\n if (contentType.includes(\"text/event-stream\")) {\n if (!translation.messagesPayload.stream) {\n throw new ResponsesMessagesTranslationError(\n \"Messages API returned a stream for a non-streaming Responses request\",\n 502,\n )\n }\n return streamTranslatedMessagesEvents(c, messagesResponse, context)\n }\n\n const body = await messagesResponse.json()\n if (!isAnthropicResponse(body)) {\n throw new ResponsesMessagesTranslationError(\n \"Messages API returned an invalid response body\",\n 502,\n )\n }\n const result = translateAnthropicToResponses(body, context)\n debugJson(logger, \"Translated Responses result:\", result)\n\n if (!translation.messagesPayload.stream) {\n return c.json(result)\n }\n return streamSSE(c, async (stream) => {\n for (const event of responsesResultToStreamEvents(result)) {\n await stream.writeSSE({\n event: event.type,\n data: JSON.stringify(event),\n })\n }\n })\n } catch (error) {\n if (error instanceof ResponsesMessagesTranslationError) {\n return c.json(\n {\n error: {\n message: error.message,\n type: \"invalid_request_error\",\n },\n },\n error.status as 400 | 502,\n )\n }\n throw error\n }\n}\n\nfunction streamTranslatedMessagesEvents(\n c: Context,\n response: Response,\n context: MessagesResponseTranslationContext,\n): Response {\n return streamSSE(c, async (stream) => {\n for await (const event of translateMessagesStream(\n events(response),\n context,\n )) {\n debugJson(logger, \"Translated Responses stream event:\", event)\n await stream.writeSSE({\n event: event.type,\n data: JSON.stringify(event),\n })\n }\n })\n}\n\nfunction isAnthropicResponse(value: unknown): value is AnthropicResponse {\n return (\n typeof value === \"object\"\n && value !== null\n && \"type\" in value\n && value.type === \"message\"\n && \"content\" in value\n && Array.isArray(value.content)\n )\n}\n","import type { Context } from \"hono\"\n\nimport { streamSSE } from \"hono/streaming\"\n\nimport { logCodexRateLimitsEvent } from \"~/lib/codex-rate-limit\"\nimport {\n type ModelConfig,\n type ProviderType,\n resolveEffectiveProviderType,\n} from \"~/lib/config\"\nimport { HTTPError } from \"~/lib/error\"\nimport { createHandlerLogger, debugJson } from \"~/lib/logger\"\nimport { resolveProviderConfig } from \"~/lib/provider-resolver\"\nimport { requestContext } from \"~/lib/request-context\"\nimport {\n createProviderTokenUsageRecorder,\n normalizeResponsesUsage,\n type UsageTokens,\n} from \"~/lib/token-usage\"\nimport { isResponsesStream } from \"~/lib/utils\"\nimport { isCodexUserAgent } from \"~/routes/models/codex-models\"\nimport {\n applyResponsesApiContextManagement,\n compactInputByLatestCompaction,\n filterReasoningForTransport,\n} from \"~/routes/responses/utils\"\nimport { handleResponsesViaMessages } from \"~/routes/responses/messages-handler\"\nimport { normalizeProviderResponsesReasoningEffort } from \"~/routes/provider/utils\"\n\nimport type {\n ResponsesPayload,\n ResponsesResult,\n ResponseStreamEvent,\n ResponsesStream,\n} from \"~/lib/types/responses\"\nimport { forwardCodexResponses } from \"~/services/codex/create-responses\"\nimport { getModels as getCodexModels } from \"~/services/codex/get-models\"\nimport { createResponsesSafeStream } from \"~/services/responses-websocket-helpers\"\nimport { createResponsesHttpEventStream } from \"~/services/responses-http\"\nimport {\n createProviderProxyResponse,\n forwardProviderResponses,\n} from \"~/services/providers/provider-proxy\"\nimport type { ContentfulStatusCode } from \"hono/utils/http-status\"\n\nconst logger = createHandlerLogger(\"provider-responses-handler\")\n\nexport const providerResponsesHandlerDependencies = {\n resolveProviderConfig,\n}\n\nexport async function handleProviderResponsesForProvider(\n c: Context,\n options: {\n payload: ResponsesPayload\n provider: string\n publicModel?: string\n },\n): Promise<Response> {\n const { payload, provider } = options\n\n debugJson(logger, \"Responses request payload:\", {\n payload,\n provider,\n })\n\n const providerConfig =\n await providerResponsesHandlerDependencies.resolveProviderConfig(provider)\n if (!providerConfig) {\n return c.json(\n {\n error: {\n message: `Provider '${provider}' does not support the /v1/responses endpoint`,\n type: \"invalid_request_error\",\n },\n },\n 400,\n )\n }\n\n const effectiveType = resolveEffectiveProviderType(\n providerConfig,\n payload.model,\n )\n const normalizedReasoningEffort = normalizeProviderResponsesReasoningEffort(\n payload,\n providerConfig,\n )\n if (normalizedReasoningEffort) {\n logger.debug(\n `Normalized reasoning effort from ${normalizedReasoningEffort.from} to ${normalizedReasoningEffort.to} based on the provider model configuration`,\n )\n }\n\n if (shouldFallbackToMessages(c, payload.model, effectiveType)) {\n filterReasoningForTransport(payload, true)\n return await handleResponsesViaMessages(c, {\n payload,\n publicModel: options.publicModel ?? payload.model,\n targetModel: `${provider}/${payload.model}`,\n })\n }\n\n if (effectiveType !== \"openai-responses\") {\n return c.json(\n {\n error: {\n message: `Provider '${provider}' does not support the /v1/responses endpoint`,\n type: \"invalid_request_error\",\n },\n },\n 400,\n )\n }\n\n filterReasoningForTransport(payload, false)\n\n const model =\n providerConfig.name === \"codex\" ?\n getCodexModels().data.find((model) => model.id === payload.model)\n : undefined\n\n // Smaller than the client compaction threshold, use server-side compaction to maintain cache hit rate.\n const shouldCompactInput = applyResponsesApiContextManagement(\n payload,\n model?.capabilities.limits.max_prompt_tokens,\n {\n compactThresholdRatio: 0.8,\n source: \"responses\",\n },\n )\n if (shouldCompactInput) {\n compactInputByLatestCompaction(payload)\n }\n\n debugJson(logger, \"Translated Responses request payload:\", {\n contextManagement: payload.context_management,\n provider,\n })\n\n const modelConfig = providerConfig.models?.[payload.model]\n\n if (providerConfig.name === \"codex\") {\n const upstreamResponse = await forwardCodexResponses(\n payload,\n c.req.raw.headers,\n providerConfig.baseUrl,\n { signal: c.req.raw.signal },\n )\n const recordUsage = createProviderResponsesUsageRecorder(\n payload,\n provider,\n modelConfig,\n providerConfig.pricingCurrency,\n )\n\n if (payload.stream && isResponsesStream(upstreamResponse)) {\n return streamProviderResponses(c, upstreamResponse, {\n normalizeCodex: true,\n provider,\n recordUsage,\n })\n }\n\n const responseBody = upstreamResponse as ResponsesResult\n recordUsage(normalizeResponsesUsage(responseBody.usage))\n return c.json(responseBody)\n }\n\n const upstreamResponse = await forwardProviderResponses(\n providerConfig,\n payload,\n c.req.raw.headers,\n { signal: c.req.raw.signal },\n )\n\n if (!upstreamResponse.ok) {\n throw new HTTPError(\n `Failed to create ${provider} responses`,\n upstreamResponse,\n )\n }\n\n const recordUsage = createProviderResponsesUsageRecorder(\n payload,\n provider,\n modelConfig,\n providerConfig.pricingCurrency,\n )\n\n if (payload.stream) {\n return streamProviderResponses(\n c,\n getResponsesEvents(upstreamResponse, c.req.raw.signal),\n {\n normalizeCodex: false,\n provider,\n recordUsage,\n },\n )\n }\n\n const responseBody = (await upstreamResponse\n .clone()\n .json()) as ResponsesResult\n recordUsage(normalizeResponsesUsage(responseBody.usage))\n\n return createProviderProxyResponse(upstreamResponse)\n}\n\nconst shouldFallbackToMessages = (\n c: Context,\n modelId: string,\n effectiveType: ProviderType,\n): boolean => {\n if (effectiveType === \"anthropic\" || effectiveType === \"openai-compatible\") {\n return true\n }\n\n if (isCodexUserAgent(c.req.header(\"user-agent\"))) {\n return !(modelId.startsWith(\"gpt\") || modelId.startsWith(\"codex\"))\n }\n\n return false\n}\n\nconst createProviderResponsesUsageRecorder = (\n payload: ResponsesPayload,\n provider: string,\n modelConfig: ModelConfig | undefined,\n pricingCurrency: string | undefined,\n): ((usage: UsageTokens) => void) => {\n const sessionAffinity =\n requestContext.getStore()?.sessionAffinity?.trim() || null\n\n return createProviderTokenUsageRecorder({\n endpoint: \"responses\",\n model: payload.model,\n pricing: modelConfig?.pricing,\n pricingCurrency,\n providerName: provider,\n sessionId: sessionAffinity ?? \"\",\n })\n}\n\nconst streamProviderResponses = async (\n c: Context,\n upstreamResponse: ResponsesStream,\n options: {\n normalizeCodex: boolean\n provider: string\n recordUsage: (usage: UsageTokens) => void\n },\n): Promise<Response> => {\n const iterator = upstreamResponse[Symbol.asyncIterator]()\n const firstResult = await iterator.next()\n if (firstResult.done) {\n await iterator.return?.()\n throw new HTTPError(\n `Empty stream from ${options.provider} responses`,\n new Response(\"\", { status: 502 }),\n )\n }\n\n const firstChunk = firstResult.value\n if (firstChunk.data && firstChunk.data !== \"[DONE]\") {\n const event = parseProviderResponsesStreamEvent(firstChunk.data, {\n normalizeCodex: false,\n provider: options.provider,\n })\n if (event?.type === \"error\") {\n const errorEvent = event\n const statusCode = errorEvent.status_code ?? 500\n await iterator.return?.()\n return c.json(\n {\n error: {\n message: errorEvent.message,\n ...errorEvent.error,\n },\n },\n statusCode as ContentfulStatusCode,\n errorEvent.headers ?? undefined,\n )\n }\n }\n\n return streamSSE(c, async (stream) => {\n let usage: UsageTokens = {}\n\n const writeChunk = async (chunk: typeof firstChunk) => {\n debugJson(logger, \"Responses stream chunk:\", chunk)\n let responseChunk = chunk\n let event: ResponseStreamEvent | null = null\n\n if (chunk.data && chunk.data !== \"[DONE]\") {\n event = parseProviderResponsesStreamEvent(chunk.data, {\n normalizeCodex: options.normalizeCodex,\n provider: options.provider,\n })\n if (event && options.normalizeCodex) {\n responseChunk = {\n ...chunk,\n data: JSON.stringify(event),\n event: event.type,\n }\n }\n }\n\n if (event) {\n const nextUsage = getResponsesStreamEventUsage(event)\n if (nextUsage) {\n usage = nextUsage\n }\n }\n\n await stream.writeSSE({\n data: responseChunk.data ?? \"\",\n event: responseChunk.event,\n })\n }\n\n try {\n await writeChunk(firstChunk)\n\n for await (const chunk of {\n [Symbol.asyncIterator]: () => iterator,\n }) {\n await writeChunk(chunk)\n }\n } finally {\n await iterator.return?.()\n options.recordUsage(usage)\n }\n })\n}\n\nconst parseProviderResponsesStreamEvent = (\n data: string,\n options: {\n normalizeCodex: boolean\n provider: string\n },\n): ResponseStreamEvent | null => {\n try {\n const parsed = JSON.parse(data) as ResponseStreamEvent\n if (options.normalizeCodex) {\n logCodexRateLimitsEvent(parsed)\n }\n return parsed\n } catch (error) {\n logger.error(\"provider.responses.parse_chunk_error\", {\n provider: options.provider,\n data,\n error,\n })\n return null\n }\n}\n\nconst getResponsesStreamEventUsage = (\n event: ResponseStreamEvent,\n): UsageTokens | null => {\n if (\n event.type === \"response.completed\"\n || event.type === \"response.failed\"\n || event.type === \"response.incomplete\"\n ) {\n return normalizeResponsesUsage(event.response.usage)\n }\n\n return null\n}\n\nconst getResponsesEvents = (\n response: Response,\n signal?: AbortSignal,\n): ResponsesStream =>\n createResponsesSafeStream(createResponsesHttpEventStream(response, signal), {\n signal,\n })\n","import { Hono } from \"hono\"\n\nimport { forwardError } from \"~/lib/error\"\nimport type { ResponsesPayload } from \"~/lib/types/responses\"\n\nimport { handleProviderResponsesForProvider } from \"./handler\"\n\nexport const providerResponsesRoutes = new Hono()\n\nproviderResponsesRoutes.post(\"/\", async (c) => {\n try {\n const provider = c.req.param(\"provider\") ?? \"\"\n const payload = await c.req.json<ResponsesPayload>()\n return await handleProviderResponsesForProvider(c, { payload, provider })\n } catch (error) {\n return await forwardError(c, error)\n }\n})\n","/**\n * Stream ID Synchronization for @ai-sdk/openai compatibility\n *\n * Problem: GitHub Copilot's Responses API returns different IDs for the same\n * item in 'added' vs 'done' events. This breaks @ai-sdk/openai which expects\n * consistent IDs across the stream lifecycle.\n *\n * Errors without this fix:\n * - \"activeReasoningPart.summaryParts\" undefined\n * - \"text part not found\"\n *\n * Use case: OpenCode (AI coding assistant) using Codex models (gpt-5.2-codex)\n * via @ai-sdk/openai provider requires the Responses API endpoint.\n */\n\nimport type {\n ResponseOutputItemAddedEvent,\n ResponseOutputItemDoneEvent,\n ResponseStreamEvent,\n} from \"~/lib/types/responses\"\n\ninterface StreamIdTracker {\n outputItems: Map<number, string>\n}\n\nexport const createStreamIdTracker = (): StreamIdTracker => ({\n outputItems: new Map(),\n})\n\nexport const fixStreamIds = (\n data: string,\n event: string | undefined,\n tracker: StreamIdTracker,\n): string => {\n if (!data) return data\n const parsed = JSON.parse(data) as ResponseStreamEvent\n switch (event) {\n case \"response.output_item.added\": {\n return handleOutputItemAdded(\n parsed as ResponseOutputItemAddedEvent,\n tracker,\n )\n }\n case \"response.output_item.done\": {\n return handleOutputItemDone(\n parsed as ResponseOutputItemDoneEvent,\n tracker,\n )\n }\n default: {\n return handleItemId(parsed, tracker)\n }\n }\n}\n\nconst handleOutputItemAdded = (\n parsed: ResponseOutputItemAddedEvent,\n tracker: StreamIdTracker,\n): string => {\n if (!parsed.item.id) {\n let randomSuffix = \"\"\n while (randomSuffix.length < 16) {\n randomSuffix += Math.random().toString(36).slice(2)\n }\n parsed.item.id = `oi_${parsed.output_index}_${randomSuffix.slice(0, 16)}`\n }\n\n const outputIndex = parsed.output_index\n tracker.outputItems.set(outputIndex, parsed.item.id)\n return JSON.stringify(parsed)\n}\n\nconst handleOutputItemDone = (\n parsed: ResponseOutputItemDoneEvent,\n tracker: StreamIdTracker,\n): string => {\n const outputIndex = parsed.output_index\n const originalId = tracker.outputItems.get(outputIndex)\n if (originalId) {\n parsed.item.id = originalId\n }\n return JSON.stringify(parsed)\n}\n\nconst handleItemId = (\n parsed: ResponseStreamEvent & { output_index?: number; item_id?: string },\n tracker: StreamIdTracker,\n): string => {\n const outputIndex = parsed.output_index\n if (outputIndex !== undefined) {\n const itemId = tracker.outputItems.get(outputIndex)\n if (itemId) {\n parsed.item_id = itemId\n }\n }\n return JSON.stringify(parsed)\n}\n","import type { Context } from \"hono\"\n\nimport { streamSSE } from \"hono/streaming\"\n\nimport {\n isResponsesApiWebSearchEnabled as isConfiguredResponsesApiWebSearchEnabled,\n resolveMappedModel,\n} from \"~/lib/config\"\nimport { createHandlerLogger, debugJson, debugJsonTail } from \"~/lib/logger\"\nimport { findEndpointModel } from \"~/lib/models\"\nimport { resolveConfiguredProviderModelAlias } from \"~/lib/provider-resolver\"\nimport { isCodexUserAgent } from \"~/routes/models/codex-models\"\nimport {\n handleProviderResponsesForProvider,\n providerResponsesHandlerDependencies,\n} from \"~/routes/provider/responses/handler\"\nimport {\n createCopilotTokenUsageRecorder,\n normalizeOptionalToken,\n normalizeResponsesUsage,\n type UsageTokens,\n} from \"~/lib/token-usage\"\nimport {\n generateRequestIdFromPayload,\n getUUID,\n isAsyncIterable,\n} from \"~/lib/utils\"\nimport type { SubagentMarker } from \"~/lib/subagent\"\nimport type {\n ResponsesPayload,\n ResponsesResult,\n ResponsesTransport,\n ResponseStreamEvent,\n} from \"~/lib/types/responses\"\nimport { createResponses as createCopilotResponses } from \"~/services/copilot/create-responses\"\n\nimport { handleResponsesViaMessages } from \"./messages-handler\"\nimport { createStreamIdTracker, fixStreamIds } from \"./stream-id-sync\"\nimport {\n applyResponsesApiContextManagement,\n compactInputByLatestCompaction,\n filterReasoningForTransport,\n getResponsesTransportForModel,\n getResponsesRequestOptions,\n normalizeInputImageDetails,\n normalizeResponsesReasoningEffort,\n sanitizeOversizedInputImages,\n sanitizeUnsupportedInputFields,\n} from \"./utils\"\nimport consola from \"consola\"\n\nconst logger = createHandlerLogger(\"responses-handler\")\n\nexport const responsesHandlerDependencies = {\n createResponses: createCopilotResponses,\n findEndpointModel,\n isResponsesApiWebSearchEnabled: isConfiguredResponsesApiWebSearchEnabled,\n resolveMappedModel,\n}\n\nexport const handleResponses = async (c: Context) => {\n const payload = await c.req.json<ResponsesPayload>()\n const requestedModel = payload.model\n payload.model = responsesHandlerDependencies.resolveMappedModel(payload.model)\n if (payload.model !== requestedModel) {\n consola.debug(\n `Resolved model mapping: ${requestedModel} -> ${payload.model}`,\n )\n }\n\n const providerModelAlias = await resolveConfiguredProviderModelAlias(\n payload.model,\n providerResponsesHandlerDependencies.resolveProviderConfig,\n )\n if (providerModelAlias) {\n payload.model = providerModelAlias.model\n return await handleProviderResponsesForProvider(c, {\n payload,\n provider: providerModelAlias.provider,\n publicModel: requestedModel,\n })\n }\n\n debugJson(logger, \"Responses request payload:\", payload)\n\n const subagentMarker = getCodexResponsesSubagentMarker(c)\n if (subagentMarker) {\n debugJson(logger, \"Detected Codex subagent headers:\", subagentMarker)\n }\n\n const incomingSessionId = getIncomingResponsesSessionId(c)\n const sessionId = incomingSessionId ? getUUID(incomingSessionId) : undefined\n const requestId = generateRequestIdFromPayload(\n { messages: payload.input },\n sessionId,\n )\n logger.debug(\"Generated request ID:\", requestId)\n\n const fallbackSessionId = sessionId ?? getUUID(requestId)\n logger.debug(\"Extracted session ID:\", fallbackSessionId)\n const selectedModel = responsesHandlerDependencies.findEndpointModel(\n payload.model,\n )\n payload.model = selectedModel?.id ?? payload.model\n const normalizedReasoningEffort = normalizeResponsesReasoningEffort(\n payload,\n selectedModel?.capabilities?.supports?.reasoning_effort,\n )\n if (normalizedReasoningEffort) {\n logger.debug(\n `Normalized reasoning effort from ${normalizedReasoningEffort.from} to ${normalizedReasoningEffort.to} based on the selected model capabilities`,\n )\n }\n const responsesTransport = getResponsesTransportForModel(selectedModel)\n\n const useMessagesFallback = shouldFallbackToMessages(\n c,\n payload.model,\n selectedModel,\n responsesTransport,\n )\n if (useMessagesFallback) {\n filterReasoningForTransport(payload, true)\n return await handleResponsesViaMessages(c, {\n payload,\n publicModel: requestedModel,\n targetModel: payload.model,\n subagentMarker,\n requestId,\n sessionId: fallbackSessionId,\n })\n }\n\n if (!responsesTransport) {\n return c.json(\n {\n error: {\n message:\n \"This model does not support the responses endpoint. Please choose a different model.\",\n type: \"invalid_request_error\",\n },\n },\n 400,\n )\n }\n\n filterReasoningForTransport(payload, false)\n\n const recordUsage = createCopilotTokenUsageRecorder({\n endpoint: \"responses\",\n fallbackSessionId,\n model: payload.model,\n })\n\n const sanitizedUnsupportedFieldCount = sanitizeUnsupportedInputFields(payload)\n if (sanitizedUnsupportedFieldCount > 0) {\n logger.debug(\n `Removed ${sanitizedUnsupportedFieldCount} unsupported input field(s) before forwarding to Copilot Responses`,\n )\n }\n\n const normalizedImageDetailCount = normalizeInputImageDetails(payload)\n if (normalizedImageDetailCount > 0) {\n logger.debug(\n `Normalized ${normalizedImageDetailCount} unsupported input image detail value(s) before forwarding to Copilot Responses`,\n )\n }\n\n removeUnsupportedTools(payload)\n fillEmptyNamespaceToolDescriptions(payload)\n\n if (!responsesHandlerDependencies.isResponsesApiWebSearchEnabled()) {\n removeWebSearchTool(payload)\n }\n\n const sanitizedImageCount = sanitizeOversizedInputImages(\n payload,\n selectedModel?.capabilities.limits.vision?.max_prompt_image_size,\n )\n if (sanitizedImageCount > 0) {\n logger.warn(\n `Omitted ${sanitizedImageCount} oversized input image(s) before forwarding to Copilot Responses`,\n )\n }\n\n // Smaller than the client compaction threshold, use server-side compaction to maintain cache hit rate\n const maxPromptTokens = selectedModel?.capabilities.limits.max_prompt_tokens\n const shouldCompactInput = applyResponsesApiContextManagement(\n payload,\n maxPromptTokens,\n {\n compactThresholdRatio: 0.8,\n source: \"responses\",\n },\n )\n if (shouldCompactInput) {\n compactInputByLatestCompaction(payload)\n }\n\n debugJson(logger, \"Translated Responses payload:\", payload)\n\n const { vision, initiator: inferredInitiator } =\n getResponsesRequestOptions(payload)\n const initiator = subagentMarker ? \"agent\" : inferredInitiator\n\n const response = await responsesHandlerDependencies.createResponses(payload, {\n vision,\n initiator,\n subagentMarker,\n requestId,\n sessionId: fallbackSessionId,\n signal: c.req.raw.signal,\n transport: responsesTransport,\n })\n\n if (isStreamingRequested(payload) && isAsyncIterable(response)) {\n logger.debug(\"Forwarding native Responses stream\")\n return streamSSE(c, async (stream) => {\n const idTracker = createStreamIdTracker()\n let usage: UsageTokens = {}\n const iterator = response[Symbol.asyncIterator]()\n\n try {\n for await (const chunk of {\n [Symbol.asyncIterator]: () => iterator,\n }) {\n debugJson(logger, \"Responses stream chunk:\", chunk)\n const parsedEvent = parseResponsesStreamEvent(chunk)\n if (\n parsedEvent?.type === \"response.completed\"\n || parsedEvent?.type === \"response.failed\"\n || parsedEvent?.type === \"response.incomplete\"\n ) {\n usage = {\n ...normalizeResponsesUsage(parsedEvent.response.usage),\n total_nano_aiu: normalizeOptionalToken(\n parsedEvent.copilot_usage?.total_nano_aiu,\n ),\n }\n }\n\n const processedData = fixStreamIds(\n (chunk as { data?: string }).data ?? \"\",\n (chunk as { event?: string }).event,\n idTracker,\n )\n\n await stream.writeSSE({\n id: (chunk as { id?: string }).id,\n event: (chunk as { event?: string }).event,\n data: processedData,\n })\n }\n } finally {\n await iterator.return?.()\n recordUsage(usage)\n }\n })\n }\n\n debugJsonTail(logger, \"Forwarding native Responses result:\", {\n value: response,\n tailLength: 400,\n })\n const result = response as ResponsesResult\n recordUsage({\n ...normalizeResponsesUsage(result.usage),\n total_nano_aiu: normalizeOptionalToken(\n result.copilot_usage?.total_nano_aiu,\n ),\n })\n return c.json(result)\n}\n\nconst isStreamingRequested = (payload: ResponsesPayload): boolean =>\n Boolean(payload.stream)\n\nconst shouldFallbackToMessages = (\n c: Context,\n modelId: string,\n selectedModel: { supported_endpoints?: Array<string> } | undefined,\n responsesTransport: ResponsesTransport | null,\n): boolean => {\n if (isCodexUserAgent(c.req.header(\"user-agent\"))) {\n return !(modelId.startsWith(\"gpt\") || modelId.startsWith(\"codex\"))\n }\n\n if (responsesTransport) {\n return false\n }\n\n const supportedEndpoints = selectedModel?.supported_endpoints ?? []\n return (\n supportedEndpoints.includes(\"/v1/messages\")\n || supportedEndpoints.includes(\"/chat/completions\")\n )\n}\n\nconst parseResponsesStreamEvent = (\n chunk: unknown,\n): ResponseStreamEvent | null => {\n const data = (chunk as { data?: string }).data\n if (!data || data === \"[DONE]\") {\n return null\n }\n\n try {\n return JSON.parse(data) as ResponseStreamEvent\n } catch {\n return null\n }\n}\n\nconst removeWebSearchTool = (payload: ResponsesPayload): void => {\n if (!Array.isArray(payload.tools) || payload.tools.length === 0) return\n\n payload.tools = payload.tools.filter((t) => {\n return t.type !== \"web_search\"\n })\n}\n\nconst COPILOT_UNSUPPORTED_TOOL_TYPES = new Set([\"image_generation\"])\nconst COPILOT_UNSUPPORTED_TOOL_NAMESPACES = new Set([\"image_gen\"])\n\nexport const removeUnsupportedTools = (payload: ResponsesPayload): void => {\n if (!Array.isArray(payload.tools) || payload.tools.length === 0) return\n\n const dropped: Array<string> = []\n payload.tools = payload.tools.filter((t) => {\n const type = t.type as string\n const name = \"name\" in t && typeof t.name === \"string\" ? t.name : undefined\n const isUnsupportedNamespace =\n type === \"namespace\"\n && name !== undefined\n && COPILOT_UNSUPPORTED_TOOL_NAMESPACES.has(name)\n if (COPILOT_UNSUPPORTED_TOOL_TYPES.has(type) || isUnsupportedNamespace) {\n dropped.push(isUnsupportedNamespace ? `${type}:${name}` : type)\n return false\n }\n return true\n })\n if (dropped.length > 0) {\n logger.debug(\"Removed unsupported tools:\", dropped)\n }\n}\n\nexport const fillEmptyNamespaceToolDescriptions = (\n payload: ResponsesPayload,\n): void => {\n fillEmptyNamespaceDescriptions(payload.tools)\n\n if (!Array.isArray(payload.input)) return\n\n for (const item of payload.input) {\n if (!item || typeof item !== \"object\") continue\n fillEmptyNamespaceDescriptions((item as Record<string, unknown>).tools)\n }\n}\n\nconst fillEmptyNamespaceDescriptions = (tools: unknown): void => {\n if (!Array.isArray(tools)) return\n\n for (const tool of tools) {\n if (!tool || typeof tool !== \"object\") continue\n\n const namespaceTool = tool as Record<string, unknown>\n if (\n namespaceTool.type === \"namespace\"\n && namespaceTool.description === \"\"\n && typeof namespaceTool.name === \"string\"\n ) {\n namespaceTool.description = namespaceTool.name\n }\n }\n}\n\nconst getIncomingResponsesSessionId = (c: Context): string | undefined =>\n getTrimmedHeader(c, \"session-id\") ?? getTrimmedHeader(c, \"x-session-id\")\n\nconst codexSubagentHeaderValues = new Set([\n \"collab_spawn\",\n \"compact\",\n \"memory_consolidation\",\n \"review\",\n])\n\nconst getCodexResponsesSubagentMarker = (c: Context): SubagentMarker | null => {\n const agentType = getTrimmedHeader(c, \"x-openai-subagent\")\n if (!agentType || !codexSubagentHeaderValues.has(agentType)) {\n return null\n }\n\n const threadId = getTrimmedHeader(c, \"thread-id\")\n const rootSessionId = getIncomingResponsesSessionId(c)\n const parentThreadId = getTrimmedHeader(c, \"x-codex-parent-thread-id\")\n if (!threadId && !rootSessionId && !parentThreadId) {\n return null\n }\n\n const agentId = threadId ?? parentThreadId ?? rootSessionId ?? agentType\n\n return {\n agent_id: agentId,\n agent_type: agentType,\n session_id: threadId ?? rootSessionId ?? agentId,\n }\n}\n\nconst getTrimmedHeader = (c: Context, name: string): string | undefined => {\n const value = c.req.header(name)?.trim()\n return value || undefined\n}\n","import { Hono } from \"hono\"\n\nimport { forwardError } from \"~/lib/error\"\n\nimport { handleResponses } from \"./handler\"\n\nexport const responsesRoutes = new Hono()\n\nresponsesRoutes.post(\"/\", async (c) => {\n try {\n return await handleResponses(c)\n } catch (error) {\n return await forwardError(c, error)\n }\n})\n","import { Hono } from \"hono\"\n\nimport {\n getTokenUsageDailySummary,\n getTokenUsageEventsPage,\n getTokenUsageSummary,\n type TokenUsagePeriod,\n} from \"~/lib/token-usage\"\n\nexport const tokenUsageRoute = new Hono()\n\nconst periods = new Set<TokenUsagePeriod>([\"day\", \"week\", \"month\"])\nconst DEFAULT_EVENTS_PAGE_SIZE = 20\n\nfunction parsePeriod(value: string | undefined): TokenUsagePeriod {\n return periods.has(value as TokenUsagePeriod) ?\n (value as TokenUsagePeriod)\n : \"day\"\n}\n\nfunction parsePositiveInt(value: string | undefined, fallback: number): number {\n const parsed = Number.parseInt(value ?? \"\", 10)\n return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback\n}\n\ntokenUsageRoute.get(\"/\", async (c) => {\n const period = parsePeriod(c.req.query(\"period\"))\n const summary = await getTokenUsageSummary(period)\n return c.json(summary)\n})\n\ntokenUsageRoute.get(\"/daily\", async (c) => {\n const period = parsePeriod(c.req.query(\"period\"))\n const summary = await getTokenUsageDailySummary(period)\n return c.json(summary)\n})\n\ntokenUsageRoute.get(\"/events\", async (c) => {\n const period = parsePeriod(c.req.query(\"period\"))\n const page = parsePositiveInt(c.req.query(\"page\"), 1)\n const pageSize = parsePositiveInt(\n c.req.query(\"page_size\"),\n DEFAULT_EVENTS_PAGE_SIZE,\n )\n const eventsPage = await getTokenUsageEventsPage({ page, pageSize, period })\n return c.json(eventsPage)\n})\n","import { Hono } from \"hono\"\n\nimport { getCopilotUsage } from \"~/services/github/get-copilot-usage\"\n\nexport const usageRoute = new Hono()\n\nusageRoute.get(\"/\", async (c) => {\n try {\n const usage = await getCopilotUsage()\n return c.json(usage)\n } catch (error) {\n console.error(\"Error fetching Copilot usage:\", error)\n return c.json({ error: \"Failed to fetch Copilot usage\" }, 500)\n }\n})\n","import { Hono } from \"hono\"\nimport { cors } from \"hono/cors\"\nimport { logger } from \"hono/logger\"\nimport { readFileSync } from \"node:fs\"\n\nimport {\n createAuthMiddleware,\n getConfiguredAdminApiKeys,\n} from \"./lib/request-auth\"\nimport { traceIdMiddleware } from \"./lib/trace\"\nimport { zstdDecompressionMiddleware } from \"./lib/zstd-request\"\nimport { alphaSearchRoutes } from \"./routes/alpha-search/route\"\nimport { completionRoutes } from \"./routes/chat-completions/route\"\nimport { configRoutes } from \"./routes/admin/config/route\"\nimport { embeddingRoutes } from \"./routes/embeddings/route\"\nimport { imageRoutes } from \"./routes/images/route\"\nimport { messageRoutes } from \"./routes/messages/route\"\nimport { modelRoutes } from \"./routes/models/route\"\nimport { providerAlphaSearchRoutes } from \"./routes/provider/alpha-search/route\"\nimport { providerImageRoutes } from \"./routes/provider/images/route\"\nimport { providerMessageRoutes } from \"./routes/provider/messages/route\"\nimport { providerModelRoutes } from \"./routes/provider/models/route\"\nimport { providerResponsesRoutes } from \"./routes/provider/responses/route\"\nimport { responsesRoutes } from \"./routes/responses/route\"\nimport { tokenUsageRoute } from \"./routes/token-usage/route\"\nimport { usageRoute } from \"./routes/usage/route\"\n\nexport const server = new Hono()\n\nserver.use(traceIdMiddleware)\nserver.use(logger())\nserver.use(cors())\nserver.use(\n \"*\",\n createAuthMiddleware({\n allowUnauthenticatedPaths: [\"/\", \"/usage-viewer\", \"/usage-viewer/\"],\n shouldSkipPath: (path) => path.startsWith(\"/admin/\"),\n }),\n)\nserver.use(\n \"/admin/*\",\n createAuthMiddleware({\n getApiKeys: getConfiguredAdminApiKeys,\n allowUnauthenticatedPaths: [],\n allowWhenNoApiKeys: false,\n }),\n)\nserver.use(zstdDecompressionMiddleware)\n\nserver.get(\"/\", (c) => c.text(\"Server running\"))\nserver.get(\"/usage-viewer\", (c) => {\n const usageViewerFileUrl = new URL(\"../pages/index.html\", import.meta.url)\n return c.html(readFileSync(usageViewerFileUrl, \"utf8\"))\n})\nserver.get(\"/usage-viewer/\", (c) => c.redirect(\"/usage-viewer\", 301))\n\nserver.route(\"/chat/completions\", completionRoutes)\nserver.route(\"/admin/config\", configRoutes)\nserver.route(\"/models\", modelRoutes)\nserver.route(\"/embeddings\", embeddingRoutes)\nserver.route(\"/usage\", usageRoute)\nserver.route(\"/token-usage\", tokenUsageRoute)\nserver.route(\"/responses\", responsesRoutes)\nserver.route(\"/alpha/search\", alphaSearchRoutes)\nserver.route(\"/images\", imageRoutes)\n\n// Compatibility with tools that expect v1/ prefix\nserver.route(\"/v1/chat/completions\", completionRoutes)\nserver.route(\"/v1/models\", modelRoutes)\nserver.route(\"/v1/embeddings\", embeddingRoutes)\nserver.route(\"/v1/responses\", responsesRoutes)\nserver.route(\"/v1/alpha/search\", alphaSearchRoutes)\nserver.route(\"/v1/images\", imageRoutes)\n\n// Anthropic compatible endpoints\nserver.route(\"/v1/messages\", messageRoutes)\n\n// Provider scoped endpoints\nserver.route(\"/:provider/v1/messages\", providerMessageRoutes)\nserver.route(\"/:provider/v1/models\", providerModelRoutes)\nserver.route(\"/:provider/v1/responses\", providerResponsesRoutes)\nserver.route(\"/:provider/v1/alpha/search\", providerAlphaSearchRoutes)\nserver.route(\"/:provider/v1/images\", providerImageRoutes)\n\nserver.route(\"/:provider/models\", providerModelRoutes)\nserver.route(\"/:provider/responses\", providerResponsesRoutes)\nserver.route(\"/:provider/alpha/search\", providerAlphaSearchRoutes)\nserver.route(\"/:provider/images\", providerImageRoutes)\n"],"mappings":"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ChB,QAAQ;IACT,EACD;IACE,oBAAoB;IACpB,aAAa;IACb,OAAO;IACP,QAAQ;IACT,CACF,EACF,EACF;GACD,iBAAiB,EACf,SAAS,EACP,OAAO,CACL;IACE,oBAAoB;IACpB,aAAa;IACb,OAAO;IACP,gBAAgB;IAChB,QAAQ;IACT,EACD;IACE,oBAAoB;IACpB,aAAa;IACb,OAAO;IACP,QAAQ;IACT,CACF,EACF,EACF;GACD,gBAAgB,EACd,SAAS,EACP,OAAO,CACL;IACE,oBAAoB;IACpB,aAAa;IACb,OAAO;IACP,gBAAgB;IAChB,QAAQ;IACT,EACD;IACE,oBAAoB;IACpB,aAAa;IACb,OAAO;IACP,QAAQ;IACT,CACF,EACF,EACF;GACD,eAAe,EACb,SAAS,EACP,OAAO,CACL;IACE,oBAAoB;IACpB,aAAa;IACb,OAAO;IACP,gBAAgB;IAChB,QAAQ;IACT,EACD;IACE,oBAAoB;IACpB,aAAa;IACb,OAAO;IACP,QAAQ;IACT,CACF,EACF,EACF;GACF;EACD,WAAW;GACT,WAAW;IACT,eAAe;IACf,iBAAiB,CAAC,OAAO;IACzB,iBAAiB;IACjB,SAAS,EACP,OAAO,CACL;KACE,aAAa;KACb,oBAAoB;KACpB,qBAAqB;KACrB,OAAO;KACP,gBAAgB;KAChB,QAAQ;KACT,EACD;KACE,aAAa;KACb,oBAAoB;KACpB,qBAAqB;KACrB,OAAO;KACP,gBAAgB;KAChB,QAAQ;KACT,CACF,EACF;IACF;GACD,WAAW;IACT,eAAe;IACf,iBAAiB,CAAC,OAAO;IACzB,iBAAiB;IACjB,SAAS;KACP,aAAa;KACb,oBAAoB;KACpB,qBAAqB;KACrB,OAAO;KACP,QAAQ;KACT;IACF;GACD,eAAe;IACb,eAAe;IACf,iBAAiB,CAAC,OAAO;IACzB,iBAAiB;IACjB,SAAS;KACP,aAAa;KACb,oBAAoB;KACpB,qBAAqB;KACrB,OAAO;KACP,QAAQ;KACT;IACF;GACD,eAAe;IACb,eAAe;IACf,iBAAiB,CAAC,QAAQ,QAAQ;IAClC,iBAAiB;IACjB,SAAS;KACP,aAAa;KACb,oBAAoB;KACpB,qBAAqB;KACrB,OAAO;KACP,QAAQ;KACT;IACF;GACD,0BAA0B;IACxB,eAAe;IACf,iBAAiB,CAAC,OAAO;IACzB,iBAAiB;IACjB,SAAS;KACP,aAAa;KACb,OAAO;KACP,QAAQ;KACT;IACF;GACD,gBAAgB;IACd,eAAe;IACf,iBAAiB,CAAC,QAAQ,QAAQ;IAClC,iBAAiB;IACjB,SAAS,EACP,OAAO,CACL;KACE,aAAa;KACb,oBAAoB;KACpB,qBAAqB;KACrB,OAAO;KACP,gBAAgB;KAChB,QAAQ;KACT,EACD;KACE,aAAa;KACb,oBAAoB;KACpB,qBAAqB;KACrB,OAAO;KACP,gBAAgB;KAChB,QAAQ;KACT,CACF,EACF;IACF;GACD,gBAAgB;IACd,eAAe;IACf,iBAAiB,CAAC,QAAQ,QAAQ;IAClC,iBAAiB;IACjB,SAAS;KACP,aAAa;KACb,OAAO;KACP,QAAQ;KACT;IACF;GACF;EACD,UAAU;GACR,qBAAqB;IACnB,eAAe;IACf,iBAAiB,CAAC,OAAO;IACzB,iBAAiB;IACjB,SAAS;KACP,aAAa;KACb,OAAO;KACP,QAAQ;KACT;IACF;GACD,gCAAgC;IAC9B,eAAe;IACf,iBAAiB,CAAC,QAAQ,QAAQ;IAClC,iBAAiB;IACjB,SAAS;KACP,aAAa;KACb,OAAO;KACP,QAAQ;KACT;IACF;GACD,mBAAmB;IACjB,eAAe;IACf,iBAAiB,CAAC,OAAO;IACzB,iBAAiB;IACjB,SAAS;KACP,aAAa;KACb,OAAO;KACP,QAAQ;KACT;IACF;GACF;EACD,eAAe;GACb,KAAK;IACH,eAAe;IACf,iBAAiB,CAAC,OAAO;IACzB,iBAAiB;IACjB,SAAS;KACP,aAAa;KACb,OAAO;KACP,QAAQ;KACT;IACD,gBAAgB;IACjB;GACD,eAAe;IACb,eAAe;IACf,iBAAiB,CAAC,OAAO;IACzB,iBAAiB;IACjB,SAAS;KACP,aAAa;KACb,OAAO;KACP,QAAQ;KACT;IACD,kBAAkB,CAAC,OAAO;IAC1B,gBAAgB;IACjB;GACD,gBAAgB,EACd,SAAS,EACP,OAAO,CACL;IACE,oBAAoB;IACpB,aAAa;IACb,OAAO;IACP,gBAAgB;IAChB,QAAQ;IACT,EACD;IACE,oBAAoB;IACpB,aAAa;IACb,OAAO;IACP,QAAQ;IACT,CACF,EACF,EACF;GACD,WAAW;IACT,eAAe;IACf,iBAAiB,CAAC,OAAO;IACzB,iBAAiB;IACjB,SAAS;KACP,aAAa;KACb,OAAO;KACP,QAAQ;KACT;IACF;GACD,WAAW;IACT,eAAe;IACf,iBAAiB,CAAC,OAAO;IACzB,iBAAiB;IACjB,SAAS;KACP,aAAa;KACb,OAAO;KACP,QAAQ;KACT;IACF;GACD,iBAAiB;IACf,eAAe;IACf,iBAAiB,CAAC,QAAQ,QAAQ;IAClC,iBAAiB;IACjB,SAAS;KACP,aAAa;KACb,OAAO;KACP,QAAQ;KACT;IACD,kBAAkB;KAAC;KAAO;KAAQ;KAAM;IACzC;GACD,8BAA8B;IAC5B,eAAe;IACf,iBAAiB,CAAC,QAAQ,QAAQ;IAClC,iBAAiB;IACjB,SAAS;KACP,aAAa;KACb,OAAO;KACP,QAAQ;KACT;IACD,kBAAkB;KAAC;KAAW;KAAO;KAAU;KAAQ;KAAQ;IAChE;GACD,8BAA8B;IAC5B,eAAe;IACf,iBAAiB,CAAC,QAAQ,QAAQ;IAClC,iBAAiB;IACjB,SAAS;KACP,aAAa;KACb,OAAO;KACP,QAAQ;KACT;IACD,kBAAkB;KAAC;KAAW;KAAO;KAAU;KAAQ;KAAQ;IAChE;GACD,YAAY;IACV,eAAe;IACf,wBAAwB;IACxB,iBAAiB,CAAC,QAAQ,QAAQ;IAClC,iBAAiB;IACjB,SAAS,EACP,OAAO,CACL;KACE,aAAa;KACb,OAAO;KACP,gBAAgB;KAChB,QAAQ;KACT,EACD;KACE,aAAa;KACb,OAAO;KACP,QAAQ;KACT,CACF,EACF;IACD,kBAAkB;KAAC;KAAO;KAAU;KAAO;IAC5C;GACD,YAAY;IACV,eAAe;IACf,wBAAwB;IACxB,iBAAiB,CAAC,QAAQ,QAAQ;IAClC,iBAAiB;IACjB,SAAS,EACP,OAAO,CACL;KACE,aAAa;KACb,OAAO;KACP,gBAAgB;KAChB,QAAQ;KACT,EACD;KACE,aAAa;KACb,OAAO;KACP,QAAQ;KACT,CACF,EACF;IACD,kBAAkB;KAAC;KAAO;KAAU;KAAQ;KAAQ;IACrD;GACD,qBAAqB;IACnB,eAAe;IACf,iBAAiB,CAAC,OAAO;IACzB,iBAAiB;IACjB,SAAS;KACP,aAAa;KACb,OAAO;KACP,QAAQ;KACT;IACF;GACD,gCAAgC;IAC9B,eAAe;IACf,iBAAiB,CAAC,QAAQ,QAAQ;IAClC,iBAAiB;IACjB,SAAS;KACP,aAAa;KACb,OAAO;KACP,QAAQ;KACT;IACD,kBAAkB;KAAC;KAAO;KAAQ;KAAM;IACzC;GACD,mBAAmB;IACjB,eAAe;IACf,iBAAiB,CAAC,OAAO;IACzB,iBAAiB;IACjB,SAAS;KACP,aAAa;KACb,OAAO;KACP,QAAQ;KACT;IACF;GACD,kBAAkB;IAChB,eAAe;IACf,iBAAiB,CAAC,QAAQ,QAAQ;IAClC,iBAAiB;IACjB,SAAS;KACP,aAAa;KACb,OAAO;KACP,QAAQ;KACT;IACF;GACD,WAAW;IACT,eAAe;IACf,iBAAiB,CAAC,QAAQ,QAAQ;IAClC,iBAAiB;IACjB,SAAS;KACP,aAAa;KACb,OAAO;KACP,QAAQ;KACT;IACF;GACD,aAAa;IACX,eAAe;IACf,iBAAiB,CAAC,QAAQ,QAAQ;IAClC,iBAAiB;IACjB,SAAS;KACP,aAAa;KACb,OAAO;KACP,QAAQ;KACT;IACF;GACD,iBAAiB;IACf,eAAe;IACf,iBAAiB,CAAC,OAAO;IACzB,iBAAiB;IACjB,SAAS;KACP,aAAa;KACb,OAAO;KACP,QAAQ;KACT;IACF;GACD,gBAAgB;IACd,eAAe;IACf,iBAAiB,CAAC,QAAQ,QAAQ;IAClC,iBAAiB;IACjB,SAAS,EACP,OAAO,CACL;KACE,oBAAoB;KACpB,aAAa;KACb,OAAO;KACP,gBAAgB;KAChB,QAAQ;KACT,EACD;KACE,oBAAoB;KACpB,aAAa;KACb,OAAO;KACP,gBAAgB;KAChB,QAAQ;KACT,CACF,EACF;IACF;GACD,eAAe;IACb,eAAe;IACf,iBAAiB,CAAC,OAAO;IACzB,iBAAiB;IACjB,SAAS;KACP,oBAAoB;KACpB,aAAa;KACb,OAAO;KACP,QAAQ;KACT;IACF;GACD,eAAe;IACb,eAAe;IACf,iBAAiB,CAAC,QAAQ,QAAQ;IAClC,iBAAiB;IACjB,SAAS;KACP,oBAAoB;KACpB,aAAa;KACb,OAAO;KACP,QAAQ;KACT;IACF;GACD,iBAAiB;IACf,eAAe;IACf,iBAAiB,CAAC,QAAQ,QAAQ;IAClC,iBAAiB;IACjB,SAAS;KACP,oBAAoB;KACpB,aAAa;KACb,OAAO;KACP,QAAQ;KACT;IACD,kBAAkB;KAAC;KAAO;KAAU;KAAQ;IAC7C;GACD,gBAAgB;IACd,eAAe;IACf,iBAAiB,CAAC,OAAO;IACzB,iBAAiB;IACjB,SAAS;KACP,aAAa;KACb,OAAO;KACP,QAAQ;KACT;IACF;GACD,cAAc;IACZ,eAAe;IACf,iBAAiB,CAAC,QAAQ,QAAQ;IAClC,iBAAiB;IACjB,SAAS,EACP,OAAO,CACL;KACE,aAAa;KACb,OAAO;KACP,gBAAgB;KAChB,QAAQ;KACT,EACD;KACE,aAAa;KACb,OAAO;KACP,gBAAgB;KAChB,QAAQ;KACT,CACF,EACF;IACF;GACF;EACD,MAAM;GACJ,IAAI;IACF,eAAe;IACf,iBAAiB,CAAC,QAAQ,QAAQ;IAClC,iBAAiB;IACjB,SAAS;KACP,aAAa;KACb,OAAO;KACP,QAAQ;KACT;IACF;GACD,WAAW;IACT,eAAe;IACf,iBAAiB,CAAC,QAAQ,QAAQ;IAClC,iBAAiB;IACjB,SAAS;KACP,aAAa;KACb,OAAO;KACP,QAAQ;KACT;IACF;GACF;EACF;CAED;CAEA,cAAc;EACZ,KAAK,eAAe,6BAA6B;;CAGnD,eACE,cACA,WACwC;EACxC,OAAO,KAAK,aAAa,KAAK,aAAa,aAAa,IACtD,KAAK,aAAa,UAAU;;CAIhC,YAAY,cAAqC;EAC/C,OAAO,OAAO,KAAK,KAAK,aAAa,KAAK,aAAa,aAAa,KAAK,EAAE,CAAC;;CAG9E,aAAqB,OAAuB;EAC1C,OAAO,MAAM,MAAM,CAAC,aAAa;;GAIyC;;;ACroB9E,MAAa,8BAA8B;AAmB3C,MAAM,qBACJ,QAAS,WAAiC,IAAI;AAEhD,SAAS,iBAAiB,SAAgC;CACxD,OAAO,QAAQ,MAAM,KAAK,EAAE,CAAC,KAAK,SAAS;EACzC,MAAM,SAAS,OAAO,SAAS,MAAM,GAAG;EACxC,OAAO,OAAO,SAAS,OAAO,IAAI,UAAU,IAAI,SAAS;GACzD;;AAQJ,SAAgB,6BAA6B,SAA0B;CACrE,MAAM,UAAU,iBAAiB,QAAQ;CACzC,MAAM,UAAU,iBAAiB,4BAA4B;CAE7D,KAAK,MAAM,CAAC,OAAO,gBAAgB,QAAQ,SAAS,EAAE;EACpD,MAAM,cAAc,QAAQ,UAAU;EACtC,IAAI,cAAc,aAAa,OAAO;EACtC,IAAI,cAAc,aAAa,OAAO;;CAGxC,OAAO;;AAGT,SAAgB,yBACd,QAAmC,EAAE,EAC5B;CACT,IAAI,MAAM,SAAS,cAAc,EAC/B,OAAO;CAGT,OAAO,6BACL,MAAM,eAAe,QAAQ,SAAS,KACvC;;AAGH,SAAS,gCAAgC,aAA6B;CACpE,OACE,wDAAwD,4BAA4B,qBAC9D,YAAY;;AAKtC,IAAa,oCAAb,cAAuD,MAAM;CAC3D,YAAY,aAAqB,OAAiB;EAChD,MAAM,gCAAgC,YAAY,EAAE,EAAE,OAAO,CAAC;EAC9D,KAAK,OAAO;;;AAIhB,eAAe,gBAAgB,QAAyC;CAKtE,OAAO,KAAI,OAHW,OADJ,CAAC,OAAO,SAAS,CAAC,KAAK,IACH,IAGpB,SAAS,OAAO;;AAGpC,eAAe,uBAEZ;CACD,MAAM,cAAc,QAAQ,SAAS;CACrC,IAAI,CAAC,6BAA6B,YAAY,EAC5C,MAAM,IAAI,kCAAkC,YAAY;CAG1D,MAAM,cAAc,QAAQ,YAAY,KAAK,QAAQ;CAGrD,QAAQ,eAAe,SAAkB,GAAG,SAAoB;EAC9D,IACE,OAAO,YAAY,YAChB,QAAQ,SAAS,oCAAoC,EAExD;EAEF,OAAO,YAAY,SAAS,GAAG,KAAK;;CAGtC,MAAM,YAAY,CAAC,QAAQ,SAAS,CAAC,KAAK,IAAI;CAC9C,IAAI;EACF,OAAQ,MAAM,OAAO;UAGd,OAAO;EACd,MAAM,IAAI,kCAAkC,aAAa,MAAM;WACvD;EACR,QAAQ,cAAc;;;AAI1B,eAAe,iBAAiB,QAAyC;CAEvE,OAAO,KAAI,OADU,sBAAsB,GACzB,aAAa,OAAO;;AAGxC,eAAsB,mBACpB,QACyB;CACzB,MAAM,MAAM,KAAK,QAAQ,OAAO;CAChC,IAAI,WAAW,cAAc,QAAQ,KACnC,MAAMC,KAAG,MAAM,KAAK,EAAE,WAAW,MAAM,CAAC;CAE1C,OAAO,cAAc,GAAG,gBAAgB,OAAO,GAAG,iBAAiB,OAAO;;AAG5E,IAAa,gBAAb,MAA2B;CACzB,YAAoD;CACpD;CAEA,YAAY,SAA+B;EACzC,KAAK,UAAU;;CAGjB,QAAiC;EAC/B,KAAK,cAAc,KAAK,MAAM;EAC9B,OAAO,KAAK;;CAGd,MAAM,MAAM,OAEM;EAChB,MAAM,mBAAmB,KAAK;EAC9B,KAAK,YAAY;EAEjB,IAAI,CAAC,kBACH;EAGF,MAAM,KAAK,MAAM;EACjB,OAAO,cAAc,GAAG;EACxB,GAAG,SAAS;;CAGd,MAAc,OAAgC;EAC5C,MAAM,KAAK,MAAM,mBAAmB,KAAK,QAAQ,SAAS,CAAC;EAC3D,KAAK,QAAQ,aAAa,GAAG;EAC7B,OAAO;;;;;ACpBX,MAAM,cAAc;AACpB,MAAM,sBAAsB;AAC5B,MAAMC,wBAAsB;AAE5B,IAAI,aAA4B,QAAQ,SAAS;AAEjD,SAAS,YAAoB;CAC3B,OACE,QAAQ,IAAI,gBAAgB,KAAK,KAAK,MAAM,SAAS,oBAAoB;;AAI7E,MAAM,oBAAoB,IAAI,cAAc;CAC1C,SAAS;CACT,YAAY;CACb,CAAC;AAEF,SAAS,QAAiC;CACxC,OAAO,kBAAkB,OAAO;;AAGlC,SAAgB,6BAAsC;CACpD,OAAO,0BAA0B;;AAGnC,SAAS,uBAAuB,IAA0B;CACxD,GAAG,KAAK,4BAA4B;CACpC,GAAG,KAAK,6BAA6B;CACrC,GAAG,KAAK;;;;;;;;;;;;;;;;;;;;;;IAsBN;CACF,aAAa,IAAI,WAAW,2BAA2B;CACvD,aAAa,IAAI,gBAAgB,6BAA6B;CAC9D,aAAa,IAAI,kBAAkB,UAAU;CAC7C,aAAa,IAAI,iBAAiB,OAAO;CACzC,aAAa,IAAI,oBAAoB,UAAU;CAC/C,aAAa,IAAI,eAAe,OAAO;CACvC,GAAG,KAAK;;;IAGN;CACF,GAAG,KAAK;;;IAGN;CACF,GAAG,KAAK;;;IAGN;CACF,GAAG,KAAK;;;IAGN;CACF,GAAG,KAAK;;;IAGN;;AAGJ,SAAS,aACP,IACA,MACA,YACM;CAKN,IAAI,CAJS,GACV,QAAQ,wCAAwC,CAChD,KACmB,CAAC,MAAM,QAAQ,IAAI,SAAS,KACpC,EACZ,GAAG,KAAK,6CAA6C,KAAK,GAAG,aAAa;;AAI9E,SAAgB,eAAe,OAA0C;CACvE,IAAI,OAAO,UAAU,YAAY,CAAC,OAAO,SAAS,MAAM,EACtD,OAAO;CAET,OAAO,KAAK,IAAI,GAAG,KAAK,MAAM,MAAM,CAAC;;AAGvC,SAAgB,uBACd,OACoB;CACpB,OAAO,UAAU,QAAQ,UAAU,KAAA,IAC/B,KAAA,IACA,eAAe,MAAM;;AAG3B,SAAgB,YAAY,QAA8B;CACxD,OACE,eAAe,OAAO,aAAa,GAAG,KACnC,eAAe,OAAO,cAAc,GAAG,KACvC,eAAe,OAAO,wBAAwB,GAAG,KACjD,eAAe,OAAO,4BAA4B,GAAG,KACrD,eAAe,OAAO,aAAa,GAAG,KACtC,eAAe,OAAO,eAAe,GAAG;;AAI/C,SAAgB,mBAAmB,OAA4B;CAC7D,MAAM,gBAAgB,uBAAuB,MAAM,aAAa;CAChE,IAAI,kBAAkB,KAAA,GACpB,OAAO;CAET,OACE,eAAe,MAAM,aAAa,GAChC,eAAe,MAAM,cAAc,GACnC,eAAe,MAAM,wBAAwB,GAC7C,eAAe,MAAM,4BAA4B;;AAIvD,eAAe,qBACb,OACe;CAEf,CAAA,MADiB,OAAO,EACrB,QACD;;;;;;;;;;;;;;;;;;;;;MAsBD,CAAC,IACA,MAAM,eACN,MAAM,gBACN,MAAM,UACN,MAAM,YACN,MAAM,SACN,MAAM,QACN,MAAM,UACN,MAAM,eACN,MAAM,OACN,MAAM,cACN,MAAM,eACN,MAAM,yBACN,MAAM,6BACN,MAAM,cACN,MAAM,gBACN,MAAM,eACN,MAAM,kBACN,MAAM,YACP;;AAGH,SAAgB,uBAAuB,OAAuC;CAC5E,IAAI,CAAC,4BAA4B,EAC/B;CAGF,aAAa,WACV,WAAW,qBAAqB,MAAM,CAAC,CACvC,OAAO,UAAmB;EACzB,QAAQ,KAAK,gCAAgC,MAAM;GACnD;;AAGN,eAAe,wBAAuC;CACpD,IAAI,eAAe;CACnB,OAAO,MAAM;EACX,MAAM;EACN,IAAI,iBAAiB,YACnB;EAEF,eAAe;;;AAInB,SAAS,eAAe,QAA0B,sBAAM,IAAI,MAAM,EAAE;CAClE,MAAM,QAAQ,IAAI,KAAK,IAAI;CAC3B,MAAM,SAAS,GAAG,GAAG,GAAG,EAAE;CAE1B,QAAQ,QAAR;EACE,KAAK,OACH;EAEF,KAAK;GACH,MAAM,QAAQ,MAAM,SAAS,GAAG,EAAE;GAClC;EAEF,KAAK;GACH,MAAM,QAAQ,MAAM,SAAS,GAAG,GAAG;GACnC;EAEF,SACE;;CAIJ,MAAM,MAAM,IAAI,KAAK,MAAM;CAC3B,QAAQ,QAAR;EACE,KAAK;GACH,IAAI,QAAQ,IAAI,SAAS,GAAG,EAAE;GAC9B;EAEF,KAAK;GACH,IAAI,QAAQ,IAAI,SAAS,GAAG,EAAE;GAC9B;EAEF,KAAK;GACH,IAAI,QAAQ,IAAI,SAAS,GAAG,GAAG;GAC/B;EAEF,SACE;;CAIJ,OAAO;EACL,OAAO,IAAI,SAAS;EACpB,SAAS,MAAM,SAAS;EACzB;;AAGH,SAAS,gBAAgB,MAAoB;CAI3C,OAAO,GAHM,KAAK,aAGJ,CAAC,GAFD,OAAO,KAAK,UAAU,GAAG,EAAE,CAAC,SAAS,GAAG,IAE/B,CAAC,GADZ,OAAO,KAAK,SAAS,CAAC,CAAC,SAAS,GAAG,IACjB;;AAGhC,SAAS,qBAAqB,OAA2C;CACvE,MAAM,YAID,EAAE;CACP,MAAM,SAAS,IAAI,KAAK,MAAM,QAAQ;CAEtC,OAAO,OAAO,SAAS,GAAG,MAAM,OAAO;EACrC,MAAM,UAAU,OAAO,SAAS;EAChC,MAAM,OAAO,IAAI,KAAK,OAAO;EAC7B,KAAK,QAAQ,KAAK,SAAS,GAAG,EAAE;EAChC,MAAM,QAAQ,KAAK,IAAI,KAAK,SAAS,EAAE,MAAM,MAAM;EACnD,UAAU,KAAK;GACb,MAAM,gBAAgB,OAAO;GAC7B;GACA;GACD,CAAC;EACF,OAAO,QAAQ,MAAM;;CAGvB,OAAO;;AAGT,SAAS,oBAAsC;CAC7C,OAAO;EACL,6BAA6B;EAC7B,yBAAyB;EACzB,OAAO,EAAE;EACT,cAAc;EACd,eAAe;EACf,eAAe;EACf,gBAAgB;EAChB,cAAc;EACf;;AAGH,SAAS,UAAU,QAA0B,MAA8B;CACzE,OAAO,+BAA+B,KAAK;CAC3C,OAAO,2BAA2B,KAAK;CACvC,OAAO,QAAQ,WAAW,OAAO,OAAO,KAAK,MAAM;CACnD,OAAO,gBAAgB,KAAK;CAC5B,OAAO,iBAAiB,KAAK;CAC7B,OAAO,iBAAiB,KAAK;CAC7B,OAAO,iBAAiB,mBACtB,OAAO,gBACP,KAAK,eACN;CACD,OAAO,gBAAgB,KAAK;;AAG9B,SAAS,mBACP,SACA,MACe;CACf,IAAI,YAAY,MAAM,OAAO;CAC7B,IAAI,SAAS,MAAM,OAAO;CAC1B,OAAO,UAAU;;AAGnB,SAAS,WACP,SACA,MACuB;CACvB,MAAM,6BAAa,IAAI,KAAqB;CAC5C,KAAK,MAAM,QAAQ,CAAC,GAAG,SAAS,GAAG,KAAK,EACtC,WAAW,IACT,KAAK,WACJ,WAAW,IAAI,KAAK,SAAS,IAAI,KAAK,KAAK,iBAC7C;CAGH,OAAO,CAAC,GAAG,WAAW,SAAS,CAAC,CAC7B,MAAM,CAAC,OAAO,CAAC,WAAW,KAAK,cAAc,MAAM,CAAC,CACpD,KAAK,CAAC,UAAU,oBAAoB,WAAW,UAAU,eAAe,CAAC;;AAG9E,SAAS,mBAAmB,QAA6C;CACvE,MAAM,QAAQ,eAAe,OAAO;CAEpC,OAAO;EACL,SAAS,EAAE;EACX;EACA,OAAO;GACL,QAAQ,MAAM;GACd,SAAS,IAAI,KAAK,MAAM,MAAM,CAAC,aAAa;GAC5C,UAAU,MAAM;GAChB,WAAW,IAAI,KAAK,MAAM,QAAQ,CAAC,aAAa;GACjD;EACD,QAAQ,mBAAmB;EAC5B;;AAGH,SAAS,wBACP,QACwB;CACxB,MAAM,QAAQ,eAAe,OAAO;CAEpC,OAAO;EACL,SAAS,EAAE;EACX,MAAM,qBAAqB,MAAM,CAAC,KAAK,cAAc;GACnD,SAAS,EAAE;GACX,MAAM,SAAS;GACf,QAAQ,SAAS;GACjB,UAAU,SAAS;GACnB,QAAQ,mBAAmB;GAC5B,EAAE;EACH;EACA,OAAO;GACL,QAAQ,MAAM;GACd,SAAS,IAAI,KAAK,MAAM,MAAM,CAAC,aAAa;GAC5C,UAAU,MAAM;GAChB,WAAW,IAAI,KAAK,MAAM,QAAQ,CAAC,aAAa;GACjD;EACD,QAAQ,mBAAmB;EAC5B;;AAGH,SAAS,sBAAsB,OAIN;CACvB,MAAM,QAAQ,eAAe,MAAM,OAAO;CAI1C,OAAO;EACL,OAAO,EAAE;EACT,MALW,KAAK,IAAI,GAAG,KAAK,MAAM,MAAM,KAAK,CAKzC;EACJ,WALe,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,KAAK,MAAM,MAAM,SAAS,CAAC,CAKjD;EACnB,QAAQ,MAAM;EACd,OAAO;GACL,QAAQ,MAAM;GACd,SAAS,IAAI,KAAK,MAAM,MAAM,CAAC,aAAa;GAC5C,UAAU,MAAM;GAChB,WAAW,IAAI,KAAK,MAAM,QAAQ,CAAC,aAAa;GACjD;EACD,OAAO;EACP,aAAa;EACd;;AAGH,SAAS,aAAa,OAA2C;CAC/D,OAAO;EACL,QAAQ,MAAM;EACd,SAAS,IAAI,KAAK,MAAM,MAAM,CAAC,aAAa;EAC5C,UAAU,MAAM;EAChB,WAAW,IAAI,KAAK,MAAM,QAAQ,CAAC,aAAa;EACjD;;AAGH,SAAS,cACP,KACA,KACQ;CACR,MAAM,QAAQ,MAAM;CACpB,OAAO,OAAO,UAAU,YAAY,OAAO,SAAS,MAAM,GAAG,QAAQ;;AAGvE,SAAS,sBACP,KACA,KACe;CACf,MAAM,QAAQ,MAAM;CACpB,OAAO,OAAO,UAAU,YAAY,OAAO,SAAS,MAAM,GAAG,QAAQ;;AAGvE,SAAS,WAAW,UAAkB,gBAAwC;CAC5E,OAAO;EACL,QAAQ,iBAAiBA;EACzB;EACA,kBAAkB;EACnB;;AAGH,SAAS,YAAY,KAAqD;CACxE,MAAM,WAAW,IAAI;CACrB,MAAM,iBAAiB,IAAI;CAC3B,IACE,OAAO,aAAa,YACjB,CAAC,YACD,OAAO,mBAAmB,YAC1B,CAAC,OAAO,SAAS,eAAe,EAEnC,OAAO;CAGT,OAAO,WAAW,UAAU,eAAe;;AAG7C,SAAS,iBACP,KAC4B;CAC5B,MAAM,OAAO,YAAY,IAAI;CAC7B,MAAM,SAAS,IAAI;CACnB,IAAI,CAAC,QAAQ,OAAO,WAAW,YAAY,CAAC,QAC1C,OAAO;CAGT,OAAO;EACL,GAAG;EACH;EACD;;AAGH,SAAS,cACP,KACA,QAA+B,EAAE,EACf;CAClB,OAAO;EACL,6BAA6B,cAC3B,KACA,8BACD;EACD,yBAAyB,cAAc,KAAK,0BAA0B;EACtE;EACA,cAAc,cAAc,KAAK,eAAe;EAChD,eAAe,cAAc,KAAK,gBAAgB;EAClD,eAAe,cAAc,KAAK,gBAAgB;EAClD,gBAAgB,sBAAsB,KAAK,iBAAiB;EAC5D,cAAc,cAAc,KAAK,eAAe;EACjD;;AAGH,SAAS,oBACP,KACA,QAA+B,EAAE,EACT;CACxB,OAAO;EACL,GAAG,cAAc,KAAK,MAAM;EAC5B,OAAO,OAAO,IAAI,UAAU,WAAW,IAAI,QAAQ;EACpD;;AAGH,SAAS,cAAc,KAA8B,KAAqB;CACxE,MAAM,QAAQ,IAAI;CAClB,OAAO,OAAO,UAAU,WAAW,QAAQ;;AAG7C,SAAS,sBACP,KACA,KACe;CACf,MAAM,QAAQ,IAAI;CAClB,OAAO,OAAO,UAAU,WAAW,QAAQ;;AAG7C,SAAS,kBACP,KACuB;CACvB,OAAO;EACL,6BAA6B,cAC3B,KACA,8BACD;EACD,yBAAyB,cAAc,KAAK,0BAA0B;EACtE,MAAM,iBAAiB,IAAI;EAC3B,eAAe,cAAc,KAAK,gBAAgB;EAClD,gBAAgB,cAAc,KAAK,iBAAiB;EACpD,UAAU,cAAc,KAAK,WAAW;EACxC,IAAI,cAAc,KAAK,KAAK;EAC5B,cAAc,cAAc,KAAK,eAAe;EAChD,OAAO,cAAc,KAAK,QAAQ,IAAI;EACtC,eAAe,cAAc,KAAK,gBAAgB;EAClD,eAAe,sBAAsB,KAAK,gBAAgB;EAC1D,YAAY,cAAc,KAAK,aAAa;EAC5C,QAAQ,cAAc,KAAK,SAAS;EACpC,gBAAgB,sBAAsB,KAAK,iBAAiB;EAC5D,cAAc,cAAc,KAAK,eAAe;EAChD,UAAU,cAAc,KAAK,WAAW;EACxC,SAAS,cAAc,KAAK,UAAU;EACvC;;AAGH,SAAS,aACP,IACA,OACqC;CACrC,OAAO,GACJ,QACC;;;;;;;;;;;IAYD,CACA,IAAI,MAAM,SAAS,MAAM,MAAM;;AAGpC,SAAS,aACP,IACA,OACgC;CAChC,OAAO,GACJ,QACC;;;;;;;;;;;;;;;;IAiBD,CACA,IAAI,MAAM,SAAS,MAAM,MAAM;;AAGpC,SAAS,YACP,IACA,OACuB;CAmBvB,OAlBa,GACV,QACC;;;;;;;;;;;;IAaD,CACA,IAAI,MAAM,SAAS,MAAM,MAEjB,CAAC,SAAS,QAAQ;EAC3B,MAAM,OAAO,YAAY,IAAI;EAC7B,OAAO,OAAO,CAAC,KAAK,GAAG,EAAE;GACzB;;AAGJ,SAAS,gBACP,IACA,OACoC;CACpC,MAAM,OAAO,GACV,QACC;;;;;;;;;;;;;IAcD,CACA,IAAI,MAAM,SAAS,MAAM,MAAM;CAElC,MAAM,0BAAU,IAAI,KAAoC;CACxD,KAAK,MAAM,OAAO,MAAM;EACtB,MAAM,QAAQ,cAAc,KAAK,QAAQ,IAAI;EAC7C,MAAM,OAAO,YAAY,IAAI;EAC7B,IAAI,CAAC,MACH;EAEF,QAAQ,IAAI,OAAO,CAAC,GAAI,QAAQ,IAAI,MAAM,IAAI,EAAE,EAAG,KAAK,CAAC;;CAG3D,OAAO;;AAGT,SAAS,kBACP,IACA,OAC+B;CAC/B,MAAM,UAAU,gBAAgB,IAAI,MAAM;CAC1C,OAAO,aAAa,IAAI,MAAM,CAAC,KAAK,QAAQ;EAC1C,MAAM,QAAQ,cAAc,KAAK,QAAQ,IAAI;EAC7C,OAAO,oBAAoB,KAAK,QAAQ,IAAI,MAAM,IAAI,EAAE,CAAC;GACzD;;AAGJ,SAAS,kBACP,UACA,SACuB;CACvB,MAAM,SAAS,mBAAmB;CAClC,KAAK,MAAM,SAAS,SAClB,UAAU,QAAQ,MAAM;CAG1B,OAAO;EACL;EACA,MAAM,SAAS;EACf,QAAQ,SAAS;EACjB,UAAU,SAAS;EACnB;EACD;;AAGH,eAAsB,qBACpB,QAC4B;CAC5B,IAAI,CAAC,4BAA4B,EAC/B,OAAO,mBAAmB,OAAO;CAGnC,MAAM,uBAAuB;CAC7B,MAAM,QAAQ,eAAe,OAAO;CACpC,MAAM,KAAK,MAAM,OAAO;CACxB,MAAM,YAAY,aAAa,IAAI,MAAM;CAEzC,OAAO;EACL,SAAS,kBAAkB,IAAI,MAAM;EACrC;EACA,OAAO,aAAa,MAAM;EAC1B,QAAQ,cAAc,WAAW,YAAY,IAAI,MAAM,CAAC;EACzD;;AAGH,eAAsB,0BACpB,QACiC;CACjC,IAAI,CAAC,4BAA4B,EAC/B,OAAO,wBAAwB,OAAO;CAGxC,MAAM,uBAAuB;CAC7B,MAAM,QAAQ,eAAe,OAAO;CACpC,MAAM,KAAK,MAAM,OAAO;CACxB,MAAM,YAAY,qBAAqB,MAAM;CAE7C,OAAO;EACL,SAAS,kBAAkB,IAAI,MAAM;EACrC,MAAM,UAAU,KAAK,aACnB,kBAAkB,UAAU,kBAAkB,IAAI,SAAS,CAAC,CAC7D;EACD;EACA,OAAO,aAAa,MAAM;EAC1B,QAAQ,cAAc,aAAa,IAAI,MAAM,EAAE,YAAY,IAAI,MAAM,CAAC;EACvE;;AAGH,eAAsB,wBAAwB,OAIZ;CAChC,IAAI,CAAC,4BAA4B,EAC/B,OAAO,sBAAsB,MAAM;CAGrC,MAAM,uBAAuB;CAC7B,MAAM,QAAQ,eAAe,MAAM,OAAO;CAC1C,MAAM,OAAO,KAAK,IAAI,GAAG,KAAK,MAAM,MAAM,KAAK,CAAC;CAChD,MAAM,WAAW,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,KAAK,MAAM,MAAM,SAAS,CAAC,CAAC;CACvE,MAAM,UAAU,OAAO,KAAK;CAC5B,MAAM,KAAK,MAAM,OAAO;CAExB,MAAM,WAAW,GACd,QACC;;;;IAKD,CACA,IAAI,MAAM,SAAS,MAAM,MAAM;CAElC,MAAM,OAAO,GACV,QACC;;;;;;;;;;;;;;;;;;;;;;;;;IA0BD,CACA,IAAI,MAAM,SAAS,MAAM,OAAO,UAAU,OAAO;CAIpD,MAAM,QAAQ,cAAc,UAAU,QAAQ;CAE9C,OAAO;EACL,OAAO,KAAK,KAAK,QAAQ,kBAAkB,IAAI,CAAC;EAChD;EACA,WAAW;EACX,QAAQ,MAAM;EACd,OAAO;GACL,QAAQ,MAAM;GACd,SAAS,IAAI,KAAK,MAAM,MAAM,CAAC,aAAa;GAC5C,UAAU,MAAM;GAChB,WAAW,IAAI,KAAK,MAAM,QAAQ,CAAC,aAAa;GACjD;EACD;EACA,aAAa,KAAK,IAAI,GAAG,KAAK,KAAK,QAAQ,SAAS,CAAC;EACtD;;AAGH,eAAsB,kBAAiC;CACrD,MAAM,uBAAuB;CAC7B,MAAM,kBAAkB,MAAM,EAC5B,cAAc,OAAO;EACnB,IAAI;GACF,GAAG,KAAK,kCAAkC;UACpC;IAIX,CAAC;CACF,aAAa,QAAQ,SAAS;;AAGhC,uBAAuB,gBAAgB;;;ACn5BvC,MAAM,sBAAsB;AAC5B,MAAM,0CAA0C;AAEhD,MAAM,iCACJ,sBAAsB;AACxB,MAAM,8BAAsD;CAC1D,OAAO;CACP,WAAW;CACX,UAAU;CACV,MAAM;CACN,eAAe;CAChB;AAED,SAAgB,sBACd,OACiC;CACjC,IACE,MAAM,WAAW,cACd,MAAM,cAAc,MAAM,CAAC,aAAa,KAAK,cAChD;EACA,MAAM,eAAe,4BAA4B,MAAM;EACvD,IAAI,cACF,OAAO;;CAIX,IAAI,MAAM,WAAW,WACnB,OAAO,mBAAmB,MAAM;CAGlC,MAAM,eAAe,MAAM,cAAc,MAAM;CAC/C,IAAI,CAAC,cACH,OAAO;CAGT,MAAM,kBAAkB,uBACtB,cACA,MAAM,OACN,MAAM,QACP;CACD,IAAI,CAAC,iBACH,OAAO;CAGT,MAAM,UAAU,mBACd,gBAAgB,SAChB,mBAAmB,MAAM,CAC1B;CACD,MAAM,WAAW,wBAAwB,cAAc,MAAM,gBAAgB;CAC7E,IAAI,CAAC,UACH,OAAO;CAGT,MAAM,aAAa,eAAe,QAAQ,MAAM;CAChD,MAAM,cAAc,eAAe,QAAQ,OAAO;CAClD,MAAM,iBAAiB,sBAAsB,SAAS,MAAM;CAC5D,MAAM,qBAAqB,0BAA0B,QAAQ;CAE7D,MAAM,iBACJ,mBAAmB,MAAM,cAAc,WAAW,GAChD,mBAAmB,MAAM,eAAe,YAAY,GACpD,mBAAmB,MAAM,yBAAyB,eAAe,GACjE,mBAAmB,MAAM,6BAA6B,mBAAmB;CAE7E,IAAI,kBAAkB,GACpB,OAAO;CAGT,OAAO;EACL;EACA,QAAQ,gBAAgB;EACxB,kBAAkB;EACnB;;AAGH,SAAS,4BACP,OACiC;CACjC,MAAM,OAAO,eAAe,MAAM,KAAK;CACvC,IAAI,SAAS,MACX,OAAO;CAGT,MAAM,iBAAiB,KAAK,MAAM,OAAO,oBAAoB;CAC7D,IAAI,iBAAiB,GACnB,OAAO;CAGT,OAAO;EACL,UAAU;EACV,QAAQ;EACR,kBAAkB;EACnB;;AAOH,SAAS,mBACP,OACiC;CACjC,MAAM,eAAe,eAAe,MAAM,eAAe;CACzD,IAAI,gBAAgB,GAClB,OAAO;CAGT,MAAM,iBAAiB,KAAK,MAC1B,eAAe,+BAChB;CACD,IAAI,kBAAkB,GACpB,OAAO;CAGT,OAAO;EACL,UAAU;EACV,QAAQ;EACR,kBAAkB;EACnB;;AAGH,SAAS,uBACP,cACA,OACA,mBACwB;CACxB,IAAI,mBACF,OAAO;EACL,SAAS;EACT,QAAQ;EACT;CAGH,MAAM,iBAAiB,6BAA6B,eAClD,cACA,MACD,EAAE;CACH,IAAI,CAAC,gBACH,OAAO;CAGT,OAAO;EACL,SAAS;EACT,QAAQ;EACT;;AAGH,SAAS,mBACP,SACA,iBACuB;CACvB,MAAM,QAAQ,QAAQ,OAClB,QAAQ,SAAS,OAAO,SAAS,YAAY,SAAS,KAAK,CAC5D,UAAU,GAAG,MAAM,iBAAiB,EAAE,GAAG,iBAAiB,EAAE,CAAC;CAEhE,MAAM,eACJ,OAAO,MAAM,SAAS,mBAAmB,iBAAiB,KAAK,CAAC,IAC7D,OAAO,GAAG,GAAG;CAElB,OAAO;EACL,GAAG;EACH,GAAG;EACJ;;AAGH,SAAS,iBAAiB,MAAqC;CAC7D,MAAM,iBAAiB,KAAK;CAC5B,OACI,OAAO,mBAAmB,YACrB,OAAO,SAAS,eAAe,IAC/B,iBAAiB,IAEtB,iBACA,OAAO;;AAGb,SAAS,mBAAmB,OAA4B;CACtD,OACE,eAAe,MAAM,aAAa,GAChC,eAAe,MAAM,wBAAwB,GAC7C,eAAe,MAAM,4BAA4B;;AAIvD,SAAS,eAAe,OAAiD;CACvE,OAAO,OAAO,UAAU,YAAY,OAAO,SAAS,MAAM,IAAI,SAAS,IACnE,QACA;;AAGN,SAAS,wBACP,cACA,oBACe;CAIf,OAFE,oBAAoB,MAAM,CAAC,aAAa,IACrC,4BAA4B,aAAa,aAAa,KACxC;;AAGrB,SAAS,0BACP,SACe;CACf,OAAO,eAAe,QAAQ,mBAAmB;;AAGnD,SAAS,sBACP,SACA,OACe;CAKf,IAHE,MAAM,gCAAgC,KAAA,KACnC,MAAM,gCAAgC,MAEf;EAC1B,MAAM,gBAAgB,eAAe,QAAQ,oBAAoB;EACjE,IAAI,kBAAkB,MACpB,OAAO;;CAIX,OAAO,eAAe,QAAQ,YAAY;;AAG5C,SAAS,mBACP,QACA,uBACQ;CACR,IAAI,0BAA0B,MAC5B,OAAO;CAGT,OAAO,KAAK,MACV,eAAe,OAAO,GAClB,wBACA,wCACL;;;;ACnMH,MAAM,qBAAqB,IAAI,UAA8B;AAE7D,SAAS,eAAe,SAA4C;CAClE,OACE,SAAS,MAAM,IAAI,eAAe,UAAU,EAAE,WAAW,iBAAiB;;AAI9E,SAAgB,2BACd,WACA,mBACQ;CACR,OACE,eAAe,UAAU,EAAE,iBAAiB,MAAM,IAC/C,WAAW,MAAM,IACjB,mBAAmB,MAAM,IACzB;;AAIP,SAAS,cAAc,OAAqC;CAC1D,IAAI,MAAM,WAAW,YACnB,OAAO,MAAM,cAAc,MAAM,IAAI;CAEvC,OAAO,MAAM,UAAU,MAAM,IAAI;;AAGnC,SAAS,iBACP,OACiC;CACjC,IAAI,CAAC,YAAY,MAAM,EACrB,OAAO;CAGT,MAAM,sBAAM,IAAI,MAAM;CACtB,MAAM,OAAO,sBAAsB,MAAM;CACzC,OAAO;EACL,6BAA6B,eAC3B,MAAM,4BACP;EACD,yBAAyB,eAAe,MAAM,wBAAwB;EACtE,eAAe,MAAM,YAAY;EACjC,aAAa,MAAM,UAAU;EAC7B,eAAe,IAAI,SAAS;EAC5B,gBAAgB,IAAI,aAAa;EACjC,UAAU,MAAM;EAChB,cAAc,eAAe,MAAM,aAAa;EAChD,OAAO,MAAM,MAAM,MAAM,IAAI;EAC7B,eAAe,eAAe,MAAM,cAAc;EAClD,eAAe,MAAM,cAAc,MAAM,IAAI;EAC7C,YAAY,2BACV,MAAM,WACN,MAAM,kBACP;EACD,QAAQ,MAAM;EACd,gBACE,MAAM,mBAAmB,KAAA,KAAa,MAAM,mBAAmB,OAC7D,OACA,eAAe,MAAM,eAAe;EACxC,kBAAkB,MAAM,oBAAoB;EAC5C,cAAc,mBAAmB,MAAM;EACvC,UAAU,eAAe,MAAM,QAAQ;EACvC,SAAS,cAAc,MAAM;EAC9B;;AAGH,mBAAmB,UAAU,wBAAwB,uBAAuB;AAE5E,SAAgB,sBAAsB,OAAmC;CACvE,MAAM,QAAQ,iBAAiB,MAAM;CACrC,IAAI,CAAC,OACH;CAGF,mBAAmB,QAAQ,wBAAwB,MAAM;;AAG3D,SAAgB,yBACd,SAC8B;CAC9B,QAAQ,UAAU;EAChB,sBAAsB;GACpB,GAAG;GACH,GAAG;GACJ,CAAC;;;AAIN,SAAgB,gCACd,SAC8B;CAC9B,OAAO,yBAAyB;EAC9B,GAAG;EACH,QAAQ;EACT,CAAC;;AAGJ,SAAgB,iCACd,SAC8B;CAC9B,OAAO,yBAAyB;EAC9B,GAAG;EACH,QAAQ;EACT,CAAC;;AAGJ,SAAgB,qBACd,OAca;CACb,IACE,UACI,OAAO,OAAO,OAAO,0BAA0B,IAC9C,OAAO,OAAO,OAAO,2BAA2B,GAErD,OAAO;EACL,yBAAyB,eAAe,MAAM,wBAAwB;EACtE,cAAc,eAAe,MAAM,yBAAyB;EAC5D,eAAe,eAAe,MAAM,kBAAkB;EACtD,cAAc,uBAAuB,MAAM,aAAa;EACzD;CAGH,MAAM,gBAAgB,OAAO;CAC7B,MAAM,yBAAyB,QAC7B,iBACK,OAAO,OAAO,eAAe,8BAA8B,CACjE;CACD,MAAM,kBAAkB,QACtB,iBAAiB,OAAO,OAAO,eAAe,gBAAgB,CAC/D;CACD,MAAM,eAAe,eAAe,eAAe,cAAc;CACjE,MAAM,sBAAsB,eAC1B,eAAe,4BAChB;CACD,MAAM,eAAe,eAAe,OAAO,cAAc;CACzD,OAAO;EACL,GAAI,0BAA0B,EAC5B,6BAA6B,qBAC9B;EACD,GAAI,mBAAmB,EACrB,yBAAyB,cAC1B;EACD,cAAc,KAAK,IACjB,GACA,eAAe,eAAe,oBAC/B;EACD,eAAe,eAAe,OAAO,kBAAkB;EACvD,cAAc,uBAAuB,OAAO,aAAa;EAC1D;;AAGH,SAAgB,wBACd,OAYa;CACb,MAAM,eAAe,eACnB,OAAO,sBAAsB,cAC9B;CACD,MAAM,mBAAmB,eACvB,OAAO,sBAAsB,mBAC9B;CACD,MAAM,cAAc,eAAe,OAAO,aAAa;CACvD,OAAO;EACL,GAAI,mBAAmB,KAAK,EAC1B,6BAA6B,kBAC9B;EACD,yBAAyB;EACzB,cAAc,KAAK,IAAI,GAAG,cAAc,eAAe,iBAAiB;EACxE,eAAe,eAAe,OAAO,cAAc;EACnD,cAAc,uBAAuB,OAAO,aAAa;EAC1D;;AAGH,SAAgB,wBACd,OAWa;CACb,OAAO;EACL,6BAA6B,uBAC3B,OAAO,4BACR;EACD,yBAAyB,uBACvB,OAAO,wBACR;EACD,MAAM,sBAAsB,OAAO,KAAK;EACxC,cAAc,uBAAuB,OAAO,aAAa;EACzD,eAAe,uBAAuB,OAAO,cAAc;EAC3D,cAAc,uBAAuB,OAAO,aAAa;EAC1D;;AAGH,SAAgB,oBACd,SACA,MACa;CACb,OAAO;EACL,6BACE,KAAK,+BAA+B,QAAQ;EAC9C,yBACE,KAAK,2BAA2B,QAAQ;EAC1C,MAAM,KAAK,QAAQ,QAAQ;EAC3B,cAAc,KAAK,gBAAgB,QAAQ;EAC3C,eAAe,KAAK,iBAAiB,QAAQ;EAC7C,gBAAgB,KAAK,kBAAkB,QAAQ;EAC/C,cAAc,KAAK,gBAAgB,QAAQ;EAC5C;;AAGH,SAAS,sBACP,OACoB;CACpB,OAAO,OAAO,UAAU,YAAY,OAAO,SAAS,MAAM,IAAI,SAAS,IACnE,QACA,KAAA;;;;ACnUN,MAAM,kBAAkB,EAAE,QAAQ,CAAC,KAAK,CAAC,aAAa;AACtD,MAAM,oBAAoB,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,SAAS,CAAC;AAE3D,MAAM,oBAAoB,EACvB,OAAO;CACN,GAAG,EAAE,QAAQ;CACb,SAAS,gBAAgB,UAAU;CACnC,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,UAAU;CACxC,CAAC,CACD,OAAO;AAEV,MAAM,sBAAsB,EACzB,OAAO;CACN,QAAQ,EAAE,QAAQ;CAClB,QAAQ,gBAAgB,UAAU;CACnC,CAAC,CACD,OAAO;AAEV,MAAM,uBAAuB,EAC1B,OAAO;CACN,QAAQ,EAAE,QAAQ;CAClB,IAAI;CACL,CAAC,CACD,OAAO;AAEV,MAAM,sBAAsB,EACzB,OAAO;CACN,QAAQ,EAAE,QAAQ;CAClB,SAAS,EAAE,QAAQ;CACpB,CAAC,CACD,OAAO;AAEV,MAAM,4BAA4B,EAC/B,OAAO;CACN,QAAQ,EAAE,QAAQ;CAClB,QAAQ;CACT,CAAC,CACD,OAAO;AAEV,MAAM,yBAAyB,EAC5B,OAAO;CACN,QAAQ,EAAE,QAAQ;CAClB,MAAM,EAAE,KAAK;EAAC;EAAU;EAAQ;EAAU;EAAQ,CAAC;CACnD,QAAQ,EAAE,QAAQ,CAAC,UAAU;CAC9B,CAAC,CACD,OAAO;AAEV,MAAM,yBAAyB,EAC5B,OAAO;CACN,UAAU,EAAE,QAAQ;CACpB,OAAO,EAAE,QAAQ,CAAC,UAAU;CAC5B,UAAU,gBAAgB,UAAU;CACrC,CAAC,CACD,OAAO;AAEV,MAAM,wBAAwB,EAC3B,OAAO;CACN,MAAM,EAAE,QAAQ,SAAS,CAAC,UAAU;CACpC,IAAI,EAAE,KAAK,CAAC,YAAY,YAAY,CAAC;CACrC,QAAQ,EAAE,KAAK;EACb;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC;CACF,MAAM,EAAE,QAAQ,CAAC,UAAU;CAC3B,UAAU,EAAE,QAAQ,CAAC,UAAU;CAC/B,WAAW,EAAE,QAAQ,CAAC,UAAU;CAChC,SAAS,EAAE,QAAQ,CAAC,UAAU;CAC9B,WAAW,gBAAgB,UAAU;CACrC,QAAQ,EAAE,QAAQ,CAAC,UAAU;CAC9B,CAAC,CACD,OAAO;AAEV,MAAM,sBAAsB,EACzB,OAAO,EACN,YAAY,EAAE,QAAQ,CAAC,MAAM,mCAAmC,EACjE,CAAC,CACD,OAAO;AAEV,MAAa,4BAA4B,EACtC,OAAO;CACN,cAAc,EAAE,MAAM,kBAAkB,CAAC,UAAU;CACnD,aAAa,EAAE,MAAM,kBAAkB,CAAC,UAAU;CAClD,MAAM,EAAE,MAAM,oBAAoB,CAAC,UAAU;CAC7C,OAAO,EAAE,MAAM,qBAAqB,CAAC,UAAU;CAC/C,MAAM,EAAE,MAAM,oBAAoB,CAAC,UAAU;CAC7C,YAAY,EAAE,MAAM,0BAA0B,CAAC,UAAU;CACzD,SAAS,EAAE,MAAM,uBAAuB,CAAC,UAAU;CACnD,SAAS,EAAE,MAAM,uBAAuB,CAAC,UAAU;CACnD,QAAQ,EAAE,MAAM,sBAAsB,CAAC,UAAU;CACjD,MAAM,EAAE,MAAM,oBAAoB,CAAC,UAAU;CAC7C,iBAAiB,EAAE,KAAK;EAAC;EAAS;EAAU;EAAO,CAAC,CAAC,UAAU;CAChE,CAAC,CACD,OAAO;AAEV,MAAM,kBAAkB,EACrB,OAAO;CACN,QAAQ,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU;CAC/C,SAAS,EACN,KAAK;EAAC;EAAQ;EAAW;EAAY;EAAO,CAAC,CAC7C,UAAU,CACV,UAAU;CACb,SAAS,EACN,KAAK;EAAC;EAAQ;EAAgB;EAAY,CAAC,CAC3C,UAAU,CACV,UAAU;CACd,CAAC,CACD,OAAO;AAEV,MAAM,iBAAiB,EACpB,OAAO;CACN,eAAe,EACZ,OAAO;EACN,MAAM,EAAE,QAAQ,cAAc;EAC9B,SAAS,EAAE,QAAQ,CAAC,UAAU;EAC9B,QAAQ,EAAE,QAAQ,CAAC,UAAU;EAC7B,MAAM,EAAE,QAAQ,CAAC,UAAU;EAC3B,UAAU,EAAE,QAAQ,CAAC,UAAU;EAChC,CAAC,CACD,OAAO,CACP,UAAU;CACb,qBAAqB,EAAE,KAAK;EAAC;EAAO;EAAU;EAAO,CAAC,CAAC,UAAU;CACjE,SAAS,EACN,OAAO;EACN,iBAAiB,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,UAAU;EAC/C,iBAAiB,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,UAAU;EAChD,CAAC,CACD,OAAO,CACP,UAAU;CACb,gBAAgB,EACb,OAAO;EACN,aAAa,gBAAgB,UAAU;EACvC,SAAS,EAAE,SAAS,CAAC,UAAU;EAChC,CAAC,CACD,OAAO,CACP,UAAU;CACb,iBAAiB,EACd,MAAM,EAAE,KAAK;EAAC;EAAU;EAAS;EAAmB,CAAC,CAAC,CACtD,UAAU;CACb,qBAAqB,EAClB,MAAM,CAAC,EAAE,SAAS,EAAE,EAAE,KAAK;EAAC;EAAU;EAAW;EAAO,CAAC,CAAC,CAAC,CAC3D,UAAU;CACd,CAAC,CACD,OAAO;AAEV,MAAa,2BAA2B,EACrC,OAAO;CACN,IAAI,EAAE,QAAQ;CACd,OAAO,EAAE,QAAQ;CACjB,WAAW,gBAAgB,UAAU;CACrC,OAAO,EAAE,MAAM,CAAC,EAAE,QAAQ,EAAE,EAAE,MAAM,kBAAkB,CAAC,CAAC,CAAC,UAAU;CACnE,UAAU,0BAA0B,UAAU;CAC9C,UAAU,eAAe,UAAU;CACnC,mBAAmB,gBAAgB,UAAU;CAC9C,CAAC,CACD,OAAO;;;;AC9HV,MAAa,+BACX,WAC4B;CAC5B,MAAM,OAAgC,EAAE,MAAM,cAAc;CAC5D,MAAM,UAAmC,EAAE;CAC3C,IAAI,OAAO,gBAAgB,QACzB,QAAQ,kBAAkB,OAAO;CAEnC,IAAI,OAAO,gBAAgB,QACzB,QAAQ,kBAAkB,OAAO;CAEnC,IAAI,OAAO,KAAK,QAAQ,CAAC,SAAS,GAAG,KAAK,UAAU;CACpD,IAAI,OAAO,cAAc,KAAK,gBAAgB,OAAO;CACrD,IAAI,OAAO,mBACT,KAAK,sBAAsB,OAAO;CAEpC,OAAO;;AAGT,MAAM,iBACJ,SACkC,KAAK,SAAS;AAElD,MAAM,sBACJ,YACA,aACwC;CACxC,MAAM,MAAM;CACZ,OACE,IAAI,SAAS,kBAAkB,QAAQ,IAAI,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,IAAI;;AAI7E,MAAM,oBACJ,QAGA,aACkE;CAClE,MAAM,YAA2B,EAAE;CACnC,MAAM,UAAkC,EAAE;CAC1C,KAAK,MAAM,SAAS,UAAU,EAAE,EAAE;EAChC,IAAI,MAAM,SAAS,eAAe;EAClC,IAAI,MAAM,MAAM,UAAU,KAAK,MAAM,KAAK;EAC1C,KAAK,MAAM,cAAc,MAAM,eAAe,EAAE,EAAE;GAChD,IAAI,CAAC,mBAAmB,YAAY,SAAS,EAAE;GAC/C,MAAM,MAAM;GACZ,SAAS,IAAI,IAAI,IAAI;GACrB,MAAM,QAAQ,KAAK,IAAI,IAAI,IAAI,eAAe,KAAK,IAAI;GACvD,MAAM,MAAM,KAAK,IACf,MAAM,MAAM,UAAU,IACrB,IAAI,aAAa,MAAM,MAAM,UAAU,KAAK,IAC9C;GACD,QAAQ,KAAK;IACX,KAAK,IAAI;IACT,OAAO,IAAI,SAAS,IAAI;IACxB,SAAS,MAAM,MAAM,MAAM,OAAO,IAAI,CAAC,MAAM;IAC9C,CAAC;;;CAGN,OAAO;EAAE;EAAW;EAAS;;AAG/B,MAAM,gBACJ,MACA,YACS;CACT,IAAI,KAAK,QAAQ,SAAS,QACxB,QAAQ,KAAK,GAAG,KAAK,OAAO,QAAQ;MAC/B,IAAI,KAAK,QAAQ,OACtB,QAAQ,KAAK,KAAK,OAAO,MAAM;;;;;;AAQnC,MAAa,0BACX,WACqB;CACrB,MAAM,YAA2B,EAAE;CACnC,MAAM,UAAkC,EAAE;CAC1C,MAAM,2BAAW,IAAI,KAAa;CAClC,MAAM,UAAyB,EAAE;CAEjC,KAAK,MAAM,QAAQ,OAAO,QACxB,IAAI,cAAc,KAAK,EAAE;EACvB,MAAM,YAAY,iBAAiB,KAAK,SAAS,SAAS;EAC1D,UAAU,KAAK,GAAG,UAAU,UAAU;EACtC,QAAQ,KAAK,GAAG,UAAU,QAAQ;;CAItC,KAAK,MAAM,QAAQ,OAAO,QACxB,IAAK,KAA2B,SAAS,mBAAmB;EAC1D,MAAM,SACJ,KAOA;EACF,aAAa,EAAE,QAAQ,EAAE,QAAQ;EACjC,KAAK,MAAM,UAAU,QAAQ,WAAW,EAAE,EAAE;GAC1C,IAAI,CAAC,OAAO,OAAO,SAAS,IAAI,OAAO,IAAI,EAAE;GAC7C,SAAS,IAAI,OAAO,IAAI;GACxB,QAAQ,KAAK;IAAE,KAAK,OAAO;IAAK,OAAO,OAAO;IAAK,CAAC;;;CAO1D,OAAO;EAAE,YADP,UAAU,KAAK,OAAO,CAAC,MAAM,KAAK,OAAO,eAAe,IAAI,MAAM;EAC/C;EAAS;EAAS;;;;ACvJzC,MAAM,wBAAwB,CAAC,WAAW,SAAS;AAqBnD,MAAM,0BAAgE;CACpE,SAAS;CACT,QAAQ;CACT;AAED,MAAM,2BAAiE;CACrE,SAAS;CACT,QAAQ;CACT;AAED,MAAM,gBAAgB,YAA6C;CACjE,OAAO,SAAS,WAAW,OAAO,QAAQ,QAAQ;;AAGpD,MAAMC,oBACJ,SACA,eACkB;CAClB,IAAI,aAAa,QAAQ,EACvB,OAAO,QAAQ,IAAI,WAAW;CAGhC,MAAM,uBAAuB,WAAW,aAAa;CAKrD,OAJqB,OAAO,QAAQ,QAAQ,CAAC,MAC1C,CAAC,SAAS,IAAI,aAAa,KAAK,qBAGhB,GAAG,MAAM;;AAG9B,MAAa,+BACX,gBAC+C;CAC/C,MAAM,SAAS,IAAI,gBAAgB,YAAY;CAC/C,MAAM,YAAY,OAAO,IAAI,MAAM;CACnC,MAAM,UAAU,OAAO,IAAI,MAAM;CAEjC,IAAI,CAAC,aAAa,CAAC,SACjB,OAAO;CAGT,OAAO;EACL;EACA;EACD;;AAGH,MAAa,4BACX,SACA,SACiC;CACjC,MAAM,aAAa,wBAAwB;CAC3C,MAAM,cAAcA,iBAAe,SAAS,WAAW;CAEvD,IAAI,CAAC,aACH,OAAO;CAGT,MAAM,SAAS,4BAA4B,YAAY;CAEvD,IAAI,CAAC,QACH,OAAO;CAGT,OAAO;EACL;EACA,GAAG;EACJ;;AAGH,MAAa,yCACX,WACA,SACiC;CACjC,MAAM,WAAW,YAAY,yBAAyB;CACtD,IAAI,CAAC,uBAAuB,SAAS,EACnC,OAAO;CAGT,OAAO;EACL,WAAW,OAAO,SAAS,kBAAkB;EAC7C,SAAS,SAAS;EAClB;EACD;;AAGH,MAAa,wBAAwB,YAA+B;CAClE,KAAK,MAAM,QAAQ,uBAAuB;EACxC,MAAM,QAAQ,yBAAyB,SAAS,KAAK;EAErD,IAAI,CAAC,OACH;EAGF,yBAAyB,MAAM;;;AAInC,MAAa,4BACX,cACS;CACT,KAAK,MAAM,QAAQ,uBAAuB;EACxC,MAAM,QAAQ,sCAAsC,WAAW,KAAK;EAEpE,IAAI,CAAC,OACH;EAGF,yBAAyB,MAAM;;;AAInC,MAAM,4BAA4B,UAAuC;CACvE,MAAM,IAAI,IAAI,KAAK,MAAM,QAAQ;CACjC,MAAM,UAAU,OAAO,MAAM,EAAE,SAAS,CAAC,GAAG,MAAM,UAAU,EAAE,gBAAgB;CAC9E,QAAQ,IACN,WAAW,MAAM,KAAK,oBAAoB,MAAM,UAAU,eAAe,UAC1E;;AAGH,MAAM,0BACJ,UACkC;CAClC,IAAI,CAAC,SAAS,OAAO,UAAU,UAC7B,OAAO;CAGT,MAAM,SAAS;CACf,OACE,OAAO,OAAO,gBAAgB,YAC3B,OAAO,OAAO,sBAAsB,YACpC,OAAO,OAAO,sBAAsB,aACpC,OAAO,OAAO,kBAAkB,YAChC,OAAO,OAAO,eAAe;;;;ACtGpC,MAAa,kBAAkB,OAC7B,SACA,EACE,QACA,WACA,gBACA,WACA,WACA,aACA,YAAY,QACZ,aAEiC;CACnC,IAAI,CAAC,MAAM,cAAc,MAAM,IAAI,MAAM,0BAA0B;CAEnE,MAAM,UAAkC;EACtC,GAAG,eAAe,OAAO,WAAW,OAAO;EAC3C,eAAe;EAChB;CAED,0BAA0B,WAAW,QAAQ,eAAe,EAAE,QAAQ;CAEtE,kBAAkB,SAAS,YAAY;CAGvC,QAAQ,eAAe,KAAA;CAEvB,QAAQ,IAAI,cAAc,QAAQ,QAAQ;CAE1C,MAAM,qBACJ,gBAAA,IAAkC,SAAS;CAE7C,IAAI,QAAQ,WAAW,QAAQ,uBAAuB,aAWpD,OADe,qCATU,iCACvB,SACA,SACA;EACE;EACA;EACA;EACD,CAEiE,CACvD;CAGf,OAAO,MAAM,oBAAoB,SAAS,SAAS,OAAO;;AAG5D,MAAM,sBAAsB,OAC1B,SACA,SACA,WACmC;CACnC,MAAM,kBAAkB,6BAA6B;CACrD,MAAM,WAAW,MAAM,4BACrB,GAAG,eAAe,MAAM,CAAC,aACzB;EACE,QAAQ;EACR;EACA,MAAM,KAAK,UAAU,QAAQ;EAC9B,EACD;EACE,kBAAkB,gBAAgB;EAClC;EACA,2BAA2B,gBAAgB;EAC5C,CACF;CAED,qBAAqB,SAAS,QAAQ;CAEtC,IAAI,CAAC,SAAS,IAAI;EAChB,QAAQ,MAAM,8BAA8B,SAAS;EACrD,MAAM,IAAI,UAAU,8BAA8B,SAAS;;CAG7D,IAAI,QAAQ,QACV,OAAO,0BACL,+BAA+B,UAAU,OAAO,EAChD,EAAE,QAAQ,CACX;CAGH,OAAQ,MAAM,SAAS,MAAM;;AAW/B,MAAa,oCACX,SACA,iBACA,YAK8B;CAC9B,MAAM,YAAY,+BAA+B,gBAAgB;CAEjE,OAAO;EACL,SAAS,wBAAwB,gBAAgB;EACjD,SAAS,+BAA+B,SAAS,QAAQ;EACzD,SAAS,+BAA+B,SAAS,UAAU;EAC3D,QAAQ,QAAQ;EAChB,KAAK,2BAA2B,eAAe,MAAM,CAAC;EACvD;;AAGH,MAAa,kCACX,SACA,EACE,WACA,qBAKS;CACX,MAAM,mBACJ,MAAM,eACJ,WAAW,SAAS,CAAC,OAAO,MAAM,aAAa,CAAC,OAAO,MAAM,CAAC,MAAM,GAAG,GAAG,GAC1E;CACJ,MAAM,cACJ,iBACE;EACE,eAAe;EACf,eAAe;EACf,eAAe;EAChB,CAAC,KAAK,IAAI,GACX;CAEJ,OAAO;EAAC;EAAkB,QAAQ;EAAO;EAAW;EAAY,CAC7D,IAAI,kBAAkB,CACtB,KAAK,IAAI;;AAGd,MAAa,kCACX,oBACqB;CAErB,OADkB,eAAe,iBAAiB,cAClC,EAAE,aAAa,KAAK,UAAU,UAAU;;AAG1D,MAAM,wCACJ,YACoB;CACpB,MAAM,kBAAkB,6BAA6B;CACrD,OAAO,0BACL,4BAA4B,SAAS;EACnC,aAAa;EACb,kBAAkB,gBAAgB;EAClC,qBAAqB,gBAAgB;EACrC,iBAAiB;EACjB,kBAAkB;EAClB,eAAe,gBAAgB;EAC/B,mBAAmB,gBAAgB;EACnC,2BAA2B,gBAAgB;EAC3C,oBACE;EACF,6BACE;EACH,CAAC,EACF,EAAE,QAAQ,QAAQ,QAAQ,CAC3B;;AAGH,MAAa,kCACX,SACA,cAC8B;CAC9B,MAAM,mBAA8C;EAClD,GAAG;EACH,MAAM;EACN;EACD;CAED,OAAO,iBAAiB;CACxB,OAAO,iBAAiB;CACxB,OAAO,iBAAiB;CAExB,OAAO;;AAGT,MAAa,8BAA8B,YAA4B;CACrE,OAAO,mBAAmB,GAAG,QAAQ,QAAQ,SAAS,GAAG,CAAC,YAAY;;AAGxE,MAAM,kBACJ,SACA,eACuB;CACvB,MAAM,uBAAuB,WAAW,aAAa;CAKrD,OAJc,OAAO,QAAQ,QAAQ,CAAC,MACnC,CAAC,SAAS,IAAI,aAAa,KAAK,qBAGvB,GAAG;;AAGjB,MAAM,uCACJ,SACmD;CACnD,IAAI,SAAS,UACX,OAAO,EAAE,MAAM;CAGjB,IAAI;EACF,MAAM,SAAS,KAAK,MAAM,KAAK;EAW/B,IAAI,OAAO,SAAS,sBAClB,yBAAyB,OAAO,wBAAwB;EAE1D,IAAI,OAAO,SAAS,WAAW,OAAO,OAAO;GAC3C,QAAQ,KAAK,6CAA6C,OAAO,MAAM;GACvE,OAAO,OAAO,OAAO,MAAM;GAC3B,OAAO,UAAU,OAAO,MAAM;;EAEhC,OAAO;GACL,OAAO,OAAO,OAAO,SAAS,WAAW,OAAO,OAAO,KAAA;GACvD,MAAM,KAAK,UAAU,OAAO;GAC5B,IAAI,OAAO,OAAO,OAAO,WAAW,OAAO,KAAK,KAAA;GACjD;SACK;EACN,OAAO,EAAE,MAAM;;;;;;;;;;AC7RnB,MAAa,2BAA2B,eACrC,EACC,SACE,SACA,SACA;CACA,OAAO,qBAAqB,CAAC,SAC3B;EACE,GAAG;EACH,aAAa;EACb,gBAAgB;EACjB,EACD,QACD;GAEJ;;;ACRH,MAAM,6BAA6B,CAAC,UAAU,aAAa;AAE3D,MAAM,gCAAgC,CACpC,qBACA,iBACD;AAED,MAAM,4BAA4B;CAChC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AAED,SAAgB,6BACd,gBACA,gBACwB;CACxB,MAAM,cAAsC,EAAE;CAC9C,IAAI,eAAe,aAAa,aAC9B,YAAY,eAAe,eAAe;MAE1C,YAAY,gBAAgB,UAAU,eAAe;CAGvD,MAAM,UAAkC;EACtC,gBAAgB;EAChB,QAAQ;EACR,GAAG;EACJ;CAED,KAAK,MAAM,cAAc,4BAA4B;EACnD,MAAM,cAAc,eAAe,IAAI,WAAW;EAClD,IAAI,aACF,QAAQ,cAAc;;CAI1B,IAAI,eAAe,SAAS,aAC1B,OAAO;CAGT,KAAK,MAAM,cAAc,+BAA+B;EACtD,MAAM,cAAc,eAAe,IAAI,WAAW;EAClD,IAAI,aACF,QAAQ,cAAc;;CAI1B,OAAO;;AAGT,SAAgB,4BACd,kBACA,MACU;CACV,MAAM,UAAU,IAAI,QAAQ,iBAAiB,QAAQ;CAErD,KAAK,MAAM,cAAc,2BACvB,QAAQ,OAAO,WAAW;CAG5B,OAAO,IAAI,SAAS,QAAQ,iBAAiB,MAAM;EACjD;EACA,QAAQ,iBAAiB;EACzB,YAAY,iBAAiB;EAC9B,CAAC;;AAGJ,eAAsB,wBACpB,gBACA,SACA,gBACmB;CACnB,QAAQ,IAAI,cAAc,QAAQ,QAAQ;CAC1C,OAAO,MAAM,MAAM,GAAG,eAAe,QAAQ,eAAe;EAC1D,QAAQ;EACR,SAAS,6BAA6B,gBAAgB,eAAe;EACrE,MAAM,KAAK,UAAU,QAAQ;EAC9B,CAAC;;AAGJ,eAAsB,+BACpB,gBACA,SACA,gBACmB;CACnB,QAAQ,IAAI,cAAc,QAAQ,QAAQ;CAC1C,OAAO,MAAM,MAAM,GAAG,eAAe,QAAQ,uBAAuB;EAClE,QAAQ;EACR,SAAS,6BAA6B,gBAAgB,eAAe;EACrE,MAAM,KAAK,UAAU,QAAQ;EAC9B,CAAC;;AAGJ,eAAsB,yBACpB,gBACA,SACA,gBACA,UAAoC,EAAE,EACnB;CACnB,QAAQ,IAAI,cAAc,QAAQ,QAAQ;CAC1C,MAAM,kBAAkB,6BAA6B;CACrD,OAAO,MAAM,4BACX,GAAG,eAAe,QAAQ,gBAC1B;EACE,QAAQ;EACR,SAAS,6BAA6B,gBAAgB,eAAe;EACrE,MAAM,KAAK,UAAU,QAAQ;EAC9B,EACD;EACE,kBAAkB,gBAAgB;EAClC,QAAQ,QAAQ;EAChB,2BAA2B,gBAAgB;EAC5C,CACF;;AAGH,MAAM,6BAA6B;AAEnC,eAAsB,sBACpB,gBACA,gBACmB;CACnB,OAAO,MAAM,MAAM,GAAG,eAAe,QAAQ,aAAa;EACxD,QAAQ;EACR,SAAS,6BAA6B,gBAAgB,eAAe;EACrE,QAAQ,YAAY,QAAQ,2BAA2B;EACxD,CAAC;;;AAIJ,MAAM,6BAA6B,MAAU;AAE7C,MAAM,2BAA2B,wBAC/B,2BACD;AAED,SAAS,0BACP,gBACA,YACA,MACQ;CACR,MAAM,cAAc,IAAI,IAAI,GAAG,eAAe,UAAU,OAAO;CAC/D,YAAY,SAAS,IAAI,IAAI,YAAY,mBAAmB,CAAC;CAC7D,OAAO,YAAY,UAAU;;AAG/B,eAAsB,2BACpB,gBACA,SACmB;CACnB,MAAM,UAAU,6BAA6B,gBAAgB,QAAQ,QAAQ;CAC7E,MAAM,OAAO,MAAM,QAAQ,aAAa;CAExC,OAAO,MAAM,MACX,0BAA0B,gBAAgB,QAAQ,KAAK,mBAAmB,EAC1E;EACE,QAAQ;EACR;EACA;EACD,CACF;;AAGH,eAAsB,sBACpB,gBACA,SACA,WACmB;CACnB,MAAM,UAAU,6BAA6B,gBAAgB,QAAQ,QAAQ;CAC7E,MAAM,cAAc,QAAQ,QAAQ,IAAI,eAAe;CACvD,IAAI,aACF,QAAQ,kBAAkB;MACrB,IAAI,cAAc,SACvB,OAAO,QAAQ;CAGjB,MAAM,OAAyC;EAC7C,QAAQ;EACR;EACA,MAAM,QAAQ;EACd,QAAQ;EACR,QAAQ,YAAY,QAAQ,2BAA2B;EACxD;CAED,MAAM,cAAc,0BAClB,gBACA,QAAQ,KACR,cAAc,YACf;CAED,IAAI,OAAO,QAAQ,aACjB,OAAO,MAAM,MAAM,aAAa,KAAK;CAKvC,OAAQ,MAAMC,QAAY,aAAa;EACrC,GAAG;EACH,YAAY;EACb,CAAiC;;;;ACzLpC,MAAMC,YAAS,oBAAoB,iCAAiC;AAEpE,MAAM,iBAAiB,OAAU;AACjC,MAAM,eAAe;AACrB,MAAM,qBAAqB;AAC3B,MAAM,gBAAgB;AACtB,MAAM,0BAA0B;AAIhC,MAAM,oBACJ;AACF,MAAM,yBACJ;AAEF,MAAM,iBAAiB,IAAI,IAAI;CAC7B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;AA+DF,MAAM,2BAAW,IAAI,KAA4B;AAEjD,MAAa,mCAAmC;CAC7BC;CACjB;CACA,WAAmB,KAAK,KAAK;CAC7B;CACA;CACA;CACA,sBACE,OACA,cAEA,gCAAgC;EAC9B,UAAU;EACV,mBAAmB;EACnB;EACD,CAAC;CACL;AAMD,SAAS,eACP,IACA,KAIA;CACA,KAAK,MAAM,CAAC,WAAW,YAAY,UACjC,IAAI,MAAM,QAAQ,aAAa,gBAC7B,SAAS,OAAO,UAAU;CAI9B,IAAI,UAAU,SAAS,IAAI,GAAG;CAC9B,IAAI,CAAC,SAAS;EACZ,IAAI,SAAS,QAAQ,cAAc;GACjC,MAAM,gBAAgB,SAAS,MAAM,CAAC,MAAM;GAC5C,IAAI,CAAC,cAAc,MAAM,SAAS,OAAO,cAAc,MAAM;;EAE/D,UAAU;GACR,UAAU;GACV,WAAW;GACX,gCAAgB,IAAI,KAAK;GACzB,iCAAiB,IAAI,KAAK;GAC1B,2BAAW,IAAI,KAAK;GACrB;QACI;EACL,SAAS,OAAO,GAAG;EACnB,QAAQ,YAAY;;CAEtB,SAAS,IAAI,IAAI,QAAQ;CAEzB,MAAM,OAAO,QAAQ;CACrB,QAAQ,YAAY;CACpB,OAAO;EAAE;EAAS;EAAM;;AAG1B,SAAS,aAAa,OAA8B;CAClD,IAAI;EACF,MAAM,MAAM,IAAI,IAAI,MAAM;EAC1B,OAAO,IAAI,aAAa,WAAW,IAAI,aAAa,WAChD,IAAI,UAAU,GACd;SACE;EACN,OAAO;;;AAIX,SAAS,uBAAuB,MAAsC;CAGpE,OAAO,MAAM,KACX,KAAK,SACH,uEACD,GACA,GAAG,OAAO,UAAU;EAAE;EAAO;EAAK,EACpC;;AAGH,SAAS,gBACP,SACA,QACA,MACqB;CACrB,MAAM,MAAM,aAAa,OAAO,IAAI;CACpC,IAAI,CAAC,KAAK,OAAO;CAEjB,MAAM,WAAW,QAAQ,gBAAgB,IAAI,IAAI;CACjD,IAAI,UAAU;EACZ,IAAI,SAAS,OAAO,UAAU,SAAS,OAAO,OAAO,OAAO,OAC1D,SAAS,OAAO,QAAQ,OAAO;EAEjC,IAAI,OAAO,SAAS,SAAS,OAAO,UAAU,OAAO;EACrD,OAAO;;CAGT,IAAI,QAAQ,eAAe,QAAQ,oBAAoB;EACrD,MAAM,SAAS,QAAQ,eAAe,SAAS,CAAC,MAAM,CAAC;EACvD,IAAI,QAAQ;GACV,MAAM,CAAC,OAAO,aAAa;GAC3B,QAAQ,eAAe,OAAO,MAAM;GACpC,QAAQ,gBAAgB,OAAO,UAAU,OAAO,IAAI;;;CAIxD,MAAM,QAAQ,OAAO,KAAK,OAAO,QAAQ,KAAK;CAC9C,KAAK,sBAAsB;CAE3B,MAAM,YAA0B,EAC9B,QAAQ;EACN,MAAM;EACN,QAAQ,IAAI,IAAI,IAAI,CAAC;EACrB,QAAQ;EACR,SAAS,OAAO,SAAS,MAAM,IAAI,OAAO,SAAS;EACnD,OAAO,OAAO,SAAS;EACvB;EACD,EACF;CACD,QAAQ,eAAe,IAAI,OAAO,UAAU;CAC5C,QAAQ,gBAAgB,IAAI,KAAK,UAAU;CAC3C,OAAO;;AAGT,SAAS,oBACP,SACA,OACA,MACqB;CACrB,MAAM,SAAS,QAAQ,eAAe,IAAI,MAAM;CAChD,IAAI,QAAQ,OAAO;CAEnB,MAAM,MAAM,aAAa,MAAM;CAC/B,OAAO,MAAM,gBAAgB,SAAS;EAAE,OAAO;EAAK;EAAK,EAAE,KAAK,GAAG;;AAGrE,SAAS,YACP,SACA,OACqB;CACrB,MAAM,WAAW,QAAQ,UAAU,IAAI,MAAM;CAC7C,IAAI,CAAC,UAAU,OAAO;CACtB,QAAQ,UAAU,OAAO,MAAM;CAC/B,QAAQ,UAAU,IAAI,OAAO,SAAS;CACtC,OAAO;;AAGT,SAAS,kBACP,SACA,KACqB;CACrB,KAAK,MAAM,YAAY,QAAQ,UAAU,QAAQ,EAC/C,IAAI,SAAS,OAAO,OAAO,QAAQ,KACjC,OAAO,YAAY,SAAS,SAAS,MAAM;CAG/C,OAAO;;AAGT,SAAS,YACP,SACA,QACA,MACA,OACA,MACA,OACc;CACd,MAAM,WAAW,kBAAkB,SAAS,OAAO,OAAO,IAAI;CAC9D,IAAI,UAAU;EACZ,SAAS,OAAO,KAAK,MAAM,GAAG,wBAAwB;EACtD,SAAS,QAAQ;EACjB,OAAO;;CAGT,IAAI,QAAQ,UAAU,QAAQ,eAAe;EAC3C,MAAM,cAAc,QAAQ,UAAU,MAAM,CAAC,MAAM,CAAC;EACpD,IAAI,aAAa,QAAQ,UAAU,OAAO,YAAY;;CAGxD,MAAM,WAAW;EACf,OAAO,OAAO,KAAK,MAAM;EACzB;EACA,MAAM,KAAK,MAAM,GAAG,wBAAwB;EAC5C;EACD;CACD,QAAQ,UAAU,IAAI,SAAS,OAAO,SAAS;CAC/C,OAAO;;AAGT,SAAS,eAAe,UAAwB,QAAyB;CACvE,MAAM,QAAQ,SAAS,KAAK,MAAM,KAAK;CACvC,MAAM,QACJ,WAAW,KAAA,IAAY,IACrB,KAAK,IAAI,GAAG,KAAK,IAAI,QAAQ,MAAM,SAAS,EAAE,GAAG,GAAG;CAExD,MAAM,MACJ,WAAW,KAAA,IAAY,MAAM,SAAS,KAAK,IAAI,MAAM,QAAQ,QAAQ,GAAG;CAC1E,MAAM,WAAW,MACd,MAAM,OAAO,IAAI,CACjB,KAAK,MAAM,UAAU,IAAI,QAAQ,MAAM,IAAI,OAAO,CAClD,KAAK,KAAK;CACb,MAAM,QAAQ,SAAS,MACpB,KACE,MAAM,UACL,IAAI,MAAM,IAAI,KAAK,OAAO,MAAM,KAAK,KAAK,OAAO,IAAI,IAAI,KAAK,OAAO,OAAO,GAC/E,CACA,KAAK,KAAK;CAEb,OAAO;EACL,QAAQ,SAAS,MAAM,IAAI,SAAS,OAAO,OAAO,IAAI;EACtD;EACA,QAAQ,WAAW,UAAU;EAC9B,CACE,OAAO,QAAQ,CACf,KAAK,KAAK;;AAGf,SAAS,eACP,UACA,SACe;CACf,MAAM,oBAAoB,QAAQ,aAAa;CAC/C,MAAM,UAAU,SAAS,KACtB,MAAM,KAAK,CACX,KAAK,MAAM,WAAW;EAAE;EAAM;EAAO,EAAE,CACvC,QAAQ,EAAE,WAAW,KAAK,aAAa,CAAC,SAAS,kBAAkB,CAAC,CACpE,MAAM,GAAG,GAAG;CACf,IAAI,QAAQ,WAAW,GAAG,OAAO;CAEjC,OAAO,CACL,oBAAoB,KAAK,UAAU,QAAQ,CAAC,MAAM,SAAS,MAAM,IACjE,GAAG,QAAQ,KAAK,EAAE,MAAM,YAAY,IAAI,MAAM,IAAI,OAAO,CAC1D,CAAC,KAAK,KAAK;;AAGd,SAAS,WAAW,WAAmB,KAAqB;CAE1D,MAAM,iBADY,UAAU,WAAW,IAAI,GAAG,IAAI,OAG7C,OAAO,SAAS,UAAU,MAAM,GAAG,EAAE,EAAE,GAAG,GAAG,KAC5C,OAAO,SAAS,UAAU,MAAM,GAAG,EAAE,EAAE,GAAG;CAEhD,OAAO,cAAc,UAAU,IADd,IAAI,KAAK,MAAM,gBAAgB,IAAO,CAAC,aACb,CAAC,MAAM,GAAG,GAAG,CAAC,QAAQ,KAAK,IAAI;;AAG5E,SAAS,iBACP,YACA,gBACQ;CACR,OAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA,8BAA8B,kBAAkB,SAAS;EACzD,gBAAgB,KAAK,UAAU,YAAY,MAAM,EAAE;EACpD,CAAC,KAAK,KAAK;;AAGd,SAAS,qBAAqB,OAAuB;CACnD,OAAO,aAAa,KAAK,UAAU,MAAM,CAAC;;AAG5C,SAASC,iBAAe,GAAY,SAA2B;CAC7D,OAAO,EAAE,KACP,EACE,OAAO;EACL;EACA,MAAM;EACP,EACF,EACD,IACD;;AAGH,SAAS,2BACP,SACA,MACsB;CACtB,OAAO;EACL;EACA;EACA,QAAQ,EAAE;EACV,UAAU,EAAE;EACZ,kCAAkB,IAAI,KAAK;EAC3B,kBAAkB,EAAE;EACpB,aAAa,EAAE;EAChB;;AAGH,SAAS,cACP,OACA,WACM;CACN,MAAM,iBAAiB,IAAI,UAAU,OAAO,KAAK,UAAU;;AAG7D,SAAS,UACP,OACA,MACA,QACA,UAAgC,EAAE,EAC5B;CACN,MAAM,iBAAiB,KAAK;EAC1B,WAAW;EACX,KAAK,OAAO,OAAO;EACnB,GAAI,QAAQ,WAAW,KAAA,IAAY,EAAE,GAAG,EAAE,QAAQ,QAAQ,QAAQ;EAClE,GAAI,QAAQ,YAAY,KAAA,IAAY,EAAE,GAAG,EAAE,SAAS,QAAQ,SAAS;EACtE,CAAC;CACF,MAAM,YAAY,KAAK;EAAE;EAAM;EAAQ,GAAG;EAAS,CAAC;CACpD,cAAc,OAAO,OAAO;;AAG9B,SAAS,sBACP,UACA,OACM;CACN,KAAK,MAAM,WAAW,SAAS,gBAAgB,EAAE,EAC/C,MAAM,iBAAiB,KAAK;EAAE,GAAG;EAAS,WAAW;EAAgB,CAAC;;AAI1E,SAAS,oBACP,UACA,OACM;CACN,KAAK,MAAM,WAAW,SAAS,QAAQ,EAAE,EAAE;EACzC,MAAM,iBAAiB,YAAY,MAAM,SAAS,QAAQ,OAAO;EACjE,IAAI,gBAAgB;GAClB,MAAM,OAAO,KAAK,eAAe,gBAAgB,QAAQ,OAAO,CAAC;GACjE,cAAc,OAAO,eAAe,OAAO;GAC3C;;EAGF,MAAM,SAAS,oBACb,MAAM,SACN,QAAQ,QACR,MAAM,KACP;EACD,IAAI,CAAC,QAAQ;GACX,MAAM,OAAO,KAAK,qBAAqB,QAAQ,OAAO,CAAC;GACvD;;EAEF,MAAM,SAAS,kBAAkB,MAAM,SAAS,OAAO,OAAO,IAAI;EAClE,IAAI,QAAQ;GACV,MAAM,OAAO,KAAK,eAAe,QAAQ,QAAQ,OAAO,CAAC;GACzD,cAAc,OAAO,OAAO;GAC5B;;EAEF,UAAU,OAAO,QAAQ,QAAQ,EAAE,QAAQ,QAAQ,QAAQ,CAAC;;;AAIhE,SAAS,qBACP,UACA,OACM;CACN,KAAK,MAAM,WAAW,SAAS,SAAS,EAAE,EAAE;EAE1C,MAAM,SADS,YAAY,MAAM,SAAS,QAAQ,OAC7B,EAAE,MAAM,QAAQ;EACrC,IAAI,CAAC,QAAQ;GACX,MAAM,OAAO,KACX,qBAAqB,GAAG,QAAQ,OAAO,QAAQ,QAAQ,KAAK,CAC7D;GACD;;EAEF,MAAM,SAAS,kBAAkB,MAAM,SAAS,OAAO,OAAO,IAAI;EAClE,IAAI,QAAQ;GACV,MAAM,OAAO,KAAK,eAAe,OAAO,CAAC;GACzC,cAAc,OAAO,OAAO;GAC5B;;EAEF,UAAU,OAAO,QAAQ,OAAO;;;AAIpC,SAAS,oBACP,UACA,OACM;CACN,KAAK,MAAM,WAAW,SAAS,QAAQ,EAAE,EAAE;EACzC,MAAM,iBAAiB,YAAY,MAAM,SAAS,QAAQ,OAAO;EACjE,MAAM,SACJ,gBAAgB,UACb,oBAAoB,MAAM,SAAS,QAAQ,QAAQ,MAAM,KAAK;EACnE,IAAI,CAAC,QAAQ;GACX,MAAM,OAAO,KAAK,qBAAqB,QAAQ,OAAO,CAAC;GACvD;;EAEF,MAAM,WACJ,kBAAkB,kBAAkB,MAAM,SAAS,OAAO,OAAO,IAAI;EACvE,MAAM,cACJ,WAAW,eAAe,UAAU,QAAQ,QAAQ,GAAG;EACzD,IAAI,aAAa;GACf,MAAM,OAAO,KAAK,YAAY;GAC9B,cAAc,OAAO,OAAO;GAC5B;;EAEF,UAAU,OAAO,QAAQ,QAAQ,EAAE,SAAS,QAAQ,SAAS,CAAC;;;AAIlE,SAAS,0BACP,UACA,OACA,KACM;CACN,KAAK,MAAM,WAAW,SAAS,WAAW,EAAE,EAC1C,MAAM,iBAAiB,KAAK;EAAE,GAAG;EAAS,WAAW;EAAW,CAAC;CAEnE,KAAK,MAAM,WAAW,SAAS,WAAW,EAAE,EAC1C,MAAM,iBAAiB,KAAK;EAAE,GAAG;EAAS,WAAW;EAAW,CAAC;CAEnE,KAAK,MAAM,WAAW,SAAS,UAAU,EAAE,EACzC,MAAM,iBAAiB,KAAK;EAAE,GAAG;EAAS,WAAW;EAAU,CAAC;CAElE,KAAK,MAAM,WAAW,SAAS,QAAQ,EAAE,EACvC,MAAM,OAAO,KAAK,WAAW,QAAQ,YAAY,IAAI,CAAC;;AAI1D,SAAS,2BACP,UACA,OACM;CACN,KAAK,MAAM,eAAe,OAAO,KAAK,SAAS,EAC7C,IAAI,CAAC,eAAe,IAAI,YAAY,EAClC,MAAM,SAAS,KACb,6CAA6C,YAAY,gCAC1D;;AAKP,SAAS,yBACP,UACA,OACA,KACM;CACN,sBAAsB,UAAU,MAAM;CACtC,KAAK,SAAS,aAAa,UAAU,KAAK,GACxC,MAAM,SAAS,KAAK,kBAAkB;CAExC,oBAAoB,UAAU,MAAM;CACpC,qBAAqB,UAAU,MAAM;CACrC,oBAAoB,UAAU,MAAM;CACpC,KAAK,SAAS,YAAY,UAAU,KAAK,GACvC,MAAM,SAAS,KAAK,uBAAuB;CAE7C,0BAA0B,UAAU,OAAO,IAAI;CAC/C,2BAA2B,UAAU,MAAM;;AAG7C,SAAS,mBAAmB,SAAsC;CAChE,MAAM,oBAAoB,QAAQ,UAAU;CAC5C,OACE,sBAAsB,KAAA,KACnB,sBAAsB,QACtB,sBAAsB;;AAI7B,SAAS,qBACP,SACA,OACM;CACN,IAAI,MAAM,iBAAiB,WAAW,KAAK,mBAAmB,QAAQ,EAAE;CACxE,MAAM,SAAS,KACb,iFAAiF,KAAK,UAAU,QAAQ,UAAU,oBAAoB,CAAC,0DACxI;;AAGH,SAAS,8BACP,SACA,OACS;CACT,OAAO,MAAM,iBAAiB,SAAS,KAAK,mBAAmB,QAAQ;;AAGzE,eAAe,mBACb,GACA,SACA,UACuC;CACvC,MAAM,QACJ,WACE,QAAQ,QACR,iCAAiC,mBAAmB,QAAQ,MAAM;CACtE,IAAI,UAAU;EACZ,MAAM,iBACJ,MAAM,iCAAiC,sBAAsB,SAAS;EACxE,IAAI,CAAC,gBACH,OAAO,EAAE,KACP,EACE,OAAO;GACL,SAAS,aAAa,SAAS;GAC/B,MAAM;GACP,EACF,EACD,IACD;EAGH,IACE,iCAAiC,6BAC/B,gBACA,MACD,KAAK,oBAEN,OAAOA,iBACL,GACA,aAAa,SAAS,yEACvB;EAGH,OAAO;GAAE;GAAO;GAAgB;;CAKlC,IAAI,CADF,iCAAiC,kBAAkB,MACnC,EAAE,qBAAqB,SAAS,aAAa,EAC7D,OAAOA,iBACL,GACA,UAAU,MAAM,6EACjB;CAEH,OAAO,EAAE,OAAO;;AAGlB,SAAS,6BACP,SACA,OACA,aACkB;CAClB,OAAO;EACL;EACA,OAAO;EACP,OAAO,CACL,4BAA4B;GAC1B,gBAAgB,QAAQ,UAAU,SAAS;GAC3C,gBAAgB,QAAQ,UAAU,SAAS;GAC3C,cAAc,QAAQ,UAAU;GAChC,mBAAmB,QAAQ,UAAU;GACtC,CAAC,CACH;EACD,aAAa;EACb,OAAO;EACP,QAAQ;EACR,SAAS,CAAC,iCAAiC;EAC3C,WAAW,QAAQ;EACnB,mBAAmB,QAAQ;EAC5B;;AAGH,eAAe,sBACb,GACA,gBACA,SACA,OACA,WAC0B;CAC1B,UAAUF,WAAQ,4CAA4C;EAC5D;EACA,UAAU,eAAe;EAC1B,CAAC;CACF,MAAM,mBAAmB,MAAM,yBAC7B,gBACA,SACA,EAAE,IAAI,IAAI,SACV,EAAE,QAAQ,EAAE,IAAI,IAAI,QAAQ,CAC7B;CACD,IAAI,CAAC,iBAAiB,IACpB,MAAM,IAAI,UACR,oBAAoB,eAAe,KAAK,8BACxC,iBACD;CAEH,MAAM,SAAU,MAAM,iBAAiB,MAAM;CAC7C,UAAUA,WAAQ,2CAA2C;EAC3D,UAAU,eAAe;EACzB;EACD,CAAC;CACF,iCAAiC;EAC/B,UAAU;EACV,mBAAmB;EACnB;EACA,SAAS,eAAe,SAAS,QAAQ;EACzC,iBAAiB,eAAe;EAChC,cAAc,eAAe;EAC7B;EACD,CAAC,CAAC,wBAAwB,OAAO,MAAM,CAAC;CACzC,OAAO;;AAGT,eAAe,qBACb,SACA,OACA,WACA,WACA,QAC0B;CAC1B,UAAUA,WAAQ,2CAA2C,QAAQ;CACrE,MAAM,SAAU,MAAM,iCAAiC,gBACrD,SACA;EACE,QAAQ;EACR,WAAW;EACX,WAAW;EACX;EACA;EACA;EACD,CACF;CACD,UAAUA,WAAQ,0CAA0C,OAAO;CAEnE,iCAAiC,oBAC/B,OACA,UACD,CAAC;EACA,GAAG,wBAAwB,OAAO,MAAM;EACxC,gBAAgB,uBACd,OAAO,eAAe,eACvB;EACF,CAAC;CACF,OAAO;;AAGT,eAAe,oBACb,GACA,SACA,OACA,QAC0B;CAC1B,MAAM,cAAc,iBAClB,MAAM,kBACN,QAAQ,UAAU,gBACnB;CACD,MAAM,YAAY,QAAQ,QAAQ,GAAG;CACrC,MAAM,YAAY,6BAChB,EAAE,UAAU,GAAG,MAAM,KAAK,OAAO,GAAG,eAAe,EACnD,UACD;CACD,MAAM,UAAU,6BACd,SACA,OAAO,OACP,YACD;CAED,IAAI,OAAO,gBACT,OAAO,MAAM,sBACX,GACA,OAAO,gBACP,SACA,OAAO,OACP,UACD;CAGH,OAAO,MAAM,qBACX,SACA,OAAO,OACP,WACA,WACA,EAAE,IAAI,IAAI,OACX;;AAGH,SAAS,0BACP,SACA,YACqB;CACrB,OAAO,WAAW,QACf,cACC,QAAQ,eAAe,IAAI,UAAU,OAAO,OAAO,KAAK,UAC3D;;AAGH,SAAS,mBACP,OACA,QACA,oBACA,kBACqB;CACrB,OAAO,CACL,GAAG,IAAI,IACL,CACE,GAAG,oBACH,GAAG,0BAA0B,MAAM,SAAS,iBAAiB,CAC9D,CACE,QACE,cACC,UAAU,OAAO,QAAQ,OAAO,OAAO,OACpC,MAAM,QAAQ,eAAe,IAAI,UAAU,OAAO,OAAO,KACtD,UACT,CACA,KAAK,cAAc,CAAC,UAAU,OAAO,KAAK,UAAU,CAAU,CAClE,CAAC,QAAQ,CACX;;AAGH,SAAS,mBACP,OACA,YACA,oBACA,kBACM;CACN,KAAK,MAAM,CAAC,OAAO,SAAS,MAAM,YAAY,SAAS,EAAE;EACvD,MAAM,SACJ,gBACE,MAAM,SACN;GACE,KAAK,KAAK,OAAO,OAAO;GACxB,OAAO,KAAK,OAAO,OAAO;GAC1B,SAAS;GACV,EACD,MAAM,KACP,IAAI,KAAK;EACZ,cAAc,OAAO,OAAO;EAC5B,MAAM,gBAAgB,mBACpB,OACA,QACA,oBACA,iBACD;EAED,IAAI,KAAK,SAAS,QAAQ;GACxB,MAAM,OAAO,KACX,oBAAoB,KAAK,UAAU,KAAK,WAAW,GAAG,CAAC,MAAM,OAAO,OAAO,IAAI,KAAK,aACrF;GACD,IAAI,CAAC,kBAAkB,MAAM,SAAS,OAAO,OAAO,IAAI,EACtD,YACE,MAAM,SACN,QACA,MAAM,KAAK,QACX,OACA,YACA,cACD;GAEH;;EAGF,MAAM,WAAW,YACf,MAAM,SACN,QACA,MAAM,KAAK,QACX,OACA,YACA,cACD;EACD,MAAM,OAAO,KAAK,eAAe,UAAU,KAAK,OAAO,CAAC;;;AAI5D,SAAS,oBACP,OACA,YACM;CACN,IAAI,WAAW,WAAW,GAAG;CAC7B,MAAM,OAAO,KACX,CACE,YACA,GAAG,WAAW,KACX,cACC,MAAM,UAAU,OAAO,OAAO,IAAI,UAAU,OAAO,MAAM,KAAK,UAAU,OAAO,MAClF,CACF,CAAC,KAAK,KAAK,CACb;;AAGH,SAAS,oBACP,QACA,OACM;CACN,MAAM,YAAY,uBAAuB,OAAO;CAChD,MAAM,eAAe,UAAU,QAAQ,QACpC,WAAW,OAAO,YAAY,KAAA,EAChC;CACD,MAAM,kBACJ,aAAa,SAAS,IAAI,eAAe,UAAU;CACrD,QAAQ,IACN,8BAA8B,CAC5B,GAAG,IAAI,IACL,MAAM,iBAAiB,KACpB,oBAAoB,gBAAgB,UACtC,CACF,CACF,CAAC,KACA,IACD,CAAC,WAAW,KAAK,UAAU,UAAU,QAAQ,CAAC,WAAW,gBAAgB,SAC3E;CAED,MAAM,mBAAmB,gBACtB,KAAK,WAAW,gBAAgB,MAAM,SAAS,QAAQ,MAAM,KAAK,CAAC,CACnE,QAAQ,cAAyC,QAAQ,UAAU,CAAC;CACvE,KAAK,MAAM,aAAa,0BACtB,MAAM,SACN,iBACD,EACC,cAAc,OAAO,UAAU;CAGjC,MAAM,aACJ,UAAU,cAAc;CAC1B,MAAM,qBACJ,MAAM,YAAY,WAAW,IAC3B,EAAE,GACF,uBAAuB,WAAW,CAC/B,KAAK,WAAW,gBAAgB,MAAM,SAAS,QAAQ,MAAM,KAAK,CAAC,CACnE,QAAQ,cAAyC,QAAQ,UAAU,CAAC;CAC3E,KAAK,MAAM,aAAa,oBAAoB,cAAc,OAAO,UAAU;CAC3E,IAAI,MAAM,YAAY,WAAW,GAAG,MAAM,OAAO,KAAK,WAAW;CAEjE,mBAAmB,OAAO,YAAY,oBAAoB,iBAAiB;CAC3E,oBACE,OACA,0BAA0B,MAAM,SAAS,iBAAiB,CAC3D;;AAGH,eAAe,wBACb,GACA,SACA,OACA,UAC0B;CAC1B,MAAM,SAAS,MAAM,mBAAmB,GAAG,SAAS,SAAS;CAC7D,IAAI,kBAAkB,UAAU,OAAO;CAEvC,oBAAoB,MADC,oBAAoB,GAAG,SAAS,OAAO,OAAO,EACvC,MAAM;CAClC,OAAO;;AAGT,SAAS,yBACP,OACqB;CACrB,MAAM,OAAO,KAAK,GAAG,MAAM,SAAS;CACpC,IAAI,MAAM,OAAO,WAAW,GAC1B,MAAM,OAAO,KAAK,iDAAiD;CAGrE,OAAO;EACL,kBAAkB;EAClB,QAAQ,MAAM,OAAO,KAAK,OAAO;EACjC,SAAS,CAAC,GAAG,MAAM,iBAAiB,QAAQ,CAAC,CAC1C,QACE,cACC,MAAM,QAAQ,eAAe,IAAI,UAAU,OAAO,OAAO,KACrD,UACP,CACA,KAAK,EAAE,aAAa,OAAO;EAC/B;;AAGH,eAAsB,2BACpB,GACA,SACmB;CACnB,MAAM,SAAS,yBAAyB,UAAU,QAAQ,QAAQ;CAClE,IAAI,CAAC,OAAO,SAAS;EACnB,MAAM,QAAQ,OAAO,MAAM,OAAO;EAElC,OAAOE,iBACL,GACA,mCAHW,OAAO,KAAK,KAAK,IAAI,IAAI,OAGI,IAAI,OAAO,WAAW,kBAC/D;;CAEH,MAAM,UAAU,OAAO;CACvB,MAAM,MAAM,iCAAiC,KAAK;CAClD,MAAM,cAAc,eAAe,QAAQ,IAAI,IAAI;CACnD,MAAM,UAAU,YAAY;CAK5B,MAAM,QAAQ,2BAA2B,SAAS;EAHhD,QAAQ,YAAY;EACpB,oBAAoB;EAEgC,CAAC;CAEvD,yBADiB,QAAQ,YAAY,EAAE,EACJ,OAAO,IAAI;CAE9C,qBAAqB,SAAS,MAAM;CAEpC,IAAI,8BAA8B,SAAS,MAAM,EAAE;EACjD,MAAM,iBAAiB,MAAM,wBAC3B,GACA,SACA,OACA,QAAQ,SACT;EACD,IAAI,gBAAgB,OAAO;;CAG7B,OAAO,EAAE,KAAK,yBAAyB,MAAM,CAAC;;;;ACz/BhD,MAAM,yBAAyB,GAAG,mBAAmB;AAErD,SAAgB,2BAA2B,YAA4B;CACrE,MAAM,cAAc,IAAI,IAAI,uBAAuB;CACnD,YAAY,SAAS,IAAI,IAAI,YAAY,mBAAmB,CAAC;CAC7D,OAAO,YAAY,UAAU;;AAG/B,eAAsB,wBACpB,SACmB;CACnB,MAAM,UAAU,yBAAyB,QAAQ,QAAQ;CACzD,IAAI,CAAC,QAAQ,IAAI,SAAS,EACxB,QAAQ,IAAI,UAAU,mBAAmB;CAG3C,MAAM,OAAO,MAAM,QAAQ,aAAa;CACxC,IAAI,CAAC,QAAQ,IAAI,eAAe,EAC9B,QAAQ,IAAI,gBAAgB,mBAAmB;CAGjD,OAAO,MAAM,MAAM,2BAA2B,QAAQ,IAAI,EAAE;EAC1D,QAAQ;EACR;EACA;EACD,CAAC;;;;ACJJ,MAAMC,YAAS,oBAAoB,uBAAuB;AAE1D,MAAa,oBAAoB,IAAI,MAAM;AAE3C,MAAa,+BAA+B;CAC1C;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AAED,SAAS,eAAkB,MAA0B;CACnD,IAAI;EACF,OAAO,KAAK,MAAM,KAAK;SACjB;EACN,OAAO;;;AAIX,eAAe,+BACb,SACmB;CACnB,MAAM,eAAeA,WAAQ,8BAA8B,aAAa,EACtE,MAAM,eAAmC,MAAM,QAAQ,OAAO,CAAC,MAAM,CAAC,EACvE,EAAE;CAEH,MAAM,mBACJ,MAAM,6BAA6B,wBAAwB,QAAQ;CACrE,MAAM,eAAeA,WAAQ,+BAA+B,aAAa;EACvE,MAAM,eACJ,MAAM,iBAAiB,OAAO,CAAC,MAAM,CACtC;EACD,YAAY,iBAAiB;EAC9B,EAAE;CACH,OAAO,4BAA4B,iBAAiB;;AAGtD,SAAS,yBACP,SACA,SACS;CAKT,OAAO,IAAI,QAAQ,QAAQ,KAAK;EAC9B,MAAM,KAAK,UAAU,QAAQ;EAC7B,SAAS,QAAQ;EACjB,QAAQ,QAAQ;EAChB,QAAQ,QAAQ;EACjB,CAAC;;AAGJ,eAAe,mBACb,GACA,SACA,wBACmB;CAInB,IAAI,EAFF,0BACI,MAAM,6BAA6B,sBAAsB,QAAQ,GAErE,OAAO,EAAE,KACP,EACE,OAAO;EACL,SAAS;EACT,MAAM;EACP,EACF,EACD,IACD;CAGH,OAAO,MAAM,+BAA+B,QAAQ;;AAGtD,SAAS,eAAe,GAAY,SAA2B;CAC7D,OAAO,EAAE,KACP,EACE,OAAO;EACL;EACA,MAAM;EACP,EACF,EACD,IACD;;AAGH,eAAe,qBACb,GACwC;CACxC,IAAI;CACJ,IAAI;EACF,OAAO,MAAM,EAAE,IAAI,IAAI,OAAO,CAAC,MAAM;SAC/B;EACN,OAAO,eAAe,GAAG,mDAAmD;;CAI9E,IAAI,OADW,MAAoC,UAC9B,UACnB,OAAO,eACL,GACA,uDACD;CAEH,OAAO;;;;;;;AAQT,eAAsB,yBACpB,GACA,wBACmB;CACnB,IAAI,wBACF,OAAO,MAAM,mBAAmB,GAAG,EAAE,IAAI,KAAK,uBAAuB;CAGvE,MAAM,UAAU,MAAM,qBAAqB,EAAE;CAC7C,IAAI,mBAAmB,UAAU,OAAO;CAExC,MAAM,iBAAiB,QAAQ;CAE/B,QAAQ,QACN,6BAA6B,mBAAmB,eAAe;CACjE,IAAI,QAAQ,UAAU,gBACpB,QAAQ,MACN,2BAA2B,eAAe,MAAM,QAAQ,QACzD;CAGH,MAAM,yBAAyB,QAAQ;CACvC,IAAI,qBAAqB,wBAAwB,QAAQ,MAAM;CAC/D,IAAI,oBAAoB;EACtB,QAAQ,QAAQ,mBAAmB;EACnC,IAAI,mBAAmB,aAAa,SAClC,OAAO,MAAM,mBACX,GACA,yBAAyB,EAAE,IAAI,KAAK,QAAQ,CAC7C;;CAIL,IAAI,6BAA6B,mCAAmC;MAG9D,MADI,6BAA6B,sBAAsB,QAAQ,EAC1C;GACvB,IAAI,CAAC,QAAQ,MAAM,WAAW,MAAM,EAClC,QAAQ,QAAQ;GAElB,OAAO,MAAM,+BACX,yBAAyB,EAAE,IAAI,KAAK,QAAQ,CAC7C;;;CAIL,MAAM,sBAAsB,MAAM,sBAChC,uBACD;CACD,IAAI,qBAAqB;EACvB,MAAM,cAAc,6BAA6B,qBAAqB;EACtE,IAAI,CAAC,aACH,OAAO,eACL,GACA,qGACD;EAEH,MAAM,sBACJ,6BAA6B,mBAAmB,YAAY;EAC9D,IAAI,CAAE,MAAM,uBAAuB,oBAAoB,EACrD,OAAO,eACL,GACA,gCAAgC,YAAY,qEAC7C;EAEH,QAAQ,MACN,kCAAkC,uBAAuB,MAAM,sBAChE;EACD,QAAQ,QAAQ;EAChB,qBAAqB,wBAAwB,QAAQ,MAAM;EAC3D,IAAI,oBAAoB;GACtB,QAAQ,QAAQ,mBAAmB;GACnC,IAAI,mBAAmB,aAAa,SAClC,OAAO,MAAM,mBACX,GACA,yBAAyB,EAAE,IAAI,KAAK,QAAQ,CAC7C;;;CAIP,MAAM,yBACJ,sBAAsB,QAAQ,QAAQ;CAExC,IAAI;MAME,MAJI,mCACJ,oBACA,6BAA6B,sBAC9B,EAED,OAAO,MAAM,6BAA6B,2BAA2B,GAAG;GACtE,UAAU,mBAAmB;GAC7B,SAAS;GACV,CAAC;;CAIN,OAAO,MAAM,6BAA6B,2BAA2B,GAAG,EACtE,SAAS;EACP,GAAG;EACH,OAAO;EACR,EACF,CAAC;;AAGJ,eAAe,sBAAsB,OAAiC;CACpE,MAAM,gBAAgB,wBAAwB,MAAM;CACpD,IAAI,eAAe;EACjB,MAAM,iBACJ,MAAM,6BAA6B,sBACjC,cAAc,SACf;EACH,IAAI,CAAC,gBAAgB,OAAO;EAC5B,MAAM,gBACJ,6BAA6B,6BAC3B,gBACA,cAAc,MACf;EACH,OACE,kBAAkB,eAAe,kBAAkB;;CAIvD,MAAM,YACJ,6BAA6B,kBAAkB,MAAM,EAAE,uBACpD,EAAE;CACP,QACG,UAAU,SAAS,eAAe,IAC9B,UAAU,SAAS,oBAAoB,KACzC,CAAC,UAAU,SAAS,aAAa,IACjC,CAAC,UAAU,SAAS,gBAAgB;;AAI3C,eAAe,uBAAuB,OAAiC;CACrE,MAAM,gBAAgB,wBAAwB,MAAM;CACpD,IAAI,eAAe;EACjB,MAAM,iBACJ,MAAM,6BAA6B,sBACjC,cAAc,SACf;EACH,OACE,mBAAmB,QAChB,6BAA6B,6BAC9B,gBACA,cAAc,MACf,KAAK;;CAIV,MAAM,YACJ,6BAA6B,kBAAkB,MAAM,EAAE,uBACpD,EAAE;CACP,OAAO,UAAU,SAAS,aAAa,IAAI,UAAU,SAAS,gBAAgB;;AAGhF,kBAAkB,KAAK,KAAK,OAAO,MAAM;CACvC,IAAI;EACF,OAAO,MAAM,yBAAyB,EAAE;UACjC,OAAO;EACd,UAAO,MAAM,sBAAsB,EAAE,OAAO,CAAC;EAC7C,OAAO,MAAM,aAAa,GAAG,MAAM;;EAErC;;;AC/SF,MAAM,+CAA+C;AACrD,MAAM,0CAA0C,EAC9C,MAAM,aACP;AACD,MAAM,wCAAwC,IAAI,IAAqB;CACrE;CACA;CACA;CACA;CACD,CAAC;AAEF,MAAa,6BACX,mBAEA,eAAe,SAAS,eACrB,eAAe,QAAQ,SAAS,eAAe;AAEpD,MAAa,yCACX,SACA,mBACS;CACT,IAAI,CAAC,0BAA0B,eAAe,EAC5C;CAGF,IAAI,CAAC,OAAO,OAAO,SAAS,oBAAoB,EAC9C,QAAQ,oBAAoB;;AAIhC,MAAa,qCAAqC,YAGtC;CACV,IAAI,QAAQ,MAAM,SAAS,IAAI,EAC7B;CAEF,MAAM,iBAAiB,iCAAiC,QAAQ,SAAS;CACzE,KAAK,MAAM,gBAAgB,gBACzB,yBAAyB,QAAQ,SAAS,cAAc;;AAI5D,MAAM,oCACJ,aACkB;CAClB,MAAM,mBAAmB,SAAS,SAAS,SAAS,UAClD,6BAA6B,QAAQ,GAAG,CAAC,MAAM,GAAG,EAAE,CACrD;CACD,MAAM,gBAAgB,iBACnB,QAAQ,UAAU,SAAS,QAAQ,SAAS,SAAS,CACrD,MAAM,GAAG,EAAE;CACd,MAAM,eAAe,iBAClB,QAAQ,UAAU,SAAS,QAAQ,SAAS,SAAS,CACrD,MAAM,GAAG;CACZ,OAAOC,gBAAc,CAAC,GAAG,eAAe,GAAG,aAAa,CAAC,CAAC,MACvD,GAAG,MAAM,IAAI,EACf;;AAGH,MAAMA,mBAAiB,YACrB,CAAC,GAAG,IAAI,IAAI,QAAQ,CAAC,CAAC,MAAM,GAAG,6CAA6C;AAE9E,MAAM,gCAAgC,YAA8B;CAClE,IAAI,CAAC,sCAAsC,IAAI,QAAQ,KAAK,EAC1D,OAAO;CAGT,IAAI,OAAO,QAAQ,YAAY,UAC7B,OAAO,QAAQ,QAAQ,SAAS;CAGlC,OAAO,MAAM,QAAQ,QAAQ,QAAQ,IAAI,QAAQ,QAAQ,SAAS;;AAGpE,MAAM,4BAA4B,YAAuC;CACvE,IAAI,CAAC,SACH;CAGF,IAAI,OAAO,QAAQ,YAAY,UAAU;EACvC,QAAQ,UAAU,CAChB;GACE,MAAM;GACN,MAAM,QAAQ;GACd,eAAe,EAAE,GAAG,yCAAyC;GAC9D,CACF;EACD;;CAGF,IAAI,CAAC,MAAM,QAAQ,QAAQ,QAAQ,EACjC;CAGF,MAAM,WAAW,QAAQ,QAAQ,GAAG,GAAG;CACvC,IAAI,CAAC,UACH;CAEF,uBAAuB,SAAS;;AAGlC,MAAM,0BAA0B,SAA4B;CAC1D,KAAK,gBAAgB,EAAE,GAAG,yCAAyC;;;;AClGrE,MAAM,0BAA2D;CAC/D;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AAED,MAAM,0BAA+C,IAAI,IACvD,wBACD;AAOD,MAAM,2BAAqE;CACzE,SAAS;CACT,OAAO;CACR;AAED,MAAM,uBAAuB,WAC3B,wBAAwB,QAAQ,OAAO;;;;;;;;;;;;;;;;;AAkBzC,MAAa,mCACX,iBACA,qBACyC;CACzC,MAAM,aAAa,oBAAoB,EAAE,EAAE,QACxC,WACC,wBAAwB,IAAI,OAAO,CACtC;CACD,MAAM,sBACJ,wBAAwB,IAAI,gBAAgB,GACzC,kBACD,KAAA;CACJ,IAAI,UAAU,WAAW,GACvB,OAAO,uBAAuB,yBAAyB;CAEzD,IAAI,uBAAuB,UAAU,SAAS,oBAAoB,EAChE,OAAO;CAGT,MAAM,gBACJ,yBAAyB,oBAAoB;CAC/C,IAAI,CAAC,eACH;CAEF,IAAI,UAAU,SAAS,cAAc,EACnC,OAAO;CAGT,MAAM,gBAAgB,oBAAoB,cAAc;CACxD,IAAI;CACJ,KAAK,MAAM,UAAU,WACnB,IACE,oBAAoB,OAAO,IAAI,kBAC3B,iBAAiB,KAAA,KAChB,oBAAoB,OAAO,GAAG,oBAAoB,aAAa,GAEpE,eAAe;CAGnB,IAAI,cACF,OAAO;CAGT,OAAO,UAAU,QAAQ,QAAQ,WAC/B,oBAAoB,OAAO,GAAG,oBAAoB,OAAO,GAAG,SAAS,OACtE;;;;AClFH,MAAa,sBACX,SACA,gBACS;CACT,QAAQ,gBAAgB,aAAa;CACrC,QAAQ,UAAU,aAAa;CAC/B,QAAQ,UAAU,aAAa;;AAGjC,MAAa,yBACX,SACA,YACS;CACT,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,QAAQ,aAAa,EAAE,CAAC,EAChE,IAAI,CAAC,OAAO,OAAO,SAAS,IAAI,EAC9B,QAAQ,OAAO;;AAKrB,MAAa,6CACX,SACA,mBAC+D;CAC/D,IAAI,CAAC,QAAQ,aAAa,OAAO,QAAQ,UAAU,WAAW,UAC5D;CAGF,MAAM,cAAc,eAAe,SAAS,QAAQ;CACpD,MAAM,qBAAqB,6BAA6B,eACtD,eAAe,MACf,QAAQ,MACT;CACD,MAAM,oBAAoB,aAAa;CACvC,MAAM,mBACJ,qBAAqB,kBAAkB,SAAS,IAC9C,oBACA,oBAAoB;CAExB,MAAM,iBAAiB,gCACrB,QAAQ,UAAU,QAClB,iBACD;CACD,IAAI,CAAC,kBAAkB,mBAAmB,QAAQ,UAAU,QAC1D;CAGF,MAAM,kBAAkB,QAAQ,UAAU;CAC1C,QAAQ,UAAU,SAAS;CAC3B,OAAO;EAAE,MAAM;EAAiB,IAAI;EAAgB;;;;AC1BtD,MAAMC,YAAS,oBAAoB,oCAAoC;AAEvE,eAAsB,yCACpB,GACA,SAImB;CACnB,MAAM,EAAE,SAAS,aAAa;CAC9B,MAAM,iBAAiB,MAAM,sBAAsB,SAAS;CAC5D,IACE,CAAC,kBACE,6BAA6B,gBAAgB,QAAQ,MAAM,KACxD,qBAEN,OAAO,EAAE,KACP,EACE,OAAO;EACL,SAAS,aAAa,SAAS;EAC/B,MAAM;EACP,EACF,EACD,IACD;CAGH,MAAM,cAAc,eAAe,SAAS,QAAQ;CACpD,mBAAmB,SAAS,YAAY;CACxC,sBAAsB,SAAS,EAC7B,WAAW,aAAa,WACzB,CAAC;CACF,2BAA2B,QAAQ;CACnC,sCACE,SACA,eACD;CACD,0BAA0B,SAAS,aAAa,eAAe;CAE/D,UAAUA,WAAQ,qCAAqC;EACrD;EACA;EACD,CAAC;CAEF,MAAM,mBAAmB,MAAM,+BAC7B,gBACA,SACA,EAAE,IAAI,IAAI,QACX;CAED,IAAI,CAAC,iBAAiB,IAAI;EACxB,UAAO,MAAM,8CAA8C;GACzD;GACA,YAAY,iBAAiB;GAC9B,CAAC;EACF,MAAM,IAAI,UACR,oBAAoB,SAAS,oBAC7B,iBACD;;CAGH,MAAM,cAAc,2CAClB,SACA,UACA,aACA,eAAe,gBAChB;CACD,MAAM,cAAc,iBAAiB,QAAQ,IAAI,eAAe,IAAI;CAIpE,IAFE,QAAQ,QAAQ,OAAO,IAAI,YAAY,SAAS,oBAAoB,EAGpE,OAAO,8BAA8B,GAAG,kBAAkB;EACxD;EACA;EACD,CAAC;CAGJ,MAAM,eAAgB,MAAM,iBACzB,OAAO,CACP,MAAM;CACT,YAAY,qBAAqB,aAAa,MAAM,CAAC;CAErD,UAAUA,WAAQ,sCAAsC,aAAa;CACrE,OAAO,4BAA4B,iBAAiB;;AAGtD,MAAM,8BAA8B,YAA0C;CAC5E,IAAI,CAAC,QAAQ,QACX;CAGF,QAAQ,iBAAiB;EACvB,GAAI,QAAQ,kBAAkB,EAAE;EAChC,eAAe;EAChB;;AAGH,MAAM,6BACJ,SACA,aACA,mBACS;CACT,MAAM,sBAAsB,0BAA0B,eAAe;CAErE,IAD4B,aAAa,gBAAgB,qBAEvD,kCAAkC,QAAQ;;AAI9C,MAAM,8CACJ,SACA,UACA,aACA,oBAEA,iCAAiC;CAC/B,UAAU;CACV,OAAO,QAAQ;CACf,SAAS,aAAa;CACtB;CACA,cAAc;CACf,CAAC;AAEJ,MAAM,iCACJ,GACA,kBACA,YAIa;CACb,UAAO,MAAM,uCAAuC,EAClD,UAAU,QAAQ,UACnB,CAAC;CACF,OAAO,UAAU,GAAG,OAAO,WAAW;EACpC,IAAI,QAAqB,EAAE;EAE3B,IAAI;GACF,WAAW,MAAM,SAAS,OAAO,iBAAiB,EAAE;IAClD,UAAUA,WAAQ,0CAA0C,MAAM;IAClE,IAAI,MAAM,QAAQ,MAAM,SAAS,UAAU;KACzC,MAAM,cAAc,6BAA6B,MAAM,KAAK;KAC5D,IAAI,aAAa,OACf,QAAQ,qBAAqB,YAAY,MAAM;;IAInD,MAAM,OAAO,SAAS;KACpB,OAAO,MAAM;KACb,MAAM,MAAM,QAAQ;KACrB,CAAC;;YAEI;GACR,QAAQ,YAAY,MAAM;;GAE5B;;AAGJ,MAAM,gCACJ,SAC+B;CAC/B,IAAI;EACF,OAAO,KAAK,MAAM,KAAK;SACjB;EACN,OAAO;;;;;ACtLX,MAAa,wBAAwB,OACnC,SACA,YAMG;CACH,IAAI,CAAC,MAAM,cAAc,MAAM,IAAI,MAAM,0BAA0B;CAEnE,MAAM,eAAe,QAAQ,SAAS,MACnC,MACC,OAAO,EAAE,YAAY,YAClB,EAAE,SAAS,MAAM,MAAM,EAAE,SAAS,YAAY,CACpD;CAKD,IAAI,cAAc;CAClB,IAAI,QAAQ,SAAS,SAAS,GAAG;EAC/B,MAAM,cAAc,QAAQ,SAAS,GAAG,GAAG;EAC3C,IAAI,aACF,cAAc,CAAC,aAAa,OAAO,CAAC,SAAS,YAAY,KAAK;;CAKlE,MAAM,UAAkC;EACtC,GAAG,eAAe,OAAO,QAAQ,WAAW,aAAa;EACzD,eAAe,cAAc,UAAU;EACxC;CAED,0BACE,QAAQ,WACR,QAAQ,QAAQ,eAAe,EAC/B,QACD;CAED,kBAAkB,SAAS,QAAQ,YAAY;CAE/C,QAAQ,IAAI,cAAc,QAAQ,QAAQ;CAE1C,MAAM,WAAW,MAAM,MAAM,GAAG,eAAe,MAAM,CAAC,oBAAoB;EACxE,QAAQ;EACR;EACA,MAAM,KAAK,UAAU,QAAQ;EAC9B,CAAC;CAEF,qBAAqB,SAAS,QAAQ;CAEtC,IAAI,CAAC,SAAS,IAAI;EAChB,QAAQ,MAAM,qCAAqC,SAAS;EAC5D,MAAM,IAAI,UAAU,qCAAqC,SAAS;;CAGpE,IAAI,QAAQ,QACV,OAAO,OAAO,SAAS;CAGzB,OAAQ,MAAM,SAAS,MAAM;;;;ACzD/B,MAAMC,YAAS,oBAAoB,2BAA2B;AAE9D,eAAsBC,mBAAiB,GAAY;CACjD,IAAI,UAAU,MAAM,EAAE,IAAI,MAA8B;CACxD,MAAM,iBAAiB,QAAQ;CAC/B,QAAQ,QAAQ,mBAAmB,QAAQ,MAAM;CACjD,IAAI,QAAQ,UAAU,gBACpB,QAAQ,MACN,2BAA2B,eAAe,MAAM,QAAQ,QACzD;CAGH,MAAM,qBAAqB,MAAM,oCAC/B,QAAQ,MACT;CACD,IAAI,oBAAoB;EACtB,QAAQ,QAAQ,mBAAmB;EACnC,OAAO,MAAM,yCAAyC,GAAG;GACvD;GACA,UAAU,mBAAmB;GAC9B,CAAC;;CAGJ,UAAUD,WAAQ,oBAAoB,QAAQ;CAE9C,MAAM,gBAAgB,kBAAkB,QAAQ,MAAM;CACtD,QAAQ,QAAQ,eAAe,MAAM,QAAQ;CAE7C,IACE,UAAU,QAAQ,WAAW,IAC1B,UAAU,QAAQ,sBAAsB,EAC3C;EACA,UAAU;GACR,GAAG;GACH,YAAY,eAAe,aAAa,OAAO;GAChD;EACD,UAAUA,WAAQ,sBAAsB,QAAQ,WAAW;;CAG7D,IAAI,QAAQ,MAAM,SAAS,MAAM,EAAE;EACjC,IAAI,UAAU,QAAQ,sBAAsB,EAC1C,QAAQ,wBAAwB,QAAQ;EAE1C,OAAO,QAAQ;;CAIjB,MAAM,YAAY,6BAA6B,QAAQ;CACvD,UAAO,MAAM,yBAAyB,UAAU;CAEhD,MAAM,YAAY,QAAQ,UAAU;CACpC,UAAO,MAAM,yBAAyB,UAAU;CAChD,MAAM,cAAc,gCAAgC;EAClD,UAAU;EACV,mBAAmB;EACnB,OAAO,QAAQ;EAChB,CAAC;CAEF,MAAM,WAAW,MAAM,sBAAsB,SAAS;EACpD;EACA;EACD,CAAC;CAEF,IAAIE,iBAAe,SAAS,EAAE;EAC5B,UAAUF,WAAQ,2BAA2B,SAAS;EACtD,YAAY;GACV,GAAG,qBAAqB,SAAS,MAAM;GACvC,gBAAgB,uBACd,SAAS,eAAe,eACzB;GACF,CAAC;EACF,OAAO,EAAE,KAAK,SAAS;;CAGzB,UAAO,MAAM,qBAAqB;CAClC,OAAO,UAAU,GAAG,OAAO,WAAW;EACpC,IAAI,QAAqB,EAAE;EAE3B,WAAW,MAAM,SAAS,UAAU;GAClC,UAAUA,WAAQ,oBAAoB,MAAM;GAC5C,MAAM,cAAc,yBAAyB,MAAM;GACnD,IAAI,aAAa,SAAS,aAAa,eACrC,QAAQ;IACN,GAAG,qBAAqB,YAAY,MAAM;IAC1C,gBAAgB,uBACd,YAAY,eAAe,eAC5B;IACF;GAEH,MAAM,OAAO,SAAS,MAAoB;;EAG5C,YAAY,MAAM;GAClB;;AAGJ,MAAME,oBACJ,aACuC,OAAO,OAAO,UAAU,UAAU;AAE3E,MAAM,4BACJ,UAC+B;CAC/B,MAAM,OAAQ,MAA4B;CAC1C,IAAI,CAAC,QAAQ,SAAS,UACpB,OAAO;CAGT,IAAI;EACF,OAAO,KAAK,MAAM,KAAK;SACjB;EACN,OAAO;;;;;ACjIX,MAAa,mBAAmB,IAAI,MAAM;AAE1C,iBAAiB,KAAK,KAAK,OAAO,MAAM;CACtC,IAAI;EACF,OAAO,MAAMC,mBAAiB,EAAE;UACzB,OAAO;EACd,OAAO,MAAM,aAAa,GAAG,MAAM;;EAErC;;;ACPF,MAAa,eAAe,IAAI,MAAM;AAEtC,MAAM,6BAA6B,EAAE,OAAO,EAC1C,eAAe,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,QAAQ,CAAC,EAChD,CAAC;AAEF,aAAa,IAAI,oBAAoB,MAAM;CACzC,OAAO,EAAE,KAAK;EACZ,YAAY,MAAM;EAClB,eAAe,kBAAkB;EAClC,CAAC;EACF;AAEF,aAAa,KAAK,mBAAmB,OAAO,MAAM;CAChD,IAAI;EACF,MAAM,cAAc,2BAA2B,UAAU,MAAM,EAAE,IAAI,MAAM,CAAC;EAC5E,IAAI,CAAC,YAAY,SACf,OAAO,EAAE,KACP,EACE,OAAO;GACL,SACE,YAAY,MAAM,OAAO,IAAI,WAAW;GAC1C,MAAM;GACP,EACF,EACD,IACD;EAGH,MAAM,uBAAuB,iBAC3B,YAAY,KAAK,cAClB;EAED,OAAO,EAAE,KAAK;GACZ,YAAY,MAAM;GAClB,eAAe;GAChB,CAAC;UACK,OAAO;EACd,OAAO,MAAM,aAAa,GAAG,MAAM;;EAErC;;;AC3CF,MAAa,mBAAmB,OAAO,YAA8B;CACnE,IAAI,CAAC,MAAM,cAAc,MAAM,IAAI,MAAM,0BAA0B;CAEnE,MAAM,WAAW,MAAM,MAAM,GAAG,eAAe,MAAM,CAAC,cAAc;EAClE,QAAQ;EACR,SAAS,eAAe,MAAM;EAC9B,MAAM,KAAK,UAAU,QAAQ;EAC9B,CAAC;CAEF,IAAI,CAAC,SAAS,IAAI,MAAM,IAAI,UAAU,+BAA+B,SAAS;CAE9E,OAAQ,MAAM,SAAS,MAAM;;;;ACN/B,MAAa,kBAAkB,IAAI,MAAM;AAEzC,gBAAgB,KAAK,KAAK,OAAO,MAAM;CACrC,IAAI;EACF,MAAM,SAAS,MAAM,EAAE,IAAI,MAAwB;EACnD,MAAM,WAAW,MAAM,iBAAiB,OAAO;EAM/C,gCALoD;GAClD,UAAU;GACV,OAAO,OAAO;GACf,CAEU,CAAC;GACV,cAAc,SAAS,MAAM;GAC7B,eAAe;GAChB,CAAC;EAEF,OAAO,EAAE,KAAK,SAAS;UAChB,OAAO;EACd,OAAO,MAAM,aAAa,GAAG,MAAM;;EAErC;;;AChBF,MAAM,0BAA0B,MAAU;AAE1C,MAAM,wBAAwB,wBAAwB,wBAAwB;AAM9E,SAAgB,sBACd,YACA,WACQ;CACR,MAAM,cAAc,IAAI,IAAI,GAAG,mBAAmB,gBAAgB,YAAY;CAC9E,YAAY,SAAS,IAAI,IAAI,YAAY,mBAAmB,CAAC;CAC7D,OAAO,YAAY,UAAU;;AAG/B,eAAsB,mBACpB,SACA,WACmB;CACnB,MAAM,UAAU,yBAAyB,QAAQ,QAAQ;CACzD,IAAI,CAAC,QAAQ,IAAI,SAAS,EACxB,QAAQ,IAAI,UAAU,mBAAmB;CAG3C,IAAI,cAAc,iBAAiB,CAAC,QAAQ,IAAI,eAAe,EAC7D,QAAQ,IAAI,gBAAgB,mBAAmB;CAGjD,MAAM,OAA6B;EACjC,QAAQ;EACR;EACA,MAAM,QAAQ;EACd,QAAQ;EACR,QAAQ,YAAY,QAAQ,wBAAwB;EACrD;CAED,MAAM,cAAc,sBAAsB,QAAQ,KAAK,UAAU;CACjE,IAAI,OAAO,QAAQ,aACjB,OAAO,MAAM,MAAM,aAAa,KAAK;CAKvC,OAAQ,MAAMC,QAAY,aAAa;EACrC,GAAG;EACH,YAAY;EACb,CAAiC;;;;ACjDpC,MAAMC,YAAS,oBAAoB,iBAAiB;AAEpD,MAAa,cAAc,IAAI,MAAM;AACrC,MAAa,yBAAyB,EAAE,gBAAgB;AAExD,SAASC,qBAAmB,SAAkB;CAC5C,OAAO;EACL,aAAa,QAAQ,IAAI,eAAe;EACxC,eAAe,QAAQ,IAAI,iBAAiB;EAC7C;;;;;;AAOH,eAAsB,kBACpB,GACA,WACA,wBACmB;CACnB,IAAI;EAGF,IAAI,EADF,0BAA2B,MAAM,sBAAsB,QAAQ,GAE/D,OAAO,EAAE,KACP,EACE,OAAO;GACL,SAAS;GACT,MAAM;GACP,EACF,EACD,IACD;EAGH,IAAI,cAAc,eAChB,MAAM,uBAAuB,eAC3BD,WACA,oCACA,aAAa,EACX,MAAM,MAAM,EAAE,IAAI,IAAI,OAAO,CAAC,MAAM,EACrC,EACF;OAED,UACEA,WACA,8BACAC,qBAAmB,EAAE,IAAI,IAAI,QAAQ,CACtC;EAGH,MAAM,mBAAmB,MAAM,mBAAmB,EAAE,IAAI,KAAK,UAAU;EACvE,UAAUD,WAAQ,UAAU,UAAU,kBAAkB;GACtD,GAAGC,qBAAmB,iBAAiB,QAAQ;GAC/C,YAAY,iBAAiB;GAC9B,CAAC;EACF,OAAO,4BAA4B,iBAAiB;UAC7C,OAAO;EACd,UAAO,MAAM,UAAU,UAAU,eAAe,EAAE,OAAO,CAAC;EAC1D,OAAO,MAAM,aAAa,GAAG,MAAM;;;AAIvC,YAAY,KAAK,iBAAiB,MAAM,kBAAkB,GAAG,cAAc,CAAC;AAC5E,YAAY,KAAK,WAAW,MAAM,kBAAkB,GAAG,QAAQ,CAAC;;;ACnEhE,MAAM,eAAe;CACnB,kBAAkB,OAAO;CACzB,mBAAmB,OAAO;CAC1B,iBAAiB,OAAO;CACxB,iBAAiB,OAAO;CACxB,iBAAiB,OAAO;CACzB;AAUD,MAAM,gCAAgB,IAAI,KAAsB;;;;AAKhD,MAAM,4BACJ,WACA,SACA,cACW;CACX,IAAI,SAAS;CACb,KAAK,MAAM,YAAY,WAAW;EAChC,UAAU,UAAU;EACpB,UAAU,QAAQ,OAAO,SAAS,GAAG,CAAC;EACtC,UAAU,QAAQ,OAAO,SAAS,SAAS,KAAK,CAAC;EACjD,UAAU,QAAQ,OAAO,SAAS,SAAS,UAAU,CAAC;;CAExD,UAAU,UAAU;CACpB,OAAO;;;;;AAMT,MAAM,+BACJ,cACA,YACW;CACX,IAAI,SAAS;CACb,KAAK,MAAM,QAAQ,cACjB,IAAI,KAAK,SAAS,aAChB,UAAU,QAAQ,OAAO,KAAK,UAAU,IAAI,CAAC,SAAS;MACjD,IAAI,KAAK,SAAS,QAAQ;EAC/B,UAAU,QAAQ,OAAO,KAAK,KAAK,UAAU,CAAC;EAC9C,IAAI,KAAK,KAAK,UACZ,UAAU,QAAQ,OAAO,KAAK,KAAK,SAAS,CAAC;QAE1C,IAAI,KAAK,MACd,UAAU,QAAQ,OAAO,KAAK,KAAK,CAAC;CAGxC,OAAO;;;;;AAMT,MAAM,0BACJ,SACA,SACA,cACW;CACX,MAAM,mBAAmB;CACzB,MAAM,gBAAgB;CACtB,IAAI,SAAS;CACb,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,QAAQ,EAAE;EAClD,IAAI,QAAQ,oBACV;EAEF,IAAI,OAAO,UAAU,UACnB,UAAU,QAAQ,OAAO,MAAM,CAAC;EAElC,IAAI,QAAQ,QACV,UAAU;EAEZ,IAAI,QAAQ,cACV,UAAU,yBACR,OACA,SACA,UACD;EAEH,IAAI,QAAQ,aAAa,MAAM,QAAQ,MAAM,EAC3C,UAAU,4BACR,OACA,QACD;;CAGL,OAAO;;;;;AAMT,MAAM,mBACJ,UACA,SACA,cACW;CACX,IAAI,SAAS,WAAW,GACtB,OAAO;CAET,IAAI,YAAY;CAChB,KAAK,MAAM,WAAW,UACpB,aAAa,uBAAuB,SAAS,SAAS,UAAU;CAGlE,aAAa;CACb,OAAO;;;;;AAMT,MAAM,wBAAwB,OAAO,aAAuC;CAC1E,IAAI,cAAc,IAAI,SAAS,EAAE;EAC/B,MAAM,SAAS,cAAc,IAAI,SAAS;EAC1C,IAAI,QACF,OAAO;;CAIX,MAAM,oBAAoB;CAC1B,IAAI,EAAE,qBAAqB,eAAe;EACxC,MAAM,iBAAkB,MAAM,aAAa,YAAY;EACvD,cAAc,IAAI,UAAU,eAAe;EAC3C,OAAO;;CAGT,MAAM,iBAAkB,MAAM,aAAa,oBAAoB;CAC/D,cAAc,IAAI,UAAU,eAAe;CAC3C,OAAO;;;;;AAMT,MAAa,yBAAyB,UAAyB;CAC7D,OAAO,MAAM,aAAa,aAAa;;;;;AAMzC,MAAM,qBAAqB,UAAiB;CAC1C,OAAO,MAAM,OAAO,mBAAmB,MAAM,OAAO,UAChD;EACE,UAAU;EACV,UAAU;EACV,SAAS;EACT,UAAU;EACV,UAAU;EACV,SAAS;EACT,OAAO;EACR,GACD;EACE,UAAU;EACV,UAAU;EACV,SAAS;EACT,UAAU;EACV,UAAU;EACV,SAAS;EACT,OAAO,MAAM,GAAG,WAAW,OAAO;EACnC;;;;;AAMP,MAAM,4BACJ,KACA,MACA,YAIW;CACX,MAAM,EAAE,SAAS,cAAc;CAC/B,IAAI,SAAS,UAAU;CAGvB,IAAI,OAAO,SAAS,YAAY,SAAS,MACvC,OAAO;CAIT,MAAM,QAAQ;CAOd,MAAM,YAAY;CAClB,MAAM,YAAY,MAAM,QAAQ;CAChC,IAAI,YAAY,MAAM,eAAe;CAGrC,IAAI,MAAM,QAAQ,MAAM,QAAQ,MAAM,KAAK,EAAE;EAC3C,UAAU,UAAU;EACpB,KAAK,MAAM,QAAQ,MAAM,MAAM;GAC7B,UAAU,UAAU;GACpB,UAAU,QAAQ,OAAO,OAAO,KAAK,CAAC,CAAC;;;CAK3C,IAAI,UAAU,SAAS,IAAI,EACzB,YAAY,UAAU,MAAM,GAAG,GAAG;CAIpC,MAAM,OAAO,GAAG,UAAU,GAAG,UAAU,GAAG;CAC1C,UAAU,QAAQ,OAAO,KAAK,CAAC;CAE/B,IAAI,MAAM,SAAS,WAAW,MAAM,UAClC,UAAU,0BAA0B,MAAM,UAAU,SAAS,UAAU;CAIzE,MAAM,eAAe,IAAI,IAAI;EAAC;EAAQ;EAAe;EAAQ;EAAQ,CAAC;CACtE,KAAK,MAAM,gBAAgB,OAAO,KAAK,MAAM,EAC3C,IAAI,CAAC,aAAa,IAAI,aAAa,EAAE;EACnC,MAAM,gBAAgB,MAAM;EAC5B,MAAM,eACJ,OAAO,kBAAkB,WAAW,gBAClC,KAAK,UAAU,cAAc;EAEjC,UAAU,QAAQ,OAAO,GAAG,aAAa,GAAG,eAAe,CAAC;;CAIhE,OAAO;;;;;AAMT,MAAM,6BACJ,YACA,SACA,cACW;CACX,IAAI,SAAS;CACb,IAAI,OAAO,KAAK,WAAW,CAAC,SAAS,GAAG;EACtC,UAAU,UAAU;EACpB,KAAK,MAAM,WAAW,OAAO,KAAK,WAAW,EAC3C,UAAU,yBAAyB,SAAS,WAAW,UAAU;GAC/D;GACA;GACD,CAAC;;CAGN,OAAO;;;;;AAMT,MAAM,6BACJ,YACA,SACA,cACW;CACX,IAAI,CAAC,cAAc,OAAO,eAAe,UACvC,OAAO;CAGT,MAAM,SAAS;CACf,IAAI,SAAS;CAEb,MAAM,eAAe,IAAI,IAAI,CAAC,WAAW,uBAAuB,CAAC;CACjE,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,OAAO,EAAE;EACjD,IAAI,aAAa,IAAI,IAAI,EACvB;EAEF,IAAI,QAAQ,cACV,UAAU,0BACR,OACA,SACA,UACD;OACI;GACL,MAAM,YACJ,OAAO,UAAU,WAAW,QAAQ,KAAK,UAAU,MAAM;GAC3D,UAAU,QAAQ,OAAO,GAAG,IAAI,GAAG,YAAY,CAAC;;;CAIpD,OAAO;;;;;AAMT,MAAM,uBACJ,MACA,SACA,cACW;CACX,IAAI,SAAS,UAAU;CACvB,MAAM,OAAO,KAAK;CAClB,MAAM,QAAQ,KAAK;CACnB,IAAI,QAAQ,KAAK,eAAe;CAChC,IAAI,MAAM,SAAS,IAAI,EACrB,QAAQ,MAAM,MAAM,GAAG,GAAG;CAE5B,MAAM,OAAO,QAAQ,MAAM;CAC3B,UAAU,QAAQ,OAAO,KAAK,CAAC;CAC/B,IACE,OAAO,KAAK,eAAe,YACxB,KAAK,eAAe,MAEvB,UAAU,0BAA0B,KAAK,YAAY,SAAS,UAAU;CAE1E,OAAO;;;;;AAMT,MAAa,qBACX,OACA,SACA,cACW;CACX,IAAI,iBAAiB;CACrB,IAAI,UAAU,OAAO;EACnB,KAAK,MAAM,QAAQ,OACjB,kBAAkB,oBAAoB,MAAM,SAAS,UAAU;EAEjE,kBAAkB,UAAU;QAE5B,KAAK,MAAM,QAAQ,OACjB,kBAAkB,QAAQ,OAAO,KAAK,UAAU,KAAK,CAAC,CAAC;CAG3D,OAAO;;;;;AAMT,MAAa,gBAAgB,OAC3B,SACA,UAC+C;CAK/C,MAAM,UAAU,MAAM,sBAHJ,sBAAsB,MAGa,CAAC;CAEtD,MAAM,qBAAqB,QAAQ;CACnC,MAAM,gBAAgB,mBAAmB,QACtC,QAAQ,IAAI,SAAS,YACvB;CACD,MAAM,iBAAiB,mBAAmB,QACvC,QAAQ,IAAI,SAAS,YACvB;CAED,MAAM,YAAY,kBAAkB,MAAM;CAE1C,IAAI,cAAc,gBAAgB,eAAe,SAAS,UAAU;CACpE,IAAI,QAAQ,SAAS,QAAQ,MAAM,SAAS,GAC1C,eAAe,kBAAkB,QAAQ,OAAO,SAAS,UAAU;CAErE,MAAM,eAAe,gBAAgB,gBAAgB,SAAS,UAAU;CAExE,OAAO;EACL,OAAO;EACP,QAAQ;EACT;;;;ACnYH,SAAgB,+BACd,cACkC;CAClC,IAAI,iBAAiB,MACnB,OAAO;CAQT,OAAO;EALL,MAAM;EACN,QAAQ;EACR,YAAY;EACZ,gBAAgB;EAEE,CAAC;;ACsDvB,SAAgB,kBACd,SACA,UAAoC,EAAE,EACd;CACxB,MAAM,UAAU,QAAQ;CACxB,MAAM,QAAQ,MAAM,QAAQ,KAAK,MAAM,MAAM,EAAE,OAAO,QAAQ;CAC9D,MAAM,iBAAiB,kBAAkB,SAAS,MAAM;CACxD,MAAM,kBAAkB,mBAAmB,SAAS,QAAQ;CAC5D,MAAM,EAAE,WAAW,2BAA2B,oBAC5C,QAAQ,UAAU,QACnB;CAED,MAAM,kBADe,eAAe,UACA,EAAE,iBAAiB,MAAM,IAAI;CACjE,MAAM,iBAAiB,0BAA0B;CAKjD,OAAO;EACL,OAAO;EACP,UAAU,mCACR,SACA,SACA;GARF,YAAY,QAAQ,cAAc;GAClC,wBAAwB,QAAQ,0BAA0B,EAAE;GAO9C,CACb;EACD,uBAAuB,QAAQ;EAC/B,MAAM,QAAQ;EACd,QAAQ,QAAQ;EAChB,aAAa,QAAQ;EACrB,OAAO,QAAQ;EACf,MAAM,QAAQ,UAAU;EACxB,OAAO,gCAAgC,QAAQ,MAAM;EACrD,aAAa,qCAAqC,QAAQ,YAAY;EACtE,iBAAiB;EACjB,GAAI,kBAAkB,EAAE,kBAAkB,iBAAiB,GAAG,EAAE;EAChE,GAAI,iBAAiB,EAAE,kBAAkB,gBAAgB,GAAG,EAAE;EAC/D;;AAGH,SAAS,mBACP,SACA,SACoB;CACpB,MAAM,SAAS,QAAQ,eAAe;CACtC,IAAI,CAAC,QACH;CAGF,IAAI,CAAC,QAAQ,yBACX,OAAO;CAGT,MAAM,mBAAmB,QAAQ;CACjC,IAAI,CAAC,oBAAoB,iBAAiB,WAAW,GACnD;CAGF,IAAI,iBAAiB,SAAS,OAAO,EACnC,OAAO;CAGT,OAAO,iBAAiB,GAAG,GAAG;;AAGhC,SAAS,kBACP,SACA,OACoB;CACpB,MAAM,WAAW,QAAQ;CACzB,IAAI,SAAS,UAAU,kBAAkB,KAAA,GAAW;EAClD,MAAM,oBAAoB,KAAK,IAC7B,MAAM,aAAa,SAAS,uBAAuB,IAClD,MAAM,aAAa,OAAO,qBAAqB,KAAK,EACtD;EACD,SAAS,kBAAkB;EAC3B,IAAI,oBAAoB,GAAG;GACzB,MAAM,eAAe,KAAK,IAAI,SAAS,eAAe,kBAAkB;GACxE,OAAO,KAAK,IACV,cACA,MAAM,aAAa,SAAS,uBAAuB,KACpD;;;;AAMP,SAAS,mCACP,SACA,SACA,cACgB;CAChB,MAAM,iBAAiB,mBAAmB,QAAQ,OAAO;CACzD,MAAM,gBAAgB,QAAQ,SAAS,SAAS,YAAY;EAC1D,IAAI,QAAQ,SAAS,QACnB,OAAO,kBAAkB,SAAS,aAAa;EAEjD,IAAI,QAAQ,SAAS,UACnB,OAAO,CAAC,0BAA0B,QAAQ,CAAC;EAE7C,OAAO,uBAAuB,SAAS,SAAS,aAAa;GAC7D;CACF,OAAO,CAAC,GAAG,gBAAgB,GAAG,cAAc;;AAG9C,SAAS,mBACP,QACgB;CAChB,IAAI,CAAC,QACH,OAAO,EAAE;CAGX,IAAI,OAAO,WAAW,UACpB,OAAO,CAAC;EAAE,MAAM;EAAU,SAAS;EAAQ,CAAC;MAO5C,OAAO,CAAC;EAAE,MAAM;EAAU,SALP,OAChB,KAAK,UAAU;GACd,OAAO,MAAM;IACb,CACD,KAAK,OACqC;EAAE,CAAC;;AAIpD,SAAS,0BAA0B,SAA0C;CAC3E,OAAO;EACL,MAAM;EACN,SAAS,WAAW,QAAQ,QAAQ;EACrC;;AAGH,SAAS,kBACP,SACA,cACgB;CAChB,MAAM,cAA8B,EAAE;CAEtC,IAAI,MAAM,QAAQ,QAAQ,QAAQ,EAAE;EAClC,MAAM,mBAAmB,QAAQ,QAAQ,QACtC,UACC,MAAM,SAAS,cAClB;EACD,MAAM,cAAc,QAAQ,QAAQ,QACjC,UAAU,MAAM,SAAS,cAC3B;EAGD,MAAM,8BAA8C,EAAE;EACtD,KAAK,MAAM,SAAS,kBAAkB;GACpC,MAAM,SAAS,sBAAsB,OAAO,aAAa;GACzD,YAAY,KAAK,OAAO,YAAY;GACpC,IAAI,OAAO,kBACT,4BAA4B,KAAK,OAAO,iBAAiB;;EAG7D,YAAY,KAAK,GAAG,4BAA4B;EAEhD,IAAI,YAAY,SAAS,GACvB,YAAY,KAAK;GACf,MAAM;GACN,SAAS,WAAW,aAAa,EAC/B,YAAY,aAAa,YAC1B,CAAC;GACH,CAAC;QAGJ,YAAY,KAAK;EACf,MAAM;EACN,SAAS,WAAW,QAAQ,QAAQ;EACrC,CAAC;CAGJ,OAAO;;AAGT,SAAS,sBACP,OACA,cACoB;CACpB,IAAI,OAAO,MAAM,YAAY,UAC3B,OAAO,EACL,aAAa,kBAAkB,MAAM,aAAa,MAAM,QAAQ,EACjE;CAGH,IAAI,CAAC,MAAM,QAAQ,MAAM,QAAQ,EAC/B,OAAO,EACL,aAAa,kBAAkB,MAAM,aAAa,GAAG,EACtD;CAGH,MAAM,UAAU,sBAAsB,aAAa;CACnD,MAAM,WAAW,MAAM,QAAQ,MAAM,UAAU,MAAM,SAAS,QAAQ;CACtE,MAAM,cAAc,MAAM,QAAQ,MAAM,UAAU,MAAM,SAAS,WAAW;CAC5E,MAAM,UAAU,WAAW,MAAM,SAAS,EACxC,YAAY,aAAa,YAC1B,CAAC;CAEF,MAAM,aAAa,eAAe,aAAa;CAC/C,MAAM,+BAA+B,YAAY,CAAC,QAAQ;CAC1D,MAAM,6BAA6B,cAAc,CAAC,QAAQ;CAC1D,IAAI,gCAAgC,4BAClC,OAAO;EACL,kBAAkB,4BAChB,OACA,aAAa,WACd;EACD,aAAa,kBACX,MAAM,aACN,mBAAmB,QAAQ,IAAA,mHAC5B;EACF;CAGH,MAAM,iBAAiB,YAAY;CACnC,IAAI,QAAQ,SAAS,gBACnB,OAAO,EACL,aAAa,kBAAkB,MAAM,aAAa,QAAQ,EAC3D;CAGH,OAAO,EACL,aAAa,kBACX,MAAM,aACN,mBAAmB,QAAQ,CAC5B,EACF;;AAGH,SAAS,mBAAmB,SAAqC;CAC/D,IAAI,CAAC,MAAM,QAAQ,QAAQ,EACzB,OAAO,WAAW;CAGpB,OAAO,QACJ,SAAS,SACR,KAAK,SAAS,UAAU,KAAK,KAAK,SAAS,IAAI,CAAC,KAAK,KAAK,GAAG,EAAE,CAChE,CACA,KAAK,KAAK;;AAGf,SAAS,sBACP,cACoB;CACpB,OAAO;EACL,OAAO,aAAa,uBAAuB,SAAS,QAAQ;EAC5D,OAAO,aAAa,uBAAuB,SAAS,QAAQ;EAC5D,KACE,aAAa,cACV,aAAa,uBAAuB,SAAS,MAAM;EACzD;;AAGH,SAAS,kBACP,YACA,SACS;CACT,OAAO;EACL,MAAM;EACN,cAAc;EACd;EACD;;AAGH,SAAS,4BACP,OACA,YACS;CACT,MAAM,SAAmB;EACvB,MAAM;EACN,MAAM,mBAAmB,MAAM,YAAY;EAC5C;CACD,MAAM,UAAU,WAAW,MAAM,SAAS,EACxC,YACD,CAAC;CACF,IAAI,MAAM,QAAQ,QAAQ,EACxB,OAAO;EACL,MAAM;EACN,SAAS,CAAC,QAAQ,GAAG,QAAQ;EAC9B;CAGH,OAAO;EACL,MAAM;EACN,SAAS,CAAC,QAAQ;GAAE,MAAM;GAAQ,MAAM,WAAW;GAAI,CAAC;EACzD;;AAGH,SAAS,uBACP,SACA,SACA,cACgB;CAChB,IAAI,CAAC,MAAM,QAAQ,QAAQ,QAAQ,EACjC,OAAO,CACL;EACE,MAAM;EACN,SAAS,WAAW,QAAQ,QAAQ;EACrC,CACF;CAIH,IAAI,QAAQ,QAAQ,WAAW,GAC7B,OAAO,EAAE;CAGX,MAAM,gBAAgB,QAAQ,QAAQ,QACnC,UAA0C,MAAM,SAAS,WAC3D;CAED,IAAI,iBAAiB,QAAQ,QAAQ,QAClC,UAA2C,MAAM,SAAS,WAC5D;CAED,IAAI,QAAQ,WAAW,SAAS,EAM9B,iBAAiB,eAAe,QAC7B,MACC,EAAE,aAAA,iBACC,EAAE,aAEF,CAAC,EAAE,UAAU,SAAS,IAAI,CAChC;CAGH,MAAM,mBAAmB,eACtB,QAAQ,MAAM,EAAE,YAAY,EAAE,aAAA,cAA2B,CACzD,KAAK,MAAM,EAAE,SAAS;CAEzB,MAAM,qBACJ,iBAAiB,SAAS,IAAI,iBAAiB,KAAK,OAAO,GAAG,KAAA;CAEhE,MAAM,YAAY,eAAe,MAAM,MAAM,EAAE,UAAU,EAAE;CAE3D,OAAO,cAAc,SAAS,IAC1B,CACE;EACE,MAAM;EACN,SAAS,WAAW,QAAQ,SAAS,EACnC,YAAY,aAAa,YAC1B,CAAC;EACF,gBAAgB;EAChB,kBAAkB;EAClB,YAAY,cAAc,KAAK,aAAa;GAC1C,IAAI,QAAQ;GACZ,MAAM;GACN,UAAU;IACR,MAAM,QAAQ;IACd,WAAW,KAAK,UAAU,QAAQ,MAAM;IACzC;GACF,EAAE;EACJ,CACF,GACD,CACE;EACE,MAAM;EACN,SAAS,WAAW,QAAQ,SAAS,EACnC,YAAY,aAAa,YAC1B,CAAC;EACF,gBAAgB;EAChB,kBAAkB;EACnB,CACF;;AAGP,SAAS,WACP,SACA,UAAoC,EAAE,EACF;CACpC,IAAI,OAAO,YAAY,UACrB,OAAO;CAET,IAAI,CAAC,MAAM,QAAQ,QAAQ,EACzB,OAAO;CAGT,MAAM,eAAmC,EAAE;CAC3C,KAAK,MAAM,SAAS,SAClB,QAAQ,MAAM,MAAd;EACE,KAAK;GACH,aAAa,KAAK;IAAE,MAAM;IAAQ,MAAM,MAAM;IAAM,CAAC;GACrD;EAEF,KAAK;GACH,aAAa,KAAK;IAChB,MAAM;IACN,WAAW,EACT,KAAK,QAAQ,MAAM,OAAO,WAAW,UAAU,MAAM,OAAO,QAC7D;IACF,CAAC;GACF;EAEF,KAAK;GACH,aAAa,KACX,QAAQ,aACN,uBAAuB,MAAM,GAC7B,wBAAwB,CAC3B;GACD;EAEF,KAAK;GACH,aAAa,KAAK;IAChB,MAAM;IACN,MAAM,QAAQ,MAAM,UAAU;IAC/B,CAAC;GACF;;CAKN,IAAI,aAAa,WAAW,GAC1B,OAAO;CAET,OAAO;;AAGT,SAAS,yBAAmC;CAC1C,OAAO;EACL,MAAM;EACN,MAAM;EACP;;AAGH,SAAS,uBAAuB,OAA4C;CAC1E,OAAO;EACL,MAAM;EACN,MAAM;GACJ,WAAW,QAAQ,MAAM,OAAO,WAAW,UAAU,MAAM,OAAO;GAClE,UAAU,MAAM,SAAS;GAC1B;EACF;;AAGH,SAAS,gCACP,gBACyB;CACzB,IAAI,CAAC,gBACH;CAEF,OAAO,eAAe,KAAK,UAAU;EACnC,MAAM;EACN,UAAU;GACR,MAAM,KAAK;GACX,aAAa,KAAK;GAClB,YAAY,oBAAoB,KAAK,aAAa;GAClD,GAAI,KAAK,WAAW,KAAA,IAAY,EAAE,GAAG,EAAE,QAAQ,KAAK,QAAQ;GAC7D;EACF,EAAE;;;;;;AAOL,MAAa,uBACX,WAC4B;CAC5B,IAAI,OAAO,SAAS,YAAY,CAAC,OAAO,YACtC,OAAO;EAAE,GAAG;EAAQ,YAAY,EAAE;EAAE;CAEtC,OAAO;;AAGT,SAAS,qCACP,qBACuC;CACvC,IAAI,CAAC,qBACH;CAGF,QAAQ,oBAAoB,MAA5B;EACE,KAAK,QACH,OAAO;EAET,KAAK,OACH,OAAO;EAET,KAAK;GACH,IAAI,oBAAoB,MACtB,OAAO;IACL,MAAM;IACN,UAAU,EAAE,MAAM,oBAAoB,MAAM;IAC7C;GAEH;EAEF,KAAK,QACH,OAAO;EAET,SACE;;;AAON,SAAgB,qBACd,UACmB;CAEnB,MAAM,yBAAgE,EAAE;CACxE,IAAI,aAAa,SAAS,QAAQ,IAAI,iBAAiB;CAGvD,KAAK,MAAM,UAAU,SAAS,SAAS;EACrC,MAAM,aAAa,uBAAuB,OAAO,QAAQ,QAAQ;EACjE,MAAM,cAAc,wBAClB,uBAAuB,OAAO,QAAQ,EACtC,OAAO,QAAQ,iBAChB;EACD,MAAM,gBAAgB,0BAA0B,OAAO,QAAQ,WAAW;EAE1E,uBAAuB,KAAK,GAAG,aAAa,GAAG,YAAY,GAAG,cAAc;EAG5E,IAAI,OAAO,kBAAkB,gBAAgB,eAAe,QAC1D,aAAa,OAAO;;CAIxB,OAAO;EACL,IAAI,SAAS;EACb,MAAM;EACN,MAAM;EACN,OAAO,SAAS;EAChB,SAAS;EACT,aAAa,+BAA+B,WAAW;EACvD,eAAe;EACf,OAAO,6BAA6B,SAAS;EAC9C;;AAGH,SAAS,6BACP,UAC4B;CAC5B,MAAM,gBAAgB,SAAS,OAAO;CACtC,MAAM,eAAe,SAAS,OAAO,iBAAiB;CACtD,MAAM,eAAe,eAAe,iBAAiB;CACrD,MAAM,sBAAsB,eAAe,+BAA+B;CAC1E,MAAM,QAAoC;EACxC,cAAc,KAAK,IACjB,GACA,eAAe,eAAe,oBAC/B;EACD,eAAe,SAAS,OAAO,qBAAqB;EACrD;CAED,IAAI,eAAe,gCAAgC,KAAA,GACjD,MAAM,8BAA8B;CAEtC,IAAI,eAAe,kBAAkB,KAAA,GACnC,MAAM,0BAA0B;CAGlC,OAAO;;AAGT,SAAS,uBAAuB,SAIF;CAC5B,OACE,QAAQ,kBAAkB,QAAQ,qBAAqB,QAAQ;;AAInE,SAAS,uBACP,gBAC2B;CAC3B,IAAI,OAAO,mBAAmB,YAAY,eAAe,SAAS,GAChE,OAAO,CAAC;EAAE,MAAM;EAAQ,MAAM;EAAgB,CAAC;CAGjD,IAAI,MAAM,QAAQ,eAAe,EAC/B,OAAO,eACJ,QAAQ,SAA2B,KAAK,SAAS,OAAO,CACxD,KAAK,UAAU;EAAE,MAAM;EAAQ,MAAM,KAAK;EAAM,EAAE;CAGvD,OAAO,EAAE;;AAGX,SAAS,wBACP,eACA,iBAC+B;CAC/B,IAAI,iBAAiB,cAAc,SAAS,GAC1C,OAAO,CACL;EACE,MAAM;EACN,UAAU;EACV,WAAW,mBAAmB;EAC/B,CACF;CAEH,IAAI,mBAAmB,gBAAgB,SAAS,GAC9C,OAAO,CACL;EACE,MAAM;EACN,UAAU;EACV,WAAW;EACZ,CACF;CAEH,OAAO,EAAE;;AAGX,SAAS,0BACP,WAC8B;CAC9B,IAAI,CAAC,WACH,OAAO,EAAE;CAEX,OAAO,UAAU,KAAK,cAAc;EAClC,MAAM;EACN,IAAI,SAAS;EACb,MAAM,SAAS,SAAS;EACxB,OAAO,KAAK,MAAM,SAAS,SAAS,UAAU;EAC/C,EAAE;;ACrpBL,MAAM,wBAAwB;AAC9B,MAAM,sBAAsB;AAC5B,MAAM,wCAAwC;AAC9C,MAAa,mCACX;AAGF,MAAM,2BAA2B;AACjC,MAAM,kCACJ;AACF,MAAM,uBAAuB;AAC7B,MAAM,oCAAoC;AAC1C,MAAM,kCAAkC;AAOxC,MAAM,mBAAmB,UAAsC;CAC7D,MAAM;CACN;CACD;AAED,MAAM,qBAAqB,MAAc,aAA6B;CACpE,IAAI,KAAK,WAAW,GAClB,OAAO;CAET,IAAI,SAAS,WAAW,GACtB,OAAO;CAGT,OAAO,GAAG,KAAK,MAAM;;AAGvB,MAAM,4BAA4B,SAAyB;CACzD,IAAI,KAAK,WAAW,sBAAsB,EACxC,OAAO;CAGT,OAAO,GAAG,sBAAsB,IAAI,KAAK,MAAM,CAAC,IAAI;;AAGtD,MAAM,iCACJ,SACuC;CACvC,IAAI,CAAC,KAAK,WAAW,sCAAsC,EACzD,OAAO,yBAAyB,KAAK;CAGvC,MAAM,iBAAiB,QAAQ,KAAK,KAAK;CACzC,IAAI,CAAC,gBACH,OAAO,CAAC,gBAAgB,yBAAyB,KAAK,CAAC,CAAC;CAG1D,MAAM,YAAY,KAAK,MAAM,GAAG,eAAe,MAAM;CACrD,MAAM,OAAO,KAAK,MAAM,eAAe,QAAQ,eAAe,GAAG,OAAO;CACxE,OAAO,CACL,gBAAgB,yBAAyB,UAAU,CAAC,EACpD,GAAI,KAAK,SAAS,IAChB,CAAC,gBAAgB,yBAAyB,KAAK,CAAC,CAAC,GACjD,EAAE,CACL;;AAGH,MAAM,kCACJ,YACuC;CACvC,IAAI,OAAO,YAAY,UACrB,OAAO,8BAA8B,QAAQ;CAG/C,OAAO,QAAQ,SAAS,UAAU;EAChC,MAAM,aAAa,8BAA8B,MAAM,KAAK;EAC5D,IAAI,OAAO,eAAe,UACxB,OAAO,CAAC;GAAE,GAAG;GAAO,MAAM;GAAY,CAAC;EAGzC,OAAO,WAAW,KAAK,iBAAiB,UACtC,UAAU,WAAW,SAAS,IAC5B;GAAE,GAAG;GAAO,MAAM,gBAAgB;GAAM,GACxC,gBACH;GACD;;AAGJ,MAAM,sBACJ,YAC8B;CAC9B,OAAO,OAAO,YAAY,WAAW,CAAC,gBAAgB,QAAQ,CAAC,GAAG,CAAC,GAAG,QAAQ;;AAGhF,MAAM,4BACJ,SACA,aACuC;CACvC,IAAI,YAAY,KAAA,GACd,OAAO,OAAO,aAAa,WAAW,WAAW,CAAC,GAAG,SAAS;CAGhE,IAAI,OAAO,YAAY,YAAY,OAAO,aAAa,UACrD,OAAO,kBAAkB,SAAS,SAAS;CAG7C,OAAO,CAAC,GAAG,mBAAmB,QAAQ,EAAE,GAAG,mBAAmB,SAAS,CAAC;;AAG1E,MAAM,qCACJ,SACA,aACS;CACT,IAAI,OAAO,QAAQ,YAAY,YAAY,OAAO,aAAa,UAAU;EACvE,QAAQ,UAAU,kBAAkB,UAAU,QAAQ,QAAQ;EAC9D;;CAGF,IAAI,MAAM,QAAQ,QAAQ,QAAQ,EAAE;EAClC,MAAM,sBAAsB,QAAQ,QAAQ,eACzC,UAAU,MAAM,SAAS,cAC3B;EACD,IAAI,uBAAuB,GAAG;GAC5B,QAAQ,UAAU;IAChB,GAAG,QAAQ,QAAQ,MAAM,GAAG,sBAAsB,EAAE;IACpD,GAAG,mBAAmB,SAAS;IAC/B,GAAG,QAAQ,QAAQ,MAAM,sBAAsB,EAAE;IAClD;GACD;;;CAIJ,QAAQ,UAAU,CAChB,GAAG,mBAAmB,SAAS,EAC/B,GAAI,OAAO,QAAQ,YAAY,WAC7B,CAAC,gBAAgB,QAAQ,QAAQ,CAAC,GAClC,QAAQ,QACX;;AAGH,MAAM,oCAAoC,SAAyB;CACjE,IAAI,CAAC,KAAK,WAAW,kCAAkC,EACrD,OAAO;CAGT,OAAO,KAAK,QAAQ,iCAAiC,kBAAkB;;AAGzE,MAAa,4CACX,YACS;CACT,MAAM,SAAS,QAAQ;CACvB,IAAI,CAAC,QACH;CAGF,IAAI,OAAO,WAAW,UAAU;EAC9B,QAAQ,SAAS,iCAAiC,OAAO;EACzD;;CAGF,IAAI,OAAO,WAAW,GACpB;CAGF,QAAQ,SAAS,OAAO,KAAK,OAAO,UAClC,UAAU,IACR;EAAE,GAAG;EAAO,MAAM,iCAAiC,MAAM,KAAK;EAAE,GAChE,MACH;;AAGH,MAAa,2BACX,YACS;CACT,yCAAyC,QAAQ;CAEjD,IAAI,QAAQ,MAAM,WAAW,MAAM,IAAI,QAAQ,MAAM,WAAW,QAAQ,EACtE;CAGF,IAAI,CAAC,QAAQ,SAAS,MAAM,QAAQ,IAAI,SAAS,SAAS,EACxD;CAGF,MAAM,qBAA8C,EAAE;CACtD,IAAI,SAAS,QAAQ;CAErB,KAAK,MAAM,WAAW,QAAQ,UAAU;EACtC,IAAI,QAAQ,SAAS,UAAU;GAC7B,MAAM,oBAAoB,+BAA+B,QAAQ,QAAQ;GACzE,MAAM,kBAAkB,mBAAmB,GAAG,GAAG;GACjD,IAAI,iBAAiB,SAAS,QAC5B,kCAAkC,iBAAiB,kBAAkB;QAChE,IAAI,CAAC,iBACV,SAAS,yBAAyB,QAAQ,kBAAkB;GAE9D;;EAGF,mBAAmB,KAAK,QAAQ;;CAGlC,QAAQ,WAAW;CACnB,QAAQ,SAAS;;AAGnB,MAAM,oBACJ,SACA,cACA,iBACY;CACZ,MAAM,CAAC,WAAW,YAAY,OAAO,QAAQ,MAAM,IAAI;CACvD,MAAM,QAAQ,OAAO,SAAS,WAAW,GAAG;CAC5C,MAAM,QAAQ,OAAO,SAAS,WAAW,GAAG;CAC5C,IAAI,CAAC,OAAO,UAAU,MAAM,IAAI,CAAC,OAAO,UAAU,MAAM,EACtD,OAAO;CAGT,OACE,QAAQ,gBAAiB,UAAU,gBAAgB,SAAS;;AAIhE,MAAM,0CAA0C,UAA2B;CACzE,MAAM,aAAa,oBAAoB,MAAM;CAC7C,OAAO,QAAQ,cAAc,iBAAiB,WAAW,SAAS,GAAG,EAAE,CAAC;;AAQ1E,MAAM,wBACJ,UACsC;CACtC,IAAI,CAAC,SAAS,MAAM,SAAS,YAC3B;CAGF,MAAM,eAAe,MAAM;CAC3B,IAAI,CAAC,gBAAgB,OAAO,iBAAiB,UAC3C;CAGF,OAAO;;AAGT,MAAa,qCACX,gBACsC;CACtC,IAAI,CAAC,eAAe,CAAC,MAAM,QAAQ,YAAY,QAAQ,EACrD;CAGF,MAAM,eAAe,qBAAqB,YAAY,QAAQ,GAAG,GAAG,CAAC;CACrE,OAAO,eAAe,EAAE,GAAG,cAAc,GAAG,KAAA;;AAK9C,MAAa,gCACX,kBACA,4BACS;CACT,MAAM,eAAe,2BAA2B,EAC9C,MAAM,aACP;CAED,MAAM,cAAc,iBAAiB,SAAS,GAAG,GAAG;CACpD,IAAI,CAAC,eAAe,CAAC,MAAM,QAAQ,YAAY,QAAQ,EACrD;CAGF,MAAM,YAAY,YAAY,QAAQ,GAAG,GAAG;CAC5C,IAAI,CAAC,aAAa,UAAU,SAAS,cAAc,UAAU,eAC3D;CAGF,UAAU,gBAAgB,EAAE,GAAG,cAAc;;AAG/C,MAAM,2BAA2B,YAA2C;CAC1E,IAAI,QAAQ,SAAS,QACnB,OAAO;CAGT,IAAI,OAAO,QAAQ,YAAY,UAC7B,OAAO,QAAQ;CAGjB,OAAO,QAAQ,QACZ,QAAQ,UAAuC,MAAM,SAAS,OAAO,CACrE,KAAK,UACJ,MAAM,KAAK,WAAW,oBAAoB,GAAG,KAAK,MAAM,KACzD,CACA,QAAQ,SAAS,KAAK,SAAS,EAAE,CACjC,KAAK,OAAO;;AAGjB,MAAM,oBAAoB,gBAAgD;CACxE,MAAM,OAAO,wBAAwB,YAAY;CACjD,IAAI,CAAC,MACH,OAAO;CAGT,OACE,KAAK,SAAA,2DAA8B,IAChC,KAAK,SAAA,uEAAmC,IACxC,uBAAuB,MAAM,YAAY,KAAK,SAAS,QAAQ,CAAC;;AAIvE,MAAM,gCACJ,gBACY;CACZ,MAAM,OAAO,wBAAwB,YAAY;CACjD,OACE,QAAQ,KAAK,IACV,gCAAgC,MAAM,gBACvC,KAAK,WAAW,YAAY,CAC7B;;AAIL,MAAa,kBACX,qBACgB;CAChB,MAAM,cAAc,iBAAiB,SAAS,GAAG,GAAG;CACpD,IAAI,eAAe,iBAAiB,YAAY,EAC9C,OAAA;CAGF,IAAI,eAAe,6BAA6B,YAAY,EAC1D,OAAA;CAGF,MAAM,SAAS,iBAAiB;CAChC,IAAI,OAAO,WAAW,UAIpB,OAH+B,0BAA0B,MACtD,gBAAgB,OAAO,WAAW,YAAY,CAEpB,GAAA,IAAqB;CAEpD,IAAI,CAAC,MAAM,QAAQ,OAAO,EAAE,OAAO;CASnC,IAP+B,OAAO,MACnC,QACC,OAAO,IAAI,SAAS,YACjB,0BAA0B,MAAM,gBACjC,IAAI,KAAK,WAAW,YAAY,CACjC,CAEqB,EACxB,OAAA;CAGF,OAAO;;;;;;;AAQT,MAAa,4BACX,YACY;CACZ,IAAI,QAAQ,SAAS,QAAQ,MAAM,SAAS,GAC1C,OAAO;CAGT,MAAM,gBAAgB,QAAQ;CAC9B,IACE,CAAC,MAAM,QAAQ,cAAc,IAC1B,cAAc,WAAW,KACzB,cAAc,OAAA,YAEjB,OAAO;CAGT,MAAM,SAAS,QAAQ;CACvB,IAAI,OAAO,WAAW,UACpB,OAAO,OAAO,WAAW,iCAAiC;CAE5D,IAAI,CAAC,MAAM,QAAQ,OAAO,EACxB,OAAO;CAGT,OAAO,OAAO,MACX,UACC,OAAO,MAAM,SAAS,YACnB,MAAM,KAAK,WAAA,8DAA4C,CAC7D;;AAGH,MAAM,wBACJ,IACA,cAC6B;CAC7B,IAAI,OAAO,GAAG,YAAY,UACxB,OAAO;EAAE,GAAG;EAAI,SAAS,GAAG,GAAG,QAAQ,MAAM,UAAU;EAAQ;CAGjE,IAAI,WAAW,GAAG,EAChB,OAAO;CAET,OAAO;EACL,GAAG;EACH,SAAS,CAAC,GAAG,GAAG,SAAS,8BAA8B,UAAU,CAAC;EACnE;;AAGH,MAAM,yBACJ,IACA,eAC6B;CAC7B,IAAI,OAAO,GAAG,YAAY,UAAU;EAClC,MAAM,gBAAgB,WAAW,KAAK,OAAO,GAAG,KAAK,CAAC,KAAK,OAAO;EAClE,OAAO;GAAE,GAAG;GAAI,SAAS,GAAG,GAAG,QAAQ,MAAM;GAAiB;;CAGhE,IAAI,WAAW,GAAG,EAChB,OAAO;CAET,OAAO;EACL,GAAG;EACH,SAAS,CAAC,GAAG,GAAG,SAAS,GAAG,WAAW,IAAI,8BAA8B,CAAC;EAC3E;;AAGH,MAAM,+BACJ,IACA,gBAC6B;CAC7B,MAAM,mBAAmB,YAAY,IAAI,8BAA8B;CAEvE,IAAI,OAAO,GAAG,YAAY,UACxB,OAAO;EACL,GAAG;EACH,SAAS,CAAC;GAAE,MAAM;GAAQ,MAAM,GAAG;GAAS,EAAE,GAAG,iBAAiB;EACnE;CAGH,OAAO;EACL,GAAG;EACH,SAAS,CAAC,GAAG,GAAG,SAAS,GAAG,iBAAiB;EAC9C;;AAGH,MAAM,iCAGJ,UACM;CACN,IAAI,CAAC,OAAO,OAAO,OAAO,gBAAgB,EACxC,OAAO;CAGT,MAAM,OAAO,EAAE,GAAG,OAAO;CACzB,OAAO,KAAK;CACZ,OAAO;;AAGT,MAAM,qBACJ,UACsC;CACtC,OAAO,MAAM,SAAS,WAAW,MAAM,SAAS;;AAGlD,MAAM,iCACJ,gBACkB;CAClB,OAAO,YAAY,SAAS,OAAO,UACjC,MAAM,YAAY,WAAW,MAAM,GAAG,EAAE,GAAG,CAAC,MAAM,CACnD;;AAGH,MAAM,mCACJ,aACA,iCACoC;CACpC,IAAI,6BAA6B,SAAS,GACxC,OAAO;CAGT,OAAO,YAAY,KAAK,OAAO,UAAU;EACvC,MAAM,qBAAqB,6BAA6B,IAAI,MAAM;EAClE,IAAI,CAAC,oBACH,OAAO;EAOT,OAAO,4BAA4B,OAJR,CAAC,GAAG,mBAAmB,CAC/C,MAAM,MAAM,UAAU,KAAK,QAAQ,MAAM,MAAM,CAC/C,KAAK,EAAE,iBAAiB,WAEiC,CAAC;GAC7D;;AAGJ,MAAM,kCACJ,QACA,aACA,YAIS;CACT,MAAM,EAAE,sBAAsB;CAC9B,MAAM,4BACJ,QAAQ,6BAA6B;CAEvC,IAAI,YAAY,WAAW,GACzB;CAGF,IACE,kBAAkB,SAAS,KACxB,kBAAkB,WAAW,YAAY,QAC5C;EACA,KAAK,MAAM,CAAC,OAAO,oBAAoB,kBAAkB,SAAS,EAAE;GAClE,MAAM,qBAAqB,OAAO,IAAI,gBAAgB;GACtD,IAAI,oBAAoB;IACtB,mBAAmB,KAAK,YAAY,OAAO;IAC3C;;GAGF,OAAO,IAAI,iBAAiB,CAAC,YAAY,OAAO,CAAC;;EAEnD;;CAGF,MAAM,sBAAsB,0BAA0B,GAAG,GAAG;CAC5D,IAAI,wBAAwB,KAAA,GAC1B;CAGF,MAAM,qBAAqB,OAAO,IAAI,oBAAoB;CAC1D,IAAI,oBAAoB;EACtB,mBAAmB,KAAK,GAAG,YAAY;EACvC;;CAGF,OAAO,IAAI,qBAAqB,CAAC,GAAG,YAAY,CAAC;;AAGnD,MAAM,yBACJ,eACY;CACZ,IAAI,OAAO,WAAW,YAAY,UAChC,OAAO,WAAW,QAAQ,WAAW,qBAAqB;CAG5D,IAAI,WAAW,QAAQ,MAAM,UAAU,MAAM,SAAS,WAAW,EAC/D,OAAO;CAGT,IAAI,WAAW,QAAQ,WAAW,GAChC,OAAO;CAGT,MAAM,aAAa,WAAW,QAAQ;CACtC,IAAI,WAAW,SAAS,QACtB,OAAO;CAGT,OAAO,WAAW,KAAK,WAAW,qBAAqB;;AAGzD,MAAM,+BACJ,YAKU;CACV,MAAM,cAA+C,EAAE;CACvD,MAAM,aAAwC,EAAE;CAChD,MAAM,cAAwC,EAAE;CAEhD,KAAK,MAAM,CAAC,OAAO,UAAU,QAAQ,SAAS,EAAE;EAC9C,IAAI,MAAM,SAAS,eAAe;GAChC,YAAY,KAAK,MAAM;GACvB;;EAEF,IAAI,MAAM,SAAS,QAAQ;GACzB,WAAW,KAAK,MAAM;GACtB;;EAEF,IAAI,kBAAkB,MAAM,EAAE;GAC5B,YAAY,KAAK;IAAE,YAAY;IAAO;IAAO,CAAC;GAC9C;;EAGF,OAAO;;CAGT,OAAO;EACL;EACA;EACA;EACD;;AAGH,MAAM,kCACJ,aACA,gBACoC;CACpC,IAAI,YAAY,WAAW,GACzB,OAAO;CAGT,MAAM,iBAAiB,YAAY,QAChC,EAAE,iBAAiB,WAAW,SAAS,WACzC;CACD,MAAM,6BAA6B,8BAA8B,YAAY;CAC7E,MAAM,2BAA2B,2BAA2B,QAAQ,UAClE,sBAAsB,YAAY,OAAO,CAC1C;CAED,MAAM,+CAA+B,IAAI,KAGtC;CACH,IAAI,uBAAuB;CAC3B,IAAI,8BAA8B;CAIlC,IAAI,eAAe,SAAS,KAAK,yBAAyB,SAAS,GAAG;EACpE,MAAM,uBAAuB,KAAK,IAChC,yBAAyB,QACzB,eAAe,OAChB;EACD,MAAM,mBAAmB,eAAe,MAAM,GAAG,qBAAqB;EACtE,MAAM,wBAAwB,IAAI,IAChC,iBAAiB,KAAK,EAAE,YAAY,MAAM,CAC3C;EACD,MAAM,8BAA8B,yBAAyB,MAC3D,GACA,qBACD;EACD,MAAM,+BAA+B,IAAI,IAAI,4BAA4B;EAEzE,+BACE,8BACA,kBACA,EACE,mBAAmB,6BACpB,CACF;EACD,8BAA8B,2BAA2B,QACtD,UAAU,CAAC,6BAA6B,IAAI,MAAM,CACpD;EACD,uBAAuB,YAAY,QAChC,EAAE,YAAY,YACb,WAAW,SAAS,cAAc,CAAC,sBAAsB,IAAI,MAAM,CACtE;;CAIH,+BACE,8BACA,sBACA;EACE,mBAAmB;EACnB,2BAA2B;EAC5B,CACF;CAED,OAAO,gCACL,aACA,6BACD;;AAGH,MAAM,2BACJ,YAC4C;CAC5C,MAAM,mBAAmB,4BAA4B,QAAQ;CAC7D,IAAI,CAAC,kBACH,OAAO;CAGT,MAAM,EAAE,aAAa,YAAY,gBAAgB;CACjD,IACE,YAAY,WAAW,KACnB,WAAW,WAAW,KAAK,YAAY,WAAW,GAEtD,OAAO;CAQT,OAAO,+BAJL,WAAW,WAAW,IACpB,cACA,gBAAgB,aAAa,WAAW,EAEa,YAAY;;AAGvE,MAAM,mBACJ,aACA,eACoC;CACpC,IAAI,YAAY,WAAW,WAAW,QACpC,OAAO,YAAY,KAAK,IAAI,MAAM,qBAAqB,IAAI,WAAW,GAAG,CAAC;CAG5E,MAAM,YAAY,YAAY,SAAS;CACvC,OAAO,YAAY,KAAK,IAAI,MAC1B,MAAM,YAAY,sBAAsB,IAAI,WAAW,GAAG,GAC3D;;AAGH,MAAa,kCACX,qBACS;CACT,KAAK,MAAM,OAAO,iBAAiB,UAAU;EAC3C,IAAI,IAAI,SAAS,UAAU,CAAC,MAAM,QAAQ,IAAI,QAAQ,EAAE;EAKxD,IAAI,CAHqB,IAAI,QAAQ,MAClC,UAAU,MAAM,SAAS,iBAAiB,WAAW,MAAM,CAEzC,EAAE;EAEvB,IAAI,UAAU,IAAI,QAAQ,QACvB,UACC,MAAM,SAAS,UACZ,MAAM,KAAK,MAAM,KAAA,eACvB;;;AAIL,MAAa,4BACX,kBACA,YAGS;CACT,MAAM,mBAAmB,iBAAiB,SAAS,SAAS;CAE5D,KAAK,MAAM,CAAC,OAAO,QAAQ,iBAAiB,SAAS,SAAS,EAAE;EAC9D,IAAI,SAAS,mBAAmB,UAAU,kBAAkB;EAE5D,IAAI,IAAI,SAAS,UAAU,CAAC,MAAM,QAAQ,IAAI,QAAQ,EAAE;EAExD,MAAM,gBAAgB,wBAAwB,IAAI,QAAQ;EAC1D,IAAI,eACF,IAAI,UAAU;;;AAMpB,MAAa,oBAAoB,YAA4C;CAC3E,IAAI,CAAC,QAAQ,SAAS,QAAQ,MAAM,WAAW,GAC7C;CAGF,QAAQ,QAAQ,QAAQ,MAAM,SAAS,SAAS;EAC9C,IAAI,KAAK,SAAS,0BAChB,OAAO,CACL;GACE,GAAG;GACH,aAAa;GACd,CACF;EAGH,OAAO,CAAC,KAAK;GACb;;AAGJ,MAAM,cAAc,UAAoC;CACtD,OACE,MAAM,QAAQ,MAAM,QAAQ,IACzB,MAAM,QAAQ,MAAM,MAAM,EAAE,SAAS,iBAAiB;;AAO7D,MAAM,qBAAqB,YAA4C;CACrE,IAAI,MAAM,QAAQ,QAAQ,OAAO,EAC/B,KAAK,MAAM,SAAS,QAAQ,QAAQ;EAClC,MAAM,eAAe,MAAM;EAC3B,IAAI,gBAAgB,OAAO,iBAAiB,UAAU;GACpD,MAAM,EAAE,OAAO,GAAG,SAAS;GAC3B,MAAM,gBAAgB;;;;AAQ9B,MAAM,6BAA6B,YAA4C;CAC7E,MAAM,WAAW,QAAQ;CACzB,IAAI,CAAC,YAAY,OAAO,aAAa,UAAU;EAC7C,IAAI,aAAa,KAAA,GACf,OAAO,QAAQ;EAEjB;;CAGF,OAAO,QAAQ;CAEf,KAAK,IAAI,IAAI,QAAQ,SAAS,SAAS,GAAG,KAAK,GAAG,KAAK;EACrD,MAAM,UAAU,QAAQ,SAAS;EAEjC,IAAI,OAAO,QAAQ,YAAY,UAAU;GACvC,QAAQ,UAAU,CAChB;IACE,MAAM;IACN,MAAM,QAAQ;IACd,eAAe,EAAE,GAAG,UAAU;IAC/B,CACF;GACD;;EAGF,IAAI,CAAC,MAAM,QAAQ,QAAQ,QAAQ,EAAE;EAErC,KAAK,IAAI,IAAI,QAAQ,QAAQ,SAAS,GAAG,KAAK,GAAG,KAAK;GACpD,MAAM,QAAQ,QAAQ,QAAQ;GAC9B,IACE,MAAM,SAAS,UACZ,MAAM,SAAS,WACf,MAAM,SAAS,cACf,MAAM,SAAS,eAElB;GAEF,MAAM,kBAAkB,EAAE,GAAG,UAAU;GACvC;;;;AAMN,MAAM,gCACJ,YACS;CACT,IAAI,CAAC,QAAQ,SAAS,QAAQ,MAAM,WAAW,GAAG;CAElD,KAAK,MAAM,QAAQ,QAAQ,OAAO;EAChC,MAAM,WAAW;EACjB,IAAI,2BAA2B,UAC7B,OAAO,SAAS;;;AAOtB,MAAM,iCACJ,YACS;CACT,KAAK,MAAM,OAAO,QAAQ,UACxB,IAAI,IAAI,SAAS,eAAe,MAAM,QAAQ,IAAI,QAAQ,EACxD,IAAI,UAAU,IAAI,QAAQ,QAAQ,UAAU;EAC1C,IAAI,MAAM,SAAS,YAAY,OAAO;EAStC,OACE,MAAM,aAAa,iBAChB,MAAM,aACN,CAAC,MAAM,UAAU,SAAS,IAAI;GAEnC;;AAKR,MAAa,6BACX,SACA,kBACS;CACT,kBAAkB,QAAQ;CAC1B,0BAA0B,QAAQ;CAClC,6BAA6B,QAAQ;CACrC,8BAA8B,QAAQ;CAEtC,MAAM,cAAc,QAAQ,QAAQ,SAAS;CAI7C,MAAM,aAAa,QAAQ;CAC3B,MAAM,eAAe,YAAY,SAAS,SAAS,YAAY,SAAS;CAExE,IAAI,eAAe,aAAa,SAAS,qBAAqB,CAAC,cAAc;EAC3E,QAAQ,WAAW,EACjB,MAAM,YACP;EAED,IAAI,CAAC,aACH,QAAQ,SAAS,UAAU;EAE7B,IAAI,uCAAuC,QAAQ,MAAM,EACvD,QAAQ,SAAS,UAAU;EAE7B,IAAI,SACF,QAAQ,eAAe,UAAU,2BAA2B,QAAQ,MAAM;EAC5E,IAAI,WAAW,UAAU,WAAW,WAClC,SAAS;EAEX,MAAM,kBAAkB,cAAc,aAAa,SAAS;EAC5D,IAAI,mBAAmB,CAAC,gBAAgB,SAAS,OAAO,EACtD,SAAS,gBAAgB,GAAG,GAAG;EAOjC,QAAQ,gBAAgB,EACd,QACT;;CAGH,MAAM,gBAAgB,eAAe,aAAa;CAClD,IAAI,CAAC,eAAe,mBAAmB;EACrC,MAAM,mBAAmB,eAAe;EACxC,IAAI,CAAC,oBAAoB,iBAAiB,WAAW;OAC/C,QAAQ,eAAe,QAAQ;IACjC,OAAO,QAAQ,cAAc;IAC7B,IAAI,OAAO,KAAK,QAAQ,cAAc,CAAC,WAAW,GAChD,OAAO,QAAQ;;;EAKrB,IAAI,cACF,OAAO,QAAQ;OACV;GACL,MAAM,eAAe,eAAe,uBAAuB;GAC3D,IAAI,QAAQ,UAAU,SAAS,YAC7B,QAAQ,WAAW;IACjB,MAAM;IACN,eAAe,eAAe;IAC/B;;;;;;ACv8BT,MAAMC,YAAS,oBAAoB,gCAAgC;AAEnE,eAAsB,0BACpB,GACmB;CACnB,MAAM,WAAW,EAAE,IAAI,MAAM,WAAW;CAExC,OAAO,MAAM,qCAAqC,GAAG;EAAE,SAAA,MADjC,EAAE,IAAI,MAAgC;EACI;EAAU,CAAC;;AAG7E,eAAsB,qCACpB,GACA,SAImB;CACnB,MAAM,EAAE,SAAS,kBAAkB,aAAa;CAChD,wBAAwB,iBAAiB;CACzC,MAAM,UAAU,iBAAiB,MAAM,MAAM;CAE7C,MAAM,iBAAiB,MAAM,sBAAsB,SAAS;CAC5D,IAAI,CAAC,gBACH,OAAO,EAAE,KACP,EACE,OAAO;EACL,SAAS,aAAa,SAAS;EAC/B,MAAM;EACP,EACF,EACD,IACD;CAGH,MAAM,cAAc,eAAe,SAAS;CAgB5C,MAAM,aAAa,MAAM,cAJH,kBAAkB,kBATpC,eAAe,SAAS,uBACrB,eAAe,SAAS,qBAE3B;EACE,YAAY,aAAa;EACzB,wBAAwB,aAAa,0BAA0B,EAAE;EAClE,GACD,KAAA,EAMgD,EAF9B,oBAAoB,QAEyB,CAAC;CACpE,MAAM,kBAAkB,WAAW,QAAQ,WAAW;CAEtD,UAAO,MAAM,iCAAiC;EAC5C;EACA,OAAO,iBAAiB;EACxB,cAAc;EACf,CAAC;CAEF,OAAO,EAAE,KAAK,EACZ,cAAc,iBACf,CAAC;;;;ACnDJ,MAAa,2BACX,SACA,YAAuD,sBACf;CACxC,MAAM,gBAAgB,UAAU,QAAQ;CACxC,IAAI,eACF,OAAO;EACL,UAAU;EACV,OAAO;EACR;CAGH,OAAO;EACL,UAAU;EACV,OAAO,oBAAoB,QAAQ,MAAM,CAAC;EAC3C;;;;;;AAOH,eAAe,wBACb,GACA,SAC0B;CAC1B,IAAI,CAAC,QAAQ,MAAM,WAAW,SAAS,EAAE,OAAO;CAEhD,MAAM,SAAS,oBAAoB;CACnC,IAAI,CAAC,QAAQ,OAAO;CAGpB,MAAM,QAAQ,QAAQ,MAAM,WAAW,KAAK,IAAI;CAEhD,MAAM,MAAM,MAAM,MAChB,sDACA;EACE,QAAQ;EACR,SAAS;GACP,gBAAgB;GAChB,aAAa;GACb,qBAAqB;GACrB,kBAAkB;GACnB;EACD,MAAM,KAAK,UAAU;GAAE,GAAG;GAAS;GAAO,CAAC;EAC5C,CACF;CAED,IAAI,CAAC,IAAI,IAAI;EACX,QAAQ,KACN,kCACA,IAAI,QACJ,MAAM,IAAI,MAAM,CAAC,YAAY,GAAG,EAChC,+BACD;EACD,OAAO;;CAGT,MAAM,SAAU,MAAM,IAAI,MAAM;CAChC,QAAQ,KAAK,gCAAgC,OAAO,aAAa;CACjE,OAAO,EAAE,KAAK,OAAO;;;;;;;;;AAUvB,eAAsB,kBAAkB,GAAY;CAClD,MAAM,mBAAmB,MAAM,EAAE,IAAI,MAAgC;CACrE,iBAAiB,QAAQ,mBAAmB,iBAAiB,MAAM;CACnE,wBAAwB,iBAAiB;CAEzC,MAAM,qBAAqB,MAAM,oCAC/B,iBAAiB,MAClB;CACD,IAAI,oBAAoB;EACtB,iBAAiB,QAAQ,mBAAmB;EAC5C,OAAO,MAAM,qCAAqC,GAAG;GACnD,SAAS;GACT,UAAU,mBAAmB;GAC9B,CAAC;;CAIJ,MAAM,kBAAkB,MAAM,wBAAwB,GAAG,iBAAiB;CAC1E,IAAI,iBAAiB,OAAO;CAG5B,MAAM,gBAAgB,EAAE,IAAI,OAAO,iBAAiB;CAEpD,MAAM,gBAAgB,kBAAkB,iBAAiB;CAEzD,MAAM,iBAAiB,iBAAiB;CACxC,MAAM,UAAU,wBAAwB,eAAe;CAEvD,MAAM,gBAAgB,QAAQ;CAC9B,iBAAiB,QAAQ,cAAc;CAEvC,IAAI,QAAQ,UACV,QAAQ,KACN,UAAU,eAAe,kDAC1B;CAGH,MAAM,aAAa,MAAM,cAAc,eAAe,cAAc;CAEpE,IAAI,iBAAiB,SAAS,iBAAiB,MAAM,SAAS,GAAG;EAC/D,IAAI,2BAA2B;EAC/B,IAAI,eAAe;GACjB,MAAM,cAAc,iBAAiB,MAAM;GAC3C,2BAA2B,CAAC,iBAAiB,MAAM,MAChD,SACC,KAAK,KAAK,WAAW,QAAQ,IACzB,KAAK,SAAS,WAAW,gBAAgB,EAChD;;EAEH,IAAI;OACE,iBAAiB,MAAM,WAAW,SAAS,EAE7C,WAAW,QAAQ,WAAW,QAAQ;QACjC,IAAI,iBAAiB,MAAM,WAAW,OAAO,EAClD,WAAW,QAAQ,WAAW,QAAQ;;;CAK5C,IAAI,kBAAkB,WAAW,QAAQ,WAAW;CACpD,IAAI,iBAAiB,MAAM,WAAW,SAAS,EAC7C,kBAAkB,KAAK,MAAM,kBAAkB,0BAA0B,CAAC;CAG5E,QAAQ,KAAK,gBAAgB,gBAAgB;CAE7C,OAAO,EAAE,KAAK,EACZ,cAAc,iBACf,CAAC;;;;AC5JJ,MAAM,uBAAuB,CAAC,WAAW,YAAY;AASrD,MAAa,+BAA+B,YAA4B;CACtE,MAAM,uBAAO,IAAI,KAAK,UAAU,IAAK;CACrC,OAAO,OAAO,MAAM,KAAK,SAAS,CAAC,GAAG,OAAO,QAAQ,GAAG,KAAK,gBAAgB;;AAG/E,MAAa,2BAA2B,UAAyB;CAC/D,IAAI,CAAC,SAAS,OAAO,UAAU,UAC7B;CAGF,MAAM,cAAc;CACpB,IAAI,YAAY,SAAS,qBACvB;CAGF,MAAM,aAAa,YAAY;CAC/B,IAAI,CAAC,cAAc,OAAO,eAAe,UACvC;CAGF,MAAM,WACJ,OAAO,YAAY,cAAc,WAAW,YAAY,YAAY;CACtE,MAAM,kBAAkB;CACxB,MAAM,UACJ,OAAO,gBAAgB,YAAY,YACjC,gBAAgB,UAChB;CACJ,MAAM,eACJ,OAAO,gBAAgB,kBAAkB,YACvC,gBAAgB,gBAChB;CAEJ,KAAK,MAAM,SAAS,sBAAsB;EACxC,MAAM,SAAS,gBAAgB;EAC/B,IAAI,CAAC,uBAAuB,OAAO,EACjC;EAGF,MAAM,UAAyB,EAAE;EACjC,IAAI,YAAY,MACd,QAAQ,KAAK,WAAW,UAAU;EAEpC,IAAI,iBAAiB,MACnB,QAAQ,KAAK,iBAAiB,eAAe;EAE/C,QAAQ,KACN,QAAQ,OAAO,aAAa,IAC5B,YAAY,4BAA4B,OAAO,SAAS,GACzD;EAED,MAAM,QACJ,WACE,SAAS,MAAM,eAAe,SAAS,KACvC,SAAS,MAAM;EACnB,QAAQ,IAAI,GAAG,MAAM,IAAI,QAAQ,KAAK,KAAK,GAAG;;;AAIlD,MAAM,0BACJ,UACkC;CAClC,IAAI,CAAC,SAAS,OAAO,UAAU,UAC7B,OAAO;CAGT,MAAM,SAAS;CACf,OACE,OAAO,OAAO,wBAAwB,YACnC,OAAO,OAAO,aAAa,YAC3B,OAAO,OAAO,iBAAiB,YAC/B,OAAO,OAAO,mBAAmB;;;;ACpExC,SAAS,gBAAgB,OAAsC;CAC7D,IAAI,CAAC,MAAM,kBACT,OAAO;CAGT,OAAO,OAAO,OAAO,MAAM,UAAU,CAAC,MACnC,OAAO,GAAG,wBAAwB,MAAM,kBAC1C;;AAGH,SAAgB,gCACd,OACA,OACiC;CACjC,MAAM,SAA0C,EAAE;CAElD,IAAI,MAAM,QAAQ,WAAW,GAAG;EAK9B,IAAI,MAAM,OACR,uBAAuB,OAAO,QAAQ,MAAM;EAE9C,OAAO;;CAGT,MAAM,SAAS,MAAM,QAAQ;CAC7B,MAAM,EAAE,UAAU;CAElB,mBAAmB,OAAO,QAAQ,MAAM;CAExC,mBAAmB,OAAO,OAAO,OAAO;CAExC,cAAc,OAAO,OAAO,OAAO;CAEnC,gBAAgB,OAAO,OAAO,OAAO;CAErC,aAAa,QAAQ,OAAO;EAAE;EAAQ;EAAO,CAAC;CAE9C,OAAO;;AAGT,SAAgB,kCACd,OACiC;CACjC,MAAM,SAA0C,EAAE;CAClD,uBAAuB,OAAO,OAAO;CACrC,OAAO;;AAGT,SAAS,uBACP,OACA,QACA,OACM;CACN,IAAI,CAAC,MAAM,qBACT;CAGF,IAAI,OAAO,OACT,MAAM,oBAAoB,QAAQ,iCAAiC,MAAM;CAG3E,OAAO,KAAK,MAAM,qBAAqB,EACrC,MAAM,gBACP,CAAC;CACF,MAAM,sBAAsB,KAAA;CAC5B,MAAM,mBAAmB;;AAG3B,SAAS,aACP,QACA,OACA,SAIA;CACA,MAAM,EAAE,QAAQ,UAAU;CAC1B,IAAI,OAAO,iBAAiB,OAAO,cAAc,SAAS,GAAG;EAC3D,IAAI,MAAM,kBAAkB;GAC1B,MAAM,gBAAgB,gBAAgB,MAAM;GAC5C,QAAQ,OAAO,KAAK;IAClB,MAAM;IACN,OAAO,MAAM;IACd,CAAC;GACF,MAAM,mBAAmB;GACzB,MAAM;GACN,IAAI,CAAC,eACH,sBAAsB,OAAO,OAAO,QAAQ,MAAM;;EAItD,qBAAqB,OAAO,OAAO;EAEnC,MAAM,sBAAsB;GAC1B,MAAM;GACN,OAAO;IACL,aAAa,+BAA+B,OAAO,cAAc;IACjE,eAAe;IAChB;GACD,OAAO,iCAAiC,MAAM;GAC/C;EACD,IAAI,MAAM,OACR,uBAAuB,OAAO,QAAQ,MAAM;;;AAKlD,SAAS,iCACP,OACkD;CAClD,MAAM,EAAE,cAAc,qBAAqB,gBACzC,0BAA0B,MAAM;CAElC,OAAO;EACL,cAAc;EACd,eAAe,MAAM,OAAO,qBAAqB;EACjD,GAAI,MAAM,OAAO,uBAAuB,gCAClC,KAAA,KAAa,EACjB,6BAA6B,qBAC9B;EACD,GAAI,MAAM,OAAO,uBAAuB,kBAAkB,KAAA,KAAa,EACrE,yBAAyB,cAC1B;EACF;;AAGH,SAAS,0BAA0B,OAIjC;CACA,MAAM,eAAe,MAAM,OAAO,iBAAiB;CACnD,MAAM,eAAe,MAAM,OAAO,uBAAuB,iBAAiB;CAC1E,MAAM,sBACJ,MAAM,OAAO,uBAAuB,+BAA+B;CAErE,OAAO;EACL;EACA;EACA,aAAa,KAAK,IAAI,GAAG,eAAe,eAAe,oBAAoB;EAC5E;;AAGH,SAAS,gBACP,OACA,OACA,QACA;CACA,IAAI,MAAM,cAAc,MAAM,WAAW,SAAS,GAAG;EACnD,yBAAyB,OAAO,OAAO;EAEvC,iCAAiC,OAAO,QAAQ,MAAM;EAEtD,KAAK,MAAM,YAAY,MAAM,YAAY;GACvC,IAAI,SAAS,MAAM,SAAS,UAAU,MAAM;IAE1C,IAAI,MAAM,kBAAkB;KAE1B,OAAO,KAAK;MACV,MAAM;MACN,OAAO,MAAM;MACd,CAAC;KACF,MAAM;KACN,MAAM,mBAAmB;;IAG3B,MAAM,sBAAsB,MAAM;IAClC,MAAM,UAAU,SAAS,SAAS;KAChC,IAAI,SAAS;KACb,MAAM,SAAS,SAAS;KACxB;KACD;IAED,OAAO,KAAK;KACV,MAAM;KACN,OAAO;KACP,eAAe;MACb,MAAM;MACN,IAAI,SAAS;MACb,MAAM,SAAS,SAAS;MACxB,OAAO,EAAE;MACV;KACF,CAAC;IACF,MAAM,mBAAmB;;GAG3B,IAAI,SAAS,UAAU,WAAW;IAChC,MAAM,eAAe,MAAM,UAAU,SAAS;IAG9C,IAAI,cACF,OAAO,KAAK;KACV,MAAM;KACN,OAAO,aAAa;KACpB,OAAO;MACL,MAAM;MACN,cAAc,SAAS,SAAS;MACjC;KACF,CAAC;;;;;AAOZ,SAAS,iCACP,OACA,QACA,OACA;CACA,IAAI,MAAM,oBAAoB,CAAC,gBAAgB,MAAM,EAAE;EACrD,OAAO,KAAK;GACV,MAAM;GACN,OAAO,MAAM;GACd,CAAC;EACF,MAAM;EACN,MAAM,mBAAmB;;CAE3B,sBAAsB,OAAO,QAAQ,MAAM;;AAG7C,SAAS,cACP,OACA,OACA,QACA;CACA,IAAI,MAAM,WAAW,MAAM,QAAQ,SAAS,GAAG;EAC7C,yBAAyB,OAAO,OAAO;EAEvC,IAAI,gBAAgB,MAAM,IAAI,iBAAiB,MAAM,EAAE;GACrD,MAAM,kBAAkB,GAAG,MAAM,mBAAmB,KAAK,MAAM;GAC/D;;EAGF,IAAI,CAAC,MAAM,kBAAkB;GAC3B,OAAO,KAAK;IACV,MAAM;IACN,OAAO,MAAM;IACb,eAAe;KACb,MAAM;KACN,MAAM;KACP;IACF,CAAC;GACF,MAAM,mBAAmB;;EAG3B,OAAO,KAAK;GACV,MAAM;GACN,OAAO,MAAM;GACb,OAAO;IACL,MAAM;IACN,MAAM,MAAM;IACb;GACF,CAAC;;CAIJ,IACE,MAAM,YAAY,MACf,MAAM,oBACN,MAAM,iBAAiB,SAAS,KAChC,MAAM,mBACT;EACA,OAAO,KACL;GACE,MAAM;GACN,OAAO,MAAM;GACb,OAAO;IACL,MAAM;IACN,WAAW,MAAM;IAClB;GACF,EACD;GACE,MAAM;GACN,OAAO,MAAM;GACd,CACF;EACD,MAAM;EACN,MAAM,oBAAoB;;;AAI9B,SAAS,iBAAiB,OAAuB;CAC/C,OAAO,QAAQ,MAAM,cAAc,MAAM,WAAW,SAAS,EAAE;;AAGjE,SAAS,qBACP,OACA,QACM;CACN,IAAI,CAAC,MAAM,iBACT;CAGF,IAAI,CAAC,MAAM,kBAAkB;EAC3B,OAAO,KAAK;GACV,MAAM;GACN,OAAO,MAAM;GACb,eAAe;IACb,MAAM;IACN,MAAM;IACP;GACF,CAAC;EACF,MAAM,mBAAmB;;CAG3B,OAAO,KACL;EACE,MAAM;EACN,OAAO,MAAM;EACb,OAAO;GACL,MAAM;GACN,MAAM,MAAM;GACb;EACF,EACD;EACE,MAAM;EACN,OAAO,MAAM;EACd,CACF;CACD,MAAM,kBAAkB,KAAA;CACxB,MAAM,mBAAmB;CACzB,MAAM;;AAGR,SAAS,mBACP,OACA,QACA,OACA;CACA,IAAI,CAAC,MAAM,kBAAkB;EAC3B,MAAM,EAAE,cAAc,qBAAqB,gBACzC,0BAA0B,MAAM;EAElC,OAAO,KAAK;GACV,MAAM;GACN,SAAS;IACP,IAAI,MAAM;IACV,MAAM;IACN,MAAM;IACN,SAAS,EAAE;IACX,OAAO,MAAM;IACb,aAAa;IACb,eAAe;IACf,OAAO;KACL,cAAc;KACd,eAAe;KACf,GAAI,MAAM,OAAO,uBAAuB,gCAClC,KAAA,KAAa,EACjB,6BAA6B,qBAC9B;KACD,GAAI,MAAM,OAAO,uBAAuB,kBAClC,KAAA,KAAa,EACjB,yBAAyB,cAC1B;KACF;IACF;GACF,CAAC;EACF,MAAM,mBAAmB;;;AAI7B,SAAS,sBACP,OACA,QACA,OACA;CACA,IAAI,MAAM,oBAAoB,MAAM,iBAAiB,SAAS,GAAG;EAC/D,OAAO,KACL;GACE,MAAM;GACN,OAAO,MAAM;GACb,eAAe;IACb,MAAM;IACN,UAAU;IACX;GACF,EACD;GACE,MAAM;GACN,OAAO,MAAM;GACb,OAAO;IACL,MAAM;IACN,UAAU;IACX;GACF,EACD;GACE,MAAM;GACN,OAAO,MAAM;GACb,OAAO;IACL,MAAM;IACN,WAAW,MAAM;IAClB;GACF,EACD;GACE,MAAM;GACN,OAAO,MAAM;GACd,CACF;EACD,MAAM;;;AAIV,SAAS,mBACP,OACA,OACA,QACA;CACA,MAAM,gBACJ,MAAM,kBAAkB,MAAM,qBAAqB,MAAM;CAC3D,IAAI,iBAAiB,cAAc,SAAS,GAAG;EAI7C,IAAI,MAAM,kBAAkB;GAC1B,MAAM,UAAU;GAChB,MAAM,iBAAiB,KAAA;GACvB,MAAM,oBAAoB,KAAA;GAC1B,MAAM,YAAY,KAAA;GAClB;;EAGF,IAAI,CAAC,MAAM,mBAAmB;GAC5B,OAAO,KAAK;IACV,MAAM;IACN,OAAO,MAAM;IACb,eAAe;KACb,MAAM;KACN,UAAU;KACX;IACF,CAAC;GACF,MAAM,oBAAoB;;EAG5B,OAAO,KAAK;GACV,MAAM;GACN,OAAO,MAAM;GACb,OAAO;IACL,MAAM;IACN,UAAU;IACX;GACF,CAAC;;;AAIN,SAAS,yBACP,OACA,QACM;CACN,IAAI,MAAM,mBAAmB;EAC3B,OAAO,KACL;GACE,MAAM;GACN,OAAO,MAAM;GACb,OAAO;IACL,MAAM;IACN,WAAW;IACZ;GACF,EACD;GACE,MAAM;GACN,OAAO,MAAM;GACd,CACF;EACD,MAAM;EACN,MAAM,oBAAoB;;;AAI9B,SAAgB,sCAAgE;CAC9E,OAAO;EACL,MAAM;EACN,OAAO;GACL,MAAM;GACN,SACE;GACH;EACF;;;;ACtaH,MAAM,eAAe;AACrB,MAAM,8BAA8B;AACpC,MAAM,iCAAiC;AAGvC,MAAa,8BAA8B;AAC3C,MAAM,sCAAsC;AAE5C,MAAM,0BAA0B,YAC9B,QAAQ,eAAe,UAAU,2BAA2B,QAAQ,MAAM;AAE5E,MAAM,uBACJ,oBACA,oBACkB;CAClB,IAAI,CAAC,oBACH,OAAO;CAGT,MAAM,4BAA4B,iBAAiB,MAAM,IAAI;CAC7D,IAAI,CAAC,2BACH,OAAO;CAGT,OAAO,GAAG,mBAAmB,SAAS;;AAGxC,MAAa,gDACX,SACA,oBACqB;CACrB,MAAM,QAAkC,EAAE;CAC1C,MAAM,aAAa,iBAAiB,QAAQ,MAAM;CAClD,MAAM,oBAAoB,gCAAgC;EACxD,OAAO,QAAQ;EACf,OAAO,QAAQ;EAChB,CAAC;CACF,MAAM,mBAAqC;EACzC,eAAe,QAAQ,SAAS,EAAE;EAClC;EACA,iCAAiB,IAAI,KAAK;EAC3B;CAED,KAAK,MAAM,WAAW,QAAQ,UAC5B,MAAM,KACJ,GAAG,iBAAiB,SAAS,QAAQ,OAAO,YAAY,iBAAiB,CAC1E;CAGH,MAAM,mBACJ,MAAM,QAAQ,QAAQ,MAAM,IAAI,QAAQ,MAAM,SAAS;CACzD,MAAM,kBAAkB,sBACtB,QAAQ,OACR,kBACD;CACD,MAAM,aAAa,2BACjB,QAAQ,aACR,kBACD;CAGD,MAAM,EAAE,WAAW,2BAA2B,oBAC5C,QAAQ,UAAU,QACnB;CAGD,MAAM,kBADe,eAAe,UACA,EAAE,iBAAiB,MAAM,IAAI;CAEjE,MAAM,iBAAiB,oBADI,0BAA0B,iBAGnD,gBACD;CAED,MAAM,mBAAqC;EACzC,OAAO,QAAQ;EACf;EACA,cAAc,sBAAsB,QAAQ,QAAQ,QAAQ,MAAM;EAClE,aAAa;EACb,OAAO,QAAQ,SAAS;EACxB,mBAAmB,KAAK,IAAI,QAAQ,YAAY,MAAM;EACtD,OAAO;EACP,aAAa;EACb,UAAU,QAAQ,WAAW,EAAE,GAAG,QAAQ,UAAU,GAAG;EAEvD,QAAQ,QAAQ,UAAU;EAC1B,OAAO;EACP,qBAAqB;EACrB,WAAW;GACT,QAAQ,uBAAuB,QAAQ;GACvC,SAAS;GACT,SAAS,kBAAkB,QAAQ,GAAG,cAAc;GACrD;EACD,SAAS,CAAC,8BAA8B;EACzC;CAED,IAAI,kBACF,iBAAiB,mBAAmB;CAGtC,OAAO;;AAcT,MAAa,oCACX,eACW;CACX,OAAO,GAAG,8BAA8B,WAAW,oBAAoB,iCAAiC,WAAW;;AAGrH,MAAa,oCACX,cACkC;CAClC,IAAI,UAAU,WAAW,4BAA4B,EAAE;EACrD,MAAM,MAAM,UAAU,MAAM,EAAmC;EAC/D,MAAM,iBAAiB,IAAI,QAAQ,+BAA+B;EAElE,IAAI,kBAAkB,KAAK,mBAAmB,IAAI,SAAS,GACzD;EAGF,MAAM,oBAAoB,IAAI,MAAM,GAAG,eAAe;EACtD,MAAM,KAAK,IAAI,MAAM,iBAAiB,EAAE;EAExC,IAAI,CAAC,mBACH;EAGF,OAAO;GACL;GACA;GACD;;;AAML,MAAM,oBACJ,SACA,OACA,YACA,UAC6B;CAC7B,IAAI,QAAQ,SAAS,QACnB,OAAO,qBAAqB,SAAS,MAAM;CAG7C,IAAI,QAAQ,SAAS,UACnB,OAAO,uBAAuB,QAAQ;CAGxC,OAAO,0BAA0B,SAAS,OAAO,YAAY,MAAM;;AAGrE,MAAM,0BACJ,YAC6B;CAC7B,IAAI,OAAO,QAAQ,YAAY,UAC7B,OAAO,CAAC,cAAc,aAAa,QAAQ,QAAQ,CAAC;CAGtD,MAAM,UAAU,QAAQ,QAAQ,KAAK,UAAU,kBAAkB,MAAM,KAAK,CAAC;CAC7E,OAAO,QAAQ,SAAS,IAAI,CAAC,cAAc,aAAa,QAAQ,CAAC,GAAG,EAAE;;AAGxE,MAAM,wBACJ,SACA,UAC6B;CAC7B,IAAI,OAAO,QAAQ,YAAY,UAC7B,OAAO,CAAC,cAAc,QAAQ,QAAQ,QAAQ,CAAC;CAGjD,IAAI,CAAC,MAAM,QAAQ,QAAQ,QAAQ,EACjC,OAAO,EAAE;CAGX,MAAM,QAAkC,EAAE;CAC1C,MAAM,iBAA8C,EAAE;CAEtD,KAAK,MAAM,SAAS,QAAQ,SAAS;EACnC,IAAI,MAAM,SAAS,eAAe;GAChC,oBAAoB,gBAAgB,OAAO,EAAE,MAAM,QAAQ,CAAC;GAC5D,MAAM,KAAK,qBAAqB,OAAO,MAAM,CAAC;GAC9C;;EAGF,MAAM,YAAY,0BAA0B,MAAM;EAClD,IAAI,UAAU,SAAS,GACrB,eAAe,KAAK,GAAG,UAAU;;CAIrC,oBAAoB,gBAAgB,OAAO,EAAE,MAAM,QAAQ,CAAC;CAE5D,OAAO;;AAGT,MAAM,6BACJ,SACA,OACA,YACA,UAC6B;CAC7B,MAAM,iBAAiB,sBACrB,OACA,QAAQ,SACR,WACD;CAED,IAAI,OAAO,QAAQ,YAAY,UAC7B,OAAO,CAAC,cAAc,aAAa,QAAQ,SAAS,eAAe,CAAC;CAGtE,IAAI,CAAC,MAAM,QAAQ,QAAQ,QAAQ,EACjC,OAAO,EAAE;CAGX,MAAM,QAAkC,EAAE;CAC1C,MAAM,iBAA8C,EAAE;CAEtD,KAAK,MAAM,SAAS,QAAQ,SAAS;EACnC,IAAI,MAAM,SAAS,YAAY;GAC7B,MAAM,gBAAgB,IAAI,MAAM,IAAI,MAAM,KAAK;GAC/C,oBAAoB,gBAAgB,OAAO;IACzC,MAAM;IACN,OAAO;IACR,CAAC;GACF,MAAM,KAAK,eAAe,OAAO,MAAM,CAAC;GACxC;;EAGF,IAAI,MAAM,SAAS,cAAc,MAAM,WAAW;GAChD,MAAM,oBAAoB,wBAAwB,MAAM;GACxD,IAAI,mBAAmB;IACrB,oBAAoB,gBAAgB,OAAO;KACzC,MAAM;KACN,OAAO;KACR,CAAC;IACF,MAAM,KAAK,kBAAkB;IAC7B;;GAGF,IAAI,MAAM,UAAU,SAAS,IAAI,EAAE;IACjC,oBAAoB,gBAAgB,OAAO;KACzC,MAAM;KACN,OAAO;KACR,CAAC;IACF,MAAM,KAAK,uBAAuB,MAAM,CAAC;IACzC;;;EAIJ,MAAM,YAAY,+BAA+B,MAAM;EACvD,IAAI,WACF,eAAe,KAAK,UAAU;;CAIlC,oBAAoB,gBAAgB,OAAO;EACzC,MAAM;EACN,OAAO;EACR,CAAC;CAEF,OAAO;;AAGT,MAAM,6BACJ,UACgC;CAChC,QAAQ,MAAM,MAAd;EACE,KAAK,QACH,OAAO,CAAC,kBAAkB,MAAM,KAAK,CAAC;EAExC,KAAK,SACH,OAAO,CAAC,mBAAmB,MAAM,CAAC;EAEpC,KAAK,YACH,OAAO,CAAC,kBAAkB,MAAM,CAAC;EAEnC,SACE,OAAO,EAAE;;;AAKf,MAAM,kCACJ,UACqC;CACrC,QAAQ,MAAM,MAAd;EACE,KAAK,QACH,OAAO,wBAAwB,MAAM,KAAK;EAE5C,SACE;;;AAKN,MAAM,uBACJ,gBACA,QACA,YACG;CACH,IAAI,eAAe,WAAW,GAC5B;CAGF,MAAM,iBAAiB,CAAC,GAAG,eAAe;CAE1C,OAAO,KAAK,cAAc,QAAQ,MAAM,gBAAgB,QAAQ,MAAM,CAAC;CACvE,eAAe,SAAS;;AAG1B,MAAM,iBACJ,MACA,SACA,WAC0B;CAC1B,MAAM;CACN;CACA;CACA,GAAI,SAAS,eAAe,QAAQ,EAAE,OAAO,GAAG,EAAE;CACnD;AAED,MAAM,yBACJ,QACA,SACA,eAC8C;CAC9C,IAAI,CAAC,YACH;CAGF,IAAI,OAAO,YAAY,UACrB,OAAO;CAGT,IAAI,CAAC,MAAM,QAAQ,QAAQ,EACzB;CAIF,IAAI,CADY,QAAQ,MAAM,UAAU,MAAM,SAAS,OAC3C,EACV;CAIF,OADmB,QAAQ,MAAM,UAAU,MAAM,SAAS,WACzC,GAAG,eAAe;;AAGrC,MAAM,oBAAoB,WAA4B;CACpD,OAAO;;AAGT,MAAM,qBAAqB,UAAqC;CAC9D,MAAM;CACN;CACD;AAED,MAAM,2BAA2B,UAAqC;CACpE,MAAM;CACN;CACD;AAED,MAAM,sBACJ,WACwB;CACxB,MAAM;CACN,WAAW,QAAQ,MAAM,OAAO,WAAW,UAAU,MAAM,OAAO;CAClE,QAAQ;CACT;AAED,MAAM,qBACJ,WACuB;CACvB,MAAM;CACN,WAAW,QAAQ,MAAM,OAAO,WAAW,UAAU,MAAM,OAAO;CAClE,UAAU,MAAM,SAAS;CAC1B;AAED,MAAM,0BACJ,UAC2B;CAG3B,MAAM,EAAE,kBAAkB,OAAO,wBAAwB,MAAM,UAAU;CAGzE,OAAO;EACL;EACA,MAAM;EACN,SAAS,uBALM,MAAM,aAAA,gBAA6B,KAAK,MAAM,SAKpB;EACzC,mBAAmB;EACpB;;AAGH,MAAM,0BACJ,aACsC;CACtC,IAAI,SAAS,WAAW,GACtB,OAAO,EAAE;CAGX,IAAI,CAAC,oCAAoC,KAAK,SAAS,EACrD,OAAO,CAAC;EAAE,MAAM;EAAgB,MAAM;EAAU,CAAC;CAGnD,OAAO,SAAS,MAAM,oCAAoC,CAAC,KAAK,UAAU;EACxE,MAAM;EACN;EACD,EAAE;;AAGL,MAAM,2BACJ,UACwC;CACxC,MAAM,aAAa,iCAAiC,MAAM,UAAU;CACpE,IAAI,CAAC,YACH;CAGF,OAAO;EACL,IAAI,WAAW;EACf,MAAM;EACN,mBAAmB,WAAW;EAC/B;;AAGH,MAAM,2BACJ,cAC6C;CAC7C,MAAM,aAAa,UAAU,YAAY,IAAI;CAE7C,IAAI,cAAc,KAAK,eAAe,UAAU,SAAS,GACvD,OAAO;EAAE,kBAAkB;EAAW,IAAI;EAAI;CAGhD,OAAO;EACL,kBAAkB,UAAU,MAAM,GAAG,WAAW;EAChD,IAAI,UAAU,MAAM,aAAa,EAAE;EACpC;;AAGH,MAAM,0BACJ,OACA,WACkC;CAClC,MAAM;CACN,SAAS,MAAM;CACf,MAAM,MAAM;CACZ,WAAW,KAAK,UAAU,MAAM,MAAM;CACtC,QAAQ;CACR,GAAI,MAAM,qBAAqB,mBAAmB,MAAM,KAAK,GAC3D,EAAE,WAAW,MAAM,MAAM,GACzB,EAAE;CACL;AAED,MAAM,wBACJ,WACgC;CAChC,MAAM;CACN,SAAS,MAAM;CACf,WAAW,mCAAmC,MAAM,MAAM;CAC1D,WAAW;CACX,QAAQ;CACT;AAED,MAAM,kBACJ,OACA,UAC8D;CAC9D,IAAI,MAAM,qBAAqB,uBAAuB,MAAM,KAAK,EAC/D,OAAO,qBAAqB,MAAM;CAGpC,OAAO,uBAAuB,OAAO,MAAM;;AAG7C,MAAM,4BACJ,WACoC;CACpC,MAAM;CACN,SAAS,MAAM;CACf,QAAQ,yBAAyB,MAAM,QAAQ;CAC/C,QAAQ,MAAM,WAAW,eAAe;CACzC;AAED,MAAM,wBACJ,OACA,UACkE;CAClE,MAAM,cAAc,MAAM,gBAAgB,IAAI,MAAM,YAAY;CAChE,IAAI,MAAM,qBAAqB,uBAAuB,eAAe,GAAG,EACtE,OAAO,uBAAuB,OAAO,MAAM,cAAc;CAG3D,OAAO,yBAAyB,MAAM;;AAGxC,MAAM,0BACJ,OACA,kBACiC;CACjC,MAAM,sBAAsB,qCAC1B,MAAM,SACN,cACD;CAED,OAAO;EACL,MAAM;EACN,SAAS,MAAM;EACf,OAAO,oBAAoB,KAAK,aAC9B,+BACE,oBAAoB,UAAU,cAAc,CAC7C,CACF;EACD,WAAW;EACX,QAAQ,MAAM,WAAW,eAAe;EACzC;;AAGH,MAAM,wCACJ,SACA,kBACkB;CAClB,MAAM,qBAAqB,0BAA0B,QAAQ;CAC7D,IAAI,mBAAmB,SAAS,GAC9B,OAAO,gBAAgB,mBAAmB;CAG5C,MAAM,WAAW,6BAA6B,QAAQ;CACtD,IAAI,UACF,OAAO,2BAA2B,SAAS,OAAO,cAAc,CAAC,KAC9D,SAAS,KAAK,KAChB;CAGH,OAAO,EAAE;;AAGX,MAAM,6BACJ,YACkB;CAClB,IAAI,CAAC,MAAM,QAAQ,QAAQ,EACzB,OAAO,EAAE;CAGX,OAAO,QAAQ,SAAS,UACtB,MAAM,SAAS,mBAAmB,CAAC,MAAM,UAAU,GAAG,EAAE,CACzD;;AAGH,MAAM,gCACJ,YACG;CACH,IAAI,OAAO,YAAY,UACrB,OAAO,2BAA2B,QAAQ;CAG5C,KAAK,MAAM,SAAS,SAAS;EAC3B,IAAI,MAAM,SAAS,QACjB;EAGF,MAAM,WAAW,2BAA2B,MAAM,KAAK;EACvD,IAAI,UACF,OAAO;;CAIX,OAAO;;AAGT,MAAM,uBACJ,UACA,kBACkB;CAClB,MAAM,OAAO,cAAc,MAAM,cAAc,UAAU,SAAS,SAAS;CAC3E,IAAI,QAAQ,mBAAmB,KAAK,KAAK,EACvC,OAAO;CAGT,MAAM,0BACJ,mBAAmB,SAAS,iDAC7B;;AAGH,MAAM,mBAAmB,cAA4C,CACnE,GAAG,IAAI,IAAI,UAAU,CACtB;AAED,MAAM,6BAA6B,YACjC,IAAI,UACF,SACA,IAAI,SACF,KAAK,UAAU,EACb,OAAO;CACL;CACA,MAAM;CACP,EACF,CAAC,EACF;CACE,QAAQ;CACR,SAAS,EAAE,gBAAgB,oBAAoB;CAChD,CACF,CACF;AAEH,MAAM,yBACJ,QACA,UACkB;CAClB,IAAI,CAAC,QACH,OAAO;CAGT,MAAM,cAAc,uBAAuB,MAAM;CAEjD,IAAI,OAAO,WAAW,UACpB,OAAO,SAAS;CAGlB,MAAM,OAAO,OACV,KAAK,OAAO,UAAU;EACrB,IAAI,UAAU,GACZ,OAAO,MAAM,OAAO,SAAS,cAAc;EAE7C,OAAO,MAAM;GACb,CACD,KAAK,IAAI;CACZ,OAAO,KAAK,SAAS,IAAI,OAAO;;AAGlC,MAAM,yBACJ,OACA,sBACuB;CACvB,IAAI,CAAC,SAAS,MAAM,WAAW,GAC7B,OAAO;CAGT,MAAM,YAAyB,EAAE;CACjC,IAAI,kBAAkB;CACtB,MAAM,sBACJ,oBAAoB,sBAAsB,MAAM,GAAG,EAAE;CAEvD,KAAK,MAAM,QAAQ,OAAO;EACxB,IAAI,uBAAuB,KAAK,KAAK,EAAE;GACrC,IAAI,qBAAqB,CAAC,iBAAiB;IACzC,UAAU,KAAK,oCAAoC,oBAAoB,CAAC;IACxE,kBAAkB;;GAEpB;;EAGF,IAAI,qBAAqB,mBAAmB,KAAK,KAAK,EAAE;GACtD,UAAU,KAAK,+BAA+B,KAAK,CAAC;GACpD;;EAGF,UAAU,KAAK,sBAAsB,KAAK,CAAC;;CAG7C,OAAO;;AAGT,MAAM,uCACJ,yBACU;CACV,MAAM;CACN,WAAW;CACX,aACE;CACF,YAAY;EACV,MAAM;EACN,YAAY,EACV,OAAO;GACL,MAAM;GACN,aAAa;GACb,OAAO;IACL,MAAM;IACN,MAAM;IACP;GACD,UAAU;GACX,EACF;EACD,UAAU,CAAC,QAAQ;EACnB,sBAAsB;EACvB;CACF;AAED,MAAM,yBAAyB,UAA+B;CAC5D,MAAM;CACN,MAAM,KAAK;CACX,YAAY,oBAAoB,KAAK,aAAa;CAClD,QAAQ,KAAK,UAAU;CACvB,GAAI,KAAK,cAAc,EAAE,aAAa,KAAK,aAAa,GAAG,EAAE;CAC9D;AAED,MAAM,kCAAkC,UAA+B;CACrE,MAAM;CACN,MAAM,KAAK;CACX,GAAI,KAAK,cAAc,EAAE,aAAa,KAAK,aAAa,GAAG,EAAE;CAC7D,OAAO,CACL;EACE,MAAM;EACN,MAAM,KAAK;EACX,YAAY,oBAAoB,KAAK,aAAa;EAClD,QAAQ,KAAK,UAAU;EACvB,eAAe;EACf,GAAI,KAAK,cAAc,EAAE,aAAa,KAAK,aAAa,GAAG,EAAE;EAC9D,CACF;CACF;AAED,MAAM,8BACJ,QACA,sBAC2C;CAC3C,IAAI,CAAC,QACH,OAAO;CAGT,QAAQ,OAAO,MAAf;EACE,KAAK,QACH,OAAO;EAET,KAAK,OACH,OAAO;EAET,KAAK;GACH,IACE,qBACG,OAAO,QACP,uBAAuB,OAAO,KAAK,EAEtC,OAAO;GAET,OAAO,OAAO,OAAO;IAAE,MAAM;IAAY,MAAM,OAAO;IAAM,GAAG;EAEjE,KAAK,QACH,OAAO;EAET,SACE,OAAO;;;AAUb,MAAa,uCACX,UACA,YACsB;CACtB,MAAM,gBAAgB,4BAA4B,SAAS,QAAQ,QAAQ;CAC3E,MAAM,QAAQ,kBAAkB,SAAS;CACzC,IAAI,mBAAmB,sBAAsB,SAAS,YAAY;CAClE,IAAI,cAAc,SAAS,GACzB,mBAAmB;CAGrB,MAAM,aAAa,uBAAuB,UAAU,QAAQ;CAE5D,OAAO;EACL,IAAI,SAAS;EACb,MAAM;EACN,MAAM;EACN,SAAS;EACT,OAAO,SAAS;EAChB,aAAa;EACb,eAAe;EACf;EACD;;AAGH,MAAM,+BACJ,QACA,YAC0C;CAC1C,MAAM,gBAAuD,EAAE;CAC/D,IAAI,CAAC,QACH,SAAS,EAAE;CAEb,KAAK,MAAM,QAAQ,QACjB,QAAQ,KAAK,MAAb;EACE,KAAK,aAAa;GAChB,MAAM,eAAe,qBAAqB,KAAK;GAC/C,IAAI,aAAa,SAAS,KAAM,KAAK,MAAM,KAAK,mBAC9C,cAAc,KAAK;IACjB,MAAM;IACN,UAAU;IACV,YAAY,KAAK,qBAAqB,MAAM,MAAM,KAAK;IACxD,CAAC;GAEJ;;EAEF,KAAK,iBAAiB;GACpB,MAAM,eAAe,0BAA0B,KAAK;GACpD,IAAI,cACF,cAAc,KAAK,aAAa;GAElC;;EAEF,KAAK,oBAAoB;GACvB,MAAM,eAAe,gCACnB,MACA,SAAS,eACV;GACD,IAAI,cACF,cAAc,KAAK,aAAa;GAElC;;EAEF,KAAK,sBACH;EAEF,KAAK,WAAW;GACd,MAAM,eAAe,0BAA0B,KAAK,QAAQ;GAC5D,IAAI,aAAa,SAAS,GACxB,cAAc,KAAK;IAAE,MAAM;IAAQ,MAAM;IAAc,CAAC;GAE1D;;EAEF,KAAK,cAAc;GACjB,MAAM,kBAAkB,8BAA8B,KAAK;GAC3D,IAAI,iBACF,cAAc,KAAK,gBAAgB;GAErC;;EAEF,SAAS;GAEP,MAAM,eAAe,0BAClB,KAAyD,QAC3D;GACD,IAAI,aAAa,SAAS,GACxB,cAAc,KAAK;IAAE,MAAM;IAAQ,MAAM;IAAc,CAAC;;;CAMhE,OAAO;;AAGT,MAAM,6BACJ,YACW;CACX,IAAI,CAAC,MAAM,QAAQ,QAAQ,EACzB,OAAO;CAGT,IAAI,aAAa;CAEjB,KAAK,MAAM,SAAS,SAAS;EAC3B,IAAI,qBAAqB,MAAM,EAAE;GAC/B,cAAc,MAAM;GACpB;;EAGF,IAAI,wBAAwB,MAAM,EAAE;GAClC,cAAc,MAAM;GACpB;;EAGF,IAAI,OAAQ,MAA6B,SAAS,UAAU;GAC1D,cAAe,MAA2B;GAC1C;;EAGF,IAAI,OAAQ,MAAkC,cAAc,UAAU;GACpE,cAAe,MAAgC;GAC/C;;;CAIJ,OAAO;;AAGT,MAAM,wBAAwB,SAA0C;CACtE,MAAM,WAA0B,EAAE;CAElC,MAAM,qBAAqB,WAA2C;EACpE,IAAI,CAAC,MAAM,QAAQ,OAAO,EACxB;EAGF,KAAK,MAAM,SAAS,QAClB,IAAI,OAAO,MAAM,SAAS,UAAU;GAClC,SAAS,KAAK,MAAM,KAAK;GACzB;;;CAKN,kBAAkB,KAAK,QAAQ;CAE/B,OAAO,SAAS,KAAK,4BAA4B,CAAC,MAAM;;AAG1D,MAAM,6BACJ,SACiC;CACjC,MAAM,SAAS,KAAK;CACpB,MAAM,WAAW,mBAAmB,KAAK;CACzC,IAAI,CAAC,YAAY,CAAC,QAChB,OAAO;CAKT,OAAO;EACL,MAAM;EACN,IAAI;EACJ,MAAM;EACN,OANY,2BAA2B,KAAK,UAMvC;EACN;;AAGH,MAAM,mCACJ,MACA,iBAAiB,4BACgB;CACjC,MAAM,SAAS,KAAK;CACpB,IAAI,CAAC,QACH,OAAO;CAGT,OAAO;EACL,MAAM;EACN,IAAI;EACJ,MAAM;EACN,OAAO,yBAAyB,KAAK,UAAU;EAChD;;AAGH,MAAa,sBACX,SACW;CACX,IAAI,OAAO,KAAK,cAAc,YAAY,KAAK,UAAU,SAAS,GAChE,OAAO,KAAK;CAGd,OAAO,KAAK;;AAGd,MAAM,iCACJ,SAC0C;CAC1C,IAAI,CAAC,KAAK,MAAM,CAAC,KAAK,mBACpB,OAAO;CAGT,OAAO;EACL,MAAM;EACN,UAAU;EACV,WAAW,iCAAiC;GAC1C,IAAI,KAAK;GACT,mBAAmB,KAAK;GACzB,CAAC;EACH;;AAGH,MAAM,8BACJ,iBAC4B;CAC5B,IAAI,OAAO,iBAAiB,YAAY,aAAa,MAAM,CAAC,WAAW,GACrE,OAAO,EAAE;CAGX,IAAI;EACF,MAAM,SAAkB,KAAK,MAAM,aAAa;EAEhD,IAAI,MAAM,QAAQ,OAAO,EACvB,OAAO,EAAE,WAAW,QAAQ;EAG9B,IAAI,UAAU,OAAO,WAAW,UAC9B,OAAO;UAEF,OAAO;EACd,QAAQ,KAAK,2CAA2C;GACtD;GACA;GACD,CAAC;;CAGJ,OAAO,EAAE,eAAe,cAAc;;AAGxC,MAAM,4BACJ,mBAC4B;CAC5B,OAAO,gCAAgC,eAAe;;AAGxD,MAAM,yBACJ,eAC0C;CAC1C,IAAI,CAAC,YACH,OAAO,EAAE;CAGX,OAAO,CACL;EACE,MAAM;EACN,MAAM;EACP,CACF;;AAGH,MAAM,0BACJ,UACA,YACqC;CACrC,MAAM,EAAE,QAAQ,oBAAoB,sBAAsB;CAE1D,IAAI,WAAW,aAAa;EAC1B,IAAI,CAAC,SAAS,UAAU,SAAS,OAAO,WAAW,GACjD,OAAO,SAAS,cAAc,aAAa;EAG7C,IACE,SAAS,OAAO,MACb,SACC,KAAK,SAAS,mBAAmB,KAAK,SAAS,mBAClD,EAED,OAAO;EAET,OAAO;;CAGT,IAAI,WAAW,cAAc;EAC3B,IAAI,mBAAmB,WAAW,qBAChC,OAAO;EAET,IAAI,mBAAmB,WAAW,kBAChC,OAAO;;CAIX,OAAO;;AAGT,MAAM,qBACJ,aAC+B;CAC/B,MAAM,cAAc,SAAS,OAAO,gBAAgB;CACpD,MAAM,eAAe,SAAS,OAAO,iBAAiB;CACtD,MAAM,oBAAoB,SAAS,OAAO,sBAAsB;CAChE,MAAM,mBACJ,SAAS,OAAO,sBAAsB;CAExC,OAAO;EACL,cACE,eAAe,qBAAqB,MAAM,oBAAoB;EAChE,eAAe;EACf,GAAI,sBAAsB,KAAA,KAAa,EACrC,yBAAyB,mBAC1B;EACD,GAAI,qBAAqB,KAAA,KAAa,EACpC,6BAA6B,kBAC9B;EACF;;AAGH,MAAMC,cAAY,UAChB,OAAO,UAAU,YAAY,UAAU;AAEzC,MAAM,wBACJ,UAEAA,WAAS,MAAM,IACZ,UAAU,SACT,MAA6B,SAAS;AAE5C,MAAM,2BACJ,UAEAA,WAAS,MAAM,IACZ,UAAU,SACT,MAA6B,SAAS;AAE5C,MAAM,4BACJ,YACyC;CACzC,IAAI,OAAO,YAAY,UACrB,OAAO;CAGT,IAAI,MAAM,QAAQ,QAAQ,EAAE;EAC1B,MAAM,SAAsC,EAAE;EAC9C,KAAK,MAAM,SAAS,SAClB,QAAQ,MAAM,MAAd;GACE,KAAK;IACH,OAAO,KAAK,kBAAkB,MAAM,KAAK,CAAC;IAC1C;GAEF,KAAK;IACH,OAAO,KAAK,mBAAmB,MAAM,CAAC;IACtC;GAEF,KAAK;IACH,OAAO,KAAK,kBAAkB,MAAM,CAAC;IACrC;GAEF,KAAK;IACH,OAAO,KAAK,kBAAkB,QAAQ,MAAM,UAAU,SAAS,CAAC;IAChE;GAEF,SACE;;EAIN,OAAO;;CAGT,OAAO;;AAGT,MAAM,qBAAqB,YAA+C;CACxE,IACE,QAAQ,UAAU,aACf,QAAQ,UAAU,kBAClB,QAAQ,UAAU,WAErB,OAAO;CAET,OAAO,eAAe,QAAQ,MAAM;;;;AChqCtC,MAAM,2CAA2C;AAEjD,IAAM,uCAAN,cAAmD,MAAM;CACvD,YAAY,SAAiB;EAC3B,MAAM,QAAQ;EACd,KAAK,OAAO;;;AAIhB,MAAM,4BACJ,eACA,UAIG;CACH,IAAI,QAAQ;CAEZ,KAAK,MAAM,QAAQ,OAAO;EACxB,IAAI,SAAS,QAAQ,SAAS,QAAQ,SAAS,KAAM;GACnD,SAAS;GACT,IAAI,QAAQ,0CACV,OAAO;IAAE,WAAW;IAAO,UAAU;IAAM;GAE7C;;EAGF,IAAI,SAAS,KACX,QAAQ;;CAIZ,OAAO;EAAE,WAAW;EAAO,UAAU;EAAO;;AAuB9C,MAAa,8BAA8B,aAEd;CAC3B,kBAAkB;CAClB,kBAAkB;CAClB,uBAAuB;CACvB,iCAAiB,IAAI,KAAK;CAC1B,4BAAY,IAAI,KAAK;CACrB,+BAAe,IAAI,KAAK;CACxB,0CAA0B,IAAI,KAAK;CACnC,gDAAgC,IAAI,KAAK;CACzC,gBAAgB,SAAS,kBAAA;CACzB,aAAa;CACd;AAED,MAAa,iCACX,UACA,UACoC;CAEpC,QADkB,SAAS,MAC3B;EACE,KAAK,oBACH,OAAO,sBAAsB,UAAU,MAAM;EAG/C,KAAK,8BACH,OAAOC,wBAAsB,UAAU,MAAM;EAG/C,KAAK,yCACH,OAAO,gCAAgC,UAAU,MAAM;EAGzD,KAAK,yCACH,OAAO,gCAAgC,UAAU,MAAM;EAGzD,KAAK,8BACH,OAAO,sBAAsB,UAAU,MAAM;EAG/C,KAAK,wCACH,OAAO,+BAA+B,UAAU,MAAM;EAGxD,KAAK,6BACH,OAAOC,uBAAqB,UAAU,MAAM;EAG9C,KAAK,0CACH,OAAO,iCAAiC,UAAU,MAAM;EAG1D,KAAK,yCACH,OAAO,gCAAgC,UAAU,MAAM;EAGzD,KAAK;EACL,KAAK,uBACH,OAAO,wBAAwB,UAAU,MAAM;EAGjD,KAAK,mBACH,OAAO,qBAAqB,UAAU,MAAM;EAG9C,KAAK,SACH,OAAO,iBAAiB,UAAU,MAAM;EAG1C,SACE,OAAO,EAAE;;;AAMf,MAAM,yBACJ,UACA,UACoC;CACpC,OAAO,aAAa,OAAO,SAAS,SAAS;;AAG/C,MAAMD,2BACJ,UACA,UACoC;CACpC,MAAM,SAAS,IAAI,OAAiC;CACpD,MAAM,sBAAsB,2BAA2B,UAAU,MAAM;CACvE,IAAI,CAAC,qBACH,OAAO;CAGT,MAAM,EAAE,aAAa,YAAY,MAAM,qBACrC;CACF,MAAM,aAAa,sBAAsB,OAAO;EAC9C;EACA;EACA;EACA;EACD,CAAC;CAEF,IAAI,qBAAqB,KAAA,KAAa,iBAAiB,SAAS,GAAG;EACjE,OAAO,KAAK;GACV,MAAM;GACN,OAAO;GACP,OAAO;IACL,MAAM;IACN,cAAc;IACf;GACF,CAAC;EACF,MAAM,cAAc,IAAI,WAAW;;CAGrC,OAAO;;AAGT,MAAMC,0BACJ,UACA,UACoC;CACpC,MAAM,SAAS,IAAI,OAAiC;CACpD,MAAM,OAAO,SAAS;CACtB,MAAM,WAAW,KAAK;CACtB,MAAM,cAAc,SAAS;CAE7B,IAAI,aAAa,oBAAoB;EACnC,MAAM,aAAa,sBAAsB,OAAO;GAC9C;GACA,YAAY,KAAK;GACjB,MAAM,MAAM;GACZ;GACD,CAAC;EACF,MAAM,iBAAiB,6BAA6B,KAAK,UAAU;EAEnE,IAAI,CAAC,MAAM,cAAc,IAAI,WAAW,IAAI,gBAAgB;GAC1D,OAAO,KAAK;IACV,MAAM;IACN,OAAO;IACP,OAAO;KACL,MAAM;KACN,cAAc;KACf;IACF,CAAC;GACF,MAAM,cAAc,IAAI,WAAW;;EAGrC,MAAM,+BAA+B,OAAO,YAAY;EACxD,OAAO;;CAGT,IAAI,aAAa,cAAc;EAC7B,IAAI,CAAC,KAAK,MAAM,CAAC,KAAK,mBACpB,OAAO;EAGT,MAAM,aAAa,0BAA0B,OAAO,aAAa,OAAO;EAExE,IAAI,CAAC,MAAM,cAAc,IAAI,WAAW,EACtC,OAAO,KAAK;GACV,MAAM;GACN,OAAO;GACP,OAAO;IACL,MAAM;IACN,UAAU;IACX;GACF,CAAC;EAGJ,OAAO,KAAK;GACV,MAAM;GACN,OAAO;GACP,OAAO;IACL,MAAM;IACN,WAAW,iCAAiC;KAC1C,IAAI,KAAK;KACT,mBAAmB,KAAK;KACzB,CAAC;IACH;GACF,CAAC;EACF,MAAM,cAAc,IAAI,WAAW;EACnC,OAAO;;CAGT,IAAI,aAAa,aACf,OAAO;CAGT,MAAM,aAAa,0BAA0B,OAAO,aAAa,OAAO;CACxE,MAAM,aAAa,KAAK,qBAAqB,MAAM,MAAM,KAAK;CAC9D,IAAI,WAAW;EACb,KACG,CAAC,KAAK,WAAW,KAAK,QAAQ,WAAW,MACvC,CAAC,MAAM,cAAc,IAAI,WAAW,EAEvC,OAAO,KAAK;GACV,MAAM;GACN,OAAO;GACP,OAAO;IACL,MAAM;IACN,UAAU;IACX;GACF,CAAC;EAGJ,OAAO,KAAK;GACV,MAAM;GACN,OAAO;GACP,OAAO;IACL,MAAM;IACN;IACD;GACF,CAAC;EACF,MAAM,cAAc,IAAI,WAAW;;CAGrC,OAAO;;AAGT,MAAM,oCACJ,UACA,UACoC;CACpC,MAAM,SAAS,IAAI,OAAiC;CACpD,MAAM,cAAc,SAAS;CAC7B,MAAM,YAAY,SAAS;CAE3B,IAAI,CAAC,WACH,OAAO;CAGT,MAAM,aAAa,sBAAsB,OAAO;EAC9C;EACA;EACD,CAAC;CAEF,MAAM,oBACJ,MAAM,+BAA+B,IAAI,YAAY;CACvD,IAAI,CAAC,mBACH,OAAO,2CACL,IAAI,qCACF,0EACD,EACD,OACA,OACD;CAKH,MAAM,EAAE,WAAW,aAAa,yBAC9B,kBAAkB,4BAClB,UACD;CACD,IAAI,UACF,OAAO,2CACL,IAAI,qCACF,oGACD,EACD,OACA,OACD;CAEH,kBAAkB,6BAA6B;CAE/C,OAAO,KAAK;EACV,MAAM;EACN,OAAO;EACP,OAAO;GACL,MAAM;GACN,cAAc;GACf;EACF,CAAC;CACF,MAAM,cAAc,IAAI,WAAW;CAEnC,OAAO;;AAGT,MAAM,mCACJ,UACA,UACoC;CACpC,MAAM,SAAS,IAAI,OAAiC;CACpD,MAAM,cAAc,SAAS;CAC7B,MAAM,aAAa,sBAAsB,OAAO;EAC9C;EACA;EACD,CAAC;CAEF,MAAM,iBACJ,OAAO,SAAS,cAAc,WAAW,SAAS,YAAY,KAAA;CAEhE,IAAI,CAAC,MAAM,cAAc,IAAI,WAAW,IAAI,gBAAgB;EAC1D,OAAO,KAAK;GACV,MAAM;GACN,OAAO;GACP,OAAO;IACL,MAAM;IACN,cAAc;IACf;GACF,CAAC;EACF,MAAM,cAAc,IAAI,WAAW;;CAGrC,MAAM,+BAA+B,OAAO,YAAY;CACxD,OAAO;;AAGT,MAAM,yBACJ,UACA,UACoC;CACpC,MAAM,SAAS,IAAI,OAAiC;CACpD,MAAM,cAAc,SAAS;CAC7B,MAAM,eAAe,SAAS;CAC9B,MAAM,YAAY,SAAS;CAE3B,IAAI,CAAC,WACH,OAAO;CAGT,MAAM,aAAa,sBAAsB,OAAO;EAC9C;EACA;EACA;EACD,CAAC;CAEF,OAAO,KAAK;EACV,MAAM;EACN,OAAO;EACP,OAAO;GACL,MAAM;GACN,MAAM;GACP;EACF,CAAC;CACF,MAAM,cAAc,IAAI,WAAW;CAEnC,OAAO;;AAGT,MAAM,mCACJ,UACA,UACoC;CACpC,MAAM,cAAc,SAAS;CAC7B,MAAM,eAAe,SAAS;CAC9B,MAAM,YAAY,SAAS;CAC3B,MAAM,SAAS,IAAI,OAAiC;CAEpD,IAAI,CAAC,WACH,OAAO;CAGT,MAAM,aAAa,0BAA0B,OAAO,aAAa,OAAO;CAExE,OAAO,KAAK;EACV,MAAM;EACN,OAAO;EACP,OAAO;GACL,MAAM;GACN,UAAU;GACX;EACF,CAAC;CACF,MAAM,cAAc,IAAI,WAAW;CACnC,MAAM,yBAAyB,IAAI,YAAY,aAAa,aAAa,CAAC;CAE1E,OAAO;;AAGT,MAAM,mCACJ,UACA,UACoC;CACpC,MAAM,SAAS,IAAI,OAAiC;CACpD,MAAM,aAAa,0BACjB,OACA,SAAS,cACT,OACD;CAED,IAAI,SAAS,kBAAkB,GAC7B,OAAO;CAGT,OAAO,KAAK;EACV,MAAM;EACN,OAAO;EACP,OAAO;GACL,MAAM;GACN,UAAU;GACX;EACF,CAAC;CACF,MAAM,cAAc,IAAI,WAAW;CACnC,OAAO;;AAGT,MAAM,kCACJ,UACA,UACoC;CACpC,MAAM,cAAc,SAAS;CAC7B,MAAM,eAAe,SAAS;CAC9B,MAAM,OAAO,SAAS;CACtB,MAAM,SAAS,IAAI,OAAiC;CACpD,MAAM,aAAa,0BAA0B,OAAO,aAAa,OAAO;CACxE,MAAM,aAAa,YAAY,aAAa,aAAa;CAEzD,IAAI,QAAQ,CAAC,MAAM,yBAAyB,IAAI,WAAW,EAAE;EAC3D,OAAO,KAAK;GACV,MAAM;GACN,OAAO;GACP,OAAO;IACL,MAAM;IACN,UAAU;IACX;GACF,CAAC;EACF,MAAM,cAAc,IAAI,WAAW;;CAGrC,OAAO;;AAGT,MAAM,2BACJ,UACA,UACoC;CACpC,MAAM,WAAW,SAAS;CAC1B,MAAM,SAAS,IAAI,OAAiC;CAEpD,mBAAmB,OAAO,OAAO;CACjC,MAAM,YAAY,oCAAoC,UAAU;EAC9D,aAAa,MAAM;EACnB,gBAAgB,MAAM;EACvB,CAAC;CACF,OAAO,KACL;EACE,MAAM;EACN,OAAO;GACL,aAAa,UAAU;GACvB,eAAe,UAAU;GAC1B;EACD,OAAO,UAAU;EAClB,EACD,EAAE,MAAM,gBAAgB,CACzB;CACD,MAAM,mBAAmB;CACzB,OAAO;;AAGT,MAAM,wBACJ,UACA,UACoC;CACpC,MAAM,WAAW,SAAS;CAC1B,MAAM,SAAS,IAAI,OAAiC;CACpD,mBAAmB,OAAO,OAAO;CAEjC,MAAM,UACJ,SAAS,OAAO,WAAW;CAE7B,OAAO,KAAK,gBAAgB,QAAQ,CAAC;CACrC,MAAM,mBAAmB;CAEzB,OAAO;;AAGT,MAAM,oBACJ,UACA,UACoC;CACpC,MAAM,UACJ,OAAO,SAAS,YAAY,WAC1B,SAAS,UACT;CAEJ,MAAM,mBAAmB;CACzB,OAAO,CAAC,gBAAgB,QAAQ,CAAC;;AAGnC,MAAM,8CACJ,OACA,OACA,SAA0C,EAAE,KACR;CACpC,MAAM,SAAS,MAAM;CAErB,mBAAmB,OAAO,OAAO;CACjC,MAAM,mBAAmB;CAEzB,OAAO,KAAK,gBAAgB,OAAO,CAAC;CAEpC,OAAO;;AAGT,MAAM,gBACJ,OACA,aACoC;CACpC,MAAM,mBAAmB;CACzB,MAAM,oBAAoB,SAAS,OAAO,sBAAsB;CAChE,MAAM,mBACJ,SAAS,OAAO,sBAAsB;CACxC,MAAM,eACH,SAAS,OAAO,gBAAgB,MAC9B,qBAAqB,MACrB,oBAAoB;CACzB,OAAO,CACL;EACE,MAAM;EACN,SAAS;GACP,IAAI,SAAS;GACb,MAAM;GACN,MAAM;GACN,SAAS,EAAE;GACX,OAAO,SAAS;GAChB,aAAa;GACb,eAAe;GACf,OAAO;IACL,cAAc;IACd,eAAe;IACf,yBAAyB,qBAAqB;IAC9C,GAAI,qBAAqB,KAAA,KAAa,EACpC,6BAA6B,kBAC9B;IACF;GACF;EACF,CACF;;AAGH,MAAM,yBACJ,OACA,WAKW;CACX,MAAM,EAAE,aAAa,cAAc,WAAW;CAC9C,MAAM,MAAM,YAAY,aAAa,aAAa;CAClD,IAAI,aAAa,MAAM,gBAAgB,IAAI,IAAI;CAE/C,IAAI,eAAe,KAAA,GAAW;EAC5B,aAAa,MAAM;EACnB,MAAM,yBAAyB;EAC/B,MAAM,gBAAgB,IAAI,KAAK,WAAW;;CAG5C,IAAI,CAAC,MAAM,WAAW,IAAI,WAAW,EAAE;EACrC,gBAAgB,OAAO,OAAO;EAC9B,OAAO,KAAK;GACV,MAAM;GACN,OAAO;GACP,eAAe;IACb,MAAM;IACN,MAAM;IACP;GACF,CAAC;EACF,MAAM,WAAW,IAAI,WAAW;;CAGlC,OAAO;;AAGT,MAAM,6BACJ,OACA,aACA,WACW;CAGX,MAAM,MAAM,YAAY,aAAa,EAAa;CAClD,IAAI,aAAa,MAAM,gBAAgB,IAAI,IAAI;CAE/C,IAAI,eAAe,KAAA,GAAW;EAC5B,aAAa,MAAM;EACnB,MAAM,yBAAyB;EAC/B,MAAM,gBAAgB,IAAI,KAAK,WAAW;;CAG5C,IAAI,CAAC,MAAM,WAAW,IAAI,WAAW,EAAE;EACrC,gBAAgB,OAAO,OAAO;EAC9B,OAAO,KAAK;GACV,MAAM;GACN,OAAO;GACP,eAAe;IACb,MAAM;IACN,UAAU;IACX;GACF,CAAC;EACF,MAAM,WAAW,IAAI,WAAW;;CAGlC,OAAO;;AAGT,MAAM,oBACJ,OACA,YACA,WACG;CACH,IAAI,CAAC,MAAM,WAAW,IAAI,WAAW,EACnC;CAGF,OAAO,KAAK;EAAE,MAAM;EAAsB,OAAO;EAAY,CAAC;CAC9D,MAAM,WAAW,OAAO,WAAW;CACnC,MAAM,cAAc,OAAO,WAAW;;AAGxC,MAAM,mBACJ,OACA,WACG;CACH,KAAK,MAAM,cAAc,MAAM,YAC7B,iBAAiB,OAAO,YAAY,OAAO;;AAI/C,MAAM,sBACJ,OACA,WACG;CACH,gBAAgB,OAAO,OAAO;CAE9B,MAAM,+BAA+B,OAAO;CAC5C,MAAM,yBAAyB,OAAO;;AAGxC,MAAa,mBAAmB,aAA+C;CAC7E,MAAM;CACN,OAAO;EACL,MAAM;EACN;EACD;CACF;AAED,MAAM,eAAe,aAAqB,iBACxC,GAAG,YAAY,GAAG;AAEpB,MAAM,yBACJ,OACA,WAMW;CACX,MAAM,EAAE,aAAa,YAAY,MAAM,WAAW;CAElD,MAAM,cAAc;CAEpB,IAAI,oBAAoB,MAAM,+BAA+B,IAAI,YAAY;CAE7E,IAAI,CAAC,mBAAmB;EACtB,MAAM,aAAa,MAAM;EACzB,MAAM,yBAAyB;EAK/B,oBAAoB;GAClB;GACA,YALyB,cAAc,aAAa;GAMpD,MALmB,QAAQ;GAM3B,4BAA4B;GAC7B;EAED,MAAM,+BAA+B,IAAI,aAAa,kBAAkB;;CAG1E,MAAM,EAAE,eAAe;CAEvB,IAAI,CAAC,MAAM,WAAW,IAAI,WAAW,EAAE;EACrC,gBAAgB,OAAO,OAAO;EAC9B,OAAO,KAAK;GACV,MAAM;GACN,OAAO;GACP,eAAe;IACb,MAAM;IACN,IAAI,kBAAkB;IACtB,MAAM,kBAAkB;IACxB,OAAO,EAAE;IACV;GACF,CAAC;EACF,MAAM,WAAW,IAAI,WAAW;;CAGlC,OAAO;;AAUT,MAAM,8BACJ,UACA,UACoC;CACpC,MAAM,OAAO,SAAS;CACtB,MAAM,WAAW,KAAK;CACtB,IAAI,aAAa,oBAIf,OAAO;EACL,aAJkB,SAAS;EAK3B,YAJiB,KAAK;EAKtB,MAJW,MAAM;EAKjB,kBAAkB;EACnB;CAGH,IAAI,aAAa,iBACf;CAOF,OAAO;EACL,aALkB,SAAS;EAM3B,YALiB,KAAK;EAMtB,MALW,mBAAmB,KAK1B;EACJ,kBALuB,KAAK;EAM7B;;AAGH,MAAM,gCACJ,mBACuB;CACvB,IAAI;EACF,OAAO,KAAK,UAAU,gCAAgC,eAAe,CAAC;SAChE;EACN;;;;;AC1yBJ,MAAa,+BAA+B,OAAO,EACjD,qBAAqB,oBACrB,aAAaC,6BACb,kBACA,aAM8B;CAC9B,MAAM,QAAQ,iCAAiC;CAE/C,WAAW,MAAM,SAAS,kBAAkB;EAC1C,MAAM,SAAS,4BAA4B;GACzC;GACA;GACA;GACA;GACA;GACD,CAAC;EACF,IAAI,QACF,OAAO;;CAIX,MAAM,IAAI,MAAM,GAAG,mBAAmB,iCAAiC;;AAGzE,MAAM,+BAA+B,EACnC,OACA,oBACA,QACA,YACA,YAOiC;CACjC,UAAU,QAAQ,oCAAoC,MAAM;CAC5D,IAAI,MAAM,UAAU,UAAU,CAAC,MAAM,QAAQ,MAAM,SAAS,UAC1D;CAGF,MAAM,SAAS,WAAW,MAAM,KAAK;CACrC,IAAI,CAAC,QACH;CAGF,IAAI,OAAO,SAAS,SAClB,MAAM,IAAI,MACR,sBAAsB,OAAO,IAAI,GAAG,mBAAmB,SACxD;CAGH,IAAI,OAAO,SAAS,mBAAmB;EACrC,MAAM,WAAW,OAAO;EACxB,IAAI,CAAC,UACH,MAAM,IAAI,MAAM,4CAA4C;EAE9D,MAAM,IAAI,MAAM,SAAS,OAAO,WAAW,GAAG,mBAAmB,SAAS;;CAG5E,OAAO,4BAA4B,QAAQ,MAAM;;AAGnD,MAAMA,+BACJ,SAC+B;CAC/B,IAAI;EACF,OAAO,KAAK,MAAM,KAAK;SACjB;EACN,OAAO;;;AAIX,MAAM,yCAAoE,EACxE,oCAAoB,IAAI,KAAK,EAC9B;AAED,MAAM,+BACJ,OACA,UACgC;CAChC,QAAQ,MAAM,MAAd;EACE,KAAK;EACL,KAAK,uBAAuB;GAC1B,MAAM,WAAW,MAAM;GACvB,IAAI,CAAC,UACH,MAAM,IAAI,MAAM,4CAA4C;GAE9D,SAAS,kBAAkB,MAAM;GACjC,MAAM,SAAS,CAAC,GAAG,MAAM,mBAAmB,SAAS,CAAC,CACnD,MAAM,CAAC,YAAY,CAAC,gBAAgB,YAAY,WAAW,CAC3D,KAAK,GAAG,UAAU,KAAK;GAC1B,OAAO;IACL,GAAG;IACH,QAAQ,OAAO,SAAS,IAAI,SAAS,SAAS;IAC/C;;EAEH,KAAK;GACH,MAAM,mBAAmB,IAAI,MAAM,cAAc,MAAM,KAAK;GAC5D;;;AAIN,MAAM,yBACJ,UACuB;CACvB,OAAO,MAAM,OAAO,WAAW,MAAM,WAAW,KAAA;;;;AC5FlD,MAAa,6BAA6B;AAC1C,MAAM,+BAA+B;AAErC,MAAa,2BAA2B,OACtC,GAAG,KAAK;AAEV,MAAa,yBAAyB,OACpC,OAAO,OAAO,YAAY,GAAG,SAAS,6BAA6B;AAErE,MAAa,6BAA6B;CACxC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC,KAAK,KAAK;AAEZ,MAAa,0BAA0B;CACrC;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC,KAAK,KAAK;AAEZ,MAAM,2BACJ;AACF,MAAM,wBAAwB;AAC9B,MAAM,oBAAoB;AAC1B,MAAM,2BAAoD;CACxD,MAAM;CACN,YAAY,EAAE,OAAO,EAAE,MAAM,UAAU,EAAE;CACzC,UAAU,CAAC,QAAQ;CACnB,sBAAsB;CACvB;AAED,IAAa,oCAAb,cAAuD,MAAM;CAC3D;CAEA,YAAY,SAAiB,SAAS,KAAK;EACzC,MAAM,QAAQ;EACd,KAAK,OAAO;EACZ,KAAK,SAAS;;;AA2ClB,SAAgB,6BACd,SACA,SACgC;CAChC,MAAM,WAAW,mBAAmB,QAAQ;CAC5C,MAAM,aAAa,wBAAwB,QAAQ,MAAM;CACzD,MAAM,EAAE,UAAU,WAAW,0BAC3B,WAAW,OACX,UACA,QAAQ,cACR,QAAQ,OACR,QAAQ,gBAAgB,MACzB;CAED,IAAI,WAAW,YACb,SAAS,KAAK;EAAE,MAAM;EAAQ,SAAS;EAA4B,CAAC;CAGtE,IAAI,SAAS,WAAW,GACtB,MAAM,IAAI,kCACR,iEACD;CAGH,2BAA2B,UAAU,OAAO;CAE5C,MAAM,kBAAkB,yBAAyB,QAAQ,WAAW,OAAO;CAC3E,MAAM,iBAAiB,sBAAsB,QAAQ;CACrD,MAAM,kBAA4C;EAChD,OAAO,QAAQ;EACf;EACA,YAAY,KAAK,IAAI,GAAG,QAAQ,qBAAqB,KAAO;EAC5D,QAAQ,QAAQ,UAAU;EAC1B,aAAa,QAAQ,eAAe,KAAA;EACpC,OAAO,QAAQ,SAAS,KAAA;EACxB,QAAQ,OAAO,SAAS,IAAI,SAAS,KAAA;EACrC,OACE,WAAW,cAAc,SAAS,MAAM,SAAS,IAC/C,SAAS,QACT,KAAA;EACJ,aAAa,oBAAoB,QAAQ,aAAa,SAAS;EAC/D,GAAI,kBAAkB,EAAE,eAAe,EAAE,QAAQ,iBAAiB,EAAE,GAAG,EAAE;EACzE,GACE,QAAQ,iBAAiB,UACtB,QAAQ,iBAAiB,kBAE5B,EAAE,cAAc,QAAQ,cAAc,GACtC,EAAE;EACJ,GAAI,iBAAiB,EAAE,UAAU,EAAE,SAAS,gBAAgB,EAAE,GAAG,EAAE;EACpE;CAED,OAAO;EACL,YAAY,WAAW;EACvB;EACA,iBAAiB;EACjB,aAAa,QAAQ,eAAe,QAAQ;EAC5C;EACD;;AAGH,SAAgB,8BACd,UACA,SACiB;CACjB,MAAM,SAAS,oBAAoB,SAAS,YAAY;CACxD,MAAM,SACJ,QAAQ,aACN,0BAA0B,SAAS,GACnC,yBAAyB,UAAU,QAAQ,SAAS;CACxD,MAAM,aACJ,QAAQ,aAAa,KAAK,6BAA6B,SAAS;CAElE,OAAO,oCAAoC;EACzC;EACA,IAAI,aAAa,SAAS,GAAG;EAC7B;EACA;EACA,QAAQ,OAAO;EACf,kBAAkB,OAAO;EACzB,OAAO,wBAAwB,SAAS,MAAM;EAC9C,cAAc,SAAS;EACxB,CAAC;;AAGJ,SAAgB,oCAAoC,SAWhC;CAClB,MAAM,EAAE,YAAY;CACpB,OAAO;EACL,IAAI,QAAQ;EACZ,QAAQ;EACR,YAAY,QAAQ,aAAa,KAAK,MAAM,KAAK,KAAK,GAAG,IAAK;EAC9D,OAAO,QAAQ;EACf,QAAQ,QAAQ;EAChB,aAAa,QAAQ;EACrB,QAAQ,QAAQ;EAChB,eAAe,QAAQ,gBAAgB;EACvC,OAAO,QAAQ,SAAS;EACxB,OAAO,QAAQ,SAAS;EACxB,oBACE,QAAQ,mBAAmB,EAAE,QAAQ,QAAQ,kBAAkB,GAAG;EACpE,cAAc,QAAQ,gBAAgB,gBAAgB;EACtD,UAAU,QAAQ,gBAAgB,YAAY;EAC9C,qBAAqB,QAAQ,QAAQ,gBAAgB,oBAAoB;EACzE,aAAa,QAAQ,gBAAgB,eAAe;EACpD,aAAa,QAAQ,gBAAgB,eAAe;EACpD,OAAO,QAAQ,gBAAgB,SAAS,EAAE;EAC1C,OAAO,QAAQ,gBAAgB,SAAS;EACzC;;AAGH,SAAgB,wBACd,OACsB;CACtB,IAAI,CAAC,OAAO,OAAO;CAEnB,MAAM,eAAe,MAAM,2BAA2B;CACtD,MAAM,mBAAmB,MAAM,+BAA+B;CAC9D,MAAM,cAAc,MAAM,eAAe,eAAe;CACxD,MAAM,eAAe,MAAM;CAC3B,OAAO;EACL,cAAc;EACd,eAAe;EACf,cAAc,cAAc;EAC5B,sBAAsB;GACpB,eAAe;GACf,GAAI,mBAAmB,IAAI,EAAE,oBAAoB,kBAAkB,GAAG,EAAE;GACzE;EACD,uBAAuB,EAAE,kBAAkB,GAAG;EAC/C;;AAGH,SAAgB,yBAAyB,SAAyB;CAChE,MAAM,UAAU,GAAG,6BAA6B,OAAO,KAAK,SAAS,OAAO,CAAC,SAAS,YAAY;CAClG,OAAO,OAAO,KAAK,SAAS,OAAO,CAAC,SAAS,SAAS;;AAGxD,SAAgB,yBAAyB,OAA8B;CACrE,IAAI,UAAU;CACd,IAAI,CAAC,QAAQ,WAAA,sCAAsC,EAAE;EACnD,MAAM,UAAU,OAAO,KAAK,OAAO,SAAS;EAC5C,IAAI,QAAQ,SAAS,SAAS,KAAK,OAAO,OAAO;EACjD,UAAU,QAAQ,SAAS,OAAO;;CAEpC,IAAI,CAAC,QAAQ,WAAA,sCAAsC,EAAE,OAAO;CAE5D,IAAI;EACF,MAAM,UAAU,QAAQ,MAAM,GAAkC;EAChE,IAAI,CAAC,SAAS,OAAO;EACrB,OAAO,OAAO,KAAK,SAAS,YAAY,CAAC,SAAS,OAAO;SACnD;EACN,OAAO;;;AAIX,SAAgB,sBACd,UACA,OACwB;CACxB,OACE,SAAS,QAAQ,IAAI,MAAM,IAAI;EAC7B;EACA,MAAM;EACN,MAAM;EACP;;AAIL,SAAgB,sBAAsB,OAAwB;CAC5D,IAAIC,WAAS,MAAM,IAAI,OAAO,MAAM,UAAU,UAC5C,OAAO,MAAM;CAEf,OAAO,OAAO,UAAU,WAAW,QAAQ,KAAK,UAAU,SAAS,EAAE,CAAC;;AAGxE,SAAgB,aAAa,WAA2B;CAEtD,OAAO,QADY,UAAU,QAAQ,cAAc,GAC1B,IAAI,iBAAiB,UAAU;;AAG1D,SAAS,wBACP,OAC6B;CAC7B,IAAI,CAAC,MAAM,QAAQ,MAAM,EACvB,OAAO;EAAE,YAAY;EAAO;EAAO;CAGrC,MAAM,iBAAiB,MAAM,SAAS,MAAM,UAC1C,YAAY,KAAK,KAAK,uBAAuB,CAAC,MAAM,GAAG,EAAE,CAC1D;CACD,MAAM,aAAa,eAAe,SAAS;CAC3C,IACE,eAAe,SAAS,KACpB,cAAc,eAAe,OAAO,MAAM,SAAS,GAEvD,MAAM,IAAI,kCACR,4DACD;CAGH,MAAM,iBAAiB,aAAa,MAAM,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,MAAM;CACnE,IAAI,wBAAwB;CAC5B,KAAK,IAAI,QAAQ,eAAe,SAAS,GAAG,SAAS,GAAG,SAAS,GAC/D,IAAI,YAAY,eAAe,OAAO,KAAK,cAAc;EACvD,wBAAwB;EACxB;;CAIJ,IAAI,wBAAwB,GAC1B,OAAO;EAAE;EAAY,OAAO;EAAgB;CAG9C,MAAM,UAAU,eAAe;CAC/B,MAAM,mBAAmBC,iBAAe,SAAS,oBAAoB;CACrE,MAAM,UACJ,mBAAmB,yBAAyB,iBAAiB,GAAG;CAClE,IAAI,CAAC,SACH,MAAM,IAAI,kCACR,4JACD;CAQH,OAAO;EACL;EACA,OAAO,CAAC;GANR,MAAM;GACN,MAAM;GACN,SAAS,GAAG,2BAA2B;GAIlB,EAAE,GAAG,eAAe,MAAM,wBAAwB,EAAE,CAAC;EAC3E;;AAGH,SAAS,mBAAmB,SAAiD;CAC3E,MAAM,WAAiC;EACrC,yBAAS,IAAI,KAAK;EAClB,4BAAY,IAAI,KAAK;EACrB,OAAO,EAAE;EACV;CAED,KAAK,MAAM,QAAQ,QAAQ,SAAS,EAAE,EACpC,aAAa,MAAM,SAAS;CAG9B,IAAI,MAAM,QAAQ,QAAQ,MAAM,EAC9B,KAAK,MAAM,QAAQ,QAAQ,OAAO;EAEhC,IADa,YAAY,KACjB,KAAK,oBAAoB;EACjC,KAAK,MAAM,QAAQ,cAAc,MAAM,QAAQ,EAC7C,aAAa,MAAM,SAAS;;CAKlC,OAAO;;AAGT,SAAS,aACP,MACA,UACA,aAA4B,EAAE,EACxB;CACN,IAAI,CAACD,WAAS,KAAK,EACjB,MAAM,IAAI,kCACR,oCACD;CAGH,MAAM,OAAOC,iBAAe,MAAM,OAAO;CACzC,IAAI,SAAS,aAAa;EACxB,MAAM,gBAAgB;EACtB,MAAM,YAAYA,iBAAe,eAAe,OAAO;EACvD,IAAI,CAAC,aAAa,CAAC,MAAM,QAAQ,cAAc,MAAM,EACnD,MAAM,IAAI,kCACR,2DACD;EAEH,KAAK,MAAM,SAAS,cAAc,OAChC,aAAa,OAAO,UAAU,CAAC,GAAG,YAAY,UAAU,CAAC;EAE3D;;CAGF,IAAI,SAAS,cAAc,SAAS,UAElC,MAAM,IAAI,kCACR,oDAFa,OAAO,KAAK,KAAK,KAAK,oBAGpC;CAGH,MAAM,OAAOA,iBAAe,MAAM,OAAO;CACzC,IAAI,CAAC,MACH,MAAM,IAAI,kCACR,aAAa,KAAK,iCACnB;CAGH,qBACE;EACE,MAAM;EACN;EACA,WAAW,WAAW,SAAS,IAAI,WAAW,KAAK,IAAI,GAAG,KAAA;EAC1D,aAAa,uBAAuB,MAAM,cAAc;EACxD,YACE,SAAS,cAAcD,WAAS,KAAK,WAAW,GAC9C,KAAK,aACL;EACL,EACD,SACD;;AAGH,SAAS,qBACP,cACA,UACwB;CACxB,MAAM,cAAc,sBAAsB,aAAa;CACvD,MAAM,WAAW,SAAS,WAAW,IAAI,YAAY;CACrD,IAAI,UAAU,OAAO;CAErB,MAAM,aAAa,6BAA6B,cAAc,SAAS;CACvE,SAAS,QAAQ,IAAI,WAAW,OAAO,WAAW;CAClD,SAAS,WAAW,IAAI,aAAa,WAAW;CAChD,SAAS,MAAM,KAAK;EAClB,MAAM,WAAW;EACjB,GAAI,aAAa,cACf,EAAE,aAAa,aAAa,aAAa,GACzC,EAAE;EACJ,cACE,aAAa,SAAS,WACpB,2BACC,aAAa,cAAc;GAAE,MAAM;GAAU,YAAY,EAAE;GAAE;EAClE,GAAI,aAAa,SAAS,WAAW,EAAE,QAAQ,MAAM,GAAG,EAAE;EAC3D,CAAC;CACF,OAAO;;AAGT,SAAS,6BACP,cACA,UACwB;CACxB,MAAM,cAAc,sBAAsB,aAAa;CAMvD,OAAO;EACL,OAFY,gBAHZ,aAAa,YACX,GAAG,aAAa,UAAU,WAAW,KAAK,IAAI,CAAC,IAAI,aAAa,SAChE,aAAa,MAC4B,aAAa,SAEnD;EACL,MAAM,aAAa;EACnB,MAAM,aAAa;EACnB,GAAI,aAAa,YAAY,EAAE,WAAW,aAAa,WAAW,GAAG,EAAE;EACxE;;AAGH,SAAS,0BACP,OACA,UACA,cACA,eACA,cAIA;CACA,MAAM,WAAyC,EAAE;CACjD,MAAM,SAAoC,EAAE;CAC5C,IAAI,cAAc,MAAM,EACtB,OAAO,KAAK;EAAE,MAAM;EAAQ,MAAM;EAAc,CAAC;CAEnD,uBAAuB,QAAQ,cAAc;CAE7C,IAAI,OAAO,UAAU,UACnB,SAAS,KAAK;EAAE,MAAM;EAAQ,SAAS;EAAO,CAAC;MAC1C,IAAI,MAAM,QAAQ,MAAM,EAC7B,oBAAoB,OAAO,UAAU,QAAQ,SAAS;CAExD,IAAI,cACF,mBAAmB,OAAO;CAE5B,OAAO;EAAE;EAAU;EAAQ;;AAG7B,SAAS,mBAAmB,QAAyC;CACnE,MAAM,kBAAkB,OAAO,GAAG,GAAG;CACrC,IAAI,CAAC,iBAAiB;EACpB,OAAO,KAAK;GAAE,MAAM;GAAQ,MAAM;GAAyB,CAAC;EAC5D;;CAEF,gBAAgB,OAAO,GAAG,gBAAgB,KAAK,MAAM;;AAGvD,SAAS,oBACP,OACA,UACA,QACA,UACM;CACN,IAAI,kBAAkB;CACtB,KAAK,MAAM,QAAQ,OAAO;EACxB,MAAM,OAAO,YAAY,KAAK;EAC9B,QAAQ,MAAR;GACE,KAAK,KAAA;GACL,KAAK;IACH,sBAAsB,MAAM,UAAU,QAAQ,gBAAgB;IAC9D,IAAIC,iBAAe,MAAM,OAAO,KAAK,QACnC,kBAAkB;IAEpB;GAEF,KAAK;IACH,2BAA2B,MAAmC,SAAS;IACvE,kBAAkB;IAClB;GAEF,KAAK;IACH,wBAAwB,MAAgC,SAAS;IACjE;GAEF,KAAK;IACH,uBAAuB,MAAM,YAAY,UAAU,SAAS;IAC5D;GAEF,KAAK;IACH,uBAAuB,MAAM,UAAU,UAAU,SAAS;IAC1D;GAEF,KAAK;GACL,KAAK;IACH,gBAAgB,UAAU;KACxB,MAAM;KACN,aAAa,mBAAmB,MAAM,WAAW,KAAK;KACtD,SAAS,2BACN,KAAiC,QAClC,GAAG,KAAK,SACT;KACD,UAAUA,iBAAe,MAAM,SAAS,KAAK;KAC9C,CAAC;IACF;GAEF,KAAK,oBACH;GAEF,SACE,MAAM,IAAI,kCACR,iEAAiE,KAAK,GACvE;;;;AAMT,SAAS,sBACP,MACA,UACA,QACA,iBACM;CACN,IAAI,CAACD,WAAS,KAAK,EACjB,MAAM,IAAI,kCACR,iCACD;CAEH,MAAM,OAAOC,iBAAe,MAAM,OAAO;CACzC,IACE,SAAS,UACN,SAAS,eACT,SAAS,YACT,SAAS,aAEZ,MAAM,IAAI,kCACR,mDACD;CAGH,IAAI,SAAS,eAAe,CAAC,iBAAiB;CAE9C,IAAI,SAAS,UAAU;EACrB,MAAM,OAAO,uBAAuB,KAAK,SAAS,kBAAkB;EACpE,IAAI,MAAM,OAAO,KAAK;GAAE,MAAM;GAAQ;GAAM,CAAC;EAC7C;;CAGF,IAAI,SAAS,aAAa;EACxB,MAAM,SAAS,0BAA0B,KAAK,SAAS,kBAAkB;EACzE,KAAK,MAAM,SAAS,QAClB,qBAAqB,UAAU,MAAM;EAEvC;;CAGF,MAAM,UAAU,qBAAqB,KAAK,SAAS,kBAAkB;CACrE,SAAS,KAAK;EAAE,MAAM;EAAQ;EAAS,CAAC;;AAG1C,SAAS,2BACP,MACA,UACM;CACN,MAAM,UAAU,qBAAqB,KAAK,SAAS,wBAAwB;CAC3E,SAAS,KAAK;EAAE,MAAM;EAAQ;EAAS,CAAC;;AAG1C,SAAS,uBACP,QACA,OACM;CACN,IAAI,CAAC,MAAM,QAAQ,MAAM,EAAE;CAE3B,MAAM,UAAyB,EAAE;CACjC,KAAK,MAAM,QAAQ,OAAO;EACxB,IAAI,QAAQ,UAAU,uBAAuB;EAC7C,MAAM,OAAO,YAAY,KAAK;EAC9B,MAAM,OAAOA,iBAAe,MAAM,OAAO;EACzC,IAAI,SAAS,iBAAiB;EAC9B,KAAK,SAAS,KAAA,KAAa,SAAS,cAAc,SAAS,QAAQ;EACnE,IAAK,SAAS,KAAA,KAAa,SAAS,aAAc,SAAS,aACzD;EAEF,QAAQ,KACN,uBACED,WAAS,KAAK,GAAG,KAAK,UAAU,KAAA,GAChC,kBACD,CACF;;CAGH,MAAM,CAAC,aAAa,GAAG,oBAAoB;CAC3C,IAAI,aAAa,OAAO,KAAK;EAAE,MAAM;EAAQ,MAAM;EAAa,CAAC;CAEjE,MAAM,gBAAgB,iBAAiB,OAAO,QAAQ,CAAC,KAAK,OAAO;CACnE,IAAI,eAAe,OAAO,KAAK;EAAE,MAAM;EAAQ,MAAM;EAAe,CAAC;;AAGvE,SAAS,wBACP,MACA,UACM;CAQN,qBAAqB,UAAU;EAC7B,MAAM;EACN,WARA,MAAM,QAAQ,KAAK,QAAQ,GACzB,KAAK,QACF,KAAK,SAAU,OAAO,MAAM,SAAS,WAAW,KAAK,OAAO,GAAI,CAChE,OAAO,QAAQ,CACf,KAAK,OAAO,GACf,OAGoB;EACtB,WAAW,KAAK,qBAAqB;EACtC,CAAC;;AAGJ,SAAS,uBACP,MACA,MACA,UACA,UACM;CACN,IAAI,CAACA,WAAS,KAAK,EACjB,MAAM,IAAI,kCACR,mCACD;CAIH,MAAM,eAAe;EAAE;EAAM,MAFhB,mBAAmB,MAAM,QAAQ,GAAG,KAAK,YAErB;EAAE,WADjB,uBAAuB,MAAM,YAAY,IAAI,KAAA;EACjB;CAE9C,MAAM,aACJ,SAAS,WAAW,IAAI,sBAAsB,aAAa,CAAC,IACzD,6BAA6B,cAAc,SAAS;CACzD,MAAM,QACJ,SAAS,WACP,EAAE,OAAOC,iBAAe,MAAM,QAAQ,IAAI,IAAI,GAC9C,uBACEA,iBAAe,MAAM,YAAY,IAAI,MACrC,GAAG,KAAK,sBACT;CACL,qBAAqB,UAAU;EAC7B,MAAM;EACN,IAAI,mBAAmB,MAAM,WAAW,GAAG,KAAK,YAAY;EAC5D,MAAM,WAAW;EACjB;EACD,CAAC;;AAGJ,SAAS,qBACP,OACA,MAC2C;CAC3C,IAAI,UAAU,KAAA,KAAa,UAAU,MAAM,OAAO;CAClD,IAAI,OAAO,UAAU,UAAU,OAAO;CACtC,IAAI,CAAC,MAAM,QAAQ,MAAM,EACvB,MAAM,IAAI,kCACR,GAAG,KAAK,2BACT;CAEH,OAAO,MAAM,KAAK,MAAM,UACtB,yBAAyB,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,CACpD;;AAGH,SAAS,0BACP,OACA,MACuC;CACvC,IAAI,UAAU,KAAA,KAAa,UAAU,MAAM,OAAO,EAAE;CACpD,IAAI,OAAO,UAAU,UACnB,OAAO,QAAQ,CAAC;EAAE,MAAM;EAAQ,MAAM;EAAO,CAAC,GAAG,EAAE;CAErD,IAAI,CAAC,MAAM,QAAQ,MAAM,EACvB,MAAM,IAAI,kCACR,GAAG,KAAK,2BACT;CAEH,OAAO,MAAM,KAAK,MAAM,UAAU;EAChC,IAAI,CAACD,WAAS,KAAK,EACjB,MAAM,IAAI,kCACR,GAAG,KAAK,GAAG,MAAM,qBAClB;EAEH,MAAM,OAAOC,iBAAe,MAAM,OAAO;EACzC,IAAI,SAAS,gBAAgB,SAAS,iBAAiB,SAAS,QAC9D,MAAM,IAAI,kCACR,GAAG,KAAK,GAAG,MAAM,4CAA4C,QAAQ,UAAU,GAChF;EAEH,OAAO;GACL,MAAM;GACN,MAAM,mBAAmB,MAAM,QAAQ,GAAG,KAAK,GAAG,MAAM,GAAG;GAC5D;GACD;;AAGJ,SAAS,uBAAuB,OAAgB,MAAsB;CACpE,IAAI,UAAU,KAAA,KAAa,UAAU,MAAM,OAAO;CAClD,IAAI,OAAO,UAAU,UAAU,OAAO;CACtC,IAAI,CAAC,MAAM,QAAQ,MAAM,EACvB,MAAM,IAAI,kCACR,GAAG,KAAK,2BACT;CAEH,OAAO,MACJ,KAAK,MAAM,UAAU;EACpB,IAAI,CAACD,WAAS,KAAK,EACjB,MAAM,IAAI,kCACR,GAAG,KAAK,GAAG,MAAM,qBAClB;EAEH,MAAM,OAAOC,iBAAe,MAAM,OAAO;EACzC,IAAI,SAAS,gBAAgB,SAAS,iBAAiB,SAAS,QAC9D,MAAM,IAAI,kCACR,GAAG,KAAK,GAAG,MAAM,yCAAyC,QAAQ,UAAU,GAC7E;EAEH,OAAO,mBAAmB,MAAM,QAAQ,GAAG,KAAK,GAAG,MAAM,GAAG;GAC5D,CACD,KAAK,OAAO;;AAGjB,SAAS,yBACP,MACA,MACmE;CACnE,IAAI,CAACD,WAAS,KAAK,EACjB,MAAM,IAAI,kCAAkC,GAAG,KAAK,oBAAoB;CAE1E,MAAM,OAAOC,iBAAe,MAAM,OAAO;CACzC,IAAI,SAAS,gBAAgB,SAAS,iBAAiB,SAAS,QAC9D,OAAO;EAAE,MAAM;EAAQ,MAAM,mBAAmB,MAAM,QAAQ,KAAK;EAAE;CAEvE,IAAI,SAAS,qBACX,OAAO;EACL,MAAM;EACN,MAAM,mBAAmB,MAAM,qBAAqB,KAAK;EAC1D;CAEH,IAAI,SAAS,eACX,OAAO,mBAAmB,MAAM,KAAK;CAEvC,IAAI,SAAS,cACX,OAAO,kBAAkB,MAAM,KAAK;CAEtC,MAAM,IAAI,kCACR,GAAG,KAAK,iCAAiC,QAAQ,UAAU,GAC5D;;AAGH,SAAS,2BACP,OACA,MACiD;CACjD,IAAI,UAAU,KAAA,KAAa,UAAU,MAAM,OAAO;CAClD,IAAI,OAAO,UAAU,UAAU,OAAO;CACtC,IAAI,CAAC,MAAM,QAAQ,MAAM,EACvB,MAAM,IAAI,kCACR,GAAG,KAAK,2BACT;CAIH,MAAM,SAAS,MAAM,SAAS,MAAM,UAClC,uBAAuB,KAAK,GAC1B,EAAE,GACF,CAAC,yBAAyB,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,CAAC,CACxD;CACD,OAAO,OAAO,SAAS,IAAI,SAAS;;AAGtC,SAAS,uBAAuB,MAAwB;CACtD,IAAI,CAACD,WAAS,KAAK,EAAE,OAAO;CAC5B,MAAM,OAAO,KAAK;CAClB,QACG,SAAS,gBAAgB,SAAS,iBAAiB,SAAS,WAC1D,KAAK,SAAS;;AAIrB,SAAS,mBACP,MACA,MACqB;CACrB,MAAM,WAAWC,iBAAe,MAAM,YAAY;CAClD,IAAI,CAAC,UACH,MAAM,IAAI,kCACR,GAAG,KAAK,qEACT;CAEH,MAAM,SAAS,aAAa,SAAS;CACrC,IACE,CAAC,UACG,OAAO,cAAc,gBACpB,OAAO,cAAc,eACrB,OAAO,cAAc,eACrB,OAAO,cAAc,cAE1B,MAAM,IAAI,kCACR,GAAG,KAAK,qDACT;CAEH,OAAO;EACL,MAAM;EACN,QAAQ;GACN,MAAM;GACN,YAAY,OAAO;GACnB,MAAM,OAAO;GACd;EACF;;AAGH,SAAS,kBACP,MACA,MACwB;CACxB,MAAM,WAAWA,iBAAe,MAAM,YAAY;CAClD,IAAI,CAAC,UACH,MAAM,IAAI,kCACR,GAAG,KAAK,oEACT;CAEH,MAAM,SAAS,aAAa,SAAS;CACrC,IAAI,QAAQ,cAAc,mBACxB,MAAM,IAAI,kCACR,GAAG,KAAK,iCACT;CAEH,OAAO;EACL,MAAM;EACN,QAAQ;GACN,MAAM;GACN,YAAY;GACZ,MAAM,OAAO;GACd;EACD,OAAO,uBAAuB,MAAM,WAAW,IAAI;EACpD;;AAGH,SAAS,oBACP,YACA,UACyC;CACzC,IAAI,CAAC,YAAY,OAAO,KAAA;CACxB,IAAI,OAAO,eAAe,UAAU;EAClC,IAAI,eAAe,YAAY,OAAO,EAAE,MAAM,OAAO;EACrD,OAAO,EAAE,MAAM,YAAY;;CAG7B,MAAM,OAAQ,WAAgC;CAC9C,IAAI,SAAS,cAAc,SAAS,UAClC,MAAM,IAAI,kCACR,kEAAkE,OAAO,KAAK,CAAC,GAChF;CAEH,MAAM,UAAW,WAAgC;CAEjD,MAAM,aAAa,uBAAuB,UAAU,MAAM,SADxC,uBAAuB,YAAY,YAAY,IAAI,KAAA,EACQ;CAC7E,IAAI,CAAC,YACH,MAAM,IAAI,kCACR,kCAAkC,KAAK,SAAS,QAAQ,GACzD;CAEH,OAAO;EAAE,MAAM;EAAQ,MAAM,WAAW;EAAO;;AAGjD,SAAS,yBACP,UACA,UAC2B;CAC3B,MAAM,SAAoC,EAAE;CAC5C,KAAK,MAAM,CAAC,OAAO,UAAU,SAAS,QAAQ,SAAS,EAAE;EACvD,IAAI,MAAM,SAAS,YAAY;GAC7B,OAAO,KAAK;IACV,IAAI,wBACF,MAAM,iBAAiB,GAAG,SAAS,GAAG,GAAG,MAAM,YAAY,GAC5D;IACD,MAAM;IACN,QAAQ;IACR,GAAI,MAAM,YAAY,MAAM,aAAa,gBACvC,EAAE,SAAS,CAAC;KAAE,MAAM;KAAgB,MAAM,MAAM;KAAU,CAAC,EAAE,GAC7D,EAAE;IACJ,GAAI,MAAM,YAAY,EAAE,mBAAmB,MAAM,WAAW,GAAG,EAAE;IAClE,CAAC;GACF;;EAEF,IAAI,MAAM,SAAS,QAAQ;GACzB,OAAO,KAAK;IACV,IAAI,OAAO,iBAAiB,GAAG,SAAS,GAAG,GAAG,MAAM,UAAU;IAC9D,MAAM;IACN,MAAM;IACN,QAAQ;IACR,SAAS,CACP;KACE,MAAM;KACN,MAAM,MAAM;KACZ,aAAa,EAAE;KAChB,CACF;IACF,CAAC;GACF;;EAEF,IAAI,MAAM,SAAS,YACjB,OAAO,KACL,uBAAuB,OAAO,UAAU,GAAG,SAAS,GAAG,GAAG,MAAM,OAAO,CACxE;;CAGL,OAAO;;AAGT,SAAS,uBACP,OACA,UACA,QAC2D;CAC3D,MAAM,aAAa,sBAAsB,UAAU,MAAM,KAAK;CAC9D,MAAM,SAAS;EACb,SAAS,MAAM;EACf,MAAM,WAAW;EACjB,QAAQ;EACR,GAAI,WAAW,YAAY,EAAE,WAAW,WAAW,WAAW,GAAG,EAAE;EACpE;CACD,IAAI,WAAW,SAAS,UACtB,OAAO;EACL,GAAG;EACH,IAAI,OAAO,iBAAiB,OAAO;EACnC,MAAM;EACN,OAAO,sBAAsB,MAAM,MAAM;EAC1C;CAEH,OAAO;EACL,GAAG;EACH,IAAI,MAAM,iBAAiB,OAAO;EAClC,MAAM;EACN,WAAW,KAAK,UAAU,MAAM,MAAM;EACvC;;AAGH,SAAS,0BACP,UAC2B;CAE3B,IADmB,SAAS,QAAQ,MAAM,UAAU,MAAM,SAAS,WACrD,EACZ,MAAM,IAAI,kCACR,wDACA,IACD;CAEH,MAAM,UAAU,6BAA6B,SAAS,CAAC,MAAM;CAC7D,IAAI,CAAC,SACH,MAAM,IAAI,kCACR,mEACA,IACD;CAEH,OAAO,CACL;EACE,IAAI,OAAO,iBAAiB,QAAQ;EACpC,MAAM;EACN,mBAAmB,yBAAyB,QAAQ;EACrD,CACF;;AAGH,SAAS,6BAA6B,UAAqC;CACzE,OAAO,SAAS,QACb,SAAS,UAAW,MAAM,SAAS,SAAS,CAAC,MAAM,KAAK,GAAG,EAAE,CAAE,CAC/D,KAAK,GAAG;;AAGb,SAAS,oBAAoB,YAG3B;CACA,IAAI,eAAe,cACjB,OAAO;EAAE,QAAQ;EAAc,kBAAkB;EAAqB;CAExE,IAAI,eAAe,WACjB,OAAO;EAAE,QAAQ;EAAc,kBAAkB;EAAkB;CAErE,OAAO,EAAE,QAAQ,aAAa;;AAGhC,SAAS,yBACP,QAGY;CACZ,IAAI,WAAW,WAAW,OAAO;CACjC,IACE,WAAW,SACR,WAAW,YACX,WAAW,UACX,WAAW,WACX,WAAW,OAEd,OAAO;;AAKX,SAAS,sBAAsB,SAA+C;CAC5E,MAAM,kBAAkB,eAAe,UAAU,EAAE,iBAAiB,MAAM;CAC1E,IAAI,iBAAiB,OAAO;CAC5B,MAAM,iBAAiB,QAAQ,UAAU;CACzC,IAAI,gBAAgB,MAAM,EAAE,OAAO;CACnC,IAAI,QAAQ,mBAAmB,MAAM,EAAE,OAAO,QAAQ;CACtD,IAAI,QAAQ,kBAAkB,MAAM,EAAE,OAAO,QAAQ;;AAIvD,MAAM,0BAAiD,EAAE,MAAM,aAAa;AAI5E,SAAS,2BACP,UACA,QACM;CACN,MAAM,kBAAkB,OAAO,GAAG,GAAG;CACrC,IAAI,iBACF,gBAAgB,gBAAgB,EAAE,GAAG,yBAAyB;CAGhE,MAAM,kBAAkB,SAAS,UAC9B,YAA6C,QAAQ,SAAS,OAChE;CACD,IAAI,CAAC,iBAAiB;CAEtB,IAAI,OAAO,gBAAgB,YAAY,UAAU;EAM/C,gBAAgB,UAAU,CAAC;GAJzB,MAAM;GACN,MAAM,gBAAgB;GACtB,eAAe,EAAE,GAAG,yBAAyB;GAEX,CAAC;EACrC;;CAGF,MAAM,YAAY,gBAAgB,QAAQ,GAAG,GAAG;CAChD,IAAI,CAAC,WAAW;CAChB,UAAU,gBAAgB,EAAE,GAAG,yBAAyB;;AAG1D,SAAS,qBACP,UACA,OACM;CACN,MAAM,OAAO,SAAS,GAAG,GAAG;CAC5B,IAAI,MAAM,SAAS,eAAe,MAAM,QAAQ,KAAK,QAAQ,EAAE;EAC7D,KAAK,QAAQ,KAAK,MAAM;EACxB;;CAEF,MAAM,UAAqC;EACzC,MAAM;EACN,SAAS,CAAC,MAAM;EACjB;CACD,SAAS,KAAK,QAAQ;;AAGxB,SAAS,gBACP,UACA,OACM;CACN,MAAM,OAAO,SAAS,GAAG,GAAG;CAC5B,IAAI,MAAM,SAAS,UAAU,MAAM,QAAQ,KAAK,QAAQ,EAAE;EACxD,KAAK,QAAQ,KAAK,MAAM;EACxB;;CAEF,MAAM,UAAgC;EAAE,MAAM;EAAQ,SAAS,CAAC,MAAM;EAAE;CACxE,SAAS,KAAK,QAAQ;;AAGxB,SAAS,uBACP,OACA,OACyB;CACzB,IAAI;EACF,MAAM,SAAS,KAAK,MAAM,MAAM;EAChC,IAAID,WAAS,OAAO,EAAE,OAAO;SACvB;EACN,OAAO,EAAE;;CAEX,OAAO,EAAE;;AAGX,SAAS,aACP,OAC4C;CAC5C,MAAM,QAAQ,gCAAgC,KAAK,MAAM;CACzD,IAAI,CAAC,OAAO,OAAO;CACnB,OAAO;EAAE,WAAW,MAAM,GAAG,aAAa;EAAE,MAAM,MAAM;EAAI;;AAG9D,SAAS,uBACP,UACA,MACA,MACA,WACoC;CACpC,MAAM,UAAyC,EAAE;CACjD,KAAK,MAAM,cAAc,SAAS,WAAW,QAAQ,EAAE;EACrD,IAAI,WAAW,SAAS,QAAQ,WAAW,SAAS,MAAM;EAC1D,IAAI,cAAc,KAAA,GAAW;GAC3B,IAAI,WAAW,cAAc,WAAW,OAAO;GAC/C;;EAEF,QAAQ,KAAK,WAAW;;CAE1B,OACE,QAAQ,MAAM,eAAe,WAAW,cAAc,KAAA,EAAU,KAC5D,QAAQ,WAAW,IAAI,QAAQ,KAAK,KAAA;;AAI5C,SAAS,sBACP,MACQ;CACR,OAAO;EAAC,KAAK;EAAM,KAAK,aAAa;EAAI,KAAK;EAAK,CAAC,KAAK,KAAS;;AAGpE,SAAS,gBACP,eACA,aACA,UACQ;CACR,IACE,kBAAkB,KAAK,cAAc,IAClC,CAAC,SAAS,QAAQ,IAAI,cAAc,EAEvC,OAAO;CAGT,MAAM,YAAY,cAAc,QAAQ,qBAAqB,IAAI;CAGjE,MAAM,QAAQ,GAAG,QAFJ,iBAAiB,YAAY,CAAC,MAAM,GAAG,GACzB,CAAC,KACF,YAAY,MAAM,GAAG,GAAG;CAClD,IAAI,CAAC,SAAS,QAAQ,IAAI,MAAM,EAAE,OAAO;CACzC,OAAO,QAAQ,iBAAiB,GAAG,YAAY,YAAY,GAAG,MAAM,GAAG,GAAG;;AAG5E,SAAS,iBAAiB,OAAuB;CAC/C,OAAO,WAAW,SAAS,CAAC,OAAO,MAAM,CAAC,OAAO,MAAM,CAAC,MAAM,GAAG,GAAG;;AAGtE,SAAS,YAAY,OAAoC;CACvD,OAAOA,WAAS,MAAM,IAAI,OAAO,MAAM,SAAS,WAC5C,MAAM,OACN,KAAA;;AAGN,SAASC,iBAAe,OAAgB,OAAmC;CACzE,IAAI,CAACD,WAAS,MAAM,EAAE,OAAO,KAAA;CAC7B,MAAM,aAAa,MAAM;CACzB,OAAO,OAAO,eAAe,WAAW,aAAa,KAAA;;AAGvD,SAAS,uBACP,OACA,OAC2B;CAC3B,IAAI,CAACA,WAAS,MAAM,EAAE,OAAO,KAAA;CAC7B,MAAM,aAAa,MAAM;CACzB,OAAO,OAAO,eAAe,YAAY,eAAe,OACpD,aACA,KAAA;;AAGN,SAAS,mBACP,OACA,OACA,MACQ;CACR,MAAM,SAASC,iBAAe,OAAO,MAAM;CAC3C,IAAI,CAAC,QACH,MAAM,IAAI,kCAAkC,GAAG,KAAK,GAAG,MAAM,cAAc;CAE7E,OAAO;;AAGT,SAAS,cAAc,OAAgB,OAA+B;CACpE,IAAI,CAACD,WAAS,MAAM,EAAE,OAAO,EAAE;CAC/B,OAAO,MAAM,QAAQ,MAAM,OAAO,GAAG,MAAM,SAAS,EAAE;;AAGxD,SAASA,WAAS,OAAkD;CAClE,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,MAAM;;ACltC7E,MAAa,4CAA4C;AAGzD,MAAa,qCACX,SACA,qBAC+D;CAC/D,IAAI,CAAC,QAAQ,aAAa,OAAO,QAAQ,UAAU,WAAW,UAC5D;CAGF,MAAM,iBAAiB,gCACrB,QAAQ,UAAU,QAClB,iBACD;CACD,IAAI,CAAC,kBAAkB,mBAAmB,QAAQ,UAAU,QAC1D;CAGF,MAAM,kBAAkB,QAAQ,UAAU;CAC1C,QAAQ,UAAU,SAAS;CAC3B,OAAO;EAAE,MAAM;EAAiB,IAAI;EAAgB;;AAGtD,MAAa,6BAA6B;CACxC,sCACEE;CAEAC;CAEAC;CACF;CACgCC;CACjC;AAED,MAAa,8BACX,YACqD;CAIrD,OAAO;EAAE,QAHM,eAAe,QAGf;EAAE,WAFC,kBAAkB,QAAQ,GAAG,UAAU;EAE7B;;AAG9B,MAAa,iCACX,eAKA,UAEI,EAAE,KACwB;CAC9B,MAAM,qBAAqB,eAAe,uBAAuB,EAAE;CACnE,MAAM,eACJ,2BAA2B,gCAAgC;CAE7D,IACE,QAAQ,gBAAA,KACL,gBACA,mBAAmB,SAAA,gBAA+B,EAErD,OAAO;CAGT,IAAI,mBAAmB,SAAA,aAA4B,EACjD,OAAO;CAGT,OAAO;;AAGT,MAAa,qBAAqB,YAAuC;CAEvE,MAAM,WAAW,gBAAgB,QAAQ,CAAC,GAAG,GAAG;CAChD,IAAI,CAAC,UACH,OAAO;CAET,IAAI,EAAE,UAAU,aAAa,CAAC,SAAS,MACrC,OAAO;CAIT,QADE,OAAO,SAAS,SAAS,WAAW,SAAS,KAAK,aAAa,GAAG,QACpD;;AAGlB,MAAa,kBAAkB,YAAuC;CAEpE,OADe,gBAAgB,QAClB,CAAC,MAAM,SAAS,sBAAsB,KAAK,CAAC;;AAG3D,MAAM,kBAAkB;AAExB,MAAM,sCACJ,2BACE;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC,KAAK,GAAG;AAEZ,MAAM,wCAAwC,CAC5C,6CACD;AAED,MAAa,kCACX,YACW;CACX,IAAI,CAAC,MAAM,QAAQ,QAAQ,MAAM,EAC/B,OAAO;CAGT,IAAI,oBAAoB;CACxB,KAAK,MAAM,QAAQ,QAAQ,OAAO;EAChC,IAAI,OAAO,SAAS,YAAY,SAAS,MACvC;EAGF,MAAM,SAAS;EACf,KAAK,MAAM,SAAS,uCAAuC;GACzD,IAAI,CAAC,OAAO,OAAO,QAAQ,MAAM,EAC/B;GAGF,OAAO,OAAO;GACd,qBAAqB;;;CAIzB,OAAO;;AAGT,MAAa,gCACX,SACA,uBACW;CACX,MAAM,QACJ,OAAO,uBAAuB,YAAY,qBAAqB,IAC7D,qBACA,KAAA;CAEJ,IAAI,UAAU,KAAA,KAAa,CAAC,MAAM,QAAQ,QAAQ,MAAM,EACtD,OAAO;CAGT,OAAO,oBACL,QAAQ,QACP,UAAU,MAAM,eAAe,MACjC;;AAWH,MAAa,8BACX,YACW;CACX,IAAI,CAAC,MAAM,QAAQ,QAAQ,MAAM,EAC/B,OAAO;CAGT,IAAI,kBAAkB;CACtB,KAAK,MAAM,SAAS,mBAAmB,QAAQ,MAAM,EAAE;EACrD,IACE,MAAM,WAAW,KAAA,KACd,0BAA0B,IAAI,MAAM,OAAO,EAE9C;EAGF,MAAM,SAAS;EACf,mBAAmB;;CAGrB,OAAO;;AAQT,MAAM,uBACJ,OACA,kBACW;CACX,IAAI,QAAQ;CACZ,KAAK,MAAM,UAAU,mBAAmB,MAAM,EAAE;EAC9C,MAAM,QAAQ,qBAAqB,OAAO;EAC1C,IAAI,CAAC,OACH;EAGF,IAAI,CAAC,cAAc,MAAM,EACvB;EAGF,iCAAiC,MAAM;EACvC,SAAS;;CAGX,OAAO;;AAGT,MAAM,sBACJ,OACA,SAAoC,EAAE,KACR;CAC9B,KAAK,MAAM,QAAQ,OACjB,IAAI,uBAAuB,KAAK,EAC9B,qBAAqB,KAAK,SAAS,OAAO;MACrC,IAAI,iCAAiC,KAAK,EAC/C,qBAAqB,KAAK,QAAQ,OAAO;CAI7C,OAAO;;AAGT,MAAM,wBACJ,SACA,WACS;CACT,IAAI,CAAC,MAAM,QAAQ,QAAQ,EACzB;CAGF,KAAK,MAAM,SAAS,SAClB,IAAI,qBAAqB,MAAM,EAC7B,OAAO,KAAK,MAAM;;AAKxB,MAAM,wBACJ,UAC6B;CAC7B,IAAI,OAAO,MAAM,cAAc,UAC7B,OAAO;CAGT,MAAM,WAAW,MAAM;CACvB,IAAI,CAAC,SAAS,WAAW,gBAAgB,EACvC,OAAO;CAKT,OAAO;EACL,cAHmB,0BAA0B,SAGjC;EACZ,QAAQ;EACT;;AAGH,MAAM,6BAA6B,UAA0B;CAC3D,OAAO,KAAK,IAAI,GAAG,KAAK,MAAO,MAAM,SAAS,IAAK,EAAE,CAAC;;AAGxD,MAAM,oCAAoC,UAAmC;CAC3E,MAAM,OAAO,OAAO;CACpB,MAAM,OAAO,YAAY;CACzB,MAAM,OAAO,SAAS;CACtB,OAAO,MAAM,OAAO;;AAGtB,MAAM,4BAEF,IAAI,IAAI;CAAC;CAAQ;CAAQ;CAAM,CAAC;AAEpC,MAAM,0BACJ,SACiC;CACjC,OACE,OAAO,SAAS,YACb,SAAS,QACT,UAAU,QACV,OAAO,KAAK,SAAS;;AAI5B,MAAM,oCACJ,SAGoC;CACpC,OACE,OAAO,SAAS,YACb,SAAS,QACT,UAAU,SACT,KAAK,SAAS,6BACb,KAAK,SAAS;;AAIvB,MAAM,wBACJ,YACkC;CAClC,OACE,OAAO,YAAY,YAChB,YAAY,QACZ,UAAU,WACV,QAAQ,SAAS;;AAIxB,MAAa,oCACX,iBACA,wBAAwB,8CACb;CACX,IAAI,OAAO,oBAAoB,YAAY,kBAAkB,GAC3D,OAAO,KAAK,MAAM,kBAAkB,sBAAsB;CAG5D,OAAO,MAAU;;AAGnB,MAAM,wCACJ,UACuB;CACvB,MAAM,YACJ,2BAA2B,qCAAqC,MAAM;CAExE,IACE,OAAO,cAAc,YAClB,CAAC,OAAO,SAAS,UAAU,IAC3B,aAAa,GAEhB;CAGF,OAAO;;AAGT,MAAM,qCACJ,qBACmD,CACnD;CACE,MAAM;CACN,mBAAmB;CACpB,CACF;AAED,MAAa,+BACX,SACA,wBACS;CACT,IAAI,CAAC,MAAM,QAAQ,QAAQ,MAAM,EAAE;CAEnC,QAAQ,QAAQ,QAAQ,MAAM,QAAQ,SAAS;EAC7C,IAAI,KAAK,SAAS,aAAa,OAAO;EACtC,OAAO,sBAAsB,KAAK,GAAG,KAAK;GAC1C;;AAGJ,MAAa,sCACX,SACA,iBACA,YAIY;CACZ,IAAI,CAAC,QAAQ,MAAM,WAAW,MAAM,EAClC,OAAO;CAGT,IAAI,2BAA2B,eAAe,QAAQ,MAAM,EAC1D,OAAO;CAGT,IAAI,6BAA6B,QAAQ,EACvC,OAAO,oCAAoC,QAAQ,OAAO;CAG5D,IAAI,QAAQ,uBAAuB,KAAA,GACjC,OAAO;CAGT,IAAI,CAAC,oCAAoC,QAAQ,OAAO,EACtD,OAAO;CAMT,QAAQ,qBAAqB,kCAHC,qCAC5B,QAAQ,MAGa,IAChB,iCACD,iBACA,QAAQ,yBAAA,IAET,CACJ;CACD,OAAO;;AAGT,MAAM,uCACJ,WACY;CACZ,IAAI,WAAW,YACb,OAAO,2BAA2B,uCAAuC;CAG3E,OAAO,2BAA2B,wCAAwC;;AAG5E,MAAM,gCAAgC,YAAuC;CAC3E,MAAM,EAAE,UAAU;CAClB,IAAI,CAAC,MAAM,QAAQ,MAAM,IAAI,MAAM,WAAW,GAC5C,OAAO;CAGT,OAAO,wBAAwB,MAAM,GAAG,GAAG,EAAE,qBAAqB;;AAGpE,MAAa,kCACX,YACS;CACT,IAAI,CAAC,MAAM,QAAQ,QAAQ,MAAM,IAAI,QAAQ,MAAM,WAAW,GAC5D;CAGF,MAAM,+BAA+B,gCACnC,QAAQ,MACT;CAED,IAAI,iCAAiC,KAAA,GACnC;CAGF,QAAQ,QAAQ,QAAQ,MAAM,MAAM,6BAA6B;;AAGnE,MAAM,mCACJ,UACuB;CACvB,KAAK,IAAI,QAAQ,MAAM,SAAS,GAAG,SAAS,GAAG,SAAS,GACtD,IAAI,sBAAsB,MAAM,OAAO,EACrC,OAAO;;AAOb,MAAM,yBAAyB,UAAsC;CACnE,OAAO,wBAAwB,OAAO,aAAa;;AAGrD,MAAM,2BAA2B,OAAgB,SAA0B;CACzE,OACE,OAAO,UAAU,YACd,UAAU,QACV,UAAU,SACV,MAAM,SAAS;;AAItB,MAAM,mBACJ,YAC6B;CAC7B,MAAM,SAAmC,EAAE;CAE3C,MAAM,EAAE,UAAU;CAElB,IAAI,MAAM,QAAQ,MAAM,EACtB,OAAO,KAAK,GAAG,MAAM;CAGvB,OAAO;;AAGT,MAAM,yBAAyB,UAA4B;CACzD,IAAI,CAAC,OAAO,OAAO;CAEnB,IAAI,MAAM,QAAQ,MAAM,EACtB,OAAO,MAAM,MAAM,UAAU,sBAAsB,MAAM,CAAC;CAG5D,IAAI,OAAO,UAAU,UACnB,OAAO;CAGT,MAAM,SAAS;CAIf,KAFE,OAAO,OAAO,SAAS,WAAW,OAAO,KAAK,aAAa,GAAG,KAAA,OAEnD,eACX,OAAO;CAGT,IAAI,MAAM,QAAQ,OAAO,QAAQ,EAC/B,OAAO,OAAO,QAAQ,MAAM,UAAU,sBAAsB,MAAM,CAAC;CAGrE,OAAO;;;;AC3dT,MAAa,4BAA4B;CACtBC;CACjB;CACA,sBACE,SACA,WACA,mBAEA,gCAAgC;EAC9B,UAAU;EACV,mBAAmB;EACnB,OAAO,kBAAkB,QAAQ;EACjC,WAAW,oBAAoB,QAAQ,UAAU,QAAQ,CAAC;EAC3D,CAAC;CACL;AAYD,MAAM,yBAAyB,SAC7B,OAAO,KAAK,SAAS,YAClB,KAAK,KAAK,WAAW,aAAa,IAClC,CAAC,KAAK;;AAGX,MAAa,0BACX,YAEA,MAAM,QAAQ,QAAQ,MAAM,IAAI,QAAQ,MAAM,KAAK,sBAAsB;;;;;;AAO3E,MAAa,0BACX,YAEA,MAAM,QAAQ,QAAQ,MAAM,IACzB,QAAQ,MAAM,SAAS,KACvB,QAAQ,MAAM,MAAM,sBAAsB;;AAG/C,MAAa,4BACX,YACS;CACT,IAAI,CAAC,MAAM,QAAQ,QAAQ,MAAM,EAAE;CACnC,QAAQ,QAAQ,QAAQ,MAAM,QAAQ,SAAS,CAAC,sBAAsB,KAAK,CAAC;;AAsB9E,MAAa,wBAAwB,OACnC,SACA,YAK4B;CAC5B,MAAM,EAAE,gBAAgB,8BAA8B;CACtD,IAAI,CAAC,kBAAkB,CAAC,uBAAuB,QAAQ,EACrD,OAAO,EAAE,MAAM,SAAS;CAE1B,MAAM,QAAQ,wBAAwB,eAAe;CACrD,IAAI,OAAO;EACT,MAAM,kBAAkB,MAAM,mCAC5B,OACA,QAAQ,yBAAyB,sBAClC;EACD,OAAO,kBACH;GAAE,MAAM;GAAY,OAAO;GAAiB,GAC5C,EAAE,MAAM,SAAS;;CAEvB,IAAI,2BACF,OAAO;EAAE,MAAM;EAAa,OAAO;EAAgB;CAErD,OAAO,EAAE,MAAM,SAAS;;AAG1B,MAAa,0BACX,YACwB;CACxB,MAAM,OAAO,QAAQ,OAAO,KAAK,sBAAsB;CACvD,OAAO;EACL,gBAAgB,MAAM;EACtB,gBAAgB,MAAM;EACtB,cAAc,MAAM;EACrB;;AAGH,MAAM,6BACJ,WACA,YACmC;CAUnC,OAAO;EACL,MAAM;EACN,aAAa;EACb,SAZiD,QAAQ,QAAQ,KAChE,YAAY;GACX,MAAM;GACN,KAAK,OAAO;GACZ,OAAO,OAAO;GACd,UAAU,OAAO,YAAY;GAC7B,mBAAmB;GACpB,EAKa;EACf;;;;;;AAOH,MAAM,wBACJ,WACA,YAC+D;CAC/D,MAAM,SAAqE,EAAE;CAC7E,MAAM,QAAQ,QAAQ,QAAQ,MAAM;CACpC,IAAI,QAAQ,QAAQ,SAAS,KAAK,OAAO;EACvC,MAAM,YAAY,YAAY,QAAQ,UAAU;EAChD,OAAO,KACL;GACE,MAAM;GACN,IAAI;GACJ,MAAM;GACN,OAAO,EAAE,OAAO;GACjB,EACD,0BAA0B,WAAW,QAAQ,CAC9C;;CAEH,OAAO,KAAK;EAAE,MAAM;EAAQ,MAAM,QAAQ;EAAY,CAAC;CACvD,OAAO;;AAGT,MAAa,oCACX,SACA,UAGI,EAAE,KACe;CACrB,MAAM,SAAS,uBAAuB,QAAQ;CAQ9C,MAAM,mBAAmB,6CACvB;EAPA,GAAG;EACH,OAAO,QAAQ,SAAS,QAAQ;EAChC,OAAO,EAAE;EACT,QAAQ;EAIO,EACf,QAAQ,gBACT;CACD,iBAAiB,QAAQ,CACvB,4BAA4B;EAAE,GAAG;EAAQ,mBAAmB;EAAO,CAAC,CACrE;CACD,iBAAiB,cAAc,KAAA;CAC/B,iBAAiB,YAAY;EAC3B,QAAQ;EACR,SAAS;EACV;CACD,OAAO;;AAGT,MAAa,gCACX,SACA,QACA,YAMG;CACH,MAAM,UAAU,uBAAuB,OAAO;CAoB9C,OAAO;EAAE;EAAS,UAAA;GAhBhB,IAAI,OAAO,MAAM,QAAQ,QAAQ,UAAU;GAC3C,MAAM;GACN,MAAM;GACN,SAAS,qBAAqB,QAAQ,WAAW,QAAQ;GACzD,OAAO,QAAQ;GACf,aAAa;GACb,eAAe;GACf,OAAO;IACL,cAAc,OAAO,OAAO,gBAAgB;IAC5C,eAAe,OAAO,OAAO,iBAAiB;IAC9C,iBAAiB,EACf,qBAAqB,KAAK,IAAI,QAAQ,QAAQ,QAAQ,EAAE,EACzD;IACF;GAGuB;EAAE;;AAG9B,MAAM,8BACJ,UAC6B;CAC7B,OACE,QAAQ,MAAM,IACX,OAAQ,MAA0B,OAAO,mBAAmB;;AAInE,MAAM,uBACJ,SACA,WACA,mBAEA,0BAA0B,oBACxB,SACA,WACA,eACD;;;;;;;;;;AAWH,MAAa,qBAAqB,OAChC,GACA,SACA,YAQ6B;CAC7B,IAAI,CAAC,uBAAuB,QAAQ,EAAE,OAAO;CAE7C,wBAAwB,QAAQ;CAEhC,MAAM,QAAQ,MAAM,sBAAsB,SAAS;EACjD,gBAAgB,6BAA6B;EAC7C,2BAA2B,gCAAgC;EAC3D,uBAAuB,0BAA0B;EAClD,CAAC;CAEF,IAAI,MAAM,SAAS,YAAY;EAC7B,QAAQ,QAAQ,MAAM,MAAM;EAC5B,OAAO,MAAM,QAAQ,kBAAkB,GAAG,SAAS,MAAM,MAAM,SAAS;;CAG1E,IAAI,MAAM,SAAS,aAAa;EAC9B,IAAI,YAAY,iBAAiB,SAAS,EAAE;EAC5C,MAAM,YAAY,6BAA6B,SAAS,UAAU;EAClE,IAAI,CAAC,WACH,YAAY,QAAQ,UAAU;EAEhC,OAAO,MAAM,4BAA4B,GAAG,SAAS;GACnD,gBAAgB;GAChB,gBAAgB,MAAM;GACtB;GACA;GACA,aAAa;GACb,QAAQ,QAAQ;GACjB,CAAC;;CAGJ,yBAAyB,QAAQ;CACjC,OAAO;;;;;;;;;AAUT,MAAa,8BAA8B,OACzC,GACA,SACA,YACG;CACH,MAAM,EAAE,QAAQ,mBAAmB;CACnC,MAAM,cAAc,QAAQ,QAAQ,OAAO;CAK3C,MAAM,mBAAmB,iCAAiC,SAAS;EACjE,OAAO;EACP,iBAAiB,QAAQ,gBAAgB;EAC1C,CAAC;CAEF,MAAM,gBAAmC,kBAAkB,eAAe;CAC1E,MAAM,EAAE,QAAQ,cAAc,2BAA2B,iBAAiB;CAC1E,MAAM,YACJ,8BAA8B,eAAe,EAC3C,aAAa,QAAQ,aACtB,CAAC,IAAI;CAER,UACE,QACA,0CAA0C,kBAC1C,iBACD;CAED,MAAM,iBAAiB,MAAM,0BAA0B,gBACrD,kBACA;EACE;EACA;EACA;EACA,gBAAgB,QAAQ;EACxB,WAAW,QAAQ;EACnB,WAAW,QAAQ;EACnB,QAAQ,EAAE,KAAK,KAAK;EACpB,aAAa,QAAQ;EACtB,CACF;CAED,MAAM,SACJ,2BAA2B,eAAe,GACxC,MAAM,6BAA6B;EACjC,oBAAoB;EACpB,kBAAkB;EAClB;EACD,CAAC,GACF;CAEJ,MAAM,EAAE,SAAS,aAAa,6BAA6B,SAAS,QAAQ,EAC1E,WAAW,QAAQ,WACpB,CAAC;CAEF,UACE,QACA,6BAA6B,QAAQ,QAAQ,OAAO,gBAAgB,QAAQ,QAAQ,OAAO,aAC3F,OACD;CAOD,oBAJE,SACA,QAAQ,WACR,eAES,CAAC;EACV,GAAG,wBAAwB,OAAO,MAAM;EACxC,gBAAgB,uBACd,OAAO,eAAe,eACvB;EACF,CAAC;CAEF,IAAI,CAAC,aACH,OAAO,EAAE,KAAK,SAAS;CAGzB,OAAO,UAAU,GAAG,OAAO,WAAW;EACpC,KAAK,MAAM,SAAS,2BAA2B,SAAS,EAAE;GACxD,MAAM,OAAO,KAAK,UAAU,MAAM;GAClC,OAAO,MAAM,2BAA2B,KAAK;GAC7C,MAAM,OAAO,SAAS;IACpB,OAAO,MAAM;IACP;IACP,CAAC;;GAEJ;;AAGJ,MAAM,uBACJ,OACA,UACoC;CACpC,MAAM,SACJ,kBACqC;EACrC,MAAM;EACN;EACA,eAAe;EAChB;CACD,MAAM,OAAiC;EACrC,MAAM;EACN;EACD;CAED,QAAQ,MAAM,MAAd;EACE,KAAK,QACH,OAAO;GACL,MAAM;IAAE,MAAM;IAAQ,MAAM;IAAI,CAAC;GACjC;IACE,MAAM;IACN;IACA,OAAO;KAAE,MAAM;KAAc,MAAM,MAAM;KAAM;IAChD;GACD;GACD;EAEH,KAAK,mBACH,OAAO;GACL,MAAM;IACJ,MAAM;IACN,IAAI,MAAM;IACV,MAAM,MAAM;IACZ,OAAO,EAAE;IACV,CAAC;GACF;IACE,MAAM;IACN;IACA,OAAO;KACL,MAAM;KACN,cAAc,KAAK,UAAU,MAAM,MAAM;KAC1C;IACF;GACD;GACD;EAEH,KAAK,0BAEH,OAAO,CAAC,MAAM,MAAM,EAAE,KAAK;EAE7B,SACE,OAAO,CAAC,MAAM,MAAM,EAAE,KAAK;;;AAKjC,MAAa,8BACX,aAGoC;CACpC,MAAM,SAA0C,EAAE;CAElD,OAAO,KAAK;EACV,MAAM;EACN,SAAS;GACP,IAAI,SAAS;GACb,MAAM;GACN,MAAM;GACN,SAAS,EAAE;GACX,OAAO,SAAS;GAChB,aAAa;GACb,eAAe;GACf,OAAO;IAAE,GAAG,SAAS;IAAO,eAAe;IAAG;GAC/C;EACF,CAAC;CAEF,SAAS,QAAQ,SAAS,OAAO,UAAU;EACzC,OAAO,KAAK,GAAG,oBAAoB,OAAO,MAAM,CAAC;GACjD;CAEF,OAAO,KACL;EACE,MAAM;EACN,OAAO;GACL,aAAa,SAAS;GACtB,eAAe,SAAS;GACzB;EACD,OAAO,EAAE,eAAe,SAAS,MAAM,eAAe;EACvD,EACD,EAAE,MAAM,gBAAgB,CACzB;CAED,OAAO;;;;AC/hBT,MAAM,eAA4C;CAChD;EACE,eAAe;EACf,IAAI;EACJ,OAAO,CAAC,OAAO;EACf,WAAW;EACX,MAAM;EACN,kBAAkB;GAAC;GAAW;GAAO;GAAU;GAAQ;GAAQ;EAChE;CACD;EACE,eAAe;EACf,IAAI;EACJ,OAAO,CAAC,QAAQ,QAAQ;EACxB,WAAW;EACX,MAAM;EACN,kBAAkB;GAAC;GAAW;GAAO;GAAU;GAAQ;GAAQ;EAChE;CACD;EACE,eAAe;EACf,IAAI;EACJ,OAAO,CAAC,QAAQ,QAAQ;EACxB,WAAW;EACX,MAAM;EACN,kBAAkB;GAAC;GAAW;GAAO;GAAU;GAAQ;GAAQ;EAChE;CACD;EACE,eAAe;EACf,IAAI;EACJ,OAAO,CAAC,QAAQ,QAAQ;EACxB,WAAW;EACX,MAAM;EACN,kBAAkB;GAAC;GAAQ;GAAO;GAAU;GAAQ;GAAS;GAAM;EACpE;CACD;EACE,eAAe;EACf,IAAI;EACJ,OAAO,CAAC,QAAQ,QAAQ;EACxB,WAAW;EACX,MAAM;EACN,kBAAkB;GAAC;GAAQ;GAAO;GAAU;GAAQ;GAAS;GAAM;EACpE;CACD;EACE,eAAe;EACf,IAAI;EACJ,OAAO,CAAC,QAAQ,QAAQ;EACxB,WAAW;EACX,MAAM;EACN,kBAAkB;GAAC;GAAQ;GAAO;GAAU;GAAQ;GAAS;GAAM;EACpE;CACD;EACE,eAAe;EACf,IAAI;EACJ,OAAO,CAAC,QAAQ,QAAQ;EACxB,WAAW;EACX,MAAM;EACN,kBAAkB;GAAC;GAAO;GAAU;GAAQ;GAAS;GAAM;EAC5D;CACF;AAED,MAAM,mBAAmB,GAAG,mBAAmB;AAC/C,MAAM,0BAA0B;AAEhC,SAAgB,sBAAsB,YAA4B;CAChE,MAAM,cAAc,IAAI,IAAI,iBAAiB;CAC7C,YAAY,SAAS,IAAI,IAAI,YAAY,mBAAmB,CAAC;CAC7D,OAAO,YAAY,UAAU;;AAG/B,eAAsB,mBACpB,YACA,gBACmB;CACnB,MAAM,UAAU,yBAAyB,eAAe;CACxD,IAAI,CAAC,QAAQ,IAAI,SAAS,EACxB,QAAQ,IAAI,UAAU,mBAAmB;CAG3C,OAAO,MAAM,MAAM,sBAAsB,WAAW,EAAE;EACpD,QAAQ;EACR;EACA,QAAQ,YAAY,QAAQ,wBAAwB;EACrD,CAAC;;AAGJ,SAAS,oBAAoB,OAAoC;CAC/D,MAAM,iBAAiB,MAAM,MAAM,SAAS,QAAQ;CAEpD,OAAO;EACL,cAAc;GACZ,QAAQ;GACR,QAAQ;IACN,2BAA2B,MAAM;IACjC,mBAAmB,MAAM;IACzB,mBAAmB,MAAM;IAC1B;GACD,QAAQ;GACR,UAAU;IACR,mBAAmB;IACnB,qBAAqB;IACrB,kBAAkB,MAAM;IACxB,WAAW;IACX,YAAY;IACZ,QAAQ;IACT;GACD,WAAW;GACX,MAAM;GACP;EACD,IAAI,MAAM;EACV,sBAAsB;EACtB,MAAM,MAAM;EACZ,QAAQ;EACR,SAAS;EACT,qBAAqB,CAAC,gBAAgB,gBAAgB;EACtD,QAAQ;EACR,SAAS;EACV;;AAGH,SAAgB,YAA4B;CAC1C,OAAO;EACL,QAAQ;EACR,MAAM,aAAa,KAAK,UAAU,oBAAoB,MAAM,CAAC;EAC9D;;;;ACpCH,MAAMC,YAAS,oBAAoB,4BAA4B;AAE/D,MAAa,sCAAsC,EACjD,uBACD;AAED,eAAsB,uBACpB,GACmB;CACnB,MAAM,WAAW,EAAE,IAAI,MAAM,WAAW;CACxC,MAAM,UAAU,MAAM,EAAE,IAAI,MAAgC;CAE5D,MAAM,kBAAkB,oBAAoB;CAC5C,IAAI,mBAAmB,yBAAyB,QAAQ,EAAE;EACxD,QAAQ,MACN,+BAA+B,SAAS,KAAK,QAAQ,MAAM,MAAM,kBAClE;EACD,QAAQ,QAAQ;;CAGlB,OAAO,MAAM,kCAAkC,GAAG;EAChD;EACA;EACD,CAAC;;AAGJ,eAAsB,kCACpB,GACA,SAKmB;CACnB,MAAM,EAAE,SAAS,UAAU,kBAAkB;CAC7C,MAAM,iBACJ,MAAM,oCAAoC,sBAAsB,SAAS;CAC3E,IAAI,CAAC,gBACH,OAAO,EAAE,KACP,EACE,OAAO;EACL,SAAS,aAAa,SAAS;EAC/B,MAAM;EACP,EACF,EACD,IACD;CAGH,IAAI;EACF,MAAM,cAAc,eAAe,SAAS,QAAQ;EACpD,MAAM,gBAAgB,6BACpB,gBACA,QAAQ,MACT;EACD,UAAUA,WAAQ,6BAA6B;GAAE;GAAS;GAAU,CAAC;EAErE,wBAAwB,QAAQ;EAEhC,mBAAmB,SAAS,YAAY;EAExC,IAAI,kBAAkB,oBAAoB;GACxC,IAAI,uBAAuB,QAAQ,EAAE;IACnC,IAAI,uBAAuB,QAAQ,EACjC,OAAO,MAAM,+CAA+C,GAAG;KAC7D;KACA;KACA;KACA;KACA;KACD,CAAC;IAGJ,yBAAyB,QAAQ;;GAGnC,OAAO,MAAM,sCAAsC,GAAG;IACpD;IACA;IACA;IACA;IACA;IACD,CAAC;;EAGJ,IAAI,kBAAkB,qBAAqB;GACzC,yBAAyB,QAAQ;GAEjC,OAAO,MAAM,uCAAuC,GAAG;IACrD;IACA;IACA;IACA;IACA;IACD,CAAC;;EAGJ,sBAAsB,SAA+C,EACnE,WAAW,aAAa,WACzB,CAAC;EAEF,UAAUA,WAAQ,wCAAwC;GACxD;GACA;GACD,CAAC;EACF,MAAM,mBAAmB,MAAM,wBAC7B,kBAAkB,eAAe,OAC/B,iBACA;GACE,GAAG;GACH,MAAM;GACN,UAAU,wBACR,eAAe,MACf,KAAA,GACA,cACD;GACF,EACH,SACA,EAAE,IAAI,IAAI,QACX;EAED,IAAI,CAAC,iBAAiB,IAAI;GACxB,UAAO,MAAM,8BAA8B,iBAAiB;GAC5D,MAAM,IAAI,UAAU,8BAA8B,iBAAiB;;EAGrE,MAAM,cAAc,iBAAiB,QAAQ,IAAI,eAAe,IAAI;EAIpE,IAFE,QAAQ,QAAQ,OAAO,IAAI,YAAY,SAAS,oBAAoB,EAGpE,OAAO,uBAAuB;GAC5B;GACA;GACA;GACA,iBAAiB,eAAe;GAChC;GACA;GACA;GACD,CAAC;EAIJ,OAAO,4BAA4B,GAAG;GACpC,MAAM,MAFgB,iBAAiB,MAAM;GAG7C;GACA;GACA,iBAAiB,eAAe;GAChC;GACA;GACD,CAAC;UACK,OAAO;EACd,UAAO,MAAM,2BAA2B;GACtC;GACA;GACD,CAAC;EACF,MAAM;;;AAIV,MAAM,iDAAiD,OACrD,GACA,YAOsB;CACtB,MAAM,EAAE,aAAa,SAAS,UAAU,gBAAgB,kBACtD;CACF,MAAM,mBAAmB,iCAAiC,QAAQ;CAClE,MAAM,4BAA4B,0CAChC,kBACA,eACD;CACD,IAAI,2BACF,UAAO,MACL,oCAAoC,0BAA0B,KAAK,MAAM,0BAA0B,GAAG,4CACvG;CAGH,UAAUA,WAAQ,kDAAkD;EAClE,SAAS;EACT;EACD,CAAC;CAEF,IAAI,eAAe,SAAS,SAAS;EACnC,MAAM,mBAAmB,MAAM,sBAC7B,kBACA,EAAE,IAAI,IAAI,SACV,eAAe,SACf,EAAE,QAAQ,EAAE,IAAI,IAAI,QAAQ,CAC7B;EAED,IAAI,kBAAkB,iBAAiB,EAQrC,OAAO,qCAAqC,GAAG;GAC7C,MAAA,MARiB,6BAA6B;IAC9C,oBAAoB,GAAG,SAAS;IAChC,aAAa,SACX,kCAAkC,MAAM,eAAe;IACzD;IACA,QAAA;IACD,CAAC;GAGA;GACA;GACA,iBAAiB,eAAe;GAChC;GACA;GACD,CAAC;EAGJ,OAAO,qCAAqC,GAAG;GAC7C,MAAM;GACN;GACA;GACA,iBAAiB,eAAe;GAChC;GACA;GACD,CAAC;;CAGJ,MAAM,mBAAmB,MAAM,yBAC7B,gBACA,kBACA,EAAE,IAAI,IAAI,SACV,EAAE,QAAQ,EAAE,IAAI,IAAI,QAAQ,CAC7B;CAED,IAAI,CAAC,iBAAiB,IAAI;EACxB,UAAO,MAAM,kDAAkD;GAC7D;GACA;GACD,CAAC;EACF,MAAM,IAAI,UACR,kDACA,iBACD;;CAIH,KADoB,iBAAiB,QAAQ,IAAI,eAAe,IAAI,IACpD,SAAS,oBAAoB,EAW3C,OAAO,qCAAqC,GAAG;EAC7C,MAAA,MAXiB,6BAA6B;GAC9C,oBAAoB,GAAG,SAAS;GAChC,aAAa,SACX,kCAAkC,MAAM,eAAe;GACzD,kBAAkB,+BAChB,kBACA,EAAE,IAAI,IAAI,OACX;GACD,QAAA;GACD,CAAC;EAGA;EACA;EACA,iBAAiB,eAAe;EAChC;EACA;EACD,CAAC;CAIJ,OAAO,qCAAqC,GAAG;EAC7C,MAAM,MAFgB,iBAAiB,MAAM;EAG7C;EACA;EACA,iBAAiB,eAAe;EAChC;EACA;EACD,CAAC;;AAGJ,MAAM,wCAAwC,OAC5C,GACA,YAOsB;CACtB,MAAM,EAAE,aAAa,SAAS,UAAU,gBAAgB,kBACtD;CACF,MAAM,gBACJ,eAAe,SAAS,UACtBC,WAAgB,CAAC,KAAK,MAAM,UAAU,MAAM,OAAO,QAAQ,MAAM,GACjE,KAAA;CACJ,MAAM,cAAc,QAAQ,WAAW;CACvC,MAAM,mBAAmB,6CAA6C,QAAQ;CAC9E,MAAM,oCACJ,0CAA0C,kBAAkB,eAAe;CAC7E,IAAI,mCACF,UAAO,MACL,oCAAoC,kCAAkC,KAAK,MAAM,kCAAkC,GAAG,4CACvH;CAGH,IAAI,eAAe,SAAS,WAAW,CAAC,aACtC,iBAAiB,SAAS;CAU5B,IAP2B,mCACzB,kBACA,eAAe,aAAa,OAAO,mBACnC,EACE,QAAQ,YACT,CAEmB,EACpB,+BAA+B,iBAAiB;CAGlD,UAAUD,WAAQ,uCAAuC;EACvD,SAAS;EACT;EACD,CAAC;CAEF,IAAI,eAAe,SAAS,SAAS;EACnC,MAAM,mBAAmB,MAAM,sBAC7B,kBACA,EAAE,IAAI,IAAI,SACV,eAAe,SACf,EAAE,QAAQ,EAAE,IAAI,IAAI,QAAQ,CAC7B;EAED,IAAI,kBAAkB,iBAAiB,EAAE;GACvC,IAAI,aACF,OAAO,gCAAgC;IACrC;IACA;IACA;IACA,iBAAiB,eAAe;IAChC;IACA;IACA;IACA;IACD,CAAC;GAUJ,OAAO,qCAAqC,GAAG;IAC7C,MAAA,MARiB,6BAA6B;KAC9C,oBAAoB,GAAG,SAAS;KAChC,aAAa,SACX,kCAAkC,MAAM,eAAe;KACzD;KACA,QAAA;KACD,CAAC;IAGA;IACA;IACA,iBAAiB,eAAe;IAChC;IACA;IACA;IACD,CAAC;;EAGJ,OAAO,qCAAqC,GAAG;GAC7C,MAAM;GACN;GACA;GACA,iBAAiB,eAAe;GAChC;GACA;GACA;GACD,CAAC;;CAGJ,MAAM,mBAAmB,MAAM,yBAC7B,gBACA,kBACA,EAAE,IAAI,IAAI,SACV,EAAE,QAAQ,EAAE,IAAI,IAAI,QAAQ,CAC7B;CAED,IAAI,CAAC,iBAAiB,IAAI;EACxB,UAAO,MAAM,uCAAuC,iBAAiB;EACrE,MAAM,IAAI,UAAU,uCAAuC,iBAAiB;;CAG9E,IAAI,iBAAiB,QACnB,OAAO,gCAAgC;EACrC;EACA;EACA;EACA,iBAAiB,eAAe;EAChC;EACA;EACA,kBAAkB,0BAChB,+BAA+B,kBAAkB,EAAE,IAAI,IAAI,OAAO,EAClE,EAAE,QAAQ,EAAE,IAAI,IAAI,QAAQ,CAC7B;EACD;EACD,CAAC;CAIJ,OAAO,qCAAqC,GAAG;EAC7C,MAAM,MAFgB,iBAAiB,MAAM;EAG7C;EACA;EACA,iBAAiB,eAAe;EAChC;EACA;EACA;EACD,CAAC;;AAGJ,MAAM,4BACJ,YACuB;CACvB,MAAM,SAAS,QAAQ,UAAU;CACjC,IAAI,OAAO,WAAW,YAAY,CAAC,OAAO,SAAS,OAAO,EACxD;CAEF,OAAO;;AAGT,MAAM,uCACJ,SACA,WACS;CACT,MAAM,iBAAiB,yBAAyB,OAAO;CACvD,IAAI,mBAAmB,KAAA,GAAW;EAChC,QAAQ,kBAAkB;EAC1B;;CAGF,IAAI,QAAQ,oBAAoB,KAAA,GAC9B,OAAO,QAAQ;;AAInB,MAAM,gDACJ,SACA,YACS;CACT,MAAM,EAAE,cAAc;CACtB,IAAI,CAAC,aAAa,CAAC,OAAO,OAAO,WAAW,kBAAkB,EAC5D;CAGF,MAAM,aAAa;CACnB,WAAW,kBAAkB,UAAU;;AAGzC,MAAM,yCAAyC,OAC7C,GACA,YAOsB;CACtB,MAAM,EAAE,aAAa,SAAS,UAAU,gBAAgB,kBACtD;CACF,MAAM,gBAAgB,8BACpB,SACA,aACA,eACD;CACD,UAAUA,WAAQ,+CAA+C;EAC/D,SAAS;EACT;EACD,CAAC;CAEF,MAAM,mBAAmB,MAAM,+BAC7B,gBACA,eACA,EAAE,IAAI,IAAI,QACX;CAED,IAAI,CAAC,iBAAiB,IAAI;EACxB,UAAO,MACL,gDACA,iBACD;EACD,MAAM,IAAI,UACR,gDACA,iBACD;;CAGH,MAAM,cAAc,iBAAiB,QAAQ,IAAI,eAAe,IAAI;CAIpE,IAFE,QAAQ,cAAc,OAAO,IAAI,YAAY,SAAS,oBAAoB,EAG1E,OAAO,uCAAuC;EAC5C;EACA;EACA;EACA,iBAAiB,eAAe;EAChC;EACA;EACA;EACD,CAAC;CAIJ,OAAO,4CAA4C,GAAG;EACpD,MAAM,MAFgB,iBAAiB,MAAM;EAG7C;EACA;EACA,iBAAiB,eAAe;EAChC;EACA;EACD,CAAC;;AAGJ,MAAM,iCACJ,SACA,aACA,mBAC2B;CAC3B,MAAM,gBAAgB,kBAAkB,SAAS;EAC/C,YAAY,aAAa;EACzB,wBAAwB,aAAa,0BAA0B,EAAE;EAClE,CAAC;CAEF,MAAM,sBAAsB,0BAA0B,eAAe;CAErE,IAAI,qBACF,oCAAoC,eAAe,QAAQ;MAE3D,OAAO,cAAc;CAGvB,IAAI,QAAQ,UAAU,KAAA,GACpB,cAAc,QAAQ,QAAQ;CAGhC,IAAI,cAAc,QAChB,cAAc,iBAAiB,EAC7B,eAAe,MAChB;CAGH,0CAA0C,eAAe;EACvD;EACA;EACD,CAAC;CAEF,sCAAsC,eAAe;EACnD,WAAW,aAAa;EACxB,QAAQ;EACT,CAAC;CAEF,sBAAsB,eAAe,EACnC,WAAW,aAAa,WACzB,CAAC;CAEF,6CAA6C,eAAe,EAC1D,WAAW,aAAa,WACzB,CAAC;CAEF,sCACE,eACA,eACD;CAED,IAAI,CAAC,OAAO,OAAO,eAAe,sBAAsB,EACtD,cAAc,sBAAsB;CAItC,IAD4B,aAAa,gBAAgB,qBAEvD,kCAAkC,cAAc;CAGlD,OAAO;;AAGT,MAAM,6CACJ,SACA,YAIS;CAIT,MAAM,iBACJ,QAAQ,aAAa,kBAClB,6BAA6B,eAC9B,QAAQ,eAAe,MACvB,QAAQ,MACT,EAAE,kBACA;CAEL,KAAK,MAAM,WAAW,QAAQ,UAAU;EACtC,IAAI,QAAQ,SAAS,aACnB;EAGF,MAAM,gBACJ,QAAQ,kBAAkB,QAAQ,qBAAqB,QAAQ;EACjE,IAAI,iBAAiB,cAAc,SAAS,GAC1C,IAAI,mBAAmB,aACrB,QAAQ,cAAc;OAEtB,QAAQ,sBAAsB;EAMlC,IAAI,mBAAmB,aACrB,OAAO,QAAQ;OAEf,OAAO,QAAQ;EAGjB,OAAO,QAAQ;EACf,OAAO,QAAQ;;;AAInB,MAAM,yCACJ,SACA,YAIS;CACT,MAAM,cAAc,IAAI,IAAI,OAAO,KAAK,QAAQ,aAAa,EAAE,CAAC,CAAC;CACjE,KAAK,MAAM,OAAO,aAChB,IAAI,OAAO,OAAO,QAAQ,QAAQ,IAAI,EACpC,QAAQ,OAAO,QAAQ,OAAO;;AAKpC,MAAM,0BAA0B,EAC9B,GACA,aACA,SACA,iBACA,UACA,kBACA,oBASc;CACd,UAAO,MAAM,8BAA8B;CAC3C,MAAM,cAAc,oCAClB,SACA,UACA,aACA,iBACA,cACD;CACD,OAAO,UAAU,GAAG,OAAO,WAAW;EACpC,IAAI,QAAqB,EAAE;EAC3B,IAAI,kBAAkB;EACtB,IAAI,YAAY;EAChB,MAAM,0BAAyD;GAC7D,4CAA4B,IAAI,KAAa;GAC7C,sCAAsB,IAAI,KAAa;GACxC;EAED,IAAI;GACF,WAAW,MAAM,SAAS,OAAO,iBAAiB,EAAE;IAClD,UAAO,MAAM,uCAAuC,MAAM,KAAK;IAC/D,MAAM,YAAY,MAAM;IACxB,IAAI,cAAc,QAAQ;KACxB,MAAM,OAAO,SAAS;MAAE,OAAO;MAAQ,MAAM;MAAmB,CAAC;KACjE;;IAGF,IAAI,OAAO,MAAM;IACjB,IAAI,CAAC,MACH;IAGF,IAAI,MAAM,SAAS,UACjB;IAGF,MAAM,SAAS,yBAAyB,KAAK;IAC7C,IAAI,QAAQ;KACV,QAAQ,oBAAoB,OAAO,OAAO,MAAM;KAChD,OAAO,OAAO;KACd,IAAI,OAAO,SAAS,gBAClB,kBAAkB;UACb,IAAI,OAAO,SAAS,SACzB,YAAY;;IAIhB,MAAM,eACJ,aAAa,eACX,gCACE,WACA,MACA,wBACD,GACD,CAAC;KAAE;KAAM,OAAO;KAAW,CAAC;IAChC,KAAK,MAAM,eAAe,cACxB,MAAM,OAAO,SAAS;KACpB,OAAO,YAAY;KACnB,MAAM,YAAY;KACnB,CAAC;;WAGC,OAAO;GACd,UAAO,KAAK,yCAAyC;IAAE;IAAO;IAAU,CAAC;;EAG3E,IAAI,CAAC,mBAAmB,CAAC,WAAW;GAClC,UAAO,KAAK,wCAAwC,EAAE,UAAU,CAAC;GACjE,MAAM,aAAa,qCAAqC;GACxD,MAAM,OAAO,SAAS;IACpB,OAAO,WAAW;IAClB,MAAM,KAAK,UAAU,WAAW;IACjC,CAAC;;EAGJ,YAAY,MAAM;GAClB;;AAGJ,MAAM,0CAA0C,EAC9C,GACA,aACA,SACA,iBACA,UACA,kBACA,oBASc;CACd,UAAO,MAAM,gDAAgD;CAC7D,MAAM,cAAc,oCAClB,SACA,UACA,aACA,iBACA,cACD;CACD,OAAO,UAAU,GAAG,OAAO,WAAW;EACpC,IAAI,QAAqB,EAAE;EAC3B,MAAM,cAAoC;GACxC,kBAAkB;GAClB,kBAAkB;GAClB,mBAAmB;GACnB,kBAAkB;GAClB,WAAW,EAAE;GACb,mBAAmB;GACpB;EAED,IAAI;GACF,WAAW,MAAM,SAAS,OAAO,iBAAiB,EAAE;IAClD,UAAO,MACL,yDACA,MAAM,KACP;IAED,IADkB,MAAM,UACN,QAAQ;KACxB,MAAM,OAAO,SAAS;MAAE,OAAO;MAAQ,MAAM;MAAmB,CAAC;KACjE;;IAGF,IAAI,CAAC,MAAM,QAAQ,MAAM,SAAS,UAAU;KAC1C,IAAI,MAAM,SAAS,UACjB;KAEF;;IAGF,MAAM,SAAS,iCAAiC,MAAM,KAAK;IAC3D,IAAI,CAAC,QACH;IAGF,IAAI,OAAO,OACT,QAAQ,qBAAqB,OAAO,MAAM;IAG5C,MAAM,SAAS,gCAAgC,QAAQ,YAAY;IACnE,KAAK,MAAM,SAAS,QAAQ;KAC1B,MAAM,YAAY,KAAK,UAAU,MAAM;KACvC,UAAUA,iBAAc,CACtB,yDACA,UACD,CAAC;KACF,MAAM,OAAO,SAAS;MACpB,OAAO,MAAM;MACb,MAAM;MACP,CAAC;;;WAGC,OAAO;GACd,UAAO,KAAK,2DAA2D;IACrE;IACA;IACD,CAAC;;EAGJ,KAAK,MAAM,SAAS,kCAAkC,YAAY,EAAE;GAClE,MAAM,YAAY,KAAK,UAAU,MAAM;GACvC,UAAUA,iBAAc,CACtB,yDACA,UACD,CAAC;GACF,MAAM,OAAO,SAAS;IACpB,OAAO,MAAM;IACb,MAAM;IACP,CAAC;;EAGJ,IAAI,CAAC,YAAY,kBAAkB;GACjC,UAAO,KAAK,0DAA0D,EACpE,UACD,CAAC;GACF,MAAM,aAAa,qCAAqC;GACxD,MAAM,OAAO,SAAS;IACpB,OAAO,WAAW;IAClB,MAAM,KAAK,UAAU,WAAW;IACjC,CAAC;;EAGJ,YAAY,MAAM;GAClB;;AAGJ,MAAM,mCAAmC,EACvC,GACA,aACA,SACA,iBACA,UACA,gBACA,kBACA,oBAUc;CACd,UAAO,MAAM,yCAAyC,EACpD,UACD,CAAC;CACF,MAAM,cAAc,oCAClB,SACA,UACA,aACA,iBACA,cACD;CACD,OAAO,UAAU,GAAG,OAAO,WAAW;EACpC,IAAI,QAAqB,EAAE;EAC3B,MAAM,cAAc,2BAA2B,EAC7C,gBAAgB,4BAA4B,QAAQ,MAAM,EAC3D,CAAC;EAEF,WAAW,MAAM,SAAS,kBAAkB;GAC1C,UAAO,MAAM,iDAAiD,MAAM,KAAK;GAEzE,IADkB,MAAM,UACN,QAAQ;IACxB,MAAM,OAAO,SAAS;KAAE,OAAO;KAAQ,MAAM;KAAmB,CAAC;IACjE;;GAGF,IAAI,CAAC,MAAM,QAAQ,MAAM,SAAS,UAAU;IAC1C,IAAI,MAAM,SAAS,UACjB;IAEF;;GAGF,MAAM,SAAS,kCACb,MAAM,MACN,eACD;GACD,IAAI,CAAC,QACH;GAGF,IACE,OAAO,SAAS,wBACb,OAAO,SAAS,qBAChB,OAAO,SAAS,uBAEnB,QAAQ,wBAAwB,OAAO,SAAS,MAAM;GAGxD,MAAM,SAAS,8BAA8B,QAAQ,YAAY;GACjE,KAAK,MAAM,SAAS,QAAQ;IAC1B,MAAM,YAAY,KAAK,UAAU,MAAM;IACvC,UAAUA,iBAAc,CACtB,iDACA,UACD,CAAC;IACF,MAAM,OAAO,SAAS;KACpB,OAAO,MAAM;KACb,MAAM;KACP,CAAC;;;EAIN,IAAI,CAAC,YAAY,kBAAkB;GACjC,MAAM,aAAa,gBACjB,GAAG,SAAS,+DACb;GACD,MAAM,OAAO,SAAS;IACpB,OAAO,WAAW;IAClB,MAAM,KAAK,UAAU,WAAW;IACjC,CAAC;;EAGJ,YAAY,MAAM;GAClB;;AAGJ,MAAM,oCACJ,SAC+B;CAC/B,IAAI;EACF,OAAO,KAAK,MAAM,KAAK;UAChB,OAAO;EACd,UAAO,MAAM,yDAAyD;GACpE;GACA;GACD,CAAC;EACF,OAAO;;;AAIX,MAAM,qCACJ,MACA,mBAC+B;CAC/B,IAAI;EACF,MAAM,SAAS,KAAK,MAAM,KAAK;EAC/B,IAAI,eAAe,SAAS,SAC1B,wBAAwB,OAAO;EAGjC,OAAO;UACA,OAAO;EACd,UAAO,MAAM,iDAAiD;GAC5D,UAAU,eAAe;GACzB;GACA;GACD,CAAC;EACF,OAAO;;;AAIX,MAAM,4BACJ,SAMU;CACV,IAAI;EACF,MAAM,SAAS,KAAK,MAAM,KAAK;EAC/B,IAAI,OAAO,SAAS,iBAClB,OAAO;GACL,MAAM,KAAK,UAAU,OAAO;GAC5B,OAAO,OAAO,QAAQ;GACtB,MAAM,OAAO;GACb,OAAO,wBAAwB,OAAO,QAAQ,MAAM;GACrD;EAEH,IAAI,OAAO,SAAS,iBAClB,OAAO;GACL,MAAM,KAAK,UAAU,OAAO;GAC5B,MAAM,OAAO;GACb,OAAO,wBAAwB,OAAO,MAAM;GAC7C;EAEH,OAAO;GAAE,MAAM,KAAK,UAAU,OAAO;GAAE,MAAM,OAAO;GAAM,OAAO,EAAE;GAAE;UAC9D,OAAO;EACd,UAAO,MAAM,mDAAmD;GAC9D;GACA,cAAc;GACf,CAAC;EACF,OAAO;;;AAIX,MAAM,yCACJ,SACS;CACT,KAAK,MAAM,SAAS,KAAK,SACvB,IAAI,MAAM,SAAS,YACjB,MAAM,cAAc;;AAe1B,MAAM,mCACJ,WACA,MACA,UAC+B;CAC/B,IAAI;CACJ,IAAI;EACF,QAAQ,KAAK,MAAM,KAAK;SAClB;EACN,OAAO,CAAC;GAAE;GAAM,OAAO;GAAW,CAAC;;CAGrC,IACE,MAAM,SAAS,yBACZ,MAAM,cAAc,SAAS,YAChC;EACA,MAAM,EAAE,UAAU;EAClB,MAAM,qBAAqB,IAAI,MAAM;EACrC,MAAM,2BAA2B,OAAO,MAAM;;CAGhD,IACE,MAAM,SAAS,yBACZ,MAAM,MAAM,SAAS,mBACxB;EACA,MAAM,EAAE,UAAU;EAClB,MAAM,2BAA2B,IAAI,MAAM;;CAG7C,IAAI,MAAM,SAAS,sBAAsB;EACvC,MAAM,EAAE,UAAU;EAClB,IAAI,CAAC,MAAM,qBAAqB,IAAI,MAAM,EACxC,OAAO,CAAC;GAAE;GAAM,OAAO;GAAW,CAAC;EAGrC,MAAM,eAAe,MAAM,2BAA2B,IAAI,MAAM;EAChE,MAAM,qBAAqB,OAAO,MAAM;EACxC,MAAM,2BAA2B,OAAO,MAAM;EAE9C,IAAI,CAAC,cACH,OAAO,CACL;GACE,MAAM,KAAK,UAAU;IACnB,OAAO;KAAE,WAAW;KAAI,MAAM;KAAmB;IACjD;IACA,MAAM;IACP,CAAC;GACF,OAAO;GACR,EACD;GAAE;GAAM,OAAO;GAAW,CAC3B;;CAIL,OAAO,CAAC;EAAE;EAAM,OAAO;EAAW,CAAC;;AAGrC,MAAM,+BACJ,GACA,YAQa;CACb,MAAM,EACJ,MACA,aACA,SACA,iBACA,UACA,kBACE;CAQJ,oCANE,SACA,UACA,aACA,iBACA,cAES,CAAC,wBAAwB,KAAK,MAAM,CAAC;CAEhD,IAAI,aAAa,cACf,sCAAsC,KAAK;CAG7C,UAAUA,WAAQ,uCAAuC,KAAK;CAC9D,OAAO,EAAE,KAAK,KAAK;;AAGrB,MAAM,+CACJ,GACA,YAQa;CACb,MAAM,EACJ,MACA,aACA,SACA,iBACA,UACA,kBACE;CAQJ,oCANE,SACA,UACA,aACA,iBACA,cAES,CAAC,qBAAqB,KAAK,MAAM,CAAC;CAE7C,MAAM,oBAAoB,qBAAqB,KAAK;CACpD,UACEA,WACA,yDACA,kBACD;CACD,OAAO,EAAE,KAAK,kBAAkB;;AAGlC,MAAM,wCACJ,GACA,YASa;CACb,MAAM,EACJ,MACA,aACA,SACA,iBACA,UACA,gBACA,kBACE;CAQJ,oCANE,SACA,UACA,aACA,iBACA,cAES,CAAC,wBAAwB,KAAK,MAAM,CAAC;CAEhD,MAAM,oBAAoB,oCAAoC,MAAM,EAClE,gBAAgB,4BAA4B,QAAQ,MAAM,EAC3D,CAAC;CACF,UACEA,WACA,iDACA,kBACD;CAED,IAAI,eAAe,SAAS,SAC1B,UAAO,MAAM,2CAA2C;CAE1D,OAAO,EAAE,KAAK,kBAAkB;;AAGlC,MAAM,wCACJ,GACA,YAQa;CACb,MAAM,EACJ,MACA,aACA,SACA,iBACA,UACA,kBACE;CAQJ,oCANE,SACA,UACA,aACA,iBACA,cAES,CAAC,wBAAwB,KAAK,MAAM,CAAC;CAEhD,MAAM,EAAE,SAAS,aAAa,6BAA6B,SAAS,MAAM,EACxE,WAAW,KAAK,MAAM,GAAG,SAAS,GAAG,QAAQ,SAC9C,CAAC;CAEF,UACEA,WACA,6BAA6B,QAAQ,QAAQ,OAAO,gBAAgB,QAAQ,QAAQ,OAAO,aAC3F,KACD;CAED,IAAI,CAAC,QAAQ,QACX,OAAO,EAAE,KAAK,SAAS;CAGzB,OAAO,UAAU,GAAG,OAAO,WAAW;EACpC,KAAK,MAAM,SAAS,2BAA2B,SAAS,EAAE;GACxD,MAAM,OAAO,KAAK,UAAU,MAAM;GAClC,UAAO,MAAM,2BAA2B,KAAK;GAC7C,MAAM,OAAO,SAAS;IACpB,OAAO,MAAM;IACP;IACP,CAAC;;GAEJ;;AAGJ,MAAM,uCACJ,SACA,UACA,aACA,iBACA,WAA+B,wBAE/B,iCAAiC;CAC/B;CACA,OAAO,QAAQ;CACf,SAAS,aAAa;CACtB;CACA,cAAc;CACd,WAAW,oBAAoB,QAAQ,UAAU,QAAQ,CAAC;CAC3D,CAAC;;;ACr0CJ,MAAM,4BAA4B;AAElC,MAAM,wBAAwB,IAAI,IAAI;CACpC;CACA;CACA;CACD,CAAC;AAEF,MAAM,4BACJ,qBACA,UACA,WACuB;CACvB,MAAM,qBAAqB,UAAU,SAAS;CAE9C,IAAI,qBAAqB;EASvB,MAAM,sBAAsB,CAAC,GARR,oBAClB,MAAM,IAAI,CACV,KAAK,SAAS,KAAK,MAAM,CAAC,CAC1B,QAAQ,SAAS,KAAK,SAAS,EAAE,CACjC,QAAQ,SAAS,sBAAsB,IAAI,KAAK,CAIP,CAAC;EAC7C,IAAI,oBAAoB,SAAS,GAC/B,OAAO,oBAAoB,KAAK,IAAI;EAGtC;;CAGF,IAAI,UAAU,iBAAiB,CAAC,oBAC9B,OAAO;;AAMX,MAAa,iBAAiB,OAC5B,SACA,qBACA,YAMkC;CAClC,IAAI,CAAC,MAAM,cAAc,MAAM,IAAI,MAAM,0BAA0B;CAEnE,MAAM,eAAe,QAAQ,SAAS,MAAM,YAAY;EACtD,IAAI,CAAC,MAAM,QAAQ,QAAQ,QAAQ,EAAE,OAAO;EAC5C,OAAO,QAAQ,QAAQ,MACpB,UACC,MAAM,SAAS,WACX,MAAM,SAAS,iBACd,MAAM,QAAQ,MAAM,QAAQ,IAC5B,MAAM,QAAQ,MAAM,UAAU,MAAM,SAAS,QAAQ,CAC7D;GACD;CAEF,IAAI,oBAAoB;CACxB,MAAM,cAAc,QAAQ,SAAS,GAAG,GAAG;CAC3C,IAAI,aAAa,SAAS,QACxB,oBACE,MAAM,QAAQ,YAAY,QAAQ,GAChC,YAAY,QAAQ,MAAM,UAAU,MAAM,SAAS,cAAc,GACjE;CAGN,MAAM,UAAkC;EACtC,GAAG,eAAe,OAAO,QAAQ,WAAW,aAAa;EACzD,eAAe,oBAAoB,SAAS;EAC7C;CAED,0BACE,QAAQ,WACR,QAAQ,QAAQ,eAAe,EAC/B,QACD;CAED,kBAAkB,SAAS,QAAQ,YAAY;CAE/C,MAAM,EAAE,kBAAkB,cAAc,oBACtC,QAAQ,UAAU,QACnB;CAYD,IAAI,oBAAoB,aAAa,QAAQ,UAAU,mBACrD,2BAA2B,QAAQ;CAIrC,MAAM,gBAAgB,yBACpB,qBACA,QAAQ,UACR,QAAQ,MACT;CACD,IAAI,eACF,QAAQ,oBAAoB;CAG9B,QAAQ,IAAI,cAAc,QAAQ,QAAQ;CAE1C,MAAM,WAAW,MAAM,MAAM,GAAG,eAAe,MAAM,CAAC,eAAe;EACnE,QAAQ;EACR;EACA,MAAM,KAAK,UAAU,QAAQ;EAC9B,CAAC;CAEF,qBAAqB,SAAS,QAAQ;CAEtC,IAAI,CAAC,SAAS,IAAI;EAChB,QAAQ,MAAM,6BAA6B,SAAS;EACpD,MAAM,IAAI,UAAU,6BAA6B,SAAS;;CAG5D,IAAI,QAAQ,QACV,OAAO,OAAO,SAAS;CAGzB,OAAQ,MAAM,SAAS,MAAM;;;;ACxF/B,MAAM,4CAA4C;AAClD,MAAM,gDAAgD;AACtD,MAAM,gCAAgC,EACpC,MAAM,aACP;AAED,MAAa,8BAA8B;CAClBE;CACPC;CACCC;CAClB;AAwBD,MAAa,4BAA4B,OACvC,GACA,kBACA,YACG;CACH,MAAM,EACJ,QACA,eACA,gBACA,WACA,WACA,gBACE;CACJ,MAAM,gBAAgB,kBAAkB,kBAAkB;EACxD,yBAAyB;EACzB,wBACE,eAAe,aAAa,SAAS;EACxC,CAAC;CACF,qCAAqC,cAAc;CACnD,MAAM,cAAc,2BAA2B;EAC7C,UAAU,QAAQ,iBAAiB;EACnC,mBAAmB;EACnB,OAAO,cAAc;EACrB,SAAS;EACV,CAAC;CACF,UAAU,QAAQ,sCAAsC,cAAc;CAEtE,MAAM,WAAW,MAAM,4BAA4B,sBACjD,eACA;EACE;EACA;EACA;EACA;EACD,CACF;CAED,IAAI,eAAe,SAAS,EAAE;EAC5B,UAAU,QAAQ,wCAAwC,SAAS;EACnE,YAAY;GACV,GAAG,qBAAqB,SAAS,MAAM;GACvC,gBAAgB,uBACd,SAAS,eAAe,eACzB;GACF,CAAC;EACF,MAAM,oBAAoB,qBAAqB,SAAS;EACxD,UAAU,QAAQ,kCAAkC,kBAAkB;EACtE,OAAO,EAAE,KAAK,kBAAkB;;CAGlC,OAAO,MAAM,kCAAkC;CAC/C,OAAO,UAAU,GAAG,OAAO,WAAW;EACpC,IAAI,QAAqB,EAAE;EAC3B,MAAM,cAAoC;GACxC,kBAAkB;GAClB,kBAAkB;GAClB,mBAAmB;GACnB,kBAAkB;GAClB,WAAW,EAAE;GACb,mBAAmB;GACpB;EAED,IAAI;GACF,WAAW,MAAM,YAAY,UAAU;IACrC,UAAU,QAAQ,6BAA6B,SAAS;IACxD,IAAI,SAAS,SAAS,UACpB;IAGF,IAAI,CAAC,SAAS,MACZ;IAGF,MAAM,QAAQ,KAAK,MAAM,SAAS,KAAK;IACvC,IAAI,MAAM,SAAS,MAAM,eACvB,QAAQ;KACN,GAAG,qBAAqB,MAAM,MAAM;KACpC,gBAAgB,uBACd,MAAM,eAAe,eACtB;KACF;IAEH,MAAM,SAAS,gCAAgC,OAAO,YAAY;IAElE,KAAK,MAAM,SAAS,QAAQ;KAC1B,MAAM,YAAY,KAAK,UAAU,MAAM;KACvC,UAAU,cAAc,CAAC,+BAA+B,UAAU,CAAC;KACnE,MAAM,OAAO,SAAS;MACpB,OAAO,MAAM;MACb,MAAM;MACP,CAAC;;;WAGC,OAAO;GACd,OAAO,KAAK,wCAAwC,MAAM;;EAG5D,KAAK,MAAM,SAAS,kCAAkC,YAAY,EAAE;GAClE,MAAM,YAAY,KAAK,UAAU,MAAM;GACvC,UAAU,cAAc,CAAC,+BAA+B,UAAU,CAAC;GACnE,MAAM,OAAO,SAAS;IACpB,OAAO,MAAM;IACb,MAAM;IACP,CAAC;;EAGJ,IAAI,CAAC,YAAY,kBAAkB;GACjC,OAAO,KACL,wEACD;GACD,MAAM,aAAa,qCAAqC;GACxD,MAAM,OAAO,SAAS;IACpB,OAAO,WAAW;IAClB,MAAM,KAAK,UAAU,WAAW;IACjC,CAAC;;EAGJ,YAAY,MAAM;GAClB;;AAGJ,MAAa,yBAAyB,OACpC,GACA,kBACA,YACG;CACH,MAAM,EAAE,QAAQ,eAAe,GAAG,mBAAmB;CAErD,MAAM,mBAAmB,6CACvB,kBACA,eAAe,gBAAgB,SAChC;CACD,MAAM,cAAc,2BAA2B;EAC7C,UAAU,QAAQ,iBAAiB;EACnC,mBAAmB,eAAe;EAClC,OAAO,iBAAiB;EACxB,SAAS;EACV,CAAC;CAUF,IAR2B,mCACzB,kBACA,eAAe,aAAa,OAAO,mBACnC,EACE,QAAQ,YACT,CAGmB,EACpB,+BAA+B,iBAAiB;CAGlD,UAAU,QAAQ,iCAAiC,iBAAiB;CAEpE,MAAM,EAAE,QAAQ,cAAc,2BAA2B,iBAAiB;CAC1E,MAAM,YACJ,8BAA8B,eAAe,EAC3C,aAAa,eAAe,aAC7B,CAAC,IAAI;CACR,MAAM,WAAW,MAAM,4BAA4B,gBACjD,kBACA;EACE;EACA;EACA,QAAQ,EAAE,KAAK,KAAK;EACpB;EACA,GAAG;EACJ,CACF;CAED,IAAI,iBAAiB,UAAU,gBAAgB,SAAS,EAAE;EACxD,OAAO,MAAM,kDAAkD;EAC/D,OAAO,UAAU,GAAG,OAAO,WAAW;GACpC,MAAM,cAAc,2BAA2B,EAC7C,gBAAgB,4BAA4B,iBAAiB,MAAM,EACpE,CAAC;GACF,IAAI,QAAqB,EAAE;GAE3B,WAAW,MAAM,SAAS,UAAU;IAElC,IADkB,MAAM,UACN,QAAQ;KACxB,MAAM,OAAO,SAAS;MAAE,OAAO;MAAQ,MAAM;MAAmB,CAAC;KACjE;;IAGF,MAAM,OAAO,MAAM;IACnB,IAAI,CAAC,MACH;IAGF,UAAU,cAAc,CAAC,+BAA+B,KAAK,CAAC;IAE9D,MAAM,gBAAgB,KAAK,MAAM,KAAK;IACtC,IACE,cAAc,SAAS,wBACpB,cAAc,SAAS,qBACvB,cAAc,SAAS,uBAE1B,QAAQ;KACN,GAAG,wBAAwB,cAAc,SAAS,MAAM;KACxD,gBAAgB,uBACd,cAAc,eAAe,eAC9B;KACF;IAGH,MAAM,SAAS,8BAA8B,eAAe,YAAY;IACxE,KAAK,MAAM,SAAS,QAAQ;KAC1B,MAAM,YAAY,KAAK,UAAU,MAAM;KACvC,UAAU,cAAc,CAAC,+BAA+B,UAAU,CAAC;KACnE,MAAM,OAAO,SAAS;MACpB,OAAO,MAAM;MACb,MAAM;MACP,CAAC;;IAGJ,IAAI,YAAY,kBAAkB;KAChC,OAAO,MAAM,mCAAmC;KAChD;;;GAIJ,IAAI,CAAC,YAAY,kBAAkB;IACjC,OAAO,KACL,iEACD;IACD,MAAM,aAAa,gBACjB,iEACD;IACD,MAAM,OAAO,SAAS;KACpB,OAAO,WAAW;KAClB,MAAM,KAAK,UAAU,WAAW;KACjC,CAAC;;GAGJ,YAAY,MAAM;IAClB;;CAGJ,UAAU,QAAQ,mCAAmC,SAAS;CAC9D,MAAM,oBAAoB,oCACxB,UACA,EACE,gBAAgB,4BAA4B,iBAAiB,MAAM,EACpE,CACF;CACD,MAAM,kBAAkB;CACxB,YAAY;EACV,GAAG,wBAAwB,gBAAgB,MAAM;EACjD,gBAAgB,uBACd,gBAAgB,eAAe,eAChC;EACF,CAAC;CACF,UAAU,QAAQ,kCAAkC,kBAAkB;CACtE,OAAO,EAAE,KAAK,kBAAkB;;AAGlC,MAAa,wBAAwB,OACnC,GACA,kBACA,YACG;CACH,MAAM,EACJ,QACA,qBACA,gBACA,eACA,WACA,WACA,gBACE;CAEJ,0BAA0B,kBAAkB,cAAc;CAC1D,MAAM,cAAc,2BAA2B;EAC7C,UAAU,QAAQ,iBAAiB;EACnC,mBAAmB;EACnB,OAAO,iBAAiB;EACxB,SAAS;EACV,CAAC;CAEF,UAAU,QAAQ,gCAAgC,iBAAiB;CAEnE,MAAM,WAAW,MAAM,4BAA4B,eACjD,kBACA,qBACA;EACE;EACA;EACA;EACA;EACD,CACF;CAED,IAAI,gBAAgB,SAAS,EAAE;EAC7B,OAAO,MAAM,iDAAiD;EAC9D,OAAO,UAAU,GAAG,OAAO,WAAW;GACpC,IAAI,QAAqB,EAAE;GAC3B,IAAI,kBAAkB;GACtB,IAAI,YAAY;GAEhB,IAAI;IACF,WAAW,MAAM,SAAS,UAAU;KAClC,MAAM,YAAY,MAAM;KACxB,MAAM,OAAO,MAAM,QAAQ;KAC3B,IAAI,SAAS,UACX;KAEF,IAAI,CAAC,MACH;KAEF,UAAU,cAAc,CAAC,8BAA8B,KAAK,CAAC;KAC7D,MAAM,cAAc,0BAA0B,KAAK;KACnD,IAAI,aAAa,SAAS,iBACxB,QAAQ,oBAAoB,OAAO;MACjC,GAAG,wBAAwB,YAAY,QAAQ,MAAM;MACrD,GAAG,sBAAsB,YAAY,QAAQ,cAAc;MAC5D,CAAC;UACG,IAAI,aAAa,SAAS,iBAC/B,QAAQ,oBAAoB,OAAO;MACjC,GAAG,wBAAwB,YAAY,MAAM;MAC7C,GAAG,sBAAsB,YAAY,cAAc;MACpD,CAAC;KAEJ,IACE,aAAa,SAAS,kBACnB,cAAc,gBAEjB,kBAAkB;UACb,IAAI,aAAa,SAAS,WAAW,cAAc,SACxD,YAAY;KAEd,MAAM,OAAO,SAAS;MACpB,OAAO;MACP;MACD,CAAC;;YAEG,OAAO;IACd,OAAO,KAAK,gCAAgC,MAAM;;GAGpD,IAAI,CAAC,mBAAmB,CAAC,WAAW;IAClC,OAAO,KACL,gEACD;IACD,MAAM,aAAa,qCAAqC;IACxD,MAAM,OAAO,SAAS;KACpB,OAAO,WAAW;KAClB,MAAM,KAAK,UAAU,WAAW;KACjC,CAAC;;GAGJ,YAAY,MAAM;IAClB;;CAGJ,cAAc,QAAQ,kCAAkC;EACtD,OAAO;EACP,YAAY;EACb,CAAC;CACF,YAAY;EACV,GAAG,wBAAwB,SAAS,MAAM;EAC1C,GAAG,sBAAsB,SAAS,cAAc;EACjD,CAAC;CACF,OAAO,EAAE,KAAK,SAAS;;AAGzB,MAAa,wCACX,YACS;CACT,yBAAyB,QAAQ;;AAGnC,MAAM,4BAA4B,YAA0C;CAC1E,MAAM,iBAAiB,wCACrB,QAAQ,SACT;CACD,KAAK,MAAM,gBAAgB,gBAAgB;EACzC,MAAM,UAAU,QAAQ,SAAS;EACjC,QAAQ,wBAAwB,EAAE,GAAG,+BAA+B;;;AAIxE,MAAM,2CACJ,aACkB;CAClB,MAAM,gBAAgB,SACnB,SAAS,SAAS,UACjB,QAAQ,SAAS,YAAY,8BAA8B,QAAQ,GACjE,CAAC,MAAM,GACP,EAAE,CACL,CACA,MAAM,GAAG,0CAA0C;CACtD,MAAM,0BAA0B,SAC7B,SAAS,SAAS,UACjB,QAAQ,SAAS,YAAY,8BAA8B,QAAQ,GACjE,CAAC,MAAM,GACP,EAAE,CACL,CACA,SAAS,CACT,MAAM,GAAG,8CAA8C;CAE1D,OAAO,cAAc,CAAC,GAAG,eAAe,GAAG,wBAAwB,CAAC,CAAC,MAClE,GAAG,MAAM,IAAI,EACf;;AAGH,MAAM,iCAAiC,YAA8B;CACnE,IAAI,OAAO,QAAQ,YAAY,UAC7B,OAAO,QAAQ,QAAQ,SAAS;CAGlC,OAAO,MAAM,QAAQ,QAAQ,QAAQ,IAAI,QAAQ,QAAQ,SAAS;;AAGpE,MAAM,iBAAiB,YAA0C,CAC/D,GAAG,IAAI,IAAI,QAAQ,CACpB;AAED,MAAM,kBACJ,aACuC,OAAO,OAAO,UAAU,UAAU;AAE3E,MAAM,8BAA8B,YAMlC,gCAAgC;CAC9B,UAAU,QAAQ;CAClB,mBAAmB,QAAQ;CAC3B,OAAO,QAAQ;CACf,WAAW,qBAAqB,QAAQ,QAAQ;CACjD,CAAC;AAEJ,MAAM,wBACJ,YACkB,oBAAoB,QAAQ,UAAU,QAAQ,CAAC;AAEnE,MAAM,yBACJ,kBACiB,EACjB,gBAAgB,uBAAuB,cAAc,eAAe,EACrE;AAED,MAAM,6BACJ,SACoC;CACpC,IAAI;EACF,OAAO,KAAK,MAAM,KAAK;SACjB;EACN,OAAO;;;;;ACxiBX,MAAa,uBAAuB;;;ACIpC,MAAa,oCACX,YAC0B;CAC1B,MAAM,mBAAmB,QAAQ,SAAS,MACvC,QAAQ,IAAI,SAAS,UAAU,MAAM,QAAQ,IAAI,QAAQ,CAC3D;CACD,IAAI,CAAC,oBAAoB,CAAC,MAAM,QAAQ,iBAAiB,QAAQ,EAC/D,OAAO;CAGT,KAAK,MAAM,SAAS,iBAAiB,SAAS;EAC5C,IAAI,MAAM,SAAS,QACjB;EAGF,MAAM,SAAS,sCAAsC,MAAM,KAAK;EAChE,IAAI,QACF,OAAO;;CAIX,OAAO;;AAGT,MAAM,yCACJ,SAC0B;CAC1B,MAAM,WAAW;CACjB,MAAM,SAAS;CACf,IAAI,aAAa;CAEjB,OAAO,MAAM;EACX,MAAM,gBAAgB,KAAK,QAAQ,UAAU,WAAW;EACxD,IAAI,kBAAkB,IACpB;EAGF,MAAM,eAAe,gBAAgB;EACrC,MAAM,cAAc,KAAK,QAAQ,QAAQ,aAAa;EACtD,IAAI,gBAAgB,IAClB;EAGF,MAAM,kBAAkB,KAAK,MAAM,cAAc,YAAY;EAC7D,MAAM,cAAc,gBAAgB,QAAQ,qBAAqB;EACjE,IAAI,gBAAgB,IAAI;GACtB,aAAa,cAAc;GAC3B;;EAGF,MAAM,aAAa,gBAChB,MAAM,cAAc,GAA4B,CAChD,MAAM;EAET,IAAI;GACF,MAAM,SAAS,KAAK,MAAM,WAAW;GACrC,IAAI,CAAC,OAAO,cAAc,CAAC,OAAO,YAAY,CAAC,OAAO,YAAY;IAChE,aAAa,cAAc;IAC3B;;GAGF,OAAO;UACD;GACN,aAAa,cAAc;GAC3B;;;CAIJ,OAAO;;;;ACxBT,MAAMC,WAAS,oBAAoB,mBAAmB;AAEtD,MAAa,uBAAuB;CAClC;CACA;CACA;CACD;AAED,eAAsB,iBAAiB,GAAY;CAGjD,OAAO,MAAM,wBAAwB,GAAG,MAFT,EAAE,IAAI,MAAgC,CAEZ;;AAc3D,eAAsB,wBACpB,GACA,kBACA,kBAA4C,EAAE,EAC9C;CACA,MAAM,iBAAiB,iBAAiB;CACxC,IAAI,CAAC,gBAAgB,kBACnB,iBAAiB,QAAQ,mBAAmB,iBAAiB,MAAM;CAErE,IAAI,iBAAiB,UAAU,gBAC7B,QAAQ,MACN,2BAA2B,eAAe,MAAM,iBAAiB,QAClE;CAGH,IAAI,CAAC,gBAAgB,eAAe;EAClC,MAAM,kBAAkB,MAAM,mBAAmB,GAAG,kBAAkB;GACpE,QAAA;GACA,oBAAoB,KAAK,SAAS,aAChC,kCAAkC,KAAK;IAAE;IAAS;IAAU,CAAC;GAChE,CAAC;EACF,IAAI,iBAAiB,OAAO;;CAG9B,MAAM,kBAAkB,oBAAoB;CAC5C,MAAM,2BAA2B,QAC/B,CAAC,gBAAgB,uBACZ,mBACA,yBAAyB,iBAAiB,CAChD;CACD,IAAI,mBAAmB,0BAA0B;EAC/C,QAAQ,MACN,+BAA+B,iBAAiB,MAAM,MAAM,kBAC7D;EACD,iBAAiB,QAAQ;;CAG3B,MAAM,qBAAqB,MAAM,oCAC/B,iBAAiB,OACjB,oCAAoC,sBACrC;CACD,IAAI,oBAAoB;EACtB,iBAAiB,QAAQ,mBAAmB;EAC5C,OAAO,MAAM,kCAAkC,GAAG;GAChD,SAAS;GACT,UAAU,mBAAmB;GAC7B,eAAe,gBAAgB;GAChC,CAAC;;CAGJ,UAAUA,UAAQ,8BAA8B,iBAAiB;CAEjE,wBAAwB,iBAAiB;CAEzC,iBAAiB,iBAAiB;CAElC,MAAM,iBACJ,gBAAgB,kBACb,iCAAiC,iBAAiB;CACvD,IAAI,gBACF,UAAUA,UAAQ,6BAA6B,eAAe;CAGhE,IAAI,YACF,gBAAgB,aAAa,iBAAiB,kBAAkB,EAAE;CAGpE,MAAM,cACJ,gBAAgB,eAAe,eAAe,iBAAiB;CAIjE,MAAM,gBAAgB,EAAE,IAAI,OAAO,iBAAiB;CACpD,SAAO,MAAM,0BAA0B,cAAc;CACrD,IAAI,CAAC,MAAM,qBAAqB,CAAC,0BAA0B;EACzD,MAAM,QAAQ,iBAAiB;EAC/B,MAAM,UAAU,CAAC,SAAS,MAAM,WAAW;EAC3C,IAAI,iBAAiB,WAAW,gBAAgB,GAC9C,iBAAiB,QAAQ,eAAe;;CAI5C,IAAI,aACF,SAAO,MAAM,yBAAyB,YAAY;CAGpD,IAAI,CAAC,MAAM,mBAAmB;EAC5B,MAAM,0BAA0B,kCAC9B,iBAAiB,SAAS,GAAG,GAAG,CACjC;EAED,+BAA+B,iBAAiB;EAOhD,yBAAyB,kBAAkB,EACzC,iBAAiB,gBAAA,GAClB,CAAC;EAEF,6BAA6B,kBAAkB,wBAAwB;;CAGzE,MAAM,YACJ,gBAAgB,aACb,6BAA6B,kBAAkB,UAAU;CAC9D,SAAO,MAAM,yBAAyB,UAAU;CAEhD,IAAI,CAAC,WACH,YAAY,QAAQ,UAAU;CAEhC,SAAO,MAAM,yBAAyB,UAAU;CAEhD,MAAM,gBAAgB,kBAAkB,iBAAiB,MAAM;CAC/D,iBAAiB,QAAQ,eAAe,MAAM,iBAAiB;CAE/D,IAAI,qBAAqB,cAAc,EACrC,OAAO,MAAM,qBAAqB,sBAChC,GACA,kBACA;EACE,qBAAqB;EACrB;EACA;EACA;EACA;EACA;EACA,QAAA;EACA,eAAe,gBAAgB;EAChC,CACF;CAGH,IAAI,sBAAsB,eAAe,YAAY,EACnD,OAAO,MAAM,qBAAqB,uBAChC,GACA,kBACA;EACE;EACA;EACA;EACA;EACA;EACA,QAAA;EACA,eAAe,gBAAgB;EAChC,CACF;CAGH,OAAO,MAAM,qBAAqB,0BAChC,GACA,kBACA;EACE;EACA;EACA;EACA;EACA;EACA,QAAA;EACA,eAAe,gBAAgB;EAChC,CACF;;AAGH,MAAMC,sBAAoB;AAE1B,MAAM,yBACJ,eACA,gBACY;CACZ,OAAO,QAAQ,8BAA8B,eAAe,EAAE,aAAa,CAAC,CAAC;;AAG/E,MAAM,wBAAwB,kBAA8C;CAE1E,IAAI,CADmB,sBACJ,EACjB,OAAO;CAET,OACE,eAAe,qBAAqB,SAASA,oBAAkB,IAAI;;;;ACvPvE,MAAa,gBAAgB,IAAI,MAAM;AAEvC,cAAc,KAAK,KAAK,OAAO,MAAM;CACnC,IAAI;EACF,OAAO,MAAM,iBAAiB,EAAE;UACzB,OAAO;EACd,OAAO,MAAM,aAAa,GAAG,MAAM;;EAErC;AAEF,cAAc,KAAK,iBAAiB,OAAO,MAAM;CAC/C,IAAI;EACF,OAAO,MAAM,kBAAkB,EAAE;UAC1B,OAAO;EACd,OAAO,MAAM,aAAa,GAAG,MAAM;;EAErC;;;ACTF,MAAMC,WAAS,oBAAoB,uBAAuB;AAC1D,MAAM,2BAA2B;AACjC,MAAM,8BAAgE;CACpE;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AAED,MAAM,4BAAyD;CAC7D;CACA;CACA;CACA;CACD;AAED,MAAM,2BACJ,YACgC;CAChC,IAAI,QAAQ,SAAS,QAAQ,EAAE,OAAO;CACtC,OAAO,CAAC,GAAG,SAAS,QAAQ;;AAM9B,MAAM,4BAA4B;AAClC,MAAM,wBAAwB;AAC9B,MAAM,4BAA4B;AAClC,MAAM,yBAAyB;AAE/B,MAAM,yBAAqC;CACzC,MAAM;CACN,cAAc;CACd,aAAa;CACb,yBAAyB;CACzB,4BAA4B;EAC1B;GACE,QAAQ;GACR,aAAa;GACd;EACD;GACE,QAAQ;GACR,aAAa;GACd;EACD;GACE,QAAQ;GACR,aAAa;GACd;EACD;GACE,QAAQ;GACR,aAAa;GACd;EACD;GACE,QAAQ;GACR,aAAa;GACd;EACD;GACE,QAAQ;GACR,aAAa;GACd;EACF;CACD,YAAY;CACZ,YAAY;CACZ,kBAAkB;CAClB,UAAU;CACV,wBAAwB,CAAC,OAAO;CAChC,eAAe,CACb;EACE,IAAI;EACJ,MAAM;EACN,aAAa;EACd,CACF;CACD,kBAAkB;CAClB,SAAS;CACT,gBAAgB;EACd,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmIvB,wBAAwB;EACxB,WAAW;EACX,aAAa;EACb,aAAa;EACd;CACD,mCAAmC;CACnC,mCAAmC;CACnC,iCAAiC;CACjC,2BAA2B;CAC3B,mBAAmB;CACnB,mBAAmB;CACnB,uBAAuB;CACvB,sBAAsB;CACtB,mBAAmB;EACjB,MAAM;EACN,OAAO;EACR;CACD,8BAA8B;CAC9B,gCAAgC;CAChC,gBAAgB;CAChB,oBAAoB;CACpB,WAAW;CACX,kCAAkC;CAClC,8BAA8B,EAAE;CAChC,kBAAkB,CAAC,QAAQ,QAAQ;CACnC,sBAAsB;CACtB,oBAAoB;CACpB,WAAW;CACX,qBAAqB;CACrB,mBAAmB;CACnB,wBAAwB;CACxB,0BAA0B;CAC1B,0BAA0B;CAC1B,oBAAoB;CACpB,4BAA4B;CAC5B,sBAAsB;CACtB,sCAAsC;CACtC,8BAA8B;CAC9B,mBACE;CACH;AAOD,SAAgB,iBAAiB,WAAwC;CACvE,OAAO,yBAAyB,KAAK,WAAW,MAAM,IAAI,GAAG;;AAG/D,SAAgB,kBAAkB,SAA0B;CAC1D,OAAO,QAAQ,aAAa,CAAC,SAAS,WAAW;;AAGnD,SAAgB,iCACd,WACA,aACS;CACT,OAAO,iBAAiB,UAAU,IAAI,CAAC,kBAAkB,YAAY;;AAGvE,eAAe,uBAAuB,UAAmC;CACvE,IAAI;EACF,MAAM,SAAU,MAAM,SAAS,OAAO,CAAC,MAAM;EAC7C,UAAUA,UAAQ,yBAAyB;GACzC,YAAY,SAAS;GACrB;GACD,CAAC;UACK,OAAO;EACd,SAAO,KAAK,mCAAmC,EAAE,OAAO,CAAC;;;;;;;;;AAU7D,eAAsB,uBACpB,GACA,wBACmB;CAGnB,IAAI,EADF,0BAA2B,MAAM,sBAAsB,QAAQ,GAE/D,OAAO,EAAE,KACP,EACE,OAAO;EACL,SAAS;EACT,MAAM;EACP,EACF,EACD,IACD;CAGH,MAAM,mBAAmB,MAAM,mBAC7B,EAAE,IAAI,KACN,EAAE,IAAI,IAAI,QACX;CACD,MAAM,uBAAuB,iBAAiB;CAC9C,OAAO,4BAA4B,iBAAiB;;AAGtD,eAAsB,wBACpB,GACA,mBAGA,UAAoC,EAAE,EACnB;CACnB,MAAM,CAAC,iBAAiB,cAAc,MAAM,QAAQ,IAAI,CACtD,mBAAmB,EAAE,EACrB,QAAQ,QAAQ,kBAAkB,CAAC,OAAO,UAAmB;EAC3D,SAAO,KAAK,iCAAiC,EAAE,OAAO,CAAC;EACvD,OAAO,EAAE;GACT,CACH,CAAC;CACF,MAAM,iBAAiB,iBAAiB,UAAU,EAAE;CACpD,MAAM,WAAW,eAAe,eAAe;CAC/C,MAAM,sBAAsB,IAAI,IAC9B,eAAe,KAAK,UAAU,CAAC,MAAM,MAAM,MAAM,CAAC,CACnD;CACD,MAAM,YAAY,IAAI,IAAI,eAAe,KAAK,UAAU,MAAM,KAAK,CAAC;CACpE,MAAM,uBACJ,QAAQ,8BACN,eAAe,SAAS,OAAO,UAAU;EACvC,MAAM,OAAO,SAAS,MAAM;EAC5B,IAAI,UAAU,IAAI,KAAK,EAAE,OAAO,EAAE;EAClC,UAAU,IAAI,KAAK;EACnB,OAAO,CACL;GACE,GAAG,mBAAmB,OAAO,MAAM,QAAQ,kBAAkB;GAC7D,UAAU,4BAA4B;GACvC,CACF;GACD,GACF,EAAE;CACN,MAAM,kBAAkB,WACrB,QAAQ,cAAc,CAAC,UAAU,IAAI,UAAU,KAAK,CAAC,CACrD,SAAS,WAAW,UAAU;EAC7B,MAAM,eAAe,yBAAyB,UAAU;EACxD,MAAM,eACJ,UAAU,cACR,oBAAoB,IAAI,UAAU,YAAY,GAC9C,KAAA;EACJ,IAAI,cACF,OAAO,CACL;GACE,GAAG,mBACD,cACA,UAAU,MACV,UAAU,aACX;GACD,UAAU,eAAe;GAC1B,CACF;EAEH,IAAI,UAAU,sBAAsB,OAAO,EAAE;EAE7C,OAAO,CACL,0BAA0B,WAAW,UAAU,eAAe,MAAM,CACrE;GACD;CAEJ,MAAM,SAAS;EACb,GAAG;EACH,GAAG;EACH,GAAG;EACJ,CAAC,MAAM,GAAG,MAAM,iBAAiB,EAAE,GAAG,iBAAiB,EAAE,CAAC;CAE3D,MAAM,WAAgC;EACpC,GAAI,mBAAmB,EAAE;EACzB;EACD;CACD,UAAUA,UAAQ,gCAAgC;EAChD,eAAe,eAAe;EAC9B,yBAAyB,qBAAqB;EAC9C,gBAAgB,gBAAgB;EAChC,QAAQ;EACT,CAAC;CACF,OAAO,EAAE,KAAK,SAAS;;AAGzB,SAAS,mBACP,OACA,MACA,cACY;CACZ,MAAM,QAAQ;EAAE,GAAG;EAAO;EAAM;CAChC,MAAM,SAAS,cAAc,MAAM;CACnC,IACE,CAAC,UACE,OAAO,MAAM,iBAAiB,YAC9B,MAAM,aAAa,WAAW,GAAG,OAAO,GAAG,EAE9C,OAAO;CAGT,OAAO;EACL,GAAG;EACH,cAAc,GAAG,OAAO,GAAG,MAAM;EAClC;;AAGH,SAAgB,0BACd,WACA,UACA,UACY;CACZ,MAAM,mBACJ,UAAU,iBAAiB,SAAS,IAClC,wBAAwB,UAAU,iBAAiB,GACnD;CACJ,MAAM,yBACJ,iBAAiB,SAAS,UAAU,uBAAuB,GACzD,UAAU,yBACV,iBAAiB;CACrB,MAAM,oBAAoB,iBAAiB,MAAM,WAAW,WAAW,OAAO;CAC9E,MAAM,kBAAkB,CAAC,GAAG,IAAI,IAAI,UAAU,gBAAgB,CAAC;CAC/D,MAAM,kBAAkB,kBAAkB,UAAU,KAAK;CAEzD,OAAO;EACL,GAAG;EACH,MAAM,UAAU;EAChB,cAAc,UAAU;EACxB,aAAa,UAAU;EACvB;EACA,YAAY;EACZ,kBAAkB;EAClB,wBAAwB;EACxB,mBAAmB;EACnB,mBAAmB;EACnB,mBAAmB;EACnB,uBAAuB;EACvB,sBAAsB;EACtB,sBAAsB;EACtB,oBAAoB,kBAAkB,QAAQ;EAC9C,WAAW,kBAAkB,OAAO;EACpC,qBAAqB;EACrB,YAAY;EACZ,8BAA8B,EAAE;EAChC,kBAAkB;EAClB,gCAAgC;EAChC,8BAA8B;EAC9B,gBAAgB,UAAU;EAC1B,oBAAoB,UAAU;EAC9B,mBAAmB,UAAU;EAC7B,0BAA0B;EAC1B,WAAW;EACX,kCAAkC;EAClC,yBAAyB;EACzB,4BAA4B,iBAAiB,KAAK,YAAY;GAC5D;GACA,aAAa,GAAG,OAAO;GACxB,EAAE;EACH,sCAAsC;EACtC,8BAA8B;EAC9B,2BAA2B,oBAAoB,SAAS;EACxD,0BAA0B;EAC1B,kBAAkB;EAClB,SAAS;EACT,oBAAoB,SAAS;EAC7B,gBAAgB,SAAS;EACzB,4BAA4B;EAC5B,sBAAsB;EACtB,eAAe,EAAE;EACjB,wBAAwB,EAAE;EAC1B,mCAAmC;EACnC,mBAAmB;GAAE,MAAM;GAAU,OAAO;GAAQ;EACpD,mBACE,SAAS,kBAAkB,MAAM,GAC/B,SAAS,oBACT,uBAAuB;EAC5B;;AAGH,eAAe,mBACb,GACqC;CACrC,IAAI;EAEF,IAAI,CAAC,MADwB,sBAAsB,QAAQ,EACtC,OAAO;EAE5B,MAAM,WAAW,MAAM,mBAAmB,EAAE,IAAI,KAAK,EAAE,IAAI,IAAI,QAAQ;EACvE,IAAI,CAAC,SAAS,IAAI;GAChB,SAAO,KAAK,iCAAiC,EAC3C,YAAY,SAAS,QACtB,CAAC;GACF,OAAO;;EAGT,MAAM,OAAO,MAAM,SAAS,MAAM;EAClC,IAAI,CAAC,sBAAsB,KAAK,EAAE;GAChC,SAAO,KAAK,+BAA+B;GAC3C,OAAO;;EAET,OAAO;UACA,OAAO;EACd,SAAO,KAAK,8BAA8B,EAAE,OAAO,CAAC;EACpD,OAAO;;;AAIX,SAAS,eAAe,QAAuC;CAC7D,OACE,OAAO,MACJ,UACC,MAAM,eAAe,UAAU,MAAM,qBAAqB,MAC7D,IACE,OAAO,MACP;;AAIP,SAAS,iBAAiB,OAA2B;CACnD,OAAO,OAAO,MAAM,aAAa,YAAY,OAAO,SAAS,MAAM,SAAS,GACxE,MAAM,WACN;;AAGN,SAAS,yBACP,WACQ;CACR,IAAI,CAAC,UAAU,cAAc,OAAO;CACpC,IAAI,UAAU,iBAAiB,eAAe,OAAO;CACrD,OAAO;;AAGT,SAAS,sBAAsB,OAA8C;CAC3E,IAAI,CAACC,WAAS,MAAM,IAAI,CAAC,MAAM,QAAQ,MAAM,OAAO,EAAE,OAAO;CAC7D,OAAO,MAAM,OAAO,OACjB,UAAmBA,WAAS,MAAM,IAAI,OAAO,MAAM,SAAS,SAC9D;;AAGH,SAASA,WAAS,OAAkD;CAClE,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,MAAM;;;;AC3iB7E,MAAa,cAAc,IAAI,MAAM;AAErC,MAAMC,WAAS,oBAAoB,iBAAiB;AACpD,MAAM,6BAAY,IAAI,KAAK,EAAE,EAAC,aAAa;AAC3C,MAAM,sBAAsB,IAAI,IAAI,CAAC,cAAc,gBAAgB,CAAC;AACpE,MAAM,oBAAoB;AAC1B,MAAM,4BAA4B;AAOlC,SAAS,SAAS,OAAkD;CAClE,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,MAAM;;AAG7E,SAAS,sBAAsB,OAA2B;CAExD,MAAM,gBADe,MAAM,cACS,QAAQ,6BAA6B;CACzE,MAAM,WAAW,gBAAgB,MAAM,GAAG;CAG1C,OAAO;EACL,iBAHW,iBAAiB,MAGJ,GAAG,SAAS,QAAQ;EAC5C,GAAG;EACH,IAAI;EACJ,QAAQ;EACR,MAAM;EACN,SAAS;EACT,YAAY;EACZ,UAAU,MAAM;EAChB,cAAc,MAAM;EACrB;;AAGH,SAAS,eACP,OACA,OACoB;CACpB,MAAM,QAAQ,MAAM;CACpB,OAAO,OAAO,UAAU,YAAY,MAAM,MAAM,GAAG,QAAQ,KAAA;;AAG7D,SAAS,+BACP,UACgC;CAChC,OAAO,6BAA6B,YAAY,SAAS,CAAC,KAAK,QAAQ;EACrE;EACA,MAAM;EACN,QAAQ;EACT,EAAE;;AAKL,SAAS,gCACP,UACA,QACA,UAAmC,EAAE,EACL;CAChC,MAAM,iBAAiB,+BAA+B,SAAS;CAC/D,SAAO,KAAK,4BAA4B,UAAU;EAChD;EACA,GAAG;EACH,oBAAoB,eAAe;EACpC,CAAC;CACF,OAAO;;AAGT,SAAS,uBACP,UACA,OACoB;CACpB,IAAI,CAAC,SAAS,MAAM,EAClB,OAAO;CAGT,MAAM,QAAQ,eAAe,OAAO,KAAK;CACzC,IAAI,CAAC,OACH,OAAO;CAGT,MAAM,KAAK,GAAG,SAAS,GAAG;CAC1B,MAAM,OACJ,eAAe,OAAO,eAAe,IAClC,eAAe,OAAO,OAAO,IAC7B;CACL,MAAM,UACJ,eAAe,OAAO,WAAW,IAC9B,eAAe,OAAO,SAAS,IAC/B;CAEL,OAAO;EACL,GAAG;EACH;EACA,QAAQ,eAAe,OAAO,SAAS,IAAI;EAC3C,MAAM,eAAe,OAAO,OAAO,IAAI;EACvC,SAAS,OAAO,MAAM,YAAY,WAAW,MAAM,UAAU;EAC7D,YAAY,eAAe,OAAO,aAAa,IAAI;EACnD,UAAU;EACV,cAAc;EACf;;AAGH,SAAS,wBACP,UACA,QACoB;CACpB,OAAO,OACJ,KAAK,UAAU,uBAAuB,UAAU,MAAM,CAAC,CACvD,QAAQ,UAAgC,UAAU,KAAK;;AAG5D,eAAe,wBACb,gBACA,gBACyC;CACzC,IAAI;EACF,MAAM,WAAW,MAAM,sBAAsB,gBAAgB,eAAe;EAC5E,IAAI,CAAC,SAAS,IACZ,OAAO,gCAAgC,eAAe,MAAM,UAAU,EACpE,YAAY,SAAS,QACtB,CAAC;EAGJ,MAAM,OAAO,MAAM,SAAS,MAAM;EAClC,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,EAC9C,OAAO,gCACL,eAAe,MACf,eACD;EAGH,OAAO,KAAK,KAAK,OAAO,SAAS;UAC1B,OAAO;EACd,OAAO,gCAAgC,eAAe,MAAM,SAAS,EACnE,OACD,CAAC;;;AAIN,eAAe,kBACb,UACA,gBAC6B;CAC7B,IAAI;EACF,MAAM,iBAAiB,MAAM,sBAAsB,SAAS;EAC5D,IAAI,CAAC,gBACH,OAAO,EAAE;EAGX,IAAI,eAAe,SAAS,SAC1B,OAAO,wBAAwB,eAAe,MAAMC,WAAgB,CAAC,KAAK;EAG5E,MAAM,SAAS,MAAM,wBAAwB,gBAAgB,eAAe;EAC5E,OAAO,wBAAwB,eAAe,MAAM,OAAO;UACpD,OAAO;EACd,IAAI,aAAa,SAAS;GACxB,SAAO,KAAK,8BAA8B;IACxC;IACA;IACD,CAAC;GACF,OAAO,EAAE;;EAMX,OAAO,wBAAwB,UAHR,gCAAgC,UAAU,SAAS,EACxE,OACD,CACsD,CAAC;;;AAI5D,eAAe,oBACb,gBAC6B;CAC7B,MAAM,gBAAgB,MAAM,QAAQ,KAAK,IAAI,sBAAsB,IAAI,EAAE;CACzE,MAAM,2BAA2B,MAAM,QAAQ,IAC7C,sBAAsB,CAAC,KAAK,aAC1B,kBAAkB,UAAU,eAAe,CAC5C,CACF;CAED,MAAM,SAAS,CAAC,GAAG,eAAe,GAAG,yBAAyB,MAAM,CAAC;CAErE,MAAM,+BAAe,IAAI,KAAa;CACtC,OAAO,OAAO,QAAQ,UAAU;EAC9B,IAAI,aAAa,IAAI,MAAM,GAAG,EAC5B,OAAO;EAGT,aAAa,IAAI,MAAM,GAAG;EAC1B,OAAO;GACP;;AAGJ,MAAM,0BAA0B,IAAI,IAA0B;CAC5D;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;AAEF,eAAe,wBACb,gBACA,WAC8C;CAC9C,MAAM,gBAAgB,2BAA2B;CAMjD,MAAM,kBAAiB,MALO,QAAQ,WACpC,UAAU,KAAK,aACb,2BAA2B,UAAU,eAAe,CACrD,CACF,EACsC,SAAS,WAC9C,OAAO,WAAW,cAAc,OAAO,QAAQ,EAAE,CAClD;CAED,MAAM,uBAAO,IAAI,KAAa;CAC9B,OAAO,CAAC,GAAG,eAAe,GAAG,eAAe,MAAM,CAAC,CAAC,QAAQ,cAAc;EACxE,IAAI,KAAK,IAAI,UAAU,KAAK,EAAE,OAAO;EACrC,KAAK,IAAI,UAAU,KAAK;EACxB,OAAO;GACP;;AAGJ,SAAS,4BAAiE;CACxE,MAAM,aAAkD,EAAE;CAC1D,KAAK,MAAM,SAAS,MAAM,QAAQ,QAAQ,EAAE,EAC1C,IAAI;EACF,IAAI,wBAAwB,MAAM,EAChC,WAAW,KAAK,4BAA4B,MAAM,CAAC;UAE9C,OAAO;EACd,SAAO,KAAK,mCAAmC;GAC7C,SAAS,MAAM;GACf;GACD,CAAC;;CAGN,OAAO;;AAGT,SAAS,wBAAwB,OAAuB;CAEtD,QADkB,MAAM,uBAAuB,EAAE,EAErC,MACP,aACC,aAAa,qBACV,aAAa,6BACb,oBAAoB,IAAI,SAAS,CACvC,IAAI,MAAM,aAAa,SAAS,eAAe;;AAIpD,SAAS,uBAAuB,OAAsB;CACpD,MAAM,oBAAoB,MAAM,qBAAqB,MAAM,aACzD,oBAAoB,IAAI,SAAS,CAClC;CAID,IAAI,MAAM,GAAG,WAAW,MAAM,IAAI,mBAChC,OAAO,GAAG,MAAM,KAAK;CAIvB,IAAI,MAAM,qBAAqB,SAAS,kBAAkB,EACxD,OAAO,GAAG,MAAM,KAAK;CAEvB,IAAI,mBACF,OAAO,GAAG,MAAM,KAAK;CAEvB,OAAO,GAAG,MAAM,KAAK;;AAGvB,SAAS,4BACP,OAC8B;CAC9B,MAAM,mBAAmB,0BACvB,MAAM,aAAa,SAAS,iBAC7B;CACD,OAAO;EACL,MAAM,gBAAgB,MAAM,GAAG;EAC/B,aAAa,MAAM;EACnB,aAAa,uBAAuB,MAAM;EAC1C,eAAe,eACb,MAAM,aAAa,OAAO,mBAC1B,MACD;EACD,iBAAiB,eACf,MAAM,aAAa,OAAO,mBAC1B,KACD;EACD,iBACE,MAAM,aAAa,SAAS,SAAS,CAAC,QAAQ,QAAQ,GAAG,CAAC,OAAO;EACnE;EACA,wBAAwB,6BAA6B,iBAAiB;EACvE;;AAGH,eAAe,2BACb,UACA,gBAC8C;CAC9C,IAAI,aAAa,SAAS,OAAO,EAAE;CAEnC,IAAI;EACF,MAAM,iBAAiB,MAAM,sBAAsB,SAAS;EAC5D,IAAI,CAAC,kBAAkB,eAAe,SAAS,SAAS,OAAO,EAAE;EAEjE,MAAM,eAAe,MAAM,wBACzB,gBACA,eACD;EACD,MAAM,aAAa,IAAI,IACrB,aAAa,SAAS,UAAU;GAC9B,MAAM,KAAK,eAAe,OAAO,KAAK;GACtC,OAAO,KAAK,CAAC,CAAC,IAAI,MAAM,CAAU,GAAG,EAAE;IACvC,CACH;EACD,MAAM,WAAW,IAAI,IAAI,CACvB,GAAG,WAAW,MAAM,EACpB,GAAG,OAAO,KAAK,eAAe,UAAU,EAAE,CAAC,CAC5C,CAAC;EAEF,MAAM,aAAkD,EAAE;EAC1D,KAAK,MAAM,WAAW,UAAU;GAC9B,MAAM,gBAAgB,6BACpB,gBACA,QACD;GAED,IAAI,CADyB,+BAA+B,cACnC,IAAI,kBAAkB,oBAC7C;GAEF,MAAM,cAAc,eAAe,SAAS;GAC5C,WAAW,KACT,6BACE,gBACA,SACA,WAAW,IAAI,QAAQ,EACvB,aACA,cACD,CACF;;EAEH,OAAO;UACA,OAAO;EACd,SAAO,KAAK,oCAAoC;GAAE;GAAU;GAAO,CAAC;EACpE,OAAO,EAAE;;;AAIb,SAAS,+BAA+B,MAA6B;CACnE,OAAO,SAAS,eAAe,SAAS;;AAG1C,SAAS,wBAAwB,MAA4B;CAC3D,IAAI,SAAS,aAAa,OAAO;CACjC,IAAI,SAAS,oBAAoB,OAAO;CACxC,OAAO;;AAGT,SAAS,6BACP,gBACA,SACA,aACA,aACA,eAC8B;CAC9B,MAAM,qBAAqB,6BAA6B,eACtD,eAAe,MACf,QACD;CACD,MAAM,6BAA6B,0BACjC,aAAa,iBACd;CACD,MAAM,yBAAyB,gCAAgC,YAAY;CAC3E,MAAM,0BAA0B,0BAC9B,oBAAoB,iBACrB;CACD,MAAM,mBACJ,2BAA2B,SAAS,IAAI,6BACtC,uBAAuB,SAAS,IAAI,yBACpC;CACJ,MAAM,uBAAuB,yBAC3B,aAAa,gBACd;CACD,MAAM,mBAAmB,yBACvB,aAAa,oBAAoB,aAAa,WAC/C;CACD,MAAM,oBAAoB,yBACxB,oBAAoB,gBACrB;CACD,MAAM,cACJ,eAAe,eAAe,EAAE,EAAE,eAAe,IAC9C,eAAe,eAAe,EAAE,EAAE,OAAO,IACzC;CACL,MAAM,cAAc,wBAAwB,cAAc;CAK1D,MAAM,uBACJ,kBAAkB,sBAAsB,QAAQ,WAAW,MAAM;CAEnE,OAAO;EACL,MAAM,GAAG,eAAe,KAAK,GAAG;EAChC,aAAa;EACb,sBAAsB;EACtB,cAAc,eAAe;EAC7B,aAAa,GAAG,YAAY,IAAI,eAAe,KAAK;EACpD,aAAa,GAAG,YAAY,eAAe,eAAe,KAAK,GAAG,YAAY;EAC9E,eAAe,eACb,aAAa,iBACR,uBAAuB,aAAa;GACrC;GACA;GACA;GACA;GACD,CAAC,IACC,oBAAoB,eACzB,MACD;EACD,iBAAiB,eACf,aAAa,mBACR,uBAAuB,aAAa,CAAC,oBAAoB,CAAC,IAC1D,oBAAoB,iBACzB,KACD;EACD,iBAAiB,uBACf,eAAe,MACf,sBACA,kBACA,kBACD;EACD;EACA,wBAAwB,6BACtB,kBACA,aAAa,0BACR,oBAAoB,uBAC1B;EACF;;AAGH,SAAS,gCACP,OAC6B;CAC7B,IAAI,CAAC,OAAO,OAAO,EAAE;CACrB,MAAM,QAAQ,MAAM,qBAAqB,MAAM;CAC/C,IAAI,CAAC,MAAM,QAAQ,MAAM,EAAE,OAAO,EAAE;CACpC,OAAO,0BACL,MAAM,KAAK,UACT,SAAS,MAAM,IAAI,OAAO,MAAM,WAAW,WACzC,MAAM,SACN,MACH,CACF;;AAGH,SAAS,0BACP,OAC6B;CAC7B,IAAI,CAAC,MAAM,QAAQ,MAAM,EAAE,OAAO,EAAE;CACpC,OAAO,CACL,GAAG,IAAI,IACL,MAAM,QACH,WACC,OAAO,WAAW,YACf,wBAAwB,IAAI,OAA+B,CACjE,CACF,CACF;;AAGH,SAAS,yBAAyB,OAAyC;CACzE,IAAI,CAAC,MAAM,QAAQ,MAAM,EAAE,OAAO,EAAE;CACpC,OAAO,CACL,GAAG,IAAI,IACL,MAAM,QACH,aACC,aAAa,UAAU,aAAa,QACvC,CACF,CACF;;AAGH,SAAS,mBACP,kBACA,mBACyB;CACzB,IAAI,iBAAiB,SAAS,GAAG,OAAO;CACxC,OAAO,kBAAkB,SAAS,IAAI,oBAAoB,CAAC,OAAO;;AAGpE,SAAS,uBACP,cACA,sBACA,kBACA,mBACyB;CACzB,IAAI,qBAAqB,SAAS,GAAG,OAAO;CAC5C,MAAM,aAAa,mBAAmB,kBAAkB,kBAAkB;CAC1E,IAAI,iBAAiB,QACnB,OAAO,CAAC,GAAG,IAAI,IAAsB,CAAC,GAAG,YAAY,QAAQ,CAAC,CAAC;CAEjE,OAAO;;AAGT,SAAS,6BACP,SACA,YACsB;CACtB,IAAI,cAAc,QAAQ,SAAS,WAAW,EAAE,OAAO;CACvD,IAAI,QAAQ,SAAS,MAAM,EAAE,OAAO;CACpC,OAAO,QAAQ,MAAM;;AAGvB,SAAS,eAAe,OAAgB,UAA0B;CAChE,OAAO,OAAO,UAAU,YAAY,OAAO,SAAS,MAAM,IAAI,QAAQ,IAClE,KAAK,MAAM,MAAM,GACjB;;AAGN,SAAS,uBACP,OACA,QACoB;CACpB,IAAI,CAAC,OAAO,OAAO,KAAA;CACnB,KAAK,MAAM,SAAS,QAAQ;EAC1B,MAAM,QAAQ,MAAM;EACpB,IAAI,OAAO,UAAU,YAAY,OAAO,SAAS,MAAM,IAAI,QAAQ,GACjE,OAAO;;;AAMb,YAAY,IAAI,KAAK,OAAO,MAAM;CAChC,IAAI;EACF,IAAI,iBAAiB,EAAE,IAAI,OAAO,aAAa,CAAC,EAAE;GAChD,MAAM,mBAAmB,sBAAsB;GAC/C,MAAM,oBAAoB,iBAAiB,MACxC,aAAa,aAAa,QAC5B;GACD,OAAO,MAAM,wBACX,GACA,wBAAwB,EAAE,IAAI,IAAI,SAAS,iBAAiB,EAC5D;IACE,6BAA6B,sBAAsB,KAAA;IACnD;IACD,CACF;;EAGH,MAAM,SAAS,MAAM,oBAAoB,EAAE,IAAI,IAAI,QAAQ;EAE3D,OAAO,EAAE,KAAK;GACZ,QAAQ;GACR,MAAM;GACN,UAAU;GACX,CAAC;UACK,OAAO;EACd,OAAO,MAAM,aAAa,GAAG,MAAM;;EAErC;;;ACtkBF,MAAMC,WAAS,oBAAoB,gCAAgC;AAEnE,MAAa,4BAA4B,IAAI,MAAM;AAEnD,MAAa,uCAAuC;CAClD;CACA;CACA;CACA;CACD;AAED,0BAA0B,KAAK,KAAK,OAAO,MAAM;CAC/C,MAAM,WAAW,EAAE,IAAI,MAAM,WAAW,IAAI;CAE5C,IAAI;EACF,MAAM,iBACJ,MAAM,qCAAqC,sBAAsB,SAAS;EAC5E,IAAI,CAAC,gBACH,OAAO,EAAE,KACP,EACE,OAAO;GACL,SAAS,aAAa,SAAS;GAC/B,MAAM;GACP,EACF,EACD,IACD;EAGH,IAAI,eAAe,SAAS,SAC1B,OAAO,MAAM,qCAAqC,yBAChD,GACA,eACD;EAGH,MAAM,eAAeA,UAAQ,iCAAiC,aAAa;GACzE,MAAM,MAAM,EAAE,IAAI,IAAI,OAAO,CAAC,MAAM;GACpC;GACD,EAAE;EAEH,MAAM,mBACJ,MAAM,qCAAqC,2BACzC,gBACA,EAAE,IAAI,IACP;EAEH,MAAM,eACJA,UACA,kCACA,aAAa;GACX,MAAM,MAAM,iBAAiB,OAAO,CAAC,MAAM;GAC3C;GACA,YAAY,iBAAiB;GAC9B,EACF;EAED,OAAO,qCAAqC,4BAC1C,iBACD;UACM,OAAO;EACd,SAAO,MAAM,+BAA+B;GAAE;GAAU;GAAO,CAAC;EAChE,OAAO,MAAM,aAAa,GAAG,MAAM;;EAErC;;;AC/DF,MAAMC,WAAS,oBAAoB,0BAA0B;AAE7D,MAAa,sBAAsB,IAAI,MAAM;AAE7C,SAAS,mBAAmB,SAAkB;CAC5C,OAAO;EACL,aAAa,QAAQ,IAAI,eAAe;EACxC,eAAe,QAAQ,IAAI,iBAAiB;EAC7C;;AAGH,eAAe,qBACb,GACA,WACmB;CACnB,MAAM,WAAW,EAAE,IAAI,MAAM,WAAW,IAAI;CAE5C,IAAI;EACF,MAAM,iBAAiB,MAAM,sBAAsB,SAAS;EAC5D,IAAI,CAAC,gBACH,OAAO,EAAE,KACP,EACE,OAAO;GACL,SAAS,aAAa,SAAS;GAC/B,MAAM;GACP,EACF,EACD,IACD;EAGH,IAAI,eAAe,SAAS,SAC1B,OAAO,MAAM,kBAAkB,GAAG,WAAW,eAAe;EAG9D,IAAI,cAAc,eAChB,MAAM,eACJA,UACA,uCACA,aAAa;GACX,MAAM,MAAM,EAAE,IAAI,IAAI,OAAO,CAAC,MAAM;GACpC;GACD,EACF;OAED,UAAUA,UAAQ,iCAAiC;GACjD,GAAG,mBAAmB,EAAE,IAAI,IAAI,QAAQ;GACxC;GACD,CAAC;EAGJ,MAAM,mBAAmB,MAAM,sBAC7B,gBACA,EAAE,IAAI,KACN,UACD;EAED,UAAUA,UAAQ,mBAAmB,UAAU,YAAY;GACzD,GAAG,mBAAmB,iBAAiB,QAAQ;GAC/C;GACA,YAAY,iBAAiB;GAC9B,CAAC;EAEF,OAAO,4BAA4B,iBAAiB;UAC7C,OAAO;EACd,SAAO,MAAM,mBAAmB,UAAU,SAAS;GAAE;GAAU;GAAO,CAAC;EACvE,OAAO,MAAM,aAAa,GAAG,MAAM;;;AAIvC,oBAAoB,KAAK,iBAAiB,MACxC,qBAAqB,GAAG,cAAc,CACvC;AACD,oBAAoB,KAAK,WAAW,MAAM,qBAAqB,GAAG,QAAQ,CAAC;;;AC9E3E,MAAa,wBAAwB,IAAI,MAAM;AAE/C,sBAAsB,KAAK,KAAK,OAAO,MAAM;CAC3C,IAAI;EACF,OAAO,MAAM,uBAAuB,EAAE;UAC/B,OAAO;EACd,OAAO,MAAM,aAAa,GAAG,MAAM;;EAErC;AAEF,sBAAsB,KAAK,iBAAiB,OAAO,MAAM;CACvD,IAAI;EACF,OAAO,MAAM,0BAA0B,EAAE;UAClC,OAAO;EACd,OAAO,MAAM,aAAa,GAAG,MAAM;;EAErC;;;ACRF,MAAMC,WAAS,oBAAoB,0BAA0B;AAE7D,MAAa,sBAAsB,IAAI,MAAM;AAE7C,oBAAoB,IAAI,KAAK,OAAO,MAAM;CACxC,MAAM,WAAW,EAAE,IAAI,MAAM,WAAW,IAAI;CAE5C,IAAI;EACF,MAAM,iBAAiB,MAAM,sBAAsB,SAAS;EAC5D,IAAI,CAAC,gBACH,OAAO,EAAE,KACP,EACE,OAAO;GACL,SAAS,aAAa,SAAS;GAC/B,MAAM;GACP,EACF,EACD,IACD;EAGH,IAAI,eAAe,SAAS,SAAS;GACnC,IAAI,iBAAiB,EAAE,IAAI,OAAO,aAAa,CAAC,EAC9C,OAAO,MAAM,uBAAuB,GAAG,eAAe;GAGxD,MAAM,SAASC,WAAgB;GAC/B,OAAO,EAAE,KAAK;IACZ,QAAQ;IACR,MAAM,OAAO;IACb,UAAU;IACX,CAAC;;EAGJ,MAAM,mBAAmB,MAAM,sBAC7B,gBACA,EAAE,IAAI,IAAI,QACX;EAED,SAAO,MAAM,4BAA4B;GACvC;GACA,YAAY,iBAAiB;GAC9B,CAAC;EAEF,OAAO,4BAA4B,iBAAiB;UAC7C,OAAO;EACd,SAAO,MAAM,yBAAyB;GACpC;GACA;GACD,CAAC;EACF,OAAO,MAAM,aAAa,GAAG,MAAM;;EAErC;;;ACjEF,MAAM,kCAAkC;CAAC;CAAK;CAAW;CAAK;CAAI;AAKlE,IAAa,+BAAb,MAA0C;CACxC,aAA8B,IAAI,OAAe;CACjD,eAAuB;CACvB,cAAmC;CACnC,SAAiB;CACjB,WAAmB;CACnB,SAAiB;CACjB,mBAA2B;CAC3B,oBAA4B;CAC5B,kBAA0B;CAC1B,QAA8B;CAC9B,gBAAwB;CACxB,kBAA0B;CAC1B,mBAA2B;CAC3B,yBAAiC;CAEjC,OAAO,aAA6B;EAClC,IAAI,KAAK,QAAQ,OAAO,KAAK,KAAK,uCAAuC;EACzE,IAAI,KAAK,UAAU,OAAO,KAAK,KAAK,wCAAwC;EAE5E,MAAM,aAAa,IAAI,OAAe;EACtC,KAAK,MAAM,QAAQ,aAAa;GAC9B,KAAK,UAAU,KAAK;GACpB,KAAK,QAAQ,MAAM,WAAW;;EAEhC,KAAK,eAAe,WAAW;EAE/B,MAAM,QAAQ,WAAW,KAAK,GAAG;EACjC,IAAI,OAAO,KAAK,WAAW,KAAK,MAAM;EACtC,OAAO;;CAGT,SAAiB;EACf,IAAI,KAAK,QAAQ,OAAO,KAAK,KAAK,uCAAuC;EACzE,IAAI,KAAK,UAAU,OAAO,KAAK,KAAK,8BAA8B;EAClE,IACE,KAAK,UAAU,UACZ,KAAK,gBAAgB,WACrB,KAAK,cAER,OAAO,KAAK,KAAK,8CAA8C;EAGjE,KAAK,WAAW;EAChB,OAAO,KAAK,WAAW,KAAK,GAAG;;CAGjC,QAAgB,MAAc,YAAiC;EAC7D,QAAQ,KAAK,OAAb;GACE,KAAK,UACH,OAAO,KAAK,cAAc,KAAK;GACjC,KAAK,UACH,OAAO,KAAK,cAAc,KAAK;GACjC,KAAK,YACH,OAAO,KAAK,gBAAgB,KAAK;GACnC,KAAK,QACH,OAAO,KAAK,YAAY,KAAK;GAC/B,SACE,OAAO,KAAK,aAAa,MAAM,WAAW;;;CAIhD,cAAsB,MAAoB;EACxC,MAAM,QAAQ,gCAAgC,KAAK;EACnD,IAAI,KAAK,qBAAqB,KAAK,iBAAiB,KAAK,EAAE;EAC3D,IAAI,SAAS,QAAQ,KAAK,mBACxB,OAAO,KAAK,KAAK,sCAAsC;EAEzD,KAAK,oBAAoB;EACzB,IAAI,KAAK,mBAAmB,MAAM,QAAQ;EAE1C,KAAK,qBAAqB;EAC1B,KAAK,mBAAmB;EACxB,IAAI,KAAK,sBAAsB,gCAAgC,QAC7D,KAAK,QAAQ;;CAIjB,cAAsB,MAAoB;EACxC,IAAI,iBAAiB,KAAK,EAAE;EAC5B,IAAI,SAAS,KAAK;GAChB,KAAK,QAAQ;GACb;;EAEF,IAAI,SAAS,KAAK;GAGhB,KAAK,QAAQ;GACb,KAAK,gBAAgB;GACrB;;EAEF,OAAO,KAAK,KAAK,iDAA6C;;CAGhE,gBAAwB,MAAoB;EAC1C,IAAI,KAAK,kBAAkB,OAAO,KAAK,sBAAsB,KAAK;EAElE,IAAI,SAAS,MAAK;GAChB,KAAK,mBAAmB;GACxB;;EAEF,IAAI,SAAS,OAAO,SAAS,KAAK;GAChC,KAAK,iBAAiB;GACtB;;EAEF,IAAI,SAAS,OAAO,SAAS,KAAK;GAChC,KAAK,iBAAiB;GACtB,IAAI,KAAK,kBAAkB,GAAG,KAAK,QAAQ;;;CAI/C,sBAA8B,MAAoB;EAChD,IAAI,KAAK,iBAAiB;GACxB,KAAK,kBAAkB;GACvB;;EAEF,IAAI,SAAS,MAAM;GACjB,KAAK,kBAAkB;GACvB;;EAEF,IAAI,SAAS,MAAK,KAAK,mBAAmB;;CAG5C,YAAoB,MAAoB;EACtC,IAAI,CAAC,iBAAiB,KAAK,EACzB,OAAO,KAAK,KAAK,0CAA0C;;CAI/D,aAAqB,MAAc,YAAiC;EAClE,IAAI,KAAK,gBAAgB,WAAW,OAAO,KAAK,qBAAqB,KAAK;EAC1E,IAAI,KAAK,gBAAgB,WAAW,OAAO,KAAK,cAAc,KAAK;EAEnE,IAAI,SAAS,MAAM;GACjB,KAAK,gBAAgB;GACrB,KAAK,cAAc;GACnB;;EAEF,IAAI,SAAS,MAAK;GAChB,KAAK,eAAe,WAAW;GAC/B,KAAK,QAAQ;GACb;;EAEF,KAAK,KAAK,YAAY,EAAE,IAAI,KAAK,IAC/B,OAAO,KAAK,KAAK,mDAAmD;EAGtE,KAAK,gBAAgB;EACrB,KAAK,kBAAkB,KAAK,aAAa;;CAG3C,qBAA6B,MAAoB;EAC/C,IAAI,CAAC,iBAAiB,KAAK,KAAK,EAC9B,OAAO,KAAK,KAAK,yBAAyB;EAE5C,KAAK,gBAAgB;EACrB,KAAK,0BAA0B;EAC/B,IAAI,KAAK,2BAA2B,GAAG;GACrC,KAAK,cAAc;GACnB,KAAK,kBAAkB,KAAK,aAAa;;;CAI7C,cAAsB,MAAoB;EACxC,IAAI,CAAC,OAAO,GAAG,YAAY,SAAS,KAAK,EACvC,OAAO,KAAK,KAAK,sBAAsB;EAEzC,KAAK,gBAAgB;EACrB,IAAI,SAAS,KAAK;GAChB,KAAK,cAAc;GACnB,KAAK,yBAAyB;SACzB;GACL,KAAK,cAAc;GACnB,KAAK,kBAAkB,KAAK,aAAa;;;CAI7C,eAAuB,YAAiC;EACtD,IAAI,KAAK,oBAAoB,GAAG;EAEhC,MAAM,UAAU,KAAK,aAAa,MAAM,GAAG,KAAK,gBAAgB;EAChE,MAAM,UAAU,KAAK,MAAM,IAAI,QAAQ,GAAG;EAE1C,IAAI,SAAS,WAAW,KAAK,QAAQ;EACrC,KAAK,eAAe,KAAK,aAAa,MAAM,KAAK,gBAAgB;EACjE,KAAK,kBAAkB;;CAGzB,KAAa,SAAwB;EACnC,KAAK,SAAS;EACd,MAAM,IAAI,kCACR,6DACA,IACD;;;AAIL,SAAS,iBAAiB,MAAuB;CAC/C,OAAO,SAAS,OAAO,SAAS,OAAQ,SAAS,QAAQ,SAAS;;;;AClLpE,MAAM,oCAAoC;AA6D1C,gBAAuB,wBACrB,QACA,SACqC;CACrC,MAAM,QAAQ,uBAAuB,QAAQ;CAE7C,IAAI;EACF,WAAW,MAAM,SAAS,QAAQ;GAChC,IAAI,CAAC,MAAM,QAAQ,MAAM,SAAS,UAAU;GAE5C,MAAM,QAAQ,oBAAoB,MAAM,KAAK;GAC7C,IAAI,MAAM,SAAS,QAAQ;GAC3B,IAAI,MAAM,SAAS,SACjB,MAAM,IAAI,kCAAkC,MAAM,MAAM,SAAS,IAAI;GAGvE,IAAI,CAAC,MAAM,aAAa;IACtB,gBAAgB,OAAO,MAAM;IAC7B,MAAM,qBAAqB,OAAO,mBAAmB;IACrD,MAAM,qBAAqB,OAAO,uBAAuB;;GAG3D,KAAK,MAAM,cAAc,eAAe,OAAO,MAAM,EACnD,MAAM;GAER,IAAI,MAAM,gBAAgB;;EAG5B,IAAI,CAAC,MAAM,aACT,MAAM,IAAI,kCACR,yCACA,IACD;EAGH,IAAI,CAAC,MAAM,gBAIT,MAAM,IAAI,kCACR,sDACA,IACD;UAEI,OAAO;EACd,IAAI,CAAC,MAAM,aAAa;GAItB,MAAM,qBAAqB,OAAO,mBAAmB;GACrD,MAAM,qBAAqB,OAAO,uBAAuB;;EAE3D,MAAM,iBAAiB,OAAO,MAAM;EACpC,MAAM,kBAAkB,OAAO,MAAM;;;AAIzC,SAAgB,8BACd,QAC4B;CAC5B,IAAI,WAAW;CACf,MAAM,QAAQ,WACX;EAAE,GAAG;EAAO,iBAAiB;EAAY;CAC5C,MAAM,aAAa;EACjB,GAAG;EACH,QAAQ,EAAE;EACV,aAAa;EACb,QAAQ;EACR,OAAO;EACR;CACD,MAAM,SAAqC,CACzC,KAAK;EAAE,MAAM;EAAoB,UAAU;EAAY,CAAC,EACxD,KAAK;EAAE,MAAM;EAAwB,UAAU;EAAY,CAAC,CAC7D;CAED,KAAK,MAAM,CAAC,aAAa,SAAS,OAAO,OAAO,SAAS,EAAE;EACzD,OAAO,KACL,KAAK;GACH,MAAM;GACN,cAAc;GACd,MAAM;IAAE,GAAG,gBAAgB,KAAK;IAAE,QAAQ;IAAe;GAC1D,CAAC,CACH;EAED,IAAI,KAAK,SAAS,WAAW;GAC3B,MAAM,WAAW,KAAK,SAAS,MAAM,SAAS,KAAK,SAAS,cAAc;GAC1E,IAAI,UAAU,SAAS,eACrB,OAAO,KACL,KAAK;IACH,MAAM;IACN,SAAS,KAAK;IACd,cAAc;IACd,eAAe;IACf,MAAM;KAAE,MAAM;KAAe,MAAM;KAAI,aAAa,EAAE;KAAE;IACzD,CAAC,EACF,KAAK;IACH,MAAM;IACN,SAAS,KAAK;IACd,cAAc;IACd,eAAe;IACf,OAAO,SAAS;IACjB,CAAC,EACF,KAAK;IACH,MAAM;IACN,SAAS,KAAK;IACd,cAAc;IACd,eAAe;IACf,MAAM,SAAS;IAChB,CAAC,EACF,KAAK;IACH,MAAM;IACN,SAAS,KAAK;IACd,cAAc;IACd,eAAe;IACf,MAAM;IACP,CAAC,CACH;SAEE,IAAI,KAAK,SAAS,aAAa;GACpC,MAAM,OAAO,KAAK,UAAU,IAAI;GAChC,IAAI,MAAM;IACR,MAAM,OAAO;KAAE,MAAM;KAAgB;KAAM;IAC3C,OAAO,KACL,KAAK;KACH,MAAM;KACN,SAAS,KAAK;KACd,cAAc;KACd,eAAe;KACf,MAAM;MAAE,MAAM;MAAgB,MAAM;MAAI;KACzC,CAAC,EACF,KAAK;KACH,MAAM;KACN,SAAS,KAAK;KACd,cAAc;KACd,eAAe;KACf,OAAO;KACR,CAAC,EACF,KAAK;KACH,MAAM;KACN,SAAS,KAAK;KACd,cAAc;KACd,eAAe;KACf;KACD,CAAC,EACF,KAAK;KACH,MAAM;KACN,SAAS,KAAK;KACd,cAAc;KACd,eAAe;KACf;KACD,CAAC,CACH;;SAEE,IAAI,KAAK,SAAS,iBAAiB;GACxC,IAAI,KAAK,WACP,OAAO,KACL,KAAK;IACH,MAAM;IACN,SAAS,KAAK;IACd,cAAc;IACd,OAAO,KAAK;IACb,CAAC,CACH;GAEH,OAAO,KACL,KAAK;IACH,MAAM;IACN,SAAS,KAAK;IACd,cAAc;IACd,MAAM,KAAK;IACX,WAAW,KAAK;IACjB,CAAC,CACH;SACI,IAAI,KAAK,SAAS,oBAAoB;GAC3C,IAAI,KAAK,OACP,OAAO,KACL,KAAK;IACH,MAAM;IACN,SAAS,KAAK;IACd,cAAc;IACd,OAAO,KAAK;IACb,CAAC,CACH;GAEH,OAAO,KACL,KAAK;IACH,MAAM;IACN,SAAS,KAAK;IACd,cAAc;IACd,MAAM,KAAK;IACX,OAAO,KAAK;IACb,CAAC,CACH;;EAGH,OAAO,KACL,KAAK;GACH,MAAM;GACN,cAAc;GACd;GACD,CAAC,CACH;;CAGH,OAAO,KACL,KAAK;EACH,MACE,OAAO,WAAW,eAAe,wBAC/B,OAAO,WAAW,WAAW,oBAC7B;EACJ,UAAU;GAAE,GAAG;GAAQ,QAAQ,EAAE;GAAE;EACnC,eAAe,OAAO;EACvB,CAAC,CACH;CACD,OAAO;;AAGT,SAAS,uBACP,SACkB;CAClB,OAAO;EACL,wBAAQ,IAAI,KAAK;EACjB,gBAAgB;EAChB,oBAAoB;EACpB;EACA,cAAc;EACd,WAAW,KAAK,MAAM,KAAK,KAAK,GAAG,IAAK;EACxC,aAAa;EACb,gBAAgB;EAChB,OAAO,QAAQ;EACf,iBAAiB;EACjB,YAAY;EACZ,YAAY,QAAQ,KAAK,KAAK,CAAC,SAAS,GAAG;EAC3C,UAAU;EACV,YAAY;EACZ,OAAO;GAAE,cAAc;GAAG,eAAe;GAAG;EAC7C;;AAGH,SAAS,gBACP,OACA,OACM;CACN,IAAI,MAAM,SAAS,iBAAiB;EAClC,MAAM,aAAa,aAAa,MAAM,QAAQ,GAAG;EACjD,MAAM,QAAQ,MAAM,QAAQ;EAC5B,MAAM,QAAQ,EAAE,GAAG,MAAM,QAAQ,OAAO;EACxC,MAAM,eAAe,MAAM,QAAQ,iBAAiB;;CAEtD,MAAM,cAAc;;AAGtB,UAAU,eACR,OACA,OACgC;CAChC,QAAQ,MAAM,MAAd;EACE,KAAK;GACH,MAAM,QAAQ,WAAW,MAAM,OAAO,MAAM,QAAQ,MAAM;GAC1D,MAAM,eAAe,MAAM,QAAQ,iBAAiB,MAAM;GAC1D;EAEF,KAAK;GACH,KAAK,MAAM,cAAc,kBAAkB,OAAO,MAAM,EACtD,MAAM;GAER;EAEF,KAAK;GACH,KAAK,MAAM,cAAc,sBAAsB,OAAO,MAAM,EAC1D,MAAM;GAER;EAEF,KAAK;GACH,KAAK,MAAM,cAAc,kBAAkB,OAAO,MAAM,MAAM,EAC5D,MAAM;GAER;EAEF,KAAK;GACH,IAAI,MAAM,MAAM,gBAAgB,KAAA,GAC9B,MAAM,aAAa,MAAM,MAAM;GAEjC,IAAI,MAAM,OAAO,MAAM,QAAQ,WAAW,MAAM,OAAO,MAAM,MAAM;GACnE,MAAM,eAAe,MAAM,iBAAiB,MAAM;GAClD;EAEF,KAAK;GACH,KAAK,MAAM,cAAc,eAAe,MAAM,EAAE,MAAM;GACtD,KAAK,MAAM,cAAc,iBAAiB,MAAM,EAAE,MAAM;GACxD,MAAM,iBAAiB;GACvB,MAAM,oBAAoB,MAAM;GAChC;;;AAKN,UAAU,kBACR,OACA,OACgC;CAChC,MAAM,QAAQ,MAAM;CACpB,IAAI,MAAM,QAAQ,YAAY;EAC5B,IAAI,MAAM,SAAS,QACjB,MAAM,kBAAkB,MAAM;EAEhC,IAAI,MAAM,SAAS,cAAc,MAAM,SAAS,mBAC9C,MAAM,qBAAqB;EAE7B;;CAGF,IAAI,MAAM,SAAS,QAAQ;EACzB,MAAM,OAA8B;GAClC,IAAI,OAAO,MAAM,WAAW,MAAM,IAAI,CAAC,GAAG,MAAM;GAChD,MAAM;GACN,MAAM;GACN,QAAQ;GACR,SAAS,CAAC;IAAE,MAAM;IAAe,MAAM,MAAM;IAAM,aAAa,EAAE;IAAE,CAAC;GACtE;EACD,MAAM,SAAS,UAAU,OAAO,KAAK;EACrC,MAAM,OAAO,IAAI,MAAM,OAAO;GAC5B,GAAG;GACH,MAAM;GACN,MAAM,MAAM;GACZ,MAAM;GACP,CAAC;EACF,MAAM,cAAc,MAAM;EAC1B,MAAM,YAAY,OAAO;GACvB,MAAM;GACN,cAAc,OAAO;GACrB,MAAM,gBAAgB,KAAK;GAC5B,CAAC;EACF,MAAM,YAAY,OAAO;GACvB,MAAM;GACN,SAAS,KAAK;GACd,cAAc,OAAO;GACrB,eAAe;GACf,MAAM;IAAE,MAAM;IAAe,MAAM;IAAI,aAAa,EAAE;IAAE;GACzD,CAAC;EACF,IAAI,MAAM,MACR,MAAM,YAAY,OAAO;GACvB,MAAM;GACN,SAAS,KAAK;GACd,cAAc,OAAO;GACrB,eAAe;GACf,OAAO,MAAM;GACd,CAAC;EAEJ;;CAGF,IAAI,MAAM,SAAS,YAAY;EAC7B,MAAM,OAAgC;GACpC,IAAI,wBACF,MAAM,MAAM,WAAW,MAAM,IAAI,CAAC,GAAG,MAAM,QAC5C;GACD,MAAM;GACN,QAAQ;GACR,SAAS,EAAE;GACX,mBAAmB;GACpB;EACD,MAAM,SAAS,UAAU,OAAO,KAAK;EACrC,MAAM,YAAkC;GACtC,GAAG;GACH,MAAM;GACN,WAAW;GACX,gBAAgB;GAChB,MAAM;GACN,MAAM;GACP;EACD,MAAM,OAAO,IAAI,MAAM,OAAO,UAAU;EACxC,MAAM,YAAY,OAAO;GACvB,MAAM;GACN,cAAc,OAAO;GACrB,MAAM,gBAAgB,KAAK;GAC5B,CAAC;EACF,IAAI,MAAM,UACR,KAAK,MAAM,cAAc,oBACvB,OACA,WACA,MAAM,SACP,EACC,MAAM;EAGV;;CAGF,IAAI,MAAM,SAAS,YAAY;EAC7B,MAAM,aAAa,sBAAsB,MAAM,QAAQ,UAAU,MAAM,KAAK;EAC5E,MAAM,SAAS;GACb,SAAS,MAAM;GACf,MAAM,WAAW;GACjB,QAAQ;GACR,GAAI,WAAW,YAAY,EAAE,WAAW,WAAW,WAAW,GAAG,EAAE;GACpE;EACD,IAAI,WAAW,SAAS,UAAU;GAChC,MAAM,OAAqC;IACzC,GAAG;IACH,IAAI,OAAO,MAAM,WAAW,MAAM,IAAI,CAAC,GAAG,MAAM;IAChD,MAAM;IACN,OAAO;IACR;GACD,MAAM,SAAS,UAAU,OAAO,KAAK;GACrC,MAAM,UAAU,IAAI,8BAA8B;GAClD,MAAM,OAAO,IAAI,MAAM,OAAO;IAC5B,GAAG;IACH,MAAM;IACN;IACA,MAAM;IACP,CAAC;GACF,MAAM,YAAY,OAAO;IACvB,MAAM;IACN,cAAc,OAAO;IACrB,MAAM,gBAAgB,KAAK;IAC5B,CAAC;GACF,IAAI,OAAO,KAAK,MAAM,MAAM,CAAC,SAAS,GAAG;IACvC,MAAM,QAAQ,QAAQ,OAAO,KAAK,UAAU,MAAM,MAAM,CAAC;IACzD,IAAI,OACF,MAAM,YAAY,OAAO;KACvB,MAAM;KACN,SAAS,KAAK;KACd,cAAc,OAAO;KACrB;KACD,CAAC;;GAGN;;EAGF,MAAM,OAAmC;GACvC,GAAG;GACH,IAAI,MAAM,MAAM,WAAW,MAAM,IAAI,CAAC,GAAG,MAAM;GAC/C,MAAM;GACN,WAAW;GACZ;EACD,MAAM,SAAS,UAAU,OAAO,KAAK;EACrC,MAAM,eACJ,OAAO,KAAK,MAAM,MAAM,CAAC,SAAS,IAAI,KAAK,UAAU,MAAM,MAAM,GAAG;EACtE,MAAM,OAAO,IAAI,MAAM,OAAO;GAC5B,GAAG;GACH,MAAM;GACN,MAAM;GACP,CAAC;EACF,MAAM,YAAY,OAAO;GACvB,MAAM;GACN,cAAc,OAAO;GACrB,MAAM,gBAAgB,KAAK;GAC5B,CAAC;EACF,IAAI,cAAc;GAChB,KAAK,YAAY;GACjB,MAAM,YAAY,OAAO;IACvB,MAAM;IACN,SAAS,KAAK;IACd,cAAc,OAAO;IACrB,OAAO;IACR,CAAC;;;;AAKR,UAAU,sBACR,OACA,OACgC;CAChC,IAAI,MAAM,QAAQ,YAAY;EAC5B,IAAI,MAAM,MAAM,SAAS,cACvB,MAAM,kBAAkB,MAAM,MAAM;EAEtC;;CAGF,MAAM,QAAQ,MAAM,OAAO,IAAI,MAAM,MAAM;CAC3C,IAAI,CAAC,OAAO;CAEZ,IAAI,MAAM,MAAM,SAAS,gBAAgB,MAAM,SAAS,WAAW;EACjE,MAAM,QAAQ,MAAM,MAAM;EAC1B,MAAM,OAAO,MAAM,KAAK,UAAU;EAClC,IAAI,MAAM,SAAS,eAAe,KAAK,OAAO,MAAM;EACpD,MAAM,cAAc,MAAM,MAAM;EAChC,MAAM,YAAY,OAAO;GACvB,MAAM;GACN,SAAS,MAAM,KAAK;GACpB,cAAc,MAAM;GACpB,eAAe;GACf,OAAO,MAAM,MAAM;GACpB,CAAC;EACF;;CAGF,IAAI,MAAM,MAAM,SAAS,oBAAoB,MAAM,SAAS,aAAa;EACvE,KAAK,MAAM,cAAc,oBACvB,OACA,OACA,MAAM,MAAM,SACb,EACC,MAAM;EAER;;CAGF,IAAI,MAAM,MAAM,SAAS,qBAAqB,MAAM,SAAS,aAAa;EACxE,MAAM,aAAa,MAAM,MAAM;EAC/B,MAAM,KAAK,oBACT,MAAM,aAAa;EACrB;;CAGF,IACE,MAAM,MAAM,SAAS,sBAClB,MAAM,SAAS,iBAClB;EACA,MAAM,KAAK,aAAa,MAAM,MAAM;EACpC,MAAM,YAAY,OAAO;GACvB,MAAM;GACN,SAAS,MAAM,KAAK;GACpB,cAAc,MAAM;GACpB,OAAO,MAAM,MAAM;GACpB,CAAC;EACF;;CAGF,IAAI,MAAM,MAAM,SAAS,sBAAsB,MAAM,SAAS,eAAe;EAC3E,MAAM,QAAQ,MAAM,QAAQ,OAAO,MAAM,MAAM,aAAa;EAC5D,IAAI,OACF,MAAM,YAAY,OAAO;GACvB,MAAM;GACN,SAAS,MAAM,KAAK;GACpB,cAAc,MAAM;GACpB;GACD,CAAC;;;AAKR,UAAU,oBACR,OACA,OACA,MACgC;CAChC,IAAI,CAAC,MAAM;CACX,IAAI,CAAC,MAAM,gBAAgB;EACzB,MAAM,iBAAiB;EACvB,MAAM,YAAY,OAAO;GACvB,MAAM;GACN,SAAS,MAAM,KAAK;GACpB,cAAc,MAAM;GACpB,eAAe;GACf,MAAM;IAAE,MAAM;IAAgB,MAAM;IAAI;GACzC,CAAC;;CAEJ,MAAM,QAAQ;CACd,MAAM,KAAK,UAAU,CAAC;EAAE,MAAM;EAAgB,MAAM,MAAM;EAAM,CAAC;CACjE,MAAM,YAAY,OAAO;EACvB,MAAM;EACN,SAAS,MAAM,KAAK;EACpB,cAAc,MAAM;EACpB,eAAe;EACf,OAAO;EACR,CAAC;;AAGJ,UAAU,kBACR,OACA,OACgC;CAChC,MAAM,QAAQ,MAAM,OAAO,IAAI,MAAM;CACrC,IAAI,CAAC,SAAS,MAAM,MAAM;CAE1B,IAAI,MAAM,SAAS,WAAW;EAC5B,MAAM,YAAY,OAAO;GACvB,MAAM;GACN,SAAS,MAAM,KAAK;GACpB,cAAc,MAAM;GACpB,eAAe;GACf,MAAM,MAAM;GACb,CAAC;EACF,MAAM,OAAO,MAAM,KAAK,UAAU;EAClC,IAAI,MACF,MAAM,YAAY,OAAO;GACvB,MAAM;GACN,SAAS,MAAM,KAAK;GACpB,cAAc,MAAM;GACpB,eAAe;GACf,MAAM,gBAAgB,KAAK;GAC5B,CAAC;QAEC,IAAI,MAAM,SAAS,aAAa;EACrC,IAAI,MAAM,MAAM;GACd,MAAM,OAAO;IAAE,MAAM;IAAgB,MAAM,MAAM;IAAM;GACvD,MAAM,YAAY,OAAO;IACvB,MAAM;IACN,SAAS,MAAM,KAAK;IACpB,cAAc,MAAM;IACpB,eAAe;IACf,MAAM,MAAM;IACb,CAAC;GACF,MAAM,YAAY,OAAO;IACvB,MAAM;IACN,SAAS,MAAM,KAAK;IACpB,cAAc,MAAM;IACpB,eAAe;IACf;IACD,CAAC;;EAEJ,MAAM,KAAK,oBACT,MAAM,aAAa;QAChB,IAAI,MAAM,SAAS,eAAe;EACvC,MAAM,QAAQ,MAAM,QAAQ,QAAQ;EACpC,MAAM,KAAK,QAAQ;EACnB,MAAM,YAAY,OAAO;GACvB,MAAM;GACN,SAAS,MAAM,KAAK;GACpB,cAAc,MAAM;GACpB,MAAM,MAAM,KAAK;GACjB;GACD,CAAC;QAEF,MAAM,YAAY,OAAO;EACvB,MAAM;EACN,SAAS,MAAM,KAAK;EACpB,cAAc,MAAM;EACpB,MAAM,MAAM,KAAK;EACjB,WAAW,MAAM,KAAK;EACvB,CAAC;CAGJ,MAAM,KAAK,SAAS;CACpB,MAAM,OAAO;CACb,MAAM,YAAY,OAAO;EACvB,MAAM;EACN,cAAc,MAAM;EACpB,MAAM,gBAAgB,MAAM,KAAK;EAClC,CAAC;CACF,MAAM,OAAO,OAAO,MAAM;;AAG5B,UAAU,eACR,OACgC;CAChC,KAAK,MAAM,SAAS,CAAC,GAAG,MAAM,OAAO,MAAM,CAAC,CAAC,MAC1C,MAAM,UAAU,OAAO,MACzB,EACC,KAAK,MAAM,cAAc,kBAAkB,OAAO,MAAM,EAAE,MAAM;;AAIpE,UAAU,iBACR,OACgC;CAChC,IAAI,CAAC,MAAM,QAAQ,YAAY;CAC/B,IAAI,MAAM,oBACR,MAAM,IAAI,kCACR,wDACA,IACD;CAEH,MAAM,UAAU,MAAM,eAAe,MAAM;CAC3C,IAAI,CAAC,SACH,MAAM,IAAI,kCACR,iEACA,IACD;CAEH,MAAM,OAA2B;EAC/B,IAAI,OAAO,MAAM,WAAW,MAAM,IAAI;EACtC,MAAM;EACN,mBAAmB,yBAAyB,QAAQ;EACrD;CACD,MAAM,SAAS,UAAU,OAAO,KAAK;CACrC,MAAM,YAAY,OAAO;EACvB,MAAM;EACN,cAAc,OAAO;EACrB;EACD,CAAC;CACF,MAAM,YAAY,OAAO;EACvB,MAAM;EACN,cAAc,OAAO;EACrB;EACD,CAAC;;AAGJ,SAAS,UACP,OACA,MACsB;CACtB,MAAM,cAAc,MAAM;CAC1B,MAAM,mBAAmB;CACzB,OAAO;EAAE;EAAM;EAAa,MAAM;EAAO;;AAG3C,SAAS,qBACP,OACA,MACqB;CACrB,OAAO,YAAY,OAAO;EACxB;EACA,UAAU,oCAAoC;GAC5C,SAAS,MAAM;GACf,WAAW,MAAM;GACjB,IAAI,MAAM;GACV,QAAQ,EAAE;GACV,YAAY;GACZ,QAAQ;GACR,OAAO;GACR,CAAC;EACH,CAAC;;AAGJ,SAAS,oBAAoB,OAA8C;CACzE,MAAM,SAAS,cAAc,MAAM,WAAW;CAC9C,MAAM,WAAW,oCAAoC;EACnD,SAAS,MAAM;EACf,WAAW,MAAM;EACjB,IAAI,MAAM;EACV,QAAQ,EAAE;EACV,YAAY,MAAM,QAAQ,aAAa,KAAK,MAAM;EAClD,QAAQ,OAAO;EACf,kBAAkB,OAAO;EACzB,OAAO,wBAAwB,MAAM,MAAM;EAC3C,cAAc,MAAM;EACrB,CAAC;CACF,OAAO,YAAY,OAAO;EACxB,MACE,OAAO,WAAW,eAChB,wBACA;EACJ;EACA,eAAe,MAAM;EACtB,CAAC;;AAGJ,SAAS,iBACP,OACA,OACqB;CACrB,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;CACtE,OAAO,YAAY,OAAO;EACxB,MAAM;EACN,MAAM;EACN;EACA,OAAO;EACP,OAAO;GACL,MAAM;GACN,MAAM;GACN;GACD;EACF,CAAC;;AAGJ,SAAS,kBACP,OACA,OACqB;CACrB,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;CACtE,OAAO,YAAY,OAAO;EACxB,MAAM;EACN,UAAU,oCAAoC;GAC5C,SAAS,MAAM;GACf,WAAW,MAAM;GACjB,IAAI,MAAM;GACV,QAAQ,EAAE;GACV,YAAY,MAAM;GAClB,QAAQ;GACR,OAAO,wBAAwB,MAAM,MAAM;GAC3C,cAAc,MAAM;GACpB,OAAO;IACL,MAAM;IACN;IACD;GACF,CAAC;EACF,eAAe,MAAM;EACtB,CAAC;;AAGJ,SAAS,YACP,OACA,OACqB;CACrB,OAAO;EACL,GAAG;EACH,iBAAiB,MAAM;EACxB;;AAGH,SAAS,cAAc,YAGrB;CACA,IAAI,eAAe,cACjB,OAAO;EAAE,QAAQ;EAAc,kBAAkB;EAAqB;CAExE,IAAI,eAAe,WACjB,OAAO;EAAE,QAAQ;EAAc,kBAAkB;EAAkB;CAErE,OAAO,EAAE,QAAQ,aAAa;;AAGhC,SAAS,WACP,SACA,UACgB;CAChB,OAAO;EACL,GAAG;EACH,GAAG;EACH,cAAc,SAAS,gBAAgB,QAAQ;EAC/C,eAAe,SAAS,iBAAiB,QAAQ;EAClD;;AAGH,SAAS,oBAAoB,MAAwC;CACnE,IAAI;EACF,MAAM,SAAS,KAAK,MAAM,KAAK;EAC/B,IACE,OAAO,WAAW,YACf,WAAW,QACX,UAAU,UACV,OAAO,OAAO,SAAS,UAE1B,OAAO;SAEH;CAGR,MAAM,IAAI,kCACR,kDACA,IACD;;;;AC93BH,MAAMC,WAAS,oBAAoB,6BAA6B;AAEhE,MAAa,gCAAgC,EAC3C,yBACD;AAED,eAAsB,2BACpB,GACA,SAQmB;CACnB,IAAI;EACF,MAAM,cAAc,6BAClB;GAAE,GAAG,QAAQ;GAAS,OAAO,QAAQ;GAAa,EAClD;GACE,OAAO,QAAQ;GACf,aAAa,QAAQ;GACrB,cAAc,iCACZ,EAAE,IAAI,OAAO,aAAa,EAC1B,QAAQ,YACT;GACF,CACF;EACD,MAAM,UAA8C;EAEpD,UAAUA,UAAQ,gCAAgC;GAChD,SAAS,YAAY;GACrB,aAAa,QAAQ;GACrB,aAAa,QAAQ;GACrB,WAAW,EAAE,IAAI,OAAO,aAAa,IAAI;GAC1C,CAAC;EAEF,MAAM,mBACJ,MAAM,8BAA8B,wBAClC,GACA,YAAY,iBACZ;GACE,aAAa,YAAY,aAAA,IAA+B,KAAA;GACxD,qBAAqB;GACrB,kBAAkB;GAClB,eAAe;GACf,eAAe;GACf,gBAAgB,QAAQ;GACxB,WAAW,QAAQ;GACnB,WAAW,QAAQ;GACpB,CACF;EAEH,IAAI,CAAC,iBAAiB,IACpB,OAAO;EAIT,KADoB,iBAAiB,QAAQ,IAAI,eAAe,IAAI,IACpD,SAAS,oBAAoB,EAAE;GAC7C,IAAI,CAAC,YAAY,gBAAgB,QAC/B,MAAM,IAAI,kCACR,wEACA,IACD;GAEH,OAAO,+BAA+B,GAAG,kBAAkB,QAAQ;;EAGrE,MAAM,OAAO,MAAM,iBAAiB,MAAM;EAC1C,IAAI,CAAC,oBAAoB,KAAK,EAC5B,MAAM,IAAI,kCACR,kDACA,IACD;EAEH,MAAM,SAAS,8BAA8B,MAAM,QAAQ;EAC3D,UAAUA,UAAQ,gCAAgC,OAAO;EAEzD,IAAI,CAAC,YAAY,gBAAgB,QAC/B,OAAO,EAAE,KAAK,OAAO;EAEvB,OAAO,UAAU,GAAG,OAAO,WAAW;GACpC,KAAK,MAAM,SAAS,8BAA8B,OAAO,EACvD,MAAM,OAAO,SAAS;IACpB,OAAO,MAAM;IACb,MAAM,KAAK,UAAU,MAAM;IAC5B,CAAC;IAEJ;UACK,OAAO;EACd,IAAI,iBAAiB,mCACnB,OAAO,EAAE,KACP,EACE,OAAO;GACL,SAAS,MAAM;GACf,MAAM;GACP,EACF,EACD,MAAM,OACP;EAEH,MAAM;;;AAIV,SAAS,+BACP,GACA,UACA,SACU;CACV,OAAO,UAAU,GAAG,OAAO,WAAW;EACpC,WAAW,MAAM,SAAS,wBACxB,OAAO,SAAS,EAChB,QACD,EAAE;GACD,UAAUA,UAAQ,sCAAsC,MAAM;GAC9D,MAAM,OAAO,SAAS;IACpB,OAAO,MAAM;IACb,MAAM,KAAK,UAAU,MAAM;IAC5B,CAAC;;GAEJ;;AAGJ,SAAS,oBAAoB,OAA4C;CACvE,OACE,OAAO,UAAU,YACd,UAAU,QACV,UAAU,SACV,MAAM,SAAS,aACf,aAAa,SACb,MAAM,QAAQ,MAAM,QAAQ;;;;AC9GnC,MAAMC,WAAS,oBAAoB,6BAA6B;AAEhE,MAAa,uCAAuC,EAClD,uBACD;AAED,eAAsB,mCACpB,GACA,SAKmB;CACnB,MAAM,EAAE,SAAS,aAAa;CAE9B,UAAUA,UAAQ,8BAA8B;EAC9C;EACA;EACD,CAAC;CAEF,MAAM,iBACJ,MAAM,qCAAqC,sBAAsB,SAAS;CAC5E,IAAI,CAAC,gBACH,OAAO,EAAE,KACP,EACE,OAAO;EACL,SAAS,aAAa,SAAS;EAC/B,MAAM;EACP,EACF,EACD,IACD;CAGH,MAAM,gBAAgB,6BACpB,gBACA,QAAQ,MACT;CACD,MAAM,4BAA4B,0CAChC,SACA,eACD;CACD,IAAI,2BACF,SAAO,MACL,oCAAoC,0BAA0B,KAAK,MAAM,0BAA0B,GAAG,4CACvG;CAGH,IAAIC,2BAAyB,GAAG,QAAQ,OAAO,cAAc,EAAE;EAC7D,4BAA4B,SAAS,KAAK;EAC1C,OAAO,MAAM,2BAA2B,GAAG;GACzC;GACA,aAAa,QAAQ,eAAe,QAAQ;GAC5C,aAAa,GAAG,SAAS,GAAG,QAAQ;GACrC,CAAC;;CAGJ,IAAI,kBAAkB,oBACpB,OAAO,EAAE,KACP,EACE,OAAO;EACL,SAAS,aAAa,SAAS;EAC/B,MAAM;EACP,EACF,EACD,IACD;CAGH,4BAA4B,SAAS,MAAM;CAgB3C,IAR2B,mCACzB,UANA,eAAe,SAAS,UACtBC,WAAgB,CAAC,KAAK,MAAM,UAAU,MAAM,OAAO,QAAQ,MAAM,GACjE,KAAA,IAKK,aAAa,OAAO,mBAC3B;EACE,uBAAuB;EACvB,QAAQ;EACT,CAEmB,EACpB,+BAA+B,QAAQ;CAGzC,UAAUF,UAAQ,yCAAyC;EACzD,mBAAmB,QAAQ;EAC3B;EACD,CAAC;CAEF,MAAM,cAAc,eAAe,SAAS,QAAQ;CAEpD,IAAI,eAAe,SAAS,SAAS;EACnC,MAAM,mBAAmB,MAAM,sBAC7B,SACA,EAAE,IAAI,IAAI,SACV,eAAe,SACf,EAAE,QAAQ,EAAE,IAAI,IAAI,QAAQ,CAC7B;EACD,MAAM,cAAc,qCAClB,SACA,UACA,aACA,eAAe,gBAChB;EAED,IAAI,QAAQ,UAAU,kBAAkB,iBAAiB,EACvD,OAAO,wBAAwB,GAAG,kBAAkB;GAClD,gBAAgB;GAChB;GACA;GACD,CAAC;EAGJ,MAAM,eAAe;EACrB,YAAY,wBAAwB,aAAa,MAAM,CAAC;EACxD,OAAO,EAAE,KAAK,aAAa;;CAG7B,MAAM,mBAAmB,MAAM,yBAC7B,gBACA,SACA,EAAE,IAAI,IAAI,SACV,EAAE,QAAQ,EAAE,IAAI,IAAI,QAAQ,CAC7B;CAED,IAAI,CAAC,iBAAiB,IACpB,MAAM,IAAI,UACR,oBAAoB,SAAS,aAC7B,iBACD;CAGH,MAAM,cAAc,qCAClB,SACA,UACA,aACA,eAAe,gBAChB;CAED,IAAI,QAAQ,QACV,OAAO,wBACL,GACA,mBAAmB,kBAAkB,EAAE,IAAI,IAAI,OAAO,EACtD;EACE,gBAAgB;EAChB;EACA;EACD,CACF;CAMH,YAAY,yBAAwB,MAHR,iBACzB,OAAO,CACP,MAAM,EACwC,MAAM,CAAC;CAExD,OAAO,4BAA4B,iBAAiB;;AAGtD,MAAMC,8BACJ,GACA,SACA,kBACY;CACZ,IAAI,kBAAkB,eAAe,kBAAkB,qBACrD,OAAO;CAGT,IAAI,iBAAiB,EAAE,IAAI,OAAO,aAAa,CAAC,EAC9C,OAAO,EAAE,QAAQ,WAAW,MAAM,IAAI,QAAQ,WAAW,QAAQ;CAGnE,OAAO;;AAGT,MAAM,wCACJ,SACA,UACA,aACA,oBACmC;CACnC,MAAM,kBACJ,eAAe,UAAU,EAAE,iBAAiB,MAAM,IAAI;CAExD,OAAO,iCAAiC;EACtC,UAAU;EACV,OAAO,QAAQ;EACf,SAAS,aAAa;EACtB;EACA,cAAc;EACd,WAAW,mBAAmB;EAC/B,CAAC;;AAGJ,MAAM,0BAA0B,OAC9B,GACA,kBACA,YAKsB;CACtB,MAAM,WAAW,iBAAiB,OAAO,gBAAgB;CACzD,MAAM,cAAc,MAAM,SAAS,MAAM;CACzC,IAAI,YAAY,MAAM;EACpB,MAAM,SAAS,UAAU;EACzB,MAAM,IAAI,UACR,qBAAqB,QAAQ,SAAS,aACtC,IAAI,SAAS,IAAI,EAAE,QAAQ,KAAK,CAAC,CAClC;;CAGH,MAAM,aAAa,YAAY;CAC/B,IAAI,WAAW,QAAQ,WAAW,SAAS,UAAU;EACnD,MAAM,QAAQ,kCAAkC,WAAW,MAAM;GAC/D,gBAAgB;GAChB,UAAU,QAAQ;GACnB,CAAC;EACF,IAAI,OAAO,SAAS,SAAS;GAC3B,MAAM,aAAa;GACnB,MAAM,aAAa,WAAW,eAAe;GAC7C,MAAM,SAAS,UAAU;GACzB,OAAO,EAAE,KACP,EACE,OAAO;IACL,SAAS,WAAW;IACpB,GAAG,WAAW;IACf,EACF,EACD,YACA,WAAW,WAAW,KAAA,EACvB;;;CAIL,OAAO,UAAU,GAAG,OAAO,WAAW;EACpC,IAAI,QAAqB,EAAE;EAE3B,MAAM,aAAa,OAAO,UAA6B;GACrD,UAAUD,UAAQ,2BAA2B,MAAM;GACnD,IAAI,gBAAgB;GACpB,IAAI,QAAoC;GAExC,IAAI,MAAM,QAAQ,MAAM,SAAS,UAAU;IACzC,QAAQ,kCAAkC,MAAM,MAAM;KACpD,gBAAgB,QAAQ;KACxB,UAAU,QAAQ;KACnB,CAAC;IACF,IAAI,SAAS,QAAQ,gBACnB,gBAAgB;KACd,GAAG;KACH,MAAM,KAAK,UAAU,MAAM;KAC3B,OAAO,MAAM;KACd;;GAIL,IAAI,OAAO;IACT,MAAM,YAAY,6BAA6B,MAAM;IACrD,IAAI,WACF,QAAQ;;GAIZ,MAAM,OAAO,SAAS;IACpB,MAAM,cAAc,QAAQ;IAC5B,OAAO,cAAc;IACtB,CAAC;;EAGJ,IAAI;GACF,MAAM,WAAW,WAAW;GAE5B,WAAW,MAAM,SAAS,GACvB,OAAO,sBAAsB,UAC/B,EACC,MAAM,WAAW,MAAM;YAEjB;GACR,MAAM,SAAS,UAAU;GACzB,QAAQ,YAAY,MAAM;;GAE5B;;AAGJ,MAAM,qCACJ,MACA,YAI+B;CAC/B,IAAI;EACF,MAAM,SAAS,KAAK,MAAM,KAAK;EAC/B,IAAI,QAAQ,gBACV,wBAAwB,OAAO;EAEjC,OAAO;UACA,OAAO;EACd,SAAO,MAAM,wCAAwC;GACnD,UAAU,QAAQ;GAClB;GACA;GACD,CAAC;EACF,OAAO;;;AAIX,MAAM,gCACJ,UACuB;CACvB,IACE,MAAM,SAAS,wBACZ,MAAM,SAAS,qBACf,MAAM,SAAS,uBAElB,OAAO,wBAAwB,MAAM,SAAS,MAAM;CAGtD,OAAO;;AAGT,MAAM,sBACJ,UACA,WAEA,0BAA0B,+BAA+B,UAAU,OAAO,EAAE,EAC1E,QACD,CAAC;;;ACrXJ,MAAa,0BAA0B,IAAI,MAAM;AAEjD,wBAAwB,KAAK,KAAK,OAAO,MAAM;CAC7C,IAAI;EACF,MAAM,WAAW,EAAE,IAAI,MAAM,WAAW,IAAI;EAE5C,OAAO,MAAM,mCAAmC,GAAG;GAAE,SAAA,MAD/B,EAAE,IAAI,MAAwB;GACU;GAAU,CAAC;UAClE,OAAO;EACd,OAAO,MAAM,aAAa,GAAG,MAAM;;EAErC;;;ACQF,MAAa,+BAAgD,EAC3D,6BAAa,IAAI,KAAK,EACvB;AAED,MAAa,gBACX,MACA,OACA,YACW;CACX,IAAI,CAAC,MAAM,OAAO;CAClB,MAAM,SAAS,KAAK,MAAM,KAAK;CAC/B,QAAQ,OAAR;EACE,KAAK,8BACH,OAAO,sBACL,QACA,QACD;EAEH,KAAK,6BACH,OAAO,qBACL,QACA,QACD;EAEH,SACE,OAAO,aAAa,QAAQ,QAAQ;;;AAK1C,MAAM,yBACJ,QACA,YACW;CACX,IAAI,CAAC,OAAO,KAAK,IAAI;EACnB,IAAI,eAAe;EACnB,OAAO,aAAa,SAAS,IAC3B,gBAAgB,KAAK,QAAQ,CAAC,SAAS,GAAG,CAAC,MAAM,EAAE;EAErD,OAAO,KAAK,KAAK,MAAM,OAAO,aAAa,GAAG,aAAa,MAAM,GAAG,GAAG;;CAGzE,MAAM,cAAc,OAAO;CAC3B,QAAQ,YAAY,IAAI,aAAa,OAAO,KAAK,GAAG;CACpD,OAAO,KAAK,UAAU,OAAO;;AAG/B,MAAM,wBACJ,QACA,YACW;CACX,MAAM,cAAc,OAAO;CAC3B,MAAM,aAAa,QAAQ,YAAY,IAAI,YAAY;CACvD,IAAI,YACF,OAAO,KAAK,KAAK;CAEnB,OAAO,KAAK,UAAU,OAAO;;AAG/B,MAAM,gBACJ,QACA,YACW;CACX,MAAM,cAAc,OAAO;CAC3B,IAAI,gBAAgB,KAAA,GAAW;EAC7B,MAAM,SAAS,QAAQ,YAAY,IAAI,YAAY;EACnD,IAAI,QACF,OAAO,UAAU;;CAGrB,OAAO,KAAK,UAAU,OAAO;;;;AC5C/B,MAAMG,WAAS,oBAAoB,oBAAoB;AAEvD,MAAa,+BAA+B;CACzBC;CACjB;CACgCC;CAChC;CACD;AAED,MAAa,kBAAkB,OAAO,MAAe;CACnD,MAAM,UAAU,MAAM,EAAE,IAAI,MAAwB;CACpD,MAAM,iBAAiB,QAAQ;CAC/B,QAAQ,QAAQ,6BAA6B,mBAAmB,QAAQ,MAAM;CAC9E,IAAI,QAAQ,UAAU,gBACpB,QAAQ,MACN,2BAA2B,eAAe,MAAM,QAAQ,QACzD;CAGH,MAAM,qBAAqB,MAAM,oCAC/B,QAAQ,OACR,qCAAqC,sBACtC;CACD,IAAI,oBAAoB;EACtB,QAAQ,QAAQ,mBAAmB;EACnC,OAAO,MAAM,mCAAmC,GAAG;GACjD;GACA,UAAU,mBAAmB;GAC7B,aAAa;GACd,CAAC;;CAGJ,UAAUF,UAAQ,8BAA8B,QAAQ;CAExD,MAAM,iBAAiB,gCAAgC,EAAE;CACzD,IAAI,gBACF,UAAUA,UAAQ,oCAAoC,eAAe;CAGvE,MAAM,oBAAoB,8BAA8B,EAAE;CAC1D,MAAM,YAAY,oBAAoB,QAAQ,kBAAkB,GAAG,KAAA;CACnE,MAAM,YAAY,6BAChB,EAAE,UAAU,QAAQ,OAAO,EAC3B,UACD;CACD,SAAO,MAAM,yBAAyB,UAAU;CAEhD,MAAM,oBAAoB,aAAa,QAAQ,UAAU;CACzD,SAAO,MAAM,yBAAyB,kBAAkB;CACxD,MAAM,gBAAgB,6BAA6B,kBACjD,QAAQ,MACT;CACD,QAAQ,QAAQ,eAAe,MAAM,QAAQ;CAC7C,MAAM,4BAA4B,kCAChC,SACA,eAAe,cAAc,UAAU,iBACxC;CACD,IAAI,2BACF,SAAO,MACL,oCAAoC,0BAA0B,KAAK,MAAM,0BAA0B,GAAG,2CACvG;CAEH,MAAM,qBAAqB,8BAA8B,cAAc;CAQvE,IAN4B,yBAC1B,GACA,QAAQ,OACR,eACA,mBAEqB,EAAE;EACvB,4BAA4B,SAAS,KAAK;EAC1C,OAAO,MAAM,2BAA2B,GAAG;GACzC;GACA,aAAa;GACb,aAAa,QAAQ;GACrB;GACA;GACA,WAAW;GACZ,CAAC;;CAGJ,IAAI,CAAC,oBACH,OAAO,EAAE,KACP,EACE,OAAO;EACL,SACE;EACF,MAAM;EACP,EACF,EACD,IACD;CAGH,4BAA4B,SAAS,MAAM;CAE3C,MAAM,cAAc,gCAAgC;EAClD,UAAU;EACV;EACA,OAAO,QAAQ;EAChB,CAAC;CAEF,MAAM,iCAAiC,+BAA+B,QAAQ;CAC9E,IAAI,iCAAiC,GACnC,SAAO,MACL,WAAW,+BAA+B,oEAC3C;CAGH,MAAM,6BAA6B,2BAA2B,QAAQ;CACtE,IAAI,6BAA6B,GAC/B,SAAO,MACL,cAAc,2BAA2B,iFAC1C;CAGH,uBAAuB,QAAQ;CAC/B,mCAAmC,QAAQ;CAE3C,IAAI,CAAC,6BAA6B,gCAAgC,EAChE,oBAAoB,QAAQ;CAG9B,MAAM,sBAAsB,6BAC1B,SACA,eAAe,aAAa,OAAO,QAAQ,sBAC5C;CACD,IAAI,sBAAsB,GACxB,SAAO,KACL,WAAW,oBAAoB,kEAChC;CAIH,MAAM,kBAAkB,eAAe,aAAa,OAAO;CAS3D,IAR2B,mCACzB,SACA,iBACA;EACE,uBAAuB;EACvB,QAAQ;EACT,CAEmB,EACpB,+BAA+B,QAAQ;CAGzC,UAAUA,UAAQ,iCAAiC,QAAQ;CAE3D,MAAM,EAAE,QAAQ,WAAW,sBACzB,2BAA2B,QAAQ;CACrC,MAAM,YAAY,iBAAiB,UAAU;CAE7C,MAAM,WAAW,MAAM,6BAA6B,gBAAgB,SAAS;EAC3E;EACA;EACA;EACA;EACA,WAAW;EACX,QAAQ,EAAE,IAAI,IAAI;EAClB,WAAW;EACZ,CAAC;CAEF,IAAI,qBAAqB,QAAQ,IAAI,gBAAgB,SAAS,EAAE;EAC9D,SAAO,MAAM,qCAAqC;EAClD,OAAO,UAAU,GAAG,OAAO,WAAW;GACpC,MAAM,YAAY,uBAAuB;GACzC,IAAI,QAAqB,EAAE;GAC3B,MAAM,WAAW,SAAS,OAAO,gBAAgB;GAEjD,IAAI;IACF,WAAW,MAAM,SAAS,GACvB,OAAO,sBAAsB,UAC/B,EAAE;KACD,UAAUA,UAAQ,2BAA2B,MAAM;KACnD,MAAM,cAAc,0BAA0B,MAAM;KACpD,IACE,aAAa,SAAS,wBACnB,aAAa,SAAS,qBACtB,aAAa,SAAS,uBAEzB,QAAQ;MACN,GAAG,wBAAwB,YAAY,SAAS,MAAM;MACtD,gBAAgB,uBACd,YAAY,eAAe,eAC5B;MACF;KAGH,MAAM,gBAAgB,aACnB,MAA4B,QAAQ,IACpC,MAA6B,OAC9B,UACD;KAED,MAAM,OAAO,SAAS;MACpB,IAAK,MAA0B;MAC/B,OAAQ,MAA6B;MACrC,MAAM;MACP,CAAC;;aAEI;IACR,MAAM,SAAS,UAAU;IACzB,YAAY,MAAM;;IAEpB;;CAGJ,cAAcA,UAAQ,uCAAuC;EAC3D,OAAO;EACP,YAAY;EACb,CAAC;CACF,MAAM,SAAS;CACf,YAAY;EACV,GAAG,wBAAwB,OAAO,MAAM;EACxC,gBAAgB,uBACd,OAAO,eAAe,eACvB;EACF,CAAC;CACF,OAAO,EAAE,KAAK,OAAO;;AAGvB,MAAM,wBAAwB,YAC5B,QAAQ,QAAQ,OAAO;AAEzB,MAAM,4BACJ,GACA,SACA,eACA,uBACY;CACZ,IAAI,iBAAiB,EAAE,IAAI,OAAO,aAAa,CAAC,EAC9C,OAAO,EAAE,QAAQ,WAAW,MAAM,IAAI,QAAQ,WAAW,QAAQ;CAGnE,IAAI,oBACF,OAAO;CAGT,MAAM,qBAAqB,eAAe,uBAAuB,EAAE;CACnE,OACE,mBAAmB,SAAS,eAAe,IACxC,mBAAmB,SAAS,oBAAoB;;AAIvD,MAAM,6BACJ,UAC+B;CAC/B,MAAM,OAAQ,MAA4B;CAC1C,IAAI,CAAC,QAAQ,SAAS,UACpB,OAAO;CAGT,IAAI;EACF,OAAO,KAAK,MAAM,KAAK;SACjB;EACN,OAAO;;;AAIX,MAAM,uBAAuB,YAAoC;CAC/D,IAAI,CAAC,MAAM,QAAQ,QAAQ,MAAM,IAAI,QAAQ,MAAM,WAAW,GAAG;CAEjE,QAAQ,QAAQ,QAAQ,MAAM,QAAQ,MAAM;EAC1C,OAAO,EAAE,SAAS;GAClB;;AAGJ,MAAM,iCAAiC,IAAI,IAAI,CAAC,mBAAmB,CAAC;AACpE,MAAM,sCAAsC,IAAI,IAAI,CAAC,YAAY,CAAC;AAElE,MAAa,0BAA0B,YAAoC;CACzE,IAAI,CAAC,MAAM,QAAQ,QAAQ,MAAM,IAAI,QAAQ,MAAM,WAAW,GAAG;CAEjE,MAAM,UAAyB,EAAE;CACjC,QAAQ,QAAQ,QAAQ,MAAM,QAAQ,MAAM;EAC1C,MAAM,OAAO,EAAE;EACf,MAAM,OAAO,UAAU,KAAK,OAAO,EAAE,SAAS,WAAW,EAAE,OAAO,KAAA;EAClE,MAAM,yBACJ,SAAS,eACN,SAAS,KAAA,KACT,oCAAoC,IAAI,KAAK;EAClD,IAAI,+BAA+B,IAAI,KAAK,IAAI,wBAAwB;GACtE,QAAQ,KAAK,yBAAyB,GAAG,KAAK,GAAG,SAAS,KAAK;GAC/D,OAAO;;EAET,OAAO;GACP;CACF,IAAI,QAAQ,SAAS,GACnB,SAAO,MAAM,8BAA8B,QAAQ;;AAIvD,MAAa,sCACX,YACS;CACT,+BAA+B,QAAQ,MAAM;CAE7C,IAAI,CAAC,MAAM,QAAQ,QAAQ,MAAM,EAAE;CAEnC,KAAK,MAAM,QAAQ,QAAQ,OAAO;EAChC,IAAI,CAAC,QAAQ,OAAO,SAAS,UAAU;EACvC,+BAAgC,KAAiC,MAAM;;;AAI3E,MAAM,kCAAkC,UAAyB;CAC/D,IAAI,CAAC,MAAM,QAAQ,MAAM,EAAE;CAE3B,KAAK,MAAM,QAAQ,OAAO;EACxB,IAAI,CAAC,QAAQ,OAAO,SAAS,UAAU;EAEvC,MAAM,gBAAgB;EACtB,IACE,cAAc,SAAS,eACpB,cAAc,gBAAgB,MAC9B,OAAO,cAAc,SAAS,UAEjC,cAAc,cAAc,cAAc;;;AAKhD,MAAM,iCAAiC,MACrC,iBAAiB,GAAG,aAAa,IAAI,iBAAiB,GAAG,eAAe;AAE1E,MAAM,4BAA4B,IAAI,IAAI;CACxC;CACA;CACA;CACA;CACD,CAAC;AAEF,MAAM,mCAAmC,MAAsC;CAC7E,MAAM,YAAY,iBAAiB,GAAG,oBAAoB;CAC1D,IAAI,CAAC,aAAa,CAAC,0BAA0B,IAAI,UAAU,EACzD,OAAO;CAGT,MAAM,WAAW,iBAAiB,GAAG,YAAY;CACjD,MAAM,gBAAgB,8BAA8B,EAAE;CACtD,MAAM,iBAAiB,iBAAiB,GAAG,2BAA2B;CACtE,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC,gBAClC,OAAO;CAGT,MAAM,UAAU,YAAY,kBAAkB,iBAAiB;CAE/D,OAAO;EACL,UAAU;EACV,YAAY;EACZ,YAAY,YAAY,iBAAiB;EAC1C;;AAGH,MAAM,oBAAoB,GAAY,SAAqC;CAEzE,OADc,EAAE,IAAI,OAAO,KAAK,EAAE,MAAM,IACxB,KAAA;;;;ACpZlB,MAAa,kBAAkB,IAAI,MAAM;AAEzC,gBAAgB,KAAK,KAAK,OAAO,MAAM;CACrC,IAAI;EACF,OAAO,MAAM,gBAAgB,EAAE;UACxB,OAAO;EACd,OAAO,MAAM,aAAa,GAAG,MAAM;;EAErC;;;ACLF,MAAa,kBAAkB,IAAI,MAAM;AAEzC,MAAM,UAAU,IAAI,IAAsB;CAAC;CAAO;CAAQ;CAAQ,CAAC;AACnE,MAAM,2BAA2B;AAEjC,SAAS,YAAY,OAA6C;CAChE,OAAO,QAAQ,IAAI,MAA0B,GACxC,QACD;;AAGN,SAAS,iBAAiB,OAA2B,UAA0B;CAC7E,MAAM,SAAS,OAAO,SAAS,SAAS,IAAI,GAAG;CAC/C,OAAO,OAAO,SAAS,OAAO,IAAI,SAAS,IAAI,SAAS;;AAG1D,gBAAgB,IAAI,KAAK,OAAO,MAAM;CAEpC,MAAM,UAAU,MAAM,qBADP,YAAY,EAAE,IAAI,MAAM,SAAS,CACC,CAAC;CAClD,OAAO,EAAE,KAAK,QAAQ;EACtB;AAEF,gBAAgB,IAAI,UAAU,OAAO,MAAM;CAEzC,MAAM,UAAU,MAAM,0BADP,YAAY,EAAE,IAAI,MAAM,SAAS,CACM,CAAC;CACvD,OAAO,EAAE,KAAK,QAAQ;EACtB;AAEF,gBAAgB,IAAI,WAAW,OAAO,MAAM;CAC1C,MAAM,SAAS,YAAY,EAAE,IAAI,MAAM,SAAS,CAAC;CAMjD,MAAM,aAAa,MAAM,wBAAwB;EAAE,MALtC,iBAAiB,EAAE,IAAI,MAAM,OAAO,EAAE,EAKI;EAAE,UAJxC,iBACf,EAAE,IAAI,MAAM,YAAY,EACxB,yBAE+D;EAAE;EAAQ,CAAC;CAC5E,OAAO,EAAE,KAAK,WAAW;EACzB;;;AC1CF,MAAa,aAAa,IAAI,MAAM;AAEpC,WAAW,IAAI,KAAK,OAAO,MAAM;CAC/B,IAAI;EACF,MAAM,QAAQ,MAAM,iBAAiB;EACrC,OAAO,EAAE,KAAK,MAAM;UACb,OAAO;EACd,QAAQ,MAAM,iCAAiC,MAAM;EACrD,OAAO,EAAE,KAAK,EAAE,OAAO,iCAAiC,EAAE,IAAI;;EAEhE;;;ACaF,MAAa,SAAS,IAAI,MAAM;AAEhC,OAAO,IAAI,kBAAkB;AAC7B,OAAO,IAAI,QAAQ,CAAC;AACpB,OAAO,IAAI,MAAM,CAAC;AAClB,OAAO,IACL,KACA,qBAAqB;CACnB,2BAA2B;EAAC;EAAK;EAAiB;EAAiB;CACnE,iBAAiB,SAAS,KAAK,WAAW,UAAU;CACrD,CAAC,CACH;AACD,OAAO,IACL,YACA,qBAAqB;CACnB,YAAY;CACZ,2BAA2B,EAAE;CAC7B,oBAAoB;CACrB,CAAC,CACH;AACD,OAAO,IAAI,4BAA4B;AAEvC,OAAO,IAAI,MAAM,MAAM,EAAE,KAAK,iBAAiB,CAAC;AAChD,OAAO,IAAI,kBAAkB,MAAM;CACjC,MAAM,qBAAqB,IAAI,IAAI,uBAAuB,OAAO,KAAK,IAAI;CAC1E,OAAO,EAAE,KAAK,aAAa,oBAAoB,OAAO,CAAC;EACvD;AACF,OAAO,IAAI,mBAAmB,MAAM,EAAE,SAAS,iBAAiB,IAAI,CAAC;AAErE,OAAO,MAAM,qBAAqB,iBAAiB;AACnD,OAAO,MAAM,iBAAiB,aAAa;AAC3C,OAAO,MAAM,WAAW,YAAY;AACpC,OAAO,MAAM,eAAe,gBAAgB;AAC5C,OAAO,MAAM,UAAU,WAAW;AAClC,OAAO,MAAM,gBAAgB,gBAAgB;AAC7C,OAAO,MAAM,cAAc,gBAAgB;AAC3C,OAAO,MAAM,iBAAiB,kBAAkB;AAChD,OAAO,MAAM,WAAW,YAAY;AAGpC,OAAO,MAAM,wBAAwB,iBAAiB;AACtD,OAAO,MAAM,cAAc,YAAY;AACvC,OAAO,MAAM,kBAAkB,gBAAgB;AAC/C,OAAO,MAAM,iBAAiB,gBAAgB;AAC9C,OAAO,MAAM,oBAAoB,kBAAkB;AACnD,OAAO,MAAM,cAAc,YAAY;AAGvC,OAAO,MAAM,gBAAgB,cAAc;AAG3C,OAAO,MAAM,0BAA0B,sBAAsB;AAC7D,OAAO,MAAM,wBAAwB,oBAAoB;AACzD,OAAO,MAAM,2BAA2B,wBAAwB;AAChE,OAAO,MAAM,8BAA8B,0BAA0B;AACrE,OAAO,MAAM,wBAAwB,oBAAoB;AAEzD,OAAO,MAAM,qBAAqB,oBAAoB;AACtD,OAAO,MAAM,wBAAwB,wBAAwB;AAC7D,OAAO,MAAM,2BAA2B,0BAA0B;AAClE,OAAO,MAAM,qBAAqB,oBAAoB"}
|