@usecrow/ui 0.1.61 → 0.1.63
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +23 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +24 -2
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils.ts","../src/constants.ts","../src/hooks/useChat.ts","../src/hooks/useConversations.ts","../src/hooks/useWorkflow.ts","../src/hooks/useCrowAPI.ts","../src/styles/defaults.ts","../src/styles/utils.ts","../src/hooks/useWidgetStyles.ts","../src/hooks/useTTSOutput.ts","../src/context/StyleContext.tsx","../src/components/ShadowContainer.tsx","../src/components/widget/ChatBubble.tsx","../src/components/widget/WidgetShell.tsx","../src/components/widget/WidgetHeader.tsx","../src/components/shared/StreamingText.tsx","../src/components/shared/ThinkingIndicator.tsx","../src/components/shared/LoadingHistory.tsx","../src/components/shared/ReasoningTrace.tsx","../src/components/shared/MessageBubble.tsx","../src/components/shared/MessageList.tsx","../src/components/shared/MessagesContainer.tsx","../src/components/shared/ConversationList.tsx","../src/components/shared/WorkflowPanel.tsx","../src/components/shared/PoweredByBadge.tsx","../src/components/shared/ModelSelector.tsx","../src/hooks/useVoiceInput.ts","../src/components/shared/PromptInputBox.tsx","../src/components/shared/BrowserUseConfirmation.tsx","../src/components/shared/BrowserUseQuestion.tsx","../src/components/shared/SuggestedActions.tsx","../src/styles/cssVars.ts","../src/styles/inject.ts","../src/CrowWidget.tsx","../src/components/copilot/CopilotToggleButton.tsx","../src/components/copilot/CopilotContainer.tsx","../src/CrowCopilot.tsx","../src/CrowProvider.tsx"],"names":["updated","useState","useCallback","useRef","useEffect","useWidgetStyles","useCopilotStyles","jsx","jsxs","Fragment","motion","ReactMarkdown","forwardRef","X","ChevronDown","Check","React","useMemo","AnimatePresence","ChevronRight","CopilotToggleButton","createContext"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Utility functions\n */\n\n/**\n * Merge class names, filtering out falsy values\n */\nexport const cn = (...classes: (string | undefined | null | false)[]): string =>\n classes.filter(Boolean).join(\" \");\n\n/**\n * Format timestamp for display\n */\nexport const formatTime = (date: Date): string =>\n date.toLocaleTimeString(\"en-US\", {\n hour: \"numeric\",\n minute: \"2-digit\",\n });\n\n/**\n * Format conversation date for display\n */\nexport const formatConversationDate = (dateStr: string): string => {\n const date = new Date(dateStr);\n const now = new Date();\n const diffDays = Math.floor(\n (now.getTime() - date.getTime()) / (1000 * 60 * 60 * 24)\n );\n\n if (diffDays === 0) return \"Today\";\n if (diffDays === 1) return \"Yesterday\";\n if (diffDays < 7) return `${diffDays} days ago`;\n return date.toLocaleDateString();\n};\n\n/**\n * Generate unique message ID\n */\nexport const generateMessageId = (prefix: \"user\" | \"bot\" | \"welcome\" | \"history\"): string =>\n `${prefix}-${Date.now()}`;\n","/**\n * Static configuration values\n */\n\nimport type { Model } from \"./types\";\n\nexport const AVAILABLE_MODELS: Model[] = [\n { id: \"gpt-4o\", name: \"GPT-4o\", provider: \"OpenAI\" },\n { id: \"gpt-5-mini\", name: \"GPT-5 Mini\", provider: \"OpenAI\" },\n { id: \"gpt-5.2\", name: \"GPT-5.2\", provider: \"OpenAI\" },\n { id: \"gpt-5.2-pro\", name: \"GPT-5.2 Pro\", provider: \"OpenAI\" },\n { id: \"claude-haiku-4-5-20251001\", name: \"Haiku 4.5\", provider: \"Anthropic\" },\n { id: \"claude-sonnet-4-5-20250929\", name: \"Sonnet 4.5\", provider: \"Anthropic\" },\n { id: \"claude-opus-4-5-20251203\", name: \"Opus 4.5\", provider: \"Anthropic\" },\n];\n\nexport const DEFAULT_MODEL = \"claude-sonnet-4-5-20250929\";\n\nexport const DEFAULT_WELCOME_MESSAGE = \"Hi! How can I help you today?\";\n\nexport const MESSAGES_CONTAINER_ID = \"crow-messages-container\";\n","/**\n * useChat - Manages chat state and streaming\n */\n\nimport { useState, useRef, useCallback, useEffect } from \"react\";\nimport type { SuggestedAction } from \"@usecrow/client\";\nimport type { Message, ToolCall } from \"../types\";\nimport { generateMessageId } from \"../utils\";\nimport { DEFAULT_WELCOME_MESSAGE } from \"../constants\";\n\ninterface WorkflowEvent {\n type: \"started\" | \"todo_updated\" | \"ended\" | \"complete_prompt\";\n name?: string;\n todos?: Array<{ id: string; text: string; status: \"pending\" | \"completed\" }>;\n todoId?: string;\n todoStatus?: \"pending\" | \"completed\";\n}\n\ninterface ToolCallEvent {\n type: \"start\" | \"complete\" | \"client_call\" | \"consent_required\";\n toolName: string;\n toolCallId?: string; // Unique ID for client-side tool calls (to send results back)\n arguments?: Record<string, unknown>;\n success?: boolean;\n}\n\ninterface UseChatOptions {\n productId: string;\n apiUrl?: string;\n /** Whether to persist anonymous conversations across page refreshes (default: true) */\n persistAnonymousConversations?: boolean;\n /** Custom welcome message (uses SDK default if not provided) */\n welcomeMessage?: string;\n /** AI model to use for this chat (defaults to DEFAULT_MODEL) */\n selectedModel?: string;\n /** Subdomain for multi-endpoint products (routes to specific backend config) */\n subdomain?: string;\n /** Per-tool consent settings — when a tool has requires_consent, show Allow/Deny before executing */\n toolConsentSettings?: Record<string, { requires_consent: boolean }>;\n /** ISO 639-1 language code (e.g., \"es\", \"fr\") — AI will respond in this language */\n language?: string;\n onVerificationStatus?: (isVerified: boolean) => void;\n onConversationId?: (id: string) => void;\n onWorkflowEvent?: (event: WorkflowEvent) => void;\n onToolCall?: (toolCall: ToolCallEvent) => void;\n onToolResult?: (toolName: string, result: Record<string, unknown>) => void;\n onRestoredConversation?: (conversationId: string) => void;\n}\n\nconst getConversationStorageKey = (productId: string) => `crow_conv_${productId}`;\n\nexport function useChat({\n productId,\n apiUrl = \"\",\n persistAnonymousConversations,\n welcomeMessage,\n selectedModel: initialSelectedModel,\n subdomain,\n toolConsentSettings,\n language,\n onVerificationStatus,\n onConversationId,\n onWorkflowEvent,\n onToolCall,\n onToolResult,\n onRestoredConversation,\n}: UseChatOptions) {\n // Use custom welcome message if provided, otherwise use SDK default\n const effectiveWelcomeMessage = welcomeMessage || DEFAULT_WELCOME_MESSAGE;\n \n const [messages, setMessages] = useState<Message[]>([\n {\n id: \"welcome\",\n content: effectiveWelcomeMessage,\n isBot: true,\n timestamp: new Date(),\n },\n ]);\n const [isLoading, setIsLoading] = useState(false);\n const [activeToolCalls, setActiveToolCalls] = useState<ToolCall[]>([]);\n // Start with null - conditional restoration happens in effect based on persistAnonymousConversations\n const [conversationId, setConversationId] = useState<string | null>(null);\n const [selectedModel, setSelectedModel] = useState<string | undefined>(initialSelectedModel);\n const [suggestedActions, setSuggestedActions] = useState<SuggestedAction[]>([]);\n\n const abortControllerRef = useRef<AbortController | null>(null);\n const hasCheckedPersistRef = useRef(false);\n // Track tool calls during streaming to commit to message on completion\n const streamingToolCallsRef = useRef<ToolCall[]>([]);\n // Keep latest consent settings accessible inside streaming callbacks\n const toolConsentSettingsRef = useRef(toolConsentSettings);\n toolConsentSettingsRef.current = toolConsentSettings;\n\n // Sync selectedModel when it arrives from API (initialSelectedModel is undefined on first render)\n useEffect(() => {\n if (initialSelectedModel) {\n setSelectedModel((prev) => prev !== initialSelectedModel ? initialSelectedModel : prev);\n }\n }, [initialSelectedModel]);\n\n // Update welcome message if it changes and no conversation has started\n useEffect(() => {\n // Only update if there's exactly one message (the welcome message) and no conversation started\n if (messages.length === 1 && messages[0].id === \"welcome\") {\n setMessages([\n {\n id: \"welcome\",\n content: effectiveWelcomeMessage,\n isBot: true,\n timestamp: new Date(),\n },\n ]);\n }\n }, [effectiveWelcomeMessage]);\n\n // Conditionally restore conversation based on persistAnonymousConversations setting\n useEffect(() => {\n // Wait for setting to load (undefined = still loading)\n if (persistAnonymousConversations === undefined || hasCheckedPersistRef.current) {\n return;\n }\n hasCheckedPersistRef.current = true;\n\n if (persistAnonymousConversations) {\n // Restore from localStorage\n try {\n const storedId = localStorage.getItem(getConversationStorageKey(productId));\n if (storedId) {\n setConversationId(storedId);\n onRestoredConversation?.(storedId);\n }\n } catch {\n // localStorage unavailable\n }\n } else {\n // Clear any stored conversation - user doesn't want persistence\n try {\n localStorage.removeItem(getConversationStorageKey(productId));\n } catch {\n // localStorage unavailable\n }\n }\n }, [persistAnonymousConversations, productId, onRestoredConversation]);\n\n const streamFromBackend = useCallback(\n async (message: string, botMsgId: string) => {\n let accumulatedText = \"\";\n let firstChunk = true;\n // Queue client tool calls to execute after stream completes\n const pendingClientTools: Array<{\n toolName: string;\n toolCallId: string;\n arguments: Record<string, unknown>;\n }> = [];\n\n abortControllerRef.current = new AbortController();\n\n try {\n const identityToken = window.__crow_identity_token;\n\n const response = await fetch(`${apiUrl}/api/chat/message`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n product_id: productId,\n message,\n conversation_id: conversationId,\n identity_token: identityToken,\n model: selectedModel,\n subdomain,\n user_timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n user_local_time: new Date().toLocaleString('en-US', { year: 'numeric', month: 'long', day: 'numeric', hour: 'numeric', minute: 'numeric', hour12: true }),\n page_path: typeof window !== \"undefined\" ? window.location.pathname : undefined,\n context: typeof window !== \"undefined\" ? (window as any).__crow_page_context : undefined,\n ...(language && language !== 'en' ? { language } : {}),\n }),\n signal: abortControllerRef.current.signal,\n });\n\n if (!response.ok) {\n if (response.status === 401 && typeof window !== 'undefined') {\n // Token expired - emit refresh event\n window.dispatchEvent(new CustomEvent('crow:token-refresh-needed'));\n }\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n const reader = response.body?.getReader();\n const decoder = new TextDecoder();\n\n if (reader) {\n let buffer = \"\";\n\n while (true) {\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 if (line.startsWith(\"data: \")) {\n const data = line.slice(6).trim();\n if (data === \"[DONE]\") {\n setIsLoading(false);\n \n // Commit tool calls to the bot message so they persist\n const finalToolCalls = [...streamingToolCallsRef.current];\n if (finalToolCalls.length > 0) {\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === botMsgId\n ? { ...msg, toolCalls: finalToolCalls, thinkingComplete: true }\n : msg\n )\n );\n } else {\n // Still mark thinking as complete even without tool calls\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === botMsgId\n ? { ...msg, thinkingComplete: true }\n : msg\n )\n );\n }\n \n // Clear active tool calls (now committed to message)\n setActiveToolCalls([]);\n streamingToolCallsRef.current = [];\n \n // Execute queued client tool calls after stream completes\n for (const tool of pendingClientTools) {\n onToolCall?.({\n type: \"client_call\",\n toolName: tool.toolName,\n toolCallId: tool.toolCallId,\n arguments: tool.arguments,\n });\n }\n return;\n }\n\n try {\n const parsed = JSON.parse(data);\n\n switch (parsed.type) {\n case \"verification_status\":\n onVerificationStatus?.(parsed.is_verified === true);\n break;\n\n case \"conversation_id\":\n if (parsed.conversation_id) {\n setConversationId(parsed.conversation_id);\n // Only persist to localStorage if setting is enabled\n if (persistAnonymousConversations === true) {\n try {\n localStorage.setItem(\n getConversationStorageKey(productId),\n parsed.conversation_id\n );\n } catch {\n // localStorage may be unavailable\n }\n }\n onConversationId?.(parsed.conversation_id);\n }\n break;\n\n case \"thinking\":\n if (parsed.status === \"complete\") {\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === botMsgId\n ? { ...msg, thinkingComplete: true }\n : msg\n )\n );\n }\n break;\n\n case \"thinking_token\":\n if (parsed.content) {\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === botMsgId\n ? { ...msg, thinking: (msg.thinking || \"\") + parsed.content }\n : msg\n )\n );\n }\n break;\n\n case \"content\":\n if (firstChunk) firstChunk = false;\n accumulatedText += parsed.content;\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === botMsgId\n ? { ...msg, content: accumulatedText }\n : msg\n )\n );\n break;\n\n case \"citations\":\n if (parsed.citations) {\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === botMsgId\n ? { ...msg, citations: parsed.citations }\n : msg\n )\n );\n }\n break;\n\n case \"error\":\n if (parsed.message) {\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === botMsgId\n ? { ...msg, content: parsed.message }\n : msg\n )\n );\n }\n break;\n\n case \"tool_call_start\":\n onToolCall?.({\n type: \"start\",\n toolName: parsed.tool_name,\n arguments: parsed.arguments,\n });\n const newToolCall: ToolCall = {\n id: `tool-${Date.now()}`,\n name: parsed.tool_name,\n displayName: parsed.display_name || undefined,\n arguments: parsed.arguments || {},\n status: \"executing\",\n timestamp: new Date(),\n };\n streamingToolCallsRef.current = [...streamingToolCallsRef.current, newToolCall];\n setActiveToolCalls((prev) => [...prev, newToolCall]);\n break;\n\n case \"tool_call_complete\":\n onToolCall?.({\n type: \"complete\",\n toolName: parsed.tool_name,\n success: parsed.success,\n });\n const newStatus = parsed.success ? \"complete\" : \"error\";\n let updated = false;\n streamingToolCallsRef.current = streamingToolCallsRef.current.map((tool) => {\n if (!updated && tool.name === parsed.tool_name && tool.status === \"executing\") {\n updated = true;\n return { ...tool, status: newStatus as \"complete\" | \"error\" };\n }\n return tool;\n });\n setActiveToolCalls((prev) => {\n let updated = false;\n return prev.map((tool) => {\n if (!updated && tool.name === parsed.tool_name && tool.status === \"executing\") {\n updated = true;\n return { ...tool, status: newStatus as \"complete\" | \"error\" };\n }\n return tool;\n });\n });\n break;\n\n case \"tool_result_links\":\n if (parsed.links && Array.isArray(parsed.links)) {\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === botMsgId\n ? { ...msg, links: [...(msg.links || []), ...parsed.links] }\n : msg\n )\n );\n }\n break;\n\n case \"tool_result\":\n if (parsed.tool_name && parsed.result) {\n onToolResult?.(parsed.tool_name, parsed.result);\n // Store result on the first matching ToolCall without a result yet\n let resultUpdated = false;\n streamingToolCallsRef.current = streamingToolCallsRef.current.map((tool) => {\n if (!resultUpdated && tool.name === parsed.tool_name && !tool.result) {\n resultUpdated = true;\n return { ...tool, result: parsed.result };\n }\n return tool;\n });\n setActiveToolCalls((prev) => {\n let updated = false;\n return prev.map((tool) => {\n if (!updated && tool.name === parsed.tool_name && !tool.result) {\n updated = true;\n return { ...tool, result: parsed.result };\n }\n return tool;\n });\n });\n }\n break;\n\n case \"client_tool_call\":\n {\n const needsConsent = toolConsentSettingsRef.current?.[parsed.tool_name]?.requires_consent === true;\n // Emit start event for consistency with server-side tools\n onToolCall?.({\n type: \"start\",\n toolName: parsed.tool_name,\n arguments: parsed.arguments,\n });\n if (needsConsent) {\n // Show Allow/Deny UI instead of executing immediately\n const consentClientTc: ToolCall = {\n id: parsed.tool_call_id || `tool-${Date.now()}`,\n name: parsed.tool_name,\n displayName: parsed.display_name || undefined,\n arguments: parsed.arguments || {},\n status: \"awaiting_consent\",\n requiresConsent: true,\n timestamp: new Date(),\n };\n streamingToolCallsRef.current = [...streamingToolCallsRef.current, consentClientTc];\n setActiveToolCalls((prev) => [...prev, consentClientTc]);\n } else {\n // No consent required — original flow\n const clientToolCall: ToolCall = {\n id: parsed.tool_call_id || `tool-${Date.now()}`,\n name: parsed.tool_name,\n displayName: parsed.display_name || undefined,\n arguments: parsed.arguments || {},\n status: \"executing\",\n timestamp: new Date(),\n };\n streamingToolCallsRef.current = [...streamingToolCallsRef.current, clientToolCall];\n setActiveToolCalls((prev) => [...prev, clientToolCall]);\n pendingClientTools.push({\n toolName: parsed.tool_name,\n toolCallId: parsed.tool_call_id,\n arguments: parsed.arguments,\n });\n }\n }\n break;\n\n case \"tool_consent_required\":\n // Server-side tool needs user consent before executing\n // Stream will end after this event (backend breaks stream)\n // Update the EXISTING tool call (from tool_call_start) to awaiting_consent\n onToolCall?.({\n type: \"consent_required\",\n toolName: parsed.tool_name,\n arguments: parsed.arguments,\n });\n {\n const existingIdx = streamingToolCallsRef.current.findIndex(\n (tc) => tc.name === parsed.tool_name && tc.status === \"executing\"\n );\n if (existingIdx >= 0) {\n const existing = streamingToolCallsRef.current[existingIdx];\n const updatedTc: ToolCall = {\n ...existing,\n status: \"awaiting_consent\",\n requiresConsent: true,\n serverSideExecution: true,\n arguments: parsed.arguments || existing.arguments,\n };\n streamingToolCallsRef.current = streamingToolCallsRef.current.map(\n (tc, i) => (i === existingIdx ? updatedTc : tc)\n );\n setActiveToolCalls((prev) =>\n prev.map((tc) => (tc.id === existing.id ? updatedTc : tc))\n );\n } else {\n // Fallback: create new entry if no existing tool call found\n const consentToolCall: ToolCall = {\n id: `consent-${Date.now()}`,\n name: parsed.tool_name,\n displayName: parsed.display_name || undefined,\n arguments: parsed.arguments || {},\n status: \"awaiting_consent\",\n requiresConsent: true,\n serverSideExecution: true,\n timestamp: new Date(),\n };\n streamingToolCallsRef.current = [...streamingToolCallsRef.current, consentToolCall];\n setActiveToolCalls((prev) => [...prev, consentToolCall]);\n }\n }\n break;\n\n case \"workflow_started\":\n onWorkflowEvent?.({\n type: \"started\",\n name: parsed.name,\n todos: parsed.todos,\n });\n break;\n\n case \"todo_updated\":\n onWorkflowEvent?.({\n type: \"todo_updated\",\n todoId: parsed.id,\n todoStatus: parsed.status,\n });\n break;\n\n case \"workflow_ended\":\n onWorkflowEvent?.({ type: \"ended\" });\n break;\n\n case \"workflow_complete_prompt\":\n onWorkflowEvent?.({ type: \"complete_prompt\" });\n break;\n\n case \"suggested_actions\":\n if (parsed.actions && Array.isArray(parsed.actions)) {\n setSuggestedActions(parsed.actions);\n }\n break;\n }\n } catch (e) {\n console.error(\"[Crow] Parse error:\", e);\n }\n }\n }\n }\n }\n } catch (error) {\n if (error instanceof Error && error.name === \"AbortError\") {\n if (accumulatedText) {\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === botMsgId ? { ...msg, content: accumulatedText } : msg\n )\n );\n } else {\n setMessages((prev) => prev.filter((msg) => msg.id !== botMsgId));\n }\n return;\n }\n\n console.error(\"[Crow] Error:\", error);\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === botMsgId\n ? { ...msg, content: \"Sorry, I encountered an error. Please try again.\" }\n : msg\n )\n );\n } finally {\n setIsLoading(false);\n abortControllerRef.current = null;\n }\n },\n [apiUrl, productId, conversationId, selectedModel, subdomain, persistAnonymousConversations, onVerificationStatus, onConversationId, onWorkflowEvent, onToolCall, onToolResult]\n );\n\n const sendMessage = useCallback(\n (content: string): { userMsgId: string; botMsgId: string } => {\n if (!content.trim()) {\n return { userMsgId: \"\", botMsgId: \"\" };\n }\n\n setActiveToolCalls([]);\n streamingToolCallsRef.current = [];\n setSuggestedActions([]);\n\n const userMsgId = generateMessageId(\"user\");\n const botMsgId = generateMessageId(\"bot\");\n\n setMessages((prev) => [\n ...prev,\n {\n id: userMsgId,\n content,\n isBot: false,\n timestamp: new Date(),\n },\n ]);\n\n setIsLoading(true);\n\n setMessages((prev) => [\n ...prev,\n {\n id: botMsgId,\n content: \"Thinking...\",\n isBot: true,\n timestamp: new Date(),\n },\n ]);\n\n streamFromBackend(content, botMsgId);\n\n return { userMsgId, botMsgId };\n },\n [streamFromBackend]\n );\n\n const stopGeneration = useCallback(() => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n setIsLoading(false);\n }\n }, []);\n\n const resetMessages = useCallback(() => {\n setMessages([\n {\n id: \"welcome\",\n content: effectiveWelcomeMessage,\n isBot: true,\n timestamp: new Date(),\n },\n ]);\n setConversationId(null);\n try {\n localStorage.removeItem(getConversationStorageKey(productId));\n } catch {\n // localStorage may be unavailable\n }\n }, [productId, effectiveWelcomeMessage]);\n\n const loadMessages = useCallback((historyMessages: Message[]) => {\n setMessages(historyMessages);\n }, []);\n\n /**\n * Submit the result of a client-side tool execution back to the agent.\n * The agent will receive this result and can continue the conversation.\n */\n const submitToolResult = useCallback(\n async (\n toolCallId: string,\n toolName: string,\n result: Record<string, unknown>\n ) => {\n if (!conversationId) {\n console.error(\"[Crow] Cannot submit tool result: no conversation ID\");\n return;\n }\n\n const botMsgId = generateMessageId(\"bot\");\n // Queue for any follow-up tool calls (e.g., if agent retries)\n const pendingClientTools: Array<{\n toolName: string;\n toolCallId: string;\n arguments: Record<string, unknown>;\n }> = [];\n\n // Add placeholder for agent response\n setMessages((prev) => [\n ...prev,\n {\n id: botMsgId,\n content: \"\",\n isBot: true,\n timestamp: new Date(),\n },\n ]);\n\n setIsLoading(true);\n\n try {\n const identityToken = window.__crow_identity_token;\n\n const response = await fetch(`${apiUrl}/api/chat/tool-result`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n product_id: productId,\n conversation_id: conversationId,\n tool_call_id: toolCallId,\n tool_name: toolName,\n result,\n identity_token: identityToken,\n model: selectedModel,\n subdomain,\n user_timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n user_local_time: new Date().toLocaleString('en-US', { year: 'numeric', month: 'long', day: 'numeric', hour: 'numeric', minute: 'numeric', hour12: true }),\n ...(language && language !== 'en' ? { language } : {}),\n }),\n });\n\n if (!response.ok) {\n if (response.status === 401 && typeof window !== 'undefined') {\n // Token expired - emit refresh event\n window.dispatchEvent(new CustomEvent('crow:token-refresh-needed'));\n }\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n const reader = response.body?.getReader();\n const decoder = new TextDecoder();\n let accumulatedText = \"\";\n\n if (reader) {\n let buffer = \"\";\n\n while (true) {\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 if (line.startsWith(\"data: \")) {\n const data = line.slice(6).trim();\n if (data === \"[DONE]\") {\n setIsLoading(false);\n\n // Commit tool calls to the bot message so they persist\n const finalToolCalls = [...streamingToolCallsRef.current];\n if (finalToolCalls.length > 0) {\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === botMsgId\n ? { ...msg, toolCalls: finalToolCalls, thinkingComplete: true }\n : msg\n )\n );\n } else {\n // Still mark thinking as complete even without tool calls\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === botMsgId\n ? { ...msg, thinkingComplete: true }\n : msg\n )\n );\n }\n\n // Clear active tool calls (now committed to message)\n setActiveToolCalls([]);\n streamingToolCallsRef.current = [];\n\n // Execute any queued tool calls (agent retries)\n for (const tool of pendingClientTools) {\n onToolCall?.({\n type: \"client_call\",\n toolName: tool.toolName,\n toolCallId: tool.toolCallId,\n arguments: tool.arguments,\n });\n }\n return;\n }\n\n try {\n const parsed = JSON.parse(data);\n\n switch (parsed.type) {\n case \"content\":\n accumulatedText += parsed.content;\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === botMsgId\n ? { ...msg, content: accumulatedText }\n : msg\n )\n );\n break;\n\n case \"thinking\":\n if (parsed.status === \"complete\") {\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === botMsgId\n ? { ...msg, thinkingComplete: true }\n : msg\n )\n );\n }\n break;\n\n case \"thinking_token\":\n if (parsed.content) {\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === botMsgId\n ? { ...msg, thinking: (msg.thinking || \"\") + parsed.content }\n : msg\n )\n );\n }\n break;\n\n case \"citations\":\n if (parsed.citations) {\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === botMsgId\n ? { ...msg, citations: parsed.citations }\n : msg\n )\n );\n }\n break;\n\n case \"tool_call_start\":\n onToolCall?.({\n type: \"start\",\n toolName: parsed.tool_name,\n arguments: parsed.arguments,\n });\n {\n const newTc: ToolCall = {\n id: `tool-${Date.now()}`,\n name: parsed.tool_name,\n displayName: parsed.display_name || undefined,\n arguments: parsed.arguments || {},\n status: \"executing\",\n timestamp: new Date(),\n };\n streamingToolCallsRef.current = [...streamingToolCallsRef.current, newTc];\n setActiveToolCalls((prev) => [...prev, newTc]);\n }\n break;\n\n case \"tool_call_complete\":\n onToolCall?.({\n type: \"complete\",\n toolName: parsed.tool_name,\n success: parsed.success,\n });\n {\n const completeStatus = parsed.success ? \"complete\" : \"error\";\n // Update in streamingToolCallsRef (for tools started during this stream)\n let tcUpdated = false;\n streamingToolCallsRef.current = streamingToolCallsRef.current.map((tool) => {\n if (!tcUpdated && tool.name === parsed.tool_name && tool.status === \"executing\") {\n tcUpdated = true;\n return { ...tool, status: completeStatus as \"complete\" | \"error\" };\n }\n return tool;\n });\n // Update in activeToolCalls\n setActiveToolCalls((prev) => {\n let updated = false;\n return prev.map((tool) => {\n if (!updated && tool.name === parsed.tool_name && tool.status === \"executing\") {\n updated = true;\n return { ...tool, status: completeStatus as \"complete\" | \"error\" };\n }\n return tool;\n });\n });\n // Update in committed messages (consent tool lives in a previous message's toolCalls)\n setMessages((prev) =>\n prev.map((msg) =>\n msg.toolCalls\n ? {\n ...msg,\n toolCalls: msg.toolCalls.map((tc) =>\n tc.name === parsed.tool_name && tc.status === \"executing\"\n ? { ...tc, status: completeStatus as \"complete\" | \"error\" }\n : tc\n ),\n }\n : msg\n )\n );\n }\n break;\n\n case \"tool_result\":\n if (parsed.tool_name && parsed.result) {\n onToolResult?.(parsed.tool_name, parsed.result);\n // Update in streamingToolCallsRef\n let resultUpdated = false;\n streamingToolCallsRef.current = streamingToolCallsRef.current.map((tool) => {\n if (!resultUpdated && tool.name === parsed.tool_name && !tool.result) {\n resultUpdated = true;\n return { ...tool, result: parsed.result };\n }\n return tool;\n });\n // Update in activeToolCalls\n setActiveToolCalls((prev) => {\n let updated = false;\n return prev.map((tool) => {\n if (!updated && tool.name === parsed.tool_name && !tool.result) {\n updated = true;\n return { ...tool, result: parsed.result };\n }\n return tool;\n });\n });\n // Update in committed messages (consent tool lives in a previous message's toolCalls)\n setMessages((prev) =>\n prev.map((msg) =>\n msg.toolCalls\n ? {\n ...msg,\n toolCalls: msg.toolCalls.map((tc) =>\n tc.name === parsed.tool_name && !tc.result\n ? { ...tc, result: parsed.result }\n : tc\n ),\n }\n : msg\n )\n );\n }\n break;\n\n case \"tool_result_links\":\n if (parsed.links && Array.isArray(parsed.links)) {\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === botMsgId\n ? { ...msg, links: [...(msg.links || []), ...parsed.links] }\n : msg\n )\n );\n }\n break;\n\n case \"client_tool_call\":\n {\n const needsConsent2 = toolConsentSettingsRef.current?.[parsed.tool_name]?.requires_consent === true;\n if (needsConsent2) {\n const consentEntry2: ToolCall = {\n id: parsed.tool_call_id || `tool-${Date.now()}`,\n name: parsed.tool_name,\n displayName: parsed.display_name || undefined,\n arguments: parsed.arguments || {},\n status: \"awaiting_consent\",\n requiresConsent: true,\n timestamp: new Date(),\n };\n streamingToolCallsRef.current = [...streamingToolCallsRef.current, consentEntry2];\n setActiveToolCalls((prev) => [...prev, consentEntry2]);\n } else {\n const toolCallEntry: ToolCall = {\n id: parsed.tool_call_id || `tool-${Date.now()}`,\n name: parsed.tool_name,\n displayName: parsed.display_name || undefined,\n arguments: parsed.arguments || {},\n status: \"executing\",\n timestamp: new Date(),\n };\n streamingToolCallsRef.current = [...streamingToolCallsRef.current, toolCallEntry];\n setActiveToolCalls((prev) => [...prev, toolCallEntry]);\n pendingClientTools.push({\n toolName: parsed.tool_name,\n toolCallId: parsed.tool_call_id,\n arguments: parsed.arguments,\n });\n }\n }\n break;\n\n case \"tool_consent_required\":\n // Another consent-required tool — update existing or create new\n {\n const existingIdx2 = streamingToolCallsRef.current.findIndex(\n (tc) => tc.name === parsed.tool_name && tc.status === \"executing\"\n );\n if (existingIdx2 >= 0) {\n const existing2 = streamingToolCallsRef.current[existingIdx2];\n const updated2: ToolCall = {\n ...existing2,\n status: \"awaiting_consent\",\n requiresConsent: true,\n serverSideExecution: true,\n arguments: parsed.arguments || existing2.arguments,\n };\n streamingToolCallsRef.current = streamingToolCallsRef.current.map(\n (tc, i) => (i === existingIdx2 ? updated2 : tc)\n );\n setActiveToolCalls((prev) =>\n prev.map((tc) => (tc.id === existing2.id ? updated2 : tc))\n );\n } else {\n const consentEntry: ToolCall = {\n id: `consent-${Date.now()}`,\n name: parsed.tool_name,\n displayName: parsed.display_name || undefined,\n arguments: parsed.arguments || {},\n status: \"awaiting_consent\",\n requiresConsent: true,\n serverSideExecution: true,\n timestamp: new Date(),\n };\n streamingToolCallsRef.current = [...streamingToolCallsRef.current, consentEntry];\n setActiveToolCalls((prev) => [...prev, consentEntry]);\n }\n }\n break;\n }\n } catch (e) {\n console.error(\"[Crow] Parse error in tool result response:\", e);\n }\n }\n }\n }\n }\n } catch (error) {\n console.error(\"[Crow] Error submitting tool result:\", error);\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === botMsgId\n ? { ...msg, content: \"Sorry, I encountered an error processing the tool result.\" }\n : msg\n )\n );\n } finally {\n setIsLoading(false);\n }\n },\n [apiUrl, productId, conversationId, selectedModel, subdomain]\n );\n\n const addMessage = useCallback(\n async (role: \"user\" | \"assistant\", content: string) => {\n const msgId = generateMessageId(role === \"user\" ? \"user\" : \"bot\");\n const newMessage: Message = {\n id: msgId,\n content,\n isBot: role === \"assistant\",\n timestamp: new Date(),\n };\n\n // Add to local state immediately\n setMessages((prev) => [...prev, newMessage]);\n\n // Persist to server if we have a conversation\n if (conversationId) {\n try {\n const identityToken = window.__crow_identity_token;\n await fetch(`${apiUrl}/api/chat/conversations/${conversationId}/messages`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n product_id: productId,\n conversation_id: conversationId,\n role,\n content,\n identity_token: identityToken,\n }),\n });\n } catch (e) {\n // Non-critical - message is still in local state\n console.warn(\"[Crow] Failed to persist message:\", e);\n }\n }\n },\n [apiUrl, productId, conversationId]\n );\n\n /** Update a tool call's status by ID (used for consent approval/denial) */\n const updateToolCallStatus = useCallback(\n (toolCallId: string, status: ToolCall[\"status\"]) => {\n setActiveToolCalls((prev) =>\n prev.map((tc) => (tc.id === toolCallId ? { ...tc, status } : tc))\n );\n streamingToolCallsRef.current = streamingToolCallsRef.current.map((tc) =>\n tc.id === toolCallId ? { ...tc, status } : tc\n );\n // Also update committed tool calls in messages\n setMessages((prev) =>\n prev.map((msg) =>\n msg.toolCalls\n ? {\n ...msg,\n toolCalls: msg.toolCalls.map((tc) =>\n tc.id === toolCallId ? { ...tc, status } : tc\n ),\n }\n : msg\n )\n );\n },\n []\n );\n\n return {\n messages,\n isLoading,\n activeToolCalls,\n conversationId,\n selectedModel,\n suggestedActions,\n setSuggestedActions,\n setSelectedModel,\n setConversationId,\n sendMessage,\n stopGeneration,\n resetMessages,\n loadMessages,\n submitToolResult,\n addMessage,\n updateToolCallStatus,\n };\n}\n","/**\n * useConversations - Manages conversation list and history\n */\n\nimport { useState, useCallback } from \"react\";\nimport type { Conversation, Message } from \"../types\";\n\ninterface UseConversationsOptions {\n productId: string;\n apiUrl?: string;\n}\n\nexport function useConversations({ productId, apiUrl = \"\" }: UseConversationsOptions) {\n const [conversations, setConversations] = useState<Conversation[]>([]);\n const [isLoadingHistory, setIsLoadingHistory] = useState(false);\n\n const loadConversations = useCallback(async (): Promise<Conversation[]> => {\n const token = window.__crow_identity_token;\n if (!token) return [];\n\n try {\n const res = await fetch(\n `${apiUrl}/api/chat/conversations?product_id=${productId}&identity_token=${encodeURIComponent(token)}`\n );\n if (res.ok) {\n const data = await res.json();\n const convs = data.conversations || [];\n setConversations(convs);\n return convs;\n }\n } catch (error) {\n console.error(\"[Crow] Failed to load conversations:\", error);\n }\n return [];\n }, [apiUrl, productId]);\n\n const loadConversationHistory = useCallback(\n async (conversationId: string): Promise<Message[]> => {\n const token = window.__crow_identity_token;\n if (!token) return [];\n\n setIsLoadingHistory(true);\n\n try {\n const res = await fetch(\n `${apiUrl}/api/chat/conversations/${conversationId}/history?product_id=${productId}&identity_token=${encodeURIComponent(token)}`\n );\n\n if (res.ok) {\n const data = await res.json();\n const historyMessages = data.messages || [];\n\n interface HistoryMessage {\n role: string;\n content: string;\n thinking?: string;\n tool_calls?: Array<{ name: string; display_name?: string; status: string; arguments?: Record<string, unknown> }>;\n }\n\n return historyMessages\n .filter((msg: HistoryMessage) =>\n msg.role !== \"tool\" && !msg.content.startsWith(\"[Client Tool Result:\")\n )\n .map((msg: HistoryMessage, idx: number) => ({\n id: `history-${idx}`,\n content: msg.content,\n isBot: msg.role === \"assistant\",\n timestamp: new Date(),\n thinking: msg.thinking,\n thinkingComplete: true,\n toolCalls: msg.tool_calls?.map((tc, i) => ({\n id: `history-tool-${idx}-${i}`,\n name: tc.name,\n displayName: tc.display_name || undefined,\n arguments: tc.arguments || {},\n status: tc.status as \"complete\" | \"error\" | \"executing\",\n timestamp: new Date(),\n })),\n }));\n }\n } catch (error) {\n console.error(\"[Crow] Error loading conversation history:\", error);\n } finally {\n setIsLoadingHistory(false);\n }\n\n return [];\n },\n [apiUrl, productId]\n );\n\n const loadAnonymousConversationHistory = useCallback(\n async (conversationId: string): Promise<Message[]> => {\n setIsLoadingHistory(true);\n\n try {\n const res = await fetch(\n `${apiUrl}/api/chat/conversations/${conversationId}/history/anonymous?product_id=${productId}`\n );\n\n if (res.ok) {\n const data = await res.json();\n const historyMessages = data.messages || [];\n\n interface HistoryMessage {\n role: string;\n content: string;\n thinking?: string;\n tool_calls?: Array<{ name: string; display_name?: string; status: string; arguments?: Record<string, unknown> }>;\n }\n\n return historyMessages\n .filter((msg: HistoryMessage) =>\n msg.role !== \"tool\" && !msg.content.startsWith(\"[Client Tool Result:\")\n )\n .map((msg: HistoryMessage, idx: number) => ({\n id: `history-${idx}`,\n content: msg.content,\n isBot: msg.role === \"assistant\",\n timestamp: new Date(),\n thinking: msg.thinking,\n thinkingComplete: true,\n toolCalls: msg.tool_calls?.map((tc, i) => ({\n id: `history-tool-${idx}-${i}`,\n name: tc.name,\n displayName: tc.display_name || undefined,\n arguments: tc.arguments || {},\n status: tc.status as \"complete\" | \"error\" | \"executing\",\n timestamp: new Date(),\n })),\n }));\n }\n } catch (error) {\n console.error(\"[Crow] Error loading anonymous conversation history:\", error);\n } finally {\n setIsLoadingHistory(false);\n }\n\n return [];\n },\n [apiUrl, productId]\n );\n\n return {\n conversations,\n isLoadingHistory,\n loadConversations,\n loadConversationHistory,\n loadAnonymousConversationHistory,\n };\n}\n","/**\n * useWorkflow - Manages workflow state and actions\n */\n\n//THIS IS JOURNEYS\n\nimport { useState, useCallback, useRef } from \"react\";\nimport type { ActiveWorkflow } from \"../types\";\n\ninterface UseWorkflowOptions {\n productId: string;\n apiUrl?: string;\n conversationId: string | null;\n selectedModel?: string;\n onMessage?: (content: string) => void;\n}\n\nexport function useWorkflow({\n productId,\n apiUrl = \"\",\n conversationId,\n selectedModel,\n onMessage,\n}: UseWorkflowOptions) {\n const [activeWorkflow, setActiveWorkflow] = useState<ActiveWorkflow | null>(null);\n const abortControllerRef = useRef<AbortController | null>(null);\n\n const startWorkflow = useCallback((name: string, todos: ActiveWorkflow[\"todos\"]) => {\n setActiveWorkflow({ name, todos });\n }, []);\n\n const updateTodo = useCallback((todoId: string, status: \"pending\" | \"completed\") => {\n setActiveWorkflow((prev) => {\n if (!prev) return null;\n return {\n ...prev,\n todos: prev.todos.map((todo) =>\n todo.id === todoId ? { ...todo, status } : todo\n ),\n };\n });\n }, []);\n\n const markComplete = useCallback(() => {\n setActiveWorkflow((prev) => {\n if (!prev) return null;\n return { ...prev, isComplete: true };\n });\n }, []);\n\n const endWorkflow = useCallback((delay: number = 0) => {\n if (delay > 0) {\n setTimeout(() => setActiveWorkflow(null), delay);\n } else {\n setActiveWorkflow(null);\n }\n }, []);\n\n const exitWorkflow = useCallback(async () => {\n abortControllerRef.current = new AbortController();\n\n try {\n const identityToken = window.__crow_identity_token;\n\n const response = await fetch(`${apiUrl}/api/chat/message`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n product_id: productId,\n message: \"[EXIT_WORKFLOW]\",\n conversation_id: conversationId,\n identity_token: identityToken,\n model: selectedModel,\n }),\n signal: abortControllerRef.current.signal,\n });\n\n if (!response.ok) return;\n\n const reader = response.body?.getReader();\n const decoder = new TextDecoder();\n\n if (reader) {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n const chunk = decoder.decode(value);\n const lines = chunk.split(\"\\n\");\n\n for (const line of lines) {\n if (line.startsWith(\"data: \")) {\n const data = line.slice(6).trim();\n if (data === \"[DONE]\") return;\n\n try {\n const parsed = JSON.parse(data);\n if (parsed.type === \"workflow_ended\") {\n setActiveWorkflow(null);\n }\n if (parsed.type === \"content\" && parsed.content) {\n onMessage?.(parsed.content);\n }\n } catch {\n // Ignore parse errors\n }\n }\n }\n }\n }\n } catch (error) {\n console.error(\"[Crow] Exit workflow error:\", error);\n } finally {\n abortControllerRef.current = null;\n }\n }, [apiUrl, productId, conversationId, selectedModel, onMessage]);\n\n return {\n activeWorkflow,\n startWorkflow,\n updateTodo,\n markComplete,\n endWorkflow,\n exitWorkflow,\n };\n}\n","/**\n * useCrowAPI - Sets up window.crow() API for identity and tools\n */\n\nimport { useEffect, useCallback, useRef } from \"react\";\nimport { DEFAULT_TOOLS } from \"@usecrow/client\";\nimport type { ClientToolHandler, ToolRenderers } from \"../types\";\n\ninterface UseCrowAPIOptions {\n onIdentified?: () => void;\n onReset?: () => void;\n}\n\nexport function useCrowAPI({ onIdentified, onReset }: UseCrowAPIOptions = {}) {\n const onIdentifiedRef = useRef(onIdentified);\n const onResetRef = useRef(onReset);\n const hasCalledInitialRef = useRef(false);\n\n useEffect(() => {\n onIdentifiedRef.current = onIdentified;\n onResetRef.current = onReset;\n });\n\n useEffect(() => {\n // Initialize client tools and register SDK defaults\n if (!window.__crow_client_tools) {\n window.__crow_client_tools = {};\n }\n \n // Register SDK default tools (e.g., whatsOnScreen)\n for (const [toolName, handler] of Object.entries(DEFAULT_TOOLS)) {\n if (!window.__crow_client_tools[toolName]) {\n window.__crow_client_tools[toolName] = handler as ClientToolHandler;\n console.log(`[Crow] Registered default tool: ${toolName}`);\n }\n }\n\n window.crow = function (command: string, options?: unknown) {\n const opts = options as Record<string, unknown> | undefined;\n\n switch (command) {\n case \"identify\":\n if (!opts?.token) {\n console.error(\"[Crow] identify() requires a token\");\n return;\n }\n\n window.__crow_identity_token = opts.token as string;\n\n const { token, ...metadata } = opts;\n window.__crow_public_metadata = metadata;\n\n console.log(\"[Crow] User identified\");\n window.dispatchEvent(\n new CustomEvent(\"crow:identified\", { detail: { token, metadata } })\n );\n break;\n\n case \"resetUser\":\n window.__crow_identity_token = undefined;\n window.__crow_public_metadata = undefined;\n console.log(\"[Crow] User reset\");\n window.dispatchEvent(new CustomEvent(\"crow:reset\"));\n break;\n\n case \"registerTools\":\n if (!opts || typeof opts !== \"object\") {\n console.error(\"[Crow] registerTools() requires an object\");\n return;\n }\n\n if (!window.__crow_client_tools) {\n window.__crow_client_tools = {};\n }\n\n for (const [toolName, handler] of Object.entries(opts)) {\n if (typeof handler === \"function\") {\n window.__crow_client_tools[toolName] = handler as ClientToolHandler;\n console.log(`[Crow] Registered tool: ${toolName}`);\n }\n }\n break;\n\n case \"runJourney\":\n if (!opts?.journeyId) {\n console.error(\"[Crow] runJourney() requires a journeyId\");\n return;\n }\n window.dispatchEvent(\n new CustomEvent(\"crow:runJourney\", {\n detail: { journeyId: opts.journeyId, inputs: opts.inputs || {} },\n })\n );\n break;\n\n case \"setContext\":\n if (!opts || typeof opts !== \"object\") {\n console.error(\"[Crow] setContext() requires an object\");\n return;\n }\n // Merge with existing context\n window.__crow_page_context = {\n ...(window.__crow_page_context || {}),\n ...opts,\n };\n console.log(\"[Crow] Context updated\", window.__crow_page_context);\n break;\n\n case \"clearContext\":\n window.__crow_page_context = undefined;\n console.log(\"[Crow] Context cleared\");\n break;\n\n case \"setIdentityTokenFetcher\":\n if (typeof opts !== \"function\") {\n console.error(\"[Crow] setIdentityTokenFetcher() requires a function\");\n return;\n }\n window.__crow_identity_token_fetcher = opts as () => Promise<string>;\n console.log(\"[Crow] Identity token fetcher registered\");\n break;\n\n case \"onToolResult\":\n if (typeof opts !== \"function\") {\n console.error(\"[Crow] onToolResult() requires a function\");\n return;\n }\n window.__crow_on_tool_result = opts as (toolName: string, result: Record<string, unknown>) => void;\n console.log(\"[Crow] onToolResult callback registered\");\n break;\n\n case \"open\":\n window.dispatchEvent(new CustomEvent(\"crow:open\"));\n break;\n\n case \"close\":\n window.dispatchEvent(new CustomEvent(\"crow:close\"));\n break;\n\n case \"setToolStatus\":\n if (typeof options !== \"string\") {\n console.error(\"[Crow] setToolStatus() requires a string\");\n return;\n }\n (window as any).__crow_tool_status = options || undefined;\n window.dispatchEvent(\n new CustomEvent(\"crow:setToolStatus\", { detail: options })\n );\n break;\n\n case \"setGreeting\":\n if (typeof options !== \"string\") {\n console.error(\"[Crow] setGreeting() requires a string\");\n return;\n }\n (window as any).__crow_greeting = options;\n window.dispatchEvent(\n new CustomEvent(\"crow:setGreeting\", { detail: options })\n );\n break;\n\n case \"setSuggestedActions\":\n if (!Array.isArray(options)) {\n console.error(\"[Crow] setSuggestedActions() requires an array of { label, message }\");\n return;\n }\n (window as any).__crow_suggested_actions = options;\n window.dispatchEvent(\n new CustomEvent(\"crow:setSuggestedActions\", { detail: options })\n );\n break;\n\n case \"registerToolRenderers\":\n if (!opts || typeof opts !== \"object\") {\n console.error(\"[Crow] registerToolRenderers() requires an object\");\n return;\n }\n window.__crow_tool_renderers = {\n ...(window.__crow_tool_renderers || {}),\n ...(opts as ToolRenderers),\n };\n console.log(\"[Crow] Tool renderers registered\");\n break;\n\n default:\n console.warn(`[Crow] Unknown command: ${command}`);\n }\n };\n\n console.log(\"[Crow] API ready\");\n\n // Replay any commands queued before React mounted (script-tag timing)\n const queue = (window as any).__crow_queue as Array<[string, unknown]> | undefined;\n if (queue?.length) {\n console.log(`[Crow] Replaying ${queue.length} queued command(s)`);\n queue.forEach(([cmd, opts]) => window.crow(cmd, opts));\n (window as any).__crow_queue = undefined;\n }\n\n const handleIdentified = () => onIdentifiedRef.current?.();\n const handleReset = () => onResetRef.current?.();\n\n window.addEventListener(\"crow:identified\", handleIdentified);\n window.addEventListener(\"crow:reset\", handleReset);\n\n if (window.__crow_identity_token && !hasCalledInitialRef.current) {\n hasCalledInitialRef.current = true;\n onIdentifiedRef.current?.();\n }\n\n return () => {\n window.removeEventListener(\"crow:identified\", handleIdentified);\n window.removeEventListener(\"crow:reset\", handleReset);\n };\n }, []);\n\n const executeClientTool = useCallback(\n async (toolName: string, args: Record<string, unknown>) => {\n const handler = window.__crow_client_tools?.[toolName];\n if (handler) {\n try {\n return await handler(args);\n } catch (err) {\n console.error(`[Crow] Client tool error: ${toolName}`, err);\n return { status: \"error\", error: String(err) };\n }\n }\n console.warn(`[Crow] No handler for: ${toolName}`);\n return { status: \"error\", error: \"No handler registered\" };\n },\n []\n );\n\n return { executeClientTool };\n}\n","/**\n * Default Widget and Copilot Styles\n * \n * These are the default values used when no custom styles are provided.\n * All values can be overridden via the Supabase database or SDK props.\n */\n\nimport type { ResolvedWidgetStyles, ResolvedCopilotStyles } from './types';\n\n/**\n * Default widget styles - matches the mature widget implementation\n */\nexport const DEFAULT_WIDGET_STYLES: ResolvedWidgetStyles = {\n // ═══════════════════════════════════════════════════════════\n // COLORS\n // ═══════════════════════════════════════════════════════════\n colors: {\n // Primary accent\n primary: '#000000',\n \n // Widget container\n background: 'rgba(255, 255, 255, 0.95)',\n border: '#d1d5db',\n text: '#111827',\n\n // Bot messages\n botBubble: '#000000',\n botText: '#ffffff',\n\n // User messages\n userBubble: '#ffffff',\n userText: '#000000',\n userBorder: '#000000',\n\n // Floating chat bubble\n bubbleBackground: '#ffffff',\n bubbleBorder: '#d1d5db',\n bubbleIcon: '#111827',\n\n // Messages container\n messagesBackground: 'rgba(255, 255, 255, 0.5)',\n },\n\n // ═══════════════════════════════════════════════════════════\n // TYPOGRAPHY\n // ═══════════════════════════════════════════════════════════\n typography: {\n fontFamily: 'system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n fontSize: 14,\n headerFontSize: 16,\n fontWeight: 400,\n lineHeight: 1.5,\n letterSpacing: 0,\n },\n\n // ═══════════════════════════════════════════════════════════\n // ANIMATIONS\n // ═══════════════════════════════════════════════════════════\n animations: {\n duration: 0.3,\n easing: 'easeInOut',\n },\n\n // ═══════════════════════════════════════════════════════════\n // DIMENSIONS\n // ═══════════════════════════════════════════════════════════\n dimensions: {\n width: 400,\n maxHeight: 600,\n messagesMaxHeight: 350,\n borderRadius: 24,\n padding: 20,\n },\n\n // ═══════════════════════════════════════════════════════════\n // POSITIONING (floating widget only)\n // ═══════════════════════════════════════════════════════════\n position: {\n right: 16,\n bottom: 80,\n bubbleRight: 16,\n bubbleBottom: 16,\n },\n\n // ═══════════════════════════════════════════════════════════\n // CHAT BUBBLE (floating button)\n // ═══════════════════════════════════════════════════════════\n bubble: {\n size: 48,\n iconSize: 24,\n },\n\n // ═══════════════════════════════════════════════════════════\n // SHADOWS\n // ═══════════════════════════════════════════════════════════\n shadows: {\n widget: '0 25px 50px -12px rgba(0, 0, 0, 0.25)',\n bubble: '0 25px 50px -12px rgba(0, 0, 0, 0.25)',\n },\n\n // ═══════════════════════════════════════════════════════════\n // BRANDING\n // ═══════════════════════════════════════════════════════════\n branding: {\n showPoweredBy: true,\n poweredByText: 'Powered by Crow',\n showLogo: true,\n logoUrl: '/static/crow.png',\n },\n};\n\n/**\n * Default copilot styles\n */\nexport const DEFAULT_COPILOT_STYLES: ResolvedCopilotStyles = {\n // ═══════════════════════════════════════════════════════════\n // COLORS (same as widget by default)\n // ═══════════════════════════════════════════════════════════\n colors: {\n primary: '#000000',\n background: 'rgba(255, 255, 255, 0.95)',\n border: '#d1d5db',\n text: '#111827',\n botBubble: '#000000',\n botText: '#ffffff',\n userBubble: '#ffffff',\n userText: '#000000',\n userBorder: '#000000',\n bubbleBackground: '#ffffff',\n bubbleBorder: '#d1d5db',\n bubbleIcon: '#111827',\n messagesBackground: 'rgba(255, 255, 255, 0.5)',\n },\n\n // ═══════════════════════════════════════════════════════════\n // TYPOGRAPHY\n // ═══════════════════════════════════════════════════════════\n typography: {\n fontFamily: 'system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n fontSize: 14,\n headerFontSize: 16,\n fontWeight: 400,\n lineHeight: 1.5,\n letterSpacing: 0,\n },\n\n // ═══════════════════════════════════════════════════════════\n // ANIMATIONS\n // ═══════════════════════════════════════════════════════════\n animations: {\n duration: 0.3,\n easing: 'easeInOut',\n },\n\n // ═══════════════════════════════════════════════════════════\n // DIMENSIONS\n // ═══════════════════════════════════════════════════════════\n dimensions: {\n width: 400,\n headerHeight: 56,\n borderRadius: 16,\n padding: 16,\n },\n\n // ═══════════════════════════════════════════════════════════\n // POSITIONING\n // ═══════════════════════════════════════════════════════════\n position: {\n side: 'right',\n },\n\n // ═══════════════════════════════════════════════════════════\n // BRANDING\n // ═══════════════════════════════════════════════════════════\n branding: {\n showPoweredBy: true,\n poweredByText: 'Powered by Crow',\n },\n};\n","/**\n * Style Merging Utilities\n * \n * Functions for deep merging style configurations with proper precedence:\n * defaults < DB styles < SDK props\n */\n\nimport type {\n WidgetStyleConfig,\n CopilotStyleConfig,\n ResolvedWidgetStyles,\n ResolvedCopilotStyles,\n} from './types';\nimport { DEFAULT_WIDGET_STYLES, DEFAULT_COPILOT_STYLES } from './defaults';\n\n/**\n * Deep merge two objects, with source values taking precedence.\n * Only merges plain objects, not arrays.\n */\nfunction deepMerge<T extends Record<string, unknown>>(\n target: T,\n source: Partial<T> | undefined\n): T {\n if (!source) return target;\n\n const result = { ...target };\n\n for (const key of Object.keys(source) as Array<keyof T>) {\n const sourceValue = source[key];\n const targetValue = target[key];\n\n if (\n sourceValue !== undefined &&\n sourceValue !== null &&\n typeof sourceValue === 'object' &&\n !Array.isArray(sourceValue) &&\n typeof targetValue === 'object' &&\n !Array.isArray(targetValue)\n ) {\n // Recursively merge nested objects\n result[key] = deepMerge(\n targetValue as Record<string, unknown>,\n sourceValue as Record<string, unknown>\n ) as T[keyof T];\n } else if (sourceValue !== undefined) {\n // Override with source value\n result[key] = sourceValue as T[keyof T];\n }\n }\n\n return result;\n}\n\n/**\n * Merge widget styles with precedence: defaults < dbStyles < propStyles\n * \n * @param dbStyles - Styles fetched from the database (per product)\n * @param propStyles - Styles passed via SDK props (developer overrides)\n * @returns Fully resolved styles with all defaults applied\n * \n * @example\n * ```tsx\n * const styles = mergeWidgetStyles(\n * { colors: { primary: '#blue' } }, // from DB\n * { colors: { primary: '#red' } } // from props - wins!\n * );\n * // styles.colors.primary === '#red'\n * ```\n */\nexport function mergeWidgetStyles(\n dbStyles?: WidgetStyleConfig,\n propStyles?: WidgetStyleConfig\n): ResolvedWidgetStyles {\n // Start with defaults\n let result = { ...DEFAULT_WIDGET_STYLES };\n\n // Apply DB styles (overrides defaults)\n if (dbStyles) {\n result = {\n colors: deepMerge(result.colors, dbStyles.colors),\n typography: deepMerge(result.typography, dbStyles.typography),\n animations: deepMerge(result.animations, dbStyles.animations),\n dimensions: deepMerge(result.dimensions, dbStyles.dimensions),\n position: deepMerge(result.position, dbStyles.position),\n bubble: deepMerge(result.bubble, dbStyles.bubble),\n shadows: deepMerge(result.shadows, dbStyles.shadows),\n branding: deepMerge(result.branding, dbStyles.branding),\n };\n }\n\n // Apply prop styles (overrides DB styles)\n if (propStyles) {\n result = {\n colors: deepMerge(result.colors, propStyles.colors),\n typography: deepMerge(result.typography, propStyles.typography),\n animations: deepMerge(result.animations, propStyles.animations),\n dimensions: deepMerge(result.dimensions, propStyles.dimensions),\n position: deepMerge(result.position, propStyles.position),\n bubble: deepMerge(result.bubble, propStyles.bubble),\n shadows: deepMerge(result.shadows, propStyles.shadows),\n branding: deepMerge(result.branding, propStyles.branding),\n };\n }\n\n return result;\n}\n\n/**\n * Merge copilot styles with precedence: defaults < dbStyles < propStyles\n * \n * @param dbStyles - Styles fetched from the database (per product)\n * @param propStyles - Styles passed via SDK props (developer overrides)\n * @returns Fully resolved styles with all defaults applied\n */\nexport function mergeCopilotStyles(\n dbStyles?: CopilotStyleConfig,\n propStyles?: CopilotStyleConfig\n): ResolvedCopilotStyles {\n // Start with defaults\n let result = { ...DEFAULT_COPILOT_STYLES };\n\n // Apply DB styles (overrides defaults)\n if (dbStyles) {\n result = {\n colors: deepMerge(result.colors, dbStyles.colors),\n typography: deepMerge(result.typography, dbStyles.typography),\n animations: deepMerge(result.animations, dbStyles.animations),\n dimensions: deepMerge(result.dimensions, dbStyles.dimensions),\n position: deepMerge(result.position, dbStyles.position),\n branding: deepMerge(result.branding, dbStyles.branding),\n };\n }\n\n // Apply prop styles (overrides DB styles)\n if (propStyles) {\n result = {\n colors: deepMerge(result.colors, propStyles.colors),\n typography: deepMerge(result.typography, propStyles.typography),\n animations: deepMerge(result.animations, propStyles.animations),\n dimensions: deepMerge(result.dimensions, propStyles.dimensions),\n position: deepMerge(result.position, propStyles.position),\n branding: deepMerge(result.branding, propStyles.branding),\n };\n }\n\n return result;\n}\n\n/**\n * Convert styles to CSS custom properties for use with CSS variables\n * \n * @example\n * ```tsx\n * const cssVars = stylesToCSSVariables(styles);\n * // { '--crow-primary': '#000', '--crow-bg': '#fff', ... }\n * ```\n */\nexport function stylesToCSSVariables(\n styles: ResolvedWidgetStyles | ResolvedCopilotStyles\n): Record<string, string | number> {\n return {\n // Colors\n '--crow-color-primary': styles.colors.primary,\n '--crow-color-background': styles.colors.background,\n '--crow-color-text': styles.colors.text,\n '--crow-color-border': styles.colors.border,\n '--crow-color-bot-bubble': styles.colors.botBubble,\n '--crow-color-bot-text': styles.colors.botText,\n '--crow-color-user-bubble': styles.colors.userBubble,\n '--crow-color-user-text': styles.colors.userText,\n '--crow-color-user-border': styles.colors.userBorder,\n '--crow-color-messages-bg': styles.colors.messagesBackground,\n \n // Typography\n '--crow-font-family': styles.typography.fontFamily,\n '--crow-font-size': `${styles.typography.fontSize}px`,\n '--crow-header-font-size': `${styles.typography.headerFontSize}px`,\n '--crow-font-weight': `${styles.typography.fontWeight}`,\n '--crow-line-height': `${styles.typography.lineHeight}`,\n '--crow-letter-spacing': `${styles.typography.letterSpacing}px`,\n \n // Animations\n '--crow-animation-duration': `${styles.animations.duration}s`,\n '--crow-animation-easing': styles.animations.easing,\n };\n}\n","/**\n * useWidgetStyles Hook\n * \n * Fetches widget/copilot styles from the API and merges them with defaults and props.\n * Handles caching to avoid redundant fetches.\n */\n\nimport { useState, useEffect, useRef } from 'react';\nimport type {\n WidgetStyleConfig,\n CopilotStyleConfig,\n ResolvedWidgetStyles,\n ResolvedCopilotStyles,\n WidgetConfigResponse,\n} from '../styles/types';\nimport { mergeWidgetStyles, mergeCopilotStyles } from '../styles/utils';\n\n// Simple in-memory cache for style configs\nconst styleCache = new Map<string, WidgetConfigResponse>();\n\ninterface UseWidgetStylesOptions {\n /** Product ID to fetch styles for */\n productId: string;\n /** API URL (defaults to relative path) */\n apiUrl?: string;\n /** Styles passed via props (override DB styles) */\n propStyles?: WidgetStyleConfig;\n /** Skip fetching from API (use for preview mode) */\n skip?: boolean;\n /** Cache key override (defaults to productId) */\n cacheKey?: string;\n /** ISO 639-1 language code for welcome message translation */\n language?: string;\n}\n\ninterface UseWidgetStylesResult {\n /** Fully resolved styles ready for use */\n styles: ResolvedWidgetStyles;\n /** Whether styles are currently loading */\n isLoading: boolean;\n /** Error if fetch failed */\n error: Error | null;\n /** Agent name from product config */\n agentName: string;\n /** Whether browser_use is enabled for this product */\n browserUseEnabled: boolean;\n /** Whether page navigation is enabled for this product */\n pageNavigationEnabled: boolean;\n /** Route definitions for page navigation */\n pageNavigationRoutes: Array<{ name: string; path: string; description?: string; params?: Record<string, string> }>;\n /** Whether to show thinking/reasoning to users */\n showThinking: boolean;\n /** Whether to persist anonymous conversations across page refreshes (undefined while loading) */\n persistAnonymousConversations: boolean | undefined;\n /** Custom welcome message (undefined uses SDK default) */\n welcomeMessage: string | undefined;\n /** AI model configured for this product */\n selectedModel: string | undefined;\n /** Initial suggestion buttons shown when chat opens */\n initialSuggestions: Array<{ label: string; message: string }>;\n /** Per-tool consent settings from dashboard */\n toolConsentSettings: Record<string, { requires_consent: boolean }>;\n /** Refetch styles from API */\n refetch: () => Promise<void>;\n}\n\ninterface UseCopilotStylesOptions {\n /** Product ID to fetch styles for */\n productId: string;\n /** API URL (defaults to relative path) */\n apiUrl?: string;\n /** Styles passed via props (override DB styles) */\n propStyles?: CopilotStyleConfig;\n /** Skip fetching from API (use for preview mode) */\n skip?: boolean;\n /** Cache key override (defaults to productId) */\n cacheKey?: string;\n /** ISO 639-1 language code for welcome message translation */\n language?: string;\n}\n\ninterface UseCopilotStylesResult {\n /** Fully resolved styles ready for use */\n styles: ResolvedCopilotStyles;\n /** Whether styles are currently loading */\n isLoading: boolean;\n /** Error if fetch failed */\n error: Error | null;\n /** Agent name from product config */\n agentName: string;\n /** Whether browser_use is enabled for this product */\n browserUseEnabled: boolean;\n /** Whether page navigation is enabled for this product */\n pageNavigationEnabled: boolean;\n /** Route definitions for page navigation */\n pageNavigationRoutes: Array<{ name: string; path: string; description?: string; params?: Record<string, string> }>;\n /** Whether to persist anonymous conversations across page refreshes (undefined while loading) */\n persistAnonymousConversations: boolean | undefined;\n /** Custom welcome message (undefined uses SDK default) */\n welcomeMessage: string | undefined;\n /** AI model configured for this product */\n selectedModel: string | undefined;\n /** Per-tool consent settings from dashboard */\n toolConsentSettings: Record<string, { requires_consent: boolean }>;\n /** Refetch styles from API */\n refetch: () => Promise<void>;\n}\n\n/**\n * Fetch widget configuration from the API\n */\nasync function fetchWidgetConfig(\n productId: string,\n apiUrl?: string,\n language?: string\n): Promise<WidgetConfigResponse> {\n const baseUrl = apiUrl || '';\n let url = `${baseUrl}/api/products/${productId}/widget-config`;\n if (language && language !== 'en') {\n url += `?language=${encodeURIComponent(language)}`;\n }\n\n const response = await fetch(url);\n\n if (!response.ok) {\n throw new Error(`Failed to fetch widget config: ${response.status} ${response.statusText}`);\n }\n\n return response.json();\n}\n\n/**\n * Hook to fetch and merge widget styles\n * \n * @example\n * ```tsx\n * const { styles, isLoading } = useWidgetStyles({\n * productId: 'my-product',\n * propStyles: { colors: { primary: '#blue' } },\n * });\n * ```\n */\nexport function useWidgetStyles({\n productId,\n apiUrl,\n propStyles,\n skip = false,\n cacheKey,\n language,\n}: UseWidgetStylesOptions): UseWidgetStylesResult {\n const key = cacheKey || (language && language !== 'en' ? `${productId}:${language}` : productId);\n const [isLoading, setIsLoading] = useState(!skip && !styleCache.has(key));\n const [error, setError] = useState<Error | null>(null);\n const [dbStyles, setDbStyles] = useState<WidgetStyleConfig | undefined>(\n styleCache.get(key)?.widgetStyles\n );\n const [initialSuggestions, setInitialSuggestions] = useState<Array<{ label: string; message: string }>>(\n styleCache.get(key)?.initialSuggestions || []\n );\n const [toolConsentSettings, setToolConsentSettings] = useState<Record<string, { requires_consent: boolean }>>(\n styleCache.get(key)?.toolConsentSettings || {}\n );\n const [agentName, setAgentName] = useState(\n styleCache.get(key)?.agentName || 'Assistant'\n );\n const [browserUseEnabled, setBrowserUseEnabled] = useState(\n styleCache.get(key)?.browserUseEnabled || false\n );\n const [pageNavigationEnabled, setPageNavigationEnabled] = useState(\n styleCache.get(key)?.pageNavigationEnabled || false\n );\n const [pageNavigationRoutes, setPageNavigationRoutes] = useState<\n Array<{ name: string; path: string; description?: string; params?: Record<string, string> }>\n >(styleCache.get(key)?.pageNavigationRoutes || []);\n const [showThinking, setShowThinking] = useState(\n styleCache.get(key)?.showThinking ?? true\n );\n // Return undefined while loading so useChat knows to wait\n const [persistAnonymousConversations, setPersistAnonymousConversations] = useState<boolean | undefined>(\n styleCache.has(key) ? (styleCache.get(key)?.persistAnonymousConversations ?? true) : undefined\n );\n const [welcomeMessage, setWelcomeMessage] = useState<string | undefined>(\n styleCache.get(key)?.welcomeMessage ?? undefined\n );\n const [selectedModel, setSelectedModel] = useState<string | undefined>(\n styleCache.get(key)?.model ?? undefined\n );\n \n // Track if we've already fetched\n const hasFetchedRef = useRef(false);\n \n const fetchStyles = async () => {\n if (skip) return;\n\n setIsLoading(true);\n setError(null);\n\n try {\n const config = await fetchWidgetConfig(productId, apiUrl, language);\n\n // Cache the result\n styleCache.set(key, config);\n\n setDbStyles(config.widgetStyles);\n setAgentName(config.agentName || 'Assistant');\n setBrowserUseEnabled(config.browserUseEnabled || false);\n setPageNavigationEnabled(config.pageNavigationEnabled || false);\n setPageNavigationRoutes(config.pageNavigationRoutes || []);\n setShowThinking(config.showThinking ?? true);\n setPersistAnonymousConversations(config.persistAnonymousConversations ?? true);\n setWelcomeMessage(config.welcomeMessage ?? undefined);\n setSelectedModel(config.model ?? undefined);\n setInitialSuggestions(config.initialSuggestions || []);\n setToolConsentSettings(config.toolConsentSettings || {});\n } catch (err) {\n console.error('[CrowWidget] Failed to fetch styles:', err);\n setError(err instanceof Error ? err : new Error(String(err)));\n } finally {\n setIsLoading(false);\n }\n };\n\n useEffect(() => {\n // Skip if disabled or already fetched\n if (skip || hasFetchedRef.current) return;\n\n // Check cache first\n const cached = styleCache.get(key);\n if (cached) {\n setDbStyles(cached.widgetStyles);\n setAgentName(cached.agentName || 'Assistant');\n setBrowserUseEnabled(cached.browserUseEnabled || false);\n setShowThinking(cached.showThinking ?? true);\n setPersistAnonymousConversations(cached.persistAnonymousConversations ?? true);\n setWelcomeMessage(cached.welcomeMessage ?? undefined);\n setSelectedModel(cached.model ?? undefined);\n setIsLoading(false);\n return;\n }\n\n hasFetchedRef.current = true;\n fetchStyles();\n }, [productId, apiUrl, skip, key]);\n \n // Merge styles: defaults < DB < props\n const styles = mergeWidgetStyles(dbStyles, propStyles);\n\n return {\n styles,\n isLoading,\n error,\n agentName,\n browserUseEnabled,\n pageNavigationEnabled,\n pageNavigationRoutes,\n showThinking,\n persistAnonymousConversations,\n welcomeMessage,\n selectedModel,\n initialSuggestions,\n toolConsentSettings,\n refetch: fetchStyles,\n };\n}\n\n/**\n * Hook to fetch and merge copilot styles\n * \n * @example\n * ```tsx\n * const { styles, isLoading } = useCopilotStyles({\n * productId: 'my-product',\n * propStyles: { position: { side: 'left' } },\n * });\n * ```\n */\nexport function useCopilotStyles({\n productId,\n apiUrl,\n propStyles,\n skip = false,\n cacheKey,\n language,\n}: UseCopilotStylesOptions): UseCopilotStylesResult {\n const key = cacheKey || (language && language !== 'en' ? `${productId}:${language}` : productId);\n const [isLoading, setIsLoading] = useState(!skip && !styleCache.has(key));\n const [error, setError] = useState<Error | null>(null);\n const [dbStyles, setDbStyles] = useState<CopilotStyleConfig | undefined>(\n styleCache.get(key)?.copilotStyles\n );\n const [agentName, setAgentName] = useState(\n styleCache.get(key)?.agentName || 'Assistant'\n );\n const [browserUseEnabled, setBrowserUseEnabled] = useState(\n styleCache.get(key)?.browserUseEnabled || false\n );\n const [pageNavigationEnabled, setPageNavigationEnabled] = useState(\n styleCache.get(key)?.pageNavigationEnabled || false\n );\n const [pageNavigationRoutes, setPageNavigationRoutes] = useState<\n Array<{ name: string; path: string; description?: string; params?: Record<string, string> }>\n >(styleCache.get(key)?.pageNavigationRoutes || []);\n // Return undefined while loading so useChat knows to wait\n const [persistAnonymousConversations, setPersistAnonymousConversations] = useState<boolean | undefined>(\n styleCache.has(key) ? (styleCache.get(key)?.persistAnonymousConversations ?? true) : undefined\n );\n const [welcomeMessage, setWelcomeMessage] = useState<string | undefined>(\n styleCache.get(key)?.welcomeMessage ?? undefined\n );\n const [selectedModel, setSelectedModel] = useState<string | undefined>(\n styleCache.get(key)?.model ?? undefined\n );\n const [toolConsentSettings, setToolConsentSettings] = useState<Record<string, { requires_consent: boolean }>>(\n styleCache.get(key)?.toolConsentSettings || {}\n );\n\n // Track if we've already fetched\n const hasFetchedRef = useRef(false);\n\n const fetchStyles = async () => {\n if (skip) return;\n\n setIsLoading(true);\n setError(null);\n\n try {\n const config = await fetchWidgetConfig(productId, apiUrl, language);\n\n // Cache the result\n styleCache.set(key, config);\n\n setDbStyles(config.copilotStyles);\n setAgentName(config.agentName || 'Assistant');\n setBrowserUseEnabled(config.browserUseEnabled || false);\n setPageNavigationEnabled(config.pageNavigationEnabled || false);\n setPageNavigationRoutes(config.pageNavigationRoutes || []);\n setPersistAnonymousConversations(config.persistAnonymousConversations ?? true);\n setWelcomeMessage(config.welcomeMessage ?? undefined);\n setSelectedModel(config.model ?? undefined);\n setToolConsentSettings(config.toolConsentSettings || {});\n } catch (err) {\n console.error('[CrowCopilot] Failed to fetch styles:', err);\n setError(err instanceof Error ? err : new Error(String(err)));\n } finally {\n setIsLoading(false);\n }\n };\n\n useEffect(() => {\n // Skip if disabled or already fetched\n if (skip || hasFetchedRef.current) return;\n\n // Check cache first\n const cached = styleCache.get(key);\n if (cached) {\n setDbStyles(cached.copilotStyles);\n setAgentName(cached.agentName || 'Assistant');\n setBrowserUseEnabled(cached.browserUseEnabled || false);\n setPageNavigationEnabled(cached.pageNavigationEnabled || false);\n setPageNavigationRoutes(cached.pageNavigationRoutes || []);\n setPersistAnonymousConversations(cached.persistAnonymousConversations ?? true);\n setWelcomeMessage(cached.welcomeMessage ?? undefined);\n setSelectedModel(cached.model ?? undefined);\n setIsLoading(false);\n return;\n }\n\n hasFetchedRef.current = true;\n fetchStyles();\n }, [productId, apiUrl, skip, key]);\n \n // Merge styles: defaults < DB < props\n const styles = mergeCopilotStyles(dbStyles, propStyles);\n \n return {\n styles,\n isLoading,\n error,\n agentName,\n browserUseEnabled,\n pageNavigationEnabled,\n pageNavigationRoutes,\n persistAnonymousConversations,\n welcomeMessage,\n selectedModel,\n toolConsentSettings,\n refetch: fetchStyles,\n };\n}\n\n/**\n * Clear the style cache (useful for testing or forcing refetch)\n */\nexport function clearStyleCache(productId?: string): void {\n if (productId) {\n styleCache.delete(productId);\n } else {\n styleCache.clear();\n }\n}\n\n/**\n * Hook for preview mode - uses provided styles directly without fetching\n * \n * @example\n * ```tsx\n * // In dashboard style editor\n * const { styles } = usePreviewStyles({\n * styles: localEditorState,\n * });\n * ```\n */\nexport function usePreviewWidgetStyles(\n previewStyles: WidgetStyleConfig\n): { styles: ResolvedWidgetStyles } {\n return {\n styles: mergeWidgetStyles(undefined, previewStyles),\n };\n}\n\nexport function usePreviewCopilotStyles(\n previewStyles: CopilotStyleConfig\n): { styles: ResolvedCopilotStyles } {\n return {\n styles: mergeCopilotStyles(undefined, previewStyles),\n };\n}\n","import { useState, useCallback, useRef, useEffect } from 'react';\n\ninterface UseTTSOutputOptions {\n backendUrl: string;\n voiceId?: string; // default: \"YTpq7expH9539ERJ\"\n}\n\ninterface UseTTSOutputReturn {\n speak: (text: string) => void;\n stop: () => void;\n isSpeaking: boolean;\n error: string | null;\n}\n\n/**\n * Hook for playing text-to-speech audio from the Gradium TTS WebSocket API.\n *\n * Uses Web Audio API for gapless playback of PCM audio chunks (48kHz sample rate).\n *\n * @param options Configuration options\n * @returns TTS control functions and state\n *\n * @example\n * ```tsx\n * const { speak, stop, isSpeaking, error } = useTTSOutput({\n * backendUrl: 'ws://localhost:8000',\n * voiceId: 'YTpq7expH9539ERJ'\n * });\n *\n * // Speak some text\n * speak(\"Hello world!\");\n *\n * // Stop playback\n * stop();\n * ```\n */\nexport function useTTSOutput({\n backendUrl,\n voiceId = 'YTpq7expH9539ERJ',\n}: UseTTSOutputOptions): UseTTSOutputReturn {\n const [isSpeaking, setIsSpeaking] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const wsRef = useRef<WebSocket | null>(null);\n const audioContextRef = useRef<AudioContext | null>(null);\n const nextTimeRef = useRef<number>(0);\n const streamCompleteRef = useRef<boolean>(false);\n const completionCheckIntervalRef = useRef<NodeJS.Timeout | null>(null);\n\n // Cleanup function for audio context only (keep WebSocket separate)\n const cleanupAudioContext = useCallback(() => {\n setIsSpeaking(false);\n if (audioContextRef.current && audioContextRef.current.state !== 'closed') {\n audioContextRef.current.close();\n audioContextRef.current = null;\n }\n if (completionCheckIntervalRef.current) {\n clearInterval(completionCheckIntervalRef.current);\n completionCheckIntervalRef.current = null;\n }\n }, []);\n\n // Cleanup function for WebSocket only\n const closeWebSocket = useCallback(() => {\n if (wsRef.current && wsRef.current.readyState === WebSocket.OPEN) {\n try {\n wsRef.current.send(JSON.stringify({ type: 'stop' }));\n wsRef.current.close();\n } catch (e) {\n // Ignore errors during close\n }\n }\n wsRef.current = null;\n }, []);\n\n // Full cleanup for errors and manual stop\n const cleanupTTS = useCallback(() => {\n setIsSpeaking(false);\n setError(null);\n closeWebSocket();\n cleanupAudioContext();\n }, [closeWebSocket, cleanupAudioContext]);\n\n // Wait for all scheduled audio to finish playing\n const waitForAudioComplete = useCallback(() => {\n if (completionCheckIntervalRef.current) {\n clearInterval(completionCheckIntervalRef.current);\n }\n\n completionCheckIntervalRef.current = setInterval(() => {\n if (!audioContextRef.current) {\n if (completionCheckIntervalRef.current) {\n clearInterval(completionCheckIntervalRef.current);\n completionCheckIntervalRef.current = null;\n }\n return;\n }\n\n const now = audioContextRef.current.currentTime;\n if (now >= nextTimeRef.current) {\n // All audio has played\n if (completionCheckIntervalRef.current) {\n clearInterval(completionCheckIntervalRef.current);\n completionCheckIntervalRef.current = null;\n }\n cleanupAudioContext();\n }\n }, 100); // Check every 100ms\n }, [cleanupAudioContext]);\n\n // Play a single PCM audio chunk\n const playAudioChunk = useCallback((base64Audio: string) => {\n if (!audioContextRef.current || audioContextRef.current.state === 'closed') {\n console.error('TTS: AudioContext not available');\n return;\n }\n\n try {\n // Decode base64 to PCM\n const binary = atob(base64Audio);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n\n // Convert Int16 PCM to Float32 for Web Audio\n const pcm16 = new Int16Array(bytes.buffer);\n const float32 = new Float32Array(pcm16.length);\n for (let i = 0; i < pcm16.length; i++) {\n float32[i] = pcm16[i] / 32768;\n }\n\n // Create audio buffer and play\n const buffer = audioContextRef.current.createBuffer(1, float32.length, 48000);\n buffer.getChannelData(0).set(float32);\n\n const source = audioContextRef.current.createBufferSource();\n source.buffer = buffer;\n source.connect(audioContextRef.current.destination);\n\n // Schedule playback for gapless audio\n const now = audioContextRef.current.currentTime;\n if (nextTimeRef.current < now) {\n nextTimeRef.current = now;\n }\n source.start(nextTimeRef.current);\n nextTimeRef.current += buffer.duration;\n } catch (err) {\n console.error('TTS: Error playing audio chunk:', err);\n setError(err instanceof Error ? err.message : 'Failed to play audio chunk');\n }\n }, []);\n\n // Speak text using TTS\n const speak = useCallback(\n (text: string) => {\n console.log('[TTS Hook] speak called with:', text.substring(0, 50), 'backendUrl:', backendUrl);\n\n if (!text.trim()) {\n console.log('[TTS Hook] No text to speak');\n setError('No text to speak');\n return;\n }\n\n // Prevent starting if already playing\n if (isSpeaking || wsRef.current) {\n console.log('[TTS Hook] Already playing');\n setError('Already playing, stop first');\n return;\n }\n\n setError(null);\n nextTimeRef.current = 0;\n streamCompleteRef.current = false;\n\n try {\n // Create audio context\n audioContextRef.current = new (window.AudioContext || (window as any).webkitAudioContext)({\n sampleRate: 48000,\n });\n\n // Construct WebSocket URL\n const url = backendUrl.startsWith('http')\n ? backendUrl.replace(/^http/, 'ws')\n : backendUrl;\n const wsUrl = `${url}/api/tts/stream`;\n console.log('[TTS Hook] Connecting to:', wsUrl);\n\n const ws = new WebSocket(wsUrl);\n wsRef.current = ws;\n\n ws.onopen = () => {\n ws.send(\n JSON.stringify({\n type: 'setup',\n voice_id: voiceId,\n output_format: 'pcm',\n })\n );\n };\n\n ws.onmessage = (event) => {\n const msg = JSON.parse(event.data);\n\n if (msg.type === 'ready') {\n // Send text and end signal\n ws.send(JSON.stringify({ type: 'text', text }));\n ws.send(JSON.stringify({ type: 'end_of_stream' }));\n } else if (msg.type === 'audio') {\n playAudioChunk(msg.audio);\n } else if (msg.type === 'done') {\n streamCompleteRef.current = true;\n // Close WebSocket to release Gradium session, but keep AudioContext open\n closeWebSocket();\n // Wait for audio to finish, then cleanup\n waitForAudioComplete();\n } else if (msg.type === 'error') {\n setError(msg.message || 'TTS error');\n cleanupTTS();\n }\n };\n\n ws.onerror = () => {\n setError('WebSocket error');\n cleanupTTS();\n };\n\n ws.onclose = () => {\n wsRef.current = null;\n };\n\n setIsSpeaking(true);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to start TTS');\n cleanupTTS();\n }\n },\n [\n isSpeaking,\n backendUrl,\n voiceId,\n playAudioChunk,\n closeWebSocket,\n waitForAudioComplete,\n cleanupTTS,\n ]\n );\n\n // Stop playback\n const stop = useCallback(() => {\n cleanupTTS();\n }, [cleanupTTS]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n cleanupTTS();\n };\n }, [cleanupTTS]);\n\n return {\n speak,\n stop,\n isSpeaking,\n error,\n };\n}\n","/**\n * Style Context\n *\n * React context for providing resolved styles to widget/copilot components.\n * This allows components to access styles without prop drilling.\n *\n * NOTE: Layout/dimension styles are now applied via CSS custom properties\n * (see cssVars.ts). This context is still used for:\n * - agentName: Display name shown in widget header\n * - styles: For non-CSS properties like branding, Google Fonts loading, etc.\n * - variant: floating vs embedded mode\n * - isLoading: Loading state\n */\n\nimport React, { createContext, useContext, useMemo } from \"react\";\nimport type {\n ResolvedWidgetStyles,\n ResolvedCopilotStyles,\n} from \"../styles/types\";\nimport {\n DEFAULT_WIDGET_STYLES,\n DEFAULT_COPILOT_STYLES,\n} from \"../styles/defaults\";\n\n// ============================================================================\n// WIDGET STYLE CONTEXT\n// ============================================================================\n\ninterface WidgetStyleContextValue {\n styles: ResolvedWidgetStyles;\n agentName: string;\n isLoading: boolean;\n variant: \"floating\" | \"embedded\";\n showThinking: boolean;\n}\n\nconst WidgetStyleContext = createContext<WidgetStyleContextValue | null>(null);\n\ninterface WidgetStyleProviderProps {\n children: React.ReactNode;\n styles: ResolvedWidgetStyles;\n agentName?: string;\n isLoading?: boolean;\n variant?: \"floating\" | \"embedded\";\n showThinking?: boolean;\n}\n\n/**\n * Provider for widget styles\n */\nexport function WidgetStyleProvider({\n children,\n styles,\n agentName = \"Assistant\",\n isLoading = false,\n variant = \"floating\",\n showThinking = true,\n}: WidgetStyleProviderProps) {\n const value = useMemo(\n () => ({ styles, agentName, isLoading, variant, showThinking }),\n [styles, agentName, isLoading, variant, showThinking],\n );\n\n return (\n <WidgetStyleContext.Provider value={value}>\n {children}\n </WidgetStyleContext.Provider>\n );\n}\n\n/**\n * Hook to access widget styles from context\n *\n * @throws Error if used outside of WidgetStyleProvider\n */\nexport function useWidgetStyleContext(): WidgetStyleContextValue {\n const context = useContext(WidgetStyleContext);\n\n if (!context) {\n throw new Error(\n \"useWidgetStyleContext must be used within a WidgetStyleProvider. \" +\n \"Make sure your component is wrapped with CrowWidget or WidgetStyleProvider.\",\n );\n }\n\n return context;\n}\n\n/**\n * Hook to access widget styles, with fallback to defaults if not in context\n *\n * Use this in components that might be used both inside and outside the widget.\n */\nexport function useWidgetStyles(): ResolvedWidgetStyles {\n const context = useContext(WidgetStyleContext);\n return context?.styles ?? DEFAULT_WIDGET_STYLES;\n}\n\n/**\n * Hook to check if thinking/reasoning should be shown to users\n * \n * Defaults to true if not in context\n */\nexport function useShowThinking(): boolean {\n const context = useContext(WidgetStyleContext);\n return context?.showThinking ?? true;\n}\n\n// ============================================================================\n// COPILOT STYLE CONTEXT\n// ============================================================================\n\ninterface CopilotStyleContextValue {\n styles: ResolvedCopilotStyles;\n agentName: string;\n isLoading: boolean;\n}\n\nconst CopilotStyleContext = createContext<CopilotStyleContextValue | null>(\n null,\n);\n\ninterface CopilotStyleProviderProps {\n children: React.ReactNode;\n styles: ResolvedCopilotStyles;\n agentName?: string;\n isLoading?: boolean;\n}\n\n/**\n * Provider for copilot styles\n */\nexport function CopilotStyleProvider({\n children,\n styles,\n agentName = \"Assistant\",\n isLoading = false,\n}: CopilotStyleProviderProps) {\n const value = useMemo(\n () => ({ styles, agentName, isLoading }),\n [styles, agentName, isLoading],\n );\n\n return (\n <CopilotStyleContext.Provider value={value}>\n {children}\n </CopilotStyleContext.Provider>\n );\n}\n\n/**\n * Hook to access copilot styles from context\n *\n * @throws Error if used outside of CopilotStyleProvider\n */\nexport function useCopilotStyleContext(): CopilotStyleContextValue {\n const context = useContext(CopilotStyleContext);\n\n if (!context) {\n throw new Error(\n \"useCopilotStyleContext must be used within a CopilotStyleProvider. \" +\n \"Make sure your component is wrapped with CrowCopilot or CopilotStyleProvider.\",\n );\n }\n\n return context;\n}\n\n/**\n * Hook to access copilot styles, with fallback to defaults if not in context\n */\nexport function useCopilotStyles(): ResolvedCopilotStyles {\n const context = useContext(CopilotStyleContext);\n return context?.styles ?? DEFAULT_COPILOT_STYLES;\n}\n","/**\n * ShadowContainer - Renders children inside a Shadow DOM boundary\n *\n * This provides complete CSS isolation:\n * - Widget styles don't leak to the host page\n * - Host page styles don't affect the widget\n *\n * Additionally, this component provides keyboard event isolation:\n * - Keyboard events are stopped from propagating to the host page\n * - This prevents host apps from stealing focus or intercepting keystrokes\n * - Escape and Tab keys are allowed to propagate for accessibility\n */\n\nimport { useRef, useState, useEffect, type ReactNode } from \"react\";\nimport { createPortal } from \"react-dom\";\n\ninterface ShadowContainerProps {\n /** Content to render inside the Shadow DOM */\n children: ReactNode;\n /** CSS string to inject into the Shadow DOM */\n styles: string;\n /** Optional ID for the host element */\n hostId?: string;\n /** Optional class name for the host element */\n hostClassName?: string;\n}\n\n// Keys that should pass through to the host application\nconst PASSTHROUGH_KEYS = new Set([\"Escape\", \"Tab\"]);\n\nexport function ShadowContainer({\n children,\n styles,\n hostId = \"crow-widget-host\",\n hostClassName,\n}: ShadowContainerProps) {\n const hostRef = useRef<HTMLDivElement>(null);\n const [shadowRoot, setShadowRoot] = useState<ShadowRoot | null>(null);\n\n // Create shadow root on mount\n useEffect(() => {\n if (hostRef.current && !hostRef.current.shadowRoot) {\n const shadow = hostRef.current.attachShadow({ mode: \"open\" });\n setShadowRoot(shadow);\n }\n }, []);\n\n // Keyboard event isolation - prevents host app from stealing keystrokes\n useEffect(() => {\n if (!shadowRoot || !hostRef.current) return;\n\n const hostElement = hostRef.current;\n\n // ============================================\n // Layer 1: Stop propagation at shadow root\n // (handles bubble-phase host listeners - ~90% of cases)\n // ============================================\n const stopPropagationHandler = (e: Event) => {\n const keyEvent = e as KeyboardEvent;\n if (keyEvent.key && PASSTHROUGH_KEYS.has(keyEvent.key)) {\n return;\n }\n e.stopPropagation();\n };\n\n shadowRoot.addEventListener(\"keydown\", stopPropagationHandler);\n shadowRoot.addEventListener(\"keyup\", stopPropagationHandler);\n shadowRoot.addEventListener(\"keypress\", stopPropagationHandler);\n\n // ============================================\n // Layer 2 & 3: Focus protection\n // (handles capture-phase host listeners that steal focus)\n // ============================================\n let lastFocusedElement: HTMLElement | null = null;\n\n const trackFocus = (e: Event) => {\n lastFocusedElement = e.target as HTMLElement;\n };\n\n const protectFocus = (e: KeyboardEvent) => {\n if (e.key && PASSTHROUGH_KEYS.has(e.key)) {\n return;\n }\n\n // Check if event originated from our widget\n const path = e.composedPath();\n if (!path.includes(hostElement) && !path.includes(shadowRoot)) {\n return;\n }\n\n // Schedule focus restoration after all handlers complete\n if (lastFocusedElement) {\n const elementToRestore = lastFocusedElement;\n queueMicrotask(() => {\n const activeInShadow = shadowRoot.activeElement;\n if (!activeInShadow) {\n // Focus was stolen - restore it\n elementToRestore.focus();\n }\n });\n }\n };\n\n shadowRoot.addEventListener(\"focusin\", trackFocus as EventListener);\n document.addEventListener(\"keydown\", protectFocus, { capture: true });\n\n // ============================================\n // Cleanup\n // ============================================\n return () => {\n shadowRoot.removeEventListener(\"keydown\", stopPropagationHandler);\n shadowRoot.removeEventListener(\"keyup\", stopPropagationHandler);\n shadowRoot.removeEventListener(\"keypress\", stopPropagationHandler);\n shadowRoot.removeEventListener(\"focusin\", trackFocus as EventListener);\n document.removeEventListener(\"keydown\", protectFocus, { capture: true });\n };\n }, [shadowRoot]);\n\n return (\n <div ref={hostRef} id={hostId} className={hostClassName}>\n {shadowRoot &&\n createPortal(\n <>\n <style>{styles}</style>\n {children}\n </>,\n shadowRoot,\n )}\n </div>\n );\n}\n\nShadowContainer.displayName = \"ShadowContainer\";\n","/**\n * ChatBubble - Floating button to toggle widget\n */\n\nimport { MessageCircle, ChevronDown } from \"lucide-react\";\nimport { useWidgetStyleContext } from \"../../context/StyleContext\";\n\ninterface ChatBubbleProps {\n isExpanded: boolean;\n onClick: () => void;\n}\n\nexport function ChatBubble({ isExpanded, onClick }: ChatBubbleProps) {\n const { styles } = useWidgetStyleContext();\n\n return (\n <button\n onClick={onClick}\n className=\"crow-fixed crow-z-[999999] crow-rounded-full crow-flex crow-items-center crow-justify-center crow-shadow-2xl hover:crow-scale-110 crow-transition-all crow-duration-500 crow-border crow-backdrop-blur-md\"\n style={{\n width: styles.bubble.size,\n height: styles.bubble.size,\n right: styles.position.bubbleRight,\n bottom: styles.position.bubbleBottom,\n background: styles.colors.bubbleBackground,\n borderColor: styles.colors.bubbleBorder,\n boxShadow: styles.shadows.bubble,\n color: styles.colors.bubbleIcon,\n }}\n aria-label={isExpanded ? \"Close Chat\" : \"Open Chat\"}\n >\n {isExpanded ? (\n <ChevronDown size={styles.bubble.iconSize} strokeWidth={2} />\n ) : (\n <MessageCircle size={styles.bubble.iconSize} strokeWidth={2} />\n )}\n </button>\n );\n}\n","/**\n * WidgetShell - Container for widget content\n */\n\nimport { forwardRef, useEffect, type ReactNode } from \"react\";\nimport { useWidgetStyleContext } from \"../../context/StyleContext\";\n\n// Map font family values to Google Fonts parameters\nconst GOOGLE_FONTS_MAP: Record<string, string> = {\n '\"Inter\", sans-serif': \"Inter:wght@300;400;500;600;700\",\n '\"Roboto\", sans-serif': \"Roboto:wght@300;400;500;700\",\n '\"Open Sans\", sans-serif': \"Open+Sans:wght@300;400;500;600;700\",\n '\"Poppins\", sans-serif': \"Poppins:wght@300;400;500;600;700\",\n '\"Montserrat\", sans-serif': \"Montserrat:wght@300;400;500;600;700\",\n};\n\ninterface WidgetShellProps {\n children: ReactNode;\n className?: string;\n}\n\nexport const WidgetShell = forwardRef<HTMLDivElement, WidgetShellProps>(\n ({ children, className }, ref) => {\n const { styles, variant } = useWidgetStyleContext();\n\n // Dynamically load Google Fonts when fontFamily changes\n useEffect(() => {\n const fontParam = GOOGLE_FONTS_MAP[styles.typography.fontFamily];\n if (!fontParam) return; // System font, no need to load\n\n const linkId = `crow-google-font-${fontParam.split(\":\")[0]}`;\n\n // Check if already loaded\n if (document.getElementById(linkId)) return;\n\n const link = document.createElement(\"link\");\n link.id = linkId;\n link.rel = \"stylesheet\";\n link.href = `https://fonts.googleapis.com/css2?family=${fontParam}&display=swap`;\n document.head.appendChild(link);\n }, [styles.typography.fontFamily]);\n\n const baseStyle = {\n borderRadius: styles.dimensions.borderRadius,\n padding: styles.dimensions.padding,\n background: styles.colors.background,\n borderColor: styles.colors.border,\n color: styles.colors.text,\n boxShadow: styles.shadows.widget,\n fontFamily: styles.typography.fontFamily,\n fontSize: styles.typography.fontSize,\n fontWeight: styles.typography.fontWeight,\n lineHeight: styles.typography.lineHeight,\n letterSpacing: styles.typography.letterSpacing,\n };\n\n if (variant === \"embedded\") {\n return (\n <div\n ref={ref}\n className={`crow-flex crow-flex-col crow-shadow-2xl crow-gap-3 crow-border crow-backdrop-blur-md crow-overflow-hidden ${\n className ?? \"\"\n }`}\n style={{\n ...baseStyle,\n width: `min(${styles.dimensions.width}px, calc(100vw - 32px))`,\n height: `min(${styles.dimensions.maxHeight}px, calc(100vh - 120px))`,\n }}\n >\n {children}\n </div>\n );\n }\n\n // Floating variant\n return (\n <div\n ref={ref}\n className={`crow-fixed crow-z-[999999] crow-shadow-2xl crow-gap-3 crow-transition-all crow-duration-500 crow-flex crow-flex-col crow-border crow-backdrop-blur-md crow-overflow-hidden ${\n className ?? \"\"\n }`}\n style={{\n ...baseStyle,\n width: `min(${styles.dimensions.width}px, calc(100vw - 32px))`,\n height: `min(${styles.dimensions.maxHeight}px, calc(100vh - 120px))`,\n right: styles.position.right,\n bottom: styles.position.bottom,\n }}\n >\n {children}\n </div>\n );\n },\n);\n\nWidgetShell.displayName = \"WidgetShell\";\n","/**\n * WidgetHeader - Header bar for widget\n */\n\nimport { Plus, History, X, RotateCcw } from \"lucide-react\";\nimport { useWidgetStyleContext } from \"../../context/StyleContext\";\n\ninterface WidgetHeaderProps {\n isVerifiedUser: boolean;\n showConversationList: boolean;\n onNewChat: () => void;\n onToggleHistory: () => void;\n showMinimize?: boolean;\n onToggleMinimize?: () => void;\n}\n\nexport function WidgetHeader({\n isVerifiedUser,\n showConversationList,\n onNewChat,\n onToggleHistory,\n showMinimize = false,\n onToggleMinimize,\n}: WidgetHeaderProps) {\n const { agentName, styles } = useWidgetStyleContext();\n\n return (\n <div\n className=\"crow-flex crow-items-center crow-justify-between crow-mb-3 crow-pb-2 crow-border-b\"\n style={{ borderColor: styles.colors.border }}\n >\n <div className=\"crow-flex crow-items-center crow-gap-2\">\n <span\n className=\"crow-text-sm crow-font-semibold\"\n style={{\n color: styles.colors.text,\n fontSize: styles.typography.headerFontSize,\n }}\n >\n {agentName}\n </span>\n </div>\n\n <div className=\"crow-flex crow-items-center crow-gap-1\">\n {isVerifiedUser ? (\n <button\n onClick={onNewChat}\n className=\"crow-p-1.5 hover:crow-bg-gray-200 crow-rounded crow-transition-colors\"\n aria-label=\"New Chat\"\n title=\"New Chat\"\n >\n <Plus size={18} className=\"crow-text-gray-700\" />\n </button>\n ) : (\n <button\n onClick={onNewChat}\n className=\"crow-p-1.5 hover:crow-bg-gray-200 crow-rounded crow-transition-colors\"\n aria-label=\"Restart Chat\"\n title=\"Restart Chat\"\n >\n <RotateCcw size={16} className=\"crow-text-gray-700\" />\n </button>\n )}\n {isVerifiedUser && (\n <button\n onClick={onToggleHistory}\n className={`crow-p-1.5 hover:crow-bg-gray-200 crow-rounded crow-transition-colors ${\n showConversationList ? \"crow-bg-gray-200\" : \"\"\n }`}\n aria-label=\"Conversation History\"\n title=\"Conversation History\"\n >\n <History size={18} className=\"crow-text-gray-700\" />\n </button>\n )}\n {showMinimize && onToggleMinimize && (\n <button\n onClick={onToggleMinimize}\n className=\"crow-p-1.5 hover:crow-bg-gray-200 crow-rounded crow-transition-colors\"\n aria-label=\"Close chat\"\n title=\"Close chat\"\n >\n <X size={18} className=\"crow-text-gray-700\" />\n </button>\n )}\n </div>\n </div>\n );\n}\n","/**\n * StreamingText - Simple streaming text with blinking cursor\n */\n\nimport ReactMarkdown from \"react-markdown\";\n\ninterface StreamingTextProps {\n content: string;\n isStreaming?: boolean;\n}\n\nexport function StreamingText({\n content,\n isStreaming = false,\n}: StreamingTextProps) {\n return (\n <>\n <ReactMarkdown\n components={{\n strong: ({ children }) => (\n <strong className=\"crow-font-bold\">{children}</strong>\n ),\n ul: ({ children }) => (\n <ul className=\"crow-list-disc crow-pl-5 crow-my-1.5\">{children}</ul>\n ),\n ol: ({ children }) => (\n <ol className=\"crow-list-decimal crow-pl-5 crow-my-1.5\">\n {children}\n </ol>\n ),\n li: ({ children }) => (\n <li className=\"crow-mb-0.5 last:crow-mb-0\">{children}</li>\n ),\n p: ({ children }) => (\n <p className=\"crow-mb-1.5 last:crow-mb-0\">{children}</p>\n ),\n a: ({ href, children }) => {\n const isInternal = href?.startsWith(\"/\");\n return (\n <a\n href={href}\n className=\"crow-underline hover:crow-text-blue-300\"\n {...(!isInternal && { target: \"_blank\", rel: \"noopener noreferrer\" })}\n onClick={\n isInternal\n ? (e) => {\n e.preventDefault();\n // Create a temporary <a> in the main document and click it.\n // SPA frameworks (Next.js, React Router, Vue Router, etc.)\n // intercept <a> clicks on the document for client-side navigation.\n const a = document.createElement(\"a\");\n a.href = href!;\n a.style.display = \"none\";\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n }\n : undefined\n }\n >\n {children}\n </a>\n );\n },\n code: ({ className, children, ...props }) => {\n const isInline = !className;\n return isInline ? (\n <code\n className=\"crow-bg-gray-800 crow-text-gray-200 crow-px-1.5 crow-py-0.5 crow-rounded crow-text-sm\"\n {...props}\n >\n {children}\n </code>\n ) : (\n <code\n className={`crow-text-gray-200 ${className || \"\"}`}\n {...props}\n >\n {children}\n </code>\n );\n },\n pre: ({ children }) => (\n <pre className=\"crow-bg-gray-800 crow-text-gray-200 crow-p-3 crow-rounded-lg crow-my-2 crow-overflow-x-auto crow-text-sm\">\n {children}\n </pre>\n ),\n }}\n >\n {content}\n </ReactMarkdown>\n\n {isStreaming && (\n <span\n className=\"crow-inline-block crow-w-0.5 crow-h-4 crow-ml-0.5 crow-align-text-bottom\"\n style={{\n backgroundColor: \"currentColor\",\n animation: \"cursor-blink 1s ease-in-out infinite\",\n }}\n aria-hidden=\"true\"\n />\n )}\n\n <style>{`\n @keyframes cursor-blink {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0; }\n }\n `}</style>\n </>\n );\n}\n\nexport default StreamingText;\n","/**\n * ThinkingIndicator - Shimmer effect for thinking state\n */\n\nexport function ThinkingIndicator() {\n return (\n <>\n <span\n className=\"crow-inline-block crow-font-medium\"\n style={{\n background:\n \"linear-gradient(90deg, rgba(255,255,255,0.4) 0%, rgba(255,255,255,1) 50%, rgba(255,255,255,0.4) 100%)\",\n backgroundSize: \"200% 100%\",\n WebkitBackgroundClip: \"text\",\n backgroundClip: \"text\",\n WebkitTextFillColor: \"transparent\",\n animation: \"shimmer 1.5s ease-in-out infinite\",\n }}\n >\n Thinking...\n </span>\n <style>{`\n @keyframes shimmer {\n 0% { background-position: 100% 0; }\n 100% { background-position: -100% 0; }\n }\n `}</style>\n </>\n );\n}\n","/**\n * LoadingHistory - Loading animation for conversation history\n */\n\nimport { motion } from \"framer-motion\";\n\nexport function LoadingHistory() {\n return (\n <motion.div\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n className=\"crow-flex crow-justify-center crow-items-center crow-py-8\"\n >\n <div className=\"crow-flex crow-flex-col crow-items-center crow-gap-3\">\n <div className=\"crow-flex crow-gap-1\">\n {[0, 0.15, 0.3].map((delay, i) => (\n <motion.div\n key={i}\n className=\"crow-w-2 crow-h-2 crow-bg-gray-400 crow-rounded-full\"\n animate={{ y: [0, -8, 0] }}\n transition={{ duration: 0.6, repeat: Infinity, delay }}\n />\n ))}\n </div>\n <span className=\"crow-text-sm crow-text-gray-500\">Loading conversation...</span>\n </div>\n </motion.div>\n );\n}\n","/**\n * ReasoningTrace - PostHog-inspired collapsible reasoning display\n */\n\nimport { useState, useRef, useLayoutEffect, useEffect } from \"react\";\nimport { motion, AnimatePresence } from \"framer-motion\";\nimport { ChevronRight, Brain, Check, Loader2 } from \"lucide-react\";\nimport type { ToolCall, ToolRenderers } from \"../../types\";\n\nconst THINKING_MESSAGES = [\n \"Pondering\",\n \"Analyzing\",\n \"Reasoning\",\n \"Considering\",\n \"Processing\",\n \"Evaluating\",\n \"Thinking\",\n \"Exploring\",\n \"Connecting\",\n \"Synthesizing\",\n];\n\nfunction ShimmeringContent({ children }: { children: React.ReactNode }) {\n return (\n <span\n className=\"crow-inline-block\"\n style={{\n background:\n \"linear-gradient(90deg, rgba(100,100,100,0.6) 0%, rgba(100,100,100,1) 50%, rgba(100,100,100,0.6) 100%)\",\n backgroundSize: \"200% 100%\",\n WebkitBackgroundClip: \"text\",\n backgroundClip: \"text\",\n WebkitTextFillColor: \"transparent\",\n animation: \"shimmer 1.5s ease-in-out infinite\",\n }}\n >\n {/* React 18/19 ReactNode type mismatch workaround */}\n {children as any}\n <style>{`\n @keyframes shimmer {\n 0% { background-position: 100% 0; }\n 100% { background-position: -100% 0; }\n }\n `}</style>\n </span>\n );\n}\n\ninterface ReasoningTraceProps {\n thinking?: string;\n isComplete?: boolean;\n toolCalls?: ToolCall[];\n isWaiting?: boolean;\n /** Whether to show detailed reasoning (text + tool calls). If false, only shows \"Thinking...\" indicator */\n showDetails?: boolean;\n /** Custom renderers for tool results — keyed by tool name */\n toolRenderers?: ToolRenderers;\n /** Callback when user allows/denies a consent-gated tool */\n onToolConsent?: (toolCallId: string, approved: boolean) => void;\n}\n\nexport function ReasoningTrace({\n thinking,\n isComplete,\n toolCalls = [],\n isWaiting = false,\n showDetails = true,\n toolRenderers,\n onToolConsent,\n}: ReasoningTraceProps) {\n const hasThinking = !!thinking && thinking.trim().length > 0;\n const hasToolCalls = toolCalls.length > 0;\n const isActive =\n isWaiting ||\n (hasThinking && !isComplete) ||\n toolCalls.some((t) => t.status === \"executing\" || t.status === \"awaiting_consent\");\n\n if (!isWaiting && !hasThinking && !hasToolCalls) return null;\n\n // When showDetails is false, only show a simple \"Thinking...\" indicator while active\n if (!showDetails) {\n // Only show indicator while something is actively processing\n if (!isActive) return null;\n\n return (\n <div className=\"crow-flex crow-justify-start crow-mb-2\">\n <div className=\"crow-max-w-[90%]\">\n <WaitingIndicator />\n </div>\n </div>\n );\n }\n\n // Full detailed view\n return (\n <div className=\"crow-flex crow-justify-start crow-mb-2 crow-w-full\">\n <div className=\"crow-w-full crow-space-y-1.5\">\n {isWaiting && !hasThinking && <WaitingIndicator />}\n\n {hasThinking && (\n <ThinkingBlock thinking={thinking!} isComplete={isComplete} />\n )}\n\n {toolCalls.map((tool) => (\n <ToolCallBlock\n key={tool.id}\n toolCall={tool}\n toolRenderers={toolRenderers}\n onToolConsent={onToolConsent}\n />\n ))}\n </div>\n </div>\n );\n}\n\nfunction WaitingIndicator() {\n // Start at a random index and cycle through messages every 1.5 seconds\n const [messageIndex, setMessageIndex] = useState(() =>\n Math.floor(Math.random() * THINKING_MESSAGES.length),\n );\n\n useEffect(() => {\n const interval = setInterval(() => {\n setMessageIndex((i) => (i + 1) % THINKING_MESSAGES.length);\n }, 3000); // Cycle every 3 seconds\n\n return () => clearInterval(interval);\n }, []);\n\n const message = THINKING_MESSAGES[messageIndex] + \"...\";\n\n return (\n <div className=\"crow-flex crow-items-center crow-gap-1.5 crow-text-xs crow-text-gray-500\">\n <div className=\"crow-flex crow-items-center crow-justify-center crow-w-4 crow-h-4\">\n <ShimmeringContent>\n <Brain className=\"crow-w-3.5 crow-h-3.5\" />\n </ShimmeringContent>\n </div>\n <span className=\"crow-font-medium\">\n <ShimmeringContent>{message}</ShimmeringContent>\n </span>\n </div>\n );\n}\n\nfunction ThinkingBlock({\n thinking,\n isComplete,\n}: {\n thinking: string;\n isComplete?: boolean;\n}) {\n const [isExpanded, setIsExpanded] = useState(!isComplete);\n // Start at a random index and cycle through messages every 1.5 seconds\n const [messageIndex, setMessageIndex] = useState(() =>\n Math.floor(Math.random() * THINKING_MESSAGES.length),\n );\n\n useLayoutEffect(() => {\n setIsExpanded(!isComplete);\n }, [isComplete]);\n\n useEffect(() => {\n if (isComplete) return; // Stop cycling when complete\n\n const interval = setInterval(() => {\n setMessageIndex((i) => (i + 1) % THINKING_MESSAGES.length);\n }, 3000); // Cycle every 3 seconds\n\n return () => clearInterval(interval);\n }, [isComplete]);\n\n const isInProgress = !isComplete;\n const message = THINKING_MESSAGES[messageIndex] + \"...\";\n\n return (\n <div className=\"crow-flex crow-flex-col crow-gap-1 crow-text-xs\">\n <button\n onClick={() => setIsExpanded(!isExpanded)}\n className={`crow-flex crow-items-center crow-gap-1.5 crow-select-none crow-transition-colors ${\n isInProgress\n ? \"crow-text-gray-500\"\n : \"crow-text-gray-600 hover:crow-text-gray-800\"\n } crow-cursor-pointer`}\n >\n <div className=\"crow-flex crow-items-center crow-justify-center crow-w-4 crow-h-4\">\n {isInProgress ? (\n <ShimmeringContent>\n <Brain className=\"crow-w-3.5 crow-h-3.5\" />\n </ShimmeringContent>\n ) : (\n <Brain className=\"crow-w-3.5 crow-h-3.5\" />\n )}\n </div>\n\n <span className=\"crow-font-medium\">\n {isInProgress ? (\n <ShimmeringContent>{message}</ShimmeringContent>\n ) : (\n \"Thought\"\n )}\n </span>\n\n <motion.div\n animate={{ rotate: isExpanded ? 90 : 0 }}\n transition={{ duration: 0.15 }}\n className=\"crow-flex-shrink-0\"\n >\n <ChevronRight className=\"crow-w-3 crow-h-3\" />\n </motion.div>\n\n {isComplete && (\n <Check className=\"crow-w-3 crow-h-3 crow-text-green-500\" />\n )}\n </button>\n\n <AnimatePresence>\n {isExpanded && (\n <motion.div\n initial={{ height: 0, opacity: 0 }}\n animate={{ height: \"auto\", opacity: 1 }}\n exit={{ height: 0, opacity: 0 }}\n transition={{ duration: 0.15 }}\n className=\"crow-overflow-hidden\"\n >\n <div className=\"crow-border-l-2 crow-border-gray-200 crow-pl-3 crow-ml-2\">\n <div\n className={`crow-text-xs crow-leading-relaxed crow-whitespace-pre-wrap ${\n isComplete ? \"crow-text-gray-500\" : \"crow-text-gray-600\"\n }`}\n >\n {thinking}\n </div>\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n );\n}\n\n/** Renders tool result from React SDK (ReactNode), script tag (HTML string), or DOM element (Chart.js/D3) */\nfunction RenderedToolResult({ renderer, result, status }: {\n renderer: (props: { result: unknown; status: string }) => unknown;\n result: unknown;\n status: string;\n}) {\n const domRef = useRef<HTMLDivElement>(null);\n const rendered = renderer({ result, status });\n\n useEffect(() => {\n if (domRef.current && rendered instanceof HTMLElement) {\n domRef.current.innerHTML = \"\";\n domRef.current.appendChild(rendered);\n }\n }, [rendered]);\n\n if (rendered instanceof HTMLElement) {\n return <div className=\"crow-mt-1.5 crow-mb-0.5\" ref={domRef} />;\n }\n if (typeof rendered === \"string\") {\n return <div className=\"crow-mt-1.5 crow-mb-0.5\" dangerouslySetInnerHTML={{ __html: rendered }} />;\n }\n return <div className=\"crow-mt-1.5 crow-mb-0.5\">{rendered as any}</div>;\n}\n\nfunction ToolCallBlock({\n toolCall,\n toolRenderers,\n onToolConsent,\n}: {\n toolCall: ToolCall;\n toolRenderers?: ToolRenderers;\n onToolConsent?: (toolCallId: string, approved: boolean) => void;\n}) {\n const [expanded, setExpanded] = useState(false);\n const hasArgs = Object.keys(toolCall.arguments || {}).length > 0;\n\n const isExecuting = toolCall.status === \"executing\";\n const isComplete = toolCall.status === \"complete\";\n const isError = toolCall.status === \"error\";\n const isAwaitingConsent = toolCall.status === \"awaiting_consent\";\n const isDenied = toolCall.status === \"denied\";\n\n // Check if a custom renderer exists for this tool\n const customRenderer = toolRenderers?.[toolCall.name];\n const hasCustomRender =\n isComplete && customRenderer && toolCall.result != null;\n\n return (\n <div className=\"crow-flex crow-flex-col crow-gap-1 crow-text-xs\">\n <div\n className={`crow-flex crow-items-center crow-gap-1.5 crow-select-none crow-transition-colors ${\n isExecuting || isAwaitingConsent ? \"crow-text-gray-500\" : \"crow-text-gray-600\"\n }`}\n >\n {hasArgs && !isAwaitingConsent && (\n <button\n onClick={() => setExpanded(!expanded)}\n className=\"crow-cursor-pointer hover:crow-text-gray-800\"\n >\n <motion.div\n animate={{ rotate: expanded ? 90 : 0 }}\n transition={{ duration: 0.15 }}\n >\n <ChevronRight className=\"crow-w-3 crow-h-3\" />\n </motion.div>\n </button>\n )}\n\n {isAwaitingConsent && (\n <Loader2 className=\"crow-w-3 crow-h-3 crow-animate-spin crow-text-amber-500\" />\n )}\n {isExecuting && (\n <Loader2 className=\"crow-w-3 crow-h-3 crow-animate-spin crow-text-blue-500\" />\n )}\n {isComplete && (\n <Check className=\"crow-w-3 crow-h-3 crow-text-green-500\" />\n )}\n {isError && (\n <span className=\"crow-w-3 crow-h-3 crow-text-red-500\">✕</span>\n )}\n {isDenied && (\n <span className=\"crow-w-3 crow-h-3 crow-text-gray-400\">✕</span>\n )}\n\n <span className=\"crow-font-medium\">\n {toolCall.displayName || toolCall.name}\n </span>\n\n {isAwaitingConsent && (\n <>\n <span className=\"crow-text-amber-500\">needs permission</span>\n <button\n onClick={() => onToolConsent?.(toolCall.id, true)}\n className=\"crow-px-2 crow-py-0.5 crow-rounded crow-text-xs crow-font-medium crow-text-white crow-cursor-pointer\"\n style={{ backgroundColor: \"#2563eb\" }}\n >\n Allow\n </button>\n <button\n onClick={() => onToolConsent?.(toolCall.id, false)}\n className=\"crow-px-2 crow-py-0.5 crow-rounded crow-border crow-text-xs crow-font-medium crow-text-gray-500 crow-cursor-pointer\"\n style={{ borderColor: \"#d1d5db\", backgroundColor: \"transparent\" }}\n >\n Deny\n </button>\n </>\n )}\n {isExecuting && (\n <span className=\"crow-text-gray-400\">running...</span>\n )}\n {isComplete && (\n <span className=\"crow-text-gray-400\">done</span>\n )}\n {isError && (\n <span className=\"crow-text-gray-400\">failed</span>\n )}\n {isDenied && (\n <span className=\"crow-text-gray-400\">denied</span>\n )}\n </div>\n\n {/* Custom renderer for tool result (e.g. inline chart) — full width, no indent */}\n {hasCustomRender && (\n <RenderedToolResult renderer={customRenderer} result={toolCall.result} status={toolCall.status} />\n )}\n\n <AnimatePresence>\n {expanded && hasArgs && (\n <motion.div\n initial={{ height: 0, opacity: 0 }}\n animate={{ height: \"auto\", opacity: 1 }}\n exit={{ height: 0, opacity: 0 }}\n transition={{ duration: 0.15 }}\n className=\"crow-overflow-hidden\"\n >\n <pre className=\"crow-mt-1 crow-p-2 crow-bg-gray-800 crow-rounded crow-text-xs crow-font-mono crow-text-gray-200 crow-overflow-x-auto crow-max-h-32 crow-overflow-y-auto crow-ml-4\">\n {JSON.stringify(toolCall.arguments, null, 2)}\n </pre>\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n );\n}\n\nexport default ReasoningTrace;\n","/**\n * MessageBubble - Individual message display\n */\n\nimport ReactMarkdown from \"react-markdown\";\n// import { formatTime } from \"../../utils\";\nimport type { Message, ToolCall, ToolRenderers } from \"../../types\";\nimport { ReasoningTrace } from \"./ReasoningTrace\";\nimport { StreamingText } from \"./StreamingText\";\nimport { useWidgetStyles, useShowThinking } from \"../../context/StyleContext\";\n\ninterface MessageBubbleProps {\n message: Message;\n toolCalls?: ToolCall[];\n isLoading?: boolean;\n toolRenderers?: ToolRenderers;\n onToolConsent?: (toolCallId: string, approved: boolean) => void;\n}\n\nexport function MessageBubble({\n message,\n toolCalls = [],\n isLoading = false,\n toolRenderers,\n onToolConsent,\n}: MessageBubbleProps) {\n const styles = useWidgetStyles();\n const showThinkingSetting = useShowThinking();\n\n const isWaiting =\n message.content === \"Thinking...\" ||\n (message.isBot && isLoading && !message.content);\n const hasThinking = message.isBot && message.thinking;\n const hasContent = message.content && message.content !== \"Thinking...\";\n const hasToolCalls = toolCalls.length > 0;\n\n // Always show reasoning trace for bot messages when there's activity\n // The showThinkingSetting controls whether detailed content is shown\n const showReasoningTrace =\n message.isBot && (isWaiting || hasThinking || hasToolCalls);\n\n const isStreaming = Boolean(message.isBot && isLoading && hasContent);\n\n return (\n <div\n id={message.id}\n className={`crow-flex crow-flex-col ${\n message.isBot ? \"crow-items-start\" : \"crow-items-end\"\n }`}\n >\n {showReasoningTrace && (\n <ReasoningTrace\n thinking={message.thinking}\n isComplete={message.thinkingComplete}\n toolCalls={toolCalls}\n isWaiting={isWaiting && !hasThinking}\n showDetails={showThinkingSetting}\n toolRenderers={toolRenderers}\n onToolConsent={onToolConsent}\n />\n )}\n\n {hasContent && (\n <div\n className=\"crow-max-w-[80%] crow-break-words crow-rounded-2xl crow-px-4 crow-py-2 crow-transition-all crow-duration-150\"\n style={\n message.isBot\n ? {\n background: styles.colors.botBubble,\n color: styles.colors.botText,\n }\n : {\n background: styles.colors.userBubble,\n color: styles.colors.userText,\n border: `1px solid ${styles.colors.userBorder}`,\n }\n }\n >\n <div>\n {message.isBot ? (\n <StreamingText\n content={message.content}\n isStreaming={isStreaming}\n />\n ) : (\n <ReactMarkdown\n components={{\n strong: ({ children }) => (\n <strong className=\"crow-font-bold\">{children}</strong>\n ),\n ul: ({ children }) => (\n <ul className=\"crow-list-disc crow-pl-5 crow-my-1.5\">\n {children}\n </ul>\n ),\n ol: ({ children }) => (\n <ol className=\"crow-list-decimal crow-pl-5 crow-my-1.5\">\n {children}\n </ol>\n ),\n li: ({ children }) => (\n <li className=\"crow-mb-0.5 last:crow-mb-0\">{children}</li>\n ),\n p: ({ children }) => (\n <p className=\"crow-mb-1.5 last:crow-mb-0\">{children}</p>\n ),\n a: ({ href, children }) => {\n const isInternal = href?.startsWith(\"/\");\n return (\n <a\n href={href}\n className=\"crow-underline hover:crow-text-blue-300\"\n {...(!isInternal && { target: \"_blank\", rel: \"noopener noreferrer\" })}\n onClick={\n isInternal\n ? (e) => {\n e.preventDefault();\n const a = document.createElement(\"a\");\n a.href = href!;\n a.style.display = \"none\";\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n }\n : undefined\n }\n >\n {children}\n </a>\n );\n },\n }}\n >\n {message.content}\n </ReactMarkdown>\n )}\n </div>\n {/* <div className=\"crow-text-xs crow-opacity-60 crow-mt-1\">\n {formatTime(message.timestamp)}\n </div> */}\n </div>\n )}\n </div>\n );\n}\n","/**\n * MessageList - Renders list of messages\n */\n\nimport type { Message, ToolCall, ToolRenderers } from \"../../types\";\nimport { MessageBubble } from \"./MessageBubble\";\nimport { LoadingHistory } from \"./LoadingHistory\";\n\ninterface MessageListProps {\n messages: Message[];\n activeToolCalls: ToolCall[];\n isLoadingHistory: boolean;\n isGenerating?: boolean;\n toolRenderers?: ToolRenderers;\n onToolConsent?: (toolCallId: string, approved: boolean) => void;\n}\n\nexport function MessageList({\n messages,\n activeToolCalls,\n isLoadingHistory,\n isGenerating = false,\n toolRenderers,\n onToolConsent,\n}: MessageListProps) {\n if (isLoadingHistory) {\n return <LoadingHistory />;\n }\n\n const lastBotIndex = messages.reduce(\n (lastIdx, m, i) => (m.isBot ? i : lastIdx),\n -1,\n );\n\n return (\n <>\n {messages.map((msg, index) => {\n const isLastBot = index === lastBotIndex;\n // For the currently streaming message, use activeToolCalls\n // For completed/historical messages, use the message's own toolCalls\n const toolCallsToShow = isLastBot && isGenerating\n ? activeToolCalls\n : msg.toolCalls || [];\n \n return (\n <MessageBubble\n key={msg.id}\n message={msg}\n toolCalls={toolCallsToShow}\n isLoading={isLastBot && isGenerating}\n toolRenderers={toolRenderers}\n onToolConsent={onToolConsent}\n />\n );\n })}\n </>\n );\n}\n","/**\n * MessagesContainer - Scrollable container for messages\n */\n\nimport {\n forwardRef,\n useEffect,\n useRef,\n useCallback,\n type ReactNode,\n} from \"react\";\nimport { motion } from \"framer-motion\";\nimport { useWidgetStyles } from \"../../context/StyleContext\";\nimport { MESSAGES_CONTAINER_ID } from \"../../constants\";\n\ninterface MessagesContainerProps {\n children: ReactNode;\n}\n\nexport const MessagesContainer = forwardRef<\n HTMLDivElement,\n MessagesContainerProps\n>(({ children }, ref) => {\n const styles = useWidgetStyles();\n const internalRef = useRef<HTMLDivElement>(null);\n const lastScrollHeightRef = useRef<number>(0);\n const isUserScrollingRef = useRef<boolean>(false);\n\n const containerRef = (ref as React.RefObject<HTMLDivElement>) || internalRef;\n\n const isNearBottom = useCallback(() => {\n const container = containerRef.current;\n if (!container) return true;\n const threshold = 100;\n return (\n container.scrollHeight - container.scrollTop - container.clientHeight <\n threshold\n );\n }, [containerRef]);\n\n const scrollToBottom = useCallback(() => {\n const container = containerRef.current;\n if (!container) return;\n\n container.scrollTo({\n top: container.scrollHeight,\n behavior: \"smooth\",\n });\n }, [containerRef]);\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n const handleScroll = () => {\n isUserScrollingRef.current = !isNearBottom();\n };\n\n container.addEventListener(\"scroll\", handleScroll, { passive: true });\n return () => container.removeEventListener(\"scroll\", handleScroll);\n }, [containerRef, isNearBottom]);\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n const currentHeight = container.scrollHeight;\n const heightChanged = currentHeight !== lastScrollHeightRef.current;\n\n if (heightChanged) {\n lastScrollHeightRef.current = currentHeight;\n\n if (!isUserScrollingRef.current || isNearBottom()) {\n scrollToBottom();\n }\n }\n });\n\n return (\n <motion.div\n ref={containerRef}\n id={MESSAGES_CONTAINER_ID}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: styles.animations.duration }}\n className=\"crow-relative crow-flex-1 crow-min-h-0 crow-rounded-2xl crow-mb-3 crow-overflow-y-auto crow-p-4 crow-space-y-3 crow-pointer-events-auto\"\n style={{ background: styles.colors.messagesBackground }}\n >\n {children}\n </motion.div>\n );\n});\n\nMessagesContainer.displayName = \"MessagesContainer\";\n","/**\n * ConversationList - Dropdown list of past conversations\n */\n\nimport { motion } from \"framer-motion\";\nimport { X } from \"lucide-react\";\nimport type { Conversation } from \"../../types\";\nimport { formatConversationDate } from \"../../utils\";\n\ninterface ConversationListProps {\n conversations: Conversation[];\n currentConversationId: string | null;\n onSelect: (id: string) => void;\n onClose: () => void;\n}\n\nexport function ConversationList({\n conversations,\n currentConversationId,\n onSelect,\n onClose,\n}: ConversationListProps) {\n return (\n <motion.div\n initial={{ opacity: 0, height: 0 }}\n animate={{ opacity: 1, height: \"auto\" }}\n exit={{ opacity: 0, height: 0 }}\n className=\"crow-mb-3 crow-rounded-xl crow-bg-gray-50 crow-border crow-border-gray-200\"\n >\n <div className=\"crow-p-2 crow-border-b crow-border-gray-200 crow-flex crow-justify-between crow-items-center\">\n <span className=\"crow-text-sm crow-font-medium crow-text-gray-700\">\n Recent Conversations\n </span>\n <button onClick={onClose} className=\"crow-p-1 hover:crow-bg-gray-200 crow-rounded\">\n <X size={14} className=\"crow-text-gray-500\" />\n </button>\n </div>\n <div className=\"crow-max-h-[200px] crow-overflow-y-auto\">\n {conversations.length === 0 ? (\n <div className=\"crow-p-4 crow-text-center crow-text-sm crow-text-gray-500\">\n No conversations yet\n </div>\n ) : (\n conversations.map((conv) => (\n <button\n key={conv.id}\n onClick={() => onSelect(conv.id)}\n className={`crow-w-full crow-p-3 crow-text-left hover:crow-bg-gray-100 crow-transition-colors crow-border-b crow-border-gray-100 last:crow-border-0 ${\n currentConversationId === conv.id ? \"crow-bg-blue-50\" : \"\"\n }`}\n >\n <div className=\"crow-text-sm crow-font-medium crow-text-gray-800 crow-truncate\">\n {conv.name || \"Untitled conversation\"}\n </div>\n <div className=\"crow-text-xs crow-text-gray-500 crow-mt-0.5\">\n {formatConversationDate(conv.updated_at)}\n </div>\n </button>\n ))\n )}\n </div>\n </motion.div>\n );\n}\n","/**\n * WorkflowPanel - Displays active workflow with todos\n */\n\nimport { motion } from \"framer-motion\";\nimport type { ActiveWorkflow } from \"../../types\";\n\ninterface WorkflowPanelProps {\n workflow: ActiveWorkflow;\n onExit: () => void;\n}\n\nexport function WorkflowPanel({ workflow, onExit }: WorkflowPanelProps) {\n return (\n <motion.div\n initial={{ opacity: 0, y: -10 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -10 }}\n transition={{ duration: 0.3 }}\n className=\"crow-mb-3 crow-p-3 crow-rounded-xl crow-bg-gray-50 crow-border crow-border-gray-200\"\n >\n <div className=\"crow-flex crow-items-center crow-justify-between\">\n <span className=\"crow-text-sm crow-font-medium crow-text-gray-900 crow-flex crow-items-center crow-gap-1\">\n {workflow.name}\n </span>\n <button\n onClick={onExit}\n className=\"crow-text-xs crow-text-gray-500 hover:crow-text-gray-700 crow-underline\"\n >\n Exit\n </button>\n </div>\n </motion.div>\n );\n}\n","/**\n * PoweredByBadge - Branding badge at bottom\n */\n\nimport { useWidgetStyles } from \"../../context/StyleContext\";\n\ninterface PoweredByBadgeProps {\n apiUrl?: string;\n}\n\nexport function PoweredByBadge({ apiUrl = \"\" }: PoweredByBadgeProps) {\n const styles = useWidgetStyles();\n const branding = styles.branding;\n\n if (!branding.showPoweredBy) return null;\n\n // Construct full logo URL using apiUrl to ensure it works on third-party sites\n const logoUrl = branding.logoUrl?.startsWith(\"http\") \n ? branding.logoUrl \n : `${apiUrl}${branding.logoUrl}`;\n\n return (\n <div className=\"crow-flex crow-items-center crow-justify-center crow-gap-1.5 crow-mb-3 crow-text-xs crow-text-gray-400\">\n {branding.showLogo && logoUrl && (\n <img\n src={logoUrl}\n alt=\"Crow\"\n width={14}\n height={14}\n className=\"crow-opacity-50\"\n />\n )}\n <span>{branding.poweredByText}</span>\n </div>\n );\n}\n","/**\n * ModelSelector - Dropdown for selecting AI models\n */\n\nimport React, { useState, useRef, useEffect } from \"react\";\nimport { ChevronDown, Check } from \"lucide-react\";\nimport { cn } from \"../../utils\";\nimport type { Model } from \"../../types\";\n\ninterface ModelSelectorProps {\n models: Model[];\n selectedModel: string;\n onModelChange: (modelId: string) => void;\n disabled?: boolean;\n}\n\nexport const ModelSelector: React.FC<ModelSelectorProps> = ({\n models,\n selectedModel,\n onModelChange,\n disabled = false,\n}) => {\n const [isOpen, setIsOpen] = useState(false);\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n dropdownRef.current &&\n !dropdownRef.current.contains(event.target as Node)\n ) {\n setIsOpen(false);\n }\n };\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\n }, []);\n\n const selectedModelData = models.find((m) => m.id === selectedModel);\n\n const groupedModels = models.reduce((acc, model) => {\n if (!acc[model.provider]) acc[model.provider] = [];\n acc[model.provider].push(model);\n return acc;\n }, {} as Record<string, Model[]>);\n\n return (\n <div className=\"crow-relative\" ref={dropdownRef}>\n <button\n type=\"button\"\n onClick={() => !disabled && setIsOpen(!isOpen)}\n disabled={disabled}\n className={cn(\n \"crow-flex crow-items-center crow-gap-1 crow-px-2 crow-py-1 crow-rounded-md crow-text-xs\",\n \"crow-bg-transparent crow-text-gray-400\",\n \"hover:crow-text-gray-700 crow-transition-colors\",\n disabled ? \"crow-opacity-50 crow-cursor-not-allowed\" : \"crow-cursor-pointer\"\n )}\n >\n <span>{selectedModelData?.name || \"Select Model\"}</span>\n <ChevronDown\n className={cn(\n \"crow-w-3 crow-h-3 crow-transition-transform\",\n isOpen ? \"crow-rotate-180\" : \"\"\n )}\n />\n </button>\n\n {isOpen && (\n <div className=\"crow-absolute crow-bottom-full crow-mb-2 crow-left-0 crow-min-w-[180px] crow-bg-white crow-border crow-border-gray-200 crow-rounded-xl crow-shadow-lg crow-z-50 crow-overflow-hidden\">\n {Object.entries(groupedModels).map(([provider, providerModels]) => (\n <div key={provider}>\n <div className=\"crow-px-3 crow-py-1.5 crow-text-xs crow-font-medium crow-text-gray-400 crow-uppercase crow-tracking-wide crow-bg-gray-50\">\n {provider}\n </div>\n {providerModels.map((model) => (\n <button\n key={model.id}\n onClick={() => {\n onModelChange(model.id);\n setIsOpen(false);\n }}\n className={cn(\n \"crow-w-full crow-flex crow-items-center crow-justify-between crow-px-3 crow-py-1.5 crow-text-sm\",\n \"hover:crow-bg-gray-100 crow-transition-colors\",\n model.id === selectedModel ? \"crow-text-gray-900\" : \"crow-text-gray-600\"\n )}\n >\n <span>{model.name}</span>\n {model.id === selectedModel && (\n <Check className=\"crow-w-4 crow-h-4 crow-text-green-500\" />\n )}\n </button>\n ))}\n </div>\n ))}\n </div>\n )}\n </div>\n );\n};\n","/**\n * useVoiceInput - Speech-to-text via Gradium STT WebSocket\n *\n * Uses MediaRecorder API (works on all browsers including mobile Safari)\n * and streams audio to backend WebSocket proxy for Gradium STT.\n */\n\nimport { useState, useRef, useCallback, useEffect } from \"react\";\n\nexport interface UseVoiceInputOptions {\n /** Backend URL for WebSocket connection (e.g., \"ws://localhost:8000\" or \"wss://api.example.com\") */\n backendUrl: string;\n /** Auto-submit after silence. If set, stops recording after this many ms of silence. */\n silenceTimeoutMs?: number;\n}\n\nexport interface UseVoiceInputReturn {\n /** Whether the browser supports audio recording (MediaRecorder API) */\n supported: boolean;\n /** Whether currently recording */\n isRecording: boolean;\n /** Current transcript (accumulated final results) */\n transcript: string;\n /** Error message if any */\n error: string | null;\n /** Start recording */\n start: () => void;\n /** Stop recording and finalize transcript */\n stop: () => void;\n /** Toggle recording on/off */\n toggle: () => void;\n /** Clear the transcript */\n clear: () => void;\n}\n\nconst isMediaRecorderSupported = (): boolean => {\n if (typeof window === \"undefined\") return false;\n return !!(\n navigator.mediaDevices &&\n typeof navigator.mediaDevices.getUserMedia === \"function\" &&\n (window.AudioContext || (window as any).webkitAudioContext)\n );\n};\n\nexport function useVoiceInput(\n options: UseVoiceInputOptions\n): UseVoiceInputReturn {\n const { backendUrl, silenceTimeoutMs } = options;\n\n const [supported] = useState(() => isMediaRecorderSupported());\n const [isRecording, setIsRecording] = useState(false);\n const [transcript, setTranscript] = useState(\"\");\n const [error, setError] = useState<string | null>(null);\n\n const wsRef = useRef<WebSocket | null>(null);\n const streamRef = useRef<MediaStream | null>(null);\n const audioContextRef = useRef<AudioContext | null>(null);\n const processorRef = useRef<ScriptProcessorNode | null>(null);\n const silenceTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const transcriptRef = useRef(\"\"); // Accumulated final text\n const interimRef = useRef(\"\"); // Current interim text (last word being spoken)\n const isRecordingRef = useRef(false);\n\n const clearSilenceTimer = useCallback(() => {\n if (silenceTimerRef.current) {\n clearTimeout(silenceTimerRef.current);\n silenceTimerRef.current = null;\n }\n }, []);\n\n const cleanup = useCallback(() => {\n clearSilenceTimer();\n isRecordingRef.current = false;\n\n // Include any pending interim text in the final transcript\n if (interimRef.current) {\n transcriptRef.current += interimRef.current + \" \";\n setTranscript(transcriptRef.current.trim());\n interimRef.current = \"\";\n }\n\n // Close WebSocket\n if (wsRef.current) {\n try {\n if (wsRef.current.readyState === WebSocket.OPEN) {\n wsRef.current.send(JSON.stringify({ type: \"stop\" }));\n }\n wsRef.current.close();\n } catch (e) {\n // Ignore cleanup errors\n }\n wsRef.current = null;\n }\n\n // Disconnect audio processor\n if (processorRef.current) {\n processorRef.current.disconnect();\n processorRef.current = null;\n }\n\n // Close audio context\n if (audioContextRef.current) {\n audioContextRef.current.close();\n audioContextRef.current = null;\n }\n\n // Stop media stream\n if (streamRef.current) {\n streamRef.current.getTracks().forEach((track) => track.stop());\n streamRef.current = null;\n }\n\n setIsRecording(false);\n }, [clearSilenceTimer]);\n\n const stop = useCallback(() => {\n cleanup();\n }, [cleanup]);\n\n const clear = useCallback(() => {\n setTranscript(\"\");\n transcriptRef.current = \"\";\n setError(null);\n }, []);\n\n const startAudioCapture = useCallback(() => {\n if (!streamRef.current || !wsRef.current) return;\n\n audioContextRef.current = new (window.AudioContext ||\n (window as any).webkitAudioContext)({ sampleRate: 24000 });\n const source = audioContextRef.current.createMediaStreamSource(\n streamRef.current\n );\n processorRef.current = audioContextRef.current.createScriptProcessor(\n 4096,\n 1,\n 1\n );\n\n processorRef.current.onaudioprocess = (event) => {\n if (\n !isRecordingRef.current ||\n !wsRef.current ||\n wsRef.current.readyState !== WebSocket.OPEN\n ) {\n return;\n }\n\n const inputData = event.inputBuffer.getChannelData(0);\n const pcm16 = new Int16Array(inputData.length);\n\n for (let i = 0; i < inputData.length; i++) {\n const s = Math.max(-1, Math.min(1, inputData[i]));\n pcm16[i] = s < 0 ? s * 0x8000 : s * 0x7fff;\n }\n\n const bytes = new Uint8Array(pcm16.buffer);\n let binary = \"\";\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n\n wsRef.current.send(\n JSON.stringify({ type: \"audio\", data: btoa(binary) })\n );\n };\n\n source.connect(processorRef.current);\n processorRef.current.connect(audioContextRef.current.destination);\n }, []);\n\n const start = useCallback(async () => {\n if (!supported) {\n setError(\"Audio recording not supported in this browser\");\n return;\n }\n\n // Reset state\n setError(null);\n transcriptRef.current = \"\";\n setTranscript(\"\");\n\n try {\n // Get microphone access\n streamRef.current = await navigator.mediaDevices.getUserMedia({\n audio: {\n echoCancellation: true,\n noiseSuppression: true,\n sampleRate: 24000,\n },\n });\n\n // Build WebSocket URL\n const wsProtocol = backendUrl.startsWith(\"https\") ? \"wss\" : \"ws\";\n const wsHost = backendUrl.replace(/^https?:\\/\\//, \"\");\n const wsUrl = `${wsProtocol}://${wsHost}/api/stt/stream`;\n\n // Connect to backend\n wsRef.current = new WebSocket(wsUrl);\n\n wsRef.current.onopen = () => {\n wsRef.current?.send(JSON.stringify({ type: \"setup\" }));\n };\n\n wsRef.current.onmessage = (event) => {\n const msg = JSON.parse(event.data);\n\n if (msg.type === \"ready\") {\n startAudioCapture();\n isRecordingRef.current = true;\n setIsRecording(true);\n } else if (msg.type === \"transcript\") {\n if (msg.is_final && msg.text) {\n // Final result - add to transcript and clear interim\n transcriptRef.current += msg.text + \" \";\n interimRef.current = \"\";\n setTranscript(transcriptRef.current.trim());\n\n // Reset silence timer on new final transcript\n if (silenceTimeoutMs) {\n clearSilenceTimer();\n silenceTimerRef.current = setTimeout(() => {\n stop();\n }, silenceTimeoutMs);\n }\n } else if (!msg.is_final && msg.text) {\n // Interim result - track it so we can include it if stopped early\n interimRef.current = msg.text;\n // Show interim in UI\n setTranscript((transcriptRef.current + msg.text).trim());\n }\n } else if (msg.type === \"error\") {\n setError(msg.message || \"STT error\");\n cleanup();\n }\n };\n\n wsRef.current.onerror = () => {\n setError(\"WebSocket connection error\");\n cleanup();\n };\n\n wsRef.current.onclose = () => {\n if (isRecordingRef.current) {\n // Unexpected close\n cleanup();\n }\n };\n } catch (err) {\n setError(\n err instanceof Error ? err.message : \"Failed to start recording\"\n );\n cleanup();\n }\n }, [\n supported,\n backendUrl,\n startAudioCapture,\n silenceTimeoutMs,\n clearSilenceTimer,\n stop,\n cleanup,\n ]);\n\n const toggle = useCallback(() => {\n if (isRecording) {\n stop();\n } else {\n start();\n }\n }, [isRecording, start, stop]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n cleanup();\n };\n }, [cleanup]);\n\n return {\n supported,\n isRecording,\n transcript,\n error,\n start,\n stop,\n toggle,\n clear,\n };\n}\n","/**\n * PromptInputBox - Main input component for user messages\n */\n\nimport React from \"react\";\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\";\nimport { ArrowUp, Square, Mic } from \"lucide-react\";\nimport { ModelSelector } from \"./ModelSelector\";\nimport { useVoiceInput } from \"../../hooks/useVoiceInput\";\nimport { cn } from \"../../utils\";\nimport type { Model } from \"../../types\";\n\n// Textarea Component\ninterface TextareaProps\n extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {\n className?: string;\n}\n\nconst Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(\n ({ className, ...props }, ref) => (\n <textarea\n className={cn(\n \"crow-flex crow-w-full crow-rounded-md crow-border-none crow-bg-transparent crow-px-3 crow-py-1.5 crow-text-base crow-text-gray-900 placeholder:crow-text-gray-500 focus-visible:crow-outline-none focus-visible:crow-ring-0 disabled:crow-cursor-not-allowed disabled:crow-opacity-50 crow-min-h-[32px] crow-resize-none\",\n className,\n )}\n ref={ref}\n rows={1}\n {...props}\n />\n ),\n);\nTextarea.displayName = \"Textarea\";\n\n// Tooltip Components\nconst TooltipProvider = TooltipPrimitive.Provider;\nconst Tooltip = TooltipPrimitive.Root;\nconst TooltipTrigger = TooltipPrimitive.Trigger;\n\nconst TooltipContent = React.forwardRef<\n React.ElementRef<typeof TooltipPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <TooltipPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n \"crow-z-50 crow-overflow-hidden crow-rounded-md crow-border crow-border-gray-300 crow-bg-white crow-text-gray-900 crow-px-3 crow-py-1.5 crow-text-sm crow-shadow-md\",\n className,\n )}\n {...props}\n />\n));\nTooltipContent.displayName = \"TooltipContent\";\n\n// Button Component\ninterface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: \"default\" | \"outline\" | \"ghost\";\n size?: \"default\" | \"sm\" | \"lg\" | \"icon\";\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant = \"default\", size = \"default\", ...props }, ref) => {\n const variantClasses = {\n default: \"crow-bg-black hover:crow-bg-gray-800 crow-text-white\",\n outline: \"crow-border crow-bg-transparent hover:crow-bg-gray-100\",\n ghost: \"crow-bg-transparent hover:crow-bg-gray-100\",\n };\n const sizeClasses = {\n default: \"crow-h-10 crow-px-4 crow-py-2\",\n sm: \"crow-h-8 crow-px-3 crow-text-sm\",\n lg: \"crow-h-12 crow-px-6\",\n icon: \"crow-h-8 crow-w-8 crow-rounded-full\",\n };\n return (\n <button\n className={cn(\n \"crow-inline-flex crow-items-center crow-justify-center crow-font-medium crow-transition-colors focus-visible:crow-outline-none disabled:crow-pointer-events-none disabled:crow-opacity-50\",\n variantClasses[variant],\n sizeClasses[size],\n className,\n )}\n ref={ref}\n {...props}\n />\n );\n },\n);\nButton.displayName = \"Button\";\n\n// PromptInput Context\ninterface PromptInputContextType {\n isLoading: boolean;\n value: string;\n setValue: (value: string) => void;\n maxHeight: number | string;\n onSubmit?: () => void;\n disabled?: boolean;\n}\n\nconst PromptInputContext = React.createContext<PromptInputContextType>({\n isLoading: false,\n value: \"\",\n setValue: () => {},\n maxHeight: 240,\n onSubmit: undefined,\n disabled: false,\n});\n\nfunction usePromptInput() {\n const context = React.useContext(PromptInputContext);\n if (!context) {\n throw new Error(\"usePromptInput must be used within a PromptInput\");\n }\n return context;\n}\n\n// PromptInput Container\ninterface PromptInputProps {\n isLoading?: boolean;\n value?: string;\n onValueChange?: (value: string) => void;\n maxHeight?: number | string;\n onSubmit?: () => void;\n children: React.ReactNode;\n className?: string;\n disabled?: boolean;\n style?: React.CSSProperties;\n}\n\nconst PromptInput = React.forwardRef<HTMLDivElement, PromptInputProps>(\n (\n {\n className,\n isLoading = false,\n maxHeight = 240,\n value,\n onValueChange,\n onSubmit,\n children,\n disabled = false,\n style,\n },\n ref,\n ) => {\n const [internalValue, setInternalValue] = React.useState(value || \"\");\n\n const handleChange = (newValue: string) => {\n setInternalValue(newValue);\n onValueChange?.(newValue);\n };\n\n return (\n <TooltipProvider>\n <PromptInputContext.Provider\n value={{\n isLoading,\n value: value ?? internalValue,\n setValue: onValueChange ?? handleChange,\n maxHeight,\n onSubmit,\n disabled,\n }}\n >\n <div\n ref={ref}\n className={cn(\n \"crow-rounded-3xl crow-border crow-border-gray-300 crow-bg-white crow-p-1.5 crow-shadow-lg crow-transition-all crow-duration-300\",\n isLoading && \"crow-border-red-500\",\n className,\n )}\n style={style}\n >\n {children}\n </div>\n </PromptInputContext.Provider>\n </TooltipProvider>\n );\n },\n);\nPromptInput.displayName = \"PromptInput\";\n\n// PromptInput Textarea\ninterface PromptInputTextareaProps {\n disableAutosize?: boolean;\n placeholder?: string;\n}\n\nconst PromptInputTextarea: React.FC<\n PromptInputTextareaProps & React.ComponentProps<typeof Textarea>\n> = ({\n className,\n onKeyDown,\n disableAutosize = false,\n placeholder,\n ...props\n}) => {\n const { value, setValue, maxHeight, onSubmit, disabled } = usePromptInput();\n const textareaRef = React.useRef<HTMLTextAreaElement>(null);\n\n React.useEffect(() => {\n if (disableAutosize || !textareaRef.current) return;\n textareaRef.current.style.height = \"auto\";\n textareaRef.current.style.height =\n typeof maxHeight === \"number\"\n ? `${Math.min(textareaRef.current.scrollHeight, maxHeight)}px`\n : `min(${textareaRef.current.scrollHeight}px, ${maxHeight})`;\n }, [value, maxHeight, disableAutosize]);\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n onSubmit?.();\n }\n onKeyDown?.(e);\n };\n\n return (\n <Textarea\n ref={textareaRef}\n value={value}\n onChange={(e) => setValue(e.target.value)}\n onKeyDown={handleKeyDown}\n className={cn(\"text-base\", className)}\n disabled={disabled}\n placeholder={placeholder}\n {...props}\n />\n );\n};\n\n// PromptInput Actions Container\ninterface PromptInputActionsProps\n extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst PromptInputActions: React.FC<PromptInputActionsProps> = ({\n children,\n className,\n ...props\n}) => (\n <div\n className={cn(\"crow-flex crow-items-center crow-gap-2\", className)}\n {...props}\n >\n {children}\n </div>\n);\n\n// PromptInput Action with Tooltip\ninterface PromptInputActionProps extends React.ComponentProps<typeof Tooltip> {\n tooltip: React.ReactNode;\n children: React.ReactNode;\n side?: \"top\" | \"bottom\" | \"left\" | \"right\";\n}\n\nconst PromptInputAction: React.FC<PromptInputActionProps> = ({\n tooltip,\n children,\n side = \"top\",\n ...props\n}) => {\n return (\n <Tooltip {...props}>\n <TooltipTrigger asChild>{children}</TooltipTrigger>\n <TooltipContent side={side}>{tooltip}</TooltipContent>\n </Tooltip>\n );\n};\n\n// Main PromptInputBox Component\ninterface PromptInputBoxProps {\n onSend?: (message: string) => void;\n onStop?: () => void;\n isLoading?: boolean;\n /** Show stop button even when not loading (e.g., during ask_user prompts) */\n showStopButton?: boolean;\n placeholder?: string;\n className?: string;\n selectedModel?: string;\n onModelChange?: (model: string) => void;\n availableModels?: Model[];\n /** When true, adds a pulsing highlight effect to indicate user input is needed */\n highlighted?: boolean;\n /** Backend URL for voice input WebSocket (required for voice input to work) */\n backendUrl?: string;\n /** When this value changes (and is > 0), start voice recording */\n triggerVoiceRecording?: number;\n}\n\nexport const PromptInputBox = React.forwardRef<\n HTMLDivElement,\n PromptInputBoxProps\n>(\n (\n {\n onSend = () => {},\n onStop,\n isLoading = false,\n showStopButton = false,\n placeholder = \"Type your message here...\",\n className,\n selectedModel = \"gpt-4o\",\n onModelChange,\n availableModels = [],\n highlighted = false,\n backendUrl = \"\",\n triggerVoiceRecording = 0,\n },\n ref,\n ) => {\n const [input, setInput] = React.useState(\"\");\n const promptBoxRef = React.useRef<HTMLDivElement>(null);\n // Auto-send after 1.5 seconds of silence\n const voice = useVoiceInput({ backendUrl, silenceTimeoutMs: 1500 });\n\n // Start recording when triggerVoiceRecording changes\n const lastTriggerRef = React.useRef(0);\n const voiceRef = React.useRef(voice);\n voiceRef.current = voice;\n React.useEffect(() => {\n if (triggerVoiceRecording > 0 && triggerVoiceRecording !== lastTriggerRef.current) {\n console.log('[Voice] Auto-starting recording from trigger');\n voiceRef.current.start();\n }\n lastTriggerRef.current = triggerVoiceRecording;\n }, [triggerVoiceRecording]);\n\n // Sync voice transcript into the input field while recording\n React.useEffect(() => {\n if (voice.isRecording && voice.transcript) {\n setInput(voice.transcript);\n }\n }, [voice.isRecording, voice.transcript]);\n\n // When recording stops and there's a transcript, auto-send the message\n const wasRecordingRef = React.useRef(false);\n React.useEffect(() => {\n if (wasRecordingRef.current && !voice.isRecording && voice.transcript) {\n // Auto-send the voice message\n const messageToSend = voice.transcript.trim();\n if (messageToSend) {\n console.log('[Voice] Auto-sending:', messageToSend);\n onSend(messageToSend);\n setInput(\"\");\n }\n voice.clear();\n }\n wasRecordingRef.current = voice.isRecording;\n }, [voice.isRecording, voice.transcript, voice.clear, onSend]);\n\n const handleSubmit = () => {\n if (input.trim()) {\n // Stop recording if active\n if (voice.isRecording) {\n voice.stop();\n }\n onSend(input);\n setInput(\"\");\n }\n };\n\n const hasContent = input.trim() !== \"\";\n\n return (\n <PromptInput\n value={input}\n onValueChange={setInput}\n isLoading={isLoading}\n onSubmit={handleSubmit}\n className={cn(\n \"crow-w-full crow-shadow-lg crow-transition-all crow-duration-300 crow-ease-in-out\",\n highlighted && \"crow-ring-4 crow-ring-offset-2 crow-animate-pulse crow-shadow-[0_0_20px_rgba(0,0,0,0.25)]\",\n className,\n )}\n style={highlighted ? {\n '--tw-ring-color': 'var(--crow-user-bubble, #000)',\n '--tw-ring-offset-color': 'var(--crow-background, #fff)',\n } as React.CSSProperties : undefined}\n disabled={isLoading}\n ref={ref || promptBoxRef}\n >\n <div className=\"crow-transition-all crow-duration-300 crow-opacity-100\">\n <PromptInputTextarea\n placeholder={placeholder}\n className=\"crow-text-base\"\n />\n </div>\n\n <PromptInputActions className=\"crow-flex crow-items-center crow-justify-between crow-gap-2 crow-p-0 crow-pt-1\">\n {/* Model Selector - Left side */}\n <div className=\"crow-flex crow-items-center\">\n {availableModels.length > 0 && onModelChange && (\n <ModelSelector\n models={availableModels}\n selectedModel={selectedModel}\n onModelChange={onModelChange}\n disabled={isLoading}\n />\n )}\n </div>\n\n {/* Voice + Send/Stop Buttons - Right side */}\n <div className=\"crow-flex crow-items-center crow-gap-1\">\n {/* Mic button — shown when: voice supported, not loading, no content typed */}\n {voice.supported && !isLoading && !showStopButton && (\n <PromptInputAction\n tooltip={voice.isRecording ? \"Stop recording\" : \"Voice input\"}\n >\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className={cn(\n \"crow-h-7 crow-w-7 crow-rounded-full crow-transition-all crow-duration-200\",\n voice.isRecording && \"crow-bg-red-100 hover:crow-bg-red-200\",\n )}\n onClick={voice.toggle}\n >\n <Mic\n className={cn(\n \"crow-h-3.5 crow-w-3.5 crow-transition-colors\",\n voice.isRecording ? \"crow-text-red-500\" : \"crow-text-gray-400\",\n )}\n />\n {voice.isRecording && (\n <span className=\"crow-absolute crow-top-0 crow-right-0 crow-h-2 crow-w-2 crow-rounded-full crow-bg-red-500 crow-animate-pulse\" />\n )}\n </Button>\n </PromptInputAction>\n )}\n\n {/* Send / Stop button */}\n <PromptInputAction\n tooltip={\n isLoading || showStopButton\n ? \"Stop generation\"\n : hasContent\n ? \"Send message\"\n : \"Type a message\"\n }\n >\n <Button\n variant=\"default\"\n size=\"icon\"\n className={cn(\n \"crow-h-7 crow-w-7 crow-rounded-full crow-transition-all crow-duration-200\",\n (isLoading || showStopButton) && \"crow-bg-red-500 hover:crow-bg-red-500\",\n hasContent &&\n !isLoading &&\n !showStopButton &&\n \"crow-bg-black hover:crow-bg-gray-800\",\n !hasContent && !isLoading && !showStopButton && \"crow-bg-transparent\",\n )}\n onClick={() => {\n if ((isLoading || showStopButton) && onStop) {\n onStop();\n } else if (hasContent) {\n handleSubmit();\n }\n }}\n >\n {isLoading || showStopButton ? (\n <Square\n className=\"crow-h-3.5 crow-w-3.5 crow-text-white\"\n style={{ fill: \"white\" }}\n />\n ) : (\n <ArrowUp\n className={cn(\n \"crow-h-3.5 crow-w-3.5\",\n hasContent ? \"crow-text-white\" : \"crow-text-gray-400\",\n )}\n />\n )}\n </Button>\n </PromptInputAction>\n </div>\n </PromptInputActions>\n </PromptInput>\n );\n },\n);\n\nPromptInputBox.displayName = \"PromptInputBox\";\n","/**\n * BrowserUseConfirmation - Confirmation card for browser automation\n * \n * Shown when the browser agent wants to start automation, asking user permission.\n */\n\nimport { useWidgetStyles } from \"../../context/StyleContext\";\n\ninterface BrowserUseConfirmationProps {\n instruction: string;\n onAllow: () => void;\n onDeny: () => void;\n}\n\nexport function BrowserUseConfirmation({\n instruction,\n onAllow,\n onDeny,\n}: BrowserUseConfirmationProps) {\n const styles = useWidgetStyles();\n\n return (\n <div\n className=\"crow-flex crow-flex-col crow-items-start crow-w-full crow-max-w-[90%]\"\n >\n <div\n className=\"crow-rounded-2xl crow-px-4 crow-py-3 crow-w-full crow-border\"\n style={{\n background: styles.colors.botBubble,\n borderColor: styles.colors.primary,\n }}\n >\n {/* Header */}\n <div className=\"crow-flex crow-items-center crow-gap-2 crow-mb-2\">\n <span className=\"crow-text-lg\">🖱️</span>\n <span\n className=\"crow-font-medium crow-text-sm\"\n style={{ color: styles.colors.primary }}\n >\n Browser Agent\n </span>\n </div>\n\n {/* Title */}\n <p\n className=\"crow-text-sm crow-font-medium crow-mb-2\"\n style={{ color: styles.colors.botText }}\n >\n Wants to automate your browser:\n </p>\n\n {/* Instruction */}\n <p\n className=\"crow-text-sm crow-mb-4 crow-bg-black/5 crow-rounded crow-p-2 crow-italic\"\n style={{ color: styles.colors.botText }}\n >\n \"{instruction}\"\n </p>\n\n {/* Actions */}\n <div className=\"crow-flex crow-gap-2 crow-justify-end\">\n <button\n onClick={onDeny}\n className=\"crow-px-4 crow-py-1.5 crow-rounded-lg crow-text-sm crow-font-medium crow-transition-colors hover:crow-opacity-80\"\n style={{\n background: \"transparent\",\n color: styles.colors.botText,\n border: `1px solid ${styles.colors.border}`,\n }}\n >\n Deny\n </button>\n <button\n onClick={onAllow}\n className=\"crow-px-4 crow-py-1.5 crow-rounded-lg crow-text-sm crow-font-medium crow-transition-colors hover:crow-opacity-90\"\n style={{\n background: styles.colors.primary,\n color: \"#fff\",\n }}\n >\n Allow\n </button>\n </div>\n </div>\n </div>\n );\n}\n","/**\n * BrowserUseQuestion - Question message from browser agent\n * \n * Shown when the browser agent needs user input/clarification during automation.\n */\n\nimport { useState, useCallback, type KeyboardEvent } from \"react\";\nimport { useWidgetStyles } from \"../../context/StyleContext\";\n\ninterface BrowserUseQuestionProps {\n question: string;\n onSubmit: (answer: string) => void;\n}\n\nexport function BrowserUseQuestion({\n question,\n onSubmit,\n}: BrowserUseQuestionProps) {\n const styles = useWidgetStyles();\n const [answer, setAnswer] = useState(\"\");\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n const handleSubmit = useCallback(() => {\n if (answer.trim() && !isSubmitting) {\n setIsSubmitting(true);\n onSubmit(answer.trim());\n }\n }, [answer, isSubmitting, onSubmit]);\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n handleSubmit();\n }\n },\n [handleSubmit]\n );\n\n return (\n <div className=\"crow-flex crow-flex-col crow-items-start crow-w-full crow-max-w-[90%]\">\n <div\n className=\"crow-rounded-2xl crow-px-4 crow-py-3 crow-w-full crow-border\"\n style={{\n background: styles.colors.botBubble,\n borderColor: styles.colors.primary,\n }}\n >\n {/* Header */}\n <div className=\"crow-flex crow-items-center crow-gap-2 crow-mb-2\">\n <span className=\"crow-text-lg\">🤖</span>\n <span\n className=\"crow-font-medium crow-text-sm\"\n style={{ color: styles.colors.primary }}\n >\n Browser Agent asks:\n </span>\n </div>\n\n {/* Question */}\n <p\n className=\"crow-text-sm crow-mb-3\"\n style={{ color: styles.colors.botText }}\n >\n {question}\n </p>\n\n {/* Input and Submit */}\n <div className=\"crow-flex crow-gap-2\">\n <input\n type=\"text\"\n value={answer}\n onChange={(e) => setAnswer(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder=\"Type your response...\"\n disabled={isSubmitting}\n className=\"crow-flex-1 crow-px-3 crow-py-2 crow-rounded-lg crow-text-sm crow-border crow-outline-none focus:crow-ring-2 disabled:crow-opacity-50\"\n style={{\n background: styles.colors.background,\n color: styles.colors.text,\n borderColor: styles.colors.border,\n }}\n autoFocus\n />\n <button\n onClick={handleSubmit}\n disabled={!answer.trim() || isSubmitting}\n className=\"crow-px-4 crow-py-2 crow-rounded-lg crow-text-sm crow-font-medium crow-transition-colors hover:crow-opacity-90 disabled:crow-opacity-50 disabled:crow-cursor-not-allowed\"\n style={{\n background: styles.colors.primary,\n color: \"#fff\",\n }}\n >\n {isSubmitting ? \"Sending...\" : \"Send\"}\n </button>\n </div>\n </div>\n </div>\n );\n}\n","/**\n * SuggestedActions - Horizontal row of clickable action chips\n */\n\nimport type { SuggestedAction } from \"@usecrow/client\";\nimport { useWidgetStyles } from \"../../context/StyleContext\";\n\ninterface SuggestedActionsProps {\n actions: SuggestedAction[];\n onActionClick: (action: SuggestedAction) => void;\n}\n\nexport function SuggestedActions({\n actions,\n onActionClick,\n}: SuggestedActionsProps) {\n const styles = useWidgetStyles();\n\n return (\n <div className=\"crow-flex crow-flex-wrap crow-gap-2 crow-px-1 crow-pb-2\">\n {actions.map((action, idx) => (\n <button\n key={idx}\n onClick={() => onActionClick(action)}\n className=\"crow-rounded-full crow-border crow-px-3 crow-py-1.5 crow-text-sm crow-font-medium crow-transition-colors hover:crow-opacity-80 crow-cursor-pointer\"\n style={{\n borderColor: styles.colors.primary,\n color: styles.colors.primary,\n background: \"transparent\",\n }}\n >\n {action.label}\n </button>\n ))}\n </div>\n );\n}\n","/**\n * CSS Custom Properties Utility\n * \n * Converts the nested style configuration to CSS custom properties (variables).\n * These variables are applied to the widget root element and consumed by\n * component-specific CSS classes.\n */\n\nimport type { ResolvedWidgetStyles } from './types';\n\n/**\n * CSS variable names used by the widget.\n * Components reference these via var(--crow-*) in CSS.\n */\nexport const CSS_VAR_NAMES = {\n // Colors\n colors: {\n primary: '--crow-colors-primary',\n background: '--crow-colors-background',\n border: '--crow-colors-border',\n text: '--crow-colors-text',\n botBubble: '--crow-colors-bot-bubble',\n botText: '--crow-colors-bot-text',\n userBubble: '--crow-colors-user-bubble',\n userText: '--crow-colors-user-text',\n userBorder: '--crow-colors-user-border',\n messagesBackground: '--crow-colors-messages-background',\n bubbleBackground: '--crow-colors-bubble-background',\n bubbleBorder: '--crow-colors-bubble-border',\n bubbleIcon: '--crow-colors-bubble-icon',\n },\n // Dimensions\n dimensions: {\n width: '--crow-dimensions-width',\n maxHeight: '--crow-dimensions-max-height',\n messagesMaxHeight: '--crow-dimensions-messages-max-height',\n borderRadius: '--crow-dimensions-border-radius',\n padding: '--crow-dimensions-padding',\n },\n // Typography\n typography: {\n fontFamily: '--crow-typography-font-family',\n fontSize: '--crow-typography-font-size',\n headerFontSize: '--crow-typography-header-font-size',\n fontWeight: '--crow-typography-font-weight',\n lineHeight: '--crow-typography-line-height',\n letterSpacing: '--crow-typography-letter-spacing',\n },\n // Position\n position: {\n right: '--crow-position-right',\n bottom: '--crow-position-bottom',\n bubbleRight: '--crow-position-bubble-right',\n bubbleBottom: '--crow-position-bubble-bottom',\n },\n // Bubble\n bubble: {\n size: '--crow-bubble-size',\n iconSize: '--crow-bubble-icon-size',\n },\n // Shadows\n shadows: {\n widget: '--crow-shadows-widget',\n bubble: '--crow-shadows-bubble',\n },\n // Animations\n animations: {\n duration: '--crow-animations-duration',\n },\n} as const;\n\n/**\n * Convert a resolved widget style configuration to CSS custom properties.\n * \n * @param styles - The fully resolved widget styles (with all defaults applied)\n * @returns An object of CSS variable name to value, suitable for use as React inline styles\n * \n * @example\n * const cssVars = stylesToCssVars(resolvedStyles);\n * // Returns: { '--crow-colors-background': 'rgba(255,255,255,0.95)', ... }\n * <div style={cssVars}>...</div>\n */\nexport function stylesToCssVars(styles: ResolvedWidgetStyles): Record<string, string> {\n const vars: Record<string, string> = {};\n\n // Colors\n vars[CSS_VAR_NAMES.colors.primary] = styles.colors.primary;\n vars[CSS_VAR_NAMES.colors.background] = styles.colors.background;\n vars[CSS_VAR_NAMES.colors.border] = styles.colors.border;\n vars[CSS_VAR_NAMES.colors.text] = styles.colors.text;\n vars[CSS_VAR_NAMES.colors.botBubble] = styles.colors.botBubble;\n vars[CSS_VAR_NAMES.colors.botText] = styles.colors.botText;\n vars[CSS_VAR_NAMES.colors.userBubble] = styles.colors.userBubble;\n vars[CSS_VAR_NAMES.colors.userText] = styles.colors.userText;\n vars[CSS_VAR_NAMES.colors.userBorder] = styles.colors.userBorder;\n vars[CSS_VAR_NAMES.colors.messagesBackground] = styles.colors.messagesBackground;\n vars[CSS_VAR_NAMES.colors.bubbleBackground] = styles.colors.bubbleBackground;\n vars[CSS_VAR_NAMES.colors.bubbleBorder] = styles.colors.bubbleBorder;\n vars[CSS_VAR_NAMES.colors.bubbleIcon] = styles.colors.bubbleIcon;\n\n // Dimensions (add 'px' suffix for numeric values)\n vars[CSS_VAR_NAMES.dimensions.width] = `${styles.dimensions.width}px`;\n vars[CSS_VAR_NAMES.dimensions.maxHeight] = `${styles.dimensions.maxHeight}px`;\n vars[CSS_VAR_NAMES.dimensions.messagesMaxHeight] = `${styles.dimensions.messagesMaxHeight}px`;\n vars[CSS_VAR_NAMES.dimensions.borderRadius] = `${styles.dimensions.borderRadius}px`;\n vars[CSS_VAR_NAMES.dimensions.padding] = `${styles.dimensions.padding}px`;\n\n // Typography\n vars[CSS_VAR_NAMES.typography.fontFamily] = styles.typography.fontFamily;\n vars[CSS_VAR_NAMES.typography.fontSize] = `${styles.typography.fontSize}px`;\n vars[CSS_VAR_NAMES.typography.headerFontSize] = `${styles.typography.headerFontSize}px`;\n vars[CSS_VAR_NAMES.typography.fontWeight] = String(styles.typography.fontWeight);\n vars[CSS_VAR_NAMES.typography.lineHeight] = String(styles.typography.lineHeight);\n vars[CSS_VAR_NAMES.typography.letterSpacing] = `${styles.typography.letterSpacing}px`;\n\n // Position\n vars[CSS_VAR_NAMES.position.right] = `${styles.position.right}px`;\n vars[CSS_VAR_NAMES.position.bottom] = `${styles.position.bottom}px`;\n vars[CSS_VAR_NAMES.position.bubbleRight] = `${styles.position.bubbleRight}px`;\n vars[CSS_VAR_NAMES.position.bubbleBottom] = `${styles.position.bubbleBottom}px`;\n\n // Bubble\n vars[CSS_VAR_NAMES.bubble.size] = `${styles.bubble.size}px`;\n vars[CSS_VAR_NAMES.bubble.iconSize] = `${styles.bubble.iconSize}px`;\n\n // Shadows (already CSS strings)\n vars[CSS_VAR_NAMES.shadows.widget] = styles.shadows.widget;\n vars[CSS_VAR_NAMES.shadows.bubble] = styles.shadows.bubble;\n\n // Animations\n vars[CSS_VAR_NAMES.animations.duration] = `${styles.animations.duration}s`;\n\n return vars;\n}\n\n/**\n * Get a specific CSS variable value from the widget root element.\n * Useful for JavaScript that needs to read current style values.\n * \n * @param varName - The CSS variable name (e.g., '--crow-colors-primary')\n * @param element - The element to read from (defaults to document.documentElement)\n * @returns The computed value of the CSS variable\n */\nexport function getCssVar(varName: string, element: Element = document.documentElement): string {\n return getComputedStyle(element).getPropertyValue(varName).trim();\n}\n","/**\n * CSS Styles for Crow Widget\n * \n * Exports the compiled CSS as a string for Shadow DOM injection.\n * Auto-injection is disabled to prevent CSS leaking to host pages.\n * \n * DO NOT EDIT THE CSS_CONTENT - Generated by scripts/inject-css.js\n */\n\nconst STYLE_ID = 'crow-ui-styles';\nconst BODY_STYLE_ID = 'crow-copilot-body-styles';\n\n/**\n * Body-related CSS for copilot push effect\n * These styles MUST be injected into document.head (not Shadow DOM)\n * because they need to affect the body element outside the shadow boundary.\n */\nexport const COPILOT_BODY_CSS = `\n/* Crow Copilot - Body push effect */\nbody.crow-copilot-open-right {\n margin-right: var(--crow-copilot-width, 400px) !important;\n transition: margin 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\nbody.crow-copilot-open-left {\n margin-left: var(--crow-copilot-width, 400px) !important;\n transition: margin 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\nbody {\n transition: margin 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n}\n`;\n\n/**\n * Inject copilot body styles into document.head\n * Call this when using CrowCopilot with variant=\"floating\"\n */\nexport function injectCopilotBodyStyles(): void {\n if (typeof document === 'undefined') return;\n if (document.getElementById(BODY_STYLE_ID)) return;\n \n const style = document.createElement('style');\n style.id = BODY_STYLE_ID;\n style.textContent = COPILOT_BODY_CSS;\n document.head.appendChild(style);\n}\n\n/**\n * Compiled CSS content including Tailwind utilities with crow- prefix\n * This should be injected into the Shadow DOM, not document.head\n */\nexport const WIDGET_CSS = `*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }\n\n/*! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:\"\"}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.crow-pointer-events-none{pointer-events:none}.crow-pointer-events-auto{pointer-events:auto}.crow-fixed{position:fixed}.crow-absolute{position:absolute}.crow-relative{position:relative}.crow-sticky{position:sticky}.crow-bottom-0{bottom:0}.crow-bottom-full{bottom:100%}.crow-left-0{left:0}.crow-right-0{right:0}.crow-top-0{top:0}.crow-z-50{z-index:50}.crow-z-\\\\[999999\\\\]{z-index:999999}.crow-m-0{margin:0}.crow-mx-3{margin-left:.75rem;margin-right:.75rem}.crow-my-1{margin-top:.25rem;margin-bottom:.25rem}.crow-my-1\\\\.5{margin-top:.375rem;margin-bottom:.375rem}.crow-my-2{margin-top:.5rem;margin-bottom:.5rem}.crow-mb-0{margin-bottom:0}.crow-mb-0\\\\.5{margin-bottom:.125rem}.crow-mb-1{margin-bottom:.25rem}.crow-mb-1\\\\.5{margin-bottom:.375rem}.crow-mb-2{margin-bottom:.5rem}.crow-mb-3{margin-bottom:.75rem}.crow-mb-4{margin-bottom:1rem}.crow-ml-0{margin-left:0}.crow-ml-0\\\\.5{margin-left:.125rem}.crow-ml-2{margin-left:.5rem}.crow-ml-4{margin-left:1rem}.crow-mt-0{margin-top:0}.crow-mt-0\\\\.5{margin-top:.125rem}.crow-mt-1{margin-top:.25rem}.crow-mt-1\\\\.5{margin-top:.375rem}.crow-mt-2{margin-top:.5rem}.crow-mt-auto{margin-top:auto}.crow-block{display:block}.crow-inline-block{display:inline-block}.crow-flex{display:flex}.crow-inline-flex{display:inline-flex}.crow-h-10{height:2.5rem}.crow-h-12{height:3rem}.crow-h-2{height:.5rem}.crow-h-3{height:.75rem}.crow-h-3\\\\.5{height:.875rem}.crow-h-4{height:1rem}.crow-h-7{height:1.75rem}.crow-h-8{height:2rem}.crow-h-full{height:100%}.crow-max-h-32{max-height:8rem}.crow-max-h-\\\\[200px\\\\]{max-height:200px}.crow-min-h-0{min-height:0}.crow-min-h-\\\\[32px\\\\]{min-height:32px}.crow-min-h-\\\\[40px\\\\]{min-height:40px}.crow-w-0{width:0}.crow-w-0\\\\.5{width:.125rem}.crow-w-2{width:.5rem}.crow-w-3{width:.75rem}.crow-w-3\\\\.5{width:.875rem}.crow-w-4{width:1rem}.crow-w-7{width:1.75rem}.crow-w-8{width:2rem}.crow-w-full{width:100%}.crow-min-w-0{min-width:0}.crow-min-w-\\\\[180px\\\\]{min-width:180px}.crow-max-w-\\\\[80\\\\%\\\\]{max-width:80%}.crow-max-w-\\\\[90\\\\%\\\\]{max-width:90%}.crow-max-w-full{max-width:100%}.crow-flex-1{flex:1 1 0%}.crow-flex-shrink-0,.crow-shrink-0{flex-shrink:0}.crow-rotate-180{--tw-rotate:180deg}.crow-rotate-180,.crow-scale-100{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.crow-scale-100{--tw-scale-x:1;--tw-scale-y:1}.crow-scale-110{--tw-scale-x:1.1;--tw-scale-y:1.1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.crow-animate-fade-in{animation:crow-fadeIn .2s ease-out}.crow-animate-pulse{animation:crow-pulse 2s cubic-bezier(.4,0,.6,1) infinite}.crow-animate-slide-up{animation:crow-slideUp .3s ease-out}@keyframes crow-spin{to{transform:rotate(1turn)}}.crow-animate-spin{animation:crow-spin 1s linear infinite}.crow-cursor-default{cursor:default}.crow-cursor-not-allowed{cursor:not-allowed}.crow-cursor-pointer{cursor:pointer}.crow-select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.crow-resize-none{resize:none}.crow-list-decimal{list-style-type:decimal}.crow-list-disc{list-style-type:disc}.crow-flex-row{flex-direction:row}.crow-flex-col{flex-direction:column}.crow-flex-wrap{flex-wrap:wrap}.crow-items-start{align-items:flex-start}.crow-items-end{align-items:flex-end}.crow-items-center{align-items:center}.crow-items-stretch{align-items:stretch}.crow-justify-start{justify-content:flex-start}.crow-justify-end{justify-content:flex-end}.crow-justify-center{justify-content:center}.crow-justify-between{justify-content:space-between}.crow-gap-1{gap:.25rem}.crow-gap-1\\\\.5{gap:.375rem}.crow-gap-2{gap:.5rem}.crow-gap-3{gap:.75rem}.crow-gap-4{gap:1rem}.crow-gap-6{gap:1.5rem}.crow-space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.crow-space-y-1\\\\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.375rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem*var(--tw-space-y-reverse))}.crow-space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.crow-space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem*var(--tw-space-y-reverse))}.crow-space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem*var(--tw-space-y-reverse))}.crow-overflow-auto{overflow:auto}.crow-overflow-hidden{overflow:hidden}.crow-overflow-visible{overflow:visible}.crow-overflow-x-auto{overflow-x:auto}.crow-overflow-y-auto{overflow-y:auto}.crow-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.crow-whitespace-pre-wrap{white-space:pre-wrap}.crow-break-words{overflow-wrap:break-word}.crow-rounded{border-radius:.25rem}.crow-rounded-2xl{border-radius:1rem}.crow-rounded-3xl{border-radius:1.5rem}.crow-rounded-full{border-radius:9999px}.crow-rounded-lg{border-radius:.5rem}.crow-rounded-md{border-radius:.375rem}.crow-rounded-xl{border-radius:.75rem}.crow-border{border-width:1px}.crow-border-b{border-bottom-width:1px}.crow-border-l{border-left-width:1px}.crow-border-l-2{border-left-width:2px}.crow-border-r{border-right-width:1px}.crow-border-t{border-top-width:1px}.crow-border-none{border-style:none}.crow-border-\\\\[var\\\\(--crow-border\\\\,\\\\#e5e7eb\\\\)\\\\]{border-color:var(--crow-border,#e5e7eb)}.crow-border-blue-200{--tw-border-opacity:1;border-color:rgb(191 219 254/var(--tw-border-opacity,1))}.crow-border-gray-100{--tw-border-opacity:1;border-color:rgb(243 244 246/var(--tw-border-opacity,1))}.crow-border-gray-200{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity,1))}.crow-border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity,1))}.crow-border-red-500{--tw-border-opacity:1;border-color:rgb(239 68 68/var(--tw-border-opacity,1))}.crow-bg-\\\\[var\\\\(--crow-bg-secondary\\\\,\\\\#f3f4f6\\\\)\\\\]{background-color:var(--crow-bg-secondary,#f3f4f6)}.crow-bg-black{--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity,1))}.crow-bg-black\\\\/5{background-color:rgba(0,0,0,.05)}.crow-bg-blue-50{--tw-bg-opacity:1;background-color:rgb(239 246 255/var(--tw-bg-opacity,1))}.crow-bg-gray-100{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.crow-bg-gray-200{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity,1))}.crow-bg-gray-400{--tw-bg-opacity:1;background-color:rgb(156 163 175/var(--tw-bg-opacity,1))}.crow-bg-gray-50{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.crow-bg-gray-700{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.crow-bg-gray-800{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.crow-bg-gray-900{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity,1))}.crow-bg-red-100{--tw-bg-opacity:1;background-color:rgb(254 226 226/var(--tw-bg-opacity,1))}.crow-bg-red-500{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity,1))}.crow-bg-transparent{background-color:transparent}.crow-bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.crow-p-0{padding:0}.crow-p-0\\\\.5{padding:.125rem}.crow-p-1{padding:.25rem}.crow-p-1\\\\.5{padding:.375rem}.crow-p-2{padding:.5rem}.crow-p-3{padding:.75rem}.crow-p-4{padding:1rem}.crow-p-6{padding:1.5rem}.crow-px-1{padding-left:.25rem;padding-right:.25rem}.crow-px-1\\\\.5{padding-left:.375rem;padding-right:.375rem}.crow-px-2{padding-left:.5rem;padding-right:.5rem}.crow-px-3{padding-left:.75rem;padding-right:.75rem}.crow-px-4{padding-left:1rem;padding-right:1rem}.crow-px-6{padding-left:1.5rem;padding-right:1.5rem}.crow-py-0{padding-top:0;padding-bottom:0}.crow-py-0\\\\.5{padding-top:.125rem;padding-bottom:.125rem}.crow-py-1{padding-top:.25rem;padding-bottom:.25rem}.crow-py-1\\\\.5{padding-top:.375rem;padding-bottom:.375rem}.crow-py-2{padding-top:.5rem;padding-bottom:.5rem}.crow-py-2\\\\.5{padding-top:.625rem;padding-bottom:.625rem}.crow-py-3{padding-top:.75rem;padding-bottom:.75rem}.crow-py-6{padding-top:1.5rem;padding-bottom:1.5rem}.crow-py-8{padding-top:2rem;padding-bottom:2rem}.crow-pb-2{padding-bottom:.5rem}.crow-pl-3{padding-left:.75rem}.crow-pl-4{padding-left:1rem}.crow-pl-5{padding-left:1.25rem}.crow-pr-4{padding-right:1rem}.crow-pt-1{padding-top:.25rem}.crow-pt-3{padding-top:.75rem}.crow-text-left{text-align:left}.crow-text-center{text-align:center}.crow-text-right{text-align:right}.crow-align-text-bottom{vertical-align:text-bottom}.crow-font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.crow-text-\\\\[13px\\\\]{font-size:13px}.crow-text-base{font-size:1rem;line-height:1.5rem}.crow-text-lg{font-size:1.125rem;line-height:1.75rem}.crow-text-sm{font-size:.875rem;line-height:1.25rem}.crow-text-xs{font-size:.75rem;line-height:1rem}.crow-font-bold{font-weight:700}.crow-font-medium{font-weight:500}.crow-font-semibold{font-weight:600}.crow-uppercase{text-transform:uppercase}.crow-italic{font-style:italic}.crow-leading-relaxed{line-height:1.625}.crow-leading-tight{line-height:1.25}.crow-tracking-wide{letter-spacing:.025em}.crow-text-\\\\[var\\\\(--crow-primary\\\\,\\\\#7c3aed\\\\)\\\\]{color:var(--crow-primary,#7c3aed)}.crow-text-\\\\[var\\\\(--crow-text\\\\,\\\\#111827\\\\)\\\\]{color:var(--crow-text,#111827)}.crow-text-amber-500{--tw-text-opacity:1;color:rgb(245 158 11/var(--tw-text-opacity,1))}.crow-text-black{--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1))}.crow-text-blue-300{--tw-text-opacity:1;color:rgb(147 197 253/var(--tw-text-opacity,1))}.crow-text-blue-500{--tw-text-opacity:1;color:rgb(59 130 246/var(--tw-text-opacity,1))}.crow-text-gray-200{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity,1))}.crow-text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.crow-text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.crow-text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.crow-text-gray-700{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.crow-text-gray-800{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity,1))}.crow-text-gray-900{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity,1))}.crow-text-green-500{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity,1))}.crow-text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity,1))}.crow-text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.crow-underline{text-decoration-line:underline}.crow-opacity-0{opacity:0}.crow-opacity-100{opacity:1}.crow-opacity-25{opacity:.25}.crow-opacity-40{opacity:.4}.crow-opacity-50{opacity:.5}.crow-opacity-60{opacity:.6}.crow-opacity-75{opacity:.75}.crow-shadow-2xl{--tw-shadow:0 25px 50px -12px rgba(0,0,0,.25);--tw-shadow-colored:0 25px 50px -12px var(--tw-shadow-color)}.crow-shadow-2xl,.crow-shadow-\\\\[0_0_20px_rgba\\\\(0\\\\,0\\\\,0\\\\,0\\\\.25\\\\)\\\\]{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.crow-shadow-\\\\[0_0_20px_rgba\\\\(0\\\\,0\\\\,0\\\\,0\\\\.25\\\\)\\\\]{--tw-shadow:0 0 20px rgba(0,0,0,.25);--tw-shadow-colored:0 0 20px var(--tw-shadow-color)}.crow-shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.crow-shadow-lg,.crow-shadow-md{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.crow-shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}.crow-outline-none{outline:2px solid transparent;outline-offset:2px}.crow-ring-4{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.crow-ring-offset-2{--tw-ring-offset-width:2px}.crow-backdrop-blur-md{--tw-backdrop-blur:blur(12px)}.crow-backdrop-blur-md,.crow-backdrop-blur-sm{backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.crow-backdrop-blur-sm{--tw-backdrop-blur:blur(4px)}.crow-transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.crow-transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.crow-transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.crow-transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.crow-transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.crow-duration-150{transition-duration:.15s}.crow-duration-200{transition-duration:.2s}.crow-duration-300{transition-duration:.3s}.crow-duration-500{transition-duration:.5s}.crow-ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.crow-animate-fade-in{animation:crow-fadeIn .2s ease-out}.crow-animate-slide-up{animation:crow-slideUp .3s ease-out}.crow-animate-pulse{animation:crow-pulse 1.5s ease-in-out infinite}.crow-animation-delay-100{animation-delay:.1s}.crow-animation-delay-200{animation-delay:.2s}@keyframes crow-fadeIn{0%{opacity:0}to{opacity:1}}@keyframes crow-slideUp{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}@keyframes crow-pulse{0%,to{opacity:1}50%{opacity:.4}}.crow-overflow-y-auto::-webkit-scrollbar{width:6px}.crow-overflow-y-auto::-webkit-scrollbar-track{background:transparent}.crow-overflow-y-auto::-webkit-scrollbar-thumb{background-color:#d1d5db;border-radius:3px}.crow-overflow-y-auto::-webkit-scrollbar-thumb:hover{background-color:#9ca3af}.crow-focus-visible\\\\:crow-outline-none:focus-visible{outline:none}.crow-focus-visible\\\\:crow-ring-2:focus-visible{box-shadow:0 0 0 2px var(--crow-primary,#6366f1)}:host{--crow-primary:#6366f1;--crow-primary-dark:#4f46e5;--crow-secondary:#f1f5f9;--crow-accent:#10b981}@media (prefers-color-scheme:dark){:host{--crow-primary:#818cf8;--crow-primary-dark:#6366f1}}.crow-copilot-toggle{position:fixed;top:50%;transform:translateY(-50%);z-index:999998;width:24px;height:64px;display:flex;align-items:center;justify-content:center;background:#fff;border:1px solid #e5e7eb;cursor:pointer;transition:all .2s ease;box-shadow:0 2px 8px rgba(0,0,0,.1)}.crow-copilot-toggle:hover{background:#f9fafb;box-shadow:0 4px 12px rgba(0,0,0,.15)}.crow-copilot-toggle-right{right:0;border-radius:8px 0 0 8px;border-right:none}.crow-copilot-toggle-left{left:0;border-radius:0 8px 8px 0;border-left:none}.crow-copilot-toggle.open.crow-copilot-toggle-right{right:var(--crow-copilot-width,400px)}.crow-copilot-toggle.open.crow-copilot-toggle-left{left:var(--crow-copilot-width,400px)}.crow-copilot-toggle svg{width:16px;height:16px;color:#6b7280;transition:transform .2s ease}.crow-copilot-toggle:hover svg{color:#374151}.crow-copilot-sidebar{position:fixed;top:0;bottom:0;z-index:999997;background:#fff;box-shadow:-4px 0 20px rgba(0,0,0,.1);transition:transform .3s cubic-bezier(.4,0,.2,1);overflow:hidden}.crow-copilot-sidebar-right{right:0;border-left:1px solid #e5e7eb}.crow-copilot-sidebar-left{left:0;border-right:1px solid #e5e7eb}.crow-copilot-sidebar.closed.crow-copilot-sidebar-right{transform:translateX(100%)}.crow-copilot-sidebar.closed.crow-copilot-sidebar-left{transform:translateX(-100%)}body.crow-copilot-open-right{margin-right:var(--crow-copilot-width,400px)!important;transition:margin .3s cubic-bezier(.4,0,.2,1)}body.crow-copilot-open-left{margin-left:var(--crow-copilot-width,400px)!important}body,body.crow-copilot-open-left{transition:margin .3s cubic-bezier(.4,0,.2,1)}.placeholder\\\\:crow-text-gray-500::-moz-placeholder{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.placeholder\\\\:crow-text-gray-500::placeholder{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.last\\\\:crow-mb-0:last-child{margin-bottom:0}.last\\\\:crow-border-0:last-child{border-width:0}.hover\\\\:crow-scale-110:hover{--tw-scale-x:1.1;--tw-scale-y:1.1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\\\\:crow-bg-gray-100:hover{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.hover\\\\:crow-bg-gray-200:hover{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity,1))}.hover\\\\:crow-bg-gray-50:hover{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.hover\\\\:crow-bg-gray-700:hover{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.hover\\\\:crow-bg-gray-800:hover{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.hover\\\\:crow-bg-red-200:hover{--tw-bg-opacity:1;background-color:rgb(254 202 202/var(--tw-bg-opacity,1))}.hover\\\\:crow-bg-red-500:hover{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity,1))}.hover\\\\:crow-text-blue-300:hover{--tw-text-opacity:1;color:rgb(147 197 253/var(--tw-text-opacity,1))}.hover\\\\:crow-text-gray-600:hover{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.hover\\\\:crow-text-gray-700:hover{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.hover\\\\:crow-text-gray-800:hover{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity,1))}.hover\\\\:crow-opacity-100:hover{opacity:1}.hover\\\\:crow-opacity-80:hover{opacity:.8}.hover\\\\:crow-opacity-90:hover{opacity:.9}.focus\\\\:crow-outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\\\\:crow-ring-0:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\\\\:crow-ring-0:focus,.focus\\\\:crow-ring-2:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\\\\:crow-ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\\\\:crow-ring-offset-2:focus{--tw-ring-offset-width:2px}.focus-visible\\\\:crow-outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.focus-visible\\\\:crow-ring-0:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.disabled\\\\:crow-pointer-events-none:disabled{pointer-events:none}.disabled\\\\:crow-cursor-not-allowed:disabled{cursor:not-allowed}.disabled\\\\:crow-opacity-50:disabled{opacity:.5}`;\n\nlet injected = false;\n\n/**\n * Inject styles into a target (document.head or ShadowRoot)\n * \n * For Shadow DOM usage, prefer passing the CSS string directly to ShadowContainer.\n * This function is kept for backwards compatibility and non-Shadow DOM use cases.\n * \n * @param target - Where to inject styles (defaults to document.head)\n */\nexport function injectStyles(target: Document | ShadowRoot = document) {\n // Only inject once per target\n if (target === document && injected) return;\n if (typeof document === 'undefined') return;\n \n // Check if already injected in this target\n const existingStyle = target === document \n ? document.getElementById(STYLE_ID)\n : (target as ShadowRoot).querySelector(`#${STYLE_ID}`);\n \n if (existingStyle) {\n if (target === document) injected = true;\n return;\n }\n \n const style = document.createElement('style');\n style.id = STYLE_ID;\n style.textContent = WIDGET_CSS;\n \n if (target === document) {\n document.head.appendChild(style);\n injected = true;\n } else {\n // For ShadowRoot, prepend the style\n (target as ShadowRoot).prepend(style);\n }\n}\n\n// NOTE: Auto-injection is DISABLED to prevent CSS leaking to host pages.\n// The widget now uses Shadow DOM for CSS isolation.\n// If you need to inject styles globally (not recommended), call injectStyles() manually.\n","/**\n * CrowWidget - Floating chat widget with bubble button\n *\n * The main widget component that supports:\n * - Floating mode (with bubble) for production\n * - Embedded mode (no bubble) for dashboard preview\n * - Custom styles from DB or props\n * - Shadow DOM encapsulation for CSS isolation\n */\n\nimport { useState, useRef, useEffect, useCallback, useMemo, type CSSProperties } from \"react\";\nimport { AnimatePresence } from \"framer-motion\";\n\n// Hooks\nimport { useChat } from \"./hooks/useChat\";\nimport { useConversations } from \"./hooks/useConversations\";\nimport { useWorkflow } from \"./hooks/useWorkflow\";\nimport { useCrowAPI } from \"./hooks/useCrowAPI\";\nimport { useWidgetStyles } from \"./hooks/useWidgetStyles\";\nimport { useTTSOutput } from \"./hooks/useTTSOutput\";\n\n// Context\nimport { WidgetStyleProvider } from \"./context/StyleContext\";\n\n// Components\nimport { ShadowContainer } from \"./components/ShadowContainer\";\nimport { ChatBubble, WidgetShell, WidgetHeader } from \"./components/widget\";\nimport {\n MessagesContainer,\n MessageList,\n ConversationList,\n WorkflowPanel,\n PoweredByBadge,\n PromptInputBox,\n BrowserUseConfirmation,\n SuggestedActions,\n} from \"./components/shared\";\n\n// Styles\nimport { WIDGET_CSS, stylesToCssVars } from \"./styles\";\n\n// Config\nimport type { WidgetStyleConfig } from \"./styles/types\";\nimport type { ToolRenderers } from \"./types\";\n\n/** Identity data passed to the identify function */\nexport interface IdentifyData {\n /** JWT token from your backend */\n token: string;\n /** User's display name */\n name?: string;\n /** Additional metadata */\n [key: string]: unknown;\n}\n\n/** Function to identify a user */\nexport type IdentifyFunction = (data: IdentifyData) => void;\n\n/** Client-side tool handler */\nexport type ToolHandler = (\n args: Record<string, unknown>,\n) => Promise<unknown> | unknown;\n\n/** Map of tool names to handlers */\nexport type ToolsMap = Record<string, ToolHandler>;\n\nexport interface CrowWidgetProps {\n /** Product ID for this widget */\n productId: string;\n /** API URL (defaults to relative path) */\n apiUrl?: string;\n /** Subdomain for multi-endpoint routing */\n subdomain?: string;\n /** Widget variant: floating (with bubble) or embedded (for preview) */\n variant?: \"floating\" | \"embedded\";\n /** Custom styles to override DB and default styles */\n styles?: Partial<WidgetStyleConfig>;\n /** Skip fetching styles from API (use for preview mode with local state) */\n previewMode?: boolean;\n /** Whether to show AI thinking/reasoning to users (overrides API setting if provided) */\n showThinking?: boolean;\n /** Custom agent name shown in header (overrides API setting if provided) */\n agentName?: string;\n /** Custom welcome message (overrides API setting if provided) */\n welcomeMessage?: string;\n /** Callback when widget is ready */\n onReady?: () => void;\n /**\n * Callback to identify the user. Called with an identify function\n * that you should call with the user's token when available.\n */\n onIdentify?: (identify: IdentifyFunction) => void;\n /** Client-side tools the agent can call */\n tools?: ToolsMap;\n /** Custom navigation function for SPA-safe page navigation (e.g. router.push from Next.js or React Router) */\n navigate?: (path: string) => void;\n /** Callback fired when a server-side tool completes, with the tool name and full result data */\n onToolResult?: (toolName: string, result: Record<string, unknown>) => void;\n /**\n * Async function that returns a JWT for user identity verification.\n * Called on mount and automatically on 401 (token refresh).\n * Preferred over onIdentify for simpler integration.\n */\n getIdentityToken?: () => Promise<string>;\n /**\n * Page context data sent with every message. Reactive — updates whenever\n * the object reference changes. Replaces window.crow('setContext', ...).\n */\n context?: Record<string, unknown>;\n /**\n * Custom renderers for tool results. When a tool completes and a renderer\n * exists for its name, that component is rendered inline in the chat.\n */\n toolRenderers?: ToolRenderers;\n /**\n * ISO 639-1 language code (e.g., \"es\", \"fr\", \"ja\"). When set, the AI\n * responds in that language and the welcome message is translated.\n */\n language?: string;\n /**\n * Custom CSS to inject into the widget's Shadow DOM.\n * Appended after default styles, allowing overrides.\n */\n customCss?: string;\n}\n\nexport function CrowWidget({\n productId,\n apiUrl = \"\",\n subdomain,\n variant = \"floating\",\n styles: propStyles,\n previewMode = false,\n showThinking: showThinkingProp,\n agentName: agentNameProp,\n welcomeMessage: welcomeMessageProp,\n onReady,\n onIdentify,\n tools,\n navigate,\n onToolResult,\n getIdentityToken,\n context,\n toolRenderers,\n language,\n customCss,\n}: CrowWidgetProps) {\n // Fall back to window globals for script-tag users\n const effectiveGetIdentityToken = getIdentityToken || window.__crow_identity_token_fetcher;\n const effectiveOnToolResult = onToolResult || window.__crow_on_tool_result;\n const effectiveToolRenderers = toolRenderers || window.__crow_tool_renderers;\n\n // Fetch and merge styles\n const {\n styles,\n isLoading: isLoadingStyles,\n agentName: agentNameFromAPI,\n browserUseEnabled,\n pageNavigationEnabled,\n pageNavigationRoutes,\n showThinking: showThinkingFromAPI,\n persistAnonymousConversations,\n welcomeMessage: welcomeMessageFromAPI,\n selectedModel: selectedModelFromAPI,\n initialSuggestions,\n toolConsentSettings,\n } = useWidgetStyles({\n productId,\n apiUrl,\n propStyles,\n skip: previewMode,\n language,\n });\n\n // Tool status — set via window.crow('setToolStatus', '...')\n const [toolStatus, setToolStatus] = useState<string>(\n () => (window as any).__crow_tool_status as string ?? \"\"\n );\n\n useEffect(() => {\n const handler = (e: Event) => setToolStatus((e as CustomEvent<string>).detail ?? \"\");\n window.addEventListener(\"crow:setToolStatus\", handler);\n return () => window.removeEventListener(\"crow:setToolStatus\", handler);\n }, []);\n\n // Greeting override — set via window.crow('setGreeting', '...')\n const [greetingOverride, setGreetingOverride] = useState<string | undefined>(\n () => (window as any).__crow_greeting as string | undefined\n );\n\n useEffect(() => {\n const handler = (e: Event) => setGreetingOverride((e as CustomEvent<string>).detail);\n window.addEventListener(\"crow:setGreeting\", handler);\n return () => window.removeEventListener(\"crow:setGreeting\", handler);\n }, []);\n\n // Use prop if provided, otherwise use API value\n const agentName = agentNameProp ?? agentNameFromAPI;\n const welcomeMessage = greetingOverride ?? welcomeMessageProp ?? welcomeMessageFromAPI;\n const selectedModel = selectedModelFromAPI;\n\n // Use prop if provided, otherwise use API value\n const showThinking = showThinkingProp ?? showThinkingFromAPI;\n\n // Auto-loaded browser_use tool (loaded dynamically to avoid SSR issues)\n const [autoTools, setAutoTools] = useState<ToolsMap>({});\n\n // Convert styles to CSS custom properties\n const cssVars = stylesToCssVars(styles) as CSSProperties;\n\n // Refs\n const messagesContainerRef = useRef<HTMLDivElement>(null);\n const executeClientToolRef = useRef<\n | ((toolName: string, args: Record<string, unknown>) => Promise<unknown>)\n | null\n >(null);\n const submitToolResultRef = useRef<\n | ((\n toolCallId: string,\n toolName: string,\n result: Record<string, unknown>,\n ) => Promise<void>)\n | null\n >(null);\n\n // UI State\n const [isCollapsed, setIsCollapsed] = useState(variant === \"floating\");\n const [showConversationList, setShowConversationList] = useState(false);\n const [isVerifiedUser, setIsVerifiedUser] = useState(false);\n\n // Browser automation state\n const [isBrowserUseActive, setIsBrowserUseActive] = useState(false);\n const [pendingConfirmation, setPendingConfirmation] = useState<{\n instruction: string;\n resolve: (confirmed: boolean) => void;\n } | null>(null);\n\n\n const [askUserResolver, setAskUserResolver] = useState<{\n resolve: (answer: string) => void;\n reject: () => void;\n } | null>(null);\n\n // Workflow hook\n const {\n activeWorkflow,\n startWorkflow,\n updateTodo,\n markComplete,\n endWorkflow,\n } = useWorkflow({\n productId,\n apiUrl,\n conversationId: null,\n selectedModel,\n });\n\n // Conversations hook\n const conversations = useConversations({ productId, apiUrl });\n\n // Track if we need to restore history on mount\n const [shouldRestoreHistory, setShouldRestoreHistory] = useState(false);\n const hasRestoredHistoryRef = useRef(false);\n\n // Chat hook\n const chat = useChat({\n productId,\n apiUrl,\n persistAnonymousConversations,\n welcomeMessage,\n selectedModel,\n subdomain,\n toolConsentSettings,\n language,\n onVerificationStatus: (isVerified) => {\n setIsVerifiedUser(isVerified);\n },\n onConversationId: () => {},\n onWorkflowEvent: (event) => {\n switch (event.type) {\n case \"started\":\n if (event.name && event.todos) {\n startWorkflow(event.name, event.todos);\n }\n break;\n case \"todo_updated\":\n if (event.todoId && event.todoStatus) {\n updateTodo(event.todoId, event.todoStatus);\n }\n break;\n case \"ended\":\n endWorkflow(2000);\n break;\n case \"complete_prompt\":\n markComplete();\n break;\n }\n },\n onToolResult: effectiveOnToolResult,\n onToolCall: async (event) => {\n if (event.type === \"client_call\" && event.toolName && event.toolCallId) {\n // Original non-consent flow\n try {\n const result = await executeClientToolRef.current?.(\n event.toolName,\n (event.arguments || {}) as Record<string, unknown>,\n );\n\n // Don't send result if user cancelled/declined - just stop\n const resultObj = result as Record<string, unknown>;\n const dataObj = resultObj?.data as Record<string, unknown> | undefined;\n const wasUserCancelled =\n dataObj?.declined === true ||\n (typeof resultObj?.error === 'string' && resultObj.error.includes('cancelled by user')) ||\n (typeof resultObj?.error === 'string' && resultObj.error.includes('declined'));\n\n if (wasUserCancelled) {\n console.log('[Crow Widget] Tool was cancelled by user - not sending result to agent');\n return;\n }\n\n // Send result back to agent so it can continue\n if (result && submitToolResultRef.current) {\n await submitToolResultRef.current(\n event.toolCallId,\n event.toolName,\n result as Record<string, unknown>,\n );\n }\n } catch (e) {\n console.error(\"[Crow Widget] Tool error:\", e);\n if (submitToolResultRef.current) {\n await submitToolResultRef.current(\n event.toolCallId,\n event.toolName,\n { success: false, error: String(e) },\n );\n }\n }\n }\n },\n onRestoredConversation: () => {\n setShouldRestoreHistory(true);\n },\n });\n\n // TTS - speak assistant responses\n const tts = useTTSOutput({ backendUrl: apiUrl });\n const ttsRef = useRef(tts);\n ttsRef.current = tts;\n const wasLoadingRef = useRef(false);\n\n\n // Speak the last assistant message when streaming completes\n useEffect(() => {\n console.log('[Crow TTS] isLoading changed:', chat.isLoading, 'wasLoading:', wasLoadingRef.current);\n if (wasLoadingRef.current && !chat.isLoading) {\n // Streaming just finished - find the last bot message\n const lastMessage = [...chat.messages].reverse().find(m => m.isBot);\n console.log('[Crow TTS] Last bot message:', lastMessage?.content?.substring(0, 50));\n if (lastMessage?.content) {\n // Strip any markdown or special formatting for cleaner speech\n const textToSpeak = lastMessage.content\n .replace(/\\*\\*/g, '') // Remove bold\n .replace(/\\*/g, '') // Remove italic\n .replace(/`[^`]+`/g, '') // Remove code\n .replace(/\\[([^\\]]+)\\]\\([^)]+\\)/g, '$1') // Convert links to text\n .trim();\n if (textToSpeak) {\n console.log('[Crow TTS] Speaking:', textToSpeak.substring(0, 50));\n ttsRef.current.speak(textToSpeak);\n }\n }\n }\n wasLoadingRef.current = chat.isLoading;\n }, [chat.isLoading, chat.messages]);\n\n\n // Set initial suggestions from widget config on load\n useEffect(() => {\n if (initialSuggestions.length > 0 && chat.suggestedActions.length === 0) {\n chat.setSuggestedActions(initialSuggestions);\n }\n }, [initialSuggestions]);\n\n // Load anonymous conversation history when restored from localStorage\n useEffect(() => {\n if (\n shouldRestoreHistory &&\n chat.conversationId &&\n !hasRestoredHistoryRef.current\n ) {\n hasRestoredHistoryRef.current = true;\n console.log(\n \"[Crow Widget] Restoring conversation history:\",\n chat.conversationId,\n );\n conversations\n .loadAnonymousConversationHistory(chat.conversationId)\n .then((historyMessages) => {\n if (historyMessages.length > 0) {\n chat.loadMessages(historyMessages);\n }\n });\n }\n }, [shouldRestoreHistory, chat.conversationId, conversations, chat]);\n\n // Workflow actions with current chat values\n const workflowActions = useWorkflow({\n productId,\n apiUrl,\n conversationId: chat.conversationId,\n selectedModel: chat.selectedModel,\n onMessage: (content) => {\n chat.loadMessages([\n ...chat.messages,\n {\n id: `bot-${Date.now()}`,\n content,\n isBot: true,\n timestamp: new Date(),\n },\n ]);\n },\n });\n\n // Crow API hook\n const { executeClientTool } = useCrowAPI({\n onIdentified: async () => {\n setIsVerifiedUser(true);\n const convs = await conversations.loadConversations();\n if (convs.length > 0) {\n const mostRecent = convs[0];\n const historyMessages = await conversations.loadConversationHistory(mostRecent.id);\n if (historyMessages.length > 0) {\n chat.loadMessages(historyMessages);\n chat.setConversationId(mostRecent.id);\n }\n }\n },\n onReset: () => {\n setIsVerifiedUser(false);\n chat.resetMessages();\n },\n });\n\n executeClientToolRef.current = executeClientTool;\n submitToolResultRef.current = chat.submitToolResult;\n\n // Notify when ready\n useEffect(() => {\n if (!isLoadingStyles) {\n onReady?.();\n }\n }, [isLoadingStyles, onReady]);\n\n // Call onIdentify with an identify function when widget is ready (legacy API)\n useEffect(() => {\n if (!isLoadingStyles && onIdentify) {\n const identify: IdentifyFunction = (data) => {\n if (!data.token) {\n console.error(\"[Crow] identify() requires a token\");\n return;\n }\n window.crow?.(\"identify\", data);\n };\n onIdentify(identify);\n }\n }, [isLoadingStyles, onIdentify]);\n\n // Declarative identity: call getIdentityToken on mount and on token refresh\n useEffect(() => {\n if (!effectiveGetIdentityToken || isLoadingStyles) return;\n\n let cancelled = false;\n\n const identify = async () => {\n try {\n const token = await effectiveGetIdentityToken();\n if (!cancelled && token) {\n window.crow?.(\"identify\", { token });\n }\n } catch (e) {\n console.error(\"[Crow] getIdentityToken failed:\", e);\n }\n };\n\n // Initial identification\n identify();\n\n // Auto-refresh on 401\n const handleRefresh = () => identify();\n window.addEventListener(\"crow:token-refresh-needed\", handleRefresh);\n\n return () => {\n cancelled = true;\n window.removeEventListener(\"crow:token-refresh-needed\", handleRefresh);\n };\n }, [effectiveGetIdentityToken, isLoadingStyles]);\n\n // Declarative context: sync context prop to window.__crow_page_context\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n if (context && Object.keys(context).length > 0) {\n (window as any).__crow_page_context = context;\n } else {\n (window as any).__crow_page_context = undefined;\n }\n }, [context]);\n\n // Browser automation callbacks\n const handleBrowserConfirmation = useCallback(\n (instruction: string): Promise<boolean> => {\n return new Promise((resolve) => {\n setPendingConfirmation({ instruction, resolve });\n });\n },\n []\n );\n\n const handleBrowserQuestion = useCallback(\n (question: string): Promise<string> => {\n return new Promise((resolve, reject) => {\n // Add the question as a bot message in the chat (persisted to server)\n chat.addMessage(\"assistant\", question);\n // Store the resolver - next user message will be routed here\n setAskUserResolver({ resolve, reject });\n });\n },\n [chat]\n );\n\n const handleBrowserProgress = useCallback(\n (step: number, maxSteps: number) => {\n // If step indicates completion or error, clear active state\n if (step >= maxSteps || step === -1) {\n setIsBrowserUseActive(false);\n }\n },\n []\n );\n\n // Set up global browser callbacks for the SDK to use\n useEffect(() => {\n (window as any).__crow_browser_callbacks = {\n onConfirmation: handleBrowserConfirmation,\n onQuestion: handleBrowserQuestion,\n onProgress: handleBrowserProgress,\n };\n return () => {\n delete (window as any).__crow_browser_callbacks;\n };\n }, [handleBrowserConfirmation, handleBrowserQuestion, handleBrowserProgress]);\n\n // Auto-load browser_use tool when enabled (SSR-safe dynamic import)\n useEffect(() => {\n if (\n browserUseEnabled &&\n !isLoadingStyles &&\n !autoTools.browser_use\n ) {\n import(\"@usecrow/client/browser\")\n .then(({ createBrowserUseTool }) => {\n setAutoTools((prev) => ({\n ...prev,\n browser_use: createBrowserUseTool({ productId, apiUrl }),\n }));\n console.log(\"[Crow] browser_use tool auto-loaded\");\n })\n .catch((err) => {\n console.warn(\"[Crow] Failed to load browser_use:\", err);\n });\n }\n }, [browserUseEnabled, isLoadingStyles, productId, apiUrl, autoTools]);\n\n // Auto-load execute_recorded_workflow tool when browser_use is enabled\n useEffect(() => {\n if (\n browserUseEnabled &&\n !isLoadingStyles &&\n !autoTools.execute_recorded_workflow\n ) {\n import(\"@usecrow/client/browser\")\n .then(({ createExecuteRecordedWorkflowTool }) => {\n setAutoTools((prev) => ({\n ...prev,\n execute_recorded_workflow: createExecuteRecordedWorkflowTool({ productId, apiUrl }),\n }));\n console.log(\"[Crow] execute_recorded_workflow tool auto-loaded\");\n })\n .catch((err) => {\n console.warn(\"[Crow] Failed to load execute_recorded_workflow:\", err);\n });\n }\n }, [browserUseEnabled, isLoadingStyles, productId, apiUrl, autoTools]);\n\n // Auto-load navigateToPage tool when page navigation is enabled\n useEffect(() => {\n if (\n pageNavigationEnabled &&\n pageNavigationRoutes.length > 0 &&\n !isLoadingStyles\n ) {\n import(\"@usecrow/client\")\n .then(({ createNavigateToPageTool }) => {\n setAutoTools((prev) => ({\n ...prev,\n navigateToPage: createNavigateToPageTool(pageNavigationRoutes, navigate),\n }));\n console.log(\n `[Crow] navigateToPage tool auto-loaded with ${pageNavigationRoutes.length} routes`\n );\n })\n .catch((err) => {\n console.warn(\"[Crow] Failed to load navigateToPage:\", err);\n });\n }\n }, [pageNavigationEnabled, pageNavigationRoutes, isLoadingStyles, navigate]);\n\n // Merge auto-loaded tools with user-provided tools\n const mergedTools = useMemo(() => ({ ...autoTools, ...tools }), [autoTools, tools]);\n\n // Register tools when provided\n useEffect(() => {\n if (Object.keys(mergedTools).length > 0) {\n window.crow?.(\"registerTools\", mergedTools);\n }\n }, [mergedTools]);\n\n // Handlers\n const handleSend = (message: string) => {\n if (!message.trim()) return;\n setIsCollapsed(false);\n\n // If browser_use is waiting for user input, route the message there instead of chat\n if (askUserResolver) {\n // Add user's answer to chat (persisted to server)\n chat.addMessage(\"user\", message);\n askUserResolver.resolve(message);\n setAskUserResolver(null);\n return;\n }\n\n chat.sendMessage(message);\n };\n\n const handleStop = () => {\n // Stop the chat/tool generation FIRST to kill any streaming responses\n chat.stopGeneration();\n\n // Stop any active browser_use automation (sets abort flag)\n if (browserUseEnabled && isBrowserUseActive) {\n import(\"@usecrow/client/browser\")\n .then(({ stopActiveBrowserUse }) => {\n stopActiveBrowserUse();\n // Reject resolver AFTER abort flag is set (not before)\n if (askUserResolver) {\n askUserResolver.reject();\n setAskUserResolver(null);\n }\n })\n .catch(() => {});\n setIsBrowserUseActive(false);\n } else {\n // Not browser_use active, reject immediately\n if (askUserResolver) {\n askUserResolver.reject();\n setAskUserResolver(null);\n }\n }\n\n // Clear pending confirmation if waiting\n if (pendingConfirmation) {\n pendingConfirmation.resolve(false);\n setPendingConfirmation(null);\n }\n };\n\n const handleNewChat = () => {\n chat.resetMessages();\n setShowConversationList(false);\n };\n\n const handleToggleHistory = () => {\n setShowConversationList(!showConversationList);\n if (!showConversationList) {\n conversations.loadConversations();\n }\n };\n\n const handleSelectConversation = async (convId: string) => {\n const historyMessages = await conversations.loadConversationHistory(convId);\n if (historyMessages.length > 0) {\n chat.loadMessages(historyMessages);\n chat.setConversationId(convId);\n } else {\n chat.resetMessages();\n }\n setShowConversationList(false);\n };\n\n const handleCloseConversationList = () => {\n setShowConversationList(false);\n };\n\n const handleExitWorkflow = async () => {\n await workflowActions.exitWorkflow();\n };\n\n // Handle tool consent Allow/Deny from inline buttons\n const handleToolConsent = async (toolCallId: string, approved: boolean) => {\n // Find the tool call to get its name and arguments\n const toolCall = chat.activeToolCalls.find((tc) => tc.id === toolCallId)\n || chat.messages.flatMap((m) => m.toolCalls || []).find((tc) => tc.id === toolCallId);\n\n if (!toolCall) return;\n\n const isClientSide = !toolCall.serverSideExecution;\n\n if (approved) {\n chat.updateToolCallStatus(toolCallId, \"executing\");\n\n if (isClientSide) {\n // Client-side tool: execute locally, then submit result\n try {\n const result = await executeClientToolRef.current?.(\n toolCall.name,\n (toolCall.arguments || {}) as Record<string, unknown>,\n );\n\n const resultObj = result as Record<string, unknown>;\n const dataObj = resultObj?.data as Record<string, unknown> | undefined;\n const wasUserCancelled =\n dataObj?.declined === true ||\n (typeof resultObj?.error === 'string' && resultObj.error.includes('cancelled by user')) ||\n (typeof resultObj?.error === 'string' && resultObj.error.includes('declined'));\n\n if (wasUserCancelled) {\n console.log('[Crow Widget] Tool was cancelled by user after consent');\n return;\n }\n\n if (result && submitToolResultRef.current) {\n await submitToolResultRef.current(\n toolCallId,\n toolCall.name,\n result as Record<string, unknown>,\n );\n }\n } catch (e) {\n console.error(\"[Crow Widget] Tool error after consent:\", e);\n if (submitToolResultRef.current) {\n await submitToolResultRef.current(\n toolCallId,\n toolCall.name,\n { success: false, error: String(e) },\n );\n }\n }\n } else {\n // Server-side tool: submit consent approval — backend will execute\n if (submitToolResultRef.current) {\n await submitToolResultRef.current(\n toolCallId,\n toolCall.name,\n { consent_approved: true, tool_arguments: toolCall.arguments || {} },\n );\n }\n }\n } else {\n chat.updateToolCallStatus(toolCallId, \"denied\");\n if (submitToolResultRef.current) {\n await submitToolResultRef.current(\n toolCallId,\n toolCall.name,\n { status: \"denied\", error: \"User denied permission to execute this tool.\" },\n );\n }\n }\n };\n\n // Default (page-level) suggested actions set via window.crow('setSuggestedActions', ...)\n const defaultSuggestedActionsRef = useRef<Array<{ label: string; message: string }>>([]);\n\n // Listen for programmatic open/close/setSuggestedActions commands\n useEffect(() => {\n const handleOpen = () => setIsCollapsed(false);\n const handleClose = () => setIsCollapsed(true);\n const handleSetSuggestions = (e: Event) => {\n const actions = (e as CustomEvent).detail;\n if (Array.isArray(actions)) {\n defaultSuggestedActionsRef.current = actions;\n chat.setSuggestedActions(actions);\n }\n };\n window.addEventListener(\"crow:open\", handleOpen);\n window.addEventListener(\"crow:close\", handleClose);\n window.addEventListener(\"crow:setSuggestedActions\", handleSetSuggestions);\n\n // Pick up actions that were set before this listener attached (queue replay timing)\n const pending = (window as any).__crow_suggested_actions;\n if (Array.isArray(pending) && pending.length > 0) {\n defaultSuggestedActionsRef.current = pending;\n chat.setSuggestedActions(pending);\n }\n\n return () => {\n window.removeEventListener(\"crow:open\", handleOpen);\n window.removeEventListener(\"crow:close\", handleClose);\n window.removeEventListener(\"crow:setSuggestedActions\", handleSetSuggestions);\n };\n }, []);\n\n const handleBubbleClick = () => {\n setIsCollapsed(!isCollapsed);\n };\n\n // Widget content (shared between floating and embedded modes)\n const renderWidgetContent = () => (\n <>\n <WidgetHeader\n isVerifiedUser={isVerifiedUser}\n showConversationList={showConversationList}\n onNewChat={handleNewChat}\n onToggleHistory={handleToggleHistory}\n showMinimize={variant === \"floating\"}\n onToggleMinimize={() => setIsCollapsed(true)}\n />\n\n <AnimatePresence>\n {showConversationList && isVerifiedUser && (\n <ConversationList\n conversations={conversations.conversations}\n currentConversationId={chat.conversationId}\n onSelect={handleSelectConversation}\n onClose={handleCloseConversationList}\n />\n )}\n </AnimatePresence>\n\n <AnimatePresence>\n {activeWorkflow && (\n <WorkflowPanel\n workflow={activeWorkflow}\n onExit={handleExitWorkflow}\n />\n )}\n </AnimatePresence>\n\n <AnimatePresence>\n {(chat.messages.length > 0 || conversations.isLoadingHistory || pendingConfirmation) && (\n <MessagesContainer ref={messagesContainerRef}>\n <MessageList\n messages={chat.messages}\n activeToolCalls={chat.activeToolCalls}\n isLoadingHistory={conversations.isLoadingHistory}\n isGenerating={chat.isLoading}\n toolRenderers={effectiveToolRenderers}\n onToolConsent={handleToolConsent}\n />\n\n {/* Browser automation confirmation */}\n {pendingConfirmation && (\n <div className=\"crow-px-4 crow-py-2\">\n <BrowserUseConfirmation\n instruction={pendingConfirmation.instruction}\n onAllow={() => {\n setIsBrowserUseActive(true);\n pendingConfirmation.resolve(true);\n setPendingConfirmation(null);\n }}\n onDeny={() => {\n pendingConfirmation.resolve(false);\n setPendingConfirmation(null);\n }}\n />\n </div>\n )}\n\n </MessagesContainer>\n )}\n </AnimatePresence>\n\n <div className=\"crow-mt-auto crow-w-full\">\n {toolStatus && (\n <div className=\"crow-mx-3 crow-mb-1 crow-flex crow-items-center crow-gap-2 crow-rounded-lg crow-border crow-border-[var(--crow-border,#e5e7eb)] crow-bg-[var(--crow-bg-secondary,#f3f4f6)] crow-px-3 crow-py-2 crow-text-sm\">\n <svg className=\"crow-animate-spin crow-h-4 crow-w-4 crow-shrink-0 crow-text-[var(--crow-primary,#7c3aed)]\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle className=\"crow-opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\" />\n <path className=\"crow-opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z\" />\n </svg>\n <span className=\"crow-font-medium crow-text-[var(--crow-text,#111827)]\">{toolStatus}</span>\n </div>\n )}\n {(chat.suggestedActions.length > 0 || (!chat.isLoading && defaultSuggestedActionsRef.current.length > 0)) && (\n <SuggestedActions\n actions={chat.suggestedActions.length > 0 ? chat.suggestedActions : defaultSuggestedActionsRef.current}\n onActionClick={(action) => handleSend(action.message)}\n />\n )}\n <PoweredByBadge apiUrl={apiUrl} />\n <PromptInputBox\n onSend={handleSend}\n onStop={handleStop}\n placeholder=\"Type your message...\"\n isLoading={chat.isLoading}\n showStopButton={isBrowserUseActive || !!askUserResolver || !!pendingConfirmation}\n highlighted={!!askUserResolver}\n className=\"crow-backdrop-blur-md\"\n backendUrl={apiUrl}\n />\n </div>\n </>\n );\n\n // Combine default CSS with custom CSS if provided\n const combinedStyles = useMemo(\n () => customCss\n ? `${WIDGET_CSS}\\n\\n/* Custom CSS */\\n${customCss}`\n : WIDGET_CSS,\n [customCss]\n );\n\n // Render with Shadow DOM encapsulation\n return (\n <ShadowContainer styles={combinedStyles}>\n {/* Root element with CSS variables */}\n <div className=\"crow-widget-root\" style={cssVars}>\n <WidgetStyleProvider\n styles={styles}\n agentName={agentName}\n isLoading={isLoadingStyles}\n variant={variant}\n showThinking={showThinking}\n >\n {/* Floating mode: show bubble and collapsible widget */}\n {variant === \"floating\" && (\n <>\n <ChatBubble\n isExpanded={!isCollapsed}\n onClick={handleBubbleClick}\n />\n\n {!isCollapsed && (\n <WidgetShell>{renderWidgetContent()}</WidgetShell>\n )}\n </>\n )}\n\n {/* Embedded mode: always expanded, no bubble */}\n {variant === \"embedded\" && (\n <WidgetShell>{renderWidgetContent()}</WidgetShell>\n )}\n </WidgetStyleProvider>\n </div>\n </ShadowContainer>\n );\n}\n\nexport default CrowWidget;\n","/**\n * CopilotToggleButton - Edge toggle button for floating copilot\n *\n * Supports dual interaction:\n * - Click: toggle sidebar open/close\n * - Drag: resize sidebar width (when open)\n *\n * Forwards ref to the <button> so CopilotContainer can directly\n * manipulate its style.transition during drag for zero-lag resizing.\n */\n\nimport { forwardRef } from \"react\";\n\ninterface CopilotToggleButtonProps {\n isOpen: boolean;\n position: \"left\" | \"right\";\n onClick: () => void;\n /** Called on mousedown to initiate potential drag-to-resize */\n onMouseDown?: (e: React.MouseEvent) => void;\n /** Whether the user is actively dragging to resize */\n isDragging?: boolean;\n}\n\nfunction ChevronLeft() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"m15 18-6-6 6-6\" />\n </svg>\n );\n}\n\nfunction ChevronRight() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"m9 18 6-6-6-6\" />\n </svg>\n );\n}\n\nfunction MessageIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M7.9 20A9 9 0 1 0 4 16.1L2 22Z\" />\n </svg>\n );\n}\n\nexport const CopilotToggleButton = forwardRef<HTMLButtonElement, CopilotToggleButtonProps>(\n function CopilotToggleButton(\n { isOpen, position, onClick, onMouseDown, isDragging },\n ref,\n ) {\n const renderIcon = () => {\n if (!isOpen) return <MessageIcon />;\n if (position === \"right\") return <ChevronRight />;\n return <ChevronLeft />;\n };\n\n return (\n <button\n ref={ref}\n onClick={onClick}\n onMouseDown={onMouseDown}\n className={`crow-copilot-toggle crow-copilot-toggle-${position} ${\n isOpen ? \"open\" : \"\"\n } ${isDragging ? \"dragging\" : \"\"}`}\n style={{\n cursor: isOpen ? \"col-resize\" : undefined,\n }}\n aria-label={isOpen ? \"Close Copilot\" : \"Open Copilot\"}\n title={isOpen ? \"Close Copilot\" : \"Open Copilot\"}\n >\n {renderIcon()}\n </button>\n );\n }\n);\n","/**\n * CopilotContainer - Wrapper for floating copilot with push effect\n *\n * Handles:\n * - Toggle button positioning\n * - Sidebar slide animation\n * - Body margin manipulation for push effect\n * - Drag-to-resize from the toggle button edge\n *\n * Drag-to-resize uses direct DOM manipulation (no React re-renders) for\n * zero-lag, frame-perfect tracking of the cursor. React state is only\n * committed on mouseup.\n */\n\nimport { useEffect, useState, useRef, useCallback, type ReactNode } from \"react\";\nimport { CopilotToggleButton } from \"./CopilotToggleButton\";\n\n/** Minimum drag distance (px) before we consider it a resize vs. a click */\nconst DRAG_THRESHOLD = 5;\n/** Minimum sidebar width (px) */\nconst MIN_WIDTH = 280;\n/** Maximum sidebar width (px) */\nconst MAX_WIDTH = 800;\n\ninterface CopilotContainerProps {\n position: \"left\" | \"right\";\n width: number;\n defaultOpen: boolean;\n children: (controls: { close: () => void; currentWidth: number }) => ReactNode;\n}\n\nexport function CopilotContainer({\n position,\n width: initialWidth,\n defaultOpen,\n children,\n}: CopilotContainerProps) {\n // Restore open/closed state from sessionStorage (survives reload, clears on tab close)\n const [isOpen, setIsOpen] = useState(() => {\n try {\n const stored = sessionStorage.getItem(\"crow_copilot_open\");\n if (stored !== null) return stored === \"true\";\n } catch { /* sessionStorage unavailable */ }\n return defaultOpen;\n });\n\n // The user-adjustable width; persists across open/close cycles\n const [currentWidth, setCurrentWidth] = useState(() => {\n try {\n const stored = sessionStorage.getItem(\"crow_copilot_width\");\n if (stored) {\n const parsed = parseInt(stored, 10);\n if (parsed >= MIN_WIDTH && parsed <= MAX_WIDTH) return parsed;\n }\n } catch { /* sessionStorage unavailable */ }\n return initialWidth;\n });\n\n const [isDragging, setIsDragging] = useState(false);\n\n // Persist open/closed state\n useEffect(() => {\n try { sessionStorage.setItem(\"crow_copilot_open\", String(isOpen)); }\n catch { /* ignore */ }\n }, [isOpen]);\n\n // Persist width after resize\n useEffect(() => {\n try { sessionStorage.setItem(\"crow_copilot_width\", String(currentWidth)); }\n catch { /* ignore */ }\n }, [currentWidth]);\n\n // DOM refs for direct manipulation during drag (bypasses React render)\n const sidebarRef = useRef<HTMLDivElement>(null);\n const toggleRef = useRef<HTMLButtonElement>(null);\n\n // Refs for drag tracking (avoid stale closures)\n const dragStartXRef = useRef(0);\n const dragStartWidthRef = useRef(0);\n const hasDraggedRef = useRef(false);\n const liveWidthRef = useRef(initialWidth); // tracks width during drag without re-render\n const positionRef = useRef(position);\n positionRef.current = position;\n\n // Keep liveWidthRef in sync when React state changes (e.g. on mount)\n useEffect(() => {\n liveWidthRef.current = currentWidth;\n }, [currentWidth]);\n\n // Update CSS variable whenever width changes (non-drag updates)\n useEffect(() => {\n document.documentElement.style.setProperty(\n \"--crow-copilot-width\",\n `${currentWidth}px`\n );\n }, [currentWidth]);\n\n // Push body content when sidebar is open\n useEffect(() => {\n const className = `crow-copilot-open-${position}`;\n if (isOpen) {\n document.body.classList.add(className);\n } else {\n document.body.classList.remove(className);\n }\n\n return () => {\n document.body.classList.remove(className);\n };\n }, [isOpen, position]);\n\n // Expose imperative API on window\n useEffect(() => {\n (window as any).crowCopilot = {\n open: () => setIsOpen(true),\n close: () => setIsOpen(false),\n toggle: () => setIsOpen((prev) => !prev),\n };\n\n return () => {\n delete (window as any).crowCopilot;\n };\n }, []);\n\n // Listen for programmatic open/close via window.crow('open'/'close')\n useEffect(() => {\n const handleOpen = () => setIsOpen(true);\n const handleClose = () => setIsOpen(false);\n window.addEventListener(\"crow:open\", handleOpen);\n window.addEventListener(\"crow:close\", handleClose);\n return () => {\n window.removeEventListener(\"crow:open\", handleOpen);\n window.removeEventListener(\"crow:close\", handleClose);\n };\n }, []);\n\n // --- Drag-to-resize handlers (pure DOM, no React state during drag) ---\n\n const handleMouseMove = useCallback(\n (e: MouseEvent) => {\n const deltaX = e.clientX - dragStartXRef.current;\n\n // First time exceeding threshold: disable ALL transitions synchronously\n // before any width change, so the very first resize frame is instant.\n if (!hasDraggedRef.current && Math.abs(deltaX) >= DRAG_THRESHOLD) {\n hasDraggedRef.current = true;\n\n // Disable transitions on body (for margin push effect)\n document.body.style.transition = \"none\";\n document.body.style.cursor = \"col-resize\";\n document.body.style.userSelect = \"none\";\n document.body.classList.add(\"crow-copilot-resizing\");\n\n // Disable transitions on sidebar (inside Shadow DOM)\n if (sidebarRef.current) {\n sidebarRef.current.style.transition = \"none\";\n }\n\n // Disable transitions on toggle button (inside Shadow DOM)\n if (toggleRef.current) {\n toggleRef.current.style.transition = \"none\";\n }\n\n // React state update for visual class changes (non-critical path)\n setIsDragging(true);\n }\n\n if (!hasDraggedRef.current) return;\n\n // For right-positioned sidebar: dragging left = wider, dragging right = narrower\n // For left-positioned sidebar: dragging right = wider, dragging left = narrower\n const widthDelta = positionRef.current === \"right\" ? -deltaX : deltaX;\n const newWidth = Math.min(\n MAX_WIDTH,\n Math.max(MIN_WIDTH, dragStartWidthRef.current + widthDelta)\n );\n\n // Store live width for mouseup commit\n liveWidthRef.current = newWidth;\n\n // --- Direct DOM manipulation: instant, no React re-render ---\n const px = `${newWidth}px`;\n\n // 1. Update the CSS variable (drives toggle position + body margin)\n document.documentElement.style.setProperty(\"--crow-copilot-width\", px);\n\n // 2. Update sidebar element width directly\n if (sidebarRef.current) {\n sidebarRef.current.style.width = px;\n }\n },\n [] // no deps — we use refs for everything to avoid stale closures\n );\n\n const handleMouseUp = useCallback(() => {\n document.removeEventListener(\"mousemove\", handleMouseMove);\n document.removeEventListener(\"mouseup\", handleMouseUp);\n\n // Restore transitions and cursor\n document.body.style.transition = \"\";\n document.body.style.cursor = \"\";\n document.body.style.userSelect = \"\";\n document.body.classList.remove(\"crow-copilot-resizing\");\n if (sidebarRef.current) {\n sidebarRef.current.style.transition = \"\";\n }\n if (toggleRef.current) {\n toggleRef.current.style.transition = \"\";\n }\n\n if (hasDraggedRef.current) {\n // Commit the final width to React state (single re-render)\n setCurrentWidth(liveWidthRef.current);\n setIsDragging(false);\n } else {\n // No drag — treat as a click (toggle)\n setIsDragging(false);\n setIsOpen((prev) => !prev);\n }\n }, [handleMouseMove]);\n\n const handleToggleMouseDown = useCallback(\n (e: React.MouseEvent) => {\n // Only handle left-click, and only when sidebar is open\n if (e.button !== 0 || !isOpen) return;\n\n e.preventDefault();\n e.stopPropagation();\n\n dragStartXRef.current = e.clientX;\n dragStartWidthRef.current = liveWidthRef.current;\n hasDraggedRef.current = false;\n\n document.addEventListener(\"mousemove\", handleMouseMove);\n document.addEventListener(\"mouseup\", handleMouseUp);\n },\n [isOpen, handleMouseMove, handleMouseUp]\n );\n\n const handleToggleClick = useCallback(() => {\n // When the sidebar is closed, a click should open it.\n // When open, click vs drag is handled by mousedown/mouseup logic above,\n // so we only handle the closed-state click here.\n if (!isOpen) {\n setIsOpen(true);\n }\n // When open, toggle is handled by handleMouseUp (if no drag occurred)\n }, [isOpen]);\n\n return (\n <>\n <CopilotToggleButton\n ref={toggleRef}\n isOpen={isOpen}\n position={position}\n onClick={handleToggleClick}\n onMouseDown={handleToggleMouseDown}\n isDragging={isDragging}\n />\n\n <div\n ref={sidebarRef}\n className={`crow-copilot-sidebar crow-copilot-sidebar-${position} ${\n isOpen ? \"\" : \"closed\"\n }`}\n style={{ width: `${currentWidth}px` }}\n >\n {children({ close: () => setIsOpen(false), currentWidth })}\n </div>\n </>\n );\n}\n","/**\n * CrowCopilot - Sidebar chat panel\n *\n * Unlike CrowWidget, this component is designed to be mounted into\n * a user-provided container and works best as a sidebar in your app.\n *\n * Supports:\n * - Custom styles from DB or props\n * - Positioned left or right\n * - Identity verification via window.crow() API\n */\n\nimport { useState, useRef, useEffect, useCallback } from \"react\";\nimport { AnimatePresence } from \"framer-motion\";\n\n// Hooks\nimport { useChat } from \"./hooks/useChat\";\nimport { useConversations } from \"./hooks/useConversations\";\nimport { useCrowAPI } from \"./hooks/useCrowAPI\";\nimport { useCopilotStyles } from \"./hooks/useWidgetStyles\";\nimport { useWorkflow } from \"./hooks/useWorkflow\";\n\n// Context\nimport { CopilotStyleProvider } from \"./context/StyleContext\";\n\n// Components\nimport {\n MessagesContainer,\n MessageList,\n ConversationList,\n WorkflowPanel,\n PoweredByBadge,\n PromptInputBox,\n BrowserUseConfirmation,\n BrowserUseQuestion,\n SuggestedActions,\n} from \"./components/shared\";\nimport { ShadowContainer } from \"./components/ShadowContainer\";\nimport { CopilotContainer } from \"./components/copilot\";\n\n// Styles\nimport { WIDGET_CSS, injectCopilotBodyStyles } from \"./styles\";\n\n// Config\nimport type { CopilotStyleConfig } from \"./styles/types\";\nimport type { Message, ToolRenderers } from \"./types\";\n\nexport interface CrowCopilotProps {\n /** Product ID for this copilot */\n productId: string;\n /** API URL (defaults to relative path) */\n apiUrl?: string;\n /** Subdomain for multi-endpoint routing */\n subdomain?: string;\n /** Copilot variant: embedded (in-app) or floating (with toggle button) */\n variant?: \"embedded\" | \"floating\";\n /** Title shown in header (fallback if agentName not provided) */\n title?: string;\n /** Custom agent name shown in header (overrides API setting if provided) */\n agentName?: string;\n /** Custom welcome message (overrides API setting if provided) */\n welcomeMessage?: string;\n /** Position of the sidebar */\n position?: \"left\" | \"right\";\n /** Width of the sidebar */\n width?: number | string;\n /** Start with sidebar open (floating variant only) */\n defaultOpen?: boolean;\n /** Show close button */\n showClose?: boolean;\n /** Callback when close is clicked */\n onClose?: () => void;\n /** Custom styles to override DB and default styles */\n styles?: Partial<CopilotStyleConfig>;\n /** Skip fetching styles from API (use for preview mode) */\n previewMode?: boolean;\n /** Custom class name */\n className?: string;\n /** Callback when copilot is ready */\n onReady?: () => void;\n /** Custom navigation function for SPA-safe page navigation (e.g. router.push from Next.js or React Router) */\n navigate?: (path: string) => void;\n /** Callback fired when a server-side tool completes, with the tool name and full result data */\n onToolResult?: (toolName: string, result: Record<string, unknown>) => void;\n /**\n * Custom renderers for tool results. When a tool completes and a renderer\n * exists for its name, that component is rendered inline in the chat\n * instead of the default checkmark status.\n *\n * @example\n * ```tsx\n * toolRenderers={{\n * query_analytics_chart: ({ result }) => <MyChart data={result.data} />,\n * }}\n * ```\n */\n toolRenderers?: ToolRenderers;\n /**\n * Async function that returns a JWT for user identity verification.\n * Called on mount and automatically on 401 (token refresh).\n * Replaces the need for a separate component calling window.crow('identify').\n *\n * @example\n * ```tsx\n * getIdentityToken={async () => {\n * const res = await fetch('/api/crow-token');\n * const { token } = await res.json();\n * return token;\n * }}\n * ```\n */\n getIdentityToken?: () => Promise<string>;\n /**\n * Page context data sent with every message. Reactive — updates whenever\n * the object reference changes. Replaces window.crow('setContext', ...).\n *\n * @example\n * ```tsx\n * context={{ cmsContentItemId: \"abc-123\", agentBlogId: \"def-456\" }}\n * ```\n */\n context?: Record<string, unknown>;\n /**\n * ISO 639-1 language code (e.g., \"es\", \"fr\", \"ja\"). When set, the AI\n * responds in that language and the welcome message is translated.\n */\n language?: string;\n}\n\nexport function CrowCopilot({\n productId,\n apiUrl = \"\",\n subdomain,\n variant = \"embedded\",\n title = \"Copilot\",\n agentName: agentNameProp,\n welcomeMessage: welcomeMessageProp,\n position = \"right\",\n width = 400,\n defaultOpen = false,\n showClose = false,\n onClose,\n styles: propStyles,\n previewMode = false,\n className,\n onReady,\n navigate,\n onToolResult,\n toolRenderers,\n getIdentityToken,\n context,\n language,\n}: CrowCopilotProps) {\n // Fall back to window globals for script-tag users\n const effectiveGetIdentityToken = getIdentityToken || window.__crow_identity_token_fetcher;\n const effectiveOnToolResult = onToolResult || window.__crow_on_tool_result;\n const effectiveToolRenderers = toolRenderers || window.__crow_tool_renderers;\n\n // Fetch and merge styles\n const {\n styles,\n isLoading: isLoadingStyles,\n agentName: agentNameFromAPI,\n browserUseEnabled,\n pageNavigationEnabled,\n pageNavigationRoutes,\n persistAnonymousConversations,\n welcomeMessage: welcomeMessageFromAPI,\n selectedModel,\n toolConsentSettings,\n } = useCopilotStyles({\n productId,\n apiUrl,\n propStyles,\n skip: previewMode,\n language,\n });\n\n // Use prop if provided, otherwise use API value, fallback to title for agentName\n const agentName = agentNameProp ?? agentNameFromAPI ?? title;\n\n // Tool status — set via window.crow('setToolStatus', '...')\n const [toolStatus, setToolStatus] = useState<string>(\n () => (window as any).__crow_tool_status as string ?? \"\"\n );\n\n useEffect(() => {\n const handler = (e: Event) => setToolStatus((e as CustomEvent<string>).detail ?? \"\");\n window.addEventListener(\"crow:setToolStatus\", handler);\n return () => window.removeEventListener(\"crow:setToolStatus\", handler);\n }, []);\n\n // Greeting override — set via window.crow('setGreeting', '...')\n const [greetingOverride, setGreetingOverride] = useState<string | undefined>(\n () => (window as any).__crow_greeting as string | undefined\n );\n\n useEffect(() => {\n const handler = (e: Event) => setGreetingOverride((e as CustomEvent<string>).detail);\n window.addEventListener(\"crow:setGreeting\", handler);\n return () => window.removeEventListener(\"crow:setGreeting\", handler);\n }, []);\n\n const welcomeMessage = greetingOverride ?? welcomeMessageProp ?? welcomeMessageFromAPI;\n\n // Auto-loaded tools (e.g., navigateToPage)\n type ToolHandler = (args: Record<string, unknown>) => Promise<unknown> | unknown;\n const [autoTools, setAutoTools] = useState<Record<string, ToolHandler>>({});\n\n // Auto-load browser_use tool when enabled (SSR-safe dynamic import)\n const browserUseLoaded = autoTools.browser_use;\n useEffect(() => {\n if (\n browserUseEnabled &&\n !isLoadingStyles &&\n !browserUseLoaded\n ) {\n import(\"@usecrow/client/browser\")\n .then(({ createBrowserUseTool }) => {\n setAutoTools((prev) => ({\n ...prev,\n browser_use: createBrowserUseTool({ productId, apiUrl }),\n }));\n console.log(\"[Crow] browser_use tool auto-loaded\");\n })\n .catch((err) => {\n console.warn(\"[Crow] Failed to load browser_use:\", err);\n });\n }\n }, [browserUseEnabled, isLoadingStyles, productId, apiUrl, browserUseLoaded]);\n\n // Auto-load navigateToPage tool when page navigation is enabled\n useEffect(() => {\n if (\n pageNavigationEnabled &&\n pageNavigationRoutes.length > 0 &&\n !isLoadingStyles\n ) {\n (import(\"@usecrow/client\") as Promise<any>)\n .then(({ createNavigateToPageTool }) => {\n setAutoTools((prev) => ({\n ...prev,\n navigateToPage: createNavigateToPageTool(pageNavigationRoutes, navigate),\n }));\n console.log(\n `[Crow] navigateToPage tool auto-loaded with ${pageNavigationRoutes.length} routes`\n );\n })\n .catch((err) => {\n console.warn(\"[Crow] Failed to load navigateToPage:\", err);\n });\n }\n }, [pageNavigationEnabled, pageNavigationRoutes, isLoadingStyles, navigate]);\n\n // Register auto-loaded tools\n useEffect(() => {\n if (Object.keys(autoTools).length > 0) {\n window.crow?.(\"registerTools\", autoTools);\n }\n }, [autoTools]);\n\n // --- Embedded resizable sidebar state (persisted via sessionStorage) ---\n const embeddedInitialWidth =\n typeof width === \"number\" ? width : parseInt(String(width), 10) || 400;\n const [embeddedWidth, setEmbeddedWidth] = useState(() => {\n try {\n const stored = sessionStorage.getItem(\"crow_embedded_width\");\n if (stored) {\n const parsed = parseInt(stored, 10);\n if (parsed >= 280 && parsed <= 800) return parsed;\n }\n } catch { /* ignore */ }\n return embeddedInitialWidth;\n });\n const [isCollapsed, setIsCollapsed] = useState(() => {\n try {\n return sessionStorage.getItem(\"crow_embedded_collapsed\") === \"true\";\n } catch { return false; }\n });\n\n // Persist embedded state changes\n useEffect(() => {\n try { sessionStorage.setItem(\"crow_embedded_width\", String(embeddedWidth)); }\n catch { /* ignore */ }\n }, [embeddedWidth]);\n useEffect(() => {\n try { sessionStorage.setItem(\"crow_embedded_collapsed\", String(isCollapsed)); }\n catch { /* ignore */ }\n }, [isCollapsed]);\n\n // DOM refs for direct manipulation during drag (zero React re-renders)\n const embeddedContentRef = useRef<HTMLDivElement>(null);\n const embeddedToggleRef = useRef<HTMLButtonElement>(null);\n const embeddedDragStartX = useRef(0);\n const embeddedDragStartW = useRef(0);\n const embeddedHasDragged = useRef(false);\n const embeddedLiveWidth = useRef(embeddedInitialWidth);\n const positionRef = useRef(position);\n positionRef.current = position;\n\n // Keep live width in sync with React state\n useEffect(() => {\n embeddedLiveWidth.current = embeddedWidth;\n }, [embeddedWidth]);\n\n // Drag-to-resize: direct DOM, no React re-renders until mouseup\n const embeddedMouseMove = useCallback((e: MouseEvent) => {\n const dx = e.clientX - embeddedDragStartX.current;\n if (!embeddedHasDragged.current && Math.abs(dx) >= 5) {\n embeddedHasDragged.current = true;\n // Lock cursor + disable text selection on body for the entire drag\n document.body.style.cursor = \"col-resize\";\n document.body.style.userSelect = \"none\";\n }\n if (!embeddedHasDragged.current) return;\n\n const delta = positionRef.current === \"right\" ? -dx : dx;\n const newW = Math.min(800, Math.max(280, embeddedDragStartW.current + delta));\n embeddedLiveWidth.current = newW;\n\n // Direct DOM: update the content wrapper width → flex layout reflows instantly\n if (embeddedContentRef.current) {\n embeddedContentRef.current.style.width = `${newW}px`;\n }\n }, []);\n\n const embeddedMouseUp = useCallback(() => {\n document.removeEventListener(\"mousemove\", embeddedMouseMove);\n document.removeEventListener(\"mouseup\", embeddedMouseUp);\n document.body.style.cursor = \"\";\n document.body.style.userSelect = \"\";\n\n if (embeddedHasDragged.current) {\n setEmbeddedWidth(embeddedLiveWidth.current);\n } else {\n // No drag = click → toggle collapse/expand\n setIsCollapsed((prev) => !prev);\n }\n }, [embeddedMouseMove]);\n\n const embeddedHandleMouseDown = useCallback(\n (e: React.MouseEvent) => {\n if (e.button !== 0) return;\n // When collapsed, a click should just expand (no drag)\n if (isCollapsed) return;\n e.preventDefault();\n e.stopPropagation();\n embeddedDragStartX.current = e.clientX;\n embeddedDragStartW.current = embeddedLiveWidth.current;\n embeddedHasDragged.current = false;\n document.addEventListener(\"mousemove\", embeddedMouseMove);\n document.addEventListener(\"mouseup\", embeddedMouseUp);\n },\n [isCollapsed, embeddedMouseMove, embeddedMouseUp]\n );\n\n const embeddedHandleClick = useCallback(() => {\n if (isCollapsed) {\n setIsCollapsed(false);\n }\n // When expanded, toggle is handled by mousedown/mouseup (drag vs click)\n }, [isCollapsed]);\n\n // Default (page-level) suggested actions set via window.crow('setSuggestedActions', ...)\n const defaultSuggestedActionsRef = useRef<Array<{ label: string; message: string }>>([]);\n\n // Listen for programmatic open/close/setSuggestedActions commands\n useEffect(() => {\n const handleOpen = () => setIsCollapsed(false);\n const handleClose = () => setIsCollapsed(true);\n const handleSetSuggestions = (e: Event) => {\n const actions = (e as CustomEvent).detail;\n if (Array.isArray(actions)) {\n defaultSuggestedActionsRef.current = actions;\n chat.setSuggestedActions(actions);\n }\n };\n window.addEventListener(\"crow:open\", handleOpen);\n window.addEventListener(\"crow:close\", handleClose);\n window.addEventListener(\"crow:setSuggestedActions\", handleSetSuggestions);\n\n // Pick up actions that were set before this listener attached (queue replay timing)\n const pending = (window as any).__crow_suggested_actions;\n if (Array.isArray(pending) && pending.length > 0) {\n defaultSuggestedActionsRef.current = pending;\n chat.setSuggestedActions(pending);\n }\n\n return () => {\n window.removeEventListener(\"crow:open\", handleOpen);\n window.removeEventListener(\"crow:close\", handleClose);\n window.removeEventListener(\"crow:setSuggestedActions\", handleSetSuggestions);\n };\n }, []);\n\n // Refs\n const messagesContainerRef = useRef<HTMLDivElement>(null);\n const tabsScrollRef = useRef<HTMLDivElement>(null);\n const executeClientToolRef = useRef<\n | ((toolName: string, args: Record<string, unknown>) => Promise<unknown>)\n | null\n >(null);\n const submitToolResultRef = useRef<\n | ((\n toolCallId: string,\n toolName: string,\n result: Record<string, unknown>,\n ) => Promise<void>)\n | null\n >(null);\n\n // UI State\n const [showConversationList, setShowConversationList] = useState(false);\n const [isVerifiedUser, setIsVerifiedUser] = useState(false);\n const [localTabs, setLocalTabs] = useState<Array<{ id: string; name: string }>>([\n { id: \"local-1\", name: \"Chat 1\" },\n ]);\n const [activeLocalTabId, setActiveLocalTabId] = useState(\"local-1\");\n const [localTabMessages, setLocalTabMessages] = useState<Record<string, Message[]>>({});\n const [localTabCounter, setLocalTabCounter] = useState(1);\n\n // Browser automation state\n const [isBrowserUseActive, setIsBrowserUseActive] = useState(false);\n const [pendingConfirmation, setPendingConfirmation] = useState<{\n instruction: string;\n resolve: (confirmed: boolean) => void;\n } | null>(null);\n\n\n const [askUserResolver, setAskUserResolver] = useState<{\n resolve: (answer: string) => void;\n reject: (reason?: unknown) => void;\n } | null>(null);\n\n // The question text to show in the UI when browser automation asks the user\n const [browserQuestion, setBrowserQuestion] = useState<string | null>(null);\n\n // Conversations hook\n const conversations = useConversations({ productId, apiUrl });\n\n // Track if we need to restore history on mount\n const [shouldRestoreHistory, setShouldRestoreHistory] = useState(false);\n const hasRestoredHistoryRef = useRef(false);\n\n // Persist active conversationId across page reloads\n const activeConvStorageKey = `crow_active_conv_${productId}`;\n const pendingRestoreConvId = useRef<string | null>(null);\n const hasRestoredActiveConvRef = useRef(false);\n // Read on mount (synchronous, before any effects)\n if (pendingRestoreConvId.current === null) {\n try {\n pendingRestoreConvId.current = localStorage.getItem(activeConvStorageKey) || \"\";\n } catch {\n pendingRestoreConvId.current = \"\";\n }\n }\n\n // Chat hook\n const chat = useChat({\n productId,\n apiUrl,\n persistAnonymousConversations,\n welcomeMessage,\n selectedModel,\n subdomain,\n toolConsentSettings,\n language,\n onVerificationStatus: (isVerified) => {\n setIsVerifiedUser(isVerified);\n },\n onConversationId: () => {},\n onWorkflowEvent: (event) => {\n switch (event.type) {\n case \"started\":\n if (event.name && event.todos) {\n startWorkflow(event.name, event.todos);\n }\n break;\n case \"todo_updated\":\n if (event.todoId && event.todoStatus) {\n updateTodo(event.todoId, event.todoStatus);\n }\n break;\n case \"ended\":\n endWorkflow(2000);\n break;\n case \"complete_prompt\":\n markComplete();\n break;\n }\n },\n onToolResult: effectiveOnToolResult,\n onToolCall: async (event) => {\n if (event.type === \"client_call\" && event.toolName && event.toolCallId) {\n // Original non-consent flow\n try {\n const result = await executeClientToolRef.current?.(\n event.toolName,\n (event.arguments || {}) as Record<string, unknown>,\n );\n\n // Don't send result if user cancelled/declined - just stop\n const resultObj = result as Record<string, unknown>;\n const dataObj = resultObj?.data as Record<string, unknown> | undefined;\n const wasUserCancelled =\n dataObj?.declined === true ||\n (typeof resultObj?.error === 'string' && resultObj.error.includes('cancelled by user')) ||\n (typeof resultObj?.error === 'string' && resultObj.error.includes('declined'));\n\n if (wasUserCancelled) {\n console.log('[Crow Copilot] Tool was cancelled by user');\n if (submitToolResultRef.current) {\n await submitToolResultRef.current(\n event.toolCallId,\n event.toolName,\n { success: false, cancelled: true, error: 'Action was cancelled by the user.' },\n );\n }\n return;\n }\n\n // Send result back to agent so it can continue\n if (result && submitToolResultRef.current) {\n await submitToolResultRef.current(\n event.toolCallId,\n event.toolName,\n result as Record<string, unknown>,\n );\n }\n } catch (e) {\n console.error(\"[Crow Copilot] Tool error:\", e);\n if (submitToolResultRef.current) {\n await submitToolResultRef.current(\n event.toolCallId,\n event.toolName,\n { success: false, error: String(e) },\n );\n }\n }\n }\n },\n onRestoredConversation: () => {\n setShouldRestoreHistory(true);\n },\n });\n\n // Load anonymous conversation history when restored from localStorage\n useEffect(() => {\n if (\n shouldRestoreHistory &&\n chat.conversationId &&\n !hasRestoredHistoryRef.current\n ) {\n hasRestoredHistoryRef.current = true;\n conversations\n .loadAnonymousConversationHistory(chat.conversationId)\n .then((historyMessages) => {\n if (historyMessages.length > 0) {\n chat.loadMessages(historyMessages);\n }\n });\n }\n }, [shouldRestoreHistory, chat.conversationId, conversations, chat]);\n\n // Restore conversation for anonymous users after styles load.\n // Verified users are handled in onIdentified; this only covers\n // the case where no identity token fetcher is provided (anonymous-only mode).\n useEffect(() => {\n // Skip entirely when an identity token fetcher exists — onIdentified will\n // handle restoration once verification completes. Without this guard the\n // 500ms timer races against the async identity flow and almost always wins,\n // consuming the pending conversation ID before onIdentified can use it.\n if (effectiveGetIdentityToken) return;\n if (isLoadingStyles || hasRestoredActiveConvRef.current) return;\n\n const timer = setTimeout(() => {\n if (hasRestoredActiveConvRef.current || isVerifiedUser) return;\n const savedId = pendingRestoreConvId.current;\n if (!savedId) return;\n hasRestoredActiveConvRef.current = true;\n pendingRestoreConvId.current = \"\";\n\n conversations\n .loadAnonymousConversationHistory(savedId)\n .then((historyMessages) => {\n if (historyMessages.length > 0) {\n chat.loadMessages(historyMessages);\n chat.setConversationId(savedId);\n }\n })\n .catch(() => {\n // Conversation may no longer exist; start fresh\n });\n }, 500);\n\n return () => clearTimeout(timer);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isLoadingStyles, effectiveGetIdentityToken]);\n\n // Save active conversationId to localStorage whenever it changes\n useEffect(() => {\n try {\n if (chat.conversationId) {\n localStorage.setItem(activeConvStorageKey, chat.conversationId);\n }\n } catch {\n // localStorage unavailable\n }\n }, [chat.conversationId, activeConvStorageKey]);\n\n // Inject body styles for floating variant (push effect)\n // These must be in document.head, not Shadow DOM, to affect the body element\n useEffect(() => {\n if (variant === \"floating\") {\n injectCopilotBodyStyles();\n }\n }, [variant]);\n\n // Workflow hook (single instance for both UI state and exit actions)\n const {\n activeWorkflow,\n startWorkflow,\n updateTodo,\n markComplete,\n endWorkflow,\n exitWorkflow,\n } = useWorkflow({\n productId,\n apiUrl,\n conversationId: chat.conversationId,\n selectedModel: chat.selectedModel,\n onMessage: (content) => {\n chat.loadMessages([\n ...chat.messages,\n {\n id: `bot-${Date.now()}`,\n content,\n isBot: true,\n timestamp: new Date(),\n },\n ]);\n },\n });\n\n // Crow API hook\n const { executeClientTool } = useCrowAPI({\n onIdentified: async () => {\n setIsVerifiedUser(true);\n await conversations.loadConversations();\n\n // Restore the last active conversation from previous session\n const savedId = pendingRestoreConvId.current;\n if (savedId && !hasRestoredActiveConvRef.current) {\n hasRestoredActiveConvRef.current = true;\n pendingRestoreConvId.current = \"\"; // consumed\n try {\n const historyMessages = await conversations.loadConversationHistory(savedId);\n if (historyMessages.length > 0) {\n chat.loadMessages(historyMessages);\n chat.setConversationId(savedId);\n }\n } catch {\n // Conversation may have been deleted; ignore and show fresh chat\n }\n }\n },\n onReset: () => {\n setIsVerifiedUser(false);\n chat.resetMessages();\n },\n });\n\n executeClientToolRef.current = executeClientTool;\n submitToolResultRef.current = chat.submitToolResult;\n\n // Browser automation callbacks\n const handleBrowserConfirmation = useCallback(\n (instruction: string): Promise<boolean> => {\n return new Promise((resolve) => {\n setPendingConfirmation({ instruction, resolve });\n });\n },\n [],\n );\n\n const handleBrowserQuestion = useCallback(\n (question: string): Promise<string> => {\n return new Promise((resolve, reject) => {\n // Reject any pending resolver before overwriting to avoid hanging promises\n setAskUserResolver((prev) => {\n if (prev) {\n prev.reject(new Error(\"Superseded by new browser question\"));\n }\n return { resolve, reject };\n });\n setBrowserQuestion(question);\n // Add the question as a bot message in the chat (persisted to server)\n chat.addMessage(\"assistant\", question);\n });\n },\n [chat],\n );\n\n const handleBrowserProgress = useCallback(\n (step: number, maxSteps: number) => {\n // If step indicates completion or error, clear active state\n if (step >= maxSteps || step === -1) {\n setIsBrowserUseActive(false);\n }\n },\n [],\n );\n\n const handleExitWorkflow = async () => {\n await exitWorkflow();\n };\n\n // Handle tool consent Allow/Deny from inline buttons\n const handleToolConsent = async (toolCallId: string, approved: boolean) => {\n const toolCall = chat.activeToolCalls.find((tc) => tc.id === toolCallId)\n || chat.messages.flatMap((m) => m.toolCalls || []).find((tc) => tc.id === toolCallId);\n\n if (!toolCall) return;\n\n const isClientSide = !toolCall.serverSideExecution;\n\n if (approved) {\n chat.updateToolCallStatus(toolCallId, \"executing\");\n\n if (isClientSide) {\n // Client-side tool: execute locally, then submit result\n try {\n const result = await executeClientToolRef.current?.(\n toolCall.name,\n (toolCall.arguments || {}) as Record<string, unknown>,\n );\n\n const resultObj = result as Record<string, unknown>;\n const dataObj = resultObj?.data as Record<string, unknown> | undefined;\n const wasUserCancelled =\n dataObj?.declined === true ||\n (typeof resultObj?.error === 'string' && resultObj.error.includes('cancelled by user')) ||\n (typeof resultObj?.error === 'string' && resultObj.error.includes('declined'));\n\n if (wasUserCancelled) {\n console.log('[Crow Copilot] Tool was cancelled by user after consent');\n if (submitToolResultRef.current) {\n await submitToolResultRef.current(\n toolCallId,\n toolCall.name,\n { success: false, cancelled: true, error: 'Action was cancelled by the user.' },\n );\n }\n return;\n }\n\n if (result && submitToolResultRef.current) {\n await submitToolResultRef.current(\n toolCallId,\n toolCall.name,\n result as Record<string, unknown>,\n );\n }\n } catch (e) {\n console.error(\"[Crow Copilot] Tool error after consent:\", e);\n if (submitToolResultRef.current) {\n await submitToolResultRef.current(\n toolCallId,\n toolCall.name,\n { success: false, error: String(e) },\n );\n }\n }\n } else {\n // Server-side tool: submit consent approval — backend will execute\n if (submitToolResultRef.current) {\n await submitToolResultRef.current(\n toolCallId,\n toolCall.name,\n { consent_approved: true, tool_arguments: toolCall.arguments || {} },\n );\n }\n }\n } else {\n chat.updateToolCallStatus(toolCallId, \"denied\");\n if (submitToolResultRef.current) {\n await submitToolResultRef.current(\n toolCallId,\n toolCall.name,\n { status: \"denied\", error: \"User denied permission to execute this tool.\" },\n );\n }\n }\n };\n\n // Set up global browser callbacks for the SDK to use\n useEffect(() => {\n (window as any).__crow_browser_callbacks = {\n onConfirmation: handleBrowserConfirmation,\n onQuestion: handleBrowserQuestion,\n onProgress: handleBrowserProgress,\n };\n return () => {\n delete (window as any).__crow_browser_callbacks;\n };\n }, [handleBrowserConfirmation, handleBrowserQuestion, handleBrowserProgress]);\n\n // Notify when ready\n useEffect(() => {\n if (!isLoadingStyles) {\n onReady?.();\n }\n }, [isLoadingStyles, onReady]);\n\n // Declarative identity: call getIdentityToken on mount and on token refresh\n useEffect(() => {\n if (!effectiveGetIdentityToken || isLoadingStyles) return;\n\n let cancelled = false;\n\n const identify = async () => {\n try {\n const token = await effectiveGetIdentityToken();\n if (!cancelled && token) {\n window.crow?.(\"identify\", { token });\n }\n } catch (e) {\n console.error(\"[Crow] getIdentityToken failed:\", e);\n }\n };\n\n // Initial identification\n identify();\n\n // Auto-refresh on 401\n const handleRefresh = () => identify();\n window.addEventListener(\"crow:token-refresh-needed\", handleRefresh);\n\n return () => {\n cancelled = true;\n window.removeEventListener(\"crow:token-refresh-needed\", handleRefresh);\n };\n }, [effectiveGetIdentityToken, isLoadingStyles]);\n\n // Declarative context: sync context prop to window.__crow_page_context\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n if (context && Object.keys(context).length > 0) {\n (window as any).__crow_page_context = context;\n } else {\n (window as any).__crow_page_context = undefined;\n }\n }, [context]);\n\n // Handlers\n const handleSend = (message: string) => {\n if (!message.trim()) return;\n\n // If browser_use is waiting for user input, route the message there instead of chat\n if (askUserResolver) {\n // Add user's answer to chat (persisted to server)\n chat.addMessage(\"user\", message);\n askUserResolver.resolve(message);\n setAskUserResolver(null);\n setBrowserQuestion(null);\n return;\n }\n\n chat.sendMessage(message);\n };\n\n const handleStop = () => {\n // Stop the chat/tool generation FIRST to kill any streaming responses\n chat.stopGeneration();\n\n // Snapshot and clear resolver synchronously to avoid stale captures in async callbacks\n const currentResolver = askUserResolver;\n setAskUserResolver(null);\n setBrowserQuestion(null);\n\n // Stop any active browser_use automation (sets abort flag)\n if (browserUseEnabled && isBrowserUseActive) {\n import(\"@usecrow/client/browser\")\n .then(({ stopActiveBrowserUse }) => {\n stopActiveBrowserUse();\n // Reject the snapshotted resolver AFTER abort flag is set\n currentResolver?.reject(new Error(\"Stopped by user\"));\n })\n .catch(() => {\n currentResolver?.reject(new Error(\"Stopped by user\"));\n });\n setIsBrowserUseActive(false);\n } else if (currentResolver) {\n currentResolver.reject(new Error(\"Stopped by user\"));\n }\n\n // Clear any pending confirmation dialog\n if (pendingConfirmation) {\n pendingConfirmation.resolve(false);\n setPendingConfirmation(null);\n }\n };\n\n const handleNewChat = () => {\n if (!isVerifiedUser) {\n setLocalTabMessages((prev) => ({\n ...prev,\n [activeLocalTabId]: chat.messages,\n }));\n const nextIndex = localTabCounter + 1;\n const nextId = `local-${nextIndex}`;\n setLocalTabs((prev) => [...prev, { id: nextId, name: `Chat ${nextIndex}` }]);\n setActiveLocalTabId(nextId);\n setLocalTabCounter(nextIndex);\n }\n chat.resetMessages();\n setShowConversationList(false);\n };\n\n const handleToggleHistory = () => {\n if (!isVerifiedUser) {\n return;\n }\n setShowConversationList(!showConversationList);\n if (!showConversationList) {\n conversations.loadConversations();\n }\n };\n\n const handleSelectConversation = async (convId: string) => {\n const historyMessages = await conversations.loadConversationHistory(convId);\n if (historyMessages.length > 0) {\n chat.loadMessages(historyMessages);\n chat.setConversationId(convId);\n } else {\n chat.resetMessages();\n }\n setShowConversationList(false);\n };\n\n const handleSelectLocalTab = (tabId: string) => {\n if (tabId === activeLocalTabId) return;\n setLocalTabMessages((prev) => ({\n ...prev,\n [activeLocalTabId]: chat.messages,\n }));\n const nextMessages = localTabMessages[tabId];\n if (nextMessages && nextMessages.length > 0) {\n chat.loadMessages(nextMessages);\n } else {\n chat.resetMessages();\n }\n setActiveLocalTabId(tabId);\n setShowConversationList(false);\n };\n\n const handleCloseConversationList = () => {\n setShowConversationList(false);\n };\n\n // Tab hover state (for showing close button)\n const [hoveredTabId, setHoveredTabId] = useState<string | null>(null);\n\n // Hidden server tab IDs (removed from view, not deleted from server)\n const [hiddenServerTabIds, setHiddenServerTabIds] = useState<Set<string>>(new Set());\n\n const handleCloseTab = (tabId: string, tabType: \"local\" | \"server\" | \"new\") => {\n if (tabType === \"new\") return; // can't close \"New Chat\"\n\n if (tabType === \"local\") {\n // Don't close the last local tab\n if (localTabs.length <= 1) return;\n\n if (activeLocalTabId === tabId) {\n // Closing the active tab — switch to an adjacent one.\n // First, snapshot the current messages into the map so we have\n // the latest state for all tabs before deciding what to load.\n const updatedMessages = {\n ...localTabMessages,\n [activeLocalTabId]: chat.messages,\n };\n\n const idx = localTabs.findIndex((t) => t.id === tabId);\n const nextTab = localTabs[idx + 1] || localTabs[idx - 1];\n if (nextTab) {\n const nextMessages = updatedMessages[nextTab.id];\n if (nextMessages && nextMessages.length > 0) {\n chat.loadMessages(nextMessages);\n } else {\n chat.resetMessages();\n }\n setActiveLocalTabId(nextTab.id);\n }\n\n // Remove the closed tab's messages from the map\n delete updatedMessages[tabId];\n setLocalTabMessages(updatedMessages);\n } else {\n // Closing a non-active tab — just remove it from the list and map\n setLocalTabMessages((prev) => {\n const next = { ...prev };\n delete next[tabId];\n return next;\n });\n }\n\n setLocalTabs((prev) => prev.filter((t) => t.id !== tabId));\n }\n\n if (tabType === \"server\") {\n // If closing the active server tab, switch to New Chat\n if (chat.conversationId === tabId) {\n chat.resetMessages();\n chat.setConversationId(null);\n }\n setHiddenServerTabIds((prev) => new Set(prev).add(tabId));\n }\n };\n\n const sortedConversations = isVerifiedUser\n ? [...conversations.conversations].sort(\n (a, b) =>\n new Date(b.updated_at).getTime() - new Date(a.updated_at).getTime()\n )\n : [];\n\n const tabs = isVerifiedUser\n ? [\n { id: \"new\", name: \"New Chat\", type: \"new\" as const },\n ...sortedConversations\n .filter((conv) => !hiddenServerTabIds.has(conv.id))\n .map((conv, idx) => ({\n id: conv.id,\n name: conv.name || `Chat ${idx + 1}`,\n type: \"server\" as const,\n })),\n ]\n : localTabs.map((tab) => ({ ...tab, type: \"local\" as const }));\n\n const activeTabId = isVerifiedUser\n ? chat.conversationId ?? \"new\"\n : activeLocalTabId;\n\n // Refresh the conversation list when the user becomes verified or when a new\n // server conversation is created. We track the previous conversationId to\n // avoid reloading on every render — only when it transitions from null to a\n // real value (i.e. the server assigned a new conversation ID).\n const prevConversationIdRef = useRef<string | null | undefined>(undefined);\n useEffect(() => {\n if (!isVerifiedUser) return;\n\n const currentId = chat.conversationId;\n const prevId = prevConversationIdRef.current;\n prevConversationIdRef.current = currentId;\n\n // First run (prevId is undefined) or null -> string transition\n if (prevId === undefined || (prevId === null && currentId !== null)) {\n conversations.loadConversations();\n }\n }, [isVerifiedUser, chat.conversationId, conversations.loadConversations]);\n\n // Tab scrolling state\n const [canScrollRight, setCanScrollRight] = useState(false);\n\n const checkTabsOverflow = useCallback(() => {\n const el = tabsScrollRef.current;\n if (!el) return;\n setCanScrollRight(el.scrollWidth > el.clientWidth + el.scrollLeft + 1);\n }, []);\n\n const handleTabsScroll = useCallback(() => {\n checkTabsOverflow();\n }, [checkTabsOverflow]);\n\n const handleScrollRight = useCallback(() => {\n const el = tabsScrollRef.current;\n if (!el) return;\n el.scrollBy({ left: 120, behavior: \"smooth\" });\n }, []);\n\n // Re-check overflow when tabs change\n useEffect(() => {\n checkTabsOverflow();\n }, [tabs.length, checkTabsOverflow]);\n\n const widthStyle = typeof width === \"number\" ? `${width}px` : width;\n\n const renderCopilotContent = (overrideOnClose?: () => void, forceShowClose?: boolean, overrideWidth?: number | string) => (\n <CopilotStyleProvider\n styles={styles}\n agentName={agentName}\n isLoading={isLoadingStyles}\n >\n <div\n className={`crow-flex crow-flex-col crow-h-full ${\n position === \"left\" ? \"crow-border-r\" : \"crow-border-l\"\n } ${className || \"\"}`}\n style={{\n width: overrideWidth\n ? (typeof overrideWidth === \"number\" ? `${overrideWidth}px` : overrideWidth)\n : widthStyle,\n fontFamily: styles.typography.fontFamily,\n fontSize: styles.typography.fontSize,\n fontWeight: styles.typography.fontWeight,\n lineHeight: styles.typography.lineHeight,\n letterSpacing: styles.typography.letterSpacing,\n background: styles.colors.background,\n borderColor: styles.colors.border,\n }}\n >\n {/* Tab Bar */}\n <div\n className=\"crow-flex crow-items-stretch crow-border-b crow-min-h-[40px]\"\n style={{ borderColor: styles.colors.border }}\n >\n {/* Scrollable tabs area */}\n <div\n ref={tabsScrollRef}\n className=\"crow-flex crow-items-stretch crow-flex-1 crow-min-w-0 crow-overflow-x-auto\"\n style={{\n scrollbarWidth: \"none\",\n msOverflowStyle: \"none\",\n }}\n onScroll={handleTabsScroll}\n >\n {tabs.map((tab, idx) => {\n const isActive = activeTabId === tab.id;\n const isHovered = hoveredTabId === tab.id;\n const isCloseable = tab.type !== \"new\" && (tab.type !== \"local\" || localTabs.length > 1);\n return (\n <div\n key={`${tab.id}-${idx}`}\n className={`crow-relative crow-flex-shrink-0 crow-flex crow-items-center crow-text-[13px] crow-leading-tight crow-py-2.5 crow-transition-colors crow-select-none crow-cursor-pointer ${\n isActive\n ? \"crow-text-gray-900 crow-font-medium\"\n : \"crow-text-gray-500 hover:crow-text-gray-700 hover:crow-bg-gray-50\"\n }`}\n style={{\n maxWidth: \"180px\",\n borderRight: idx < tabs.length - 1 ? `1px solid ${styles.colors.border}` : \"none\",\n paddingLeft: \"16px\",\n paddingRight: isCloseable ? \"8px\" : \"16px\",\n }}\n title={tab.name}\n onMouseEnter={() => setHoveredTabId(tab.id)}\n onMouseLeave={() => setHoveredTabId(null)}\n onClick={() => {\n if (tab.type === \"new\") {\n handleNewChat();\n return;\n }\n if (tab.type === \"server\") {\n handleSelectConversation(tab.id);\n return;\n }\n handleSelectLocalTab(tab.id);\n }}\n >\n <span\n className=\"crow-block crow-truncate\"\n style={{ maxWidth: isCloseable ? \"112px\" : \"128px\" }}\n >\n {tab.name}\n </span>\n {/* Close button - visible on hover */}\n {isCloseable && (\n <span\n className=\"crow-rounded crow-p-0.5 crow-flex-shrink-0 crow-inline-flex crow-items-center crow-justify-center crow-transition-opacity hover:crow-bg-gray-200\"\n style={{\n marginLeft: \"6px\",\n opacity: isHovered ? 1 : 0,\n pointerEvents: isHovered ? \"auto\" : \"none\",\n }}\n onClick={(e) => {\n e.stopPropagation();\n handleCloseTab(tab.id, tab.type);\n }}\n role=\"button\"\n aria-label={`Close ${tab.name}`}\n >\n <TabCloseIcon className=\"crow-w-3 crow-h-3 crow-text-gray-400 hover:crow-text-gray-600\" />\n </span>\n )}\n {/* Active indicator bar */}\n {isActive && (\n <span\n className=\"crow-absolute crow-bottom-0 crow-left-0 crow-right-0\"\n style={{\n height: \"2px\",\n background: styles.colors.primary || \"#2563eb\",\n }}\n />\n )}\n </div>\n );\n })}\n </div>\n\n {/* Action buttons - pinned right */}\n <div\n className=\"crow-flex crow-items-center crow-flex-shrink-0 crow-border-l\"\n style={{ borderColor: styles.colors.border }}\n >\n {/* New Chat */}\n <button\n onClick={handleNewChat}\n className=\"crow-p-2 hover:crow-bg-gray-100 crow-transition-colors\"\n aria-label=\"New Chat\"\n title=\"New Chat\"\n >\n <PlusIcon className=\"crow-w-4 crow-h-4 crow-text-gray-500\" />\n </button>\n\n {/* History */}\n <button\n onClick={handleToggleHistory}\n disabled={!isVerifiedUser}\n aria-disabled={!isVerifiedUser}\n className={`crow-p-2 crow-transition-colors ${\n showConversationList ? \"crow-bg-gray-100\" : \"hover:crow-bg-gray-100\"\n } ${!isVerifiedUser ? \"crow-opacity-40 crow-cursor-not-allowed\" : \"\"}`}\n aria-label=\"Conversation History\"\n title={\n isVerifiedUser ? \"Conversation History\" : \"Sign in to view history\"\n }\n >\n <HistoryIcon className=\"crow-w-4 crow-h-4 crow-text-gray-500\" />\n </button>\n\n {/* Scroll right chevron - only visible when there's overflow */}\n {canScrollRight && (\n <button\n onClick={handleScrollRight}\n className=\"crow-p-2 hover:crow-bg-gray-100 crow-transition-colors\"\n aria-label=\"Scroll tabs\"\n title=\"Scroll tabs\"\n >\n <ChevronRightIcon className=\"crow-w-4 crow-h-4 crow-text-gray-500\" />\n </button>\n )}\n\n {/* Close button */}\n {(forceShowClose ?? showClose) && (overrideOnClose ?? onClose) && (\n <button\n onClick={overrideOnClose ?? onClose}\n className=\"crow-p-2 hover:crow-bg-gray-100 crow-transition-colors\"\n aria-label=\"Close\"\n >\n <CloseIcon className=\"crow-w-4 crow-h-4 crow-text-gray-500\" />\n </button>\n )}\n </div>\n </div>\n\n {/* Conversation List */}\n <AnimatePresence>\n {showConversationList && isVerifiedUser && (\n <ConversationList\n conversations={conversations.conversations}\n currentConversationId={chat.conversationId}\n onSelect={handleSelectConversation}\n onClose={handleCloseConversationList}\n />\n )}\n {showConversationList && !isVerifiedUser && (\n <div className=\"crow-mb-3 crow-rounded-xl crow-bg-gray-50 crow-border crow-border-gray-200 crow-p-4\">\n <div className=\"crow-text-sm crow-text-gray-600\">\n Sign in to view conversation history.\n </div>\n </div>\n )}\n </AnimatePresence>\n\n <AnimatePresence>\n {activeWorkflow && (\n <WorkflowPanel\n workflow={activeWorkflow}\n onExit={handleExitWorkflow}\n />\n )}\n </AnimatePresence>\n\n {/* Messages */}\n <MessagesContainer ref={messagesContainerRef}>\n <MessageList\n messages={chat.messages}\n activeToolCalls={chat.activeToolCalls}\n isLoadingHistory={conversations.isLoadingHistory}\n isGenerating={chat.isLoading}\n toolRenderers={effectiveToolRenderers}\n onToolConsent={handleToolConsent}\n />\n\n {/* Browser automation confirmation */}\n {pendingConfirmation && (\n <div className=\"crow-px-4 crow-py-2\">\n <BrowserUseConfirmation\n instruction={pendingConfirmation.instruction}\n onAllow={() => {\n pendingConfirmation.resolve(true);\n setPendingConfirmation(null);\n }}\n onDeny={() => {\n pendingConfirmation.resolve(false);\n setPendingConfirmation(null);\n }}\n />\n </div>\n )}\n\n\n {/* Browser automation question */}\n {askUserResolver && browserQuestion && (\n <div className=\"crow-px-4 crow-py-2\">\n <BrowserUseQuestion\n question={browserQuestion}\n onSubmit={(answer) => {\n askUserResolver.resolve(answer);\n setAskUserResolver(null);\n setBrowserQuestion(null);\n }}\n />\n </div>\n )}\n </MessagesContainer>\n\n {/* Input */}\n <div\n className=\"crow-p-3 crow-border-t\"\n style={{ borderColor: styles.colors.border }}\n >\n {toolStatus && (\n <div className=\"crow-mb-1 crow-flex crow-items-center crow-gap-2 crow-rounded-lg crow-border crow-border-[var(--crow-border,#e5e7eb)] crow-bg-[var(--crow-bg-secondary,#f3f4f6)] crow-px-3 crow-py-2 crow-text-sm\">\n <svg className=\"crow-animate-spin crow-h-4 crow-w-4 crow-shrink-0 crow-text-[var(--crow-primary,#7c3aed)]\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle className=\"crow-opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\" />\n <path className=\"crow-opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z\" />\n </svg>\n <span className=\"crow-font-medium crow-text-[var(--crow-text,#111827)]\">{toolStatus}</span>\n </div>\n )}\n {(chat.suggestedActions.length > 0 || (!chat.isLoading && defaultSuggestedActionsRef.current.length > 0)) && (\n <SuggestedActions\n actions={chat.suggestedActions.length > 0 ? chat.suggestedActions : defaultSuggestedActionsRef.current}\n onActionClick={(action) => handleSend(action.message)}\n />\n )}\n {styles.branding.showPoweredBy && <PoweredByBadge apiUrl={apiUrl} />}\n <PromptInputBox\n onSend={handleSend}\n onStop={handleStop}\n placeholder=\"Ask anything...\"\n isLoading={chat.isLoading}\n />\n </div>\n </div>\n </CopilotStyleProvider>\n );\n\n const floatingWidth =\n typeof width === \"number\" ? width : parseInt(String(width), 10) || 400;\n\n // --- Floating variant: uses CopilotContainer with push effect ---\n if (variant === \"floating\") {\n return (\n <ShadowContainer styles={WIDGET_CSS}>\n <CopilotContainer\n position={position}\n width={floatingWidth}\n defaultOpen={defaultOpen}\n >\n {({ close, currentWidth: resizedWidth }) =>\n renderCopilotContent(close, true, resizedWidth)\n }\n </CopilotContainer>\n </ShadowContainer>\n );\n }\n\n // --- Embedded variant: resizable flex child with toggle button ---\n const isRight = position === \"right\";\n const edgeSide = isRight ? \"left\" : \"right\";\n\n // Choose icon: message bubble when collapsed, chevron when expanded\n const toggleIcon = isCollapsed ? (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#6b7280\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M7.9 20A9 9 0 1 0 4 16.1L2 22Z\" />\n </svg>\n ) : (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#6b7280\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n {isRight ? <path d=\"m9 18 6-6-6-6\" /> : <path d=\"m15 18-6-6 6-6\" />}\n </svg>\n );\n\n return (\n <div style={{ position: \"relative\", flexShrink: 0, height: \"100%\" }}>\n {/* Toggle button — click to collapse/expand, drag to resize */}\n <button\n ref={embeddedToggleRef}\n onMouseDown={embeddedHandleMouseDown}\n onClick={embeddedHandleClick}\n style={{\n position: \"absolute\",\n [edgeSide]: \"-12px\",\n top: \"50%\",\n transform: \"translateY(-50%)\",\n zIndex: 10,\n width: \"24px\",\n height: \"64px\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n background: \"#fff\",\n border: \"1px solid #e5e7eb\",\n [isRight ? \"borderRight\" : \"borderLeft\"]: \"none\",\n borderRadius: isRight ? \"8px 0 0 8px\" : \"0 8px 8px 0\",\n cursor: isCollapsed ? \"pointer\" : \"col-resize\",\n boxShadow: \"0 2px 8px rgba(0,0,0,0.1)\",\n padding: 0,\n outline: \"none\",\n }}\n aria-label={isCollapsed ? \"Open Copilot\" : \"Resize or close Copilot\"}\n >\n {toggleIcon}\n </button>\n\n {/* Content area — width controlled by flex, direct DOM during drag */}\n <div\n ref={embeddedContentRef}\n style={{\n width: `${embeddedWidth}px`,\n height: \"100%\",\n display: isCollapsed ? \"none\" : \"block\",\n overflow: \"hidden\",\n }}\n >\n <ShadowContainer styles={WIDGET_CSS}>\n {renderCopilotContent(undefined, false, \"100%\")}\n </ShadowContainer>\n </div>\n </div>\n );\n}\n\n// Simple icon components (to avoid lucide-react import issues in some setups)\nfunction PlusIcon({ className }: { className?: string }) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <path d=\"M5 12h14\" />\n <path d=\"M12 5v14\" />\n </svg>\n );\n}\n\nfunction HistoryIcon({ className }: { className?: string }) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <path d=\"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\" />\n <path d=\"M3 3v5h5\" />\n <path d=\"M12 7v5l4 2\" />\n </svg>\n );\n}\n\nfunction TabCloseIcon({ className }: { className?: string }) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </svg>\n );\n}\n\nfunction ChevronRightIcon({ className }: { className?: string }) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <path d=\"m9 18 6-6-6-6\" />\n </svg>\n );\n}\n\nfunction CloseIcon({ className }: { className?: string }) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </svg>\n );\n}\n\nexport default CrowCopilot;\n","/**\n * CrowProvider - React context provider for sharing CrowClient\n */\n\nimport { createContext, useContext, useMemo, useEffect, useRef } from 'react';\nimport { CrowClient, type CrowClientConfig } from '@usecrow/client';\n\ninterface CrowContextValue {\n client: CrowClient;\n}\n\nconst CrowContext = createContext<CrowContextValue | null>(null);\n\nexport interface CrowProviderProps extends CrowClientConfig {\n children: React.ReactNode;\n}\n\n/**\n * Provider component that creates and shares a CrowClient instance\n */\nexport function CrowProvider({\n children,\n productId,\n apiUrl,\n model,\n subdomain,\n}: CrowProviderProps) {\n // Create client once and keep it stable\n const clientRef = useRef<CrowClient | null>(null);\n\n if (!clientRef.current) {\n clientRef.current = new CrowClient({ productId, apiUrl, model, subdomain });\n }\n\n const client = clientRef.current;\n\n // Clean up on unmount\n useEffect(() => {\n return () => {\n client.destroy();\n };\n }, [client]);\n\n const value = useMemo(() => ({ client }), [client]);\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- React 18/19 ReactNode type mismatch in monorepo\n return <CrowContext.Provider value={value}>{children as any}</CrowContext.Provider>;\n}\n\n/**\n * Hook to access the CrowClient from context\n */\nexport function useCrowClient(): CrowClient {\n const context = useContext(CrowContext);\n if (!context) {\n throw new Error('useCrowClient must be used within a CrowProvider');\n }\n return context.client;\n}\n\n/**\n * Hook to optionally access the CrowClient (returns null if not in provider)\n */\nexport function useCrowClientOptional(): CrowClient | null {\n const context = useContext(CrowContext);\n return context?.client ?? null;\n}\n\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils.ts","../src/constants.ts","../src/hooks/useChat.ts","../src/hooks/useConversations.ts","../src/hooks/useWorkflow.ts","../src/hooks/useCrowAPI.ts","../src/styles/defaults.ts","../src/styles/utils.ts","../src/hooks/useWidgetStyles.ts","../src/hooks/useTTSOutput.ts","../src/context/StyleContext.tsx","../src/components/ShadowContainer.tsx","../src/components/widget/ChatBubble.tsx","../src/components/widget/WidgetShell.tsx","../src/components/widget/WidgetHeader.tsx","../src/components/shared/StreamingText.tsx","../src/components/shared/ThinkingIndicator.tsx","../src/components/shared/LoadingHistory.tsx","../src/components/shared/ReasoningTrace.tsx","../src/components/shared/MessageBubble.tsx","../src/components/shared/MessageList.tsx","../src/components/shared/MessagesContainer.tsx","../src/components/shared/ConversationList.tsx","../src/components/shared/WorkflowPanel.tsx","../src/components/shared/PoweredByBadge.tsx","../src/components/shared/ModelSelector.tsx","../src/hooks/useVoiceInput.ts","../src/components/shared/PromptInputBox.tsx","../src/components/shared/BrowserUseConfirmation.tsx","../src/components/shared/BrowserUseQuestion.tsx","../src/components/shared/SuggestedActions.tsx","../src/styles/cssVars.ts","../src/styles/inject.ts","../src/CrowWidget.tsx","../src/components/copilot/CopilotToggleButton.tsx","../src/components/copilot/CopilotContainer.tsx","../src/CrowCopilot.tsx","../src/CrowProvider.tsx"],"names":["updated","useState","useCallback","useRef","useEffect","useWidgetStyles","useCopilotStyles","jsx","jsxs","Fragment","motion","ReactMarkdown","forwardRef","X","ChevronDown","Check","React","useMemo","AnimatePresence","ChevronRight","CopilotToggleButton","createContext"],"mappings":";;;;;;;;;;AAOO,IAAM,EAAA,GAAK,IAAI,OAAA,KACpB,OAAA,CAAQ,OAAO,OAAO,CAAA,CAAE,KAAK,GAAG,CAAA;AAc3B,IAAM,sBAAA,GAAyB,CAAC,OAAA,KAA4B;AACjE,EAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,OAAO,CAAA;AAC7B,EAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,EAAA,MAAM,WAAW,IAAA,CAAK,KAAA;AAAA,IAAA,CACnB,GAAA,CAAI,SAAQ,GAAI,IAAA,CAAK,SAAQ,KAAM,GAAA,GAAO,KAAK,EAAA,GAAK,EAAA;AAAA,GACvD;AAEA,EAAA,IAAI,QAAA,KAAa,GAAG,OAAO,OAAA;AAC3B,EAAA,IAAI,QAAA,KAAa,GAAG,OAAO,WAAA;AAC3B,EAAA,IAAI,QAAA,GAAW,CAAA,EAAG,OAAO,CAAA,EAAG,QAAQ,CAAA,SAAA,CAAA;AACpC,EAAA,OAAO,KAAK,kBAAA,EAAmB;AACjC,CAAA;AAKO,IAAM,iBAAA,GAAoB,CAAC,MAAA,KAChC,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,IAAA,CAAK,KAAK,CAAA,CAAA;;;ACjClB,IAAM,gBAAA,GAA4B;AAAA,EACvC,EAAE,EAAA,EAAI,QAAA,EAAU,IAAA,EAAM,QAAA,EAAU,UAAU,QAAA,EAAS;AAAA,EACnD,EAAE,EAAA,EAAI,YAAA,EAAc,IAAA,EAAM,YAAA,EAAc,UAAU,QAAA,EAAS;AAAA,EAC3D,EAAE,EAAA,EAAI,SAAA,EAAW,IAAA,EAAM,SAAA,EAAW,UAAU,QAAA,EAAS;AAAA,EACrD,EAAE,EAAA,EAAI,aAAA,EAAe,IAAA,EAAM,aAAA,EAAe,UAAU,QAAA,EAAS;AAAA,EAC7D,EAAE,EAAA,EAAI,2BAAA,EAA6B,IAAA,EAAM,WAAA,EAAa,UAAU,WAAA,EAAY;AAAA,EAC5E,EAAE,EAAA,EAAI,4BAAA,EAA8B,IAAA,EAAM,YAAA,EAAc,UAAU,WAAA,EAAY;AAAA,EAC9E,EAAE,EAAA,EAAI,0BAAA,EAA4B,IAAA,EAAM,UAAA,EAAY,UAAU,WAAA;AAChE;AAEO,IAAM,aAAA,GAAgB;AAEtB,IAAM,uBAAA,GAA0B;AAEhC,IAAM,qBAAA,GAAwB;;;AC6BrC,IAAM,yBAAA,GAA4B,CAAC,SAAA,KAAsB,CAAA,UAAA,EAAa,SAAS,CAAA,CAAA;AAExE,SAAS,OAAA,CAAQ;AAAA,EACtB,SAAA;AAAA,EACA,MAAA,GAAS,EAAA;AAAA,EACT,6BAAA;AAAA,EACA,cAAA;AAAA,EACA,aAAA,EAAe,oBAAA;AAAA,EACf,SAAA;AAAA,EACA,mBAAA;AAAA,EACA,QAAA;AAAA,EACA,oBAAA;AAAA,EACA,gBAAA;AAAA,EACA,eAAA;AAAA,EACA,UAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAA,EAAmB;AAEjB,EAAA,MAAM,0BAA0B,cAAA,IAAkB,uBAAA;AAElD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,QAAA,CAAoB;AAAA,IAClD;AAAA,MACE,EAAA,EAAI,SAAA;AAAA,MACJ,OAAA,EAAS,uBAAA;AAAA,MACT,KAAA,EAAO,IAAA;AAAA,MACP,SAAA,sBAAe,IAAA;AAAK;AACtB,GACD,CAAA;AACD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAI,QAAA,CAAqB,EAAE,CAAA;AAErE,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAI,SAAwB,IAAI,CAAA;AACxE,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAI,SAA6B,oBAAoB,CAAA;AAC3F,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAI,QAAA,CAA4B,EAAE,CAAA;AAE9E,EAAA,MAAM,kBAAA,GAAqB,OAA+B,IAAI,CAAA;AAC9D,EAAA,MAAM,oBAAA,GAAuB,OAAO,KAAK,CAAA;AAEzC,EAAA,MAAM,qBAAA,GAAwB,MAAA,CAAmB,EAAE,CAAA;AAEnD,EAAA,MAAM,sBAAA,GAAyB,OAAO,mBAAmB,CAAA;AACzD,EAAA,sBAAA,CAAuB,OAAA,GAAU,mBAAA;AAGjC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,oBAAA,EAAsB;AACxB,MAAA,gBAAA,CAAiB,CAAC,IAAA,KAAS,IAAA,KAAS,oBAAA,GAAuB,uBAAuB,IAAI,CAAA;AAAA,IACxF;AAAA,EACF,CAAA,EAAG,CAAC,oBAAoB,CAAC,CAAA;AAGzB,EAAA,SAAA,CAAU,MAAM;AAEd,IAAA,IAAI,SAAS,MAAA,KAAW,CAAA,IAAK,SAAS,CAAC,CAAA,CAAE,OAAO,SAAA,EAAW;AACzD,MAAA,WAAA,CAAY;AAAA,QACV;AAAA,UACE,EAAA,EAAI,SAAA;AAAA,UACJ,OAAA,EAAS,uBAAA;AAAA,UACT,KAAA,EAAO,IAAA;AAAA,UACP,SAAA,sBAAe,IAAA;AAAK;AACtB,OACD,CAAA;AAAA,IACH;AAAA,EACF,CAAA,EAAG,CAAC,uBAAuB,CAAC,CAAA;AAG5B,EAAA,SAAA,CAAU,MAAM;AAEd,IAAA,IAAI,6BAAA,KAAkC,MAAA,IAAa,oBAAA,CAAqB,OAAA,EAAS;AAC/E,MAAA;AAAA,IACF;AACA,IAAA,oBAAA,CAAqB,OAAA,GAAU,IAAA;AAE/B,IAAA,IAAI,6BAAA,EAA+B;AAEjC,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAW,YAAA,CAAa,OAAA,CAAQ,yBAAA,CAA0B,SAAS,CAAC,CAAA;AAC1E,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,iBAAA,CAAkB,QAAQ,CAAA;AAC1B,UAAA,sBAAA,GAAyB,QAAQ,CAAA;AAAA,QACnC;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,IAAI;AACF,QAAA,YAAA,CAAa,UAAA,CAAW,yBAAA,CAA0B,SAAS,CAAC,CAAA;AAAA,MAC9D,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF,CAAA,EAAG,CAAC,6BAAA,EAA+B,SAAA,EAAW,sBAAsB,CAAC,CAAA;AAErE,EAAA,MAAM,iBAAA,GAAoB,WAAA;AAAA,IACxB,OAAO,SAAiB,QAAA,KAAqB;AAC3C,MAAA,IAAI,eAAA,GAAkB,EAAA;AACtB,MAAA,IAAI,UAAA,GAAa,IAAA;AAEjB,MAAA,MAAM,qBAID,EAAC;AAEN,MAAA,kBAAA,CAAmB,OAAA,GAAU,IAAI,eAAA,EAAgB;AAEjD,MAAA,IAAI;AACF,QAAA,MAAM,gBAAgB,MAAA,CAAO,qBAAA;AAE7B,QAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,MAAM,CAAA,iBAAA,CAAA,EAAqB;AAAA,UACzD,MAAA,EAAQ,MAAA;AAAA,UACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,UAC9C,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,YACnB,UAAA,EAAY,SAAA;AAAA,YACZ,OAAA;AAAA,YACA,eAAA,EAAiB,cAAA;AAAA,YACjB,cAAA,EAAgB,aAAA;AAAA,YAChB,KAAA,EAAO,aAAA;AAAA,YACP,SAAA;AAAA,YACA,aAAA,EAAe,IAAA,CAAK,cAAA,EAAe,CAAE,iBAAgB,CAAE,QAAA;AAAA,YACvD,kCAAiB,IAAI,IAAA,IAAO,cAAA,CAAe,OAAA,EAAS,EAAE,IAAA,EAAM,SAAA,EAAW,OAAO,MAAA,EAAQ,GAAA,EAAK,WAAW,IAAA,EAAM,SAAA,EAAW,QAAQ,SAAA,EAAW,MAAA,EAAQ,MAAM,CAAA;AAAA,YACxJ,WAAW,OAAO,MAAA,KAAW,WAAA,GAAc,MAAA,CAAO,SAAS,QAAA,GAAW,KAAA,CAAA;AAAA,YACtE,OAAA,EAAS,OAAO,MAAA,KAAW,WAAA,GAAe,OAAe,mBAAA,GAAsB,KAAA,CAAA;AAAA,YAC/E,GAAI,QAAA,IAAY,QAAA,KAAa,OAAO,EAAE,QAAA,KAAa;AAAC,WACrD,CAAA;AAAA,UACD,MAAA,EAAQ,mBAAmB,OAAA,CAAQ;AAAA,SACpC,CAAA;AAED,QAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,UAAA,IAAI,QAAA,CAAS,MAAA,KAAW,GAAA,IAAO,OAAO,WAAW,WAAA,EAAa;AAE5D,YAAA,MAAA,CAAO,aAAA,CAAc,IAAI,WAAA,CAAY,2BAA2B,CAAC,CAAA;AAAA,UACnE;AACA,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAAA,QAC1D;AAEA,QAAA,MAAM,MAAA,GAAS,QAAA,CAAS,IAAA,EAAM,SAAA,EAAU;AACxC,QAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAEhC,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,IAAI,MAAA,GAAS,EAAA;AAEb,UAAA,OAAO,IAAA,EAAM;AACX,YAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,OAAO,IAAA,EAAK;AAC1C,YAAA,IAAI,IAAA,EAAM;AAEV,YAAA,MAAA,IAAU,QAAQ,MAAA,CAAO,KAAA,EAAO,EAAE,MAAA,EAAQ,MAAM,CAAA;AAChD,YAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AAC/B,YAAA,MAAA,GAAS,KAAA,CAAM,KAAI,IAAK,EAAA;AAExB,YAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,cAAA,IAAI,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC7B,gBAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAC,EAAE,IAAA,EAAK;AAChC,gBAAA,IAAI,SAAS,QAAA,EAAU;AACrB,kBAAA,YAAA,CAAa,KAAK,CAAA;AAGlB,kBAAA,MAAM,cAAA,GAAiB,CAAC,GAAG,qBAAA,CAAsB,OAAO,CAAA;AACxD,kBAAA,IAAI,cAAA,CAAe,SAAS,CAAA,EAAG;AAC7B,oBAAA,WAAA;AAAA,sBAAY,CAAC,SACX,IAAA,CAAK,GAAA;AAAA,wBAAI,CAAC,GAAA,KACR,GAAA,CAAI,EAAA,KAAO,QAAA,GACP,EAAE,GAAG,GAAA,EAAK,SAAA,EAAW,cAAA,EAAgB,gBAAA,EAAkB,IAAA,EAAK,GAC5D;AAAA;AACN,qBACF;AAAA,kBACF,CAAA,MAAO;AAEL,oBAAA,WAAA;AAAA,sBAAY,CAAC,SACX,IAAA,CAAK,GAAA;AAAA,wBAAI,CAAC,GAAA,KACR,GAAA,CAAI,EAAA,KAAO,QAAA,GACP,EAAE,GAAG,GAAA,EAAK,gBAAA,EAAkB,IAAA,EAAK,GACjC;AAAA;AACN,qBACF;AAAA,kBACF;AAGA,kBAAA,kBAAA,CAAmB,EAAE,CAAA;AACrB,kBAAA,qBAAA,CAAsB,UAAU,EAAC;AAGjC,kBAAA,KAAA,MAAW,QAAQ,kBAAA,EAAoB;AACrC,oBAAA,UAAA,GAAa;AAAA,sBACX,IAAA,EAAM,aAAA;AAAA,sBACN,UAAU,IAAA,CAAK,QAAA;AAAA,sBACf,YAAY,IAAA,CAAK,UAAA;AAAA,sBACjB,WAAW,IAAA,CAAK;AAAA,qBACjB,CAAA;AAAA,kBACH;AACA,kBAAA;AAAA,gBACF;AAEA,gBAAA,IAAI;AACF,kBAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAE9B,kBAAA,QAAQ,OAAO,IAAA;AAAM,oBACnB,KAAK,qBAAA;AACH,sBAAA,oBAAA,GAAuB,MAAA,CAAO,gBAAgB,IAAI,CAAA;AAClD,sBAAA;AAAA,oBAEF,KAAK,iBAAA;AACH,sBAAA,IAAI,OAAO,eAAA,EAAiB;AAC1B,wBAAA,iBAAA,CAAkB,OAAO,eAAe,CAAA;AAExC,wBAAA,IAAI,kCAAkC,IAAA,EAAM;AAC1C,0BAAA,IAAI;AACF,4BAAA,YAAA,CAAa,OAAA;AAAA,8BACX,0BAA0B,SAAS,CAAA;AAAA,8BACnC,MAAA,CAAO;AAAA,6BACT;AAAA,0BACF,CAAA,CAAA,MAAQ;AAAA,0BAER;AAAA,wBACF;AACA,wBAAA,gBAAA,GAAmB,OAAO,eAAe,CAAA;AAAA,sBAC3C;AACA,sBAAA;AAAA,oBAEF,KAAK,UAAA;AACH,sBAAA,IAAI,MAAA,CAAO,WAAW,UAAA,EAAY;AAChC,wBAAA,WAAA;AAAA,0BAAY,CAAC,SACX,IAAA,CAAK,GAAA;AAAA,4BAAI,CAAC,GAAA,KACR,GAAA,CAAI,EAAA,KAAO,QAAA,GACP,EAAE,GAAG,GAAA,EAAK,gBAAA,EAAkB,IAAA,EAAK,GACjC;AAAA;AACN,yBACF;AAAA,sBACF;AACA,sBAAA;AAAA,oBAEF,KAAK,gBAAA;AACH,sBAAA,IAAI,OAAO,OAAA,EAAS;AAClB,wBAAA,WAAA;AAAA,0BAAY,CAAC,SACX,IAAA,CAAK,GAAA;AAAA,4BAAI,CAAC,GAAA,KACR,GAAA,CAAI,EAAA,KAAO,WACP,EAAE,GAAG,GAAA,EAAK,QAAA,EAAA,CAAW,GAAA,CAAI,QAAA,IAAY,EAAA,IAAM,MAAA,CAAO,SAAQ,GAC1D;AAAA;AACN,yBACF;AAAA,sBACF;AACA,sBAAA;AAAA,oBAEF,KAAK,SAAA;AACH,sBAAA,IAAI,YAAY,UAAA,GAAa,KAAA;AAC7B,sBAAA,eAAA,IAAmB,MAAA,CAAO,OAAA;AAC1B,sBAAA,WAAA;AAAA,wBAAY,CAAC,SACX,IAAA,CAAK,GAAA;AAAA,0BAAI,CAAC,GAAA,KACR,GAAA,CAAI,EAAA,KAAO,QAAA,GACP,EAAE,GAAG,GAAA,EAAK,OAAA,EAAS,eAAA,EAAgB,GACnC;AAAA;AACN,uBACF;AACA,sBAAA;AAAA,oBAEF,KAAK,WAAA;AACH,sBAAA,IAAI,OAAO,SAAA,EAAW;AACpB,wBAAA,WAAA;AAAA,0BAAY,CAAC,SACX,IAAA,CAAK,GAAA;AAAA,4BAAI,CAAC,GAAA,KACR,GAAA,CAAI,EAAA,KAAO,QAAA,GACP,EAAE,GAAG,GAAA,EAAK,SAAA,EAAW,MAAA,CAAO,SAAA,EAAU,GACtC;AAAA;AACN,yBACF;AAAA,sBACF;AACA,sBAAA;AAAA,oBAEF,KAAK,OAAA;AACH,sBAAA,IAAI,OAAO,OAAA,EAAS;AAClB,wBAAA,WAAA;AAAA,0BAAY,CAAC,SACX,IAAA,CAAK,GAAA;AAAA,4BAAI,CAAC,GAAA,KACR,GAAA,CAAI,EAAA,KAAO,QAAA,GACP,EAAE,GAAG,GAAA,EAAK,OAAA,EAAS,MAAA,CAAO,OAAA,EAAQ,GAClC;AAAA;AACN,yBACF;AAAA,sBACF;AACA,sBAAA;AAAA,oBAEF,KAAK,iBAAA;AACH,sBAAA,UAAA,GAAa;AAAA,wBACX,IAAA,EAAM,OAAA;AAAA,wBACN,UAAU,MAAA,CAAO,SAAA;AAAA,wBACjB,WAAW,MAAA,CAAO;AAAA,uBACnB,CAAA;AACD,sBAAA,MAAM,WAAA,GAAwB;AAAA,wBAC5B,EAAA,EAAI,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA;AAAA,wBACtB,MAAM,MAAA,CAAO,SAAA;AAAA,wBACb,WAAA,EAAa,OAAO,YAAA,IAAgB,KAAA,CAAA;AAAA,wBACpC,SAAA,EAAW,MAAA,CAAO,SAAA,IAAa,EAAC;AAAA,wBAChC,MAAA,EAAQ,WAAA;AAAA,wBACR,SAAA,sBAAe,IAAA;AAAK,uBACtB;AACA,sBAAA,qBAAA,CAAsB,OAAA,GAAU,CAAC,GAAG,qBAAA,CAAsB,SAAS,WAAW,CAAA;AAC9E,sBAAA,kBAAA,CAAmB,CAAC,IAAA,KAAS,CAAC,GAAG,IAAA,EAAM,WAAW,CAAC,CAAA;AACnD,sBAAA;AAAA,oBAEF,KAAK,oBAAA;AACH,sBAAA,UAAA,GAAa;AAAA,wBACX,IAAA,EAAM,UAAA;AAAA,wBACN,UAAU,MAAA,CAAO,SAAA;AAAA,wBACjB,SAAS,MAAA,CAAO;AAAA,uBACjB,CAAA;AACD,sBAAA,MAAM,SAAA,GAAY,MAAA,CAAO,OAAA,GAAU,UAAA,GAAa,OAAA;AAChD,sBAAA,IAAI,OAAA,GAAU,KAAA;AACd,sBAAA,qBAAA,CAAsB,OAAA,GAAU,qBAAA,CAAsB,OAAA,CAAQ,GAAA,CAAI,CAAC,IAAA,KAAS;AAC1E,wBAAA,IAAI,CAAC,WAAW,IAAA,CAAK,IAAA,KAAS,OAAO,SAAA,IAAa,IAAA,CAAK,WAAW,WAAA,EAAa;AAC7E,0BAAA,OAAA,GAAU,IAAA;AACV,0BAAA,OAAO,EAAE,GAAG,IAAA,EAAM,MAAA,EAAQ,SAAA,EAAkC;AAAA,wBAC9D;AACA,wBAAA,OAAO,IAAA;AAAA,sBACT,CAAC,CAAA;AACD,sBAAA,kBAAA,CAAmB,CAAC,IAAA,KAAS;AAC3B,wBAAA,IAAIA,QAAAA,GAAU,KAAA;AACd,wBAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,IAAA,KAAS;AACxB,0BAAA,IAAI,CAACA,YAAW,IAAA,CAAK,IAAA,KAAS,OAAO,SAAA,IAAa,IAAA,CAAK,WAAW,WAAA,EAAa;AAC7E,4BAAAA,QAAAA,GAAU,IAAA;AACV,4BAAA,OAAO,EAAE,GAAG,IAAA,EAAM,MAAA,EAAQ,SAAA,EAAkC;AAAA,0BAC9D;AACA,0BAAA,OAAO,IAAA;AAAA,wBACT,CAAC,CAAA;AAAA,sBACH,CAAC,CAAA;AACD,sBAAA;AAAA,oBAEF,KAAK,mBAAA;AACH,sBAAA,IAAI,OAAO,KAAA,IAAS,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,KAAK,CAAA,EAAG;AAC/C,wBAAA,WAAA;AAAA,0BAAY,CAAC,SACX,IAAA,CAAK,GAAA;AAAA,4BAAI,CAAC,GAAA,KACR,GAAA,CAAI,OAAO,QAAA,GACP,EAAE,GAAG,GAAA,EAAK,KAAA,EAAO,CAAC,GAAI,GAAA,CAAI,SAAS,EAAC,EAAI,GAAG,MAAA,CAAO,KAAK,GAAE,GACzD;AAAA;AACN,yBACF;AAAA,sBACF;AACA,sBAAA;AAAA,oBAEF,KAAK,aAAA;AACH,sBAAA,IAAI,MAAA,CAAO,SAAA,IAAa,MAAA,CAAO,MAAA,EAAQ;AACrC,wBAAA,YAAA,GAAe,MAAA,CAAO,SAAA,EAAW,MAAA,CAAO,MAAM,CAAA;AAE9C,wBAAA,IAAI,aAAA,GAAgB,KAAA;AACpB,wBAAA,qBAAA,CAAsB,OAAA,GAAU,qBAAA,CAAsB,OAAA,CAAQ,GAAA,CAAI,CAAC,IAAA,KAAS;AAC1E,0BAAA,IAAI,CAAC,iBAAiB,IAAA,CAAK,IAAA,KAAS,OAAO,SAAA,IAAa,CAAC,KAAK,MAAA,EAAQ;AACpE,4BAAA,aAAA,GAAgB,IAAA;AAChB,4BAAA,OAAO,EAAE,GAAG,IAAA,EAAM,MAAA,EAAQ,OAAO,MAAA,EAAO;AAAA,0BAC1C;AACA,0BAAA,OAAO,IAAA;AAAA,wBACT,CAAC,CAAA;AACD,wBAAA,kBAAA,CAAmB,CAAC,IAAA,KAAS;AAC3B,0BAAA,IAAIA,QAAAA,GAAU,KAAA;AACd,0BAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,IAAA,KAAS;AACxB,4BAAA,IAAI,CAACA,YAAW,IAAA,CAAK,IAAA,KAAS,OAAO,SAAA,IAAa,CAAC,KAAK,MAAA,EAAQ;AAC9D,8BAAAA,QAAAA,GAAU,IAAA;AACV,8BAAA,OAAO,EAAE,GAAG,IAAA,EAAM,MAAA,EAAQ,OAAO,MAAA,EAAO;AAAA,4BAC1C;AACA,4BAAA,OAAO,IAAA;AAAA,0BACT,CAAC,CAAA;AAAA,wBACH,CAAC,CAAA;AAAA,sBACH;AACA,sBAAA;AAAA,oBAEF,KAAK,kBAAA;AACH,sBAAA;AACE,wBAAA,MAAM,eAAe,sBAAA,CAAuB,OAAA,GAAU,MAAA,CAAO,SAAS,GAAG,gBAAA,KAAqB,IAAA;AAE9F,wBAAA,UAAA,GAAa;AAAA,0BACX,IAAA,EAAM,OAAA;AAAA,0BACN,UAAU,MAAA,CAAO,SAAA;AAAA,0BACjB,WAAW,MAAA,CAAO;AAAA,yBACnB,CAAA;AACD,wBAAA,IAAI,YAAA,EAAc;AAEhB,0BAAA,MAAM,eAAA,GAA4B;AAAA,4BAChC,IAAI,MAAA,CAAO,YAAA,IAAgB,CAAA,KAAA,EAAQ,IAAA,CAAK,KAAK,CAAA,CAAA;AAAA,4BAC7C,MAAM,MAAA,CAAO,SAAA;AAAA,4BACb,WAAA,EAAa,OAAO,YAAA,IAAgB,KAAA,CAAA;AAAA,4BACpC,SAAA,EAAW,MAAA,CAAO,SAAA,IAAa,EAAC;AAAA,4BAChC,MAAA,EAAQ,kBAAA;AAAA,4BACR,eAAA,EAAiB,IAAA;AAAA,4BACjB,SAAA,sBAAe,IAAA;AAAK,2BACtB;AACA,0BAAA,qBAAA,CAAsB,OAAA,GAAU,CAAC,GAAG,qBAAA,CAAsB,SAAS,eAAe,CAAA;AAClF,0BAAA,kBAAA,CAAmB,CAAC,IAAA,KAAS,CAAC,GAAG,IAAA,EAAM,eAAe,CAAC,CAAA;AAAA,wBACzD,CAAA,MAAO;AAEL,0BAAA,MAAM,cAAA,GAA2B;AAAA,4BAC/B,IAAI,MAAA,CAAO,YAAA,IAAgB,CAAA,KAAA,EAAQ,IAAA,CAAK,KAAK,CAAA,CAAA;AAAA,4BAC7C,MAAM,MAAA,CAAO,SAAA;AAAA,4BACb,WAAA,EAAa,OAAO,YAAA,IAAgB,KAAA,CAAA;AAAA,4BACpC,SAAA,EAAW,MAAA,CAAO,SAAA,IAAa,EAAC;AAAA,4BAChC,MAAA,EAAQ,WAAA;AAAA,4BACR,SAAA,sBAAe,IAAA;AAAK,2BACtB;AACA,0BAAA,qBAAA,CAAsB,OAAA,GAAU,CAAC,GAAG,qBAAA,CAAsB,SAAS,cAAc,CAAA;AACjF,0BAAA,kBAAA,CAAmB,CAAC,IAAA,KAAS,CAAC,GAAG,IAAA,EAAM,cAAc,CAAC,CAAA;AACtD,0BAAA,kBAAA,CAAmB,IAAA,CAAK;AAAA,4BACtB,UAAU,MAAA,CAAO,SAAA;AAAA,4BACjB,YAAY,MAAA,CAAO,YAAA;AAAA,4BACnB,WAAW,MAAA,CAAO;AAAA,2BACnB,CAAA;AAAA,wBACH;AAAA,sBACF;AACA,sBAAA;AAAA,oBAEF,KAAK,uBAAA;AAIH,sBAAA,UAAA,GAAa;AAAA,wBACX,IAAA,EAAM,kBAAA;AAAA,wBACN,UAAU,MAAA,CAAO,SAAA;AAAA,wBACjB,WAAW,MAAA,CAAO;AAAA,uBACnB,CAAA;AACD,sBAAA;AACE,wBAAA,MAAM,WAAA,GAAc,sBAAsB,OAAA,CAAQ,SAAA;AAAA,0BAChD,CAAC,EAAA,KAAO,EAAA,CAAG,SAAS,MAAA,CAAO,SAAA,IAAa,GAAG,MAAA,KAAW;AAAA,yBACxD;AACA,wBAAA,IAAI,eAAe,CAAA,EAAG;AACpB,0BAAA,MAAM,QAAA,GAAW,qBAAA,CAAsB,OAAA,CAAQ,WAAW,CAAA;AAC1D,0BAAA,MAAM,SAAA,GAAsB;AAAA,4BAC1B,GAAG,QAAA;AAAA,4BACH,MAAA,EAAQ,kBAAA;AAAA,4BACR,eAAA,EAAiB,IAAA;AAAA,4BACjB,mBAAA,EAAqB,IAAA;AAAA,4BACrB,SAAA,EAAW,MAAA,CAAO,SAAA,IAAa,QAAA,CAAS;AAAA,2BAC1C;AACA,0BAAA,qBAAA,CAAsB,OAAA,GAAU,sBAAsB,OAAA,CAAQ,GAAA;AAAA,4BAC5D,CAAC,EAAA,EAAI,CAAA,KAAO,CAAA,KAAM,cAAc,SAAA,GAAY;AAAA,2BAC9C;AACA,0BAAA,kBAAA;AAAA,4BAAmB,CAAC,IAAA,KAClB,IAAA,CAAK,GAAA,CAAI,CAAC,EAAA,KAAQ,EAAA,CAAG,EAAA,KAAO,QAAA,CAAS,EAAA,GAAK,SAAA,GAAY,EAAG;AAAA,2BAC3D;AAAA,wBACF,CAAA,MAAO;AAEL,0BAAA,MAAM,eAAA,GAA4B;AAAA,4BAChC,EAAA,EAAI,CAAA,QAAA,EAAW,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA;AAAA,4BACzB,MAAM,MAAA,CAAO,SAAA;AAAA,4BACb,WAAA,EAAa,OAAO,YAAA,IAAgB,KAAA,CAAA;AAAA,4BACpC,SAAA,EAAW,MAAA,CAAO,SAAA,IAAa,EAAC;AAAA,4BAChC,MAAA,EAAQ,kBAAA;AAAA,4BACR,eAAA,EAAiB,IAAA;AAAA,4BACjB,mBAAA,EAAqB,IAAA;AAAA,4BACrB,SAAA,sBAAe,IAAA;AAAK,2BACtB;AACA,0BAAA,qBAAA,CAAsB,OAAA,GAAU,CAAC,GAAG,qBAAA,CAAsB,SAAS,eAAe,CAAA;AAClF,0BAAA,kBAAA,CAAmB,CAAC,IAAA,KAAS,CAAC,GAAG,IAAA,EAAM,eAAe,CAAC,CAAA;AAAA,wBACzD;AAAA,sBACF;AACA,sBAAA;AAAA,oBAEF,KAAK,kBAAA;AACH,sBAAA,eAAA,GAAkB;AAAA,wBAChB,IAAA,EAAM,SAAA;AAAA,wBACN,MAAM,MAAA,CAAO,IAAA;AAAA,wBACb,OAAO,MAAA,CAAO;AAAA,uBACf,CAAA;AACD,sBAAA;AAAA,oBAEF,KAAK,cAAA;AACH,sBAAA,eAAA,GAAkB;AAAA,wBAChB,IAAA,EAAM,cAAA;AAAA,wBACN,QAAQ,MAAA,CAAO,EAAA;AAAA,wBACf,YAAY,MAAA,CAAO;AAAA,uBACpB,CAAA;AACD,sBAAA;AAAA,oBAEF,KAAK,gBAAA;AACH,sBAAA,eAAA,GAAkB,EAAE,IAAA,EAAM,OAAA,EAAS,CAAA;AACnC,sBAAA;AAAA,oBAEF,KAAK,0BAAA;AACH,sBAAA,eAAA,GAAkB,EAAE,IAAA,EAAM,iBAAA,EAAmB,CAAA;AAC7C,sBAAA;AAAA,oBAEF,KAAK,mBAAA;AACH,sBAAA,IAAI,OAAO,OAAA,IAAW,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,OAAO,CAAA,EAAG;AACnD,wBAAA,mBAAA,CAAoB,OAAO,OAAO,CAAA;AAAA,sBACpC;AACA,sBAAA;AAAA;AACJ,gBACF,SAAS,CAAA,EAAG;AACV,kBAAA,OAAA,CAAQ,KAAA,CAAM,uBAAuB,CAAC,CAAA;AAAA,gBACxC;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,IAAI,KAAA,YAAiB,KAAA,IAAS,KAAA,CAAM,IAAA,KAAS,YAAA,EAAc;AACzD,UAAA,IAAI,eAAA,EAAiB;AACnB,YAAA,WAAA;AAAA,cAAY,CAAC,SACX,IAAA,CAAK,GAAA;AAAA,gBAAI,CAAC,GAAA,KACR,GAAA,CAAI,EAAA,KAAO,QAAA,GAAW,EAAE,GAAG,GAAA,EAAK,OAAA,EAAS,eAAA,EAAgB,GAAI;AAAA;AAC/D,aACF;AAAA,UACF,CAAA,MAAO;AACL,YAAA,WAAA,CAAY,CAAC,SAAS,IAAA,CAAK,MAAA,CAAO,CAAC,GAAA,KAAQ,GAAA,CAAI,EAAA,KAAO,QAAQ,CAAC,CAAA;AAAA,UACjE;AACA,UAAA;AAAA,QACF;AAEA,QAAA,OAAA,CAAQ,KAAA,CAAM,iBAAiB,KAAK,CAAA;AACpC,QAAA,WAAA;AAAA,UAAY,CAAC,SACX,IAAA,CAAK,GAAA;AAAA,YAAI,CAAC,GAAA,KACR,GAAA,CAAI,EAAA,KAAO,QAAA,GACP,EAAE,GAAG,GAAA,EAAK,OAAA,EAAS,kDAAA,EAAmD,GACtE;AAAA;AACN,SACF;AAAA,MACF,CAAA,SAAE;AACA,QAAA,YAAA,CAAa,KAAK,CAAA;AAClB,QAAA,kBAAA,CAAmB,OAAA,GAAU,IAAA;AAAA,MAC/B;AAAA,IACF,CAAA;AAAA,IACA,CAAC,MAAA,EAAQ,SAAA,EAAW,cAAA,EAAgB,aAAA,EAAe,SAAA,EAAW,6BAAA,EAA+B,oBAAA,EAAsB,gBAAA,EAAkB,eAAA,EAAiB,UAAA,EAAY,YAAY;AAAA,GAChL;AAEA,EAAA,MAAM,WAAA,GAAc,WAAA;AAAA,IAClB,CAAC,OAAA,KAA6D;AAC5D,MAAA,IAAI,CAAC,OAAA,CAAQ,IAAA,EAAK,EAAG;AACnB,QAAA,OAAO,EAAE,SAAA,EAAW,EAAA,EAAI,QAAA,EAAU,EAAA,EAAG;AAAA,MACvC;AAEA,MAAA,kBAAA,CAAmB,EAAE,CAAA;AACrB,MAAA,qBAAA,CAAsB,UAAU,EAAC;AACjC,MAAA,mBAAA,CAAoB,EAAE,CAAA;AAEtB,MAAA,MAAM,SAAA,GAAY,kBAAkB,MAAM,CAAA;AAC1C,MAAA,MAAM,QAAA,GAAW,kBAAkB,KAAK,CAAA;AAExC,MAAA,WAAA,CAAY,CAAC,IAAA,KAAS;AAAA,QACpB,GAAG,IAAA;AAAA,QACH;AAAA,UACE,EAAA,EAAI,SAAA;AAAA,UACJ,OAAA;AAAA,UACA,KAAA,EAAO,KAAA;AAAA,UACP,SAAA,sBAAe,IAAA;AAAK;AACtB,OACD,CAAA;AAED,MAAA,YAAA,CAAa,IAAI,CAAA;AAEjB,MAAA,WAAA,CAAY,CAAC,IAAA,KAAS;AAAA,QACpB,GAAG,IAAA;AAAA,QACH;AAAA,UACE,EAAA,EAAI,QAAA;AAAA,UACJ,OAAA,EAAS,aAAA;AAAA,UACT,KAAA,EAAO,IAAA;AAAA,UACP,SAAA,sBAAe,IAAA;AAAK;AACtB,OACD,CAAA;AAED,MAAA,iBAAA,CAAkB,SAAS,QAAQ,CAAA;AAEnC,MAAA,OAAO,EAAE,WAAW,QAAA,EAAS;AAAA,IAC/B,CAAA;AAAA,IACA,CAAC,iBAAiB;AAAA,GACpB;AAEA,EAAA,MAAM,cAAA,GAAiB,YAAY,MAAM;AACvC,IAAA,IAAI,mBAAmB,OAAA,EAAS;AAC9B,MAAA,kBAAA,CAAmB,QAAQ,KAAA,EAAM;AACjC,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,aAAA,GAAgB,YAAY,MAAM;AACtC,IAAA,WAAA,CAAY;AAAA,MACV;AAAA,QACE,EAAA,EAAI,SAAA;AAAA,QACJ,OAAA,EAAS,uBAAA;AAAA,QACT,KAAA,EAAO,IAAA;AAAA,QACP,SAAA,sBAAe,IAAA;AAAK;AACtB,KACD,CAAA;AACD,IAAA,iBAAA,CAAkB,IAAI,CAAA;AACtB,IAAA,IAAI;AACF,MAAA,YAAA,CAAa,UAAA,CAAW,yBAAA,CAA0B,SAAS,CAAC,CAAA;AAAA,IAC9D,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF,CAAA,EAAG,CAAC,SAAA,EAAW,uBAAuB,CAAC,CAAA;AAEvC,EAAA,MAAM,YAAA,GAAe,WAAA,CAAY,CAAC,eAAA,KAA+B;AAC/D,IAAA,WAAA,CAAY,eAAe,CAAA;AAAA,EAC7B,CAAA,EAAG,EAAE,CAAA;AAML,EAAA,MAAM,gBAAA,GAAmB,WAAA;AAAA,IACvB,OACE,UAAA,EACA,QAAA,EACA,MAAA,KACG;AACH,MAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,QAAA,OAAA,CAAQ,MAAM,sDAAsD,CAAA;AACpE,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,QAAA,GAAW,kBAAkB,KAAK,CAAA;AAExC,MAAA,MAAM,qBAID,EAAC;AAGN,MAAA,WAAA,CAAY,CAAC,IAAA,KAAS;AAAA,QACpB,GAAG,IAAA;AAAA,QACH;AAAA,UACE,EAAA,EAAI,QAAA;AAAA,UACJ,OAAA,EAAS,EAAA;AAAA,UACT,KAAA,EAAO,IAAA;AAAA,UACP,SAAA,sBAAe,IAAA;AAAK;AACtB,OACD,CAAA;AAED,MAAA,YAAA,CAAa,IAAI,CAAA;AAEjB,MAAA,IAAI;AACF,QAAA,MAAM,gBAAgB,MAAA,CAAO,qBAAA;AAE7B,QAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,MAAM,CAAA,qBAAA,CAAA,EAAyB;AAAA,UAC7D,MAAA,EAAQ,MAAA;AAAA,UACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,UAC9C,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,YACnB,UAAA,EAAY,SAAA;AAAA,YACZ,eAAA,EAAiB,cAAA;AAAA,YACjB,YAAA,EAAc,UAAA;AAAA,YACd,SAAA,EAAW,QAAA;AAAA,YACX,MAAA;AAAA,YACA,cAAA,EAAgB,aAAA;AAAA,YAChB,KAAA,EAAO,aAAA;AAAA,YACP,SAAA;AAAA,YACA,aAAA,EAAe,IAAA,CAAK,cAAA,EAAe,CAAE,iBAAgB,CAAE,QAAA;AAAA,YACvD,kCAAiB,IAAI,IAAA,IAAO,cAAA,CAAe,OAAA,EAAS,EAAE,IAAA,EAAM,SAAA,EAAW,OAAO,MAAA,EAAQ,GAAA,EAAK,WAAW,IAAA,EAAM,SAAA,EAAW,QAAQ,SAAA,EAAW,MAAA,EAAQ,MAAM,CAAA;AAAA,YACxJ,GAAI,QAAA,IAAY,QAAA,KAAa,OAAO,EAAE,QAAA,KAAa;AAAC,WACrD;AAAA,SACF,CAAA;AAED,QAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,UAAA,IAAI,QAAA,CAAS,MAAA,KAAW,GAAA,IAAO,OAAO,WAAW,WAAA,EAAa;AAE5D,YAAA,MAAA,CAAO,aAAA,CAAc,IAAI,WAAA,CAAY,2BAA2B,CAAC,CAAA;AAAA,UACnE;AACA,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAAA,QAC1D;AAEA,QAAA,MAAM,MAAA,GAAS,QAAA,CAAS,IAAA,EAAM,SAAA,EAAU;AACxC,QAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,QAAA,IAAI,eAAA,GAAkB,EAAA;AAEtB,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,IAAI,MAAA,GAAS,EAAA;AAEb,UAAA,OAAO,IAAA,EAAM;AACX,YAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,OAAO,IAAA,EAAK;AAC1C,YAAA,IAAI,IAAA,EAAM;AAEV,YAAA,MAAA,IAAU,QAAQ,MAAA,CAAO,KAAA,EAAO,EAAE,MAAA,EAAQ,MAAM,CAAA;AAChD,YAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AAC/B,YAAA,MAAA,GAAS,KAAA,CAAM,KAAI,IAAK,EAAA;AAExB,YAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,cAAA,IAAI,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC7B,gBAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAC,EAAE,IAAA,EAAK;AAChC,gBAAA,IAAI,SAAS,QAAA,EAAU;AACrB,kBAAA,YAAA,CAAa,KAAK,CAAA;AAGlB,kBAAA,MAAM,cAAA,GAAiB,CAAC,GAAG,qBAAA,CAAsB,OAAO,CAAA;AACxD,kBAAA,IAAI,cAAA,CAAe,SAAS,CAAA,EAAG;AAC7B,oBAAA,WAAA;AAAA,sBAAY,CAAC,SACX,IAAA,CAAK,GAAA;AAAA,wBAAI,CAAC,GAAA,KACR,GAAA,CAAI,EAAA,KAAO,QAAA,GACP,EAAE,GAAG,GAAA,EAAK,SAAA,EAAW,cAAA,EAAgB,gBAAA,EAAkB,IAAA,EAAK,GAC5D;AAAA;AACN,qBACF;AAAA,kBACF,CAAA,MAAO;AAEL,oBAAA,WAAA;AAAA,sBAAY,CAAC,SACX,IAAA,CAAK,GAAA;AAAA,wBAAI,CAAC,GAAA,KACR,GAAA,CAAI,EAAA,KAAO,QAAA,GACP,EAAE,GAAG,GAAA,EAAK,gBAAA,EAAkB,IAAA,EAAK,GACjC;AAAA;AACN,qBACF;AAAA,kBACF;AAGA,kBAAA,kBAAA,CAAmB,EAAE,CAAA;AACrB,kBAAA,qBAAA,CAAsB,UAAU,EAAC;AAGjC,kBAAA,KAAA,MAAW,QAAQ,kBAAA,EAAoB;AACrC,oBAAA,UAAA,GAAa;AAAA,sBACX,IAAA,EAAM,aAAA;AAAA,sBACN,UAAU,IAAA,CAAK,QAAA;AAAA,sBACf,YAAY,IAAA,CAAK,UAAA;AAAA,sBACjB,WAAW,IAAA,CAAK;AAAA,qBACjB,CAAA;AAAA,kBACH;AACA,kBAAA;AAAA,gBACF;AAEA,gBAAA,IAAI;AACF,kBAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAE9B,kBAAA,QAAQ,OAAO,IAAA;AAAM,oBACnB,KAAK,SAAA;AACH,sBAAA,eAAA,IAAmB,MAAA,CAAO,OAAA;AAC1B,sBAAA,WAAA;AAAA,wBAAY,CAAC,SACX,IAAA,CAAK,GAAA;AAAA,0BAAI,CAAC,GAAA,KACR,GAAA,CAAI,EAAA,KAAO,QAAA,GACP,EAAE,GAAG,GAAA,EAAK,OAAA,EAAS,eAAA,EAAgB,GACnC;AAAA;AACN,uBACF;AACA,sBAAA;AAAA,oBAEF,KAAK,UAAA;AACH,sBAAA,IAAI,MAAA,CAAO,WAAW,UAAA,EAAY;AAChC,wBAAA,WAAA;AAAA,0BAAY,CAAC,SACX,IAAA,CAAK,GAAA;AAAA,4BAAI,CAAC,GAAA,KACR,GAAA,CAAI,EAAA,KAAO,QAAA,GACP,EAAE,GAAG,GAAA,EAAK,gBAAA,EAAkB,IAAA,EAAK,GACjC;AAAA;AACN,yBACF;AAAA,sBACF;AACA,sBAAA;AAAA,oBAEF,KAAK,gBAAA;AACH,sBAAA,IAAI,OAAO,OAAA,EAAS;AAClB,wBAAA,WAAA;AAAA,0BAAY,CAAC,SACX,IAAA,CAAK,GAAA;AAAA,4BAAI,CAAC,GAAA,KACR,GAAA,CAAI,EAAA,KAAO,WACP,EAAE,GAAG,GAAA,EAAK,QAAA,EAAA,CAAW,GAAA,CAAI,QAAA,IAAY,EAAA,IAAM,MAAA,CAAO,SAAQ,GAC1D;AAAA;AACN,yBACF;AAAA,sBACF;AACA,sBAAA;AAAA,oBAEF,KAAK,WAAA;AACH,sBAAA,IAAI,OAAO,SAAA,EAAW;AACpB,wBAAA,WAAA;AAAA,0BAAY,CAAC,SACX,IAAA,CAAK,GAAA;AAAA,4BAAI,CAAC,GAAA,KACR,GAAA,CAAI,EAAA,KAAO,QAAA,GACP,EAAE,GAAG,GAAA,EAAK,SAAA,EAAW,MAAA,CAAO,SAAA,EAAU,GACtC;AAAA;AACN,yBACF;AAAA,sBACF;AACA,sBAAA;AAAA,oBAEF,KAAK,iBAAA;AACH,sBAAA,UAAA,GAAa;AAAA,wBACX,IAAA,EAAM,OAAA;AAAA,wBACN,UAAU,MAAA,CAAO,SAAA;AAAA,wBACjB,WAAW,MAAA,CAAO;AAAA,uBACnB,CAAA;AACD,sBAAA;AACE,wBAAA,MAAM,KAAA,GAAkB;AAAA,0BACtB,EAAA,EAAI,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA;AAAA,0BACtB,MAAM,MAAA,CAAO,SAAA;AAAA,0BACb,WAAA,EAAa,OAAO,YAAA,IAAgB,KAAA,CAAA;AAAA,0BACpC,SAAA,EAAW,MAAA,CAAO,SAAA,IAAa,EAAC;AAAA,0BAChC,MAAA,EAAQ,WAAA;AAAA,0BACR,SAAA,sBAAe,IAAA;AAAK,yBACtB;AACA,wBAAA,qBAAA,CAAsB,OAAA,GAAU,CAAC,GAAG,qBAAA,CAAsB,SAAS,KAAK,CAAA;AACxE,wBAAA,kBAAA,CAAmB,CAAC,IAAA,KAAS,CAAC,GAAG,IAAA,EAAM,KAAK,CAAC,CAAA;AAAA,sBAC/C;AACA,sBAAA;AAAA,oBAEF,KAAK,oBAAA;AACH,sBAAA,UAAA,GAAa;AAAA,wBACX,IAAA,EAAM,UAAA;AAAA,wBACN,UAAU,MAAA,CAAO,SAAA;AAAA,wBACjB,SAAS,MAAA,CAAO;AAAA,uBACjB,CAAA;AACD,sBAAA;AACE,wBAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,OAAA,GAAU,UAAA,GAAa,OAAA;AAErD,wBAAA,IAAI,SAAA,GAAY,KAAA;AAChB,wBAAA,qBAAA,CAAsB,OAAA,GAAU,qBAAA,CAAsB,OAAA,CAAQ,GAAA,CAAI,CAAC,IAAA,KAAS;AAC1E,0BAAA,IAAI,CAAC,aAAa,IAAA,CAAK,IAAA,KAAS,OAAO,SAAA,IAAa,IAAA,CAAK,WAAW,WAAA,EAAa;AAC/E,4BAAA,SAAA,GAAY,IAAA;AACZ,4BAAA,OAAO,EAAE,GAAG,IAAA,EAAM,MAAA,EAAQ,cAAA,EAAuC;AAAA,0BACnE;AACA,0BAAA,OAAO,IAAA;AAAA,wBACT,CAAC,CAAA;AAED,wBAAA,kBAAA,CAAmB,CAAC,IAAA,KAAS;AAC3B,0BAAA,IAAI,OAAA,GAAU,KAAA;AACd,0BAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,IAAA,KAAS;AACxB,4BAAA,IAAI,CAAC,WAAW,IAAA,CAAK,IAAA,KAAS,OAAO,SAAA,IAAa,IAAA,CAAK,WAAW,WAAA,EAAa;AAC7E,8BAAA,OAAA,GAAU,IAAA;AACV,8BAAA,OAAO,EAAE,GAAG,IAAA,EAAM,MAAA,EAAQ,cAAA,EAAuC;AAAA,4BACnE;AACA,4BAAA,OAAO,IAAA;AAAA,0BACT,CAAC,CAAA;AAAA,wBACH,CAAC,CAAA;AAED,wBAAA,WAAA;AAAA,0BAAY,CAAC,SACX,IAAA,CAAK,GAAA;AAAA,4BAAI,CAAC,GAAA,KACR,GAAA,CAAI,SAAA,GACA;AAAA,8BACE,GAAG,GAAA;AAAA,8BACH,SAAA,EAAW,IAAI,SAAA,CAAU,GAAA;AAAA,gCAAI,CAAC,EAAA,KAC5B,EAAA,CAAG,IAAA,KAAS,OAAO,SAAA,IAAa,EAAA,CAAG,MAAA,KAAW,WAAA,GAC1C,EAAE,GAAG,EAAA,EAAI,MAAA,EAAQ,gBAAuC,GACxD;AAAA;AACN,6BACF,GACA;AAAA;AACN,yBACF;AAAA,sBACF;AACA,sBAAA;AAAA,oBAEF,KAAK,aAAA;AACH,sBAAA,IAAI,MAAA,CAAO,SAAA,IAAa,MAAA,CAAO,MAAA,EAAQ;AACrC,wBAAA,YAAA,GAAe,MAAA,CAAO,SAAA,EAAW,MAAA,CAAO,MAAM,CAAA;AAE9C,wBAAA,IAAI,aAAA,GAAgB,KAAA;AACpB,wBAAA,qBAAA,CAAsB,OAAA,GAAU,qBAAA,CAAsB,OAAA,CAAQ,GAAA,CAAI,CAAC,IAAA,KAAS;AAC1E,0BAAA,IAAI,CAAC,iBAAiB,IAAA,CAAK,IAAA,KAAS,OAAO,SAAA,IAAa,CAAC,KAAK,MAAA,EAAQ;AACpE,4BAAA,aAAA,GAAgB,IAAA;AAChB,4BAAA,OAAO,EAAE,GAAG,IAAA,EAAM,MAAA,EAAQ,OAAO,MAAA,EAAO;AAAA,0BAC1C;AACA,0BAAA,OAAO,IAAA;AAAA,wBACT,CAAC,CAAA;AAED,wBAAA,kBAAA,CAAmB,CAAC,IAAA,KAAS;AAC3B,0BAAA,IAAI,OAAA,GAAU,KAAA;AACd,0BAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,IAAA,KAAS;AACxB,4BAAA,IAAI,CAAC,WAAW,IAAA,CAAK,IAAA,KAAS,OAAO,SAAA,IAAa,CAAC,KAAK,MAAA,EAAQ;AAC9D,8BAAA,OAAA,GAAU,IAAA;AACV,8BAAA,OAAO,EAAE,GAAG,IAAA,EAAM,MAAA,EAAQ,OAAO,MAAA,EAAO;AAAA,4BAC1C;AACA,4BAAA,OAAO,IAAA;AAAA,0BACT,CAAC,CAAA;AAAA,wBACH,CAAC,CAAA;AAED,wBAAA,WAAA;AAAA,0BAAY,CAAC,SACX,IAAA,CAAK,GAAA;AAAA,4BAAI,CAAC,GAAA,KACR,GAAA,CAAI,SAAA,GACA;AAAA,8BACE,GAAG,GAAA;AAAA,8BACH,SAAA,EAAW,IAAI,SAAA,CAAU,GAAA;AAAA,gCAAI,CAAC,EAAA,KAC5B,EAAA,CAAG,IAAA,KAAS,OAAO,SAAA,IAAa,CAAC,EAAA,CAAG,MAAA,GAChC,EAAE,GAAG,EAAA,EAAI,MAAA,EAAQ,MAAA,CAAO,QAAO,GAC/B;AAAA;AACN,6BACF,GACA;AAAA;AACN,yBACF;AAAA,sBACF;AACA,sBAAA;AAAA,oBAEF,KAAK,mBAAA;AACH,sBAAA,IAAI,OAAO,KAAA,IAAS,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,KAAK,CAAA,EAAG;AAC/C,wBAAA,WAAA;AAAA,0BAAY,CAAC,SACX,IAAA,CAAK,GAAA;AAAA,4BAAI,CAAC,GAAA,KACR,GAAA,CAAI,OAAO,QAAA,GACP,EAAE,GAAG,GAAA,EAAK,KAAA,EAAO,CAAC,GAAI,GAAA,CAAI,SAAS,EAAC,EAAI,GAAG,MAAA,CAAO,KAAK,GAAE,GACzD;AAAA;AACN,yBACF;AAAA,sBACF;AACA,sBAAA;AAAA,oBAEF,KAAK,kBAAA;AACH,sBAAA;AACE,wBAAA,MAAM,gBAAgB,sBAAA,CAAuB,OAAA,GAAU,MAAA,CAAO,SAAS,GAAG,gBAAA,KAAqB,IAAA;AAC/F,wBAAA,IAAI,aAAA,EAAe;AACjB,0BAAA,MAAM,aAAA,GAA0B;AAAA,4BAC9B,IAAI,MAAA,CAAO,YAAA,IAAgB,CAAA,KAAA,EAAQ,IAAA,CAAK,KAAK,CAAA,CAAA;AAAA,4BAC7C,MAAM,MAAA,CAAO,SAAA;AAAA,4BACb,WAAA,EAAa,OAAO,YAAA,IAAgB,KAAA,CAAA;AAAA,4BACpC,SAAA,EAAW,MAAA,CAAO,SAAA,IAAa,EAAC;AAAA,4BAChC,MAAA,EAAQ,kBAAA;AAAA,4BACR,eAAA,EAAiB,IAAA;AAAA,4BACjB,SAAA,sBAAe,IAAA;AAAK,2BACtB;AACA,0BAAA,qBAAA,CAAsB,OAAA,GAAU,CAAC,GAAG,qBAAA,CAAsB,SAAS,aAAa,CAAA;AAChF,0BAAA,kBAAA,CAAmB,CAAC,IAAA,KAAS,CAAC,GAAG,IAAA,EAAM,aAAa,CAAC,CAAA;AAAA,wBACvD,CAAA,MAAO;AACL,0BAAA,MAAM,aAAA,GAA0B;AAAA,4BAC9B,IAAI,MAAA,CAAO,YAAA,IAAgB,CAAA,KAAA,EAAQ,IAAA,CAAK,KAAK,CAAA,CAAA;AAAA,4BAC7C,MAAM,MAAA,CAAO,SAAA;AAAA,4BACb,WAAA,EAAa,OAAO,YAAA,IAAgB,KAAA,CAAA;AAAA,4BACpC,SAAA,EAAW,MAAA,CAAO,SAAA,IAAa,EAAC;AAAA,4BAChC,MAAA,EAAQ,WAAA;AAAA,4BACR,SAAA,sBAAe,IAAA;AAAK,2BACtB;AACA,0BAAA,qBAAA,CAAsB,OAAA,GAAU,CAAC,GAAG,qBAAA,CAAsB,SAAS,aAAa,CAAA;AAChF,0BAAA,kBAAA,CAAmB,CAAC,IAAA,KAAS,CAAC,GAAG,IAAA,EAAM,aAAa,CAAC,CAAA;AACrD,0BAAA,kBAAA,CAAmB,IAAA,CAAK;AAAA,4BACtB,UAAU,MAAA,CAAO,SAAA;AAAA,4BACjB,YAAY,MAAA,CAAO,YAAA;AAAA,4BACnB,WAAW,MAAA,CAAO;AAAA,2BACnB,CAAA;AAAA,wBACH;AAAA,sBACF;AACA,sBAAA;AAAA,oBAEF,KAAK,uBAAA;AAEH,sBAAA;AACE,wBAAA,MAAM,YAAA,GAAe,sBAAsB,OAAA,CAAQ,SAAA;AAAA,0BACjD,CAAC,EAAA,KAAO,EAAA,CAAG,SAAS,MAAA,CAAO,SAAA,IAAa,GAAG,MAAA,KAAW;AAAA,yBACxD;AACA,wBAAA,IAAI,gBAAgB,CAAA,EAAG;AACrB,0BAAA,MAAM,SAAA,GAAY,qBAAA,CAAsB,OAAA,CAAQ,YAAY,CAAA;AAC5D,0BAAA,MAAM,QAAA,GAAqB;AAAA,4BACzB,GAAG,SAAA;AAAA,4BACH,MAAA,EAAQ,kBAAA;AAAA,4BACR,eAAA,EAAiB,IAAA;AAAA,4BACjB,mBAAA,EAAqB,IAAA;AAAA,4BACrB,SAAA,EAAW,MAAA,CAAO,SAAA,IAAa,SAAA,CAAU;AAAA,2BAC3C;AACA,0BAAA,qBAAA,CAAsB,OAAA,GAAU,sBAAsB,OAAA,CAAQ,GAAA;AAAA,4BAC5D,CAAC,EAAA,EAAI,CAAA,KAAO,CAAA,KAAM,eAAe,QAAA,GAAW;AAAA,2BAC9C;AACA,0BAAA,kBAAA;AAAA,4BAAmB,CAAC,IAAA,KAClB,IAAA,CAAK,GAAA,CAAI,CAAC,EAAA,KAAQ,EAAA,CAAG,EAAA,KAAO,SAAA,CAAU,EAAA,GAAK,QAAA,GAAW,EAAG;AAAA,2BAC3D;AAAA,wBACF,CAAA,MAAO;AACL,0BAAA,MAAM,YAAA,GAAyB;AAAA,4BAC7B,EAAA,EAAI,CAAA,QAAA,EAAW,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA;AAAA,4BACzB,MAAM,MAAA,CAAO,SAAA;AAAA,4BACb,WAAA,EAAa,OAAO,YAAA,IAAgB,KAAA,CAAA;AAAA,4BACpC,SAAA,EAAW,MAAA,CAAO,SAAA,IAAa,EAAC;AAAA,4BAChC,MAAA,EAAQ,kBAAA;AAAA,4BACR,eAAA,EAAiB,IAAA;AAAA,4BACjB,mBAAA,EAAqB,IAAA;AAAA,4BACrB,SAAA,sBAAe,IAAA;AAAK,2BACtB;AACA,0BAAA,qBAAA,CAAsB,OAAA,GAAU,CAAC,GAAG,qBAAA,CAAsB,SAAS,YAAY,CAAA;AAC/E,0BAAA,kBAAA,CAAmB,CAAC,IAAA,KAAS,CAAC,GAAG,IAAA,EAAM,YAAY,CAAC,CAAA;AAAA,wBACtD;AAAA,sBACF;AACA,sBAAA;AAAA;AACJ,gBACF,SAAS,CAAA,EAAG;AACV,kBAAA,OAAA,CAAQ,KAAA,CAAM,+CAA+C,CAAC,CAAA;AAAA,gBAChE;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,wCAAwC,KAAK,CAAA;AAC3D,QAAA,WAAA;AAAA,UAAY,CAAC,SACX,IAAA,CAAK,GAAA;AAAA,YAAI,CAAC,GAAA,KACR,GAAA,CAAI,EAAA,KAAO,QAAA,GACP,EAAE,GAAG,GAAA,EAAK,OAAA,EAAS,2DAAA,EAA4D,GAC/E;AAAA;AACN,SACF;AAAA,MACF,CAAA,SAAE;AACA,QAAA,YAAA,CAAa,KAAK,CAAA;AAAA,MACpB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,MAAA,EAAQ,SAAA,EAAW,cAAA,EAAgB,eAAe,SAAS;AAAA,GAC9D;AAEA,EAAA,MAAM,UAAA,GAAa,WAAA;AAAA,IACjB,OAAO,MAA4B,OAAA,KAAoB;AACrD,MAAA,MAAM,KAAA,GAAQ,iBAAA,CAAkB,IAAA,KAAS,MAAA,GAAS,SAAS,KAAK,CAAA;AAChE,MAAA,MAAM,UAAA,GAAsB;AAAA,QAC1B,EAAA,EAAI,KAAA;AAAA,QACJ,OAAA;AAAA,QACA,OAAO,IAAA,KAAS,WAAA;AAAA,QAChB,SAAA,sBAAe,IAAA;AAAK,OACtB;AAGA,MAAA,WAAA,CAAY,CAAC,IAAA,KAAS,CAAC,GAAG,IAAA,EAAM,UAAU,CAAC,CAAA;AAG3C,MAAA,IAAI,cAAA,EAAgB;AAClB,QAAA,IAAI;AACF,UAAA,MAAM,gBAAgB,MAAA,CAAO,qBAAA;AAC7B,UAAA,MAAM,KAAA,CAAM,CAAA,EAAG,MAAM,CAAA,wBAAA,EAA2B,cAAc,CAAA,SAAA,CAAA,EAAa;AAAA,YACzE,MAAA,EAAQ,MAAA;AAAA,YACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,YAC9C,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,cACnB,UAAA,EAAY,SAAA;AAAA,cACZ,eAAA,EAAiB,cAAA;AAAA,cACjB,IAAA;AAAA,cACA,OAAA;AAAA,cACA,cAAA,EAAgB;AAAA,aACjB;AAAA,WACF,CAAA;AAAA,QACH,SAAS,CAAA,EAAG;AAEV,UAAA,OAAA,CAAQ,IAAA,CAAK,qCAAqC,CAAC,CAAA;AAAA,QACrD;AAAA,MACF;AAAA,IACF,CAAA;AAAA,IACA,CAAC,MAAA,EAAQ,SAAA,EAAW,cAAc;AAAA,GACpC;AAGA,EAAA,MAAM,oBAAA,GAAuB,WAAA;AAAA,IAC3B,CAAC,YAAoB,MAAA,KAA+B;AAClD,MAAA,kBAAA;AAAA,QAAmB,CAAC,IAAA,KAClB,IAAA,CAAK,GAAA,CAAI,CAAC,EAAA,KAAQ,EAAA,CAAG,EAAA,KAAO,UAAA,GAAa,EAAE,GAAG,EAAA,EAAI,MAAA,KAAW,EAAG;AAAA,OAClE;AACA,MAAA,qBAAA,CAAsB,OAAA,GAAU,sBAAsB,OAAA,CAAQ,GAAA;AAAA,QAAI,CAAC,OACjE,EAAA,CAAG,EAAA,KAAO,aAAa,EAAE,GAAG,EAAA,EAAI,MAAA,EAAO,GAAI;AAAA,OAC7C;AAEA,MAAA,WAAA;AAAA,QAAY,CAAC,SACX,IAAA,CAAK,GAAA;AAAA,UAAI,CAAC,GAAA,KACR,GAAA,CAAI,SAAA,GACA;AAAA,YACE,GAAG,GAAA;AAAA,YACH,SAAA,EAAW,IAAI,SAAA,CAAU,GAAA;AAAA,cAAI,CAAC,OAC5B,EAAA,CAAG,EAAA,KAAO,aAAa,EAAE,GAAG,EAAA,EAAI,MAAA,EAAO,GAAI;AAAA;AAC7C,WACF,GACA;AAAA;AACN,OACF;AAAA,IACF,CAAA;AAAA,IACA;AAAC,GACH;AAEA,EAAA,OAAO;AAAA,IACL,QAAA;AAAA,IACA,SAAA;AAAA,IACA,eAAA;AAAA,IACA,cAAA;AAAA,IACA,aAAA;AAAA,IACA,gBAAA;AAAA,IACA,mBAAA;AAAA,IACA,gBAAA;AAAA,IACA,iBAAA;AAAA,IACA,WAAA;AAAA,IACA,cAAA;AAAA,IACA,aAAA;AAAA,IACA,YAAA;AAAA,IACA,gBAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACF;AACF;ACxkCO,SAAS,gBAAA,CAAiB,EAAE,SAAA,EAAW,MAAA,GAAS,IAAG,EAA4B;AACpF,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIC,QAAAA,CAAyB,EAAE,CAAA;AACrE,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAIA,SAAS,KAAK,CAAA;AAE9D,EAAA,MAAM,iBAAA,GAAoBC,YAAY,YAAqC;AACzE,IAAA,MAAM,QAAQ,MAAA,CAAO,qBAAA;AACrB,IAAA,IAAI,CAAC,KAAA,EAAO,OAAO,EAAC;AAEpB,IAAA,IAAI;AACF,MAAA,MAAM,MAAM,MAAM,KAAA;AAAA,QAChB,GAAG,MAAM,CAAA,mCAAA,EAAsC,SAAS,CAAA,gBAAA,EAAmB,kBAAA,CAAmB,KAAK,CAAC,CAAA;AAAA,OACtG;AACA,MAAA,IAAI,IAAI,EAAA,EAAI;AACV,QAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,aAAA,IAAiB,EAAC;AACrC,QAAA,gBAAA,CAAiB,KAAK,CAAA;AACtB,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,wCAAwC,KAAK,CAAA;AAAA,IAC7D;AACA,IAAA,OAAO,EAAC;AAAA,EACV,CAAA,EAAG,CAAC,MAAA,EAAQ,SAAS,CAAC,CAAA;AAEtB,EAAA,MAAM,uBAAA,GAA0BA,WAAAA;AAAA,IAC9B,OAAO,cAAA,KAA+C;AACpD,MAAA,MAAM,QAAQ,MAAA,CAAO,qBAAA;AACrB,MAAA,IAAI,CAAC,KAAA,EAAO,OAAO,EAAC;AAEpB,MAAA,mBAAA,CAAoB,IAAI,CAAA;AAExB,MAAA,IAAI;AACF,QAAA,MAAM,MAAM,MAAM,KAAA;AAAA,UAChB,CAAA,EAAG,MAAM,CAAA,wBAAA,EAA2B,cAAc,uBAAuB,SAAS,CAAA,gBAAA,EAAmB,kBAAA,CAAmB,KAAK,CAAC,CAAA;AAAA,SAChI;AAEA,QAAA,IAAI,IAAI,EAAA,EAAI;AACV,UAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,UAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,QAAA,IAAY,EAAC;AAS1C,UAAA,OAAO,eAAA,CACJ,MAAA;AAAA,YAAO,CAAC,QACP,GAAA,CAAI,IAAA,KAAS,UAAU,CAAC,GAAA,CAAI,OAAA,CAAQ,UAAA,CAAW,sBAAsB;AAAA,WACvE,CACC,GAAA,CAAI,CAAC,GAAA,EAAqB,GAAA,MAAiB;AAAA,YAC1C,EAAA,EAAI,WAAW,GAAG,CAAA,CAAA;AAAA,YAClB,SAAS,GAAA,CAAI,OAAA;AAAA,YACb,KAAA,EAAO,IAAI,IAAA,KAAS,WAAA;AAAA,YACpB,SAAA,sBAAe,IAAA,EAAK;AAAA,YACpB,UAAU,GAAA,CAAI,QAAA;AAAA,YACd,gBAAA,EAAkB,IAAA;AAAA,YAClB,WAAW,GAAA,CAAI,UAAA,EAAY,GAAA,CAAI,CAAC,IAAI,CAAA,MAAO;AAAA,cACzC,EAAA,EAAI,CAAA,aAAA,EAAgB,GAAG,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA;AAAA,cAC5B,MAAM,EAAA,CAAG,IAAA;AAAA,cACT,WAAA,EAAa,GAAG,YAAA,IAAgB,KAAA,CAAA;AAAA,cAChC,SAAA,EAAW,EAAA,CAAG,SAAA,IAAa,EAAC;AAAA,cAC5B,QAAQ,EAAA,CAAG,MAAA;AAAA,cACX,SAAA,sBAAe,IAAA;AAAK,aACtB,CAAE;AAAA,WACJ,CAAE,CAAA;AAAA,QACN;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,8CAA8C,KAAK,CAAA;AAAA,MACnE,CAAA,SAAE;AACA,QAAA,mBAAA,CAAoB,KAAK,CAAA;AAAA,MAC3B;AAEA,MAAA,OAAO,EAAC;AAAA,IACV,CAAA;AAAA,IACA,CAAC,QAAQ,SAAS;AAAA,GACpB;AAEA,EAAA,MAAM,gCAAA,GAAmCA,WAAAA;AAAA,IACvC,OAAO,cAAA,KAA+C;AACpD,MAAA,mBAAA,CAAoB,IAAI,CAAA;AAExB,MAAA,IAAI;AACF,QAAA,MAAM,MAAM,MAAM,KAAA;AAAA,UAChB,CAAA,EAAG,MAAM,CAAA,wBAAA,EAA2B,cAAc,iCAAiC,SAAS,CAAA;AAAA,SAC9F;AAEA,QAAA,IAAI,IAAI,EAAA,EAAI;AACV,UAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,UAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,QAAA,IAAY,EAAC;AAS1C,UAAA,OAAO,eAAA,CACJ,MAAA;AAAA,YAAO,CAAC,QACP,GAAA,CAAI,IAAA,KAAS,UAAU,CAAC,GAAA,CAAI,OAAA,CAAQ,UAAA,CAAW,sBAAsB;AAAA,WACvE,CACC,GAAA,CAAI,CAAC,GAAA,EAAqB,GAAA,MAAiB;AAAA,YAC1C,EAAA,EAAI,WAAW,GAAG,CAAA,CAAA;AAAA,YAClB,SAAS,GAAA,CAAI,OAAA;AAAA,YACb,KAAA,EAAO,IAAI,IAAA,KAAS,WAAA;AAAA,YACpB,SAAA,sBAAe,IAAA,EAAK;AAAA,YACpB,UAAU,GAAA,CAAI,QAAA;AAAA,YACd,gBAAA,EAAkB,IAAA;AAAA,YAClB,WAAW,GAAA,CAAI,UAAA,EAAY,GAAA,CAAI,CAAC,IAAI,CAAA,MAAO;AAAA,cACzC,EAAA,EAAI,CAAA,aAAA,EAAgB,GAAG,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA;AAAA,cAC5B,MAAM,EAAA,CAAG,IAAA;AAAA,cACT,WAAA,EAAa,GAAG,YAAA,IAAgB,KAAA,CAAA;AAAA,cAChC,SAAA,EAAW,EAAA,CAAG,SAAA,IAAa,EAAC;AAAA,cAC5B,QAAQ,EAAA,CAAG,MAAA;AAAA,cACX,SAAA,sBAAe,IAAA;AAAK,aACtB,CAAE;AAAA,WACJ,CAAE,CAAA;AAAA,QACN;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,wDAAwD,KAAK,CAAA;AAAA,MAC7E,CAAA,SAAE;AACA,QAAA,mBAAA,CAAoB,KAAK,CAAA;AAAA,MAC3B;AAEA,MAAA,OAAO,EAAC;AAAA,IACV,CAAA;AAAA,IACA,CAAC,QAAQ,SAAS;AAAA,GACpB;AAEA,EAAA,OAAO;AAAA,IACL,aAAA;AAAA,IACA,gBAAA;AAAA,IACA,iBAAA;AAAA,IACA,uBAAA;AAAA,IACA;AAAA,GACF;AACF;ACrIO,SAAS,WAAA,CAAY;AAAA,EAC1B,SAAA;AAAA,EACA,MAAA,GAAS,EAAA;AAAA,EACT,cAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAA,EAAuB;AACrB,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAID,SAAgC,IAAI,CAAA;AAChF,EAAA,MAAM,kBAAA,GAAqBE,OAA+B,IAAI,CAAA;AAE9D,EAAA,MAAM,aAAA,GAAgBD,WAAAA,CAAY,CAAC,IAAA,EAAc,KAAA,KAAmC;AAClF,IAAA,iBAAA,CAAkB,EAAE,IAAA,EAAM,KAAA,EAAO,CAAA;AAAA,EACnC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,UAAA,GAAaA,WAAAA,CAAY,CAAC,MAAA,EAAgB,MAAA,KAAoC;AAClF,IAAA,iBAAA,CAAkB,CAAC,IAAA,KAAS;AAC1B,MAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,MAAA,OAAO;AAAA,QACL,GAAG,IAAA;AAAA,QACH,KAAA,EAAO,KAAK,KAAA,CAAM,GAAA;AAAA,UAAI,CAAC,SACrB,IAAA,CAAK,EAAA,KAAO,SAAS,EAAE,GAAG,IAAA,EAAM,MAAA,EAAO,GAAI;AAAA;AAC7C,OACF;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,YAAA,GAAeA,YAAY,MAAM;AACrC,IAAA,iBAAA,CAAkB,CAAC,IAAA,KAAS;AAC1B,MAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,MAAA,OAAO,EAAE,GAAG,IAAA,EAAM,UAAA,EAAY,IAAA,EAAK;AAAA,IACrC,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,WAAA,GAAcA,WAAAA,CAAY,CAAC,KAAA,GAAgB,CAAA,KAAM;AACrD,IAAA,IAAI,QAAQ,CAAA,EAAG;AACb,MAAA,UAAA,CAAW,MAAM,iBAAA,CAAkB,IAAI,CAAA,EAAG,KAAK,CAAA;AAAA,IACjD,CAAA,MAAO;AACL,MAAA,iBAAA,CAAkB,IAAI,CAAA;AAAA,IACxB;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,YAAA,GAAeA,YAAY,YAAY;AAC3C,IAAA,kBAAA,CAAmB,OAAA,GAAU,IAAI,eAAA,EAAgB;AAEjD,IAAA,IAAI;AACF,MAAA,MAAM,gBAAgB,MAAA,CAAO,qBAAA;AAE7B,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,MAAM,CAAA,iBAAA,CAAA,EAAqB;AAAA,QACzD,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,QAC9C,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,UACnB,UAAA,EAAY,SAAA;AAAA,UACZ,OAAA,EAAS,iBAAA;AAAA,UACT,eAAA,EAAiB,cAAA;AAAA,UACjB,cAAA,EAAgB,aAAA;AAAA,UAChB,KAAA,EAAO;AAAA,SACR,CAAA;AAAA,QACD,MAAA,EAAQ,mBAAmB,OAAA,CAAQ;AAAA,OACpC,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAElB,MAAA,MAAM,MAAA,GAAS,QAAA,CAAS,IAAA,EAAM,SAAA,EAAU;AACxC,MAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAEhC,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,OAAO,IAAA,EAAM;AACX,UAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,OAAO,IAAA,EAAK;AAC1C,UAAA,IAAI,IAAA,EAAM;AAEV,UAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,MAAA,CAAO,KAAK,CAAA;AAClC,UAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,IAAI,CAAA;AAE9B,UAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,YAAA,IAAI,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC7B,cAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAC,EAAE,IAAA,EAAK;AAChC,cAAA,IAAI,SAAS,QAAA,EAAU;AAEvB,cAAA,IAAI;AACF,gBAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC9B,gBAAA,IAAI,MAAA,CAAO,SAAS,gBAAA,EAAkB;AACpC,kBAAA,iBAAA,CAAkB,IAAI,CAAA;AAAA,gBACxB;AACA,gBAAA,IAAI,MAAA,CAAO,IAAA,KAAS,SAAA,IAAa,MAAA,CAAO,OAAA,EAAS;AAC/C,kBAAA,SAAA,GAAY,OAAO,OAAO,CAAA;AAAA,gBAC5B;AAAA,cACF,CAAA,CAAA,MAAQ;AAAA,cAER;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,+BAA+B,KAAK,CAAA;AAAA,IACpD,CAAA,SAAE;AACA,MAAA,kBAAA,CAAmB,OAAA,GAAU,IAAA;AAAA,IAC/B;AAAA,EACF,GAAG,CAAC,MAAA,EAAQ,WAAW,cAAA,EAAgB,aAAA,EAAe,SAAS,CAAC,CAAA;AAEhE,EAAA,OAAO;AAAA,IACL,cAAA;AAAA,IACA,aAAA;AAAA,IACA,UAAA;AAAA,IACA,YAAA;AAAA,IACA,WAAA;AAAA,IACA;AAAA,GACF;AACF;AChHO,SAAS,WAAW,EAAE,YAAA,EAAc,OAAA,EAAQ,GAAuB,EAAC,EAAG;AAC5E,EAAA,MAAM,eAAA,GAAkBC,OAAO,YAAY,CAAA;AAC3C,EAAA,MAAM,UAAA,GAAaA,OAAO,OAAO,CAAA;AACjC,EAAA,MAAM,mBAAA,GAAsBA,OAAO,KAAK,CAAA;AAExC,EAAAC,UAAU,MAAM;AACd,IAAA,eAAA,CAAgB,OAAA,GAAU,YAAA;AAC1B,IAAA,UAAA,CAAW,OAAA,GAAU,OAAA;AAAA,EACvB,CAAC,CAAA;AAED,EAAAA,UAAU,MAAM;AAEd,IAAA,IAAI,CAAC,OAAO,mBAAA,EAAqB;AAC/B,MAAA,MAAA,CAAO,sBAAsB,EAAC;AAAA,IAChC;AAGA,IAAA,KAAA,MAAW,CAAC,QAAA,EAAU,OAAO,KAAK,MAAA,CAAO,OAAA,CAAQ,aAAa,CAAA,EAAG;AAC/D,MAAA,IAAI,CAAC,MAAA,CAAO,mBAAA,CAAoB,QAAQ,CAAA,EAAG;AACzC,QAAA,MAAA,CAAO,mBAAA,CAAoB,QAAQ,CAAA,GAAI,OAAA;AACvC,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,gCAAA,EAAmC,QAAQ,CAAA,CAAE,CAAA;AAAA,MAC3D;AAAA,IACF;AAEA,IAAA,MAAA,CAAO,IAAA,GAAO,SAAU,OAAA,EAAiB,OAAA,EAAmB;AAC1D,MAAA,MAAM,IAAA,GAAO,OAAA;AAEb,MAAA,QAAQ,OAAA;AAAS,QACf,KAAK,UAAA;AACH,UAAA,IAAI,CAAC,MAAM,KAAA,EAAO;AAChB,YAAA,OAAA,CAAQ,MAAM,oCAAoC,CAAA;AAClD,YAAA;AAAA,UACF;AAEA,UAAA,MAAA,CAAO,wBAAwB,IAAA,CAAK,KAAA;AAEpC,UAAA,MAAM,EAAE,KAAA,EAAO,GAAG,QAAA,EAAS,GAAI,IAAA;AAC/B,UAAA,MAAA,CAAO,sBAAA,GAAyB,QAAA;AAEhC,UAAA,OAAA,CAAQ,IAAI,wBAAwB,CAAA;AACpC,UAAA,MAAA,CAAO,aAAA;AAAA,YACL,IAAI,YAAY,iBAAA,EAAmB,EAAE,QAAQ,EAAE,KAAA,EAAO,QAAA,EAAS,EAAG;AAAA,WACpE;AACA,UAAA;AAAA,QAEF,KAAK,WAAA;AACH,UAAA,MAAA,CAAO,qBAAA,GAAwB,MAAA;AAC/B,UAAA,MAAA,CAAO,sBAAA,GAAyB,MAAA;AAChC,UAAA,OAAA,CAAQ,IAAI,mBAAmB,CAAA;AAC/B,UAAA,MAAA,CAAO,aAAA,CAAc,IAAI,WAAA,CAAY,YAAY,CAAC,CAAA;AAClD,UAAA;AAAA,QAEF,KAAK,eAAA;AACH,UAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AACrC,YAAA,OAAA,CAAQ,MAAM,2CAA2C,CAAA;AACzD,YAAA;AAAA,UACF;AAEA,UAAA,IAAI,CAAC,OAAO,mBAAA,EAAqB;AAC/B,YAAA,MAAA,CAAO,sBAAsB,EAAC;AAAA,UAChC;AAEA,UAAA,KAAA,MAAW,CAAC,QAAA,EAAU,OAAO,KAAK,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,EAAG;AACtD,YAAA,IAAI,OAAO,YAAY,UAAA,EAAY;AACjC,cAAA,MAAA,CAAO,mBAAA,CAAoB,QAAQ,CAAA,GAAI,OAAA;AACvC,cAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,wBAAA,EAA2B,QAAQ,CAAA,CAAE,CAAA;AAAA,YACnD;AAAA,UACF;AACA,UAAA;AAAA,QAEF,KAAK,YAAA;AACH,UAAA,IAAI,CAAC,MAAM,SAAA,EAAW;AACpB,YAAA,OAAA,CAAQ,MAAM,0CAA0C,CAAA;AACxD,YAAA;AAAA,UACF;AACA,UAAA,MAAA,CAAO,aAAA;AAAA,YACL,IAAI,YAAY,iBAAA,EAAmB;AAAA,cACjC,MAAA,EAAQ,EAAE,SAAA,EAAW,IAAA,CAAK,WAAW,MAAA,EAAQ,IAAA,CAAK,MAAA,IAAU,EAAC;AAAE,aAChE;AAAA,WACH;AACA,UAAA;AAAA,QAEF,KAAK,YAAA;AACH,UAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AACrC,YAAA,OAAA,CAAQ,MAAM,wCAAwC,CAAA;AACtD,YAAA;AAAA,UACF;AAEA,UAAA,MAAA,CAAO,mBAAA,GAAsB;AAAA,YAC3B,GAAI,MAAA,CAAO,mBAAA,IAAuB,EAAC;AAAA,YACnC,GAAG;AAAA,WACL;AACA,UAAA,OAAA,CAAQ,GAAA,CAAI,wBAAA,EAA0B,MAAA,CAAO,mBAAmB,CAAA;AAChE,UAAA;AAAA,QAEF,KAAK,cAAA;AACH,UAAA,MAAA,CAAO,mBAAA,GAAsB,MAAA;AAC7B,UAAA,OAAA,CAAQ,IAAI,wBAAwB,CAAA;AACpC,UAAA;AAAA,QAEF,KAAK,yBAAA;AACH,UAAA,IAAI,OAAO,SAAS,UAAA,EAAY;AAC9B,YAAA,OAAA,CAAQ,MAAM,sDAAsD,CAAA;AACpE,YAAA;AAAA,UACF;AACA,UAAA,MAAA,CAAO,6BAAA,GAAgC,IAAA;AACvC,UAAA,OAAA,CAAQ,IAAI,0CAA0C,CAAA;AACtD,UAAA;AAAA,QAEF,KAAK,cAAA;AACH,UAAA,IAAI,OAAO,SAAS,UAAA,EAAY;AAC9B,YAAA,OAAA,CAAQ,MAAM,2CAA2C,CAAA;AACzD,YAAA;AAAA,UACF;AACA,UAAA,MAAA,CAAO,qBAAA,GAAwB,IAAA;AAC/B,UAAA,OAAA,CAAQ,IAAI,yCAAyC,CAAA;AACrD,UAAA;AAAA,QAEF,KAAK,MAAA;AACH,UAAA,MAAA,CAAO,aAAA,CAAc,IAAI,WAAA,CAAY,WAAW,CAAC,CAAA;AACjD,UAAA;AAAA,QAEF,KAAK,OAAA;AACH,UAAA,MAAA,CAAO,aAAA,CAAc,IAAI,WAAA,CAAY,YAAY,CAAC,CAAA;AAClD,UAAA;AAAA,QAEF,KAAK,eAAA;AACH,UAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,YAAA,OAAA,CAAQ,MAAM,0CAA0C,CAAA;AACxD,YAAA;AAAA,UACF;AACA,UAAC,MAAA,CAAe,qBAAqB,OAAA,IAAW,MAAA;AAChD,UAAA,MAAA,CAAO,aAAA;AAAA,YACL,IAAI,WAAA,CAAY,oBAAA,EAAsB,EAAE,MAAA,EAAQ,SAAS;AAAA,WAC3D;AACA,UAAA;AAAA,QAEF,KAAK,aAAA;AACH,UAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,YAAA,OAAA,CAAQ,MAAM,wCAAwC,CAAA;AACtD,YAAA;AAAA,UACF;AACA,UAAC,OAAe,eAAA,GAAkB,OAAA;AAClC,UAAA,MAAA,CAAO,aAAA;AAAA,YACL,IAAI,WAAA,CAAY,kBAAA,EAAoB,EAAE,MAAA,EAAQ,SAAS;AAAA,WACzD;AACA,UAAA;AAAA,QAEF,KAAK,KAAA,EAAO;AACV,UAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AACrC,YAAA,OAAA,CAAQ,MAAM,yCAAyC,CAAA;AACvD,YAAA;AAAA,UACF;AAEA,UAAA,OAAO,QAAQ,IAAgD,CAAA;AAAA,QACjE;AAAA,QAEA,KAAK,qBAAA;AACH,UAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC3B,YAAA,OAAA,CAAQ,MAAM,sEAAsE,CAAA;AACpF,YAAA;AAAA,UACF;AACA,UAAC,OAAe,wBAAA,GAA2B,OAAA;AAC3C,UAAA,MAAA,CAAO,aAAA;AAAA,YACL,IAAI,WAAA,CAAY,0BAAA,EAA4B,EAAE,MAAA,EAAQ,SAAS;AAAA,WACjE;AACA,UAAA;AAAA,QAEF,KAAK,uBAAA;AACH,UAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AACrC,YAAA,OAAA,CAAQ,MAAM,mDAAmD,CAAA;AACjE,YAAA;AAAA,UACF;AACA,UAAA,MAAA,CAAO,qBAAA,GAAwB;AAAA,YAC7B,GAAI,MAAA,CAAO,qBAAA,IAAyB,EAAC;AAAA,YACrC,GAAI;AAAA,WACN;AACA,UAAA,OAAA,CAAQ,IAAI,kCAAkC,CAAA;AAC9C,UAAA;AAAA,QAEF;AACE,UAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,wBAAA,EAA2B,OAAO,CAAA,CAAE,CAAA;AAAA;AACrD,IACF,CAAA;AAEA,IAAA,OAAA,CAAQ,IAAI,kBAAkB,CAAA;AAG9B,IAAA,MAAM,QAAS,MAAA,CAAe,YAAA;AAC9B,IAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,iBAAA,EAAoB,KAAA,CAAM,MAAM,CAAA,kBAAA,CAAoB,CAAA;AAChE,MAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAC,GAAA,EAAK,IAAI,MAAM,MAAA,CAAO,IAAA,CAAK,GAAA,EAAK,IAAI,CAAC,CAAA;AACrD,MAAC,OAAe,YAAA,GAAe,MAAA;AAAA,IACjC;AAEA,IAAA,MAAM,gBAAA,GAAmB,MAAM,eAAA,CAAgB,OAAA,IAAU;AACzD,IAAA,MAAM,WAAA,GAAc,MAAM,UAAA,CAAW,OAAA,IAAU;AAE/C,IAAA,MAAA,CAAO,gBAAA,CAAiB,mBAAmB,gBAAgB,CAAA;AAC3D,IAAA,MAAA,CAAO,gBAAA,CAAiB,cAAc,WAAW,CAAA;AAEjD,IAAA,IAAI,MAAA,CAAO,qBAAA,IAAyB,CAAC,mBAAA,CAAoB,OAAA,EAAS;AAChE,MAAA,mBAAA,CAAoB,OAAA,GAAU,IAAA;AAC9B,MAAA,eAAA,CAAgB,OAAA,IAAU;AAAA,IAC5B;AAEA,IAAA,OAAO,MAAM;AACX,MAAA,MAAA,CAAO,mBAAA,CAAoB,mBAAmB,gBAAgB,CAAA;AAC9D,MAAA,MAAA,CAAO,mBAAA,CAAoB,cAAc,WAAW,CAAA;AAAA,IACtD,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,iBAAA,GAAoBF,WAAAA;AAAA,IACxB,OAAO,UAAkB,IAAA,KAAkC;AACzD,MAAA,MAAM,OAAA,GAAU,MAAA,CAAO,mBAAA,GAAsB,QAAQ,CAAA;AACrD,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,IAAI;AACF,UAAA,OAAO,MAAM,QAAQ,IAAI,CAAA;AAAA,QAC3B,SAAS,GAAA,EAAK;AACZ,UAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,0BAAA,EAA6B,QAAQ,CAAA,CAAA,EAAI,GAAG,CAAA;AAC1D,UAAA,OAAO,EAAE,MAAA,EAAQ,OAAA,EAAS,KAAA,EAAO,MAAA,CAAO,GAAG,CAAA,EAAE;AAAA,QAC/C;AAAA,MACF;AACA,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,uBAAA,EAA0B,QAAQ,CAAA,CAAE,CAAA;AACjD,MAAA,OAAO,EAAE,MAAA,EAAQ,OAAA,EAAS,KAAA,EAAO,uBAAA,EAAwB;AAAA,IAC3D,CAAA;AAAA,IACA;AAAC,GACH;AAEA,EAAA,OAAO,EAAE,iBAAA,EAAkB;AAC7B;;;ACvOO,IAAM,qBAAA,GAA8C;AAAA;AAAA;AAAA;AAAA,EAIzD,MAAA,EAAQ;AAAA;AAAA,IAEN,OAAA,EAAS,SAAA;AAAA;AAAA,IAGT,UAAA,EAAY,2BAAA;AAAA,IACZ,MAAA,EAAQ,SAAA;AAAA,IACR,IAAA,EAAM,SAAA;AAAA;AAAA,IAGN,SAAA,EAAW,SAAA;AAAA,IACX,OAAA,EAAS,SAAA;AAAA;AAAA,IAGT,UAAA,EAAY,SAAA;AAAA,IACZ,QAAA,EAAU,SAAA;AAAA,IACV,UAAA,EAAY,SAAA;AAAA;AAAA,IAGZ,gBAAA,EAAkB,SAAA;AAAA,IAClB,YAAA,EAAc,SAAA;AAAA,IACd,UAAA,EAAY,SAAA;AAAA;AAAA,IAGZ,kBAAA,EAAoB;AAAA,GACtB;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,EAAY;AAAA,IACV,UAAA,EAAY,8EAAA;AAAA,IACZ,QAAA,EAAU,EAAA;AAAA,IACV,cAAA,EAAgB,EAAA;AAAA,IAChB,UAAA,EAAY,GAAA;AAAA,IACZ,UAAA,EAAY,GAAA;AAAA,IACZ,aAAA,EAAe;AAAA,GACjB;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,EAAY;AAAA,IACV,QAAA,EAAU,GAAA;AAAA,IACV,MAAA,EAAQ;AAAA,GACV;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,EAAY;AAAA,IACV,KAAA,EAAO,GAAA;AAAA,IACP,SAAA,EAAW,GAAA;AAAA,IACX,iBAAA,EAAmB,GAAA;AAAA,IACnB,YAAA,EAAc,EAAA;AAAA,IACd,OAAA,EAAS;AAAA,GACX;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,EAAU;AAAA,IACR,KAAA,EAAO,EAAA;AAAA,IACP,MAAA,EAAQ,EAAA;AAAA,IACR,WAAA,EAAa,EAAA;AAAA,IACb,YAAA,EAAc;AAAA,GAChB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM,EAAA;AAAA,IACN,QAAA,EAAU;AAAA,GACZ;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,EAAS;AAAA,IACP,MAAA,EAAQ,uCAAA;AAAA,IACR,MAAA,EAAQ;AAAA,GACV;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,EAAU;AAAA,IACR,aAAA,EAAe,IAAA;AAAA,IACf,aAAA,EAAe,iBAAA;AAAA,IACf,QAAA,EAAU,IAAA;AAAA,IACV,OAAA,EAAS;AAAA;AAEb;AAKO,IAAM,sBAAA,GAAgD;AAAA;AAAA;AAAA;AAAA,EAI3D,MAAA,EAAQ;AAAA,IACN,OAAA,EAAS,SAAA;AAAA,IACT,UAAA,EAAY,2BAAA;AAAA,IACZ,MAAA,EAAQ,SAAA;AAAA,IACR,IAAA,EAAM,SAAA;AAAA,IACN,SAAA,EAAW,SAAA;AAAA,IACX,OAAA,EAAS,SAAA;AAAA,IACT,UAAA,EAAY,SAAA;AAAA,IACZ,QAAA,EAAU,SAAA;AAAA,IACV,UAAA,EAAY,SAAA;AAAA,IACZ,gBAAA,EAAkB,SAAA;AAAA,IAClB,YAAA,EAAc,SAAA;AAAA,IACd,UAAA,EAAY,SAAA;AAAA,IACZ,kBAAA,EAAoB;AAAA,GACtB;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,EAAY;AAAA,IACV,UAAA,EAAY,8EAAA;AAAA,IACZ,QAAA,EAAU,EAAA;AAAA,IACV,cAAA,EAAgB,EAAA;AAAA,IAChB,UAAA,EAAY,GAAA;AAAA,IACZ,UAAA,EAAY,GAAA;AAAA,IACZ,aAAA,EAAe;AAAA,GACjB;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,EAAY;AAAA,IACV,QAAA,EAAU,GAAA;AAAA,IACV,MAAA,EAAQ;AAAA,GACV;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,EAAY;AAAA,IACV,KAAA,EAAO,GAAA;AAAA,IACP,YAAA,EAAc,EAAA;AAAA,IACd,YAAA,EAAc,EAAA;AAAA,IACd,OAAA,EAAS;AAAA,GACX;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,EAAU;AAAA,IACR,IAAA,EAAM;AAAA,GACR;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,EAAU;AAAA,IACR,aAAA,EAAe,IAAA;AAAA,IACf,aAAA,EAAe;AAAA;AAEnB;;;AC/JA,SAAS,SAAA,CACP,QACA,MAAA,EACG;AACH,EAAA,IAAI,CAAC,QAAQ,OAAO,MAAA;AAEpB,EAAA,MAAM,MAAA,GAAS,EAAE,GAAG,MAAA,EAAO;AAE3B,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,EAAqB;AACvD,IAAA,MAAM,WAAA,GAAc,OAAO,GAAG,CAAA;AAC9B,IAAA,MAAM,WAAA,GAAc,OAAO,GAAG,CAAA;AAE9B,IAAA,IACE,gBAAgB,MAAA,IAChB,WAAA,KAAgB,QAChB,OAAO,WAAA,KAAgB,YACvB,CAAC,KAAA,CAAM,QAAQ,WAAW,CAAA,IAC1B,OAAO,WAAA,KAAgB,QAAA,IACvB,CAAC,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA,EAC1B;AAEA,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,SAAA;AAAA,QACZ,WAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF,CAAA,MAAA,IAAW,gBAAgB,MAAA,EAAW;AAEpC,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,WAAA;AAAA,IAChB;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAkBO,SAAS,iBAAA,CACd,UACA,UAAA,EACsB;AAEtB,EAAA,IAAI,MAAA,GAAS,EAAE,GAAG,qBAAA,EAAsB;AAGxC,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,MAAA,GAAS;AAAA,MACP,MAAA,EAAQ,SAAA,CAAU,MAAA,CAAO,MAAA,EAAQ,SAAS,MAAM,CAAA;AAAA,MAChD,UAAA,EAAY,SAAA,CAAU,MAAA,CAAO,UAAA,EAAY,SAAS,UAAU,CAAA;AAAA,MAC5D,UAAA,EAAY,SAAA,CAAU,MAAA,CAAO,UAAA,EAAY,SAAS,UAAU,CAAA;AAAA,MAC5D,UAAA,EAAY,SAAA,CAAU,MAAA,CAAO,UAAA,EAAY,SAAS,UAAU,CAAA;AAAA,MAC5D,QAAA,EAAU,SAAA,CAAU,MAAA,CAAO,QAAA,EAAU,SAAS,QAAQ,CAAA;AAAA,MACtD,MAAA,EAAQ,SAAA,CAAU,MAAA,CAAO,MAAA,EAAQ,SAAS,MAAM,CAAA;AAAA,MAChD,OAAA,EAAS,SAAA,CAAU,MAAA,CAAO,OAAA,EAAS,SAAS,OAAO,CAAA;AAAA,MACnD,QAAA,EAAU,SAAA,CAAU,MAAA,CAAO,QAAA,EAAU,SAAS,QAAQ;AAAA,KACxD;AAAA,EACF;AAGA,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,MAAA,GAAS;AAAA,MACP,MAAA,EAAQ,SAAA,CAAU,MAAA,CAAO,MAAA,EAAQ,WAAW,MAAM,CAAA;AAAA,MAClD,UAAA,EAAY,SAAA,CAAU,MAAA,CAAO,UAAA,EAAY,WAAW,UAAU,CAAA;AAAA,MAC9D,UAAA,EAAY,SAAA,CAAU,MAAA,CAAO,UAAA,EAAY,WAAW,UAAU,CAAA;AAAA,MAC9D,UAAA,EAAY,SAAA,CAAU,MAAA,CAAO,UAAA,EAAY,WAAW,UAAU,CAAA;AAAA,MAC9D,QAAA,EAAU,SAAA,CAAU,MAAA,CAAO,QAAA,EAAU,WAAW,QAAQ,CAAA;AAAA,MACxD,MAAA,EAAQ,SAAA,CAAU,MAAA,CAAO,MAAA,EAAQ,WAAW,MAAM,CAAA;AAAA,MAClD,OAAA,EAAS,SAAA,CAAU,MAAA,CAAO,OAAA,EAAS,WAAW,OAAO,CAAA;AAAA,MACrD,QAAA,EAAU,SAAA,CAAU,MAAA,CAAO,QAAA,EAAU,WAAW,QAAQ;AAAA,KAC1D;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AASO,SAAS,kBAAA,CACd,UACA,UAAA,EACuB;AAEvB,EAAA,IAAI,MAAA,GAAS,EAAE,GAAG,sBAAA,EAAuB;AAGzC,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,MAAA,GAAS;AAAA,MACP,MAAA,EAAQ,SAAA,CAAU,MAAA,CAAO,MAAA,EAAQ,SAAS,MAAM,CAAA;AAAA,MAChD,UAAA,EAAY,SAAA,CAAU,MAAA,CAAO,UAAA,EAAY,SAAS,UAAU,CAAA;AAAA,MAC5D,UAAA,EAAY,SAAA,CAAU,MAAA,CAAO,UAAA,EAAY,SAAS,UAAU,CAAA;AAAA,MAC5D,UAAA,EAAY,SAAA,CAAU,MAAA,CAAO,UAAA,EAAY,SAAS,UAAU,CAAA;AAAA,MAC5D,QAAA,EAAU,SAAA,CAAU,MAAA,CAAO,QAAA,EAAU,SAAS,QAAQ,CAAA;AAAA,MACtD,QAAA,EAAU,SAAA,CAAU,MAAA,CAAO,QAAA,EAAU,SAAS,QAAQ;AAAA,KACxD;AAAA,EACF;AAGA,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,MAAA,GAAS;AAAA,MACP,MAAA,EAAQ,SAAA,CAAU,MAAA,CAAO,MAAA,EAAQ,WAAW,MAAM,CAAA;AAAA,MAClD,UAAA,EAAY,SAAA,CAAU,MAAA,CAAO,UAAA,EAAY,WAAW,UAAU,CAAA;AAAA,MAC9D,UAAA,EAAY,SAAA,CAAU,MAAA,CAAO,UAAA,EAAY,WAAW,UAAU,CAAA;AAAA,MAC9D,UAAA,EAAY,SAAA,CAAU,MAAA,CAAO,UAAA,EAAY,WAAW,UAAU,CAAA;AAAA,MAC9D,QAAA,EAAU,SAAA,CAAU,MAAA,CAAO,QAAA,EAAU,WAAW,QAAQ,CAAA;AAAA,MACxD,QAAA,EAAU,SAAA,CAAU,MAAA,CAAO,QAAA,EAAU,WAAW,QAAQ;AAAA,KAC1D;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAWO,SAAS,qBACd,MAAA,EACiC;AACjC,EAAA,OAAO;AAAA;AAAA,IAEL,sBAAA,EAAwB,OAAO,MAAA,CAAO,OAAA;AAAA,IACtC,yBAAA,EAA2B,OAAO,MAAA,CAAO,UAAA;AAAA,IACzC,mBAAA,EAAqB,OAAO,MAAA,CAAO,IAAA;AAAA,IACnC,qBAAA,EAAuB,OAAO,MAAA,CAAO,MAAA;AAAA,IACrC,yBAAA,EAA2B,OAAO,MAAA,CAAO,SAAA;AAAA,IACzC,uBAAA,EAAyB,OAAO,MAAA,CAAO,OAAA;AAAA,IACvC,0BAAA,EAA4B,OAAO,MAAA,CAAO,UAAA;AAAA,IAC1C,wBAAA,EAA0B,OAAO,MAAA,CAAO,QAAA;AAAA,IACxC,0BAAA,EAA4B,OAAO,MAAA,CAAO,UAAA;AAAA,IAC1C,0BAAA,EAA4B,OAAO,MAAA,CAAO,kBAAA;AAAA;AAAA,IAG1C,oBAAA,EAAsB,OAAO,UAAA,CAAW,UAAA;AAAA,IACxC,kBAAA,EAAoB,CAAA,EAAG,MAAA,CAAO,UAAA,CAAW,QAAQ,CAAA,EAAA,CAAA;AAAA,IACjD,yBAAA,EAA2B,CAAA,EAAG,MAAA,CAAO,UAAA,CAAW,cAAc,CAAA,EAAA,CAAA;AAAA,IAC9D,oBAAA,EAAsB,CAAA,EAAG,MAAA,CAAO,UAAA,CAAW,UAAU,CAAA,CAAA;AAAA,IACrD,oBAAA,EAAsB,CAAA,EAAG,MAAA,CAAO,UAAA,CAAW,UAAU,CAAA,CAAA;AAAA,IACrD,uBAAA,EAAyB,CAAA,EAAG,MAAA,CAAO,UAAA,CAAW,aAAa,CAAA,EAAA,CAAA;AAAA;AAAA,IAG3D,2BAAA,EAA6B,CAAA,EAAG,MAAA,CAAO,UAAA,CAAW,QAAQ,CAAA,CAAA,CAAA;AAAA,IAC1D,yBAAA,EAA2B,OAAO,UAAA,CAAW;AAAA,GAC/C;AACF;;;ACvKA,IAAM,UAAA,uBAAiB,GAAA,EAAkC;AA6FzD,eAAe,iBAAA,CACb,SAAA,EACA,MAAA,EACA,QAAA,EAC+B;AAC/B,EAAA,MAAM,UAAU,MAAA,IAAU,EAAA;AAC1B,EAAA,IAAI,GAAA,GAAM,CAAA,EAAG,OAAO,CAAA,cAAA,EAAiB,SAAS,CAAA,cAAA,CAAA;AAC9C,EAAA,IAAI,QAAA,IAAY,aAAa,IAAA,EAAM;AACjC,IAAA,GAAA,IAAO,CAAA,UAAA,EAAa,kBAAA,CAAmB,QAAQ,CAAC,CAAA,CAAA;AAAA,EAClD;AAEA,EAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAG,CAAA;AAEhC,EAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,IAAA,MAAM,IAAI,MAAM,CAAA,+BAAA,EAAkC,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAAA,EAC5F;AAEA,EAAA,OAAO,SAAS,IAAA,EAAK;AACvB;AAaO,SAAS,eAAA,CAAgB;AAAA,EAC9B,SAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA,IAAA,GAAO,KAAA;AAAA,EACP,QAAA;AAAA,EACA;AACF,CAAA,EAAkD;AAChD,EAAA,MAAM,GAAA,GAAM,aAAa,QAAA,IAAY,QAAA,KAAa,OAAO,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,GAAK,SAAA,CAAA;AACtF,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAID,QAAAA,CAAS,CAAC,IAAA,IAAQ,CAAC,UAAA,CAAW,GAAA,CAAI,GAAG,CAAC,CAAA;AACxE,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAuB,IAAI,CAAA;AACrD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,QAAAA;AAAA,IAC9B,UAAA,CAAW,GAAA,CAAI,GAAG,CAAA,EAAG;AAAA,GACvB;AACA,EAAA,MAAM,CAAC,kBAAA,EAAoB,qBAAqB,CAAA,GAAIA,QAAAA;AAAA,IAClD,UAAA,CAAW,GAAA,CAAI,GAAG,CAAA,EAAG,sBAAsB;AAAC,GAC9C;AACA,EAAA,MAAM,CAAC,mBAAA,EAAqB,sBAAsB,CAAA,GAAIA,QAAAA;AAAA,IACpD,UAAA,CAAW,GAAA,CAAI,GAAG,CAAA,EAAG,uBAAuB;AAAC,GAC/C;AACA,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,QAAAA;AAAA,IAChC,UAAA,CAAW,GAAA,CAAI,GAAG,CAAA,EAAG,SAAA,IAAa;AAAA,GACpC;AACA,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAIA,QAAAA;AAAA,IAChD,UAAA,CAAW,GAAA,CAAI,GAAG,CAAA,EAAG,iBAAA,IAAqB;AAAA,GAC5C;AACA,EAAA,MAAM,CAAC,qBAAA,EAAuB,wBAAwB,CAAA,GAAIA,QAAAA;AAAA,IACxD,UAAA,CAAW,GAAA,CAAI,GAAG,CAAA,EAAG,qBAAA,IAAyB;AAAA,GAChD;AACA,EAAA,MAAM,CAAC,oBAAA,EAAsB,uBAAuB,CAAA,GAAIA,QAAAA,CAEtD,UAAA,CAAW,GAAA,CAAI,GAAG,CAAA,EAAG,oBAAA,IAAwB,EAAE,CAAA;AACjD,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,QAAAA;AAAA,IACtC,UAAA,CAAW,GAAA,CAAI,GAAG,CAAA,EAAG,YAAA,IAAgB;AAAA,GACvC;AAEA,EAAA,MAAM,CAAC,6BAAA,EAA+B,gCAAgC,CAAA,GAAIA,QAAAA;AAAA,IACxE,UAAA,CAAW,IAAI,GAAG,CAAA,GAAK,WAAW,GAAA,CAAI,GAAG,CAAA,EAAG,6BAAA,IAAiC,IAAA,GAAQ;AAAA,GACvF;AACA,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIA,QAAAA;AAAA,IAC1C,UAAA,CAAW,GAAA,CAAI,GAAG,CAAA,EAAG,cAAA,IAAkB;AAAA,GACzC;AACA,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIA,QAAAA;AAAA,IACxC,UAAA,CAAW,GAAA,CAAI,GAAG,CAAA,EAAG,KAAA,IAAS;AAAA,GAChC;AAGA,EAAA,MAAM,aAAA,GAAgBE,OAAO,KAAK,CAAA;AAElC,EAAA,MAAM,cAAc,YAAY;AAC9B,IAAA,IAAI,IAAA,EAAM;AAEV,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,iBAAA,CAAkB,SAAA,EAAW,QAAQ,QAAQ,CAAA;AAGlE,MAAA,UAAA,CAAW,GAAA,CAAI,KAAK,MAAM,CAAA;AAE1B,MAAA,WAAA,CAAY,OAAO,YAAY,CAAA;AAC/B,MAAA,YAAA,CAAa,MAAA,CAAO,aAAa,WAAW,CAAA;AAC5C,MAAA,oBAAA,CAAqB,MAAA,CAAO,qBAAqB,KAAK,CAAA;AACtD,MAAA,wBAAA,CAAyB,MAAA,CAAO,yBAAyB,KAAK,CAAA;AAC9D,MAAA,uBAAA,CAAwB,MAAA,CAAO,oBAAA,IAAwB,EAAE,CAAA;AACzD,MAAA,eAAA,CAAgB,MAAA,CAAO,gBAAgB,IAAI,CAAA;AAC3C,MAAA,gCAAA,CAAiC,MAAA,CAAO,iCAAiC,IAAI,CAAA;AAC7E,MAAA,iBAAA,CAAkB,MAAA,CAAO,kBAAkB,KAAA,CAAS,CAAA;AACpD,MAAA,gBAAA,CAAiB,MAAA,CAAO,SAAS,KAAA,CAAS,CAAA;AAC1C,MAAA,qBAAA,CAAsB,MAAA,CAAO,kBAAA,IAAsB,EAAE,CAAA;AACrD,MAAA,sBAAA,CAAuB,MAAA,CAAO,mBAAA,IAAuB,EAAE,CAAA;AAAA,IACzD,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,CAAQ,KAAA,CAAM,wCAAwC,GAAG,CAAA;AACzD,MAAA,QAAA,CAAS,GAAA,YAAe,QAAQ,GAAA,GAAM,IAAI,MAAM,MAAA,CAAO,GAAG,CAAC,CAAC,CAAA;AAAA,IAC9D,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA;AAEA,EAAAC,UAAU,MAAM;AAEd,IAAA,IAAI,IAAA,IAAQ,cAAc,OAAA,EAAS;AAGnC,IAAA,MAAM,MAAA,GAAS,UAAA,CAAW,GAAA,CAAI,GAAG,CAAA;AACjC,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,WAAA,CAAY,OAAO,YAAY,CAAA;AAC/B,MAAA,YAAA,CAAa,MAAA,CAAO,aAAa,WAAW,CAAA;AAC5C,MAAA,oBAAA,CAAqB,MAAA,CAAO,qBAAqB,KAAK,CAAA;AACtD,MAAA,eAAA,CAAgB,MAAA,CAAO,gBAAgB,IAAI,CAAA;AAC3C,MAAA,gCAAA,CAAiC,MAAA,CAAO,iCAAiC,IAAI,CAAA;AAC7E,MAAA,iBAAA,CAAkB,MAAA,CAAO,kBAAkB,MAAS,CAAA;AACpD,MAAA,gBAAA,CAAiB,MAAA,CAAO,SAAS,MAAS,CAAA;AAC1C,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA;AAAA,IACF;AAEA,IAAA,aAAA,CAAc,OAAA,GAAU,IAAA;AACxB,IAAA,WAAA,EAAY;AAAA,EACd,GAAG,CAAC,SAAA,EAAW,MAAA,EAAQ,IAAA,EAAM,GAAG,CAAC,CAAA;AAGjC,EAAA,MAAM,MAAA,GAAS,iBAAA,CAAkB,QAAA,EAAU,UAAU,CAAA;AAErD,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA,SAAA;AAAA,IACA,iBAAA;AAAA,IACA,qBAAA;AAAA,IACA,oBAAA;AAAA,IACA,YAAA;AAAA,IACA,6BAAA;AAAA,IACA,cAAA;AAAA,IACA,aAAA;AAAA,IACA,kBAAA;AAAA,IACA,mBAAA;AAAA,IACA,OAAA,EAAS;AAAA,GACX;AACF;AAaO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,SAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA,IAAA,GAAO,KAAA;AAAA,EACP,QAAA;AAAA,EACA;AACF,CAAA,EAAoD;AAClD,EAAA,MAAM,GAAA,GAAM,aAAa,QAAA,IAAY,QAAA,KAAa,OAAO,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,GAAK,SAAA,CAAA;AACtF,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIH,QAAAA,CAAS,CAAC,IAAA,IAAQ,CAAC,UAAA,CAAW,GAAA,CAAI,GAAG,CAAC,CAAA;AACxE,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAuB,IAAI,CAAA;AACrD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,QAAAA;AAAA,IAC9B,UAAA,CAAW,GAAA,CAAI,GAAG,CAAA,EAAG;AAAA,GACvB;AACA,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,QAAAA;AAAA,IAChC,UAAA,CAAW,GAAA,CAAI,GAAG,CAAA,EAAG,SAAA,IAAa;AAAA,GACpC;AACA,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAIA,QAAAA;AAAA,IAChD,UAAA,CAAW,GAAA,CAAI,GAAG,CAAA,EAAG,iBAAA,IAAqB;AAAA,GAC5C;AACA,EAAA,MAAM,CAAC,qBAAA,EAAuB,wBAAwB,CAAA,GAAIA,QAAAA;AAAA,IACxD,UAAA,CAAW,GAAA,CAAI,GAAG,CAAA,EAAG,qBAAA,IAAyB;AAAA,GAChD;AACA,EAAA,MAAM,CAAC,oBAAA,EAAsB,uBAAuB,CAAA,GAAIA,QAAAA,CAEtD,UAAA,CAAW,GAAA,CAAI,GAAG,CAAA,EAAG,oBAAA,IAAwB,EAAE,CAAA;AAEjD,EAAA,MAAM,CAAC,6BAAA,EAA+B,gCAAgC,CAAA,GAAIA,QAAAA;AAAA,IACxE,UAAA,CAAW,IAAI,GAAG,CAAA,GAAK,WAAW,GAAA,CAAI,GAAG,CAAA,EAAG,6BAAA,IAAiC,IAAA,GAAQ;AAAA,GACvF;AACA,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIA,QAAAA;AAAA,IAC1C,UAAA,CAAW,GAAA,CAAI,GAAG,CAAA,EAAG,cAAA,IAAkB;AAAA,GACzC;AACA,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIA,QAAAA;AAAA,IACxC,UAAA,CAAW,GAAA,CAAI,GAAG,CAAA,EAAG,KAAA,IAAS;AAAA,GAChC;AACA,EAAA,MAAM,CAAC,mBAAA,EAAqB,sBAAsB,CAAA,GAAIA,QAAAA;AAAA,IACpD,UAAA,CAAW,GAAA,CAAI,GAAG,CAAA,EAAG,uBAAuB;AAAC,GAC/C;AAGA,EAAA,MAAM,aAAA,GAAgBE,OAAO,KAAK,CAAA;AAElC,EAAA,MAAM,cAAc,YAAY;AAC9B,IAAA,IAAI,IAAA,EAAM;AAEV,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,iBAAA,CAAkB,SAAA,EAAW,QAAQ,QAAQ,CAAA;AAGlE,MAAA,UAAA,CAAW,GAAA,CAAI,KAAK,MAAM,CAAA;AAE1B,MAAA,WAAA,CAAY,OAAO,aAAa,CAAA;AAChC,MAAA,YAAA,CAAa,MAAA,CAAO,aAAa,WAAW,CAAA;AAC5C,MAAA,oBAAA,CAAqB,MAAA,CAAO,qBAAqB,KAAK,CAAA;AACtD,MAAA,wBAAA,CAAyB,MAAA,CAAO,yBAAyB,KAAK,CAAA;AAC9D,MAAA,uBAAA,CAAwB,MAAA,CAAO,oBAAA,IAAwB,EAAE,CAAA;AACzD,MAAA,gCAAA,CAAiC,MAAA,CAAO,iCAAiC,IAAI,CAAA;AAC7E,MAAA,iBAAA,CAAkB,MAAA,CAAO,kBAAkB,KAAA,CAAS,CAAA;AACpD,MAAA,gBAAA,CAAiB,MAAA,CAAO,SAAS,KAAA,CAAS,CAAA;AAC1C,MAAA,sBAAA,CAAuB,MAAA,CAAO,mBAAA,IAAuB,EAAE,CAAA;AAAA,IACzD,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,CAAQ,KAAA,CAAM,yCAAyC,GAAG,CAAA;AAC1D,MAAA,QAAA,CAAS,GAAA,YAAe,QAAQ,GAAA,GAAM,IAAI,MAAM,MAAA,CAAO,GAAG,CAAC,CAAC,CAAA;AAAA,IAC9D,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA;AAEA,EAAAC,UAAU,MAAM;AAEd,IAAA,IAAI,IAAA,IAAQ,cAAc,OAAA,EAAS;AAGnC,IAAA,MAAM,MAAA,GAAS,UAAA,CAAW,GAAA,CAAI,GAAG,CAAA;AACjC,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,WAAA,CAAY,OAAO,aAAa,CAAA;AAChC,MAAA,YAAA,CAAa,MAAA,CAAO,aAAa,WAAW,CAAA;AAC5C,MAAA,oBAAA,CAAqB,MAAA,CAAO,qBAAqB,KAAK,CAAA;AACtD,MAAA,wBAAA,CAAyB,MAAA,CAAO,yBAAyB,KAAK,CAAA;AAC9D,MAAA,uBAAA,CAAwB,MAAA,CAAO,oBAAA,IAAwB,EAAE,CAAA;AACzD,MAAA,gCAAA,CAAiC,MAAA,CAAO,iCAAiC,IAAI,CAAA;AAC7E,MAAA,iBAAA,CAAkB,MAAA,CAAO,kBAAkB,MAAS,CAAA;AACpD,MAAA,gBAAA,CAAiB,MAAA,CAAO,SAAS,MAAS,CAAA;AAC1C,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA;AAAA,IACF;AAEA,IAAA,aAAA,CAAc,OAAA,GAAU,IAAA;AACxB,IAAA,WAAA,EAAY;AAAA,EACd,GAAG,CAAC,SAAA,EAAW,MAAA,EAAQ,IAAA,EAAM,GAAG,CAAC,CAAA;AAGjC,EAAA,MAAM,MAAA,GAAS,kBAAA,CAAmB,QAAA,EAAU,UAAU,CAAA;AAEtD,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA,SAAA;AAAA,IACA,iBAAA;AAAA,IACA,qBAAA;AAAA,IACA,oBAAA;AAAA,IACA,6BAAA;AAAA,IACA,cAAA;AAAA,IACA,aAAA;AAAA,IACA,mBAAA;AAAA,IACA,OAAA,EAAS;AAAA,GACX;AACF;AAKO,SAAS,gBAAgB,SAAA,EAA0B;AACxD,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,UAAA,CAAW,OAAO,SAAS,CAAA;AAAA,EAC7B,CAAA,MAAO;AACL,IAAA,UAAA,CAAW,KAAA,EAAM;AAAA,EACnB;AACF;AAaO,SAAS,uBACd,aAAA,EACkC;AAClC,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,iBAAA,CAAkB,MAAA,EAAW,aAAa;AAAA,GACpD;AACF;AAEO,SAAS,wBACd,aAAA,EACmC;AACnC,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,kBAAA,CAAmB,MAAA,EAAW,aAAa;AAAA,GACrD;AACF;ACtYO,SAAS,YAAA,CAAa;AAAA,EAC3B,UAAA;AAAA,EACA,OAAA,GAAU;AACZ,CAAA,EAA4C;AAC1C,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIH,SAAS,KAAK,CAAA;AAClD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAEtD,EAAA,MAAM,KAAA,GAAQE,OAAyB,IAAI,CAAA;AAC3C,EAAA,MAAM,eAAA,GAAkBA,OAA4B,IAAI,CAAA;AACxD,EAAA,MAAM,WAAA,GAAcA,OAAe,CAAC,CAAA;AACpC,EAAA,MAAM,iBAAA,GAAoBA,OAAgB,KAAK,CAAA;AAC/C,EAAA,MAAM,0BAAA,GAA6BA,OAA8B,IAAI,CAAA;AAGrE,EAAA,MAAM,mBAAA,GAAsBD,YAAY,MAAM;AAC5C,IAAA,aAAA,CAAc,KAAK,CAAA;AACnB,IAAA,IAAI,eAAA,CAAgB,OAAA,IAAW,eAAA,CAAgB,OAAA,CAAQ,UAAU,QAAA,EAAU;AACzE,MAAA,eAAA,CAAgB,QAAQ,KAAA,EAAM;AAC9B,MAAA,eAAA,CAAgB,OAAA,GAAU,IAAA;AAAA,IAC5B;AACA,IAAA,IAAI,2BAA2B,OAAA,EAAS;AACtC,MAAA,aAAA,CAAc,2BAA2B,OAAO,CAAA;AAChD,MAAA,0BAAA,CAA2B,OAAA,GAAU,IAAA;AAAA,IACvC;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,cAAA,GAAiBA,YAAY,MAAM;AACvC,IAAA,IAAI,MAAM,OAAA,IAAW,KAAA,CAAM,OAAA,CAAQ,UAAA,KAAe,UAAU,IAAA,EAAM;AAChE,MAAA,IAAI;AACF,QAAA,KAAA,CAAM,OAAA,CAAQ,KAAK,IAAA,CAAK,SAAA,CAAU,EAAE,IAAA,EAAM,MAAA,EAAQ,CAAC,CAAA;AACnD,QAAA,KAAA,CAAM,QAAQ,KAAA,EAAM;AAAA,MACtB,SAAS,CAAA,EAAG;AAAA,MAEZ;AAAA,IACF;AACA,IAAA,KAAA,CAAM,OAAA,GAAU,IAAA;AAAA,EAClB,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,UAAA,GAAaA,YAAY,MAAM;AACnC,IAAA,aAAA,CAAc,KAAK,CAAA;AACnB,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,cAAA,EAAe;AACf,IAAA,mBAAA,EAAoB;AAAA,EACtB,CAAA,EAAG,CAAC,cAAA,EAAgB,mBAAmB,CAAC,CAAA;AAGxC,EAAA,MAAM,oBAAA,GAAuBA,YAAY,MAAM;AAC7C,IAAA,IAAI,2BAA2B,OAAA,EAAS;AACtC,MAAA,aAAA,CAAc,2BAA2B,OAAO,CAAA;AAAA,IAClD;AAEA,IAAA,0BAAA,CAA2B,OAAA,GAAU,YAAY,MAAM;AACrD,MAAA,IAAI,CAAC,gBAAgB,OAAA,EAAS;AAC5B,QAAA,IAAI,2BAA2B,OAAA,EAAS;AACtC,UAAA,aAAA,CAAc,2BAA2B,OAAO,CAAA;AAChD,UAAA,0BAAA,CAA2B,OAAA,GAAU,IAAA;AAAA,QACvC;AACA,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,GAAA,GAAM,gBAAgB,OAAA,CAAQ,WAAA;AACpC,MAAA,IAAI,GAAA,IAAO,YAAY,OAAA,EAAS;AAE9B,QAAA,IAAI,2BAA2B,OAAA,EAAS;AACtC,UAAA,aAAA,CAAc,2BAA2B,OAAO,CAAA;AAChD,UAAA,0BAAA,CAA2B,OAAA,GAAU,IAAA;AAAA,QACvC;AACA,QAAA,mBAAA,EAAoB;AAAA,MACtB;AAAA,IACF,GAAG,GAAG,CAAA;AAAA,EACR,CAAA,EAAG,CAAC,mBAAmB,CAAC,CAAA;AAGxB,EAAA,MAAM,cAAA,GAAiBA,WAAAA,CAAY,CAAC,WAAA,KAAwB;AAC1D,IAAA,IAAI,CAAC,eAAA,CAAgB,OAAA,IAAW,eAAA,CAAgB,OAAA,CAAQ,UAAU,QAAA,EAAU;AAC1E,MAAA,OAAA,CAAQ,MAAM,iCAAiC,CAAA;AAC/C,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AAEF,MAAA,MAAM,MAAA,GAAS,KAAK,WAAW,CAAA;AAC/B,MAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,MAAA,CAAO,MAAM,CAAA;AAC1C,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,QAAA,KAAA,CAAM,CAAC,CAAA,GAAI,MAAA,CAAO,UAAA,CAAW,CAAC,CAAA;AAAA,MAChC;AAGA,MAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,KAAA,CAAM,MAAM,CAAA;AACzC,MAAA,MAAM,OAAA,GAAU,IAAI,YAAA,CAAa,KAAA,CAAM,MAAM,CAAA;AAC7C,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,QAAA,OAAA,CAAQ,CAAC,CAAA,GAAI,KAAA,CAAM,CAAC,CAAA,GAAI,KAAA;AAAA,MAC1B;AAGA,MAAA,MAAM,SAAS,eAAA,CAAgB,OAAA,CAAQ,aAAa,CAAA,EAAG,OAAA,CAAQ,QAAQ,IAAK,CAAA;AAC5E,MAAA,MAAA,CAAO,cAAA,CAAe,CAAC,CAAA,CAAE,GAAA,CAAI,OAAO,CAAA;AAEpC,MAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,OAAA,CAAQ,kBAAA,EAAmB;AAC1D,MAAA,MAAA,CAAO,MAAA,GAAS,MAAA;AAChB,MAAA,MAAA,CAAO,OAAA,CAAQ,eAAA,CAAgB,OAAA,CAAQ,WAAW,CAAA;AAGlD,MAAA,MAAM,GAAA,GAAM,gBAAgB,OAAA,CAAQ,WAAA;AACpC,MAAA,IAAI,WAAA,CAAY,UAAU,GAAA,EAAK;AAC7B,QAAA,WAAA,CAAY,OAAA,GAAU,GAAA;AAAA,MACxB;AACA,MAAA,MAAA,CAAO,KAAA,CAAM,YAAY,OAAO,CAAA;AAChC,MAAA,WAAA,CAAY,WAAW,MAAA,CAAO,QAAA;AAAA,IAChC,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,CAAQ,KAAA,CAAM,mCAAmC,GAAG,CAAA;AACpD,MAAA,QAAA,CAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,4BAA4B,CAAA;AAAA,IAC5E;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,KAAA,GAAQA,WAAAA;AAAA,IACZ,CAAC,IAAA,KAAiB;AAChB,MAAA,OAAA,CAAQ,GAAA,CAAI,iCAAiC,IAAA,CAAK,SAAA,CAAU,GAAG,EAAE,CAAA,EAAG,eAAe,UAAU,CAAA;AAE7F,MAAA,IAAI,CAAC,IAAA,CAAK,IAAA,EAAK,EAAG;AAChB,QAAA,OAAA,CAAQ,IAAI,6BAA6B,CAAA;AACzC,QAAA,QAAA,CAAS,kBAAkB,CAAA;AAC3B,QAAA;AAAA,MACF;AAGA,MAAA,IAAI,UAAA,IAAc,MAAM,OAAA,EAAS;AAC/B,QAAA,OAAA,CAAQ,IAAI,4BAA4B,CAAA;AACxC,QAAA,QAAA,CAAS,6BAA6B,CAAA;AACtC,QAAA;AAAA,MACF;AAEA,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,WAAA,CAAY,OAAA,GAAU,CAAA;AACtB,MAAA,iBAAA,CAAkB,OAAA,GAAU,KAAA;AAE5B,MAAA,IAAI;AAEF,QAAA,eAAA,CAAgB,OAAA,GAAU,KAAK,MAAA,CAAO,YAAA,IAAiB,OAAe,kBAAA,EAAoB;AAAA,UACxF,UAAA,EAAY;AAAA,SACb,CAAA;AAGD,QAAA,MAAM,GAAA,GAAM,WAAW,UAAA,CAAW,MAAM,IACpC,UAAA,CAAW,OAAA,CAAQ,OAAA,EAAS,IAAI,CAAA,GAChC,UAAA;AACJ,QAAA,MAAM,KAAA,GAAQ,GAAG,GAAG,CAAA,eAAA,CAAA;AACpB,QAAA,OAAA,CAAQ,GAAA,CAAI,6BAA6B,KAAK,CAAA;AAE9C,QAAA,MAAM,EAAA,GAAK,IAAI,SAAA,CAAU,KAAK,CAAA;AAC9B,QAAA,KAAA,CAAM,OAAA,GAAU,EAAA;AAEhB,QAAA,EAAA,CAAG,SAAS,MAAM;AAChB,UAAA,EAAA,CAAG,IAAA;AAAA,YACD,KAAK,SAAA,CAAU;AAAA,cACb,IAAA,EAAM,OAAA;AAAA,cACN,QAAA,EAAU,OAAA;AAAA,cACV,aAAA,EAAe;AAAA,aAChB;AAAA,WACH;AAAA,QACF,CAAA;AAEA,QAAA,EAAA,CAAG,SAAA,GAAY,CAAC,KAAA,KAAU;AACxB,UAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,IAAI,CAAA;AAEjC,UAAA,IAAI,GAAA,CAAI,SAAS,OAAA,EAAS;AAExB,YAAA,EAAA,CAAG,IAAA,CAAK,KAAK,SAAA,CAAU,EAAE,MAAM,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA;AAC9C,YAAA,EAAA,CAAG,KAAK,IAAA,CAAK,SAAA,CAAU,EAAE,IAAA,EAAM,eAAA,EAAiB,CAAC,CAAA;AAAA,UACnD,CAAA,MAAA,IAAW,GAAA,CAAI,IAAA,KAAS,OAAA,EAAS;AAC/B,YAAA,cAAA,CAAe,IAAI,KAAK,CAAA;AAAA,UAC1B,CAAA,MAAA,IAAW,GAAA,CAAI,IAAA,KAAS,MAAA,EAAQ;AAC9B,YAAA,iBAAA,CAAkB,OAAA,GAAU,IAAA;AAE5B,YAAA,cAAA,EAAe;AAEf,YAAA,oBAAA,EAAqB;AAAA,UACvB,CAAA,MAAA,IAAW,GAAA,CAAI,IAAA,KAAS,OAAA,EAAS;AAC/B,YAAA,QAAA,CAAS,GAAA,CAAI,WAAW,WAAW,CAAA;AACnC,YAAA,UAAA,EAAW;AAAA,UACb;AAAA,QACF,CAAA;AAEA,QAAA,EAAA,CAAG,UAAU,MAAM;AACjB,UAAA,QAAA,CAAS,iBAAiB,CAAA;AAC1B,UAAA,UAAA,EAAW;AAAA,QACb,CAAA;AAEA,QAAA,EAAA,CAAG,UAAU,MAAM;AACjB,UAAA,KAAA,CAAM,OAAA,GAAU,IAAA;AAAA,QAClB,CAAA;AAEA,QAAA,aAAA,CAAc,IAAI,CAAA;AAAA,MACpB,SAAS,GAAA,EAAK;AACZ,QAAA,QAAA,CAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,qBAAqB,CAAA;AACnE,QAAA,UAAA,EAAW;AAAA,MACb;AAAA,IACF,CAAA;AAAA,IACA;AAAA,MACE,UAAA;AAAA,MACA,UAAA;AAAA,MACA,OAAA;AAAA,MACA,cAAA;AAAA,MACA,cAAA;AAAA,MACA,oBAAA;AAAA,MACA;AAAA;AACF,GACF;AAGA,EAAA,MAAM,IAAA,GAAOA,YAAY,MAAM;AAC7B,IAAA,UAAA,EAAW;AAAA,EACb,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAGf,EAAAE,UAAU,MAAM;AACd,IAAA,OAAO,MAAM;AACX,MAAA,UAAA,EAAW;AAAA,IACb,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAEf,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,IAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACF;AACF;ACtOA,IAAM,kBAAA,GAAqB,cAA8C,IAAI,CAAA;AActE,SAAS,mBAAA,CAAoB;AAAA,EAClC,QAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA,GAAY,WAAA;AAAA,EACZ,SAAA,GAAY,KAAA;AAAA,EACZ,OAAA,GAAU,UAAA;AAAA,EACV,YAAA,GAAe;AACjB,CAAA,EAA6B;AAC3B,EAAA,MAAM,KAAA,GAAQ,OAAA;AAAA,IACZ,OAAO,EAAE,MAAA,EAAQ,SAAA,EAAW,SAAA,EAAW,SAAS,YAAA,EAAa,CAAA;AAAA,IAC7D,CAAC,MAAA,EAAQ,SAAA,EAAW,SAAA,EAAW,SAAS,YAAY;AAAA,GACtD;AAEA,EAAA,uBACE,GAAA,CAAC,kBAAA,CAAmB,QAAA,EAAnB,EAA4B,OAC1B,QAAA,EACH,CAAA;AAEJ;AAOO,SAAS,qBAAA,GAAiD;AAC/D,EAAA,MAAM,OAAA,GAAU,WAAW,kBAAkB,CAAA;AAE7C,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KAEF;AAAA,EACF;AAEA,EAAA,OAAO,OAAA;AACT;AAOO,SAASC,gBAAAA,GAAwC;AACtD,EAAA,MAAM,OAAA,GAAU,WAAW,kBAAkB,CAAA;AAC7C,EAAA,OAAO,SAAS,MAAA,IAAU,qBAAA;AAC5B;AAOO,SAAS,eAAA,GAA2B;AACzC,EAAA,MAAM,OAAA,GAAU,WAAW,kBAAkB,CAAA;AAC7C,EAAA,OAAO,SAAS,YAAA,IAAgB,IAAA;AAClC;AAYA,IAAM,mBAAA,GAAsB,aAAA;AAAA,EAC1B;AACF,CAAA;AAYO,SAAS,oBAAA,CAAqB;AAAA,EACnC,QAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA,GAAY,WAAA;AAAA,EACZ,SAAA,GAAY;AACd,CAAA,EAA8B;AAC5B,EAAA,MAAM,KAAA,GAAQ,OAAA;AAAA,IACZ,OAAO,EAAE,MAAA,EAAQ,SAAA,EAAW,SAAA,EAAU,CAAA;AAAA,IACtC,CAAC,MAAA,EAAQ,SAAA,EAAW,SAAS;AAAA,GAC/B;AAEA,EAAA,uBACE,GAAA,CAAC,mBAAA,CAAoB,QAAA,EAApB,EAA6B,OAC3B,QAAA,EACH,CAAA;AAEJ;AAOO,SAAS,sBAAA,GAAmD;AACjE,EAAA,MAAM,OAAA,GAAU,WAAW,mBAAmB,CAAA;AAE9C,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KAEF;AAAA,EACF;AAEA,EAAA,OAAO,OAAA;AACT;AAKO,SAASC,iBAAAA,GAA0C;AACxD,EAAA,MAAM,OAAA,GAAU,WAAW,mBAAmB,CAAA;AAC9C,EAAA,OAAO,SAAS,MAAA,IAAU,sBAAA;AAC5B;AClJA,IAAM,mCAAmB,IAAI,GAAA,CAAI,CAAC,QAAA,EAAU,KAAK,CAAC,CAAA;AAE3C,SAAS,eAAA,CAAgB;AAAA,EAC9B,QAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA,GAAS,kBAAA;AAAA,EACT;AACF,CAAA,EAAyB;AACvB,EAAA,MAAM,OAAA,GAAUH,OAAuB,IAAI,CAAA;AAC3C,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIF,SAA4B,IAAI,CAAA;AAGpE,EAAAG,UAAU,MAAM;AACd,IAAA,IAAI,OAAA,CAAQ,OAAA,IAAW,CAAC,OAAA,CAAQ,QAAQ,UAAA,EAAY;AAClD,MAAA,MAAM,SAAS,OAAA,CAAQ,OAAA,CAAQ,aAAa,EAAE,IAAA,EAAM,QAAQ,CAAA;AAC5D,MAAA,aAAA,CAAc,MAAM,CAAA;AAAA,IACtB;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAGL,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,UAAA,IAAc,CAAC,OAAA,CAAQ,OAAA,EAAS;AAErC,IAAA,MAAM,cAAc,OAAA,CAAQ,OAAA;AAM5B,IAAA,MAAM,sBAAA,GAAyB,CAAC,CAAA,KAAa;AAC3C,MAAA,MAAM,QAAA,GAAW,CAAA;AACjB,MAAA,IAAI,SAAS,GAAA,IAAO,gBAAA,CAAiB,GAAA,CAAI,QAAA,CAAS,GAAG,CAAA,EAAG;AACtD,QAAA;AAAA,MACF;AACA,MAAA,CAAA,CAAE,eAAA,EAAgB;AAAA,IACpB,CAAA;AAEA,IAAA,UAAA,CAAW,gBAAA,CAAiB,WAAW,sBAAsB,CAAA;AAC7D,IAAA,UAAA,CAAW,gBAAA,CAAiB,SAAS,sBAAsB,CAAA;AAC3D,IAAA,UAAA,CAAW,gBAAA,CAAiB,YAAY,sBAAsB,CAAA;AAM9D,IAAA,IAAI,kBAAA,GAAyC,IAAA;AAE7C,IAAA,MAAM,UAAA,GAAa,CAAC,CAAA,KAAa;AAC/B,MAAA,kBAAA,GAAqB,CAAA,CAAE,MAAA;AAAA,IACzB,CAAA;AAEA,IAAA,MAAM,YAAA,GAAe,CAAC,CAAA,KAAqB;AACzC,MAAA,IAAI,EAAE,GAAA,IAAO,gBAAA,CAAiB,GAAA,CAAI,CAAA,CAAE,GAAG,CAAA,EAAG;AACxC,QAAA;AAAA,MACF;AAGA,MAAA,MAAM,IAAA,GAAO,EAAE,YAAA,EAAa;AAC5B,MAAA,IAAI,CAAC,KAAK,QAAA,CAAS,WAAW,KAAK,CAAC,IAAA,CAAK,QAAA,CAAS,UAAU,CAAA,EAAG;AAC7D,QAAA;AAAA,MACF;AAGA,MAAA,IAAI,kBAAA,EAAoB;AACtB,QAAA,MAAM,gBAAA,GAAmB,kBAAA;AACzB,QAAA,cAAA,CAAe,MAAM;AACnB,UAAA,MAAM,iBAAiB,UAAA,CAAW,aAAA;AAClC,UAAA,IAAI,CAAC,cAAA,EAAgB;AAEnB,YAAA,gBAAA,CAAiB,KAAA,EAAM;AAAA,UACzB;AAAA,QACF,CAAC,CAAA;AAAA,MACH;AAAA,IACF,CAAA;AAEA,IAAA,UAAA,CAAW,gBAAA,CAAiB,WAAW,UAA2B,CAAA;AAClE,IAAA,QAAA,CAAS,iBAAiB,SAAA,EAAW,YAAA,EAAc,EAAE,OAAA,EAAS,MAAM,CAAA;AAKpE,IAAA,OAAO,MAAM;AACX,MAAA,UAAA,CAAW,mBAAA,CAAoB,WAAW,sBAAsB,CAAA;AAChE,MAAA,UAAA,CAAW,mBAAA,CAAoB,SAAS,sBAAsB,CAAA;AAC9D,MAAA,UAAA,CAAW,mBAAA,CAAoB,YAAY,sBAAsB,CAAA;AACjE,MAAA,UAAA,CAAW,mBAAA,CAAoB,WAAW,UAA2B,CAAA;AACrE,MAAA,QAAA,CAAS,oBAAoB,SAAA,EAAW,YAAA,EAAc,EAAE,OAAA,EAAS,MAAM,CAAA;AAAA,IACzE,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAEf,EAAA,uBACEG,IAAC,KAAA,EAAA,EAAI,GAAA,EAAK,SAAS,EAAA,EAAI,MAAA,EAAQ,SAAA,EAAW,aAAA,EACvC,QAAA,EAAA,UAAA,IACC,YAAA;AAAA,oBACE,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,sBAAAA,GAAAA,CAAC,WAAO,QAAA,EAAA,MAAA,EAAO,CAAA;AAAA,MACd;AAAA,KAAA,EACH,CAAA;AAAA,IACA;AAAA,GACF,EACJ,CAAA;AAEJ;AAEA,eAAA,CAAgB,WAAA,GAAc,iBAAA;ACxHvB,SAAS,UAAA,CAAW,EAAE,UAAA,EAAY,OAAA,EAAQ,EAAoB;AACnE,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,qBAAA,EAAsB;AAEzC,EAAA,uBACEA,GAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,OAAA;AAAA,MACA,SAAA,EAAU,2MAAA;AAAA,MACV,KAAA,EAAO;AAAA,QACL,KAAA,EAAO,OAAO,MAAA,CAAO,IAAA;AAAA,QACrB,MAAA,EAAQ,OAAO,MAAA,CAAO,IAAA;AAAA,QACtB,KAAA,EAAO,OAAO,QAAA,CAAS,WAAA;AAAA,QACvB,MAAA,EAAQ,OAAO,QAAA,CAAS,YAAA;AAAA,QACxB,UAAA,EAAY,OAAO,MAAA,CAAO,gBAAA;AAAA,QAC1B,WAAA,EAAa,OAAO,MAAA,CAAO,YAAA;AAAA,QAC3B,SAAA,EAAW,OAAO,OAAA,CAAQ,MAAA;AAAA,QAC1B,KAAA,EAAO,OAAO,MAAA,CAAO;AAAA,OACvB;AAAA,MACA,YAAA,EAAY,aAAa,YAAA,GAAe,WAAA;AAAA,MAEvC,uCACCA,GAAAA,CAAC,eAAY,IAAA,EAAM,MAAA,CAAO,OAAO,QAAA,EAAU,WAAA,EAAa,GAAG,CAAA,mBAE3DA,IAAC,aAAA,EAAA,EAAc,IAAA,EAAM,OAAO,MAAA,CAAO,QAAA,EAAU,aAAa,CAAA,EAAG;AAAA;AAAA,GAEjE;AAEJ;AC9BA,IAAM,gBAAA,GAA2C;AAAA,EAC/C,qBAAA,EAAuB,gCAAA;AAAA,EACvB,sBAAA,EAAwB,6BAAA;AAAA,EACxB,yBAAA,EAA2B,oCAAA;AAAA,EAC3B,uBAAA,EAAyB,kCAAA;AAAA,EACzB,0BAAA,EAA4B;AAC9B,CAAA;AAOO,IAAM,WAAA,GAAc,UAAA;AAAA,EACzB,CAAC,EAAE,QAAA,EAAU,SAAA,IAAa,GAAA,KAAQ;AAChC,IAAA,MAAM,EAAE,MAAA,EAAQ,OAAA,EAAQ,GAAI,qBAAA,EAAsB;AAGlD,IAAAH,UAAU,MAAM;AACd,MAAA,MAAM,SAAA,GAAY,gBAAA,CAAiB,MAAA,CAAO,UAAA,CAAW,UAAU,CAAA;AAC/D,MAAA,IAAI,CAAC,SAAA,EAAW;AAEhB,MAAA,MAAM,SAAS,CAAA,iBAAA,EAAoB,SAAA,CAAU,MAAM,GAAG,CAAA,CAAE,CAAC,CAAC,CAAA,CAAA;AAG1D,MAAA,IAAI,QAAA,CAAS,cAAA,CAAe,MAAM,CAAA,EAAG;AAErC,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC1C,MAAA,IAAA,CAAK,EAAA,GAAK,MAAA;AACV,MAAA,IAAA,CAAK,GAAA,GAAM,YAAA;AACX,MAAA,IAAA,CAAK,IAAA,GAAO,4CAA4C,SAAS,CAAA,aAAA,CAAA;AACjE,MAAA,QAAA,CAAS,IAAA,CAAK,YAAY,IAAI,CAAA;AAAA,IAChC,CAAA,EAAG,CAAC,MAAA,CAAO,UAAA,CAAW,UAAU,CAAC,CAAA;AAEjC,IAAA,MAAM,SAAA,GAAY;AAAA,MAChB,YAAA,EAAc,OAAO,UAAA,CAAW,YAAA;AAAA,MAChC,OAAA,EAAS,OAAO,UAAA,CAAW,OAAA;AAAA,MAC3B,UAAA,EAAY,OAAO,MAAA,CAAO,UAAA;AAAA,MAC1B,WAAA,EAAa,OAAO,MAAA,CAAO,MAAA;AAAA,MAC3B,KAAA,EAAO,OAAO,MAAA,CAAO,IAAA;AAAA,MACrB,SAAA,EAAW,OAAO,OAAA,CAAQ,MAAA;AAAA,MAC1B,UAAA,EAAY,OAAO,UAAA,CAAW,UAAA;AAAA,MAC9B,QAAA,EAAU,OAAO,UAAA,CAAW,QAAA;AAAA,MAC5B,UAAA,EAAY,OAAO,UAAA,CAAW,UAAA;AAAA,MAC9B,UAAA,EAAY,OAAO,UAAA,CAAW,UAAA;AAAA,MAC9B,aAAA,EAAe,OAAO,UAAA,CAAW;AAAA,KACnC;AAEA,IAAA,IAAI,YAAY,UAAA,EAAY;AAC1B,MAAA,uBACEG,GAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,GAAA;AAAA,UACA,SAAA,EAAW,CAAA,0GAAA,EACT,SAAA,IAAa,EACf,CAAA,CAAA;AAAA,UACA,KAAA,EAAO;AAAA,YACL,GAAG,SAAA;AAAA,YACH,KAAA,EAAO,CAAA,IAAA,EAAO,MAAA,CAAO,UAAA,CAAW,KAAK,CAAA,uBAAA,CAAA;AAAA,YACrC,MAAA,EAAQ,CAAA,IAAA,EAAO,MAAA,CAAO,UAAA,CAAW,SAAS,CAAA,wBAAA;AAAA,WAC5C;AAAA,UAEC;AAAA;AAAA,OACH;AAAA,IAEJ;AAGA,IAAA,uBACEA,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAW,CAAA,2KAAA,EACT,SAAA,IAAa,EACf,CAAA,CAAA;AAAA,QACA,KAAA,EAAO;AAAA,UACL,GAAG,SAAA;AAAA,UACH,KAAA,EAAO,CAAA,IAAA,EAAO,MAAA,CAAO,UAAA,CAAW,KAAK,CAAA,uBAAA,CAAA;AAAA,UACrC,MAAA,EAAQ,CAAA,IAAA,EAAO,MAAA,CAAO,UAAA,CAAW,SAAS,CAAA,wBAAA,CAAA;AAAA,UAC1C,KAAA,EAAO,OAAO,QAAA,CAAS,KAAA;AAAA,UACvB,MAAA,EAAQ,OAAO,QAAA,CAAS;AAAA,SAC1B;AAAA,QAEC;AAAA;AAAA,KACH;AAAA,EAEJ;AACF;AAEA,WAAA,CAAY,WAAA,GAAc,aAAA;AC/EnB,SAAS,YAAA,CAAa;AAAA,EAC3B,cAAA;AAAA,EACA,oBAAA;AAAA,EACA,SAAA;AAAA,EACA,eAAA;AAAA,EACA,YAAA,GAAe,KAAA;AAAA,EACf;AACF,CAAA,EAAsB;AACpB,EAAA,MAAM,EAAE,SAAA,EAAW,MAAA,EAAO,GAAI,qBAAA,EAAsB;AAEpD,EAAA,uBACEC,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,oFAAA;AAAA,MACV,KAAA,EAAO,EAAE,WAAA,EAAa,MAAA,CAAO,OAAO,MAAA,EAAO;AAAA,MAE3C,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EACb,QAAA,kBAAAA,GAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,iCAAA;AAAA,YACV,KAAA,EAAO;AAAA,cACL,KAAA,EAAO,OAAO,MAAA,CAAO,IAAA;AAAA,cACrB,QAAA,EAAU,OAAO,UAAA,CAAW;AAAA,aAC9B;AAAA,YAEC,QAAA,EAAA;AAAA;AAAA,SACH,EACF,CAAA;AAAA,wBAEAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EACZ,QAAA,EAAA;AAAA,UAAA,cAAA,mBACCD,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,SAAA;AAAA,cACT,SAAA,EAAU,uEAAA;AAAA,cACV,YAAA,EAAW,UAAA;AAAA,cACX,KAAA,EAAM,UAAA;AAAA,cAEN,0BAAAA,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAM,EAAA,EAAI,WAAU,oBAAA,EAAqB;AAAA;AAAA,8BAGjDA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,SAAA;AAAA,cACT,SAAA,EAAU,uEAAA;AAAA,cACV,YAAA,EAAW,cAAA;AAAA,cACX,KAAA,EAAM,cAAA;AAAA,cAEN,0BAAAA,GAAAA,CAAC,SAAA,EAAA,EAAU,IAAA,EAAM,EAAA,EAAI,WAAU,oBAAA,EAAqB;AAAA;AAAA,WACtD;AAAA,UAED,kCACCA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,eAAA;AAAA,cACT,SAAA,EAAW,CAAA,sEAAA,EACT,oBAAA,GAAuB,kBAAA,GAAqB,EAC9C,CAAA,CAAA;AAAA,cACA,YAAA,EAAW,sBAAA;AAAA,cACX,KAAA,EAAM,sBAAA;AAAA,cAEN,0BAAAA,GAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAM,EAAA,EAAI,WAAU,oBAAA,EAAqB;AAAA;AAAA,WACpD;AAAA,UAED,YAAA,IAAgB,oCACfA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,gBAAA;AAAA,cACT,SAAA,EAAU,uEAAA;AAAA,cACV,YAAA,EAAW,YAAA;AAAA,cACX,KAAA,EAAM,YAAA;AAAA,cAEN,0BAAAA,GAAAA,CAAC,CAAA,EAAA,EAAE,IAAA,EAAM,EAAA,EAAI,WAAU,oBAAA,EAAqB;AAAA;AAAA;AAC9C,SAAA,EAEJ;AAAA;AAAA;AAAA,GACF;AAEJ;AC7EO,SAAS,aAAA,CAAc;AAAA,EAC5B,OAAA;AAAA,EACA,WAAA,GAAc;AAChB,CAAA,EAAuB;AACrB,EAAA,uBACEC,IAAAA,CAAAC,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAF,GAAAA;AAAA,MAAC,aAAA;AAAA,MAAA;AAAA,QACC,UAAA,EAAY;AAAA,UACV,MAAA,EAAQ,CAAC,EAAE,QAAA,EAAS,qBAClBA,GAAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,gBAAA,EAAkB,QAAA,EAAS,CAAA;AAAA,UAE/C,EAAA,EAAI,CAAC,EAAE,QAAA,EAAS,qBACdA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,sCAAA,EAAwC,QAAA,EAAS,CAAA;AAAA,UAEjE,EAAA,EAAI,CAAC,EAAE,QAAA,EAAS,qBACdA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,yCAAA,EACX,QAAA,EACH,CAAA;AAAA,UAEF,EAAA,EAAI,CAAC,EAAE,QAAA,EAAS,qBACdA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,4BAAA,EAA8B,QAAA,EAAS,CAAA;AAAA,UAEvD,CAAA,EAAG,CAAC,EAAE,QAAA,EAAS,qBACbA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,4BAAA,EAA8B,QAAA,EAAS,CAAA;AAAA,UAEtD,CAAA,EAAG,CAAC,EAAE,IAAA,EAAM,UAAS,KAAM;AACzB,YAAA,MAAM,UAAA,GAAa,IAAA,EAAM,UAAA,CAAW,GAAG,CAAA;AACvC,YAAA,uBACEA,GAAAA;AAAA,cAAC,GAAA;AAAA,cAAA;AAAA,gBACC,IAAA;AAAA,gBACA,SAAA,EAAU,yCAAA;AAAA,gBACT,GAAI,CAAC,UAAA,IAAc,EAAE,MAAA,EAAQ,QAAA,EAAU,KAAK,qBAAA,EAAsB;AAAA,gBACnE,OAAA,EACE,UAAA,GACI,CAAC,CAAA,KAAM;AACL,kBAAA,CAAA,CAAE,cAAA,EAAe;AAIjB,kBAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACpC,kBAAA,CAAA,CAAE,IAAA,GAAO,IAAA;AACT,kBAAA,CAAA,CAAE,MAAM,OAAA,GAAU,MAAA;AAClB,kBAAA,QAAA,CAAS,IAAA,CAAK,YAAY,CAAC,CAAA;AAC3B,kBAAA,CAAA,CAAE,KAAA,EAAM;AACR,kBAAA,QAAA,CAAS,IAAA,CAAK,YAAY,CAAC,CAAA;AAAA,gBAC7B,CAAA,GACA,MAAA;AAAA,gBAGL;AAAA;AAAA,aACH;AAAA,UAEJ,CAAA;AAAA,UACA,MAAM,CAAC,EAAE,WAAW,QAAA,EAAU,GAAG,OAAM,KAAM;AAC3C,YAAA,MAAM,WAAW,CAAC,SAAA;AAClB,YAAA,OAAO,2BACLA,GAAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAU,uFAAA;AAAA,gBACT,GAAG,KAAA;AAAA,gBAEH;AAAA;AAAA,gCAGHA,GAAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAW,CAAA,mBAAA,EAAsB,SAAA,IAAa,EAAE,CAAA,CAAA;AAAA,gBAC/C,GAAG,KAAA;AAAA,gBAEH;AAAA;AAAA,aACH;AAAA,UAEJ,CAAA;AAAA,UACA,GAAA,EAAK,CAAC,EAAE,QAAA,EAAS,qBACfA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0GAAA,EACZ,QAAA,EACH;AAAA,SAEJ;AAAA,QAEC,QAAA,EAAA;AAAA;AAAA,KACH;AAAA,IAEC,+BACCA,GAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,0EAAA;AAAA,QACV,KAAA,EAAO;AAAA,UACL,eAAA,EAAiB,cAAA;AAAA,UACjB,SAAA,EAAW;AAAA,SACb;AAAA,QACA,aAAA,EAAY;AAAA;AAAA,KACd;AAAA,oBAGFA,IAAC,OAAA,EAAA,EAAO,QAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA,EAKN;AAAA,GAAA,EACJ,CAAA;AAEJ;AC3GO,SAAS,iBAAA,GAAoB;AAClC,EAAA,uBACEC,IAAAA,CAAAC,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAF,GAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,oCAAA;AAAA,QACV,KAAA,EAAO;AAAA,UACL,UAAA,EACE,uGAAA;AAAA,UACF,cAAA,EAAgB,WAAA;AAAA,UAChB,oBAAA,EAAsB,MAAA;AAAA,UACtB,cAAA,EAAgB,MAAA;AAAA,UAChB,mBAAA,EAAqB,aAAA;AAAA,UACrB,SAAA,EAAW;AAAA,SACb;AAAA,QACD,QAAA,EAAA;AAAA;AAAA,KAED;AAAA,oBACAA,IAAC,OAAA,EAAA,EAAO,QAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA,EAKN;AAAA,GAAA,EACJ,CAAA;AAEJ;ACvBO,SAAS,cAAA,GAAiB;AAC/B,EAAA,uBACEA,GAAAA;AAAA,IAAC,MAAA,CAAO,GAAA;AAAA,IAAP;AAAA,MACC,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,EAAA,EAAG;AAAA,MAC7B,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,MAC5B,SAAA,EAAU,2DAAA;AAAA,MAEV,QAAA,kBAAAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sDAAA,EACb,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EACZ,QAAA,EAAA,CAAC,CAAA,EAAG,IAAA,EAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,KAAA,EAAO,sBAC1BA,GAAAA;AAAA,UAAC,MAAA,CAAO,GAAA;AAAA,UAAP;AAAA,YAEC,SAAA,EAAU,sDAAA;AAAA,YACV,SAAS,EAAE,CAAA,EAAG,CAAC,CAAA,EAAG,EAAA,EAAI,CAAC,CAAA,EAAE;AAAA,YACzB,YAAY,EAAE,QAAA,EAAU,GAAA,EAAK,MAAA,EAAQ,UAAU,KAAA;AAAM,WAAA;AAAA,UAHhD;AAAA,SAKR,CAAA,EACH,CAAA;AAAA,wBACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mCAAkC,QAAA,EAAA,yBAAA,EAAuB;AAAA,OAAA,EAC3E;AAAA;AAAA,GACF;AAEJ;ACnBA,IAAM,iBAAA,GAAoB;AAAA,EACxB,WAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAA;AAEA,SAAS,iBAAA,CAAkB,EAAE,QAAA,EAAS,EAAkC;AACtE,EAAA,uBACEC,IAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,mBAAA;AAAA,MACV,KAAA,EAAO;AAAA,QACL,UAAA,EACE,uGAAA;AAAA,QACF,cAAA,EAAgB,WAAA;AAAA,QAChB,oBAAA,EAAsB,MAAA;AAAA,QACtB,cAAA,EAAgB,MAAA;AAAA,QAChB,mBAAA,EAAqB,aAAA;AAAA,QACrB,SAAA,EAAW;AAAA,OACb;AAAA,MAGC,QAAA,EAAA;AAAA,QAAA,QAAA;AAAA,wBACDD,IAAC,OAAA,EAAA,EAAO,QAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA,EAKN;AAAA;AAAA;AAAA,GACJ;AAEJ;AAeO,SAAS,cAAA,CAAe;AAAA,EAC7B,QAAA;AAAA,EACA,UAAA;AAAA,EACA,YAAY,EAAC;AAAA,EACb,SAAA,GAAY,KAAA;AAAA,EACZ,WAAA,GAAc,IAAA;AAAA,EACd,aAAA;AAAA,EACA;AACF,CAAA,EAAwB;AACtB,EAAA,MAAM,cAAc,CAAC,CAAC,YAAY,QAAA,CAAS,IAAA,GAAO,MAAA,GAAS,CAAA;AAC3D,EAAA,MAAM,YAAA,GAAe,UAAU,MAAA,GAAS,CAAA;AACxC,EAAA,MAAM,QAAA,GACJ,SAAA,IACC,WAAA,IAAe,CAAC,cACjB,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,KAAW,WAAA,IAAe,CAAA,CAAE,WAAW,kBAAkB,CAAA;AAEnF,EAAA,IAAI,CAAC,SAAA,IAAa,CAAC,WAAA,IAAe,CAAC,cAAc,OAAO,IAAA;AAGxD,EAAA,IAAI,CAAC,WAAA,EAAa;AAEhB,IAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAEtB,IAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0CACb,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAA,EACb,QAAA,kBAAAA,GAAAA,CAAC,gBAAA,EAAA,EAAiB,GACpB,CAAA,EACF,CAAA;AAAA,EAEJ;AAGA,EAAA,uBACEA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sDACb,QAAA,kBAAAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8BAAA,EACZ,QAAA,EAAA;AAAA,IAAA,SAAA,IAAa,CAAC,WAAA,oBAAeD,GAAAA,CAAC,gBAAA,EAAA,EAAiB,CAAA;AAAA,IAE/C,WAAA,oBACCA,GAAAA,CAAC,aAAA,EAAA,EAAc,UAAqB,UAAA,EAAwB,CAAA;AAAA,IAG7D,SAAA,CAAU,GAAA,CAAI,CAAC,IAAA,qBACdA,GAAAA;AAAA,MAAC,aAAA;AAAA,MAAA;AAAA,QAEC,QAAA,EAAU,IAAA;AAAA,QACV,aAAA;AAAA,QACA;AAAA,OAAA;AAAA,MAHK,IAAA,CAAK;AAAA,KAKb;AAAA,GAAA,EACH,CAAA,EACF,CAAA;AAEJ;AAEA,SAAS,gBAAA,GAAmB;AAE1B,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIN,QAAAA;AAAA,IAAS,MAC/C,IAAA,CAAK,KAAA,CAAM,KAAK,MAAA,EAAO,GAAI,kBAAkB,MAAM;AAAA,GACrD;AAEA,EAAAG,UAAU,MAAM;AACd,IAAA,MAAM,QAAA,GAAW,YAAY,MAAM;AACjC,MAAA,eAAA,CAAgB,CAAC,CAAA,KAAA,CAAO,CAAA,GAAI,CAAA,IAAK,kBAAkB,MAAM,CAAA;AAAA,IAC3D,GAAG,GAAI,CAAA;AAEP,IAAA,OAAO,MAAM,cAAc,QAAQ,CAAA;AAAA,EACrC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,OAAA,GAAU,iBAAA,CAAkB,YAAY,CAAA,GAAI,KAAA;AAElD,EAAA,uBACEI,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0EAAA,EACb,QAAA,EAAA;AAAA,oBAAAD,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mEAAA,EACb,QAAA,kBAAAA,GAAAA,CAAC,iBAAA,EAAA,EACC,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAM,SAAA,EAAU,uBAAA,EAAwB,GAC3C,CAAA,EACF,CAAA;AAAA,oBACAA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oBACd,QAAA,kBAAAA,GAAAA,CAAC,iBAAA,EAAA,EAAmB,QAAA,EAAA,OAAA,EAAQ,CAAA,EAC9B;AAAA,GAAA,EACF,CAAA;AAEJ;AAEA,SAAS,aAAA,CAAc;AAAA,EACrB,QAAA;AAAA,EACA;AACF,CAAA,EAGG;AACD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIN,QAAAA,CAAS,CAAC,UAAU,CAAA;AAExD,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,QAAAA;AAAA,IAAS,MAC/C,IAAA,CAAK,KAAA,CAAM,KAAK,MAAA,EAAO,GAAI,kBAAkB,MAAM;AAAA,GACrD;AAEA,EAAA,eAAA,CAAgB,MAAM;AACpB,IAAA,aAAA,CAAc,CAAC,UAAU,CAAA;AAAA,EAC3B,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAEf,EAAAG,UAAU,MAAM;AACd,IAAA,IAAI,UAAA,EAAY;AAEhB,IAAA,MAAM,QAAA,GAAW,YAAY,MAAM;AACjC,MAAA,eAAA,CAAgB,CAAC,CAAA,KAAA,CAAO,CAAA,GAAI,CAAA,IAAK,kBAAkB,MAAM,CAAA;AAAA,IAC3D,GAAG,GAAI,CAAA;AAEP,IAAA,OAAO,MAAM,cAAc,QAAQ,CAAA;AAAA,EACrC,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAEf,EAAA,MAAM,eAAe,CAAC,UAAA;AACtB,EAAA,MAAM,OAAA,GAAU,iBAAA,CAAkB,YAAY,CAAA,GAAI,KAAA;AAElD,EAAA,uBACEI,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iDAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,IAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,MAAM,aAAA,CAAc,CAAC,UAAU,CAAA;AAAA,QACxC,SAAA,EAAW,CAAA,iFAAA,EACT,YAAA,GACI,oBAAA,GACA,6CACN,CAAA,oBAAA,CAAA;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC,SAAI,SAAA,EAAU,mEAAA,EACZ,yCACCA,GAAAA,CAAC,qBACC,QAAA,kBAAAA,GAAAA,CAAC,SAAM,SAAA,EAAU,uBAAA,EAAwB,GAC3C,CAAA,mBAEAA,IAAC,KAAA,EAAA,EAAM,SAAA,EAAU,yBAAwB,CAAA,EAE7C,CAAA;AAAA,0BAEAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kBAAA,EACb,QAAA,EAAA,YAAA,mBACCA,GAAAA,CAAC,iBAAA,EAAA,EAAmB,QAAA,EAAA,OAAA,EAAQ,CAAA,GAE5B,SAAA,EAEJ,CAAA;AAAA,0BAEAA,GAAAA;AAAA,YAACG,MAAAA,CAAO,GAAA;AAAA,YAAP;AAAA,cACC,OAAA,EAAS,EAAE,MAAA,EAAQ,UAAA,GAAa,KAAK,CAAA,EAAE;AAAA,cACvC,UAAA,EAAY,EAAE,QAAA,EAAU,IAAA,EAAK;AAAA,cAC7B,SAAA,EAAU,oBAAA;AAAA,cAEV,QAAA,kBAAAH,GAAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAU,mBAAA,EAAoB;AAAA;AAAA,WAC9C;AAAA,UAEC,UAAA,oBACCA,GAAAA,CAAC,KAAA,EAAA,EAAM,WAAU,uCAAA,EAAwC;AAAA;AAAA;AAAA,KAE7D;AAAA,oBAEAA,GAAAA,CAAC,eAAA,EAAA,EACE,QAAA,EAAA,UAAA,oBACCA,GAAAA;AAAA,MAACG,MAAAA,CAAO,GAAA;AAAA,MAAP;AAAA,QACC,OAAA,EAAS,EAAE,MAAA,EAAQ,CAAA,EAAG,SAAS,CAAA,EAAE;AAAA,QACjC,OAAA,EAAS,EAAE,MAAA,EAAQ,MAAA,EAAQ,SAAS,CAAA,EAAE;AAAA,QACtC,IAAA,EAAM,EAAE,MAAA,EAAQ,CAAA,EAAG,SAAS,CAAA,EAAE;AAAA,QAC9B,UAAA,EAAY,EAAE,QAAA,EAAU,IAAA,EAAK;AAAA,QAC7B,SAAA,EAAU,sBAAA;AAAA,QAEV,QAAA,kBAAAH,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4DACb,QAAA,kBAAAA,GAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,CAAA,2DAAA,EACT,UAAA,GAAa,oBAAA,GAAuB,oBACtC,CAAA,CAAA;AAAA,YAEC,QAAA,EAAA;AAAA;AAAA,SACH,EACF;AAAA;AAAA,KACF,EAEJ;AAAA,GAAA,EACF,CAAA;AAEJ;AAGA,SAAS,kBAAA,CAAmB,EAAE,QAAA,EAAU,MAAA,EAAQ,QAAO,EAIpD;AACD,EAAA,MAAM,MAAA,GAASJ,OAAuB,IAAI,CAAA;AAC1C,EAAA,MAAM,QAAA,GAAW,QAAA,CAAS,EAAE,MAAA,EAAQ,QAAQ,CAAA;AAE5C,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,MAAA,CAAO,OAAA,IAAW,QAAA,YAAoB,WAAA,EAAa;AACrD,MAAA,MAAA,CAAO,QAAQ,SAAA,GAAY,EAAA;AAC3B,MAAA,MAAA,CAAO,OAAA,CAAQ,YAAY,QAAQ,CAAA;AAAA,IACrC;AAAA,EACF,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAA,IAAI,oBAAoB,WAAA,EAAa;AACnC,IAAA,uBAAOG,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EAA0B,KAAK,MAAA,EAAQ,CAAA;AAAA,EAC/D;AACA,EAAA,IAAI,OAAO,aAAa,QAAA,EAAU;AAChC,IAAA,uBAAOA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAA0B,uBAAA,EAAyB,EAAE,MAAA,EAAQ,QAAA,EAAS,EAAG,CAAA;AAAA,EACjG;AACA,EAAA,uBAAOA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAA2B,QAAA,EAAA,QAAA,EAAgB,CAAA;AACnE;AAEA,SAAS,aAAA,CAAc;AAAA,EACrB,QAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAA,EAIG;AACD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIN,SAAS,KAAK,CAAA;AAC9C,EAAA,MAAM,OAAA,GAAU,OAAO,IAAA,CAAK,QAAA,CAAS,aAAa,EAAE,EAAE,MAAA,GAAS,CAAA;AAE/D,EAAA,MAAM,WAAA,GAAc,SAAS,MAAA,KAAW,WAAA;AACxC,EAAA,MAAM,UAAA,GAAa,SAAS,MAAA,KAAW,UAAA;AACvC,EAAA,MAAM,OAAA,GAAU,SAAS,MAAA,KAAW,OAAA;AACpC,EAAA,MAAM,iBAAA,GAAoB,SAAS,MAAA,KAAW,kBAAA;AAC9C,EAAA,MAAM,QAAA,GAAW,SAAS,MAAA,KAAW,QAAA;AAGrC,EAAA,MAAM,cAAA,GAAiB,aAAA,GAAgB,QAAA,CAAS,IAAI,CAAA;AACpD,EAAA,MAAM,eAAA,GACJ,UAAA,IAAc,cAAA,IAAkB,QAAA,CAAS,MAAA,IAAU,IAAA;AAErD,EAAA,uBACEO,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iDAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,IAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,CAAA,iFAAA,EACT,WAAA,IAAe,iBAAA,GAAoB,uBAAuB,oBAC5D,CAAA,CAAA;AAAA,QAEC,QAAA,EAAA;AAAA,UAAA,OAAA,IAAW,CAAC,qCACXD,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,MAAM,WAAA,CAAY,CAAC,QAAQ,CAAA;AAAA,cACpC,SAAA,EAAU,8CAAA;AAAA,cAEV,QAAA,kBAAAA,GAAAA;AAAA,gBAACG,MAAAA,CAAO,GAAA;AAAA,gBAAP;AAAA,kBACC,OAAA,EAAS,EAAE,MAAA,EAAQ,QAAA,GAAW,KAAK,CAAA,EAAE;AAAA,kBACrC,UAAA,EAAY,EAAE,QAAA,EAAU,IAAA,EAAK;AAAA,kBAE7B,QAAA,kBAAAH,GAAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAU,mBAAA,EAAoB;AAAA;AAAA;AAC9C;AAAA,WACF;AAAA,UAGD,iBAAA,oBACCA,GAAAA,CAAC,OAAA,EAAA,EAAQ,WAAU,yDAAA,EAA0D,CAAA;AAAA,UAE9E,WAAA,oBACCA,GAAAA,CAAC,OAAA,EAAA,EAAQ,WAAU,wDAAA,EAAyD,CAAA;AAAA,UAE7E,UAAA,oBACCA,GAAAA,CAAC,KAAA,EAAA,EAAM,WAAU,uCAAA,EAAwC,CAAA;AAAA,UAE1D,2BACCA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uCAAsC,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,UAExD,4BACCA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wCAAuC,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,0BAG1DA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oBACb,QAAA,EAAA,QAAA,CAAS,WAAA,IAAe,SAAS,IAAA,EACpC,CAAA;AAAA,UAEC,iBAAA,oBACCC,IAAAA,CAAAC,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,4BAAAF,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qBAAA,EAAsB,QAAA,EAAA,kBAAA,EAAgB,CAAA;AAAA,4BACtDA,GAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,OAAA,EAAS,MAAM,aAAA,GAAgB,QAAA,CAAS,IAAI,IAAI,CAAA;AAAA,gBAChD,SAAA,EAAU,sGAAA;AAAA,gBACV,KAAA,EAAO,EAAE,eAAA,EAAiB,SAAA,EAAU;AAAA,gBACrC,QAAA,EAAA;AAAA;AAAA,aAED;AAAA,4BACAA,GAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,OAAA,EAAS,MAAM,aAAA,GAAgB,QAAA,CAAS,IAAI,KAAK,CAAA;AAAA,gBACjD,SAAA,EAAU,qHAAA;AAAA,gBACV,KAAA,EAAO,EAAE,WAAA,EAAa,SAAA,EAAW,iBAAiB,aAAA,EAAc;AAAA,gBACjE,QAAA,EAAA;AAAA;AAAA;AAED,WAAA,EACF,CAAA;AAAA,UAED,+BACCA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sBAAqB,QAAA,EAAA,YAAA,EAAU,CAAA;AAAA,UAEhD,8BACCA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sBAAqB,QAAA,EAAA,MAAA,EAAI,CAAA;AAAA,UAE1C,2BACCA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sBAAqB,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,UAE5C,4BACCA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sBAAqB,QAAA,EAAA,QAAA,EAAM;AAAA;AAAA;AAAA,KAE/C;AAAA,IAGC,eAAA,oBACCA,GAAAA,CAAC,kBAAA,EAAA,EAAmB,QAAA,EAAU,cAAA,EAAgB,MAAA,EAAQ,QAAA,CAAS,MAAA,EAAQ,MAAA,EAAQ,QAAA,CAAS,MAAA,EAAQ,CAAA;AAAA,oBAGlGA,GAAAA,CAAC,eAAA,EAAA,EACE,QAAA,EAAA,QAAA,IAAY,2BACXA,GAAAA;AAAA,MAACG,MAAAA,CAAO,GAAA;AAAA,MAAP;AAAA,QACC,OAAA,EAAS,EAAE,MAAA,EAAQ,CAAA,EAAG,SAAS,CAAA,EAAE;AAAA,QACjC,OAAA,EAAS,EAAE,MAAA,EAAQ,MAAA,EAAQ,SAAS,CAAA,EAAE;AAAA,QACtC,IAAA,EAAM,EAAE,MAAA,EAAQ,CAAA,EAAG,SAAS,CAAA,EAAE;AAAA,QAC9B,UAAA,EAAY,EAAE,QAAA,EAAU,IAAA,EAAK;AAAA,QAC7B,SAAA,EAAU,sBAAA;AAAA,QAEV,QAAA,kBAAAH,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mKAAA,EACZ,QAAA,EAAA,IAAA,CAAK,SAAA,CAAU,QAAA,CAAS,SAAA,EAAW,IAAA,EAAM,CAAC,CAAA,EAC7C;AAAA;AAAA,KACF,EAEJ;AAAA,GAAA,EACF,CAAA;AAEJ;AC/WO,SAAS,aAAA,CAAc;AAAA,EAC5B,OAAA;AAAA,EACA,YAAY,EAAC;AAAA,EACb,SAAA,GAAY,KAAA;AAAA,EACZ,aAAA;AAAA,EACA;AACF,CAAA,EAAuB;AACrB,EAAA,MAAM,SAASF,gBAAAA,EAAgB;AAC/B,EAAA,MAAM,sBAAsB,eAAA,EAAgB;AAE5C,EAAA,MAAM,SAAA,GACJ,QAAQ,OAAA,KAAY,aAAA,IACnB,QAAQ,KAAA,IAAS,SAAA,IAAa,CAAC,OAAA,CAAQ,OAAA;AAC1C,EAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,KAAA,IAAS,OAAA,CAAQ,QAAA;AAC7C,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,OAAA,IAAW,OAAA,CAAQ,OAAA,KAAY,aAAA;AAC1D,EAAA,MAAM,YAAA,GAAe,UAAU,MAAA,GAAS,CAAA;AAIxC,EAAA,MAAM,kBAAA,GACJ,OAAA,CAAQ,KAAA,KAAU,SAAA,IAAa,WAAA,IAAe,YAAA,CAAA;AAEhD,EAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,OAAA,CAAQ,KAAA,IAAS,aAAa,UAAU,CAAA;AAEpE,EAAA,uBACEG,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,IAAI,OAAA,CAAQ,EAAA;AAAA,MACZ,SAAA,EAAW,CAAA,wBAAA,EACT,OAAA,CAAQ,KAAA,GAAQ,qBAAqB,gBACvC,CAAA,CAAA;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,kBAAA,oBACCD,GAAAA;AAAA,UAAC,cAAA;AAAA,UAAA;AAAA,YACC,UAAU,OAAA,CAAQ,QAAA;AAAA,YAClB,YAAY,OAAA,CAAQ,gBAAA;AAAA,YACpB,SAAA;AAAA,YACA,SAAA,EAAW,aAAa,CAAC,WAAA;AAAA,YACzB,WAAA,EAAa,mBAAA;AAAA,YACb,aAAA;AAAA,YACA;AAAA;AAAA,SACF;AAAA,QAGD,8BACCA,GAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,8GAAA;AAAA,YACV,KAAA,EACE,QAAQ,KAAA,GACJ;AAAA,cACE,UAAA,EAAY,OAAO,MAAA,CAAO,SAAA;AAAA,cAC1B,KAAA,EAAO,OAAO,MAAA,CAAO;AAAA,aACvB,GACA;AAAA,cACE,UAAA,EAAY,OAAO,MAAA,CAAO,UAAA;AAAA,cAC1B,KAAA,EAAO,OAAO,MAAA,CAAO,QAAA;AAAA,cACrB,MAAA,EAAQ,CAAA,UAAA,EAAa,MAAA,CAAO,MAAA,CAAO,UAAU,CAAA;AAAA,aAC/C;AAAA,YAGN,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EACE,QAAA,EAAA,OAAA,CAAQ,wBACPA,GAAAA;AAAA,cAAC,aAAA;AAAA,cAAA;AAAA,gBACC,SAAS,OAAA,CAAQ,OAAA;AAAA,gBACjB;AAAA;AAAA,gCAGFA,GAAAA;AAAA,cAACI,aAAAA;AAAA,cAAA;AAAA,gBACC,UAAA,EAAY;AAAA,kBACV,MAAA,EAAQ,CAAC,EAAE,QAAA,EAAS,qBAClBJ,GAAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,gBAAA,EAAkB,QAAA,EAAS,CAAA;AAAA,kBAE/C,EAAA,EAAI,CAAC,EAAE,QAAA,EAAS,qBACdA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,sCAAA,EACX,QAAA,EACH,CAAA;AAAA,kBAEF,EAAA,EAAI,CAAC,EAAE,QAAA,EAAS,qBACdA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,yCAAA,EACX,QAAA,EACH,CAAA;AAAA,kBAEF,EAAA,EAAI,CAAC,EAAE,QAAA,EAAS,qBACdA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,4BAAA,EAA8B,QAAA,EAAS,CAAA;AAAA,kBAEvD,CAAA,EAAG,CAAC,EAAE,QAAA,EAAS,qBACbA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,4BAAA,EAA8B,QAAA,EAAS,CAAA;AAAA,kBAEtD,CAAA,EAAG,CAAC,EAAE,IAAA,EAAM,UAAS,KAAM;AACzB,oBAAA,MAAM,UAAA,GAAa,IAAA,EAAM,UAAA,CAAW,GAAG,CAAA;AACvC,oBAAA,uBACEA,GAAAA;AAAA,sBAAC,GAAA;AAAA,sBAAA;AAAA,wBACC,IAAA;AAAA,wBACA,SAAA,EAAU,yCAAA;AAAA,wBACT,GAAI,CAAC,UAAA,IAAc,EAAE,MAAA,EAAQ,QAAA,EAAU,KAAK,qBAAA,EAAsB;AAAA,wBACnE,OAAA,EACE,UAAA,GACI,CAAC,CAAA,KAAM;AACL,0BAAA,CAAA,CAAE,cAAA,EAAe;AACjB,0BAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACpC,0BAAA,CAAA,CAAE,IAAA,GAAO,IAAA;AACT,0BAAA,CAAA,CAAE,MAAM,OAAA,GAAU,MAAA;AAClB,0BAAA,QAAA,CAAS,IAAA,CAAK,YAAY,CAAC,CAAA;AAC3B,0BAAA,CAAA,CAAE,KAAA,EAAM;AACR,0BAAA,QAAA,CAAS,IAAA,CAAK,YAAY,CAAC,CAAA;AAAA,wBAC7B,CAAA,GACA,MAAA;AAAA,wBAGL;AAAA;AAAA,qBACH;AAAA,kBAEJ;AAAA,iBACF;AAAA,gBAEC,QAAA,EAAA,OAAA,CAAQ;AAAA;AAAA,aACX,EAEJ;AAAA;AAAA;AAIF;AAAA;AAAA,GAEJ;AAEJ;AC/HO,SAAS,WAAA,CAAY;AAAA,EAC1B,QAAA;AAAA,EACA,eAAA;AAAA,EACA,gBAAA;AAAA,EACA,YAAA,GAAe,KAAA;AAAA,EACf,aAAA;AAAA,EACA;AACF,CAAA,EAAqB;AACnB,EAAA,IAAI,gBAAA,EAAkB;AACpB,IAAA,uBAAOA,IAAC,cAAA,EAAA,EAAe,CAAA;AAAA,EACzB;AAEA,EAAA,MAAM,eAAe,QAAA,CAAS,MAAA;AAAA,IAC5B,CAAC,OAAA,EAAS,CAAA,EAAG,CAAA,KAAO,CAAA,CAAE,QAAQ,CAAA,GAAI,OAAA;AAAA,IAClC;AAAA,GACF;AAEA,EAAA,uBACEA,IAAAE,QAAAA,EAAA,EACG,mBAAS,GAAA,CAAI,CAAC,KAAK,KAAA,KAAU;AAC5B,IAAA,MAAM,YAAY,KAAA,KAAU,YAAA;AAG5B,IAAA,MAAM,kBAAkB,SAAA,IAAa,YAAA,GACjC,eAAA,GACA,GAAA,CAAI,aAAa,EAAC;AAEtB,IAAA,uBACEF,GAAAA;AAAA,MAAC,aAAA;AAAA,MAAA;AAAA,QAEC,OAAA,EAAS,GAAA;AAAA,QACT,SAAA,EAAW,eAAA;AAAA,QACX,WAAW,SAAA,IAAa,YAAA;AAAA,QACxB,aAAA;AAAA,QACA;AAAA,OAAA;AAAA,MALK,GAAA,CAAI;AAAA,KAMX;AAAA,EAEJ,CAAC,CAAA,EACH,CAAA;AAEJ;ACtCO,IAAM,oBAAoBK,UAAAA,CAG/B,CAAC,EAAE,QAAA,IAAY,GAAA,KAAQ;AACvB,EAAA,MAAM,SAASP,gBAAAA,EAAgB;AAC/B,EAAA,MAAM,WAAA,GAAcF,OAAuB,IAAI,CAAA;AAC/C,EAAA,MAAM,mBAAA,GAAsBA,OAAe,CAAC,CAAA;AAC5C,EAAA,MAAM,kBAAA,GAAqBA,OAAgB,KAAK,CAAA;AAEhD,EAAA,MAAM,eAAgB,GAAA,IAA2C,WAAA;AAEjE,EAAA,MAAM,YAAA,GAAeD,YAAY,MAAM;AACrC,IAAA,MAAM,YAAY,YAAA,CAAa,OAAA;AAC/B,IAAA,IAAI,CAAC,WAAW,OAAO,IAAA;AACvB,IAAA,MAAM,SAAA,GAAY,GAAA;AAClB,IAAA,OACE,SAAA,CAAU,YAAA,GAAe,SAAA,CAAU,SAAA,GAAY,UAAU,YAAA,GACzD,SAAA;AAAA,EAEJ,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAEjB,EAAA,MAAM,cAAA,GAAiBA,YAAY,MAAM;AACvC,IAAA,MAAM,YAAY,YAAA,CAAa,OAAA;AAC/B,IAAA,IAAI,CAAC,SAAA,EAAW;AAEhB,IAAA,SAAA,CAAU,QAAA,CAAS;AAAA,MACjB,KAAK,SAAA,CAAU,YAAA;AAAA,MACf,QAAA,EAAU;AAAA,KACX,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAEjB,EAAAE,UAAU,MAAM;AACd,IAAA,MAAM,YAAY,YAAA,CAAa,OAAA;AAC/B,IAAA,IAAI,CAAC,SAAA,EAAW;AAEhB,IAAA,MAAM,eAAe,MAAM;AACzB,MAAA,kBAAA,CAAmB,OAAA,GAAU,CAAC,YAAA,EAAa;AAAA,IAC7C,CAAA;AAEA,IAAA,SAAA,CAAU,iBAAiB,QAAA,EAAU,YAAA,EAAc,EAAE,OAAA,EAAS,MAAM,CAAA;AACpE,IAAA,OAAO,MAAM,SAAA,CAAU,mBAAA,CAAoB,QAAA,EAAU,YAAY,CAAA;AAAA,EACnE,CAAA,EAAG,CAAC,YAAA,EAAc,YAAY,CAAC,CAAA;AAE/B,EAAAA,UAAU,MAAM;AACd,IAAA,MAAM,YAAY,YAAA,CAAa,OAAA;AAC/B,IAAA,IAAI,CAAC,SAAA,EAAW;AAEhB,IAAA,MAAM,gBAAgB,SAAA,CAAU,YAAA;AAChC,IAAA,MAAM,aAAA,GAAgB,kBAAkB,mBAAA,CAAoB,OAAA;AAE5D,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,mBAAA,CAAoB,OAAA,GAAU,aAAA;AAE9B,MAAA,IAAI,CAAC,kBAAA,CAAmB,OAAA,IAAW,YAAA,EAAa,EAAG;AACjD,QAAA,cAAA,EAAe;AAAA,MACjB;AAAA,IACF;AAAA,EACF,CAAC,CAAA;AAED,EAAA,uBACEG,GAAAA;AAAA,IAACG,MAAAA,CAAO,GAAA;AAAA,IAAP;AAAA,MACC,GAAA,EAAK,YAAA;AAAA,MACL,EAAA,EAAI,qBAAA;AAAA,MACJ,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAE;AAAA,MACtB,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAE;AAAA,MACtB,IAAA,EAAM,EAAE,OAAA,EAAS,CAAA,EAAE;AAAA,MACnB,UAAA,EAAY,EAAE,QAAA,EAAU,MAAA,CAAO,WAAW,QAAA,EAAS;AAAA,MACnD,SAAA,EAAU,yIAAA;AAAA,MACV,KAAA,EAAO,EAAE,UAAA,EAAY,MAAA,CAAO,OAAO,kBAAA,EAAmB;AAAA,MAErD;AAAA;AAAA,GACH;AAEJ,CAAC;AAED,iBAAA,CAAkB,WAAA,GAAc,mBAAA;AC9EzB,SAAS,gBAAA,CAAiB;AAAA,EAC/B,aAAA;AAAA,EACA,qBAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAA0B;AACxB,EAAA,uBACEF,IAAAA;AAAA,IAACE,MAAAA,CAAO,GAAA;AAAA,IAAP;AAAA,MACC,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,QAAQ,CAAA,EAAE;AAAA,MACjC,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,QAAQ,MAAA,EAAO;AAAA,MACtC,IAAA,EAAM,EAAE,OAAA,EAAS,CAAA,EAAG,QAAQ,CAAA,EAAE;AAAA,MAC9B,SAAA,EAAU,4EAAA;AAAA,MAEV,QAAA,EAAA;AAAA,wBAAAF,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8FAAA,EACb,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kDAAA,EAAmD,QAAA,EAAA,sBAAA,EAEnE,CAAA;AAAA,0BACAA,GAAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,SAAS,SAAA,EAAU,8CAAA,EAClC,QAAA,kBAAAA,GAAAA,CAACM,GAAA,EAAE,IAAA,EAAM,EAAA,EAAI,SAAA,EAAU,sBAAqB,CAAA,EAC9C;AAAA,SAAA,EACF,CAAA;AAAA,wBACAN,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yCAAA,EACZ,QAAA,EAAA,aAAA,CAAc,WAAW,CAAA,mBACxBA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6DAA4D,QAAA,EAAA,sBAAA,EAE3E,CAAA,GAEA,cAAc,GAAA,CAAI,CAAC,yBACjBC,IAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YAEC,OAAA,EAAS,MAAM,QAAA,CAAS,IAAA,CAAK,EAAE,CAAA;AAAA,YAC/B,WAAW,CAAA,wIAAA,EACT,qBAAA,KAA0B,IAAA,CAAK,EAAA,GAAK,oBAAoB,EAC1D,CAAA,CAAA;AAAA,YAEA,QAAA,EAAA;AAAA,8BAAAD,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gEAAA,EACZ,QAAA,EAAA,IAAA,CAAK,QAAQ,uBAAA,EAChB,CAAA;AAAA,8BACAA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+CACZ,QAAA,EAAA,sBAAA,CAAuB,IAAA,CAAK,UAAU,CAAA,EACzC;AAAA;AAAA,WAAA;AAAA,UAXK,IAAA,CAAK;AAAA,SAab,CAAA,EAEL;AAAA;AAAA;AAAA,GACF;AAEJ;ACnDO,SAAS,aAAA,CAAc,EAAE,QAAA,EAAU,MAAA,EAAO,EAAuB;AACtE,EAAA,uBACEA,GAAAA;AAAA,IAACG,MAAAA,CAAO,GAAA;AAAA,IAAP;AAAA,MACC,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,GAAA,EAAI;AAAA,MAC9B,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,MAC5B,IAAA,EAAM,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,GAAA,EAAI;AAAA,MAC3B,UAAA,EAAY,EAAE,QAAA,EAAU,GAAA,EAAI;AAAA,MAC5B,SAAA,EAAU,qFAAA;AAAA,MAEV,QAAA,kBAAAF,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kDAAA,EACb,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yFAAA,EACb,mBAAS,IAAA,EACZ,CAAA;AAAA,wBACAA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,MAAA;AAAA,YACT,SAAA,EAAU,yEAAA;AAAA,YACX,QAAA,EAAA;AAAA;AAAA;AAED,OAAA,EACF;AAAA;AAAA,GACF;AAEJ;ACxBO,SAAS,cAAA,CAAe,EAAE,MAAA,GAAS,EAAA,EAAG,EAAwB;AACnE,EAAA,MAAM,SAASF,gBAAAA,EAAgB;AAC/B,EAAA,MAAM,WAAW,MAAA,CAAO,QAAA;AAExB,EAAA,IAAI,CAAC,QAAA,CAAS,aAAA,EAAe,OAAO,IAAA;AAGpC,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,OAAA,EAAS,UAAA,CAAW,MAAM,CAAA,GAC/C,QAAA,CAAS,OAAA,GACT,CAAA,EAAG,MAAM,CAAA,EAAG,QAAA,CAAS,OAAO,CAAA,CAAA;AAEhC,EAAA,uBACEG,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wGAAA,EACZ,QAAA,EAAA;AAAA,IAAA,QAAA,CAAS,QAAA,IAAY,2BACpBD,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,OAAA;AAAA,QACL,GAAA,EAAI,MAAA;AAAA,QACJ,KAAA,EAAO,EAAA;AAAA,QACP,MAAA,EAAQ,EAAA;AAAA,QACR,SAAA,EAAU;AAAA;AAAA,KACZ;AAAA,oBAEFA,GAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,QAAA,CAAS,aAAA,EAAc;AAAA,GAAA,EAChC,CAAA;AAEJ;ACnBO,IAAM,gBAA8C,CAAC;AAAA,EAC1D,MAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,QAAA,GAAW;AACb,CAAA,KAAM;AACJ,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIN,SAAS,KAAK,CAAA;AAC1C,EAAA,MAAM,WAAA,GAAcE,OAAuB,IAAI,CAAA;AAE/C,EAAAC,UAAU,MAAM;AACd,IAAA,MAAM,kBAAA,GAAqB,CAAC,KAAA,KAAsB;AAChD,MAAA,IACE,WAAA,CAAY,WACZ,CAAC,WAAA,CAAY,QAAQ,QAAA,CAAS,KAAA,CAAM,MAAc,CAAA,EAClD;AACA,QAAA,SAAA,CAAU,KAAK,CAAA;AAAA,MACjB;AAAA,IACF,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,kBAAkB,CAAA;AACzD,IAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,WAAA,EAAa,kBAAkB,CAAA;AAAA,EAC3E,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,oBAAoB,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,aAAa,CAAA;AAEnE,EAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,MAAA,CAAO,CAAC,KAAK,KAAA,KAAU;AAClD,IAAA,IAAI,CAAC,IAAI,KAAA,CAAM,QAAQ,GAAG,GAAA,CAAI,KAAA,CAAM,QAAQ,CAAA,GAAI,EAAC;AACjD,IAAA,GAAA,CAAI,KAAA,CAAM,QAAQ,CAAA,CAAE,IAAA,CAAK,KAAK,CAAA;AAC9B,IAAA,OAAO,GAAA;AAAA,EACT,CAAA,EAAG,EAA6B,CAAA;AAEhC,EAAA,uBACEI,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAA,EAAgB,KAAK,WAAA,EAClC,QAAA,EAAA;AAAA,oBAAAA,IAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,SAAS,MAAM,CAAC,QAAA,IAAY,SAAA,CAAU,CAAC,MAAM,CAAA;AAAA,QAC7C,QAAA;AAAA,QACA,SAAA,EAAW,EAAA;AAAA,UACT,yFAAA;AAAA,UACA,wCAAA;AAAA,UACA,iDAAA;AAAA,UACA,WAAW,yCAAA,GAA4C;AAAA,SACzD;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,iBAAA,EAAmB,IAAA,IAAQ,cAAA,EAAe,CAAA;AAAA,0BACjDA,GAAAA;AAAA,YAACO,WAAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAW,EAAA;AAAA,gBACT,6CAAA;AAAA,gBACA,SAAS,iBAAA,GAAoB;AAAA;AAC/B;AAAA;AACF;AAAA;AAAA,KACF;AAAA,IAEC,0BACCP,GAAAA,CAAC,SAAI,SAAA,EAAU,sLAAA,EACZ,iBAAO,OAAA,CAAQ,aAAa,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,QAAA,EAAU,cAAc,CAAA,qBAC3DC,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0HAAA,EACZ,QAAA,EAAA,QAAA,EACH,CAAA;AAAA,MACC,cAAA,CAAe,GAAA,CAAI,CAAC,KAAA,qBACnBC,IAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UAEC,SAAS,MAAM;AACb,YAAA,aAAA,CAAc,MAAM,EAAE,CAAA;AACtB,YAAA,SAAA,CAAU,KAAK,CAAA;AAAA,UACjB,CAAA;AAAA,UACA,SAAA,EAAW,EAAA;AAAA,YACT,iGAAA;AAAA,YACA,+CAAA;AAAA,YACA,KAAA,CAAM,EAAA,KAAO,aAAA,GAAgB,oBAAA,GAAuB;AAAA,WACtD;AAAA,UAEA,QAAA,EAAA;AAAA,4BAAAD,GAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,KAAA,CAAM,IAAA,EAAK,CAAA;AAAA,YACjB,KAAA,CAAM,OAAO,aAAA,oBACZA,IAACQ,KAAAA,EAAA,EAAM,WAAU,uCAAA,EAAwC;AAAA;AAAA,SAAA;AAAA,QAbtD,KAAA,CAAM;AAAA,OAgBd;AAAA,KAAA,EAAA,EAtBO,QAuBV,CACD,CAAA,EACH;AAAA,GAAA,EAEJ,CAAA;AAEJ;ACjEA,IAAM,2BAA2B,MAAe;AAC9C,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,KAAA;AAC1C,EAAA,OAAO,CAAC,EACN,SAAA,CAAU,YAAA,IACV,OAAO,SAAA,CAAU,YAAA,CAAa,YAAA,KAAiB,UAAA,KAC9C,MAAA,CAAO,YAAA,IAAiB,MAAA,CAAe,kBAAA,CAAA,CAAA;AAE5C,CAAA;AAEO,SAAS,cACd,OAAA,EACqB;AACrB,EAAA,MAAM,EAAE,UAAA,EAAY,gBAAA,EAAiB,GAAI,OAAA;AAEzC,EAAA,MAAM,CAAC,SAAS,CAAA,GAAId,QAAAA,CAAS,MAAM,0BAA0B,CAAA;AAC7D,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,SAAS,KAAK,CAAA;AACpD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,SAAS,EAAE,CAAA;AAC/C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAEtD,EAAA,MAAM,KAAA,GAAQE,OAAyB,IAAI,CAAA;AAC3C,EAAA,MAAM,SAAA,GAAYA,OAA2B,IAAI,CAAA;AACjD,EAAA,MAAM,eAAA,GAAkBA,OAA4B,IAAI,CAAA;AACxD,EAAA,MAAM,YAAA,GAAeA,OAAmC,IAAI,CAAA;AAC5D,EAAA,MAAM,eAAA,GAAkBA,OAA6C,IAAI,CAAA;AACzE,EAAA,MAAM,aAAA,GAAgBA,OAAO,EAAE,CAAA;AAC/B,EAAA,MAAM,UAAA,GAAaA,OAAO,EAAE,CAAA;AAC5B,EAAA,MAAM,cAAA,GAAiBA,OAAO,KAAK,CAAA;AAEnC,EAAA,MAAM,iBAAA,GAAoBD,YAAY,MAAM;AAC1C,IAAA,IAAI,gBAAgB,OAAA,EAAS;AAC3B,MAAA,YAAA,CAAa,gBAAgB,OAAO,CAAA;AACpC,MAAA,eAAA,CAAgB,OAAA,GAAU,IAAA;AAAA,IAC5B;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,OAAA,GAAUA,YAAY,MAAM;AAChC,IAAA,iBAAA,EAAkB;AAClB,IAAA,cAAA,CAAe,OAAA,GAAU,KAAA;AAGzB,IAAA,IAAI,WAAW,OAAA,EAAS;AACtB,MAAA,aAAA,CAAc,OAAA,IAAW,WAAW,OAAA,GAAU,GAAA;AAC9C,MAAA,aAAA,CAAc,aAAA,CAAc,OAAA,CAAQ,IAAA,EAAM,CAAA;AAC1C,MAAA,UAAA,CAAW,OAAA,GAAU,EAAA;AAAA,IACvB;AAGA,IAAA,IAAI,MAAM,OAAA,EAAS;AACjB,MAAA,IAAI;AACF,QAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,UAAA,KAAe,SAAA,CAAU,IAAA,EAAM;AAC/C,UAAA,KAAA,CAAM,OAAA,CAAQ,KAAK,IAAA,CAAK,SAAA,CAAU,EAAE,IAAA,EAAM,MAAA,EAAQ,CAAC,CAAA;AAAA,QACrD;AACA,QAAA,KAAA,CAAM,QAAQ,KAAA,EAAM;AAAA,MACtB,SAAS,CAAA,EAAG;AAAA,MAEZ;AACA,MAAA,KAAA,CAAM,OAAA,GAAU,IAAA;AAAA,IAClB;AAGA,IAAA,IAAI,aAAa,OAAA,EAAS;AACxB,MAAA,YAAA,CAAa,QAAQ,UAAA,EAAW;AAChC,MAAA,YAAA,CAAa,OAAA,GAAU,IAAA;AAAA,IACzB;AAGA,IAAA,IAAI,gBAAgB,OAAA,EAAS;AAC3B,MAAA,eAAA,CAAgB,QAAQ,KAAA,EAAM;AAC9B,MAAA,eAAA,CAAgB,OAAA,GAAU,IAAA;AAAA,IAC5B;AAGA,IAAA,IAAI,UAAU,OAAA,EAAS;AACrB,MAAA,SAAA,CAAU,OAAA,CAAQ,WAAU,CAAE,OAAA,CAAQ,CAAC,KAAA,KAAU,KAAA,CAAM,MAAM,CAAA;AAC7D,MAAA,SAAA,CAAU,OAAA,GAAU,IAAA;AAAA,IACtB;AAEA,IAAA,cAAA,CAAe,KAAK,CAAA;AAAA,EACtB,CAAA,EAAG,CAAC,iBAAiB,CAAC,CAAA;AAEtB,EAAA,MAAM,IAAA,GAAOA,YAAY,MAAM;AAC7B,IAAA,OAAA,EAAQ;AAAA,EACV,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,MAAM,KAAA,GAAQA,YAAY,MAAM;AAC9B,IAAA,aAAA,CAAc,EAAE,CAAA;AAChB,IAAA,aAAA,CAAc,OAAA,GAAU,EAAA;AACxB,IAAA,QAAA,CAAS,IAAI,CAAA;AAAA,EACf,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,iBAAA,GAAoBA,YAAY,MAAM;AAC1C,IAAA,IAAI,CAAC,SAAA,CAAU,OAAA,IAAW,CAAC,MAAM,OAAA,EAAS;AAE1C,IAAA,eAAA,CAAgB,OAAA,GAAU,KAAK,MAAA,CAAO,YAAA,IACnC,OAAe,kBAAA,EAAoB,EAAE,UAAA,EAAY,IAAA,EAAO,CAAA;AAC3D,IAAA,MAAM,MAAA,GAAS,gBAAgB,OAAA,CAAQ,uBAAA;AAAA,MACrC,SAAA,CAAU;AAAA,KACZ;AACA,IAAA,YAAA,CAAa,OAAA,GAAU,gBAAgB,OAAA,CAAQ,qBAAA;AAAA,MAC7C,IAAA;AAAA,MACA,CAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,YAAA,CAAa,OAAA,CAAQ,cAAA,GAAiB,CAAC,KAAA,KAAU;AAC/C,MAAA,IACE,CAAC,cAAA,CAAe,OAAA,IAChB,CAAC,KAAA,CAAM,WACP,KAAA,CAAM,OAAA,CAAQ,UAAA,KAAe,SAAA,CAAU,IAAA,EACvC;AACA,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,SAAA,GAAY,KAAA,CAAM,WAAA,CAAY,cAAA,CAAe,CAAC,CAAA;AACpD,MAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,SAAA,CAAU,MAAM,CAAA;AAE7C,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,SAAA,CAAU,QAAQ,CAAA,EAAA,EAAK;AACzC,QAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,IAAA,CAAK,IAAI,CAAA,EAAG,SAAA,CAAU,CAAC,CAAC,CAAC,CAAA;AAChD,QAAA,KAAA,CAAM,CAAC,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,QAAS,CAAA,GAAI,KAAA;AAAA,MACtC;AAEA,MAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,KAAA,CAAM,MAAM,CAAA;AACzC,MAAA,IAAI,MAAA,GAAS,EAAA;AACb,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,QAAA,MAAA,IAAU,MAAA,CAAO,YAAA,CAAa,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,MACxC;AAEA,MAAA,KAAA,CAAM,OAAA,CAAQ,IAAA;AAAA,QACZ,IAAA,CAAK,UAAU,EAAE,IAAA,EAAM,SAAS,IAAA,EAAM,IAAA,CAAK,MAAM,CAAA,EAAG;AAAA,OACtD;AAAA,IACF,CAAA;AAEA,IAAA,MAAA,CAAO,OAAA,CAAQ,aAAa,OAAO,CAAA;AACnC,IAAA,YAAA,CAAa,OAAA,CAAQ,OAAA,CAAQ,eAAA,CAAgB,OAAA,CAAQ,WAAW,CAAA;AAAA,EAClE,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,KAAA,GAAQA,YAAY,YAAY;AACpC,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,QAAA,CAAS,+CAA+C,CAAA;AACxD,MAAA;AAAA,IACF;AAGA,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,aAAA,CAAc,OAAA,GAAU,EAAA;AACxB,IAAA,aAAA,CAAc,EAAE,CAAA;AAEhB,IAAA,IAAI;AAEF,MAAA,SAAA,CAAU,OAAA,GAAU,MAAM,SAAA,CAAU,YAAA,CAAa,YAAA,CAAa;AAAA,QAC5D,KAAA,EAAO;AAAA,UACL,gBAAA,EAAkB,IAAA;AAAA,UAClB,gBAAA,EAAkB,IAAA;AAAA,UAClB,UAAA,EAAY;AAAA;AACd,OACD,CAAA;AAGD,MAAA,MAAM,UAAA,GAAa,UAAA,CAAW,UAAA,CAAW,OAAO,IAAI,KAAA,GAAQ,IAAA;AAC5D,MAAA,MAAM,MAAA,GAAS,UAAA,CAAW,OAAA,CAAQ,cAAA,EAAgB,EAAE,CAAA;AACpD,MAAA,MAAM,KAAA,GAAQ,CAAA,EAAG,UAAU,CAAA,GAAA,EAAM,MAAM,CAAA,eAAA,CAAA;AAGvC,MAAA,KAAA,CAAM,OAAA,GAAU,IAAI,SAAA,CAAU,KAAK,CAAA;AAEnC,MAAA,KAAA,CAAM,OAAA,CAAQ,SAAS,MAAM;AAC3B,QAAA,KAAA,CAAM,OAAA,EAAS,KAAK,IAAA,CAAK,SAAA,CAAU,EAAE,IAAA,EAAM,OAAA,EAAS,CAAC,CAAA;AAAA,MACvD,CAAA;AAEA,MAAA,KAAA,CAAM,OAAA,CAAQ,SAAA,GAAY,CAAC,KAAA,KAAU;AACnC,QAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,IAAI,CAAA;AAEjC,QAAA,IAAI,GAAA,CAAI,SAAS,OAAA,EAAS;AACxB,UAAA,iBAAA,EAAkB;AAClB,UAAA,cAAA,CAAe,OAAA,GAAU,IAAA;AACzB,UAAA,cAAA,CAAe,IAAI,CAAA;AAAA,QACrB,CAAA,MAAA,IAAW,GAAA,CAAI,IAAA,KAAS,YAAA,EAAc;AACpC,UAAA,IAAI,GAAA,CAAI,QAAA,IAAY,GAAA,CAAI,IAAA,EAAM;AAE5B,YAAA,aAAA,CAAc,OAAA,IAAW,IAAI,IAAA,GAAO,GAAA;AACpC,YAAA,UAAA,CAAW,OAAA,GAAU,EAAA;AACrB,YAAA,aAAA,CAAc,aAAA,CAAc,OAAA,CAAQ,IAAA,EAAM,CAAA;AAG1C,YAAA,IAAI,gBAAA,EAAkB;AACpB,cAAA,iBAAA,EAAkB;AAClB,cAAA,eAAA,CAAgB,OAAA,GAAU,WAAW,MAAM;AACzC,gBAAA,IAAA,EAAK;AAAA,cACP,GAAG,gBAAgB,CAAA;AAAA,YACrB;AAAA,UACF,CAAA,MAAA,IAAW,CAAC,GAAA,CAAI,QAAA,IAAY,IAAI,IAAA,EAAM;AAEpC,YAAA,UAAA,CAAW,UAAU,GAAA,CAAI,IAAA;AAEzB,YAAA,aAAA,CAAA,CAAe,aAAA,CAAc,OAAA,GAAU,GAAA,CAAI,IAAA,EAAM,MAAM,CAAA;AAAA,UACzD;AAAA,QACF,CAAA,MAAA,IAAW,GAAA,CAAI,IAAA,KAAS,OAAA,EAAS;AAC/B,UAAA,QAAA,CAAS,GAAA,CAAI,WAAW,WAAW,CAAA;AACnC,UAAA,OAAA,EAAQ;AAAA,QACV;AAAA,MACF,CAAA;AAEA,MAAA,KAAA,CAAM,OAAA,CAAQ,UAAU,MAAM;AAC5B,QAAA,QAAA,CAAS,4BAA4B,CAAA;AACrC,QAAA,OAAA,EAAQ;AAAA,MACV,CAAA;AAEA,MAAA,KAAA,CAAM,OAAA,CAAQ,UAAU,MAAM;AAC5B,QAAA,IAAI,eAAe,OAAA,EAAS;AAE1B,UAAA,OAAA,EAAQ;AAAA,QACV;AAAA,MACF,CAAA;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,QAAA;AAAA,QACE,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU;AAAA,OACvC;AACA,MAAA,OAAA,EAAQ;AAAA,IACV;AAAA,EACF,CAAA,EAAG;AAAA,IACD,SAAA;AAAA,IACA,UAAA;AAAA,IACA,iBAAA;AAAA,IACA,gBAAA;AAAA,IACA,iBAAA;AAAA,IACA,IAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,MAAM,MAAA,GAASA,YAAY,MAAM;AAC/B,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,IAAA,EAAK;AAAA,IACP,CAAA,MAAO;AACL,MAAA,KAAA,EAAM;AAAA,IACR;AAAA,EACF,CAAA,EAAG,CAAC,WAAA,EAAa,KAAA,EAAO,IAAI,CAAC,CAAA;AAG7B,EAAAE,UAAU,MAAM;AACd,IAAA,OAAO,MAAM;AACX,MAAA,OAAA,EAAQ;AAAA,IACV,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,OAAO;AAAA,IACL,SAAA;AAAA,IACA,WAAA;AAAA,IACA,UAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA;AAAA,IACA,IAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACF;AACF;AC/QA,IAAM,WAAWY,MAAAA,CAAM,UAAA;AAAA,EACrB,CAAC,EAAE,SAAA,EAAW,GAAG,KAAA,EAAM,EAAG,wBACxBT,GAAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,0TAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,GAAA;AAAA,MACA,IAAA,EAAM,CAAA;AAAA,MACL,GAAG;AAAA;AAAA;AAGV,CAAA;AACA,QAAA,CAAS,WAAA,GAAc,UAAA;AAGvB,IAAM,eAAA,GAAmC,gBAAA,CAAA,QAAA;AACzC,IAAM,OAAA,GAA2B,gBAAA,CAAA,IAAA;AACjC,IAAM,cAAA,GAAkC,gBAAA,CAAA,OAAA;AAExC,IAAM,cAAA,GAAiBS,MAAAA,CAAM,UAAA,CAG3B,CAAC,EAAE,SAAA,EAAW,UAAA,GAAa,CAAA,EAAG,GAAG,KAAA,EAAM,EAAG,GAAA,qBAC1CT,GAAAA;AAAA,EAAkB,gBAAA,CAAA,OAAA;AAAA,EAAjB;AAAA,IACC,GAAA;AAAA,IACA,UAAA;AAAA,IACA,SAAA,EAAW,EAAA;AAAA,MACT,oKAAA;AAAA,MACA;AAAA,KACF;AAAA,IACC,GAAG;AAAA;AACN,CACD,CAAA;AACD,cAAA,CAAe,WAAA,GAAc,gBAAA;AAQ7B,IAAM,SAASS,MAAAA,CAAM,UAAA;AAAA,EACnB,CAAC,EAAE,SAAA,EAAW,OAAA,GAAU,SAAA,EAAW,OAAO,SAAA,EAAW,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AACvE,IAAA,MAAM,cAAA,GAAiB;AAAA,MACrB,OAAA,EAAS,sDAAA;AAAA,MACT,OAAA,EAAS,wDAAA;AAAA,MACT,KAAA,EAAO;AAAA,KACT;AACA,IAAA,MAAM,WAAA,GAAc;AAAA,MAClB,OAAA,EAAS,+BAAA;AAAA,MACT,EAAA,EAAI,iCAAA;AAAA,MACJ,EAAA,EAAI,qBAAA;AAAA,MACJ,IAAA,EAAM;AAAA,KACR;AACA,IAAA,uBACET,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,EAAA;AAAA,UACT,2LAAA;AAAA,UACA,eAAe,OAAO,CAAA;AAAA,UACtB,YAAY,IAAI,CAAA;AAAA,UAChB;AAAA,SACF;AAAA,QACA,GAAA;AAAA,QACC,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ;AACF,CAAA;AACA,MAAA,CAAO,WAAA,GAAc,QAAA;AAYrB,IAAM,kBAAA,GAAqBS,OAAM,aAAA,CAAsC;AAAA,EACrE,SAAA,EAAW,KAAA;AAAA,EACX,KAAA,EAAO,EAAA;AAAA,EACP,UAAU,MAAM;AAAA,EAAC,CAAA;AAAA,EACjB,SAAA,EAAW,GAAA;AAAA,EACX,QAAA,EAAU,MAAA;AAAA,EACV,QAAA,EAAU;AACZ,CAAC,CAAA;AAED,SAAS,cAAA,GAAiB;AACxB,EAAA,MAAM,OAAA,GAAUA,MAAAA,CAAM,UAAA,CAAW,kBAAkB,CAAA;AACnD,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,MAAM,kDAAkD,CAAA;AAAA,EACpE;AACA,EAAA,OAAO,OAAA;AACT;AAeA,IAAM,cAAcA,MAAAA,CAAM,UAAA;AAAA,EACxB,CACE;AAAA,IACE,SAAA;AAAA,IACA,SAAA,GAAY,KAAA;AAAA,IACZ,SAAA,GAAY,GAAA;AAAA,IACZ,KAAA;AAAA,IACA,aAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA,GAAW,KAAA;AAAA,IACX;AAAA,KAEF,GAAA,KACG;AACH,IAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,IAAIA,MAAAA,CAAM,QAAA,CAAS,SAAS,EAAE,CAAA;AAEpE,IAAA,MAAM,YAAA,GAAe,CAAC,QAAA,KAAqB;AACzC,MAAA,gBAAA,CAAiB,QAAQ,CAAA;AACzB,MAAA,aAAA,GAAgB,QAAQ,CAAA;AAAA,IAC1B,CAAA;AAEA,IAAA,uBACET,GAAAA,CAAC,eAAA,EAAA,EACC,QAAA,kBAAAA,GAAAA;AAAA,MAAC,kBAAA,CAAmB,QAAA;AAAA,MAAnB;AAAA,QACC,KAAA,EAAO;AAAA,UACL,SAAA;AAAA,UACA,OAAO,KAAA,IAAS,aAAA;AAAA,UAChB,UAAU,aAAA,IAAiB,YAAA;AAAA,UAC3B,SAAA;AAAA,UACA,QAAA;AAAA,UACA;AAAA,SACF;AAAA,QAEA,QAAA,kBAAAA,GAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,GAAA;AAAA,YACA,SAAA,EAAW,EAAA;AAAA,cACT,iIAAA;AAAA,cACA,SAAA,IAAa,qBAAA;AAAA,cACb;AAAA,aACF;AAAA,YACA,KAAA;AAAA,YAEC;AAAA;AAAA;AACH;AAAA,KACF,EACF,CAAA;AAAA,EAEJ;AACF,CAAA;AACA,WAAA,CAAY,WAAA,GAAc,aAAA;AAQ1B,IAAM,sBAEF,CAAC;AAAA,EACH,SAAA;AAAA,EACA,SAAA;AAAA,EACA,eAAA,GAAkB,KAAA;AAAA,EAClB,WAAA;AAAA,EACA,GAAG;AACL,CAAA,KAAM;AACJ,EAAA,MAAM,EAAE,KAAA,EAAO,QAAA,EAAU,WAAW,QAAA,EAAU,QAAA,KAAa,cAAA,EAAe;AAC1E,EAAA,MAAM,WAAA,GAAcS,MAAAA,CAAM,MAAA,CAA4B,IAAI,CAAA;AAE1D,EAAAA,MAAAA,CAAM,UAAU,MAAM;AACpB,IAAA,IAAI,eAAA,IAAmB,CAAC,WAAA,CAAY,OAAA,EAAS;AAC7C,IAAA,WAAA,CAAY,OAAA,CAAQ,MAAM,MAAA,GAAS,MAAA;AACnC,IAAA,WAAA,CAAY,OAAA,CAAQ,MAAM,MAAA,GACxB,OAAO,cAAc,QAAA,GACjB,CAAA,EAAG,KAAK,GAAA,CAAI,WAAA,CAAY,QAAQ,YAAA,EAAc,SAAS,CAAC,CAAA,EAAA,CAAA,GACxD,CAAA,IAAA,EAAO,YAAY,OAAA,CAAQ,YAAY,OAAO,SAAS,CAAA,CAAA,CAAA;AAAA,EAC/D,CAAA,EAAG,CAAC,KAAA,EAAO,SAAA,EAAW,eAAe,CAAC,CAAA;AAEtC,EAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAAgD;AACrE,IAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,CAAC,EAAE,QAAA,EAAU;AACpC,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,QAAA,IAAW;AAAA,IACb;AACA,IAAA,SAAA,GAAY,CAAC,CAAA;AAAA,EACf,CAAA;AAEA,EAAA,uBACET,GAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,WAAA;AAAA,MACL,KAAA;AAAA,MACA,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,MACxC,SAAA,EAAW,aAAA;AAAA,MACX,SAAA,EAAW,EAAA,CAAG,WAAA,EAAa,SAAS,CAAA;AAAA,MACpC,QAAA;AAAA,MACA,WAAA;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ,CAAA;AAMA,IAAM,qBAAwD,CAAC;AAAA,EAC7D,QAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAG;AACL,CAAA,qBACEA,GAAAA;AAAA,EAAC,KAAA;AAAA,EAAA;AAAA,IACC,SAAA,EAAW,EAAA,CAAG,wCAAA,EAA0C,SAAS,CAAA;AAAA,IAChE,GAAG,KAAA;AAAA,IAEH;AAAA;AACH,CAAA;AAUF,IAAM,oBAAsD,CAAC;AAAA,EAC3D,OAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA,GAAO,KAAA;AAAA,EACP,GAAG;AACL,CAAA,KAAM;AACJ,EAAA,uBACEC,IAAAA,CAAC,OAAA,EAAA,EAAS,GAAG,KAAA,EACX,QAAA,EAAA;AAAA,oBAAAD,GAAAA,CAAC,cAAA,EAAA,EAAe,OAAA,EAAO,IAAA,EAAE,QAAA,EAAS,CAAA;AAAA,oBAClCA,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAa,QAAA,EAAA,OAAA,EAAQ;AAAA,GAAA,EACvC,CAAA;AAEJ,CAAA;AAsBO,IAAM,iBAAiBS,MAAAA,CAAM,UAAA;AAAA,EAIlC,CACE;AAAA,IACE,SAAS,MAAM;AAAA,IAAC,CAAA;AAAA,IAChB,MAAA;AAAA,IACA,SAAA,GAAY,KAAA;AAAA,IACZ,cAAA,GAAiB,KAAA;AAAA,IACjB,WAAA,GAAc,2BAAA;AAAA,IACd,SAAA;AAAA,IACA,aAAA,GAAgB,QAAA;AAAA,IAChB,aAAA;AAAA,IACA,kBAAkB,EAAC;AAAA,IACnB,WAAA,GAAc,KAAA;AAAA,IACd,UAAA,GAAa,EAAA;AAAA,IACb,qBAAA,GAAwB;AAAA,KAE1B,GAAA,KACG;AACH,IAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,MAAAA,CAAM,SAAS,EAAE,CAAA;AAC3C,IAAA,MAAM,YAAA,GAAeA,MAAAA,CAAM,MAAA,CAAuB,IAAI,CAAA;AAEtD,IAAA,MAAM,QAAQ,aAAA,CAAc,EAAE,UAAA,EAAY,gBAAA,EAAkB,MAAM,CAAA;AAGlE,IAAA,MAAM,cAAA,GAAiBA,MAAAA,CAAM,MAAA,CAAO,CAAC,CAAA;AACrC,IAAA,MAAM,QAAA,GAAWA,MAAAA,CAAM,MAAA,CAAO,KAAK,CAAA;AACnC,IAAA,QAAA,CAAS,OAAA,GAAU,KAAA;AACnB,IAAAA,MAAAA,CAAM,UAAU,MAAM;AACpB,MAAA,IAAI,qBAAA,GAAwB,CAAA,IAAK,qBAAA,KAA0B,cAAA,CAAe,OAAA,EAAS;AACjF,QAAA,OAAA,CAAQ,IAAI,8CAA8C,CAAA;AAC1D,QAAA,QAAA,CAAS,QAAQ,KAAA,EAAM;AAAA,MACzB;AACA,MAAA,cAAA,CAAe,OAAA,GAAU,qBAAA;AAAA,IAC3B,CAAA,EAAG,CAAC,qBAAqB,CAAC,CAAA;AAG1B,IAAAA,MAAAA,CAAM,UAAU,MAAM;AACpB,MAAA,IAAI,KAAA,CAAM,WAAA,IAAe,KAAA,CAAM,UAAA,EAAY;AACzC,QAAA,QAAA,CAAS,MAAM,UAAU,CAAA;AAAA,MAC3B;AAAA,IACF,GAAG,CAAC,KAAA,CAAM,WAAA,EAAa,KAAA,CAAM,UAAU,CAAC,CAAA;AAGxC,IAAA,MAAM,eAAA,GAAkBA,MAAAA,CAAM,MAAA,CAAO,KAAK,CAAA;AAC1C,IAAAA,MAAAA,CAAM,UAAU,MAAM;AACpB,MAAA,IAAI,gBAAgB,OAAA,IAAW,CAAC,KAAA,CAAM,WAAA,IAAe,MAAM,UAAA,EAAY;AAErE,QAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,UAAA,CAAW,IAAA,EAAK;AAC5C,QAAA,IAAI,aAAA,EAAe;AACjB,UAAA,OAAA,CAAQ,GAAA,CAAI,yBAAyB,aAAa,CAAA;AAClD,UAAA,MAAA,CAAO,aAAa,CAAA;AACpB,UAAA,QAAA,CAAS,EAAE,CAAA;AAAA,QACb;AACA,QAAA,KAAA,CAAM,KAAA,EAAM;AAAA,MACd;AACA,MAAA,eAAA,CAAgB,UAAU,KAAA,CAAM,WAAA;AAAA,IAClC,CAAA,EAAG,CAAC,KAAA,CAAM,WAAA,EAAa,MAAM,UAAA,EAAY,KAAA,CAAM,KAAA,EAAO,MAAM,CAAC,CAAA;AAE7D,IAAA,MAAM,eAAe,MAAM;AACzB,MAAA,IAAI,KAAA,CAAM,MAAK,EAAG;AAEhB,QAAA,IAAI,MAAM,WAAA,EAAa;AACrB,UAAA,KAAA,CAAM,IAAA,EAAK;AAAA,QACb;AACA,QAAA,MAAA,CAAO,KAAK,CAAA;AACZ,QAAA,QAAA,CAAS,EAAE,CAAA;AAAA,MACb;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,UAAA,GAAa,KAAA,CAAM,IAAA,EAAK,KAAM,EAAA;AAEpC,IAAA,uBACER,IAAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,KAAA;AAAA,QACP,aAAA,EAAe,QAAA;AAAA,QACf,SAAA;AAAA,QACA,QAAA,EAAU,YAAA;AAAA,QACV,SAAA,EAAW,EAAA;AAAA,UACT,mFAAA;AAAA,UACA,WAAA,IAAe,2FAAA;AAAA,UACf;AAAA,SACF;AAAA,QACA,OAAO,WAAA,GAAc;AAAA,UACnB,iBAAA,EAAmB,+BAAA;AAAA,UACnB,wBAAA,EAA0B;AAAA,SAC5B,GAA2B,MAAA;AAAA,QAC3B,QAAA,EAAU,SAAA;AAAA,QACV,KAAK,GAAA,IAAO,YAAA;AAAA,QAEZ,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wDAAA,EACb,QAAA,kBAAAA,GAAAA;AAAA,YAAC,mBAAA;AAAA,YAAA;AAAA,cACC,WAAA;AAAA,cACA,SAAA,EAAU;AAAA;AAAA,WACZ,EACF,CAAA;AAAA,0BAEAC,IAAAA,CAAC,kBAAA,EAAA,EAAmB,SAAA,EAAU,gFAAA,EAE5B,QAAA,EAAA;AAAA,4BAAAD,GAAAA,CAAC,SAAI,SAAA,EAAU,6BAAA,EACZ,0BAAgB,MAAA,GAAS,CAAA,IAAK,iCAC7BA,GAAAA;AAAA,cAAC,aAAA;AAAA,cAAA;AAAA,gBACC,MAAA,EAAQ,eAAA;AAAA,gBACR,aAAA;AAAA,gBACA,aAAA;AAAA,gBACA,QAAA,EAAU;AAAA;AAAA,aACZ,EAEJ,CAAA;AAAA,4BAGAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EAEZ,QAAA,EAAA;AAAA,cAAA,KAAA,CAAM,SAAA,IAAa,CAAC,SAAA,IAAa,CAAC,kCACjCD,GAAAA;AAAA,gBAAC,iBAAA;AAAA,gBAAA;AAAA,kBACC,OAAA,EAAS,KAAA,CAAM,WAAA,GAAc,gBAAA,GAAmB,aAAA;AAAA,kBAEhD,QAAA,kBAAAC,IAAAA;AAAA,oBAAC,MAAA;AAAA,oBAAA;AAAA,sBACC,OAAA,EAAQ,OAAA;AAAA,sBACR,IAAA,EAAK,MAAA;AAAA,sBACL,SAAA,EAAW,EAAA;AAAA,wBACT,2EAAA;AAAA,wBACA,MAAM,WAAA,IAAe;AAAA,uBACvB;AAAA,sBACA,SAAS,KAAA,CAAM,MAAA;AAAA,sBAEf,QAAA,EAAA;AAAA,wCAAAD,GAAAA;AAAA,0BAAC,GAAA;AAAA,0BAAA;AAAA,4BACC,SAAA,EAAW,EAAA;AAAA,8BACT,8CAAA;AAAA,8BACA,KAAA,CAAM,cAAc,mBAAA,GAAsB;AAAA;AAC5C;AAAA,yBACF;AAAA,wBACC,MAAM,WAAA,oBACLA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,8GAAA,EAA+G;AAAA;AAAA;AAAA;AAEnI;AAAA,eACF;AAAA,8BAIFA,GAAAA;AAAA,gBAAC,iBAAA;AAAA,gBAAA;AAAA,kBACC,OAAA,EACE,SAAA,IAAa,cAAA,GACT,iBAAA,GACA,aACA,cAAA,GACA,gBAAA;AAAA,kBAGN,QAAA,kBAAAA,GAAAA;AAAA,oBAAC,MAAA;AAAA,oBAAA;AAAA,sBACC,OAAA,EAAQ,SAAA;AAAA,sBACR,IAAA,EAAK,MAAA;AAAA,sBACL,SAAA,EAAW,EAAA;AAAA,wBACT,2EAAA;AAAA,wBAAA,CACC,aAAa,cAAA,KAAmB,uCAAA;AAAA,wBACjC,UAAA,IACE,CAAC,SAAA,IACD,CAAC,cAAA,IACD,sCAAA;AAAA,wBACF,CAAC,UAAA,IAAc,CAAC,SAAA,IAAa,CAAC,cAAA,IAAkB;AAAA,uBAClD;AAAA,sBACA,SAAS,MAAM;AACb,wBAAA,IAAA,CAAK,SAAA,IAAa,mBAAmB,MAAA,EAAQ;AAC3C,0BAAA,MAAA,EAAO;AAAA,wBACT,WAAW,UAAA,EAAY;AACrB,0BAAA,YAAA,EAAa;AAAA,wBACf;AAAA,sBACF,CAAA;AAAA,sBAEC,QAAA,EAAA,SAAA,IAAa,iCACZA,GAAAA;AAAA,wBAAC,MAAA;AAAA,wBAAA;AAAA,0BACC,SAAA,EAAU,uCAAA;AAAA,0BACV,KAAA,EAAO,EAAE,IAAA,EAAM,OAAA;AAAQ;AAAA,0CAGzBA,GAAAA;AAAA,wBAAC,OAAA;AAAA,wBAAA;AAAA,0BACC,SAAA,EAAW,EAAA;AAAA,4BACT,uBAAA;AAAA,4BACA,aAAa,iBAAA,GAAoB;AAAA;AACnC;AAAA;AACF;AAAA;AAEJ;AAAA;AACF,aAAA,EACF;AAAA,WAAA,EACF;AAAA;AAAA;AAAA,KACF;AAAA,EAEJ;AACF;AAEA,cAAA,CAAe,WAAA,GAAc,gBAAA;ACndtB,SAAS,sBAAA,CAAuB;AAAA,EACrC,WAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAAgC;AAC9B,EAAA,MAAM,SAASF,gBAAAA,EAAgB;AAE/B,EAAA,uBACEE,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,uEAAA;AAAA,MAEV,QAAA,kBAAAC,IAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,8DAAA;AAAA,UACV,KAAA,EAAO;AAAA,YACL,UAAA,EAAY,OAAO,MAAA,CAAO,SAAA;AAAA,YAC1B,WAAA,EAAa,OAAO,MAAA,CAAO;AAAA,WAC7B;AAAA,UAGA,QAAA,EAAA;AAAA,4BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kDAAA,EACb,QAAA,EAAA;AAAA,8BAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,cAAA,EAAe,QAAA,EAAA,iBAAA,EAAG,CAAA;AAAA,8BAClCA,GAAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAU,+BAAA;AAAA,kBACV,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,CAAO,OAAO,OAAA,EAAQ;AAAA,kBACvC,QAAA,EAAA;AAAA;AAAA;AAED,aAAA,EACF,CAAA;AAAA,4BAGAA,GAAAA;AAAA,cAAC,GAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAU,yCAAA;AAAA,gBACV,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,CAAO,OAAO,OAAA,EAAQ;AAAA,gBACvC,QAAA,EAAA;AAAA;AAAA,aAED;AAAA,4BAGAC,IAAAA;AAAA,cAAC,GAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAU,0EAAA;AAAA,gBACV,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,CAAO,OAAO,OAAA,EAAQ;AAAA,gBACvC,QAAA,EAAA;AAAA,kBAAA,GAAA;AAAA,kBACG,WAAA;AAAA,kBAAY;AAAA;AAAA;AAAA,aAChB;AAAA,4BAGAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uCAAA,EACb,QAAA,EAAA;AAAA,8BAAAD,GAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,OAAA,EAAS,MAAA;AAAA,kBACT,SAAA,EAAU,kHAAA;AAAA,kBACV,KAAA,EAAO;AAAA,oBACL,UAAA,EAAY,aAAA;AAAA,oBACZ,KAAA,EAAO,OAAO,MAAA,CAAO,OAAA;AAAA,oBACrB,MAAA,EAAQ,CAAA,UAAA,EAAa,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA;AAAA,mBAC3C;AAAA,kBACD,QAAA,EAAA;AAAA;AAAA,eAED;AAAA,8BACAA,GAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,OAAA,EAAS,OAAA;AAAA,kBACT,SAAA,EAAU,kHAAA;AAAA,kBACV,KAAA,EAAO;AAAA,oBACL,UAAA,EAAY,OAAO,MAAA,CAAO,OAAA;AAAA,oBAC1B,KAAA,EAAO;AAAA,mBACT;AAAA,kBACD,QAAA,EAAA;AAAA;AAAA;AAED,aAAA,EACF;AAAA;AAAA;AAAA;AACF;AAAA,GACF;AAEJ;ACxEO,SAAS,kBAAA,CAAmB;AAAA,EACjC,QAAA;AAAA,EACA;AACF,CAAA,EAA4B;AAC1B,EAAA,MAAM,SAASF,gBAAAA,EAAgB;AAC/B,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIJ,SAAS,EAAE,CAAA;AACvC,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,SAAS,KAAK,CAAA;AAEtD,EAAA,MAAM,YAAA,GAAeC,YAAY,MAAM;AACrC,IAAA,IAAI,MAAA,CAAO,IAAA,EAAK,IAAK,CAAC,YAAA,EAAc;AAClC,MAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,MAAA,QAAA,CAAS,MAAA,CAAO,MAAM,CAAA;AAAA,IACxB;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,YAAA,EAAc,QAAQ,CAAC,CAAA;AAEnC,EAAA,MAAM,aAAA,GAAgBA,WAAAA;AAAA,IACpB,CAAC,CAAA,KAAuC;AACtC,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,CAAC,EAAE,QAAA,EAAU;AACpC,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,YAAA,EAAa;AAAA,MACf;AAAA,IACF,CAAA;AAAA,IACA,CAAC,YAAY;AAAA,GACf;AAEA,EAAA,uBACEK,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yEACb,QAAA,kBAAAC,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,8DAAA;AAAA,MACV,KAAA,EAAO;AAAA,QACL,UAAA,EAAY,OAAO,MAAA,CAAO,SAAA;AAAA,QAC1B,WAAA,EAAa,OAAO,MAAA,CAAO;AAAA,OAC7B;AAAA,MAGA,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kDAAA,EACb,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,cAAA,EAAe,QAAA,EAAA,WAAA,EAAE,CAAA;AAAA,0BACjCA,GAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,+BAAA;AAAA,cACV,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,CAAO,OAAO,OAAA,EAAQ;AAAA,cACvC,QAAA,EAAA;AAAA;AAAA;AAED,SAAA,EACF,CAAA;AAAA,wBAGAA,GAAAA;AAAA,UAAC,GAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,wBAAA;AAAA,YACV,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,CAAO,OAAO,OAAA,EAAQ;AAAA,YAErC,QAAA,EAAA;AAAA;AAAA,SACH;AAAA,wBAGAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EACb,QAAA,EAAA;AAAA,0BAAAD,GAAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,MAAA;AAAA,cACL,KAAA,EAAO,MAAA;AAAA,cACP,UAAU,CAAC,CAAA,KAAM,SAAA,CAAU,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,cACzC,SAAA,EAAW,aAAA;AAAA,cACX,WAAA,EAAY,uBAAA;AAAA,cACZ,QAAA,EAAU,YAAA;AAAA,cACV,SAAA,EAAU,uIAAA;AAAA,cACV,KAAA,EAAO;AAAA,gBACL,UAAA,EAAY,OAAO,MAAA,CAAO,UAAA;AAAA,gBAC1B,KAAA,EAAO,OAAO,MAAA,CAAO,IAAA;AAAA,gBACrB,WAAA,EAAa,OAAO,MAAA,CAAO;AAAA,eAC7B;AAAA,cACA,SAAA,EAAS;AAAA;AAAA,WACX;AAAA,0BACAA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,YAAA;AAAA,cACT,QAAA,EAAU,CAAC,MAAA,CAAO,IAAA,EAAK,IAAK,YAAA;AAAA,cAC5B,SAAA,EAAU,0KAAA;AAAA,cACV,KAAA,EAAO;AAAA,gBACL,UAAA,EAAY,OAAO,MAAA,CAAO,OAAA;AAAA,gBAC1B,KAAA,EAAO;AAAA,eACT;AAAA,cAEC,yBAAe,YAAA,GAAe;AAAA;AAAA;AACjC,SAAA,EACF;AAAA;AAAA;AAAA,GACF,EACF,CAAA;AAEJ;ACvFO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,OAAA;AAAA,EACA;AACF,CAAA,EAA0B;AACxB,EAAA,MAAM,SAASF,gBAAAA,EAAgB;AAE/B,EAAA,uBACEE,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yDAAA,EACZ,kBAAQ,GAAA,CAAI,CAAC,MAAA,EAAQ,GAAA,qBACpBA,GAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MAEC,OAAA,EAAS,MAAM,aAAA,CAAc,MAAM,CAAA;AAAA,MACnC,SAAA,EAAU,oJAAA;AAAA,MACV,KAAA,EAAO;AAAA,QACL,WAAA,EAAa,OAAO,MAAA,CAAO,OAAA;AAAA,QAC3B,KAAA,EAAO,OAAO,MAAA,CAAO,OAAA;AAAA,QACrB,UAAA,EAAY;AAAA,OACd;AAAA,MAEC,QAAA,EAAA,MAAA,CAAO;AAAA,KAAA;AAAA,IATH;AAAA,GAWR,CAAA,EACH,CAAA;AAEJ;;;ACtBO,IAAM,aAAA,GAAgB;AAAA;AAAA,EAE3B,MAAA,EAAQ;AAAA,IACN,OAAA,EAAS,uBAAA;AAAA,IACT,UAAA,EAAY,0BAAA;AAAA,IACZ,MAAA,EAAQ,sBAAA;AAAA,IACR,IAAA,EAAM,oBAAA;AAAA,IACN,SAAA,EAAW,0BAAA;AAAA,IACX,OAAA,EAAS,wBAAA;AAAA,IACT,UAAA,EAAY,2BAAA;AAAA,IACZ,QAAA,EAAU,yBAAA;AAAA,IACV,UAAA,EAAY,2BAAA;AAAA,IACZ,kBAAA,EAAoB,mCAAA;AAAA,IACpB,gBAAA,EAAkB,iCAAA;AAAA,IAClB,YAAA,EAAc,6BAAA;AAAA,IACd,UAAA,EAAY;AAAA,GACd;AAAA;AAAA,EAEA,UAAA,EAAY;AAAA,IACV,KAAA,EAAO,yBAAA;AAAA,IACP,SAAA,EAAW,8BAAA;AAAA,IACX,iBAAA,EAAmB,uCAAA;AAAA,IACnB,YAAA,EAAc,iCAAA;AAAA,IACd,OAAA,EAAS;AAAA,GACX;AAAA;AAAA,EAEA,UAAA,EAAY;AAAA,IACV,UAAA,EAAY,+BAAA;AAAA,IACZ,QAAA,EAAU,6BAAA;AAAA,IACV,cAAA,EAAgB,oCAAA;AAAA,IAChB,UAAA,EAAY,+BAAA;AAAA,IACZ,UAAA,EAAY,+BAAA;AAAA,IACZ,aAAA,EAAe;AAAA,GACjB;AAAA;AAAA,EAEA,QAAA,EAAU;AAAA,IACR,KAAA,EAAO,uBAAA;AAAA,IACP,MAAA,EAAQ,wBAAA;AAAA,IACR,WAAA,EAAa,8BAAA;AAAA,IACb,YAAA,EAAc;AAAA,GAChB;AAAA;AAAA,EAEA,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM,oBAAA;AAAA,IACN,QAAA,EAAU;AAAA,GACZ;AAAA;AAAA,EAEA,OAAA,EAAS;AAAA,IACP,MAAA,EAAQ,uBAAA;AAAA,IACR,MAAA,EAAQ;AAAA,GACV;AAAA;AAAA,EAEA,UAAA,EAAY;AAAA,IACV,QAAA,EAAU;AAAA;AAEd;AAaO,SAAS,gBAAgB,MAAA,EAAsD;AACpF,EAAA,MAAM,OAA+B,EAAC;AAGtC,EAAA,IAAA,CAAK,aAAA,CAAc,MAAA,CAAO,OAAO,CAAA,GAAI,OAAO,MAAA,CAAO,OAAA;AACnD,EAAA,IAAA,CAAK,aAAA,CAAc,MAAA,CAAO,UAAU,CAAA,GAAI,OAAO,MAAA,CAAO,UAAA;AACtD,EAAA,IAAA,CAAK,aAAA,CAAc,MAAA,CAAO,MAAM,CAAA,GAAI,OAAO,MAAA,CAAO,MAAA;AAClD,EAAA,IAAA,CAAK,aAAA,CAAc,MAAA,CAAO,IAAI,CAAA,GAAI,OAAO,MAAA,CAAO,IAAA;AAChD,EAAA,IAAA,CAAK,aAAA,CAAc,MAAA,CAAO,SAAS,CAAA,GAAI,OAAO,MAAA,CAAO,SAAA;AACrD,EAAA,IAAA,CAAK,aAAA,CAAc,MAAA,CAAO,OAAO,CAAA,GAAI,OAAO,MAAA,CAAO,OAAA;AACnD,EAAA,IAAA,CAAK,aAAA,CAAc,MAAA,CAAO,UAAU,CAAA,GAAI,OAAO,MAAA,CAAO,UAAA;AACtD,EAAA,IAAA,CAAK,aAAA,CAAc,MAAA,CAAO,QAAQ,CAAA,GAAI,OAAO,MAAA,CAAO,QAAA;AACpD,EAAA,IAAA,CAAK,aAAA,CAAc,MAAA,CAAO,UAAU,CAAA,GAAI,OAAO,MAAA,CAAO,UAAA;AACtD,EAAA,IAAA,CAAK,aAAA,CAAc,MAAA,CAAO,kBAAkB,CAAA,GAAI,OAAO,MAAA,CAAO,kBAAA;AAC9D,EAAA,IAAA,CAAK,aAAA,CAAc,MAAA,CAAO,gBAAgB,CAAA,GAAI,OAAO,MAAA,CAAO,gBAAA;AAC5D,EAAA,IAAA,CAAK,aAAA,CAAc,MAAA,CAAO,YAAY,CAAA,GAAI,OAAO,MAAA,CAAO,YAAA;AACxD,EAAA,IAAA,CAAK,aAAA,CAAc,MAAA,CAAO,UAAU,CAAA,GAAI,OAAO,MAAA,CAAO,UAAA;AAGtD,EAAA,IAAA,CAAK,cAAc,UAAA,CAAW,KAAK,IAAI,CAAA,EAAG,MAAA,CAAO,WAAW,KAAK,CAAA,EAAA,CAAA;AACjE,EAAA,IAAA,CAAK,cAAc,UAAA,CAAW,SAAS,IAAI,CAAA,EAAG,MAAA,CAAO,WAAW,SAAS,CAAA,EAAA,CAAA;AACzE,EAAA,IAAA,CAAK,cAAc,UAAA,CAAW,iBAAiB,IAAI,CAAA,EAAG,MAAA,CAAO,WAAW,iBAAiB,CAAA,EAAA,CAAA;AACzF,EAAA,IAAA,CAAK,cAAc,UAAA,CAAW,YAAY,IAAI,CAAA,EAAG,MAAA,CAAO,WAAW,YAAY,CAAA,EAAA,CAAA;AAC/E,EAAA,IAAA,CAAK,cAAc,UAAA,CAAW,OAAO,IAAI,CAAA,EAAG,MAAA,CAAO,WAAW,OAAO,CAAA,EAAA,CAAA;AAGrE,EAAA,IAAA,CAAK,aAAA,CAAc,UAAA,CAAW,UAAU,CAAA,GAAI,OAAO,UAAA,CAAW,UAAA;AAC9D,EAAA,IAAA,CAAK,cAAc,UAAA,CAAW,QAAQ,IAAI,CAAA,EAAG,MAAA,CAAO,WAAW,QAAQ,CAAA,EAAA,CAAA;AACvE,EAAA,IAAA,CAAK,cAAc,UAAA,CAAW,cAAc,IAAI,CAAA,EAAG,MAAA,CAAO,WAAW,cAAc,CAAA,EAAA,CAAA;AACnF,EAAA,IAAA,CAAK,cAAc,UAAA,CAAW,UAAU,IAAI,MAAA,CAAO,MAAA,CAAO,WAAW,UAAU,CAAA;AAC/E,EAAA,IAAA,CAAK,cAAc,UAAA,CAAW,UAAU,IAAI,MAAA,CAAO,MAAA,CAAO,WAAW,UAAU,CAAA;AAC/E,EAAA,IAAA,CAAK,cAAc,UAAA,CAAW,aAAa,IAAI,CAAA,EAAG,MAAA,CAAO,WAAW,aAAa,CAAA,EAAA,CAAA;AAGjF,EAAA,IAAA,CAAK,cAAc,QAAA,CAAS,KAAK,IAAI,CAAA,EAAG,MAAA,CAAO,SAAS,KAAK,CAAA,EAAA,CAAA;AAC7D,EAAA,IAAA,CAAK,cAAc,QAAA,CAAS,MAAM,IAAI,CAAA,EAAG,MAAA,CAAO,SAAS,MAAM,CAAA,EAAA,CAAA;AAC/D,EAAA,IAAA,CAAK,cAAc,QAAA,CAAS,WAAW,IAAI,CAAA,EAAG,MAAA,CAAO,SAAS,WAAW,CAAA,EAAA,CAAA;AACzE,EAAA,IAAA,CAAK,cAAc,QAAA,CAAS,YAAY,IAAI,CAAA,EAAG,MAAA,CAAO,SAAS,YAAY,CAAA,EAAA,CAAA;AAG3E,EAAA,IAAA,CAAK,cAAc,MAAA,CAAO,IAAI,IAAI,CAAA,EAAG,MAAA,CAAO,OAAO,IAAI,CAAA,EAAA,CAAA;AACvD,EAAA,IAAA,CAAK,cAAc,MAAA,CAAO,QAAQ,IAAI,CAAA,EAAG,MAAA,CAAO,OAAO,QAAQ,CAAA,EAAA,CAAA;AAG/D,EAAA,IAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,MAAM,CAAA,GAAI,OAAO,OAAA,CAAQ,MAAA;AACpD,EAAA,IAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,MAAM,CAAA,GAAI,OAAO,OAAA,CAAQ,MAAA;AAGpD,EAAA,IAAA,CAAK,cAAc,UAAA,CAAW,QAAQ,IAAI,CAAA,EAAG,MAAA,CAAO,WAAW,QAAQ,CAAA,CAAA,CAAA;AAEvE,EAAA,OAAO,IAAA;AACT;AAUO,SAAS,SAAA,CAAU,OAAA,EAAiB,OAAA,GAAmB,QAAA,CAAS,eAAA,EAAyB;AAC9F,EAAA,OAAO,iBAAiB,OAAO,CAAA,CAAE,gBAAA,CAAiB,OAAO,EAAE,IAAA,EAAK;AAClE;;;ACxIA,IAAM,QAAA,GAAW,gBAAA;AACjB,IAAM,aAAA,GAAgB,0BAAA;AAOf,IAAM,gBAAA,GAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,CAAA;AAqBzB,SAAS,uBAAA,GAAgC;AAC9C,EAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACrC,EAAA,IAAI,QAAA,CAAS,cAAA,CAAe,aAAa,CAAA,EAAG;AAE5C,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAC5C,EAAA,KAAA,CAAM,EAAA,GAAK,aAAA;AACX,EAAA,KAAA,CAAM,WAAA,GAAc,gBAAA;AACpB,EAAA,QAAA,CAAS,IAAA,CAAK,YAAY,KAAK,CAAA;AACjC;AAMO,IAAM,UAAA,GAAa,CAAA;;AAAA,q6rBAAA;AAI1B,IAAI,QAAA,GAAW,KAAA;AAUR,SAAS,YAAA,CAAa,SAAgC,QAAA,EAAU;AAErE,EAAA,IAAI,MAAA,KAAW,YAAY,QAAA,EAAU;AACrC,EAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AAGrC,EAAA,MAAM,aAAA,GAAgB,MAAA,KAAW,QAAA,GAC7B,QAAA,CAAS,cAAA,CAAe,QAAQ,CAAA,GAC/B,MAAA,CAAsB,aAAA,CAAc,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAE,CAAA;AAEvD,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,IAAI,MAAA,KAAW,UAAU,QAAA,GAAW,IAAA;AACpC,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAC5C,EAAA,KAAA,CAAM,EAAA,GAAK,QAAA;AACX,EAAA,KAAA,CAAM,WAAA,GAAc,UAAA;AAEpB,EAAA,IAAI,WAAW,QAAA,EAAU;AACvB,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,KAAK,CAAA;AAC/B,IAAA,QAAA,GAAW,IAAA;AAAA,EACb,CAAA,MAAO;AAEL,IAAC,MAAA,CAAsB,QAAQ,KAAK,CAAA;AAAA,EACtC;AACF;ACkCO,SAAS,UAAA,CAAW;AAAA,EACzB,SAAA;AAAA,EACA,MAAA,GAAS,EAAA;AAAA,EACT,SAAA;AAAA,EACA,OAAA,GAAU,UAAA;AAAA,EACV,MAAA,EAAQ,UAAA;AAAA,EACR,WAAA,GAAc,KAAA;AAAA,EACd,YAAA,EAAc,gBAAA;AAAA,EACd,SAAA,EAAW,aAAA;AAAA,EACX,cAAA,EAAgB,kBAAA;AAAA,EAChB,OAAA;AAAA,EACA,UAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,gBAAA;AAAA,EACA,OAAA;AAAA,EACA,aAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAAoB;AAElB,EAAA,MAAM,yBAAA,GAA4B,oBAAoB,MAAA,CAAO,6BAAA;AAC7D,EAAA,MAAM,qBAAA,GAAwB,gBAAgB,MAAA,CAAO,qBAAA;AACrD,EAAA,MAAM,sBAAA,GAAyB,iBAAiB,MAAA,CAAO,qBAAA;AAGvD,EAAA,MAAM;AAAA,IACJ,MAAA;AAAA,IACA,SAAA,EAAW,eAAA;AAAA,IACX,SAAA,EAAW,gBAAA;AAAA,IACX,iBAAA;AAAA,IACA,qBAAA;AAAA,IACA,oBAAA;AAAA,IACA,YAAA,EAAc,mBAAA;AAAA,IACd,6BAAA;AAAA,IACA,cAAA,EAAgB,qBAAA;AAAA,IAChB,aAAA,EAAe,oBAAA;AAAA,IACf,kBAAA;AAAA,IACA;AAAA,MACE,eAAA,CAAgB;AAAA,IAClB,SAAA;AAAA,IACA,MAAA;AAAA,IACA,UAAA;AAAA,IACA,IAAA,EAAM,WAAA;AAAA,IACN;AAAA,GACD,CAAA;AAGD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIN,QAAAA;AAAA,IAClC,MAAO,OAAe,kBAAA,IAAgC;AAAA,GACxD;AAEA,EAAAG,UAAU,MAAM;AACd,IAAA,MAAM,UAAU,CAAC,CAAA,KAAa,aAAA,CAAe,CAAA,CAA0B,UAAU,EAAE,CAAA;AACnF,IAAA,MAAA,CAAO,gBAAA,CAAiB,sBAAsB,OAAO,CAAA;AACrD,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,oBAAA,EAAsB,OAAO,CAAA;AAAA,EACvE,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAIH,QAAAA;AAAA,IAC9C,MAAO,MAAA,CAAe;AAAA,GACxB;AAEA,EAAAG,UAAU,MAAM;AACd,IAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAAa,mBAAA,CAAqB,EAA0B,MAAM,CAAA;AACnF,IAAA,MAAA,CAAO,gBAAA,CAAiB,oBAAoB,OAAO,CAAA;AACnD,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,kBAAA,EAAoB,OAAO,CAAA;AAAA,EACrE,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,YAAY,aAAA,IAAiB,gBAAA;AACnC,EAAA,MAAM,cAAA,GAAiB,oBAAoB,kBAAA,IAAsB,qBAAA;AACjE,EAAA,MAAM,aAAA,GAAgB,oBAAA;AAGtB,EAAA,MAAM,eAAe,gBAAA,IAAoB,mBAAA;AAGzC,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIH,QAAAA,CAAmB,EAAE,CAAA;AAGvD,EAAA,MAAM,OAAA,GAAU,gBAAgB,MAAM,CAAA;AAGtC,EAAA,MAAM,oBAAA,GAAuBE,OAAuB,IAAI,CAAA;AACxD,EAAA,MAAM,oBAAA,GAAuBA,OAG3B,IAAI,CAAA;AACN,EAAA,MAAM,mBAAA,GAAsBA,OAO1B,IAAI,CAAA;AAGN,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIF,SAAS,MAAM;AACnD,IAAA,IAAI,OAAA,KAAY,YAAY,OAAO,KAAA;AACnC,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,cAAA,CAAe,OAAA,CAAQ,uBAAuB,CAAA;AAC7D,MAAA,IAAI,MAAA,KAAW,IAAA,EAAM,OAAO,MAAA,KAAW,MAAA;AAAA,IACzC,CAAA,CAAA,MAAQ;AAAA,IAAe;AACvB,IAAA,OAAO,IAAA;AAAA,EACT,CAAC,CAAA;AAED,EAAAG,UAAU,MAAM;AACd,IAAA,IAAI,YAAY,UAAA,EAAY;AAC5B,IAAA,IAAI;AAAE,MAAA,cAAA,CAAe,OAAA,CAAQ,uBAAA,EAAyB,MAAA,CAAO,WAAW,CAAC,CAAA;AAAA,IAAG,CAAA,CAAA,MACtE;AAAA,IAAe;AAAA,EACvB,CAAA,EAAG,CAAC,WAAA,EAAa,OAAO,CAAC,CAAA;AACzB,EAAA,MAAM,CAAC,oBAAA,EAAsB,uBAAuB,CAAA,GAAIH,SAAS,KAAK,CAAA;AACtE,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIA,SAAS,KAAK,CAAA;AAG1D,EAAA,MAAM,CAAC,kBAAA,EAAoB,qBAAqB,CAAA,GAAIA,SAAS,KAAK,CAAA;AAClE,EAAA,MAAM,CAAC,mBAAA,EAAqB,sBAAsB,CAAA,GAAIA,SAG5C,IAAI,CAAA;AAGd,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIA,SAGpC,IAAI,CAAA;AAGd,EAAA,MAAM;AAAA,IACJ,cAAA;AAAA,IACA,aAAA;AAAA,IACA,UAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,MACE,WAAA,CAAY;AAAA,IACd,SAAA;AAAA,IACA,MAAA;AAAA,IACA,cAAA,EAAgB,IAAA;AAAA,IAChB;AAAA,GACD,CAAA;AAGD,EAAA,MAAM,aAAA,GAAgB,gBAAA,CAAiB,EAAE,SAAA,EAAW,QAAQ,CAAA;AAG5D,EAAA,MAAM,CAAC,oBAAA,EAAsB,uBAAuB,CAAA,GAAIA,SAAS,KAAK,CAAA;AACtE,EAAA,MAAM,qBAAA,GAAwBE,OAAO,KAAK,CAAA;AAG1C,EAAA,MAAM,OAAO,OAAA,CAAQ;AAAA,IACnB,SAAA;AAAA,IACA,MAAA;AAAA,IACA,6BAAA;AAAA,IACA,cAAA;AAAA,IACA,aAAA;AAAA,IACA,SAAA;AAAA,IACA,mBAAA;AAAA,IACA,QAAA;AAAA,IACA,oBAAA,EAAsB,CAAC,UAAA,KAAe;AACpC,MAAA,iBAAA,CAAkB,UAAU,CAAA;AAAA,IAC9B,CAAA;AAAA,IACA,kBAAkB,MAAM;AAAA,IAAC,CAAA;AAAA,IACzB,eAAA,EAAiB,CAAC,KAAA,KAAU;AAC1B,MAAA,QAAQ,MAAM,IAAA;AAAM,QAClB,KAAK,SAAA;AACH,UAAA,IAAI,KAAA,CAAM,IAAA,IAAQ,KAAA,CAAM,KAAA,EAAO;AAC7B,YAAA,aAAA,CAAc,KAAA,CAAM,IAAA,EAAM,KAAA,CAAM,KAAK,CAAA;AAAA,UACvC;AACA,UAAA;AAAA,QACF,KAAK,cAAA;AACH,UAAA,IAAI,KAAA,CAAM,MAAA,IAAU,KAAA,CAAM,UAAA,EAAY;AACpC,YAAA,UAAA,CAAW,KAAA,CAAM,MAAA,EAAQ,KAAA,CAAM,UAAU,CAAA;AAAA,UAC3C;AACA,UAAA;AAAA,QACF,KAAK,OAAA;AACH,UAAA,WAAA,CAAY,GAAI,CAAA;AAChB,UAAA;AAAA,QACF,KAAK,iBAAA;AACH,UAAA,YAAA,EAAa;AACb,UAAA;AAAA;AACJ,IACF,CAAA;AAAA,IACA,YAAA,EAAc,qBAAA;AAAA,IACd,UAAA,EAAY,OAAO,KAAA,KAAU;AAC3B,MAAA,IAAI,MAAM,IAAA,KAAS,aAAA,IAAiB,KAAA,CAAM,QAAA,IAAY,MAAM,UAAA,EAAY;AAEtE,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,GAAS,MAAM,oBAAA,CAAqB,OAAA;AAAA,YACxC,KAAA,CAAM,QAAA;AAAA,YACL,KAAA,CAAM,aAAa;AAAC,WACvB;AAGA,UAAA,MAAM,SAAA,GAAY,MAAA;AAClB,UAAA,MAAM,UAAU,SAAA,EAAW,IAAA;AAC3B,UAAA,MAAM,gBAAA,GACJ,SAAS,QAAA,KAAa,IAAA,IACrB,OAAO,SAAA,EAAW,KAAA,KAAU,YAAY,SAAA,CAAU,KAAA,CAAM,SAAS,mBAAmB,CAAA,IACpF,OAAO,SAAA,EAAW,KAAA,KAAU,YAAY,SAAA,CAAU,KAAA,CAAM,SAAS,UAAU,CAAA;AAE9E,UAAA,IAAI,gBAAA,EAAkB;AACpB,YAAA,OAAA,CAAQ,IAAI,wEAAwE,CAAA;AACpF,YAAA;AAAA,UACF;AAGA,UAAA,IAAI,MAAA,IAAU,oBAAoB,OAAA,EAAS;AACzC,YAAA,MAAM,mBAAA,CAAoB,OAAA;AAAA,cACxB,KAAA,CAAM,UAAA;AAAA,cACN,KAAA,CAAM,QAAA;AAAA,cACN;AAAA,aACF;AAAA,UACF;AAAA,QACF,SAAS,CAAA,EAAG;AACV,UAAA,OAAA,CAAQ,KAAA,CAAM,6BAA6B,CAAC,CAAA;AAC5C,UAAA,IAAI,oBAAoB,OAAA,EAAS;AAC/B,YAAA,MAAM,mBAAA,CAAoB,OAAA;AAAA,cACxB,KAAA,CAAM,UAAA;AAAA,cACN,KAAA,CAAM,QAAA;AAAA,cACN,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,MAAA,CAAO,CAAC,CAAA;AAAE,aACrC;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAA;AAAA,IACA,wBAAwB,MAAM;AAC5B,MAAA,uBAAA,CAAwB,IAAI,CAAA;AAAA,IAC9B;AAAA,GACD,CAAA;AAGD,EAAA,MAAM,GAAA,GAAM,YAAA,CAAa,EAAE,UAAA,EAAY,QAAQ,CAAA;AAC/C,EAAA,MAAM,MAAA,GAASA,OAAO,GAAG,CAAA;AACzB,EAAA,MAAA,CAAO,OAAA,GAAU,GAAA;AACjB,EAAA,MAAM,aAAA,GAAgBA,OAAO,KAAK,CAAA;AAIlC,EAAAC,UAAU,MAAM;AACd,IAAA,OAAA,CAAQ,IAAI,+BAAA,EAAiC,IAAA,CAAK,SAAA,EAAW,aAAA,EAAe,cAAc,OAAO,CAAA;AACjG,IAAA,IAAI,aAAA,CAAc,OAAA,IAAW,CAAC,IAAA,CAAK,SAAA,EAAW;AAE5C,MAAA,MAAM,WAAA,GAAc,CAAC,GAAG,IAAA,CAAK,QAAQ,CAAA,CAAE,OAAA,EAAQ,CAAE,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,KAAK,CAAA;AAClE,MAAA,OAAA,CAAQ,IAAI,8BAAA,EAAgC,WAAA,EAAa,SAAS,SAAA,CAAU,CAAA,EAAG,EAAE,CAAC,CAAA;AAClF,MAAA,IAAI,aAAa,OAAA,EAAS;AAExB,QAAA,MAAM,cAAc,WAAA,CAAY,OAAA,CAC7B,QAAQ,OAAA,EAAS,EAAE,EACnB,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA,CACjB,OAAA,CAAQ,YAAY,EAAE,CAAA,CACtB,QAAQ,wBAAA,EAA0B,IAAI,EACtC,IAAA,EAAK;AACR,QAAA,IAAI,WAAA,EAAa;AACf,UAAA,OAAA,CAAQ,IAAI,sBAAA,EAAwB,WAAA,CAAY,SAAA,CAAU,CAAA,EAAG,EAAE,CAAC,CAAA;AAChE,UAAA,MAAA,CAAO,OAAA,CAAQ,MAAM,WAAW,CAAA;AAAA,QAClC;AAAA,MACF;AAAA,IACF;AACA,IAAA,aAAA,CAAc,UAAU,IAAA,CAAK,SAAA;AAAA,EAC/B,GAAG,CAAC,IAAA,CAAK,SAAA,EAAW,IAAA,CAAK,QAAQ,CAAC,CAAA;AAIlC,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,mBAAmB,MAAA,GAAS,CAAA,IAAK,IAAA,CAAK,gBAAA,CAAiB,WAAW,CAAA,EAAG;AACvE,MAAA,IAAA,CAAK,oBAAoB,kBAAkB,CAAA;AAAA,IAC7C;AAAA,EACF,CAAA,EAAG,CAAC,kBAAkB,CAAC,CAAA;AAGvB,EAAAA,UAAU,MAAM;AACd,IAAA,IACE,oBAAA,IACA,IAAA,CAAK,cAAA,IACL,CAAC,sBAAsB,OAAA,EACvB;AACA,MAAA,qBAAA,CAAsB,OAAA,GAAU,IAAA;AAChC,MAAA,OAAA,CAAQ,GAAA;AAAA,QACN,+CAAA;AAAA,QACA,IAAA,CAAK;AAAA,OACP;AACA,MAAA,aAAA,CACG,iCAAiC,IAAA,CAAK,cAAc,CAAA,CACpD,IAAA,CAAK,CAAC,eAAA,KAAoB;AACzB,QAAA,IAAI,eAAA,CAAgB,SAAS,CAAA,EAAG;AAC9B,UAAA,IAAA,CAAK,aAAa,eAAe,CAAA;AAAA,QACnC;AAAA,MACF,CAAC,CAAA;AAAA,IACL;AAAA,EACF,GAAG,CAAC,oBAAA,EAAsB,KAAK,cAAA,EAAgB,aAAA,EAAe,IAAI,CAAC,CAAA;AAGnE,EAAA,MAAM,kBAAkB,WAAA,CAAY;AAAA,IAClC,SAAA;AAAA,IACA,MAAA;AAAA,IACA,gBAAgB,IAAA,CAAK,cAAA;AAAA,IACrB,eAAe,IAAA,CAAK,aAAA;AAAA,IACpB,SAAA,EAAW,CAAC,OAAA,KAAY;AACtB,MAAA,IAAA,CAAK,YAAA,CAAa;AAAA,QAChB,GAAG,IAAA,CAAK,QAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAI,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA;AAAA,UACrB,OAAA;AAAA,UACA,KAAA,EAAO,IAAA;AAAA,UACP,SAAA,sBAAe,IAAA;AAAK;AACtB,OACD,CAAA;AAAA,IACH;AAAA,GACD,CAAA;AAGD,EAAA,MAAM,EAAE,iBAAA,EAAkB,GAAI,UAAA,CAAW;AAAA,IACvC,cAAc,YAAY;AACxB,MAAA,iBAAA,CAAkB,IAAI,CAAA;AACtB,MAAA,MAAM,KAAA,GAAQ,MAAM,aAAA,CAAc,iBAAA,EAAkB;AACpD,MAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,QAAA,MAAM,UAAA,GAAa,MAAM,CAAC,CAAA;AAC1B,QAAA,MAAM,eAAA,GAAkB,MAAM,aAAA,CAAc,uBAAA,CAAwB,WAAW,EAAE,CAAA;AACjF,QAAA,IAAI,eAAA,CAAgB,SAAS,CAAA,EAAG;AAC9B,UAAA,IAAA,CAAK,aAAa,eAAe,CAAA;AACjC,UAAA,IAAA,CAAK,iBAAA,CAAkB,WAAW,EAAE,CAAA;AAAA,QACtC;AAAA,MACF;AAAA,IACF,CAAA;AAAA,IACA,SAAS,MAAM;AACb,MAAA,iBAAA,CAAkB,KAAK,CAAA;AACvB,MAAA,IAAA,CAAK,aAAA,EAAc;AAAA,IACrB;AAAA,GACD,CAAA;AAED,EAAA,oBAAA,CAAqB,OAAA,GAAU,iBAAA;AAC/B,EAAA,mBAAA,CAAoB,UAAU,IAAA,CAAK,gBAAA;AAGnC,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,MAAA,OAAA,IAAU;AAAA,IACZ;AAAA,EACF,CAAA,EAAG,CAAC,eAAA,EAAiB,OAAO,CAAC,CAAA;AAG7B,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,mBAAmB,UAAA,EAAY;AAClC,MAAA,MAAM,QAAA,GAA6B,CAAC,IAAA,KAAS;AAC3C,QAAA,IAAI,CAAC,KAAK,KAAA,EAAO;AACf,UAAA,OAAA,CAAQ,MAAM,oCAAoC,CAAA;AAClD,UAAA;AAAA,QACF;AACA,QAAA,MAAA,CAAO,IAAA,GAAO,YAAY,IAAI,CAAA;AAAA,MAChC,CAAA;AACA,MAAA,UAAA,CAAW,QAAQ,CAAA;AAAA,IACrB;AAAA,EACF,CAAA,EAAG,CAAC,eAAA,EAAiB,UAAU,CAAC,CAAA;AAGhC,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,6BAA6B,eAAA,EAAiB;AAEnD,IAAA,IAAI,SAAA,GAAY,KAAA;AAEhB,IAAA,MAAM,WAAW,YAAY;AAC3B,MAAA,IAAI;AACF,QAAA,MAAM,KAAA,GAAQ,MAAM,yBAAA,EAA0B;AAC9C,QAAA,IAAI,CAAC,aAAa,KAAA,EAAO;AACvB,UAAA,MAAA,CAAO,IAAA,GAAO,UAAA,EAAY,EAAE,KAAA,EAAO,CAAA;AAAA,QACrC;AAAA,MACF,SAAS,CAAA,EAAG;AACV,QAAA,OAAA,CAAQ,KAAA,CAAM,mCAAmC,CAAC,CAAA;AAAA,MACpD;AAAA,IACF,CAAA;AAGA,IAAA,QAAA,EAAS;AAGT,IAAA,MAAM,aAAA,GAAgB,MAAM,QAAA,EAAS;AACrC,IAAA,MAAA,CAAO,gBAAA,CAAiB,6BAA6B,aAAa,CAAA;AAElE,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AACZ,MAAA,MAAA,CAAO,mBAAA,CAAoB,6BAA6B,aAAa,CAAA;AAAA,IACvE,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,yBAAA,EAA2B,eAAe,CAAC,CAAA;AAG/C,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACnC,IAAA,IAAI,WAAW,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,CAAE,SAAS,CAAA,EAAG;AAC9C,MAAC,OAAe,mBAAA,GAAsB,OAAA;AAAA,IACxC,CAAA,MAAO;AACL,MAAC,OAAe,mBAAA,GAAsB,MAAA;AAAA,IACxC;AAAA,EACF,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAGZ,EAAA,MAAM,yBAAA,GAA4BF,WAAAA;AAAA,IAChC,CAAC,WAAA,KAA0C;AACzC,MAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC9B,QAAA,sBAAA,CAAuB,EAAE,WAAA,EAAa,OAAA,EAAS,CAAA;AAAA,MACjD,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,IACA;AAAC,GACH;AAEA,EAAA,MAAM,qBAAA,GAAwBA,WAAAA;AAAA,IAC5B,CAAC,QAAA,KAAsC;AACrC,MAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AAEtC,QAAA,IAAA,CAAK,UAAA,CAAW,aAAa,QAAQ,CAAA;AAErC,QAAA,kBAAA,CAAmB,EAAE,OAAA,EAAS,MAAA,EAAQ,CAAA;AAAA,MACxC,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,IACA,CAAC,IAAI;AAAA,GACP;AAEA,EAAA,MAAM,qBAAA,GAAwBA,WAAAA;AAAA,IAC5B,CAAC,MAAc,QAAA,KAAqB;AAElC,MAAA,IAAI,IAAA,IAAQ,QAAA,IAAY,IAAA,KAAS,EAAA,EAAI;AACnC,QAAA,qBAAA,CAAsB,KAAK,CAAA;AAAA,MAC7B;AAAA,IACF,CAAA;AAAA,IACA;AAAC,GACH;AAGA,EAAAE,UAAU,MAAM;AACd,IAAC,OAAe,wBAAA,GAA2B;AAAA,MACzC,cAAA,EAAgB,yBAAA;AAAA,MAChB,UAAA,EAAY,qBAAA;AAAA,MACZ,UAAA,EAAY;AAAA,KACd;AACA,IAAA,OAAO,MAAM;AACX,MAAA,OAAQ,MAAA,CAAe,wBAAA;AAAA,IACzB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,yBAAA,EAA2B,qBAAA,EAAuB,qBAAqB,CAAC,CAAA;AAG5E,EAAAA,UAAU,MAAM;AACd,IAAA,IACE,iBAAA,IACA,CAAC,eAAA,IACD,CAAC,UAAU,WAAA,EACX;AACA,MAAA,OAAO,yBAAyB,CAAA,CAC7B,IAAA,CAAK,CAAC,EAAE,sBAAqB,KAAM;AAClC,QAAA,YAAA,CAAa,CAAC,IAAA,MAAU;AAAA,UACtB,GAAG,IAAA;AAAA,UACH,WAAA,EAAa,oBAAA,CAAqB,EAAE,SAAA,EAAW,QAAQ;AAAA,SACzD,CAAE,CAAA;AACF,QAAA,OAAA,CAAQ,IAAI,qCAAqC,CAAA;AAAA,MACnD,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,GAAA,KAAQ;AACd,QAAA,OAAA,CAAQ,IAAA,CAAK,sCAAsC,GAAG,CAAA;AAAA,MACxD,CAAC,CAAA;AAAA,IACL;AAAA,EACF,GAAG,CAAC,iBAAA,EAAmB,iBAAiB,SAAA,EAAW,MAAA,EAAQ,SAAS,CAAC,CAAA;AAGrE,EAAAA,UAAU,MAAM;AACd,IAAA,IACE,iBAAA,IACA,CAAC,eAAA,IACD,CAAC,UAAU,yBAAA,EACX;AACA,MAAA,OAAO,yBAAyB,CAAA,CAC7B,IAAA,CAAK,CAAC,EAAE,mCAAkC,KAAM;AAC/C,QAAA,YAAA,CAAa,CAAC,IAAA,MAAU;AAAA,UACtB,GAAG,IAAA;AAAA,UACH,yBAAA,EAA2B,iCAAA,CAAkC,EAAE,SAAA,EAAW,QAAQ;AAAA,SACpF,CAAE,CAAA;AACF,QAAA,OAAA,CAAQ,IAAI,mDAAmD,CAAA;AAAA,MACjE,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,GAAA,KAAQ;AACd,QAAA,OAAA,CAAQ,IAAA,CAAK,oDAAoD,GAAG,CAAA;AAAA,MACtE,CAAC,CAAA;AAAA,IACL;AAAA,EACF,GAAG,CAAC,iBAAA,EAAmB,iBAAiB,SAAA,EAAW,MAAA,EAAQ,SAAS,CAAC,CAAA;AAGrE,EAAAA,UAAU,MAAM;AACd,IAAA,IACE,qBAAA,IACA,oBAAA,CAAqB,MAAA,GAAS,CAAA,IAC9B,CAAC,eAAA,EACD;AACA,MAAA,OAAO,iBAAiB,CAAA,CACrB,IAAA,CAAK,CAAC,EAAE,0BAAyB,KAAM;AACtC,QAAA,YAAA,CAAa,CAAC,IAAA,MAAU;AAAA,UACtB,GAAG,IAAA;AAAA,UACH,cAAA,EAAgB,wBAAA,CAAyB,oBAAA,EAAsB,QAAQ;AAAA,SACzE,CAAE,CAAA;AACF,QAAA,OAAA,CAAQ,GAAA;AAAA,UACN,CAAA,4CAAA,EAA+C,qBAAqB,MAAM,CAAA,OAAA;AAAA,SAC5E;AAAA,MACF,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,GAAA,KAAQ;AACd,QAAA,OAAA,CAAQ,IAAA,CAAK,yCAAyC,GAAG,CAAA;AAAA,MAC3D,CAAC,CAAA;AAAA,IACL;AAAA,EACF,GAAG,CAAC,qBAAA,EAAuB,oBAAA,EAAsB,eAAA,EAAiB,QAAQ,CAAC,CAAA;AAG3E,EAAA,MAAM,WAAA,GAAca,OAAAA,CAAQ,OAAO,EAAE,GAAG,SAAA,EAAW,GAAG,KAAA,EAAM,CAAA,EAAI,CAAC,SAAA,EAAW,KAAK,CAAC,CAAA;AAGlF,EAAAb,UAAU,MAAM;AACd,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,WAAW,CAAA,CAAE,SAAS,CAAA,EAAG;AACvC,MAAA,MAAA,CAAO,IAAA,GAAO,iBAAiB,WAAW,CAAA;AAAA,IAC5C;AAAA,EACF,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAGhB,EAAA,MAAM,UAAA,GAAa,CAAC,OAAA,KAAoB;AACtC,IAAA,IAAI,CAAC,OAAA,CAAQ,IAAA,EAAK,EAAG;AACrB,IAAA,cAAA,CAAe,KAAK,CAAA;AAGpB,IAAA,IAAI,eAAA,EAAiB;AAEnB,MAAA,IAAA,CAAK,UAAA,CAAW,QAAQ,OAAO,CAAA;AAC/B,MAAA,eAAA,CAAgB,QAAQ,OAAO,CAAA;AAC/B,MAAA,kBAAA,CAAmB,IAAI,CAAA;AACvB,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,YAAY,OAAO,CAAA;AAAA,EAC1B,CAAA;AAEA,EAAA,MAAM,aAAa,MAAM;AAEvB,IAAA,IAAA,CAAK,cAAA,EAAe;AAGpB,IAAA,IAAI,qBAAqB,kBAAA,EAAoB;AAC3C,MAAA,OAAO,yBAAyB,CAAA,CAC7B,IAAA,CAAK,CAAC,EAAE,sBAAqB,KAAM;AAClC,QAAA,oBAAA,EAAqB;AAErB,QAAA,IAAI,eAAA,EAAiB;AACnB,UAAA,eAAA,CAAgB,MAAA,EAAO;AACvB,UAAA,kBAAA,CAAmB,IAAI,CAAA;AAAA,QACzB;AAAA,MACF,CAAC,CAAA,CACA,KAAA,CAAM,MAAM;AAAA,MAAC,CAAC,CAAA;AACjB,MAAA,qBAAA,CAAsB,KAAK,CAAA;AAAA,IAC7B,CAAA,MAAO;AAEL,MAAA,IAAI,eAAA,EAAiB;AACnB,QAAA,eAAA,CAAgB,MAAA,EAAO;AACvB,QAAA,kBAAA,CAAmB,IAAI,CAAA;AAAA,MACzB;AAAA,IACF;AAGA,IAAA,IAAI,mBAAA,EAAqB;AACvB,MAAA,mBAAA,CAAoB,QAAQ,KAAK,CAAA;AACjC,MAAA,sBAAA,CAAuB,IAAI,CAAA;AAAA,IAC7B;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,gBAAgB,MAAM;AAC1B,IAAA,IAAA,CAAK,aAAA,EAAc;AACnB,IAAA,uBAAA,CAAwB,KAAK,CAAA;AAAA,EAC/B,CAAA;AAEA,EAAA,MAAM,sBAAsB,MAAM;AAChC,IAAA,uBAAA,CAAwB,CAAC,oBAAoB,CAAA;AAC7C,IAAA,IAAI,CAAC,oBAAA,EAAsB;AACzB,MAAA,aAAA,CAAc,iBAAA,EAAkB;AAAA,IAClC;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,wBAAA,GAA2B,OAAO,MAAA,KAAmB;AACzD,IAAA,MAAM,eAAA,GAAkB,MAAM,aAAA,CAAc,uBAAA,CAAwB,MAAM,CAAA;AAC1E,IAAA,IAAI,eAAA,CAAgB,SAAS,CAAA,EAAG;AAC9B,MAAA,IAAA,CAAK,aAAa,eAAe,CAAA;AACjC,MAAA,IAAA,CAAK,kBAAkB,MAAM,CAAA;AAAA,IAC/B,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,aAAA,EAAc;AAAA,IACrB;AACA,IAAA,uBAAA,CAAwB,KAAK,CAAA;AAAA,EAC/B,CAAA;AAEA,EAAA,MAAM,8BAA8B,MAAM;AACxC,IAAA,uBAAA,CAAwB,KAAK,CAAA;AAAA,EAC/B,CAAA;AAEA,EAAA,MAAM,qBAAqB,YAAY;AACrC,IAAA,MAAM,gBAAgB,YAAA,EAAa;AAAA,EACrC,CAAA;AAGA,EAAA,MAAM,iBAAA,GAAoB,OAAO,UAAA,EAAoB,QAAA,KAAsB;AAEzE,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,eAAA,CAAgB,IAAA,CAAK,CAAC,OAAO,EAAA,CAAG,EAAA,KAAO,UAAU,CAAA,IAClE,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAC,CAAA,KAAM,CAAA,CAAE,SAAA,IAAa,EAAE,CAAA,CAAE,IAAA,CAAK,CAAC,EAAA,KAAO,EAAA,CAAG,EAAA,KAAO,UAAU,CAAA;AAEtF,IAAA,IAAI,CAAC,QAAA,EAAU;AAEf,IAAA,MAAM,YAAA,GAAe,CAAC,QAAA,CAAS,mBAAA;AAE/B,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IAAA,CAAK,oBAAA,CAAqB,YAAY,WAAW,CAAA;AAEjD,MAAA,IAAI,YAAA,EAAc;AAEhB,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,GAAS,MAAM,oBAAA,CAAqB,OAAA;AAAA,YACxC,QAAA,CAAS,IAAA;AAAA,YACR,QAAA,CAAS,aAAa;AAAC,WAC1B;AAEA,UAAA,MAAM,SAAA,GAAY,MAAA;AAClB,UAAA,MAAM,UAAU,SAAA,EAAW,IAAA;AAC3B,UAAA,MAAM,gBAAA,GACJ,SAAS,QAAA,KAAa,IAAA,IACrB,OAAO,SAAA,EAAW,KAAA,KAAU,YAAY,SAAA,CAAU,KAAA,CAAM,SAAS,mBAAmB,CAAA,IACpF,OAAO,SAAA,EAAW,KAAA,KAAU,YAAY,SAAA,CAAU,KAAA,CAAM,SAAS,UAAU,CAAA;AAE9E,UAAA,IAAI,gBAAA,EAAkB;AACpB,YAAA,OAAA,CAAQ,IAAI,wDAAwD,CAAA;AACpE,YAAA;AAAA,UACF;AAEA,UAAA,IAAI,MAAA,IAAU,oBAAoB,OAAA,EAAS;AACzC,YAAA,MAAM,mBAAA,CAAoB,OAAA;AAAA,cACxB,UAAA;AAAA,cACA,QAAA,CAAS,IAAA;AAAA,cACT;AAAA,aACF;AAAA,UACF;AAAA,QACF,SAAS,CAAA,EAAG;AACV,UAAA,OAAA,CAAQ,KAAA,CAAM,2CAA2C,CAAC,CAAA;AAC1D,UAAA,IAAI,oBAAoB,OAAA,EAAS;AAC/B,YAAA,MAAM,mBAAA,CAAoB,OAAA;AAAA,cACxB,UAAA;AAAA,cACA,QAAA,CAAS,IAAA;AAAA,cACT,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,MAAA,CAAO,CAAC,CAAA;AAAE,aACrC;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAA,MAAO;AAEL,QAAA,IAAI,oBAAoB,OAAA,EAAS;AAC/B,UAAA,MAAM,mBAAA,CAAoB,OAAA;AAAA,YACxB,UAAA;AAAA,YACA,QAAA,CAAS,IAAA;AAAA,YACT,EAAE,gBAAA,EAAkB,IAAA,EAAM,gBAAgB,QAAA,CAAS,SAAA,IAAa,EAAC;AAAE,WACrE;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,oBAAA,CAAqB,YAAY,QAAQ,CAAA;AAC9C,MAAA,IAAI,oBAAoB,OAAA,EAAS;AAC/B,QAAA,MAAM,mBAAA,CAAoB,OAAA;AAAA,UACxB,UAAA;AAAA,UACA,QAAA,CAAS,IAAA;AAAA,UACT,EAAE,MAAA,EAAQ,QAAA,EAAU,KAAA,EAAO,8CAAA;AAA+C,SAC5E;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAA;AAGA,EAAA,MAAM,0BAAA,GAA6BD,MAAAA,CAAkD,EAAE,CAAA;AAGvF,EAAAC,UAAU,MAAM;AACd,IAAA,MAAM,UAAA,GAAa,MAAM,cAAA,CAAe,KAAK,CAAA;AAC7C,IAAA,MAAM,WAAA,GAAc,MAAM,cAAA,CAAe,IAAI,CAAA;AAC7C,IAAA,MAAM,oBAAA,GAAuB,CAAC,CAAA,KAAa;AACzC,MAAA,MAAM,UAAW,CAAA,CAAkB,MAAA;AACnC,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC1B,QAAA,0BAAA,CAA2B,OAAA,GAAU,OAAA;AACrC,QAAA,IAAA,CAAK,oBAAoB,OAAO,CAAA;AAAA,MAClC;AAAA,IACF,CAAA;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,aAAa,UAAU,CAAA;AAC/C,IAAA,MAAA,CAAO,gBAAA,CAAiB,cAAc,WAAW,CAAA;AACjD,IAAA,MAAA,CAAO,gBAAA,CAAiB,4BAA4B,oBAAoB,CAAA;AAGxE,IAAA,MAAM,UAAW,MAAA,CAAe,wBAAA;AAChC,IAAA,IAAI,MAAM,OAAA,CAAQ,OAAO,CAAA,IAAK,OAAA,CAAQ,SAAS,CAAA,EAAG;AAChD,MAAA,0BAAA,CAA2B,OAAA,GAAU,OAAA;AACrC,MAAA,IAAA,CAAK,oBAAoB,OAAO,CAAA;AAAA,IAClC;AAEA,IAAA,OAAO,MAAM;AACX,MAAA,MAAA,CAAO,mBAAA,CAAoB,aAAa,UAAU,CAAA;AAClD,MAAA,MAAA,CAAO,mBAAA,CAAoB,cAAc,WAAW,CAAA;AACpD,MAAA,MAAA,CAAO,mBAAA,CAAoB,4BAA4B,oBAAoB,CAAA;AAAA,IAC7E,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,oBAAoB,MAAM;AAC9B,IAAA,cAAA,CAAe,CAAC,WAAW,CAAA;AAAA,EAC7B,CAAA;AAGA,EAAA,MAAM,mBAAA,GAAsB,sBAC1BI,IAAAA,CAAAC,UAAA,EACE,QAAA,EAAA;AAAA,oBAAAF,GAAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACC,cAAA;AAAA,QACA,oBAAA;AAAA,QACA,SAAA,EAAW,aAAA;AAAA,QACX,eAAA,EAAiB,mBAAA;AAAA,QACjB,cAAc,OAAA,KAAY,UAAA;AAAA,QAC1B,gBAAA,EAAkB,MAAM,cAAA,CAAe,IAAI;AAAA;AAAA,KAC7C;AAAA,oBAEAA,GAAAA,CAACW,eAAAA,EAAA,EACE,QAAA,EAAA,oBAAA,IAAwB,kCACvBX,GAAAA;AAAA,MAAC,gBAAA;AAAA,MAAA;AAAA,QACC,eAAe,aAAA,CAAc,aAAA;AAAA,QAC7B,uBAAuB,IAAA,CAAK,cAAA;AAAA,QAC5B,QAAA,EAAU,wBAAA;AAAA,QACV,OAAA,EAAS;AAAA;AAAA,KACX,EAEJ,CAAA;AAAA,oBAEAA,GAAAA,CAACW,eAAAA,EAAA,EACE,4CACCX,GAAAA;AAAA,MAAC,aAAA;AAAA,MAAA;AAAA,QACC,QAAA,EAAU,cAAA;AAAA,QACV,MAAA,EAAQ;AAAA;AAAA,KACV,EAEJ,CAAA;AAAA,oBAEAA,GAAAA,CAACW,eAAAA,EAAA,EACG,gBAAK,QAAA,CAAS,MAAA,GAAS,CAAA,IAAK,aAAA,CAAc,oBAAoB,mBAAA,qBAC9DV,IAAAA,CAAC,iBAAA,EAAA,EAAkB,KAAK,oBAAA,EACtB,QAAA,EAAA;AAAA,sBAAAD,GAAAA;AAAA,QAAC,WAAA;AAAA,QAAA;AAAA,UACC,UAAU,IAAA,CAAK,QAAA;AAAA,UACf,iBAAiB,IAAA,CAAK,eAAA;AAAA,UACtB,kBAAkB,aAAA,CAAc,gBAAA;AAAA,UAChC,cAAc,IAAA,CAAK,SAAA;AAAA,UACnB,aAAA,EAAe,sBAAA;AAAA,UACf,aAAA,EAAe;AAAA;AAAA,OACjB;AAAA,MAGC,uCACCA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBACb,QAAA,kBAAAA,GAAAA;AAAA,QAAC,sBAAA;AAAA,QAAA;AAAA,UACC,aAAa,mBAAA,CAAoB,WAAA;AAAA,UACjC,SAAS,MAAM;AACb,YAAA,qBAAA,CAAsB,IAAI,CAAA;AAC1B,YAAA,mBAAA,CAAoB,QAAQ,IAAI,CAAA;AAChC,YAAA,sBAAA,CAAuB,IAAI,CAAA;AAAA,UAC7B,CAAA;AAAA,UACA,QAAQ,MAAM;AACZ,YAAA,mBAAA,CAAoB,QAAQ,KAAK,CAAA;AACjC,YAAA,sBAAA,CAAuB,IAAI,CAAA;AAAA,UAC7B;AAAA;AAAA,OACF,EACF;AAAA,KAAA,EAGJ,CAAA,EAEJ,CAAA;AAAA,oBAEAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BAAA,EACZ,QAAA,EAAA;AAAA,MAAA,UAAA,oBACCA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6MAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,SAAI,SAAA,EAAU,2FAAA,EAA4F,OAAM,4BAAA,EAA6B,IAAA,EAAK,MAAA,EAAO,OAAA,EAAQ,WAAA,EAChK,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,iBAAA,EAAkB,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,CAAA,EAAE,IAAA,EAAK,MAAA,EAAO,cAAA,EAAe,aAAY,GAAA,EAAI,CAAA;AAAA,0BACjGA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mBAAkB,IAAA,EAAK,cAAA,EAAe,GAAE,6CAAA,EAA8C;AAAA,SAAA,EACxG,CAAA;AAAA,wBACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yDAAyD,QAAA,EAAA,UAAA,EAAW;AAAA,OAAA,EACtF,CAAA;AAAA,MAAA,CAEA,IAAA,CAAK,gBAAA,CAAiB,MAAA,GAAS,CAAA,IAAM,CAAC,IAAA,CAAK,SAAA,IAAa,0BAAA,CAA2B,OAAA,CAAQ,MAAA,GAAS,CAAA,qBACpGA,GAAAA;AAAA,QAAC,gBAAA;AAAA,QAAA;AAAA,UACC,SAAS,IAAA,CAAK,gBAAA,CAAiB,SAAS,CAAA,GAAI,IAAA,CAAK,mBAAmB,0BAAA,CAA2B,OAAA;AAAA,UAC/F,aAAA,EAAe,CAAC,MAAA,KAAW,UAAA,CAAW,OAAO,OAAO;AAAA;AAAA,OACtD;AAAA,sBAEFA,GAAAA,CAAC,cAAA,EAAA,EAAe,MAAA,EAAgB,CAAA;AAAA,sBAChCA,GAAAA;AAAA,QAAC,cAAA;AAAA,QAAA;AAAA,UACC,MAAA,EAAQ,UAAA;AAAA,UACR,MAAA,EAAQ,UAAA;AAAA,UACR,WAAA,EAAY,sBAAA;AAAA,UACZ,WAAW,IAAA,CAAK,SAAA;AAAA,UAChB,gBAAgB,kBAAA,IAAsB,CAAC,CAAC,eAAA,IAAmB,CAAC,CAAC,mBAAA;AAAA,UAC7D,WAAA,EAAa,CAAC,CAAC,eAAA;AAAA,UACf,SAAA,EAAU,uBAAA;AAAA,UACV,UAAA,EAAY;AAAA;AAAA;AACd,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAIF,EAAA,MAAM,cAAA,GAAiBU,OAAAA;AAAA,IACrB,MAAM,SAAA,GACF,CAAA,EAAG,UAAU;;AAAA;AAAA,EAAyB,SAAS,CAAA,CAAA,GAC/C,UAAA;AAAA,IACJ,CAAC,SAAS;AAAA,GACZ;AAGA,EAAA,uBACEV,GAAAA,CAAC,eAAA,EAAA,EAAgB,MAAA,EAAQ,cAAA,EAEvB,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAA,EAAmB,KAAA,EAAO,OAAA,EACvC,QAAA,kBAAAC,IAAAA;AAAA,IAAC,mBAAA;AAAA,IAAA;AAAA,MACC,MAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA,EAAW,eAAA;AAAA,MACX,OAAA;AAAA,MACA,YAAA;AAAA,MAGC,QAAA,EAAA;AAAA,QAAA,OAAA,KAAY,UAAA,oBACXA,IAAAA,CAAAC,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,0BAAAF,GAAAA;AAAA,YAAC,UAAA;AAAA,YAAA;AAAA,cACC,YAAY,CAAC,WAAA;AAAA,cACb,OAAA,EAAS;AAAA;AAAA,WACX;AAAA,UAEC,CAAC,WAAA,oBACAA,GAAAA,CAAC,WAAA,EAAA,EAAa,+BAAoB,EAAE;AAAA,SAAA,EAExC,CAAA;AAAA,QAID,YAAY,UAAA,oBACXA,GAAAA,CAAC,WAAA,EAAA,EAAa,+BAAoB,EAAE;AAAA;AAAA;AAAA,KAG1C,CAAA,EACF,CAAA;AAEJ;ACl7BA,SAAS,WAAA,GAAc;AACrB,EAAA,uBACEA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAM,4BAAA;AAAA,MACN,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MACL,MAAA,EAAO,cAAA;AAAA,MACP,WAAA,EAAY,GAAA;AAAA,MACZ,aAAA,EAAc,OAAA;AAAA,MACd,cAAA,EAAe,OAAA;AAAA,MAEf,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,gBAAA,EAAiB;AAAA;AAAA,GAC3B;AAEJ;AAEA,SAASY,aAAAA,GAAe;AACtB,EAAA,uBACEZ,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAM,4BAAA;AAAA,MACN,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MACL,MAAA,EAAO,cAAA;AAAA,MACP,WAAA,EAAY,GAAA;AAAA,MACZ,aAAA,EAAc,OAAA;AAAA,MACd,cAAA,EAAe,OAAA;AAAA,MAEf,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,eAAA,EAAgB;AAAA;AAAA,GAC1B;AAEJ;AAEA,SAAS,WAAA,GAAc;AACrB,EAAA,uBACEA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAM,4BAAA;AAAA,MACN,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MACL,MAAA,EAAO,cAAA;AAAA,MACP,WAAA,EAAY,GAAA;AAAA,MACZ,aAAA,EAAc,OAAA;AAAA,MACd,cAAA,EAAe,OAAA;AAAA,MAEf,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,gCAAA,EAAiC;AAAA;AAAA,GAC3C;AAEJ;AAEO,IAAM,mBAAA,GAAsBK,UAAAA;AAAA,EACjC,SAASQ,qBACP,EAAE,MAAA,EAAQ,UAAU,OAAA,EAAS,WAAA,EAAa,UAAA,EAAW,EACrD,GAAA,EACA;AACA,IAAA,MAAM,aAAa,MAAM;AACvB,MAAA,IAAI,CAAC,MAAA,EAAQ,uBAAOb,IAAC,WAAA,EAAA,EAAY,CAAA;AACjC,MAAA,IAAI,aAAa,OAAA,EAAS,uBAAOA,GAAAA,CAACY,eAAA,EAAa,CAAA;AAC/C,MAAA,uBAAOZ,IAAC,WAAA,EAAA,EAAY,CAAA;AAAA,IACtB,CAAA;AAEA,IAAA,uBACEA,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,OAAA;AAAA,QACA,WAAA;AAAA,QACA,SAAA,EAAW,CAAA,wCAAA,EAA2C,QAAQ,CAAA,CAAA,EAC5D,MAAA,GAAS,SAAS,EACpB,CAAA,CAAA,EAAI,UAAA,GAAa,UAAA,GAAa,EAAE,CAAA,CAAA;AAAA,QAChC,KAAA,EAAO;AAAA,UACL,MAAA,EAAQ,SAAS,YAAA,GAAe;AAAA,SAClC;AAAA,QACA,YAAA,EAAY,SAAS,eAAA,GAAkB,cAAA;AAAA,QACvC,KAAA,EAAO,SAAS,eAAA,GAAkB,cAAA;AAAA,QAEjC,QAAA,EAAA,UAAA;AAAW;AAAA,KACd;AAAA,EAEJ;AACF;AClFA,IAAM,cAAA,GAAiB,CAAA;AAEvB,IAAM,SAAA,GAAY,GAAA;AAElB,IAAM,SAAA,GAAY,GAAA;AASX,SAAS,gBAAA,CAAiB;AAAA,EAC/B,QAAA;AAAA,EACA,KAAA,EAAO,YAAA;AAAA,EACP,WAAA;AAAA,EACA;AACF,CAAA,EAA0B;AAExB,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIN,SAAS,MAAM;AACzC,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,cAAA,CAAe,OAAA,CAAQ,mBAAmB,CAAA;AACzD,MAAA,IAAI,MAAA,KAAW,IAAA,EAAM,OAAO,MAAA,KAAW,MAAA;AAAA,IACzC,CAAA,CAAA,MAAQ;AAAA,IAAmC;AAC3C,IAAA,OAAO,WAAA;AAAA,EACT,CAAC,CAAA;AAGD,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,SAAS,MAAM;AACrD,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,cAAA,CAAe,OAAA,CAAQ,oBAAoB,CAAA;AAC1D,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAM,MAAA,GAAS,QAAA,CAAS,MAAA,EAAQ,EAAE,CAAA;AAClC,QAAA,IAAI,MAAA,IAAU,SAAA,IAAa,MAAA,IAAU,SAAA,EAAW,OAAO,MAAA;AAAA,MACzD;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAAmC;AAC3C,IAAA,OAAO,YAAA;AAAA,EACT,CAAC,CAAA;AAED,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,SAAS,KAAK,CAAA;AAGlD,EAAAG,UAAU,MAAM;AACd,IAAA,IAAI;AAAE,MAAA,cAAA,CAAe,OAAA,CAAQ,mBAAA,EAAqB,MAAA,CAAO,MAAM,CAAC,CAAA;AAAA,IAAG,CAAA,CAAA,MAC7D;AAAA,IAAe;AAAA,EACvB,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAGX,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI;AAAE,MAAA,cAAA,CAAe,OAAA,CAAQ,oBAAA,EAAsB,MAAA,CAAO,YAAY,CAAC,CAAA;AAAA,IAAG,CAAA,CAAA,MACpE;AAAA,IAAe;AAAA,EACvB,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAGjB,EAAA,MAAM,UAAA,GAAaD,OAAuB,IAAI,CAAA;AAC9C,EAAA,MAAM,SAAA,GAAYA,OAA0B,IAAI,CAAA;AAGhD,EAAA,MAAM,aAAA,GAAgBA,OAAO,CAAC,CAAA;AAC9B,EAAA,MAAM,iBAAA,GAAoBA,OAAO,CAAC,CAAA;AAClC,EAAA,MAAM,aAAA,GAAgBA,OAAO,KAAK,CAAA;AAClC,EAAA,MAAM,YAAA,GAAeA,OAAO,YAAY,CAAA;AACxC,EAAA,MAAM,WAAA,GAAcA,OAAO,QAAQ,CAAA;AACnC,EAAA,WAAA,CAAY,OAAA,GAAU,QAAA;AAGtB,EAAAC,UAAU,MAAM;AACd,IAAA,YAAA,CAAa,OAAA,GAAU,YAAA;AAAA,EACzB,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAGjB,EAAAA,UAAU,MAAM;AACd,IAAA,QAAA,CAAS,gBAAgB,KAAA,CAAM,WAAA;AAAA,MAC7B,sBAAA;AAAA,MACA,GAAG,YAAY,CAAA,EAAA;AAAA,KACjB;AAAA,EACF,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAGjB,EAAAA,UAAU,MAAM;AACd,IAAA,MAAM,SAAA,GAAY,qBAAqB,QAAQ,CAAA,CAAA;AAC/C,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,QAAA,CAAS,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,SAAS,CAAA;AAAA,IACvC,CAAA,MAAO;AACL,MAAA,QAAA,CAAS,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,SAAS,CAAA;AAAA,IAC1C;AAEA,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,SAAS,CAAA;AAAA,IAC1C,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,QAAQ,CAAC,CAAA;AAGrB,EAAAA,UAAU,MAAM;AACd,IAAC,OAAe,WAAA,GAAc;AAAA,MAC5B,IAAA,EAAM,MAAM,SAAA,CAAU,IAAI,CAAA;AAAA,MAC1B,KAAA,EAAO,MAAM,SAAA,CAAU,KAAK,CAAA;AAAA,MAC5B,QAAQ,MAAM,SAAA,CAAU,CAAC,IAAA,KAAS,CAAC,IAAI;AAAA,KACzC;AAEA,IAAA,OAAO,MAAM;AACX,MAAA,OAAQ,MAAA,CAAe,WAAA;AAAA,IACzB,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAGL,EAAAA,UAAU,MAAM;AACd,IAAA,MAAM,UAAA,GAAa,MAAM,SAAA,CAAU,IAAI,CAAA;AACvC,IAAA,MAAM,WAAA,GAAc,MAAM,SAAA,CAAU,KAAK,CAAA;AACzC,IAAA,MAAA,CAAO,gBAAA,CAAiB,aAAa,UAAU,CAAA;AAC/C,IAAA,MAAA,CAAO,gBAAA,CAAiB,cAAc,WAAW,CAAA;AACjD,IAAA,OAAO,MAAM;AACX,MAAA,MAAA,CAAO,mBAAA,CAAoB,aAAa,UAAU,CAAA;AAClD,MAAA,MAAA,CAAO,mBAAA,CAAoB,cAAc,WAAW,CAAA;AAAA,IACtD,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAIL,EAAA,MAAM,eAAA,GAAkBF,WAAAA;AAAA,IACtB,CAAC,CAAA,KAAkB;AACjB,MAAA,MAAM,MAAA,GAAS,CAAA,CAAE,OAAA,GAAU,aAAA,CAAc,OAAA;AAIzC,MAAA,IAAI,CAAC,aAAA,CAAc,OAAA,IAAW,KAAK,GAAA,CAAI,MAAM,KAAK,cAAA,EAAgB;AAChE,QAAA,aAAA,CAAc,OAAA,GAAU,IAAA;AAGxB,QAAA,QAAA,CAAS,IAAA,CAAK,MAAM,UAAA,GAAa,MAAA;AACjC,QAAA,QAAA,CAAS,IAAA,CAAK,MAAM,MAAA,GAAS,YAAA;AAC7B,QAAA,QAAA,CAAS,IAAA,CAAK,MAAM,UAAA,GAAa,MAAA;AACjC,QAAA,QAAA,CAAS,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,uBAAuB,CAAA;AAGnD,QAAA,IAAI,WAAW,OAAA,EAAS;AACtB,UAAA,UAAA,CAAW,OAAA,CAAQ,MAAM,UAAA,GAAa,MAAA;AAAA,QACxC;AAGA,QAAA,IAAI,UAAU,OAAA,EAAS;AACrB,UAAA,SAAA,CAAU,OAAA,CAAQ,MAAM,UAAA,GAAa,MAAA;AAAA,QACvC;AAGA,QAAA,aAAA,CAAc,IAAI,CAAA;AAAA,MACpB;AAEA,MAAA,IAAI,CAAC,cAAc,OAAA,EAAS;AAI5B,MAAA,MAAM,UAAA,GAAa,WAAA,CAAY,OAAA,KAAY,OAAA,GAAU,CAAC,MAAA,GAAS,MAAA;AAC/D,MAAA,MAAM,WAAW,IAAA,CAAK,GAAA;AAAA,QACpB,SAAA;AAAA,QACA,IAAA,CAAK,GAAA,CAAI,SAAA,EAAW,iBAAA,CAAkB,UAAU,UAAU;AAAA,OAC5D;AAGA,MAAA,YAAA,CAAa,OAAA,GAAU,QAAA;AAGvB,MAAA,MAAM,EAAA,GAAK,GAAG,QAAQ,CAAA,EAAA,CAAA;AAGtB,MAAA,QAAA,CAAS,eAAA,CAAgB,KAAA,CAAM,WAAA,CAAY,sBAAA,EAAwB,EAAE,CAAA;AAGrE,MAAA,IAAI,WAAW,OAAA,EAAS;AACtB,QAAA,UAAA,CAAW,OAAA,CAAQ,MAAM,KAAA,GAAQ,EAAA;AAAA,MACnC;AAAA,IACF,CAAA;AAAA,IACA;AAAC;AAAA,GACH;AAEA,EAAA,MAAM,aAAA,GAAgBA,YAAY,MAAM;AACtC,IAAA,QAAA,CAAS,mBAAA,CAAoB,aAAa,eAAe,CAAA;AACzD,IAAA,QAAA,CAAS,mBAAA,CAAoB,WAAW,aAAa,CAAA;AAGrD,IAAA,QAAA,CAAS,IAAA,CAAK,MAAM,UAAA,GAAa,EAAA;AACjC,IAAA,QAAA,CAAS,IAAA,CAAK,MAAM,MAAA,GAAS,EAAA;AAC7B,IAAA,QAAA,CAAS,IAAA,CAAK,MAAM,UAAA,GAAa,EAAA;AACjC,IAAA,QAAA,CAAS,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,uBAAuB,CAAA;AACtD,IAAA,IAAI,WAAW,OAAA,EAAS;AACtB,MAAA,UAAA,CAAW,OAAA,CAAQ,MAAM,UAAA,GAAa,EAAA;AAAA,IACxC;AACA,IAAA,IAAI,UAAU,OAAA,EAAS;AACrB,MAAA,SAAA,CAAU,OAAA,CAAQ,MAAM,UAAA,GAAa,EAAA;AAAA,IACvC;AAEA,IAAA,IAAI,cAAc,OAAA,EAAS;AAEzB,MAAA,eAAA,CAAgB,aAAa,OAAO,CAAA;AACpC,MAAA,aAAA,CAAc,KAAK,CAAA;AAAA,IACrB,CAAA,MAAO;AAEL,MAAA,aAAA,CAAc,KAAK,CAAA;AACnB,MAAA,SAAA,CAAU,CAAC,IAAA,KAAS,CAAC,IAAI,CAAA;AAAA,IAC3B;AAAA,EACF,CAAA,EAAG,CAAC,eAAe,CAAC,CAAA;AAEpB,EAAA,MAAM,qBAAA,GAAwBA,WAAAA;AAAA,IAC5B,CAAC,CAAA,KAAwB;AAEvB,MAAA,IAAI,CAAA,CAAE,MAAA,KAAW,CAAA,IAAK,CAAC,MAAA,EAAQ;AAE/B,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,CAAA,CAAE,eAAA,EAAgB;AAElB,MAAA,aAAA,CAAc,UAAU,CAAA,CAAE,OAAA;AAC1B,MAAA,iBAAA,CAAkB,UAAU,YAAA,CAAa,OAAA;AACzC,MAAA,aAAA,CAAc,OAAA,GAAU,KAAA;AAExB,MAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,eAAe,CAAA;AACtD,MAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,aAAa,CAAA;AAAA,IACpD,CAAA;AAAA,IACA,CAAC,MAAA,EAAQ,eAAA,EAAiB,aAAa;AAAA,GACzC;AAEA,EAAA,MAAM,iBAAA,GAAoBA,YAAY,MAAM;AAI1C,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,SAAA,CAAU,IAAI,CAAA;AAAA,IAChB;AAAA,EAEF,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAA,uBACEM,IAAAA,CAAAC,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAF,GAAAA;AAAA,MAAC,mBAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,SAAA;AAAA,QACL,MAAA;AAAA,QACA,QAAA;AAAA,QACA,OAAA,EAAS,iBAAA;AAAA,QACT,WAAA,EAAa,qBAAA;AAAA,QACb;AAAA;AAAA,KACF;AAAA,oBAEAA,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,UAAA;AAAA,QACL,WAAW,CAAA,0CAAA,EAA6C,QAAQ,CAAA,CAAA,EAC9D,MAAA,GAAS,KAAK,QAChB,CAAA,CAAA;AAAA,QACA,KAAA,EAAO,EAAE,KAAA,EAAO,CAAA,EAAG,YAAY,CAAA,EAAA,CAAA,EAAK;AAAA,QAEnC,QAAA,EAAA,QAAA,CAAS,EAAE,KAAA,EAAO,MAAM,UAAU,KAAK,CAAA,EAAG,cAAc;AAAA;AAAA;AAC3D,GAAA,EACF,CAAA;AAEJ;AC9IO,SAAS,WAAA,CAAY;AAAA,EAC1B,SAAA;AAAA,EACA,MAAA,GAAS,EAAA;AAAA,EACT,SAAA;AAAA,EACA,OAAA,GAAU,UAAA;AAAA,EACV,KAAA,GAAQ,SAAA;AAAA,EACR,SAAA,EAAW,aAAA;AAAA,EACX,cAAA,EAAgB,kBAAA;AAAA,EAChB,QAAA,GAAW,OAAA;AAAA,EACX,KAAA,GAAQ,GAAA;AAAA,EACR,WAAA,GAAc,KAAA;AAAA,EACd,SAAA,GAAY,KAAA;AAAA,EACZ,OAAA;AAAA,EACA,MAAA,EAAQ,UAAA;AAAA,EACR,WAAA,GAAc,KAAA;AAAA,EACd,SAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,gBAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAAqB;AAEnB,EAAA,MAAM,yBAAA,GAA4B,oBAAoB,MAAA,CAAO,6BAAA;AAC7D,EAAA,MAAM,qBAAA,GAAwB,gBAAgB,MAAA,CAAO,qBAAA;AACrD,EAAA,MAAM,sBAAA,GAAyB,iBAAiB,MAAA,CAAO,qBAAA;AAGvD,EAAA,MAAM;AAAA,IACJ,MAAA;AAAA,IACA,SAAA,EAAW,eAAA;AAAA,IACX,SAAA,EAAW,gBAAA;AAAA,IACX,iBAAA;AAAA,IACA,qBAAA;AAAA,IACA,oBAAA;AAAA,IACA,6BAAA;AAAA,IACA,cAAA,EAAgB,qBAAA;AAAA,IAChB,aAAA;AAAA,IACA;AAAA,MACE,gBAAA,CAAiB;AAAA,IACnB,SAAA;AAAA,IACA,MAAA;AAAA,IACA,UAAA;AAAA,IACA,IAAA,EAAM,WAAA;AAAA,IACN;AAAA,GACD,CAAA;AAGD,EAAA,MAAM,SAAA,GAAY,iBAAiB,gBAAA,IAAoB,KAAA;AAGvD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIN,QAAAA;AAAA,IAClC,MAAO,OAAe,kBAAA,IAAgC;AAAA,GACxD;AAEA,EAAAG,UAAU,MAAM;AACd,IAAA,MAAM,UAAU,CAAC,CAAA,KAAa,aAAA,CAAe,CAAA,CAA0B,UAAU,EAAE,CAAA;AACnF,IAAA,MAAA,CAAO,gBAAA,CAAiB,sBAAsB,OAAO,CAAA;AACrD,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,oBAAA,EAAsB,OAAO,CAAA;AAAA,EACvE,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAIH,QAAAA;AAAA,IAC9C,MAAO,MAAA,CAAe;AAAA,GACxB;AAEA,EAAAG,UAAU,MAAM;AACd,IAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAAa,mBAAA,CAAqB,EAA0B,MAAM,CAAA;AACnF,IAAA,MAAA,CAAO,gBAAA,CAAiB,oBAAoB,OAAO,CAAA;AACnD,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,kBAAA,EAAoB,OAAO,CAAA;AAAA,EACrE,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,cAAA,GAAiB,oBAAoB,kBAAA,IAAsB,qBAAA;AAIjE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIH,QAAAA,CAAsC,EAAE,CAAA;AAG1E,EAAA,MAAM,mBAAmB,SAAA,CAAU,WAAA;AACnC,EAAAG,UAAU,MAAM;AACd,IAAA,IACE,iBAAA,IACA,CAAC,eAAA,IACD,CAAC,gBAAA,EACD;AACA,MAAA,OAAO,yBAAyB,CAAA,CAC7B,IAAA,CAAK,CAAC,EAAE,sBAAqB,KAAM;AAClC,QAAA,YAAA,CAAa,CAAC,IAAA,MAAU;AAAA,UACtB,GAAG,IAAA;AAAA,UACH,WAAA,EAAa,oBAAA,CAAqB,EAAE,SAAA,EAAW,QAAQ;AAAA,SACzD,CAAE,CAAA;AACF,QAAA,OAAA,CAAQ,IAAI,qCAAqC,CAAA;AAAA,MACnD,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,GAAA,KAAQ;AACd,QAAA,OAAA,CAAQ,IAAA,CAAK,sCAAsC,GAAG,CAAA;AAAA,MACxD,CAAC,CAAA;AAAA,IACL;AAAA,EACF,GAAG,CAAC,iBAAA,EAAmB,iBAAiB,SAAA,EAAW,MAAA,EAAQ,gBAAgB,CAAC,CAAA;AAG5E,EAAAA,UAAU,MAAM;AACd,IAAA,IACE,qBAAA,IACA,oBAAA,CAAqB,MAAA,GAAS,CAAA,IAC9B,CAAC,eAAA,EACD;AACA,MAAC,OAAO,iBAAiB,CAAA,CACtB,KAAK,CAAC,EAAE,0BAAyB,KAAM;AACtC,QAAA,YAAA,CAAa,CAAC,IAAA,MAAU;AAAA,UACtB,GAAG,IAAA;AAAA,UACH,cAAA,EAAgB,wBAAA,CAAyB,oBAAA,EAAsB,QAAQ;AAAA,SACzE,CAAE,CAAA;AACF,QAAA,OAAA,CAAQ,GAAA;AAAA,UACN,CAAA,4CAAA,EAA+C,qBAAqB,MAAM,CAAA,OAAA;AAAA,SAC5E;AAAA,MACF,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,GAAA,KAAQ;AACd,QAAA,OAAA,CAAQ,IAAA,CAAK,yCAAyC,GAAG,CAAA;AAAA,MAC3D,CAAC,CAAA;AAAA,IACL;AAAA,EACF,GAAG,CAAC,qBAAA,EAAuB,oBAAA,EAAsB,eAAA,EAAiB,QAAQ,CAAC,CAAA;AAG3E,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA,CAAE,SAAS,CAAA,EAAG;AACrC,MAAA,MAAA,CAAO,IAAA,GAAO,iBAAiB,SAAS,CAAA;AAAA,IAC1C;AAAA,EACF,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAGd,EAAA,MAAM,oBAAA,GACJ,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,SAAS,MAAA,CAAO,KAAK,CAAA,EAAG,EAAE,CAAA,IAAK,GAAA;AACrE,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIH,SAAS,MAAM;AACvD,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,cAAA,CAAe,OAAA,CAAQ,qBAAqB,CAAA;AAC3D,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAM,MAAA,GAAS,QAAA,CAAS,MAAA,EAAQ,EAAE,CAAA;AAClC,QAAA,IAAI,MAAA,IAAU,GAAA,IAAO,MAAA,IAAU,GAAA,EAAK,OAAO,MAAA;AAAA,MAC7C;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAAe;AACvB,IAAA,OAAO,oBAAA;AAAA,EACT,CAAC,CAAA;AACD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,SAAS,MAAM;AACnD,IAAA,IAAI;AACF,MAAA,OAAO,cAAA,CAAe,OAAA,CAAQ,yBAAyB,CAAA,KAAM,MAAA;AAAA,IAC/D,CAAA,CAAA,MAAQ;AAAE,MAAA,OAAO,KAAA;AAAA,IAAO;AAAA,EAC1B,CAAC,CAAA;AAGD,EAAAG,UAAU,MAAM;AACd,IAAA,IAAI;AAAE,MAAA,cAAA,CAAe,OAAA,CAAQ,qBAAA,EAAuB,MAAA,CAAO,aAAa,CAAC,CAAA;AAAA,IAAG,CAAA,CAAA,MACtE;AAAA,IAAe;AAAA,EACvB,CAAA,EAAG,CAAC,aAAa,CAAC,CAAA;AAClB,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI;AAAE,MAAA,cAAA,CAAe,OAAA,CAAQ,yBAAA,EAA2B,MAAA,CAAO,WAAW,CAAC,CAAA;AAAA,IAAG,CAAA,CAAA,MACxE;AAAA,IAAe;AAAA,EACvB,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAGhB,EAAA,MAAM,kBAAA,GAAqBD,OAAuB,IAAI,CAAA;AACtD,EAAA,MAAM,iBAAA,GAAoBA,OAA0B,IAAI,CAAA;AACxD,EAAA,MAAM,kBAAA,GAAqBA,OAAO,CAAC,CAAA;AACnC,EAAA,MAAM,kBAAA,GAAqBA,OAAO,CAAC,CAAA;AACnC,EAAA,MAAM,kBAAA,GAAqBA,OAAO,KAAK,CAAA;AACvC,EAAA,MAAM,iBAAA,GAAoBA,OAAO,oBAAoB,CAAA;AACrD,EAAA,MAAM,WAAA,GAAcA,OAAO,QAAQ,CAAA;AACnC,EAAA,WAAA,CAAY,OAAA,GAAU,QAAA;AAGtB,EAAAC,UAAU,MAAM;AACd,IAAA,iBAAA,CAAkB,OAAA,GAAU,aAAA;AAAA,EAC9B,CAAA,EAAG,CAAC,aAAa,CAAC,CAAA;AAGlB,EAAA,MAAM,iBAAA,GAAoBF,WAAAA,CAAY,CAAC,CAAA,KAAkB;AACvD,IAAA,MAAM,EAAA,GAAK,CAAA,CAAE,OAAA,GAAU,kBAAA,CAAmB,OAAA;AAC1C,IAAA,IAAI,CAAC,kBAAA,CAAmB,OAAA,IAAW,KAAK,GAAA,CAAI,EAAE,KAAK,CAAA,EAAG;AACpD,MAAA,kBAAA,CAAmB,OAAA,GAAU,IAAA;AAE7B,MAAA,QAAA,CAAS,IAAA,CAAK,MAAM,MAAA,GAAS,YAAA;AAC7B,MAAA,QAAA,CAAS,IAAA,CAAK,MAAM,UAAA,GAAa,MAAA;AAAA,IACnC;AACA,IAAA,IAAI,CAAC,mBAAmB,OAAA,EAAS;AAEjC,IAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,OAAA,KAAY,OAAA,GAAU,CAAC,EAAA,GAAK,EAAA;AACtD,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,IAAA,CAAK,IAAI,GAAA,EAAK,kBAAA,CAAmB,OAAA,GAAU,KAAK,CAAC,CAAA;AAC5E,IAAA,iBAAA,CAAkB,OAAA,GAAU,IAAA;AAG5B,IAAA,IAAI,mBAAmB,OAAA,EAAS;AAC9B,MAAA,kBAAA,CAAmB,OAAA,CAAQ,KAAA,CAAM,KAAA,GAAQ,CAAA,EAAG,IAAI,CAAA,EAAA,CAAA;AAAA,IAClD;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,eAAA,GAAkBA,YAAY,MAAM;AACxC,IAAA,QAAA,CAAS,mBAAA,CAAoB,aAAa,iBAAiB,CAAA;AAC3D,IAAA,QAAA,CAAS,mBAAA,CAAoB,WAAW,eAAe,CAAA;AACvD,IAAA,QAAA,CAAS,IAAA,CAAK,MAAM,MAAA,GAAS,EAAA;AAC7B,IAAA,QAAA,CAAS,IAAA,CAAK,MAAM,UAAA,GAAa,EAAA;AAEjC,IAAA,IAAI,mBAAmB,OAAA,EAAS;AAC9B,MAAA,gBAAA,CAAiB,kBAAkB,OAAO,CAAA;AAAA,IAC5C,CAAA,MAAO;AAEL,MAAA,cAAA,CAAe,CAAC,IAAA,KAAS,CAAC,IAAI,CAAA;AAAA,IAChC;AAAA,EACF,CAAA,EAAG,CAAC,iBAAiB,CAAC,CAAA;AAEtB,EAAA,MAAM,uBAAA,GAA0BA,WAAAA;AAAA,IAC9B,CAAC,CAAA,KAAwB;AACvB,MAAA,IAAI,CAAA,CAAE,WAAW,CAAA,EAAG;AAEpB,MAAA,IAAI,WAAA,EAAa;AACjB,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,MAAA,kBAAA,CAAmB,UAAU,CAAA,CAAE,OAAA;AAC/B,MAAA,kBAAA,CAAmB,UAAU,iBAAA,CAAkB,OAAA;AAC/C,MAAA,kBAAA,CAAmB,OAAA,GAAU,KAAA;AAC7B,MAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,iBAAiB,CAAA;AACxD,MAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,eAAe,CAAA;AAAA,IACtD,CAAA;AAAA,IACA,CAAC,WAAA,EAAa,iBAAA,EAAmB,eAAe;AAAA,GAClD;AAEA,EAAA,MAAM,mBAAA,GAAsBA,YAAY,MAAM;AAC5C,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,cAAA,CAAe,KAAK,CAAA;AAAA,IACtB;AAAA,EAEF,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAGhB,EAAA,MAAM,0BAAA,GAA6BC,MAAAA,CAAkD,EAAE,CAAA;AAGvF,EAAAC,UAAU,MAAM;AACd,IAAA,MAAM,UAAA,GAAa,MAAM,cAAA,CAAe,KAAK,CAAA;AAC7C,IAAA,MAAM,WAAA,GAAc,MAAM,cAAA,CAAe,IAAI,CAAA;AAC7C,IAAA,MAAM,oBAAA,GAAuB,CAAC,CAAA,KAAa;AACzC,MAAA,MAAM,UAAW,CAAA,CAAkB,MAAA;AACnC,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC1B,QAAA,0BAAA,CAA2B,OAAA,GAAU,OAAA;AACrC,QAAA,IAAA,CAAK,oBAAoB,OAAO,CAAA;AAAA,MAClC;AAAA,IACF,CAAA;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,aAAa,UAAU,CAAA;AAC/C,IAAA,MAAA,CAAO,gBAAA,CAAiB,cAAc,WAAW,CAAA;AACjD,IAAA,MAAA,CAAO,gBAAA,CAAiB,4BAA4B,oBAAoB,CAAA;AAGxE,IAAA,MAAM,UAAW,MAAA,CAAe,wBAAA;AAChC,IAAA,IAAI,MAAM,OAAA,CAAQ,OAAO,CAAA,IAAK,OAAA,CAAQ,SAAS,CAAA,EAAG;AAChD,MAAA,0BAAA,CAA2B,OAAA,GAAU,OAAA;AACrC,MAAA,IAAA,CAAK,oBAAoB,OAAO,CAAA;AAAA,IAClC;AAEA,IAAA,OAAO,MAAM;AACX,MAAA,MAAA,CAAO,mBAAA,CAAoB,aAAa,UAAU,CAAA;AAClD,MAAA,MAAA,CAAO,mBAAA,CAAoB,cAAc,WAAW,CAAA;AACpD,MAAA,MAAA,CAAO,mBAAA,CAAoB,4BAA4B,oBAAoB,CAAA;AAAA,IAC7E,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,oBAAA,GAAuBD,OAAuB,IAAI,CAAA;AACxD,EAAA,MAAM,aAAA,GAAgBA,OAAuB,IAAI,CAAA;AACjD,EAAA,MAAM,oBAAA,GAAuBA,OAG3B,IAAI,CAAA;AACN,EAAA,MAAM,mBAAA,GAAsBA,OAO1B,IAAI,CAAA;AAGN,EAAA,MAAM,CAAC,oBAAA,EAAsB,uBAAuB,CAAA,GAAIF,SAAS,KAAK,CAAA;AACtE,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIA,SAAS,KAAK,CAAA;AAC1D,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,QAAAA,CAA8C;AAAA,IAC9E,EAAE,EAAA,EAAI,SAAA,EAAW,IAAA,EAAM,QAAA;AAAS,GACjC,CAAA;AACD,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAIA,SAAS,SAAS,CAAA;AAClE,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAIA,QAAAA,CAAoC,EAAE,CAAA;AACtF,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIA,SAAS,CAAC,CAAA;AAGxD,EAAA,MAAM,CAAC,kBAAA,EAAoB,qBAAqB,CAAA,GAAIA,SAAS,KAAK,CAAA;AAClE,EAAA,MAAM,CAAC,mBAAA,EAAqB,sBAAsB,CAAA,GAAIA,SAG5C,IAAI,CAAA;AAGd,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIA,SAGpC,IAAI,CAAA;AAGd,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAG1E,EAAA,MAAM,aAAA,GAAgB,gBAAA,CAAiB,EAAE,SAAA,EAAW,QAAQ,CAAA;AAG5D,EAAA,MAAM,CAAC,oBAAA,EAAsB,uBAAuB,CAAA,GAAIA,SAAS,KAAK,CAAA;AACtE,EAAA,MAAM,qBAAA,GAAwBE,OAAO,KAAK,CAAA;AAG1C,EAAA,MAAM,oBAAA,GAAuB,oBAAoB,SAAS,CAAA,CAAA;AAC1D,EAAA,MAAM,oBAAA,GAAuBA,OAAsB,IAAI,CAAA;AACvD,EAAA,MAAM,wBAAA,GAA2BA,OAAO,KAAK,CAAA;AAE7C,EAAA,IAAI,oBAAA,CAAqB,YAAY,IAAA,EAAM;AACzC,IAAA,IAAI;AACF,MAAA,oBAAA,CAAqB,OAAA,GAAU,YAAA,CAAa,OAAA,CAAQ,oBAAoB,CAAA,IAAK,EAAA;AAAA,IAC/E,CAAA,CAAA,MAAQ;AACN,MAAA,oBAAA,CAAqB,OAAA,GAAU,EAAA;AAAA,IACjC;AAAA,EACF;AAGA,EAAA,MAAM,OAAO,OAAA,CAAQ;AAAA,IACnB,SAAA;AAAA,IACA,MAAA;AAAA,IACA,6BAAA;AAAA,IACA,cAAA;AAAA,IACA,aAAA;AAAA,IACA,SAAA;AAAA,IACA,mBAAA;AAAA,IACA,QAAA;AAAA,IACA,oBAAA,EAAsB,CAAC,UAAA,KAAe;AACpC,MAAA,iBAAA,CAAkB,UAAU,CAAA;AAAA,IAC9B,CAAA;AAAA,IACA,kBAAkB,MAAM;AAAA,IAAC,CAAA;AAAA,IACzB,eAAA,EAAiB,CAAC,KAAA,KAAU;AAC1B,MAAA,QAAQ,MAAM,IAAA;AAAM,QAClB,KAAK,SAAA;AACH,UAAA,IAAI,KAAA,CAAM,IAAA,IAAQ,KAAA,CAAM,KAAA,EAAO;AAC7B,YAAA,aAAA,CAAc,KAAA,CAAM,IAAA,EAAM,KAAA,CAAM,KAAK,CAAA;AAAA,UACvC;AACA,UAAA;AAAA,QACF,KAAK,cAAA;AACH,UAAA,IAAI,KAAA,CAAM,MAAA,IAAU,KAAA,CAAM,UAAA,EAAY;AACpC,YAAA,UAAA,CAAW,KAAA,CAAM,MAAA,EAAQ,KAAA,CAAM,UAAU,CAAA;AAAA,UAC3C;AACA,UAAA;AAAA,QACF,KAAK,OAAA;AACH,UAAA,WAAA,CAAY,GAAI,CAAA;AAChB,UAAA;AAAA,QACF,KAAK,iBAAA;AACH,UAAA,YAAA,EAAa;AACb,UAAA;AAAA;AACJ,IACF,CAAA;AAAA,IACA,YAAA,EAAc,qBAAA;AAAA,IACd,UAAA,EAAY,OAAO,KAAA,KAAU;AAC3B,MAAA,IAAI,MAAM,IAAA,KAAS,aAAA,IAAiB,KAAA,CAAM,QAAA,IAAY,MAAM,UAAA,EAAY;AAEtE,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,GAAS,MAAM,oBAAA,CAAqB,OAAA;AAAA,YACxC,KAAA,CAAM,QAAA;AAAA,YACL,KAAA,CAAM,aAAa;AAAC,WACvB;AAGA,UAAA,MAAM,SAAA,GAAY,MAAA;AAClB,UAAA,MAAM,UAAU,SAAA,EAAW,IAAA;AAC3B,UAAA,MAAM,gBAAA,GACJ,SAAS,QAAA,KAAa,IAAA,IACrB,OAAO,SAAA,EAAW,KAAA,KAAU,YAAY,SAAA,CAAU,KAAA,CAAM,SAAS,mBAAmB,CAAA,IACpF,OAAO,SAAA,EAAW,KAAA,KAAU,YAAY,SAAA,CAAU,KAAA,CAAM,SAAS,UAAU,CAAA;AAE9E,UAAA,IAAI,gBAAA,EAAkB;AACpB,YAAA,OAAA,CAAQ,IAAI,2CAA2C,CAAA;AACvD,YAAA,IAAI,oBAAoB,OAAA,EAAS;AAC/B,cAAA,MAAM,mBAAA,CAAoB,OAAA;AAAA,gBACxB,KAAA,CAAM,UAAA;AAAA,gBACN,KAAA,CAAM,QAAA;AAAA,gBACN,EAAE,OAAA,EAAS,KAAA,EAAO,SAAA,EAAW,IAAA,EAAM,OAAO,mCAAA;AAAoC,eAChF;AAAA,YACF;AACA,YAAA;AAAA,UACF;AAGA,UAAA,IAAI,MAAA,IAAU,oBAAoB,OAAA,EAAS;AACzC,YAAA,MAAM,mBAAA,CAAoB,OAAA;AAAA,cACxB,KAAA,CAAM,UAAA;AAAA,cACN,KAAA,CAAM,QAAA;AAAA,cACN;AAAA,aACF;AAAA,UACF;AAAA,QACF,SAAS,CAAA,EAAG;AACV,UAAA,OAAA,CAAQ,KAAA,CAAM,8BAA8B,CAAC,CAAA;AAC7C,UAAA,IAAI,oBAAoB,OAAA,EAAS;AAC/B,YAAA,MAAM,mBAAA,CAAoB,OAAA;AAAA,cACxB,KAAA,CAAM,UAAA;AAAA,cACN,KAAA,CAAM,QAAA;AAAA,cACN,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,MAAA,CAAO,CAAC,CAAA;AAAE,aACrC;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAA;AAAA,IACA,wBAAwB,MAAM;AAC5B,MAAA,uBAAA,CAAwB,IAAI,CAAA;AAAA,IAC9B;AAAA,GACD,CAAA;AAGD,EAAAC,UAAU,MAAM;AACd,IAAA,IACE,oBAAA,IACA,IAAA,CAAK,cAAA,IACL,CAAC,sBAAsB,OAAA,EACvB;AACA,MAAA,qBAAA,CAAsB,OAAA,GAAU,IAAA;AAChC,MAAA,aAAA,CACG,iCAAiC,IAAA,CAAK,cAAc,CAAA,CACpD,IAAA,CAAK,CAAC,eAAA,KAAoB;AACzB,QAAA,IAAI,eAAA,CAAgB,SAAS,CAAA,EAAG;AAC9B,UAAA,IAAA,CAAK,aAAa,eAAe,CAAA;AAAA,QACnC;AAAA,MACF,CAAC,CAAA;AAAA,IACL;AAAA,EACF,GAAG,CAAC,oBAAA,EAAsB,KAAK,cAAA,EAAgB,aAAA,EAAe,IAAI,CAAC,CAAA;AAKnE,EAAAA,UAAU,MAAM;AAKd,IAAA,IAAI,yBAAA,EAA2B;AAC/B,IAAA,IAAI,eAAA,IAAmB,yBAAyB,OAAA,EAAS;AAEzD,IAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC7B,MAAA,IAAI,wBAAA,CAAyB,WAAW,cAAA,EAAgB;AACxD,MAAA,MAAM,UAAU,oBAAA,CAAqB,OAAA;AACrC,MAAA,IAAI,CAAC,OAAA,EAAS;AACd,MAAA,wBAAA,CAAyB,OAAA,GAAU,IAAA;AACnC,MAAA,oBAAA,CAAqB,OAAA,GAAU,EAAA;AAE/B,MAAA,aAAA,CACG,gCAAA,CAAiC,OAAO,CAAA,CACxC,IAAA,CAAK,CAAC,eAAA,KAAoB;AACzB,QAAA,IAAI,eAAA,CAAgB,SAAS,CAAA,EAAG;AAC9B,UAAA,IAAA,CAAK,aAAa,eAAe,CAAA;AACjC,UAAA,IAAA,CAAK,kBAAkB,OAAO,CAAA;AAAA,QAChC;AAAA,MACF,CAAC,CAAA,CACA,KAAA,CAAM,MAAM;AAAA,MAEb,CAAC,CAAA;AAAA,IACL,GAAG,GAAG,CAAA;AAEN,IAAA,OAAO,MAAM,aAAa,KAAK,CAAA;AAAA,EAEjC,CAAA,EAAG,CAAC,eAAA,EAAiB,yBAAyB,CAAC,CAAA;AAG/C,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI;AACF,MAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,QAAA,YAAA,CAAa,OAAA,CAAQ,oBAAA,EAAsB,IAAA,CAAK,cAAc,CAAA;AAAA,MAChE;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF,CAAA,EAAG,CAAC,IAAA,CAAK,cAAA,EAAgB,oBAAoB,CAAC,CAAA;AAI9C,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,YAAY,UAAA,EAAY;AAC1B,MAAA,uBAAA,EAAwB;AAAA,IAC1B;AAAA,EACF,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAGZ,EAAA,MAAM;AAAA,IACJ,cAAA;AAAA,IACA,aAAA;AAAA,IACA,UAAA;AAAA,IACA,YAAA;AAAA,IACA,WAAA;AAAA,IACA;AAAA,MACE,WAAA,CAAY;AAAA,IACd,SAAA;AAAA,IACA,MAAA;AAAA,IACA,gBAAgB,IAAA,CAAK,cAAA;AAAA,IACrB,eAAe,IAAA,CAAK,aAAA;AAAA,IACpB,SAAA,EAAW,CAAC,OAAA,KAAY;AACtB,MAAA,IAAA,CAAK,YAAA,CAAa;AAAA,QAChB,GAAG,IAAA,CAAK,QAAA;AAAA,QACR;AAAA,UACE,EAAA,EAAI,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA;AAAA,UACrB,OAAA;AAAA,UACA,KAAA,EAAO,IAAA;AAAA,UACP,SAAA,sBAAe,IAAA;AAAK;AACtB,OACD,CAAA;AAAA,IACH;AAAA,GACD,CAAA;AAGD,EAAA,MAAM,EAAE,iBAAA,EAAkB,GAAI,UAAA,CAAW;AAAA,IACvC,cAAc,YAAY;AACxB,MAAA,iBAAA,CAAkB,IAAI,CAAA;AACtB,MAAA,MAAM,cAAc,iBAAA,EAAkB;AAGtC,MAAA,MAAM,UAAU,oBAAA,CAAqB,OAAA;AACrC,MAAA,IAAI,OAAA,IAAW,CAAC,wBAAA,CAAyB,OAAA,EAAS;AAChD,QAAA,wBAAA,CAAyB,OAAA,GAAU,IAAA;AACnC,QAAA,oBAAA,CAAqB,OAAA,GAAU,EAAA;AAC/B,QAAA,IAAI;AACF,UAAA,MAAM,eAAA,GAAkB,MAAM,aAAA,CAAc,uBAAA,CAAwB,OAAO,CAAA;AAC3E,UAAA,IAAI,eAAA,CAAgB,SAAS,CAAA,EAAG;AAC9B,YAAA,IAAA,CAAK,aAAa,eAAe,CAAA;AACjC,YAAA,IAAA,CAAK,kBAAkB,OAAO,CAAA;AAAA,UAChC;AAAA,QACF,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF,CAAA;AAAA,IACA,SAAS,MAAM;AACb,MAAA,iBAAA,CAAkB,KAAK,CAAA;AACvB,MAAA,IAAA,CAAK,aAAA,EAAc;AAAA,IACrB;AAAA,GACD,CAAA;AAED,EAAA,oBAAA,CAAqB,OAAA,GAAU,iBAAA;AAC/B,EAAA,mBAAA,CAAoB,UAAU,IAAA,CAAK,gBAAA;AAGnC,EAAA,MAAM,yBAAA,GAA4BF,WAAAA;AAAA,IAChC,CAAC,WAAA,KAA0C;AACzC,MAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC9B,QAAA,sBAAA,CAAuB,EAAE,WAAA,EAAa,OAAA,EAAS,CAAA;AAAA,MACjD,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,IACA;AAAC,GACH;AAEA,EAAA,MAAM,qBAAA,GAAwBA,WAAAA;AAAA,IAC5B,CAAC,QAAA,KAAsC;AACrC,MAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AAEtC,QAAA,kBAAA,CAAmB,CAAC,IAAA,KAAS;AAC3B,UAAA,IAAI,IAAA,EAAM;AACR,YAAA,IAAA,CAAK,MAAA,CAAO,IAAI,KAAA,CAAM,oCAAoC,CAAC,CAAA;AAAA,UAC7D;AACA,UAAA,OAAO,EAAE,SAAS,MAAA,EAAO;AAAA,QAC3B,CAAC,CAAA;AACD,QAAA,kBAAA,CAAmB,QAAQ,CAAA;AAE3B,QAAA,IAAA,CAAK,UAAA,CAAW,aAAa,QAAQ,CAAA;AAAA,MACvC,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,IACA,CAAC,IAAI;AAAA,GACP;AAEA,EAAA,MAAM,qBAAA,GAAwBA,WAAAA;AAAA,IAC5B,CAAC,MAAc,QAAA,KAAqB;AAElC,MAAA,IAAI,IAAA,IAAQ,QAAA,IAAY,IAAA,KAAS,EAAA,EAAI;AACnC,QAAA,qBAAA,CAAsB,KAAK,CAAA;AAAA,MAC7B;AAAA,IACF,CAAA;AAAA,IACA;AAAC,GACH;AAEA,EAAA,MAAM,qBAAqB,YAAY;AACrC,IAAA,MAAM,YAAA,EAAa;AAAA,EACrB,CAAA;AAGA,EAAA,MAAM,iBAAA,GAAoB,OAAO,UAAA,EAAoB,QAAA,KAAsB;AACzE,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,eAAA,CAAgB,IAAA,CAAK,CAAC,OAAO,EAAA,CAAG,EAAA,KAAO,UAAU,CAAA,IAClE,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAC,CAAA,KAAM,CAAA,CAAE,SAAA,IAAa,EAAE,CAAA,CAAE,IAAA,CAAK,CAAC,EAAA,KAAO,EAAA,CAAG,EAAA,KAAO,UAAU,CAAA;AAEtF,IAAA,IAAI,CAAC,QAAA,EAAU;AAEf,IAAA,MAAM,YAAA,GAAe,CAAC,QAAA,CAAS,mBAAA;AAE/B,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IAAA,CAAK,oBAAA,CAAqB,YAAY,WAAW,CAAA;AAEjD,MAAA,IAAI,YAAA,EAAc;AAEhB,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,GAAS,MAAM,oBAAA,CAAqB,OAAA;AAAA,YACxC,QAAA,CAAS,IAAA;AAAA,YACR,QAAA,CAAS,aAAa;AAAC,WAC1B;AAEA,UAAA,MAAM,SAAA,GAAY,MAAA;AAClB,UAAA,MAAM,UAAU,SAAA,EAAW,IAAA;AAC3B,UAAA,MAAM,gBAAA,GACJ,SAAS,QAAA,KAAa,IAAA,IACrB,OAAO,SAAA,EAAW,KAAA,KAAU,YAAY,SAAA,CAAU,KAAA,CAAM,SAAS,mBAAmB,CAAA,IACpF,OAAO,SAAA,EAAW,KAAA,KAAU,YAAY,SAAA,CAAU,KAAA,CAAM,SAAS,UAAU,CAAA;AAE9E,UAAA,IAAI,gBAAA,EAAkB;AACpB,YAAA,OAAA,CAAQ,IAAI,yDAAyD,CAAA;AACrE,YAAA,IAAI,oBAAoB,OAAA,EAAS;AAC/B,cAAA,MAAM,mBAAA,CAAoB,OAAA;AAAA,gBACxB,UAAA;AAAA,gBACA,QAAA,CAAS,IAAA;AAAA,gBACT,EAAE,OAAA,EAAS,KAAA,EAAO,SAAA,EAAW,IAAA,EAAM,OAAO,mCAAA;AAAoC,eAChF;AAAA,YACF;AACA,YAAA;AAAA,UACF;AAEA,UAAA,IAAI,MAAA,IAAU,oBAAoB,OAAA,EAAS;AACzC,YAAA,MAAM,mBAAA,CAAoB,OAAA;AAAA,cACxB,UAAA;AAAA,cACA,QAAA,CAAS,IAAA;AAAA,cACT;AAAA,aACF;AAAA,UACF;AAAA,QACF,SAAS,CAAA,EAAG;AACV,UAAA,OAAA,CAAQ,KAAA,CAAM,4CAA4C,CAAC,CAAA;AAC3D,UAAA,IAAI,oBAAoB,OAAA,EAAS;AAC/B,YAAA,MAAM,mBAAA,CAAoB,OAAA;AAAA,cACxB,UAAA;AAAA,cACA,QAAA,CAAS,IAAA;AAAA,cACT,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,MAAA,CAAO,CAAC,CAAA;AAAE,aACrC;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAA,MAAO;AAEL,QAAA,IAAI,oBAAoB,OAAA,EAAS;AAC/B,UAAA,MAAM,mBAAA,CAAoB,OAAA;AAAA,YACxB,UAAA;AAAA,YACA,QAAA,CAAS,IAAA;AAAA,YACT,EAAE,gBAAA,EAAkB,IAAA,EAAM,gBAAgB,QAAA,CAAS,SAAA,IAAa,EAAC;AAAE,WACrE;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,oBAAA,CAAqB,YAAY,QAAQ,CAAA;AAC9C,MAAA,IAAI,oBAAoB,OAAA,EAAS;AAC/B,QAAA,MAAM,mBAAA,CAAoB,OAAA;AAAA,UACxB,UAAA;AAAA,UACA,QAAA,CAAS,IAAA;AAAA,UACT,EAAE,MAAA,EAAQ,QAAA,EAAU,KAAA,EAAO,8CAAA;AAA+C,SAC5E;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAA;AAGA,EAAAE,UAAU,MAAM;AACd,IAAC,OAAe,wBAAA,GAA2B;AAAA,MACzC,cAAA,EAAgB,yBAAA;AAAA,MAChB,UAAA,EAAY,qBAAA;AAAA,MACZ,UAAA,EAAY;AAAA,KACd;AACA,IAAA,OAAO,MAAM;AACX,MAAA,OAAQ,MAAA,CAAe,wBAAA;AAAA,IACzB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,yBAAA,EAA2B,qBAAA,EAAuB,qBAAqB,CAAC,CAAA;AAG5E,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,MAAA,OAAA,IAAU;AAAA,IACZ;AAAA,EACF,CAAA,EAAG,CAAC,eAAA,EAAiB,OAAO,CAAC,CAAA;AAG7B,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,6BAA6B,eAAA,EAAiB;AAEnD,IAAA,IAAI,SAAA,GAAY,KAAA;AAEhB,IAAA,MAAM,WAAW,YAAY;AAC3B,MAAA,IAAI;AACF,QAAA,MAAM,KAAA,GAAQ,MAAM,yBAAA,EAA0B;AAC9C,QAAA,IAAI,CAAC,aAAa,KAAA,EAAO;AACvB,UAAA,MAAA,CAAO,IAAA,GAAO,UAAA,EAAY,EAAE,KAAA,EAAO,CAAA;AAAA,QACrC;AAAA,MACF,SAAS,CAAA,EAAG;AACV,QAAA,OAAA,CAAQ,KAAA,CAAM,mCAAmC,CAAC,CAAA;AAAA,MACpD;AAAA,IACF,CAAA;AAGA,IAAA,QAAA,EAAS;AAGT,IAAA,MAAM,aAAA,GAAgB,MAAM,QAAA,EAAS;AACrC,IAAA,MAAA,CAAO,gBAAA,CAAiB,6BAA6B,aAAa,CAAA;AAElE,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AACZ,MAAA,MAAA,CAAO,mBAAA,CAAoB,6BAA6B,aAAa,CAAA;AAAA,IACvE,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,yBAAA,EAA2B,eAAe,CAAC,CAAA;AAG/C,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACnC,IAAA,IAAI,WAAW,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,CAAE,SAAS,CAAA,EAAG;AAC9C,MAAC,OAAe,mBAAA,GAAsB,OAAA;AAAA,IACxC,CAAA,MAAO;AACL,MAAC,OAAe,mBAAA,GAAsB,MAAA;AAAA,IACxC;AAAA,EACF,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAGZ,EAAA,MAAM,UAAA,GAAa,CAAC,OAAA,KAAoB;AACtC,IAAA,IAAI,CAAC,OAAA,CAAQ,IAAA,EAAK,EAAG;AAGrB,IAAA,IAAI,eAAA,EAAiB;AAEnB,MAAA,IAAA,CAAK,UAAA,CAAW,QAAQ,OAAO,CAAA;AAC/B,MAAA,eAAA,CAAgB,QAAQ,OAAO,CAAA;AAC/B,MAAA,kBAAA,CAAmB,IAAI,CAAA;AACvB,MAAA,kBAAA,CAAmB,IAAI,CAAA;AACvB,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,YAAY,OAAO,CAAA;AAAA,EAC1B,CAAA;AAEA,EAAA,MAAM,aAAa,MAAM;AAEvB,IAAA,IAAA,CAAK,cAAA,EAAe;AAGpB,IAAA,MAAM,eAAA,GAAkB,eAAA;AACxB,IAAA,kBAAA,CAAmB,IAAI,CAAA;AACvB,IAAA,kBAAA,CAAmB,IAAI,CAAA;AAGvB,IAAA,IAAI,qBAAqB,kBAAA,EAAoB;AAC3C,MAAA,OAAO,yBAAyB,CAAA,CAC7B,IAAA,CAAK,CAAC,EAAE,sBAAqB,KAAM;AAClC,QAAA,oBAAA,EAAqB;AAErB,QAAA,eAAA,EAAiB,MAAA,CAAO,IAAI,KAAA,CAAM,iBAAiB,CAAC,CAAA;AAAA,MACtD,CAAC,CAAA,CACA,KAAA,CAAM,MAAM;AACX,QAAA,eAAA,EAAiB,MAAA,CAAO,IAAI,KAAA,CAAM,iBAAiB,CAAC,CAAA;AAAA,MACtD,CAAC,CAAA;AACH,MAAA,qBAAA,CAAsB,KAAK,CAAA;AAAA,IAC7B,WAAW,eAAA,EAAiB;AAC1B,MAAA,eAAA,CAAgB,MAAA,CAAO,IAAI,KAAA,CAAM,iBAAiB,CAAC,CAAA;AAAA,IACrD;AAGA,IAAA,IAAI,mBAAA,EAAqB;AACvB,MAAA,mBAAA,CAAoB,QAAQ,KAAK,CAAA;AACjC,MAAA,sBAAA,CAAuB,IAAI,CAAA;AAAA,IAC7B;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,gBAAgB,MAAM;AAC1B,IAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,MAAA,mBAAA,CAAoB,CAAC,IAAA,MAAU;AAAA,QAC7B,GAAG,IAAA;AAAA,QACH,CAAC,gBAAgB,GAAG,IAAA,CAAK;AAAA,OAC3B,CAAE,CAAA;AACF,MAAA,MAAM,YAAY,eAAA,GAAkB,CAAA;AACpC,MAAA,MAAM,MAAA,GAAS,SAAS,SAAS,CAAA,CAAA;AACjC,MAAA,YAAA,CAAa,CAAC,IAAA,KAAS,CAAC,GAAG,IAAA,EAAM,EAAE,EAAA,EAAI,MAAA,EAAQ,IAAA,EAAM,CAAA,KAAA,EAAQ,SAAS,CAAA,CAAA,EAAI,CAAC,CAAA;AAC3E,MAAA,mBAAA,CAAoB,MAAM,CAAA;AAC1B,MAAA,kBAAA,CAAmB,SAAS,CAAA;AAAA,IAC9B;AACA,IAAA,IAAA,CAAK,aAAA,EAAc;AACnB,IAAA,uBAAA,CAAwB,KAAK,CAAA;AAAA,EAC/B,CAAA;AAEA,EAAA,MAAM,sBAAsB,MAAM;AAChC,IAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,MAAA;AAAA,IACF;AACA,IAAA,uBAAA,CAAwB,CAAC,oBAAoB,CAAA;AAC7C,IAAA,IAAI,CAAC,oBAAA,EAAsB;AACzB,MAAA,aAAA,CAAc,iBAAA,EAAkB;AAAA,IAClC;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,wBAAA,GAA2B,OAAO,MAAA,KAAmB;AACzD,IAAA,MAAM,eAAA,GAAkB,MAAM,aAAA,CAAc,uBAAA,CAAwB,MAAM,CAAA;AAC1E,IAAA,IAAI,eAAA,CAAgB,SAAS,CAAA,EAAG;AAC9B,MAAA,IAAA,CAAK,aAAa,eAAe,CAAA;AACjC,MAAA,IAAA,CAAK,kBAAkB,MAAM,CAAA;AAAA,IAC/B,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,aAAA,EAAc;AAAA,IACrB;AACA,IAAA,uBAAA,CAAwB,KAAK,CAAA;AAAA,EAC/B,CAAA;AAEA,EAAA,MAAM,oBAAA,GAAuB,CAAC,KAAA,KAAkB;AAC9C,IAAA,IAAI,UAAU,gBAAA,EAAkB;AAChC,IAAA,mBAAA,CAAoB,CAAC,IAAA,MAAU;AAAA,MAC7B,GAAG,IAAA;AAAA,MACH,CAAC,gBAAgB,GAAG,IAAA,CAAK;AAAA,KAC3B,CAAE,CAAA;AACF,IAAA,MAAM,YAAA,GAAe,iBAAiB,KAAK,CAAA;AAC3C,IAAA,IAAI,YAAA,IAAgB,YAAA,CAAa,MAAA,GAAS,CAAA,EAAG;AAC3C,MAAA,IAAA,CAAK,aAAa,YAAY,CAAA;AAAA,IAChC,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,aAAA,EAAc;AAAA,IACrB;AACA,IAAA,mBAAA,CAAoB,KAAK,CAAA;AACzB,IAAA,uBAAA,CAAwB,KAAK,CAAA;AAAA,EAC/B,CAAA;AAEA,EAAA,MAAM,8BAA8B,MAAM;AACxC,IAAA,uBAAA,CAAwB,KAAK,CAAA;AAAA,EAC/B,CAAA;AAGA,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIH,SAAwB,IAAI,CAAA;AAGpE,EAAA,MAAM,CAAC,kBAAA,EAAoB,qBAAqB,IAAIA,QAAAA,iBAAsB,IAAI,KAAK,CAAA;AAEnF,EAAA,MAAM,cAAA,GAAiB,CAAC,KAAA,EAAe,OAAA,KAAwC;AAC7E,IAAA,IAAI,YAAY,KAAA,EAAO;AAEvB,IAAA,IAAI,YAAY,OAAA,EAAS;AAEvB,MAAA,IAAI,SAAA,CAAU,UAAU,CAAA,EAAG;AAE3B,MAAA,IAAI,qBAAqB,KAAA,EAAO;AAI9B,QAAA,MAAM,eAAA,GAAkB;AAAA,UACtB,GAAG,gBAAA;AAAA,UACH,CAAC,gBAAgB,GAAG,IAAA,CAAK;AAAA,SAC3B;AAEA,QAAA,MAAM,MAAM,SAAA,CAAU,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,KAAK,CAAA;AACrD,QAAA,MAAM,UAAU,SAAA,CAAU,GAAA,GAAM,CAAC,CAAA,IAAK,SAAA,CAAU,MAAM,CAAC,CAAA;AACvD,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,MAAM,YAAA,GAAe,eAAA,CAAgB,OAAA,CAAQ,EAAE,CAAA;AAC/C,UAAA,IAAI,YAAA,IAAgB,YAAA,CAAa,MAAA,GAAS,CAAA,EAAG;AAC3C,YAAA,IAAA,CAAK,aAAa,YAAY,CAAA;AAAA,UAChC,CAAA,MAAO;AACL,YAAA,IAAA,CAAK,aAAA,EAAc;AAAA,UACrB;AACA,UAAA,mBAAA,CAAoB,QAAQ,EAAE,CAAA;AAAA,QAChC;AAGA,QAAA,OAAO,gBAAgB,KAAK,CAAA;AAC5B,QAAA,mBAAA,CAAoB,eAAe,CAAA;AAAA,MACrC,CAAA,MAAO;AAEL,QAAA,mBAAA,CAAoB,CAAC,IAAA,KAAS;AAC5B,UAAA,MAAM,IAAA,GAAO,EAAE,GAAG,IAAA,EAAK;AACvB,UAAA,OAAO,KAAK,KAAK,CAAA;AACjB,UAAA,OAAO,IAAA;AAAA,QACT,CAAC,CAAA;AAAA,MACH;AAEA,MAAA,YAAA,CAAa,CAAC,SAAS,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,KAAK,CAAC,CAAA;AAAA,IAC3D;AAEA,IAAA,IAAI,YAAY,QAAA,EAAU;AAExB,MAAA,IAAI,IAAA,CAAK,mBAAmB,KAAA,EAAO;AACjC,QAAA,IAAA,CAAK,aAAA,EAAc;AACnB,QAAA,IAAA,CAAK,kBAAkB,IAAI,CAAA;AAAA,MAC7B;AACA,MAAA,qBAAA,CAAsB,CAAC,SAAS,IAAI,GAAA,CAAI,IAAI,CAAA,CAAE,GAAA,CAAI,KAAK,CAAC,CAAA;AAAA,IAC1D;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,sBAAsB,cAAA,GACxB,CAAC,GAAG,aAAA,CAAc,aAAa,CAAA,CAAE,IAAA;AAAA,IAC/B,CAAC,CAAA,EAAG,CAAA,KACF,IAAI,KAAK,CAAA,CAAE,UAAU,CAAA,CAAE,OAAA,KAAY,IAAI,IAAA,CAAK,CAAA,CAAE,UAAU,EAAE,OAAA;AAAQ,MAEtE,EAAC;AAEL,EAAA,MAAM,OAAO,cAAA,GACT;AAAA,IACE,EAAE,EAAA,EAAI,KAAA,EAAO,IAAA,EAAM,UAAA,EAAY,MAAM,KAAA,EAAe;AAAA,IACpD,GAAG,mBAAA,CACA,MAAA,CAAO,CAAC,SAAS,CAAC,kBAAA,CAAmB,GAAA,CAAI,IAAA,CAAK,EAAE,CAAC,CAAA,CACjD,GAAA,CAAI,CAAC,MAAM,GAAA,MAAS;AAAA,MACnB,IAAI,IAAA,CAAK,EAAA;AAAA,MACT,IAAA,EAAM,IAAA,CAAK,IAAA,IAAQ,CAAA,KAAA,EAAQ,MAAM,CAAC,CAAA,CAAA;AAAA,MAClC,IAAA,EAAM;AAAA,KACR,CAAE;AAAA,GACN,GACA,SAAA,CAAU,GAAA,CAAI,CAAC,GAAA,MAAS,EAAE,GAAG,GAAA,EAAK,IAAA,EAAM,OAAA,EAAiB,CAAE,CAAA;AAE/D,EAAA,MAAM,WAAA,GAAc,cAAA,GAChB,IAAA,CAAK,cAAA,IAAkB,KAAA,GACvB,gBAAA;AAMJ,EAAA,MAAM,qBAAA,GAAwBE,OAAkC,MAAS,CAAA;AACzE,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,cAAA,EAAgB;AAErB,IAAA,MAAM,YAAY,IAAA,CAAK,cAAA;AACvB,IAAA,MAAM,SAAS,qBAAA,CAAsB,OAAA;AACrC,IAAA,qBAAA,CAAsB,OAAA,GAAU,SAAA;AAGhC,IAAA,IAAI,MAAA,KAAW,MAAA,IAAc,MAAA,KAAW,IAAA,IAAQ,cAAc,IAAA,EAAO;AACnE,MAAA,aAAA,CAAc,iBAAA,EAAkB;AAAA,IAClC;AAAA,EACF,GAAG,CAAC,cAAA,EAAgB,KAAK,cAAA,EAAgB,aAAA,CAAc,iBAAiB,CAAC,CAAA;AAGzE,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIH,SAAS,KAAK,CAAA;AAE1D,EAAA,MAAM,iBAAA,GAAoBC,YAAY,MAAM;AAC1C,IAAA,MAAM,KAAK,aAAA,CAAc,OAAA;AACzB,IAAA,IAAI,CAAC,EAAA,EAAI;AACT,IAAA,iBAAA,CAAkB,GAAG,WAAA,GAAc,EAAA,CAAG,WAAA,GAAc,EAAA,CAAG,aAAa,CAAC,CAAA;AAAA,EACvE,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,gBAAA,GAAmBA,YAAY,MAAM;AACzC,IAAA,iBAAA,EAAkB;AAAA,EACpB,CAAA,EAAG,CAAC,iBAAiB,CAAC,CAAA;AAEtB,EAAA,MAAM,iBAAA,GAAoBA,YAAY,MAAM;AAC1C,IAAA,MAAM,KAAK,aAAA,CAAc,OAAA;AACzB,IAAA,IAAI,CAAC,EAAA,EAAI;AACT,IAAA,EAAA,CAAG,SAAS,EAAE,IAAA,EAAM,GAAA,EAAK,QAAA,EAAU,UAAU,CAAA;AAAA,EAC/C,CAAA,EAAG,EAAE,CAAA;AAGL,EAAAE,UAAU,MAAM;AACd,IAAA,iBAAA,EAAkB;AAAA,EACpB,CAAA,EAAG,CAAC,IAAA,CAAK,MAAA,EAAQ,iBAAiB,CAAC,CAAA;AAEnC,EAAA,MAAM,aAAa,OAAO,KAAA,KAAU,QAAA,GAAW,CAAA,EAAG,KAAK,CAAA,EAAA,CAAA,GAAO,KAAA;AAE9D,EAAA,MAAM,oBAAA,GAAuB,CAAC,eAAA,EAA8B,cAAA,EAA0B,kCACpFG,GAAAA;AAAA,IAAC,oBAAA;AAAA,IAAA;AAAA,MACC,MAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA,EAAW,eAAA;AAAA,MAEX,QAAA,kBAAAC,IAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAW,uCACT,QAAA,KAAa,MAAA,GAAS,kBAAkB,eAC1C,CAAA,CAAA,EAAI,aAAa,EAAE,CAAA,CAAA;AAAA,UACnB,KAAA,EAAO;AAAA,YACL,KAAA,EAAO,gBACF,OAAO,aAAA,KAAkB,WAAW,CAAA,EAAG,aAAa,OAAO,aAAA,GAC5D,UAAA;AAAA,YACJ,UAAA,EAAY,OAAO,UAAA,CAAW,UAAA;AAAA,YAC9B,QAAA,EAAU,OAAO,UAAA,CAAW,QAAA;AAAA,YAC5B,UAAA,EAAY,OAAO,UAAA,CAAW,UAAA;AAAA,YAC9B,UAAA,EAAY,OAAO,UAAA,CAAW,UAAA;AAAA,YAC9B,aAAA,EAAe,OAAO,UAAA,CAAW,aAAA;AAAA,YACjC,UAAA,EAAY,OAAO,MAAA,CAAO,UAAA;AAAA,YAC1B,WAAA,EAAa,OAAO,MAAA,CAAO;AAAA,WAC7B;AAAA,UAGA,QAAA,EAAA;AAAA,4BAAAA,IAAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAU,8DAAA;AAAA,gBACV,KAAA,EAAO,EAAE,WAAA,EAAa,MAAA,CAAO,OAAO,MAAA,EAAO;AAAA,gBAG3C,QAAA,EAAA;AAAA,kCAAAD,GAAAA;AAAA,oBAAC,KAAA;AAAA,oBAAA;AAAA,sBACC,GAAA,EAAK,aAAA;AAAA,sBACL,SAAA,EAAU,4EAAA;AAAA,sBACV,KAAA,EAAO;AAAA,wBACL,cAAA,EAAgB,MAAA;AAAA,wBAChB,eAAA,EAAiB;AAAA,uBACnB;AAAA,sBACA,QAAA,EAAU,gBAAA;AAAA,sBAET,QAAA,EAAA,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,EAAK,GAAA,KAAQ;AACtB,wBAAA,MAAM,QAAA,GAAW,gBAAgB,GAAA,CAAI,EAAA;AACrC,wBAAA,MAAM,SAAA,GAAY,iBAAiB,GAAA,CAAI,EAAA;AACvC,wBAAA,MAAM,WAAA,GAAc,IAAI,IAAA,KAAS,KAAA,KAAU,IAAI,IAAA,KAAS,OAAA,IAAW,UAAU,MAAA,GAAS,CAAA,CAAA;AACtF,wBAAA,uBACEC,IAAAA;AAAA,0BAAC,KAAA;AAAA,0BAAA;AAAA,4BAEC,SAAA,EAAW,CAAA,yKAAA,EACT,QAAA,GACI,qCAAA,GACA,mEACN,CAAA,CAAA;AAAA,4BACA,KAAA,EAAO;AAAA,8BACL,QAAA,EAAU,OAAA;AAAA,8BACV,WAAA,EAAa,MAAM,IAAA,CAAK,MAAA,GAAS,IAAI,CAAA,UAAA,EAAa,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA,CAAA,GAAK,MAAA;AAAA,8BAC3E,WAAA,EAAa,MAAA;AAAA,8BACb,YAAA,EAAc,cAAc,KAAA,GAAQ;AAAA,6BACtC;AAAA,4BACA,OAAO,GAAA,CAAI,IAAA;AAAA,4BACX,YAAA,EAAc,MAAM,eAAA,CAAgB,GAAA,CAAI,EAAE,CAAA;AAAA,4BAC1C,YAAA,EAAc,MAAM,eAAA,CAAgB,IAAI,CAAA;AAAA,4BACxC,SAAS,MAAM;AACb,8BAAA,IAAI,GAAA,CAAI,SAAS,KAAA,EAAO;AACtB,gCAAA,aAAA,EAAc;AACd,gCAAA;AAAA,8BACF;AACA,8BAAA,IAAI,GAAA,CAAI,SAAS,QAAA,EAAU;AACzB,gCAAA,wBAAA,CAAyB,IAAI,EAAE,CAAA;AAC/B,gCAAA;AAAA,8BACF;AACA,8BAAA,oBAAA,CAAqB,IAAI,EAAE,CAAA;AAAA,4BAC7B,CAAA;AAAA,4BAEA,QAAA,EAAA;AAAA,8CAAAD,GAAAA;AAAA,gCAAC,MAAA;AAAA,gCAAA;AAAA,kCACC,SAAA,EAAU,0BAAA;AAAA,kCACV,KAAA,EAAO,EAAE,QAAA,EAAU,WAAA,GAAc,UAAU,OAAA,EAAQ;AAAA,kCAElD,QAAA,EAAA,GAAA,CAAI;AAAA;AAAA,+BACP;AAAA,8BAEC,+BACCA,GAAAA;AAAA,gCAAC,MAAA;AAAA,gCAAA;AAAA,kCACC,SAAA,EAAU,kJAAA;AAAA,kCACV,KAAA,EAAO;AAAA,oCACL,UAAA,EAAY,KAAA;AAAA,oCACZ,OAAA,EAAS,YAAY,CAAA,GAAI,CAAA;AAAA,oCACzB,aAAA,EAAe,YAAY,MAAA,GAAS;AAAA,mCACtC;AAAA,kCACA,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,oCAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,oCAAA,cAAA,CAAe,GAAA,CAAI,EAAA,EAAI,GAAA,CAAI,IAAI,CAAA;AAAA,kCACjC,CAAA;AAAA,kCACA,IAAA,EAAK,QAAA;AAAA,kCACL,YAAA,EAAY,CAAA,MAAA,EAAS,GAAA,CAAI,IAAI,CAAA,CAAA;AAAA,kCAE7B,QAAA,kBAAAA,GAAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAU,+DAAA,EAAgE;AAAA;AAAA,+BAC1F;AAAA,8BAGD,4BACCA,GAAAA;AAAA,gCAAC,MAAA;AAAA,gCAAA;AAAA,kCACC,SAAA,EAAU,sDAAA;AAAA,kCACV,KAAA,EAAO;AAAA,oCACL,MAAA,EAAQ,KAAA;AAAA,oCACR,UAAA,EAAY,MAAA,CAAO,MAAA,CAAO,OAAA,IAAW;AAAA;AACvC;AAAA;AACF;AAAA,2BAAA;AAAA,0BA5DG,CAAA,EAAG,GAAA,CAAI,EAAE,CAAA,CAAA,EAAI,GAAG,CAAA;AAAA,yBA8DvB;AAAA,sBAEJ,CAAC;AAAA;AAAA,mBACH;AAAA,kCAGAC,IAAAA;AAAA,oBAAC,KAAA;AAAA,oBAAA;AAAA,sBACC,SAAA,EAAU,8DAAA;AAAA,sBACV,KAAA,EAAO,EAAE,WAAA,EAAa,MAAA,CAAO,OAAO,MAAA,EAAO;AAAA,sBAG3C,QAAA,EAAA;AAAA,wCAAAD,GAAAA;AAAA,0BAAC,QAAA;AAAA,0BAAA;AAAA,4BACC,OAAA,EAAS,aAAA;AAAA,4BACT,SAAA,EAAU,wDAAA;AAAA,4BACV,YAAA,EAAW,UAAA;AAAA,4BACX,KAAA,EAAM,UAAA;AAAA,4BAEN,QAAA,kBAAAA,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,sCAAA,EAAuC;AAAA;AAAA,yBAC7D;AAAA,wCAGAA,GAAAA;AAAA,0BAAC,QAAA;AAAA,0BAAA;AAAA,4BACC,OAAA,EAAS,mBAAA;AAAA,4BACT,UAAU,CAAC,cAAA;AAAA,4BACX,iBAAe,CAAC,cAAA;AAAA,4BAChB,SAAA,EAAW,mCACT,oBAAA,GAAuB,kBAAA,GAAqB,wBAC9C,CAAA,CAAA,EAAI,CAAC,cAAA,GAAiB,yCAAA,GAA4C,EAAE,CAAA,CAAA;AAAA,4BACpE,YAAA,EAAW,sBAAA;AAAA,4BACX,KAAA,EACE,iBAAiB,sBAAA,GAAyB,yBAAA;AAAA,4BAG5C,QAAA,kBAAAA,GAAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAU,sCAAA,EAAuC;AAAA;AAAA,yBAChE;AAAA,wBAGC,kCACCA,GAAAA;AAAA,0BAAC,QAAA;AAAA,0BAAA;AAAA,4BACC,OAAA,EAAS,iBAAA;AAAA,4BACT,SAAA,EAAU,wDAAA;AAAA,4BACV,YAAA,EAAW,aAAA;AAAA,4BACX,KAAA,EAAM,aAAA;AAAA,4BAEN,QAAA,kBAAAA,GAAAA,CAAC,gBAAA,EAAA,EAAiB,SAAA,EAAU,sCAAA,EAAuC;AAAA;AAAA,yBACrE;AAAA,wBAAA,CAIA,cAAA,IAAkB,SAAA,MAAe,eAAA,IAAmB,OAAA,CAAA,oBACpDA,GAAAA;AAAA,0BAAC,QAAA;AAAA,0BAAA;AAAA,4BACC,SAAS,eAAA,IAAmB,OAAA;AAAA,4BAC5B,SAAA,EAAU,wDAAA;AAAA,4BACV,YAAA,EAAW,OAAA;AAAA,4BAEX,QAAA,kBAAAA,GAAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAU,sCAAA,EAAuC;AAAA;AAAA;AAC9D;AAAA;AAAA;AAEJ;AAAA;AAAA,aACF;AAAA,4BAGAC,IAAAA,CAACU,eAAAA,EAAA,EACE,QAAA,EAAA;AAAA,cAAA,oBAAA,IAAwB,kCACvBX,GAAAA;AAAA,gBAAC,gBAAA;AAAA,gBAAA;AAAA,kBACC,eAAe,aAAA,CAAc,aAAA;AAAA,kBAC7B,uBAAuB,IAAA,CAAK,cAAA;AAAA,kBAC5B,QAAA,EAAU,wBAAA;AAAA,kBACV,OAAA,EAAS;AAAA;AAAA,eACX;AAAA,cAED,oBAAA,IAAwB,CAAC,cAAA,oBACxBA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qFAAA,EACb,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iCAAA,EAAkC,mDAEjD,CAAA,EACF;AAAA,aAAA,EAEJ,CAAA;AAAA,4BAEAA,GAAAA,CAACW,eAAAA,EAAA,EACE,4CACCX,GAAAA;AAAA,cAAC,aAAA;AAAA,cAAA;AAAA,gBACC,QAAA,EAAU,cAAA;AAAA,gBACV,MAAA,EAAQ;AAAA;AAAA,aACV,EAEJ,CAAA;AAAA,4BAGAC,IAAAA,CAAC,iBAAA,EAAA,EAAkB,GAAA,EAAK,oBAAA,EACtB,QAAA,EAAA;AAAA,8BAAAD,GAAAA;AAAA,gBAAC,WAAA;AAAA,gBAAA;AAAA,kBACC,UAAU,IAAA,CAAK,QAAA;AAAA,kBACf,iBAAiB,IAAA,CAAK,eAAA;AAAA,kBACtB,kBAAkB,aAAA,CAAc,gBAAA;AAAA,kBAChC,cAAc,IAAA,CAAK,SAAA;AAAA,kBACnB,aAAA,EAAe,sBAAA;AAAA,kBACf,aAAA,EAAe;AAAA;AAAA,eACjB;AAAA,cAGC,uCACCA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBACb,QAAA,kBAAAA,GAAAA;AAAA,gBAAC,sBAAA;AAAA,gBAAA;AAAA,kBACC,aAAa,mBAAA,CAAoB,WAAA;AAAA,kBACjC,SAAS,MAAM;AACb,oBAAA,mBAAA,CAAoB,QAAQ,IAAI,CAAA;AAChC,oBAAA,sBAAA,CAAuB,IAAI,CAAA;AAAA,kBAC7B,CAAA;AAAA,kBACA,QAAQ,MAAM;AACZ,oBAAA,mBAAA,CAAoB,QAAQ,KAAK,CAAA;AACjC,oBAAA,sBAAA,CAAuB,IAAI,CAAA;AAAA,kBAC7B;AAAA;AAAA,eACF,EACF,CAAA;AAAA,cAKD,mBAAmB,eAAA,oBAClBA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBACb,QAAA,kBAAAA,GAAAA;AAAA,gBAAC,kBAAA;AAAA,gBAAA;AAAA,kBACC,QAAA,EAAU,eAAA;AAAA,kBACV,QAAA,EAAU,CAAC,MAAA,KAAW;AACpB,oBAAA,eAAA,CAAgB,QAAQ,MAAM,CAAA;AAC9B,oBAAA,kBAAA,CAAmB,IAAI,CAAA;AACvB,oBAAA,kBAAA,CAAmB,IAAI,CAAA;AAAA,kBACzB;AAAA;AAAA,eACF,EACF;AAAA,aAAA,EAEJ,CAAA;AAAA,4BAGAC,IAAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAU,wBAAA;AAAA,gBACV,KAAA,EAAO,EAAE,WAAA,EAAa,MAAA,CAAO,OAAO,MAAA,EAAO;AAAA,gBAE1C,QAAA,EAAA;AAAA,kBAAA,UAAA,oBACCA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mMAAA,EACb,QAAA,EAAA;AAAA,oCAAAA,IAAAA,CAAC,SAAI,SAAA,EAAU,2FAAA,EAA4F,OAAM,4BAAA,EAA6B,IAAA,EAAK,MAAA,EAAO,OAAA,EAAQ,WAAA,EAChK,QAAA,EAAA;AAAA,sCAAAD,GAAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,iBAAA,EAAkB,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,CAAA,EAAE,IAAA,EAAK,MAAA,EAAO,cAAA,EAAe,aAAY,GAAA,EAAI,CAAA;AAAA,sCACjGA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mBAAkB,IAAA,EAAK,cAAA,EAAe,GAAE,6CAAA,EAA8C;AAAA,qBAAA,EACxG,CAAA;AAAA,oCACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yDAAyD,QAAA,EAAA,UAAA,EAAW;AAAA,mBAAA,EACtF,CAAA;AAAA,kBAAA,CAEA,IAAA,CAAK,gBAAA,CAAiB,MAAA,GAAS,CAAA,IAAM,CAAC,IAAA,CAAK,SAAA,IAAa,0BAAA,CAA2B,OAAA,CAAQ,MAAA,GAAS,CAAA,qBACpGA,GAAAA;AAAA,oBAAC,gBAAA;AAAA,oBAAA;AAAA,sBACC,SAAS,IAAA,CAAK,gBAAA,CAAiB,SAAS,CAAA,GAAI,IAAA,CAAK,mBAAmB,0BAAA,CAA2B,OAAA;AAAA,sBAC/F,aAAA,EAAe,CAAC,MAAA,KAAW,UAAA,CAAW,OAAO,OAAO;AAAA;AAAA,mBACtD;AAAA,kBAED,OAAO,QAAA,CAAS,aAAA,oBAAiBA,GAAAA,CAAC,kBAAe,MAAA,EAAgB,CAAA;AAAA,kCAClEA,GAAAA;AAAA,oBAAC,cAAA;AAAA,oBAAA;AAAA,sBACC,MAAA,EAAQ,UAAA;AAAA,sBACR,MAAA,EAAQ,UAAA;AAAA,sBACR,WAAA,EAAY,iBAAA;AAAA,sBACZ,WAAW,IAAA,CAAK;AAAA;AAAA;AAClB;AAAA;AAAA;AACF;AAAA;AAAA;AACF;AAAA,GACF;AAGF,EAAA,MAAM,aAAA,GACJ,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,SAAS,MAAA,CAAO,KAAK,CAAA,EAAG,EAAE,CAAA,IAAK,GAAA;AAGrE,EAAA,IAAI,YAAY,UAAA,EAAY;AAC1B,IAAA,uBACEA,GAAAA,CAAC,eAAA,EAAA,EAAgB,MAAA,EAAQ,YACvB,QAAA,kBAAAA,GAAAA;AAAA,MAAC,gBAAA;AAAA,MAAA;AAAA,QACC,QAAA;AAAA,QACA,KAAA,EAAO,aAAA;AAAA,QACP,WAAA;AAAA,QAEC,QAAA,EAAA,CAAC,EAAE,KAAA,EAAO,YAAA,EAAc,cAAa,KACpC,oBAAA,CAAqB,KAAA,EAAO,IAAA,EAAM,YAAY;AAAA;AAAA,KAElD,EACF,CAAA;AAAA,EAEJ;AAGA,EAAA,MAAM,UAAU,QAAA,KAAa,OAAA;AAC7B,EAAA,MAAM,QAAA,GAAW,UAAU,MAAA,GAAS,OAAA;AAGpC,EAAA,MAAM,UAAA,GAAa,WAAA,mBACjBA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,4BAAA,EAA6B,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,SAAA,EAAU,WAAA,EAAY,GAAA,EAAI,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,OAAA,EACnK,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,gCAAA,EAAiC,GAC3C,CAAA,mBAEAA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,4BAAA,EAA6B,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,SAAA,EAAU,aAAY,GAAA,EAAI,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,OAAA,EAClK,QAAA,EAAA,OAAA,mBAAUA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,eAAA,EAAgB,CAAA,mBAAKA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,kBAAiB,CAAA,EACnE,CAAA;AAGF,EAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,QAAA,EAAU,UAAA,EAAY,UAAA,EAAY,CAAA,EAAG,MAAA,EAAQ,MAAA,EAAO,EAEhE,QAAA,EAAA;AAAA,oBAAAD,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,iBAAA;AAAA,QACL,WAAA,EAAa,uBAAA;AAAA,QACb,OAAA,EAAS,mBAAA;AAAA,QACT,KAAA,EAAO;AAAA,UACL,QAAA,EAAU,UAAA;AAAA,UACV,CAAC,QAAQ,GAAG,OAAA;AAAA,UACZ,GAAA,EAAK,KAAA;AAAA,UACL,SAAA,EAAW,kBAAA;AAAA,UACX,MAAA,EAAQ,EAAA;AAAA,UACR,KAAA,EAAO,MAAA;AAAA,UACP,MAAA,EAAQ,MAAA;AAAA,UACR,OAAA,EAAS,MAAA;AAAA,UACT,UAAA,EAAY,QAAA;AAAA,UACZ,cAAA,EAAgB,QAAA;AAAA,UAChB,UAAA,EAAY,MAAA;AAAA,UACZ,MAAA,EAAQ,mBAAA;AAAA,UACR,CAAC,OAAA,GAAU,aAAA,GAAgB,YAAY,GAAG,MAAA;AAAA,UAC1C,YAAA,EAAc,UAAU,aAAA,GAAgB,aAAA;AAAA,UACxC,MAAA,EAAQ,cAAc,SAAA,GAAY,YAAA;AAAA,UAClC,SAAA,EAAW,2BAAA;AAAA,UACX,OAAA,EAAS,CAAA;AAAA,UACT,OAAA,EAAS;AAAA,SACX;AAAA,QACA,YAAA,EAAY,cAAc,cAAA,GAAiB,yBAAA;AAAA,QAE1C,QAAA,EAAA;AAAA;AAAA,KACH;AAAA,oBAGAA,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,kBAAA;AAAA,QACL,KAAA,EAAO;AAAA,UACL,KAAA,EAAO,GAAG,aAAa,CAAA,EAAA,CAAA;AAAA,UACvB,MAAA,EAAQ,MAAA;AAAA,UACR,OAAA,EAAS,cAAc,MAAA,GAAS,OAAA;AAAA,UAChC,QAAA,EAAU;AAAA,SACZ;AAAA,QAEA,QAAA,kBAAAA,IAAC,eAAA,EAAA,EAAgB,MAAA,EAAQ,YACtB,QAAA,EAAA,oBAAA,CAAqB,MAAA,EAAW,KAAA,EAAO,MAAM,CAAA,EAChD;AAAA;AAAA;AACF,GAAA,EACF,CAAA;AAEJ;AAGA,SAAS,QAAA,CAAS,EAAE,SAAA,EAAU,EAA2B;AACvD,EAAA,uBACEC,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAM,4BAAA;AAAA,MACN,KAAA,EAAM,IAAA;AAAA,MACN,MAAA,EAAO,IAAA;AAAA,MACP,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MACL,MAAA,EAAO,cAAA;AAAA,MACP,WAAA,EAAY,GAAA;AAAA,MACZ,aAAA,EAAc,OAAA;AAAA,MACd,cAAA,EAAe,OAAA;AAAA,MACf,SAAA;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,UAAA,EAAW,CAAA;AAAA,wBACnBA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,UAAA,EAAW;AAAA;AAAA;AAAA,GACrB;AAEJ;AAEA,SAAS,WAAA,CAAY,EAAE,SAAA,EAAU,EAA2B;AAC1D,EAAA,uBACEC,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAM,4BAAA;AAAA,MACN,KAAA,EAAM,IAAA;AAAA,MACN,MAAA,EAAO,IAAA;AAAA,MACP,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MACL,MAAA,EAAO,cAAA;AAAA,MACP,WAAA,EAAY,GAAA;AAAA,MACZ,aAAA,EAAc,OAAA;AAAA,MACd,cAAA,EAAe,OAAA;AAAA,MACf,SAAA;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,mDAAA,EAAoD,CAAA;AAAA,wBAC5DA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,UAAA,EAAW,CAAA;AAAA,wBACnBA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,aAAA,EAAc;AAAA;AAAA;AAAA,GACxB;AAEJ;AAEA,SAAS,YAAA,CAAa,EAAE,SAAA,EAAU,EAA2B;AAC3D,EAAA,uBACEC,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAM,4BAAA;AAAA,MACN,KAAA,EAAM,IAAA;AAAA,MACN,MAAA,EAAO,IAAA;AAAA,MACP,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MACL,MAAA,EAAO,cAAA;AAAA,MACP,WAAA,EAAY,KAAA;AAAA,MACZ,aAAA,EAAc,OAAA;AAAA,MACd,cAAA,EAAe,OAAA;AAAA,MACf,SAAA;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,YAAA,EAAa,CAAA;AAAA,wBACrBA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,YAAA,EAAa;AAAA;AAAA;AAAA,GACvB;AAEJ;AAEA,SAAS,gBAAA,CAAiB,EAAE,SAAA,EAAU,EAA2B;AAC/D,EAAA,uBACEA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAM,4BAAA;AAAA,MACN,KAAA,EAAM,IAAA;AAAA,MACN,MAAA,EAAO,IAAA;AAAA,MACP,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MACL,MAAA,EAAO,cAAA;AAAA,MACP,WAAA,EAAY,GAAA;AAAA,MACZ,aAAA,EAAc,OAAA;AAAA,MACd,cAAA,EAAe,OAAA;AAAA,MACf,SAAA;AAAA,MAEA,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,eAAA,EAAgB;AAAA;AAAA,GAC1B;AAEJ;AAEA,SAAS,SAAA,CAAU,EAAE,SAAA,EAAU,EAA2B;AACxD,EAAA,uBACEC,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAM,4BAAA;AAAA,MACN,KAAA,EAAM,IAAA;AAAA,MACN,MAAA,EAAO,IAAA;AAAA,MACP,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MACL,MAAA,EAAO,cAAA;AAAA,MACP,WAAA,EAAY,GAAA;AAAA,MACZ,aAAA,EAAc,OAAA;AAAA,MACd,cAAA,EAAe,OAAA;AAAA,MACf,SAAA;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,YAAA,EAAa,CAAA;AAAA,wBACrBA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,YAAA,EAAa;AAAA;AAAA;AAAA,GACvB;AAEJ;AC3/CA,IAAM,WAAA,GAAcc,cAAuC,IAAI,CAAA;AASxD,SAAS,YAAA,CAAa;AAAA,EAC3B,QAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,EAAsB;AAEpB,EAAA,MAAM,SAAA,GAAYlB,OAA0B,IAAI,CAAA;AAEhD,EAAA,IAAI,CAAC,UAAU,OAAA,EAAS;AACtB,IAAA,SAAA,CAAU,OAAA,GAAU,IAAI,UAAA,CAAW,EAAE,WAAW,MAAA,EAAQ,KAAA,EAAO,WAAW,CAAA;AAAA,EAC5E;AAEA,EAAA,MAAM,SAAS,SAAA,CAAU,OAAA;AAGzB,EAAAC,UAAU,MAAM;AACd,IAAA,OAAO,MAAM;AACX,MAAA,MAAA,CAAO,OAAA,EAAQ;AAAA,IACjB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAA,MAAM,KAAA,GAAQa,QAAQ,OAAO,EAAE,QAAO,CAAA,EAAI,CAAC,MAAM,CAAC,CAAA;AAGlD,EAAA,uBAAOV,GAAAA,CAAC,WAAA,CAAY,QAAA,EAAZ,EAAqB,OAAe,QAAA,EAAgB,CAAA;AAC9D","file":"index.js","sourcesContent":["/**\n * Utility functions\n */\n\n/**\n * Merge class names, filtering out falsy values\n */\nexport const cn = (...classes: (string | undefined | null | false)[]): string =>\n classes.filter(Boolean).join(\" \");\n\n/**\n * Format timestamp for display\n */\nexport const formatTime = (date: Date): string =>\n date.toLocaleTimeString(\"en-US\", {\n hour: \"numeric\",\n minute: \"2-digit\",\n });\n\n/**\n * Format conversation date for display\n */\nexport const formatConversationDate = (dateStr: string): string => {\n const date = new Date(dateStr);\n const now = new Date();\n const diffDays = Math.floor(\n (now.getTime() - date.getTime()) / (1000 * 60 * 60 * 24)\n );\n\n if (diffDays === 0) return \"Today\";\n if (diffDays === 1) return \"Yesterday\";\n if (diffDays < 7) return `${diffDays} days ago`;\n return date.toLocaleDateString();\n};\n\n/**\n * Generate unique message ID\n */\nexport const generateMessageId = (prefix: \"user\" | \"bot\" | \"welcome\" | \"history\"): string =>\n `${prefix}-${Date.now()}`;\n","/**\n * Static configuration values\n */\n\nimport type { Model } from \"./types\";\n\nexport const AVAILABLE_MODELS: Model[] = [\n { id: \"gpt-4o\", name: \"GPT-4o\", provider: \"OpenAI\" },\n { id: \"gpt-5-mini\", name: \"GPT-5 Mini\", provider: \"OpenAI\" },\n { id: \"gpt-5.2\", name: \"GPT-5.2\", provider: \"OpenAI\" },\n { id: \"gpt-5.2-pro\", name: \"GPT-5.2 Pro\", provider: \"OpenAI\" },\n { id: \"claude-haiku-4-5-20251001\", name: \"Haiku 4.5\", provider: \"Anthropic\" },\n { id: \"claude-sonnet-4-5-20250929\", name: \"Sonnet 4.5\", provider: \"Anthropic\" },\n { id: \"claude-opus-4-5-20251203\", name: \"Opus 4.5\", provider: \"Anthropic\" },\n];\n\nexport const DEFAULT_MODEL = \"claude-sonnet-4-5-20250929\";\n\nexport const DEFAULT_WELCOME_MESSAGE = \"Hi! How can I help you today?\";\n\nexport const MESSAGES_CONTAINER_ID = \"crow-messages-container\";\n","/**\n * useChat - Manages chat state and streaming\n */\n\nimport { useState, useRef, useCallback, useEffect } from \"react\";\nimport type { SuggestedAction } from \"@usecrow/client\";\nimport type { Message, ToolCall } from \"../types\";\nimport { generateMessageId } from \"../utils\";\nimport { DEFAULT_WELCOME_MESSAGE } from \"../constants\";\n\ninterface WorkflowEvent {\n type: \"started\" | \"todo_updated\" | \"ended\" | \"complete_prompt\";\n name?: string;\n todos?: Array<{ id: string; text: string; status: \"pending\" | \"completed\" }>;\n todoId?: string;\n todoStatus?: \"pending\" | \"completed\";\n}\n\ninterface ToolCallEvent {\n type: \"start\" | \"complete\" | \"client_call\" | \"consent_required\";\n toolName: string;\n toolCallId?: string; // Unique ID for client-side tool calls (to send results back)\n arguments?: Record<string, unknown>;\n success?: boolean;\n}\n\ninterface UseChatOptions {\n productId: string;\n apiUrl?: string;\n /** Whether to persist anonymous conversations across page refreshes (default: true) */\n persistAnonymousConversations?: boolean;\n /** Custom welcome message (uses SDK default if not provided) */\n welcomeMessage?: string;\n /** AI model to use for this chat (defaults to DEFAULT_MODEL) */\n selectedModel?: string;\n /** Subdomain for multi-endpoint products (routes to specific backend config) */\n subdomain?: string;\n /** Per-tool consent settings — when a tool has requires_consent, show Allow/Deny before executing */\n toolConsentSettings?: Record<string, { requires_consent: boolean }>;\n /** ISO 639-1 language code (e.g., \"es\", \"fr\") — AI will respond in this language */\n language?: string;\n onVerificationStatus?: (isVerified: boolean) => void;\n onConversationId?: (id: string) => void;\n onWorkflowEvent?: (event: WorkflowEvent) => void;\n onToolCall?: (toolCall: ToolCallEvent) => void;\n onToolResult?: (toolName: string, result: Record<string, unknown>) => void;\n onRestoredConversation?: (conversationId: string) => void;\n}\n\nconst getConversationStorageKey = (productId: string) => `crow_conv_${productId}`;\n\nexport function useChat({\n productId,\n apiUrl = \"\",\n persistAnonymousConversations,\n welcomeMessage,\n selectedModel: initialSelectedModel,\n subdomain,\n toolConsentSettings,\n language,\n onVerificationStatus,\n onConversationId,\n onWorkflowEvent,\n onToolCall,\n onToolResult,\n onRestoredConversation,\n}: UseChatOptions) {\n // Use custom welcome message if provided, otherwise use SDK default\n const effectiveWelcomeMessage = welcomeMessage || DEFAULT_WELCOME_MESSAGE;\n \n const [messages, setMessages] = useState<Message[]>([\n {\n id: \"welcome\",\n content: effectiveWelcomeMessage,\n isBot: true,\n timestamp: new Date(),\n },\n ]);\n const [isLoading, setIsLoading] = useState(false);\n const [activeToolCalls, setActiveToolCalls] = useState<ToolCall[]>([]);\n // Start with null - conditional restoration happens in effect based on persistAnonymousConversations\n const [conversationId, setConversationId] = useState<string | null>(null);\n const [selectedModel, setSelectedModel] = useState<string | undefined>(initialSelectedModel);\n const [suggestedActions, setSuggestedActions] = useState<SuggestedAction[]>([]);\n\n const abortControllerRef = useRef<AbortController | null>(null);\n const hasCheckedPersistRef = useRef(false);\n // Track tool calls during streaming to commit to message on completion\n const streamingToolCallsRef = useRef<ToolCall[]>([]);\n // Keep latest consent settings accessible inside streaming callbacks\n const toolConsentSettingsRef = useRef(toolConsentSettings);\n toolConsentSettingsRef.current = toolConsentSettings;\n\n // Sync selectedModel when it arrives from API (initialSelectedModel is undefined on first render)\n useEffect(() => {\n if (initialSelectedModel) {\n setSelectedModel((prev) => prev !== initialSelectedModel ? initialSelectedModel : prev);\n }\n }, [initialSelectedModel]);\n\n // Update welcome message if it changes and no conversation has started\n useEffect(() => {\n // Only update if there's exactly one message (the welcome message) and no conversation started\n if (messages.length === 1 && messages[0].id === \"welcome\") {\n setMessages([\n {\n id: \"welcome\",\n content: effectiveWelcomeMessage,\n isBot: true,\n timestamp: new Date(),\n },\n ]);\n }\n }, [effectiveWelcomeMessage]);\n\n // Conditionally restore conversation based on persistAnonymousConversations setting\n useEffect(() => {\n // Wait for setting to load (undefined = still loading)\n if (persistAnonymousConversations === undefined || hasCheckedPersistRef.current) {\n return;\n }\n hasCheckedPersistRef.current = true;\n\n if (persistAnonymousConversations) {\n // Restore from localStorage\n try {\n const storedId = localStorage.getItem(getConversationStorageKey(productId));\n if (storedId) {\n setConversationId(storedId);\n onRestoredConversation?.(storedId);\n }\n } catch {\n // localStorage unavailable\n }\n } else {\n // Clear any stored conversation - user doesn't want persistence\n try {\n localStorage.removeItem(getConversationStorageKey(productId));\n } catch {\n // localStorage unavailable\n }\n }\n }, [persistAnonymousConversations, productId, onRestoredConversation]);\n\n const streamFromBackend = useCallback(\n async (message: string, botMsgId: string) => {\n let accumulatedText = \"\";\n let firstChunk = true;\n // Queue client tool calls to execute after stream completes\n const pendingClientTools: Array<{\n toolName: string;\n toolCallId: string;\n arguments: Record<string, unknown>;\n }> = [];\n\n abortControllerRef.current = new AbortController();\n\n try {\n const identityToken = window.__crow_identity_token;\n\n const response = await fetch(`${apiUrl}/api/chat/message`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n product_id: productId,\n message,\n conversation_id: conversationId,\n identity_token: identityToken,\n model: selectedModel,\n subdomain,\n user_timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n user_local_time: new Date().toLocaleString('en-US', { year: 'numeric', month: 'long', day: 'numeric', hour: 'numeric', minute: 'numeric', hour12: true }),\n page_path: typeof window !== \"undefined\" ? window.location.pathname : undefined,\n context: typeof window !== \"undefined\" ? (window as any).__crow_page_context : undefined,\n ...(language && language !== 'en' ? { language } : {}),\n }),\n signal: abortControllerRef.current.signal,\n });\n\n if (!response.ok) {\n if (response.status === 401 && typeof window !== 'undefined') {\n // Token expired - emit refresh event\n window.dispatchEvent(new CustomEvent('crow:token-refresh-needed'));\n }\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n const reader = response.body?.getReader();\n const decoder = new TextDecoder();\n\n if (reader) {\n let buffer = \"\";\n\n while (true) {\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 if (line.startsWith(\"data: \")) {\n const data = line.slice(6).trim();\n if (data === \"[DONE]\") {\n setIsLoading(false);\n \n // Commit tool calls to the bot message so they persist\n const finalToolCalls = [...streamingToolCallsRef.current];\n if (finalToolCalls.length > 0) {\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === botMsgId\n ? { ...msg, toolCalls: finalToolCalls, thinkingComplete: true }\n : msg\n )\n );\n } else {\n // Still mark thinking as complete even without tool calls\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === botMsgId\n ? { ...msg, thinkingComplete: true }\n : msg\n )\n );\n }\n \n // Clear active tool calls (now committed to message)\n setActiveToolCalls([]);\n streamingToolCallsRef.current = [];\n \n // Execute queued client tool calls after stream completes\n for (const tool of pendingClientTools) {\n onToolCall?.({\n type: \"client_call\",\n toolName: tool.toolName,\n toolCallId: tool.toolCallId,\n arguments: tool.arguments,\n });\n }\n return;\n }\n\n try {\n const parsed = JSON.parse(data);\n\n switch (parsed.type) {\n case \"verification_status\":\n onVerificationStatus?.(parsed.is_verified === true);\n break;\n\n case \"conversation_id\":\n if (parsed.conversation_id) {\n setConversationId(parsed.conversation_id);\n // Only persist to localStorage if setting is enabled\n if (persistAnonymousConversations === true) {\n try {\n localStorage.setItem(\n getConversationStorageKey(productId),\n parsed.conversation_id\n );\n } catch {\n // localStorage may be unavailable\n }\n }\n onConversationId?.(parsed.conversation_id);\n }\n break;\n\n case \"thinking\":\n if (parsed.status === \"complete\") {\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === botMsgId\n ? { ...msg, thinkingComplete: true }\n : msg\n )\n );\n }\n break;\n\n case \"thinking_token\":\n if (parsed.content) {\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === botMsgId\n ? { ...msg, thinking: (msg.thinking || \"\") + parsed.content }\n : msg\n )\n );\n }\n break;\n\n case \"content\":\n if (firstChunk) firstChunk = false;\n accumulatedText += parsed.content;\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === botMsgId\n ? { ...msg, content: accumulatedText }\n : msg\n )\n );\n break;\n\n case \"citations\":\n if (parsed.citations) {\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === botMsgId\n ? { ...msg, citations: parsed.citations }\n : msg\n )\n );\n }\n break;\n\n case \"error\":\n if (parsed.message) {\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === botMsgId\n ? { ...msg, content: parsed.message }\n : msg\n )\n );\n }\n break;\n\n case \"tool_call_start\":\n onToolCall?.({\n type: \"start\",\n toolName: parsed.tool_name,\n arguments: parsed.arguments,\n });\n const newToolCall: ToolCall = {\n id: `tool-${Date.now()}`,\n name: parsed.tool_name,\n displayName: parsed.display_name || undefined,\n arguments: parsed.arguments || {},\n status: \"executing\",\n timestamp: new Date(),\n };\n streamingToolCallsRef.current = [...streamingToolCallsRef.current, newToolCall];\n setActiveToolCalls((prev) => [...prev, newToolCall]);\n break;\n\n case \"tool_call_complete\":\n onToolCall?.({\n type: \"complete\",\n toolName: parsed.tool_name,\n success: parsed.success,\n });\n const newStatus = parsed.success ? \"complete\" : \"error\";\n let updated = false;\n streamingToolCallsRef.current = streamingToolCallsRef.current.map((tool) => {\n if (!updated && tool.name === parsed.tool_name && tool.status === \"executing\") {\n updated = true;\n return { ...tool, status: newStatus as \"complete\" | \"error\" };\n }\n return tool;\n });\n setActiveToolCalls((prev) => {\n let updated = false;\n return prev.map((tool) => {\n if (!updated && tool.name === parsed.tool_name && tool.status === \"executing\") {\n updated = true;\n return { ...tool, status: newStatus as \"complete\" | \"error\" };\n }\n return tool;\n });\n });\n break;\n\n case \"tool_result_links\":\n if (parsed.links && Array.isArray(parsed.links)) {\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === botMsgId\n ? { ...msg, links: [...(msg.links || []), ...parsed.links] }\n : msg\n )\n );\n }\n break;\n\n case \"tool_result\":\n if (parsed.tool_name && parsed.result) {\n onToolResult?.(parsed.tool_name, parsed.result);\n // Store result on the first matching ToolCall without a result yet\n let resultUpdated = false;\n streamingToolCallsRef.current = streamingToolCallsRef.current.map((tool) => {\n if (!resultUpdated && tool.name === parsed.tool_name && !tool.result) {\n resultUpdated = true;\n return { ...tool, result: parsed.result };\n }\n return tool;\n });\n setActiveToolCalls((prev) => {\n let updated = false;\n return prev.map((tool) => {\n if (!updated && tool.name === parsed.tool_name && !tool.result) {\n updated = true;\n return { ...tool, result: parsed.result };\n }\n return tool;\n });\n });\n }\n break;\n\n case \"client_tool_call\":\n {\n const needsConsent = toolConsentSettingsRef.current?.[parsed.tool_name]?.requires_consent === true;\n // Emit start event for consistency with server-side tools\n onToolCall?.({\n type: \"start\",\n toolName: parsed.tool_name,\n arguments: parsed.arguments,\n });\n if (needsConsent) {\n // Show Allow/Deny UI instead of executing immediately\n const consentClientTc: ToolCall = {\n id: parsed.tool_call_id || `tool-${Date.now()}`,\n name: parsed.tool_name,\n displayName: parsed.display_name || undefined,\n arguments: parsed.arguments || {},\n status: \"awaiting_consent\",\n requiresConsent: true,\n timestamp: new Date(),\n };\n streamingToolCallsRef.current = [...streamingToolCallsRef.current, consentClientTc];\n setActiveToolCalls((prev) => [...prev, consentClientTc]);\n } else {\n // No consent required — original flow\n const clientToolCall: ToolCall = {\n id: parsed.tool_call_id || `tool-${Date.now()}`,\n name: parsed.tool_name,\n displayName: parsed.display_name || undefined,\n arguments: parsed.arguments || {},\n status: \"executing\",\n timestamp: new Date(),\n };\n streamingToolCallsRef.current = [...streamingToolCallsRef.current, clientToolCall];\n setActiveToolCalls((prev) => [...prev, clientToolCall]);\n pendingClientTools.push({\n toolName: parsed.tool_name,\n toolCallId: parsed.tool_call_id,\n arguments: parsed.arguments,\n });\n }\n }\n break;\n\n case \"tool_consent_required\":\n // Server-side tool needs user consent before executing\n // Stream will end after this event (backend breaks stream)\n // Update the EXISTING tool call (from tool_call_start) to awaiting_consent\n onToolCall?.({\n type: \"consent_required\",\n toolName: parsed.tool_name,\n arguments: parsed.arguments,\n });\n {\n const existingIdx = streamingToolCallsRef.current.findIndex(\n (tc) => tc.name === parsed.tool_name && tc.status === \"executing\"\n );\n if (existingIdx >= 0) {\n const existing = streamingToolCallsRef.current[existingIdx];\n const updatedTc: ToolCall = {\n ...existing,\n status: \"awaiting_consent\",\n requiresConsent: true,\n serverSideExecution: true,\n arguments: parsed.arguments || existing.arguments,\n };\n streamingToolCallsRef.current = streamingToolCallsRef.current.map(\n (tc, i) => (i === existingIdx ? updatedTc : tc)\n );\n setActiveToolCalls((prev) =>\n prev.map((tc) => (tc.id === existing.id ? updatedTc : tc))\n );\n } else {\n // Fallback: create new entry if no existing tool call found\n const consentToolCall: ToolCall = {\n id: `consent-${Date.now()}`,\n name: parsed.tool_name,\n displayName: parsed.display_name || undefined,\n arguments: parsed.arguments || {},\n status: \"awaiting_consent\",\n requiresConsent: true,\n serverSideExecution: true,\n timestamp: new Date(),\n };\n streamingToolCallsRef.current = [...streamingToolCallsRef.current, consentToolCall];\n setActiveToolCalls((prev) => [...prev, consentToolCall]);\n }\n }\n break;\n\n case \"workflow_started\":\n onWorkflowEvent?.({\n type: \"started\",\n name: parsed.name,\n todos: parsed.todos,\n });\n break;\n\n case \"todo_updated\":\n onWorkflowEvent?.({\n type: \"todo_updated\",\n todoId: parsed.id,\n todoStatus: parsed.status,\n });\n break;\n\n case \"workflow_ended\":\n onWorkflowEvent?.({ type: \"ended\" });\n break;\n\n case \"workflow_complete_prompt\":\n onWorkflowEvent?.({ type: \"complete_prompt\" });\n break;\n\n case \"suggested_actions\":\n if (parsed.actions && Array.isArray(parsed.actions)) {\n setSuggestedActions(parsed.actions);\n }\n break;\n }\n } catch (e) {\n console.error(\"[Crow] Parse error:\", e);\n }\n }\n }\n }\n }\n } catch (error) {\n if (error instanceof Error && error.name === \"AbortError\") {\n if (accumulatedText) {\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === botMsgId ? { ...msg, content: accumulatedText } : msg\n )\n );\n } else {\n setMessages((prev) => prev.filter((msg) => msg.id !== botMsgId));\n }\n return;\n }\n\n console.error(\"[Crow] Error:\", error);\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === botMsgId\n ? { ...msg, content: \"Sorry, I encountered an error. Please try again.\" }\n : msg\n )\n );\n } finally {\n setIsLoading(false);\n abortControllerRef.current = null;\n }\n },\n [apiUrl, productId, conversationId, selectedModel, subdomain, persistAnonymousConversations, onVerificationStatus, onConversationId, onWorkflowEvent, onToolCall, onToolResult]\n );\n\n const sendMessage = useCallback(\n (content: string): { userMsgId: string; botMsgId: string } => {\n if (!content.trim()) {\n return { userMsgId: \"\", botMsgId: \"\" };\n }\n\n setActiveToolCalls([]);\n streamingToolCallsRef.current = [];\n setSuggestedActions([]);\n\n const userMsgId = generateMessageId(\"user\");\n const botMsgId = generateMessageId(\"bot\");\n\n setMessages((prev) => [\n ...prev,\n {\n id: userMsgId,\n content,\n isBot: false,\n timestamp: new Date(),\n },\n ]);\n\n setIsLoading(true);\n\n setMessages((prev) => [\n ...prev,\n {\n id: botMsgId,\n content: \"Thinking...\",\n isBot: true,\n timestamp: new Date(),\n },\n ]);\n\n streamFromBackend(content, botMsgId);\n\n return { userMsgId, botMsgId };\n },\n [streamFromBackend]\n );\n\n const stopGeneration = useCallback(() => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n setIsLoading(false);\n }\n }, []);\n\n const resetMessages = useCallback(() => {\n setMessages([\n {\n id: \"welcome\",\n content: effectiveWelcomeMessage,\n isBot: true,\n timestamp: new Date(),\n },\n ]);\n setConversationId(null);\n try {\n localStorage.removeItem(getConversationStorageKey(productId));\n } catch {\n // localStorage may be unavailable\n }\n }, [productId, effectiveWelcomeMessage]);\n\n const loadMessages = useCallback((historyMessages: Message[]) => {\n setMessages(historyMessages);\n }, []);\n\n /**\n * Submit the result of a client-side tool execution back to the agent.\n * The agent will receive this result and can continue the conversation.\n */\n const submitToolResult = useCallback(\n async (\n toolCallId: string,\n toolName: string,\n result: Record<string, unknown>\n ) => {\n if (!conversationId) {\n console.error(\"[Crow] Cannot submit tool result: no conversation ID\");\n return;\n }\n\n const botMsgId = generateMessageId(\"bot\");\n // Queue for any follow-up tool calls (e.g., if agent retries)\n const pendingClientTools: Array<{\n toolName: string;\n toolCallId: string;\n arguments: Record<string, unknown>;\n }> = [];\n\n // Add placeholder for agent response\n setMessages((prev) => [\n ...prev,\n {\n id: botMsgId,\n content: \"\",\n isBot: true,\n timestamp: new Date(),\n },\n ]);\n\n setIsLoading(true);\n\n try {\n const identityToken = window.__crow_identity_token;\n\n const response = await fetch(`${apiUrl}/api/chat/tool-result`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n product_id: productId,\n conversation_id: conversationId,\n tool_call_id: toolCallId,\n tool_name: toolName,\n result,\n identity_token: identityToken,\n model: selectedModel,\n subdomain,\n user_timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n user_local_time: new Date().toLocaleString('en-US', { year: 'numeric', month: 'long', day: 'numeric', hour: 'numeric', minute: 'numeric', hour12: true }),\n ...(language && language !== 'en' ? { language } : {}),\n }),\n });\n\n if (!response.ok) {\n if (response.status === 401 && typeof window !== 'undefined') {\n // Token expired - emit refresh event\n window.dispatchEvent(new CustomEvent('crow:token-refresh-needed'));\n }\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n const reader = response.body?.getReader();\n const decoder = new TextDecoder();\n let accumulatedText = \"\";\n\n if (reader) {\n let buffer = \"\";\n\n while (true) {\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 if (line.startsWith(\"data: \")) {\n const data = line.slice(6).trim();\n if (data === \"[DONE]\") {\n setIsLoading(false);\n\n // Commit tool calls to the bot message so they persist\n const finalToolCalls = [...streamingToolCallsRef.current];\n if (finalToolCalls.length > 0) {\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === botMsgId\n ? { ...msg, toolCalls: finalToolCalls, thinkingComplete: true }\n : msg\n )\n );\n } else {\n // Still mark thinking as complete even without tool calls\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === botMsgId\n ? { ...msg, thinkingComplete: true }\n : msg\n )\n );\n }\n\n // Clear active tool calls (now committed to message)\n setActiveToolCalls([]);\n streamingToolCallsRef.current = [];\n\n // Execute any queued tool calls (agent retries)\n for (const tool of pendingClientTools) {\n onToolCall?.({\n type: \"client_call\",\n toolName: tool.toolName,\n toolCallId: tool.toolCallId,\n arguments: tool.arguments,\n });\n }\n return;\n }\n\n try {\n const parsed = JSON.parse(data);\n\n switch (parsed.type) {\n case \"content\":\n accumulatedText += parsed.content;\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === botMsgId\n ? { ...msg, content: accumulatedText }\n : msg\n )\n );\n break;\n\n case \"thinking\":\n if (parsed.status === \"complete\") {\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === botMsgId\n ? { ...msg, thinkingComplete: true }\n : msg\n )\n );\n }\n break;\n\n case \"thinking_token\":\n if (parsed.content) {\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === botMsgId\n ? { ...msg, thinking: (msg.thinking || \"\") + parsed.content }\n : msg\n )\n );\n }\n break;\n\n case \"citations\":\n if (parsed.citations) {\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === botMsgId\n ? { ...msg, citations: parsed.citations }\n : msg\n )\n );\n }\n break;\n\n case \"tool_call_start\":\n onToolCall?.({\n type: \"start\",\n toolName: parsed.tool_name,\n arguments: parsed.arguments,\n });\n {\n const newTc: ToolCall = {\n id: `tool-${Date.now()}`,\n name: parsed.tool_name,\n displayName: parsed.display_name || undefined,\n arguments: parsed.arguments || {},\n status: \"executing\",\n timestamp: new Date(),\n };\n streamingToolCallsRef.current = [...streamingToolCallsRef.current, newTc];\n setActiveToolCalls((prev) => [...prev, newTc]);\n }\n break;\n\n case \"tool_call_complete\":\n onToolCall?.({\n type: \"complete\",\n toolName: parsed.tool_name,\n success: parsed.success,\n });\n {\n const completeStatus = parsed.success ? \"complete\" : \"error\";\n // Update in streamingToolCallsRef (for tools started during this stream)\n let tcUpdated = false;\n streamingToolCallsRef.current = streamingToolCallsRef.current.map((tool) => {\n if (!tcUpdated && tool.name === parsed.tool_name && tool.status === \"executing\") {\n tcUpdated = true;\n return { ...tool, status: completeStatus as \"complete\" | \"error\" };\n }\n return tool;\n });\n // Update in activeToolCalls\n setActiveToolCalls((prev) => {\n let updated = false;\n return prev.map((tool) => {\n if (!updated && tool.name === parsed.tool_name && tool.status === \"executing\") {\n updated = true;\n return { ...tool, status: completeStatus as \"complete\" | \"error\" };\n }\n return tool;\n });\n });\n // Update in committed messages (consent tool lives in a previous message's toolCalls)\n setMessages((prev) =>\n prev.map((msg) =>\n msg.toolCalls\n ? {\n ...msg,\n toolCalls: msg.toolCalls.map((tc) =>\n tc.name === parsed.tool_name && tc.status === \"executing\"\n ? { ...tc, status: completeStatus as \"complete\" | \"error\" }\n : tc\n ),\n }\n : msg\n )\n );\n }\n break;\n\n case \"tool_result\":\n if (parsed.tool_name && parsed.result) {\n onToolResult?.(parsed.tool_name, parsed.result);\n // Update in streamingToolCallsRef\n let resultUpdated = false;\n streamingToolCallsRef.current = streamingToolCallsRef.current.map((tool) => {\n if (!resultUpdated && tool.name === parsed.tool_name && !tool.result) {\n resultUpdated = true;\n return { ...tool, result: parsed.result };\n }\n return tool;\n });\n // Update in activeToolCalls\n setActiveToolCalls((prev) => {\n let updated = false;\n return prev.map((tool) => {\n if (!updated && tool.name === parsed.tool_name && !tool.result) {\n updated = true;\n return { ...tool, result: parsed.result };\n }\n return tool;\n });\n });\n // Update in committed messages (consent tool lives in a previous message's toolCalls)\n setMessages((prev) =>\n prev.map((msg) =>\n msg.toolCalls\n ? {\n ...msg,\n toolCalls: msg.toolCalls.map((tc) =>\n tc.name === parsed.tool_name && !tc.result\n ? { ...tc, result: parsed.result }\n : tc\n ),\n }\n : msg\n )\n );\n }\n break;\n\n case \"tool_result_links\":\n if (parsed.links && Array.isArray(parsed.links)) {\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === botMsgId\n ? { ...msg, links: [...(msg.links || []), ...parsed.links] }\n : msg\n )\n );\n }\n break;\n\n case \"client_tool_call\":\n {\n const needsConsent2 = toolConsentSettingsRef.current?.[parsed.tool_name]?.requires_consent === true;\n if (needsConsent2) {\n const consentEntry2: ToolCall = {\n id: parsed.tool_call_id || `tool-${Date.now()}`,\n name: parsed.tool_name,\n displayName: parsed.display_name || undefined,\n arguments: parsed.arguments || {},\n status: \"awaiting_consent\",\n requiresConsent: true,\n timestamp: new Date(),\n };\n streamingToolCallsRef.current = [...streamingToolCallsRef.current, consentEntry2];\n setActiveToolCalls((prev) => [...prev, consentEntry2]);\n } else {\n const toolCallEntry: ToolCall = {\n id: parsed.tool_call_id || `tool-${Date.now()}`,\n name: parsed.tool_name,\n displayName: parsed.display_name || undefined,\n arguments: parsed.arguments || {},\n status: \"executing\",\n timestamp: new Date(),\n };\n streamingToolCallsRef.current = [...streamingToolCallsRef.current, toolCallEntry];\n setActiveToolCalls((prev) => [...prev, toolCallEntry]);\n pendingClientTools.push({\n toolName: parsed.tool_name,\n toolCallId: parsed.tool_call_id,\n arguments: parsed.arguments,\n });\n }\n }\n break;\n\n case \"tool_consent_required\":\n // Another consent-required tool — update existing or create new\n {\n const existingIdx2 = streamingToolCallsRef.current.findIndex(\n (tc) => tc.name === parsed.tool_name && tc.status === \"executing\"\n );\n if (existingIdx2 >= 0) {\n const existing2 = streamingToolCallsRef.current[existingIdx2];\n const updated2: ToolCall = {\n ...existing2,\n status: \"awaiting_consent\",\n requiresConsent: true,\n serverSideExecution: true,\n arguments: parsed.arguments || existing2.arguments,\n };\n streamingToolCallsRef.current = streamingToolCallsRef.current.map(\n (tc, i) => (i === existingIdx2 ? updated2 : tc)\n );\n setActiveToolCalls((prev) =>\n prev.map((tc) => (tc.id === existing2.id ? updated2 : tc))\n );\n } else {\n const consentEntry: ToolCall = {\n id: `consent-${Date.now()}`,\n name: parsed.tool_name,\n displayName: parsed.display_name || undefined,\n arguments: parsed.arguments || {},\n status: \"awaiting_consent\",\n requiresConsent: true,\n serverSideExecution: true,\n timestamp: new Date(),\n };\n streamingToolCallsRef.current = [...streamingToolCallsRef.current, consentEntry];\n setActiveToolCalls((prev) => [...prev, consentEntry]);\n }\n }\n break;\n }\n } catch (e) {\n console.error(\"[Crow] Parse error in tool result response:\", e);\n }\n }\n }\n }\n }\n } catch (error) {\n console.error(\"[Crow] Error submitting tool result:\", error);\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === botMsgId\n ? { ...msg, content: \"Sorry, I encountered an error processing the tool result.\" }\n : msg\n )\n );\n } finally {\n setIsLoading(false);\n }\n },\n [apiUrl, productId, conversationId, selectedModel, subdomain]\n );\n\n const addMessage = useCallback(\n async (role: \"user\" | \"assistant\", content: string) => {\n const msgId = generateMessageId(role === \"user\" ? \"user\" : \"bot\");\n const newMessage: Message = {\n id: msgId,\n content,\n isBot: role === \"assistant\",\n timestamp: new Date(),\n };\n\n // Add to local state immediately\n setMessages((prev) => [...prev, newMessage]);\n\n // Persist to server if we have a conversation\n if (conversationId) {\n try {\n const identityToken = window.__crow_identity_token;\n await fetch(`${apiUrl}/api/chat/conversations/${conversationId}/messages`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n product_id: productId,\n conversation_id: conversationId,\n role,\n content,\n identity_token: identityToken,\n }),\n });\n } catch (e) {\n // Non-critical - message is still in local state\n console.warn(\"[Crow] Failed to persist message:\", e);\n }\n }\n },\n [apiUrl, productId, conversationId]\n );\n\n /** Update a tool call's status by ID (used for consent approval/denial) */\n const updateToolCallStatus = useCallback(\n (toolCallId: string, status: ToolCall[\"status\"]) => {\n setActiveToolCalls((prev) =>\n prev.map((tc) => (tc.id === toolCallId ? { ...tc, status } : tc))\n );\n streamingToolCallsRef.current = streamingToolCallsRef.current.map((tc) =>\n tc.id === toolCallId ? { ...tc, status } : tc\n );\n // Also update committed tool calls in messages\n setMessages((prev) =>\n prev.map((msg) =>\n msg.toolCalls\n ? {\n ...msg,\n toolCalls: msg.toolCalls.map((tc) =>\n tc.id === toolCallId ? { ...tc, status } : tc\n ),\n }\n : msg\n )\n );\n },\n []\n );\n\n return {\n messages,\n isLoading,\n activeToolCalls,\n conversationId,\n selectedModel,\n suggestedActions,\n setSuggestedActions,\n setSelectedModel,\n setConversationId,\n sendMessage,\n stopGeneration,\n resetMessages,\n loadMessages,\n submitToolResult,\n addMessage,\n updateToolCallStatus,\n };\n}\n","/**\n * useConversations - Manages conversation list and history\n */\n\nimport { useState, useCallback } from \"react\";\nimport type { Conversation, Message } from \"../types\";\n\ninterface UseConversationsOptions {\n productId: string;\n apiUrl?: string;\n}\n\nexport function useConversations({ productId, apiUrl = \"\" }: UseConversationsOptions) {\n const [conversations, setConversations] = useState<Conversation[]>([]);\n const [isLoadingHistory, setIsLoadingHistory] = useState(false);\n\n const loadConversations = useCallback(async (): Promise<Conversation[]> => {\n const token = window.__crow_identity_token;\n if (!token) return [];\n\n try {\n const res = await fetch(\n `${apiUrl}/api/chat/conversations?product_id=${productId}&identity_token=${encodeURIComponent(token)}`\n );\n if (res.ok) {\n const data = await res.json();\n const convs = data.conversations || [];\n setConversations(convs);\n return convs;\n }\n } catch (error) {\n console.error(\"[Crow] Failed to load conversations:\", error);\n }\n return [];\n }, [apiUrl, productId]);\n\n const loadConversationHistory = useCallback(\n async (conversationId: string): Promise<Message[]> => {\n const token = window.__crow_identity_token;\n if (!token) return [];\n\n setIsLoadingHistory(true);\n\n try {\n const res = await fetch(\n `${apiUrl}/api/chat/conversations/${conversationId}/history?product_id=${productId}&identity_token=${encodeURIComponent(token)}`\n );\n\n if (res.ok) {\n const data = await res.json();\n const historyMessages = data.messages || [];\n\n interface HistoryMessage {\n role: string;\n content: string;\n thinking?: string;\n tool_calls?: Array<{ name: string; display_name?: string; status: string; arguments?: Record<string, unknown> }>;\n }\n\n return historyMessages\n .filter((msg: HistoryMessage) =>\n msg.role !== \"tool\" && !msg.content.startsWith(\"[Client Tool Result:\")\n )\n .map((msg: HistoryMessage, idx: number) => ({\n id: `history-${idx}`,\n content: msg.content,\n isBot: msg.role === \"assistant\",\n timestamp: new Date(),\n thinking: msg.thinking,\n thinkingComplete: true,\n toolCalls: msg.tool_calls?.map((tc, i) => ({\n id: `history-tool-${idx}-${i}`,\n name: tc.name,\n displayName: tc.display_name || undefined,\n arguments: tc.arguments || {},\n status: tc.status as \"complete\" | \"error\" | \"executing\",\n timestamp: new Date(),\n })),\n }));\n }\n } catch (error) {\n console.error(\"[Crow] Error loading conversation history:\", error);\n } finally {\n setIsLoadingHistory(false);\n }\n\n return [];\n },\n [apiUrl, productId]\n );\n\n const loadAnonymousConversationHistory = useCallback(\n async (conversationId: string): Promise<Message[]> => {\n setIsLoadingHistory(true);\n\n try {\n const res = await fetch(\n `${apiUrl}/api/chat/conversations/${conversationId}/history/anonymous?product_id=${productId}`\n );\n\n if (res.ok) {\n const data = await res.json();\n const historyMessages = data.messages || [];\n\n interface HistoryMessage {\n role: string;\n content: string;\n thinking?: string;\n tool_calls?: Array<{ name: string; display_name?: string; status: string; arguments?: Record<string, unknown> }>;\n }\n\n return historyMessages\n .filter((msg: HistoryMessage) =>\n msg.role !== \"tool\" && !msg.content.startsWith(\"[Client Tool Result:\")\n )\n .map((msg: HistoryMessage, idx: number) => ({\n id: `history-${idx}`,\n content: msg.content,\n isBot: msg.role === \"assistant\",\n timestamp: new Date(),\n thinking: msg.thinking,\n thinkingComplete: true,\n toolCalls: msg.tool_calls?.map((tc, i) => ({\n id: `history-tool-${idx}-${i}`,\n name: tc.name,\n displayName: tc.display_name || undefined,\n arguments: tc.arguments || {},\n status: tc.status as \"complete\" | \"error\" | \"executing\",\n timestamp: new Date(),\n })),\n }));\n }\n } catch (error) {\n console.error(\"[Crow] Error loading anonymous conversation history:\", error);\n } finally {\n setIsLoadingHistory(false);\n }\n\n return [];\n },\n [apiUrl, productId]\n );\n\n return {\n conversations,\n isLoadingHistory,\n loadConversations,\n loadConversationHistory,\n loadAnonymousConversationHistory,\n };\n}\n","/**\n * useWorkflow - Manages workflow state and actions\n */\n\n//THIS IS JOURNEYS\n\nimport { useState, useCallback, useRef } from \"react\";\nimport type { ActiveWorkflow } from \"../types\";\n\ninterface UseWorkflowOptions {\n productId: string;\n apiUrl?: string;\n conversationId: string | null;\n selectedModel?: string;\n onMessage?: (content: string) => void;\n}\n\nexport function useWorkflow({\n productId,\n apiUrl = \"\",\n conversationId,\n selectedModel,\n onMessage,\n}: UseWorkflowOptions) {\n const [activeWorkflow, setActiveWorkflow] = useState<ActiveWorkflow | null>(null);\n const abortControllerRef = useRef<AbortController | null>(null);\n\n const startWorkflow = useCallback((name: string, todos: ActiveWorkflow[\"todos\"]) => {\n setActiveWorkflow({ name, todos });\n }, []);\n\n const updateTodo = useCallback((todoId: string, status: \"pending\" | \"completed\") => {\n setActiveWorkflow((prev) => {\n if (!prev) return null;\n return {\n ...prev,\n todos: prev.todos.map((todo) =>\n todo.id === todoId ? { ...todo, status } : todo\n ),\n };\n });\n }, []);\n\n const markComplete = useCallback(() => {\n setActiveWorkflow((prev) => {\n if (!prev) return null;\n return { ...prev, isComplete: true };\n });\n }, []);\n\n const endWorkflow = useCallback((delay: number = 0) => {\n if (delay > 0) {\n setTimeout(() => setActiveWorkflow(null), delay);\n } else {\n setActiveWorkflow(null);\n }\n }, []);\n\n const exitWorkflow = useCallback(async () => {\n abortControllerRef.current = new AbortController();\n\n try {\n const identityToken = window.__crow_identity_token;\n\n const response = await fetch(`${apiUrl}/api/chat/message`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n product_id: productId,\n message: \"[EXIT_WORKFLOW]\",\n conversation_id: conversationId,\n identity_token: identityToken,\n model: selectedModel,\n }),\n signal: abortControllerRef.current.signal,\n });\n\n if (!response.ok) return;\n\n const reader = response.body?.getReader();\n const decoder = new TextDecoder();\n\n if (reader) {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n const chunk = decoder.decode(value);\n const lines = chunk.split(\"\\n\");\n\n for (const line of lines) {\n if (line.startsWith(\"data: \")) {\n const data = line.slice(6).trim();\n if (data === \"[DONE]\") return;\n\n try {\n const parsed = JSON.parse(data);\n if (parsed.type === \"workflow_ended\") {\n setActiveWorkflow(null);\n }\n if (parsed.type === \"content\" && parsed.content) {\n onMessage?.(parsed.content);\n }\n } catch {\n // Ignore parse errors\n }\n }\n }\n }\n }\n } catch (error) {\n console.error(\"[Crow] Exit workflow error:\", error);\n } finally {\n abortControllerRef.current = null;\n }\n }, [apiUrl, productId, conversationId, selectedModel, onMessage]);\n\n return {\n activeWorkflow,\n startWorkflow,\n updateTodo,\n markComplete,\n endWorkflow,\n exitWorkflow,\n };\n}\n","/**\n * useCrowAPI - Sets up window.crow() API for identity and tools\n */\n\nimport { useEffect, useCallback, useRef } from \"react\";\nimport { DEFAULT_TOOLS, crowAsk } from \"@usecrow/client\";\nimport type { ClientToolHandler, ToolRenderers } from \"../types\";\n\ninterface UseCrowAPIOptions {\n onIdentified?: () => void;\n onReset?: () => void;\n}\n\nexport function useCrowAPI({ onIdentified, onReset }: UseCrowAPIOptions = {}) {\n const onIdentifiedRef = useRef(onIdentified);\n const onResetRef = useRef(onReset);\n const hasCalledInitialRef = useRef(false);\n\n useEffect(() => {\n onIdentifiedRef.current = onIdentified;\n onResetRef.current = onReset;\n });\n\n useEffect(() => {\n // Initialize client tools and register SDK defaults\n if (!window.__crow_client_tools) {\n window.__crow_client_tools = {};\n }\n \n // Register SDK default tools (e.g., whatsOnScreen)\n for (const [toolName, handler] of Object.entries(DEFAULT_TOOLS)) {\n if (!window.__crow_client_tools[toolName]) {\n window.__crow_client_tools[toolName] = handler as ClientToolHandler;\n console.log(`[Crow] Registered default tool: ${toolName}`);\n }\n }\n\n window.crow = function (command: string, options?: unknown) {\n const opts = options as Record<string, unknown> | undefined;\n\n switch (command) {\n case \"identify\":\n if (!opts?.token) {\n console.error(\"[Crow] identify() requires a token\");\n return;\n }\n\n window.__crow_identity_token = opts.token as string;\n\n const { token, ...metadata } = opts;\n window.__crow_public_metadata = metadata;\n\n console.log(\"[Crow] User identified\");\n window.dispatchEvent(\n new CustomEvent(\"crow:identified\", { detail: { token, metadata } })\n );\n break;\n\n case \"resetUser\":\n window.__crow_identity_token = undefined;\n window.__crow_public_metadata = undefined;\n console.log(\"[Crow] User reset\");\n window.dispatchEvent(new CustomEvent(\"crow:reset\"));\n break;\n\n case \"registerTools\":\n if (!opts || typeof opts !== \"object\") {\n console.error(\"[Crow] registerTools() requires an object\");\n return;\n }\n\n if (!window.__crow_client_tools) {\n window.__crow_client_tools = {};\n }\n\n for (const [toolName, handler] of Object.entries(opts)) {\n if (typeof handler === \"function\") {\n window.__crow_client_tools[toolName] = handler as ClientToolHandler;\n console.log(`[Crow] Registered tool: ${toolName}`);\n }\n }\n break;\n\n case \"runJourney\":\n if (!opts?.journeyId) {\n console.error(\"[Crow] runJourney() requires a journeyId\");\n return;\n }\n window.dispatchEvent(\n new CustomEvent(\"crow:runJourney\", {\n detail: { journeyId: opts.journeyId, inputs: opts.inputs || {} },\n })\n );\n break;\n\n case \"setContext\":\n if (!opts || typeof opts !== \"object\") {\n console.error(\"[Crow] setContext() requires an object\");\n return;\n }\n // Merge with existing context\n window.__crow_page_context = {\n ...(window.__crow_page_context || {}),\n ...opts,\n };\n console.log(\"[Crow] Context updated\", window.__crow_page_context);\n break;\n\n case \"clearContext\":\n window.__crow_page_context = undefined;\n console.log(\"[Crow] Context cleared\");\n break;\n\n case \"setIdentityTokenFetcher\":\n if (typeof opts !== \"function\") {\n console.error(\"[Crow] setIdentityTokenFetcher() requires a function\");\n return;\n }\n window.__crow_identity_token_fetcher = opts as () => Promise<string>;\n console.log(\"[Crow] Identity token fetcher registered\");\n break;\n\n case \"onToolResult\":\n if (typeof opts !== \"function\") {\n console.error(\"[Crow] onToolResult() requires a function\");\n return;\n }\n window.__crow_on_tool_result = opts as (toolName: string, result: Record<string, unknown>) => void;\n console.log(\"[Crow] onToolResult callback registered\");\n break;\n\n case \"open\":\n window.dispatchEvent(new CustomEvent(\"crow:open\"));\n break;\n\n case \"close\":\n window.dispatchEvent(new CustomEvent(\"crow:close\"));\n break;\n\n case \"setToolStatus\":\n if (typeof options !== \"string\") {\n console.error(\"[Crow] setToolStatus() requires a string\");\n return;\n }\n (window as any).__crow_tool_status = options || undefined;\n window.dispatchEvent(\n new CustomEvent(\"crow:setToolStatus\", { detail: options })\n );\n break;\n\n case \"setGreeting\":\n if (typeof options !== \"string\") {\n console.error(\"[Crow] setGreeting() requires a string\");\n return;\n }\n (window as any).__crow_greeting = options;\n window.dispatchEvent(\n new CustomEvent(\"crow:setGreeting\", { detail: options })\n );\n break;\n\n case \"ask\": {\n if (!opts || typeof opts !== \"object\") {\n console.error(\"[Crow] ask() requires an options object\");\n return;\n }\n // Delegate to the shared crowAsk helper so the SSE logic lives in one place\n return crowAsk(opts as unknown as Parameters<typeof crowAsk>[0]);\n }\n\n case \"setSuggestedActions\":\n if (!Array.isArray(options)) {\n console.error(\"[Crow] setSuggestedActions() requires an array of { label, message }\");\n return;\n }\n (window as any).__crow_suggested_actions = options;\n window.dispatchEvent(\n new CustomEvent(\"crow:setSuggestedActions\", { detail: options })\n );\n break;\n\n case \"registerToolRenderers\":\n if (!opts || typeof opts !== \"object\") {\n console.error(\"[Crow] registerToolRenderers() requires an object\");\n return;\n }\n window.__crow_tool_renderers = {\n ...(window.__crow_tool_renderers || {}),\n ...(opts as ToolRenderers),\n };\n console.log(\"[Crow] Tool renderers registered\");\n break;\n\n default:\n console.warn(`[Crow] Unknown command: ${command}`);\n }\n };\n\n console.log(\"[Crow] API ready\");\n\n // Replay any commands queued before React mounted (script-tag timing)\n const queue = (window as any).__crow_queue as Array<[string, unknown]> | undefined;\n if (queue?.length) {\n console.log(`[Crow] Replaying ${queue.length} queued command(s)`);\n queue.forEach(([cmd, opts]) => window.crow(cmd, opts));\n (window as any).__crow_queue = undefined;\n }\n\n const handleIdentified = () => onIdentifiedRef.current?.();\n const handleReset = () => onResetRef.current?.();\n\n window.addEventListener(\"crow:identified\", handleIdentified);\n window.addEventListener(\"crow:reset\", handleReset);\n\n if (window.__crow_identity_token && !hasCalledInitialRef.current) {\n hasCalledInitialRef.current = true;\n onIdentifiedRef.current?.();\n }\n\n return () => {\n window.removeEventListener(\"crow:identified\", handleIdentified);\n window.removeEventListener(\"crow:reset\", handleReset);\n };\n }, []);\n\n const executeClientTool = useCallback(\n async (toolName: string, args: Record<string, unknown>) => {\n const handler = window.__crow_client_tools?.[toolName];\n if (handler) {\n try {\n return await handler(args);\n } catch (err) {\n console.error(`[Crow] Client tool error: ${toolName}`, err);\n return { status: \"error\", error: String(err) };\n }\n }\n console.warn(`[Crow] No handler for: ${toolName}`);\n return { status: \"error\", error: \"No handler registered\" };\n },\n []\n );\n\n return { executeClientTool };\n}\n","/**\n * Default Widget and Copilot Styles\n * \n * These are the default values used when no custom styles are provided.\n * All values can be overridden via the Supabase database or SDK props.\n */\n\nimport type { ResolvedWidgetStyles, ResolvedCopilotStyles } from './types';\n\n/**\n * Default widget styles - matches the mature widget implementation\n */\nexport const DEFAULT_WIDGET_STYLES: ResolvedWidgetStyles = {\n // ═══════════════════════════════════════════════════════════\n // COLORS\n // ═══════════════════════════════════════════════════════════\n colors: {\n // Primary accent\n primary: '#000000',\n \n // Widget container\n background: 'rgba(255, 255, 255, 0.95)',\n border: '#d1d5db',\n text: '#111827',\n\n // Bot messages\n botBubble: '#000000',\n botText: '#ffffff',\n\n // User messages\n userBubble: '#ffffff',\n userText: '#000000',\n userBorder: '#000000',\n\n // Floating chat bubble\n bubbleBackground: '#ffffff',\n bubbleBorder: '#d1d5db',\n bubbleIcon: '#111827',\n\n // Messages container\n messagesBackground: 'rgba(255, 255, 255, 0.5)',\n },\n\n // ═══════════════════════════════════════════════════════════\n // TYPOGRAPHY\n // ═══════════════════════════════════════════════════════════\n typography: {\n fontFamily: 'system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n fontSize: 14,\n headerFontSize: 16,\n fontWeight: 400,\n lineHeight: 1.5,\n letterSpacing: 0,\n },\n\n // ═══════════════════════════════════════════════════════════\n // ANIMATIONS\n // ═══════════════════════════════════════════════════════════\n animations: {\n duration: 0.3,\n easing: 'easeInOut',\n },\n\n // ═══════════════════════════════════════════════════════════\n // DIMENSIONS\n // ═══════════════════════════════════════════════════════════\n dimensions: {\n width: 400,\n maxHeight: 600,\n messagesMaxHeight: 350,\n borderRadius: 24,\n padding: 20,\n },\n\n // ═══════════════════════════════════════════════════════════\n // POSITIONING (floating widget only)\n // ═══════════════════════════════════════════════════════════\n position: {\n right: 16,\n bottom: 80,\n bubbleRight: 16,\n bubbleBottom: 16,\n },\n\n // ═══════════════════════════════════════════════════════════\n // CHAT BUBBLE (floating button)\n // ═══════════════════════════════════════════════════════════\n bubble: {\n size: 48,\n iconSize: 24,\n },\n\n // ═══════════════════════════════════════════════════════════\n // SHADOWS\n // ═══════════════════════════════════════════════════════════\n shadows: {\n widget: '0 25px 50px -12px rgba(0, 0, 0, 0.25)',\n bubble: '0 25px 50px -12px rgba(0, 0, 0, 0.25)',\n },\n\n // ═══════════════════════════════════════════════════════════\n // BRANDING\n // ═══════════════════════════════════════════════════════════\n branding: {\n showPoweredBy: true,\n poweredByText: 'Powered by Crow',\n showLogo: true,\n logoUrl: '/static/crow.png',\n },\n};\n\n/**\n * Default copilot styles\n */\nexport const DEFAULT_COPILOT_STYLES: ResolvedCopilotStyles = {\n // ═══════════════════════════════════════════════════════════\n // COLORS (same as widget by default)\n // ═══════════════════════════════════════════════════════════\n colors: {\n primary: '#000000',\n background: 'rgba(255, 255, 255, 0.95)',\n border: '#d1d5db',\n text: '#111827',\n botBubble: '#000000',\n botText: '#ffffff',\n userBubble: '#ffffff',\n userText: '#000000',\n userBorder: '#000000',\n bubbleBackground: '#ffffff',\n bubbleBorder: '#d1d5db',\n bubbleIcon: '#111827',\n messagesBackground: 'rgba(255, 255, 255, 0.5)',\n },\n\n // ═══════════════════════════════════════════════════════════\n // TYPOGRAPHY\n // ═══════════════════════════════════════════════════════════\n typography: {\n fontFamily: 'system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n fontSize: 14,\n headerFontSize: 16,\n fontWeight: 400,\n lineHeight: 1.5,\n letterSpacing: 0,\n },\n\n // ═══════════════════════════════════════════════════════════\n // ANIMATIONS\n // ═══════════════════════════════════════════════════════════\n animations: {\n duration: 0.3,\n easing: 'easeInOut',\n },\n\n // ═══════════════════════════════════════════════════════════\n // DIMENSIONS\n // ═══════════════════════════════════════════════════════════\n dimensions: {\n width: 400,\n headerHeight: 56,\n borderRadius: 16,\n padding: 16,\n },\n\n // ═══════════════════════════════════════════════════════════\n // POSITIONING\n // ═══════════════════════════════════════════════════════════\n position: {\n side: 'right',\n },\n\n // ═══════════════════════════════════════════════════════════\n // BRANDING\n // ═══════════════════════════════════════════════════════════\n branding: {\n showPoweredBy: true,\n poweredByText: 'Powered by Crow',\n },\n};\n","/**\n * Style Merging Utilities\n * \n * Functions for deep merging style configurations with proper precedence:\n * defaults < DB styles < SDK props\n */\n\nimport type {\n WidgetStyleConfig,\n CopilotStyleConfig,\n ResolvedWidgetStyles,\n ResolvedCopilotStyles,\n} from './types';\nimport { DEFAULT_WIDGET_STYLES, DEFAULT_COPILOT_STYLES } from './defaults';\n\n/**\n * Deep merge two objects, with source values taking precedence.\n * Only merges plain objects, not arrays.\n */\nfunction deepMerge<T extends Record<string, unknown>>(\n target: T,\n source: Partial<T> | undefined\n): T {\n if (!source) return target;\n\n const result = { ...target };\n\n for (const key of Object.keys(source) as Array<keyof T>) {\n const sourceValue = source[key];\n const targetValue = target[key];\n\n if (\n sourceValue !== undefined &&\n sourceValue !== null &&\n typeof sourceValue === 'object' &&\n !Array.isArray(sourceValue) &&\n typeof targetValue === 'object' &&\n !Array.isArray(targetValue)\n ) {\n // Recursively merge nested objects\n result[key] = deepMerge(\n targetValue as Record<string, unknown>,\n sourceValue as Record<string, unknown>\n ) as T[keyof T];\n } else if (sourceValue !== undefined) {\n // Override with source value\n result[key] = sourceValue as T[keyof T];\n }\n }\n\n return result;\n}\n\n/**\n * Merge widget styles with precedence: defaults < dbStyles < propStyles\n * \n * @param dbStyles - Styles fetched from the database (per product)\n * @param propStyles - Styles passed via SDK props (developer overrides)\n * @returns Fully resolved styles with all defaults applied\n * \n * @example\n * ```tsx\n * const styles = mergeWidgetStyles(\n * { colors: { primary: '#blue' } }, // from DB\n * { colors: { primary: '#red' } } // from props - wins!\n * );\n * // styles.colors.primary === '#red'\n * ```\n */\nexport function mergeWidgetStyles(\n dbStyles?: WidgetStyleConfig,\n propStyles?: WidgetStyleConfig\n): ResolvedWidgetStyles {\n // Start with defaults\n let result = { ...DEFAULT_WIDGET_STYLES };\n\n // Apply DB styles (overrides defaults)\n if (dbStyles) {\n result = {\n colors: deepMerge(result.colors, dbStyles.colors),\n typography: deepMerge(result.typography, dbStyles.typography),\n animations: deepMerge(result.animations, dbStyles.animations),\n dimensions: deepMerge(result.dimensions, dbStyles.dimensions),\n position: deepMerge(result.position, dbStyles.position),\n bubble: deepMerge(result.bubble, dbStyles.bubble),\n shadows: deepMerge(result.shadows, dbStyles.shadows),\n branding: deepMerge(result.branding, dbStyles.branding),\n };\n }\n\n // Apply prop styles (overrides DB styles)\n if (propStyles) {\n result = {\n colors: deepMerge(result.colors, propStyles.colors),\n typography: deepMerge(result.typography, propStyles.typography),\n animations: deepMerge(result.animations, propStyles.animations),\n dimensions: deepMerge(result.dimensions, propStyles.dimensions),\n position: deepMerge(result.position, propStyles.position),\n bubble: deepMerge(result.bubble, propStyles.bubble),\n shadows: deepMerge(result.shadows, propStyles.shadows),\n branding: deepMerge(result.branding, propStyles.branding),\n };\n }\n\n return result;\n}\n\n/**\n * Merge copilot styles with precedence: defaults < dbStyles < propStyles\n * \n * @param dbStyles - Styles fetched from the database (per product)\n * @param propStyles - Styles passed via SDK props (developer overrides)\n * @returns Fully resolved styles with all defaults applied\n */\nexport function mergeCopilotStyles(\n dbStyles?: CopilotStyleConfig,\n propStyles?: CopilotStyleConfig\n): ResolvedCopilotStyles {\n // Start with defaults\n let result = { ...DEFAULT_COPILOT_STYLES };\n\n // Apply DB styles (overrides defaults)\n if (dbStyles) {\n result = {\n colors: deepMerge(result.colors, dbStyles.colors),\n typography: deepMerge(result.typography, dbStyles.typography),\n animations: deepMerge(result.animations, dbStyles.animations),\n dimensions: deepMerge(result.dimensions, dbStyles.dimensions),\n position: deepMerge(result.position, dbStyles.position),\n branding: deepMerge(result.branding, dbStyles.branding),\n };\n }\n\n // Apply prop styles (overrides DB styles)\n if (propStyles) {\n result = {\n colors: deepMerge(result.colors, propStyles.colors),\n typography: deepMerge(result.typography, propStyles.typography),\n animations: deepMerge(result.animations, propStyles.animations),\n dimensions: deepMerge(result.dimensions, propStyles.dimensions),\n position: deepMerge(result.position, propStyles.position),\n branding: deepMerge(result.branding, propStyles.branding),\n };\n }\n\n return result;\n}\n\n/**\n * Convert styles to CSS custom properties for use with CSS variables\n * \n * @example\n * ```tsx\n * const cssVars = stylesToCSSVariables(styles);\n * // { '--crow-primary': '#000', '--crow-bg': '#fff', ... }\n * ```\n */\nexport function stylesToCSSVariables(\n styles: ResolvedWidgetStyles | ResolvedCopilotStyles\n): Record<string, string | number> {\n return {\n // Colors\n '--crow-color-primary': styles.colors.primary,\n '--crow-color-background': styles.colors.background,\n '--crow-color-text': styles.colors.text,\n '--crow-color-border': styles.colors.border,\n '--crow-color-bot-bubble': styles.colors.botBubble,\n '--crow-color-bot-text': styles.colors.botText,\n '--crow-color-user-bubble': styles.colors.userBubble,\n '--crow-color-user-text': styles.colors.userText,\n '--crow-color-user-border': styles.colors.userBorder,\n '--crow-color-messages-bg': styles.colors.messagesBackground,\n \n // Typography\n '--crow-font-family': styles.typography.fontFamily,\n '--crow-font-size': `${styles.typography.fontSize}px`,\n '--crow-header-font-size': `${styles.typography.headerFontSize}px`,\n '--crow-font-weight': `${styles.typography.fontWeight}`,\n '--crow-line-height': `${styles.typography.lineHeight}`,\n '--crow-letter-spacing': `${styles.typography.letterSpacing}px`,\n \n // Animations\n '--crow-animation-duration': `${styles.animations.duration}s`,\n '--crow-animation-easing': styles.animations.easing,\n };\n}\n","/**\n * useWidgetStyles Hook\n * \n * Fetches widget/copilot styles from the API and merges them with defaults and props.\n * Handles caching to avoid redundant fetches.\n */\n\nimport { useState, useEffect, useRef } from 'react';\nimport type {\n WidgetStyleConfig,\n CopilotStyleConfig,\n ResolvedWidgetStyles,\n ResolvedCopilotStyles,\n WidgetConfigResponse,\n} from '../styles/types';\nimport { mergeWidgetStyles, mergeCopilotStyles } from '../styles/utils';\n\n// Simple in-memory cache for style configs\nconst styleCache = new Map<string, WidgetConfigResponse>();\n\ninterface UseWidgetStylesOptions {\n /** Product ID to fetch styles for */\n productId: string;\n /** API URL (defaults to relative path) */\n apiUrl?: string;\n /** Styles passed via props (override DB styles) */\n propStyles?: WidgetStyleConfig;\n /** Skip fetching from API (use for preview mode) */\n skip?: boolean;\n /** Cache key override (defaults to productId) */\n cacheKey?: string;\n /** ISO 639-1 language code for welcome message translation */\n language?: string;\n}\n\ninterface UseWidgetStylesResult {\n /** Fully resolved styles ready for use */\n styles: ResolvedWidgetStyles;\n /** Whether styles are currently loading */\n isLoading: boolean;\n /** Error if fetch failed */\n error: Error | null;\n /** Agent name from product config */\n agentName: string;\n /** Whether browser_use is enabled for this product */\n browserUseEnabled: boolean;\n /** Whether page navigation is enabled for this product */\n pageNavigationEnabled: boolean;\n /** Route definitions for page navigation */\n pageNavigationRoutes: Array<{ name: string; path: string; description?: string; params?: Record<string, string> }>;\n /** Whether to show thinking/reasoning to users */\n showThinking: boolean;\n /** Whether to persist anonymous conversations across page refreshes (undefined while loading) */\n persistAnonymousConversations: boolean | undefined;\n /** Custom welcome message (undefined uses SDK default) */\n welcomeMessage: string | undefined;\n /** AI model configured for this product */\n selectedModel: string | undefined;\n /** Initial suggestion buttons shown when chat opens */\n initialSuggestions: Array<{ label: string; message: string }>;\n /** Per-tool consent settings from dashboard */\n toolConsentSettings: Record<string, { requires_consent: boolean }>;\n /** Refetch styles from API */\n refetch: () => Promise<void>;\n}\n\ninterface UseCopilotStylesOptions {\n /** Product ID to fetch styles for */\n productId: string;\n /** API URL (defaults to relative path) */\n apiUrl?: string;\n /** Styles passed via props (override DB styles) */\n propStyles?: CopilotStyleConfig;\n /** Skip fetching from API (use for preview mode) */\n skip?: boolean;\n /** Cache key override (defaults to productId) */\n cacheKey?: string;\n /** ISO 639-1 language code for welcome message translation */\n language?: string;\n}\n\ninterface UseCopilotStylesResult {\n /** Fully resolved styles ready for use */\n styles: ResolvedCopilotStyles;\n /** Whether styles are currently loading */\n isLoading: boolean;\n /** Error if fetch failed */\n error: Error | null;\n /** Agent name from product config */\n agentName: string;\n /** Whether browser_use is enabled for this product */\n browserUseEnabled: boolean;\n /** Whether page navigation is enabled for this product */\n pageNavigationEnabled: boolean;\n /** Route definitions for page navigation */\n pageNavigationRoutes: Array<{ name: string; path: string; description?: string; params?: Record<string, string> }>;\n /** Whether to persist anonymous conversations across page refreshes (undefined while loading) */\n persistAnonymousConversations: boolean | undefined;\n /** Custom welcome message (undefined uses SDK default) */\n welcomeMessage: string | undefined;\n /** AI model configured for this product */\n selectedModel: string | undefined;\n /** Per-tool consent settings from dashboard */\n toolConsentSettings: Record<string, { requires_consent: boolean }>;\n /** Refetch styles from API */\n refetch: () => Promise<void>;\n}\n\n/**\n * Fetch widget configuration from the API\n */\nasync function fetchWidgetConfig(\n productId: string,\n apiUrl?: string,\n language?: string\n): Promise<WidgetConfigResponse> {\n const baseUrl = apiUrl || '';\n let url = `${baseUrl}/api/products/${productId}/widget-config`;\n if (language && language !== 'en') {\n url += `?language=${encodeURIComponent(language)}`;\n }\n\n const response = await fetch(url);\n\n if (!response.ok) {\n throw new Error(`Failed to fetch widget config: ${response.status} ${response.statusText}`);\n }\n\n return response.json();\n}\n\n/**\n * Hook to fetch and merge widget styles\n * \n * @example\n * ```tsx\n * const { styles, isLoading } = useWidgetStyles({\n * productId: 'my-product',\n * propStyles: { colors: { primary: '#blue' } },\n * });\n * ```\n */\nexport function useWidgetStyles({\n productId,\n apiUrl,\n propStyles,\n skip = false,\n cacheKey,\n language,\n}: UseWidgetStylesOptions): UseWidgetStylesResult {\n const key = cacheKey || (language && language !== 'en' ? `${productId}:${language}` : productId);\n const [isLoading, setIsLoading] = useState(!skip && !styleCache.has(key));\n const [error, setError] = useState<Error | null>(null);\n const [dbStyles, setDbStyles] = useState<WidgetStyleConfig | undefined>(\n styleCache.get(key)?.widgetStyles\n );\n const [initialSuggestions, setInitialSuggestions] = useState<Array<{ label: string; message: string }>>(\n styleCache.get(key)?.initialSuggestions || []\n );\n const [toolConsentSettings, setToolConsentSettings] = useState<Record<string, { requires_consent: boolean }>>(\n styleCache.get(key)?.toolConsentSettings || {}\n );\n const [agentName, setAgentName] = useState(\n styleCache.get(key)?.agentName || 'Assistant'\n );\n const [browserUseEnabled, setBrowserUseEnabled] = useState(\n styleCache.get(key)?.browserUseEnabled || false\n );\n const [pageNavigationEnabled, setPageNavigationEnabled] = useState(\n styleCache.get(key)?.pageNavigationEnabled || false\n );\n const [pageNavigationRoutes, setPageNavigationRoutes] = useState<\n Array<{ name: string; path: string; description?: string; params?: Record<string, string> }>\n >(styleCache.get(key)?.pageNavigationRoutes || []);\n const [showThinking, setShowThinking] = useState(\n styleCache.get(key)?.showThinking ?? true\n );\n // Return undefined while loading so useChat knows to wait\n const [persistAnonymousConversations, setPersistAnonymousConversations] = useState<boolean | undefined>(\n styleCache.has(key) ? (styleCache.get(key)?.persistAnonymousConversations ?? true) : undefined\n );\n const [welcomeMessage, setWelcomeMessage] = useState<string | undefined>(\n styleCache.get(key)?.welcomeMessage ?? undefined\n );\n const [selectedModel, setSelectedModel] = useState<string | undefined>(\n styleCache.get(key)?.model ?? undefined\n );\n \n // Track if we've already fetched\n const hasFetchedRef = useRef(false);\n \n const fetchStyles = async () => {\n if (skip) return;\n\n setIsLoading(true);\n setError(null);\n\n try {\n const config = await fetchWidgetConfig(productId, apiUrl, language);\n\n // Cache the result\n styleCache.set(key, config);\n\n setDbStyles(config.widgetStyles);\n setAgentName(config.agentName || 'Assistant');\n setBrowserUseEnabled(config.browserUseEnabled || false);\n setPageNavigationEnabled(config.pageNavigationEnabled || false);\n setPageNavigationRoutes(config.pageNavigationRoutes || []);\n setShowThinking(config.showThinking ?? true);\n setPersistAnonymousConversations(config.persistAnonymousConversations ?? true);\n setWelcomeMessage(config.welcomeMessage ?? undefined);\n setSelectedModel(config.model ?? undefined);\n setInitialSuggestions(config.initialSuggestions || []);\n setToolConsentSettings(config.toolConsentSettings || {});\n } catch (err) {\n console.error('[CrowWidget] Failed to fetch styles:', err);\n setError(err instanceof Error ? err : new Error(String(err)));\n } finally {\n setIsLoading(false);\n }\n };\n\n useEffect(() => {\n // Skip if disabled or already fetched\n if (skip || hasFetchedRef.current) return;\n\n // Check cache first\n const cached = styleCache.get(key);\n if (cached) {\n setDbStyles(cached.widgetStyles);\n setAgentName(cached.agentName || 'Assistant');\n setBrowserUseEnabled(cached.browserUseEnabled || false);\n setShowThinking(cached.showThinking ?? true);\n setPersistAnonymousConversations(cached.persistAnonymousConversations ?? true);\n setWelcomeMessage(cached.welcomeMessage ?? undefined);\n setSelectedModel(cached.model ?? undefined);\n setIsLoading(false);\n return;\n }\n\n hasFetchedRef.current = true;\n fetchStyles();\n }, [productId, apiUrl, skip, key]);\n \n // Merge styles: defaults < DB < props\n const styles = mergeWidgetStyles(dbStyles, propStyles);\n\n return {\n styles,\n isLoading,\n error,\n agentName,\n browserUseEnabled,\n pageNavigationEnabled,\n pageNavigationRoutes,\n showThinking,\n persistAnonymousConversations,\n welcomeMessage,\n selectedModel,\n initialSuggestions,\n toolConsentSettings,\n refetch: fetchStyles,\n };\n}\n\n/**\n * Hook to fetch and merge copilot styles\n * \n * @example\n * ```tsx\n * const { styles, isLoading } = useCopilotStyles({\n * productId: 'my-product',\n * propStyles: { position: { side: 'left' } },\n * });\n * ```\n */\nexport function useCopilotStyles({\n productId,\n apiUrl,\n propStyles,\n skip = false,\n cacheKey,\n language,\n}: UseCopilotStylesOptions): UseCopilotStylesResult {\n const key = cacheKey || (language && language !== 'en' ? `${productId}:${language}` : productId);\n const [isLoading, setIsLoading] = useState(!skip && !styleCache.has(key));\n const [error, setError] = useState<Error | null>(null);\n const [dbStyles, setDbStyles] = useState<CopilotStyleConfig | undefined>(\n styleCache.get(key)?.copilotStyles\n );\n const [agentName, setAgentName] = useState(\n styleCache.get(key)?.agentName || 'Assistant'\n );\n const [browserUseEnabled, setBrowserUseEnabled] = useState(\n styleCache.get(key)?.browserUseEnabled || false\n );\n const [pageNavigationEnabled, setPageNavigationEnabled] = useState(\n styleCache.get(key)?.pageNavigationEnabled || false\n );\n const [pageNavigationRoutes, setPageNavigationRoutes] = useState<\n Array<{ name: string; path: string; description?: string; params?: Record<string, string> }>\n >(styleCache.get(key)?.pageNavigationRoutes || []);\n // Return undefined while loading so useChat knows to wait\n const [persistAnonymousConversations, setPersistAnonymousConversations] = useState<boolean | undefined>(\n styleCache.has(key) ? (styleCache.get(key)?.persistAnonymousConversations ?? true) : undefined\n );\n const [welcomeMessage, setWelcomeMessage] = useState<string | undefined>(\n styleCache.get(key)?.welcomeMessage ?? undefined\n );\n const [selectedModel, setSelectedModel] = useState<string | undefined>(\n styleCache.get(key)?.model ?? undefined\n );\n const [toolConsentSettings, setToolConsentSettings] = useState<Record<string, { requires_consent: boolean }>>(\n styleCache.get(key)?.toolConsentSettings || {}\n );\n\n // Track if we've already fetched\n const hasFetchedRef = useRef(false);\n\n const fetchStyles = async () => {\n if (skip) return;\n\n setIsLoading(true);\n setError(null);\n\n try {\n const config = await fetchWidgetConfig(productId, apiUrl, language);\n\n // Cache the result\n styleCache.set(key, config);\n\n setDbStyles(config.copilotStyles);\n setAgentName(config.agentName || 'Assistant');\n setBrowserUseEnabled(config.browserUseEnabled || false);\n setPageNavigationEnabled(config.pageNavigationEnabled || false);\n setPageNavigationRoutes(config.pageNavigationRoutes || []);\n setPersistAnonymousConversations(config.persistAnonymousConversations ?? true);\n setWelcomeMessage(config.welcomeMessage ?? undefined);\n setSelectedModel(config.model ?? undefined);\n setToolConsentSettings(config.toolConsentSettings || {});\n } catch (err) {\n console.error('[CrowCopilot] Failed to fetch styles:', err);\n setError(err instanceof Error ? err : new Error(String(err)));\n } finally {\n setIsLoading(false);\n }\n };\n\n useEffect(() => {\n // Skip if disabled or already fetched\n if (skip || hasFetchedRef.current) return;\n\n // Check cache first\n const cached = styleCache.get(key);\n if (cached) {\n setDbStyles(cached.copilotStyles);\n setAgentName(cached.agentName || 'Assistant');\n setBrowserUseEnabled(cached.browserUseEnabled || false);\n setPageNavigationEnabled(cached.pageNavigationEnabled || false);\n setPageNavigationRoutes(cached.pageNavigationRoutes || []);\n setPersistAnonymousConversations(cached.persistAnonymousConversations ?? true);\n setWelcomeMessage(cached.welcomeMessage ?? undefined);\n setSelectedModel(cached.model ?? undefined);\n setIsLoading(false);\n return;\n }\n\n hasFetchedRef.current = true;\n fetchStyles();\n }, [productId, apiUrl, skip, key]);\n \n // Merge styles: defaults < DB < props\n const styles = mergeCopilotStyles(dbStyles, propStyles);\n \n return {\n styles,\n isLoading,\n error,\n agentName,\n browserUseEnabled,\n pageNavigationEnabled,\n pageNavigationRoutes,\n persistAnonymousConversations,\n welcomeMessage,\n selectedModel,\n toolConsentSettings,\n refetch: fetchStyles,\n };\n}\n\n/**\n * Clear the style cache (useful for testing or forcing refetch)\n */\nexport function clearStyleCache(productId?: string): void {\n if (productId) {\n styleCache.delete(productId);\n } else {\n styleCache.clear();\n }\n}\n\n/**\n * Hook for preview mode - uses provided styles directly without fetching\n * \n * @example\n * ```tsx\n * // In dashboard style editor\n * const { styles } = usePreviewStyles({\n * styles: localEditorState,\n * });\n * ```\n */\nexport function usePreviewWidgetStyles(\n previewStyles: WidgetStyleConfig\n): { styles: ResolvedWidgetStyles } {\n return {\n styles: mergeWidgetStyles(undefined, previewStyles),\n };\n}\n\nexport function usePreviewCopilotStyles(\n previewStyles: CopilotStyleConfig\n): { styles: ResolvedCopilotStyles } {\n return {\n styles: mergeCopilotStyles(undefined, previewStyles),\n };\n}\n","import { useState, useCallback, useRef, useEffect } from 'react';\n\ninterface UseTTSOutputOptions {\n backendUrl: string;\n voiceId?: string; // default: \"YTpq7expH9539ERJ\"\n}\n\ninterface UseTTSOutputReturn {\n speak: (text: string) => void;\n stop: () => void;\n isSpeaking: boolean;\n error: string | null;\n}\n\n/**\n * Hook for playing text-to-speech audio from the Gradium TTS WebSocket API.\n *\n * Uses Web Audio API for gapless playback of PCM audio chunks (48kHz sample rate).\n *\n * @param options Configuration options\n * @returns TTS control functions and state\n *\n * @example\n * ```tsx\n * const { speak, stop, isSpeaking, error } = useTTSOutput({\n * backendUrl: 'ws://localhost:8000',\n * voiceId: 'YTpq7expH9539ERJ'\n * });\n *\n * // Speak some text\n * speak(\"Hello world!\");\n *\n * // Stop playback\n * stop();\n * ```\n */\nexport function useTTSOutput({\n backendUrl,\n voiceId = 'YTpq7expH9539ERJ',\n}: UseTTSOutputOptions): UseTTSOutputReturn {\n const [isSpeaking, setIsSpeaking] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const wsRef = useRef<WebSocket | null>(null);\n const audioContextRef = useRef<AudioContext | null>(null);\n const nextTimeRef = useRef<number>(0);\n const streamCompleteRef = useRef<boolean>(false);\n const completionCheckIntervalRef = useRef<NodeJS.Timeout | null>(null);\n\n // Cleanup function for audio context only (keep WebSocket separate)\n const cleanupAudioContext = useCallback(() => {\n setIsSpeaking(false);\n if (audioContextRef.current && audioContextRef.current.state !== 'closed') {\n audioContextRef.current.close();\n audioContextRef.current = null;\n }\n if (completionCheckIntervalRef.current) {\n clearInterval(completionCheckIntervalRef.current);\n completionCheckIntervalRef.current = null;\n }\n }, []);\n\n // Cleanup function for WebSocket only\n const closeWebSocket = useCallback(() => {\n if (wsRef.current && wsRef.current.readyState === WebSocket.OPEN) {\n try {\n wsRef.current.send(JSON.stringify({ type: 'stop' }));\n wsRef.current.close();\n } catch (e) {\n // Ignore errors during close\n }\n }\n wsRef.current = null;\n }, []);\n\n // Full cleanup for errors and manual stop\n const cleanupTTS = useCallback(() => {\n setIsSpeaking(false);\n setError(null);\n closeWebSocket();\n cleanupAudioContext();\n }, [closeWebSocket, cleanupAudioContext]);\n\n // Wait for all scheduled audio to finish playing\n const waitForAudioComplete = useCallback(() => {\n if (completionCheckIntervalRef.current) {\n clearInterval(completionCheckIntervalRef.current);\n }\n\n completionCheckIntervalRef.current = setInterval(() => {\n if (!audioContextRef.current) {\n if (completionCheckIntervalRef.current) {\n clearInterval(completionCheckIntervalRef.current);\n completionCheckIntervalRef.current = null;\n }\n return;\n }\n\n const now = audioContextRef.current.currentTime;\n if (now >= nextTimeRef.current) {\n // All audio has played\n if (completionCheckIntervalRef.current) {\n clearInterval(completionCheckIntervalRef.current);\n completionCheckIntervalRef.current = null;\n }\n cleanupAudioContext();\n }\n }, 100); // Check every 100ms\n }, [cleanupAudioContext]);\n\n // Play a single PCM audio chunk\n const playAudioChunk = useCallback((base64Audio: string) => {\n if (!audioContextRef.current || audioContextRef.current.state === 'closed') {\n console.error('TTS: AudioContext not available');\n return;\n }\n\n try {\n // Decode base64 to PCM\n const binary = atob(base64Audio);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n\n // Convert Int16 PCM to Float32 for Web Audio\n const pcm16 = new Int16Array(bytes.buffer);\n const float32 = new Float32Array(pcm16.length);\n for (let i = 0; i < pcm16.length; i++) {\n float32[i] = pcm16[i] / 32768;\n }\n\n // Create audio buffer and play\n const buffer = audioContextRef.current.createBuffer(1, float32.length, 48000);\n buffer.getChannelData(0).set(float32);\n\n const source = audioContextRef.current.createBufferSource();\n source.buffer = buffer;\n source.connect(audioContextRef.current.destination);\n\n // Schedule playback for gapless audio\n const now = audioContextRef.current.currentTime;\n if (nextTimeRef.current < now) {\n nextTimeRef.current = now;\n }\n source.start(nextTimeRef.current);\n nextTimeRef.current += buffer.duration;\n } catch (err) {\n console.error('TTS: Error playing audio chunk:', err);\n setError(err instanceof Error ? err.message : 'Failed to play audio chunk');\n }\n }, []);\n\n // Speak text using TTS\n const speak = useCallback(\n (text: string) => {\n console.log('[TTS Hook] speak called with:', text.substring(0, 50), 'backendUrl:', backendUrl);\n\n if (!text.trim()) {\n console.log('[TTS Hook] No text to speak');\n setError('No text to speak');\n return;\n }\n\n // Prevent starting if already playing\n if (isSpeaking || wsRef.current) {\n console.log('[TTS Hook] Already playing');\n setError('Already playing, stop first');\n return;\n }\n\n setError(null);\n nextTimeRef.current = 0;\n streamCompleteRef.current = false;\n\n try {\n // Create audio context\n audioContextRef.current = new (window.AudioContext || (window as any).webkitAudioContext)({\n sampleRate: 48000,\n });\n\n // Construct WebSocket URL\n const url = backendUrl.startsWith('http')\n ? backendUrl.replace(/^http/, 'ws')\n : backendUrl;\n const wsUrl = `${url}/api/tts/stream`;\n console.log('[TTS Hook] Connecting to:', wsUrl);\n\n const ws = new WebSocket(wsUrl);\n wsRef.current = ws;\n\n ws.onopen = () => {\n ws.send(\n JSON.stringify({\n type: 'setup',\n voice_id: voiceId,\n output_format: 'pcm',\n })\n );\n };\n\n ws.onmessage = (event) => {\n const msg = JSON.parse(event.data);\n\n if (msg.type === 'ready') {\n // Send text and end signal\n ws.send(JSON.stringify({ type: 'text', text }));\n ws.send(JSON.stringify({ type: 'end_of_stream' }));\n } else if (msg.type === 'audio') {\n playAudioChunk(msg.audio);\n } else if (msg.type === 'done') {\n streamCompleteRef.current = true;\n // Close WebSocket to release Gradium session, but keep AudioContext open\n closeWebSocket();\n // Wait for audio to finish, then cleanup\n waitForAudioComplete();\n } else if (msg.type === 'error') {\n setError(msg.message || 'TTS error');\n cleanupTTS();\n }\n };\n\n ws.onerror = () => {\n setError('WebSocket error');\n cleanupTTS();\n };\n\n ws.onclose = () => {\n wsRef.current = null;\n };\n\n setIsSpeaking(true);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to start TTS');\n cleanupTTS();\n }\n },\n [\n isSpeaking,\n backendUrl,\n voiceId,\n playAudioChunk,\n closeWebSocket,\n waitForAudioComplete,\n cleanupTTS,\n ]\n );\n\n // Stop playback\n const stop = useCallback(() => {\n cleanupTTS();\n }, [cleanupTTS]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n cleanupTTS();\n };\n }, [cleanupTTS]);\n\n return {\n speak,\n stop,\n isSpeaking,\n error,\n };\n}\n","/**\n * Style Context\n *\n * React context for providing resolved styles to widget/copilot components.\n * This allows components to access styles without prop drilling.\n *\n * NOTE: Layout/dimension styles are now applied via CSS custom properties\n * (see cssVars.ts). This context is still used for:\n * - agentName: Display name shown in widget header\n * - styles: For non-CSS properties like branding, Google Fonts loading, etc.\n * - variant: floating vs embedded mode\n * - isLoading: Loading state\n */\n\nimport React, { createContext, useContext, useMemo } from \"react\";\nimport type {\n ResolvedWidgetStyles,\n ResolvedCopilotStyles,\n} from \"../styles/types\";\nimport {\n DEFAULT_WIDGET_STYLES,\n DEFAULT_COPILOT_STYLES,\n} from \"../styles/defaults\";\n\n// ============================================================================\n// WIDGET STYLE CONTEXT\n// ============================================================================\n\ninterface WidgetStyleContextValue {\n styles: ResolvedWidgetStyles;\n agentName: string;\n isLoading: boolean;\n variant: \"floating\" | \"embedded\";\n showThinking: boolean;\n}\n\nconst WidgetStyleContext = createContext<WidgetStyleContextValue | null>(null);\n\ninterface WidgetStyleProviderProps {\n children: React.ReactNode;\n styles: ResolvedWidgetStyles;\n agentName?: string;\n isLoading?: boolean;\n variant?: \"floating\" | \"embedded\";\n showThinking?: boolean;\n}\n\n/**\n * Provider for widget styles\n */\nexport function WidgetStyleProvider({\n children,\n styles,\n agentName = \"Assistant\",\n isLoading = false,\n variant = \"floating\",\n showThinking = true,\n}: WidgetStyleProviderProps) {\n const value = useMemo(\n () => ({ styles, agentName, isLoading, variant, showThinking }),\n [styles, agentName, isLoading, variant, showThinking],\n );\n\n return (\n <WidgetStyleContext.Provider value={value}>\n {children}\n </WidgetStyleContext.Provider>\n );\n}\n\n/**\n * Hook to access widget styles from context\n *\n * @throws Error if used outside of WidgetStyleProvider\n */\nexport function useWidgetStyleContext(): WidgetStyleContextValue {\n const context = useContext(WidgetStyleContext);\n\n if (!context) {\n throw new Error(\n \"useWidgetStyleContext must be used within a WidgetStyleProvider. \" +\n \"Make sure your component is wrapped with CrowWidget or WidgetStyleProvider.\",\n );\n }\n\n return context;\n}\n\n/**\n * Hook to access widget styles, with fallback to defaults if not in context\n *\n * Use this in components that might be used both inside and outside the widget.\n */\nexport function useWidgetStyles(): ResolvedWidgetStyles {\n const context = useContext(WidgetStyleContext);\n return context?.styles ?? DEFAULT_WIDGET_STYLES;\n}\n\n/**\n * Hook to check if thinking/reasoning should be shown to users\n * \n * Defaults to true if not in context\n */\nexport function useShowThinking(): boolean {\n const context = useContext(WidgetStyleContext);\n return context?.showThinking ?? true;\n}\n\n// ============================================================================\n// COPILOT STYLE CONTEXT\n// ============================================================================\n\ninterface CopilotStyleContextValue {\n styles: ResolvedCopilotStyles;\n agentName: string;\n isLoading: boolean;\n}\n\nconst CopilotStyleContext = createContext<CopilotStyleContextValue | null>(\n null,\n);\n\ninterface CopilotStyleProviderProps {\n children: React.ReactNode;\n styles: ResolvedCopilotStyles;\n agentName?: string;\n isLoading?: boolean;\n}\n\n/**\n * Provider for copilot styles\n */\nexport function CopilotStyleProvider({\n children,\n styles,\n agentName = \"Assistant\",\n isLoading = false,\n}: CopilotStyleProviderProps) {\n const value = useMemo(\n () => ({ styles, agentName, isLoading }),\n [styles, agentName, isLoading],\n );\n\n return (\n <CopilotStyleContext.Provider value={value}>\n {children}\n </CopilotStyleContext.Provider>\n );\n}\n\n/**\n * Hook to access copilot styles from context\n *\n * @throws Error if used outside of CopilotStyleProvider\n */\nexport function useCopilotStyleContext(): CopilotStyleContextValue {\n const context = useContext(CopilotStyleContext);\n\n if (!context) {\n throw new Error(\n \"useCopilotStyleContext must be used within a CopilotStyleProvider. \" +\n \"Make sure your component is wrapped with CrowCopilot or CopilotStyleProvider.\",\n );\n }\n\n return context;\n}\n\n/**\n * Hook to access copilot styles, with fallback to defaults if not in context\n */\nexport function useCopilotStyles(): ResolvedCopilotStyles {\n const context = useContext(CopilotStyleContext);\n return context?.styles ?? DEFAULT_COPILOT_STYLES;\n}\n","/**\n * ShadowContainer - Renders children inside a Shadow DOM boundary\n *\n * This provides complete CSS isolation:\n * - Widget styles don't leak to the host page\n * - Host page styles don't affect the widget\n *\n * Additionally, this component provides keyboard event isolation:\n * - Keyboard events are stopped from propagating to the host page\n * - This prevents host apps from stealing focus or intercepting keystrokes\n * - Escape and Tab keys are allowed to propagate for accessibility\n */\n\nimport { useRef, useState, useEffect, type ReactNode } from \"react\";\nimport { createPortal } from \"react-dom\";\n\ninterface ShadowContainerProps {\n /** Content to render inside the Shadow DOM */\n children: ReactNode;\n /** CSS string to inject into the Shadow DOM */\n styles: string;\n /** Optional ID for the host element */\n hostId?: string;\n /** Optional class name for the host element */\n hostClassName?: string;\n}\n\n// Keys that should pass through to the host application\nconst PASSTHROUGH_KEYS = new Set([\"Escape\", \"Tab\"]);\n\nexport function ShadowContainer({\n children,\n styles,\n hostId = \"crow-widget-host\",\n hostClassName,\n}: ShadowContainerProps) {\n const hostRef = useRef<HTMLDivElement>(null);\n const [shadowRoot, setShadowRoot] = useState<ShadowRoot | null>(null);\n\n // Create shadow root on mount\n useEffect(() => {\n if (hostRef.current && !hostRef.current.shadowRoot) {\n const shadow = hostRef.current.attachShadow({ mode: \"open\" });\n setShadowRoot(shadow);\n }\n }, []);\n\n // Keyboard event isolation - prevents host app from stealing keystrokes\n useEffect(() => {\n if (!shadowRoot || !hostRef.current) return;\n\n const hostElement = hostRef.current;\n\n // ============================================\n // Layer 1: Stop propagation at shadow root\n // (handles bubble-phase host listeners - ~90% of cases)\n // ============================================\n const stopPropagationHandler = (e: Event) => {\n const keyEvent = e as KeyboardEvent;\n if (keyEvent.key && PASSTHROUGH_KEYS.has(keyEvent.key)) {\n return;\n }\n e.stopPropagation();\n };\n\n shadowRoot.addEventListener(\"keydown\", stopPropagationHandler);\n shadowRoot.addEventListener(\"keyup\", stopPropagationHandler);\n shadowRoot.addEventListener(\"keypress\", stopPropagationHandler);\n\n // ============================================\n // Layer 2 & 3: Focus protection\n // (handles capture-phase host listeners that steal focus)\n // ============================================\n let lastFocusedElement: HTMLElement | null = null;\n\n const trackFocus = (e: Event) => {\n lastFocusedElement = e.target as HTMLElement;\n };\n\n const protectFocus = (e: KeyboardEvent) => {\n if (e.key && PASSTHROUGH_KEYS.has(e.key)) {\n return;\n }\n\n // Check if event originated from our widget\n const path = e.composedPath();\n if (!path.includes(hostElement) && !path.includes(shadowRoot)) {\n return;\n }\n\n // Schedule focus restoration after all handlers complete\n if (lastFocusedElement) {\n const elementToRestore = lastFocusedElement;\n queueMicrotask(() => {\n const activeInShadow = shadowRoot.activeElement;\n if (!activeInShadow) {\n // Focus was stolen - restore it\n elementToRestore.focus();\n }\n });\n }\n };\n\n shadowRoot.addEventListener(\"focusin\", trackFocus as EventListener);\n document.addEventListener(\"keydown\", protectFocus, { capture: true });\n\n // ============================================\n // Cleanup\n // ============================================\n return () => {\n shadowRoot.removeEventListener(\"keydown\", stopPropagationHandler);\n shadowRoot.removeEventListener(\"keyup\", stopPropagationHandler);\n shadowRoot.removeEventListener(\"keypress\", stopPropagationHandler);\n shadowRoot.removeEventListener(\"focusin\", trackFocus as EventListener);\n document.removeEventListener(\"keydown\", protectFocus, { capture: true });\n };\n }, [shadowRoot]);\n\n return (\n <div ref={hostRef} id={hostId} className={hostClassName}>\n {shadowRoot &&\n createPortal(\n <>\n <style>{styles}</style>\n {children}\n </>,\n shadowRoot,\n )}\n </div>\n );\n}\n\nShadowContainer.displayName = \"ShadowContainer\";\n","/**\n * ChatBubble - Floating button to toggle widget\n */\n\nimport { MessageCircle, ChevronDown } from \"lucide-react\";\nimport { useWidgetStyleContext } from \"../../context/StyleContext\";\n\ninterface ChatBubbleProps {\n isExpanded: boolean;\n onClick: () => void;\n}\n\nexport function ChatBubble({ isExpanded, onClick }: ChatBubbleProps) {\n const { styles } = useWidgetStyleContext();\n\n return (\n <button\n onClick={onClick}\n className=\"crow-fixed crow-z-[999999] crow-rounded-full crow-flex crow-items-center crow-justify-center crow-shadow-2xl hover:crow-scale-110 crow-transition-all crow-duration-500 crow-border crow-backdrop-blur-md\"\n style={{\n width: styles.bubble.size,\n height: styles.bubble.size,\n right: styles.position.bubbleRight,\n bottom: styles.position.bubbleBottom,\n background: styles.colors.bubbleBackground,\n borderColor: styles.colors.bubbleBorder,\n boxShadow: styles.shadows.bubble,\n color: styles.colors.bubbleIcon,\n }}\n aria-label={isExpanded ? \"Close Chat\" : \"Open Chat\"}\n >\n {isExpanded ? (\n <ChevronDown size={styles.bubble.iconSize} strokeWidth={2} />\n ) : (\n <MessageCircle size={styles.bubble.iconSize} strokeWidth={2} />\n )}\n </button>\n );\n}\n","/**\n * WidgetShell - Container for widget content\n */\n\nimport { forwardRef, useEffect, type ReactNode } from \"react\";\nimport { useWidgetStyleContext } from \"../../context/StyleContext\";\n\n// Map font family values to Google Fonts parameters\nconst GOOGLE_FONTS_MAP: Record<string, string> = {\n '\"Inter\", sans-serif': \"Inter:wght@300;400;500;600;700\",\n '\"Roboto\", sans-serif': \"Roboto:wght@300;400;500;700\",\n '\"Open Sans\", sans-serif': \"Open+Sans:wght@300;400;500;600;700\",\n '\"Poppins\", sans-serif': \"Poppins:wght@300;400;500;600;700\",\n '\"Montserrat\", sans-serif': \"Montserrat:wght@300;400;500;600;700\",\n};\n\ninterface WidgetShellProps {\n children: ReactNode;\n className?: string;\n}\n\nexport const WidgetShell = forwardRef<HTMLDivElement, WidgetShellProps>(\n ({ children, className }, ref) => {\n const { styles, variant } = useWidgetStyleContext();\n\n // Dynamically load Google Fonts when fontFamily changes\n useEffect(() => {\n const fontParam = GOOGLE_FONTS_MAP[styles.typography.fontFamily];\n if (!fontParam) return; // System font, no need to load\n\n const linkId = `crow-google-font-${fontParam.split(\":\")[0]}`;\n\n // Check if already loaded\n if (document.getElementById(linkId)) return;\n\n const link = document.createElement(\"link\");\n link.id = linkId;\n link.rel = \"stylesheet\";\n link.href = `https://fonts.googleapis.com/css2?family=${fontParam}&display=swap`;\n document.head.appendChild(link);\n }, [styles.typography.fontFamily]);\n\n const baseStyle = {\n borderRadius: styles.dimensions.borderRadius,\n padding: styles.dimensions.padding,\n background: styles.colors.background,\n borderColor: styles.colors.border,\n color: styles.colors.text,\n boxShadow: styles.shadows.widget,\n fontFamily: styles.typography.fontFamily,\n fontSize: styles.typography.fontSize,\n fontWeight: styles.typography.fontWeight,\n lineHeight: styles.typography.lineHeight,\n letterSpacing: styles.typography.letterSpacing,\n };\n\n if (variant === \"embedded\") {\n return (\n <div\n ref={ref}\n className={`crow-flex crow-flex-col crow-shadow-2xl crow-gap-3 crow-border crow-backdrop-blur-md crow-overflow-hidden ${\n className ?? \"\"\n }`}\n style={{\n ...baseStyle,\n width: `min(${styles.dimensions.width}px, calc(100vw - 32px))`,\n height: `min(${styles.dimensions.maxHeight}px, calc(100vh - 120px))`,\n }}\n >\n {children}\n </div>\n );\n }\n\n // Floating variant\n return (\n <div\n ref={ref}\n className={`crow-fixed crow-z-[999999] crow-shadow-2xl crow-gap-3 crow-transition-all crow-duration-500 crow-flex crow-flex-col crow-border crow-backdrop-blur-md crow-overflow-hidden ${\n className ?? \"\"\n }`}\n style={{\n ...baseStyle,\n width: `min(${styles.dimensions.width}px, calc(100vw - 32px))`,\n height: `min(${styles.dimensions.maxHeight}px, calc(100vh - 120px))`,\n right: styles.position.right,\n bottom: styles.position.bottom,\n }}\n >\n {children}\n </div>\n );\n },\n);\n\nWidgetShell.displayName = \"WidgetShell\";\n","/**\n * WidgetHeader - Header bar for widget\n */\n\nimport { Plus, History, X, RotateCcw } from \"lucide-react\";\nimport { useWidgetStyleContext } from \"../../context/StyleContext\";\n\ninterface WidgetHeaderProps {\n isVerifiedUser: boolean;\n showConversationList: boolean;\n onNewChat: () => void;\n onToggleHistory: () => void;\n showMinimize?: boolean;\n onToggleMinimize?: () => void;\n}\n\nexport function WidgetHeader({\n isVerifiedUser,\n showConversationList,\n onNewChat,\n onToggleHistory,\n showMinimize = false,\n onToggleMinimize,\n}: WidgetHeaderProps) {\n const { agentName, styles } = useWidgetStyleContext();\n\n return (\n <div\n className=\"crow-flex crow-items-center crow-justify-between crow-mb-3 crow-pb-2 crow-border-b\"\n style={{ borderColor: styles.colors.border }}\n >\n <div className=\"crow-flex crow-items-center crow-gap-2\">\n <span\n className=\"crow-text-sm crow-font-semibold\"\n style={{\n color: styles.colors.text,\n fontSize: styles.typography.headerFontSize,\n }}\n >\n {agentName}\n </span>\n </div>\n\n <div className=\"crow-flex crow-items-center crow-gap-1\">\n {isVerifiedUser ? (\n <button\n onClick={onNewChat}\n className=\"crow-p-1.5 hover:crow-bg-gray-200 crow-rounded crow-transition-colors\"\n aria-label=\"New Chat\"\n title=\"New Chat\"\n >\n <Plus size={18} className=\"crow-text-gray-700\" />\n </button>\n ) : (\n <button\n onClick={onNewChat}\n className=\"crow-p-1.5 hover:crow-bg-gray-200 crow-rounded crow-transition-colors\"\n aria-label=\"Restart Chat\"\n title=\"Restart Chat\"\n >\n <RotateCcw size={16} className=\"crow-text-gray-700\" />\n </button>\n )}\n {isVerifiedUser && (\n <button\n onClick={onToggleHistory}\n className={`crow-p-1.5 hover:crow-bg-gray-200 crow-rounded crow-transition-colors ${\n showConversationList ? \"crow-bg-gray-200\" : \"\"\n }`}\n aria-label=\"Conversation History\"\n title=\"Conversation History\"\n >\n <History size={18} className=\"crow-text-gray-700\" />\n </button>\n )}\n {showMinimize && onToggleMinimize && (\n <button\n onClick={onToggleMinimize}\n className=\"crow-p-1.5 hover:crow-bg-gray-200 crow-rounded crow-transition-colors\"\n aria-label=\"Close chat\"\n title=\"Close chat\"\n >\n <X size={18} className=\"crow-text-gray-700\" />\n </button>\n )}\n </div>\n </div>\n );\n}\n","/**\n * StreamingText - Simple streaming text with blinking cursor\n */\n\nimport ReactMarkdown from \"react-markdown\";\n\ninterface StreamingTextProps {\n content: string;\n isStreaming?: boolean;\n}\n\nexport function StreamingText({\n content,\n isStreaming = false,\n}: StreamingTextProps) {\n return (\n <>\n <ReactMarkdown\n components={{\n strong: ({ children }) => (\n <strong className=\"crow-font-bold\">{children}</strong>\n ),\n ul: ({ children }) => (\n <ul className=\"crow-list-disc crow-pl-5 crow-my-1.5\">{children}</ul>\n ),\n ol: ({ children }) => (\n <ol className=\"crow-list-decimal crow-pl-5 crow-my-1.5\">\n {children}\n </ol>\n ),\n li: ({ children }) => (\n <li className=\"crow-mb-0.5 last:crow-mb-0\">{children}</li>\n ),\n p: ({ children }) => (\n <p className=\"crow-mb-1.5 last:crow-mb-0\">{children}</p>\n ),\n a: ({ href, children }) => {\n const isInternal = href?.startsWith(\"/\");\n return (\n <a\n href={href}\n className=\"crow-underline hover:crow-text-blue-300\"\n {...(!isInternal && { target: \"_blank\", rel: \"noopener noreferrer\" })}\n onClick={\n isInternal\n ? (e) => {\n e.preventDefault();\n // Create a temporary <a> in the main document and click it.\n // SPA frameworks (Next.js, React Router, Vue Router, etc.)\n // intercept <a> clicks on the document for client-side navigation.\n const a = document.createElement(\"a\");\n a.href = href!;\n a.style.display = \"none\";\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n }\n : undefined\n }\n >\n {children}\n </a>\n );\n },\n code: ({ className, children, ...props }) => {\n const isInline = !className;\n return isInline ? (\n <code\n className=\"crow-bg-gray-800 crow-text-gray-200 crow-px-1.5 crow-py-0.5 crow-rounded crow-text-sm\"\n {...props}\n >\n {children}\n </code>\n ) : (\n <code\n className={`crow-text-gray-200 ${className || \"\"}`}\n {...props}\n >\n {children}\n </code>\n );\n },\n pre: ({ children }) => (\n <pre className=\"crow-bg-gray-800 crow-text-gray-200 crow-p-3 crow-rounded-lg crow-my-2 crow-overflow-x-auto crow-text-sm\">\n {children}\n </pre>\n ),\n }}\n >\n {content}\n </ReactMarkdown>\n\n {isStreaming && (\n <span\n className=\"crow-inline-block crow-w-0.5 crow-h-4 crow-ml-0.5 crow-align-text-bottom\"\n style={{\n backgroundColor: \"currentColor\",\n animation: \"cursor-blink 1s ease-in-out infinite\",\n }}\n aria-hidden=\"true\"\n />\n )}\n\n <style>{`\n @keyframes cursor-blink {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0; }\n }\n `}</style>\n </>\n );\n}\n\nexport default StreamingText;\n","/**\n * ThinkingIndicator - Shimmer effect for thinking state\n */\n\nexport function ThinkingIndicator() {\n return (\n <>\n <span\n className=\"crow-inline-block crow-font-medium\"\n style={{\n background:\n \"linear-gradient(90deg, rgba(255,255,255,0.4) 0%, rgba(255,255,255,1) 50%, rgba(255,255,255,0.4) 100%)\",\n backgroundSize: \"200% 100%\",\n WebkitBackgroundClip: \"text\",\n backgroundClip: \"text\",\n WebkitTextFillColor: \"transparent\",\n animation: \"shimmer 1.5s ease-in-out infinite\",\n }}\n >\n Thinking...\n </span>\n <style>{`\n @keyframes shimmer {\n 0% { background-position: 100% 0; }\n 100% { background-position: -100% 0; }\n }\n `}</style>\n </>\n );\n}\n","/**\n * LoadingHistory - Loading animation for conversation history\n */\n\nimport { motion } from \"framer-motion\";\n\nexport function LoadingHistory() {\n return (\n <motion.div\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n className=\"crow-flex crow-justify-center crow-items-center crow-py-8\"\n >\n <div className=\"crow-flex crow-flex-col crow-items-center crow-gap-3\">\n <div className=\"crow-flex crow-gap-1\">\n {[0, 0.15, 0.3].map((delay, i) => (\n <motion.div\n key={i}\n className=\"crow-w-2 crow-h-2 crow-bg-gray-400 crow-rounded-full\"\n animate={{ y: [0, -8, 0] }}\n transition={{ duration: 0.6, repeat: Infinity, delay }}\n />\n ))}\n </div>\n <span className=\"crow-text-sm crow-text-gray-500\">Loading conversation...</span>\n </div>\n </motion.div>\n );\n}\n","/**\n * ReasoningTrace - PostHog-inspired collapsible reasoning display\n */\n\nimport { useState, useRef, useLayoutEffect, useEffect } from \"react\";\nimport { motion, AnimatePresence } from \"framer-motion\";\nimport { ChevronRight, Brain, Check, Loader2 } from \"lucide-react\";\nimport type { ToolCall, ToolRenderers } from \"../../types\";\n\nconst THINKING_MESSAGES = [\n \"Pondering\",\n \"Analyzing\",\n \"Reasoning\",\n \"Considering\",\n \"Processing\",\n \"Evaluating\",\n \"Thinking\",\n \"Exploring\",\n \"Connecting\",\n \"Synthesizing\",\n];\n\nfunction ShimmeringContent({ children }: { children: React.ReactNode }) {\n return (\n <span\n className=\"crow-inline-block\"\n style={{\n background:\n \"linear-gradient(90deg, rgba(100,100,100,0.6) 0%, rgba(100,100,100,1) 50%, rgba(100,100,100,0.6) 100%)\",\n backgroundSize: \"200% 100%\",\n WebkitBackgroundClip: \"text\",\n backgroundClip: \"text\",\n WebkitTextFillColor: \"transparent\",\n animation: \"shimmer 1.5s ease-in-out infinite\",\n }}\n >\n {/* React 18/19 ReactNode type mismatch workaround */}\n {children as any}\n <style>{`\n @keyframes shimmer {\n 0% { background-position: 100% 0; }\n 100% { background-position: -100% 0; }\n }\n `}</style>\n </span>\n );\n}\n\ninterface ReasoningTraceProps {\n thinking?: string;\n isComplete?: boolean;\n toolCalls?: ToolCall[];\n isWaiting?: boolean;\n /** Whether to show detailed reasoning (text + tool calls). If false, only shows \"Thinking...\" indicator */\n showDetails?: boolean;\n /** Custom renderers for tool results — keyed by tool name */\n toolRenderers?: ToolRenderers;\n /** Callback when user allows/denies a consent-gated tool */\n onToolConsent?: (toolCallId: string, approved: boolean) => void;\n}\n\nexport function ReasoningTrace({\n thinking,\n isComplete,\n toolCalls = [],\n isWaiting = false,\n showDetails = true,\n toolRenderers,\n onToolConsent,\n}: ReasoningTraceProps) {\n const hasThinking = !!thinking && thinking.trim().length > 0;\n const hasToolCalls = toolCalls.length > 0;\n const isActive =\n isWaiting ||\n (hasThinking && !isComplete) ||\n toolCalls.some((t) => t.status === \"executing\" || t.status === \"awaiting_consent\");\n\n if (!isWaiting && !hasThinking && !hasToolCalls) return null;\n\n // When showDetails is false, only show a simple \"Thinking...\" indicator while active\n if (!showDetails) {\n // Only show indicator while something is actively processing\n if (!isActive) return null;\n\n return (\n <div className=\"crow-flex crow-justify-start crow-mb-2\">\n <div className=\"crow-max-w-[90%]\">\n <WaitingIndicator />\n </div>\n </div>\n );\n }\n\n // Full detailed view\n return (\n <div className=\"crow-flex crow-justify-start crow-mb-2 crow-w-full\">\n <div className=\"crow-w-full crow-space-y-1.5\">\n {isWaiting && !hasThinking && <WaitingIndicator />}\n\n {hasThinking && (\n <ThinkingBlock thinking={thinking!} isComplete={isComplete} />\n )}\n\n {toolCalls.map((tool) => (\n <ToolCallBlock\n key={tool.id}\n toolCall={tool}\n toolRenderers={toolRenderers}\n onToolConsent={onToolConsent}\n />\n ))}\n </div>\n </div>\n );\n}\n\nfunction WaitingIndicator() {\n // Start at a random index and cycle through messages every 1.5 seconds\n const [messageIndex, setMessageIndex] = useState(() =>\n Math.floor(Math.random() * THINKING_MESSAGES.length),\n );\n\n useEffect(() => {\n const interval = setInterval(() => {\n setMessageIndex((i) => (i + 1) % THINKING_MESSAGES.length);\n }, 3000); // Cycle every 3 seconds\n\n return () => clearInterval(interval);\n }, []);\n\n const message = THINKING_MESSAGES[messageIndex] + \"...\";\n\n return (\n <div className=\"crow-flex crow-items-center crow-gap-1.5 crow-text-xs crow-text-gray-500\">\n <div className=\"crow-flex crow-items-center crow-justify-center crow-w-4 crow-h-4\">\n <ShimmeringContent>\n <Brain className=\"crow-w-3.5 crow-h-3.5\" />\n </ShimmeringContent>\n </div>\n <span className=\"crow-font-medium\">\n <ShimmeringContent>{message}</ShimmeringContent>\n </span>\n </div>\n );\n}\n\nfunction ThinkingBlock({\n thinking,\n isComplete,\n}: {\n thinking: string;\n isComplete?: boolean;\n}) {\n const [isExpanded, setIsExpanded] = useState(!isComplete);\n // Start at a random index and cycle through messages every 1.5 seconds\n const [messageIndex, setMessageIndex] = useState(() =>\n Math.floor(Math.random() * THINKING_MESSAGES.length),\n );\n\n useLayoutEffect(() => {\n setIsExpanded(!isComplete);\n }, [isComplete]);\n\n useEffect(() => {\n if (isComplete) return; // Stop cycling when complete\n\n const interval = setInterval(() => {\n setMessageIndex((i) => (i + 1) % THINKING_MESSAGES.length);\n }, 3000); // Cycle every 3 seconds\n\n return () => clearInterval(interval);\n }, [isComplete]);\n\n const isInProgress = !isComplete;\n const message = THINKING_MESSAGES[messageIndex] + \"...\";\n\n return (\n <div className=\"crow-flex crow-flex-col crow-gap-1 crow-text-xs\">\n <button\n onClick={() => setIsExpanded(!isExpanded)}\n className={`crow-flex crow-items-center crow-gap-1.5 crow-select-none crow-transition-colors ${\n isInProgress\n ? \"crow-text-gray-500\"\n : \"crow-text-gray-600 hover:crow-text-gray-800\"\n } crow-cursor-pointer`}\n >\n <div className=\"crow-flex crow-items-center crow-justify-center crow-w-4 crow-h-4\">\n {isInProgress ? (\n <ShimmeringContent>\n <Brain className=\"crow-w-3.5 crow-h-3.5\" />\n </ShimmeringContent>\n ) : (\n <Brain className=\"crow-w-3.5 crow-h-3.5\" />\n )}\n </div>\n\n <span className=\"crow-font-medium\">\n {isInProgress ? (\n <ShimmeringContent>{message}</ShimmeringContent>\n ) : (\n \"Thought\"\n )}\n </span>\n\n <motion.div\n animate={{ rotate: isExpanded ? 90 : 0 }}\n transition={{ duration: 0.15 }}\n className=\"crow-flex-shrink-0\"\n >\n <ChevronRight className=\"crow-w-3 crow-h-3\" />\n </motion.div>\n\n {isComplete && (\n <Check className=\"crow-w-3 crow-h-3 crow-text-green-500\" />\n )}\n </button>\n\n <AnimatePresence>\n {isExpanded && (\n <motion.div\n initial={{ height: 0, opacity: 0 }}\n animate={{ height: \"auto\", opacity: 1 }}\n exit={{ height: 0, opacity: 0 }}\n transition={{ duration: 0.15 }}\n className=\"crow-overflow-hidden\"\n >\n <div className=\"crow-border-l-2 crow-border-gray-200 crow-pl-3 crow-ml-2\">\n <div\n className={`crow-text-xs crow-leading-relaxed crow-whitespace-pre-wrap ${\n isComplete ? \"crow-text-gray-500\" : \"crow-text-gray-600\"\n }`}\n >\n {thinking}\n </div>\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n );\n}\n\n/** Renders tool result from React SDK (ReactNode), script tag (HTML string), or DOM element (Chart.js/D3) */\nfunction RenderedToolResult({ renderer, result, status }: {\n renderer: (props: { result: unknown; status: string }) => unknown;\n result: unknown;\n status: string;\n}) {\n const domRef = useRef<HTMLDivElement>(null);\n const rendered = renderer({ result, status });\n\n useEffect(() => {\n if (domRef.current && rendered instanceof HTMLElement) {\n domRef.current.innerHTML = \"\";\n domRef.current.appendChild(rendered);\n }\n }, [rendered]);\n\n if (rendered instanceof HTMLElement) {\n return <div className=\"crow-mt-1.5 crow-mb-0.5\" ref={domRef} />;\n }\n if (typeof rendered === \"string\") {\n return <div className=\"crow-mt-1.5 crow-mb-0.5\" dangerouslySetInnerHTML={{ __html: rendered }} />;\n }\n return <div className=\"crow-mt-1.5 crow-mb-0.5\">{rendered as any}</div>;\n}\n\nfunction ToolCallBlock({\n toolCall,\n toolRenderers,\n onToolConsent,\n}: {\n toolCall: ToolCall;\n toolRenderers?: ToolRenderers;\n onToolConsent?: (toolCallId: string, approved: boolean) => void;\n}) {\n const [expanded, setExpanded] = useState(false);\n const hasArgs = Object.keys(toolCall.arguments || {}).length > 0;\n\n const isExecuting = toolCall.status === \"executing\";\n const isComplete = toolCall.status === \"complete\";\n const isError = toolCall.status === \"error\";\n const isAwaitingConsent = toolCall.status === \"awaiting_consent\";\n const isDenied = toolCall.status === \"denied\";\n\n // Check if a custom renderer exists for this tool\n const customRenderer = toolRenderers?.[toolCall.name];\n const hasCustomRender =\n isComplete && customRenderer && toolCall.result != null;\n\n return (\n <div className=\"crow-flex crow-flex-col crow-gap-1 crow-text-xs\">\n <div\n className={`crow-flex crow-items-center crow-gap-1.5 crow-select-none crow-transition-colors ${\n isExecuting || isAwaitingConsent ? \"crow-text-gray-500\" : \"crow-text-gray-600\"\n }`}\n >\n {hasArgs && !isAwaitingConsent && (\n <button\n onClick={() => setExpanded(!expanded)}\n className=\"crow-cursor-pointer hover:crow-text-gray-800\"\n >\n <motion.div\n animate={{ rotate: expanded ? 90 : 0 }}\n transition={{ duration: 0.15 }}\n >\n <ChevronRight className=\"crow-w-3 crow-h-3\" />\n </motion.div>\n </button>\n )}\n\n {isAwaitingConsent && (\n <Loader2 className=\"crow-w-3 crow-h-3 crow-animate-spin crow-text-amber-500\" />\n )}\n {isExecuting && (\n <Loader2 className=\"crow-w-3 crow-h-3 crow-animate-spin crow-text-blue-500\" />\n )}\n {isComplete && (\n <Check className=\"crow-w-3 crow-h-3 crow-text-green-500\" />\n )}\n {isError && (\n <span className=\"crow-w-3 crow-h-3 crow-text-red-500\">✕</span>\n )}\n {isDenied && (\n <span className=\"crow-w-3 crow-h-3 crow-text-gray-400\">✕</span>\n )}\n\n <span className=\"crow-font-medium\">\n {toolCall.displayName || toolCall.name}\n </span>\n\n {isAwaitingConsent && (\n <>\n <span className=\"crow-text-amber-500\">needs permission</span>\n <button\n onClick={() => onToolConsent?.(toolCall.id, true)}\n className=\"crow-px-2 crow-py-0.5 crow-rounded crow-text-xs crow-font-medium crow-text-white crow-cursor-pointer\"\n style={{ backgroundColor: \"#2563eb\" }}\n >\n Allow\n </button>\n <button\n onClick={() => onToolConsent?.(toolCall.id, false)}\n className=\"crow-px-2 crow-py-0.5 crow-rounded crow-border crow-text-xs crow-font-medium crow-text-gray-500 crow-cursor-pointer\"\n style={{ borderColor: \"#d1d5db\", backgroundColor: \"transparent\" }}\n >\n Deny\n </button>\n </>\n )}\n {isExecuting && (\n <span className=\"crow-text-gray-400\">running...</span>\n )}\n {isComplete && (\n <span className=\"crow-text-gray-400\">done</span>\n )}\n {isError && (\n <span className=\"crow-text-gray-400\">failed</span>\n )}\n {isDenied && (\n <span className=\"crow-text-gray-400\">denied</span>\n )}\n </div>\n\n {/* Custom renderer for tool result (e.g. inline chart) — full width, no indent */}\n {hasCustomRender && (\n <RenderedToolResult renderer={customRenderer} result={toolCall.result} status={toolCall.status} />\n )}\n\n <AnimatePresence>\n {expanded && hasArgs && (\n <motion.div\n initial={{ height: 0, opacity: 0 }}\n animate={{ height: \"auto\", opacity: 1 }}\n exit={{ height: 0, opacity: 0 }}\n transition={{ duration: 0.15 }}\n className=\"crow-overflow-hidden\"\n >\n <pre className=\"crow-mt-1 crow-p-2 crow-bg-gray-800 crow-rounded crow-text-xs crow-font-mono crow-text-gray-200 crow-overflow-x-auto crow-max-h-32 crow-overflow-y-auto crow-ml-4\">\n {JSON.stringify(toolCall.arguments, null, 2)}\n </pre>\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n );\n}\n\nexport default ReasoningTrace;\n","/**\n * MessageBubble - Individual message display\n */\n\nimport ReactMarkdown from \"react-markdown\";\n// import { formatTime } from \"../../utils\";\nimport type { Message, ToolCall, ToolRenderers } from \"../../types\";\nimport { ReasoningTrace } from \"./ReasoningTrace\";\nimport { StreamingText } from \"./StreamingText\";\nimport { useWidgetStyles, useShowThinking } from \"../../context/StyleContext\";\n\ninterface MessageBubbleProps {\n message: Message;\n toolCalls?: ToolCall[];\n isLoading?: boolean;\n toolRenderers?: ToolRenderers;\n onToolConsent?: (toolCallId: string, approved: boolean) => void;\n}\n\nexport function MessageBubble({\n message,\n toolCalls = [],\n isLoading = false,\n toolRenderers,\n onToolConsent,\n}: MessageBubbleProps) {\n const styles = useWidgetStyles();\n const showThinkingSetting = useShowThinking();\n\n const isWaiting =\n message.content === \"Thinking...\" ||\n (message.isBot && isLoading && !message.content);\n const hasThinking = message.isBot && message.thinking;\n const hasContent = message.content && message.content !== \"Thinking...\";\n const hasToolCalls = toolCalls.length > 0;\n\n // Always show reasoning trace for bot messages when there's activity\n // The showThinkingSetting controls whether detailed content is shown\n const showReasoningTrace =\n message.isBot && (isWaiting || hasThinking || hasToolCalls);\n\n const isStreaming = Boolean(message.isBot && isLoading && hasContent);\n\n return (\n <div\n id={message.id}\n className={`crow-flex crow-flex-col ${\n message.isBot ? \"crow-items-start\" : \"crow-items-end\"\n }`}\n >\n {showReasoningTrace && (\n <ReasoningTrace\n thinking={message.thinking}\n isComplete={message.thinkingComplete}\n toolCalls={toolCalls}\n isWaiting={isWaiting && !hasThinking}\n showDetails={showThinkingSetting}\n toolRenderers={toolRenderers}\n onToolConsent={onToolConsent}\n />\n )}\n\n {hasContent && (\n <div\n className=\"crow-max-w-[80%] crow-break-words crow-rounded-2xl crow-px-4 crow-py-2 crow-transition-all crow-duration-150\"\n style={\n message.isBot\n ? {\n background: styles.colors.botBubble,\n color: styles.colors.botText,\n }\n : {\n background: styles.colors.userBubble,\n color: styles.colors.userText,\n border: `1px solid ${styles.colors.userBorder}`,\n }\n }\n >\n <div>\n {message.isBot ? (\n <StreamingText\n content={message.content}\n isStreaming={isStreaming}\n />\n ) : (\n <ReactMarkdown\n components={{\n strong: ({ children }) => (\n <strong className=\"crow-font-bold\">{children}</strong>\n ),\n ul: ({ children }) => (\n <ul className=\"crow-list-disc crow-pl-5 crow-my-1.5\">\n {children}\n </ul>\n ),\n ol: ({ children }) => (\n <ol className=\"crow-list-decimal crow-pl-5 crow-my-1.5\">\n {children}\n </ol>\n ),\n li: ({ children }) => (\n <li className=\"crow-mb-0.5 last:crow-mb-0\">{children}</li>\n ),\n p: ({ children }) => (\n <p className=\"crow-mb-1.5 last:crow-mb-0\">{children}</p>\n ),\n a: ({ href, children }) => {\n const isInternal = href?.startsWith(\"/\");\n return (\n <a\n href={href}\n className=\"crow-underline hover:crow-text-blue-300\"\n {...(!isInternal && { target: \"_blank\", rel: \"noopener noreferrer\" })}\n onClick={\n isInternal\n ? (e) => {\n e.preventDefault();\n const a = document.createElement(\"a\");\n a.href = href!;\n a.style.display = \"none\";\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n }\n : undefined\n }\n >\n {children}\n </a>\n );\n },\n }}\n >\n {message.content}\n </ReactMarkdown>\n )}\n </div>\n {/* <div className=\"crow-text-xs crow-opacity-60 crow-mt-1\">\n {formatTime(message.timestamp)}\n </div> */}\n </div>\n )}\n </div>\n );\n}\n","/**\n * MessageList - Renders list of messages\n */\n\nimport type { Message, ToolCall, ToolRenderers } from \"../../types\";\nimport { MessageBubble } from \"./MessageBubble\";\nimport { LoadingHistory } from \"./LoadingHistory\";\n\ninterface MessageListProps {\n messages: Message[];\n activeToolCalls: ToolCall[];\n isLoadingHistory: boolean;\n isGenerating?: boolean;\n toolRenderers?: ToolRenderers;\n onToolConsent?: (toolCallId: string, approved: boolean) => void;\n}\n\nexport function MessageList({\n messages,\n activeToolCalls,\n isLoadingHistory,\n isGenerating = false,\n toolRenderers,\n onToolConsent,\n}: MessageListProps) {\n if (isLoadingHistory) {\n return <LoadingHistory />;\n }\n\n const lastBotIndex = messages.reduce(\n (lastIdx, m, i) => (m.isBot ? i : lastIdx),\n -1,\n );\n\n return (\n <>\n {messages.map((msg, index) => {\n const isLastBot = index === lastBotIndex;\n // For the currently streaming message, use activeToolCalls\n // For completed/historical messages, use the message's own toolCalls\n const toolCallsToShow = isLastBot && isGenerating\n ? activeToolCalls\n : msg.toolCalls || [];\n \n return (\n <MessageBubble\n key={msg.id}\n message={msg}\n toolCalls={toolCallsToShow}\n isLoading={isLastBot && isGenerating}\n toolRenderers={toolRenderers}\n onToolConsent={onToolConsent}\n />\n );\n })}\n </>\n );\n}\n","/**\n * MessagesContainer - Scrollable container for messages\n */\n\nimport {\n forwardRef,\n useEffect,\n useRef,\n useCallback,\n type ReactNode,\n} from \"react\";\nimport { motion } from \"framer-motion\";\nimport { useWidgetStyles } from \"../../context/StyleContext\";\nimport { MESSAGES_CONTAINER_ID } from \"../../constants\";\n\ninterface MessagesContainerProps {\n children: ReactNode;\n}\n\nexport const MessagesContainer = forwardRef<\n HTMLDivElement,\n MessagesContainerProps\n>(({ children }, ref) => {\n const styles = useWidgetStyles();\n const internalRef = useRef<HTMLDivElement>(null);\n const lastScrollHeightRef = useRef<number>(0);\n const isUserScrollingRef = useRef<boolean>(false);\n\n const containerRef = (ref as React.RefObject<HTMLDivElement>) || internalRef;\n\n const isNearBottom = useCallback(() => {\n const container = containerRef.current;\n if (!container) return true;\n const threshold = 100;\n return (\n container.scrollHeight - container.scrollTop - container.clientHeight <\n threshold\n );\n }, [containerRef]);\n\n const scrollToBottom = useCallback(() => {\n const container = containerRef.current;\n if (!container) return;\n\n container.scrollTo({\n top: container.scrollHeight,\n behavior: \"smooth\",\n });\n }, [containerRef]);\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n const handleScroll = () => {\n isUserScrollingRef.current = !isNearBottom();\n };\n\n container.addEventListener(\"scroll\", handleScroll, { passive: true });\n return () => container.removeEventListener(\"scroll\", handleScroll);\n }, [containerRef, isNearBottom]);\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n const currentHeight = container.scrollHeight;\n const heightChanged = currentHeight !== lastScrollHeightRef.current;\n\n if (heightChanged) {\n lastScrollHeightRef.current = currentHeight;\n\n if (!isUserScrollingRef.current || isNearBottom()) {\n scrollToBottom();\n }\n }\n });\n\n return (\n <motion.div\n ref={containerRef}\n id={MESSAGES_CONTAINER_ID}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: styles.animations.duration }}\n className=\"crow-relative crow-flex-1 crow-min-h-0 crow-rounded-2xl crow-mb-3 crow-overflow-y-auto crow-p-4 crow-space-y-3 crow-pointer-events-auto\"\n style={{ background: styles.colors.messagesBackground }}\n >\n {children}\n </motion.div>\n );\n});\n\nMessagesContainer.displayName = \"MessagesContainer\";\n","/**\n * ConversationList - Dropdown list of past conversations\n */\n\nimport { motion } from \"framer-motion\";\nimport { X } from \"lucide-react\";\nimport type { Conversation } from \"../../types\";\nimport { formatConversationDate } from \"../../utils\";\n\ninterface ConversationListProps {\n conversations: Conversation[];\n currentConversationId: string | null;\n onSelect: (id: string) => void;\n onClose: () => void;\n}\n\nexport function ConversationList({\n conversations,\n currentConversationId,\n onSelect,\n onClose,\n}: ConversationListProps) {\n return (\n <motion.div\n initial={{ opacity: 0, height: 0 }}\n animate={{ opacity: 1, height: \"auto\" }}\n exit={{ opacity: 0, height: 0 }}\n className=\"crow-mb-3 crow-rounded-xl crow-bg-gray-50 crow-border crow-border-gray-200\"\n >\n <div className=\"crow-p-2 crow-border-b crow-border-gray-200 crow-flex crow-justify-between crow-items-center\">\n <span className=\"crow-text-sm crow-font-medium crow-text-gray-700\">\n Recent Conversations\n </span>\n <button onClick={onClose} className=\"crow-p-1 hover:crow-bg-gray-200 crow-rounded\">\n <X size={14} className=\"crow-text-gray-500\" />\n </button>\n </div>\n <div className=\"crow-max-h-[200px] crow-overflow-y-auto\">\n {conversations.length === 0 ? (\n <div className=\"crow-p-4 crow-text-center crow-text-sm crow-text-gray-500\">\n No conversations yet\n </div>\n ) : (\n conversations.map((conv) => (\n <button\n key={conv.id}\n onClick={() => onSelect(conv.id)}\n className={`crow-w-full crow-p-3 crow-text-left hover:crow-bg-gray-100 crow-transition-colors crow-border-b crow-border-gray-100 last:crow-border-0 ${\n currentConversationId === conv.id ? \"crow-bg-blue-50\" : \"\"\n }`}\n >\n <div className=\"crow-text-sm crow-font-medium crow-text-gray-800 crow-truncate\">\n {conv.name || \"Untitled conversation\"}\n </div>\n <div className=\"crow-text-xs crow-text-gray-500 crow-mt-0.5\">\n {formatConversationDate(conv.updated_at)}\n </div>\n </button>\n ))\n )}\n </div>\n </motion.div>\n );\n}\n","/**\n * WorkflowPanel - Displays active workflow with todos\n */\n\nimport { motion } from \"framer-motion\";\nimport type { ActiveWorkflow } from \"../../types\";\n\ninterface WorkflowPanelProps {\n workflow: ActiveWorkflow;\n onExit: () => void;\n}\n\nexport function WorkflowPanel({ workflow, onExit }: WorkflowPanelProps) {\n return (\n <motion.div\n initial={{ opacity: 0, y: -10 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -10 }}\n transition={{ duration: 0.3 }}\n className=\"crow-mb-3 crow-p-3 crow-rounded-xl crow-bg-gray-50 crow-border crow-border-gray-200\"\n >\n <div className=\"crow-flex crow-items-center crow-justify-between\">\n <span className=\"crow-text-sm crow-font-medium crow-text-gray-900 crow-flex crow-items-center crow-gap-1\">\n {workflow.name}\n </span>\n <button\n onClick={onExit}\n className=\"crow-text-xs crow-text-gray-500 hover:crow-text-gray-700 crow-underline\"\n >\n Exit\n </button>\n </div>\n </motion.div>\n );\n}\n","/**\n * PoweredByBadge - Branding badge at bottom\n */\n\nimport { useWidgetStyles } from \"../../context/StyleContext\";\n\ninterface PoweredByBadgeProps {\n apiUrl?: string;\n}\n\nexport function PoweredByBadge({ apiUrl = \"\" }: PoweredByBadgeProps) {\n const styles = useWidgetStyles();\n const branding = styles.branding;\n\n if (!branding.showPoweredBy) return null;\n\n // Construct full logo URL using apiUrl to ensure it works on third-party sites\n const logoUrl = branding.logoUrl?.startsWith(\"http\") \n ? branding.logoUrl \n : `${apiUrl}${branding.logoUrl}`;\n\n return (\n <div className=\"crow-flex crow-items-center crow-justify-center crow-gap-1.5 crow-mb-3 crow-text-xs crow-text-gray-400\">\n {branding.showLogo && logoUrl && (\n <img\n src={logoUrl}\n alt=\"Crow\"\n width={14}\n height={14}\n className=\"crow-opacity-50\"\n />\n )}\n <span>{branding.poweredByText}</span>\n </div>\n );\n}\n","/**\n * ModelSelector - Dropdown for selecting AI models\n */\n\nimport React, { useState, useRef, useEffect } from \"react\";\nimport { ChevronDown, Check } from \"lucide-react\";\nimport { cn } from \"../../utils\";\nimport type { Model } from \"../../types\";\n\ninterface ModelSelectorProps {\n models: Model[];\n selectedModel: string;\n onModelChange: (modelId: string) => void;\n disabled?: boolean;\n}\n\nexport const ModelSelector: React.FC<ModelSelectorProps> = ({\n models,\n selectedModel,\n onModelChange,\n disabled = false,\n}) => {\n const [isOpen, setIsOpen] = useState(false);\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n dropdownRef.current &&\n !dropdownRef.current.contains(event.target as Node)\n ) {\n setIsOpen(false);\n }\n };\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\n }, []);\n\n const selectedModelData = models.find((m) => m.id === selectedModel);\n\n const groupedModels = models.reduce((acc, model) => {\n if (!acc[model.provider]) acc[model.provider] = [];\n acc[model.provider].push(model);\n return acc;\n }, {} as Record<string, Model[]>);\n\n return (\n <div className=\"crow-relative\" ref={dropdownRef}>\n <button\n type=\"button\"\n onClick={() => !disabled && setIsOpen(!isOpen)}\n disabled={disabled}\n className={cn(\n \"crow-flex crow-items-center crow-gap-1 crow-px-2 crow-py-1 crow-rounded-md crow-text-xs\",\n \"crow-bg-transparent crow-text-gray-400\",\n \"hover:crow-text-gray-700 crow-transition-colors\",\n disabled ? \"crow-opacity-50 crow-cursor-not-allowed\" : \"crow-cursor-pointer\"\n )}\n >\n <span>{selectedModelData?.name || \"Select Model\"}</span>\n <ChevronDown\n className={cn(\n \"crow-w-3 crow-h-3 crow-transition-transform\",\n isOpen ? \"crow-rotate-180\" : \"\"\n )}\n />\n </button>\n\n {isOpen && (\n <div className=\"crow-absolute crow-bottom-full crow-mb-2 crow-left-0 crow-min-w-[180px] crow-bg-white crow-border crow-border-gray-200 crow-rounded-xl crow-shadow-lg crow-z-50 crow-overflow-hidden\">\n {Object.entries(groupedModels).map(([provider, providerModels]) => (\n <div key={provider}>\n <div className=\"crow-px-3 crow-py-1.5 crow-text-xs crow-font-medium crow-text-gray-400 crow-uppercase crow-tracking-wide crow-bg-gray-50\">\n {provider}\n </div>\n {providerModels.map((model) => (\n <button\n key={model.id}\n onClick={() => {\n onModelChange(model.id);\n setIsOpen(false);\n }}\n className={cn(\n \"crow-w-full crow-flex crow-items-center crow-justify-between crow-px-3 crow-py-1.5 crow-text-sm\",\n \"hover:crow-bg-gray-100 crow-transition-colors\",\n model.id === selectedModel ? \"crow-text-gray-900\" : \"crow-text-gray-600\"\n )}\n >\n <span>{model.name}</span>\n {model.id === selectedModel && (\n <Check className=\"crow-w-4 crow-h-4 crow-text-green-500\" />\n )}\n </button>\n ))}\n </div>\n ))}\n </div>\n )}\n </div>\n );\n};\n","/**\n * useVoiceInput - Speech-to-text via Gradium STT WebSocket\n *\n * Uses MediaRecorder API (works on all browsers including mobile Safari)\n * and streams audio to backend WebSocket proxy for Gradium STT.\n */\n\nimport { useState, useRef, useCallback, useEffect } from \"react\";\n\nexport interface UseVoiceInputOptions {\n /** Backend URL for WebSocket connection (e.g., \"ws://localhost:8000\" or \"wss://api.example.com\") */\n backendUrl: string;\n /** Auto-submit after silence. If set, stops recording after this many ms of silence. */\n silenceTimeoutMs?: number;\n}\n\nexport interface UseVoiceInputReturn {\n /** Whether the browser supports audio recording (MediaRecorder API) */\n supported: boolean;\n /** Whether currently recording */\n isRecording: boolean;\n /** Current transcript (accumulated final results) */\n transcript: string;\n /** Error message if any */\n error: string | null;\n /** Start recording */\n start: () => void;\n /** Stop recording and finalize transcript */\n stop: () => void;\n /** Toggle recording on/off */\n toggle: () => void;\n /** Clear the transcript */\n clear: () => void;\n}\n\nconst isMediaRecorderSupported = (): boolean => {\n if (typeof window === \"undefined\") return false;\n return !!(\n navigator.mediaDevices &&\n typeof navigator.mediaDevices.getUserMedia === \"function\" &&\n (window.AudioContext || (window as any).webkitAudioContext)\n );\n};\n\nexport function useVoiceInput(\n options: UseVoiceInputOptions\n): UseVoiceInputReturn {\n const { backendUrl, silenceTimeoutMs } = options;\n\n const [supported] = useState(() => isMediaRecorderSupported());\n const [isRecording, setIsRecording] = useState(false);\n const [transcript, setTranscript] = useState(\"\");\n const [error, setError] = useState<string | null>(null);\n\n const wsRef = useRef<WebSocket | null>(null);\n const streamRef = useRef<MediaStream | null>(null);\n const audioContextRef = useRef<AudioContext | null>(null);\n const processorRef = useRef<ScriptProcessorNode | null>(null);\n const silenceTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const transcriptRef = useRef(\"\"); // Accumulated final text\n const interimRef = useRef(\"\"); // Current interim text (last word being spoken)\n const isRecordingRef = useRef(false);\n\n const clearSilenceTimer = useCallback(() => {\n if (silenceTimerRef.current) {\n clearTimeout(silenceTimerRef.current);\n silenceTimerRef.current = null;\n }\n }, []);\n\n const cleanup = useCallback(() => {\n clearSilenceTimer();\n isRecordingRef.current = false;\n\n // Include any pending interim text in the final transcript\n if (interimRef.current) {\n transcriptRef.current += interimRef.current + \" \";\n setTranscript(transcriptRef.current.trim());\n interimRef.current = \"\";\n }\n\n // Close WebSocket\n if (wsRef.current) {\n try {\n if (wsRef.current.readyState === WebSocket.OPEN) {\n wsRef.current.send(JSON.stringify({ type: \"stop\" }));\n }\n wsRef.current.close();\n } catch (e) {\n // Ignore cleanup errors\n }\n wsRef.current = null;\n }\n\n // Disconnect audio processor\n if (processorRef.current) {\n processorRef.current.disconnect();\n processorRef.current = null;\n }\n\n // Close audio context\n if (audioContextRef.current) {\n audioContextRef.current.close();\n audioContextRef.current = null;\n }\n\n // Stop media stream\n if (streamRef.current) {\n streamRef.current.getTracks().forEach((track) => track.stop());\n streamRef.current = null;\n }\n\n setIsRecording(false);\n }, [clearSilenceTimer]);\n\n const stop = useCallback(() => {\n cleanup();\n }, [cleanup]);\n\n const clear = useCallback(() => {\n setTranscript(\"\");\n transcriptRef.current = \"\";\n setError(null);\n }, []);\n\n const startAudioCapture = useCallback(() => {\n if (!streamRef.current || !wsRef.current) return;\n\n audioContextRef.current = new (window.AudioContext ||\n (window as any).webkitAudioContext)({ sampleRate: 24000 });\n const source = audioContextRef.current.createMediaStreamSource(\n streamRef.current\n );\n processorRef.current = audioContextRef.current.createScriptProcessor(\n 4096,\n 1,\n 1\n );\n\n processorRef.current.onaudioprocess = (event) => {\n if (\n !isRecordingRef.current ||\n !wsRef.current ||\n wsRef.current.readyState !== WebSocket.OPEN\n ) {\n return;\n }\n\n const inputData = event.inputBuffer.getChannelData(0);\n const pcm16 = new Int16Array(inputData.length);\n\n for (let i = 0; i < inputData.length; i++) {\n const s = Math.max(-1, Math.min(1, inputData[i]));\n pcm16[i] = s < 0 ? s * 0x8000 : s * 0x7fff;\n }\n\n const bytes = new Uint8Array(pcm16.buffer);\n let binary = \"\";\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n\n wsRef.current.send(\n JSON.stringify({ type: \"audio\", data: btoa(binary) })\n );\n };\n\n source.connect(processorRef.current);\n processorRef.current.connect(audioContextRef.current.destination);\n }, []);\n\n const start = useCallback(async () => {\n if (!supported) {\n setError(\"Audio recording not supported in this browser\");\n return;\n }\n\n // Reset state\n setError(null);\n transcriptRef.current = \"\";\n setTranscript(\"\");\n\n try {\n // Get microphone access\n streamRef.current = await navigator.mediaDevices.getUserMedia({\n audio: {\n echoCancellation: true,\n noiseSuppression: true,\n sampleRate: 24000,\n },\n });\n\n // Build WebSocket URL\n const wsProtocol = backendUrl.startsWith(\"https\") ? \"wss\" : \"ws\";\n const wsHost = backendUrl.replace(/^https?:\\/\\//, \"\");\n const wsUrl = `${wsProtocol}://${wsHost}/api/stt/stream`;\n\n // Connect to backend\n wsRef.current = new WebSocket(wsUrl);\n\n wsRef.current.onopen = () => {\n wsRef.current?.send(JSON.stringify({ type: \"setup\" }));\n };\n\n wsRef.current.onmessage = (event) => {\n const msg = JSON.parse(event.data);\n\n if (msg.type === \"ready\") {\n startAudioCapture();\n isRecordingRef.current = true;\n setIsRecording(true);\n } else if (msg.type === \"transcript\") {\n if (msg.is_final && msg.text) {\n // Final result - add to transcript and clear interim\n transcriptRef.current += msg.text + \" \";\n interimRef.current = \"\";\n setTranscript(transcriptRef.current.trim());\n\n // Reset silence timer on new final transcript\n if (silenceTimeoutMs) {\n clearSilenceTimer();\n silenceTimerRef.current = setTimeout(() => {\n stop();\n }, silenceTimeoutMs);\n }\n } else if (!msg.is_final && msg.text) {\n // Interim result - track it so we can include it if stopped early\n interimRef.current = msg.text;\n // Show interim in UI\n setTranscript((transcriptRef.current + msg.text).trim());\n }\n } else if (msg.type === \"error\") {\n setError(msg.message || \"STT error\");\n cleanup();\n }\n };\n\n wsRef.current.onerror = () => {\n setError(\"WebSocket connection error\");\n cleanup();\n };\n\n wsRef.current.onclose = () => {\n if (isRecordingRef.current) {\n // Unexpected close\n cleanup();\n }\n };\n } catch (err) {\n setError(\n err instanceof Error ? err.message : \"Failed to start recording\"\n );\n cleanup();\n }\n }, [\n supported,\n backendUrl,\n startAudioCapture,\n silenceTimeoutMs,\n clearSilenceTimer,\n stop,\n cleanup,\n ]);\n\n const toggle = useCallback(() => {\n if (isRecording) {\n stop();\n } else {\n start();\n }\n }, [isRecording, start, stop]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n cleanup();\n };\n }, [cleanup]);\n\n return {\n supported,\n isRecording,\n transcript,\n error,\n start,\n stop,\n toggle,\n clear,\n };\n}\n","/**\n * PromptInputBox - Main input component for user messages\n */\n\nimport React from \"react\";\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\";\nimport { ArrowUp, Square, Mic } from \"lucide-react\";\nimport { ModelSelector } from \"./ModelSelector\";\nimport { useVoiceInput } from \"../../hooks/useVoiceInput\";\nimport { cn } from \"../../utils\";\nimport type { Model } from \"../../types\";\n\n// Textarea Component\ninterface TextareaProps\n extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {\n className?: string;\n}\n\nconst Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(\n ({ className, ...props }, ref) => (\n <textarea\n className={cn(\n \"crow-flex crow-w-full crow-rounded-md crow-border-none crow-bg-transparent crow-px-3 crow-py-1.5 crow-text-base crow-text-gray-900 placeholder:crow-text-gray-500 focus-visible:crow-outline-none focus-visible:crow-ring-0 disabled:crow-cursor-not-allowed disabled:crow-opacity-50 crow-min-h-[32px] crow-resize-none\",\n className,\n )}\n ref={ref}\n rows={1}\n {...props}\n />\n ),\n);\nTextarea.displayName = \"Textarea\";\n\n// Tooltip Components\nconst TooltipProvider = TooltipPrimitive.Provider;\nconst Tooltip = TooltipPrimitive.Root;\nconst TooltipTrigger = TooltipPrimitive.Trigger;\n\nconst TooltipContent = React.forwardRef<\n React.ElementRef<typeof TooltipPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <TooltipPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n \"crow-z-50 crow-overflow-hidden crow-rounded-md crow-border crow-border-gray-300 crow-bg-white crow-text-gray-900 crow-px-3 crow-py-1.5 crow-text-sm crow-shadow-md\",\n className,\n )}\n {...props}\n />\n));\nTooltipContent.displayName = \"TooltipContent\";\n\n// Button Component\ninterface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: \"default\" | \"outline\" | \"ghost\";\n size?: \"default\" | \"sm\" | \"lg\" | \"icon\";\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant = \"default\", size = \"default\", ...props }, ref) => {\n const variantClasses = {\n default: \"crow-bg-black hover:crow-bg-gray-800 crow-text-white\",\n outline: \"crow-border crow-bg-transparent hover:crow-bg-gray-100\",\n ghost: \"crow-bg-transparent hover:crow-bg-gray-100\",\n };\n const sizeClasses = {\n default: \"crow-h-10 crow-px-4 crow-py-2\",\n sm: \"crow-h-8 crow-px-3 crow-text-sm\",\n lg: \"crow-h-12 crow-px-6\",\n icon: \"crow-h-8 crow-w-8 crow-rounded-full\",\n };\n return (\n <button\n className={cn(\n \"crow-inline-flex crow-items-center crow-justify-center crow-font-medium crow-transition-colors focus-visible:crow-outline-none disabled:crow-pointer-events-none disabled:crow-opacity-50\",\n variantClasses[variant],\n sizeClasses[size],\n className,\n )}\n ref={ref}\n {...props}\n />\n );\n },\n);\nButton.displayName = \"Button\";\n\n// PromptInput Context\ninterface PromptInputContextType {\n isLoading: boolean;\n value: string;\n setValue: (value: string) => void;\n maxHeight: number | string;\n onSubmit?: () => void;\n disabled?: boolean;\n}\n\nconst PromptInputContext = React.createContext<PromptInputContextType>({\n isLoading: false,\n value: \"\",\n setValue: () => {},\n maxHeight: 240,\n onSubmit: undefined,\n disabled: false,\n});\n\nfunction usePromptInput() {\n const context = React.useContext(PromptInputContext);\n if (!context) {\n throw new Error(\"usePromptInput must be used within a PromptInput\");\n }\n return context;\n}\n\n// PromptInput Container\ninterface PromptInputProps {\n isLoading?: boolean;\n value?: string;\n onValueChange?: (value: string) => void;\n maxHeight?: number | string;\n onSubmit?: () => void;\n children: React.ReactNode;\n className?: string;\n disabled?: boolean;\n style?: React.CSSProperties;\n}\n\nconst PromptInput = React.forwardRef<HTMLDivElement, PromptInputProps>(\n (\n {\n className,\n isLoading = false,\n maxHeight = 240,\n value,\n onValueChange,\n onSubmit,\n children,\n disabled = false,\n style,\n },\n ref,\n ) => {\n const [internalValue, setInternalValue] = React.useState(value || \"\");\n\n const handleChange = (newValue: string) => {\n setInternalValue(newValue);\n onValueChange?.(newValue);\n };\n\n return (\n <TooltipProvider>\n <PromptInputContext.Provider\n value={{\n isLoading,\n value: value ?? internalValue,\n setValue: onValueChange ?? handleChange,\n maxHeight,\n onSubmit,\n disabled,\n }}\n >\n <div\n ref={ref}\n className={cn(\n \"crow-rounded-3xl crow-border crow-border-gray-300 crow-bg-white crow-p-1.5 crow-shadow-lg crow-transition-all crow-duration-300\",\n isLoading && \"crow-border-red-500\",\n className,\n )}\n style={style}\n >\n {children}\n </div>\n </PromptInputContext.Provider>\n </TooltipProvider>\n );\n },\n);\nPromptInput.displayName = \"PromptInput\";\n\n// PromptInput Textarea\ninterface PromptInputTextareaProps {\n disableAutosize?: boolean;\n placeholder?: string;\n}\n\nconst PromptInputTextarea: React.FC<\n PromptInputTextareaProps & React.ComponentProps<typeof Textarea>\n> = ({\n className,\n onKeyDown,\n disableAutosize = false,\n placeholder,\n ...props\n}) => {\n const { value, setValue, maxHeight, onSubmit, disabled } = usePromptInput();\n const textareaRef = React.useRef<HTMLTextAreaElement>(null);\n\n React.useEffect(() => {\n if (disableAutosize || !textareaRef.current) return;\n textareaRef.current.style.height = \"auto\";\n textareaRef.current.style.height =\n typeof maxHeight === \"number\"\n ? `${Math.min(textareaRef.current.scrollHeight, maxHeight)}px`\n : `min(${textareaRef.current.scrollHeight}px, ${maxHeight})`;\n }, [value, maxHeight, disableAutosize]);\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n onSubmit?.();\n }\n onKeyDown?.(e);\n };\n\n return (\n <Textarea\n ref={textareaRef}\n value={value}\n onChange={(e) => setValue(e.target.value)}\n onKeyDown={handleKeyDown}\n className={cn(\"text-base\", className)}\n disabled={disabled}\n placeholder={placeholder}\n {...props}\n />\n );\n};\n\n// PromptInput Actions Container\ninterface PromptInputActionsProps\n extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst PromptInputActions: React.FC<PromptInputActionsProps> = ({\n children,\n className,\n ...props\n}) => (\n <div\n className={cn(\"crow-flex crow-items-center crow-gap-2\", className)}\n {...props}\n >\n {children}\n </div>\n);\n\n// PromptInput Action with Tooltip\ninterface PromptInputActionProps extends React.ComponentProps<typeof Tooltip> {\n tooltip: React.ReactNode;\n children: React.ReactNode;\n side?: \"top\" | \"bottom\" | \"left\" | \"right\";\n}\n\nconst PromptInputAction: React.FC<PromptInputActionProps> = ({\n tooltip,\n children,\n side = \"top\",\n ...props\n}) => {\n return (\n <Tooltip {...props}>\n <TooltipTrigger asChild>{children}</TooltipTrigger>\n <TooltipContent side={side}>{tooltip}</TooltipContent>\n </Tooltip>\n );\n};\n\n// Main PromptInputBox Component\ninterface PromptInputBoxProps {\n onSend?: (message: string) => void;\n onStop?: () => void;\n isLoading?: boolean;\n /** Show stop button even when not loading (e.g., during ask_user prompts) */\n showStopButton?: boolean;\n placeholder?: string;\n className?: string;\n selectedModel?: string;\n onModelChange?: (model: string) => void;\n availableModels?: Model[];\n /** When true, adds a pulsing highlight effect to indicate user input is needed */\n highlighted?: boolean;\n /** Backend URL for voice input WebSocket (required for voice input to work) */\n backendUrl?: string;\n /** When this value changes (and is > 0), start voice recording */\n triggerVoiceRecording?: number;\n}\n\nexport const PromptInputBox = React.forwardRef<\n HTMLDivElement,\n PromptInputBoxProps\n>(\n (\n {\n onSend = () => {},\n onStop,\n isLoading = false,\n showStopButton = false,\n placeholder = \"Type your message here...\",\n className,\n selectedModel = \"gpt-4o\",\n onModelChange,\n availableModels = [],\n highlighted = false,\n backendUrl = \"\",\n triggerVoiceRecording = 0,\n },\n ref,\n ) => {\n const [input, setInput] = React.useState(\"\");\n const promptBoxRef = React.useRef<HTMLDivElement>(null);\n // Auto-send after 1.5 seconds of silence\n const voice = useVoiceInput({ backendUrl, silenceTimeoutMs: 1500 });\n\n // Start recording when triggerVoiceRecording changes\n const lastTriggerRef = React.useRef(0);\n const voiceRef = React.useRef(voice);\n voiceRef.current = voice;\n React.useEffect(() => {\n if (triggerVoiceRecording > 0 && triggerVoiceRecording !== lastTriggerRef.current) {\n console.log('[Voice] Auto-starting recording from trigger');\n voiceRef.current.start();\n }\n lastTriggerRef.current = triggerVoiceRecording;\n }, [triggerVoiceRecording]);\n\n // Sync voice transcript into the input field while recording\n React.useEffect(() => {\n if (voice.isRecording && voice.transcript) {\n setInput(voice.transcript);\n }\n }, [voice.isRecording, voice.transcript]);\n\n // When recording stops and there's a transcript, auto-send the message\n const wasRecordingRef = React.useRef(false);\n React.useEffect(() => {\n if (wasRecordingRef.current && !voice.isRecording && voice.transcript) {\n // Auto-send the voice message\n const messageToSend = voice.transcript.trim();\n if (messageToSend) {\n console.log('[Voice] Auto-sending:', messageToSend);\n onSend(messageToSend);\n setInput(\"\");\n }\n voice.clear();\n }\n wasRecordingRef.current = voice.isRecording;\n }, [voice.isRecording, voice.transcript, voice.clear, onSend]);\n\n const handleSubmit = () => {\n if (input.trim()) {\n // Stop recording if active\n if (voice.isRecording) {\n voice.stop();\n }\n onSend(input);\n setInput(\"\");\n }\n };\n\n const hasContent = input.trim() !== \"\";\n\n return (\n <PromptInput\n value={input}\n onValueChange={setInput}\n isLoading={isLoading}\n onSubmit={handleSubmit}\n className={cn(\n \"crow-w-full crow-shadow-lg crow-transition-all crow-duration-300 crow-ease-in-out\",\n highlighted && \"crow-ring-4 crow-ring-offset-2 crow-animate-pulse crow-shadow-[0_0_20px_rgba(0,0,0,0.25)]\",\n className,\n )}\n style={highlighted ? {\n '--tw-ring-color': 'var(--crow-user-bubble, #000)',\n '--tw-ring-offset-color': 'var(--crow-background, #fff)',\n } as React.CSSProperties : undefined}\n disabled={isLoading}\n ref={ref || promptBoxRef}\n >\n <div className=\"crow-transition-all crow-duration-300 crow-opacity-100\">\n <PromptInputTextarea\n placeholder={placeholder}\n className=\"crow-text-base\"\n />\n </div>\n\n <PromptInputActions className=\"crow-flex crow-items-center crow-justify-between crow-gap-2 crow-p-0 crow-pt-1\">\n {/* Model Selector - Left side */}\n <div className=\"crow-flex crow-items-center\">\n {availableModels.length > 0 && onModelChange && (\n <ModelSelector\n models={availableModels}\n selectedModel={selectedModel}\n onModelChange={onModelChange}\n disabled={isLoading}\n />\n )}\n </div>\n\n {/* Voice + Send/Stop Buttons - Right side */}\n <div className=\"crow-flex crow-items-center crow-gap-1\">\n {/* Mic button — shown when: voice supported, not loading, no content typed */}\n {voice.supported && !isLoading && !showStopButton && (\n <PromptInputAction\n tooltip={voice.isRecording ? \"Stop recording\" : \"Voice input\"}\n >\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className={cn(\n \"crow-h-7 crow-w-7 crow-rounded-full crow-transition-all crow-duration-200\",\n voice.isRecording && \"crow-bg-red-100 hover:crow-bg-red-200\",\n )}\n onClick={voice.toggle}\n >\n <Mic\n className={cn(\n \"crow-h-3.5 crow-w-3.5 crow-transition-colors\",\n voice.isRecording ? \"crow-text-red-500\" : \"crow-text-gray-400\",\n )}\n />\n {voice.isRecording && (\n <span className=\"crow-absolute crow-top-0 crow-right-0 crow-h-2 crow-w-2 crow-rounded-full crow-bg-red-500 crow-animate-pulse\" />\n )}\n </Button>\n </PromptInputAction>\n )}\n\n {/* Send / Stop button */}\n <PromptInputAction\n tooltip={\n isLoading || showStopButton\n ? \"Stop generation\"\n : hasContent\n ? \"Send message\"\n : \"Type a message\"\n }\n >\n <Button\n variant=\"default\"\n size=\"icon\"\n className={cn(\n \"crow-h-7 crow-w-7 crow-rounded-full crow-transition-all crow-duration-200\",\n (isLoading || showStopButton) && \"crow-bg-red-500 hover:crow-bg-red-500\",\n hasContent &&\n !isLoading &&\n !showStopButton &&\n \"crow-bg-black hover:crow-bg-gray-800\",\n !hasContent && !isLoading && !showStopButton && \"crow-bg-transparent\",\n )}\n onClick={() => {\n if ((isLoading || showStopButton) && onStop) {\n onStop();\n } else if (hasContent) {\n handleSubmit();\n }\n }}\n >\n {isLoading || showStopButton ? (\n <Square\n className=\"crow-h-3.5 crow-w-3.5 crow-text-white\"\n style={{ fill: \"white\" }}\n />\n ) : (\n <ArrowUp\n className={cn(\n \"crow-h-3.5 crow-w-3.5\",\n hasContent ? \"crow-text-white\" : \"crow-text-gray-400\",\n )}\n />\n )}\n </Button>\n </PromptInputAction>\n </div>\n </PromptInputActions>\n </PromptInput>\n );\n },\n);\n\nPromptInputBox.displayName = \"PromptInputBox\";\n","/**\n * BrowserUseConfirmation - Confirmation card for browser automation\n * \n * Shown when the browser agent wants to start automation, asking user permission.\n */\n\nimport { useWidgetStyles } from \"../../context/StyleContext\";\n\ninterface BrowserUseConfirmationProps {\n instruction: string;\n onAllow: () => void;\n onDeny: () => void;\n}\n\nexport function BrowserUseConfirmation({\n instruction,\n onAllow,\n onDeny,\n}: BrowserUseConfirmationProps) {\n const styles = useWidgetStyles();\n\n return (\n <div\n className=\"crow-flex crow-flex-col crow-items-start crow-w-full crow-max-w-[90%]\"\n >\n <div\n className=\"crow-rounded-2xl crow-px-4 crow-py-3 crow-w-full crow-border\"\n style={{\n background: styles.colors.botBubble,\n borderColor: styles.colors.primary,\n }}\n >\n {/* Header */}\n <div className=\"crow-flex crow-items-center crow-gap-2 crow-mb-2\">\n <span className=\"crow-text-lg\">🖱️</span>\n <span\n className=\"crow-font-medium crow-text-sm\"\n style={{ color: styles.colors.primary }}\n >\n Browser Agent\n </span>\n </div>\n\n {/* Title */}\n <p\n className=\"crow-text-sm crow-font-medium crow-mb-2\"\n style={{ color: styles.colors.botText }}\n >\n Wants to automate your browser:\n </p>\n\n {/* Instruction */}\n <p\n className=\"crow-text-sm crow-mb-4 crow-bg-black/5 crow-rounded crow-p-2 crow-italic\"\n style={{ color: styles.colors.botText }}\n >\n \"{instruction}\"\n </p>\n\n {/* Actions */}\n <div className=\"crow-flex crow-gap-2 crow-justify-end\">\n <button\n onClick={onDeny}\n className=\"crow-px-4 crow-py-1.5 crow-rounded-lg crow-text-sm crow-font-medium crow-transition-colors hover:crow-opacity-80\"\n style={{\n background: \"transparent\",\n color: styles.colors.botText,\n border: `1px solid ${styles.colors.border}`,\n }}\n >\n Deny\n </button>\n <button\n onClick={onAllow}\n className=\"crow-px-4 crow-py-1.5 crow-rounded-lg crow-text-sm crow-font-medium crow-transition-colors hover:crow-opacity-90\"\n style={{\n background: styles.colors.primary,\n color: \"#fff\",\n }}\n >\n Allow\n </button>\n </div>\n </div>\n </div>\n );\n}\n","/**\n * BrowserUseQuestion - Question message from browser agent\n * \n * Shown when the browser agent needs user input/clarification during automation.\n */\n\nimport { useState, useCallback, type KeyboardEvent } from \"react\";\nimport { useWidgetStyles } from \"../../context/StyleContext\";\n\ninterface BrowserUseQuestionProps {\n question: string;\n onSubmit: (answer: string) => void;\n}\n\nexport function BrowserUseQuestion({\n question,\n onSubmit,\n}: BrowserUseQuestionProps) {\n const styles = useWidgetStyles();\n const [answer, setAnswer] = useState(\"\");\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n const handleSubmit = useCallback(() => {\n if (answer.trim() && !isSubmitting) {\n setIsSubmitting(true);\n onSubmit(answer.trim());\n }\n }, [answer, isSubmitting, onSubmit]);\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n handleSubmit();\n }\n },\n [handleSubmit]\n );\n\n return (\n <div className=\"crow-flex crow-flex-col crow-items-start crow-w-full crow-max-w-[90%]\">\n <div\n className=\"crow-rounded-2xl crow-px-4 crow-py-3 crow-w-full crow-border\"\n style={{\n background: styles.colors.botBubble,\n borderColor: styles.colors.primary,\n }}\n >\n {/* Header */}\n <div className=\"crow-flex crow-items-center crow-gap-2 crow-mb-2\">\n <span className=\"crow-text-lg\">🤖</span>\n <span\n className=\"crow-font-medium crow-text-sm\"\n style={{ color: styles.colors.primary }}\n >\n Browser Agent asks:\n </span>\n </div>\n\n {/* Question */}\n <p\n className=\"crow-text-sm crow-mb-3\"\n style={{ color: styles.colors.botText }}\n >\n {question}\n </p>\n\n {/* Input and Submit */}\n <div className=\"crow-flex crow-gap-2\">\n <input\n type=\"text\"\n value={answer}\n onChange={(e) => setAnswer(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder=\"Type your response...\"\n disabled={isSubmitting}\n className=\"crow-flex-1 crow-px-3 crow-py-2 crow-rounded-lg crow-text-sm crow-border crow-outline-none focus:crow-ring-2 disabled:crow-opacity-50\"\n style={{\n background: styles.colors.background,\n color: styles.colors.text,\n borderColor: styles.colors.border,\n }}\n autoFocus\n />\n <button\n onClick={handleSubmit}\n disabled={!answer.trim() || isSubmitting}\n className=\"crow-px-4 crow-py-2 crow-rounded-lg crow-text-sm crow-font-medium crow-transition-colors hover:crow-opacity-90 disabled:crow-opacity-50 disabled:crow-cursor-not-allowed\"\n style={{\n background: styles.colors.primary,\n color: \"#fff\",\n }}\n >\n {isSubmitting ? \"Sending...\" : \"Send\"}\n </button>\n </div>\n </div>\n </div>\n );\n}\n","/**\n * SuggestedActions - Horizontal row of clickable action chips\n */\n\nimport type { SuggestedAction } from \"@usecrow/client\";\nimport { useWidgetStyles } from \"../../context/StyleContext\";\n\ninterface SuggestedActionsProps {\n actions: SuggestedAction[];\n onActionClick: (action: SuggestedAction) => void;\n}\n\nexport function SuggestedActions({\n actions,\n onActionClick,\n}: SuggestedActionsProps) {\n const styles = useWidgetStyles();\n\n return (\n <div className=\"crow-flex crow-flex-wrap crow-gap-2 crow-px-1 crow-pb-2\">\n {actions.map((action, idx) => (\n <button\n key={idx}\n onClick={() => onActionClick(action)}\n className=\"crow-rounded-full crow-border crow-px-3 crow-py-1.5 crow-text-sm crow-font-medium crow-transition-colors hover:crow-opacity-80 crow-cursor-pointer\"\n style={{\n borderColor: styles.colors.primary,\n color: styles.colors.primary,\n background: \"transparent\",\n }}\n >\n {action.label}\n </button>\n ))}\n </div>\n );\n}\n","/**\n * CSS Custom Properties Utility\n * \n * Converts the nested style configuration to CSS custom properties (variables).\n * These variables are applied to the widget root element and consumed by\n * component-specific CSS classes.\n */\n\nimport type { ResolvedWidgetStyles } from './types';\n\n/**\n * CSS variable names used by the widget.\n * Components reference these via var(--crow-*) in CSS.\n */\nexport const CSS_VAR_NAMES = {\n // Colors\n colors: {\n primary: '--crow-colors-primary',\n background: '--crow-colors-background',\n border: '--crow-colors-border',\n text: '--crow-colors-text',\n botBubble: '--crow-colors-bot-bubble',\n botText: '--crow-colors-bot-text',\n userBubble: '--crow-colors-user-bubble',\n userText: '--crow-colors-user-text',\n userBorder: '--crow-colors-user-border',\n messagesBackground: '--crow-colors-messages-background',\n bubbleBackground: '--crow-colors-bubble-background',\n bubbleBorder: '--crow-colors-bubble-border',\n bubbleIcon: '--crow-colors-bubble-icon',\n },\n // Dimensions\n dimensions: {\n width: '--crow-dimensions-width',\n maxHeight: '--crow-dimensions-max-height',\n messagesMaxHeight: '--crow-dimensions-messages-max-height',\n borderRadius: '--crow-dimensions-border-radius',\n padding: '--crow-dimensions-padding',\n },\n // Typography\n typography: {\n fontFamily: '--crow-typography-font-family',\n fontSize: '--crow-typography-font-size',\n headerFontSize: '--crow-typography-header-font-size',\n fontWeight: '--crow-typography-font-weight',\n lineHeight: '--crow-typography-line-height',\n letterSpacing: '--crow-typography-letter-spacing',\n },\n // Position\n position: {\n right: '--crow-position-right',\n bottom: '--crow-position-bottom',\n bubbleRight: '--crow-position-bubble-right',\n bubbleBottom: '--crow-position-bubble-bottom',\n },\n // Bubble\n bubble: {\n size: '--crow-bubble-size',\n iconSize: '--crow-bubble-icon-size',\n },\n // Shadows\n shadows: {\n widget: '--crow-shadows-widget',\n bubble: '--crow-shadows-bubble',\n },\n // Animations\n animations: {\n duration: '--crow-animations-duration',\n },\n} as const;\n\n/**\n * Convert a resolved widget style configuration to CSS custom properties.\n * \n * @param styles - The fully resolved widget styles (with all defaults applied)\n * @returns An object of CSS variable name to value, suitable for use as React inline styles\n * \n * @example\n * const cssVars = stylesToCssVars(resolvedStyles);\n * // Returns: { '--crow-colors-background': 'rgba(255,255,255,0.95)', ... }\n * <div style={cssVars}>...</div>\n */\nexport function stylesToCssVars(styles: ResolvedWidgetStyles): Record<string, string> {\n const vars: Record<string, string> = {};\n\n // Colors\n vars[CSS_VAR_NAMES.colors.primary] = styles.colors.primary;\n vars[CSS_VAR_NAMES.colors.background] = styles.colors.background;\n vars[CSS_VAR_NAMES.colors.border] = styles.colors.border;\n vars[CSS_VAR_NAMES.colors.text] = styles.colors.text;\n vars[CSS_VAR_NAMES.colors.botBubble] = styles.colors.botBubble;\n vars[CSS_VAR_NAMES.colors.botText] = styles.colors.botText;\n vars[CSS_VAR_NAMES.colors.userBubble] = styles.colors.userBubble;\n vars[CSS_VAR_NAMES.colors.userText] = styles.colors.userText;\n vars[CSS_VAR_NAMES.colors.userBorder] = styles.colors.userBorder;\n vars[CSS_VAR_NAMES.colors.messagesBackground] = styles.colors.messagesBackground;\n vars[CSS_VAR_NAMES.colors.bubbleBackground] = styles.colors.bubbleBackground;\n vars[CSS_VAR_NAMES.colors.bubbleBorder] = styles.colors.bubbleBorder;\n vars[CSS_VAR_NAMES.colors.bubbleIcon] = styles.colors.bubbleIcon;\n\n // Dimensions (add 'px' suffix for numeric values)\n vars[CSS_VAR_NAMES.dimensions.width] = `${styles.dimensions.width}px`;\n vars[CSS_VAR_NAMES.dimensions.maxHeight] = `${styles.dimensions.maxHeight}px`;\n vars[CSS_VAR_NAMES.dimensions.messagesMaxHeight] = `${styles.dimensions.messagesMaxHeight}px`;\n vars[CSS_VAR_NAMES.dimensions.borderRadius] = `${styles.dimensions.borderRadius}px`;\n vars[CSS_VAR_NAMES.dimensions.padding] = `${styles.dimensions.padding}px`;\n\n // Typography\n vars[CSS_VAR_NAMES.typography.fontFamily] = styles.typography.fontFamily;\n vars[CSS_VAR_NAMES.typography.fontSize] = `${styles.typography.fontSize}px`;\n vars[CSS_VAR_NAMES.typography.headerFontSize] = `${styles.typography.headerFontSize}px`;\n vars[CSS_VAR_NAMES.typography.fontWeight] = String(styles.typography.fontWeight);\n vars[CSS_VAR_NAMES.typography.lineHeight] = String(styles.typography.lineHeight);\n vars[CSS_VAR_NAMES.typography.letterSpacing] = `${styles.typography.letterSpacing}px`;\n\n // Position\n vars[CSS_VAR_NAMES.position.right] = `${styles.position.right}px`;\n vars[CSS_VAR_NAMES.position.bottom] = `${styles.position.bottom}px`;\n vars[CSS_VAR_NAMES.position.bubbleRight] = `${styles.position.bubbleRight}px`;\n vars[CSS_VAR_NAMES.position.bubbleBottom] = `${styles.position.bubbleBottom}px`;\n\n // Bubble\n vars[CSS_VAR_NAMES.bubble.size] = `${styles.bubble.size}px`;\n vars[CSS_VAR_NAMES.bubble.iconSize] = `${styles.bubble.iconSize}px`;\n\n // Shadows (already CSS strings)\n vars[CSS_VAR_NAMES.shadows.widget] = styles.shadows.widget;\n vars[CSS_VAR_NAMES.shadows.bubble] = styles.shadows.bubble;\n\n // Animations\n vars[CSS_VAR_NAMES.animations.duration] = `${styles.animations.duration}s`;\n\n return vars;\n}\n\n/**\n * Get a specific CSS variable value from the widget root element.\n * Useful for JavaScript that needs to read current style values.\n * \n * @param varName - The CSS variable name (e.g., '--crow-colors-primary')\n * @param element - The element to read from (defaults to document.documentElement)\n * @returns The computed value of the CSS variable\n */\nexport function getCssVar(varName: string, element: Element = document.documentElement): string {\n return getComputedStyle(element).getPropertyValue(varName).trim();\n}\n","/**\n * CSS Styles for Crow Widget\n * \n * Exports the compiled CSS as a string for Shadow DOM injection.\n * Auto-injection is disabled to prevent CSS leaking to host pages.\n * \n * DO NOT EDIT THE CSS_CONTENT - Generated by scripts/inject-css.js\n */\n\nconst STYLE_ID = 'crow-ui-styles';\nconst BODY_STYLE_ID = 'crow-copilot-body-styles';\n\n/**\n * Body-related CSS for copilot push effect\n * These styles MUST be injected into document.head (not Shadow DOM)\n * because they need to affect the body element outside the shadow boundary.\n */\nexport const COPILOT_BODY_CSS = `\n/* Crow Copilot - Body push effect */\nbody.crow-copilot-open-right {\n margin-right: var(--crow-copilot-width, 400px) !important;\n transition: margin 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\nbody.crow-copilot-open-left {\n margin-left: var(--crow-copilot-width, 400px) !important;\n transition: margin 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\nbody {\n transition: margin 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n}\n`;\n\n/**\n * Inject copilot body styles into document.head\n * Call this when using CrowCopilot with variant=\"floating\"\n */\nexport function injectCopilotBodyStyles(): void {\n if (typeof document === 'undefined') return;\n if (document.getElementById(BODY_STYLE_ID)) return;\n \n const style = document.createElement('style');\n style.id = BODY_STYLE_ID;\n style.textContent = COPILOT_BODY_CSS;\n document.head.appendChild(style);\n}\n\n/**\n * Compiled CSS content including Tailwind utilities with crow- prefix\n * This should be injected into the Shadow DOM, not document.head\n */\nexport const WIDGET_CSS = `*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }\n\n/*! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:\"\"}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.crow-pointer-events-none{pointer-events:none}.crow-pointer-events-auto{pointer-events:auto}.crow-fixed{position:fixed}.crow-absolute{position:absolute}.crow-relative{position:relative}.crow-sticky{position:sticky}.crow-bottom-0{bottom:0}.crow-bottom-full{bottom:100%}.crow-left-0{left:0}.crow-right-0{right:0}.crow-top-0{top:0}.crow-z-50{z-index:50}.crow-z-\\\\[999999\\\\]{z-index:999999}.crow-m-0{margin:0}.crow-mx-3{margin-left:.75rem;margin-right:.75rem}.crow-my-1{margin-top:.25rem;margin-bottom:.25rem}.crow-my-1\\\\.5{margin-top:.375rem;margin-bottom:.375rem}.crow-my-2{margin-top:.5rem;margin-bottom:.5rem}.crow-mb-0{margin-bottom:0}.crow-mb-0\\\\.5{margin-bottom:.125rem}.crow-mb-1{margin-bottom:.25rem}.crow-mb-1\\\\.5{margin-bottom:.375rem}.crow-mb-2{margin-bottom:.5rem}.crow-mb-3{margin-bottom:.75rem}.crow-mb-4{margin-bottom:1rem}.crow-ml-0{margin-left:0}.crow-ml-0\\\\.5{margin-left:.125rem}.crow-ml-2{margin-left:.5rem}.crow-ml-4{margin-left:1rem}.crow-mt-0{margin-top:0}.crow-mt-0\\\\.5{margin-top:.125rem}.crow-mt-1{margin-top:.25rem}.crow-mt-1\\\\.5{margin-top:.375rem}.crow-mt-2{margin-top:.5rem}.crow-mt-auto{margin-top:auto}.crow-block{display:block}.crow-inline-block{display:inline-block}.crow-flex{display:flex}.crow-inline-flex{display:inline-flex}.crow-h-10{height:2.5rem}.crow-h-12{height:3rem}.crow-h-2{height:.5rem}.crow-h-3{height:.75rem}.crow-h-3\\\\.5{height:.875rem}.crow-h-4{height:1rem}.crow-h-7{height:1.75rem}.crow-h-8{height:2rem}.crow-h-full{height:100%}.crow-max-h-32{max-height:8rem}.crow-max-h-\\\\[200px\\\\]{max-height:200px}.crow-min-h-0{min-height:0}.crow-min-h-\\\\[32px\\\\]{min-height:32px}.crow-min-h-\\\\[40px\\\\]{min-height:40px}.crow-w-0{width:0}.crow-w-0\\\\.5{width:.125rem}.crow-w-2{width:.5rem}.crow-w-3{width:.75rem}.crow-w-3\\\\.5{width:.875rem}.crow-w-4{width:1rem}.crow-w-7{width:1.75rem}.crow-w-8{width:2rem}.crow-w-full{width:100%}.crow-min-w-0{min-width:0}.crow-min-w-\\\\[180px\\\\]{min-width:180px}.crow-max-w-\\\\[80\\\\%\\\\]{max-width:80%}.crow-max-w-\\\\[90\\\\%\\\\]{max-width:90%}.crow-max-w-full{max-width:100%}.crow-flex-1{flex:1 1 0%}.crow-flex-shrink-0,.crow-shrink-0{flex-shrink:0}.crow-rotate-180{--tw-rotate:180deg}.crow-rotate-180,.crow-scale-100{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.crow-scale-100{--tw-scale-x:1;--tw-scale-y:1}.crow-scale-110{--tw-scale-x:1.1;--tw-scale-y:1.1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.crow-animate-fade-in{animation:crow-fadeIn .2s ease-out}.crow-animate-pulse{animation:crow-pulse 2s cubic-bezier(.4,0,.6,1) infinite}.crow-animate-slide-up{animation:crow-slideUp .3s ease-out}@keyframes crow-spin{to{transform:rotate(1turn)}}.crow-animate-spin{animation:crow-spin 1s linear infinite}.crow-cursor-default{cursor:default}.crow-cursor-not-allowed{cursor:not-allowed}.crow-cursor-pointer{cursor:pointer}.crow-select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.crow-resize-none{resize:none}.crow-list-decimal{list-style-type:decimal}.crow-list-disc{list-style-type:disc}.crow-flex-row{flex-direction:row}.crow-flex-col{flex-direction:column}.crow-flex-wrap{flex-wrap:wrap}.crow-items-start{align-items:flex-start}.crow-items-end{align-items:flex-end}.crow-items-center{align-items:center}.crow-items-stretch{align-items:stretch}.crow-justify-start{justify-content:flex-start}.crow-justify-end{justify-content:flex-end}.crow-justify-center{justify-content:center}.crow-justify-between{justify-content:space-between}.crow-gap-1{gap:.25rem}.crow-gap-1\\\\.5{gap:.375rem}.crow-gap-2{gap:.5rem}.crow-gap-3{gap:.75rem}.crow-gap-4{gap:1rem}.crow-gap-6{gap:1.5rem}.crow-space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.crow-space-y-1\\\\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.375rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem*var(--tw-space-y-reverse))}.crow-space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.crow-space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem*var(--tw-space-y-reverse))}.crow-space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem*var(--tw-space-y-reverse))}.crow-overflow-auto{overflow:auto}.crow-overflow-hidden{overflow:hidden}.crow-overflow-visible{overflow:visible}.crow-overflow-x-auto{overflow-x:auto}.crow-overflow-y-auto{overflow-y:auto}.crow-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.crow-whitespace-pre-wrap{white-space:pre-wrap}.crow-break-words{overflow-wrap:break-word}.crow-rounded{border-radius:.25rem}.crow-rounded-2xl{border-radius:1rem}.crow-rounded-3xl{border-radius:1.5rem}.crow-rounded-full{border-radius:9999px}.crow-rounded-lg{border-radius:.5rem}.crow-rounded-md{border-radius:.375rem}.crow-rounded-xl{border-radius:.75rem}.crow-border{border-width:1px}.crow-border-b{border-bottom-width:1px}.crow-border-l{border-left-width:1px}.crow-border-l-2{border-left-width:2px}.crow-border-r{border-right-width:1px}.crow-border-t{border-top-width:1px}.crow-border-none{border-style:none}.crow-border-\\\\[var\\\\(--crow-border\\\\,\\\\#e5e7eb\\\\)\\\\]{border-color:var(--crow-border,#e5e7eb)}.crow-border-blue-200{--tw-border-opacity:1;border-color:rgb(191 219 254/var(--tw-border-opacity,1))}.crow-border-gray-100{--tw-border-opacity:1;border-color:rgb(243 244 246/var(--tw-border-opacity,1))}.crow-border-gray-200{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity,1))}.crow-border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity,1))}.crow-border-red-500{--tw-border-opacity:1;border-color:rgb(239 68 68/var(--tw-border-opacity,1))}.crow-bg-\\\\[var\\\\(--crow-bg-secondary\\\\,\\\\#f3f4f6\\\\)\\\\]{background-color:var(--crow-bg-secondary,#f3f4f6)}.crow-bg-black{--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity,1))}.crow-bg-black\\\\/5{background-color:rgba(0,0,0,.05)}.crow-bg-blue-50{--tw-bg-opacity:1;background-color:rgb(239 246 255/var(--tw-bg-opacity,1))}.crow-bg-gray-100{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.crow-bg-gray-200{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity,1))}.crow-bg-gray-400{--tw-bg-opacity:1;background-color:rgb(156 163 175/var(--tw-bg-opacity,1))}.crow-bg-gray-50{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.crow-bg-gray-700{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.crow-bg-gray-800{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.crow-bg-gray-900{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity,1))}.crow-bg-red-100{--tw-bg-opacity:1;background-color:rgb(254 226 226/var(--tw-bg-opacity,1))}.crow-bg-red-500{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity,1))}.crow-bg-transparent{background-color:transparent}.crow-bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.crow-p-0{padding:0}.crow-p-0\\\\.5{padding:.125rem}.crow-p-1{padding:.25rem}.crow-p-1\\\\.5{padding:.375rem}.crow-p-2{padding:.5rem}.crow-p-3{padding:.75rem}.crow-p-4{padding:1rem}.crow-p-6{padding:1.5rem}.crow-px-1{padding-left:.25rem;padding-right:.25rem}.crow-px-1\\\\.5{padding-left:.375rem;padding-right:.375rem}.crow-px-2{padding-left:.5rem;padding-right:.5rem}.crow-px-3{padding-left:.75rem;padding-right:.75rem}.crow-px-4{padding-left:1rem;padding-right:1rem}.crow-px-6{padding-left:1.5rem;padding-right:1.5rem}.crow-py-0{padding-top:0;padding-bottom:0}.crow-py-0\\\\.5{padding-top:.125rem;padding-bottom:.125rem}.crow-py-1{padding-top:.25rem;padding-bottom:.25rem}.crow-py-1\\\\.5{padding-top:.375rem;padding-bottom:.375rem}.crow-py-2{padding-top:.5rem;padding-bottom:.5rem}.crow-py-2\\\\.5{padding-top:.625rem;padding-bottom:.625rem}.crow-py-3{padding-top:.75rem;padding-bottom:.75rem}.crow-py-6{padding-top:1.5rem;padding-bottom:1.5rem}.crow-py-8{padding-top:2rem;padding-bottom:2rem}.crow-pb-2{padding-bottom:.5rem}.crow-pl-3{padding-left:.75rem}.crow-pl-4{padding-left:1rem}.crow-pl-5{padding-left:1.25rem}.crow-pr-4{padding-right:1rem}.crow-pt-1{padding-top:.25rem}.crow-pt-3{padding-top:.75rem}.crow-text-left{text-align:left}.crow-text-center{text-align:center}.crow-text-right{text-align:right}.crow-align-text-bottom{vertical-align:text-bottom}.crow-font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.crow-text-\\\\[13px\\\\]{font-size:13px}.crow-text-base{font-size:1rem;line-height:1.5rem}.crow-text-lg{font-size:1.125rem;line-height:1.75rem}.crow-text-sm{font-size:.875rem;line-height:1.25rem}.crow-text-xs{font-size:.75rem;line-height:1rem}.crow-font-bold{font-weight:700}.crow-font-medium{font-weight:500}.crow-font-semibold{font-weight:600}.crow-uppercase{text-transform:uppercase}.crow-italic{font-style:italic}.crow-leading-relaxed{line-height:1.625}.crow-leading-tight{line-height:1.25}.crow-tracking-wide{letter-spacing:.025em}.crow-text-\\\\[var\\\\(--crow-primary\\\\,\\\\#7c3aed\\\\)\\\\]{color:var(--crow-primary,#7c3aed)}.crow-text-\\\\[var\\\\(--crow-text\\\\,\\\\#111827\\\\)\\\\]{color:var(--crow-text,#111827)}.crow-text-amber-500{--tw-text-opacity:1;color:rgb(245 158 11/var(--tw-text-opacity,1))}.crow-text-black{--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1))}.crow-text-blue-300{--tw-text-opacity:1;color:rgb(147 197 253/var(--tw-text-opacity,1))}.crow-text-blue-500{--tw-text-opacity:1;color:rgb(59 130 246/var(--tw-text-opacity,1))}.crow-text-gray-200{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity,1))}.crow-text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.crow-text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.crow-text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.crow-text-gray-700{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.crow-text-gray-800{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity,1))}.crow-text-gray-900{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity,1))}.crow-text-green-500{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity,1))}.crow-text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity,1))}.crow-text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.crow-underline{text-decoration-line:underline}.crow-opacity-0{opacity:0}.crow-opacity-100{opacity:1}.crow-opacity-25{opacity:.25}.crow-opacity-40{opacity:.4}.crow-opacity-50{opacity:.5}.crow-opacity-60{opacity:.6}.crow-opacity-75{opacity:.75}.crow-shadow-2xl{--tw-shadow:0 25px 50px -12px rgba(0,0,0,.25);--tw-shadow-colored:0 25px 50px -12px var(--tw-shadow-color)}.crow-shadow-2xl,.crow-shadow-\\\\[0_0_20px_rgba\\\\(0\\\\,0\\\\,0\\\\,0\\\\.25\\\\)\\\\]{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.crow-shadow-\\\\[0_0_20px_rgba\\\\(0\\\\,0\\\\,0\\\\,0\\\\.25\\\\)\\\\]{--tw-shadow:0 0 20px rgba(0,0,0,.25);--tw-shadow-colored:0 0 20px var(--tw-shadow-color)}.crow-shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.crow-shadow-lg,.crow-shadow-md{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.crow-shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}.crow-outline-none{outline:2px solid transparent;outline-offset:2px}.crow-ring-4{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.crow-ring-offset-2{--tw-ring-offset-width:2px}.crow-backdrop-blur-md{--tw-backdrop-blur:blur(12px)}.crow-backdrop-blur-md,.crow-backdrop-blur-sm{backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.crow-backdrop-blur-sm{--tw-backdrop-blur:blur(4px)}.crow-transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.crow-transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.crow-transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.crow-transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.crow-transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.crow-duration-150{transition-duration:.15s}.crow-duration-200{transition-duration:.2s}.crow-duration-300{transition-duration:.3s}.crow-duration-500{transition-duration:.5s}.crow-ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.crow-animate-fade-in{animation:crow-fadeIn .2s ease-out}.crow-animate-slide-up{animation:crow-slideUp .3s ease-out}.crow-animate-pulse{animation:crow-pulse 1.5s ease-in-out infinite}.crow-animation-delay-100{animation-delay:.1s}.crow-animation-delay-200{animation-delay:.2s}@keyframes crow-fadeIn{0%{opacity:0}to{opacity:1}}@keyframes crow-slideUp{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}@keyframes crow-pulse{0%,to{opacity:1}50%{opacity:.4}}.crow-overflow-y-auto::-webkit-scrollbar{width:6px}.crow-overflow-y-auto::-webkit-scrollbar-track{background:transparent}.crow-overflow-y-auto::-webkit-scrollbar-thumb{background-color:#d1d5db;border-radius:3px}.crow-overflow-y-auto::-webkit-scrollbar-thumb:hover{background-color:#9ca3af}.crow-focus-visible\\\\:crow-outline-none:focus-visible{outline:none}.crow-focus-visible\\\\:crow-ring-2:focus-visible{box-shadow:0 0 0 2px var(--crow-primary,#6366f1)}:host{--crow-primary:#6366f1;--crow-primary-dark:#4f46e5;--crow-secondary:#f1f5f9;--crow-accent:#10b981}@media (prefers-color-scheme:dark){:host{--crow-primary:#818cf8;--crow-primary-dark:#6366f1}}.crow-copilot-toggle{position:fixed;top:50%;transform:translateY(-50%);z-index:999998;width:24px;height:64px;display:flex;align-items:center;justify-content:center;background:#fff;border:1px solid #e5e7eb;cursor:pointer;transition:all .2s ease;box-shadow:0 2px 8px rgba(0,0,0,.1)}.crow-copilot-toggle:hover{background:#f9fafb;box-shadow:0 4px 12px rgba(0,0,0,.15)}.crow-copilot-toggle-right{right:0;border-radius:8px 0 0 8px;border-right:none}.crow-copilot-toggle-left{left:0;border-radius:0 8px 8px 0;border-left:none}.crow-copilot-toggle.open.crow-copilot-toggle-right{right:var(--crow-copilot-width,400px)}.crow-copilot-toggle.open.crow-copilot-toggle-left{left:var(--crow-copilot-width,400px)}.crow-copilot-toggle svg{width:16px;height:16px;color:#6b7280;transition:transform .2s ease}.crow-copilot-toggle:hover svg{color:#374151}.crow-copilot-sidebar{position:fixed;top:0;bottom:0;z-index:999997;background:#fff;box-shadow:-4px 0 20px rgba(0,0,0,.1);transition:transform .3s cubic-bezier(.4,0,.2,1);overflow:hidden}.crow-copilot-sidebar-right{right:0;border-left:1px solid #e5e7eb}.crow-copilot-sidebar-left{left:0;border-right:1px solid #e5e7eb}.crow-copilot-sidebar.closed.crow-copilot-sidebar-right{transform:translateX(100%)}.crow-copilot-sidebar.closed.crow-copilot-sidebar-left{transform:translateX(-100%)}body.crow-copilot-open-right{margin-right:var(--crow-copilot-width,400px)!important;transition:margin .3s cubic-bezier(.4,0,.2,1)}body.crow-copilot-open-left{margin-left:var(--crow-copilot-width,400px)!important}body,body.crow-copilot-open-left{transition:margin .3s cubic-bezier(.4,0,.2,1)}.placeholder\\\\:crow-text-gray-500::-moz-placeholder{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.placeholder\\\\:crow-text-gray-500::placeholder{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.last\\\\:crow-mb-0:last-child{margin-bottom:0}.last\\\\:crow-border-0:last-child{border-width:0}.hover\\\\:crow-scale-110:hover{--tw-scale-x:1.1;--tw-scale-y:1.1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\\\\:crow-bg-gray-100:hover{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.hover\\\\:crow-bg-gray-200:hover{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity,1))}.hover\\\\:crow-bg-gray-50:hover{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.hover\\\\:crow-bg-gray-700:hover{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.hover\\\\:crow-bg-gray-800:hover{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.hover\\\\:crow-bg-red-200:hover{--tw-bg-opacity:1;background-color:rgb(254 202 202/var(--tw-bg-opacity,1))}.hover\\\\:crow-bg-red-500:hover{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity,1))}.hover\\\\:crow-text-blue-300:hover{--tw-text-opacity:1;color:rgb(147 197 253/var(--tw-text-opacity,1))}.hover\\\\:crow-text-gray-600:hover{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.hover\\\\:crow-text-gray-700:hover{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.hover\\\\:crow-text-gray-800:hover{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity,1))}.hover\\\\:crow-opacity-100:hover{opacity:1}.hover\\\\:crow-opacity-80:hover{opacity:.8}.hover\\\\:crow-opacity-90:hover{opacity:.9}.focus\\\\:crow-outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\\\\:crow-ring-0:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\\\\:crow-ring-0:focus,.focus\\\\:crow-ring-2:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\\\\:crow-ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\\\\:crow-ring-offset-2:focus{--tw-ring-offset-width:2px}.focus-visible\\\\:crow-outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.focus-visible\\\\:crow-ring-0:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.disabled\\\\:crow-pointer-events-none:disabled{pointer-events:none}.disabled\\\\:crow-cursor-not-allowed:disabled{cursor:not-allowed}.disabled\\\\:crow-opacity-50:disabled{opacity:.5}`;\n\nlet injected = false;\n\n/**\n * Inject styles into a target (document.head or ShadowRoot)\n * \n * For Shadow DOM usage, prefer passing the CSS string directly to ShadowContainer.\n * This function is kept for backwards compatibility and non-Shadow DOM use cases.\n * \n * @param target - Where to inject styles (defaults to document.head)\n */\nexport function injectStyles(target: Document | ShadowRoot = document) {\n // Only inject once per target\n if (target === document && injected) return;\n if (typeof document === 'undefined') return;\n \n // Check if already injected in this target\n const existingStyle = target === document \n ? document.getElementById(STYLE_ID)\n : (target as ShadowRoot).querySelector(`#${STYLE_ID}`);\n \n if (existingStyle) {\n if (target === document) injected = true;\n return;\n }\n \n const style = document.createElement('style');\n style.id = STYLE_ID;\n style.textContent = WIDGET_CSS;\n \n if (target === document) {\n document.head.appendChild(style);\n injected = true;\n } else {\n // For ShadowRoot, prepend the style\n (target as ShadowRoot).prepend(style);\n }\n}\n\n// NOTE: Auto-injection is DISABLED to prevent CSS leaking to host pages.\n// The widget now uses Shadow DOM for CSS isolation.\n// If you need to inject styles globally (not recommended), call injectStyles() manually.\n","/**\n * CrowWidget - Floating chat widget with bubble button\n *\n * The main widget component that supports:\n * - Floating mode (with bubble) for production\n * - Embedded mode (no bubble) for dashboard preview\n * - Custom styles from DB or props\n * - Shadow DOM encapsulation for CSS isolation\n */\n\nimport { useState, useRef, useEffect, useCallback, useMemo, type CSSProperties } from \"react\";\nimport { AnimatePresence } from \"framer-motion\";\n\n// Hooks\nimport { useChat } from \"./hooks/useChat\";\nimport { useConversations } from \"./hooks/useConversations\";\nimport { useWorkflow } from \"./hooks/useWorkflow\";\nimport { useCrowAPI } from \"./hooks/useCrowAPI\";\nimport { useWidgetStyles } from \"./hooks/useWidgetStyles\";\nimport { useTTSOutput } from \"./hooks/useTTSOutput\";\n\n// Context\nimport { WidgetStyleProvider } from \"./context/StyleContext\";\n\n// Components\nimport { ShadowContainer } from \"./components/ShadowContainer\";\nimport { ChatBubble, WidgetShell, WidgetHeader } from \"./components/widget\";\nimport {\n MessagesContainer,\n MessageList,\n ConversationList,\n WorkflowPanel,\n PoweredByBadge,\n PromptInputBox,\n BrowserUseConfirmation,\n SuggestedActions,\n} from \"./components/shared\";\n\n// Styles\nimport { WIDGET_CSS, stylesToCssVars } from \"./styles\";\n\n// Config\nimport type { WidgetStyleConfig } from \"./styles/types\";\nimport type { ToolRenderers } from \"./types\";\n\n/** Identity data passed to the identify function */\nexport interface IdentifyData {\n /** JWT token from your backend */\n token: string;\n /** User's display name */\n name?: string;\n /** Additional metadata */\n [key: string]: unknown;\n}\n\n/** Function to identify a user */\nexport type IdentifyFunction = (data: IdentifyData) => void;\n\n/** Client-side tool handler */\nexport type ToolHandler = (\n args: Record<string, unknown>,\n) => Promise<unknown> | unknown;\n\n/** Map of tool names to handlers */\nexport type ToolsMap = Record<string, ToolHandler>;\n\nexport interface CrowWidgetProps {\n /** Product ID for this widget */\n productId: string;\n /** API URL (defaults to relative path) */\n apiUrl?: string;\n /** Subdomain for multi-endpoint routing */\n subdomain?: string;\n /** Widget variant: floating (with bubble) or embedded (for preview) */\n variant?: \"floating\" | \"embedded\";\n /** Custom styles to override DB and default styles */\n styles?: Partial<WidgetStyleConfig>;\n /** Skip fetching styles from API (use for preview mode with local state) */\n previewMode?: boolean;\n /** Whether to show AI thinking/reasoning to users (overrides API setting if provided) */\n showThinking?: boolean;\n /** Custom agent name shown in header (overrides API setting if provided) */\n agentName?: string;\n /** Custom welcome message (overrides API setting if provided) */\n welcomeMessage?: string;\n /** Callback when widget is ready */\n onReady?: () => void;\n /**\n * Callback to identify the user. Called with an identify function\n * that you should call with the user's token when available.\n */\n onIdentify?: (identify: IdentifyFunction) => void;\n /** Client-side tools the agent can call */\n tools?: ToolsMap;\n /** Custom navigation function for SPA-safe page navigation (e.g. router.push from Next.js or React Router) */\n navigate?: (path: string) => void;\n /** Callback fired when a server-side tool completes, with the tool name and full result data */\n onToolResult?: (toolName: string, result: Record<string, unknown>) => void;\n /**\n * Async function that returns a JWT for user identity verification.\n * Called on mount and automatically on 401 (token refresh).\n * Preferred over onIdentify for simpler integration.\n */\n getIdentityToken?: () => Promise<string>;\n /**\n * Page context data sent with every message. Reactive — updates whenever\n * the object reference changes. Replaces window.crow('setContext', ...).\n */\n context?: Record<string, unknown>;\n /**\n * Custom renderers for tool results. When a tool completes and a renderer\n * exists for its name, that component is rendered inline in the chat.\n */\n toolRenderers?: ToolRenderers;\n /**\n * ISO 639-1 language code (e.g., \"es\", \"fr\", \"ja\"). When set, the AI\n * responds in that language and the welcome message is translated.\n */\n language?: string;\n /**\n * Custom CSS to inject into the widget's Shadow DOM.\n * Appended after default styles, allowing overrides.\n */\n customCss?: string;\n}\n\nexport function CrowWidget({\n productId,\n apiUrl = \"\",\n subdomain,\n variant = \"floating\",\n styles: propStyles,\n previewMode = false,\n showThinking: showThinkingProp,\n agentName: agentNameProp,\n welcomeMessage: welcomeMessageProp,\n onReady,\n onIdentify,\n tools,\n navigate,\n onToolResult,\n getIdentityToken,\n context,\n toolRenderers,\n language,\n customCss,\n}: CrowWidgetProps) {\n // Fall back to window globals for script-tag users\n const effectiveGetIdentityToken = getIdentityToken || window.__crow_identity_token_fetcher;\n const effectiveOnToolResult = onToolResult || window.__crow_on_tool_result;\n const effectiveToolRenderers = toolRenderers || window.__crow_tool_renderers;\n\n // Fetch and merge styles\n const {\n styles,\n isLoading: isLoadingStyles,\n agentName: agentNameFromAPI,\n browserUseEnabled,\n pageNavigationEnabled,\n pageNavigationRoutes,\n showThinking: showThinkingFromAPI,\n persistAnonymousConversations,\n welcomeMessage: welcomeMessageFromAPI,\n selectedModel: selectedModelFromAPI,\n initialSuggestions,\n toolConsentSettings,\n } = useWidgetStyles({\n productId,\n apiUrl,\n propStyles,\n skip: previewMode,\n language,\n });\n\n // Tool status — set via window.crow('setToolStatus', '...')\n const [toolStatus, setToolStatus] = useState<string>(\n () => (window as any).__crow_tool_status as string ?? \"\"\n );\n\n useEffect(() => {\n const handler = (e: Event) => setToolStatus((e as CustomEvent<string>).detail ?? \"\");\n window.addEventListener(\"crow:setToolStatus\", handler);\n return () => window.removeEventListener(\"crow:setToolStatus\", handler);\n }, []);\n\n // Greeting override — set via window.crow('setGreeting', '...')\n const [greetingOverride, setGreetingOverride] = useState<string | undefined>(\n () => (window as any).__crow_greeting as string | undefined\n );\n\n useEffect(() => {\n const handler = (e: Event) => setGreetingOverride((e as CustomEvent<string>).detail);\n window.addEventListener(\"crow:setGreeting\", handler);\n return () => window.removeEventListener(\"crow:setGreeting\", handler);\n }, []);\n\n // Use prop if provided, otherwise use API value\n const agentName = agentNameProp ?? agentNameFromAPI;\n const welcomeMessage = greetingOverride ?? welcomeMessageProp ?? welcomeMessageFromAPI;\n const selectedModel = selectedModelFromAPI;\n\n // Use prop if provided, otherwise use API value\n const showThinking = showThinkingProp ?? showThinkingFromAPI;\n\n // Auto-loaded browser_use tool (loaded dynamically to avoid SSR issues)\n const [autoTools, setAutoTools] = useState<ToolsMap>({});\n\n // Convert styles to CSS custom properties\n const cssVars = stylesToCssVars(styles) as CSSProperties;\n\n // Refs\n const messagesContainerRef = useRef<HTMLDivElement>(null);\n const executeClientToolRef = useRef<\n | ((toolName: string, args: Record<string, unknown>) => Promise<unknown>)\n | null\n >(null);\n const submitToolResultRef = useRef<\n | ((\n toolCallId: string,\n toolName: string,\n result: Record<string, unknown>,\n ) => Promise<void>)\n | null\n >(null);\n\n // UI State\n const [isCollapsed, setIsCollapsed] = useState(() => {\n if (variant !== \"floating\") return false;\n try {\n const stored = sessionStorage.getItem(\"crow_widget_collapsed\");\n if (stored !== null) return stored === \"true\";\n } catch { /* ignore */ }\n return true;\n });\n // Persist floating widget open/closed state across navigations\n useEffect(() => {\n if (variant !== \"floating\") return;\n try { sessionStorage.setItem(\"crow_widget_collapsed\", String(isCollapsed)); }\n catch { /* ignore */ }\n }, [isCollapsed, variant]);\n const [showConversationList, setShowConversationList] = useState(false);\n const [isVerifiedUser, setIsVerifiedUser] = useState(false);\n\n // Browser automation state\n const [isBrowserUseActive, setIsBrowserUseActive] = useState(false);\n const [pendingConfirmation, setPendingConfirmation] = useState<{\n instruction: string;\n resolve: (confirmed: boolean) => void;\n } | null>(null);\n\n\n const [askUserResolver, setAskUserResolver] = useState<{\n resolve: (answer: string) => void;\n reject: () => void;\n } | null>(null);\n\n // Workflow hook\n const {\n activeWorkflow,\n startWorkflow,\n updateTodo,\n markComplete,\n endWorkflow,\n } = useWorkflow({\n productId,\n apiUrl,\n conversationId: null,\n selectedModel,\n });\n\n // Conversations hook\n const conversations = useConversations({ productId, apiUrl });\n\n // Track if we need to restore history on mount\n const [shouldRestoreHistory, setShouldRestoreHistory] = useState(false);\n const hasRestoredHistoryRef = useRef(false);\n\n // Chat hook\n const chat = useChat({\n productId,\n apiUrl,\n persistAnonymousConversations,\n welcomeMessage,\n selectedModel,\n subdomain,\n toolConsentSettings,\n language,\n onVerificationStatus: (isVerified) => {\n setIsVerifiedUser(isVerified);\n },\n onConversationId: () => {},\n onWorkflowEvent: (event) => {\n switch (event.type) {\n case \"started\":\n if (event.name && event.todos) {\n startWorkflow(event.name, event.todos);\n }\n break;\n case \"todo_updated\":\n if (event.todoId && event.todoStatus) {\n updateTodo(event.todoId, event.todoStatus);\n }\n break;\n case \"ended\":\n endWorkflow(2000);\n break;\n case \"complete_prompt\":\n markComplete();\n break;\n }\n },\n onToolResult: effectiveOnToolResult,\n onToolCall: async (event) => {\n if (event.type === \"client_call\" && event.toolName && event.toolCallId) {\n // Original non-consent flow\n try {\n const result = await executeClientToolRef.current?.(\n event.toolName,\n (event.arguments || {}) as Record<string, unknown>,\n );\n\n // Don't send result if user cancelled/declined - just stop\n const resultObj = result as Record<string, unknown>;\n const dataObj = resultObj?.data as Record<string, unknown> | undefined;\n const wasUserCancelled =\n dataObj?.declined === true ||\n (typeof resultObj?.error === 'string' && resultObj.error.includes('cancelled by user')) ||\n (typeof resultObj?.error === 'string' && resultObj.error.includes('declined'));\n\n if (wasUserCancelled) {\n console.log('[Crow Widget] Tool was cancelled by user - not sending result to agent');\n return;\n }\n\n // Send result back to agent so it can continue\n if (result && submitToolResultRef.current) {\n await submitToolResultRef.current(\n event.toolCallId,\n event.toolName,\n result as Record<string, unknown>,\n );\n }\n } catch (e) {\n console.error(\"[Crow Widget] Tool error:\", e);\n if (submitToolResultRef.current) {\n await submitToolResultRef.current(\n event.toolCallId,\n event.toolName,\n { success: false, error: String(e) },\n );\n }\n }\n }\n },\n onRestoredConversation: () => {\n setShouldRestoreHistory(true);\n },\n });\n\n // TTS - speak assistant responses\n const tts = useTTSOutput({ backendUrl: apiUrl });\n const ttsRef = useRef(tts);\n ttsRef.current = tts;\n const wasLoadingRef = useRef(false);\n\n\n // Speak the last assistant message when streaming completes\n useEffect(() => {\n console.log('[Crow TTS] isLoading changed:', chat.isLoading, 'wasLoading:', wasLoadingRef.current);\n if (wasLoadingRef.current && !chat.isLoading) {\n // Streaming just finished - find the last bot message\n const lastMessage = [...chat.messages].reverse().find(m => m.isBot);\n console.log('[Crow TTS] Last bot message:', lastMessage?.content?.substring(0, 50));\n if (lastMessage?.content) {\n // Strip any markdown or special formatting for cleaner speech\n const textToSpeak = lastMessage.content\n .replace(/\\*\\*/g, '') // Remove bold\n .replace(/\\*/g, '') // Remove italic\n .replace(/`[^`]+`/g, '') // Remove code\n .replace(/\\[([^\\]]+)\\]\\([^)]+\\)/g, '$1') // Convert links to text\n .trim();\n if (textToSpeak) {\n console.log('[Crow TTS] Speaking:', textToSpeak.substring(0, 50));\n ttsRef.current.speak(textToSpeak);\n }\n }\n }\n wasLoadingRef.current = chat.isLoading;\n }, [chat.isLoading, chat.messages]);\n\n\n // Set initial suggestions from widget config on load\n useEffect(() => {\n if (initialSuggestions.length > 0 && chat.suggestedActions.length === 0) {\n chat.setSuggestedActions(initialSuggestions);\n }\n }, [initialSuggestions]);\n\n // Load anonymous conversation history when restored from localStorage\n useEffect(() => {\n if (\n shouldRestoreHistory &&\n chat.conversationId &&\n !hasRestoredHistoryRef.current\n ) {\n hasRestoredHistoryRef.current = true;\n console.log(\n \"[Crow Widget] Restoring conversation history:\",\n chat.conversationId,\n );\n conversations\n .loadAnonymousConversationHistory(chat.conversationId)\n .then((historyMessages) => {\n if (historyMessages.length > 0) {\n chat.loadMessages(historyMessages);\n }\n });\n }\n }, [shouldRestoreHistory, chat.conversationId, conversations, chat]);\n\n // Workflow actions with current chat values\n const workflowActions = useWorkflow({\n productId,\n apiUrl,\n conversationId: chat.conversationId,\n selectedModel: chat.selectedModel,\n onMessage: (content) => {\n chat.loadMessages([\n ...chat.messages,\n {\n id: `bot-${Date.now()}`,\n content,\n isBot: true,\n timestamp: new Date(),\n },\n ]);\n },\n });\n\n // Crow API hook\n const { executeClientTool } = useCrowAPI({\n onIdentified: async () => {\n setIsVerifiedUser(true);\n const convs = await conversations.loadConversations();\n if (convs.length > 0) {\n const mostRecent = convs[0];\n const historyMessages = await conversations.loadConversationHistory(mostRecent.id);\n if (historyMessages.length > 0) {\n chat.loadMessages(historyMessages);\n chat.setConversationId(mostRecent.id);\n }\n }\n },\n onReset: () => {\n setIsVerifiedUser(false);\n chat.resetMessages();\n },\n });\n\n executeClientToolRef.current = executeClientTool;\n submitToolResultRef.current = chat.submitToolResult;\n\n // Notify when ready\n useEffect(() => {\n if (!isLoadingStyles) {\n onReady?.();\n }\n }, [isLoadingStyles, onReady]);\n\n // Call onIdentify with an identify function when widget is ready (legacy API)\n useEffect(() => {\n if (!isLoadingStyles && onIdentify) {\n const identify: IdentifyFunction = (data) => {\n if (!data.token) {\n console.error(\"[Crow] identify() requires a token\");\n return;\n }\n window.crow?.(\"identify\", data);\n };\n onIdentify(identify);\n }\n }, [isLoadingStyles, onIdentify]);\n\n // Declarative identity: call getIdentityToken on mount and on token refresh\n useEffect(() => {\n if (!effectiveGetIdentityToken || isLoadingStyles) return;\n\n let cancelled = false;\n\n const identify = async () => {\n try {\n const token = await effectiveGetIdentityToken();\n if (!cancelled && token) {\n window.crow?.(\"identify\", { token });\n }\n } catch (e) {\n console.error(\"[Crow] getIdentityToken failed:\", e);\n }\n };\n\n // Initial identification\n identify();\n\n // Auto-refresh on 401\n const handleRefresh = () => identify();\n window.addEventListener(\"crow:token-refresh-needed\", handleRefresh);\n\n return () => {\n cancelled = true;\n window.removeEventListener(\"crow:token-refresh-needed\", handleRefresh);\n };\n }, [effectiveGetIdentityToken, isLoadingStyles]);\n\n // Declarative context: sync context prop to window.__crow_page_context\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n if (context && Object.keys(context).length > 0) {\n (window as any).__crow_page_context = context;\n } else {\n (window as any).__crow_page_context = undefined;\n }\n }, [context]);\n\n // Browser automation callbacks\n const handleBrowserConfirmation = useCallback(\n (instruction: string): Promise<boolean> => {\n return new Promise((resolve) => {\n setPendingConfirmation({ instruction, resolve });\n });\n },\n []\n );\n\n const handleBrowserQuestion = useCallback(\n (question: string): Promise<string> => {\n return new Promise((resolve, reject) => {\n // Add the question as a bot message in the chat (persisted to server)\n chat.addMessage(\"assistant\", question);\n // Store the resolver - next user message will be routed here\n setAskUserResolver({ resolve, reject });\n });\n },\n [chat]\n );\n\n const handleBrowserProgress = useCallback(\n (step: number, maxSteps: number) => {\n // If step indicates completion or error, clear active state\n if (step >= maxSteps || step === -1) {\n setIsBrowserUseActive(false);\n }\n },\n []\n );\n\n // Set up global browser callbacks for the SDK to use\n useEffect(() => {\n (window as any).__crow_browser_callbacks = {\n onConfirmation: handleBrowserConfirmation,\n onQuestion: handleBrowserQuestion,\n onProgress: handleBrowserProgress,\n };\n return () => {\n delete (window as any).__crow_browser_callbacks;\n };\n }, [handleBrowserConfirmation, handleBrowserQuestion, handleBrowserProgress]);\n\n // Auto-load browser_use tool when enabled (SSR-safe dynamic import)\n useEffect(() => {\n if (\n browserUseEnabled &&\n !isLoadingStyles &&\n !autoTools.browser_use\n ) {\n import(\"@usecrow/client/browser\")\n .then(({ createBrowserUseTool }) => {\n setAutoTools((prev) => ({\n ...prev,\n browser_use: createBrowserUseTool({ productId, apiUrl }),\n }));\n console.log(\"[Crow] browser_use tool auto-loaded\");\n })\n .catch((err) => {\n console.warn(\"[Crow] Failed to load browser_use:\", err);\n });\n }\n }, [browserUseEnabled, isLoadingStyles, productId, apiUrl, autoTools]);\n\n // Auto-load execute_recorded_workflow tool when browser_use is enabled\n useEffect(() => {\n if (\n browserUseEnabled &&\n !isLoadingStyles &&\n !autoTools.execute_recorded_workflow\n ) {\n import(\"@usecrow/client/browser\")\n .then(({ createExecuteRecordedWorkflowTool }) => {\n setAutoTools((prev) => ({\n ...prev,\n execute_recorded_workflow: createExecuteRecordedWorkflowTool({ productId, apiUrl }),\n }));\n console.log(\"[Crow] execute_recorded_workflow tool auto-loaded\");\n })\n .catch((err) => {\n console.warn(\"[Crow] Failed to load execute_recorded_workflow:\", err);\n });\n }\n }, [browserUseEnabled, isLoadingStyles, productId, apiUrl, autoTools]);\n\n // Auto-load navigateToPage tool when page navigation is enabled\n useEffect(() => {\n if (\n pageNavigationEnabled &&\n pageNavigationRoutes.length > 0 &&\n !isLoadingStyles\n ) {\n import(\"@usecrow/client\")\n .then(({ createNavigateToPageTool }) => {\n setAutoTools((prev) => ({\n ...prev,\n navigateToPage: createNavigateToPageTool(pageNavigationRoutes, navigate),\n }));\n console.log(\n `[Crow] navigateToPage tool auto-loaded with ${pageNavigationRoutes.length} routes`\n );\n })\n .catch((err) => {\n console.warn(\"[Crow] Failed to load navigateToPage:\", err);\n });\n }\n }, [pageNavigationEnabled, pageNavigationRoutes, isLoadingStyles, navigate]);\n\n // Merge auto-loaded tools with user-provided tools\n const mergedTools = useMemo(() => ({ ...autoTools, ...tools }), [autoTools, tools]);\n\n // Register tools when provided\n useEffect(() => {\n if (Object.keys(mergedTools).length > 0) {\n window.crow?.(\"registerTools\", mergedTools);\n }\n }, [mergedTools]);\n\n // Handlers\n const handleSend = (message: string) => {\n if (!message.trim()) return;\n setIsCollapsed(false);\n\n // If browser_use is waiting for user input, route the message there instead of chat\n if (askUserResolver) {\n // Add user's answer to chat (persisted to server)\n chat.addMessage(\"user\", message);\n askUserResolver.resolve(message);\n setAskUserResolver(null);\n return;\n }\n\n chat.sendMessage(message);\n };\n\n const handleStop = () => {\n // Stop the chat/tool generation FIRST to kill any streaming responses\n chat.stopGeneration();\n\n // Stop any active browser_use automation (sets abort flag)\n if (browserUseEnabled && isBrowserUseActive) {\n import(\"@usecrow/client/browser\")\n .then(({ stopActiveBrowserUse }) => {\n stopActiveBrowserUse();\n // Reject resolver AFTER abort flag is set (not before)\n if (askUserResolver) {\n askUserResolver.reject();\n setAskUserResolver(null);\n }\n })\n .catch(() => {});\n setIsBrowserUseActive(false);\n } else {\n // Not browser_use active, reject immediately\n if (askUserResolver) {\n askUserResolver.reject();\n setAskUserResolver(null);\n }\n }\n\n // Clear pending confirmation if waiting\n if (pendingConfirmation) {\n pendingConfirmation.resolve(false);\n setPendingConfirmation(null);\n }\n };\n\n const handleNewChat = () => {\n chat.resetMessages();\n setShowConversationList(false);\n };\n\n const handleToggleHistory = () => {\n setShowConversationList(!showConversationList);\n if (!showConversationList) {\n conversations.loadConversations();\n }\n };\n\n const handleSelectConversation = async (convId: string) => {\n const historyMessages = await conversations.loadConversationHistory(convId);\n if (historyMessages.length > 0) {\n chat.loadMessages(historyMessages);\n chat.setConversationId(convId);\n } else {\n chat.resetMessages();\n }\n setShowConversationList(false);\n };\n\n const handleCloseConversationList = () => {\n setShowConversationList(false);\n };\n\n const handleExitWorkflow = async () => {\n await workflowActions.exitWorkflow();\n };\n\n // Handle tool consent Allow/Deny from inline buttons\n const handleToolConsent = async (toolCallId: string, approved: boolean) => {\n // Find the tool call to get its name and arguments\n const toolCall = chat.activeToolCalls.find((tc) => tc.id === toolCallId)\n || chat.messages.flatMap((m) => m.toolCalls || []).find((tc) => tc.id === toolCallId);\n\n if (!toolCall) return;\n\n const isClientSide = !toolCall.serverSideExecution;\n\n if (approved) {\n chat.updateToolCallStatus(toolCallId, \"executing\");\n\n if (isClientSide) {\n // Client-side tool: execute locally, then submit result\n try {\n const result = await executeClientToolRef.current?.(\n toolCall.name,\n (toolCall.arguments || {}) as Record<string, unknown>,\n );\n\n const resultObj = result as Record<string, unknown>;\n const dataObj = resultObj?.data as Record<string, unknown> | undefined;\n const wasUserCancelled =\n dataObj?.declined === true ||\n (typeof resultObj?.error === 'string' && resultObj.error.includes('cancelled by user')) ||\n (typeof resultObj?.error === 'string' && resultObj.error.includes('declined'));\n\n if (wasUserCancelled) {\n console.log('[Crow Widget] Tool was cancelled by user after consent');\n return;\n }\n\n if (result && submitToolResultRef.current) {\n await submitToolResultRef.current(\n toolCallId,\n toolCall.name,\n result as Record<string, unknown>,\n );\n }\n } catch (e) {\n console.error(\"[Crow Widget] Tool error after consent:\", e);\n if (submitToolResultRef.current) {\n await submitToolResultRef.current(\n toolCallId,\n toolCall.name,\n { success: false, error: String(e) },\n );\n }\n }\n } else {\n // Server-side tool: submit consent approval — backend will execute\n if (submitToolResultRef.current) {\n await submitToolResultRef.current(\n toolCallId,\n toolCall.name,\n { consent_approved: true, tool_arguments: toolCall.arguments || {} },\n );\n }\n }\n } else {\n chat.updateToolCallStatus(toolCallId, \"denied\");\n if (submitToolResultRef.current) {\n await submitToolResultRef.current(\n toolCallId,\n toolCall.name,\n { status: \"denied\", error: \"User denied permission to execute this tool.\" },\n );\n }\n }\n };\n\n // Default (page-level) suggested actions set via window.crow('setSuggestedActions', ...)\n const defaultSuggestedActionsRef = useRef<Array<{ label: string; message: string }>>([]);\n\n // Listen for programmatic open/close/setSuggestedActions commands\n useEffect(() => {\n const handleOpen = () => setIsCollapsed(false);\n const handleClose = () => setIsCollapsed(true);\n const handleSetSuggestions = (e: Event) => {\n const actions = (e as CustomEvent).detail;\n if (Array.isArray(actions)) {\n defaultSuggestedActionsRef.current = actions;\n chat.setSuggestedActions(actions);\n }\n };\n window.addEventListener(\"crow:open\", handleOpen);\n window.addEventListener(\"crow:close\", handleClose);\n window.addEventListener(\"crow:setSuggestedActions\", handleSetSuggestions);\n\n // Pick up actions that were set before this listener attached (queue replay timing)\n const pending = (window as any).__crow_suggested_actions;\n if (Array.isArray(pending) && pending.length > 0) {\n defaultSuggestedActionsRef.current = pending;\n chat.setSuggestedActions(pending);\n }\n\n return () => {\n window.removeEventListener(\"crow:open\", handleOpen);\n window.removeEventListener(\"crow:close\", handleClose);\n window.removeEventListener(\"crow:setSuggestedActions\", handleSetSuggestions);\n };\n }, []);\n\n const handleBubbleClick = () => {\n setIsCollapsed(!isCollapsed);\n };\n\n // Widget content (shared between floating and embedded modes)\n const renderWidgetContent = () => (\n <>\n <WidgetHeader\n isVerifiedUser={isVerifiedUser}\n showConversationList={showConversationList}\n onNewChat={handleNewChat}\n onToggleHistory={handleToggleHistory}\n showMinimize={variant === \"floating\"}\n onToggleMinimize={() => setIsCollapsed(true)}\n />\n\n <AnimatePresence>\n {showConversationList && isVerifiedUser && (\n <ConversationList\n conversations={conversations.conversations}\n currentConversationId={chat.conversationId}\n onSelect={handleSelectConversation}\n onClose={handleCloseConversationList}\n />\n )}\n </AnimatePresence>\n\n <AnimatePresence>\n {activeWorkflow && (\n <WorkflowPanel\n workflow={activeWorkflow}\n onExit={handleExitWorkflow}\n />\n )}\n </AnimatePresence>\n\n <AnimatePresence>\n {(chat.messages.length > 0 || conversations.isLoadingHistory || pendingConfirmation) && (\n <MessagesContainer ref={messagesContainerRef}>\n <MessageList\n messages={chat.messages}\n activeToolCalls={chat.activeToolCalls}\n isLoadingHistory={conversations.isLoadingHistory}\n isGenerating={chat.isLoading}\n toolRenderers={effectiveToolRenderers}\n onToolConsent={handleToolConsent}\n />\n\n {/* Browser automation confirmation */}\n {pendingConfirmation && (\n <div className=\"crow-px-4 crow-py-2\">\n <BrowserUseConfirmation\n instruction={pendingConfirmation.instruction}\n onAllow={() => {\n setIsBrowserUseActive(true);\n pendingConfirmation.resolve(true);\n setPendingConfirmation(null);\n }}\n onDeny={() => {\n pendingConfirmation.resolve(false);\n setPendingConfirmation(null);\n }}\n />\n </div>\n )}\n\n </MessagesContainer>\n )}\n </AnimatePresence>\n\n <div className=\"crow-mt-auto crow-w-full\">\n {toolStatus && (\n <div className=\"crow-mx-3 crow-mb-1 crow-flex crow-items-center crow-gap-2 crow-rounded-lg crow-border crow-border-[var(--crow-border,#e5e7eb)] crow-bg-[var(--crow-bg-secondary,#f3f4f6)] crow-px-3 crow-py-2 crow-text-sm\">\n <svg className=\"crow-animate-spin crow-h-4 crow-w-4 crow-shrink-0 crow-text-[var(--crow-primary,#7c3aed)]\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle className=\"crow-opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\" />\n <path className=\"crow-opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z\" />\n </svg>\n <span className=\"crow-font-medium crow-text-[var(--crow-text,#111827)]\">{toolStatus}</span>\n </div>\n )}\n {(chat.suggestedActions.length > 0 || (!chat.isLoading && defaultSuggestedActionsRef.current.length > 0)) && (\n <SuggestedActions\n actions={chat.suggestedActions.length > 0 ? chat.suggestedActions : defaultSuggestedActionsRef.current}\n onActionClick={(action) => handleSend(action.message)}\n />\n )}\n <PoweredByBadge apiUrl={apiUrl} />\n <PromptInputBox\n onSend={handleSend}\n onStop={handleStop}\n placeholder=\"Type your message...\"\n isLoading={chat.isLoading}\n showStopButton={isBrowserUseActive || !!askUserResolver || !!pendingConfirmation}\n highlighted={!!askUserResolver}\n className=\"crow-backdrop-blur-md\"\n backendUrl={apiUrl}\n />\n </div>\n </>\n );\n\n // Combine default CSS with custom CSS if provided\n const combinedStyles = useMemo(\n () => customCss\n ? `${WIDGET_CSS}\\n\\n/* Custom CSS */\\n${customCss}`\n : WIDGET_CSS,\n [customCss]\n );\n\n // Render with Shadow DOM encapsulation\n return (\n <ShadowContainer styles={combinedStyles}>\n {/* Root element with CSS variables */}\n <div className=\"crow-widget-root\" style={cssVars}>\n <WidgetStyleProvider\n styles={styles}\n agentName={agentName}\n isLoading={isLoadingStyles}\n variant={variant}\n showThinking={showThinking}\n >\n {/* Floating mode: show bubble and collapsible widget */}\n {variant === \"floating\" && (\n <>\n <ChatBubble\n isExpanded={!isCollapsed}\n onClick={handleBubbleClick}\n />\n\n {!isCollapsed && (\n <WidgetShell>{renderWidgetContent()}</WidgetShell>\n )}\n </>\n )}\n\n {/* Embedded mode: always expanded, no bubble */}\n {variant === \"embedded\" && (\n <WidgetShell>{renderWidgetContent()}</WidgetShell>\n )}\n </WidgetStyleProvider>\n </div>\n </ShadowContainer>\n );\n}\n\nexport default CrowWidget;\n","/**\n * CopilotToggleButton - Edge toggle button for floating copilot\n *\n * Supports dual interaction:\n * - Click: toggle sidebar open/close\n * - Drag: resize sidebar width (when open)\n *\n * Forwards ref to the <button> so CopilotContainer can directly\n * manipulate its style.transition during drag for zero-lag resizing.\n */\n\nimport { forwardRef } from \"react\";\n\ninterface CopilotToggleButtonProps {\n isOpen: boolean;\n position: \"left\" | \"right\";\n onClick: () => void;\n /** Called on mousedown to initiate potential drag-to-resize */\n onMouseDown?: (e: React.MouseEvent) => void;\n /** Whether the user is actively dragging to resize */\n isDragging?: boolean;\n}\n\nfunction ChevronLeft() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"m15 18-6-6 6-6\" />\n </svg>\n );\n}\n\nfunction ChevronRight() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"m9 18 6-6-6-6\" />\n </svg>\n );\n}\n\nfunction MessageIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M7.9 20A9 9 0 1 0 4 16.1L2 22Z\" />\n </svg>\n );\n}\n\nexport const CopilotToggleButton = forwardRef<HTMLButtonElement, CopilotToggleButtonProps>(\n function CopilotToggleButton(\n { isOpen, position, onClick, onMouseDown, isDragging },\n ref,\n ) {\n const renderIcon = () => {\n if (!isOpen) return <MessageIcon />;\n if (position === \"right\") return <ChevronRight />;\n return <ChevronLeft />;\n };\n\n return (\n <button\n ref={ref}\n onClick={onClick}\n onMouseDown={onMouseDown}\n className={`crow-copilot-toggle crow-copilot-toggle-${position} ${\n isOpen ? \"open\" : \"\"\n } ${isDragging ? \"dragging\" : \"\"}`}\n style={{\n cursor: isOpen ? \"col-resize\" : undefined,\n }}\n aria-label={isOpen ? \"Close Copilot\" : \"Open Copilot\"}\n title={isOpen ? \"Close Copilot\" : \"Open Copilot\"}\n >\n {renderIcon()}\n </button>\n );\n }\n);\n","/**\n * CopilotContainer - Wrapper for floating copilot with push effect\n *\n * Handles:\n * - Toggle button positioning\n * - Sidebar slide animation\n * - Body margin manipulation for push effect\n * - Drag-to-resize from the toggle button edge\n *\n * Drag-to-resize uses direct DOM manipulation (no React re-renders) for\n * zero-lag, frame-perfect tracking of the cursor. React state is only\n * committed on mouseup.\n */\n\nimport { useEffect, useState, useRef, useCallback, type ReactNode } from \"react\";\nimport { CopilotToggleButton } from \"./CopilotToggleButton\";\n\n/** Minimum drag distance (px) before we consider it a resize vs. a click */\nconst DRAG_THRESHOLD = 5;\n/** Minimum sidebar width (px) */\nconst MIN_WIDTH = 280;\n/** Maximum sidebar width (px) */\nconst MAX_WIDTH = 800;\n\ninterface CopilotContainerProps {\n position: \"left\" | \"right\";\n width: number;\n defaultOpen: boolean;\n children: (controls: { close: () => void; currentWidth: number }) => ReactNode;\n}\n\nexport function CopilotContainer({\n position,\n width: initialWidth,\n defaultOpen,\n children,\n}: CopilotContainerProps) {\n // Restore open/closed state from sessionStorage (survives reload, clears on tab close)\n const [isOpen, setIsOpen] = useState(() => {\n try {\n const stored = sessionStorage.getItem(\"crow_copilot_open\");\n if (stored !== null) return stored === \"true\";\n } catch { /* sessionStorage unavailable */ }\n return defaultOpen;\n });\n\n // The user-adjustable width; persists across open/close cycles\n const [currentWidth, setCurrentWidth] = useState(() => {\n try {\n const stored = sessionStorage.getItem(\"crow_copilot_width\");\n if (stored) {\n const parsed = parseInt(stored, 10);\n if (parsed >= MIN_WIDTH && parsed <= MAX_WIDTH) return parsed;\n }\n } catch { /* sessionStorage unavailable */ }\n return initialWidth;\n });\n\n const [isDragging, setIsDragging] = useState(false);\n\n // Persist open/closed state\n useEffect(() => {\n try { sessionStorage.setItem(\"crow_copilot_open\", String(isOpen)); }\n catch { /* ignore */ }\n }, [isOpen]);\n\n // Persist width after resize\n useEffect(() => {\n try { sessionStorage.setItem(\"crow_copilot_width\", String(currentWidth)); }\n catch { /* ignore */ }\n }, [currentWidth]);\n\n // DOM refs for direct manipulation during drag (bypasses React render)\n const sidebarRef = useRef<HTMLDivElement>(null);\n const toggleRef = useRef<HTMLButtonElement>(null);\n\n // Refs for drag tracking (avoid stale closures)\n const dragStartXRef = useRef(0);\n const dragStartWidthRef = useRef(0);\n const hasDraggedRef = useRef(false);\n const liveWidthRef = useRef(initialWidth); // tracks width during drag without re-render\n const positionRef = useRef(position);\n positionRef.current = position;\n\n // Keep liveWidthRef in sync when React state changes (e.g. on mount)\n useEffect(() => {\n liveWidthRef.current = currentWidth;\n }, [currentWidth]);\n\n // Update CSS variable whenever width changes (non-drag updates)\n useEffect(() => {\n document.documentElement.style.setProperty(\n \"--crow-copilot-width\",\n `${currentWidth}px`\n );\n }, [currentWidth]);\n\n // Push body content when sidebar is open\n useEffect(() => {\n const className = `crow-copilot-open-${position}`;\n if (isOpen) {\n document.body.classList.add(className);\n } else {\n document.body.classList.remove(className);\n }\n\n return () => {\n document.body.classList.remove(className);\n };\n }, [isOpen, position]);\n\n // Expose imperative API on window\n useEffect(() => {\n (window as any).crowCopilot = {\n open: () => setIsOpen(true),\n close: () => setIsOpen(false),\n toggle: () => setIsOpen((prev) => !prev),\n };\n\n return () => {\n delete (window as any).crowCopilot;\n };\n }, []);\n\n // Listen for programmatic open/close via window.crow('open'/'close')\n useEffect(() => {\n const handleOpen = () => setIsOpen(true);\n const handleClose = () => setIsOpen(false);\n window.addEventListener(\"crow:open\", handleOpen);\n window.addEventListener(\"crow:close\", handleClose);\n return () => {\n window.removeEventListener(\"crow:open\", handleOpen);\n window.removeEventListener(\"crow:close\", handleClose);\n };\n }, []);\n\n // --- Drag-to-resize handlers (pure DOM, no React state during drag) ---\n\n const handleMouseMove = useCallback(\n (e: MouseEvent) => {\n const deltaX = e.clientX - dragStartXRef.current;\n\n // First time exceeding threshold: disable ALL transitions synchronously\n // before any width change, so the very first resize frame is instant.\n if (!hasDraggedRef.current && Math.abs(deltaX) >= DRAG_THRESHOLD) {\n hasDraggedRef.current = true;\n\n // Disable transitions on body (for margin push effect)\n document.body.style.transition = \"none\";\n document.body.style.cursor = \"col-resize\";\n document.body.style.userSelect = \"none\";\n document.body.classList.add(\"crow-copilot-resizing\");\n\n // Disable transitions on sidebar (inside Shadow DOM)\n if (sidebarRef.current) {\n sidebarRef.current.style.transition = \"none\";\n }\n\n // Disable transitions on toggle button (inside Shadow DOM)\n if (toggleRef.current) {\n toggleRef.current.style.transition = \"none\";\n }\n\n // React state update for visual class changes (non-critical path)\n setIsDragging(true);\n }\n\n if (!hasDraggedRef.current) return;\n\n // For right-positioned sidebar: dragging left = wider, dragging right = narrower\n // For left-positioned sidebar: dragging right = wider, dragging left = narrower\n const widthDelta = positionRef.current === \"right\" ? -deltaX : deltaX;\n const newWidth = Math.min(\n MAX_WIDTH,\n Math.max(MIN_WIDTH, dragStartWidthRef.current + widthDelta)\n );\n\n // Store live width for mouseup commit\n liveWidthRef.current = newWidth;\n\n // --- Direct DOM manipulation: instant, no React re-render ---\n const px = `${newWidth}px`;\n\n // 1. Update the CSS variable (drives toggle position + body margin)\n document.documentElement.style.setProperty(\"--crow-copilot-width\", px);\n\n // 2. Update sidebar element width directly\n if (sidebarRef.current) {\n sidebarRef.current.style.width = px;\n }\n },\n [] // no deps — we use refs for everything to avoid stale closures\n );\n\n const handleMouseUp = useCallback(() => {\n document.removeEventListener(\"mousemove\", handleMouseMove);\n document.removeEventListener(\"mouseup\", handleMouseUp);\n\n // Restore transitions and cursor\n document.body.style.transition = \"\";\n document.body.style.cursor = \"\";\n document.body.style.userSelect = \"\";\n document.body.classList.remove(\"crow-copilot-resizing\");\n if (sidebarRef.current) {\n sidebarRef.current.style.transition = \"\";\n }\n if (toggleRef.current) {\n toggleRef.current.style.transition = \"\";\n }\n\n if (hasDraggedRef.current) {\n // Commit the final width to React state (single re-render)\n setCurrentWidth(liveWidthRef.current);\n setIsDragging(false);\n } else {\n // No drag — treat as a click (toggle)\n setIsDragging(false);\n setIsOpen((prev) => !prev);\n }\n }, [handleMouseMove]);\n\n const handleToggleMouseDown = useCallback(\n (e: React.MouseEvent) => {\n // Only handle left-click, and only when sidebar is open\n if (e.button !== 0 || !isOpen) return;\n\n e.preventDefault();\n e.stopPropagation();\n\n dragStartXRef.current = e.clientX;\n dragStartWidthRef.current = liveWidthRef.current;\n hasDraggedRef.current = false;\n\n document.addEventListener(\"mousemove\", handleMouseMove);\n document.addEventListener(\"mouseup\", handleMouseUp);\n },\n [isOpen, handleMouseMove, handleMouseUp]\n );\n\n const handleToggleClick = useCallback(() => {\n // When the sidebar is closed, a click should open it.\n // When open, click vs drag is handled by mousedown/mouseup logic above,\n // so we only handle the closed-state click here.\n if (!isOpen) {\n setIsOpen(true);\n }\n // When open, toggle is handled by handleMouseUp (if no drag occurred)\n }, [isOpen]);\n\n return (\n <>\n <CopilotToggleButton\n ref={toggleRef}\n isOpen={isOpen}\n position={position}\n onClick={handleToggleClick}\n onMouseDown={handleToggleMouseDown}\n isDragging={isDragging}\n />\n\n <div\n ref={sidebarRef}\n className={`crow-copilot-sidebar crow-copilot-sidebar-${position} ${\n isOpen ? \"\" : \"closed\"\n }`}\n style={{ width: `${currentWidth}px` }}\n >\n {children({ close: () => setIsOpen(false), currentWidth })}\n </div>\n </>\n );\n}\n","/**\n * CrowCopilot - Sidebar chat panel\n *\n * Unlike CrowWidget, this component is designed to be mounted into\n * a user-provided container and works best as a sidebar in your app.\n *\n * Supports:\n * - Custom styles from DB or props\n * - Positioned left or right\n * - Identity verification via window.crow() API\n */\n\nimport { useState, useRef, useEffect, useCallback } from \"react\";\nimport { AnimatePresence } from \"framer-motion\";\n\n// Hooks\nimport { useChat } from \"./hooks/useChat\";\nimport { useConversations } from \"./hooks/useConversations\";\nimport { useCrowAPI } from \"./hooks/useCrowAPI\";\nimport { useCopilotStyles } from \"./hooks/useWidgetStyles\";\nimport { useWorkflow } from \"./hooks/useWorkflow\";\n\n// Context\nimport { CopilotStyleProvider } from \"./context/StyleContext\";\n\n// Components\nimport {\n MessagesContainer,\n MessageList,\n ConversationList,\n WorkflowPanel,\n PoweredByBadge,\n PromptInputBox,\n BrowserUseConfirmation,\n BrowserUseQuestion,\n SuggestedActions,\n} from \"./components/shared\";\nimport { ShadowContainer } from \"./components/ShadowContainer\";\nimport { CopilotContainer } from \"./components/copilot\";\n\n// Styles\nimport { WIDGET_CSS, injectCopilotBodyStyles } from \"./styles\";\n\n// Config\nimport type { CopilotStyleConfig } from \"./styles/types\";\nimport type { Message, ToolRenderers } from \"./types\";\n\nexport interface CrowCopilotProps {\n /** Product ID for this copilot */\n productId: string;\n /** API URL (defaults to relative path) */\n apiUrl?: string;\n /** Subdomain for multi-endpoint routing */\n subdomain?: string;\n /** Copilot variant: embedded (in-app) or floating (with toggle button) */\n variant?: \"embedded\" | \"floating\";\n /** Title shown in header (fallback if agentName not provided) */\n title?: string;\n /** Custom agent name shown in header (overrides API setting if provided) */\n agentName?: string;\n /** Custom welcome message (overrides API setting if provided) */\n welcomeMessage?: string;\n /** Position of the sidebar */\n position?: \"left\" | \"right\";\n /** Width of the sidebar */\n width?: number | string;\n /** Start with sidebar open (floating variant only) */\n defaultOpen?: boolean;\n /** Show close button */\n showClose?: boolean;\n /** Callback when close is clicked */\n onClose?: () => void;\n /** Custom styles to override DB and default styles */\n styles?: Partial<CopilotStyleConfig>;\n /** Skip fetching styles from API (use for preview mode) */\n previewMode?: boolean;\n /** Custom class name */\n className?: string;\n /** Callback when copilot is ready */\n onReady?: () => void;\n /** Custom navigation function for SPA-safe page navigation (e.g. router.push from Next.js or React Router) */\n navigate?: (path: string) => void;\n /** Callback fired when a server-side tool completes, with the tool name and full result data */\n onToolResult?: (toolName: string, result: Record<string, unknown>) => void;\n /**\n * Custom renderers for tool results. When a tool completes and a renderer\n * exists for its name, that component is rendered inline in the chat\n * instead of the default checkmark status.\n *\n * @example\n * ```tsx\n * toolRenderers={{\n * query_analytics_chart: ({ result }) => <MyChart data={result.data} />,\n * }}\n * ```\n */\n toolRenderers?: ToolRenderers;\n /**\n * Async function that returns a JWT for user identity verification.\n * Called on mount and automatically on 401 (token refresh).\n * Replaces the need for a separate component calling window.crow('identify').\n *\n * @example\n * ```tsx\n * getIdentityToken={async () => {\n * const res = await fetch('/api/crow-token');\n * const { token } = await res.json();\n * return token;\n * }}\n * ```\n */\n getIdentityToken?: () => Promise<string>;\n /**\n * Page context data sent with every message. Reactive — updates whenever\n * the object reference changes. Replaces window.crow('setContext', ...).\n *\n * @example\n * ```tsx\n * context={{ cmsContentItemId: \"abc-123\", agentBlogId: \"def-456\" }}\n * ```\n */\n context?: Record<string, unknown>;\n /**\n * ISO 639-1 language code (e.g., \"es\", \"fr\", \"ja\"). When set, the AI\n * responds in that language and the welcome message is translated.\n */\n language?: string;\n}\n\nexport function CrowCopilot({\n productId,\n apiUrl = \"\",\n subdomain,\n variant = \"embedded\",\n title = \"Copilot\",\n agentName: agentNameProp,\n welcomeMessage: welcomeMessageProp,\n position = \"right\",\n width = 400,\n defaultOpen = false,\n showClose = false,\n onClose,\n styles: propStyles,\n previewMode = false,\n className,\n onReady,\n navigate,\n onToolResult,\n toolRenderers,\n getIdentityToken,\n context,\n language,\n}: CrowCopilotProps) {\n // Fall back to window globals for script-tag users\n const effectiveGetIdentityToken = getIdentityToken || window.__crow_identity_token_fetcher;\n const effectiveOnToolResult = onToolResult || window.__crow_on_tool_result;\n const effectiveToolRenderers = toolRenderers || window.__crow_tool_renderers;\n\n // Fetch and merge styles\n const {\n styles,\n isLoading: isLoadingStyles,\n agentName: agentNameFromAPI,\n browserUseEnabled,\n pageNavigationEnabled,\n pageNavigationRoutes,\n persistAnonymousConversations,\n welcomeMessage: welcomeMessageFromAPI,\n selectedModel,\n toolConsentSettings,\n } = useCopilotStyles({\n productId,\n apiUrl,\n propStyles,\n skip: previewMode,\n language,\n });\n\n // Use prop if provided, otherwise use API value, fallback to title for agentName\n const agentName = agentNameProp ?? agentNameFromAPI ?? title;\n\n // Tool status — set via window.crow('setToolStatus', '...')\n const [toolStatus, setToolStatus] = useState<string>(\n () => (window as any).__crow_tool_status as string ?? \"\"\n );\n\n useEffect(() => {\n const handler = (e: Event) => setToolStatus((e as CustomEvent<string>).detail ?? \"\");\n window.addEventListener(\"crow:setToolStatus\", handler);\n return () => window.removeEventListener(\"crow:setToolStatus\", handler);\n }, []);\n\n // Greeting override — set via window.crow('setGreeting', '...')\n const [greetingOverride, setGreetingOverride] = useState<string | undefined>(\n () => (window as any).__crow_greeting as string | undefined\n );\n\n useEffect(() => {\n const handler = (e: Event) => setGreetingOverride((e as CustomEvent<string>).detail);\n window.addEventListener(\"crow:setGreeting\", handler);\n return () => window.removeEventListener(\"crow:setGreeting\", handler);\n }, []);\n\n const welcomeMessage = greetingOverride ?? welcomeMessageProp ?? welcomeMessageFromAPI;\n\n // Auto-loaded tools (e.g., navigateToPage)\n type ToolHandler = (args: Record<string, unknown>) => Promise<unknown> | unknown;\n const [autoTools, setAutoTools] = useState<Record<string, ToolHandler>>({});\n\n // Auto-load browser_use tool when enabled (SSR-safe dynamic import)\n const browserUseLoaded = autoTools.browser_use;\n useEffect(() => {\n if (\n browserUseEnabled &&\n !isLoadingStyles &&\n !browserUseLoaded\n ) {\n import(\"@usecrow/client/browser\")\n .then(({ createBrowserUseTool }) => {\n setAutoTools((prev) => ({\n ...prev,\n browser_use: createBrowserUseTool({ productId, apiUrl }),\n }));\n console.log(\"[Crow] browser_use tool auto-loaded\");\n })\n .catch((err) => {\n console.warn(\"[Crow] Failed to load browser_use:\", err);\n });\n }\n }, [browserUseEnabled, isLoadingStyles, productId, apiUrl, browserUseLoaded]);\n\n // Auto-load navigateToPage tool when page navigation is enabled\n useEffect(() => {\n if (\n pageNavigationEnabled &&\n pageNavigationRoutes.length > 0 &&\n !isLoadingStyles\n ) {\n (import(\"@usecrow/client\") as Promise<any>)\n .then(({ createNavigateToPageTool }) => {\n setAutoTools((prev) => ({\n ...prev,\n navigateToPage: createNavigateToPageTool(pageNavigationRoutes, navigate),\n }));\n console.log(\n `[Crow] navigateToPage tool auto-loaded with ${pageNavigationRoutes.length} routes`\n );\n })\n .catch((err) => {\n console.warn(\"[Crow] Failed to load navigateToPage:\", err);\n });\n }\n }, [pageNavigationEnabled, pageNavigationRoutes, isLoadingStyles, navigate]);\n\n // Register auto-loaded tools\n useEffect(() => {\n if (Object.keys(autoTools).length > 0) {\n window.crow?.(\"registerTools\", autoTools);\n }\n }, [autoTools]);\n\n // --- Embedded resizable sidebar state (persisted via sessionStorage) ---\n const embeddedInitialWidth =\n typeof width === \"number\" ? width : parseInt(String(width), 10) || 400;\n const [embeddedWidth, setEmbeddedWidth] = useState(() => {\n try {\n const stored = sessionStorage.getItem(\"crow_embedded_width\");\n if (stored) {\n const parsed = parseInt(stored, 10);\n if (parsed >= 280 && parsed <= 800) return parsed;\n }\n } catch { /* ignore */ }\n return embeddedInitialWidth;\n });\n const [isCollapsed, setIsCollapsed] = useState(() => {\n try {\n return sessionStorage.getItem(\"crow_embedded_collapsed\") === \"true\";\n } catch { return false; }\n });\n\n // Persist embedded state changes\n useEffect(() => {\n try { sessionStorage.setItem(\"crow_embedded_width\", String(embeddedWidth)); }\n catch { /* ignore */ }\n }, [embeddedWidth]);\n useEffect(() => {\n try { sessionStorage.setItem(\"crow_embedded_collapsed\", String(isCollapsed)); }\n catch { /* ignore */ }\n }, [isCollapsed]);\n\n // DOM refs for direct manipulation during drag (zero React re-renders)\n const embeddedContentRef = useRef<HTMLDivElement>(null);\n const embeddedToggleRef = useRef<HTMLButtonElement>(null);\n const embeddedDragStartX = useRef(0);\n const embeddedDragStartW = useRef(0);\n const embeddedHasDragged = useRef(false);\n const embeddedLiveWidth = useRef(embeddedInitialWidth);\n const positionRef = useRef(position);\n positionRef.current = position;\n\n // Keep live width in sync with React state\n useEffect(() => {\n embeddedLiveWidth.current = embeddedWidth;\n }, [embeddedWidth]);\n\n // Drag-to-resize: direct DOM, no React re-renders until mouseup\n const embeddedMouseMove = useCallback((e: MouseEvent) => {\n const dx = e.clientX - embeddedDragStartX.current;\n if (!embeddedHasDragged.current && Math.abs(dx) >= 5) {\n embeddedHasDragged.current = true;\n // Lock cursor + disable text selection on body for the entire drag\n document.body.style.cursor = \"col-resize\";\n document.body.style.userSelect = \"none\";\n }\n if (!embeddedHasDragged.current) return;\n\n const delta = positionRef.current === \"right\" ? -dx : dx;\n const newW = Math.min(800, Math.max(280, embeddedDragStartW.current + delta));\n embeddedLiveWidth.current = newW;\n\n // Direct DOM: update the content wrapper width → flex layout reflows instantly\n if (embeddedContentRef.current) {\n embeddedContentRef.current.style.width = `${newW}px`;\n }\n }, []);\n\n const embeddedMouseUp = useCallback(() => {\n document.removeEventListener(\"mousemove\", embeddedMouseMove);\n document.removeEventListener(\"mouseup\", embeddedMouseUp);\n document.body.style.cursor = \"\";\n document.body.style.userSelect = \"\";\n\n if (embeddedHasDragged.current) {\n setEmbeddedWidth(embeddedLiveWidth.current);\n } else {\n // No drag = click → toggle collapse/expand\n setIsCollapsed((prev) => !prev);\n }\n }, [embeddedMouseMove]);\n\n const embeddedHandleMouseDown = useCallback(\n (e: React.MouseEvent) => {\n if (e.button !== 0) return;\n // When collapsed, a click should just expand (no drag)\n if (isCollapsed) return;\n e.preventDefault();\n e.stopPropagation();\n embeddedDragStartX.current = e.clientX;\n embeddedDragStartW.current = embeddedLiveWidth.current;\n embeddedHasDragged.current = false;\n document.addEventListener(\"mousemove\", embeddedMouseMove);\n document.addEventListener(\"mouseup\", embeddedMouseUp);\n },\n [isCollapsed, embeddedMouseMove, embeddedMouseUp]\n );\n\n const embeddedHandleClick = useCallback(() => {\n if (isCollapsed) {\n setIsCollapsed(false);\n }\n // When expanded, toggle is handled by mousedown/mouseup (drag vs click)\n }, [isCollapsed]);\n\n // Default (page-level) suggested actions set via window.crow('setSuggestedActions', ...)\n const defaultSuggestedActionsRef = useRef<Array<{ label: string; message: string }>>([]);\n\n // Listen for programmatic open/close/setSuggestedActions commands\n useEffect(() => {\n const handleOpen = () => setIsCollapsed(false);\n const handleClose = () => setIsCollapsed(true);\n const handleSetSuggestions = (e: Event) => {\n const actions = (e as CustomEvent).detail;\n if (Array.isArray(actions)) {\n defaultSuggestedActionsRef.current = actions;\n chat.setSuggestedActions(actions);\n }\n };\n window.addEventListener(\"crow:open\", handleOpen);\n window.addEventListener(\"crow:close\", handleClose);\n window.addEventListener(\"crow:setSuggestedActions\", handleSetSuggestions);\n\n // Pick up actions that were set before this listener attached (queue replay timing)\n const pending = (window as any).__crow_suggested_actions;\n if (Array.isArray(pending) && pending.length > 0) {\n defaultSuggestedActionsRef.current = pending;\n chat.setSuggestedActions(pending);\n }\n\n return () => {\n window.removeEventListener(\"crow:open\", handleOpen);\n window.removeEventListener(\"crow:close\", handleClose);\n window.removeEventListener(\"crow:setSuggestedActions\", handleSetSuggestions);\n };\n }, []);\n\n // Refs\n const messagesContainerRef = useRef<HTMLDivElement>(null);\n const tabsScrollRef = useRef<HTMLDivElement>(null);\n const executeClientToolRef = useRef<\n | ((toolName: string, args: Record<string, unknown>) => Promise<unknown>)\n | null\n >(null);\n const submitToolResultRef = useRef<\n | ((\n toolCallId: string,\n toolName: string,\n result: Record<string, unknown>,\n ) => Promise<void>)\n | null\n >(null);\n\n // UI State\n const [showConversationList, setShowConversationList] = useState(false);\n const [isVerifiedUser, setIsVerifiedUser] = useState(false);\n const [localTabs, setLocalTabs] = useState<Array<{ id: string; name: string }>>([\n { id: \"local-1\", name: \"Chat 1\" },\n ]);\n const [activeLocalTabId, setActiveLocalTabId] = useState(\"local-1\");\n const [localTabMessages, setLocalTabMessages] = useState<Record<string, Message[]>>({});\n const [localTabCounter, setLocalTabCounter] = useState(1);\n\n // Browser automation state\n const [isBrowserUseActive, setIsBrowserUseActive] = useState(false);\n const [pendingConfirmation, setPendingConfirmation] = useState<{\n instruction: string;\n resolve: (confirmed: boolean) => void;\n } | null>(null);\n\n\n const [askUserResolver, setAskUserResolver] = useState<{\n resolve: (answer: string) => void;\n reject: (reason?: unknown) => void;\n } | null>(null);\n\n // The question text to show in the UI when browser automation asks the user\n const [browserQuestion, setBrowserQuestion] = useState<string | null>(null);\n\n // Conversations hook\n const conversations = useConversations({ productId, apiUrl });\n\n // Track if we need to restore history on mount\n const [shouldRestoreHistory, setShouldRestoreHistory] = useState(false);\n const hasRestoredHistoryRef = useRef(false);\n\n // Persist active conversationId across page reloads\n const activeConvStorageKey = `crow_active_conv_${productId}`;\n const pendingRestoreConvId = useRef<string | null>(null);\n const hasRestoredActiveConvRef = useRef(false);\n // Read on mount (synchronous, before any effects)\n if (pendingRestoreConvId.current === null) {\n try {\n pendingRestoreConvId.current = localStorage.getItem(activeConvStorageKey) || \"\";\n } catch {\n pendingRestoreConvId.current = \"\";\n }\n }\n\n // Chat hook\n const chat = useChat({\n productId,\n apiUrl,\n persistAnonymousConversations,\n welcomeMessage,\n selectedModel,\n subdomain,\n toolConsentSettings,\n language,\n onVerificationStatus: (isVerified) => {\n setIsVerifiedUser(isVerified);\n },\n onConversationId: () => {},\n onWorkflowEvent: (event) => {\n switch (event.type) {\n case \"started\":\n if (event.name && event.todos) {\n startWorkflow(event.name, event.todos);\n }\n break;\n case \"todo_updated\":\n if (event.todoId && event.todoStatus) {\n updateTodo(event.todoId, event.todoStatus);\n }\n break;\n case \"ended\":\n endWorkflow(2000);\n break;\n case \"complete_prompt\":\n markComplete();\n break;\n }\n },\n onToolResult: effectiveOnToolResult,\n onToolCall: async (event) => {\n if (event.type === \"client_call\" && event.toolName && event.toolCallId) {\n // Original non-consent flow\n try {\n const result = await executeClientToolRef.current?.(\n event.toolName,\n (event.arguments || {}) as Record<string, unknown>,\n );\n\n // Don't send result if user cancelled/declined - just stop\n const resultObj = result as Record<string, unknown>;\n const dataObj = resultObj?.data as Record<string, unknown> | undefined;\n const wasUserCancelled =\n dataObj?.declined === true ||\n (typeof resultObj?.error === 'string' && resultObj.error.includes('cancelled by user')) ||\n (typeof resultObj?.error === 'string' && resultObj.error.includes('declined'));\n\n if (wasUserCancelled) {\n console.log('[Crow Copilot] Tool was cancelled by user');\n if (submitToolResultRef.current) {\n await submitToolResultRef.current(\n event.toolCallId,\n event.toolName,\n { success: false, cancelled: true, error: 'Action was cancelled by the user.' },\n );\n }\n return;\n }\n\n // Send result back to agent so it can continue\n if (result && submitToolResultRef.current) {\n await submitToolResultRef.current(\n event.toolCallId,\n event.toolName,\n result as Record<string, unknown>,\n );\n }\n } catch (e) {\n console.error(\"[Crow Copilot] Tool error:\", e);\n if (submitToolResultRef.current) {\n await submitToolResultRef.current(\n event.toolCallId,\n event.toolName,\n { success: false, error: String(e) },\n );\n }\n }\n }\n },\n onRestoredConversation: () => {\n setShouldRestoreHistory(true);\n },\n });\n\n // Load anonymous conversation history when restored from localStorage\n useEffect(() => {\n if (\n shouldRestoreHistory &&\n chat.conversationId &&\n !hasRestoredHistoryRef.current\n ) {\n hasRestoredHistoryRef.current = true;\n conversations\n .loadAnonymousConversationHistory(chat.conversationId)\n .then((historyMessages) => {\n if (historyMessages.length > 0) {\n chat.loadMessages(historyMessages);\n }\n });\n }\n }, [shouldRestoreHistory, chat.conversationId, conversations, chat]);\n\n // Restore conversation for anonymous users after styles load.\n // Verified users are handled in onIdentified; this only covers\n // the case where no identity token fetcher is provided (anonymous-only mode).\n useEffect(() => {\n // Skip entirely when an identity token fetcher exists — onIdentified will\n // handle restoration once verification completes. Without this guard the\n // 500ms timer races against the async identity flow and almost always wins,\n // consuming the pending conversation ID before onIdentified can use it.\n if (effectiveGetIdentityToken) return;\n if (isLoadingStyles || hasRestoredActiveConvRef.current) return;\n\n const timer = setTimeout(() => {\n if (hasRestoredActiveConvRef.current || isVerifiedUser) return;\n const savedId = pendingRestoreConvId.current;\n if (!savedId) return;\n hasRestoredActiveConvRef.current = true;\n pendingRestoreConvId.current = \"\";\n\n conversations\n .loadAnonymousConversationHistory(savedId)\n .then((historyMessages) => {\n if (historyMessages.length > 0) {\n chat.loadMessages(historyMessages);\n chat.setConversationId(savedId);\n }\n })\n .catch(() => {\n // Conversation may no longer exist; start fresh\n });\n }, 500);\n\n return () => clearTimeout(timer);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isLoadingStyles, effectiveGetIdentityToken]);\n\n // Save active conversationId to localStorage whenever it changes\n useEffect(() => {\n try {\n if (chat.conversationId) {\n localStorage.setItem(activeConvStorageKey, chat.conversationId);\n }\n } catch {\n // localStorage unavailable\n }\n }, [chat.conversationId, activeConvStorageKey]);\n\n // Inject body styles for floating variant (push effect)\n // These must be in document.head, not Shadow DOM, to affect the body element\n useEffect(() => {\n if (variant === \"floating\") {\n injectCopilotBodyStyles();\n }\n }, [variant]);\n\n // Workflow hook (single instance for both UI state and exit actions)\n const {\n activeWorkflow,\n startWorkflow,\n updateTodo,\n markComplete,\n endWorkflow,\n exitWorkflow,\n } = useWorkflow({\n productId,\n apiUrl,\n conversationId: chat.conversationId,\n selectedModel: chat.selectedModel,\n onMessage: (content) => {\n chat.loadMessages([\n ...chat.messages,\n {\n id: `bot-${Date.now()}`,\n content,\n isBot: true,\n timestamp: new Date(),\n },\n ]);\n },\n });\n\n // Crow API hook\n const { executeClientTool } = useCrowAPI({\n onIdentified: async () => {\n setIsVerifiedUser(true);\n await conversations.loadConversations();\n\n // Restore the last active conversation from previous session\n const savedId = pendingRestoreConvId.current;\n if (savedId && !hasRestoredActiveConvRef.current) {\n hasRestoredActiveConvRef.current = true;\n pendingRestoreConvId.current = \"\"; // consumed\n try {\n const historyMessages = await conversations.loadConversationHistory(savedId);\n if (historyMessages.length > 0) {\n chat.loadMessages(historyMessages);\n chat.setConversationId(savedId);\n }\n } catch {\n // Conversation may have been deleted; ignore and show fresh chat\n }\n }\n },\n onReset: () => {\n setIsVerifiedUser(false);\n chat.resetMessages();\n },\n });\n\n executeClientToolRef.current = executeClientTool;\n submitToolResultRef.current = chat.submitToolResult;\n\n // Browser automation callbacks\n const handleBrowserConfirmation = useCallback(\n (instruction: string): Promise<boolean> => {\n return new Promise((resolve) => {\n setPendingConfirmation({ instruction, resolve });\n });\n },\n [],\n );\n\n const handleBrowserQuestion = useCallback(\n (question: string): Promise<string> => {\n return new Promise((resolve, reject) => {\n // Reject any pending resolver before overwriting to avoid hanging promises\n setAskUserResolver((prev) => {\n if (prev) {\n prev.reject(new Error(\"Superseded by new browser question\"));\n }\n return { resolve, reject };\n });\n setBrowserQuestion(question);\n // Add the question as a bot message in the chat (persisted to server)\n chat.addMessage(\"assistant\", question);\n });\n },\n [chat],\n );\n\n const handleBrowserProgress = useCallback(\n (step: number, maxSteps: number) => {\n // If step indicates completion or error, clear active state\n if (step >= maxSteps || step === -1) {\n setIsBrowserUseActive(false);\n }\n },\n [],\n );\n\n const handleExitWorkflow = async () => {\n await exitWorkflow();\n };\n\n // Handle tool consent Allow/Deny from inline buttons\n const handleToolConsent = async (toolCallId: string, approved: boolean) => {\n const toolCall = chat.activeToolCalls.find((tc) => tc.id === toolCallId)\n || chat.messages.flatMap((m) => m.toolCalls || []).find((tc) => tc.id === toolCallId);\n\n if (!toolCall) return;\n\n const isClientSide = !toolCall.serverSideExecution;\n\n if (approved) {\n chat.updateToolCallStatus(toolCallId, \"executing\");\n\n if (isClientSide) {\n // Client-side tool: execute locally, then submit result\n try {\n const result = await executeClientToolRef.current?.(\n toolCall.name,\n (toolCall.arguments || {}) as Record<string, unknown>,\n );\n\n const resultObj = result as Record<string, unknown>;\n const dataObj = resultObj?.data as Record<string, unknown> | undefined;\n const wasUserCancelled =\n dataObj?.declined === true ||\n (typeof resultObj?.error === 'string' && resultObj.error.includes('cancelled by user')) ||\n (typeof resultObj?.error === 'string' && resultObj.error.includes('declined'));\n\n if (wasUserCancelled) {\n console.log('[Crow Copilot] Tool was cancelled by user after consent');\n if (submitToolResultRef.current) {\n await submitToolResultRef.current(\n toolCallId,\n toolCall.name,\n { success: false, cancelled: true, error: 'Action was cancelled by the user.' },\n );\n }\n return;\n }\n\n if (result && submitToolResultRef.current) {\n await submitToolResultRef.current(\n toolCallId,\n toolCall.name,\n result as Record<string, unknown>,\n );\n }\n } catch (e) {\n console.error(\"[Crow Copilot] Tool error after consent:\", e);\n if (submitToolResultRef.current) {\n await submitToolResultRef.current(\n toolCallId,\n toolCall.name,\n { success: false, error: String(e) },\n );\n }\n }\n } else {\n // Server-side tool: submit consent approval — backend will execute\n if (submitToolResultRef.current) {\n await submitToolResultRef.current(\n toolCallId,\n toolCall.name,\n { consent_approved: true, tool_arguments: toolCall.arguments || {} },\n );\n }\n }\n } else {\n chat.updateToolCallStatus(toolCallId, \"denied\");\n if (submitToolResultRef.current) {\n await submitToolResultRef.current(\n toolCallId,\n toolCall.name,\n { status: \"denied\", error: \"User denied permission to execute this tool.\" },\n );\n }\n }\n };\n\n // Set up global browser callbacks for the SDK to use\n useEffect(() => {\n (window as any).__crow_browser_callbacks = {\n onConfirmation: handleBrowserConfirmation,\n onQuestion: handleBrowserQuestion,\n onProgress: handleBrowserProgress,\n };\n return () => {\n delete (window as any).__crow_browser_callbacks;\n };\n }, [handleBrowserConfirmation, handleBrowserQuestion, handleBrowserProgress]);\n\n // Notify when ready\n useEffect(() => {\n if (!isLoadingStyles) {\n onReady?.();\n }\n }, [isLoadingStyles, onReady]);\n\n // Declarative identity: call getIdentityToken on mount and on token refresh\n useEffect(() => {\n if (!effectiveGetIdentityToken || isLoadingStyles) return;\n\n let cancelled = false;\n\n const identify = async () => {\n try {\n const token = await effectiveGetIdentityToken();\n if (!cancelled && token) {\n window.crow?.(\"identify\", { token });\n }\n } catch (e) {\n console.error(\"[Crow] getIdentityToken failed:\", e);\n }\n };\n\n // Initial identification\n identify();\n\n // Auto-refresh on 401\n const handleRefresh = () => identify();\n window.addEventListener(\"crow:token-refresh-needed\", handleRefresh);\n\n return () => {\n cancelled = true;\n window.removeEventListener(\"crow:token-refresh-needed\", handleRefresh);\n };\n }, [effectiveGetIdentityToken, isLoadingStyles]);\n\n // Declarative context: sync context prop to window.__crow_page_context\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n if (context && Object.keys(context).length > 0) {\n (window as any).__crow_page_context = context;\n } else {\n (window as any).__crow_page_context = undefined;\n }\n }, [context]);\n\n // Handlers\n const handleSend = (message: string) => {\n if (!message.trim()) return;\n\n // If browser_use is waiting for user input, route the message there instead of chat\n if (askUserResolver) {\n // Add user's answer to chat (persisted to server)\n chat.addMessage(\"user\", message);\n askUserResolver.resolve(message);\n setAskUserResolver(null);\n setBrowserQuestion(null);\n return;\n }\n\n chat.sendMessage(message);\n };\n\n const handleStop = () => {\n // Stop the chat/tool generation FIRST to kill any streaming responses\n chat.stopGeneration();\n\n // Snapshot and clear resolver synchronously to avoid stale captures in async callbacks\n const currentResolver = askUserResolver;\n setAskUserResolver(null);\n setBrowserQuestion(null);\n\n // Stop any active browser_use automation (sets abort flag)\n if (browserUseEnabled && isBrowserUseActive) {\n import(\"@usecrow/client/browser\")\n .then(({ stopActiveBrowserUse }) => {\n stopActiveBrowserUse();\n // Reject the snapshotted resolver AFTER abort flag is set\n currentResolver?.reject(new Error(\"Stopped by user\"));\n })\n .catch(() => {\n currentResolver?.reject(new Error(\"Stopped by user\"));\n });\n setIsBrowserUseActive(false);\n } else if (currentResolver) {\n currentResolver.reject(new Error(\"Stopped by user\"));\n }\n\n // Clear any pending confirmation dialog\n if (pendingConfirmation) {\n pendingConfirmation.resolve(false);\n setPendingConfirmation(null);\n }\n };\n\n const handleNewChat = () => {\n if (!isVerifiedUser) {\n setLocalTabMessages((prev) => ({\n ...prev,\n [activeLocalTabId]: chat.messages,\n }));\n const nextIndex = localTabCounter + 1;\n const nextId = `local-${nextIndex}`;\n setLocalTabs((prev) => [...prev, { id: nextId, name: `Chat ${nextIndex}` }]);\n setActiveLocalTabId(nextId);\n setLocalTabCounter(nextIndex);\n }\n chat.resetMessages();\n setShowConversationList(false);\n };\n\n const handleToggleHistory = () => {\n if (!isVerifiedUser) {\n return;\n }\n setShowConversationList(!showConversationList);\n if (!showConversationList) {\n conversations.loadConversations();\n }\n };\n\n const handleSelectConversation = async (convId: string) => {\n const historyMessages = await conversations.loadConversationHistory(convId);\n if (historyMessages.length > 0) {\n chat.loadMessages(historyMessages);\n chat.setConversationId(convId);\n } else {\n chat.resetMessages();\n }\n setShowConversationList(false);\n };\n\n const handleSelectLocalTab = (tabId: string) => {\n if (tabId === activeLocalTabId) return;\n setLocalTabMessages((prev) => ({\n ...prev,\n [activeLocalTabId]: chat.messages,\n }));\n const nextMessages = localTabMessages[tabId];\n if (nextMessages && nextMessages.length > 0) {\n chat.loadMessages(nextMessages);\n } else {\n chat.resetMessages();\n }\n setActiveLocalTabId(tabId);\n setShowConversationList(false);\n };\n\n const handleCloseConversationList = () => {\n setShowConversationList(false);\n };\n\n // Tab hover state (for showing close button)\n const [hoveredTabId, setHoveredTabId] = useState<string | null>(null);\n\n // Hidden server tab IDs (removed from view, not deleted from server)\n const [hiddenServerTabIds, setHiddenServerTabIds] = useState<Set<string>>(new Set());\n\n const handleCloseTab = (tabId: string, tabType: \"local\" | \"server\" | \"new\") => {\n if (tabType === \"new\") return; // can't close \"New Chat\"\n\n if (tabType === \"local\") {\n // Don't close the last local tab\n if (localTabs.length <= 1) return;\n\n if (activeLocalTabId === tabId) {\n // Closing the active tab — switch to an adjacent one.\n // First, snapshot the current messages into the map so we have\n // the latest state for all tabs before deciding what to load.\n const updatedMessages = {\n ...localTabMessages,\n [activeLocalTabId]: chat.messages,\n };\n\n const idx = localTabs.findIndex((t) => t.id === tabId);\n const nextTab = localTabs[idx + 1] || localTabs[idx - 1];\n if (nextTab) {\n const nextMessages = updatedMessages[nextTab.id];\n if (nextMessages && nextMessages.length > 0) {\n chat.loadMessages(nextMessages);\n } else {\n chat.resetMessages();\n }\n setActiveLocalTabId(nextTab.id);\n }\n\n // Remove the closed tab's messages from the map\n delete updatedMessages[tabId];\n setLocalTabMessages(updatedMessages);\n } else {\n // Closing a non-active tab — just remove it from the list and map\n setLocalTabMessages((prev) => {\n const next = { ...prev };\n delete next[tabId];\n return next;\n });\n }\n\n setLocalTabs((prev) => prev.filter((t) => t.id !== tabId));\n }\n\n if (tabType === \"server\") {\n // If closing the active server tab, switch to New Chat\n if (chat.conversationId === tabId) {\n chat.resetMessages();\n chat.setConversationId(null);\n }\n setHiddenServerTabIds((prev) => new Set(prev).add(tabId));\n }\n };\n\n const sortedConversations = isVerifiedUser\n ? [...conversations.conversations].sort(\n (a, b) =>\n new Date(b.updated_at).getTime() - new Date(a.updated_at).getTime()\n )\n : [];\n\n const tabs = isVerifiedUser\n ? [\n { id: \"new\", name: \"New Chat\", type: \"new\" as const },\n ...sortedConversations\n .filter((conv) => !hiddenServerTabIds.has(conv.id))\n .map((conv, idx) => ({\n id: conv.id,\n name: conv.name || `Chat ${idx + 1}`,\n type: \"server\" as const,\n })),\n ]\n : localTabs.map((tab) => ({ ...tab, type: \"local\" as const }));\n\n const activeTabId = isVerifiedUser\n ? chat.conversationId ?? \"new\"\n : activeLocalTabId;\n\n // Refresh the conversation list when the user becomes verified or when a new\n // server conversation is created. We track the previous conversationId to\n // avoid reloading on every render — only when it transitions from null to a\n // real value (i.e. the server assigned a new conversation ID).\n const prevConversationIdRef = useRef<string | null | undefined>(undefined);\n useEffect(() => {\n if (!isVerifiedUser) return;\n\n const currentId = chat.conversationId;\n const prevId = prevConversationIdRef.current;\n prevConversationIdRef.current = currentId;\n\n // First run (prevId is undefined) or null -> string transition\n if (prevId === undefined || (prevId === null && currentId !== null)) {\n conversations.loadConversations();\n }\n }, [isVerifiedUser, chat.conversationId, conversations.loadConversations]);\n\n // Tab scrolling state\n const [canScrollRight, setCanScrollRight] = useState(false);\n\n const checkTabsOverflow = useCallback(() => {\n const el = tabsScrollRef.current;\n if (!el) return;\n setCanScrollRight(el.scrollWidth > el.clientWidth + el.scrollLeft + 1);\n }, []);\n\n const handleTabsScroll = useCallback(() => {\n checkTabsOverflow();\n }, [checkTabsOverflow]);\n\n const handleScrollRight = useCallback(() => {\n const el = tabsScrollRef.current;\n if (!el) return;\n el.scrollBy({ left: 120, behavior: \"smooth\" });\n }, []);\n\n // Re-check overflow when tabs change\n useEffect(() => {\n checkTabsOverflow();\n }, [tabs.length, checkTabsOverflow]);\n\n const widthStyle = typeof width === \"number\" ? `${width}px` : width;\n\n const renderCopilotContent = (overrideOnClose?: () => void, forceShowClose?: boolean, overrideWidth?: number | string) => (\n <CopilotStyleProvider\n styles={styles}\n agentName={agentName}\n isLoading={isLoadingStyles}\n >\n <div\n className={`crow-flex crow-flex-col crow-h-full ${\n position === \"left\" ? \"crow-border-r\" : \"crow-border-l\"\n } ${className || \"\"}`}\n style={{\n width: overrideWidth\n ? (typeof overrideWidth === \"number\" ? `${overrideWidth}px` : overrideWidth)\n : widthStyle,\n fontFamily: styles.typography.fontFamily,\n fontSize: styles.typography.fontSize,\n fontWeight: styles.typography.fontWeight,\n lineHeight: styles.typography.lineHeight,\n letterSpacing: styles.typography.letterSpacing,\n background: styles.colors.background,\n borderColor: styles.colors.border,\n }}\n >\n {/* Tab Bar */}\n <div\n className=\"crow-flex crow-items-stretch crow-border-b crow-min-h-[40px]\"\n style={{ borderColor: styles.colors.border }}\n >\n {/* Scrollable tabs area */}\n <div\n ref={tabsScrollRef}\n className=\"crow-flex crow-items-stretch crow-flex-1 crow-min-w-0 crow-overflow-x-auto\"\n style={{\n scrollbarWidth: \"none\",\n msOverflowStyle: \"none\",\n }}\n onScroll={handleTabsScroll}\n >\n {tabs.map((tab, idx) => {\n const isActive = activeTabId === tab.id;\n const isHovered = hoveredTabId === tab.id;\n const isCloseable = tab.type !== \"new\" && (tab.type !== \"local\" || localTabs.length > 1);\n return (\n <div\n key={`${tab.id}-${idx}`}\n className={`crow-relative crow-flex-shrink-0 crow-flex crow-items-center crow-text-[13px] crow-leading-tight crow-py-2.5 crow-transition-colors crow-select-none crow-cursor-pointer ${\n isActive\n ? \"crow-text-gray-900 crow-font-medium\"\n : \"crow-text-gray-500 hover:crow-text-gray-700 hover:crow-bg-gray-50\"\n }`}\n style={{\n maxWidth: \"180px\",\n borderRight: idx < tabs.length - 1 ? `1px solid ${styles.colors.border}` : \"none\",\n paddingLeft: \"16px\",\n paddingRight: isCloseable ? \"8px\" : \"16px\",\n }}\n title={tab.name}\n onMouseEnter={() => setHoveredTabId(tab.id)}\n onMouseLeave={() => setHoveredTabId(null)}\n onClick={() => {\n if (tab.type === \"new\") {\n handleNewChat();\n return;\n }\n if (tab.type === \"server\") {\n handleSelectConversation(tab.id);\n return;\n }\n handleSelectLocalTab(tab.id);\n }}\n >\n <span\n className=\"crow-block crow-truncate\"\n style={{ maxWidth: isCloseable ? \"112px\" : \"128px\" }}\n >\n {tab.name}\n </span>\n {/* Close button - visible on hover */}\n {isCloseable && (\n <span\n className=\"crow-rounded crow-p-0.5 crow-flex-shrink-0 crow-inline-flex crow-items-center crow-justify-center crow-transition-opacity hover:crow-bg-gray-200\"\n style={{\n marginLeft: \"6px\",\n opacity: isHovered ? 1 : 0,\n pointerEvents: isHovered ? \"auto\" : \"none\",\n }}\n onClick={(e) => {\n e.stopPropagation();\n handleCloseTab(tab.id, tab.type);\n }}\n role=\"button\"\n aria-label={`Close ${tab.name}`}\n >\n <TabCloseIcon className=\"crow-w-3 crow-h-3 crow-text-gray-400 hover:crow-text-gray-600\" />\n </span>\n )}\n {/* Active indicator bar */}\n {isActive && (\n <span\n className=\"crow-absolute crow-bottom-0 crow-left-0 crow-right-0\"\n style={{\n height: \"2px\",\n background: styles.colors.primary || \"#2563eb\",\n }}\n />\n )}\n </div>\n );\n })}\n </div>\n\n {/* Action buttons - pinned right */}\n <div\n className=\"crow-flex crow-items-center crow-flex-shrink-0 crow-border-l\"\n style={{ borderColor: styles.colors.border }}\n >\n {/* New Chat */}\n <button\n onClick={handleNewChat}\n className=\"crow-p-2 hover:crow-bg-gray-100 crow-transition-colors\"\n aria-label=\"New Chat\"\n title=\"New Chat\"\n >\n <PlusIcon className=\"crow-w-4 crow-h-4 crow-text-gray-500\" />\n </button>\n\n {/* History */}\n <button\n onClick={handleToggleHistory}\n disabled={!isVerifiedUser}\n aria-disabled={!isVerifiedUser}\n className={`crow-p-2 crow-transition-colors ${\n showConversationList ? \"crow-bg-gray-100\" : \"hover:crow-bg-gray-100\"\n } ${!isVerifiedUser ? \"crow-opacity-40 crow-cursor-not-allowed\" : \"\"}`}\n aria-label=\"Conversation History\"\n title={\n isVerifiedUser ? \"Conversation History\" : \"Sign in to view history\"\n }\n >\n <HistoryIcon className=\"crow-w-4 crow-h-4 crow-text-gray-500\" />\n </button>\n\n {/* Scroll right chevron - only visible when there's overflow */}\n {canScrollRight && (\n <button\n onClick={handleScrollRight}\n className=\"crow-p-2 hover:crow-bg-gray-100 crow-transition-colors\"\n aria-label=\"Scroll tabs\"\n title=\"Scroll tabs\"\n >\n <ChevronRightIcon className=\"crow-w-4 crow-h-4 crow-text-gray-500\" />\n </button>\n )}\n\n {/* Close button */}\n {(forceShowClose ?? showClose) && (overrideOnClose ?? onClose) && (\n <button\n onClick={overrideOnClose ?? onClose}\n className=\"crow-p-2 hover:crow-bg-gray-100 crow-transition-colors\"\n aria-label=\"Close\"\n >\n <CloseIcon className=\"crow-w-4 crow-h-4 crow-text-gray-500\" />\n </button>\n )}\n </div>\n </div>\n\n {/* Conversation List */}\n <AnimatePresence>\n {showConversationList && isVerifiedUser && (\n <ConversationList\n conversations={conversations.conversations}\n currentConversationId={chat.conversationId}\n onSelect={handleSelectConversation}\n onClose={handleCloseConversationList}\n />\n )}\n {showConversationList && !isVerifiedUser && (\n <div className=\"crow-mb-3 crow-rounded-xl crow-bg-gray-50 crow-border crow-border-gray-200 crow-p-4\">\n <div className=\"crow-text-sm crow-text-gray-600\">\n Sign in to view conversation history.\n </div>\n </div>\n )}\n </AnimatePresence>\n\n <AnimatePresence>\n {activeWorkflow && (\n <WorkflowPanel\n workflow={activeWorkflow}\n onExit={handleExitWorkflow}\n />\n )}\n </AnimatePresence>\n\n {/* Messages */}\n <MessagesContainer ref={messagesContainerRef}>\n <MessageList\n messages={chat.messages}\n activeToolCalls={chat.activeToolCalls}\n isLoadingHistory={conversations.isLoadingHistory}\n isGenerating={chat.isLoading}\n toolRenderers={effectiveToolRenderers}\n onToolConsent={handleToolConsent}\n />\n\n {/* Browser automation confirmation */}\n {pendingConfirmation && (\n <div className=\"crow-px-4 crow-py-2\">\n <BrowserUseConfirmation\n instruction={pendingConfirmation.instruction}\n onAllow={() => {\n pendingConfirmation.resolve(true);\n setPendingConfirmation(null);\n }}\n onDeny={() => {\n pendingConfirmation.resolve(false);\n setPendingConfirmation(null);\n }}\n />\n </div>\n )}\n\n\n {/* Browser automation question */}\n {askUserResolver && browserQuestion && (\n <div className=\"crow-px-4 crow-py-2\">\n <BrowserUseQuestion\n question={browserQuestion}\n onSubmit={(answer) => {\n askUserResolver.resolve(answer);\n setAskUserResolver(null);\n setBrowserQuestion(null);\n }}\n />\n </div>\n )}\n </MessagesContainer>\n\n {/* Input */}\n <div\n className=\"crow-p-3 crow-border-t\"\n style={{ borderColor: styles.colors.border }}\n >\n {toolStatus && (\n <div className=\"crow-mb-1 crow-flex crow-items-center crow-gap-2 crow-rounded-lg crow-border crow-border-[var(--crow-border,#e5e7eb)] crow-bg-[var(--crow-bg-secondary,#f3f4f6)] crow-px-3 crow-py-2 crow-text-sm\">\n <svg className=\"crow-animate-spin crow-h-4 crow-w-4 crow-shrink-0 crow-text-[var(--crow-primary,#7c3aed)]\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle className=\"crow-opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\" />\n <path className=\"crow-opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z\" />\n </svg>\n <span className=\"crow-font-medium crow-text-[var(--crow-text,#111827)]\">{toolStatus}</span>\n </div>\n )}\n {(chat.suggestedActions.length > 0 || (!chat.isLoading && defaultSuggestedActionsRef.current.length > 0)) && (\n <SuggestedActions\n actions={chat.suggestedActions.length > 0 ? chat.suggestedActions : defaultSuggestedActionsRef.current}\n onActionClick={(action) => handleSend(action.message)}\n />\n )}\n {styles.branding.showPoweredBy && <PoweredByBadge apiUrl={apiUrl} />}\n <PromptInputBox\n onSend={handleSend}\n onStop={handleStop}\n placeholder=\"Ask anything...\"\n isLoading={chat.isLoading}\n />\n </div>\n </div>\n </CopilotStyleProvider>\n );\n\n const floatingWidth =\n typeof width === \"number\" ? width : parseInt(String(width), 10) || 400;\n\n // --- Floating variant: uses CopilotContainer with push effect ---\n if (variant === \"floating\") {\n return (\n <ShadowContainer styles={WIDGET_CSS}>\n <CopilotContainer\n position={position}\n width={floatingWidth}\n defaultOpen={defaultOpen}\n >\n {({ close, currentWidth: resizedWidth }) =>\n renderCopilotContent(close, true, resizedWidth)\n }\n </CopilotContainer>\n </ShadowContainer>\n );\n }\n\n // --- Embedded variant: resizable flex child with toggle button ---\n const isRight = position === \"right\";\n const edgeSide = isRight ? \"left\" : \"right\";\n\n // Choose icon: message bubble when collapsed, chevron when expanded\n const toggleIcon = isCollapsed ? (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#6b7280\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M7.9 20A9 9 0 1 0 4 16.1L2 22Z\" />\n </svg>\n ) : (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#6b7280\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n {isRight ? <path d=\"m9 18 6-6-6-6\" /> : <path d=\"m15 18-6-6 6-6\" />}\n </svg>\n );\n\n return (\n <div style={{ position: \"relative\", flexShrink: 0, height: \"100%\" }}>\n {/* Toggle button — click to collapse/expand, drag to resize */}\n <button\n ref={embeddedToggleRef}\n onMouseDown={embeddedHandleMouseDown}\n onClick={embeddedHandleClick}\n style={{\n position: \"absolute\",\n [edgeSide]: \"-12px\",\n top: \"50%\",\n transform: \"translateY(-50%)\",\n zIndex: 10,\n width: \"24px\",\n height: \"64px\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n background: \"#fff\",\n border: \"1px solid #e5e7eb\",\n [isRight ? \"borderRight\" : \"borderLeft\"]: \"none\",\n borderRadius: isRight ? \"8px 0 0 8px\" : \"0 8px 8px 0\",\n cursor: isCollapsed ? \"pointer\" : \"col-resize\",\n boxShadow: \"0 2px 8px rgba(0,0,0,0.1)\",\n padding: 0,\n outline: \"none\",\n }}\n aria-label={isCollapsed ? \"Open Copilot\" : \"Resize or close Copilot\"}\n >\n {toggleIcon}\n </button>\n\n {/* Content area — width controlled by flex, direct DOM during drag */}\n <div\n ref={embeddedContentRef}\n style={{\n width: `${embeddedWidth}px`,\n height: \"100%\",\n display: isCollapsed ? \"none\" : \"block\",\n overflow: \"hidden\",\n }}\n >\n <ShadowContainer styles={WIDGET_CSS}>\n {renderCopilotContent(undefined, false, \"100%\")}\n </ShadowContainer>\n </div>\n </div>\n );\n}\n\n// Simple icon components (to avoid lucide-react import issues in some setups)\nfunction PlusIcon({ className }: { className?: string }) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <path d=\"M5 12h14\" />\n <path d=\"M12 5v14\" />\n </svg>\n );\n}\n\nfunction HistoryIcon({ className }: { className?: string }) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <path d=\"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\" />\n <path d=\"M3 3v5h5\" />\n <path d=\"M12 7v5l4 2\" />\n </svg>\n );\n}\n\nfunction TabCloseIcon({ className }: { className?: string }) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </svg>\n );\n}\n\nfunction ChevronRightIcon({ className }: { className?: string }) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <path d=\"m9 18 6-6-6-6\" />\n </svg>\n );\n}\n\nfunction CloseIcon({ className }: { className?: string }) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </svg>\n );\n}\n\nexport default CrowCopilot;\n","/**\n * CrowProvider - React context provider for sharing CrowClient\n */\n\nimport { createContext, useContext, useMemo, useEffect, useRef } from 'react';\nimport { CrowClient, type CrowClientConfig } from '@usecrow/client';\n\ninterface CrowContextValue {\n client: CrowClient;\n}\n\nconst CrowContext = createContext<CrowContextValue | null>(null);\n\nexport interface CrowProviderProps extends CrowClientConfig {\n children: React.ReactNode;\n}\n\n/**\n * Provider component that creates and shares a CrowClient instance\n */\nexport function CrowProvider({\n children,\n productId,\n apiUrl,\n model,\n subdomain,\n}: CrowProviderProps) {\n // Create client once and keep it stable\n const clientRef = useRef<CrowClient | null>(null);\n\n if (!clientRef.current) {\n clientRef.current = new CrowClient({ productId, apiUrl, model, subdomain });\n }\n\n const client = clientRef.current;\n\n // Clean up on unmount\n useEffect(() => {\n return () => {\n client.destroy();\n };\n }, [client]);\n\n const value = useMemo(() => ({ client }), [client]);\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- React 18/19 ReactNode type mismatch in monorepo\n return <CrowContext.Provider value={value}>{children as any}</CrowContext.Provider>;\n}\n\n/**\n * Hook to access the CrowClient from context\n */\nexport function useCrowClient(): CrowClient {\n const context = useContext(CrowContext);\n if (!context) {\n throw new Error('useCrowClient must be used within a CrowProvider');\n }\n return context.client;\n}\n\n/**\n * Hook to optionally access the CrowClient (returns null if not in provider)\n */\nexport function useCrowClientOptional(): CrowClient | null {\n const context = useContext(CrowContext);\n return context?.client ?? null;\n}\n\n"]}
|