@mcp-use/agent 2.0.0-beta.3 → 2.0.0-beta.5

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.
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/browser-agent.ts","../src/agents/mcp_agent.ts","../src/adapters/native_adapter.ts","../src/adapters/base.ts","../src/llm/toolResultParts.ts","../src/llm/messageFormat.ts","../src/llm/sse.ts","../src/llm/usage.ts","../src/llm/providers/anthropic.ts","../src/llm/schemaUtils.ts","../src/llm/providers/google.ts","../src/llm/ndjson.ts","../src/llm/providers/ollama/utils.ts","../src/llm/providers/ollama/index.ts","../src/llm/providers/openai-chat-completions.ts","../src/llm/providers/index.ts","../src/llm/providers/openai-shared.ts","../src/llm/providers/openai-responses.ts","../src/llm/providers/openai-responses-driver.ts","../src/llm/driver.ts","../src/llm/toolLoop.ts","../src/llm/native_runner.ts","../src/llm/provider_config.ts","../src/version.ts","../src/agents/normalize_run_options.ts","../src/agents/remote.ts","../src/llm/chat.ts"],"sourcesContent":["/**\n * Browser agent entry — native MCPAgent (LangChain-free).\n */\n\nexport {\n MCPAgent,\n convertMessagesToProvider,\n providerConfigFromOptions,\n type MCPAgentOptions,\n type McpConnectionLike,\n type McpServersInput,\n type RunOptions,\n type ProviderName,\n type ProviderConfig,\n type ProviderMessage,\n type LlmStreamEvent,\n} from \"./agents/mcp_agent.js\";\nexport { completeChat, completeChat as chat } from \"./llm/chat.js\";\nexport { DEFAULT_OLLAMA_BASE_URL } from \"./llm/providers/ollama/utils.js\";\nexport { RemoteAgent } from \"./agents/remote.js\";\nexport { BaseAdapter, NativeAdapter } from \"./adapters/index.js\";\n","import type { MCPClient } from \"@mcp-use/client\";\nimport type { BaseConnector } from \"@mcp-use/client\";\nimport { logger } from \"@mcp-use/client\";\nimport type { ZodSchema } from \"zod\";\nimport { NativeAdapter } from \"../adapters/native_adapter.js\";\nimport { createLlmDriver, type LlmDriver } from \"../llm/driver.js\";\nimport {\n streamNativeAgent,\n streamNativeAgentSteps,\n runNativeAgent,\n} from \"../llm/native_runner.js\";\nimport {\n parseLLMStringToProviderConfig,\n providerConfigFromOptions,\n type NativeLLMConfig,\n} from \"../llm/provider_config.js\";\nimport type {\n LlmStreamEvent,\n ProviderConfig,\n ProviderMessage,\n ProviderName,\n TokenUsage,\n} from \"../llm/types.js\";\nimport { getPackageVersion } from \"../version.js\";\nimport type {\n MCPAgentOptions,\n McpConnectionLike,\n McpServersInput,\n} from \"./agent_options.js\";\nimport { normalizeRunOptions } from \"./normalize_run_options.js\";\nimport type { RunOptions } from \"./run_options.js\";\nimport { RemoteAgent } from \"./remote.js\";\nimport type { MCPServerConfig } from \"./types.js\";\n\nexport type {\n ProviderName,\n ProviderConfig,\n ProviderMessage,\n LlmStreamEvent,\n TokenUsage,\n};\nexport type {\n MCPAgentOptions,\n McpConnectionLike,\n McpServersInput,\n} from \"./agent_options.js\";\nexport type { RunOptions } from \"./run_options.js\";\n\nexport interface AgentStep {\n action: { tool: string; toolInput: Record<string, unknown>; log: string };\n observation: string;\n}\n\ntype ResolvedRunOptions = {\n prompt?: string;\n maxSteps?: number;\n manageConnector?: boolean;\n messages?: ProviderMessage[];\n schema?: ZodSchema<unknown>;\n signal?: AbortSignal;\n};\n\n/**\n * Cross-platform MCP agent: Inspector → MCPAgent → loop → fetch + @mcp-use/client.\n */\nexport class MCPAgent {\n public static getPackageVersion(): string {\n return getPackageVersion();\n }\n\n private driver?: LlmDriver;\n private client?: MCPClient;\n private connectors: BaseConnector[] = [];\n private clientOwnedByAgent = false;\n private nativeAdapter: NativeAdapter;\n private providerTools: import(\"../llm/types.js\").ProviderTool[] = [];\n private callTool?: (\n name: string,\n args: Record<string, unknown>\n ) => Promise<unknown>;\n private maxSteps: number;\n private autoInitialize: boolean;\n private systemPrompt: string;\n private disallowedTools: string[];\n private exposeResourcesAsTools: boolean;\n private exposePromptsAsTools: boolean;\n private initialized = false;\n private isRemote = false;\n private remoteAgent: RemoteAgent | null = null;\n private isSimplifiedMode = false;\n private llmString?: string;\n private llmConfig?: NativeLLMConfig;\n private mcpServersConfig?: Record<string, MCPServerConfig>;\n private explicitProviderConfig?: ProviderConfig;\n private conversationMessages: ProviderMessage[] = [];\n private memoryEnabled: boolean;\n private boundConnections?: McpConnectionLike[];\n\n constructor(options: MCPAgentOptions) {\n if (options.agentId) {\n this.isRemote = true;\n this.remoteAgent = new RemoteAgent({\n agentId: options.agentId,\n apiKey: options.apiKey,\n baseUrl: options.baseUrl,\n });\n this.maxSteps = options.maxSteps ?? 10;\n this.autoInitialize = options.autoInitialize ?? false;\n this.nativeAdapter = new NativeAdapter();\n this.systemPrompt =\n options.systemPrompt ??\n \"You are a helpful assistant with access to MCP tools.\";\n this.disallowedTools = [];\n this.exposeResourcesAsTools = true;\n this.exposePromptsAsTools = true;\n this.memoryEnabled = options.memoryEnabled ?? true;\n return;\n }\n\n this.maxSteps = options.maxSteps ?? 10;\n this.autoInitialize = options.autoInitialize ?? false;\n this.systemPrompt =\n options.systemPrompt ??\n \"You are a helpful assistant with access to MCP tools.\";\n this.disallowedTools = options.disallowedTools ?? [];\n this.exposeResourcesAsTools = options.exposeResourcesAsTools ?? true;\n this.exposePromptsAsTools = options.exposePromptsAsTools ?? true;\n this.memoryEnabled = options.memoryEnabled ?? true;\n this.nativeAdapter = new NativeAdapter(this.disallowedTools);\n this.llmConfig = options.llmConfig;\n this.resolveMcpServers(options.mcpServers);\n\n if (typeof options.llm === \"string\") {\n this.isSimplifiedMode = true;\n this.llmString = options.llm;\n if (\n !this.hasLiveConnections() &&\n (!this.mcpServersConfig ||\n Object.keys(this.mcpServersConfig).length === 0) &&\n !options.client &&\n !options.connectors?.length\n ) {\n throw new Error(\n \"Simplified mode requires mcpServers, or an existing client/connectors.\"\n );\n }\n } else {\n this.explicitProviderConfig = options.llm;\n this.client = options.client;\n this.connectors = options.connectors ?? [];\n if (\n !this.hasLiveConnections() &&\n !this.client &&\n this.connectors.length === 0 &&\n (!this.mcpServersConfig ||\n Object.keys(this.mcpServersConfig).length === 0)\n ) {\n throw new Error(\n \"Explicit mode requires mcpServers, client, or connectors.\"\n );\n }\n }\n\n if (options.client) this.client = options.client;\n if (options.connectors?.length) this.connectors = options.connectors;\n\n if (this.hasLiveConnections() && this.explicitProviderConfig) {\n this.bindConnections(this.boundConnections!, this.explicitProviderConfig);\n } else if (this.hasLiveConnections() && this.llmString) {\n this.driver = createLlmDriver(\n parseLLMStringToProviderConfig(this.llmString, this.llmConfig)\n );\n this.bindConnections(\n this.boundConnections!,\n parseLLMStringToProviderConfig(this.llmString, this.llmConfig)\n );\n }\n }\n\n private resolveMcpServers(mcpServers?: McpServersInput): void {\n if (!mcpServers) return;\n if (Array.isArray(mcpServers)) {\n this.boundConnections = mcpServers;\n return;\n }\n this.mcpServersConfig = mcpServers;\n }\n\n private hasLiveConnections(): boolean {\n return (this.boundConnections?.length ?? 0) > 0;\n }\n\n async initialize(): Promise<void> {\n if (this.isRemote) {\n this.initialized = true;\n return;\n }\n if (this.initialized) return;\n\n if (this.isSimplifiedMode) {\n if (!this.client && this.mcpServersConfig) {\n const { MCPClient } = await import(\"@mcp-use/client\");\n this.client = new MCPClient({ mcpServers: this.mcpServersConfig });\n this.clientOwnedByAgent = true;\n }\n if (this.llmString) {\n this.driver = createLlmDriver(\n parseLLMStringToProviderConfig(this.llmString, this.llmConfig)\n );\n }\n } else if (this.explicitProviderConfig) {\n this.driver = createLlmDriver(this.explicitProviderConfig);\n }\n\n if (!this.driver) {\n throw new Error(\"LLM driver not configured.\");\n }\n\n if (!this.hasLiveConnections()) {\n await this.loadTools();\n }\n this.initialized = true;\n logger.debug(\"MCPAgent initialized\");\n }\n\n private async loadTools(): Promise<void> {\n const entries: import(\"../adapters/native_adapter.js\").NativeToolEntry[] =\n [];\n\n if (this.client) {\n if (\n !this.client.activeSessions ||\n Object.keys(this.client.activeSessions).length === 0\n ) {\n await this.client.createAllSessions();\n }\n const sessions = this.client.getAllActiveSessions();\n const connectors = Object.values(sessions).map((s) => s.connector);\n entries.push(\n ...(await this.nativeAdapter.createToolsFromConnectors(connectors))\n );\n if (this.exposeResourcesAsTools) {\n entries.push(\n ...(await this.nativeAdapter.createResourcesFromConnectors(\n connectors\n ))\n );\n }\n if (this.exposePromptsAsTools) {\n entries.push(\n ...(await this.nativeAdapter.createPromptsFromConnectors(connectors))\n );\n }\n } else {\n for (const connector of this.connectors) {\n if (!connector.isClientConnected) await connector.connect();\n }\n entries.push(\n ...(await this.nativeAdapter.createToolsFromConnectors(this.connectors))\n );\n if (this.exposeResourcesAsTools) {\n entries.push(\n ...(await this.nativeAdapter.createResourcesFromConnectors(\n this.connectors\n ))\n );\n }\n if (this.exposePromptsAsTools) {\n entries.push(\n ...(await this.nativeAdapter.createPromptsFromConnectors(\n this.connectors\n ))\n );\n }\n }\n\n this.providerTools = this.nativeAdapter.toProviderTools(entries);\n this.callTool = this.nativeAdapter.createCallTool();\n }\n\n private bindConnections(\n connections: McpConnectionLike[],\n providerConfig: ProviderConfig\n ): void {\n const disallowed = new Set(this.disallowedTools);\n const usedNames = new Set<string>();\n const routes = new Map<\n string,\n { connection: McpConnectionLike; mcpName: string }\n >();\n\n const reserveName = (name: string): string => {\n if (!usedNames.has(name)) {\n usedNames.add(name);\n return name;\n }\n let i = 2;\n while (usedNames.has(`${name}_${i}`)) i++;\n const fallback = `${name}_${i}`;\n usedNames.add(fallback);\n return fallback;\n };\n\n const providerTools: import(\"../llm/types.js\").ProviderTool[] = [];\n\n for (const connection of connections) {\n for (const tool of connection.tools ?? []) {\n if (disallowed.has(tool.name)) continue;\n const name = reserveName(tool.name);\n routes.set(name, { connection, mcpName: tool.name });\n providerTools.push({\n name,\n description: tool.description,\n inputSchema: tool.inputSchema ?? {\n type: \"object\",\n properties: {},\n },\n });\n }\n }\n\n this.providerTools = providerTools;\n this.callTool = async (name, args) => {\n const route = routes.get(name);\n if (!route) {\n throw new Error(`Unknown tool: ${name}`);\n }\n return route.connection.callTool(route.mcpName, args);\n };\n this.driver = createLlmDriver(providerConfig);\n this.initialized = true;\n }\n\n private buildMessages(options: ResolvedRunOptions): ProviderMessage[] {\n const messages: ProviderMessage[] = [\n { role: \"system\", content: this.systemPrompt },\n ];\n if (this.memoryEnabled && this.conversationMessages.length > 0) {\n messages.push(...this.conversationMessages);\n }\n if (options.messages?.length) {\n messages.push(...options.messages);\n }\n if (options.prompt) {\n messages.push({ role: \"user\", content: options.prompt });\n }\n return messages;\n }\n\n getConversationHistory(): ProviderMessage[] {\n return [...this.conversationMessages];\n }\n\n clearConversationHistory(): void {\n this.conversationMessages = [];\n }\n\n setSystemMessage(message: string): void {\n this.systemPrompt = message;\n }\n\n private async ensureReady(manageConnector = true): Promise<void> {\n if (manageConnector && !this.initialized) {\n if (this.autoInitialize) {\n await this.initialize();\n } else {\n throw new Error(\"MCPAgent not initialized. Call initialize() first.\");\n }\n }\n if (!this.driver || !this.callTool) {\n throw new Error(\"MCPAgent driver or tools not ready.\");\n }\n }\n\n private nativeRunParams(options: ResolvedRunOptions) {\n return {\n messages: this.buildMessages(options),\n tools: this.providerTools,\n callTool: this.callTool!,\n maxSteps: options.maxSteps ?? this.maxSteps,\n signal: options.signal,\n };\n }\n\n public async run(options: RunOptions): Promise<string>;\n public async run<T>(options: RunOptions<T>): Promise<T>;\n /** @deprecated Use run({ prompt, maxSteps, ... }) */\n public async run(\n query: string,\n maxSteps?: number,\n manageConnector?: boolean,\n externalHistory?: unknown,\n outputSchema?: undefined,\n signal?: AbortSignal\n ): Promise<string>;\n /** @deprecated Use run({ prompt, schema, maxSteps, ... }) */\n public async run<T>(\n query: string,\n maxSteps?: number,\n manageConnector?: boolean,\n externalHistory?: unknown,\n outputSchema?: ZodSchema<T>,\n signal?: AbortSignal\n ): Promise<T>;\n public async run<T>(\n queryOrOptions: string | RunOptions<T>,\n maxSteps?: number,\n manageConnector?: boolean,\n externalHistory?: unknown,\n outputSchema?: ZodSchema<T>,\n signal?: AbortSignal\n ): Promise<string | T> {\n const options = normalizeRunOptions(\n queryOrOptions,\n maxSteps,\n manageConnector,\n externalHistory,\n outputSchema,\n signal\n );\n if (options.schema) {\n throw new Error(\n \"Structured output requires @mcp-use/agent/langchain or pass a JSON schema via prompt.\"\n );\n }\n if (this.isRemote && this.remoteAgent) {\n return this.remoteAgent.run(\n options.prompt ?? \"\",\n options.maxSteps,\n options.manageConnector\n ) as Promise<string | T>;\n }\n await this.ensureReady(options.manageConnector ?? true);\n const result = await runNativeAgent(\n this.driver!,\n this.nativeRunParams(options)\n );\n if (this.memoryEnabled && options.prompt) {\n this.conversationMessages.push({\n role: \"user\",\n content: options.prompt,\n });\n this.conversationMessages.push({\n role: \"assistant\",\n content: result,\n });\n }\n return result;\n }\n\n public stream(options: RunOptions): AsyncGenerator<AgentStep, string, void>;\n public stream<T>(options: RunOptions<T>): AsyncGenerator<AgentStep, T, void>;\n /** @deprecated Use stream({ prompt, maxSteps, ... }) */\n public stream<T = string>(\n query: string,\n maxSteps?: number,\n manageConnector?: boolean,\n externalHistory?: unknown,\n outputSchema?: ZodSchema<T>,\n signal?: AbortSignal\n ): AsyncGenerator<AgentStep, string | T, void>;\n public async *stream<T = string>(\n queryOrOptions: string | RunOptions<T>,\n maxSteps?: number,\n manageConnector?: boolean,\n externalHistory?: unknown,\n outputSchema?: ZodSchema<T>,\n signal?: AbortSignal\n ): AsyncGenerator<AgentStep, string | T, void> {\n const options = normalizeRunOptions(\n queryOrOptions,\n maxSteps,\n manageConnector,\n externalHistory,\n outputSchema,\n signal\n );\n if (this.isRemote && this.remoteAgent) {\n const result = await this.remoteAgent.run(\n options.prompt ?? \"\",\n options.maxSteps,\n options.manageConnector\n );\n return result as string | T;\n }\n await this.ensureReady(options.manageConnector ?? true);\n const result = yield* streamNativeAgentSteps(\n this.driver!,\n this.nativeRunParams(options)\n );\n if (this.memoryEnabled && options.prompt) {\n this.conversationMessages.push({\n role: \"user\",\n content: options.prompt,\n });\n this.conversationMessages.push({\n role: \"assistant\",\n content: result,\n });\n }\n return result;\n }\n\n public streamEvents(\n options: RunOptions\n ): AsyncGenerator<LlmStreamEvent, void, unknown>;\n public streamEvents<T>(\n options: RunOptions<T>\n ): AsyncGenerator<LlmStreamEvent, void, unknown>;\n /** @deprecated Use streamEvents({ prompt, maxSteps, ... }) */\n public streamEvents<T = string>(\n query: string,\n maxSteps?: number,\n manageConnector?: boolean,\n externalHistory?: unknown,\n outputSchema?: ZodSchema<T>,\n signal?: AbortSignal\n ): AsyncGenerator<LlmStreamEvent, void, unknown>;\n public async *streamEvents<T = string>(\n queryOrOptions: string | RunOptions<T>,\n maxSteps?: number,\n manageConnector?: boolean,\n externalHistory?: unknown,\n outputSchema?: ZodSchema<T>,\n signal?: AbortSignal\n ): AsyncGenerator<LlmStreamEvent, void, unknown> {\n const options = normalizeRunOptions(\n queryOrOptions,\n maxSteps,\n manageConnector,\n externalHistory,\n outputSchema,\n signal\n );\n if (this.isRemote && this.remoteAgent) {\n throw new Error(\"streamEvents is not supported for remote agents.\");\n }\n await this.ensureReady(options.manageConnector ?? true);\n yield* streamNativeAgent(this.driver!, this.nativeRunParams(options));\n }\n\n /** Single-shot completion without tools (sampling, props generation). */\n async chat(options: {\n messages: ProviderMessage[];\n signal?: AbortSignal;\n }): Promise<string> {\n await this.ensureReady();\n const result = await this.driver!.complete({\n messages: options.messages,\n tools: [],\n signal: options.signal,\n });\n return result.text;\n }\n\n async close(): Promise<void> {\n if (this.clientOwnedByAgent && this.client) {\n await this.client.closeAllSessions?.();\n }\n this.initialized = false;\n }\n}\n\n/** Inspector / config UI LLM shape. */\nexport interface LLMConfig {\n provider: ProviderName;\n model: string;\n apiKey: string;\n temperature?: number;\n baseUrl?: string;\n}\n\nexport { providerConfigFromOptions, parseLLMStringToProviderConfig };\nexport { LlmRequestError } from \"../llm/providers/openai-chat-completions.js\";\nexport { convertMessagesToProvider } from \"../llm/messageFormat.js\";\n","import type {\n Prompt,\n Resource,\n Tool as MCPTool,\n} from \"@modelcontextprotocol/client\";\nimport type { BaseConnector } from \"@mcp-use/client\";\nimport { logger } from \"@mcp-use/client\";\nimport type { ProviderTool } from \"../llm/types.js\";\nimport { BaseAdapter } from \"./base.js\";\n\nfunction sanitizeToolName(name: string): string {\n return name\n .replace(/[^A-Za-z0-9_]+/g, \"_\")\n .toLowerCase()\n .replace(/^_+|_+$/g, \"\");\n}\n\nexport interface NativeToolEntry extends ProviderTool {\n /** Internal dispatch key (may differ from MCP name after dedup). */\n dispatchKey: string;\n}\n\nexport type NativeCallToolFn = (\n name: string,\n args: Record<string, unknown>\n) => Promise<unknown>;\n\ninterface ToolHandler {\n connector: BaseConnector;\n kind: \"tool\" | \"resource\" | \"prompt\";\n mcpName: string;\n resourceUri?: string;\n}\n\n/**\n * Converts MCP tools/resources/prompts to provider-neutral ProviderTool[]\n * and a matching callTool dispatcher backed by @mcp-use/client connectors.\n */\nexport class NativeAdapter extends BaseAdapter<NativeToolEntry> {\n private usedToolNames = new Set<string>();\n private handlers = new Map<string, ToolHandler>();\n\n constructor(disallowedTools: string[] = []) {\n super(disallowedTools);\n }\n\n public override async createToolsFromConnectors(\n connectors: BaseConnector[]\n ): Promise<NativeToolEntry[]> {\n this.usedToolNames.clear();\n this.handlers.clear();\n return super.createToolsFromConnectors(connectors);\n }\n\n createCallTool(): NativeCallToolFn {\n const handlers = this.handlers;\n return async (name, args) => {\n const handler = handlers.get(name);\n if (!handler) {\n throw new Error(`Unknown tool: ${name}`);\n }\n try {\n if (handler.kind === \"tool\") {\n return await handler.connector.callTool(handler.mcpName, args);\n }\n if (handler.kind === \"resource\") {\n const uri = handler.resourceUri ?? handler.mcpName;\n return await handler.connector.readResource(uri);\n }\n return await handler.connector.getPrompt(handler.mcpName, args);\n } catch (err) {\n logger.error(`Error executing native MCP tool ${name}: ${err}`);\n throw err;\n }\n };\n }\n\n toProviderTools(entries: NativeToolEntry[]): ProviderTool[] {\n return entries.map(({ name, description, inputSchema }) => ({\n name,\n description,\n inputSchema,\n }));\n }\n\n private reserveName(name: string, kind?: \"resource\" | \"prompt\"): string {\n if (!this.usedToolNames.has(name)) {\n this.usedToolNames.add(name);\n return name;\n }\n if (kind) {\n const prefixed = `${kind}_${name}`;\n if (!this.usedToolNames.has(prefixed)) {\n this.usedToolNames.add(prefixed);\n return prefixed;\n }\n let i = 2;\n while (this.usedToolNames.has(`${prefixed}_${i}`)) i++;\n const fallback = `${prefixed}_${i}`;\n this.usedToolNames.add(fallback);\n return fallback;\n }\n let i = 2;\n while (this.usedToolNames.has(`${name}_${i}`)) i++;\n const fallback = `${name}_${i}`;\n this.usedToolNames.add(fallback);\n return fallback;\n }\n\n private register(\n entry: NativeToolEntry,\n handler: ToolHandler\n ): NativeToolEntry {\n this.handlers.set(entry.name, handler);\n return entry;\n }\n\n protected convertTool(\n mcpTool: MCPTool,\n connector: BaseConnector\n ): NativeToolEntry | null {\n if (this.disallowedTools.includes(mcpTool.name)) return null;\n\n const toolName = this.reserveName(mcpTool.name ?? \"tool\");\n const entry: NativeToolEntry = {\n name: toolName,\n dispatchKey: toolName,\n description: mcpTool.description ?? \"\",\n inputSchema: (mcpTool.inputSchema as Record<string, unknown>) ?? {\n type: \"object\",\n properties: {},\n },\n };\n return this.register(entry, {\n connector,\n kind: \"tool\",\n mcpName: mcpTool.name,\n });\n }\n\n protected convertResource(\n mcpResource: Resource,\n connector: BaseConnector\n ): NativeToolEntry | null {\n const resourceBaseName =\n sanitizeToolName(mcpResource.name || mcpResource.uri) || \"resource\";\n const resourceName = this.reserveName(resourceBaseName, \"resource\");\n const entry: NativeToolEntry = {\n name: resourceName,\n dispatchKey: resourceName,\n description:\n mcpResource.description ||\n `Return the content of the resource located at URI ${mcpResource.uri}.`,\n inputSchema: { type: \"object\", properties: {} },\n };\n return this.register(entry, {\n connector,\n kind: \"resource\",\n mcpName: mcpResource.uri,\n resourceUri: mcpResource.uri,\n });\n }\n\n protected convertPrompt(\n mcpPrompt: Prompt,\n connector: BaseConnector\n ): NativeToolEntry | null {\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n if (mcpPrompt.arguments?.length) {\n for (const arg of mcpPrompt.arguments) {\n properties[arg.name] = { type: \"string\", description: arg.description };\n if (arg.required !== false) required.push(arg.name);\n }\n }\n\n const promptBaseName =\n sanitizeToolName(mcpPrompt.name || \"prompt\") || \"prompt\";\n const promptName = this.reserveName(promptBaseName, \"prompt\");\n const entry: NativeToolEntry = {\n name: promptName,\n dispatchKey: promptName,\n description: mcpPrompt.description || \"\",\n inputSchema: {\n type: \"object\",\n properties,\n ...(required.length > 0 ? { required } : {}),\n },\n };\n return this.register(entry, {\n connector,\n kind: \"prompt\",\n mcpName: mcpPrompt.name,\n });\n }\n}\n","import type { MCPClient } from \"@mcp-use/client\";\nimport type { BaseConnector } from \"@mcp-use/client\";\nimport { logger } from \"@mcp-use/client\";\n\n/**\n * Abstract base class for converting MCP tools to other framework formats.\n *\n * This class defines the common interface that all adapter implementations\n * should follow to ensure consistency across different frameworks.\n */\nexport abstract class BaseAdapter<T> {\n /**\n * List of tool names that should not be available.\n */\n protected readonly disallowedTools: string[];\n\n /**\n * Internal cache that maps a connector instance to the list of tools\n * generated for it.\n */\n private readonly connectorToolMap: Map<BaseConnector, T[]> = new Map();\n\n constructor(disallowedTools?: string[]) {\n this.disallowedTools = disallowedTools ?? [];\n }\n\n /**\n * Create tools from an MCPClient instance.\n *\n * This is the recommended way to create tools from an MCPClient, as it handles\n * session creation and connector extraction automatically.\n *\n * @param client The MCPClient to extract tools from.\n * @param disallowedTools Optional list of tool names to exclude.\n * @returns A promise that resolves with a list of converted tools.\n */\n static async createTools<TTool, TAdapter extends BaseAdapter<TTool>>(\n this: new (disallowedTools?: string[]) => TAdapter,\n client: MCPClient,\n disallowedTools?: string[]\n ): Promise<TTool[]> {\n // Create the adapter\n const adapter = new this(disallowedTools);\n\n // Ensure we have active sessions\n if (\n !client.activeSessions ||\n Object.keys(client.activeSessions).length === 0\n ) {\n logger.debug(\"No active sessions found, creating new ones...\");\n await client.createAllSessions();\n }\n\n // Get all active sessions\n const sessions = client.getAllActiveSessions();\n\n // Extract connectors from sessions\n const connectors: BaseConnector[] = Object.values(sessions).map(\n (session) => session.connector\n );\n\n // Create tools from connectors\n return adapter.createToolsFromConnectors(connectors);\n }\n\n /**\n * Dynamically load tools for a specific connector.\n *\n * @param connector The connector to load tools for.\n * @returns The list of tools that were loaded in the target framework's format.\n */\n async loadToolsForConnector(connector: BaseConnector): Promise<T[]> {\n // Return cached tools if we already processed this connector\n if (this.connectorToolMap.has(connector)) {\n const cached = this.connectorToolMap.get(connector)!;\n logger.debug(`Returning ${cached.length} existing tools for connector`);\n return cached;\n }\n\n const connectorTools: T[] = [];\n\n // Make sure the connector is initialized and has tools\n const success = await this.ensureConnectorInitialized(connector);\n if (!success) {\n return [];\n }\n\n // Convert and collect tools\n for (const tool of connector.tools) {\n const converted = this.convertTool(tool, connector);\n if (converted) {\n connectorTools.push(converted);\n }\n }\n\n // Cache the tools for this connector\n this.connectorToolMap.set(connector, connectorTools);\n\n // Log for debugging purposes\n logger.debug(\n `Loaded ${connectorTools.length} new tools for connector: ${connectorTools\n .map((t: any) => t?.name ?? String(t))\n .join(\", \")}`\n );\n\n return connectorTools;\n }\n\n /**\n * Convert an MCP tool to the target framework's tool format.\n *\n * @param mcpTool The MCP tool definition to convert.\n * @param connector The connector that provides this tool.\n * @returns The converted tool, or null / undefined if no tool should be produced.\n */\n protected abstract convertTool(\n mcpTool: Record<string, any>,\n connector: BaseConnector\n ): T | null | undefined;\n\n /**\n * Convert an MCP resource to the target framework's tool format.\n *\n * @param mcpResource The MCP resource definition to convert.\n * @param connector The connector that provides this resource.\n * @returns The converted resource as a tool, or null / undefined if no tool should be produced.\n */\n protected abstract convertResource?(\n mcpResource: Record<string, any>,\n connector: BaseConnector\n ): T | null | undefined;\n\n /**\n * Convert an MCP prompt to the target framework's tool format.\n *\n * @param mcpPrompt The MCP prompt definition to convert.\n * @param connector The connector that provides this prompt.\n * @returns The converted prompt as a tool, or null / undefined if no tool should be produced.\n */\n protected abstract convertPrompt?(\n mcpPrompt: Record<string, any>,\n connector: BaseConnector\n ): T | null | undefined;\n\n /**\n * Create tools from MCP tools in all provided connectors.\n *\n * @param connectors List of MCP connectors to create tools from.\n * @returns A promise that resolves with all converted tools.\n */\n public async createToolsFromConnectors(\n connectors: BaseConnector[]\n ): Promise<T[]> {\n const tools: T[] = [];\n for (const connector of connectors) {\n const connectorTools = await this.loadToolsForConnector(connector);\n tools.push(...connectorTools);\n }\n\n logger.debug(`Available tools: ${tools.length}`);\n return tools;\n }\n\n /**\n * Dynamically load resources for a specific connector.\n *\n * @param connector The connector to load resources for.\n * @returns The list of resources that were loaded in the target framework's format.\n */\n async loadResourcesForConnector(connector: BaseConnector): Promise<T[]> {\n const connectorResources: T[] = [];\n\n // Make sure the connector is initialized\n const success = await this.ensureConnectorInitialized(connector);\n if (!success) {\n return [];\n }\n\n try {\n // Get resources from connector\n const resourcesResult = await connector.listAllResources();\n const resources = resourcesResult?.resources || [];\n\n // Convert and collect resources\n if (this.convertResource) {\n for (const resource of resources) {\n const converted = this.convertResource(resource, connector);\n if (converted) {\n connectorResources.push(converted);\n }\n }\n }\n\n logger.debug(\n `Loaded ${connectorResources.length} new resources for connector: ${connectorResources\n .map((r: any) => r?.name ?? String(r))\n .join(\", \")}`\n );\n } catch (err) {\n logger.warn(`Error loading resources for connector: ${err}`);\n }\n\n return connectorResources;\n }\n\n /**\n * Dynamically load prompts for a specific connector.\n *\n * @param connector The connector to load prompts for.\n * @returns The list of prompts that were loaded in the target framework's format.\n */\n async loadPromptsForConnector(connector: BaseConnector): Promise<T[]> {\n const connectorPrompts: T[] = [];\n\n // Make sure the connector is initialized\n const success = await this.ensureConnectorInitialized(connector);\n if (!success) {\n return [];\n }\n\n try {\n // Get prompts from connector\n const promptsResult = await connector.listPrompts();\n const prompts = promptsResult?.prompts || [];\n\n // Convert and collect prompts\n if (this.convertPrompt) {\n for (const prompt of prompts) {\n const converted = this.convertPrompt(prompt, connector);\n if (converted) {\n connectorPrompts.push(converted);\n }\n }\n }\n\n logger.debug(\n `Loaded ${connectorPrompts.length} new prompts for connector: ${connectorPrompts\n .map((p: any) => p?.name ?? String(p))\n .join(\", \")}`\n );\n } catch (err) {\n logger.warn(`Error loading prompts for connector: ${err}`);\n }\n\n return connectorPrompts;\n }\n\n /**\n * Create resources from MCP resources in all provided connectors.\n *\n * @param connectors List of MCP connectors to create resources from.\n * @returns A promise that resolves with all converted resources.\n */\n public async createResourcesFromConnectors(\n connectors: BaseConnector[]\n ): Promise<T[]> {\n const resources: T[] = [];\n for (const connector of connectors) {\n const connectorResources =\n await this.loadResourcesForConnector(connector);\n resources.push(...connectorResources);\n }\n\n logger.debug(`Available resources: ${resources.length}`);\n return resources;\n }\n\n /**\n * Create prompts from MCP prompts in all provided connectors.\n *\n * @param connectors List of MCP connectors to create prompts from.\n * @returns A promise that resolves with all converted prompts.\n */\n public async createPromptsFromConnectors(\n connectors: BaseConnector[]\n ): Promise<T[]> {\n const prompts: T[] = [];\n for (const connector of connectors) {\n const connectorPrompts = await this.loadPromptsForConnector(connector);\n prompts.push(...connectorPrompts);\n }\n\n logger.debug(`Available prompts: ${prompts.length}`);\n return prompts;\n }\n\n /**\n * Check if a connector is initialized and has tools.\n *\n * @param connector The connector to check.\n * @returns True if the connector is initialized and has tools, false otherwise.\n */\n private checkConnectorInitialized(connector: BaseConnector): boolean {\n return Boolean(connector.tools && connector.tools.length);\n }\n\n /**\n * Ensure a connector is initialized.\n *\n * @param connector The connector to initialize.\n * @returns True if initialization succeeded, false otherwise.\n */\n private async ensureConnectorInitialized(\n connector: BaseConnector\n ): Promise<boolean> {\n if (!this.checkConnectorInitialized(connector)) {\n logger.debug(\"Connector doesn't have tools, initializing it\");\n try {\n await connector.initialize();\n return true;\n } catch (err) {\n logger.error(`Error initializing connector: ${err}`);\n return false;\n }\n }\n return true;\n }\n}\n","import type {\n ContentPart,\n ImageContentPart,\n TextContentPart,\n} from \"./types.js\";\n\n/**\n * Convert an MCP tool result into a provider-neutral `ContentPart[]` (or a\n * collapsed string when every part is text). Image content blocks become\n * `ImageContentPart`s so vision-capable providers can forward the pixels;\n * `JSON.stringify`ing them would silently bury base64 bytes inside a text\n * payload that the model cannot decode.\n */\n\ninterface McpContentText {\n type: \"text\";\n text: string;\n}\ninterface McpContentImage {\n type: \"image\";\n data: string;\n mimeType: string;\n}\ninterface McpContentAudio {\n type: \"audio\";\n data: string;\n mimeType: string;\n}\ninterface McpContentResource {\n type: \"resource\";\n resource: {\n uri?: string;\n mimeType?: string;\n text?: string;\n blob?: string;\n };\n}\ninterface McpContentResourceLink {\n type: \"resource_link\";\n uri?: string;\n name?: string;\n mimeType?: string;\n}\n\ntype McpContentBlock =\n | McpContentText\n | McpContentImage\n | McpContentAudio\n | McpContentResource\n | McpContentResourceLink\n | { type: string; [k: string]: unknown };\n\ninterface McpToolResult {\n content?: McpContentBlock[];\n structuredContent?: unknown;\n isError?: boolean;\n}\n\nfunction makeText(text: string): TextContentPart {\n return { type: \"text\", text };\n}\n\nfunction makeImage(data: string, mimeType: string): ImageContentPart {\n return {\n type: \"image\",\n url: `data:${mimeType};base64,${data}`,\n mimeType,\n data,\n };\n}\n\nfunction isMcpResultShape(value: unknown): value is McpToolResult {\n if (!value || typeof value !== \"object\") return false;\n const v = value as Record<string, unknown>;\n if (Array.isArray(v.content)) return true;\n return \"structuredContent\" in v;\n}\n\n/**\n * Returns true when a tool result carries the MCP `isError: true` flag.\n * Used by both the live tool loop and the replay path so a tool that\n * successfully returns `{ isError: true, content: [...] }` is treated the\n * same as one that threw.\n */\nexport function isToolResultError(result: unknown): boolean {\n return (\n typeof result === \"object\" &&\n result !== null &&\n (result as { isError?: unknown }).isError === true\n );\n}\n\nfunction blockToPart(block: McpContentBlock): ContentPart | null {\n if (!block || typeof block !== \"object\") return null;\n switch (block.type) {\n case \"text\": {\n const text = (block as McpContentText).text;\n return typeof text === \"string\" && text.length > 0\n ? makeText(text)\n : null;\n }\n case \"image\": {\n const b = block as McpContentImage;\n if (typeof b.data !== \"string\" || !b.data) return null;\n const mime =\n typeof b.mimeType === \"string\" && b.mimeType ? b.mimeType : \"image/png\";\n return makeImage(b.data, mime);\n }\n case \"audio\": {\n // Audio is not yet forwarded; emit a marker so the model still sees\n // that audio was returned.\n const b = block as McpContentAudio;\n const mime =\n typeof b.mimeType === \"string\" && b.mimeType ? b.mimeType : \"audio/*\";\n const bytes = typeof b.data === \"string\" ? b.data.length : 0;\n return makeText(`[audio: ${mime}, base64 omitted (${bytes} chars)]`);\n }\n case \"resource\": {\n const r = (block as McpContentResource).resource ?? {};\n if (typeof r.text === \"string\" && r.text.length > 0) {\n return makeText(r.text);\n }\n if (\n typeof r.blob === \"string\" &&\n typeof r.mimeType === \"string\" &&\n r.mimeType.startsWith(\"image/\")\n ) {\n return makeImage(r.blob, r.mimeType);\n }\n const uri = typeof r.uri === \"string\" ? r.uri : \"<unknown>\";\n const mime = typeof r.mimeType === \"string\" ? r.mimeType : \"unknown\";\n return makeText(`[resource: ${uri} (${mime})]`);\n }\n case \"resource_link\": {\n const b = block as McpContentResourceLink;\n const uri = typeof b.uri === \"string\" ? b.uri : \"<unknown>\";\n const name = typeof b.name === \"string\" ? ` \"${b.name}\"` : \"\";\n return makeText(`[resource_link${name}: ${uri}]`);\n }\n default: {\n // Unknown block type — emit a short marker rather than stringifying the\n // whole thing (which may contain base64 payloads we want to keep out of\n // the text channel).\n return makeText(\n `[unsupported tool content block: ${String(block.type)}]`\n );\n }\n }\n}\n\nfunction stripMeta(value: unknown): unknown {\n if (value && typeof value === \"object\" && !Array.isArray(value)) {\n const { _meta: _ignored, ...rest } = value as Record<string, unknown>;\n return rest;\n }\n return value;\n}\n\nexport function extractToolResultParts(result: unknown): ContentPart[] {\n const stripped = stripMeta(result);\n\n if (typeof stripped === \"string\") {\n return stripped.length > 0 ? [makeText(stripped)] : [];\n }\n\n if (isMcpResultShape(stripped)) {\n const r = stripped as McpToolResult;\n const parts: ContentPart[] = [];\n if (Array.isArray(r.content)) {\n for (const block of r.content) {\n const p = blockToPart(block);\n if (p) parts.push(p);\n }\n }\n if (r.structuredContent !== undefined) {\n try {\n parts.push(\n makeText(`structuredContent: ${JSON.stringify(r.structuredContent)}`)\n );\n } catch {\n // ignore — non-serializable structuredContent is exotic enough that we\n // prefer to drop it than to blow up the request.\n }\n }\n if (r.isError) {\n parts.unshift(makeText(\"[tool reported isError=true]\"));\n }\n return parts;\n }\n\n // Fallback: arbitrary value (object or array). Stringify into one text part.\n try {\n return [makeText(JSON.stringify(stripped))];\n } catch {\n return [makeText(String(stripped))];\n }\n}\n\n/**\n * Collapse a `ContentPart[]` to a single string if every part is a text part —\n * lets callers preserve the legacy `content: string` shape for the common case\n * of text-only tool results.\n */\nfunction collapseToString(parts: ContentPart[]): string | null {\n if (parts.length === 0) return \"\";\n if (parts.every((p) => p.type === \"text\")) {\n return parts.map((p) => (p as TextContentPart).text).join(\"\\n\");\n }\n return null;\n}\n\n/**\n * Convenience wrapper used by `toolLoop` and `messageFormat`: returns a string\n * for text-only results and a `ContentPart[]` when any non-text part (currently\n * just images) is present.\n */\nexport function toolResultToContent(result: unknown): string | ContentPart[] {\n const parts = extractToolResultParts(result);\n const collapsed = collapseToString(parts);\n return collapsed !== null ? collapsed : parts;\n}\n\n/**\n * Split a tool-message `content` field into joined text + image parts. Used by\n * providers (OpenAI, Gemini) that can't carry image bytes inside their tool\n * role and must forward them as a synthetic follow-up user turn.\n */\nexport function partitionToolContent(content: string | ContentPart[]): {\n text: string;\n imageParts: ImageContentPart[];\n isString: boolean;\n} {\n if (typeof content === \"string\") {\n return { text: content, imageParts: [], isString: true };\n }\n const texts: string[] = [];\n const imageParts: ImageContentPart[] = [];\n for (const p of content) {\n if (p.type === \"text\") {\n if (p.text) texts.push(p.text);\n } else if (p.type === \"image\") {\n imageParts.push(p);\n }\n }\n return { text: texts.join(\"\\n\"), imageParts, isString: false };\n}\n\n/** Header text introducing image bytes that follow a tool result. */\nexport function toolImageFollowupHeader(\n toolName: string | undefined,\n count: number\n): string {\n return `(Tool \"${toolName ?? \"<tool>\"}\" returned the following image${\n count === 1 ? \"\" : \"s\"\n }:)`;\n}\n","import { isToolResultError, toolResultToContent } from \"./toolResultParts.js\";\nimport type { ContentPart, ProviderMessage } from \"./types.js\";\n\ninterface InspectorAttachment {\n type: \"image\" | \"file\";\n data: string;\n mimeType: string;\n}\n\ninterface InspectorMessagePart {\n type: \"text\" | \"tool-invocation\";\n text?: string;\n toolInvocation?: {\n toolName: string;\n args: Record<string, unknown>;\n result?: unknown;\n };\n}\n\ninterface InspectorMessageLike {\n role: \"user\" | \"assistant\";\n content: unknown;\n attachments?: InspectorAttachment[];\n parts?: InspectorMessagePart[];\n}\n\nfunction extractText(m: InspectorMessageLike): string {\n const raw =\n typeof m.content === \"string\"\n ? m.content\n : Array.isArray(m.content)\n ? (m.content as Array<{ text?: string }>)\n .map((x) => x?.text ?? \"\")\n .join(\"\\n\")\n : JSON.stringify(m.content ?? \"\");\n if (raw.trim()) return raw.trim();\n if (m.parts?.length) {\n return m.parts\n .filter((p) => p.type === \"text\" && p.text)\n .map((p) => p.text!)\n .join(\"\")\n .trim();\n }\n return \"\";\n}\n\n/**\n * Convert inspector chat `Message[]` to provider-neutral `ProviderMessage[]`.\n *\n * Assistant messages with completed tool invocations are expanded into an\n * assistant message (bearing `toolCalls`) followed by one `tool` message per\n * invocation carrying the serialized result. This mirrors what the inspector\n * previously built using LangChain's AIMessage + ToolMessage pair.\n */\nexport function convertMessagesToProvider(\n messages: InspectorMessageLike[]\n): ProviderMessage[] {\n const out: ProviderMessage[] = [];\n\n messages.forEach((m, mi) => {\n if (m.role === \"user\") {\n const text = extractText(m) || \"[no content]\";\n if (m.attachments?.length) {\n const parts: ContentPart[] = [{ type: \"text\", text }];\n for (const a of m.attachments) {\n if (a.type === \"image\") {\n parts.push({\n type: \"image\",\n url: `data:${a.mimeType};base64,${a.data}`,\n mimeType: a.mimeType,\n data: a.data,\n });\n }\n }\n out.push({ role: \"user\", content: parts });\n } else {\n out.push({ role: \"user\", content: text });\n }\n return;\n }\n\n // assistant\n const toolParts = (m.parts ?? []).filter(\n (p) =>\n p.type === \"tool-invocation\" &&\n p.toolInvocation &&\n p.toolInvocation.result !== undefined\n );\n\n if (toolParts.length === 0) {\n const text = extractText(m) || \"[no content]\";\n out.push({ role: \"assistant\", content: text });\n return;\n }\n\n const text = extractText(m);\n const toolCalls = toolParts.map((p, i) => ({\n id: `call_${mi}_${i}_${p.toolInvocation!.toolName}`,\n name: p.toolInvocation!.toolName,\n args: p.toolInvocation!.args,\n }));\n out.push({\n role: \"assistant\",\n content: text,\n toolCalls,\n });\n toolParts.forEach((p, i) => {\n const result = p.toolInvocation!.result;\n out.push({\n role: \"tool\",\n content: toolResultToContent(result),\n toolCallId: `call_${mi}_${i}_${p.toolInvocation!.toolName}`,\n toolName: p.toolInvocation!.toolName,\n toolResult: result,\n toolIsError: isToolResultError(result),\n });\n });\n });\n\n return out;\n}\n\n/**\n * Extract the top-level `system` instruction (if any) from a ProviderMessage\n * list and return both the system text and the messages without it.\n *\n * Anthropic and Google do not accept a `system` role inside their `messages`\n * array; they take it as a top-level field instead.\n */\nexport function extractSystem(messages: ProviderMessage[]): {\n system?: string;\n rest: ProviderMessage[];\n} {\n const sys: string[] = [];\n const rest: ProviderMessage[] = [];\n for (const m of messages) {\n if (m.role === \"system\") {\n if (typeof m.content === \"string\") sys.push(m.content);\n else if (Array.isArray(m.content)) {\n for (const p of m.content) if (p.type === \"text\") sys.push(p.text);\n }\n } else {\n rest.push(m);\n }\n }\n return {\n system: sys.length > 0 ? sys.join(\"\\n\\n\") : undefined,\n rest,\n };\n}\n\n/** Parse a `data:...;base64,...` URL. */\nexport function parseDataUrl(\n url: string\n): { mimeType: string; data: string } | null {\n const m = url.match(/^data:([^;,]+);base64,(.+)$/);\n if (!m) return null;\n return { mimeType: m[1], data: m[2] };\n}\n","/**\n * Minimal Server-Sent Events parser for provider streaming responses.\n *\n * All three target providers (OpenAI, Anthropic, Google) expose SSE streams\n * over `fetch`. This helper turns the raw `ReadableStream<Uint8Array>` into\n * an async iterable of `{ event, data }` objects. It tolerates CR/LF, blank\n * separator lines, and multi-line `data:` fields.\n */\n\ninterface SseEvent {\n event?: string;\n data: string;\n}\n\nexport async function* parseSSE(\n body: ReadableStream<Uint8Array>,\n signal?: AbortSignal\n): AsyncGenerator<SseEvent, void, unknown> {\n const reader = body.getReader();\n const decoder = new TextDecoder(\"utf-8\");\n let buffer = \"\";\n\n try {\n while (true) {\n if (signal?.aborted) return;\n const { value, done } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n\n let sep: number;\n while ((sep = indexOfEventSeparator(buffer)) !== -1) {\n const raw = buffer.slice(0, sep);\n buffer = buffer.slice(sep).replace(/^(\\r\\n\\r\\n|\\n\\n|\\r\\r)/, \"\");\n const parsed = parseSseBlock(raw);\n if (parsed) yield parsed;\n }\n }\n // Flush trailing block if any.\n if (buffer.trim()) {\n const parsed = parseSseBlock(buffer);\n if (parsed) yield parsed;\n }\n } finally {\n try {\n reader.releaseLock();\n } catch {\n // ignore\n }\n }\n}\n\nfunction indexOfEventSeparator(s: string): number {\n const a = s.indexOf(\"\\n\\n\");\n const b = s.indexOf(\"\\r\\n\\r\\n\");\n if (a === -1) return b;\n if (b === -1) return a;\n return Math.min(a, b);\n}\n\nfunction parseSseBlock(raw: string): SseEvent | null {\n let event: string | undefined;\n const dataLines: string[] = [];\n for (const line of raw.split(/\\r?\\n/)) {\n if (!line || line.startsWith(\":\")) continue;\n const idx = line.indexOf(\":\");\n const field = idx === -1 ? line : line.slice(0, idx);\n let value = idx === -1 ? \"\" : line.slice(idx + 1);\n if (value.startsWith(\" \")) value = value.slice(1);\n if (field === \"event\") event = value;\n else if (field === \"data\") dataLines.push(value);\n }\n if (dataLines.length === 0) return null;\n return { event, data: dataLines.join(\"\\n\") };\n}\n","import type { TokenUsage } from \"./types.js\";\n\nfunction numberAt(\n value: Record<string, unknown>,\n ...keys: string[]\n): number | undefined {\n for (const key of keys) {\n const candidate = value[key];\n if (typeof candidate === \"number\" && Number.isFinite(candidate)) {\n return candidate;\n }\n }\n return undefined;\n}\n\n/** Normalize exact provider-reported token counters. Never estimates usage. */\nexport function tokenUsageFromRecord(raw: unknown): TokenUsage | undefined {\n if (!raw || typeof raw !== \"object\") return undefined;\n const usage = raw as Record<string, unknown>;\n const inputTokens = numberAt(\n usage,\n \"inputTokens\",\n \"input_tokens\",\n \"prompt_tokens\",\n \"promptTokenCount\",\n \"prompt_eval_count\"\n );\n const outputTokens = numberAt(\n usage,\n \"outputTokens\",\n \"output_tokens\",\n \"completion_tokens\",\n \"candidatesTokenCount\",\n \"eval_count\"\n );\n const totalTokens =\n numberAt(usage, \"totalTokens\", \"total_tokens\", \"totalTokenCount\") ??\n (inputTokens !== undefined && outputTokens !== undefined\n ? inputTokens + outputTokens\n : undefined);\n\n const inputDetails =\n usage.input_tokens_details && typeof usage.input_tokens_details === \"object\"\n ? (usage.input_tokens_details as Record<string, unknown>)\n : undefined;\n const outputDetails =\n usage.output_tokens_details &&\n typeof usage.output_tokens_details === \"object\"\n ? (usage.output_tokens_details as Record<string, unknown>)\n : undefined;\n const cachedInputTokens =\n numberAt(usage, \"cachedInputTokens\", \"cache_read_input_tokens\") ??\n (inputDetails ? numberAt(inputDetails, \"cached_tokens\") : undefined);\n const reasoningTokens =\n numberAt(usage, \"reasoningTokens\", \"thoughtsTokenCount\") ??\n (outputDetails ? numberAt(outputDetails, \"reasoning_tokens\") : undefined);\n\n if (\n inputTokens === undefined &&\n outputTokens === undefined &&\n totalTokens === undefined &&\n cachedInputTokens === undefined &&\n reasoningTokens === undefined\n ) {\n return undefined;\n }\n\n return {\n inputTokens,\n outputTokens,\n totalTokens,\n cachedInputTokens,\n reasoningTokens,\n };\n}\n","import { extractSystem, parseDataUrl } from \"../messageFormat.js\";\nimport { parseSSE } from \"../sse.js\";\nimport type {\n ContentPart,\n LlmStreamEvent,\n ProviderConfig,\n ProviderMessage,\n ProviderTool,\n TokenUsage,\n} from \"../types.js\";\nimport { tokenUsageFromRecord } from \"../usage.js\";\n\ninterface ChatParams {\n config: ProviderConfig;\n messages: ProviderMessage[];\n tools?: ProviderTool[];\n signal?: AbortSignal;\n}\n\nconst DEFAULT_ENDPOINT = \"https://api.anthropic.com/v1/messages\";\nconst ANTHROPIC_VERSION = \"2023-06-01\";\nconst DEFAULT_MAX_TOKENS = 4096;\n\nfunction buildImageBlock(p: ContentPart) {\n if (p.type !== \"image\") return null;\n if (p.data && p.mimeType) {\n return {\n type: \"image\",\n source: { type: \"base64\", media_type: p.mimeType, data: p.data },\n };\n }\n const parsed = parseDataUrl(p.url);\n if (parsed) {\n return {\n type: \"image\",\n source: {\n type: \"base64\",\n media_type: parsed.mimeType,\n data: parsed.data,\n },\n };\n }\n // Assume it's a remote URL; Anthropic supports url sources too.\n return { type: \"image\", source: { type: \"url\", url: p.url } };\n}\n\nfunction toAnthropicContent(content: string | ContentPart[]): unknown {\n if (typeof content === \"string\") {\n return [{ type: \"text\", text: content || \"[no content]\" }];\n }\n const blocks: unknown[] = [];\n for (const p of content) {\n if (p.type === \"text\") {\n if (p.text) blocks.push({ type: \"text\", text: p.text });\n } else {\n const img = buildImageBlock(p);\n if (img) blocks.push(img);\n }\n }\n if (blocks.length === 0) blocks.push({ type: \"text\", text: \"[no content]\" });\n return blocks;\n}\n\nfunction toAnthropicToolResultContent(\n content: string | ContentPart[]\n): unknown {\n if (typeof content === \"string\") {\n return content;\n }\n const blocks: unknown[] = [];\n for (const p of content) {\n if (p.type === \"text\") {\n if (p.text) blocks.push({ type: \"text\", text: p.text });\n } else if (p.type === \"image\") {\n const img = buildImageBlock(p);\n if (img) blocks.push(img);\n }\n }\n if (blocks.length === 0) {\n return \"[no content]\";\n }\n return blocks;\n}\n\nexport function toAnthropicMessages(messages: ProviderMessage[]): unknown[] {\n const out: any[] = [];\n for (const m of messages) {\n if (m.role === \"tool\") {\n // Anthropic packs tool results into a user message.\n const last = out[out.length - 1];\n const block = {\n type: \"tool_result\",\n tool_use_id: m.toolCallId,\n content: toAnthropicToolResultContent(m.content),\n ...(m.toolIsError ? { is_error: true } : {}),\n };\n if (last && last.role === \"user\" && Array.isArray(last.content)) {\n last.content.push(block);\n } else {\n out.push({ role: \"user\", content: [block] });\n }\n continue;\n }\n if (m.role === \"assistant\") {\n const blocks: any[] = [];\n const textContent =\n typeof m.content === \"string\"\n ? m.content\n : Array.isArray(m.content)\n ? m.content.map((p) => (p.type === \"text\" ? p.text : \"\")).join(\"\")\n : \"\";\n if (textContent) blocks.push({ type: \"text\", text: textContent });\n if (m.toolCalls?.length) {\n for (const tc of m.toolCalls) {\n blocks.push({\n type: \"tool_use\",\n id: tc.id,\n name: tc.name,\n input: tc.args ?? {},\n });\n }\n }\n if (blocks.length === 0) {\n blocks.push({ type: \"text\", text: \"[no content]\" });\n }\n out.push({ role: \"assistant\", content: blocks });\n continue;\n }\n out.push({ role: \"user\", content: toAnthropicContent(m.content) });\n }\n return out;\n}\n\nfunction buildBody(params: ChatParams, stream: boolean) {\n const { config, messages, tools } = params;\n const { system, rest } = extractSystem(messages);\n const body: Record<string, unknown> = {\n model: config.model,\n max_tokens: config.maxTokens ?? DEFAULT_MAX_TOKENS,\n messages: toAnthropicMessages(rest),\n ...(stream ? { stream: true } : {}),\n };\n if (config.temperature !== undefined) body.temperature = config.temperature;\n if (system) body.system = system;\n if (tools && tools.length > 0) {\n body.tools = tools.map((t) => ({\n name: t.name,\n description: t.description,\n input_schema: t.inputSchema,\n }));\n }\n return body;\n}\n\nexport async function* streamChat(\n params: ChatParams\n): AsyncGenerator<LlmStreamEvent, void, unknown> {\n const { config, signal } = params;\n const res = await fetch(DEFAULT_ENDPOINT, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-api-key\": config.apiKey,\n \"anthropic-version\": ANTHROPIC_VERSION,\n \"anthropic-dangerous-direct-browser-access\": \"true\",\n },\n body: JSON.stringify(buildBody(params, true)),\n signal,\n });\n if (!res.ok || !res.body) {\n const text = await res.text().catch(() => \"\");\n throw new Error(\n `Anthropic request failed (${res.status} ${res.statusText}): ${text}`\n );\n }\n\n // Content block state by index.\n const blocks = new Map<\n number,\n {\n kind: \"text\" | \"tool_use\";\n id?: string;\n name?: string;\n argsJson: string;\n emittedStart: boolean;\n }\n >();\n let usage: TokenUsage | undefined;\n\n for await (const ev of parseSSE(res.body, signal)) {\n let parsed: any;\n try {\n parsed = JSON.parse(ev.data);\n } catch {\n continue;\n }\n const t = parsed?.type;\n if (t === \"message_start\") {\n usage = tokenUsageFromRecord(parsed?.message?.usage);\n } else if (t === \"message_delta\") {\n const deltaUsage = tokenUsageFromRecord(parsed?.usage);\n if (deltaUsage) usage = { ...usage, ...deltaUsage };\n } else if (t === \"content_block_start\") {\n const idx = parsed.index as number;\n const cb = parsed.content_block ?? {};\n if (cb.type === \"tool_use\") {\n blocks.set(idx, {\n kind: \"tool_use\",\n id: cb.id,\n name: cb.name,\n argsJson: \"\",\n emittedStart: false,\n });\n yield {\n type: \"tool-call-start\",\n index: idx,\n toolCallId: cb.id,\n toolName: cb.name,\n };\n const entry = blocks.get(idx);\n if (entry) entry.emittedStart = true;\n } else {\n blocks.set(idx, {\n kind: \"text\",\n argsJson: \"\",\n emittedStart: false,\n });\n }\n } else if (t === \"content_block_delta\") {\n const idx = parsed.index as number;\n const d = parsed.delta ?? {};\n const entry = blocks.get(idx);\n if (!entry) continue;\n if (d.type === \"text_delta\" && typeof d.text === \"string\") {\n yield { type: \"text-delta\", delta: d.text };\n } else if (\n d.type === \"input_json_delta\" &&\n typeof d.partial_json === \"string\" &&\n entry.kind === \"tool_use\"\n ) {\n entry.argsJson += d.partial_json;\n yield {\n type: \"tool-call-args-delta\",\n index: idx,\n toolCallId: entry.id!,\n toolName: entry.name!,\n argsDelta: d.partial_json,\n };\n }\n } else if (t === \"content_block_stop\") {\n const idx = parsed.index as number;\n const entry = blocks.get(idx);\n if (entry && entry.kind === \"tool_use\" && entry.id && entry.name) {\n let args: Record<string, unknown> = {};\n if (entry.argsJson) {\n try {\n args = JSON.parse(entry.argsJson);\n } catch {\n args = {};\n }\n }\n yield {\n type: \"tool-call-ready\",\n index: idx,\n toolCallId: entry.id,\n toolName: entry.name,\n args,\n };\n }\n } else if (t === \"message_stop\") {\n if (usage) {\n const totalTokens =\n usage.totalTokens ??\n (usage.inputTokens !== undefined && usage.outputTokens !== undefined\n ? usage.inputTokens + usage.outputTokens\n : undefined);\n yield { type: \"usage\", usage: { ...usage, totalTokens } };\n }\n } else if (t === \"error\") {\n yield {\n type: \"error\",\n message: parsed?.error?.message ?? \"Anthropic stream error\",\n };\n }\n }\n yield { type: \"done\" };\n}\n\nexport async function chat(params: ChatParams): Promise<{\n text: string;\n toolCalls: { id: string; name: string; args: Record<string, unknown> }[];\n}> {\n const { config, signal } = params;\n const res = await fetch(DEFAULT_ENDPOINT, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-api-key\": config.apiKey,\n \"anthropic-version\": ANTHROPIC_VERSION,\n \"anthropic-dangerous-direct-browser-access\": \"true\",\n },\n body: JSON.stringify(buildBody(params, false)),\n signal,\n });\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(\n `Anthropic request failed (${res.status} ${res.statusText}): ${text}`\n );\n }\n const json = await res.json();\n let text = \"\";\n const toolCalls: {\n id: string;\n name: string;\n args: Record<string, unknown>;\n }[] = [];\n for (const block of json?.content ?? []) {\n if (block.type === \"text\" && typeof block.text === \"string\") {\n text += block.text;\n } else if (block.type === \"tool_use\") {\n toolCalls.push({\n id: block.id,\n name: block.name,\n args:\n block.input && typeof block.input === \"object\"\n ? (block.input as Record<string, unknown>)\n : {},\n });\n }\n }\n return { text, toolCalls };\n}\n","/**\n * JSON Schema sanitizer for Google Gemini `functionDeclarations`.\n *\n * Gemini rejects schemas that contain keywords it doesn't understand\n * (`$schema`, `$id`, `additionalProperties`, `$ref`, `definitions`, etc.)\n * and many advanced constructs (`oneOf`/`anyOf`/`allOf` on non-object roots,\n * `const`, `examples`, `default` on certain types). MCP servers often emit\n * schemas with these fields because they're valid JSON Schema, so we strip\n * them here. Tool semantics are preserved — only metadata keywords are\n * removed.\n */\nconst ALLOWED_KEYS = new Set([\n \"type\",\n \"description\",\n \"enum\",\n \"properties\",\n \"required\",\n \"items\",\n \"format\",\n \"nullable\",\n \"minimum\",\n \"maximum\",\n \"minItems\",\n \"maxItems\",\n \"minLength\",\n \"maxLength\",\n \"pattern\",\n]);\n\nexport function sanitizeSchemaForGemini(\n schema: unknown\n): Record<string, unknown> {\n if (!schema || typeof schema !== \"object\") {\n return { type: \"object\" };\n }\n const cleaned = clean(schema as Record<string, unknown>);\n if (typeof cleaned !== \"object\" || cleaned === null) {\n return { type: \"object\" };\n }\n const out = cleaned as Record<string, unknown>;\n if (!out.type) out.type = \"object\";\n return out;\n}\n\nfunction clean(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(clean);\n if (!value || typeof value !== \"object\") return value;\n const input = value as Record<string, unknown>;\n\n // Unwrap single-branch unions; drop unsupported composite keywords otherwise.\n for (const key of [\"oneOf\", \"anyOf\", \"allOf\"]) {\n const arr = input[key];\n if (Array.isArray(arr) && arr.length === 1) {\n return clean(arr[0]);\n }\n }\n\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(input)) {\n if (!ALLOWED_KEYS.has(k)) continue;\n if (k === \"properties\" && v && typeof v === \"object\") {\n const props: Record<string, unknown> = {};\n for (const [pk, pv] of Object.entries(v as Record<string, unknown>)) {\n props[pk] = clean(pv);\n }\n out[k] = props;\n } else if (k === \"items\") {\n out[k] = clean(v);\n } else {\n out[k] = v;\n }\n }\n return out;\n}\n","import { extractSystem, parseDataUrl } from \"../messageFormat.js\";\nimport { sanitizeSchemaForGemini } from \"../schemaUtils.js\";\nimport { parseSSE } from \"../sse.js\";\nimport {\n partitionToolContent,\n toolImageFollowupHeader,\n} from \"../toolResultParts.js\";\nimport type {\n ContentPart,\n LlmStreamEvent,\n ProviderConfig,\n ProviderMessage,\n ProviderTool,\n TokenUsage,\n} from \"../types.js\";\nimport { tokenUsageFromRecord } from \"../usage.js\";\n\ninterface ChatParams {\n config: ProviderConfig;\n messages: ProviderMessage[];\n tools?: ProviderTool[];\n signal?: AbortSignal;\n}\n\n/**\n * Normalize a Gemini model identifier. The Google list-models API returns\n * `name: \"models/<id>\"` and the UI sometimes persists that full resource\n * name; users may also paste a bare id like `gemini-2.5-flash`. Both forms\n * must resolve to the same `models/<id>` URL segment.\n */\nfunction normalizeModelId(model: string): string {\n const trimmed = model.trim();\n return trimmed.startsWith(\"models/\")\n ? trimmed.slice(\"models/\".length)\n : trimmed;\n}\n\nfunction endpointFor(model: string, mode: \"stream\" | \"single\"): string {\n const action =\n mode === \"stream\" ? \"streamGenerateContent?alt=sse\" : \"generateContent\";\n return `https://generativelanguage.googleapis.com/v1beta/models/${encodeURIComponent(\n normalizeModelId(model)\n )}:${action}`;\n}\n\nfunction buildInlineData(p: ContentPart): unknown {\n if (p.type !== \"image\") return null;\n if (p.data && p.mimeType) {\n return { inlineData: { mimeType: p.mimeType, data: p.data } };\n }\n const parsed = parseDataUrl(p.url);\n if (parsed) {\n return {\n inlineData: { mimeType: parsed.mimeType, data: parsed.data },\n };\n }\n return null;\n}\n\nfunction toGeminiParts(content: string | ContentPart[]): unknown[] {\n if (typeof content === \"string\") {\n return [{ text: content || \"[no content]\" }];\n }\n const parts: unknown[] = [];\n for (const p of content) {\n if (p.type === \"text\") {\n if (p.text) parts.push({ text: p.text });\n } else {\n const block = buildInlineData(p);\n if (block) parts.push(block);\n }\n }\n if (parts.length === 0) parts.push({ text: \"[no content]\" });\n return parts;\n}\n\nfunction buildGeminiToolResponse(content: string | ContentPart[]): {\n response: Record<string, unknown>;\n imageParts: ContentPart[];\n} {\n // `functionResponse.response` must be an object; for a JSON-stringified\n // result we parse it back so Gemini sees the structured shape.\n if (typeof content === \"string\") {\n let parsed: unknown;\n try {\n parsed = JSON.parse(content);\n } catch {\n parsed = { result: content };\n }\n if (!parsed || typeof parsed !== \"object\") {\n parsed = { result: parsed };\n }\n return { response: parsed as Record<string, unknown>, imageParts: [] };\n }\n const { text, imageParts } = partitionToolContent(content);\n const response: Record<string, unknown> = {};\n if (text) response.text = text;\n if (imageParts.length > 0) {\n response.images = imageParts.map((p) => ({\n mimeType: p.mimeType ?? \"image/*\",\n omitted: true,\n }));\n response.note =\n \"Image bytes were sent in the next user turn as inlineData.\";\n }\n if (Object.keys(response).length === 0) {\n response.result = null;\n }\n return { response, imageParts };\n}\n\nexport function toGeminiContents(messages: ProviderMessage[]): unknown[] {\n const out: any[] = [];\n for (const m of messages) {\n if (m.role === \"tool\") {\n const { response, imageParts } = buildGeminiToolResponse(m.content);\n const last = out[out.length - 1];\n const part = {\n functionResponse: {\n name: m.toolName,\n response,\n },\n };\n if (last && last.role === \"function\") {\n last.parts.push(part);\n } else {\n out.push({ role: \"function\", parts: [part] });\n }\n if (imageParts.length > 0) {\n const userParts: unknown[] = [\n { text: toolImageFollowupHeader(m.toolName, imageParts.length) },\n ];\n for (const p of imageParts) {\n const block = buildInlineData(p);\n if (block) userParts.push(block);\n }\n out.push({ role: \"user\", parts: userParts });\n }\n continue;\n }\n if (m.role === \"assistant\") {\n const parts: any[] = [];\n const textContent =\n typeof m.content === \"string\"\n ? m.content\n : Array.isArray(m.content)\n ? m.content.map((p) => (p.type === \"text\" ? p.text : \"\")).join(\"\")\n : \"\";\n if (textContent) parts.push({ text: textContent });\n if (m.toolCalls?.length) {\n for (const tc of m.toolCalls) {\n parts.push({\n functionCall: { name: tc.name, args: tc.args ?? {} },\n });\n }\n }\n if (parts.length === 0) parts.push({ text: \"[no content]\" });\n out.push({ role: \"model\", parts });\n continue;\n }\n out.push({ role: \"user\", parts: toGeminiParts(m.content) });\n }\n return out;\n}\n\nfunction buildBody(params: ChatParams) {\n const { config, messages, tools } = params;\n const { system, rest } = extractSystem(messages);\n const body: Record<string, unknown> = {\n contents: toGeminiContents(rest),\n };\n if (system) {\n body.systemInstruction = { parts: [{ text: system }] };\n }\n const genConfig: Record<string, unknown> = {};\n if (config.temperature !== undefined)\n genConfig.temperature = config.temperature;\n if (config.maxTokens !== undefined)\n genConfig.maxOutputTokens = config.maxTokens;\n if (Object.keys(genConfig).length > 0) body.generationConfig = genConfig;\n if (tools && tools.length > 0) {\n body.tools = [\n {\n functionDeclarations: tools.map((t) => ({\n name: t.name,\n description: t.description,\n parameters: sanitizeSchemaForGemini(t.inputSchema),\n })),\n },\n ];\n }\n return body;\n}\n\nexport async function* streamChat(\n params: ChatParams\n): AsyncGenerator<LlmStreamEvent, void, unknown> {\n const { config, signal } = params;\n const url = `${endpointFor(config.model, \"stream\")}&key=${encodeURIComponent(\n config.apiKey\n )}`;\n const res = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(buildBody(params)),\n signal,\n });\n if (!res.ok || !res.body) {\n const text = await res.text().catch(() => \"\");\n throw new Error(\n `Google request failed (${res.status} ${res.statusText}): ${text}`\n );\n }\n\n let toolCallCounter = 0;\n let usage: TokenUsage | undefined;\n\n for await (const ev of parseSSE(res.body, signal)) {\n let parsed: any;\n try {\n parsed = JSON.parse(ev.data);\n } catch {\n continue;\n }\n usage = tokenUsageFromRecord(parsed?.usageMetadata) ?? usage;\n const parts = parsed?.candidates?.[0]?.content?.parts ?? [];\n for (const p of parts) {\n if (typeof p.text === \"string\" && p.text.length > 0) {\n yield { type: \"text-delta\", delta: p.text };\n } else if (p.functionCall && typeof p.functionCall === \"object\") {\n const idx = toolCallCounter++;\n const id = `call_${idx}_${p.functionCall.name ?? \"tool\"}`;\n const name: string = p.functionCall.name ?? \"\";\n const args =\n p.functionCall.args && typeof p.functionCall.args === \"object\"\n ? (p.functionCall.args as Record<string, unknown>)\n : {};\n yield {\n type: \"tool-call-start\",\n index: idx,\n toolCallId: id,\n toolName: name,\n };\n // Gemini delivers args as a whole object — emit the full JSON at\n // once so downstream code can still render args progressively.\n const argsJson = JSON.stringify(args);\n if (argsJson && argsJson !== \"{}\") {\n yield {\n type: \"tool-call-args-delta\",\n index: idx,\n toolCallId: id,\n toolName: name,\n argsDelta: argsJson,\n };\n }\n yield {\n type: \"tool-call-ready\",\n index: idx,\n toolCallId: id,\n toolName: name,\n args,\n };\n }\n }\n }\n if (usage) yield { type: \"usage\", usage };\n yield { type: \"done\" };\n}\n\nexport async function chat(params: ChatParams): Promise<{\n text: string;\n toolCalls: { id: string; name: string; args: Record<string, unknown> }[];\n}> {\n const { config, signal } = params;\n const url = `${endpointFor(config.model, \"single\")}?key=${encodeURIComponent(\n config.apiKey\n )}`;\n const res = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(buildBody(params)),\n signal,\n });\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(\n `Google request failed (${res.status} ${res.statusText}): ${text}`\n );\n }\n const json = await res.json();\n let text = \"\";\n const toolCalls: {\n id: string;\n name: string;\n args: Record<string, unknown>;\n }[] = [];\n const parts = json?.candidates?.[0]?.content?.parts ?? [];\n for (const p of parts) {\n if (typeof p.text === \"string\") text += p.text;\n else if (p.functionCall) {\n toolCalls.push({\n id: `call_${toolCalls.length}_${p.functionCall.name ?? \"tool\"}`,\n name: p.functionCall.name ?? \"\",\n args:\n p.functionCall.args && typeof p.functionCall.args === \"object\"\n ? (p.functionCall.args as Record<string, unknown>)\n : {},\n });\n }\n }\n return { text, toolCalls };\n}\n","/**\n * Minimal newline-delimited JSON parser for Ollama streaming responses.\n */\n\nexport async function* parseNDJSON(\n body: ReadableStream<Uint8Array>,\n signal?: AbortSignal\n): AsyncGenerator<unknown, void, unknown> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n while (true) {\n if (signal?.aborted) return;\n\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n\n try {\n yield JSON.parse(trimmed);\n } catch {\n // Ignore malformed partial chunks.\n }\n }\n }\n\n const trailing = buffer.trim();\n if (trailing) {\n try {\n yield JSON.parse(trailing);\n } catch {\n // Ignore malformed trailing chunks.\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n","export const DEFAULT_OLLAMA_BASE_URL = \"http://localhost:11434\";\n\nexport function normalizeOllamaBaseUrl(baseUrl?: string): string {\n const raw = (baseUrl || DEFAULT_OLLAMA_BASE_URL).trim();\n let end = raw.length;\n while (end > 0 && raw.charCodeAt(end - 1) === 47 /* '/' */) {\n end--;\n }\n const trimmed = raw.slice(0, end);\n\n return trimmed.endsWith(\"/api\") ? trimmed.slice(0, -4) : trimmed;\n}\n\nexport function buildOllamaApiUrl(\n baseUrl: string | undefined,\n path: `/api/${string}`\n): string {\n return `${normalizeOllamaBaseUrl(baseUrl)}${path}`;\n}\n\nexport class OllamaCorsError extends Error {\n constructor(cause: unknown) {\n super(\n \"Could not reach Ollama. If it's running, allow this origin by starting Ollama with \" +\n \"`OLLAMA_ORIGINS=*` (or your inspector origin) and try again.\"\n );\n this.name = \"OllamaCorsError\";\n this.cause = cause;\n }\n}\n","import { parseDataUrl } from \"../../messageFormat.js\";\nimport { parseNDJSON } from \"../../ndjson.js\";\nimport type {\n ContentPart,\n LlmStreamEvent,\n ProviderConfig,\n ProviderMessage,\n ProviderTool,\n TokenUsage,\n} from \"../../types.js\";\nimport { buildOllamaApiUrl } from \"./utils\";\nimport { tokenUsageFromRecord } from \"../../usage.js\";\n\ninterface ChatParams {\n config: ProviderConfig;\n messages: ProviderMessage[];\n tools?: ProviderTool[];\n signal?: AbortSignal;\n}\n\nfunction toOllamaImages(content: ContentPart[]): string[] {\n const images: string[] = [];\n\n for (const part of content) {\n if (part.type !== \"image\") continue;\n\n if (part.data) {\n images.push(part.data);\n continue;\n }\n\n const parsed = parseDataUrl(part.url);\n if (parsed?.data) {\n images.push(parsed.data);\n }\n }\n\n return images;\n}\n\nfunction toOllamaContent(content: string | ContentPart[]): {\n content: string;\n images?: string[];\n} {\n if (typeof content === \"string\") {\n return { content };\n }\n\n const text = content\n .filter(\n (part): part is Extract<ContentPart, { type: \"text\" }> =>\n part.type === \"text\"\n )\n .map((part) => part.text)\n .join(\"\");\n\n const images = toOllamaImages(content);\n return {\n content: text,\n ...(images.length > 0 ? { images } : {}),\n };\n}\n\nfunction toOllamaMessages(messages: ProviderMessage[]): unknown[] {\n return messages.map((message) => {\n if (message.role === \"tool\") {\n return {\n role: \"tool\",\n tool_name: message.toolName,\n content:\n typeof message.content === \"string\"\n ? message.content\n : JSON.stringify(message.toolResult ?? message.content),\n };\n }\n\n if (message.role === \"assistant\") {\n const content =\n typeof message.content === \"string\"\n ? { content: message.content }\n : toOllamaContent(message.content);\n\n return {\n role: \"assistant\",\n ...content,\n ...(message.toolCalls?.length\n ? {\n tool_calls: message.toolCalls.map((toolCall, index) => ({\n type: \"function\",\n function: {\n index,\n name: toolCall.name,\n arguments: toolCall.args,\n },\n })),\n }\n : {}),\n };\n }\n\n return {\n role: message.role,\n ...toOllamaContent(message.content),\n };\n });\n}\n\nfunction buildBody(params: ChatParams, stream: boolean) {\n const { config, messages, tools } = params;\n const body: Record<string, unknown> = {\n model: config.model,\n messages: toOllamaMessages(messages),\n stream,\n };\n\n const options: Record<string, unknown> = {};\n if (config.temperature !== undefined)\n options.temperature = config.temperature;\n if (config.maxTokens !== undefined) options.num_predict = config.maxTokens;\n if (Object.keys(options).length > 0) body.options = options;\n\n if (tools && tools.length > 0) {\n body.tools = tools.map((tool) => ({\n type: \"function\",\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.inputSchema,\n },\n }));\n }\n\n return body;\n}\n\nfunction buildHeaders(config: ProviderConfig): HeadersInit {\n return {\n \"Content-Type\": \"application/json\",\n ...(config.apiKey.trim()\n ? { Authorization: `Bearer ${config.apiKey.trim()}` }\n : {}),\n };\n}\n\nfunction normalizeToolCalls(toolCalls: unknown): Array<{\n name: string;\n args: Record<string, unknown>;\n}> {\n if (!Array.isArray(toolCalls)) return [];\n\n return toolCalls\n .map((toolCall) => {\n const functionCall =\n toolCall && typeof toolCall === \"object\"\n ? (toolCall as { function?: Record<string, unknown> }).function\n : undefined;\n\n const name =\n typeof functionCall?.name === \"string\" ? functionCall.name : \"\";\n const rawArgs = functionCall?.arguments;\n const args =\n rawArgs && typeof rawArgs === \"object\"\n ? (rawArgs as Record<string, unknown>)\n : {};\n\n return {\n name,\n args,\n };\n })\n .filter((toolCall) => toolCall.name);\n}\n\nexport async function* streamChat(\n params: ChatParams\n): AsyncGenerator<LlmStreamEvent, void, unknown> {\n const { config, signal } = params;\n const res = await fetch(buildOllamaApiUrl(config.baseUrl, \"/api/chat\"), {\n method: \"POST\",\n headers: buildHeaders(config),\n body: JSON.stringify(buildBody(params, true)),\n signal,\n });\n\n if (!res.ok || !res.body) {\n const text = await res.text().catch(() => \"\");\n throw new Error(\n `Ollama request failed (${res.status} ${res.statusText}): ${text}`\n );\n }\n\n // Ollama emits tool_calls in the final chunk (done: true), but proxies and\n // forks have been seen to repeat them across chunks — gate emission on\n // first observation so downstream consumers can't fire the same tool twice.\n let toolCallsEmitted = false;\n let usage: TokenUsage | undefined;\n\n for await (const chunk of parseNDJSON(res.body, signal)) {\n const message =\n chunk && typeof chunk === \"object\"\n ? (chunk as { message?: Record<string, unknown> }).message\n : undefined;\n\n if (typeof message?.content === \"string\" && message.content.length > 0) {\n yield { type: \"text-delta\", delta: message.content };\n }\n\n if (!toolCallsEmitted) {\n const toolCalls = normalizeToolCalls(message?.tool_calls);\n if (toolCalls.length > 0) {\n for (const [index, toolCall] of toolCalls.entries()) {\n const toolCallId = `call_${index}_${toolCall.name || \"tool\"}`;\n\n yield {\n type: \"tool-call-start\",\n index,\n toolCallId,\n toolName: toolCall.name,\n };\n\n const argsJson = JSON.stringify(toolCall.args);\n if (argsJson && argsJson !== \"{}\") {\n yield {\n type: \"tool-call-args-delta\",\n index,\n toolCallId,\n toolName: toolCall.name,\n argsDelta: argsJson,\n };\n }\n\n yield {\n type: \"tool-call-ready\",\n index,\n toolCallId,\n toolName: toolCall.name,\n args: toolCall.args,\n };\n }\n\n toolCallsEmitted = true;\n }\n }\n\n if (\n chunk &&\n typeof chunk === \"object\" &&\n (chunk as { error?: unknown }).error\n ) {\n yield {\n type: \"error\",\n message: String((chunk as { error: unknown }).error),\n };\n }\n usage = tokenUsageFromRecord(chunk) ?? usage;\n }\n\n if (usage) yield { type: \"usage\", usage };\n yield { type: \"done\" };\n}\n\nexport async function chat(params: ChatParams): Promise<{\n text: string;\n toolCalls: { id: string; name: string; args: Record<string, unknown> }[];\n}> {\n const { config, signal } = params;\n const res = await fetch(buildOllamaApiUrl(config.baseUrl, \"/api/chat\"), {\n method: \"POST\",\n headers: buildHeaders(config),\n body: JSON.stringify(buildBody(params, false)),\n signal,\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(\n `Ollama request failed (${res.status} ${res.statusText}): ${text}`\n );\n }\n\n const json = await res.json();\n const message = json?.message ?? {};\n\n return {\n text: typeof message.content === \"string\" ? message.content : \"\",\n toolCalls: normalizeToolCalls(message.tool_calls).map((tc, index) => ({\n id: `call_${index}_${tc.name || \"tool\"}`,\n name: tc.name,\n args: tc.args,\n })),\n };\n}\n","import { parseSSE } from \"../sse.js\";\nimport {\n partitionToolContent,\n toolImageFollowupHeader,\n} from \"../toolResultParts.js\";\nimport type {\n ContentPart,\n LlmStreamEvent,\n ProviderConfig,\n ProviderMessage,\n ProviderTool,\n} from \"../types.js\";\nimport { tokenUsageFromRecord } from \"../usage.js\";\n\n/** Structured HTTP error from an LLM provider fetch (preserves status + JSON body). */\nexport class LlmRequestError extends Error {\n readonly status: number;\n readonly body?: unknown;\n\n constructor(status: number, message: string, body?: unknown) {\n super(message);\n this.name = \"LlmRequestError\";\n this.status = status;\n this.body = body;\n }\n}\n\nasync function throwLlmRequestError(res: Response): Promise<never> {\n const text = await res.text().catch(() => \"\");\n let body: unknown = text;\n if (text) {\n try {\n body = JSON.parse(text);\n } catch {\n // keep raw text\n }\n }\n throw new LlmRequestError(\n res.status,\n `OpenAI request failed (${res.status} ${res.statusText}): ${text}`,\n body\n );\n}\n\ninterface ChatParams {\n config: ProviderConfig;\n messages: ProviderMessage[];\n tools?: ProviderTool[];\n signal?: AbortSignal;\n}\n\nconst OPENAI_BASE_URL = \"https://api.openai.com/v1\";\n\nfunction buildEndpoint(config: ProviderConfig, path: string): string {\n return `${config.baseUrl ?? OPENAI_BASE_URL}${path}`;\n}\n\nfunction buildHeaders(config: ProviderConfig): Record<string, string> {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n ...config.extraHeaders,\n };\n if (config.apiKey) {\n headers.Authorization = `Bearer ${config.apiKey}`;\n }\n return headers;\n}\n\nfunction toOpenAIContent(content: string | ContentPart[]): unknown {\n if (typeof content === \"string\") return content;\n return content.map((p) => {\n if (p.type === \"text\") return { type: \"text\", text: p.text };\n return { type: \"image_url\", image_url: { url: p.url } };\n });\n}\n\nexport function toOpenAIMessages(messages: ProviderMessage[]): unknown[] {\n const out: unknown[] = [];\n for (const m of messages) {\n if (m.role === \"tool\") {\n // OpenAI's tool role only accepts string content; forward image bytes as\n // a follow-up user turn so vision-capable models can see them.\n const { text, imageParts } = partitionToolContent(m.content);\n const fallback =\n imageParts.length > 0\n ? \"[image content; see next message]\"\n : \"[no content]\";\n out.push({\n role: \"tool\",\n tool_call_id: m.toolCallId,\n content: text || fallback,\n });\n if (imageParts.length > 0) {\n const userParts: unknown[] = [\n {\n type: \"text\",\n text: toolImageFollowupHeader(m.toolName, imageParts.length),\n },\n ...imageParts.map((p) => ({\n type: \"image_url\",\n image_url: { url: p.url },\n })),\n ];\n out.push({ role: \"user\", content: userParts });\n }\n continue;\n }\n if (m.role === \"assistant\") {\n const entry: Record<string, unknown> = {\n role: \"assistant\",\n content:\n typeof m.content === \"string\" && m.content.length > 0\n ? m.content\n : null,\n };\n if (m.toolCalls?.length) {\n entry.tool_calls = m.toolCalls.map((tc) => ({\n id: tc.id,\n type: \"function\",\n function: { name: tc.name, arguments: JSON.stringify(tc.args) },\n }));\n }\n out.push(entry);\n continue;\n }\n out.push({ role: m.role, content: toOpenAIContent(m.content) });\n }\n return out;\n}\n\nexport async function* streamChat(\n params: ChatParams\n): AsyncGenerator<LlmStreamEvent, void, unknown> {\n const { config, messages, tools, signal } = params;\n const body: Record<string, unknown> = {\n model: config.model,\n messages: toOpenAIMessages(messages),\n stream: true,\n };\n // ponytail: generic OpenAI-compatible servers may reject stream_options;\n // request usage only on the known-compatible OpenRouter path.\n if (config.provider === \"openrouter\") {\n body.stream_options = { include_usage: true };\n }\n if (config.temperature !== undefined) body.temperature = config.temperature;\n if (config.maxTokens !== undefined) body.max_tokens = config.maxTokens;\n if (tools && tools.length > 0) {\n body.tools = tools.map((t) => ({\n type: \"function\",\n function: {\n name: t.name,\n description: t.description,\n parameters: t.inputSchema,\n },\n }));\n }\n\n const endpoint = buildEndpoint(config, \"/chat/completions\");\n const res = await fetch(endpoint, {\n method: \"POST\",\n headers: buildHeaders(config),\n body: JSON.stringify(body),\n signal,\n ...(config.credentials ? { credentials: config.credentials } : {}),\n });\n\n const responseBody = res.body;\n if (!res.ok) {\n await throwLlmRequestError(res);\n }\n if (!responseBody) {\n await throwLlmRequestError(res);\n }\n // ponytail: TS doesn't narrow after awaited Promise<never>\n const stream = responseBody!;\n\n // Track per-index buffered tool call info so we can emit a final\n // `tool-call-ready` with fully-parsed args.\n const buffers = new Map<\n number,\n { id: string; name: string; argsJson: string; started: boolean }\n >();\n\n for await (const ev of parseSSE(stream, signal)) {\n if (!ev.data || ev.data === \"[DONE]\") continue;\n let parsed: any;\n try {\n parsed = JSON.parse(ev.data);\n } catch {\n continue;\n }\n const usage = tokenUsageFromRecord(parsed?.usage);\n if (usage) {\n yield { type: \"usage\", usage };\n }\n const choice = parsed?.choices?.[0];\n if (!choice) continue;\n const delta = choice.delta ?? {};\n if (typeof delta.content === \"string\" && delta.content.length > 0) {\n yield { type: \"text-delta\", delta: delta.content };\n }\n if (Array.isArray(delta.tool_calls)) {\n for (const tc of delta.tool_calls) {\n const idx = typeof tc.index === \"number\" ? tc.index : 0;\n let buf = buffers.get(idx);\n if (!buf) {\n buf = {\n id: tc.id ?? `call_${idx}`,\n name: tc.function?.name ?? \"\",\n argsJson: \"\",\n started: false,\n };\n buffers.set(idx, buf);\n }\n if (tc.id && !buf.id.startsWith(\"call_\")) buf.id = tc.id;\n else if (tc.id) buf.id = tc.id;\n if (tc.function?.name) buf.name = tc.function.name;\n if (!buf.started && buf.name) {\n buf.started = true;\n yield {\n type: \"tool-call-start\",\n index: idx,\n toolCallId: buf.id,\n toolName: buf.name,\n };\n }\n const argsChunk: string | undefined = tc.function?.arguments;\n if (typeof argsChunk === \"string\" && argsChunk.length > 0) {\n buf.argsJson += argsChunk;\n if (buf.started) {\n yield {\n type: \"tool-call-args-delta\",\n index: idx,\n toolCallId: buf.id,\n toolName: buf.name,\n argsDelta: argsChunk,\n };\n }\n }\n }\n }\n if (choice.finish_reason) {\n for (const [idx, buf] of buffers) {\n let args: Record<string, unknown> = {};\n if (buf.argsJson) {\n try {\n args = JSON.parse(buf.argsJson);\n } catch {\n args = {};\n }\n }\n yield {\n type: \"tool-call-ready\",\n index: idx,\n toolCallId: buf.id,\n toolName: buf.name,\n args,\n };\n }\n buffers.clear();\n }\n }\n yield { type: \"done\" };\n}\n\nexport async function chat(params: ChatParams): Promise<{\n text: string;\n toolCalls: { id: string; name: string; args: Record<string, unknown> }[];\n}> {\n const { config, messages, tools, signal } = params;\n const body: Record<string, unknown> = {\n model: config.model,\n messages: toOpenAIMessages(messages),\n };\n if (config.temperature !== undefined) body.temperature = config.temperature;\n if (config.maxTokens !== undefined) body.max_tokens = config.maxTokens;\n if (tools && tools.length > 0) {\n body.tools = tools.map((t) => ({\n type: \"function\",\n function: {\n name: t.name,\n description: t.description,\n parameters: t.inputSchema,\n },\n }));\n }\n const endpoint = buildEndpoint(config, \"/chat/completions\");\n const res = await fetch(endpoint, {\n method: \"POST\",\n headers: buildHeaders(config),\n body: JSON.stringify(body),\n signal,\n ...(config.credentials ? { credentials: config.credentials } : {}),\n });\n if (!res.ok) {\n await throwLlmRequestError(res);\n }\n const json = await res.json();\n const choice = json?.choices?.[0]?.message;\n const text: string =\n typeof choice?.content === \"string\" ? choice.content : \"\";\n const toolCalls = Array.isArray(choice?.tool_calls)\n ? choice.tool_calls.map((tc: any) => {\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(tc?.function?.arguments ?? \"{}\");\n } catch {\n args = {};\n }\n return {\n id: tc.id,\n name: tc.function?.name ?? \"\",\n args,\n };\n })\n : [];\n return { text, toolCalls };\n}\n","import type {\n LlmStreamEvent,\n ProviderConfig,\n ProviderMessage,\n ProviderTool,\n} from \"../types.js\";\nimport * as anthropic from \"./anthropic.js\";\nimport * as google from \"./google.js\";\nimport * as ollama from \"./ollama/index.js\";\nimport * as openaiCompletions from \"./openai-chat-completions.js\";\n\ninterface ChatParams {\n config: ProviderConfig;\n messages: ProviderMessage[];\n tools?: ProviderTool[];\n signal?: AbortSignal;\n}\n\ninterface ChatResult {\n text: string;\n toolCalls: { id: string; name: string; args: Record<string, unknown> }[];\n}\n\n/** Patches ChatParams with OpenRouter's base URL and required headers. */\nfunction withOpenRouter(params: ChatParams): ChatParams {\n return {\n ...params,\n config: {\n ...params.config,\n baseUrl: \"https://openrouter.ai/api/v1\",\n extraHeaders: {\n \"HTTP-Referer\": \"https://inspector.mcp-use.com\",\n \"X-Title\": \"mcp-use Inspector\",\n },\n },\n };\n}\n\nexport function streamChat(\n params: ChatParams\n): AsyncGenerator<LlmStreamEvent, void, unknown> {\n switch (params.config.provider) {\n case \"openai\":\n throw new Error(\n \"provider 'openai' uses the Responses API via OpenAIResponsesDriver, not streamChat\"\n );\n case \"openai-compatible\":\n return openaiCompletions.streamChat(params);\n case \"anthropic\":\n return anthropic.streamChat(params);\n case \"google\":\n return google.streamChat(params);\n case \"openrouter\":\n return openaiCompletions.streamChat(withOpenRouter(params));\n case \"ollama\":\n return ollama.streamChat(params);\n default:\n throw new Error(`Unsupported LLM provider: ${params.config.provider}`);\n }\n}\n\nexport function chat(params: ChatParams): Promise<ChatResult> {\n switch (params.config.provider) {\n case \"openai\":\n throw new Error(\n \"provider 'openai' uses the Responses API via OpenAIResponsesDriver, not chat\"\n );\n case \"openai-compatible\":\n return openaiCompletions.chat(params);\n case \"anthropic\":\n return anthropic.chat(params);\n case \"google\":\n return google.chat(params);\n case \"openrouter\":\n return openaiCompletions.chat(withOpenRouter(params));\n case \"ollama\":\n return ollama.chat(params);\n default:\n throw new Error(`Unsupported LLM provider: ${params.config.provider}`);\n }\n}\n","import type { ProviderConfig } from \"../types.js\";\n\nexport const OPENAI_BASE_URL = \"https://api.openai.com/v1\";\n\nexport function buildEndpoint(config: ProviderConfig, path: string): string {\n const base = config.baseUrl ?? OPENAI_BASE_URL;\n return `${base.replace(/\\/$/, \"\")}${path}`;\n}\n\nexport function buildHeaders(config: ProviderConfig): Record<string, string> {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n ...config.extraHeaders,\n };\n if (config.apiKey) {\n headers.Authorization = `Bearer ${config.apiKey}`;\n }\n return headers;\n}\n\nexport async function readOpenAIError(res: Response): Promise<string> {\n const text = await res.text().catch(() => \"\");\n return `OpenAI request failed (${res.status} ${res.statusText}): ${text}`;\n}\n","import { parseSSE } from \"../sse.js\";\nimport {\n partitionToolContent,\n toolImageFollowupHeader,\n toolResultToContent,\n isToolResultError,\n} from \"../toolResultParts.js\";\nimport type {\n ContentPart,\n LlmStreamEvent,\n ProviderConfig,\n ProviderMessage,\n ProviderTool,\n} from \"../types.js\";\nimport {\n buildEndpoint,\n buildHeaders,\n readOpenAIError,\n} from \"./openai-shared.js\";\nimport { tokenUsageFromRecord } from \"../usage.js\";\n\nexport interface ResponsesSeed {\n instructions?: string;\n input: unknown[];\n}\n\ninterface ResponsesTurnParams {\n config: ProviderConfig;\n instructions?: string;\n input: unknown[];\n tools?: ProviderTool[];\n signal?: AbortSignal;\n}\n\nfunction toResponsesUserContent(content: string | ContentPart[]): unknown {\n if (typeof content === \"string\") return content;\n return content.map((p) => {\n if (p.type === \"text\") return { type: \"input_text\", text: p.text };\n return { type: \"input_image\", image_url: p.url };\n });\n}\n\n/** Seed Responses `input` from prior UI/history messages (once per tool-loop run). */\nexport function seedInputFromMessages(\n messages: ProviderMessage[]\n): ResponsesSeed {\n const systemParts: string[] = [];\n const input: unknown[] = [];\n\n for (const m of messages) {\n if (m.role === \"system\") {\n const text =\n typeof m.content === \"string\"\n ? m.content\n : m.content\n .filter((p) => p.type === \"text\")\n .map((p) => (p as { text: string }).text)\n .join(\"\\n\");\n if (text) systemParts.push(text);\n continue;\n }\n if (m.role === \"user\") {\n input.push({\n role: \"user\",\n content: toResponsesUserContent(m.content),\n });\n continue;\n }\n if (m.role === \"assistant\") {\n if (typeof m.content === \"string\" && m.content.length > 0) {\n input.push({\n type: \"message\",\n role: \"assistant\",\n content: [{ type: \"output_text\", text: m.content }],\n });\n }\n for (const tc of m.toolCalls ?? []) {\n input.push({\n type: \"function_call\",\n call_id: tc.id,\n name: tc.name,\n arguments: JSON.stringify(tc.args),\n });\n }\n continue;\n }\n if (m.role === \"tool\") {\n const { text, imageParts } = partitionToolContent(m.content);\n const fallback =\n imageParts.length > 0\n ? \"[image content; see next message]\"\n : \"[no content]\";\n input.push({\n type: \"function_call_output\",\n call_id: m.toolCallId,\n output: text || fallback,\n });\n if (imageParts.length > 0) {\n input.push({\n role: \"user\",\n content: [\n {\n type: \"input_text\",\n text: toolImageFollowupHeader(m.toolName, imageParts.length),\n },\n ...imageParts.map((p) => ({\n type: \"input_image\",\n image_url: p.url,\n })),\n ],\n });\n }\n }\n }\n\n return {\n instructions: systemParts.length > 0 ? systemParts.join(\"\\n\\n\") : undefined,\n input,\n };\n}\n\nexport function toResponsesTools(tools: ProviderTool[]): unknown[] {\n return tools.map((t) => ({\n type: \"function\",\n name: t.name,\n description: t.description,\n parameters: t.inputSchema,\n strict: false,\n }));\n}\n\nexport function serializeToolOutput(result: unknown): string {\n const content = toolResultToContent(result);\n if (typeof content === \"string\") return content;\n try {\n return JSON.stringify(content);\n } catch {\n return String(result);\n }\n}\n\nexport function appendToolOutputsToInput(\n input: unknown[],\n callId: string,\n toolName: string | undefined,\n result: unknown\n): void {\n const content = toolResultToContent(result);\n if (typeof content === \"string\") {\n input.push({\n type: \"function_call_output\",\n call_id: callId,\n output: content,\n });\n return;\n }\n const { text, imageParts } = partitionToolContent(content);\n input.push({\n type: \"function_call_output\",\n call_id: callId,\n output: text || \"[image content; see next message]\",\n });\n if (imageParts.length > 0) {\n input.push({\n role: \"user\",\n content: [\n {\n type: \"input_text\",\n text: toolImageFollowupHeader(toolName, imageParts.length),\n },\n ...imageParts.map((p) => ({\n type: \"input_image\",\n image_url: p.url,\n })),\n ],\n });\n }\n}\n\nfunction buildResponsesBody(\n params: ResponsesTurnParams,\n stream: boolean\n): Record<string, unknown> {\n const body: Record<string, unknown> = {\n model: params.config.model,\n input: params.input,\n store: false,\n include: [\"reasoning.encrypted_content\"],\n reasoning: { effort: params.config.reasoningEffort ?? \"low\" },\n stream,\n };\n if (params.instructions) body.instructions = params.instructions;\n if (params.tools && params.tools.length > 0) {\n body.tools = toResponsesTools(params.tools);\n }\n if (params.config.maxTokens !== undefined) {\n body.max_output_tokens = params.config.maxTokens;\n }\n return body;\n}\n\ninterface FunctionCallItem {\n call_id: string;\n name: string;\n arguments: string;\n}\n\nexport function extractFunctionCalls(output: unknown[]): FunctionCallItem[] {\n const calls: FunctionCallItem[] = [];\n for (const item of output) {\n if (!item || typeof item !== \"object\") continue;\n const row = item as Record<string, unknown>;\n if (row.type !== \"function_call\") continue;\n if (typeof row.call_id !== \"string\" || typeof row.name !== \"string\") {\n continue;\n }\n calls.push({\n call_id: row.call_id,\n name: row.name,\n arguments: typeof row.arguments === \"string\" ? row.arguments : \"{}\",\n });\n }\n return calls;\n}\n\nfunction extractMessageText(output: unknown[]): string {\n const parts: string[] = [];\n for (const item of output) {\n if (!item || typeof item !== \"object\") continue;\n const row = item as Record<string, unknown>;\n if (row.type !== \"message\" || row.role !== \"assistant\") continue;\n const content = row.content;\n if (!Array.isArray(content)) continue;\n for (const block of content) {\n if (!block || typeof block !== \"object\") continue;\n const b = block as Record<string, unknown>;\n if (b.type === \"output_text\" && typeof b.text === \"string\") {\n parts.push(b.text);\n }\n }\n }\n return parts.join(\"\");\n}\n\nfunction parseArgs(argsJson: string): Record<string, unknown> {\n if (!argsJson) return {};\n try {\n return JSON.parse(argsJson) as Record<string, unknown>;\n } catch {\n return {};\n }\n}\n\n/** Map Responses SSE JSON events → LlmStreamEvent; returns output[] from response.completed. */\nexport async function* streamResponsesTurn(\n params: ResponsesTurnParams\n): AsyncGenerator<LlmStreamEvent, unknown[], unknown> {\n const res = await fetch(buildEndpoint(params.config, \"/responses\"), {\n method: \"POST\",\n headers: buildHeaders(params.config),\n body: JSON.stringify(buildResponsesBody(params, true)),\n signal: params.signal,\n });\n\n if (!res.ok || !res.body) {\n throw new Error(await readOpenAIError(res));\n }\n\n const callBuffers = new Map<\n string,\n { index: number; name: string; argsJson: string; started: boolean }\n >();\n let nextIndex = 0;\n let completedOutput: unknown[] = [];\n\n for await (const ev of parseSSE(res.body, params.signal)) {\n if (!ev.data || ev.data === \"[DONE]\") continue;\n let parsed: Record<string, unknown>;\n try {\n parsed = JSON.parse(ev.data) as Record<string, unknown>;\n } catch {\n continue;\n }\n\n const type = typeof parsed.type === \"string\" ? parsed.type : ev.event;\n\n if (type === \"response.output_text.delta\") {\n const delta = parsed.delta;\n if (typeof delta === \"string\" && delta.length > 0) {\n yield { type: \"text-delta\", delta };\n }\n continue;\n }\n\n if (type === \"response.output_item.added\") {\n const item = parsed.item as Record<string, unknown> | undefined;\n if (item?.type === \"function_call\") {\n const callId =\n typeof item.call_id === \"string\" ? item.call_id : `call_${nextIndex}`;\n const name = typeof item.name === \"string\" ? item.name : \"\";\n const idx = nextIndex++;\n callBuffers.set(callId, {\n index: idx,\n name,\n argsJson: \"\",\n started: true,\n });\n yield {\n type: \"tool-call-start\",\n index: idx,\n toolCallId: callId,\n toolName: name,\n };\n }\n continue;\n }\n\n if (type === \"response.function_call_arguments.delta\") {\n const callId = typeof parsed.call_id === \"string\" ? parsed.call_id : \"\";\n const delta = typeof parsed.delta === \"string\" ? parsed.delta : \"\";\n const buf = callBuffers.get(callId);\n if (buf && delta.length > 0) {\n buf.argsJson += delta;\n yield {\n type: \"tool-call-args-delta\",\n index: buf.index,\n toolCallId: callId,\n toolName: buf.name,\n argsDelta: delta,\n };\n }\n continue;\n }\n\n if (type === \"response.function_call_arguments.done\") {\n const callId = typeof parsed.call_id === \"string\" ? parsed.call_id : \"\";\n const argsRaw =\n typeof parsed.arguments === \"string\" ? parsed.arguments : \"\";\n const buf = callBuffers.get(callId);\n if (buf) {\n if (argsRaw) buf.argsJson = argsRaw;\n yield {\n type: \"tool-call-ready\",\n index: buf.index,\n toolCallId: callId,\n toolName: buf.name,\n args: parseArgs(buf.argsJson || argsRaw),\n };\n }\n continue;\n }\n\n if (type === \"response.completed\") {\n const response = parsed.response as Record<string, unknown> | undefined;\n if (response && Array.isArray(response.output)) {\n completedOutput = response.output;\n }\n const usage = tokenUsageFromRecord(response?.usage);\n if (usage) {\n yield { type: \"usage\", usage };\n }\n continue;\n }\n\n if (type === \"error\") {\n const message =\n typeof parsed.message === \"string\"\n ? parsed.message\n : \"OpenAI Responses stream error\";\n yield { type: \"error\", message };\n return [];\n }\n }\n\n yield { type: \"done\" };\n return completedOutput;\n}\n\nexport async function completeResponsesTurn(\n params: ResponsesTurnParams\n): Promise<{\n text: string;\n output: unknown[];\n toolCalls: { id: string; name: string; args: Record<string, unknown> }[];\n}> {\n const res = await fetch(buildEndpoint(params.config, \"/responses\"), {\n method: \"POST\",\n headers: buildHeaders(params.config),\n body: JSON.stringify(buildResponsesBody(params, false)),\n signal: params.signal,\n });\n\n if (!res.ok) {\n throw new Error(await readOpenAIError(res));\n }\n\n const json = (await res.json()) as Record<string, unknown>;\n const status = json.status;\n if (status !== \"completed\" && status !== undefined) {\n throw new Error(`OpenAI response ended with status ${String(status)}`);\n }\n\n const output = Array.isArray(json.output) ? json.output : [];\n const fnCalls = extractFunctionCalls(output);\n const text =\n typeof json.output_text === \"string\"\n ? json.output_text\n : extractMessageText(output);\n\n return {\n text,\n output,\n toolCalls: fnCalls.map((c) => ({\n id: c.call_id,\n name: c.name,\n args: parseArgs(c.arguments),\n })),\n };\n}\n\nexport { isToolResultError };\n","import type { ToolLoopParams } from \"../toolLoop.js\";\nimport type {\n LlmDriver,\n LlmDriverCompleteParams,\n LlmDriverCompleteResult,\n LlmDriverStreamParams,\n} from \"../driver.js\";\nimport type { LlmStreamEvent, ProviderConfig } from \"../types.js\";\nimport {\n appendToolOutputsToInput,\n completeResponsesTurn,\n extractFunctionCalls,\n isToolResultError,\n seedInputFromMessages,\n streamResponsesTurn,\n} from \"./openai-responses.js\";\n\n/** OpenAI direct provider — Responses API only. */\nexport class OpenAIResponsesDriver implements LlmDriver {\n readonly managesToolLoop = true;\n\n constructor(private readonly config: ProviderConfig) {}\n\n stream(\n params: LlmDriverStreamParams\n ): AsyncGenerator<LlmStreamEvent, void, unknown> {\n return this.streamSingleTurn(params);\n }\n\n async complete(\n params: LlmDriverCompleteParams\n ): Promise<LlmDriverCompleteResult> {\n const { instructions, input } = seedInputFromMessages(params.messages);\n const result = await completeResponsesTurn({\n config: this.config,\n instructions,\n input,\n tools: params.tools,\n signal: params.signal,\n });\n return { text: result.text, toolCalls: result.toolCalls };\n }\n\n async *streamToolLoop(\n params: ToolLoopParams\n ): AsyncGenerator<LlmStreamEvent, void, unknown> {\n const { instructions, input: seeded } = seedInputFromMessages(\n params.messages\n );\n const input: unknown[] = [...seeded];\n const maxSteps = params.maxSteps ?? 10;\n\n for (let step = 0; step < maxSteps; step++) {\n if (params.signal?.aborted) return;\n\n const turn = streamResponsesTurn({\n config: this.config,\n instructions,\n input,\n tools: params.tools,\n signal: params.signal,\n });\n\n let output: unknown[] = [];\n for (;;) {\n const next = await turn.next();\n if (next.done) {\n output = (next.value as unknown[]) ?? [];\n break;\n }\n yield next.value;\n if (next.value.type === \"error\") return;\n }\n\n input.push(...output);\n const functionCalls = extractFunctionCalls(output);\n if (functionCalls.length === 0) return;\n\n for (const call of functionCalls) {\n if (params.signal?.aborted) return;\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(call.arguments) as Record<string, unknown>;\n } catch {\n args = {};\n }\n\n let result: unknown;\n let isError = false;\n try {\n result = await params.callTool(call.name, args);\n isError = isToolResultError(result);\n } catch (err) {\n isError = true;\n result = {\n isError: true,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n\n appendToolOutputsToInput(input, call.call_id, call.name, result);\n yield {\n type: \"tool-result\",\n toolCallId: call.call_id,\n toolName: call.name,\n result,\n isError,\n };\n }\n }\n }\n\n async runToolLoopNonStreaming(params: ToolLoopParams): Promise<{\n content: string;\n toolCalls: {\n toolName: string;\n args: Record<string, unknown>;\n result: unknown;\n }[];\n }> {\n const { instructions, input: seeded } = seedInputFromMessages(\n params.messages\n );\n const input: unknown[] = [...seeded];\n const maxSteps = params.maxSteps ?? 10;\n const transcriptToolCalls: {\n toolName: string;\n args: Record<string, unknown>;\n result: unknown;\n }[] = [];\n let finalText = \"\";\n\n for (let step = 0; step < maxSteps; step++) {\n if (params.signal?.aborted) break;\n\n const turn = await completeResponsesTurn({\n config: this.config,\n instructions,\n input,\n tools: params.tools,\n signal: params.signal,\n });\n\n input.push(...turn.output);\n if (turn.toolCalls.length === 0) {\n finalText = turn.text;\n break;\n }\n\n for (const tc of turn.toolCalls) {\n let result: unknown;\n let isError = false;\n try {\n result = await params.callTool(tc.name, tc.args);\n isError = isToolResultError(result);\n } catch (err) {\n isError = true;\n result = {\n isError: true,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n transcriptToolCalls.push({\n toolName: tc.name,\n args: tc.args,\n result,\n });\n appendToolOutputsToInput(input, tc.id, tc.name, result);\n void isError;\n }\n }\n\n return { content: finalText, toolCalls: transcriptToolCalls };\n }\n\n private async *streamSingleTurn(\n params: LlmDriverStreamParams\n ): AsyncGenerator<LlmStreamEvent, void, unknown> {\n const { instructions, input } = seedInputFromMessages(params.messages);\n const turn = streamResponsesTurn({\n config: this.config,\n instructions,\n input,\n tools: params.tools,\n signal: params.signal,\n });\n for (;;) {\n const next = await turn.next();\n if (next.done) return;\n yield next.value;\n if (next.value.type === \"error\") return;\n }\n }\n}\n","import { chat, streamChat } from \"./providers/index.js\";\nimport type {\n LlmStreamEvent,\n ProviderConfig,\n ProviderMessage,\n ProviderTool,\n ProviderToolCall,\n} from \"./types.js\";\nimport type { ToolLoopParams } from \"./toolLoop.js\";\nimport { OpenAIResponsesDriver } from \"./providers/openai-responses-driver.js\";\n\nexport interface LlmDriverStreamParams {\n messages: ProviderMessage[];\n tools: ProviderTool[];\n signal?: AbortSignal;\n}\n\nexport interface LlmDriverCompleteParams extends LlmDriverStreamParams {\n messages: ProviderMessage[];\n tools: ProviderTool[];\n signal?: AbortSignal;\n}\n\nexport interface LlmDriverCompleteResult {\n text: string;\n toolCalls: ProviderToolCall[];\n}\n\n/** Pluggable LLM backend for the native tool loop. */\nexport interface LlmDriver {\n readonly managesToolLoop?: boolean;\n stream(\n params: LlmDriverStreamParams\n ): AsyncGenerator<LlmStreamEvent, void, unknown>;\n complete(params: LlmDriverCompleteParams): Promise<LlmDriverCompleteResult>;\n streamToolLoop?(\n params: ToolLoopParams\n ): AsyncGenerator<LlmStreamEvent, void, unknown>;\n runToolLoopNonStreaming?(params: ToolLoopParams): Promise<{\n content: string;\n toolCalls: {\n toolName: string;\n args: Record<string, unknown>;\n result: unknown;\n }[];\n }>;\n}\n\nexport function createLlmDriver(config: ProviderConfig): LlmDriver {\n if (config.provider === \"openai\") {\n return new OpenAIResponsesDriver(config);\n }\n return new RestLlmDriver(config);\n}\n\n/** Raw fetch + SSE/NDJSON providers (non-OpenAI and legacy proxy paths). */\nexport class RestLlmDriver implements LlmDriver {\n constructor(private readonly config: ProviderConfig) {}\n\n stream(\n params: LlmDriverStreamParams\n ): AsyncGenerator<LlmStreamEvent, void, unknown> {\n return streamChat({\n config: this.config,\n messages: params.messages,\n tools: params.tools,\n signal: params.signal,\n });\n }\n\n async complete(\n params: LlmDriverCompleteParams\n ): Promise<LlmDriverCompleteResult> {\n const result = await chat({\n config: this.config,\n messages: params.messages,\n tools: params.tools,\n signal: params.signal,\n });\n return { text: result.text, toolCalls: result.toolCalls };\n }\n}\n","import { isToolResultError, toolResultToContent } from \"./toolResultParts.js\";\nimport type { LlmDriver } from \"./driver.js\";\nimport { LlmRequestError } from \"./providers/openai-chat-completions.js\";\nimport type { LlmStreamEvent, ProviderMessage, ProviderTool } from \"./types.js\";\n\ninterface ToolCallFn {\n (name: string, args: Record<string, unknown>): Promise<unknown>;\n}\n\nexport interface ToolLoopParams {\n driver: LlmDriver;\n /** Initial conversation history + the user turn that triggers the run. */\n messages: ProviderMessage[];\n /** Tools available to the LLM (already filtered by the caller). */\n tools: ProviderTool[];\n /** Executes an MCP tool and returns its raw result. */\n callTool: ToolCallFn;\n /** Cap on assistant↔tool turns. */\n maxSteps?: number;\n signal?: AbortSignal;\n}\n\n/**\n * Provider-agnostic tool loop. Streams the assistant response, executes any\n * tool calls via `callTool`, appends their results, and continues until the\n * assistant produces a response with no more tool calls, or `maxSteps` is\n * exhausted.\n *\n * This replaces MCPAgent.streamEvents() without pulling in langchain.\n */\nexport async function* runToolLoop(\n params: ToolLoopParams\n): AsyncGenerator<LlmStreamEvent, void, unknown> {\n if (params.driver.managesToolLoop && params.driver.streamToolLoop) {\n yield* params.driver.streamToolLoop(params);\n return;\n }\n\n const { driver, tools, callTool, signal } = params;\n const maxSteps = params.maxSteps ?? 10;\n const messages: ProviderMessage[] = [...params.messages];\n\n for (let step = 0; step < maxSteps; step++) {\n if (signal?.aborted) return;\n\n // Buffer tool calls from this turn and assistant text so we can append\n // them to the running transcript before dispatching tools.\n const pendingToolCalls: {\n id: string;\n name: string;\n args: Record<string, unknown>;\n }[] = [];\n let assistantText = \"\";\n\n try {\n for await (const ev of driver.stream({\n messages,\n tools,\n signal,\n })) {\n if (ev.type === \"text-delta\") {\n assistantText += ev.delta;\n } else if (ev.type === \"tool-call-ready\") {\n pendingToolCalls.push({\n id: ev.toolCallId,\n name: ev.toolName,\n args: ev.args,\n });\n }\n yield ev;\n }\n } catch (err) {\n // Preserve structured HTTP errors (429 loginRequired, 402 credits, …) so\n // hosted-inspector UI can show the managed-chat notice instead of a raw\n // \"OpenAI request failed …\" bubble.\n if (err instanceof LlmRequestError) {\n throw err;\n }\n yield {\n type: \"error\",\n message: err instanceof Error ? err.message : String(err),\n };\n return;\n }\n\n if (pendingToolCalls.length === 0) {\n // Assistant produced a final answer; we've already yielded `done`.\n return;\n }\n\n // Record assistant turn (text + tool calls) in conversation history.\n messages.push({\n role: \"assistant\",\n content: assistantText,\n toolCalls: pendingToolCalls,\n });\n\n // Dispatch tool calls sequentially. Sequential keeps ordering\n // deterministic and avoids provider-specific parallel-call quirks.\n for (const tc of pendingToolCalls) {\n if (signal?.aborted) return;\n let result: unknown;\n let isError = false;\n try {\n result = await callTool(tc.name, tc.args);\n isError = isToolResultError(result);\n } catch (err) {\n isError = true;\n result = {\n isError: true,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n messages.push({\n role: \"tool\",\n content: toolResultToContent(result),\n toolCallId: tc.id,\n toolName: tc.name,\n toolResult: result,\n toolIsError: isError,\n });\n yield {\n type: \"tool-result\",\n toolCallId: tc.id,\n toolName: tc.name,\n result,\n isError,\n };\n }\n }\n}\n\n/**\n * Non-streaming helper used by the server-side `handleChatRequest` path.\n * Runs the same tool loop but collects the final assistant text and tool\n * invocations into a result object.\n */\nexport async function runToolLoopNonStreaming(params: ToolLoopParams): Promise<{\n content: string;\n toolCalls: {\n toolName: string;\n args: Record<string, unknown>;\n result: unknown;\n }[];\n}> {\n if (params.driver.managesToolLoop && params.driver.runToolLoopNonStreaming) {\n return params.driver.runToolLoopNonStreaming(params);\n }\n\n const { driver, tools, callTool, signal } = params;\n const maxSteps = params.maxSteps ?? 10;\n const messages: ProviderMessage[] = [...params.messages];\n const transcriptToolCalls: {\n toolName: string;\n args: Record<string, unknown>;\n result: unknown;\n }[] = [];\n let finalText = \"\";\n\n for (let step = 0; step < maxSteps; step++) {\n if (signal?.aborted) break;\n const { text, toolCalls } = await driver.complete({\n messages,\n tools,\n signal,\n });\n if (toolCalls.length === 0) {\n finalText = text;\n break;\n }\n messages.push({\n role: \"assistant\",\n content: text,\n toolCalls,\n });\n for (const tc of toolCalls) {\n let result: unknown;\n let isError = false;\n try {\n result = await callTool(tc.name, tc.args);\n isError = isToolResultError(result);\n } catch (err) {\n isError = true;\n result = {\n isError: true,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n transcriptToolCalls.push({\n toolName: tc.name,\n args: tc.args,\n result,\n });\n messages.push({\n role: \"tool\",\n content: toolResultToContent(result),\n toolCallId: tc.id,\n toolName: tc.name,\n toolResult: result,\n toolIsError: isError,\n });\n }\n }\n\n return { content: finalText, toolCalls: transcriptToolCalls };\n}\n","import type { LlmDriver } from \"./driver.js\";\nimport { runToolLoop, runToolLoopNonStreaming } from \"./toolLoop.js\";\nimport type { LlmStreamEvent, ProviderMessage, ProviderTool } from \"./types.js\";\n\nexport interface NativeRunOptions {\n messages: ProviderMessage[];\n tools: ProviderTool[];\n callTool: (name: string, args: Record<string, unknown>) => Promise<unknown>;\n maxSteps?: number;\n signal?: AbortSignal;\n}\n\nexport interface AgentStep {\n action: {\n tool: string;\n toolInput: Record<string, unknown>;\n log: string;\n };\n observation: string;\n}\n\n/** Internal native agent runtime: loop → fetch + callTool. */\nexport async function* streamNativeAgent(\n driver: LlmDriver,\n options: NativeRunOptions\n): AsyncGenerator<LlmStreamEvent, void, unknown> {\n yield* runToolLoop({\n driver,\n messages: options.messages,\n tools: options.tools,\n callTool: options.callTool,\n maxSteps: options.maxSteps,\n signal: options.signal,\n });\n}\n\n/** Map LlmStreamEvent stream to legacy AgentStep yields for MCPAgent.stream(). */\nexport async function* streamNativeAgentSteps(\n driver: LlmDriver,\n options: NativeRunOptions\n): AsyncGenerator<AgentStep, string, void> {\n let finalText = \"\";\n let pendingStep: AgentStep | null = null;\n\n for await (const ev of streamNativeAgent(driver, options)) {\n if (ev.type === \"text-delta\") {\n finalText += ev.delta;\n } else if (ev.type === \"tool-call-ready\") {\n pendingStep = {\n action: {\n tool: ev.toolName,\n toolInput: ev.args,\n log: `Calling tool ${ev.toolName}`,\n },\n observation: \"\",\n };\n yield pendingStep;\n } else if (ev.type === \"tool-result\" && pendingStep) {\n const observation =\n typeof ev.result === \"string\"\n ? ev.result\n : JSON.stringify(ev.result ?? \"\");\n yield {\n action: pendingStep.action,\n observation,\n };\n pendingStep = null;\n } else if (ev.type === \"error\") {\n throw new Error(ev.message);\n }\n }\n\n return finalText;\n}\n\nexport async function runNativeAgent(\n driver: LlmDriver,\n options: NativeRunOptions\n): Promise<string> {\n const result = await runToolLoopNonStreaming({\n driver,\n messages: options.messages,\n tools: options.tools,\n callTool: options.callTool,\n maxSteps: options.maxSteps,\n signal: options.signal,\n });\n return result.content;\n}\n","import { logger } from \"@mcp-use/client\";\nimport type { ProviderConfig, ProviderName } from \"./types.js\";\n\nexport interface NativeLLMConfig {\n apiKey?: string;\n temperature?: number;\n maxTokens?: number;\n baseUrl?: string;\n extraHeaders?: Record<string, string>;\n credentials?: RequestCredentials;\n}\n\nconst PROVIDER_ENV: Record<string, string[]> = {\n openai: [\"OPENAI_API_KEY\"],\n anthropic: [\"ANTHROPIC_API_KEY\"],\n google: [\"GOOGLE_API_KEY\", \"GOOGLE_GENERATIVE_AI_API_KEY\"],\n openrouter: [\"OPENROUTER_API_KEY\"],\n ollama: [],\n \"openai-compatible\": [\"OPENAI_API_KEY\"],\n};\n\nfunction resolveApiKey(provider: string, config?: NativeLLMConfig): string {\n if (config?.apiKey) return config.apiKey;\n const envVars = PROVIDER_ENV[provider] ?? [];\n if (typeof process !== \"undefined\" && process.env) {\n for (const envVar of envVars) {\n const key = process.env[envVar];\n if (key) {\n logger.debug(`Using API key from ${envVar} for ${provider}`);\n return key;\n }\n }\n }\n if (provider === \"ollama\") return \"\";\n const hint =\n envVars.length > 0 ? envVars.join(\" or \") : \"apiKey in llmConfig\";\n throw new Error(`API key not found for provider '${provider}'. Set ${hint}.`);\n}\n\n/** Parse \"provider/model\" into native ProviderConfig (no LangChain). */\nexport function parseLLMStringToProviderConfig(\n llmString: string,\n config?: NativeLLMConfig\n): ProviderConfig {\n const parts = llmString.split(\"/\");\n if (parts.length < 2) {\n throw new Error(\n `Invalid LLM string '${llmString}'. Expected 'provider/model'.`\n );\n }\n const provider = parts[0].toLowerCase();\n const model = parts.slice(1).join(\"/\");\n const supported: ProviderName[] = [\n \"openai\",\n \"anthropic\",\n \"google\",\n \"openrouter\",\n \"ollama\",\n \"openai-compatible\",\n ];\n if (!supported.includes(provider as ProviderName)) {\n throw new Error(\n `Unsupported provider '${provider}'. Supported: ${supported.join(\", \")}`\n );\n }\n return {\n provider: provider as ProviderName,\n model,\n apiKey: resolveApiKey(provider, config),\n temperature: config?.temperature,\n maxTokens: config?.maxTokens,\n baseUrl: config?.baseUrl,\n extraHeaders: config?.extraHeaders,\n credentials: config?.credentials,\n };\n}\n\nexport function providerConfigFromOptions(\n provider: ProviderName,\n model: string,\n config?: NativeLLMConfig\n): ProviderConfig {\n return {\n provider,\n model,\n apiKey: resolveApiKey(provider, config),\n temperature: config?.temperature,\n maxTokens: config?.maxTokens,\n baseUrl: config?.baseUrl,\n extraHeaders: config?.extraHeaders,\n credentials: config?.credentials,\n };\n}\n","declare const __MCP_USE_PACKAGE_VERSION__: string;\n\nexport const VERSION = __MCP_USE_PACKAGE_VERSION__;\n\nexport function getPackageVersion(): string {\n return VERSION;\n}\n","import type { ZodSchema } from \"zod\";\nimport type { ProviderMessage } from \"../llm/types.js\";\nimport type { RunOptions } from \"./run_options.js\";\n\nexport function normalizeRunOptions<T>(\n queryOrOptions: string | RunOptions<T>,\n maxSteps?: number,\n manageConnector?: boolean,\n _externalHistory?: unknown,\n outputSchema?: ZodSchema<T>,\n signal?: AbortSignal\n): {\n prompt?: string;\n maxSteps?: number;\n manageConnector?: boolean;\n messages?: ProviderMessage[];\n schema?: ZodSchema<T>;\n signal?: AbortSignal;\n} {\n if (typeof queryOrOptions === \"object\" && queryOrOptions !== null) {\n return {\n prompt: queryOrOptions.prompt,\n maxSteps: queryOrOptions.maxSteps,\n manageConnector: queryOrOptions.manageConnector,\n messages: queryOrOptions.messages,\n schema: queryOrOptions.schema,\n signal: queryOrOptions.signal,\n };\n }\n return {\n prompt: queryOrOptions as string,\n maxSteps,\n manageConnector,\n schema: outputSchema,\n signal,\n };\n}\n","/**\n * Remote agent implementation for executing agents via API.\n */\n\nimport type { ZodSchema } from \"zod\";\nimport { toJSONSchema } from \"zod\";\nimport { logger } from \"@mcp-use/client\";\nimport type { RunOptions } from \"./run_options.js\";\nimport type { BaseMessage } from \"./types.js\";\n\n// API endpoint constants\nconst API_CHATS_ENDPOINT = \"/api/v1/chats\";\nconst API_CHAT_EXECUTE_ENDPOINT = \"/api/v1/chats/{chat_id}/execute\";\n\n/**\n * Helper function to normalize run options for remote agent\n */\nfunction normalizeRemoteRunOptions<T>(\n queryOrOptions: string | RunOptions<T>,\n maxSteps?: number,\n manageConnector?: boolean,\n externalHistory?: BaseMessage[],\n outputSchema?: ZodSchema<T>\n): {\n query: string;\n maxSteps?: number;\n manageConnector?: boolean;\n externalHistory?: BaseMessage[];\n outputSchema?: ZodSchema<T>;\n} {\n // Check if first argument is an options object\n if (typeof queryOrOptions === \"object\" && queryOrOptions !== null) {\n const options = queryOrOptions as RunOptions<T>;\n return {\n query: options.prompt ?? \"\",\n maxSteps: options.maxSteps,\n manageConnector: options.manageConnector,\n externalHistory: options.externalHistory,\n outputSchema: options.schema,\n };\n }\n\n // Old-style positional arguments\n return {\n query: queryOrOptions as string,\n maxSteps,\n manageConnector,\n externalHistory,\n outputSchema,\n };\n}\n\nexport class RemoteAgent {\n private agentId: string;\n private apiKey: string;\n private baseUrl: string;\n private chatId: string | null = null;\n\n constructor(options: { agentId: string; apiKey?: string; baseUrl?: string }) {\n this.agentId = options.agentId;\n this.baseUrl = options.baseUrl ?? \"https://cloud.manufact.com\";\n\n // Handle API key validation\n const apiKey =\n options.apiKey ??\n (typeof process !== \"undefined\" && process.env?.MCP_USE_API_KEY);\n if (!apiKey) {\n throw new Error(\n \"API key is required for remote execution. \" +\n \"Please provide it as a parameter or set the MCP_USE_API_KEY environment variable. \" +\n \"You can get an API key from https://cloud.manufact.com\"\n );\n }\n this.apiKey = apiKey;\n }\n\n private pydanticToJsonSchema<T>(schema: ZodSchema<T>): any {\n /**\n * Convert a Zod schema to JSON schema for API transmission.\n */\n return toJSONSchema(schema);\n }\n\n private parseStructuredResponse<T>(\n responseData: any,\n outputSchema: ZodSchema<T>\n ): T {\n /**\n * Parse the API response into the structured output format.\n */\n let resultData: any;\n\n // Handle different response formats\n if (typeof responseData === \"object\" && responseData !== null) {\n if (\"result\" in responseData) {\n const outerResult = responseData.result;\n // Check if this is a nested result structure (agent execution response)\n if (\n typeof outerResult === \"object\" &&\n outerResult !== null &&\n \"result\" in outerResult\n ) {\n // Extract the actual structured output from the nested result\n resultData = outerResult.result;\n } else {\n // Use the outer result directly\n resultData = outerResult;\n }\n } else {\n resultData = responseData;\n }\n } else if (typeof responseData === \"string\") {\n try {\n resultData = JSON.parse(responseData);\n } catch {\n // If it's not valid JSON, try to create the model from the string content\n resultData = { content: responseData };\n }\n } else {\n resultData = responseData;\n }\n\n // Parse into the Zod schema\n try {\n return outputSchema.parse(resultData);\n } catch (e) {\n logger.warn(`Failed to parse structured output: ${e}`);\n // Fallback: try to parse it as raw content if the schema has a content field\n const schemaShape = (outputSchema as any)._def?.shape();\n if (schemaShape && \"content\" in schemaShape) {\n return outputSchema.parse({ content: String(resultData) });\n }\n throw e;\n }\n }\n\n private async createChatSession(): Promise<string> {\n /**\n * Create a persistent chat session for the agent.\n */\n const chatPayload = {\n title: `Remote Agent Session - ${this.agentId}`,\n agent_id: this.agentId,\n type: \"agent_execution\",\n };\n\n const headers = {\n \"Content-Type\": \"application/json\",\n \"x-api-key\": this.apiKey,\n };\n const chatUrl = `${this.baseUrl}${API_CHATS_ENDPOINT}`;\n\n logger.debug(`📝 Creating chat session for agent ${this.agentId}`);\n\n try {\n const response = await fetch(chatUrl, {\n method: \"POST\",\n headers,\n body: JSON.stringify(chatPayload),\n });\n\n if (!response.ok) {\n const responseText = await response.text();\n const statusCode = response.status;\n\n if (statusCode === 404) {\n throw new Error(\n `Agent not found: Agent '${this.agentId}' does not exist or you don't have access to it. ` +\n \"Please verify the agent ID and ensure it exists in your account.\"\n );\n }\n throw new Error(\n `Failed to create chat session: ${statusCode} - ${responseText}`\n );\n }\n\n const chatData = await response.json();\n const chatId = chatData.id;\n logger.debug(`✅ Chat session created: ${chatId}`);\n return chatId;\n } catch (e) {\n if (e instanceof Error) {\n throw new TypeError(`Failed to create chat session: ${e.message}`);\n }\n throw new Error(`Failed to create chat session: ${String(e)}`);\n }\n }\n\n /**\n * Runs the remote agent with options object and returns a promise for the final result.\n */\n public async run(options: RunOptions): Promise<string>;\n\n /**\n * Runs the remote agent with options object and structured output.\n */\n public async run<T>(options: RunOptions<T>): Promise<T>;\n\n /**\n * Runs the remote agent and returns a promise for the final result.\n * @deprecated Use options object instead: run({ prompt, maxSteps, ... })\n */\n public async run<T = string>(\n query: string,\n maxSteps?: number,\n manageConnector?: boolean,\n externalHistory?: BaseMessage[],\n outputSchema?: ZodSchema<T>\n ): Promise<T>;\n\n public async run<T = string>(\n queryOrOptions: string | RunOptions<T>,\n maxSteps?: number,\n manageConnector?: boolean,\n externalHistory?: BaseMessage[],\n outputSchema?: ZodSchema<T>\n ): Promise<T> {\n /**\n * Run a query on the remote agent.\n */\n // Normalize input to internal parameters\n const {\n query,\n maxSteps: steps,\n externalHistory: history,\n outputSchema: schema,\n } = normalizeRemoteRunOptions(\n queryOrOptions,\n maxSteps,\n manageConnector,\n externalHistory,\n outputSchema\n );\n\n if (history !== undefined) {\n logger.warn(\"External history is not yet supported for remote execution\");\n }\n\n try {\n logger.debug(`🌐 Executing query on remote agent ${this.agentId}`);\n\n // Step 1: Create a chat session for this agent (only if we don't have one)\n if (this.chatId === null) {\n this.chatId = await this.createChatSession();\n }\n\n const chatId = this.chatId;\n\n // Step 2: Execute the agent within the chat context\n const executionPayload: any = {\n query,\n max_steps: steps ?? 10,\n };\n\n // Add structured output schema if provided\n if (schema) {\n executionPayload.output_schema = this.pydanticToJsonSchema(schema);\n logger.debug(`🔧 Using structured output with schema`);\n }\n\n const headers = {\n \"Content-Type\": \"application/json\",\n \"x-api-key\": this.apiKey,\n };\n const executionUrl = `${this.baseUrl}${API_CHAT_EXECUTE_ENDPOINT.replace(\"{chat_id}\", chatId)}`;\n logger.debug(`🚀 Executing agent in chat ${chatId}`);\n\n const response = await fetch(executionUrl, {\n method: \"POST\",\n headers,\n body: JSON.stringify(executionPayload),\n signal: AbortSignal.timeout(300000), // 5 minute timeout\n });\n\n if (!response.ok) {\n const responseText = await response.text();\n const statusCode = response.status;\n\n // Provide specific error messages based on status code\n if (statusCode === 401) {\n logger.error(`❌ Authentication failed: ${responseText}`);\n throw new Error(\n \"Authentication failed: Invalid or missing API key. \" +\n \"Please check your API key and ensure the MCP_USE_API_KEY environment variable is set correctly.\"\n );\n } else if (statusCode === 403) {\n logger.error(`❌ Access forbidden: ${responseText}`);\n throw new Error(\n `Access denied: You don't have permission to execute agent '${this.agentId}'. ` +\n \"Check if the agent exists and you have the necessary permissions.\"\n );\n } else if (statusCode === 404) {\n logger.error(`❌ Agent not found: ${responseText}`);\n throw new Error(\n `Agent not found: Agent '${this.agentId}' does not exist or you don't have access to it. ` +\n \"Please verify the agent ID and ensure it exists in your account.\"\n );\n } else if (statusCode === 422) {\n logger.error(`❌ Validation error: ${responseText}`);\n throw new Error(\n `Request validation failed: ${responseText}. ` +\n \"Please check your query parameters and output schema format.\"\n );\n } else if (statusCode === 500) {\n logger.error(`❌ Server error: ${responseText}`);\n throw new Error(\n \"Internal server error occurred during agent execution. \" +\n \"Please try again later or contact support if the issue persists.\"\n );\n } else {\n logger.error(\n `❌ Remote execution failed with status ${statusCode}: ${responseText}`\n );\n throw new Error(\n `Remote agent execution failed: ${statusCode} - ${responseText}`\n );\n }\n }\n\n const result = await response.json();\n logger.debug(`🔧 Response: ${JSON.stringify(result)}`);\n logger.debug(\"✅ Remote execution completed successfully\");\n\n // Check for error responses (even with 200 status)\n if (typeof result === \"object\" && result !== null) {\n // Check for actual error conditions (not just presence of error field)\n if (result.status === \"error\" || result.error !== null) {\n const errorMsg = result.error ?? String(result);\n logger.error(`❌ Remote agent execution failed: ${errorMsg}`);\n throw new Error(`Remote agent execution failed: ${errorMsg}`);\n }\n\n // Check if the response indicates agent initialization failure\n if (String(result).includes(\"failed to initialize\")) {\n logger.error(`❌ Agent initialization failed: ${result}`);\n throw new Error(\n \"Agent initialization failed on remote server. \" +\n \"This usually indicates:\\n\" +\n \"• Invalid agent configuration (LLM model, system prompt)\\n\" +\n \"• Missing or invalid MCP server configurations\\n\" +\n \"• Network connectivity issues with MCP servers\\n\" +\n \"• Missing environment variables or credentials\\n\" +\n `Raw error: ${result}`\n );\n }\n }\n\n // Handle structured output\n if (schema) {\n return this.parseStructuredResponse(result, schema);\n }\n\n // Regular string output\n if (typeof result === \"object\" && result !== null && \"result\" in result) {\n return result.result as T;\n } else if (typeof result === \"string\") {\n return result as T;\n } else {\n return String(result) as T;\n }\n } catch (e) {\n if (e instanceof Error) {\n // Check for specific error types\n if (e.name === \"AbortError\") {\n logger.error(`❌ Remote execution timed out: ${e}`);\n throw new Error(\n \"Remote agent execution timed out. The server may be overloaded or the query is taking too long to \" +\n \"process. Try again or use a simpler query.\"\n );\n }\n logger.error(`❌ Remote execution error: ${e}`);\n throw new Error(`Remote agent execution failed: ${e.message}`);\n }\n logger.error(`❌ Remote execution error: ${e}`);\n throw new Error(`Remote agent execution failed: ${String(e)}`);\n }\n }\n\n /**\n * Streams the remote agent execution with options object.\n */\n public stream(options: RunOptions): AsyncGenerator<any, string, void>;\n\n /**\n * Streams the remote agent execution with options object and structured output.\n */\n public stream<T>(options: RunOptions<T>): AsyncGenerator<any, T, void>;\n\n /**\n * Streams the remote agent execution.\n * @deprecated Use options object instead: stream({ prompt, maxSteps, ... })\n */\n public stream<T = string>(\n query: string,\n maxSteps?: number,\n manageConnector?: boolean,\n externalHistory?: BaseMessage[],\n outputSchema?: ZodSchema<T>\n ): AsyncGenerator<any, T, void>;\n\n // eslint-disable-next-line require-yield\n public async *stream<T = string>(\n queryOrOptions: string | RunOptions<T>,\n maxSteps?: number,\n manageConnector?: boolean,\n externalHistory?: BaseMessage[],\n outputSchema?: ZodSchema<T>\n ): AsyncGenerator<any, T, void> {\n /**\n * Stream implementation for remote agent - currently just wraps run.\n * In the future, this could be enhanced to support actual streaming from the API.\n */\n const result = await this.run(\n queryOrOptions as any,\n maxSteps,\n manageConnector,\n externalHistory,\n outputSchema\n );\n return result;\n }\n\n public async close(): Promise<void> {\n /**\n * Close the remote agent connection.\n */\n logger.debug(\"🔌 Remote agent client closed\");\n // In the future, we might want to delete the chat session here\n // if (this.chatId) {\n // await this.deleteChatSession(this.chatId)\n // }\n }\n}\n","import { createLlmDriver } from \"./driver.js\";\nimport type { ProviderConfig, ProviderMessage } from \"./types.js\";\n\n/** Single-shot chat completion without tools (sampling, props generation). */\nexport async function completeChat(params: {\n config: ProviderConfig;\n messages: ProviderMessage[];\n signal?: AbortSignal;\n}): Promise<string> {\n const driver = createLlmDriver(params.config);\n const result = await driver.complete({\n messages: params.messages,\n tools: [],\n signal: params.signal,\n });\n return result.text;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACEA,IAAAA,iBAAuB;;;ACIvB,IAAAC,iBAAuB;;;ACJvB,oBAAuB;AAQhB,IAAe,cAAf,MAA8B;AAAA;AAAA;AAAA;AAAA,EAIhB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMF,mBAA4C,oBAAI,IAAI;AAAA,EAErE,YAAY,iBAA4B;AACtC,SAAK,kBAAkB,mBAAmB,CAAC;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,aAAa,YAEX,QACA,iBACkB;AAElB,UAAM,UAAU,IAAI,KAAK,eAAe;AAGxC,QACE,CAAC,OAAO,kBACR,OAAO,KAAK,OAAO,cAAc,EAAE,WAAW,GAC9C;AACA,2BAAO,MAAM,gDAAgD;AAC7D,YAAM,OAAO,kBAAkB;AAAA,IACjC;AAGA,UAAM,WAAW,OAAO,qBAAqB;AAG7C,UAAM,aAA8B,OAAO,OAAO,QAAQ,EAAE;AAAA,MAC1D,CAAC,YAAY,QAAQ;AAAA,IACvB;AAGA,WAAO,QAAQ,0BAA0B,UAAU;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,sBAAsB,WAAwC;AAElE,QAAI,KAAK,iBAAiB,IAAI,SAAS,GAAG;AACxC,YAAM,SAAS,KAAK,iBAAiB,IAAI,SAAS;AAClD,2BAAO,MAAM,aAAa,OAAO,MAAM,+BAA+B;AACtE,aAAO;AAAA,IACT;AAEA,UAAM,iBAAsB,CAAC;AAG7B,UAAM,UAAU,MAAM,KAAK,2BAA2B,SAAS;AAC/D,QAAI,CAAC,SAAS;AACZ,aAAO,CAAC;AAAA,IACV;AAGA,eAAW,QAAQ,UAAU,OAAO;AAClC,YAAM,YAAY,KAAK,YAAY,MAAM,SAAS;AAClD,UAAI,WAAW;AACb,uBAAe,KAAK,SAAS;AAAA,MAC/B;AAAA,IACF;AAGA,SAAK,iBAAiB,IAAI,WAAW,cAAc;AAGnD,yBAAO;AAAA,MACL,UAAU,eAAe,MAAM,6BAA6B,eACzD,IAAI,CAAC,MAAW,GAAG,QAAQ,OAAO,CAAC,CAAC,EACpC,KAAK,IAAI,CAAC;AAAA,IACf;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA4CA,MAAa,0BACX,YACc;AACd,UAAM,QAAa,CAAC;AACpB,eAAW,aAAa,YAAY;AAClC,YAAM,iBAAiB,MAAM,KAAK,sBAAsB,SAAS;AACjE,YAAM,KAAK,GAAG,cAAc;AAAA,IAC9B;AAEA,yBAAO,MAAM,oBAAoB,MAAM,MAAM,EAAE;AAC/C,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,0BAA0B,WAAwC;AACtE,UAAM,qBAA0B,CAAC;AAGjC,UAAM,UAAU,MAAM,KAAK,2BAA2B,SAAS;AAC/D,QAAI,CAAC,SAAS;AACZ,aAAO,CAAC;AAAA,IACV;AAEA,QAAI;AAEF,YAAM,kBAAkB,MAAM,UAAU,iBAAiB;AACzD,YAAM,YAAY,iBAAiB,aAAa,CAAC;AAGjD,UAAI,KAAK,iBAAiB;AACxB,mBAAW,YAAY,WAAW;AAChC,gBAAM,YAAY,KAAK,gBAAgB,UAAU,SAAS;AAC1D,cAAI,WAAW;AACb,+BAAmB,KAAK,SAAS;AAAA,UACnC;AAAA,QACF;AAAA,MACF;AAEA,2BAAO;AAAA,QACL,UAAU,mBAAmB,MAAM,iCAAiC,mBACjE,IAAI,CAAC,MAAW,GAAG,QAAQ,OAAO,CAAC,CAAC,EACpC,KAAK,IAAI,CAAC;AAAA,MACf;AAAA,IACF,SAAS,KAAK;AACZ,2BAAO,KAAK,0CAA0C,GAAG,EAAE;AAAA,IAC7D;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,wBAAwB,WAAwC;AACpE,UAAM,mBAAwB,CAAC;AAG/B,UAAM,UAAU,MAAM,KAAK,2BAA2B,SAAS;AAC/D,QAAI,CAAC,SAAS;AACZ,aAAO,CAAC;AAAA,IACV;AAEA,QAAI;AAEF,YAAM,gBAAgB,MAAM,UAAU,YAAY;AAClD,YAAM,UAAU,eAAe,WAAW,CAAC;AAG3C,UAAI,KAAK,eAAe;AACtB,mBAAW,UAAU,SAAS;AAC5B,gBAAM,YAAY,KAAK,cAAc,QAAQ,SAAS;AACtD,cAAI,WAAW;AACb,6BAAiB,KAAK,SAAS;AAAA,UACjC;AAAA,QACF;AAAA,MACF;AAEA,2BAAO;AAAA,QACL,UAAU,iBAAiB,MAAM,+BAA+B,iBAC7D,IAAI,CAAC,MAAW,GAAG,QAAQ,OAAO,CAAC,CAAC,EACpC,KAAK,IAAI,CAAC;AAAA,MACf;AAAA,IACF,SAAS,KAAK;AACZ,2BAAO,KAAK,wCAAwC,GAAG,EAAE;AAAA,IAC3D;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAa,8BACX,YACc;AACd,UAAM,YAAiB,CAAC;AACxB,eAAW,aAAa,YAAY;AAClC,YAAM,qBACJ,MAAM,KAAK,0BAA0B,SAAS;AAChD,gBAAU,KAAK,GAAG,kBAAkB;AAAA,IACtC;AAEA,yBAAO,MAAM,wBAAwB,UAAU,MAAM,EAAE;AACvD,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAa,4BACX,YACc;AACd,UAAM,UAAe,CAAC;AACtB,eAAW,aAAa,YAAY;AAClC,YAAM,mBAAmB,MAAM,KAAK,wBAAwB,SAAS;AACrE,cAAQ,KAAK,GAAG,gBAAgB;AAAA,IAClC;AAEA,yBAAO,MAAM,sBAAsB,QAAQ,MAAM,EAAE;AACnD,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,0BAA0B,WAAmC;AACnE,WAAO,QAAQ,UAAU,SAAS,UAAU,MAAM,MAAM;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAc,2BACZ,WACkB;AAClB,QAAI,CAAC,KAAK,0BAA0B,SAAS,GAAG;AAC9C,2BAAO,MAAM,+CAA+C;AAC5D,UAAI;AACF,cAAM,UAAU,WAAW;AAC3B,eAAO;AAAA,MACT,SAAS,KAAK;AACZ,6BAAO,MAAM,iCAAiC,GAAG,EAAE;AACnD,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACF;;;ADnTA,SAAS,iBAAiB,MAAsB;AAC9C,SAAO,KACJ,QAAQ,mBAAmB,GAAG,EAC9B,YAAY,EACZ,QAAQ,YAAY,EAAE;AAC3B;AAuBO,IAAM,gBAAN,cAA4B,YAA6B;AAAA,EACtD,gBAAgB,oBAAI,IAAY;AAAA,EAChC,WAAW,oBAAI,IAAyB;AAAA,EAEhD,YAAY,kBAA4B,CAAC,GAAG;AAC1C,UAAM,eAAe;AAAA,EACvB;AAAA,EAEA,MAAsB,0BACpB,YAC4B;AAC5B,SAAK,cAAc,MAAM;AACzB,SAAK,SAAS,MAAM;AACpB,WAAO,MAAM,0BAA0B,UAAU;AAAA,EACnD;AAAA,EAEA,iBAAmC;AACjC,UAAM,WAAW,KAAK;AACtB,WAAO,OAAO,MAAM,SAAS;AAC3B,YAAM,UAAU,SAAS,IAAI,IAAI;AACjC,UAAI,CAAC,SAAS;AACZ,cAAM,IAAI,MAAM,iBAAiB,IAAI,EAAE;AAAA,MACzC;AACA,UAAI;AACF,YAAI,QAAQ,SAAS,QAAQ;AAC3B,iBAAO,MAAM,QAAQ,UAAU,SAAS,QAAQ,SAAS,IAAI;AAAA,QAC/D;AACA,YAAI,QAAQ,SAAS,YAAY;AAC/B,gBAAM,MAAM,QAAQ,eAAe,QAAQ;AAC3C,iBAAO,MAAM,QAAQ,UAAU,aAAa,GAAG;AAAA,QACjD;AACA,eAAO,MAAM,QAAQ,UAAU,UAAU,QAAQ,SAAS,IAAI;AAAA,MAChE,SAAS,KAAK;AACZ,8BAAO,MAAM,mCAAmC,IAAI,KAAK,GAAG,EAAE;AAC9D,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAAA,EAEA,gBAAgB,SAA4C;AAC1D,WAAO,QAAQ,IAAI,CAAC,EAAE,MAAM,aAAa,YAAY,OAAO;AAAA,MAC1D;AAAA,MACA;AAAA,MACA;AAAA,IACF,EAAE;AAAA,EACJ;AAAA,EAEQ,YAAY,MAAc,MAAsC;AACtE,QAAI,CAAC,KAAK,cAAc,IAAI,IAAI,GAAG;AACjC,WAAK,cAAc,IAAI,IAAI;AAC3B,aAAO;AAAA,IACT;AACA,QAAI,MAAM;AACR,YAAM,WAAW,GAAG,IAAI,IAAI,IAAI;AAChC,UAAI,CAAC,KAAK,cAAc,IAAI,QAAQ,GAAG;AACrC,aAAK,cAAc,IAAI,QAAQ;AAC/B,eAAO;AAAA,MACT;AACA,UAAIC,KAAI;AACR,aAAO,KAAK,cAAc,IAAI,GAAG,QAAQ,IAAIA,EAAC,EAAE,EAAG,CAAAA;AACnD,YAAMC,YAAW,GAAG,QAAQ,IAAID,EAAC;AACjC,WAAK,cAAc,IAAIC,SAAQ;AAC/B,aAAOA;AAAA,IACT;AACA,QAAI,IAAI;AACR,WAAO,KAAK,cAAc,IAAI,GAAG,IAAI,IAAI,CAAC,EAAE,EAAG;AAC/C,UAAM,WAAW,GAAG,IAAI,IAAI,CAAC;AAC7B,SAAK,cAAc,IAAI,QAAQ;AAC/B,WAAO;AAAA,EACT;AAAA,EAEQ,SACN,OACA,SACiB;AACjB,SAAK,SAAS,IAAI,MAAM,MAAM,OAAO;AACrC,WAAO;AAAA,EACT;AAAA,EAEU,YACR,SACA,WACwB;AACxB,QAAI,KAAK,gBAAgB,SAAS,QAAQ,IAAI,EAAG,QAAO;AAExD,UAAM,WAAW,KAAK,YAAY,QAAQ,QAAQ,MAAM;AACxD,UAAM,QAAyB;AAAA,MAC7B,MAAM;AAAA,MACN,aAAa;AAAA,MACb,aAAa,QAAQ,eAAe;AAAA,MACpC,aAAc,QAAQ,eAA2C;AAAA,QAC/D,MAAM;AAAA,QACN,YAAY,CAAC;AAAA,MACf;AAAA,IACF;AACA,WAAO,KAAK,SAAS,OAAO;AAAA,MAC1B;AAAA,MACA,MAAM;AAAA,MACN,SAAS,QAAQ;AAAA,IACnB,CAAC;AAAA,EACH;AAAA,EAEU,gBACR,aACA,WACwB;AACxB,UAAM,mBACJ,iBAAiB,YAAY,QAAQ,YAAY,GAAG,KAAK;AAC3D,UAAM,eAAe,KAAK,YAAY,kBAAkB,UAAU;AAClE,UAAM,QAAyB;AAAA,MAC7B,MAAM;AAAA,MACN,aAAa;AAAA,MACb,aACE,YAAY,eACZ,qDAAqD,YAAY,GAAG;AAAA,MACtE,aAAa,EAAE,MAAM,UAAU,YAAY,CAAC,EAAE;AAAA,IAChD;AACA,WAAO,KAAK,SAAS,OAAO;AAAA,MAC1B;AAAA,MACA,MAAM;AAAA,MACN,SAAS,YAAY;AAAA,MACrB,aAAa,YAAY;AAAA,IAC3B,CAAC;AAAA,EACH;AAAA,EAEU,cACR,WACA,WACwB;AACxB,UAAM,aAAsC,CAAC;AAC7C,UAAM,WAAqB,CAAC;AAC5B,QAAI,UAAU,WAAW,QAAQ;AAC/B,iBAAW,OAAO,UAAU,WAAW;AACrC,mBAAW,IAAI,IAAI,IAAI,EAAE,MAAM,UAAU,aAAa,IAAI,YAAY;AACtE,YAAI,IAAI,aAAa,MAAO,UAAS,KAAK,IAAI,IAAI;AAAA,MACpD;AAAA,IACF;AAEA,UAAM,iBACJ,iBAAiB,UAAU,QAAQ,QAAQ,KAAK;AAClD,UAAM,aAAa,KAAK,YAAY,gBAAgB,QAAQ;AAC5D,UAAM,QAAyB;AAAA,MAC7B,MAAM;AAAA,MACN,aAAa;AAAA,MACb,aAAa,UAAU,eAAe;AAAA,MACtC,aAAa;AAAA,QACX,MAAM;AAAA,QACN;AAAA,QACA,GAAI,SAAS,SAAS,IAAI,EAAE,SAAS,IAAI,CAAC;AAAA,MAC5C;AAAA,IACF;AACA,WAAO,KAAK,SAAS,OAAO;AAAA,MAC1B;AAAA,MACA,MAAM;AAAA,MACN,SAAS,UAAU;AAAA,IACrB,CAAC;AAAA,EACH;AACF;;;AEzIA,SAAS,SAAS,MAA+B;AAC/C,SAAO,EAAE,MAAM,QAAQ,KAAK;AAC9B;AAEA,SAAS,UAAU,MAAc,UAAoC;AACnE,SAAO;AAAA,IACL,MAAM;AAAA,IACN,KAAK,QAAQ,QAAQ,WAAW,IAAI;AAAA,IACpC;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,iBAAiB,OAAwC;AAChE,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAChD,QAAM,IAAI;AACV,MAAI,MAAM,QAAQ,EAAE,OAAO,EAAG,QAAO;AACrC,SAAO,uBAAuB;AAChC;AAQO,SAAS,kBAAkB,QAA0B;AAC1D,SACE,OAAO,WAAW,YAClB,WAAW,QACV,OAAiC,YAAY;AAElD;AAEA,SAAS,YAAY,OAA4C;AAC/D,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAChD,UAAQ,MAAM,MAAM;AAAA,IAClB,KAAK,QAAQ;AACX,YAAM,OAAQ,MAAyB;AACvC,aAAO,OAAO,SAAS,YAAY,KAAK,SAAS,IAC7C,SAAS,IAAI,IACb;AAAA,IACN;AAAA,IACA,KAAK,SAAS;AACZ,YAAM,IAAI;AACV,UAAI,OAAO,EAAE,SAAS,YAAY,CAAC,EAAE,KAAM,QAAO;AAClD,YAAM,OACJ,OAAO,EAAE,aAAa,YAAY,EAAE,WAAW,EAAE,WAAW;AAC9D,aAAO,UAAU,EAAE,MAAM,IAAI;AAAA,IAC/B;AAAA,IACA,KAAK,SAAS;AAGZ,YAAM,IAAI;AACV,YAAM,OACJ,OAAO,EAAE,aAAa,YAAY,EAAE,WAAW,EAAE,WAAW;AAC9D,YAAM,QAAQ,OAAO,EAAE,SAAS,WAAW,EAAE,KAAK,SAAS;AAC3D,aAAO,SAAS,WAAW,IAAI,qBAAqB,KAAK,UAAU;AAAA,IACrE;AAAA,IACA,KAAK,YAAY;AACf,YAAM,IAAK,MAA6B,YAAY,CAAC;AACrD,UAAI,OAAO,EAAE,SAAS,YAAY,EAAE,KAAK,SAAS,GAAG;AACnD,eAAO,SAAS,EAAE,IAAI;AAAA,MACxB;AACA,UACE,OAAO,EAAE,SAAS,YAClB,OAAO,EAAE,aAAa,YACtB,EAAE,SAAS,WAAW,QAAQ,GAC9B;AACA,eAAO,UAAU,EAAE,MAAM,EAAE,QAAQ;AAAA,MACrC;AACA,YAAM,MAAM,OAAO,EAAE,QAAQ,WAAW,EAAE,MAAM;AAChD,YAAM,OAAO,OAAO,EAAE,aAAa,WAAW,EAAE,WAAW;AAC3D,aAAO,SAAS,cAAc,GAAG,KAAK,IAAI,IAAI;AAAA,IAChD;AAAA,IACA,KAAK,iBAAiB;AACpB,YAAM,IAAI;AACV,YAAM,MAAM,OAAO,EAAE,QAAQ,WAAW,EAAE,MAAM;AAChD,YAAM,OAAO,OAAO,EAAE,SAAS,WAAW,KAAK,EAAE,IAAI,MAAM;AAC3D,aAAO,SAAS,iBAAiB,IAAI,KAAK,GAAG,GAAG;AAAA,IAClD;AAAA,IACA,SAAS;AAIP,aAAO;AAAA,QACL,oCAAoC,OAAO,MAAM,IAAI,CAAC;AAAA,MACxD;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,UAAU,OAAyB;AAC1C,MAAI,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,GAAG;AAC/D,UAAM,EAAE,OAAO,UAAU,GAAG,KAAK,IAAI;AACrC,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEO,SAAS,uBAAuB,QAAgC;AACrE,QAAM,WAAW,UAAU,MAAM;AAEjC,MAAI,OAAO,aAAa,UAAU;AAChC,WAAO,SAAS,SAAS,IAAI,CAAC,SAAS,QAAQ,CAAC,IAAI,CAAC;AAAA,EACvD;AAEA,MAAI,iBAAiB,QAAQ,GAAG;AAC9B,UAAM,IAAI;AACV,UAAM,QAAuB,CAAC;AAC9B,QAAI,MAAM,QAAQ,EAAE,OAAO,GAAG;AAC5B,iBAAW,SAAS,EAAE,SAAS;AAC7B,cAAM,IAAI,YAAY,KAAK;AAC3B,YAAI,EAAG,OAAM,KAAK,CAAC;AAAA,MACrB;AAAA,IACF;AACA,QAAI,EAAE,sBAAsB,QAAW;AACrC,UAAI;AACF,cAAM;AAAA,UACJ,SAAS,sBAAsB,KAAK,UAAU,EAAE,iBAAiB,CAAC,EAAE;AAAA,QACtE;AAAA,MACF,QAAQ;AAAA,MAGR;AAAA,IACF;AACA,QAAI,EAAE,SAAS;AACb,YAAM,QAAQ,SAAS,8BAA8B,CAAC;AAAA,IACxD;AACA,WAAO;AAAA,EACT;AAGA,MAAI;AACF,WAAO,CAAC,SAAS,KAAK,UAAU,QAAQ,CAAC,CAAC;AAAA,EAC5C,QAAQ;AACN,WAAO,CAAC,SAAS,OAAO,QAAQ,CAAC,CAAC;AAAA,EACpC;AACF;AAOA,SAAS,iBAAiB,OAAqC;AAC7D,MAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,MAAI,MAAM,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,GAAG;AACzC,WAAO,MAAM,IAAI,CAAC,MAAO,EAAsB,IAAI,EAAE,KAAK,IAAI;AAAA,EAChE;AACA,SAAO;AACT;AAOO,SAAS,oBAAoB,QAAyC;AAC3E,QAAM,QAAQ,uBAAuB,MAAM;AAC3C,QAAM,YAAY,iBAAiB,KAAK;AACxC,SAAO,cAAc,OAAO,YAAY;AAC1C;AAOO,SAAS,qBAAqB,SAInC;AACA,MAAI,OAAO,YAAY,UAAU;AAC/B,WAAO,EAAE,MAAM,SAAS,YAAY,CAAC,GAAG,UAAU,KAAK;AAAA,EACzD;AACA,QAAM,QAAkB,CAAC;AACzB,QAAM,aAAiC,CAAC;AACxC,aAAW,KAAK,SAAS;AACvB,QAAI,EAAE,SAAS,QAAQ;AACrB,UAAI,EAAE,KAAM,OAAM,KAAK,EAAE,IAAI;AAAA,IAC/B,WAAW,EAAE,SAAS,SAAS;AAC7B,iBAAW,KAAK,CAAC;AAAA,IACnB;AAAA,EACF;AACA,SAAO,EAAE,MAAM,MAAM,KAAK,IAAI,GAAG,YAAY,UAAU,MAAM;AAC/D;AAGO,SAAS,wBACd,UACA,OACQ;AACR,SAAO,UAAU,YAAY,QAAQ,iCACnC,UAAU,IAAI,KAAK,GACrB;AACF;;;ACrOA,SAAS,YAAY,GAAiC;AACpD,QAAM,MACJ,OAAO,EAAE,YAAY,WACjB,EAAE,UACF,MAAM,QAAQ,EAAE,OAAO,IACpB,EAAE,QACA,IAAI,CAAC,MAAM,GAAG,QAAQ,EAAE,EACxB,KAAK,IAAI,IACZ,KAAK,UAAU,EAAE,WAAW,EAAE;AACtC,MAAI,IAAI,KAAK,EAAG,QAAO,IAAI,KAAK;AAChC,MAAI,EAAE,OAAO,QAAQ;AACnB,WAAO,EAAE,MACN,OAAO,CAAC,MAAM,EAAE,SAAS,UAAU,EAAE,IAAI,EACzC,IAAI,CAAC,MAAM,EAAE,IAAK,EAClB,KAAK,EAAE,EACP,KAAK;AAAA,EACV;AACA,SAAO;AACT;AAUO,SAAS,0BACd,UACmB;AACnB,QAAM,MAAyB,CAAC;AAEhC,WAAS,QAAQ,CAAC,GAAG,OAAO;AAC1B,QAAI,EAAE,SAAS,QAAQ;AACrB,YAAMC,QAAO,YAAY,CAAC,KAAK;AAC/B,UAAI,EAAE,aAAa,QAAQ;AACzB,cAAM,QAAuB,CAAC,EAAE,MAAM,QAAQ,MAAAA,MAAK,CAAC;AACpD,mBAAW,KAAK,EAAE,aAAa;AAC7B,cAAI,EAAE,SAAS,SAAS;AACtB,kBAAM,KAAK;AAAA,cACT,MAAM;AAAA,cACN,KAAK,QAAQ,EAAE,QAAQ,WAAW,EAAE,IAAI;AAAA,cACxC,UAAU,EAAE;AAAA,cACZ,MAAM,EAAE;AAAA,YACV,CAAC;AAAA,UACH;AAAA,QACF;AACA,YAAI,KAAK,EAAE,MAAM,QAAQ,SAAS,MAAM,CAAC;AAAA,MAC3C,OAAO;AACL,YAAI,KAAK,EAAE,MAAM,QAAQ,SAASA,MAAK,CAAC;AAAA,MAC1C;AACA;AAAA,IACF;AAGA,UAAM,aAAa,EAAE,SAAS,CAAC,GAAG;AAAA,MAChC,CAAC,MACC,EAAE,SAAS,qBACX,EAAE,kBACF,EAAE,eAAe,WAAW;AAAA,IAChC;AAEA,QAAI,UAAU,WAAW,GAAG;AAC1B,YAAMA,QAAO,YAAY,CAAC,KAAK;AAC/B,UAAI,KAAK,EAAE,MAAM,aAAa,SAASA,MAAK,CAAC;AAC7C;AAAA,IACF;AAEA,UAAM,OAAO,YAAY,CAAC;AAC1B,UAAM,YAAY,UAAU,IAAI,CAAC,GAAG,OAAO;AAAA,MACzC,IAAI,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,eAAgB,QAAQ;AAAA,MACjD,MAAM,EAAE,eAAgB;AAAA,MACxB,MAAM,EAAE,eAAgB;AAAA,IAC1B,EAAE;AACF,QAAI,KAAK;AAAA,MACP,MAAM;AAAA,MACN,SAAS;AAAA,MACT;AAAA,IACF,CAAC;AACD,cAAU,QAAQ,CAAC,GAAG,MAAM;AAC1B,YAAM,SAAS,EAAE,eAAgB;AACjC,UAAI,KAAK;AAAA,QACP,MAAM;AAAA,QACN,SAAS,oBAAoB,MAAM;AAAA,QACnC,YAAY,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,eAAgB,QAAQ;AAAA,QACzD,UAAU,EAAE,eAAgB;AAAA,QAC5B,YAAY;AAAA,QACZ,aAAa,kBAAkB,MAAM;AAAA,MACvC,CAAC;AAAA,IACH,CAAC;AAAA,EACH,CAAC;AAED,SAAO;AACT;AASO,SAAS,cAAc,UAG5B;AACA,QAAM,MAAgB,CAAC;AACvB,QAAM,OAA0B,CAAC;AACjC,aAAW,KAAK,UAAU;AACxB,QAAI,EAAE,SAAS,UAAU;AACvB,UAAI,OAAO,EAAE,YAAY,SAAU,KAAI,KAAK,EAAE,OAAO;AAAA,eAC5C,MAAM,QAAQ,EAAE,OAAO,GAAG;AACjC,mBAAW,KAAK,EAAE,QAAS,KAAI,EAAE,SAAS,OAAQ,KAAI,KAAK,EAAE,IAAI;AAAA,MACnE;AAAA,IACF,OAAO;AACL,WAAK,KAAK,CAAC;AAAA,IACb;AAAA,EACF;AACA,SAAO;AAAA,IACL,QAAQ,IAAI,SAAS,IAAI,IAAI,KAAK,MAAM,IAAI;AAAA,IAC5C;AAAA,EACF;AACF;AAGO,SAAS,aACd,KAC2C;AAC3C,QAAM,IAAI,IAAI,MAAM,6BAA6B;AACjD,MAAI,CAAC,EAAG,QAAO;AACf,SAAO,EAAE,UAAU,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE;AACtC;;;AChJA,gBAAuB,SACrB,MACA,QACyC;AACzC,QAAM,SAAS,KAAK,UAAU;AAC9B,QAAM,UAAU,IAAI,YAAY,OAAO;AACvC,MAAI,SAAS;AAEb,MAAI;AACF,WAAO,MAAM;AACX,UAAI,QAAQ,QAAS;AACrB,YAAM,EAAE,OAAO,KAAK,IAAI,MAAM,OAAO,KAAK;AAC1C,UAAI,KAAM;AACV,gBAAU,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AAEhD,UAAI;AACJ,cAAQ,MAAM,sBAAsB,MAAM,OAAO,IAAI;AACnD,cAAM,MAAM,OAAO,MAAM,GAAG,GAAG;AAC/B,iBAAS,OAAO,MAAM,GAAG,EAAE,QAAQ,yBAAyB,EAAE;AAC9D,cAAM,SAAS,cAAc,GAAG;AAChC,YAAI,OAAQ,OAAM;AAAA,MACpB;AAAA,IACF;AAEA,QAAI,OAAO,KAAK,GAAG;AACjB,YAAM,SAAS,cAAc,MAAM;AACnC,UAAI,OAAQ,OAAM;AAAA,IACpB;AAAA,EACF,UAAE;AACA,QAAI;AACF,aAAO,YAAY;AAAA,IACrB,QAAQ;AAAA,IAER;AAAA,EACF;AACF;AAEA,SAAS,sBAAsB,GAAmB;AAChD,QAAM,IAAI,EAAE,QAAQ,MAAM;AAC1B,QAAM,IAAI,EAAE,QAAQ,UAAU;AAC9B,MAAI,MAAM,GAAI,QAAO;AACrB,MAAI,MAAM,GAAI,QAAO;AACrB,SAAO,KAAK,IAAI,GAAG,CAAC;AACtB;AAEA,SAAS,cAAc,KAA8B;AACnD,MAAI;AACJ,QAAM,YAAsB,CAAC;AAC7B,aAAW,QAAQ,IAAI,MAAM,OAAO,GAAG;AACrC,QAAI,CAAC,QAAQ,KAAK,WAAW,GAAG,EAAG;AACnC,UAAM,MAAM,KAAK,QAAQ,GAAG;AAC5B,UAAM,QAAQ,QAAQ,KAAK,OAAO,KAAK,MAAM,GAAG,GAAG;AACnD,QAAI,QAAQ,QAAQ,KAAK,KAAK,KAAK,MAAM,MAAM,CAAC;AAChD,QAAI,MAAM,WAAW,GAAG,EAAG,SAAQ,MAAM,MAAM,CAAC;AAChD,QAAI,UAAU,QAAS,SAAQ;AAAA,aACtB,UAAU,OAAQ,WAAU,KAAK,KAAK;AAAA,EACjD;AACA,MAAI,UAAU,WAAW,EAAG,QAAO;AACnC,SAAO,EAAE,OAAO,MAAM,UAAU,KAAK,IAAI,EAAE;AAC7C;;;ACvEA,SAAS,SACP,UACG,MACiB;AACpB,aAAW,OAAO,MAAM;AACtB,UAAM,YAAY,MAAM,GAAG;AAC3B,QAAI,OAAO,cAAc,YAAY,OAAO,SAAS,SAAS,GAAG;AAC/D,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAGO,SAAS,qBAAqB,KAAsC;AACzE,MAAI,CAAC,OAAO,OAAO,QAAQ,SAAU,QAAO;AAC5C,QAAM,QAAQ;AACd,QAAM,cAAc;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,QAAM,eAAe;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,QAAM,cACJ,SAAS,OAAO,eAAe,gBAAgB,iBAAiB,MAC/D,gBAAgB,UAAa,iBAAiB,SAC3C,cAAc,eACd;AAEN,QAAM,eACJ,MAAM,wBAAwB,OAAO,MAAM,yBAAyB,WAC/D,MAAM,uBACP;AACN,QAAM,gBACJ,MAAM,yBACN,OAAO,MAAM,0BAA0B,WAClC,MAAM,wBACP;AACN,QAAM,oBACJ,SAAS,OAAO,qBAAqB,yBAAyB,MAC7D,eAAe,SAAS,cAAc,eAAe,IAAI;AAC5D,QAAM,kBACJ,SAAS,OAAO,mBAAmB,oBAAoB,MACtD,gBAAgB,SAAS,eAAe,kBAAkB,IAAI;AAEjE,MACE,gBAAgB,UAChB,iBAAiB,UACjB,gBAAgB,UAChB,sBAAsB,UACtB,oBAAoB,QACpB;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ACvDA,IAAM,mBAAmB;AACzB,IAAM,oBAAoB;AAC1B,IAAM,qBAAqB;AAE3B,SAAS,gBAAgB,GAAgB;AACvC,MAAI,EAAE,SAAS,QAAS,QAAO;AAC/B,MAAI,EAAE,QAAQ,EAAE,UAAU;AACxB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ,EAAE,MAAM,UAAU,YAAY,EAAE,UAAU,MAAM,EAAE,KAAK;AAAA,IACjE;AAAA,EACF;AACA,QAAM,SAAS,aAAa,EAAE,GAAG;AACjC,MAAI,QAAQ;AACV,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,YAAY,OAAO;AAAA,QACnB,MAAM,OAAO;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,MAAM,SAAS,QAAQ,EAAE,MAAM,OAAO,KAAK,EAAE,IAAI,EAAE;AAC9D;AAEA,SAAS,mBAAmB,SAA0C;AACpE,MAAI,OAAO,YAAY,UAAU;AAC/B,WAAO,CAAC,EAAE,MAAM,QAAQ,MAAM,WAAW,eAAe,CAAC;AAAA,EAC3D;AACA,QAAM,SAAoB,CAAC;AAC3B,aAAW,KAAK,SAAS;AACvB,QAAI,EAAE,SAAS,QAAQ;AACrB,UAAI,EAAE,KAAM,QAAO,KAAK,EAAE,MAAM,QAAQ,MAAM,EAAE,KAAK,CAAC;AAAA,IACxD,OAAO;AACL,YAAM,MAAM,gBAAgB,CAAC;AAC7B,UAAI,IAAK,QAAO,KAAK,GAAG;AAAA,IAC1B;AAAA,EACF;AACA,MAAI,OAAO,WAAW,EAAG,QAAO,KAAK,EAAE,MAAM,QAAQ,MAAM,eAAe,CAAC;AAC3E,SAAO;AACT;AAEA,SAAS,6BACP,SACS;AACT,MAAI,OAAO,YAAY,UAAU;AAC/B,WAAO;AAAA,EACT;AACA,QAAM,SAAoB,CAAC;AAC3B,aAAW,KAAK,SAAS;AACvB,QAAI,EAAE,SAAS,QAAQ;AACrB,UAAI,EAAE,KAAM,QAAO,KAAK,EAAE,MAAM,QAAQ,MAAM,EAAE,KAAK,CAAC;AAAA,IACxD,WAAW,EAAE,SAAS,SAAS;AAC7B,YAAM,MAAM,gBAAgB,CAAC;AAC7B,UAAI,IAAK,QAAO,KAAK,GAAG;AAAA,IAC1B;AAAA,EACF;AACA,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEO,SAAS,oBAAoB,UAAwC;AAC1E,QAAM,MAAa,CAAC;AACpB,aAAW,KAAK,UAAU;AACxB,QAAI,EAAE,SAAS,QAAQ;AAErB,YAAM,OAAO,IAAI,IAAI,SAAS,CAAC;AAC/B,YAAM,QAAQ;AAAA,QACZ,MAAM;AAAA,QACN,aAAa,EAAE;AAAA,QACf,SAAS,6BAA6B,EAAE,OAAO;AAAA,QAC/C,GAAI,EAAE,cAAc,EAAE,UAAU,KAAK,IAAI,CAAC;AAAA,MAC5C;AACA,UAAI,QAAQ,KAAK,SAAS,UAAU,MAAM,QAAQ,KAAK,OAAO,GAAG;AAC/D,aAAK,QAAQ,KAAK,KAAK;AAAA,MACzB,OAAO;AACL,YAAI,KAAK,EAAE,MAAM,QAAQ,SAAS,CAAC,KAAK,EAAE,CAAC;AAAA,MAC7C;AACA;AAAA,IACF;AACA,QAAI,EAAE,SAAS,aAAa;AAC1B,YAAM,SAAgB,CAAC;AACvB,YAAM,cACJ,OAAO,EAAE,YAAY,WACjB,EAAE,UACF,MAAM,QAAQ,EAAE,OAAO,IACrB,EAAE,QAAQ,IAAI,CAAC,MAAO,EAAE,SAAS,SAAS,EAAE,OAAO,EAAG,EAAE,KAAK,EAAE,IAC/D;AACR,UAAI,YAAa,QAAO,KAAK,EAAE,MAAM,QAAQ,MAAM,YAAY,CAAC;AAChE,UAAI,EAAE,WAAW,QAAQ;AACvB,mBAAW,MAAM,EAAE,WAAW;AAC5B,iBAAO,KAAK;AAAA,YACV,MAAM;AAAA,YACN,IAAI,GAAG;AAAA,YACP,MAAM,GAAG;AAAA,YACT,OAAO,GAAG,QAAQ,CAAC;AAAA,UACrB,CAAC;AAAA,QACH;AAAA,MACF;AACA,UAAI,OAAO,WAAW,GAAG;AACvB,eAAO,KAAK,EAAE,MAAM,QAAQ,MAAM,eAAe,CAAC;AAAA,MACpD;AACA,UAAI,KAAK,EAAE,MAAM,aAAa,SAAS,OAAO,CAAC;AAC/C;AAAA,IACF;AACA,QAAI,KAAK,EAAE,MAAM,QAAQ,SAAS,mBAAmB,EAAE,OAAO,EAAE,CAAC;AAAA,EACnE;AACA,SAAO;AACT;AAEA,SAAS,UAAU,QAAoB,QAAiB;AACtD,QAAM,EAAE,QAAQ,UAAU,MAAM,IAAI;AACpC,QAAM,EAAE,QAAQ,KAAK,IAAI,cAAc,QAAQ;AAC/C,QAAM,OAAgC;AAAA,IACpC,OAAO,OAAO;AAAA,IACd,YAAY,OAAO,aAAa;AAAA,IAChC,UAAU,oBAAoB,IAAI;AAAA,IAClC,GAAI,SAAS,EAAE,QAAQ,KAAK,IAAI,CAAC;AAAA,EACnC;AACA,MAAI,OAAO,gBAAgB,OAAW,MAAK,cAAc,OAAO;AAChE,MAAI,OAAQ,MAAK,SAAS;AAC1B,MAAI,SAAS,MAAM,SAAS,GAAG;AAC7B,SAAK,QAAQ,MAAM,IAAI,CAAC,OAAO;AAAA,MAC7B,MAAM,EAAE;AAAA,MACR,aAAa,EAAE;AAAA,MACf,cAAc,EAAE;AAAA,IAClB,EAAE;AAAA,EACJ;AACA,SAAO;AACT;AAEA,gBAAuB,WACrB,QAC+C;AAC/C,QAAM,EAAE,QAAQ,OAAO,IAAI;AAC3B,QAAM,MAAM,MAAM,MAAM,kBAAkB;AAAA,IACxC,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,aAAa,OAAO;AAAA,MACpB,qBAAqB;AAAA,MACrB,6CAA6C;AAAA,IAC/C;AAAA,IACA,MAAM,KAAK,UAAU,UAAU,QAAQ,IAAI,CAAC;AAAA,IAC5C;AAAA,EACF,CAAC;AACD,MAAI,CAAC,IAAI,MAAM,CAAC,IAAI,MAAM;AACxB,UAAM,OAAO,MAAM,IAAI,KAAK,EAAE,MAAM,MAAM,EAAE;AAC5C,UAAM,IAAI;AAAA,MACR,6BAA6B,IAAI,MAAM,IAAI,IAAI,UAAU,MAAM,IAAI;AAAA,IACrE;AAAA,EACF;AAGA,QAAM,SAAS,oBAAI,IASjB;AACF,MAAI;AAEJ,mBAAiB,MAAM,SAAS,IAAI,MAAM,MAAM,GAAG;AACjD,QAAI;AACJ,QAAI;AACF,eAAS,KAAK,MAAM,GAAG,IAAI;AAAA,IAC7B,QAAQ;AACN;AAAA,IACF;AACA,UAAM,IAAI,QAAQ;AAClB,QAAI,MAAM,iBAAiB;AACzB,cAAQ,qBAAqB,QAAQ,SAAS,KAAK;AAAA,IACrD,WAAW,MAAM,iBAAiB;AAChC,YAAM,aAAa,qBAAqB,QAAQ,KAAK;AACrD,UAAI,WAAY,SAAQ,EAAE,GAAG,OAAO,GAAG,WAAW;AAAA,IACpD,WAAW,MAAM,uBAAuB;AACtC,YAAM,MAAM,OAAO;AACnB,YAAM,KAAK,OAAO,iBAAiB,CAAC;AACpC,UAAI,GAAG,SAAS,YAAY;AAC1B,eAAO,IAAI,KAAK;AAAA,UACd,MAAM;AAAA,UACN,IAAI,GAAG;AAAA,UACP,MAAM,GAAG;AAAA,UACT,UAAU;AAAA,UACV,cAAc;AAAA,QAChB,CAAC;AACD,cAAM;AAAA,UACJ,MAAM;AAAA,UACN,OAAO;AAAA,UACP,YAAY,GAAG;AAAA,UACf,UAAU,GAAG;AAAA,QACf;AACA,cAAM,QAAQ,OAAO,IAAI,GAAG;AAC5B,YAAI,MAAO,OAAM,eAAe;AAAA,MAClC,OAAO;AACL,eAAO,IAAI,KAAK;AAAA,UACd,MAAM;AAAA,UACN,UAAU;AAAA,UACV,cAAc;AAAA,QAChB,CAAC;AAAA,MACH;AAAA,IACF,WAAW,MAAM,uBAAuB;AACtC,YAAM,MAAM,OAAO;AACnB,YAAM,IAAI,OAAO,SAAS,CAAC;AAC3B,YAAM,QAAQ,OAAO,IAAI,GAAG;AAC5B,UAAI,CAAC,MAAO;AACZ,UAAI,EAAE,SAAS,gBAAgB,OAAO,EAAE,SAAS,UAAU;AACzD,cAAM,EAAE,MAAM,cAAc,OAAO,EAAE,KAAK;AAAA,MAC5C,WACE,EAAE,SAAS,sBACX,OAAO,EAAE,iBAAiB,YAC1B,MAAM,SAAS,YACf;AACA,cAAM,YAAY,EAAE;AACpB,cAAM;AAAA,UACJ,MAAM;AAAA,UACN,OAAO;AAAA,UACP,YAAY,MAAM;AAAA,UAClB,UAAU,MAAM;AAAA,UAChB,WAAW,EAAE;AAAA,QACf;AAAA,MACF;AAAA,IACF,WAAW,MAAM,sBAAsB;AACrC,YAAM,MAAM,OAAO;AACnB,YAAM,QAAQ,OAAO,IAAI,GAAG;AAC5B,UAAI,SAAS,MAAM,SAAS,cAAc,MAAM,MAAM,MAAM,MAAM;AAChE,YAAI,OAAgC,CAAC;AACrC,YAAI,MAAM,UAAU;AAClB,cAAI;AACF,mBAAO,KAAK,MAAM,MAAM,QAAQ;AAAA,UAClC,QAAQ;AACN,mBAAO,CAAC;AAAA,UACV;AAAA,QACF;AACA,cAAM;AAAA,UACJ,MAAM;AAAA,UACN,OAAO;AAAA,UACP,YAAY,MAAM;AAAA,UAClB,UAAU,MAAM;AAAA,UAChB;AAAA,QACF;AAAA,MACF;AAAA,IACF,WAAW,MAAM,gBAAgB;AAC/B,UAAI,OAAO;AACT,cAAM,cACJ,MAAM,gBACL,MAAM,gBAAgB,UAAa,MAAM,iBAAiB,SACvD,MAAM,cAAc,MAAM,eAC1B;AACN,cAAM,EAAE,MAAM,SAAS,OAAO,EAAE,GAAG,OAAO,YAAY,EAAE;AAAA,MAC1D;AAAA,IACF,WAAW,MAAM,SAAS;AACxB,YAAM;AAAA,QACJ,MAAM;AAAA,QACN,SAAS,QAAQ,OAAO,WAAW;AAAA,MACrC;AAAA,IACF;AAAA,EACF;AACA,QAAM,EAAE,MAAM,OAAO;AACvB;AAEA,eAAsB,KAAK,QAGxB;AACD,QAAM,EAAE,QAAQ,OAAO,IAAI;AAC3B,QAAM,MAAM,MAAM,MAAM,kBAAkB;AAAA,IACxC,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,aAAa,OAAO;AAAA,MACpB,qBAAqB;AAAA,MACrB,6CAA6C;AAAA,IAC/C;AAAA,IACA,MAAM,KAAK,UAAU,UAAU,QAAQ,KAAK,CAAC;AAAA,IAC7C;AAAA,EACF,CAAC;AACD,MAAI,CAAC,IAAI,IAAI;AACX,UAAMC,QAAO,MAAM,IAAI,KAAK,EAAE,MAAM,MAAM,EAAE;AAC5C,UAAM,IAAI;AAAA,MACR,6BAA6B,IAAI,MAAM,IAAI,IAAI,UAAU,MAAMA,KAAI;AAAA,IACrE;AAAA,EACF;AACA,QAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,MAAI,OAAO;AACX,QAAM,YAIA,CAAC;AACP,aAAW,SAAS,MAAM,WAAW,CAAC,GAAG;AACvC,QAAI,MAAM,SAAS,UAAU,OAAO,MAAM,SAAS,UAAU;AAC3D,cAAQ,MAAM;AAAA,IAChB,WAAW,MAAM,SAAS,YAAY;AACpC,gBAAU,KAAK;AAAA,QACb,IAAI,MAAM;AAAA,QACV,MAAM,MAAM;AAAA,QACZ,MACE,MAAM,SAAS,OAAO,MAAM,UAAU,WACjC,MAAM,QACP,CAAC;AAAA,MACT,CAAC;AAAA,IACH;AAAA,EACF;AACA,SAAO,EAAE,MAAM,UAAU;AAC3B;;;ACjUA,IAAM,eAAe,oBAAI,IAAI;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,SAAS,wBACd,QACyB;AACzB,MAAI,CAAC,UAAU,OAAO,WAAW,UAAU;AACzC,WAAO,EAAE,MAAM,SAAS;AAAA,EAC1B;AACA,QAAM,UAAU,MAAM,MAAiC;AACvD,MAAI,OAAO,YAAY,YAAY,YAAY,MAAM;AACnD,WAAO,EAAE,MAAM,SAAS;AAAA,EAC1B;AACA,QAAM,MAAM;AACZ,MAAI,CAAC,IAAI,KAAM,KAAI,OAAO;AAC1B,SAAO;AACT;AAEA,SAAS,MAAM,OAAyB;AACtC,MAAI,MAAM,QAAQ,KAAK,EAAG,QAAO,MAAM,IAAI,KAAK;AAChD,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAChD,QAAM,QAAQ;AAGd,aAAW,OAAO,CAAC,SAAS,SAAS,OAAO,GAAG;AAC7C,UAAM,MAAM,MAAM,GAAG;AACrB,QAAI,MAAM,QAAQ,GAAG,KAAK,IAAI,WAAW,GAAG;AAC1C,aAAO,MAAM,IAAI,CAAC,CAAC;AAAA,IACrB;AAAA,EACF;AAEA,QAAM,MAA+B,CAAC;AACtC,aAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC1C,QAAI,CAAC,aAAa,IAAI,CAAC,EAAG;AAC1B,QAAI,MAAM,gBAAgB,KAAK,OAAO,MAAM,UAAU;AACpD,YAAM,QAAiC,CAAC;AACxC,iBAAW,CAAC,IAAI,EAAE,KAAK,OAAO,QAAQ,CAA4B,GAAG;AACnE,cAAM,EAAE,IAAI,MAAM,EAAE;AAAA,MACtB;AACA,UAAI,CAAC,IAAI;AAAA,IACX,WAAW,MAAM,SAAS;AACxB,UAAI,CAAC,IAAI,MAAM,CAAC;AAAA,IAClB,OAAO;AACL,UAAI,CAAC,IAAI;AAAA,IACX;AAAA,EACF;AACA,SAAO;AACT;;;AC3CA,SAAS,iBAAiB,OAAuB;AAC/C,QAAM,UAAU,MAAM,KAAK;AAC3B,SAAO,QAAQ,WAAW,SAAS,IAC/B,QAAQ,MAAM,UAAU,MAAM,IAC9B;AACN;AAEA,SAAS,YAAY,OAAe,MAAmC;AACrE,QAAM,SACJ,SAAS,WAAW,kCAAkC;AACxD,SAAO,2DAA2D;AAAA,IAChE,iBAAiB,KAAK;AAAA,EACxB,CAAC,IAAI,MAAM;AACb;AAEA,SAAS,gBAAgB,GAAyB;AAChD,MAAI,EAAE,SAAS,QAAS,QAAO;AAC/B,MAAI,EAAE,QAAQ,EAAE,UAAU;AACxB,WAAO,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,MAAM,EAAE,KAAK,EAAE;AAAA,EAC9D;AACA,QAAM,SAAS,aAAa,EAAE,GAAG;AACjC,MAAI,QAAQ;AACV,WAAO;AAAA,MACL,YAAY,EAAE,UAAU,OAAO,UAAU,MAAM,OAAO,KAAK;AAAA,IAC7D;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,cAAc,SAA4C;AACjE,MAAI,OAAO,YAAY,UAAU;AAC/B,WAAO,CAAC,EAAE,MAAM,WAAW,eAAe,CAAC;AAAA,EAC7C;AACA,QAAM,QAAmB,CAAC;AAC1B,aAAW,KAAK,SAAS;AACvB,QAAI,EAAE,SAAS,QAAQ;AACrB,UAAI,EAAE,KAAM,OAAM,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC;AAAA,IACzC,OAAO;AACL,YAAM,QAAQ,gBAAgB,CAAC;AAC/B,UAAI,MAAO,OAAM,KAAK,KAAK;AAAA,IAC7B;AAAA,EACF;AACA,MAAI,MAAM,WAAW,EAAG,OAAM,KAAK,EAAE,MAAM,eAAe,CAAC;AAC3D,SAAO;AACT;AAEA,SAAS,wBAAwB,SAG/B;AAGA,MAAI,OAAO,YAAY,UAAU;AAC/B,QAAI;AACJ,QAAI;AACF,eAAS,KAAK,MAAM,OAAO;AAAA,IAC7B,QAAQ;AACN,eAAS,EAAE,QAAQ,QAAQ;AAAA,IAC7B;AACA,QAAI,CAAC,UAAU,OAAO,WAAW,UAAU;AACzC,eAAS,EAAE,QAAQ,OAAO;AAAA,IAC5B;AACA,WAAO,EAAE,UAAU,QAAmC,YAAY,CAAC,EAAE;AAAA,EACvE;AACA,QAAM,EAAE,MAAM,WAAW,IAAI,qBAAqB,OAAO;AACzD,QAAM,WAAoC,CAAC;AAC3C,MAAI,KAAM,UAAS,OAAO;AAC1B,MAAI,WAAW,SAAS,GAAG;AACzB,aAAS,SAAS,WAAW,IAAI,CAAC,OAAO;AAAA,MACvC,UAAU,EAAE,YAAY;AAAA,MACxB,SAAS;AAAA,IACX,EAAE;AACF,aAAS,OACP;AAAA,EACJ;AACA,MAAI,OAAO,KAAK,QAAQ,EAAE,WAAW,GAAG;AACtC,aAAS,SAAS;AAAA,EACpB;AACA,SAAO,EAAE,UAAU,WAAW;AAChC;AAEO,SAAS,iBAAiB,UAAwC;AACvE,QAAM,MAAa,CAAC;AACpB,aAAW,KAAK,UAAU;AACxB,QAAI,EAAE,SAAS,QAAQ;AACrB,YAAM,EAAE,UAAU,WAAW,IAAI,wBAAwB,EAAE,OAAO;AAClE,YAAM,OAAO,IAAI,IAAI,SAAS,CAAC;AAC/B,YAAM,OAAO;AAAA,QACX,kBAAkB;AAAA,UAChB,MAAM,EAAE;AAAA,UACR;AAAA,QACF;AAAA,MACF;AACA,UAAI,QAAQ,KAAK,SAAS,YAAY;AACpC,aAAK,MAAM,KAAK,IAAI;AAAA,MACtB,OAAO;AACL,YAAI,KAAK,EAAE,MAAM,YAAY,OAAO,CAAC,IAAI,EAAE,CAAC;AAAA,MAC9C;AACA,UAAI,WAAW,SAAS,GAAG;AACzB,cAAM,YAAuB;AAAA,UAC3B,EAAE,MAAM,wBAAwB,EAAE,UAAU,WAAW,MAAM,EAAE;AAAA,QACjE;AACA,mBAAW,KAAK,YAAY;AAC1B,gBAAM,QAAQ,gBAAgB,CAAC;AAC/B,cAAI,MAAO,WAAU,KAAK,KAAK;AAAA,QACjC;AACA,YAAI,KAAK,EAAE,MAAM,QAAQ,OAAO,UAAU,CAAC;AAAA,MAC7C;AACA;AAAA,IACF;AACA,QAAI,EAAE,SAAS,aAAa;AAC1B,YAAM,QAAe,CAAC;AACtB,YAAM,cACJ,OAAO,EAAE,YAAY,WACjB,EAAE,UACF,MAAM,QAAQ,EAAE,OAAO,IACrB,EAAE,QAAQ,IAAI,CAAC,MAAO,EAAE,SAAS,SAAS,EAAE,OAAO,EAAG,EAAE,KAAK,EAAE,IAC/D;AACR,UAAI,YAAa,OAAM,KAAK,EAAE,MAAM,YAAY,CAAC;AACjD,UAAI,EAAE,WAAW,QAAQ;AACvB,mBAAW,MAAM,EAAE,WAAW;AAC5B,gBAAM,KAAK;AAAA,YACT,cAAc,EAAE,MAAM,GAAG,MAAM,MAAM,GAAG,QAAQ,CAAC,EAAE;AAAA,UACrD,CAAC;AAAA,QACH;AAAA,MACF;AACA,UAAI,MAAM,WAAW,EAAG,OAAM,KAAK,EAAE,MAAM,eAAe,CAAC;AAC3D,UAAI,KAAK,EAAE,MAAM,SAAS,MAAM,CAAC;AACjC;AAAA,IACF;AACA,QAAI,KAAK,EAAE,MAAM,QAAQ,OAAO,cAAc,EAAE,OAAO,EAAE,CAAC;AAAA,EAC5D;AACA,SAAO;AACT;AAEA,SAASC,WAAU,QAAoB;AACrC,QAAM,EAAE,QAAQ,UAAU,MAAM,IAAI;AACpC,QAAM,EAAE,QAAQ,KAAK,IAAI,cAAc,QAAQ;AAC/C,QAAM,OAAgC;AAAA,IACpC,UAAU,iBAAiB,IAAI;AAAA,EACjC;AACA,MAAI,QAAQ;AACV,SAAK,oBAAoB,EAAE,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,EAAE;AAAA,EACvD;AACA,QAAM,YAAqC,CAAC;AAC5C,MAAI,OAAO,gBAAgB;AACzB,cAAU,cAAc,OAAO;AACjC,MAAI,OAAO,cAAc;AACvB,cAAU,kBAAkB,OAAO;AACrC,MAAI,OAAO,KAAK,SAAS,EAAE,SAAS,EAAG,MAAK,mBAAmB;AAC/D,MAAI,SAAS,MAAM,SAAS,GAAG;AAC7B,SAAK,QAAQ;AAAA,MACX;AAAA,QACE,sBAAsB,MAAM,IAAI,CAAC,OAAO;AAAA,UACtC,MAAM,EAAE;AAAA,UACR,aAAa,EAAE;AAAA,UACf,YAAY,wBAAwB,EAAE,WAAW;AAAA,QACnD,EAAE;AAAA,MACJ;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,gBAAuBC,YACrB,QAC+C;AAC/C,QAAM,EAAE,QAAQ,OAAO,IAAI;AAC3B,QAAM,MAAM,GAAG,YAAY,OAAO,OAAO,QAAQ,CAAC,QAAQ;AAAA,IACxD,OAAO;AAAA,EACT,CAAC;AACD,QAAM,MAAM,MAAM,MAAM,KAAK;AAAA,IAC3B,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IAC9C,MAAM,KAAK,UAAUD,WAAU,MAAM,CAAC;AAAA,IACtC;AAAA,EACF,CAAC;AACD,MAAI,CAAC,IAAI,MAAM,CAAC,IAAI,MAAM;AACxB,UAAM,OAAO,MAAM,IAAI,KAAK,EAAE,MAAM,MAAM,EAAE;AAC5C,UAAM,IAAI;AAAA,MACR,0BAA0B,IAAI,MAAM,IAAI,IAAI,UAAU,MAAM,IAAI;AAAA,IAClE;AAAA,EACF;AAEA,MAAI,kBAAkB;AACtB,MAAI;AAEJ,mBAAiB,MAAM,SAAS,IAAI,MAAM,MAAM,GAAG;AACjD,QAAI;AACJ,QAAI;AACF,eAAS,KAAK,MAAM,GAAG,IAAI;AAAA,IAC7B,QAAQ;AACN;AAAA,IACF;AACA,YAAQ,qBAAqB,QAAQ,aAAa,KAAK;AACvD,UAAM,QAAQ,QAAQ,aAAa,CAAC,GAAG,SAAS,SAAS,CAAC;AAC1D,eAAW,KAAK,OAAO;AACrB,UAAI,OAAO,EAAE,SAAS,YAAY,EAAE,KAAK,SAAS,GAAG;AACnD,cAAM,EAAE,MAAM,cAAc,OAAO,EAAE,KAAK;AAAA,MAC5C,WAAW,EAAE,gBAAgB,OAAO,EAAE,iBAAiB,UAAU;AAC/D,cAAM,MAAM;AACZ,cAAM,KAAK,QAAQ,GAAG,IAAI,EAAE,aAAa,QAAQ,MAAM;AACvD,cAAM,OAAe,EAAE,aAAa,QAAQ;AAC5C,cAAM,OACJ,EAAE,aAAa,QAAQ,OAAO,EAAE,aAAa,SAAS,WACjD,EAAE,aAAa,OAChB,CAAC;AACP,cAAM;AAAA,UACJ,MAAM;AAAA,UACN,OAAO;AAAA,UACP,YAAY;AAAA,UACZ,UAAU;AAAA,QACZ;AAGA,cAAM,WAAW,KAAK,UAAU,IAAI;AACpC,YAAI,YAAY,aAAa,MAAM;AACjC,gBAAM;AAAA,YACJ,MAAM;AAAA,YACN,OAAO;AAAA,YACP,YAAY;AAAA,YACZ,UAAU;AAAA,YACV,WAAW;AAAA,UACb;AAAA,QACF;AACA,cAAM;AAAA,UACJ,MAAM;AAAA,UACN,OAAO;AAAA,UACP,YAAY;AAAA,UACZ,UAAU;AAAA,UACV;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,MAAI,MAAO,OAAM,EAAE,MAAM,SAAS,MAAM;AACxC,QAAM,EAAE,MAAM,OAAO;AACvB;AAEA,eAAsBE,MAAK,QAGxB;AACD,QAAM,EAAE,QAAQ,OAAO,IAAI;AAC3B,QAAM,MAAM,GAAG,YAAY,OAAO,OAAO,QAAQ,CAAC,QAAQ;AAAA,IACxD,OAAO;AAAA,EACT,CAAC;AACD,QAAM,MAAM,MAAM,MAAM,KAAK;AAAA,IAC3B,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IAC9C,MAAM,KAAK,UAAUF,WAAU,MAAM,CAAC;AAAA,IACtC;AAAA,EACF,CAAC;AACD,MAAI,CAAC,IAAI,IAAI;AACX,UAAMG,QAAO,MAAM,IAAI,KAAK,EAAE,MAAM,MAAM,EAAE;AAC5C,UAAM,IAAI;AAAA,MACR,0BAA0B,IAAI,MAAM,IAAI,IAAI,UAAU,MAAMA,KAAI;AAAA,IAClE;AAAA,EACF;AACA,QAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,MAAI,OAAO;AACX,QAAM,YAIA,CAAC;AACP,QAAM,QAAQ,MAAM,aAAa,CAAC,GAAG,SAAS,SAAS,CAAC;AACxD,aAAW,KAAK,OAAO;AACrB,QAAI,OAAO,EAAE,SAAS,SAAU,SAAQ,EAAE;AAAA,aACjC,EAAE,cAAc;AACvB,gBAAU,KAAK;AAAA,QACb,IAAI,QAAQ,UAAU,MAAM,IAAI,EAAE,aAAa,QAAQ,MAAM;AAAA,QAC7D,MAAM,EAAE,aAAa,QAAQ;AAAA,QAC7B,MACE,EAAE,aAAa,QAAQ,OAAO,EAAE,aAAa,SAAS,WACjD,EAAE,aAAa,OAChB,CAAC;AAAA,MACT,CAAC;AAAA,IACH;AAAA,EACF;AACA,SAAO,EAAE,MAAM,UAAU;AAC3B;;;ACnTA,gBAAuB,YACrB,MACA,QACwC;AACxC,QAAM,SAAS,KAAK,UAAU;AAC9B,QAAM,UAAU,IAAI,YAAY;AAChC,MAAI,SAAS;AAEb,MAAI;AACF,WAAO,MAAM;AACX,UAAI,QAAQ,QAAS;AAErB,YAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,UAAI,KAAM;AAEV,gBAAU,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AAChD,YAAM,QAAQ,OAAO,MAAM,IAAI;AAC/B,eAAS,MAAM,IAAI,KAAK;AAExB,iBAAW,QAAQ,OAAO;AACxB,cAAM,UAAU,KAAK,KAAK;AAC1B,YAAI,CAAC,QAAS;AAEd,YAAI;AACF,gBAAM,KAAK,MAAM,OAAO;AAAA,QAC1B,QAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAEA,UAAM,WAAW,OAAO,KAAK;AAC7B,QAAI,UAAU;AACZ,UAAI;AACF,cAAM,KAAK,MAAM,QAAQ;AAAA,MAC3B,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF,UAAE;AACA,WAAO,YAAY;AAAA,EACrB;AACF;;;AC9CO,IAAM,0BAA0B;AAEhC,SAAS,uBAAuB,SAA0B;AAC/D,QAAM,OAAO,WAAW,yBAAyB,KAAK;AACtD,MAAI,MAAM,IAAI;AACd,SAAO,MAAM,KAAK,IAAI,WAAW,MAAM,CAAC,MAAM,IAAc;AAC1D;AAAA,EACF;AACA,QAAM,UAAU,IAAI,MAAM,GAAG,GAAG;AAEhC,SAAO,QAAQ,SAAS,MAAM,IAAI,QAAQ,MAAM,GAAG,EAAE,IAAI;AAC3D;AAEO,SAAS,kBACd,SACA,MACQ;AACR,SAAO,GAAG,uBAAuB,OAAO,CAAC,GAAG,IAAI;AAClD;;;ACEA,SAAS,eAAe,SAAkC;AACxD,QAAM,SAAmB,CAAC;AAE1B,aAAW,QAAQ,SAAS;AAC1B,QAAI,KAAK,SAAS,QAAS;AAE3B,QAAI,KAAK,MAAM;AACb,aAAO,KAAK,KAAK,IAAI;AACrB;AAAA,IACF;AAEA,UAAM,SAAS,aAAa,KAAK,GAAG;AACpC,QAAI,QAAQ,MAAM;AAChB,aAAO,KAAK,OAAO,IAAI;AAAA,IACzB;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,gBAAgB,SAGvB;AACA,MAAI,OAAO,YAAY,UAAU;AAC/B,WAAO,EAAE,QAAQ;AAAA,EACnB;AAEA,QAAM,OAAO,QACV;AAAA,IACC,CAAC,SACC,KAAK,SAAS;AAAA,EAClB,EACC,IAAI,CAAC,SAAS,KAAK,IAAI,EACvB,KAAK,EAAE;AAEV,QAAM,SAAS,eAAe,OAAO;AACrC,SAAO;AAAA,IACL,SAAS;AAAA,IACT,GAAI,OAAO,SAAS,IAAI,EAAE,OAAO,IAAI,CAAC;AAAA,EACxC;AACF;AAEA,SAAS,iBAAiB,UAAwC;AAChE,SAAO,SAAS,IAAI,CAAC,YAAY;AAC/B,QAAI,QAAQ,SAAS,QAAQ;AAC3B,aAAO;AAAA,QACL,MAAM;AAAA,QACN,WAAW,QAAQ;AAAA,QACnB,SACE,OAAO,QAAQ,YAAY,WACvB,QAAQ,UACR,KAAK,UAAU,QAAQ,cAAc,QAAQ,OAAO;AAAA,MAC5D;AAAA,IACF;AAEA,QAAI,QAAQ,SAAS,aAAa;AAChC,YAAM,UACJ,OAAO,QAAQ,YAAY,WACvB,EAAE,SAAS,QAAQ,QAAQ,IAC3B,gBAAgB,QAAQ,OAAO;AAErC,aAAO;AAAA,QACL,MAAM;AAAA,QACN,GAAG;AAAA,QACH,GAAI,QAAQ,WAAW,SACnB;AAAA,UACE,YAAY,QAAQ,UAAU,IAAI,CAAC,UAAU,WAAW;AAAA,YACtD,MAAM;AAAA,YACN,UAAU;AAAA,cACR;AAAA,cACA,MAAM,SAAS;AAAA,cACf,WAAW,SAAS;AAAA,YACtB;AAAA,UACF,EAAE;AAAA,QACJ,IACA,CAAC;AAAA,MACP;AAAA,IACF;AAEA,WAAO;AAAA,MACL,MAAM,QAAQ;AAAA,MACd,GAAG,gBAAgB,QAAQ,OAAO;AAAA,IACpC;AAAA,EACF,CAAC;AACH;AAEA,SAASC,WAAU,QAAoB,QAAiB;AACtD,QAAM,EAAE,QAAQ,UAAU,MAAM,IAAI;AACpC,QAAM,OAAgC;AAAA,IACpC,OAAO,OAAO;AAAA,IACd,UAAU,iBAAiB,QAAQ;AAAA,IACnC;AAAA,EACF;AAEA,QAAM,UAAmC,CAAC;AAC1C,MAAI,OAAO,gBAAgB;AACzB,YAAQ,cAAc,OAAO;AAC/B,MAAI,OAAO,cAAc,OAAW,SAAQ,cAAc,OAAO;AACjE,MAAI,OAAO,KAAK,OAAO,EAAE,SAAS,EAAG,MAAK,UAAU;AAEpD,MAAI,SAAS,MAAM,SAAS,GAAG;AAC7B,SAAK,QAAQ,MAAM,IAAI,CAAC,UAAU;AAAA,MAChC,MAAM;AAAA,MACN,UAAU;AAAA,QACR,MAAM,KAAK;AAAA,QACX,aAAa,KAAK;AAAA,QAClB,YAAY,KAAK;AAAA,MACnB;AAAA,IACF,EAAE;AAAA,EACJ;AAEA,SAAO;AACT;AAEA,SAAS,aAAa,QAAqC;AACzD,SAAO;AAAA,IACL,gBAAgB;AAAA,IAChB,GAAI,OAAO,OAAO,KAAK,IACnB,EAAE,eAAe,UAAU,OAAO,OAAO,KAAK,CAAC,GAAG,IAClD,CAAC;AAAA,EACP;AACF;AAEA,SAAS,mBAAmB,WAGzB;AACD,MAAI,CAAC,MAAM,QAAQ,SAAS,EAAG,QAAO,CAAC;AAEvC,SAAO,UACJ,IAAI,CAAC,aAAa;AACjB,UAAM,eACJ,YAAY,OAAO,aAAa,WAC3B,SAAoD,WACrD;AAEN,UAAM,OACJ,OAAO,cAAc,SAAS,WAAW,aAAa,OAAO;AAC/D,UAAM,UAAU,cAAc;AAC9B,UAAM,OACJ,WAAW,OAAO,YAAY,WACzB,UACD,CAAC;AAEP,WAAO;AAAA,MACL;AAAA,MACA;AAAA,IACF;AAAA,EACF,CAAC,EACA,OAAO,CAAC,aAAa,SAAS,IAAI;AACvC;AAEA,gBAAuBC,YACrB,QAC+C;AAC/C,QAAM,EAAE,QAAQ,OAAO,IAAI;AAC3B,QAAM,MAAM,MAAM,MAAM,kBAAkB,OAAO,SAAS,WAAW,GAAG;AAAA,IACtE,QAAQ;AAAA,IACR,SAAS,aAAa,MAAM;AAAA,IAC5B,MAAM,KAAK,UAAUD,WAAU,QAAQ,IAAI,CAAC;AAAA,IAC5C;AAAA,EACF,CAAC;AAED,MAAI,CAAC,IAAI,MAAM,CAAC,IAAI,MAAM;AACxB,UAAM,OAAO,MAAM,IAAI,KAAK,EAAE,MAAM,MAAM,EAAE;AAC5C,UAAM,IAAI;AAAA,MACR,0BAA0B,IAAI,MAAM,IAAI,IAAI,UAAU,MAAM,IAAI;AAAA,IAClE;AAAA,EACF;AAKA,MAAI,mBAAmB;AACvB,MAAI;AAEJ,mBAAiB,SAAS,YAAY,IAAI,MAAM,MAAM,GAAG;AACvD,UAAM,UACJ,SAAS,OAAO,UAAU,WACrB,MAAgD,UACjD;AAEN,QAAI,OAAO,SAAS,YAAY,YAAY,QAAQ,QAAQ,SAAS,GAAG;AACtE,YAAM,EAAE,MAAM,cAAc,OAAO,QAAQ,QAAQ;AAAA,IACrD;AAEA,QAAI,CAAC,kBAAkB;AACrB,YAAM,YAAY,mBAAmB,SAAS,UAAU;AACxD,UAAI,UAAU,SAAS,GAAG;AACxB,mBAAW,CAAC,OAAO,QAAQ,KAAK,UAAU,QAAQ,GAAG;AACnD,gBAAM,aAAa,QAAQ,KAAK,IAAI,SAAS,QAAQ,MAAM;AAE3D,gBAAM;AAAA,YACJ,MAAM;AAAA,YACN;AAAA,YACA;AAAA,YACA,UAAU,SAAS;AAAA,UACrB;AAEA,gBAAM,WAAW,KAAK,UAAU,SAAS,IAAI;AAC7C,cAAI,YAAY,aAAa,MAAM;AACjC,kBAAM;AAAA,cACJ,MAAM;AAAA,cACN;AAAA,cACA;AAAA,cACA,UAAU,SAAS;AAAA,cACnB,WAAW;AAAA,YACb;AAAA,UACF;AAEA,gBAAM;AAAA,YACJ,MAAM;AAAA,YACN;AAAA,YACA;AAAA,YACA,UAAU,SAAS;AAAA,YACnB,MAAM,SAAS;AAAA,UACjB;AAAA,QACF;AAEA,2BAAmB;AAAA,MACrB;AAAA,IACF;AAEA,QACE,SACA,OAAO,UAAU,YAChB,MAA8B,OAC/B;AACA,YAAM;AAAA,QACJ,MAAM;AAAA,QACN,SAAS,OAAQ,MAA6B,KAAK;AAAA,MACrD;AAAA,IACF;AACA,YAAQ,qBAAqB,KAAK,KAAK;AAAA,EACzC;AAEA,MAAI,MAAO,OAAM,EAAE,MAAM,SAAS,MAAM;AACxC,QAAM,EAAE,MAAM,OAAO;AACvB;AAEA,eAAsBE,MAAK,QAGxB;AACD,QAAM,EAAE,QAAQ,OAAO,IAAI;AAC3B,QAAM,MAAM,MAAM,MAAM,kBAAkB,OAAO,SAAS,WAAW,GAAG;AAAA,IACtE,QAAQ;AAAA,IACR,SAAS,aAAa,MAAM;AAAA,IAC5B,MAAM,KAAK,UAAUF,WAAU,QAAQ,KAAK,CAAC;AAAA,IAC7C;AAAA,EACF,CAAC;AAED,MAAI,CAAC,IAAI,IAAI;AACX,UAAM,OAAO,MAAM,IAAI,KAAK,EAAE,MAAM,MAAM,EAAE;AAC5C,UAAM,IAAI;AAAA,MACR,0BAA0B,IAAI,MAAM,IAAI,IAAI,UAAU,MAAM,IAAI;AAAA,IAClE;AAAA,EACF;AAEA,QAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,QAAM,UAAU,MAAM,WAAW,CAAC;AAElC,SAAO;AAAA,IACL,MAAM,OAAO,QAAQ,YAAY,WAAW,QAAQ,UAAU;AAAA,IAC9D,WAAW,mBAAmB,QAAQ,UAAU,EAAE,IAAI,CAAC,IAAI,WAAW;AAAA,MACpE,IAAI,QAAQ,KAAK,IAAI,GAAG,QAAQ,MAAM;AAAA,MACtC,MAAM,GAAG;AAAA,MACT,MAAM,GAAG;AAAA,IACX,EAAE;AAAA,EACJ;AACF;;;ACpRO,IAAM,kBAAN,cAA8B,MAAM;AAAA,EAChC;AAAA,EACA;AAAA,EAET,YAAY,QAAgB,SAAiB,MAAgB;AAC3D,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,SAAS;AACd,SAAK,OAAO;AAAA,EACd;AACF;AAEA,eAAe,qBAAqB,KAA+B;AACjE,QAAM,OAAO,MAAM,IAAI,KAAK,EAAE,MAAM,MAAM,EAAE;AAC5C,MAAI,OAAgB;AACpB,MAAI,MAAM;AACR,QAAI;AACF,aAAO,KAAK,MAAM,IAAI;AAAA,IACxB,QAAQ;AAAA,IAER;AAAA,EACF;AACA,QAAM,IAAI;AAAA,IACR,IAAI;AAAA,IACJ,0BAA0B,IAAI,MAAM,IAAI,IAAI,UAAU,MAAM,IAAI;AAAA,IAChE;AAAA,EACF;AACF;AASA,IAAM,kBAAkB;AAExB,SAAS,cAAc,QAAwB,MAAsB;AACnE,SAAO,GAAG,OAAO,WAAW,eAAe,GAAG,IAAI;AACpD;AAEA,SAASG,cAAa,QAAgD;AACpE,QAAM,UAAkC;AAAA,IACtC,gBAAgB;AAAA,IAChB,GAAG,OAAO;AAAA,EACZ;AACA,MAAI,OAAO,QAAQ;AACjB,YAAQ,gBAAgB,UAAU,OAAO,MAAM;AAAA,EACjD;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,SAA0C;AACjE,MAAI,OAAO,YAAY,SAAU,QAAO;AACxC,SAAO,QAAQ,IAAI,CAAC,MAAM;AACxB,QAAI,EAAE,SAAS,OAAQ,QAAO,EAAE,MAAM,QAAQ,MAAM,EAAE,KAAK;AAC3D,WAAO,EAAE,MAAM,aAAa,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE;AAAA,EACxD,CAAC;AACH;AAEO,SAAS,iBAAiB,UAAwC;AACvE,QAAM,MAAiB,CAAC;AACxB,aAAW,KAAK,UAAU;AACxB,QAAI,EAAE,SAAS,QAAQ;AAGrB,YAAM,EAAE,MAAM,WAAW,IAAI,qBAAqB,EAAE,OAAO;AAC3D,YAAM,WACJ,WAAW,SAAS,IAChB,sCACA;AACN,UAAI,KAAK;AAAA,QACP,MAAM;AAAA,QACN,cAAc,EAAE;AAAA,QAChB,SAAS,QAAQ;AAAA,MACnB,CAAC;AACD,UAAI,WAAW,SAAS,GAAG;AACzB,cAAM,YAAuB;AAAA,UAC3B;AAAA,YACE,MAAM;AAAA,YACN,MAAM,wBAAwB,EAAE,UAAU,WAAW,MAAM;AAAA,UAC7D;AAAA,UACA,GAAG,WAAW,IAAI,CAAC,OAAO;AAAA,YACxB,MAAM;AAAA,YACN,WAAW,EAAE,KAAK,EAAE,IAAI;AAAA,UAC1B,EAAE;AAAA,QACJ;AACA,YAAI,KAAK,EAAE,MAAM,QAAQ,SAAS,UAAU,CAAC;AAAA,MAC/C;AACA;AAAA,IACF;AACA,QAAI,EAAE,SAAS,aAAa;AAC1B,YAAM,QAAiC;AAAA,QACrC,MAAM;AAAA,QACN,SACE,OAAO,EAAE,YAAY,YAAY,EAAE,QAAQ,SAAS,IAChD,EAAE,UACF;AAAA,MACR;AACA,UAAI,EAAE,WAAW,QAAQ;AACvB,cAAM,aAAa,EAAE,UAAU,IAAI,CAAC,QAAQ;AAAA,UAC1C,IAAI,GAAG;AAAA,UACP,MAAM;AAAA,UACN,UAAU,EAAE,MAAM,GAAG,MAAM,WAAW,KAAK,UAAU,GAAG,IAAI,EAAE;AAAA,QAChE,EAAE;AAAA,MACJ;AACA,UAAI,KAAK,KAAK;AACd;AAAA,IACF;AACA,QAAI,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,gBAAgB,EAAE,OAAO,EAAE,CAAC;AAAA,EAChE;AACA,SAAO;AACT;AAEA,gBAAuBC,YACrB,QAC+C;AAC/C,QAAM,EAAE,QAAQ,UAAU,OAAO,OAAO,IAAI;AAC5C,QAAM,OAAgC;AAAA,IACpC,OAAO,OAAO;AAAA,IACd,UAAU,iBAAiB,QAAQ;AAAA,IACnC,QAAQ;AAAA,EACV;AAGA,MAAI,OAAO,aAAa,cAAc;AACpC,SAAK,iBAAiB,EAAE,eAAe,KAAK;AAAA,EAC9C;AACA,MAAI,OAAO,gBAAgB,OAAW,MAAK,cAAc,OAAO;AAChE,MAAI,OAAO,cAAc,OAAW,MAAK,aAAa,OAAO;AAC7D,MAAI,SAAS,MAAM,SAAS,GAAG;AAC7B,SAAK,QAAQ,MAAM,IAAI,CAAC,OAAO;AAAA,MAC7B,MAAM;AAAA,MACN,UAAU;AAAA,QACR,MAAM,EAAE;AAAA,QACR,aAAa,EAAE;AAAA,QACf,YAAY,EAAE;AAAA,MAChB;AAAA,IACF,EAAE;AAAA,EACJ;AAEA,QAAM,WAAW,cAAc,QAAQ,mBAAmB;AAC1D,QAAM,MAAM,MAAM,MAAM,UAAU;AAAA,IAChC,QAAQ;AAAA,IACR,SAASD,cAAa,MAAM;AAAA,IAC5B,MAAM,KAAK,UAAU,IAAI;AAAA,IACzB;AAAA,IACA,GAAI,OAAO,cAAc,EAAE,aAAa,OAAO,YAAY,IAAI,CAAC;AAAA,EAClE,CAAC;AAED,QAAM,eAAe,IAAI;AACzB,MAAI,CAAC,IAAI,IAAI;AACX,UAAM,qBAAqB,GAAG;AAAA,EAChC;AACA,MAAI,CAAC,cAAc;AACjB,UAAM,qBAAqB,GAAG;AAAA,EAChC;AAEA,QAAM,SAAS;AAIf,QAAM,UAAU,oBAAI,IAGlB;AAEF,mBAAiB,MAAM,SAAS,QAAQ,MAAM,GAAG;AAC/C,QAAI,CAAC,GAAG,QAAQ,GAAG,SAAS,SAAU;AACtC,QAAI;AACJ,QAAI;AACF,eAAS,KAAK,MAAM,GAAG,IAAI;AAAA,IAC7B,QAAQ;AACN;AAAA,IACF;AACA,UAAM,QAAQ,qBAAqB,QAAQ,KAAK;AAChD,QAAI,OAAO;AACT,YAAM,EAAE,MAAM,SAAS,MAAM;AAAA,IAC/B;AACA,UAAM,SAAS,QAAQ,UAAU,CAAC;AAClC,QAAI,CAAC,OAAQ;AACb,UAAM,QAAQ,OAAO,SAAS,CAAC;AAC/B,QAAI,OAAO,MAAM,YAAY,YAAY,MAAM,QAAQ,SAAS,GAAG;AACjE,YAAM,EAAE,MAAM,cAAc,OAAO,MAAM,QAAQ;AAAA,IACnD;AACA,QAAI,MAAM,QAAQ,MAAM,UAAU,GAAG;AACnC,iBAAW,MAAM,MAAM,YAAY;AACjC,cAAM,MAAM,OAAO,GAAG,UAAU,WAAW,GAAG,QAAQ;AACtD,YAAI,MAAM,QAAQ,IAAI,GAAG;AACzB,YAAI,CAAC,KAAK;AACR,gBAAM;AAAA,YACJ,IAAI,GAAG,MAAM,QAAQ,GAAG;AAAA,YACxB,MAAM,GAAG,UAAU,QAAQ;AAAA,YAC3B,UAAU;AAAA,YACV,SAAS;AAAA,UACX;AACA,kBAAQ,IAAI,KAAK,GAAG;AAAA,QACtB;AACA,YAAI,GAAG,MAAM,CAAC,IAAI,GAAG,WAAW,OAAO,EAAG,KAAI,KAAK,GAAG;AAAA,iBAC7C,GAAG,GAAI,KAAI,KAAK,GAAG;AAC5B,YAAI,GAAG,UAAU,KAAM,KAAI,OAAO,GAAG,SAAS;AAC9C,YAAI,CAAC,IAAI,WAAW,IAAI,MAAM;AAC5B,cAAI,UAAU;AACd,gBAAM;AAAA,YACJ,MAAM;AAAA,YACN,OAAO;AAAA,YACP,YAAY,IAAI;AAAA,YAChB,UAAU,IAAI;AAAA,UAChB;AAAA,QACF;AACA,cAAM,YAAgC,GAAG,UAAU;AACnD,YAAI,OAAO,cAAc,YAAY,UAAU,SAAS,GAAG;AACzD,cAAI,YAAY;AAChB,cAAI,IAAI,SAAS;AACf,kBAAM;AAAA,cACJ,MAAM;AAAA,cACN,OAAO;AAAA,cACP,YAAY,IAAI;AAAA,cAChB,UAAU,IAAI;AAAA,cACd,WAAW;AAAA,YACb;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,QAAI,OAAO,eAAe;AACxB,iBAAW,CAAC,KAAK,GAAG,KAAK,SAAS;AAChC,YAAI,OAAgC,CAAC;AACrC,YAAI,IAAI,UAAU;AAChB,cAAI;AACF,mBAAO,KAAK,MAAM,IAAI,QAAQ;AAAA,UAChC,QAAQ;AACN,mBAAO,CAAC;AAAA,UACV;AAAA,QACF;AACA,cAAM;AAAA,UACJ,MAAM;AAAA,UACN,OAAO;AAAA,UACP,YAAY,IAAI;AAAA,UAChB,UAAU,IAAI;AAAA,UACd;AAAA,QACF;AAAA,MACF;AACA,cAAQ,MAAM;AAAA,IAChB;AAAA,EACF;AACA,QAAM,EAAE,MAAM,OAAO;AACvB;AAEA,eAAsBE,MAAK,QAGxB;AACD,QAAM,EAAE,QAAQ,UAAU,OAAO,OAAO,IAAI;AAC5C,QAAM,OAAgC;AAAA,IACpC,OAAO,OAAO;AAAA,IACd,UAAU,iBAAiB,QAAQ;AAAA,EACrC;AACA,MAAI,OAAO,gBAAgB,OAAW,MAAK,cAAc,OAAO;AAChE,MAAI,OAAO,cAAc,OAAW,MAAK,aAAa,OAAO;AAC7D,MAAI,SAAS,MAAM,SAAS,GAAG;AAC7B,SAAK,QAAQ,MAAM,IAAI,CAAC,OAAO;AAAA,MAC7B,MAAM;AAAA,MACN,UAAU;AAAA,QACR,MAAM,EAAE;AAAA,QACR,aAAa,EAAE;AAAA,QACf,YAAY,EAAE;AAAA,MAChB;AAAA,IACF,EAAE;AAAA,EACJ;AACA,QAAM,WAAW,cAAc,QAAQ,mBAAmB;AAC1D,QAAM,MAAM,MAAM,MAAM,UAAU;AAAA,IAChC,QAAQ;AAAA,IACR,SAASF,cAAa,MAAM;AAAA,IAC5B,MAAM,KAAK,UAAU,IAAI;AAAA,IACzB;AAAA,IACA,GAAI,OAAO,cAAc,EAAE,aAAa,OAAO,YAAY,IAAI,CAAC;AAAA,EAClE,CAAC;AACD,MAAI,CAAC,IAAI,IAAI;AACX,UAAM,qBAAqB,GAAG;AAAA,EAChC;AACA,QAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,QAAM,SAAS,MAAM,UAAU,CAAC,GAAG;AACnC,QAAM,OACJ,OAAO,QAAQ,YAAY,WAAW,OAAO,UAAU;AACzD,QAAM,YAAY,MAAM,QAAQ,QAAQ,UAAU,IAC9C,OAAO,WAAW,IAAI,CAAC,OAAY;AACjC,QAAI,OAAgC,CAAC;AACrC,QAAI;AACF,aAAO,KAAK,MAAM,IAAI,UAAU,aAAa,IAAI;AAAA,IACnD,QAAQ;AACN,aAAO,CAAC;AAAA,IACV;AACA,WAAO;AAAA,MACL,IAAI,GAAG;AAAA,MACP,MAAM,GAAG,UAAU,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,EACF,CAAC,IACD,CAAC;AACL,SAAO,EAAE,MAAM,UAAU;AAC3B;;;ACrSA,SAAS,eAAe,QAAgC;AACtD,SAAO;AAAA,IACL,GAAG;AAAA,IACH,QAAQ;AAAA,MACN,GAAG,OAAO;AAAA,MACV,SAAS;AAAA,MACT,cAAc;AAAA,QACZ,gBAAgB;AAAA,QAChB,WAAW;AAAA,MACb;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAASG,YACd,QAC+C;AAC/C,UAAQ,OAAO,OAAO,UAAU;AAAA,IAC9B,KAAK;AACH,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF,KAAK;AACH,aAAyBA,YAAW,MAAM;AAAA,IAC5C,KAAK;AACH,aAAiB,WAAW,MAAM;AAAA,IACpC,KAAK;AACH,aAAcA,YAAW,MAAM;AAAA,IACjC,KAAK;AACH,aAAyBA,YAAW,eAAe,MAAM,CAAC;AAAA,IAC5D,KAAK;AACH,aAAcA,YAAW,MAAM;AAAA,IACjC;AACE,YAAM,IAAI,MAAM,6BAA6B,OAAO,OAAO,QAAQ,EAAE;AAAA,EACzE;AACF;AAEO,SAASC,MAAK,QAAyC;AAC5D,UAAQ,OAAO,OAAO,UAAU;AAAA,IAC9B,KAAK;AACH,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF,KAAK;AACH,aAAyBA,MAAK,MAAM;AAAA,IACtC,KAAK;AACH,aAAiB,KAAK,MAAM;AAAA,IAC9B,KAAK;AACH,aAAcA,MAAK,MAAM;AAAA,IAC3B,KAAK;AACH,aAAyBA,MAAK,eAAe,MAAM,CAAC;AAAA,IACtD,KAAK;AACH,aAAcA,MAAK,MAAM;AAAA,IAC3B;AACE,YAAM,IAAI,MAAM,6BAA6B,OAAO,OAAO,QAAQ,EAAE;AAAA,EACzE;AACF;;;AC9EO,IAAMC,mBAAkB;AAExB,SAASC,eAAc,QAAwB,MAAsB;AAC1E,QAAM,OAAO,OAAO,WAAWD;AAC/B,SAAO,GAAG,KAAK,QAAQ,OAAO,EAAE,CAAC,GAAG,IAAI;AAC1C;AAEO,SAASE,cAAa,QAAgD;AAC3E,QAAM,UAAkC;AAAA,IACtC,gBAAgB;AAAA,IAChB,GAAG,OAAO;AAAA,EACZ;AACA,MAAI,OAAO,QAAQ;AACjB,YAAQ,gBAAgB,UAAU,OAAO,MAAM;AAAA,EACjD;AACA,SAAO;AACT;AAEA,eAAsB,gBAAgB,KAAgC;AACpE,QAAM,OAAO,MAAM,IAAI,KAAK,EAAE,MAAM,MAAM,EAAE;AAC5C,SAAO,0BAA0B,IAAI,MAAM,IAAI,IAAI,UAAU,MAAM,IAAI;AACzE;;;ACWA,SAAS,uBAAuB,SAA0C;AACxE,MAAI,OAAO,YAAY,SAAU,QAAO;AACxC,SAAO,QAAQ,IAAI,CAAC,MAAM;AACxB,QAAI,EAAE,SAAS,OAAQ,QAAO,EAAE,MAAM,cAAc,MAAM,EAAE,KAAK;AACjE,WAAO,EAAE,MAAM,eAAe,WAAW,EAAE,IAAI;AAAA,EACjD,CAAC;AACH;AAGO,SAAS,sBACd,UACe;AACf,QAAM,cAAwB,CAAC;AAC/B,QAAM,QAAmB,CAAC;AAE1B,aAAW,KAAK,UAAU;AACxB,QAAI,EAAE,SAAS,UAAU;AACvB,YAAM,OACJ,OAAO,EAAE,YAAY,WACjB,EAAE,UACF,EAAE,QACC,OAAO,CAAC,MAAM,EAAE,SAAS,MAAM,EAC/B,IAAI,CAAC,MAAO,EAAuB,IAAI,EACvC,KAAK,IAAI;AAClB,UAAI,KAAM,aAAY,KAAK,IAAI;AAC/B;AAAA,IACF;AACA,QAAI,EAAE,SAAS,QAAQ;AACrB,YAAM,KAAK;AAAA,QACT,MAAM;AAAA,QACN,SAAS,uBAAuB,EAAE,OAAO;AAAA,MAC3C,CAAC;AACD;AAAA,IACF;AACA,QAAI,EAAE,SAAS,aAAa;AAC1B,UAAI,OAAO,EAAE,YAAY,YAAY,EAAE,QAAQ,SAAS,GAAG;AACzD,cAAM,KAAK;AAAA,UACT,MAAM;AAAA,UACN,MAAM;AAAA,UACN,SAAS,CAAC,EAAE,MAAM,eAAe,MAAM,EAAE,QAAQ,CAAC;AAAA,QACpD,CAAC;AAAA,MACH;AACA,iBAAW,MAAM,EAAE,aAAa,CAAC,GAAG;AAClC,cAAM,KAAK;AAAA,UACT,MAAM;AAAA,UACN,SAAS,GAAG;AAAA,UACZ,MAAM,GAAG;AAAA,UACT,WAAW,KAAK,UAAU,GAAG,IAAI;AAAA,QACnC,CAAC;AAAA,MACH;AACA;AAAA,IACF;AACA,QAAI,EAAE,SAAS,QAAQ;AACrB,YAAM,EAAE,MAAM,WAAW,IAAI,qBAAqB,EAAE,OAAO;AAC3D,YAAM,WACJ,WAAW,SAAS,IAChB,sCACA;AACN,YAAM,KAAK;AAAA,QACT,MAAM;AAAA,QACN,SAAS,EAAE;AAAA,QACX,QAAQ,QAAQ;AAAA,MAClB,CAAC;AACD,UAAI,WAAW,SAAS,GAAG;AACzB,cAAM,KAAK;AAAA,UACT,MAAM;AAAA,UACN,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,wBAAwB,EAAE,UAAU,WAAW,MAAM;AAAA,YAC7D;AAAA,YACA,GAAG,WAAW,IAAI,CAAC,OAAO;AAAA,cACxB,MAAM;AAAA,cACN,WAAW,EAAE;AAAA,YACf,EAAE;AAAA,UACJ;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,cAAc,YAAY,SAAS,IAAI,YAAY,KAAK,MAAM,IAAI;AAAA,IAClE;AAAA,EACF;AACF;AAEO,SAAS,iBAAiB,OAAkC;AACjE,SAAO,MAAM,IAAI,CAAC,OAAO;AAAA,IACvB,MAAM;AAAA,IACN,MAAM,EAAE;AAAA,IACR,aAAa,EAAE;AAAA,IACf,YAAY,EAAE;AAAA,IACd,QAAQ;AAAA,EACV,EAAE;AACJ;AAYO,SAAS,yBACd,OACA,QACA,UACA,QACM;AACN,QAAM,UAAU,oBAAoB,MAAM;AAC1C,MAAI,OAAO,YAAY,UAAU;AAC/B,UAAM,KAAK;AAAA,MACT,MAAM;AAAA,MACN,SAAS;AAAA,MACT,QAAQ;AAAA,IACV,CAAC;AACD;AAAA,EACF;AACA,QAAM,EAAE,MAAM,WAAW,IAAI,qBAAqB,OAAO;AACzD,QAAM,KAAK;AAAA,IACT,MAAM;AAAA,IACN,SAAS;AAAA,IACT,QAAQ,QAAQ;AAAA,EAClB,CAAC;AACD,MAAI,WAAW,SAAS,GAAG;AACzB,UAAM,KAAK;AAAA,MACT,MAAM;AAAA,MACN,SAAS;AAAA,QACP;AAAA,UACE,MAAM;AAAA,UACN,MAAM,wBAAwB,UAAU,WAAW,MAAM;AAAA,QAC3D;AAAA,QACA,GAAG,WAAW,IAAI,CAAC,OAAO;AAAA,UACxB,MAAM;AAAA,UACN,WAAW,EAAE;AAAA,QACf,EAAE;AAAA,MACJ;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEA,SAAS,mBACP,QACA,QACyB;AACzB,QAAM,OAAgC;AAAA,IACpC,OAAO,OAAO,OAAO;AAAA,IACrB,OAAO,OAAO;AAAA,IACd,OAAO;AAAA,IACP,SAAS,CAAC,6BAA6B;AAAA,IACvC,WAAW,EAAE,QAAQ,OAAO,OAAO,mBAAmB,MAAM;AAAA,IAC5D;AAAA,EACF;AACA,MAAI,OAAO,aAAc,MAAK,eAAe,OAAO;AACpD,MAAI,OAAO,SAAS,OAAO,MAAM,SAAS,GAAG;AAC3C,SAAK,QAAQ,iBAAiB,OAAO,KAAK;AAAA,EAC5C;AACA,MAAI,OAAO,OAAO,cAAc,QAAW;AACzC,SAAK,oBAAoB,OAAO,OAAO;AAAA,EACzC;AACA,SAAO;AACT;AAQO,SAAS,qBAAqB,QAAuC;AAC1E,QAAM,QAA4B,CAAC;AACnC,aAAW,QAAQ,QAAQ;AACzB,QAAI,CAAC,QAAQ,OAAO,SAAS,SAAU;AACvC,UAAM,MAAM;AACZ,QAAI,IAAI,SAAS,gBAAiB;AAClC,QAAI,OAAO,IAAI,YAAY,YAAY,OAAO,IAAI,SAAS,UAAU;AACnE;AAAA,IACF;AACA,UAAM,KAAK;AAAA,MACT,SAAS,IAAI;AAAA,MACb,MAAM,IAAI;AAAA,MACV,WAAW,OAAO,IAAI,cAAc,WAAW,IAAI,YAAY;AAAA,IACjE,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAEA,SAAS,mBAAmB,QAA2B;AACrD,QAAM,QAAkB,CAAC;AACzB,aAAW,QAAQ,QAAQ;AACzB,QAAI,CAAC,QAAQ,OAAO,SAAS,SAAU;AACvC,UAAM,MAAM;AACZ,QAAI,IAAI,SAAS,aAAa,IAAI,SAAS,YAAa;AACxD,UAAM,UAAU,IAAI;AACpB,QAAI,CAAC,MAAM,QAAQ,OAAO,EAAG;AAC7B,eAAW,SAAS,SAAS;AAC3B,UAAI,CAAC,SAAS,OAAO,UAAU,SAAU;AACzC,YAAM,IAAI;AACV,UAAI,EAAE,SAAS,iBAAiB,OAAO,EAAE,SAAS,UAAU;AAC1D,cAAM,KAAK,EAAE,IAAI;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AACA,SAAO,MAAM,KAAK,EAAE;AACtB;AAEA,SAAS,UAAU,UAA2C;AAC5D,MAAI,CAAC,SAAU,QAAO,CAAC;AACvB,MAAI;AACF,WAAO,KAAK,MAAM,QAAQ;AAAA,EAC5B,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAGA,gBAAuB,oBACrB,QACoD;AACpD,QAAM,MAAM,MAAM,MAAMC,eAAc,OAAO,QAAQ,YAAY,GAAG;AAAA,IAClE,QAAQ;AAAA,IACR,SAASC,cAAa,OAAO,MAAM;AAAA,IACnC,MAAM,KAAK,UAAU,mBAAmB,QAAQ,IAAI,CAAC;AAAA,IACrD,QAAQ,OAAO;AAAA,EACjB,CAAC;AAED,MAAI,CAAC,IAAI,MAAM,CAAC,IAAI,MAAM;AACxB,UAAM,IAAI,MAAM,MAAM,gBAAgB,GAAG,CAAC;AAAA,EAC5C;AAEA,QAAM,cAAc,oBAAI,IAGtB;AACF,MAAI,YAAY;AAChB,MAAI,kBAA6B,CAAC;AAElC,mBAAiB,MAAM,SAAS,IAAI,MAAM,OAAO,MAAM,GAAG;AACxD,QAAI,CAAC,GAAG,QAAQ,GAAG,SAAS,SAAU;AACtC,QAAI;AACJ,QAAI;AACF,eAAS,KAAK,MAAM,GAAG,IAAI;AAAA,IAC7B,QAAQ;AACN;AAAA,IACF;AAEA,UAAM,OAAO,OAAO,OAAO,SAAS,WAAW,OAAO,OAAO,GAAG;AAEhE,QAAI,SAAS,8BAA8B;AACzC,YAAM,QAAQ,OAAO;AACrB,UAAI,OAAO,UAAU,YAAY,MAAM,SAAS,GAAG;AACjD,cAAM,EAAE,MAAM,cAAc,MAAM;AAAA,MACpC;AACA;AAAA,IACF;AAEA,QAAI,SAAS,8BAA8B;AACzC,YAAM,OAAO,OAAO;AACpB,UAAI,MAAM,SAAS,iBAAiB;AAClC,cAAM,SACJ,OAAO,KAAK,YAAY,WAAW,KAAK,UAAU,QAAQ,SAAS;AACrE,cAAM,OAAO,OAAO,KAAK,SAAS,WAAW,KAAK,OAAO;AACzD,cAAM,MAAM;AACZ,oBAAY,IAAI,QAAQ;AAAA,UACtB,OAAO;AAAA,UACP;AAAA,UACA,UAAU;AAAA,UACV,SAAS;AAAA,QACX,CAAC;AACD,cAAM;AAAA,UACJ,MAAM;AAAA,UACN,OAAO;AAAA,UACP,YAAY;AAAA,UACZ,UAAU;AAAA,QACZ;AAAA,MACF;AACA;AAAA,IACF;AAEA,QAAI,SAAS,0CAA0C;AACrD,YAAM,SAAS,OAAO,OAAO,YAAY,WAAW,OAAO,UAAU;AACrE,YAAM,QAAQ,OAAO,OAAO,UAAU,WAAW,OAAO,QAAQ;AAChE,YAAM,MAAM,YAAY,IAAI,MAAM;AAClC,UAAI,OAAO,MAAM,SAAS,GAAG;AAC3B,YAAI,YAAY;AAChB,cAAM;AAAA,UACJ,MAAM;AAAA,UACN,OAAO,IAAI;AAAA,UACX,YAAY;AAAA,UACZ,UAAU,IAAI;AAAA,UACd,WAAW;AAAA,QACb;AAAA,MACF;AACA;AAAA,IACF;AAEA,QAAI,SAAS,yCAAyC;AACpD,YAAM,SAAS,OAAO,OAAO,YAAY,WAAW,OAAO,UAAU;AACrE,YAAM,UACJ,OAAO,OAAO,cAAc,WAAW,OAAO,YAAY;AAC5D,YAAM,MAAM,YAAY,IAAI,MAAM;AAClC,UAAI,KAAK;AACP,YAAI,QAAS,KAAI,WAAW;AAC5B,cAAM;AAAA,UACJ,MAAM;AAAA,UACN,OAAO,IAAI;AAAA,UACX,YAAY;AAAA,UACZ,UAAU,IAAI;AAAA,UACd,MAAM,UAAU,IAAI,YAAY,OAAO;AAAA,QACzC;AAAA,MACF;AACA;AAAA,IACF;AAEA,QAAI,SAAS,sBAAsB;AACjC,YAAM,WAAW,OAAO;AACxB,UAAI,YAAY,MAAM,QAAQ,SAAS,MAAM,GAAG;AAC9C,0BAAkB,SAAS;AAAA,MAC7B;AACA,YAAM,QAAQ,qBAAqB,UAAU,KAAK;AAClD,UAAI,OAAO;AACT,cAAM,EAAE,MAAM,SAAS,MAAM;AAAA,MAC/B;AACA;AAAA,IACF;AAEA,QAAI,SAAS,SAAS;AACpB,YAAM,UACJ,OAAO,OAAO,YAAY,WACtB,OAAO,UACP;AACN,YAAM,EAAE,MAAM,SAAS,QAAQ;AAC/B,aAAO,CAAC;AAAA,IACV;AAAA,EACF;AAEA,QAAM,EAAE,MAAM,OAAO;AACrB,SAAO;AACT;AAEA,eAAsB,sBACpB,QAKC;AACD,QAAM,MAAM,MAAM,MAAMD,eAAc,OAAO,QAAQ,YAAY,GAAG;AAAA,IAClE,QAAQ;AAAA,IACR,SAASC,cAAa,OAAO,MAAM;AAAA,IACnC,MAAM,KAAK,UAAU,mBAAmB,QAAQ,KAAK,CAAC;AAAA,IACtD,QAAQ,OAAO;AAAA,EACjB,CAAC;AAED,MAAI,CAAC,IAAI,IAAI;AACX,UAAM,IAAI,MAAM,MAAM,gBAAgB,GAAG,CAAC;AAAA,EAC5C;AAEA,QAAM,OAAQ,MAAM,IAAI,KAAK;AAC7B,QAAM,SAAS,KAAK;AACpB,MAAI,WAAW,eAAe,WAAW,QAAW;AAClD,UAAM,IAAI,MAAM,qCAAqC,OAAO,MAAM,CAAC,EAAE;AAAA,EACvE;AAEA,QAAM,SAAS,MAAM,QAAQ,KAAK,MAAM,IAAI,KAAK,SAAS,CAAC;AAC3D,QAAM,UAAU,qBAAqB,MAAM;AAC3C,QAAM,OACJ,OAAO,KAAK,gBAAgB,WACxB,KAAK,cACL,mBAAmB,MAAM;AAE/B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,WAAW,QAAQ,IAAI,CAAC,OAAO;AAAA,MAC7B,IAAI,EAAE;AAAA,MACN,MAAM,EAAE;AAAA,MACR,MAAM,UAAU,EAAE,SAAS;AAAA,IAC7B,EAAE;AAAA,EACJ;AACF;;;AChZO,IAAM,wBAAN,MAAiD;AAAA,EAGtD,YAA6B,QAAwB;AAAxB;AAAA,EAAyB;AAAA,EAF7C,kBAAkB;AAAA,EAI3B,OACE,QAC+C;AAC/C,WAAO,KAAK,iBAAiB,MAAM;AAAA,EACrC;AAAA,EAEA,MAAM,SACJ,QACkC;AAClC,UAAM,EAAE,cAAc,MAAM,IAAI,sBAAsB,OAAO,QAAQ;AACrE,UAAM,SAAS,MAAM,sBAAsB;AAAA,MACzC,QAAQ,KAAK;AAAA,MACb;AAAA,MACA;AAAA,MACA,OAAO,OAAO;AAAA,MACd,QAAQ,OAAO;AAAA,IACjB,CAAC;AACD,WAAO,EAAE,MAAM,OAAO,MAAM,WAAW,OAAO,UAAU;AAAA,EAC1D;AAAA,EAEA,OAAO,eACL,QAC+C;AAC/C,UAAM,EAAE,cAAc,OAAO,OAAO,IAAI;AAAA,MACtC,OAAO;AAAA,IACT;AACA,UAAM,QAAmB,CAAC,GAAG,MAAM;AACnC,UAAM,WAAW,OAAO,YAAY;AAEpC,aAAS,OAAO,GAAG,OAAO,UAAU,QAAQ;AAC1C,UAAI,OAAO,QAAQ,QAAS;AAE5B,YAAM,OAAO,oBAAoB;AAAA,QAC/B,QAAQ,KAAK;AAAA,QACb;AAAA,QACA;AAAA,QACA,OAAO,OAAO;AAAA,QACd,QAAQ,OAAO;AAAA,MACjB,CAAC;AAED,UAAI,SAAoB,CAAC;AACzB,iBAAS;AACP,cAAM,OAAO,MAAM,KAAK,KAAK;AAC7B,YAAI,KAAK,MAAM;AACb,mBAAU,KAAK,SAAuB,CAAC;AACvC;AAAA,QACF;AACA,cAAM,KAAK;AACX,YAAI,KAAK,MAAM,SAAS,QAAS;AAAA,MACnC;AAEA,YAAM,KAAK,GAAG,MAAM;AACpB,YAAM,gBAAgB,qBAAqB,MAAM;AACjD,UAAI,cAAc,WAAW,EAAG;AAEhC,iBAAW,QAAQ,eAAe;AAChC,YAAI,OAAO,QAAQ,QAAS;AAC5B,YAAI,OAAgC,CAAC;AACrC,YAAI;AACF,iBAAO,KAAK,MAAM,KAAK,SAAS;AAAA,QAClC,QAAQ;AACN,iBAAO,CAAC;AAAA,QACV;AAEA,YAAI;AACJ,YAAI,UAAU;AACd,YAAI;AACF,mBAAS,MAAM,OAAO,SAAS,KAAK,MAAM,IAAI;AAC9C,oBAAU,kBAAkB,MAAM;AAAA,QACpC,SAAS,KAAK;AACZ,oBAAU;AACV,mBAAS;AAAA,YACP,SAAS;AAAA,YACT,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,UACxD;AAAA,QACF;AAEA,iCAAyB,OAAO,KAAK,SAAS,KAAK,MAAM,MAAM;AAC/D,cAAM;AAAA,UACJ,MAAM;AAAA,UACN,YAAY,KAAK;AAAA,UACjB,UAAU,KAAK;AAAA,UACf;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,wBAAwB,QAO3B;AACD,UAAM,EAAE,cAAc,OAAO,OAAO,IAAI;AAAA,MACtC,OAAO;AAAA,IACT;AACA,UAAM,QAAmB,CAAC,GAAG,MAAM;AACnC,UAAM,WAAW,OAAO,YAAY;AACpC,UAAM,sBAIA,CAAC;AACP,QAAI,YAAY;AAEhB,aAAS,OAAO,GAAG,OAAO,UAAU,QAAQ;AAC1C,UAAI,OAAO,QAAQ,QAAS;AAE5B,YAAM,OAAO,MAAM,sBAAsB;AAAA,QACvC,QAAQ,KAAK;AAAA,QACb;AAAA,QACA;AAAA,QACA,OAAO,OAAO;AAAA,QACd,QAAQ,OAAO;AAAA,MACjB,CAAC;AAED,YAAM,KAAK,GAAG,KAAK,MAAM;AACzB,UAAI,KAAK,UAAU,WAAW,GAAG;AAC/B,oBAAY,KAAK;AACjB;AAAA,MACF;AAEA,iBAAW,MAAM,KAAK,WAAW;AAC/B,YAAI;AACJ,YAAI,UAAU;AACd,YAAI;AACF,mBAAS,MAAM,OAAO,SAAS,GAAG,MAAM,GAAG,IAAI;AAC/C,oBAAU,kBAAkB,MAAM;AAAA,QACpC,SAAS,KAAK;AACZ,oBAAU;AACV,mBAAS;AAAA,YACP,SAAS;AAAA,YACT,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,UACxD;AAAA,QACF;AACA,4BAAoB,KAAK;AAAA,UACvB,UAAU,GAAG;AAAA,UACb,MAAM,GAAG;AAAA,UACT;AAAA,QACF,CAAC;AACD,iCAAyB,OAAO,GAAG,IAAI,GAAG,MAAM,MAAM;AACtD,aAAK;AAAA,MACP;AAAA,IACF;AAEA,WAAO,EAAE,SAAS,WAAW,WAAW,oBAAoB;AAAA,EAC9D;AAAA,EAEA,OAAe,iBACb,QAC+C;AAC/C,UAAM,EAAE,cAAc,MAAM,IAAI,sBAAsB,OAAO,QAAQ;AACrE,UAAM,OAAO,oBAAoB;AAAA,MAC/B,QAAQ,KAAK;AAAA,MACb;AAAA,MACA;AAAA,MACA,OAAO,OAAO;AAAA,MACd,QAAQ,OAAO;AAAA,IACjB,CAAC;AACD,eAAS;AACP,YAAM,OAAO,MAAM,KAAK,KAAK;AAC7B,UAAI,KAAK,KAAM;AACf,YAAM,KAAK;AACX,UAAI,KAAK,MAAM,SAAS,QAAS;AAAA,IACnC;AAAA,EACF;AACF;;;ACjJO,SAAS,gBAAgB,QAAmC;AACjE,MAAI,OAAO,aAAa,UAAU;AAChC,WAAO,IAAI,sBAAsB,MAAM;AAAA,EACzC;AACA,SAAO,IAAI,cAAc,MAAM;AACjC;AAGO,IAAM,gBAAN,MAAyC;AAAA,EAC9C,YAA6B,QAAwB;AAAxB;AAAA,EAAyB;AAAA,EAEtD,OACE,QAC+C;AAC/C,WAAOC,YAAW;AAAA,MAChB,QAAQ,KAAK;AAAA,MACb,UAAU,OAAO;AAAA,MACjB,OAAO,OAAO;AAAA,MACd,QAAQ,OAAO;AAAA,IACjB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,SACJ,QACkC;AAClC,UAAM,SAAS,MAAMC,MAAK;AAAA,MACxB,QAAQ,KAAK;AAAA,MACb,UAAU,OAAO;AAAA,MACjB,OAAO,OAAO;AAAA,MACd,QAAQ,OAAO;AAAA,IACjB,CAAC;AACD,WAAO,EAAE,MAAM,OAAO,MAAM,WAAW,OAAO,UAAU;AAAA,EAC1D;AACF;;;ACnDA,gBAAuB,YACrB,QAC+C;AAC/C,MAAI,OAAO,OAAO,mBAAmB,OAAO,OAAO,gBAAgB;AACjE,WAAO,OAAO,OAAO,eAAe,MAAM;AAC1C;AAAA,EACF;AAEA,QAAM,EAAE,QAAQ,OAAO,UAAU,OAAO,IAAI;AAC5C,QAAM,WAAW,OAAO,YAAY;AACpC,QAAM,WAA8B,CAAC,GAAG,OAAO,QAAQ;AAEvD,WAAS,OAAO,GAAG,OAAO,UAAU,QAAQ;AAC1C,QAAI,QAAQ,QAAS;AAIrB,UAAM,mBAIA,CAAC;AACP,QAAI,gBAAgB;AAEpB,QAAI;AACF,uBAAiB,MAAM,OAAO,OAAO;AAAA,QACnC;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC,GAAG;AACF,YAAI,GAAG,SAAS,cAAc;AAC5B,2BAAiB,GAAG;AAAA,QACtB,WAAW,GAAG,SAAS,mBAAmB;AACxC,2BAAiB,KAAK;AAAA,YACpB,IAAI,GAAG;AAAA,YACP,MAAM,GAAG;AAAA,YACT,MAAM,GAAG;AAAA,UACX,CAAC;AAAA,QACH;AACA,cAAM;AAAA,MACR;AAAA,IACF,SAAS,KAAK;AAIZ,UAAI,eAAe,iBAAiB;AAClC,cAAM;AAAA,MACR;AACA,YAAM;AAAA,QACJ,MAAM;AAAA,QACN,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,MAC1D;AACA;AAAA,IACF;AAEA,QAAI,iBAAiB,WAAW,GAAG;AAEjC;AAAA,IACF;AAGA,aAAS,KAAK;AAAA,MACZ,MAAM;AAAA,MACN,SAAS;AAAA,MACT,WAAW;AAAA,IACb,CAAC;AAID,eAAW,MAAM,kBAAkB;AACjC,UAAI,QAAQ,QAAS;AACrB,UAAI;AACJ,UAAI,UAAU;AACd,UAAI;AACF,iBAAS,MAAM,SAAS,GAAG,MAAM,GAAG,IAAI;AACxC,kBAAU,kBAAkB,MAAM;AAAA,MACpC,SAAS,KAAK;AACZ,kBAAU;AACV,iBAAS;AAAA,UACP,SAAS;AAAA,UACT,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,QACxD;AAAA,MACF;AACA,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS,oBAAoB,MAAM;AAAA,QACnC,YAAY,GAAG;AAAA,QACf,UAAU,GAAG;AAAA,QACb,YAAY;AAAA,QACZ,aAAa;AAAA,MACf,CAAC;AACD,YAAM;AAAA,QACJ,MAAM;AAAA,QACN,YAAY,GAAG;AAAA,QACf,UAAU,GAAG;AAAA,QACb;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAOA,eAAsB,wBAAwB,QAO3C;AACD,MAAI,OAAO,OAAO,mBAAmB,OAAO,OAAO,yBAAyB;AAC1E,WAAO,OAAO,OAAO,wBAAwB,MAAM;AAAA,EACrD;AAEA,QAAM,EAAE,QAAQ,OAAO,UAAU,OAAO,IAAI;AAC5C,QAAM,WAAW,OAAO,YAAY;AACpC,QAAM,WAA8B,CAAC,GAAG,OAAO,QAAQ;AACvD,QAAM,sBAIA,CAAC;AACP,MAAI,YAAY;AAEhB,WAAS,OAAO,GAAG,OAAO,UAAU,QAAQ;AAC1C,QAAI,QAAQ,QAAS;AACrB,UAAM,EAAE,MAAM,UAAU,IAAI,MAAM,OAAO,SAAS;AAAA,MAChD;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AACD,QAAI,UAAU,WAAW,GAAG;AAC1B,kBAAY;AACZ;AAAA,IACF;AACA,aAAS,KAAK;AAAA,MACZ,MAAM;AAAA,MACN,SAAS;AAAA,MACT;AAAA,IACF,CAAC;AACD,eAAW,MAAM,WAAW;AAC1B,UAAI;AACJ,UAAI,UAAU;AACd,UAAI;AACF,iBAAS,MAAM,SAAS,GAAG,MAAM,GAAG,IAAI;AACxC,kBAAU,kBAAkB,MAAM;AAAA,MACpC,SAAS,KAAK;AACZ,kBAAU;AACV,iBAAS;AAAA,UACP,SAAS;AAAA,UACT,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,QACxD;AAAA,MACF;AACA,0BAAoB,KAAK;AAAA,QACvB,UAAU,GAAG;AAAA,QACb,MAAM,GAAG;AAAA,QACT;AAAA,MACF,CAAC;AACD,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS,oBAAoB,MAAM;AAAA,QACnC,YAAY,GAAG;AAAA,QACf,UAAU,GAAG;AAAA,QACb,YAAY;AAAA,QACZ,aAAa;AAAA,MACf,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO,EAAE,SAAS,WAAW,WAAW,oBAAoB;AAC9D;;;ACvLA,gBAAuB,kBACrB,QACA,SAC+C;AAC/C,SAAO,YAAY;AAAA,IACjB;AAAA,IACA,UAAU,QAAQ;AAAA,IAClB,OAAO,QAAQ;AAAA,IACf,UAAU,QAAQ;AAAA,IAClB,UAAU,QAAQ;AAAA,IAClB,QAAQ,QAAQ;AAAA,EAClB,CAAC;AACH;AAGA,gBAAuB,uBACrB,QACA,SACyC;AACzC,MAAI,YAAY;AAChB,MAAI,cAAgC;AAEpC,mBAAiB,MAAM,kBAAkB,QAAQ,OAAO,GAAG;AACzD,QAAI,GAAG,SAAS,cAAc;AAC5B,mBAAa,GAAG;AAAA,IAClB,WAAW,GAAG,SAAS,mBAAmB;AACxC,oBAAc;AAAA,QACZ,QAAQ;AAAA,UACN,MAAM,GAAG;AAAA,UACT,WAAW,GAAG;AAAA,UACd,KAAK,gBAAgB,GAAG,QAAQ;AAAA,QAClC;AAAA,QACA,aAAa;AAAA,MACf;AACA,YAAM;AAAA,IACR,WAAW,GAAG,SAAS,iBAAiB,aAAa;AACnD,YAAM,cACJ,OAAO,GAAG,WAAW,WACjB,GAAG,SACH,KAAK,UAAU,GAAG,UAAU,EAAE;AACpC,YAAM;AAAA,QACJ,QAAQ,YAAY;AAAA,QACpB;AAAA,MACF;AACA,oBAAc;AAAA,IAChB,WAAW,GAAG,SAAS,SAAS;AAC9B,YAAM,IAAI,MAAM,GAAG,OAAO;AAAA,IAC5B;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAsB,eACpB,QACA,SACiB;AACjB,QAAM,SAAS,MAAM,wBAAwB;AAAA,IAC3C;AAAA,IACA,UAAU,QAAQ;AAAA,IAClB,OAAO,QAAQ;AAAA,IACf,UAAU,QAAQ;AAAA,IAClB,UAAU,QAAQ;AAAA,IAClB,QAAQ,QAAQ;AAAA,EAClB,CAAC;AACD,SAAO,OAAO;AAChB;;;ACxFA,IAAAC,iBAAuB;AAYvB,IAAM,eAAyC;AAAA,EAC7C,QAAQ,CAAC,gBAAgB;AAAA,EACzB,WAAW,CAAC,mBAAmB;AAAA,EAC/B,QAAQ,CAAC,kBAAkB,8BAA8B;AAAA,EACzD,YAAY,CAAC,oBAAoB;AAAA,EACjC,QAAQ,CAAC;AAAA,EACT,qBAAqB,CAAC,gBAAgB;AACxC;AAEA,SAAS,cAAc,UAAkB,QAAkC;AACzE,MAAI,QAAQ,OAAQ,QAAO,OAAO;AAClC,QAAM,UAAU,aAAa,QAAQ,KAAK,CAAC;AAC3C,MAAI,OAAO,YAAY,eAAe,QAAQ,KAAK;AACjD,eAAW,UAAU,SAAS;AAC5B,YAAM,MAAM,QAAQ,IAAI,MAAM;AAC9B,UAAI,KAAK;AACP,8BAAO,MAAM,sBAAsB,MAAM,QAAQ,QAAQ,EAAE;AAC3D,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACA,MAAI,aAAa,SAAU,QAAO;AAClC,QAAM,OACJ,QAAQ,SAAS,IAAI,QAAQ,KAAK,MAAM,IAAI;AAC9C,QAAM,IAAI,MAAM,mCAAmC,QAAQ,UAAU,IAAI,GAAG;AAC9E;AAGO,SAAS,+BACd,WACA,QACgB;AAChB,QAAM,QAAQ,UAAU,MAAM,GAAG;AACjC,MAAI,MAAM,SAAS,GAAG;AACpB,UAAM,IAAI;AAAA,MACR,uBAAuB,SAAS;AAAA,IAClC;AAAA,EACF;AACA,QAAM,WAAW,MAAM,CAAC,EAAE,YAAY;AACtC,QAAM,QAAQ,MAAM,MAAM,CAAC,EAAE,KAAK,GAAG;AACrC,QAAM,YAA4B;AAAA,IAChC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,MAAI,CAAC,UAAU,SAAS,QAAwB,GAAG;AACjD,UAAM,IAAI;AAAA,MACR,yBAAyB,QAAQ,iBAAiB,UAAU,KAAK,IAAI,CAAC;AAAA,IACxE;AAAA,EACF;AACA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,QAAQ,cAAc,UAAU,MAAM;AAAA,IACtC,aAAa,QAAQ;AAAA,IACrB,WAAW,QAAQ;AAAA,IACnB,SAAS,QAAQ;AAAA,IACjB,cAAc,QAAQ;AAAA,IACtB,aAAa,QAAQ;AAAA,EACvB;AACF;AAEO,SAAS,0BACd,UACA,OACA,QACgB;AAChB,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,QAAQ,cAAc,UAAU,MAAM;AAAA,IACtC,aAAa,QAAQ;AAAA,IACrB,WAAW,QAAQ;AAAA,IACnB,SAAS,QAAQ;AAAA,IACjB,cAAc,QAAQ;AAAA,IACtB,aAAa,QAAQ;AAAA,EACvB;AACF;;;AC1FO,IAAM,UAAU;AAEhB,SAAS,oBAA4B;AAC1C,SAAO;AACT;;;ACFO,SAAS,oBACd,gBACA,UACA,iBACA,kBACA,cACA,QAQA;AACA,MAAI,OAAO,mBAAmB,YAAY,mBAAmB,MAAM;AACjE,WAAO;AAAA,MACL,QAAQ,eAAe;AAAA,MACvB,UAAU,eAAe;AAAA,MACzB,iBAAiB,eAAe;AAAA,MAChC,UAAU,eAAe;AAAA,MACzB,QAAQ,eAAe;AAAA,MACvB,QAAQ,eAAe;AAAA,IACzB;AAAA,EACF;AACA,SAAO;AAAA,IACL,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,EACF;AACF;;;AC/BA,iBAA6B;AAC7B,IAAAC,iBAAuB;AAKvB,IAAM,qBAAqB;AAC3B,IAAM,4BAA4B;AAKlC,SAAS,0BACP,gBACA,UACA,iBACA,iBACA,cAOA;AAEA,MAAI,OAAO,mBAAmB,YAAY,mBAAmB,MAAM;AACjE,UAAM,UAAU;AAChB,WAAO;AAAA,MACL,OAAO,QAAQ,UAAU;AAAA,MACzB,UAAU,QAAQ;AAAA,MAClB,iBAAiB,QAAQ;AAAA,MACzB,iBAAiB,QAAQ;AAAA,MACzB,cAAc,QAAQ;AAAA,IACxB;AAAA,EACF;AAGA,SAAO;AAAA,IACL,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEO,IAAM,cAAN,MAAkB;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAwB;AAAA,EAEhC,YAAY,SAAiE;AAC3E,SAAK,UAAU,QAAQ;AACvB,SAAK,UAAU,QAAQ,WAAW;AAGlC,UAAM,SACJ,QAAQ,WACP,OAAO,YAAY,eAAe,QAAQ,KAAK;AAClD,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI;AAAA,QACR;AAAA,MAGF;AAAA,IACF;AACA,SAAK,SAAS;AAAA,EAChB;AAAA,EAEQ,qBAAwB,QAA2B;AAIzD,eAAO,yBAAa,MAAM;AAAA,EAC5B;AAAA,EAEQ,wBACN,cACA,cACG;AAIH,QAAI;AAGJ,QAAI,OAAO,iBAAiB,YAAY,iBAAiB,MAAM;AAC7D,UAAI,YAAY,cAAc;AAC5B,cAAM,cAAc,aAAa;AAEjC,YACE,OAAO,gBAAgB,YACvB,gBAAgB,QAChB,YAAY,aACZ;AAEA,uBAAa,YAAY;AAAA,QAC3B,OAAO;AAEL,uBAAa;AAAA,QACf;AAAA,MACF,OAAO;AACL,qBAAa;AAAA,MACf;AAAA,IACF,WAAW,OAAO,iBAAiB,UAAU;AAC3C,UAAI;AACF,qBAAa,KAAK,MAAM,YAAY;AAAA,MACtC,QAAQ;AAEN,qBAAa,EAAE,SAAS,aAAa;AAAA,MACvC;AAAA,IACF,OAAO;AACL,mBAAa;AAAA,IACf;AAGA,QAAI;AACF,aAAO,aAAa,MAAM,UAAU;AAAA,IACtC,SAAS,GAAG;AACV,4BAAO,KAAK,sCAAsC,CAAC,EAAE;AAErD,YAAM,cAAe,aAAqB,MAAM,MAAM;AACtD,UAAI,eAAe,aAAa,aAAa;AAC3C,eAAO,aAAa,MAAM,EAAE,SAAS,OAAO,UAAU,EAAE,CAAC;AAAA,MAC3D;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAc,oBAAqC;AAIjD,UAAM,cAAc;AAAA,MAClB,OAAO,0BAA0B,KAAK,OAAO;AAAA,MAC7C,UAAU,KAAK;AAAA,MACf,MAAM;AAAA,IACR;AAEA,UAAM,UAAU;AAAA,MACd,gBAAgB;AAAA,MAChB,aAAa,KAAK;AAAA,IACpB;AACA,UAAM,UAAU,GAAG,KAAK,OAAO,GAAG,kBAAkB;AAEpD,0BAAO,MAAM,6CAAsC,KAAK,OAAO,EAAE;AAEjE,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,SAAS;AAAA,QACpC,QAAQ;AAAA,QACR;AAAA,QACA,MAAM,KAAK,UAAU,WAAW;AAAA,MAClC,CAAC;AAED,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,eAAe,MAAM,SAAS,KAAK;AACzC,cAAM,aAAa,SAAS;AAE5B,YAAI,eAAe,KAAK;AACtB,gBAAM,IAAI;AAAA,YACR,2BAA2B,KAAK,OAAO;AAAA,UAEzC;AAAA,QACF;AACA,cAAM,IAAI;AAAA,UACR,kCAAkC,UAAU,MAAM,YAAY;AAAA,QAChE;AAAA,MACF;AAEA,YAAM,WAAW,MAAM,SAAS,KAAK;AACrC,YAAM,SAAS,SAAS;AACxB,4BAAO,MAAM,gCAA2B,MAAM,EAAE;AAChD,aAAO;AAAA,IACT,SAAS,GAAG;AACV,UAAI,aAAa,OAAO;AACtB,cAAM,IAAI,UAAU,kCAAkC,EAAE,OAAO,EAAE;AAAA,MACnE;AACA,YAAM,IAAI,MAAM,kCAAkC,OAAO,CAAC,CAAC,EAAE;AAAA,IAC/D;AAAA,EACF;AAAA,EAwBA,MAAa,IACX,gBACA,UACA,iBACA,iBACA,cACY;AAKZ,UAAM;AAAA,MACJ;AAAA,MACA,UAAU;AAAA,MACV,iBAAiB;AAAA,MACjB,cAAc;AAAA,IAChB,IAAI;AAAA,MACF;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,QAAI,YAAY,QAAW;AACzB,4BAAO,KAAK,4DAA4D;AAAA,IAC1E;AAEA,QAAI;AACF,4BAAO,MAAM,6CAAsC,KAAK,OAAO,EAAE;AAGjE,UAAI,KAAK,WAAW,MAAM;AACxB,aAAK,SAAS,MAAM,KAAK,kBAAkB;AAAA,MAC7C;AAEA,YAAM,SAAS,KAAK;AAGpB,YAAM,mBAAwB;AAAA,QAC5B;AAAA,QACA,WAAW,SAAS;AAAA,MACtB;AAGA,UAAI,QAAQ;AACV,yBAAiB,gBAAgB,KAAK,qBAAqB,MAAM;AACjE,8BAAO,MAAM,+CAAwC;AAAA,MACvD;AAEA,YAAM,UAAU;AAAA,QACd,gBAAgB;AAAA,QAChB,aAAa,KAAK;AAAA,MACpB;AACA,YAAM,eAAe,GAAG,KAAK,OAAO,GAAG,0BAA0B,QAAQ,aAAa,MAAM,CAAC;AAC7F,4BAAO,MAAM,qCAA8B,MAAM,EAAE;AAEnD,YAAM,WAAW,MAAM,MAAM,cAAc;AAAA,QACzC,QAAQ;AAAA,QACR;AAAA,QACA,MAAM,KAAK,UAAU,gBAAgB;AAAA,QACrC,QAAQ,YAAY,QAAQ,GAAM;AAAA;AAAA,MACpC,CAAC;AAED,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,eAAe,MAAM,SAAS,KAAK;AACzC,cAAM,aAAa,SAAS;AAG5B,YAAI,eAAe,KAAK;AACtB,gCAAO,MAAM,iCAA4B,YAAY,EAAE;AACvD,gBAAM,IAAI;AAAA,YACR;AAAA,UAEF;AAAA,QACF,WAAW,eAAe,KAAK;AAC7B,gCAAO,MAAM,4BAAuB,YAAY,EAAE;AAClD,gBAAM,IAAI;AAAA,YACR,8DAA8D,KAAK,OAAO;AAAA,UAE5E;AAAA,QACF,WAAW,eAAe,KAAK;AAC7B,gCAAO,MAAM,2BAAsB,YAAY,EAAE;AACjD,gBAAM,IAAI;AAAA,YACR,2BAA2B,KAAK,OAAO;AAAA,UAEzC;AAAA,QACF,WAAW,eAAe,KAAK;AAC7B,gCAAO,MAAM,4BAAuB,YAAY,EAAE;AAClD,gBAAM,IAAI;AAAA,YACR,8BAA8B,YAAY;AAAA,UAE5C;AAAA,QACF,WAAW,eAAe,KAAK;AAC7B,gCAAO,MAAM,wBAAmB,YAAY,EAAE;AAC9C,gBAAM,IAAI;AAAA,YACR;AAAA,UAEF;AAAA,QACF,OAAO;AACL,gCAAO;AAAA,YACL,8CAAyC,UAAU,KAAK,YAAY;AAAA,UACtE;AACA,gBAAM,IAAI;AAAA,YACR,kCAAkC,UAAU,MAAM,YAAY;AAAA,UAChE;AAAA,QACF;AAAA,MACF;AAEA,YAAM,SAAS,MAAM,SAAS,KAAK;AACnC,4BAAO,MAAM,uBAAgB,KAAK,UAAU,MAAM,CAAC,EAAE;AACrD,4BAAO,MAAM,gDAA2C;AAGxD,UAAI,OAAO,WAAW,YAAY,WAAW,MAAM;AAEjD,YAAI,OAAO,WAAW,WAAW,OAAO,UAAU,MAAM;AACtD,gBAAM,WAAW,OAAO,SAAS,OAAO,MAAM;AAC9C,gCAAO,MAAM,yCAAoC,QAAQ,EAAE;AAC3D,gBAAM,IAAI,MAAM,kCAAkC,QAAQ,EAAE;AAAA,QAC9D;AAGA,YAAI,OAAO,MAAM,EAAE,SAAS,sBAAsB,GAAG;AACnD,gCAAO,MAAM,uCAAkC,MAAM,EAAE;AACvD,gBAAM,IAAI;AAAA,YACR;AAAA;AAAA;AAAA;AAAA;AAAA,aAMgB,MAAM;AAAA,UACxB;AAAA,QACF;AAAA,MACF;AAGA,UAAI,QAAQ;AACV,eAAO,KAAK,wBAAwB,QAAQ,MAAM;AAAA,MACpD;AAGA,UAAI,OAAO,WAAW,YAAY,WAAW,QAAQ,YAAY,QAAQ;AACvE,eAAO,OAAO;AAAA,MAChB,WAAW,OAAO,WAAW,UAAU;AACrC,eAAO;AAAA,MACT,OAAO;AACL,eAAO,OAAO,MAAM;AAAA,MACtB;AAAA,IACF,SAAS,GAAG;AACV,UAAI,aAAa,OAAO;AAEtB,YAAI,EAAE,SAAS,cAAc;AAC3B,gCAAO,MAAM,sCAAiC,CAAC,EAAE;AACjD,gBAAM,IAAI;AAAA,YACR;AAAA,UAEF;AAAA,QACF;AACA,8BAAO,MAAM,kCAA6B,CAAC,EAAE;AAC7C,cAAM,IAAI,MAAM,kCAAkC,EAAE,OAAO,EAAE;AAAA,MAC/D;AACA,4BAAO,MAAM,kCAA6B,CAAC,EAAE;AAC7C,YAAM,IAAI,MAAM,kCAAkC,OAAO,CAAC,CAAC,EAAE;AAAA,IAC/D;AAAA,EACF;AAAA;AAAA,EAyBA,OAAc,OACZ,gBACA,UACA,iBACA,iBACA,cAC8B;AAK9B,UAAM,SAAS,MAAM,KAAK;AAAA,MACxB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAa,QAAuB;AAIlC,0BAAO,MAAM,sCAA+B;AAAA,EAK9C;AACF;;;AxB/WO,IAAM,WAAN,MAAe;AAAA,EACpB,OAAc,oBAA4B;AACxC,WAAO,kBAAkB;AAAA,EAC3B;AAAA,EAEQ;AAAA,EACA;AAAA,EACA,aAA8B,CAAC;AAAA,EAC/B,qBAAqB;AAAA,EACrB;AAAA,EACA,gBAA0D,CAAC;AAAA,EAC3D;AAAA,EAIA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,WAAW;AAAA,EACX,cAAkC;AAAA,EAClC,mBAAmB;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,uBAA0C,CAAC;AAAA,EAC3C;AAAA,EACA;AAAA,EAER,YAAY,SAA0B;AACpC,QAAI,QAAQ,SAAS;AACnB,WAAK,WAAW;AAChB,WAAK,cAAc,IAAI,YAAY;AAAA,QACjC,SAAS,QAAQ;AAAA,QACjB,QAAQ,QAAQ;AAAA,QAChB,SAAS,QAAQ;AAAA,MACnB,CAAC;AACD,WAAK,WAAW,QAAQ,YAAY;AACpC,WAAK,iBAAiB,QAAQ,kBAAkB;AAChD,WAAK,gBAAgB,IAAI,cAAc;AACvC,WAAK,eACH,QAAQ,gBACR;AACF,WAAK,kBAAkB,CAAC;AACxB,WAAK,yBAAyB;AAC9B,WAAK,uBAAuB;AAC5B,WAAK,gBAAgB,QAAQ,iBAAiB;AAC9C;AAAA,IACF;AAEA,SAAK,WAAW,QAAQ,YAAY;AACpC,SAAK,iBAAiB,QAAQ,kBAAkB;AAChD,SAAK,eACH,QAAQ,gBACR;AACF,SAAK,kBAAkB,QAAQ,mBAAmB,CAAC;AACnD,SAAK,yBAAyB,QAAQ,0BAA0B;AAChE,SAAK,uBAAuB,QAAQ,wBAAwB;AAC5D,SAAK,gBAAgB,QAAQ,iBAAiB;AAC9C,SAAK,gBAAgB,IAAI,cAAc,KAAK,eAAe;AAC3D,SAAK,YAAY,QAAQ;AACzB,SAAK,kBAAkB,QAAQ,UAAU;AAEzC,QAAI,OAAO,QAAQ,QAAQ,UAAU;AACnC,WAAK,mBAAmB;AACxB,WAAK,YAAY,QAAQ;AACzB,UACE,CAAC,KAAK,mBAAmB,MACxB,CAAC,KAAK,oBACL,OAAO,KAAK,KAAK,gBAAgB,EAAE,WAAW,MAChD,CAAC,QAAQ,UACT,CAAC,QAAQ,YAAY,QACrB;AACA,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK,yBAAyB,QAAQ;AACtC,WAAK,SAAS,QAAQ;AACtB,WAAK,aAAa,QAAQ,cAAc,CAAC;AACzC,UACE,CAAC,KAAK,mBAAmB,KACzB,CAAC,KAAK,UACN,KAAK,WAAW,WAAW,MAC1B,CAAC,KAAK,oBACL,OAAO,KAAK,KAAK,gBAAgB,EAAE,WAAW,IAChD;AACA,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,QAAI,QAAQ,OAAQ,MAAK,SAAS,QAAQ;AAC1C,QAAI,QAAQ,YAAY,OAAQ,MAAK,aAAa,QAAQ;AAE1D,QAAI,KAAK,mBAAmB,KAAK,KAAK,wBAAwB;AAC5D,WAAK,gBAAgB,KAAK,kBAAmB,KAAK,sBAAsB;AAAA,IAC1E,WAAW,KAAK,mBAAmB,KAAK,KAAK,WAAW;AACtD,WAAK,SAAS;AAAA,QACZ,+BAA+B,KAAK,WAAW,KAAK,SAAS;AAAA,MAC/D;AACA,WAAK;AAAA,QACH,KAAK;AAAA,QACL,+BAA+B,KAAK,WAAW,KAAK,SAAS;AAAA,MAC/D;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,kBAAkB,YAAoC;AAC5D,QAAI,CAAC,WAAY;AACjB,QAAI,MAAM,QAAQ,UAAU,GAAG;AAC7B,WAAK,mBAAmB;AACxB;AAAA,IACF;AACA,SAAK,mBAAmB;AAAA,EAC1B;AAAA,EAEQ,qBAA8B;AACpC,YAAQ,KAAK,kBAAkB,UAAU,KAAK;AAAA,EAChD;AAAA,EAEA,MAAM,aAA4B;AAChC,QAAI,KAAK,UAAU;AACjB,WAAK,cAAc;AACnB;AAAA,IACF;AACA,QAAI,KAAK,YAAa;AAEtB,QAAI,KAAK,kBAAkB;AACzB,UAAI,CAAC,KAAK,UAAU,KAAK,kBAAkB;AACzC,cAAM,EAAE,UAAU,IAAI,MAAM,OAAO,iBAAiB;AACpD,aAAK,SAAS,IAAI,UAAU,EAAE,YAAY,KAAK,iBAAiB,CAAC;AACjE,aAAK,qBAAqB;AAAA,MAC5B;AACA,UAAI,KAAK,WAAW;AAClB,aAAK,SAAS;AAAA,UACZ,+BAA+B,KAAK,WAAW,KAAK,SAAS;AAAA,QAC/D;AAAA,MACF;AAAA,IACF,WAAW,KAAK,wBAAwB;AACtC,WAAK,SAAS,gBAAgB,KAAK,sBAAsB;AAAA,IAC3D;AAEA,QAAI,CAAC,KAAK,QAAQ;AAChB,YAAM,IAAI,MAAM,4BAA4B;AAAA,IAC9C;AAEA,QAAI,CAAC,KAAK,mBAAmB,GAAG;AAC9B,YAAM,KAAK,UAAU;AAAA,IACvB;AACA,SAAK,cAAc;AACnB,0BAAO,MAAM,sBAAsB;AAAA,EACrC;AAAA,EAEA,MAAc,YAA2B;AACvC,UAAM,UACJ,CAAC;AAEH,QAAI,KAAK,QAAQ;AACf,UACE,CAAC,KAAK,OAAO,kBACb,OAAO,KAAK,KAAK,OAAO,cAAc,EAAE,WAAW,GACnD;AACA,cAAM,KAAK,OAAO,kBAAkB;AAAA,MACtC;AACA,YAAM,WAAW,KAAK,OAAO,qBAAqB;AAClD,YAAM,aAAa,OAAO,OAAO,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS;AACjE,cAAQ;AAAA,QACN,GAAI,MAAM,KAAK,cAAc,0BAA0B,UAAU;AAAA,MACnE;AACA,UAAI,KAAK,wBAAwB;AAC/B,gBAAQ;AAAA,UACN,GAAI,MAAM,KAAK,cAAc;AAAA,YAC3B;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA,UAAI,KAAK,sBAAsB;AAC7B,gBAAQ;AAAA,UACN,GAAI,MAAM,KAAK,cAAc,4BAA4B,UAAU;AAAA,QACrE;AAAA,MACF;AAAA,IACF,OAAO;AACL,iBAAW,aAAa,KAAK,YAAY;AACvC,YAAI,CAAC,UAAU,kBAAmB,OAAM,UAAU,QAAQ;AAAA,MAC5D;AACA,cAAQ;AAAA,QACN,GAAI,MAAM,KAAK,cAAc,0BAA0B,KAAK,UAAU;AAAA,MACxE;AACA,UAAI,KAAK,wBAAwB;AAC/B,gBAAQ;AAAA,UACN,GAAI,MAAM,KAAK,cAAc;AAAA,YAC3B,KAAK;AAAA,UACP;AAAA,QACF;AAAA,MACF;AACA,UAAI,KAAK,sBAAsB;AAC7B,gBAAQ;AAAA,UACN,GAAI,MAAM,KAAK,cAAc;AAAA,YAC3B,KAAK;AAAA,UACP;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,SAAK,gBAAgB,KAAK,cAAc,gBAAgB,OAAO;AAC/D,SAAK,WAAW,KAAK,cAAc,eAAe;AAAA,EACpD;AAAA,EAEQ,gBACN,aACA,gBACM;AACN,UAAM,aAAa,IAAI,IAAI,KAAK,eAAe;AAC/C,UAAM,YAAY,oBAAI,IAAY;AAClC,UAAM,SAAS,oBAAI,IAGjB;AAEF,UAAM,cAAc,CAAC,SAAyB;AAC5C,UAAI,CAAC,UAAU,IAAI,IAAI,GAAG;AACxB,kBAAU,IAAI,IAAI;AAClB,eAAO;AAAA,MACT;AACA,UAAI,IAAI;AACR,aAAO,UAAU,IAAI,GAAG,IAAI,IAAI,CAAC,EAAE,EAAG;AACtC,YAAM,WAAW,GAAG,IAAI,IAAI,CAAC;AAC7B,gBAAU,IAAI,QAAQ;AACtB,aAAO;AAAA,IACT;AAEA,UAAM,gBAA0D,CAAC;AAEjE,eAAW,cAAc,aAAa;AACpC,iBAAW,QAAQ,WAAW,SAAS,CAAC,GAAG;AACzC,YAAI,WAAW,IAAI,KAAK,IAAI,EAAG;AAC/B,cAAM,OAAO,YAAY,KAAK,IAAI;AAClC,eAAO,IAAI,MAAM,EAAE,YAAY,SAAS,KAAK,KAAK,CAAC;AACnD,sBAAc,KAAK;AAAA,UACjB;AAAA,UACA,aAAa,KAAK;AAAA,UAClB,aAAa,KAAK,eAAe;AAAA,YAC/B,MAAM;AAAA,YACN,YAAY,CAAC;AAAA,UACf;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAEA,SAAK,gBAAgB;AACrB,SAAK,WAAW,OAAO,MAAM,SAAS;AACpC,YAAM,QAAQ,OAAO,IAAI,IAAI;AAC7B,UAAI,CAAC,OAAO;AACV,cAAM,IAAI,MAAM,iBAAiB,IAAI,EAAE;AAAA,MACzC;AACA,aAAO,MAAM,WAAW,SAAS,MAAM,SAAS,IAAI;AAAA,IACtD;AACA,SAAK,SAAS,gBAAgB,cAAc;AAC5C,SAAK,cAAc;AAAA,EACrB;AAAA,EAEQ,cAAc,SAAgD;AACpE,UAAM,WAA8B;AAAA,MAClC,EAAE,MAAM,UAAU,SAAS,KAAK,aAAa;AAAA,IAC/C;AACA,QAAI,KAAK,iBAAiB,KAAK,qBAAqB,SAAS,GAAG;AAC9D,eAAS,KAAK,GAAG,KAAK,oBAAoB;AAAA,IAC5C;AACA,QAAI,QAAQ,UAAU,QAAQ;AAC5B,eAAS,KAAK,GAAG,QAAQ,QAAQ;AAAA,IACnC;AACA,QAAI,QAAQ,QAAQ;AAClB,eAAS,KAAK,EAAE,MAAM,QAAQ,SAAS,QAAQ,OAAO,CAAC;AAAA,IACzD;AACA,WAAO;AAAA,EACT;AAAA,EAEA,yBAA4C;AAC1C,WAAO,CAAC,GAAG,KAAK,oBAAoB;AAAA,EACtC;AAAA,EAEA,2BAAiC;AAC/B,SAAK,uBAAuB,CAAC;AAAA,EAC/B;AAAA,EAEA,iBAAiB,SAAuB;AACtC,SAAK,eAAe;AAAA,EACtB;AAAA,EAEA,MAAc,YAAY,kBAAkB,MAAqB;AAC/D,QAAI,mBAAmB,CAAC,KAAK,aAAa;AACxC,UAAI,KAAK,gBAAgB;AACvB,cAAM,KAAK,WAAW;AAAA,MACxB,OAAO;AACL,cAAM,IAAI,MAAM,oDAAoD;AAAA,MACtE;AAAA,IACF;AACA,QAAI,CAAC,KAAK,UAAU,CAAC,KAAK,UAAU;AAClC,YAAM,IAAI,MAAM,qCAAqC;AAAA,IACvD;AAAA,EACF;AAAA,EAEQ,gBAAgB,SAA6B;AACnD,WAAO;AAAA,MACL,UAAU,KAAK,cAAc,OAAO;AAAA,MACpC,OAAO,KAAK;AAAA,MACZ,UAAU,KAAK;AAAA,MACf,UAAU,QAAQ,YAAY,KAAK;AAAA,MACnC,QAAQ,QAAQ;AAAA,IAClB;AAAA,EACF;AAAA,EAsBA,MAAa,IACX,gBACA,UACA,iBACA,iBACA,cACA,QACqB;AACrB,UAAM,UAAU;AAAA,MACd;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,QAAI,QAAQ,QAAQ;AAClB,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AACA,QAAI,KAAK,YAAY,KAAK,aAAa;AACrC,aAAO,KAAK,YAAY;AAAA,QACtB,QAAQ,UAAU;AAAA,QAClB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,IACF;AACA,UAAM,KAAK,YAAY,QAAQ,mBAAmB,IAAI;AACtD,UAAM,SAAS,MAAM;AAAA,MACnB,KAAK;AAAA,MACL,KAAK,gBAAgB,OAAO;AAAA,IAC9B;AACA,QAAI,KAAK,iBAAiB,QAAQ,QAAQ;AACxC,WAAK,qBAAqB,KAAK;AAAA,QAC7B,MAAM;AAAA,QACN,SAAS,QAAQ;AAAA,MACnB,CAAC;AACD,WAAK,qBAAqB,KAAK;AAAA,QAC7B,MAAM;AAAA,QACN,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AACA,WAAO;AAAA,EACT;AAAA,EAaA,OAAc,OACZ,gBACA,UACA,iBACA,iBACA,cACA,QAC6C;AAC7C,UAAM,UAAU;AAAA,MACd;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,QAAI,KAAK,YAAY,KAAK,aAAa;AACrC,YAAMC,UAAS,MAAM,KAAK,YAAY;AAAA,QACpC,QAAQ,UAAU;AAAA,QAClB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AACA,aAAOA;AAAA,IACT;AACA,UAAM,KAAK,YAAY,QAAQ,mBAAmB,IAAI;AACtD,UAAM,SAAS,OAAO;AAAA,MACpB,KAAK;AAAA,MACL,KAAK,gBAAgB,OAAO;AAAA,IAC9B;AACA,QAAI,KAAK,iBAAiB,QAAQ,QAAQ;AACxC,WAAK,qBAAqB,KAAK;AAAA,QAC7B,MAAM;AAAA,QACN,SAAS,QAAQ;AAAA,MACnB,CAAC;AACD,WAAK,qBAAqB,KAAK;AAAA,QAC7B,MAAM;AAAA,QACN,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AACA,WAAO;AAAA,EACT;AAAA,EAiBA,OAAc,aACZ,gBACA,UACA,iBACA,iBACA,cACA,QAC+C;AAC/C,UAAM,UAAU;AAAA,MACd;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,QAAI,KAAK,YAAY,KAAK,aAAa;AACrC,YAAM,IAAI,MAAM,kDAAkD;AAAA,IACpE;AACA,UAAM,KAAK,YAAY,QAAQ,mBAAmB,IAAI;AACtD,WAAO,kBAAkB,KAAK,QAAS,KAAK,gBAAgB,OAAO,CAAC;AAAA,EACtE;AAAA;AAAA,EAGA,MAAM,KAAK,SAGS;AAClB,UAAM,KAAK,YAAY;AACvB,UAAM,SAAS,MAAM,KAAK,OAAQ,SAAS;AAAA,MACzC,UAAU,QAAQ;AAAA,MAClB,OAAO,CAAC;AAAA,MACR,QAAQ,QAAQ;AAAA,IAClB,CAAC;AACD,WAAO,OAAO;AAAA,EAChB;AAAA,EAEA,MAAM,QAAuB;AAC3B,QAAI,KAAK,sBAAsB,KAAK,QAAQ;AAC1C,YAAM,KAAK,OAAO,mBAAmB;AAAA,IACvC;AACA,SAAK,cAAc;AAAA,EACrB;AACF;;;AyB7iBA,eAAsB,aAAa,QAIf;AAClB,QAAM,SAAS,gBAAgB,OAAO,MAAM;AAC5C,QAAM,SAAS,MAAM,OAAO,SAAS;AAAA,IACnC,UAAU,OAAO;AAAA,IACjB,OAAO,CAAC;AAAA,IACR,QAAQ,OAAO;AAAA,EACjB,CAAC;AACD,SAAO,OAAO;AAChB;","names":["import_client","import_client","i","fallback","text","text","buildBody","streamChat","chat","text","buildBody","streamChat","chat","buildHeaders","streamChat","chat","streamChat","chat","OPENAI_BASE_URL","buildEndpoint","buildHeaders","buildEndpoint","buildHeaders","streamChat","chat","import_client","import_client","result"]}